Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/bin/start.boot and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/bin/start.boot differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/bin/start_clean.boot and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/bin/start_clean.boot differ diff -Nru erlang-13.b.1-dfsg/bootstrap/bin/start_clean.script erlang-13.b.3-dfsg/bootstrap/bin/start_clean.script --- erlang-13.b.1-dfsg/bootstrap/bin/start_clean.script 2009-06-05 13:53:49.000000000 +0100 +++ erlang-13.b.3-dfsg/bootstrap/bin/start_clean.script 2009-11-20 13:32:52.000000000 +0000 @@ -1,6 +1,6 @@ -%% script generated at {2009,6,5} {14,13,4} +%% script generated at {2009,11,16} {16,51,54} {script, - {"OTP APN 181 01","R13B01"}, + {"OTP APN 181 01","R13B03"}, [{preLoaded, [erl_prim_loader,erlang,init,otp_ring0,prim_file,prim_inet,prim_zip, zlib]}, @@ -43,7 +43,7 @@ {application_controller,start, [{application,kernel, [{description,"ERTS CXC 138 10"}, - {vsn,"2.13.2"}, + {vsn,"2.13.4"}, {id,[]}, {modules, [application,application_controller,application_master, @@ -80,7 +80,7 @@ {application,load, [{application,stdlib, [{description,"ERTS CXC 138 10"}, - {vsn,"1.16.2"}, + {vsn,"1.16.4"}, {id,[]}, {modules, [array,base64,beam_lib,c,calendar,dets,dets_server, diff -Nru erlang-13.b.1-dfsg/bootstrap/bin/start.script erlang-13.b.3-dfsg/bootstrap/bin/start.script --- erlang-13.b.1-dfsg/bootstrap/bin/start.script 2009-06-05 13:53:49.000000000 +0100 +++ erlang-13.b.3-dfsg/bootstrap/bin/start.script 2009-11-20 13:32:52.000000000 +0000 @@ -1,6 +1,6 @@ -%% script generated at {2009,6,5} {14,13,4} +%% script generated at {2009,11,16} {16,51,54} {script, - {"OTP APN 181 01","R13B01"}, + {"OTP APN 181 01","R13B03"}, [{preLoaded, [erl_prim_loader,erlang,init,otp_ring0,prim_file,prim_inet,prim_zip, zlib]}, @@ -43,7 +43,7 @@ {application_controller,start, [{application,kernel, [{description,"ERTS CXC 138 10"}, - {vsn,"2.13.2"}, + {vsn,"2.13.4"}, {id,[]}, {modules, [application,application_controller,application_master, @@ -80,7 +80,7 @@ {application,load, [{application,stdlib, [{description,"ERTS CXC 138 10"}, - {vsn,"1.16.2"}, + {vsn,"1.16.4"}, {id,[]}, {modules, [array,base64,beam_lib,c,calendar,dets,dets_server, Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_asm.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_asm.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_block.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_block.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_bool.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_bool.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_bsm.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_bsm.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_clean.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_clean.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_dead.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_dead.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_dict.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_dict.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_disasm.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_disasm.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_flatten.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_flatten.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_jump.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_jump.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_listing.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_listing.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_opcodes.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_opcodes.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_peep.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_peep.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_trim.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_trim.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_type.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_type.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_utils.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_utils.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/beam_validator.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/beam_validator.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/cerl.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/cerl.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/cerl_clauses.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/cerl_clauses.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/cerl_inline.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/cerl_inline.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/cerl_trees.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/cerl_trees.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/compile.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/compile.beam differ diff -Nru erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/compiler.app erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/compiler.app --- erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/compiler.app 2009-06-10 16:20:42.000000000 +0100 +++ erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/compiler.app 2009-11-25 14:26:17.000000000 +0000 @@ -18,7 +18,7 @@ {application, compiler, [{description, "ERTS CXC 138 10"}, - {vsn, "4.6.2"}, + {vsn, "4.6.4"}, {modules, [ beam_asm, beam_block, diff -Nru erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/compiler.appup erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/compiler.appup --- erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/compiler.appup 2009-06-10 16:20:42.000000000 +0100 +++ erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/compiler.appup 2009-11-25 14:26:17.000000000 +0000 @@ -1 +1 @@ -{"4.6.2",[],[]}. +{"4.6.4",[],[]}. Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/core_lib.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/core_lib.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/core_lint.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/core_lint.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/core_parse.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/core_parse.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/core_pp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/core_pp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/core_scan.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/core_scan.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/erl_bifs.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/erl_bifs.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/rec_env.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/rec_env.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/sys_core_dsetel.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/sys_core_dsetel.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/sys_core_fold.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/sys_core_fold.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/sys_core_inline.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/sys_core_inline.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/sys_expand_pmod.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/sys_expand_pmod.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/sys_pre_attributes.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/sys_pre_attributes.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/sys_pre_expand.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/sys_pre_expand.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/v3_codegen.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/v3_codegen.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/v3_core.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/v3_core.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/v3_kernel.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/v3_kernel.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/v3_kernel_pp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/v3_kernel_pp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/compiler/ebin/v3_life.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/compiler/ebin/v3_life.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/application.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/application.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/application_controller.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/application_controller.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/application_master.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/application_master.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/application_starter.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/application_starter.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/auth.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/auth.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/code.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/code.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/code_server.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/code_server.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/disk_log_1.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/disk_log_1.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/disk_log.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/disk_log.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/disk_log_server.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/disk_log_server.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/disk_log_sup.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/disk_log_sup.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/dist_ac.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/dist_ac.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/dist_util.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/dist_util.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/erl_boot_server.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/erl_boot_server.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/erl_ddll.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/erl_ddll.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/erl_distribution.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/erl_distribution.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/erl_epmd.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/erl_epmd.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/erl_reply.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/erl_reply.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/error_handler.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/error_handler.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/error_logger.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/error_logger.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/erts_debug.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/erts_debug.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/file.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/file.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/file_io_server.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/file_io_server.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/file_server.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/file_server.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/gen_sctp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/gen_sctp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/gen_tcp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/gen_tcp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/gen_udp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/gen_udp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/global.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/global.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/global_group.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/global_group.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/global_search.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/global_search.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/group.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/group.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/heart.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/heart.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet6_sctp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet6_sctp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet6_tcp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet6_tcp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet6_udp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet6_udp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_config.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_config.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_db.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_db.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_dns.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_dns.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_gethost_native.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_gethost_native.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_hosts.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_hosts.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_parse.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_parse.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_res.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_res.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_sctp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_sctp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_tcp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_tcp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_tcp_dist.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_tcp_dist.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/inet_udp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/inet_udp.beam differ diff -Nru erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/kernel.app erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/kernel.app --- erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/kernel.app 2009-06-10 16:20:42.000000000 +0100 +++ erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/kernel.app 2009-11-25 14:26:17.000000000 +0000 @@ -21,7 +21,7 @@ {application, kernel, [ {description, "ERTS CXC 138 10"}, - {vsn, "2.13.2"}, + {vsn, "2.13.4"}, {modules, [application, application_controller, application_master, diff -Nru erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/kernel.appup erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/kernel.appup --- erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/kernel.appup 2009-06-10 16:20:42.000000000 +0100 +++ erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/kernel.appup 2009-11-25 14:26:17.000000000 +0000 @@ -1 +1 @@ -{"2.13.2",[],[]}. +{"2.13.4",[],[]}. Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/kernel.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/kernel.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/kernel_config.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/kernel_config.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/net_adm.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/net_adm.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/net.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/net.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/net_kernel.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/net_kernel.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/os.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/os.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/packages.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/packages.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/pg2.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/pg2.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/ram_file.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/ram_file.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/rpc.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/rpc.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/seq_trace.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/seq_trace.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/standard_error.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/standard_error.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/user.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/user.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/user_drv.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/user_drv.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/user_sup.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/user_sup.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/kernel/ebin/wrap_log_reader.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/kernel/ebin/wrap_log_reader.beam differ diff -Nru erlang-13.b.1-dfsg/bootstrap/lib/kernel/include/file.hrl erlang-13.b.3-dfsg/bootstrap/lib/kernel/include/file.hrl --- erlang-13.b.1-dfsg/bootstrap/lib/kernel/include/file.hrl 2009-06-10 16:20:42.000000000 +0100 +++ erlang-13.b.3-dfsg/bootstrap/lib/kernel/include/file.hrl 2009-11-25 14:26:17.000000000 +0000 @@ -61,8 +61,8 @@ -record(file_descriptor, - {module :: atom(), % Module that handles this kind of file - data :: any()}). % Module dependent data + {module :: module(), % Module that handles this kind of file + data :: term()}). % Module dependent data -type fd() :: pid() | #file_descriptor{}. Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/array.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/array.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/base64.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/base64.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/beam_lib.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/beam_lib.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/calendar.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/calendar.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/c.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/c.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/dets.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/dets.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/dets_server.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/dets_server.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/dets_sup.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/dets_sup.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/dets_utils.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/dets_utils.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/dets_v8.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/dets_v8.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/dets_v9.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/dets_v9.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/dict.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/dict.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/digraph.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/digraph.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/digraph_utils.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/digraph_utils.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/edlin.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/edlin.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/edlin_expand.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/edlin_expand.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/epp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/epp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_bits.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_bits.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_compile.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_compile.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_eval.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_eval.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_expand_records.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_expand_records.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_internal.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_internal.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_lint.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_lint.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_parse.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_parse.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_posix_msg.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_posix_msg.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_pp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_pp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_scan.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_scan.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/erl_tar.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/erl_tar.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/escript.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/escript.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/ets.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/ets.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/eval_bits.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/eval_bits.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/filelib.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/filelib.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/filename.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/filename.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/file_sorter.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/file_sorter.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/gb_sets.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/gb_sets.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/gb_trees.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/gb_trees.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/gen.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/gen.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/gen_event.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/gen_event.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/gen_fsm.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/gen_fsm.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/gen_server.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/gen_server.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/io.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/io.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/io_lib.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/io_lib.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/io_lib_format.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/io_lib_format.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/io_lib_fread.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/io_lib_fread.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/io_lib_pretty.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/io_lib_pretty.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/lib.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/lib.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/lists.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/lists.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/log_mf_h.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/log_mf_h.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/math.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/math.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/ms_transform.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/ms_transform.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/orddict.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/orddict.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/ordsets.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/ordsets.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/otp_internal.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/otp_internal.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/pg.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/pg.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/pool.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/pool.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/proc_lib.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/proc_lib.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/proplists.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/proplists.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/qlc.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/qlc.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/qlc_pt.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/qlc_pt.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/queue.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/queue.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/random.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/random.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/re.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/re.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/regexp.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/regexp.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/sets.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/sets.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/shell.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/shell.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/shell_default.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/shell_default.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/slave.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/slave.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/sofs.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/sofs.beam differ diff -Nru erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/stdlib.app erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/stdlib.app --- erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/stdlib.app 2009-06-10 16:20:42.000000000 +0100 +++ erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/stdlib.app 2009-11-25 14:26:17.000000000 +0000 @@ -19,7 +19,7 @@ %% {application, stdlib, [{description, "ERTS CXC 138 10"}, - {vsn, "1.16.2"}, + {vsn, "1.16.4"}, {modules, [array, base64, beam_lib, diff -Nru erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/stdlib.appup erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/stdlib.appup --- erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/stdlib.appup 2009-06-10 16:20:42.000000000 +0100 +++ erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/stdlib.appup 2009-11-25 14:26:17.000000000 +0000 @@ -1 +1 @@ -{"1.16.2",[],[]}. +{"1.16.4",[],[]}. Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/string.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/string.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/supervisor.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/supervisor.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/supervisor_bridge.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/supervisor_bridge.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/sys.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/sys.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/timer.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/timer.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/unicode.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/unicode.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/win32reg.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/win32reg.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/bootstrap/lib/stdlib/ebin/zip.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/bootstrap/lib/stdlib/ebin/zip.beam differ diff -Nru erlang-13.b.1-dfsg/bootstrap/lib/stdlib/include/erl_compile.hrl erlang-13.b.3-dfsg/bootstrap/lib/stdlib/include/erl_compile.hrl --- erlang-13.b.1-dfsg/bootstrap/lib/stdlib/include/erl_compile.hrl 2009-06-10 16:20:42.000000000 +0100 +++ erlang-13.b.3-dfsg/bootstrap/lib/stdlib/include/erl_compile.hrl 2009-11-25 14:26:17.000000000 +0000 @@ -20,9 +20,9 @@ %% Generic compiler options, passed from the erl_compile module. -record(options, - {includes=[] :: [string()], % Include paths (list of + {includes=[] :: [file:filename()], % Include paths (list of % absolute directory names). - outdir="." :: string(), % Directory for result + outdir="." :: file:filename(), % Directory for result % (absolute path). output_type=undefined :: atom(), % Type of output file. defines=[] :: [atom() | {atom(),_}], % Preprocessor defines. Each @@ -32,12 +32,12 @@ warning=1 :: non_neg_integer(), % Warning level (0 - no % warnings, 1 - standard level, % 2, 3, ... - more warnings). - verbose=false :: bool(), % Verbose (true/false). + verbose=false :: boolean(), % Verbose (true/false). optimize=999, % Optimize options. specific=[] :: [_], % Compiler specific options. - outfile="" :: string(), % Name of output file (internal + outfile="" :: file:filename(), % Name of output file (internal % use in erl_compile.erl). - cwd :: string() % Current working directory + cwd :: file:filename() % Current working directory % for erlc. }). diff -Nru erlang-13.b.1-dfsg/configure erlang-13.b.3-dfsg/configure --- erlang-13.b.1-dfsg/configure 2009-06-07 19:02:15.000000000 +0100 +++ erlang-13.b.3-dfsg/configure 2009-11-24 10:12:53.000000000 +0000 @@ -816,6 +816,8 @@ --disable-megaco-reentrant-flex-scanner disable reentrans megaco flex scanner --enable-dynamic-ssl-lib force using dynamic openssl libraries --disable-dynamic-ssl-lib disable using dynamic openssl libraries + --enable-shared-zlib enable using shared zlib library + --disable-shared-zlib disable shared zlib, compile own zlib source (default) --disable-erlang-mandir do not install Erlang man pages in a private directory --enable-darwin-universal build universal binaries on darwin i386 --enable-darwin-64bit build 64bit binaries on darwin @@ -2628,6 +2630,12 @@ fi; +# Check whether --enable-shared-zlib or --disable-shared-zlib was given. +if test "${enable_shared_zlib+set}" = set; then + enableval="$enable_shared_zlib" + +fi; + # # Set Erlang man page directory # @@ -2694,16 +2702,30 @@ export LDFLAGS fi if test X${enable_darwin_64bit} = Xyes; then - if test X"$TMPSYS" '!=' X"Darwin-i386"; then - { { echo "$as_me:$LINENO: error: --enable-darwin-64bit only supported on x86 host" >&5 -echo "$as_me: error: --enable-darwin-64bit only supported on x86 host" >&2;} + case "$TMPSYS" in + Darwin-i386|Darwin-x86_64) + ;; + Darwin*) + { { echo "$as_me:$LINENO: error: --enable-darwin-64bit only supported on x86 hosts" >&5 +echo "$as_me: error: --enable-darwin-64bit only supported on x86 hosts" >&2;} { (exit 1); exit 1; }; } - fi + ;; + *) + { { echo "$as_me:$LINENO: error: --enable-darwin-64bit only supported on Darwin" >&5 +echo "$as_me: error: --enable-darwin-64bit only supported on Darwin" >&2;} + { (exit 1); exit 1; }; } + ;; + esac enable_hipe=no CFLAGS="-m64 $CFLAGS" export CFLAGS LDFLAGS="-m64 $LDFLAGS" export LDFLAGS +elif test X"$TMPSYS" '=' X"Darwin-i386"; then + CFLAGS="-m32 $CFLAGS" + export CFLAGS + LDFLAGS="-m32 $LDFLAGS" + export LDFLAGS fi if test X${enable_m64_build} = Xyes; then @@ -3859,3 +3881,16 @@ echo echo '*********************************************************************' fi +if test -f "erts/doc/CONF_INFO"; then + echo '*********************************************************************' + echo '********************** DOCUMENTATION INFORMATION ******************' + echo '*********************************************************************' + echo + printf "%-15s: \n" documentation; + for cmd in `cat erts/doc/CONF_INFO`; do + echo " $cmd is missing." + done + echo ' The documentation can not be built.' + echo + echo '*********************************************************************' +fi diff -Nru erlang-13.b.1-dfsg/configure.in erlang-13.b.3-dfsg/configure.in --- erlang-13.b.1-dfsg/configure.in 2009-06-05 13:53:13.000000000 +0100 +++ erlang-13.b.3-dfsg/configure.in 2009-11-20 13:30:47.000000000 +0000 @@ -165,6 +165,10 @@ [ --enable-dynamic-ssl-lib force using dynamic openssl libraries --disable-dynamic-ssl-lib disable using dynamic openssl libraries]) +AC_ARG_ENABLE(shared-zlib, +[ --enable-shared-zlib enable using shared zlib library + --disable-shared-zlib disable shared zlib, compile own zlib source (default)]) + # # Set Erlang man page directory # @@ -215,14 +219,26 @@ export LDFLAGS fi if test X${enable_darwin_64bit} = Xyes; then - if test X"$TMPSYS" '!=' X"Darwin-i386"; then - AC_MSG_ERROR([--enable-darwin-64bit only supported on x86 host]) - fi + case "$TMPSYS" in + Darwin-i386|Darwin-x86_64) + ;; + Darwin*) + AC_MSG_ERROR([--enable-darwin-64bit only supported on x86 hosts]) + ;; + *) + AC_MSG_ERROR([--enable-darwin-64bit only supported on Darwin]) + ;; + esac enable_hipe=no CFLAGS="-m64 $CFLAGS" export CFLAGS LDFLAGS="-m64 $LDFLAGS" export LDFLAGS +elif test X"$TMPSYS" '=' X"Darwin-i386"; then + CFLAGS="-m32 $CFLAGS" + export CFLAGS + LDFLAGS="-m32 $LDFLAGS" + export LDFLAGS fi if test X${enable_m64_build} = Xyes; then @@ -266,3 +282,16 @@ echo echo '*********************************************************************' fi +if test -f "erts/doc/CONF_INFO"; then + echo '*********************************************************************' + echo '********************** DOCUMENTATION INFORMATION ******************' + echo '*********************************************************************' + echo + printf "%-15s: \n" documentation; + for cmd in `cat erts/doc/CONF_INFO`; do + echo " $cmd is missing." + done + echo ' The documentation can not be built.' + echo + echo '*********************************************************************' +fi diff -Nru erlang-13.b.1-dfsg/debian/analyse.sh erlang-13.b.3-dfsg/debian/analyse.sh --- erlang-13.b.1-dfsg/debian/analyse.sh 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/analyse.sh 1970-01-01 01:00:00.000000000 +0100 @@ -1,94 +0,0 @@ -#!/bin/sh - -echo "Determining which files goes where through \ -the magic of regular expressions." - -# Pretty dead simple. The pattern files include -# regular expression that match some files. Files that -# match patterns in binary.patterns go into the base -# package. Same goes for the X11 package. Files -# that don't match anything go into the NO-X package etc. - -# Files that match here might also go into -# erlang-base-hipe.install. - -DIR=$1 - -echo "erlang-base" -find debian/erlang-stnd -type f | \ - grep -E -f debian/patterns/erlang-base.patterns | \ - cut -c 20- > debian/erlang-base.install - -echo "erlang-base-hipe" -find debian/erlang-hipe -type f | \ - grep -E -f debian/patterns/erlang-base-hipe.patterns | \ - cut -c 20- > debian/erlang-base-hipe.install - -# Here, files that matched above shouldn't -# be looked at. - -echo "erlang-examples" -find $DIR -type f | \ - grep -v -E -f debian/patterns/erlang-base.patterns | \ - grep -v -E -f debian/patterns/erlang-base-hipe.patterns | \ - grep -E -f debian/patterns/erlang-examples.patterns | \ - cut -c 20- > debian/erlang-examples.install - -echo "erlang-src" -find $DIR -type f | \ - grep -v -E -f debian/patterns/erlang-base.patterns | \ - grep -v -E -f debian/patterns/erlang-base-hipe.patterns | \ - grep -v -E -f debian/patterns/erlang-examples.patterns | \ - grep -E -f debian/patterns/erlang-src.patterns | \ - cut -c 20- > debian/erlang-src.install - -echo "erlang-dev" -find $DIR -type f | \ - grep -E -e './usr/lib/erlang/usr/include' | \ - cut -c 20- | sed -e 's!$! usr/lib/erlang/usr/include!' > debian/erlang-dev.install - -find $DIR -type f | \ - grep -v -E -f debian/patterns/erlang-base.patterns | \ - grep -v -E -f debian/patterns/erlang-base-hipe.patterns | \ - grep -v -E -f debian/patterns/erlang-examples.patterns | \ - grep -v -E -f debian/patterns/erlang-src.patterns | \ - grep -E -f debian/patterns/erlang-dev.patterns | \ - cut -c 20- >> debian/erlang-dev.install - -PACKAGES='appmon asn1 common-test corba crypto debugger dialyzer docbuilder - edoc et eunit gs ic inets inviso megaco mnesia observer odbc os-mon - parsetools percept pman public-key reltool runtime-tools snmp ssh - ssl syntax-tools test-server toolbar tools tv typer webtool wx xmerl' - -CMD='grep -v -E -e ./usr/lib/erlang/usr/include | - grep -v -E -f debian/patterns/erlang-base.patterns | - grep -v -E -f debian/patterns/erlang-base-hipe.patterns | - grep -v -E -f debian/patterns/erlang-examples.patterns | - grep -v -E -f debian/patterns/erlang-src.patterns | - grep -v -E -f debian/patterns/erlang-dev.patterns' - -CMD1=$CMD - -for pkg in $PACKAGES ; do - echo erlang-$pkg - - find $DIR -type f | eval $CMD | \ - grep -E -f debian/patterns/erlang-$pkg.patterns | \ - cut -c 20- | sort > debian/erlang-$pkg.install - - CMD1="$CMD1 | grep -v -E -f debian/patterns/erlang-$pkg.patterns" -done - -echo "FILES WHICH HAVEN'T REACHED ANY PACKAGE" -find $DIR -type f | eval $CMD1 - -echo "PACKAGES INTERSECTIONS" -for pkg1 in $PACKAGES ; do - for pkg2 in $PACKAGES ; do - if [ $pkg1 != $pkg2 ] ; then - comm -1 -2 debian/erlang-$pkg1.install debian/erlang-$pkg2.install - fi - done -done -echo "---------------------------------------" - diff -Nru erlang-13.b.1-dfsg/debian/changelog erlang-13.b.3-dfsg/debian/changelog --- erlang-13.b.1-dfsg/debian/changelog 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/changelog 2009-12-22 04:36:22.000000000 +0000 @@ -1,3 +1,124 @@ +erlang (1:13.b.3-dfsg-2ubuntu1~karmic2) karmic; urgency=low + + * Comment out the build-options patch to get debug info in the PPA. + + -- Elliot Murphy Mon, 21 Dec 2009 22:46:07 -0500 + +erlang (1:13.b.3-dfsg-2ubuntu1~karmic1) karmic; urgency=low + + * Merge with Debian testing; remaining Ubuntu changes: + - Drop libwxgtk2.8-dev build dependency. Wx isn't in main, and not + supposed to. (LP #438365) + - Drop erlang-wx binary. + - Drop erlang-wx dependency from -megaco, -common-test, and -reltool, they + do not really need wx. Also drop it from -debugger; the GUI needs wx, + but it apparently has CLI bits as well, and is also needed by -megaco, + so let's keep the package for now. + + -- Elliot Murphy Mon, 21 Dec 2009 21:54:16 -0500 + +erlang (1:13.b.3-dfsg-2) unstable; urgency=low + + * Fixed dialyzer(1) manpage which was placed into section 3 and conflicted + with dialyzer(3erl). + + -- Sergei Golovan Sun, 20 Dec 2009 09:03:40 +0300 + +erlang (1:13.b.3-dfsg-1) unstable; urgency=low + + * New upstream release (it adds a new binary package erlang-erl-docgen). + * Refreshed patches, removed most of emacs.patch which is applied upstream. + * Linked run_test binary from erlang-common-test package to /usr/bin. + * Fixed VCS headers in debian/control. + * Moved from prebuilt manpages to generated from sources. This adds + erlang-manpages binary package and xsltproc build dependency. + + -- Sergei Golovan Sat, 19 Dec 2009 19:44:54 +0300 + +erlang (1:13.b.2.1-dfsg-1ubuntu3) lucid; urgency=low + + * build-options.patch: Fix to apply to current version. + * debian/patches/series: Do what I meant, and enable build-options.patch + instead. + + -- Martin Pitt Mon, 07 Dec 2009 10:28:47 +0100 + +erlang (1:13.b.2.1-dfsg-1ubuntu2) lucid; urgency=low + + * debian/patches/series: Enable native.patch again, to get stripped beam + files and reduce the package size again. (LP: #493278) + + -- Martin Pitt Mon, 07 Dec 2009 09:02:37 +0100 + +erlang (1:13.b.2.1-dfsg-1ubuntu1) lucid; urgency=low + + * Merge with Debian testing; remaining Ubuntu changes: + - Drop libwxgtk2.8-dev build dependency. Wx isn't in main, and not + supposed to. (LP #438365) + - Drop erlang-wx binary. + - Drop erlang-wx dependency from -megaco, -common-test, and -reltool, they + do not really need wx. Also drop it from -debugger; the GUI needs wx, + but it apparently has CLI bits as well, and is also needed by -megaco, + so let's keep the package for now. + + -- Martin Pitt Fri, 06 Nov 2009 18:54:42 +0100 + +erlang (1:13.b.2.1-dfsg-1) unstable; urgency=low + + * New upstream release (closes: #539269). + * New maintainer's email address pkg-erlang-devel@lists.alioth.debian.org + mailing list. + * Overridden another lintian warning about image file in /usr/lib. + + -- Sergei Golovan Fri, 25 Sep 2009 23:45:31 +0400 + +erlang (1:13.b.1-dfsg-6) unstable; urgency=low + + * Restored debug info in beam files for default build. It's better to use + more space than to ship broken modules (debugger, dialyzer). The patch + is simply commented out in debian/patches/series, so if someone has to + strip debug info, he can simply uncomment it. + * Disabled SMP support for hurd-i386 architecture, because of FTBFS in case + when SMP is enabled. + * Added debian/README.source file with a reference to + /usr/share/doc/quilt/README.source. + * Bumped standards version to 3.8.3. + + -- Sergei Golovan Tue, 18 Aug 2009 01:29:25 +0400 + +erlang (1:13.b.1-dfsg-5) unstable; urgency=low + + * Fixed parentheses in Emacs mode (closes: #536891). + * Removed unnecessary conflicts with erlang-manpages package. + * Added workaround for #475459: disabled threads on sparc architecture. + This breaks wxErlang, so it's only a temporary solution. + + -- Sergei Golovan Wed, 05 Aug 2009 20:54:29 +0400 + +erlang (1:13.b.1-dfsg-4) unstable; urgency=low + + * Made mutual dependencies of Erlang packages more parsimonious (removed + unnecessary dependencies following erlang-depends advise). + * Added several new options to erlang-depends tool (-v, -P, --ignore). + * Made erlang-nox and erlang-x11 transitional packages (which will be + removed after squeeze release). + * Guarded change in the m68k patch for non-m68k architectures. + * Fixed building Erlang VM with debug information compiled in. Added a few + words about debug build to README.Debian. + + -- Sergei Golovan Fri, 24 Jul 2009 15:02:33 +0400 + +erlang (1:13.b.1-dfsg-3) unstable; urgency=low + + * Removed Torsten Werner from the uploaders list as per his request. + * Removed full path from epmd calls in erlang-base and erlang-base-hipe + prerm scripts. + * Added ${erlang:Depends} substvar which expands into a list of Erlang + packages which modules are actually used in application. + * Bumped standards version to 3.8.2. + + -- Sergei Golovan Tue, 30 Jun 2009 14:13:14 +0400 + erlang (1:13.b.1-dfsg-2ubuntu1) karmic; urgency=low * debian/control: diff -Nru erlang-13.b.1-dfsg/debian/control erlang-13.b.3-dfsg/debian/control --- erlang-13.b.1-dfsg/debian/control 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/control 2009-12-22 04:36:22.000000000 +0000 @@ -1,26 +1,26 @@ Source: erlang Maintainer: Ubuntu Developers -XSBC-Original-Maintainer: Erlang Packagers -Uploaders: Torsten Werner , Sergei Golovan +XSBC-Original-Maintainer: Debian Erlang Packagers +Uploaders: Sergei Golovan Section: interpreters Priority: optional -Standards-Version: 3.8.1 +Standards-Version: 3.8.3 Build-Depends: debhelper (>= 5.0.0), autoconf (>= 2.50), openssl, libssl-dev, m4, libncurses5-dev, quilt, autotools-dev, unixodbc-dev, bison, flex, - dctrl-tools, + dctrl-tools, xsltproc, libgl1-mesa-dev | libgl-dev, libglu1-mesa-dev | libglu-dev, libsctp-dev [!hurd-i386 !kfreebsd-i386 !kfreebsd-amd64 !solaris-i386], kfreebsd-kernel-headers [kfreebsd-i386 kfreebsd-amd64] Build-Conflicts: autoconf2.13 Homepage: http://www.erlang.org/ -Vcs-Svn: http://svn.berlios.de/svnroot/repos/erlang-pkg/erlang/trunk/ -Vcs-Browser: http://svn.berlios.de/viewcvs/erlang-pkg/erlang/trunk/ +Vcs-Svn: svn://svn.debian.org//svn/pkg-erlang/erlang/trunk/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-erlang/erlang/trunk/ Package: erlang-base Architecture: any Depends: ${procps:Depends}, ${shlibs:Depends}, ${misc:Depends} Recommends: ${libsctp:Version}, erlang-crypto (= ${binary:Version}), erlang-syntax-tools (= ${binary:Version}) -Suggests: erlang-tools (= ${binary:Version}), erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html +Suggests: erlang-tools (= ${binary:Version}), erlang, erlang-manpages, erlang-doc-html Conflicts: erlang (<< ${source:Version}), erlang-base-hipe, erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Replaces: erlang (<< ${source:Version}), erlang-base-hipe, erlang-nox (<< ${source:Version}), erlang-x11 (<< ${source:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Provides: erlang-abi-13.a @@ -40,7 +40,7 @@ Priority: extra Depends: ${procps:Depends}, ${shlibs:Depends}, ${misc:Depends} Recommends: ${libsctp:Version}, erlang-crypto (= ${binary:Version}), erlang-syntax-tools (= ${binary:Version}) -Suggests: erlang-tools (= ${binary:Version}), erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html +Suggests: erlang-edoc (= ${binary:Version}), erlang-gs (= ${binary:Version}), erlang-tools (= ${binary:Version}), erlang, erlang-manpages, erlang-doc-html Conflicts: erlang (<< ${source:Version}), erlang-base, erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Replaces: erlang (<< ${source:Version}), erlang-base, erlang-nox (<< ${source:Version}), erlang-x11 (<< ${source:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Provides: erlang-abi-13.a @@ -57,9 +57,8 @@ Package: erlang-appmon Architecture: any -Depends: ${erlang-base}, erlang-gs (= ${binary:Version}), erlang-inets (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), erlang-gs (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP application monitor The Application Monitor, Appmon, is a graphical utility used to supervise @@ -70,8 +69,7 @@ Package: erlang-asn1 Architecture: any Depends: ${erlang-base}, erlang-syntax-tools (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP modules for ASN.1 support The Asn1 application contains modules with compile-time and run-time @@ -80,9 +78,8 @@ Package: erlang-common-test Architecture: any -Depends: ${erlang-base}, erlang-debugger (= ${binary:Version}), erlang-et (= ${binary:Version}), erlang-gs (= ${binary:Version}), erlang-inets (= ${binary:Version}), erlang-snmp (= ${binary:Version}), erlang-ssh (= ${binary:Version}), erlang-test-server (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-crypto (= ${binary:Version}), erlang-debugger (= ${binary:Version}), erlang-inets (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), erlang-snmp (= ${binary:Version}), erlang-ssh (= ${binary:Version}), erlang-test-server (= ${binary:Version}), erlang-tools (= ${binary:Version}), erlang-webtool (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP application for automated testing Common Test is a portable application for automated testing. It is @@ -99,9 +96,8 @@ Package: erlang-corba Architecture: any -Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), erlang-mnesia (= ${binary:Version}), erlang-ssl (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP applications for CORBA support The Orber application is an Erlang implementation of a CORBA @@ -132,8 +128,7 @@ Package: erlang-crypto Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP cryprographic modules The Crypto Application provides functions for computation of message @@ -143,9 +138,8 @@ Package: erlang-debugger Architecture: any -Depends: ${erlang-base}, erlang-crypto (= ${binary:Version}), erlang-gs (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-gs (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP application for debugging and testing Debugger is a graphical tool which can be used for debugging and @@ -157,9 +151,7 @@ Package: erlang-dialyzer Architecture: any Depends: ${erlang-base}, erlang-syntax-tools (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Recommends: erlang-gs (= ${binary:Version}) -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang-gs (= ${binary:Version}), erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP discrepancy analyzer application Dialyzer is a static analysis tool that identifies software @@ -169,9 +161,8 @@ Package: erlang-docbuilder Architecture: any -Depends: ${erlang-base}, erlang-edoc (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-edoc (= ${binary:Version}), erlang-xmerl (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP application for building HTML documentation DocBuilder provides functionality for generating HTML documentation @@ -182,8 +173,7 @@ Package: erlang-edoc Architecture: any Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), erlang-syntax-tools (=${binary:Version}), erlang-xmerl (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP module for generating documentation EDoc is the Erlang program documentation generator. Inspired by the @@ -191,11 +181,21 @@ the conventions of the Erlang world. +Package: erlang-erl-docgen +Architecture: any +Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} +Suggests: xsltproc, fop, erlang, erlang-manpages, erlang-doc-html +Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) +Description: Erlang/OTP documentation stylesheets + The erl_docgen package includes XSLT stylesheets and document type + definitions used for Erlang/OTP documentation. They allow to + transform documentation to manpage, HTML, and PDF formats. + + Package: erlang-et Architecture: any -Depends: ${erlang-base}, erlang-crypto (= ${binary:Version}), erlang-gs (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-gs (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP event tracer application The Event Tracer (ET) uses the built-in trace mechanism in Erlang @@ -205,8 +205,7 @@ Package: erlang-eunit Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP module for unit testing The EUnit application contains modules with support for unit testing. @@ -215,8 +214,7 @@ Package: erlang-gs Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends}, tk | wish -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP graphics system The Graphics System application, GS, is a library of routines for @@ -228,8 +226,7 @@ Package: erlang-ic Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP IDL compiler The IC application is an Erlang implementation of an IDL (CORBA Interface @@ -240,9 +237,8 @@ Package: erlang-inets Architecture: any -Depends: ${erlang-base}, erlang-mnesia (= ${binary:Version}), erlang-public-key (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), erlang-ssl (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-mnesia (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), erlang-ssl (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP Internet clients and servers Inets is a container for Internet clients and servers. Currently @@ -253,8 +249,7 @@ Package: erlang-inviso Architecture: any Depends: ${erlang-base}, erlang-runtime-tools (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP trace tool Inviso, an Erlang trace tool. With the inviso API, runtime components @@ -262,12 +257,21 @@ Erlang nodes, using a control component also started with inviso API functions. +Package: erlang-manpages +Architecture: all +Suggests: erlang +Description: Erlang/OTP manual pages + Documentation for the Erlang programming language in `man' format. This + documentation can be read using the command `erl -man mod', where `mod' + is the name of the module you want documentation on. + . + This package contains all Erlang/OTP manual pages from sections other + than 1. They document Erlang/OTP modules, config files and applications. Package: erlang-megaco Architecture: any -Depends: ${erlang-base}, erlang-asn1 (= ${binary:Version}), erlang-debugger (= ${binary:Version}), erlang-et (= ${binary:Version}), erlang-gs (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-asn1 (= ${binary:Version}), erlang-et (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang-debugger (= ${binary:Version}), erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP implementation of Megaco/H.248 protocol The Megaco application is a framework for building applications on @@ -277,8 +281,7 @@ Package: erlang-mnesia Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP distributed relational/object hybrid database Mnesia is a distributed DataBase Management System (DBMS), appropriate @@ -288,10 +291,8 @@ Package: erlang-observer Architecture: any -Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), erlang-webtool (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Recommends: erlang-et (= ${binary:Version}), erlang-gs (= ${binary:Version}) -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-et (= ${binary:Version}), erlang-inets (= ${binary:Version}), erlang-gs (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), erlang-webtool (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP application for investigating distributed systems The OBSERVER application contains tools for tracing and investigation of @@ -303,8 +304,7 @@ Package: erlang-odbc Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP interface to SQL databases The Erlang ODBC application provides an interface for accessing @@ -313,9 +313,8 @@ Package: erlang-os-mon Architecture: any -Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), erlang-snmp (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-mnesia (= ${binary:Version}), erlang-snmp (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP operating system monitor The operating system monitor, OS_Mon, provides services for @@ -325,8 +324,7 @@ Package: erlang-parsetools Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP parsing tools The Parsetools application contains utilities for parsing. Currently, @@ -337,9 +335,8 @@ Package: erlang-percept Architecture: any -Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP concurrency profiling tool Percept is a tool which visualizes application level concurrency and @@ -349,8 +346,7 @@ Package: erlang-pman Architecture: any Depends: ${erlang-base}, erlang-gs (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP process manager The process manager Pman is a graphical tool used to inspect the @@ -361,8 +357,7 @@ Package: erlang-public-key Architecture: any Depends: ${erlang-base}, erlang-crypto (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP public key infrastructure Provides functions to handle public key infrastructure from RFC 3280 @@ -371,9 +366,8 @@ Package: erlang-reltool Architecture: any -Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), erlang-observer (= ${binary:Version}), erlang-syntax-tools (= ${binary:Version}), erlang-tools (= ${binary:Version}), erlang-webtool (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-syntax-tools (= ${binary:Version}), erlang-tools (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP release management tool Reltool is a release management tool. It analyses a given Erlang/OTP @@ -386,8 +380,7 @@ Package: erlang-runtime-tools Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP runtime tracing/debugging tools Runtime_Tools provides low-footprint tracing/debugging tools suitable @@ -397,8 +390,7 @@ Package: erlang-snmp Architecture: any Depends: ${erlang-base}, erlang-crypto (= ${binary:Version}), erlang-mnesia (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP SNMP applications A multilingual Simple Network Management Protocol application features @@ -411,9 +403,8 @@ Package: erlang-ssh Architecture: any -Depends: ${erlang-base}, erlang-crypto (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-crypto (= ${binary:Version}), erlang-public-key (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP implementation of SSH protocol The SSH application is an erlang implementation of the secure @@ -422,9 +413,8 @@ Package: erlang-ssl Architecture: any -Depends: ${erlang-base}, erlang-public-key (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-crypto (= ${binary:Version}), erlang-public-key (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP implementation of SSL The SSL application provides secure communication over sockets. @@ -433,8 +423,7 @@ Package: erlang-syntax-tools Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP modules for handling abstract Erlang syntax trees Syntax_Tools contains modules for handling abstract Erlang syntax @@ -447,9 +436,8 @@ Package: erlang-test-server Architecture: any -Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), erlang-observer (= ${binary:Version}), erlang-tools (= ${binary:Version}), erlang-webtool (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-observer (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), erlang-tools (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP server for automated application testing Test Server is a portable test server for automated application testing. @@ -462,8 +450,7 @@ Package: erlang-toolbar Architecture: any Depends: ${erlang-base}, erlang-gs (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP graphical toolbar The Toolbar application simplifies access to the Erlang/OTP tools. @@ -472,9 +459,8 @@ Package: erlang-tools Architecture: any -Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), erlang-observer (= ${binary:Version}), erlang-webtool (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), erlang-runtime-tools (= ${binary:Version}), erlang-webtool (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP various tools The Tools application contains a number of stand-alone tools, which are @@ -501,8 +487,7 @@ Package: erlang-tv Architecture: any Depends: ${erlang-base}, erlang-gs (= ${binary:Version}), erlang-mnesia (= ${binary:Version}), erlang-pman (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP table viewer The TV application allows the user to examine ETS and Mnesia tables. @@ -513,8 +498,7 @@ Package: erlang-typer Architecture: any Depends: ${erlang-base}, erlang-dialyzer (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP code type annotator TypEr is a tool that displays and automatically inserts type annotations @@ -524,9 +508,7 @@ Package: erlang-webtool Architecture: any Depends: ${erlang-base}, erlang-inets (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Recommends: erlang-observer (= ${binary:Version}) -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang-observer (= ${binary:Version}), erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP helper for web-based tools WebTool provides an easy way to use web-based tools with Erlang/OTP. @@ -536,8 +518,7 @@ Package: erlang-xmerl Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<= 1:11.b.1-2) +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${source:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2), erlang-doc-html (<< ${source:Upstream-Version}), erlang-doc-html (>> ${source:Upstream-Version}-999), erlang-manpages (<= 1:11.b.1-2) Description: Erlang/OTP XML tools The xmerl application contains modules for processing XML. @@ -546,7 +527,7 @@ Package: erlang-dev Architecture: any Depends: ${erlang-base}, ${shlibs:Depends}, ${misc:Depends} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${source:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${binary:Version}), erlang-x11 (<< ${binary:Version}), erlang-src (<< ${source:Version}), erlang-examples (<< ${source:Version}), erlang-mode (<< 1:12.b.1-dfsg-2) Description: Erlang/OTP development libraries and headers The files for application development in Erlang. They include headers for @@ -557,7 +538,7 @@ Package: erlang-src Architecture: all Depends: ${erlang-base} -Suggests: erlang-nox, erlang-x11, erlang, erlang-manpages, erlang-doc-html +Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${binary:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${binary:Version}), erlang-x11 (<< ${binary:Version}), erlang-dev (<< ${binary:Version}), erlang-examples (<< ${binary:Version}), erlang-mode (<< 1:12.b.1-dfsg-2) Description: Erlang/OTP applications sources Erlang sources for all the applications in the Erlang/OTP system. @@ -568,6 +549,7 @@ Package: erlang-examples Architecture: all Depends: ${erlang-base} +Recommends: erlang-asn1, erlang-gs, erlang-megaco, erlang-snmp, erlang-ssl Suggests: erlang, erlang-manpages, erlang-doc-html Replaces: erlang (<< ${binary:Version}), erlang-base (<< ${binary:Version}), erlang-base-hipe (<< ${binary:Version}), erlang-nox (<< ${binary:Version}), erlang-x11 (<< ${binary:Version}), erlang-dev (<< ${binary:Version}), erlang-src (<< ${binary:Version}), erlang-mode (<< 1:12.b.1-dfsg-2) Description: Erlang/OTP application examples @@ -578,7 +560,6 @@ Architecture: all Depends: emacsen-common Suggests: erlang, erlang-manpages, erlang-doc-html -Conflicts: erlang-manpages (<< 1:11.b.5-1) Replaces: erlang-base (<< 1:12.b.1-dfsg-2), erlang-base-hipe (<< 1:12.b.1-dfsg-2) Description: Erlang major editing mode for Emacs This package includes the mode for editing Erlang programs in GNU Emacs. @@ -593,11 +574,12 @@ erlang-docbuilder, erlang-edoc, erlang-eunit, erlang-ic, erlang-inets, erlang-inviso, erlang-mnesia, erlang-odbc, erlang-os-mon, erlang-parsetools, erlang-percept, erlang-public-key, erlang-runtime-tools, erlang-snmp, - erlang-ssh, erlang-ssl, erlang-syntax-tools, erlang-xmerl -Suggests: erlang-x11, erlang, erlang-manpages, erlang-doc-html + erlang-ssh, erlang-ssl, erlang-syntax-tools, erlang-tools, erlang-webtool, + erlang-xmerl +Suggests: erlang, erlang-manpages, erlang-doc-html Description: Erlang/OTP applications that don't require X Window System - This package is a dummy package which will install all Erlang/OTP - applications which do not require X Window System to run. + This package is a dummy transitional package which will install all + Erlang/OTP applications which do not require X Window System to run. Package: erlang-x11 @@ -605,17 +587,25 @@ Depends: ${erlang-base}, erlang-nox, erlang-appmon, erlang-common-test, erlang-debugger, erlang-dialyzer, erlang-et, erlang-gs, erlang-megaco, erlang-observer, erlang-pman, erlang-reltool, erlang-test-server, - erlang-toolbar, erlang-tools, erlang-tv, erlang-typer, erlang-webtool + erlang-toolbar, erlang-tv, erlang-typer Suggests: erlang, erlang-manpages, erlang-doc-html Description: Erlang/OTP applications that require X Window System - This package is a dummy package which will install all Erlang/OTP - applications which use graphical interface and therefore require - X Window System to run. + This package is a dummy transitional package which will install all + Erlang/OTP applications which use graphical interface and therefore + require X Window System to run. Package: erlang Architecture: all -Depends: ${erlang-base}, erlang-nox, erlang-x11, erlang-dev +Depends: ${erlang-base}, erlang-dev, erlang-appmon, erlang-asn1, + erlang-common-test, erlang-corba, erlang-crypto, erlang-debugger, + erlang-dialyzer, erlang-docbuilder, erlang-edoc, erlang-erl-docgen, erlang-et, + erlang-eunit, erlang-gs, erlang-ic, erlang-inets, erlang-inviso, + erlang-megaco, erlang-mnesia, erlang-observer, erlang-odbc, erlang-os-mon, + erlang-parsetools, erlang-percept, erlang-pman, erlang-public-key, + erlang-reltool, erlang-runtime-tools, erlang-snmp, erlang-ssh, erlang-ssl, + erlang-syntax-tools, erlang-test-server, erlang-toolbar, erlang-tools, + erlang-tv, erlang-typer, erlang-webtool, erlang-xmerl Recommends: erlang-mode, erlang-src, erlang-examples Suggests: erlang-manpages, erlang-doc-html Description: Concurrent, real-time, distributed functional language diff -Nru erlang-13.b.1-dfsg/debian/erlang-base-hipe.manpages erlang-13.b.3-dfsg/debian/erlang-base-hipe.manpages --- erlang-13.b.1-dfsg/debian/erlang-base-hipe.manpages 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/erlang-base-hipe.manpages 2009-12-22 04:36:22.000000000 +0000 @@ -1,7 +1,7 @@ -debian/manpages/epmd.1 -debian/manpages/erl_call.1 -debian/manpages/erlc.1 -debian/manpages/erl.1 -debian/manpages/escript.1 -debian/manpages/run_erl.1 -debian/manpages/start_embedded.1 +debian/tmp/usr/share/man/man1/epmd.1 +debian/tmp/usr/share/man/man1/erl_call.1 +debian/tmp/usr/share/man/man1/erlc.1 +debian/tmp/usr/share/man/man1/erl.1 +debian/tmp/usr/share/man/man1/escript.1 +debian/tmp/usr/share/man/man1/run_erl.1 +debian/tmp/usr/share/man/man1/start_embedded.1 diff -Nru erlang-13.b.1-dfsg/debian/erlang-base-hipe.prerm erlang-13.b.3-dfsg/debian/erlang-base-hipe.prerm --- erlang-13.b.1-dfsg/debian/erlang-base-hipe.prerm 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/erlang-base-hipe.prerm 2009-12-22 04:36:22.000000000 +0000 @@ -67,14 +67,14 @@ if [ -z "$pid" ] ; then echo "it is not running." else - if /usr/bin/epmd -kill 1>/dev/null 2>&1 || kill $pid 2>/dev/null ; then + if epmd -kill 1>/dev/null 2>&1 || kill $pid 2>/dev/null ; then echo "done." else echo "failed." fi fi else - if /usr/bin/epmd -kill 1>/dev/null 2>&1 ; then + if epmd -kill 1>/dev/null 2>&1 ; then echo "done." else echo "failed (or it is not running)." diff -Nru erlang-13.b.1-dfsg/debian/erlang-base.manpages erlang-13.b.3-dfsg/debian/erlang-base.manpages --- erlang-13.b.1-dfsg/debian/erlang-base.manpages 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/erlang-base.manpages 2009-12-22 04:36:22.000000000 +0000 @@ -1,7 +1,7 @@ -debian/manpages/epmd.1 -debian/manpages/erl_call.1 -debian/manpages/erlc.1 -debian/manpages/erl.1 -debian/manpages/escript.1 -debian/manpages/run_erl.1 -debian/manpages/start_embedded.1 +debian/tmp/usr/share/man/man1/epmd.1 +debian/tmp/usr/share/man/man1/erl_call.1 +debian/tmp/usr/share/man/man1/erlc.1 +debian/tmp/usr/share/man/man1/erl.1 +debian/tmp/usr/share/man/man1/escript.1 +debian/tmp/usr/share/man/man1/run_erl.1 +debian/tmp/usr/share/man/man1/start_embedded.1 diff -Nru erlang-13.b.1-dfsg/debian/erlang-base.prerm erlang-13.b.3-dfsg/debian/erlang-base.prerm --- erlang-13.b.1-dfsg/debian/erlang-base.prerm 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/erlang-base.prerm 2009-12-22 04:36:22.000000000 +0000 @@ -67,14 +67,14 @@ if [ -z "$pid" ] ; then echo "it is not running." else - if /usr/bin/epmd -kill 1>/dev/null 2>&1 || kill $pid 2>/dev/null ; then + if epmd -kill 1>/dev/null 2>&1 || kill $pid 2>/dev/null ; then echo "done." else echo "failed." fi fi else - if /usr/bin/epmd -kill 1>/dev/null 2>&1 ; then + if epmd -kill 1>/dev/null 2>&1 ; then echo "done." else echo "failed (or it is not running)." diff -Nru erlang-13.b.1-dfsg/debian/erlang-common-test.links.in erlang-13.b.3-dfsg/debian/erlang-common-test.links.in --- erlang-13.b.1-dfsg/debian/erlang-common-test.links.in 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/erlang-common-test.links.in 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1 @@ +usr/lib/erlang/lib/common_test-@COMMON_TEST_VSN@/priv/bin/run_test usr/bin/run_test diff -Nru erlang-13.b.1-dfsg/debian/erlang-common-test.manpages erlang-13.b.3-dfsg/debian/erlang-common-test.manpages --- erlang-13.b.1-dfsg/debian/erlang-common-test.manpages 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/erlang-common-test.manpages 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1 @@ +debian/tmp/usr/share/man/man1/run_test.1 diff -Nru erlang-13.b.1-dfsg/debian/erlang-depends.in erlang-13.b.3-dfsg/debian/erlang-depends.in --- erlang-13.b.1-dfsg/debian/erlang-depends.in 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/erlang-depends.in 1970-01-01 01:00:00.000000000 +0100 @@ -1,96 +0,0 @@ -#!/usr/bin/perl - -# Copyright (c) 2005 Rafael Laboissiere -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -=head1 NAME - -erlang-depends - calculates Erlang dependencies - -=cut - -use strict; -use warnings; -use Debian::Debhelper::Dh_Lib; - -=head1 SYNOPSIS - -B [S>] - -=head1 DESCRIPTION - -erlang-depends is a debhelper-like program that is responsible for generating -the ${erlang-base:Depends}, ${erlang-nox:Depends}, ${erlang-x11:Depends}, and -${erlang-dev:Depends} substitutions and adding them to substvars files. - -Also, ${erlang-abi:Depends} substitution adds current erlang ABI virtual -package to substvar files. It is useful if your package uses C-based -extensions. - -If you use this program, your package must build-depend on erlang-dev -(>= 1:11.b.2-3). If you want your package to depend on virtual package -provided by ${erlang-abi:Depends} then it must build-depend on erlang-dev -(>= 1:11.b.4-4). - - -=cut - -init (); - -# The current Erlang version -my $version = '@SOURCE_VERSION@'; -my $abi_version = '@ABI_VERSION@'; - -# The list of HiPE enabled architectures (with added 'all' architecture) -my @hipe_arches = split(/\s+/, '@HIPE_ARCHES@ all'); - -foreach my $package (@{$dh{DOPACKAGES}}) { - delsubstvar($package, "erlang-abi:Depends"); - addsubstvar($package, "erlang-abi:Depends", "erlang-abi-$abi_version"); - delsubstvar($package, "erlang-base:Depends"); - my $arch = package_arch($package); - if (grep(/^$arch$/, @hipe_arches)) { - addsubstvar($package, "erlang-base:Depends", - "erlang-base (>= $version) | erlang-base-hipe (>= $version)"); - } else { - addsubstvar($package, "erlang-base:Depends", "erlang-base (>= $version)"); - } - foreach my $pkg ("appmon", "asn1", "common-test", "corba", "crypto", "debugger", - "dialyzer", "docbuilder", "edoc", "et", "eunit", "gs", "ic", - "inets", "inviso", "megaco", "mnesia", "observer", "odbc", - "os-mon", "parsetools", "percept", "pman", "public-key", - "reltool", "runtime-tools", "snmp", "ssh", "ssl", - "syntax-tools", "test-server", "toolbar", "tools", "tv", - "typer", "webtool", "wx", "xmerl", "nox", "x11", "dev") { - delsubstvar($package, "erlang-$pkg:Depends"); - addsubstvar($package, "erlang-$pkg:Depends", "erlang-$pkg (>= $version)"); - } -} - -=head1 SEE ALSO - -L - -This program is not part of debhelper. - -=head1 AUTHOR - -Torsten Werner - -Most ideas borrowed from octave-depends by Rafael Laboissiere -. - -=cut diff -Nru erlang-13.b.1-dfsg/debian/erlang-dev.manpages erlang-13.b.3-dfsg/debian/erlang-dev.manpages --- erlang-13.b.1-dfsg/debian/erlang-dev.manpages 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/erlang-dev.manpages 2009-12-22 04:36:22.000000000 +0000 @@ -1 +1 @@ -debian/erlang-depends.1 +debian/manpages/erlang-depends.1 diff -Nru erlang-13.b.1-dfsg/debian/erlang-dialyzer.manpages erlang-13.b.3-dfsg/debian/erlang-dialyzer.manpages --- erlang-13.b.1-dfsg/debian/erlang-dialyzer.manpages 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/erlang-dialyzer.manpages 2009-12-22 04:36:22.000000000 +0000 @@ -1 +1 @@ -debian/manpages/dialyzer.1 +debian/tmp/usr/share/man/man1/dialyzer.1 diff -Nru erlang-13.b.1-dfsg/debian/erlang-manpages.manpages erlang-13.b.3-dfsg/debian/erlang-manpages.manpages --- erlang-13.b.1-dfsg/debian/erlang-manpages.manpages 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/erlang-manpages.manpages 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1,3 @@ +debian/tmp/usr/share/man/man3/* +debian/tmp/usr/share/man/man4/* +debian/tmp/usr/share/man/man6/* diff -Nru erlang-13.b.1-dfsg/debian/erlang-manpages.postinst erlang-13.b.3-dfsg/debian/erlang-manpages.postinst --- erlang-13.b.1-dfsg/debian/erlang-manpages.postinst 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/erlang-manpages.postinst 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1,25 @@ +#! /bin/sh +# postinst script for erlang-manpages +# +# see: dh_installdeb(1) + +set -e + +if [ "$1" = configure ] && dpkg --compare-versions "$2" lt-nl "1:12.b.1" ; then + for name in dialyzer \ + epmd \ + erl \ + erl_call \ + erlc \ + escript \ + run_erl \ + start \ + start_webtool ; do + dpkg-divert --package erlang-manpages --remove --rename \ + --divert /usr/share/man/man1/$name.erlang.1.gz \ + /usr/share/man/man1/$name.1.gz >/dev/null + done +fi + +#DEBHELPER# + diff -Nru erlang-13.b.1-dfsg/debian/erlang-webtool.manpages erlang-13.b.3-dfsg/debian/erlang-webtool.manpages --- erlang-13.b.1-dfsg/debian/erlang-webtool.manpages 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/erlang-webtool.manpages 2009-12-22 04:36:22.000000000 +0000 @@ -1 +1 @@ -debian/manpages/start_webtool.1 +debian/tmp/usr/share/man/man1/start_webtool.1 diff -Nru erlang-13.b.1-dfsg/debian/lintian/erlang-erl-docgen.lintian-override erlang-13.b.3-dfsg/debian/lintian/erlang-erl-docgen.lintian-override --- erlang-13.b.1-dfsg/debian/lintian/erlang-erl-docgen.lintian-override 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/lintian/erlang-erl-docgen.lintian-override 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1 @@ +erlang-erl-docgen: image-file-in-usr-lib diff -Nru erlang-13.b.1-dfsg/debian/lintian/erlang-wx.lintian-override erlang-13.b.3-dfsg/debian/lintian/erlang-wx.lintian-override --- erlang-13.b.1-dfsg/debian/lintian/erlang-wx.lintian-override 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/lintian/erlang-wx.lintian-override 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1 @@ +erlang-wx: image-file-in-usr-lib diff -Nru erlang-13.b.1-dfsg/debian/manpages/dialyzer.1 erlang-13.b.3-dfsg/debian/manpages/dialyzer.1 --- erlang-13.b.1-dfsg/debian/manpages/dialyzer.1 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/manpages/dialyzer.1 1970-01-01 01:00:00.000000000 +0100 @@ -1,287 +0,0 @@ -.TH dialyzer 1 "dialyzer 1.9.2" "Ericsson AB" "USER COMMANDS" -.SH NAME -dialyzer \- The Dialyzer, a DIscrepancy AnalYZer for ERlang programs -.SH DESCRIPTION -.LP -The Dialyzer is a static analysis tool that identifies software discrepancies such as definite type errors, code which has become dead or unreachable due to some programming error, unnecessary tests, etc\&. in single Erlang modules or entire (sets of) applications\&. Dialyzer starts its analysis from either debug-compiled BEAM bytecode or from Erlang source code\&. The file and line number of a discrepancy is reported along with an indication of what the discrepancy is about\&. Dialyzer bases its analysis on the concept of success typings which allows for sound warnings (no false positives)\&. -.LP -Read more about Dialyzer and about how to use it from the GUI in Dialyzer User\&'s Guide\&. - -.SH USING THE DIALYZER FROM THE COMMAND LINE -.LP -Dialyzer also has a command line version for automated use\&. Below is a brief description of the list of its options\&. The same information can be obtained by writing - -.nf - dialyzer --help - -.fi -.LP -in a shell\&. Please refer to the GUI description for more details on the operation of Dialyzer\&. -.LP -The exit status of the command line version is: - -.nf - 0 - No problems were encountered during the analysis and no - warnings were emitted\&. - 1 - Problems were encountered during the analysis\&. - 2 - No problems were encountered, but warnings were emitted\&. - -.fi -.LP -Usage: - -.nf - dialyzer [--help] [--version] [--shell] [--quiet] [--verbose] - [-pa dir]* [--plt plt] [-Ddefine]* [-I include_dir]* - [--output_plt file] [-Wwarn]* [--src] - [-c applications] [-r applications] [-o outfile] - [--build_plt] [--add_to_plt] [--remove_from_plt] - [--check_plt] [--no_check_plt] [--plt_info] [--get_warnings] - -.fi -.LP -Options: -.RS 2 -.TP 4 -.B -\fI-c applications\fR(or \fI--command-line applications\fR): -use Dialyzer from the command line (no GUI) to detect defects in the specified applications (directories or \fI\&.erl\fR or \fI\&.beam\fR files) -.TP 4 -.B -\fI-r applications\fR: -same as \fI-c\fR only that directories are searched recursively for subdirectories containing \fI\&.erl\fR or \fI\&.beam\fR files (depending on the type of analysis) -.TP 4 -.B -\fI-o outfile\fR(or \fI--output outfile\fR): -when using Dialyzer from the command line, send the analysis results in the specified \fIoutfile\fR rather than in stdout -.TP 4 -.B -\fI--src\fR: -overide the default, which is to analyze debug compiled BEAM bytecode, and analyze starting from Erlang source code instead -.TP 4 -.B -\fI--raw\fR: -When using Dialyzer from the command line, output the raw analysis results (Erlang terms) instead of the formatted result\&. The raw format is easier to post-process (for instance, to filter warnings or to output HTML pages)\&. -.TP 4 -.B -\fI-Dname\fR(or \fI-Dname=value\fR): -when analyzing from source, pass the define to Dialyzer (**) -.TP 4 -.B -\fI-I include_dir\fR: -when analyzing from source, pass the \fIinclude_dir\fR to Dialyzer (**) -.TP 4 -.B -\fI-pa dir\fR: -Include \fIdir\fR in the path for Erlang\&. Useful when analyzing files that have \fI-include_lib()\fR directives\&. -.TP 4 -.B -\fI--output_plt file\fR: -Store the PLT at the specified location after building it\&. -.TP 4 -.B -\fI--plt plt\fR: -Use the specified plt as the initial persistent lookup table\&. -.TP 4 -.B -\fI-Wwarn\fR: -a family of option which selectively turn on/off warnings\&. (for help on the names of warnings use \fIdialyzer -Whelp\fR) -.TP 4 -.B -\fI--shell\fR: -do not disable the Erlang shell while running the GUI -.TP 4 -.B -\fI--version (or -v)\fR: -prints the Dialyzer version and some more information and exits -.TP 4 -.B -\fI--help (or -h)\fR: -prints this message and exits -.TP 4 -.B -\fI--quiet (or -q)\fR: -makes Dialyzer a bit more quiet -.TP 4 -.B -\fI--verbose\fR: -makes Dialyzer a bit more verbose -.TP 4 -.B -\fI--check_plt\fR: -Only checks if the initial PLT is up to date and rebuilds it if this is not the case -.TP 4 -.B -\fI--no_check_plt (or -n)\fR: -Skip the PLT integrity check when running Dialyzer\&. Useful when working with installed PLTs that never change\&. -.TP 4 -.B -\fI--build_plt\fR: -The analysis starts from an empty PLT and creates a new one from the files specified with -c and -r\&. Only works for beam files\&. Use --plt or --output_plt to override the default PLT location\&. -.TP 4 -.B -\fI--add_to_plt\fR: -The PLT is extended to also include the files specified with -c and -r\&. Use --plt to specify wich PLT to start from, and --output_plt to specify where to put the PLT\&. Note that the analysis might include files from the PLT if they depend on the new files\&. This option only works with beam files\&. -.TP 4 -.B -\fI--remove_from_plt\fR: -The information from the files specified with -c and -r is removed from the PLT\&. Note that this may cause a re-analysis of the remaining dependent files\&. -.TP 4 -.B -\fI--get_warnings\fR: -Makes Dialyzer emit warnings even when manipulating the PLT\&. Only emits warnings for files that are actually analyzed\&. The default is to not emit any warnings when manipulating the PLT\&. This option has no effect when performing a normal analysis\&. -.RE -.SS Note: -.LP -* denotes that multiple occurrences of these options are possible\&. -.LP -** options \fI-D\fR and \fI-I\fR work both from command-line and in the Dialyzer GUI; the syntax of defines and includes is the same as that used by \fIerlc\fR\&. - -.LP -Warning options: -.RS 2 -.TP 4 -.B -\fI-Wno_return\fR: -Suppress warnings for functions of no return\&. -.TP 4 -.B -\fI-Wno_unused\fR: -Suppress warnings for unused functions\&. -.TP 4 -.B -\fI-Wno_improper_lists\fR: -Suppress warnings for construction of improper lists\&. -.TP 4 -.B -\fI-Wno_fun_app\fR: -Suppress warnings for fun applications that will fail\&. -.TP 4 -.B -\fI-Wno_match\fR: -Suppress warnings for patterns that are unused or cannot match\&. -.TP 4 -.B -\fI-Werror_handling\fR***: -Include warnings for functions that only return by means of an exception\&. -.TP 4 -.B -\fI-Wunmatched_returns\fR***: -Include warnings for function calls which ignore a structured return value or do not match against one of many possible return value(s)\&. -.TP 4 -.B -\fI-Wunderspecs\fR***: -Warn about underspecified functions (the -spec is strictly more allowing than the success typing) -.TP 4 -.B -\fI-Woverspecs\fR***: -Warn about overspecified functions (the -spec is strictly less allowing than the success typing) -.TP 4 -.B -\fI-Wspecdiffs\fR***: -Warn when the -spec is different than the success typing -.RE -.SS Note: -.LP -*** These are options that turn on warnings rather than turning them off\&. - -.SH USING THE DIALYZER FROM ERLANG -.LP -You can also use Dialyzer directly from Erlang\&. Both the GUI and the command line version are available\&. The options are similar to the ones given from the command line, so please refer to the sections above for a description of these\&. -.SH EXPORTS -.LP -.B -gui() -> ok | {error, Msg} -.br -.B -gui(OptList) -> ok | {error, Msg} -.br -.RS -.TP -Types -OptList -- see below -.br -.RE -.RS -.LP -Dialyzer GUI version\&. - -.nf -OptList : [Option] -Option : {files, [Filename : string()]} - | {files_rec, [DirName : string()]} - | {defines, [{Macro: atom(), Value : term()}]} - | {from, src_code | byte_code} %% Defaults to byte_code - | {init_plt, FileName : string()} %% If changed from default - | {include_dirs, [DirName : string()]} - | {output_file, FileName : string()} - | {output_plt, FileName :: string()} - | {analysis_type, \&'success_typings\&' | \&'plt_add\&' | \&'plt_build\&' | \&'plt_check\&' | \&'plt_remove\&'} - | {warnings, [WarnOpts]} - | {get_warnings, bool()} - -WarnOpts : no_return - | no_unused - | no_improper_lists - | no_fun_app - | no_match - | no_fail_call - | error_handling - | unmatched_returns - | overspecs - | underspecs - | specdiffs - -.fi -.RE -.LP -.B -run(OptList) -> Warnings -.br -.RS -.TP -Types -OptList -- see gui/0, 1 -.br -Warnings -- see below -.br -.RE -.RS -.LP -Dialyzer command line version\&. - -.nf -Warnings :: [{Tag, Id, Msg}] -Tag : \&'warn_return_no_exit\&' | \&'warn_return_only_exit\&' - | \&'warn_not_called\&' | \&'warn_non_proper_list\&' - | \&'warn_fun_app\&' | \&'warn_matching\&' - | \&'warn_failing_call\&' | \&'warn_contract_types\&' - | \&'warn_contract_syntax\&' | \&'warn_contract_not_equal\&' - | \&'warn_contract_subtype\&' | \&'warn_contract_supertype\&' -Id = {File :: string(), Line :: integer()} -Msg = msg() -- Undefined - -.fi -.RE -.LP -.B -format_warning(Msg) -> string() -.br -.RS -.TP -Types -Msg = {Tag, Id, msg()} -- See run/1 -.br -.RE -.RS -.LP -Get a string from warnings as returned by dialyzer:run/1\&. -.RE -.LP -.B -plt_info(string()) -> {\&'ok\&', [{atom(), any()}]} | {\&'error\&', atom()} -.br -.RS -.LP -Returns information about the specified plt\&. -.RE diff -Nru erlang-13.b.1-dfsg/debian/manpages/epmd.1 erlang-13.b.3-dfsg/debian/manpages/epmd.1 --- erlang-13.b.1-dfsg/debian/manpages/epmd.1 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/manpages/epmd.1 1970-01-01 01:00:00.000000000 +0100 @@ -1,62 +0,0 @@ -.TH epmd 1 "erts 5.7.2" "Ericsson AB" "USER COMMANDS" -.SH NAME -epmd \- Erlang Port Mapper Daemon -.SH DESCRIPTION -.LP -This daemon acts as a name server on all hosts involved in distributed Erlang computations\&. When an Erlang node starts, the node has a name and it obtains an address from the host OS kernel\&. The name and the address are sent to the \fIepmd\fR daemon running on the local host\&. In a TCP/IP environment, the address consists of the IP address and a port number\&. The name of the node is an atom on the form of \fIName@Node\fR\&. The job of the \fIepmd\fR daemon is to keep track of which node name listens on which address\&. Hence, \fIepmd\fR map symbolic node names to machine addresses\&. -.LP -The daemon is started automatically by the Erlang start-up script\&. -.LP -The program \fIepmd\fR can also be used for a variety of other purposes, for example checking the DNS (Domain Name System) configuration of a host\&. - -.SH EXPORTS -.LP -.B -epmd [-daemon] -.br -.RS -.LP -Starts a name server as a daemon\&. If it has no argument, the \fIepmd\fR runs as a normal program with the controlling terminal of the shell in which it is started\&. Normally, it should run as a daemon\&. -.RE -.LP -.B -epmd -names -.br -.RS -.LP -Requests the names of the local Erlang nodes \fIepmd\fR has registered\&. -.RE -.LP -.B -epmd -kill -.br -.RS -.LP -Kills the \fIepmd\fR process\&. -.RE -.LP -.B -epmd -help -.br -.RS -.LP -Write short info about the usage including some debugging options not listed here\&. -.RE -.SH ENVIRONMENT VARIABLES -.RS 2 -.TP 4 -.B -\fIERL_EPMD_PORT\fR: -This environment variable can contain the port number epmd will use\&. The default port will work fine in most cases\&. A different port can be specified to allow several instances of epmd, representing independant clusters of nodes, to co-exist on the same host\&. All nodes in a cluster must use the same epmd port number\&. -.RE -.SH LOGGING -.LP -On some operating systems \fIsyslog\fR will be used for error reporting when epmd runs as an daemon\&. To enable the error logging you have to edit /etc/syslog\&.conf() file and add an entry - -.nf - !epmd - *\&.*/var/log/epmd\&.log - -.fi -.LP -where are at least one real tab character\&. Spaces will silently be ignored\&. diff -Nru erlang-13.b.1-dfsg/debian/manpages/erl.1 erlang-13.b.3-dfsg/debian/manpages/erl.1 --- erlang-13.b.1-dfsg/debian/manpages/erl.1 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/manpages/erl.1 1970-01-01 01:00:00.000000000 +0100 @@ -1,740 +0,0 @@ -.TH erl 1 "erts 5.7.2" "Ericsson AB" "USER COMMANDS" -.SH NAME -erl \- The Erlang Emulator -.SH DESCRIPTION -.LP -The \fIerl\fR program starts an Erlang runtime system\&. The exact details (for example, whether \fIerl\fR is a script or a program and which other programs it calls) are system-dependent\&. -.LP -Windows users probably wants to use the \fIwerl\fR program instead, which runs in its own window with scrollbars and supports command-line editing\&. The \fIerl\fR program on Windows provides no line editing in its shell, and on Windows 95 there is no way to scroll back to text which has scrolled off the screen\&. The \fIerl\fR program must be used, however, in pipelines or if you want to redirect standard input or output\&. - -.SH EXPORTS -.LP -.B -erl -.br -.RS -.LP -Starts an Erlang runtime system\&. -.LP -The arguments can be divided into \fIemulator flags\fR, \fIflags\fR and \fIplain arguments\fR: -.RS 2 -.TP 2 -* -Any argument starting with the character \fI+\fR is interpreted as an emulator flag\&. -.RS 2 -.LP - -.LP -As indicated by the name, emulator flags controls the behavior of the emulator\&. -.RE -.TP 2 -* -Any argument starting with the character \fI-\fR (hyphen) is interpreted as a flag which should be passed to the Erlang part of the runtime system, more specifically to the \fIinit\fR system process, see init(3erl)\&. -.RS 2 -.LP - -.LP -The \fIinit\fR process itself interprets some of these flags, the \fIinit flags\fR\&. It also stores any remaining flags, the \fIuser flags\fR\&. The latter can be retrieved by calling \fIinit:get_argument/1\fR\&. -.LP - -.LP -It can be noted that there are a small number of "-" flags which now actually are emulator flags, see the description below\&. -.RE -.TP 2 -* -Plain arguments are not interpreted in any way\&. They are also stored by the \fIinit\fR process and can be retrieved by calling \fIinit:get_plain_arguments/0\fR\&. Plain arguments can occur before the first flag, or after a \fI--\fR flag\&. Additionally, the flag \fI-extra\fR causes everything that follows to become plain arguments\&. -.RE -.LP -Example: - -.nf -% erl +W w -sname arnie +R 9 -s my_init -extra +bertie - -(arnie@host)1> init:get_argument(sname)\&. - -{ok,[["arnie"]]} -(arnie@host)2> init:get_plain_arguments()\&. - -["+bertie"] -.fi -.LP -Here \fI+W w\fR and \fI+R 9\fR are emulator flags\&. \fI-s my_init\fR is an init flag, interpreted by \fIinit\fR\&. \fI-sname arnie\fR is a user flag, stored by \fIinit\fR\&. It is read by Kernel and will cause the Erlang runtime system to become distributed\&. Finally, everything after \fI-extra\fR (that is, \fI+bertie\fR) is considered as plain arguments\&. - -.nf -% erl -myflag 1 - -1> init:get_argument(myflag)\&. - -{ok,[["1"]]} -2> init:get_plain_arguments()\&. - -[] -.fi -.LP -Here the user flag \fI-myflag 1\fR is passed to and stored by the \fIinit\fR process\&. It is a user defined flag, presumably used by some user defined application\&. -.RE -.SH FLAGS -.LP -In the following list, init flags are marked (init flag)\&. Unless otherwise specified, all other flags are user flags, for which the values can be retrieved by calling \fIinit:get_argument/1\fR\&. Note that the list of user flags is not exhaustive, there may be additional, application specific flags which instead are documented in the corresponding application documentation\&. -.RS 2 -.TP 4 -.B -\fI--\fR(init flag): -Everything following \fI--\fR up to the next flag (\fI-flag\fR or \fI+flag\fR) is considered plain arguments and can be retrieved using \fIinit:get_plain_arguments/0\fR\&. -.TP 4 -.B -\fI-Application Par Val\fR: -Sets the application configuration parameter \fIPar\fR to the value \fIVal\fR for the application \fIApplication\fR, see app(4) and application(3erl)\&. -.TP 4 -.B -\fI-args_file FileName\fR: - -.RS 4 -.LP -Command line arguments are read from the file \fIFileName\fR\&. The arguments read from the file replace the \&'\fI-args_file FileName\fR\&' flag on the resulting command line\&. -.LP - -.LP -The file \fIFileName\fR should be a plain text file and may contain comments and command line arguments\&. A comment begins with a # character and continues until next end of line character\&. Backslash (\e) is used as quoting character\&. All command line arguments accepted by \fIerl\fR are allowed, also the \fI-args_file FileName\fR flag\&. Be careful not to cause circular dependencies between files containing the \fI-args_file\fR flag, though\&. -.LP - -.LP -The \fI-extra\fR flag is treated specially\&. Its scope ends at the end of the file\&. Arguments following an \fI-extra\fR flag are moved on the command line into the \fI-extra\fR section, i\&.e\&. the end of the command line following after an \fI-extra\fR flag\&. -.RE -.TP 4 -.B -\fI-async_shell_start\fR: -The initial Erlang shell does not read user input until the system boot procedure has been completed (Erlang 5\&.4 and later)\&. This flag disables the start synchronization feature and lets the shell start in parallel with the rest of the system\&. -.TP 4 -.B -\fI-boot File\fR: -Specifies the name of the boot file, \fIFile\&.boot\fR, which is used to start the system\&. See init(3erl)\&. Unless \fIFile\fR contains an absolute path, the system searches for \fIFile\&.boot\fR in the current and \fI$ROOT/bin\fR directories\&. -.RS 4 -.LP - -.LP -Defaults to \fI$ROOT/bin/start\&.boot\fR\&. -.RE -.TP 4 -.B -\fI-boot_var Var Dir\fR: -If the boot script contains a path variable \fIVar\fR other than \fI$ROOT\fR, this variable is expanded to \fIDir\fR\&. Used when applications are installed in another directory than \fI$ROOT/lib\fR, see systools:make_script/1,2\&. -.TP 4 -.B -\fI-code_path_cache\fR: -Enables the code path cache of the code server, see code(3erl)\&. -.TP 4 -.B -\fI-compile Mod1 Mod2 \&.\&.\&.\fR: -Compiles the specified modules and then terminates (with non-zero exit code if the compilation of some file did not succeed)\&. Implies \fI-noinput\fR\&. Not recommended - use erlc instead\&. -.TP 4 -.B -\fI-config Config\fR: -Specifies the name of a configuration file, \fIConfig\&.config\fR, which is used to configure applications\&. See app(4) and application(3erl)\&. -.TP 4 -.B -\fI-connect_all false\fR: - -.RS 4 -.LP -If this flag is present, \fIglobal\fR will not maintain a fully connected network of distributed Erlang nodes, and then global name registration cannot be used\&. See global(3erl)\&. -.RE -.TP 4 -.B -\fI-cookie Cookie\fR: -Obsolete flag without any effect and common misspelling for \fI-setcookie\fR\&. Use \fI-setcookie\fR instead\&. -.TP 4 -.B -\fI-detached\fR: -Starts the Erlang runtime system detached from the system console\&. Useful for running daemons and backgrounds processes\&. -.TP 4 -.B -\fI-emu_args\fR: -Useful for debugging\&. Prints out the actual arguments sent to the emulator\&. -.TP 4 -.B -\fI-env Variable Value\fR: -Sets the host OS environment variable \fIVariable\fR to the value \fIValue\fR for the Erlang runtime system\&. Example: -.RS 4 -.LP - - -.nf -% erl -env DISPLAY gin:0 - -.fi -.LP - -.LP -In this example, an Erlang runtime system is started with the \fIDISPLAY\fR environment variable set to \fIgin:0\fR\&. -.RE -.TP 4 -.B -\fI-eval Expr\fR(init flag): -Makes \fIinit\fR evaluate the expression \fIExpr\fR, see init(3erl)\&. -.TP 4 -.B -\fI-extra\fR(init flag): -Everything following \fI-extra\fR is considered plain arguments and can be retrieved using \fIinit:get_plain_arguments/0\fR\&. -.TP 4 -.B -\fI-heart\fR: -Starts heart beat monitoring of the Erlang runtime system\&. See heart(3erl)\&. -.TP 4 -.B -\fI-hidden\fR: -Starts the Erlang runtime system as a hidden node, if it is run as a distributed node\&. Hidden nodes always establish hidden connections to all other nodes except for nodes in the same global group\&. Hidden connections are not published on neither of the connected nodes, i\&.e\&. neither of the connected nodes are part of the result from \fInodes/0\fR on the other node\&. See also hidden global groups, global_group(3erl)\&. -.TP 4 -.B -\fI-hosts Hosts\fR: -Specifies the IP addresses for the hosts on which Erlang boot servers are running, see erl_boot_server(3erl)\&. This flag is mandatory if the \fI-loader inet\fR flag is present\&. -.RS 4 -.LP - -.LP -The IP addresses must be given in the standard form (four decimal numbers separated by periods, for example \fI"150\&.236\&.20\&.74"\fR\&. Hosts names are not acceptable, but a broadcast address (preferably limited to the local network) is\&. -.RE -.TP 4 -.B -\fI-id Id\fR: -Specifies the identity of the Erlang runtime system\&. If it is run as a distributed node, \fIId\fR must be identical to the name supplied together with the \fI-sname\fR or \fI-name\fR flag\&. -.TP 4 -.B -\fI-init_debug\fR: -Makes \fIinit\fR write some debug information while interpreting the boot script\&. -.TP 4 -.B -\fI-instr\fR(emulator flag): - -.RS 4 -.LP -Selects an instrumented Erlang runtime system (virtual machine) to run, instead of the ordinary one\&. When running an instrumented runtime system, some resource usage data can be obtained and analysed using the module \fIinstrument\fR\&. Functionally, it behaves exactly like an ordinary Erlang runtime system\&. -.RE -.TP 4 -.B -\fI-loader Loader\fR: -Specifies the method used by \fIerl_prim_loader\fR to load Erlang modules into the system\&. See erl_prim_loader(3erl)\&. Two \fILoader\fR methods are supported, \fIefile\fR and \fIinet\fR\&. \fIefile\fR means use the local file system, this is the default\&. \fIinet\fR means use a boot server on another machine, and the \fI-id\fR, \fI-hosts\fR and \fI-setcookie\fR flags must be specified as well\&. If \fILoader\fR is something else, the user supplied \fILoader\fR port program is started\&. -.TP 4 -.B -\fI-make\fR: -Makes the Erlang runtime system invoke \fImake:all()\fR in the current working directory and then terminate\&. See make(3erl)\&. Implies \fI-noinput\fR\&. -.TP 4 -.B -\fI-man Module\fR: -Displays the manual page for the Erlang module \fIModule\fR\&. Only supported on Unix\&. -.TP 4 -.B -\fI-mode interactive | embedded\fR: -Indicates if the system should load code dynamically (\fIinteractive\fR), or if all code should be loaded during system initialization (\fIembedded\fR), see code(3erl)\&. Defaults to \fIinteractive\fR\&. -.TP 4 -.B -\fI-name Name\fR: -Makes the Erlang runtime system into a distributed node\&. This flag invokes all network servers necessary for a node to become distributed\&. See net_kernel(3erl)\&. It is also ensured that \fIepmd\fR runs on the current host before Erlang is started\&. See epmd(1)\&. -.RS 4 -.LP - -.LP -The name of the node will be \fIName@Host\fR, where \fIHost\fR is the fully qualified host name of the current host\&. For short names, use the \fI-sname\fR flag instead\&. -.RE -.TP 4 -.B -\fI-noinput\fR: -Ensures that the Erlang runtime system never tries to read any input\&. Implies \fI-noshell\fR\&. -.TP 4 -.B -\fI-noshell\fR: -Starts an Erlang runtime system with no shell\&. This flag makes it possible to have the Erlang runtime system as a component in a series of UNIX pipes\&. -.TP 4 -.B -\fI-nostick\fR: -Disables the sticky directory facility of the Erlang code server, see code(3erl)\&. -.TP 4 -.B -\fI-oldshell\fR: -Invokes the old Erlang shell from Erlang 3\&.3\&. The old shell can still be used\&. -.TP 4 -.B -\fI-pa Dir1 Dir2 \&.\&.\&.\fR: -Adds the specified directories to the beginning of the code path, similar to \fIcode:add_pathsa/1\fR\&. See code(3erl)\&. As an alternative to \fI-pa\fR, if several directories are to be prepended to the code and the directories have a common parent directory, that parent directory could be specified in the \fIERL_LIBS\fR environment variable\&. See code(3erl)\&. -.TP 4 -.B -\fI-pz Dir1 Dir2 \&.\&.\&.\fR: -Adds the specified directories to the end of the code path, similar to \fIcode:add_pathsz/1\fR\&. See code(3erl)\&. -.TP 4 -.B -\fI-remsh Node\fR: -Starts Erlang with a remote shell connected to \fINode\fR\&. -.TP 4 -.B -\fI-rsh Program\fR: -Specifies an alternative to \fIrsh\fR for starting a slave node on a remote host\&. See slave(3erl)\&. -.TP 4 -.B -\fI-run Mod [Func [Arg1, Arg2, \&.\&.\&.]]\fR(init flag): -Makes \fIinit\fR call the specified function\&. \fIFunc\fR defaults to \fIstart\fR\&. If no arguments are provided, the function is assumed to be of arity 0\&. Otherwise it is assumed to be of arity 1, taking the list \fI[Arg1, Arg2, \&.\&.\&.]\fR as argument\&. All arguments are passed as strings\&. See init(3erl)\&. -.TP 4 -.B -\fI-s Mod [Func [Arg1, Arg2, \&.\&.\&.]]\fR(init flag): -Makes \fIinit\fR call the specified function\&. \fIFunc\fR defaults to \fIstart\fR\&. If no arguments are provided, the function is assumed to be of arity 0\&. Otherwise it is assumed to be of arity 1, taking the list \fI[Arg1, Arg2, \&.\&.\&.]\fR as argument\&. All arguments are passed as atoms\&. See init(3erl)\&. -.TP 4 -.B -\fI-setcookie Cookie\fR: -Sets the magic cookie of the node to \fICookie\fR, see erlang:set_cookie/2\&. -.TP 4 -.B -\fI-shutdown_time Time\fR: -Specifies how long time (in milliseconds) the \fIinit\fR process is allowed to spend shutting down the system\&. If \fITime\fR ms have elapsed, all processes still existing are killed\&. Defaults to \fIinfinity\fR\&. -.TP 4 -.B -\fI-sname Name\fR: -Makes the Erlang runtime system into a distributed node, similar to \fI-name\fR, but the host name portion of the node name \fIName@Host\fR will be the short name, not fully qualified\&. -.RS 4 -.LP - -.LP -This is sometimes the only way to run distributed Erlang if the DNS (Domain Name System) is not running\&. There can be no communication between nodes running with the \fI-sname\fR flag and those running with the \fI-name\fR flag, as node names must be unique in distributed Erlang systems\&. -.RE -.TP 4 -.B -\fI-smp [enable|auto|disable]\fR: - -.RS 4 -.LP -\fI-smp enable\fR and \fI-smp\fR starts the Erlang runtime system with SMP support enabled\&. This may fail if no runtime system with SMP support is available\&. \fI-smp auto\fR starts the Erlang runtime system with SMP support enabled if it is available and more than one logical processor are detected\&. \fI-smp disable\fR starts a runtime system without SMP support\&. By default \fI-smp auto\fR will be used unless a conflicting parameter has been passed, then \fI-smp disable\fR will be used\&. Currently only the \fI-hybrid\fR parameter conflicts with \fI-smp auto\fR\&. -.LP - -.LP -\fINOTE\fR: The runtime system with SMP support will not be available on all supported platforms\&. See also the +S flag\&. -.RE -.TP 4 -.B -\fI-version\fR(emulator flag): -Makes the emulator print out its version number\&. The same as \fIerl +V\fR\&. -.RE -.SH EMULATOR FLAGS -.LP -\fIerl\fR invokes the code for the Erlang emulator (virtual machine), which supports the following flags: -.RS 2 -.TP 4 -.B -\fI+a size\fR: - -.RS 4 -.LP -Suggested stack size, in kilowords, for threads in the async-thread pool\&. Valid range is 16-8192 kilowords\&. The default suggested stack size is 16 kilowords, i\&.e, 64 kilobyte on 32-bit architectures\&. This small default size has been chosen since the amount of async-threads might be quite large\&. The default size is enough for drivers delivered with Erlang/OTP, but might not be sufficiently large for other dynamically linked in drivers that use the driver_async() functionality\&. Note that the value passed is only a suggestion, and it might even be ignored on some platforms\&. -.RE -.TP 4 -.B -\fI+A size\fR: - -.RS 4 -.LP -Sets the number of threads in async thread pool, valid range is 0-1024\&. Default is 0\&. -.RE -.TP 4 -.B -\fI+B [c | d | i]\fR: -The \fIc\fR option makes \fICtrl-C\fR interrupt the current shell instead of invoking the emulator break handler\&. The \fId\fR option (same as specifying \fI+B\fR without an extra option) disables the break handler\&. The \fIi\fR option makes the emulator ignore any break signal\&. -.RS 4 -.LP - -.LP -If the \fIc\fR option is used with \fIoldshell\fR on Unix, \fICtrl-C\fR will restart the shell process rather than interrupt it\&. -.LP - -.LP -Note that on Windows, this flag is only applicable for \fIwerl\fR, not \fIerl\fR (\fIoldshell\fR)\&. Note also that \fICtrl-Break\fR is used instead of \fICtrl-C\fR on Windows\&. -.RE -.TP 4 -.B -\fI+c\fR: -Disable compensation for sudden changes of system time\&. -.RS 4 -.LP - -.LP -Normally, \fIerlang:now/0\fR will not immediately reflect sudden changes in the system time, in order to keep timers (including \fIreceive-after\fR) working\&. Instead, the time maintained by \fIerlang:now/0\fR is slowly adjusted towards the new system time\&. (Slowly means in one percent adjustments; if the time is off by one minute, the time will be adjusted in 100 minutes\&.) -.LP - -.LP -When the \fI+c\fR option is given, this slow adjustment will not take place\&. Instead \fIerlang:now/0\fR will always reflect the current system time\&. Note that timers are based on \fIerlang:now/0\fR\&. If the system time jumps, timers then time out at the wrong time\&. -.RE -.TP 4 -.B -\fI+d\fR: -If the emulator detects an internal error (or runs out of memory), it will by default generate both a crash dump and a core dump\&. The core dump will, however, not be very useful since the content of process heaps is destroyed by the crash dump generation\&. -.RS 4 -.LP - -.LP -The \fI+d\fR option instructs the emulator to only produce a core dump and no crash dump if an internal error is detected\&. -.LP - -.LP -Calling \fIerlang:halt/1\fR with a string argument will still produce a crash dump\&. -.RE -.TP 4 -.B -\fI+h Size\fR: -Sets the default heap size of processes to the size \fISize\fR\&. -.TP 4 -.B -\fI+K true | false\fR: -Enables or disables the kernel poll functionality if the emulator supports it\&. Default is \fIfalse\fR (disabled)\&. If the emulator does not support kernel poll, and the \fI+K\fR flag is passed to the emulator, a warning is issued at startup\&. -.TP 4 -.B -\fI+l\fR: -Enables auto load tracing, displaying info while loading code\&. -.TP 4 -.B -\fI+MFlag Value\fR: - -.RS 4 -.LP -Memory allocator specific flags, see erts_alloc(3erl) for further information\&. -.RE -.TP 4 -.B -\fI+P Number\fR: - -.RS 4 -.LP -Sets the maximum number of concurrent processes for this system\&. \fINumber\fR must be in the range 16\&.\&.134217727\&. Default is 32768\&. -.RE -.TP 4 -.B -\fI+R ReleaseNumber\fR: - -.RS 4 -.LP -Sets the compatibility mode\&. -.LP - -.LP -The distribution mechanism is not backwards compatible by default\&. This flags sets the emulator in compatibility mode with an earlier Erlang/OTP release \fIReleaseNumber\fR\&. The release number must be in the range \fI7\&.\&.\fR\&. This limits the emulator, making it possible for it to communicate with Erlang nodes (as well as C- and Java nodes) running that earlier release\&. -.LP - -.LP -For example, an R10 node is not automatically compatible with an R9 node, but R10 nodes started with the \fI+R 9\fR flag can co-exist with R9 nodes in the same distributed Erlang system, they are R9-compatible\&. -.LP - -.LP -Note: Make sure all nodes (Erlang-, C-, and Java nodes) of a distributed Erlang system is of the same Erlang/OTP release, or from two different Erlang/OTP releases X and Y, where \fIall\fR Y nodes have compatibility mode X\&. -.LP - -.LP -For example: A distributed Erlang system can consist of R10 nodes, or of R9 nodes and R9-compatible R10 nodes, but not of R9 nodes, R9-compatible R10 nodes and "regular" R10 nodes, as R9 and "regular" R10 nodes are not compatible\&. -.RE -.TP 4 -.B -\fI+r\fR: -Force ets memory block to be moved on realloc\&. -.TP 4 -.B -\fI+S Schedulers:SchedulerOnline\fR: - -.RS 4 -.LP -Sets the amount of scheduler threads to create and scheduler threads to set online when SMP support has been enabled\&. Valid range for both values are 1-1024\&. If the Erlang runtime system is able to determine the amount of logical processors configured and logical processors available, \fISchedulers\fR will default to logical processors configured, and \fISchedulersOnline\fR will default to logical processors available; otherwise, the default values will be 1\&. \fISchedulers\fR may be omitted if \fI:SchedulerOnline\fR is not and vice versa\&. The amount of schedulers online can be changed at run time via erlang:system_flag(schedulers_online, SchedulersOnline)\&. -.LP - -.LP -This flag will be ignored if the emulator doesn\&'t have SMP support enabled (see the -smp flag)\&. -.RE -.TP 4 -.B -\fI+sFlag Value\fR: -Scheduling specific flags\&. -.RS 4 -.LP - -.RS 2 -.TP 4 -.B -+sbt BindType: - -.RS 4 -.LP -Set scheduler bind type\&. Currently valid \fIBindType\fRs: -.LP - -.RS 2 -.TP 4 -.B -\fIu\fR: -Same as erlang:system_flag(scheduler_bind_type, unbound)\&. -.TP 4 -.B -\fIns\fR: -Same as erlang:system_flag(scheduler_bind_type, no_spread)\&. -.TP 4 -.B -\fIts\fR: -Same as erlang:system_flag(scheduler_bind_type, thread_spread)\&. -.TP 4 -.B -\fIps\fR: -Same as erlang:system_flag(scheduler_bind_type, processor_spread)\&. -.TP 4 -.B -\fInnts\fR: -Same as erlang:system_flag(scheduler_bind_type, no_node_thread_spread)\&. -.TP 4 -.B -\fInnps\fR: -Same as erlang:system_flag(scheduler_bind_type, no_node_processor_spread)\&. -.TP 4 -.B -\fItnnps\fR: -Same as erlang:system_flag(scheduler_bind_type, thread_no_node_processor_spread)\&. -.TP 4 -.B -\fIdb\fR: -Same as erlang:system_flag(scheduler_bind_type, default_bind)\&. -.RE -.LP - -.LP -Binding of schedulers are currently only supported on newer Linux and Solaris systems\&. -.LP - -.LP -If no CPU topology is available when the \fI+sbt\fR flag is processed and \fIBindType\fR is any other type than \fIu\fR, the runtime system will fail to start\&. CPU topology can be defined using the +sct flag\&. Note that the \fI+sct\fR flag may have to be passed before the \fI+sbt\fR flag on the command line (in case no CPU topology has been automatically detected)\&. -.LP - -.LP -For more information, see erlang:system_flag(scheduler_bind_type, SchedulerBindType)\&. -.RE -.TP 4 -.B -\fI+sct CpuTopology\fR: - -.RS 4 -.RS 2 -.TP 2 -* -\fI = integer(); when 0 =< =< 65535\fR -.TP 2 -* -\fI = -\fR -.TP 2 -* -\fI = | \fR -.TP 2 -* -\fI = , | \fR -.TP 2 -* -\fI = L\fR -.TP 2 -* -\fI = T | t\fR -.TP 2 -* -\fI = C | c\fR -.TP 2 -* -\fI = P | p\fR -.TP 2 -* -\fI = N | n\fR -.TP 2 -* -\fI = \fR -.TP 2 -* -\fICpuTopology = : | \fR -.RE -.LP - -.LP -Upper-case letters signify real identifiers and lower-case letters signify fake identifiers only used for description of the topology\&. Identifiers passed as real identifiers may be used by the runtime system when trying to access specific hardware and if they are not correct the behavior is undefined\&. Faked logical CPU identifiers are not accepted since there is no point in defining the CPU topology without real logical CPU identifiers\&. Thread, core, processor, and node identifiers may be left out\&. If left out, thread id defaults to \fIt0\fR, core id defaults to \fIc0\fR, processor id defaults to \fIp0\fR, and node id will be left undefined\&. Either all processors or no processors should have node identifiers defined\&. -.LP - -.LP -Both increasing and decreasing \fI\fRs are allowed\&. -.LP - -.LP -NUMA node identifiers are system wide\&. That is, each NUMA node on the system have to have a unique identifier\&. Processor identifiers are also system wide\&. Core identifiers are processor wide\&. Thread identifiers are core wide\&. -.LP - -.LP -The order of the identifier types imply the hierarchy of the CPU topology\&. Currently, the only valid order is: logical, thread, core, processor, node\&. That is, thread is part of a core which is part of a processor which is part of a NUMA node\&. This will, however, change in the future, since multiple NUMA nodes can be part of a processor, but this is not supported yet\&. -.LP - -.LP -If a list of identifiers is used in an \fI\fR: -.LP - -.RS 2 -.TP 2 -* -\fI\fR have to be a list of identifiers\&. -.TP 2 -* -At least one other identifier type apart from \fI\fR also have to have a list of identifiers\&. -.TP 2 -* -All lists of identifiers have to produce the same amount of identifiers\&. -.RE -.LP - -.LP -A simple example\&. A single quad core processor may be described this way: -.LP - - -.nf -% erl +sct L0-3c0-3 - -1> erlang:system_info(cpu_topology)\&. - -[{processor,[{core,{logical,0}}, - {core,{logical,1}}, - {core,{logical,2}}, - {core,{logical,3}}]}] - -.fi -.LP - -.LP -A little more complicated example\&. Two quad core processors\&. Each processor in its own NUMA node\&. The ordering of logical processors is a little weird\&. This in order to give a better example of identifier lists: -.LP - - -.nf -% erl +sct L0-1,3-2c0-3p0N0:L7,4,6-5c0-3p1N1 - -1> erlang:system_info(cpu_topology)\&. - -[{node,[{processor,[{core,{logical,0}}, - {core,{logical,1}}, - {core,{logical,3}}, - {core,{logical,2}}]}]}, - {node,[{processor,[{core,{logical,7}}, - {core,{logical,4}}, - {core,{logical,6}}, - {core,{logical,5}}]}]}] - -.fi -.LP - -.LP -As long as real identifiers are correct it is okay to pass a CPU topology that is not a correct description of the CPU topology\&. When used with care this can actually be very useful\&. This in order to trick the emulator to bind its schedulers as you want\&. For example, if you want to run multiple Erlang runtime systems on the same machine, you want to reduce the amount of schedulers used and manipulate the CPU topology so that they bind to different logical CPUs\&. An example, with two Erlang runtime systems on a quad core machine: -.LP - - -.nf -% erl +sct L0-3c0-3 +sbt db +S3:2 -detached -noinput -noshell -sname one - -% erl +sct L3-0c0-3 +sbt db +S3:2 -detached -noinput -noshell -sname two - - -.fi -.LP - -.LP -In this example each runtime system have two schedulers each online, and all schedulers online will run on different cores\&. If we change to one scheduler online on one runtime system, and three schedulers online on the other, all schedulers online will still run on different cores\&. -.LP - -.LP -Note that a faked CPU topology that does not reflect how the real CPU topology looks like is likely to decrease the performance of the runtime system\&. -.LP - -.LP -For more information, see erlang:system_flag(cpu_topology, CpuTopology)\&. -.RE -.RE -.RE -.TP 4 -.B -\fI+T Level\fR: - -.RS 4 -.LP -Enables modified timing and sets the modified timing level\&. Currently valid range is 0-9\&. The timing of the runtime system will change\&. A high level usually means a greater change than a low level\&. Changing the timing can be very useful for finding timing related bugs\&. -.LP - -.LP -Currently, modified timing affects the following: -.LP - -.RS 2 -.TP 4 -.B -Process spawning: -A process calling \fIspawn\fR, \fIspawn_link\fR, \fIspawn_monitor\fR, or \fIspawn_opt\fR will be scheduled out immediately after completing the call\&. When higher modified timing levels are used, the caller will also sleep for a while after being scheduled out\&. -.TP 4 -.B -Context reductions: -The amount of reductions a process is a allowed to use before being scheduled out is increased or reduced\&. -.TP 4 -.B -Input reductions: -The amount of reductions performed before checking I/O is increased or reduced\&. -.RE -.LP - -.LP -\fINOTE:\fR Performance will suffer when modified timing is enabled\&. This flag is \fIonly\fR intended for testing and debugging\&. Also note that \fIreturn_to\fR and \fIreturn_from\fR trace messages will be lost when tracing on the spawn BIFs\&. This flag may be removed or changed at any time without prior notice\&. -.RE -.TP 4 -.B -\fI+V\fR: -Makes the emulator print out its version number\&. -.TP 4 -.B -\fI+v\fR: -Verbose\&. -.TP 4 -.B -\fI+W w | i\fR: -Sets the mapping of warning messages for \fIerror_logger\fR\&. Messages sent to the error logger using one of the warning routines can be mapped either to errors (default), warnings (\fI+W w\fR), or info reports (\fI+W i\fR)\&. The current mapping can be retrieved using \fIerror_logger:warning_map/0\fR\&. See error_logger(3erl) for further information\&. -.RE -.SH ENVIRONMENT VARIABLES -.RS 2 -.TP 4 -.B -\fIERL_CRASH_DUMP\fR: -If the emulator needs to write a crash dump, the value of this variable will be the file name of the crash dump file\&. If the variable is not set, the name of the crash dump file will be \fIerl_crash\&.dump\fR in the current directory\&. -.TP 4 -.B -\fIERL_CRASH_DUMP_NICE\fR: -\fIUnix systems\fR: If the emulator needs to write a crash dump, it will use the value of this variable to set the nice value for the process, thus lowering its priority\&. The allowable range is 1 through 39 (higher values will be replaced with 39)\&. The highest value, 39, will give the process the lowest priority\&. -.TP 4 -.B -\fIERL_CRASH_DUMP_SECONDS\fR: -\fIUnix systems\fR: This variable gives the number of seconds that the emulator will be allowed to spend writing a crash dump\&. When the given number of seconds have elapsed, the emulator will be terminated by a SIGALRM signal\&. -.TP 4 -.B -\fIERL_AFLAGS\fR: -The content of this environment variable will be added to the beginning of the command line for \fIerl\fR\&. -.RS 4 -.LP - -.LP -The \fI-extra\fR flag is treated specially\&. Its scope ends at the end of the environment variable content\&. Arguments following an \fI-extra\fR flag are moved on the command line into the \fI-extra\fR section, i\&.e\&. the end of the command line following after an \fI-extra\fR flag\&. -.RE -.TP 4 -.B -\fIERL_ZFLAGS\fRand \fIERL_FLAGS\fR: -The content of these environment variables will be added to the end of the command line for \fIerl\fR\&. -.RS 4 -.LP - -.LP -The \fI-extra\fR flag is treated specially\&. Its scope ends at the end of the environment variable content\&. Arguments following an \fI-extra\fR flag are moved on the command line into the \fI-extra\fR section, i\&.e\&. the end of the command line following after an \fI-extra\fR flag\&. -.RE -.TP 4 -.B -\fIERL_LIBS\fR: -This environment variable contains a list of additional library directories that the code server will search for applications and add to the code path\&. See code(3erl)\&. -.TP 4 -.B -\fIERL_EPMD_PORT\fR: -This environment variable can contain the port number to use when communicating with epmd\&. The default port will work fine in most cases\&. A different port can be specified to allow nodes of independant clusters to co-exist on the same host\&. All nodes in a cluster must use the same epmd port number\&. -.RE -.SH SEE ALSO -.LP -init(3erl), erl_prim_loader(3erl), erl_boot_server(3erl), code(3erl), application(3erl), heart(3erl), net_kernel(3erl), auth(3erl), make(3erl), epmd(1), erts_alloc(3erl) diff -Nru erlang-13.b.1-dfsg/debian/manpages/erlang-depends.1 erlang-13.b.3-dfsg/debian/manpages/erlang-depends.1 --- erlang-13.b.1-dfsg/debian/manpages/erlang-depends.1 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/manpages/erlang-depends.1 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1,237 @@ +.\" Automatically generated by Pod::Man 2.1801 (Pod::Simple 3.05) +.\" Modified by Sergei Golovan +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. \*(C+ will +.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +.\" nothing in troff, for use with C<>. +.tr \(*W- +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is turned on, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.ie \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. nr % 0 +. rr F +.\} +.el \{\ +. de IX +.. +.\} +.\" +.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +.\" Fear. Run. Save yourself. No user-serviceable parts. +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds / +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +.\} +.rm #[ #] #H #V #F C +.\" ======================================================================== +.\" +.IX Title "ERLANG-DEPENDS 1" +.TH ERLANG-DEPENDS 1 "2009\-07\-02" "1:13.b.1\-dfsg\-4" "Erlang packages for Debian GNU/Linux" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH "NAME" +erlang\-depends \- calculates Erlang dependencies +.SH "SYNOPSIS" +.IX Header "SYNOPSIS" +\&\fBerlang-depends\fR [\fIdebhelper\ options\fR] +.SH "DESCRIPTION" +.IX Header "DESCRIPTION" +erlang\-depends is a debhelper-like program that is responsible for generating +the substitution variables for Erlang-dependent packages. +.PP +The most useful variable is ${erlang:Depends}. It expands into the list of +Erlang packages which modules are used in the building package. It is +introduced in version 1:13.b.1\-dfsg\-3 of erlang-dev package. +.PP +Also, ${erlang\-abi:Depends} substitution adds current erlang \s-1ABI\s0 virtual +package to substvar files. It is useful if your package uses C-based +extensions which may break in case of \s-1ABI\s0 changes. It is introduced in +version 1:11.b.4\-4 of erlang\-dev package. +.PP +If you want to fine tune your package dependencies then you may want to use +substvars for all Erlang packages you need. Currently they are: +${erlang\-base:Depends}, +${erlang\-dev:Depends}, +${erlang\-appmon:Depends}, +${erlang\-asn1:Depends}, +${erlang\-common-test:Depends}, +${erlang\-corba:Depends}, +${erlang\-crypto:Depends}, +${erlang\-debugger:Depends}, +${erlang\-dialyzer:Depends}, +${erlang\-docbuilder:Depends}, +${erlang\-edoc:Depends}, +${erlang\-et:Depends}, +${erlang\-eunit:Depends}, +${erlang\-gs:Depends}, +${erlang\-ic:Depends}, +${erlang\-inets:Depends}, +${erlang\-inviso:Depends}, +${erlang\-megaco:Depends}, +${erlang\-mnesia:Depends}, +${erlang\-observer:Depends}, +${erlang\-odbc:Depends}, +${erlang\-os-mon:Depends}, +${erlang\-parsetools:Depends}, +${erlang\-percept:Depends}, +${erlang\-pman:Depends}, +${erlang\-public-key:Depends}, +${erlang\-reltool:Depends}, +${erlang\-runtime-tools:Depends}, +${erlang\-snmp:Depends}, +${erlang\-ssh:Depends}, +${erlang\-ssl:Depends}, +${erlang\-syntax-tools:Depends}, +${erlang\-test-server:Depends}, +${erlang\-toolbar:Depends}, +${erlang\-tools:Depends}, +${erlang\-tv:Depends}, +${erlang\-typer:Depends}, +${erlang\-webtool:Depends}, +${erlang\-wx:Depends}, +${erlang\-xmerl:Depends}. +All variables except ${erlang\-base:Depends} and ${erlang\-dev:Depends} were +introduced in version 1:13.b\-dfsg\-2 of erlang\-dev package. +.PP +For compatibility with older versions the variables +${erlang\-nox:Depends} and ${erlang\-x11:Depends} also works (even since the +corresponding packages turned into dummy packages). +.PP +If you use this program, your package must build-depend on erlang\-dev +(>= 1:13.b\-dfsg\-2). If you want your package to use automatic calculation +of dependencies then it must build-depend on erlang\-dev (>= 1:13.b.1\-dfsg\-3). +.SH "OPTIONS" +.IX Header "OPTIONS" +.IP "\fB\-v\fR, \fB\-\-verbose\fR" 4 +.IX Item "-v, --verbose" +Verbose mode. +.IP "\fB\-a\fR, \fB\-\-arch\fR" 4 +.IX Item "-a, --arch" +Act on all architecture dependent packages. +.IP "\fB\-i\fR, \fB\-\-indep\fR" 4 +.IX Item "-i, --indep" +Act on all architecture independent packages. +.IP "\fB\-p\fR\fIpackage\fR, \fB\-\-package=\fR\fIpackage\fR" 4 +.IX Item "-ppackage, --package=package" +Act on the package named \*(L"package\*(R". This option may be specified multiple +times. +.IP "\fB\-N\fR\fIpackage\fR, \fB\-\-no\-package=\fR\fIpackage\fR" 4 +.IX Item "-Npackage, --no-package=package" +Do not act on the specified package even if an \-a, \-i, or \-p option lists +the package as one that should be acted on. +.IP "\fB\-\-ignore=\fR\fIfile\fR" 4 +.IX Item "--ignore=file" +Ignore the specified file. +.IP "\fB\-P\fR\fItmpdir\fR, \fB\-\-tmpdir=\fR\fItmpdir\fR" 4 +.IX Item "-Ptmpdir, --tmpdir=tmpdir" +Use \*(L"tmpdir\*(R" for package build directory. The default is debian/ +.SH "SEE ALSO" +.IX Header "SEE ALSO" +\&\fIdebhelper\fR\|(7) +.PP +This program is not part of debhelper. +.SH "AUTHORS" +.IX Header "AUTHORS" +Torsten Werner initially wrote it in Perl, +Sergei Golovan rewrote in Erlang (started from 1:13.b.1\-dfsg\-3). diff -Nru erlang-13.b.1-dfsg/debian/manpages/erlc.1 erlang-13.b.3-dfsg/debian/manpages/erlc.1 --- erlang-13.b.1-dfsg/debian/manpages/erlc.1 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/manpages/erlc.1 1970-01-01 01:00:00.000000000 +0100 @@ -1,214 +0,0 @@ -.TH erlc 1 "erts 5.7.2" "Ericsson AB" "USER COMMANDS" -.SH NAME -erlc \- Compiler -.SH DESCRIPTION -.LP -The \fIerlc\fR program provides a common way to run all compilers in the Erlang system\&. Depending on the extension of each input file, \fIerlc\fR will invoke the appropriate compiler\&. Regardless of which compiler is used, the same flags are used to provide parameters such as include paths and output directory\&. -.LP -The current working directory, \fI"\&."\fR, will not be included in the code path when running the compiler (to avoid loading Beam files from the current working directory that could potentially be in conflict with the compiler or Erlang/OTP system used by the compiler)\&. - -.SH EXPORTS -.LP -.B -erlc flags file1\&.ext file2\&.ext\&.\&.\&. -.br -.RS -.LP -\fIErlc\fR compiles one or more files\&. The files must include the extension, for example \fI\&.erl\fR for Erlang source code, or \fI\&.yrl\fR for Yecc source code\&. \fIErlc\fR uses the extension to invoke the correct compiler\&. -.RE -.SH GENERALLY USEFUL FLAGS -.LP -The following flags are supported: -.RS 2 -.TP 4 -.B --I \fIdirectory\fR: -Instructs the compiler to search for include files in the specified directory\&. When encountering an \fI-include\fR or \fI-include_dir\fR directive, the compiler searches for header files in the following directories: -.RS 4 -.LP - -.RS 2 -.TP 4 -1. -\fI"\&."\fR, the current working directory of the file server; -.TP 4 -2. -the base name of the compiled file; -.TP 4 -3. -the directories specified using the \fI-I\fR option\&. The directory specified last is searched first\&. -.RE -.RE -.TP 4 -.B --o \fIdirectory\fR: -The directory where the compiler should place the output files\&. If not specified, output files will be placed in the current working directory\&. -.TP 4 -.B --D\fIname\fR: -Defines a macro\&. -.TP 4 -.B --D\fIname\fR=\fIvalue\fR: -Defines a macro with the given value\&. The value can be any Erlang term\&. Depending on the platform, the value may need to be quoted if the shell itself interprets certain characters\&. On Unix, terms which contain tuples and list must be quoted\&. Terms which contain spaces must be quoted on all platforms\&. -.TP 4 -.B --W\fInumber\fR: -Sets warning level to \fInumber\fR\&. Default is \fI1\fR\&. Use \fI-W0\fR to turn off warnings\&. -.TP 4 -.B --W: -Same as \fI-W1\fR\&. Default\&. -.TP 4 -.B --v: -Enables verbose output\&. -.TP 4 -.B --b \fIoutput-type\fR: -Specifies the type of output file\&. Generally, \fIoutput-type\fR is the same as the file extension of the output file but without the period\&. This option will be ignored by compilers that have a a single output format\&. -.TP 4 -.B --hybrid: -Compile using the hybrid-heap emulator\&. This is mainly useful for compiling native code, which needs to be compiled with the same run-time system that it should be run on\&. -.TP 4 -.B --smp: -Compile using the SMP emulator\&. This is mainly useful for compiling native code, which needs to be compiled with the same run-time system that it should be run on\&. -.TP 4 -.B ---: -Signals that no more options will follow\&. The rest of the arguments will be treated as file names, even if they start with hyphens\&. -.TP 4 -.B -+\fIterm\fR: -A flag starting with a plus (\&'\fI+\fR\&') rather than a hyphen will be converted to an Erlang term and passed unchanged to the compiler\&. For instance, the \fIexport_all\fR option for the Erlang compiler can be specified as follows: -.RS 4 -.LP - - -.nf -erlc +export_all file\&.erl -.fi -.LP - -.LP -Depending on the platform, the value may need to be quoted if the shell itself interprets certain characters\&. On Unix, terms which contain tuples and list must be quoted\&. Terms which contain spaces must be quoted on all platforms\&. -.RE -.RE -.SH SPECIAL FLAGS -.LP -The flags in this section are useful in special situations such as re-building the OTP system\&. -.RS 2 -.TP 4 -.B --pa \fIdirectory\fR: -Appends \fIdirectory\fR to the front of the code path in the invoked Erlang emulator\&. This can be used to invoke another compiler than the default one\&. -.TP 4 -.B --pz \fIdirectory\fR: -Appends \fIdirectory\fR to the code path in the invoked Erlang emulator\&. -.RE -.SH SUPPORTED COMPILERS -.RS 2 -.TP 4 -.B -\&.erl: -Erlang source code\&. It generates a \fI\&.beam\fR file\&. -.RS 4 -.LP - -.LP -The options -P, -E, and -S are equivalent to +\&'P\&', +\&'E\&', and +\&'S\&', except that it is not necessary to include the single quotes to protect them from the shell\&. -.LP - -.LP -Supported options: -I, -o, -D, -v, -W, -b\&. -.RE -.TP 4 -.B -\&.yrl: -Yecc source code\&. It generates an \fI\&.erl\fR file\&. -.RS 4 -.LP - -.LP -Use the -I option with the name of a file to use that file as a customized prologue file (the \fIincludefile\fR option)\&. -.LP - -.LP -Supported options: -o, -v, -I, -W (see above)\&. -.RE -.TP 4 -.B -\&.mib: -MIB for SNMP\&. It generates a \fI\&.bin\fR file\&. -.RS 4 -.LP - -.LP -Supported options: -I, -o, -W\&. -.RE -.TP 4 -.B -\&.bin: -A compiled MIB for SNMP\&. It generates a \fI\&.hrl\fR file\&. -.RS 4 -.LP - -.LP -Supported options: -o, -v\&. -.RE -.TP 4 -.B -\&.rel: -Script file\&. It generates a boot file\&. -.RS 4 -.LP - -.LP -Use the -I to name directories to be searched for application files (equivalent to the \fIpath\fR in the option list for \fIsystools:make_script/2\fR)\&. -.LP - -.LP -Supported options: -o\&. -.RE -.TP 4 -.B -\&.asn1: -ASN1 file\&. -.RS 4 -.LP - -.LP -Creates an \fI\&.erl\fR, \fI\&.hrl\fR, and \fI\&.asn1db\fR file from an \fI\&.asn1\fR file\&. Also compiles the \fI\&.erl\fR using the Erlang compiler unless the \fI+noobj\fR options is given\&. -.LP - -.LP -Supported options: -I, -o, -b, -W\&. -.RE -.TP 4 -.B -\&.idl: -IC file\&. -.RS 4 -.LP - -.LP -Runs the IDL compiler\&. -.LP - -.LP -Supported options: -I, -o\&. -.RE -.RE -.SH ENVIRONMENT VARIABLES -.RS 2 -.TP 4 -.B -ERLC_EMULATOR: -The command for starting the emulator\&. Default is \fIerl\fR in the same directory as the \fIerlc\fR program itself, or if it doesn\&'t exist, \fIerl\fR in any of the directories given in the \fIPATH\fR environment variable\&. -.RE -.SH SEE ALSO -.LP -erl(1), compile(3erl), yecc(3erl), snmp(3erl) diff -Nru erlang-13.b.1-dfsg/debian/manpages/erl_call.1 erlang-13.b.3-dfsg/debian/manpages/erl_call.1 --- erlang-13.b.1-dfsg/debian/manpages/erl_call.1 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/manpages/erl_call.1 1970-01-01 01:00:00.000000000 +0100 @@ -1,237 +0,0 @@ -.TH erl_call 1 "erl_interface 3.6.2" "Ericsson AB" "USER COMMANDS" -.SH NAME -erl_call \- Call/Start a Distributed Erlang Node -.SH DESCRIPTION -.LP -\fIerl_call\fR makes it possible to start and/or communicate with a distributed Erlang node\&. It is built upon the \fIerl_interface\fR library as an example application\&. Its purpose is to use an Unix shell script to interact with a distributed Erlang node\&. It performs all communication with the Erlang \fIrex server\fR, using the standard Erlang RPC facility\&. It does not require any special software to be run at the Erlang target node\&. -.LP -The main use is to either start a distributed Erlang node or to make an ordinary function call\&. However, it is also possible to pipe an Erlang module to \fIerl_call\fR and have it compiled, or to pipe a sequence of Erlang expressions to be evaluated (similar to the Erlang shell)\&. -.LP -Options, which cause \fIstdin\fR to be read, can be used with advantage as scripts from within (Unix) shell scripts\&. Another nice use of \fIerl_call\fR could be from (http) CGI-bin scripts\&. - -.SH EXPORTS -.LP -.B -erl_call -.br -.RS -.LP -Each option flag is described below with its name, type and meaning\&. -.RS 2 -.TP 4 -.B --a [Mod [Fun [Args]]]]: -(\fIoptional\fR): Applies the specified function and returns the result\&. \fIMod\fR must be specified, however \fI[]\fR is assumed for unspecified \fIFun\fR and \fIArgs\fR\&. \fIArgs\fR should be in the same format as for \fIerlang:apply/3\fR\&. Note that this flag takes exactly one argument, so quoting may be necessary in order to group \fIMod\fR, \fIFun\fR and \fIArgs\fR, in a manner dependent on the behavior of your command shell\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --c Cookie: -(\fIoptional\fR): Use this option to specify a certain cookie\&. If no cookie is specified, the \fI~/\&.erlang\&.cookie\fR file is read and its content are used as cookie\&. The Erlang node we want to communicate with must have the same cookie\&. -.TP 4 -.B --d: -(\fIoptional\fR): Debug mode\&. This causes all IO to be output to the file \fI~/\&.erl_call\&.out\&.Nodename\fR, where \fINodename\fR is the node name of the Erlang node in question\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --e: -(\fIoptional\fR): Reads a sequence of Erlang expressions, separated by \&'\fI,\fR\&' and ended with a \&'\fI\&.\fR\&', from \fIstdin\fR until EOF (Control-D)\&. Evaluates the expressions and returns the result from the last expression\&. Returns \fI{ok, Result}\fR if successful\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --h HiddenName: -(\fIoptional\fR): Specifies the name of the hidden node that \fIerl_call\fR represents\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --m: -(\fIoptional\fR): Reads an Erlang module from \fIstdin\fR and compiles it\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --n Node: -(one of \fI-n, -name, -sname\fR is required): Has the same meaning as \fI-name\fR and can still be used for backwards compatibility reasons\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --name Node: -(one of \fI-n, -name, -sname\fR is required): \fINode\fR is the name of the node to be started or communicated with\&. It is assumed that \fINode\fR is started with \fIerl -name\fR, which means that fully qualified long node names are used\&. If the \fI-s\fR option is given, an Erlang node will (if necessary) be started with \fIerl -name\fR\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --q: -(\fIoptional\fR): Halts the Erlang node specified with the -n switch\&. This switch overrides the -s switch\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --r: -(\fIoptional\fR): Generates a random name of the hidden node that \fIerl_call\fR represents\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --s: -(\fIoptional\fR): Starts a distributed Erlang node if necessary\&. This means that in a sequence of calls, where the \&'\fI-s\fR\&' and \&'\fI-n Node\fR\&' are constant, only the first call will start the Erlang node\&. This makes the rest of the communication very fast\&. This flag is currently only available on the Unix platform\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --sname Node: -(one of \fI-n, -name, -sname\fR is required): \fINode\fR is the name of the node to be started or communicated with\&. It is assumed that \fINode\fR is started with \fIerl -sname\fR which means that short node names are used\&. If \fI-s\fR option is given, an Erlang node will be started (if necessary) with \fIerl -sname\fR\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --v: -(\fIoptional\fR): Prints a lot of \fIverbose\fR information\&. This is only useful for the developer and maintainer of \fIerl_call\fR\&. -.RS 4 -.LP - -.LP - -.RE -.TP 4 -.B --x ErlScript: -(\fIoptional\fR): Specifies another name of the Erlang start-up script to be used\&. If not specified, the standard \fIerl\fR start-up script is used\&. -.RE -.RE -.SH EXAMPLES -.LP -Starts an Erlang node and calls \fIerlang:time/0\fR\&. - -.nf -erl_call -s -a \&'erlang time\&' -n madonna -{18,27,34} - -.fi -.LP -Terminates an Erlang node by calling \fIerlang:halt/0\fR\&. - -.nf -erl_call -s -a \&'erlang halt\&' -n madonna - -.fi -.LP -An apply with several arguments\&. - -.nf -erl_call -s -a \&'lists map [{math,sqrt},[1,4,9,16,25]]\&' -n madonna - -.fi -.LP -Evaluates a couple of expressions\&. The input ends with EOF (Control-D)\&. - -.nf -erl_call -s -e -n madonna -statistics(runtime), -X=1, -Y=2, -{_,T}=statistics(runtime), -{X+Y,T}\&. -^D -{ok,{3,0}} - -.fi -.LP -Compiles a module and runs it\&. Again, the input ends with EOF (Control-D)\&. (In the example shown, the output has been formatted afterwards)\&. - -.nf -erl_call -s -m -a lolita -n madonna --module(lolita)\&. --compile(export_all)\&. -start() -> - P = processes(), - F = fun(X) -> {X,process_info(X,registered_name)} end, - lists:map(F,[],P)\&. -^D -[{, - {registered_name,init}}, - {, - {registered_name,erl_prim_loader}}, - {, - {registered_name,error_logger}}, - {, - {registered_name,application_controller}}, - {, - {registered_name,kernel}}, - {, - []}, - {, - {registered_name,kernel_sup}}, - {, - {registered_name,net_sup}}, - {, - {registered_name,net_kernel}}, - {, - []}, - {, - {registered_name,global_name_server}}, - {, - {registered_name,auth}}, - {, - {registered_name,rex}}, - {, - []}, - {, - {registered_name,file_server}}, - {, - {registered_name,code_server}}, - {, - {registered_name,user}}, - {, - []}] - -.fi diff -Nru erlang-13.b.1-dfsg/debian/manpages/escript.1 erlang-13.b.3-dfsg/debian/manpages/escript.1 --- erlang-13.b.1-dfsg/debian/manpages/escript.1 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/manpages/escript.1 1970-01-01 01:00:00.000000000 +0100 @@ -1,132 +0,0 @@ -.TH escript 1 "erts 5.7.2" "Ericsson AB" "USER COMMANDS" -.SH NAME -escript \- Erlang scripting support -.SH DESCRIPTION -.LP -\fIescript\fR provides support for running short Erlang programs without having to compile them first and an easy way to retrieve the command line arguments\&. - -.SH EXPORTS -.LP -.B -script-name script-arg1 script-arg2\&.\&.\&. -.br -.B -escript escript-flags script-name script-arg1 script-arg2\&.\&.\&. -.br -.RS -.LP -\fIescript\fR runs a script written in Erlang\&. -.LP -Here follows an example\&. - -.nf -$ cat factorial - -#!/usr/bin/env escript -%% -*- erlang -*- -%%! -smp enable -sname factorial -mnesia debug verbose -main([String]) -> - try - N = list_to_integer(String), - F = fac(N), - io:format("factorial ~w = ~w\en", [N,F]) - catch - _:_ -> - usage() - end; -main(_) -> - usage()\&. - -usage() -> - io:format("usage: factorial integer\en"), - halt(1)\&. - -fac(0) -> 1; -fac(N) -> N * fac(N-1)\&. -$ factorial 5 - -factorial 5 = 120 -$ factorial - -usage: factorial integer -$ factorial five - -usage: factorial integer -.fi -.LP -The header of an Erlang script differs from a normal Erlang module\&. The first line is intended to be the interpreter line, which invokes \fIescript\fR\&. However if you invoke \fIescript\fR like this - -.nf -$ escript factorial 5 - -.fi -.LP -the contents of the first line does not matter, but it cannot contain Erlang code as it will be \fIignored\fR\&. -.LP -The second line in the example, contains an optional directive to the \fIEmacs\fR editor which causes it to enter the major mode for editing Erlang source files\&. If the directive is present it must be located on the second line\&. -.LP -On the third line (or second line depending on the presence of the Emacs directive), it is possible to give arguments to the emulator, such as - -.nf -%%! -smp enable -sname factorial -mnesia debug verbose -.fi -.LP -Such an argument line must start with \fI%%!\fR and the rest of the line will interpreted as arguments to the emulator\&. -.LP -If you know the location of the \fIescript\fR executable, the first line can directly give the path to \fIescript\fR\&. For instance: - -.nf -#!/usr/bin/escript -.fi -.LP -As any other kind of scripts, Erlang scripts will not work on Unix platforms if the execution bit for the script file is not set\&. (Use \fIchmod +x script-name\fR to turn on the execution bit\&.) -.LP -The rest of the Erlang script file may either contain Erlang source code, an inlined \fIbeam\fR file or an inlined archive file\&. -.LP -An Erlang script file must always contain the function \fImain/1\fR\&. When the script is run, the \fImain/1\fR will be called with a list of strings representing the arguments given to the script (not changed or interpreted in any way)\&. -.LP -If the \fImain/1\fR function in the script returns successfully, the exit status for the script will be 0\&. If an exception is generated during execution, a short message will be printed and the script terminated with exit status 127\&. -.LP -To return your own non-zero exit code, call \fIhalt(ExitCode)\fR; for instance: - -.nf -halt(1)\&. -.fi -.LP -Call \fIescript:script_name/0\fR from your to script to retrieve the pathname of the script (the pathname is usually, but not always, absolute)\&. -.LP -If the file contains source code (as in the example above), it will be processed by the preprocessor \fIepp\fR\&. This means that you for example may use pre-defined macros (such as \fI?MODULE\fR) as well as include directives like the \fI-include_lib\fR directive\&. For instance, use - -.nf --include_lib("kernel/include/file\&.hrl")\&. -.fi -.LP -to include the record definitions for the records used by the \fIfile:read_file_info/1\fR function\&. -.LP -The script will be checked for syntactic and semantic correctness before being run\&. If there are warnings (such as unused variables), they will be printed and the script will still be run\&. If there are errors, they will be printed and the script will not be run and its exit status will be 127\&. -.LP -Both the module declaration and the export declaration of the \fImain/1\fR function are optional\&. -.LP -By default, the script will be interpreted\&. You can force it to be compiled by including the following line somewhere in the script file: - -.nf --mode(compile)\&. -.fi -.LP -Execution of interpreted code is slower than compiled code\&. If much of the execution takes place in interpreted code it may be worthwile to compile it, even though the compilation itself will take a little while\&. -.LP -As mentioned earlier, it is possible to have a script which contains precompiled \fIbeam\fR code\&. In a precompiled script, the interpretation of the script header is exactly the same as in a script containing source code\&. That means that you can make a \fIbeam\fR file executable by prepending the file with the lines starting with \fI#!\fR and \fI%%!\fR mentioned above\&. In a precompiled script, the function \fImain/1\fR must be exported\&. -.LP -As yet another option it is possible to have an entire Erlang archive in the script\&. In a archive script, the interpretation of the script header is exactly the same as in a script containing source code\&. That means that you can make an archive file executable by prepending the file with the lines starting with \fI#!\fR and \fI%%!\fR mentioned above\&. In an archive script, the function \fImain/1\fR must be exported\&. By default the \fImain/1\fR function in the module with the same name as the basename of the \fIescript\fR file will be invoked\&. This behavior can be overridden by setting the flag \fI-escript main Module\fR as one of the emulator flags\&. The \fIModule\fR must be the name of a module which has an exported \fImain/1\fR function\&. See code(3erl) for more information about archives and code loading\&. -.SS Warning: -.LP -The support for loading of code from archive files is experimental\&. The sole purpose of releasing it before it is ready is to obtain early feedback\&. The file format, semantics, interfaces etc\&. may be changed in a future release\&. The flag \fI-escript\fR is also experimental\&. - -.RE -.SH OPTIONS ACCEPTED BY ESCRIPT -.RS 2 -.TP 4 -.B --s: -Only perform a syntactic and semantic check of the script file\&. Warnings and errors (if any) are written to the standard output, but the script will not be run\&. The exit status will be 0 if there were no errors, and 127 otherwise\&. -.RE diff -Nru erlang-13.b.1-dfsg/debian/manpages/run_erl.1 erlang-13.b.3-dfsg/debian/manpages/run_erl.1 --- erlang-13.b.1-dfsg/debian/manpages/run_erl.1 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/manpages/run_erl.1 1970-01-01 01:00:00.000000000 +0100 @@ -1,85 +0,0 @@ -.TH run_erl 1 "erts 5.7.2" "Ericsson AB" "USER COMMANDS" -.SH NAME -run_erl \- Redirect Erlang input and output streams on Solaris(R) -.SH DESCRIPTION -.LP -This describes the \fIrun_erl\fR program specific to Solaris/Linux\&. This program redirect the standard input and standard output streams so that all output can be logged\&. It also let the program \fIto_erl\fR connect to the Erlang console making it possible to monitor and debug an embedded system remotely\&. -.LP -You can read more about the use in the \fIEmbedded System User\&'s Guide\fR\&. - -.SH EXPORTS -.LP -.B -run_erl [-daemon] pipe_dir/ log_dir "exec command [command_arguments]" -.br -.RS -.LP -The \fIrun_erl\fR program arguments are: -.RS 2 -.TP 4 -.B --daemon: -This option is highly recommended\&. It makes run_erl run in the background completely detached from any controlling terminal and the command returns to the caller immediately\&. Without this option, run_erl must be started using several tricks in the shell to detach it completely from the terminal in use when starting it\&. The option must be the first argument to run_erl on the command line\&. -.TP 4 -.B -pipe_dir: -This is where to put the named pipe, usually \fI/tmp/\fR\&. It shall be suffixed by a \fI/\fR (slash), i\&.e\&. not \fI/tmp/epipies\fR, but \fI/tmp/epipes/\fR\&. -.TP 4 -.B -log_dir: -This is where the log files are written\&. There will be one log file, \fIrun_erl\&.log\fR that log progress and warnings from the \fIrun_erl\fR program itself and there will be up to five log files at maximum 100KB each (both number of logs and sizes can be changed by environment variables, see below) with the content of the standard streams from and to the command\&. When the logs are full \fIrun_erl\fR will delete and reuse the oldest log file\&. -.TP 4 -.B -"exec command [command_arguments]": -In the third argument \fIcommand\fR is the to execute where everything written to stdin and stdout is logged to \fIlog_dir\fR\&. -.RE -.RE -.SH NOTES CONCERNING THE LOG FILES -.LP -While running, run_erl (as stated earlier) sends all output, uninterpreted, to a log file\&. The file is called \fIerlang\&.log\&.N\fR, where N is a number\&. When the log is "full", default after 100KB, run_erl starts to log in file \fIerlang\&.log\&.(N+1)\fR, until N reaches a certain number (default 5), where after N starts at 1 again and the oldest files start getting overwritten\&. If no output comes from the erlang shell, but the erlang machine still seems to be alive, an "ALIVE" message is written to the log, it is a timestamp and is written, by default, after 15 minutes of inactivity\&. Also, if output from erlang is logged but it\&'s been more than 5 minutes (default) since last time we got anything from erlang, a timestamp is written in the log\&. The "ALIVE" messages look like this: - -.nf - ===== ALIVE - -.fi -.LP -while the other timestamps look like this: - -.nf - ===== - -.fi -.LP -The \fIdate-time-string\fR is the date and time the message is written, default in local time (can be changed to GMT if one wants to) and is formatted with the ANSI-C function \fIstrftime\fR using the format string \fI%a %b %e %T %Z %Y\fR, which produces messages on the line of \fI===== ALIVE Thu May 15 10:13:36 MEST 2003\fR, this can be changed, see below\&. -.SH ENVIRONMENT VARIABLES -.LP -The following environment variables are recognized by run_erl and change the logging behavior\&. Also see the notes above to get more info on how the log behaves\&. -.RS 2 -.TP 4 -.B -RUN_ERL_LOG_ALIVE_MINUTES: -How long to wait for output (in minutes) before writing an "ALIVE" message to the log\&. Default is 15, can never be less than 1\&. -.TP 4 -.B -RUN_ERL_LOG_ACTIVITY_MINUTES: -How long erlang need to be inactive before output will be preceded with a timestamp\&. Default is RUN_ERL_LOG_ALIVE_MINUTES div 3, but never less than 1\&. -.TP 4 -.B -RUN_ERL_LOG_ALIVE_FORMAT: -Specifies another format string to be used in the strftime C library call\&. i\&.e specifying this to \fI"%e-%b-%Y, %T %Z"\fR will give log messages with timestamps looking like \fI15-May-2003, 10:23:04 MET\fR etc\&. See the documentation for the C library function strftime for more information\&. Default is \fI"%a %b %e %T %Z %Y"\fR\&. -.TP 4 -.B -RUN_ERL_LOG_ALIVE_IN_UTC: -If set to anything else than "0", it will make all times displayed by run_erl to be in UTC (GMT,CET,MET, without DST), rather than in local time\&. This does not affect data coming from erlang, only the logs output directly by run_erl\&. The application \fIsasl\fR can be modified accordingly by setting the erlang application variable \fIutc_log\fR to \fItrue\fR\&. -.TP 4 -.B -RUN_ERL_LOG_GENERATIONS: -Controls the number of log files written before older files are being reused\&. Default is 5, minimum is 2, maximum is 1000\&. -.TP 4 -.B -RUN_ERL_LOG_MAXSIZE: -The size (in bytes) of a log file before switching to a new log file\&. Default is 100000, minimum is 1000 and maximum is approximately 2^30\&. -.RE -.SH SEE ALSO -.LP -start_embedded(1) diff -Nru erlang-13.b.1-dfsg/debian/manpages/start_embedded.1 erlang-13.b.3-dfsg/debian/manpages/start_embedded.1 --- erlang-13.b.1-dfsg/debian/manpages/start_embedded.1 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/manpages/start_embedded.1 1970-01-01 01:00:00.000000000 +0100 @@ -1,29 +0,0 @@ -.TH start_embedded 1 "erts 5.7.2" "Ericsson AB" "USER COMMANDS" -.SH NAME -start_embedded \- OTP start script example for Unix -.SH DESCRIPTION -.LP -This describes the \fIstart\fR script that is an example script on how to startup the Erlang system in embedded mode on Unix\&. -.LP -You can read more about the use in the \fIEmbedded System User\&'s Guide\fR\&. - -.SH EXPORTS -.LP -.B -start [ data_file ] -.br -.RS -.LP -In the example there is one argument -.RS 2 -.TP 4 -.B -data_file: -Optional, specifies what \fIstart_erl\&.data\fR file to use\&. -.RE -.LP -There is also an environment variable \fIRELDIR\fR that can be set prior to calling this example that set the directory where to find the release files\&. -.RE -.SH SEE ALSO -.LP -run_erl(1) diff -Nru erlang-13.b.1-dfsg/debian/manpages/start_webtool.1 erlang-13.b.3-dfsg/debian/manpages/start_webtool.1 --- erlang-13.b.1-dfsg/debian/manpages/start_webtool.1 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/manpages/start_webtool.1 1970-01-01 01:00:00.000000000 +0100 @@ -1,70 +0,0 @@ -.TH start_webtool 1 "webtool 0.8.4" "Ericsson AB" "USER COMMANDS" -.SH NAME -start_webtool \- WebTool Start Script -.SH DESCRIPTION -.LP -The \fIstart_webtool\fR script starts WebTool, a WebTool application and a web browser pointing to this application\&. - -.SH EXPORTS -.LP -.B -start_webtool application [ browser ] -.br -.RS -.LP -Starts WebTool, the given WebTool Application and a web browser pointing to this application\&. -.LP -If no argument is given, a list of available applications is displayed, e\&.g\&. - -.nf ->start_webtool -Starting webtool\&.\&.\&. -WebTool is available at http://localhost:8888/ -Or http://127\&.0\&.0\&.1:8888/ - -Usage: start_webtool application [ browser ] - -Available applications are: [orber,appmon,crashdump_viewer,webcover] -Default browser is \&'iexplore\&' (Internet Explorer) on Windows or else \&'netscape\&' -.fi -.LP -To start any of the listed applications, give the application name as the first argument, e\&.g\&. - -.nf ->start_webtool webcover -Starting webtool\&.\&.\&. -WebTool is available at http://localhost:8888/ -Or http://127\&.0\&.0\&.1:8888/ -Starting webcover\&.\&.\&. -Sending URL to netscape\&.\&.\&.done -.fi -.LP -The WebTool application WebCover is then started and the default browser is used\&. The default broser is Internet Explorer on Windows or else Netscape\&. -.LP -To use another browser, give the browser\&'s start command as the second argument, e\&.g\&. - -.nf ->start_webtool webcover mozilla -Starting webtool\&.\&.\&. -WebTool is available at http://localhost:8888/ -Or http://127\&.0\&.0\&.1:8888/ -Starting webcover\&.\&.\&. -Sending URL to mozilla\&.\&.\&.done -.fi -.LP -If the given browser name is not known to WebTool, WebTool will run it as a command with the start URL as the only argument, e\&.g\&. - -.nf ->start_webtool webcover mybrowser -Starting webtool\&.\&.\&. -WebTool is available at http://localhost:8888/ -Or http://127\&.0\&.0\&.1:8888/ -Starting webcover\&.\&.\&. -Starting mybrowser\&.\&.\&. -.fi -.LP -Here the command \fI"mybrowser http://localhost:8888/webcover"\fR is executed\&. -.RE -.SH SEE ALSO -.LP -webtool(3erl) diff -Nru erlang-13.b.1-dfsg/debian/manpages/typer.1 erlang-13.b.3-dfsg/debian/manpages/typer.1 --- erlang-13.b.1-dfsg/debian/manpages/typer.1 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/manpages/typer.1 2009-12-22 04:36:22.000000000 +0000 @@ -1,4 +1,4 @@ -.TH typer 1 "typer 0.1.7.1" "Ericsson AB" "USER COMMANDS" +.TH typer 1 "typer 0.1.7.3" "Ericsson AB" "USER COMMANDS" .SH NAME typer \- The TypEr, a Type annotator of Erlang code .SH DESCRIPTION @@ -45,7 +45,7 @@ .TP 4 .B \fI--plt PltFile\fR -Uses the specified Dialyzer plt file rather than the default one. +Uses the specified Dialyzer PLT file rather than the default one. .TP 4 .B \fI-T file\fR diff -Nru erlang-13.b.1-dfsg/debian/patches/build-options.patch erlang-13.b.3-dfsg/debian/patches/build-options.patch --- erlang-13.b.1-dfsg/debian/patches/build-options.patch 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patches/build-options.patch 2009-12-22 04:36:22.000000000 +0000 @@ -1,12 +1,65 @@ build-options.patch by James Henstridge +and Sergei Golovan Set ERL_COMPILE_FLAGS based on DEB_BUILD_OPTIONS instead of hard coding it based on the platform. By default, we'll generate compressed stripped BEAM files. ---- erlang-13.b.1-dfsg.orig/make/otp.mk.in -+++ erlang-13.b.1-dfsg/make/otp.mk.in -@@ -54,19 +54,15 @@ +Also, add debug info to VM binaries if DEB_BUILD_OPTIONS contains "debug". + +--- erlang-13.b.3-dfsg.orig/Makefile.in ++++ erlang-13.b.3-dfsg/Makefile.in +@@ -16,6 +16,9 @@ + # + # %CopyrightEnd% + ++ifeq ($(TYPE),debug) ++TYPEMARKER = .debug ++endif + # Toplevel makefile for building the Erlang system + # + +--- erlang-13.b.3-dfsg.orig/erts/etc/common/Makefile.in ++++ erlang-13.b.3-dfsg/erts/etc/common/Makefile.in +@@ -494,13 +494,13 @@ + + Install: ../unix/Install.src ../../vsn.mk $(TARGET)/Makefile + sed -e 's;%I_VSN%;$(VSN);' \ +- -e 's;%EMULATOR%;$(EMULATOR);' \ ++ -e 's;%EMULATOR%;$(EMULATOR)$(TYPEMARKER);' \ + -e 's;%EMULATOR_NUMBER%;$(EMULATOR_NUMBER);' \ + -e 's;%I_SYSTEM_VSN%;$(SYSTEM_VSN);' \ + ../unix/Install.src > Install + + erl.src: ../unix/erl.src.src ../../vsn.mk $(TARGET)/Makefile +- sed -e 's;%EMULATOR%;$(EMULATOR);' \ ++ sed -e 's;%EMULATOR%;$(EMULATOR)$(TYPEMARKER);' \ + -e 's;%EMULATOR_NUMBER%;$(EMULATOR_NUMBER);' \ + -e 's;%VSN%;$(VSN);' \ + ../unix/erl.src.src > erl.src +--- erlang-13.b.3-dfsg.orig/erts/emulator/Makefile.in ++++ erlang-13.b.3-dfsg/erts/emulator/Makefile.in +@@ -258,7 +258,7 @@ + CS_CFLAGS = $(CS_CFLAGS_) + endif + CS_LDFLAGS = $(LDFLAGS) +-CS_LIBS = -L../lib/internal/$(TARGET) -lerts_internal @ERTS_INTERNAL_X_LIBS@ ++CS_LIBS = -L../lib/internal/$(TARGET) -lerts_internal$(TYPEMARKER) @ERTS_INTERNAL_X_LIBS@ + + LIBS += @TERMCAP_LIB@ -L../lib/internal/$(TARGET) @ERTS_INTERNAL_X_LIBS@ + +@@ -284,7 +284,7 @@ + LIBS += $(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE)/libepcre.a + DEPLIBS += \ + $(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE)/libepcre.a \ +- $(ERL_TOP)/erts/lib/internal/$(TARGET)/liberts_internal.a ++ $(ERL_TOP)/erts/lib/internal/$(TARGET)/liberts_internal$(TYPEMARKER).a + # rem liberts_internal.a + endif + +--- erlang-13.b.3-dfsg.orig/make/otp.mk.in ++++ erlang-13.b.3-dfsg/make/otp.mk.in +@@ -71,18 +71,17 @@ # Erlang language section # ---------------------------------------------------- EMULATOR = beam @@ -19,18 +72,17 @@ else - ifeq ($(findstring ose_ppc750,$(TARGET)),ose_ppc750) - ERL_COMPILE_FLAGS += +compressed -- else -- ifdef BOOTSTRAP -- ERL_COMPILE_FLAGS += +slim -- else -- ERL_COMPILE_FLAGS += +debug_info -- endif + ERL_COMPILE_FLAGS += +compressed + ifeq ($(findstring debug,$(DEB_BUILD_OPTIONS)),debug) + ERL_COMPILE_FLAGS += +debug_info -+ endif -+ ifneq ($(findstring nostrip,$(DEB_BUILD_OPTIONS)),nostrip) -+ ERL_COMPILE_FLAGS += +slim + else +- ifdef BOOTSTRAP +- ERL_COMPILE_FLAGS += +slim +- else ++ ifeq ($(findstring nostrip,$(DEB_BUILD_OPTIONS)),nostrip) + ERL_COMPILE_FLAGS += +debug_info ++ else ++ ERL_COMPILE_FLAGS += +slim + endif endif endif - ERLC_WFLAGS = -W diff -Nru erlang-13.b.1-dfsg/debian/patches/clean.patch erlang-13.b.3-dfsg/debian/patches/clean.patch --- erlang-13.b.1-dfsg/debian/patches/clean.patch 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patches/clean.patch 2009-12-22 04:36:22.000000000 +0000 @@ -3,9 +3,9 @@ Erlang leaves many files after make clean. This patch contains a hack to remove them. ---- erlang-13.b.1-dfsg.orig/Makefile.in -+++ erlang-13.b.1-dfsg/Makefile.in -@@ -837,6 +837,7 @@ +--- erlang-13.b.3-dfsg.orig/Makefile.in ++++ erlang-13.b.3-dfsg/Makefile.in +@@ -777,6 +777,7 @@ cd erts && ERL_TOP=$(ERL_TOP) $(MAKE) clean cd lib && ERL_TOP=$(ERL_TOP) $(MAKE) clean BUILD_ALL=true cd lib/dialyzer && ERL_TOP=$(ERL_TOP) $(MAKE) clean @@ -13,7 +13,7 @@ # # Just wipe out emulator, not libraries -@@ -871,3 +872,166 @@ +@@ -811,3 +812,171 @@ || $(MAKE) BOOTSTRAP_ROOT=$(BOOTSTRAP_ROOT) bootstrap_root_clean # ---------------------------------------------------------------------- @@ -97,6 +97,8 @@ + rm -rf $(ERL_TOP)/lib/erl_interface/obj.mt/$(TARGET) + rm -rf $(ERL_TOP)/lib/erl_interface/obj.st/$(TARGET) + rm -rf $(ERL_TOP)/lib/erl_interface/src/$(TARGET) ++ rm -rf $(ERL_TOP)/lib/eunit/doc/src/eunit_surefire.xml ++ rm -rf $(ERL_TOP)/lib/eunit/doc/src/eunit.xml + rm -rf $(ERL_TOP)/lib/gs/config.log + rm -rf $(ERL_TOP)/lib/gs/config.status + rm -rf $(ERL_TOP)/lib/gs/tcl/$(TARGET) @@ -111,6 +113,7 @@ + rm -rf $(ERL_TOP)/lib/kernel/ebin/*.beam + rm -rf $(ERL_TOP)/lib/kernel/ebin/*.app + rm -rf $(ERL_TOP)/lib/kernel/ebin/*.appup ++ rm -rf $(ERL_TOP)/lib/kernel/src/inet_dns_record_adts.hrl + rm -rf $(ERL_TOP)/lib/megaco/config.log + rm -rf $(ERL_TOP)/lib/megaco/config.status + rm -rf $(ERL_TOP)/lib/megaco/priv/lib/$(TARGET) @@ -140,6 +143,7 @@ + rm -rf $(ERL_TOP)/lib/orber/src/PKIX1Implicit88.asn1db + rm -rf $(ERL_TOP)/lib/orber/src/PKIXAttributeCertificate.asn1db + rm -rf $(ERL_TOP)/lib/os_mon/c_src/$(TARGET) ++ rm -rf $(ERL_TOP)/lib/os_mon/doc/man6/os_mon.6 + rm -rf $(ERL_TOP)/lib/os_mon/priv/bin/$(TARGET) + rm -rf $(ERL_TOP)/lib/os_mon/priv/obj/$(TARGET) + rm -rf $(ERL_TOP)/lib/otp_mibs/ebin/otp_mib.beam @@ -153,6 +157,7 @@ + rm -rf $(ERL_TOP)/lib/snmp/config.status + rm -rf $(ERL_TOP)/lib/snmp/mibs/Makefile + rm -rf $(ERL_TOP)/lib/ssl/c_src/$(TARGET) ++ rm -rf $(ERL_TOP)/lib/ssl/doc/man6/ssl.6 + rm -rf $(ERL_TOP)/lib/ssl/examples/certs/$(TARGET) + rm -rf $(ERL_TOP)/lib/ssl/pkix/OTP-PKIX.asn1db + rm -rf $(ERL_TOP)/lib/ssl/priv/bin/$(TARGET) diff -Nru erlang-13.b.1-dfsg/debian/patches/docs.patch erlang-13.b.3-dfsg/debian/patches/docs.patch --- erlang-13.b.1-dfsg/debian/patches/docs.patch 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/patches/docs.patch 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1,126 @@ +Patch by sergei Golovan fixes several bugs with . and ' at the +beginning of a line in Erlang manpages. It simply escapes all dots +and apostrophes by adding \& before them. Also, it fixes whatis entries +for module and application definitions. + +--- erlang-13.b.3-dfsg.orig/lib/erl_docgen/priv/xsl/db_man.xsl ++++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_man.xsl +@@ -192,7 +192,7 @@ + + + .TH 3 " " "Ericsson AB" "Erlang Module Definition" +- .SH MODULE ++ .SH NAME + \- + + +@@ -225,7 +225,7 @@ + + .TH 6 " " "Ericsson AB" "Erlang Application Definition" + .SH NAME +- \- ++ \- + + + +@@ -268,7 +268,7 @@ + .TP + Types + +- .RE ++ .RE + + + +@@ -288,7 +288,7 @@ + + .RS + +- .RE ++ .RE + + + +@@ -305,4 +305,60 @@ + + + ++ ++ ++ .SH AUTHORS ++ ++ ++ ++ ++ ++ .LP ++ ++ ++ ++ ++ ++ .I < ++ ++ > ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +--- erlang-13.b.3-dfsg.orig/lib/stdlib/doc/src/re.xml ++++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/re.xml +@@ -349,7 +349,7 @@ + metacharacter should not match before it. Setting this without + multiline (at compile time) causes circumflex never to + match. This option affects only the behavior of the circumflex +- metacharacter. It does not affect \A. ++ metacharacter. It does not affect \\A. + + noteol + +@@ -358,8 +358,8 @@ + match it nor (except in multiline mode) a newline immediately + before it. Setting this without multiline (at compile time) + causes dollar never to match. This option affects only the +- behavior of the dollar metacharacter. It does not affect \Z or +- \z. ++ behavior of the dollar metacharacter. It does not affect \\Z or ++ \\z. + + {offset, int()} + diff -Nru erlang-13.b.1-dfsg/debian/patches/emacs.patch erlang-13.b.3-dfsg/debian/patches/emacs.patch --- erlang-13.b.1-dfsg/debian/patches/emacs.patch 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patches/emacs.patch 2009-12-22 04:36:22.000000000 +0000 @@ -1,36 +1,9 @@ -emacs.patch by Sergei Golovan - -(1) Fixes bug with clause arrow syntax highlighting -(see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=413052). - -(2) Fixes (partially) $' and $" patterns syntax highlighting. - -(3) Adds support of compressed manual pages search. - -(4) Patch by Balint Reczey fixes backquote +Patch by Balint Reczey fixes backquote syntax (see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=494823). ---- erlang-13.b.1-dfsg.orig/lib/tools/emacs/erlang.el -+++ erlang-13.b.1-dfsg/lib/tools/emacs/erlang.el -@@ -474,7 +474,7 @@ - Should the flag the nil, the directory is absolute, should it be non-nil - the directory is relative to the variable `erlang-root-dir'.") - --(defvar erlang-man-max-menu-size 20 -+(defvar erlang-man-max-menu-size 35 - "*The maximum number of menu items in one menu allowed.") - - (defvar erlang-man-display-function 'erlang-man-display -@@ -1839,7 +1839,7 @@ - - (defvar erlang-font-lock-keywords-arrow - (list -- (list "\\(->\\|:-\\)\\(\\s \\|$\\)" 2 'font-lock-function-name-face)) -+ (list "\\(->\\|:-\\)\\(\\s \\|$\\)" 1 'font-lock-function-name-face)) - "Font lock keyword highlighting clause arrow.") - - (defvar erlang-font-lock-keywords-lc -@@ -2058,27 +2058,23 @@ +--- erlang-13.b.3-dfsg.orig/lib/tools/emacs/erlang.el ++++ erlang-13.b.3-dfsg/lib/tools/emacs/erlang.el +@@ -2367,23 +2367,22 @@ (or (fboundp 'eval-when-compile) (defmacro eval-when-compile (&rest rest) nil)) @@ -41,70 +14,20 @@ (or (fboundp 'unless) (defmacro unless (condition &rest body) "(unless CONDITION BODY...): If CONDITION is false, do BODY, else return nil." -- (` (if (, condition) -- nil -- (,@ body))))) +- `((if (, condition) nil ,@body)))) + (cons 'if (cons condition (cons nil body))))) (or (fboundp 'when) (defmacro when (condition &rest body) "(when CONDITION BODY...): If CONDITION is true, do BODY, else return nil." -- (` (if (, condition) -- (progn (,@ body)) -- nil)))) +- `((if (, condition) (progn ,@body) nil)))) + (list 'if condition (cons 'progn body) nil))) -+ (or (fboundp 'char-before) (defmacro char-before (&optional pos) "Return the character in the current buffer just before POS." -- (` (char-after (1- (or (, pos) (point))))))) +- `( (char-after (1- (or ,pos (point))))))) + (list 'char-after (list '1- (list 'or pos '(point)))))) - (eval-when-compile - (if (or (featurep 'bytecomp) -@@ -2189,7 +2185,7 @@ - (modify-syntax-entry ?\n ">" table) - (modify-syntax-entry ?\" "\"" table) - (modify-syntax-entry ?# "." table) -- (modify-syntax-entry ?$ "'" table) -+ (modify-syntax-entry ?$ "/" table) - (modify-syntax-entry ?% "<" table) - (modify-syntax-entry ?& "." table) - (modify-syntax-entry ?\' "\"" table) -@@ -2819,7 +2815,7 @@ - - (defun erlang-man-make-menu-item (file) - "Create a menu item containing the name of the man page." -- (and (string-match ".*/\\([^/]+\\)\\.[^.]$" file) -+ (and (string-match ".*/\\([^/]+\\)\\.\\([124-9]\\|3erl\\)?\\(\\.gz\\)?$" file) - (let ((page (substring file (match-beginning 1) (match-end 1)))) - (list (capitalize page) - (list 'lambda '() -@@ -2830,7 +2826,7 @@ - - (defun erlang-man-get-files (dir) - "Return files in directory DIR." -- (directory-files dir t ".*\\.[0-9]\\'")) -+ (directory-files dir t ".*\\.\\([124-9]\\|3erl\\)?\\(\\.gz\\)?\\'")) - - - (defun erlang-man-module (&optional module) -@@ -2850,7 +2846,7 @@ - (if (or (null module) (string= module "")) - (error "No Erlang module name given")) - (let ((dir-list erlang-man-dirs) -- (pat (concat "/" (regexp-quote module) "\\.[^.]$")) -+ (pat (concat "/" (regexp-quote module) "\\.\\([124-9]\\|3erl\\)?\\(\\.gz\\)?$")) - (file nil) - file-list) - (while (and dir-list (null file)) -@@ -2991,7 +2987,7 @@ - (error nil)) - (if file - (let ((process-environment (copy-sequence process-environment))) -- (if (string-match "\\(.*\\)/man[^/]*/\\([^/]+\\)\\.[^.]$" file) -+ (if (string-match "\\(.*\\)/man[^/]*/\\([^.]+\\)\\.\\([124-9]\\|3erl\\)?\\(\\.gz\\)?$" file) - (let ((dir (substring file (match-beginning 1) (match-end 1))) - (page (substring file (match-beginning 2) (match-end 2)))) - (if (fboundp 'setenv) + ;; defvar some obsolete variables, which we still support for + ;; backwardscompatibility reasons. diff -Nru erlang-13.b.1-dfsg/debian/patches/gnu.patch erlang-13.b.3-dfsg/debian/patches/gnu.patch --- erlang-13.b.1-dfsg/debian/patches/gnu.patch 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patches/gnu.patch 2009-12-22 04:36:22.000000000 +0000 @@ -10,9 +10,9 @@ (4) Skips building SSL certificate examples for GNU/Hurd (Debian GNU/Hurd has no a random translator yet). ---- erlang-13.b.1-dfsg.orig/erts/configure.in -+++ erlang-13.b.1-dfsg/erts/configure.in -@@ -315,7 +315,7 @@ +--- erlang-13.b.3-dfsg.orig/erts/configure.in ++++ erlang-13.b.3-dfsg/erts/configure.in +@@ -339,7 +339,7 @@ dnl NOTE: CPPFLAGS will be included in CFLAGS at the end case $host_os in @@ -21,7 +21,7 @@ win32) # The ethread library requires _WIN32_WINNT of at least 0x0403. # -D_WIN32_WINNT=* from CPPFLAGS is saved in ETHR_DEFS. -@@ -926,7 +926,7 @@ +@@ -996,7 +996,7 @@ solaris*) enable_child_waiter_thread=yes ;; @@ -30,8 +30,8 @@ AC_DEFINE(USE_RECURSIVE_MALLOC_MUTEX,[1], [Define if malloc should use a recursive mutex]) AC_MSG_CHECKING([whether dlopen() needs to be called before first call to dlerror()]) ---- erlang-13.b.1-dfsg.orig/lib/common_test/Makefile -+++ erlang-13.b.1-dfsg/lib/common_test/Makefile +--- erlang-13.b.3-dfsg.orig/lib/common_test/Makefile ++++ erlang-13.b.3-dfsg/lib/common_test/Makefile @@ -30,9 +30,13 @@ ifeq ($(findstring solaris,$(TARGET)),solaris) SUB_DIRECTORIES = doc/src src priv @@ -46,8 +46,8 @@ include vsn.mk VSN = $(COMMON_TEST_VSN) ---- erlang-13.b.1-dfsg.orig/lib/common_test/priv/Makefile.in -+++ erlang-13.b.1-dfsg/lib/common_test/priv/Makefile.in +--- erlang-13.b.3-dfsg.orig/lib/common_test/priv/Makefile.in ++++ erlang-13.b.3-dfsg/lib/common_test/priv/Makefile.in @@ -43,9 +43,13 @@ ifeq ($(findstring solaris,$(TARGET)),solaris) XNIX = true @@ -62,8 +62,8 @@ ifneq ($(findstring win32,$(TARGET)),win32) ---- erlang-13.b.1-dfsg.orig/lib/os_mon/c_src/memsup.c -+++ erlang-13.b.1-dfsg/lib/os_mon/c_src/memsup.c +--- erlang-13.b.3-dfsg.orig/lib/os_mon/c_src/memsup.c ++++ erlang-13.b.3-dfsg/lib/os_mon/c_src/memsup.c @@ -110,6 +110,11 @@ #include #endif @@ -76,8 +76,8 @@ #ifdef BSD4_4 #include #include ---- erlang-13.b.1-dfsg.orig/lib/ssl/Makefile -+++ erlang-13.b.1-dfsg/lib/ssl/Makefile +--- erlang-13.b.3-dfsg.orig/lib/ssl/Makefile ++++ erlang-13.b.3-dfsg/lib/ssl/Makefile @@ -32,8 +32,15 @@ SKIP_BUILDING_BINARIES := true endif diff -Nru erlang-13.b.1-dfsg/debian/patches/m68k.patch erlang-13.b.3-dfsg/debian/patches/m68k.patch --- erlang-13.b.1-dfsg/debian/patches/m68k.patch 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patches/m68k.patch 2009-12-22 04:36:22.000000000 +0000 @@ -7,20 +7,22 @@ (2) Non-working networking besause of blind conversion of long to a pointer. ---- erlang-13.b.1-dfsg.orig/erts/emulator/beam/binary.c -+++ erlang-13.b.1-dfsg/erts/emulator/beam/binary.c -@@ -31,6 +31,8 @@ +--- erlang-13.b.3-dfsg.orig/erts/emulator/beam/binary.c ++++ erlang-13.b.3-dfsg/erts/emulator/beam/binary.c +@@ -31,6 +31,10 @@ #include "erl_binary.h" #include "erl_bits.h" ++#ifdef __m68k__ +erts_atomic_t erts_allocated_binaries __attribute__ ((aligned (4))); ++#endif + #ifdef DEBUG static int list_to_bitstr_buf(Eterm obj, char* buf, int len); #else ---- erlang-13.b.1-dfsg.orig/erts/emulator/beam/erl_driver.h -+++ erlang-13.b.1-dfsg/erts/emulator/beam/erl_driver.h -@@ -516,7 +516,7 @@ +--- erlang-13.b.3-dfsg.orig/erts/emulator/beam/erl_driver.h ++++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_driver.h +@@ -570,7 +570,7 @@ EXTERN ErlDrvTermData driver_caller(ErlDrvPort); extern const ErlDrvTermData driver_term_nil; EXTERN ErlDrvTermData driver_mk_term_nil(void); diff -Nru erlang-13.b.1-dfsg/debian/patches/man.patch erlang-13.b.3-dfsg/debian/patches/man.patch --- erlang-13.b.1-dfsg/debian/patches/man.patch 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patches/man.patch 2009-12-22 04:36:22.000000000 +0000 @@ -4,9 +4,9 @@ (Erlang manual pages are placed to /usr/share/man/ hierarchy as required by Debian policy.) ---- erlang-13.b.1-dfsg.orig/erts/etc/common/erlexec.c -+++ erlang-13.b.1-dfsg/erts/etc/common/erlexec.c -@@ -696,8 +696,10 @@ +--- erlang-13.b.3-dfsg.orig/erts/etc/common/erlexec.c ++++ erlang-13.b.3-dfsg/erts/etc/common/erlexec.c +@@ -699,8 +699,10 @@ error("-man not supported on Windows"); #else argv[i] = "man"; @@ -15,7 +15,7 @@ + /* + * Conform to erlang-manpages content. + */ -+ putenv(strsave("MANSECT=3erl:1:4:6")); ++ putenv(strsave("MANSECT=3erl:1:4:6:7")); execvp("man", argv+i); error("Could not execute the 'man' command."); #endif diff -Nru erlang-13.b.1-dfsg/debian/patches/native.patch erlang-13.b.3-dfsg/debian/patches/native.patch --- erlang-13.b.1-dfsg/debian/patches/native.patch 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patches/native.patch 2009-12-22 04:36:22.000000000 +0000 @@ -2,9 +2,9 @@ Adds native code to all Erlang binaries if HiPE is enabled. ---- erlang-13.b-dfsg.orig/make/otp.mk.in -+++ erlang-13.b-dfsg/make/otp.mk.in -@@ -66,6 +66,11 @@ +--- erlang-13.b.3-dfsg.orig/make/otp.mk.in ++++ erlang-13.b.3-dfsg/make/otp.mk.in +@@ -83,6 +83,11 @@ ERL_COMPILE_FLAGS += +slim else ERL_COMPILE_FLAGS += +debug_info diff -Nru erlang-13.b.1-dfsg/debian/patches/series erlang-13.b.3-dfsg/debian/patches/series --- erlang-13.b.1-dfsg/debian/patches/series 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patches/series 2009-12-22 04:36:22.000000000 +0000 @@ -5,5 +5,6 @@ emacs.patch ssl.patch m68k.patch +docs.patch #native.patch -build-options.patch +#build-options.patch diff -Nru erlang-13.b.1-dfsg/debian/patches/sparc.patch erlang-13.b.3-dfsg/debian/patches/sparc.patch --- erlang-13.b.1-dfsg/debian/patches/sparc.patch 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patches/sparc.patch 2009-12-22 04:36:22.000000000 +0000 @@ -5,9 +5,9 @@ (2) Fixes FTBFS(see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=328031). ---- erlang-13.b.1-dfsg.orig/erts/configure.in -+++ erlang-13.b.1-dfsg/erts/configure.in -@@ -473,7 +473,7 @@ +--- erlang-13.b.3-dfsg.orig/erts/configure.in ++++ erlang-13.b.3-dfsg/erts/configure.in +@@ -497,7 +497,7 @@ chk_arch_=`uname -m` fi case $chk_arch_ in @@ -16,9 +16,9 @@ sparc64) ARCH=sparc64;; sun4v) ARCH=ultrasparc;; i86pc) ARCH=x86;; ---- erlang-13.b.1-dfsg.orig/erts/emulator/beam/beam_emu.c -+++ erlang-13.b.1-dfsg/erts/emulator/beam/beam_emu.c -@@ -976,16 +976,6 @@ +--- erlang-13.b.3-dfsg.orig/erts/emulator/beam/beam_emu.c ++++ erlang-13.b.3-dfsg/erts/emulator/beam/beam_emu.c +@@ -997,16 +997,6 @@ * in registers. */ @@ -35,7 +35,7 @@ # define REG_x0 # define REG_xregs # define REG_htop -@@ -994,7 +984,6 @@ +@@ -1015,7 +1005,6 @@ # define REG_fcalls # define REG_tmp_arg1 # define REG_tmp_arg2 diff -Nru erlang-13.b.1-dfsg/debian/patches/ssl.patch erlang-13.b.3-dfsg/debian/patches/ssl.patch --- erlang-13.b.1-dfsg/debian/patches/ssl.patch 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patches/ssl.patch 2009-12-22 04:36:22.000000000 +0000 @@ -2,9 +2,9 @@ Patch adds support for IPv6 to the ssl application. ---- erlang-13.b.1-dfsg.orig/erts/configure.in -+++ erlang-13.b.1-dfsg/erts/configure.in -@@ -1475,6 +1475,8 @@ +--- erlang-13.b.3-dfsg.orig/erts/configure.in ++++ erlang-13.b.3-dfsg/erts/configure.in +@@ -1577,6 +1577,8 @@ fi fi AC_CHECK_FUNCS([getnameinfo getipnodebyname getipnodebyaddr gethostbyname2]) @@ -13,9 +13,9 @@ AC_CHECK_FUNCS([ieee_handler fpsetmask finite isnan isinf res_gethostbyname dlopen \ pread pwrite writev memmove strerror strerror_r strncasecmp \ ---- erlang-13.b.1-dfsg.orig/erts/config.h.in -+++ erlang-13.b.1-dfsg/erts/config.h.in -@@ -241,6 +241,9 @@ +--- erlang-13.b.3-dfsg.orig/erts/config.h.in ++++ erlang-13.b.3-dfsg/erts/config.h.in +@@ -253,6 +253,9 @@ /* Define if ipv6 is present */ #undef HAVE_IN6 @@ -25,7 +25,7 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H -@@ -409,6 +412,9 @@ +@@ -424,6 +427,9 @@ /* Define to 1 if `ssf_data' is member of `struct sctp_send_failed'. */ #undef HAVE_STRUCT_SCTP_SEND_FAILED_SSF_DATA @@ -35,8 +35,8 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H ---- erlang-13.b.1-dfsg.orig/lib/ssl/c_src/esock.c -+++ erlang-13.b.1-dfsg/lib/ssl/c_src/esock.c +--- erlang-13.b.3-dfsg.orig/lib/ssl/c_src/esock.c ++++ erlang-13.b.3-dfsg/lib/ssl/c_src/esock.c @@ -132,6 +132,11 @@ #define INADDR_NONE 0xffffffff /* Should be in . */ #endif @@ -304,9 +304,9 @@ static Connection *new_connection(int state, FD fd) { Connection *cp; ---- erlang-13.b.1-dfsg.orig/lib/ssl/src/ssl_broker.erl -+++ erlang-13.b.1-dfsg/lib/ssl/src/ssl_broker.erl -@@ -486,7 +486,7 @@ +--- erlang-13.b.3-dfsg.orig/lib/ssl/src/ssl_broker.erl ++++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_broker.erl +@@ -471,7 +471,7 @@ debug(St, "peername: client = ~w~n", [Client]), Reply = case ssl_server:peername(St#st.fd) of {ok, {Address, Port}} -> @@ -315,7 +315,7 @@ {ok, {At, Port}}; Error -> Error -@@ -543,7 +543,7 @@ +@@ -527,7 +527,7 @@ debug(St, "sockname: client = ~w~n", [Client]), Reply = case ssl_server:sockname(St#st.fd) of {ok, {Address, Port}} -> @@ -324,7 +324,7 @@ {ok, {At, Port}}; Error -> Error -@@ -706,7 +706,8 @@ +@@ -684,7 +684,8 @@ SSLOpts = get_ssl_opts(Opts), FlagStr =mk_ssl_optstr(SSLOpts), BackLog = get_backlog(LOpts), @@ -334,7 +334,7 @@ case ssl_server:listen_prim(ServerName, IP, Port, FlagStr, BackLog) of {ok, ListenFd, _Port0} -> ThisSocket = #sslsocket{fd = ListenFd, pid = self()}, -@@ -729,10 +730,11 @@ +@@ -707,10 +708,11 @@ COpts = get_tcp_connect_opts(Opts), SSLOpts = get_ssl_opts(Opts), FlagStr = mk_ssl_optstr(SSLOpts), @@ -348,7 +348,7 @@ LPort = get_port(COpts), case (catch ssl_server:connect_prim(ServerName, LIP, LPort, FIP, FPort, -@@ -1019,8 +1021,13 @@ +@@ -997,8 +999,13 @@ get_backlog(Opts) -> get_tagged_opt(backlog, Opts, ?DEF_BACKLOG). @@ -364,7 +364,7 @@ get_port(Opts) -> get_tagged_opt(port, Opts, 0). -@@ -1028,6 +1035,9 @@ +@@ -1006,6 +1013,9 @@ get_nodelay(Opts) -> get_tagged_opt(nodelay, Opts, empty). @@ -374,16 +374,16 @@ %% %% add_default_*_opts(Opts) -> NOpts %% -@@ -1076,6 +1086,8 @@ - transform_opt(binary) -> [{mode, binary}]; - transform_opt(list) -> [{mode, list}]; - transform_opt({packet, raw}) -> [{packet, 0}]; -+transform_opt(inet) -> [{family, inet}]; -+transform_opt(inet6) -> [{family, inet6}]; - transform_opt(raw) -> []; - transform_opt(Opt) -> [Opt]. +@@ -1054,6 +1064,8 @@ + transform_opt(binary) -> [{mode, binary}]; + transform_opt(list) -> [{mode, list}]; + transform_opt({packet, raw}) -> [{packet, 0}]; ++transform_opt(inet) -> [{family, inet}]; ++transform_opt(inet6) -> [{family, inet6}]; + transform_opt(raw) -> []; + transform_opt(Opt) -> [Opt]. -@@ -1083,10 +1095,10 @@ +@@ -1061,10 +1073,10 @@ %% only. is_connect_opt(Opt) -> @@ -396,7 +396,7 @@ is_tcp_accept_opt(Opt) -> is_tcp_gen_opt(Opt). -@@ -1142,6 +1154,10 @@ +@@ -1120,6 +1132,10 @@ is_ssl_opt({cachetimeout, Timeout}) when Timeout >= 0 -> true; is_ssl_opt(_Opt) -> false. @@ -407,9 +407,9 @@ %% Various types is_string(String) when is_list(String) -> lists:all(fun (C) when is_integer(C), 0 =< C, C =< 255 -> true; -@@ -1152,11 +1168,20 @@ +@@ -1130,11 +1146,20 @@ - is_ip_address(Addr) when is_tuple(Addr), size(Addr) == 4 -> + is_ip_address(Addr) when tuple_size(Addr) =:= 4 -> is_string(tuple_to_list(Addr)); +is_ip_address(Addr) when is_tuple(Addr), size(Addr) == 8 -> + is_ip6_string(tuple_to_list(Addr)); @@ -428,29 +428,29 @@ get_tagged_opt(Tag, Opts, Default) -> case lists:keysearch(Tag, 1, Opts) of {value, {_, Value}} -> ---- erlang-13.b.1-dfsg.orig/lib/ssl/src/ssl_prim.erl -+++ erlang-13.b.1-dfsg/lib/ssl/src/ssl_prim.erl -@@ -128,7 +128,7 @@ - peername(St) when record(St, st), St#st.status =:= open -> - case ssl_server:peername_prim(ssl_server_prim, St#st.fd) of +--- erlang-13.b.3-dfsg.orig/lib/ssl/src/ssl_prim.erl ++++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_prim.erl +@@ -118,7 +118,7 @@ + peername(#st{fd = Fd, status = open}) -> + case ssl_server:peername_prim(ssl_server_prim, Fd) of {ok, {Address, Port}} -> - {ok, At} = inet_parse:ipv4_address(Address), + {ok, At} = inet_parse:address(Address), {ok, {At, Port}}; Error -> Error -@@ -140,7 +140,7 @@ - sockname(St) when record(St, st), St#st.status =:= open -> - case ssl_server:sockname_prim(ssl_server_prim, St#st.fd) of +@@ -129,7 +129,7 @@ + sockname(#st{fd = Fd, status = open}) -> + case ssl_server:sockname_prim(ssl_server_prim, Fd) of {ok, {Address, Port}} -> - {ok, At} = inet_parse:ipv4_address(Address), + {ok, At} = inet_parse:address(Address), {ok, {At, Port}}; Error -> Error ---- erlang-13.b.1-dfsg.orig/lib/ssl/src/ssl_server.erl -+++ erlang-13.b.1-dfsg/lib/ssl/src/ssl_server.erl -@@ -1378,7 +1378,10 @@ +--- erlang-13.b.3-dfsg.orig/lib/ssl/src/ssl_server.erl ++++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_server.erl +@@ -1363,7 +1363,10 @@ ip_to_string({A,B,C,D}) -> [integer_to_list(A),$.,integer_to_list(B),$., diff -Nru erlang-13.b.1-dfsg/debian/patterns/erlang-base-hipe.patterns erlang-13.b.3-dfsg/debian/patterns/erlang-base-hipe.patterns --- erlang-13.b.1-dfsg/debian/patterns/erlang-base-hipe.patterns 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patterns/erlang-base-hipe.patterns 2009-12-22 04:36:22.000000000 +0000 @@ -2,7 +2,7 @@ ./usr/lib/erlang/misc/ ./usr/lib/erlang/releases/[^.]*(\.[^s]|\.s[^r]|\.sr[^c]|\.src.)?[^.]*$ ./usr/lib/erlang/bin/[^d][^y] -./usr/lib/erlang/erts-.*/bin/[^d][^y][^.]*(\.[^s]|\.s[^r]|\.sr[^c]|\.src.)?[^.]*$ +./usr/lib/erlang/erts-.*/bin/[^d][^y][^.]*(\.debug)?(\.[^s]|\.s[^r]|\.sr[^c]|\.src.)?[^.]*$ ./usr/lib/erlang/erts-.*/bin/dyn_erl$ ./usr/lib/erlang/lib/erl_interface-.*/bin/ ./usr/lib/erlang/lib/compiler-.*/ebin/ diff -Nru erlang-13.b.1-dfsg/debian/patterns/erlang-base.patterns erlang-13.b.3-dfsg/debian/patterns/erlang-base.patterns --- erlang-13.b.1-dfsg/debian/patterns/erlang-base.patterns 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patterns/erlang-base.patterns 2009-12-22 04:36:22.000000000 +0000 @@ -2,7 +2,7 @@ ./usr/lib/erlang/misc/ ./usr/lib/erlang/releases/[^.]*(\.[^s]|\.s[^r]|\.sr[^c]|\.src.)?[^.]*$ ./usr/lib/erlang/bin/[^d][^y] -./usr/lib/erlang/erts-.*/bin/[^d][^y][^.]*(\.[^s]|\.s[^r]|\.sr[^c]|\.src.)?[^.]*$ +./usr/lib/erlang/erts-.*/bin/[^d][^y][^.]*(\.debug)?(\.[^s]|\.s[^r]|\.sr[^c]|\.src.)?[^.]*$ ./usr/lib/erlang/erts-.*/bin/dyn_erl$ ./usr/lib/erlang/lib/erl_interface-.*/bin/ ./usr/lib/erlang/lib/compiler-.*/ebin/ diff -Nru erlang-13.b.1-dfsg/debian/patterns/erlang-erl-docgen.patterns erlang-13.b.3-dfsg/debian/patterns/erlang-erl-docgen.patterns --- erlang-13.b.1-dfsg/debian/patterns/erlang-erl-docgen.patterns 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/patterns/erlang-erl-docgen.patterns 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1 @@ +./usr/lib/erlang/lib/erl_docgen-.*/ diff -Nru erlang-13.b.1-dfsg/debian/patterns/erlang-examples.patterns erlang-13.b.3-dfsg/debian/patterns/erlang-examples.patterns --- erlang-13.b.1-dfsg/debian/patterns/erlang-examples.patterns 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/patterns/erlang-examples.patterns 2009-12-22 04:36:22.000000000 +0000 @@ -9,6 +9,7 @@ ./usr/lib/erlang/lib/mnemosyne-.*/examples/ ./usr/lib/erlang/lib/mnesia-.*/examples/ ./usr/lib/erlang/lib/orber-.*/examples/ +./usr/lib/erlang/lib/reltool-.*/examples/ ./usr/lib/erlang/lib/snmp-.*/examples/ ./usr/lib/erlang/lib/ssl-.*/examples/ ./usr/lib/erlang/lib/stdlib-.*/examples/ diff -Nru erlang-13.b.1-dfsg/debian/README.Debian erlang-13.b.3-dfsg/debian/README.Debian --- erlang-13.b.1-dfsg/debian/README.Debian 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/README.Debian 2009-12-22 04:36:22.000000000 +0000 @@ -78,15 +78,4 @@ install erlang-manpages (for manual pages) and/or erlang-doc-html (for docs in HTML). ----------------- - -Starting from version 13.b.1-dfsg-2 Erlang packages come with debug info -stripped. It's done to make the packages more suitable for using in -embedded environment or distributing on limited-space media (as CDs). -If you need debug information (e.g. to use debugger application) then -you'll have to rebuild erlang from the source setting DEB_BUILD_OPTIONS -to debug,nostrip: - -DEB_BUILD_OPTIONS="debug,nostrip" dpkg-buildpackage -rfakeroot -b - -Sergei Golovan Tue, 16 Jun 2009 22:07:30 +0400 + -- Sergei Golovan Thu, 23 Jul 2009 23:13:56 +0400 diff -Nru erlang-13.b.1-dfsg/debian/README.source erlang-13.b.3-dfsg/debian/README.source --- erlang-13.b.1-dfsg/debian/README.source 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/README.source 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1,8 @@ +This package uses quilt to manage all modifications to the upstream +source. Changes are stored in the source package as diffs in +debian/patches and applied during the build. + +To get detailed instructions on how to apply the series of patches +and modify them, please read /usr/share/doc/quilt/README.source + + -- Sergei Golovan Tue, 18 Aug 2009 01:27:36 +0400 diff -Nru erlang-13.b.1-dfsg/debian/rules erlang-13.b.3-dfsg/debian/rules --- erlang-13.b.1-dfsg/debian/rules 2009-12-22 04:36:19.000000000 +0000 +++ erlang-13.b.3-dfsg/debian/rules 2009-12-22 04:36:22.000000000 +0000 @@ -1,29 +1,31 @@ #!/usr/bin/make -f -# Please don't mind too much about BUILD_DIR, -# it was originally from an experiment that I did -# not keep in the package. F-D - #export DH_VERBOSE=1 DEB_HOST_ARCH := $(shell dpkg-architecture -qDEB_HOST_ARCH) DEB_HOST_GNU_TYPE := $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE := $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) export QUILT_PATCHES := debian/patches + ROOT_DIR=$(shell pwd) -BUILD_DIR=$(ROOT_DIR) +TMP_DIR=$(ROOT_DIR)/debian/tmp export HOME := $(ROOT_DIR)/debian --include ${BUILD_DIR}/erts/vsn.mk --include ${BUILD_DIR}/lib/erl_interface/vsn.mk --include ${BUILD_DIR}/lib/ic/vsn.mk --include ${BUILD_DIR}/lib/tools/vsn.mk --include ${BUILD_DIR}/lib/webtool/vsn.mk +-include ${ROOT_DIR}/erts/vsn.mk +-include ${ROOT_DIR}/lib/erl_interface/vsn.mk +-include ${ROOT_DIR}/lib/ic/vsn.mk +-include ${ROOT_DIR}/lib/tools/vsn.mk +-include ${ROOT_DIR}/lib/webtool/vsn.mk +-include ${ROOT_DIR}/lib/common_test/vsn.mk SOURCE_VERSION=$(shell dpkg-parsechangelog | sed -ne's!^Version: \(.*\)-.*!\1!p') ABI_VERSION=$(shell cat debian/control | sed -ne's!^Provides: erlang-abi-\(.*\)!\1!p' | head -1) HIPE_ARCHES=$(shell cat debian/control | grep '^Architecture:' | egrep -v '(all|any)' | sed -e 's/^Architecture: *//') +ifeq ($(findstring debug,$(DEB_BUILD_OPTIONS)),debug) +BUILD_HIPE := no +else BUILD_HIPE := $(shell echo ' $(HIPE_ARCHES) ' | grep -c ' ${DEB_HOST_ARCH} ' | sed -es/1/yes/ -es/0/no/) +endif ifeq ($(BUILD_HIPE), no) BINARY_TARGETS=binary-erlang-base INSTALL_RULE=install-stnd-stamp @@ -50,10 +52,28 @@ CLOCK_GETTIME_OPT=--enable-clock-gettime endif +# Temporary (until #475459 is fixed) disabling threads for sparc architecture +ifeq ($(DEB_HOST_ARCH), sparc) +THREAD_OPTS=--disable-threads --disable-smp-support +else +ifeq ($(DEB_HOST_ARCH), hurd-i386) +THREAD_OPTS=--enable-threads --disable-smp-support +else +THREAD_OPTS=--enable-threads --enable-smp-support +endif +endif + LIBSCTP=libsctp1 +ifeq ($(findstring debug,$(DEB_BUILD_OPTIONS)),debug) +CFLAGS=-g -O2 -fno-strict-aliasing +GEN_OPT_FLGS=-O2 -fno-strict-aliasing +TYPE=debug +else CFLAGS=-g -O2 -fno-strict-aliasing GEN_OPT_FLGS=-O2 -fno-strict-aliasing +TYPE= +endif unpatch: patch-stamp dh_testdir @@ -70,39 +90,40 @@ clean: clean-patched unpatch dh_testdir dh_testroot - dh_clean + dh_clean -Xtest.erl.orig clean-patched: patch-stamp dh_testdir dh_testroot - (cd ${BUILD_DIR} && [ ! -f Makefile ] || ${MAKE} clean) + [ ! -f Makefile ] || ${MAKE} clean rm -f lib/dialyzer/SKIP # Remove installed erlang from debian/ + rm -rf debian/tmp rm -rf debian/erlang-stnd rm -rf debian/erlang-hipe # Restore replaced configure, config.guess, and config.sub files - for i in `find ${BUILD_DIR} -name 'configure.backup'` ; do \ + for i in `find ${ROOT_DIR} -name 'configure.backup'` ; do \ mv $$i $${i%%.backup} ; \ done - for i in `find ${BUILD_DIR} -name 'config.guess~'` ; do \ + for i in `find ${ROOT_DIR} -name 'config.guess~'` ; do \ mv $$i $${i%%\~} ; \ done - for i in `find ${BUILD_DIR} -name 'config.sub~'` ; do \ + for i in `find ${ROOT_DIR} -name 'config.sub~'` ; do \ mv $$i $${i%%\~} ; \ done # Remove files, which were generated from templates - for i in debian/*.in ; do \ + for i in debian/*.in debian/scripts/*.in ; do \ rm -f $${i%%.in} ; \ done # *.install were also generated on-the-fly rm -f debian/*.install - rm -f debian/AUTHORS debian/erlang-depends.1 + rm -f debian/AUTHORS # Don't remove patch-stamp rm -f [^p]*-stamp @@ -130,7 +151,7 @@ fi # Preserve configure scripts - for i in `find ${BUILD_DIR} -not \( -wholename '*/.pc' -prune \) \ + for i in `find ${ROOT_DIR} -not \( -wholename '*/.pc' -prune \) \ -a -name 'configure'` ; do \ cp -f $$i $$i.backup ; \ done @@ -138,18 +159,18 @@ # Replace config.guess and config.sub by installed in /usr/share/misc. # Also add suffix -gnu to ibm-linux in config.guess to fix FTBFS # on s390 architecture - for i in `find ${BUILD_DIR} -not \( -wholename '*/.pc' -prune \) \ + for i in `find ${ROOT_DIR} -not \( -wholename '*/.pc' -prune \) \ -a -name 'config.guess'` ; do \ cp -fb /usr/share/misc/config.guess $$i ; \ sed -i 's/-ibm-linux$$/-ibm-linux-gnu/g' $$i ; \ done - for i in `find ${BUILD_DIR} -not \( -wholename '*/.pc' -prune \) \ + for i in `find ${ROOT_DIR} -not \( -wholename '*/.pc' -prune \) \ -a -name 'config.sub'` ; do \ cp -fb /usr/share/misc/config.sub $$i ; \ done # Regenerate configure scripts using autoconf - for i in `find ${BUILD_DIR} -not \( -wholename '*/.pc' -prune \) \ + for i in `find ${ROOT_DIR} -not \( -wholename '*/.pc' -prune \) \ -a -name 'configure.in' -printf "%h\n"`; do \ echo "autoconf'ing $${i}"; \ (cd $${i} && autoconf) \ @@ -165,7 +186,6 @@ [ ! -f Makefile ] || ${MAKE} clean rm -f lib/dialyzer/SKIP - (cd ${BUILD_DIR} && \ CFLAGS="$(CFLAGS)" \ ./configure --host=$(DEB_HOST_GNU_TYPE) \ --build=$(DEB_BUILD_GNU_TYPE) \ @@ -173,15 +193,14 @@ --libexecdir=/usr/bin \ --infodir=/usr/share/info \ --mandir=/usr/share/man \ - --enable-smp-support \ --enable-hybrid-heap \ - --enable-threads \ + $(THREAD_OPTS) \ --enable-hipe \ $(KERNEL_POLL_OPT) \ --enable-sctp \ $(CLOCK_GETTIME_OPT) \ --enable-dynamic-ssl-lib \ - --without-ssl-zlib) + --without-ssl-zlib touch configure-hipe-stamp @@ -194,7 +213,6 @@ [ ! -f Makefile ] || ${MAKE} clean rm -f lib/dialyzer/SKIP - (cd ${BUILD_DIR} && \ CFLAGS="$(CFLAGS)" \ ./configure --host=$(DEB_HOST_GNU_TYPE) \ --build=$(DEB_BUILD_GNU_TYPE) \ @@ -202,15 +220,14 @@ --libexecdir=/usr/bin \ --infodir=/usr/share/info \ --mandir=/usr/share/man \ - --enable-smp-support \ --enable-hybrid-heap \ - --enable-threads \ + $(THREAD_OPTS) \ --disable-hipe \ $(KERNEL_POLL_OPT) \ --enable-sctp \ $(CLOCK_GETTIME_OPT) \ --enable-dynamic-ssl-lib \ - --without-ssl-zlib) + --without-ssl-zlib touch configure-stnd-stamp @@ -218,8 +235,7 @@ echo "*** do-install called for $(INSTALL_DIR)." # Calls make install. - (cd $(BUILD_DIR) && \ - ${MAKE} INSTALL_PREFIX=$(INSTALL_DIR) install) + ${MAKE} INSTALL_PREFIX=$(INSTALL_DIR) TYPE=$(TYPE) install # Replace ROOTDIR in "erl" and "start" scripts for real rootdir # If there's no erl or start then it's better to fail than silently continue @@ -275,15 +291,39 @@ build-hipe: build-hipe-stamp build-hipe-stamp: configure-hipe-stamp dh_testdir - (cd ${BUILD_DIR} && ${MAKE} GEN_OPT_FLGS="$(GEN_OPT_FLGS)" CC_R_FLAG= LD_R_FLAG= CC_R_OPT=) touch build-hipe-stamp +ifeq ($(findstring debug,$(DEB_BUILD_OPTIONS)),debug) + ${MAKE} TYPE=$(TYPE) FLAVOR=smp GEN_OPT_FLGS="$(GEN_OPT_FLGS)" emulator + ${MAKE} TYPE=$(TYPE) FLAVOR=plain GEN_OPT_FLGS="$(GEN_OPT_FLGS)" emulator +endif + ${MAKE} TYPE=$(TYPE) GEN_OPT_FLGS="$(GEN_OPT_FLGS)" CC_R_FLAG= LD_R_FLAG= CC_R_OPT= build-stnd: build-stnd-stamp build-stnd-stamp: configure-stnd-stamp dh_testdir - (cd ${BUILD_DIR} && ${MAKE} GEN_OPT_FLGS="$(GEN_OPT_FLGS)" CC_R_FLAG= LD_R_FLAG= CC_R_OPT=) +ifeq ($(findstring debug,$(DEB_BUILD_OPTIONS)),debug) + ${MAKE} TYPE=$(TYPE) FLAVOR=smp GEN_OPT_FLGS="$(GEN_OPT_FLGS)" emulator + ${MAKE} TYPE=$(TYPE) FLAVOR=plain GEN_OPT_FLGS="$(GEN_OPT_FLGS)" emulator +endif + ${MAKE} TYPE=$(TYPE) GEN_OPT_FLGS="$(GEN_OPT_FLGS)" CC_R_FLAG= LD_R_FLAG= CC_R_OPT= touch build-stnd-stamp +bin/docb_gen: debian/scripts/docb_gen + dh_testdir + install -D -m 755 $< $@ + +manpages: manpages-stamp +manpages-stamp: build-stnd-stamp bin/docb_gen + dh_testdir + pwd=$$(pwd) ; \ + target=$$(basename $$(find make -type d |grep /)) ; \ + PATH=$$pwd/bin:$$PATH ; \ + for m in $$(find . -wholename '*/doc/src/Makefile') ; do \ + (cd $$(dirname $$m) && make man ERL_TOP=$$pwd TARGET=$$target) || exit 1 ; \ + done + touch manpages-stamp + + install-hipe: install-hipe-stamp install-hipe-stamp: INSTALL_DIR=$(shell pwd)/debian/erlang-hipe install-hipe-stamp: build-hipe-stamp @@ -293,9 +333,41 @@ install-stnd: install-stnd-stamp install-stnd-stamp: INSTALL_DIR=$(shell pwd)/debian/erlang-stnd -install-stnd-stamp: build-stnd-stamp +install-stnd-stamp: build-stnd-stamp manpages-stamp dh_testdir $(do-install) + # + # Install manpages + install -d -m 755 $(TMP_DIR)/usr/share/man + for m in $$(find . -wholename '*/doc/man?') ; do \ + cp -r $$m $(TMP_DIR)/usr/share/man || exit 1 ; \ + done + cp $(TMP_DIR)/usr/share/man/man3/dialyzer.3 $(TMP_DIR)/usr/share/man/man1/dialyzer.1 + mv $(TMP_DIR)/usr/share/man/man1/start.1 $(TMP_DIR)/usr/share/man/man1/start_embedded.1 + # + # Fix manpages + for f in $$(find $(TMP_DIR)/usr/share/man/man1 -type f) ; do \ + sed -i -e's/, start_erl(1)//g' \ + -e's/start(1)/start_embedded(1)/g' \ + $$f ; \ + done + # + sed -i -e's/^\(\.TH .*\) 3 \(.*\) "Erlang Module Definition"/\1 1 \2 "User Commands"/' \ + $(TMP_DIR)/usr/share/man/man1/dialyzer.1 + # + sed -i -e's/^start \\-/start_embedded \\-/' \ + -e's/^\.TH start 1/.TH start_embedded 1/' \ + $(TMP_DIR)/usr/share/man/man1/start_embedded.1 + # + for f in $$(find $(TMP_DIR)/usr/share/man -type f) ; do \ + sed -i -e's/^\(\.TH .*\) 3 /\1 3erl /' \ + -e's/\([^[:space:]]\)(3)/\1(3erl)/g' \ + $$f ; \ + done + # + for f in $$(find $(TMP_DIR)/usr/share/man/man3 -type f) ; do \ + mv $$f $${f}erl ; \ + done touch install-stnd-stamp # Very accurately place each installed file into the proper package @@ -306,8 +378,7 @@ build-stamp: $(INSTALL_RULE) dh_testdir # - sh debian/analyse.sh $(TMPINSTALL_DIR) - for i in debian/*.in ; do \ + for i in debian/*.in debian/scripts/*.in ; do \ sed -e's/@VERSION@/$(VSN)/g' \ -e's/@SOURCE_VERSION@/$(SOURCE_VERSION)/g' \ -e's/@HIPE_ARCHES@/$(HIPE_ARCHES)/g' \ @@ -315,14 +386,14 @@ -e's/@EI_VSN@/$(EI_VSN)/g' \ -e's/@IC_VSN@/$(IC_VSN)/g' \ -e's/@WEBTOOL_VSN@/$(WEBTOOL_VSN)/g' \ + -e's/@COMMON_TEST_VSN@/$(COMMON_TEST_VSN)/g' \ -e's/@TOOLS_VSN@/$(TOOLS_VSN)/g' <$$i >$${i%%.in} ; \ done - pod2man -c 'Erlang packages for Debian GNU/Linux' \ - debian/erlang-depends >debian/erlang-depends.1 + sh debian/scripts/analyse $(TMPINSTALL_DIR) # # Add all author lists to debian/AUTHORS f=1 ; \ - for i in `find $(BUILD_DIR) -name AUTHORS | sort` ; do \ + for i in `find $(ROOT_DIR) -name AUTHORS | sort` ; do \ echo $$i ; \ if [ $$f = 1 ] ; then \ f=0 ; \ @@ -362,8 +433,6 @@ dh_makeshlibs -i dh_installdeb -i echo 'erlang-base=erlang-base | erlang-base-hipe' >>debian/erlang.substvars - #echo 'erlang-base=erlang-base | erlang-base-hipe' >>debian/erlang-nox.substvars - #echo 'erlang-base=erlang-base | erlang-base-hipe' >>debian/erlang-x11.substvars echo 'erlang-base=erlang-base (>= $${binary:Version}) | erlang-base-hipe (>= $${binary:Version}), erlang-base (<< $${binary:Version}.0) | erlang-base-hipe (<< $${binary:Version}.0)' \ >>debian/erlang-src.substvars echo 'erlang-base=erlang-base (>= $${binary:Version}) | erlang-base-hipe (>= $${binary:Version}), erlang-base (<< $${binary:Version}.0) | erlang-base-hipe (<< $${binary:Version}.0)' \ @@ -382,14 +451,14 @@ dh_install -perlang-base --sourcedir=debian/erlang-stnd dh_install -a -Nerlang-base -Nerlang-base-hipe --sourcedir=$(TMPINSTALL_DIR) # - install -D -m 755 $(ROOT_DIR)/debian/erlang-depends \ + install -D -m 755 $(ROOT_DIR)/debian/scripts/erlang-depends \ $(ROOT_DIR)/debian/erlang-dev/usr/bin/erlang-depends install -D -m 644 $(ROOT_DIR)/debian/erlang.xpm \ $(ROOT_DIR)/debian/erlang-base/usr/share/pixmaps/erlang.xpm install -D -m 644 $(ROOT_DIR)/debian/erlang-base.desktop \ $(ROOT_DIR)/debian/erlang-base/usr/share/apps/konsole/erlang.desktop # - for pkg in base appmon debugger docbuilder edoc gs observer percept pman tv ; do \ + for pkg in base appmon debugger docbuilder edoc erl-docgen gs observer percept pman tv wx ; do \ install -D -m 644 debian/lintian/erlang-$$pkg.lintian-override \ $(ROOT_DIR)/debian/erlang-$$pkg/usr/share/lintian/overrides/erlang-$$pkg ; \ done @@ -413,7 +482,7 @@ echo 'erlang-base=erlang-base | erlang-base-hipe' >>debian/erlang-x11.substvars for pkg in \ dev appmon asn1 common-test corba crypto debugger dialyzer \ - docbuilder edoc et eunit gs ic inets inviso megaco \ + docbuilder edoc erl-docgen et eunit gs ic inets inviso megaco \ mnesia observer odbc os-mon parsetools percept pman public-key \ reltool runtime-tools snmp ssh ssl syntax-tools test-server toolbar \ tools tv typer webtool wx xmerl ; do \ @@ -470,8 +539,8 @@ binary: binary-indep binary-arch -REL=R13B01 -DEB_REL=13.b.1-dfsg +REL=R13B03 +DEB_REL=13.b.3-dfsg get-orig-source: CURDIR=`pwd` && TMPDIR=`mktemp -d /tmp/erlang.XXXXXX` && \ diff -Nru erlang-13.b.1-dfsg/debian/scripts/analyse erlang-13.b.3-dfsg/debian/scripts/analyse --- erlang-13.b.1-dfsg/debian/scripts/analyse 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/scripts/analyse 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1,107 @@ +#!/bin/sh + +echo "Determining which files goes where through \ +the magic of regular expressions." + +# Pretty dead simple. The pattern files include +# regular expression that match some files. Files that +# match patterns in binary.patterns go into the base +# package. Same goes for the X11 package. Files +# that don't match anything go into the NO-X package etc. + +# Files that match here might also go into +# erlang-base-hipe.install. + +DIR=$1 + +echo "erlang-base" +find debian/erlang-stnd -type f | \ + grep -E -f debian/patterns/erlang-base.patterns | \ + cut -c 20- > debian/erlang-base.install + +echo "erlang-base-hipe" +find debian/erlang-hipe -type f | \ + grep -E -f debian/patterns/erlang-base-hipe.patterns | \ + cut -c 20- > debian/erlang-base-hipe.install + +# Here, files that matched above shouldn't +# be looked at. + +echo "erlang-examples" +find $DIR -type f | \ + grep -v -E -f debian/patterns/erlang-base.patterns | \ + grep -v -E -f debian/patterns/erlang-base-hipe.patterns | \ + grep -E -f debian/patterns/erlang-examples.patterns | \ + cut -c 20- > debian/erlang-examples.install + +echo "erlang-src" +find $DIR -type f | \ + grep -v -E -f debian/patterns/erlang-base.patterns | \ + grep -v -E -f debian/patterns/erlang-base-hipe.patterns | \ + grep -v -E -f debian/patterns/erlang-examples.patterns | \ + grep -E -f debian/patterns/erlang-src.patterns | \ + cut -c 20- > debian/erlang-src.install + +echo "erlang-dev" +find $DIR -type f | \ + grep -E -e './usr/lib/erlang/usr/include' | \ + cut -c 20- | sed -e 's!$! usr/lib/erlang/usr/include!' > debian/erlang-dev.install + +find $DIR -type f | \ + grep -v -E -f debian/patterns/erlang-base.patterns | \ + grep -v -E -f debian/patterns/erlang-base-hipe.patterns | \ + grep -v -E -f debian/patterns/erlang-examples.patterns | \ + grep -v -E -f debian/patterns/erlang-src.patterns | \ + grep -E -f debian/patterns/erlang-dev.patterns | \ + cut -c 20- >> debian/erlang-dev.install + +PACKAGES='appmon asn1 common-test corba crypto debugger dialyzer docbuilder + edoc erl-docgen et eunit gs ic inets inviso megaco mnesia observer + odbc os-mon parsetools percept pman public-key reltool runtime-tools + snmp ssh ssl syntax-tools test-server toolbar tools tv typer webtool + wx xmerl' + +CMD='grep -v -E -e ./usr/lib/erlang/usr/include | + grep -v -E -f debian/patterns/erlang-base.patterns | + grep -v -E -f debian/patterns/erlang-base-hipe.patterns | + grep -v -E -f debian/patterns/erlang-examples.patterns | + grep -v -E -f debian/patterns/erlang-src.patterns | + grep -v -E -f debian/patterns/erlang-dev.patterns' + +CMD1=$CMD +MODULES="" +for fn in $(awk -- '/\.beam$/ {system("basename " $1 " .beam")}' debian/erlang-base.install) +do + MODULES="$MODULES{\"$fn\", \"erlang-base\"},\n" +done +PACKAGES2="\"dev\", \"nox\", \"dev\"" +for pkg in $PACKAGES ; do + echo erlang-$pkg + + find $DIR -type f | eval $CMD | \ + grep -E -f debian/patterns/erlang-$pkg.patterns | \ + cut -c 20- | sort > debian/erlang-$pkg.install + + CMD1="$CMD1 | grep -v -E -f debian/patterns/erlang-$pkg.patterns" + for fn in $(awk -- '/\.beam$/ {system("basename " $1 " .beam")}' debian/erlang-$pkg.install) + do + MODULES="$MODULES{\"$fn\", \"erlang-$pkg\"},\n" + done + PACKAGES2="$PACKAGES2, \"$pkg\"" +done + +sed -i -e "s/@PACKAGES@/$PACKAGES2/" -e "s/@MODULES@/$MODULES/" debian/scripts/erlang-depends + +echo "FILES WHICH HAVEN'T REACHED ANY PACKAGE" +find $DIR -type f | eval $CMD1 + +echo "PACKAGES INTERSECTIONS" +for pkg1 in $PACKAGES ; do + for pkg2 in $PACKAGES ; do + if [ $pkg1 != $pkg2 ] ; then + comm -1 -2 debian/erlang-$pkg1.install debian/erlang-$pkg2.install + fi + done +done +echo "---------------------------------------" + diff -Nru erlang-13.b.1-dfsg/debian/scripts/docb_gen erlang-13.b.3-dfsg/debian/scripts/docb_gen --- erlang-13.b.1-dfsg/debian/scripts/docb_gen 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/scripts/docb_gen 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1,34 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +main(Args) -> + {Func, File, Opts} = parse_args(Args), + case docb_gen:Func(File, Opts) of + ok -> + ok; + {error, Reason} -> + io:format("~p~n", [Reason]), + halt(1) + end. + +parse_args(Args) -> + parse_args(Args, module, "", [], [], false, true). + +parse_args([], Func, File, Defs, Includes, Preprocess, Sort) -> + {Func, File, [{def, lists:reverse(Defs)}, + {includes, lists:reverse(Includes)}, + {preprocess, Preprocess}, + {sort_functions, Sort}]}; +parse_args(["-chapter" | Tail], _Func, File, Defs, Includes, Preprocess, Sort) -> + parse_args(Tail, users_guide, File, Defs, Includes, Preprocess, Sort); +parse_args(["-def", Name, Value | Tail], Func, File, Defs, Includes, Preprocess, Sort) -> + parse_args(Tail, Func, File, [{list_to_atom(Name), Value} | Defs], Includes, Preprocess, Sort); +parse_args(["-includes", Dir | Tail], Func, File, Defs, Includes, Preprocess, Sort) -> + parse_args(Tail, Func, File, Defs, [Dir | Includes], Preprocess, Sort); +parse_args(["-preprocess", P | Tail], Func, File, Defs, Includes, _Preprocess, Sort) -> + parse_args(Tail, Func, File, Defs, Includes, list_to_atom(P), Sort); +parse_args(["-sort_functions", S | Tail], Func, File, Defs, Includes, Preprocess, _Sort) -> + parse_args(Tail, Func, File, Defs, Includes, Preprocess, list_to_atom(S)); +parse_args([F | Tail], Func, _File, Defs, Includes, Preprocess, Sort) -> + parse_args(Tail, Func, F, Defs, Includes, Preprocess, Sort). + diff -Nru erlang-13.b.1-dfsg/debian/scripts/erlang-depends.in erlang-13.b.3-dfsg/debian/scripts/erlang-depends.in --- erlang-13.b.1-dfsg/debian/scripts/erlang-depends.in 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/debian/scripts/erlang-depends.in 2009-12-22 04:36:22.000000000 +0000 @@ -0,0 +1,662 @@ +#! /usr/bin/env escript +%% -*- erlang -*- +%%! -smp disable + +-include_lib("kernel/include/file.hrl"). + +% The current Erlang version +-define(VERSION, "@SOURCE_VERSION@"). +-define(ABI_VERSION, "@ABI_VERSION@"). + +% The list of HiPE enabled architectures (with added 'all' architecture), isn't used yet +-define(HIPE_ARCHES, split("@HIPE_ARCHES@ all", $\ )). + +% Since all packages required built application to run may be unavailable on build stage +% it's necessary to list all module-package relationships explicitly: +-define(MODULES, [@MODULES@ {"erlang", "erlang-base"}]). + +% The erlang packages list (suffixes only) +-define(PACKAGES, [@PACKAGES@]). + + +% main/1 -- +% +% Generate debhelper substitution variables for Erlang-dependent +% packages. +% +% Arguments: +% Options List of debhelper options (-v, -a, -i, -p*, -N*) or +% -h. +% +% Result: +% None. +% +% Side effects: +% For each of the selected packages the corresponding file +% debian/package.substvars is created (if necessary) and filled by erlang +% dependencies. If -h or --help is among arguments then the usage info is +% printed instead and script is halted. + +main(Options) -> + {Verbosity, TmpDir, Exclude, NewOptions} = + lists:foldl(fun(Opt, {Sum, Dir, Ex, Opts}) -> + case Opt of + "-h" -> + usage(), + halt(2); + "--help" -> + usage(), + halt(2); + "-v" -> + {Sum + 1, Dir, Ex, Opts}; + "--verbose" -> + {Sum + 1, Dir, Ex, Opts}; + "--ignore=" ++ File -> + {Sum, Dir, Ex ++ [File], Opts}; + "-P" ++ D -> + {Sum, D, Ex, Opts}; + "--tmpdir=" ++ D -> + {Sum, D, Ex, Opts}; + _ -> + {Sum, Dir, Ex, Opts ++ [Opt]} + end + end, {0, [], [], []}, Options), + lists:foreach( + fun(Package) -> + PkgDir = case TmpDir of + [] -> + filename:join("debian", Package); + _ -> + TmpDir + end, + delsubstvar(Verbosity, Package, "erlang-abi:Depends"), + addsubstvar(Verbosity, Package, "erlang-abi:Depends", + "erlang-abi-" ++ ?ABI_VERSION), + delsubstvar(Verbosity, Package, "erlang-base:Depends"), + addsubstvar(Verbosity, Package, "erlang-base:Depends", + "erlang-base (>= " ++ ?VERSION ++ + ") | erlang-base-hipe (>= " ++ ?VERSION ++ ")"), + lists:foreach( + fun(Pkg) -> + delsubstvar(Verbosity, Package, "erlang-" ++ Pkg ++ ":Depends"), + addsubstvar(Verbosity, Package, "erlang-" ++ Pkg ++ ":Depends", + "erlang-" ++ Pkg ++ " (>= " ++ ?VERSION ++ ")") + end, ?PACKAGES), + Deps = lists:foldl( + fun(M, Acc) -> + case lists:keysearch(M, 1, ?MODULES) of + {value, {_, P}} -> + ordsets:add_element(P, Acc); + _ -> + io:format("WARNING: Module ~s not found~n", [M]), + Acc + end + end, ordsets:new(), + get_remote_modules(Verbosity, PkgDir, Exclude)), + delsubstvar(Verbosity, Package, "erlang:Depends"), + case join(lists:map( + fun(D) -> + "${" ++ D ++ ":Depends}" + end, ordsets:to_list(Deps)), ", ") of + [] -> + ok; + Dep -> + % Add substvar only if it isn't empty + + addsubstvar(Verbosity, Package, "erlang:Depends", Dep) + end + end, get_packages(NewOptions)). + +% usage/0 -- +% +% Print a short usage info. +% +% Arguments: +% None. +% +% Result: +% None. +% +% Side effects: +% Usage is printed to stdout. + +usage() -> + io:format("Usage: erlang-depends [options]~n" + "Options:~n" + " -h, --help Show this help message~n" + " -v, --verbose Verbose mode~n" + " -a, --arch Act on architecture dependent packages~n" + " -i, --indep Act on architecture independent packages~n" + " -ppackage, --package=package~n" + " Act on package \"package\"~n" + " -Npackage, --no-package=package~n" + " Do not act on package \"package\"~n" + " -Ptmpdir, --tmpdir=tmpdir~n" + " Use \"tmpdir\" for package build directory~n"). + +% get_remote_modules/3 +% +% Return a difference between all modules used in the application and +% the local modules which dependencies are satisfied automagically. +% +% Arguments: +% Verbosity Verbosity level (0 - silence, 1 - print action). +% Dir Directory where the local BEAM files are to be searched. +% Exclude Don't take into account files in this list. +% +% Result: +% The list of remote modules. +% +% Side effects: +% None. + +get_remote_modules(Verbosity, Dir, Exclude) -> + Mods = ordsets:to_list(ordsets:subtract(get_modules(Dir, Exclude), + get_local_modules(Dir, Exclude))), + if Verbosity >= 1 -> + lists:foreach(fun(M) -> + io:format("Remote module: ~s~n", [M]) + end, Mods); + true -> + ok + end, + Mods. + +% get_modules/2 +% +% Return an ordset of all modules found in the application. +% +% Arguments: +% Dir Directory where the app BEAM files are to be searched. +% Exclude Don't take into account files in this list. +% +% Result: +% The ordset of all used modules. +% +% Side effects: +% None. + +get_modules(Dir, Exclude) -> + Modules = lists:map(fun({M, _F, _A}) -> + atom_to_list(M) + end, get_imports(Dir, Exclude)), + ordsets:from_list(Modules). + +% get_local_modules/2 +% +% Return an ordset of local modules found in the application (it is +% constructed from BEAM filenames). +% +% Arguments: +% Dir Directory where the app BEAM files are to be searched. +% Exclude Don't take into account files in this list. +% +% Result: +% The ordset of all local modules. +% +% Side effects: +% None. + +get_local_modules(Dir, Exclude) -> + Files = lists:filter(fun(File) -> + case lists:member(File, Exclude) of + true -> + false; + _ -> + true + end + end, files(Dir, ".*\\.beam$", true)), + Basenames = lists:map(fun(File) -> + filename:basename(File, ".beam") + end, Files), + ordsets:from_list(Basenames). + +% get_imports/2 +% +% Get imports from all BEAM files in the specified directory and below. +% +% Arguments: +% Dir Directory where to search for BEAM files +% Exclude Don't take into account files in this list. +% +% Results: +% A list of imports from all found BEAM files. +% +% Side effects: +% None. + +get_imports(Dir, Exclude) -> + Files = lists:filter(fun(File) -> + case lists:member(File, Exclude) of + true -> + false; + _ -> + true + end + end, files(Dir, ".*\\.beam$", true)), + lists:foldl(fun(File, Acc) -> + case beam_lib:chunks(File, [imports]) of + {ok, {_, [{imports, List}]}} -> + Acc ++ List; + _ -> + Acc + end + end, [], Files). + +% split/2 -- +% +% Split string into a list of tokens using the specified delimiter +% +% Arguments: +% String String to split +% Delimiter Character (delimiter) +% +% Results: +% A list of strings. +% +% Side effects: +% None. + +split(String, Delimiter) -> + split(String, Delimiter, none, []). + +split([], _Delimiter, Current, Res) -> + case Current of + none -> + lists:reverse(Res); + _ -> + lists:reverse([lists:reverse(Current) | Res]) + end; + +split([Delimiter | Tail], Delimiter, Current, Res) -> + case Current of + none -> + split(Tail, Delimiter, [], [[] | Res]); + _ -> + split(Tail, Delimiter, [], [lists:reverse(Current) | Res]) + end; + +split([Char | Tail], Delimiter, Current, Res) -> + case Current of + none -> + split(Tail, Delimiter, [Char], Res); + _ -> + split(Tail, Delimiter, [Char | Current], Res) + end. + +% join/2 -- +% +% Join string list into a single string using the specified delimiter +% +% Arguments: +% List List of strings to join +% Delimiter Character or character list (delimiter) +% +% Results: +% A string. +% +% Side effects: +% None. + +join(List, Delimiter) -> + join(List, Delimiter, []). + +join([], _Delimiter, Res) -> + lists:flatten(lists:reverse(Res)); + +join([String | Tail], Delimiter, []) -> + join(Tail, Delimiter, [String]); + +join([String | Tail], Delimiter, Res) -> + join(Tail, Delimiter, [String, Delimiter | Res]). + +% delsubstvar/3 -- +% +% Removes substitution variable from a substvar file for a given +% package in debian/ directory. +% +% Arguments: +% Verbosity Verbosity level (0 - silence, 1 - print action) +% Package Name of a package (file Package ++ ".substvars" is used). +% Substvar Name of a substitution variable to delete. +% +% Results: +% ok or halt. +% +% Side effects: +% File "debian/" ++ Package ++ ".substvars" is overwritten. The +% specified variable is deleted. Program is halted in case of error. + +delsubstvar(Verbosity, Package, Substvar) -> + SubstvarFile = filename:join("debian", Package ++ ".substvars"), + if Verbosity >= 1 -> + io:format("Deleting substvar ~s from file ~s~n", [Substvar, SubstvarFile]); + true -> + ok + end, + case file:read_file(SubstvarFile) of + {ok, BinData} -> + StrData = binary_to_list(BinData), + + % Remove the trailing newline if any + + Len = string:len(StrData), + StrData2 = case Len - string:rstr(StrData, "\n") of + 0 -> + string:left(StrData, Len - 1); + _ -> + StrData + end, + Tokens = split(StrData2, $\n), + NewTokens = lists:filter( + fun(S) -> + case string:str(S, Substvar ++ "=") of + 1 -> + false; + _ -> + true + end + end, Tokens), + case file:write_file(SubstvarFile, join(NewTokens, $\n) ++ "\n") of + ok -> + ok; + {error, Error} -> + io:format("ERROR: Can't write ~s: ~s~n", [SubstvarFile, Error]), + halt(1) + end; + {error, enoent} -> + ok; + {error, Error} -> + io:format("ERROR: Can't read ~s: ~s~n", [SubstvarFile, Error]), + halt(1) + end. + +% addsubstvar/4 -- +% +% Adds a dependency to a substitution variable in a substvar file +% for a given package in debian/ directory. +% +% Arguments: +% Verbosity Verbosity level (0 - silence, 1 - print action) +% Package Name of a package (file Package ++ ".substvars" is used). +% Substvar Name of a substitution variable to add/change. +% Dependency An added substitution dependency string. +% +% Results: +% ok or halt. +% +% Side effects: +% File "debian/" ++ Package ++ ".substvars" is overwritten. The specified +% depandency string is added to the variable. Program is halted in case +% of error. + +addsubstvar(Verbosity, Package, Substvar, Dependency) -> + SubstvarFile = filename:join("debian", Package ++ ".substvars"), + if Verbosity >= 1 -> + io:format("Adding value ~s to substvar ~s in file ~s~n", + [Substvar, Dependency, SubstvarFile]); + true -> + ok + end, + case file:read_file(SubstvarFile) of + {ok, BinData} -> + StrData = binary_to_list(BinData), + + % Remove the trailing newline if any + + Len = string:len(StrData), + StrData2 = case Len - string:rstr(StrData, "\n") of + 0 -> + string:left(StrData, Len - 1); + _ -> + StrData + end, + Tokens = split(StrData2, $\n), + {NewTokens, Found} = lists:mapfoldl( + fun(S, F) -> + case string:str(S, Substvar ++ "=") of + 1 -> + {S ++ ", " ++ Dependency, true}; + _ -> + {S, F} + end + end, false, Tokens), + NewTokens2 = if Found -> + NewTokens; + true -> + [Substvar ++ "=" ++ Dependency | NewTokens] + end, + case file:write_file(SubstvarFile, join(NewTokens2, $\n) ++ "\n") of + ok -> + ok; + {error, Error} -> + io:format("Can't write ~s: ~s~n", [SubstvarFile, Error]), + halt(1) + end; + {error, enoent} -> + case file:write_file(SubstvarFile, [Substvar, "=", Dependency, "\n"]) of + ok -> + ok; + {error, Error} -> + io:format("Can't write ~s: ~s~n", [SubstvarFile, Error]), + halt(1) + end; + {error, Error} -> + io:format("Can't read ~s: ~s~n", [SubstvarFile, Error]), + halt(1) + end. + +% get_packages/1 -- +% +% Parses debhelper command line options and debian/control file and +% returns packages to act on. +% +% Arguments: +% ArgList Dephelper options (only -a, -i, -p, -N options are +% recognised). +% +% Results: +% {ok, [Package_names]} to work on or error message and halt if +% debian/control is unreadable or unknown option is specified. +% +% Side effects: +% Program is halted in case of error. + +get_packages(ArgList) -> + ControlFile = filename:join("debian", "control"), + case file:read_file(ControlFile) of + {ok, BinData} -> + {Arches, Excluded, Explicit} = + lists:foldl(fun(Arg, {A1, E1, E2}) -> + case Arg of + % Only the last -a or -i option takes + % effect + + "-a" -> + {arch, E1, E2}; + "--arch" -> + {arch, E1, E2}; + "-i" -> + {indep, E1, E2}; + "--indep" -> + {indep, E1, E2}; + "-s" -> + io:format("Options -s and --same-arch aren't supported yet~n"), + halt(1); + "--same-arch" -> + io:format("Options -s and --same-arch aren't supported yet~n"), + halt(1); + "-p" ++ Package -> + {A1, E1, E2 ++ [Package]}; + "--package=" ++ Package -> + {A1, E1, E2 ++ [Package]}; + "-N" ++ Package -> + {A1, E1 ++ [Package], E2}; + "--no-package=" ++ Package -> + {A1, E1 ++ [Package], E2}; + _ -> + io:format("Unknown option ~s~n", [Arg]), + halt(1) + end + end, {all, [], []}, ArgList), + StrData = binary_to_list(BinData), + + % Add an extra empty line for the case if debian/config doesn't have a trailing LF + + Tokens = split(StrData, $\n) ++ [[]], + {_Arch, _Package, Packages, AllPackages} = + lists:foldl(fun(Line, {A, P, Ps, APs}) -> + case Line of + "Package: " ++ Pkg -> + {A, string:strip(Pkg), Ps, APs}; + "Architecture: " ++ Arc -> + {string:strip(Arc), P, Ps, APs}; + "" -> + case P of + "" -> + % Two LF in a row or the end of a source package + + {"", "", Ps, APs}; + _ -> + case lists:member(P, Excluded) of + true -> + % The package is excluded by -Npackage + + {"", "", Ps, APs}; + _ -> + case lists:member(P, Explicit) of + true -> + % The package is explicitly required + + {"", "", Ps ++ [P], APs}; + _ -> + case A of + "all" -> + case Arches of + indep -> + % Arch independent packages + % are requested + + {"", "", Ps ++ [P], APs}; + all -> + {"", "", Ps, APs ++ [P]}; + _ -> + {"", "", Ps, APs} + end; + _ -> + case Arches of + arch -> + % Arch dependent packages + % are requested + + {"", "", Ps ++ [P], APs}; + all -> + {"", "", Ps, APs ++ [P]}; + _ -> + {"", "", Ps, APs} + end + end + end + end + end; + _ -> + {A, P, Ps, APs} + end + end, {"", "", [], []}, Tokens), + case {Arches, Packages} of + {all, []} -> + % There aren't explicitly requested packages + + AllPackages; + _ -> + Packages + end; + {error, Error} -> + io:format("Can't read ~s: ~s~n", [ControlFile, Error]), + halt(1) + end. + +% files/3 -- +% +% Return all files in a directory which names match a given expression. +% (This procedure is borrowed from http://erlang.org/examples/examples-2.0.html +% and a bit modified.) +% +% Arguments: +% Dir Directory from which to serach +% Re Regular expression for filename matching +% Recursive Whether to search for files recursively +% +% Result: +% A list of filenames. +% +% Side effects: +% None. + +files(Dir, Re, Recursive) -> + find_files(Dir, Re, Recursive, []). + +find_files(Dir, Re, Recursive, L) -> + case file:list_dir(Dir) of + {ok, Files} -> + find_files(Files, Dir, Re, Recursive, L); + {error, _} -> + L + end. + +find_files([File | T], Dir, Re, Recursive, L) -> + FullName = filename:join(Dir, File), + case file_type(FullName) of + regular -> + case re:run(FullName, Re) of + {match, _} -> + find_files(T, Dir, Re, Recursive, [FullName | L]); + _ -> + find_files(T, Dir, Re, Recursive, L) + end; + directory -> + case Recursive of + true -> + L1 = find_files(FullName, Re, Recursive, L), + find_files(T, Dir, Re, Recursive, L1); + false -> + find_files(T, Dir, Re, Recursive, L) + end; + error -> + find_files(T, Dir, Re, Recursive, L) + end; + +find_files([], _, _, _, L) -> + L. + +% file_type/1 -- +% +% Return file type (regular, directory, or error) for a given filename. +% (This procedure is borrowed from http://erlang.org/examples/examples-2.0.html +% and a bit modified.) +% +% Arguments: +% File Filename to get type. +% +% Result: +% A file type. +% +% Side effects: +% None. + +file_type(File) -> + case file:read_file_info(File) of + {ok, FileInfo} -> + case FileInfo#file_info.type of + regular -> + regular; + directory -> + directory; + _ -> + error + end; + _ -> + error + end. + +% vim:ft=erlang diff -Nru erlang-13.b.1-dfsg/erts/aclocal.m4 erlang-13.b.3-dfsg/erts/aclocal.m4 --- erlang-13.b.1-dfsg/erts/aclocal.m4 2009-04-16 10:23:54.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/aclocal.m4 2009-09-18 15:07:59.000000000 +0100 @@ -647,9 +647,16 @@ AC_CHECK_FUNC(pthread_spin_lock, \ AC_DEFINE(ETHR_HAVE_PTHREAD_SPIN_LOCK, 1, \ [Define if you have the pthread_spin_lock function.])) - AC_CHECK_FUNC(pthread_rwlock_init, \ - AC_DEFINE(ETHR_HAVE_PTHREAD_RWLOCK_INIT, 1, \ -[Define if you have the pthread_rwlock_init function.])) + case $host_os in + linux*) # Writers may get starved + # TODO: write a test that tests the implementation + ;; + *) + AC_CHECK_FUNC(pthread_rwlock_init, \ + AC_DEFINE(ETHR_HAVE_PTHREAD_RWLOCK_INIT, 1, \ +[Define if you have a pthread_rwlock implementation that can be used.])) + ;; + esac AC_CHECK_FUNC(pthread_attr_setguardsize, \ AC_DEFINE(ETHR_HAVE_PTHREAD_ATTR_SETGUARDSIZE, 1, \ [Define if you have the pthread_attr_setguardsize function.])) diff -Nru erlang-13.b.1-dfsg/erts/config.h.in erlang-13.b.3-dfsg/erts/config.h.in --- erlang-13.b.1-dfsg/erts/config.h.in 2009-06-07 19:02:14.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/config.h.in 2009-11-24 10:12:53.000000000 +0000 @@ -95,7 +95,7 @@ /* Define if you have the pthread_mutexattr_settype function. */ #undef ETHR_HAVE_PTHREAD_MUTEXATTR_SETTYPE -/* Define if you have the pthread_rwlock_init function. */ +/* Define if you have a pthread_rwlock implementation that can be used. */ #undef ETHR_HAVE_PTHREAD_RWLOCK_INIT /* Define if you have the pthread_spin_lock function. */ @@ -141,6 +141,14 @@ /* Define if you have a putenv() that stores a copy of the key-value pair */ #undef HAVE_COPYING_PUTENV +/* Define to 1 if you have the declaration of `getrlimit', and to 0 if you + don't. */ +#undef HAVE_DECL_GETRLIMIT + +/* Define to 1 if you have the declaration of `RLIMIT_STACK', and to 0 if you + don't. */ +#undef HAVE_DECL_RLIMIT_STACK + /* Define to 1 if you have the declaration of `SCTP_ABORT', and to 0 if you don't. */ #undef HAVE_DECL_SCTP_ABORT @@ -165,6 +173,10 @@ you don't. */ #undef HAVE_DECL_SCTP_UNORDERED +/* Define to 1 if you have the declaration of `setrlimit', and to 0 if you + don't. */ +#undef HAVE_DECL_SETRLIMIT + /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H @@ -271,6 +283,9 @@ /* Define to 1 if you have the `util' library (-lutil). */ #undef HAVE_LIBUTIL +/* Define to 1 if you have the `z' library (-lz). */ +#undef HAVE_LIBZ + /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H @@ -432,6 +447,9 @@ */ #undef HAVE_SYS_NDIR_H +/* Define to 1 if you have the header file */ +#undef HAVE_SYS_RESOURCE_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKETIO_H diff -Nru erlang-13.b.1-dfsg/erts/configure erlang-13.b.3-dfsg/erts/configure --- erlang-13.b.1-dfsg/erts/configure 2009-06-07 19:02:14.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/configure 2009-11-24 10:12:52.000000000 +0000 @@ -309,7 +309,7 @@ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT ENABLE_ALLOC_TYPE_VARS PERFCTR_PATH OTP_RELEASE MIXED_CYGWIN_VC MIXED_CYGWIN_MINGW MIXED_CYGWIN DEBUG_FLAGS DEBUG_CFLAGS WFLAGS CFLAG_RUNTIME_LIBRARY_PATH CPP EGREP OPSYS ARCH RANLIB ac_ct_RANLIB YACC PERL LN_S AR RM MKDIR INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA INSTALL_DIR HCC HCFLAGS vxworks_reclaim LD ERLANG_OSTYPE DEXPORT ETHR_X_LIBS ETHR_LIBS ETHR_LIB_NAME ETHR_DEFS ETHR_THR_LIB_BASE ETHR_THR_LIB_BASE_NAME ERTS_BUILD_SMP_EMU EMU_THR_LIB_NAME EMU_THR_X_LIBS EMU_THR_LIBS EMU_THR_DEFS EMU_LOCK_CHECKING ERTS_INTERNAL_X_LIBS THR_LIBS THR_DEFS TERMCAP_LIB LIBSCTP HAVE_VALGRIND BITS64 LIBRT M4 TSP_APP ERTS_BUILD_HYBRID_EMU HIPE_HELPERS HIPE_ENABLED USE_PERFCTR ERTS_ENABLE_KERNEL_POLL DED_CFLAGS DED_LD DED_LDFLAGS DED_LD_FLAG_RUNTIME_LIBRARY_PATH STATIC_CFLAGS EMU_CC SSL_INCLUDE SSL_ROOT SSL_LIBDIR SSL_DYNAMIC_ONLY SSL_LINK_WITH_KERBEROS STATIC_KERBEROS_LIBS SSL_LINK_WITH_ZLIB STATIC_ZLIB_LIBS OPENSSL_CMD REGTOOL os_mon_programs CPU_SUP_LIBS JAVAC CXXFLAGS CXX CC32 CFLAGS32 LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT ENABLE_ALLOC_TYPE_VARS PERFCTR_PATH OTP_RELEASE MIXED_CYGWIN_VC MIXED_CYGWIN_MINGW MIXED_CYGWIN DEBUG_FLAGS DEBUG_CFLAGS WFLAGS CFLAG_RUNTIME_LIBRARY_PATH CPP EGREP OPSYS ARCH LIBCARBON RANLIB ac_ct_RANLIB YACC PERL LN_S AR RM MKDIR XSLTPROC FOP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA INSTALL_DIR HCC HCFLAGS vxworks_reclaim LD ERLANG_OSTYPE DEXPORT ETHR_X_LIBS ETHR_LIBS ETHR_LIB_NAME ETHR_DEFS ETHR_THR_LIB_BASE ETHR_THR_LIB_BASE_NAME ERTS_BUILD_SMP_EMU EMU_THR_LIB_NAME EMU_THR_X_LIBS EMU_THR_LIBS EMU_THR_DEFS EMU_LOCK_CHECKING ERTS_INTERNAL_X_LIBS THR_LIBS THR_DEFS TERMCAP_LIB Z_LIB LIBSCTP HAVE_VALGRIND BITS64 LIBRT M4 TSP_APP ERTS_BUILD_HYBRID_EMU HIPE_HELPERS HIPE_ENABLED NATIVE_LIBS_ENABLED USE_PERFCTR ERTS_ENABLE_KERNEL_POLL DED_CFLAGS DED_LD DED_LDFLAGS DED_LD_FLAG_RUNTIME_LIBRARY_PATH STATIC_CFLAGS EMU_CC SSL_INCLUDE SSL_ROOT SSL_LIBDIR SSL_DYNAMIC_ONLY SSL_LINK_WITH_KERBEROS STATIC_KERBEROS_LIBS SSL_LINK_WITH_ZLIB STATIC_ZLIB_LIBS OPENSSL_CMD REGTOOL os_mon_programs CPU_SUP_LIBS JAVAC CXXFLAGS CXX CC32 CFLAGS32 LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -859,6 +859,7 @@ --disable-sctp disable sctp support --enable-hipe enable hipe support --disable-hipe disable hipe support + --enable-native-libs compile Erlang libraries to native code --enable-tsp compile tsp app --enable-elib-malloc use elib_malloc instead of normal malloc --enable-fp-exceptions Use hardware floating point exceptions (default if hipe enabled) @@ -870,8 +871,10 @@ --enable-native-ethr-impls enable native ethread implementations --disable-native-ethr-impls disable native ethread implementations --disable-megaco-flex-scanner-lineno disable megaco flex scanner lineno + --enable-shared-zlib enable using shared zlib library + --disable-shared-zlib disable shared zlib, compile own zlib source (default) --enable-dynamic-ssl-lib enable using dynamic openssl libraries - --disable-dynamic-ssl-lib disable using dynamic openssl libraries + --disable-dynamic-ssl-lib disable using dynamic openssl libraries Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -2641,6 +2644,12 @@ fi; +# Check whether --enable-native-libs or --disable-native-libs was given. +if test "${enable_native_libs+set}" = set; then + enableval="$enable_native_libs" + +fi; + # Check whether --enable-tsp or --disable-tsp was given. if test "${enable_tsp+set}" = set; then enableval="$enable_tsp" @@ -2801,11 +2810,20 @@ esac fi if test X${enable_darwin_64bit} = Xyes; then - if test X"$TMPSYS" '!=' X"Darwin-i386"; then - { { echo "$as_me:$LINENO: error: --enable-darwin-64bit only supported on x86 host" >&5 -echo "$as_me: error: --enable-darwin-64bit only supported on x86 host" >&2;} + case "$TMPSYS" in + Darwin-i386|Darwin-x86_64) + ;; + Darwin*) + { { echo "$as_me:$LINENO: error: --enable-darwin-64bit only supported on x86 hosts" >&5 +echo "$as_me: error: --enable-darwin-64bit only supported on x86 hosts" >&2;} { (exit 1); exit 1; }; } - fi + ;; + *) + { { echo "$as_me:$LINENO: error: --enable-darwin-64bit only supported on Darwin" >&5 +echo "$as_me: error: --enable-darwin-64bit only supported on Darwin" >&2;} + { (exit 1); exit 1; }; } + ;; + esac fi if test X${enable_darwin_64bit} = Xyes -o X${enable_m64_build} = Xyes; then enable_hipe=no @@ -2816,6 +2834,20 @@ CFLAGS="-m64 $CFLAGS" ;; esac +else + case $host_os in + darwin*) + case $CFLAGS in + *-m32*) + ;; + *) + CFLAGS="-m32 $CFLAGS" + ;; + esac + ;; + *) + ;; + esac fi @@ -4755,6 +4787,14 @@ LDFLAGS="-arch i386 $LDFLAGS" ;; esac + else + case $LDFLAGS in + *-m32*) + ;; + *) + LDFLAGS="-m32 $LDFLAGS" + ;; + esac fi ;; *) @@ -4772,6 +4812,27 @@ ;; esac +echo "$as_me:$LINENO: checking if VM has to be linked with Carbon framework" >&5 +echo $ECHO_N "checking if VM has to be linked with Carbon framework... $ECHO_C" >&6 +case $ARCH-$OPSYS in + amd64-darwin*) + LIBCARBON= + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + *-darwin*) + LIBCARBON="-framework Carbon " + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + ;; + *) + LIBCARBON= + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; +esac + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -5337,6 +5398,107 @@ _search_path= +# +# Get programs needed for building the documentation +# + +## Delete previous failed configure results +if test -f doc/CONF_INFO; then + rm doc/CONF_INFO +fi + +for ac_prog in xsltproc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_XSLTPROC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$XSLTPROC"; then + ac_cv_prog_XSLTPROC="$XSLTPROC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_XSLTPROC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +XSLTPROC=$ac_cv_prog_XSLTPROC +if test -n "$XSLTPROC"; then + echo "$as_me:$LINENO: result: $XSLTPROC" >&5 +echo "${ECHO_T}$XSLTPROC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$XSLTPROC" && break +done + +if test -z "$XSLTPROC"; then + echo "xsltproc" >> doc/CONF_INFO + { echo "$as_me:$LINENO: WARNING: No 'xsltproc' command found: the documentation can not be built" >&5 +echo "$as_me: WARNING: No 'xsltproc' command found: the documentation can not be built" >&2;} +fi + +for ac_prog in fop +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_FOP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$FOP"; then + ac_cv_prog_FOP="$FOP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_FOP="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +FOP=$ac_cv_prog_FOP +if test -n "$FOP"; then + echo "$as_me:$LINENO: result: $FOP" >&5 +echo "${ECHO_T}$FOP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$FOP" && break +done + +if test -z "$FOP"; then + echo "fop" >> doc/CONF_INFO + { echo "$as_me:$LINENO: WARNING: No 'fop' command found: the documentation can not be built" >&5 +echo "$as_me: WARNING: No 'fop' command found: the documentation can not be built" >&2;} +fi + case $host in *-*-solaris*|free_source) if test -x /usr/ucb/install; then @@ -7495,7 +7657,12 @@ fi - echo "$as_me:$LINENO: checking for pthread_rwlock_init" >&5 + case $host_os in + linux*) # Writers may get starved + # TODO: write a test that tests the implementation + ;; + *) + echo "$as_me:$LINENO: checking for pthread_rwlock_init" >&5 echo $ECHO_N "checking for pthread_rwlock_init... $ECHO_C" >&6 if test "${ac_cv_func_pthread_rwlock_init+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -7594,6 +7761,8 @@ fi + ;; + esac echo "$as_me:$LINENO: checking for pthread_attr_setguardsize" >&5 echo $ECHO_N "checking for pthread_attr_setguardsize... $ECHO_C" >&6 if test "${ac_cv_func_pthread_attr_setguardsize+set}" = set; then @@ -8680,6 +8849,104 @@ fi +# Check whether --enable-shared-zlib or --disable-shared-zlib was given. +if test "${enable_shared_zlib+set}" = set; then + enableval="$enable_shared_zlib" + case "$enableval" in + no) enable_shared_zlib=no ;; + *) enable_shared_zlib=yes ;; + esac +else + enable_shared_zlib=no +fi; + +Z_LIB= + +if test "x$enable_shared_zlib" = "xyes" ; then + echo "$as_me:$LINENO: checking for adler32_combine in -lz" >&5 +echo $ECHO_N "checking for adler32_combine in -lz... $ECHO_C" >&6 +if test "${ac_cv_lib_z_adler32_combine+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char adler32_combine (); +int +main () +{ +adler32_combine (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_z_adler32_combine=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_z_adler32_combine=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_z_adler32_combine" >&5 +echo "${ECHO_T}$ac_cv_lib_z_adler32_combine" >&6 +if test $ac_cv_lib_z_adler32_combine = yes; then + Z_LIB="-lz" + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBZ 1 +_ACEOF + +else + { { echo "$as_me:$LINENO: error: cannot find any shared zlib" >&5 +echo "$as_me: error: cannot find any shared zlib" >&2;} + { (exit 1); exit 1; }; } +fi + +else + { echo "$as_me:$LINENO: Using own zlib source" >&5 +echo "$as_me: Using own zlib source" >&6;} +fi + + + #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right @@ -10390,6 +10657,368 @@ done +if test "${ac_cv_header_sys_resource_h+set}" = set; then + echo "$as_me:$LINENO: checking for sys/resource.h" >&5 +echo $ECHO_N "checking for sys/resource.h... $ECHO_C" >&6 +if test "${ac_cv_header_sys_resource_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_sys_resource_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_resource_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking sys/resource.h usability" >&5 +echo $ECHO_N "checking sys/resource.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking sys/resource.h presence" >&5 +echo $ECHO_N "checking sys/resource.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: sys/resource.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: sys/resource.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/resource.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: sys/resource.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: sys/resource.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: sys/resource.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/resource.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: sys/resource.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/resource.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: sys/resource.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/resource.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: sys/resource.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/resource.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: sys/resource.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/resource.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: sys/resource.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for sys/resource.h" >&5 +echo $ECHO_N "checking for sys/resource.h... $ECHO_C" >&6 +if test "${ac_cv_header_sys_resource_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_sys_resource_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_sys_resource_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_resource_h" >&6 + +fi +if test $ac_cv_header_sys_resource_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_RESOURCE_H 1 +_ACEOF + + echo "$as_me:$LINENO: checking whether getrlimit is declared" >&5 +echo $ECHO_N "checking whether getrlimit is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_getrlimit+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef getrlimit + char *p = (char *) getrlimit; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_getrlimit=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_getrlimit=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_getrlimit" >&5 +echo "${ECHO_T}$ac_cv_have_decl_getrlimit" >&6 +if test $ac_cv_have_decl_getrlimit = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETRLIMIT 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETRLIMIT 0 +_ACEOF + + +fi +echo "$as_me:$LINENO: checking whether setrlimit is declared" >&5 +echo $ECHO_N "checking whether setrlimit is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_setrlimit+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef setrlimit + char *p = (char *) setrlimit; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_setrlimit=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_setrlimit=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_setrlimit" >&5 +echo "${ECHO_T}$ac_cv_have_decl_setrlimit" >&6 +if test $ac_cv_have_decl_setrlimit = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SETRLIMIT 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SETRLIMIT 0 +_ACEOF + + +fi +echo "$as_me:$LINENO: checking whether RLIMIT_STACK is declared" >&5 +echo $ECHO_N "checking whether RLIMIT_STACK is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_RLIMIT_STACK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef RLIMIT_STACK + char *p = (char *) RLIMIT_STACK; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_RLIMIT_STACK=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_RLIMIT_STACK=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_STACK" >&5 +echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_STACK" >&6 +if test $ac_cv_have_decl_RLIMIT_STACK = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RLIMIT_STACK 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_RLIMIT_STACK 0 +_ACEOF + + +fi + + +fi + + + have_kernel_poll=no if test "${ac_cv_header_sys_event_h+set}" = set; then echo "$as_me:$LINENO: checking for sys/event.h" >&5 @@ -19730,7 +20359,7 @@ __asm__ __volatile__("ldmxcsr %0" : : "m"(mxcsr)); } -#if defined(__x86_64__) || defined(__DARWIN__) +#if defined(__x86_64__) static inline int cpu_has_sse2(void) { return 1; } @@ -19761,21 +20390,33 @@ static __inline__ unsigned int cpuid_eax(unsigned int op) { - unsigned int eax; - __asm__("cpuid" - : "=a"(eax) - : "0"(op) - : "bx", "cx", "dx"); + unsigned int eax, save_ebx; + + /* In PIC mode i386 reserves EBX. So we must save + and restore it ourselves to not upset gcc. */ + __asm__( + "movl %%ebx, %1\n\t" + "cpuid\n\t" + "movl %1, %%ebx" + : "=a"(eax), "=m"(save_ebx) + : "0"(op) + : "cx", "dx"); return eax; } static __inline__ unsigned int cpuid_edx(unsigned int op) { - unsigned int eax, edx; - __asm__("cpuid" - : "=a"(eax), "=d"(edx) - : "0"(op) - : "bx", "cx"); + unsigned int eax, edx, save_ebx; + + /* In PIC mode i386 reserves EBX. So we must save + and restore it ourselves to not upset gcc. */ + __asm__( + "movl %%ebx, %2\n\t" + "cpuid\n\t" + "movl %2, %%ebx" + : "=a"(eax), "=d"(edx), "=m"(save_ebx) + : "0"(op) + : "cx"); return edx; } @@ -20043,7 +20684,7 @@ #endif #elif defined(__DARWIN__) #if defined(__x86_64__) - mcontext_t mc = uc->uc_mcontext; + mcontext_t mc = uc->uc_mcontext; struct __darwin_x86_float_state64 *fpstate = &mc->__fs; fpstate->__fpu_mxcsr = 0x1F80; *(unsigned short *)&fpstate->__fpu_fsw &= ~0xFF; @@ -20382,6 +21023,15 @@ # +# Check if Erlang libraries should be compiled to native code. +# +NATIVE_LIBS_ENABLED= +if test X${enable_native_libs} = Xyes -a X${HIPE_ENABLED} = Xyes; then + NATIVE_LIBS_ENABLED=yes +fi + + +# # Check if HiPE should use a standard installation of perfctr. # @@ -20872,7 +21522,9 @@ # #-------------------------------------------------------------------- -DED_CFLAGS="$CFLAGS $CPPFLAGS $EMU_THR_DEFS" +DED_INCLUDE="-I${ERL_TOP}/erts/emulator/beam -I${ERL_TOP}/erts/include -I${ERL_TOP}/erts/include/$host" + +DED_CFLAGS="$DED_INCLUDE $CFLAGS $CPPFLAGS $EMU_THR_DEFS" if test "x$GCC" = xyes; then DED_CFLAGS="$DED_CFLAGS -fPIC" fi @@ -20917,6 +21569,11 @@ amd64) DED_LDFLAGS="-m64 $DED_LDFLAGS" ;; + *) + if test X${enable_darwin_universal} != Xyes; then + DED_LDFLAGS="-m32 $DED_LDFLAGS" + fi + ;; esac if test X${enable_darwin_universal} = Xyes; then DED_LDFLAGS="-arch ppc -arch i386 $DED_LDFLAGS" @@ -20928,7 +21585,7 @@ ;; linux*) DED_LD="$CC" - DED_LDFLAGS="-shared" + DED_LDFLAGS="-shared -Wl,-Bsymbolic" DED_LD_FLAG_RUNTIME_LIBRARY_PATH= if test X${enable_m64_build} = Xyes; then DED_LDFLAGS="-m64 $DED_LDFLAGS" @@ -21348,7 +22005,7 @@ echo "$as_me:$LINENO: checking for OpenSSL >= 0.9.7 in standard locations" >&5 echo $ECHO_N "checking for OpenSSL >= 0.9.7 in standard locations... $ECHO_C" >&6 for dir in $extra_dir /cygdrive/c/OpenSSL \ - /usr/local /usr/sfw /usr /usr/pkg \ + /usr/local /usr/sfw /opt/local /usr /usr/pkg \ /usr/local/openssl /usr/lib/openssl /usr/openssl \ /usr/local/ssl /usr/lib/ssl /usr/ssl do @@ -22035,7 +22692,7 @@ - ac_config_files="$ac_config_files emulator/$host/Makefile:emulator/Makefile.in emulator/zlib/$host/Makefile:emulator/zlib/Makefile.in emulator/pcre/$host/Makefile:emulator/pcre/Makefile.in epmd/src/$host/Makefile:epmd/src/Makefile.in etc/common/$host/Makefile:etc/common/Makefile.in include/internal/$host/ethread.mk:include/internal/ethread.mk.in lib_src/$host/Makefile:lib_src/Makefile.in Makefile:Makefile.in ../make/$host/otp.mk:../make/otp.mk.in ../lib/ic/c_src/$host/Makefile:../lib/ic/c_src/Makefile.in ../lib/os_mon/c_src/$host/Makefile:../lib/os_mon/c_src/Makefile.in ../lib/ssl/c_src/$host/Makefile:../lib/ssl/c_src/Makefile.in ../lib/ssl/examples/certs/$host/Makefile:../lib/ssl/examples/certs/Makefile.in ../lib/crypto/c_src/$host/Makefile:../lib/crypto/c_src/Makefile.in ../lib/orber/c_src/$host/Makefile:../lib/orber/c_src/Makefile.in ../lib/runtime_tools/c_src/$host/Makefile:../lib/runtime_tools/c_src/Makefile.in ../lib/tools/c_src/$host/Makefile:../lib/tools/c_src/Makefile.in ../lib/asn1/c_src/$host/Makefile:../lib/asn1/c_src/Makefile.in" + ac_config_files="$ac_config_files emulator/$host/Makefile:emulator/Makefile.in emulator/zlib/$host/Makefile:emulator/zlib/Makefile.in emulator/pcre/$host/Makefile:emulator/pcre/Makefile.in epmd/src/$host/Makefile:epmd/src/Makefile.in etc/common/$host/Makefile:etc/common/Makefile.in include/internal/$host/ethread.mk:include/internal/ethread.mk.in include/internal/$host/erts_internal.mk:include/internal/erts_internal.mk.in lib_src/$host/Makefile:lib_src/Makefile.in Makefile:Makefile.in ../make/$host/otp.mk:../make/otp.mk.in ../make/$host/otp_ded.mk:../make/otp_ded.mk.in ../lib/ic/c_src/$host/Makefile:../lib/ic/c_src/Makefile.in ../lib/os_mon/c_src/$host/Makefile:../lib/os_mon/c_src/Makefile.in ../lib/ssl/c_src/$host/Makefile:../lib/ssl/c_src/Makefile.in ../lib/ssl/examples/certs/$host/Makefile:../lib/ssl/examples/certs/Makefile.in ../lib/crypto/c_src/$host/Makefile:../lib/crypto/c_src/Makefile.in ../lib/orber/c_src/$host/Makefile:../lib/orber/c_src/Makefile.in ../lib/runtime_tools/c_src/$host/Makefile:../lib/runtime_tools/c_src/Makefile.in ../lib/tools/c_src/$host/Makefile:../lib/tools/c_src/Makefile.in ../lib/asn1/c_src/$host/Makefile:../lib/asn1/c_src/Makefile.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -22567,9 +23224,11 @@ "epmd/src/$host/Makefile" ) CONFIG_FILES="$CONFIG_FILES epmd/src/$host/Makefile:epmd/src/Makefile.in" ;; "etc/common/$host/Makefile" ) CONFIG_FILES="$CONFIG_FILES etc/common/$host/Makefile:etc/common/Makefile.in" ;; "include/internal/$host/ethread.mk" ) CONFIG_FILES="$CONFIG_FILES include/internal/$host/ethread.mk:include/internal/ethread.mk.in" ;; + "include/internal/$host/erts_internal.mk" ) CONFIG_FILES="$CONFIG_FILES include/internal/$host/erts_internal.mk:include/internal/erts_internal.mk.in" ;; "lib_src/$host/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib_src/$host/Makefile:lib_src/Makefile.in" ;; "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile:Makefile.in" ;; "../make/$host/otp.mk" ) CONFIG_FILES="$CONFIG_FILES ../make/$host/otp.mk:../make/otp.mk.in" ;; + "../make/$host/otp_ded.mk" ) CONFIG_FILES="$CONFIG_FILES ../make/$host/otp_ded.mk:../make/otp_ded.mk.in" ;; "../lib/ic/c_src/$host/Makefile" ) CONFIG_FILES="$CONFIG_FILES ../lib/ic/c_src/$host/Makefile:../lib/ic/c_src/Makefile.in" ;; "../lib/os_mon/c_src/$host/Makefile" ) CONFIG_FILES="$CONFIG_FILES ../lib/os_mon/c_src/$host/Makefile:../lib/os_mon/c_src/Makefile.in" ;; "../lib/ssl/c_src/$host/Makefile" ) CONFIG_FILES="$CONFIG_FILES ../lib/ssl/c_src/$host/Makefile:../lib/ssl/c_src/Makefile.in" ;; @@ -22695,6 +23354,7 @@ s,@EGREP@,$EGREP,;t t s,@OPSYS@,$OPSYS,;t t s,@ARCH@,$ARCH,;t t +s,@LIBCARBON@,$LIBCARBON,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@YACC@,$YACC,;t t @@ -22703,6 +23363,8 @@ s,@AR@,$AR,;t t s,@RM@,$RM,;t t s,@MKDIR@,$MKDIR,;t t +s,@XSLTPROC@,$XSLTPROC,;t t +s,@FOP@,$FOP,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t @@ -22729,6 +23391,7 @@ s,@THR_LIBS@,$THR_LIBS,;t t s,@THR_DEFS@,$THR_DEFS,;t t s,@TERMCAP_LIB@,$TERMCAP_LIB,;t t +s,@Z_LIB@,$Z_LIB,;t t s,@LIBSCTP@,$LIBSCTP,;t t s,@HAVE_VALGRIND@,$HAVE_VALGRIND,;t t s,@BITS64@,$BITS64,;t t @@ -22738,6 +23401,7 @@ s,@ERTS_BUILD_HYBRID_EMU@,$ERTS_BUILD_HYBRID_EMU,;t t s,@HIPE_HELPERS@,$HIPE_HELPERS,;t t s,@HIPE_ENABLED@,$HIPE_ENABLED,;t t +s,@NATIVE_LIBS_ENABLED@,$NATIVE_LIBS_ENABLED,;t t s,@USE_PERFCTR@,$USE_PERFCTR,;t t s,@ERTS_ENABLE_KERNEL_POLL@,$ERTS_ENABLE_KERNEL_POLL,;t t s,@DED_CFLAGS@,$DED_CFLAGS,;t t diff -Nru erlang-13.b.1-dfsg/erts/configure.in erlang-13.b.3-dfsg/erts/configure.in --- erlang-13.b.1-dfsg/erts/configure.in 2009-06-05 13:53:07.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/configure.in 2009-11-20 13:30:08.000000000 +0000 @@ -170,6 +170,9 @@ [ --enable-hipe enable hipe support --disable-hipe disable hipe support]) +AC_ARG_ENABLE(native-libs, +[ --enable-native-libs compile Erlang libraries to native code]) + AC_ARG_ENABLE(tsp, [ --enable-tsp compile tsp app]) @@ -287,9 +290,16 @@ esac fi if test X${enable_darwin_64bit} = Xyes; then - if test X"$TMPSYS" '!=' X"Darwin-i386"; then - AC_MSG_ERROR([--enable-darwin-64bit only supported on x86 host]) - fi + case "$TMPSYS" in + Darwin-i386|Darwin-x86_64) + ;; + Darwin*) + AC_MSG_ERROR([--enable-darwin-64bit only supported on x86 hosts]) + ;; + *) + AC_MSG_ERROR([--enable-darwin-64bit only supported on Darwin]) + ;; + esac fi if test X${enable_darwin_64bit} = Xyes -o X${enable_m64_build} = Xyes; then enable_hipe=no @@ -300,6 +310,20 @@ CFLAGS="-m64 $CFLAGS" ;; esac +else + case $host_os in + darwin*) + case $CFLAGS in + *-m32*) + ;; + *) + CFLAGS="-m32 $CFLAGS" + ;; + esac + ;; + *) + ;; + esac fi @@ -569,6 +593,14 @@ LDFLAGS="-arch i386 $LDFLAGS" ;; esac + else + case $LDFLAGS in + *-m32*) + ;; + *) + LDFLAGS="-m32 $LDFLAGS" + ;; + esac fi ;; *) @@ -584,7 +616,24 @@ fi ;; esac + +AC_MSG_CHECKING(if VM has to be linked with Carbon framework) +case $ARCH-$OPSYS in + amd64-darwin*) + LIBCARBON= + AC_MSG_RESULT([no]) + ;; + *-darwin*) + LIBCARBON="-framework Carbon " + AC_MSG_RESULT([yes]) + ;; + *) + LIBCARBON= + AC_MSG_RESULT([no]) + ;; +esac +AC_SUBST(LIBCARBON) dnl some tests below will call this if we haven't already - and autoconf dnl can't handle those tests being done conditionally at runtime @@ -619,6 +668,27 @@ _search_path= +# +# Get programs needed for building the documentation +# + +## Delete previous failed configure results +if test -f doc/CONF_INFO; then + rm doc/CONF_INFO +fi + +AC_CHECK_PROGS(XSLTPROC, xsltproc) +if test -z "$XSLTPROC"; then + echo "xsltproc" >> doc/CONF_INFO + AC_MSG_WARN([No 'xsltproc' command found: the documentation can not be built]) +fi + +AC_CHECK_PROGS(FOP, fop) +if test -z "$FOP"; then + echo "fop" >> doc/CONF_INFO + AC_MSG_WARN([No 'fop' command found: the documentation can not be built]) +fi + dnl dnl We can live with Solaris /usr/ucb/install dnl @@ -1045,6 +1115,30 @@ AC_DEFINE(HAVE_TERMCAP, 1, [Define if termcap functions exists]) fi +dnl ------------- +dnl zlib +dnl ------------- + +AC_ARG_ENABLE(shared-zlib, +[ --enable-shared-zlib enable using shared zlib library + --disable-shared-zlib disable shared zlib, compile own zlib source (default)], +[ case "$enableval" in + no) enable_shared_zlib=no ;; + *) enable_shared_zlib=yes ;; + esac ], enable_shared_zlib=no) + +Z_LIB= + +if test "x$enable_shared_zlib" = "xyes" ; then + AC_CHECK_LIB(z, adler32_combine, + [Z_LIB="-lz" + AC_DEFINE(HAVE_LIBZ, 1, [Define to 1 if you have the `z' library (-lz).])], + [AC_MSG_ERROR([cannot find any shared zlib])]) +else + AC_MSG_NOTICE([Using own zlib source]) +fi + +AC_SUBST(Z_LIB) dnl dnl This test kindly borrowed from Tcl @@ -1208,6 +1302,14 @@ net/errno.h malloc.h mach-o/dyld.h arpa/nameser.h \ pty.h util.h utmp.h langinfo.h) +AC_CHECK_HEADER(sys/resource.h, + [AC_DEFINE(HAVE_SYS_RESOURCE_H, 1, + [Define to 1 if you have the header file]) + AC_CHECK_DECLS([getrlimit, setrlimit, RLIMIT_STACK], + [],[], + [#include ])], + [],[]) + dnl Check if we have kernel poll support have_kernel_poll=no AC_CHECK_HEADER(sys/event.h, have_kernel_poll=kqueue) @@ -2108,7 +2210,7 @@ __asm__ __volatile__("ldmxcsr %0" : : "m"(mxcsr)); } -#if defined(__x86_64__) || defined(__DARWIN__) +#if defined(__x86_64__) static inline int cpu_has_sse2(void) { return 1; } @@ -2139,21 +2241,33 @@ static __inline__ unsigned int cpuid_eax(unsigned int op) { - unsigned int eax; - __asm__("cpuid" - : "=a"(eax) - : "0"(op) - : "bx", "cx", "dx"); + unsigned int eax, save_ebx; + + /* In PIC mode i386 reserves EBX. So we must save + and restore it ourselves to not upset gcc. */ + __asm__( + "movl %%ebx, %1\n\t" + "cpuid\n\t" + "movl %1, %%ebx" + : "=a"(eax), "=m"(save_ebx) + : "0"(op) + : "cx", "dx"); return eax; } static __inline__ unsigned int cpuid_edx(unsigned int op) { - unsigned int eax, edx; - __asm__("cpuid" - : "=a"(eax), "=d"(edx) - : "0"(op) - : "bx", "cx"); + unsigned int eax, edx, save_ebx; + + /* In PIC mode i386 reserves EBX. So we must save + and restore it ourselves to not upset gcc. */ + __asm__( + "movl %%ebx, %2\n\t" + "cpuid\n\t" + "movl %2, %%ebx" + : "=a"(eax), "=d"(edx), "=m"(save_ebx) + : "0"(op) + : "cx"); return edx; } @@ -2421,7 +2535,7 @@ #endif #elif defined(__DARWIN__) #if defined(__x86_64__) - mcontext_t mc = uc->uc_mcontext; + mcontext_t mc = uc->uc_mcontext; struct __darwin_x86_float_state64 *fpstate = &mc->__fs; fpstate->__fpu_mxcsr = 0x1F80; *(unsigned short *)&fpstate->__fpu_fsw &= ~0xFF; @@ -2676,6 +2790,15 @@ AC_SUBST(HIPE_ENABLED) # +# Check if Erlang libraries should be compiled to native code. +# +NATIVE_LIBS_ENABLED= +if test X${enable_native_libs} = Xyes -a X${HIPE_ENABLED} = Xyes; then + NATIVE_LIBS_ENABLED=yes +fi +AC_SUBST(NATIVE_LIBS_ENABLED) + +# # Check if HiPE should use a standard installation of perfctr. # AC_SUBST(USE_PERFCTR) @@ -2899,7 +3022,9 @@ # #-------------------------------------------------------------------- -DED_CFLAGS="$CFLAGS $CPPFLAGS $EMU_THR_DEFS" +DED_INCLUDE="-I${ERL_TOP}/erts/emulator/beam -I${ERL_TOP}/erts/include -I${ERL_TOP}/erts/include/$host" + +DED_CFLAGS="$DED_INCLUDE $CFLAGS $CPPFLAGS $EMU_THR_DEFS" if test "x$GCC" = xyes; then DED_CFLAGS="$DED_CFLAGS -fPIC" fi @@ -2944,6 +3069,11 @@ amd64) DED_LDFLAGS="-m64 $DED_LDFLAGS" ;; + *) + if test X${enable_darwin_universal} != Xyes; then + DED_LDFLAGS="-m32 $DED_LDFLAGS" + fi + ;; esac if test X${enable_darwin_universal} = Xyes; then DED_LDFLAGS="-arch ppc -arch i386 $DED_LDFLAGS" @@ -2955,7 +3085,7 @@ ;; linux*) DED_LD="$CC" - DED_LDFLAGS="-shared" + DED_LDFLAGS="-shared -Wl,-Bsymbolic" DED_LD_FLAG_RUNTIME_LIBRARY_PATH= if test X${enable_m64_build} = Xyes; then DED_LDFLAGS="-m64 $DED_LDFLAGS" @@ -3104,7 +3234,7 @@ AC_ARG_ENABLE(dynamic-ssl-lib, [ --enable-dynamic-ssl-lib enable using dynamic openssl libraries - --disable-dynamic-ssl-lib disable using dynamic openssl libraries], + --disable-dynamic-ssl-lib disable using dynamic openssl libraries], [ case "$enableval" in no) enable_dynamic_ssl=no ;; *) enable_dynamic_ssl=yes ;; @@ -3164,7 +3294,7 @@ AC_MSG_CHECKING(for OpenSSL >= 0.9.7 in standard locations) for dir in $extra_dir /cygdrive/c/OpenSSL \ - /usr/local /usr/sfw /usr /usr/pkg \ + /usr/local /usr/sfw /opt/local /usr /usr/pkg \ /usr/local/openssl /usr/lib/openssl /usr/openssl \ /usr/local/ssl /usr/lib/ssl /usr/ssl do @@ -3621,9 +3751,11 @@ epmd/src/$host/Makefile:epmd/src/Makefile.in etc/common/$host/Makefile:etc/common/Makefile.in include/internal/$host/ethread.mk:include/internal/ethread.mk.in + include/internal/$host/erts_internal.mk:include/internal/erts_internal.mk.in lib_src/$host/Makefile:lib_src/Makefile.in Makefile:Makefile.in ../make/$host/otp.mk:../make/otp.mk.in + ../make/$host/otp_ded.mk:../make/otp_ded.mk.in dnl dnl The ones below should be moved to their respective lib dnl diff -Nru erlang-13.b.1-dfsg/erts/doc/src/absform.xml erlang-13.b.3-dfsg/erts/doc/src/absform.xml --- erlang-13.b.1-dfsg/erts/doc/src/absform.xml 2009-03-12 12:15:16.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/absform.xml 2009-11-20 13:31:25.000000000 +0000 @@ -29,7 +29,7 @@ 00-12-01 A - absform.sgml + absform.xml

This document describes the standard representation of parse trees for Erlang diff -Nru erlang-13.b.1-dfsg/erts/doc/src/alt_dist.xml erlang-13.b.3-dfsg/erts/doc/src/alt_dist.xml --- erlang-13.b.1-dfsg/erts/doc/src/alt_dist.xml 2009-03-12 12:15:16.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/alt_dist.xml 2009-11-20 13:31:04.000000000 +0000 @@ -29,7 +29,7 @@ 2000-10-17 PA2 - alt_dist.sgml + alt_dist.xml

This document describes how one can implement ones own carrier protocol for the Erlang distribution. The distribution is normally @@ -41,7 +41,15 @@ sockets and is written for the Sun Solaris 2 operating environment. The mechanisms are however general and applies to any operating system Erlang runs on. The reason the C code is not made portable, is simply readability.

-

+

This document was written a long time ago. Most of it is still + valid, but some things have changed since it was first written. + Most notably the driver interface. There have been some updates + to the documentation of the driver presented in this documentation, + but more could be done and are planned for the future. The + reader is encouraged to also read the + erl_driver, and the + driver_entry documentation. +

Introduction @@ -70,7 +78,7 @@ functionality of the driver separately. This interface can then be used by the distribution module which will cover the details of the protocol from the . The easiest path is to - mimic the and interfaces, but a lot of + mimic the and interfaces, but a lot of functionality in those modules need not be implemented. In the example application, only a few of the usual interfaces are implemented, and they are much simplified.

@@ -188,7 +196,7 @@ descriptors. If the queue utility available to driver writes is used, this routine will however not be called until the queue is empty. - When an Erlang process calls , + When an Erlang process calls erlang:port_control/3, which is a synchronous interface to drivers. The control interface is used to set driver options, change states of ports etc. We'll use this interface quite a lot in our example. @@ -249,22 +257,34 @@ (24) /* The driver entry */ (25) static ErlDrvEntry uds_driver_entry = { -(26) NULL, /* init, N/A */ -(27) uds_start, /* start, called when port is opened */ -(28) uds_stop, /* stop, called when port is closed */ -(29) uds_command, /* output, called when erlang has sent */ -(30) uds_input, /* ready_input, called when input descriptor -(31) ready */ -(32) uds_output, /* ready_output, called when output -(33) descriptor ready */ -(34) "uds_drv", /* char *driver_name, the argument -(35) to open_port */ -(36) uds_finish, /* finish, called when unloaded */ -(37) NULL, /* void * that is not used (BC) */ -(38) uds_control, /* control, port_control callback */ -(39) NULL, /* timeout, called on timeouts */ -(40) NULL /* outputv, vector output interface */ -(41) }; ]]> +(26) NULL, /* init, N/A */ +(27) uds_start, /* start, called when port is opened */ +(28) uds_stop, /* stop, called when port is closed */ +(29) uds_command, /* output, called when erlang has sent */ +(30) uds_input, /* ready_input, called when input +(31) descriptor ready */ +(32) uds_output, /* ready_output, called when output +(33) descriptor ready */ +(34) "uds_drv", /* char *driver_name, the argument +(35) to open_port */ +(36) uds_finish, /* finish, called when unloaded */ +(37) NULL, /* void * that is not used (BC) */ +(38) uds_control, /* control, port_control callback */ +(39) NULL, /* timeout, called on timeouts */ +(40) NULL, /* outputv, vector output interface */ +(41) NULL, /* ready_async callback */ +(42) NULL, /* flush callback */ +(43) NULL, /* call callback */ +(44) NULL, /* event callback */ +(45) ERL_DRV_EXTENDED_MARKER, /* Extended driver interface marker */ +(46) ERL_DRV_EXTENDED_MAJOR_VERSION, /* Major version number */ +(47) ERL_DRV_EXTENDED_MINOR_VERSION, /* Minor version number */ +(48) ERL_DRV_FLAG_SOFT_BUSY, /* Driver flags. Soft busy flag is +(49) required for distribution drivers */ +(50) NULL, /* Reserved for internal use */ +(51) NULL, /* process_exit callback */ +(52) NULL /* stop_select callback */ +(53) };]]>

On line 1 to 10 we have included the OS headers needed for our driver. As this driver is written for Solaris, we know that the header exists, why we can define the preprocessor @@ -275,19 +295,46 @@

The different call-back functions are declared ("forward declarations") on line 16 to 23.

The driver structure is similar for statically linked in - drivers an dynamically loaded. However some of the fields + drivers and dynamically loaded. However some of the fields should be left empty (i.e. initialized to NULL) in the different types of drivers. The first field (the function pointer) is always left blank in a dynamically loaded driver, which can be seen on line 26. The NULL on line 37 should always be there, the field is no longer used and is retained for backward compatibility. We use no timers in this - driver, why no call-back for timers is needed. The last field + driver, why no call-back for timers is needed. The outputv field (line 40) can be used to implement an interface similar to - Unix for output. There is no need for such - interface in a distribution driver, so we leave it with a NULL - value (We will however use scatter/gather I/O internally in - the driver).

+ Unix for output. The Erlang runtime + system could previously not use outputv for the + distribution, but since erts version 5.7.2 it can. + Since this driver was written before erts version 5.7.2 it does + not use the outputv callback. Using the outputv + callback is preferred since it reduces copying of data. (We + will however use scatter/gather I/O internally in the driver).

+

As of erts version 5.5.3 the driver interface was extended with + version control and the possibility to pass capability information. + Capability flags are present at line 48. As of erts version 5.7.4 + the + ERL_DRV_FLAG_SOFT_BUSY + flag is required for drivers that are to be used by the distribution. + The soft busy flag implies that the driver is capable of handling + calls to the output and outputv callbacks even though + it has marked itself as busy. This has always been a requirement + on drivers used by the distribution, but there have previously not + been any capability information available about this. For more + information see + set_busy_port()). +

+

This driver was written before the runtime system had SMP support. + The driver will still function in the runtime system with SMP support, + but performance will suffer from lock contention on the driver lock + used for the driver. This can be alleviated by reviewing and perhaps + rewriting the code so that each instance of the driver safely can + execute in parallel. When instances safely can execute in parallel it + is safe to enable instance specific locking on the driver. This is done + by passing + ERL_DRV_FLAG_USE_PORT_LOCKING + as a driver flag. This is left as an exercise for the reader.

Our defined call-backs thus are:

uds_start, which shall initiate data for a port. We wont @@ -305,7 +352,7 @@ distribution driver will actually (or hopefully) never be unloaded, but we include this for completeness. Being able to clean up after oneself is always a good thing. - uds_control, the call-back, which + uds_control, the erlang:port_control/2 call-back, which will be used a lot in this implementation.

The ports implemented by this driver will operate in two major @@ -451,8 +498,8 @@ distribution, as the only thing that interests the Erlang distribution is if this value has changed (the Erlang net_kernel ticker uses this value by calling the - driver to fetch it, which is done through the driver_control - routine). + driver to fetch it, which is done through the + erlang:port_control routine). received - How many bytes that are read (received) from the socket, used in similar ways as . partner - A pointer to another port structure, which is @@ -861,7 +908,7 @@ do.

The driver implements a control interface, which is a synchronous interface called when Erlang calls - . This is the only interface + . This is the only interface that can control the driver when it is in data mode and it may be called with the following opcodes:

@@ -881,7 +928,15 @@ 0. Ticking is done when the port is in data mode, so the command for sending data cannot be used (besides it ignores zero length packages in command mode). This is used by the - ticker to send dummy data when no other traffic is present.
+ ticker to send dummy data when no other traffic is present. + Note that it is important that the interface for + sending ticks is not blocking. This implementation uses + erlang:port_control/3 which does not block the caller. + If erlang:port_command is used, use + erlang:port_command/3 and pass [force] as + option list; otherwise, the caller can be blocked indefinitely + on a busy port and prevent the system from taking down a + connection that is not functioning. 'R': Get creation number of listen socket, which is used to dig out the number stored in the lock file to differentiate between invocations of Erlang nodes with the same name.\011 diff -Nru erlang-13.b.1-dfsg/erts/doc/src/book.xml erlang-13.b.3-dfsg/erts/doc/src/book.xml --- erlang-13.b.1-dfsg/erts/doc/src/book.xml 2009-03-12 12:15:16.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/book.xml 2009-11-20 13:30:19.000000000 +0000 @@ -1,7 +1,7 @@ - +
19972009 @@ -26,7 +26,7 @@ 1997-05-02 4.5.2 - book.sgml + book.xml
@@ -35,11 +35,14 @@ - + - + + + +
diff -Nru erlang-13.b.1-dfsg/erts/doc/src/crash_dump.xml erlang-13.b.3-dfsg/erts/doc/src/crash_dump.xml --- erlang-13.b.1-dfsg/erts/doc/src/crash_dump.xml 2009-03-12 12:15:17.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/crash_dump.xml 2009-11-20 13:30:59.000000000 +0000 @@ -29,7 +29,7 @@ 1999-11-11 PA1 - crash_dump.sgml + crash_dump.xml

This document describes the file generated upon abnormal exit of the Erlang runtime system.

@@ -90,7 +90,7 @@ to allocate memory, <N> is the number of bytes that <A> tried to allocate, and <T> is the memory block type that the memory was needed for. The most common case is - that a process stores hugh amounts of data. In this case + that a process stores huge amounts of data. In this case <T> is most often , , , or . For more information on allocators see @@ -385,7 +385,7 @@ flag. States the channel number for the node. =not_connected:<channel> Heading for a node which is has been connected to the crashed - node earlier. References (i.e. process or port identitifiers) + node earlier. References (i.e. process or port identifiers) to the not connected node existed at the time of the crash. exist. States the channel number for the node. Name diff -Nru erlang-13.b.1-dfsg/erts/doc/src/driver_entry.xml erlang-13.b.3-dfsg/erts/doc/src/driver_entry.xml --- erlang-13.b.1-dfsg/erts/doc/src/driver_entry.xml 2009-03-12 12:15:17.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/driver_entry.xml 2009-11-20 13:31:19.000000000 +0000 @@ -1,7 +1,7 @@ - + - +
20012009 @@ -29,10 +29,10 @@ 2001-10-01 PA1 - driver_entry.sgml + driver_entry.xml
- driver_entry - The driver-entry structure used by erlang drivers. + driver_entry + The driver-entry structure used by erlang drivers.

As of erts version 5.5.3 the driver interface has been extended (see extended marker). @@ -43,448 +43,404 @@ to the runtime system at driver initialization, and some new driver API functions.

-

Old drivers (compiled with an from an +

Old drivers (compiled with an erl_driver.h from an earlier erts version than 5.5.3) have to be recompiled (but does not have to use the extended interface).

-

The structure is a C struct that all erlang +

The driver_entry structure is a C struct that all erlang drivers defines. It contains entry points for the erlang driver that are called by the erlang emulator when erlang code accesses the driver.

-

- +

+ The erl_driver driver API functions needs a port handle that identifies the driver instance (and the port in the - emulator). This is only passed to the function, but - not to the other functions. The function returns a + emulator). This is only passed to the start function, but + not to the other functions. The start function returns a driver-defined handle that is passed to the other functions. A - common practice is to have the function allocating - some application-defined structure and stash the + common practice is to have the start function allocating + some application-defined structure and stash the port handle in it, to use it later with the driver API functions.

The driver call-back functions are called synchronously from the erlang emulator. If they take too long before completing, they can cause timeouts in the emulator. Use the queue or - asynchronous calls if nessecary, since the emulator must be + asynchronous calls if necessary, since the emulator must be responsive.

The driver structure contains the name of the driver and some 15 function pointers. These pointers are called at different times by the emulator.

The only exported function from the driver is - . This function returns the + driver_init. This function returns the driver_entry structure that points to the other functions in the driver. The - function is declared with a macro - . (This is because different OS's + driver_init function is declared with a macro + DRIVER_INIT(drivername). (This is because different OS's have different names for it.)

When writing a driver in C++, the driver entry should be of - linkage. One way to do this is to put this line + "C" linkage. One way to do this is to put this line somewhere before the driver entry: - .

-

When the driver has passed the over to + extern "C" DRIVER_INIT(drivername);.

+

When the driver has passed the driver_entry over to the emulator, the driver is not allowed to modify the - .

+ driver_entry.

-

Do not declare the . This since the emulator needs to - modify the , and the - fields. A statically allocated, and - declared may be located in +

Do not declare the driver_entryconst. This since the emulator needs to + modify the handle, and the handle2 + fields. A statically allocated, and const + declared driver_entry may be located in read only memory which will cause the emulator to crash.

-

Here is the declaration of :

- + +
+ DATA TYPES + + ErlDrvEntry + +

+ typedef struct erl_drv_entry { - int (*init)(void);\011\011/* called at system start up for statically -\011\011\011\011 linked drivers, and after loading for -\011\011\011\011 dynamically loaded drivers */ + int (*init)(void); /* called at system start up for statically + linked drivers, and after loading for + dynamically loaded drivers */ #ifndef ERL_SYS_DRV ErlDrvData (*start)(ErlDrvPort port, char *command); -\011\011\011\011/* called when open_port/2 is invoked. -\011\011\011\011 return value -1 means failure. */ + /* called when open_port/2 is invoked. + return value -1 means failure. */ #else ErlDrvData (*start)(ErlDrvPort port, char *command, SysDriverOpts* opts); -\011\011\011\011/* special options, only for system driver */ + /* special options, only for system driver */ #endif void (*stop)(ErlDrvData drv_data); /* called when port is closed, and when the -\011\011\011\011 emulator is halted. */ + emulator is halted. */ void (*output)(ErlDrvData drv_data, char *buf, int len); -\011\011\011\011/* called when we have output from erlang to -\011\011\011\011 the port */ + /* called when we have output from erlang to + the port */ void (*ready_input)(ErlDrvData drv_data, ErlDrvEvent event); -\011\011\011\011/* called when we have input from one of -\011\011\011\011 the driver's handles) */ + /* called when we have input from one of + the driver's handles) */ void (*ready_output)(ErlDrvData drv_data, ErlDrvEvent event); -\011\011\011\011/* called when output is possible to one of -\011\011\011\011 the driver's handles */ - char *driver_name;\011\011/* name supplied as command -\011\011\011\011 in open_port XXX ? */ + /* called when output is possible to one of + the driver's handles */ + char *driver_name; /* name supplied as command + in open_port XXX ? */ void (*finish)(void); /* called before unloading the driver - -\011\011\011\011 DYNAMIC DRIVERS ONLY */ - void *handle;\011\011/* Reserved -- Used by emulator internally */ + DYNAMIC DRIVERS ONLY */ + void *handle; /* Reserved -- Used by emulator internally */ int (*control)(ErlDrvData drv_data, unsigned int command, char *buf, -\011\011 int len, char **rbuf, int rlen); -\011\011\011\011/* "ioctl" for drivers - invoked by -\011\011\011\011 port_control/3) */ - void (*timeout)(ErlDrvData drv_data);\011/* Handling of timeout in driver */ + int len, char **rbuf, int rlen); + /* "ioctl" for drivers - invoked by + port_control/3) */ + void (*timeout)(ErlDrvData drv_data); /* Handling of timeout in driver */ void (*outputv)(ErlDrvData drv_data, ErlIOVec *ev); -\011\011\011\011/* called when we have output from erlang -\011\011\011\011 to the port */ + /* called when we have output from erlang + to the port */ void (*ready_async)(ErlDrvData drv_data, ErlDrvThreadData thread_data); void (*flush)(ErlDrvData drv_data); /* called when the port is about to be -\011\011\011\011 closed, and there is data in the -\011\011\011\011 driver queue that needs to be flushed -\011\011\011\011 before 'stop' can be called */ + closed, and there is data in the + driver queue that needs to be flushed + before 'stop' can be called */ int (*call)(ErlDrvData drv_data, unsigned int command, char *buf, -\011\011 int len, char **rbuf, int rlen, unsigned int *flags); + int len, char **rbuf, int rlen, unsigned int *flags); /* Works mostly like 'control', a syncronous -\011\011\011\011 call into the driver. */ + call into the driver. */ void (*event)(ErlDrvData drv_data, ErlDrvEvent event, -\011\011 ErlDrvEventData event_data); + ErlDrvEventData event_data); /* Called when an event selected by -\011\011\011\011 driver_event() has occurred */ - int extended_marker;\011/* ERL_DRV_EXTENDED_MARKER */ - int major_version;\011\011/* ERL_DRV_EXTENDED_MAJOR_VERSION */ - int minor_version;\011\011/* ERL_DRV_EXTENDED_MINOR_VERSION */ - int driver_flags;\011\011/* ERL_DRV_FLAGs */ - void *handle2;\011\011/* Reserved -- Used by emulator internally */ + driver_event() has occurred */ + int extended_marker; /* ERL_DRV_EXTENDED_MARKER */ + int major_version; /* ERL_DRV_EXTENDED_MAJOR_VERSION */ + int minor_version; /* ERL_DRV_EXTENDED_MINOR_VERSION */ + int driver_flags; /* ERL_DRV_FLAGs */ + void *handle2; /* Reserved -- Used by emulator internally */ void (*process_exit)(ErlDrvData drv_data, ErlDrvMonitor *monitor); /* Called when a process monitor fires */ void (*stop_select)(ErlDrvEvent event, void* reserved); /* Called to close an event object */ } ErlDrvEntry; - ]]> - - - - int init(void) - Called after loading of driver - - + +

+ + int (*init)(void) +

This is called directly after the driver has been loaded by - . (Actually when the driver is + erl_ddll:load_driver/2. (Actually when the driver is added to the driver list.) The driver should return 0, or if the driver can't initialize, -1.

- - - - int start(ErlDrvPort port, char* command) - Called when port is opened - - + + int (*start)(ErlDrvPort port, char* command) +

This is called when the driver is instantiated, when - is called. The driver should return a + open_port/2 is called. The driver should return a number >= 0 or a pointer, or if the driver can't be started, one of three error codes should be returned:

ERL_DRV_ERROR_GENERAL - general error, no error code

ERL_DRV_ERROR_ERRNO - error with error code in erl_errno

ERL_DRV_ERROR_BADARG - error, badarg

If an error code is returned, the port isn't started.

-
-
- - void stop(ErlDrvData drv_data) - Called when port is closed - - + + void (*stop)(ErlDrvData drv_data) +

This is called when the port is closed, with - or . Note + port_close/1 or Port ! {self(), close}. Note that terminating the port owner process also closes the p\011 port.

-
-
- - void output(ErlDrvData drv_data, char *buf, int len) - Called when port is written to - - + + void (*output)(ErlDrvData drv_data, char *buf, int len) +

This is called when an erlang process has sent data to the - port. The data is pointed to by , and is - bytes. Data is sent to the port with , or with - . Depending on how the port was opened, + port. The data is pointed to by buf, and is + len bytes. Data is sent to the port with Port ! {self(), {command, Data}}, or with + port_command/2. Depending on how the port was opened, it should be either a list of integers 0...255 or a - binary. See and .

-
-
- - void ready_input(ErlDrvData drv_data, ErlDrvEvent event) - void ready_output(ErlDrvData drv_data, ErlDrvEvent event) - Called when the driver event for input or output is signaled - - - + binary. See open_port/3 and port_command/2.

+ + + void (*ready_input)(ErlDrvData drv_data, ErlDrvEvent event) + void (*ready_output)(ErlDrvData drv_data, ErlDrvEvent event) +

This is called when a driver event (given in the - parameter) is signaled. This is used to help + event parameter) is signaled. This is used to help asynchronous drivers "wake up" when something happens.

-

On unix the is a pipe or socket handle (or - something that the system call understands).

-

On Windows the is an Event or Semaphore (or - something that the API +

On unix the event is a pipe or socket handle (or + something that the select system call understands).

+

On Windows the event is an Event or Semaphore (or + something that the WaitForMultipleObjects API function understands). (Some trickery in the emulator allows - more than the built-in limit of 64 to be used.)

+ more than the built-in limit of 64 Events to be used.)

To use this with threads and asynchronous routines, create a pipe on unix and an Event on Windows. When the routine - completes, write to the pipe (use on + completes, write to the pipe (use SetEvent on Windows), this will make the emulator call - or .

-
-
- - char *driver_name - The name of the driver - - + ready_input or ready_output.

+ + char *driver_name +

This is the name of the driver, it must correspond to the - atom used in , and the name of the driver + atom used in open_port, and the name of the driver library file (without the extension).

-
-
- - void finish(void) - Called just before the dynamic driver is unloaded - - -

This function is called by the driver when the + + void (*finish)(void) + +

This function is called by the erl_ddll driver when the driver is unloaded. (It is only called in dynamic drivers.)

The driver is only unloaded as a result of calling - , or when the emulator halts.

-
-
- - void *handle - Reserved, initialize to - + unload_driver/1, or when the emulator halts.

+ + void *handle +

This field is reserved for the emulators internal use. The emulator will modify this field; therefore, it is important - that the isn't declared .

-
-
- - int control(ErlDrvData drv_data, unsigned int command, char *buf, int len, char **rbuf, int rlen) - Invoked with - - + that the driver_entry isn't declared const.

+ + int (*control)(ErlDrvData drv_data, unsigned int command, char *buf, int len, char **rbuf, int rlen) +

This is a special routine invoked with the erlang function - . It works a little like an "ioctl" for - erlang drivers. The data given to - arrives in and . The driver may send - data back, using and .

+ port_control/3. It works a little like an "ioctl" for + erlang drivers. The data given to port_control/3 + arrives in buf and len. The driver may send + data back, using *rbuf and rlen.

This is the fastest way of calling a driver and get a response. It won't make any context switch in the erlang emulator, and requires no message passing. It is suitable for calling C function to get faster execution, when erlang is too slow.

If the driver wants to return data, it should return it in - . When is called, - * points to a default buffer of bytes, which + rbuf. When control is called, + *rbuf points to a default buffer of rlen bytes, which can be used to return data. Data is returned different depending on the port control flags (those that are set with set_port_control_flags).

-

If the flag is set to , +

If the flag is set to PORT_CONTROL_FLAG_BINARY, a binary will be returned. Small binaries can be returned by writing the raw data into the default buffer. A binary can also be - returned by setting * to point to a binary allocated with + returned by setting *rbuf to point to a binary allocated with driver_alloc_binary. - This binary will be freed automatically after has returned. + This binary will be freed automatically after control has returned. The driver can retain the binary for read only access with driver_binary_inc_refc to be freed later with driver_free_binary. - It is never allowed to alter the binary after has returned. - If * is set to NULL, an empty list will be returned. + It is never allowed to alter the binary after control has returned. + If *rbuf is set to NULL, an empty list will be returned.

-

If the flag is set to , data is returned as a +

If the flag is set to 0, data is returned as a list of integers. Either use the default buffer or set - * to point to a larger buffer allocated with + *rbuf to point to a larger buffer allocated with driver_alloc. - The buffer will be freed automatically after has returned.

+ The buffer will be freed automatically after control has returned.

Using binaries is faster if more than a few bytes are returned.

The return value is the number of bytes returned in - .

-
-
- - void timeout(ErlDrvData drv_data) - Called when timer reaches 0 - - + *rbuf.

+ + + void (*timeout)(ErlDrvData drv_data) +

This function is called any time after the driver's timer - reaches 0. The timer is activeated with - . There are no priorities or ordering + reaches 0. The timer is activated with + driver_set_timer. There are no priorities or ordering among drivers, so if several drivers time out at the same time, any one of them is called first.

-
-
- - void outputv(ErlDrvData drv_data, ErlIOVec *ev) - Called when the port is written to - - + + + void (*outputv)(ErlDrvData drv_data, ErlIOVec *ev) +

This function is called whenever the port is written to. If - it is , the function is called - instead. This function is faster than , because - it takes an directly, which requires no + it is NULL, the output function is called + instead. This function is faster than output, because + it takes an ErlIOVec directly, which requires no copying of the data. The port should be in binary mode, see - .

-

The contains both a , - suitable for , and one or more binaries. If + open_port/2.

+

The ErlIOVec contains both a SysIOVec, + suitable for writev, and one or more binaries. If these binaries should be retained, when the driver returns - from , they can be queued (using driver_enq_bin + from outputv, they can be queued (using driver_enq_bin for instance), or if they are kept in a static or global variable, the reference counter can be incremented.

-
-
- - void ready_async(ErlDrvData drv_data, ErlDrvThreadData thread_data) - Called when an asynchronous call has returned - - + + void (*ready_async)(ErlDrvData drv_data, ErlDrvThreadData thread_data) +

This function is called after an asynchronous call has completed. The asynchronous call is started with driver_async. This function is called from the erlang emulator thread, as opposed to the asynchronous function, which is called in some thread (if multithreading is enabled).

-
-
- - int call(ErlDrvData drv_data, unsigned int command, char *buf, int len, char **rbuf, int rlen, unsigned int *flags) - Synchronous call with term conversion - - -

This function is called from . It - works a lot like the call-back, but uses the + + int (*call)(ErlDrvData drv_data, unsigned int command, char *buf, int len, char **rbuf, int rlen, unsigned int *flags) + +

This function is called from erlang:port_call/3. It + works a lot like the control call-back, but uses the external term format for input and output.

-

is an integer, obtained from the call from - erlang (the second argument to ).

-

and provide the arguments to the call - (the third argument to ). They can - be decoded using functions.

-

points to a return buffer, bytes +

command is an integer, obtained from the call from + erlang (the second argument to erlang:port_call/3).

+

buf and len provide the arguments to the call + (the third argument to erlang:port_call/3). They can + be decoded using ei functions.

+

rbuf points to a return buffer, rlen bytes long. The return data should be a valid erlang term in the external (binary) format. This is converted to an erlang - term and returned by to the - caller. If more space than bytes is needed to - return data, can be set to memory allocated with - . This memory will be freed automatically - after has returned.

+ term and returned by erlang:port_call/3 to the + caller. If more space than rlen bytes is needed to + return data, *rbuf can be set to memory allocated with + driver_alloc. This memory will be freed automatically + after call has returned.

The return value is the number of bytes returned in - . If is returned - (or in fact, anything < 0), will - throw a .

-
-
- - void event(ErlDrvData drv_data, ErlDrvEvent event, ErlDrvEventData event_data) - - + *rbuf. If ERL_DRV_ERROR_GENERAL is returned + (or in fact, anything < 0), erlang:port_call/3 will + throw a BAD_ARG.

+ + void (*event)(ErlDrvData drv_data, ErlDrvEvent event, ErlDrvEventData event_data) +

Intentionally left undocumented.

-
-
- - int extended_marker - Extended driver marker - - -

This field should either be equal to - or . An old driver (not aware of the extended driver - interface) should set this field to . If this field is - equal to , all the fields following this field also - have to be , or in case it is a - pointer field.

-
-
- - int major_version - Major version number - -

This field should equal if - the field equals - .

-
-
- - int minor_version - Minor version number - -

This field should equal if - the field equals - .

-
-
- - int driver_flags - Driver flags - - + + int extended_marker + +

+ This field should either be equal to ERL_DRV_EXTENDED_MARKER + or 0. An old driver (not aware of the extended driver + interface) should set this field to 0. If this field is + equal to 0, all the fields following this field also + have to be 0, or NULL in case it is a + pointer field. +

+
+ int major_version + +

This field should equal ERL_DRV_EXTENDED_MAJOR_VERSION if + the extended_marker field equals + ERL_DRV_EXTENDED_MARKER.

+
+ int minor_version + +

+ This field should equal ERL_DRV_EXTENDED_MINOR_VERSION if + the extended_marker field equals + ERL_DRV_EXTENDED_MARKER. +

+
+ + int driver_flags +

This field is used to pass driver capability information to the - runtime system. If the field equals - , it should contain or - driver flags () ored bitwise. Currently - the following driver flags exist:

+ runtime system. If the extended_marker field equals + ERL_DRV_EXTENDED_MARKER, it should contain 0 or + driver flags (ERL_DRV_FLAG_*) ored bitwise. Currently + the following driver flags exist: +

- - The runtime system will use port level locking on - all ports executing this driver instead of driver - level locking when the driver is run in a runtime - system with SMP support. For more information see the - erl_driver - documentation. - -
-
- - void *handle2 - Reserved, initialize to - -

This field is reserved for the emulators internal use. The + ERL_DRV_FLAG_USE_PORT_LOCKING + + The runtime system will use port level locking on + all ports executing this driver instead of driver + level locking when the driver is run in a runtime + system with SMP support. For more information see the + erl_driver + documentation. + + ERL_DRV_FLAG_SOFT_BUSY + + Marks that driver instances can handle being called + in the output and/or + outputv callbacks even + though a driver instance has marked itself as busy (see + set_busy_port()). + Since erts version 5.7.4 this flag is required for drivers used + by the Erlang distribution (the behaviour has always been + required by drivers used by the distribution). + + + + void *handle2 + +

+ This field is reserved for the emulators internal use. The emulator will modify this field; therefore, it is important - that the isn't declared .

-
-
- - void process_exit(ErlDrvData drv_data, ErlDrvMonitor *monitor) - Callback for process monitors. - - + that the driver_entry isn't declared const. +

+ + void (*process_exit)(ErlDrvData drv_data, ErlDrvMonitor *monitor) +

This callback is called when a monitored process exits. The - is the data associated with the port for which + drv_data is the data associated with the port for which the process is monitored (using driver_monitor_process) - and the corresponds to the + and the monitor corresponds to the ErlDrvMonitor structure filled in when creating the monitor. The driver interface function driver_get_monitored_process can be used to retrieve the process id of the exiting process as - an .

-
-
- - void stop_select(ErlDrvEvent event, void* reserved) - Called when it is safe to close an event object - - + an ErlDrvTermData.

+ + void (*stop_select)(ErlDrvEvent event, void* reserved) +

This function is called on behalf of driver_select when it is safe to close an event object.

A typical implementation on Unix is to do - .

-

Argument is intended for future use and should be ignored.

+ close((int)event).

+

Argument reserved is intended for future use and should be ignored.

In contrast to most of the other call-back functions, - is called independant of any port. No - argument is passed to the function. No + stop_select is called independent of any port. No + ErlDrvData argument is passed to the function. No driver lock or port lock is guaranteed to be held. The port that - called might even be closed at the - time is called. But it could also be - the case that is called directly by - .

+ called driver_select might even be closed at the + time stop_select is called. But it could also be + the case that stop_select is called directly by + driver_select.

It is not allowed to call any functions in the driver API from - . This strict limitation is due to the - volatile context that may be called.

-
-
- + stop_select. This strict limitation is due to the + volatile context that stop_select may be called.

+ + + + + + +
SEE ALSO @@ -493,5 +449,5 @@ erlang(3), kernel(3)

-
+ diff -Nru erlang-13.b.1-dfsg/erts/doc/src/driver.xml erlang-13.b.3-dfsg/erts/doc/src/driver.xml --- erlang-13.b.1-dfsg/erts/doc/src/driver.xml 2009-03-12 12:15:17.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/driver.xml 2009-11-20 13:31:23.000000000 +0000 @@ -26,8 +26,17 @@ 2000-11-28 PA1 + driver.xml +

This document was written a long time ago. A lot of it is still + valid, but some things have changed since it was first written. + Updates of this document are planned for the future. The reader + is encouraged to also read the + erl_driver, and the + driver_entry documentation. +

+
Introduction

This chapter tells you how to build your own driver for erlang.

@@ -198,7 +207,7 @@ input data is a string paramater for and . The returned data consists of Erlang terms.

The functions and are - utitilies that is used to make the code shorter. + utilities that is used to make the code shorter. duplicates the string and zero-terminates it, since the postgres client library wants that. takes an buffer and allocates a binary and @@ -486,7 +495,7 @@ ]]>

The function looks a bit different too. We connect using the asynchronous function. After the - connection is started, we retreive the socket for the connection + connection is started, we retrieve the socket for the connection with . This socket is used with the function to wait for connection. When the socket is ready for input or for output, the diff -Nru erlang-13.b.1-dfsg/erts/doc/src/epmd.xml erlang-13.b.3-dfsg/erts/doc/src/epmd.xml --- erlang-13.b.1-dfsg/erts/doc/src/epmd.xml 2009-03-12 12:15:17.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/epmd.xml 2009-11-20 13:29:56.000000000 +0000 @@ -29,7 +29,7 @@ 98-01-05 A - epmd.sgml + epmd.xml epmd Erlang Port Mapper Daemon @@ -64,7 +64,7 @@ epmd -names - Request the names of the registrered Erlang nodes on this host + Request the names of the registered Erlang nodes on this host

Requests the names of the local Erlang nodes has registered.

@@ -96,7 +96,7 @@

This environment variable can contain the port number epmd will use. The default port will work fine in most cases. A different port can be specified to allow several instances of epmd, representing - independant clusters of nodes, to co-exist on the same host. + independent clusters of nodes, to co-exist on the same host. All nodes in a cluster must use the same epmd port number.

diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erlang.xml erlang-13.b.3-dfsg/erts/doc/src/erlang.xml --- erlang-13.b.1-dfsg/erts/doc/src/erlang.xml 2009-06-05 13:53:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/doc/src/erlang.xml 2009-11-20 13:29:45.000000000 +0000 @@ -26,6 +26,7 @@ + erlang.xml erlang The Erlang BIFs @@ -556,7 +557,7 @@

Decodes the binary Bin according to the packet - protocol specified by Type. Very simular to the packet + protocol specified by Type. Very similar to the packet handling done by sockets with the option {packet,Type}.

If an entire packet is contained in Bin it is returned together with the remainder of the binary as @@ -704,14 +705,18 @@ - erlang:demonitor(MonitorRef, OptionList) -> true + erlang:demonitor(MonitorRef, OptionList) -> true|false Stop monitoring MonitorRef = ref() OptionList = [Option] Option = flush + Option = info +

The returned value is true unless info is part + of OptionList. +

erlang:demonitor(MonitorRef, []) is equivalent to erlang:demonitor(MonitorRef).

Currently the following Options are valid:

@@ -722,7 +727,7 @@ if there is one, from the callers message queue after monitoring has been stopped.

Calling erlang:demonitor(MonitorRef, [flush]) - is equivalent to:

+ is equivalent to the following, but more efficient:

erlang:demonitor(MonitorRef), @@ -733,6 +738,30 @@ \011 true end + info + +

The returned value is one of the following:

+ + true +

The monitor was found and removed. In this case + no 'DOWN' message due to this monitor have + been nor will be placed in the message queue + of the caller. +

+
+ false +

The monitor was not found and could not be removed. + This probably because someone already has placed a + 'DOWN' message corresponding to this monitor + in the callers message queue. +

+
+
+

If the info option is combined with the flush + option, false will be returned if a flush was needed; + otherwise, true. +

+

More options may be added in the future.

@@ -1900,6 +1929,62 @@
+ erlang:load_nif(Path, LoadInfo) -> ok | {error, Reason, Text} + Load NIF library + + Path = string() + LoadInfo = term() + Reason = load_failed | bad_lib | load | reload | + upgrade | old_code + Text = string() + + + +

This BIF is currently introduced as an experimental + feature. The interface may be changed in any way in future + releases.

+
+

Loads and links a dynamic library containing native + implemented functions (NIFs) for a module. Path is a + file path to the sharable object/dynamic library file minus + the OS-dependant file extension (.so for Unix and .ddl for + Windows). See erl_nif + on how to implement a NIF library.

+

LoadInfo can be any term. It will be passed on to + the library as part of the initialization. A good practice is + to include a module version number to support future code + upgrade scenarios.

+

The call to load_nif/2 must be made + directly from the Erlang code of the module that the + NIF library belongs to.

+

It returns either ok, or {error,Reason,Text} + if loading fails. Reason is one of the atoms below, + while Text is a human readable string that may give + some more information about the failure:

+ + load_failed + +

The OS failed to load the NIF library.

+
+ bad_lib + +

The library did not fulfil the requirements as a NIF + library of the calling module.

+
+ load | reload | upgrade + +

The corresponding library callback was not successful.

+
+ old_code + +

The call to load_nif/2 was made from the old + code of a module that has been upgraded. This is not + allowed.

+
+
+
+
+ erlang:loaded() -> [Module] List of all loaded modules @@ -2792,6 +2877,17 @@ output file. stderr_to_stdout and nouse_stdio are mutually exclusive.

+ overlapped_io + +

Affects ports to external programs on Windows® only. + The standard input and standard output handles of the port program + will, if this option is supplied, be opened with the flag + FILE_FLAG_OVERLAPPED, so that the port program can (and has to) do + overlapped I/O on it's standard handles. This is not normally + the case for simple port programs, but an option of value for the + experienced Windows programmer. On all other platforms, this + option is silently discarded.

+
in

The port can only be used for input.

@@ -2991,8 +3087,85 @@

In short: port_command(Port, Data) has a cleaner and more logical behaviour than Port ! {self(), {command, Data}}.

-

Failure: badarg if Port is not an open port - or the registered name of an open port.

+

If the port is busy, the calling process will be suspended + until the port is not busy anymore.

+

Failures:

+ + badarg + + If Port is not an open port or the registered name + of an open port. + + badarg + + If Data is not a valid io list. + + + +
+ + erlang:port_command(Port, Data, OptionList) -> true|false + Send data to a port + + Port = port() | atom() + Data = iodata() + OptionList = [Option] + Option = force + Option = nosuspend + + +

Sends data to a port. port_command(Port, Data, []) + equals port_command(Port, Data).

+

If the port command is aborted false is returned; + otherwise, true is returned.

+

If the port is busy, the calling process will be suspended + until the port is not busy anymore.

+

Currently the following Options are valid:

+ + force + The calling process will not be suspended if the port is + busy; instead, the port command is forced through. The + call will fail with a notsup exception if the + driver of the port does not support this. For more + information see the + + driver flag. + + nosuspend + The calling process will not be suspended if the port is + busy; instead, the port command is aborted and + false is returned. + + + +

More options may be added in the future.

+
+ +

erlang:port_command/3 is currently not auto imported, but + it is planned to be auto imported in OTP R14.

+
+

Failures:

+ + badarg + + If Port is not an open port or the registered name + of an open port. + + badarg + + If Data is not a valid io list. + + badarg + + If OptionList is not a valid option list. + + notsup + + If the force option has been passed, but the + driver of the port does not allow forcing through + a busy port. + +
@@ -4227,7 +4400,7 @@

Returns the pid of a new process started by the application of Fun to the empty list []. A link is created between - the calling process and and the new process, atomically. + the calling process and the new process, atomically. Otherwise works like spawn/3.

@@ -4242,7 +4415,7 @@

Returns the pid of a new process started by the application of Fun to the empty list [] on Node. A link is - created between the calling process and and the new process, + created between the calling process and the new process, atomically. If Node does not exist, a useless pid is returned (and due to the link, an exit signal with exit reason noconnection will be received). Otherwise works @@ -4578,7 +4751,10 @@ runtime -

Returns {Total_Run_Time, Time_Since_Last_Call}.

+

Returns {Total_Run_Time, Time_Since_Last_Call}. + Note that the run-time is the sum of the run-time for all + threads in the Erlang run-time system and may therefore be greater + than the wall-clock time.

wall_clock @@ -4761,7 +4937,7 @@ erlang:system_flag(fullsweep_after, Number)

Number is a non-negative integer which indicates - how many times generational garbages collections can be + how many times generational garbage collections can be done without forcing a fullsweep collection. The value applies to new processes; processes already running are not affected.

@@ -4829,7 +5005,7 @@ online which causes them to try to bind or unbind as requested. NOTE: If a scheduler fails to bind, this will often be silently ignored. This since it isn't always - possible to verify valid logical processor identifers. If + possible to verify valid logical processor identifiers. If an error is reported, it will be reported to the error_logger. If you want to verify that the schedulers actually have bound as requested, call @@ -4877,6 +5053,10 @@

Schedulers will be spread like thread_spread, but also over physical processor chips.

+ spread + +

Schedulers will be spread as much as possible.

+
no_node_thread_spread

Like thread_spread, but if multiple NUMA @@ -5148,7 +5328,9 @@ CpuTopology = LevelEntryList | undefined LevelEntryList = [LevelEntry] (all LevelEntrys of a LevelEntryList - must contain th same LevelTag) + must contain the same LevelTag, except + on the top level where both node and + processor LevelTags may co-exist) LevelEntry = {LevelTag, SubLevel} | {LevelTag, InfoList, SubLevel} ({LevelTag, SubLevel} @@ -5161,17 +5343,26 @@ InfoList = [] (the InfoList may be extended in the future) +

node refers to NUMA (non-uniform memory access) + nodes, and thread refers to hardware threads + (e.g. Intels hyper-threads).

A level in the CpuTopology term can be omitted if only one entry exists and the InfoList is empty.

-

Currently thread must be a sub level to core - which must be a sub level to processor which must be - a sublevel to node. This will change in the future - since node actually can be a sublevel to - processor in hardware. Cache hierarchy is not part - of the CpuTopology type yet, but will be in the - future. In other words, expect the CpuTopology - type to change. +

thread can only be a sub level to core. + core can be a sub level to either processor + or node. processor can either be on the + top level or a sub level to node. node + can either be on the top level or a sub level to + processor. That is, NUMA nodes can be processor + internal or processor external. A CPU topology can + consist of a mix of processor internal and external + NUMA nodes, as long as each logical CPU belongs to one + and only one NUMA node. Cache hierarchy is not part of + the CpuTopology type yet, but will be in the + future. Other things may also make it into the CPU + topology in the future. In other words, expect the + CpuTopology type to change.

{cpu_topology, defined} @@ -5482,7 +5673,7 @@ bindings.

A tuple of a size equal to erlang:system_info(schedulers) is returned. The elements of the tuple are integers - or the atom unbound. Logical processor identifers + or the atom unbound. Logical processor identifiers are represented as integers. The Nth element of the tuple equals the current binding for the scheduler with the scheduler identifier equal to @@ -5757,16 +5948,16 @@ runnable_procs -

If a process is put into or removed from the runqueue a message, +

If a process is put into or removed from the run queue a message, {profile, Pid, State, Mfa, Ts}, is sent to - ProfilerPid. Running processes that is reinsertet into the - runqueue after completing its reductions does not trigger this + ProfilerPid. Running processes that is reinserted into the + run queue after having been preemptively scheduled out will not trigger this message.

runnable_ports -

If a port is put into or removed from the runqueue a message, +

If a port is put into or removed from the run queue a message, {profile, Port, State, 0, Ts}, is sent to ProfilerPid.

diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erlc.xml erlang-13.b.3-dfsg/erts/doc/src/erlc.xml --- erlang-13.b.1-dfsg/erts/doc/src/erlc.xml 2009-03-12 12:15:18.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/erlc.xml 2009-11-20 13:30:11.000000000 +0000 @@ -29,7 +29,7 @@ 97-03-24 A - erlc.sgml + erlc.xml erlc Compiler diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erl_dist_protocol.xml erlang-13.b.3-dfsg/erts/doc/src/erl_dist_protocol.xml --- erlang-13.b.1-dfsg/erts/doc/src/erl_dist_protocol.xml 2009-06-05 13:53:46.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/doc/src/erl_dist_protocol.xml 2009-11-20 13:32:38.000000000 +0000 @@ -28,6 +28,7 @@ 2007-09-21 PA1 + erl_dist_protocol.xml

@@ -82,13 +83,13 @@ summarized in the figure below.

- + Summary of EPMD requests.

- Each request *_REQ is preceeded by a two-byte length field. + Each request *_REQ is preceded by a two-byte length field. Thus, the overall request format is:

diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erl_driver.xml erlang-13.b.3-dfsg/erts/doc/src/erl_driver.xml --- erlang-13.b.1-dfsg/erts/doc/src/erl_driver.xml 2009-03-13 14:15:54.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/erl_driver.xml 2009-11-20 13:31:18.000000000 +0000 @@ -1,7 +1,7 @@ - + - +
20012009 @@ -29,10 +29,10 @@ 2000-11-27 PA1 - erl_driver.sgml + erl_driver.xml
- erl_driver - API functions for an Erlang driver + erl_driver + API functions for an Erlang driver

As of erts version 5.5.3 the driver interface has been extended (see extended marker). @@ -129,7 +129,7 @@

- Functionality + FUNCTIONALITY

All functions that a driver needs to do with Erlang are performed through driver API functions. There are functions for the following functionality:

@@ -281,84 +281,102 @@
- - - ErlDrvSysInfo - Information about the Erlang runtime system - - int driver_major_version - int driver_minor_version - char *erts_version - char *otp_release - int thread_support - int smp_support - int async_threads - int scheduler_threads - - -

The ErlDrvSysInfo structure is used for storage of - information about the Erlang runtime system. - driver_system_info() - will write the system information when passed a reference to - a ErlDrvSysInfo structure. A description of the - fields in the structure follow:

-

- - driver_major_version - The value of + +
+ DATA TYPES + + + ErlDrvSysInfo + +

+ +typedef struct ErlDrvSysInfo { + int driver_major_version; + int driver_minor_version; + char *erts_version; + char *otp_release; + int thread_support; + int smp_support; + int async_threads; + int scheduler_threads; +} ErlDrvSysInfo; + + +

+ The ErlDrvSysInfo structure is used for storage of + information about the Erlang runtime system. + driver_system_info() + will write the system information when passed a reference to + a ErlDrvSysInfo structure. A description of the + fields in the structure follow: +

+ + driver_major_version + The value of ERL_DRV_EXTENDED_MAJOR_VERSION when the runtime system was compiled. This value is the same as the value of ERL_DRV_EXTENDED_MAJOR_VERSION used when compiling the driver; otherwise, the runtime system - would have refused to load the driver. - driver_minor_version - The value of + would have refused to load the driver. + + driver_minor_version + The value of ERL_DRV_EXTENDED_MINOR_VERSION when the runtime system was compiled. This value might differ from the value of ERL_DRV_EXTENDED_MINOR_VERSION - used when compiling the driver. - erts_version - A string containing the version number of the runtime system + used when compiling the driver. + + erts_version + A string containing the version number of the runtime system (the same as returned by - erlang:system_info(version)). - otp_release - A string containing the OTP release number + erlang:system_info(version)). + + otp_release + A string containing the OTP release number (the same as returned by - erlang:system_info(otp_release)). - thread_support - A value != 0 if the runtime system has thread support; - otherwise, 0. - smp_support - A value != 0 if the runtime system has SMP support; - otherwise, 0. - thread_support - A value != 0 if the runtime system has thread support; - otherwise, 0. - smp_support - A value != 0 if the runtime system has SMP support; - otherwise, 0. - async_threads - The number of async threads in the async thread pool used + erlang:system_info(otp_release)). + + thread_support + A value != 0 if the runtime system has thread support; + otherwise, 0. + + smp_support + A value != 0 if the runtime system has SMP support; + otherwise, 0. + + thread_support + A value != 0 if the runtime system has thread support; + otherwise, 0. + + smp_support + A value != 0 if the runtime system has SMP support; + otherwise, 0. + + async_threads + The number of async threads in the async thread pool used by driver_async() (the same as returned by - erlang:system_info(thread_pool_size)). - scheduler_threads - The number of scheduler threads used by the runtime system + erlang:system_info(thread_pool_size)). + + scheduler_threads + The number of scheduler threads used by the runtime system (the same as returned by - erlang:system_info(schedulers)). + erlang:system_info(schedulers)). +
- - - - ErlDrvBinary - A driver binary. - - int orig_size - char orig_bytes[] - - + + + ErlDrvBinary + +

+ +typedef struct ErlDrvBinary { + int orig_size; + char orig_bytes[]; +} ErlDrvBinary; +

The ErlDrvBinary structure is a binary, as sent between the emulator and the driver. All binaries are reference counted; when driver_binary_free is called, @@ -402,48 +420,40 @@

From erts version 5.5 (OTP release R11B), orig_bytes is guaranteed to be properly aligned for storage of an array of doubles (usually 8-byte aligned).

-
-
- - ErlDrvData - Driver specific data - + + ErlDrvData +

The ErlDrvData is a handle to driver-specific data, passed to the driver call-backs. It is a pointer, and is most often casted to a specific pointer in the driver.

-
-
- - SysIOVec - System I/O vector - + + SysIOVec +

This is a system I/O vector, as used by writev on unix and WSASend on Win32. It is used in ErlIOVec.

-
-
- - ErlIOVec - Erlang I/O vector - - int vsize - int size - SysIOVec* iov - ErlDrvBinary** binv - - + + ErlIOVec + +

+ +typedef struct ErlIOVec { + int vsize; + int size; + SysIOVec* iov; + >ErlDrvBinary** binv; +} ErlIOVec; +

The I/O vector used by the emulator and drivers, is a list of binaries, with a SysIOVec pointing to the buffers of the binaries. It is used in driver_outputv and the outputv driver call-back. Also, the driver queue is an ErlIOVec.

-
-
- - ErlDrvMonitor - A monitor reference - + + + ErlDrvMonitor +

When a driver creates a monitor for a process, a ErlDrvMonitor is filled in. This is an opaque data-type which can be assigned to but not compared without @@ -453,12 +463,9 @@ address of the data is not stored outside of the driver, so the ErlDrvMonitor can be used as any other datum, it can be copied, moved in memory, forgotten etc.

-
-
- - ErlDrvNowData - A structure for holding timestamps - + + ErlDrvNowData +

The ErlDrvNowData structure holds a timestamp consisting of three values measured from some arbitrary point in the past. The three structure members are:

@@ -473,16 +480,13 @@ The number of whole microseconds elapsed since the arbitrary point in time -
-
- - ErlDrvPDL - Port Data Lock - + + ErlDrvPDL +

If certain port specific data have to be accessed from other threads than those calling the driver call-backs, a port data lock can be used in order to synchronize the operations on the data. - Currently, the only port specific data that the the emulator + Currently, the only port specific data that the emulator associates with the port data lock is the driver queue.

Normally a driver instance does not have a port data lock. If the driver instance want to use a port data lock, it has to @@ -509,12 +513,10 @@ driver_pdl_get_refc(), driver_pdl_inc_refc(), and driver_pdl_dec_refc().

-
-
- - ErlDrvTid - Thread identifier - + + + ErlDrvTid +

Thread identifier.

See also: erl_drv_thread_create(), @@ -524,15 +526,13 @@ and erl_drv_equal_tids().

-
-
- - ErlDrvThreadOpts - Thread options - - int suggested_stack_size - - + + ErlDrvThreadOpts + +

+ + int suggested_stack_size; +

Thread options structure passed to erl_drv_thread_create(). Currently the following fields exist: @@ -549,12 +549,10 @@ and erl_drv_thread_create().

-
-
- - ErlDrvMutex - Mutex - + + + ErlDrvMutex +

Mutual exclusion lock. Used for synchronizing access to shared data. Only one thread at a time can lock a mutex.

@@ -566,12 +564,9 @@ and erl_drv_mutex_unlock().

-
-
- - ErlDrvCond - Condition variable - + + ErlDrvCond +

Condition variable. Used when threads need to wait for a specific condition to appear before continuing execution. Condition variables need to be used with associated mutexes. @@ -584,12 +579,9 @@ and erl_drv_cond_wait().

-
-
- - ErlDrvRWLock - Rwlock - + + ErlDrvRWLock +

Read/write lock. Used to allow multiple threads to read shared data while only allowing one thread to write the same data. Multiple threads can read lock an rwlock at the same time, while only one thread can @@ -606,12 +598,9 @@ and erl_drv_rwlock_rwunlock().

-
-
- - ErlDrvTSDKey - Thread specific data key - + + ErlDrvTSDKey +

Key which thread specific data can be associated with.

See also: erl_drv_tsd_key_create(), @@ -620,10 +609,13 @@ and erl_drv_tsd_get().

-
-
+ + +
+ + - void driver_system_info(ErlDrvSysInfo *sys_info_ptr, size_t size) + voiddriver_system_info(ErlDrvSysInfo *sys_info_ptr, size_t size) Get information about the Erlang runtime system @@ -640,7 +632,7 @@ - int driver_output(ErlDrvPort port, char *buf, int len) + intdriver_output(ErlDrvPort port, char *buf, int len) Send data from driver to port owner @@ -660,7 +652,7 @@ - int driver_output2(ErlDrvPort port, char *hbuf, int hlen, char *buf, int len) + intdriver_output2(ErlDrvPort port, char *hbuf, int hlen, char *buf, int len) Send data and binary data to port owner @@ -675,7 +667,7 @@ - int driver_output_binary(ErlDrvPort port, char *hbuf, int hlen, ErlDrvBinary* bin, int offset, int len) + intdriver_output_binary(ErlDrvPort port, char *hbuf, int hlen, ErlDrvBinary* bin, int offset, int len) Send data from a driver binary to port owner @@ -698,7 +690,7 @@ - int driver_outputv(ErlDrvPort port, char* hbuf, int hlen, ErlIOVec *ev, int skip) + intdriver_outputv(ErlDrvPort port, char* hbuf, int hlen, ErlIOVec *ev, int skip) Send vectorized data to port owner @@ -721,7 +713,7 @@ - int driver_vec_to_buf(ErlIOVec *ev, char *buf, int len) + intdriver_vec_to_buf(ErlIOVec *ev, char *buf, int len) Collect data segments into a buffer @@ -739,7 +731,7 @@ - int driver_set_timer(ErlDrvPort port, unsigned long time) + intdriver_set_timer(ErlDrvPort port, unsigned long time) Set a timer to call the driver @@ -756,7 +748,7 @@ - int driver_cancel_timer(ErlDrvPort port) + intdriver_cancel_timer(ErlDrvPort port) Cancel a previously set timer @@ -766,7 +758,7 @@ - int driver_read_timer(ErlDrvPort port, unsigned long *time_left) + intdriver_read_timer(ErlDrvPort port, unsigned long *time_left) Read the time left before timeout @@ -777,7 +769,7 @@ - int driver_get_now(ErlDrvNowData *now) + intdriver_get_now(ErlDrvNowData *now) Read a system timestamp @@ -789,14 +781,14 @@ - int driver_select(ErlDrvPort port, ErlDrvEvent event, int mode, int on) + intdriver_select(ErlDrvPort port, ErlDrvEvent event, int mode, int on) Provide an event for having the emulator call the driver

This function is used by drivers to provide the emulator with events to check for. This enables the emulator to call the driver when something has happened asynchronously.

-

The event argument indentifies an OS-specific event object. +

The event argument identifies an OS-specific event object. On Unix systems, the functions select/poll are used. The event object must be a socket or pipe (or other object that select/poll can use). @@ -842,7 +834,7 @@ - void *driver_alloc(size_t size) + void *driver_alloc(size_t size) Allocate memory @@ -856,7 +848,7 @@ - void *driver_realloc(void *ptr, size_t size) + void *driver_realloc(void *ptr, size_t size) Resize an allocated memory block @@ -869,7 +861,7 @@ - void driver_free(void *ptr) + voiddriver_free(void *ptr) Free an allocated memory block @@ -882,7 +874,7 @@ - ErlDrvBinary* driver_alloc_binary(int size) + ErlDrvBinary*driver_alloc_binary(int size) Allocate a driver binary @@ -891,7 +883,7 @@ or NULL on failure (out of memory). When a driver binary has been sent to the emulator, it must not be altered. Every allocated binary should be freed by a corresponding call to - driver_free_binary (unless othwerwise stated).

+ driver_free_binary (unless otherwise stated).

Note that a driver binary has an internal reference counter, this means that calling driver_free_binary it may not actually dispose of it. If it's sent to the emulator, it may @@ -902,7 +894,7 @@ - ErlDrvBinary* driver_realloc_binary(ErlDrvBinary *bin, int size) + ErlDrvBinary*driver_realloc_binary(ErlDrvBinary *bin, int size) Resize a driver binary @@ -914,7 +906,7 @@ - void driver_free_binary(ErlDrvBinary *bin) + voiddriver_free_binary(ErlDrvBinary *bin) Free a driver binary @@ -927,7 +919,7 @@ - long driver_binary_get_refc(ErlDrvBinary *bin) + longdriver_binary_get_refc(ErlDrvBinary *bin) Get the reference count of a driver binary @@ -937,7 +929,7 @@ - long driver_binary_inc_refc(ErlDrvBinary *bin) + longdriver_binary_inc_refc(ErlDrvBinary *bin) Increment the reference count of a driver binary @@ -948,7 +940,7 @@ - long driver_binary_dec_refc(ErlDrvBinary *bin) + longdriver_binary_dec_refc(ErlDrvBinary *bin) Decrement the reference count of a driver binary @@ -968,7 +960,7 @@ - int driver_enq(ErlDrvPort port, char* buf, int len) + intdriver_enq(ErlDrvPort port, char* buf, int len) Enqueue data in the driver queue @@ -992,7 +984,7 @@ - int driver_pushq(ErlDrvPort port, char* buf, int len) + intdriver_pushq(ErlDrvPort port, char* buf, int len) Push data at the head of the driver queue @@ -1007,13 +999,13 @@ - int driver_deq(ErlDrvPort port, int size) + intdriver_deq(ErlDrvPort port, int size) Dequeue data from the head of the driver queue

This function dequeues data by moving the head pointer forward in the driver queue by size bytes. The data - in the queue will be dealloced.

+ in the queue will be deallocated.

The return value is the number of bytes remaining in the queue or -1 on failure.

This function can be called from an arbitrary thread if a @@ -1023,7 +1015,7 @@ - int driver_sizeq(ErlDrvPort port) + intdriver_sizeq(ErlDrvPort port) Return the size of the driver queue @@ -1036,7 +1028,7 @@ - int driver_enq_bin(ErlDrvPort port, ErlDrvBinary *bin, int offset, int len) + intdriver_enq_bin(ErlDrvPort port, ErlDrvBinary *bin, int offset, int len) Enqueue binary in the driver queue @@ -1053,7 +1045,7 @@ - int driver_pushq_bin(ErlDrvPort port, ErlDrvBinary *bin, int offset, int len) + intdriver_pushq_bin(ErlDrvPort port, ErlDrvBinary *bin, int offset, int len) Push binary at the head of the driver queue @@ -1070,7 +1062,7 @@ - SysIOVec* driver_peekq(ErlDrvPort port, int *vlen) + SysIOVec*driver_peekq(ErlDrvPort port, int *vlen) Get the driver queue as a vector @@ -1089,7 +1081,7 @@ - int driver_enqv(ErlDrvPort port, ErlIOVec *ev, int skip) + intdriver_enqv(ErlDrvPort port, ErlIOVec *ev, int skip) Enqueue vector in the driver queue @@ -1105,7 +1097,7 @@ - int driver_pushqv(ErlDrvPort port, ErlIOVec *ev, int skip) + intdriver_pushqv(ErlDrvPort port, ErlIOVec *ev, int skip) Push vector at the head of the driver queue @@ -1121,7 +1113,7 @@ - ErlDrvPDL driver_pdl_create(ErlDrvPort port) + ErlDrvPDLdriver_pdl_create(ErlDrvPort port) Create a port data lock @@ -1136,7 +1128,7 @@ - void driver_pdl_lock(ErlDrvPDL pdl) + voiddriver_pdl_lock(ErlDrvPDL pdl) Lock port data lock @@ -1146,7 +1138,7 @@ - void driver_pdl_unlock(ErlDrvPDL pdl) + voiddriver_pdl_unlock(ErlDrvPDL pdl) Unlock port data lock @@ -1156,7 +1148,7 @@ - long driver_pdl_get_refc(ErlDrvPDL pdl) + longdriver_pdl_get_refc(ErlDrvPDL pdl) @@ -1166,7 +1158,7 @@ - long driver_pdl_inc_refc(ErlDrvPDL pdl) + longdriver_pdl_inc_refc(ErlDrvPDL pdl) @@ -1178,7 +1170,7 @@ - long driver_pdl_dec_refc(ErlDrvPDL pdl) + longdriver_pdl_dec_refc(ErlDrvPDL pdl) @@ -1190,7 +1182,7 @@ - int driver_monitor_process(ErlDrvPort port, ErlDrvTermData process, ErlDrvMonitor *monitor) + intdriver_monitor_process(ErlDrvPort port, ErlDrvTermData process, ErlDrvMonitor *monitor) Monitor a process from a driver @@ -1207,7 +1199,7 @@ - int driver_demonitor_process(ErlDrvPort port, const ErlDrvMonitor *monitor) + intdriver_demonitor_process(ErlDrvPort port, const ErlDrvMonitor *monitor) Stop monitoring a process from a driver @@ -1217,7 +1209,7 @@ - ErlDrvTermData driver_get_monitored_process(ErlDrvPort port, const ErlDrvMonitor *monitor) + ErlDrvTermDatadriver_get_monitored_process(ErlDrvPort port, const ErlDrvMonitor *monitor) Retrieve the process id from a monitor @@ -1229,7 +1221,7 @@ - int driver_compare_monitors(const ErlDrvMonitor *monitor1, const ErlDrvMonitor *monitor2) + intdriver_compare_monitors(const ErlDrvMonitor *monitor1, const ErlDrvMonitor *monitor2) Compare two monitors @@ -1243,7 +1235,7 @@ - void add_driver_entry(ErlDrvEntry *de) + voidadd_driver_entry(ErlDrvEntry *de) Add a driver entry @@ -1263,7 +1255,7 @@ - int remove_driver_entry(ErlDrvEntry *de) + intremove_driver_entry(ErlDrvEntry *de) Remove a driver entry @@ -1274,7 +1266,7 @@ - char* erl_errno_id(int error) + char*erl_errno_id(int error) Get erlang error atom name from error number @@ -1285,7 +1277,7 @@ - void set_busy_port(ErlDrvPort port, int on) + voidset_busy_port(ErlDrvPort port, int on) Signal or unsignal port as busy @@ -1295,10 +1287,18 @@

When the port is busy, sending to it with Port ! Data or port_command/2, will block the port owner process, until the port is signaled as not busy.

+

If the + + has been set in the + driver_entry, + data can be forced into the driver via + port_command(Port, Data, [force]) + even though the driver has signaled that it is busy. +

- void set_port_control_flags(ErlDrvPort port, int flags) + voidset_port_control_flags(ErlDrvPort port, int flags) Set flags on how to handle control entry function @@ -1313,7 +1313,7 @@ - int driver_failure_eof(ErlDrvPort port) + intdriver_failure_eof(ErlDrvPort port) Fail with EOF @@ -1326,9 +1326,9 @@ - int driver_failure_atom(ErlDrvPort port, char *string) - int driver_failure_posix(ErlDrvPort port, int error) - int driver_failure(ErlDrvPort port, int error) + intdriver_failure_atom(ErlDrvPort port, char *string) + intdriver_failure_posix(ErlDrvPort port, int error) + intdriver_failure(ErlDrvPort port, int error) Fail with error @@ -1350,7 +1350,7 @@ - ErlDrvTermData driver_connected(ErlDrvPort port) + ErlDrvTermDatadriver_connected(ErlDrvPort port) Return the port owner process @@ -1358,7 +1358,7 @@ - ErlDrvTermData driver_caller(ErlDrvPort port) + ErlDrvTermDatadriver_caller(ErlDrvPort port) Return the process making the driver call @@ -1385,7 +1385,7 @@ - int driver_output_term(ErlDrvPort port, ErlDrvTermData* term, int n) + intdriver_output_term(ErlDrvPort port, ErlDrvTermData* term, int n) Send term data from driver to port owner @@ -1418,6 +1418,8 @@ ERL_DRV_ATOM ErlDrvTermData atom (from driver_mk_atom(char *string)) ERL_DRV_INT ErlDrvSInt integer ERL_DRV_UINT ErlDrvUInt integer +ERL_DRV_INT64 ErlDrvSInt64 *integer_ptr +ERL_DRV_UINT64 ErlDrvUInt64 *integer_ptr ERL_DRV_PORT ErlDrvTermData port (from driver_mk_port(ErlDrvPort port)) ERL_DRV_BINARY ErlDrvBinary *bin, ErlDrvUInt len, ErlDrvUInt offset ERL_DRV_BUF2BINARY char *buf, ErlDrvUInt len @@ -1427,13 +1429,19 @@ ERL_DRV_PID ErlDrvTermData pid (from driver_connected(ErlDrvPort port) or driver_caller(ErlDrvPort port)) ERL_DRV_STRING_CONS char *str, int len ERL_DRV_FLOAT double *dbl -ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len +ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len +

The unsigned integer data type ErlDrvUInt and the signed integer data type ErlDrvSInt are 64 bits wide on a 64 bit runtime system and 32 bits wide on a 32 bit runtime system. They were introduced in erts version 5.6, and replaced some of the int arguments in the list above.

+

The unsigned integer data type ErlDrvUInt64 and the + signed integer data type ErlDrvSInt64 are always 64 bits + wide. They were introduced in erts version 5.7.4. +

+

To build the tuple {tcp, Port, [100 | Binary]}, the following call could be made.

+ ]]> +

Where bin is a driver binary of length at least 50 and port is a port handle. Note that the ERL_DRV_LIST comes after the elements of the list, likewise the @@ -1522,7 +1531,7 @@ - ErlDrvTermData driver_mk_atom(char* string) + ErlDrvTermDatadriver_mk_atom(char* string) Make an atom from a name @@ -1533,7 +1542,7 @@ - ErlDrvTermData driver_mk_port(ErlDrvPort port) + ErlDrvTermDatadriver_mk_port(ErlDrvPort port) Make a erlang term port from a port @@ -1542,7 +1551,7 @@ - int driver_send_term(ErlDrvPort port, ErlDrvTermData receiver, ErlDrvTermData* term, int n) + intdriver_send_term(ErlDrvPort port, ErlDrvTermData receiver, ErlDrvTermData* term, int n) Send term data to other process than port owner process @@ -1557,7 +1566,7 @@ - long driver_async (ErlDrvPort port, unsigned int* key, void (*async_invoke)(void*), void* async_data, void (*async_free)(void*)) + longdriver_async (ErlDrvPort port, unsigned int* key, void (*async_invoke)(void*), void* async_data, void (*async_free)(void*)) Perform an asynchronous call within a driver @@ -1627,7 +1636,7 @@ - int driver_async_cancel(long id) + intdriver_async_cancel(long id) Cancel an asynchronous call @@ -1640,7 +1649,7 @@ - int driver_lock_driver(ErlDrvPort port) + intdriver_lock_driver(ErlDrvPort port) Make sure the driver is never unloaded @@ -1651,7 +1660,7 @@ - ErlDrvPort driver_create_port(ErlDrvPort port, ErlDrvTermData owner_pid, char* name, ErlDrvData drv_data) + ErlDrvPortdriver_create_port(ErlDrvPort port, ErlDrvTermData owner_pid, char* name, ErlDrvData drv_data) Create a new port (driver instance)

This function creates a new port executing the same driver @@ -1700,11 +1709,11 @@ - int erl_drv_thread_create(char *name, + interl_drv_thread_create(char *name, ErlDrvTid *tid, void * (*func)(void *), void *arg, - ErlDrvThreadOpts *opts) + ErlDrvThreadOpts *opts) Create a thread @@ -1764,7 +1773,7 @@ - ErlDrvThreadOpts *erl_drv_thread_opts_create(char *name) + ErlDrvThreadOpts *erl_drv_thread_opts_create(char *name) Create thread options @@ -1794,7 +1803,7 @@ - void erl_drv_thread_opts_destroy(ErlDrvThreadOpts *opts) + voiderl_drv_thread_opts_destroy(ErlDrvThreadOpts *opts) Destroy thread options @@ -1811,7 +1820,7 @@ - void erl_drv_thread_exit(void *exit_value) + voiderl_drv_thread_exit(void *exit_value) Terminate calling thread @@ -1832,7 +1841,7 @@ - int erl_drv_thread_join(ErlDrvTid tid, void **exit_value) + interl_drv_thread_join(ErlDrvTid tid, void **exit_value) Join with another thread @@ -1858,7 +1867,7 @@ - ErlDrvTid erl_drv_thread_self(void) + ErlDrvTiderl_drv_thread_self(void) Get the thread identifier of the current thread @@ -1870,7 +1879,7 @@ - int erl_drv_equal_tids(ErlDrvTid tid1, ErlDrvTid tid2) + interl_drv_equal_tids(ErlDrvTid tid1, ErlDrvTid tid2) Compare thread identifiers for equality @@ -1896,7 +1905,7 @@ - ErlDrvMutex *erl_drv_mutex_create(char *name) + ErlDrvMutex *erl_drv_mutex_create(char *name) Create a mutex @@ -1917,7 +1926,7 @@ - void erl_drv_mutex_destroy(ErlDrvMutex *mtx) + voiderl_drv_mutex_destroy(ErlDrvMutex *mtx) Destroy a mutex @@ -1936,7 +1945,7 @@ - void erl_drv_mutex_lock(ErlDrvMutex *mtx) + voiderl_drv_mutex_lock(ErlDrvMutex *mtx) Lock a mutex @@ -1959,7 +1968,7 @@ - int erl_drv_mutex_trylock(ErlDrvMutex *mtx) + interl_drv_mutex_trylock(ErlDrvMutex *mtx) Try lock a mutex @@ -1982,7 +1991,7 @@ - void erl_drv_mutex_unlock(ErlDrvMutex *mtx) + voiderl_drv_mutex_unlock(ErlDrvMutex *mtx) Unlock a mutex @@ -1999,7 +2008,7 @@ - ErlDrvCond *erl_drv_cond_create(char *name) + ErlDrvCond *erl_drv_cond_create(char *name) Create a condition variable @@ -2020,7 +2029,7 @@ - void erl_drv_cond_destroy(ErlDrvCond *cnd) + voiderl_drv_cond_destroy(ErlDrvCond *cnd) Destroy a condition variable @@ -2038,7 +2047,7 @@ - void erl_drv_cond_signal(ErlDrvCond *cnd) + voiderl_drv_cond_signal(ErlDrvCond *cnd) Signal on a condition variable @@ -2056,7 +2065,7 @@ - void erl_drv_cond_broadcast(ErlDrvCond *cnd) + voiderl_drv_cond_broadcast(ErlDrvCond *cnd) Broadcast on a condition variable @@ -2074,7 +2083,7 @@ - void erl_drv_cond_wait(ErlDrvCond *cnd, ErlDrvMutex *mtx) + voiderl_drv_cond_wait(ErlDrvCond *cnd, ErlDrvMutex *mtx) Wait on a condition variable @@ -2110,7 +2119,7 @@ - ErlDrvRWLock *erl_drv_rwlock_create(char *name) + ErlDrvRWLock *erl_drv_rwlock_create(char *name) Create an rwlock @@ -2131,7 +2140,7 @@ - void erl_drv_rwlock_destroy(ErlDrvRWLock *rwlck) + voiderl_drv_rwlock_destroy(ErlDrvRWLock *rwlck) Destroy an rwlock @@ -2149,7 +2158,7 @@ - void erl_drv_rwlock_rlock(ErlDrvRWLock *rwlck) + voiderl_drv_rwlock_rlock(ErlDrvRWLock *rwlck) Read lock an rwlock @@ -2172,7 +2181,7 @@ - int erl_drv_rwlock_tryrlock(ErlDrvRWLock *rwlck) + interl_drv_rwlock_tryrlock(ErlDrvRWLock *rwlck) Try to read lock an rwlock @@ -2195,7 +2204,7 @@ - void erl_drv_rwlock_runlock(ErlDrvRWLock *rwlck) + voiderl_drv_rwlock_runlock(ErlDrvRWLock *rwlck) Read unlock an rwlock @@ -2212,7 +2221,7 @@ - void erl_drv_rwlock_rwlock(ErlDrvRWLock *rwlck) + voiderl_drv_rwlock_rwlock(ErlDrvRWLock *rwlck) Read/Write lock an rwlock @@ -2235,7 +2244,7 @@ - int erl_drv_rwlock_tryrwlock(ErlDrvRWLock *rwlck) + interl_drv_rwlock_tryrwlock(ErlDrvRWLock *rwlck) Try to read/write lock an rwlock @@ -2258,7 +2267,7 @@ - void erl_drv_rwlock_rwunlock(ErlDrvRWLock *rwlck) + voiderl_drv_rwlock_rwunlock(ErlDrvRWLock *rwlck) Read/Write unlock an rwlock @@ -2275,7 +2284,7 @@ - int erl_drv_tsd_key_create(char *name, ErlDrvTSDKey *key) + interl_drv_tsd_key_create(char *name, ErlDrvTSDKey *key) Create a thread specific data key @@ -2299,7 +2308,7 @@ - void erl_drv_tsd_key_destroy(ErlDrvTSDKey key) + voiderl_drv_tsd_key_destroy(ErlDrvTSDKey key) Destroy a thread specific data key @@ -2327,7 +2336,7 @@ - void erl_drv_tsd_set(ErlDrvTSDKey key, void *data) + voiderl_drv_tsd_set(ErlDrvTSDKey key, void *data) Set thread specific data @@ -2359,7 +2368,7 @@ - void *erl_drv_tsd_get(ErlDrvTSDKey key) + void *erl_drv_tsd_get(ErlDrvTSDKey key) Get thread specific data @@ -2378,7 +2387,7 @@ - int erl_drv_putenv(char *key, char *value) + interl_drv_putenv(char *key, char *value) Set the value of an environment variable @@ -2408,7 +2417,7 @@ - int erl_drv_getenv(char *key, char *value, size_t *value_size) + interl_drv_getenv(char *key, char *value, size_t *value_size) Get the value of an environment variable @@ -2452,5 +2461,5 @@

An Alternative Distribution Driver (ERTS User's Guide Ch. 3)

- + diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erl_ext_dist.xml erlang-13.b.3-dfsg/erts/doc/src/erl_ext_dist.xml --- erlang-13.b.1-dfsg/erts/doc/src/erl_ext_dist.xml 2009-06-05 13:53:46.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/doc/src/erl_ext_dist.xml 2009-11-20 13:32:37.000000000 +0000 @@ -28,6 +28,7 @@ 2007-09-21 PA1 + erl_ext_dist.xml
diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erl_nif.xml erlang-13.b.3-dfsg/erts/doc/src/erl_nif.xml --- erlang-13.b.1-dfsg/erts/doc/src/erl_nif.xml 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/doc/src/erl_nif.xml 2009-11-20 13:33:11.000000000 +0000 @@ -0,0 +1,351 @@ + + + + +
+ + 20012009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + erl_nif + Sverker Eriksson + Sverker Eriksson + 1 + + + 2009-11-17 + PA1 + erl_nif.xml +
+ erl_nif + API functions for an Erlang NIF library + +

The NIF concept is introduced in R13B03 as an + EXPERIMENTAL feature. The interfaces may be changed in any way + in coming releases. The API introduced in this release is very + sparse and contains only the most basic functions to read and + write Erlang terms. +

+ +

A NIF library contains native implementation of some functions + of an erlang module. The native implemented functions (NIFs) are + called like any other functions without any difference to the + caller. Each NIF must also have an implementation in Erlang that + will be invoked if the function is called before the NIF library + has been successfully loaded. A typical such stub implementation + is to throw an exception. But it can also be used as a fallback + implementation if the NIF library is not implemented for some + architecture.

+

A minimal example of a NIF library can look like this:

+

+ +/* niftest.c */ +#include "erl_nif.h" + +static ERL_NIF_TERM hello(ErlNifEnv* env) +{ + return enif_make_string(env, "Hello world!"); +} + +static ErlNifFunc nif_funcs[] = +{ + {"hello", 0, hello} +}; + +ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL) + + +

and the erlang module would have to look something like + this:

+

+ +-module(niftest). + +-export([init/0, hello/0]). + +init() -> + erlang:load_nif("./niftest", 0). + +hello() -> + "NIF library not loaded". + +

and compile and test something like this (on Linux):

+

+ +$> gcc -fPIC -shared -o niftest.so niftest.c -I $ERL_ROOT/usr/include/ +$> erl + +1> c(niftest). +{ok,niftest} +2> niftest:hello(). +"NIF library not loaded" +3> niftest:init(). +ok +4> niftest:hello(). +"Hello world!" + + +

A better solution for a real module is to take advantage of + the new attribute on_load to automatically load the NIF + library when the module is loaded.

+

A loaded NIF library is tied to the Erlang module code version + that loaded it. If the module is upgraded with a new version, the + new code will have to load its own NIF library (or maybe choose not + to). The new code version can however choose to load the exact + same NIF library as the old code if it wants to. Sharing the same + dynamic library will mean that static data defined by the library + will be shared as well. To avoid unintentionally shared static + data, each Erlang module code can keep its own private data. This + global private data can be set when the NIF library is loaded and + then retrieved by calling enif_get_data().

+

There is currently no way to explicitly unload a NIF + library. A library will be automatically unloaded when the module + code that it belongs to is purged by the code server. A NIF + library will can also be unloaded by replacing it with another + version of the library by a second call to + erlang:load_nif/2 from the same module code.

+
+ +
+ INITIALIZATION + + ERL_NIF_INIT(MODULE, ErlNifFunc funcs[], load, reload, upgrade, unload) +

This is the magic macro to initialize a NIF library. It + should be evaluated in global file scope.

+

MODULE is the name of the Erlang module as an + identifier without string quotations. It will be stringified by + the macro.

+

funcs is a static array of function descriptors for + all the implemented NIFs in this library.

+

load, reload, upgrade and unload + are pointers to functions. One of load, reload or + upgrade will be called to initialize the library. + unload is called to release the library. They are all + described individually below.

+
+ + int (*load)(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +

load is called when the NIF library is loaded + and there is no previously loaded library for this module.

+

*priv_data can be set to point to some private data + that the library needs in able to keep a state between NIF + calls. enif_get_data() will return this pointer.

+

load_info is the second argument to erlang:load_nif/2.

+

The library will fail to load if load returns + anything other than 0. load can be NULL in case no + initialization is needed.

+
+ + int (*reload)(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +

reload is called when the NIF library is loaded + and there is already a previously loaded library for this + module code.

+

Works the same as load. The only difference is that + *priv_data already contains the value set by the + previous call to load or reload.

+

The library will fail to load if reload returns + anything other than 0 or if reload is NULL.

+
+ + int (*upgrade)(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info) +

upgrade is called when the NIF library is loaded + and there is no previously loaded library for this module + code, BUT there is old code of this module with a + loaded NIF library.

+

Works the same as load. The only difference is that + *old_priv_data already contains the value set by the + last call to load or reload for the old module + code. It is allowed to write to both *priv_data and + *old_priv_data.

+

The library will fail to load if upgrade returns + anything other than 0 or if upgrade is NULL.

+
+ + void (*unload)(ErlNifEnv* env, void* priv_data) +

unload is called when the module code that + the NIF library belongs to is purged as old. New code + of the same module may or may not exist.

+
+ + +
+
+ +
+ DATA TYPES + + + ErlDrvEnv + +

ErlNifEnv contains information about the context in + which a NIF call is made. This pointer should not be + dereferenced in any way, but only passed on to API + functions. An ErlNifEnv pointer is only valid until + the function, where is what supplied as argument, + returns. There is thus useless and dangerous to store ErlNifEnv + pointers in between NIF calls.

+
+ ErlNifFunc + +

+ +typedef struct { + const char* name; + unsigned arity; + ERL_NIF_TERM (*fptr)(ErlNifEnv* env, ...); +} ErlNifFunc; + +

Describes a NIF by its name, arity and implementation. + fptr is a pointer to the function that implements the + NIF. The number of arguments must match the arity. A NIF of + arity 2 will thus look like:

+

+ +ERL_NIF_TERM my_nif(ErlNifEnv* env, ERL_NIF_TERM arg1, ERL_NIF_TERM arg2) +{ + /* ... */ +} + +

The maximum allowed arity for a NIF is 3 in current implementation.

+
+ ErlNifBinary + +

+ +typedef struct { + unsigned size; + unsigned char* data; +} ErlNifBinary; + +

ErlNifBinary contains transient information about an + inspected binary term. data is a pointer to a buffer + of size bytes with the raw content of the binary.

+
+ ERL_NIF_TERM + +

Variables of type ERL_NIF_TERM can refere to any + Erlang term. This is an opaque type and values of it can only + by used either as arguments to API functions or as return + values from NIFs. A variable of type ERL_NIF_TERM is + only valid until the NIF call, where it was obtained, + returns.

+
+
+
+ + + void*enif_get_data(ErlNifEnv* env) + Get the private data of a NIF library +

Returns the pointer to the private data that was set by load, reload or upgrade.

+
+ void*enif_alloc(ErlNifEnv* env, size_t size) + Allocate dynamic memory. +

Allocate memory of size bytes.

+
+ voidenif_free(ErlNifEnv* env, void* ptr) + Free dynamic memory +

Free memory allocated by enif_alloc.

+
+ intenif_is_binary(ErlNifEnv* env, ERL_NIF_TERM term) + Determine if a term is a binary +

Return true if term is a binary

+
+ intenif_inspect_binary(ErlNifEnv* env, ERL_NIF_TERM bin_term, ErlNifBinary* bin) + Inspect the content of a binary +

Initialize the structure pointed to by bin with + transient information about the binary term + bin_term. Return false if bin_term is not a binary.

+
+ intenif_alloc_binary(ErlNifEnv* env, unsigned size, ErlNifBinary* bin) + Create a new binary. +

Allocate a new binary of size of size + bytes. Initialize the structure pointed to by bin to + refer to the allocated binary.

+
+ voidenif_release_binary(ErlNifEnv* env, ErlNifBinary* bin) + Release a binary. +

Release a binary obtained from enif_alloc_binary or enif_inspect_binary.

+
+ intenif_get_int(ErlNifEnv* env, ERL_NIF_TERM term, int* ip) + Read an integer term. +

Set *ip to the integer value of + term or return false if term is not an integer or is + outside the bounds of type int

+
+ intenif_get_ulong(ErlNifEnv* env, ERL_NIF_TERM term, unsigned long* ip) + Read an unsigned long integer +

Set *ip to the unsigned long integer value of + term or return false if term is not an unsigned + integer or is outside the bounds of type unsigned long

+
+ intenif_get_list_cell(ErlNifEnv* env, ERL_NIF_TERM list, ERL_NIF_TERM* head, ERL_NIF_TERM* tail) + Get head and tail from a list +

Set *head and *tail from + list or return false if list is not a non-empty + list.

+
+ ERL_NIF_TERMenif_make_binary(ErlNifEnv* env, ErlNifBinary* bin) + Make a binary term. +

Make a binary term from bin. Will also release + the binary.

+
+ ERL_NIF_TERMenif_make_badarg(ErlNifEnv* env) + Make a badarg exception. +

Make a badarg exception to be returned from a NIF.

+
+ ERL_NIF_TERMenif_make_int(ErlNifEnv* env, int i) + Create an integer term +

Create an integer term.

+
+ ERL_NIF_TERMenif_make_ulong(ErlNifEnv* env, unsigned long i) + Create an integer term from an unsigned long int +

Create an integer term from an unsigned long int.

+
+ ERL_NIF_TERMenif_make_atom(ErlNifEnv* env, const char* name) + Create an atom term +

Create an atom term from the C-string name. Atom + terms may be saved and used between NIF calls.

+
+ ERL_NIF_TERMenif_make_tuple(ErlNifEnv* env, unsigned cnt, ...) + Create a tuple term. +

Create a tuple term of arity cnt. Expects + cnt number of arguments (after cnt) of type ERL_NIF_TERM as the + elements of the tuple.

+
+ ERL_NIF_TERMenif_make_list(ErlNifEnv* env, unsigned cnt, ...) + Create a list term. +

Create an ordinary list term of length cnt. Expects + cnt number of arguments (after cnt) of type ERL_NIF_TERM as the + elements of the list. An empty list is returned if cnt is 0.

+
+ ERL_NIF_TERMenif_make_list_cell(ErlNifEnv* env, ERL_NIF_TERM head, ERL_NIF_TERM tail) + Create a list cell. +

Create a list cell [head | tail].

+
+ ERL_NIF_TERMenif_make_string(ErlNifEnv* env, const char* string) + Create a string. +

Creates a list containing the characters of the + C-string string.

+
+
+
+ SEE ALSO +

load_nif(3)

+
+
+ diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erl_prim_loader.xml erlang-13.b.3-dfsg/erts/doc/src/erl_prim_loader.xml --- erlang-13.b.1-dfsg/erts/doc/src/erl_prim_loader.xml 2009-03-12 12:15:19.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/erl_prim_loader.xml 2009-11-20 13:29:42.000000000 +0000 @@ -26,6 +26,7 @@ + erl_prim_loader.xml erl_prim_loader Low Level Erlang Loader diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erl_set_memory_block.xml erlang-13.b.3-dfsg/erts/doc/src/erl_set_memory_block.xml --- erlang-13.b.1-dfsg/erts/doc/src/erl_set_memory_block.xml 2009-03-12 12:15:20.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/erl_set_memory_block.xml 2009-11-20 13:30:41.000000000 +0000 @@ -29,7 +29,7 @@ 98-08-05 A - erl_set_memory_block.sgml + erl_set_memory_block.xml erl_set_memory_block Custom memory allocation for Erlang on VxWorks® diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erlsrv.xml erlang-13.b.3-dfsg/erts/doc/src/erlsrv.xml --- erlang-13.b.1-dfsg/erts/doc/src/erlsrv.xml 2009-03-12 12:15:20.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/erlsrv.xml 2009-11-20 13:30:37.000000000 +0000 @@ -29,17 +29,18 @@ 98-04-29 - erlsrv.sgml + erlsrv.xml erlsrv Run the Erlang emulator as a service on Windows NT® -

This utility is specific to Windows NT/2000/XP® It allows Erlang +

This utility is specific to Windows NT/2000/XP® (and subsequent versions of Windows) It allows Erlang emulators to run as services on the Windows system, allowing embedded systems to start without any user needing to log in. The emulator started in this way can be manipulated through the Windows® services applet in a manner similar to other services.

+

Note that erlsrv is not a general service utility for Windows, but designed for embedded Erlang systems.

As well as being the actual service, erlsrv also provides a command line interface for registering, changing, starting and stopping services.

@@ -170,6 +171,14 @@ way. The most common use is for specifying cookies and flags to be passed to init:boot() ().

+ +

: Specifies the Windows® internal service name (not the display name, which is the one erlsrv uses to identify the service).

+

This internal name can not be changed, it is fixed even if the service is renamed. Erlsrv generates a unique internal name when a service is created, it is recommended to keep to the defaut if release-handling is to be used for the application.

+

The internal service name can be seen in the Windows® service manager if viewing Properties for an erlang service.

+
+ +

: A textual comment describing the service. Not mandatory, but shows up as the service description in the Windows® service manager.

+

The naming of the service in a system that @@ -245,6 +254,21 @@ argument string containing spaces and use quoted quotes (\\") to give an quote within the argument string if necessary. + -i[nternalservicename] [<internal name>] + Only allowed for add. Specifies a + Windows® internal service name for the service, which by + default is set to something unique (prefixed with the + original service name) by erlsrv when adding a new + service. Specifying this is a purely cosmethic action and is + not recommended if release handling is to be + performed. The internal service name cannot be changed once + the service is created. The internal name is not to + be confused with the ordinary service name, which is the name + used to identify a service to erlsrv. + -c[omment] [<short description>] + Specifies a textual comment describing the + service. This comment will show upp as the service description + in the Windows® service manager. diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erl.xml erlang-13.b.3-dfsg/erts/doc/src/erl.xml --- erlang-13.b.1-dfsg/erts/doc/src/erl.xml 2009-06-05 13:53:03.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/doc/src/erl.xml 2009-11-20 13:29:54.000000000 +0000 @@ -26,6 +26,7 @@ + erl.xml erl The Erlang Emulator @@ -631,6 +632,10 @@

Same as erlang:system_flag(scheduler_bind_type, processor_spread).

+ s +

Same as + erlang:system_flag(scheduler_bind_type, spread). +

nnts

Same as erlang:system_flag(scheduler_bind_type, no_node_thread_spread). @@ -675,7 +680,7 @@ = C | c]]> = P | p]]> = N | n]]> - = ]]> + = | ]]> : | ]]>

Upper-case letters signify real identifiers and lower-case @@ -689,8 +694,9 @@ node identifiers may be left out. If left out, thread id defaults to t0, core id defaults to c0, processor id defaults to p0, and node id will - be left undefined. Either all processors or no processors - should have node identifiers defined. + be left undefined. Either each logical processor must + belong to one and only one NUMA node, or no logical + processors must belong to any NUMA nodes.

Both increasing and decreasing ]]>s are allowed.

@@ -699,12 +705,19 @@ identifiers are also system wide. Core identifiers are processor wide. Thread identifiers are core wide.

The order of the identifier types imply the hierarchy of the - CPU topology. Currently, the only valid order is: logical, - thread, core, processor, node. That is, thread is part of a - core which is part of a processor which is part of a NUMA - node. This will, however, change in the future, since multiple - NUMA nodes can be part of a processor, but this is not - supported yet. + CPU topology. Valid orders are either + ]]>, + or + ]]>. + That is, thread is part of a core which is part of a processor + which is part of a NUMA node, or thread is part of a core which + is part of a NUMA node which is part of a processor. A cpu + topology can consist of both processor external, and processor + internal NUMA nodes as long as each logical processor belongs + to one and only one NUMA node. If ]]> + is left out, its default position will be before + ]]>. That is, the default is + processor external NUMA nodes.

If a list of identifiers is used in an ]]>:

@@ -773,6 +786,13 @@
+ + + +

Suggested stack size, in kilowords, for scheduler threads. + Valid range is 4-8192 kilowords. The default stack size + is OS dependent.

+
@@ -884,7 +904,7 @@

This environment variable can contain the port number to use when communicating with epmd. The default port will work fine in most cases. A different port can be specified - to allow nodes of independant clusters to co-exist on the same host. + to allow nodes of independent clusters to co-exist on the same host. All nodes in a cluster must use the same epmd port number.

diff -Nru erlang-13.b.1-dfsg/erts/doc/src/erts_alloc.xml erlang-13.b.3-dfsg/erts/doc/src/erts_alloc.xml --- erlang-13.b.1-dfsg/erts/doc/src/erts_alloc.xml 2009-03-12 12:15:20.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/erts_alloc.xml 2009-11-20 13:31:29.000000000 +0000 @@ -26,7 +26,7 @@ 1 03-06-11 1 - erts_alloc.sgml + erts_alloc.xml erts_alloc An Erlang Run-Time System internal memory allocator library. diff -Nru erlang-13.b.1-dfsg/erts/doc/src/escript.xml erlang-13.b.3-dfsg/erts/doc/src/escript.xml --- erlang-13.b.1-dfsg/erts/doc/src/escript.xml 2009-03-12 12:15:21.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/escript.xml 2009-11-20 13:32:31.000000000 +0000 @@ -26,6 +26,7 @@ + escript.xml escript Erlang scripting support @@ -73,14 +74,15 @@ usage: factorial integer $ factorial five usage: factorial integer -

The header of an Erlang script differs from a normal Erlang module. - The first line is intended to be the interpreter line, which invokes - . However if you invoke - like this

+

The header of the Erlang script in the example differs from + a normal Erlang module. The first line is intended to be the + interpreter line, which invokes + . However if you invoke the + like this

 $ escript factorial 5        
-

the contents of the first line does not matter, but it cannot contain - Erlang code as it will be ignored.

+

the contents of the first line does not matter, but it + cannot contain Erlang code as it will be ignored.

The second line in the example, contains an optional directive to the Emacs editor which causes it to enter the major mode for editing Erlang source files. If the @@ -103,13 +105,14 @@

The rest of the Erlang script file may either contain - Erlang source code, an inlined beam file or an inlined - archive file.

+ Erlang source code, an inlined beam file or an + inlined archive file.

-

An Erlang script file must always contain the function main/1. - When the script is run, the will be called with a list - of strings representing the arguments given to the script (not changed or - interpreted in any way).

+

An Erlang script file must always contain the function + main/1. When the script is run, the + function will be called with a list + of strings representing the arguments given to the script (not + changed or interpreted in any way).

If the function in the script returns successfully, the exit status for the script will be 0. If an exception is generated @@ -133,7 +136,7 @@

 -include_lib("kernel/include/file.hrl").        

to include the record definitions for the records used by the - function.

+ function.

The script will be checked for syntactic and semantic correctness before being run. If there are warnings (such as @@ -152,7 +155,7 @@

Execution of interpreted code is slower than compiled code. If much of the execution takes place in interpreted code it - may be worthwile to compile it, even though the compilation + may be worthwhile to compile it, even though the compilation itself will take a little while.

As mentioned earlier, it is possible to have a script which @@ -180,11 +183,21 @@ name of a module which has an exported main/1 function. See code(3) for more information about archives and code loading.

-

The support for loading of code from archive files - is experimental. The sole purpose of releasing it before it - is ready is to obtain early feedback. The file format, - semantics, interfaces etc. may be changed in a future - release. The flag -escript is also experimental.

+ +

In many cases it is very convenient to have a header in + the escript, especially on Unix platforms. But the header is + in fact optional. This means that you directly can "execute" + an Erlang module, beam file or archive file without adding + any header to them. But then you have to invoke the script + like this:

+
+$ escript factorial.erl 5
+factorial 5 = 120
+$ escript factorial.beam 5
+factorial 5 = 120
+$ escript factorial.zip 5
+factorial 5 = 120
+
@@ -192,6 +205,22 @@
Options accepted by escript + -c + Compile the escript regardless of the value of the mode attribute. + + + -d + Debug the escript. Starts the debugger, loads the module + containing the main/1 function into the debugger, sets a + breakpoint in main/1 and invokes main/1. If the + module is precompiled, it must be explicitly compiled with the + debug_info option. + + + -i + Interpret the escript regardless of the value of the mode attribute. + + -s Only perform a syntactic and semantic check of the script file. Warnings and errors (if any) are written to the standard output, but diff -Nru erlang-13.b.1-dfsg/erts/doc/src/inet_cfg.xml erlang-13.b.3-dfsg/erts/doc/src/inet_cfg.xml --- erlang-13.b.1-dfsg/erts/doc/src/inet_cfg.xml 2009-03-12 12:15:21.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/inet_cfg.xml 2009-11-20 13:31:46.000000000 +0000 @@ -26,6 +26,7 @@ 2004-03-02 PA1 + inet_cfg.xml
@@ -52,7 +53,10 @@ default configuration settings and a native lookup method that should work correctly under most circumstances. Erlang will not read any information from system inet configuration files - (like /etc/hosts, /etc/resolv.conf, etc) in these modes.

+ (like /etc/host.conf, /etc/nsswitch.conf, etc) in these modes, + except for /etc/resolv.conf and /etc/hosts that is read and monitored + for changes on Unix platforms for the internal DNS client + inet_res.

If Erlang is started in long name distributed mode, it needs to get the domain name from somewhere and will read system inet configuration files for this information. Any hosts and resolver @@ -106,6 +110,56 @@ specify the name of the file with full path.

+ + +

+

+

+

Specify a system file that Erlang should read resolver + configuration from for the internal DNS client + inet_res, + and monitor for changes, even if it does not exist. + The path must be absolute.

+

This may override the configuration parameters + and + depending on the contents + of the specified file. They may also change any time in the future + reflecting the file contents.

+

If the file is specified as an empty string "", + no file is read nor monitored in the future. This emulates + the old behaviour of not configuring the DNS client when + the node is started in short name distributed mode.

+

If this parameter is not specified it defaults to + unless the environment variable + is set which defines + the directory for this file to some maybe other than + .

+

+
+ + +

+

+

+

Specify a system file that Erlang should read resolver + configuration from for the internal hosts file resolver + and monitor for changes, even if it does not exist. + The path must be absolute.

+

These host entries are searched after all added with + {file, hosts, File} above or + {host, IP, Aliases} below when the lookup option + file is used.

+

If the file is specified as an empty string "", + no file is read nor monitored in the future. This emulates + the old behaviour of not configuring the DNS client when + the node is started in short name distributed mode.

+

If this parameter is not specified it defaults to + unless the environment variable + is set which defines + the directory for this file to some maybe other than + .

+

+

@@ -139,7 +193,8 @@

Add address (and port, if other than default) of primary - nameserver.

+ nameserver to use for + inet_res.

@@ -149,7 +204,8 @@

Add address (and port, if other than default) of secondary - nameserver.

+ nameserver for + inet_res.

@@ -157,7 +213,8 @@

-

Add search domains.

+

Add search domains for + inet_res.

@@ -167,9 +224,12 @@

Specify lookup methods and in which order to try them. The valid methods are: (use system calls), - (use data retrieved from system configuration files and/or - the user configuration file) or (use the Erlang DNS client for - nameserver queries).

+ (use host data retrieved from + system configuration files and/or + the user configuration file) or + (use the Erlang DNS client + inet_res + for nameserver queries).

@@ -185,8 +245,11 @@

-

Set how often (in millisec) the resolver cache is refreshed (i.e. - expired DNS records are deleted). Default is 1 h.

+

Set how often (in millisec) + the resolver cache for + inet_res. + is refreshed (i.e. expired DNS records are deleted). + Default is 1 h.

@@ -194,7 +257,9 @@

-

Set the time to wait until retry (in millesec) for DNS queries. +

Set the time to wait until retry (in millisec) for DNS queries + made by + inet_res. Default is 2 sec.

@@ -203,7 +268,9 @@

-

Set the number of DNS queries to try before giving up. +

Set the number of DNS queries + inet_res + will try before giving up. Default is 3.

@@ -212,7 +279,48 @@

-

Tells the system to use IPv6. Default is false.

+

Tells the DNS client + inet_res + to look up IPv6 addresses. Default is false.

+

+ + + +

+

+

+

Tells the DNS client + inet_res + to use TCP (Virtual Circuit) instead of UDP. Default is false.

+

+
+ + +

+

+

+

Sets the EDNS version that + inet_res + will use. The only allowed is zero. Default is false + which means to not use EDNS.

+

+
+ + +

+

+

+

Sets the allowed UDP payload size + inet_res + will advertise in EDNS queries. Also sets the limit + when the DNS query will be deemed too large for UDP + forcing a TCP query instead, which is not entirely + correct since the advertised UDP payload size of the + individual nameserver is what should be used, + but this simple strategy will do until a more intelligent + (probing, caching) algorithm need be implemented. + The default is 1280 which stems from the + standard Ethernet MTU size.

@@ -259,8 +367,11 @@ but wants Erlang to read all information necessary from start and use that for resolving names and addresses. In case lookup fails, Erlang should request the data from a nameserver (using the Erlang - DNS client). Furthermore, DNS records should never be cached. The user - configuration file (in this example named , stored + DNS client, set to use EDNS allowing larger responses). + The resolver configuration will be updated when + its configuration file changes, furthermore, DNS records + should never be cached. The user configuration file + (in this example named , stored in directory ) could then look like this (Unix):

@@ -269,8 +380,12 @@
       {file, hosts, "/etc/hosts"}.
       %% add a particular host
       {host, {134,138,177,105}, ["finwe"]}.
-      %% read nameserver info from here
-      {file, resolv, "/etc/resolv.conf"}.
+      %% do not monitor the hosts file
+      {hosts_file, ""}.
+      %% read and monitor nameserver config from here
+      {resolv_conf, "/usr/local/etc/resolv.conf"}.
+      %% enable EDNS
+      {edns,0}.
       %% disable caching
       {cache_size, 0}.
       %% specify lookup method
diff -Nru erlang-13.b.1-dfsg/erts/doc/src/init.xml erlang-13.b.3-dfsg/erts/doc/src/init.xml
--- erlang-13.b.1-dfsg/erts/doc/src/init.xml	2009-03-12 12:15:21.000000000 +0000
+++ erlang-13.b.3-dfsg/erts/doc/src/init.xml	2009-11-20 13:29:43.000000000 +0000
@@ -26,6 +26,7 @@
     
     
     
+    init.xml
   
   init
   Coordination of System Startup
diff -Nru erlang-13.b.1-dfsg/erts/doc/src/Makefile erlang-13.b.3-dfsg/erts/doc/src/Makefile
--- erlang-13.b.1-dfsg/erts/doc/src/Makefile	2009-03-12 12:15:22.000000000 +0000
+++ erlang-13.b.3-dfsg/erts/doc/src/Makefile	2009-11-20 13:30:19.000000000 +0000
@@ -23,17 +23,11 @@
 # Application version
 # ----------------------------------------------------
 include ../../vsn.mk
-
+APPLICATION=erts
 # ----------------------------------------------------
 # Release directory specification
 # ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/erts-$(VSN)
-
-# ----------------------------------------------------
-# Include dependency
-# ----------------------------------------------------
-
-include make.dep
+RELSYSDIR = $(RELEASE_PATH)/$(APPLICATION)-$(VSN)
 
 # ----------------------------------------------------
 # Target Specs
@@ -77,11 +71,17 @@
 	notes.xml \
 	notes_history.xml
 
+TOPDOCDIR=../../../doc
+
 BOOK_FILES = book.xml
 
 GIF_FILES = \
 	erl_ext_fig.gif
 
+XML_FILES = \
+	$(BOOK_FILES) $(XML_CHAPTER_FILES) \
+	$(XML_PART_FILES) $(XML_REF3_FILES) $(XML_REF1_FILES) $(XML_APPLICATION_FILES)
+
 # ----------------------------------------------------
 
 HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \
@@ -89,38 +89,18 @@
 
 INFO_FILE     = ../../info
 INFO_FILE_SRC = ../../info.src
-EXTRA_FILES = \
-	$(DEFAULT_GIF_FILES) \
-	$(DEFAULT_HTML_FILES) \
-	$(XML_REF1_FILES:%.xml=$(HTMLDIR)/%.html) \
-	$(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \
-	$(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html)
 
 MAN1_FILES = $(XML_REF1_FILES:%.xml=$(MAN1DIR)/%.1)
 MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3)
 
-TEX_FILES_REF_MAN = $(XML_REF1_FILES:%.xml=%.tex) \
-	$(XML_REF3_FILES:%.xml=%.tex) \
-	$(XML_APPLICATION_FILES:%.xml=%.tex)
-TEX_FILES_USERS_GUIDE = \
-	part.tex $(XML_CHAPTER_FILES:%.xml=%.tex)
-TEX_FILES_BOOK = \
-	$(BOOK_FILES:%.xml=%.tex)
+HTML_REF_MAN_FILE = $(HTMLDIR)/index.html
 
-TOP_PDF_FILE = erts-$(VSN).pdf
-TOP_PS_FILE  = erts-$(VSN).ps
-
-$(TOP_PDF_FILE): book.dvi ../../vsn.mk
-	$(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@
-
-$(TOP_PS_FILE): book.dvi ../../vsn.mk
-	$(DVI2PS) $(DVIPS_FLAGS) -f $< > $@
+TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf
 
 # ----------------------------------------------------
 # FLAGS 
 # ----------------------------------------------------
 XML_FLAGS += 
-DVIPS_FLAGS += 
 
 # ----------------------------------------------------
 # Targets
@@ -128,21 +108,13 @@
 $(HTMLDIR)/%.gif: %.gif
 	$(INSTALL_DATA) $< $@
 
-ifeq ($(DOCTYPE),pdf)
-docs: pdf
-else
-ifeq ($(DOCTYPE),ps)
-docs: ps
-else
-docs: html gifs man $(INFO_FILE)
-endif
-endif
+docs: pdf html man $(INFO_FILE) 
 
-pdf: $(TOP_PDF_FILE)
+$(TOP_PDF_FILE): $(XML_FILES)
 
-ps: $(TOP_PS_FILE)
+pdf: $(TOP_PDF_FILE)
 
-html: $(HTML_FILES)
+html: gifs $(HTML_REF_MAN_FILE)
 
 man: $(MAN1_FILES) $(MAN3_FILES)
 
@@ -154,41 +126,28 @@
 
 debug opt: 
 
-clean_tex: clean
-
 clean:
-	rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK)
-	rm -f $(HTML_FILES) $(MAN1_FILES) $(MAN3_FILES)
-	rm -f $(EXTRA_FILES) $(HTMLDIR)/note.gif
-	rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE)
-	rm -f errs core *~ min_head.gif \
-	$(LATEX_CLEAN) 
+	rm -rf $(HTMLDIR)/*
+	rm -f $(MAN1DIR)/*
+	rm -f $(MAN3DIR)/*
+	rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo)
+	rm -f errs core *~ 
 
 # ----------------------------------------------------
 # Release Target
 # ---------------------------------------------------- 
 include $(ERL_TOP)/make/otp_release_targets.mk
 
-ifeq ($(DOCTYPE),pdf)
-release_docs_spec: pdf
-	$(INSTALL_DIR) $(RELEASE_PATH)/pdf
-	$(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf
-else
-ifeq ($(DOCTYPE),ps)
-release_docs_spec: ps
-	$(INSTALL_DIR) $(RELEASE_PATH)/ps
-	$(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps
-else
 release_docs_spec: docs
+	$(INSTALL_DIR) $(RELSYSDIR)/doc/pdf
+	$(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf
 	$(INSTALL_DIR) $(RELSYSDIR)/doc/html
-	$(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \
+	$(INSTALL_DATA) $(HTMLDIR)/* \
 		$(RELSYSDIR)/doc/html
 	$(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR)
+	$(INSTALL_DIR) $(RELEASE_PATH)/man/man3
+	$(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3
 	$(INSTALL_DIR) $(RELEASE_PATH)/man/man1
 	$(INSTALL_DATA) $(MAN1_FILES) $(RELEASE_PATH)/man/man1
-	$(INSTALL_DIR) $(RELEASE_PATH)/man/man3
-	$(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3
-endif
-endif
 
 release_spec:
diff -Nru erlang-13.b.1-dfsg/erts/doc/src/match_spec.xml erlang-13.b.3-dfsg/erts/doc/src/match_spec.xml
--- erlang-13.b.1-dfsg/erts/doc/src/match_spec.xml	2009-03-12 12:15:22.000000000 +0000
+++ erlang-13.b.3-dfsg/erts/doc/src/match_spec.xml	2009-11-20 13:30:53.000000000 +0000
@@ -29,7 +29,7 @@
     
     1999-06-01
     PA1
-    match_spec.sgml
+    match_spec.xml
   
   

A "match specification" (match_spec) is an Erlang term describing a small "program" that will try to match something (either the @@ -260,7 +260,7 @@ either a process identifier or the registered name of a process to set trace flags on, the second is the disable list, and the third is the enable list. Returns - if any trace propery was changed for the + if any trace property was changed for the trace target process or if not. It may only be used in the part when tracing.

@@ -441,7 +441,7 @@ , but completely ignore the return values. Regardless of what happens in this part, the match has succeeded. - If the match_spec is executed when selectiing objects from an ETS table:

+ If the match_spec is executed when selecting objects from an ETS table:

Evaluate the expressions in order and return the value of the last expression (typically there is only one expression in this context)
@@ -459,7 +459,7 @@ ETS context.

When tracing there is no return value to produce, the match specification either matches or doesn't. The effect when the - expression matches is a trace messsage rather then a returned + expression matches is a trace message rather then a returned term. The 's are executed as in an imperative language, i.e. for their side effects. Functions with side effects are also allowed when tracing.

diff -Nru erlang-13.b.1-dfsg/erts/doc/src/notes_history.xml erlang-13.b.3-dfsg/erts/doc/src/notes_history.xml --- erlang-13.b.1-dfsg/erts/doc/src/notes_history.xml 2009-03-12 12:15:22.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/notes_history.xml 2009-11-20 13:32:23.000000000 +0000 @@ -26,6 +26,7 @@ nil nil nil + notes_history.xml
@@ -55,7 +56,7 @@ implementation now corresponds to the documentation in ERTS User's Guide. The following things are corrected:

- Guard sematics was wrong when it came to logical + Guard semantics was wrong when it came to logical operators and exceptions. evaluated to with bound to an @@ -283,7 +284,7 @@

A few portability enhancements for the R9C-1 Open Source release: The installer for Windows can now be built with NSIS 2.0 (as well as with the NSIS 2.0b3). The driver - header files updated to allowed drivers to be built wich + header files updated to allowed drivers to be built which the MinGW compiler on Windows. Minor portability enhancement in .

Own Id: OTP-4789

diff -Nru erlang-13.b.1-dfsg/erts/doc/src/notes.xml erlang-13.b.3-dfsg/erts/doc/src/notes.xml --- erlang-13.b.1-dfsg/erts/doc/src/notes.xml 2009-06-05 13:53:36.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/doc/src/notes.xml 2009-11-20 13:31:57.000000000 +0000 @@ -26,9 +26,574 @@ nil nil nil + notes.xml

This document describes the changes made to the ERTS application.

+
Erts 5.7.4 + +
Fixed Bugs and Malfunctions + + +

+ An insufficient stack allocation was made when reading + CPU information on BSD operating systems. (Thanks Michael + Turner and Akira Kitada)

+

+ Own Id: OTP-8207

+
+ +

+ A bug when supplying an argument without a dash directly + after the program name when starting erlang could prevent + distribution to start. This is now corrected.

+

+ Own Id: OTP-8209

+
+ +

+ A ticker process could potentially be blocked + indefinitely trying to send a tick to a node not + responding. If this happened, the connection would not be + brought down as it should.

+

+ Own Id: OTP-8218

+
+ +

+ Using certain firewalls (i.e. MS IAS Client and certain + versions of COMODO) could expose an undocumented + behaviour in the Win32 socket interface causing the name + resolution calls to hang infinitely. This is now worked + around by adding possibilities for port programs under + Windows to use overlapped I/O on their standard + input/output file handles.

+

+ Own Id: OTP-8230

+
+ +

+ Fixed bug on ETS tables with write_concurrency. + The emulator could crash when doing a select or + match with a bound key without finding any object.

+

+ Own Id: OTP-8242

+
+ +

The information-request / + information-response, and + group-leader-change-request / + group-leader-changed-response signal pairs + described below did not always adhere to the signal order + guarantees of Erlang's signal model in the runtime system + with SMP support. These signals could for example + sometimes pass exit signals.

+

The following BIFs behaviors can be modeled as if an + asynchronous information-request signal is sent to + Pid. If Pid is alive, it responds with an + asynchronous information-response signal; + otherwise, the runtime system responds with a + no-such-process signal. When the response is + received, the caller transforms it into the result of the + BIF.

is_process_alive(Pid) + erlang:process_display(Pid, Type) + process_info(Pid) + process_info(Pid, ItemSpec) +

When Pid resides on the same node as the caller + of group_leader(GroupLeader, Pid), the + group_leader/2 BIFs behavior can be modeled as if + an asynchronous group-leader-change-request signal + is sent to Pid. If Pid is alive, it + responds with an asynchronous + group-leader-changed-response signal; otherwise, + the runtime system responds with a no-such-process + signal. When the response is received, the caller + transforms it into the result of the BIF. The distributed + case which only consists of an asynchronous + group-leader-change-request signal and no response + is not effected.

+

+ Own Id: OTP-8245

+
+ +

+ Errors in the system_profile documentation has + been corrected.

+

+ Own Id: OTP-8257

+
+ +

+ Low watermark socket option modified high watermark + instead of low watermark in the inet_driver. (Thanks to + Feng Yu and Tuncer Ayaz)

+

+ Own Id: OTP-8279

+
+ +

+ A race condition could cause the runtime system with SMP + support to end up in a completely unresponsive state.

+

+ Own Id: OTP-8297

+
+
+
+ + +
Improvements and New Features + + +

+ The use of pthread_cond_timedwait() have been + completely removed from the runtime system. This since + its behavior is unpredictable when the system clock is + suddenly changed. The previous use of it was harmless.

+

+ Own Id: OTP-8193

+
+ +

+ The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

+

+ Own Id: OTP-8201

+
+ +

+ A new garbage collecting strategy for binaries which is + more aggressive than the previous implementation. + Binaries now has a virtual binary heap tied to each + process. When binaries are created or received to a + process it will check if the heap limit has been reached + and if a reclaim should be done. This imitates the + behavior of ordinary Erlang terms. The virtual heaps are + grown and shrunk like ordinary heaps. This will lessen + the memory footprint of binaries in a system.

+

+ Own Id: OTP-8202

+
+ +

+ The ErlDrvTermData term types used by + driver_output_term() and driver_send_term() + have been extended with the term types + ERL_DRV_INT64, and ERL_DRV_UINT64 for + passing 64-bit integers. Also the 64-bit integer data + types ErlDrvSInt64 and ErlDrvUInt64 have + been introduced.

+

+ For more information see the erl_driver(3) + documentation.

+

+ Own Id: OTP-8205

+
+ +

+ [escript] The restriction that the first line in escripts + must begin with #! has been removed.

+

+ [escript] Some command line options to the escript + executable has now been documented. For example you can + run an escript in the debugger by just adding a command + line option.

+

+ [escript] The documentation of the escript header syntax + has been clarified. For example the header is optional. + This means that it is possible to directly "execute" + .erl, .beam and.zip files.

+

+ Own Id: OTP-8215

+
+ +

+ The instruction for building OTP on Windows was outdated + and incomplete, the document is updated.

+

+ Also the otp_build script required windows drives to show + up in Cygwin using the /cygdrive prefix. That requirement + is now removed.

+

+ Own Id: OTP-8219

+
+ +

+ A module can have native implemented functions (NIFs) + that are dynamically loaded by calling + erlang:load_nif/2. This is an experimental feature + that is not yet intended for production systems. It is + released with intention to get some early feedback on the + interfaces before they are carved in stone.

+

+ Own Id: OTP-8220

+
+ +

+ The float/1 BIF would always force a garbage + collection. The BIFs size/1, byte_size/1, + bit_size/1, abs/1, and round/1 would + force a garbage-collection if the result was not a + sufficiently small integer.

+

+ Own Id: OTP-8221

+
+ +

+ The erlang:port_command/3 + BIF has been added. erlang:port_command/3 is + currently not auto imported, but it is planned to be auto + imported in OTP R14. For more information see the + erlang(3) + documentation.

+

+ Own Id: OTP-8225

+
+ +

+ 'configure --enable-darwin-64bit' would fail if + Snow Leopard had been booted with the 64-bit kernel. + (Thanks to Ryan M. Graham.)

+

+ Own Id: OTP-8236

+
+
+
+ +
+ +
Erts 5.7.3 + +
Fixed Bugs and Malfunctions + + +

+ On Windows, open_port({spawn,Command},Opts) could not run + executables with spaces in the path or filename, + regardless of quoting efforts. While + open_port({spawn_executable,Exec},Opts) can run any + executable, it was still impossible to use 'spawn' to do + the same thing. This is now corrected.

+

+ Own Id: OTP-8055

+
+ +

+ The scheduler bind type processor_spread spread + schedulers too much on large NUMA systems.

+

+ The new scheduler bind type spread spreads + schedulers as much as possible, and behaves as + processor_spread previously did. For more + information see the documentation of the +sbt + command line argument in the erl(1) documentation, + and the documentation of + erlang:system_flag(scheduler_bind_type, + SchedulerBindType).

+

+ Own Id: OTP-8063

+
+ +

+ Automatically detected CPU topology on Linux system could + erroneously contain logical processors with -1 as + identifiers. This happened when + sysconf(_SC_NPROCESSORS_CONF) returned a value + larger than the amount of logical processors found.

+

+ Own Id: OTP-8064

+
+ +

+ When the minimal term [] (end of list) was sent as the + complete message to a process on another node, and + received there, it could not be decoded. This bug is now + corrected. Fortunately [] is uncommon as the complete + message in real applications but it is a serious bug + anyway.

+

+ Own Id: OTP-8092

+
+ +

A bug when the floating point exception pointer was + not initialized has been corrected. It manifested itself + on CentOS 5.1 sometimes when a floating point value was + sent to a remote node. Bug reported and patch suggested + by David Reiss, confirmed by Mikael Pettersson.

+

Some build problems on IRIX was also corrected. + Problem reported by Patrick Baggett, patch by Mikael + Pettersson.

+

+ Own Id: OTP-8095

+
+ +

+ A terminating process could erroneously unregister a name + for another process. This could occur under the following + conditions: The name of the terminating process was + unregistered and then registered for another process + simultaneously as the process that first had the name was + terminating.

+

+ Own Id: OTP-8099 Aux Id: seq11344

+
+ +

+ Running erlc in a very deep directory (with a path length + of more 256 or more characters) would cause the emulator + to crash in a call to list_to_atom/1. (Thanks to + Chris Newcombe.)

+

+ Own Id: OTP-8124

+
+ +

+ A deadlock of the runtime system could occur when + unregistering the name of a port.

+

+ Own Id: OTP-8145

+
+ +

+ Makefile.in has been updated to use the LDFLAGS + environment variable (if set). (Thanks to Davide + Pesavento.)

+

+ Own Id: OTP-8157

+
+ +

+ The pthread rwlock implemention on Linux could cause + starvation of writers. We, therefore, now use our own + rwlock implementation on Linux.

+

+ Own Id: OTP-8158

+
+ +

+ Open source Erlang builds are updated to work well on + Snow Leopard (MacOS X 10.6)

+

+ Own Id: OTP-8168

+
+ +

+ A call to erlang:system_info(schedulers_online) + could end up in an infinite loop. This happened if the + amount of schedulers was larger than one, the amount of + schedulers online was one, and someone was blocking + multi-scheduling.

+

+ Own Id: OTP-8169

+
+ +

+ An error in erlang:system_profile/2 could cause + timestamped messages to arrive out of order in the SMP + case. This has now been fixed.

+

+ Own Id: OTP-8171

+
+ +

+ binary_to_atom/2 and + binary_to_existing_atom/2 would leak memory if the + binary contained unaligned data.

+

+ Own Id: OTP-8192

+
+ +

+ The async thread pool in the runtime system without SMP + support used a memory allocator that was not thread safe + for async jobs.

+

+ Own Id: OTP-8194

+
+
+
+ + +
Improvements and New Features + + +

+ Processor internal NUMA nodes are now supported in the + ERTS internal CPU topology representation. For more + information see the documentation of the +sct + command line argument in the erl(1) documentation, + and the documentation of + erlang:system_info(cpu_topology).

+

+ Own Id: OTP-8041

+
+ +

+ Documentation for ets improved about concurrency.

+

+ Own Id: OTP-8050

+
+ +

+ Emulator flags in an escript were earlier inherited to + emulators started from from the emulator running the + escript. For example when an escript invoked + os:cmd("erl"), the new emulator were given + erroneous emulator flags. This bug has now been fixed

+

+ Escript filenames may now contain dots.

+

+ Own Id: OTP-8060

+
+ +

+ Made some BIFs non-recursive (relational operators,hash + and phash) to limit internal stack usage.

+

+ Own Id: OTP-8065

+
+ +

+ Fixed Windows specific bug in erl_prim_loader. Now it + handles the root directory (e.g. c:/) better. This bug + affected the directory listing in the debugger.

+

+ Own Id: OTP-8080

+
+ +

+ A TCP socket with option {packet,4} could crash + the emulator if it received a packet header with a very + large size value (>2Gb). The same bug caused + erlang:decode_packet/3 to return faulty values. + (Thanks to Georgos Seganos.)

+

+ Own Id: OTP-8102

+
+ +

+ The maximum size of the export table has been raised from + 65536 to 524288 entries.

+

+ Own Id: OTP-8104 Aux Id: seq11345

+
+ +

+ The file module has now a read_line/1 function similar to + the io:get_line/2, but with byte oriented semantics. The + function file:read_line/1 works for raw files as well, + but for good performance it is recommended to use it + together with the 'read_ahead' option for raw file + access.

+

+ Own Id: OTP-8108

+
+ +

+ Fixed bug causing emulator crash when reading a term in + external format containing a corrupt list with a negative + length.

+

+ Own Id: OTP-8117

+
+ +

+ New emulator flag +sss, to set stack size of + scheduler threads.

+

+ Own Id: OTP-8119

+
+ +

+ The Windows utility Erlsrv, run in interactive mode now + accepts options for registering internal service name and + description field of Windows registry database.

+

+ Own Id: OTP-8132

+
+ +

+ erlang:demonitor(Mon, [flush]) has been optimized. + Previously it always searched the message queue of the + caller for a 'DOWN' message. Current + implementation only search the message queue when + necessary. It is quite common that the search is not + necessary.

+

+ A new option info has been added to + erlang:demonitor/2. For more information see the + erlang(3) documentation.

+

+ Own Id: OTP-8143

+
+ +

+ I/O tasks could unnecessarily be rescheduled. This was + harmless, but not useful work.

+

+ Own Id: OTP-8148

+
+ +

+ Minor improvements of erlang:memory/[1,2].

+

+ Own Id: OTP-8152

+
+ +

+ New configuration option to enable use of shared zlib.

+

+ Own Id: OTP-8155

+
+ +

+ Fixed smp bug in ETS that could cause emulator crash when + table with more than 1000 objects accessed by several + processes, including calls to variants of select + or match combined with concurrent object deletion.

+

+ Own Id: OTP-8166 Aux Id: seq11392

+
+ +

+ The code path interpretation is now more relaxed. The + flag -code_path_choice now defaults to relaxed instead of + strict. See the documentation of code and init for more + info.

+

+ Own Id: OTP-8170

+
+ +

+ Load balancing of run queues and check for I/O are + triggered more often than before in situations where + processes are scheduled often but are doing very little + work each time they execute.

+

+ Own Id: OTP-8172

+
+ +

+ Call tracing binary comprehensions would cause an + emulator crash. (Thanks to Paul Mineiro.)

+

+ Own Id: OTP-8179

+
+ +

+ binary_to_term/1 would crash the emulator instead + of generating a badarg exception when given + certain invalid terms. (Thanks to Scott Lystig Fritchie.)

+

+ Own Id: OTP-8180

+
+
+
+ +
+
Erts 5.7.2
Fixed Bugs and Malfunctions @@ -148,7 +713,7 @@ write_concurrency, as it is achieved at the expense of some execution and memory overhead. ets:select and select_count has also been - improved for all tables to not aquire exclusive table + improved for all tables to not acquire exclusive table lock during the iteration.

Own Id: OTP-7922

@@ -308,7 +873,7 @@ source release. The support is still in its infancy and has only been used to cross compile on Linux for a different cpu architecture and a different Linux version, - but should be extendable to support other platforms as + but should be extendible to support other platforms as well. The cross configuration files with examples are placed in $ERL_TOP/xcomp/. View README.xcomp and run $ERL_TOP/otp_build -help for further information.

@@ -1050,7 +1615,7 @@

- Improved BIF rescheduling functionanality.

+ Improved BIF rescheduling functionality.

Own Id: OTP-7587

@@ -1323,7 +1888,7 @@

- The re module is exdended with repetitive matches (global + The re module is extended with repetitive matches (global option) and replacement function.

Own Id: OTP-7494 Aux Id: OTP-7181

@@ -1473,7 +2038,7 @@

IPv6 name resolving has now been fixed to use - getaddrinfo() patch (thorughly reworked) courtesy of Love + getaddrinfo() patch (thoroughly reworked) courtesy of Love Hörnquist-Åstrand submitted by Fredrik Thulin. It also can use gethostname2() patch (also reworked) courtesy of Mikael Magnusson for debian submitted by Sergei Golovan.

@@ -1567,7 +2132,7 @@

- Configuration option witout-termcap can be used to + Configuration option without-termcap can be used to disable the use of termcap libraries for terminal cursor control in the shell.

@@ -1598,7 +2163,7 @@ The race occurred when a process removed a table during termination simultaneously as another process removed the same table via ets:delete/1 and a third process - created a table that accidently got the same internal + created a table that accidentaly got the same internal table index as the table being removed.

Own Id: OTP-7349

@@ -2578,7 +3143,7 @@

- Hanging writes on temporarilly unavailable NFS + Hanging writes on temporarily unavailable NFS filesystems could cause the execution of (not file related) erlang code to get blocked even though I/O threads were used. This is now corrected.

@@ -2604,7 +3169,7 @@

- In the SMP emulator, if serveral processes called + In the SMP emulator, if several processes called ets:update_counter/3 (even for different tables) when the counter values exceeded 27 bits, the counter values could be corrupted or the emulator could crash.

@@ -2624,7 +3189,7 @@

Creating a named table using ets:new/2 or renaming a named table using ets:rename/2 could in - rare circumstances succed, meaning that there would be + rare circumstances succeed, meaning that there would be two or more tables with the same name. Now such call will fail with a badarg exception as it is supposed to do.

@@ -2636,7 +3201,7 @@ emulator.

SMP emulator only: Using ets:rename/2 on a table that ets:safe_fixtable/2 has been used on - could casue an emulator crash or undefined behaviour + could cause an emulator crash or undefined behaviour because of a missing lock.

Own Id: OTP-6872 Aux Id: seq10756, seq10757

@@ -2771,7 +3336,7 @@ expects to be updated also when the is invalid. This situation occurs seldom, but when the runtime system has async-threads enabled and - ports are killed it can. When it occured the runtime + ports are killed it can. When it occurred the runtime system crashed.

Own Id: OTP-6729

@@ -3440,7 +4005,7 @@ Fixed Bugs and Malfunctions -

The run_erl program now aquires its psedo-ttys using +

The run_erl program now acquires its pseudo-ttys using openpty(3), so that it will work on newer Linux distributions that don't have the traditional pseudo-tty devices in the file system. On platforms that don't have @@ -3529,7 +4094,7 @@

Behavior in case of disappeared nodes when using the dist_auto_connect once got changed in R11B-1. The - timeouts regarding normal distributed operationes is now + timeouts regarding normal distributed operations is now reverted to the old (pre R11B-1).

Own Id: OTP-6258 Aux Id: OTP-6200, seq10449

@@ -3612,7 +4177,7 @@

The SMP emulator now avoids locking for the following operations (thus making them as fast as in the UP - emulator): , atom comparision, atom + emulator): , atom comparison, atom hashing, .

Own Id: OTP-6252

@@ -3866,7 +4431,7 @@ focused on stability and there are a number of steps with optimizations to follow before it will take full advantage of multi processor systems. - The released system is however thruly multi threaded + The released system is however truly multi threaded and you will notice increased performance for many applications already. We recommend that you evaluate your application on @@ -4049,7 +4614,7 @@

A failing bit syntax construction could fail with the - PREVIOUS exeption reason that had occured in the process + PREVIOUS exception reason that had occurred in the process (instead of with ).

Own Id: OTP-5911

@@ -4328,7 +4893,7 @@

On VxWorks, epmd did not handle file descriptors with higher numbers than 63. Also, if epmd should get a file descriptor with a number >= FD_SETSIZE, it will close a - the file descritport and write a message to the log + the file descriptor and write a message to the log (instead of mysteriously fail); the Erlang node that tried to register will fail with a duplicate_name error (unfortunately, epmd has no way to indicate to the Erlang @@ -4470,7 +5035,7 @@ linear scan register allocator is now also available on ppc. Plus lots of cleanups.

Minor hybrid heap corrections.

-

The maximum size of a heap used to be articially +

The maximum size of a heap used to be artificially limited so that the size of a heap would fit in 28 bits; that limitation could cause the emulator to terminate in a garbage collection even if there still was available @@ -4587,7 +5152,7 @@

If a process had node links (created by - ), excuting + ), executing for that process would crash the emulator.

Own Id: OTP-5420

@@ -4838,7 +5403,7 @@

std_alloc (std short for standard) was sometimes called def_alloc (def short for default). std_alloc is now - everywhere refered to as std_alloc.

+ everywhere referred to as std_alloc.

Own Id: OTP-5216

diff -Nru erlang-13.b.1-dfsg/erts/doc/src/part_notes_history.xml erlang-13.b.3-dfsg/erts/doc/src/part_notes_history.xml --- erlang-13.b.1-dfsg/erts/doc/src/part_notes_history.xml 2009-03-12 12:15:23.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/part_notes_history.xml 2009-11-20 13:32:23.000000000 +0000 @@ -1,7 +1,7 @@ - +
20062009 @@ -30,6 +30,6 @@

The Erlang Runtime System application ERTS.

- + diff -Nru erlang-13.b.1-dfsg/erts/doc/src/part_notes.xml erlang-13.b.3-dfsg/erts/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/erts/doc/src/part_notes.xml 2009-03-12 12:15:23.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/part_notes.xml 2009-11-20 13:31:59.000000000 +0000 @@ -1,7 +1,7 @@ - +
20042009 @@ -32,6 +32,6 @@

For information about older versions, see Release Notes History.

- + diff -Nru erlang-13.b.1-dfsg/erts/doc/src/part.xml erlang-13.b.3-dfsg/erts/doc/src/part.xml --- erlang-13.b.1-dfsg/erts/doc/src/part.xml 2009-03-12 12:15:23.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/part.xml 2009-11-20 13:29:55.000000000 +0000 @@ -1,7 +1,7 @@ - +
19962009 @@ -26,19 +26,19 @@ 1997-05-15 4.5.2 - part.sgml + part.xml

The Erlang Runtime System Application ERTS.

- - - - - - - - - + + + + + + + + +
diff -Nru erlang-13.b.1-dfsg/erts/doc/src/ref_man.xml erlang-13.b.3-dfsg/erts/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/erts/doc/src/ref_man.xml 2009-03-12 12:15:23.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/ref_man.xml 2009-11-20 13:29:54.000000000 +0000 @@ -1,7 +1,7 @@ - +
19962009 @@ -26,7 +26,7 @@ 1997-05-15 4.5.2 - application.sgml + application.xml

The Erlang Runtime System Application ERTS.

@@ -38,22 +38,23 @@ with Erlang/OTP components from earlier releases.

- - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +
diff -Nru erlang-13.b.1-dfsg/erts/doc/src/run_erl.xml erlang-13.b.3-dfsg/erts/doc/src/run_erl.xml --- erlang-13.b.1-dfsg/erts/doc/src/run_erl.xml 2009-03-12 12:15:23.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/run_erl.xml 2009-11-20 13:31:01.000000000 +0000 @@ -29,7 +29,7 @@ 99-12-15 - run_erl.sgml + run_erl.xml
run_erl Redirect Erlang input and output streams on Solaris® diff -Nru erlang-13.b.1-dfsg/erts/doc/src/start_erl.xml erlang-13.b.3-dfsg/erts/doc/src/start_erl.xml --- erlang-13.b.1-dfsg/erts/doc/src/start_erl.xml 2009-03-12 12:15:23.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/start_erl.xml 2009-11-20 13:30:41.000000000 +0000 @@ -29,7 +29,7 @@ 98-08-05 - start_erl.sgml + start_erl.xml
start_erl Start Erlang for embedded systems on Windows NT® @@ -78,7 +78,7 @@ -data <data file name> Optional, specifies another data file than start_erl.data in the <release root>. It is specified relative to the - <release root> or absolute (includeing drive letter + <release root> or absolute (including drive letter etc.). This option is used by the release handler during upgrade and should not be used during normal operation. The release data file should not normally be diff -Nru erlang-13.b.1-dfsg/erts/doc/src/start.xml erlang-13.b.3-dfsg/erts/doc/src/start.xml --- erlang-13.b.1-dfsg/erts/doc/src/start.xml 2009-03-12 12:15:24.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/start.xml 2009-11-20 13:31:01.000000000 +0000 @@ -29,7 +29,7 @@ 99-12-15 - start.sgml + start.xml start OTP start script example for Unix diff -Nru erlang-13.b.1-dfsg/erts/doc/src/tty.xml erlang-13.b.3-dfsg/erts/doc/src/tty.xml --- erlang-13.b.1-dfsg/erts/doc/src/tty.xml 2009-03-12 12:15:24.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/tty.xml 2009-11-20 13:29:55.000000000 +0000 @@ -29,7 +29,7 @@ 1996-11-01 A - tty.sgml + tty.xml

is a simple command line interface program where keystrokes are collected and interpreted. Completed lines are sent to the shell for interpretation. There is a simple history mechanism, which saves previous lines. These can be edited before sending them to the shell. is started when Erlang is started with the command:

diff -Nru erlang-13.b.1-dfsg/erts/doc/src/werl.xml erlang-13.b.3-dfsg/erts/doc/src/werl.xml --- erlang-13.b.1-dfsg/erts/doc/src/werl.xml 2009-03-12 12:15:24.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/werl.xml 2009-11-20 13:30:31.000000000 +0000 @@ -29,7 +29,7 @@ 98-01-26 A - werl.sgml + werl.xml werl The Erlang Emulator @@ -52,7 +52,7 @@

The werl window is in many ways modelled after the xterm window present on other platforms, as the xterm model fits well with line oriented command based interaction. This - means that selcting text is line oriented rather than rectangle + means that selecting text is line oriented rather than rectangle oriented.

To select text in the werl window , simply press and hold diff -Nru erlang-13.b.1-dfsg/erts/doc/src/zlib.xml erlang-13.b.3-dfsg/erts/doc/src/zlib.xml --- erlang-13.b.1-dfsg/erts/doc/src/zlib.xml 2009-03-12 12:15:24.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/doc/src/zlib.xml 2009-11-20 13:32:10.000000000 +0000 @@ -26,6 +26,7 @@ + zlib.xml zlib Zlib Compression interface. diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/atom.names erlang-13.b.3-dfsg/erts/emulator/beam/atom.names --- erlang-13.b.1-dfsg/erts/emulator/beam/atom.names 2009-06-05 13:52:48.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/atom.names 2009-11-20 13:29:21.000000000 +0000 @@ -81,6 +81,7 @@ atom andthen atom any atom anycrlf +atom apply atom args atom arg0 atom arity @@ -89,6 +90,7 @@ atom atom atom atom_used atom attributes +atom await_proc_exit atom awaiting_load atom awaiting_unload atom backtrace backtrace_depth @@ -137,6 +139,7 @@ atom const atom context_switches atom copy +atom cpu atom cpu_timestamp atom cr atom crlf @@ -202,6 +205,8 @@ atom firstline atom flags atom flush +atom flush_monitor_message +atom force atom format_cpu_topology atom free atom fullsweep_after @@ -225,6 +230,7 @@ atom global_heaps_size atom Gt='>' atom grun +atom group_leader atom heap_block_size atom heap_size atom heap_sizes @@ -377,6 +383,7 @@ atom out_exited atom out_exiting atom output +atom overlapped_io atom owner atom packet atom packet_size @@ -399,6 +406,7 @@ atom processes_trap atom processes_used atom process_count +atom process_display atom process_limit atom process_dump atom procs @@ -416,6 +424,7 @@ atom ready_input atom ready_output atom ready_async +atom reason atom receive atom recent_size atom reductions diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/beam_bif_load.c erlang-13.b.3-dfsg/erts/emulator/beam/beam_bif_load.c --- erlang-13.b.1-dfsg/erts/emulator/beam/beam_bif_load.c 2009-03-12 12:15:26.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/beam_bif_load.c 2009-11-20 13:30:58.000000000 +0000 @@ -32,7 +32,9 @@ #include "beam_bp.h" #include "beam_catches.h" #include "erl_binary.h" +#include "erl_nif.h" +static void set_default_trace_pattern(Eterm module); static Eterm check_process_code(Process* rp, Module* modp); static void delete_code(Process *c_p, ErtsProcLocks c_p_locks, Module* modp); static void delete_export_references(Eterm module); @@ -40,6 +42,7 @@ static int is_native(Eterm* code); static int any_heap_ref_ptrs(Eterm* start, Eterm* end, char* mod_start, Uint mod_size); static int any_heap_refs(Eterm* start, Eterm* end, char* mod_start, Uint mod_size); +static void remove_from_address_table(Eterm* code); Eterm load_module_2(BIF_ALIST_2) @@ -49,11 +52,6 @@ int i; int sz; byte* code; - int trace_pattern_is_on; - Binary *match_spec; - Binary *meta_match_spec; - struct trace_pattern_flags trace_pattern_flags; - Eterm meta_tracer_pid; Eterm res; byte* temp_alloc = NULL; @@ -81,27 +79,26 @@ case -4: reason = am_atom_put("native_code", sizeof("native_code")-1); break; + case -5: + { + /* + * The module contains an on_load function. The loader + * has loaded the module as usual, except that the + * export entries does not point into the module, so it + * is not possible to call any code in the module. + */ + + ERTS_DECL_AM(on_load); + reason = AM_on_load; + break; + } default: reason = am_badfile; break; } res = TUPLE2(hp, am_error, reason); goto done; } - erts_get_default_trace_pattern(&trace_pattern_is_on, - &match_spec, - &meta_match_spec, - &trace_pattern_flags, - &meta_tracer_pid); - if (trace_pattern_is_on) { - Eterm mfa[1]; - mfa[0] = BIF_ARG_1; - (void) erts_set_trace_pattern(mfa, 1, - match_spec, - meta_match_spec, - 1, trace_pattern_flags, - meta_tracer_pid); - } - + set_default_trace_pattern(BIF_ARG_1); res = TUPLE2(hp, am_module, BIF_ARG_1); done: @@ -251,7 +248,9 @@ if (is_not_atom(BIF_ARG_1)) { BIF_ERROR(BIF_P, BADARG); } - if ((modp = erts_get_module(BIF_ARG_1)) == NULL || modp->code == NULL) { + if ((modp = erts_get_module(BIF_ARG_1)) == NULL || + modp->code == NULL || + modp->code[MI_ON_LOAD_FUNCTION_PTR] != 0) { BIF_RET(am_false); } BIF_RET(am_true); @@ -291,7 +290,110 @@ } BIF_RET(previous); } + +BIF_RETTYPE call_on_load_function_1(BIF_ALIST_1) +{ + Module* modp = erts_get_module(BIF_ARG_1); + Eterm on_load; + + if (!modp || modp->code == 0) { + error: + BIF_ERROR(BIF_P, BADARG); + } + if ((on_load = modp->code[MI_ON_LOAD_FUNCTION_PTR]) == 0) { + goto error; + } + BIF_TRAP_CODE_PTR_0(BIF_P, on_load); +} + +BIF_RETTYPE finish_after_on_load_2(BIF_ALIST_2) +{ + Module* modp = erts_get_module(BIF_ARG_1); + Eterm on_load; + + if (!modp || modp->code == 0) { + error: + BIF_ERROR(BIF_P, BADARG); + } + if ((on_load = modp->code[MI_ON_LOAD_FUNCTION_PTR]) == 0) { + goto error; + } + if (BIF_ARG_2 != am_false && BIF_ARG_2 != am_true) { + goto error; + } + + erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); + erts_smp_block_system(0); + + if (BIF_ARG_2 == am_true) { + int i; + + /* + * The on_load function succeded. Fix up export entries. + */ + for (i = 0; i < export_list_size(); i++) { + Export *ep = export_list(i); + if (ep != NULL && + ep->code[0] == BIF_ARG_1 && + ep->code[4] != 0) { + ep->address = (void *) ep->code[4]; + ep->code[3] = 0; + ep->code[4] = 0; + } + } + modp->code[MI_ON_LOAD_FUNCTION_PTR] = 0; + set_default_trace_pattern(BIF_ARG_1); + } else if (BIF_ARG_2 == am_false) { + Eterm* code; + Eterm* end; + + /* + * The on_load function failed. Remove the loaded code. + * This is an combination of delete and purge. We purge + * the current code; the old code is not touched. + */ + erts_total_code_size -= modp->code_length; + code = modp->code; + end = (Eterm *)((char *)code + modp->code_length); + erts_cleanup_funs_on_purge(code, end); + beam_catches_delmod(modp->catches, code, modp->code_length); + erts_free(ERTS_ALC_T_CODE, (void *) code); + modp->code = NULL; + modp->code_length = 0; + modp->catches = BEAM_CATCHES_NIL; + remove_from_address_table(code); + } + erts_smp_release_system(); + erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); + BIF_RET(am_true); +} + +static void +set_default_trace_pattern(Eterm module) +{ + int trace_pattern_is_on; + Binary *match_spec; + Binary *meta_match_spec; + struct trace_pattern_flags trace_pattern_flags; + Eterm meta_tracer_pid; + + erts_get_default_trace_pattern(&trace_pattern_is_on, + &match_spec, + &meta_match_spec, + &trace_pattern_flags, + &meta_tracer_pid); + if (trace_pattern_is_on) { + Eterm mfa[1]; + mfa[0] = module; + (void) erts_set_trace_pattern(mfa, 1, + match_spec, + meta_match_spec, + 1, trace_pattern_flags, + meta_tracer_pid); + } +} + static Eterm check_process_code(Process* rp, Module* modp) { @@ -518,7 +620,6 @@ Eterm* code; Eterm* end; Module* modp; - int i; /* * Correct module? @@ -538,6 +639,25 @@ return -1; } + /* + * Unload any NIF library + */ + if (modp->old_nif.handle != NULL) { + if (modp->old_nif.entry->unload != NULL) { + ErlNifEnv env; + env.nif_data = modp->old_nif.data; + env.proc = NULL; /* BUGBUG: unlink can not access calling process */ + env.hp = NULL; + env.hp_end = NULL; + env.heap_frag_sz = 0; + env.fpe_was_unmasked = erts_block_fpe(); + modp->old_nif.entry->unload(NULL, modp->old_nif.data); + erts_unblock_fpe(env.fpe_was_unmasked); + } + erts_sys_ddll_close(modp->old_nif.handle); + modp->old_nif.handle = NULL; + modp->old_nif.entry = NULL; + } /* * Remove the old code. @@ -552,10 +672,15 @@ modp->old_code = NULL; modp->old_code_length = 0; modp->old_catches = BEAM_CATCHES_NIL; + remove_from_address_table(code); + return 0; +} + +static void +remove_from_address_table(Eterm* code) +{ + int i; - /* - * Remove the code from the address table too. - */ for (i = 0; i < num_loaded_modules; i++) { if (modules[i].start == code) { num_loaded_modules--; @@ -564,12 +689,10 @@ i++; } mid_module = &modules[num_loaded_modules/2]; - return 0; + return; } } - ASSERT(0); /* Not found? */ - return 0; } @@ -605,9 +728,12 @@ modp->old_code = modp->code; modp->old_code_length = modp->code_length; modp->old_catches = modp->catches; + modp->old_nif = modp->nif; modp->code = NULL; modp->code_length = 0; modp->catches = BEAM_CATCHES_NIL; + modp->nif.handle = NULL; + modp->nif.entry = NULL; } diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/beam_emu.c erlang-13.b.3-dfsg/erts/emulator/beam/beam_emu.c --- erlang-13.b.1-dfsg/erts/emulator/beam/beam_emu.c 2009-06-05 13:52:47.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/beam_emu.c 2009-11-20 13:29:20.000000000 +0000 @@ -294,13 +294,13 @@ #if defined(HYBRID) # define POST_BIF_GC_SWAPIN_0(_p, _res) \ - if ((_p)->mbuf) { \ + if (((_p)->mbuf) || (MSO(_p).overhead >= BIN_VHEAP_SZ(_p)) ) { \ _res = erts_gc_after_bif_call((_p), (_res), NULL, 0); \ } \ SWAPIN # define POST_BIF_GC_SWAPIN(_p, _res, _regs, _arity) \ - if ((_p)->mbuf) { \ + if (((_p)->mbuf) || (MSO(_p).overhead >= BIN_VHEAP_SZ(_p)) ) { \ _regs[0] = r(0); \ _res = erts_gc_after_bif_call((_p), (_res), _regs, (_arity)); \ r(0) = _regs[0]; \ @@ -310,7 +310,7 @@ # define POST_BIF_GC_SWAPIN_0(_p, _res) \ ERTS_SMP_REQ_PROC_MAIN_LOCK((_p)); \ PROCESS_MAIN_CHK_LOCKS((_p)); \ - if ((_p)->mbuf) { \ + if (((_p)->mbuf) || (MSO(_p).overhead >= BIN_VHEAP_SZ(_p)) ) { \ _res = erts_gc_after_bif_call((_p), (_res), NULL, 0); \ E = (_p)->stop; \ } \ @@ -319,7 +319,7 @@ # define POST_BIF_GC_SWAPIN(_p, _res, _regs, _arity) \ ERTS_SMP_REQ_PROC_MAIN_LOCK((_p)); \ PROCESS_MAIN_CHK_LOCKS((_p)); \ - if ((_p)->mbuf) { \ + if (((_p)->mbuf) || (MSO(_p).overhead >= BIN_VHEAP_SZ(_p)) ) { \ _regs[0] = r(0); \ _res = erts_gc_after_bif_call((_p), (_res), _regs, (_arity)); \ r(0) = _regs[0]; \ @@ -398,6 +398,23 @@ E += (N) + 1; + +#define TestBinVHeap(VNh, Nh, Live) \ + do { \ + unsigned need = (Nh); \ + if ((E - HTOP < need) || (MSO(c_p).overhead + (VNh) >= BIN_VHEAP_SZ(c_p))) {\ + SWAPOUT; \ + reg[0] = r(0); \ + PROCESS_MAIN_CHK_LOCKS(c_p); \ + FCALLS -= erts_garbage_collect(c_p, need, reg, (Live)); \ + PROCESS_MAIN_CHK_LOCKS(c_p); \ + r(0) = reg[0]; \ + SWAPIN; \ + } \ + } while (0) + + + /* * Check if Nh words of heap are available; if not, do a garbage collection. * Live is number of active argument registers to be preserved. @@ -957,6 +974,10 @@ static Eterm* call_fun(Process* p, int arity, Eterm* reg, Eterm args); static Eterm* apply_fun(Process* p, Eterm fun, Eterm args, Eterm* reg); static Eterm new_fun(Process* p, Eterm* reg, ErlFunEntry* fe, int num_free); +static BIF_RETTYPE nif_dispatcher_0(Process* p, Uint* I); +static BIF_RETTYPE nif_dispatcher_1(Process* p, Eterm arg1, Uint* I); +static BIF_RETTYPE nif_dispatcher_2(Process* p, Eterm arg1, Eterm arg2, Uint* I); +static BIF_RETTYPE nif_dispatcher_3(Process* p, Eterm arg1, Eterm arg2, Eterm arg3, Uint* I); #if defined(_OSE_) || defined(VXWORKS) static int init_done; @@ -1393,7 +1414,7 @@ NextPF(0, next); } else if (c_p->freason == TRAP) { SET_CP(c_p, I+1); - SET_I(((Export *)(c_p->def_arg_reg[3]))->address); + SET_I((Eterm *) c_p->def_arg_reg[3]); SWAPIN; r(0) = c_p->def_arg_reg[0]; x(1) = c_p->def_arg_reg[1]; @@ -2012,9 +2033,6 @@ save_calls(c_p, (Export *) Arg(0)); } - /* - * A BIF with no arguments cannot fail (especially not with badarg). - */ ASSERT(!ERTS_PROC_IS_EXITING(c_p)); r(0) = (*bf)(c_p, I); ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(r(0))); @@ -2025,10 +2043,17 @@ CHECK_TERM(r(0)); Next(1); } - else { - ASSERT(c_p->freason == TRAP); + else if (c_p->freason == TRAP) { goto call_bif_trap3; } + + /* + * Error handling. SWAPOUT is not needed because it was done above. + */ + ASSERT(c_p->stop == E); + reg[0] = r(0); + I = handle_error(c_p, I, reg, bf); + goto post_error_handling; } OpCase(call_bif1_e): @@ -2128,7 +2153,7 @@ } else if (c_p->freason == TRAP) { call_bif_trap3: SET_CP(c_p, I+2); - SET_I(((Export *)(c_p->def_arg_reg[3]))->address); + SET_I((Eterm *)c_p->def_arg_reg[3]); SWAPIN; r(0) = c_p->def_arg_reg[0]; x(1) = c_p->def_arg_reg[1]; @@ -2922,29 +2947,36 @@ } } - OpCase(apply_bif): - /* - * At this point, I points to the code[3] in the export entry for - * the BIF: - * - * code[0]: Module - * code[1]: Function - * code[2]: Arity - * code[3]: &&apply_bif - * code[4]: Function pointer to BIF function - */ + OpCase(call_nif): { - BifFunction vbf; + static void* const dispatchers[4] = { + nif_dispatcher_0, nif_dispatcher_1, nif_dispatcher_2, nif_dispatcher_3 + }; + BifFunction vbf = dispatchers[I[-1]]; + goto apply_bif_or_nif; + + OpCase(apply_bif): + /* + * At this point, I points to the code[3] in the export entry for + * the BIF: + * + * code[0]: Module + * code[1]: Function + * code[2]: Arity + * code[3]: &&apply_bif + * code[4]: Function pointer to BIF function + */ + vbf = (BifFunction) Arg(0); - c_p->current = I-3; /* In case we apply process_info/1,2. */ + apply_bif_or_nif: + c_p->current = I-3; /* In case we apply process_info/1,2 or load_nif/1 */ c_p->i = I; /* In case we apply check_process_code/2. */ c_p->arity = 0; /* To allow garbage collection on ourselves * (check_process_code/2). */ - + SWAPOUT; c_p->fcalls = FCALLS - 1; - vbf = (BifFunction) Arg(0); PROCESS_MAIN_CHK_LOCKS(c_p); tmp_arg2 = I[-1]; ASSERT(tmp_arg2 <= 3); @@ -3002,7 +3034,7 @@ SET_I(c_p->cp); Goto(*I); } else if (c_p->freason == TRAP) { - SET_I(((Export *)(c_p->def_arg_reg[3]))->address); + SET_I((Eterm *)c_p->def_arg_reg[3]); r(0) = c_p->def_arg_reg[0]; x(1) = c_p->def_arg_reg[1]; x(2) = c_p->def_arg_reg[2]; @@ -3200,7 +3232,7 @@ pb->val = bptr; pb->bytes = (byte*) bptr->orig_bytes; pb->flags = 0; - MSO(c_p).overhead += pb->size / BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + MSO(c_p).overhead += pb->size / sizeof(Eterm); new_binary = make_binary(pb); goto do_bits_sub_bin; } @@ -3277,7 +3309,8 @@ erts_bin_offset = 0; erts_writable_bin = 0; - TestHeap(tmp_arg2 + PROC_BIN_SIZE + ERL_SUB_BIN_SIZE, Arg(1)); + TestBinVHeap(tmp_arg1 / sizeof(Eterm), + tmp_arg2 + PROC_BIN_SIZE + ERL_SUB_BIN_SIZE, Arg(1)); /* * Allocate the binary struct itself. @@ -3300,8 +3333,9 @@ pb->val = bptr; pb->bytes = (byte*) bptr->orig_bytes; pb->flags = 0; + + MSO(c_p).overhead += tmp_arg1 / sizeof(Eterm); - MSO(c_p).overhead += pb->size / BINARY_OVERHEAD_FACTOR / sizeof(Eterm); StoreBifResult(2, make_binary(pb)); } @@ -4764,6 +4798,7 @@ OpCase(int_code_end): OpCase(label_L): OpCase(too_old_compiler): + OpCase(on_load): erl_exit(1, "meta op\n"); /* @@ -6112,3 +6147,52 @@ return REDS_IN(current) - current->fcalls; } } + +static BIF_RETTYPE nif_dispatcher_0(Process* p, Uint* I) +{ + typedef Eterm NifF(struct enif_environment_t*); + NifF* fp = (NifF*) I[1]; + struct enif_environment_t env; + Eterm ret; + erts_pre_nif(&env, p, (void*)I[2]); + ret = (*fp)(&env); + erts_post_nif(&env); + return ret; +} + +static BIF_RETTYPE nif_dispatcher_1(Process* p, Eterm arg1, Uint* I) +{ + typedef Eterm NifF(struct enif_environment_t*, Eterm); + NifF* fp = (NifF*) I[1]; + struct enif_environment_t env; + Eterm ret; + erts_pre_nif(&env, p, (void*)I[2]); + ret = (*fp)(&env, arg1); + erts_post_nif(&env); + return ret; +} + +static BIF_RETTYPE nif_dispatcher_2(Process* p, Eterm arg1, Eterm arg2, Uint* I) +{ + typedef Eterm NifF(struct enif_environment_t*, Eterm, Eterm); + NifF* fp = (NifF*) I[1]; + struct enif_environment_t env; + Eterm ret; + erts_pre_nif(&env, p, (void*)I[2]); + ret = (*fp)(&env, arg1, arg2); + erts_post_nif(&env); + return ret; +} + +static BIF_RETTYPE nif_dispatcher_3(Process* p, Eterm arg1, Eterm arg2, Eterm arg3, Uint* I) +{ + typedef Eterm NifF(struct enif_environment_t*, Eterm, Eterm, Eterm); + NifF* fp = (NifF*) I[1]; + struct enif_environment_t env; + Eterm ret; + erts_pre_nif(&env, p, (void*)I[2]); + ret = (*fp)(&env, arg1, arg2, arg3); + erts_post_nif(&env); + return ret; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/beam_load.c erlang-13.b.3-dfsg/erts/emulator/beam/beam_load.c --- erlang-13.b.1-dfsg/erts/emulator/beam/beam_load.c 2009-06-05 13:52:46.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/beam_load.c 2009-11-20 13:29:20.000000000 +0000 @@ -35,7 +35,7 @@ #include "erl_bits.h" #include "beam_catches.h" #include "erl_binary.h" -#include "zlib.h" +#include "erl_zlib.h" #ifdef HIPE #include "hipe_bif0.h" @@ -283,6 +283,10 @@ Uint catches; /* Linked list of catch_yf instructions. */ unsigned loaded_size; /* Final size of code when loaded. */ byte mod_md5[16]; /* MD5 for module code. */ + int may_load_nif; /* true if NIFs may later be loaded for this module */ + int on_load; /* Index in the code for the on_load function + * (or 0 if there is no on_load function) + */ /* * Atom table. @@ -700,6 +704,14 @@ state.code = NULL; /* Prevent code from being freed. */ *modp = state.module; + /* + * If there is an on_load function, signal an error to + * indicate that the on_load function must be run. + */ + if (state.on_load) { + rval = -5; + } + load_error: if (state.code != 0) { erts_free(ERTS_ALC_T_CODE, state.code); @@ -773,6 +785,8 @@ stp->literal_patches = 0; stp->string_patches = 0; stp->new_float_instructions = 0; + stp->may_load_nif = 0; + stp->on_load = 0; } static int @@ -1071,6 +1085,9 @@ if ((e = erts_find_export_entry(mod, func, arity)) != NULL) { if (e->code[3] == (Uint) em_apply_bif) { stp->import[i].bf = (BifFunction) e->code[4]; + if (func == am_load_nif && mod == am_erlang && arity == 2) { + stp->may_load_nif = 1; + } } } } @@ -1208,7 +1225,7 @@ GetInt(stp, 4, uncompressed_sz); uncompressed = erts_alloc(ERTS_ALC_T_TMP, uncompressed_sz); - if (uncompress(uncompressed, &uncompressed_sz, + if (erl_zlib_uncompress(uncompressed, &uncompressed_sz, stp->file_p, stp->file_left) != Z_OK) { LoadError0(stp, "failed to uncompress literal table (constant pool)"); } @@ -1366,6 +1383,7 @@ int i; int tmp; int ci; + int last_func_start = 0; char* sign; int arg; /* Number of current argument. */ int num_specific; /* Number of specific ops for current. */ @@ -2005,17 +2023,34 @@ case op_i_func_info_IaaI: { Uint offset; + enum { FINFO_SZ = 5 }; if (function_number >= stp->num_functions) { LoadError1(stp, "too many functions in module (header said %d)", stp->num_functions); } + if (stp->may_load_nif) { + const int finfo_ix = ci - FINFO_SZ; + enum { MIN_FUNC_SZ = 3 }; + if (finfo_ix - last_func_start < MIN_FUNC_SZ && last_func_start) { + /* Must make room for call_nif op */ + int pad = MIN_FUNC_SZ - (finfo_ix - last_func_start); + ASSERT(pad > 0 && pad < MIN_FUNC_SZ); + Need(pad); + sys_memmove(&code[finfo_ix+pad], &code[finfo_ix], FINFO_SZ*sizeof(Eterm)); + sys_memset(&code[finfo_ix], 0, pad*sizeof(Eterm)); + ci += pad; + stp->labels[last_label].value += pad; + } + } + last_func_start = ci; /* * Save context for error messages. */ stp->function = code[ci-2]; stp->arity = code[ci-1]; + ASSERT(stp->labels[last_label].value == ci - FINFO_SZ); offset = MI_FUNCTIONS + function_number; code[offset] = stp->labels[last_label].patches; stp->labels[last_label].patches = offset; @@ -2031,6 +2066,12 @@ #endif } break; + case op_on_load: + ci--; /* Get rid of the instruction */ + + /* Remember offset for the on_load function. */ + stp->on_load = ci; + break; case op_put_string_IId: { /* @@ -3376,6 +3417,15 @@ code[MI_FUNCTIONS+stp->num_functions] = (Eterm) (code + stp->ci - 1); + /* + * Store the pointer to the on_load function. + */ + + if (stp->on_load) { + code[MI_ON_LOAD_FUNCTION_PTR] = (Eterm) (code + stp->on_load); + } else { + code[MI_ON_LOAD_FUNCTION_PTR] = 0; + } /* * Place the literal heap directly after the code and fix up all @@ -3571,6 +3621,7 @@ final_touch(LoaderState* stp) { int i; + int on_load = stp->on_load; /* * Export functions. @@ -3579,7 +3630,16 @@ for (i = 0; i < stp->num_exps; i++) { Export* ep = erts_export_put(stp->module, stp->export[i].function, stp->export[i].arity); - ep->address = stp->export[i].address; + if (!on_load) { + ep->address = stp->export[i].address; + } else { + /* + * Don't make any of the exported functions + * callable yet. + */ + ep->address = ep->code+3; + ep->code[4] = (Eterm) stp->export[i].address; + } } /* @@ -4253,7 +4313,6 @@ return stp->num_literals++; } - Eterm erts_module_info_0(Process* p, Eterm module) { diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/beam_load.h erlang-13.b.3-dfsg/erts/emulator/beam/beam_load.h --- erlang-13.b.1-dfsg/erts/emulator/beam/beam_load.h 2009-03-12 12:15:29.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/beam_load.h 2009-11-20 13:30:49.000000000 +0000 @@ -103,6 +103,11 @@ #define MI_LITERALS_END 9 /* + * Pointer to the on_load function (or NULL if none). + */ +#define MI_ON_LOAD_FUNCTION_PTR 10 + +/* * Start of function pointer table. This table contains pointers to * all functions in the module plus an additional pointer just beyond * the end of the last function. @@ -111,5 +116,5 @@ * this table. */ -#define MI_FUNCTIONS 10 +#define MI_FUNCTIONS 11 #endif /* _BEAM_LOAD_H */ diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/bif.c erlang-13.b.3-dfsg/erts/emulator/beam/bif.c --- erlang-13.b.1-dfsg/erts/emulator/beam/bif.c 2009-06-05 13:52:48.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/bif.c 2009-11-20 13:29:22.000000000 +0000 @@ -37,7 +37,9 @@ #include "erl_db_util.h" #include "register.h" +static Export* flush_monitor_message_trap = NULL; static Export* set_cpu_topology_trap = NULL; +static Export* await_proc_exit_trap = NULL; Export* erts_format_cpu_topology_trap = NULL; #define DECL_AM(S) Eterm AM_ ## S = am_atom_put(#S, sizeof(#S) - 1) @@ -238,14 +240,20 @@ BIF_ERROR(BIF_P, EXC_NOPROC); } -static BIF_RETTYPE +#define ERTS_DEMONITOR_FALSE 2 +#define ERTS_DEMONITOR_TRUE 1 +#define ERTS_DEMONITOR_BADARG 0 +#define ERTS_DEMONITOR_YIELD_TRUE -1 +#define ERTS_DEMONITOR_INTERNAL_ERROR -2 + +static int remote_demonitor(Process *c_p, DistEntry *dep, Eterm ref, Eterm to) { ErtsDSigData dsd; ErtsMonitor *dmon; ErtsMonitor *mon; int code; - BIF_RETTYPE ret; + int res; #ifndef ERTS_SMP int stale_mon = 0; #endif @@ -278,7 +286,7 @@ mon = erts_remove_monitor(&c_p->monitors, ref); erts_smp_proc_unlock(c_p, ERTS_PROC_LOCK_LINK); - ERTS_BIF_PREP_RET(ret, am_true); + res = ERTS_DEMONITOR_TRUE; break; case ERTS_DSIG_PREP_CONNECTED: @@ -302,7 +310,7 @@ * This is possible when smp support is enabled. * 'DOWN' message just arrived. */ - ERTS_BIF_PREP_RET(ret, am_true); + res = ERTS_DEMONITOR_TRUE; } else { /* @@ -317,17 +325,16 @@ : mon->pid), ref, 0); - if (code == ERTS_DSIG_SEND_YIELD) - ERTS_BIF_PREP_YIELD_RETURN(ret, c_p, am_true); - else - ERTS_BIF_PREP_RET(ret, am_true); + res = (code == ERTS_DSIG_SEND_YIELD + ? ERTS_DEMONITOR_YIELD_TRUE + : ERTS_DEMONITOR_TRUE); erts_destroy_monitor(dmon); } break; default: ASSERT(! "Invalid dsig prepare result"); - ERTS_BIF_PREP_ERROR(ret, c_p, EXC_INTERNAL_ERROR); + res = ERTS_DEMONITOR_INTERNAL_ERROR; break; } @@ -348,42 +355,42 @@ * We aren't allowed to destroy 'mon' until now, since 'to' * may refer into 'mon' (external pid). */ - ASSERT(mon); + ASSERT(mon); /* Since link lock wasn't released between + lookup and remove */ erts_destroy_monitor(mon); ERTS_SMP_LC_ASSERT(ERTS_PROC_LOCK_MAIN == erts_proc_lc_my_proc_locks(c_p)); - return ret; + return res; } -BIF_RETTYPE demonitor_1(BIF_ALIST_1) +static int demonitor(Process *c_p, Eterm ref) { ErtsMonitor *mon = NULL; /* The monitor entry to delete */ Process *rp; /* Local target process */ - Eterm ref; /* BIF_ARG_1 */ Eterm to = NIL; /* Monitor link traget */ Eterm ref_p; /* Pid of this end */ DistEntry *dep = NULL; /* Target's distribution entry */ int deref_de = 0; - BIF_RETTYPE res; + int res; int unlock_link = 1; - ERTS_BIF_PREP_RET(res, am_true); /* Prepare for success */ - erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK); + erts_smp_proc_lock(c_p, ERTS_PROC_LOCK_LINK); - ref = BIF_ARG_1; if (is_not_internal_ref(ref)) { - ERTS_BIF_PREP_ERROR(res, BIF_P, BADARG); + res = ERTS_DEMONITOR_BADARG; goto done; /* Cannot be this monitor's ref */ } - ref_p = BIF_P->id; + ref_p = c_p->id; - mon = erts_lookup_monitor(BIF_P->monitors, ref); - if (mon == NULL) + mon = erts_lookup_monitor(c_p->monitors, ref); + if (!mon) { + res = ERTS_DEMONITOR_FALSE; goto done; + } if (mon->type != MON_ORIGIN) { - ERTS_BIF_PREP_ERROR(res, BIF_P, BADARG); + res = ERTS_DEMONITOR_BADARG; goto done; } to = mon->pid; @@ -400,8 +407,8 @@ dep = pid_dist_entry(to); } if (dep != erts_this_dist_entry) { - res = remote_demonitor(BIF_P, dep, ref, to); - /* remote_demonitor() unlocks link lock on BIF_P */ + res = remote_demonitor(c_p, dep, ref, to); + /* remote_demonitor() unlocks link lock on c_p */ unlock_link = 0; } else { /* Local monitor */ @@ -410,28 +417,33 @@ erts_deref_dist_entry(dep); } dep = NULL; - rp = erts_pid2proc_opt(BIF_P, + rp = erts_pid2proc_opt(c_p, ERTS_PROC_LOCK_MAIN|ERTS_PROC_LOCK_LINK, to, ERTS_PROC_LOCK_LINK, ERTS_P2P_FLG_ALLOW_OTHER_X); - mon = erts_remove_monitor(&BIF_P->monitors, ref); + mon = erts_remove_monitor(&c_p->monitors, ref); #ifndef ERTS_SMP ASSERT(mon); #else - if (mon) + if (!mon) + res = ERTS_DEMONITOR_FALSE; + else #endif + { + res = ERTS_DEMONITOR_TRUE; erts_destroy_monitor(mon); + } if (rp) { ErtsMonitor *rmon; rmon = erts_remove_monitor(&(rp->monitors), ref); - if (rp != BIF_P) + if (rp != c_p) erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_LINK); if (rmon != NULL) erts_destroy_monitor(rmon); } else { - ERTS_SMP_ASSERT_IS_NOT_EXITING(BIF_P); + ERTS_SMP_ASSERT_IS_NOT_EXITING(c_p); } } @@ -439,17 +451,79 @@ done: if (unlock_link) - erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK); + erts_smp_proc_unlock(c_p, ERTS_PROC_LOCK_LINK); if (deref_de) { ASSERT(dep); erts_deref_dist_entry(dep); } - ERTS_SMP_LC_ASSERT(ERTS_PROC_LOCK_MAIN == erts_proc_lc_my_proc_locks(BIF_P)); + ERTS_SMP_LC_ASSERT(ERTS_PROC_LOCK_MAIN == erts_proc_lc_my_proc_locks(c_p)); return res; } +BIF_RETTYPE demonitor_1(BIF_ALIST_1) +{ + switch (demonitor(BIF_P, BIF_ARG_1)) { + case ERTS_DEMONITOR_FALSE: + case ERTS_DEMONITOR_TRUE: + BIF_RET(am_true); + case ERTS_DEMONITOR_YIELD_TRUE: + ERTS_BIF_YIELD_RETURN(BIF_P, am_true); + case ERTS_DEMONITOR_BADARG: + BIF_ERROR(BIF_P, BADARG); + case ERTS_DEMONITOR_INTERNAL_ERROR: + default: + ASSERT(! "demonitor(): internal error"); + BIF_ERROR(BIF_P, EXC_INTERNAL_ERROR); + } +} + +BIF_RETTYPE demonitor_2(BIF_ALIST_2) +{ + Eterm res = am_true; + int info = 0; + int flush = 0; + Eterm list = BIF_ARG_2; + + while (is_list(list)) { + Eterm* consp = list_val(list); + switch (CAR(consp)) { + case am_flush: + flush = 1; + break; + case am_info: + info = 1; + break; + default: + goto badarg; + } + list = CDR(consp); + } + + if (is_not_nil(list)) + goto badarg; + + switch (demonitor(BIF_P, BIF_ARG_1)) { + case ERTS_DEMONITOR_FALSE: + if (info) + res = am_false; + if (flush) + BIF_TRAP2(flush_monitor_message_trap, BIF_P, BIF_ARG_1, res); + case ERTS_DEMONITOR_TRUE: + BIF_RET(res); + case ERTS_DEMONITOR_YIELD_TRUE: + ERTS_BIF_YIELD_RETURN(BIF_P, am_true); + case ERTS_DEMONITOR_BADARG: + badarg: + BIF_ERROR(BIF_P, BADARG); + case ERTS_DEMONITOR_INTERNAL_ERROR: + default: + ASSERT(! "demonitor(): internal error"); + BIF_ERROR(BIF_P, EXC_INTERNAL_ERROR); + } +} + /* Type must be atomic object! */ void erts_queue_monitor_message(Process *p, @@ -3119,60 +3193,6 @@ } /**********************************************************************/ - -BIF_RETTYPE is_process_alive_1(BIF_ALIST_1) -{ - if(is_internal_pid(BIF_ARG_1)) { - Process *rp; - - if(internal_pid_index(BIF_ARG_1) >= erts_max_processes) - BIF_ERROR(BIF_P, BADARG); - - rp = erts_pid2proc(BIF_P, ERTS_PROC_LOCK_MAIN, BIF_ARG_1, 0); - /* NOTE: since we havn't taken any locks on rp we aren't allowed - * to follow rp, but we are allowed to check if it is - * NULL or not. - */ - if (!rp) { - ERTS_SMP_ASSERT_IS_NOT_EXITING(BIF_P); - BIF_RET(am_false); - } - BIF_RET(am_true); - } - else if(is_external_pid(BIF_ARG_1)) { - if(external_pid_dist_entry(BIF_ARG_1) == erts_this_dist_entry) - BIF_RET(am_false); /* A pid from an old incarnation of this node */ - else - BIF_ERROR(BIF_P, BADARG); - } - else { - BIF_ERROR(BIF_P, BADARG); - } -} - -BIF_RETTYPE process_display_2(BIF_ALIST_2) -{ - Process *rp; - - if (BIF_ARG_2 != am_backtrace) - BIF_ERROR(BIF_P, BADARG); - - rp = erts_pid2proc(BIF_P, ERTS_PROC_LOCK_MAIN, - BIF_ARG_1, ERTS_PROC_LOCKS_ALL); - if(!rp) { - BIF_ERROR(BIF_P, BADARG); - } - - erts_stack_dump(ERTS_PRINT_STDERR, NULL, rp); -#ifdef ERTS_SMP - erts_smp_proc_unlock(rp, (BIF_P == rp - ? ERTS_PROC_LOCKS_ALL_MINOR - : ERTS_PROC_LOCKS_ALL)); -#endif - BIF_RET(am_true); -} - -/**********************************************************************/ /* Return a list of active ports */ BIF_RETTYPE ports_0(BIF_ALIST_0) @@ -3587,18 +3607,45 @@ } } else if (is_internal_pid(BIF_ARG_2)) { - new_member = erts_pid2proc(BIF_P, - ERTS_PROC_LOCK_MAIN, - BIF_ARG_2, - ERTS_PROC_LOCK_MAIN); - if (!new_member) { + int await_x; + ErtsProcLocks locks = ERTS_PROC_LOCK_MAIN|ERTS_PROC_LOCK_STATUS; + new_member = erts_pid2proc_nropt(BIF_P, ERTS_PROC_LOCK_MAIN, + BIF_ARG_2, locks); + if (!new_member) BIF_ERROR(BIF_P, BADARG); - } - new_member->group_leader = STORE_NC_IN_PROC(new_member, BIF_ARG_1); + if (new_member == ERTS_PROC_LOCK_BUSY) + ERTS_BIF_YIELD2(bif_export[BIF_group_leader_2], BIF_P, + BIF_ARG_1, BIF_ARG_2); + + await_x = (new_member != BIF_P + && ERTS_PROC_PENDING_EXIT(new_member)); + if (!await_x) { + if (is_immed(BIF_ARG_1)) + new_member->group_leader = BIF_ARG_1; + else { + locks &= ~ERTS_PROC_LOCK_STATUS; + erts_smp_proc_unlock(new_member, ERTS_PROC_LOCK_STATUS); + new_member->group_leader = STORE_NC_IN_PROC(new_member, + BIF_ARG_1); + } + } - if (new_member != BIF_P) - erts_smp_proc_unlock(new_member, ERTS_PROC_LOCK_MAIN); + if (new_member == BIF_P) + locks &= ~ERTS_PROC_LOCK_MAIN; + if (locks) + erts_smp_proc_unlock(new_member, locks); + + if (await_x) { + /* Wait for new_member to terminate; then badarg */ + Eterm args[2] = {BIF_ARG_1, BIF_ARG_2}; + ERTS_BIF_AWAIT_X_APPLY_TRAP(BIF_P, + BIF_ARG_2, + am_erlang, + am_group_leader, + args, + 2); + } BIF_RET(am_true); } @@ -3789,7 +3836,7 @@ if (range > ((1L << 27) - 1)) BIF_ERROR(BIF_P, BADARG); #endif - hash = make_broken_hash(BIF_ARG_1, 0); + hash = make_broken_hash(BIF_ARG_1); BIF_RET(make_small(1 + (hash % range))); /* [1..range] */ } @@ -3809,7 +3856,7 @@ } range = (Uint32) u; } - hash = make_hash(BIF_ARG_1, 0); + hash = make_hash(BIF_ARG_1); if (range) { final_hash = 1 + (hash % range); /* [1..range] */ } else if ((final_hash = hash + 1) == 0) { @@ -3911,6 +3958,88 @@ BIF_RET(BIF_ARG_1); } +/* + * NOTE: The erts_bif_prep_await_proc_exit_*() functions are + * tightly coupled with the implementation of erlang:await_proc_exit/3. + * The erts_bif_prep_await_proc_exit_*() functions can safely call + * skip_current_msgq() since they know that erlang:await_proc_exit/3 + * unconditionally will do a monitor and then unconditionally will + * wait for the corresponding 'DOWN' message in a receive, and no other + * receive is done before this receive. This optimization removes an + * unnecessary scan of the currently existing message queue (which + * can be large). If the erlang:await_proc_exit/3 implementation + * is changed so that the above isn't true, nasty bugs in later + * receives, etc, may appear. + */ + +static ERTS_INLINE int +skip_current_msgq(Process *c_p) +{ + int res; +#if defined(ERTS_ENABLE_LOCK_CHECK) && defined(ERTS_SMP) + erts_proc_lc_chk_only_proc_main(c_p); +#endif + + erts_smp_proc_lock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE); + if (ERTS_PROC_PENDING_EXIT(c_p)) { + KILL_CATCHES(c_p); + c_p->freason = EXC_EXIT; + res = 0; + } + else { + ERTS_SMP_MSGQ_MV_INQ2PRIVQ(c_p); + c_p->msg.save = c_p->msg.last; + res = 1; + } + erts_smp_proc_unlock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE); + return res; +} + +void +erts_bif_prep_await_proc_exit_data_trap(Process *c_p, Eterm pid, Eterm ret) +{ + if (skip_current_msgq(c_p)) { + Eterm unused; + ERTS_BIF_PREP_TRAP3(unused, await_proc_exit_trap, c_p, pid, am_data, ret); + } +} + +void +erts_bif_prep_await_proc_exit_reason_trap(Process *c_p, Eterm pid) +{ + if (skip_current_msgq(c_p)) { + Eterm unused; + ERTS_BIF_PREP_TRAP3(unused, await_proc_exit_trap, c_p, + pid, am_reason, am_undefined); + } +} + +void +erts_bif_prep_await_proc_exit_apply_trap(Process *c_p, + Eterm pid, + Eterm module, + Eterm function, + Eterm args[], + int nargs) +{ + ASSERT(is_atom(module) && is_atom(function)); + if (skip_current_msgq(c_p)) { + Eterm unused; + Eterm term; + Eterm *hp; + int i; + + hp = HAlloc(c_p, 4+2*nargs); + term = NIL; + for (i = nargs-1; i >= 0; i--) { + term = CONS(hp, args[i], term); + hp += 2; + } + term = TUPLE3(hp, module, function, term); + ERTS_BIF_PREP_TRAP3(unused, await_proc_exit_trap, c_p, pid, am_apply, term); + } +} + Export bif_return_trap_export; void erts_init_bif(void) @@ -3940,13 +4069,17 @@ bif_return_trap_export.code[3] = (Eterm) em_apply_bif; bif_return_trap_export.code[4] = (Eterm) &bif_return_trap; + flush_monitor_message_trap = erts_export_put(am_erlang, + am_flush_monitor_message, + 2); + set_cpu_topology_trap = erts_export_put(am_erlang, am_set_cpu_topology, 1); erts_format_cpu_topology_trap = erts_export_put(am_erlang, am_format_cpu_topology, 1); - + await_proc_exit_trap = erts_export_put(am_erlang,am_await_proc_exit,3); } BIF_RETTYPE blocking_read_file_1(BIF_ALIST_1) diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/bif.h erlang-13.b.3-dfsg/erts/emulator/beam/bif.h --- erlang-13.b.1-dfsg/erts/emulator/beam/bif.h 2009-06-05 13:52:49.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/bif.h 2009-11-20 13:29:22.000000000 +0000 @@ -125,7 +125,7 @@ #define ERTS_BIF_PREP_TRAP0(Ret, Trap, Proc) \ do { \ (Proc)->arity = 0; \ - (Proc)->def_arg_reg[3] = (Eterm) (Trap); \ + (Proc)->def_arg_reg[3] = (Eterm) (Trap->address); \ (Proc)->freason = TRAP; \ (Ret) = THE_NON_VALUE; \ } while (0) @@ -134,7 +134,7 @@ do { \ (Proc)->arity = 1; \ (Proc)->def_arg_reg[0] = (Eterm) (A0); \ - (Proc)->def_arg_reg[3] = (Eterm) (Trap); \ + (Proc)->def_arg_reg[3] = (Eterm) ((Trap)->address); \ (Proc)->freason = TRAP; \ (Ret) = THE_NON_VALUE; \ } while (0) @@ -144,7 +144,7 @@ (Proc)->arity = 2; \ (Proc)->def_arg_reg[0] = (Eterm) (A0); \ (Proc)->def_arg_reg[1] = (Eterm) (A1); \ - (Proc)->def_arg_reg[3] = (Eterm) (Trap); \ + (Proc)->def_arg_reg[3] = (Eterm) ((Trap)->address); \ (Proc)->freason = TRAP; \ (Ret) = THE_NON_VALUE; \ } while (0) @@ -155,43 +155,50 @@ (Proc)->def_arg_reg[0] = (Eterm) (A0); \ (Proc)->def_arg_reg[1] = (Eterm) (A1); \ (Proc)->def_arg_reg[2] = (Eterm) (A2); \ - (Proc)->def_arg_reg[3] = (Eterm) (Trap); \ + (Proc)->def_arg_reg[3] = (Eterm) ((Trap)->address); \ (Proc)->freason = TRAP; \ (Ret) = THE_NON_VALUE; \ } while (0) -#define BIF_TRAP0(p, Trap_) do { \ - (p)->arity = 0; \ - (p)->def_arg_reg[3] = (Eterm) (Trap_); \ - (p)->freason = TRAP; \ - return THE_NON_VALUE; \ +#define BIF_TRAP0(p, Trap_) do { \ + (p)->arity = 0; \ + (p)->def_arg_reg[3] = (Eterm) ((Trap_)->address); \ + (p)->freason = TRAP; \ + return THE_NON_VALUE; \ } while(0) -#define BIF_TRAP1(Trap_, p, A0) do { \ - (p)->arity = 1; \ - (p)->def_arg_reg[0] = (A0); \ - (p)->def_arg_reg[3] = (Eterm) (Trap_); \ - (p)->freason = TRAP; \ - return THE_NON_VALUE; \ +#define BIF_TRAP1(Trap_, p, A0) do { \ + (p)->arity = 1; \ + (p)->def_arg_reg[0] = (A0); \ + (p)->def_arg_reg[3] = (Eterm) ((Trap_)->address); \ + (p)->freason = TRAP; \ + return THE_NON_VALUE; \ } while(0) -#define BIF_TRAP2(Trap_, p, A0, A1) do { \ - (p)->arity = 2; \ - (p)->def_arg_reg[0] = (A0); \ - (p)->def_arg_reg[1] = (A1); \ - (p)->def_arg_reg[3] = (Eterm) (Trap_); \ - (p)->freason = TRAP; \ - return THE_NON_VALUE; \ +#define BIF_TRAP2(Trap_, p, A0, A1) do { \ + (p)->arity = 2; \ + (p)->def_arg_reg[0] = (A0); \ + (p)->def_arg_reg[1] = (A1); \ + (p)->def_arg_reg[3] = (Eterm) ((Trap_)->address); \ + (p)->freason = TRAP; \ + return THE_NON_VALUE; \ } while(0) -#define BIF_TRAP3(Trap_, p, A0, A1, A2) do { \ - (p)->arity = 3; \ - (p)->def_arg_reg[0] = (A0); \ - (p)->def_arg_reg[1] = (A1); \ - (p)->def_arg_reg[2] = (A2); \ - (p)->def_arg_reg[3] = (Eterm) (Trap_); \ - (p)->freason = TRAP; \ - return THE_NON_VALUE; \ +#define BIF_TRAP3(Trap_, p, A0, A1, A2) do { \ + (p)->arity = 3; \ + (p)->def_arg_reg[0] = (A0); \ + (p)->def_arg_reg[1] = (A1); \ + (p)->def_arg_reg[2] = (A2); \ + (p)->def_arg_reg[3] = (Eterm) ((Trap_)->address); \ + (p)->freason = TRAP; \ + return THE_NON_VALUE; \ + } while(0) + +#define BIF_TRAP_CODE_PTR_0(p, Code_) do { \ + (p)->arity = 0; \ + (p)->def_arg_reg[3] = (Eterm) (Code_); \ + (p)->freason = TRAP; \ + return THE_NON_VALUE; \ } while(0) extern Export bif_return_trap_export; @@ -313,6 +320,67 @@ #define ERTS_SMP_BIF_CHK_PENDING_EXIT(P, L) #endif +/* + * The ERTS_BIF_*_AWAIT_X_*_TRAP makros either exits the caller, or + * sets up a trap to erlang:await_proc_exit/3. + * + * The caller is acquired to hold the 'main' lock on C_P. No other locks + * are allowed to be held. + */ + +#define ERTS_BIF_PREP_AWAIT_X_DATA_TRAP(RET, C_P, PID, DATA) \ +do { \ + erts_bif_prep_await_proc_exit_data_trap((C_P), (PID), (DATA)); \ + (RET) = THE_NON_VALUE; \ +} while (0) + +#define ERTS_BIF_PREP_AWAIT_X_REASON_TRAP(RET, C_P, PID) \ +do { \ + erts_bif_prep_await_proc_exit_reason_trap((C_P), (PID)); \ + (RET) = THE_NON_VALUE; \ +} while (0) + +#define ERTS_BIF_PREP_AWAIT_X_APPLY_TRAP(RET, C_P, PID, M, F, A, AN) \ +do { \ + erts_bif_prep_await_proc_exit_apply_trap((C_P), (PID), \ + (M), (F), (A), (AN)); \ + (RET) = THE_NON_VALUE; \ +} while (0) + +#define ERTS_BIF_AWAIT_X_DATA_TRAP(C_P, PID, DATA) \ +do { \ + erts_bif_prep_await_proc_exit_data_trap((C_P), (PID), (DATA)); \ + return THE_NON_VALUE; \ +} while (0) + +#define ERTS_BIF_AWAIT_X_REASON_TRAP(C_P, PID) \ +do { \ + erts_bif_prep_await_proc_exit_reason_trap((C_P), (PID)); \ + return THE_NON_VALUE; \ +} while (0) + +#define ERTS_BIF_AWAIT_X_APPLY_TRAP(C_P, PID, M, F, A, AN) \ +do { \ + erts_bif_prep_await_proc_exit_apply_trap((C_P), (PID), \ + (M), (F), (A), (AN)); \ + return THE_NON_VALUE; \ +} while (0) + +void +erts_bif_prep_await_proc_exit_data_trap(Process *c_p, + Eterm pid, + Eterm data); +void +erts_bif_prep_await_proc_exit_reason_trap(Process *c_p, + Eterm pid); +void +erts_bif_prep_await_proc_exit_apply_trap(Process *c_p, + Eterm pid, + Eterm module, + Eterm function, + Eterm args[], + int nargs); + #include "erl_bif_table.h" #endif diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/bif.tab erlang-13.b.3-dfsg/erts/emulator/beam/bif.tab --- erlang-13.b.1-dfsg/erts/emulator/beam/bif.tab 2009-06-05 13:52:49.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/bif.tab 2009-11-20 13:29:23.000000000 +0000 @@ -158,6 +158,10 @@ bif 'erl.util.crypt.md5':update/2 ebif_md5_update_2 bif erlang:md5_final/1 bif 'erl.util.crypt.md5':final/1 ebif_md5_final_1 +bif erlang:memory/0 +bif 'erl.lang':memory/0 ebif_memory_0 +bif erlang:memory/1 +bif 'erl.lang':memory/1 ebif_memory_1 bif erlang:module_loaded/1 bif 'erl.system.code':is_loaded/1 ebif_is_loaded_1 module_loaded_1 bif erlang:function_exported/3 @@ -258,6 +262,8 @@ bif 'erl.lang.port':call/3 ebif_port_call_3 bif erlang:port_command/2 bif 'erl.lang.port':command/2 ebif_port_command_2 +bif erlang:port_command/3 +bif 'erl.lang.port':command/3 ebif_port_command_3 bif erlang:port_control/3 bif 'erl.lang.port':control/3 ebif_port_control_3 bif erlang:port_close/1 @@ -384,6 +390,8 @@ bif 'erl.lang.proc':monitor/2 ebif_monitor_2 bif erlang:demonitor/1 bif 'erl.lang.proc':demonitor/1 ebif_demonitor_1 +bif erlang:demonitor/2 +bif 'erl.lang.proc':demonitor/2 ebif_demonitor_2 bif erlang:is_process_alive/1 bif 'erl.lang.proc':is_alive/1 ebif_proc_is_alive_1 is_process_alive_1 @@ -740,6 +748,13 @@ bif ets:setopts/2 # +# New Bifs in R13B3 +# +bif erlang:load_nif/2 +bif erlang:call_on_load_function/1 +bif erlang:finish_after_on_load/2 + +# # Obsolete # diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/big.c erlang-13.b.3-dfsg/erts/emulator/beam/big.c --- erlang-13.b.1-dfsg/erts/emulator/beam/big.c 2009-04-16 10:23:32.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/big.c 2009-11-20 13:29:23.000000000 +0000 @@ -1476,6 +1476,60 @@ return make_big(y); } + +Eterm erts_uint64_to_big(Uint64 x, Eterm **hpp) +{ + Eterm *hp = *hpp; +#ifdef ARCH_32 + if (x >= (((Uint64) 1) << 32)) { + *hp = make_pos_bignum_header(2); + BIG_DIGIT(hp, 0) = (Uint) (x & ((Uint) 0xffffffff)); + BIG_DIGIT(hp, 1) = (Uint) ((x >> 32) & ((Uint) 0xffffffff)); + *hpp += 2; + } + else +#endif + { + *hp = make_pos_bignum_header(1); + BIG_DIGIT(hp, 0) = (Uint) x; + *hpp += 1; + } + return make_big(hp); +} + +Eterm erts_sint64_to_big(Sint64 x, Eterm **hpp) +{ + Eterm *hp = *hpp; + int neg; + if (x >= 0) + neg = 0; + else { + neg = 1; + x = -x; + } +#ifdef ARCH_32 + if (x >= (((Uint64) 1) << 32)) { + if (neg) + *hp = make_neg_bignum_header(2); + else + *hp = make_pos_bignum_header(2); + BIG_DIGIT(hp, 0) = (Uint) (x & ((Uint) 0xffffffff)); + BIG_DIGIT(hp, 1) = (Uint) ((x >> 32) & ((Uint) 0xffffffff)); + *hpp += 2; + } + else +#endif + { + if (neg) + *hp = make_neg_bignum_header(1); + else + *hp = make_pos_bignum_header(1); + BIG_DIGIT(hp, 0) = (Uint) x; + *hpp += 1; + } + return make_big(hp); +} + /* ** Convert a bignum to a double float */ diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/big.h erlang-13.b.3-dfsg/erts/emulator/beam/big.h --- erlang-13.b.1-dfsg/erts/emulator/beam/big.h 2009-03-12 12:15:31.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/big.h 2009-11-20 13:29:23.000000000 +0000 @@ -88,6 +88,25 @@ #define BIG_UINT_HEAP_SIZE (1 + 1) /* always, since sizeof(Uint) <= sizeof(Eterm) */ +#ifdef ARCH_32 + +#define ERTS_UINT64_BIG_HEAP_SIZE__(X) \ + ((X) >= (((Uint64) 1) << 32) ? (1 + 2) : (1 + 1)) +#define ERTS_SINT64_HEAP_SIZE(X) \ + (IS_SSMALL((X)) \ + ? 0 \ + : ERTS_UINT64_BIG_HEAP_SIZE__((X) >= 0 ? (X) : -(X))) +#define ERTS_UINT64_HEAP_SIZE(X) \ + (IS_USMALL(0, (X)) ? 0 : ERTS_UINT64_BIG_HEAP_SIZE__((X))) + +#else + +#define ERTS_SINT64_HEAP_SIZE(X) \ + (IS_SSMALL((X)) ? 0 : (1 + 1)) +#define ERTS_UINT64_HEAP_SIZE(X) \ + (IS_USMALL(0, (X)) ? 0 : (1 + 1)) + +#endif int big_decimal_estimate(Eterm); Eterm erts_big_to_list(Eterm, Eterm**); @@ -129,5 +148,8 @@ Uint32 big_to_uint32(Eterm b); int term_equals_2pow32(Eterm); +Eterm erts_uint64_to_big(Uint64, Eterm **); +Eterm erts_sint64_to_big(Sint64, Eterm **); + #endif diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/binary.c erlang-13.b.3-dfsg/erts/emulator/beam/binary.c --- erlang-13.b.1-dfsg/erts/emulator/beam/binary.c 2009-03-12 12:15:31.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/binary.c 2009-11-20 13:29:24.000000000 +0000 @@ -97,7 +97,7 @@ /* * Miscellanous updates. Return the tagged binary. */ - MSO(p).overhead += pb->size / BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + MSO(p).overhead += pb->size / sizeof(Eterm); return make_binary(pb); } @@ -136,7 +136,7 @@ /* * Miscellanous updates. Return the tagged binary. */ - MSO(p).overhead += pb->size / BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + MSO(p).overhead += pb->size / sizeof(Eterm); return make_binary(pb); } @@ -250,8 +250,7 @@ Uint bitoffs; if (is_not_binary(BIF_ARG_1)) { - error: - BIF_ERROR(BIF_P, BADARG); + goto error; } size = binary_size(BIF_ARG_1); ERTS_GET_REAL_BIN(BIF_ARG_1, real_bin, offset, bitoffs, bitsize); @@ -266,6 +265,9 @@ BIF_RET(bin_bytes_to_list(NIL, hp, bytes, size, bitoffs)); } + + error: + BIF_ERROR(BIF_P, BADARG); } BIF_RETTYPE binary_to_list_3(BIF_ALIST_3) @@ -280,8 +282,7 @@ Eterm* hp; if (is_not_binary(BIF_ARG_1)) { - error: - BIF_ERROR(BIF_P, BADARG); + goto error; } if (!term_to_Uint(BIF_ARG_2, &start) || !term_to_Uint(BIF_ARG_3, &stop)) { goto error; @@ -295,6 +296,9 @@ i = stop-start+1; hp = HAlloc(BIF_P, 2*i); BIF_RET(bin_bytes_to_list(NIL, hp, bytes+start-1, i, bitoffs)); + + error: + BIF_ERROR(BIF_P, BADARG); } BIF_RETTYPE bitstring_to_list_1(BIF_ALIST_1) @@ -348,13 +352,11 @@ int i; int offset; byte* bytes; - if (is_nil(BIF_ARG_1)) { BIF_RET(new_binary(BIF_P,(byte*)"",0)); } if (is_not_list(BIF_ARG_1)) { - error: - BIF_ERROR(BIF_P, BADARG); + goto error; } if ((i = io_list_len(BIF_ARG_1)) < 0) { goto error; @@ -364,6 +366,9 @@ offset = io_list_to_buf(BIF_ARG_1, (char*) bytes, i); ASSERT(offset == 0); BIF_RET(bin); + + error: + BIF_ERROR(BIF_P, BADARG); } /* Turn a possibly deep list of ints (and binaries) into */ @@ -383,8 +388,7 @@ BIF_RET(new_binary(BIF_P,(byte*)"",0)); } if (is_not_list(BIF_ARG_1)) { - error: - BIF_ERROR(BIF_P, BADARG); + goto error; } if ((i = io_list_len(BIF_ARG_1)) < 0) { goto error; @@ -394,6 +398,9 @@ offset = io_list_to_buf(BIF_ARG_1, (char*) bytes, i); ASSERT(offset == 0); BIF_RET(bin); + + error: + BIF_ERROR(BIF_P, BADARG); } BIF_RETTYPE list_to_bitstring_1(BIF_ALIST_1) @@ -408,8 +415,7 @@ BIF_RET(new_binary(BIF_P,(byte*)"",0)); } if (is_not_list(BIF_ARG_1)) { - error: - BIF_ERROR(BIF_P, BADARG); + goto error; } if ((i = bitstr_list_len(BIF_ARG_1)) < 0) { goto error; @@ -437,6 +443,9 @@ } BIF_RET(bin); + + error: + BIF_ERROR(BIF_P, BADARG); } BIF_RETTYPE split_binary_2(BIF_ALIST_2) @@ -452,8 +461,7 @@ Eterm* hp; if (is_not_binary(BIF_ARG_1)) { - error: - BIF_ERROR(BIF_P, BADARG); + goto error; } if (!term_to_Uint(BIF_ARG_2, &pos)) { goto error; @@ -484,6 +492,9 @@ hp += ERL_SUB_BIN_SIZE; return TUPLE2(hp, make_binary(sb1), make_binary(sb2)); + + error: + BIF_ERROR(BIF_P, BADARG); } void diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/copy.c erlang-13.b.3-dfsg/erts/emulator/beam/copy.c --- erlang-13.b.1-dfsg/erts/emulator/beam/copy.c 2009-03-12 12:15:31.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/copy.c 2009-11-20 13:29:24.000000000 +0000 @@ -322,8 +322,7 @@ pb->next = off_heap->mso; pb->flags = 0; off_heap->mso = pb; - off_heap->overhead += pb->size / - BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + off_heap->overhead += pb->size / sizeof(Eterm); } break; case SUB_BINARY_SUBTAG: @@ -372,8 +371,7 @@ to->next = off_heap->mso; to->flags = 0; off_heap->mso = to; - off_heap->overhead += to->size / - BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + off_heap->overhead += to->size / sizeof(Eterm); } *argp = make_binary(hbot); if (extra_bytes != 0) { @@ -659,8 +657,7 @@ erts_refc_inc(&pb->val->refc, 2); pb->next = erts_global_offheap.mso; erts_global_offheap.mso = pb; - erts_global_offheap.overhead += pb->size / - BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + erts_global_offheap.overhead += pb->size / sizeof(Eterm); continue; } @@ -785,8 +782,7 @@ to_bin->bytes = from_bin->bytes + sub_offset; to_bin->next = erts_global_offheap.mso; erts_global_offheap.mso = to_bin; - erts_global_offheap.overhead += to_bin->size / - BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + erts_global_offheap.overhead += to_bin->size / sizeof(Eterm); res_binary=make_binary(to_bin); hp += PROC_BIN_SIZE; } @@ -929,6 +925,7 @@ erts_refc_inc(&pb->val->refc, 2); pb->next = off_heap->mso; off_heap->mso = pb; + off_heap->overhead += pb->size / sizeof(Eterm); } break; case FUN_SUBTAG: diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/dist.c erlang-13.b.3-dfsg/erts/emulator/beam/dist.c --- erlang-13.b.1-dfsg/erts/emulator/beam/dist.c 2009-06-05 13:52:50.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/dist.c 2009-11-20 13:29:24.000000000 +0000 @@ -2343,6 +2343,9 @@ if (!pp || (pp->status & ERTS_PORT_SFLG_EXITING)) goto badarg; + if ((pp->drv_ptr->flags & ERL_DRV_FLAG_SOFT_BUSY) == 0) + goto badarg; + if (dep->cid == BIF_ARG_2 && pp->dist_entry == dep) goto done; /* Already set */ diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_alloc.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_alloc.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_alloc.c 2009-06-05 13:53:27.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_alloc.c 2009-09-18 15:08:37.000000000 +0100 @@ -1393,7 +1393,7 @@ erts_tsd_set(thr_ix_key, (void *)(long) ix); } -void +__decl_noreturn void erts_alc_fatal_error(int error, int func, ErtsAlcType_t n, ...) { char buf[10]; @@ -1459,25 +1459,25 @@ } } -void +__decl_noreturn void erts_alloc_enomem(ErtsAlcType_t type, Uint size) { erts_alloc_n_enomem(ERTS_ALC_T2N(type), size); } -void +__decl_noreturn void erts_alloc_n_enomem(ErtsAlcType_t n, Uint size) { erts_alc_fatal_error(ERTS_ALC_E_NOMEM, ERTS_ALC_O_ALLOC, n, size); } -void +__decl_noreturn void erts_realloc_enomem(ErtsAlcType_t type, void *ptr, Uint size) { erts_realloc_n_enomem(ERTS_ALC_T2N(type), ptr, size); } -void +__decl_noreturn void erts_realloc_n_enomem(ErtsAlcType_t n, void *ptr, Uint size) { erts_alc_fatal_error(ERTS_ALC_E_NOMEM, ERTS_ALC_O_REALLOC, n, size); @@ -1555,11 +1555,12 @@ int length; Eterm res = THE_NON_VALUE; ErtsAlcType_t ai; + int only_one_value = 0; /* Figure out whats wanted... */ length = 0; - if (earg == THE_NON_VALUE) { /* i.e. wants all */ + if (is_non_value(earg)) { /* i.e. wants all */ want.total = 1; atoms[length] = am_total; uintps[length++] = &size.total; @@ -1604,10 +1605,19 @@ } else { + Eterm tmp_heap[2]; Eterm wanted_list; + if (is_nil(earg)) return NIL; - wanted_list = earg; + + if (is_not_atom(earg)) + wanted_list = earg; + else { + wanted_list = CONS(&tmp_heap[0], earg, NIL); + only_one_value = 1; + } + while (is_list(wanted_list)) { switch (CAR(list_val(wanted_list))) { case am_total: @@ -1703,8 +1713,7 @@ default: if (!erts_allctrs_info[ai].enabled || !erts_allctrs_info[ai].alloc_util) { - ERTS_DECL_AM(notsup); - return AM_notsup; + return am_notsup; } break; } @@ -1863,26 +1872,33 @@ if (proc) { /* Build erlang term result... */ Uint *hp; - Uint **hpp; Uint hsz; - Uint *hszp; erts_smp_proc_lock(proc, ERTS_PROC_LOCK_MAIN); - hpp = NULL; - hsz = 0; - hszp = &hsz; - - while (1) { - int i; - for (i = 0; i < length; i++) - euints[i] = erts_bld_uint(hpp, hszp, *uintps[i]); - res = erts_bld_2tup_list(hpp, hszp, length, atoms, euints); - if (hpp) - break; - hp = HAlloc((Process *) proc, hsz); - hpp = &hp; - hszp = NULL; + if (only_one_value) { + ASSERT(length == 1); + hsz = 0; + erts_bld_uint(NULL, &hsz, *uintps[0]); + hp = hsz ? HAlloc((Process *) proc, hsz) : NULL; + res = erts_bld_uint(&hp, NULL, *uintps[0]); + } + else { + Uint **hpp = NULL; + Uint *hszp = &hsz; + hsz = 0; + + while (1) { + int i; + for (i = 0; i < length; i++) + euints[i] = erts_bld_uint(hpp, hszp, *uintps[i]); + res = erts_bld_2tup_list(hpp, hszp, length, atoms, euints); + if (hpp) + break; + hp = HAlloc((Process *) proc, hsz); + hpp = &hp; + hszp = NULL; + } } } diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_alloc.h erlang-13.b.3-dfsg/erts/emulator/beam/erl_alloc.h --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_alloc.h 2009-03-12 12:15:34.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_alloc.h 2009-09-18 15:08:36.000000000 +0100 @@ -128,11 +128,16 @@ int erts_alc_get_thr_ix(void); void erts_alloc_reg_scheduler_id(Uint id); -void erts_alloc_enomem(ErtsAlcType_t,Uint) __noreturn; -void erts_alloc_n_enomem(ErtsAlcType_t,Uint) __noreturn; -void erts_realloc_enomem(ErtsAlcType_t,void*,Uint) __noreturn; -void erts_realloc_n_enomem(ErtsAlcType_t,void*,Uint) __noreturn; -void erts_alc_fatal_error(int,int,ErtsAlcType_t,...) __noreturn; +__decl_noreturn void erts_alloc_enomem(ErtsAlcType_t,Uint) + __noreturn; +__decl_noreturn void erts_alloc_n_enomem(ErtsAlcType_t,Uint) + __noreturn; +__decl_noreturn void erts_realloc_enomem(ErtsAlcType_t,void*,Uint) + __noreturn; +__decl_noreturn void erts_realloc_n_enomem(ErtsAlcType_t,void*,Uint) + __noreturn; +__decl_noreturn void erts_alc_fatal_error(int,int,ErtsAlcType_t,...) + __noreturn; /* --- DO *NOT* USE THESE DEPRECATED FUNCTIONS --- Instead use: */ void *safe_alloc(Uint) __deprecated; /* erts_alloc() */ diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_alloc.types erlang-13.b.3-dfsg/erts/emulator/beam/erl_alloc.types --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_alloc.types 2009-06-05 13:53:29.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_alloc.types 2009-11-20 13:31:36.000000000 +0000 @@ -156,6 +156,7 @@ type ATOM_TABLE LONG_LIVED ATOM atom_tab type EXPORT_TABLE LONG_LIVED CODE export_tab type MODULE_TABLE LONG_LIVED CODE module_tab +type TAINT LONG_LIVED CODE taint_list type MODULE_REFS STANDARD CODE module_refs type NC_TMP TEMPORARY SYSTEM nc_tmp type TMP TEMPORARY SYSTEM tmp @@ -170,6 +171,7 @@ type DRV DRIVER SYSTEM drv_internal type DRV_BINARY BINARY BINARIES drv_binary type DRIVER STANDARD SYSTEM driver +type NIF DRIVER SYSTEM nif_internal type BINARY BINARY BINARIES binary type NBIF_TABLE SYSTEM SYSTEM nbif_tab type CODE LONG_LIVED CODE code @@ -182,7 +184,6 @@ type IOQ STANDARD SYSTEM io_queue type BITS_BUF STANDARD SYSTEM bits_buf type TMP_DIST_BUF TEMPORARY SYSTEM tmp_dist_buf -type ASYNC SHORT_LIVED SYSTEM async type ASYNC_Q LONG_LIVED SYSTEM async_queue type ESTACK TEMPORARY SYSTEM estack type PORT_CALL_BUF TEMPORARY SYSTEM port_call_buf @@ -242,6 +243,14 @@ type CPUDATA LONG_LIVED SYSTEM cpu_data type TMP_CPU_IDS SHORT_LIVED SYSTEM tmp_cpu_ids type EXT_TERM_DATA SHORT_LIVED PROCESSES external_term_data +type ZLIB STANDARD SYSTEM zlib + ++if smp +type ASYNC SHORT_LIVED SYSTEM async ++else +# sl_alloc is not thread safe in non smp build; therefore, we use driver_alloc +type ASYNC DRIVER SYSTEM async ++endif +if smp type PORT_LOCK STANDARD SYSTEM port_lock @@ -260,6 +269,12 @@ type ETHR_INTERNAL SYSTEM SYSTEM ethread_internal ++ifnot smp + +type ARCALLBACK LONG_LIVED SYSTEM async_ready_callback + ++endif + +endif +if shared_heap diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_arith.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_arith.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_arith.c 2009-03-12 12:15:35.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_arith.c 2009-11-20 13:30:53.000000000 +0000 @@ -1123,10 +1123,7 @@ return ret; } -#define ERTS_ARITH_FORCE_GC 0 - -#define ERTS_NEED_GC(p, need) \ - (ERTS_ARITH_FORCE_GC || (HEAP_LIMIT((p)) - HEAP_TOP((p))) <= (need)) +#define ERTS_NEED_GC(p, need) ((HEAP_LIMIT((p)) - HEAP_TOP((p))) <= (need)) static ERTS_INLINE void trim_heap(Process* p, Eterm* hp, Eterm res) diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_async.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_async.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_async.c 2009-03-12 12:15:35.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_async.c 2009-11-20 13:31:13.000000000 +0000 @@ -82,6 +82,29 @@ static void* async_main(void*); static void async_add(ErlAsync*, AsyncQueue*); +#ifndef ERTS_SMP +typedef struct ErtsAsyncReadyCallback_ ErtsAsyncReadyCallback; +struct ErtsAsyncReadyCallback_ { + struct ErtsAsyncReadyCallback_ *next; + void (*callback)(void); +}; + +static ErtsAsyncReadyCallback *callbacks; +static int async_handle; + +int erts_register_async_ready_callback(void (*funcp)(void)) +{ + ErtsAsyncReadyCallback *cb = erts_alloc(ERTS_ALC_T_ARCALLBACK, + sizeof(ErtsAsyncReadyCallback)); + cb->next = callbacks; + cb->callback = funcp; + erts_mtx_lock(&async_ready_mtx); + callbacks = cb; + erts_mtx_unlock(&async_ready_mtx); + return async_handle; +} +#endif + int init_async(int hndl) { erts_thr_opts_t thr_opts = ERTS_THR_OPTS_DEFAULT_INITER; @@ -92,6 +115,8 @@ thr_opts.suggested_stack_size = erts_async_thread_suggested_stack_size; #ifndef ERTS_SMP + callbacks = NULL; + async_handle = hndl; erts_mtx_init(&async_ready_mtx, "async_ready"); async_ready_list = NULL; #endif @@ -304,12 +329,18 @@ int check_async_ready(void) { +#ifdef USE_THREADS + ErtsAsyncReadyCallback *cbs; +#endif ErlAsync* a; int count = 0; erts_mtx_lock(&async_ready_mtx); a = async_ready_list; async_ready_list = NULL; +#ifdef USE_THREADS + cbs = callbacks; +#endif erts_mtx_unlock(&async_ready_mtx); while(a != NULL) { @@ -335,6 +366,10 @@ erts_free(ERTS_ALC_T_ASYNC, (void *) a); a = a_next; } +#ifdef USE_THREADS + for (; cbs; cbs = cbs->next) + (*cbs->callback)(); +#endif return count; } diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_bif_guard.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_bif_guard.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_bif_guard.c 2009-03-12 12:15:36.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_bif_guard.c 2009-11-20 13:32:24.000000000 +0000 @@ -316,14 +316,11 @@ /* * The following code is used when a guard that may build on the - * heap is called directly. They must not used HAlloc(), but must + * heap is called directly. They must not use HAlloc(), but must * do a garbage collection if there is insufficient heap space. */ -#define ERTS_GBIF_FORCE_GC 1 - -#define ERTS_NEED_GC(p, need) \ - (ERTS_GBIF_FORCE_GC || (HEAP_LIMIT((p)) - HEAP_TOP((p))) <= (need)) +#define ERTS_NEED_GC(p, need) ((HEAP_LIMIT((p)) - HEAP_TOP((p))) <= (need)) Eterm erts_gc_length_1(Process* p, Eterm* reg, Uint live) { diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_bif_info.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_bif_info.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_bif_info.c 2009-06-05 13:53:17.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_bif_info.c 2009-11-20 13:30:56.000000000 +0000 @@ -485,6 +485,10 @@ * process_info/[1,2] */ +#define ERTS_PI_FAIL_TYPE_BADARG 0 +#define ERTS_PI_FAIL_TYPE_YIELD 1 +#define ERTS_PI_FAIL_TYPE_AWAIT_EXIT 2 + static ERTS_INLINE ErtsProcLocks pi_locks(Eterm info) { @@ -645,51 +649,27 @@ static ERTS_INLINE Process * pi_pid2proc(Process *c_p, Eterm pid, ErtsProcLocks info_locks) { -#ifndef ERTS_SMP - return erts_pid2proc(c_p, 0, pid, 0); -#else /* ERTS_SMP */ +#ifdef ERTS_SMP /* - * If we want to lookup another process in an smp system - * and aquire the main process lock, we might have to wait - * for quite a while for the lock if the other process is - * running. This since the scheduler running the process holds - * the main lock. If a scheduler is blocked for a very long time - * the whole system will suffer. In order to avoid blocking - * this scheduler for a long time we do the following: - * If we are looking up another process and we need the main - * lock we first do a try lock. If that fail, we do a lookup - * with erts_pid2proc_not_running() instead. We may then have - * to yield in order to wait for the other process to be - * scheduled out. When the other process has been scheduled - * out we will be scheduled in again. This way the penalty is - * only for the process doing the process_info, instead of - * for the whole system. + * If the main lock is needed, we use erts_pid2proc_not_running() + * instead of erts_pid2proc() for two reasons: + * * Current function of pid and possibly other information will + * have been updated so that process_info() is consistent with an + * info-request/info-response signal model. + * * We avoid blocking the whole scheduler executing the + * process that is calling process_info() for a long time + * which will happen if pid is currently running. + * The caller of process_info() may have to yield if pid + * is currently running. */ - if (!(c_p->flags & F_P2PNR_RESCHED)) { - /* - * We have not rescheduled via erts_pid2proc_not_running(). If - * we have, we must call erts_pid2proc_not_running(). - */ - int flags; - Process *rp; - - flags = (c_p->id != pid && (info_locks & ERTS_PROC_LOCK_MAIN) - ? ERTS_P2P_FLG_TRY_LOCK - : 0); - rp = erts_pid2proc_opt(c_p, - ERTS_PROC_LOCK_MAIN, - pid, - info_locks, - flags); - if (rp != ERTS_PROC_LOCK_BUSY) - return rp; - /* else: busy -> use erts_pid2proc_not_running() */ - } - - ERTS_LC_ASSERT(info_locks & ERTS_PROC_LOCK_MAIN); - return erts_pid2proc_not_running(c_p, ERTS_PROC_LOCK_MAIN, pid, info_locks); + if (info_locks & ERTS_PROC_LOCK_MAIN) + return erts_pid2proc_not_running(c_p, ERTS_PROC_LOCK_MAIN, + pid, info_locks); + else #endif + return erts_pid2proc(c_p, ERTS_PROC_LOCK_MAIN, + pid, info_locks); } @@ -706,7 +686,7 @@ static Eterm process_info_list(Process *c_p, Eterm pid, Eterm list, int always_wrap, - int *yield) + int *fail_type) { int want_messages = 0; int def_res_elem_ix_buf[ERTS_PI_DEF_RES_ELEM_IX_BUF_SZ]; @@ -720,7 +700,7 @@ int res_len, ix; Process *rp = NULL; - *yield = 0; + *fail_type = ERTS_PI_FAIL_TYPE_BADARG; for (ix = 0; ix < ERTS_PI_ARGS; ix++) part_res[ix] = THE_NON_VALUE; @@ -770,7 +750,7 @@ ASSERT(res_len > 0); - rp = pi_pid2proc(c_p, pid, locks); + rp = pi_pid2proc(c_p, pid, locks|ERTS_PROC_LOCK_STATUS); if (!rp) { res = am_undefined; goto done; @@ -778,12 +758,22 @@ else if (rp == ERTS_PROC_LOCK_BUSY) { rp = NULL; res = THE_NON_VALUE; - *yield = 1; + *fail_type = ERTS_PI_FAIL_TYPE_YIELD; goto done; } + else if (c_p != rp && ERTS_PROC_PENDING_EXIT(rp)) { + locks |= ERTS_PROC_LOCK_STATUS; + res = THE_NON_VALUE; + *fail_type = ERTS_PI_FAIL_TYPE_AWAIT_EXIT; + goto done; + } + else if (!(locks & ERTS_PROC_LOCK_STATUS)) { + erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_STATUS); + } + /* - * We always handle 'messages' first if should be part + * We always handle 'messages' first if it should be part * of the result. This since if both 'messages' and * 'message_queue_len' are wanted, 'messages' may * change the result of 'message_queue_len' (in case @@ -847,7 +837,7 @@ BIF_RETTYPE process_info_1(BIF_ALIST_1) { Eterm res; - int yield; + int fail_type; if (is_external_pid(BIF_ARG_1) && external_pid_dist_entry(BIF_ARG_1) == erts_this_dist_entry) @@ -858,12 +848,18 @@ BIF_ERROR(BIF_P, BADARG); } - res = process_info_list(BIF_P, BIF_ARG_1, pi_1_keys_list, 0, &yield); + res = process_info_list(BIF_P, BIF_ARG_1, pi_1_keys_list, 0, &fail_type); if (is_non_value(res)) { - if (!yield) + switch (fail_type) { + case ERTS_PI_FAIL_TYPE_BADARG: BIF_ERROR(BIF_P, BADARG); - else + case ERTS_PI_FAIL_TYPE_YIELD: ERTS_BIF_YIELD1(bif_export[BIF_process_info_1], BIF_P, BIF_ARG_1); + case ERTS_PI_FAIL_TYPE_AWAIT_EXIT: + ERTS_BIF_AWAIT_X_DATA_TRAP(BIF_P, BIF_ARG_1, am_undefined); + default: + erl_exit(ERTS_ABORT_EXIT, "%s:%d: Internal error", __FILE__, __LINE__); + } } ASSERT(!(BIF_P->flags & F_P2PNR_RESCHED)); @@ -877,7 +873,7 @@ Process *rp; Eterm pid = BIF_ARG_1; ErtsProcLocks info_locks; - int yield; + int fail_type; if (is_external_pid(pid) && external_pid_dist_entry(pid) == erts_this_dist_entry) @@ -892,13 +888,20 @@ BIF_RET(NIL); if (is_list(BIF_ARG_2)) { - res = process_info_list(BIF_P, BIF_ARG_1, BIF_ARG_2, 1, &yield); + res = process_info_list(BIF_P, BIF_ARG_1, BIF_ARG_2, 1, &fail_type); if (is_non_value(res)) { - if (!yield) + switch (fail_type) { + case ERTS_PI_FAIL_TYPE_BADARG: BIF_ERROR(BIF_P, BADARG); - else + case ERTS_PI_FAIL_TYPE_YIELD: ERTS_BIF_YIELD2(bif_export[BIF_process_info_2], BIF_P, BIF_ARG_1, BIF_ARG_2); + case ERTS_PI_FAIL_TYPE_AWAIT_EXIT: + ERTS_BIF_AWAIT_X_DATA_TRAP(BIF_P, BIF_ARG_1, am_undefined); + default: + erl_exit(ERTS_ABORT_EXIT, "%s:%d: Internal error", + __FILE__, __LINE__); + } } ASSERT(!(BIF_P->flags & F_P2PNR_RESCHED)); BIF_RET(res); @@ -909,14 +912,21 @@ info_locks = pi_locks(BIF_ARG_2); - rp = pi_pid2proc(BIF_P, pid, info_locks); + rp = pi_pid2proc(BIF_P, pid, info_locks|ERTS_PROC_LOCK_STATUS); if (!rp) res = am_undefined; else if (rp == ERTS_PROC_LOCK_BUSY) ERTS_BIF_YIELD2(bif_export[BIF_process_info_2], BIF_P, BIF_ARG_1, BIF_ARG_2); - else + else if (rp != BIF_P && ERTS_PROC_PENDING_EXIT(rp)) { + erts_smp_proc_unlock(rp, info_locks|ERTS_PROC_LOCK_STATUS); + ERTS_BIF_AWAIT_X_DATA_TRAP(BIF_P, BIF_ARG_1, am_undefined); + } + else { + if (!(info_locks & ERTS_PROC_LOCK_STATUS)) + erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_STATUS); res = process_info_aux(BIF_P, rp, pid, BIF_ARG_2, 0); + } ASSERT(is_value(res)); #ifdef ERTS_SMP @@ -1582,12 +1592,6 @@ if (sel == am_allocator_sizes && arity == 2) { return erts_allocator_info_term(BIF_P, *tp, 1); - } else if (sel == am_memory) { - Eterm res; - if (arity != 2) - return am_badarg; - res = erts_memory(NULL, NULL, BIF_P, *tp); - return res; } else if (sel == am_allocated) { if (arity == 2) { Eterm res = THE_NON_VALUE; @@ -1858,9 +1862,6 @@ } else if (BIF_ARG_1 == am_compat_rel) { ASSERT(erts_compat_rel > 0); BIF_RET(make_small(erts_compat_rel)); - } else if (BIF_ARG_1 == am_memory) { - res = erts_memory(NULL, NULL, BIF_P, THE_NON_VALUE); - BIF_RET(res); } else if (BIF_ARG_1 == am_multi_scheduling) { #ifndef ERTS_SMP BIF_RET(am_disabled); @@ -2293,6 +2294,15 @@ DECL_AM(unknown); BIF_RET(AM_unknown); } + } + else if (ERTS_IS_ATOM_STR("logical_processors_available", BIF_ARG_1)) { + int no = erts_get_cpu_available(erts_cpuinfo); + if (no > 0) + BIF_RET(make_small((Uint) no)); + else { + DECL_AM(unknown); + BIF_RET(AM_unknown); + } } else if (ERTS_IS_ATOM_STR("otp_release", BIF_ARG_1)) { int n = sizeof(ERLANG_OTP_RELEASE)-1; hp = HAlloc(BIF_P, 2*n); @@ -2409,6 +2419,12 @@ #else BIF_RET(am_false); #endif + } else if (ERTS_IS_ATOM_STR("lock_counting", BIF_ARG_1)) { +#ifdef ERTS_ENABLE_LOCK_COUNT + BIF_RET(am_true); +#else + BIF_RET(am_false); +#endif } else if (ERTS_IS_ATOM_STR("debug_compiled", BIF_ARG_1)) { #ifdef DEBUG BIF_RET(am_true); @@ -2438,6 +2454,8 @@ BIF_RET(erts_sched_stat_term(BIF_P, 0)); } else if (ERTS_IS_ATOM_STR("total_scheduling_statistics", BIF_ARG_1)) { BIF_RET(erts_sched_stat_term(BIF_P, 1)); + } else if (ERTS_IS_ATOM_STR("taints", BIF_ARG_1)) { + BIF_RET(erts_nif_taints(BIF_P)); } BIF_ERROR(BIF_P, BADARG); @@ -2809,6 +2827,76 @@ return TUPLE2(hp, what, val); } +BIF_RETTYPE is_process_alive_1(BIF_ALIST_1) +{ + if(is_internal_pid(BIF_ARG_1)) { + Process *rp; + + if (BIF_ARG_1 == BIF_P->id) + BIF_RET(am_true); + + if(internal_pid_index(BIF_ARG_1) >= erts_max_processes) + BIF_ERROR(BIF_P, BADARG); + + rp = erts_pid2proc(BIF_P, ERTS_PROC_LOCK_MAIN, + BIF_ARG_1, ERTS_PROC_LOCK_STATUS); + if (!rp) { + BIF_RET(am_false); + } + else { + int have_pending_exit = ERTS_PROC_PENDING_EXIT(rp); + erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_STATUS); + if (have_pending_exit) + ERTS_BIF_AWAIT_X_DATA_TRAP(BIF_P, BIF_ARG_1, am_false); + else + BIF_RET(am_true); + } + } + else if(is_external_pid(BIF_ARG_1)) { + if(external_pid_dist_entry(BIF_ARG_1) == erts_this_dist_entry) + BIF_RET(am_false); /* A pid from an old incarnation of this node */ + else + BIF_ERROR(BIF_P, BADARG); + } + else { + BIF_ERROR(BIF_P, BADARG); + } +} + +BIF_RETTYPE process_display_2(BIF_ALIST_2) +{ + Process *rp; + + if (BIF_ARG_2 != am_backtrace) + BIF_ERROR(BIF_P, BADARG); + + rp = erts_pid2proc_nropt(BIF_P, ERTS_PROC_LOCK_MAIN, + BIF_ARG_1, ERTS_PROC_LOCKS_ALL); + if(!rp) { + BIF_ERROR(BIF_P, BADARG); + } + if (rp == ERTS_PROC_LOCK_BUSY) + ERTS_BIF_YIELD2(bif_export[BIF_process_display_2], BIF_P, + BIF_ARG_1, BIF_ARG_2); + if (rp != BIF_P && ERTS_PROC_PENDING_EXIT(rp)) { + Eterm args[2] = {BIF_ARG_1, BIF_ARG_2}; + erts_smp_proc_unlock(rp, ERTS_PROC_LOCKS_ALL); + ERTS_BIF_AWAIT_X_APPLY_TRAP(BIF_P, + BIF_ARG_1, + am_erlang, + am_process_display, + args, + 2); + } + erts_stack_dump(ERTS_PRINT_STDERR, NULL, rp); +#ifdef ERTS_SMP + erts_smp_proc_unlock(rp, (BIF_P == rp + ? ERTS_PROC_LOCKS_ALL_MINOR + : ERTS_PROC_LOCKS_ALL)); +#endif + BIF_RET(am_true); +} + /* this is a general call which return some possibly useful information */ @@ -2929,6 +3017,26 @@ BIF_ERROR(BIF_P, BADARG); } +BIF_RETTYPE memory_0(BIF_ALIST_0) +{ + BIF_RETTYPE res = erts_memory(NULL, NULL, BIF_P, THE_NON_VALUE); + switch (res) { + case am_badarg: BIF_ERROR(BIF_P, EXC_INTERNAL_ERROR); /* never... */ + case am_notsup: BIF_ERROR(BIF_P, EXC_NOTSUP); + default: BIF_RET(res); + } +} + +BIF_RETTYPE memory_1(BIF_ALIST_1) +{ + BIF_RETTYPE res = erts_memory(NULL, NULL, BIF_P, BIF_ARG_1); + switch (res) { + case am_badarg: BIF_ERROR(BIF_P, BADARG); + case am_notsup: BIF_ERROR(BIF_P, EXC_NOTSUP); + default: BIF_RET(res); + } +} + BIF_RETTYPE error_logger_warning_map_0(BIF_ALIST_0) { BIF_RET(erts_error_logger_warnings); @@ -3013,6 +3121,13 @@ /* Used by distribution_SUITE (emulator) */ BIF_RET(make_small((Uint) erts_debug_max_atom_out_cache_index())); } + else if (ERTS_IS_ATOM_STR("nbalance", BIF_ARG_1)) { + Uint n; + erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); + n = erts_debug_nbalance(); + erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); + BIF_RET(erts_make_integer(n, BIF_P)); + } else if (ERTS_IS_ATOM_STR("available_internal_state", BIF_ARG_1)) { BIF_RET(am_true); } @@ -3250,14 +3365,29 @@ BIF_RET(am_true); } } - else if (ERTS_IS_ATOM_STR("block", BIF_ARG_1)) { + else if (ERTS_IS_ATOM_STR("block", BIF_ARG_1) + || ERTS_IS_ATOM_STR("sleep", BIF_ARG_1)) { + int block = ERTS_IS_ATOM_STR("block", BIF_ARG_1); + Sint ms; + if (term_to_Sint(BIF_ARG_2, &ms) != 0) { + if (ms > 0) { + erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); + if (block) + erts_smp_block_system(0); + while (erts_milli_sleep((long) ms) != 0); + if (block) + erts_smp_release_system(); + erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); + } + BIF_RET(am_true); + } + } + else if (ERTS_IS_ATOM_STR("block_scheduler", BIF_ARG_1)) { Sint ms; if (term_to_Sint(BIF_ARG_2, &ms) != 0) { if (ms > 0) { erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); - erts_smp_block_system(0); while (erts_milli_sleep((long) ms) != 0); - erts_smp_release_system(); erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); } BIF_RET(am_true); @@ -3289,7 +3419,7 @@ BIF_RET(am_false); } else { - MSO(rp).overhead += HEAP_SIZE(rp); /* Force GC */ + FLAGS(rp) |= F_FORCE_GC; if (BIF_P != rp) erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_MAIN); BIF_RET(am_true); @@ -3430,15 +3560,30 @@ BIF_RET(am_true); } } - else if (ERTS_IS_ATOM_STR("processor_node_topology", BIF_ARG_1)) { - if (BIF_ARG_2 == am_true) { - erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); - erts_smp_block_system(0); - erts_init_enable_processor_node_topology(); - erts_smp_release_system(); - erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); - BIF_RET(am_true); + else if (ERTS_IS_ATOM_STR("not_running_optimization", BIF_ARG_1)) { +#ifdef ERTS_SMP + int old_use_opt, use_opt; + switch (BIF_ARG_2) { + case am_true: + use_opt = 1; + break; + case am_false: + use_opt = 0; + break; + default: + BIF_ERROR(BIF_P, BADARG); } + + erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); + erts_smp_block_system(0); + old_use_opt = !erts_disable_proc_not_running_opt; + erts_disable_proc_not_running_opt = !use_opt; + erts_smp_release_system(); + erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); + BIF_RET(old_use_opt ? am_true : am_false); +#else + BIF_ERROR(BIF_P, EXC_NOTSUP); +#endif } } diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_bif_port.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_bif_port.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_bif_port.c 2009-06-05 13:53:24.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_bif_port.c 2009-11-20 13:31:26.000000000 +0000 @@ -118,7 +118,14 @@ return port; } -BIF_RETTYPE port_command_2(BIF_ALIST_2) +#define ERTS_PORT_COMMAND_FLAG_FORCE (((Uint32) 1) << 0) +#define ERTS_PORT_COMMAND_FLAG_NOSUSPEND (((Uint32) 1) << 1) + +static BIF_RETTYPE do_port_command(Process *BIF_P, + Eterm BIF_ARG_1, + Eterm BIF_ARG_2, + Eterm BIF_ARG_3, + Uint32 flags) { BIF_RETTYPE res; Port *p; @@ -154,13 +161,23 @@ ERTS_BIF_PREP_RET(res, am_true); - if (p->status & ERTS_PORT_SFLG_PORT_BUSY) { - erts_suspend(BIF_P, ERTS_PROC_LOCK_MAIN, p); - if (erts_system_monitor_flags.busy_port) { - monitor_generic(BIF_P, am_busy_port, p->id); + if ((flags & ERTS_PORT_COMMAND_FLAG_FORCE) + && !(p->drv_ptr->flags & ERL_DRV_FLAG_SOFT_BUSY)) { + ERTS_BIF_PREP_ERROR(res, BIF_P, EXC_NOTSUP); + } + else if (!(flags & ERTS_PORT_COMMAND_FLAG_FORCE) + && p->status & ERTS_PORT_SFLG_PORT_BUSY) { + if (flags & ERTS_PORT_COMMAND_FLAG_NOSUSPEND) { + ERTS_BIF_PREP_RET(res, am_false); + } + else { + erts_suspend(BIF_P, ERTS_PROC_LOCK_MAIN, p); + if (erts_system_monitor_flags.busy_port) { + monitor_generic(BIF_P, am_busy_port, p->id); + } + ERTS_BIF_PREP_YIELD3(res, bif_export[BIF_port_command_3], BIF_P, + BIF_ARG_1, BIF_ARG_2, BIF_ARG_3); } - ERTS_BIF_PREP_YIELD2(res, bif_export[BIF_port_command_2], BIF_P, - BIF_ARG_1, BIF_ARG_2); } else { int wres; erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); @@ -195,6 +212,33 @@ return res; } +BIF_RETTYPE port_command_2(BIF_ALIST_2) +{ + return do_port_command(BIF_P, BIF_ARG_1, BIF_ARG_2, NIL, 0); +} + +BIF_RETTYPE port_command_3(BIF_ALIST_3) +{ + Eterm l = BIF_ARG_3; + Uint32 flags = 0; + while (is_list(l)) { + Eterm* cons = list_val(l); + Eterm car = CAR(cons); + if (car == am_force) { + flags |= ERTS_PORT_COMMAND_FLAG_FORCE; + } else if (car == am_nosuspend) { + flags |= ERTS_PORT_COMMAND_FLAG_NOSUSPEND; + } else { + BIF_ERROR(BIF_P, BADARG); + } + l = CDR(cons); + } + if(!is_nil(l)) { + BIF_ERROR(BIF_P, BADARG); + } + return do_port_command(BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3, flags); +} + BIF_RETTYPE port_call_2(BIF_ALIST_2) { return port_call_3(BIF_P,BIF_ARG_1,make_small(0),BIF_ARG_2); @@ -581,6 +625,7 @@ opts.wd = NULL; opts.envir = NULL; opts.exit_status = 0; + opts.overlapped_io = 0; opts.spawn_type = ERTS_SPAWN_ANY; opts.argv = NULL; binary_io = 0; @@ -709,6 +754,8 @@ opts.hide_window = 1; } else if (*nargs == am_exit_status) { opts.exit_status = 1; + } else if (*nargs == am_overlapped_io) { + opts.overlapped_io = 1; } else { goto badarg; } diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_bits.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_bits.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_bits.c 2009-04-16 10:23:58.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_bits.c 2009-11-20 16:54:18.000000000 +0000 @@ -427,13 +427,9 @@ ErlSubBin* sb; size_t num_bytes; /* Number of bytes in binary. */ - if (num_bits == 0) { /* Empty binary. */ - return new_binary(p, NULL, 0); - } if (mb->size - mb->offset < num_bits) { /* Asked for too many bits. */ return THE_NON_VALUE; } - /* * From now on, we can't fail. @@ -1344,7 +1340,7 @@ pb->val = bptr; pb->bytes = (byte*) bptr->orig_bytes; pb->flags = PB_IS_WRITABLE | PB_ACTIVE_WRITER; - MSO(c_p).overhead += pb->size / BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + MSO(c_p).overhead += pb->size / sizeof(Eterm); /* * Now allocate the sub binary and set its size to include the @@ -1414,7 +1410,6 @@ pb = (ProcBin *) boxed_val(sb->orig); ASSERT(pb->thing_word == HEADER_PROC_BIN); - ASSERT(pb->flags & PB_IS_WRITABLE); /* * Calculate new size in bytes. @@ -1430,10 +1425,38 @@ binp = pb->val; if (binp->orig_size < pb->size) { Uint new_size = 2*pb->size; - binp = erts_bin_realloc(binp, new_size); - binp->orig_size = new_size; - pb->val = binp; - pb->bytes = (byte *) binp->orig_bytes; + + if (pb->flags & PB_IS_WRITABLE) { + /* + * This is the normal case - the binary is writable. + * There are no other references to the binary, so it + * is safe to reallocate it. + */ + binp = erts_bin_realloc(binp, new_size); + binp->orig_size = new_size; + pb->val = binp; + pb->bytes = (byte *) binp->orig_bytes; + } else { + /* + * The binary is NOT writable. The only way that is + * supposed to happen if is call trace has been turned + * on. That means that a trace process now has (or have + * had) a reference to the binary, so we are not allowed + * to reallocate the binary. Instead, we must allocate a new + * binary and copy the contents of the old binary into it. + */ + Binary* bptr = erts_bin_nrml_alloc(new_size); + bptr->flags = 0; + bptr->orig_size = new_size; + erts_refc_init(&bptr->refc, 1); + sys_memcpy(bptr->orig_bytes, binp->orig_bytes, pb->size); + pb->flags |= PB_IS_WRITABLE | PB_ACTIVE_WRITER; + pb->val = bptr; + pb->bytes = (byte *) bptr->orig_bytes; + if (erts_refc_dectest(&binp->refc, 0) == 0) { + erts_bin_free(binp); + } + } } erts_current_bin = pb->bytes; @@ -1488,7 +1511,7 @@ pb->val = bptr; pb->bytes = (byte*) bptr->orig_bytes; pb->flags = PB_IS_WRITABLE | PB_ACTIVE_WRITER; - MSO(p).overhead += pb->size / BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + MSO(p).overhead += pb->size / sizeof(Eterm); /* * Now allocate the sub binary. diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_db.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_db.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_db.c 2009-06-05 13:52:49.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_db.c 2009-09-18 15:06:51.000000000 +0100 @@ -186,7 +186,7 @@ */ static void fix_table_locked(Process* p, DbTable* tb); -static void unfix_table_locked(Process* p, DbTable* tb); +static void unfix_table_locked(Process* p, DbTable* tb, db_lock_kind_t* kind); static void set_heir(Process* me, DbTable* tb, Eterm heir, Eterm heir_data); static void free_heir_data(DbTable*); static void free_fixations_locked(DbTable *tb); @@ -579,7 +579,7 @@ } else if (BIF_ARG_2 == am_false) { if (IS_FIXED(tb)) { - unfix_table_locked(BIF_P, tb); + unfix_table_locked(BIF_P, tb, &kind); } } else { @@ -1628,38 +1628,62 @@ DbTable* tb = NULL; Eterm* tp; Eterm opt; - Eterm heir_data; + Eterm heir = THE_NON_VALUE; + Eterm heir_data = THE_NON_VALUE; + Uint32 protection = 0; + Eterm fakelist[2]; + Eterm tail; + + for (tail = is_tuple(BIF_ARG_2) ? CONS(fakelist, BIF_ARG_2, NIL) : BIF_ARG_2; + is_list(tail); + tail = CDR(list_val(tail))) { - if (is_list(BIF_ARG_2)) { - if (CDR(list_val(BIF_ARG_2)) != NIL) { + opt = CAR(list_val(tail)); + if (!is_tuple(opt) || (tp = tuple_val(opt), arityval(tp[0]) < 2)) { goto badarg; } - opt = CAR(list_val(BIF_ARG_2)); - } else { - opt = BIF_ARG_2; - } - if (!is_tuple(opt)) { - goto badarg; - } - tp = tuple_val(opt); + switch (tp[1]) { + case am_heir: + if (heir != THE_NON_VALUE) goto badarg; + heir = tp[2]; + if (arityval(tp[0]) == 2 && heir == am_none) { + heir_data = am_undefined; + } + else if (arityval(tp[0]) == 3 && is_internal_pid(heir)) { + heir_data = tp[3]; + } + else goto badarg; + break; + case am_protection: + if (arityval(tp[0]) != 2 || protection != 0) goto badarg; + switch (tp[2]) { + case am_private: protection = DB_PRIVATE; break; + case am_protected: protection = DB_PROTECTED; break; + case am_public: protection = DB_PUBLIC; break; + default: goto badarg; + } + break; - if (arityval(tp[0]) == 3 && tp[1] == am_heir && is_internal_pid(tp[2])) { - heir_data = tp[3]; - } - else if (arityval(tp[0]) == 2 && tp[1] == am_heir && tp[2] == am_none) { - heir_data = am_undefined; + default: goto badarg; + } } - else goto badarg; - if ((tb = db_get_table(BIF_P, BIF_ARG_1, DB_WRITE, LCK_WRITE)) == NULL + if (tail != NIL + || (tb = db_get_table(BIF_P, BIF_ARG_1, DB_WRITE, LCK_WRITE)) == NULL || tb->common.owner != BIF_P->id) { goto badarg; } - free_heir_data(tb); - set_heir(BIF_P, tb, tp[2], heir_data); + if (heir_data != THE_NON_VALUE) { + free_heir_data(tb); + set_heir(BIF_P, tb, heir, heir_data); + } + if (protection) { + tb->common.status &= ~(DB_PRIVATE|DB_PROTECTED|DB_PUBLIC); + tb->common.status |= protection; + } db_unlock (tb,LCK_WRITE); BIF_RET(am_true); @@ -1765,23 +1789,24 @@ int cret; Eterm ret; Eterm *tptr; + db_lock_kind_t kind = LCK_WRITE_REC; CHECK_TABLES(); ASSERT(is_tuple(a1)); tptr = tuple_val(a1); ASSERT(arityval(*tptr) >= 1); - if ((tb = db_get_table(p, tptr[1], DB_WRITE, LCK_WRITE_REC)) == NULL) { + if ((tb = db_get_table(p, tptr[1], DB_WRITE, kind)) == NULL) { BIF_ERROR(p,BADARG); } cret = tb->common.meth->db_select_delete_continue(p,tb,a1,&ret); if(!DID_TRAP(p,ret) && ITERATION_SAFETY(p,tb) != ITER_SAFE) { - unfix_table_locked(p, tb); + unfix_table_locked(p, tb, &kind); } - db_unlock(tb, LCK_WRITE_REC); + db_unlock(tb, kind); switch (cret) { case DB_ERROR_NONE: @@ -2015,13 +2040,14 @@ int cret; Eterm ret; Eterm *tptr; + db_lock_kind_t kind = LCK_READ; CHECK_TABLES(); tptr = tuple_val(a1); ASSERT(arityval(*tptr) >= 1) - if ((tb = db_get_table(p, tptr[1], DB_READ, LCK_READ)) == NULL) { + if ((tb = db_get_table(p, tptr[1], DB_READ, kind)) == NULL) { BIF_ERROR(p, BADARG); } @@ -2029,9 +2055,9 @@ &ret); if (!DID_TRAP(p,ret) && ITERATION_SAFETY(p,tb) != ITER_SAFE) { - unfix_table_locked(p, tb); + unfix_table_locked(p, tb, &kind); } - db_unlock(tb, LCK_READ); + db_unlock(tb, kind); switch (cret) { case DB_ERROR_NONE: @@ -2169,21 +2195,22 @@ int cret; Eterm ret; Eterm *tptr; + db_lock_kind_t kind = LCK_READ; CHECK_TABLES(); tptr = tuple_val(a1); ASSERT(arityval(*tptr) >= 1) - if ((tb = db_get_table(p, tptr[1], DB_READ, LCK_READ)) == NULL) { + if ((tb = db_get_table(p, tptr[1], DB_READ, kind)) == NULL) { BIF_ERROR(p, BADARG); } cret = tb->common.meth->db_select_count_continue(p, tb, a1, &ret); if (!DID_TRAP(p,ret) && ITERATION_SAFETY(p,tb) != ITER_SAFE) { - unfix_table_locked(p, tb); + unfix_table_locked(p, tb, &kind); } - db_unlock(tb, LCK_READ); + db_unlock(tb, kind); switch (cret) { case DB_ERROR_NONE: @@ -3174,9 +3201,10 @@ db_meta_unlock(meta_pid_to_fixed_tab, LCK_WRITE_REC); } -/* SMP note: hash table need to be at least LCK_WRITE_REC locked - tree need only to be LCK_READ */ -static void unfix_table_locked(Process* p, DbTable* tb) +/* SMP note: May re-lock table +*/ +static void unfix_table_locked(Process* p, DbTable* tb, + db_lock_kind_t* kind_p) { DbFixation** pp; @@ -3211,7 +3239,17 @@ #endif unlocked: - if (!IS_FIXED(tb) && IS_HASH_TABLE(tb->common.status)) { + if (!IS_FIXED(tb) && IS_HASH_TABLE(tb->common.status) + && erts_smp_atomic_read(&tb->hash.fixdel) != (long)NULL) { +#ifdef ERTS_SMP + if (*kind_p == LCK_READ && tb->common.is_thread_safe) { + /* Must have write lock while purging pseudo-deleted (OTP-8166) */ + erts_smp_rwmtx_runlock(&tb->common.rwlock); + erts_smp_rwmtx_rwlock(&tb->common.rwlock); + *kind_p = LCK_WRITE; + if (tb->common.status & DB_DELETE) return; + } +#endif db_unfix_table_hash(&(tb->hash)); } } @@ -3442,10 +3480,37 @@ #ifdef ERTS_SMP erts_smp_mtx_unlock(&tb->common.fixlock); #endif - } else if (What == am_atom_put("buckets",7)) { - ret = make_small(erts_smp_atomic_read(IS_HASH_TABLE(tb->common.status) - ? &tb->hash.nactive - : &tb->common.nitems)); + } else if (What == am_atom_put("stats",5)) { + if (IS_HASH_TABLE(tb->common.status)) { + FloatDef f; + DbHashStats stats; + Eterm avg, std_dev_real, std_dev_exp; + Eterm* hp; + + db_calc_stats_hash(&tb->hash, &stats); + hp = HAlloc(p, 1 + 6 + FLOAT_SIZE_OBJECT*3); + f.fd = stats.avg_chain_len; + avg = make_float(hp); + PUT_DOUBLE(f, hp); + hp += FLOAT_SIZE_OBJECT; + + f.fd = stats.std_dev_chain_len; + std_dev_real = make_float(hp); + PUT_DOUBLE(f, hp); + hp += FLOAT_SIZE_OBJECT; + + f.fd = stats.std_dev_expected; + std_dev_exp = make_float(hp); + PUT_DOUBLE(f, hp); + hp += FLOAT_SIZE_OBJECT; + ret = TUPLE6(hp, make_small(erts_smp_atomic_read(&tb->hash.nactive)), + avg, std_dev_real, std_dev_exp, + make_small(stats.min_chain_len), + make_small(stats.max_chain_len)); + } + else { + ret = am_false; + } } return ret; } diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_db_hash.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_db_hash.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_db_hash.c 2009-06-05 13:53:14.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_db_hash.c 2009-11-20 13:30:47.000000000 +0000 @@ -101,7 +101,7 @@ #define SEGSZ (1 << SEGSZ_EXP) #define SEGSZ_MASK (SEGSZ-1) -#define NSEG_1 1 /* Size of first segment table */ +#define NSEG_1 2 /* Size of first segment table (must be at least 2) */ #define NSEG_2 256 /* Size of second segment table */ #define NSEG_INC 128 /* Number of segments to grow after that */ @@ -304,16 +304,52 @@ }; /* A segment that also contains a segment table */ -struct ext_segment { +struct ext_segment { struct segment s; /* The segment itself. Must be first */ - - struct segment** last_segtab; /* Used if table is shrinking */ - struct segment* segtab[1]; /* The segment table (may be larger) */ + + struct segment** prev_segtab; /* Used when table is shrinking */ + int nsegs; /* Size of segtab */ + struct segment* segtab[1]; /* The segment table */ }; +#define SIZEOF_EXTSEG(NSEGS) \ + (sizeof(struct ext_segment) - sizeof(struct segment*) + sizeof(struct segment*)*(NSEGS)) + +#ifdef DEBUG +# include /* offsetof */ +# define EXTSEG(SEGTAB_PTR) \ + ((struct ext_segment*) (((char*)(SEGTAB_PTR)) - offsetof(struct ext_segment,segtab))) +#endif + + +/* How the table segments relate to each other: + + ext_segment: ext_segment: "plain" segment + #=================# #================# #=============# + | bucket[0] |<--+ +------->| bucket[256] | +->| bucket[512] | + | bucket[1] | | | | [257] | | | [513] | + : : | | : : | : : + | bucket[255] | | | | [511] | | | [767] | + |-----------------| | | |----------------| | #=============# + | prev_segtab=NULL| | | +--<---prev_segtab | | + | nsegs = 2 | | | | | nsegs = 256 | | ++->| segtab[0] -->-------+---|---|--<---segtab[0] |<-+ | +| | segtab[1] -->-----------+---|--<---segtab[1] | | | +| #=================# | | segtab[2] -->-----|--+ ext_segment: +| | : : | #================# ++----------------<---------------+ | segtab[255] ->----|----->| bucket[255*256]| + #================# | | | + | : : + | |----------------| + +----<---prev_segtab | + : : +*/ + /* ** Forward decl's (static functions) */ +static struct ext_segment* alloc_ext_seg(DbTableHash* tb, unsigned seg_ix, + struct segment** old_segtab); static int alloc_seg(DbTableHash *tb); static int free_seg(DbTableHash *tb, int free_records); static HashDbTerm* next(DbTableHash *tb, Uint *iptr, erts_smp_rwmtx_t** lck_ptr, @@ -505,6 +541,10 @@ void db_unfix_table_hash(DbTableHash *tb) { FixedDeletion* fixdel; + + ERTS_SMP_LC_ASSERT(erts_smp_lc_rwmtx_is_rwlocked(&tb->common.rwlock) + || (erts_smp_lc_rwmtx_is_rlocked(&tb->common.rwlock) + && !tb->common.is_thread_safe)); restart: fixdel = (FixedDeletion*) erts_smp_atomic_xchg(&tb->fixdel, (long)NULL); while (fixdel != NULL) { @@ -572,13 +612,13 @@ int db_create_hash(Process *p, DbTable *tbl) { DbTableHash *tb = &tbl->hash; + erts_smp_atomic_init(&tb->szm, SEGSZ_MASK); erts_smp_atomic_init(&tb->nactive, SEGSZ); erts_smp_atomic_init(&tb->fixdel, (long)NULL); - erts_smp_atomic_init(&tb->segtab, (long)NULL); - tb->nsegs = 0; - tb->nslots = 0; - alloc_seg(tb); + erts_smp_atomic_init(&tb->segtab, (long) alloc_ext_seg(tb,0,NULL)->segtab); + tb->nsegs = NSEG_1; + tb->nslots = SEGSZ; erts_smp_atomic_init(&tb->is_resizing, 0); #ifdef ERTS_SMP @@ -1352,7 +1392,6 @@ DbTableHash *tb = &tbl->hash; struct mp_info mpi; Sint slot_ix; - Sint save_slot_ix; HashDbTerm *current = 0; unsigned current_list_pos = 0; Eterm match_list; @@ -1423,73 +1462,63 @@ match_list = NIL; for(;;) { - if (current->hvalue != INVALID_HASH && - (match_res = - db_prog_match(p,mpi.mp, - make_tuple(current->dbterm.tpl), - 0,&dummy), - is_value(match_res))) { - if (mpi.all_objects) { - hp = HAlloc(p, current->dbterm.size + 2); - match_res = copy_shallow(DBTERM_BUF(¤t->dbterm), - current->dbterm.size, - &hp, - &MSO(p)); - } else { - sz = size_object(match_res); - - hp = HAlloc(p, sz + 2); - match_res = copy_struct(match_res, sz, &hp, &MSO(p)); - } - match_list = CONS(hp, match_res, match_list); - ++got; - } - - if (mpi.key_given) { /* Key is bound */ - current = current->next; - for (;;) { - while (current != NULL && - current->hvalue == INVALID_HASH) - current = current->next; - if (current == NULL) { - RUNLOCK_HASH(lck); - if (current_list_pos == mpi.num_lists) { - slot_ix = -1; /* EOT */ - goto done; + if (current != NULL) { + if (current->hvalue != INVALID_HASH) { + match_res = db_prog_match(p,mpi.mp, + make_tuple(current->dbterm.tpl), + 0,&dummy); + if (is_value(match_res)) { + if (mpi.all_objects) { + hp = HAlloc(p, current->dbterm.size + 2); + match_res = copy_shallow(DBTERM_BUF(¤t->dbterm), + current->dbterm.size, + &hp, + &MSO(p)); } else { - slot_ix = mpi.lists[current_list_pos].ix; - lck = RLOCK_HASH(tb, slot_ix); - current = *(mpi.lists[current_list_pos].bucket); - ASSERT(mpi.lists[current_list_pos].bucket == &BUCKET(tb,slot_ix)); - ++current_list_pos; + sz = size_object(match_res); + + hp = HAlloc(p, sz + 2); + match_res = copy_struct(match_res, sz, &hp, &MSO(p)); } - } else { - break; + match_list = CONS(hp, match_res, match_list); + ++got; } } - } - else { /* Key is variable */ + current = current->next; + } + else if (mpi.key_given) { /* Key is bound */ + RUNLOCK_HASH(lck); + if (current_list_pos == mpi.num_lists) { + slot_ix = -1; /* EOT */ + goto done; + } else { + slot_ix = mpi.lists[current_list_pos].ix; + lck = RLOCK_HASH(tb, slot_ix); + current = *(mpi.lists[current_list_pos].bucket); + ASSERT(mpi.lists[current_list_pos].bucket == &BUCKET(tb,slot_ix)); + ++current_list_pos; + } + } + else { /* Key is variable */ --num_left; - save_slot_ix = slot_ix; - if ((current = - next(tb, (Uint*)&slot_ix, &lck, current)) == NULL) { + + if ((slot_ix=next_slot(tb,slot_ix,&lck)) == 0) { slot_ix = -1; break; } - if (slot_ix != save_slot_ix) { - if (chunk_size && got >= chunk_size) { - RUNLOCK_HASH(lck); - break; - } - if (num_left <= 0 || MBUF(p)) { - /* - * We have either reached our limit, or just created some heap fragments. - * Since many heap fragments will make the GC slower, trap and GC now. - */ - RUNLOCK_HASH(lck); - goto trap; - } + if (chunk_size && got >= chunk_size) { + RUNLOCK_HASH(lck); + break; + } + if (num_left <= 0 || MBUF(p)) { + /* + * We have either reached our limit, or just created some heap fragments. + * Since many heap fragments will make the GC slower, trap and GC now. + */ + RUNLOCK_HASH(lck); + goto trap; } + current = BUCKET(tb,slot_ix); } } done: @@ -1614,15 +1643,13 @@ for(;;) { if (current != NULL) { - if (current->hvalue == INVALID_HASH) { - current = current->next; - continue; - } - if (db_prog_match(p, mpi.mp, make_tuple(current->dbterm.tpl), - 0, &dummy) == am_true) { - ++got; + if (current->hvalue != INVALID_HASH) { + if (db_prog_match(p, mpi.mp, make_tuple(current->dbterm.tpl), + 0, &dummy) == am_true) { + ++got; + } + --num_left; } - --num_left; current = current->next; } else { /* next bucket */ @@ -2280,49 +2307,66 @@ return DB_ERROR_NONE; } -/* Extend (or initialize) table with one new segment +static struct ext_segment* alloc_ext_seg(DbTableHash* tb, unsigned seg_ix, + struct segment** old_segtab) +{ + int nsegs; + struct ext_segment* eseg; + + switch (seg_ix) { + case 0: nsegs = NSEG_1; break; + case 1: nsegs = NSEG_2; break; + default: nsegs = seg_ix + NSEG_INC; break; + } + eseg = (struct ext_segment*) erts_db_alloc_fnf(ERTS_ALC_T_DB_SEG, + (DbTable *) tb, + SIZEOF_EXTSEG(nsegs)); + ASSERT(eseg != NULL); + sys_memset(&eseg->s, 0, sizeof(struct segment)); + IF_DEBUG(eseg->s.is_ext_segment = 1); + eseg->prev_segtab = old_segtab; + eseg->nsegs = nsegs; + if (old_segtab) { + ASSERT(nsegs > tb->nsegs); + sys_memcpy(eseg->segtab, old_segtab, tb->nsegs*sizeof(struct segment*)); + } +#ifdef DEBUG + sys_memset(&eseg->segtab[seg_ix], 0, (nsegs-seg_ix)*sizeof(struct segment*)); +#endif + eseg->segtab[seg_ix] = &eseg->s; + return eseg; +} + +/* Extend table with one new segment */ static int alloc_seg(DbTableHash *tb) { - int six = tb->nslots >> SEGSZ_EXP; + int seg_ix = tb->nslots >> SEGSZ_EXP; - if (six == tb->nsegs) { /* New extended segment */ - int nsegs; - int bytes; - struct ext_segment* eseg; - struct segment** old_segtab = SEGTAB(tb); - - switch (six) { - case 0: nsegs = NSEG_1; break; - case 1: nsegs = NSEG_2; break; - default: nsegs = six + NSEG_INC; break; - } - - bytes = sizeof(struct ext_segment) + sizeof(struct segment*) * (nsegs-1); - eseg = (struct ext_segment*) erts_db_alloc_fnf(ERTS_ALC_T_DB_SEG, - (DbTable *) tb, bytes); - if (eseg == NULL) return 0; - - memset(&eseg->s, 0, sizeof(struct segment)); - IF_DEBUG(eseg->s.is_ext_segment = 1); - eseg->last_segtab = old_segtab; - if (old_segtab) { - ASSERT(nsegs > tb->nsegs); - memcpy(eseg->segtab, old_segtab, tb->nsegs*sizeof(struct segment*)); - memset(&eseg->segtab[six], 0, (nsegs-six)*sizeof(struct segment*)); - } - eseg->segtab[six] = &eseg->s; - erts_smp_atomic_set(&tb->segtab, (long) eseg->segtab); - tb->nsegs = nsegs; + if (seg_ix+1 == tb->nsegs) { /* New segtab needed (extended segment) */ + struct segment** segtab = SEGTAB(tb); + struct ext_segment* seg = alloc_ext_seg(tb, seg_ix, segtab); + if (seg == NULL) return 0; + segtab[seg_ix] = &seg->s; + /* We don't use the new segtab until next call (see "shrink race") */ } else { /* Just a new plain segment */ - struct segment** segtab = SEGTAB(tb); - ASSERT(six < tb->nsegs); - segtab[six] = (struct segment*) erts_db_alloc_fnf(ERTS_ALC_T_DB_SEG, - (DbTable *) tb, - sizeof(struct segment)); - if (segtab[six] == NULL) return 0; - memset(segtab[six], 0, sizeof(struct segment)); + struct segment** segtab; + if (seg_ix == tb->nsegs) { /* Time to start use segtab from last call */ + struct ext_segment* eseg; + eseg = (struct ext_segment*) SEGTAB(tb)[seg_ix-1]; + MY_ASSERT(eseg!=NULL && eseg->s.is_ext_segment); + erts_smp_atomic_set(&tb->segtab, (long) eseg->segtab); + tb->nsegs = eseg->nsegs; + } + ASSERT(seg_ix < tb->nsegs); + segtab = SEGTAB(tb); + ASSERT(segtab[seg_ix] == NULL); + segtab[seg_ix] = (struct segment*) erts_db_alloc_fnf(ERTS_ALC_T_DB_SEG, + (DbTable *) tb, + sizeof(struct segment)); + if (segtab[seg_ix] == NULL) return 0; + sys_memset(segtab[seg_ix], 0, sizeof(struct segment)); } tb->nslots += SEGSZ; return 1; @@ -2333,12 +2377,13 @@ */ static int free_seg(DbTableHash *tb, int free_records) { - int six = (tb->nslots >> SEGSZ_EXP) - 1; + int seg_ix = (tb->nslots >> SEGSZ_EXP) - 1; int bytes; struct segment** segtab = SEGTAB(tb); - struct ext_segment* top = (struct ext_segment*) segtab[six]; + struct ext_segment* top = (struct ext_segment*) segtab[seg_ix]; int nrecords = 0; + ASSERT(top != NULL); #ifndef DEBUG if (free_records) #endif @@ -2355,21 +2400,54 @@ } } } - if (segtab == top->segtab) { /* Extended segment */ - MY_ASSERT(top->s.is_ext_segment); - erts_smp_atomic_set(&tb->segtab, (long)top->last_segtab); - bytes = sizeof(struct ext_segment) + sizeof(struct segment*) * (tb->nsegs-1); - tb->nsegs = six; + + /* The "shrink race": + * We must avoid deallocating an extended segment while its segtab may + * still be used by other threads. + * The trick is to stop use a segtab one call earlier. That is, stop use + * a segtab when the segment above it is deallocated. When the segtab is + * later deallocated, it has not been used for a very long time. + * It is even theoretically safe as we have by then rehashed the entire + * segment, seizing *all* locks, so there cannot exist any retarded threads + * still hanging in BUCKET macro with an old segtab pointer. + * For this to work, we must of course allocate a new segtab one call + * earlier in alloc_seg() as well. And this is also the reason why + * the minimum size of the first segtab is 2 and not 1 (NSEG_1). + */ + + if (seg_ix == tb->nsegs-1 || seg_ix==0) { /* Dealloc extended segment */ + MY_ASSERT(top->s.is_ext_segment); + ASSERT(segtab != top->segtab || seg_ix==0); + bytes = SIZEOF_EXTSEG(top->nsegs); } - else { /* Plain segment */ + else { /* Dealloc plain segment */ + struct ext_segment* newtop = (struct ext_segment*) segtab[seg_ix-1]; MY_ASSERT(!top->s.is_ext_segment); - segtab[six] = NULL; + + if (segtab == newtop->segtab) { /* New top segment is extended */ + MY_ASSERT(newtop->s.is_ext_segment); + if (newtop->prev_segtab != NULL) { + /* Time to use a smaller segtab */ + erts_smp_atomic_set(&tb->segtab, (long)newtop->prev_segtab); + tb->nsegs = seg_ix; + ASSERT(tb->nsegs == EXTSEG(SEGTAB(tb))->nsegs); + } + else { + ASSERT(NSEG_1 > 2 && seg_ix==1); + } + } bytes = sizeof(struct segment); } erts_db_free(ERTS_ALC_T_DB_SEG, (DbTable *)tb, (void*)top, bytes); - +#ifdef DEBUG + if (seg_ix > 0) { + if (seg_ix < tb->nsegs) SEGTAB(tb)[seg_ix] = NULL; + } else { + erts_smp_atomic_set(&tb->segtab, (long)NULL); + } +#endif tb->nslots -= SEGSZ; ASSERT(tb->nslots >= 0); return nrecords; @@ -2672,7 +2750,7 @@ DbTerm* newDbTerm; HashDbTerm* newp = erts_db_alloc(ERTS_ALC_T_DB_TERM, tbl, sizeof(HashDbTerm)+sizeof(Eterm)*(handle->new_size-1)); - memcpy(newp, oldp, sizeof(HashDbTerm)-sizeof(DbTerm)); /* copy only hashtab header */ + sys_memcpy(newp, oldp, sizeof(HashDbTerm)-sizeof(DbTerm)); /* copy only hashtab header */ *(handle->bp) = newp; newDbTerm = &newp->dbterm; @@ -2737,6 +2815,36 @@ } } +void db_calc_stats_hash(DbTableHash* tb, DbHashStats* stats) +{ + HashDbTerm* b; + erts_smp_rwmtx_t* lck; + int sum = 0; + int sq_sum = 0; + int ix; + int len; + + stats->min_chain_len = INT_MAX; + stats->max_chain_len = 0; + ix = 0; + lck = RLOCK_HASH(tb,ix); + do { + len = 0; + for (b = BUCKET(tb,ix); b!=NULL; b=b->next) { + len++; + } + sum += len; + sq_sum += len*len; + if (len < stats->min_chain_len) stats->min_chain_len = len; + if (len > stats->max_chain_len) stats->max_chain_len = len; + ix = next_slot(tb,ix,&lck); + }while (ix); + stats->avg_chain_len = (float)sum / NACTIVE(tb); + stats->std_dev_chain_len = sqrt((sq_sum - stats->avg_chain_len*sum) / NACTIVE(tb)); + /* Expected standard deviation from a good uniform hash function, + ie binomial distribution (not taking the linear hashing into acount) */ + stats->std_dev_expected = sqrt(stats->avg_chain_len * (1 - 1.0/NACTIVE(tb))); +} #ifdef HARDDEBUG void db_check_table_hash(DbTable *tbl) diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_db_hash.h erlang-13.b.3-dfsg/erts/emulator/beam/erl_db_hash.h --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_db_hash.h 2009-06-05 13:53:15.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_db_hash.h 2009-09-18 15:07:59.000000000 +0100 @@ -90,5 +90,14 @@ /* not yet in method table */ int db_mark_all_deleted_hash(DbTable *tbl); +typedef struct { + float avg_chain_len; + float std_dev_chain_len; + float std_dev_expected; + int max_chain_len; + int min_chain_len; +}DbHashStats; + +void db_calc_stats_hash(DbTableHash* tb, DbHashStats*); #endif /* _DB_HASH_H */ diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_db_util.h erlang-13.b.3-dfsg/erts/emulator/beam/erl_db_util.h --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_db_util.h 2009-06-05 13:53:14.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_db_util.h 2009-09-18 15:07:58.000000000 +0100 @@ -208,7 +208,7 @@ erts_smp_rwmtx_t rwlock; /* rw lock on table */ erts_smp_mtx_t fixlock; /* Protects fixations,megasec,sec,microsec */ int is_thread_safe; /* No fine locking inside table needed */ - Uint32 type; /* hash or tree, private or not; *read only* after creation */ + Uint32 type; /* table type, *read only* after creation */ #endif Eterm owner; /* Pid of the creator */ Eterm heir; /* Pid of the heir */ @@ -241,7 +241,7 @@ #define DB_ORDERED_SET (1 << 9) #define DB_DELETE (1 << 10) /* table is being deleted */ -#define ERTS_ETS_TABLE_TYPES (DB_BAG|DB_SET|DB_DUPLICATE_BAG|DB_ORDERED_SET|DB_PRIVATE|DB_FINE_LOCKED) +#define ERTS_ETS_TABLE_TYPES (DB_BAG|DB_SET|DB_DUPLICATE_BAG|DB_ORDERED_SET|DB_FINE_LOCKED) #define IS_HASH_TABLE(Status) (!!((Status) & \ (DB_BAG | DB_SET | DB_DUPLICATE_BAG))) diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_driver.h erlang-13.b.3-dfsg/erts/emulator/beam/erl_driver.h --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_driver.h 2009-03-12 12:15:42.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_driver.h 2009-11-20 13:30:58.000000000 +0000 @@ -28,6 +28,43 @@ # include "config.h" #endif +#ifdef SIZEOF_CHAR +# define SIZEOF_CHAR_SAVED__ SIZEOF_CHAR +# undef SIZEOF_CHAR +#endif +#ifdef SIZEOF_SHORT +# define SIZEOF_SHORT_SAVED__ SIZEOF_SHORT +# undef SIZEOF_SHORT +#endif +#ifdef SIZEOF_INT +# define SIZEOF_INT_SAVED__ SIZEOF_INT +# undef SIZEOF_INT +#endif +#ifdef SIZEOF_LONG +# define SIZEOF_LONG_SAVED__ SIZEOF_LONG +# undef SIZEOF_LONG +#endif +#ifdef SIZEOF_LONG_LONG +# define SIZEOF_LONG_LONG_SAVED__ SIZEOF_LONG_LONG +# undef SIZEOF_LONG_LONG +#endif +#include "erl_int_sizes_config.h" +#if defined(SIZEOF_CHAR_SAVED__) && SIZEOF_CHAR_SAVED__ != SIZEOF_CHAR +# error SIZEOF_CHAR mismatch +#endif +#if defined(SIZEOF_SHORT_SAVED__) && SIZEOF_SHORT_SAVED__ != SIZEOF_SHORT +# error SIZEOF_SHORT mismatch +#endif +#if defined(SIZEOF_INT_SAVED__) && SIZEOF_INT_SAVED__ != SIZEOF_INT +# error SIZEOF_INT mismatch +#endif +#if defined(SIZEOF_LONG_SAVED__) && SIZEOF_LONG_SAVED__ != SIZEOF_LONG +# error SIZEOF_LONG mismatch +#endif +#if defined(SIZEOF_LONG_LONG_SAVED__) && SIZEOF_LONG_LONG_SAVED__ != SIZEOF_LONG_LONG +# error SIZEOF_LONG_LONG mismatch +#endif + #include #if defined(VXWORKS) @@ -79,7 +116,7 @@ #define ERL_DRV_EXTENDED_MARKER (0xfeeeeeed) #define ERL_DRV_EXTENDED_MAJOR_VERSION 1 -#define ERL_DRV_EXTENDED_MINOR_VERSION 3 +#define ERL_DRV_EXTENDED_MINOR_VERSION 4 /* * The emulator will refuse to load a driver with different major @@ -99,6 +136,7 @@ #define ERL_DRV_FLAG_USE_PORT_LOCKING (1 << 0) +#define ERL_DRV_FLAG_SOFT_BUSY (1 << 1) /* * A binary as seen in a driver. Note that a binary should never be @@ -136,6 +174,20 @@ typedef unsigned long ErlDrvTermData; typedef unsigned long ErlDrvUInt; typedef signed long ErlDrvSInt; + +#if defined(__WIN32__) +typedef unsigned __int64 ErlDrvUInt64; +typedef __int64 ErlDrvSInt64; +#elif SIZEOF_LONG == 8 +typedef unsigned long ErlDrvUInt64; +typedef long ErlDrvSInt64; +#elif SIZEOF_LONG_LONG == 8 +typedef unsigned long long ErlDrvUInt64; +typedef long long ErlDrvSInt64; +#else +#error No 64-bit integer type +#endif + /* * A driver monitor */ @@ -506,6 +558,8 @@ #define ERL_DRV_EXT2TERM ((ErlDrvTermData) 12) /* char *, ErlDrvUInt */ #define ERL_DRV_UINT ((ErlDrvTermData) 13) /* ErlDrvUInt */ #define ERL_DRV_BUF2BINARY ((ErlDrvTermData) 14) /* char *, ErlDrvUInt */ +#define ERL_DRV_INT64 ((ErlDrvTermData) 15) /* ErlDrvSInt64 * */ +#define ERL_DRV_UINT64 ((ErlDrvTermData) 16) /* ErlDrvUInt64 * */ #ifndef ERL_DRIVER_TYPES_ONLY diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_gc.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_gc.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_gc.c 2009-06-05 13:53:26.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_gc.c 2009-11-20 13:31:30.000000000 +0000 @@ -421,7 +421,7 @@ reclaimed += reclaimed_now; erts_smp_spin_unlock(&info_lck); - MSO(p).overhead = 0; + FLAGS(p) &= ~F_FORCE_GC; #ifdef CHECK_FOR_HOLES /* @@ -481,6 +481,8 @@ /* * Do it. */ + + heap_size = p->heap_sz + (p->old_htop - p->old_heap); heap = (Eterm*) ERTS_HEAP_ALLOC(ERTS_ALC_T_TMP_HEAP, sizeof(Eterm)*heap_size); @@ -536,7 +538,8 @@ if (heap_size == 0) { heap_size = 1; /* We want a heap... */ } - MSO(p).overhead = 0; + + FLAGS(p) &= ~F_FORCE_GC; /* * Move the heap to its final destination. @@ -2079,6 +2082,25 @@ HEAP_SIZE(p) = new_sz; } +static Uint +next_vheap_size(Uint vheap, Uint vheap_sz) { + if (vheap < H_MIN_SIZE) { + return H_MIN_SIZE; + } + + /* grow */ + if (vheap > vheap_sz) { + return erts_next_heap_size(2*vheap, 0); + } + /* shrink */ + if ( vheap < vheap_sz/2) { + return (Uint)vheap_sz*3/4; + } + + return vheap_sz; +} + + static void sweep_proc_externals(Process *p, int fullsweep) { @@ -2220,7 +2242,7 @@ } -static void +static void sweep_proc_bins(Process *p, int fullsweep) { struct shrink_cand_data shrink = {0}; @@ -2229,12 +2251,15 @@ Binary* bptr; char* oh = NULL; Uint oh_size = 0; + Uint bin_vheap = 0; if (fullsweep == 0) { oh = (char *) OLD_HEAP(p); oh_size = (char *) OLD_HEND(p) - oh; } + BIN_OLD_VHEAP(p) = 0; + prev = &MSO(p).mso; ptr = MSO(p).mso; @@ -2250,6 +2275,7 @@ Eterm* ppt = (Eterm *) ptr; if (IS_MOVED(*ppt)) { /* Object is alive */ + bin_vheap += ptr->size / sizeof(Eterm); ptr = (ProcBin*) binary_val(*ppt); link_live_proc_bin(&shrink, &prev, @@ -2260,8 +2286,10 @@ * Object resides on old heap, and we just did a * generational collection - keep object in list. */ + BIN_OLD_VHEAP(p) += ptr->size / sizeof(Eterm); /* for binary gc (words)*/ link_live_proc_bin(&shrink, &prev, &ptr, 0); } else { /* Object has not been moved - deref it */ + *prev = ptr->next; bptr = ptr->val; if (erts_refc_dectest(&bptr->refc, 0) == 0) @@ -2270,6 +2298,14 @@ } } + if (BIN_OLD_VHEAP(p) >= BIN_OLD_VHEAP_SZ(p)) { + FLAGS(p) |= F_NEED_FULLSWEEP; + } + + BIN_VHEAP_SZ(p) = next_vheap_size(bin_vheap, BIN_VHEAP_SZ(p)); + BIN_OLD_VHEAP_SZ(p) = next_vheap_size(BIN_OLD_VHEAP(p), BIN_OLD_VHEAP_SZ(p)); + MSO(p).overhead = bin_vheap; + /* * If we got any shrink candidates, check them out. */ diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_init.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_init.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_init.c 2009-06-05 13:53:11.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_init.c 2009-09-18 15:07:46.000000000 +0100 @@ -47,6 +47,10 @@ #include "hipe_signal.h" /* for hipe_signal_init() */ #endif +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif + /* * Note about VxWorks: All variables must be initialized by executable code, * not by an initializer. Otherwise a new instance of the emulator will @@ -550,9 +554,13 @@ erts_fprintf(stderr, "-r force ets memory block to be moved on realloc\n"); erts_fprintf(stderr, "-sbt type set scheduler bind type, valid types are:\n"); - erts_fprintf(stderr, " u|ns|ts|ps|nnts|nnps|tnnps|db\n"); + erts_fprintf(stderr, " u|ns|ts|ps|s|nnts|nnps|tnnps|db\n"); erts_fprintf(stderr, "-sct cput set cpu topology,\n"); erts_fprintf(stderr, " see the erl(1) documentation for more info.\n"); + erts_fprintf(stderr, "-sss size suggested stack size in kilo words for scheduler threads,\n"); + erts_fprintf(stderr, " valid range is [%d-%d]\n", + ERTS_SCHED_THREAD_MIN_STACK_SIZE, + ERTS_SCHED_THREAD_MAX_STACK_SIZE); erts_fprintf(stderr, "-S n1:n2 set number of schedulers (n1), and number of\n"); erts_fprintf(stderr, " schedulers online (n2), valid range for both\n"); erts_fprintf(stderr, " numbers are [1-%d]\n", @@ -749,6 +757,27 @@ } +#ifndef ERTS_SMP +static void set_main_stack_size(void) +{ + if (erts_sched_thread_suggested_stack_size > 0) { +# if HAVE_DECL_GETRLIMIT && HAVE_DECL_SETRLIMIT && HAVE_DECL_RLIMIT_STACK + struct rlimit rl; + int bytes = erts_sched_thread_suggested_stack_size * sizeof(Uint) * 1024; + if (getrlimit(RLIMIT_STACK, &rl) != 0 || + (rl.rlim_cur = bytes, setrlimit(RLIMIT_STACK, &rl) != 0)) { + erts_fprintf(stderr, "failed to set stack size for scheduler " + "thread to %d bytes\n", bytes); + erts_usage(); + } +# else + erts_fprintf(stderr, "no OS support for dynamic stack size limit\n"); + erts_usage(); +# endif + } +} +#endif + void erl_start(int argc, char **argv) { @@ -1054,14 +1083,29 @@ erts_usage(); } } - else if (sys_strcmp("pnt", sub_param) == 0) - erts_init_enable_processor_node_topology(); else if (sys_strcmp("mrq", sub_param) == 0) use_multi_run_queue = 1; else if (sys_strcmp("srq", sub_param) == 0) use_multi_run_queue = 0; else if (sys_strcmp("nsp", sub_param) == 0) erts_use_sender_punish = 0; + else if (has_prefix("ss", sub_param)) { + /* suggested stack size (Kilo Words) for scheduler threads */ + arg = get_arg(sub_param+2, argv[i+1], &i); + erts_sched_thread_suggested_stack_size = atoi(arg); + + if ((erts_sched_thread_suggested_stack_size + < ERTS_SCHED_THREAD_MIN_STACK_SIZE) + || (erts_sched_thread_suggested_stack_size > + ERTS_SCHED_THREAD_MAX_STACK_SIZE)) { + erts_fprintf(stderr, "bad stack size for scheduler threads %s\n", + arg); + erts_usage(); + } + VERBOSE(DEBUG_SYSTEM, + ("suggested scheduler thread stack size %d kilo words\n", + erts_sched_thread_suggested_stack_size)); + } else { erts_fprintf(stderr, "bad scheduling option %s\n", argv[i]); erts_usage(); @@ -1230,6 +1274,7 @@ erts_sys_main_thread(); /* May or may not return! */ #else + set_main_stack_size(); process_main(); #endif } @@ -1237,7 +1282,7 @@ #ifdef USE_THREADS -void erts_thr_fatal_error(int err, char *what) +__decl_noreturn void erts_thr_fatal_error(int err, char *what) { char *errstr = err ? strerror(err) : NULL; erts_fprintf(stderr, @@ -1322,7 +1367,7 @@ * other positive n -> Erlang crash dump and core dump produced. */ -void erl_exit0(char *file, int line, int n, char *fmt,...) +__decl_noreturn void erl_exit0(char *file, int line, int n, char *fmt,...) { unsigned int an; va_list args; @@ -1368,7 +1413,7 @@ exit(an); } -void erl_exit(int n, char *fmt,...) +__decl_noreturn void erl_exit(int n, char *fmt,...) { unsigned int an; va_list args; diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_message.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_message.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_message.c 2009-06-05 13:53:10.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_message.c 2009-11-20 13:30:23.000000000 +0000 @@ -188,7 +188,7 @@ bp->next = MBUF(proc); MBUF(proc) = bp; MBUF_SIZE(proc) += bp->size; - MSO(proc).overhead += proc->heap_sz; /* Force GC */ + FLAGS(proc) |= F_FORCE_GC; /* Move any binaries into the process */ if (bp->off_heap.mso != NULL) { diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_nif_api_funcs.h erlang-13.b.3-dfsg/erts/emulator/beam/erl_nif_api_funcs.h --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_nif_api_funcs.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_nif_api_funcs.h 2009-11-20 13:33:10.000000000 +0000 @@ -0,0 +1,68 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +#if !defined(ERL_NIF_API_FUNC_DECL) && !defined(ERL_NIF_API_FUNC_MACRO) +# error This file should not be included directly +#endif + +#ifdef ERL_NIF_API_FUNC_DECL +ERL_NIF_API_FUNC_DECL(void*,enif_get_data,(ErlNifEnv*)); +ERL_NIF_API_FUNC_DECL(void*,enif_alloc,(ErlNifEnv*, size_t size)); +ERL_NIF_API_FUNC_DECL(void,enif_free,(ErlNifEnv*, void* ptr)); +ERL_NIF_API_FUNC_DECL(int,enif_is_binary,(ErlNifEnv*, ERL_NIF_TERM term)); +ERL_NIF_API_FUNC_DECL(int,enif_inspect_binary,(ErlNifEnv*, ERL_NIF_TERM bin_term, ErlNifBinary* bin)); +ERL_NIF_API_FUNC_DECL(int,enif_alloc_binary,(ErlNifEnv*, unsigned size, ErlNifBinary* bin)); +ERL_NIF_API_FUNC_DECL(void,enif_release_binary,(ErlNifEnv*, ErlNifBinary* bin)); +ERL_NIF_API_FUNC_DECL(int,enif_get_int,(ErlNifEnv*, ERL_NIF_TERM term, int* ip)); +ERL_NIF_API_FUNC_DECL(int,enif_get_ulong,(ErlNifEnv*, ERL_NIF_TERM term, unsigned long* ip)); +ERL_NIF_API_FUNC_DECL(int,enif_get_list_cell,(ErlNifEnv* env, ERL_NIF_TERM term, ERL_NIF_TERM* head, ERL_NIF_TERM* tail)); +ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_binary,(ErlNifEnv* env, ErlNifBinary* bin)); +ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_badarg,(ErlNifEnv* env)); +ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_int,(ErlNifEnv* env, int i)); +ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_ulong,(ErlNifEnv* env, unsigned long i)); +ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_atom,(ErlNifEnv* env, const char* name)); +ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_tuple,(ErlNifEnv* env, unsigned cnt, ...)); +ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_list,(ErlNifEnv* env, unsigned cnt, ...)); +ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_list_cell,(ErlNifEnv* env, ERL_NIF_TERM car, ERL_NIF_TERM cdr)); +ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_string,(ErlNifEnv* env, const char* string)); +#endif + +#ifdef ERL_NIF_API_FUNC_MACRO +# define enif_get_data ERL_NIF_API_FUNC_MACRO(enif_get_data) +# define enif_alloc ERL_NIF_API_FUNC_MACRO(enif_alloc) +# define enif_free ERL_NIF_API_FUNC_MACRO(enif_free) +# define enif_is_binary ERL_NIF_API_FUNC_MACRO(enif_is_binary) +# define enif_inspect_binary ERL_NIF_API_FUNC_MACRO(enif_inspect_binary) +# define enif_alloc_binary ERL_NIF_API_FUNC_MACRO(enif_alloc_binary) +# define enif_release_binary ERL_NIF_API_FUNC_MACRO(enif_release_binary) +# define enif_get_int ERL_NIF_API_FUNC_MACRO(enif_get_int) +# define enif_get_ulong ERL_NIF_API_FUNC_MACRO(enif_get_ulong) +# define enif_get_list_cell ERL_NIF_API_FUNC_MACRO(enif_get_list_cell) + +# define enif_make_binary ERL_NIF_API_FUNC_MACRO(enif_make_binary) +# define enif_make_badarg ERL_NIF_API_FUNC_MACRO(enif_make_badarg) +# define enif_make_int ERL_NIF_API_FUNC_MACRO(enif_make_int) +# define enif_make_ulong ERL_NIF_API_FUNC_MACRO(enif_make_ulong) +# define enif_make_atom ERL_NIF_API_FUNC_MACRO(enif_make_atom) +# define enif_make_tuple ERL_NIF_API_FUNC_MACRO(enif_make_tuple) +# define enif_make_list ERL_NIF_API_FUNC_MACRO(enif_make_list) +# define enif_make_list_cell ERL_NIF_API_FUNC_MACRO(enif_make_list_cell) +# define enif_make_string ERL_NIF_API_FUNC_MACRO(enif_make_string) +#endif + diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_nif.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_nif.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_nif.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_nif.c 2009-11-20 13:33:07.000000000 +0000 @@ -0,0 +1,641 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ +/* Erlang Native InterFace + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "erl_nif.h" + +#include "sys.h" +#include "global.h" +#include "erl_binary.h" +#include "bif.h" +#include "error.h" +#include "big.h" +#include "beam_bp.h" + +#include + +/* +static ERTS_INLINE Eterm* alloc_heap(ErlNifEnv* env, unsigned need) +{ + return HAlloc(env->proc, need); +} +*/ + +#define MIN_HEAP_FRAG_SZ 200 +static Eterm* alloc_heap_heavy(ErlNifEnv* env, unsigned need); + +static ERTS_INLINE Eterm* alloc_heap(ErlNifEnv* env, unsigned need) +{ + Eterm* hp = env->hp; + env->hp += need; + if (env->hp <= env->hp_end) { + return hp; + } + env->hp = hp; + return alloc_heap_heavy(env,need); +} + +static Eterm* alloc_heap_heavy(ErlNifEnv* env, unsigned need) +{ + Eterm* hp; + + if (env->heap_frag_sz == 0) { + ASSERT(HEAP_LIMIT(env->proc) == env->hp_end); + HEAP_TOP(env->proc) = env->hp; + env->heap_frag_sz = need + MIN_HEAP_FRAG_SZ; + } + else { + HRelease(env->proc, env->hp_end, env->hp); + env->heap_frag_sz *= 2; + } + hp = erts_heap_alloc(env->proc, env->heap_frag_sz); + env->hp = hp + need; + env->hp_end = hp + env->heap_frag_sz; + return hp; +} + +void erts_pre_nif(ErlNifEnv* env, Process* p, void* nif_data) +{ + env->nif_data = nif_data; + env->proc = p; + env->hp = HEAP_TOP(p); + env->hp_end = HEAP_LIMIT(p); + env->heap_frag_sz = 0; + env->fpe_was_unmasked = erts_block_fpe(); +} + +void erts_post_nif(ErlNifEnv* env) +{ + erts_unblock_fpe(env->fpe_was_unmasked); + if (env->heap_frag_sz == 0) { + ASSERT(env->hp_end == HEAP_LIMIT(env->proc)); + ASSERT(env->hp >= HEAP_TOP(env->proc)); + ASSERT(env->hp <= HEAP_LIMIT(env->proc)); + HEAP_TOP(env->proc) = env->hp; + } + else { + ASSERT(env->hp_end != HEAP_LIMIT(env->proc)); + ASSERT(env->hp_end - env->hp <= env->heap_frag_sz); + HRelease(env->proc, env->hp_end, env->hp); + } +} + +void* enif_get_data(ErlNifEnv* env) +{ + return env->nif_data; +} + +void* enif_alloc(ErlNifEnv* env, size_t size) +{ + return erts_alloc_fnf(ERTS_ALC_T_NIF, (Uint) size); +} + +void enif_free(ErlNifEnv* env, void* ptr) +{ + erts_free(ERTS_ALC_T_NIF, ptr); +} + + +int enif_is_binary(ErlNifEnv* env, ERL_NIF_TERM term) +{ + return is_binary(term) && (binary_bitsize(term) % 8 == 0); +} + + +int enif_inspect_binary(ErlNifEnv* env, Eterm bin_term, ErlNifBinary* bin) +{ + bin->tmp_alloc = NULL; + bin->data = erts_get_aligned_binary_bytes(bin_term, &bin->tmp_alloc); + if (bin->data == NULL) { + return 0; + } + bin->bin_term = bin_term; + bin->size = binary_size(bin_term); + bin->ref_bin = NULL; + return 1; +} + + +int enif_alloc_binary(ErlNifEnv* env, unsigned size, ErlNifBinary* bin) +{ + Binary* refbin; + + refbin = erts_bin_drv_alloc_fnf(size); /* BUGBUG: alloc type? */ + if (refbin == NULL) { + return 0; /* The NIF must take action */ + } + refbin->flags = BIN_FLAG_DRV; /* BUGBUG: Flag? */ + erts_refc_init(&refbin->refc, 1); + refbin->orig_size = (long) size; + + bin->size = size; + bin->data = (unsigned char*) refbin->orig_bytes; + bin->bin_term = THE_NON_VALUE; + bin->tmp_alloc = NULL; + bin->ref_bin = refbin; + return 1; +} + +void enif_release_binary(ErlNifEnv* env, ErlNifBinary* bin) +{ + if (bin->ref_bin == NULL) { + erts_free_aligned_binary_bytes(bin->tmp_alloc); + } + else { + Binary* refbin = bin->ref_bin; + ASSERT(bin->tmp_alloc == NULL); + ASSERT(bin->bin_term == THE_NON_VALUE); + if (erts_refc_dectest(&refbin->refc, 0) == 0) { + erts_bin_free(refbin); + } + } +#ifdef DEBUG + bin->bin_term = THE_NON_VALUE; + bin->tmp_alloc = NULL; + bin->ref_bin = NULL; +#endif +} + +Eterm enif_make_binary(ErlNifEnv* env, ErlNifBinary* bin) +{ + if (bin->ref_bin == NULL) { + erts_free_aligned_binary_bytes(bin->tmp_alloc); + return bin->bin_term; + } + else { + Binary* bptr = bin->ref_bin; + ProcBin* pb; + ASSERT(bin->tmp_alloc == NULL); + + /* !! Copy-paste from new_binary() !! */ + pb = (ProcBin *) alloc_heap(env, PROC_BIN_SIZE); + pb->thing_word = HEADER_PROC_BIN; + pb->size = bptr->orig_size; + pb->next = MSO(env->proc).mso; + MSO(env->proc).mso = pb; + pb->val = bptr; + pb->bytes = (byte*) bptr->orig_bytes; + pb->flags = 0; + + MSO(env->proc).overhead += pb->size / sizeof(Eterm); + return make_binary(pb); + } +} + +ERL_NIF_TERM enif_make_badarg(ErlNifEnv* env) +{ + BIF_ERROR(env->proc, BADARG); +} + + +int enif_get_int(ErlNifEnv* env, Eterm term, int* ip) +{ +#if SIZEOF_INT == SIZEOF_VOID_P + return term_to_Sint(term, ip); +#elif SIZEOF_LONG == SIZEOF_VOID_P + Sint i; + if (!term_to_Sint(term, &i) || i < INT_MIN || i > INT_MAX) { + return 0; + } + *ip = (int) i; + return 1; +#else +# error Unknown word size +#endif +} + +int enif_get_ulong(ErlNifEnv* env, Eterm term, unsigned long* ip) +{ +#if SIZEOF_LONG == SIZEOF_VOID_P + return term_to_Uint(term, ip); +#else +# error Unknown long word size +#endif +} + +int enif_get_list_cell(ErlNifEnv* env, Eterm term, Eterm* head, Eterm* tail) +{ + Eterm* val; + if (is_not_list(term)) return 0; + val = list_val(term); + *head = CAR(val); + *tail = CDR(val); + return 1; +} + +ERL_NIF_TERM enif_make_int(ErlNifEnv* env, int i) +{ +#if SIZEOF_INT == SIZEOF_VOID_P + return IS_SSMALL(i) ? make_small(i) : small_to_big(i,alloc_heap(env,2)); +#elif SIZEOF_LONG == SIZEOF_VOID_P + return make_small(i); +#endif +} + +ERL_NIF_TERM enif_make_ulong(ErlNifEnv* env, unsigned long i) +{ +#if SIZEOF_LONG == SIZEOF_VOID_P + Eterm* hp; + Uint sz = 0; + erts_bld_uint(NULL, &sz, i); + hp = alloc_heap(env,sz); + return erts_bld_uint(&hp, NULL, i); +#else +# error Unknown long word size +#endif + +} + + +ERL_NIF_TERM enif_make_atom(ErlNifEnv* env, const char* name) +{ + return am_atom_put(name, sys_strlen(name)); +} + + +ERL_NIF_TERM enif_make_tuple(ErlNifEnv* env, unsigned cnt, ...) +{ + Eterm* hp = alloc_heap(env,cnt+1); + Eterm ret = make_tuple(hp); + va_list ap; + + *hp++ = make_arityval(cnt); + va_start(ap,cnt); + while (cnt--) { + *hp++ = va_arg(ap,Eterm); + } + va_end(ap); + return ret; +} + +ERL_NIF_TERM enif_make_list_cell(ErlNifEnv* env, Eterm car, Eterm cdr) +{ + Eterm* hp = alloc_heap(env,2); + Eterm ret = make_list(hp); + + CAR(hp) = car; + CDR(hp) = cdr; + return ret; +} + +ERL_NIF_TERM enif_make_list(ErlNifEnv* env, unsigned cnt, ...) +{ + Eterm* hp = alloc_heap(env,cnt*2); + Eterm ret = make_list(hp); + Eterm* last = &ret; + va_list ap; + + va_start(ap,cnt); + while (cnt--) { + *last = make_list(hp); + *hp = va_arg(ap,Eterm); + last = ++hp; + ++hp; + } + va_end(ap); + *last = NIL; + return ret; +} + +ERL_NIF_TERM enif_make_string(ErlNifEnv* env, const char* string) +{ + Sint n = strlen(string); + Eterm* hp = alloc_heap(env,n*2); + return erts_bld_string_n(&hp,NULL,string,n); +} + + + + +/*************************************************************************** + ** load_nif/2 ** + ***************************************************************************/ + + +static Uint** get_func_pp(Eterm* mod_code, Eterm f_atom, unsigned arity) +{ + int n = (int) mod_code[MI_NUM_FUNCTIONS]; + int j; + for (j = 0; j < n; ++j) { + Uint* code_ptr = (Uint*) mod_code[MI_FUNCTIONS+j]; + ASSERT(code_ptr[0] == (Uint) BeamOp(op_i_func_info_IaaI)); + if (f_atom == ((Eterm) code_ptr[3]) + && arity == ((unsigned) code_ptr[4])) { + + return (Uint**) &mod_code[MI_FUNCTIONS+j]; + } + } + return NULL; +} + +#define in_area(ptr,start,nbytes) \ + ((unsigned long)((char*)(ptr) - (char*)(start)) < (nbytes)) + +static void refresh_cached_nif_data(Eterm* mod_code, + struct erl_module_nif* mod_nif) +{ + int i; + for (i=0; i < mod_nif->entry->num_of_funcs; i++) { + Eterm f_atom; + ErlNifFunc* func = &mod_nif->entry->funcs[i]; + Uint* code_ptr; + + erts_atom_get(func->name, strlen(func->name), &f_atom); + code_ptr = *get_func_pp(mod_code, f_atom, func->arity); + code_ptr[5+2] = (Uint) mod_nif->data; + } +} + +static Eterm mkatom(const char *str) +{ + return am_atom_put(str, sys_strlen(str)); +} + +static struct tainted_module_t +{ + struct tainted_module_t* next; + Eterm module_atom; +}*first_tainted_module = NULL; + +static void add_taint(Eterm mod_atom) +{ + struct tainted_module_t* t; + for (t=first_tainted_module ; t!=NULL; t=t->next) { + if (t->module_atom == mod_atom) { + return; + } + } + t = erts_alloc_fnf(ERTS_ALC_T_TAINT, sizeof(*t)); + if (t != NULL) { + t->module_atom = mod_atom; + t->next = first_tainted_module; + first_tainted_module = t; + } +} + +Eterm erts_nif_taints(Process* p) +{ + struct tainted_module_t* t; + unsigned cnt = 0; + Eterm list = NIL; + Eterm* hp; + for (t=first_tainted_module ; t!=NULL; t=t->next) { + cnt++; + } + hp = HAlloc(p,cnt*2); + for (t=first_tainted_module ; t!=NULL; t=t->next) { + list = CONS(hp, t->module_atom, list); + hp += 2; + } + return list; +} + + +static Eterm load_nif_error(Process* p, const char* atom, const char* format, ...) +{ + erts_dsprintf_buf_t* dsbufp = erts_create_tmp_dsbuf(0); + Eterm ret; + Eterm* hp; + Eterm** hpp = NULL; + Uint sz = 0; + Uint* szp = &sz; + va_list arglist; + + va_start(arglist, format); + erts_vdsprintf(dsbufp, format, arglist); + va_end(arglist); + + for (;;) { + Eterm txt = erts_bld_string_n(hpp, &sz, dsbufp->str, dsbufp->str_len); + ret = erts_bld_tuple(hpp, szp, 3, am_error, mkatom(atom), txt); + if (hpp != NULL) { + break; + } + hp = HAlloc(p,sz); + hpp = &hp; + szp = NULL; + } + erts_destroy_tmp_dsbuf(dsbufp); + return ret; +} + +BIF_RETTYPE load_nif_2(BIF_ALIST_2) +{ + static const char bad_lib[] = "bad_lib"; + static const char reload[] = "reload"; + static const char upgrade[] = "upgrade"; + char lib_name[256]; /* BUGBUG: Max-length? */ + void* handle = NULL; + void* init_func; + ErlNifEntry* entry = NULL; + ErlNifEnv env; + int len, i, err; + Module* mod; + Eterm mod_atom; + Eterm f_atom; + Eterm* caller; + ErtsSysDdllError errdesc = ERTS_SYS_DDLL_ERROR_INIT; + Eterm ret = am_ok; + int veto; + + len = intlist_to_buf(BIF_ARG_1, lib_name, sizeof(lib_name)-1); + if (len < 1) { + /*erts_fprintf(stderr, "Invalid library path name '%T'\r\n", BIF_ARG_1);*/ + BIF_ERROR(BIF_P, BADARG); + } + lib_name[len] = '\0'; + + /* Block system (is this the right place to do it?) */ + erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); + erts_smp_block_system(0); + + /* Find calling module */ + ASSERT(BIF_P->current != NULL); + ASSERT(BIF_P->current[0] == am_erlang + && BIF_P->current[1] == am_load_nif + && BIF_P->current[2] == 2); + caller = find_function_from_pc(BIF_P->cp); + ASSERT(caller != NULL); + mod_atom = caller[0]; + ASSERT(is_atom(mod_atom)); + mod=erts_get_module(mod_atom); + ASSERT(mod != NULL); + + if (!in_area(caller, mod->code, mod->code_length)) { + ASSERT(in_area(caller, mod->old_code, mod->old_code_length)); + + ret = load_nif_error(BIF_P, "old_code", "Calling load_nif from old " + "module '%T' not allowed", mod_atom); + } + else if ((err=erts_sys_ddll_open2(lib_name, &handle, &errdesc)) != ERL_DE_NO_ERROR) { + ret = load_nif_error(BIF_P, "load_failed", "Failed to load NIF library" + " %s: '%s'", lib_name, errdesc.str); + } + else if (erts_sys_ddll_load_nif_init(handle, &init_func, &errdesc) != ERL_DE_NO_ERROR) { + ret = load_nif_error(BIF_P, bad_lib, "Failed to find library init" + " function: '%s'", errdesc.str); + + } + else if ((add_taint(mod_atom), + (entry = erts_sys_ddll_call_nif_init(init_func)) == NULL)) { + ret = load_nif_error(BIF_P, bad_lib, "Library init-call unsuccessful"); + } + else if (entry->major != ERL_NIF_MAJOR_VERSION + || entry->minor > ERL_NIF_MINOR_VERSION) { + + ret = load_nif_error(BIF_P, bad_lib, "Library version (%d.%d) not compatible (with %d.%d).", + entry->major, entry->minor, ERL_NIF_MAJOR_VERSION, ERL_NIF_MINOR_VERSION); + } + else if (!erts_is_atom_str((char*)entry->name, mod_atom)) { + ret = load_nif_error(BIF_P, bad_lib, "Library module name '%s' does not" + " match calling module '%T'", entry->name, mod_atom); + } + else { + /*erts_fprintf(stderr, "Found module %T\r\n", mod_atom);*/ + + for (i=0; i < entry->num_of_funcs && ret==am_ok; i++) { + Uint** code_pp; + ErlNifFunc* f = &entry->funcs[i]; + if (f->arity > 3) { + ret = load_nif_error(BIF_P,bad_lib,"Function arity too high for NIF %s/%u", + f->name, f->arity); + } + else if (!erts_atom_get(f->name, strlen(f->name), &f_atom) + || (code_pp = get_func_pp(mod->code, f_atom, f->arity))==NULL) { + ret = load_nif_error(BIF_P,bad_lib,"Function not found %T:%s/%u", + mod_atom, f->name, f->arity); + } + else if (code_pp[1] - code_pp[0] < (5+3)) { + ret = load_nif_error(BIF_P,bad_lib,"No explicit call to load_nif" + " in module (%T:%s/%u to small)", + mod_atom, entry->funcs[i].name, entry->funcs[i].arity); + } + /*erts_fprintf(stderr, "Found NIF %T:%s/%u\r\n", + mod_atom, entry->funcs[i].name, entry->funcs[i].arity);*/ + } + } + + if (ret != am_ok) { + goto error; + } + + /* Call load, reload or upgrade: + */ + if (mod->nif.handle != NULL) { /* Reload */ + int k; + ASSERT(mod->nif.entry != NULL); + if (entry->reload == NULL) { + ret = load_nif_error(BIF_P,reload,"Reload not supported by this NIF library."); + goto error; + } + /* Check that no NIF is removed */ + for (k=0; k < mod->nif.entry->num_of_funcs; k++) { + ErlNifFunc* old_func = &mod->nif.entry->funcs[k]; + for (i=0; i < entry->num_of_funcs; i++) { + if (old_func->arity == entry->funcs[i].arity + && sys_strcmp(old_func->name, entry->funcs[i].name) == 0) { + break; + } + } + if (i == entry->num_of_funcs) { + ret = load_nif_error(BIF_P,reload,"Reloaded library missing " + "function %T:%s/%u\r\n", mod_atom, + old_func->name, old_func->arity); + goto error; + } + } + erts_pre_nif(&env, BIF_P, mod->nif.data); + veto = entry->reload(&env, &env.nif_data, BIF_ARG_2); + erts_post_nif(&env); + if (veto) { + ret = load_nif_error(BIF_P, reload, "Library reload-call unsuccessful."); + } + else { + erts_sys_ddll_close(mod->nif.handle); + } + } + else { + if (mod->old_nif.handle != NULL) { /* Upgrade */ + void* prev_old_data = mod->old_nif.data; + if (entry->upgrade == NULL) { + ret = load_nif_error(BIF_P, upgrade, "Upgrade not supported by this NIF library."); + goto error; + } + erts_pre_nif(&env, BIF_P, NULL); + veto = entry->upgrade(&env, &env.nif_data, &mod->old_nif.data, BIF_ARG_2); + erts_post_nif(&env); + if (veto) { + mod->old_nif.data = prev_old_data; + ret = load_nif_error(BIF_P, upgrade, "Library upgrade-call unsuccessful."); + } + else if (mod->old_nif.data != prev_old_data) { + refresh_cached_nif_data(mod->old_code, &mod->old_nif); + } + } + else if (entry->load != NULL) { /* Initial load */ + erts_pre_nif(&env, BIF_P, NULL); + veto = entry->load(&env, &env.nif_data, BIF_ARG_2); + erts_post_nif(&env); + if (veto) { + ret = load_nif_error(BIF_P, "load", "Library load-call unsuccessful."); + } + } + } + if (ret == am_ok) { + /* + ** Everything ok, patch the beam code with op_call_nif + */ + mod->nif.data = env.nif_data; + mod->nif.handle = handle; + mod->nif.entry = entry; + for (i=0; i < entry->num_of_funcs; i++) + { + Uint* code_ptr; + erts_atom_get(entry->funcs[i].name, strlen(entry->funcs[i].name), &f_atom); + code_ptr = *get_func_pp(mod->code, f_atom, entry->funcs[i].arity); + + if (code_ptr[1] == 0) { + code_ptr[5+0] = (Uint) BeamOp(op_call_nif); + } else { /* Function traced, patch the original instruction word */ + BpData* bp = (BpData*) code_ptr[1]; + bp->orig_instr = (Uint) BeamOp(op_call_nif); + } + code_ptr[5+1] = (Uint) entry->funcs[i].fptr; + code_ptr[5+2] = (Uint) mod->nif.data; + } + } + else { + error: + ASSERT(ret != am_ok); + if (handle != NULL) { + erts_sys_ddll_close(handle); + } + erts_sys_ddll_free_error(&errdesc); + } + + erts_smp_release_system(); + erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); + BIF_RET(ret); +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_nif.h erlang-13.b.3-dfsg/erts/emulator/beam/erl_nif.h --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_nif.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_nif.h 2009-11-20 13:33:07.000000000 +0000 @@ -0,0 +1,122 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* Include file for writers of Native Implemented Functions. +*/ + +#define ERL_NIF_MAJOR_VERSION 0 +#define ERL_NIF_MINOR_VERSION 1 + +#include + +typedef unsigned long ERL_NIF_TERM; + +typedef struct +{ + const char* name; + unsigned arity; + void* fptr; //ERL_NIF_TERM (*fptr)(void*, ...); +}ErlNifFunc; + +struct enif_environment_t; +typedef struct enif_environment_t ErlNifEnv; + +typedef struct enif_entry_t +{ + int major; + int minor; + const char* name; + int num_of_funcs; + ErlNifFunc* funcs; + int (*load) (ErlNifEnv*, void** priv_data, ERL_NIF_TERM load_info); + int (*reload) (ErlNifEnv*, void** priv_data, ERL_NIF_TERM load_info); + int (*upgrade)(ErlNifEnv*, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info); + void (*unload) (ErlNifEnv*, void* priv_data); +}ErlNifEntry; + + + +typedef struct +{ + unsigned size; + unsigned char* data; + + /* Internals (avert your eyes) */ + ERL_NIF_TERM bin_term; + unsigned char* tmp_alloc; + void* ref_bin; + +}ErlNifBinary; + +#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_)) +# define ERL_NIF_API_FUNC_DECL(RET_TYPE, NAME, ARGS) RET_TYPE (*NAME) ARGS +typedef struct { +# include "erl_nif_api_funcs.h" +} TWinDynNifCallbacks; +extern TWinDynNifCallbacks WinDynNifCallbacks; +# undef ERL_NIF_API_FUNC_DECL +#endif + +#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_)) && !defined(STATIC_ERLANG_DRIVER) +# define ERL_NIF_API_FUNC_MACRO(NAME) (WinDynNifCallbacks.NAME) +# include "erl_nif_api_funcs.h" +/* note that we have to keep ERL_NIF_API_FUNC_MACRO defined */ + +#else /* non windows or included from emulator itself */ + +# define ERL_NIF_API_FUNC_DECL(RET_TYPE, NAME, ARGS) extern RET_TYPE NAME ARGS +# include "erl_nif_api_funcs.h" +# undef ERL_NIF_API_FUNC_DECL +#endif + + + + +#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_)) +# define ERL_NIF_INIT_GLOB TWinDynNifCallbacks WinDynNifCallbacks; +# define ERL_NIF_INIT_DECL(MODNAME) __declspec(dllexport) ErlNifEntry* nif_init(TWinDynNifCallbacks* callbacks) +# define ERL_NIF_INIT_BODY memcpy(&WinDynNifCallbacks,callbacks,sizeof(TWinDynNifCallbacks)) +#else +# define ERL_NIF_INIT_GLOB +# define ERL_NIF_INIT_BODY +# if defined(VXWORKS) +# define ERL_NIF_INIT_DECL(MODNAME) ErlNifEntry* MODNAME ## _init(void) +# else +# define ERL_NIF_INIT_DECL(MODNAME) ErlNifEntry* nif_init(void) +# endif +#endif + + +#define ERL_NIF_INIT(NAME, FUNCS, LOAD, RELOAD, UPGRADE, UNLOAD) \ +ERL_NIF_INIT_GLOB \ +ERL_NIF_INIT_DECL(NAME) \ +{ \ + static ErlNifEntry entry = \ + { \ + ERL_NIF_MAJOR_VERSION, \ + ERL_NIF_MINOR_VERSION, \ + #NAME, \ + sizeof(FUNCS) / sizeof(*FUNCS), \ + FUNCS, \ + LOAD, RELOAD, UPGRADE, UNLOAD \ + }; \ + ERL_NIF_INIT_BODY; \ + return &entry; \ +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_obsolete.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_obsolete.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_obsolete.c 2009-03-12 12:15:49.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_obsolete.c 2009-09-18 15:08:50.000000000 +0100 @@ -33,6 +33,12 @@ /* cut from ../obsolete/driver.h (since it doesn't mix well with other * headers from the emulator). */ +#ifdef __WIN32__ +#ifdef CONST +# undef CONST +#endif +#endif + #if ((defined(__STDC__) || defined(SABER)) && !defined(NO_PROTOTYPE)) || defined(__cplusplus) || defined(USE_PROTOTYPE) # define _USING_PROTOTYPES_ 1 # define _ANSI_ARGS_(x) x diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_port_task.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_port_task.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_port_task.c 2009-06-05 13:53:42.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_port_task.c 2009-11-20 13:32:27.000000000 +0000 @@ -66,7 +66,6 @@ struct ErtsPortTaskQueue_ { ErtsPortTask *first; ErtsPortTask *last; - ErtsRunQueue *runq; Port *port; }; @@ -558,12 +557,6 @@ ASSERT(!erts_port_task_is_scheduled(pthp)); ERTS_PT_CHK_PRES_PORTQ(runq, pp); -#ifdef DEBUG - /* If we have a taskq and not executing, we should be in port run q */ - if (pp->sched.taskq && !pp->sched.exe_taskq) { - ASSERT(pp->sched.prev || runq->ports.start == pp); - } -#endif if (!pp->sched.taskq) { pp->sched.taskq = port_taskq_init(port_taskq_alloc(), pp); diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_process.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_process.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_process.c 2009-06-05 13:52:52.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_process.c 2009-11-20 13:29:26.000000000 +0000 @@ -43,6 +43,8 @@ #define ERTS_RUNQ_CALL_CHECK_BALANCE_REDS \ (ERTS_RUNQ_CHECK_BALANCE_REDS_PER_SCHED/2) +#define ERTS_PROC_MIN_CONTEXT_SWITCH_REDS_COST (CONTEXT_REDS/10) + #define ERTS_SCHED_SLEEP_SPINCOUNT 10000 #define ERTS_WAKEUP_OTHER_LIMIT (100*CONTEXT_REDS/2) @@ -51,6 +53,10 @@ #define ERTS_MAX_CPU_TOPOLOGY_ID ((int) 0xffff) +#if 0 || defined(DEBUG) +#define ERTS_FAKE_SCHED_BIND_PRINT_SORTED_CPU_DATA +#endif + #if defined(DEBUG) && 0 #define HARDDEBUG #else @@ -99,7 +105,7 @@ Uint erts_max_processes = ERTS_DEFAULT_MAX_PROCESSES; Uint erts_process_tab_index_mask; -static int processor_node_topology_enabled; +int erts_sched_thread_suggested_stack_size = -1; #ifdef ERTS_ENABLE_LOCK_CHECK ErtsLcPSDLocks erts_psd_required_locks[ERTS_PSD_SIZE]; @@ -107,6 +113,8 @@ #ifdef ERTS_SMP +int erts_disable_proc_not_running_opt; + #define ERTS_SCHED_CHANGING_ONLINE 1 #define ERTS_SCHED_CHANGING_MULTI_SCHED 2 @@ -139,6 +147,7 @@ int reds; int max_len; } prev_rise; + Uint n; } balance_info; #define ERTS_BLNCE_SAVE_RISE(ACTIVE, MAX_LEN, REDS) \ @@ -171,6 +180,7 @@ erts_smp_rwmtx_t erts_cpu_bind_rwmtx; typedef enum { + ERTS_CPU_BIND_SPREAD, ERTS_CPU_BIND_PROCESSOR_SPREAD, ERTS_CPU_BIND_THREAD_SPREAD, ERTS_CPU_BIND_THREAD_NO_NODE_PROCESSOR_SPREAD, @@ -327,13 +337,13 @@ static void print_function_from_pc(int to, void *to_arg, Eterm* x); static int stack_element_dump(int to, void *to_arg, Process* p, Eterm* sp, int yreg); -static void make_cpudata_id_seq(erts_cpu_topology_t *cpudata, int size); #ifdef ERTS_SMP static void handle_pending_exiters(ErtsProcList *); static void cpu_bind_order_sort(erts_cpu_topology_t *cpudata, int size, - ErtsCpuBindOrder current); + ErtsCpuBindOrder bind_order, + int mk_seq); static void signal_schedulers_bind_change(erts_cpu_topology_t *cpudata, int size); #endif @@ -396,6 +406,7 @@ Uint proc_bits = ERTS_PROC_BITS; #ifdef ERTS_SMP + erts_disable_proc_not_running_opt = 0; erts_init_proc_lock(); #endif @@ -2018,6 +2029,7 @@ erts_smp_runq_unlock(rq); } + balance_info.n++; erts_smp_mtx_unlock(&balance_info.update_mtx); erts_smp_runq_lock(c_rq); @@ -2025,6 +2037,20 @@ #endif /* #ifdef ERTS_SMP */ +Uint +erts_debug_nbalance(void) +{ +#ifdef ERTS_SMP + Uint n; + erts_smp_mtx_lock(&balance_info.update_mtx); + n = balance_info.n; + erts_smp_mtx_unlock(&balance_info.update_mtx); + return n; +#else + return 0; +#endif +} + void erts_early_init_scheduling(void) { @@ -2207,6 +2233,7 @@ balance_info.prev_rise.active_runqs = 0; balance_info.prev_rise.max_len = 0; balance_info.prev_rise.reds = 0; + balance_info.n = 0; if (no_schedulers_online < no_schedulers) { if (erts_common_run_queue) { @@ -2737,62 +2764,68 @@ res = 1; } else { - schdlr_sspnd.changing = ERTS_SCHED_CHANGING_MULTI_SCHED; p->flags |= F_HAVE_BLCKD_MSCHED; if (plocks) { have_unlocked_plocks = 1; erts_smp_proc_unlock(p, plocks); } - if (p->scheduler_data->no == 1) { - res = ERTS_SCHDLR_SSPND_DONE_MSCHED_BLOCKED; - schdlr_sspnd.msb.wait_active = 1; - } - else { - /* - * Yield! Current process needs to migrate - * before bif returns. - */ - res = ERTS_SCHDLR_SSPND_YIELD_DONE_MSCHED_BLOCKED; - schdlr_sspnd.msb.wait_active = 2; - } - erts_smp_atomic_set(&schdlr_sspnd.msb.ongoing, 1); - if (erts_common_run_queue) { - for (ix = 1; ix < schdlr_sspnd.online; ix++) - erts_smp_atomic_set(&ERTS_SCHEDULER_IX(ix)->suspended, 1); - wake_all_schedulers(); + if (schdlr_sspnd.online == 1) { + res = ERTS_SCHDLR_SSPND_DONE_MSCHED_BLOCKED; + ASSERT(erts_smp_atomic_read(&schdlr_sspnd.active) == 1); + ASSERT(p->scheduler_data->no == 1); } else { - erts_smp_mtx_unlock(&schdlr_sspnd.mtx); - erts_smp_mtx_lock(&balance_info.update_mtx); - erts_smp_atomic_set(&balance_info.used_runqs, 1); - for (ix = 0; ix < schdlr_sspnd.online; ix++) { - ErtsRunQueue *rq = ERTS_RUNQ_IX(ix); - erts_smp_runq_lock(rq); - ERTS_RUNQ_RESET_MIGRATION_PATHS(rq, 0x7); - erts_smp_runq_unlock(rq); + schdlr_sspnd.changing = ERTS_SCHED_CHANGING_MULTI_SCHED; + if (p->scheduler_data->no == 1) { + res = ERTS_SCHDLR_SSPND_DONE_MSCHED_BLOCKED; + schdlr_sspnd.msb.wait_active = 1; } - /* - * Evacuate all activities in all other run queues - * into the first run queue. Note order is important, - * online run queues has to be evacuated last. - */ - for (ix = erts_no_run_queues-1; ix >= 1; ix--) - evacuate_run_queue(ERTS_RUNQ_IX(ix), ERTS_RUNQ_IX(0)); - erts_smp_mtx_unlock(&balance_info.update_mtx); - erts_smp_mtx_lock(&schdlr_sspnd.mtx); + else { + /* + * Yield! Current process needs to migrate + * before bif returns. + */ + res = ERTS_SCHDLR_SSPND_YIELD_DONE_MSCHED_BLOCKED; + schdlr_sspnd.msb.wait_active = 2; + } + if (erts_common_run_queue) { + for (ix = 1; ix < schdlr_sspnd.online; ix++) + erts_smp_atomic_set(&ERTS_SCHEDULER_IX(ix)->suspended, 1); + wake_all_schedulers(); + } + else { + erts_smp_mtx_unlock(&schdlr_sspnd.mtx); + erts_smp_mtx_lock(&balance_info.update_mtx); + erts_smp_atomic_set(&balance_info.used_runqs, 1); + for (ix = 0; ix < schdlr_sspnd.online; ix++) { + ErtsRunQueue *rq = ERTS_RUNQ_IX(ix); + erts_smp_runq_lock(rq); + ERTS_RUNQ_RESET_MIGRATION_PATHS(rq, 0x7); + erts_smp_runq_unlock(rq); + } + /* + * Evacuate all activities in all other run queues + * into the first run queue. Note order is important, + * online run queues has to be evacuated last. + */ + for (ix = erts_no_run_queues-1; ix >= 1; ix--) + evacuate_run_queue(ERTS_RUNQ_IX(ix), ERTS_RUNQ_IX(0)); + erts_smp_mtx_unlock(&balance_info.update_mtx); + erts_smp_mtx_lock(&schdlr_sspnd.mtx); + } + erts_smp_activity_begin(ERTS_ACTIVITY_WAIT, + susp_sched_prep_block, + susp_sched_resume_block, + NULL); + while (erts_smp_atomic_read(&schdlr_sspnd.active) + != schdlr_sspnd.msb.wait_active) + erts_smp_cnd_wait(&schdlr_sspnd.cnd, &schdlr_sspnd.mtx); + erts_smp_activity_end(ERTS_ACTIVITY_WAIT, + susp_sched_prep_block, + susp_sched_resume_block, + NULL); } - erts_smp_activity_begin(ERTS_ACTIVITY_WAIT, - susp_sched_prep_block, - susp_sched_resume_block, - NULL); - while (erts_smp_atomic_read(&schdlr_sspnd.active) - != schdlr_sspnd.msb.wait_active) - erts_smp_cnd_wait(&schdlr_sspnd.cnd, &schdlr_sspnd.mtx); - erts_smp_activity_end(ERTS_ACTIVITY_WAIT, - susp_sched_prep_block, - susp_sched_resume_block, - NULL); plp = proclist_create(p); plp->next = schdlr_sspnd.msb.procs; schdlr_sspnd.msb.procs = plp; @@ -3029,6 +3062,7 @@ ethr_thr_opts opts = ETHR_THR_OPTS_DEFAULT_INITER; opts.detached = 1; + opts.suggested_stack_size = erts_sched_thread_suggested_stack_size; if (wanted < 1) wanted = 1; @@ -3083,7 +3117,7 @@ } static int -cpu_processor_spread_order_cmp(const void *vx, const void *vy) +cpu_spread_order_cmp(const void *vx, const void *vy) { erts_cpu_topology_t *x = (erts_cpu_topology_t *) vx; erts_cpu_topology_t *y = (erts_cpu_topology_t *) vy; @@ -3102,6 +3136,25 @@ } static int +cpu_processor_spread_order_cmp(const void *vx, const void *vy) +{ + erts_cpu_topology_t *x = (erts_cpu_topology_t *) vx; + erts_cpu_topology_t *y = (erts_cpu_topology_t *) vy; + + if (x->thread != y->thread) + return x->thread - y->thread; + if (x->processor_node != y->processor_node) + return x->processor_node - y->processor_node; + if (x->core != y->core) + return x->core - y->core; + if (x->node != y->node) + return x->node - y->node; + if (x->processor != y->processor) + return x->processor - y->processor; + return 0; +} + +static int cpu_thread_spread_order_cmp(const void *vx, const void *vy) { erts_cpu_topology_t *x = (erts_cpu_topology_t *) vx; @@ -3130,8 +3183,6 @@ return x->thread - y->thread; if (x->node != y->node) return x->node - y->node; - if (x->processor_node != y->processor_node) - return x->processor_node - y->processor_node; if (x->core != y->core) return x->core - y->core; if (x->processor != y->processor) @@ -3147,8 +3198,6 @@ if (x->node != y->node) return x->node - y->node; - if (x->processor_node != y->processor_node) - return x->processor_node - y->processor_node; if (x->thread != y->thread) return x->thread - y->thread; if (x->core != y->core) @@ -3166,8 +3215,6 @@ if (x->node != y->node) return x->node - y->node; - if (x->processor_node != y->processor_node) - return x->processor_node - y->processor_node; if (x->thread != y->thread) return x->thread - y->thread; if (x->processor != y->processor) @@ -3196,14 +3243,100 @@ return 0; } +static ERTS_INLINE void +make_cpudata_id_seq(erts_cpu_topology_t *cpudata, int size, int no_node) +{ + int ix; + int node = -1; + int processor = -1; + int processor_node = -1; + int processor_node_node = -1; + int core = -1; + int thread = -1; + int old_node = -1; + int old_processor = -1; + int old_processor_node = -1; + int old_core = -1; + int old_thread = -1; + + for (ix = 0; ix < size; ix++) { + if (!no_node || cpudata[ix].node >= 0) { + if (old_node == cpudata[ix].node) + cpudata[ix].node = node; + else { + old_node = cpudata[ix].node; + old_processor = processor = -1; + if (!no_node) + old_processor_node = processor_node = -1; + old_core = core = -1; + old_thread = thread = -1; + if (no_node || cpudata[ix].node >= 0) + cpudata[ix].node = ++node; + } + } + if (old_processor == cpudata[ix].processor) + cpudata[ix].processor = processor; + else { + old_processor = cpudata[ix].processor; + if (!no_node) + processor_node_node = old_processor_node = processor_node = -1; + old_core = core = -1; + old_thread = thread = -1; + cpudata[ix].processor = ++processor; + } + if (no_node && cpudata[ix].processor_node < 0) + old_processor_node = -1; + else { + if (old_processor_node == cpudata[ix].processor_node) { + if (no_node) + cpudata[ix].node = cpudata[ix].processor_node = node; + else { + if (processor_node_node >= 0) + cpudata[ix].node = processor_node_node; + cpudata[ix].processor_node = processor_node; + } + } + else { + old_processor_node = cpudata[ix].processor_node; + old_core = core = -1; + old_thread = thread = -1; + if (no_node) + cpudata[ix].node = cpudata[ix].processor_node = ++node; + else { + cpudata[ix].node = processor_node_node = ++node; + cpudata[ix].processor_node = ++processor_node; + } + } + } + if (!no_node && cpudata[ix].processor_node < 0) + cpudata[ix].processor_node = 0; + if (old_core == cpudata[ix].core) + cpudata[ix].core = core; + else { + old_core = cpudata[ix].core; + old_thread = thread = -1; + cpudata[ix].core = ++core; + } + if (old_thread == cpudata[ix].thread) + cpudata[ix].thread = thread; + else + old_thread = cpudata[ix].thread = ++thread; + } +} + static void cpu_bind_order_sort(erts_cpu_topology_t *cpudata, int size, - ErtsCpuBindOrder current) + ErtsCpuBindOrder bind_order, + int mk_seq) { - if (current != cpu_bind_order && size > 1) { + if (size > 1) { + int no_node = 0; int (*cmp_func)(const void *, const void *); - switch (cpu_bind_order) { + switch (bind_order) { + case ERTS_CPU_BIND_SPREAD: + cmp_func = cpu_spread_order_cmp; + break; case ERTS_CPU_BIND_PROCESSOR_SPREAD: cmp_func = cpu_processor_spread_order_cmp; break; @@ -3211,12 +3344,15 @@ cmp_func = cpu_thread_spread_order_cmp; break; case ERTS_CPU_BIND_THREAD_NO_NODE_PROCESSOR_SPREAD: + no_node = 1; cmp_func = cpu_thread_no_node_processor_spread_order_cmp; break; case ERTS_CPU_BIND_NO_NODE_PROCESSOR_SPREAD: + no_node = 1; cmp_func = cpu_no_node_processor_spread_order_cmp; break; case ERTS_CPU_BIND_NO_NODE_THREAD_SPREAD: + no_node = 1; cmp_func = cpu_no_node_thread_spread_order_cmp; break; case ERTS_CPU_BIND_NO_SPREAD: @@ -3230,10 +3366,32 @@ break; } + if (mk_seq) + make_cpudata_id_seq(cpudata, size, no_node); + qsort(cpudata, size, sizeof(erts_cpu_topology_t), cmp_func); } } +static int +processor_order_cmp(const void *vx, const void *vy) +{ + erts_cpu_topology_t *x = (erts_cpu_topology_t *) vx; + erts_cpu_topology_t *y = (erts_cpu_topology_t *) vy; + + if (x->processor != y->processor) + return x->processor - y->processor; + if (x->node != y->node) + return x->node - y->node; + if (x->processor_node != y->processor_node) + return x->processor_node - y->processor_node; + if (x->core != y->core) + return x->core - y->core; + if (x->thread != y->thread) + return x->thread - y->thread; + return 0; +} + static void check_cpu_bind(ErtsSchedulerData *esdp) { @@ -3287,7 +3445,8 @@ int cpu_ix; if (cpu_bind_order != ERTS_CPU_BIND_NONE) { - cpu_bind_order_sort(cpudata, size, ERTS_CPU_BIND_NO_SPREAD); + + cpu_bind_order_sort(cpudata, size, cpu_bind_order, 1); for (cpu_ix = 0; cpu_ix < size && cpu_ix < erts_no_schedulers; cpu_ix++) if (erts_is_cpu_available(erts_cpuinfo, cpudata[cpu_ix].logical)) @@ -3316,12 +3475,6 @@ #endif } -void -erts_init_enable_processor_node_topology(void) -{ - processor_node_topology_enabled = 1; -} - int erts_init_scheduler_bind_type(char *how) { @@ -3331,7 +3484,9 @@ if (!system_cpudata && !user_cpudata) return ERTS_INIT_SCHED_BIND_TYPE_ERROR_NO_CPU_TOPOLOGY; - if (sys_strcmp(how, "ps") == 0) + if (sys_strcmp(how, "s") == 0) + cpu_bind_order = ERTS_CPU_BIND_SPREAD; + else if (sys_strcmp(how, "ps") == 0) cpu_bind_order = ERTS_CPU_BIND_PROCESSOR_SPREAD; else if (sys_strcmp(how, "ts") == 0) cpu_bind_order = ERTS_CPU_BIND_THREAD_SPREAD; @@ -3408,7 +3563,7 @@ long l; char *c = *str; errno = 0; - if (!isdigit(*c)) + if (!isdigit((unsigned char)*c)) return ERTS_INIT_CPU_TOPOLOGY_INVALID_ID; l = strtol(c, &c, 10); if (errno != 0 || l < 0 || ERTS_MAX_CPU_TOPOLOGY_ID < l) @@ -3416,7 +3571,7 @@ *v = (int) l; if (*c == '-') { c++; - if (!isdigit(*c)) + if (!isdigit((unsigned char)*c)) return ERTS_INIT_CPU_TOPOLOGY_INVALID_ID_RANGE; l = strtol(c, &c, 10); if (errno != 0 || l < 0 || ERTS_MAX_CPU_TOPOLOGY_ID < l) @@ -3528,8 +3683,7 @@ break; case 'n': case 'N': - if (!processor_node_topology_enabled - || h <= ERTS_TOPOLOGY_PROCESSOR) { + if (h <= ERTS_TOPOLOGY_PROCESSOR) { do_node: if (h <= ERTS_TOPOLOGY_NODE) return ERTS_INIT_CPU_TOPOLOGY_INVALID_HIERARCHY; @@ -3590,31 +3744,66 @@ } static int -verify_numa_nodes(erts_cpu_topology_t *cpudata, int size) +verify_topology(erts_cpu_topology_t *cpudata, int size) { - if (size > 0) { - int node = cpudata[0].node; - int processor = cpudata[0].processor; - int no_nodes = cpudata[0].node < 0 && cpudata[0].processor_node < 0; - int i; + int *logical; + int node, processor, no_nodes, i; + + /* Verify logical ids */ + logical = erts_alloc(ERTS_ALC_T_TMP, sizeof(int)*size); + + for (i = 0; i < user_cpudata_size; i++) + logical[i] = user_cpudata[i].logical; + + qsort(logical, user_cpudata_size, sizeof(int), int_cmp); + for (i = 0; i < user_cpudata_size-1; i++) { + if (logical[i] == logical[i+1]) { + erts_free(ERTS_ALC_T_TMP, logical); + return ERTS_INIT_CPU_TOPOLOGY_NOT_UNIQUE_LIDS; + } + } + + erts_free(ERTS_ALC_T_TMP, logical); + + qsort(cpudata, size, sizeof(erts_cpu_topology_t), processor_order_cmp); + + /* Verify unique entities */ + + for (i = 1; i < user_cpudata_size; i++) { + if (user_cpudata[i-1].processor == user_cpudata[i].processor + && user_cpudata[i-1].node == user_cpudata[i].node + && (user_cpudata[i-1].processor_node + == user_cpudata[i].processor_node) + && user_cpudata[i-1].core == user_cpudata[i].core + && user_cpudata[i-1].thread == user_cpudata[i].thread) { + return ERTS_INIT_CPU_TOPOLOGY_NOT_UNIQUE_ENTITIES; + } + } + /* Verify numa nodes */ + node = cpudata[0].node; + processor = cpudata[0].processor; + no_nodes = cpudata[0].node < 0 && cpudata[0].processor_node < 0; for (i = 1; i < size; i++) { if (no_nodes) { if (cpudata[i].node >= 0 || cpudata[i].processor_node >= 0) - return 0; + return ERTS_INIT_CPU_TOPOLOGY_INVALID_NODES; } else { if (cpudata[i].processor == processor && cpudata[i].node != node) - return 0; - if (node < 0 && cpudata[i].processor_node < 0) - return 0; + return ERTS_INIT_CPU_TOPOLOGY_INVALID_NODES; node = cpudata[i].node; processor = cpudata[i].processor; + if (node >= 0 && cpudata[i].processor_node >= 0) + return ERTS_INIT_CPU_TOPOLOGY_INVALID_NODES; + if (node < 0 && cpudata[i].processor_node < 0) + return ERTS_INIT_CPU_TOPOLOGY_INVALID_NODES; } } } - return 1; + + return ERTS_INIT_CPU_TOPOLOGY_OK; } int @@ -3622,7 +3811,6 @@ { ErtsCpuTopEntry cput; int need_size; - int *logical; char *c; int ix; int error = ERTS_INIT_CPU_TOPOLOGY_OK; @@ -3694,58 +3882,12 @@ * user_cpudata_size)); } - /* - * Verify that we got unique logical cpu identifiers - */ - - logical = erts_alloc(ERTS_ALC_T_TMP, - sizeof(int)*user_cpudata_size); - - for (ix = 0; ix < user_cpudata_size; ix++) - logical[ix] = user_cpudata[ix].logical; - - qsort(logical, user_cpudata_size, sizeof(int), int_cmp); - for (ix = 0; ix < user_cpudata_size-1; ix++) { - if (logical[ix] == logical[ix+1]) { - erts_free(ERTS_ALC_T_TMP, logical); - error = ERTS_INIT_CPU_TOPOLOGY_NOT_UNIQUE_LIDS; - goto fail; - } - } - - erts_free(ERTS_ALC_T_TMP, logical); - - qsort(user_cpudata, - user_cpudata_size, - sizeof(erts_cpu_topology_t), - cpu_no_spread_order_cmp); - /* - * Verify that each logical cpu identifier addresses - * an unique entity. - */ - - for (ix = 1; ix < user_cpudata_size; ix++) { - if (user_cpudata[ix-1].node == user_cpudata[ix].node - && user_cpudata[ix-1].processor == user_cpudata[ix].processor - && user_cpudata[ix-1].processor_node == user_cpudata[ix].processor_node - && user_cpudata[ix-1].core == user_cpudata[ix].core - && user_cpudata[ix-1].thread == user_cpudata[ix].thread) { - error = ERTS_INIT_CPU_TOPOLOGY_NOT_UNIQUE_ENTITIES; - goto fail; - } + error = verify_topology(user_cpudata, user_cpudata_size); + if (error == ERTS_INIT_CPU_TOPOLOGY_OK) { + destroy_cpu_top_entry(&cput); + return ERTS_INIT_CPU_TOPOLOGY_OK; } - if (!verify_numa_nodes(user_cpudata, user_cpudata_size)) { - error = ERTS_INIT_CPU_TOPOLOGY_INVALID_NODES; - goto fail; - } - - make_cpudata_id_seq(user_cpudata, user_cpudata_size); - - destroy_cpu_top_entry(&cput); - - return ERTS_INIT_CPU_TOPOLOGY_OK; - fail: if (user_cpudata) erts_free(ERTS_ALC_T_CPUDATA, user_cpudata); @@ -3754,159 +3896,6 @@ return error; } -#define ERTS_INIT_PARSE_TOPOLOGY_STATE {-1,0,-1,0,0} - -static int -parse_topology_term(int state[], - int prev_depth, - erts_cpu_topology_t **topology, - int *size, - int *cpu_ix, - Eterm term) -{ - int depth; - Eterm* tp; - int arity; - - if (is_small(term)) { - Sint cpu_id = signed_val(term); - erts_cpu_topology_t *cpu_entry; - - if (cpu_id < 0 || MAX_SMALL < cpu_id) - return 0; - - if (*size <= *cpu_ix) { - *size += 100; - *topology = erts_realloc(ERTS_ALC_T_TMP, - *topology, - (sizeof(erts_cpu_topology_t) - * (*size))); - } - - cpu_entry = &(*topology)[(*cpu_ix)++]; - - cpu_entry->logical = cpu_id; - cpu_entry->node = state[ERTS_TOPOLOGY_NODE]; - cpu_entry->processor = state[ERTS_TOPOLOGY_PROCESSOR]; - cpu_entry->processor_node = state[ERTS_TOPOLOGY_PROCESSOR_NODE]; - cpu_entry->core = state[ERTS_TOPOLOGY_CORE]; - cpu_entry->thread = state[ERTS_TOPOLOGY_THREAD]; - - return 1; - } - else if (is_tuple(term)) { - int ix, id; - int new_state[ERTS_TOPOLOGY_MAX_DEPTH] = ERTS_INIT_PARSE_TOPOLOGY_STATE; - - tp = tuple_val(term); - arity = arityval(tp[0]); - if (arity < 2) - return 0; - - if (ERTS_IS_ATOM_STR("node", tp[1])) { - if (!processor_node_topology_enabled - || prev_depth < ERTS_TOPOLOGY_NODE) - depth = ERTS_TOPOLOGY_NODE; - else { - depth = ERTS_TOPOLOGY_PROCESSOR_NODE; - new_state[ERTS_TOPOLOGY_NODE] = state[ERTS_TOPOLOGY_NODE]; - new_state[ERTS_TOPOLOGY_PROCESSOR] = state[ERTS_TOPOLOGY_PROCESSOR]; - } - } - else if (ERTS_IS_ATOM_STR("processor", tp[1])) { - depth = ERTS_TOPOLOGY_PROCESSOR; - new_state[ERTS_TOPOLOGY_NODE] = state[ERTS_TOPOLOGY_NODE]; - } - else if (ERTS_IS_ATOM_STR("core", tp[1])) { - depth = ERTS_TOPOLOGY_CORE; - new_state[ERTS_TOPOLOGY_NODE] = state[ERTS_TOPOLOGY_NODE]; - new_state[ERTS_TOPOLOGY_PROCESSOR] = state[ERTS_TOPOLOGY_PROCESSOR]; - new_state[ERTS_TOPOLOGY_PROCESSOR_NODE] = state[ERTS_TOPOLOGY_PROCESSOR_NODE]; - } - else if (ERTS_IS_ATOM_STR("thread", tp[1])) { - depth = ERTS_TOPOLOGY_THREAD; - new_state[ERTS_TOPOLOGY_NODE] = state[ERTS_TOPOLOGY_NODE]; - new_state[ERTS_TOPOLOGY_PROCESSOR] = state[ERTS_TOPOLOGY_PROCESSOR]; - new_state[ERTS_TOPOLOGY_PROCESSOR_NODE] = state[ERTS_TOPOLOGY_PROCESSOR_NODE]; - new_state[ERTS_TOPOLOGY_CORE] = state[ERTS_TOPOLOGY_CORE]; - } - else - return 0; - - if (prev_depth >= depth) - return 0; - - for (ix = 2, id = 0; ix <= arity; ix++, id++) { - new_state[depth] = id; - if (!parse_topology_term(new_state, depth, topology, size, cpu_ix, tp[ix])) - return 0; - } - return 1; - } - - return 0; -} - -static void -make_cpudata_id_seq(erts_cpu_topology_t *cpudata, int size) -{ - int ix; - int node = -1; - int processor = -1; - int core = -1; - int thread = -1; - int old_node = -1; - int old_processor = -1; - int old_processor_node = -1; - int old_core = -1; - int old_thread = -1; - - for (ix = 0; ix < size; ix++) { - if (cpudata[ix].node >= 0) { - if (old_node == cpudata[ix].node) - cpudata[ix].node = node; - else { - old_node = cpudata[ix].node; - old_processor = processor = -1; - old_core = core = -1; - old_thread = thread = -1; - cpudata[ix].node = ++node; - } - } - if (old_processor == cpudata[ix].processor) - cpudata[ix].processor = processor; - else { - old_processor = cpudata[ix].processor; - old_core = core = -1; - old_thread = thread = -1; - cpudata[ix].processor = ++processor; - } - if (cpudata[ix].processor_node < 0) - old_processor_node = -1; - else { - if (old_processor_node == cpudata[ix].processor_node) - cpudata[ix].processor_node = node; - else { - old_processor_node = cpudata[ix].processor_node; - old_core = core = -1; - old_thread = thread = -1; - cpudata[ix].processor_node = ++node; - } - } - if (old_core == cpudata[ix].core) - cpudata[ix].core = core; - else { - old_core = cpudata[ix].core; - old_thread = thread = -1; - cpudata[ix].core = ++core; - } - if (old_thread == cpudata[ix].thread) - cpudata[ix].thread = thread; - else - old_thread = cpudata[ix].thread = ++thread; - } -} - #define ERTS_GET_CPU_TOPOLOGY_ERROR -1 #define ERTS_GET_USED_CPU_TOPOLOGY 0 #define ERTS_GET_DETECTED_CPU_TOPOLOGY 1 @@ -3918,7 +3907,7 @@ erts_set_cpu_topology(Process *c_p, Eterm term) { erts_cpu_topology_t *cpudata = NULL; - int cpudata_size; + int cpudata_size = 0; Eterm res; erts_smp_rwmtx_rwlock(&erts_cpu_bind_rwmtx); @@ -3938,17 +3927,15 @@ sys_memcpy((void *) cpudata, (void *) system_cpudata, sizeof(erts_cpu_topology_t)*cpudata_size); - make_cpudata_id_seq(cpudata, cpudata_size); } } - else if (is_not_tuple(term)) { + else if (is_not_list(term)) { error: res = THE_NON_VALUE; goto done; } else { - int *logical; - int state[ERTS_TOPOLOGY_MAX_DEPTH] = ERTS_INIT_PARSE_TOPOLOGY_STATE; + Eterm list = term; int ix = 0; cpudata_size = 100; @@ -3956,30 +3943,69 @@ (sizeof(erts_cpu_topology_t) * cpudata_size)); - if (!parse_topology_term(state, - -1, - &cpudata, - &cpudata_size, - &ix, - term)) - goto error; - - cpudata_size = ix; - logical = erts_alloc(ERTS_ALC_T_TMP, - sizeof(int)*cpudata_size); + while (is_list(list)) { + Eterm *lp = list_val(list); + Eterm cpu = CAR(lp); + Eterm* tp; + Sint id; + + if (is_not_tuple(cpu)) + goto error; - for (ix = 0; ix < cpudata_size; ix++) - logical[ix] = cpudata[ix].logical; + tp = tuple_val(cpu); - qsort(logical, cpudata_size, sizeof(int), int_cmp); - for (ix = 0; ix < cpudata_size-1; ix++) { - if (logical[ix] == logical[ix+1]) { - erts_free(ERTS_ALC_T_TMP, logical); + if (arityval(tp[0]) != 7 || tp[1] != am_cpu) goto error; + + if (ix >= cpudata_size) { + cpudata_size += 100; + cpudata = erts_realloc(ERTS_ALC_T_TMP, + cpudata, + (sizeof(erts_cpu_topology_t) + * cpudata_size)); } + + id = signed_val(tp[2]); + if (id < -1 || ERTS_MAX_CPU_TOPOLOGY_ID < id) + goto error; + cpudata[ix].node = (int) id; + + id = signed_val(tp[3]); + if (id < -1 || ERTS_MAX_CPU_TOPOLOGY_ID < id) + goto error; + cpudata[ix].processor = (int) id; + + id = signed_val(tp[4]); + if (id < -1 || ERTS_MAX_CPU_TOPOLOGY_ID < id) + goto error; + cpudata[ix].processor_node = (int) id; + + id = signed_val(tp[5]); + if (id < -1 || ERTS_MAX_CPU_TOPOLOGY_ID < id) + goto error; + cpudata[ix].core = (int) id; + + id = signed_val(tp[6]); + if (id < -1 || ERTS_MAX_CPU_TOPOLOGY_ID < id) + goto error; + cpudata[ix].thread = (int) id; + + id = signed_val(tp[7]); + if (id < -1 || ERTS_MAX_CPU_TOPOLOGY_ID < id) + goto error; + cpudata[ix].logical = (int) id; + + list = CDR(lp); + ix++; } - erts_free(ERTS_ALC_T_TMP, logical); + if (is_not_nil(list)) + goto error; + + cpudata_size = ix; + + if (ERTS_INIT_CPU_TOPOLOGY_OK != verify_topology(cpudata, cpudata_size)) + goto error; if (user_cpudata_size != cpudata_size) { if (user_cpudata) @@ -4009,6 +4035,10 @@ bound_schedulers_term(ErtsCpuBindOrder order) { switch (order) { + case ERTS_CPU_BIND_SPREAD: { + ERTS_DECL_AM(spread); + return AM_spread; + } case ERTS_CPU_BIND_PROCESSOR_SPREAD: { ERTS_DECL_AM(processor_spread); return AM_processor_spread; @@ -4073,7 +4103,6 @@ sys_memcpy((void *) *cpudata, (void *) system_cpudata, sizeof(erts_cpu_topology_t)*(*cpudata_size)); - make_cpudata_id_seq(*cpudata, *cpudata_size); } else { *cpudata = NULL; @@ -4105,7 +4134,9 @@ old_cpu_bind_order = cpu_bind_order; - if (ERTS_IS_ATOM_STR("processor_spread", how)) + if (ERTS_IS_ATOM_STR("spread", how)) + cpu_bind_order = ERTS_CPU_BIND_SPREAD; + else if (ERTS_IS_ATOM_STR("processor_spread", how)) cpu_bind_order = ERTS_CPU_BIND_PROCESSOR_SPREAD; else if (ERTS_IS_ATOM_STR("thread_spread", how)) cpu_bind_order = ERTS_CPU_BIND_THREAD_SPREAD; @@ -4156,7 +4187,9 @@ int cpudata_size; Eterm res; - if (ERTS_IS_ATOM_STR("processor_spread", how)) + if (ERTS_IS_ATOM_STR("spread", how)) + fake_cpu_bind_order = ERTS_CPU_BIND_SPREAD; + else if (ERTS_IS_ATOM_STR("processor_spread", how)) fake_cpu_bind_order = ERTS_CPU_BIND_PROCESSOR_SPREAD; else if (ERTS_IS_ATOM_STR("thread_spread", how)) fake_cpu_bind_order = ERTS_CPU_BIND_THREAD_SPREAD; @@ -4185,34 +4218,41 @@ else { int i; Eterm *hp; - int (*cmp_func)(const void *, const void *); - switch (fake_cpu_bind_order) { - case ERTS_CPU_BIND_PROCESSOR_SPREAD: - cmp_func = cpu_processor_spread_order_cmp; - break; - case ERTS_CPU_BIND_THREAD_SPREAD: - cmp_func = cpu_thread_spread_order_cmp; - break; - case ERTS_CPU_BIND_THREAD_NO_NODE_PROCESSOR_SPREAD: - cmp_func = cpu_thread_no_node_processor_spread_order_cmp; - break; - case ERTS_CPU_BIND_NO_NODE_PROCESSOR_SPREAD: - cmp_func = cpu_no_node_processor_spread_order_cmp; - break; - case ERTS_CPU_BIND_NO_NODE_THREAD_SPREAD: - cmp_func = cpu_no_node_thread_spread_order_cmp; - break; - case ERTS_CPU_BIND_NO_SPREAD: - cmp_func = cpu_no_spread_order_cmp; - break; - default: - cmp_func = NULL; - erl_exit(ERTS_ABORT_EXIT, - "Bad cpu bind type: %d\n", - (int) fake_cpu_bind_order); - break; + + cpu_bind_order_sort(cpudata, cpudata_size, fake_cpu_bind_order, 1); + +#ifdef ERTS_FAKE_SCHED_BIND_PRINT_SORTED_CPU_DATA + + erts_fprintf(stderr, "node: "); + for (i = 0; i < cpudata_size; i++) + erts_fprintf(stderr, " %2d", cpudata[i].node); + erts_fprintf(stderr, "\n"); + erts_fprintf(stderr, "processor: "); + for (i = 0; i < cpudata_size; i++) + erts_fprintf(stderr, " %2d", cpudata[i].processor); + erts_fprintf(stderr, "\n"); + if (fake_cpu_bind_order != ERTS_CPU_BIND_THREAD_NO_NODE_PROCESSOR_SPREAD + && fake_cpu_bind_order != ERTS_CPU_BIND_NO_NODE_PROCESSOR_SPREAD + && fake_cpu_bind_order != ERTS_CPU_BIND_NO_NODE_THREAD_SPREAD) { + erts_fprintf(stderr, "processor_node:"); + for (i = 0; i < cpudata_size; i++) + erts_fprintf(stderr, " %2d", cpudata[i].processor_node); + erts_fprintf(stderr, "\n"); } - qsort(cpudata, cpudata_size, sizeof(erts_cpu_topology_t), cmp_func); + erts_fprintf(stderr, "core: "); + for (i = 0; i < cpudata_size; i++) + erts_fprintf(stderr, " %2d", cpudata[i].core); + erts_fprintf(stderr, "\n"); + erts_fprintf(stderr, "thread: "); + for (i = 0; i < cpudata_size; i++) + erts_fprintf(stderr, " %2d", cpudata[i].thread); + erts_fprintf(stderr, "\n"); + erts_fprintf(stderr, "logical: "); + for (i = 0; i < cpudata_size; i++) + erts_fprintf(stderr, " %2d", cpudata[i].logical); + erts_fprintf(stderr, "\n"); +#endif + hp = HAlloc(p, cpudata_size+1); ERTS_BIF_PREP_RET(res, make_tuple(hp)); *hp++ = make_arityval((Uint) cpudata_size); @@ -4247,8 +4287,31 @@ bld_topology_term(Eterm **hpp, Uint *hszp, erts_cpu_topology_t *cpudata, - int size, - int level); + int size) +{ + Eterm res = NIL; + int i; + + if (size == 0) + return am_undefined; + + for (i = size-1; i >= 0; i--) { + res = erts_bld_cons(hpp, + hszp, + erts_bld_tuple(hpp, + hszp, + 7, + am_cpu, + make_small(cpudata[i].node), + make_small(cpudata[i].processor), + make_small(cpudata[i].processor_node), + make_small(cpudata[i].core), + make_small(cpudata[i].thread), + make_small(cpudata[i].logical)), + res); + } + return res; +} static Eterm get_cpu_topology_term(Process *c_p, int type) @@ -4288,12 +4351,7 @@ res = am_undefined; else { size = user_cpudata_size; - cpudata = erts_alloc(ERTS_ALC_T_TMP, - (sizeof(erts_cpu_topology_t) - * size)); - sys_memcpy((void *) cpudata, - (void *) user_cpudata, - sizeof(erts_cpu_topology_t)*size); + cpudata = user_cpudata; } break; default: @@ -4309,8 +4367,7 @@ hsz = 0; bld_topology_term(NULL, &hsz, - cpudata, size, - ERTS_TOPOLOGY_NODE); + cpudata, size); hp = HAlloc(c_p, hsz); @@ -4319,12 +4376,12 @@ #endif res = bld_topology_term(&hp, NULL, - cpudata, size, - ERTS_TOPOLOGY_NODE); + cpudata, size); ASSERT(hp_end == hp); - erts_free(ERTS_ALC_T_TMP, cpudata); + if (cpudata && cpudata != system_cpudata && cpudata != user_cpudata) + erts_free(ERTS_ALC_T_TMP, cpudata); return res; } @@ -4351,143 +4408,26 @@ return res; } -static Eterm -bld_topology_tuple(Eterm **hpp, - Uint *hszp, - erts_cpu_topology_t *cpudata, - int size, - int level, - int offset) -{ -#undef ERTS_INT_VAL_OFFSET__ -#define ERTS_INT_VAL_OFFSET__(P, O) *((int *) (((char *) (P)) + offset)) - char *level_name[] = {"node", "processor", "node", "core", "thread"}; - int srix, ix; - Eterm *sub_res; - Eterm res; - Sint arity = 2; - - for (ix = 1; ix < size; ix++) { - if (ERTS_INT_VAL_OFFSET__(&cpudata[ix-1], offset) - != ERTS_INT_VAL_OFFSET__(&cpudata[ix], offset)) { - arity++; - } - } - - if (!hpp) - sub_res = NULL; - else { - sub_res = erts_alloc(ERTS_ALC_T_TMP, - sizeof(Eterm)*arity); - srix = 0; - sub_res[srix++] = erts_bld_atom(hpp, hszp, level_name[level]); - } - - ix = 0; - while (ix < size) { - int val = ERTS_INT_VAL_OFFSET__(&cpudata[ix], offset); - int eix; - Eterm sres; - for (eix = ix+1; eix < size; eix++) { - int val2 = ERTS_INT_VAL_OFFSET__(&cpudata[eix], offset); - if (val != val2) - break; - } - - sres = bld_topology_term(hpp, hszp, - &cpudata[ix], eix-ix, - level+1); - if (hpp) - sub_res[srix++] = sres; - ix = eix; - } - - res = erts_bld_tuplev(hpp, hszp, arity, sub_res); - if (hpp) - erts_free(ERTS_ALC_T_TMP, sub_res); - return res; - -#undef ERTS_INT_VAL_OFFSET__ -} - -static Eterm -bld_topology_term(Eterm **hpp, - Uint *hszp, - erts_cpu_topology_t *cpudata, - int size, - int level) -{ -#undef ERTS_FIELD_OFFS__ -#define ERTS_FIELD_OFFS__(F) ((int) offsetof(erts_cpu_topology_t, F)) - ASSERT(size > 0); - switch (level) { - case ERTS_TOPOLOGY_NODE: - if (cpudata[0].node != cpudata[size-1].node) - return bld_topology_tuple(hpp, hszp, - cpudata, size, - ERTS_TOPOLOGY_NODE, - ERTS_FIELD_OFFS__(node)); - /* Fall through */ - case ERTS_TOPOLOGY_PROCESSOR: - return bld_topology_tuple(hpp, hszp, - cpudata, size, - ERTS_TOPOLOGY_PROCESSOR, - ERTS_FIELD_OFFS__(processor)); - case ERTS_TOPOLOGY_PROCESSOR_NODE: - if (cpudata[0].processor_node >= 0) { - return bld_topology_tuple(hpp, hszp, - cpudata, size, - ERTS_TOPOLOGY_PROCESSOR_NODE, - ERTS_FIELD_OFFS__(processor_node)); - } - /* Fall through */ - case ERTS_TOPOLOGY_CORE: - if (cpudata[0].core != cpudata[size-1].core) - return bld_topology_tuple(hpp, hszp, - cpudata, size, - ERTS_TOPOLOGY_CORE, - ERTS_FIELD_OFFS__(core)); - /* Fall through */ - case ERTS_TOPOLOGY_THREAD: - if (cpudata[0].thread != cpudata[size-1].thread) - return bld_topology_tuple(hpp, hszp, - cpudata, size, - ERTS_TOPOLOGY_THREAD, - ERTS_FIELD_OFFS__(thread)); - /* Fall through */ - default: - ASSERT(size == 1); - return make_small(cpudata[0].logical); - } -#undef ERTS_GET_FIELD_OFFS__ -} - static void early_cpu_bind_init(void) { - cpu_bind_order = ERTS_CPU_BIND_NONE; - user_cpudata = NULL; user_cpudata_size = 0; - processor_node_topology_enabled = 0; - system_cpudata_size = erts_get_cpu_configured(erts_cpuinfo); + system_cpudata_size = erts_get_cpu_topology_size(erts_cpuinfo); system_cpudata = erts_alloc(ERTS_ALC_T_CPUDATA, (sizeof(erts_cpu_topology_t) * system_cpudata_size)); - if (!erts_get_cpu_topology(erts_cpuinfo, system_cpudata)) { + cpu_bind_order = ERTS_CPU_BIND_NONE; + + if (!erts_get_cpu_topology(erts_cpuinfo, system_cpudata) + || ERTS_INIT_CPU_TOPOLOGY_OK != verify_topology(system_cpudata, + system_cpudata_size)) { erts_free(ERTS_ALC_T_CPUDATA, system_cpudata); system_cpudata = NULL; system_cpudata_size = 0; } - - ASSERT(verify_numa_nodes(system_cpudata, system_cpudata_size)); - - cpu_bind_order = ERTS_CPU_BIND_NO_SPREAD; - cpu_bind_order_sort(system_cpudata, system_cpudata_size, ERTS_CPU_BIND_NONE); - cpu_bind_order = ERTS_CPU_BIND_NONE; - } static void @@ -4737,6 +4677,23 @@ return rp; } +/* + * erts_pid2proc_nropt() is normally the same as + * erts_pid2proc_not_running(). However it is only + * to be used when 'not running' is a pure optimization, + * not a requirement. + */ + +Process * +erts_pid2proc_nropt(Process *c_p, ErtsProcLocks c_p_locks, + Eterm pid, ErtsProcLocks pid_locks) +{ + if (erts_disable_proc_not_running_opt) + return erts_pid2proc(c_p, c_p_locks, pid, pid_locks); + else + return erts_pid2proc_not_running(c_p, c_p_locks, pid, pid_locks); +} + static ERTS_INLINE void do_bif_suspend_process(ErtsSuspendMonitor *smon, Process *suspendee, @@ -5756,6 +5713,30 @@ return old_value; } +#ifdef ERTS_SMP + +static ERTS_INLINE int +prepare_for_sys_schedule(void) +{ + while (!erts_port_task_have_outstanding_io_tasks() + && !erts_smp_atomic_xchg(&doing_sys_schedule, 1)) { + if (!erts_port_task_have_outstanding_io_tasks()) + return 1; + erts_smp_atomic_set(&doing_sys_schedule, 0); + } + return 0; +} + +#else + +static ERTS_INLINE int +prepare_for_sys_schedule(void) +{ + return !erts_port_task_have_outstanding_io_tasks(); +} + +#endif + /* note that P_RUNNING is only set so that we don't try to remove ** running processes from the schedule queue if they exit - a running ** process not being in the schedule queue!! @@ -5790,7 +5771,8 @@ int context_reds; long fcalls; int input_reductions; - int actual_calls; + int actual_reds; + int reds; if (ERTS_USE_MODIFIED_TIMING()) { context_reds = ERTS_MODIFIED_TIMING_CONTEXT_REDS; @@ -5811,7 +5793,7 @@ rq = erts_get_runq_current(esdp); ASSERT(esdp); fcalls = erts_smp_atomic_read(&function_calls); - actual_calls = 0; + actual_reds = reds = 0; erts_smp_runq_lock(rq); } else { #ifdef ERTS_SMP @@ -5823,15 +5805,17 @@ esdp = erts_scheduler_data; ASSERT(esdp->current_process == p); #endif - actual_calls = calls - esdp->virtual_reds; + reds = actual_reds = calls - esdp->virtual_reds; + if (reds < ERTS_PROC_MIN_CONTEXT_SWITCH_REDS_COST) + reds = ERTS_PROC_MIN_CONTEXT_SWITCH_REDS_COST; esdp->virtual_reds = 0; - fcalls = erts_smp_atomic_addtest(&function_calls, actual_calls); + fcalls = erts_smp_atomic_addtest(&function_calls, reds); ASSERT(esdp && esdp == erts_get_scheduler_data()); rq = erts_get_runq_current(esdp); - p->reds += actual_calls; + p->reds += actual_reds; erts_smp_proc_lock(p, ERTS_PROC_LOCK_STATUS); @@ -5875,7 +5859,7 @@ #endif erts_smp_runq_lock(rq); - ERTS_PROC_REDUCTIONS_EXECUTED(rq, p->prio, actual_calls); + ERTS_PROC_REDUCTIONS_EXECUTED(rq, p->prio, reds, actual_reds); esdp->current_process = NULL; #ifdef ERTS_SMP @@ -6016,8 +6000,7 @@ } } - if (!erts_port_task_have_outstanding_io_tasks() - && !erts_smp_atomic_bor(&doing_sys_schedule, 1)) { + if (prepare_for_sys_schedule()) { erts_smp_atomic_set(&function_calls, 0); fcalls = 0; sched_sys_wait(esdp->no, rq); @@ -6035,12 +6018,7 @@ } else #endif /* ERTS_SMP */ - if (fcalls > input_reductions - && !erts_port_task_have_outstanding_io_tasks() -#ifdef ERTS_SMP - && !erts_smp_atomic_bor(&doing_sys_schedule, 1) -#endif - ) { + if (fcalls > input_reductions && prepare_for_sys_schedule()) { int runnable; #ifdef ERTS_SMP @@ -6268,7 +6246,7 @@ ASSERT(p->status != P_SUSPENDED); /* Never run a suspended process */ ACTIVATE(p); - actual_calls = context_reds; + reds = context_reds; if (IS_TRACED(p)) { switch (p->status) { @@ -6294,14 +6272,14 @@ erts_check_my_tracer_proc(p); #endif - if (((MBUF_SIZE(p) + MSO(p).overhead) * MBUF_GC_FACTOR) >= HEAP_SIZE(p)) { - actual_calls -= erts_garbage_collect(p, 0, p->arg_reg, p->arity); - if (actual_calls < 0) { - actual_calls = 1; + if ((FLAGS(p) & F_FORCE_GC) || (MSO(p).overhead >= BIN_VHEAP_SZ(p))) { + reds -= erts_garbage_collect(p, 0, p->arg_reg, p->arity); + if (reds < 0) { + reds = 1; } } - - p->fcalls = actual_calls; + + p->fcalls = reds; ASSERT(IS_ACTIVE(p)); ERTS_SMP_CHK_HAVE_ONLY_MAIN_PROC_LOCK(p); return p; @@ -6758,6 +6736,10 @@ p->heap_sz = sz; p->catches = 0; + p->bin_vheap_sz = H_MIN_SIZE; + p->bin_old_vheap_sz = H_MIN_SIZE; + p->bin_old_vheap = 0; + /* No need to initialize p->fcalls. */ p->current = p->initial+INITIAL_MOD; @@ -7002,6 +6984,10 @@ p->freason = EXC_NULL; p->ftrace = NIL; p->fcalls = 0; + + p->bin_vheap_sz=H_MIN_SIZE; + p->bin_old_vheap_sz=H_MIN_SIZE; + p->bin_old_vheap = 0; #ifdef ERTS_SMP p->u.ptimer = NULL; p->bound_runq = NULL; @@ -8116,7 +8102,7 @@ * cleanup. */ if (p->reg) { - (void) erts_unregister_name(p, ERTS_PROC_LOCK_MAIN, NULL, p->reg->name); + (void) erts_unregister_name(p, ERTS_PROC_LOCK_MAIN, NULL, THE_NON_VALUE); ASSERT(!p->reg); } diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_process.h erlang-13.b.3-dfsg/erts/emulator/beam/erl_process.h --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_process.h 2009-06-05 13:52:52.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_process.h 2009-11-20 13:29:27.000000000 +0000 @@ -84,6 +84,9 @@ extern Export exp_send, exp_receive, exp_timeout; extern Uint erts_no_schedulers; extern Uint erts_no_run_queues; +extern int erts_sched_thread_suggested_stack_size; +#define ERTS_SCHED_THREAD_MIN_STACK_SIZE 4 /* Kilo words */ +#define ERTS_SCHED_THREAD_MAX_STACK_SIZE 8192 /* Kilo words */ #ifdef ERTS_SMP #include "erl_bits.h" @@ -318,19 +321,19 @@ extern ErtsAlignedRunQueue *erts_aligned_run_queues; extern ErtsRunQueue *erts_common_run_queue; -#define ERTS_PROC_REDUCTIONS_EXECUTED(RQ, PRIO, REDS) \ -do { \ - (RQ)->procs.reductions += (REDS); \ - (RQ)->procs.prio_info[p->prio].reds += (REDS); \ - (RQ)->check_balance_reds -= (REDS); \ - (RQ)->wakeup_other_reds += (REDS); \ +#define ERTS_PROC_REDUCTIONS_EXECUTED(RQ, PRIO, REDS, AREDS) \ +do { \ + (RQ)->procs.reductions += (AREDS); \ + (RQ)->procs.prio_info[p->prio].reds += (REDS); \ + (RQ)->check_balance_reds -= (REDS); \ + (RQ)->wakeup_other_reds += (AREDS); \ } while (0) -#define ERTS_PORT_REDUCTIONS_EXECUTED(RQ, REDS) \ -do { \ - (RQ)->ports.info.reds += (REDS); \ - (RQ)->check_balance_reds -= (REDS); \ - (RQ)->wakeup_other_reds += (REDS); \ +#define ERTS_PORT_REDUCTIONS_EXECUTED(RQ, REDS) \ +do { \ + (RQ)->ports.info.reds += (REDS); \ + (RQ)->check_balance_reds -= (REDS); \ + (RQ)->wakeup_other_reds += (REDS); \ } while (0) struct ErtsSchedulerData_ { @@ -469,6 +472,10 @@ # define MSO(p) (p)->off_heap # define MIN_HEAP_SIZE(p) (p)->min_heap_size +# define BIN_VHEAP_SZ(p) (p)->bin_vheap_sz +# define BIN_OLD_VHEAP_SZ(p) (p)->bin_old_vheap_sz +# define BIN_OLD_VHEAP(p) (p)->bin_old_vheap + struct process { /* All fields in the PCB that differs between different heap * architectures, have been moved to the end of this struct to @@ -581,6 +588,10 @@ Uint mbuf_sz; /* Size of all message buffers */ ErtsPSD *psd; /* Rarely used process specific data */ + Uint bin_vheap_sz; /* Virtual heap block size for binaries */ + Uint bin_old_vheap_sz; /* Virtual old heap block size for binaries */ + Uint bin_old_vheap; /* Virtual old heap size for binaries */ + union { #ifdef ERTS_SMP ErtsSmpPTimer *ptimer; @@ -667,18 +678,6 @@ #define MBUF_GC_FACTOR 1 #endif -/* - * The weight of binaries outside the heap (for p->overhead calculation). - */ - -#define BINARY_OVERHEAD_FACTOR 16 - -/* - * Force a garbage collection for the given process. - */ - -#define FORCE_GC(p) ((p)->off_heap.overhead = p->heap_sz) - #define SEQ_TRACE_TOKEN(p) ((p)->seq_trace_token) /* The sequential tracing token is a tuple of size 5: @@ -784,17 +783,17 @@ #define IS_TRACED_FL(p,tf) ( IS_TRACED(p) && ARE_TRACE_FLAGS_ON(p,tf) ) /* process flags */ -#define F_TRAPEXIT (1 << 0) -#define F_INSLPQUEUE (1 << 1) /* Set if in timer queue */ -#define F_TIMO (1 << 2) /* Set if timeout */ -#define F_HEAP_GROW (1 << 3) -#define F_NEED_FULLSWEEP (1 << 4) /* If process has old binaries & funs. */ -#define F_USING_DB (1 << 5) /* If have created tables */ -#define F_DISTRIBUTION (1 << 6) /* Process used in distribution */ -#define F_USING_DDLL (1 << 7) /* Process has used the DDLL interface */ -#define F_HAVE_BLCKD_MSCHED (1 << 8) /* Process has blocked multi-scheduling */ -#define F_P2PNR_RESCHED (1 << 9) /* Process has been rescheduled via - erts_pid2proc_not_running() */ +#define F_TRAPEXIT (1 << 0) +#define F_INSLPQUEUE (1 << 1) /* Set if in timer queue */ +#define F_TIMO (1 << 2) /* Set if timeout */ +#define F_HEAP_GROW (1 << 3) +#define F_NEED_FULLSWEEP (1 << 4) /* If process has old binaries & funs. */ +#define F_USING_DB (1 << 5) /* If have created tables */ +#define F_DISTRIBUTION (1 << 6) /* Process used in distribution */ +#define F_USING_DDLL (1 << 7) /* Process has used the DDLL interface */ +#define F_HAVE_BLCKD_MSCHED (1 << 8) /* Process has blocked multi-scheduling */ +#define F_P2PNR_RESCHED (1 << 9) /* Process has been rescheduled via erts_pid2proc_not_running() */ +#define F_FORCE_GC (1 << 10) /* Force gc at process in-scheduling */ /* process trace_flags */ #define F_SENSITIVE (1 << 0) @@ -943,8 +942,6 @@ int erts_init_cpu_topology(char *topology_str); -void erts_init_enable_processor_node_topology(void); - void erts_pre_init_process(void); void erts_late_init_process(void); void erts_early_init_scheduling(void); @@ -1050,6 +1047,7 @@ Sint erts_test_next_pid(int, Uint); Eterm erts_debug_processes(Process *c_p); Eterm erts_debug_processes_bif_info(Process *c_p); +Uint erts_debug_nbalance(void); #ifdef ERTS_SMP # define ERTS_GET_SCHEDULER_DATA_FROM_PROC(PROC) ((PROC)->scheduler_data) @@ -1423,6 +1421,11 @@ ErtsProcLocks, Eterm, ErtsProcLocks); +Process *erts_pid2proc_nropt(Process *c_p, + ErtsProcLocks c_p_locks, + Eterm pid, + ErtsProcLocks pid_locks); +extern int erts_disable_proc_not_running_opt; #ifdef DEBUG #define ERTS_SMP_ASSERT_IS_NOT_EXITING(P) \ @@ -1448,6 +1451,7 @@ #define ERTS_SMP_ASSERT_IS_NOT_EXITING(P) #define erts_pid2proc_not_running erts_pid2proc +#define erts_pid2proc_nropt erts_pid2proc #endif diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_smp.h erlang-13.b.3-dfsg/erts/emulator/beam/erl_smp.h --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_smp.h 2009-03-12 12:15:52.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_smp.h 2009-11-20 13:32:07.000000000 +0000 @@ -117,9 +117,6 @@ ERTS_GLB_INLINE void erts_smp_cnd_destroy(erts_smp_cnd_t *cnd); ERTS_GLB_INLINE void erts_smp_cnd_wait(erts_smp_cnd_t *cnd, erts_smp_mtx_t *mtx); -ERTS_GLB_INLINE int erts_smp_cnd_timedwait(erts_smp_cnd_t *cnd, - erts_smp_mtx_t *mtx, - erts_smp_thr_timeval_t *time); ERTS_GLB_INLINE void erts_smp_cnd_signal(erts_smp_cnd_t *cnd); ERTS_GLB_INLINE void erts_smp_cnd_broadcast(erts_smp_cnd_t *cnd); ERTS_GLB_INLINE void erts_smp_rwmtx_init_x(erts_smp_rwmtx_t *rwmtx, @@ -418,16 +415,6 @@ #endif } -ERTS_GLB_INLINE int -erts_smp_cnd_timedwait(erts_smp_cnd_t *cnd, erts_smp_mtx_t *mtx, erts_smp_thr_timeval_t *time) -{ -#ifdef ERTS_SMP - return erts_cnd_timedwait(cnd, mtx, time); -#else - return 0; -#endif -} - ERTS_GLB_INLINE void erts_smp_cnd_signal(erts_smp_cnd_t *cnd) { diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_term.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_term.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_term.c 2009-06-05 13:53:18.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_term.c 2009-09-18 15:08:13.000000000 +0100 @@ -26,7 +26,7 @@ #include #include -static void __noreturn +__decl_noreturn static void __noreturn et_abort(const char *expr, const char *file, unsigned line) { #ifdef EXIT_ON_ET_ABORT diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_threads.h erlang-13.b.3-dfsg/erts/emulator/beam/erl_threads.h --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_threads.h 2009-04-16 10:24:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_threads.h 2009-11-20 13:31:18.000000000 +0000 @@ -98,8 +98,8 @@ } erts_rwlock_t; typedef ethr_timeval erts_thr_timeval_t; -void __noreturn erts_thr_fatal_error(int, char *); /* implemented in - erl_init.c */ +__decl_noreturn void __noreturn erts_thr_fatal_error(int, char *); + /* implemented in erl_init.c */ #ifdef ERTS_ENABLE_LOCK_CHECK #define ERTS_REC_MTX_INITER \ @@ -186,8 +186,6 @@ ERTS_GLB_INLINE void erts_cnd_init(erts_cnd_t *cnd); ERTS_GLB_INLINE void erts_cnd_destroy(erts_cnd_t *cnd); ERTS_GLB_INLINE void erts_cnd_wait(erts_cnd_t *cnd, erts_mtx_t *mtx); -ERTS_GLB_INLINE int erts_cnd_timedwait(erts_cnd_t *cnd, erts_mtx_t *mtx, - erts_thr_timeval_t *time); ERTS_GLB_INLINE void erts_cnd_signal(erts_cnd_t *cnd); ERTS_GLB_INLINE void erts_cnd_broadcast(erts_cnd_t *cnd); ERTS_GLB_INLINE void erts_rwmtx_init_x(erts_rwmtx_t *rwmtx, @@ -646,36 +644,6 @@ #endif } -ERTS_GLB_INLINE int -erts_cnd_timedwait(erts_cnd_t *cnd, erts_mtx_t *mtx, erts_thr_timeval_t *time) -{ -#ifdef USE_THREADS - int res; -#ifdef ERTS_ENABLE_LOCK_CHECK - erts_lc_unlock(&mtx->lc); -#endif -#ifdef ERTS_ENABLE_LOCK_COUNT - erts_lcnt_unlock(&mtx->lcnt); -#endif - res = ethr_cond_timedwait(cnd, &mtx->mtx, time); -#ifdef ERTS_ENABLE_LOCK_CHECK - erts_lc_lock(&mtx->lc); -#endif -#ifdef ERTS_ENABLE_LOCK_COUNT - erts_lcnt_lock(&mtx->lcnt); -#endif -#ifdef ERTS_ENABLE_LOCK_COUNT - erts_lcnt_lock_post(&mtx->lcnt); -#endif - if (res != 0 && res != EINTR && res != ETIMEDOUT) - erts_thr_fatal_error(res, - "wait with timeout on condition variable"); - return res; -#else - return 0; -#endif -} - ERTS_GLB_INLINE void erts_cnd_signal(erts_cnd_t *cnd) { diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_time_sup.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_time_sup.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_time_sup.c 2009-06-05 13:53:17.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_time_sup.c 2009-11-20 13:30:53.000000000 +0000 @@ -829,14 +829,12 @@ } } -#if defined(ERTS_TIMER_THREAD) void erts_get_timeval(SysTimeval *tv) { erts_smp_mtx_lock(&erts_timeofday_mtx); get_tolerant_timeofday(tv); erts_smp_mtx_unlock(&erts_timeofday_mtx); } -#endif long erts_get_time(void) diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_trace.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_trace.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_trace.c 2009-06-05 13:53:16.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_trace.c 2009-09-18 15:08:03.000000000 +0100 @@ -547,7 +547,6 @@ /* not smp */ - erts_smp_mtx_lock(&smq_mtx); profiler_port = &erts_port[internal_port_index(profiler)]; @@ -557,7 +556,6 @@ SYS_MSG_TYPE_SYSPROF, message); - erts_smp_mtx_unlock(&smq_mtx); } else { ASSERT(is_internal_pid(profiler) && internal_pid_index(profiler) < erts_max_processes); @@ -2509,13 +2507,16 @@ hp = bp->mem; #endif + erts_smp_mtx_lock(&smq_mtx); + timestamp = TUPLE3(hp, make_small(Ms), make_small(s), make_small(us)); hp += 4; msg = TUPLE6(hp, am_profile, am_scheduler, scheduler_id, state, no_schedulers, timestamp); hp += 7; #ifndef ERTS_SMP profile_send(msg); #else - enqueue_sys_msg(SYS_MSG_TYPE_SYSPROF, NIL, NIL, msg, bp); + enqueue_sys_msg_unlocked(SYS_MSG_TYPE_SYSPROF, NIL, NIL, msg, bp); #endif + erts_smp_mtx_unlock(&smq_mtx); } @@ -2747,6 +2748,7 @@ hp = bp->mem; #endif + erts_smp_mtx_lock(&smq_mtx); GET_NOW(&Ms, &s, &us); timestamp = TUPLE3(hp, make_small(Ms), make_small(s), make_small(us)); hp += 4; @@ -2755,8 +2757,9 @@ #ifndef ERTS_SMP profile_send(msg); #else - enqueue_sys_msg(SYS_MSG_TYPE_SYSPROF, NIL, NIL, msg, bp); + enqueue_sys_msg_unlocked(SYS_MSG_TYPE_SYSPROF, NIL, NIL, msg, bp); #endif + erts_smp_mtx_unlock(&smq_mtx); } /* Process profiling */ @@ -2767,59 +2770,44 @@ Eterm where = am_undefined; #ifndef ERTS_SMP - Eterm local_heap[4 + 4 + 6]; + Eterm local_heap[4 + 6 + 4]; hp = local_heap; - - if (p->current == NULL) { - p->current = find_function_from_pc(p->i); - } - if (p->current == NULL) { - where = make_small(0); - } else { - where = TUPLE3(hp, p->current[0], p->current[1], make_small(p->current[2])); - hp += 4; - } - - GET_NOW(&Ms, &s, &us); - - timestamp = TUPLE3(hp, make_small(Ms), make_small(s), make_small(us)); hp += 4; - msg = TUPLE5(hp, am_profile, p->id, status, where, timestamp); hp += 6; - - profile_send(msg); - #else - /* SMP */ ErlHeapFragment *bp; - Uint hsz; - - if (p->current == NULL) { + Uint hsz = 4 + 6 + 4; +#endif + + if (!p->current) { p->current = find_function_from_pc(p->i); } - if (p->current == NULL) { + +#ifdef ERTS_SMP + if (!p->current) { hsz = 4 + 6; - } else { - hsz = 4 + 6 + 4; } bp = new_message_buffer(hsz); hp = bp->mem; - - if (p->current == NULL) { - where = make_small(0); +#endif + + if (p->current) { + where = TUPLE3(hp, p->current[0], p->current[1], make_small(p->current[2])); hp += 4; } else { - where = TUPLE3(hp, p->current[0], p->current[1], make_small(p->current[2])); - hp += 4; + where = make_small(0); } + + erts_smp_mtx_lock(&smq_mtx); GET_NOW(&Ms, &s, &us); timestamp = TUPLE3(hp, make_small(Ms), make_small(s), make_small(us)); hp += 4; - msg = TUPLE5(hp, am_profile, p->id, status, where, timestamp); - hp += 6; - - enqueue_sys_msg(SYS_MSG_TYPE_SYSPROF, NIL, NIL, msg, bp); + msg = TUPLE5(hp, am_profile, p->id, status, where, timestamp); hp += 6; +#ifndef ERTS_SMP + profile_send(msg); +#else + enqueue_sys_msg_unlocked(SYS_MSG_TYPE_SYSPROF, NIL, NIL, msg, bp); #endif + erts_smp_mtx_unlock(&smq_mtx); } - /* End system_profile tracing */ diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_unicode.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_unicode.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_unicode.c 2009-06-05 13:53:46.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_unicode.c 2009-09-18 15:09:27.000000000 +0100 @@ -1707,8 +1707,11 @@ BIF_ERROR(p, SYSTEM_LIMIT); } if (!must_exist) { - BIF_RET(am_atom_put((char *)bytes, bin_size)); + a = am_atom_put((char *)bytes, bin_size); + erts_free_aligned_binary_bytes(temp_alloc); + BIF_RET(a); } else if (erts_atom_get((char *)bytes, bin_size, &a)) { + erts_free_aligned_binary_bytes(temp_alloc); BIF_RET(a); } else { goto badarg; @@ -1782,11 +1785,13 @@ if (!must_exist) { res = am_atom_put(buf, num_chars); erts_free(ERTS_ALC_T_TMP, (void *) buf); + erts_free_aligned_binary_bytes(temp_alloc); BIF_RET(res); } else { int exists = erts_atom_get(buf, num_chars, &res); erts_free(ERTS_ALC_T_TMP, (void *) buf); if (exists) { + erts_free_aligned_binary_bytes(temp_alloc); BIF_RET(res); } else { goto badarg; diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_zlib.c erlang-13.b.3-dfsg/erts/emulator/beam/erl_zlib.c --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_zlib.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_zlib.c 2009-09-18 15:10:22.000000000 +0100 @@ -0,0 +1,113 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* A sparse wrapper around zlib with erts memory allocation. + * + * erl_zlib_compress2 and erl_zlib_uncompress are erts-adapted versions + * of the original compress2 and uncompress from zlib-1.2.3. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "erl_zlib.h" + +#include "sys.h" +#include "erl_alloc.h" + +voidpf erl_zlib_zalloc_callback (voidpf opaque, unsigned items, unsigned size) +{ + (void) opaque; /* make compiler happy */ + return erts_alloc_fnf(ERTS_ALC_T_ZLIB, items * size); +} + +void erl_zlib_zfree_callback (voidpf opaque, voidpf ptr) +{ + (void) opaque; /* make compiler happy */ + erts_free(ERTS_ALC_T_ZLIB, ptr); +} + + +int ZEXPORT erl_zlib_compress2 (Bytef* dest, uLongf* destLen, + const Bytef* source, uLong sourceLen, + int level) +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + erl_zlib_alloc_init(&stream); + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +int ZEXPORT erl_zlib_uncompress (Bytef* dest, uLongf* destLen, + const Bytef* source, uLong sourceLen) +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + erl_zlib_alloc_init(&stream); + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/erl_zlib.h erlang-13.b.3-dfsg/erts/emulator/beam/erl_zlib.h --- erlang-13.b.1-dfsg/erts/emulator/beam/erl_zlib.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/erl_zlib.h 2009-09-18 15:10:22.000000000 +0100 @@ -0,0 +1,52 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* A sparse wrapper interface around zlib with erts memory allocation. +*/ + +#include + + +/* Initialize zalloc, zfree and opaque of a z_stream +*/ +#define erl_zlib_alloc_init(s) \ + do { /* 'opaque' not used */ \ + (s)->zalloc = erl_zlib_zalloc_callback; \ + (s)->zfree = erl_zlib_zfree_callback; \ + } while (0) + +/* Use instead of compress +*/ +#define erl_zlib_compress(dest,destLen,source,sourceLen) \ + erl_zlib_compress2(dest,destLen,source,sourceLen,Z_DEFAULT_COMPRESSION) + +/* Use instead of compress2 +*/ +int ZEXPORT erl_zlib_compress2 (Bytef* dest, uLongf* destLen, + const Bytef* source, uLong sourceLen, + int level); +/* Use instead of uncompress +*/ +int ZEXPORT erl_zlib_uncompress (Bytef* dest, uLongf* destLen, + const Bytef* source, uLong sourceLen); + + +voidpf erl_zlib_zalloc_callback (voidpf,unsigned,unsigned); +void erl_zlib_zfree_callback (voidpf,voidpf); + diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/export.c erlang-13.b.3-dfsg/erts/emulator/beam/export.c --- erlang-13.b.1-dfsg/erts/emulator/beam/export.c 2009-03-12 12:15:55.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/export.c 2009-09-18 15:06:51.000000000 +0100 @@ -27,8 +27,8 @@ #include "export.h" #include "hash.h" -#define EXPORT_SIZE 500 -#define EXPORT_LIMIT (64*1024) +#define EXPORT_INITIAL_SIZE 4000 +#define EXPORT_LIMIT (512*1024) #define EXPORT_HASH(m,f,a) ((m)*(f)+(a)) @@ -119,7 +119,7 @@ f.free = (HFREE_FUN) export_free; erts_index_init(ERTS_ALC_T_EXPORT_TABLE, &export_table, "export_list", - EXPORT_SIZE, EXPORT_LIMIT, f); + EXPORT_INITIAL_SIZE, EXPORT_LIMIT, f); hash_init(ERTS_ALC_T_EXPORT_TABLE, &secondary_export_table, "secondary_export_table", 50, f); } diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/export.h erlang-13.b.3-dfsg/erts/emulator/beam/export.h --- erlang-13.b.1-dfsg/erts/emulator/beam/export.h 2009-03-12 12:15:55.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/export.h 2009-11-20 13:29:25.000000000 +0000 @@ -43,10 +43,13 @@ * code[1]: Tagged atom for function. * code[2]: Arity (untagged integer). * code[3]: This entry is 0 unless the 'address' field points to it. - * Beam: Threaded code instruction to load function (em_call_error_handler), - * execute BIF (em_apply_bif, em_apply_apply), or call a traced - * function (em_call_traced_function). - * code[4]: Beam: Function pointer to BIF function (for BIFs only). + * Threaded code instruction to load function + * (em_call_error_handler), execute BIF (em_apply_bif, + * em_apply_apply), or call a traced function + * (em_call_traced_function). + * code[4]: Function pointer to BIF function (for BIFs only) + * or pointer to threaded code if the module has an + * on_load function that has not been run yet. * Otherwise: 0. */ Eterm code[5]; diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/external.c erlang-13.b.3-dfsg/erts/emulator/beam/external.c --- erlang-13.b.1-dfsg/erts/emulator/beam/external.c 2009-06-05 13:52:50.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/external.c 2009-09-18 15:06:52.000000000 +0100 @@ -41,7 +41,7 @@ #include "dist.h" #include "erl_binary.h" #include "erl_bits.h" -#include "zlib.h" +#include "erl_zlib.h" #ifdef HIPE #include "hipe_mode_switch.h" @@ -803,7 +803,7 @@ { Sint res; byte *ep; - if (edep->extp+1 >= edep->ext_endp) + if (edep->extp >= edep->ext_endp) goto fail; #ifndef ERTS_DEBUG_USE_DIST_SEP if (edep->flags & ERTS_DIST_EXT_DFLAG_HDR) { @@ -846,7 +846,7 @@ Eterm obj; byte* ep = edep->extp; - if (ep+1 >= edep->ext_endp) + if (ep >= edep->ext_endp) goto error; #ifndef ERTS_DEBUG_USE_DIST_SEP if (edep->flags & ERTS_DIST_EXT_DFLAG_HDR) { @@ -1039,7 +1039,7 @@ uLongf dest_len = get_int32(bytes+1); state->extp = erts_alloc(ERTS_ALC_T_TMP, dest_len); state->exttmp = 1; - if (uncompress(state->extp, &dest_len, bytes+5, size-5) != Z_OK) + if (erl_zlib_uncompress(state->extp, &dest_len, bytes+5, size-5) != Z_OK) goto error; size = (Sint) dest_len; } @@ -1190,7 +1190,7 @@ bin = new_binary(p, NULL, real_size+1); out_bytes = binary_bytes(bin); out_bytes[0] = VERSION_MAGIC; - if (compress2(out_bytes+6, &dest_len, bytes, real_size, level) != Z_OK) { + if (erl_zlib_compress2(out_bytes+6, &dest_len, bytes, real_size, level) != Z_OK) { sys_memcpy(out_bytes+1, bytes, real_size); bin = erts_realloc_binary(bin, real_size+1); } else { @@ -1851,8 +1851,9 @@ break; } case ATOM_CACHE_REF: - if (!(edep->flags & ERTS_DIST_EXT_ATOM_TRANS_TAB)) + if (edep == 0 || (edep->flags & ERTS_DIST_EXT_ATOM_TRANS_TAB) == 0) { goto error; + } n = get_int8(ep); ep++; if (n >= edep->attab.size) @@ -2623,7 +2624,7 @@ decoded_size(byte *ep, byte* endp, int no_refc_bins) { int heap_size = 0; - int terms = 1; + int terms; int atom_extra_skip = 0; Uint n; @@ -2647,7 +2648,15 @@ if ((sz) > endp-ep) { return -1; } \ } while (0) - while (terms-- > 0) { +#define ADDTERMS(n) \ + do { \ + int before = terms; \ + terms += (n); \ + if (terms < before) return -1; \ + } while (0) + + + for (terms=1; terms > 0; terms--) { int tag; CHKSIZE(1); @@ -2739,7 +2748,8 @@ CHKSIZE(4); n = get_int32(ep); ep += 4; - terms += n + 1; + ADDTERMS(n); + terms++; heap_size += 2 * n; break; case SMALL_TUPLE_EXT: @@ -2752,7 +2762,7 @@ CHKSIZE(4); n = get_int32(ep); ep += 4; - terms += n; + ADDTERMS(n); heap_size += n + 1; break; case STRING_EXT: @@ -2797,13 +2807,12 @@ break; case NEW_FUN_EXT: { - int num_free; + unsigned num_free; Uint total_size; - CHKSIZE(4); - total_size = get_int32(ep); - CHKSIZE(total_size); CHKSIZE(1+16+4+4); + total_size = get_int32(ep); + CHKSIZE(total_size); ep += 1+16+4+4; /*FALLTHROUGH*/ @@ -2822,7 +2831,8 @@ return -1; } } - return heap_size; + /* 'terms' may be non-zero if it has wrapped around */ + return terms==0 ? heap_size : -1; #undef SKIP #undef SKIP2 #undef CHKSIZE diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/global.h erlang-13.b.3-dfsg/erts/emulator/beam/global.h --- erlang-13.b.1-dfsg/erts/emulator/beam/global.h 2009-06-05 13:52:51.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/global.h 2009-11-20 13:29:25.000000000 +0000 @@ -75,6 +75,19 @@ The rest is the overflow buffer. */ } LineBuf; +struct enif_environment_t /* ErlNifEnv */ +{ + void* nif_data; + Process* proc; + Eterm* hp; + Eterm* hp_end; + unsigned heap_frag_sz; + int fpe_was_unmasked; +}; +extern void erts_pre_nif(struct enif_environment_t*, Process*, void* nif_data); +extern void erts_post_nif(struct enif_environment_t* env); +extern Eterm erts_nif_taints(Process* p); + /* * Port Specific Data. * @@ -616,17 +629,18 @@ * ... * DESTROY_ESTACK(Stack) */ - -Eterm* erl_grow_stack(Eterm* ptr, size_t new_size); + + +void erl_grow_stack(Eterm** start, Eterm** sp, Eterm** end); #define ESTK_CONCAT(a,b) a##b #define ESTK_SUBSCRIPT(s,i) *((Eterm *)((byte *)ESTK_CONCAT(s,_start) + (i))) -#define DEF_ESTACK_SIZE (16*sizeof(Eterm)) +#define DEF_ESTACK_SIZE (16) #define DECLARE_ESTACK(s) \ - Eterm ESTK_CONCAT(s,_default_stack)[DEF_ESTACK_SIZE/sizeof(Eterm)]; \ + Eterm ESTK_CONCAT(s,_default_stack)[DEF_ESTACK_SIZE]; \ Eterm* ESTK_CONCAT(s,_start) = ESTK_CONCAT(s,_default_stack); \ - size_t ESTK_CONCAT(s,_sp) = 0; \ - size_t ESTK_CONCAT(s,_size) = DEF_ESTACK_SIZE + Eterm* ESTK_CONCAT(s,_sp) = ESTK_CONCAT(s,_start); \ + Eterm* ESTK_CONCAT(s,_end) = ESTK_CONCAT(s,_start) + DEF_ESTACK_SIZE #define DESTROY_ESTACK(s) \ do { \ @@ -635,22 +649,41 @@ } \ } while(0) -#define ESTACK_PUSH(s, x) \ -do { \ - if (ESTK_CONCAT(s,_sp) == ESTK_CONCAT(s,_size)) { \ - ESTK_CONCAT(s,_size) *= 2; \ - ESTK_CONCAT(s,_start) = \ - erl_grow_stack(ESTK_CONCAT(s,_start), ESTK_CONCAT(s,_size)); \ - } \ - ESTK_SUBSCRIPT(s,ESTK_CONCAT(s,_sp)) = (x); \ - ESTK_CONCAT(s,_sp) += sizeof(Eterm); \ +#define ESTACK_PUSH(s, x) \ +do { \ + if (ESTK_CONCAT(s,_sp) == ESTK_CONCAT(s,_end)) { \ + erl_grow_stack(&ESTK_CONCAT(s,_start), &ESTK_CONCAT(s,_sp), \ + &ESTK_CONCAT(s,_end)); \ + } \ + *ESTK_CONCAT(s,_sp)++ = (x); \ } while(0) -#define ESTACK_COUNT(s) (ESTK_CONCAT(s,_sp) / sizeof(Eterm)) +#define ESTACK_PUSH2(s, x, y) \ +do { \ + if (ESTK_CONCAT(s,_sp) > ESTK_CONCAT(s,_end) - 2) { \ + erl_grow_stack(&ESTK_CONCAT(s,_start), &ESTK_CONCAT(s,_sp), \ + &ESTK_CONCAT(s,_end)); \ + } \ + *ESTK_CONCAT(s,_sp)++ = (x); \ + *ESTK_CONCAT(s,_sp)++ = (y); \ +} while(0) + +#define ESTACK_PUSH3(s, x, y, z) \ +do { \ + if (ESTK_CONCAT(s,_sp) > ESTK_CONCAT(s,_end) - 3) { \ + erl_grow_stack(&ESTK_CONCAT(s,_start), &ESTK_CONCAT(s,_sp), \ + &ESTK_CONCAT(s,_end)); \ + } \ + *ESTK_CONCAT(s,_sp)++ = (x); \ + *ESTK_CONCAT(s,_sp)++ = (y); \ + *ESTK_CONCAT(s,_sp)++ = (z); \ +} while(0) + +#define ESTACK_COUNT(s) (ESTK_CONCAT(s,_sp) - ESTK_CONCAT(s,_start)) + +#define ESTACK_ISEMPTY(s) (ESTK_CONCAT(s,_sp) == ESTK_CONCAT(s,_start)) +#define ESTACK_POP(s) (*(--ESTK_CONCAT(s,_sp))) -#define ESTACK_ISEMPTY(s) (ESTK_CONCAT(s,_sp) == 0) -#define ESTACK_POP(s) \ -((ESTK_CONCAT(s,_sp) -= sizeof(Eterm)), ESTK_SUBSCRIPT(s,ESTK_CONCAT(s,_sp))) /* port status flags */ @@ -747,8 +780,8 @@ /* config.c */ -void __noreturn erl_exit(int n, char*, ...); -void __noreturn erl_exit0(char *, int, int n, char*, ...); +__decl_noreturn void __noreturn erl_exit(int n, char*, ...); +__decl_noreturn void __noreturn erl_exit0(char *, int, int n, char*, ...); void erl_error(char*, va_list); #define ERL_EXIT0(n,f) erl_exit0(__FILE__, __LINE__, n, f) @@ -1340,9 +1373,7 @@ void erts_get_now_cpu(Uint* megasec, Uint* sec, Uint* microsec); #endif -#if defined(ERTS_TIMER_THREAD) void erts_get_timeval(SysTimeval *tv); -#endif long erts_get_time(void); extern SysTimeval erts_first_emu_time; @@ -1381,14 +1412,16 @@ int list_length(Eterm); Export* erts_find_function(Eterm, Eterm, unsigned int); int erts_is_builtin(Eterm, Eterm, int); -Uint32 make_broken_hash(Eterm, Uint32); +Uint32 make_broken_hash(Eterm); Uint32 block_hash(byte *, unsigned, Uint32); Uint32 make_hash2(Eterm); -Uint32 make_hash(Eterm, Uint32); +Uint32 make_hash(Eterm); Eterm erts_bld_atom(Uint **hpp, Uint *szp, char *str); Eterm erts_bld_uint(Uint **hpp, Uint *szp, Uint ui); +Eterm erts_bld_uint64(Uint **hpp, Uint *szp, Uint64 ui64); +Eterm erts_bld_sint64(Uint **hpp, Uint *szp, Sint64 si64); Eterm erts_bld_cons(Uint **hpp, Uint *szp, Eterm car, Eterm cdr); Eterm erts_bld_tuple(Uint **hpp, Uint *szp, Uint arity, ...); Eterm erts_bld_tuplev(Uint **hpp, Uint *szp, Uint arity, Eterm terms[]); diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/io.c erlang-13.b.3-dfsg/erts/emulator/beam/io.c --- erlang-13.b.1-dfsg/erts/emulator/beam/io.c 2009-06-05 13:52:51.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/io.c 2009-11-20 13:29:25.000000000 +0000 @@ -1526,7 +1526,7 @@ pb->flags = 0; hp += PROC_BIN_SIZE; - ohp->overhead += pb->size / BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + ohp->overhead += pb->size / sizeof(Eterm); listp = make_binary(pb); } @@ -1676,8 +1676,7 @@ pb->flags = 0; hp += PROC_BIN_SIZE; - ohp->overhead += iov->iov_len / BINARY_OVERHEAD_FACTOR / - sizeof(Eterm); + ohp->overhead += iov->iov_len / sizeof(Eterm); if (listp == NIL) { /* compatible with deliver_bin_message */ listp = make_binary(pb); @@ -2208,8 +2207,7 @@ pb->val = ErlDrvBinary2Binary(dbin); pb->bytes = (byte*) dbin->orig_bytes; pb->flags = 0; - MSO(p).overhead += dbin->orig_size - / BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + MSO(p).overhead += dbin->orig_size / sizeof(Eterm); return make_binary(pb); } port_resp = dbin->orig_bytes; @@ -2701,7 +2699,7 @@ int len) { #define ERTS_DDT_FAIL do { res = -1; goto done; } while (0) - int need = 0; + Uint need = 0; int depth = 0; int res; Eterm *hp = NULL, *hp_start = NULL, *hp_end = NULL; @@ -2761,6 +2759,18 @@ ptr++; depth++; break; + case ERL_DRV_INT64: /* pointer to signed 64-bit int argument */ + ERTS_DDT_CHK_ENOUGH_ARGS(1); + erts_bld_sint64(NULL, &need, *((Sint64 *) ptr[0])); + ptr++; + depth++; + break; + case ERL_DRV_UINT64: /* pointer to unsigned 64-bit int argument */ + ERTS_DDT_CHK_ENOUGH_ARGS(1); + erts_bld_uint64(NULL, &need, *((Uint64 *) ptr[0])); + ptr++; + depth++; + break; case ERL_DRV_PORT: /* port argument */ ERTS_DDT_CHK_ENOUGH_ARGS(1); if (is_not_internal_port(ptr[0])) ERTS_DDT_FAIL; @@ -2931,6 +2941,16 @@ ptr++; break; + case ERL_DRV_INT64: /* pointer to unsigned 64-bit int argument */ + mess = erts_bld_sint64(&hp, NULL, *((Sint64 *) ptr[0])); + ptr++; + break; + + case ERL_DRV_UINT64: /* pointer to unsigned 64-bit int argument */ + mess = erts_bld_uint64(&hp, NULL, *((Uint64 *) ptr[0])); + ptr++; + break; + case ERL_DRV_PORT: /* port argument */ mess = ptr[0]; ptr++; @@ -2963,8 +2983,7 @@ pb->flags = 0; mess = make_binary(pb); hp += PROC_BIN_SIZE; - ohp->overhead += pb->size / - BINARY_OVERHEAD_FACTOR / sizeof(Eterm); + ohp->overhead += pb->size / sizeof(Eterm); } ptr += 3; break; @@ -3001,9 +3020,7 @@ pbp->val = bp; pbp->bytes = (byte*) bp->orig_bytes; pbp->flags = 0; - ohp->overhead += (pbp->size - / BINARY_OVERHEAD_FACTOR - / sizeof(Eterm)); + ohp->overhead += (pbp->size / sizeof(Eterm)); mess = make_binary(pbp); } ptr += 2; diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/module.c erlang-13.b.3-dfsg/erts/emulator/beam/module.c --- erlang-13.b.1-dfsg/erts/emulator/beam/module.c 2009-03-12 12:15:58.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/module.c 2009-11-20 13:29:26.000000000 +0000 @@ -66,6 +66,12 @@ obj->code_length = 0; obj->old_code_length = 0; obj->slot.index = -1; + obj->nif.handle = NULL; + obj->old_nif.handle = NULL; + obj->nif.entry = NULL; + obj->old_nif.entry = NULL; + obj->nif.data = NULL; + obj->old_nif.data = NULL; return obj; } diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/module.h erlang-13.b.3-dfsg/erts/emulator/beam/module.h --- erlang-13.b.1-dfsg/erts/emulator/beam/module.h 2009-03-12 12:15:58.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/module.h 2009-11-20 13:29:26.000000000 +0000 @@ -24,6 +24,12 @@ #include "index.h" #endif +struct erl_module_nif { + void* handle; + struct enif_entry_t* entry; + void* data; +}; + typedef struct erl_module { IndexSlot slot; /* Must be located at top of struct! */ int module; /* Atom index for module (not tagged). */ @@ -33,6 +39,8 @@ int code_length; /* Length of loaded code in bytes. */ int old_code_length; /* Length of old loaded code in bytes */ unsigned catches, old_catches; + struct erl_module_nif nif; + struct erl_module_nif old_nif; } Module; Module* erts_get_module(Eterm mod); diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/ops.tab erlang-13.b.3-dfsg/erts/emulator/beam/ops.tab --- erlang-13.b.1-dfsg/erts/emulator/beam/ops.tab 2009-03-12 12:15:58.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/ops.tab 2009-11-20 13:30:24.000000000 +0000 @@ -444,6 +444,7 @@ normal_exit continue_exit apply_bif +call_nif call_error_handler error_action_code call_traced_function @@ -746,6 +747,14 @@ call_ext_only Ar=u==2 Bif=u$bif:erlang:process_info/2 => allocate u Ar | i_call_ext Bif | deallocate_return u # +# load_nif/2 also needs to know calling function like process_info +# +call_ext u==2 Bif=u$bif:erlang:load_nif/2 => i_call_ext Bif +call_ext_last u==2 Bif=u$bif:erlang:load_nif/2 D => i_call_ext Bif | deallocate_return D +call_ext_only Ar=u==2 Bif=u$bif:erlang:load_nif/2 => allocate u Ar | i_call_ext Bif | deallocate_return u + + +# # The apply/2 and apply/3 BIFs are instructions. # @@ -1414,3 +1423,8 @@ i_gc_bif1 Fail Bif V=q Live D => move V x | i_gc_bif1 Fail Bif x Live D i_gc_bif1 j I s I d + +# +# R13B03 +# +on_load diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/packet_parser.c erlang-13.b.3-dfsg/erts/emulator/beam/packet_parser.c --- erlang-13.b.1-dfsg/erts/emulator/beam/packet_parser.c 2009-03-12 12:15:58.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/packet_parser.c 2009-09-18 15:09:26.000000000 +0100 @@ -470,10 +470,14 @@ return 0; remain: - if (max_plen != 0 && plen > max_plen) { - return -1; - } - return hlen+plen; + { + int tlen = hlen + plen; + if ((max_plen != 0 && plen > max_plen) + || tlen < (int)hlen) { /* wrap-around protection */ + return -1; + } + return tlen; + } done: return plen; diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/register.c erlang-13.b.3-dfsg/erts/emulator/beam/register.c --- erlang-13.b.1-dfsg/erts/emulator/beam/register.c 2009-03-12 12:15:59.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/beam/register.c 2009-09-18 15:06:55.000000000 +0100 @@ -484,8 +484,20 @@ reg_safe_write_lock(c_p, ¤t_c_p_locks); #endif - + r.name = name; + if (is_non_value(name)) { + /* Unregister current process name */ + ASSERT(c_p); + if (c_p->reg) + r.name = c_p->reg->name; + else { + /* Name got unregistered while main lock was released */ + res = 0; + goto done; + } + } + if ((rp = (RegProc*) hash_get(&process_reg, (void*) &r)) != NULL) { if (rp->pt) { #ifdef ERTS_SMP @@ -503,7 +515,7 @@ erts_smp_proc_unlock(c_p, current_c_p_locks); current_c_p_locks = 0; } - reg_read_unlock(); + reg_write_unlock(); port = erts_id2port(id, NULL, 0); goto restart; } @@ -514,7 +526,7 @@ rp->pt->reg = NULL; if (IS_TRACED_FL(port, F_TRACE_PORTS)) { - trace_port(port, am_unregister, name); + trace_port(port, am_unregister, r.name); } } else if (rp->p) { @@ -534,13 +546,15 @@ erts_smp_proc_unlock(rp->p, ERTS_PROC_LOCK_MAIN); #endif if (IS_TRACED_FL(p, F_TRACE_PROCS)) { - trace_proc(c_p, p, am_unregister, name); + trace_proc(c_p, p, am_unregister, r.name); } } hash_erase(&process_reg, (void*) &r); res = 1; } + done: + reg_write_unlock(); if (c_prt != port) { if (port) diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/sys.h erlang-13.b.3-dfsg/erts/emulator/beam/sys.h --- erlang-13.b.1-dfsg/erts/emulator/beam/sys.h 2009-06-05 13:53:03.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/sys.h 2009-11-20 13:29:55.000000000 +0000 @@ -202,7 +202,12 @@ # define printf real_printf #endif +/* In VC++, noreturn is a declspec that has to be before the types, + * but in GNUC it is an att ribute to be placed between return type + * and function name, hence __decl_noreturn __noreturn + */ #if __GNUC__ +# define __decl_noreturn # define __noreturn __attribute__((noreturn)) # undef __deprecated # if __GNUC__ >= 3 @@ -211,7 +216,13 @@ # define __deprecated # endif #else -# define __noreturn +# if defined(__WIN32__) && defined(_MSC_VER) +# define __noreturn +# define __decl_noreturn __declspec(noreturn) +# else +# define __noreturn +# define __decl_noreturn +# endif # define __deprecated #endif @@ -449,7 +460,7 @@ extern erts_cpu_info_t *erts_cpuinfo; /* erl_init.c */ -void __noreturn erl_exit(int n, char*, ...); +__decl_noreturn void __noreturn erl_exit(int n, char*, ...); /* Some special erl_exit() codes: */ #define ERTS_INTR_EXIT INT_MIN /* called from signal handler */ @@ -458,9 +469,10 @@ #ifndef ERTS_SMP -EXTERN_FUNCTION(int, check_async_ready, (_VOID_)); +int check_async_ready(void); #ifdef USE_THREADS -EXTERN_FUNCTION(void, sys_async_ready, (int hndl)); +void sys_async_ready(int hndl); +int erts_register_async_ready_callback(void (*funcp)(void)); #endif #endif @@ -532,6 +544,7 @@ int redir_stderr; /* Redirect stderr to stdout: TRUE/FALSE. */ int hide_window; /* Hide this windows (Windows). */ int exit_status; /* Report exit status of subprocess. */ + int overlapped_io; /* Only has effect on windows NT et al */ char *envir; /* Environment of the port process, */ /* in Windows format. */ char **argv; /* Argument vector in Unix'ish format. */ @@ -581,16 +594,27 @@ /* Dynamic library/driver loading */ +typedef struct { + char* str; +}ErtsSysDdllError; +#define ERTS_SYS_DDLL_ERROR_INIT {NULL} +extern void erts_sys_ddll_free_error(ErtsSysDdllError*); extern void erl_sys_ddll_init(void); /* to initialize mutexes etc */ -extern int erts_sys_ddll_open(char *path, void **handle); -extern int erts_sys_ddll_open_noext(char *path, void **handle); +extern int erts_sys_ddll_open2(char *path, void **handle, ErtsSysDdllError*); +#define erts_sys_ddll_open(P,H) erts_sys_ddll_open2(P,H,NULL) +extern int erts_sys_ddll_open_noext(char *path, void **handle, ErtsSysDdllError*); extern int erts_sys_ddll_load_driver_init(void *handle, void **function); -extern int erts_sys_ddll_close(void *handle); +extern int erts_sys_ddll_load_nif_init(void *handle, void **function,ErtsSysDdllError*); +extern int erts_sys_ddll_close2(void *handle, ErtsSysDdllError*); +#define erts_sys_ddll_close(H) erts_sys_ddll_close2(H,NULL) extern void *erts_sys_ddll_call_init(void *function); -extern int erts_sys_ddll_sym(void *handle, char *name, void **function); +extern void *erts_sys_ddll_call_nif_init(void *function); +extern int erts_sys_ddll_sym2(void *handle, char *name, void **function, ErtsSysDdllError*); +#define erts_sys_ddll_sym(H,N,F) erts_sys_ddll_sym2(H,N,F,NULL) extern char *erts_sys_ddll_error(int code); + /* * System interfaces for startup/sae code (functions found in respective sys.c) */ diff -Nru erlang-13.b.1-dfsg/erts/emulator/beam/utils.c erlang-13.b.3-dfsg/erts/emulator/beam/utils.c --- erlang-13.b.1-dfsg/erts/emulator/beam/utils.c 2009-06-05 13:52:53.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/beam/utils.c 2009-11-20 13:29:28.000000000 +0000 @@ -196,17 +196,21 @@ /* * Helper function for the ESTACK macros defined in global.h. */ - -Eterm* -erl_grow_stack(Eterm* ptr, size_t new_size) +void +erl_grow_stack(Eterm** start, Eterm** sp, Eterm** end) { + Uint old_size = (*end - *start); + Uint new_size = old_size * 2; + Uint sp_offs = *sp - *start; if (new_size > 2 * DEF_ESTACK_SIZE) { - return erts_realloc(ERTS_ALC_T_ESTACK, (void *) ptr, new_size); + *start = erts_realloc(ERTS_ALC_T_ESTACK, (void *) *start, new_size*sizeof(Eterm)); } else { - Eterm* new_ptr = erts_alloc(ERTS_ALC_T_ESTACK, new_size); - sys_memcpy(new_ptr, ptr, new_size/2); - return new_ptr; + Eterm* new_ptr = erts_alloc(ERTS_ALC_T_ESTACK, new_size*sizeof(Eterm)); + sys_memcpy(new_ptr, *start, old_size*sizeof(Eterm)); + *start = new_ptr; } + *end = *start + new_size; + *sp = *start + sp_offs; } /* CTYPE macros */ @@ -359,6 +363,41 @@ } Eterm +erts_bld_uint64(Uint **hpp, Uint *szp, Uint64 ui64) +{ + Eterm res = THE_NON_VALUE; + if (IS_USMALL(0, ui64)) { + if (hpp) + res = make_small((Uint) ui64); + } + else { + if (szp) + *szp = ERTS_UINT64_HEAP_SIZE(ui64); + if (hpp) + res = erts_uint64_to_big(ui64, hpp); + } + return res; +} + +Eterm +erts_bld_sint64(Uint **hpp, Uint *szp, Sint64 si64) +{ + Eterm res = THE_NON_VALUE; + if (IS_SSMALL(si64)) { + if (hpp) + res = make_small((Sint) si64); + } + else { + if (szp) + *szp = ERTS_SINT64_HEAP_SIZE(si64); + if (hpp) + res = erts_sint64_to_big(si64, hpp); + } + return res; +} + + +Eterm erts_bld_cons(Uint **hpp, Uint *szp, Eterm car, Eterm cdr) { Eterm res = THE_NON_VALUE; @@ -678,9 +717,19 @@ return hash; } -Uint32 -make_hash(Eterm term, Uint32 hash) +Uint32 make_hash(Eterm term_arg) { + DECLARE_ESTACK(stack); + Eterm term = term_arg; + Eterm hash = 0; + unsigned op; + + /* Must not collide with the real tag_val_def's: */ +#define MAKE_HASH_TUPLE_OP 0x10 +#define MAKE_HASH_FUN_OP 0x11 +#define MAKE_HASH_CDR_PRE_OP 0x12 +#define MAKE_HASH_CDR_POST_OP 0x13 + /* ** Convenience macro for calculating a bytewise hash on an unsigned 32 bit ** integer. @@ -697,20 +746,10 @@ (x >> 24)); \ } while(0) -#define UINT32_HASH_RET(Expr, Prime1, Prime2) \ - do { \ - UINT32_HASH_STEP(Expr, Prime1); \ - return hash * (Prime2); \ - } while(0) - -#define SINT32_HASH_RET(Expr, Prime1, Prime2, Prime3) \ - do { \ - Sint32 y = (Sint32) Expr; \ - if (y < 0) { \ - UINT32_HASH_RET(-y, Prime1, Prime3); \ - } \ - UINT32_HASH_RET(y, Prime1, Prime2); \ - } while(0) +#define UINT32_HASH_RET(Expr, Prime1, Prime2) \ + UINT32_HASH_STEP(Expr, Prime1); \ + hash = hash * (Prime2); \ + break /* @@ -721,15 +760,18 @@ * Note, for the simple 64bit port, not utilizing the * larger word size this function will work without modification. */ +tail_recur: + op = tag_val_def(term); - switch (tag_val_def(term)) { + for (;;) { + switch (op) { case NIL_DEF: - return hash*FUNNY_NUMBER3 + 1; - + hash = hash*FUNNY_NUMBER3 + 1; + break; case ATOM_DEF: - return hash*FUNNY_NUMBER1 + + hash = hash*FUNNY_NUMBER1 + (atom_tab(atom_val(term))->slot.bucket.hvalue); - + break; case SMALL_DEF: { Sint y1 = signed_val(term); @@ -740,17 +782,17 @@ if (y2 >> 32) UINT32_HASH_STEP(y2 >> 32, FUNNY_NUMBER2); #endif - return hash * (y1 < 0 ? FUNNY_NUMBER4 : FUNNY_NUMBER3); + hash *= (y1 < 0 ? FUNNY_NUMBER4 : FUNNY_NUMBER3); + break; } - case BINARY_DEF: { Uint sz = binary_size(term); hash = hash_binary_bytes(term, sz, hash); - return hash*FUNNY_NUMBER4 + sz; + hash = hash*FUNNY_NUMBER4 + sz; + break; } - case EXPORT_DEF: { Export* ep = (Export *) (export_val(term))[1]; @@ -760,68 +802,78 @@ (atom_tab(atom_val(ep->code[0]))->slot.bucket.hvalue); hash = hash*FUNNY_NUMBER1 + (atom_tab(atom_val(ep->code[1]))->slot.bucket.hvalue); - return hash; + break; } case FUN_DEF: { ErlFunThing* funp = (ErlFunThing *) fun_val(term); Uint num_free = funp->num_free; - Uint i; hash = hash * FUNNY_NUMBER10 + num_free; hash = hash*FUNNY_NUMBER1 + (atom_tab(atom_val(funp->fe->module))->slot.bucket.hvalue); hash = hash*FUNNY_NUMBER2 + funp->fe->old_index; hash = hash*FUNNY_NUMBER2 + funp->fe->old_uniq; - for (i = 0; i < num_free; i++) { - hash = make_hash(funp->env[i], hash); + if (num_free > 0) { + if (num_free > 1) { + ESTACK_PUSH3(stack, (Eterm) &funp->env[1], (num_free-1), MAKE_HASH_FUN_OP); + } + term = funp->env[0]; + goto tail_recur; } - return hash; + break; } - case PID_DEF: UINT32_HASH_RET(internal_pid_number(term),FUNNY_NUMBER5,FUNNY_NUMBER6); case EXTERNAL_PID_DEF: UINT32_HASH_RET(external_pid_number(term),FUNNY_NUMBER5,FUNNY_NUMBER6); - case PORT_DEF: UINT32_HASH_RET(internal_port_number(term),FUNNY_NUMBER9,FUNNY_NUMBER10); case EXTERNAL_PORT_DEF: UINT32_HASH_RET(external_port_number(term),FUNNY_NUMBER9,FUNNY_NUMBER10); - case REF_DEF: UINT32_HASH_RET(internal_ref_numbers(term)[0],FUNNY_NUMBER9,FUNNY_NUMBER10); case EXTERNAL_REF_DEF: UINT32_HASH_RET(external_ref_numbers(term)[0],FUNNY_NUMBER9,FUNNY_NUMBER10); - case FLOAT_DEF: { FloatDef ff; GET_DOUBLE(term, ff); - return hash*FUNNY_NUMBER6 + (ff.fw[0] ^ ff.fw[1]); + hash = hash*FUNNY_NUMBER6 + (ff.fw[0] ^ ff.fw[1]); + break; } - break; + case MAKE_HASH_CDR_PRE_OP: + term = ESTACK_POP(stack); + if (is_not_list(term)) { + ESTACK_PUSH(stack, MAKE_HASH_CDR_POST_OP); + goto tail_recur; + } + /* fall through */ case LIST_DEF: { Eterm* list = list_val(term); - while(1) { - if (is_byte(*list)) { - /* Optimization for strings. - ** Note that this hash is different from a 'small' hash, - ** as multiplications on a Sparc is so slow. - */ - - hash = hash*FUNNY_NUMBER2 + unsigned_val(*list); - } else { - hash = make_hash(*list, hash); - } - if (is_not_list(CDR(list))) - return make_hash(CDR(list),hash)*FUNNY_NUMBER8; + while(is_byte(*list)) { + /* Optimization for strings. + ** Note that this hash is different from a 'small' hash, + ** as multiplications on a Sparc is so slow. + */ + hash = hash*FUNNY_NUMBER2 + unsigned_val(*list); + + if (is_not_list(CDR(list))) { + ESTACK_PUSH(stack, MAKE_HASH_CDR_POST_OP); + term = CDR(list); + goto tail_recur; + } list = list_val(CDR(list)); } + ESTACK_PUSH2(stack, CDR(list), MAKE_HASH_CDR_PRE_OP); + term = CAR(list); + goto tail_recur; } + case MAKE_HASH_CDR_POST_OP: + hash *= FUNNY_NUMBER8; break; case BIG_DEF: @@ -852,37 +904,50 @@ hash = (hash*FUNNY_NUMBER2) + (d & 0xff); d >>= 8; } - if (is_neg) { - return hash*FUNNY_NUMBER4; - } - else { - return hash*FUNNY_NUMBER3; - } - } - break; - + hash *= is_neg ? FUNNY_NUMBER4 : FUNNY_NUMBER3; + break; + } case TUPLE_DEF: { Eterm* ptr = tuple_val(term); Uint arity = arityval(*ptr); - int i = arity; - - ptr++; - while(i--) - hash = make_hash(*ptr++, hash); - return hash*FUNNY_NUMBER9 + arity; - } - break; + ESTACK_PUSH3(stack, arity, (Eterm)(ptr+1), arity); + op = MAKE_HASH_TUPLE_OP; + }/*fall through*/ + case MAKE_HASH_TUPLE_OP: + case MAKE_HASH_FUN_OP: + { + Uint i = ESTACK_POP(stack); + Eterm* ptr = (Eterm*) ESTACK_POP(stack); + if (i != 0) { + term = *ptr; + ESTACK_PUSH3(stack, (Eterm)(ptr+1), i-1, op); + goto tail_recur; + } + if (op == MAKE_HASH_TUPLE_OP) { + Uint32 arity = ESTACK_POP(stack); + hash = hash*FUNNY_NUMBER9 + arity; + } + break; + } + default: - erl_exit(1, "Invalid tag in make_hash(0x%X)\n", term); + erl_exit(1, "Invalid tag in make_hash(0x%X,0x%X)\n", term, op); return 0; + } + if (ESTACK_ISEMPTY(stack)) break; + op = ESTACK_POP(stack); } + DESTROY_ESTACK(stack); + return hash; + #undef UINT32_HASH_STEP #undef UINT32_HASH_RET -#undef SINT32_HASH_RET } + + /* Hash function suggested by Bob Jenkins. */ #define MIX(a,b,c) \ @@ -1019,14 +1084,14 @@ case TAG_PRIMARY_LIST: { int c = 0; - Uint32 s = 0; + Uint32 sh = 0; Eterm* ptr = list_val(term); while (is_byte(*ptr)) { /* Optimization for strings. */ - s = (s << 8) + unsigned_val(*ptr); + sh = (sh << 8) + unsigned_val(*ptr); if (c == 3) { - UINT32_HASH(s, HCONST_4); - c = s = 0; + UINT32_HASH(sh, HCONST_4); + c = sh = 0; } else { c++; } @@ -1036,7 +1101,7 @@ ptr = list_val(term); } if (c > 0) - UINT32_HASH(s, HCONST_4); + UINT32_HASH(sh, HCONST_4); if (is_list(term)) { term = *ptr; tmp = *++ptr; @@ -1271,20 +1336,23 @@ #undef HCONST #undef MIX -#ifdef ARCH_64 -Uint32 -make_broken_hash(Eterm term, Uint32 hash) -#else -Uint -make_broken_hash(Eterm term, Uint hash) -#endif + +Uint32 make_broken_hash(Eterm term) { - switch (tag_val_def(term)) { + Uint32 hash = 0; + DECLARE_ESTACK(stack); + unsigned op; +tail_recur: + op = tag_val_def(term); + for (;;) { + switch (op) { case NIL_DEF: - return hash*FUNNY_NUMBER3 + 1; + hash = hash*FUNNY_NUMBER3 + 1; + break; case ATOM_DEF: - return hash*FUNNY_NUMBER1 + + hash = hash*FUNNY_NUMBER1 + (atom_tab(atom_val(term))->slot.bucket.hvalue); + break; case SMALL_DEF: #ifdef ARCH_64 { @@ -1303,9 +1371,10 @@ hash = hash*FUNNY_NUMBER2 + ((y3 << 16) | (y3 >> 16)); arity++; } - return hash * (y1 < 0 ? FUNNY_NUMBER3 : FUNNY_NUMBER2) + arity; + hash = hash * (y1 < 0 ? FUNNY_NUMBER3 : FUNNY_NUMBER2) + arity; + } else { + hash = hash*FUNNY_NUMBER2 + (((Uint) y1) & 0xfffffff); } - return hash*FUNNY_NUMBER2 + (((Uint) y1) & 0xfffffff); #else if (!IS_SSMALL28(y1)) { /* like a bignum */ @@ -1315,21 +1384,25 @@ hash = hash*FUNNY_NUMBER2 + y3; arity++; } - return hash * (y1 < 0 ? FUNNY_NUMBER3 : FUNNY_NUMBER2) + arity; + hash = hash * (y1 < 0 ? FUNNY_NUMBER3 : FUNNY_NUMBER2) + arity; + } else { + hash = hash*FUNNY_NUMBER2 + (((Uint) y1) & 0xfffffff); } - return hash*FUNNY_NUMBER2 + (((Uint) y1) & 0xfffffff); #endif } #else - return hash*FUNNY_NUMBER2 + unsigned_val(term); + hash = hash*FUNNY_NUMBER2 + unsigned_val(term); #endif + break; + case BINARY_DEF: { size_t sz = binary_size(term); size_t i = (sz < 15) ? sz : 15; hash = hash_binary_bytes(term, i, hash); - return hash*FUNNY_NUMBER4 + sz; + hash = hash*FUNNY_NUMBER4 + sz; + break; } case EXPORT_DEF: @@ -1341,60 +1414,72 @@ (atom_tab(atom_val(ep->code[0]))->slot.bucket.hvalue); hash = hash*FUNNY_NUMBER1 + (atom_tab(atom_val(ep->code[1]))->slot.bucket.hvalue); - return hash; + break; } case FUN_DEF: { ErlFunThing* funp = (ErlFunThing *) fun_val(term); Uint num_free = funp->num_free; - Uint i; hash = hash * FUNNY_NUMBER10 + num_free; hash = hash*FUNNY_NUMBER1 + (atom_tab(atom_val(funp->fe->module))->slot.bucket.hvalue); hash = hash*FUNNY_NUMBER2 + funp->fe->old_index; hash = hash*FUNNY_NUMBER2 + funp->fe->old_uniq; - for (i = 0; i < num_free; i++) { - hash = make_broken_hash(funp->env[i], hash); + if (num_free > 0) { + if (num_free > 1) { + ESTACK_PUSH3(stack, (Eterm) &funp->env[1], (num_free-1), MAKE_HASH_FUN_OP); + } + term = funp->env[0]; + goto tail_recur; } - return hash; + break; } case PID_DEF: - return hash*FUNNY_NUMBER5 + internal_pid_number(term); + hash = hash*FUNNY_NUMBER5 + internal_pid_number(term); + break; case EXTERNAL_PID_DEF: - return hash*FUNNY_NUMBER5 + external_pid_number(term); - + hash = hash*FUNNY_NUMBER5 + external_pid_number(term); + break; case PORT_DEF: - return hash*FUNNY_NUMBER9 + internal_port_number(term); + hash = hash*FUNNY_NUMBER9 + internal_port_number(term); + break; case EXTERNAL_PORT_DEF: - return hash*FUNNY_NUMBER9 + external_port_number(term); - + hash = hash*FUNNY_NUMBER9 + external_port_number(term); + break; case REF_DEF: - return hash*FUNNY_NUMBER9 + internal_ref_numbers(term)[0]; + hash = hash*FUNNY_NUMBER9 + internal_ref_numbers(term)[0]; + break; case EXTERNAL_REF_DEF: - return hash*FUNNY_NUMBER9 + external_ref_numbers(term)[0]; - + hash = hash*FUNNY_NUMBER9 + external_ref_numbers(term)[0]; + break; case FLOAT_DEF: { FloatDef ff; GET_DOUBLE(term, ff); - return hash*FUNNY_NUMBER6 + (ff.fw[0] ^ ff.fw[1]); + hash = hash*FUNNY_NUMBER6 + (ff.fw[0] ^ ff.fw[1]); } break; + case MAKE_HASH_CDR_PRE_OP: + term = ESTACK_POP(stack); + if (is_not_list(term)) { + ESTACK_PUSH(stack, MAKE_HASH_CDR_POST_OP); + goto tail_recur; + } + /*fall through*/ case LIST_DEF: { Eterm* list = list_val(term); - - while(1) { - hash = make_broken_hash(*list, hash); - if (is_not_list(CDR(list))) - return make_broken_hash(CDR(list),hash)*FUNNY_NUMBER8; - list = list_val(CDR(list)); - } + ESTACK_PUSH2(stack, CDR(list), MAKE_HASH_CDR_PRE_OP); + term = CAR(list); + goto tail_recur; } + + case MAKE_HASH_CDR_POST_OP: + hash *= FUNNY_NUMBER8; break; case BIG_DEF: @@ -1452,10 +1537,7 @@ #else #error "unsupported D_EXP size" #endif - if (is_neg) - return hash*FUNNY_NUMBER3 + arity; - else - return hash*FUNNY_NUMBER2 + arity; + hash = hash * (is_neg ? FUNNY_NUMBER3 : FUNNY_NUMBER2) + arity; } break; @@ -1463,19 +1545,42 @@ { Eterm* ptr = tuple_val(term); Uint arity = arityval(*ptr); - int i = arity; - ptr++; - while(i--) - hash = make_broken_hash(*ptr++, hash); - return hash*FUNNY_NUMBER9 + arity; + ESTACK_PUSH3(stack, arity, (Eterm)(ptr+1), arity); + op = MAKE_HASH_TUPLE_OP; + }/*fall through*/ + case MAKE_HASH_TUPLE_OP: + case MAKE_HASH_FUN_OP: + { + Uint i = ESTACK_POP(stack); + Eterm* ptr = (Eterm*) ESTACK_POP(stack); + if (i != 0) { + term = *ptr; + ESTACK_PUSH3(stack, (Eterm)(ptr+1), i-1, op); + goto tail_recur; + } + if (op == MAKE_HASH_TUPLE_OP) { + Uint32 arity = ESTACK_POP(stack); + hash = hash*FUNNY_NUMBER9 + arity; + } + break; } - break; default: erl_exit(1, "Invalid tag in make_broken_hash\n"); return 0; + } + if (ESTACK_ISEMPTY(stack)) break; + op = ESTACK_POP(stack); } + + DESTROY_ESTACK(stack); + return hash; + +#undef MAKE_HASH_TUPLE_OP +#undef MAKE_HASH_FUN_OP +#undef MAKE_HASH_CDR_PRE_OP +#undef MAKE_HASH_CDR_POST_OP } static int do_send_to_logger(Eterm tag, Eterm gleader, char *buf, int len) @@ -1770,36 +1875,61 @@ * Returns 0 if not equal, or a non-zero value otherwise. */ -int -eq(Eterm a, Eterm b) +int eq(Eterm a, Eterm b) { - tailrecur: - if (a == b) - return 1; + DECLARE_ESTACK(stack); + Sint sz; + Eterm* aa; + Eterm* bb; + +tailrecur: + if (a == b) goto pop_next; +tailrecur_ne: switch (primary_tag(a)) { + case TAG_PRIMARY_LIST: + if (is_list(b)) { + Eterm* aval = list_val(a); + Eterm* bval = list_val(b); + while (1) { + Eterm atmp = CAR(aval); + Eterm btmp = CAR(bval); + if (atmp != btmp) { + ESTACK_PUSH2(stack,CDR(bval),CDR(aval)); + a = atmp; + b = btmp; + goto tailrecur_ne; + } + atmp = CDR(aval); + btmp = CDR(bval); + if (atmp == btmp) { + goto pop_next; + } + if (is_not_list(atmp) || is_not_list(btmp)) { + a = atmp; + b = btmp; + goto tailrecur_ne; + } + aval = list_val(atmp); + bval = list_val(btmp); + } + } + break; /* not equal */ + case TAG_PRIMARY_BOXED: { Eterm hdr = *boxed_val(a); switch (hdr & _TAG_HEADER_MASK) { case ARITYVAL_SUBTAG: { - Eterm* aa; - Eterm* bb; - Sint i; - aa = tuple_val(a); if (!is_boxed(b) || *boxed_val(b) != *aa) - return 0; + goto not_equal; bb = tuple_val(b); - i = arityval(*aa); /* get the arity*/ - while (i--) { - Eterm atmp = *++aa; - Eterm btmp = *++bb; - if (!EQ(atmp, btmp)) - return 0; - } - return 1; + if ((sz = arityval(*aa)) == 0) goto pop_next; + ++aa; + ++bb; + goto term_array; } case REFC_BINARY_SUBTAG: case HEAP_BINARY_SUBTAG: @@ -1815,60 +1945,51 @@ Uint b_bitoffs; if (is_not_binary(b)) { - return 0; + goto not_equal; } a_size = binary_size(a); b_size = binary_size(b); if (a_size != b_size) { - return 0; + goto not_equal; } ERTS_GET_BINARY_BYTES(a, a_ptr, a_bitoffs, a_bitsize); ERTS_GET_BINARY_BYTES(b, b_ptr, b_bitoffs, b_bitsize); if ((a_bitsize | b_bitsize | a_bitoffs | b_bitoffs) == 0) { - return sys_memcmp(a_ptr, b_ptr, a_size) == 0; + if (sys_memcmp(a_ptr, b_ptr, a_size) == 0) goto pop_next; } else if (a_bitsize == b_bitsize) { - return erts_cmp_bits(a_ptr, a_bitoffs, b_ptr, b_bitoffs, - (a_size << 3) + a_bitsize) == 0; - } else { - return 0; + if (erts_cmp_bits(a_ptr, a_bitoffs, b_ptr, b_bitoffs, + (a_size << 3) + a_bitsize) == 0) goto pop_next; } + break; /* not equal */ } - case EXPORT_SUBTAG: + case EXPORT_SUBTAG: { - Export* a_exp; - Export* b_exp; - - if (is_not_export(b)) { - return 0; + if (is_export(b)) { + Export* a_exp = (Export *) (export_val(a))[1]; + Export* b_exp = (Export *) (export_val(b))[1]; + if (a_exp == b_exp) goto pop_next; } - a_exp = (Export *) (export_val(a))[1]; - b_exp = (Export *) (export_val(b))[1]; - return a_exp == b_exp; + break; /* not equal */ } case FUN_SUBTAG: { ErlFunThing* f1; ErlFunThing* f2; - int num_free; - int i; if (is_not_fun(b)) - return 0; + goto not_equal; f1 = (ErlFunThing *) fun_val(a); f2 = (ErlFunThing *) fun_val(b); if (f1->fe->module != f2->fe->module || f1->fe->old_index != f2->fe->old_index || f1->fe->old_uniq != f2->fe->old_uniq || f1->num_free != f2->num_free) { - return 0; + goto not_equal; } - num_free = f1->num_free; - for (i = 0; i < num_free; i++) { - if (!EQ(f1->env[i], f2->env[i])) { - return 0; - } - } - return 1; + if ((sz = f1->num_free) == 0) goto pop_next; + aa = f1->env; + bb = f2->env; + goto term_array; } case EXTERNAL_PID_SUBTAG: @@ -1877,22 +1998,18 @@ ExternalThing *bp; if(is_not_external(b)) - return 0; + goto not_equal; ap = external_thing_ptr(a); bp = external_thing_ptr(b); - if(ap->header != bp->header) - return 0; - if(ap->node != bp->node) - return 0; - - ASSERT(1 == external_data_words(a)); - ASSERT(1 == external_data_words(b)); - - if(ap->data.ui[0] != bp->data.ui[0]) - return 0; - return 1; + if(ap->header == bp->header && ap->node == bp->node) { + ASSERT(1 == external_data_words(a)); + ASSERT(1 == external_data_words(b)); + + if (ap->data.ui[0] == bp->data.ui[0]) goto pop_next; + } + break; /* not equal */ } case EXTERNAL_REF_SUBTAG: { /* @@ -1908,10 +2025,10 @@ Uint i; if(is_not_external_ref(b)) - return 0; + goto not_equal; if(external_node(a) != external_node(b)) - return 0; + goto not_equal; anum = external_ref_numbers(a); bnum = external_ref_numbers(b); @@ -1922,7 +2039,7 @@ case REF_SUBTAG: if (is_not_internal_ref(b)) - return 0; + goto not_equal; alen = internal_ref_no_of_numbers(a); blen = internal_ref_no_of_numbers(b); anum = internal_ref_numbers(a); @@ -1932,13 +2049,15 @@ ASSERT(alen > 0 && blen > 0); if (anum[0] != bnum[0]) - return 0; + goto not_equal; if (alen == 3 && blen == 3) { /* Most refs are of length 3 */ - if (anum[1] == bnum[1] && anum[2] == bnum[2]) - return 1; - return 0; + if (anum[1] == bnum[1] && anum[2] == bnum[2]) { + goto pop_next; + } else { + goto not_equal; + } } common_len = alen; @@ -1947,78 +2066,108 @@ for (i = 1; i < common_len; i++) if (anum[i] != bnum[i]) - return 0; + goto not_equal; if(alen != blen) { if (alen > blen) { for (i = common_len; i < alen; i++) if (anum[i] != 0) - return 0; + goto not_equal; } else { for (i = common_len; i < blen; i++) if (bnum[i] != 0) - return 0; - } - + goto not_equal; + } } - - return 1; + goto pop_next; } case POS_BIG_SUBTAG: case NEG_BIG_SUBTAG: { - Eterm* aa; - Eterm* bb; int i; if (is_not_big(b)) - return 0; + goto not_equal; aa = big_val(a); /* get pointer to thing */ bb = big_val(b); if (*aa != *bb) - return 0; + goto not_equal; i = BIG_ARITY(aa); while(i--) { if (*++aa != *++bb) - return 0; + goto not_equal; } - return 1; + goto pop_next; } case FLOAT_SUBTAG: { FloatDef af; FloatDef bf; - if (is_not_float(b)) - return 0; - GET_DOUBLE(a, af); - GET_DOUBLE(b, bf); - return (af.fd == bf.fd) ? 1 : 0; + if (is_float(b)) { + GET_DOUBLE(a, af); + GET_DOUBLE(b, bf); + if (af.fd == bf.fd) goto pop_next; + } + break; /* not equal */ } } break; } - case TAG_PRIMARY_LIST: - { - Eterm atmp; - Eterm btmp; + } + goto not_equal; - if (is_not_list(b)) - return 0; - atmp = CAR(list_val(a)); - btmp = CAR(list_val(b)); - if (!EQ(atmp, btmp)) - return 0; - a = CDR(list_val(a)); - b = CDR(list_val(b)); - goto tailrecur; - } + +term_array: /* arrays in 'aa' and 'bb', length in 'sz' */ + ASSERT(sz != 0); + { + Eterm* ap = aa; + Eterm* bp = bb; + Sint i = sz; + for (;;) { + if (*ap != *bp) break; + if (--i == 0) goto pop_next; + ++ap; + ++bp; + } + a = *ap; + b = *bp; + if (is_both_immed(a,b)) { + goto not_equal; + } + if (i > 1) { /* push the rest */ + ESTACK_PUSH3(stack, i-1, (Eterm)(bp+1), + ((Eterm)(ap+1)) | TAG_PRIMARY_HEADER); + /* We (ab)use TAG_PRIMARY_HEADER to recognize a term_array */ + } + goto tailrecur_ne; + } + +pop_next: + if (!ESTACK_ISEMPTY(stack)) { + Eterm something = ESTACK_POP(stack); + if (primary_tag(something) == TAG_PRIMARY_HEADER) { /* a term_array */ + aa = (Eterm*) something; + bb = (Eterm*) ESTACK_POP(stack); + sz = ESTACK_POP(stack); + goto term_array; + } + a = something; + b = ESTACK_POP(stack); + goto tailrecur; } + + DESTROY_ESTACK(stack); + return 1; + +not_equal: + DESTROY_ESTACK(stack); return 0; } + /* * Lexically compare two strings of bytes (string s1 length l1 and s2 l2). * @@ -2067,14 +2216,13 @@ bb->name+3, bb->len-3); } -Sint -cmp(Eterm a, Eterm b) +Sint cmp(Eterm a, Eterm b) { + DECLARE_ESTACK(stack); Eterm* aa; Eterm* bb; int i; Sint j; - Eterm big_buf[2]; int a_tag; int b_tag; ErlNode *anode; @@ -2086,29 +2234,34 @@ Uint32 *anum; Uint32 *bnum; +#define RETURN_NEQ(cmp) { j=(cmp); ASSERT(j != 0); goto not_equal; } +#define ON_CMP_GOTO(cmp) if ((j=(cmp)) == 0) goto pop_next; else goto not_equal + #undef CMP_NODES #define CMP_NODES(AN, BN) \ do { \ if((AN) != (BN)) { \ - if((AN)->sysname != (BN)->sysname) \ - return cmp_atoms((AN)->sysname, (BN)->sysname); \ + if((AN)->sysname != (BN)->sysname) \ + RETURN_NEQ(cmp_atoms((AN)->sysname, (BN)->sysname)); \ ASSERT((AN)->creation != (BN)->creation); \ - return ((AN)->creation < (BN)->creation) ? -1 : 1; \ + RETURN_NEQ(((AN)->creation < (BN)->creation) ? -1 : 1); \ } \ } while (0) - tailrecur: +tailrecur: if (a == b) { /* Equal values or pointers. */ - return 0; + goto pop_next; } +tailrecur_ne: /* deal with majority (?) cases by brute-force */ if (is_atom(a)) { - if (is_atom(b)) - return cmp_atoms(a, b); + if (is_atom(b)) { + ON_CMP_GOTO(cmp_atoms(a, b)); + } } else if (is_both_small(a, b)) { - return signed_val(a) - signed_val(b); + ON_CMP_GOTO(signed_val(a) - signed_val(b)); } /* @@ -2135,10 +2288,8 @@ port_common: CMP_NODES(anode, bnode); - if (adata != bdata) { - return adata < bdata ? -1 : 1; - } - return 0; + ON_CMP_GOTO((Sint)(adata - bdata)); + case (_TAG_IMMED1_PID >> _TAG_PRIMARY_SIZE): if (is_internal_pid(b)) { bnode = erts_this_node; @@ -2155,10 +2306,10 @@ pid_common: if (adata != bdata) { - return adata < bdata ? -1 : 1; + RETURN_NEQ(adata < bdata ? -1 : 1); } CMP_NODES(anode, bnode); - return 0; + goto pop_next; case (_TAG_IMMED1_SMALL >> _TAG_PRIMARY_SIZE): a_tag = SMALL_DEF; goto mixed_types; @@ -2181,17 +2332,26 @@ aa = list_val(a); bb = list_val(b); while (1) { - if ((j = cmp(*aa++, *bb++)) != 0) - return j; - if (*aa==*bb) - return 0; - if (is_not_list(*aa) || is_not_list(*bb)) { - a = *aa; - b = *bb; - goto tailrecur; + Eterm atmp = CAR(aa); + Eterm btmp = CAR(bb); + if (atmp != btmp) { + ESTACK_PUSH2(stack,CDR(bb),CDR(aa)); + a = atmp; + b = btmp; + goto tailrecur_ne; + } + atmp = CDR(aa); + btmp = CDR(bb); + if (atmp == btmp) { + goto pop_next; + } + if (is_not_list(atmp) || is_not_list(btmp)) { + a = atmp; + b = btmp; + goto tailrecur_ne; } - aa = list_val(*aa); - bb = list_val(*bb); + aa = list_val(atmp); + bb = list_val(btmp); } case TAG_PRIMARY_BOXED: { @@ -2206,31 +2366,16 @@ bb = tuple_val(b); /* compare the arities */ i = arityval(ahdr); /* get the arity*/ - if (i < arityval(*bb)) return(-1); - if (i > arityval(*bb)) return(1); - if (i == 0) { - return 0; + if (i != arityval(*bb)) { + RETURN_NEQ((int)(i - arityval(*bb))); } - while (--i) { - a = *++aa; - b = *++bb; - if (a != b) { - if (is_atom(a) && is_atom(b)) { - if ((j = cmp_atoms(a, b)) != 0) { - return j; - } - } else if (is_both_small(a, b)) { - if ((j = signed_val(a)-signed_val(b)) != 0) { - return j; - } - } else if ((j = cmp(a, b)) != 0) { - return j; - } - } + if (i == 0) { + goto pop_next; } - a = *++aa; - b = *++bb; - goto tailrecur; + ++aa; + ++bb; + goto term_array; + case (_TAG_HEADER_FLOAT >> _TAG_PRIMARY_SIZE): if (is_not_float(b)) { a_tag = FLOAT_DEF; @@ -2241,7 +2386,7 @@ GET_DOUBLE(a, af); GET_DOUBLE(b, bf); - return float_comp(af.fd, bf.fd); + ON_CMP_GOTO(float_comp(af.fd, bf.fd)); } case (_TAG_HEADER_POS_BIG >> _TAG_PRIMARY_SIZE): case (_TAG_HEADER_NEG_BIG >> _TAG_PRIMARY_SIZE): @@ -2249,7 +2394,7 @@ a_tag = BIG_DEF; goto mixed_types; } - return big_comp(a, b); + ON_CMP_GOTO(big_comp(a, b)); case (_TAG_HEADER_EXPORT >> _TAG_PRIMARY_SIZE): if (is_not_export(b)) { a_tag = EXPORT_DEF; @@ -2259,12 +2404,12 @@ Export* b_exp = (Export *) (export_val(b))[1]; if ((j = cmp_atoms(a_exp->code[0], b_exp->code[0])) != 0) { - return j; + RETURN_NEQ(j); } if ((j = cmp_atoms(a_exp->code[1], b_exp->code[1])) != 0) { - return j; + RETURN_NEQ(j); } - return (Sint) a_exp->code[2] - (Sint) b_exp->code[2]; + ON_CMP_GOTO((Sint) a_exp->code[2] - (Sint) b_exp->code[2]); } break; case (_TAG_HEADER_FUN >> _TAG_PRIMARY_SIZE): @@ -2274,7 +2419,6 @@ } else { ErlFunThing* f1 = (ErlFunThing *) fun_val(a); ErlFunThing* f2 = (ErlFunThing *) fun_val(b); - int num_free; Sint diff; diff = cmpbytes(atom_tab(atom_val(f1->fe->module))->name, @@ -2282,27 +2426,25 @@ atom_tab(atom_val(f2->fe->module))->name, atom_tab(atom_val(f2->fe->module))->len); if (diff != 0) { - return diff; + RETURN_NEQ(diff); } diff = f1->fe->old_index - f2->fe->old_index; if (diff != 0) { - return diff; + RETURN_NEQ(diff); } diff = f1->fe->old_uniq - f2->fe->old_uniq; if (diff != 0) { - return diff; + RETURN_NEQ(diff); } diff = f1->num_free - f2->num_free; if (diff != 0) { - return diff; - } - num_free = f1->num_free; - for (i = 0; i < num_free; i++) { - if ((diff = cmp(f1->env[i], f2->env[i])) != 0) { - return diff; - } - } - return 0; + RETURN_NEQ(diff); + } + i = f1->num_free; + if (i == 0) goto pop_next; + aa = f1->env; + bb = f2->env; + goto term_array; } case (_TAG_HEADER_EXTERNAL_PID >> _TAG_PRIMARY_SIZE): if (is_internal_pid(b)) { @@ -2362,14 +2504,14 @@ if (alen > blen) { do { if (anum[alen - 1] != 0) - return 1; + RETURN_NEQ(1); alen--; } while (alen > blen); } else { do { if (bnum[blen - 1] != 0) - return -1; + RETURN_NEQ(-1); blen--; } while (alen < blen); } @@ -2378,8 +2520,8 @@ ASSERT(alen == blen); for (i = (Sint) alen - 1; i >= 0; i--) if (anum[i] != bnum[i]) - return anum[i] < bnum[i] ? -1 : 1; - return 0; + RETURN_NEQ((Sint32) (anum[i] - bnum[i])); + goto pop_next; case (_TAG_HEADER_EXTERNAL_REF >> _TAG_PRIMARY_SIZE): if (is_internal_ref(b)) { bnode = erts_this_node; @@ -2419,9 +2561,7 @@ if ((a_bitsize | b_bitsize | a_bitoffs | b_bitoffs) == 0) { min_size = (a_size < b_size) ? a_size : b_size; if ((cmp = sys_memcmp(a_ptr, b_ptr, min_size)) != 0) { - return cmp; - } else { - return a_size - b_size; + RETURN_NEQ(cmp); } } else { @@ -2430,12 +2570,10 @@ min_size = (a_size < b_size) ? a_size : b_size; if ((cmp = erts_cmp_bits(a_ptr,a_bitoffs, b_ptr,b_bitoffs,min_size)) != 0) { - return cmp; - } - else { - return a_size - b_size; + RETURN_NEQ(cmp); } } + ON_CMP_GOTO((Sint)(a_size - b_size)); } } } @@ -2451,43 +2589,103 @@ { FloatDef f1, f2; Eterm big; + Eterm big_buf[2]; switch(_NUMBER_CODE(a_tag, b_tag)) { case SMALL_BIG: big = small_to_big(signed_val(a), big_buf); - return big_comp(big, b); + j = big_comp(big, b); + break; case SMALL_FLOAT: f1.fd = signed_val(a); GET_DOUBLE(b, f2); - return float_comp(f1.fd, f2.fd); + j = float_comp(f1.fd, f2.fd); + break; case BIG_SMALL: big = small_to_big(signed_val(b), big_buf); - return big_comp(a, big); + j = big_comp(a, big); + break; case BIG_FLOAT: if (big_to_double(a, &f1.fd) < 0) { - return big_sign(a) ? -1 : 1; + j = big_sign(a) ? -1 : 1; + } else { + GET_DOUBLE(b, f2); + j = float_comp(f1.fd, f2.fd); } - GET_DOUBLE(b, f2); - return float_comp(f1.fd, f2.fd); + break; case FLOAT_SMALL: GET_DOUBLE(a, f1); f2.fd = signed_val(b); - return float_comp(f1.fd, f2.fd); + j = float_comp(f1.fd, f2.fd); + break; case FLOAT_BIG: if (big_to_double(b, &f2.fd) < 0) { - return big_sign(b) ? 1 : -1; + j = big_sign(b) ? 1 : -1; + } else { + GET_DOUBLE(a, f1); + j = float_comp(f1.fd, f2.fd); } - GET_DOUBLE(a, f1); - return float_comp(f1.fd, f2.fd); + break; default: - return b_tag - a_tag; + j = b_tag - a_tag; } } + if (j == 0) { + goto pop_next; + } else { + goto not_equal; + } -#undef CMP_NODES +term_array: /* arrays in 'aa' and 'bb', length in 'i' */ + ASSERT(i>0); + while (--i) { + a = *aa++; + b = *bb++; + if (a != b) { + if (is_atom(a) && is_atom(b)) { + if ((j = cmp_atoms(a, b)) != 0) { + goto not_equal; + } + } else if (is_both_small(a, b)) { + if ((j = signed_val(a)-signed_val(b)) != 0) { + goto not_equal; + } + } else { + /* (ab)Use TAG_PRIMARY_HEADER to recognize a term_array */ + ESTACK_PUSH3(stack, i, (Eterm)bb, (Eterm)aa | TAG_PRIMARY_HEADER); + goto tailrecur_ne; + } + } + } + a = *aa; + b = *bb; + goto tailrecur; + +pop_next: + if (!ESTACK_ISEMPTY(stack)) { + Eterm something = ESTACK_POP(stack); + if (primary_tag(something) == TAG_PRIMARY_HEADER) { /* a term_array */ + aa = (Eterm*) something; + bb = (Eterm*) ESTACK_POP(stack); + i = ESTACK_POP(stack); + goto term_array; + } + a = something; + b = ESTACK_POP(stack); + goto tailrecur; + } + DESTROY_ESTACK(stack); + return 0; + +not_equal: + DESTROY_ESTACK(stack); + return j; + +#undef CMP_NODES } + void erts_cleanup_externals(ExternalThing *etp) { @@ -3072,6 +3270,9 @@ struct { int emergency; + long emergency_timeout; + erts_smp_cnd_t watchdog_cnd; + erts_smp_tid_t watchdog_tid; int threads_to_block; int have_blocker; erts_smp_tid_t blocker_tid; @@ -3561,21 +3762,14 @@ while (threads_not_under_control()) erts_smp_cnd_wait(&system_block_state.cnd, &system_block_state.mtx); } - else { - erts_thr_timeval_t to; - erts_thr_time_now(&to); - - to.tv_sec += timeout / 1000; - to.tv_nsec += timeout % 1000; - if (to.tv_nsec >= 1000000000) { - to.tv_sec++; - to.tv_nsec -= 1000000000; - } - - while (res != ETIMEDOUT && threads_not_under_control()) { - res = erts_smp_cnd_timedwait(&system_block_state.cnd, - &system_block_state.mtx, - &to); + else { + system_block_state.emergency_timeout = timeout; + erts_smp_cnd_signal(&system_block_state.watchdog_cnd); + + while (system_block_state.emergency_timeout >= 0 + && threads_not_under_control()) { + erts_smp_cnd_wait(&system_block_state.cnd, + &system_block_state.mtx); } } done: @@ -3669,11 +3863,54 @@ return blkd; } +static void * +emergency_watchdog(void *unused) +{ + erts_smp_mtx_lock(&system_block_state.mtx); + while (1) { + long timeout; + while (system_block_state.emergency_timeout < 0) + erts_smp_cnd_wait(&system_block_state.watchdog_cnd, &system_block_state.mtx); + timeout = system_block_state.emergency_timeout; + erts_smp_mtx_unlock(&system_block_state.mtx); + + if (erts_disable_tolerant_timeofday) + erts_milli_sleep(timeout); + else { + SysTimeval to; + erts_get_timeval(&to); + to.tv_sec += timeout / 1000; + to.tv_usec += timeout % 1000; + + while (1) { + SysTimeval curr; + erts_milli_sleep(timeout); + erts_get_timeval(&curr); + if (curr.tv_sec > to.tv_sec + || (curr.tv_sec == to.tv_sec && curr.tv_usec >= to.tv_usec)) { + break; + } + timeout = (to.tv_sec - curr.tv_sec)*1000; + timeout += (to.tv_usec - curr.tv_usec)/1000; + } + } + + erts_smp_mtx_lock(&system_block_state.mtx); + system_block_state.emergency_timeout = -1; + erts_smp_cnd_broadcast(&system_block_state.cnd); + } + erts_smp_mtx_unlock(&system_block_state.mtx); + return NULL; +} + void erts_system_block_init(void) { + erts_smp_thr_opts_t thr_opts = ERTS_SMP_THR_OPTS_DEFAULT_INITER; /* Local state... */ system_block_state.emergency = 0; + system_block_state.emergency_timeout = -1; + erts_smp_cnd_init(&system_block_state.watchdog_cnd); system_block_state.threads_to_block = 0; system_block_state.have_blocker = 0; /* system_block_state.block_tid */ @@ -3687,6 +3924,12 @@ system_block_state.checking = 0; #endif + thr_opts.suggested_stack_size = 8; + erts_smp_thr_create(&system_block_state.watchdog_tid, + emergency_watchdog, + NULL, + &thr_opts); + /* Global state... */ erts_smp_atomic_init(&erts_system_block_state.do_block, 0L); diff -Nru erlang-13.b.1-dfsg/erts/emulator/drivers/common/efile_drv.c erlang-13.b.3-dfsg/erts/emulator/drivers/common/efile_drv.c --- erlang-13.b.1-dfsg/erts/emulator/drivers/common/efile_drv.c 2009-03-12 12:16:00.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/drivers/common/efile_drv.c 2009-09-18 15:07:15.000000000 +0100 @@ -52,6 +52,7 @@ #define FILE_SETOPT 26 #define FILE_IPREAD 27 #define FILE_ALTNAME 28 +#define FILE_READ_LINE 29 /* Return codes */ @@ -81,6 +82,10 @@ /* Internal */ +/* Set to 1 to test having read_ahead implicitly for read_line */ +#define ALWAYS_READ_LINE_AHEAD 0 + + /* Must not be possible to get from malloc()! */ #define FILE_FD_INVALID ((Sint)(-1)) @@ -165,6 +170,11 @@ put_int32((i).second,(b) + 5 * 4) +#if ALWAYS_READ_LINE_AHEAD +#define DEFAULT_LINEBUF_SIZE 2048 +#else +#define DEFAULT_LINEBUF_SIZE 512 /* Small, it's usually discarded anyway */ +#endif typedef unsigned char uchar; @@ -328,6 +338,16 @@ size_t size; } read; struct { + ErlDrvBinary *binp; /* in - out */ + size_t read_offset; /* in - out */ + size_t read_size; /* in - out */ + size_t nl_pos; /* out */ + short nl_skip; /* out, 0 or 1 */ +#if !ALWAYS_READ_LINE_AHEAD + short read_ahead; /* in, bool */ +#endif + } read_line; + struct { ErlDrvBinary *binp; int size; int offset; @@ -930,6 +950,113 @@ EF_FREE(d); } +static void invoke_read_line(void *data) +{ + struct t_data *d = (struct t_data *) data; + int status; + size_t read_size; + int local_loop = (d->again == 0); + + do { + size_t size = (d->c.read_line.binp)->orig_size - + d->c.read_line.read_offset - d->c.read_line.read_size; + if (size == 0) { + /* Need more place */ + size_t need = (d->c.read_line.read_size >= DEFAULT_LINEBUF_SIZE) ? + d->c.read_line.read_size + DEFAULT_LINEBUF_SIZE : DEFAULT_LINEBUF_SIZE; + ErlDrvBinary *newbin = driver_alloc_binary(need); + if (newbin == NULL) { + d->result_ok = 0; + d->errInfo.posix_errno = ENOMEM; + d->again = 0; + break; + } + memcpy(newbin->orig_bytes, (d->c.read_line.binp)->orig_bytes + d->c.read_line.read_offset, + d->c.read_line.read_size); + driver_free_binary(d->c.read_line.binp); + d->c.read_line.binp = newbin; + d->c.read_line.read_offset = 0; + size = need - d->c.read_line.read_size; + } + if (d->flags & EFILE_COMPRESSED) { + read_size = erts_gzread((gzFile)d->fd, + d->c.read_line.binp->orig_bytes + + d->c.read_line.read_offset + d->c.read_line.read_size, + size); + status = (read_size != -1); + if (!status) { + d->errInfo.posix_errno = EIO; + } + } else { + status = efile_read(&d->errInfo, d->flags, (int) d->fd, + d->c.read_line.binp->orig_bytes + + d->c.read_line.read_offset + d->c.read_line.read_size, + size, + &read_size); + } + if ( (d->result_ok = status)) { + void *nl_ptr = memchr((d->c.read_line.binp)->orig_bytes + + d->c.read_line.read_offset + d->c.read_line.read_size,'\n',read_size); + ASSERT(read_size <= size); + d->c.read_line.read_size += read_size; + if (nl_ptr != NULL) { + /* If found, we're done */ + d->c.read_line.nl_pos = ((char *) nl_ptr) - + ((char *) ((d->c.read_line.binp)->orig_bytes)) + 1; + if (d->c.read_line.nl_pos > 1 && + *(((char *) nl_ptr) - 1) == '\r') { + --d->c.read_line.nl_pos; + *(((char *) nl_ptr) - 1) = '\n'; + d->c.read_line.nl_skip = 1; + } else { + d->c.read_line.nl_skip = 0; + } + d->again = 0; +#if !ALWAYS_READ_LINE_AHEAD + if (!(d->c.read_line.read_ahead)) { + /* Ouch! Undo buffering... */ + size_t too_much = d->c.read_line.read_size - d->c.read_line.nl_skip - + (d->c.read_line.nl_pos - d->c.read_line.read_offset); + d->c.read_line.read_size -= too_much; + ASSERT(d->c.read_line.read_size >= 0); + if (d->flags & EFILE_COMPRESSED) { + Sint64 location = erts_gzseek((gzFile)d->fd, + -((Sint64) too_much), EFILE_SEEK_CUR); + if (location == -1) { + d->result_ok = 0; + d->errInfo.posix_errno = errno; + } + } else { + Sint64 location; + d->result_ok = efile_seek(&d->errInfo, (int) d->fd, + -((Sint64) too_much), EFILE_SEEK_CUR, + &location); + } + } +#endif + break; + } else if (read_size == 0) { + d->c.read_line.nl_pos = + d->c.read_line.read_offset + d->c.read_line.read_size; + d->c.read_line.nl_skip = 0; + d->again = 0; + break; + } + } else { + d->again = 0; + break; + } + } while (local_loop); +} + +static void free_read_line(void *data) +{ + struct t_data *d = (struct t_data *) data; + + driver_free_binary(d->c.read_line.binp); + EF_FREE(d); +} + static void invoke_read_file(void *data) { struct t_data *d = (struct t_data *) data; @@ -1691,7 +1818,7 @@ struct t_data *d = (struct t_data *) data; char header[5]; /* result code + count */ char resbuf[RESBUFSIZE]; /* Result buffer. */ - + TRACE_C('r'); @@ -1701,7 +1828,7 @@ switch (d->command) { - case FILE_READ: + case FILE_READ: if (!d->result_ok) { reply_error(desc, &d->errInfo); } else { @@ -1720,6 +1847,38 @@ } free_read(data); break; + case FILE_READ_LINE: + /* The read_line stucture differs from the read structure. + The data->read_offset and d->c.read_line.read_offset are copies, as are + data->read_size and d->c.read_line.read_size + The read_line function does not kniow in advance how large the binary has to be, + why new allocation (but not reallocation of the old binary, for obvious reasons) + may happen in the worker thread. */ + if (!d->result_ok) { + reply_error(desc, &d->errInfo); + } else { + size_t len = d->c.read_line.nl_pos - d->c.read_line.read_offset; + TRACE_C('L'); + reply_data(desc, d->c.read_line.binp, + d->c.read_line.read_offset, len); + desc->read_offset = d->c.read_line.read_offset + d->c.read_line.nl_skip + len; + desc->read_size = + d->c.read_line.read_size - d->c.read_line.nl_skip - len; + if (desc->read_binp != d->c.read_line.binp) { /* New binary allocated */ + driver_free_binary(desc->read_binp); + desc->read_binp = d->c.read_line.binp; + driver_binary_inc_refc(desc->read_binp); + } +#if !ALWAYS_READ_LINE_AHEAD + ASSERT(desc->read_bufsize > 0 || desc->read_size == 0); + if (desc->read_bufsize == 0) { + desc->read_offset = desc->read_binp->orig_size; /* triggers cleanup */ + } +#endif + try_free_read_bin(desc); + } + free_read_line(data); + break; case FILE_READ_FILE: if (!d->result_ok) reply_error(desc, &d->errInfo); @@ -2325,6 +2484,16 @@ reply_posix_error(desc, err); goto done; } +#if ALWAYS_READ_LINE_AHEAD + if (desc->read_bufsize == 0 && desc->read_binp != NULL && desc->read_size > 0) { + /* We have allocated a buffer for line mode but should not really have a + read-ahead buffer... */ + if (lseek_flush_read(desc, &err) < 0) { + reply_posix_error(desc, err); + goto done; + } + } +#endif if (ev->size != 1+8 || !EV_GET_UINT32(ev, &sizeH, &p, &q) || !EV_GET_UINT32(ev, &sizeL, &p, &q)) { @@ -2414,6 +2583,86 @@ cq_enq(desc, d); } goto done; /* case FILE_READ: */ + case FILE_READ_LINE: { + /* + * Icky little creature... We do mostly as ordinary file read, but with a few differences. + * 1) We have to scan for proper newline sequence if there is a buffer already, we cannot know + * in advance if the buffer contains a whole line without scanning. + * 2) We do not know how large the buffer needs to be in advance. We give a default buffer, + * but the worker may need to allocate a new one. Freeing the old and rereferencing a newly + * allocated binary + dealing with offsets and lengts are done in file_async ready + * for this OP. + */ + struct t_data *d; + if (flush_write_check_error(desc, &err) < 0) { + reply_posix_error(desc, err); + goto done; + } + if (ev->size != 1) { + /* Wrong command length */ + reply_posix_error(desc, EINVAL); + goto done; + } + if ((desc->fd == FILE_FD_INVALID) + || (! (desc->flags & EFILE_MODE_READ)) ) { + reply_posix_error(desc, EBADF); + goto done; + } + if (desc->read_size > 0) { + /* look for '\n' in what we'we already got */ + void *nl_ptr = memchr(desc->read_binp->orig_bytes + desc->read_offset,'\n',desc->read_size); + if (nl_ptr != NULL) { + /* If found, we're done */ + int skip = 0; + size_t size = ((char *) nl_ptr) - + ((char *) (desc->read_binp->orig_bytes + desc->read_offset)) + 1; + if (size > 1 && + *(((char *) nl_ptr) - 1) == '\r') { + *(((char *) nl_ptr) - 1) = '\n'; + skip = 1; + --size; + } + reply_data(desc, desc->read_binp, desc->read_offset, size); + desc->read_offset += (size + skip); + desc->read_size -= (size + skip); + try_free_read_bin(desc); + goto done; + } + } + /* Now, it's up to the thread to work out the need for more buffers and such, it's + no use doing it in this thread as we do not have the information required anyway. + Even a NULL buffer could be handled by the thread, but code is simplified by us + allocating it */ + if (! desc->read_binp) { + int alloc_size = (desc->read_bufsize > DEFAULT_LINEBUF_SIZE) ? desc->read_bufsize : + DEFAULT_LINEBUF_SIZE; + /* Allocate a new binary for the result */ + if (! (desc->read_binp = driver_alloc_binary(alloc_size))) { + reply_posix_error(desc, ENOMEM); + goto done; + } + } + if (! (d = EF_ALLOC(sizeof(struct t_data)))) { + reply_posix_error(desc, ENOMEM); + goto done; + } + + d->command = command; + d->reply = !0; + d->fd = desc->fd; + d->flags = desc->flags; + d->c.read_line.binp = desc->read_binp; + d->c.read_line.read_offset = desc->read_offset; + d->c.read_line.read_size = desc->read_size; +#if !ALWAYS_READ_LINE_AHEAD + d->c.read_line.read_ahead = (desc->read_bufsize > 0); +#endif + driver_binary_inc_refc(d->c.read.binp); + d->invoke = invoke_read_line; + d->free = free_read_line; + d->level = 1; + cq_enq(desc, d); + } goto done; case FILE_WRITE: { int skip = 1; int size = ev->size - skip; diff -Nru erlang-13.b.1-dfsg/erts/emulator/drivers/common/gzio.c erlang-13.b.3-dfsg/erts/emulator/drivers/common/gzio.c --- erlang-13.b.1-dfsg/erts/emulator/drivers/common/gzio.c 2009-03-12 12:16:01.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/drivers/common/gzio.c 2009-09-18 15:07:45.000000000 +0100 @@ -36,10 +36,11 @@ # define zstrerror(errnum) "" #endif -#include "zutil.h" +#include "gzio_zutil.h" +#include "erl_zlib.h" #include "gzio.h" -struct internal_state {int dummy;}; /* for buggy compilers */ +/********struct internal_state {int dummy;}; / * for buggy compilers */ #define Z_BUFSIZE 4096 @@ -126,9 +127,7 @@ s = (gz_stream *)ALLOC(sizeof(gz_stream)); if (!s) return Z_NULL; - s->stream.zalloc = (alloc_func)0; - s->stream.zfree = (free_func)0; - s->stream.opaque = (voidpf)0; + erl_zlib_alloc_init(&s->stream); s->stream.next_in = s->inbuf = Z_NULL; s->stream.next_out = s->outbuf = Z_NULL; s->stream.avail_in = s->stream.avail_out = 0; @@ -717,9 +716,7 @@ zstr.next_in = (unsigned char*) start; zstr.avail_in = size; - zstr.zalloc = (alloc_func)0; - zstr.zfree = (free_func)0; - zstr.opaque = (voidpf)0; + erl_zlib_alloc_init(&zstr); size *= 2; if ((bin = driver_alloc_binary(size)) == NULL) { return NULL; @@ -778,9 +775,7 @@ int comprLen = size + (size/1000) + 1 + 12; /* see zlib.h */ crc = crc32(0L, Z_NULL, 0); - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; - c_stream.opaque = (voidpf)0; + erl_zlib_alloc_init(&c_stream); if (deflateInit2(&c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, 0) != Z_OK) diff -Nru erlang-13.b.1-dfsg/erts/emulator/drivers/common/gzio_zutil.h erlang-13.b.3-dfsg/erts/emulator/drivers/common/gzio_zutil.h --- erlang-13.b.1-dfsg/erts/emulator/drivers/common/gzio_zutil.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/drivers/common/gzio_zutil.h 2009-09-18 15:10:25.000000000 +0100 @@ -0,0 +1,82 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* A replacement for zlib internal header file zutil.h. + * Just the minimal things that our gzio.c seems to need. + * We don't want to be dependant on some internal header file + * that may change or not exist at all. + */ + +#ifndef HAVE_LIBZ +/* Use our "real" copy of zutil.h if we don't use shared zlib */ +#include "zutil.h" + +#else /* HAVE_LIBZ: Shared zlib is used */ + +#define local static +#define DEF_MEM_LEVEL 8 +#define zmemcpy sys_memcpy + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + + +#endif /* HAVE_LIBZ */ + diff -Nru erlang-13.b.1-dfsg/erts/emulator/drivers/common/inet_drv.c erlang-13.b.3-dfsg/erts/emulator/drivers/common/inet_drv.c --- erlang-13.b.1-dfsg/erts/emulator/drivers/common/inet_drv.c 2009-06-05 13:53:08.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/drivers/common/inet_drv.c 2009-11-20 13:30:11.000000000 +0000 @@ -889,7 +889,7 @@ ERL_DRV_EXTENDED_MARKER, ERL_DRV_EXTENDED_MAJOR_VERSION, ERL_DRV_EXTENDED_MINOR_VERSION, - ERL_DRV_FLAG_USE_PORT_LOCKING, + ERL_DRV_FLAG_USE_PORT_LOCKING|ERL_DRV_FLAG_SOFT_BUSY, NULL, tcp_inet_process_exit, inet_stop_select @@ -3493,7 +3493,7 @@ # ifndef LIBSCTP # error LIBSCTP not defined # endif - if (erts_sys_ddll_open_noext(STRINGIFY(LIBSCTP), &h_libsctp) == 0) { + if (erts_sys_ddll_open_noext(STRINGIFY(LIBSCTP), &h_libsctp, NULL) == 0) { void *ptr; if (erts_sys_ddll_sym(h_libsctp, "sctp_bindx", &ptr) == 0) { p_sctp_bindx = ptr; @@ -4668,7 +4668,7 @@ else if (ival > INET_MAX_BUFFER) ival = INET_MAX_BUFFER; if (tdesc->high < ival) tdesc->high = ival; - tdesc->high = ival; + tdesc->low = ival; } continue; diff -Nru erlang-13.b.1-dfsg/erts/emulator/drivers/win32/ttsl_drv.c erlang-13.b.3-dfsg/erts/emulator/drivers/win32/ttsl_drv.c --- erlang-13.b.1-dfsg/erts/emulator/drivers/win32/ttsl_drv.c 2009-04-16 10:23:44.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/drivers/win32/ttsl_drv.c 2009-09-18 15:07:25.000000000 +0100 @@ -515,6 +515,7 @@ driver_free(lbuf); lbuf = NULL; } + llen = 0; /* To avoid access error in win_con:AddToCmdHistory during exit*/ return TRUE; } diff -Nru erlang-13.b.1-dfsg/erts/emulator/drivers/win32/win_con.c erlang-13.b.3-dfsg/erts/emulator/drivers/win32/win_con.c --- erlang-13.b.1-dfsg/erts/emulator/drivers/win32/win_con.c 2009-04-16 10:23:51.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/drivers/win32/win_con.c 2009-09-18 15:07:44.000000000 +0100 @@ -1800,7 +1800,7 @@ ofn.nMaxFileTitle = MAXFILENAME; ofn.lpstrTitle = TEXT("Open logfile"); ofn.lpstrDefExt = TEXT("log"); - ofn.Flags = OFN_CREATEPROMPT|OFN_HIDEREADONLY|OFN_EXPLORER|OFN_ENABLEHOOK; + ofn.Flags = OFN_CREATEPROMPT|OFN_HIDEREADONLY|OFN_EXPLORER|OFN_ENABLEHOOK|OFN_NOCHANGEDIR; /* OFN_NOCHANGEDIR only works in Vista :( */ ofn.lpfnHook = OFNHookProc; if (!GetOpenFileName ((LPOPENFILENAME)&ofn)){ diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_amd64_bifs.m4 erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_amd64_bifs.m4 --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_amd64_bifs.m4 2009-03-12 12:16:06.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_amd64_bifs.m4 2009-09-21 10:21:55.000000000 +0100 @@ -127,12 +127,12 @@ #endif') /* - * trap_bif_interface_0(nbif_name, cbif_name) + * fail_bif_interface_0(nbif_name, cbif_name) * * Generate native interface for a BIF with 0 parameters and - * trap-only failure mode. + * standard failure mode. */ -define(trap_bif_interface_0, +define(fail_bif_interface_0, ` #ifndef HAVE_$1 #`define' HAVE_$1 @@ -151,7 +151,7 @@ /* throw exception if failure, otherwise return */ TEST_GOT_EXN - jz nbif_0_trap_exception + jz nbif_0_simple_exception NBIF_RET(0) HANDLE_GOT_MBUF(0) .size $1,.-$1 diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_amd64_glue.S erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_amd64_glue.S --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_amd64_glue.S 2009-03-12 12:16:07.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_amd64_glue.S 2009-09-21 10:21:55.000000000 +0100 @@ -356,10 +356,15 @@ * exceptional condition. * The stack/heap registers were just read from P. */ + .global nbif_0_simple_exception .global nbif_1_simple_exception .global nbif_2_simple_exception .global nbif_3_simple_exception .align 4 +nbif_0_simple_exception: + xorl %eax, %eax + jmp .nbif_simple_exception + .align 4 nbif_1_simple_exception: movl $1, %eax jmp .nbif_simple_exception @@ -394,10 +399,6 @@ * - the BIF's arity is in %rax * - the native heap/stack/reds registers are saved in P */ - .global nbif_0_trap_exception - .align 4 -nbif_0_trap_exception: - xorl %eax, %eax .handle_trap: movq %rax, P_NARITY(P) movl $HIPE_MODE_SWITCH_RES_TRAP, %eax diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_arm_bifs.m4 erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_arm_bifs.m4 --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_arm_bifs.m4 2009-03-12 12:16:08.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_arm_bifs.m4 2009-09-21 10:21:56.000000000 +0100 @@ -114,12 +114,12 @@ #endif') /* - * trap_bif_interface_0(nbif_name, cbif_name) + * fail_bif_interface_0(nbif_name, cbif_name) * * Generate native interface for a BIF with 0 parameters and - * trap-only failure mode. + * standard failure mode. */ -define(trap_bif_interface_0, +define(fail_bif_interface_0, ` #ifndef HAVE_$1 #`define' HAVE_$1 @@ -136,7 +136,7 @@ /* Restore registers. Check for exception. */ cmp r0, #THE_NON_VALUE RESTORE_CONTEXT_BIF - beq nbif_0_trap_exception + beq nbif_0_simple_exception NBIF_RET(0) .size $1, .-$1 .type $1, %function diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_arm.c erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_arm.c --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_arm.c 2009-03-12 12:16:08.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_arm.c 2009-09-18 15:09:02.000000000 +0100 @@ -33,12 +33,22 @@ /* Flush dcache and invalidate icache for a range of addresses. */ void hipe_flush_icache_range(void *address, unsigned int nbytes) { +#if defined(__ARM_EABI__) + register unsigned long beg __asm__("r0") = (unsigned long)address; + register unsigned long end __asm__("r1") = (unsigned long)address + nbytes; + register unsigned long flg __asm__("r2") = 0; + register unsigned long scno __asm__("r7") = 0xf0002; + __asm__ __volatile__("swi 0" /* sys_cacheflush() */ + : "=r"(beg) + : "0"(beg), "r"(end), "r"(flg), "r"(scno)); +#else register unsigned long beg __asm__("r0") = (unsigned long)address; register unsigned long end __asm__("r1") = (unsigned long)address + nbytes; register unsigned long flg __asm__("r2") = 0; __asm__ __volatile__("swi 0x9f0002" /* sys_cacheflush() */ : "=r"(beg) : "0"(beg), "r"(end), "r"(flg)); +#endif } void hipe_flush_icache_word(void *address) diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_arm_glue.S erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_arm_glue.S --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_arm_glue.S 2009-03-12 12:16:09.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_arm_glue.S 2009-09-21 10:21:56.000000000 +0100 @@ -327,6 +327,10 @@ * NSP has not been saved in P. * TEMP_LR contains a copy of LR */ + .global nbif_0_simple_exception +nbif_0_simple_exception: + mov r1, #0 + b .nbif_simple_exception .global nbif_1_simple_exception nbif_1_simple_exception: mov r1, #1 @@ -367,9 +371,6 @@ * - HP was just read from P * - NSP has not been saved in P */ - .global nbif_0_trap_exception -nbif_0_trap_exception: - mov r1, #0 .handle_trap: mov r0, #HIPE_MODE_SWITCH_RES_TRAP str NSP, [P, #P_NSP] diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_bif_list.m4 erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_bif_list.m4 --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_bif_list.m4 2009-03-12 12:16:11.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_bif_list.m4 2009-09-21 10:21:55.000000000 +0100 @@ -59,13 +59,10 @@ * BIF failure modes: * - none: may not signal any exception * The BIF wrapper needs no checks before returning. - * - trap: may signal TRAP exceptions - * The BIF wrapper must check for an exception before returning. - * Zero-arity BIFs never signal Erlang-level exceptions, - * but may signal internal implementaton-level exceptions, - * currently only TRAP. * - standard: may signal any exception * The BIF wrapper must check for an exception before returning. + * Zero-arity BIFs signal no exceptions, except in a small number + * of cases explicitly enumerated here. */ /**************************************************************** @@ -84,10 +81,10 @@ */ /* - * trap_bif_interface_0(nbif_name, cbif_name) + * fail_bif_interface_0(nbif_name, cbif_name) * - * A BIF which may fail with TRAP, otherwise - * identical to nofail_primop_interface_N. + * A zero-arity BIF which may fail, otherwise + * identical to standard_bif_interface_N. */ /* @@ -151,9 +148,10 @@ ****************************************************************/ /* - * BIFs with trap-only failure modes. + * Zero-arity BIFs that can fail. */ -trap_bif_interface_0(nbif_processes_0, processes_0) +fail_bif_interface_0(nbif_memory_0, memory_0) +fail_bif_interface_0(nbif_processes_0, processes_0) /* * BIFs and primops that may do a GC (change heap limit and walk the native stack). diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_mode_switch.c erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_mode_switch.c --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_mode_switch.c 2009-03-12 12:16:12.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_mode_switch.c 2009-11-25 10:59:54.000000000 +0000 @@ -315,7 +315,7 @@ * Native code called a BIF, which "failed" with a TRAP to BEAM. * Prior to returning, the BIF stored (see BIF_TRAP): - * the callee's Export* in p->def_arg_reg[3] + * the callee's address in p->def_arg_reg[3] * the callee's parameters in p->def_arg_reg[0..2] * the callee's arity in p->arity (for BEAM gc purposes) * @@ -334,7 +334,7 @@ p->arity = p->hipe.narity; /* caller's arity */ is_recursive = hipe_call_from_native_is_recursive(p, reg); - p->i = ((Export*)(p->def_arg_reg[3]))->address; + p->i = (Eterm *)(p->def_arg_reg[3]); p->arity = callee_arity; for (i = 0; i < p->arity; ++i) diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_ppc_bifs.m4 erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_ppc_bifs.m4 --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_ppc_bifs.m4 2009-03-12 12:16:15.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_ppc_bifs.m4 2009-09-21 10:21:55.000000000 +0100 @@ -124,12 +124,12 @@ #endif') /* - * trap_bif_interface_0(nbif_name, cbif_name) + * fail_bif_interface_0(nbif_name, cbif_name) * * Generate native interface for a BIF with 0 parameters and - * trap-only failure mode. + * standard failure mode. */ -define(trap_bif_interface_0, +define(fail_bif_interface_0, ` #ifndef HAVE_$1 #`define' HAVE_$1 @@ -149,7 +149,7 @@ beq- 1f NBIF_RET(0) 1: /* workaround for bc:s small offset operand */ - b CSYM(nbif_0_trap_exception) + b CSYM(nbif_0_simple_exception) HANDLE_GOT_MBUF(0) SET_SIZE(ASYM($1)) TYPE_FUNCTION(ASYM($1)) diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_ppc_glue.S erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_ppc_glue.S --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_ppc_glue.S 2009-03-12 12:16:16.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_ppc_glue.S 2009-09-21 10:21:56.000000000 +0100 @@ -491,6 +491,10 @@ * The heap pointer was just read from P. * TEMP_LR contains a copy of LR */ + GLOBAL(CSYM(nbif_0_simple_exception)) +CSYM(nbif_0_simple_exception): + li r4, 0 + b .nbif_simple_exception GLOBAL(CSYM(nbif_1_simple_exception)) CSYM(nbif_1_simple_exception): li r4, 1 @@ -532,9 +536,6 @@ * - the native RA was saved in TEMP_LR before the BIF call * - the native heap/stack/reds registers are saved in P */ - GLOBAL(CSYM(nbif_0_trap_exception)) -CSYM(nbif_0_trap_exception): - li r4, 0 .handle_trap: li r3, HIPE_MODE_SWITCH_RES_TRAP STORE NSP, P_NSP(P) diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_sparc_bifs.m4 erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_sparc_bifs.m4 --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_sparc_bifs.m4 2009-03-12 12:16:18.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_sparc_bifs.m4 2009-09-21 10:21:54.000000000 +0100 @@ -124,12 +124,12 @@ #endif') /* - * trap_bif_interface_0(nbif_name, cbif_name) + * fail_bif_interface_0(nbif_name, cbif_name) * * Generate native interface for a BIF with 0 parameters and - * trap-only failure mode. + * standard failure mode. */ -define(trap_bif_interface_0, +define(fail_bif_interface_0, ` #ifndef HAVE_$1 #`define' HAVE_$1 @@ -145,7 +145,7 @@ TEST_GOT_MBUF /* Restore registers. Check for exception. */ - __TEST_GOT_EXN(nbif_0_trap_exception) + TEST_GOT_EXN(0) RESTORE_CONTEXT_BIF NBIF_RET(0) HANDLE_GOT_MBUF(0) diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_sparc_glue.S erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_sparc_glue.S --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_sparc_glue.S 2009-03-12 12:16:19.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_sparc_glue.S 2009-09-21 10:21:54.000000000 +0100 @@ -348,6 +348,10 @@ * NSP has not been saved in P. * TEMP_LR contains a copy of LR */ + .global nbif_0_simple_exception +nbif_0_simple_exception: + ba .nbif_simple_exception + mov 0, %o1 /* delay slot */ .global nbif_1_simple_exception nbif_1_simple_exception: ba .nbif_simple_exception @@ -392,9 +396,6 @@ * - HP has not been read from P * - NSP has not been saved in P */ - .global nbif_0_trap_exception -nbif_0_trap_exception: - mov 0, %o1 .handle_trap: mov HIPE_MODE_SWITCH_RES_TRAP, %o0 .bif_exit: diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_x86_bifs.m4 erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_x86_bifs.m4 --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_x86_bifs.m4 2009-03-12 12:16:21.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_x86_bifs.m4 2009-09-21 10:21:54.000000000 +0100 @@ -142,12 +142,12 @@ #endif') /* - * trap_bif_interface_0(nbif_name, cbif_name) + * fail_bif_interface_0(nbif_name, cbif_name) * * Generate native interface for a BIF with 0 parameters and - * trap-only failure mode. + * standard failure mode. */ -define(trap_bif_interface_0, +define(fail_bif_interface_0, ` #ifndef HAVE_$1 #`define' HAVE_$1 @@ -168,7 +168,7 @@ /* throw exception if failure, otherwise return */ TEST_GOT_EXN - jz nbif_0_trap_exception + jz nbif_0_simple_exception NBIF_RET(0) HANDLE_GOT_MBUF(0) SET_SIZE(ASYM($1)) diff -Nru erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_x86_glue.S erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_x86_glue.S --- erlang-13.b.1-dfsg/erts/emulator/hipe/hipe_x86_glue.S 2009-03-12 12:16:22.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/hipe/hipe_x86_glue.S 2009-09-21 10:21:55.000000000 +0100 @@ -333,10 +333,15 @@ * exceptional condition. * The stack/heap registers were just read from P. */ + GLOBAL(nbif_0_simple_exception) GLOBAL(nbif_1_simple_exception) GLOBAL(nbif_2_simple_exception) GLOBAL(nbif_3_simple_exception) .align 4 +nbif_0_simple_exception: + xorl %eax, %eax + jmp .nbif_simple_exception + .align 4 nbif_1_simple_exception: movl $1, %eax jmp .nbif_simple_exception @@ -371,10 +376,6 @@ * - the BIF's arity is in %eax * - the native heap/stack/reds registers are saved in P */ - GLOBAL(nbif_0_trap_exception) - .align 4 -nbif_0_trap_exception: - xorl %eax, %eax .handle_trap: movl %eax, P_NARITY(P) movl $HIPE_MODE_SWITCH_RES_TRAP, %eax diff -Nru erlang-13.b.1-dfsg/erts/emulator/Makefile.in erlang-13.b.3-dfsg/erts/emulator/Makefile.in --- erlang-13.b.1-dfsg/erts/emulator/Makefile.in 2009-04-16 10:23:30.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/Makefile.in 2009-11-20 13:29:19.000000000 +0000 @@ -23,6 +23,7 @@ ENABLE_ALLOC_TYPE_VARS = @ENABLE_ALLOC_TYPE_VARS@ HIPE_ENABLED=@HIPE_ENABLED@ LIBS = @LIBS@ +Z_LIB=@Z_LIB@ NO_INLINE_FUNCTIONS=false OPCODE_TABLES = $(ERL_TOP)/lib/compiler/src/genop.tab beam/ops.tab @@ -256,24 +257,32 @@ else CS_CFLAGS = $(CS_CFLAGS_) endif +CS_LDFLAGS = $(LDFLAGS) CS_LIBS = -L../lib/internal/$(TARGET) -lerts_internal @ERTS_INTERNAL_X_LIBS@ LIBS += @TERMCAP_LIB@ -L../lib/internal/$(TARGET) @ERTS_INTERNAL_X_LIBS@ +ifdef Z_LIB +# Use shared zlib library +LIBS += $(Z_LIB) +else ifeq ($(TARGET),win32) -LIBS += \ - -L$(ERL_TOP)/erts/emulator/zlib/obj/$(TARGET)/$(TYPE) -lz \ - -L$(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE) -lepcre -DEPLIBS = \ - $(ERL_TOP)/erts/emulator/zlib/obj/$(TARGET)/$(TYPE)/z.lib \ - $(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE)/epcre.lib +LIBS += -L$(ERL_TOP)/erts/emulator/zlib/obj/$(TARGET)/$(TYPE) -lz +DEPLIBS = $(ERL_TOP)/erts/emulator/zlib/obj/$(TARGET)/$(TYPE)/z.lib else # Build on darwin fails if -lz is used -LIBS += \ - $(ERL_TOP)/erts/emulator/zlib/obj/$(TARGET)/$(TYPE)/libz.a \ - $(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE)/libepcre.a -DEPLIBS = \ - $(ERL_TOP)/erts/emulator/zlib/obj/$(TARGET)/$(TYPE)/libz.a \ +LIBS += $(ERL_TOP)/erts/emulator/zlib/obj/$(TARGET)/$(TYPE)/libz.a +DEPLIBS = $(ERL_TOP)/erts/emulator/zlib/obj/$(TARGET)/$(TYPE)/libz.a +endif + +endif + +ifeq ($(TARGET),win32) +LIBS += -L$(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE) -lepcre +DEPLIBS += $(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE)/epcre.lib +else +LIBS += $(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE)/libepcre.a +DEPLIBS += \ $(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE)/libepcre.a \ $(ERL_TOP)/erts/lib/internal/$(TARGET)/liberts_internal.a # rem liberts_internal.a @@ -312,6 +321,8 @@ LIBS += @LIBRT@ +LIBS += @LIBCARBON@ + TTF_DIR=$(TARGET)/$(TYPE)/$(FLAVOR) CREATE_DIRS += $(TTF_DIR) @@ -369,8 +380,13 @@ endif endif +ifdef Z_LIB +zlib: + @echo 'Skip zlib directory, use shared library' +else zlib: @set -e ; cd zlib && $(MAKE) TYPE=$(TYPE) $(TYPE) +endif pcre: @set -e ; cd pcre && $(MAKE) TYPE=$(TYPE) $(TYPE) @@ -400,7 +416,7 @@ RELSYSDIR = $(RELEASE_PATH)/erts-$(VSN) -RELEASE_INCLUDES = beam/erl_driver.h sys/$(ERLANG_OSTYPE)/driver_int.h +RELEASE_INCLUDES = beam/erl_driver.h sys/$(ERLANG_OSTYPE)/driver_int.h beam/erl_nif.h beam/erl_nif_api_funcs.h ifeq ($(TARGET),win32) RELEASE_INCLUDES += sys/$(ERLANG_OSTYPE)/erl_win_dyn_driver.h endif @@ -554,7 +570,13 @@ # ---------------------------------------------------------------------- # Pattern rules # -COMMON_INCLUDES = -Ibeam -Isys/$(ERLANG_OSTYPE) -Isys/common -I$(TARGET) -Izlib -Ipcre -Ihipe -I../include/internal -I../include/internal/$(TARGET) +COMMON_INCLUDES = -Ibeam -Isys/$(ERLANG_OSTYPE) -Isys/common -I$(TARGET) +ifndef Z_LIB +COMMON_INCLUDES += -Izlib +endif +COMMON_INCLUDES += -Ipcre -Ihipe +COMMON_INCLUDES += -I../include -I../include/$(TARGET) +COMMON_INCLUDES += -I../include/internal -I../include/internal/$(TARGET) INCLUDES = -I$(TTF_DIR) $(COMMON_INCLUDES) @@ -654,8 +676,8 @@ CS_SRC = sys/$(ERLANG_OSTYPE)/erl_child_setup.c $(BINDIR)/$(CS_EXECUTABLE): $(CS_SRC) - $(CS_PURIFY) $(CC) -o $(BINDIR)/$(CS_EXECUTABLE) \ - $(CS_CFLAGS) $(COMMON_INCLUDES) $(CS_SRC) $(CS_LIBS) + $(CS_PURIFY) $(CC) $(CS_LDFLAGS) -o $(BINDIR)/$(CS_EXECUTABLE) \ + $(CS_CFLAGS) $(COMMON_INCLUDES) $(CS_SRC) $(CS_LIBS) $(OBJDIR)/%.elib.o: beam/%.c $(CC) $(ELIB_FLAGS) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@ @@ -754,7 +776,8 @@ $(OBJDIR)/erl_obsolete.o $(OBJDIR)/erl_bif_timer.o \ $(OBJDIR)/erl_drv_thread.o $(OBJDIR)/erl_bif_chksum.o \ $(OBJDIR)/erl_bif_re.o $(OBJDIR)/erl_unicode.o \ - $(OBJDIR)/packet_parser.o $(OBJDIR)/safe_hash.o + $(OBJDIR)/packet_parser.o $(OBJDIR)/safe_hash.o \ + $(OBJDIR)/erl_zlib.o $(OBJDIR)/erl_nif.o ifeq ($(TARGET),win32) DRV_OBJS = \ diff -Nru erlang-13.b.1-dfsg/erts/emulator/sys/common/erl_mseg.c erlang-13.b.3-dfsg/erts/emulator/sys/common/erl_mseg.c --- erlang-13.b.1-dfsg/erts/emulator/sys/common/erl_mseg.c 2009-03-12 12:16:28.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/sys/common/erl_mseg.c 2009-11-20 13:31:33.000000000 +0000 @@ -39,6 +39,10 @@ #if HAVE_ERTS_MSEG +#if defined(USE_THREADS) && !defined(ERTS_SMP) +# define ERTS_THREADS_NO_SMP +#endif + #define SEGTYPE ERTS_MTRACE_SEGMENT_ID #ifndef HAVE_GETPAGESIZE @@ -75,6 +79,9 @@ static void check_cache(void *unused); static void mseg_clear_cache(void); static int is_cache_check_scheduled; +#ifdef ERTS_THREADS_NO_SMP +static int is_cache_check_requested; +#endif #if HAVE_MMAP /* Mmap ... */ @@ -216,126 +223,66 @@ static erts_mtx_t init_atoms_mutex; /* Also needed when !USE_THREADS */ #ifdef USE_THREADS -#ifndef ERTS_SMP -static erts_cnd_t mseg_cond; -static int do_shutdown; +#ifdef ERTS_THREADS_NO_SMP +static erts_tid_t main_tid; +static int async_handle = -1; #endif static void thread_safe_init(void) { erts_mtx_init(&init_atoms_mutex, "mseg_init_atoms"); erts_mtx_init(&mseg_mutex, "mseg"); -#ifndef ERTS_SMP - erts_cnd_init(&mseg_cond); - do_shutdown = 0; +#ifdef ERTS_THREADS_NO_SMP + main_tid = erts_thr_self(); #endif } #endif -#if defined(USE_THREADS) && !defined(ERTS_SMP) - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ - * Non-SMP multi-threaded case * -\* */ - -static erts_thr_timeval_t check_time; -static erts_tid_t mseg_cc_tid; - -static void * -mseg_cache_cleaner(void *unused) -{ - int res; - -#ifdef ERTS_ENABLE_LOCK_CHECK - erts_lc_set_thread_name("memory segment cache cleaner"); -#endif - - erts_mtx_lock(&mseg_mutex); - - while (!do_shutdown) { - - while (!is_cache_check_scheduled && !do_shutdown) - erts_cnd_wait(&mseg_cond, &mseg_mutex); - - res = 0; - while (res != ETIMEDOUT && !do_shutdown) - res = erts_cnd_timedwait(&mseg_cond, &mseg_mutex, &check_time); - - if (do_shutdown) - mseg_clear_cache(); - else - check_cache(NULL); - } - - erts_mtx_unlock(&mseg_mutex); - return NULL; -} - -static void -mseg_shutdown(void) -{ - erts_mtx_lock(&mseg_mutex); - do_shutdown = 1; - erts_cnd_signal(&mseg_cond); - erts_mtx_unlock(&mseg_mutex); - erts_thr_join(mseg_cc_tid, NULL); - erts_mtx_destroy(&mseg_mutex); - erts_cnd_destroy(&mseg_cond); -} +static ErlTimer cache_check_timer; static ERTS_INLINE void schedule_cache_check(void) { if (!is_cache_check_scheduled && is_init_done) { - erts_thr_time_now(&check_time); - check_time.tv_sec += cache_check_interval / 1000; - check_time.tv_nsec += (cache_check_interval % 1000)*1000000; - if (check_time.tv_nsec >= 1000000000) { - check_time.tv_sec++; - check_time.tv_nsec -= 1000000000; +#ifdef ERTS_THREADS_NO_SMP + if (!erts_equal_tids(erts_thr_self(), main_tid)) { + if (!is_cache_check_requested) { + is_cache_check_requested = 1; + sys_async_ready(async_handle); + } + } + else +#endif + { + cache_check_timer.active = 0; + erl_set_timer(&cache_check_timer, + check_cache, + NULL, + NULL, + cache_check_interval); + is_cache_check_scheduled = 1; +#ifdef ERTS_THREADS_NO_SMP + is_cache_check_requested = 0; +#endif } - ASSERT(check_time.tv_nsec < 1000000000); - is_cache_check_scheduled = 1; - erts_cnd_signal(&mseg_cond); } } -static void -mseg_late_init(void) -{ - erts_thr_opts_t opts = ERTS_THR_OPTS_DEFAULT_INITER; - opts.detached = 0; - opts.suggested_stack_size = 8; /* kilo words */ - erts_thr_create(&mseg_cc_tid, mseg_cache_cleaner, NULL, &opts); -} - -#else /* #if defined(USE_THREADS) && !defined(ERTS_SMP) */ +#ifdef ERTS_THREADS_NO_SMP -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ - * Single-threaded and SMP case * -\* */ - -static ErlTimer cache_check_timer; - -static ERTS_INLINE void -schedule_cache_check(void) +static void +check_schedule_cache_check(void) { - if (!is_cache_check_scheduled && is_init_done) { - cache_check_timer.active = 0; - erl_set_timer(&cache_check_timer, - check_cache, - NULL, - NULL, - cache_check_interval); - is_cache_check_scheduled = 1; + erts_mtx_lock(&mseg_mutex); + if (is_cache_check_requested + && !is_cache_check_scheduled) { + schedule_cache_check(); } + erts_mtx_unlock(&mseg_mutex); } -static void -mseg_late_init(void) -{ -} +#endif static void mseg_shutdown(void) @@ -349,8 +296,6 @@ #endif } -#endif /* #if defined(USE_THREADS) && !defined(ERTS_SMP) */ - static ERTS_INLINE void * mseg_create(Uint size) { @@ -1406,6 +1351,11 @@ min_cached_seg_size = ~((Uint) 0); cache_size = 0; + is_cache_check_scheduled = 0; +#ifdef ERTS_THREADS_NO_SMP + is_cache_check_requested = 0; +#endif + if (max_cache_size > MAX_CACHE_SIZE) max_cache_size = MAX_CACHE_SIZE; @@ -1435,9 +1385,16 @@ void erts_mseg_late_init(void) { - mseg_late_init(); +#ifdef ERTS_THREADS_NO_SMP + int handle = + erts_register_async_ready_callback( + check_schedule_cache_check); +#endif erts_mtx_lock(&mseg_mutex); is_init_done = 1; +#ifdef ERTS_THREADS_NO_SMP + async_handle = handle; +#endif if (cache_size) schedule_cache_check(); erts_mtx_unlock(&mseg_mutex); diff -Nru erlang-13.b.1-dfsg/erts/emulator/sys/unix/erl_unix_sys_ddll.c erlang-13.b.3-dfsg/erts/emulator/sys/unix/erl_unix_sys_ddll.c --- erlang-13.b.1-dfsg/erts/emulator/sys/unix/erl_unix_sys_ddll.c 2009-03-12 12:16:30.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/sys/unix/erl_unix_sys_ddll.c 2009-11-20 13:32:26.000000000 +0000 @@ -49,18 +49,25 @@ static int num_errcodes = 0; static int num_errcodes_allocated = 0; +#define my_strdup(WHAT) my_strdup_in(ERTS_ALC_T_DDLL_ERRCODES, WHAT); -static char *my_strdup(char *what) +static char *my_strdup_in(ErtsAlcType_t type, char *what) { - char *res = erts_alloc(ERTS_ALC_T_DDLL_ERRCODES, strlen(what) + 1); + char *res = erts_alloc(type, strlen(what) + 1); strcpy(res, what); return res; } -static int find_errcode(char *string) + +static int find_errcode(char *string, ErtsSysDdllError* err) { int i; + if (err != NULL) { + erts_sys_ddll_free_error(err); /* in case we ignored an earlier error */ + err->str = my_strdup_in(ERTS_ALC_T_DDLL_TMP_BUF, string); + return 0; + } for(i=0;i= MAX_NAME_LEN-EXT_LEN) { - return ERL_DE_LOAD_ERROR_NAME_TO_LONG; - } + dlname = erts_alloc(ERTS_ALC_T_TMP, len + EXT_LEN + 1); sys_strcpy(dlname, full_name); sys_strcpy(dlname+len, FILE_EXT); - return erts_sys_ddll_open_noext(dlname, handle); + ret = erts_sys_ddll_open_noext(dlname, handle, err); + + erts_free(ERTS_ALC_T_TMP, (void *) dlname); + return ret; #else return ERL_DE_ERROR_NO_DDLL_FUNCTIONALITY; #endif } -int erts_sys_ddll_open_noext(char *dlname, void **handle) +int erts_sys_ddll_open_noext(char *dlname, void **handle, ErtsSysDdllError* err) { int ret = ERL_DE_NO_ERROR; char *str; @@ -120,21 +129,23 @@ if ((*handle = dlopen(dlname, RTLD_NOW)) == NULL) { str = dlerror(); - /* - * Remove prefix filename to avoid exploading number of - * error codes on extreme usage. - */ - if (strstr(str,dlname) == str) { - char *save_str = str; - str += strlen(dlname); - while (*str == ':' || *str == ' ') { - ++str; - } - if (*str == '\0') { /* Better with filename than nothing... */ - str = save_str; + if (err == NULL) { + /* + * Remove prefix filename to avoid exploading number of + * error codes on extreme usage. + */ + if (strstr(str,dlname) == str) { + char *save_str = str; + str += strlen(dlname); + while (*str == ':' || *str == ' ') { + ++str; + } + if (*str == '\0') { /* Better with filename than nothing... */ + str = save_str; + } } } - ret = ERL_DE_DYNAMIC_ERROR_OFFSET - find_errcode(str); + ret = ERL_DE_DYNAMIC_ERROR_OFFSET - find_errcode(str, err); } return ret; } @@ -142,7 +153,8 @@ /* * Find a symbol in the shared object */ -int erts_sys_ddll_sym(void *handle, char *func_name, void **function) +int erts_sys_ddll_sym2(void *handle, char *func_name, void **function, + ErtsSysDdllError* err) { #if defined(HAVE_DLOPEN) void *sym; @@ -151,7 +163,7 @@ dlerror(); sym = dlsym(handle, func_name); if ((e = dlerror()) != NULL) { - ret = ERL_DE_DYNAMIC_ERROR_OFFSET - find_errcode(e); + ret = ERL_DE_DYNAMIC_ERROR_OFFSET - find_errcode(e, err); } else { *function = sym; ret = ERL_DE_NO_ERROR; @@ -172,8 +184,21 @@ { void *fn; int res; - if ((res = erts_sys_ddll_sym(handle, "driver_init", &fn)) != ERL_DE_NO_ERROR) { - res = erts_sys_ddll_sym(handle, "_driver_init", &fn); + if ((res = erts_sys_ddll_sym2(handle, "driver_init", &fn, NULL)) != ERL_DE_NO_ERROR) { + res = erts_sys_ddll_sym2(handle, "_driver_init", &fn, NULL); + } + if (res == ERL_DE_NO_ERROR) { + *function = fn; + } + return res; +} + +int erts_sys_ddll_load_nif_init(void *handle, void **function, ErtsSysDdllError* err) +{ + void *fn; + int res; + if ((res = erts_sys_ddll_sym2(handle, "nif_init", &fn, err)) != ERL_DE_NO_ERROR) { + res = erts_sys_ddll_sym2(handle, "_nif_init", &fn, err); } if (res == ERL_DE_NO_ERROR) { *function = fn; @@ -188,12 +213,16 @@ void *(*initfn)(void) = function; return (*initfn)(); } +void *erts_sys_ddll_call_nif_init(void *function) { + return erts_sys_ddll_call_init(function); +} + /* * Close a chared object */ -int erts_sys_ddll_close(void *handle) +int erts_sys_ddll_close2(void *handle, ErtsSysDdllError* err) { #if defined(HAVE_DLOPEN) int ret; @@ -203,9 +232,10 @@ ret = ERL_DE_NO_ERROR; } else { if ((s = dlerror()) == NULL) { + find_errcode("unspecified error", err); ret = ERL_DE_ERROR_UNSPECIFIED; } else { - ret = ERL_DE_DYNAMIC_ERROR_OFFSET - find_errcode(s); + ret = ERL_DE_DYNAMIC_ERROR_OFFSET - find_errcode(s, err); } } return ret; @@ -240,3 +270,11 @@ #endif return "no error"; } + +void erts_sys_ddll_free_error(ErtsSysDdllError* err) +{ + if (err->str != NULL) { + erts_free(ERTS_ALC_T_DDLL_TMP_BUF, err->str); + } +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/sys/unix/sys_float.c erlang-13.b.3-dfsg/erts/emulator/sys/unix/sys_float.c --- erlang-13.b.1-dfsg/erts/emulator/sys/unix/sys_float.c 2009-03-12 12:16:31.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/sys/unix/sys_float.c 2009-11-20 13:31:25.000000000 +0000 @@ -57,6 +57,7 @@ void erts_thread_init_fp_exception(void) { unsigned long *fpe = erts_alloc(ERTS_ALC_T_FP_EXCEPTION, sizeof(*fpe)); + *fpe = 0L; erts_tsd_set(fpe_key, fpe); } @@ -153,9 +154,12 @@ return unmasked; } -#if defined(__x86_64__) || defined(__DARWIN__) +#if defined(__x86_64__) + static inline int cpu_has_sse2(void) { return 1; } + #else /* !__x86_64__ */ + /* * Check if an x86-32 processor has SSE2. */ @@ -181,21 +185,33 @@ static __inline__ unsigned int cpuid_eax(unsigned int op) { - unsigned int eax; - __asm__("cpuid" - : "=a"(eax) - : "0"(op) - : "bx", "cx", "dx"); + unsigned int eax, save_ebx; + + /* In PIC mode i386 reserves EBX. So we must save + and restore it ourselves to not upset gcc. */ + __asm__( + "movl %%ebx, %1\n\t" + "cpuid\n\t" + "movl %1, %%ebx" + : "=a"(eax), "=m"(save_ebx) + : "0"(op) + : "cx", "dx"); return eax; } static __inline__ unsigned int cpuid_edx(unsigned int op) { - unsigned int eax, edx; - __asm__("cpuid" - : "=a"(eax), "=d"(edx) - : "0"(op) - : "bx", "cx"); + unsigned int eax, edx, save_ebx; + + /* In PIC mode i386 reserves EBX. So we must save + and restore it ourselves to not upset gcc. */ + __asm__( + "movl %%ebx, %2\n\t" + "cpuid\n\t" + "movl %2, %%ebx" + : "=a"(eax), "=d"(edx), "=m"(save_ebx) + : "0"(op) + : "cx"); return edx; } @@ -792,6 +808,8 @@ int matherr(struct exception *exc) { +#if !defined(NO_FPE_SIGNALS) set_current_fp_exception((unsigned long)__builtin_return_address(0)); +#endif return 1; } diff -Nru erlang-13.b.1-dfsg/erts/emulator/sys/vxworks/erl_vxworks_sys_ddll.c erlang-13.b.3-dfsg/erts/emulator/sys/vxworks/erl_vxworks_sys_ddll.c --- erlang-13.b.1-dfsg/erts/emulator/sys/vxworks/erl_vxworks_sys_ddll.c 2009-03-12 12:16:31.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/sys/vxworks/erl_vxworks_sys_ddll.c 2009-11-20 13:32:27.000000000 +0000 @@ -69,11 +69,11 @@ /* * Open a shared object */ -int erts_sys_ddll_open(char *full_name, void **handle) +int erts_sys_ddll_open2(char *full_name, void **handle, ErtsSysDdllError* err) { int len; - if (erts_sys_ddll_open_noext(full_name, handle) == ERL_DE_NO_ERROR) { + if (erts_sys_ddll_open_noext(full_name, handle, err) == ERL_DE_NO_ERROR) { return ERL_DE_NO_ERROR; } if ((len = sys_strlen(full_name)) > PATH_MAX-EXT_LEN) { @@ -83,14 +83,14 @@ sys_strcpy(dlname, full_name); sys_strcpy(dlname+len, FILE_EXT); - if (erts_sys_ddll_open_noext(dlname, handle) == ERL_DE_NO_ERROR) { + if (erts_sys_ddll_open_noext(dlname, handle, err) == ERL_DE_NO_ERROR) { return ERL_DE_NO_ERROR; } sys_strcpy(dlname+len, ALT_FILE_EXT); - return erts_sys_ddll_open_noext(dlname, handle); + return erts_sys_ddll_open_noext(dlname, handle, err); } } -int erts_sys_ddll_open_noext(char *dlname, void **handle) +int erts_sys_ddll_open_noext(char *dlname, void **handle, ErtsSysDdllError* err) { MODULE_ID mid; @@ -105,7 +105,7 @@ * Find a symbol in the shared object */ #define PREALLOC_BUFFER_SIZE 256 -int erts_sys_ddll_sym(void *handle, char *func_name, void **function) +int erts_sys_ddll_sym2(void *handle, char *func_name, void **function, ErtsSysDdllError* err) { FUNCPTR proc; static char statbuf[PREALLOC_BUFFER_SIZE]; @@ -176,6 +176,12 @@ return ERL_DE_NO_ERROR; } +int erts_sys_ddll_load_nif_init(void *handle, void **function, ErtsSysDdllError* err) +{ + /* NIFs not implemented for vxworks */ + return ERL_DE_ERROR_NO_DDLL_FUNCTIONALITY; +} + /* * Call the driver_init function, whatever it's really called, simple on unix... */ @@ -183,12 +189,15 @@ void *(*initfn)(void) = function; return (*initfn)(); } +void *erts_sys_ddll_call_nif_init(void *function) { + return erts_sys_ddll_call_init(function); +} /* * Close a chared object */ -int erts_sys_ddll_close(void *handle) +int erts_sys_ddll_close2(void *handle, ErtsSysDdllError* err) { MODULE_ID mid = (MODULE_ID) handle; if (unld(mid, 0) < 0) { @@ -236,3 +245,9 @@ } return mid; } + +void erts_sys_ddll_free_error(ErtsSysDdllError* err) +{ + /* NYI */ +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/sys/win32/erl_win32_sys_ddll.c erlang-13.b.3-dfsg/erts/emulator/sys/win32/erl_win32_sys_ddll.c --- erlang-13.b.1-dfsg/erts/emulator/sys/win32/erl_win32_sys_ddll.c 2009-03-12 12:16:33.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/emulator/sys/win32/erl_win32_sys_ddll.c 2009-11-20 13:32:27.000000000 +0000 @@ -32,38 +32,54 @@ #include "erl_driver.h" #include "erl_win_dyn_driver.h" +#include "erl_nif.h" + #define EXT_LEN 4 #define FILE_EXT ".dll" static DWORD tls_index = 0; static TWinDynDriverCallbacks wddc; +static TWinDynNifCallbacks nif_callbacks; void erl_sys_ddll_init(void) { tls_index = TlsAlloc(); ERL_INIT_CALLBACK_STRUCTURE(wddc); + +#define ERL_NIF_API_FUNC_DECL(RET,NAME,ARGS) nif_callbacks.NAME = NAME +#include "erl_nif_api_funcs.h" +#undef ERL_NIF_API_FUNC_DECL + return; } + /* * Open a shared object */ -int erts_sys_ddll_open(char *full_name, void **handle) +int erts_sys_ddll_open2(char *full_name, void **handle, ErtsSysDdllError* err) { int len; char dlname[MAXPATHLEN + 1]; if ((len = sys_strlen(full_name)) >= MAXPATHLEN - EXT_LEN) { + if (err != NULL) { + err->str = "Library name too long"; + } return ERL_DE_LOAD_ERROR_NAME_TO_LONG; } sys_strcpy(dlname, full_name); sys_strcpy(dlname+len, FILE_EXT); - return erts_sys_ddll_open_noext(dlname, handle); + return erts_sys_ddll_open_noext(dlname, handle, err); } -int erts_sys_ddll_open_noext(char *dlname, void **handle) +int erts_sys_ddll_open_noext(char *dlname, void **handle, ErtsSysDdllError* err) { HINSTANCE hinstance; if ((hinstance = LoadLibrary(dlname)) == NULL) { - return ERL_DE_DYNAMIC_ERROR_OFFSET - GetLastError(); + int code = ERL_DE_DYNAMIC_ERROR_OFFSET - GetLastError(); + if (err != NULL) { + err->str = erts_sys_ddll_error(code); + } + return code; } else { *handle = (void *) hinstance; return ERL_DE_NO_ERROR; @@ -73,11 +89,16 @@ /* * Find a symbol in the shared object */ -int erts_sys_ddll_sym(void *handle, char *func_name, void **function) +int erts_sys_ddll_sym2(void *handle, char *func_name, void **function, + ErtsSysDdllError* err) { FARPROC proc; if ((proc = GetProcAddress( (HINSTANCE) handle, func_name)) == NULL) { - return ERL_DE_DYNAMIC_ERROR_OFFSET - GetLastError(); + int code = ERL_DE_DYNAMIC_ERROR_OFFSET - GetLastError(); + if (err != NULL) { + err->str = erts_sys_ddll_error(code); + } + return code; } *function = (void *) proc; return ERL_DE_NO_ERROR; @@ -100,6 +121,18 @@ return res; } +int erts_sys_ddll_load_nif_init(void *handle, void **function, ErtsSysDdllError* err) +{ + void *fn; + int res; + if ((res = erts_sys_ddll_sym2(handle, "nif_init", &fn, err)) != ERL_DE_NO_ERROR) { + return res; + } + *function = fn; + return res; +} + + /* * Call the driver_init function, whatever it's really called, simple on unix... */ @@ -108,14 +141,23 @@ return (*initfn)(&wddc); } +void *erts_sys_ddll_call_nif_init(void *function) { + void *(*initfn)(TWinDynNifCallbacks *) = function; + return (*initfn)(&nif_callbacks); +} + /* * Close a chared object */ -int erts_sys_ddll_close(void *handle) +int erts_sys_ddll_close2(void *handle, ErtsSysDdllError* err) { if (!FreeLibrary((HINSTANCE) handle)) { - return ERL_DE_DYNAMIC_ERROR_OFFSET - GetLastError(); + int code = ERL_DE_DYNAMIC_ERROR_OFFSET - GetLastError(); + if (err != NULL) { + err->str = erts_sys_ddll_error(code); + } + return code; } return ERL_DE_NO_ERROR; } @@ -154,3 +196,11 @@ } return local_ptr; } + +void erts_sys_ddll_free_error(ErtsSysDdllError* err) +{ + /* err->str may be either a static string or reused as thread local data, + * so wo don't bother free it. + */ +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/sys/win32/sys.c erlang-13.b.3-dfsg/erts/emulator/sys/win32/sys.c --- erlang-13.b.1-dfsg/erts/emulator/sys/win32/sys.c 2009-06-05 13:53:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/sys/win32/sys.c 2009-11-20 13:29:44.000000000 +0000 @@ -70,9 +70,10 @@ HANDLE, LPHANDLE, BOOL, LPVOID, LPTSTR, unsigned, char **, int *)); -static int create_pipe(LPHANDLE, LPHANDLE, BOOL); +static int create_pipe(LPHANDLE, LPHANDLE, BOOL, BOOL); static int ApplicationType(const char* originalName, char fullPath[MAX_PATH], - BOOL search_in_path, int *error_return); + BOOL search_in_path, BOOL handle_quotes, + int *error_return); HANDLE erts_service_event; @@ -1054,7 +1055,8 @@ */ if (opts->read_write & DO_READ) { - if (!create_pipe(&hFromChild, &hChildStdout, FALSE)) + if (!create_pipe(&hFromChild, &hChildStdout, FALSE, + opts->overlapped_io)) goto error; } else { hChildStdout = CreateFile("nul", GENERIC_WRITE, 0, @@ -1063,7 +1065,7 @@ DEBUGF(("Created nul file for hChildStdout = %d\n",hChildStdout)); } if (opts->read_write & DO_WRITE) { - if (!create_pipe(&hChildStdin, &hToChild, TRUE)) { + if (!create_pipe(&hChildStdin, &hToChild, TRUE, opts->overlapped_io)) { CloseHandle(hFromChild); hFromChild = INVALID_HANDLE_VALUE; CloseHandle(hChildStdout); @@ -1332,7 +1334,8 @@ thecommand[cmdlength] = '\0'; DEBUGF(("spawn command: %s\n", thecommand)); - applType = ApplicationType(thecommand, execPath, TRUE, errno_return); + applType = ApplicationType(thecommand, execPath, TRUE, + TRUE, errno_return); DEBUGF(("ApplicationType returned for (%s) is %d\n", thecommand, applType)); erts_free(ERTS_ALC_T_TMP, (void *) thecommand); if (applType == APPL_NONE) { @@ -1364,7 +1367,8 @@ strcat(newcmdline, origcmd+cmdlength); } else { /* ERTS_SPAWN_EXECUTABLE */ int run_cmd = 0; - applType = ApplicationType(origcmd, execPath, FALSE, errno_return); + applType = ApplicationType(origcmd, execPath, FALSE, FALSE, + errno_return); if (applType == APPL_NONE) { return FALSE; } @@ -1386,7 +1390,7 @@ if (run_cmd) { char cmdPath[MAX_PATH]; int cmdType; - cmdType = ApplicationType("cmd.exe", cmdPath, TRUE, errno_return); + cmdType = ApplicationType("cmd.exe", cmdPath, TRUE, FALSE, errno_return); if (cmdType == APPL_NONE || cmdType == APPL_DOS) { return FALSE; } @@ -1521,7 +1525,7 @@ * be inherited is opened without overlapped io flags, as the child program * would expect stdout not to demand overlapped I/O. */ -static int create_pipe(HANDLE *phRead, HANDLE *phWrite, BOOL inheritRead) +static int create_pipe(HANDLE *phRead, HANDLE *phWrite, BOOL inheritRead, BOOL overlapped_io) { SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; char pipe_name[128]; /* Name of pipe. */ @@ -1569,7 +1573,7 @@ sa.bInheritHandle = inheritRead; if ((*phRead = CreateNamedPipe(pipe_name, PIPE_ACCESS_INBOUND | - ((inheritRead) ? 0 : FILE_FLAG_OVERLAPPED), + ((inheritRead && !overlapped_io) ? 0 : FILE_FLAG_OVERLAPPED), PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, @@ -1587,7 +1591,7 @@ &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | - ((inheritRead) ? FILE_FLAG_OVERLAPPED : 0), + ((inheritRead || overlapped_io) ? FILE_FLAG_OVERLAPPED : 0), NULL)) == INVALID_HANDLE_VALUE) { CloseHandle(*phRead); DEBUGF(("Error opening other end of pipe: %s\n", last_error())); @@ -1605,6 +1609,7 @@ char fullPath[MAX_PATH], /* Filled with complete path to * application. */ BOOL search_in_path, /* If we should search the system wide path */ + BOOL handle_quotes, /* If we should handle quotes around executable */ int *error_return /* A place to put an error code */ ) { @@ -1615,6 +1620,8 @@ DWORD read; IMAGE_DOS_HEADER header; static char extensions[][5] = {"", ".com", ".exe", ".bat"}; + int is_quoted; + int len; /* Look for the program as an external program. First try the name * as it is, then try adding .com, .exe, and .bat, in that order, to @@ -1631,12 +1638,23 @@ * the extensions, looking for a match. (') */ + len = strlen(originalName); + is_quoted = handle_quotes && len > 0 && originalName[0] == '"' && + originalName[len-1] == '"'; + applType = APPL_NONE; *error_return = ENOENT; for (i = 0; i < (int) (sizeof(extensions) / sizeof(extensions[0])); i++) { - lstrcpyn(fullPath, originalName, MAX_PATH - 5); - lstrcat(fullPath, extensions[i]); - + if(is_quoted) { + lstrcpyn(fullPath, originalName+1, MAX_PATH - 7); + len = strlen(fullPath); + if(len > 0) { + fullPath[len-1] = '\0'; + } + } else { + lstrcpyn(fullPath, originalName, MAX_PATH - 5); + } + lstrcat(fullPath, extensions[i]); SearchPath((search_in_path) ? NULL : ".", fullPath, NULL, MAX_PATH, fullPath, &rest); /* @@ -1728,6 +1746,14 @@ GetShortPathName(fullPath, fullPath, MAX_PATH); } + if (is_quoted) { + /* restore quotes on quoted program name */ + len = strlen(fullPath); + memmove(fullPath+1,fullPath,len); + fullPath[0]='"'; + fullPath[len+1]='"'; + fullPath[len+2]='\0'; + } return applType; } diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/after_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/after_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/after_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/after_SUITE.erl 2009-09-18 15:07:41.000000000 +0100 @@ -0,0 +1,233 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(after_SUITE). + +%% Tests receive after. + +-include("test_server.hrl"). + +-export([all/1, t_after/1, receive_after/1, receive_after_big/1, + receive_after_errors/1, receive_var_zero/1, receive_zero/1, + multi_timeout/1, receive_after_32bit/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +%% Internal exports. + +-export([timeout_g/0]). + +all(suite) -> + [t_after, receive_after, receive_after_big, receive_after_errors, + receive_var_zero, receive_zero, multi_timeout, receive_after_32bit]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(3)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +%% Tests for an old round-off error in 'receive after'." +t_after(Config) when is_list(Config) -> + ?line spawn(fun frequent_process/0), + ?line Period = test_server:minutes(1), + ?line Before = erlang:now(), + receive + after Period -> + ?line After = erlang:now(), + ?line report(Period, Before, After) + end. + + +report(Period, Before, After) -> + ?line Elapsed = (element(1, After)*1000000000 + +element(2, After)*1000 + +element(3, After) div 1000) - + (element(1,Before)*1000000000 + + element(2,Before)*1000 + element(3,Before) div 1000), + ?line case Elapsed*100 / Period of + Percent when Percent > 100.10 -> + ?line test_server:fail({too_inaccurate, Percent}); + Percent when Percent < 100.0 -> + ?line test_server:fail({too_early, Percent}); + Percent -> + ?line Comment = io_lib:format("Elapsed/expected: ~.2f %", + [Percent]), + {comment, lists:flatten(Comment)} + end. + +frequent_process() -> + receive + after 100 -> + ?line frequent_process() + end. + +receive_after(doc) -> + "Test that 'receive after' works (doesn't hang). " + "The test takes 10 seconds to complete."; +receive_after(Config) when is_list(Config) -> + ?line receive_after1(5000). + +receive_after1(1) -> + ?line io:format("Testing: receive after ~p~n", [1]), + ?line receive after 1 -> ok end; +receive_after1(N) -> + ?line io:format("Testing: receive after ~p~n", [N]), + ?line receive after N -> receive_after1(N div 2) end. + +receive_after_big(Config) when is_list(Config) -> + %% Test that 'receive after' with a 32 bit number works. + receive_after_big1(16#f7654321), + receive_after_big2(). + +receive_after_big1(Timeout) -> + Self = self(), + erlang:yield(), + spawn(fun() -> Self ! here_is_a_message end), + ok = receive + here_is_a_message -> + ok + after Timeout -> + %% We test that the timeout can be set, + %% not that an timeout occurs after the appropriate delay + %% (48 days, 56 minutes, 48 seconds)! + timeout + end. + +receive_after_big2() -> + Self = self(), + erlang:yield(), + spawn(fun() -> Self ! here_is_a_message end), + ok = receive + here_is_a_message -> + ok + after 16#f7999977 -> + %% We only test that the timeout can be set. + timeout + end. + +-define(TryAfter(Timeout), + {'EXIT',{timeout_value,_}} = (catch receive mission -> exit(impossible) after Timeout -> ok end), + {'EXIT',{timeout_value,_}} = (catch receive after Timeout -> ok end), + try_after(Timeout)). + +%% Test error cases for 'receive after'. +receive_after_errors(Config) when is_list(Config) -> + ?line ?TryAfter(-1), + ?line ?TryAfter(0.0), + ?line ?TryAfter(3.14), + ?line ?TryAfter(16#100000000), + ?line ?TryAfter(392347129847294724972398472984729847129874), + ?line ?TryAfter(16#3fffffffffffffff), + ?line ?TryAfter(16#ffffffffffffffff), + ?line ?TryAfter(-16#100000000), + ?line ?TryAfter(-3891278094774921784123987129848), + ?line ?TryAfter(xxx), + ok. + +try_after(Timeout) -> + {'EXIT',{timeout_value,_}} = (catch receive after Timeout -> ok end). + +receive_var_zero(doc) -> "Test 'after Z', when Z == 0."; +receive_var_zero(Config) when is_list(Config) -> + self() ! x, + self() ! y, + Z = zero(), + timeout = receive + z -> ok + after Z -> timeout + end, + timeout = receive + after Z -> timeout + end, + self() ! w, + receive + x -> ok; + Other -> + ?line ?t:fail({bad_message,Other}) + end. + +zero() -> 0. + +%% Test 'after 0'. +receive_zero(Config) when is_list(Config) -> + self() ! x, + self() ! y, + timeout = receive + z -> ok + after 0 -> + timeout + end, + self() ! w, + timeout = receive + after 0 -> timeout + end, + receive + x -> ok; + Other -> + ?line ?t:fail({bad_message,Other}) + end. + +multi_timeout(doc) -> + "Test for catching invalid assertion in erl_message.c (in queue_message)." + "This failed (dumped core) with debug-compiled emulator."; +multi_timeout(Config) when is_list(Config) -> + ?line P = spawn(?MODULE, timeout_g, []), + ?line P ! a, + ?line P ! b, + ?line receive + after 1000 -> ok + end, + ?line P ! c, + ?line receive + after 1000 -> ok + end, + ?line P ! d, + ok. + +timeout_g() -> + ?line receive + a -> ok + end, + ?line receive + after 100000 -> ok + end, + ok. + +%% OTP-7493: Timeout for 32 bit numbers (such as 16#ffffFFFF) could +%% timeout at once. +receive_after_32bit(Config) when is_list(Config) -> + T = 16#ffffFFFF, + Pids = [spawn_link(fun() -> recv_after_32bit(I, T) end) || + I <- lists:seq(1, 2048)], + + %% Wait two seconds for any of the processes to timeout too early. + receive after 2000 -> ok end, + + %% Kill the processes. + [begin unlink(Pid), exit(Pid, kill) end || Pid <- Pids], + ok. + +recv_after_32bit(I, T) when I rem 2 =:= 0 -> + receive after T -> exit(timeout) end; +recv_after_32bit(_, _) -> + receive after 16#ffffFFFF -> exit(timeout) end. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/allocator_test.h erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/allocator_test.h --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/allocator_test.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/allocator_test.h 2009-03-12 12:16:43.000000000 +0000 @@ -0,0 +1,131 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#ifndef ALLOCATOR_TEST_H__ +#define ALLOCATOR_TEST_H__ + +typedef unsigned long Ulong; + +#ifndef __WIN32__ +Ulong erts_alc_test(Ulong, Ulong, Ulong, Ulong); +#endif + +#define UNDEF__ ~((Ulong) 0) + +#define ALC_TEST0(OP) \ + erts_alc_test((Ulong) (OP), UNDEF__, UNDEF__, UNDEF__) +#define ALC_TEST1(OP, A1) \ + erts_alc_test((Ulong) (OP), (Ulong) (A1), UNDEF__, UNDEF__) +#define ALC_TEST2(OP, A1, A2) \ + erts_alc_test((Ulong) (OP), (Ulong) (A1), (Ulong) (A2), UNDEF__) +#define ALC_TEST3(OP, A1, A2, A3) \ + erts_alc_test((Ulong) (OP), (Ulong) (A1), (Ulong) (A2), (Ulong) (A3)) + +typedef Ulong Block_t; +typedef Ulong Carrier_t; +typedef Ulong Allctr_t; +typedef Ulong RBT_t; +typedef Ulong RBTL_t; +typedef void* erts_thread; +typedef void* erts_mutex; +typedef void* erts_cond; + +/* From erl_alloc_util.c */ + +#define BLK_SZ(B) ((Ulong) ALC_TEST1(0x000, (B))) +#define UMEM_SZ(B) ((Ulong) ALC_TEST1(0x001, (B))) +#define IS_PREV_FREE_BLK(B) ((Ulong) ALC_TEST1(0x002, (B))) +#define IS_FREE_BLK(B) ((Ulong) ALC_TEST1(0x003, (B))) +#define IS_LAST_BLK(B) ((Ulong) ALC_TEST1(0x004, (B))) +#define UMEM2BLK(U) ((Block_t *) ALC_TEST1(0x005, (U))) +#define BLK2UMEM(B) ((void *) ALC_TEST1(0x006, (B))) +#define IS_SBC(C) ((Ulong) ALC_TEST1(0x007, (C))) +#define IS_SBC_BLK(B) ((Ulong) ALC_TEST1(0x008, (B))) +#define IS_MBC(C) ((Ulong) ALC_TEST1(0x009, (C))) +#define IS_MMAP_C(C) ((Ulong) ALC_TEST1(0x00a, (C))) +#define C_SZ(C) ((Ulong) ALC_TEST1(0x00b, (C))) +#define SBC2BLK(A, C) ((Block_t *) ALC_TEST2(0x00c, (A), (C))) +#define BLK2SBC(A, B) ((Carrier_t *) ALC_TEST2(0x00d, (A), (B))) +#define MBC2FBLK(A, C) ((Block_t *) ALC_TEST2(0x00e, (A), (C))) +#define FBLK2MBC(A, B) ((Carrier_t *) ALC_TEST2(0x00f, (A), (B))) +#define FIRST_MBC(A) ((Carrier_t *) ALC_TEST1(0x010, (A))) +#define LAST_MBC(A) ((Carrier_t *) ALC_TEST1(0x011, (A))) +#define FIRST_SBC(A) ((Carrier_t *) ALC_TEST1(0x012, (A))) +#define LAST_SBC(A) ((Carrier_t *) ALC_TEST1(0x013, (A))) +#define NEXT_C(C) ((Carrier_t *) ALC_TEST1(0x014, (C))) +#define PREV_C(C) ((Carrier_t *) ALC_TEST1(0x015, (C))) +#define ABLK_HDR_SZ ((Ulong) ALC_TEST0(0x016)) +#define MIN_BLK_SZ(A) ((Ulong) ALC_TEST1(0x017, (A))) +#define NXT_BLK(B) ((Block_t *) ALC_TEST1(0x018, (B))) +#define PREV_BLK(B) ((Block_t *) ALC_TEST1(0x019, (B))) +#define IS_FIRST_BLK(B) ((Ulong) ALC_TEST1(0x01a, (B))) +#define UNIT_SZ ((Ulong) ALC_TEST0(0x01b)) + +/* From erl_goodfit_alloc.c */ +#define BKT_IX(A, S) ((Ulong) ALC_TEST2(0x100, (A), (S))) +#define BKT_MIN_SZ(A, I) ((Ulong) ALC_TEST2(0x101, (A), (I))) +#define NO_OF_BKTS ((Ulong) ALC_TEST0(0x102)) +#define FIND_BKT(A, I) ((int) ALC_TEST2(0x103, (A), (I))) + +/* From erl_bestfit_alloc.c */ +#define IS_AOBF(A) ((Ulong) ALC_TEST1(0x200, (A))) +#define RBT_ROOT(A) ((RBT_t *) ALC_TEST1(0x201, (A))) +#define RBT_PARENT(T) ((RBT_t *) ALC_TEST1(0x202, (T))) +#define RBT_LEFT(T) ((RBT_t *) ALC_TEST1(0x203, (T))) +#define RBT_RIGHT(T) ((RBT_t *) ALC_TEST1(0x204, (T))) +#define RBT_NEXT(T) ((RBTL_t *) ALC_TEST1(0x205, (T))) +#define RBT_IS_BLACK(T) ((Ulong) ALC_TEST1(0x206, (T))) +#define RBT_IS_TREE(T) ((Ulong) ALC_TEST1(0x207, (T))) + +/* From erl_mseg.c */ +#define HAVE_MSEG() ((int) ALC_TEST0(0x400)) +#define MSEG_ALLOC(SP) ((void *) ALC_TEST1(0x401, (SP))) +#define MSEG_DEALLOC(P, S) ((void) ALC_TEST2(0x402, (P), (S))) +#define MSEG_REALLOC(P, OS, SP) ((void *) ALC_TEST3(0x403, (P), (OS), \ + (SP))) +#define MSEG_CLEAR_CACHE() ((void) ALC_TEST0(0x404)) +#define MSEG_NO() ((Ulong) ALC_TEST0(0x405)) +#define MSEG_CACHE_SIZE() ((Ulong) ALC_TEST0(0x406)) + +/* From erl_alloc.c */ + +#undef ALLOC +#undef REALLOC +#undef FREE + +#define ALLOC(A, S) ((void *) ALC_TEST2(0xf00, (A), (S))) +#define REALLOC(A, P, S) ((void *) ALC_TEST3(0xf01, (A), (P), (S))) +#define FREE(A, P) ((void) ALC_TEST2(0xf02, (A), (P))) +#define START_ALC(N, T, A) ((Allctr_t *) ALC_TEST3(0xf03, (N), (T), (A))) +#define STOP_ALC(A) ((void) ALC_TEST1(0xf04, (A))) +#define IS_THREADS_ENABLED ((int) ALC_TEST0(0xf05)) +#define IS_ALLOC_THREAD_SAFE(A) ((int) ALC_TEST1(0xf06, (A))) +#define IS_ALLOC_FORK_SAFE(A) ((int) ALC_TEST1(0xf07, (A))) +#define THR_MTX_CREATE() ((erts_mutex) ALC_TEST0(0xf08)) +#define THR_MTX_DESTROY(M) ((void) ALC_TEST1(0xf09, (M))) +#define THR_MTX_LOCK(M) ((void) ALC_TEST1(0xf0a, (M))) +#define THR_MTX_UNLOCK(M) ((void) ALC_TEST1(0xf0b, (M))) +#define THR_COND_CREATE() ((erts_cond) ALC_TEST0(0xf0c)) +#define THR_COND_DESTROY(C) ((void) ALC_TEST1(0xf0d, (C))) +#define THR_COND_BCAST(C) ((void) ALC_TEST1(0xf0e, (C))) +#define THR_COND_WAIT(C, M) ((void) ALC_TEST2(0xf0f, (C), (M))) +#define THR_CREATE(F, A) ((erts_thread) ALC_TEST2(0xf10, (F), (A))) +#define THR_JOIN(T) ((void) ALC_TEST1(0xf11, (T))) +#define THR_EXIT(R) ((void) ALC_TEST1(0xf12, (R))) + +#endif diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/basic.c erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/basic.c --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/basic.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/basic.c 2003-07-07 13:23:26.000000000 +0100 @@ -0,0 +1,61 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include "allocator_test.h" + +char * +testcase_name(void) +{ + return "basic"; +} + +void +testcase_run(TestCaseState_t *tcs) +{ + Carrier_t *c; + Block_t *blk; + void *p; + Allctr_t *a = START_ALC("basic_", 0, NULL); + tcs->extra = (void *) a; + + ASSERT(tcs, a); + + p = ALLOC(a, 10); + ASSERT(tcs, p); + p = REALLOC(a, p, 15); + ASSERT(tcs, p); + FREE(a, p); + + c = FIRST_MBC(a); + ASSERT(tcs, !NEXT_C(c)); + blk = MBC2FBLK(a, c); + ASSERT(tcs, IS_LAST_BLK(blk)); + ASSERT(tcs, IS_FREE_BLK(blk)); + + STOP_ALC((Allctr_t *) a); + tcs->extra = NULL; + +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + if (tcs->extra) + STOP_ALC((Allctr_t *) tcs->extra); +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/bucket_index.c erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/bucket_index.c --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/bucket_index.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/bucket_index.c 2004-09-14 12:52:58.000000000 +0100 @@ -0,0 +1,114 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include "allocator_test.h" +#include + +#define MAX_TEST_SIZE 100000000 + +char * +testcase_name(void) +{ + return "bucket_index"; +} + +void test_it(TestCaseState_t *tcs, unsigned sbct); + +void +testcase_run(TestCaseState_t *tcs) +{ + testcase_printf(tcs, "No of buckets = %lu:\n\n", NO_OF_BKTS); + + test_it(tcs, 1); + test_it(tcs, 0); + test_it(tcs, 1024); + test_it(tcs, 10240); +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + if (tcs->extra) { + STOP_ALC(tcs->extra); + tcs->extra = NULL; + } +} + +void +test_it(TestCaseState_t *tcs, unsigned sbct) +{ + Ulong max_cont_test_sz; + char sbct_buf[21]; + char *argv[] = {"-tas", "gf", "-tsbct", NULL, NULL}; + int no_changes; + Ulong bi; + Ulong min_sz; + Ulong prev_bi; + Ulong sz; + Allctr_t *a; + + no_changes = 0; + prev_bi = -1; + + if (sbct) { + sprintf(sbct_buf, "%d", sbct); + argv[3] = sbct_buf; + } + else + argv[2] = NULL; + + max_cont_test_sz = 2*sbct*1024; + if (max_cont_test_sz < 1000000) + max_cont_test_sz = 1000000; + + testcase_printf(tcs, "Testing with sbct = %s\n", + sbct ? sbct_buf : "default"); + a = START_ALC("bkt_ix_", 0, argv); + tcs->extra = (void *) a; + ASSERT(tcs, a); + + sz = MIN_BLK_SZ(a); + while(sz < ((((Ulong)1) << 31) - 1)) { + bi = BKT_IX(a, sz); + if (prev_bi != bi) { + ASSERT(tcs, prev_bi + 1 == bi); + + min_sz = BKT_MIN_SZ(a, bi); + + ASSERT(tcs, sz == min_sz); + + testcase_printf(tcs, "sz=%d->ix=%d ", sz, bi); + no_changes++; + } + prev_bi = bi; + if (sz < max_cont_test_sz) + sz++; + else + sz += 100000000; + } + testcase_printf(tcs, "\n\n"); + ASSERT(tcs, no_changes == NO_OF_BKTS); + + STOP_ALC(a); + tcs->extra = NULL; + + testcase_printf(tcs, "Test with sbct=%s succeeded\n", + sbct ? sbct_buf : "default"); +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/bucket_mask.c erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/bucket_mask.c --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/bucket_mask.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/bucket_mask.c 2003-07-07 13:24:04.000000000 +0100 @@ -0,0 +1,147 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include "allocator_test.h" +#include + +#define SBCT (512*1024) + +char * +testcase_name(void) +{ + return "bucket_mask"; +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + if (tcs->extra) { + STOP_ALC(tcs->extra); + tcs->extra = NULL; + } +} + +void +testcase_run(TestCaseState_t *tcs) +{ + void *tmp; + void **fence; + void **blk; + Ulong sz; + Ulong smbcs; + int i; + int bi; + int bi_tests; + Ulong sbct = (SBCT/1024)*1024; + Ulong min_blk_sz; + Ulong ablk_hdr_sz = ABLK_HDR_SZ; + char smbcs_buf[30]; + char sbct_buf[30]; + int no_bkts = (int) NO_OF_BKTS; + char *argv1[] = {"-tasgf", "-tmmbcs0", sbct_buf, NULL}; + char *argv2[] = {"-tasgf", "-tmmbcs0", sbct_buf, NULL, NULL}; + Allctr_t *a; + + sprintf(sbct_buf, "-tsbct%lu", sbct/1024); + + a = START_ALC("bkt_mask_1_", 0, argv1); + tcs->extra = (void *) a; + ASSERT(tcs, a); + + min_blk_sz = MIN_BLK_SZ(a); + smbcs = 2*(no_bkts*sizeof(void *) + min_blk_sz) + min_blk_sz; + for (i = 0; i < no_bkts; i++) { + sz = BKT_MIN_SZ(a, i); + if (sz >= sbct) + break; + smbcs += sz + min_blk_sz; + } + + bi_tests = i; + testcase_printf(tcs, "Will test %d buckets\n", bi_tests); + + STOP_ALC(a); + tcs->extra = NULL; + + smbcs /= 1024; + smbcs++; + + testcase_printf(tcs, "smbcs = %lu\n", smbcs); + sprintf(smbcs_buf, "-tsmbcs%lu", smbcs); + argv2[3] = smbcs_buf; + + a = START_ALC("bkt_mask_2_", 0, argv2); + tcs->extra = (void *) a; + ASSERT(tcs, a); + + blk = (void **) ALLOC(a, no_bkts*sizeof(void *)); + fence = (void **) ALLOC(a, no_bkts*sizeof(void *)); + + ASSERT(tcs, blk && fence); + + testcase_printf(tcs, "Allocating blocks and fences\n"); + for (i = 0; i < bi_tests; i++) { + sz = BKT_MIN_SZ(a, i); + blk[i] = ALLOC(a, sz - ablk_hdr_sz); + fence[i] = ALLOC(a, 1); + ASSERT(tcs, blk[i] && fence[i]); + } + + tmp = (void *) UMEM2BLK(fence[bi_tests - 1]); + tmp = (void *) NXT_BLK((Block_t *) tmp); + ASSERT(tcs, IS_LAST_BLK(tmp)); + sz = BLK_SZ((Block_t *) tmp); + testcase_printf(tcs, "Allocating leftover size = %lu\n", sz); + tmp = ALLOC(a, sz - ablk_hdr_sz); + ASSERT(tcs, tmp); + + bi = FIND_BKT(a, 0); + ASSERT(tcs, bi < 0); + + for (i = 0; i < bi_tests; i++) { + sz = BKT_MIN_SZ(a, i); + testcase_printf(tcs, "Testing bucket %d\n", i); + FREE(a, blk[i]); + bi = FIND_BKT(a, i); + ASSERT(tcs, bi == i); + blk[i] = ALLOC(a, sz - ablk_hdr_sz); + bi = FIND_BKT(a, i); + ASSERT(tcs, bi != i); + } + + for (i = 0; i < bi_tests; i++) { + FREE(a, blk[i]); + FREE(a, fence[i]); + } + + FREE(a, (void *) blk); + FREE(a, (void *) fence); + + bi = FIND_BKT(a, 0); + ASSERT(tcs, bi == no_bkts - 1); + + FREE(a, tmp); + + bi = FIND_BKT(a, 0); + ASSERT(tcs, bi < 0); + + STOP_ALC(a); + tcs->extra = NULL; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/coalesce.c erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/coalesce.c --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/coalesce.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/coalesce.c 2009-03-12 12:16:44.000000000 +0000 @@ -0,0 +1,318 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include "allocator_test.h" +#include + +#define CEILING(X, U) ((((X)+(U)-1)/(U))*(U)) + +void +check_ablk(TestCaseState_t *tcs, Allctr_t *a, void *ptr, Ulong umem_sz) +{ + Ulong unit_sz = UNIT_SZ; + Block_t *blk = UMEM2BLK(ptr); + Block_t *nxt_blk = NXT_BLK(blk); + Ulong real_sz = ((Ulong) nxt_blk) - ((Ulong) (blk)); + ASSERT(tcs, real_sz == BLK_SZ(blk)); + ASSERT(tcs, !IS_FREE_BLK(blk)); + ASSERT(tcs, real_sz >= CEILING(ABLK_HDR_SZ + umem_sz, unit_sz)); + if (real_sz > MIN_BLK_SZ(a) + && real_sz > CEILING(ABLK_HDR_SZ+umem_sz, unit_sz)) { + ASSERT(tcs, + real_sz <= CEILING(MIN_BLK_SZ(a)+ABLK_HDR_SZ+umem_sz, + unit_sz)); + ASSERT(tcs, IS_LAST_BLK(blk) || !IS_FREE_BLK(nxt_blk)); + } +} + +void +setup_sequence(TestCaseState_t *tcs, Allctr_t *a, Ulong bsz, int no, + void *res[]) +{ + Carrier_t *c; + Block_t *blk; + int i; + + testcase_printf(tcs, + "Setting up a sequence of %d blocks of size %lu\n", + no, bsz); + c = FIRST_MBC(a); + ASSERT(tcs, !NEXT_C(c)); + blk = MBC2FBLK(a, c); + ASSERT(tcs, IS_LAST_BLK(blk)); + + for (i = 0; i < no; i++) + res[i] = ALLOC(a, bsz); + for (i = 0; i < no; i++) + ASSERT(tcs, res[i]); + + testcase_printf(tcs, "Checking that sequence was set up as expected\n"); + + for (i = 1; i < no; i++) + ASSERT(tcs, NXT_BLK(UMEM2BLK(res[i-1])) == UMEM2BLK(res[i])); + + blk = NXT_BLK(UMEM2BLK(res[no-1])); + ASSERT(tcs, IS_LAST_BLK(blk)); + + testcase_printf(tcs, "Sequence ok\n"); + + /* If we fail in setup_sequence(), it doesn't mean that something is + wrong. It is just a faulty assumption in setup_sequence() about + how blocks are going to be placed. + Fix setup_sequence()... */ +} + +static void +test_free(TestCaseState_t *tcs, Allctr_t *a, Ulong bsz) +{ + Block_t *blk; + void *p[7]; + + testcase_printf(tcs," --- Testing free() with block size %lu ---\n",bsz); + + setup_sequence(tcs, a, bsz, 7, p); + + check_ablk(tcs, a, p[0], bsz); + check_ablk(tcs, a, p[1], bsz); + check_ablk(tcs, a, p[2], bsz); + check_ablk(tcs, a, p[3], bsz); + check_ablk(tcs, a, p[4], bsz); + check_ablk(tcs, a, p[5], bsz); + check_ablk(tcs, a, p[6], bsz); + + /* Coalescing with previous block */ + FREE(a, p[2]); + FREE(a, p[3]); + + blk = NXT_BLK(UMEM2BLK(p[1])); + ASSERT(tcs, IS_FREE_BLK(blk)); + ASSERT(tcs, NXT_BLK(blk) == UMEM2BLK(p[4])); + + /* Coalescing with next block */ + + FREE(a, p[1]); + blk = NXT_BLK(UMEM2BLK(p[0])); + ASSERT(tcs, IS_FREE_BLK(blk)); + ASSERT(tcs, NXT_BLK(blk) == UMEM2BLK(p[4])); + + /* Coalescing with next and previous block */ + + FREE(a, p[5]); + FREE(a, p[4]); + + blk = NXT_BLK(UMEM2BLK(p[0])); + ASSERT(tcs, IS_FREE_BLK(blk)); + ASSERT(tcs, NXT_BLK(blk) == UMEM2BLK(p[6])); + + /* Cleanup */ + + FREE(a, p[0]); + FREE(a, p[6]); + + testcase_printf(tcs," --- free() with block size %lu succeded ---\n",bsz); +} + +static void +test_realloc(TestCaseState_t *tcs, Allctr_t *a, Ulong bsz) +{ + Block_t *blk; + void *ptr; + void *p[3]; + Ulong nbsz; + + testcase_printf(tcs," --- Testing realloc() with block size %lu ---\n", + bsz); + + setup_sequence(tcs, a, bsz, 3, p); + + check_ablk(tcs, a, p[0], bsz); + check_ablk(tcs, a, p[1], bsz); + check_ablk(tcs, a, p[2], bsz); + + /* Grow to the end of the carrier */ + blk = NXT_BLK(UMEM2BLK(p[2])); + ASSERT(tcs, IS_FREE_BLK(blk)); + ASSERT(tcs, IS_LAST_BLK(blk)); + nbsz = bsz + BLK_SZ(blk); + ptr = REALLOC(a, p[2], nbsz); + ASSERT(tcs, p[2] == ptr); + check_ablk(tcs, a, p[2], nbsz); + blk = UMEM2BLK(p[2]); + ASSERT(tcs, IS_LAST_BLK(blk)); + + /* Shrink from the end of the carrier */ + ptr = REALLOC(a, p[2], bsz); + ASSERT(tcs, p[2] == ptr); + blk = UMEM2BLK(p[2]); + ASSERT(tcs, !IS_LAST_BLK(blk)); + blk = NXT_BLK(blk); + ASSERT(tcs, IS_LAST_BLK(blk)); + check_ablk(tcs, a, p[2], bsz); + + /* Shrink and coalecse with next free */ + + FREE(a, p[1]); + + blk = NXT_BLK(UMEM2BLK(p[0])); + ASSERT(tcs, IS_FREE_BLK(blk)); + + nbsz = bsz/2; + ptr = REALLOC(a, p[0], nbsz); + ASSERT(tcs, p[0] == ptr); + + check_ablk(tcs, a, p[0], nbsz); + + blk = NXT_BLK(UMEM2BLK(p[0])); + ASSERT(tcs, IS_FREE_BLK(blk)); + ASSERT(tcs, NXT_BLK(blk) == UMEM2BLK(p[2])); + + /* Grow into next free; but leave free block at end */ + + nbsz *= 3; + ptr = REALLOC(a, p[0], nbsz); + ASSERT(tcs, p[0] == ptr); + + check_ablk(tcs, a, p[0], nbsz); + blk = NXT_BLK(UMEM2BLK(p[0])); + + ASSERT(tcs, IS_FREE_BLK(blk)); + ASSERT(tcs, NXT_BLK(blk) == UMEM2BLK(p[2])); + + /* Grow upto next alloced block by allocating just enough so that no + free block fits between them */ + nbsz = BLK_SZ(blk) + UMEM_SZ(UMEM2BLK(p[0])); + nbsz -= MIN_BLK_SZ(a) - 1; + + ptr = REALLOC(a, p[0], nbsz); + ASSERT(tcs, p[0] == ptr); + check_ablk(tcs, a, p[0], nbsz); + blk = NXT_BLK(UMEM2BLK(p[0])); + ASSERT(tcs, !IS_FREE_BLK(blk)); + ASSERT(tcs, blk == UMEM2BLK(p[2])); + + /* Grow into unused part at end */ + nbsz += MIN_BLK_SZ(a) - 1; + ptr = REALLOC(a, p[0], nbsz); + ASSERT(tcs, p[0] == ptr); + check_ablk(tcs, a, p[0], nbsz); + ASSERT(tcs, !IS_FREE_BLK(blk)); + ASSERT(tcs, blk == UMEM2BLK(p[2])); + + /* Shrink *almost* as much so that a free block would fit between the + allocated blocks, and make sure that we don't get a free block + in between */ + nbsz -= MIN_BLK_SZ(a) - 1; + ptr = REALLOC(a, p[0], nbsz); + ASSERT(tcs, p[0] == ptr); + check_ablk(tcs, a, p[0], nbsz); + blk = NXT_BLK(UMEM2BLK(p[0])); + ASSERT(tcs, !IS_FREE_BLK(blk)); + ASSERT(tcs, blk == UMEM2BLK(p[2])); + + /* Shrink just as much so that a free block can fit between + the alloced blocks */ + nbsz -= 1; + ptr = REALLOC(a, p[0], nbsz); + ASSERT(tcs, p[0] == ptr); + check_ablk(tcs, a, p[0], nbsz); + blk = NXT_BLK(UMEM2BLK(p[0])); + ASSERT(tcs, IS_FREE_BLK(blk)); + ASSERT(tcs, blk < UMEM2BLK(p[2])); + ASSERT(tcs, NXT_BLK(blk) == UMEM2BLK(p[2])); + + /* Shrink so little that no free block would fit between allocated + blocks, and make sure that we shrink the allocated block and + coalesce the extra free part with the next free block. */ + nbsz -= MIN_BLK_SZ(a) - 1; + ptr = REALLOC(a, p[0], nbsz); + ASSERT(tcs, p[0] == ptr); + check_ablk(tcs, a, p[0], nbsz); + blk = NXT_BLK(UMEM2BLK(p[0])); + ASSERT(tcs, IS_FREE_BLK(blk)); + ASSERT(tcs, blk < UMEM2BLK(p[2])); + ASSERT(tcs, NXT_BLK(blk) == UMEM2BLK(p[2])); + + /* Cleanup */ + FREE(a, p[0]); + FREE(a, p[2]); + + testcase_printf(tcs, " --- realloc() with block size %lu succeded ---\n", + bsz); + +} + +char * +testcase_name(void) +{ + return "coalesce"; +} + +void +testcase_run(TestCaseState_t *tcs) +{ + char *argv_org[] = {"-tmmbcs1024", "-tsbct2048", "-trmbcmt100", "-tas", NULL, NULL}; + char *alg[] = {"af", "gf", "bf", "aobf", NULL}; + int i; + + for (i = 0; alg[i]; i++) { + Ulong sz; + Allctr_t *a; + char *argv[sizeof(argv_org)/sizeof(argv_org[0])]; + memcpy((void *) argv, (void *) argv_org, sizeof(argv_org)); + + argv[4] = alg[i]; + testcase_printf(tcs, " *** Starting \"%s\" allocator *** \n", alg[i]); + a = START_ALC("coalesce_", 0, argv); + ASSERT(tcs, a); + tcs->extra = (void *) a; + + sz = MIN_BLK_SZ(a) - ABLK_HDR_SZ; + test_free(tcs, a, sz); + sz += 1; + test_free(tcs, a, sz); + sz *= 4; + test_free(tcs, a, sz); + sz += 1; + test_free(tcs, a, sz); + sz *= 10; + test_free(tcs, a, sz); + + sz = MIN_BLK_SZ(a)*4 - ABLK_HDR_SZ; + test_realloc(tcs, a, sz); + sz += 1; + test_realloc(tcs, a, sz); + sz *= 4; + test_realloc(tcs, a, sz); + sz += 1; + test_realloc(tcs, a, sz); + sz *= 10; + test_realloc(tcs, a, sz); + + testcase_printf(tcs, " *** Stopping \"%s\" allocator *** \n", alg[i]); + STOP_ALC(a); + tcs->extra = NULL; + } +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + if (tcs->extra) + STOP_ALC((Allctr_t *) tcs->extra); +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/Makefile.src 2006-05-03 09:07:34.000000000 +0100 @@ -0,0 +1,41 @@ +# ``The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved via the world wide web at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# The Initial Developer of the Original Code is Ericsson Utvecklings AB. +# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings +# AB. All Rights Reserved.'' +# +# $Id$ +# + +TEST_DRVS = basic@dll@ \ + coalesce@dll@ \ + threads@dll@ \ + realloc_copy@dll@ \ + bucket_index@dll@ \ + bucket_mask@dll@ \ + rbtree@dll@ \ + mseg_clear_cache@dll@ + +CC = @CC@ +LD = @LD@ +CFLAGS = @SHLIB_CFLAGS@ -I@erl_include@ @DEFS@ +SHLIB_EXTRA_LDLIBS = testcase_driver@obj@ + +all: $(TEST_DRVS) + +@SHLIB_RULES@ + +testcase_driver@obj@: testcase_driver.c testcase_driver.h +$(TEST_DRVS): testcase_driver@obj@ allocator_test.h + + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/mseg_clear_cache.c erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/mseg_clear_cache.c --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/mseg_clear_cache.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/mseg_clear_cache.c 2006-05-03 09:09:58.000000000 +0100 @@ -0,0 +1,102 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include "allocator_test.h" + +#define MAX_SEGS 10 + +typedef struct { + void *ptr; + Ulong size; +} seg_t; + +char * +testcase_name(void) +{ + return "mseg_clear_cache"; +} + +void +testcase_run(TestCaseState_t *tcs) +{ + int i; + Ulong n; + seg_t *seg; + + if (!HAVE_MSEG()) + testcase_skipped(tcs, "No mseg_alloc; nothing to test"); + + seg = (seg_t *) testcase_alloc(sizeof(seg_t)*(MAX_SEGS+1)); + + ASSERT(tcs, seg); + + for (i = 0; i <= MAX_SEGS; i++) + seg[i].ptr = NULL; + + tcs->extra = &seg[0]; + + for (i = 0; i < MAX_SEGS; i++) { + seg[i].size = 1000; + seg[i].ptr = MSEG_ALLOC(&seg[i].size); + ASSERT(tcs, seg[i].ptr); + ASSERT(tcs, seg[i].size >= 1000); + } + + n = MSEG_NO(); + testcase_printf(tcs, "MSEG_NO() = %lu\n", n); + + ASSERT(tcs, n >= MAX_SEGS); + + testcase_printf(tcs, "Deallocating half of the segments\n"); + for (i = MAX_SEGS-1; i >= MAX_SEGS/2; i--) { + MSEG_DEALLOC(seg[i].ptr, seg[i].size); + seg[i].ptr = NULL; + } + + n = MSEG_NO(); + testcase_printf(tcs, "MSEG_NO() = %lu\n", n); + + ASSERT(tcs, n >= MAX_SEGS/2); + + n = MSEG_CACHE_SIZE(); + testcase_printf(tcs, "MSEG_CACHE_SIZE() = %lu\n", n); + ASSERT(tcs, n > 0); + + testcase_printf(tcs, "MSEG_CLEAR_CACHE()\n"); + MSEG_CLEAR_CACHE(); + + n = MSEG_CACHE_SIZE(); + testcase_printf(tcs, "MSEG_CACHE_SIZE() = %lu\n", n); + + ASSERT(tcs, n == 0); + +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + if (tcs->extra) { + seg_t *seg = (seg_t *) tcs->extra; + int i; + for (i = 0; seg[i].ptr; i++) + MSEG_DEALLOC(seg[i].ptr, seg[i].size); + testcase_free((void *) seg); + tcs->extra = NULL; + } +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/rbtree.c erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/rbtree.c --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/rbtree.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/rbtree.c 2006-05-03 09:07:52.000000000 +0100 @@ -0,0 +1,386 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include "allocator_test.h" + +#define NO_BLOCKS 100000 + +#define RIGHT_VISITED (1 << 0) +#define LEFT_VISITED (1 << 1) + +typedef struct { + Allctr_t *allocator; + void **blk; + void **fence; +} rbtree_test_data; + +#if 0 +#define PRINT_TREE +#endif + +#ifdef PRINT_TREE + +#define INDENT_STEP 5 + +#include +static void +print_tree_aux(TestCaseState_t *tcs, RBT_t *x, int indent) +{ + if (!x) { + char frmt[20]; + sprintf(frmt, "%%%ds%%s\n", indent); + testcase_printf(tcs, frmt, "", "BLACK: nil"); + } + else { + print_tree_aux(tcs, RBT_RIGHT(x), indent + INDENT_STEP); + { + char frmt[40]; + sprintf(frmt, "%%%ds%%s: sz=%%lu addr=0x%%lx\n", indent); + testcase_printf(tcs, + frmt, + "", + RBT_IS_BLACK(x) ? "BLACK" : "RED", + BLK_SZ(x), + (Ulong) x); + } + print_tree_aux(tcs, RBT_LEFT(x), indent + INDENT_STEP); + } +} + + +static void +print_tree(TestCaseState_t *tcs, RBT_t *root, int aobf) +{ + char *type = aobf ? "Size-Adress" : "Size"; + testcase_printf(tcs, " --- %s tree begin ---\r\n", type); + print_tree_aux(tcs, root, 0); + testcase_printf(tcs, " --- %s tree end ---\r\n", type); +} + +#endif + +static RBT_t * +check_tree(TestCaseState_t *tcs, Allctr_t *alc, Ulong size) +{ + int i, max_i, address_order; + char stk[128]; + RBT_t *root, *x, *y, *res; + Ulong x_sz, y_sz, is_x_black; + long blacks, curr_blacks; + + res = NULL; + + address_order = IS_AOBF(alc); + root = RBT_ROOT(alc); + +#ifdef PRINT_TREE + print_tree(tcs, root, address_order); +#endif + + max_i = i = -1; + curr_blacks = 0; + blacks = -1; + + if (!root) + goto done; + + stk[++i] = 0; + + ASSERT(tcs, RBT_IS_BLACK(root)); + ASSERT(tcs, !RBT_PARENT(root)); + x = root; + curr_blacks++; + + while (x) { + + ASSERT(tcs, i <= 128); + + if (!(stk[i] & LEFT_VISITED)) { + stk[i] |= LEFT_VISITED; + y = RBT_LEFT(x); + if (RBT_IS_BLACK(y)) + curr_blacks++; + if (y) { + x = y; + stk[++i] = 0; + continue; + } + else { + if (blacks < 0) + blacks = curr_blacks; + ASSERT(tcs, blacks == curr_blacks); + curr_blacks--; + } + } + + if (!(stk[i] & RIGHT_VISITED)) { + stk[i] |= RIGHT_VISITED; + y = RBT_RIGHT(x); + if (RBT_IS_BLACK(y)) + curr_blacks++; + if (y) { + x = y; + stk[++i] = 0; + continue; + } + else { + if (blacks < 0) + blacks = curr_blacks; + ASSERT(tcs, blacks == curr_blacks); + curr_blacks--; + } + } + + + /* Check x ... */ + + is_x_black = RBT_IS_BLACK(x); + x_sz = BLK_SZ(x); + + + if (!is_x_black) { + ASSERT(tcs, RBT_IS_BLACK(RBT_RIGHT(x))); + ASSERT(tcs, RBT_IS_BLACK(RBT_LEFT(x))); + } + + ASSERT(tcs, RBT_PARENT(x) || x == root); + + y = RBT_LEFT(x); + if (y) { + y_sz = BLK_SZ(y); + ASSERT(tcs, RBT_PARENT(y) == x); + if (address_order) { + ASSERT(tcs, y_sz < x_sz || (y_sz == x_sz && y < x)); + } + else { + ASSERT(tcs, RBT_IS_TREE(y)); + ASSERT(tcs, y_sz < x_sz); + } + } + + y = RBT_RIGHT(x); + if (y) { + y_sz = BLK_SZ(y); + ASSERT(tcs, RBT_PARENT(y) == x); + if (address_order) { + ASSERT(tcs, y_sz > x_sz || (y_sz == x_sz && y > x)); + } + else { + ASSERT(tcs, RBT_IS_TREE(y)); + ASSERT(tcs, y_sz > x_sz); + } + } + + if (!address_order) { + Ulong l_sz; + RBTL_t *l = RBT_NEXT(x); + for (l = RBT_NEXT(x); l; l = RBT_NEXT(l)) { + l_sz = BLK_SZ(l); + ASSERT(tcs, l_sz == x_sz); + ASSERT(tcs, !RBT_IS_TREE(l)); + } + } + + if (size && x_sz >= size) { + if (!res) + res = x; + else { + y_sz = BLK_SZ(res); + if (address_order) { + if (x_sz < y_sz || (x_sz == y_sz && x < res)) + res = x; + } + else { + if (!res || x_sz < y_sz) + res = x; + } + } + } + + if (max_i < i) + max_i = i; + if (is_x_black) + curr_blacks--; + x = RBT_PARENT(x); + i--; + } + + done: + ASSERT(tcs, curr_blacks == 0); + ASSERT(tcs, i == -1); + + testcase_printf(tcs, "Red-Black Tree OK! Max depth = %d; " + "Black depth = %d\n", max_i+1, blacks < 0 ? 0 : blacks); + + return res; + +} + +static void +do_check(TestCaseState_t *tcs, Allctr_t *a, Ulong size) +{ + Ulong sz = ((size + 7) / 8)*8; + void *tmp; + Block_t *x, *y; + + x = (Block_t *) check_tree(tcs, a, sz); + tmp = ALLOC(a, sz - ABLK_HDR_SZ); + ASSERT(tcs, tmp); + y = UMEM2BLK(tmp); + if (IS_AOBF(a)) { + ASSERT(tcs, x == y); + } + else { + ASSERT(tcs, BLK_SZ(x) == BLK_SZ(y)); + } + FREE(a, tmp); +} + + +static void +test_it(TestCaseState_t *tcs) +{ + int i; + Allctr_t a = ((rbtree_test_data *) tcs->extra)->allocator; + void **blk = ((rbtree_test_data *) tcs->extra)->blk; + void **fence = ((rbtree_test_data *) tcs->extra)->fence; + Ulong min_blk_sz; + + min_blk_sz = MIN_BLK_SZ(a); + + for (i = 0; i < NO_BLOCKS; i++) { + blk[i] = ALLOC(a, min_blk_sz + i % 500); + fence[i] = ALLOC(a, 1); + ASSERT(tcs, blk[i] && fence[i]); + } + + for (i = 0; i < NO_BLOCKS; i++) { + if (i % 3 == 0) { + FREE(a, blk[i]); + blk[i] = NULL; + } + if (i % (NO_BLOCKS/2) == 0) + do_check(tcs, a, 50); + } + + for (i = 0; i < NO_BLOCKS; i++) { + if (i % 5 == 0 && blk[i]) { + FREE(a, blk[i]); + blk[i] = NULL; + } + if (i % (NO_BLOCKS/2) == 0) + do_check(tcs, a, 200); + } + + for (i = 0; i < NO_BLOCKS; i++) { + if (blk[i]) { + FREE(a, blk[i]); + blk[i] = NULL; + } + if (i % (NO_BLOCKS/2) == 0) + do_check(tcs, a, 100); + } + + do_check(tcs, a, 250); + + for (i = 0; i < NO_BLOCKS; i++) { + FREE(a, fence[i]); + if (i % (NO_BLOCKS/3) == 0) + do_check(tcs, a, 300); + } + + ASSERT(tcs, RBT_ROOT(a)); + ASSERT(tcs, !RBT_LEFT(RBT_ROOT(a))); + ASSERT(tcs, !RBT_RIGHT(RBT_ROOT(a))); +} + + +char * +testcase_name(void) +{ + return "rbtree"; +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + if (tcs->extra) { + rbtree_test_data *td = tcs->extra; + tcs->extra = NULL; + if (td->allocator) + STOP_ALC(td->allocator); + if (td->blk) + testcase_free((void *) td->blk); + if (td->fence) + testcase_free((void *) td->fence); + testcase_free((void *) td); + } +} + +void +testcase_run(TestCaseState_t *tcs) +{ + char *argv1[] = {"-tasbf", NULL}; + char *argv2[] = {"-tasaobf", NULL}; + Allctr_t *a; + rbtree_test_data *td; + + /* Best fit... */ + + testcase_printf(tcs, "Setup...\n"); + + td = (rbtree_test_data *) testcase_alloc(sizeof(rbtree_test_data)); + ASSERT(tcs, td); + tcs->extra = (void *) td; + td->allocator = NULL; + td->blk = (void **) testcase_alloc(sizeof(void *)*NO_BLOCKS); + td->fence = (void **) testcase_alloc(sizeof(void *)*NO_BLOCKS); + ASSERT(tcs, td->blk && td->fence); + + testcase_printf(tcs, "Starting test of best fit...\n"); + + td->allocator = a = START_ALC("rbtree_bf_", 0, argv1); + + ASSERT(tcs, a); + ASSERT(tcs, !IS_AOBF(a)); + + test_it(tcs); + + STOP_ALC(a); + td->allocator = NULL; + + testcase_printf(tcs, "Best fit test succeeded!\n"); + + /* Address order best fit... */ + + testcase_printf(tcs, "Starting test of address order best fit...\n"); + + td->allocator = a = START_ALC("rbtree_aobf_", 0, argv2); + + ASSERT(tcs, a); + ASSERT(tcs, IS_AOBF(a)); + + test_it(tcs); + + STOP_ALC(a); + td->allocator = NULL; + + testcase_printf(tcs, "Address order best fit test succeeded!\n"); + +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/realloc_copy.c erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/realloc_copy.c --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/realloc_copy.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/realloc_copy.c 2003-07-07 13:17:31.000000000 +0100 @@ -0,0 +1,279 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include "allocator_test.h" +#include +#include + +#if 1 +#define PRINT_ALLOC_OPS +#endif + +#define SBC_THRESHOLD 8192 +#define NO_OF_BLOCKS 7 +#define NO_OF_ALLOC_OPS_PER_BLOCK 700 + +typedef struct { + unsigned char *p; + Ulong s; + int i; + Ulong *as; +} block; + +Ulong alloc_seq_1[] = { + SBC_THRESHOLD, /* mmap */ + SBC_THRESHOLD*4, /* mmap to new mmap */ + SBC_THRESHOLD/50, /* mmap to malloc */ + SBC_THRESHOLD, /* malloc to mmap */ + 0 +}; + + +Ulong alloc_seq_2[] = { + 1, + SBC_THRESHOLD/10, + SBC_THRESHOLD/9, + SBC_THRESHOLD/8, + SBC_THRESHOLD/7, + SBC_THRESHOLD/6, + SBC_THRESHOLD/5, + SBC_THRESHOLD/4, + SBC_THRESHOLD/3, + SBC_THRESHOLD/2, + SBC_THRESHOLD*1, + SBC_THRESHOLD*2, + SBC_THRESHOLD*3, + SBC_THRESHOLD*4, + SBC_THRESHOLD*5, + SBC_THRESHOLD*6, + SBC_THRESHOLD*7, + SBC_THRESHOLD*8, + SBC_THRESHOLD*9, + SBC_THRESHOLD*10, + SBC_THRESHOLD*9, + SBC_THRESHOLD*8, + SBC_THRESHOLD*7, + SBC_THRESHOLD*6, + SBC_THRESHOLD*5, + SBC_THRESHOLD*4, + SBC_THRESHOLD*3, + SBC_THRESHOLD*2, + SBC_THRESHOLD*1, + SBC_THRESHOLD/2, + SBC_THRESHOLD/3, + SBC_THRESHOLD/4, + SBC_THRESHOLD/5, + SBC_THRESHOLD/6, + SBC_THRESHOLD/7, + SBC_THRESHOLD/8, + SBC_THRESHOLD/9, + SBC_THRESHOLD/10, + 1, + 0 +}; + +Ulong alloc_seq_3[] = { + SBC_THRESHOLD*11, + SBC_THRESHOLD*10, + SBC_THRESHOLD*9, + SBC_THRESHOLD*8, + SBC_THRESHOLD*7, + SBC_THRESHOLD*6, + SBC_THRESHOLD*5, + SBC_THRESHOLD*4, + SBC_THRESHOLD*3, + SBC_THRESHOLD*2, + SBC_THRESHOLD*1, + SBC_THRESHOLD/2, + SBC_THRESHOLD/3, + SBC_THRESHOLD/4, + SBC_THRESHOLD/5, + SBC_THRESHOLD/6, + SBC_THRESHOLD/7, + SBC_THRESHOLD/8, + SBC_THRESHOLD/9, + SBC_THRESHOLD/10, + 1, + SBC_THRESHOLD/10, + SBC_THRESHOLD/9, + SBC_THRESHOLD/8, + SBC_THRESHOLD/7, + SBC_THRESHOLD/6, + SBC_THRESHOLD/5, + SBC_THRESHOLD/4, + SBC_THRESHOLD/3, + SBC_THRESHOLD/2, + SBC_THRESHOLD*1, + SBC_THRESHOLD*2, + SBC_THRESHOLD*3, + SBC_THRESHOLD*4, + SBC_THRESHOLD*5, + SBC_THRESHOLD*6, + SBC_THRESHOLD*7, + SBC_THRESHOLD*8, + SBC_THRESHOLD*9, + SBC_THRESHOLD*10, + 0 +}; + +Ulong alloc_seq_4[] = { + SBC_THRESHOLD*1, + SBC_THRESHOLD*10, + SBC_THRESHOLD*1, + 0 +}; + +Ulong alloc_seq_5[] = { + SBC_THRESHOLD/50, + SBC_THRESHOLD*10, + SBC_THRESHOLD/50, + 0 +}; + +Ulong alloc_seq_6[] = { + SBC_THRESHOLD/50, + SBC_THRESHOLD*10, + SBC_THRESHOLD/50, + SBC_THRESHOLD*10, + 0 +}; + +Ulong alloc_seq_7[] = { + 1, + SBC_THRESHOLD/50, + SBC_THRESHOLD*10, + SBC_THRESHOLD/50, + 0 +}; + + +block blocks[NO_OF_BLOCKS] = {{NULL, 0, 0, alloc_seq_1}, + {NULL, 0, 0, alloc_seq_2}, + {NULL, 0, 0, alloc_seq_3}, + {NULL, 0, 0, alloc_seq_4}, + {NULL, 0, 0, alloc_seq_5}, + {NULL, 0, 0, alloc_seq_6}, + {NULL, 0, 0, alloc_seq_7}}; + +#define CHECK_BLOCK_DATA(T, P, S, D) \ + check_block_data(__FILE__, __LINE__, (T), (P), (S), (D)) + +static void +check_block_data(char *file, int line, + TestCaseState_t *tcs, unsigned char *p, Ulong sz, int d) +{ + Ulong i; + for (i = 0; i < sz; i++) + if (p[i] != (unsigned char) d) + testcase_failed(tcs, "%s:%d: Data clobbered! found id=%d; " + "expected id=%d\n", file, line, (int) p[i], d); +} + + +static void +alloc_op(TestCaseState_t *tcs, Allctr_t *a, block *bp, int id, int clean_up) +{ + if(bp->p) + CHECK_BLOCK_DATA(tcs, bp->p, bp->s, id); + + if(bp->as[bp->i] == 0 || clean_up) { + FREE(a, bp->p); +#ifdef PRINT_ALLOC_OPS + testcase_printf(tcs, "FREE(0x%lx) [id=%d]\n", (Ulong) bp->p, id); +#endif + bp->p = NULL; + bp->s = 0; + bp->i = 0; /* start from the beginning again */ + return; + } + + if(!bp->p) { + bp->s = bp->as[bp->i]; + bp->p = (unsigned char *) ALLOC(a, bp->s); +#ifdef PRINT_ALLOC_OPS + testcase_printf(tcs, "0x%lx = ALLOC(%lu) [id=%d]\n", + (Ulong) bp->p, bp->s, id); +#endif + if(!bp->p) + testcase_failed(tcs, "ALLOC(%lu) failed [id=%d])\n", bp->s, id); + memset((void *) bp->p, id, (size_t) bp->s); + } + else { + unsigned char *p = (unsigned char *) REALLOC(a, bp->p, bp->as[bp->i]); +#ifdef PRINT_ALLOC_OPS + testcase_printf(tcs, "0x%lx = REALLOC(0x%lx, %lu) [id=%d]\n", + (Ulong) p, (Ulong) bp->p, bp->as[bp->i], id); +#endif + if(!p) { + testcase_failed(tcs, "REALLOC(0x%lx, %lu) failed [id=%d]\n", + (Ulong) bp->p, bp->as[bp->i], id); + } + + if(bp->s < bp->as[bp->i]) { + CHECK_BLOCK_DATA(tcs, p, bp->s, id); + memset((void *) p, id, (size_t) bp->as[bp->i]); + } + else + CHECK_BLOCK_DATA(tcs, p, bp->as[bp->i], id); + + bp->s = bp->as[bp->i]; + bp->p = p; + } + + bp->i++; +} + +char * +testcase_name(void) +{ + return "realloc_copy"; +} + +void +testcase_run(TestCaseState_t *tcs) +{ + int i, j; + char sbct_buf[20]; + char *argv[] = {"-tmmsbc", "5000", "-tsbct", &sbct_buf[0], NULL}; + Allctr_t *a; + + sprintf(sbct_buf, "%d", SBC_THRESHOLD/1024); + + a = START_ALC("realloc_copy_", 0, argv); + ASSERT(tcs, a); + tcs->extra = (void *) a; + + for(i = 0; i < NO_OF_ALLOC_OPS_PER_BLOCK; i++) + for(j = 0; j < NO_OF_BLOCKS; j++) + alloc_op(tcs, a, &blocks[j], j + 1, 0); + + for(j = 0; j < NO_OF_BLOCKS; j++) + alloc_op(tcs, a, &blocks[j], j + 1, 1); + + STOP_ALC((Allctr_t *) tcs->extra); + tcs->extra = NULL; +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + if (tcs->extra) + STOP_ALC((Allctr_t *) tcs->extra); +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/testcase_driver.c erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/testcase_driver.c --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/testcase_driver.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/testcase_driver.c 2009-03-12 12:16:44.000000000 +0000 @@ -0,0 +1,260 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include +#include +#include +#include +#include + +#ifdef __WIN32__ +#undef HAVE_VSNPRINTF +#define HAVE_VSNPRINTF 1 +#define vsnprintf _vsnprintf +#endif + +#ifndef HAVE_VSNPRINTF +#define HAVE_VSNPRINTF 0 +#endif + +#define COMMENT_BUF_SZ 4096 + +#define TESTCASE_FAILED 0 +#define TESTCASE_SKIPPED 1 +#define TESTCASE_SUCCEEDED 2 + +typedef struct { + TestCaseState_t visible; + ErlDrvPort port; + int result; + jmp_buf done_jmp_buf; + char *comment; + char comment_buf[COMMENT_BUF_SZ]; +} InternalTestCaseState_t; + +ErlDrvData testcase_drv_start(ErlDrvPort port, char *command); +void testcase_drv_stop(ErlDrvData drv_data); +void testcase_drv_run(ErlDrvData drv_data, char *buf, int len); + +static ErlDrvEntry testcase_drv_entry = { + NULL, + testcase_drv_start, + testcase_drv_stop, + testcase_drv_run +}; + + +DRIVER_INIT(testcase_drv) +{ + testcase_drv_entry.driver_name = testcase_name(); + return &testcase_drv_entry; +} + +ErlDrvData +testcase_drv_start(ErlDrvPort port, char *command) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) + driver_alloc(sizeof(InternalTestCaseState_t)); + if (!itcs) { + return ERL_DRV_ERROR_GENERAL; + } + + itcs->visible.testcase_name = testcase_name(); + itcs->visible.extra = NULL; + itcs->port = port; + itcs->result = TESTCASE_FAILED; + itcs->comment = ""; + + return (ErlDrvData) itcs; +} + +void +testcase_drv_stop(ErlDrvData drv_data) +{ + testcase_cleanup((TestCaseState_t *) drv_data); + driver_free((void *) drv_data); +} + +void +testcase_drv_run(ErlDrvData drv_data, char *buf, int len) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) drv_data; + ErlDrvTermData result_atom; + ErlDrvTermData msg[12]; + + itcs->visible.command = buf; + itcs->visible.command_len = len; + + if (setjmp(itcs->done_jmp_buf) == 0) { + testcase_run((TestCaseState_t *) itcs); + itcs->result = TESTCASE_SUCCEEDED; + } + + switch (itcs->result) { + case TESTCASE_SUCCEEDED: + result_atom = driver_mk_atom("succeeded"); + break; + case TESTCASE_SKIPPED: + result_atom = driver_mk_atom("skipped"); + break; + case TESTCASE_FAILED: + default: + result_atom = driver_mk_atom("failed"); + break; + } + + msg[0] = ERL_DRV_ATOM; + msg[1] = (ErlDrvTermData) result_atom; + + msg[2] = ERL_DRV_PORT; + msg[3] = driver_mk_port(itcs->port); + + msg[4] = ERL_DRV_ATOM; + msg[5] = driver_mk_atom(itcs->visible.testcase_name); + + msg[6] = ERL_DRV_STRING; + msg[7] = (ErlDrvTermData) itcs->comment; + msg[8] = (ErlDrvTermData) strlen(itcs->comment); + + msg[9] = ERL_DRV_TUPLE; + msg[10] = (ErlDrvTermData) 4; + + driver_output_term(itcs->port, msg, 11); +} + +int +testcase_assertion_failed(TestCaseState_t *tcs, + char *file, int line, char *assertion) +{ + testcase_failed(tcs, "%s:%d: Assertion failed: \"%s\"", + file, line, assertion); + return 0; +} + +void +testcase_printf(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + ErlDrvTermData msg[12]; + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + msg[0] = ERL_DRV_ATOM; + msg[1] = (ErlDrvTermData) driver_mk_atom("print"); + + msg[2] = ERL_DRV_PORT; + msg[3] = driver_mk_port(itcs->port); + + msg[4] = ERL_DRV_ATOM; + msg[5] = driver_mk_atom(itcs->visible.testcase_name); + + msg[6] = ERL_DRV_STRING; + msg[7] = (ErlDrvTermData) itcs->comment_buf; + msg[8] = (ErlDrvTermData) strlen(itcs->comment_buf); + + msg[9] = ERL_DRV_TUPLE; + msg[10] = (ErlDrvTermData) 4; + + driver_output_term(itcs->port, msg, 11); +} + + +void testcase_succeeded(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + itcs->result = TESTCASE_SUCCEEDED; + itcs->comment = itcs->comment_buf; + + longjmp(itcs->done_jmp_buf, 1); +} + +void testcase_skipped(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + itcs->result = TESTCASE_SKIPPED; + itcs->comment = itcs->comment_buf; + + longjmp(itcs->done_jmp_buf, 1); +} + +void testcase_failed(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + char buf[10]; + size_t bufsz = sizeof(buf); + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + itcs->result = TESTCASE_FAILED; + itcs->comment = itcs->comment_buf; + + if (erl_drv_getenv("ERL_ABORT_ON_FAILURE", buf, &bufsz) == 0 + && strcmp("true", buf) == 0) { + fprintf(stderr, "Testcase \"%s\" failed: %s\n", + itcs->visible.testcase_name, itcs->comment); + abort(); + } + + longjmp(itcs->done_jmp_buf, 1); +} + +void *testcase_alloc(size_t size) +{ + return driver_alloc(size); +} + +void *testcase_realloc(void *ptr, size_t size) +{ + return driver_realloc(ptr, size); +} + +void testcase_free(void *ptr) +{ + driver_free(ptr); +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/testcase_driver.h erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/testcase_driver.h --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/testcase_driver.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/testcase_driver.h 2003-07-07 13:23:24.000000000 +0100 @@ -0,0 +1,51 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#ifndef TESTCASE_DRIVER_H__ +#define TESTCASE_DRIVER_H__ + +#include "erl_driver.h" +#include + +typedef struct { + char *testcase_name; + char *command; + int command_len; + void *extra; +} TestCaseState_t; + +#define ASSERT(TCS, B) \ + ((void) ((B) ? 1 : testcase_assertion_failed((TCS), __FILE__, __LINE__, #B))) + + +void testcase_printf(TestCaseState_t *tcs, char *frmt, ...); +void testcase_succeeded(TestCaseState_t *tcs, char *frmt, ...); +void testcase_skipped(TestCaseState_t *tcs, char *frmt, ...); +void testcase_failed(TestCaseState_t *tcs, char *frmt, ...); +int testcase_assertion_failed(TestCaseState_t *tcs, char *file, int line, + char *assertion); +void *testcase_alloc(size_t size); +void *testcase_realloc(void *ptr, size_t size); +void testcase_free(void *ptr); + + +char *testcase_name(void); +void testcase_run(TestCaseState_t *tcs); +void testcase_cleanup(TestCaseState_t *tcs); + +#endif diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/threads.c erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/threads.c --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE_data/threads.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE_data/threads.c 2009-03-12 12:16:44.000000000 +0000 @@ -0,0 +1,447 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + + +#ifndef __WIN32__ +#include +#include +#include +#endif +#include +#include +#include +#include "testcase_driver.h" +#include "allocator_test.h" + +#ifdef __WIN32__ +#undef HAVE_VSNPRINTF +#define HAVE_VSNPRINTF 1 +#define vsnprintf _vsnprintf +#endif + +#ifndef HAVE_VSNPRINTF +#define HAVE_VSNPRINTF 0 +#endif + +#define NO_OF_ALLOC_SEQS 6 +#define NO_OF_THREADS (18) +#define NO_OF_BLOCKS 10 +#define NO_OF_OPS_PER_BL 200 +#define SBC_THRESHOLD 8192 + +#define BLOCK_ID(TN, BN) ((TN) << 4 | (BN)) + +#define ERR_BUF_SZ 4096 +static char err_buf[ERR_BUF_SZ]; +static volatile int tc_failed; +static int dead_thread_no; +static erts_mutex tc_mutex; +static erts_cond tc_cond; + +static void exit_thread(int t_no, int do_lock) +{ + if (do_lock) + THR_MTX_LOCK(tc_mutex); + + while (dead_thread_no >= 0) + THR_COND_WAIT(tc_cond, tc_mutex); + dead_thread_no = t_no; + + THR_COND_BCAST(tc_cond); + THR_MTX_UNLOCK(tc_mutex); + THR_EXIT(NULL); +} + +static void fail(int t_no, char *frmt, ...) +{ + char buf[10]; + size_t bufsz = sizeof(buf); + va_list va; + + THR_MTX_LOCK(tc_mutex); + + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(err_buf, ERR_BUF_SZ, frmt, va); +#else + vsprintf(err_buf, frmt, va); +#endif + va_end(va); + + tc_failed = 1; + + if (erl_drv_getenv("ERL_ABORT_ON_FAILURE", buf, &bufsz) == 0 + && strcmp("true", buf) == 0) { + fprintf(stderr, "Testcase \"%s\" failed: %s\n", + testcase_name(), err_buf); + abort(); + } + + exit_thread(t_no, 0); +} + +static Allctr_t *alloc_not_ts = NULL; +static Allctr_t *alloc_ts_1 = NULL; +static Allctr_t *alloc_ts_2 = NULL; + +static void stop_allocators(void) +{ + if (alloc_not_ts) { + STOP_ALC(alloc_not_ts); + alloc_not_ts = NULL; + } + if (alloc_ts_1) { + STOP_ALC(alloc_ts_1); + alloc_ts_1 = NULL; + } + if (alloc_ts_2) { + STOP_ALC(alloc_ts_2); + alloc_ts_2 = NULL; + } +} + + +void *thread_func(void *arg); + +typedef struct { + Allctr_t *a; + int t_no; + int no_ops_per_bl; +} ThreadData; + + +char * +testcase_name(void) +{ + return "threads"; +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + stop_allocators(); +} + +void +testcase_run(TestCaseState_t *tcs) +{ + struct { + erts_thread tid; + ThreadData arg; + } threads[NO_OF_THREADS+1] = {{0}}; + int no_threads; + int i; + char sbct_buf[10]; + char *argv_org[] = {"-tasaobf", "-tmmsbc5000", "-tmmmbc5000", "-tsbct", + &sbct_buf[0], NULL}; + char *argv[sizeof(argv_org)/sizeof(argv_org[0])]; + + if (!IS_THREADS_ENABLED) + testcase_skipped(tcs, "Threads not enabled"); + + alloc_not_ts = NULL; + alloc_ts_1 = NULL; + alloc_ts_2 = NULL; + + err_buf[0] = '\0'; + + sprintf(sbct_buf, "%d", SBC_THRESHOLD/1024); + + memcpy((void *) argv, argv_org, sizeof(argv_org)); + alloc_not_ts = START_ALC("threads_not_ts", 0, argv); + ASSERT(tcs, alloc_not_ts); + memcpy((void *) argv, argv_org, sizeof(argv_org)); + alloc_ts_1 = START_ALC("threads_ts_1", 1, argv); + ASSERT(tcs, alloc_ts_1); + memcpy((void *) argv, argv_org, sizeof(argv_org)); + alloc_ts_2 = START_ALC("threads_ts_2", 1, argv); + ASSERT(tcs, alloc_ts_2); + + ASSERT(tcs, !IS_ALLOC_THREAD_SAFE(alloc_not_ts)); + ASSERT(tcs, IS_ALLOC_THREAD_SAFE(alloc_ts_1)); + ASSERT(tcs, IS_ALLOC_THREAD_SAFE(alloc_ts_2)); + + tc_mutex = THR_MTX_CREATE(); + tc_cond = THR_COND_CREATE(); + + THR_MTX_LOCK(tc_mutex); + + dead_thread_no = -1; + no_threads = 0; + + for(i = 1; i <= NO_OF_THREADS; i++) { + char *alc; + int res; + + threads[i].arg.no_ops_per_bl = NO_OF_OPS_PER_BL; + + if (i == 1) { + alc = "threads_not_ts"; + threads[i].arg.no_ops_per_bl *= 2; + threads[i].arg.a = alloc_not_ts; + } + else if (i % 2 == 0) { + alc = "threads_ts_1"; + threads[i].arg.a = alloc_ts_1; + } + else { + alc = "threads_ts_2"; + threads[i].arg.a = alloc_ts_2; + } + threads[i].arg.t_no = i; + + threads[i].tid = THR_CREATE(thread_func, (void *) &threads[i].arg); + if (threads[i].tid) { + testcase_printf(tcs, "Successfully created thread %d " + "using %s_alloc\n", i, alc); + no_threads++; + } + else { + tc_failed = 1; + sprintf(err_buf, "Failed to create thread %d\n", i); + break; + } + + } + + while (no_threads) { + THR_COND_WAIT(tc_cond, tc_mutex); + if (dead_thread_no >= 0) { + no_threads--; + THR_JOIN(threads[dead_thread_no].tid); + testcase_printf(tcs, "Thread %d died\n", dead_thread_no); + dead_thread_no = -1; + THR_COND_BCAST(tc_cond); + } + } + + THR_MTX_UNLOCK(tc_mutex); + THR_MTX_DESTROY(tc_mutex); + THR_COND_DESTROY(tc_cond); + + stop_allocators(); + + if (tc_failed) + testcase_failed(tcs, "%s", err_buf); +} + +Ulong alloc_seq_1[] = { + 17, + SBC_THRESHOLD*2, + SBC_THRESHOLD*20, + SBC_THRESHOLD*2, + 17, + 0 +}; + +Ulong alloc_seq_2[] = { + SBC_THRESHOLD*20, + SBC_THRESHOLD*2, + 17, + SBC_THRESHOLD*2, + SBC_THRESHOLD*20, + 0 +}; + +Ulong alloc_seq_3[] = { + 1, + SBC_THRESHOLD/10, + SBC_THRESHOLD/9, + SBC_THRESHOLD/8, + SBC_THRESHOLD/7, + SBC_THRESHOLD/6, + SBC_THRESHOLD/5, + SBC_THRESHOLD/4, + SBC_THRESHOLD/3, + SBC_THRESHOLD/2, + SBC_THRESHOLD/1, + SBC_THRESHOLD*1, + SBC_THRESHOLD*2, + SBC_THRESHOLD*3, + SBC_THRESHOLD*4, + SBC_THRESHOLD*5, + SBC_THRESHOLD*6, + SBC_THRESHOLD*7, + SBC_THRESHOLD*8, + SBC_THRESHOLD*9, + SBC_THRESHOLD*10, + SBC_THRESHOLD*9, + SBC_THRESHOLD*8, + SBC_THRESHOLD*7, + SBC_THRESHOLD*6, + SBC_THRESHOLD*5, + SBC_THRESHOLD*4, + SBC_THRESHOLD*3, + SBC_THRESHOLD*2, + SBC_THRESHOLD*1, + SBC_THRESHOLD/2, + SBC_THRESHOLD/3, + SBC_THRESHOLD/4, + SBC_THRESHOLD/5, + SBC_THRESHOLD/6, + SBC_THRESHOLD/7, + SBC_THRESHOLD/8, + SBC_THRESHOLD/9, + SBC_THRESHOLD/10, + 1, + 0 +}; + +Ulong alloc_seq_4[] = { + SBC_THRESHOLD*2, + SBC_THRESHOLD*3, + SBC_THRESHOLD*7, + SBC_THRESHOLD*8, + SBC_THRESHOLD*5, + SBC_THRESHOLD*6, + SBC_THRESHOLD*1, + SBC_THRESHOLD*10, + SBC_THRESHOLD*4, + SBC_THRESHOLD*2, + 0 +}; + +Ulong alloc_seq_5[] = { + SBC_THRESHOLD/2, + SBC_THRESHOLD/3, + SBC_THRESHOLD/7, + SBC_THRESHOLD/8, + SBC_THRESHOLD/5, + SBC_THRESHOLD/6, + SBC_THRESHOLD/1, + SBC_THRESHOLD/10, + SBC_THRESHOLD/4, + SBC_THRESHOLD/2, + SBC_THRESHOLD/3, + SBC_THRESHOLD/7, + SBC_THRESHOLD/8, + SBC_THRESHOLD/5, + SBC_THRESHOLD/6, + SBC_THRESHOLD/1, + SBC_THRESHOLD/10, + SBC_THRESHOLD/4, + SBC_THRESHOLD/2, + 0 +}; + +Ulong alloc_seq_6[] = { + 1, 50, 100, 50, 23, 46, 2345, 23, 54, 2, 0 +}; + +Ulong *alloc_seqs[NO_OF_ALLOC_SEQS] = { + alloc_seq_1, + alloc_seq_2, + alloc_seq_3, + alloc_seq_4, + alloc_seq_5, + alloc_seq_6 +}; + +typedef struct { + unsigned char *p; + Ulong s; + int i; + Ulong *as; +} block; + +#define CHECK_BLOCK_DATA(T, P, S, D) \ + check_block_data(__FILE__, __LINE__, (T), (P), (S), (D)) + +static void +check_block_data(char *file, int line, int t_no, + unsigned char *p, Ulong sz, int d) +{ + Ulong i; + for (i = 0; i < sz; i++) + if (p[i] != (unsigned char) d) + fail(t_no, "%s:%d: Thread no %d found clobbered data! " + "found id=%d; expected id=%d\n", + file, line, t_no, (int) p[i], d); +} + +static void +alloc_op(int t_no, Allctr_t *a, block *bp, int id, int clean_up) +{ + if (tc_failed) + exit_thread(t_no, 1); + + if(bp->p) + CHECK_BLOCK_DATA(t_no, bp->p, bp->s, id); + + if(bp->as[bp->i] == 0 || clean_up) { + FREE(a, bp->p); + bp->p = NULL; + bp->s = 0; + bp->i = 0; /* start from the beginning again */ + return; + } + + if(!bp->p) { + bp->s = bp->as[bp->i]; + bp->p = (unsigned char *) ALLOC(a, bp->s); + if(!bp->p) + fail(t_no, "ALLOC(%lu) failed [id=%d])\n", bp->s, id); + memset((void *) bp->p, id, (size_t) bp->s); + } + else { + unsigned char *p = (unsigned char *) REALLOC(a, bp->p, bp->as[bp->i]); + if(!p) + fail(t_no, "REALLOC(0x%lx, %lu) failed [id=%d]\n", + (Ulong) bp->p, bp->as[bp->i], id); + + if(bp->s < bp->as[bp->i]) { + CHECK_BLOCK_DATA(t_no, p, bp->s, id); + memset((void *) p, id, (size_t) bp->as[bp->i]); + } + else + CHECK_BLOCK_DATA(t_no, p, bp->as[bp->i], id); + + bp->s = bp->as[bp->i]; + bp->p = p; + } + + bp->i++; +} + + +void * +thread_func(void *arg) +{ + int i, j; + ThreadData *td = ((ThreadData *) arg); + block bs[NO_OF_BLOCKS]; + + for(i = 0; i < NO_OF_BLOCKS; i++) { + bs[i].p = NULL; + bs[i].s = 0; + bs[i].i = 0; + bs[i].as = alloc_seqs[i % NO_OF_ALLOC_SEQS]; + } + + for(i = 0; i < td->no_ops_per_bl; i++) { + + for(j = 0; j < NO_OF_BLOCKS; j++) + alloc_op(td->t_no, td->a, &bs[j], BLOCK_ID(td->t_no, j), 0); + } + + for(j = 0; j < NO_OF_BLOCKS; j++) + alloc_op(td->t_no, td->a, &bs[j], BLOCK_ID(td->t_no, j), 1); + + exit_thread(td->t_no, 1); + return NULL; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/alloc_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/alloc_SUITE.erl 2009-11-20 13:31:40.000000000 +0000 @@ -0,0 +1,179 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(alloc_SUITE). +-author('rickard.green@uab.ericsson.se'). +-export([all/1]). + +-export([basic/1, + coalesce/1, + threads/1, + realloc_copy/1, + bucket_index/1, + bucket_mask/1, + rbtree/1, + mseg_clear_cache/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-include("test_server.hrl"). + +-define(DEFAULT_TIMETRAP_SECS, 240). + +all(doc) -> []; +all(suite) -> [basic, + coalesce, + threads, + realloc_copy, + bucket_index, + bucket_mask, + rbtree, + mseg_clear_cache]. + + +init_per_testcase(Case, Config) when is_list(Config) -> + Dog = ?t:timetrap(?t:seconds(?DEFAULT_TIMETRAP_SECS)), + [{watchdog, Dog},{testcase, Case}|Config]. + +fin_per_testcase(_Case, Config) when is_list(Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% Testcases %% +%% %% + +basic(suite) -> []; +basic(doc) -> []; +basic(Cfg) -> ?line drv_case(Cfg). + +coalesce(suite) -> []; +coalesce(doc) -> []; +coalesce(Cfg) -> ?line drv_case(Cfg). + +threads(suite) -> []; +threads(doc) -> []; +threads(Cfg) -> ?line drv_case(Cfg). + +realloc_copy(suite) -> []; +realloc_copy(doc) -> []; +realloc_copy(Cfg) -> ?line drv_case(Cfg). + +bucket_index(suite) -> []; +bucket_index(doc) -> []; +bucket_index(Cfg) -> ?line drv_case(Cfg). + +bucket_mask(suite) -> []; +bucket_mask(doc) -> []; +bucket_mask(Cfg) -> ?line drv_case(Cfg). + +rbtree(suite) -> []; +rbtree(doc) -> []; +rbtree(Cfg) -> ?line drv_case(Cfg). + +mseg_clear_cache(suite) -> []; +mseg_clear_cache(doc) -> []; +mseg_clear_cache(Cfg) -> ?line drv_case(Cfg). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% Internal functions %% +%% %% + +drv_case(Config) -> + drv_case(Config, ""). + +drv_case(Config, Command) when is_list(Config), + is_list(Command) -> + case ?t:os_type() of + {Family, _} when Family == unix; Family == win32 -> + ?line {ok, Node} = start_node(Config), + ?line Self = self(), + ?line Ref = make_ref(), + ?line spawn_link(Node, + fun () -> + Res = run_drv_case(Config, Command), + Self ! {Ref, Res} + end), + ?line Result = receive {Ref, Rslt} -> Rslt end, + ?line stop_node(Node), + ?line Result; + SkipOs -> + ?line {skipped, + lists:flatten(["Not run on " + | io_lib:format("~p",[SkipOs])])} + end. + +run_drv_case(Config, Command) -> + ?line DataDir = ?config(data_dir,Config), + ?line CaseName = ?config(testcase,Config), + case erl_ddll:load_driver(DataDir, CaseName) of + ok -> ok; + {error, Error} -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + ?line ?t:fail() + end, + ?line Port = open_port({spawn, atom_to_list(CaseName)}, []), + ?line true = is_port(Port), + ?line Port ! {self(), {command, Command}}, + ?line Result = receive_drv_result(Port, CaseName), + ?line Port ! {self(), close}, + ?line receive + {Port, closed} -> + ok + end, + ?line ok = erl_ddll:unload_driver(CaseName), + ?line Result. + +receive_drv_result(Port, CaseName) -> + ?line receive + {print, Port, CaseName, Str} -> + ?line ?t:format("~s", [Str]), + ?line receive_drv_result(Port, CaseName); + {'EXIT', Port, Error} -> + ?line ?t:fail(Error); + {'EXIT', error, Error} -> + ?line ?t:fail(Error); + {failed, Port, CaseName, Comment} -> + ?line ?t:fail(Comment); + {skipped, Port, CaseName, Comment} -> + ?line {skipped, Comment}; + {succeeded, Port, CaseName, ""} -> + ?line succeeded; + {succeeded, Port, CaseName, Comment} -> + ?line {comment, Comment} + end. + +start_node(Config) when is_list(Config) -> + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line {A, B, C} = now(), + ?line Name = list_to_atom(atom_to_list(?MODULE) + ++ "-" + ++ atom_to_list(?config(testcase, Config)) + ++ "-" + ++ integer_to_list(A) + ++ "-" + ++ integer_to_list(B) + ++ "-" + ++ integer_to_list(C)), + ?line ?t:start_node(Name, slave, [{args, "-pa "++Pa}]). + +stop_node(Node) -> + ?t:stop_node(Node). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/a_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/a_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/a_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/a_SUITE_data/Makefile.src 2007-11-26 19:01:04.000000000 +0000 @@ -0,0 +1,10 @@ +# +# NOTE: +# Suites with makefiles are run first. We want a_SUITE to be run first; +# therefore, keep this makefile even if it should be empty. +# + +all: timer_driver@dll@ + +@SHLIB_RULES@ + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/a_SUITE_data/timer_driver.c erlang-13.b.3-dfsg/erts/emulator/test/a_SUITE_data/timer_driver.c --- erlang-13.b.1-dfsg/erts/emulator/test/a_SUITE_data/timer_driver.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/a_SUITE_data/timer_driver.c 2007-11-26 19:01:04.000000000 +0000 @@ -0,0 +1,77 @@ +/* + * Copied from driver_SUITE and modified... + */ + +#include +#include "erl_driver.h" + +#define get_int32(s) ((((unsigned char*) (s))[0] << 24) | \ + (((unsigned char*) (s))[1] << 16) | \ + (((unsigned char*) (s))[2] << 8) | \ + (((unsigned char*) (s))[3])) + +#define START_TIMER 0 +#define CANCEL_TIMER 1 +#define DELAY_START_TIMER 2 +#define TIMER 3 +#define CANCELLED 4 + +static ErlDrvData timer_start(ErlDrvPort, char*); +static void timer_stop(ErlDrvData), timer_read(ErlDrvData, char*, int), timer(ErlDrvData); + +static ErlDrvEntry timer_driver_entry = +{ + NULL, + timer_start, + timer_stop, + timer_read, + NULL, + NULL, + "timer_driver", + NULL, + NULL, + NULL, + timer, + NULL, + NULL +}; + +DRIVER_INIT(timer_drv) +{ + return &timer_driver_entry; +} + +static ErlDrvData timer_start(ErlDrvPort port, char *buf) +{ + return (ErlDrvData)port; +} + +/* set the timer, this is monitored from erlang measuring the time */ +static void timer_read(ErlDrvData port, char *buf, int len) +{ + char reply[1]; + + if (buf[0] == START_TIMER) { + /* fprintf(stderr, "[timer_drv] Setting timeout: %i\n", get_int32(buf + 1)); */ + driver_set_timer(port, get_int32(buf + 1)); + } else if (buf[0] == CANCEL_TIMER) { + /* fprintf(stderr, "[timer_drv] Timer cancelled\n"); */ + driver_cancel_timer(port); + reply[0] = CANCELLED; + driver_output(port, reply, 1); + } +} + +static void timer_stop(ErlDrvData port) +{ + driver_cancel_timer(port); +} + +static void timer(ErlDrvData port) +{ + char reply[1]; + + /* fprintf(stderr, "[timer_drv] timer timed out\n"); */ + reply[0] = TIMER; + driver_output((ErlDrvPort)port, reply, 1); +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/a_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/a_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/a_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/a_SUITE.erl 2009-09-18 15:09:12.000000000 +0100 @@ -0,0 +1,99 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : a_SUITE.erl +%%% Author : Rickard Green +%%% Description : Misc tests that should be run first +%%% +%%% Created : 21 Aug 2006 by Rickard Green +%%%------------------------------------------------------------------- +-module(a_SUITE). + +-include("test_server.hrl"). + +-export([all/1, long_timers/1, pollset_size/1]). + +all(doc) -> + []; +all(suite) -> + [long_timers, pollset_size]. + +long_timers(doc) -> + []; +long_timers(suite) -> + []; +long_timers(Config) when is_list(Config) -> + Dir = ?config(data_dir, Config), + ?line long_timers_test:start(Dir), + ?line {comment, + "Testcase started! This test will run in parallel with the " + "erts testsuite and ends in the z_SUITE:long_timers testcase."}. + +pollset_size(doc) -> + []; +pollset_size(suite) -> + []; +pollset_size(Config) when is_list(Config) -> + ?line Parent = self(), + ?line Go = make_ref(), + ?line spawn(fun () -> + Name = pollset_size_testcase_initial_state_holder, + true = register(Name, self()), + ChkIo = get_check_io_info(), + io:format("Initial: ~p~n", [ChkIo]), + Parent ! Go, + receive + {get_initial_check_io_result, Pid} -> + Pid ! {initial_check_io_result, ChkIo} + end + end), + ?line receive Go -> ok end, + ?line {comment, + "Testcase started! This test will run in parallel with the " + "erts testsuite and ends in the z_SUITE:pollset_size testcase."}. + +%% +%% Internal functions... +%% + +display_check_io(ChkIo) -> + catch erlang:display('--- CHECK IO INFO ---'), + catch erlang:display(ChkIo), + catch erts_debug:set_internal_state(available_internal_state, true), + NoOfErrorFds = (catch erts_debug:get_internal_state(check_io_debug)), + catch erlang:display({'NoOfErrorFds', NoOfErrorFds}), + catch erts_debug:set_internal_state(available_internal_state, false), + catch erlang:display('--- CHECK IO INFO ---'), + ok. + +get_check_io_info() -> + ChkIo = erlang:system_info(check_io), + case lists:keysearch(pending_updates, 1, ChkIo) of + {value, {pending_updates, 0}} -> + display_check_io(ChkIo), + ChkIo; + false -> + ChkIo; + _ -> + receive after 10 -> ok end, + get_check_io_info() + end. + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/beam_literals_SUITE_data/literal_case_expression.S erlang-13.b.3-dfsg/erts/emulator/test/beam_literals_SUITE_data/literal_case_expression.S --- erlang-13.b.1-dfsg/erts/emulator/test/beam_literals_SUITE_data/literal_case_expression.S 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/beam_literals_SUITE_data/literal_case_expression.S 2007-11-26 19:01:46.000000000 +0000 @@ -0,0 +1,70 @@ +{module, literal_case_expression}. %% version = 0 + +{exports, [{module_info,0},{module_info,1},{x,0},{y,0}]}. + +{attributes, []}. + +{labels, 15}. + + +{function, x, 0, 2}. + {label,1}. + {func_info,{atom,literal_case_expression},{atom,x},0}. + {label,2}. + {test,is_integer,{f,5},[{integer,343434343434}]}. + {select_val,{integer,343434343434}, + {f,5}, + {list,[{integer,343434343434}, + {f,3}, + {integer,397439}, + {f,4}, + {integer,3976554567454}, + {f,4}]}}. + {label,3}. + {move,{atom,ok},{x,0}}. + return. + {label,4}. + {move,{atom,error},{x,0}}. + return. + {label,5}. + {case_end,{integer,343434343434}}. + + +{function, y, 0, 7}. + {label,6}. + {func_info,{atom,literal_case_expression},{atom,y},0}. + {label,7}. + {test,is_float,{f,10},[{float,34.0000}]}. + {select_val,{float,34.0000}, + {f,10}, + {list,[{float,34.0000}, + {f,8}, + {float,397.655}, + {f,9}, + {float,39.7439}, + {f,9}]}}. + {label,8}. + {move,{atom,ok},{x,0}}. + return. + {label,9}. + {move,{atom,error},{x,0}}. + return. + {label,10}. + {case_end,{float,34.0000}}. + + +{function, module_info, 0, 12}. + {label,11}. + {func_info,{atom,literal_case_expression},{atom,module_info},0}. + {label,12}. + {move,{atom,literal_case_expression},{x,0}}. + {call_ext_only,1,{extfunc,erlang,get_module_info,1}}. + + +{function, module_info, 1, 14}. + {label,13}. + {func_info,{atom,literal_case_expression},{atom,module_info},1}. + {label,14}. + {move,{x,0},{x,1}}. + {move,{atom,literal_case_expression},{x,0}}. + {call_ext_only,2,{extfunc,erlang,get_module_info,2}}. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/beam_literals_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/beam_literals_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/beam_literals_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/beam_literals_SUITE.erl 2009-09-18 15:08:00.000000000 +0100 @@ -0,0 +1,433 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(beam_literals_SUITE). +-export([all/1]). +-export([putting/1, matching_smalls/1, matching_smalls_jt/1, + matching_bigs/1, matching_more_bigs/1, + matching_bigs_and_smalls/1, badmatch/1, case_clause/1, + receiving/1, literal_type_tests/1, + put_list/1, fconv/1, literal_case_expression/1]). + +-include("test_server.hrl"). + +all(suite) -> + [putting, matching_smalls, matching_smalls_jt, + matching_bigs, matching_more_bigs, + matching_bigs_and_smalls, badmatch, case_clause, + receiving, literal_type_tests, + put_list, fconv, literal_case_expression]. + +putting(doc) -> "Test creating lists and tuples containing big number literals."; +putting(Config) when is_list(Config) -> + -773973888575883407313908 = chksum(putting1(8987697898797)). + +putting1(X) -> + {8797987987987987872256443, [1324483773773], {3.1415, 2.71, [2.5, 35.125|9.31]}, + [X|349873987387373], + [329878349873|-387394729872], -773973937933873929749873}. + +matching_bigs(doc) -> "Test matching of a few big number literals (in Beam," + "select_val/3 will NOT be used)."; +matching_bigs(Config) when is_list(Config) -> + a = matching1(3972907842873739), + b = matching1(-389789298378939783333333333333333333784), + other = matching1(42). + +matching_smalls(doc) -> "Test matching small numbers (both positive and negative)."; +matching_smalls(Config) when is_list(Config) -> + ?line a = m_small(-42), + ?line b = m_small(0), + ?line c = m_small(105), + ?line d = m_small(-13), + ?line e = m_small(337848), + ?line other = m_small(324), + ?line other = m_small(-7), + ok. + +m_small(-42) -> a; +m_small(0) -> b; +m_small(105) -> c; +m_small(-13) -> d; +m_small(337848) -> e; +m_small(_) -> other. + +matching_smalls_jt(doc) -> + "Test matching small numbers (both positive and negative). " + "Make sure that a jump table is used."; +matching_smalls_jt(Config) when is_list(Config) -> + ?line a = m_small_jt(-2), + ?line b = m_small_jt(-1), + ?line c = m_small_jt(0), + ?line d = m_small_jt(2), + ?line e = m_small_jt(3), + ?line other = m_small(324), + ?line other = m_small(-7), + ok. + +m_small_jt(-2) -> a; +m_small_jt(-1) -> b; +m_small_jt(0) -> c; +m_small_jt(2) -> d; +m_small_jt(3) -> e; +m_small_jt(_) -> other. + +%% Big numbers, no select_val. + +matching1(3972907842873739) -> a; +matching1(-389789298378939783333333333333333333784) -> b; +matching1(_) -> other. + + +matching_more_bigs(doc) -> "Test matching of a big number literals (in Beam," + "a select_val/3 instruction will be used)."; +matching_more_bigs(Config) when is_list(Config) -> + a = matching2(-999766349740978337), + b = matching2(9734097866575478), + c = matching2(-966394677364879734), + d = matching2(13987294872948990), + e = matching2(777723896192459245), + other = matching2(7), + other = matching2(39789827988888888888888888888347474444444444444444444). + +%% Big numbers with select_val. + +matching2(-999766349740978337) -> a; +matching2(9734097866575478) -> b; +matching2(-966394677364879734) -> c; +matching2(13987294872948990) -> d; +matching2(777723896192459245) -> e; +matching2(_) -> other. + +matching_bigs_and_smalls(doc) -> "Test matching of a mix of big numbers and literals."; +matching_bigs_and_smalls(suite) -> []; +matching_bigs_and_smalls(Config) when is_list(Config) -> + a = matching3(38472928723987239873873), + b = matching3(0), + c = matching3(-3873973932710954671207461057614287561348756348743634876436784367873), + d = matching3(3978429867297393873), + e = matching3(42), + f = matching3(-4533), + other = matching3(77), + other = matching3(39274120984379249874219748). + +%% Mixed small and big. + +matching3(38472928723987239873873) -> a; +matching3(0) -> b; +matching3(-3873973932710954671207461057614287561348756348743634876436784367873) -> c; +matching3(3978429867297393873) -> d; +matching3(42) -> e; +matching3(-4533) -> f; +matching3(_) -> other. + +badmatch(doc) -> "Test literal badmatches with big number and floats."; +badmatch(Config) when is_list(Config) -> + %% We are satisfied if we can load this module and run it. + Big = id(32984798729847892498297824872982972978239874), + Float = id(3.1415927), + ?line catch a = Big, + ?line catch b = Float, + ?line {'EXIT',{{badmatch,3879373498378993387},_}} = + (catch c = 3879373498378993387), + ?line {'EXIT',{{badmatch,7.0},_}} = (catch d = 7.0), + ?line case Big of + Big -> ok + end, + ?line case Float of + Float -> ok + end, + ok. + +case_clause(Config) when is_list(Config) -> + ?line {'EXIT',{{case_clause,337.0},_}} = (catch case_clause_float()), + ?line {'EXIT',{{try_clause,42.0},_}} = (catch try_case_clause_float()), + ?line {'EXIT',{{case_clause,37932749837839747383847398743789348734987},_}} = + (catch case_clause_big()), + ?line {'EXIT',{{try_clause,977387349872349870423364354398566348},_}} = + (catch try_case_clause_big()), + ok. + +case_clause_float() -> + case 337.0 of + blurf -> ok + end. + +try_case_clause_float() -> + try 42.0 of + blurf -> ok + catch _:_ -> + error + end. + +case_clause_big() -> + case 37932749837839747383847398743789348734987 of + blurf -> ok + end. + +try_case_clause_big() -> + try 977387349872349870423364354398566348 of + blurf -> ok + catch _:_ -> + error + end. + +receiving(doc) -> "Test receive with a big number literal (more than 27 bits, " + "less than 32 bits)."; +receiving(Config) when is_list(Config) -> + Self = self(), + spawn(fun() -> Self ! here_is_a_message end), + ok = receive + here_is_a_message -> + ok + after 16#f1234567 -> + timeout + end. + +literal_type_tests(doc) -> "Test type tests on literal values."; +literal_type_tests(Config) when is_list(Config) -> + %% Generate an Erlang module with all different type of type tests. + ?line Tests = make_test([{T, L} || T <- type_tests(), L <- literals()]), + ?line Mod = literal_test, + ?line Func = {function, 0, test, 0, [{clause,0,[],[],Tests}]}, + ?line Form = [{attribute,0,module,Mod}, + {attribute,0,compile,export_all}, + Func, {eof,0}], + + %% Print generated code for inspection. + ?line lists:foreach(fun (F) -> io:put_chars([erl_pp:form(F),"\n"]) end, Form), + + %% Test compile:form/1. This implies full optimization (default). + ?line {ok,Mod,Code1} = compile:forms(Form), + ?line {module,Mod} = code:load_binary(Mod, Mod, Code1), + ?line Mod:test(), + ?line true = code:delete(Mod), + ?line code:purge(Mod), + + %% Test compile:form/2. Turn off all optimizations. + ?line {ok,Mod,Code2} = compile:forms(Form, [binary,report,time, + no_copt,no_postopt]), + ?line {module,Mod} = code:load_binary(Mod, Mod, Code2), + ?line Mod:test(), + ?line true = code:delete(Mod), + ?line code:purge(Mod), + ok. + +make_test([{is_function=T,L}|Ts]) -> + [test(T, L),test(T, 0, L)|make_test(Ts)]; +make_test([{T,L}|Ts]) -> + [test(T, L)|make_test(Ts)]; +make_test([]) -> []. + +test(T, L) -> + S = lists:flatten(io_lib:format("begin io:format(\"~~p~~n\", [{~p,~p}]), if ~w(~w) -> true; true -> false end end. ", [T, L, T, L])), + {ok,Toks,_Line} = erl_scan:string(S), + {ok,E} = erl_parse:parse_exprs(Toks), + {value,Val,_Bs} = erl_eval:exprs(E, []), + {match,0,{atom,0,Val},hd(E)}. + +test(T, A, L) -> + S = lists:flatten(io_lib:format("begin io:format(\"~~p~~n\", [{~p,~p,~p}]), if ~w(~w, ~w) -> true; true -> false end end. ", + [T,L,A,T,L,A])), + {ok,Toks,_Line} = erl_scan:string(S), + {ok,E} = erl_parse:parse_exprs(Toks), + {value,Val,_Bs} = erl_eval:exprs(E, []), + {match,0,{atom,0,Val},hd(E)}. + +literals() -> + [42, + 3.14, + -3, + 32982724987789283473473838474, + [], + xxxx]. + +type_tests() -> + [is_boolean, + is_integer, + is_float, + is_number, + is_atom, + is_list, + is_tuple, + is_pid, + is_reference, + is_port, + is_binary, + is_function]. + +put_list(Config) when is_list(Config) -> + %% put_list x0 Literal Reg + ?line [Config|8739757395764] = put_list_rqr(Config), + ?line {[Config|7779757395764],Config} = put_list_rqx(Config), + ?line [Config|98765432100000] = put_list_rqy(Config), + + %% put_list x Literal Reg + ?line [Config|16#FFFFF77777137483769] = put_list_xqr(ignore, Config), + ?line {[Config|16#AAAAAFFFFF77777],{a,b},Config} = put_list_xqx({a,b}, Config), + ?line [Config|12777765432979879] = put_list_xqy(ignore, Config), + + %% put_list y Literal Reg + ?line [Config|17424134793676869867] = put_list_yqr(Config), + ?line {[Config|77424134793676869867],Config} = put_list_yqx(Config), + ?line {Config,[Config|16#BCDEFF4241676869867]} = put_list_yqy(Config), + + %% put_list Literal x0 Reg + ?line [42.0|Config] = put_list_qrr(Config), + ?line [Config,42.0|Config] = put_list_qrx(Config), + ?line [100.0|Config] = put_list_qry(Config), + + %% put_list Literal x1 Reg + ?line [127.0|Config] = put_list_qxr({ignore,me}, Config), + ?line [Config,130.0|Config] = put_list_qxx(ignore, Config), + ?line [99.0|Config] = put_list_qxy(Config), + + %% put_list Literal y0 Reg + ?line [200.0|Config] = put_list_qyr(Config), + ?line [Config,210.0|Config] = put_list_qyx(Config), + ?line [[300.0|Config]|Config] = put_list_qyy(Config), + + ok. + +%% put_list x0 Literal x0 +put_list_rqr(Config) -> [Config|8739757395764]. + +%% put_list x0 Literal x1 +put_list_rqx(Config) -> {[Config|7779757395764],Config}. + +%% put_list x0 Literal y0 +put_list_rqy(Config) -> + Res = [Config|98765432100000], + id(42), + Res. + +%% put_list x1 Literal x0 +put_list_xqr(_, Config) -> [Config|16#FFFFF77777137483769]. + +%% put_list x1 Literal x2 +put_list_xqx(A, Config) -> {[Config|16#AAAAAFFFFF77777],A,Config}. + +%% put_list x1 Literal y0 +put_list_xqy(_, Config) -> + Res = [Config|12777765432979879], + id(42), + Res. + +%% put_list y0 Literal x0 +put_list_yqr(Config) -> + id(Config), + [Config|17424134793676869867]. + +%% put_list y0 Literal x1 +put_list_yqx(Config) -> + id(Config), + {[Config|77424134793676869867],Config}. + +%% put_list y1 Literal y0 +put_list_yqy(Config) -> + id(Config), + Res = [Config|16#BCDEFF4241676869867], + id(Config), + {Config,Res}. + +%% put_list Literal x0 x0 +put_list_qrr(Config) -> + [42.0|Config]. + +%% put_list Literal x0 x1 +put_list_qrx(Config) -> + [Config,42.0|Config]. + +%% put_list Literal x0 y0 +put_list_qry(Config) -> + Res = [100.0|Config], + id(0), + Res. + +%% put_list Literal x1 x0 +put_list_qxr(_, Config) -> + [127.0|Config]. + +%% put_list Literal x1 x2 +put_list_qxx(_, Config) -> + [Config,130.0|Config]. + +%% put_list Literal x1 y0 +put_list_qxy(Config) -> + Res = [99.0|Config], + id(0), + Res. + +%% put_list Literal y0 x0 +put_list_qyr(Config) -> + id(Config), + [200.0|Config]. + +%% put_list Literal y0 x1 +put_list_qyx(Config) -> + id(Config), + [Config,210.0|Config]. + +%% put_list Literal y1 y0 +put_list_qyy(Config) -> + id(Config), + Res = [300.0|Config], + id(Config), + [Res|Config]. + +fconv(Config) when is_list(Config) -> + ?line 5.0 = fconv_1(-34444444450.0), + ?line 13.0 = fconv_2(7.0), + ok. + +fconv_1(F) when is_float(F) -> + 34444444455 + F. + +fconv_2(F) when is_float(F) -> + 6.0 + F. + +literal_case_expression(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line Src = filename:join(DataDir, "literal_case_expression"), + ?line {ok,literal_case_expression=Mod,Code} = compile:file(Src, [from_asm,binary]), + ?line {module,Mod} = code:load_binary(Mod, Src, Code), + ?line ok = Mod:x(), + ?line ok = Mod:y(), + ?line true = code:delete(Mod), + ?line code:purge(Mod), + ok. + +%% Help functions. + +chksum(Term) -> + chksum(Term, 0). + +chksum([List|T], Sum) when is_list(List) -> + chksum(T, chksum(List, Sum)); +chksum([H|T], Sum) -> + chksum(T, chksum(H, Sum)); +chksum([], Sum) -> Sum; +chksum(Tuple, Sum) when is_tuple(Tuple) -> + chksum(tuple_to_list(Tuple), Sum); +chksum(Int, Sum) when is_integer(Int) -> + Sum * 5 + Int; +chksum(Other, Sum) -> + erlang:phash2([Other|Sum], 39729747). + +id(I) -> I. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/beam_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/beam_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/beam_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/beam_SUITE.erl 2009-09-18 15:07:54.000000000 +0100 @@ -0,0 +1,281 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(beam_SUITE). + +-export([all/1, packed_registers/1, apply_last/1, apply_last_bif/1, + buildo_mucho/1, heap_sizes/1, big_lists/1]). + +-export([applied/2]). + +-include("test_server.hrl"). + +all(suite) -> + [packed_registers, apply_last, apply_last_bif, buildo_mucho, + heap_sizes, big_lists]. + + +%% Verify that apply(M, F, A) is really tail recursive. +apply_last(Config) when is_list(Config) -> + Pid=spawn(?MODULE, applied, [self(), 10000]), + Size = + receive + {Pid, finished} -> + stack_size(Pid) + after 30000 -> + ?t:fail("applied/2 timed out.") + end, + Pid ! die, + ?t:format("Size: ~p~n", [Size]), + if + Size < 700 -> + ok; + true -> + ?t:fail("10000 apply() grew stack too much.") + end, + ok. + +stack_size(Pid) -> + {heap_size, HS}=process_info(Pid, heap_size), + {stack_size,SS}=process_info(Pid, stack_size), + HS+SS. + +applied(Starter, 0) -> + Starter ! {self(), finished}, + receive + die -> + ok + end, + ok; +applied(Starter, N) -> + apply(?MODULE, applied, [Starter, N-1]). + +%% Verify that tail-recursive use of apply(M,F,A) on a Bif works." +apply_last_bif(Config) when is_list(Config) -> + apply(erlang, abs, [1]). + +%% Test three high register numbers in a put_list instruction +%% (to test whether packing works properly). +packed_registers(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line Mod = packed_regs, + ?line Name = filename:join(PrivDir, atom_to_list(Mod) ++ ".erl"), + + %% Generate a module which generates a list of tuples. + %% put_list(A) -> [{A, 600}, {A, 999}, ... {A, 0}]. + ?line Code = gen_packed_regs(600, ["-module("++atom_to_list(Mod)++").\n", + "-export([put_list/1]).\n", + "put_list(A) ->\n["]), + ?line ok = file:write_file(Name, Code), + + %% Compile the module. + ?line io:format("Compiling: ~s\n", [Name]), + ?line CompRc = compile:file(Name, [{outdir, PrivDir}, report]), + ?line io:format("Result: ~p\n",[CompRc]), + ?line {ok, Mod} = CompRc, + + %% Load it. + ?line io:format("Loading...\n",[]), + ?line LoadRc = code:load_abs(filename:join(PrivDir, atom_to_list(Mod))), + ?line {module,_Module} = LoadRc, + + %% Call it and verify result. + ?line Term = {a, b}, + ?line L = Mod:put_list(Term), + ?line verify_packed_regs(L, Term, 600), + ok. + +gen_packed_regs(0, Acc) -> + [Acc|"{A,0}].\n"]; +gen_packed_regs(N, Acc) -> + gen_packed_regs(N-1, [Acc,"{A,",integer_to_list(N)|"},\n"]). + +verify_packed_regs([], _, -1) -> ok; +verify_packed_regs([{Term, N}| T], Term, N) -> + verify_packed_regs(T, Term, N-1); +verify_packed_regs(L, Term, N) -> + ?line ok = io:format("Expected [{~p, ~p}|T]; got\n~p\n", [Term, N, L]), + ?line test_server:fail(). + +buildo_mucho(Config) when is_list(Config) -> + ?line buildo_mucho_1(), + ok. + +buildo_mucho_1() -> + %% Thanks to Per Gustafsson, HiPE. + [{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}, + {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}]. + +heap_sizes(Config) when is_list(Config) -> + ?line Sizes = erlang:system_info(heap_sizes), + ?line io:format("~p heap sizes\n", [length(Sizes)]), + ?line io:format("~p\n", [Sizes]), + + %% Verify that heap sizes increase monotonically. + ?line Largest = lists:foldl(fun(E, P) when is_integer(P), E > P -> E; + (E, []) -> E + end, [], Sizes), + + %% Verify that the largest heap size consists of 31 or 63 bits. + ?line + case Largest bsr (erlang:system_info(wordsize)*8-2) of + R when R > 0 -> ok + end, + ok. + +%% Thanks to Igor Goryachev. + +big_lists(Config) when is_list(Config) -> + b(), + ok. + +a() -> + {selected, + ["uid", + "nickname", + "n_family", + "n_given", + "email_pref", + "tel_home_number", + "tel_cellular_number", + "adr_home_country", + "adr_home_locality", + "adr_home_region", + "url", + "gender", + "bday", + "constitution", + "height", + "weight", + "hair", + "routine", + "smoke", + "maritalstatus", + "children", + "independence", + "school_number", + "school_locality", + "school_title", + "school_period", + "org_orgname", + "title", + "adr_work_locality", + "photo_type", + "photo_binval"], + [{"test"}]}. + +b() -> + case a() of + {selected, + ["uid", + "nickname", + "n_family", + "n_given", + "email_pref", + "tel_home_number", + "tel_cellular_number", + "adr_home_country", + "adr_home_locality", + "adr_home_region", + "url", + "gender", + "bday", + "constitution", + "height", + "weight", + "hair", + "routine", + "smoke", + "maritalstatus", + "children", + "independence", + "school_number", + "school_locality", + "school_title", + "school_period", + "org_orgname", + "title", + "adr_work_locality", + "photo_type", + "photo_binval"], + _} -> + ok + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/bif_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/bif_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/bif_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/bif_SUITE.erl 2009-09-18 15:09:01.000000000 +0100 @@ -0,0 +1,317 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(bif_SUITE). + +-include("test_server.hrl"). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + t_list_to_existing_atom/1,os_env/1,otp_7526/1, + binary_to_atom/1,binary_to_existing_atom/1, + atom_to_binary/1,min_max/1]). + +all(suite) -> + [t_list_to_existing_atom,os_env,otp_7526, + atom_to_binary,binary_to_atom,binary_to_existing_atom, + min_max]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(1)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +t_list_to_existing_atom(Config) when is_list(Config) -> + ?line all = list_to_existing_atom("all"), + ?line ?MODULE = list_to_existing_atom(?MODULE_STRING), + ?line UnlikelyStr = "dsfj923874390867er869fds9864y97jhg3973qerueoru", + try + ?line list_to_existing_atom(UnlikelyStr), + ?line ?t:fail() + catch + error:badarg -> ok + end, + + %% The compiler has become smarter! We need the call to id/1 in + %% the next line. + ?line UnlikelyAtom = list_to_atom(id(UnlikelyStr)), + ?line UnlikelyAtom = list_to_existing_atom(UnlikelyStr), + ok. + +os_env(doc) -> + []; +os_env(suite) -> + []; +os_env(Config) when is_list(Config) -> + ?line EnvVar1 = "MjhgvFDrresdCghN mnjkUYg vfrD", + ?line false = os:getenv(EnvVar1), + ?line true = os:putenv(EnvVar1, "mors"), + ?line "mors" = os:getenv(EnvVar1), + ?line true = os:putenv(EnvVar1, ""), + ?line case os:getenv(EnvVar1) of + "" -> ?line ok; + false -> ?line ok; + BadVal -> ?line ?t:fail(BadVal) + end, + %% os:putenv and os:getenv currently uses a temp buf of size 1024 + %% for storing key+value + ?line os_env_long(1010, 1030, "hej hopp"). + +os_env_long(Min, Max, _Value) when Min > Max -> + ?line ok; +os_env_long(Min, Max, Value) -> + ?line EnvVar = lists:duplicate(Min, $X), + ?line true = os:putenv(EnvVar, Value), + ?line Value = os:getenv(EnvVar), + ?line true = os:putenv(EnvVar, ""), + ?line os_env_long(Min+1, Max, Value). + +otp_7526(doc) -> + ["Test that string:to_integer does not Halloc in wrong order."]; +otp_7526(Config) when is_list(Config) -> + ok = test_7526(256). + +iterate_7526(0, Acc) -> Acc; +iterate_7526(N, Acc) -> + iterate_7526(N - 1, + [case string:to_integer("9223372036854775808,\n") of + {Int, _Foo} -> Int + end | Acc]). + +do_test_7526(N,M) -> + {Self, Ref} = {self(), make_ref()}, + T = erlang:make_tuple(M,0), + spawn_opt(fun()-> + L = iterate_7526(N, []), + BadList = [X || X <- L, X =/= 9223372036854775808], + BadLen = length(BadList), + M = length(tuple_to_list(T)), + %%io:format("~b bad conversions: ~p~n", [BadLen, BadList]), + Self ! {done, Ref, BadLen} + end, + [link,{fullsweep_after,0}]), + receive {done, Ref, Len} -> Len end. + + +test_7526(0) -> + ok; +test_7526(N) -> + case do_test_7526(1000,N) of + 0 -> test_7526(N-1); + Other -> + {error,N,Other} + end. + +-define(BADARG(E), {'EXIT',{badarg,_}} = (catch E)). +-define(SYS_LIMIT(E), {'EXIT',{system_limit,_}} = (catch E)). + +binary_to_atom(Config) when is_list(Config) -> + HalfLong = lists:seq(0, 127), + HalfLongAtom = list_to_atom(HalfLong), + HalfLongBin = list_to_binary(HalfLong), + Long = lists:seq(0, 254), + LongAtom = list_to_atom(Long), + LongBin = list_to_binary(Long), + + %% latin1 + ?line '' = test_binary_to_atom(<<>>, latin1), + ?line '\377' = test_binary_to_atom(<<255>>, latin1), + ?line HalfLongAtom = test_binary_to_atom(HalfLongBin, latin1), + ?line LongAtom = test_binary_to_atom(LongBin, latin1), + + %% utf8 + ?line '' = test_binary_to_atom(<<>>, utf8), + ?line HalfLongAtom = test_binary_to_atom(HalfLongBin, utf8), + ?line HalfLongAtom = test_binary_to_atom(HalfLongBin, unicode), + ?line [] = [C || C <- lists:seq(128, 255), + begin + list_to_atom([C]) =/= + test_binary_to_atom(<>, utf8) + end], + + %% badarg failures. + ?line fail_binary_to_atom(atom), + ?line fail_binary_to_atom(42), + ?line fail_binary_to_atom({a,b,c}), + ?line fail_binary_to_atom([1,2,3]), + ?line fail_binary_to_atom([]), + ?line fail_binary_to_atom(42.0), + ?line fail_binary_to_atom(self()), + ?line fail_binary_to_atom(make_ref()), + ?line fail_binary_to_atom(<<0:7>>), + ?line fail_binary_to_atom(<<42:13>>), + ?line ?BADARG(binary_to_atom(id(<<>>), blurf)), + ?line ?BADARG(binary_to_atom(id(<<>>), [])), + + %% Bad UTF8 sequences. + ?line ?BADARG(binary_to_atom(id(<<255>>), utf8)), + ?line ?BADARG(binary_to_atom(id(<<255,0>>), utf8)), + ?line ?BADARG(binary_to_atom(id(<<0:512/unit:8,255>>), utf8)), + ?line ?BADARG(binary_to_atom(id(<<0:512/unit:8,255,0>>), utf8)), + ?line ?BADARG(binary_to_atom(id(<<16#C0,16#80>>), utf8)), %Overlong 0. + ?line [?BADARG(binary_to_atom(<>, utf8)) || + C <- lists:seq(256, 16#D7FF)], + ?line [?BADARG(binary_to_atom(<>, utf8)) || + C <- lists:seq(16#E000, 16#FFFD)], + ?line [?BADARG(binary_to_atom(<>, utf8)) || + C <- lists:seq(16#10000, 16#8FFFF)], + ?line [?BADARG(binary_to_atom(<>, utf8)) || + C <- lists:seq(16#90000, 16#10FFFF)], + + %% system_limit failures. + ?line ?SYS_LIMIT(binary_to_atom(<<0:256/unit:8>>, latin1)), + ?line ?SYS_LIMIT(binary_to_atom(<<0:257/unit:8>>, latin1)), + ?line ?SYS_LIMIT(binary_to_atom(<<0:512/unit:8>>, latin1)), + ?line ?SYS_LIMIT(binary_to_atom(<<0:256/unit:8>>, utf8)), + ?line ?SYS_LIMIT(binary_to_atom(<<0:257/unit:8>>, utf8)), + ?line ?SYS_LIMIT(binary_to_atom(<<0:512/unit:8>>, utf8)), + ok. + +test_binary_to_atom(Bin0, Encoding) -> + Res = binary_to_atom(Bin0, Encoding), + Res = binary_to_existing_atom(Bin0, Encoding), + Bin1 = id(<<7:3,Bin0/binary,32:5>>), + Sz = byte_size(Bin0), + <<_:3,UnalignedBin:Sz/binary,_:5>> = Bin1, + Res = binary_to_atom(UnalignedBin, Encoding). + +fail_binary_to_atom(Bin) -> + try + binary_to_atom(Bin, latin1) + catch + error:badarg -> + ok + end, + try + binary_to_atom(Bin, utf8) + catch + error:badarg -> + ok + end, + try + binary_to_existing_atom(Bin, latin1) + catch + error:badarg -> + ok + end, + try + binary_to_existing_atom(Bin, utf8) + catch + error:badarg -> + ok + end. + + +binary_to_existing_atom(Config) when is_list(Config) -> + ?line UnlikelyBin = <<"ou0897979655678dsfj923874390867er869fds973qerueoru">>, + try + ?line binary_to_existing_atom(UnlikelyBin, latin1), + ?line ?t:fail() + catch + error:badarg -> ok + end, + + try + ?line binary_to_existing_atom(UnlikelyBin, utf8), + ?line ?t:fail() + catch + error:badarg -> ok + end, + + ?line UnlikelyAtom = binary_to_atom(id(UnlikelyBin), latin1), + ?line UnlikelyAtom = binary_to_existing_atom(UnlikelyBin, latin1), + ok. + + +atom_to_binary(Config) when is_list(Config) -> + HalfLong = lists:seq(0, 127), + HalfLongAtom = list_to_atom(HalfLong), + HalfLongBin = list_to_binary(HalfLong), + Long = lists:seq(0, 254), + LongAtom = list_to_atom(Long), + LongBin = list_to_binary(Long), + + %% latin1 + ?line <<>> = atom_to_binary('', latin1), + ?line <<"abc">> = atom_to_binary(abc, latin1), + ?line <<127>> = atom_to_binary('\177', latin1), + ?line HalfLongBin = atom_to_binary(HalfLongAtom, latin1), + ?line LongBin = atom_to_binary(LongAtom, latin1), + + %% utf8. + ?line <<>> = atom_to_binary('', utf8), + ?line <<>> = atom_to_binary('', unicode), + ?line <<127>> = atom_to_binary('\177', utf8), + ?line <<"abcdef">> = atom_to_binary(abcdef, utf8), + ?line HalfLongBin = atom_to_binary(HalfLongAtom, utf8), + ?line LongAtomBin = atom_to_binary(LongAtom, utf8), + ?line verify_long_atom_bin(LongAtomBin, 0), + + %% Failing cases. + ?line fail_atom_to_binary(<<1>>), + ?line fail_atom_to_binary(42), + ?line fail_atom_to_binary({a,b,c}), + ?line fail_atom_to_binary([1,2,3]), + ?line fail_atom_to_binary([]), + ?line fail_atom_to_binary(42.0), + ?line fail_atom_to_binary(self()), + ?line fail_atom_to_binary(make_ref()), + ?line ?BADARG(atom_to_binary(id(a), blurf)), + ?line ?BADARG(atom_to_binary(id(b), [])), + ok. + +verify_long_atom_bin(<>, I) -> + verify_long_atom_bin(T, I+1); +verify_long_atom_bin(<<>>, 255) -> ok. + +fail_atom_to_binary(Term) -> + try + atom_to_binary(Term, latin1) + catch + error:badarg -> + ok + end, + try + atom_to_binary(Term, utf8) + catch + error:badarg -> + ok + end. + +min_max(Config) when is_list(Config) -> + ?line a = erlang:min(id(a), a), + ?line a = erlang:min(id(a), b), + ?line a = erlang:min(id(b), a), + ?line b = erlang:min(id(b), b), + ?line a = erlang:max(id(a), a), + ?line b = erlang:max(id(a), b), + ?line b = erlang:max(id(b), a), + ?line b = erlang:max(id(b), b), + + ?line 42.0 = erlang:min(42.0, 42), + ?line 42.0 = erlang:max(42.0, 42), + + ok. + +%% Helpers + +id(I) -> I. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/borders.dat erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/borders.dat --- erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/borders.dat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/borders.dat 2009-03-12 12:16:44.000000000 +0000 @@ -0,0 +1,1116 @@ +33554427 = 33554429 + (-2). +-33554433 = -33554435 - (-2). +33554428 = 33554429 + (-1). +-33554434 = -33554435 - (-1). +33554429 = 33554429 + 0. +-33554435 = -33554435 - 0. +33554430 = 33554429 + 1. +-33554436 = -33554435 - 1. +33554431 = 33554429 + 2. +-33554437 = -33554435 - 2. +33554432 = 33554429 + 3. +-33554438 = -33554435 - 3. +33554433 = 33554429 + 4. +-33554439 = -33554435 - 4. +33554434 = 33554429 + 5. +-33554440 = -33554435 - 5. +33554435 = 33554429 + 6. +-33554441 = -33554435 - 6. +33554428 = 33554430 + (-2). +-33554432 = -33554434 - (-2). +33554429 = 33554430 + (-1). +-33554433 = -33554434 - (-1). +33554430 = 33554430 + 0. +-33554434 = -33554434 - 0. +33554431 = 33554430 + 1. +-33554435 = -33554434 - 1. +33554432 = 33554430 + 2. +-33554436 = -33554434 - 2. +33554433 = 33554430 + 3. +-33554437 = -33554434 - 3. +33554434 = 33554430 + 4. +-33554438 = -33554434 - 4. +33554435 = 33554430 + 5. +-33554439 = -33554434 - 5. +33554436 = 33554430 + 6. +-33554440 = -33554434 - 6. +33554429 = 33554431 + (-2). +-33554431 = -33554433 - (-2). +33554430 = 33554431 + (-1). +-33554432 = -33554433 - (-1). +33554431 = 33554431 + 0. +-33554433 = -33554433 - 0. +33554432 = 33554431 + 1. +-33554434 = -33554433 - 1. +33554433 = 33554431 + 2. +-33554435 = -33554433 - 2. +33554434 = 33554431 + 3. +-33554436 = -33554433 - 3. +33554435 = 33554431 + 4. +-33554437 = -33554433 - 4. +33554436 = 33554431 + 5. +-33554438 = -33554433 - 5. +33554437 = 33554431 + 6. +-33554439 = -33554433 - 6. +33554430 = 33554432 + (-2). +-33554430 = -33554432 - (-2). +33554431 = 33554432 + (-1). +-33554431 = -33554432 - (-1). +33554432 = 33554432 + 0. +-33554432 = -33554432 - 0. +33554433 = 33554432 + 1. +-33554433 = -33554432 - 1. +33554434 = 33554432 + 2. +-33554434 = -33554432 - 2. +33554435 = 33554432 + 3. +-33554435 = -33554432 - 3. +33554436 = 33554432 + 4. +-33554436 = -33554432 - 4. +33554437 = 33554432 + 5. +-33554437 = -33554432 - 5. +33554438 = 33554432 + 6. +-33554438 = -33554432 - 6. +33554431 = 33554433 + (-2). +-33554429 = -33554431 - (-2). +33554432 = 33554433 + (-1). +-33554430 = -33554431 - (-1). +33554433 = 33554433 + 0. +-33554431 = -33554431 - 0. +33554434 = 33554433 + 1. +-33554432 = -33554431 - 1. +33554435 = 33554433 + 2. +-33554433 = -33554431 - 2. +33554436 = 33554433 + 3. +-33554434 = -33554431 - 3. +33554437 = 33554433 + 4. +-33554435 = -33554431 - 4. +33554438 = 33554433 + 5. +-33554436 = -33554431 - 5. +33554439 = 33554433 + 6. +-33554437 = -33554431 - 6. +33554432 = 33554434 + (-2). +-33554428 = -33554430 - (-2). +33554433 = 33554434 + (-1). +-33554429 = -33554430 - (-1). +33554434 = 33554434 + 0. +-33554430 = -33554430 - 0. +33554435 = 33554434 + 1. +-33554431 = -33554430 - 1. +33554436 = 33554434 + 2. +-33554432 = -33554430 - 2. +33554437 = 33554434 + 3. +-33554433 = -33554430 - 3. +33554438 = 33554434 + 4. +-33554434 = -33554430 - 4. +33554439 = 33554434 + 5. +-33554435 = -33554430 - 5. +33554440 = 33554434 + 6. +-33554436 = -33554430 - 6. +33554432 = 33554430 - (-2). +-33554432 = -33554430 + (-2). +33554431 = 33554430 - (-1). +-33554431 = -33554430 + (-1). +33554430 = 33554430 - 0. +-33554430 = -33554430 + 0. +33554429 = 33554430 - 1. +-33554429 = -33554430 + 1. +33554428 = 33554430 - 2. +-33554428 = -33554430 + 2. +33554427 = 33554430 - 3. +-33554427 = -33554430 + 3. +33554426 = 33554430 - 4. +-33554426 = -33554430 + 4. +33554425 = 33554430 - 5. +-33554425 = -33554430 + 5. +33554424 = 33554430 - 6. +-33554424 = -33554430 + 6. +33554433 = 33554431 - (-2). +-33554433 = -33554431 + (-2). +33554432 = 33554431 - (-1). +-33554432 = -33554431 + (-1). +33554431 = 33554431 - 0. +-33554431 = -33554431 + 0. +33554430 = 33554431 - 1. +-33554430 = -33554431 + 1. +33554429 = 33554431 - 2. +-33554429 = -33554431 + 2. +33554428 = 33554431 - 3. +-33554428 = -33554431 + 3. +33554427 = 33554431 - 4. +-33554427 = -33554431 + 4. +33554426 = 33554431 - 5. +-33554426 = -33554431 + 5. +33554425 = 33554431 - 6. +-33554425 = -33554431 + 6. +33554434 = 33554432 - (-2). +-33554434 = -33554432 + (-2). +33554433 = 33554432 - (-1). +-33554433 = -33554432 + (-1). +33554432 = 33554432 - 0. +-33554432 = -33554432 + 0. +33554431 = 33554432 - 1. +-33554431 = -33554432 + 1. +33554430 = 33554432 - 2. +-33554430 = -33554432 + 2. +33554429 = 33554432 - 3. +-33554429 = -33554432 + 3. +33554428 = 33554432 - 4. +-33554428 = -33554432 + 4. +33554427 = 33554432 - 5. +-33554427 = -33554432 + 5. +33554426 = 33554432 - 6. +-33554426 = -33554432 + 6. +33554435 = 33554433 - (-2). +-33554435 = -33554433 + (-2). +33554434 = 33554433 - (-1). +-33554434 = -33554433 + (-1). +33554433 = 33554433 - 0. +-33554433 = -33554433 + 0. +33554432 = 33554433 - 1. +-33554432 = -33554433 + 1. +33554431 = 33554433 - 2. +-33554431 = -33554433 + 2. +33554430 = 33554433 - 3. +-33554430 = -33554433 + 3. +33554429 = 33554433 - 4. +-33554429 = -33554433 + 4. +33554428 = 33554433 - 5. +-33554428 = -33554433 + 5. +33554427 = 33554433 - 6. +-33554427 = -33554433 + 6. +33554436 = 33554434 - (-2). +-33554436 = -33554434 + (-2). +33554435 = 33554434 - (-1). +-33554435 = -33554434 + (-1). +33554434 = 33554434 - 0. +-33554434 = -33554434 + 0. +33554433 = 33554434 - 1. +-33554433 = -33554434 + 1. +33554432 = 33554434 - 2. +-33554432 = -33554434 + 2. +33554431 = 33554434 - 3. +-33554431 = -33554434 + 3. +33554430 = 33554434 - 4. +-33554430 = -33554434 + 4. +33554429 = 33554434 - 5. +-33554429 = -33554434 + 5. +33554428 = 33554434 - 6. +-33554428 = -33554434 + 6. +33554437 = 33554435 - (-2). +-33554437 = -33554435 + (-2). +33554436 = 33554435 - (-1). +-33554436 = -33554435 + (-1). +33554435 = 33554435 - 0. +-33554435 = -33554435 + 0. +33554434 = 33554435 - 1. +-33554434 = -33554435 + 1. +33554433 = 33554435 - 2. +-33554433 = -33554435 + 2. +33554432 = 33554435 - 3. +-33554432 = -33554435 + 3. +33554431 = 33554435 - 4. +-33554431 = -33554435 + 4. +33554430 = 33554435 - 5. +-33554430 = -33554435 + 5. +33554429 = 33554435 - 6. +-33554429 = -33554435 + 6. +67108859 = 67108861 + (-2). +-67108865 = -67108867 - (-2). +67108860 = 67108861 + (-1). +-67108866 = -67108867 - (-1). +67108861 = 67108861 + 0. +-67108867 = -67108867 - 0. +67108862 = 67108861 + 1. +-67108868 = -67108867 - 1. +67108863 = 67108861 + 2. +-67108869 = -67108867 - 2. +67108864 = 67108861 + 3. +-67108870 = -67108867 - 3. +67108865 = 67108861 + 4. +-67108871 = -67108867 - 4. +67108866 = 67108861 + 5. +-67108872 = -67108867 - 5. +67108867 = 67108861 + 6. +-67108873 = -67108867 - 6. +67108860 = 67108862 + (-2). +-67108864 = -67108866 - (-2). +67108861 = 67108862 + (-1). +-67108865 = -67108866 - (-1). +67108862 = 67108862 + 0. +-67108866 = -67108866 - 0. +67108863 = 67108862 + 1. +-67108867 = -67108866 - 1. +67108864 = 67108862 + 2. +-67108868 = -67108866 - 2. +67108865 = 67108862 + 3. +-67108869 = -67108866 - 3. +67108866 = 67108862 + 4. +-67108870 = -67108866 - 4. +67108867 = 67108862 + 5. +-67108871 = -67108866 - 5. +67108868 = 67108862 + 6. +-67108872 = -67108866 - 6. +67108861 = 67108863 + (-2). +-67108863 = -67108865 - (-2). +67108862 = 67108863 + (-1). +-67108864 = -67108865 - (-1). +67108863 = 67108863 + 0. +-67108865 = -67108865 - 0. +67108864 = 67108863 + 1. +-67108866 = -67108865 - 1. +67108865 = 67108863 + 2. +-67108867 = -67108865 - 2. +67108866 = 67108863 + 3. +-67108868 = -67108865 - 3. +67108867 = 67108863 + 4. +-67108869 = -67108865 - 4. +67108868 = 67108863 + 5. +-67108870 = -67108865 - 5. +67108869 = 67108863 + 6. +-67108871 = -67108865 - 6. +67108862 = 67108864 + (-2). +-67108862 = -67108864 - (-2). +67108863 = 67108864 + (-1). +-67108863 = -67108864 - (-1). +67108864 = 67108864 + 0. +-67108864 = -67108864 - 0. +67108865 = 67108864 + 1. +-67108865 = -67108864 - 1. +67108866 = 67108864 + 2. +-67108866 = -67108864 - 2. +67108867 = 67108864 + 3. +-67108867 = -67108864 - 3. +67108868 = 67108864 + 4. +-67108868 = -67108864 - 4. +67108869 = 67108864 + 5. +-67108869 = -67108864 - 5. +67108870 = 67108864 + 6. +-67108870 = -67108864 - 6. +67108863 = 67108865 + (-2). +-67108861 = -67108863 - (-2). +67108864 = 67108865 + (-1). +-67108862 = -67108863 - (-1). +67108865 = 67108865 + 0. +-67108863 = -67108863 - 0. +67108866 = 67108865 + 1. +-67108864 = -67108863 - 1. +67108867 = 67108865 + 2. +-67108865 = -67108863 - 2. +67108868 = 67108865 + 3. +-67108866 = -67108863 - 3. +67108869 = 67108865 + 4. +-67108867 = -67108863 - 4. +67108870 = 67108865 + 5. +-67108868 = -67108863 - 5. +67108871 = 67108865 + 6. +-67108869 = -67108863 - 6. +67108864 = 67108866 + (-2). +-67108860 = -67108862 - (-2). +67108865 = 67108866 + (-1). +-67108861 = -67108862 - (-1). +67108866 = 67108866 + 0. +-67108862 = -67108862 - 0. +67108867 = 67108866 + 1. +-67108863 = -67108862 - 1. +67108868 = 67108866 + 2. +-67108864 = -67108862 - 2. +67108869 = 67108866 + 3. +-67108865 = -67108862 - 3. +67108870 = 67108866 + 4. +-67108866 = -67108862 - 4. +67108871 = 67108866 + 5. +-67108867 = -67108862 - 5. +67108872 = 67108866 + 6. +-67108868 = -67108862 - 6. +67108864 = 67108862 - (-2). +-67108864 = -67108862 + (-2). +67108863 = 67108862 - (-1). +-67108863 = -67108862 + (-1). +67108862 = 67108862 - 0. +-67108862 = -67108862 + 0. +67108861 = 67108862 - 1. +-67108861 = -67108862 + 1. +67108860 = 67108862 - 2. +-67108860 = -67108862 + 2. +67108859 = 67108862 - 3. +-67108859 = -67108862 + 3. +67108858 = 67108862 - 4. +-67108858 = -67108862 + 4. +67108857 = 67108862 - 5. +-67108857 = -67108862 + 5. +67108856 = 67108862 - 6. +-67108856 = -67108862 + 6. +67108865 = 67108863 - (-2). +-67108865 = -67108863 + (-2). +67108864 = 67108863 - (-1). +-67108864 = -67108863 + (-1). +67108863 = 67108863 - 0. +-67108863 = -67108863 + 0. +67108862 = 67108863 - 1. +-67108862 = -67108863 + 1. +67108861 = 67108863 - 2. +-67108861 = -67108863 + 2. +67108860 = 67108863 - 3. +-67108860 = -67108863 + 3. +67108859 = 67108863 - 4. +-67108859 = -67108863 + 4. +67108858 = 67108863 - 5. +-67108858 = -67108863 + 5. +67108857 = 67108863 - 6. +-67108857 = -67108863 + 6. +67108866 = 67108864 - (-2). +-67108866 = -67108864 + (-2). +67108865 = 67108864 - (-1). +-67108865 = -67108864 + (-1). +67108864 = 67108864 - 0. +-67108864 = -67108864 + 0. +67108863 = 67108864 - 1. +-67108863 = -67108864 + 1. +67108862 = 67108864 - 2. +-67108862 = -67108864 + 2. +67108861 = 67108864 - 3. +-67108861 = -67108864 + 3. +67108860 = 67108864 - 4. +-67108860 = -67108864 + 4. +67108859 = 67108864 - 5. +-67108859 = -67108864 + 5. +67108858 = 67108864 - 6. +-67108858 = -67108864 + 6. +67108867 = 67108865 - (-2). +-67108867 = -67108865 + (-2). +67108866 = 67108865 - (-1). +-67108866 = -67108865 + (-1). +67108865 = 67108865 - 0. +-67108865 = -67108865 + 0. +67108864 = 67108865 - 1. +-67108864 = -67108865 + 1. +67108863 = 67108865 - 2. +-67108863 = -67108865 + 2. +67108862 = 67108865 - 3. +-67108862 = -67108865 + 3. +67108861 = 67108865 - 4. +-67108861 = -67108865 + 4. +67108860 = 67108865 - 5. +-67108860 = -67108865 + 5. +67108859 = 67108865 - 6. +-67108859 = -67108865 + 6. +67108868 = 67108866 - (-2). +-67108868 = -67108866 + (-2). +67108867 = 67108866 - (-1). +-67108867 = -67108866 + (-1). +67108866 = 67108866 - 0. +-67108866 = -67108866 + 0. +67108865 = 67108866 - 1. +-67108865 = -67108866 + 1. +67108864 = 67108866 - 2. +-67108864 = -67108866 + 2. +67108863 = 67108866 - 3. +-67108863 = -67108866 + 3. +67108862 = 67108866 - 4. +-67108862 = -67108866 + 4. +67108861 = 67108866 - 5. +-67108861 = -67108866 + 5. +67108860 = 67108866 - 6. +-67108860 = -67108866 + 6. +67108869 = 67108867 - (-2). +-67108869 = -67108867 + (-2). +67108868 = 67108867 - (-1). +-67108868 = -67108867 + (-1). +67108867 = 67108867 - 0. +-67108867 = -67108867 + 0. +67108866 = 67108867 - 1. +-67108866 = -67108867 + 1. +67108865 = 67108867 - 2. +-67108865 = -67108867 + 2. +67108864 = 67108867 - 3. +-67108864 = -67108867 + 3. +67108863 = 67108867 - 4. +-67108863 = -67108867 + 4. +67108862 = 67108867 - 5. +-67108862 = -67108867 + 5. +67108861 = 67108867 - 6. +-67108861 = -67108867 + 6. +134217723 = 134217725 + (-2). +-134217729 = -134217731 - (-2). +134217724 = 134217725 + (-1). +-134217730 = -134217731 - (-1). +134217725 = 134217725 + 0. +-134217731 = -134217731 - 0. +134217726 = 134217725 + 1. +-134217732 = -134217731 - 1. +134217727 = 134217725 + 2. +-134217733 = -134217731 - 2. +134217728 = 134217725 + 3. +-134217734 = -134217731 - 3. +134217729 = 134217725 + 4. +-134217735 = -134217731 - 4. +134217730 = 134217725 + 5. +-134217736 = -134217731 - 5. +134217731 = 134217725 + 6. +-134217737 = -134217731 - 6. +134217724 = 134217726 + (-2). +-134217728 = -134217730 - (-2). +134217725 = 134217726 + (-1). +-134217729 = -134217730 - (-1). +134217726 = 134217726 + 0. +-134217730 = -134217730 - 0. +134217727 = 134217726 + 1. +-134217731 = -134217730 - 1. +134217728 = 134217726 + 2. +-134217732 = -134217730 - 2. +134217729 = 134217726 + 3. +-134217733 = -134217730 - 3. +134217730 = 134217726 + 4. +-134217734 = -134217730 - 4. +134217731 = 134217726 + 5. +-134217735 = -134217730 - 5. +134217732 = 134217726 + 6. +-134217736 = -134217730 - 6. +134217725 = 134217727 + (-2). +-134217727 = -134217729 - (-2). +134217726 = 134217727 + (-1). +-134217728 = -134217729 - (-1). +134217727 = 134217727 + 0. +-134217729 = -134217729 - 0. +134217728 = 134217727 + 1. +-134217730 = -134217729 - 1. +134217729 = 134217727 + 2. +-134217731 = -134217729 - 2. +134217730 = 134217727 + 3. +-134217732 = -134217729 - 3. +134217731 = 134217727 + 4. +-134217733 = -134217729 - 4. +134217732 = 134217727 + 5. +-134217734 = -134217729 - 5. +134217733 = 134217727 + 6. +-134217735 = -134217729 - 6. +134217726 = 134217728 + (-2). +-134217726 = -134217728 - (-2). +134217727 = 134217728 + (-1). +-134217727 = -134217728 - (-1). +134217728 = 134217728 + 0. +-134217728 = -134217728 - 0. +134217729 = 134217728 + 1. +-134217729 = -134217728 - 1. +134217730 = 134217728 + 2. +-134217730 = -134217728 - 2. +134217731 = 134217728 + 3. +-134217731 = -134217728 - 3. +134217732 = 134217728 + 4. +-134217732 = -134217728 - 4. +134217733 = 134217728 + 5. +-134217733 = -134217728 - 5. +134217734 = 134217728 + 6. +-134217734 = -134217728 - 6. +134217727 = 134217729 + (-2). +-134217725 = -134217727 - (-2). +134217728 = 134217729 + (-1). +-134217726 = -134217727 - (-1). +134217729 = 134217729 + 0. +-134217727 = -134217727 - 0. +134217730 = 134217729 + 1. +-134217728 = -134217727 - 1. +134217731 = 134217729 + 2. +-134217729 = -134217727 - 2. +134217732 = 134217729 + 3. +-134217730 = -134217727 - 3. +134217733 = 134217729 + 4. +-134217731 = -134217727 - 4. +134217734 = 134217729 + 5. +-134217732 = -134217727 - 5. +134217735 = 134217729 + 6. +-134217733 = -134217727 - 6. +134217728 = 134217730 + (-2). +-134217724 = -134217726 - (-2). +134217729 = 134217730 + (-1). +-134217725 = -134217726 - (-1). +134217730 = 134217730 + 0. +-134217726 = -134217726 - 0. +134217731 = 134217730 + 1. +-134217727 = -134217726 - 1. +134217732 = 134217730 + 2. +-134217728 = -134217726 - 2. +134217733 = 134217730 + 3. +-134217729 = -134217726 - 3. +134217734 = 134217730 + 4. +-134217730 = -134217726 - 4. +134217735 = 134217730 + 5. +-134217731 = -134217726 - 5. +134217736 = 134217730 + 6. +-134217732 = -134217726 - 6. +134217728 = 134217726 - (-2). +-134217728 = -134217726 + (-2). +134217727 = 134217726 - (-1). +-134217727 = -134217726 + (-1). +134217726 = 134217726 - 0. +-134217726 = -134217726 + 0. +134217725 = 134217726 - 1. +-134217725 = -134217726 + 1. +134217724 = 134217726 - 2. +-134217724 = -134217726 + 2. +134217723 = 134217726 - 3. +-134217723 = -134217726 + 3. +134217722 = 134217726 - 4. +-134217722 = -134217726 + 4. +134217721 = 134217726 - 5. +-134217721 = -134217726 + 5. +134217720 = 134217726 - 6. +-134217720 = -134217726 + 6. +134217729 = 134217727 - (-2). +-134217729 = -134217727 + (-2). +134217728 = 134217727 - (-1). +-134217728 = -134217727 + (-1). +134217727 = 134217727 - 0. +-134217727 = -134217727 + 0. +134217726 = 134217727 - 1. +-134217726 = -134217727 + 1. +134217725 = 134217727 - 2. +-134217725 = -134217727 + 2. +134217724 = 134217727 - 3. +-134217724 = -134217727 + 3. +134217723 = 134217727 - 4. +-134217723 = -134217727 + 4. +134217722 = 134217727 - 5. +-134217722 = -134217727 + 5. +134217721 = 134217727 - 6. +-134217721 = -134217727 + 6. +134217730 = 134217728 - (-2). +-134217730 = -134217728 + (-2). +134217729 = 134217728 - (-1). +-134217729 = -134217728 + (-1). +134217728 = 134217728 - 0. +-134217728 = -134217728 + 0. +134217727 = 134217728 - 1. +-134217727 = -134217728 + 1. +134217726 = 134217728 - 2. +-134217726 = -134217728 + 2. +134217725 = 134217728 - 3. +-134217725 = -134217728 + 3. +134217724 = 134217728 - 4. +-134217724 = -134217728 + 4. +134217723 = 134217728 - 5. +-134217723 = -134217728 + 5. +134217722 = 134217728 - 6. +-134217722 = -134217728 + 6. +134217731 = 134217729 - (-2). +-134217731 = -134217729 + (-2). +134217730 = 134217729 - (-1). +-134217730 = -134217729 + (-1). +134217729 = 134217729 - 0. +-134217729 = -134217729 + 0. +134217728 = 134217729 - 1. +-134217728 = -134217729 + 1. +134217727 = 134217729 - 2. +-134217727 = -134217729 + 2. +134217726 = 134217729 - 3. +-134217726 = -134217729 + 3. +134217725 = 134217729 - 4. +-134217725 = -134217729 + 4. +134217724 = 134217729 - 5. +-134217724 = -134217729 + 5. +134217723 = 134217729 - 6. +-134217723 = -134217729 + 6. +134217732 = 134217730 - (-2). +-134217732 = -134217730 + (-2). +134217731 = 134217730 - (-1). +-134217731 = -134217730 + (-1). +134217730 = 134217730 - 0. +-134217730 = -134217730 + 0. +134217729 = 134217730 - 1. +-134217729 = -134217730 + 1. +134217728 = 134217730 - 2. +-134217728 = -134217730 + 2. +134217727 = 134217730 - 3. +-134217727 = -134217730 + 3. +134217726 = 134217730 - 4. +-134217726 = -134217730 + 4. +134217725 = 134217730 - 5. +-134217725 = -134217730 + 5. +134217724 = 134217730 - 6. +-134217724 = -134217730 + 6. +134217733 = 134217731 - (-2). +-134217733 = -134217731 + (-2). +134217732 = 134217731 - (-1). +-134217732 = -134217731 + (-1). +134217731 = 134217731 - 0. +-134217731 = -134217731 + 0. +134217730 = 134217731 - 1. +-134217730 = -134217731 + 1. +134217729 = 134217731 - 2. +-134217729 = -134217731 + 2. +134217728 = 134217731 - 3. +-134217728 = -134217731 + 3. +134217727 = 134217731 - 4. +-134217727 = -134217731 + 4. +134217726 = 134217731 - 5. +-134217726 = -134217731 + 5. +134217725 = 134217731 - 6. +-134217725 = -134217731 + 6. +268435451 = 268435453 + (-2). +-268435457 = -268435459 - (-2). +268435452 = 268435453 + (-1). +-268435458 = -268435459 - (-1). +268435453 = 268435453 + 0. +-268435459 = -268435459 - 0. +268435454 = 268435453 + 1. +-268435460 = -268435459 - 1. +268435455 = 268435453 + 2. +-268435461 = -268435459 - 2. +268435456 = 268435453 + 3. +-268435462 = -268435459 - 3. +268435457 = 268435453 + 4. +-268435463 = -268435459 - 4. +268435458 = 268435453 + 5. +-268435464 = -268435459 - 5. +268435459 = 268435453 + 6. +-268435465 = -268435459 - 6. +268435452 = 268435454 + (-2). +-268435456 = -268435458 - (-2). +268435453 = 268435454 + (-1). +-268435457 = -268435458 - (-1). +268435454 = 268435454 + 0. +-268435458 = -268435458 - 0. +268435455 = 268435454 + 1. +-268435459 = -268435458 - 1. +268435456 = 268435454 + 2. +-268435460 = -268435458 - 2. +268435457 = 268435454 + 3. +-268435461 = -268435458 - 3. +268435458 = 268435454 + 4. +-268435462 = -268435458 - 4. +268435459 = 268435454 + 5. +-268435463 = -268435458 - 5. +268435460 = 268435454 + 6. +-268435464 = -268435458 - 6. +268435453 = 268435455 + (-2). +-268435455 = -268435457 - (-2). +268435454 = 268435455 + (-1). +-268435456 = -268435457 - (-1). +268435455 = 268435455 + 0. +-268435457 = -268435457 - 0. +268435456 = 268435455 + 1. +-268435458 = -268435457 - 1. +268435457 = 268435455 + 2. +-268435459 = -268435457 - 2. +268435458 = 268435455 + 3. +-268435460 = -268435457 - 3. +268435459 = 268435455 + 4. +-268435461 = -268435457 - 4. +268435460 = 268435455 + 5. +-268435462 = -268435457 - 5. +268435461 = 268435455 + 6. +-268435463 = -268435457 - 6. +268435454 = 268435456 + (-2). +-268435454 = -268435456 - (-2). +268435455 = 268435456 + (-1). +-268435455 = -268435456 - (-1). +268435456 = 268435456 + 0. +-268435456 = -268435456 - 0. +268435457 = 268435456 + 1. +-268435457 = -268435456 - 1. +268435458 = 268435456 + 2. +-268435458 = -268435456 - 2. +268435459 = 268435456 + 3. +-268435459 = -268435456 - 3. +268435460 = 268435456 + 4. +-268435460 = -268435456 - 4. +268435461 = 268435456 + 5. +-268435461 = -268435456 - 5. +268435462 = 268435456 + 6. +-268435462 = -268435456 - 6. +268435455 = 268435457 + (-2). +-268435453 = -268435455 - (-2). +268435456 = 268435457 + (-1). +-268435454 = -268435455 - (-1). +268435457 = 268435457 + 0. +-268435455 = -268435455 - 0. +268435458 = 268435457 + 1. +-268435456 = -268435455 - 1. +268435459 = 268435457 + 2. +-268435457 = -268435455 - 2. +268435460 = 268435457 + 3. +-268435458 = -268435455 - 3. +268435461 = 268435457 + 4. +-268435459 = -268435455 - 4. +268435462 = 268435457 + 5. +-268435460 = -268435455 - 5. +268435463 = 268435457 + 6. +-268435461 = -268435455 - 6. +268435456 = 268435458 + (-2). +-268435452 = -268435454 - (-2). +268435457 = 268435458 + (-1). +-268435453 = -268435454 - (-1). +268435458 = 268435458 + 0. +-268435454 = -268435454 - 0. +268435459 = 268435458 + 1. +-268435455 = -268435454 - 1. +268435460 = 268435458 + 2. +-268435456 = -268435454 - 2. +268435461 = 268435458 + 3. +-268435457 = -268435454 - 3. +268435462 = 268435458 + 4. +-268435458 = -268435454 - 4. +268435463 = 268435458 + 5. +-268435459 = -268435454 - 5. +268435464 = 268435458 + 6. +-268435460 = -268435454 - 6. +268435456 = 268435454 - (-2). +-268435456 = -268435454 + (-2). +268435455 = 268435454 - (-1). +-268435455 = -268435454 + (-1). +268435454 = 268435454 - 0. +-268435454 = -268435454 + 0. +268435453 = 268435454 - 1. +-268435453 = -268435454 + 1. +268435452 = 268435454 - 2. +-268435452 = -268435454 + 2. +268435451 = 268435454 - 3. +-268435451 = -268435454 + 3. +268435450 = 268435454 - 4. +-268435450 = -268435454 + 4. +268435449 = 268435454 - 5. +-268435449 = -268435454 + 5. +268435448 = 268435454 - 6. +-268435448 = -268435454 + 6. +268435457 = 268435455 - (-2). +-268435457 = -268435455 + (-2). +268435456 = 268435455 - (-1). +-268435456 = -268435455 + (-1). +268435455 = 268435455 - 0. +-268435455 = -268435455 + 0. +268435454 = 268435455 - 1. +-268435454 = -268435455 + 1. +268435453 = 268435455 - 2. +-268435453 = -268435455 + 2. +268435452 = 268435455 - 3. +-268435452 = -268435455 + 3. +268435451 = 268435455 - 4. +-268435451 = -268435455 + 4. +268435450 = 268435455 - 5. +-268435450 = -268435455 + 5. +268435449 = 268435455 - 6. +-268435449 = -268435455 + 6. +268435458 = 268435456 - (-2). +-268435458 = -268435456 + (-2). +268435457 = 268435456 - (-1). +-268435457 = -268435456 + (-1). +268435456 = 268435456 - 0. +-268435456 = -268435456 + 0. +268435455 = 268435456 - 1. +-268435455 = -268435456 + 1. +268435454 = 268435456 - 2. +-268435454 = -268435456 + 2. +268435453 = 268435456 - 3. +-268435453 = -268435456 + 3. +268435452 = 268435456 - 4. +-268435452 = -268435456 + 4. +268435451 = 268435456 - 5. +-268435451 = -268435456 + 5. +268435450 = 268435456 - 6. +-268435450 = -268435456 + 6. +268435459 = 268435457 - (-2). +-268435459 = -268435457 + (-2). +268435458 = 268435457 - (-1). +-268435458 = -268435457 + (-1). +268435457 = 268435457 - 0. +-268435457 = -268435457 + 0. +268435456 = 268435457 - 1. +-268435456 = -268435457 + 1. +268435455 = 268435457 - 2. +-268435455 = -268435457 + 2. +268435454 = 268435457 - 3. +-268435454 = -268435457 + 3. +268435453 = 268435457 - 4. +-268435453 = -268435457 + 4. +268435452 = 268435457 - 5. +-268435452 = -268435457 + 5. +268435451 = 268435457 - 6. +-268435451 = -268435457 + 6. +268435460 = 268435458 - (-2). +-268435460 = -268435458 + (-2). +268435459 = 268435458 - (-1). +-268435459 = -268435458 + (-1). +268435458 = 268435458 - 0. +-268435458 = -268435458 + 0. +268435457 = 268435458 - 1. +-268435457 = -268435458 + 1. +268435456 = 268435458 - 2. +-268435456 = -268435458 + 2. +268435455 = 268435458 - 3. +-268435455 = -268435458 + 3. +268435454 = 268435458 - 4. +-268435454 = -268435458 + 4. +268435453 = 268435458 - 5. +-268435453 = -268435458 + 5. +268435452 = 268435458 - 6. +-268435452 = -268435458 + 6. +268435461 = 268435459 - (-2). +-268435461 = -268435459 + (-2). +268435460 = 268435459 - (-1). +-268435460 = -268435459 + (-1). +268435459 = 268435459 - 0. +-268435459 = -268435459 + 0. +268435458 = 268435459 - 1. +-268435458 = -268435459 + 1. +268435457 = 268435459 - 2. +-268435457 = -268435459 + 2. +268435456 = 268435459 - 3. +-268435456 = -268435459 + 3. +268435455 = 268435459 - 4. +-268435455 = -268435459 + 4. +268435454 = 268435459 - 5. +-268435454 = -268435459 + 5. +268435453 = 268435459 - 6. +-268435453 = -268435459 + 6. +536870907 = 536870909 + (-2). +-536870913 = -536870915 - (-2). +536870908 = 536870909 + (-1). +-536870914 = -536870915 - (-1). +536870909 = 536870909 + 0. +-536870915 = -536870915 - 0. +536870910 = 536870909 + 1. +-536870916 = -536870915 - 1. +536870911 = 536870909 + 2. +-536870917 = -536870915 - 2. +536870912 = 536870909 + 3. +-536870918 = -536870915 - 3. +536870913 = 536870909 + 4. +-536870919 = -536870915 - 4. +536870914 = 536870909 + 5. +-536870920 = -536870915 - 5. +536870915 = 536870909 + 6. +-536870921 = -536870915 - 6. +536870908 = 536870910 + (-2). +-536870912 = -536870914 - (-2). +536870909 = 536870910 + (-1). +-536870913 = -536870914 - (-1). +536870910 = 536870910 + 0. +-536870914 = -536870914 - 0. +536870911 = 536870910 + 1. +-536870915 = -536870914 - 1. +536870912 = 536870910 + 2. +-536870916 = -536870914 - 2. +536870913 = 536870910 + 3. +-536870917 = -536870914 - 3. +536870914 = 536870910 + 4. +-536870918 = -536870914 - 4. +536870915 = 536870910 + 5. +-536870919 = -536870914 - 5. +536870916 = 536870910 + 6. +-536870920 = -536870914 - 6. +536870909 = 536870911 + (-2). +-536870911 = -536870913 - (-2). +536870910 = 536870911 + (-1). +-536870912 = -536870913 - (-1). +536870911 = 536870911 + 0. +-536870913 = -536870913 - 0. +536870912 = 536870911 + 1. +-536870914 = -536870913 - 1. +536870913 = 536870911 + 2. +-536870915 = -536870913 - 2. +536870914 = 536870911 + 3. +-536870916 = -536870913 - 3. +536870915 = 536870911 + 4. +-536870917 = -536870913 - 4. +536870916 = 536870911 + 5. +-536870918 = -536870913 - 5. +536870917 = 536870911 + 6. +-536870919 = -536870913 - 6. +536870910 = 536870912 + (-2). +-536870910 = -536870912 - (-2). +536870911 = 536870912 + (-1). +-536870911 = -536870912 - (-1). +536870912 = 536870912 + 0. +-536870912 = -536870912 - 0. +536870913 = 536870912 + 1. +-536870913 = -536870912 - 1. +536870914 = 536870912 + 2. +-536870914 = -536870912 - 2. +536870915 = 536870912 + 3. +-536870915 = -536870912 - 3. +536870916 = 536870912 + 4. +-536870916 = -536870912 - 4. +536870917 = 536870912 + 5. +-536870917 = -536870912 - 5. +536870918 = 536870912 + 6. +-536870918 = -536870912 - 6. +536870911 = 536870913 + (-2). +-536870909 = -536870911 - (-2). +536870912 = 536870913 + (-1). +-536870910 = -536870911 - (-1). +536870913 = 536870913 + 0. +-536870911 = -536870911 - 0. +536870914 = 536870913 + 1. +-536870912 = -536870911 - 1. +536870915 = 536870913 + 2. +-536870913 = -536870911 - 2. +536870916 = 536870913 + 3. +-536870914 = -536870911 - 3. +536870917 = 536870913 + 4. +-536870915 = -536870911 - 4. +536870918 = 536870913 + 5. +-536870916 = -536870911 - 5. +536870919 = 536870913 + 6. +-536870917 = -536870911 - 6. +536870912 = 536870914 + (-2). +-536870908 = -536870910 - (-2). +536870913 = 536870914 + (-1). +-536870909 = -536870910 - (-1). +536870914 = 536870914 + 0. +-536870910 = -536870910 - 0. +536870915 = 536870914 + 1. +-536870911 = -536870910 - 1. +536870916 = 536870914 + 2. +-536870912 = -536870910 - 2. +536870917 = 536870914 + 3. +-536870913 = -536870910 - 3. +536870918 = 536870914 + 4. +-536870914 = -536870910 - 4. +536870919 = 536870914 + 5. +-536870915 = -536870910 - 5. +536870920 = 536870914 + 6. +-536870916 = -536870910 - 6. +536870912 = 536870910 - (-2). +-536870912 = -536870910 + (-2). +536870911 = 536870910 - (-1). +-536870911 = -536870910 + (-1). +536870910 = 536870910 - 0. +-536870910 = -536870910 + 0. +536870909 = 536870910 - 1. +-536870909 = -536870910 + 1. +536870908 = 536870910 - 2. +-536870908 = -536870910 + 2. +536870907 = 536870910 - 3. +-536870907 = -536870910 + 3. +536870906 = 536870910 - 4. +-536870906 = -536870910 + 4. +536870905 = 536870910 - 5. +-536870905 = -536870910 + 5. +536870904 = 536870910 - 6. +-536870904 = -536870910 + 6. +536870913 = 536870911 - (-2). +-536870913 = -536870911 + (-2). +536870912 = 536870911 - (-1). +-536870912 = -536870911 + (-1). +536870911 = 536870911 - 0. +-536870911 = -536870911 + 0. +536870910 = 536870911 - 1. +-536870910 = -536870911 + 1. +536870909 = 536870911 - 2. +-536870909 = -536870911 + 2. +536870908 = 536870911 - 3. +-536870908 = -536870911 + 3. +536870907 = 536870911 - 4. +-536870907 = -536870911 + 4. +536870906 = 536870911 - 5. +-536870906 = -536870911 + 5. +536870905 = 536870911 - 6. +-536870905 = -536870911 + 6. +536870914 = 536870912 - (-2). +-536870914 = -536870912 + (-2). +536870913 = 536870912 - (-1). +-536870913 = -536870912 + (-1). +536870912 = 536870912 - 0. +-536870912 = -536870912 + 0. +536870911 = 536870912 - 1. +-536870911 = -536870912 + 1. +536870910 = 536870912 - 2. +-536870910 = -536870912 + 2. +536870909 = 536870912 - 3. +-536870909 = -536870912 + 3. +536870908 = 536870912 - 4. +-536870908 = -536870912 + 4. +536870907 = 536870912 - 5. +-536870907 = -536870912 + 5. +536870906 = 536870912 - 6. +-536870906 = -536870912 + 6. +536870915 = 536870913 - (-2). +-536870915 = -536870913 + (-2). +536870914 = 536870913 - (-1). +-536870914 = -536870913 + (-1). +536870913 = 536870913 - 0. +-536870913 = -536870913 + 0. +536870912 = 536870913 - 1. +-536870912 = -536870913 + 1. +536870911 = 536870913 - 2. +-536870911 = -536870913 + 2. +536870910 = 536870913 - 3. +-536870910 = -536870913 + 3. +536870909 = 536870913 - 4. +-536870909 = -536870913 + 4. +536870908 = 536870913 - 5. +-536870908 = -536870913 + 5. +536870907 = 536870913 - 6. +-536870907 = -536870913 + 6. +536870916 = 536870914 - (-2). +-536870916 = -536870914 + (-2). +536870915 = 536870914 - (-1). +-536870915 = -536870914 + (-1). +536870914 = 536870914 - 0. +-536870914 = -536870914 + 0. +536870913 = 536870914 - 1. +-536870913 = -536870914 + 1. +536870912 = 536870914 - 2. +-536870912 = -536870914 + 2. +536870911 = 536870914 - 3. +-536870911 = -536870914 + 3. +536870910 = 536870914 - 4. +-536870910 = -536870914 + 4. +536870909 = 536870914 - 5. +-536870909 = -536870914 + 5. +536870908 = 536870914 - 6. +-536870908 = -536870914 + 6. +536870917 = 536870915 - (-2). +-536870917 = -536870915 + (-2). +536870916 = 536870915 - (-1). +-536870916 = -536870915 + (-1). +536870915 = 536870915 - 0. +-536870915 = -536870915 + 0. +536870914 = 536870915 - 1. +-536870914 = -536870915 + 1. +536870913 = 536870915 - 2. +-536870913 = -536870915 + 2. +536870912 = 536870915 - 3. +-536870912 = -536870915 + 3. +536870911 = 536870915 - 4. +-536870911 = -536870915 + 4. +536870910 = 536870915 - 5. +-536870910 = -536870915 + 5. +536870909 = 536870915 - 6. +-536870909 = -536870915 + 6. + +%% Thanks to Mikael Pettersson. Most negative fixnum (for 32/64 bits architecture). +16#8000000 = -16#8000000 div (-1). +16#8000000 = -16#8000000 * (-1). +16#8000000 = 0 - (-16#8000000). +16#800000000000000 = -16#800000000000000 div (-1). +16#800000000000000 = -16#800000000000000 * (-1). +16#800000000000000 = 0 - (-16#800000000000000). + +%% The absolute valute of the most negative fixnum used in all combinations. +1 = -16#8000000 div (-16#8000000). +1 = 16#8000000 div 16#8000000. +-1 = -16#8000000 div 16#8000000. +-1 = 16#8000000 div (-16#8000000). +1 = -16#800000000000000 div (-16#800000000000000). +1 = 16#800000000000000 div 16#800000000000000. +-1 = -16#800000000000000 div 16#800000000000000. +-1 = 16#800000000000000 div (-16#800000000000000). +0 = -16#8000000 rem (-16#8000000). +0 = 16#8000000 rem 16#8000000. +0 = -16#8000000 rem 16#8000000. +0 = 16#8000000 rem (-16#8000000). +0 = -16#800000000000000 rem (-16#800000000000000). +0 = 16#800000000000000 rem 16#800000000000000. +0 = -16#800000000000000 rem 16#800000000000000. +0 = 16#800000000000000 rem (-16#800000000000000). + +%% More border values regarding rem... +-16#8000000 = -16#8000000 rem (-16#8000001). +-16#8000000 = -16#8000000 rem 16#8000001. +1 = 16#8000001 rem (-16#8000000). +-16#800000000000000 = -16#800000000000000 rem (-16#800000000000001). +-16#800000000000000 = -16#800000000000000 rem 16#800000000000001. +1 = 16#800000000000001 rem (-16#800000000000000). +0 = 16#FFFFFFFFFFFFFFF800000000 rem 16#FFFFFFFFFFFFFFF80. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/eq_28.dat erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/eq_28.dat --- erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/eq_28.dat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/eq_28.dat 1997-11-09 23:02:59.000000000 +0000 @@ -0,0 +1,3000 @@ +2639222 = -30710410 band 11032439. +-22317193 = -30710410 bor 11032439. +-24956415 = -30710410 bxor 11032439. +72453188 = -10637340 band 80972877. +-2117651 = -10637340 bor 80972877. +-74570839 = -10637340 bxor 80972877. +54550530 = 56648450 band 62977043. +65074963 = 56648450 bor 62977043. +10524433 = 56648450 bxor 62977043. +-133062592 = -46668208 band -86400951. +-6567 = -46668208 bor -86400951. +133056025 = -46668208 bxor -86400951. +11840590 = -17453746 band 29146735. +-147601 = -17453746 bor 29146735. +-11988191 = -17453746 bxor 29146735. +1052676 = -130214020 band 85129221. +-46137475 = -130214020 bor 85129221. +-47190151 = -130214020 bxor 85129221. +-117420022 = -108834726 band -16723317. +-8138021 = -108834726 bor -16723317. +109282001 = -108834726 bxor -16723317. +33558272 = 100806504 band -70250623. +-3002391 = 100806504 bor -70250623. +-36560663 = 100806504 bxor -70250623. +50333734 = -82438106 band 120065127. +-12706713 = -82438106 bor 120065127. +-63040447 = -82438106 bxor 120065127. +7078420 = -25241068 band 32318141. +-1347 = -25241068 bor 32318141. +-7079767 = -25241068 bxor 32318141. +-124059646 = -38039374 band -90241021. +-4220749 = -38039374 bor -90241021. +119838897 = -38039374 bxor -90241021. +21496192 = -8813696 band 30289337. +-20551 = -8813696 bor 30289337. +-21516743 = -8813696 bxor 30289337. +-134217378 = -53606914 band -100654753. +-20044289 = -53606914 bor -100654753. +114173089 = -53606914 bxor -100654753. +-99466204 = -88909908 band -31789963. +-21233667 = -88909908 bor -31789963. +78232537 = -88909908 bxor -31789963. +-117439478 = -50297846 band -80776069. +-13634437 = -50297846 bor -80776069. +103805041 = -50297846 bxor -80776069. +34620048 = -86752616 band 37411569. +-83961095 = -86752616 bor 37411569. +-118581143 = -86752616 bxor 37411569. +2282582 = -114633002 band 70704471. +-46211113 = -114633002 bor 70704471. +-48493695 = -114633002 bxor 70704471. +-99602428 = -82382780 band -24038099. +-6818451 = -82382780 bor -24038099. +92783977 = -82382780 bxor -24038099. +130122338 = -2782622 band 132249587. +-655373 = -2782622 bor 132249587. +-130777711 = -2782622 bxor 132249587. +-63912928 = -38482768 band -59181271. +-33751111 = -38482768 bor -59181271. +30161817 = -38482768 bxor -59181271. +8206 = -41555282 band 1712207. +-39851281 = -41555282 bor 1712207. +-39859487 = -41555282 bxor 1712207. +67109060 = -49151012 band 100719845. +-15540227 = -49151012 bor 100719845. +-82649287 = -49151012 bxor 100719845. +33686058 = -3537990 band 33714795. +-3509253 = -3537990 bor 33714795. +-37195311 = -3537990 bxor 33714795. +18939968 = 61440456 band -43556255. +-1055767 = 61440456 bor -43556255. +-19995735 = 61440456 bxor -43556255. +83918854 = -50028154 band 131320391. +-2626617 = -50028154 bor 131320391. +-86545471 = -50028154 bxor 131320391. +1098260 = 112783988 band 5686173. +117371901 = 112783988 bor 5686173. +116273641 = 112783988 bxor 5686173. +-59228158 = -50769902 band -59194397. +-50736141 = -50769902 bor -59194397. +8492017 = -50769902 bxor -59194397. +44089472 = -5455392 band 48299161. +-1245703 = -5455392 bor 48299161. +-45335175 = -5455392 bxor 48299161. +67640094 = -31958178 band 82426687. +-17171585 = -31958178 bor 82426687. +-84811679 = -31958178 bxor 82426687. +526340 = 4987916 band -29636267. +-25174691 = 4987916 bor -29636267. +-25701031 = 4987916 bxor -29636267. +50908234 = 59428714 band 55102555. +63623035 = 59428714 bor 55102555. +12714801 = 59428714 bxor 55102555. +-47930160 = -39523080 band -12802607. +-4395527 = -39523080 bor -12802607. +43534633 = -39523080 bxor -12802607. +129781814 = 134117430 band -4336841. +-1225 = 134117430 bor -4336841. +-129783039 = 134117430 bxor -4336841. +9748484 = -38281052 band 9752077. +-38277459 = -38281052 bor 9752077. +-48025943 = -38281052 bxor 9752077. +17850818 = 20046274 band 51538899. +53734355 = 20046274 bor 51538899. +35883537 = 20046274 bxor 51538899. +12853760 = 65299216 band -53658103. +-1212647 = 65299216 bor -53658103. +-14066407 = 65299216 bxor -53658103. +20494 = 4216846 band -15863249. +-11666897 = 4216846 bor -15863249. +-11687391 = 4216846 bxor -15863249. +40964 = -132865988 band 67285445. +-65621507 = -132865988 bor 67285445. +-65662471 = -132865988 bxor 67285445. +8487434 = -89266406 band 9536075. +-88217765 = -89266406 bor 9536075. +-96705199 = -89266406 bxor 9536075. +2196480 = 78218280 band 23176513. +99198313 = 78218280 bor 23176513. +97001833 = 78218280 bxor 23176513. +3364902 = -130852122 band 125040679. +-9176345 = -130852122 bor 125040679. +-12541247 = -130852122 bxor 125040679. +69341268 = 119978708 band -60664707. +-10027267 = 119978708 bor -60664707. +-79368535 = 119978708 bxor -60664707. +536386 = 21643122 band 1961923. +23068659 = 21643122 bor 1961923. +22532273 = 21643122 bxor 1961923. +25473088 = -6377408 band 29670265. +-2180231 = -6377408 bor 29670265. +-27653319 = -6377408 bxor 29670265. +-94322658 = -92741442 band -85605089. +-84023873 = -92741442 bor -85605089. +10298785 = -92741442 bxor -85605089. +5017636 = -86077332 band 5019189. +-86075779 = -86077332 bor 5019189. +-91093415 = -86077332 bxor 5019189. +-133562358 = -128038198 band -47475653. +-41951493 = -128038198 bor -47475653. +91610865 = -128038198 bxor -47475653. +18366480 = 56248152 band 87908529. +125790201 = 56248152 bor 87908529. +107423721 = 56248152 bxor 87908529. +-130807530 = -125941354 band -130729705. +-125863529 = -125941354 bor -130729705. +4944001 = -125941354 bxor -130729705. +76546052 = 81297668 band 76961517. +81713133 = 81297668 bor 76961517. +5167081 = 81297668 bxor 76961517. +13125922 = -87201502 band 30035891. +-70291533 = -87201502 bor 30035891. +-83417455 = -87201502 bxor 30035891. +-133291936 = -18962064 band -116493079. +-2163207 = -18962064 bor -116493079. +131128729 = -18962064 bxor -116493079. +43004942 = 134018414 band -91212785. +-199313 = 134018414 bor -91212785. +-43204255 = 134018414 bxor -91212785. +30434436 = 31255708 band 131102373. +131923645 = 31255708 bor 131102373. +101489209 = 31255708 bxor 131102373. +393770 = 8845946 band -31063509. +-22611333 = 8845946 bor -31063509. +-23005103 = 8845946 bxor -31063509. +51515392 = 52049544 band 66508833. +67042985 = 52049544 bor 66508833. +15527593 = 52049544 bxor 66508833. +1030 = 8012870 band -117402105. +-109390265 = 8012870 bor -117402105. +-109391295 = 8012870 bxor -117402105. +20975892 = 56636212 band -37235363. +-1575043 = 56636212 bor -37235363. +-22550935 = 56636212 bxor -37235363. +395906 = 67526354 band 428963. +67559411 = 67526354 bor 428963. +67163505 = 67526354 bxor 428963. +2181632 = 73879200 band -105813415. +-34115847 = 73879200 bor -105813415. +-36297479 = 73879200 bxor -105813415. +12850718 = -121137634 band 99368703. +-34619649 = -121137634 bor 99368703. +-47470367 = -121137634 bxor 99368703. +-117436412 = -117263156 band -83537131. +-83363875 = -117263156 bor -83537131. +34072537 = -117263156 bxor -83537131. +37929994 = 131266090 band -95433701. +-2097605 = 131266090 bor -95433701. +-40027599 = 131266090 bxor -95433701. +-66846320 = -66301512 band -25883759. +-25338951 = -66301512 bor -25883759. +41507369 = -66301512 bxor -25883759. +75500278 = 75647734 band -23785737. +-23638281 = 75647734 bor -23785737. +-99138559 = 75647734 bxor -23785737. +49476 = -99561116 band 5099469. +-94511123 = -99561116 bor 5099469. +-94560599 = -99561116 bxor 5099469. +-67100542 = -67100542 band -58612845. +-58612845 = -67100542 bor -58612845. +8487697 = -67100542 bxor -58612845. +-131032128 = -105144368 band -93021239. +-67133479 = -105144368 bor -93021239. +63898649 = -105144368 bxor -93021239. +9486542 = 26460878 band -90642961. +-73668625 = 26460878 bor -90642961. +-83155167 = 26460878 bxor -90642961. +100804740 = -16586500 band 102902661. +-14488579 = -16586500 bor 102902661. +-115293319 = -16586500 bxor 102902661. +35991562 = 61685210 band -96996853. +-71303205 = 61685210 bor -96996853. +-107294767 = 61685210 bxor -96996853. +85104640 = 85170408 band -44107007. +-44041239 = 85170408 bor -44107007. +-129145879 = 85170408 bxor -44107007. +19988902 = 95509926 band -76438553. +-917529 = 95509926 bor -76438553. +-20906431 = 95509926 bxor -76438553. +-130203116 = -84059244 band -130070979. +-83927107 = -84059244 bor -130070979. +46276009 = -84059244 bxor -130070979. +41977346 = -91902414 band 44734339. +-89145421 = -91902414 bor 44734339. +-131122767 = -91902414 bxor 44734339. +18745600 = -14770944 band 31394105. +-2122439 = -14770944 bor 31394105. +-20868039 = -14770944 bxor 31394105. +-69982114 = -69436546 band -67819297. +-67273729 = -69436546 bor -67819297. +2708385 = -69436546 bxor -67819297. +17860900 = 89164076 band 18743285. +90046461 = 89164076 bor 18743285. +72185561 = 89164076 bxor 18743285. +-134196854 = -96415350 band -131238917. +-93457413 = -96415350 bor -131238917. +40739441 = -96415350 bxor -131238917. +18023440 = 64162840 band 18589297. +64728697 = 64162840 bor 18589297. +46705257 = 64162840 bxor 18589297. +29381718 = 31620182 band -2796329. +-557865 = 31620182 bor -2796329. +-29939583 = 31620182 bxor -2796329. +7344260 = 49861060 band 91437229. +133954029 = 49861060 bor 91437229. +126609769 = 49861060 bxor 91437229. +2099042 = 2230242 band 129001331. +129132531 = 2230242 bor 129001331. +127033489 = 2230242 bxor 129001331. +34800160 = -74234320 band 104313513. +-4720967 = -74234320 bor 104313513. +-39521127 = -74234320 bxor 104313513. +16777230 = 98353198 band 52430799. +134006767 = 98353198 bor 52430799. +117229537 = 98353198 bxor 52430799. +954436 = 2004316 band -5255067. +-4205187 = 2004316 bor -5255067. +-5159623 = 2004316 bxor -5255067. +3674410 = 41464122 band 4149739. +41939451 = 41464122 bor 4149739. +38265041 = 41464122 bxor 4149739. +8390976 = -55727288 band 30543329. +-33574935 = -55727288 bor 30543329. +-41965911 = -55727288 bxor 30543329. +28320006 = 61908742 band -104914489. +-71325753 = 61908742 bor -104914489. +-99645759 = 61908742 bxor -104914489. +-109042924 = -107596812 band -75454691. +-74008579 = -107596812 bor -75454691. +35034345 = -107596812 bxor -75454691. +33554690 = 102772114 band -92138653. +-22921229 = 102772114 bor -92138653. +-56475919 = 102772114 bxor -92138653. +-58419200 = -52651168 band -41576423. +-35808391 = -52651168 bor -41576423. +22610809 = -52651168 bxor -41576423. +42500254 = 42963166 band -17268033. +-16805121 = 42963166 bor -17268033. +-59305375 = 42963166 bxor -17268033. +4197508 = 106958220 band 21929173. +124689885 = 106958220 bor 21929173. +120492377 = 106958220 bxor 21929173. +3967178 = 67099882 band 3967963. +67100667 = 67099882 bor 3967963. +63133489 = 67099882 bxor 3967963. +37761104 = 46560888 band -9883311. +-1083527 = 46560888 bor -9883311. +-38844631 = 46560888 bxor -9883311. +6686902 = 41344438 band 82709175. +117366711 = 41344438 bor 82709175. +110679809 = 41344438 bxor 82709175. +19431428 = 19431972 band 29266317. +29266861 = 19431972 bor 29266317. +9835433 = 19431972 bxor 29266317. +42605378 = -24436926 band 63871827. +-3170477 = -24436926 bor 63871827. +-45775855 = -24436926 bxor 63871827. +84777088 = 125672592 band -40912503. +-16999 = 125672592 bor -40912503. +-84794087 = 125672592 bxor -40912503. +887182 = -105910898 band 69048751. +-37749329 = -105910898 bor 69048751. +-38636511 = -105910898 bxor 69048751. +16867588 = 29880764 band 20014405. +33027581 = 29880764 bor 20014405. +16159993 = 29880764 bxor 20014405. +117440650 = 121722010 band 129245643. +133527003 = 121722010 bor 129245643. +16086353 = 121722010 bxor 129245643. +128 = -134189656 band 25694401. +-108495383 = -134189656 bor 25694401. +-108495511 = -134189656 bxor 25694401. +37748774 = 38805606 band -85913689. +-84856857 = 38805606 bor -85913689. +-122605631 = 38805606 bxor -85913689. +37925972 = 113425492 band 54786045. +130285565 = 113425492 bor 54786045. +92359593 = 113425492 bxor 54786045. +67427394 = 70114546 band 100990787. +103677939 = 70114546 bor 100990787. +36250545 = 70114546 bxor 100990787. +43581632 = 112806336 band -69396743. +-172039 = 112806336 bor -69396743. +-43753671 = 112806336 bxor -69396743. +78136350 = 129553982 band -51491681. +-74049 = 129553982 bor -51491681. +-78210399 = 129553982 bxor -51491681. +105447844 = -20364820 band 105851317. +-19961347 = -20364820 bor 105851317. +-125409191 = -20364820 bxor 105851317. +90181642 = 90708042 band 133501883. +134028283 = 90708042 bor 133501883. +43846641 = 90708042 bxor 133501883. +76840976 = -50425640 band 127249457. +-17159 = -50425640 bor 127249457. +-76858135 = -50425640 bxor 127249457. +1515542 = 68644630 band 47657111. +114786199 = 68644630 bor 47657111. +113270657 = 68644630 bxor 47657111. +36160004 = 37216900 band -18359699. +-17302803 = 37216900 bor -18359699. +-53462807 = 37216900 bxor -18359699. +-133159390 = -91003230 band -44810445. +-2654285 = -91003230 bor -44810445. +130505105 = -91003230 bxor -44810445. +-57630624 = -57498896 band -38490007. +-38358279 = -57498896 bor -38490007. +19272345 = -57498896 bxor -38490007. +-108983666 = -35304722 band -108422257. +-34743313 = -35304722 bor -108422257. +74240353 = -35304722 bxor -108422257. +1501700 = -57213412 band 56551973. +-2163139 = -57213412 bor 56551973. +-3664839 = -57213412 bxor 56551973. +926122 = -127981574 band 68051371. +-60856325 = -127981574 bor 68051371. +-61782447 = -127981574 bxor 68051371. +2162688 = 19128328 band -122092639. +-105126999 = 19128328 bor -122092639. +-107289687 = 19128328 bxor -122092639. +21449094 = 90687942 band 30371207. +99610055 = 90687942 bor 30371207. +78160961 = 90687942 bxor 30371207. +100675732 = 102429876 band 121714909. +123469053 = 102429876 bor 121714909. +22793321 = 102429876 bxor 121714909. +-33417214 = -33113006 band -5547229. +-5243021 = -33113006 bor -5547229. +28174193 = -33113006 bxor -5547229. +819200 = 30189600 band -132282919. +-102912519 = 30189600 bor -132282919. +-103731719 = 30189600 bxor -132282919. +33554974 = 36719518 band -3242369. +-77825 = 36719518 bor -3242369. +-33632799 = 36719518 bxor -3242369. +67380740 = -47962548 band 114796181. +-547107 = -47962548 bor 114796181. +-67927847 = -47962548 bxor 114796181. +12649354 = -86932566 band 13568923. +-86012997 = -86932566 bor 13568923. +-98662351 = -86932566 bxor 13568923. +43062032 = 43211576 band 64558865. +64708409 = 43211576 bor 64558865. +21646377 = 43211576 bxor 64558865. +8913014 = 10236022 band -91699593. +-90376585 = 10236022 bor -91699593. +-99289599 = 10236022 bxor -91699593. +44438084 = -4263196 band 44503885. +-4197395 = -4263196 bor 44503885. +-48635479 = -4263196 bxor 44503885. +9458178 = 59956738 band -54963437. +-4464877 = 59956738 bor -54963437. +-13923055 = 59956738 bxor -54963437. +97128768 = 99244368 band -2189495. +-73895 = 99244368 bor -2189495. +-97202663 = 99244368 bxor -2189495. +-78378930 = -11216818 band -77853329. +-10691217 = -11216818 bor -77853329. +67687713 = -11216818 bxor -77853329. +2103812 = 86227580 band -84910331. +-786563 = 86227580 bor -84910331. +-2890375 = 86227580 bxor -84910331. +131338 = -131454118 band 80089483. +-51495973 = -131454118 bor 80089483. +-51627311 = -131454118 bxor 80089483. +-32505344 = -30408088 band -6494591. +-4397335 = -30408088 bor -6494591. +28108009 = -30408088 bxor -6494591. +-58580186 = -53501146 band -41796761. +-36717721 = -53501146 bor -41796761. +21862465 = -53501146 bxor -41796761. +53496084 = 121036052 band -80713283. +-13173315 = 121036052 bor -80713283. +-66669399 = 121036052 bxor -80713283. +-117439742 = -117257294 band -34789629. +-34607181 = -117257294 bor -34789629. +82832561 = -117257294 bxor -34789629. +-114383744 = -13715840 band -109124423. +-8456519 = -13715840 bor -109124423. +105927225 = -13715840 bxor -109124423. +75575390 = 80605438 band -40816545. +-35786497 = 80605438 bor -40816545. +-111361887 = 80605438 bxor -40816545. +67113508 = -66536788 band 94376821. +-39273475 = -66536788 bor 94376821. +-106386983 = -66536788 bxor 94376821. +-134212854 = -57401590 band -129862789. +-53051525 = -57401590 bor -129862789. +81161329 = -57401590 bxor -129862789. +-100118128 = -6498920 band -93621775. +-2567 = -6498920 bor -93621775. +100115561 = -6498920 bxor -93621775. +-120061866 = -35839530 band -117781417. +-33559081 = -35839530 bor -117781417. +86502785 = -35839530 bxor -117781417. +-32231420 = -11160764 band -21742547. +-671891 = -11160764 bor -21742547. +31559529 = -11160764 bxor -21742547. +73499746 = 81888610 band 108386035. +116774899 = 81888610 bor 108386035. +43275153 = 81888610 bxor 108386035. +-133943776 = -90390608 band -112890327. +-69337159 = -90390608 bor -112890327. +64606617 = -90390608 bxor -112890327. +75793678 = 114726318 band -41095345. +-2162705 = 114726318 bor -41095345. +-77956383 = 114726318 bxor -41095345. +-133954876 = -66705700 band -123878427. +-56629251 = -66705700 bor -123878427. +77325625 = -66705700 bxor -123878427. +72486954 = 83517114 band 89338219. +100368379 = 83517114 bor 89338219. +27881425 = 83517114 bxor 89338219. +2658368 = 20763848 band -93603487. +-75498007 = 20763848 bor -93603487. +-78156375 = 20763848 bxor -93603487. +5318662 = 73378950 band -118392505. +-50332217 = 73378950 bor -118392505. +-55650879 = 73378950 bxor -118392505. +76021780 = 95319412 band -20346211. +-1048579 = 95319412 bor -20346211. +-77070359 = 95319412 bxor -20346211. +37880322 = 108661522 band 54682339. +125463539 = 108661522 bor 54682339. +87583217 = 108661522 bxor 54682339. +53555328 = -67668768 band 54080409. +-67143687 = -67668768 bor 54080409. +-120699015 = -67668768 bxor 54080409. +-131579362 = -26622370 band -131184065. +-26227073 = -26622370 bor -131184065. +105352289 = -26622370 bxor -131184065. +28676 = 34537228 band 23097429. +57605981 = 34537228 bor 23097429. +57577305 = 34537228 bxor 23097429. +117918282 = -16258454 band 130501467. +-3675269 = -16258454 bor 130501467. +-121593551 = -16258454 bxor 130501467. +-67060528 = -63766536 band -41632559. +-38338567 = -63766536 bor -41632559. +28721961 = -63766536 bxor -41632559. +86000182 = -38649034 band 119882295. +-4766921 = -38649034 bor 119882295. +-90767103 = -38649034 bxor 119882295. +8651012 = 43262884 band 13063437. +47675309 = 43262884 bor 13063437. +39024297 = 43262884 bxor 13063437. +16861378 = 98000066 band -83768621. +-2629933 = 98000066 bor -83768621. +-19491311 = 98000066 bxor -83768621. +-117369856 = -37628400 band -81709815. +-1968359 = -37628400 bor -81709815. +115401497 = -37628400 bxor -81709815. +270 = -113081586 band 1327407. +-111754449 = -113081586 bor 1327407. +-111754719 = -113081586 bxor 1327407. +-115998716 = -36289732 band -115402555. +-35693571 = -36289732 bor -115402555. +80305145 = -36289732 bxor -115402555. +-114966518 = -114834918 band -47333045. +-47201445 = -114834918 bor -47333045. +67765073 = -114834918 bxor -47333045. +-130001920 = -127772888 band -111313855. +-109084823 = -127772888 bor -111313855. +20917097 = -127772888 bxor -111313855. +50668838 = 66053606 band -82499801. +-67115033 = 66053606 bor -82499801. +-117783871 = 66053606 bxor -82499801. +-117401260 = -115753516 band -37446787. +-35799043 = -115753516 bor -37446787. +81602217 = -115753516 bxor -37446787. +33557058 = 63208050 band -31256893. +-1605901 = 63208050 bor -31256893. +-35162959 = 63208050 bxor -31256893. +287296 = 20898624 band 75788921. +96400249 = 20898624 bor 75788921. +96112953 = 20898624 bxor 75788921. +-107364322 = -103035970 band -39988193. +-35659841 = -103035970 bor -39988193. +71704481 = -103035970 bxor -39988193. +12628260 = 30339948 band 80788789. +98500477 = 30339948 bor 80788789. +85872217 = 30339948 bxor 80788789. +8683786 = 42264010 band 81105723. +114685947 = 42264010 bor 81105723. +106002161 = 42264010 bxor 81105723. +-129183216 = -59909544 band -77793359. +-8519687 = -59909544 bor -77793359. +120663529 = -59909544 bxor -77793359. +-134217706 = -34368362 band -100653033. +-803689 = -34368362 bor -100653033. +133414017 = -34368362 bxor -100653033. +34620420 = 118637572 band 43539949. +127557101 = 118637572 bor 43539949. +92936681 = 118637572 bxor 43539949. +12854306 = -104045534 band 114634419. +-2265421 = -104045534 bor 114634419. +-15119727 = -104045534 bxor 114634419. +35752032 = -26108816 band 44690409. +-17170439 = -26108816 bor 44690409. +-52922471 = -26108816 bxor 44690409. +106954766 = 124821614 band -18218225. +-351377 = 124821614 bor -18218225. +-107306143 = 124821614 bxor -18218225. +19664260 = 53219228 band 86793637. +120348605 = 53219228 bor 86793637. +100684345 = 53219228 bxor 86793637. +-83345110 = -83208838 band -3292885. +-3156613 = -83208838 bor -3292885. +80188497 = -83208838 bxor -3292885. +-123205376 = -38237816 band -123064543. +-38096983 = -38237816 bor -123064543. +85108393 = -38237816 bxor -123064543. +104875270 = -10989754 band 115688711. +-176313 = -10989754 bor 115688711. +-105051583 = -10989754 bxor 115688711. +84972564 = 84981300 band -2515875. +-2507139 = 84981300 bor -2515875. +-87479703 = 84981300 bxor -2515875. +-134084478 = -96855598 band -116970845. +-79741965 = -96855598 bor -116970845. +54342513 = -96855598 bxor -116970845. +1573120 = 69009824 band -124214951. +-56778247 = 69009824 bor -124214951. +-58351367 = 69009824 bxor -124214951. +97779998 = -33816290 band 131583487. +-12801 = -33816290 bor 131583487. +-97792799 = -33816290 bxor 131583487. +10523140 = -102721588 band 111737365. +-1507363 = -102721588 bor 111737365. +-12030503 = -102721588 bxor 111737365. +6357258 = 56824106 band 15026971. +65493819 = 56824106 bor 15026971. +59136561 = 56824106 bxor 15026971. +2367632 = 6644920 band -30661999. +-26384711 = 6644920 bor -30661999. +-28752343 = 6644920 bxor -30661999. +71158 = -126282250 band 42171895. +-84181513 = -126282250 bor 42171895. +-84252671 = -126282250 bxor 42171895. +4723780 = 107484260 band -102803763. +-43283 = 107484260 bor -102803763. +-4767063 = 107484260 bxor -102803763. +524930 = 1612674 band 40370835. +41458579 = 1612674 bor 40370835. +40933649 = 1612674 bxor 40370835. +17044160 = 130290384 band -115895607. +-2649383 = 130290384 bor -115895607. +-19693543 = 130290384 bxor -115895607. +33563854 = -29823538 band 33961199. +-29426193 = -29823538 bor 33961199. +-62990047 = -29823538 bxor 33961199. +1933956 = 10456060 band 25006725. +33528829 = 10456060 bor 25006725. +31594873 = 10456060 bxor 25006725. +-55963638 = -50718502 band -55889653. +-50644517 = -50718502 bor -55889653. +5319121 = -50718502 bxor -55889653. +82432 = 123169768 band 9032193. +132119529 = 123169768 bor 9032193. +132037097 = 123169768 bxor 9032193. +38846630 = 108062886 band -77999385. +-8783129 = 108062886 bor -77999385. +-47629759 = 108062886 bxor -77999385. +-134214636 = -114598252 band -121598659. +-101982275 = -114598252 bor -121598659. +32232361 = -114598252 bxor -121598659. +-98394110 = -13440718 band -93931901. +-8978509 = -13440718 bor -93931901. +89415601 = -13440718 bxor -93931901. +78233600 = 95014912 band 112050233. +128831545 = 95014912 bor 112050233. +50597945 = 95014912 bxor 112050233. +-58710434 = -39688578 band -53200929. +-34179073 = -39688578 bor -53200929. +24531361 = -39688578 bxor -53200929. +8463396 = 81521708 band -106879243. +-33820931 = 81521708 bor -106879243. +-42284327 = 81521708 bxor -106879243. +-110468982 = -101028726 band -110202117. +-100761861 = -101028726 bor -110202117. +9707121 = -101028726 bxor -110202117. +69213456 = 70360856 band -64340623. +-63193223 = 70360856 bor -64340623. +-132406679 = 70360856 bxor -64340623. +16925526 = 52086614 band -39369769. +-4208681 = 52086614 bor -39369769. +-21134207 = 52086614 bxor -39369769. +267396 = 103650500 band -128696403. +-25313299 = 103650500 bor -128696403. +-25580695 = 103650500 bxor -128696403. +1049186 = 68420322 band 36849267. +104220403 = 68420322 bor 36849267. +103171217 = 68420322 bxor 36849267. +8399136 = 13711664 band 60959145. +66271673 = 13711664 bor 60959145. +57872537 = 13711664 bxor 60959145. +73417230 = 108227374 band -43985201. +-9175057 = 108227374 bor -43985201. +-82592287 = 108227374 bxor -43985201. +113815620 = 113817692 band -20269211. +-20267139 = 113817692 bor -20269211. +-134082759 = 113817692 bxor -20269211. +-49414102 = -45151174 band -12709653. +-8446725 = -45151174 bor -12709653. +40967377 = -45151174 bxor -12709653. +85222464 = 123141704 band 87319777. +125239017 = 123141704 bor 87319777. +40016553 = 123141704 bxor 87319777. +16814086 = 85045766 band 57331911. +125563591 = 85045766 bor 57331911. +108749505 = 85045766 bxor 57331911. +75284 = 16889588 band -130978275. +-114163971 = 16889588 bor -130978275. +-114239255 = 16889588 bxor -130978275. +67149826 = 67561618 band 79278691. +79690483 = 67561618 bor 79278691. +12540657 = 67561618 bxor 79278691. +16338432 = 50155104 band 33279769. +67096441 = 50155104 bor 33279769. +50758009 = 50155104 bxor 33279769. +109187486 = 128383966 band -24440385. +-5243905 = 128383966 bor -24440385. +-114431391 = 128383966 bxor -24440385. +-128958332 = -111611764 band -59685931. +-42339363 = -111611764 bor -59685931. +86618969 = -111611764 bxor -59685931. +44040906 = -89982998 band 132713179. +-1310725 = -89982998 bor 132713179. +-45351631 = -89982998 bxor 132713179. +126486608 = -1406600 band 126830673. +-1062535 = -1406600 bor 126830673. +-127549143 = -1406600 bxor 126830673. +69216438 = -5199690 band 73628087. +-788041 = -5199690 bor 73628087. +-70004479 = -5199690 bxor 73628087. +61472772 = 133874980 band -72410995. +-8787 = 133874980 bor -72410995. +-61481559 = 133874980 bxor -72410995. +67279426 = -48850366 band 111934035. +-4195757 = -48850366 bor 111934035. +-71475183 = -48850366 bxor 111934035. +8454272 = -55505008 band 58830985. +-5128295 = -55505008 bor 58830985. +-13582567 = -55505008 bxor 58830985. +15730830 = 83368078 band 15853743. +83490991 = 83368078 bor 15853743. +67760161 = 83368078 bxor 15853743. +754692 = 37721276 band -104084411. +-67117827 = 37721276 bor -104084411. +-67872519 = 37721276 bxor -104084411. +106963082 = 107032474 band -16883509. +-16814117 = 107032474 bor -16883509. +-123777199 = 107032474 bxor -16883509. +46219392 = -70303576 band 115468225. +-1054743 = -70303576 bor 115468225. +-47274135 = -70303576 bxor 115468225. +34613798 = 51555174 band 101727911. +118669287 = 51555174 bor 101727911. +84055489 = 51555174 bxor 101727911. +2113108 = 69975892 band -102482179. +-34619395 = 69975892 bor -102482179. +-36732503 = 69975892 bxor -102482179. +101193282 = 101586930 band 108535363. +108929011 = 101586930 bor 108535363. +7735729 = 101586930 bxor 108535363. +19549376 = 86998208 band -105198087. +-37749255 = 86998208 bor -105198087. +-57298631 = 86998208 bxor -105198087. +48251166 = 115458366 band -84649057. +-17441857 = 115458366 bor -84649057. +-65693023 = 115458366 bxor -84649057. +-104791900 = -101735188 band -103722827. +-100666115 = -101735188 bor -103722827. +4125785 = -101735188 bxor -103722827. +25432586 = 95728458 band 30216891. +100512763 = 95728458 bor 30216891. +75080177 = 95728458 bxor 30216891. +109052688 = 128459736 band -23903439. +-4496391 = 128459736 bor -23903439. +-113549079 = 128459736 bxor -23903439. +-133162474 = -65881578 band -72343657. +-5062761 = -65881578 bor -72343657. +128099713 = -65881578 bxor -72343657. +-114843388 = -110647932 band -39329427. +-35133971 = -110647932 bor -39329427. +79709417 = -110647932 bxor -39329427. +-62390238 = -25665118 band -62054861. +-25329741 = -25665118 bor -62054861. +37060497 = -25665118 bxor -62054861. +6948192 = -92563984 band 99493737. +-18439 = -92563984 bor 99493737. +-6966631 = -92563984 bxor 99493737. +-124755826 = -90245650 band -122590577. +-88080401 = -90245650 bor -122590577. +36675425 = -90245650 bxor -122590577. +-82312956 = -73653988 band -80162523. +-71503555 = -73653988 bor -80162523. +10809401 = -73653988 bxor -80162523. +-33554262 = -24608006 band -10215253. +-1268997 = -24608006 bor -10215253. +32285265 = -24608006 bxor -10215253. +13111808 = -19385592 band 30038689. +-2458711 = -19385592 bor 30038689. +-15570519 = -19385592 bxor 30038689. +71439494 = 72078534 band 104995975. +105635015 = 72078534 bor 104995975. +34195521 = 72078534 bxor 104995975. +67139476 = 104953780 band 93388765. +131203069 = 104953780 bor 93388765. +64063593 = 104953780 bxor 93388765. +-100634110 = -23038126 band -98960861. +-21364877 = -23038126 bor -98960861. +79269233 = -23038126 bxor -98960861. +16783360 = 22567712 band -115163943. +-109379591 = 22567712 bor -115163943. +-126162951 = 22567712 bxor -115163943. +529438 = 36353694 band -66579073. +-30754817 = 36353694 bor -66579073. +-31284255 = 36353694 bxor -66579073. +3672324 = 87558476 band -126268011. +-42381859 = 87558476 bor -126268011. +-46054183 = 87558476 bxor -126268011. +8555146 = 126328490 band -124613989. +-6840645 = 126328490 bor -124613989. +-15395791 = 126328490 bxor -124613989. +-83743216 = -75338184 band -76665327. +-68260295 = -75338184 bor -76665327. +15482921 = -75338184 bxor -76665327. +12662 = 35191670 band 75838839. +111017847 = 35191670 bor 75838839. +111005185 = 35191670 bxor 75838839. +266308 = 67909092 band 66493005. +134135789 = 67909092 bor 66493005. +133869481 = 67909092 bxor 66493005. +58789890 = 126966018 band -74599917. +-6423789 = 126966018 bor -74599917. +-65213679 = 126966018 bxor -74599917. +67669056 = 88656976 band 69176905. +90164825 = 88656976 bor 69176905. +22495769 = 88656976 bxor 69176905. +67108942 = 71304014 band -57189265. +-52994193 = 71304014 bor -57189265. +-120103135 = 71304014 bxor -57189265. +121652228 = 125197692 band 130663941. +134209405 = 125197692 bor 130663941. +12557177 = 125197692 bxor 130663941. +-133890038 = -132315558 band -1617781. +-43301 = -132315558 bor -1617781. +133846737 = -132315558 bxor -1617781. +100766976 = 109696360 band -31081087. +-22151703 = 109696360 bor -31081087. +-122918679 = 109696360 bxor -31081087. +9447974 = -124441050 band 49834599. +-84054425 = -124441050 bor 49834599. +-93502399 = -124441050 bxor 49834599. +113942548 = 115007508 band -17846083. +-16781123 = 115007508 bor -17846083. +-130723671 = 115007508 bxor -17846083. +34997762 = 51775154 band 102188547. +118965939 = 51775154 bor 102188547. +83968177 = 51775154 bxor 102188547. +756096 = -124786304 band 124492729. +-1049671 = -124786304 bor 124492729. +-1805767 = -124786304 bxor 124492729. +68688734 = -61219842 band 129908575. +-1 = -61219842 bor 129908575. +-68688735 = -61219842 bxor 129908575. +16783396 = 97131948 band -81708427. +-1359875 = 97131948 bor -81708427. +-18143271 = 97131948 bxor -81708427. +-130993654 = -126633462 band -105811333. +-101451141 = -126633462 bor -105811333. +29542513 = -126633462 bxor -105811333. +68159632 = 126970008 band 72878321. +131688697 = 126970008 bor 72878321. +63529065 = 126970008 bxor 72878321. +60434518 = 127626454 band -69551273. +-2359337 = 127626454 bor -69551273. +-62793855 = 127626454 bxor -69551273. +16900 = -41912764 band 5456685. +-36472979 = -41912764 bor 5456685. +-36489879 = -41912764 bxor 5456685. +10584162 = 62488674 band -119163405. +-67258893 = 62488674 bor -119163405. +-77843055 = 62488674 bxor -119163405. +40992 = 70300336 band 55436585. +125695929 = 70300336 bor 55436585. +125654937 = 70300336 bxor 55436585. +9633806 = -88915794 band 10206799. +-88342801 = -88915794 bor 10206799. +-97976607 = -88915794 bxor 10206799. +2492612 = 107366876 band 3582693. +108456957 = 107366876 bor 3582693. +105964345 = 107366876 bxor 3582693. +24555562 = 24558010 band -67112853. +-67110405 = 24558010 bor -67112853. +-91665967 = 24558010 bxor -67112853. +2883648 = 83634120 band 2887777. +83638249 = 83634120 bor 2887777. +80754601 = 83634120 bxor 2887777. +50470918 = -70862970 band 120268871. +-1065017 = -70862970 bor 120268871. +-51535935 = -70862970 bxor 120268871. +25710612 = 26212468 band 95965597. +96467453 = 26212468 bor 95965597. +70756841 = 26212468 bxor 95965597. +79691778 = 80135698 band -51904029. +-51460109 = 80135698 bor -51904029. +-131151887 = 80135698 bxor -51904029. +130818688 = 133048288 band 130902681. +133132281 = 133048288 bor 130902681. +2313593 = 133048288 bxor 130902681. +397598 = 71774558 band 973119. +72350079 = 71774558 bor 973119. +71952481 = 71774558 bxor 973119. +66052 = 37609996 band 8460117. +46004061 = 37609996 bor 8460117. +45938009 = 37609996 bxor 8460117. +-58654646 = -53410454 band -22951333. +-17707141 = -53410454 bor -22951333. +40947505 = -53410454 bxor -22951333. +59249360 = 65868536 band -74918959. +-68299783 = 65868536 bor -74918959. +-127549143 = 65868536 bxor -74918959. +-98566090 = -26079690 band -89607881. +-17121481 = -26079690 bor -89607881. +81444609 = -26079690 bxor -89607881. +5522436 = 123496100 band 7724045. +125697709 = 123496100 bor 7724045. +120175273 = 123496100 bxor 7724045. +4719042 = -95889470 band 80554451. +-20054061 = -95889470 bor 80554451. +-24773103 = -95889470 bxor 80554451. +67584 = -95729392 band 78720009. +-17076967 = -95729392 bor 78720009. +-17144551 = -95729392 bxor 78720009. +9469966 = 47230478 band 79073327. +116833839 = 47230478 bor 79073327. +107363873 = 47230478 bxor 79073327. +16999940 = 84141628 band 20414405. +87556093 = 84141628 bor 20414405. +70556153 = 84141628 bxor 20414405. +2359306 = 82681114 band -81395637. +-1073829 = 82681114 bor -81395637. +-3433135 = 82681114 bxor -81395637. +-133889536 = -129553880 band -132820159. +-128484503 = -129553880 bor -132820159. +5405033 = -129553880 bxor -132820159. +26234918 = 95973606 band -103655897. +-33917209 = 95973606 bor -103655897. +-60152127 = 95973606 bxor -103655897. +94421076 = -34029356 band 94560893. +-33889539 = -34029356 bor 94560893. +-128310615 = -34029356 bxor 94560893. +16786754 = 17479026 band -50057789. +-49365517 = 17479026 bor -50057789. +-66152271 = 17479026 bxor -50057789. +-125829056 = -125102528 band -109041287. +-108314759 = -125102528 bor -109041287. +17514297 = -125102528 bxor -109041287. +12624414 = 80393918 band 49406751. +117176255 = 80393918 bor 49406751. +104551841 = 80393918 bxor 49406751. +16794660 = -47491476 band 55632949. +-8653187 = -47491476 bor 55632949. +-25447847 = -47491476 bxor 55632949. +80969738 = 83329226 band -52719045. +-50359557 = 83329226 bor -52719045. +-131329295 = 83329226 bxor -52719045. +69733392 = 78474584 band -13070671. +-4329479 = 78474584 bor -13070671. +-74062871 = 78474584 bxor -13070671. +73668374 = 74768278 band 99030807. +100130711 = 74768278 bor 99030807. +26462337 = 74768278 bxor 99030807. +-32504828 = -13105404 band -32086803. +-12687379 = -13105404 bor -32086803. +19817449 = -13105404 bxor -32086803. +-90960606 = -23634142 band -71561805. +-4235341 = -23634142 bor -71561805. +86725265 = -23634142 bxor -71561805. +75498080 = 112234352 band 92365545. +129101817 = 112234352 bor 92365545. +53603737 = 112234352 bxor 92365545. +72368654 = -42972306 band 81777167. +-33563793 = -42972306 bor 81777167. +-105932447 = -42972306 bxor 81777167. +58982532 = -68734308 band 58999973. +-68716867 = -68734308 bor 58999973. +-127699399 = -68734308 bxor 58999973. +13729834 = -119951238 band 13729835. +-119951237 = -119951238 bor 13729835. +-133681071 = -119951238 bxor 13729835. +33588224 = -92087160 band 35227169. +-90448215 = -92087160 bor 35227169. +-124036439 = -92087160 bxor 35227169. +-130002938 = -96314810 band -35261433. +-1573305 = -96314810 bor -35261433. +128429633 = -96314810 bxor -35261433. +103096596 = -5424844 band 107438941. +-1082499 = -5424844 bor 107438941. +-104179095 = -5424844 bxor 107438941. +2211970 = 20567250 band 14928291. +33283571 = 20567250 bor 14928291. +31071601 = 20567250 bxor 14928291. +121278464 = -8473440 band 129751129. +-775 = -8473440 bor 129751129. +-121279239 = -8473440 bxor 129751129. +1854494 = 79457310 band -94413569. +-16810753 = 79457310 bor -94413569. +-18665247 = 79457310 bxor -94413569. +532484 = 86670028 band -95903467. +-9765923 = 86670028 bor -95903467. +-10298407 = 86670028 bxor -95903467. +85329930 = -46191574 band 97962523. +-33558981 = -46191574 bor 97962523. +-118888911 = -46191574 bxor 97962523. +-108383856 = -102074440 band -107005551. +-100696135 = -102074440 bor -107005551. +7687721 = -102074440 bxor -107005551. +34201846 = 58450166 band -24253193. +-4873 = 58450166 bor -24253193. +-34206719 = 58450166 bxor -24253193. +-22522556 = -22325404 band -18031155. +-17834003 = -22325404 bor -18031155. +4688553 = -22325404 bxor -18031155. +103284866 = -190846 band 103440787. +-34925 = -190846 bor 103440787. +-103319791 = -190846 bxor 103440787. +74482112 = 75007440 band -17397303. +-16871975 = 75007440 bor -17397303. +-91354087 = 75007440 bxor -17397303. +17432782 = 124393678 band -116423697. +-9462801 = 124393678 bor -116423697. +-26895583 = 124393678 bxor -116423697. +-75487100 = -5755140 band -69928571. +-196611 = -5755140 bor -69928571. +75290489 = -5755140 bxor -69928571. +-65900534 = -7146534 band -59084789. +-330789 = -7146534 bor -59084789. +65569745 = -7146534 bxor -59084789. +4204544 = 29834984 band 108046593. +133677033 = 29834984 bor 108046593. +129472489 = 29834984 bxor 108046593. +1835430 = -113478746 band 39715303. +-75598873 = -113478746 bor 39715303. +-77434303 = -113478746 bxor 39715303. +33898516 = 105210260 band -71445443. +-133699 = 105210260 bor -71445443. +-34032215 = 105210260 bxor -71445443. +-89390078 = -89381838 band -16853629. +-16845389 = -89381838 bor -16853629. +72544689 = -89381838 bxor -16853629. +-106953984 = -35585280 band -105351367. +-33982663 = -35585280 bor -105351367. +72971321 = -35585280 bxor -105351367. +71581790 = 116674942 band -61913377. +-16820225 = 116674942 bor -61913377. +-88402015 = 116674942 bxor -61913377. +19748 = 80957228 band -132100619. +-51163139 = 80957228 bor -132100619. +-51182887 = 80957228 bxor -132100619. +100663690 = -33552502 band 118190587. +-16025605 = -33552502 bor 118190587. +-116689295 = -33552502 bxor 118190587. +11800592 = -4443624 band 16045169. +-199047 = -4443624 bor 16045169. +-11999639 = -4443624 bxor 16045169. +18158166 = 23007830 band 26555095. +31404759 = 23007830 bor 26555095. +13246593 = 23007830 bxor 26555095. +18052 = -78751804 band 78726829. +-43027 = -78751804 bor 78726829. +-61079 = -78751804 bxor 78726829. +-124770974 = -103678494 band -124770957. +-103678477 = -103678494 bor -124770957. +21092497 = -103678494 bxor -124770957. +34086944 = -88396752 band 105423017. +-17060679 = -88396752 bor 105423017. +-51147623 = -88396752 bxor 105423017. +18088974 = -107604434 band 87926223. +-37767185 = -107604434 bor 87926223. +-55856159 = -107604434 bxor 87926223. +12622404 = 14605148 band -85877147. +-83894403 = 14605148 bor -85877147. +-96516807 = 14605148 bxor -85877147. +17844010 = 124872506 band -107425813. +-397317 = 124872506 bor -107425813. +-18241327 = 124872506 bxor -107425813. +4416 = 2904392 band -112018463. +-109118487 = 2904392 bor -112018463. +-109122903 = 2904392 bxor -112018463. +36846854 = -25248506 band 36863943. +-25231417 = -25248506 bor 36863943. +-62078271 = -25248506 bxor 36863943. +89665812 = -44484108 band 90060061. +-44089859 = -44484108 bor 90060061. +-133755671 = -44484108 bxor 90060061. +-125239038 = -21388398 band -103984797. +-134157 = -21388398 bor -103984797. +125104881 = -21388398 bxor -103984797. +9043968 = 13238624 band 44959257. +49153913 = 13238624 bor 44959257. +40109945 = 13238624 bxor 44959257. +-100130658 = -95787298 band -88497985. +-84154625 = -95787298 bor -88497985. +15976033 = -95787298 bxor -88497985. +42844804 = 45994892 band -74454315. +-71304227 = 45994892 bor -74454315. +-114149031 = 45994892 bxor -74454315. +-108003126 = -74312982 band -101611045. +-67920901 = -74312982 bor -101611045. +40082225 = -74312982 bxor -101611045. +103816272 = -29713288 band 124870481. +-8659079 = -29713288 bor 124870481. +-112475351 = -29713288 bxor 124870481. +133456054 = -625738 band 133490871. +-590921 = -625738 bor 133490871. +-134046975 = -625738 bxor 133490871. +68749316 = 112789540 band -48521331. +-4481107 = 112789540 bor -48521331. +-73230423 = 112789540 bxor -48521331. +56889666 = 57546050 band 56973651. +57630035 = 57546050 bor 56973651. +740369 = 57546050 bxor 56973651. +-58686848 = -57638256 band -55597175. +-54548583 = -57638256 bor -55597175. +4138265 = -57638256 bxor -55597175. +-130022514 = -120831090 band -111003729. +-101812305 = -120831090 bor -111003729. +28210209 = -120831090 bxor -111003729. +-64867580 = -64800836 band -43895995. +-43829251 = -64800836 bor -43895995. +21038329 = -64800836 bxor -43895995. +-92009846 = -87225702 band -5988405. +-1204261 = -87225702 bor -5988405. +90805585 = -87225702 bxor -5988405. +46273152 = 63574952 band -84427071. +-67125271 = 63574952 bor -84427071. +-113398423 = 63574952 bxor -84427071. +4269094 = 31536742 band 73100711. +100368359 = 31536742 bor 73100711. +96099265 = 31536742 bxor 73100711. +-67076012 = -58670508 band -16742915. +-8337411 = -58670508 bor -16742915. +58738601 = -58670508 bxor -16742915. +-92139454 = -88452366 band -3719869. +-32781 = -88452366 bor -3719869. +92106673 = -88452366 bxor -3719869. +22054080 = 22130624 band 30704889. +30781433 = 22130624 bor 30704889. +8727353 = 22130624 bxor 30704889. +26617886 = -107566018 band 60189343. +-73994561 = -107566018 bor 60189343. +-100612447 = -107566018 bxor 60189343. +16910244 = 25298924 band -11569227. +-3180547 = 25298924 bor -11569227. +-20090791 = 25298924 bxor -11569227. +67174410 = 105729610 band 67178939. +105734139 = 105729610 bor 67178939. +38559729 = 105729610 bxor 67178939. +-112422384 = -109201704 band -78849487. +-75628807 = -109201704 bor -78849487. +36793577 = -109201704 bxor -78849487. +67109910 = -48626410 band 111480471. +-4255849 = -48626410 bor 111480471. +-71365759 = -48626410 bxor 111480471. +8611844 = -24942460 band 31713389. +-1840915 = -24942460 bor 31713389. +-10452759 = -24942460 bxor 31713389. +2186274 = 2710690 band 52559155. +53083571 = 2710690 bor 52559155. +50897297 = 2710690 bxor 52559155. +-117405600 = -116356880 band -10248599. +-9199879 = -116356880 bor -10248599. +108205721 = -116356880 bxor -10248599. +23339150 = 98869486 band 24459663. +99989999 = 98869486 bor 24459663. +76650849 = 98869486 bxor 24459663. +-133431292 = -99793892 band -66144219. +-32506819 = -99793892 bor -66144219. +100924473 = -99793892 bxor -66144219. +34987434 = -139782 band 34987947. +-139269 = -139782 bor 34987947. +-35126703 = -139782 bxor 34987947. +110133248 = 112756232 band 127381921. +130004905 = 112756232 bor 127381921. +19871657 = 112756232 bxor 127381921. +51432326 = 121364422 band -70202489. +-270393 = 121364422 bor -70202489. +-51702719 = 121364422 bxor -70202489. +5292692 = 122944180 band 6080221. +123731709 = 122944180 bor 6080221. +118439017 = 122944180 bxor 6080221. +-133951486 = -133811630 band -77293277. +-77153421 = -133811630 bor -77293277. +56798065 = -133811630 bxor -77293277. +512 = 76549664 band 40104921. +116654073 = 76549664 bor 40104921. +116653561 = 76549664 bxor 40104921. +9510942 = -72277602 band 14525567. +-67262977 = -72277602 bor 14525567. +-76773919 = -72277602 bxor 14525567. +-99163132 = -4723636 band -99158891. +-4719395 = -4723636 bor -99158891. +94443737 = -4723636 bxor -99158891. +41945482 = -91637334 band 112331163. +-21251653 = -91637334 bor 112331163. +-63197135 = -91637334 bxor 112331163. +10289424 = 27099448 band 113198353. +130008377 = 27099448 bor 113198353. +119718953 = 27099448 bxor 113198353. +42042486 = 44156534 band -23223177. +-21109129 = 44156534 bor -23223177. +-63151615 = 44156534 bxor -23223177. +-130015164 = -62555932 band -121495219. +-54035987 = -62555932 bor -121495219. +75979177 = -62555932 bxor -121495219. +1708034 = -10759166 band 4067603. +-8399597 = -10759166 bor 4067603. +-10107631 = -10759166 bxor 4067603. +51381568 = -78430384 band 127698249. +-2113703 = -78430384 bor 127698249. +-53495271 = -78430384 bxor 127698249. +86387278 = -38326706 band 91138927. +-33575057 = -38326706 bor 91138927. +-119962335 = -38326706 bxor 91138927. +-82509820 = -13303684 band -73454331. +-4248195 = -13303684 bor -73454331. +78261625 = -13303684 bxor -73454331. +4227338 = -111419046 band 6590347. +-109056037 = -111419046 bor 6590347. +-113283375 = -111419046 bxor 6590347. +118128640 = -15751064 band 124425345. +-9454359 = -15751064 bor 124425345. +-127582999 = -15751064 bxor 124425345. +100833574 = -26822362 band 126523751. +-1132185 = -26822362 bor 126523751. +-101965759 = -26822362 bxor 126523751. +-47521004 = -43326700 band -47515715. +-43321411 = -43326700 bor -47515715. +4199593 = -43326700 bxor -47515715. +51724546 = -67812942 band 52258051. +-67279437 = -67812942 bor 52258051. +-119003983 = -67812942 bxor 52258051. +-74182528 = -73589632 band -74165575. +-73572679 = -73589632 bor -74165575. +609849 = -73589632 bxor -74165575. +83550 = 57788158 band -125350305. +-67645697 = 57788158 bor -125350305. +-67729247 = 57788158 bxor -125350305. +110493732 = 133660844 band -23174795. +-7683 = 133660844 bor -23174795. +-110501415 = 133660844 bxor -23174795. +1855754 = 10441994 band -8621701. +-35461 = 10441994 bor -8621701. +-1891215 = 10441994 bxor -8621701. +39824 = 45218712 band 40945. +45219833 = 45218712 bor 40945. +45180009 = 45218712 bxor 40945. +71606870 = 107329494 band -53040553. +-17317929 = 107329494 bor -53040553. +-88924799 = 107329494 bxor -53040553. +17172484 = 93796676 band 57559597. +134183789 = 93796676 bor 57559597. +117011305 = 93796676 bxor 57559597. +-65990558 = -60982430 band -13527821. +-8519693 = -60982430 bor -13527821. +57470865 = -60982430 bxor -13527821. +-99613664 = -93280848 band -91071447. +-84738631 = -93280848 bor -91071447. +14875033 = -93280848 bxor -91071447. +-117274354 = -115610706 band -112816817. +-111153169 = -115610706 bor -112816817. +6121185 = -115610706 bxor -112816817. +-66977596 = -63804196 band -53767707. +-50594307 = -63804196 bor -53767707. +16383289 = -63804196 bxor -53767707. +67634218 = 88020154 band 101232491. +121618427 = 88020154 bor 101232491. +53984209 = 88020154 bxor 101232491. +-23043520 = -18384184 band -22517919. +-17858583 = -18384184 bor -22517919. +5184937 = -18384184 bxor -22517919. +33604102 = 54116998 band 41998151. +62511047 = 54116998 bor 41998151. +28906945 = 54116998 bxor 41998151. +71700 = -94536844 band 86186141. +-8422403 = -94536844 bor 86186141. +-8494103 = -94536844 bxor 86186141. +21594114 = 132088082 band -110518045. +-24077 = 132088082 bor -110518045. +-21618191 = 132088082 bxor -110518045. +9470080 = 59824864 band 10330521. +60685305 = 59824864 bor 10330521. +51215225 = 59824864 bxor 10330521. +-58718178 = -5202850 band -57972673. +-4457345 = -5202850 bor -57972673. +54260833 = -5202850 bxor -57972673. +9995268 = 14206220 band -73548203. +-69337251 = 14206220 bor -73548203. +-79332519 = 14206220 bxor -73548203. +79691850 = -52027286 band 131615067. +-104069 = -52027286 bor 131615067. +-79795919 = -52027286 bxor 131615067. +4202704 = 80946680 band -112661807. +-35917831 = 80946680 bor -112661807. +-40120535 = 80946680 bxor -112661807. +-100138954 = -96609994 band -95936457. +-92407497 = -96609994 bor -95936457. +7731457 = -96609994 bxor -95936457. +-67100412 = -66016860 band -6266099. +-5182547 = -66016860 bor -6266099. +61917865 = -66016860 bxor -6266099. +262338 = -24751422 band 7637203. +-17376557 = -24751422 bor 7637203. +-17638895 = -24751422 bxor 7637203. +-117432320 = -109003760 band -109239543. +-100810983 = -109003760 bor -109239543. +16621337 = -109003760 bxor -109239543. +-52373234 = -51717874 band -51060945. +-50405585 = -51717874 bor -51060945. +1967649 = -51717874 bxor -51060945. +-66486268 = -40007364 band -62134587. +-35655683 = -40007364 bor -62134587. +30830585 = -40007364 bxor -62134587. +-126207990 = -33589222 band -92651701. +-32933 = -33589222 bor -92651701. +126175057 = -33589222 bxor -92651701. +67184640 = 72875304 band -41342399. +-35651735 = 72875304 bor -41342399. +-102836375 = 72875304 bxor -41342399. +25723174 = -41092122 band 61572391. +-5242905 = -41092122 bor 61572391. +-30966079 = -41092122 bxor 61572391. +29426004 = 96715732 band 66922877. +134212605 = 96715732 bor 66922877. +104786601 = 96715732 bxor 66922877. +-134201278 = -115543950 band -54440765. +-35783437 = -115543950 bor -54440765. +98417841 = -115543950 bxor -54440765. +8601664 = 92490048 band 12050553. +95938937 = 92490048 bor 12050553. +87337273 = 92490048 bxor 12050553. +-96362466 = -79322690 band -85855713. +-68815937 = -79322690 bor -85855713. +27546529 = -79322690 bxor -85855713. +-121566940 = -51136148 band -70448331. +-17539 = -51136148 bor -70448331. +121549401 = -51136148 bxor -70448331. +87298314 = -4842550 band 87920955. +-4219909 = -4842550 bor 87920955. +-91518223 = -4842550 bxor 87920955. +1048592 = -65470376 band 13641137. +-52877831 = -65470376 bor 13641137. +-53926423 = -65470376 bxor 13641137. +-134086122 = -66966890 band -68549097. +-1429865 = -66966890 bor -68549097. +132656257 = -66966890 bxor -68549097. +83905028 = -45495804 band 118516717. +-10884115 = -45495804 bor 118516717. +-94789143 = -45495804 bxor 118516717. +3033122 = -114402782 band 8318131. +-109117773 = -114402782 bor 8318131. +-112150895 = -114402782 bxor 8318131. +26247264 = 127631984 band 26532329. +127917049 = 127631984 bor 26532329. +101669785 = 127631984 bxor 26532329. +-126771186 = -100927890 band -59662065. +-33818769 = -100927890 bor -59662065. +92952417 = -100927890 bxor -59662065. +524676 = -66169444 band 47721381. +-18972739 = -66169444 bor 47721381. +-19497415 = -66169444 bxor 47721381. +19991338 = -101381254 band 20004651. +-101367941 = -101381254 bor 20004651. +-121359279 = -101381254 bxor 20004651. +4197632 = -109498488 band 4513057. +-109183063 = -109498488 bor 4513057. +-113380695 = -109498488 bxor 4513057. +8454 = 20473158 band -33381625. +-12916921 = 20473158 bor -33381625. +-12925375 = 20473158 bxor -33381625. +19998740 = 53853236 band 24193629. +58048125 = 53853236 bor 24193629. +38049385 = 53853236 bxor 24193629. +17041538 = -117076014 band 127690915. +-6426637 = -117076014 bor 127690915. +-23468175 = -117076014 bxor 127690915. +101189376 = 109864864 band 119213913. +127889401 = 109864864 bor 119213913. +26700025 = 109864864 bxor 119213913. +-50281698 = -49752290 band -41751553. +-41222145 = -49752290 bor -41751553. +9059553 = -49752290 bxor -41751553. +14698500 = -85959220 band 98846741. +-1810979 = -85959220 bor 98846741. +-16509479 = -85959220 bxor 98846741. +19153162 = 90654506 band -115062501. +-43561157 = 90654506 bor -115062501. +-62714319 = 90654506 bxor -115062501. +9044112 = -124024136 band 13521041. +-119547207 = -124024136 bor 13521041. +-128591319 = -124024136 bxor 13521041. +8391670 = 92974070 band 45374455. +129956855 = 92974070 bor 45374455. +121565185 = 92974070 bxor 45374455. +38928452 = 47880804 band -9018163. +-65811 = 47880804 bor -9018163. +-38994263 = 47880804 bxor -9018163. +59277442 = -72511102 band 130597011. +-1191533 = -72511102 bor 130597011. +-60468975 = -72511102 bxor 130597011. +-66027328 = -2557744 band -65961783. +-2492199 = -2557744 bor -65961783. +63535129 = -2557744 bxor -65961783. +-47955250 = -47758386 band -4926737. +-4729873 = -47758386 bor -4926737. +43225377 = -47758386 bxor -4926737. +67649668 = -65220100 band 86532229. +-46337539 = -65220100 bor 86532229. +-113987207 = -65220100 bxor 86532229. +-114979318 = -76034342 band -106582261. +-67637285 = -76034342 bor -106582261. +47342033 = -76034342 bxor -106582261. +67305472 = 73601512 band -15499263. +-9203223 = 73601512 bor -15499263. +-76508695 = 73601512 bxor -15499263. +1192102 = -32244058 band 8270055. +-25166105 = -32244058 bor 8270055. +-26358207 = -32244058 bxor 8270055. +196628 = 38495380 band 20388669. +58687421 = 38495380 bor 20388669. +58490793 = 38495380 bxor 20388669. +7361538 = -51290318 band 7533699. +-51118157 = -51290318 bor 7533699. +-58479695 = -51290318 bxor 7533699. +46409216 = 130299392 band -83939783. +-49607 = 130299392 bor -83939783. +-46458823 = 130299392 bxor -83939783. +37885022 = 131218558 band -93956641. +-623105 = 131218558 bor -93956641. +-38508127 = 131218558 bxor -93956641. +68300836 = 87470636 band -56920843. +-37751043 = 87470636 bor -56920843. +-106051879 = 87470636 bxor -56920843. +8330 = 106013322 band 17068283. +123073275 = 106013322 bor 17068283. +123064945 = 106013322 bxor 17068283. +108151056 = 108184856 band -8688783. +-8654983 = 108184856 bor -8688783. +-116806039 = 108184856 bxor -8688783. +-124845738 = -55616170 band -73457193. +-4227625 = -55616170 bor -73457193. +120618113 = -55616170 bxor -73457193. +34211972 = 39525060 band -91599443. +-86286355 = 39525060 bor -91599443. +-120498327 = 39525060 bxor -91599443. +4849762 = 22804706 band -87423885. +-69468941 = 22804706 bor -87423885. +-74318703 = 22804706 bxor -87423885. +-134146272 = -112124112 band -30730327. +-8708167 = -112124112 bor -30730327. +125438105 = -112124112 bxor -30730327. +-100384754 = -12271314 band -88705841. +-592401 = -12271314 bor -88705841. +99792353 = -12271314 bxor -88705841. +39879748 = -27197860 band 66356581. +-721027 = -27197860 bor 66356581. +-40600775 = -27197860 bxor 66356581. +5210666 = 14664250 band -11563285. +-2109701 = 14664250 bor -11563285. +-7320367 = 14664250 bxor -11563285. +103612480 = 120431688 band -30600479. +-13781271 = 120431688 bor -30600479. +-117393751 = 120431688 bxor -30600479. +102107142 = -538618 band 102117063. +-528697 = -538618 bor 102117063. +-102635839 = -538618 bxor 102117063. +33864724 = -23282444 band 50789405. +-6357763 = -23282444 bor 50789405. +-40222487 = -23282444 bxor 50789405. +3690498 = 104357522 band -105058205. +-4391181 = 104357522 bor -105058205. +-8081679 = 104357522 bxor -105058205. +100676608 = 105034848 band -6537959. +-2179719 = 105034848 bor -6537959. +-102856327 = 105034848 bxor -6537959. +33554846 = -92679714 band 58994623. +-67239937 = -92679714 bor 58994623. +-100794783 = -92679714 bxor 58994623. +42635396 = 42907276 band -22375979. +-22104099 = 42907276 bor -22375979. +-64739495 = 42907276 bxor -22375979. +105121994 = 114109930 band 106301659. +115289595 = 114109930 bor 106301659. +10167601 = 114109930 bxor 106301659. +-49928624 = -38359176 band -15763887. +-4194439 = -38359176 bor -15763887. +45734185 = -38359176 bxor -15763887. +50337462 = 55066294 band -6137929. +-1409097 = 55066294 bor -6137929. +-51746559 = 55066294 bxor -6137929. +67109380 = -43824348 band 100935309. +-9998419 = -43824348 bor 100935309. +-77107799 = -43824348 bxor 100935309. +26251330 = 26316866 band -101009325. +-100943789 = 26316866 bor -101009325. +-127195119 = 26316866 bxor -101009325. +18453632 = 119272848 band -115761527. +-14942311 = 119272848 bor -115761527. +-33395943 = 119272848 bxor -115761527. +86771342 = 86797966 band -43088209. +-43061585 = 86797966 bor -43088209. +-129832927 = 86797966 bxor -43088209. +-76506620 = -9250116 band -67855803. +-599299 = -9250116 bor -67855803. +75907321 = -9250116 bxor -67855803. +8701066 = 75818394 band -106504501. +-39387173 = 75818394 bor -106504501. +-48088239 = 75818394 bxor -106504501. +-37714816 = -989528 band -37120575. +-395287 = -989528 bor -37120575. +37319529 = -989528 bxor -37120575. +75661350 = -21249690 band 96640167. +-270873 = -21249690 bor 96640167. +-75932223 = -21249690 bxor 96640167. +41993300 = -4078252 band 43568381. +-2503171 = -4078252 bor 43568381. +-44496471 = -4078252 bxor 43568381. +3279938 = 36867570 band 32660547. +66248179 = 36867570 bor 32660547. +62968241 = 36867570 bxor 32660547. +664256 = -81796416 band 69876729. +-12583943 = -81796416 bor 69876729. +-13248199 = -81796416 bxor 69876729. +114561310 = -2648258 band 114588063. +-2621505 = -2648258 bor 114588063. +-117182815 = -2648258 bxor 114588063. +75500196 = 92302060 band 113876661. +130678525 = 92302060 bor 113876661. +55178329 = 92302060 bxor 113876661. +101777418 = 120711498 band -24047429. +-5113349 = 120711498 bor -24047429. +-106890767 = 120711498 bxor -24047429. +4342032 = 41896408 band -37588687. +-34311 = 41896408 bor -37588687. +-4376343 = 41896408 bxor -37588687. +52776982 = 120410134 band 62258583. +129891735 = 120410134 bor 62258583. +77114753 = 120410134 bxor 62258583. +25897732 = 25897860 band -73666707. +-73666579 = 25897860 bor -73666707. +-99564311 = 25897860 bxor -73666707. +25318434 = -5875806 band 30596147. +-598093 = -5875806 bor 30596147. +-25916527 = -5875806 bxor 30596147. +-133099168 = -128877584 band -99281559. +-95059975 = -128877584 bor -99281559. +38039193 = -128877584 bxor -99281559. +60033166 = -4830226 band 64293007. +-570385 = -4830226 bor 64293007. +-60603551 = -4830226 bxor 64293007. +98567940 = 132802332 band 98606885. +132841277 = 132802332 bor 98606885. +34273337 = 132802332 bxor 98606885. +-64808790 = -54576902 band -64774485. +-54542597 = -54576902 bor -64774485. +10266193 = -54576902 bxor -64774485. +-134215680 = -121317112 band -98498399. +-85599831 = -121317112 bor -98498399. +48615849 = -121317112 bxor -98498399. +36924038 = -29889850 band 41646727. +-25167161 = -29889850 bor 41646727. +-62091199 = -29889850 bxor 41646727. +16780692 = -112034380 band 128224733. +-590339 = -112034380 bor 128224733. +-17371031 = -112034380 bxor 128224733. +33761282 = -96998062 band 59455523. +-71303821 = -96998062 bor 59455523. +-105065103 = -96998062 bxor 59455523. +56688640 = -76300000 band 65088217. +-67900423 = -76300000 bor 65088217. +-124589063 = -76300000 bxor 65088217. +-29163490 = -20738914 band -28363905. +-19939329 = -20738914 bor -28363905. +9224161 = -20738914 bxor -28363905. +-123696380 = -56373428 band -72311915. +-4988963 = -56373428 bor -72311915. +118707417 = -56373428 bxor -72311915. +50692234 = 64476330 band -80901989. +-67117893 = 64476330 bor -80901989. +-117810127 = 64476330 bxor -80901989. +79959056 = 82089016 band 97278993. +99408953 = 82089016 bor 97278993. +19449897 = 82089016 bxor 97278993. +1184118 = 37130614 band -120450185. +-84503689 = 37130614 bor -120450185. +-85687807 = 37130614 bxor -120450185. +567364 = -127222812 band 17410125. +-110380051 = -127222812 bor 17410125. +-110947415 = -127222812 bxor 17410125. +-87932926 = -84783358 band -87396333. +-84246765 = -84783358 bor -87396333. +3686161 = -84783358 bxor -87396333. +-134139840 = -133582256 band -95060919. +-94503335 = -133582256 bor -95060919. +39636505 = -133582256 bxor -95060919. +27285582 = -71673522 band 98695791. +-263313 = -71673522 bor 98695791. +-27548895 = -71673522 bxor 98695791. +72384516 = -60841092 band 108041221. +-25184387 = -60841092 bor 108041221. +-97568903 = -60841092 bxor 108041221. +35949578 = -68764582 band 104713867. +-293 = -68764582 bor 104713867. +-35949871 = -68764582 bxor 104713867. +54618880 = 130120552 band -76846207. +-1344535 = 130120552 bor -76846207. +-55963415 = 130120552 bxor -76846207. +-100646874 = -29080538 band -80164761. +-8598425 = -29080538 bor -80164761. +92048449 = -29080538 bxor -80164761. +14820884 = -85531116 band 98713277. +-1638723 = -85531116 bor 98713277. +-16459607 = -85531116 bxor 98713277. +10486786 = 60849330 band 83854339. +134216883 = 60849330 bor 83854339. +123730097 = 60849330 bxor 83854339. +5245312 = -128561280 band 100207033. +-33599559 = -128561280 bor 100207033. +-38844871 = -128561280 bxor 100207033. +-100396706 = -99241474 band -1286817. +-131585 = -99241474 bor -1286817. +100265121 = -99241474 bxor -1286817. +1081380 = 43049900 band 1542261. +43510781 = 43049900 bor 1542261. +42429401 = 43049900 bxor 1542261. +16936970 = 85389322 band -106729349. +-38276997 = 85389322 bor -106729349. +-55213967 = 85389322 bxor -106729349. +6555280 = 16682648 band -43698447. +-33571079 = 16682648 bor -43698447. +-40126359 = 16682648 bxor -43698447. +-97779626 = -96730410 band -68249257. +-67200041 = -96730410 bor -68249257. +30579585 = -96730410 bxor -68249257. +86020 = 127532100 band -133869267. +-6423187 = 127532100 bor -133869267. +-6509207 = 127532100 bxor -133869267. +-129404318 = -20089246 band -111578125. +-2263053 = -20089246 bor -111578125. +127141265 = -20089246 bxor -111578125. +-49246176 = -44263248 band -15543511. +-10560583 = -44263248 bor -15543511. +38685593 = -44263248 bxor -15543511. +33559566 = 34641582 band 126704719. +127786735 = 34641582 bor 126704719. +94227169 = 34641582 bxor 126704719. +-62388028 = -43348004 band -27494171. +-8454147 = -43348004 bor -27494171. +53933881 = -43348004 bxor -27494171. +4288042 = 5468090 band 57503339. +58683387 = 5468090 bor 57503339. +54395345 = 5468090 bxor 57503339. +81824832 = -16855608 band 98614881. +-65559 = -16855608 bor 98614881. +-81890391 = -16855608 bxor 98614881. +-89095162 = -88552058 band -84769209. +-84226105 = -88552058 bor -84769209. +4869057 = -88552058 bxor -84769209. +56852 = 1506932 band -49684579. +-48234499 = 1506932 bor -49684579. +-48291351 = 1506932 bxor -49684579. +-121357310 = -3916782 band -121159709. +-3719181 = -3916782 bor -121159709. +117638129 = -3916782 bxor -121159709. +-58095488 = -18903584 band -39200615. +-8711 = -18903584 bor -39200615. +58086777 = -18903584 bxor -39200615. +10618654 = 10880862 band -39585985. +-39323777 = 10880862 bor -39585985. +-49942431 = 10880862 bxor -39585985. +9838596 = -35674100 band 45507925. +-4771 = -35674100 bor 45507925. +-9843367 = -35674100 bxor 45507925. +54659146 = -12108950 band 57329755. +-9438341 = -12108950 bor 57329755. +-64097487 = -12108950 bxor 57329755. +113574096 = -18532104 band 113574353. +-18531847 = -18532104 bor 113574353. +-132105943 = -18532104 bxor 113574353. +99382 = 18195510 band 100896567. +118992695 = 18195510 bor 100896567. +118893313 = 18195510 bxor 100896567. +59396 = 11594916 band -28906995. +-17371475 = 11594916 bor -28906995. +-17430871 = 11594916 bxor -28906995. +8897986 = 42978754 band -34084909. +-4141 = 42978754 bor -34084909. +-8902127 = 42978754 bxor -34084909. +-117437952 = -77451504 band -108717559. +-68731111 = -77451504 bor -108717559. +48706841 = -77451504 bxor -108717559. +8455182 = 126944270 band -120639953. +-2150865 = 126944270 bor -120639953. +-10606047 = 126944270 bxor -120639953. +33557508 = 128134204 band -94614075. +-37379 = 128134204 bor -94614075. +-33594887 = 128134204 bxor -94614075. +545290 = 73224986 band -81101237. +-8421541 = 73224986 bor -81101237. +-8966831 = 73224986 bxor -81101237. +-124780544 = -57356248 band -105316031. +-37891735 = -57356248 bor -105316031. +86888809 = -57356248 bxor -105316031. +-132086746 = -76708122 band -123685849. +-68307225 = -76708122 bor -123685849. +63779521 = -76708122 bxor -123685849. +5390420 = 8046292 band -120360835. +-117704963 = 8046292 bor -120360835. +-123095383 = 8046292 bxor -120360835. +-111531198 = -67425422 band -44405821. +-300045 = -67425422 bor -44405821. +111231153 = -67425422 bxor -44405821. +-131918784 = -131630016 band -97806471. +-97517703 = -131630016 bor -97806471. +34401081 = -131630016 bxor -97806471. +88866846 = -45314882 band 91095327. +-43086401 = -45314882 bor 91095327. +-131953247 = -45314882 bxor 91095327. +4132 = 19405932 band -29019595. +-9617795 = 19405932 bor -29019595. +-9621927 = 19405932 bxor -29019595. +12619786 = 46184138 band -33845189. +-280837 = 46184138 bor -33845189. +-12900623 = 46184138 bxor -33845189. +2134032 = 45126488 band 2342065. +45334521 = 45126488 bor 2342065. +43200489 = 45126488 bxor 2342065. +67663126 = 77297046 band -66521833. +-56887913 = 77297046 bor -66521833. +-124551039 = 77297046 bxor -66521833. +17170436 = 21466372 band -41520403. +-37224467 = 21466372 bor -41520403. +-54394903 = 21466372 bxor -41520403. +17908002 = -107915998 band 85838771. +-39985229 = -107915998 bor 85838771. +-57893231 = -107915998 bxor 85838771. +2117728 = 20084080 band 115626217. +133592569 = 20084080 bor 115626217. +131474841 = 20084080 bxor 115626217. +85139470 = -49045138 band 94334991. +-39849617 = -49045138 bor 94334991. +-124989087 = -49045138 bxor 94334991. +52433028 = 60913820 band 52957861. +61438653 = 60913820 bor 52957861. +9005625 = 60913820 bxor 52957861. +5006890 = -27498886 band 15531563. +-16974213 = -27498886 bor 15531563. +-21981103 = -27498886 bxor 15531563. +34078720 = -90471800 band 53228577. +-71321943 = -90471800 bor 53228577. +-105400663 = -90471800 bxor 53228577. +70930438 = 70938694 band 121328135. +121336391 = 70938694 bor 121328135. +50405953 = 70938694 bxor 121328135. +10629396 = -5619916 band 16183645. +-65667 = -5619916 bor 16183645. +-10695063 = -5619916 bxor 16183645. +17891970 = 27085522 band -47118429. +-37924877 = 27085522 bor -47118429. +-55816847 = 27085522 bxor -47118429. +393728 = -112846176 band 112608857. +-631047 = -112846176 bor 112608857. +-1024775 = -112846176 bxor 112608857. +4211230 = 115425822 band 21134079. +132348671 = 115425822 bor 21134079. +128137441 = 115425822 bxor 21134079. +-117293052 = -83738420 band -109318379. +-75763747 = -83738420 bor -109318379. +41529305 = -83738420 bxor -109318379. +-87474166 = -69508566 band -87177189. +-69211589 = -69508566 bor -87177189. +18262577 = -69508566 bxor -87177189. +3671440 = -59204168 band 62482321. +-393287 = -59204168 bor 62482321. +-4064727 = -59204168 bxor 62482321. +-22789386 = -22710538 band -17380617. +-17301769 = -22710538 bor -17380617. +5487617 = -22710538 bxor -17380617. +41011524 = 49667428 band -75764787. +-67108883 = 49667428 bor -75764787. +-108120407 = 49667428 bxor -75764787. +50465922 = 53087362 band 121839507. +124460947 = 53087362 bor 121839507. +73995025 = 53087362 bxor 121839507. +6316992 = -102405168 band 6846409. +-101875751 = -102405168 bor 6846409. +-108192743 = -102405168 bxor 6846409. +91234510 = -9408818 band 100016623. +-626705 = -9408818 bor 100016623. +-91861215 = -9408818 bxor 100016623. +91571332 = 100496636 band -42481787. +-33556483 = 100496636 bor -42481787. +-125127815 = 100496636 bxor -42481787. +2664458 = 11053530 band 70053387. +78442459 = 11053530 bor 70053387. +75778001 = 11053530 bxor 70053387. +-98417664 = -13966104 band -93169919. +-8718359 = -13966104 bor -93169919. +89699305 = -13966104 bxor -93169919. +78776742 = 83331494 band 96100327. +100655079 = 83331494 bor 96100327. +21878337 = 83331494 bxor 96100327. +-114531820 = -46307436 band -114531779. +-46307395 = -46307436 bor -114531779. +68224425 = -46307436 bxor -114531779. +100798978 = 100833842 band -20769917. +-20735053 = 100833842 bor -20769917. +-121534031 = 100833842 bxor -20769917. +33644800 = 55798016 band -92150471. +-69997255 = 55798016 bor -92150471. +-103642055 = 55798016 bxor -92150471. +1582174 = 3942270 band 119104735. +121464831 = 3942270 bor 119104735. +119882657 = 3942270 bxor 119104735. +100798756 = 101061932 band 118660085. +118923261 = 101061932 bor 118660085. +18124505 = 101061932 bxor 118660085. +38350218 = 49233290 band 123301883. +134184955 = 49233290 bor 123301883. +95834737 = 49233290 bxor 123301883. +1310736 = -128624616 band 129892977. +-42375 = -128624616 bor 129892977. +-1353111 = -128624616 bxor 129892977. +16842838 = 84650070 band -70971177. +-3163945 = 84650070 bor -70971177. +-20006783 = 84650070 bxor -70971177. +-111979388 = -78389820 band -102804307. +-69214739 = -78389820 bor -102804307. +42764649 = -78389820 bxor -102804307. +-124656798 = -89000990 band -119544973. +-83889165 = -89000990 bor -119544973. +40767633 = -89000990 bxor -119544973. +-134151648 = -57470416 band -79065431. +-2384199 = -57470416 bor -79065431. +131767449 = -57470416 bxor -79065431. +88817678 = 125791278 band -37010481. +-36881 = 125791278 bor -37010481. +-88854559 = 125791278 bxor -37010481. +-100458428 = -11591332 band -100438939. +-11571843 = -11591332 bor -100438939. +88886585 = -11591332 bxor -100438939. +134442 = -107340486 band 6442475. +-101032453 = -107340486 bor 6442475. +-101166895 = -107340486 bxor 6442475. +4350272 = -61147320 band 63138273. +-2359319 = -61147320 bor 63138273. +-6709591 = -61147320 bxor 63138273. +-116076282 = -109260026 band -15344185. +-8527929 = -109260026 bor -15344185. +107548353 = -109260026 bxor -15344185. +525076 = 80494580 band 19645213. +99614717 = 80494580 bor 19645213. +99089641 = 80494580 bxor 19645213. +8390914 = -92071534 band 76058467. +-24403981 = -92071534 bor 76058467. +-32794895 = -92071534 bxor 76058467. +4613120 = 57108320 band -121211879. +-68716679 = 57108320 bor -121211879. +-73329799 = 57108320 bxor -121211879. +-132105058 = -130728738 band -118833473. +-117457153 = -130728738 bor -118833473. +14647905 = -130728738 bxor -118833473. +12654724 = -120874612 band 96549077. +-36980259 = -120874612 bor 96549077. +-49634983 = -120874612 bxor 96549077. +-65797942 = -61585174 band -48855077. +-44642309 = -61585174 bor -48855077. +21155633 = -61585174 bxor -48855077. +-28802992 = -27344264 band -26636975. +-25178247 = -27344264 bor -26636975. +3624745 = -27344264 bxor -26636975. +-115212106 = -106559050 band -76822857. +-68169801 = -106559050 bor -76822857. +47042305 = -106559050 bxor -76822857. +40406020 = -67531228 band 107523469. +-413779 = -67531228 bor 107523469. +-40819799 = -67531228 bxor 107523469. +33555266 = 125897538 band -93579437. +-1237165 = 125897538 bor -93579437. +-34792431 = 125897538 bxor -93579437. +-132972416 = -61642608 band -121662071. +-50332263 = -61642608 bor -121662071. +82640153 = -61642608 bxor -121662071. +-133131890 = -99051122 band -48835153. +-14754385 = -99051122 bor -48835153. +118377505 = -99051122 bxor -48835153. +67240196 = -64062020 band 92471621. +-38830595 = -64062020 bor 92471621. +-106070791 = -64062020 bxor 92471621. +16777354 = 59293850 band -49996341. +-7479845 = 59293850 bor -49996341. +-24257199 = 59293850 bxor -49996341. +4401280 = 4438440 band -11047743. +-11010583 = 4438440 bor -11047743. +-15411863 = 4438440 bxor -11047743. +-134199258 = -106804122 band -96089177. +-68694041 = -106804122 bor -96089177. +65505217 = -106804122 bxor -96089177. +78381140 = -34682796 band 78451709. +-34612227 = -34682796 bor 78451709. +-112993367 = -34682796 bxor 78451709. +-59750334 = -59324174 band -50758845. +-50332685 = -59324174 bor -50758845. +9417649 = -59324174 bxor -50758845. +10096832 = 43652544 band 12317433. +45873145 = 43652544 bor 12317433. +35776313 = 43652544 bxor 12317433. +10780702 = -106659266 band 78547103. +-38892865 = -106659266 bor 78547103. +-49673567 = -106659266 bxor 78547103. +2803108 = 99274220 band 4179381. +100650493 = 99274220 bor 4179381. +97847385 = 99274220 bxor 4179381. +6292490 = -127761334 band 24973243. +-109080581 = -127761334 bor 24973243. +-115373071 = -127761334 bxor 24973243. +10749968 = 44883160 band 99878961. +134012153 = 44883160 bor 99878961. +123262185 = 44883160 bxor 99878961. +37783574 = -95642858 band 48426135. +-85000297 = -95642858 bor 48426135. +-122783871 = -95642858 bxor 48426135. +38725124 = 41873028 band -87034259. +-83886355 = 41873028 bor -87034259. +-122611479 = 41873028 bxor -87034259. +-129035742 = -51424606 band -127943885. +-50332749 = -51424606 bor -127943885. +78702993 = -51424606 bxor -127943885. +134240 = -130126096 band 100830313. +-29430023 = -130126096 bor 100830313. +-29564263 = -130126096 bxor 100830313. +-133114226 = -132909330 band -3090545. +-2885649 = -132909330 bor -3090545. +130228577 = -132909330 bxor -3090545. +2261508 = 87263772 band -122780123. +-37777859 = 87263772 bor -122780123. +-40039367 = 87263772 bxor -122780123. +76288426 = 80516090 band -41067093. +-36839429 = 80516090 bor -41067093. +-113127855 = 80516090 bxor -41067093. +6556672 = 83700744 band -110731359. +-33587287 = 83700744 bor -110731359. +-40143959 = 83700744 bxor -110731359. +-134078074 = -113248826 band -96327289. +-75498041 = -113248826 bor -96327289. +58580033 = -113248826 bxor -96327289. +-131596140 = -63110988 band -77048611. +-8563459 = -63110988 bor -77048611. +123032681 = -63110988 bxor -77048611. +360450 = 87402578 band 42850083. +129892211 = 87402578 bor 42850083. +129531761 = 87402578 bxor 42850083. +67264512 = 100889632 band -40214055. +-6588935 = 100889632 bor -40214055. +-73853447 = 100889632 bxor -40214055. +4243998 = -77465698 band 73187967. +-8521729 = -77465698 bor 73187967. +-12765727 = -77465698 bxor 73187967. +-113114620 = -67390900 band -45727083. +-3363 = -67390900 bor -45727083. +113111257 = -67390900 bxor -45727083. +33621898 = 57798570 band 100992923. +125169595 = 57798570 bor 100992923. +91547697 = 57798570 bxor 100992923. +1385232 = 89630520 band -124423407. +-36178119 = 89630520 bor -124423407. +-37563351 = 89630520 bxor -124423407. +131190 = 14113910 band 52593271. +66575991 = 14113910 bor 52593271. +66444801 = 14113910 bxor 52593271. +-129421756 = -126091548 band -53661875. +-50331667 = -126091548 bor -53661875. +79090089 = -126091548 bxor -53661875. +-99563006 = -95106558 band -80556269. +-76099821 = -95106558 bor -80556269. +23463185 = -95106558 bxor -80556269. +-129490624 = -76798640 band -62229687. +-9537703 = -76798640 bor -62229687. +119952921 = -76798640 bxor -62229687. +-62848946 = -28736434 band -34518673. +-406161 = -28736434 bor -34518673. +62442785 = -28736434 bxor -34518673. +-130792956 = -17414532 band -130155771. +-16777347 = -17414532 bor -130155771. +114015609 = -17414532 bxor -130155771. +19989770 = -4352166 band 24317323. +-24613 = -4352166 bor 24317323. +-20014383 = -4352166 bxor 24317323. +541184 = 10440296 band -98024831. +-88125719 = 10440296 bor -98024831. +-88666903 = 10440296 bxor -98024831. +-134166746 = -131215578 band -33360025. +-30408857 = -131215578 bor -33360025. +103757889 = -131215578 bxor -33360025. +-117145324 = -11605740 band -116030019. +-10490435 = -11605740 bor -116030019. +106654889 = -11605740 bxor -116030019. +-99245310 = -99108942 band -71458045. +-71321677 = -99108942 bor -71458045. +27923633 = -99108942 bxor -71458045. +110723200 = -21265792 band 110739641. +-21249351 = -21265792 bor 110739641. +-131972551 = -21265792 bxor 110739641. +4525150 = 4562174 band -34771873. +-34734849 = 4562174 bor -34771873. +-39259999 = 4562174 bxor -34771873. +92538404 = 93734572 band -7557259. +-6361091 = 93734572 bor -7557259. +-98899495 = 93734572 bxor -7557259. +133898 = 98208522 band -131698821. +-33624197 = 98208522 bor -131698821. +-33758095 = 98208522 bxor -131698821. +328080 = 41361816 band -58339855. +-17306119 = 41361816 bor -58339855. +-17634199 = 41361816 bxor -58339855. +16910422 = 52317654 band -115177385. +-79770153 = 52317654 bor -115177385. +-96680575 = 52317654 bxor -115177385. +34084868 = 59293508 band -31958995. +-6750355 = 59293508 bor -31958995. +-40835223 = 59293508 bxor -31958995. +50942050 = -83267230 band 123556595. +-10652685 = -83267230 bor 123556595. +-61594735 = -83267230 bxor 123556595. +12847648 = -51082320 band 13584937. +-50345031 = -51082320 bor 13584937. +-63192679 = -51082320 bxor 13584937. +17826062 = 93405614 band -76534961. +-955409 = 93405614 bor -76534961. +-18781471 = 93405614 bxor -76534961. +529092 = -99700004 band 82403301. +-17825795 = -99700004 bor 82403301. +-18354887 = -99700004 bxor 82403301. +2230314 = 45337274 band 70135147. +113242107 = 45337274 bor 70135147. +111011793 = 45337274 bxor 70135147. +88080448 = 88219848 band 97850721. +97990121 = 88219848 bor 97850721. +9909673 = 88219848 bxor 97850721. +4102 = 38000774 band 8402247. +46398919 = 38000774 bor 8402247. +46394817 = 38000774 bxor 8402247. +2916372 = 45908340 band -43211107. +-219139 = 45908340 bor -43211107. +-3135511 = 45908340 bxor -43211107. +-134162942 = -59443438 band -83829021. +-9109517 = -59443438 bor -83829021. +125053425 = -59443438 bxor -83829021. +-120455040 = -103137056 band -17690727. +-372743 = -103137056 bor -17690727. +120082297 = -103137056 bxor -17690727. +50332190 = 120025694 band 56133183. +125826687 = 120025694 bor 56133183. +75494497 = 120025694 bxor 56133183. +21104644 = -112030964 band 97193045. +-35942563 = -112030964 bor 97193045. +-57047207 = -112030964 bxor 97193045. +22038090 = 66344554 band 22628187. +66934651 = 66344554 bor 22628187. +44896561 = 66344554 bxor 22628187. +35719376 = 35867640 band 66918609. +67066873 = 35867640 bor 66918609. +31347497 = 35867640 bxor 66918609. +14183990 = 49901366 band -35979721. +-262345 = 49901366 bor -35979721. +-14446335 = 49901366 bxor -35979721. +69804292 = 87895972 band -60198643. +-42106963 = 87895972 bor -60198643. +-111911255 = 87895972 bxor -60198643. +71647426 = 107301058 band -44611885. +-8958253 = 107301058 bor -44611885. +-80605679 = 107301058 bxor -44611885. +80281600 = -1072624 band 80285961. +-1068263 = -1072624 bor 80285961. +-81349863 = -1072624 bxor 80285961. +4271374 = 46345998 band -129663697. +-87589073 = 46345998 bor -129663697. +-91860447 = 46345998 bxor -129663697. +50365444 = 51695420 band -77024059. +-75694083 = 51695420 bor -77024059. +-126059527 = 51695420 bxor -77024059. +-133813238 = -133747174 band -46744245. +-46678181 = -133747174 bor -46744245. +87135057 = -133747174 bxor -46744245. +10780672 = 16622376 band -56305599. +-50463895 = 16622376 bor -56305599. +-61244567 = 16622376 bxor -56305599. +-133168858 = -10874394 band -122559705. +-265241 = -10874394 bor -122559705. +132903617 = -10874394 bxor -122559705. +67469652 = -31602220 band 69580669. +-29491203 = -31602220 bor 69580669. +-96960855 = -31602220 bxor 69580669. +-125500862 = -106600846 band -19952957. +-1052941 = -106600846 bor -19952957. +124447921 = -106600846 bxor -19952957. +5443136 = 7843648 band 98258553. +100659065 = 7843648 bor 98258553. +95215929 = 7843648 bxor 98258553. +43388958 = -86018114 band 43388959. +-86018113 = -86018114 bor 43388959. +-129407071 = -86018114 bxor 43388959. +-125282012 = -104300692 band -88516299. +-67534979 = -104300692 bor -88516299. +57747033 = -104300692 bxor -88516299. +102039818 = -32026166 band 118853435. +-15212549 = -32026166 bor 118853435. +-117252367 = -32026166 bxor 118853435. +-131071472 = -126605736 band -46967887. +-42502151 = -126605736 bor -46967887. +88569321 = -126605736 bxor -46967887. +104906774 = -29310826 band 105112599. +-29105001 = -29310826 bor 105112599. +-134011775 = -29310826 bxor 105112599. +19943428 = -80654332 band 24672749. +-75925011 = -80654332 bor 24672749. +-95868439 = -80654332 bxor 24672749. +-109051870 = -4173790 band -107435341. +-2557261 = -4173790 bor -107435341. +106494609 = -4173790 bxor -107435341. +23412832 = 58026096 band 91211753. +125825017 = 58026096 bor 91211753. +102412185 = 58026096 bxor 91211753. +2165774 = 112675950 band 6897423. +117407599 = 112675950 bor 6897423. +115241825 = 112675950 bxor 6897423. +2136452 = 44080028 band 74709413. +116652989 = 44080028 bor 74709413. +114516537 = 44080028 bxor 74709413. +295210 = 101695866 band 310571. +101711227 = 101695866 bor 310571. +101416017 = 101695866 bxor 310571. +-121011968 = -35007096 band -87061727. +-1056855 = -35007096 bor -87061727. +119955113 = -35007096 bxor -87061727. +16777478 = 55081798 band -108003065. +-69698745 = 55081798 bor -108003065. +-86476223 = 55081798 bxor -108003065. +67665940 = 84591156 band 83408989. +100334205 = 84591156 bor 83408989. +32668265 = 84591156 bxor 83408989. +16843906 = -83819054 band 27371171. +-73291789 = -83819054 bor 27371171. +-90135695 = -83819054 bxor 27371171. +109661440 = 128699808 band 109935961. +128974329 = 128699808 bor 109935961. +19312889 = 128699808 bxor 109935961. +264478 = 38120734 band 94243327. +132099583 = 38120734 bor 94243327. +131835105 = 38120734 bxor 94243327. +83886596 = 93332428 band 84907541. +94353373 = 93332428 bor 84907541. +10466777 = 93332428 bxor 84907541. +9651466 = 10190122 band -86816997. +-86278341 = 10190122 bor -86816997. +-95929807 = 10190122 bxor -86816997. +12432 = 92385464 band 39878289. +132251321 = 92385464 bor 39878289. +132238889 = 92385464 bxor 39878289. +38011382 = -20168202 band 55917047. +-2262537 = -20168202 bor 55917047. +-40273919 = -20168202 bxor 55917047. +50143300 = -16965532 band 50164429. +-16944403 = -16965532 bor 50164429. +-67087703 = -16965532 bxor 50164429. +68159106 = 108169090 band 77168275. +117178259 = 108169090 bor 77168275. +49019153 = 108169090 bxor 77168275. +43601600 = 43900624 band -67408183. +-67109159 = 43900624 bor -67408183. +-110710759 = 43900624 bxor -67408183. +-96399154 = -28993074 band -70029073. +-2622993 = -28993074 bor -70029073. +93776161 = -28993074 bxor -70029073. +71435908 = -45475844 band 79900293. +-37011459 = -45475844 bor 79900293. +-108447367 = -45475844 bxor 79900293. +-67107830 = -14318374 band -66048757. +-13259301 = -14318374 bor -66048757. +53848529 = -14318374 bxor -66048757. +796160 = 35567592 band -124965375. +-90193943 = 35567592 bor -124965375. +-90990103 = 35567592 bxor -124965375. +132262 = -35187546 band 34770663. +-549145 = -35187546 bor 34770663. +-681407 = -35187546 bxor 34770663. +51980308 = 119237268 band 60664125. +127921085 = 119237268 bor 60664125. +75940777 = 119237268 bxor 60664125. +30347266 = 98555186 band -101764477. +-33556557 = 98555186 bor -101764477. +-63903823 = 98555186 bxor -101764477. +39936 = 9346048 band -129983431. +-120677319 = 9346048 bor -129983431. +-120717255 = 9346048 bxor -129983431. +2101854 = 3281534 band 40399839. +41579519 = 3281534 bor 40399839. +39477665 = 3281534 bxor 40399839. +117522468 = 121731116 band 126206709. +130415357 = 121731116 bor 126206709. +12892889 = 121731116 bxor 126206709. +34097290 = 64542858 band -99979525. +-69533957 = 64542858 bor -99979525. +-103631247 = 64542858 bxor -99979525. +18909456 = 90434328 band -105080463. +-33555591 = 90434328 bor -105080463. +-52465047 = 90434328 bxor -105080463. +33747798 = -93064362 band 34013143. +-92799017 = -93064362 bor 34013143. +-126546815 = -93064362 bxor 34013143. +36700292 = 104374468 band 45112237. +112786413 = 104374468 bor 45112237. +76086121 = 104374468 bxor 45112237. +13746786 = 97775330 band 47301235. +131329779 = 97775330 bor 47301235. +117582993 = 97775330 bxor 47301235. +75498784 = 75564336 band -39582295. +-39516743 = 75564336 bor -39582295. +-115015527 = 75564336 bxor -39582295. +38015502 = 38147886 band -25423153. +-25290769 = 38147886 bor -25423153. +-63306271 = 38147886 bxor -25423153. +17317956 = 61424732 band -49392795. +-5286019 = 61424732 bor -49392795. +-22603975 = 61424732 bxor -49392795. +8390698 = 27293754 band -53408533. +-34505477 = 27293754 bor -53408533. +-42896175 = 27293754 bxor -53408533. +-99336128 = -4961720 band -99237663. +-4863255 = -4961720 bor -99237663. +94472873 = -4961720 bxor -99237663. +-117339130 = -82977274 band -47084345. +-12722489 = -82977274 bor -47084345. +104616641 = -82977274 bxor -47084345. +-3898860 = -1588492 band -3372515. +-1062147 = -1588492 bor -3372515. +2836713 = -1588492 bxor -3372515. +-99613694 = -73804654 band -97505693. +-71696653 = -73804654 bor -97505693. +27917041 = -73804654 bxor -97505693. +-131593728 = -130540960 band -30627047. +-29574279 = -130540960 bor -30627047. +102019449 = -130540960 bxor -30627047. +40633758 = 58501086 band -85111361. +-67244033 = 58501086 bor -85111361. +-107877791 = 58501086 bxor -85111361. +5266564 = 91520140 band 13885397. +100138973 = 91520140 bor 13885397. +94872409 = 91520140 bxor 13885397. +-64814390 = -64527382 band -30210341. +-29923333 = -64527382 bor -30210341. +34891057 = -64527382 bxor -30210341. +3310672 = 3331448 band 92251217. +92271993 = 3331448 bor 92251217. +88961321 = 3331448 bxor 92251217. +50402486 = 51369142 band -78563913. +-77597257 = 51369142 bor -78563913. +-127999743 = 51369142 bxor -78563913. +38342660 = 41668900 band -28756851. +-25430611 = 41668900 bor -28756851. +-63773271 = 41668900 bxor -28756851. +70780482 = 87852610 band 79263315. +96335443 = 87852610 bor 79263315. +25554961 = 87852610 bxor 79263315. +-132085632 = -63513712 band -73298807. +-4726887 = -63513712 bor -73298807. +127358745 = -63513712 bxor -73298807. +1049742 = 126928014 band -128244561. +-2366289 = 126928014 bor -128244561. +-3416031 = 126928014 bxor -128244561. +33824772 = 39198908 band -99784635. +-94410499 = 39198908 bor -99784635. +-128235271 = 39198908 bxor -99784635. +26744970 = 131636122 band -104899381. +-8229 = 131636122 bor -104899381. +-26753199 = 131636122 bxor -104899381. +75497600 = 79858856 band -6208575. +-1847319 = 79858856 bor -6208575. +-77344919 = 79858856 bxor -6208575. +8704550 = 43308902 band 31783591. +66387943 = 43308902 bor 31783591. +57683393 = 43308902 bxor 31783591. +84232788 = 117951316 band 87907069. +121625597 = 117951316 bor 87907069. +37392809 = 117951316 bxor 87907069. +8651330 = -108592142 band 14457411. +-102786061 = -108592142 bor 14457411. +-111437391 = -108592142 bxor 14457411. +125831360 = 130042048 band 126462457. +130673145 = 130042048 bor 126462457. +4841785 = 130042048 bxor 126462457. +69469470 = 117271870 band -47933537. +-131137 = 117271870 bor -47933537. +-69600607 = 117271870 bxor -47933537. +42016932 = 46215404 band -72225611. +-68027139 = 46215404 bor -72225611. +-110044071 = 46215404 bxor -72225611. +-121303542 = -102817974 band -54194501. +-35708933 = -102817974 bor -54194501. +85594609 = -102817974 bxor -54194501. +33558288 = -100241448 band 65118001. +-68681735 = -100241448 bor 65118001. +-102240023 = -100241448 bxor 65118001. +69452310 = 108520982 band 69983127. +109051799 = 108520982 bor 69983127. +39599489 = 108520982 bxor 69983127. +22982916 = 22983044 band -8389267. +-8389139 = 22983044 bor -8389267. +-31372055 = 22983044 bxor -8389267. +2082 = -133935710 band 113809971. +-20127821 = -133935710 bor 113809971. +-20129903 = -133935710 bxor 113809971. +262496 = -120102416 band 53216105. +-67148807 = -120102416 bor 53216105. +-67411303 = -120102416 bxor 53216105. +73965710 = -16932370 band 90744463. +-153617 = -16932370 bor 90744463. +-74119327 = -16932370 bxor 90744463. +6827268 = 32025884 band 75001125. +100199741 = 32025884 bor 75001125. +93372473 = 32025884 bxor 75001125. +68778 = -131731718 band 106110123. +-25690373 = -131731718 bor 106110123. +-25759151 = -131731718 bxor 106110123. +23148032 = -77496568 band 90683041. +-9961559 = -77496568 bor 90683041. +-33109591 = -77496568 bxor 90683041. +262278 = -128712506 band 52746375. +-76228409 = -128712506 bor 52746375. +-76490687 = -128712506 bxor 52746375. +916 = 1278900 band -72868899. +-71590915 = 1278900 bor -72868899. +-71591831 = 1278900 bxor -72868899. +-127114750 = -117480622 band -127109597. +-117475469 = -117480622 bor -127109597. +9639281 = -117480622 bxor -127109597. +68091904 = 71247648 band -7366439. +-4210695 = 71247648 bor -7366439. +-72302599 = 71247648 bxor -7366439. +17055774 = 25977502 band 50745727. +59667455 = 25977502 bor 50745727. +42611681 = 25977502 bxor 50745727. +-57179900 = -37776052 band -19404395. +-547 = -37776052 bor -19404395. +57179353 = -37776052 bxor -19404395. +18350730 = -111670614 band 121144987. +-8876357 = -111670614 bor 121144987. +-27227087 = -111670614 bxor 121144987. +34769424 = 49723960 band -15037935. +-83399 = 49723960 bor -15037935. +-34852823 = 49723960 bxor -15037935. +-58449546 = -24893578 band -40963721. +-7407753 = -24893578 bor -40963721. +51041793 = -24893578 bxor -40963721. +-66584508 = -59162140 band -66275763. +-58853395 = -59162140 bor -66275763. +7731113 = -59162140 bxor -66275763. +16974850 = -41728766 band 24587795. +-34115821 = -41728766 bor 24587795. +-51090671 = -41728766 bxor 24587795. +91883584 = 91920464 band -42243511. +-42206631 = 91920464 bor -42243511. +-134090215 = 91920464 bxor -42243511. +84183118 = 90484558 band -40069009. +-33767569 = 90484558 bor -40069009. +-117950687 = 90484558 bxor -40069009. +24580 = 116975996 band 17261061. +134212477 = 116975996 bor 17261061. +134187897 = 116975996 bxor 17261061. +16394 = 81818202 band 33836171. +115637979 = 81818202 bor 33836171. +115621585 = 81818202 bxor 33836171. +27328768 = -106356376 band 60889473. +-72795671 = -106356376 bor 60889473. +-100124439 = -106356376 bxor 60889473. +-64945626 = -64792026 band -1497497. +-1343897 = -64792026 bor -1497497. +63601729 = -64792026 bxor -1497497. +41995284 = -89986028 band 113560765. +-18420547 = -89986028 bor 113560765. +-60415831 = -89986028 bxor 113560765. +122864130 = -10816846 band 123191811. +-10489165 = -10816846 bor 123191811. +-133353295 = -10816846 bxor 123191811. +-62638720 = -20138624 band -42567751. +-67655 = -20138624 bor -42567751. +62571065 = -20138624 bxor -42567751. +33555294 = 100763646 band 42629983. +109838335 = 100763646 bor 42629983. +76283041 = 100763646 bxor 42629983. +360484 = 17279404 band -50473355. +-33554435 = 17279404 bor -50473355. +-33914919 = 17279404 bxor -50473355. +33564170 = 48899594 band -83530117. +-68194693 = 48899594 bor -83530117. +-101758863 = 48899594 bxor -83530117. +84026512 = 119256216 band -43883279. +-8653575 = 119256216 bor -43883279. +-92680087 = 119256216 bxor -43883279. +4182 = 17602774 band 74610519. +92209111 = 17602774 bor 74610519. +92204929 = 17602774 bxor 74610519. +19071492 = -110919100 band 94854957. +-35135635 = -110919100 bor 94854957. +-54207127 = -110919100 bxor 94854957. +17899618 = 17919074 band -113430029. +-113410573 = 17919074 bor -113430029. +-131310191 = 17919074 bxor -113430029. +-117424096 = -113738064 band -3686103. +-71 = -113738064 bor -3686103. +117424025 = -113738064 bxor -3686103. +9234446 = 60681390 band 82770511. +134217455 = 60681390 bor 82770511. +124983009 = 60681390 bxor 82770511. +1197252 = 35575260 band 7489253. +41867261 = 35575260 bor 7489253. +40670009 = 35575260 bxor 7489253. +-130014166 = -60807750 band -129307541. +-60101125 = -60807750 bor -129307541. +69913041 = -60807750 bxor -129307541. +8478784 = 28406728 band -24810399. +-4882455 = 28406728 bor -24810399. +-13361239 = 28406728 bxor -24810399. +17358854 = -103095418 band 53077063. +-67377209 = -103095418 bor 53077063. +-84736063 = -103095418 bxor 53077063. +38405140 = 38667380 band 105606557. +105868797 = 38667380 bor 105606557. +67463657 = 38667380 bxor 105606557. +1060866 = -34491886 band 1474019. +-34078733 = -34491886 bor 1474019. +-35139599 = -34491886 bxor 1474019. +67125888 = 75559904 band 74860185. +83294201 = 75559904 bor 74860185. +16168313 = 75559904 bxor 74860185. +18879774 = 53796190 band -39250625. +-4334209 = 53796190 bor -39250625. +-23213983 = 53796190 bxor -39250625. +1122820 = 53571084 band 81507157. +133955421 = 53571084 bor 81507157. +132832601 = 53571084 bxor 81507157. +10567754 = -85102230 band 27510363. +-68159621 = -85102230 bor 27510363. +-78727375 = -85102230 bxor 27510363. +8457936 = -24289544 band 15806417. +-16941063 = -24289544 bor 15806417. +-25398999 = -24289544 bxor 15806417. +29894710 = -1492426 band 30305591. +-1081545 = -1492426 bor 30305591. +-30976255 = -1492426 bxor 30305591. +-133861372 = -105549148 band -100141043. +-71828819 = -105549148 bor -100141043. +62032553 = -105549148 bxor -100141043. +-100499006 = -100219966 band -23943725. +-23664685 = -100219966 bor -23943725. +76834321 = -100219966 bxor -23943725. +50921472 = 120132880 band -79099895. +-9888487 = 120132880 bor -79099895. +-60809959 = 120132880 bxor -79099895. +-100579314 = -25077234 band -78132177. +-2630097 = -25077234 bor -78132177. +97949217 = -25077234 bxor -78132177. +-9432572 = -888260 band -9364539. +-820227 = -888260 bor -9364539. +8612345 = -888260 bxor -9364539. +10225674 = -117634790 band 10419275. +-117441189 = -117634790 bor 10419275. +-127666863 = -117634790 bxor 10419275. +9728 = 26375720 band 105688897. +132054889 = 26375720 bor 105688897. +132045161 = 26375720 bxor 105688897. +22155302 = -112026394 band 64950823. +-69230873 = -112026394 bor 64950823. +-91386175 = -112026394 bxor 64950823. +77646932 = -22229804 band 99876477. +-259 = -22229804 bor 99876477. +-77647191 = -22229804 bxor 99876477. +41282 = 35365234 band 18917827. +54241779 = 35365234 bor 18917827. +54200497 = 35365234 bxor 18917827. +37945408 = -25959872 band 63374713. +-530567 = -25959872 bor 63374713. +-38475975 = -25959872 bxor 63374713. +39453214 = 67003070 band 39460639. +67010495 = 67003070 bor 39460639. +27557281 = 67003070 bxor 39460639. +32804 = 114614892 band 19497013. +134079101 = 114614892 bor 19497013. +134046297 = 114614892 bxor 19497013. +9014282 = 28961994 band 9145915. +29093627 = 28961994 bor 9145915. +20079345 = 28961994 bxor 9145915. +90351632 = -43796136 band 134146737. +-1031 = -43796136 bor 134146737. +-90352663 = -43796136 bxor 134146737. +-124648682 = -118355050 band -90516713. +-84223081 = -118355050 bor -90516713. +40425601 = -118355050 bxor -90516713. +33947652 = -83422460 band 48660717. +-68709395 = -83422460 bor 48660717. +-102657047 = -83422460 bxor 48660717. +-106231518 = -71611614 band -34633293. +-13389 = -71611614 bor -34633293. +106218129 = -71611614 bxor -34633293. +-64742816 = -26977424 band -46711063. +-8945671 = -26977424 bor -46711063. +55797145 = -26977424 bxor -46711063. +80086542 = 115799918 band -53539313. +-17825937 = 115799918 bor -53539313. +-97912479 = 115799918 bxor -53539313. +761988 = -116670820 band 112976037. +-4456771 = -116670820 bor 112976037. +-5218759 = -116670820 bxor 112976037. +531498 = 17767546 band -25658325. +-8422277 = 17767546 bor -25658325. +-8953775 = 17767546 bxor -25658325. +52699136 = 56895624 band 120513057. +124709545 = 56895624 bor 120513057. +72010409 = 56895624 bxor 120513057. +67141638 = -27097530 band 83931143. +-10308025 = -27097530 bor 83931143. +-77449663 = -27097530 bxor 83931143. +22430996 = 56050996 band -42565795. +-8945795 = 56050996 bor -42565795. +-31376791 = 56050996 bxor -42565795. +69222530 = 87081170 band 82724259. +100582899 = 87081170 bor 82724259. +31360369 = 87081170 bxor 82724259. +10518528 = 29196448 band 111195225. +129873145 = 29196448 bor 111195225. +119354617 = 29196448 bxor 111195225. +-99346402 = -13232098 band -90859265. +-4744961 = -13232098 bor -90859265. +94601441 = -13232098 bxor -90859265. +-125172732 = -91617588 band -123781867. +-90226723 = -91617588 bor -123781867. +34946009 = -91617588 bxor -123781867. +19169290 = 61315114 band -113981925. +-71836101 = 61315114 bor -113981925. +-91005391 = 61315114 bxor -113981925. +8552848 = 62309304 band -54291055. +-534599 = 62309304 bor -54291055. +-9087447 = 62309304 bxor -54291055. +97454326 = 100601078 band -3168009. +-21257 = 100601078 bor -3168009. +-97475583 = 100601078 bxor -3168009. +82862404 = 116417380 band 100334029. +133889005 = 116417380 bor 100334029. +51026601 = 116417380 bxor 100334029. +92471426 = 92734082 band -3416685. +-3154029 = 92734082 bor -3416685. +-95625455 = 92734082 bxor -3416685. +-100515392 = -100511280 band -20290103. +-20285991 = -100511280 bor -20290103. +80229401 = -100511280 bxor -20290103. +17073358 = -106511154 band 21807087. +-101777425 = -106511154 bor 21807087. +-118850783 = -106511154 bxor 21807087. +33722500 = 33733372 band -83192443. +-83181571 = 33733372 bor -83192443. +-116904071 = 33733372 bxor -83192443. +5131274 = 116285402 band 21982219. +133136347 = 116285402 bor 21982219. +128005073 = 116285402 bxor 21982219. +-115081216 = -46232856 band -110885631. +-42037271 = -46232856 bor -110885631. +73043945 = -46232856 bxor -110885631. +8560038 = -119365722 band 92716519. +-35209241 = -119365722 bor 92716519. +-43769279 = -119365722 bxor 92716519. +8413204 = -1741420 band 9105469. +-1049155 = -1741420 bor 9105469. +-9462359 = -1741420 bxor 9105469. +8458242 = -58126286 band 32985475. +-33599053 = -58126286 bor 32985475. +-42057295 = -58126286 bxor 32985475. +70337280 = -9056512 band 70996793. +-8396999 = -9056512 bor 70996793. +-78734279 = -9056512 bxor 70996793. +68386910 = 129236350 band -61635873. +-786433 = 129236350 bor -61635873. +-69173343 = 129236350 bxor -61635873. +-119486172 = -118957268 band -34280971. +-33752067 = -118957268 bor -34280971. +85734105 = -118957268 bxor -34280971. +-117022326 = -116493430 band -115905029. +-115376133 = -116493430 bor -115905029. +1646193 = -116493430 bxor -115905029. +85340176 = -39944680 band 91697265. +-33587591 = -39944680 bor 91697265. +-118927767 = -39944680 bxor 91697265. +-60805546 = -51888554 band -26939689. +-18022697 = -51888554 bor -26939689. +42782849 = -51888554 bxor -26939689. +615044 = 50947012 band 83714733. +134046701 = 50947012 bor 83714733. +133431657 = 50947012 bxor 83714733. +8495458 = 46262754 band -123756173. +-85988877 = 46262754 bor -123756173. +-94484335 = 46262754 bxor -123756173. +18511904 = 18544688 band 87719081. +87751865 = 18544688 bor 87719081. +69239961 = 18544688 bxor 87719081. +-58146802 = -6766034 band -53943857. +-2563089 = -6766034 bor -53943857. +55583713 = -6766034 bxor -53943857. +-117104060 = -76585124 band -48940443. +-8421507 = -76585124 bor -48940443. +108682553 = -76585124 bxor -48940443. +9618218 = -118303942 band 77319147. +-50603013 = -118303942 bor 77319147. +-60221231 = -118303942 bxor 77319147. +18879808 = 20553032 band 19142625. +20815849 = 20553032 bor 19142625. +1936041 = 20553032 bxor 19142625. +2631942 = 78309638 band 6896583. +82574279 = 78309638 bor 6896583. +79942337 = 78309638 bxor 6896583. +-18267884 = -1096204 band -18263779. +-1092099 = -1096204 bor -18263779. +17175785 = -1096204 bxor -18263779. +-131035902 = -109277294 band -88879773. +-67121165 = -109277294 bor -88879773. +63914737 = -109277294 bxor -88879773. +75808768 = 78957920 band -3218919. +-69767 = 78957920 bor -3218919. +-75878535 = 78957920 bxor -3218919. +-134213474 = -61861154 band -108274497. +-35922177 = -61861154 bor -108274497. +98291297 = -61861154 bxor -108274497. +-125827452 = -125214836 band -1931563. +-1318947 = -125214836 bor -1931563. +124508505 = -125214836 bxor -1931563. +132298 = 105283306 band -106199589. +-1048581 = 105283306 bor -106199589. +-1180879 = 105283306 bxor -106199589. +1091664 = 53667960 band 72465233. +125041529 = 53667960 bor 72465233. +123949865 = 53667960 bxor 72465233. +-16743242 = -8020042 band -11361097. +-2637897 = -8020042 bor -11361097. +14105345 = -8020042 bxor -11361097. +10489860 = 15340580 band -39470195. +-34619475 = 15340580 bor -39470195. +-45109335 = 15340580 bxor -39470195. +-121634494 = -87817918 band -119351981. +-85535405 = -87817918 bor -119351981. +36099089 = -87817918 bxor -119351981. +8782464 = 113659536 band 29328265. +134205337 = 113659536 bor 29328265. +125422873 = 113659536 bxor 29328265. +-49257586 = -40570994 band -12880977. +-4194385 = -40570994 bor -12880977. +45063201 = -40570994 bxor -12880977. +25281284 = 32097212 band -107753659. +-100937731 = 32097212 bor -107753659. +-126219015 = 32097212 bxor -107753659. +22286986 = 24409754 band -2778165. +-655397 = 24409754 bor -2778165. +-22942383 = 24409754 bxor -2778165. +-64677248 = -43163736 band -22603071. +-1089559 = -43163736 bor -22603071. +63587689 = -43163736 bxor -22603071. +-125820890 = -107781530 band -56612441. +-38573081 = -107781530 bor -56612441. +87247809 = -107781530 bxor -56612441. +557140 = -83046828 band 71934461. +-11669507 = -83046828 bor 71934461. +-12226647 = -83046828 bxor 71934461. +-117229502 = -110936334 band -40126141. +-33832973 = -110936334 bor -40126141. +83396529 = -110936334 bxor -40126141. +-124624704 = -91063360 band -124559111. +-90997767 = -91063360 bor -124559111. +33626937 = -91063360 bxor -124559111. +2228254 = 132274238 band 3581599. +133627583 = 132274238 bor 3581599. +131399329 = 132274238 bxor 3581599. +-134212700 = -66874388 band -115338315. +-48000003 = -66874388 bor -115338315. +86212697 = -66874388 bxor -115338315. +2164746 = -72893878 band 6884795. +-68173829 = -72893878 bor 6884795. +-70338575 = -72893878 bxor 6884795. +8913424 = -125041960 band 126563889. +-7391495 = -125041960 bor 126563889. +-16304919 = -125041960 bxor 126563889. +58720278 = -72404714 band 126929559. +-4195433 = -72404714 bor 126929559. +-62915711 = -72404714 bxor 126929559. +-131595260 = -30772092 band -106167187. +-5344019 = -30772092 bor -106167187. +126251241 = -30772092 bxor -106167187. +346146 = 15026338 band -49448653. +-34768461 = 15026338 bor -49448653. +-35114607 = 15026338 bxor -49448653. +1069152 = -98806544 band 26311273. +-73564423 = -98806544 bor 26311273. +-74633575 = -98806544 bxor 26311273. +68174990 = 74665198 band 77362575. +83852783 = 74665198 bor 77362575. +15677793 = 74665198 bxor 77362575. +-133672956 = -32911332 band -113355739. +-12594115 = -32911332 bor -113355739. +121078841 = -32911332 bxor -113355739. +104876458 = 113986042 band 108321707. +117431291 = 113986042 bor 108321707. +12554833 = 113986042 bxor 108321707. +-98500608 = -68038136 band -31126111. +-663639 = -68038136 bor -31126111. +97836969 = -68038136 bxor -31126111. +-115342458 = -76280890 band -48003193. +-8941625 = -76280890 bor -48003193. +106400833 = -76280890 bxor -48003193. +4326036 = 81135284 band -127671587. +-50862339 = 81135284 bor -127671587. +-55188375 = 81135284 bxor -127671587. +84218882 = 93658706 band 86447395. +95887219 = 93658706 bor 86447395. +11668337 = 93658706 bxor 86447395. +51712 = 103209504 band -104804391. +-1646599 = 103209504 bor -104804391. +-1698311 = 103209504 bxor -104804391. +4374558 = 21155230 band -95690625. +-78909953 = 21155230 bor -95690625. +-83284511 = 21155230 bxor -95690625. +6623236 = 32471116 band 6656149. +32504029 = 32471116 bor 6656149. +25880793 = 32471116 bxor 6656149. +76023178 = 92939690 band -20445797. +-3529285 = 92939690 bor -20445797. +-79552463 = 92939690 bxor -20445797. +-113147632 = -37630664 band -111435503. +-35918535 = -37630664 bor -111435503. +77229097 = -37630664 bxor -111435503. +-132882314 = -79891850 band -132685705. +-79695241 = -79891850 bor -132685705. +53187073 = -79891850 bxor -132685705. +71304260 = 73565412 band -20431539. +-18170387 = 73565412 bor -20431539. +-89474647 = 73565412 bxor -20431539. +68517890 = 75350018 band -40399597. +-33567469 = 75350018 bor -40399597. +-102085359 = 75350018 bxor -40399597. +69206336 = 104139600 band -35102391. +-169127 = 104139600 bor -35102391. +-69375463 = 104139600 bxor -35102391. +246350 = 17553998 band 82044783. +99352431 = 17553998 bor 82044783. +99106081 = 17553998 bxor 82044783. +4491268 = 73895036 band 13420805. +82824573 = 73895036 bor 13420805. +78333305 = 73895036 bxor 13420805. +54593802 = -78688934 band 133270411. +-12325 = -78688934 bor 133270411. +-54606127 = -78688934 bxor 133270411. +47509504 = 48165992 band 131461249. +132117737 = 48165992 bor 131461249. +84608233 = 48165992 bxor 131461249. +2114854 = -98245338 band 15422823. +-84937369 = -98245338 bor 15422823. +-87052223 = -98245338 bxor 15422823. +-52428012 = -52236524 band -17820739. +-17629251 = -52236524 bor -17820739. +34798761 = -52236524 bxor -17820739. +55058690 = 57290162 band 130932995. +133164467 = 57290162 bor 130932995. +78105777 = 57290162 bxor 130932995. +-125228928 = -125179776 band -91279687. +-91230535 = -125179776 bor -91279687. +33998393 = -125179776 bxor -91279687. +-113180066 = -79072514 band -37516705. +-3409153 = -79072514 bor -37516705. +109770913 = -79072514 bxor -37516705. +6294564 = 82119852 band -127206027. +-51380739 = 82119852 bor -127206027. +-57675303 = 82119852 bxor -127206027. +4210954 = -62537462 band 37776763. +-28971653 = -62537462 bor 37776763. +-33182607 = -62537462 bxor 37776763. +-18332784 = -18069608 band -328719. +-65543 = -18069608 bor -328719. +18267241 = -18069608 bxor -328719. +67527254 = 67560406 band -35756457. +-35723305 = 67560406 bor -35756457. +-103250559 = 67560406 bxor -35756457. +-131972092 = -114670268 band -21862867. +-4561043 = -114670268 bor -21862867. +127411049 = -114670268 bxor -21862867. +14745698 = 15034210 band -17231629. +-16943117 = 15034210 bor -17231629. +-31688815 = 15034210 bxor -17231629. +36188192 = 36204976 band -67356631. +-67339847 = 36204976 bor -67356631. +-103528039 = 36204976 bxor -67356631. +67141902 = -63531090 band 67750223. +-62922769 = -63531090 bor 67750223. +-130064671 = -63531090 bxor 67750223. +9578692 = 94042332 band 16199141. +100662781 = 94042332 bor 16199141. +91084089 = 94042332 bxor 16199141. +-46104534 = -44531526 band -3953813. +-2380805 = -44531526 bor -3953813. +43723729 = -44531526 bxor -3953813. +71352896 = 72140488 band -933023. +-145431 = 72140488 bor -933023. +-71498327 = 72140488 bxor -933023. +7176710 = 25030278 band 49255239. +67108807 = 25030278 bor 49255239. +59932097 = 25030278 bxor 49255239. +109184020 = -20215948 band 128332957. +-1067011 = -20215948 bor 128332957. +-110251031 = -20215948 bxor 128332957. +527362 = 70937874 band -133686045. +-63275533 = 70937874 bor -133686045. +-63802895 = 70937874 bxor -133686045. +-32365440 = -19683616 band -29983335. +-17301511 = -19683616 bor -29983335. +15063929 = -19683616 bxor -29983335. +75759646 = 80627806 band -57301953. +-52433793 = 80627806 bor -57301953. +-128193439 = 80627806 bxor -57301953. +-77049852 = -75738868 band -1549739. +-238755 = -75738868 bor -1549739. +76811097 = -75738868 bxor -1549739. +67241034 = 70421610 band 71976283. +75156859 = 70421610 bor 71976283. +7915825 = 70421610 bxor 71976283. +69288144 = 69431800 band -39762223. +-39618567 = 69431800 bor -39762223. +-108906711 = 69431800 bxor -39762223. +29688886 = 132449590 band 31317047. +134077751 = 132449590 bor 31317047. +104388865 = 132449590 bxor 31317047. +100676868 = -31869532 band 119701261. +-12845139 = -31869532 bor 119701261. +-113522007 = -31869532 bxor 119701261. +18875586 = -42713406 band 27919571. +-33669421 = -42713406 bor 27919571. +-52545007 = -42713406 bxor 27919571. +17074176 = 17729552 band -50004215. +-49348839 = 17729552 bor -50004215. +-66423015 = 17729552 bxor -50004215. +33685774 = -87325426 band 33954607. +-87056593 = -87325426 bor 33954607. +-120742367 = -87325426 bxor 33954607. +104071172 = -29616836 band 108364485. +-25323523 = -29616836 bor 108364485. +-129394695 = -29616836 bxor 108364485. +86122506 = 121562138 band 90389323. +125828955 = 121562138 bor 90389323. +39706449 = 121562138 bxor 90389323. +101711872 = -28096216 band 112232001. +-17576087 = -28096216 bor 112232001. +-119287959 = -28096216 bxor 112232001. +-134217434 = -111728666 band -98025177. +-75536409 = -111728666 bor -98025177. +58681025 = -111728666 bxor -98025177. +36062548 = 36163540 band -29473411. +-29372419 = 36163540 bor -29473411. +-65434967 = 36163540 bxor -29473411. +72206402 = 90037362 band 72206531. +90037491 = 90037362 bor 72206531. +17831089 = 90037362 bxor 72206531. +34346048 = 35394880 band 65977465. +67026297 = 35394880 bor 65977465. +32680249 = 35394880 bxor 65977465. +11013150 = -123122242 band 79310367. +-54825025 = -123122242 bor 79310367. +-65838175 = -123122242 bxor 79310367. +328996 = -129153684 band 26584885. +-102897795 = -129153684 bor 26584885. +-103226791 = -129153684 bxor 26584885. +-133659382 = -39286838 band -94532293. +-159749 = -39286838 bor -94532293. +133499633 = -39286838 bxor -94532293. +393232 = 25119832 band 8815025. +33541625 = 25119832 bor 8815025. +33148393 = 25119832 bxor 8815025. +868886 = 78599830 band -116538857. +-38807913 = 78599830 bor -116538857. +-39676799 = 78599830 bxor -116538857. +12617220 = 13161988 band 30443501. +30988269 = 13161988 bor 30443501. +18371049 = 13161988 bxor 30443501. +147490 = -41794014 band 35809459. +-6132045 = -41794014 bor 35809459. +-6279535 = -41794014 bxor 35809459. +3802208 = 33508976 band -29706775. +-7 = 33508976 bor -29706775. +-3802215 = 33508976 bxor -29706775. +-125796338 = -39673234 band -86975217. +-852113 = -39673234 bor -86975217. +124944225 = -39673234 bxor -86975217. +14860676 = 115532188 band -100677723. +-6211 = 115532188 bor -100677723. +-14866887 = 115532188 bxor -100677723. +-62377174 = -10848390 band -62375125. +-10846341 = -10848390 bor -62375125. +51530833 = -10848390 bxor -62375125. +-133547776 = -83199096 band -129353439. +-79004759 = -83199096 bor -129353439. +54543017 = -83199096 bxor -129353439. +25694470 = 92836166 band -108175609. +-41033913 = 92836166 bor -108175609. +-66728383 = 92836166 bxor -108175609. +-100646892 = -91240396 band -93305251. +-83898755 = -91240396 bor -93305251. +16748137 = -91240396 bxor -93305251. +286850 = 2915282 band 118940835. +121569267 = 2915282 bor 118940835. +121282417 = 2915282 bxor 118940835. +107684608 = 125514656 band 116386649. +134216697 = 125514656 bor 116386649. +26532089 = 125514656 bxor 116386649. +2097950 = -38632674 band 2697215. +-38033409 = -38632674 bor 2697215. +-40131359 = -38632674 bxor 2697215. +2809860 = -101717556 band 69919765. +-34607651 = -101717556 bor 69919765. +-37417511 = -101717556 bxor 69919765. +82968842 = 83866410 band 99763483. +100661051 = 83866410 bor 99763483. +17692209 = 83866410 bxor 99763483. +33719440 = 119002808 band 48409745. +133693113 = 119002808 bor 48409745. +99973673 = 119002808 bxor 48409745. +69474294 = 71161846 band 73799671. +75487223 = 71161846 bor 73799671. +6012929 = 71161846 bxor 73799671. +4489284 = -87054748 band 74744013. +-16800019 = -87054748 bor 74744013. +-21289303 = -87054748 bxor 74744013. +4340866 = 6782338 band -119915373. +-117473901 = 6782338 bor -119915373. +-121814767 = 6782338 bxor -119915373. +1066176 = 1230032 band -120234807. +-120070951 = 1230032 bor -120234807. +-121137127 = 1230032 bxor -120234807. +134862 = 26472398 band 107089647. +133427183 = 26472398 bor 107089647. +133292321 = 26472398 bxor 107089647. +351364 = 69688828 band 5110917. +74448381 = 69688828 bor 5110917. +74097017 = 69688828 bxor 5110917. +141834 = -134006054 band 65710859. +-68437029 = -134006054 bor 65710859. +-68578863 = -134006054 bxor 65710859. +8543232 = 9068008 band -50930687. +-50405911 = 9068008 bor -50930687. +-58949143 = 9068008 bxor -50930687. +141478 = 99232422 band 1502439. +100593383 = 99232422 bor 1502439. +100451905 = 99232422 bxor 1502439. +126890004 = 127627412 band -772291. +-34883 = 127627412 bor -772291. +-126924887 = 127627412 bxor -772291. +14303234 = -100775118 band 115044483. +-33869 = -100775118 bor 115044483. +-14337103 = -100775118 bxor 115044483. +512 = 590336 band -26080711. +-25490887 = 590336 bor -26080711. +-25491399 = 590336 bxor -26080711. +79724638 = 113371262 band 81433055. +115079679 = 113371262 bor 81433055. +35355041 = 113371262 bxor 81433055. +-94367708 = -84132308 band -94367499. +-84132099 = -84132308 bor -94367499. +10235609 = -84132308 bxor -94367499. +8391818 = 42995338 band 75525371. +110128891 = 42995338 bor 75525371. +101737073 = 42995338 bxor 75525371. +327952 = 17109272 band -85080207. +-68298887 = 17109272 bor -85080207. +-68626839 = 17109272 bxor -85080207. +4753750 = -60257962 band 14605783. +-50405929 = -60257962 bor 14605783. +-55159679 = -60257962 bxor 14605783. +12984452 = 29763268 band 13003181. +29781997 = 29763268 bor 13003181. +16797545 = 29763268 bxor 13003181. +4816994 = 24896738 band -95846285. +-75766541 = 24896738 bor -95846285. +-80583535 = 24896738 bxor -95846285. +33612576 = 39906096 band 34403241. +40696761 = 39906096 bor 34403241. +7084185 = 39906096 bxor 34403241. +-130998258 = -8950482 band -122572593. +-524817 = -8950482 bor -122572593. +130473441 = -8950482 bxor -122572593. +33554500 = 111250012 band -99081883. +-21386371 = 111250012 bor -99081883. +-54940871 = 111250012 bxor -99081883. +125831722 = -7262662 band 130190059. +-2904325 = -7262662 bor 130190059. +-128736047 = -7262662 bxor 130190059. +15360064 = 15396936 band -118591775. +-118554903 = 15396936 bor -118591775. +-133914967 = 15396936 bxor -118591775. +1105926 = 106165254 band -121836857. +-16777529 = 106165254 bor -121836857. +-17883455 = 106165254 bxor -121836857. +75630612 = 81971444 band -25028579. +-18687747 = 81971444 bor -25028579. +-94318359 = 81971444 bxor -25028579. +67323906 = 69946002 band 101936227. +104558323 = 69946002 bor 101936227. +37234417 = 69946002 bxor 101936227. +-124977152 = -119701408 band -38987495. +-33711751 = -119701408 bor -38987495. +91265401 = -119701408 bxor -38987495. +8808862 = 45055454 band 80112575. +116359167 = 45055454 bor 80112575. +107550305 = 45055454 bxor 80112575. +34078852 = 34226828 band 49098197. +49246173 = 34226828 bor 49098197. +15167321 = 34226828 bxor 49098197. +-92274486 = -89024022 band -8387365. +-5136901 = -89024022 bor -8387365. +87137585 = -89024022 bxor -8387365. +39768656 = 123665272 band -85994927. +-2098311 = 123665272 bor -85994927. +-41866967 = 123665272 bxor -85994927. +117441206 = -16291146 band 124785591. +-8946761 = -16291146 bor 124785591. +-126387967 = -16291146 bxor 124785591. +71582212 = 121919268 band 75383437. +125720493 = 121919268 bor 75383437. +54138281 = 121919268 bxor 75383437. +13378 = -132678590 band 115881043. +-16810925 = -132678590 bor 115881043. +-16824303 = -132678590 bxor 115881043. +-134135680 = -66993776 band -82216311. +-15074407 = -66993776 bor -82216311. +119061273 = -66993776 bxor -82216311. +2425486 = -64677234 band 28820143. +-38282577 = -64677234 bor 28820143. +-40708063 = -64677234 bxor 28820143. +9732 = -85367108 band 68564549. +-16812291 = -85367108 bor 68564549. +-16822023 = -85367108 bxor 68564549. +4477066 = 6050202 band -12068149. +-10495013 = 6050202 bor -12068149. +-14972079 = 6050202 bxor -12068149. +-130011008 = -96193880 band -60231231. +-26414103 = -96193880 bor -60231231. +103596905 = -96193880 bxor -60231231. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/eq_32.dat erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/eq_32.dat --- erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/eq_32.dat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/eq_32.dat 1997-11-09 23:03:02.000000000 +0000 @@ -0,0 +1,3000 @@ +1082131525 = 1621645175 band 1154714701. +1694228351 = 1621645175 bor 1154714701. +612096826 = 1621645175 bxor 1154714701. +46178305 = 599847955 band 182034505. +735704155 = 599847955 bor 182034505. +689525850 = 599847955 bxor 182034505. +-1055868923 = -507724177 band -988612603. +-440467857 = -507724177 bor -988612603. +615401066 = -507724177 bxor -988612603. +-1962933631 = -1358900597 band -1949298815. +-1345265781 = -1358900597 bor -1949298815. +617667850 = -1358900597 bxor -1949298815. +1093140517 = 1730677863 band 1106059965. +1743597311 = 1730677863 bor 1106059965. +650456794 = 1730677863 bxor 1106059965. +9308161 = 715065347 band 30289337. +736046523 = 715065347 bor 30289337. +726738362 = 715065347 bxor 30289337. +-905961387 = -369090209 band -837096331. +-300225153 = -369090209 bor -837096331. +605736234 = -369090209 bxor -837096331. +-2111156111 = -1422953349 band -2110072079. +-1421869317 = -1422953349 bor -2110072079. +689286794 = -1422953349 bxor -2110072079. +1141904645 = 1681317207 band 1318139181. +1857551743 = 1681317207 bor 1318139181. +715647098 = 1681317207 bxor 1318139181. +73463585 = 669120499 band 209254185. +804911099 = 669120499 bor 209254185. +731447514 = 669120499 bxor 209254185. +-1073741755 = -535158705 band -973021979. +-434438929 = -535158705 bor -973021979. +639302826 = -535158705 bxor -973021979. +-2147327391 = -1576897941 band -1922604447. +-1352174997 = -1576897941 bor -1922604447. +795152394 = -1576897941 bxor -1922604447. +1079165445 = 1741933127 band 1079427997. +1742195679 = 1741933127 bor 1079427997. +663030234 = 1741933127 bxor 1079427997. +6340737 = 746111971 band 48299161. +788070395 = 746111971 bor 48299161. +781729658 = 746111971 bxor 48299161. +-1003910891 = -454444225 band -834942635. +-285475969 = -454444225 bor -834942635. +718434922 = -454444225 bxor -834942635. +-2096593839 = -1555510181 band -1891850799. +-1350767141 = -1555510181 bor -1891850799. +745826698 = -1555510181 bxor -1891850799. +1083490821 = 1874711351 band 1083493901. +1874714431 = 1874711351 bor 1083493901. +791223610 = 1874711351 bxor 1083493901. +10753 = 588409811 band 214777353. +803176411 = 588409811 bor 214777353. +803165658 = 588409811 bxor 214777353. +-1006587899 = -284298705 band -1006456379. +-284167185 = -284298705 bor -1006456379. +722420714 = -284298705 bxor -1006456379. +-2147385279 = -1601076661 band -2124307135. +-1577998517 = -1601076661 bor -2124307135. +569386762 = -1601076661 bxor -2124307135. +1147293733 = 1735653415 band 1281512573. +1869872255 = 1735653415 bor 1281512573. +722578522 = 1735653415 bxor 1281512573. +305985 = 538832835 band 29670265. +568197115 = 538832835 bor 29670265. +567891130 = 538832835 bxor 29670265. +-1069251563 = -354040545 band -1068722635. +-353511617 = -354040545 bor -1068722635. +715739946 = -354040545 bxor -1068722635. +-2060910543 = -1389652933 band -2059575119. +-1388317509 = -1389652933 bor -2059575119. +672593034 = -1389652933 bxor -2059575119. +1075056645 = 1748318487 band 1150703341. +1823965183 = 1748318487 bor 1150703341. +748908538 = 1748318487 bxor 1150703341. +17450145 = 566906803 band 151942377. +701399035 = 566906803 bor 151942377. +683948890 = 566906803 bxor 151942377. +-1030736891 = -359648241 band -942639451. +-271550801 = -359648241 bor -942639451. +759186090 = -359648241 bxor -942639451. +-2111438815 = -1373240789 band -2080974815. +-1342776789 = -1373240789 bor -2080974815. +768662026 = -1373240789 bxor -2080974815. +1224774661 = 1761646087 band 1304941917. +1841813343 = 1761646087 bor 1304941917. +617038682 = 1761646087 bxor 1304941917. +2561 = 537299875 band 162622041. +699919355 = 537299875 bor 162622041. +699916794 = 537299875 bxor 162622041. +-1056697835 = -437502209 band -888843499. +-269647873 = -437502209 bor -888843499. +787049962 = -437502209 bxor -888843499. +-1975187439 = -1437610981 band -1904931951. +-1367355493 = -1437610981 bor -1904931951. +607831946 = -1437610981 bxor -1904931951. +1074073285 = 1855262455 band 1078841293. +1860030463 = 1855262455 bor 1078841293. +785957178 = 1855262455 bxor 1078841293. +134251393 = 746693523 band 175414217. +787856347 = 746693523 bor 175414217. +653604954 = 746693523 bxor 175414217. +-1040178811 = -359078417 band -970839163. +-289738769 = -359078417 bor -970839163. +750440042 = -359078417 bxor -970839163. +-2011762175 = -1439174133 band -1923155199. +-1350567157 = -1439174133 bor -1923155199. +661195018 = -1439174133 bxor -1923155199. +1211171365 = 1802609639 band 1212106301. +1803544575 = 1802609639 bor 1212106301. +592373210 = 1802609639 bxor 1212106301. +9044225 = 581605251 band 31394105. +603955131 = 581605251 bor 31394105. +594910906 = 581605251 bxor 31394105. +-1055577899 = -336254753 band -1054998539. +-335675393 = -336254753 bor -1054998539. +719902506 = -336254753 bxor -1054998539. +-2146885007 = -1473416197 band -2128894351. +-1455425541 = -1473416197 bor -2128894351. +691459466 = -1473416197 bxor -2128894351. +1162940549 = 1876251863 band 1165179053. +1878490367 = 1876251863 bor 1165179053. +715549818 = 1876251863 bxor 1165179053. +103817761 = 665872243 band 104313513. +666367995 = 665872243 bor 104313513. +562550234 = 665872243 bxor 104313513. +-1021312955 = -484440113 band -810561435. +-273688593 = -484440113 bor -810561435. +747624362 = -484440113 bxor -810561435. +-2146303519 = -1606462997 band -2116940319. +-1577099797 = -1606462997 bor -2116940319. +569203722 = -1606462997 bxor -2116940319. +1233133829 = 1774133703 band 1266722589. +1807722463 = 1774133703 bor 1266722589. +574588634 = 1774133703 bxor 1266722589. +142610433 = 713167715 band 226859033. +797416315 = 713167715 bor 226859033. +654805882 = 713167715 bxor 226859033. +-1068990315 = -285703489 band -1051812651. +-268525825 = -285703489 bor -1051812651. +800464490 = -285703489 bxor -1051812651. +-2144861871 = -1606644773 band -1888931503. +-1350714405 = -1606644773 bor -1888931503. +794147466 = -1606644773 bxor -1888931503. +1085145221 = 1693321911 band 1103008141. +1711184831 = 1693321911 bor 1103008141. +626039610 = 1693321911 bxor 1103008141. +26122497 = 600742739 band 227522953. +802143195 = 600742739 bor 227522953. +776020698 = 600742739 bxor 227522953. +-1072627451 = -467822161 band -1053727419. +-448922129 = -467822161 bor -1053727419. +623705322 = -467822161 bxor -1053727419. +-2122317631 = -1481367093 band -2121789247. +-1480838709 = -1481367093 bor -2121789247. +641478922 = -1481367093 bxor -2121789247. +1111558053 = 1793134503 band 1128527869. +1810104319 = 1793134503 bor 1128527869. +698546266 = 1793134503 bxor 1128527869. +33822273 = 637861699 band 199038713. +803078139 = 637861699 bor 199038713. +769255866 = 637861699 bxor 199038713. +-1001518955 = -319927137 band -967890507. +-286298689 = -319927137 bor -967890507. +715220266 = -319927137 bxor -967890507. +-2020278223 = -1477110853 band -2020234191. +-1477066821 = -1477110853 bor -2020234191. +543211402 = -1477110853 bxor -2020234191. +1120342021 = 1658269847 band 1323817581. +1861745407 = 1658269847 bor 1323817581. +741403386 = 1658269847 bxor 1323817581. +219426849 = 760495923 band 229945449. +771014523 = 760495923 bor 229945449. +551587674 = 760495923 bxor 229945449. +-1056404987 = -376857713 band -1017189851. +-337642577 = -376857713 bor -1017189851. +718762410 = -376857713 bxor -1017189851. +-2146958943 = -1542561365 band -2001140831. +-1396743253 = -1542561365 bor -2001140831. +750215690 = -1542561365 bxor -2001140831. +1094789253 = 1640983943 band 1195456733. +1741651423 = 1640983943 bor 1195456733. +646862170 = 1640983943 bxor 1195456733. +134807809 = 799759139 band 136152537. +801103867 = 799759139 bor 136152537. +666296058 = 799759139 bxor 136152537. +-960068075 = -271677825 band -958945643. +-270555393 = -271677825 bor -958945643. +689512682 = -271677825 bxor -958945643. +-2134310127 = -1597043813 band -2082924783. +-1545658469 = -1597043813 bor -2082924783. +588651658 = -1597043813 bxor -2082924783. +1115685445 = 1787348599 band 1118245709. +1789908863 = 1787348599 bor 1118245709. +674223418 = 1787348599 bxor 1118245709. +211292929 = 750342931 band 266245961. +805295963 = 750342931 bor 266245961. +594003034 = 750342931 bxor 266245961. +-900723451 = -346288785 band -890216699. +-335782033 = -346288785 bor -890216699. +564941418 = -346288785 bxor -890216699. +-2071723903 = -1530523253 band -1885542783. +-1344342133 = -1530523253 bor -1885542783. +727381770 = -1530523253 bxor -1885542783. +1224747301 = 1837251431 band 1261463997. +1873968127 = 1837251431 bor 1261463997. +649220826 = 1837251431 bxor 1261463997. +158082049 = 770516739 band 159311033. +771745723 = 770516739 bor 159311033. +613663674 = 770516739 bxor 159311033. +-981462955 = -309252001 band -979365003. +-307154049 = -309252001 bor -979365003. +674308906 = -309252001 bxor -979365003. +-2008911503 = -1472040069 band -1972669967. +-1435798533 = -1472040069 bor -1972669967. +573112970 = -1472040069 bxor -1972669967. +1219496965 = 1761266775 band 1320434733. +1862204543 = 1761266775 bor 1320434733. +642707578 = 1761266775 bxor 1320434733. +4539937 = 645256947 band 155545129. +796262139 = 645256947 bor 155545129. +791722202 = 645256947 bxor 155545129. +-930299067 = -309530801 band -929184795. +-308416529 = -309530801 bor -929184795. +621882538 = -309530801 bxor -929184795. +-2143080095 = -1521274517 band -1972651679. +-1350846101 = -1521274517 bor -1972651679. +792233994 = -1521274517 bxor -1972651679. +1220610053 = 1760655687 band 1321831069. +1861876703 = 1760655687 bor 1321831069. +641266650 = 1760655687 bxor 1321831069. +50340481 = 591553251 band 54080409. +595293179 = 591553251 bor 54080409. +544952698 = 591553251 bxor 54080409. +-1071628267 = -399619521 band -1050644395. +-378635649 = -399619521 bor -1050644395. +692992618 = -399619521 bxor -1050644395. +-2054944687 = -1480111269 band -1920680751. +-1345847333 = -1480111269 bor -1920680751. +709097354 = -1480111269 bxor -1920680751. +1074085893 = 1730495031 band 1086805261. +1743214399 = 1730495031 bor 1086805261. +669128506 = 1730495031 bxor 1086805261. +184614913 = 721537747 band 186725641. +723648475 = 721537747 bor 186725641. +539033562 = 721537747 bxor 186725641. +-1072431099 = -535543505 band -920708923. +-383821329 = -535543505 bor -920708923. +688609770 = -535543505 bxor -920708923. +-1995620287 = -1389510325 band -1990362047. +-1384252085 = -1389510325 bor -1990362047. +611368202 = -1389510325 bxor -1990362047. +1224999717 = 1796548391 band 1304730493. +1876279167 = 1796548391 bor 1304730493. +651279450 = 1796548391 bxor 1304730493. +67109441 = 774049475 band 75788921. +782728955 = 774049475 bor 75788921. +715619514 = 774049475 bxor 75788921. +-997157867 = -308423649 band -992953035. +-304218817 = -308423649 bor -992953035. +692939050 = -308423649 bxor -992953035. +-2141940943 = -1529507013 band -1956841551. +-1344407621 = -1529507013 bor -1956841551. +797533322 = -1529507013 bxor -1956841551. +1107298309 = 1778395159 band 1117281773. +1788378623 = 1778395159 bor 1117281773. +681080314 = 1778395159 bxor 1117281773. +42019489 = 651505331 band 44690409. +654176251 = 651505331 bor 44690409. +612156762 = 651505331 bxor 44690409. +-1004011259 = -286653681 band -986948187. +-269590609 = -286653681 bor -986948187. +734420650 = -286653681 bxor -986948187. +-2004352735 = -1345470165 band -2002112735. +-1343230165 = -1345470165 bor -2002112735. +661122570 = -1345470165 bxor -2002112735. +1187054597 = 1726301447 band 1339661405. +1878908255 = 1726301447 bor 1339661405. +691853658 = 1726301447 bxor 1339661405. +134225921 = 688335523 band 144220505. +698330107 = 688335523 bor 144220505. +564104186 = 688335523 bxor 144220505. +-964638699 = -405287425 band -962004459. +-402653185 = -405287425 bor -962004459. +561985514 = -405287425 bxor -962004459. +-2145123823 = -1595585765 band -1909710191. +-1360172133 = -1595585765 bor -1909710191. +784951690 = -1595585765 bxor -1909710191. +1082348741 = 1652784631 band 1239373517. +1809809407 = 1652784631 bor 1239373517. +727460666 = 1652784631 bxor 1239373517. +641 = 577241747 band 152539849. +729780955 = 577241747 bor 152539849. +729780314 = 577241747 bxor 152539849. +-1073475451 = -502909713 band -1048735099. +-478169361 = -502909713 bor -1048735099. +595306090 = -502909713 bxor -1048735099. +-2138501119 = -1398066933 band -2138451455. +-1398017269 = -1398066933 bor -2138451455. +740483850 = -1398066933 bxor -2138451455. +1212186661 = 1801048807 band 1220578621. +1809440767 = 1801048807 bor 1220578621. +597254106 = 1801048807 bxor 1220578621. +35946497 = 711374467 band 112050233. +787478203 = 711374467 bor 112050233. +751531706 = 711374467 bxor 112050233. +-931125547 = -321636385 band -912185611. +-302696449 = -321636385 bor -912185611. +628429098 = -321636385 bxor -912185611. +-2010501007 = -1452379397 band -1943388815. +-1385267205 = -1452379397 bor -1943388815. +625233802 = -1452379397 bxor -1943388815. +1208222597 = 1839678423 band 1213480877. +1844936703 = 1839678423 bor 1213480877. +636714106 = 1839678423 bxor 1213480877. +35782689 = 573720179 band 60959145. +598896635 = 573720179 bor 60959145. +563113946 = 573720179 bxor 60959145. +-868182459 = -312420657 band -825575579. +-269813777 = -312420657 bor -825575579. +598368682 = -312420657 bxor -825575579. +-2060189471 = -1354886933 band -2060163871. +-1354861333 = -1354886933 bor -2060163871. +705328138 = -1354886933 bxor -2060163871. +1075855365 = 1667944647 band 1211199005. +1803288287 = 1667944647 bor 1211199005. +727432922 = 1667944647 bxor 1211199005. +12157441 = 616149603 band 33279769. +637271931 = 616149603 bor 33279769. +625114490 = 616149603 bxor 33279769. +-872349291 = -292875841 band -864992299. +-285518849 = -292875841 bor -864992299. +586830442 = -292875841 bxor -864992299. +-2021062575 = -1477899557 band -2020652975. +-1477489957 = -1477899557 bor -2020652975. +543572618 = -1477899557 bxor -2020652975. +1076041861 = 1684240823 band 1269766285. +1877965247 = 1684240823 bor 1269766285. +801923386 = 1684240823 bxor 1269766285. +42053633 = 648804947 band 58830985. +665582299 = 648804947 bor 58830985. +623528666 = 648804947 bxor 58830985. +-1061042171 = -521017169 band -909390779. +-369365777 = -521017169 bor -909390779. +691676394 = -521017169 bxor -909390779. +-2032115519 = -1359060789 band -2032015423. +-1358960693 = -1359060789 bor -2032015423. +673154826 = -1359060789 bxor -2032015423. +1073757861 = 1712340647 band 1239695101. +1878277887 = 1712340647 bor 1239695101. +804520026 = 1712340647 bxor 1239695101. +3673153 = 645406275 band 163237369. +804970491 = 645406275 bor 163237369. +801297338 = 645406275 bxor 163237369. +-925871979 = -353084513 band -909029195. +-336241729 = -353084513 bor -909029195. +589630250 = -353084513 bxor -909029195. +-2139028943 = -1580395845 band -1902951631. +-1344318533 = -1580395845 bor -1902951631. +794710410 = -1580395845 bxor -1902951631. +1235222789 = 1806704535 band 1302847853. +1874329599 = 1806704535 bor 1302847853. +639106810 = 1806704535 bxor 1302847853. +72091169 = 743251507 band 99493737. +770654075 = 743251507 bor 99493737. +698562906 = 743251507 bxor 99493737. +-936361979 = -391026033 band -885468891. +-340132945 = -391026033 bor -885468891. +596229034 = -391026033 bxor -885468891. +-2126511967 = -1352392533 band -2117444959. +-1343325525 = -1352392533 bor -2117444959. +783186442 = -1352392533 bxor -2117444959. +1140857989 = 1715608711 band 1167130589. +1741881311 = 1715608711 bor 1167130589. +601023322 = 1715608711 bxor 1167130589. +134264833 = 706345507 band 153271513. +725352187 = 706345507 bor 153271513. +591087354 = 706345507 bxor 153271513. +-938998507 = -335014529 band -931574379. +-327590401 = -335014529 bor -931574379. +611408106 = -335014529 bxor -931574379. +-2013132271 = -1466791269 band -1955713519. +-1409372517 = -1466791269 bor -1955713519. +603759754 = -1466791269 bxor -1955713519. +1082396741 = 1686451575 band 1140234829. +1744289663 = 1686451575 bor 1140234829. +661892922 = 1686451575 bxor 1140234829. +885249 = 730706451 band 69176905. +798998107 = 730706451 bor 69176905. +798112858 = 730706451 bxor 69176905. +-998161403 = -325624721 band -943077883. +-270541201 = -325624721 bor -943077883. +727620202 = -325624721 bxor -943077883. +-1910173567 = -1343795061 band -1910129279. +-1343750773 = -1343795061 bor -1910129279. +566422794 = -1343795061 bxor -1910129279. +1122508837 = 1660447335 band 1324331197. +1862269695 = 1660447335 bor 1324331197. +739760858 = 1660447335 bxor 1324331197. +100860417 = 639059459 band 124492729. +662691771 = 639059459 bor 124492729. +561831354 = 639059459 bxor 124492729. +-1021298091 = -406962337 band -887014795. +-272679041 = -406962337 bor -887014795. +748619050 = -406962337 bxor -887014795. +-2146434959 = -1447988613 band -2074605327. +-1376158981 = -1447988613 bor -2074605327. +770275978 = -1447988613 bxor -2074605327. +1079116549 = 1809496919 band 1079198509. +1809578879 = 1809496919 bor 1079198509. +730462330 = 1809496919 bxor 1079198509. +4564257 = 686142963 band 55436585. +737015291 = 686142963 bor 55436585. +732451034 = 686142963 bxor 55436585. +-1072518587 = -526664113 band -1070159131. +-524304657 = -526664113 bor -1070159131. +548213930 = -526664113 bxor -1070159131. +-2144595871 = -1409290133 band -2144595871. +-1409290133 = -1409290133 bor -2144595871. +735305738 = -1409290133 bxor -2144595871. +1160249349 = 1730881607 band 1169707421. +1740339679 = 1730881607 bor 1169707421. +580090330 = 1730881607 bxor 1169707421. +80216193 = 753402339 band 130902681. +804088827 = 753402339 bor 130902681. +723872634 = 753402339 bxor 130902681. +-1073737451 = -535897793 band -1065281707. +-527442049 = -535897793 bor -1065281707. +546295402 = -535897793 bxor -1065281707. +-1971273135 = -1365128613 band -1953967151. +-1347822629 = -1365128613 bor -1953967151. +623450506 = -1365128613 bxor -1953967151. +1075875845 = 1789440311 band 1081465869. +1795030335 = 1789440311 bor 1081465869. +719154490 = 1789440311 bxor 1081465869. +75573249 = 617425363 band 78720009. +620572123 = 617425363 bor 78720009. +544998874 = 617425363 bxor 78720009. +-1070198779 = -457797585 band -1053327419. +-440926225 = -457797585 bor -1053327419. +629272554 = -457797585 bxor -1053327419. +-2013003711 = -1423572917 band -2011868351. +-1422437557 = -1423572917 bor -2011868351. +590566154 = -1423572917 bxor -2011868351. +1099055653 = 1775392295 band 1168302717. +1844639359 = 1775392295 bor 1168302717. +745583706 = 1775392295 bxor 1168302717. +151005505 = 755248579 band 159394169. +763637243 = 755248579 bor 159394169. +612631738 = 755248579 bxor 159394169. +-1034887147 = -487464161 band -1018108875. +-470685889 = -487464161 bor -1018108875. +564201258 = -487464161 bxor -1018108875. +-1944550863 = -1394896325 band -1892118863. +-1342464325 = -1394896325 bor -1892118863. +602086538 = -1394896325 bxor -1892118863. +1141244933 = 1709643543 band 1310090477. +1878489087 = 1709643543 bor 1310090477. +737244154 = 1709643543 bxor 1310090477. +25165985 = 733744563 band 92365545. +800944123 = 733744563 bor 92365545. +775778138 = 733744563 bxor 92365545. +-1065074683 = -455093745 band -1014741851. +-404760913 = -455093745 bor -1014741851. +660313770 = -455093745 bxor -1014741851. +-2146336735 = -1596882901 band -2112256479. +-1562802645 = -1596882901 bor -2112256479. +583534090 = -1596882901 bxor -2112256479. +1147494405 = 1843786759 band 1181180765. +1877473119 = 1843786759 bor 1181180765. +729978714 = 1843786759 bxor 1181180765. +10733569 = 551799203 band 129751129. +670816763 = 551799203 bor 129751129. +660083194 = 551799203 bxor 129751129. +-901251051 = -362849025 band -901209835. +-362807809 = -362849025 bor -901209835. +538443242 = -362849025 bxor -901209835. +-2120873967 = -1512650213 band -1986053743. +-1377829989 = -1512650213 bor -1986053743. +743043978 = -1512650213 bxor -1986053743. +1317850309 = 1854794999 band 1324146125. +1861090815 = 1854794999 bor 1324146125. +543240506 = 1854794999 bxor 1324146125. +102891905 = 640311699 band 251038153. +788457947 = 640311699 bor 251038153. +685566042 = 640311699 bxor 251038153. +-922451579 = -384859153 band -875234939. +-337642513 = -384859153 bor -875234939. +584809066 = -384859153 bxor -875234939. +-2073026559 = -1401262069 band -2039437055. +-1367672565 = -1401262069 bor -2039437055. +705353994 = -1401262069 bxor -2039437055. +1109131301 = 1650328039 band 1270731837. +1811928575 = 1650328039 bor 1270731837. +702797274 = 1650328039 bxor 1270731837. +146298113 = 788452739 band 163084089. +805238715 = 788452739 bor 163084089. +658940602 = 788452739 bxor 163084089. +-939506475 = -330348833 band -937406987. +-328249345 = -330348833 bor -937406987. +611257130 = -330348833 bxor -937406987. +-2147463055 = -1492422149 band -2131438479. +-1476397573 = -1492422149 bor -2131438479. +671065482 = -1492422149 bxor -2131438479. +1083245189 = 1637167831 band 1152468653. +1706391295 = 1637167831 bor 1152468653. +623146106 = 1637167831 bxor 1152468653. +8225 = 680535411 band 105423017. +785950203 = 680535411 bor 105423017. +785941978 = 680535411 bxor 105423017. +-1071545275 = -448944689 band -891183515. +-268582929 = -448944689 bor -891183515. +802962346 = -448944689 bxor -891183515. +-1995404319 = -1449603093 band -1991066655. +-1445265429 = -1449603093 bor -1991066655. +550138890 = -1449603093 bxor -1991066655. +1074935045 = 1647476679 band 1163801885. +1736343519 = 1647476679 bor 1163801885. +661408474 = 1647476679 bxor 1163801885. +9175041 = 701321571 band 44959257. +737105787 = 701321571 bor 44959257. +727930746 = 701321571 bxor 44959257. +-896950123 = -356933441 band -879760683. +-339744001 = -356933441 bor -879760683. +557206122 = -356933441 bxor -879760683. +-2123298479 = -1443788325 band -2022613167. +-1343103013 = -1443788325 bor -2022613167. +780195466 = -1443788325 bxor -2022613167. +1158711429 = 1744103607 band 1293655949. +1879048127 = 1744103607 bor 1293655949. +720336698 = 1744103607 bxor 1293655949. +2425089 = 593844563 band 212838281. +804257755 = 593844563 bor 212838281. +801832666 = 593844563 bxor 212838281. +-916311291 = -379439185 band -849202363. +-312330257 = -379439185 bor -849202363. +603981034 = -379439185 bxor -849202363. +-1968922943 = -1348165685 band -1963475263. +-1342718005 = -1348165685 bor -1963475263. +626204938 = -1348165685 bxor -1963475263. +1140852133 = 1683713447 band 1325434365. +1868295679 = 1683713447 bor 1325434365. +727443546 = 1683713447 bxor 1325434365. +29623361 = 801586499 band 30704889. +802668027 = 801586499 bor 30704889. +773044666 = 801586499 bxor 30704889. +-1022991723 = -476681569 band -816875595. +-270565441 = -476681569 bor -816875595. +752426282 = -476681569 bxor -816875595. +-2147479503 = -1543433797 band -1957897679. +-1353851973 = -1543433797 bor -1957897679. +793627530 = -1543433797 bxor -1957897679. +1084295173 = 1722093207 band 1105455213. +1743253247 = 1722093207 bor 1105455213. +658958074 = 1722093207 bxor 1105455213. +52534305 = 589430067 band 258186857. +795082619 = 589430067 bor 258186857. +742548314 = 589430067 bxor 258186857. +-1073465339 = -512411249 band -871450587. +-310396497 = -512411249 bor -871450587. +763068842 = -512411249 bxor -871450587. +-2112515679 = -1575624789 band -2020101727. +-1483210837 = -1575624789 bor -2020101727. +629304842 = -1575624789 bxor -2020101727. +1079034501 = 1808845703 band 1079822045. +1809633247 = 1808845703 bor 1079822045. +730598746 = 1808845703 bxor 1079822045. +39883009 = 728013091 band 40104921. +728235003 = 728013091 bor 40104921. +688351994 = 728013091 bxor 40104921. +-1072389099 = -522345345 band -904465259. +-354421505 = -522345345 bor -904465259. +717967594 = -522345345 bxor -904465259. +-2035154671 = -1498281573 band -2034285295. +-1497412197 = -1498281573 bor -2034285295. +537742474 = -1498281573 bxor -2034285295. +1216356421 = 1855825015 band 1220682061. +1860150655 = 1855825015 bor 1220682061. +643794234 = 1855825015 bxor 1220682061. +1835265 = 540938515 band 127698249. +666801499 = 540938515 bor 127698249. +664966234 = 540938515 bxor 127698249. +-1056036603 = -445731985 band -878760699. +-268456081 = -445731985 bor -878760699. +787580522 = -445731985 bxor -878760699. +-2141158271 = -1604022389 band -2023058303. +-1485922421 = -1604022389 bor -2023058303. +655235850 = -1604022389 bxor -2023058303. +1158320421 = 1737136487 band 1294661565. +1873477631 = 1737136487 bor 1294661565. +715157210 = 1737136487 bxor 1294661565. +51658753 = 589128963 band 194269881. +731740091 = 589128963 bor 194269881. +680081338 = 589128963 bxor 194269881. +-930725803 = -393785761 band -828481163. +-291541121 = -393785761 bor -828481163. +639184682 = -393785761 bxor -828481163. +-2147479183 = -1350798981 band -2147442703. +-1350762501 = -1350798981 bor -2147442703. +796716682 = -1350798981 bxor -2147442703. +1078331909 = 1826007639 band 1131301421. +1878977151 = 1826007639 bor 1131301421. +800645242 = 1826007639 bxor 1131301421. +168825889 = 791778547 band 177364009. +800316667 = 791778547 bor 177364009. +631490778 = 791778547 bxor 177364009. +-935165627 = -381252273 band -859074075. +-305160721 = -381252273 bor -859074075. +630004906 = -381252273 bxor -859074075. +-2046285983 = -1509380245 band -1901566111. +-1364660373 = -1509380245 bor -1901566111. +681625610 = -1509380245 bxor -1901566111. +1073745925 = 1652610887 band 1159927965. +1738792927 = 1652610887 bor 1159927965. +665047002 = 1652610887 bxor 1159927965. +630913 = 694788323 band 10330521. +704487931 = 694788323 bor 10330521. +703857018 = 694788323 bxor 10330521. +-930535403 = -326408129 band -878854571. +-274727297 = -326408129 bor -878854571. +655808106 = -326408129 bxor -878854571. +-2125969327 = -1478997669 band -1991709999. +-1344738341 = -1478997669 bor -1991709999. +781230986 = -1478997669 bxor -1991709999. +1241522181 = 1783111735 band 1335911181. +1877500735 = 1783111735 bor 1335911181. +635978554 = 1783111735 bxor 1335911181. +7602177 = 544508115 band 159195913. +696101851 = 544508115 bor 159195913. +688499674 = 544508115 bxor 159195913. +-868170235 = -319496401 band -867440955. +-318767121 = -319496401 bor -867440955. +549403114 = -319496401 bxor -867440955. +-2012730815 = -1434828981 band -1920390591. +-1342488757 = -1434828981 bor -1920390591. +670242058 = -1434828981 bxor -1920390591. +1135149349 = 1672185127 band 1140664701. +1677700479 = 1672185127 bor 1140664701. +542551130 = 1672185127 bxor 1140664701. +8470593 = 750865603 band 12050553. +754445563 = 750865603 bor 12050553. +745974970 = 750865603 bxor 12050553. +-893320683 = -354291169 band -875754699. +-336725185 = -354291169 bor -875754699. +556595498 = -354291169 bxor -875754699. +-2146434767 = -1522691781 band -2133842511. +-1510099525 = -1522691781 bor -2133842511. +636335242 = -1522691781 bxor -2133842511. +1124073989 = 1810499095 band 1192258541. +1878683647 = 1810499095 bor 1192258541. +754609658 = 1810499095 bxor 1192258541. +1362081 = 545189043 band 26532329. +570359291 = 545189043 bor 26532329. +568997210 = 545189043 bxor 26532329. +-1068490491 = -328097521 band -1026020443. +-285627473 = -328097521 bor -1026020443. +782863018 = -328097521 bxor -1026020443. +-2147476191 = -1590608085 band -2142970591. +-1586102485 = -1590608085 bor -2142970591. +561373706 = -1590608085 bxor -2142970591. +1073750533 = 1845666567 band 1097935453. +1869851487 = 1845666567 bor 1097935453. +796100954 = 1845666567 bxor 1097935453. +119015425 = 664561827 band 119213913. +664760315 = 664561827 bor 119213913. +545744890 = 664561827 bxor 119213913. +-981448683 = -310187009 band -974895083. +-303633409 = -310187009 bor -974895083. +677815274 = -310187009 bxor -974895083. +-2147205103 = -1457239781 band -2133962607. +-1443997285 = -1457239781 bor -2133962607. +703207818 = -1457239781 bxor -2133962607. +1110720709 = 1655987191 band 1333159117. +1878425599 = 1655987191 bor 1333159117. +767704890 = 1655987191 bxor 1333159117. +67141761 = 667467923 band 202473673. +802799835 = 667467923 bor 202473673. +735658074 = 667467923 bxor 202473673. +-987742075 = -273362193 band -987209595. +-272829713 = -273362193 bor -987209595. +714912362 = -273362193 bxor -987209595. +-1996390399 = -1448759541 band -1894547455. +-1346916597 = -1448759541 bor -1894547455. +649473802 = -1448759541 bxor -1894547455. +1077284901 = 1618882791 band 1094130493. +1635728383 = 1618882791 bor 1094130493. +558443482 = 1618882791 bxor 1094130493. +7480321 = 544404611 band 184495673. +721419963 = 544404611 bor 184495673. +713939642 = 544404611 bxor 184495673. +-939371307 = -362392097 band -862227211. +-285248001 = -362392097 bor -862227211. +654123306 = -362392097 bxor -862227211. +-2130681743 = -1593544453 band -1887736975. +-1350599685 = -1593544453 bor -1887736975. +780082058 = -1593544453 bxor -1887736975. +1250558341 = 1805590999 band 1250577837. +1805610495 = 1805590999 bor 1250577837. +555052154 = 1805590999 bxor 1250577837. +168428577 = 717882483 band 237705129. +787159035 = 717882483 bor 237705129. +618730458 = 717882483 bxor 237705129. +-1028389819 = -357141297 band -1007385243. +-336136721 = -357141297 bor -1007385243. +692253098 = -357141297 bxor -1007385243. +-1911749919 = -1353740565 band -1909648671. +-1351639317 = -1353740565 bor -1909648671. +560110602 = -1353740565 bxor -1909648671. +1107700741 = 1712729799 band 1124531229. +1729560287 = 1712729799 bor 1124531229. +621859546 = 1712729799 bxor 1124531229. +161230849 = 700248163 band 261897497. +800914811 = 700248163 bor 261897497. +639683962 = 700248163 bxor 261897497. +-1031798379 = -477876289 band -827682347. +-273760257 = -477876289 bor -827682347. +758038122 = -477876289 bxor -827682347. +-2046427055 = -1504311077 band -1894812079. +-1352696101 = -1504311077 bor -1894812079. +693730954 = -1504311077 bxor -1894812079. +1174406789 = 1872910263 band 1174677133. +1873180607 = 1872910263 bor 1174677133. +698773818 = 1872910263 bxor 1174677133. +152606721 = 704297043 band 152673929. +704364251 = 704297043 bor 152673929. +551757530 = 704297043 bxor 152673929. +-916159995 = -311523665 band -873162171. +-268525841 = -311523665 bor -873162171. +647634154 = -311523665 bxor -873162171. +-1988062015 = -1448681781 band -1916168767. +-1376788533 = -1448681781 bor -1916168767. +611273482 = -1448681781 bxor -1916168767. +1082166437 = 1707252903 band 1117310205. +1742396671 = 1707252903 bor 1117310205. +660230234 = 1707252903 bxor 1117310205. +2234433 = 569531459 band 69876729. +637173755 = 569531459 bor 69876729. +634939322 = 569531459 bxor 69876729. +-960489323 = -422282849 band -959865163. +-421658689 = -422282849 bor -959865163. +538830634 = -422282849 bxor -959865163. +-1937764303 = -1366224709 band -1916636879. +-1345097285 = -1366224709 bor -1916636879. +592667018 = -1366224709 bxor -1916636879. +1133636869 = 1672871319 band 1268510573. +1807745023 = 1672871319 bor 1268510573. +674108154 = 1672871319 bxor 1268510573. +1053729 = 567467059 band 169153897. +735567227 = 567467059 bor 169153897. +734513498 = 567467059 bxor 169153897. +-1044379643 = -472577905 band -975134939. +-403333201 = -472577905 bor -975134939. +641046442 = -472577905 bxor -975134939. +-2011101023 = -1406951765 band -1977546591. +-1373397333 = -1406951765 bor -1977546591. +637703690 = -1406951765 bxor -1977546591. +1109395589 = 1652259463 band 1201966557. +1744830431 = 1652259463 bor 1201966557. +635434842 = 1652259463 bxor 1201966557. +58796033 = 596326435 band 65088217. +602618619 = 596326435 bor 65088217. +543822586 = 596326435 bxor 65088217. +-905964779 = -296799361 band -877618283. +-268452865 = -296799361 bor -877618283. +637511914 = -296799361 bxor -877618283. +-2129917935 = -1423079269 band -2050204655. +-1343365989 = -1423079269 bor -2050204655. +786551946 = -1423079269 bxor -2050204655. +1073741893 = 1758598007 band 1091151949. +1776008063 = 1758598007 bor 1091151949. +702266170 = 1758598007 bxor 1091151949. +171995137 = 717910035 band 173374537. +719289435 = 717910035 bor 173374537. +547294298 = 717910035 bxor 173374537. +-1000304635 = -438175121 band -965700603. +-403571089 = -438175121 bor -965700603. +596733546 = -438175121 bxor -965700603. +-2111223167 = -1505898869 band -1955894399. +-1350570101 = -1505898869 bor -1955894399. +760653066 = -1505898869 bxor -1955894399. +1092618277 = 1798883431 band 1172455101. +1878720255 = 1798883431 bor 1172455101. +786101978 = 1798883431 bxor 1172455101. +83427329 = 620725251 band 100207033. +637504955 = 620725251 bor 100207033. +554077626 = 620725251 bxor 100207033. +-1073477547 = -269722273 band -1072199563. +-268444289 = -269722273 bor -1072199563. +805033258 = -269722273 bxor -1072199563. +-1994313615 = -1448906629 band -1922746639. +-1377339653 = -1448906629 bor -1922746639. +616973962 = -1448906629 bxor -1922746639. +1208226053 = 1810798935 band 1208308013. +1810880895 = 1810798935 bor 1208308013. +602654842 = 1810798935 bxor 1208308013. +152064801 = 693728243 band 252891945. +794555387 = 693728243 bor 252891945. +642490586 = 693728243 bxor 252891945. +-972269499 = -410166193 band -832800539. +-270697233 = -410166193 bor -832800539. +701572266 = -410166193 bxor -832800539. +-2124403103 = -1553109397 band -2048868767. +-1477575061 = -1553109397 bor -2048868767. +646828042 = -1553109397 bxor -2048868767. +1207993861 = 1794278983 band 1292492701. +1878777823 = 1794278983 bor 1292492701. +670783962 = 1794278983 bxor 1292492701. +142678145 = 684146659 band 229234841. +770703355 = 684146659 bor 229234841. +628025210 = 684146659 bxor 229234841. +-1063099115 = -308021441 band -1028233899. +-273156225 = -308021441 bor -1028233899. +789942890 = -308021441 bxor -1028233899. +-2109734831 = -1553282981 band -2033909295. +-1477457445 = -1553282981 bor -2033909295. +632277386 = -1553282981 bxor -2033909295. +1174571525 = 1711509303 band 1313270285. +1850208063 = 1711509303 bor 1313270285. +675636538 = 1711509303 bxor 1313270285. +159711745 = 771221459 band 159717897. +771227611 = 771221459 bor 159717897. +611515866 = 771221459 bxor 159717897. +-934540283 = -389075409 band -899920443. +-354455569 = -389075409 bor -899920443. +580084714 = -389075409 bxor -899920443. +-1993867199 = -1423278517 band -1984364223. +-1413775541 = -1423278517 bor -1984364223. +580091658 = -1423278517 bxor -1984364223. +1216360485 = 1755362343 band 1221816445. +1760818303 = 1755362343 bor 1221816445. +544457818 = 1755362343 bxor 1221816445. +134873921 = 760900547 band 170628985. +796655611 = 760900547 bor 170628985. +661781690 = 760900547 bxor 170628985. +-1002176491 = -445775585 band -834325963. +-277925057 = -445775585 bor -834325963. +724251434 = -445775585 bxor -834325963. +-2145152975 = -1376022469 band -2145141583. +-1376011077 = -1376022469 bor -2145141583. +769141898 = -1376022469 bxor -2145141583. +1275097093 = 1812526359 band 1300656877. +1838086143 = 1812526359 bor 1300656877. +562989050 = 1812526359 bxor 1300656877. +67387553 = 622709683 band 115626217. +670948347 = 622709683 bor 115626217. +603560794 = 622709683 bxor 115626217. +-1056436219 = -442535921 band -1020783963. +-406883665 = -442535921 bor -1020783963. +649552554 = -442535921 bxor -1020783963. +-2144586719 = -1595081173 band -2094255071. +-1544749525 = -1595081173 bor -2094255071. +599837194 = -1595081173 bxor -2094255071. +1077039109 = 1731940871 band 1089925469. +1744827231 = 1731940871 bor 1089925469. +667788122 = 1731940871 bxor 1089925469. +70256129 = 758187939 band 112608857. +800540667 = 758187939 bor 112608857. +730284538 = 758187939 bxor 112608857. +-1052612075 = -515736833 band -914624747. +-377749505 = -515736833 bor -914624747. +674862570 = -515736833 bxor -914624747. +-2104934383 = -1429354469 band -2085001327. +-1409421413 = -1429354469 bor -2085001327. +695512970 = -1429354469 bxor -2085001327. +1249036997 = 1861667575 band 1266412493. +1879043071 = 1861667575 bor 1266412493. +630006074 = 1861667575 bxor 1266412493. +4200321 = 658710419 band 6846409. +661356507 = 658710419 bor 6846409. +657156186 = 658710419 bxor 6846409. +-982122107 = -436854289 band -847788155. +-302520337 = -436854289 bor -847788155. +679601770 = -436854289 bxor -847788155. +-2145368575 = -1540559349 band -1972218111. +-1367408885 = -1540559349 bor -1972218111. +777959690 = -1540559349 bxor -1972218111. +1093157413 = 1706713063 band 1227645501. +1841201151 = 1706713063 bor 1227645501. +748043738 = 1706713063 bxor 1227645501. +176226561 = 784536451 band 176284985. +784594875 = 784536451 bor 176284985. +608368314 = 784536451 bxor 176284985. +-955252523 = -417766177 band -955081739. +-417595393 = -417766177 bor -955081739. +537657130 = -417766177 bxor -955081739. +-2028469647 = -1487310853 band -2017590671. +-1476431877 = -1487310853 bor -2017590671. +552037770 = -1487310853 bxor -2017590671. +1237651589 = 1808077015 band 1239372973. +1809798399 = 1808077015 bor 1239372973. +572146810 = 1808077015 bxor 1239372973. +139035169 = 685761395 band 189370025. +736096251 = 685761395 bor 189370025. +597061082 = 685761395 bxor 189370025. +-939311035 = -305445937 band -905745307. +-271880209 = -305445937 bor -905745307. +667430826 = -305445937 bxor -905745307. +-2143139359 = -1604170261 band -2084345375. +-1545376277 = -1604170261 bor -2084345375. +597763082 = -1604170261 bxor -2084345375. +1090633989 = 1863704007 band 1093387037. +1866457055 = 1863704007 bor 1093387037. +775823066 = 1863704007 bxor 1093387037. +8389633 = 612929379 band 147223577. +751763323 = 612929379 bor 147223577. +743373690 = 612929379 bxor 147223577. +-1061144427 = -387268929 band -977192747. +-303317249 = -387268929 bor -977192747. +757827178 = -387268929 bxor -977192747. +-1946122927 = -1391032357 band -1905685167. +-1350594597 = -1391032357 bor -1905685167. +595528330 = -1391032357 bxor -1905685167. +1114145925 = 1802225335 band 1181265293. +1869344703 = 1802225335 bor 1181265293. +755198778 = 1802225335 bxor 1181265293. +137106689 = 711726931 band 146773385. +721393627 = 711726931 bor 146773385. +584286938 = 711726931 bxor 146773385. +-989724411 = -317270609 band -981270203. +-308816401 = -317270609 bor -981270203. +680908010 = -317270609 bxor -981270203. +-1929048895 = -1392173621 band -1890095935. +-1353220661 = -1392173621 bor -1890095935. +575828234 = -1392173621 bxor -1890095935. +1074070437 = 1782959015 band 1152193533. +1861082111 = 1782959015 bor 1152193533. +787011674 = 1782959015 bxor 1152193533. +12153409 = 754547523 band 12317433. +754711547 = 754547523 bor 12317433. +742558138 = 754547523 bxor 12317433. +-1070694251 = -458323809 band -1069562443. +-457192001 = -458323809 bor -1069562443. +613502250 = -458323809 bxor -1069562443. +-2123102159 = -1585639493 band -2047604687. +-1510142021 = -1585639493 bor -2047604687. +612960138 = -1585639493 bxor -2047604687. +1120068613 = 1659038871 band 1255143021. +1794113279 = 1659038871 bor 1255143021. +674044666 = 1659038871 bxor 1255143021. +165921 = 677362483 band 100830313. +778026875 = 677362483 bor 100830313. +777860954 = 677362483 bxor 100830313. +-931101179 = -271526001 band -928086491. +-268511313 = -271526001 bor -928086491. +662589866 = -271526001 bxor -928086491. +-1996202591 = -1383244373 band -1989779551. +-1376821333 = -1383244373 bor -1989779551. +619381258 = -1383244373 bxor -1989779551. +1245708421 = 1782720903 band 1265128669. +1802141151 = 1782720903 bor 1265128669. +556432730 = 1782720903 bxor 1265128669. +8929537 = 579720995 band 228221401. +799012859 = 579720995 bor 228221401. +790083322 = 579720995 bxor 228221401. +-1002159595 = -463682945 band -851033451. +-312556801 = -463682945 bor -851033451. +689602794 = -463682945 bxor -851033451. +-2147155183 = -1509619813 band -2003471599. +-1365936229 = -1509619813 bor -2003471599. +781218954 = -1509619813 bxor -2003471599. +1073742405 = 1663206007 band 1288515405. +1877979007 = 1663206007 bor 1288515405. +804236602 = 1663206007 bxor 1288515405. +134365953 = 724750099 band 206205769. +796589915 = 724750099 bor 206205769. +662223962 = 724750099 bxor 206205769. +-936294139 = -302954129 band -935462139. +-302122129 = -302954129 bor -935462139. +634172010 = -302954129 bxor -935462139. +-2145386367 = -1586295413 band -1977073023. +-1417982069 = -1586295413 bor -1977073023. +727404298 = -1586295413 bxor -1977073023. +1207993637 = 1845688167 band 1226147261. +1863841791 = 1845688167 bor 1226147261. +655848154 = 1845688167 bxor 1226147261. +43614209 = 733848323 band 110739641. +800973755 = 733848323 bor 110739641. +757359546 = 733848323 bxor 110739641. +-846451627 = -303207329 band -812863627. +-269619329 = -303207329 bor -812863627. +576832298 = -303207329 bxor -812863627. +-2012983951 = -1473876101 band -1937388047. +-1398280197 = -1473876101 bor -1937388047. +614703754 = -1473876101 bxor -1937388047. +1207961605 = 1763870807 band 1310218285. +1866127487 = 1763870807 bor 1310218285. +658165882 = 1763870807 bxor 1310218285. +5063201 = 660427507 band 13584937. +668949243 = 660427507 bor 13584937. +663886042 = 660427507 bxor 13584937. +-1067447483 = -344970417 band -991338523. +-268861457 = -344970417 bor -991338523. +798586026 = -344970417 bxor -991338523. +-2080111263 = -1540477589 band -2049632927. +-1509999253 = -1540477589 bor -2049632927. +570112010 = -1540477589 bxor -2049632927. +1073751045 = 1619014983 band 1298966173. +1844230111 = 1619014983 bor 1298966173. +770479066 = 1619014983 bxor 1298966173. +167775873 = 721477347 band 250744729. +804446203 = 721477347 bor 250744729. +636670330 = 721477347 bxor 250744729. +-1052244971 = -480737729 band -976548779. +-405041537 = -480737729 bor -976548779. +647203434 = -480737729 bxor -976548779. +-2124873647 = -1587984549 band -2080565039. +-1543675941 = -1587984549 bor -2080565039. +581197706 = -1587984549 bxor -2080565039. +1279815685 = 1843068471 band 1281978637. +1845231423 = 1843068471 bor 1281978637. +565415738 = 1843068471 bxor 1281978637. +71368705 = 760694483 band 80285961. +769611739 = 760694483 bor 80285961. +698243034 = 760694483 bxor 80285961. +-935316475 = -398099153 band -882330427. +-345113105 = -398099153 bor -882330427. +590203370 = -398099153 bxor -882330427. +-1943758783 = -1388921525 band -1935353791. +-1380516533 = -1388921525 bor -1935353791. +563242250 = -1388921525 bxor -1935353791. +1075946277 = 1756488487 band 1143322493. +1823864703 = 1756488487 bor 1143322493. +747918426 = 1756488487 bxor 1143322493. +80415297 = 785353411 band 98258553. +803196667 = 785353411 bor 98258553. +722781370 = 785353411 bxor 98258553. +-1030746091 = -493481953 band -893822667. +-356558529 = -493481953 bor -893822667. +674187562 = -493481953 bxor -893822667. +-2062482639 = -1491759301 band -1926016079. +-1355292741 = -1491759301 bor -1926016079. +707189898 = -1491759301 bxor -1926016079. +1077960709 = 1715725335 band 1098414573. +1736179199 = 1715725335 bor 1098414573. +658218490 = 1715725335 bxor 1098414573. +17334945 = 697871027 band 91211753. +771747835 = 697871027 bor 91211753. +754412890 = 697871027 bxor 91211753. +-1067370235 = -529973489 band -999032411. +-461635665 = -529973489 bor -999032411. +605734570 = -529973489 bxor -999032411. +-2147186399 = -1610302165 band -1966109919. +-1429225685 = -1610302165 bor -1966109919. +717960714 = -1610302165 bxor -1966109919. +1083179013 = 1771045127 band 1157150813. +1845016927 = 1771045127 bor 1157150813. +761837914 = 1771045127 bxor 1157150813. +8463361 = 564242083 band 109935961. +665714683 = 564242083 bor 109935961. +657251322 = 564242083 bxor 109935961. +-988938219 = -442627585 band -988834283. +-442523649 = -442627585 bor -988834283. +546414570 = -442627585 bxor -988834283. +-2109716975 = -1428994277 band -2107605359. +-1426882661 = -1428994277 bor -2107605359. +682834314 = -1428994277 bxor -2107605359. +1112879301 = 1666529783 band 1123906253. +1677556735 = 1666529783 bor 1123906253. +564677434 = 1666529783 bxor 1123906253. +10055297 = 614039187 band 201027273. +805011163 = 614039187 bor 201027273. +794955866 = 614039187 bxor 201027273. +-1060953979 = -338464529 band -993841531. +-271352081 = -338464529 bor -993841531. +789601898 = -338464529 bxor -993841531. +-2013254655 = -1408226037 band -2004013567. +-1398984949 = -1408226037 bor -2004013567. +614269706 = -1408226037 bxor -2004013567. +1108379685 = 1645383399 band 1134405949. +1671409663 = 1645383399 bor 1134405949. +563029978 = 1645383399 bxor 1134405949. +138416129 = 703541891 band 138452025. +703577787 = 703541891 bor 138452025. +565161658 = 703541891 bxor 138452025. +-1040170283 = -496471073 band -947535115. +-403835905 = -496471073 bor -947535115. +636334378 = -496471073 bxor -947535115. +-2012739471 = -1442156805 band -1984128655. +-1413545989 = -1442156805 bor -1984128655. +599193482 = -1442156805 bxor -1984128655. +1107319685 = 1644625879 band 1118854061. +1656160255 = 1644625879 bor 1118854061. +548840570 = 1644625879 bxor 1118854061. +8388641 = 584172147 band 228853161. +804636667 = 584172147 bor 228853161. +796248026 = 584172147 bxor 228853161. +-871624123 = -293858609 band -854699163. +-276933649 = -293858609 bor -854699163. +594690474 = -293858609 bxor -854699163. +-2012151583 = -1395585813 band -1978285855. +-1361720085 = -1395585813 bor -1978285855. +650431498 = -1395585813 bxor -1978285855. +1291880453 = 1831963847 band 1338804765. +1878888159 = 1831963847 bor 1338804765. +587007706 = 1831963847 bxor 1338804765. +169880065 = 707800675 band 237808409. +775729019 = 707800675 bor 237808409. +605848954 = 707800675 bxor 237808409. +-1061073515 = -353546817 band -1059856427. +-352329729 = -353546817 bor -1059856427. +708743786 = -353546817 bxor -1059856427. +-2077031343 = -1372387621 band -2055232431. +-1350588709 = -1372387621 bor -2055232431. +726442634 = -1372387621 bxor -2055232431. +1245787269 = 1800484279 band 1313420429. +1868117439 = 1800484279 bor 1313420429. +622330170 = 1800484279 bxor 1313420429. +10552321 = 616134227 band 195136649. +800718555 = 616134227 bor 195136649. +790166234 = 616134227 bxor 195136649. +-938926075 = -396680017 band -905091003. +-362844945 = -396680017 bor -905091003. +576081130 = -396680017 bxor -905091003. +-1985920831 = -1447076661 band -1885256767. +-1346412597 = -1447076661 bor -1885256767. +639508234 = -1447076661 bxor -1885256767. +1092901541 = 1642396327 band 1161648893. +1711143679 = 1642396327 bor 1161648893. +618242138 = 1642396327 bxor 1161648893. +8947777 = 551328323 band 126462457. +668843003 = 551328323 bor 126462457. +659895226 = 551328323 bxor 126462457. +-920615787 = -316368993 band -877531979. +-273285185 = -316368993 bor -877531979. +647330602 = -316368993 bxor -877531979. +-2134831567 = -1396371781 band -2082365647. +-1343905861 = -1396371781 bor -2082365647. +790925706 = -1396371781 bxor -2082365647. +1143724293 = 1680595863 band 1333788013. +1870659583 = 1680595863 bor 1333788013. +726935290 = 1680595863 bxor 1333788013. +34079265 = 650680883 band 53216105. +669817723 = 650680883 bor 53216105. +635738458 = 650680883 bxor 53216105. +-999807995 = -446126449 band -998740699. +-445059153 = -446126449 bor -998740699. +554748842 = -446126449 bxor -998740699. +-2075978591 = -1504502613 band -2056800607. +-1485324629 = -1504502613 bor -2056800607. +590653962 = -1504502613 bxor -2056800607. +1126176901 = 1663359111 band 1269308381. +1806490591 = 1663359111 bor 1269308381. +680313690 = 1663359111 bxor 1269308381. +135008257 = 678196771 band 261069017. +804257531 = 678196771 bor 261069017. +669249274 = 678196771 bxor 261069017. +-1039777515 = -486125185 band -824710763. +-271058433 = -486125185 bor -824710763. +768719082 = -486125185 bxor -824710763. +-2028436975 = -1489467749 band -1894086127. +-1355116901 = -1489467749 bor -1894086127. +673320074 = -1489467749 bxor -1894086127. +1275899973 = 1838084471 band 1275901517. +1838086015 = 1838084471 bor 1275901517. +562186042 = 1838084471 bxor 1275901517. +24324609 = 561458707 band 226191945. +763326043 = 561458707 bor 226191945. +739001434 = 561458707 bxor 226191945. +-1056702459 = -308504465 band -1056480763. +-308282769 = -308504465 bor -1056480763. +748419690 = -308504465 bxor -1056480763. +-2113927039 = -1576776565 band -2086594175. +-1549443701 = -1576776565 bor -2086594175. +564483338 = -1576776565 bxor -2086594175. +1186989093 = 1877550695 band 1187302589. +1877864191 = 1877550695 bor 1187302589. +690875098 = 1877550695 bxor 1187302589. +89539073 = 660062723 band 225867705. +796391355 = 660062723 bor 225867705. +706852282 = 660062723 bxor 225867705. +-1064807851 = -494240929 band -855779723. +-285212801 = -494240929 bor -855779723. +779595050 = -494240929 bxor -855779723. +-1996462991 = -1425707397 band -1922931471. +-1352175877 = -1425707397 bor -1922931471. +644287114 = -1425707397 bxor -1922931471. +1143101189 = 1685223255 band 1168596781. +1710718847 = 1685223255 bor 1168596781. +567617658 = 1685223255 bxor 1168596781. +151322913 = 691876339 band 264749353. +805302779 = 691876339 bor 264749353. +653979866 = 691876339 bxor 264749353. +-1067302331 = -454100401 band -1066252571. +-453050641 = -454100401 bor -1066252571. +614251690 = -454100401 bxor -1066252571. +-2013238175 = -1471484821 band -1903858591. +-1362105237 = -1471484821 bor -1903858591. +651132938 = -1471484821 bxor -1903858591. +1107911685 = 1663689799 band 1179348381. +1735126495 = 1663689799 bor 1179348381. +627214810 = 1663689799 bxor 1179348381. +1459329 = 538344931 band 74860185. +611745787 = 538344931 bor 74860185. +610286458 = 538344931 bxor 74860185. +-997650155 = -307686081 band -992234667. +-302270593 = -307686081 bor -992234667. +695379562 = -307686081 bxor -992234667. +-2136930735 = -1583102373 band -2131677231. +-1577848869 = -1583102373 bor -2131677231. +559081866 = -1583102373 bxor -2131677231. +1074161669 = 1640918327 band 1242036237. +1808792895 = 1640918327 bor 1242036237. +734631226 = 1640918327 bxor 1242036237. +167772161 = 781362643 band 189335561. +802926043 = 781362643 bor 189335561. +635153882 = 781362643 bxor 189335561. +-883881979 = -346567633 band -814670907. +-277356561 = -346567633 bor -814670907. +606525418 = -346567633 bxor -814670907. +-2146653119 = -1600193461 band -2041794751. +-1495335093 = -1600193461 bor -2041794751. +651318026 = -1600193461 bxor -2041794751. +1104351781 = 1675563559 band 1173618301. +1744830079 = 1675563559 bor 1173618301. +640478298 = 1675563559 bxor 1173618301. +16777537 = 555788739 band 63374713. +602385915 = 555788739 bor 63374713. +585608378 = 555788739 bxor 63374713. +-1073217515 = -497410273 band -1054244811. +-478437569 = -497410273 bor -1054244811. +594779946 = -497410273 bxor -1054244811. +-2138404303 = -1601466821 band -2013336911. +-1476399429 = -1601466821 bor -2013336911. +662004874 = -1601466821 bxor -2013336911. +1115848709 = 1788531479 band 1122402541. +1795085311 = 1788531479 bor 1122402541. +679236602 = 1788531479 bxor 1122402541. +220661921 = 770673075 band 221724393. +771735547 = 770673075 bor 221724393. +551073626 = 770673075 bxor 221724393. +-997523451 = -321974769 band -960765787. +-285217105 = -321974769 bor -960765787. +712306346 = -321974769 bxor -960765787. +-2044174303 = -1367835605 band -2026970591. +-1350631893 = -1367835605 bor -2026970591. +693542410 = -1367835605 bxor -2026970591. +1157640197 = 1694543879 band 1299611485. +1836515167 = 1694543879 bor 1299611485. +678874970 = 1694543879 bxor 1299611485. +77595649 = 619595171 band 111195225. +653194747 = 619595171 bor 111195225. +575599098 = 619595171 bxor 111195225. +-929753067 = -359294721 band -929088235. +-358629889 = -359294721 bor -929088235. +571123178 = -359294721 bxor -929088235. +-2013232111 = -1456159205 band -1933339247. +-1376266341 = -1456159205 bor -1933339247. +636965770 = -1456159205 bxor -1933339247. +1170909381 = 1875880183 band 1174075853. +1879046655 = 1875880183 bor 1174075853. +708137274 = 1875880183 bxor 1174075853. +248137089 = 801889683 band 248145353. +801897947 = 801889683 bor 248145353. +553760858 = 801889683 bxor 248145353. +-1056402043 = -515063825 band -888498811. +-347160593 = -515063825 bor -888498811. +709241450 = -515063825 bxor -888498811. +-2126248959 = -1588630517 band -1989933823. +-1452315381 = -1588630517 bor -1989933823. +673933578 = -1588630517 bxor -1989933823. +1082306597 = 1703329255 band 1082847293. +1703869951 = 1703329255 bor 1082847293. +621563354 = 1703329255 bxor 1082847293. +3363073 = 569856387 band 70996793. +637490107 = 569856387 bor 70996793. +634127034 = 569856387 bxor 70996793. +-867139371 = -330071329 band -839587339. +-302519297 = -330071329 bor -839587339. +564620074 = -330071329 bxor -839587339. +-2129190799 = -1458082309 band -2055786383. +-1384677893 = -1458082309 bor -2055786383. +744512906 = -1458082309 bxor -2055786383. +1147429509 = 1852108503 band 1157456557. +1862135551 = 1852108503 bor 1157456557. +714706042 = 1852108503 bxor 1157456557. +1712161 = 681550195 band 87719081. +767557115 = 681550195 bor 87719081. +765844954 = 681550195 bxor 87719081. +-872406971 = -322379313 band -854246811. +-304219153 = -322379313 bor -854246811. +568187818 = -322379313 bxor -854246811. +-2147482655 = -1533293589 band -2128341023. +-1514151957 = -1533293589 bor -2128341023. +633330698 = -1533293589 bxor -2128341023. +1080627461 = 1617509319 band 1323913501. +1860795359 = 1617509319 bor 1323913501. +780167898 = 1617509319 bxor 1323913501. +176340993 = 716426595 band 265216537. +805302139 = 716426595 bor 265216537. +628961146 = 716426595 bxor 265216537. +-914193259 = -376709953 band -807237931. +-269754625 = -376709953 bor -807237931. +644438634 = -376709953 bxor -807237931. +-2147385007 = -1448376869 band -2075018415. +-1376010277 = -1448376869 bor -2075018415. +771374730 = -1448376869 bxor -2075018415. +1291886725 = 1867687095 band 1302707085. +1878507455 = 1867687095 bor 1302707085. +586620730 = 1867687095 bxor 1302707085. +10649857 = 685954387 band 29328265. +704632795 = 685954387 bor 29328265. +693982938 = 685954387 bxor 29328265. +-921484539 = -281316433 band -913060027. +-272891921 = -281316433 bor -913060027. +648592618 = -281316433 bxor -913060027. +-1903879487 = -1344955445 band -1901651263. +-1342727221 = -1344955445 bor -1901651263. +561152266 = -1344955445 bxor -1901651263. +1140859301 = 1822435751 band 1145676285. +1827252735 = 1822435751 bor 1145676285. +686393434 = 1822435751 bxor 1145676285. +143859777 = 765180227 band 143876345. +765196795 = 765180227 bor 143876345. +621337018 = 765180227 bxor 143876345. +-1071644011 = -533289313 band -920644683. +-382289985 = -533289313 bor -920644683. +689354026 = -533289313 bxor -920644683. +-2146892751 = -1603727941 band -2020919759. +-1477754949 = -1603727941 bor -2020919759. +669137802 = -1603727941 bxor -2020919759. +1098907653 = 1737542295 band 1236010093. +1874644735 = 1737542295 bor 1236010093. +775737082 = 1737542295 bxor 1236010093. +16873505 = 755857715 band 26311273. +765295483 = 755857715 bor 26311273. +748421978 = 755857715 bxor 26311273. +-1071885307 = -459508337 band -918662107. +-306285137 = -459508337 bor -918662107. +765600170 = -459508337 bxor -918662107. +-2044458591 = -1502291029 band -1910174303. +-1368006741 = -1502291029 bor -1910174303. +676451850 = -1502291029 bxor -1910174303. +1210286725 = 1831044999 band 1214505693. +1835263967 = 1831044999 bor 1214505693. +624977242 = 1831044999 bxor 1214505693. +16778497 = 623318307 band 163631065. +770170875 = 623318307 bor 163631065. +753392378 = 623318307 bxor 163631065. +-1069449195 = -364126081 band -1067085675. +-361762561 = -364126081 bor -1067085675. +707686634 = -364126081 bxor -1067085675. +-2008547055 = -1362623077 band -1990483695. +-1344559717 = -1362623077 bor -1990483695. +663987338 = -1362623077 bxor -1990483695. +1207967813 = 1746362487 band 1321745741. +1860140415 = 1746362487 bor 1321745741. +652172602 = 1746362487 bxor 1321745741. +226492673 = 764906771 band 233333065. +771747163 = 764906771 bor 233333065. +545254490 = 764906771 bxor 233333065. +-1061109499 = -454826129 band -1060321019. +-454037649 = -454826129 bor -1060321019. +607071850 = -454826129 bxor -1060321019. +-2016313215 = -1477342325 band -2016022399. +-1477051509 = -1477342325 bor -2016022399. +539261706 = -1477342325 bxor -2016022399. +1088426277 = 1626035559 band 1324356541. +1861965823 = 1626035559 bor 1324356541. +773539546 = 1626035559 bxor 1324356541. +42803201 = 667803907 band 177155769. +802156475 = 667803907 bor 177155769. +759353274 = 667803907 bxor 177155769. +-935163819 = -305952161 band -932512395. +-303300737 = -305952161 bor -932512395. +631863082 = -305952161 bxor -932512395. +-2109707919 = -1572835973 band -1879376911. +-1342504965 = -1572835973 bor -1879376911. +767202954 = -1572835973 bxor -1879376911. +1284662789 = 1843291735 band 1320314413. +1878943359 = 1843291735 bor 1320314413. +594280570 = 1843291735 bxor 1320314413. +184029217 = 788074739 band 201078825. +805124347 = 788074739 bor 201078825. +621095130 = 788074739 bxor 201078825. +-1073673915 = -469120689 band -1057542683. +-452989457 = -469120689 bor -1057542683. +620684458 = -469120689 bxor -1057542683. +-1883143327 = -1346131093 band -1879981215. +-1342968981 = -1346131093 bor -1879981215. +540174346 = -1346131093 bxor -1879981215. +1118179333 = 1659867975 band 1202074781. +1743763423 = 1659867975 bor 1202074781. +625584090 = 1659867975 bxor 1202074781. +134225025 = 671620323 band 238452121. +775847419 = 671620323 bor 238452121. +641622394 = 671620323 bxor 238452121. +-864026603 = -325737409 band -806856107. +-268566913 = -325737409 bor -806856107. +595459690 = -325737409 bxor -806856107. +-2080357295 = -1538636453 band -1918810415. +-1377089573 = -1538636453 bor -1918810415. +703267722 = -1538636453 bxor -1918810415. +1090542597 = 1641929783 band 1193443085. +1744830271 = 1641929783 bor 1193443085. +654287674 = 1641929783 bxor 1193443085. +16778241 = 564790483 band 218431241. +766443483 = 564790483 bor 218431241. +749665242 = 564790483 bxor 218431241. +-1039924731 = -502916305 band -965377339. +-428368913 = -502916305 bor -965377339. +611555818 = -502916305 bxor -965377339. +-2078277055 = -1520223413 band -2035251647. +-1477198005 = -1520223413 bor -2035251647. +601079050 = -1520223413 bxor -2035251647. +1244152101 = 1781023015 band 1312703869. +1849574783 = 1781023015 bor 1312703869. +605422682 = 1781023015 bxor 1312703869. +5015617 = 609077443 band 65977465. +670039291 = 609077443 bor 65977465. +665023674 = 609077443 bxor 65977465. +-1064294891 = -457560545 band -1047156939. +-440422593 = -457560545 bor -1047156939. +623872298 = -457560545 bxor -1047156939. +-2147188431 = -1436709573 band -2138668623. +-1428189765 = -1436709573 bor -2138668623. +718998666 = -1436709573 bxor -2138668623. +1090552325 = 1762509335 band 1104185325. +1776142335 = 1762509335 bor 1104185325. +685590010 = 1762509335 bxor 1104185325. +35791009 = 572680371 band 238728681. +775618043 = 572680371 bor 238728681. +739827034 = 572680371 bxor 238728681. +-925842171 = -355410673 band -905984091. +-335552593 = -355410673 bor -905984091. +590289578 = -355410673 bxor -905984091. +-2008532703 = -1404552405 band -2008401631. +-1404421333 = -1404552405 bor -2008401631. +604111370 = -1404552405 bxor -2008401631. +1207977477 = 1770872583 band 1248872029. +1811767135 = 1770872583 bor 1248872029. +603789658 = 1770872583 bxor 1248872029. +101113857 = 655811747 band 116386649. +671084539 = 655811747 bor 116386649. +569970682 = 655811747 bxor 116386649. +-1071111147 = -534173697 band -1003822059. +-466884609 = -534173697 bor -1003822059. +604226538 = -534173697 bxor -1003822059. +-2132671471 = -1510849253 band -2099073903. +-1477251685 = -1510849253 bor -2099073903. +655419786 = -1510849253 bxor -2099073903. +1147404485 = 1684412407 band 1148485837. +1685493759 = 1684412407 bor 1148485837. +538089274 = 1684412407 bxor 1148485837. +147856513 = 685390995 band 148200649. +685735131 = 685390995 bor 148200649. +537878618 = 685390995 bxor 148200649. +-1069544315 = -429781265 band -1068630907. +-428867857 = -429781265 bor -1068630907. +640676458 = -429781265 bxor -1068630907. +-2132637695 = -1544901877 band -1929978879. +-1342243061 = -1544901877 bor -1929978879. +790394634 = -1544901877 bxor -1929978879. +1075061797 = 1612115175 band 1341404989. +1878458367 = 1612115175 bor 1341404989. +803396570 = 1612115175 bxor 1341404989. +106037249 = 651915395 band 242354745. +788232891 = 651915395 bor 242354745. +682195642 = 651915395 bxor 242354745. +-1069543211 = -455437857 band -899673867. +-285568513 = -455437857 bor -899673867. +783974698 = -455437857 bxor -899673867. +-2139077519 = -1535087365 band -1964128399. +-1360138245 = -1535087365 bor -1964128399. +778939274 = -1535087365 bxor -1964128399. +1086736773 = 1625218519 band 1086745005. +1625226751 = 1625218519 bor 1086745005. +538489978 = 1625218519 bxor 1086745005. +34111521 = 709460083 band 34403241. +709751803 = 709460083 bor 34403241. +675640282 = 709460083 bxor 34403241. +-938467259 = -391008049 band -904388251. +-356929041 = -391008049 bor -904388251. +581538218 = -391008049 bxor -904388251. +-2134766879 = -1480422677 band -1997639967. +-1343295765 = -1480422677 bor -1997639967. +791471114 = -1480422677 bxor -1997639967. +1216350213 = 1757211335 band 1317148701. +1858009823 = 1757211335 bor 1317148701. +641659610 = 1757211335 bxor 1317148701. +67176449 = 638807139 band 229447961. +801078651 = 638807139 bor 229447961. +733902202 = 638807139 bxor 229447961. +-1060886123 = -456758337 band -1024643627. +-420515841 = -456758337 bor -1024643627. +640370282 = -456758337 bxor -1024643627. +-1971322799 = -1350564645 band -1965043119. +-1344284965 = -1350564645 bor -1965043119. +627037834 = -1350564645 bxor -1965043119. +1148191365 = 1735398327 band 1149125261. +1736332223 = 1735398327 bor 1149125261. +588140858 = 1735398327 bxor 1149125261. +34091009 = 652751955 band 186219145. +804880091 = 652751955 bor 186219145. +770789082 = 652751955 bxor 186219145. +-1072299515 = -508050769 band -1005177275. +-440928529 = -508050769 bor -1005177275. +631370986 = -508050769 bxor -1005177275. +-1941909311 = -1354245429 band -1939279423. +-1351615541 = -1354245429 bor -1939279423. +590293770 = -1354245429 bxor -1939279423. +1079068837 = 1786206375 band 1104275709. +1811413247 = 1786206375 bor 1104275709. +732344410 = 1786206375 bxor 1104275709. +51384385 = 590796867 band 64559097. +603971579 = 590796867 bor 64559097. +552587194 = 590796867 bxor 64559097. +-931123051 = -303778401 band -930465099. +-303120449 = -303778401 bor -930465099. +628002602 = -303778401 bxor -930465099. +-2141189071 = -1402401605 band -2131702479. +-1392915013 = -1402401605 bor -2131702479. +748274058 = -1402401605 bxor -2131702479. +1225787653 = 1829878167 band 1230244717. +1834335231 = 1829878167 bor 1230244717. +608547578 = 1829878167 bxor 1230244717. +19025953 = 724457523 band 20115817. +725547387 = 724457523 bor 20115817. +706521434 = 724457523 bxor 20115817. +-989855739 = -311671665 band -956286171. +-278102097 = -311671665 bor -956286171. +711753642 = -311671665 bxor -956286171. +-2121138015 = -1376609621 band -2086771551. +-1342243157 = -1376609621 bor -2086771551. +778894858 = -1376609621 bxor -2086771551. +1075454085 = 1748907655 band 1100720605. +1774174175 = 1748907655 bor 1100720605. +698720090 = 1748907655 bxor 1100720605. +137102337 = 683521059 band 204343001. +750761723 = 683521059 bor 204343001. +613659386 = 683521059 bxor 204343001. +-1070782699 = -366121089 band -1041287275. +-336625665 = -366121089 bor -1041287275. +734157034 = -366121089 bxor -1041287275. +-2079293423 = -1397521253 band -2024228847. +-1342456677 = -1397521253 bor -2024228847. +736836746 = -1397521253 bxor -2024228847. +1086047301 = 1656475511 band 1157612621. +1728040831 = 1656475511 bor 1157612621. +641993530 = 1656475511 bxor 1157612621. +227624961 = 798223379 band 227629129. +798227547 = 798223379 bor 227629129. +570602586 = 798223379 bxor 227629129. +-1014616059 = -473483665 band -946982907. +-405850513 = -473483665 bor -946982907. +608765546 = -473483665 bxor -946982907. +-2113748351 = -1556428149 band -2033793151. +-1476472949 = -1556428149 bor -2033793151. +637275402 = -1556428149 bxor -2033793151. +1090584613 = 1628013671 band 1100438205. +1637867263 = 1628013671 bor 1100438205. +547282650 = 1628013671 bxor 1100438205. +220200961 = 757071875 band 233039289. +769910203 = 757071875 bor 233039289. +549709242 = 757071875 bxor 233039289. +-1047527339 = -275211937 band -1043061643. +-270746241 = -275211937 bor -1043061643. +776781098 = -275211937 bxor -1043061643. +-2075721615 = -1378390917 band -2075159823. +-1377829125 = -1378390917 bor -2075159823. +697892490 = -1378390917 bxor -2075159823. +1092633861 = 1701205335 band 1228500269. +1837071743 = 1701205335 bor 1228500269. +744437882 = 1701205335 bxor 1228500269. +44833 = 680587251 band 91008809. +771551227 = 680587251 bor 91008809. +771506394 = 680587251 bxor 91008809. +-1069543355 = -390031281 band -965208859. +-285696785 = -390031281 bor -965208859. +783846570 = -390031281 bxor -965208859. +-1978135967 = -1432851861 band -1978000799. +-1432716693 = -1432851861 bor -1978000799. +545419274 = -1432851861 bxor -1978000799. +1095778821 = 1875984967 band 1098709917. +1878916063 = 1875984967 bor 1098709917. +783137242 = 1875984967 bxor 1098709917. +1093761 = 584432611 band 204649625. +787988475 = 584432611 bor 204649625. +786894714 = 584432611 bxor 204649625. +-1072692971 = -534891713 band -957284011. +-419482753 = -534891713 bor -957284011. +653210218 = -534891713 bxor -957284011. +-2012461999 = -1454586789 band -1978835503. +-1420960293 = -1454586789 bor -1978835503. +591501706 = -1454586789 bxor -1978835503. +1107886597 = 1846102839 band 1136199181. +1874415423 = 1846102839 bor 1136199181. +766528826 = 1846102839 bxor 1136199181. +10248705 = 647848915 band 167573001. +805173211 = 647848915 bor 167573001. +794924506 = 647848915 bxor 167573001. +-1068472315 = -330274257 band -1066014267. +-327816209 = -330274257 bor -1066014267. +740656106 = -330274257 bxor -1066014267. +-1988077503 = -1417446837 band -1915724479. +-1345093813 = -1417446837 bor -1915724479. +642983690 = -1417446837 bxor -1915724479. +1224998949 = 1804431399 band 1292143741. +1871576191 = 1804431399 bor 1292143741. +646577242 = 1804431399 bxor 1292143741. +5399361 = 676784067 band 106066809. +777451515 = 676784067 bor 106066809. +772052154 = 676784067 bxor 106066809. +-910947307 = -373932769 band -872559051. +-335544513 = -373932769 bor -872559051. +575402794 = -373932769 bxor -872559051. +-2071328719 = -1534358469 band -2033575759. +-1496605509 = -1534358469 bor -2033575759. +574723210 = -1534358469 bxor -2033575759. +1075085317 = 1637658903 band 1312198381. +1874771967 = 1637658903 bor 1312198381. +799686650 = 1637658903 bxor 1312198381. +3146913 = 640763827 band 142224617. +779841531 = 640763827 bor 142224617. +776694618 = 640763827 bxor 142224617. +-902910971 = -361845745 band -834687323. +-293622097 = -361845745 bor -834687323. +609288874 = -361845745 bxor -834687323. +-2011066335 = -1452017109 band -1910403039. +-1351353813 = -1452017109 bor -1910403039. +659712522 = -1452017109 bxor -1910403039. +1126566917 = 1731595783 band 1273367901. +1878396767 = 1731595783 bor 1273367901. +751829850 = 1731595783 bxor 1273367901. +1769985 = 672891811 band 125510233. +796632059 = 672891811 bor 125510233. +794862074 = 672891811 bxor 125510233. +-971996651 = -430393601 band -944600299. +-402997249 = -430393601 bor -944600299. +568999402 = -430393601 bxor -944600299. +-2146844655 = -1593064421 band -2067938415. +-1514158181 = -1593064421 bor -2067938415. +632686474 = -1593064421 bxor -2067938415. +1074267845 = 1628997367 band 1315571661. +1870301183 = 1628997367 bor 1315571661. +796033338 = 1628997367 bxor 1315571661. +168039297 = 801414035 band 169628617. +803003355 = 801414035 bor 169628617. +634964058 = 801414035 bxor 169628617. +-1073659515 = -351052305 band -997366907. +-274759697 = -351052305 bor -997366907. +798899818 = -351052305 bxor -997366907. +-2092850687 = -1545475573 band -2092584191. +-1545209077 = -1545475573 bor -2092584191. +547641610 = -1545475573 bxor -2092584191. +1103174181 = 1640176615 band 1104772669. +1641775103 = 1640176615 bor 1104772669. +538600922 = 1640176615 bxor 1104772669. +8421633 = 681283459 band 115654969. +788516795 = 681283459 bor 115654969. +780095162 = 681283459 bxor 115654969. +-926605099 = -335699745 band -859359243. +-268453889 = -335699745 bor -859359243. +658151210 = -335699745 bxor -859359243. +-2013246863 = -1404736517 band -1977590159. +-1369079813 = -1404736517 bor -1977590159. +644167050 = -1404736517 bxor -1977590159. +1073758341 = 1769262295 band 1175154861. +1870658815 = 1769262295 bor 1175154861. +796900474 = 1769262295 bxor 1175154861. +67848737 = 667901811 band 68905641. +668958715 = 667901811 bor 68905641. +601109978 = 667901811 bxor 68905641. +-1072297915 = -499744817 band -1005123483. +-432570385 = -499744817 bor -1005123483. +639727530 = -499744817 bxor -1005123483. +-2143010335 = -1505408533 band -2123053599. +-1485451797 = -1505408533 bor -2123053599. +657558538 = -1505408533 bxor -2123053599. +1174706437 = 1714198983 band 1318510365. +1858002911 = 1714198983 bor 1318510365. +683296474 = 1714198983 bxor 1318510365. +71761921 = 743377763 band 130502681. +802118523 = 743377763 bor 130502681. +730356602 = 743377763 bxor 130502681. +-930033515 = -325256513 band -906767147. +-301990145 = -325256513 bor -906767147. +628043370 = -325256513 bxor -906767147. +-1994358447 = -1347386405 band -1993741999. +-1346769957 = -1347386405 bor -1993741999. +647588490 = -1347386405 bxor -1993741999. +1115717765 = 1672053431 band 1121110413. +1677446079 = 1672053431 bor 1121110413. +561728314 = 1672053431 bxor 1121110413. +109646081 = 784962387 band 128938377. +804254683 = 784962387 bor 128938377. +694608602 = 784962387 bxor 128938377. +-913305339 = -271576657 band -913007291. +-271278609 = -271576657 bor -913007291. +642026730 = -271576657 bxor -913007291. +-2012870463 = -1474946613 band -1998141247. +-1460217397 = -1474946613 bor -1998141247. +552653066 = -1474946613 bxor -1998141247. +1229064101 = 1802143655 band 1305882621. +1878962175 = 1802143655 bor 1305882621. +649898074 = 1802143655 bxor 1305882621. +17352257 = 565049155 band 156946169. +704643067 = 565049155 bor 156946169. +687290810 = 565049155 bxor 156946169. +-1071628139 = -433142625 band -906993227. +-268507713 = -433142625 bor -906993227. +803120426 = -433142625 bxor -906993227. +-2147483599 = -1597699141 band -2146278351. +-1596493893 = -1597699141 bor -2146278351. +550989706 = -1597699141 bxor -2146278351. +1143472133 = 1689168023 band 1316491885. +1862187775 = 1689168023 bor 1316491885. +718715642 = 1689168023 bxor 1316491885. +8225 = 556480307 band 34629737. +591101819 = 556480307 bor 34629737. +591093594 = 556480307 bxor 34629737. +-845676027 = -271051889 band -843177435. +-268553297 = -271051889 bor -843177435. +577122730 = -271051889 bxor -843177435. +-2067785311 = -1395893845 band -2049721439. +-1377829973 = -1395893845 bor -2049721439. +689955338 = -1395893845 bxor -2049721439. +1145331845 = 1685382535 band 1196388573. +1736439263 = 1685382535 bor 1196388573. +591107418 = 1685382535 bxor 1196388573. +34607361 = 590369571 band 114769369. +670531579 = 590369571 bor 114769369. +635924218 = 590369571 bxor 114769369. +-1038033387 = -492110209 band -1015751019. +-469827841 = -492110209 bor -1015751019. +568205546 = -492110209 bxor -1015751019. +-2146368751 = -1594162277 band -1995321583. +-1443115109 = -1594162277 bor -1995321583. +703253642 = -1594162277 bxor -1995321583. +1278216773 = 1836858999 band 1320373069. +1879015295 = 1836858999 bor 1320373069. +600798522 = 1836858999 bxor 1320373069. +73681665 = 661408531 band 209080137. +796807003 = 661408531 bor 209080137. +723125338 = 661408531 bxor 209080137. +-1069382395 = -364477073 band -984901883. +-279996561 = -364477073 bor -984901883. +789385834 = -364477073 bxor -984901883. +-2141190015 = -1545598581 band -2139906431. +-1544314997 = -1545598581 bor -2139906431. +596875018 = -1545598581 bxor -2139906431. +1073914149 = 1615049575 band 1320853949. +1861989375 = 1615049575 bor 1320853949. +788075226 = 1615049575 bxor 1320853949. +121904129 = 659431171 band 125082809. +662609851 = 659431171 bor 125082809. +540705722 = 659431171 bxor 125082809. +-938932139 = -402020257 band -918992011. +-382080129 = -402020257 bor -918992011. +556852010 = -402020257 bxor -918992011. +-2009061007 = -1379243141 band -1973409295. +-1343591429 = -1379243141 bor -1973409295. +665469578 = -1379243141 bxor -1973409295. +1091060741 = 1795834967 band 1161589805. +1866364031 = 1795834967 bor 1161589805. +775303290 = 1795834967 bxor 1161589805. +67110433 = 637849331 band 202974761. +773713659 = 637849331 bor 202974761. +706603226 = 637849331 bxor 202974761. +-1072667835 = -485267633 band -1057686555. +-470286353 = -485267633 bor -1057686555. +602381482 = -485267633 bxor -1057686555. +-2000150175 = -1463211669 band -1929481887. +-1392543381 = -1463211669 bor -1929481887. +607606794 = -1463211669 bxor -1929481887. +1104068613 = 1775169863 band 1137689245. +1808790495 = 1775169863 bor 1137689245. +704721882 = 1775169863 bxor 1137689245. +6965889 = 545217251 band 241888153. +780139515 = 545217251 bor 241888153. +773173626 = 545217251 bxor 241888153. +-935297003 = -398278081 band -906647467. +-369628545 = -398278081 bor -906647467. +565668458 = -398278081 bxor -906647467. +-2145304495 = -1599388837 band -2043317039. +-1497401381 = -1599388837 bor -2043317039. +647903114 = -1599388837 bxor -2043317039. +1178634245 = 1716566583 band 1338739981. +1876672319 = 1716566583 bor 1338739981. +698038074 = 1716566583 bxor 1338739981. +2146305 = 762102483 band 36760841. +796717019 = 762102483 bor 36760841. +794570714 = 762102483 bxor 36760841. +-936243195 = -365512401 band -848146235. +-277415441 = -365512401 bor -848146235. +658827754 = -365512401 bxor -848146235. +-2102644671 = -1560299189 band -1951648703. +-1409303221 = -1560299189 bor -1951648703. +693341450 = -1560299189 bxor -1951648703. +1074172709 = 1745788711 band 1111937917. +1783553919 = 1745788711 bor 1111937917. +709381210 = 1745788711 bxor 1111937917. +137364033 = 758908611 band 183642745. +805187323 = 758908611 bor 183642745. +667823290 = 758908611 bxor 183642745. +-1069530091 = -514962401 band -1067322059. +-512754369 = -514962401 bor -1067322059. +556775722 = -514962401 bxor -1067322059. +-1979610319 = -1357542597 band -1966493775. +-1344426053 = -1357542597 bor -1966493775. +635184266 = -1357542597 bxor -1966493775. +1073774597 = 1682415639 band 1209570797. +1818211839 = 1682415639 bor 1209570797. +744437242 = 1682415639 bxor 1209570797. +169091745 = 706487987 band 200647657. +738043899 = 706487987 bor 200647657. +568952154 = 706487987 bxor 200647657. +-1020784379 = -341279985 band -1015310939. +-335806545 = -341279985 bor -1015310939. +684977834 = -341279985 bxor -1015310939. +-2135908063 = -1510229717 band -2001410271. +-1375731925 = -1510229717 bor -2001410271. +760176138 = -1510229717 bxor -2001410271. +1104319493 = 1845148935 band 1104663645. +1845493087 = 1845148935 bor 1104663645. +741173594 = 1845148935 bxor 1104663645. +4194305 = 670835363 band 138565977. +805207035 = 670835363 bor 138565977. +801012730 = 670835363 bxor 138565977. +-1054605291 = -316389889 band -1019858411. +-281643009 = -316389889 bor -1019858411. +772962282 = -316389889 bxor -1019858411. +-2113912303 = -1434369253 band -2108368239. +-1428825189 = -1434369253 bor -2108368239. +685087114 = -1434369253 bxor -2108368239. +1103267013 = 1709635063 band 1138462413. +1744830463 = 1709635063 bor 1138462413. +641563450 = 1709635063 bxor 1138462413. +9063041 = 613087891 band 43993801. +648018651 = 613087891 bor 43993801. +638955610 = 613087891 bxor 43993801. +-952072059 = -278876945 band -943142267. +-269947153 = -278876945 bor -943142267. +682124906 = -278876945 bxor -943142267. +-2146433023 = -1590351605 band -1940878847. +-1384797429 = -1590351605 bor -1940878847. +761635594 = -1590351605 bxor -1940878847. +1107968037 = 1787513575 band 1178256701. +1857802239 = 1787513575 bor 1178256701. +749834202 = 1787513575 bxor 1178256701. +85141505 = 657960579 band 227768377. +800587451 = 657960579 bor 227768377. +715445946 = 657960579 bxor 227768377. +-1054339371 = -507727905 band -987078923. +-440467457 = -507727905 bor -987078923. +613871914 = -507727905 bxor -987078923. +-2147065743 = -1603900677 band -2096171663. +-1553006597 = -1603900677 bor -2096171663. +594059146 = -1603900677 bxor -2096171663. +1074017157 = 1747368919 band 1154250669. +1827602431 = 1747368919 bor 1154250669. +753585274 = 1747368919 bxor 1154250669. +18948129 = 556875379 band 191226281. +729153531 = 556875379 bor 191226281. +710205402 = 556875379 bxor 191226281. +-921612731 = -380154161 band -888017051. +-346558481 = -380154161 bor -888017051. +575054250 = -380154161 bxor -888017051. +-2145122079 = -1608251157 band -1967711007. +-1430840085 = -1608251157 bor -1967711007. +714281994 = -1608251157 bxor -1967711007. +1210056709 = 1756907719 band 1327998493. +1874849503 = 1756907719 bor 1327998493. +664792794 = 1756907719 bxor 1327998493. +201622017 = 761703011 band 236816153. +796897147 = 761703011 bor 236816153. +595275130 = 761703011 bxor 236816153. +-1073346155 = -519075393 band -990479403. +-436208641 = -519075393 bor -990479403. +637137514 = -519075393 bxor -990479403. +-1976565679 = -1438842149 band -1892679599. +-1354956069 = -1438842149 bor -1892679599. +621609610 = -1438842149 bxor -1892679599. +1084379269 = 1677652407 band 1218662541. +1811935679 = 1677652407 bor 1218662541. +727556410 = 1677652407 bxor 1218662541. +8413185 = 545714771 band 125921417. +663223003 = 545714771 bor 125921417. +654809818 = 545714771 bxor 125921417. +-939261947 = -377200465 band -904985531. +-342924049 = -377200465 bor -904985531. +596337898 = -377200465 bxor -904985531. +-2147477311 = -1438623541 band -2078236735. +-1369382965 = -1438623541 bor -2078236735. +778094346 = -1438623541 bxor -2078236735. +1213216421 = 1870247591 band 1213626109. +1870657279 = 1870247591 bor 1213626109. +657440858 = 1870247591 bxor 1213626109. +150996033 = 687937091 band 152602105. +689543163 = 687937091 bor 152602105. +538547130 = 687937091 bxor 152602105. +-921665387 = -384511073 band -850229067. +-313074753 = -384511073 bor -850229067. +608590634 = -384511073 bxor -850229067. +-2073228751 = -1384314181 band -2064647375. +-1375732805 = -1384314181 bor -2064647375. +697495946 = -1384314181 bxor -2064647375. +1207963909 = 1852282775 band 1226316141. +1870635007 = 1852282775 bor 1226316141. +662671098 = 1852282775 bxor 1226316141. +67114529 = 788796979 band 69853033. +791535483 = 788796979 bor 69853033. +724420954 = 788796979 bxor 69853033. +-916979707 = -337649009 band -847771355. +-268440657 = -337649009 bor -847771355. +648539050 = -337649009 bxor -847771355. +-2147479391 = -1560143701 band -2067459423. +-1480123733 = -1560143701 bor -2067459423. +667355658 = -1560143701 bxor -2067459423. +1095177349 = 1640469639 band 1233074141. +1778366431 = 1640469639 bor 1233074141. +683189082 = 1640469639 bxor 1233074141. +3960833 = 612299299 band 163345625. +771684091 = 612299299 bor 163345625. +767723258 = 612299299 bxor 163345625. +-1060862699 = -473657985 band -990476907. +-403272193 = -473657985 bor -990476907. +657590506 = -473657985 bxor -990476907. +-1970896367 = -1415675237 band -1903761903. +-1348540773 = -1415675237 bor -1903761903. +622355594 = -1415675237 bxor -1903761903. +1212186693 = 1750642039 band 1273156173. +1811611519 = 1750642039 bor 1273156173. +599424826 = 1750642039 bxor 1273156173. +513 = 622897683 band 177686089. +800583259 = 622897683 bor 177686089. +800582746 = 622897683 bxor 177686089. +-939469819 = -396241809 band -905642491. +-362414481 = -396241809 bor -905642491. +577055338 = -396241809 bxor -905642491. +-2134884223 = -1444853621 band -2065926783. +-1375896181 = -1444853621 bor -2065926783. +758988042 = -1444853621 bxor -2065926783. +1176100901 = 1855578727 band 1180297405. +1859775231 = 1855578727 bor 1180297405. +683674330 = 1855578727 bxor 1180297405. +104862209 = 643317251 band 121721785. +660176827 = 643317251 bor 121721785. +555314618 = 643317251 bxor 121721785. +-971885995 = -417941665 band -828738955. +-274794625 = -417941665 bor -828738955. +697091370 = -417941665 bxor -828738955. +-2113388431 = -1575392645 band -2110996239. +-1573000453 = -1575392645 bor -2110996239. +540387978 = -1575392645 bxor -2110996239. +1116353285 = 1858745175 band 1119583021. +1861974911 = 1858745175 bor 1119583021. +745621626 = 1858745175 bxor 1119583021. +36129 = 659860979 band 105769. +659930619 = 659860979 bor 105769. +659894490 = 659860979 bxor 105769. +-1073733051 = -486394289 band -1066540315. +-479201553 = -486394289 bor -1066540315. +594531498 = -486394289 bxor -1066540315. +-2011903903 = -1437210517 band -2002859935. +-1428166549 = -1437210517 bor -2002859935. +583737354 = -1437210517 bxor -2002859935. +1082687493 = 1625858119 band 1319012765. +1862183391 = 1625858119 bor 1319012765. +779495898 = 1625858119 bxor 1319012765. +270465 = 553974243 band 81732249. +635436027 = 553974243 bor 81732249. +635165562 = 553974243 bxor 81732249. +-1073594091 = -452767425 band -923381931. +-302555265 = -452767425 bor -923381931. +771038826 = -452767425 bxor -923381931. +-2113830319 = -1436171685 band -2112255023. +-1434596389 = -1436171685 bor -2112255023. +679233930 = -1436171685 bxor -2112255023. +1242562565 = 1790191927 band 1264194573. +1811823935 = 1790191927 bor 1264194573. +569261370 = 1790191927 bxor 1264194573. +67117057 = 639115731 band 94430217. +666428891 = 639115731 bor 94430217. +599311834 = 639115731 bxor 94430217. +-920125435 = -340195281 band -848644155. +-268714001 = -340195281 bor -848644155. +651411434 = -340195281 bxor -848644155. +-2143025087 = -1411909557 band -2143024319. +-1411908789 = -1411909557 bor -2143024319. +731116298 = -1411909557 bxor -2143024319. +1308690981 = 1873530407 band 1308957309. +1873796735 = 1873530407 bor 1308957309. +565105754 = 1873530407 bxor 1308957309. +13443393 = 587015619 band 30269817. +603842043 = 587015619 bor 30269817. +590398650 = 587015619 bxor 30269817. +-897443819 = -343778529 band -826139595. +-272474305 = -343778529 bor -826139595. +624969514 = -343778529 bxor -826139595. +-2004811215 = -1443132869 band -1937422671. +-1375744325 = -1443132869 bor -1937422671. +629066890 = -1443132869 bxor -1937422671. +1090948101 = 1628344087 band 1333173485. +1870569471 = 1628344087 bor 1333173485. +779621370 = 1628344087 bxor 1333173485. +144769185 = 769852851 band 145562345. +770646011 = 769852851 bor 145562345. +625876826 = 769852851 bxor 145562345. +-936228859 = -293713393 band -910984027. +-268468561 = -293713393 bor -910984027. +667760298 = -293713393 bxor -910984027. +-2147207135 = -1579190229 band -2012987871. +-1444970965 = -1579190229 bor -2012987871. +702236170 = -1579190229 bxor -2012987871. +1279330309 = 1843096583 band 1279630173. +1843396447 = 1843096583 bor 1279630173. +564066138 = 1843096583 bxor 1279630173. +32769 = 649642403 band 155553881. +805163515 = 649642403 bor 155553881. +805130746 = 649642403 bxor 155553881. +-998125547 = -460598017 band -961160939. +-423633409 = -460598017 bor -961160939. +574492138 = -460598017 bxor -961160939. +-2113748975 = -1571634661 band -1951927919. +-1409813605 = -1571634661 bor -1951927919. +703935370 = -1571634661 bxor -1951927919. +1086391493 = 1657890039 band 1154029005. +1725527551 = 1657890039 bor 1154029005. +639136058 = 1657890039 bxor 1154029005. +34357633 = 657283475 band 39731657. +662657499 = 657283475 bor 39731657. +628299866 = 657283475 bxor 39731657. +-1040174715 = -481690641 band -905956987. +-347472913 = -481690641 bor -905956987. +692701802 = -481690641 bxor -905956987. +-2012979199 = -1411094517 band -2011733759. +-1409849077 = -1411094517 bor -2011733759. +603130122 = -1411094517 bxor -2011733759. +1208485925 = 1785690599 band 1293421629. +1870626303 = 1785690599 bor 1293421629. +662140378 = 1785690599 bxor 1293421629. +36572417 = 581946755 band 41824057. +587198395 = 581946755 bor 41824057. +550625978 = 581946755 bxor 41824057. +-1040087851 = -434651425 band -1014397451. +-408961025 = -434651425 bor -1014397451. +631126826 = -434651425 bxor -1014397451. +-2136930191 = -1595708933 band -2051437455. +-1510216197 = -1595708933 bor -2051437455. +626713994 = -1595708933 bxor -2051437455. +1275079301 = 1827973847 band 1292467885. +1845362431 = 1827973847 bor 1292467885. +570283130 = 1827973847 bxor 1292467885. +107747361 = 644816243 band 132929705. +669998587 = 644816243 bor 132929705. +562251226 = 644816243 bxor 132929705. +-838855611 = -300671537 band -821504411. +-283320337 = -300671537 bor -821504411. +555535274 = -300671537 bxor -821504411. +-2079046687 = -1520515093 band -2068483103. +-1509951509 = -1520515093 bor -2068483103. +569095178 = -1520515093 bxor -2068483103. +1075078405 = 1616902087 band 1077177629. +1619001311 = 1616902087 bor 1077177629. +543922906 = 1616902087 bxor 1077177629. +657409 = 693782883 band 11517465. +704642939 = 693782883 bor 11517465. +703985530 = 693782883 bxor 11517465. +-1038876523 = -501344065 band -1007344939. +-469812481 = -501344065 bor -1007344939. +569064042 = -501344065 bxor -1007344939. +-1944059567 = -1356496421 band -1930291375. +-1342728229 = -1356496421 bor -1930291375. +601331338 = -1356496421 bxor -1930291375. +1080049797 = 1752195255 band 1173346189. +1845491647 = 1752195255 bor 1173346189. +765441850 = 1752195255 bxor 1173346189. +134238465 = 740315475 band 177168265. +783245275 = 740315475 bor 177168265. +649006810 = 740315475 bxor 177168265. +-997971195 = -288051281 band -981111995. +-271192081 = -288051281 bor -981111995. +726779114 = -288051281 bxor -981111995. +-2079975743 = -1513711669 band -1911130431. +-1344866357 = -1513711669 bor -1911130431. +735109386 = -1513711669 bxor -1911130431. +1073784229 = 1722082727 band 1095941629. +1744240127 = 1722082727 bor 1095941629. +670455898 = 1722082727 bxor 1095941629. +17839169 = 691025219 band 51526905. +724712955 = 691025219 bor 51526905. +706873786 = 691025219 bxor 51526905. +-1030708587 = -426319201 band -1028608075. +-424218689 = -426319201 bor -1028608075. +606489898 = -426319201 bxor -1028608075. +-2105475023 = -1567553093 band -1886809551. +-1348887621 = -1567553093 bor -1886809551. +756587402 = -1567553093 bxor -1886809551. +1211367429 = 1782351511 band 1228152941. +1799137023 = 1782351511 bor 1228152941. +587769594 = 1782351511 bxor 1228152941. +70800417 = 616101171 band 125785705. +671086459 = 616101171 bor 125785705. +600286042 = 616101171 bxor 125785705. +-1073631227 = -511463025 band -970067931. +-407899729 = -511463025 bor -970067931. +665731498 = -511463025 bxor -970067931. +-2146287199 = -1600923733 band -2139985503. +-1594622037 = -1600923733 bor -2139985503. +551665162 = -1600923733 bxor -2139985503. +1075987077 = 1614168967 band 1210777309. +1748959199 = 1614168967 bor 1210777309. +672972122 = 1614168967 bxor 1210777309. +76120321 = 749310243 band 81636313. +754826235 = 749310243 bor 81636313. +678705914 = 749310243 bxor 81636313. +-999289835 = -310764417 band -965464939. +-276939521 = -310764417 bor -965464939. +722350314 = -310764417 bxor -965464939. +-2070544111 = -1398931045 band -2017985263. +-1346372197 = -1398931045 bor -2017985263. +724171914 = -1398931045 bxor -2017985263. +1073748037 = 1666260087 band 1284397389. +1876909439 = 1666260087 bor 1284397389. +803161402 = 1666260087 bxor 1284397389. +11536641 = 682690835 band 133446985. +804601179 = 682690835 bor 133446985. +793064538 = 682690835 bxor 133446985. +-1005051643 = -300342417 band -977640187. +-272930961 = -300342417 bor -977640187. +732120682 = -300342417 bxor -977640187. +-2080373631 = -1522628725 band -2080289663. +-1522544757 = -1522628725 bor -2080289663. +557828874 = -1522628725 bxor -2080289663. +1208221989 = 1812730215 band 1215639485. +1820147711 = 1812730215 bor 1215639485. +611925722 = 1812730215 bxor 1215639485. +134875137 = 708730115 band 222956217. +796811195 = 708730115 bor 222956217. +661936058 = 708730115 bxor 222956217. +-1061715883 = -322976161 band -1040737931. +-301998209 = -322976161 bor -1040737931. +759717674 = -322976161 bxor -1040737931. +-1971043983 = -1429968517 band -1951049743. +-1409974277 = -1429968517 bor -1951049743. +561069706 = -1429968517 bxor -1951049743. +1084621317 = 1621500503 band 1102479917. +1639359103 = 1621500503 bor 1102479917. +554737786 = 1621500503 bxor 1102479917. +1057 = 746622195 band 19272745. +765893883 = 746622195 bor 19272745. +765892826 = 746622195 bxor 19272745. +-1065352891 = -393411249 band -991770139. +-319828497 = -393411249 bor -991770139. +745524394 = -393411249 bxor -991770139. +-1942354079 = -1354848405 band -1929699487. +-1342193813 = -1354848405 bor -1929699487. +600160266 = -1354848405 bxor -1929699487. +1091059717 = 1696485191 band 1105809565. +1711235039 = 1696485191 bor 1105809565. +620175322 = 1696485191 bxor 1105809565. +67508353 = 610703587 band 261052825. +804248059 = 610703587 bor 261052825. +736739706 = 610703587 bxor 261052825. +-1034756075 = -429924289 band -1007487403. +-402655617 = -429924289 bor -1007487403. +632100458 = -429924289 bxor -1007487403. +-2076704687 = -1501806245 band -1917213999. +-1342315557 = -1501806245 bor -1917213999. +734389130 = -1501806245 bxor -1917213999. +1109432325 = 1798543415 band 1180998413. +1870109503 = 1798543415 bor 1180998413. +760677178 = 1798543415 bxor 1180998413. +819201 = 547324115 band 72145673. +618650587 = 547324115 bor 72145673. +617831386 = 547324115 bxor 72145673. +-1068034555 = -522758353 band -1067508027. +-522231825 = -522758353 bor -1067508027. +545802730 = -522758353 bxor -1067508027. +-2113658303 = -1509148853 band -1952980415. +-1348470965 = -1509148853 bor -1952980415. +765187338 = -1509148853 bxor -1952980415. +1076125989 = 1650785575 band 1077895549. +1652555135 = 1650785575 bor 1077895549. +576429146 = 1650785575 bxor 1077895549. +142606401 = 697976003 band 182818937. +738188539 = 697976003 bor 182818937. +595582138 = 697976003 bxor 182818937. +-1072545259 = -397252065 band -954318027. +-279024833 = -397252065 bor -954318027. +793520426 = -397252065 bxor -954318027. +-2126739151 = -1522693829 band -1946362447. +-1342317125 = -1522693829 bor -1946362447. +784422026 = -1522693829 bxor -1946362447. +1146102277 = 1743879703 band 1146135533. +1743912959 = 1743879703 bor 1146135533. +597810682 = 1743879703 bxor 1146135533. +8421537 = 562422963 band 245404137. +799405563 = 562422963 bor 245404137. +790984026 = 562422963 bxor 245404137. +-1059061499 = -487581425 band -1058577499. +-487097425 = -487581425 bor -1058577499. +571964074 = -487581425 bxor -1058577499. +-1945168607 = -1390463189 band -1945135839. +-1390430421 = -1390463189 bor -1945135839. +554738186 = -1390463189 bxor -1945135839. +1107821061 = 1725438727 band 1261396573. +1879014239 = 1725438727 bor 1261396573. +771193178 = 1725438727 bxor 1261396573. +16385 = 609312931 band 176473945. +785770491 = 609312931 bor 176473945. +785754106 = 609312931 bxor 176473945. +-1073676267 = -326147073 band -1036943339. +-289414145 = -326147073 bor -1036943339. +784262122 = -326147073 bxor -1036943339. +-2139095023 = -1467989733 band -2135488367. +-1464383077 = -1467989733 bor -2135488367. +674711946 = -1467989733 bxor -2135488367. +1091735749 = 1742197751 band 1093835981. +1744297983 = 1742197751 bor 1093835981. +652562234 = 1742197751 bxor 1093835981. +17381505 = 665565331 band 156842185. +805026011 = 665565331 bor 156842185. +787644506 = 665565331 bxor 156842185. +-1039988603 = -422622481 band -885811067. +-268444945 = -422622481 bor -885811067. +771543658 = -422622481 bxor -885811067. +-2104877055 = -1544575221 band -2036713471. +-1476411637 = -1544575221 bor -2036713471. +628465418 = -1544575221 bxor -2036713471. +1080098853 = 1634707687 band 1181831997. +1736440831 = 1634707687 bor 1181831997. +656341978 = 1634707687 bxor 1181831997. +16835585 = 721677443 band 94692921. +799534779 = 721677443 bor 94692921. +782699194 = 721677443 bxor 94692921. +-1056666411 = -384905761 band -941314827. +-269554177 = -384905761 bor -941314827. +787112234 = -384905761 bxor -941314827. +-2145378191 = -1380161285 band -2111822991. +-1346606085 = -1380161285 bor -2111822991. +798772106 = -1380161285 bxor -2111822991. +1187152261 = 1742641623 band 1321371053. +1876860415 = 1742641623 bor 1321371053. +689708154 = 1742641623 bxor 1321371053. +25742369 = 663288947 band 162451369. +799997947 = 663288947 bor 162451369. +774255578 = 663288947 bxor 162451369. +-1066881979 = -529732401 band -805585563. +-268435985 = -529732401 bor -805585563. +798445994 = -529732401 bxor -805585563. +-2056944927 = -1510635797 band -1888498975. +-1342189845 = -1510635797 bor -1888498975. +714755082 = -1510635797 bxor -1888498975. +1092690949 = 1831052999 band 1102918685. +1841280735 = 1831052999 bor 1102918685. +748589786 = 1831052999 bxor 1102918685. +2744321 = 539617379 band 259912985. +796786043 = 539617379 bor 259912985. +794041722 = 539617379 bxor 259912985. +-959938155 = -272062529 band -957363755. +-269488129 = -272062529 bor -957363755. +690450026 = -272062529 bxor -957363755. +-2107637679 = -1368784677 band -2106577327. +-1367724325 = -1368784677 bor -2106577327. +739913354 = -1368784677 bxor -2106577327. +1085820549 = 1627246519 band 1253596813. +1795022783 = 1627246519 bor 1253596813. +709202234 = 1627246519 bxor 1253596813. +9506817 = 563458131 band 14243465. +568194779 = 563458131 bor 14243465. +558687962 = 563458131 bxor 14243465. +-876555771 = -272564561 band -872951227. +-268960017 = -272564561 bor -872951227. +607595754 = -272564561 bxor -872951227. +-2104998719 = -1431775541 band -2033693247. +-1360470069 = -1431775541 bor -2033693247. +744528650 = -1431775541 bxor -2033693247. +1086850213 = 1626084519 band 1221264637. +1760498943 = 1626084519 bor 1221264637. +673648730 = 1626084519 bxor 1221264637. +33771585 = 574313539 band 122156025. +662697979 = 574313539 bor 122156025. +628926394 = 574313539 bxor 122156025. +-905916267 = -290131553 band -905259339. +-289474625 = -290131553 bor -905259339. +616441642 = -290131553 bxor -905259339. +-2147416015 = -1610544965 band -1881200335. +-1344329285 = -1610544965 bor -1881200335. +803086730 = -1610544965 bxor -1881200335. +1208755461 = 1747809687 band 1322002285. +1861056511 = 1747809687 bor 1322002285. +652301050 = 1747809687 bxor 1322002285. +50209 = 575263795 band 202427753. +777641339 = 575263795 bor 202427753. +777591130 = 575263795 bxor 202427753. +-1060929531 = -524058481 band -941631707. +-404760657 = -524058481 bor -941631707. +656168874 = -524058481 bxor -941631707. +-2138996575 = -1518233941 band -1998864223. +-1378101589 = -1518233941 bor -1998864223. +760894986 = -1518233941 bxor -1998864223. +1128317061 = 1874915975 band 1129498077. +1876096991 = 1874915975 bor 1129498077. +747779930 = 1874915975 bxor 1129498077. +137371649 = 732966947 band 138076889. +733672187 = 732966947 bor 138076889. +596300538 = 732966947 bxor 138076889. +-943095019 = -271864961 band -940715115. +-269485057 = -271864961 bor -940715115. +673609962 = -271864961 bxor -940715115. +-2136932335 = -1543929701 band -2069556207. +-1476553573 = -1543929701 bor -2069556207. +660378762 = -1543929701 bxor -2069556207. +1076199493 = 1852148599 band 1085661261. +1861610367 = 1852148599 bor 1085661261. +785410874 = 1852148599 bxor 1085661261. +860161 = 572352531 band 76362825. +647855195 = 572352531 bor 76362825. +646995034 = 572352531 bxor 76362825. +-932691963 = -345214353 band -932459515. +-344981905 = -345214353 bor -932459515. +587710058 = -345214353 bxor -932459515. +-2048785791 = -1510488437 band -1914559615. +-1376262261 = -1510488437 bor -1914559615. +672523530 = -1510488437 bxor -1914559615. +1074282533 = 1754939495 band 1158444733. +1839101695 = 1754939495 bor 1158444733. +764819162 = 1754939495 bxor 1158444733. +16793601 = 587234307 band 160350649. +730791355 = 587234307 bor 160350649. +713997754 = 587234307 bxor 160350649. +-1056915371 = -385559201 band -1018118027. +-346761857 = -385559201 bor -1018118027. +710153514 = -385559201 bxor -1018118027. +-2033620879 = -1479841669 band -2030440719. +-1476661509 = -1479841669 bor -2030440719. +556959370 = -1479841669 bxor -2030440719. +1074528517 = 1620971863 band 1110280493. +1656723839 = 1620971863 bor 1110280493. +582195322 = 1620971863 bxor 1110280493. +92277537 = 629697523 band 260475689. +797895675 = 629697523 bor 260475689. +705618138 = 629697523 bxor 260475689. +-1038905275 = -474753969 band -833376027. +-269224721 = -474753969 bor -833376027. +769680554 = -474753969 bxor -833376027. +-2113706399 = -1484560789 band -1978435999. +-1349290389 = -1484560789 bor -1978435999. +764416010 = -1484560789 bxor -1978435999. +1142953477 = 1718615623 band 1303386013. +1879048159 = 1718615623 bor 1303386013. +736094682 = 1718615623 bxor 1303386013. +169873537 = 715405283 band 242978969. +788510715 = 715405283 bor 242978969. +618637178 = 715405283 bxor 242978969. +-934802155 = -329748673 band -890528427. +-285474945 = -329748673 bor -890528427. +649327210 = -329748673 bxor -890528427. +-2147188655 = -1527857061 band -1995064879. +-1375733285 = -1527857061 bor -1995064879. +771455370 = -1527857061 bxor -1995064879. +1087046149 = 1741621047 band 1089151501. +1743726399 = 1741621047 bor 1089151501. +656680250 = 1741621047 bxor 1089151501. +201380353 = 755163091 band 238342665. +792125403 = 755163091 bor 238342665. +590745050 = 755163091 bxor 238342665. +-1073642491 = -376330705 band -967866939. +-270555153 = -376330705 bor -967866939. +803087338 = -376330705 bxor -967866939. +-2122043327 = -1583581621 band -1918387903. +-1379926197 = -1583581621 bor -1918387903. +742117130 = -1583581621 bxor -1918387903. +1076897829 = 1614425127 band 1224059005. +1761586303 = 1614425127 bor 1224059005. +684688474 = 1614425127 bxor 1224059005. +1131329 = 554918851 band 104419193. +658206715 = 554918851 bor 104419193. +657075386 = 554918851 bxor 104419193. +-1053399019 = -406947553 band -914986443. +-268534977 = -406947553 bor -914986443. +784864042 = -406947553 bxor -914986443. +-2146435023 = -1596225477 band -1993313103. +-1443103557 = -1596225477 bor -1993313103. +703331466 = -1596225477 bxor -1993313103. +1084237829 = 1760587031 band 1185327853. +1861677055 = 1760587031 bor 1185327853. +777439226 = 1760587031 bxor 1185327853. +83886241 = 621069235 band 231737577. +768920571 = 621069235 bor 231737577. +685034330 = 621069235 bxor 231737577. +-938129403 = -386013169 band -921220443. +-369104209 = -386013169 bor -921220443. +569025194 = -386013169 bxor -921220443. +-2070748127 = -1480919509 band -2066289631. +-1476461013 = -1480919509 bor -2066289631. +594287114 = -1480919509 bxor -2066289631. +1217398789 = 1760610823 band 1318398301. +1861610335 = 1760610823 bor 1318398301. +644211546 = 1760610823 bxor 1318398301. +12975617 = 549846947 band 201326169. +738197499 = 549846947 bor 201326169. +725221882 = 549846947 bxor 201326169. +-987225579 = -449907969 band -978770155. +-441452545 = -449907969 bor -978770155. +545773034 = -449907969 bxor -978770155. +-2130706415 = -1391869925 band -2122178671. +-1383342181 = -1391869925 bor -2122178671. +747364234 = -1391869925 bxor -2122178671. +1075315397 = 1694122743 band 1226318797. +1845126143 = 1694122743 bor 1226318797. +769810746 = 1694122743 bxor 1226318797. +100665217 = 637933459 band 126889929. +664158171 = 637933459 bor 126889929. +563492954 = 637933459 bxor 126889929. +-916416123 = -370107921 band -882704507. +-336396305 = -370107921 bor -882704507. +580019818 = -370107921 bxor -882704507. +-2125462015 = -1453922805 band -2015817983. +-1344278773 = -1453922805 bor -2015817983. +781183242 = -1453922805 bxor -2015817983. +1107464741 = 1871435751 band 1111923261. +1875894271 = 1871435751 bor 1111923261. +768429530 = 1871435751 bxor 1111923261. +264449 = 540281731 band 117939513. +657956795 = 540281731 bor 117939513. +657692346 = 540281731 bxor 117939513. +-1037971243 = -358490913 band -1036266507. +-356786177 = -358490913 bor -1036266507. +681185066 = -358490913 bxor -1036266507. +-2143280527 = -1494128645 band -2008892815. +-1359740933 = -1494128645 bor -2008892815. +783539594 = -1494128645 bxor -2008892815. +1222936709 = 1759807703 band 1240960173. +1777831167 = 1759807703 bor 1240960173. +554894458 = 1759807703 bxor 1240960173. +2900513 = 612293491 band 11355817. +620748795 = 612293491 bor 11355817. +617848282 = 612293491 bxor 11355817. +-1067409339 = -530465841 band -840260507. +-303317009 = -530465841 bor -840260507. +764092330 = -530465841 bxor -840260507. +-2132803103 = -1578613269 band -1964629535. +-1410439701 = -1578613269 bor -1964629535. +722363402 = -1578613269 bxor -1964629535. +1124159749 = 1862489543 band 1136786205. +1875115999 = 1862489543 bor 1136786205. +750956250 = 1862489543 bxor 1136786205. +8389633 = 567641955 band 176696345. +735948667 = 567641955 bor 176696345. +727559034 = 567641955 bxor 176696345. +-939118443 = -368101697 band -840535851. +-269519105 = -368101697 bor -840535851. +669599338 = -368101697 bxor -840535851. +-2012592815 = -1475706917 band -1884666543. +-1347780645 = -1475706917 bor -1884666543. +664812170 = -1475706917 bxor -1884666543. +1151607941 = 1839677111 band 1190978957. +1879048127 = 1839677111 bor 1190978957. +727440186 = 1839677111 bxor 1190978957. +4656385 = 552013651 band 174017929. +721375195 = 552013651 bor 174017929. +716718810 = 552013651 bxor 174017929. +-868218619 = -330740305 band -848938683. +-311460369 = -330740305 bor -848938683. +556758250 = -330740305 bxor -848938683. +-2010774335 = -1461250613 band -1909054271. +-1359530549 = -1461250613 bor -1909054271. +651243786 = -1461250613 bxor -1909054271. +1309623205 = 1850688423 band 1321159677. +1862224895 = 1850688423 bor 1321159677. +552601690 = 1850688423 bxor 1321159677. +69214785 = 606237507 band 96054009. +633076731 = 606237507 bor 96054009. +563861946 = 606237507 bxor 96054009. +-1050673003 = -512819041 band -1017053771. +-479199809 = -512819041 bor -1017053771. +571473194 = -512819041 bxor -1017053771. +-2051014607 = -1513289797 band -2047819727. +-1510094917 = -1513289797 bor -2047819727. +540919690 = -1513289797 bxor -2047819727. +1210065925 = 1748657303 band 1239428717. +1778020095 = 1748657303 bor 1239428717. +567954170 = 1748657303 bxor 1239428717. +26607649 = 666284851 band 31343721. +671020923 = 666284851 bor 31343721. +644413274 = 666284851 bxor 31343721. +-1064497659 = -375435377 band -1030898139. +-341835857 = -375435377 bor -1030898139. +722661802 = -375435377 bxor -1030898139. +-2147412575 = -1580509781 band -1912531039. +-1345628245 = -1580509781 bor -1912531039. +801784330 = -1580509781 bxor -1912531039. +1080459397 = 1617404295 band 1257671901. +1794616799 = 1617404295 bor 1257671901. +714157402 = 1617404295 bxor 1257671901. +26216705 = 563269411 band 64231897. +601284603 = 563269411 bor 64231897. +575067898 = 563269411 bxor 64231897. +-937346539 = -356959617 band -916227435. +-335840513 = -356959617 bor -916227435. +601506026 = -356959617 bxor -916227435. +-2130695407 = -1582235749 band -2058474735. +-1510015077 = -1582235749 bor -2058474735. +620680330 = -1582235749 bxor -2058474735. +1209098821 = 1771436663 band 1213818701. +1776156543 = 1771436663 bor 1213818701. +567057722 = 1771436663 bxor 1213818701. +6292225 = 560318227 band 6433609. +560459611 = 560318227 bor 6433609. +554167386 = 560318227 bxor 6433609. +-1072103163 = -530857617 band -1038535931. +-497290385 = -530857617 bor -1038535931. +574812778 = -530857617 bxor -1038535931. +-2146697087 = -1408432757 band -2105607551. +-1367343221 = -1408432757 bor -2105607551. +779353866 = -1408432757 bxor -2105607551. +1141124389 = 1682206567 band 1277148605. +1818230783 = 1682206567 bor 1277148605. +677106394 = 1682206567 bxor 1277148605. +923649 = 547265283 band 202340537. +748682171 = 547265283 bor 202340537. +747758522 = 547265283 bxor 202340537. +-1029315499 = -337255329 band -1029314699. +-337254529 = -337255329 bor -1029314699. +692060970 = -337255329 bxor -1029314699. +-2127952527 = -1456576645 band -2080733711. +-1409357829 = -1456576645 bor -2080733711. +718594698 = -1456576645 bxor -2080733711. +1142947845 = 1857159255 band 1142984749. +1857196159 = 1857159255 bor 1142984749. +714248314 = 1857159255 bxor 1142984749. +35652129 = 577522419 band 186843689. +728713979 = 577522419 bor 186843689. +693061850 = 577522419 bxor 186843689. +-1002405051 = -461986993 band -859793435. +-319375377 = -461986993 bor -859793435. +683029674 = -461986993 bxor -859793435. +-2094791327 = -1557912213 band -1880634015. +-1343754901 = -1557912213 bor -1880634015. +751036426 = -1557912213 bxor -1880634015. +1087409157 = 1692249415 band 1106435741. +1711275999 = 1692249415 bor 1106435741. +623866842 = 1692249415 bxor 1106435741. +27379329 = 599643875 band 27510681. +599775227 = 599643875 bor 27510681. +572395898 = 599643875 bxor 27510681. +-991935467 = -420676033 band -840940459. +-269681025 = -420676033 bor -840940459. +722254442 = -420676033 bxor -840940459. +-2077421487 = -1514324133 band -2077372207. +-1514274853 = -1514324133 bor -2077372207. +563146634 = -1514324133 bxor -2077372207. +1082400773 = 1619424823 band 1257089293. +1794113343 = 1619424823 bor 1257089293. +711712570 = 1619424823 bxor 1257089293. +54528001 = 725761747 band 56150281. +727384027 = 725761747 bor 56150281. +672856026 = 725761747 bxor 56150281. +-987503611 = -437783249 band -818156347. +-268435985 = -437783249 bor -818156347. +719067626 = -437783249 bxor -818156347. +-2046783423 = -1366772405 band -2039246783. +-1359235765 = -1366772405 bor -2039246783. +687547658 = -1366772405 bxor -2039246783. +1210272549 = 1764449063 band 1210576765. +1764753279 = 1764449063 bor 1210576765. +554480730 = 1764449063 bxor 1210576765. +21496385 = 694715075 band 63506041. +736724731 = 694715075 bor 63506041. +715228346 = 694715075 bxor 63506041. +-1044217835 = -372864993 band -976580299. +-305227457 = -372864993 bor -976580299. +738990378 = -372864993 bxor -976580299. +-2080373967 = -1395292357 band -2078274639. +-1393193029 = -1395292357 bor -2078274639. +687180938 = -1395292357 bxor -2078274639. +1141379077 = 1678466071 band 1182314989. +1719401983 = 1678466071 bor 1182314989. +578022906 = 1678466071 bxor 1182314989. +1778337 = 677356211 band 104562665. +780140539 = 677356211 bor 104562665. +778362202 = 677356211 bxor 104562665. +-1073532667 = -525879537 band -1035783771. +-488130641 = -525879537 bor -1035783771. +585402026 = -525879537 bxor -1035783771. +-2146303711 = -1582123733 band -2108013791. +-1543833813 = -1582123733 bor -2108013791. +602469898 = -1582123733 bxor -2108013791. +1143238661 = 1680177415 band 1182199901. +1719138655 = 1680177415 bor 1182199901. +575899994 = 1680177415 bxor 1182199901. +202773505 = 739679907 band 230110553. +767016955 = 739679907 bor 230110553. +564243450 = 739679907 bxor 230110553. +-1073184747 = -295009793 band -1055076843. +-276901889 = -295009793 bor -1055076843. +796282858 = -295009793 bxor -1055076843. +-1911998959 = -1343275237 band -1911998831. +-1343275109 = -1343275237 bor -1911998831. +568723850 = -1343275237 bxor -1911998831. +1211670725 = 1782100471 band 1283041997. +1853471743 = 1782100471 bor 1283041997. +641801018 = 1782100471 bxor 1283041997. +9857 = 574387859 band 218310345. +792688347 = 574387859 bor 218310345. +792678490 = 574387859 bxor 218310345. +-930324347 = -324146961 band -896637307. +-290459921 = -324146961 bor -896637307. +639864426 = -324146961 bxor -896637307. +-2012077055 = -1407572725 band -1949047295. +-1344542965 = -1407572725 bor -1949047295. +667534090 = -1407572725 bxor -1949047295. +1082392613 = 1690568423 band 1083695421. +1691871231 = 1690568423 bor 1083695421. +609478618 = 1690568423 bxor 1083695421. +33554433 = 574630531 band 111563833. +652639931 = 574630531 bor 111563833. +619085498 = 574630531 bxor 111563833. +-1031738667 = -355406881 band -1030817035. +-354485249 = -355406881 bor -1030817035. +677253418 = -355406881 bxor -1030817035. +-2013249423 = -1400740101 band -2011082383. +-1398573061 = -1400740101 bor -2011082383. +614676362 = -1400740101 bxor -2011082383. +1073746821 = 1611036631 band 1319670701. +1856960511 = 1611036631 bor 1319670701. +783213690 = 1611036631 bxor 1319670701. +205568033 = 760265331 band 216513961. +771211259 = 760265331 bor 216513961. +565643226 = 760265331 bxor 216513961. +-925857211 = -302871857 band -925529243. +-302543889 = -302871857 bor -925529243. +623313322 = -302871857 bxor -925529243. +-2129657631 = -1456012053 band -2028439327. +-1354793749 = -1456012053 bor -2028439327. +774863882 = -1456012053 bxor -2028439327. +1145176069 = 1711211719 band 1178780189. +1744815839 = 1711211719 bor 1178780189. +599639770 = 1711211719 bxor 1178780189. +4989441 = 777856611 band 30303001. +803170171 = 777856611 bor 30303001. +798180730 = 777856611 bxor 30303001. +-1060043371 = -521026113 band -925296683. +-386279425 = -521026113 bor -925296683. +673763946 = -521026113 bxor -925296683. +-2080351151 = -1408827685 band -2069865391. +-1398341925 = -1408827685 bor -2069865391. +682009226 = -1408827685 bxor -2069865391. +1244408965 = 1852616119 band 1253928077. +1862135231 = 1852616119 bor 1253928077. +617726266 = 1852616119 bxor 1253928077. +33571841 = 705982035 band 119620745. +792030939 = 705982035 bor 119620745. +758459098 = 705982035 bxor 119620745. +-1069514747 = -462578513 band -909074363. +-302138129 = -462578513 bor -909074363. +767376618 = -462578513 bxor -909074363. +-2147397439 = -1602136885 band -2074084415. +-1528823861 = -1602136885 bor -2074084415. +618573578 = -1602136885 bxor -2074084415. +1108218533 = 1859023527 band 1127191293. +1877996287 = 1859023527 bor 1127191293. +769777754 = 1859023527 bxor 1127191293. +241500225 = 786797123 band 241656313. +786953211 = 786797123 bor 241656313. +545452986 = 786797123 bxor 241656313. +-830405483 = -289075297 band -827120459. +-285790273 = -289075297 bor -827120459. +544615210 = -289075297 bxor -827120459. +-2118908367 = -1544223045 band -2118232271. +-1543546949 = -1544223045 bor -2118232271. +575361418 = -1544223045 bxor -2118232271. +1247809797 = 1784894359 band 1248867693. +1785952255 = 1784894359 bor 1248867693. +538142458 = 1784894359 bxor 1248867693. +15176225 = 620728883 band 149404521. +754957179 = 620728883 bor 149404521. +739780954 = 620728883 bxor 149404521. +-1005124603 = -334029169 band -969431771. +-298336337 = -334029169 bor -969431771. +706788266 = -334029169 bxor -969431771. +-2057304927 = -1519315797 band -1880985951. +-1342996821 = -1519315797 bor -1880985951. +714308106 = -1519315797 bxor -1880985951. +1107447941 = 1646940295 band 1326863325. +1866355679 = 1646940295 bor 1326863325. +758907738 = 1646940295 bxor 1326863325. +100745217 = 777088547 band 128536793. +804880123 = 777088547 bor 128536793. +704134906 = 777088547 bxor 128536793. +-901775083 = -297612929 band -892001899. +-287839745 = -297612929 bor -892001899. +613935338 = -297612929 bxor -892001899. +-2122300911 = -1513849189 band -1984740847. +-1376289125 = -1513849189 bor -1984740847. +746011786 = -1513849189 bxor -1984740847. +1080059973 = 1692559735 band 1131998797. +1744498559 = 1692559735 bor 1131998797. +664438586 = 1692559735 bxor 1131998797. +33694209 = 646587923 band 192094793. +804988507 = 646587923 bor 192094793. +771294298 = 646587923 bxor 192094793. +-1061023739 = -320401297 band -1027433979. +-286811537 = -320401297 bor -1027433979. +774212202 = -320401297 bxor -1027433979. +-2125053823 = -1484897141 band -2116562559. +-1476405877 = -1484897141 bor -2116562559. +648647946 = -1484897141 bxor -2116562559. +1292502053 = 1862966887 band 1303315645. +1873780479 = 1862966887 bor 1303315645. +581278426 = 1862966887 bxor 1303315645. +535041 = 588823043 band 80490425. +668778427 = 588823043 bor 80490425. +668243386 = 588823043 bxor 80490425. +-983432619 = -446500001 band -805892491. +-268959873 = -446500001 bor -805892491. +714472746 = -446500001 bxor -805892491. +-2103114639 = -1360173445 band -2101928719. +-1358987525 = -1360173445 bor -2101928719. +744127114 = -1360173445 bxor -2101928719. +1115784965 = 1793191767 band 1200592685. +1877999487 = 1793191767 bor 1200592685. +762214522 = 1793191767 bxor 1200592685. +52963617 = 590096883 band 66812201. +603945467 = 590096883 bor 66812201. +550981850 = 590096883 bxor 66812201. +-1073647035 = -355110321 band -1071022363. +-352485649 = -355110321 bor -1071022363. +721161386 = -355110321 bxor -1071022363. +-2111822751 = -1574902677 band -1904728991. +-1367808917 = -1574902677 bor -1904728991. +744013834 = -1574902677 bxor -1904728991. +1075905541 = 1617386567 band 1320265117. +1861746143 = 1617386567 bor 1320265117. +785840602 = 1617386567 bxor 1320265117. +151221377 = 800290275 band 151518873. +800587771 = 800290275 bor 151518873. +649366394 = 800290275 bxor 151518873. +-1005549291 = -434270913 band -858723499. +-287445121 = -434270913 bor -858723499. +718104170 = -434270913 bxor -858723499. +-2013157807 = -1461207461 band -1895700527. +-1343750181 = -1461207461 bor -1895700527. +669407626 = -1461207461 bxor -1895700527. +1145577477 = 1700390199 band 1147940877. +1702753599 = 1700390199 bor 1147940877. +557176122 = 1700390199 bxor 1147940877. +51937281 = 727555539 band 62439433. +738057691 = 727555539 bor 62439433. +686120410 = 727555539 bxor 62439433. +-1056948219 = -438680529 band -886811707. +-268544017 = -438680529 bor -886811707. +788404202 = -438680529 bxor -886811707. +-2066717631 = -1395592117 band -2047121599. +-1375996085 = -1395592117 bor -2047121599. +690721546 = -1395592117 bxor -2047121599. +1292894757 = 1832421927 band 1305884285. +1845411455 = 1832421927 bor 1305884285. +552516698 = 1832421927 bxor 1305884285. +43032897 = 580493763 band 60079481. +597540347 = 580493763 bor 60079481. +554507450 = 580493763 bxor 60079481. +-871722987 = -295004385 band -870664139. +-293945537 = -295004385 bor -870664139. +577777450 = -295004385 bxor -870664139. +-2012511695 = -1456765381 band -1932811599. +-1377065285 = -1456765381 bor -1932811599. +635446410 = -1456765381 bxor -1932811599. +1094846469 = 1765952279 band 1137096941. +1808202751 = 1765952279 bor 1137096941. +713356282 = 1765952279 bxor 1137096941. +58884257 = 731283891 band 132314857. +804714491 = 731283891 bor 132314857. +745830234 = 731283891 bxor 132314857. +-932642811 = -370309617 band -865396571. +-303063377 = -370309617 bor -865396571. +629579434 = -370309617 bxor -865396571. +-2147479519 = -1425640405 band -2070308319. +-1348469205 = -1425640405 bor -2070308319. +799010314 = -1425640405 bxor -2070308319. +1079255045 = 1752573959 band 1121236829. +1794555743 = 1752573959 bor 1121236829. +715300698 = 1752573959 bxor 1121236829. +100805633 = 641940899 band 262827097. +803962363 = 641940899 bor 262827097. +703156730 = 641940899 bxor 262827097. +-1073737707 = -398323457 band -997427947. +-322013697 = -398323457 bor -997427947. +751724010 = -398323457 bxor -997427947. +-2147480559 = -1590641125 band -2041819759. +-1484980325 = -1590641125 bor -2041819759. +662500234 = -1590641125 bxor -2041819759. +1125327045 = 1737695479 band 1264005581. +1876374015 = 1737695479 bor 1264005581. +751046970 = 1737695479 bxor 1264005581. +134354305 = 743363987 band 162667977. +771677659 = 743363987 bor 162667977. +637323354 = 743363987 bxor 162667977. +-939195003 = -284739601 band -927609467. +-273154065 = -284739601 bor -927609467. +666040938 = -284739601 bxor -927609467. +-2146950143 = -1405524981 band -2104836863. +-1363411701 = -1405524981 bor -2104836863. +783538442 = -1405524981 bxor -2104836863. +1090527269 = 1628976615 band 1097148477. +1635597823 = 1628976615 bor 1097148477. +545070554 = 1628976615 bxor 1097148477. +2305 = 556288387 band 75565881. +631851963 = 556288387 bor 75565881. +631849658 = 556288387 bxor 75565881. +-929423147 = -375653665 band -924966411. +-371196929 = -375653665 bor -924966411. +558226218 = -375653665 bxor -924966411. +-2144640911 = -1368431109 band -2118391695. +-1342181893 = -1368431109 bor -2118391695. +802459018 = -1368431109 bxor -2118391695. +1279525509 = 1833199319 band 1289067181. +1842740991 = 1833199319 bor 1289067181. +563215482 = 1833199319 bxor 1289067181. +6164513 = 570333555 band 241054889. +805223931 = 570333555 bor 241054889. +799059418 = 570333555 bxor 241054889. +-1071886267 = -383821361 band -1061391771. +-373326865 = -383821361 bor -1061391771. +698559402 = -383821361 bxor -1061391771. +-2147433503 = -1411267605 band -2079928351. +-1343762453 = -1411267605 bor -2079928351. +803671050 = -1411267605 bxor -2079928351. +1075216645 = 1645654983 band 1228900637. +1799338975 = 1645654983 bor 1228900637. +724122330 = 1645654983 bxor 1228900637. +88113153 = 633390435 band 89168409. +634445691 = 633390435 bor 89168409. +546332538 = 633390435 bxor 89168409. +-1002433387 = -462400321 band -943210795. +-403177729 = -462400321 bor -943210795. +599255658 = -462400321 bxor -943210795. +-2142080687 = -1436582437 band -2125302959. +-1419804709 = -1436582437 bor -2125302959. +722275978 = -1436582437 bxor -2125302959. +1095241861 = 1666063543 band 1174008717. +1744830399 = 1666063543 bor 1174008717. +649588538 = 1666063543 bxor 1174008717. +85788929 = 756927827 band 119487369. +790626267 = 756927827 bor 119487369. +704837338 = 756927827 bxor 119487369. +-1071316219 = -399643729 band -1053358267. +-381685777 = -399643729 bor -1053358267. +689630442 = -399643729 bxor -1053358267. +-2126146879 = -1585998901 band -1991912767. +-1451764789 = -1585998901 bor -1991912767. +674382090 = -1585998901 bxor -1991912767. +1107919269 = 1651089831 band 1176230397. +1719400959 = 1651089831 bor 1176230397. +611481690 = 1651089831 bxor 1176230397. +4161 = 579121475 band 22092025. +601209339 = 579121475 bor 22092025. +601205178 = 579121475 bxor 22092025. +-1006564715 = -424206689 band -872330315. +-289972289 = -424206689 bor -872330315. +716592426 = -424206689 bxor -872330315. +-2109668303 = -1434909253 band -2092437967. +-1417678917 = -1434909253 bor -2092437967. +691989386 = -1434909253 bxor -2092437967. +1076363269 = 1856520855 band 1081883757. +1862041343 = 1856520855 bor 1081883757. +785678074 = 1856520855 bxor 1081883757. +2371617 = 707031347 band 19739241. +724398971 = 707031347 bor 19739241. +722027354 = 707031347 bxor 19739241. +-1073181691 = -399839857 band -1025668059. +-352326225 = -399839857 bor -1025668059. +720855466 = -399839857 bxor -1025668059. +-2139962975 = -1603087445 band -1904228959. +-1367353429 = -1603087445 bor -1904228959. +772609546 = -1603087445 bxor -1904228959. +1157634693 = 1695088519 band 1337072349. +1874526175 = 1695088519 bor 1337072349. +716891482 = 1695088519 bxor 1337072349. +27788545 = 569117987 band 62556121. +603885563 = 569117987 bor 62556121. +576097018 = 569117987 bxor 62556121. +-935311339 = -362260353 band -868038507. +-294987521 = -362260353 bor -868038507. +640323818 = -362260353 bxor -868038507. +-2146412271 = -1607205477 band -2116789999. +-1577583205 = -1607205477 bor -2116789999. +568829066 = -1607205477 bxor -2116789999. +1073762373 = 1615517815 band 1108637005. +1650392447 = 1615517815 bor 1108637005. +576630074 = 1615517815 bxor 1108637005. +25166081 = 562726163 band 96475465. +634035547 = 562726163 bor 96475465. +608869466 = 562726163 bxor 96475465. +-1073217275 = -519151761 band -899153659. +-345088145 = -519151761 bor -899153659. +728129130 = -519151761 bxor -899153659. +-2008514431 = -1471446133 band -1947424639. +-1410356341 = -1471446133 bor -1947424639. +598158090 = -1471446133 bxor -1947424639. +1218988325 = 1760349543 band 1236945853. +1778307071 = 1760349543 bor 1236945853. +559318746 = 1760349543 bxor 1236945853. +38060033 = 711907587 band 63235769. +737083323 = 711907587 bor 63235769. +699023290 = 711907587 bxor 63235769. +-1052508075 = -444857761 band -884722315. +-277072001 = -444857761 bor -884722315. +775436074 = -444857761 bxor -884722315. +-2130173583 = -1459067525 band -2094025743. +-1422919685 = -1459067525 bor -2094025743. +707253898 = -1459067525 bxor -2094025743. +1143512581 = 1697504855 band 1283104301. +1837096575 = 1697504855 bor 1283104301. +693583994 = 1697504855 bxor 1283104301. +34078753 = 667420915 band 168816681. +802158843 = 667420915 bor 168816681. +768080090 = 667420915 bxor 168816681. +-1065336507 = -422559409 band -930191899. +-287414801 = -422559409 bor -930191899. +777921706 = -422559409 bxor -930191899. +-2076171423 = -1535532181 band -2050720927. +-1510081685 = -1535532181 bor -2050720927. +566089738 = -1535532181 bxor -2050720927. +1091307525 = 1762462535 band 1139567773. +1810722783 = 1762462535 bor 1139567773. +719415258 = 1762462535 bxor 1139567773. +75502721 = 780473571 band 78132633. +783103483 = 780473571 bor 78132633. +707600762 = 780473571 bxor 78132633. +-1045950443 = -370533313 band -943877547. +-268460417 = -370533313 bor -943877547. +777490026 = -370533313 bxor -943877547. +-2013250479 = -1368507045 band -1986920751. +-1342177317 = -1368507045 bor -1986920751. +671073162 = -1368507045 bxor -1986920751. +1145050117 = 1716081719 band 1298577165. +1869608767 = 1716081719 bor 1298577165. +724558650 = 1716081719 bxor 1298577165. +223654913 = 760544467 band 257210121. +794099675 = 760544467 bor 257210121. +570444762 = 760544467 bxor 257210121. +-938962427 = -379022545 band -905397563. +-345457681 = -379022545 bor -905397563. +593504746 = -379022545 bxor -905397563. +-1942670783 = -1401605301 band -1942012351. +-1400946869 = -1401605301 bor -1942012351. +541723914 = -1401605301 bxor -1942012351. +1207974181 = 1818343719 band 1241546109. +1851915647 = 1818343719 bor 1241546109. +643941466 = 1818343719 bxor 1241546109. +75776065 = 749125827 band 94139513. +767489275 = 749125827 bor 94139513. +691713210 = 749125827 bxor 94139513. +-1004370411 = -441801185 band -865673419. +-303104193 = -441801185 bor -865673419. +701266218 = -441801185 bxor -865673419. +-2129592015 = -1512209093 band -2093794895. +-1476411973 = -1512209093 bor -2093794895. +653180042 = -1512209093 bxor -2093794895. +1217411589 = 1754610199 band 1318109165. +1855307775 = 1754610199 bor 1318109165. +637896186 = 1754610199 bxor 1318109165. +41967777 = 782852275 band 46558697. +787443195 = 782852275 bor 46558697. +745475418 = 782852275 bxor 46558697. +-997305083 = -456174321 band -946929755. +-405798993 = -456174321 bor -946929755. +591506090 = -456174321 bxor -946929755. +-2087440095 = -1548340437 band -1953173215. +-1414073557 = -1548340437 bor -1953173215. +673366538 = -1548340437 bxor -1953173215. +1101157893 = 1709364999 band 1135509085. +1743716191 = 1709364999 bor 1135509085. +642558298 = 1709364999 bxor 1135509085. +21594113 = 793500835 band 31040345. +802947067 = 793500835 bor 31040345. +781352954 = 793500835 bxor 31040345. +-1028645867 = -491413505 band -805823467. +-268591105 = -491413505 bor -805823467. +760054762 = -491413505 bxor -805823467. +-2142624751 = -1597096677 band -1974770543. +-1429242469 = -1597096677 bor -1974770543. +713382282 = -1597096677 bxor -1974770543. +1157662917 = 1829343223 band 1169209549. +1840889855 = 1829343223 bor 1169209549. +683226938 = 1829343223 bxor 1169209549. +69014657 = 607990931 band 228398281. +767374555 = 607990931 bor 228398281. +698359898 = 607990931 bxor 228398281. +-1059584891 = -520321297 band -975620987. +-436357393 = -520321297 bor -975620987. +623227498 = -520321297 bxor -975620987. +-1984659455 = -1447779573 band -1946315775. +-1409435893 = -1447779573 bor -1946315775. +575223562 = -1447779573 bxor -1946315775. +1149789221 = 1686660327 band 1152282429. +1689153535 = 1686660327 bor 1152282429. +539364314 = 1686660327 bxor 1152282429. +8667137 = 753690755 band 9945657. +754969275 = 753690755 bor 9945657. +746302138 = 753690755 bxor 9945657. +-989787947 = -419231265 band -987150091. +-416593409 = -419231265 bor -987150091. +573194538 = -419231265 bxor -987150091. +-2079300495 = -1397201669 band -2062385295. +-1380286469 = -1397201669 bor -2062385295. +699014026 = -1397201669 bxor -2062385295. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/eq_big.dat erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/eq_big.dat --- erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/eq_big.dat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/eq_big.dat 2009-03-12 12:16:44.000000000 +0000 @@ -0,0 +1,13004 @@ +3627225882 = -697 + 3627226579. +-3627227276 = -697 - 3627226579. +-2528176925563 = -697 * 3627226579. +697 = -(-697). +-697 = +(-697). +0 = -697 div 3627226579. +-697 = -697 rem 3627226579. +3627226435 = -697 band 3627226579. +-553 = -697 bor 3627226579. +-3627226988 = -697 bxor 3627226579. +696 = bnot(-697). +-1 = -697 bsl -61. +-1607172577421944684544 = -697 bsr -61. +-283388912239615 = -283388912239613 + -2. +-283388912239611 = -283388912239613 - -2. +566777824479226 = -283388912239613 * -2. +283388912239613 = -(-283388912239613). +-283388912239613 = +(-283388912239613). +141694456119806 = -283388912239613 div -2. +-1 = -283388912239613 rem -2. +-283388912239614 = -283388912239613 band -2. +-1 = -283388912239613 bor -2. +283388912239613 = -283388912239613 bxor -2. +283388912239612 = bnot(-283388912239613). +-104896167137483835127591520601167100453480347078199925156632915223228188306305878154109985624943277357501787279310034030156370067160844817777591157023073455111626047495778039507502639061242015835277440456218702874565483838389693116456108032 = -283388912239613 bsl 746. +-1 = -283388912239613 bsr 746. +899396154689163167548626101 = 899396154689163167641847368 + -93221267. +899396154689163167735068635 = 899396154689163167641847368 - -93221267. +-83842849075051781657306413865575256 = 899396154689163167641847368 * -93221267. +-899396154689163167641847368 = -(899396154689163167641847368). +899396154689163167641847368 = +(899396154689163167641847368). +-9647971794774717743 = 899396154689163167641847368 div -93221267. +72006987 = 899396154689163167641847368 rem -93221267. +899396154689163167574066760 = 899396154689163167641847368 band -93221267. +-25440659 = 899396154689163167641847368 bor -93221267. +-899396154689163167599507419 = 899396154689163167641847368 bxor -93221267. +-899396154689163167641847369 = bnot(899396154689163167641847368). +0 = 899396154689163167641847368 bsl -253. +13017869975433327806566054549187146850478372938959200496342626543873703998010638391600224608668463661056 = 899396154689163167641847368 bsr -253. +38353289727271510973285999751 = 887666814621463939 + 38353289726383844158664535812. +-38353289725496177344043071873 = 887666814621463939 - 38353289726383844158664535812. +34044942521673265192360995015832746373332083468 = 887666814621463939 * 38353289726383844158664535812. +-887666814621463939 = -(887666814621463939). +887666814621463939 = +(887666814621463939). +0 = 887666814621463939 div 38353289726383844158664535812. +887666814621463939 = 887666814621463939 rem 38353289726383844158664535812. +594616166601860352 = 887666814621463939 band 38353289726383844158664535812. +38353289726676894806684139399 = 887666814621463939 bor 38353289726383844158664535812. +38353289726082278640082279047 = 887666814621463939 bxor 38353289726383844158664535812. +-887666814621463940 = bnot(887666814621463939). +0 = 887666814621463939 bsl -787. +722531143980030224978407003366379878572019340627220673638308476197912211331706163856015044590466259639511920085355248108717151013626249732488736624553440916080782402468384420123415848619840265859350798319617560713791523384835232073919483231937051903393792 = 887666814621463939 bsr -787. +-8515461716215666486977884 = -8515461716215666492151278 + 5173394. +-8515461716215666497324672 = -8515461716215666492151278 - 5173394. +-44053838549899831736496468697532 = -8515461716215666492151278 * 5173394. +8515461716215666492151278 = -(-8515461716215666492151278). +-8515461716215666492151278 = +(-8515461716215666492151278). +-1646010668473282045 = -8515461716215666492151278 div 5173394. +-240548 = -8515461716215666492151278 rem 5173394. +417810 = -8515461716215666492151278 band 5173394. +-8515461716215666487395694 = -8515461716215666492151278 bor 5173394. +-8515461716215666487813504 = -8515461716215666492151278 bxor 5173394. +8515461716215666492151277 = bnot(-8515461716215666492151278). +-1 = -8515461716215666492151278 bsl -594. +-552110015119483874455401000114182509753848554122155066504811641532970839680006262116242666380962025577884962904613845097544935294020129261657550847020494270805103895692818062392457706943718836114766692352 = -8515461716215666492151278 bsr -594. +-251589684634846873123391 = -251589684634846873115962 + -7429. +-251589684634846873108533 = -251589684634846873115962 - -7429. +1869059767152277420378481698 = -251589684634846873115962 * -7429. +251589684634846873115962 = -(-251589684634846873115962). +-251589684634846873115962 = +(-251589684634846873115962). +33865888361131629171 = -251589684634846873115962 div -7429. +-4603 = -251589684634846873115962 rem -7429. +-251589684634846873115966 = -251589684634846873115962 band -7429. +-7425 = -251589684634846873115962 bor -7429. +251589684634846873108541 = -251589684634846873115962 bxor -7429. +251589684634846873115961 = bnot(-251589684634846873115962). +-491386102802435299055 = -251589684634846873115962 bsl -9. +-128813918533041599035372544 = -251589684634846873115962 bsr -9. +-871998795379825 = -871998795375248 + -4577. +-871998795370671 = -871998795375248 - -4577. +3991138486432510096 = -871998795375248 * -4577. +871998795375248 = -(-871998795375248). +-871998795375248 = +(-871998795375248). +190517543232 = -871998795375248 div -4577. +-2384 = -871998795375248 rem -4577. +-871998795379696 = -871998795375248 band -4577. +-129 = -871998795375248 bor -4577. +871998795379567 = -871998795375248 bxor -4577. +871998795375247 = bnot(-871998795375248). +-1624225 = -871998795375248 bsl -29. +-468150788536010775986176 = -871998795375248 bsr -29. +-2991637738047072853981278 = -22265889556864555 + -2991637715781183297116723. +2991637693515293740252168 = -22265889556864555 - -2991637715781183297116723. +66611474973734380901960088484083736453265 = -22265889556864555 * -2991637715781183297116723. +22265889556864555 = -(-22265889556864555). +-22265889556864555 = +(-22265889556864555). +0 = -22265889556864555 div -2991637715781183297116723. +-22265889556864555 = -22265889556864555 rem -2991637715781183297116723. +-2991637717189315254902331 = -22265889556864555 band -2991637715781183297116723. +-20857757599078947 = -22265889556864555 bor -2991637715781183297116723. +2991637696331557655823384 = -22265889556864555 bxor -2991637715781183297116723. +22265889556864554 = bnot(-22265889556864555). +-17698916545639237821347114552137310261435038803077739211627488090044459979816479609975948949711590599556505345935296144423539391408146296529089297996491904195783620894238607320078819402991090831482824833109254755662658020392150316325223984043875368960 = -22265889556864555 bsl 777. +-1 = -22265889556864555 bsr 777. +-921330394855903 = -5867913648 + -921324526942255. +921318659028607 = -5867913648 - -921324526942255. +5406252765881601822396240 = -5867913648 * -921324526942255. +5867913648 = -(-5867913648). +-5867913648 = +(-5867913648). +0 = -5867913648 div -921324526942255. +-5867913648 = -5867913648 rem -921324526942255. +-921330042534320 = -5867913648 band -921324526942255. +-352321583 = -5867913648 bor -921324526942255. +921329690212737 = -5867913648 bxor -921324526942255. +5867913647 = bnot(-5867913648). +-10070509970159717552275921442977953280617487172740969541904499886948034952538118239864941771032831232670760838938532099451694651006107378590139473654943040250130202624 = -5867913648 bsl 519. +-1 = -5867913648 bsr 519. +1423045349 = 535282818 + 887762531. +-352479713 = 535282818 - 887762531. +475204029308492358 = 535282818 * 887762531. +-535282818 = -(535282818). +535282818 = +(535282818). +0 = 535282818 div 887762531. +535282818 = 535282818 rem 887762531. +350356482 = 535282818 band 887762531. +1072688867 = 535282818 bor 887762531. +722332385 = 535282818 bxor 887762531. +-535282819 = bnot(535282818). +11595019119157717269464123722338130937385408762397230511002837033772286450351880310576900208963283084603926920717598384092802353509433344 = 535282818 bsl 423. +0 = 535282818 bsr 423. +-9526614229 = -9526614162 + -67. +-9526614095 = -9526614162 - -67. +638283148854 = -9526614162 * -67. +9526614162 = -(-9526614162). +-9526614162 = +(-9526614162). +142188271 = -9526614162 div -67. +-5 = -9526614162 rem -67. +-9526614228 = -9526614162 band -67. +-1 = -9526614162 bor -67. +9526614227 = -9526614162 bxor -67. +9526614161 = bnot(-9526614162). +-4877626450944 = -9526614162 bsl 9. +-18606669 = -9526614162 bsr 9. +-98623731973471913763537026123 = -96141273121197669237423453745 + -2482458852274244526113572378. +-93658814268923424711309881367 = -96141273121197669237423453745 - -2482458852274244526113572378. +238666754528633040727288330786331678776932078104792655610 = -96141273121197669237423453745 * -2482458852274244526113572378. +96141273121197669237423453745 = -(-96141273121197669237423453745). +-96141273121197669237423453745 = +(-96141273121197669237423453745). +38 = -96141273121197669237423453745 div -2482458852274244526113572378. +-1807836734776377245107703381 = -96141273121197669237423453745 rem -2482458852274244526113572378. +-98618669153224018419052574266 = -96141273121197669237423453745 band -2482458852274244526113572378. +-5062820247895344484451857 = -96141273121197669237423453745 bor -2482458852274244526113572378. +98613606332976123074568122409 = -96141273121197669237423453745 bxor -2482458852274244526113572378. +96141273121197669237423453744 = bnot(-96141273121197669237423453745). +-1 = -96141273121197669237423453745 bsl -221. +-323995449482431561430955688380557595865526794242980577682451215826215493438826396507655362314240 = -96141273121197669237423453745 bsr -221. +-96275818948398693347585066750 = -96275818948398693352364564443 + 4779497693. +-96275818948398693357144062136 = -96275818948398693352364564443 - 4779497693. +-460150054555557240921840871850268329999 = -96275818948398693352364564443 * 4779497693. +96275818948398693352364564443 = -(-96275818948398693352364564443). +-96275818948398693352364564443 = +(-96275818948398693352364564443). +-20143501500043237567 = -96275818948398693352364564443 div 4779497693. +-637131512 = -96275818948398693352364564443 rem 4779497693. +4703911941 = -96275818948398693352364564443 band 4779497693. +-96275818948398693352288978691 = -96275818948398693352364564443 bor 4779497693. +-96275818948398693356992890632 = -96275818948398693352364564443 bxor 4779497693. +96275818948398693352364564442 = bnot(-96275818948398693352364564443). +-770206551587189546818916515544 = -96275818948398693352364564443 bsl 3. +-12034477368549836669045570556 = -96275818948398693352364564443 bsr 3. +-272689270240 = -5873 + -272689264367. +272689258494 = -5873 - -272689264367. +1601504049627391 = -5873 * -272689264367. +5873 = -(-5873). +-5873 = +(-5873). +0 = -5873 div -272689264367. +-5873 = -5873 rem -272689264367. +-272689264383 = -5873 band -272689264367. +-5857 = -5873 bor -272689264367. +272689258526 = -5873 bxor -272689264367. +5872 = bnot(-5873). +-1469 = -5873 bsl -2. +-23492 = -5873 bsr -2. +13670759686 = 7826527119 + 5844232567. +1982294552 = 7826527119 - 5844232567. +45740044675368484473 = 7826527119 * 5844232567. +-7826527119 = -(7826527119). +7826527119 = +(7826527119). +1 = 7826527119 div 5844232567. +1982294552 = 7826527119 rem 5844232567. +5642862855 = 7826527119 band 5844232567. +8027896831 = 7826527119 bor 5844232567. +2385033976 = 7826527119 bxor 5844232567. +-7826527120 = bnot(7826527119). +17210715144889395314688 = 7826527119 bsl 41. +0 = 7826527119 bsr 41. +-4341394495791782339893875 = -4341394495791781981452416 + -358441459. +-4341394495791781623010957 = -4341394495791781981452416 - -358441459. +1556135777166175693641714930114944 = -4341394495791781981452416 * -358441459. +4341394495791781981452416 = -(-4341394495791781981452416). +-4341394495791781981452416 = +(-4341394495791781981452416). +12111864815815800 = -4341394495791781981452416 div -358441459. +-354200216 = -4341394495791781981452416 rem -358441459. +-4341394495791782271384064 = -4341394495791781981452416 band -358441459. +-68509811 = -4341394495791781981452416 bor -358441459. +4341394495791782202874253 = -4341394495791781981452416 bxor -358441459. +4341394495791781981452415 = bnot(-4341394495791781981452416). +-32345909593938157 = -4341394495791781981452416 bsl -27. +-582692105576878538621881415630848 = -4341394495791781981452416 bsr -27. +25613348061753413432805 = -62561418842848 + 25613348124314832275653. +-25613348186876251118501 = -62561418842848 - 25613348124314832275653. +-1602407399972935425479526309823579744 = -62561418842848 * 25613348124314832275653. +62561418842848 = -(-62561418842848). +-62561418842848 = +(-62561418842848). +0 = -62561418842848 div 25613348124314832275653. +-62561418842848 = -62561418842848 rem 25613348124314832275653. +25613348062046077323264 = -62561418842848 band 25613348124314832275653. +-292663890459 = -62561418842848 bor 25613348124314832275653. +-25613348062338741213723 = -62561418842848 bxor 25613348124314832275653. +62561418842847 = bnot(-62561418842848). +-619578282400515063188185698798133487599616 = -62561418842848 bsl 93. +-1 = -62561418842848 bsr 93. +-415145595976523548470677 = -21466329235395744132 + -415124129647288152726545. +415102663318052756982413 = -21466329235395744132 - -415124129647288152726545. +8911191240565794849702499410197724984383940 = -21466329235395744132 * -415124129647288152726545. +21466329235395744132 = -(-21466329235395744132). +-21466329235395744132 = +(-21466329235395744132). +0 = -21466329235395744132 div -415124129647288152726545. +-21466329235395744132 = -21466329235395744132 rem -415124129647288152726545. +-415124229342963475389844 = -21466329235395744132 band -415124129647288152726545. +-21366633560073080833 = -21466329235395744132 bor -415124129647288152726545. +415102862709403402309011 = -21466329235395744132 bxor -415124129647288152726545. +21466329235395744131 = bnot(-21466329235395744132). +-10990760568522620995584 = -21466329235395744132 bsl 9. +-41926424287882313 = -21466329235395744132 bsr 9. +76468874711569513325056778 = 76468874711569513317743546 + 7313232. +76468874711569513310430314 = 76468874711569513317743546 - 7313232. +559234621544640935019748268400672 = 76468874711569513317743546 * 7313232. +-76468874711569513317743546 = -(76468874711569513317743546). +76468874711569513317743546 = +(76468874711569513317743546). +10456235315872587293 = 76468874711569513317743546 div 7313232. +3782570 = 76468874711569513317743546 rem 7313232. +2429712 = 76468874711569513317743546 band 7313232. +76468874711569513322627066 = 76468874711569513317743546 bor 7313232. +76468874711569513320197354 = 76468874711569513317743546 bxor 7313232. +-76468874711569513317743547 = bnot(76468874711569513317743546). +0 = 76468874711569513317743546 bsl -746. +28304889556786495453831814324215420256373810154437575218925605423140242106417314289689964336921067023412402676980609685783148483385245613331457090830852471386788403077786640815058022739945601734382573174324776692555808679848887824494250404725122924544 = 76468874711569513317743546 bsr -746. +-5897699569812678369906 = -762 + -5897699569812678369144. +5897699569812678368382 = -762 - -5897699569812678369144. +4494047072197260917287728 = -762 * -5897699569812678369144. +762 = -(-762). +-762 = +(-762). +0 = -762 div -5897699569812678369144. +-762 = -762 rem -5897699569812678369144. +-5897699569812678369280 = -762 band -5897699569812678369144. +-626 = -762 bor -5897699569812678369144. +5897699569812678368654 = -762 bxor -5897699569812678369144. +761 = bnot(-762). +-1 = -762 bsl -47. +-107241966126759936 = -762 bsr -47. +93648805036749 = 93648894616213 + -89579464. +93648984195677 = 93648894616213 - -89579464. +-8389017783912846249832 = 93648894616213 * -89579464. +-93648894616213 = -(93648894616213). +93648894616213 = +(93648894616213). +-1045428 = 93648894616213 div -89579464. +14725621 = 93648894616213 rem -89579464. +93648809631760 = 93648894616213 band -89579464. +-4595011 = 93648894616213 bor -89579464. +-93648814226771 = 93648894616213 bxor -89579464. +-93648894616214 = bnot(93648894616213). +50277367460398163296256 = 93648894616213 bsl 29. +174434 = 93648894616213 bsr 29. +-5348788016 = -5287491547 + -61296469. +-5226195078 = -5287491547 - -61296469. +324104561698447543 = -5287491547 * -61296469. +5287491547 = -(-5287491547). +-5287491547 = +(-5287491547). +86 = -5287491547 div -61296469. +-15995213 = -5287491547 rem -61296469. +-5296357343 = -5287491547 band -61296469. +-52430673 = -5287491547 bor -61296469. +5243926670 = -5287491547 bxor -61296469. +5287491546 = bnot(-5287491547). +-1 = -5287491547 bsl -85. +-204549921669196753881551737878216704 = -5287491547 bsr -85. +762439979239339795156546850 = 762439979239339795156537669 + 9181. +762439979239339795156528488 = 762439979239339795156537669 - 9181. +6999961449396378659332172339089 = 762439979239339795156537669 * 9181. +-762439979239339795156537669 = -(762439979239339795156537669). +762439979239339795156537669 = +(762439979239339795156537669). +83045417627637489941894 = 762439979239339795156537669 div 9181. +8855 = 762439979239339795156537669 rem 9181. +325 = 762439979239339795156537669 band 9181. +762439979239339795156546525 = 762439979239339795156537669 bor 9181. +762439979239339795156546200 = 762439979239339795156537669 bxor 9181. +-762439979239339795156537670 = bnot(762439979239339795156537669). +45201673274459720178644042862458985496925598168922005361232603694334612864372839655498293719782600063582208 = 762439979239339795156537669 bsl 265. +0 = 762439979239339795156537669 bsr 265. +-556183529548738362375165 = -556183529548742715698331 + 4353323166. +-556183529548747069021497 = -556183529548742715698331 - 4353323166. +-2421246643732187190423296209835946 = -556183529548742715698331 * 4353323166. +556183529548742715698331 = -(-556183529548742715698331). +-556183529548742715698331 = +(-556183529548742715698331). +-127760680367725 = -556183529548742715698331 div 4353323166. +-4074480981 = -556183529548742715698331 rem 4353323166. +4348448772 = -556183529548742715698331 band 4353323166. +-556183529548742710823937 = -556183529548742715698331 bor 4353323166. +-556183529548747059272709 = -556183529548742715698331 bxor 4353323166. +556183529548742715698330 = bnot(-556183529548742715698331). +-164156403641570095641504089198946277272846336 = -556183529548742715698331 bsl 68. +-1885 = -556183529548742715698331 bsr 68. +-58828870360392725 = -58828872875851219 + 2515458494. +-58828875391309713 = -58828872875851219 - 2515458494. +-147981587968006156313804186 = -58828872875851219 * 2515458494. +58828872875851219 = -(-58828872875851219). +-58828872875851219 = +(-58828872875851219). +-23386938 = -58828872875851219 div 2515458494. +-1035099847 = -58828872875851219 rem 2515458494. +2174926892 = -58828872875851219 band 2515458494. +-58828872535319617 = -58828872875851219 bor 2515458494. +-58828874710246509 = -58828872875851219 bxor 2515458494. +58828872875851218 = bnot(-58828872875851219). +-1 = -58828872875851219 bsl -897. +-62157943626374948997432249001986780504201035968394074770676882720538609168733361134066329678956567940750449072796753898138503322952919077398530702139123003614916021436073293455615861224266659917484107541556523561584386197396750779974331385916265028971325138931043761240917394354411143168 = -58828872875851219 bsr -897. +958617833851552 = 959151593526117 + -533759674565. +959685353200682 = 959151593526117 - -533759674565. +-511956442419001370748114105 = 959151593526117 * -533759674565. +-959151593526117 = -(959151593526117). +959151593526117 = +(959151593526117). +-1796 = 959151593526117 div -533759674565. +519218007377 = 959151593526117 rem -533759674565. +958789708714785 = 959151593526117 band -533759674565. +-171874863233 = 959151593526117 bor -533759674565. +-958961583578018 = 959151593526117 bxor -533759674565. +-959151593526118 = bnot(959151593526117). +0 = 959151593526117 bsl -396. +154798067840604982832706767635620816692372607293762470743157215497890321537138188100605114026166068788312392515811048749195833808781312 = 959151593526117 bsr -396. +-24447692715287 = 2228231 + -24447694943518. +24447697171749 = 2228231 - -24447694943518. +-54475111751690056658 = 2228231 * -24447694943518. +-2228231 = -(2228231). +2228231 = +(2228231). +0 = 2228231 div -24447694943518. +2228231 = 2228231 rem -24447694943518. +131074 = 2228231 band -24447694943518. +-24447692846361 = 2228231 bor -24447694943518. +-24447692977435 = 2228231 bxor -24447694943518. +-2228232 = bnot(2228231). +1412309182298573913763200240009084928 = 2228231 bsl 99. +0 = 2228231 bsr 99. +-529636755821667055158 = -93556888355645 + -529636662264778699513. +529636568707890343868 = -93556888355645 - -529636662264778699513. +49551158080562357886280616132300885 = -93556888355645 * -529636662264778699513. +93556888355645 = -(-93556888355645). +-93556888355645 = +(-93556888355645). +0 = -93556888355645 div -529636662264778699513. +-93556888355645 = -93556888355645 rem -529636662264778699513. +-529636685380830622717 = -93556888355645 band -529636662264778699513. +-70440836432441 = -93556888355645 bor -529636662264778699513. +529636614939994190276 = -93556888355645 bxor -529636662264778699513. +93556888355644 = bnot(-93556888355645). +-365456595140 = -93556888355645 bsl -8. +-23950563419045120 = -93556888355645 bsr -8. +92142373454895610795790155642 = 92142373447271694876236992324 + 7623915919553163318. +92142373439647778956683829006 = 92142373447271694876236992324 - 7623915919553163318. +702485707790067362709541849380847259784284371032 = 92142373447271694876236992324 * 7623915919553163318. +-92142373447271694876236992324 = -(92142373447271694876236992324). +92142373447271694876236992324 = +(92142373447271694876236992324). +12085964013 = 92142373447271694876236992324 div 7623915919553163318. +5414359974577317190 = 92142373447271694876236992324 rem 7623915919553163318. +7602101606705807364 = 92142373447271694876236992324 band 7623915919553163318. +92142373447293509189084348278 = 92142373447271694876236992324 bor 7623915919553163318. +92142373439691407582378540914 = 92142373447271694876236992324 bxor 7623915919553163318. +-92142373447271694876236992325 = bnot(92142373447271694876236992324). +23588447602501553888316670034944 = 92142373447271694876236992324 bsl 8. +359931146278405058110300751 = 92142373447271694876236992324 bsr 8. +-55748392941580801751 = 514177926246 + -55748393455758727997. +55748393969936654243 = 514177926246 - -55748393455758727997. +-28664593338628100308012241309262 = 514177926246 * -55748393455758727997. +-514177926246 = -(514177926246). +514177926246 = +(514177926246). +0 = 514177926246 div -55748393455758727997. +514177926246 = 514177926246 rem -55748393455758727997. +21579695170 = 514177926246 band -55748393455758727997. +-55748392963160496921 = 514177926246 bor -55748393455758727997. +-55748392984740192091 = 514177926246 bxor -55748393455758727997. +-514177926247 = bnot(514177926246). +131629549118976 = 514177926246 bsl 8. +2008507524 = 514177926246 bsr 8. +6972198921324448981856466 = 474612 + 6972198921324448981381854. +-6972198921324448980907242 = 474612 - 6972198921324448981381854. +3309089274447639379951604490648 = 474612 * 6972198921324448981381854. +-474612 = -(474612). +474612 = +(474612). +0 = 474612 div 6972198921324448981381854. +474612 = 474612 rem 6972198921324448981381854. +143572 = 474612 band 6972198921324448981381854. +6972198921324448981712894 = 474612 bor 6972198921324448981381854. +6972198921324448981569322 = 474612 bxor 6972198921324448981381854. +-474613 = bnot(474612). +1853 = 474612 bsl -8. +121500672 = 474612 bsr -8. +-62665821848439446596209498285 = -62665821855634398988562936143 + 7194952392353437858. +-62665821862829351380916374001 = -62665821855634398988562936143 - 7194952392353437858. +-450877604878991071526708285254256154704572701694 = -62665821855634398988562936143 * 7194952392353437858. +62665821855634398988562936143 = -(-62665821855634398988562936143). +-62665821855634398988562936143 = +(-62665821855634398988562936143). +-8709692356 = -62665821855634398988562936143 div 7194952392353437858. +-2169748426419322695 = -62665821855634398988562936143 rem 7194952392353437858. +2382407589730371744 = -62665821855634398988562936143 band 7194952392353437858. +-62665821850821854185939870029 = -62665821855634398988562936143 bor 7194952392353437858. +-62665821853204261775670241773 = -62665821855634398988562936143 bxor 7194952392353437858. +62665821855634398988562936142 = bnot(-62665821855634398988562936143). +-1084817767643660244780522213629153953898926080345040453069544371713234463275536771280298267170010833880597802476198435796829522365121191004077579629400494449329542774627983279936815553926960929899067484269699889551711727747590392357842956761256251073907540863242281989377617906220851861591680884999716864 = -62665821855634398988562936143 bsl 911. +-1 = -62665821855634398988562936143 bsr 911. +94260648081969 = 98519912838757 + -4259264756788. +102779177595545 = 98519912838757 - -4259264756788. +-419622392595943292265232516 = 98519912838757 * -4259264756788. +-98519912838757 = -(98519912838757). +98519912838757 = +(98519912838757). +-23 = 98519912838757 div -4259264756788. +556823432633 = 98519912838757 rem -4259264756788. +96758365946436 = 98519912838757 band -4259264756788. +-2497717864467 = 98519912838757 bor -4259264756788. +-99256083810903 = 98519912838757 bxor -4259264756788. +-98519912838758 = bnot(98519912838757). +1377686678635590569341335761341476992469445833833739901863031756572672973825711307939900985089843549770640275075499187023317754094386723724653949486126864958044191347876801655313662239288766310820240641344937421666103930076472730808791105944640660351508298072064 = 98519912838757 bsl 821. +0 = 98519912838757 bsr 821. +-484369358674959980331422569 = -85182295312 + -484369358674959895149127257. +484369358674959809966831945 = -85182295312 - -484369358674959895149127257. +41259693750734482808349514284842519184 = -85182295312 * -484369358674959895149127257. +85182295312 = -(-85182295312). +-85182295312 = +(-85182295312). +0 = -85182295312 div -484369358674959895149127257. +-85182295312 = -85182295312 rem -484369358674959895149127257. +-484369358674959975763652448 = -85182295312 band -484369358674959895149127257. +-4567770121 = -85182295312 bor -484369358674959895149127257. +484369358674959971195882327 = -85182295312 bxor -484369358674959895149127257. +85182295311 = bnot(-85182295312). +-658380353059922195180871506894252321738235694807762272644705873309199760459060567795020296114869851753437837983701591902586517465082146648836526078746238102492112557942174580605976576 = -85182295312 bsl 571. +-1 = -85182295312 bsr 571. +-2694483758798 = -8325666717994 + 5631182959196. +-13956849677190 = -8325666717994 - 5631182959196. +-46883352546313102140972824 = -8325666717994 * 5631182959196. +8325666717994 = -(-8325666717994). +-8325666717994 = +(-8325666717994). +-1 = -8325666717994 div 5631182959196. +-2694483758798 = -8325666717994 rem 5631182959196. +55910117972 = -8325666717994 band 5631182959196. +-2750393876770 = -8325666717994 bor 5631182959196. +-2806303994742 = -8325666717994 bxor 5631182959196. +8325666717993 = bnot(-8325666717994). +-33302666871976 = -8325666717994 bsl 2. +-2081416679499 = -8325666717994 bsr 2. +19250113 = 24817572 + -5567459. +30385031 = 24817572 - -5567459. +-138170814589548 = 24817572 * -5567459. +-24817572 = -(24817572). +24817572 = +(24817572). +-4 = 24817572 div -5567459. +2547736 = 24817572 rem -5567459. +19532804 = 24817572 band -5567459. +-282691 = 24817572 bor -5567459. +-19815495 = 24817572 bxor -5567459. +-24817573 = bnot(24817572). +3176649216 = 24817572 bsl 7. +193887 = 24817572 bsr 7. +-986197265 = -986197241 + -24. +-986197217 = -986197241 - -24. +23668733784 = -986197241 * -24. +986197241 = -(-986197241). +-986197241 = +(-986197241). +41091551 = -986197241 div -24. +-17 = -986197241 rem -24. +-986197248 = -986197241 band -24. +-17 = -986197241 bor -24. +986197231 = -986197241 bxor -24. +986197240 = bnot(-986197241). +-1 = -986197241 bsl -81. +-2384478615755221950666675513720832 = -986197241 bsr -81. +732942200343775581690880232 = 732934871577251234126124376 + 7328766524347564755856. +732927542810726886561368520 = 732934871577251234126124376 - 7328766524347564755856. +5371508551342340254299322759521810138255930345856 = 732934871577251234126124376 * 7328766524347564755856. +-732934871577251234126124376 = -(732934871577251234126124376). +732934871577251234126124376 = +(732934871577251234126124376). +100007 = 732934871577251234126124376 div 7328766524347564755856. +6917776824325587233384 = 732934871577251234126124376 rem 7328766524347564755856. +2600995417994822156560 = 732934871577251234126124376 band 7328766524347564755856. +732939599348357586868723672 = 732934871577251234126124376 bor 7328766524347564755856. +732936998352939592046567112 = 732934871577251234126124376 bxor 7328766524347564755856. +-732934871577251234126124377 = bnot(732934871577251234126124376). +55082520201569452267604508957951350510286308219191612295828187656546553125849458644923371557579438629117140030970114012095759709458399232 = 732934871577251234126124376 bsl 365. +0 = 732934871577251234126124376 bsr 365. +546282386 = 546282474 + -88. +546282562 = 546282474 - -88. +-48072857712 = 546282474 * -88. +-546282474 = -(546282474). +546282474 = +(546282474). +-6207755 = 546282474 div -88. +34 = 546282474 rem -88. +546282408 = 546282474 band -88. +-22 = 546282474 bor -88. +-546282430 = 546282474 bxor -88. +-546282475 = bnot(546282474). +0 = 546282474 bsl -813. +29840338297334282138450456656187711109660907212364379909472719157266715168793742613319458215652373579139998102057611417555902445129790415236383563474617625018813617946269840102762316133855929231416002055980335539109980770638424358837471127735450896171008 = 546282474 bsr -813. +4322312878927677411598763 = 4322312878917964499415617 + 9712912183146. +4322312878908251587232471 = 4322312878917964499415617 - 9712912183146. +41982245421011158924257465556676591082 = 4322312878917964499415617 * 9712912183146. +-4322312878917964499415617 = -(4322312878917964499415617). +4322312878917964499415617 = +(4322312878917964499415617). +445006893650 = 4322312878917964499415617 div 9712912183146. +923154992717 = 4322312878917964499415617 rem 9712912183146. +9643921384000 = 4322312878917964499415617 band 9712912183146. +4322312878918033490214763 = 4322312878917964499415617 bor 9712912183146. +4322312878908389568830763 = 4322312878917964499415617 bxor 9712912183146. +-4322312878917964499415618 = bnot(4322312878917964499415617). +31859856237028551888120820009923328758300029661585733548532377883593603909573437430715960643388604457851166218950251358566044377514463637163386275663830923200450335964662085432581827661398016 = 4322312878917964499415617 bsl 551. +0 = 4322312878917964499415617 bsr 551. +-337755121673376495033 = 511116728 + -337755121673887611761. +337755121674398728489 = 511116728 - -337755121673887611761. +-172632292655199319163016638008 = 511116728 * -337755121673887611761. +-511116728 = -(511116728). +511116728 = +(511116728). +0 = 511116728 div -337755121673887611761. +511116728 = 511116728 rem -337755121673887611761. +102171784 = 511116728 band -337755121673887611761. +-337755121673478666817 = 511116728 bor -337755121673887611761. +-337755121673580838601 = 511116728 bxor -337755121673887611761. +-511116729 = bnot(511116728). +127779182 = 511116728 bsl -2. +2044466912 = 511116728 bsr -2. +-6656675232558356241402161741 = -6656675232558356263876529115 + 22474367374. +-6656675232558356286350896489 = -6656675232558356263876529115 - 22474367374. +-149604564665923384567935200706517094010 = -6656675232558356263876529115 * 22474367374. +6656675232558356263876529115 = -(-6656675232558356263876529115). +-6656675232558356263876529115 = +(-6656675232558356263876529115). +-296189660059543541 = -6656675232558356263876529115 div 22474367374. +-8693697781 = -6656675232558356263876529115 rem 22474367374. +5284962308 = -6656675232558356263876529115 band 22474367374. +-6656675232558356246687124049 = -6656675232558356263876529115 bor 22474367374. +-6656675232558356251972086357 = -6656675232558356263876529115 bxor 22474367374. +6656675232558356263876529114 = bnot(-6656675232558356263876529115). +-4098224355635156475671491056479847988400246161035515855685751443750385849166363304055370075768214282026921745868015574871345586307288593858560 = -6656675232558356263876529115 bsl 378. +-1 = -6656675232558356263876529115 bsr 378. +-834784265375442923 = 492876415643 + -834784758251858566. +834785251128274209 = 492876415643 - -834784758251858566. +-411445719480584316653065947938 = 492876415643 * -834784758251858566. +-492876415643 = -(492876415643). +492876415643 = +(492876415643). +0 = 492876415643 div -834784758251858566. +492876415643 = 492876415643 rem -834784758251858566. +147106316314 = 492876415643 band -834784758251858566. +-834784412481759237 = 492876415643 bor -834784758251858566. +-834784559588075551 = 492876415643 bxor -834784758251858566. +-492876415644 = bnot(492876415643). +7886022650288 = 492876415643 bsl 4. +30804775977 = 492876415643 bsr 4. +786997892440 = 786994155228 + 3737212. +786990418016 = 786994155228 - 3737212. +2941164000847944336 = 786994155228 * 3737212. +-786994155228 = -(786994155228). +786994155228 = +(786994155228). +210583 = 786994155228 div 3737212. +840632 = 786994155228 rem 3737212. +67164 = 786994155228 band 3737212. +786997825276 = 786994155228 bor 3737212. +786997758112 = 786994155228 bxor 3737212. +-786994155229 = bnot(786994155228). +5561993252649343873980481383423107439067560947225604842146139928323085688976506355712 = 786994155228 bsl 242. +0 = 786994155228 bsr 242. +4598250297565 = -9548772 + 4598259846337. +-4598269395109 = -9548772 - 4598259846337. +-43907734869427048164 = -9548772 * 4598259846337. +9548772 = -(-9548772). +-9548772 = +(-9548772). +0 = -9548772 div 4598259846337. +-9548772 = -9548772 rem 4598259846337. +4598251392000 = -9548772 band 4598259846337. +-1094435 = -9548772 bor 4598259846337. +-4598252486435 = -9548772 bxor 4598259846337. +9548771 = bnot(-9548772). +-1 = -9548772 bsl -27. +-1281614483030016 = -9548772 bsr -27. +17 = -77 + 94. +-171 = -77 - 94. +-7238 = -77 * 94. +77 = -(-77). +-77 = +(-77). +0 = -77 div 94. +-77 = -77 rem 94. +18 = -77 band 94. +-1 = -77 bor 94. +-19 = -77 bxor 94. +76 = bnot(-77). +-3 = -77 bsl -5. +-2464 = -77 bsr -5. +77134258283273549 = -6 + 77134258283273555. +-77134258283273561 = -6 - 77134258283273555. +-462805549699641330 = -6 * 77134258283273555. +6 = -(-6). +-6 = +(-6). +0 = -6 div 77134258283273555. +-6 = -6 rem 77134258283273555. +77134258283273554 = -6 band 77134258283273555. +-5 = -6 bor 77134258283273555. +-77134258283273559 = -6 bxor 77134258283273555. +5 = bnot(-6). +-384 = -6 bsl 6. +-1 = -6 bsr 6. +29183275531772892507 = -55766289 + 29183275531828658796. +-29183275531884425085 = -55766289 - 29183275531828658796. +-1627442977274585684900128044 = -55766289 * 29183275531828658796. +55766289 = -(-55766289). +-55766289 = +(-55766289). +0 = -55766289 div 29183275531828658796. +-55766289 = -55766289 rem 29183275531828658796. +29183275531823284844 = -55766289 band 29183275531828658796. +-50392337 = -55766289 bor 29183275531828658796. +-29183275531873677181 = -55766289 bxor 29183275531828658796. +55766288 = bnot(-55766289). +-4018384613763766240149504 = -55766289 bsl 56. +-1 = -55766289 bsr 56. +365086117139147091661 = 361132233426153168792 + 3953883712993922869. +357178349713159245923 = 361132233426153168792 - 3953883712993922869. +1427874855980786554439175373063185904248 = 361132233426153168792 * 3953883712993922869. +-361132233426153168792 = -(361132233426153168792). +361132233426153168792 = +(361132233426153168792). +91 = 361132233426153168792 div 3953883712993922869. +1328815543706187713 = 361132233426153168792 rem 3953883712993922869. +1339544090379063056 = 361132233426153168792 band 3953883712993922869. +363746573048768028605 = 361132233426153168792 bor 3953883712993922869. +362407028958388965549 = 361132233426153168792 bxor 3953883712993922869. +-361132233426153168793 = bnot(361132233426153168792). +0 = 361132233426153168792 bsl -696. +118725289140703491556836465932452495756105260575954009599581403128900049342467809199936615485148280430682318251152714265033690995374449129825872565827751619376374351380769605395391077677220595122612287408817961317361349732033626112 = 361132233426153168792 bsr -696. +-6141584268641914214120 = -6141584268641914217341 + 3221. +-6141584268641914220562 = -6141584268641914217341 - 3221. +-19782042929295605694055361 = -6141584268641914217341 * 3221. +6141584268641914217341 = -(-6141584268641914217341). +-6141584268641914217341 = +(-6141584268641914217341). +-1906732154188734621 = -6141584268641914217341 div 3221. +-3100 = -6141584268641914217341 rem 3221. +3201 = -6141584268641914217341 band 3221. +-6141584268641914217321 = -6141584268641914217341 bor 3221. +-6141584268641914220522 = -6141584268641914217341 bxor 3221. +6141584268641914217340 = bnot(-6141584268641914217341). +-1751288345237585826291073747928848023048343983742588022682591874328785777092434928905126541446820557558701485007668624934352026410694513865411795125375468600332166887490883186250928441914174496707171387583523454976 = -6141584268641914217341 bsl 636. +-1 = -6141584268641914217341 bsr 636. +67861760423550 = 61265567725173 + 6596192698377. +54669375026796 = 61265567725173 - 6596192698377. +404119490490707732419144221 = 61265567725173 * 6596192698377. +-61265567725173 = -(61265567725173). +61265567725173 = +(61265567725173). +9 = 61265567725173 div 6596192698377. +1899833439780 = 61265567725173 rem 6596192698377. +6289981702145 = 61265567725173 band 6596192698377. +61571778721405 = 61265567725173 bor 6596192698377. +55281797019260 = 61265567725173 bxor 6596192698377. +-61265567725174 = bnot(61265567725173). +239318623926 = 61265567725173 bsl -8. +15683985337644288 = 61265567725173 bsr -8. +47116745348335290 = -8 + 47116745348335298. +-47116745348335306 = -8 - 47116745348335298. +-376933962786682384 = -8 * 47116745348335298. +8 = -(-8). +-8 = +(-8). +0 = -8 div 47116745348335298. +-8 = -8 rem 47116745348335298. +47116745348335296 = -8 band 47116745348335298. +-6 = -8 bor 47116745348335298. +-47116745348335302 = -8 bxor 47116745348335298. +7 = bnot(-8). +-32 = -8 bsl 2. +-2 = -8 bsr 2. +-88573984901610957 = -88567592543696663 + -6392357914294. +-88561200185782369 = -88567592543696663 - -6392357914294. +566155751146665626751287800922 = -88567592543696663 * -6392357914294. +88567592543696663 = -(-88567592543696663). +-88567592543696663 = +(-88567592543696663). +13855 = -88567592543696663 div -6392357914294. +-1473641153293 = -88567592543696663 rem -6392357914294. +-88567662371518392 = -88567592543696663 band -6392357914294. +-6322530092565 = -88567592543696663 bor -6392357914294. +88561339841425827 = -88567592543696663 bxor -6392357914294. +88567592543696662 = bnot(-88567592543696663). +-45346607382372691456 = -88567592543696663 bsl 9. +-172983579186908 = -88567592543696663 bsr 9. +-9146156523089801569030876897 = -8817572254811883426431653785 + -328584268277918142599223112. +-8488987986533965283832430673 = -8817572254811883426431653785 - -328584268277918142599223112. +2897315527335035496667139099181367051282066106354278920 = -8817572254811883426431653785 * -328584268277918142599223112. +8817572254811883426431653785 = -(-8817572254811883426431653785). +-8817572254811883426431653785 = +(-8817572254811883426431653785). +26 = -8817572254811883426431653785 div -328584268277918142599223112. +-274381279586011718851852873 = -8817572254811883426431653785 rem -328584268277918142599223112. +-9129798012702552983602681824 = -8817572254811883426431653785 band -328584268277918142599223112. +-16358510387248585428195073 = -8817572254811883426431653785 bor -328584268277918142599223112. +9113439502315304398174486751 = -8817572254811883426431653785 bxor -328584268277918142599223112. +8817572254811883426431653784 = bnot(-8817572254811883426431653785). +-2204393063702970856607913447 = -8817572254811883426431653785 bsl -2. +-35270289019247533705726615140 = -8817572254811883426431653785 bsr -2. +465928375553828382292956748 = -3346318897841 + 465928375553831728611854589. +-465928375553835074930752430 = -3346318897841 - 465928375553831728611854589. +-1559144928156145718052797073149438042349 = -3346318897841 * 465928375553831728611854589. +3346318897841 = -(-3346318897841). +-3346318897841 = +(-3346318897841). +0 = -3346318897841 div 465928375553831728611854589. +-3346318897841 = -3346318897841 rem 465928375553831728611854589. +465928375553830594738128973 = -3346318897841 band 465928375553831728611854589. +-2212445172225 = -3346318897841 bor 465928375553831728611854589. +-465928375553832807183301198 = -3346318897841 bxor 465928375553831728611854589. +3346318897840 = bnot(-3346318897841). +-1 = -3346318897841 bsl -73. +-31605088408315261556739799276060672 = -3346318897841 bsr -73. +-62714104103016144602 = 21419246681141769 + -62735523349697286371. +62756942596378428140 = 21419246681141769 - -62735523349697286371. +-1343747650297695555866511519242530299 = 21419246681141769 * -62735523349697286371. +-21419246681141769 = -(21419246681141769). +21419246681141769 = +(21419246681141769). +0 = 21419246681141769 div -62735523349697286371. +21419246681141769 = 21419246681141769 rem -62735523349697286371. +21392787656221193 = 21419246681141769 band -62735523349697286371. +-62735496890672365795 = 21419246681141769 bor -62735523349697286371. +-62756889678328586988 = 21419246681141769 bxor -62735523349697286371. +-21419246681141770 = bnot(21419246681141769). +301135451132850879823076333720532272357865951171292782157020618613801305055882637248865896221318709819446722148208834930598535508005104228433238569815922886879036217445134106624 = 21419246681141769 bsl 532. +0 = 21419246681141769 bsr 532. +-422346012809773866 = 287563561651815 + -422633576371425681. +422921139933077496 = 287563561651815 - -422633576371425681. +-121534016495011532057750871261015 = 287563561651815 * -422633576371425681. +-287563561651815 = -(287563561651815). +287563561651815 = +(287563561651815). +0 = 287563561651815 div -422633576371425681. +287563561651815 = 287563561651815 rem -422633576371425681. +1099548348007 = 287563561651815 band -422633576371425681. +-422347112358121873 = 287563561651815 bor -422633576371425681. +-422348211906469880 = 287563561651815 bxor -422633576371425681. +-287563561651816 = bnot(287563561651815). +0 = 287563561651815 bsl -69. +169747565654893748186088190802657280 = 287563561651815 bsr -69. +5798686886864655553 = 5798686886864655561 + -8. +5798686886864655569 = 5798686886864655561 - -8. +-46389495094917244488 = 5798686886864655561 * -8. +-5798686886864655561 = -(5798686886864655561). +5798686886864655561 = +(5798686886864655561). +-724835860858081945 = 5798686886864655561 div -8. +1 = 5798686886864655561 rem -8. +5798686886864655560 = 5798686886864655561 band -8. +-7 = 5798686886864655561 bor -8. +-5798686886864655567 = 5798686886864655561 bxor -8. +-5798686886864655562 = bnot(5798686886864655561). +2765029376442 = 5798686886864655561 bsl -21. +12160727802161986139062272 = 5798686886864655561 bsr -21. +34535239279974682 = 34535239283838143 + -3863461. +34535239287701604 = 34535239283838143 - -3863461. +-133425550098776595792923 = 34535239283838143 * -3863461. +-34535239283838143 = -(34535239283838143). +34535239283838143 = +(34535239283838143). +-8938938243 = 34535239283838143 div -3863461. +599120 = 34535239283838143 rem -3863461. +34535239280036891 = 34535239283838143 band -3863461. +-62209 = 34535239283838143 bor -3863461. +-34535239280099100 = 34535239283838143 bxor -3863461. +-34535239283838144 = bnot(34535239283838143). +4635241352613102673199104 = 34535239283838143 bsl 27. +257307583 = 34535239283838143 bsr 27. +-368153716082640201944396754031 = 76753291427389858788 + -368153716159393493371786612819. +368153716236146784799176471607 = 76753291427389858788 - -368153716159393493371786612819. +-28257009466458495941911927915494931764981240603372 = 76753291427389858788 * -368153716159393493371786612819. +-76753291427389858788 = -(76753291427389858788). +76753291427389858788 = +(76753291427389858788). +0 = 76753291427389858788 div -368153716159393493371786612819. +76753291427389858788 = 76753291427389858788 rem -368153716159393493371786612819. +72118344229069732 = 76753291427389858788 band -368153716159393493371786612819. +-368153716082712320288625823763 = 76753291427389858788 bor -368153716159393493371786612819. +-368153716082784438632854893495 = 76753291427389858788 bxor -368153716159393493371786612819. +-76753291427389858789 = bnot(76753291427389858788). +0 = 76753291427389858788 bsl -366. +11536535890257593071038976300375871109868892628109738378273396023014903115688063580778111060947038640339585509431463222210442821632 = 76753291427389858788 bsr -366. +1884609829208532322882303799 = 2248556246542721798153863135 + -363946417334189475271559336. +2612502663876911273425422471 = 2248556246542721798153863135 - -363946417334189475271559336. +-818353990103636068016594906757526612446893223775478360 = 2248556246542721798153863135 * -363946417334189475271559336. +-2248556246542721798153863135 = -(2248556246542721798153863135). +2248556246542721798153863135 = +(2248556246542721798153863135). +-6 = 2248556246542721798153863135 div -363946417334189475271559336. +64877742537584946524507119 = 2248556246542721798153863135 rem -363946417334189475271559336. +1937843304908427225687799640 = 2248556246542721798153863135 band -363946417334189475271559336. +-53233475699894902805495841 = 2248556246542721798153863135 bor -363946417334189475271559336. +-1991076780608322128493295481 = 2248556246542721798153863135 bxor -363946417334189475271559336. +-2248556246542721798153863136 = bnot(2248556246542721798153863135). +7801246615 = 2248556246542721798153863135 bsl -58. +648102212739289793590374371758327316548157440 = 2248556246542721798153863135 bsr -58. +-927242187530948173 = 881216 + -927242187531829389. +927242187532710605 = 881216 - -927242187531829389. +-817100651528048566857024 = 881216 * -927242187531829389. +-881216 = -(881216). +881216 = +(881216). +0 = 881216 div -927242187531829389. +881216 = 881216 rem -927242187531829389. +537152 = 881216 band -927242187531829389. +-927242187531485325 = 881216 bor -927242187531829389. +-927242187532022477 = 881216 bxor -927242187531829389. +-881217 = bnot(881216). +56397824 = 881216 bsl 6. +13769 = 881216 bsr 6. +-92294491442187688455153989533 = -92294491442187686323776125311 + -2131377864222. +-92294491442187684192398261089 = -92294491442187686323776125311 - -2131377864222. +196714436049505647464037636743433815523042 = -92294491442187686323776125311 * -2131377864222. +92294491442187686323776125311 = -(-92294491442187686323776125311). +-92294491442187686323776125311 = +(-92294491442187686323776125311). +43302735282876372 = -92294491442187686323776125311 div -2131377864222. +-1561548162727 = -92294491442187686323776125311 rem -2131377864222. +-92294491442187687148409847680 = -92294491442187686323776125311 band -2131377864222. +-1306744141853 = -92294491442187686323776125311 bor -2131377864222. +92294491442187685841665705827 = -92294491442187686323776125311 bxor -2131377864222. +92294491442187686323776125310 = bnot(-92294491442187686323776125311). +-185999584514065598597956584080419883018491093214177575881974373283864097380857203228341277386380643103031653648497557735646336491731819166395960639369110660948577337627072201396978938963758595137324517976756474055979267842414815940739328582451905282350545473628506864588391433882838514410717184 = -92294491442187686323776125311 bsl 878. +-1 = -92294491442187686323776125311 bsr 878. +-22992720593436056750377491 = -81183965279133325738952927 + 58191244685697268988575436. +-139375209964830594727528363 = -81183965279133325738952927 - 58191244685697268988575436. +-4724195988113198744171942818553380419018847992501172 = -81183965279133325738952927 * 58191244685697268988575436. +81183965279133325738952927 = -(-81183965279133325738952927). +-81183965279133325738952927 = +(-81183965279133325738952927). +-1 = -81183965279133325738952927 div 58191244685697268988575436. +-22992720593436056750377491 = -81183965279133325738952927 rem 58191244685697268988575436. +58029031944576824657589760 = -81183965279133325738952927 band 58191244685697268988575436. +-81021752538012881407967251 = -81183965279133325738952927 bor 58191244685697268988575436. +-139050784482589706065557011 = -81183965279133325738952927 bxor 58191244685697268988575436. +81183965279133325738952926 = bnot(-81183965279133325738952927). +-5019815681416656113511808829597582218059123923898989834827865951504562132517509866352730861760071653866933645628409284104571167935680767215508231731030047302186971796092169038304272610902626447392768 = -81183965279133325738952927 bsl 574. +-1 = -81183965279133325738952927 bsr 574. +-627171199928636384 = 3 + -627171199928636387. +627171199928636390 = 3 - -627171199928636387. +-1881513599785909161 = 3 * -627171199928636387. +-3 = -(3). +3 = +(3). +0 = 3 div -627171199928636387. +3 = 3 rem -627171199928636387. +1 = 3 band -627171199928636387. +-627171199928636385 = 3 bor -627171199928636387. +-627171199928636386 = 3 bxor -627171199928636387. +-4 = bnot(3). +14167099448608935641088 = 3 bsl 72. +0 = 3 bsr 72. +38489905028814522963407073 = 38489896817115623696432732 + 8211698899266974341. +38489888605416724429458391 = 38489896817115623696432732 - 8211698899266974341. +316067443326007786301602416749121180676529612 = 38489896817115623696432732 * 8211698899266974341. +-38489896817115623696432732 = -(38489896817115623696432732). +38489896817115623696432732 = +(38489896817115623696432732). +4687202 = 38489896817115623696432732 div 8211698899266974341. +5313073663031348850 = 38489896817115623696432732 rem 8211698899266974341. +8126112209232212484 = 38489896817115623696432732 band 8211698899266974341. +38489896902702313731194589 = 38489896817115623696432732 bor 8211698899266974341. +38489888776590104498982105 = 38489896817115623696432732 bxor 8211698899266974341. +-38489896817115623696432733 = bnot(38489896817115623696432732). +75175579720928952532095 = 38489896817115623696432732 bsl -9. +19706827170363199332573558784 = 38489896817115623696432732 bsr -9. +83662398216864836064980991875 = -577817779741 + 83662398216864836642798771616. +-83662398216864837220616551357 = -577817779741 - 83662398216864836642798771616. +-48341621185476237330836646511399250631456 = -577817779741 * 83662398216864836642798771616. +577817779741 = -(-577817779741). +-577817779741 = +(-577817779741). +0 = -577817779741 div 83662398216864836642798771616. +-577817779741 = -577817779741 rem 83662398216864836642798771616. +83662398216864836084310213024 = -577817779741 band 83662398216864836642798771616. +-19329221149 = -577817779741 bor 83662398216864836642798771616. +-83662398216864836103639434173 = -577817779741 bxor 83662398216864836642798771616. +577817779740 = bnot(-577817779741). +-18490168951712 = -577817779741 bsl 5. +-18056805617 = -577817779741 bsr 5. +-9323712223762171796121 = -9323712223762171796118 + -3. +-9323712223762171796115 = -9323712223762171796118 - -3. +27971136671286515388354 = -9323712223762171796118 * -3. +9323712223762171796118 = -(-9323712223762171796118). +-9323712223762171796118 = +(-9323712223762171796118). +3107904074587390598706 = -9323712223762171796118 div -3. +0 = -9323712223762171796118 rem -3. +-9323712223762171796120 = -9323712223762171796118 band -3. +-1 = -9323712223762171796118 bor -3. +9323712223762171796119 = -9323712223762171796118 bxor -3. +9323712223762171796117 = bnot(-9323712223762171796118). +-383156198468100171274531995553938956410245284103900601718134146024035993174671945925044898293687575318577045701862973654972998397835931164269051794643753412311088298486910253034674495588871621252033983025960411401743062972766355456 = -9323712223762171796118 bsl 693. +-1 = -9323712223762171796118 bsr 693. +3758818439164718652970 = 3758818439164718653841 + -871. +3758818439164718654712 = 3758818439164718653841 - -871. +-3273930860512469947495511 = 3758818439164718653841 * -871. +-3758818439164718653841 = -(3758818439164718653841). +3758818439164718653841 = +(3758818439164718653841). +-4315520596055934160 = 3758818439164718653841 div -871. +481 = 3758818439164718653841 rem -871. +3758818439164718653585 = 3758818439164718653841 band -871. +-615 = 3758818439164718653841 bor -871. +-3758818439164718654200 = 3758818439164718653841 bxor -871. +-3758818439164718653842 = bnot(3758818439164718653841). +0 = 3758818439164718653841 bsl -562. +56742558204536011717878679188974270513240470254145891506083143932073281639818006934936298751805558180191534955833936593373339751482539304001976191488311896199919676896644311542788491013259264 = 3758818439164718653841 bsr -562. +91757988939962461471635 = 91757988939962489784156 + -28312521. +91757988939962518096677 = 91757988939962489784156 - -28312521. +-2597899988780455731226202217276 = 91757988939962489784156 * -28312521. +-91757988939962489784156 = -(91757988939962489784156). +91757988939962489784156 = +(91757988939962489784156). +-3240897867765378 = 91757988939962489784156 div -28312521. +2086218 = 91757988939962489784156 rem -28312521. +91757988939962461471764 = 91757988939962489784156 band -28312521. +-129 = 91757988939962489784156 bor -28312521. +-91757988939962461471893 = 91757988939962489784156 bxor -28312521. +-91757988939962489784157 = bnot(91757988939962489784156). +1733259406022409871975898372007034246140002304 = 91757988939962489784156 bsl 74. +4 = 91757988939962489784156 bsr 74. +39565775828 = -21 + 39565775849. +-39565775870 = -21 - 39565775849. +-830881292829 = -21 * 39565775849. +21 = -(-21). +-21 = +(-21). +0 = -21 div 39565775849. +-21 = -21 rem 39565775849. +39565775849 = -21 band 39565775849. +-21 = -21 bor 39565775849. +-39565775870 = -21 bxor 39565775849. +20 = bnot(-21). +-336 = -21 bsl 4. +-2 = -21 bsr 4. +-29762862369475373945987344 = 5 + -29762862369475373945987349. +29762862369475373945987354 = 5 - -29762862369475373945987349. +-148814311847376869729936745 = 5 * -29762862369475373945987349. +-5 = -(5). +5 = +(5). +0 = 5 div -29762862369475373945987349. +5 = 5 rem -29762862369475373945987349. +1 = 5 band -29762862369475373945987349. +-29762862369475373945987345 = 5 bor -29762862369475373945987349. +-29762862369475373945987346 = 5 bxor -29762862369475373945987349. +-6 = bnot(5). +96714065569170333976494080 = 5 bsl 84. +0 = 5 bsr 84. +732729761416169004741 = 732729756148682423249 + 5267486581492. +732729750881195841757 = 732729756148682423249 - 5267486581492. +3859644158373089945319821673907508 = 732729756148682423249 * 5267486581492. +-732729756148682423249 = -(732729756148682423249). +732729756148682423249 = +(732729756148682423249). +139104247 = 732729756148682423249 div 5267486581492. +1647633626725 = 732729756148682423249 rem 5267486581492. +4434025915088 = 732729756148682423249 band 5267486581492. +732729756982143089653 = 732729756148682423249 bor 5267486581492. +732729752548117174565 = 732729756148682423249 bxor 5267486581492. +-732729756148682423250 = bnot(732729756148682423249). +23447352196757837543968 = 732729756148682423249 bsl 5. +22897804879646325726 = 732729756148682423249 bsr 5. +-4352599859673007 = -4352599857524451 + -2148556. +-4352599855375895 = -4352599857524451 - -2148556. +9351804539483304342756 = -4352599857524451 * -2148556. +4352599857524451 = -(-4352599857524451). +-4352599857524451 = +(-4352599857524451). +2025825651 = -4352599857524451 div -2148556. +-114495 = -4352599857524451 rem -2148556. +-4352599859654380 = -4352599857524451 band -2148556. +-18627 = -4352599857524451 bor -2148556. +4352599859635753 = -4352599857524451 bxor -2148556. +4352599857524450 = bnot(-4352599857524451). +-506710 = -4352599857524451 bsl -33. +-37388548081283553130708992 = -4352599857524451 bsr -33. +-94389634156317189166047 = -94389634156317189165519 + -528. +-94389634156317189164991 = -94389634156317189165519 - -528. +49837726834535475879394032 = -94389634156317189165519 * -528. +94389634156317189165519 = -(-94389634156317189165519). +-94389634156317189165519 = +(-94389634156317189165519). +178768246508176494631 = -94389634156317189165519 div -528. +-351 = -94389634156317189165519 rem -528. +-94389634156317189166032 = -94389634156317189165519 band -528. +-15 = -94389634156317189165519 bor -528. +94389634156317189166017 = -94389634156317189165519 bxor -528. +94389634156317189165518 = bnot(-94389634156317189165519). +-1 = -94389634156317189165519 bsl -481. +-589321407184680099467763885021504893476495349802993815326732172023506652597245345883037146499772326893673837721264247748151299039384987799013342753209972052494215282688 = -94389634156317189165519 bsr -481. +74772711469266263075409212497 = 2119146693595222 + 74772711469264143928715617275. +-74772711469262024782022022053 = 2119146693595222 - 74772711469264143928715617275. +158454344281240644616172070363307888720660050 = 2119146693595222 * 74772711469264143928715617275. +-2119146693595222 = -(2119146693595222). +2119146693595222 = +(2119146693595222). +0 = 2119146693595222 div 74772711469264143928715617275. +2119146693595222 = 2119146693595222 rem 74772711469264143928715617275. +425787105083474 = 2119146693595222 band 74772711469264143928715617275. +74772711469265837288304129023 = 2119146693595222 bor 74772711469264143928715617275. +74772711469265411501199045549 = 2119146693595222 bxor 74772711469264143928715617275. +-2119146693595223 = bnot(2119146693595222). +60 = 2119146693595222 bsl -45. +74560845778272347356034760704 = 2119146693595222 bsr -45. +-433169449654421572447807185 = 3451446756 + -433169449654421575899253941. +433169449654421579350700697 = 3451446756 - -433169449654421575899253941. +-1495061291808058669193887797484665396 = 3451446756 * -433169449654421575899253941. +-3451446756 = -(3451446756). +3451446756 = +(3451446756). +0 = 3451446756 div -433169449654421575899253941. +3451446756 = 3451446756 rem -433169449654421575899253941. +1143497024 = 3451446756 band -433169449654421575899253941. +-433169449654421573591304209 = 3451446756 bor -433169449654421575899253941. +-433169449654421574734801233 = 3451446756 bxor -433169449654421575899253941. +-3451446757 = bnot(3451446756). +1698155371193525204830545916836568128680441580998381568463828606592094114468682671168384424246732426433969671163465789195711765615185779492213847037840137881175115452783147995343129479623640605849293724317507773619519108156500008029348686509290662078665092776507457142784 = 3451446756 bsl 866. +0 = 3451446756 bsr 866. +76344137685153051759 = 58961 + 76344137685152992798. +-76344137685152933837 = 58961 - 76344137685152992798. +4501326702054305608362878 = 58961 * 76344137685152992798. +-58961 = -(58961). +58961 = +(58961). +0 = 58961 div 76344137685152992798. +58961 = 58961 rem 76344137685152992798. +34320 = 58961 band 76344137685152992798. +76344137685153017439 = 58961 bor 76344137685152992798. +76344137685152983119 = 58961 bxor 76344137685152992798. +-58962 = bnot(58961). +0 = 58961 bsl -42. +259313220341202944 = 58961 bsr -42. +57479277147034760219615969056 = -8862494328917399859 + 57479277155897254548533368915. +-57479277164759748877450768774 = -8862494328917399859 - 57479277155897254548533368915. +-509409767824410870945391245069230635419415982985 = -8862494328917399859 * 57479277155897254548533368915. +8862494328917399859 = -(-8862494328917399859). +-8862494328917399859 = +(-8862494328917399859). +0 = -8862494328917399859 div 57479277155897254548533368915. +-8862494328917399859 = -8862494328917399859 rem 57479277155897254548533368915. +57479277151278456879468134465 = -8862494328917399859 band 57479277155897254548533368915. +-4243696659852165409 = -8862494328917399859 bor 57479277155897254548533368915. +-57479277155522153539320299874 = -8862494328917399859 bxor 57479277155897254548533368915. +8862494328917399858 = bnot(-8862494328917399859). +-2215623582229349965 = -8862494328917399859 bsl -2. +-35449977315669599436 = -8862494328917399859 bsr -2. +-789815706 = -789767185 + -48521. +-789718664 = -789767185 - -48521. +38320293583385 = -789767185 * -48521. +789767185 = -(-789767185). +-789767185 = +(-789767185). +16276 = -789767185 div -48521. +-39389 = -789767185 rem -48521. +-789773721 = -789767185 band -48521. +-41985 = -789767185 bor -48521. +789731736 = -789767185 bxor -48521. +789767184 = bnot(-789767185). +-1 = -789767185 bsl -668. +-967244320475332459002335950829023241212009066219700749912658431836369087690997676597488152418437276434629255755917760744115452947683138425828558291918401735328264621736592953964668879409046635974873824215695360 = -789767185 bsr -668. +-777623247658461946715588637616 = -44827 + -777623247658461946715588592789. +777623247658461946715588547962 = -44827 - -777623247658461946715588592789. +34858517322785873685419689848952503 = -44827 * -777623247658461946715588592789. +44827 = -(-44827). +-44827 = +(-44827). +0 = -44827 div -777623247658461946715588592789. +-44827 = -44827 rem -777623247658461946715588592789. +-777623247658461946715588636575 = -44827 band -777623247658461946715588592789. +-1041 = -44827 bor -777623247658461946715588592789. +777623247658461946715588635534 = -44827 bxor -777623247658461946715588592789. +44826 = bnot(-44827). +-358616 = -44827 bsl 3. +-5604 = -44827 bsr 3. +-49423188549633 = 25351124379885 + -74774312929518. +100125437309403 = 25351124379885 - -74774312929518. +-1895612907496653945461945430 = 25351124379885 * -74774312929518. +-25351124379885 = -(25351124379885). +25351124379885 = +(25351124379885). +0 = 25351124379885 div -74774312929518. +25351124379885 = 25351124379885 rem -74774312929518. +20950926172160 = 25351124379885 band -74774312929518. +-70374114721793 = 25351124379885 bor -74774312929518. +-91325040893953 = 25351124379885 bxor -74774312929518. +-25351124379886 = bnot(25351124379885). +52597442651485657809365458667747892670808001914636976424691825090673452876305446441790869078292405009570560626596540131597379195232839616586590302364353984959784155371906169553655674683921530880 = 25351124379885 bsl 599. +0 = 25351124379885 bsr 599. +-15852865259102721198 = -9926283823219191664 + -5926581435883529534. +-3999702387335662130 = -9926283823219191664 - -5926581435883529534. +58828929434001848172249748630750604576 = -9926283823219191664 * -5926581435883529534. +9926283823219191664 = -(-9926283823219191664). +-9926283823219191664 = +(-9926283823219191664). +1 = -9926283823219191664 div -5926581435883529534. +-3999702387335662130 = -9926283823219191664 rem -5926581435883529534. +-15852528765024317312 = -9926283823219191664 band -5926581435883529534. +-336494078403886 = -9926283823219191664 bor -5926581435883529534. +15852192270945913426 = -9926283823219191664 bxor -5926581435883529534. +9926283823219191663 = bnot(-9926283823219191664). +-1547756045176818240766206999809915530671296664991964117799518055392269366077386494692881433839074405311077250537837886767801418064914093372206515291028891547675977370286094990394268275016242604106038028738327402925622139791354161601330758117019767057343663418879325827380964335218533457494233551068446561665024 = -9926283823219191664 bsl 964. +-1 = -9926283823219191664 bsr 964. +-383677947339064 = -383677947346213 + 7149. +-383677947353362 = -383677947346213 - 7149. +-2742913645578076737 = -383677947346213 * 7149. +383677947346213 = -(-383677947346213). +-383677947346213 = +(-383677947346213). +-53668757497 = -383677947346213 div 7149. +-160 = -383677947346213 rem 7149. +713 = -383677947346213 band 7149. +-383677947339777 = -383677947346213 bor 7149. +-383677947340490 = -383677947346213 bxor 7149. +383677947346212 = bnot(-383677947346213). +-184349993378748017410350293410895821521862783586301195774935674013710260738384110439146111760752677495343397910854837653850092153763712234228462046128933001276753302353480921523231388620474310418148418884596127970493618659407853109150585379373807238231576711160423795130368 = -383677947346213 bsl 856. +-1 = -383677947346213 bsr 856. +8912273195587815868165187 = 8912273195587893298126921 + -77429961734. +8912273195587970728088655 = 8912273195587893298126921 - -77429961734. +-690076972497324475707642546905241014 = 8912273195587893298126921 * -77429961734. +-8912273195587893298126921 = -(8912273195587893298126921). +8912273195587893298126921 = +(8912273195587893298126921). +-115101092600365 = 8912273195587893298126921 div -77429961734. +40793694011 = 8912273195587893298126921 rem -77429961734. +8912273195587815954481224 = 8912273195587893298126921 band -77429961734. +-86316037 = 8912273195587893298126921 bor -77429961734. +-8912273195587816040797261 = 8912273195587893298126921 bxor -77429961734. +-8912273195587893298126922 = bnot(8912273195587893298126921). +278508537362121665566466 = 8912273195587893298126921 bsl -5. +285192742258812585540061472 = 8912273195587893298126921 bsr -5. +-8319732734949941921 = 2 + -8319732734949941923. +8319732734949941925 = 2 - -8319732734949941923. +-16639465469899883846 = 2 * -8319732734949941923. +-2 = -(2). +2 = +(2). +0 = 2 div -8319732734949941923. +2 = 2 rem -8319732734949941923. +0 = 2 band -8319732734949941923. +-8319732734949941921 = 2 bor -8319732734949941923. +-8319732734949941921 = 2 bxor -8319732734949941923. +-3 = bnot(2). +0 = 2 bsl -349. +2293498615990071511610820895302086940796564989168281123737588839386922876088484808070018553110125686554624 = 2 bsr -349. +-55166512001 = -55166511776 + -225. +-55166511551 = -55166511776 - -225. +12412465149600 = -55166511776 * -225. +55166511776 = -(-55166511776). +-55166511776 = +(-55166511776). +245184496 = -55166511776 div -225. +-176 = -55166511776 rem -225. +-55166511872 = -55166511776 band -225. +-129 = -55166511776 bor -225. +55166511743 = -55166511776 bxor -225. +55166511775 = bnot(-55166511776). +-1 = -55166511776 bsl -632. +-983179429919357600188043312907429492583409892139791338942729556793990055834694805047122432028004044528336229548373177381065816092507597262686575422335137617441398222885097037637605200400385762127773696 = -55166511776 bsr -632. +44636453572121039829328985 = 44636453523244412987464786 + 48876626841864199. +44636453474367786145600587 = 44636453523244412987464786 - 48876626841864199. +2181679282399831671724744654409275106596414 = 44636453523244412987464786 * 48876626841864199. +-44636453523244412987464786 = -(44636453523244412987464786). +44636453523244412987464786 = +(44636453523244412987464786). +913247423 = 44636453523244412987464786 div 48876626841864199. +14979304734755609 = 44636453523244412987464786 rem 48876626841864199. +12705992542390274 = 44636453523244412987464786 band 48876626841864199. +44636453559415047286938711 = 44636453523244412987464786 bor 48876626841864199. +44636453546709054744548437 = 44636453523244412987464786 bxor 48876626841864199. +-44636453523244412987464787 = bnot(44636453523244412987464786). +147 = 44636453523244412987464786 bsl -78. +13490540290069638524711849676635183589775674179584 = 44636453523244412987464786 bsr -78. +6178626537631128165561247990 = 62599 + 6178626537631128165561185391. +-6178626537631128165561122792 = 62599 - 6178626537631128165561185391. +386775842629170992035964644291209 = 62599 * 6178626537631128165561185391. +-62599 = -(62599). +62599 = +(62599). +0 = 62599 div 6178626537631128165561185391. +62599 = 62599 rem 6178626537631128165561185391. +46087 = 62599 band 6178626537631128165561185391. +6178626537631128165561201903 = 62599 bor 6178626537631128165561185391. +6178626537631128165561155816 = 62599 bxor 6178626537631128165561185391. +-62600 = bnot(62599). +781673350004923190769026419951289670294225980530738116290529466062354581913514032215644166982686135610536024245075732746528591318191069487553834909696 = 62599 bsl 482. +0 = 62599 bsr 482. +61294794533664140628529 = 28755399394 + 61294794533635385229135. +-61294794533606629829741 = 28755399394 - 61294794533635385229135. +1762556297587853469034825130144190 = 28755399394 * 61294794533635385229135. +-28755399394 = -(28755399394). +28755399394 = +(28755399394). +0 = 28755399394 div 61294794533635385229135. +28755399394 = 28755399394 rem 61294794533635385229135. +8593347138 = 28755399394 band 61294794533635385229135. +61294794533655547281391 = 28755399394 bor 61294794533635385229135. +61294794533646953934253 = 28755399394 bxor 61294794533635385229135. +-28755399395 = bnot(28755399394). +224651557 = 28755399394 bsl -7. +3680691122432 = 28755399394 bsr -7. +68356591755465309388702963323 = 68356591755456717891361834647 + 8591497341128676. +68356591755448126394020705971 = 68356591755456717891361834647 - 8591497341128676. +587285476315624766804947477869971049062037372 = 68356591755456717891361834647 * 8591497341128676. +-68356591755456717891361834647 = -(68356591755456717891361834647). +68356591755456717891361834647 = +(68356591755456717891361834647). +7956307153611 = 68356591755456717891361834647 div 8591497341128676. +4747063712785611 = 68356591755456717891361834647 rem 8591497341128676. +141569639843460 = 68356591755456717891361834647 band 8591497341128676. +68356591755465167819063119863 = 68356591755456717891361834647 bor 8591497341128676. +68356591755465026249423276403 = 68356591755456717891361834647 bxor 8591497341128676. +-68356591755456717891361834648 = bnot(68356591755456717891361834647). +573416652452558267357221017014501376 = 68356591755456717891361834647 bsl 23. +8148740739280786262912 = 68356591755456717891361834647 bsr 23. +-699567528957588408229971773208 = -699567528956825442116545643412 + -762966113426129796. +-699567528956062476003119513616 = -699567528956825442116545643412 - -762966113426129796. +533746318647310620793763440997871100807844303952 = -699567528956825442116545643412 * -762966113426129796. +699567528956825442116545643412 = -(-699567528956825442116545643412). +-699567528956825442116545643412 = +(-699567528956825442116545643412). +916905111047 = -699567528956825442116545643412 div -762966113426129796. +-741903883730187000 = -699567528956825442116545643412 rem -762966113426129796. +-699567528957407700745095857044 = -699567528956825442116545643412 band -762966113426129796. +-180707484875916164 = -699567528956825442116545643412 bor -762966113426129796. +699567528957226993260219940880 = -699567528956825442116545643412 bxor -762966113426129796. +699567528956825442116545643411 = bnot(-699567528956825442116545643412). +-1550121224195987807290171107091258107712715916897584379572599658174498656050114252196127509785981291190843396381201329621527162385718421440264449420454387485687802987709033516486490246567477835931041196955025926459411521992418704737782360971317378993141120628074117433571666760150601966198593076802069987328 = -699567528956825442116545643412 bsl 918. +-1 = -699567528956825442116545643412 bsr 918. +-2968553792195197914198583324 = -2968553792195197914198583351 + 27. +-2968553792195197914198583378 = -2968553792195197914198583351 - 27. +-80150952389270343683361750477 = -2968553792195197914198583351 * 27. +2968553792195197914198583351 = -(-2968553792195197914198583351). +-2968553792195197914198583351 = +(-2968553792195197914198583351). +-109946436747970293118466050 = -2968553792195197914198583351 div 27. +-1 = -2968553792195197914198583351 rem 27. +9 = -2968553792195197914198583351 band 27. +-2968553792195197914198583333 = -2968553792195197914198583351 bor 27. +-2968553792195197914198583342 = -2968553792195197914198583351 bxor 27. +2968553792195197914198583350 = bnot(-2968553792195197914198583351). +-664188490871115306642579814060706102409828879569937769141553990272626475834572045731134930507314228990954986433495077258998829005959661816677464155727409238268814013379673829080983557475938736170397612032475671508364459503815492935041291646492770907720336592025769311712837632 = -2968553792195197914198583351 bsl 825. +-1 = -2968553792195197914198583351 bsr 825. +815573798945895524991106 = -441683913266449 + 815573799387579438257555. +-815573799829263351524004 = -441683913266449 - 815573799387579438257555. +-360225827271091913160959947957002272195 = -441683913266449 * 815573799387579438257555. +441683913266449 = -(-441683913266449). +-441683913266449 = +(-441683913266449). +0 = -441683913266449 div 815573799387579438257555. +-441683913266449 = -441683913266449 rem 815573799387579438257555. +815573799104386470379651 = -441683913266449 band 815573799387579438257555. +-158490945388545 = -441683913266449 bor 815573799387579438257555. +-815573799262877415768196 = -441683913266449 bxor 815573799387579438257555. +441683913266448 = bnot(-441683913266449). +-1932146918834075102100431195023309123629707192731767591505727311905482150279583583222046778003171933397097960701952 = -441683913266449 bsl 331. +-1 = -441683913266449 bsr 331. +52204 = 52158 + 46. +52112 = 52158 - 46. +2399268 = 52158 * 46. +-52158 = -(52158). +52158 = +(52158). +1133 = 52158 div 46. +40 = 52158 rem 46. +46 = 52158 band 46. +52158 = 52158 bor 46. +52112 = 52158 bxor 46. +-52159 = bnot(52158). +0 = 52158 bsl -52. +234898749364390330368 = 52158 bsr -52. +-97487593454442928269 = -4927 + -97487593454442923342. +97487593454442918415 = -4927 - -97487593454442923342. +480321372950040283306034 = -4927 * -97487593454442923342. +4927 = -(-4927). +-4927 = +(-4927). +0 = -4927 div -97487593454442923342. +-4927 = -4927 rem -97487593454442923342. +-97487593454442928000 = -4927 band -97487593454442923342. +-269 = -4927 bor -97487593454442923342. +97487593454442927731 = -4927 bxor -97487593454442923342. +4926 = bnot(-4927). +-14589799195796190115888637427625179461957316219966820150531977446278291785975988233475185242269022363399606798448114009259810209040362721455852515037780569978447627385816054314892114758123179507549420923285371859618471253297332224 = -4927 bsl 749. +-1 = -4927 bsr 749. +761499775066582643 = -3473149426889489 + 764972924493472132. +-768446073920361621 = -3473149426889489 - 764972924493472132. +-2656865274290479077637570265220548 = -3473149426889489 * 764972924493472132. +3473149426889489 = -(-3473149426889489). +-3473149426889489 = +(-3473149426889489). +0 = -3473149426889489 div 764972924493472132. +-3473149426889489 = -3473149426889489 rem 764972924493472132. +761574600322089092 = -3473149426889489 band 764972924493472132. +-74825255506449 = -3473149426889489 bor 764972924493472132. +-761649425577595541 = -3473149426889489 bxor 764972924493472132. +3473149426889488 = bnot(-3473149426889489). +-512546388860651254601660862186913792 = -3473149426889489 bsl 67. +-1 = -3473149426889489 bsr 67. +-29167626795 = -29167626868 + 73. +-29167626941 = -29167626868 - 73. +-2129236761364 = -29167626868 * 73. +29167626868 = -(-29167626868). +-29167626868 = +(-29167626868). +-399556532 = -29167626868 div 73. +-32 = -29167626868 rem 73. +8 = -29167626868 band 73. +-29167626803 = -29167626868 bor 73. +-29167626811 = -29167626868 bxor 73. +29167626867 = bnot(-29167626868). +-1 = -29167626868 bsl -296. +-3713469079651023032800980145115508414591077540621460200026867016400652828280866359537842689983643648 = -29167626868 bsr -296. +-5646468003438 = -5646468742754 + 739316. +-5646469482070 = -5646468742754 - 739316. +-4174524685017916264 = -5646468742754 * 739316. +5646468742754 = -(-5646468742754). +-5646468742754 = +(-5646468742754). +-7637422 = -5646468742754 div 739316. +-459402 = -5646468742754 rem 739316. +524692 = -5646468742754 band 739316. +-5646468528130 = -5646468742754 bor 739316. +-5646469052822 = -5646468742754 bxor 739316. +5646468742753 = bnot(-5646468742754). +-176452148212 = -5646468742754 bsl -5. +-180686999768128 = -5646468742754 bsr -5. +-956277620367771238126145 = -7868127313336278 + -956277612499643924789867. +956277604631516611453589 = -7868127313336278 - -956277612499643924789867. +7524114002040453690389825588077857895026 = -7868127313336278 * -956277612499643924789867. +7868127313336278 = -(-7868127313336278). +-7868127313336278 = +(-7868127313336278). +0 = -7868127313336278 div -956277612499643924789867. +-7868127313336278 = -7868127313336278 rem -956277612499643924789867. +-956277617377078110306304 = -7868127313336278 band -956277612499643924789867. +-2990693127819841 = -7868127313336278 bor -956277612499643924789867. +956277614386384982486463 = -7868127313336278 bxor -956277612499643924789867. +7868127313336277 = bnot(-7868127313336278). +-67586698983087317320728576 = -7868127313336278 bsl 33. +-915971 = -7868127313336278 bsr 33. +-3404395 = -3336216 + -68179. +-3268037 = -3336216 - -68179. +227459870664 = -3336216 * -68179. +3336216 = -(-3336216). +-3336216 = +(-3336216). +48 = -3336216 div -68179. +-63624 = -3336216 rem -68179. +-3402328 = -3336216 band -68179. +-2067 = -3336216 bor -68179. +3400261 = -3336216 bxor -68179. +3336215 = bnot(-3336216). +-1 = -3336216 bsl -55. +-120199849075419893465088 = -3336216 bsr -55. +-26667627288156133159209 = -73524972633286392 + -26667553763183499872817. +26667480238210866586425 = -73524972633286392 - -26667553763183499872817. +1960731160634760365163374554512736806264 = -73524972633286392 * -26667553763183499872817. +73524972633286392 = -(-73524972633286392). +-73524972633286392 = +(-73524972633286392). +0 = -73524972633286392 div -26667553763183499872817. +-73524972633286392 = -73524972633286392 rem -26667553763183499872817. +-26667625880162171580152 = -73524972633286392 band -26667553763183499872817. +-1407993961579057 = -73524972633286392 bor -26667553763183499872817. +26667624472168210001095 = -73524972633286392 bxor -26667553763183499872817. +73524972633286391 = bnot(-73524972633286392). +-132313005449321260680774500200028140830168861061069117670914111166517837616265409926801035271503411746776605137121977062322282496434290842261606645221444297756607760213967001092096 = -73524972633286392 bsl 539. +-1 = -73524972633286392 bsr 539. +546126779234557 = 83 + 546126779234474. +-546126779234391 = 83 - 546126779234474. +45328522676461342 = 83 * 546126779234474. +-83 = -(83). +83 = +(83). +0 = 83 div 546126779234474. +83 = 83 rem 546126779234474. +2 = 83 band 546126779234474. +546126779234555 = 83 bor 546126779234474. +546126779234553 = 83 bxor 546126779234474. +-84 = bnot(83). +332 = 83 bsl 2. +20 = 83 bsr 2. +-738133514617696188442939210579 = -738133514617696233638262947878 + 45195323737299. +-738133514617696278833586685177 = -738133514617696233638262947878 - 45195323737299. +-33360183154497104989277574453536007801501522 = -738133514617696233638262947878 * 45195323737299. +738133514617696233638262947878 = -(-738133514617696233638262947878). +-738133514617696233638262947878 = +(-738133514617696233638262947878). +-16332077161525586 = -738133514617696233638262947878 div 45195323737299. +-42488331915664 = -738133514617696233638262947878 rem 45195323737299. +1103137899730 = -738133514617696233638262947878 band 45195323737299. +-738133514617696189546077110309 = -738133514617696233638262947878 bor 45195323737299. +-738133514617696190649215010039 = -738133514617696233638262947878 bxor 45195323737299. +738133514617696233638262947877 = bnot(-738133514617696233638262947878). +-25362074442916346130709715643076500783104 = -738133514617696233638262947878 bsl 35. +-21482512663866400068 = -738133514617696233638262947878 bsr 35. +7373598033 = 7373916289 + -318256. +7374234545 = 7373916289 - -318256. +-2346793102471984 = 7373916289 * -318256. +-7373916289 = -(7373916289). +7373916289 = +(7373916289). +-23169 = 7373916289 div -318256. +243025 = 7373916289 rem -318256. +7373652096 = 7373916289 band -318256. +-54063 = 7373916289 bor -318256. +-7373706159 = 7373916289 bxor -318256. +-7373916290 = bnot(7373916289). +115217442 = 7373916289 bsl -6. +471930642496 = 7373916289 bsr -6. +-9555122457769466332373611435 = 4172342184 + -9555122457769466336545953619. +9555122457769466340718295803 = 4172342184 - -9555122457769466336545953619. +-39867240503837302943138623139061163896 = 4172342184 * -9555122457769466336545953619. +-4172342184 = -(4172342184). +4172342184 = +(4172342184). +0 = 4172342184 div -9555122457769466336545953619. +4172342184 = 4172342184 rem -9555122457769466336545953619. +2021695656 = 4172342184 band -9555122457769466336545953619. +-9555122457769466334395307091 = 4172342184 bor -9555122457769466336545953619. +-9555122457769466336417002747 = 4172342184 bxor -9555122457769466336545953619. +-4172342185 = bnot(4172342184). +0 = 4172342184 bsl -372. +40136389791856951738794660592982613363559313877413175890401099927085788488463139812582073973306647849955782653992253784064 = 4172342184 bsr -372. +363969588297217972 = -996737648375349 + 364966325945593321. +-365963063593968670 = -996737648375349 - 364966325945593321. +-363775677459201808215401515444029 = -996737648375349 * 364966325945593321. +996737648375349 = -(-996737648375349). +-996737648375349 = +(-996737648375349). +0 = -996737648375349 div 364966325945593321. +-996737648375349 = -996737648375349 rem 364966325945593321. +364814043308902857 = -996737648375349 band 364966325945593321. +-844455011684885 = -996737648375349 bor 364966325945593321. +-365658498320587742 = -996737648375349 bxor 364966325945593321. +996737648375348 = bnot(-996737648375349). +-574580134631598876693413926797312 = -996737648375349 bsl 59. +-1 = -996737648375349 bsr 59. +-9734193829925 = -717566 + -9734193112359. +9734192394793 = -717566 - -9734193112359. +6984926014862998194 = -717566 * -9734193112359. +717566 = -(-717566). +-717566 = +(-717566). +0 = -717566 div -9734193112359. +-717566 = -717566 rem -9734193112359. +-9734193149952 = -717566 band -9734193112359. +-679973 = -717566 bor -9734193112359. +9734192469979 = -717566 bxor -9734193112359. +717565 = bnot(-717566). +-44848 = -717566 bsl -4. +-11481056 = -717566 bsr -4. +678175877952508232 = 21487329859 + 678175856465178373. +-678175834977848514 = 21487329859 - 678175856465178373. +14572188330277125447923939407 = 21487329859 * 678175856465178373. +-21487329859 = -(21487329859). +21487329859 = +(21487329859). +0 = 21487329859 div 678175856465178373. +21487329859 = 21487329859 rem 678175856465178373. +4305068545 = 21487329859 band 678175856465178373. +678175873647439687 = 21487329859 bor 678175856465178373. +678175869342371142 = 21487329859 bxor 678175856465178373. +-21487329860 = bnot(21487329859). +5500756443904 = 21487329859 bsl 8. +83934882 = 21487329859 bsr 8. +7286046216 = -216257 + 7286262473. +-7286478730 = -216257 - 7286262473. +-1575705263623561 = -216257 * 7286262473. +216257 = -(-216257). +-216257 = +(-216257). +0 = -216257 div 7286262473. +-216257 = -216257 rem 7286262473. +7286063625 = -216257 band 7286262473. +-17409 = -216257 bor 7286262473. +-7286081034 = -216257 bxor 7286262473. +216256 = bnot(-216257). +-1857633485062144 = -216257 bsl 33. +-1 = -216257 bsr 33. +-6764481016209013 = 888466865577671 + -7652947881786684. +8541414747364355 = 888466865577671 - -7652947881786684. +-6799390616960291788045255532964 = 888466865577671 * -7652947881786684. +-888466865577671 = -(888466865577671). +888466865577671 = +(888466865577671). +0 = 888466865577671 div -7652947881786684. +888466865577671 = 888466865577671 rem -7652947881786684. +8856356815556 = 888466865577671 band -7652947881786684. +-6773337373024569 = 888466865577671 bor -7652947881786684. +-6782193729840125 = 888466865577671 bxor -7652947881786684. +-888466865577672 = bnot(888466865577671). +137483588309622589200810999915511218700288 = 888466865577671 bsl 87. +0 = 888466865577671 bsr 87. +91490331573054849644778 = 99741621496377689556299 + -8251289923322839911521. +107992911419700529467820 = 99741621496377689556299 - -8251289923322839911521. +-822997036388941987096763924793330974908220779 = 99741621496377689556299 * -8251289923322839911521. +-99741621496377689556299 = -(99741621496377689556299). +99741621496377689556299 = +(99741621496377689556299). +-12 = 99741621496377689556299 div -8251289923322839911521. +726142416503610618047 = 99741621496377689556299 rem -8251289923322839911521. +94447332200778076029195 = 99741621496377689556299 band -8251289923322839911521. +-2957000627723226384417 = 99741621496377689556299 bor -8251289923322839911521. +-97404332828501302413612 = 99741621496377689556299 bxor -8251289923322839911521. +-99741621496377689556300 = bnot(99741621496377689556299). +4174765856565762433809785303436052549481744663516623317101140077233477255380204318557841012624809946662412087062564502736088945479821863479435710747619717167586245784348605908982209472591040160588804704214594321655377727921255724473008462453546458253110240990996582037341144319885430793582000606583769395334471197239803904 = 99741621496377689556299 bsl 992. +0 = 99741621496377689556299 bsr 992. +724593654925448350082 = 868413935 + 724593654924579936147. +-724593654923711522212 = 868413935 - 724593654924579936147. +629247227149086590571465008445 = 868413935 * 724593654924579936147. +-868413935 = -(868413935). +868413935 = +(868413935). +0 = 868413935 div 724593654924579936147. +868413935 = 868413935 rem 724593654924579936147. +293769603 = 868413935 band 724593654924579936147. +724593654925154580479 = 868413935 bor 724593654924579936147. +724593654924860810876 = 868413935 bxor 724593654924579936147. +-868413936 = bnot(868413935). +8009704804494020882968084480 = 868413935 bsl 63. +0 = 868413935 bsr 63. +8632255073244542809708331575 = -7118711883835919751124254 + 8639373785128378729459455829. +-8646492497012214649210580083 = -7118711883835919751124254 - 8639373785128378729459455829. +-61501212833093901526261388977476702258823433803576566 = -7118711883835919751124254 * 8639373785128378729459455829. +7118711883835919751124254 = -(-7118711883835919751124254). +-7118711883835919751124254 = +(-7118711883835919751124254). +0 = -7118711883835919751124254 div 8639373785128378729459455829. +-7118711883835919751124254 = -7118711883835919751124254 rem 8639373785128378729459455829. +8639062071729512996535304768 = -7118711883835919751124254 band 8639373785128378729459455829. +-6806998484970186826973193 = -7118711883835919751124254 bor 8639373785128378729459455829. +-8645869070214483183362277961 = -7118711883835919751124254 bxor 8639373785128378729459455829. +7118711883835919751124253 = bnot(-7118711883835919751124254). +-771813 = -7118711883835919751124254 bsl -63. +-65658528127798005347284574349651537121247232 = -7118711883835919751124254 bsr -63. +-846509452415985654555762 = -839311283762714365725835 + -7198168653271288829927. +-832113115109443076895908 = -839311283762714365725835 - -7198168653271288829927. +6041504173117654213676998143437530729225064045 = -839311283762714365725835 * -7198168653271288829927. +839311283762714365725835 = -(-839311283762714365725835). +-839311283762714365725835 = +(-839311283762714365725835). +116 = -839311283762714365725835 div -7198168653271288829927. +-4323719983244861454303 = -839311283762714365725835 rem -7198168653271288829927. +-839386225952523109916655 = -839311283762714365725835 band -7198168653271288829927. +-7123226463462544639107 = -839311283762714365725835 bor -7198168653271288829927. +832262999489060565277548 = -839311283762714365725835 bxor -7198168653271288829927. +839311283762714365725834 = bnot(-839311283762714365725835). +-26857961080406859703226720 = -839311283762714365725835 bsl 5. +-26228477617584823928933 = -839311283762714365725835 bsr 5. +59337771524502253278240 = -311674139136692 + 59337771836176392414932. +-59337772147850531551624 = -311674139136692 - 59337771836176392414932. +-18494048955329724865880685275529884944 = -311674139136692 * 59337771836176392414932. +311674139136692 = -(-311674139136692). +-311674139136692 = +(-311674139136692). +0 = -311674139136692 div 59337771836176392414932. +-311674139136692 = -311674139136692 rem 59337771836176392414932. +59337771545891229279300 = -311674139136692 band 59337771836176392414932. +-21388976001060 = -311674139136692 bor 59337771836176392414932. +-59337771567280205280360 = -311674139136692 bxor 59337771836176392414932. +311674139136691 = bnot(-311674139136692). +-9739816848022 = -311674139136692 bsl -5. +-9973572452374144 = -311674139136692 bsr -5. +7384361237883868414254203561 = 7384361237883874829616473378 + -6415362269817. +7384361237883881244978743195 = 7384361237883874829616473378 - -6415362269817. +-47373352472219367116791452785860833431826 = 7384361237883874829616473378 * -6415362269817. +-7384361237883874829616473378 = -(7384361237883874829616473378). +7384361237883874829616473378 = +(7384361237883874829616473378). +-1151043530717793 = 7384361237883874829616473378 div -6415362269817. +565867719497 = 7384361237883874829616473378 rem -6415362269817. +7384361237883868489432974594 = 7384361237883874829616473378 band -6415362269817. +-75178771033 = 7384361237883874829616473378 bor -6415362269817. +-7384361237883868564611745627 = 7384361237883874829616473378 bxor -6415362269817. +-7384361237883874829616473379 = bnot(7384361237883874829616473378). +4059595522375848785786921648814674673664 = 7384361237883874829616473378 bsl 39. +13432074843665531 = 7384361237883874829616473378 bsr 39. +-3977553155326023397025 = -3977553156125337758647 + 799314361622. +-3977553156924652120269 = -3977553156125337758647 - 799314361622. +-3179315361805895649572059115445434 = -3977553156125337758647 * 799314361622. +3977553156125337758647 = -(-3977553156125337758647). +-3977553156125337758647 = +(-3977553156125337758647). +-4976206292 = -3977553156125337758647 div 799314361622. +-535978033023 = -3977553156125337758647 rem 799314361622. +249548575744 = -3977553156125337758647 band 799314361622. +-3977553155575571972769 = -3977553156125337758647 bor 799314361622. +-3977553155825120548513 = -3977553156125337758647 bxor 799314361622. +3977553156125337758646 = bnot(-3977553156125337758647). +-1 = -3977553156125337758647 bsl -94. +-78783556965655822831177085280930750212150130638848 = -3977553156125337758647 bsr -94. +-632628718016347 = -632621446787599 + -7271228748. +-632614175558851 = -632621446787599 - -7271228748. +4599935250483342098696052 = -632621446787599 * -7271228748. +632621446787599 = -(-632621446787599). +-632621446787599 = +(-632621446787599). +87003 = -632621446787599 div -7271228748. +-2732025355 = -632621446787599 rem -7271228748. +-632621738424144 = -632621446787599 band -7271228748. +-6979592203 = -632621446787599 bor -7271228748. +632614758831941 = -632621446787599 bxor -7271228748. +632621446787598 = bnot(-632621446787599). +-9206 = -632621446787599 bsl -36. +-43473414795215071413796864 = -632621446787599 bsr -36. +929613671737385374580 = 859391 + 929613671737384515189. +-929613671737383655798 = 859391 - 929613671737384515189. +798901622968062615892789899 = 859391 * 929613671737384515189. +-859391 = -(859391). +859391 = +(859391). +0 = 859391 div 929613671737384515189. +859391 = 859391 rem 929613671737384515189. +267381 = 859391 band 929613671737384515189. +929613671737385107199 = 859391 bor 929613671737384515189. +929613671737384839818 = 859391 bxor 929613671737384515189. +-859392 = bnot(859391). +472455198653022208 = 859391 bsl 39. +0 = 859391 bsr 39. +75357881755642898911906 = 75357881755569421413484 + 73477498422. +75357881755495943915062 = 75357881755569421413484 - 73477498422. +5537108637780114751620723619522248 = 75357881755569421413484 * 73477498422. +-75357881755569421413484 = -(75357881755569421413484). +75357881755569421413484 = +(75357881755569421413484). +1025591281330 = 75357881755569421413484 div 73477498422. +27388352224 = 75357881755569421413484 rem 73477498422. +4446594084 = 75357881755569421413484 band 73477498422. +75357881755638452317822 = 75357881755569421413484 bor 73477498422. +75357881755634005723738 = 75357881755569421413484 bxor 73477498422. +-75357881755569421413485 = bnot(75357881755569421413484). +1205726108089110742615744 = 75357881755569421413484 bsl 4. +4709867609723088838342 = 75357881755569421413484 bsr 4. +52686088 = -81126 + 52767214. +-52848340 = -81126 - 52767214. +-4280793002964 = -81126 * 52767214. +81126 = -(-81126). +-81126 = +(-81126). +0 = -81126 div 52767214. +-81126 = -81126 rem 52767214. +52691210 = -81126 band 52767214. +-5122 = -81126 bor 52767214. +-52696332 = -81126 bxor 52767214. +81125 = bnot(-81126). +-1 = -81126 bsl -78. +-24518829010514101606803308544 = -81126 bsr -78. +-93444457447505 = -93444456497546 + -949959. +-93444455547587 = -93444456497546 - -949959. +88768402449952300614 = -93444456497546 * -949959. +93444456497546 = -(-93444456497546). +-93444456497546 = +(-93444456497546). +98366831 = -93444456497546 div -949959. +-87617 = -93444456497546 rem -949959. +-93444457299920 = -93444456497546 band -949959. +-147585 = -93444456497546 bor -949959. +93444457152335 = -93444456497546 bxor -949959. +93444456497545 = bnot(-93444456497546). +-1 = -93444456497546 bsl -914. +-12941051909268604697162829316830566897993099152071438805265906320814944091424858349699489680718123770888301404623392627447633281381525770576269811087080625668986264684171387393369784316629809758745706270318418308651539390272376226390091132313131238731721120970038334365730701400102261489664 = -93444456497546 bsr -914. +-5617861855288475533985269679 = 645987691562896 + -5617861855289121521676832575. +5617861855289767509368395471 = 645987691562896 - -5617861855289121521676832575. +-3629069611417467716101248871383636674137200 = 645987691562896 * -5617861855289121521676832575. +-645987691562896 = -(645987691562896). +645987691562896 = +(645987691562896). +0 = 645987691562896 div -5617861855289121521676832575. +645987691562896 = 645987691562896 rem -5617861855289121521676832575. +636637136552064 = 645987691562896 band -5617861855289121521676832575. +-5617861855289112171121821743 = 645987691562896 bor -5617861855289121521676832575. +-5617861855289748808258373807 = 645987691562896 bxor -5617861855289121521676832575. +-645987691562897 = bnot(645987691562896). +363658740876073166051634839552 = 645987691562896 bsl 49. +1 = 645987691562896 bsr 49. +66715149278699370 = -48844 + 66715149278748214. +-66715149278797058 = -48844 - 66715149278748214. +-3258634751371177764616 = -48844 * 66715149278748214. +48844 = -(-48844). +-48844 = +(-48844). +0 = -48844 div 66715149278748214. +-48844 = -48844 rem 66715149278748214. +66715149278707764 = -48844 band 66715149278748214. +-8394 = -48844 bor 66715149278748214. +-66715149278716158 = -48844 bxor 66715149278748214. +48843 = bnot(-48844). +-1 = -48844 bsl -38. +-13426136486772736 = -48844 bsr -38. +3295561145144957083124548 = 3295561145144956985824896 + 97299652. +3295561145144956888525244 = 3295561145144956985824896 - 97299652. +320656952567325804275731313736192 = 3295561145144956985824896 * 97299652. +-3295561145144956985824896 = -(3295561145144956985824896). +3295561145144956985824896 = +(3295561145144956985824896). +33870225405790320 = 3295561145144956985824896 div 97299652. +64856256 = 3295561145144956985824896 rem 97299652. +25691264 = 3295561145144956985824896 band 97299652. +3295561145144957057433284 = 3295561145144956985824896 bor 97299652. +3295561145144957031742020 = 3295561145144956985824896 bxor 97299652. +-3295561145144956985824897 = bnot(3295561145144956985824896). +259703441323196961676360460665136735063618879506226750493095879826011849090010994459984645721689952198507282266369597144389258950003782582272 = 3295561145144956985824896 bsl 385. +0 = 3295561145144956985824896 bsr 385. +-986476643886792959314064916 = 615218779 + -986476643886792959929283695. +986476643886792960544502474 = 615218779 - -986476643886792959929283695. +-606898956364050579033489841182508405 = 615218779 * -986476643886792959929283695. +-615218779 = -(615218779). +615218779 = +(615218779). +0 = 615218779 div -986476643886792959929283695. +615218779 = 615218779 rem -986476643886792959929283695. +69798417 = 615218779 band -986476643886792959929283695. +-986476643886792959383863333 = 615218779 bor -986476643886792959929283695. +-986476643886792959453661750 = 615218779 bxor -986476643886792959929283695. +-615218780 = bnot(615218779). +18 = 615218779 bsl -25. +20643316685078528 = 615218779 bsr -25. +-467349317662454183287639774 = 64746241233363 + -467349317662518929528873137. +467349317662583675770106500 = 64746241233363 - -467349317662518929528873137. +-30259111661625046096016841538274438869731 = 64746241233363 * -467349317662518929528873137. +-64746241233363 = -(64746241233363). +64746241233363 = +(64746241233363). +0 = 64746241233363 div -467349317662518929528873137. +64746241233363 = 64746241233363 rem -467349317662518929528873137. +9632143741251 = 64746241233363 band -467349317662518929528873137. +-467349317662463815431381025 = 64746241233363 bor -467349317662518929528873137. +-467349317662473447575122276 = 64746241233363 bxor -467349317662518929528873137. +-64746241233364 = bnot(64746241233363). +1011660019271 = 64746241233363 bsl -6. +4143759438935232 = 64746241233363 bsr -6. +35450086531620560507 = 3341273982796755 + 35446745257637763752. +-35443403983654966997 = 3341273982796755 - 35446745257637763752. +118437287704169318322969476922224760 = 3341273982796755 * 35446745257637763752. +-3341273982796755 = -(3341273982796755). +3341273982796755 = +(3341273982796755). +0 = 3341273982796755 div 35446745257637763752. +3341273982796755 = 3341273982796755 rem 35446745257637763752. +2254002062525056 = 3341273982796755 band 35446745257637763752. +35447832529558035451 = 3341273982796755 bor 35446745257637763752. +35445578527495510395 = 3341273982796755 bxor 35446745257637763752. +-3341273982796756 = bnot(3341273982796755). +0 = 3341273982796755 bsl -582. +52889512678192664732690770583278780993203394534456274139414018863445336544367899815668028889670017211503927199630045246956599926056869252654122021934322204013537551648566187968385045254635520 = 3341273982796755 bsr -582. +578708048628698322701 = -8487932719457493135 + 587195981348155815836. +-595683914067613308971 = -8487932719457493135 - 587195981348155815836. +-4984079982818963609910892068739294285860 = -8487932719457493135 * 587195981348155815836. +8487932719457493135 = -(-8487932719457493135). +-8487932719457493135 = +(-8487932719457493135). +0 = -8487932719457493135 div 587195981348155815836. +-8487932719457493135 = -8487932719457493135 rem 587195981348155815836. +581085949258189772560 = -8487932719457493135 band 587195981348155815836. +-2377900629491449859 = -8487932719457493135 bor 587195981348155815836. +-583463849887681222419 = -8487932719457493135 bxor 587195981348155815836. +8487932719457493134 = bnot(-8487932719457493135). +-33155987185380833 = -8487932719457493135 bsl -8. +-2172910776181118242560 = -8487932719457493135 bsr -8. +-98251539676273547556103585 = -7652797965119 + -98251539676265894758138466. +98251539676258241960173347 = -7652797965119 - -98251539676265894758138466. +751899182904336331425461861269240167454 = -7652797965119 * -98251539676265894758138466. +7652797965119 = -(-7652797965119). +-7652797965119 = +(-7652797965119). +0 = -7652797965119 div -98251539676265894758138466. +-7652797965119 = -7652797965119 rem -98251539676265894758138466. +-98251539676268660856316800 = -7652797965119 band -98251539676265894758138466. +-4886699786785 = -7652797965119 bor -98251539676265894758138466. +98251539676263774156530015 = -7652797965119 bxor -98251539676265894758138466. +7652797965118 = bnot(-7652797965119). +-256785288930323857408 = -7652797965119 bsl 25. +-228072 = -7652797965119 bsr 25. +-938601950 = -934814639 + -3787311. +-931027328 = -934814639 - -3787311. +3540433765245729 = -934814639 * -3787311. +934814639 = -(-934814639). +-934814639 = +(-934814639). +246 = -934814639 div -3787311. +-3136133 = -934814639 rem -3787311. +-934931375 = -934814639 band -3787311. +-3670575 = -934814639 bor -3787311. +931260800 = -934814639 bxor -3787311. +934814638 = bnot(-934814639). +-3651620 = -934814639 bsl -8. +-239312547584 = -934814639 bsr -8. +-387581 = -656 + -386925. +386269 = -656 - -386925. +253822800 = -656 * -386925. +656 = -(-656). +-656 = +(-656). +0 = -656 div -386925. +-656 = -656 rem -386925. +-387056 = -656 band -386925. +-525 = -656 bor -386925. +386531 = -656 bxor -386925. +655 = bnot(-656). +-2624 = -656 bsl 2. +-164 = -656 bsr 2. +-6514808036364428552 = -896184894532265 + -6513911851469896287. +6513015666575364022 = -896184894532265 - -6513911851469896287. +5837669405602020039778712925200055 = -896184894532265 * -6513911851469896287. +896184894532265 = -(-896184894532265). +-896184894532265 = +(-896184894532265). +0 = -896184894532265 div -6513911851469896287. +-896184894532265 = -896184894532265 rem -6513911851469896287. +-6514245013329410815 = -896184894532265 band -6513911851469896287. +-563023035017737 = -896184894532265 bor -6513911851469896287. +6513681990294393078 = -896184894532265 bxor -6513911851469896287. +896184894532264 = bnot(-896184894532265). +-2116056754196618103829184408945950720 = -896184894532265 bsl 71. +-1 = -896184894532265 bsr 71. +-97222758789292894469424106674 = -97222758789292894469423252399 + -854275. +-97222758789292894469422398124 = -97222758789292894469423252399 - -854275. +83054972264723187422866548943155725 = -97222758789292894469423252399 * -854275. +97222758789292894469423252399 = -(-97222758789292894469423252399). +-97222758789292894469423252399 = +(-97222758789292894469423252399). +113807332286784576944687 = -97222758789292894469423252399 div -854275. +-765474 = -97222758789292894469423252399 rem -854275. +-97222758789292894469423582127 = -97222758789292894469423252399 band -854275. +-524547 = -97222758789292894469423252399 bor -854275. +97222758789292894469423057580 = -97222758789292894469423252399 bxor -854275. +97222758789292894469423252398 = bnot(-97222758789292894469423252399). +-388891035157171577877693009596 = -97222758789292894469423252399 bsl 2. +-24305689697323223617355813100 = -97222758789292894469423252399 bsr 2. +45314799959449834 = 8619 + 45314799959441215. +-45314799959432596 = 8619 - 45314799959441215. +390568260850423832085 = 8619 * 45314799959441215. +-8619 = -(8619). +8619 = +(8619). +0 = 8619 div 45314799959441215. +8619 = 8619 rem 45314799959441215. +8491 = 8619 band 45314799959441215. +45314799959441343 = 8619 bor 45314799959441215. +45314799959432852 = 8619 bxor 45314799959441215. +-8620 = bnot(8619). +7941353061410367410881337630258273820999253905949536145550420435013924476478987049836505430738828348984354473728064838669707682843096139575206787552025978320364779864064 = 8619 bsl 548. +0 = 8619 bsr 548. +-567484289988620768675110 = 832462677188 + -567484289989453231352298. +567484289990285694029486 = 832462677188 - -567484289989453231352298. +-472409491306751585255851530675978024 = 832462677188 * -567484289989453231352298. +-832462677188 = -(832462677188). +832462677188 = +(832462677188). +0 = 832462677188 div -567484289989453231352298. +832462677188 = 832462677188 rem -567484289989453231352298. +1107297284 = 832462677188 band -567484289989453231352298. +-567484289988621875972394 = 832462677188 bor -567484289989453231352298. +-567484289988622983269678 = 832462677188 bxor -567484289989453231352298. +-832462677189 = bnot(832462677188). +128817359912715694748896543518452875264 = 832462677188 bsl 87. +0 = 832462677188 bsr 87. +823334994347687588935276277 = -8726434876 + 823334994347687597661711153. +-823334994347687606388146029 = -8726434876 - 823334994347687597661711153. +-7184779209306923922187812255377372028 = -8726434876 * 823334994347687597661711153. +8726434876 = -(-8726434876). +-8726434876 = +(-8726434876). +0 = -8726434876 div 823334994347687597661711153. +-8726434876 = -8726434876 rem 823334994347687597661711153. +823334994347687597659466496 = -8726434876 band 823334994347687597661711153. +-8724190219 = -8726434876 bor 823334994347687597661711153. +-823334994347687606383656715 = -8726434876 bxor 823334994347687597661711153. +8726434875 = bnot(-8726434876). +-2637403108695496227490767824748544 = -8726434876 bsl 78. +-1 = -8726434876 bsr 78. +509565608112303867308591 = -9933529355932531354156 + 519499137468236398662747. +-529432666824168930016903 = -9933529355932531354156 - 519499137468236398662747. +-5160459932422355880342008555720285127460826532 = -9933529355932531354156 * 519499137468236398662747. +9933529355932531354156 = -(-9933529355932531354156). +-9933529355932531354156 = +(-9933529355932531354156). +0 = -9933529355932531354156 div 519499137468236398662747. +-9933529355932531354156 = -9933529355932531354156 rem 519499137468236398662747. +510015616812963311457360 = -9933529355932531354156 band 519499137468236398662747. +-450008700659444148769 = -9933529355932531354156 bor 519499137468236398662747. +-510465625513622755606129 = -9933529355932531354156 bxor 519499137468236398662747. +9933529355932531354155 = bnot(-9933529355932531354156). +-317872939389841003332992 = -9933529355932531354156 bsl 5. +-310422792372891604818 = -9933529355932531354156 bsr 5. +-37096154251521333714133 = 73423963737328583155 + -37169578215258662297288. +37243002178995990880443 = 73423963737328583155 - -37169578215258662297288. +-2729137763008950497871192185843978438983640 = 73423963737328583155 * -37169578215258662297288. +-73423963737328583155 = -(73423963737328583155). +73423963737328583155 = +(73423963737328583155). +0 = 73423963737328583155 div -37169578215258662297288. +73423963737328583155 = 73423963737328583155 rem -37169578215258662297288. +19055295172658069808 = 73423963737328583155 band -37169578215258662297288. +-37115209546693991783941 = 73423963737328583155 bor -37169578215258662297288. +-37134264841866649853749 = 73423963737328583155 bxor -37169578215258662297288. +-73423963737328583156 = bnot(73423963737328583155). +60086328323069571884886422554887049463830943694271535732589302468223369323657564870290153787226398591009460002240599573447008736990986904085469235396956305326233427640320 = 73423963737328583155 bsl 498. +0 = 73423963737328583155 bsr 498. +-97385435680005309784032198 = -31643372812742 + -97385435679973666411219456. +97385435679942023038406714 = -31643372812742 - -97385435679973666411219456. +3081603647752713441867279806232955108352 = -31643372812742 * -97385435679973666411219456. +31643372812742 = -(-31643372812742). +-31643372812742 = +(-31643372812742). +0 = -31643372812742 div -97385435679973666411219456. +-31643372812742 = -31643372812742 rem -97385435679973666411219456. +-97385435679987418936637952 = -31643372812742 band -97385435679973666411219456. +-17890847394246 = -31643372812742 bor -97385435679973666411219456. +97385435679969528089243706 = -31643372812742 bxor -97385435679973666411219456. +31643372812741 = bnot(-31643372812742). +-1 = -31643372812742 bsl -99. +-20056370269659015991794578266269362207850496 = -31643372812742 bsr -99. +2696944336321953535277237639 = 4 + 2696944336321953535277237635. +-2696944336321953535277237631 = 4 - 2696944336321953535277237635. +10787777345287814141108950540 = 4 * 2696944336321953535277237635. +-4 = -(4). +4 = +(4). +0 = 4 div 2696944336321953535277237635. +4 = 4 rem 2696944336321953535277237635. +0 = 4 band 2696944336321953535277237635. +2696944336321953535277237639 = 4 bor 2696944336321953535277237635. +2696944336321953535277237639 = 4 bxor 2696944336321953535277237635. +-5 = bnot(4). +68719476736 = 4 bsl 34. +0 = 4 bsr 34. +-4552277100 = -4453455525 + -98821575. +-4354633950 = -4453455525 - -98821575. +440097489172951875 = -4453455525 * -98821575. +4453455525 = -(-4453455525). +-4453455525 = +(-4453455525). +45 = -4453455525 div -98821575. +-6484650 = -4453455525 rem -98821575. +-4529059815 = -4453455525 band -98821575. +-23217285 = -4453455525 bor -98821575. +4505842530 = -4453455525 bxor -98821575. +4453455524 = bnot(-4453455525). +-1 = -4453455525 bsl -39. +-2448313066760385331200 = -4453455525 bsr -39. +9933367324985400417482 = -989164129354261 + 9933368314149529771743. +-9933369303313659126004 = -989164129354261 - 9933368314149529771743. +-9825731620020922984764659973314446923 = -989164129354261 * 9933368314149529771743. +989164129354261 = -(-989164129354261). +-989164129354261 = +(-989164129354261). +0 = -989164129354261 div 9933368314149529771743. +-989164129354261 = -989164129354261 rem 9933368314149529771743. +9933368032527978126539 = -989164129354261 band 9933368314149529771743. +-707542577709057 = -989164129354261 bor 9933368314149529771743. +-9933368740070555835596 = -989164129354261 bxor 9933368314149529771743. +989164129354260 = bnot(-989164129354261). +-1 = -989164129354261 bsl -816. +-432259772646768474565743340945911685180939112368269936973860870163212437849557138458245552085199626816186005750617365378632608731145945336023653710938459786500342977738666480323242539275941384501750417946839160709008859216903183353877678051450083859962208976896 = -989164129354261 bsr -816. +35455434641626474236 = -8191467337 + 35455434649817941573. +-35455434658009408910 = -8191467337 - 35455434649817941573. +-290432034853121701391803901101 = -8191467337 * 35455434649817941573. +8191467337 = -(-8191467337). +-8191467337 = +(-8191467337). +0 = -8191467337 div 35455434649817941573. +-8191467337 = -8191467337 rem 35455434649817941573. +35455434647532470277 = -8191467337 band 35455434649817941573. +-5905996041 = -8191467337 bor 35455434649817941573. +-35455434653438466318 = -8191467337 bxor 35455434649817941573. +8191467336 = bnot(-8191467337). +-4194031276544 = -8191467337 bsl 9. +-15998960 = -8191467337 bsr 9. +866121085978430578 = -6318836466295679 + 872439922444726257. +-878758758911021936 = -6318836466295679 - 872439922444726257. +-5512805196595910305947821976943503 = -6318836466295679 * 872439922444726257. +6318836466295679 = -(-6318836466295679). +-6318836466295679 = +(-6318836466295679). +0 = -6318836466295679 div 872439922444726257. +-6318836466295679 = -6318836466295679 rem 872439922444726257. +867370690654260353 = -6318836466295679 band 872439922444726257. +-1249604675829775 = -6318836466295679 bor 872439922444726257. +-868620295330090128 = -6318836466295679 bxor 872439922444726257. +6318836466295678 = bnot(-6318836466295679). +-1778594347189020103220526055424 = -6318836466295679 bsl 48. +-23 = -6318836466295679 bsr 48. +-838928431376113277356992188754 = 532 + -838928431376113277356992189286. +838928431376113277356992189818 = 532 - -838928431376113277356992189286. +-446309925492092263553919844700152 = 532 * -838928431376113277356992189286. +-532 = -(532). +532 = +(532). +0 = 532 div -838928431376113277356992189286. +532 = 532 rem -838928431376113277356992189286. +16 = 532 band -838928431376113277356992189286. +-838928431376113277356992188770 = 532 bor -838928431376113277356992189286. +-838928431376113277356992188786 = 532 bxor -838928431376113277356992189286. +-533 = bnot(532). +17024 = 532 bsl 5. +16 = 532 bsr 5. +835256139615651161826982037484 = 835256139615651258654646787165 + -96827664749681. +835256139615651355482311536846 = 835256139615651258654646787165 - -96827664749681. +-80875901466817027217390282385766390608644365 = 835256139615651258654646787165 * -96827664749681. +-835256139615651258654646787165 = -(835256139615651258654646787165). +835256139615651258654646787165 = +(835256139615651258654646787165). +-8626213817868648 = 835256139615651258654646787165 div -96827664749681. +12782788885877 = 835256139615651258654646787165 rem -96827664749681. +835256139615651240991861508109 = 835256139615651258654646787165 band -96827664749681. +-79164879470625 = 835256139615651258654646787165 bor -96827664749681. +-835256139615651320156740978734 = 835256139615651258654646787165 bxor -96827664749681. +-835256139615651258654646787166 = bnot(835256139615651258654646787165). +13050877181494550916478856049 = 835256139615651258654646787165 bsl -6. +53456392935401680553897394378560 = 835256139615651258654646787165 bsr -6. +5975929321496698341544 = 5975929321496698341539 + 5. +5975929321496698341534 = 5975929321496698341539 - 5. +29879646607483491707695 = 5975929321496698341539 * 5. +-5975929321496698341539 = -(5975929321496698341539). +5975929321496698341539 = +(5975929321496698341539). +1195185864299339668307 = 5975929321496698341539 div 5. +4 = 5975929321496698341539 rem 5. +1 = 5975929321496698341539 band 5. +5975929321496698341543 = 5975929321496698341539 bor 5. +5975929321496698341542 = 5975929321496698341539 bxor 5. +-5975929321496698341540 = bnot(5975929321496698341539). +371496063840359799118004057551362324785911970559740878742915756886585495727539355412378263482391299409051648 = 5975929321496698341539 bsl 285. +0 = 5975929321496698341539 bsr 285. +-76789134657341395858736391309 = 3 + -76789134657341395858736391312. +76789134657341395858736391315 = 3 - -76789134657341395858736391312. +-230367403972024187576209173936 = 3 * -76789134657341395858736391312. +-3 = -(3). +3 = +(3). +0 = 3 div -76789134657341395858736391312. +3 = 3 rem -76789134657341395858736391312. +0 = 3 band -76789134657341395858736391312. +-76789134657341395858736391309 = 3 bor -76789134657341395858736391312. +-76789134657341395858736391309 = 3 bxor -76789134657341395858736391312. +-4 = bnot(3). +96 = 3 bsl 5. +0 = 3 bsr 5. +-972912573952353043619267387590 = -972912571787978446351768634963 + -2164374597267498752627. +-972912569623603849084269882336 = -972912571787978446351768634963 - -2164374597267498752627. +2105747255740092318635706185048342783618905000297801 = -972912571787978446351768634963 * -2164374597267498752627. +972912571787978446351768634963 = -(-972912571787978446351768634963). +-972912571787978446351768634963 = +(-972912571787978446351768634963). +449512100 = -972912571787978446351768634963 div -2164374597267498752627. +-1383610820311025348263 = -972912571787978446351768634963 rem -2164374597267498752627. +-972912572697643119681296293491 = -972912571787978446351768634963 band -2164374597267498752627. +-1254709923937971094099 = -972912571787978446351768634963 bor -2164374597267498752627. +972912571442933195743325199392 = -972912571787978446351768634963 bxor -2164374597267498752627. +972912571787978446351768634962 = bnot(-972912571787978446351768634963). +-206022251 = -972912571787978446351768634963 bsl -72. +-4594449719774056986990108839949590416305948352053248 = -972912571787978446351768634963 bsr -72. +-368694148740671175525604 = 717324848622586465652 + -369411473589293761991256. +370128798437916348456908 = 717324848622586465652 - -369411473589293761991256. +-264988029371886745960981433433994966768338912 = 717324848622586465652 * -369411473589293761991256. +-717324848622586465652 = -(717324848622586465652). +717324848622586465652 = +(717324848622586465652). +0 = 717324848622586465652 div -369411473589293761991256. +717324848622586465652 = 717324848622586465652 rem -369411473589293761991256. +113049512052828540192 = 717324848622586465652 band -369411473589293761991256. +-368807198252724004065796 = 717324848622586465652 bor -369411473589293761991256. +-368920247764776832605988 = 717324848622586465652 bxor -369411473589293761991256. +-717324848622586465653 = bnot(717324848622586465652). +3255231258462683863258487392003512564171824532565768030597274640785308663687009408682524071334781070174200620562413181685430433235754844555593076739044560515618419345374711226882314266250976292724903960588751204902335018453221756485226777054353505364397985992256190606645305837000971566495144161050624 = 717324848622586465652 bsl 929. +0 = 717324848622586465652 bsr 929. +-836464698689084617970645316 = -836464698686742118695776464 + -2342499274868852. +-836464698684399619420907612 = -836464698686742118695776464 - -2342499274868852. +1959417950127086192853451457099349908299328 = -836464698686742118695776464 * -2342499274868852. +836464698686742118695776464 = -(-836464698686742118695776464). +-836464698686742118695776464 = +(-836464698686742118695776464). +357082159068 = -836464698686742118695776464 div -2342499274868852. +-1348053993226528 = -836464698686742118695776464 rem -2342499274868852. +-836464698686832487159265536 = -836464698686742118695776464 band -2342499274868852. +-2252130811379780 = -836464698686742118695776464 bor -2342499274868852. +836464698684580356347885756 = -836464698686742118695776464 bxor -2342499274868852. +836464698686742118695776463 = bnot(-836464698686742118695776464). +-6691717589493936949566211712 = -836464698686742118695776464 bsl 3. +-104558087335842764836972058 = -836464698686742118695776464 bsr 3. +696585230662675608544 = 726333654824223364519 + -29748424161547755975. +756082078985771120494 = 726333654824223364519 - -29748424161547755975. +-21607281646518214144391285666208885251025 = 726333654824223364519 * -29748424161547755975. +-726333654824223364519 = -(726333654824223364519). +726333654824223364519 = +(726333654824223364519). +-24 = 726333654824223364519 div -29748424161547755975. +12371474947077221119 = 726333654824223364519 rem -29748424161547755975. +705813141625409655841 = 726333654824223364519 band -29748424161547755975. +-9227910962734047297 = 726333654824223364519 bor -29748424161547755975. +-715041052588143703138 = 726333654824223364519 bxor -29748424161547755975. +-726333654824223364520 = bnot(726333654824223364519). +0 = 726333654824223364519 bsl -871. +11435690451366222024367175662929179710635743234945722592068379701662961338420744154925516990271411044523107699951959958023547144448199929569201741028579907058237786908876106979333458778292628538248539604428551721719270108790275745604896016465451216263949689199341385719758959895642112 = 726333654824223364519 bsr -871. +97526085963108 = 893141621 + 97525192821487. +-97524299679866 = 893141621 - 97525192821487. +87103808804920462810427 = 893141621 * 97525192821487. +-893141621 = -(893141621). +893141621 = +(893141621). +0 = 893141621 div 97525192821487. +893141621 = 893141621 rem 97525192821487. +272106085 = 893141621 band 97525192821487. +97525813857023 = 893141621 bor 97525192821487. +97525541750938 = 893141621 bxor 97525192821487. +-893141622 = bnot(893141621). +27910675 = 893141621 bsl -5. +28580531872 = 893141621 bsr -5. +-588282776776163612977818769727 = 6844 + -588282776776163612977818776571. +588282776776163612977818783415 = 6844 - -588282776776163612977818776571. +-4026207324256063767220191706851924 = 6844 * -588282776776163612977818776571. +-6844 = -(6844). +6844 = +(6844). +0 = 6844 div -588282776776163612977818776571. +6844 = 6844 rem -588282776776163612977818776571. +2052 = 6844 band -588282776776163612977818776571. +-588282776776163612977818771779 = 6844 bor -588282776776163612977818776571. +-588282776776163612977818773831 = 6844 bxor -588282776776163612977818776571. +-6845 = bnot(6844). +0 = 6844 bsl -79. +4136944154721261035844534272 = 6844 bsr -79. +5491768516893889754824 = 27265255183351 + 5491768489628634571473. +-5491768462363379388122 = 27265255183351 - 5491768489628634571473. +149734469277610821234926847929146023 = 27265255183351 * 5491768489628634571473. +-27265255183351 = -(27265255183351). +27265255183351 = +(27265255183351). +0 = 27265255183351 div 5491768489628634571473. +27265255183351 = 27265255183351 rem 5491768489628634571473. +9397493400273 = 27265255183351 band 5491768489628634571473. +5491768507496396354551 = 27265255183351 bor 5491768489628634571473. +5491768498098902954278 = 27265255183351 bxor 5491768489628634571473. +-27265255183352 = bnot(27265255183351). +590605833979279523757345160506562130760604478596484640331883899311197720867385191048344070202384917859514703010595620818844555467936296337408 = 27265255183351 bsl 423. +0 = 27265255183351 bsr 423. +-243633971503659577459246664 = 33528189219127257 + -243633971537187766678373921. +243633971570715955897501178 = 33528189219127257 - -243633971537187766678373921. +-8168605897906295864640451842147147529064697 = 33528189219127257 * -243633971537187766678373921. +-33528189219127257 = -(33528189219127257). +33528189219127257 = +(33528189219127257). +0 = 33528189219127257 div -243633971537187766678373921. +33528189219127257 = 33528189219127257 rem -243633971537187766678373921. +14378387645020633 = 33528189219127257 band -243633971537187766678373921. +-243633971518037965104267297 = 33528189219127257 bor -243633971537187766678373921. +-243633971532416352749287930 = 33528189219127257 bxor -243633971537187766678373921. +-33528189219127258 = bnot(33528189219127257). +65484744568607 = 33528189219127257 bsl -9. +17166432880193155584 = 33528189219127257 bsr -9. +-89954888350459534858325537 = -898356866157681 + -89954888349561177992167856. +89954888348662821126010175 = -898356866157681 - -89954888349561177992167856. +80811591593275869086159243769082315701936 = -898356866157681 * -89954888349561177992167856. +898356866157681 = -(-898356866157681). +-898356866157681 = +(-898356866157681). +0 = -898356866157681 div -89954888349561177992167856. +-898356866157681 = -898356866157681 rem -89954888349561177992167856. +-89954888349842704514911744 = -898356866157681 band -89954888349561177992167856. +-616830343413793 = -898356866157681 bor -89954888349561177992167856. +89954888349225874171497951 = -898356866157681 bxor -89954888349561177992167856. +898356866157680 = bnot(-898356866157681). +-56147304134856 = -898356866157681 bsl -4. +-14373709858522896 = -898356866157681 bsr -4. +64720118415810 = -75774795351 + 64795893211161. +-64871668006512 = -75774795351 - 64795893211161. +-4909895547660975004112511 = -75774795351 * 64795893211161. +75774795351 = -(-75774795351). +-75774795351 = +(-75774795351). +0 = -75774795351 div 64795893211161. +-75774795351 = -75774795351 rem 64795893211161. +64795356176393 = -75774795351 band 64795893211161. +-75237760583 = -75774795351 bor 64795893211161. +-64870593936976 = -75774795351 bxor 64795893211161. +75774795350 = bnot(-75774795351). +-18943698838 = -75774795351 bsl -2. +-303099181404 = -75774795351 bsr -2. +-31142252253840804847011712537 = -31142252253756192995144998645 + -84611851866713892. +-31142252253671581143278284753 = -31142252253756192995144998645 - -84611851866713892. +2635003634490655848531253998671200774942676340 = -31142252253756192995144998645 * -84611851866713892. +31142252253756192995144998645 = -(-31142252253756192995144998645). +-31142252253756192995144998645 = +(-31142252253756192995144998645). +368060166119 = -31142252253756192995144998645 div -84611851866713892. +-57257658979973497 = -31142252253756192995144998645 rem -84611851866713892. +-31142252253765340962695790584 = -31142252253756192995144998645 band -84611851866713892. +-75463884315921953 = -31142252253756192995144998645 bor -84611851866713892. +31142252253689877078379868631 = -31142252253756192995144998645 bxor -84611851866713892. +31142252253756192995144998644 = bnot(-31142252253756192995144998645). +-6441 = -31142252253756192995144998645 bsl -82. +-150594691322070952976781795744798420507787935172526080 = -31142252253756192995144998645 bsr -82. +-768279695054038550429476 = -57614822655244 + -768279694996423727774232. +768279694938808905118988 = -57614822655244 - -768279694996423727774232. +44264298376843904180525501948402872608 = -57614822655244 * -768279694996423727774232. +57614822655244 = -(-57614822655244). +-57614822655244 = +(-57614822655244). +0 = -57614822655244 div -768279694996423727774232. +-57614822655244 = -57614822655244 rem -768279694996423727774232. +-768279695049200370319136 = -57614822655244 band -768279694996423727774232. +-4838180110340 = -57614822655244 bor -768279694996423727774232. +768279695044362190208796 = -57614822655244 bxor -768279694996423727774232. +57614822655243 = bnot(-57614822655244). +-7201852831906 = -57614822655244 bsl -3. +-460918581241952 = -57614822655244 bsr -3. +66716996688288331280347926915 = 78862962169674868952653347 + 66638133726118656411395273568. +-66559270763948981542442620221 = 78862962169674868952653347 - 66638133726118656411395273568. +5255280619100630615291494137334154503933005328535832096 = 78862962169674868952653347 * 66638133726118656411395273568. +-78862962169674868952653347 = -(78862962169674868952653347). +78862962169674868952653347 = +(78862962169674868952653347). +0 = 78862962169674868952653347 div 66638133726118656411395273568. +78862962169674868952653347 = 78862962169674868952653347 rem 66638133726118656411395273568. +78587880854205447134089760 = 78862962169674868952653347 band 66638133726118656411395273568. +66638408807434125833213837155 = 78862962169674868952653347 bor 66638133726118656411395273568. +66559820926579920386079747395 = 78862962169674868952653347 bxor 66638133726118656411395273568. +-78862962169674868952653348 = bnot(78862962169674868952653347). +5047229578859191612969814208 = 78862962169674868952653347 bsl 6. +1232233783901169827385208 = 78862962169674868952653347 bsr 6. +363496995691681518346351 = 76 + 363496995691681518346275. +-363496995691681518346199 = 76 - 363496995691681518346275. +27625771672567795394316900 = 76 * 363496995691681518346275. +-76 = -(76). +76 = +(76). +0 = 76 div 363496995691681518346275. +76 = 76 rem 363496995691681518346275. +0 = 76 band 363496995691681518346275. +363496995691681518346351 = 76 bor 363496995691681518346275. +363496995691681518346351 = 76 bxor 363496995691681518346275. +-77 = bnot(76). +21392098230009856 = 76 bsl 48. +0 = 76 bsr 48. +45388257267872619604708117937 = 45388257267875444867293787589 + -2825262585669652. +45388257267878270129879457241 = 45388257267875444867293787589 - -2825262585669652. +-128233745087677154079742755684412077011549028 = 45388257267875444867293787589 * -2825262585669652. +-45388257267875444867293787589 = -(45388257267875444867293787589). +45388257267875444867293787589 = +(45388257267875444867293787589). +-16065146474559 = 45388257267875444867293787589 div -2825262585669652. +1190325297404121 = 45388257267875444867293787589 rem -2825262585669652. +45388257267875436034622232004 = 45388257267875444867293787589 band -2825262585669652. +-2816429914114067 = 45388257267875444867293787589 bor -2825262585669652. +-45388257267878252464536346071 = 45388257267875444867293787589 bxor -2825262585669652. +-45388257267875444867293787590 = bnot(45388257267875444867293787589). +181553029071501779469175150356 = 45388257267875444867293787589 bsl 2. +11347064316968861216823446897 = 45388257267875444867293787589 bsr 2. +534232775221076557060361434224 = 8142637292681815651 + 534232775212933919767679618573. +-534232775204791282474997802922 = 8142637292681815651 - 534232775212933919767679618573. +4350063718421737243249387242627227872212781686023 = 8142637292681815651 * 534232775212933919767679618573. +-8142637292681815651 = -(8142637292681815651). +8142637292681815651 = +(8142637292681815651). +0 = 8142637292681815651 div 534232775212933919767679618573. +8142637292681815651 = 8142637292681815651 rem 534232775212933919767679618573. +8070450807195059713 = 8142637292681815651 band 534232775212933919767679618573. +534232775213006106253166374511 = 8142637292681815651 bor 534232775212933919767679618573. +534232775204935655445971314798 = 8142637292681815651 bxor 534232775212933919767679618573. +-8142637292681815652 = bnot(8142637292681815651). +254457415396306739 = 8142637292681815651 bsl -5. +260564393365818100832 = 8142637292681815651 bsr -5. +-719 = 5 + -724. +729 = 5 - -724. +-3620 = 5 * -724. +-5 = -(5). +5 = +(5). +0 = 5 div -724. +5 = 5 rem -724. +4 = 5 band -724. +-723 = 5 bor -724. +-727 = 5 bxor -724. +-6 = bnot(5). +80 = 5 bsl 4. +0 = 5 bsr 4. +-33698381775178712848228269225 = 6383716279392 + -33698381775178719231944548617. +33698381775178725615660828009 = 6383716279392 - -33698381775178719231944548617. +-215120908327375073751204849770572099200864 = 6383716279392 * -33698381775178719231944548617. +-6383716279392 = -(6383716279392). +6383716279392 = +(6383716279392). +0 = 6383716279392 div -33698381775178719231944548617. +6383716279392 = 6383716279392 rem -33698381775178719231944548617. +5008250897504 = 6383716279392 band -33698381775178719231944548617. +-33698381775178717856479166729 = 6383716279392 bor -33698381775178719231944548617. +-33698381775178722864730064233 = 6383716279392 bxor -33698381775178719231944548617. +-6383716279393 = bnot(6383716279392). +24936391716 = 6383716279392 bsl -8. +1634231367524352 = 6383716279392 bsr -8. +473371560325055 = -59763632186814 + 533135192511869. +-592898824698683 = -59763632186814 - 533135192511869. +-31862095551125612402120295366 = -59763632186814 * 533135192511869. +59763632186814 = -(-59763632186814). +-59763632186814 = +(-59763632186814). +0 = -59763632186814 div 533135192511869. +-59763632186814 = -59763632186814 rem 533135192511869. +493269238960192 = -59763632186814 band 533135192511869. +-19897678635137 = -59763632186814 bor 533135192511869. +-513166917595329 = -59763632186814 bxor 533135192511869. +59763632186813 = bnot(-59763632186814). +-13915 = -59763632186814 bsl -32. +-256682845732539092434944 = -59763632186814 bsr -32. +9147059083566908696 = 8353389925127187513 + 793669158439721183. +7559720766687466330 = 8353389925127187513 - 793669158439721183. +6629827951994540456288032372679187879 = 8353389925127187513 * 793669158439721183. +-8353389925127187513 = -(8353389925127187513). +8353389925127187513 = +(8353389925127187513). +10 = 8353389925127187513 div 793669158439721183. +416698340729975683 = 8353389925127187513 rem 793669158439721183. +216491503072577561 = 8353389925127187513 band 793669158439721183. +8930567580494331135 = 8353389925127187513 bor 793669158439721183. +8714076077421753574 = 8353389925127187513 bxor 793669158439721183. +-8353389925127187514 = bnot(8353389925127187513). +2138467820832560003328 = 8353389925127187513 bsl 8. +32630429395028076 = 8353389925127187513 bsr 8. +72362913728339258532 = 72362913728339235883 + 22649. +72362913728339213234 = 72362913728339235883 - 22649. +1638947633033155353514067 = 72362913728339235883 * 22649. +-72362913728339235883 = -(72362913728339235883). +72362913728339235883 = +(72362913728339235883). +3194971686535354 = 72362913728339235883 div 22649. +3137 = 72362913728339235883 rem 22649. +20521 = 72362913728339235883 band 22649. +72362913728339238011 = 72362913728339235883 bor 22649. +72362913728339217490 = 72362913728339235883 bxor 22649. +-72362913728339235884 = bnot(72362913728339235883). +4016 = 72362913728339235883 bsl -54. +1303574365209567728547354356714831872 = 72362913728339235883 bsr -54. +17436186965801552151 = 7797441669221589463 + 9638745296579962688. +-1841303627358373225 = 7797441669221589463 - 9638745296579962688. +75157554214566208648139375940593956544 = 7797441669221589463 * 9638745296579962688. +-7797441669221589463 = -(7797441669221589463). +7797441669221589463 = +(7797441669221589463). +0 = 7797441669221589463 div 9638745296579962688. +7797441669221589463 = 7797441669221589463 rem 9638745296579962688. +288815050620674368 = 7797441669221589463 band 9638745296579962688. +17147371915180877783 = 7797441669221589463 bor 9638745296579962688. +16858556864560203415 = 7797441669221589463 bxor 9638745296579962688. +-7797441669221589464 = bnot(7797441669221589463). +15229378260198416 = 7797441669221589463 bsl -9. +3992290134641453805056 = 7797441669221589463 bsr -9. +-249371619938137286729145349434 = 55186244262 + -249371619938137286784331593696. +249371619938137286839517837958 = 55186244262 - -249371619938137286784331593696. +-13761883129916673637770067844111195372352 = 55186244262 * -249371619938137286784331593696. +-55186244262 = -(55186244262). +55186244262 = +(55186244262). +0 = 55186244262 div -249371619938137286784331593696. +55186244262 = 55186244262 rem -249371619938137286784331593696. +21184544 = 55186244262 band -249371619938137286784331593696. +-249371619938137286729166533978 = 55186244262 bor -249371619938137286784331593696. +-249371619938137286729187718522 = 55186244262 bxor -249371619938137286784331593696. +-55186244263 = bnot(55186244262). +428834400026232149395182982878267995633372152430042768694025038616215998110292595899915669864448 = 55186244262 bsl 282. +0 = 55186244262 bsr 282. +-31637674 = -31637667 + -7. +-31637660 = -31637667 - -7. +221463669 = -31637667 * -7. +31637667 = -(-31637667). +-31637667 = +(-31637667). +4519666 = -31637667 div -7. +-5 = -31637667 rem -7. +-31637671 = -31637667 band -7. +-3 = -31637667 bor -7. +31637668 = -31637667 bxor -7. +31637666 = bnot(-31637667). +-8696495685551259648 = -31637667 bsl 38. +-1 = -31637667 bsr 38. +34884055521500638 = 34883342235339514 + 713286161124. +34882628949178390 = 34883342235339514 - 713286161124. +24881805270220014909847853736 = 34883342235339514 * 713286161124. +-34883342235339514 = -(34883342235339514). +34883342235339514 = +(34883342235339514). +48905 = 34883342235339514 div 713286161124. +82525570294 = 34883342235339514 rem 713286161124. +163242312416 = 34883342235339514 band 713286161124. +34883892279188222 = 34883342235339514 bor 713286161124. +34883729036875806 = 34883342235339514 bxor 713286161124. +-34883342235339515 = bnot(34883342235339514). +558133475765432224 = 34883342235339514 bsl 4. +2180208889708719 = 34883342235339514 bsr 4. +-56817515656656 = 541178 + -56817516197834. +56817516739012 = 541178 - -56817516197834. +-30748389780911408452 = 541178 * -56817516197834. +-541178 = -(541178). +541178 = +(541178). +0 = 541178 div -56817516197834. +541178 = 541178 rem -56817516197834. +16434 = 541178 band -56817516197834. +-56817515673090 = 541178 bor -56817516197834. +-56817515689524 = 541178 bxor -56817516197834. +-541179 = bnot(541178). +4874498078282220568576 = 541178 bsl 53. +0 = 541178 bsr 53. +5517514786496594214410504 = 618239 + 5517514786496594213792265. +-5517514786496594213174026 = 618239 - 5517514786496594213792265. +3411142824088867910140716121335 = 618239 * 5517514786496594213792265. +-618239 = -(618239). +618239 = +(618239). +0 = 618239 div 5517514786496594213792265. +618239 = 618239 rem 5517514786496594213792265. +27145 = 618239 band 5517514786496594213792265. +5517514786496594214383359 = 618239 bor 5517514786496594213792265. +5517514786496594214356214 = 618239 bxor 5517514786496594213792265. +-618240 = bnot(618239). +9891824 = 618239 bsl 4. +38639 = 618239 bsr 4. +528252633090290629 = 5869819193392718 + 522382813896897911. +-516512994703505193 = 5869819193392718 - 522382813896897911. +3066292667310507615057367776812098 = 5869819193392718 * 522382813896897911. +-5869819193392718 = -(5869819193392718). +5869819193392718 = +(5869819193392718). +0 = 5869819193392718 div 522382813896897911. +5869819193392718 = 5869819193392718 rem 522382813896897911. +5840609038496838 = 5869819193392718 band 522382813896897911. +522412024051793791 = 5869819193392718 bor 522382813896897911. +516571415013296953 = 5869819193392718 bxor 522382813896897911. +-5869819193392719 = bnot(5869819193392718). +93917107094283488 = 5869819193392718 bsl 4. +366863699587044 = 5869819193392718 bsr 4. +93451451842942818555 = -855656892 + 93451451843798475447. +-93451451844654132339 = -855656892 - 93451451843798475447. +-79962378837552272975318330724 = -855656892 * 93451451843798475447. +855656892 = -(-855656892). +-855656892 = +(-855656892). +0 = -855656892 div 93451451843798475447. +-855656892 = -855656892 rem 93451451843798475447. +93451451843228049924 = -855656892 band 93451451843798475447. +-285231369 = -855656892 bor 93451451843798475447. +-93451451843513281293 = -855656892 bxor 93451451843798475447. +855656891 = bnot(-855656892). +-1 = -855656892 bsl -986. +-559596999863434058181088787703630780480556894737428043058390821616679397799374967206458383762742284413287718056878721836706115755314903261006719275360075705173593849705167073442107788566149655603624348072477881781982878106212705711322388638085309768430813689625159547205033343575193347563752997552796991488 = -855656892 bsr -986. +447649719154665546776115 = 447649719154622935599339 + 42611176776. +447649719154580324422563 = 447649719154622935599339 - 42611176776. +19074881316624391186447497637751064 = 447649719154622935599339 * 42611176776. +-447649719154622935599339 = -(447649719154622935599339). +447649719154622935599339 = +(447649719154622935599339). +10505453099965 = 447649719154622935599339 div 42611176776. +37121186499 = 447649719154622935599339 rem 42611176776. +3229614152 = 447649719154622935599339 band 42611176776. +447649719154662317161963 = 447649719154622935599339 bor 42611176776. +447649719154659087547811 = 447649719154622935599339 bxor 42611176776. +-447649719154622935599340 = bnot(447649719154622935599339). +3497263430895491684369 = 447649719154622935599339 bsl -7. +57299164051791735756715392 = 447649719154622935599339 bsr -7. +-526687489683481433080338 = -526687489683481428111489 + -4968849. +-526687489683481423142640 = -526687489683481428111489 - -4968849. +2617030606426277010590344006161 = -526687489683481428111489 * -4968849. +526687489683481428111489 = -(-526687489683481428111489). +-526687489683481428111489 = +(-526687489683481428111489). +105997885965840666 = -526687489683481428111489 div -4968849. +-698055 = -526687489683481428111489 rem -4968849. +-526687489683481432945041 = -526687489683481428111489 band -4968849. +-135297 = -526687489683481428111489 bor -4968849. +526687489683481432809744 = -526687489683481428111489 bxor -4968849. +526687489683481428111488 = bnot(-526687489683481428111489). +-1962063795639133 = -526687489683481428111489 bsl -28. +-141381596462680632822638768553984 = -526687489683481428111489 bsr -28. +-768406856353371 = -36812223784429 + -731594632568942. +694782408784513 = -36812223784429 - -731594632568942. +26931625333615001809488604118 = -36812223784429 * -731594632568942. +36812223784429 = -(-36812223784429). +-36812223784429 = +(-36812223784429). +0 = -36812223784429 div -731594632568942. +-36812223784429 = -36812223784429 rem -731594632568942. +-766890699236846 = -36812223784429 band -731594632568942. +-1516157116525 = -36812223784429 bor -731594632568942. +765374542120321 = -36812223784429 bxor -731594632568942. +36812223784428 = bnot(-36812223784429). +-5696415719734780799497428387179383488512 = -36812223784429 bsl 87. +-1 = -36812223784429 bsr 87. +-6156884284911674685174760725 = 7738353147 + -6156884284911674692913113872. +6156884284911674700651467019 = 7738353147 - -6156884284911674692913113872. +-47644144881861102476944453328960555184 = 7738353147 * -6156884284911674692913113872. +-7738353147 = -(7738353147). +7738353147 = +(7738353147). +0 = 7738353147 div -6156884284911674692913113872. +7738353147 = 7738353147 rem -6156884284911674692913113872. +1073825008 = 7738353147 band -6156884284911674692913113872. +-6156884284911674686248585733 = 7738353147 bor -6156884284911674692913113872. +-6156884284911674687322410741 = 7738353147 bxor -6156884284911674692913113872. +-7738353148 = bnot(7738353147). +0 = 7738353147 bsl -49. +4356305543661313132068864 = 7738353147 bsr -49. +-9331217104250 = -6857773436789 + -2473443667461. +-4384329769328 = -6857773436789 - -2473443667461. +16962316280108010419622729 = -6857773436789 * -2473443667461. +6857773436789 = -(-6857773436789). +-6857773436789 = +(-6857773436789). +2 = -6857773436789 div -2473443667461. +-1910886101867 = -6857773436789 rem -2473443667461. +-6871809224565 = -6857773436789 band -2473443667461. +-2459407879685 = -6857773436789 bor -2473443667461. +4412401344880 = -6857773436789 bxor -2473443667461. +6857773436788 = bnot(-6857773436789). +-1 = -6857773436789 bsl -711. +-73877135891535041194567845409532392555449692441996201171567393259263971087275630149583954972045843046579819926045499081403789204710777913948952840714061305344623347040087488483321504037757473989273894688863749707071200136527872 = -6857773436789 bsr -711. +-8862 = -3163 + -5699. +2536 = -3163 - -5699. +18025937 = -3163 * -5699. +3163 = -(-3163). +-3163 = +(-3163). +0 = -3163 div -5699. +-3163 = -3163 rem -5699. +-7771 = -3163 band -5699. +-1091 = -3163 bor -5699. +6680 = -3163 bxor -5699. +3162 = bnot(-3163). +-7747583955804587064033025409816693034551909564216481017690646693299710659329624213439192275631247214614854720650283481286037929452644368456245063859770027514737272854791614349968839653855242186565464621056 = -3163 bsl 669. +-1 = -3163 bsr 669. +49938691529915359744835 = 673513368 + 49938691529914686231467. +-49938691529914012718099 = 673513368 - 49938691529914686231467. +33634376325825913076418566750856 = 673513368 * 49938691529914686231467. +-673513368 = -(673513368). +673513368 = +(673513368). +0 = 673513368 div 49938691529914686231467. +673513368 = 673513368 rem 49938691529914686231467. +2413448 = 673513368 band 49938691529914686231467. +49938691529915357331387 = 673513368 bor 49938691529914686231467. +49938691529915354917939 = 673513368 bxor 49938691529914686231467. +-673513369 = bnot(673513368). +40 = 673513368 bsl -24. +11299679253823488 = 673513368 bsr -24. +-3778957544766119360 = -3778956672496357543 + -872269761817. +-3778955800226595726 = -3778956672496357543 - -872269761817. +3296269636635160668832681335631 = -3778956672496357543 * -872269761817. +3778956672496357543 = -(-3778956672496357543). +-3778956672496357543 = +(-3778956672496357543). +4332325 = -3778956672496357543 div -872269761817. +-576632523018 = -3778956672496357543 rem -872269761817. +-3778957536090971583 = -3778956672496357543 band -872269761817. +-8675147777 = -3778956672496357543 bor -872269761817. +3778957527415823806 = -3778956672496357543 bxor -872269761817. +3778956672496357542 = bnot(-3778956672496357543). +-1 = -3778956672496357543 bsl -574. +-233662717739497829481445250147111709136982365013769391462699314908304472573989039157320248745318224210099370341970651220915547562381773285418885296295503586503787527171820935607181131447795712 = -3778956672496357543 bsr -574. +-649232869612948879619714134339 = -725 + -649232869612948879619714133614. +649232869612948879619714132889 = -725 - -649232869612948879619714133614. +470693830469387937724292746870150 = -725 * -649232869612948879619714133614. +725 = -(-725). +-725 = +(-725). +0 = -725 div -649232869612948879619714133614. +-725 = -725 rem -649232869612948879619714133614. +-649232869612948879619714133758 = -725 band -649232869612948879619714133614. +-581 = -725 bor -649232869612948879619714133614. +649232869612948879619714133177 = -725 bxor -649232869612948879619714133614. +724 = bnot(-725). +-182 = -725 bsl -2. +-2900 = -725 bsr -2. +336153821221413443388253589123 = 336153821221413443388254443641 + -854518. +336153821221413443388255298159 = 336153821221413443388254443641 - -854518. +-287249491002479772817244410671220038 = 336153821221413443388254443641 * -854518. +-336153821221413443388254443641 = -(336153821221413443388254443641). +336153821221413443388254443641 = +(336153821221413443388254443641). +-393384131430131891181056 = 336153821221413443388254443641 div -854518. +832633 = 336153821221413443388254443641 rem -854518. +336153821221413443388254113800 = 336153821221413443388254443641 band -854518. +-524677 = 336153821221413443388254443641 bor -854518. +-336153821221413443388254638477 = 336153821221413443388254443641 bxor -854518. +-336153821221413443388254443642 = bnot(336153821221413443388254443641). +0 = 336153821221413443388254443641 bsl -859. +1292124400582025214681753805379999017826458544223285740214950304716425204700493732921339170721971191611095287667243285143016059894708138089168312449178554746377958816494701003039401515512800135243884361346414364814334839205381088559598646160649881162109023652744982065088981627652232183808 = 336153821221413443388254443641 bsr -859. +-48828401135 = -2461564478 + -46366836657. +43905272179 = -2461564478 - -46366836657. +114134958072099470046 = -2461564478 * -46366836657. +2461564478 = -(-2461564478). +-2461564478 = +(-2461564478). +0 = -2461564478 div -46366836657. +-2461564478 = -2461564478 rem -46366836657. +-46636335038 = -2461564478 band -46366836657. +-2192066097 = -2461564478 bor -46366836657. +44444268941 = -2461564478 bxor -46366836657. +2461564477 = bnot(-2461564478). +-1 = -2461564478 bsl -78. +-743962213525101706399794732204032 = -2461564478 bsr -78. +-556775059482823128027518 = -556778541154981477947271 + 3481672158349919753. +-556782022827139827867024 = -556778541154981477947271 - 3481672158349919753. +-1938520345105983984371355886263702015344063 = -556778541154981477947271 * 3481672158349919753. +556778541154981477947271 = -(-556778541154981477947271). +-556778541154981477947271 = +(-556778541154981477947271). +-159916 = -556778541154981477947271 div 3481672158349919753. +-3456280295710726523 = -556778541154981477947271 rem 3481672158349919753. +3458837223825244169 = -556778541154981477947271 band 3481672158349919753. +-556778518320046953271687 = -556778541154981477947271 bor 3481672158349919753. +-556781977157270778515856 = -556778541154981477947271 bxor 3481672158349919753. +556778541154981477947270 = bnot(-556778541154981477947271). +-4349832352773292796464 = -556778541154981477947271 bsl -7. +-71267653267837629177250688 = -556778541154981477947271 bsr -7. +-97754190262650772370872987 = -98197617887185616669216942 + 443427624534844298343955. +-98641045511720460967560897 = -98197617887185616669216942 - 443427624534844298343955. +-43543536434695054084525258535137170335157229285610 = -98197617887185616669216942 * 443427624534844298343955. +98197617887185616669216942 = -(-98197617887185616669216942). +-98197617887185616669216942 = +(-98197617887185616669216942). +-221 = -98197617887185616669216942 div 443427624534844298343955. +-200112864985026735202887 = -98197617887185616669216942 rem 443427624534844298343955. +329389834326850956174866 = -98197617887185616669216942 band 443427624534844298343955. +-98083580096977623327047853 = -98197617887185616669216942 bor 443427624534844298343955. +-98412969931304474283222719 = -98197617887185616669216942 bxor 443427624534844298343955. +98197617887185616669216941 = bnot(-98197617887185616669216942). +-383584444871818815114129 = -98197617887185616669216942 bsl -8. +-25138590179119517867319537152 = -98197617887185616669216942 bsr -8. +65325146671884263620246 = -2375599319477 + 65325146674259862939723. +-65325146676635462259200 = -2375599319477 - 65325146674259862939723. +-155186373984106940192261251470884871 = -2375599319477 * 65325146674259862939723. +2375599319477 = -(-2375599319477). +-2375599319477 = +(-2375599319477). +0 = -2375599319477 div 65325146674259862939723. +-2375599319477 = -2375599319477 rem 65325146674259862939723. +65325146674255093956683 = -2375599319477 band 65325146674259862939723. +-2370830336437 = -2375599319477 bor 65325146674259862939723. +-65325146676625924293120 = -2375599319477 bxor 65325146674259862939723. +2375599319476 = bnot(-2375599319477). +-38009589111632 = -2375599319477 bsl 4. +-148474957468 = -2375599319477 bsr 4. +524147523146881815581505024662 = 524147523146881815517932188839 + 63572835823. +524147523146881815454359353016 = 524147523146881815517932188839 - 63572835823. +33321544436048809972305676753508779979497 = 524147523146881815517932188839 * 63572835823. +-524147523146881815517932188839 = -(524147523146881815517932188839). +524147523146881815517932188839 = +(524147523146881815517932188839). +8244834705914607277 = 524147523146881815517932188839 div 63572835823. +39690104868 = 524147523146881815517932188839 rem 63572835823. +51676738727 = 524147523146881815517932188839 band 63572835823. +524147523146881815529828285935 = 524147523146881815517932188839 bor 63572835823. +524147523146881815478151547208 = 524147523146881815517932188839 bxor 63572835823. +-524147523146881815517932188840 = bnot(524147523146881815517932188839). +110992555 = 524147523146881815517932188839 bsl -72. +2475216695387976233192489581374336681680929181138944 = 524147523146881815517932188839 bsr -72. +788157169335553457993544312218 = 788157169335553457992572592346 + 971719872. +788157169335553457991600872474 = 788157169335553457992572592346 - 971719872. +765867983702626331249700016385163299712 = 788157169335553457992572592346 * 971719872. +-788157169335553457992572592346 = -(788157169335553457992572592346). +788157169335553457992572592346 = +(788157169335553457992572592346). +811095040912730719571 = 788157169335553457992572592346 div 971719872. +572577434 = 788157169335553457992572592346 rem 971719872. +30097600 = 788157169335553457992572592346 band 971719872. +788157169335553457993514214618 = 788157169335553457992572592346 bor 971719872. +788157169335553457993484117018 = 788157169335553457992572592346 bxor 971719872. +-788157169335553457992572592347 = bnot(788157169335553457992572592346). +0 = 788157169335553457992572592346 bsl -945. +234400607467991052780843019870991817329861630439057960281722580280810231453180252492156694352398844086727915063510342812594864041835995223590154472972256657500844954457923059382361422736857621154335734662262532892155554792243506175409804520676108851065559235441081280792496342485860126981192353512187823008484687872 = 788157169335553457992572592346 bsr -945. +456498221969429928 = 45395 + 456498221969384533. +-456498221969339138 = 45395 - 456498221969384533. +20722736786300210875535 = 45395 * 456498221969384533. +-45395 = -(45395). +45395 = +(45395). +0 = 45395 div 456498221969384533. +45395 = 45395 rem 456498221969384533. +8273 = 45395 band 456498221969384533. +456498221969421655 = 45395 bor 456498221969384533. +456498221969413382 = 45395 bxor 456498221969384533. +-45396 = bnot(45395). +0 = 45395 bsl -65. +1674779894452090191216640 = 45395 bsr -65. +58272100780201 = 5813589616752 + 52458511163449. +-46644921546697 = 5813589616752 - 52458511163449. +304972255810095985540497648 = 5813589616752 * 52458511163449. +-5813589616752 = -(5813589616752). +5813589616752 = +(5813589616752). +0 = 5813589616752 div 52458511163449. +5813589616752 = 5813589616752 rem 52458511163449. +5504283713584 = 5813589616752 band 52458511163449. +52767817066617 = 5813589616752 bor 52458511163449. +47263533353033 = 5813589616752 bxor 52458511163449. +-5813589616753 = bnot(5813589616752). +0 = 5813589616752 bsl -249. +5259122560094394097887193586280664621930222978143017527786994756394715120927690796826624 = 5813589616752 bsr -249. +-811217921544075522 = 22713615154896373 + -833931536698971895. +856645151853868268 = 22713615154896373 - -833931536698971895. +-18941599990111788883837564364436835 = 22713615154896373 * -833931536698971895. +-22713615154896373 = -(22713615154896373). +22713615154896373 = +(22713615154896373). +0 = 22713615154896373 div -833931536698971895. +22713615154896373 = 22713615154896373 rem -833931536698971895. +18016226019068161 = 22713615154896373 band -833931536698971895. +-829234147563143683 = 22713615154896373 bor -833931536698971895. +-847250373582211844 = 22713615154896373 bxor -833931536698971895. +-22713615154896374 = bnot(22713615154896373). +363417842478341968 = 22713615154896373 bsl 4. +1419600947181023 = 22713615154896373 bsr 4. +5456 = -66 + 5522. +-5588 = -66 - 5522. +-364452 = -66 * 5522. +66 = -(-66). +-66 = +(-66). +0 = -66 div 5522. +-66 = -66 rem 5522. +5522 = -66 band 5522. +-66 = -66 bor 5522. +-5588 = -66 bxor 5522. +65 = bnot(-66). +-1 = -66 bsl -861. +-1014776034715873720684741443386595231429787920740899294045678304850603383056116311499835541721706232086537349665158267971309685931982741617205773147828702700672249808672767119573437380797816007092467025269927062172028523267991930326776759329910401937327974776832 = -66 bsr -861. +5196785811345279665568573520 = 75194 + 5196785811345279665568498326. +-5196785811345279665568423132 = 75194 - 5196785811345279665568498326. +390767112298296959172757663125244 = 75194 * 5196785811345279665568498326. +-75194 = -(75194). +75194 = +(75194). +0 = 75194 div 5196785811345279665568498326. +75194 = 75194 rem 5196785811345279665568498326. +146 = 75194 band 5196785811345279665568498326. +5196785811345279665568573374 = 75194 bor 5196785811345279665568498326. +5196785811345279665568573228 = 75194 bxor 5196785811345279665568498326. +-75195 = bnot(75194). +0 = 75194 bsl -49. +42330458797562134528 = 75194 bsr -49. +-527576 = 3536 + -531112. +534648 = 3536 - -531112. +-1878012032 = 3536 * -531112. +-3536 = -(3536). +3536 = +(3536). +0 = 3536 div -531112. +3536 = 3536 rem -531112. +1360 = 3536 band -531112. +-528936 = 3536 bor -531112. +-530296 = 3536 bxor -531112. +-3537 = bnot(3536). +0 = 3536 bsl -523. +97095698104887343808704004902207225665058892885226911710475291166720322785976447201221483557515613225598879028321105256077053398267992210085047056149531368357888 = 3536 bsr -523. +194861382607051816055649501 = 8184173239335391298581224112 + -7989311856728339482525574611. +16173485096063730781106798723 = 8184173239335391298581224112 - -7989311856728339482525574611. +-65385912298541023764191404366290936156944601698568220432 = 8184173239335391298581224112 * -7989311856728339482525574611. +-8184173239335391298581224112 = -(8184173239335391298581224112). +8184173239335391298581224112 = +(8184173239335391298581224112). +-1 = 8184173239335391298581224112 div -7989311856728339482525574611. +194861382607051816055649501 = 8184173239335391298581224112 rem -7989311856728339482525574611. +659166956033658411882699296 = 8184173239335391298581224112 band -7989311856728339482525574611. +-464305573426606595827049795 = 8184173239335391298581224112 bor -7989311856728339482525574611. +-1123472529460265007709749091 = 8184173239335391298581224112 bxor -7989311856728339482525574611. +-8184173239335391298581224113 = bnot(8184173239335391298581224112). +0 = 8184173239335391298581224112 bsl -848. +15360704581040881949470074138553440868943889412111113776588868549988553860433207151006860525408649511176731212529971171670484927035841364300665867032458282255893662134560851235709044534840334938773177773825554117097592516116215828036110551084445750840532370878910844498230861965033472 = 8184173239335391298581224112 bsr -848. +-24469893012618 = -24469883178955 + -9833663. +-24469873345292 = -24469883178955 - -9833663. +240628584831212162165 = -24469883178955 * -9833663. +24469883178955 = -(-24469883178955). +-24469883178955 = +(-24469883178955). +2488379 = -24469883178955 div -9833663. +-2676678 = -24469883178955 rem -9833663. +-24469883572223 = -24469883178955 band -9833663. +-9440395 = -24469883178955 bor -9833663. +24469874131828 = -24469883178955 bxor -9833663. +24469883178954 = bnot(-24469883178955). +-3388815562760659540322787124611722074864605117165619288748126783639116305815276462163657745235017088176590901286599153079163310119519980301350579944449075884550540718729845948037455500638928402240973972195935287936127385696634369984694284188180163816400164604802252283180697041035298078720 = -24469883178955 bsl 914. +-1 = -24469883178955 bsr 914. +2929337694275698696311920100 = 2929337694275698696311924425 + -4325. +2929337694275698696311928750 = 2929337694275698696311924425 - -4325. +-12669385527742396861549073138125 = 2929337694275698696311924425 * -4325. +-2929337694275698696311924425 = -(2929337694275698696311924425). +2929337694275698696311924425 = +(2929337694275698696311924425). +-677303513127329178338017 = 2929337694275698696311924425 div -4325. +900 = 2929337694275698696311924425 rem -4325. +2929337694275698696311924233 = 2929337694275698696311924425 band -4325. +-4133 = 2929337694275698696311924425 bor -4325. +-2929337694275698696311928366 = 2929337694275698696311924425 bxor -4325. +-2929337694275698696311924426 = bnot(2929337694275698696311924425). +0 = 2929337694275698696311924425 bsl -281. +11381466426987286010056685843059868836669048747613621092418532667143480310195248513703294481583824492589324697600 = 2929337694275698696311924425 bsr -281. +-51912714165724719765 = -51912714165724719694 + -71. +-51912714165724719623 = -51912714165724719694 - -71. +3685802705766455098274 = -51912714165724719694 * -71. +51912714165724719694 = -(-51912714165724719694). +-51912714165724719694 = +(-51912714165724719694). +731164988249643939 = -51912714165724719694 div -71. +-25 = -51912714165724719694 rem -71. +-51912714165724719696 = -51912714165724719694 band -71. +-69 = -51912714165724719694 bor -71. +51912714165724719627 = -51912714165724719694 bxor -71. +51912714165724719693 = bnot(-51912714165724719694). +-1 = -51912714165724719694 bsl -426. +-8996050581678828194654071155591618815918926338360260452875684958610849308208012689624562657875494921399574264624661808260863722667206971809507311616 = -51912714165724719694 bsr -426. +-914986716689646585310455939687 = 77389166885648 + -914986716689646662699622825335. +914986716689646740088789710983 = 77389166885648 - -914986716689646662699622825335. +-70810059716046191723759306493834876622292080 = 77389166885648 * -914986716689646662699622825335. +-77389166885648 = -(77389166885648). +77389166885648 = +(77389166885648). +0 = 77389166885648 div -914986716689646662699622825335. +77389166885648 = 77389166885648 rem -914986716689646662699622825335. +4400492315136 = 77389166885648 band -914986716689646662699622825335. +-914986716689646589710948254823 = 77389166885648 bor -914986716689646662699622825335. +-914986716689646594111440569959 = 77389166885648 bxor -914986716689646662699622825335. +-77389166885649 = bnot(77389166885648). +1 = 77389166885648 bsl -46. +5445778486698710331683766272 = 77389166885648 bsr -46. +-975537694281819 = -9957624 + -975537684324195. +975537674366571 = -9957624 - -975537684324195. +9714037458331027912680 = -9957624 * -975537684324195. +9957624 = -(-9957624). +-9957624 = +(-9957624). +0 = -9957624 div -975537684324195. +-9957624 = -9957624 rem -975537684324195. +-975537694048248 = -9957624 band -975537684324195. +-233571 = -9957624 bor -975537684324195. +975537693814677 = -9957624 bxor -975537684324195. +9957623 = bnot(-9957624). +-1368565421627670528 = -9957624 bsl 37. +-1 = -9957624 bsr 37. +94302615120 = 437658273 + 93864956847. +-93427298574 = 437658273 - 93864956847. +41080774908877545231 = 437658273 * 93864956847. +-437658273 = -(437658273). +437658273 = +(437658273). +0 = 437658273 div 93864956847. +437658273 = 437658273 rem 93864956847. +436208289 = 437658273 band 93864956847. +93866406831 = 437658273 bor 93864956847. +93430198542 = 437658273 bxor 93864956847. +-437658274 = bnot(437658273). +32293480615090828255451676672 = 437658273 bsl 66. +0 = 437658273 bsr 66. +-943791 = -944115 + 324. +-944439 = -944115 - 324. +-305893260 = -944115 * 324. +944115 = -(-944115). +-944115 = +(-944115). +-2913 = -944115 div 324. +-303 = -944115 rem 324. +4 = -944115 band 324. +-943795 = -944115 bor 324. +-943799 = -944115 bxor 324. +944114 = bnot(-944115). +-1 = -944115 bsl -76. +-71335312511591601454857584640 = -944115 bsr -76. +804168 = 47752 + 756416. +-708664 = 47752 - 756416. +36120376832 = 47752 * 756416. +-47752 = -(47752). +47752 = +(47752). +0 = 47752 div 756416. +47752 = 47752 rem 756416. +35456 = 47752 band 756416. +768712 = 47752 bor 756416. +733256 = 47752 bxor 756416. +-47753 = bnot(47752). +12613560225395143421908464704666750497243998756438437462327189888720866097444362744811186401573703018173245854859007204336994930330686119887393868649781145338264640467160245389612633716042357706582006584916450334337438323517736288076505564354961762912664223157514392448270336 = 47752 bsl 895. +0 = 47752 bsr 895. +-1884722603876 = -898353346699 + -986369257177. +88015910478 = -898353346699 - -986369257177. +886108123265964575008723 = -898353346699 * -986369257177. +898353346699 = -(-898353346699). +-898353346699 = +(-898353346699). +0 = -898353346699 div -986369257177. +-898353346699 = -898353346699 rem -986369257177. +-1055122816731 = -898353346699 band -986369257177. +-829599787145 = -898353346699 bor -986369257177. +225523029586 = -898353346699 bxor -986369257177. +898353346698 = bnot(-898353346699). +-28747307094368 = -898353346699 bsl 5. +-28073542085 = -898353346699 bsr 5. +423856867381559151547629330 = -73393635644 + 423856867381559224941264974. +-423856867381559298334900618 = -73393635644 - 423856867381559224941264974. +-31108396489809386079946238802215133256 = -73393635644 * 423856867381559224941264974. +73393635644 = -(-73393635644). +-73393635644 = +(-73393635644). +0 = -73393635644 div 423856867381559224941264974. +-73393635644 = -73393635644 rem 423856867381559224941264974. +423856867381559220578140228 = -73393635644 band 423856867381559224941264974. +-69030510898 = -73393635644 bor 423856867381559224941264974. +-423856867381559289608651126 = -73393635644 bxor 423856867381559224941264974. +73393635643 = bnot(-73393635644). +-1 = -73393635644 bsl -951. +-1396960987869257021182404737770934090305346867905888782305430990308128968611284969672680394890041633710648474075566307385781440743432461872101582743469592870663924353071069797292284110104690003385191941662431781220632085690520925286314556403968101141362195770022335942242917544896735955404520947712 = -73393635644 bsr -951. +83129814239514894144774200099 = 846361 + 83129814239514894144773353738. +-83129814239514894144772507377 = 846361 - 83129814239514894144773353738. +70357832709570065323264520443047418 = 846361 * 83129814239514894144773353738. +-846361 = -(846361). +846361 = +(846361). +0 = 846361 div 83129814239514894144773353738. +846361 = 846361 rem 83129814239514894144773353738. +57352 = 846361 band 83129814239514894144773353738. +83129814239514894144774142747 = 846361 bor 83129814239514894144773353738. +83129814239514894144774085395 = 846361 bxor 83129814239514894144773353738. +-846362 = bnot(846361). +99816706619824517513266074272494132712041761282277466793778573140068334740824421706264571914002764129848897354981634954162960368061493044290229001702400876756223308697960448 = 846361 bsl 555. +0 = 846361 bsr 555. +-6149219841637342341767709375 = 7936914143828558 + -6149219841645279255911537933. +6149219841653216170055366491 = 7936914143828558 - -6149219841645279255911537933. +-48805829934665622608982731067028238465690614 = 7936914143828558 * -6149219841645279255911537933. +-7936914143828558 = -(7936914143828558). +7936914143828558 = +(7936914143828558). +0 = 7936914143828558 div -6149219841645279255911537933. +7936914143828558 = 7936914143828558 rem -6149219841645279255911537933. +2270027655070274 = 7936914143828558 band -6149219841645279255911537933. +-6149219841639612369422779649 = 7936914143828558 bor -6149219841645279255911537933. +-6149219841641882397077849923 = 7936914143828558 bxor -6149219841645279255911537933. +-7936914143828559 = bnot(7936914143828558). +1015925010410055424 = 7936914143828558 bsl 7. +62007141748660 = 7936914143828558 bsr 7. +-9623489537571151649536261155 = -9623489537571151649536252669 + -8486. +-9623489537571151649536244183 = -9623489537571151649536252669 - -8486. +81664932215828792897964640149134 = -9623489537571151649536252669 * -8486. +9623489537571151649536252669 = -(-9623489537571151649536252669). +-9623489537571151649536252669 = +(-9623489537571151649536252669). +1134043075367800100110329 = -9623489537571151649536252669 div -8486. +-775 = -9623489537571151649536252669 rem -8486. +-9623489537571151649536261118 = -9623489537571151649536252669 band -8486. +-37 = -9623489537571151649536252669 bor -8486. +9623489537571151649536261081 = -9623489537571151649536252669 bxor -8486. +9623489537571151649536252668 = bnot(-9623489537571151649536252669). +-44142919870828739211200701535155062110435384245131017753869244786479539088619838914209774386582838431752616390853683553030701068582912 = -9623489537571151649536252669 bsl 351. +-1 = -9623489537571151649536252669 bsr 351. +2217835715205243105330672 = 2217834943852943918978847 + 771352299186351825. +2217834172500644732627022 = 2217834943852943918978847 - 771352299186351825. +1710732083156801799158171996743613274845775 = 2217834943852943918978847 * 771352299186351825. +-2217834943852943918978847 = -(2217834943852943918978847). +2217834943852943918978847 = +(2217834943852943918978847). +2875255 = 2217834943852943918978847 div 771352299186351825. +388855889902388472 = 2217834943852943918978847 rem 771352299186351825. +194851138756298257 = 2217834943852943918978847 band 771352299186351825. +2217835520354104349032415 = 2217834943852943918978847 bor 771352299186351825. +2217835325502965592734158 = 2217834943852943918978847 bxor 771352299186351825. +-2217834943852943918978848 = bnot(2217834943852943918978847). +0 = 2217834943852943918978847 bsl -777. +1762933184547032271860867896688770063313984512531651045139630090111197779460986334458776585482400710991208227030812046357442194506276242298380162967879430699127512261438594192361631181535584738325550599656143411847624343045336965677373191327400246575192080384 = 2217834943852943918978847 bsr -777. +92438122089066 = 4912779 + 92438117176287. +-92438112263508 = 4912779 - 92438117176287. +454128040863202071573 = 4912779 * 92438117176287. +-4912779 = -(4912779). +4912779 = +(4912779). +0 = 4912779 div 92438117176287. +4912779 = 4912779 rem 92438117176287. +152203 = 4912779 band 92438117176287. +92438121936863 = 4912779 bor 92438117176287. +92438121784660 = 4912779 bxor 92438117176287. +-4912780 = bnot(4912779). +314417856 = 4912779 bsl 6. +76762 = 4912779 bsr 6. +39620715882967338 = 39587992666517787 + 32723216449551. +39555269450068236 = 39587992666517787 - 32723216449551. +1295446452829699203068729663637 = 39587992666517787 * 32723216449551. +-39587992666517787 = -(39587992666517787). +39587992666517787 = +(39587992666517787). +1209 = 39587992666517787 div 32723216449551. +25623979010628 = 39587992666517787 rem 32723216449551. +5501047799819 = 39587992666517787 band 32723216449551. +39615214835167519 = 39587992666517787 bor 32723216449551. +39609713787367700 = 39587992666517787 bxor 32723216449551. +-39587992666517788 = bnot(39587992666517787). +633407882664284592 = 39587992666517787 bsl 4. +2474249541657361 = 39587992666517787 bsr 4. +768874092916150731214 = 768881411673972895468 + -7318757822164254. +768888730431795059722 = 768881411673972895468 - -7318757822164254. +-5627256846005583089915510094668200872 = 768881411673972895468 * -7318757822164254. +-768881411673972895468 = -(768881411673972895468). +768881411673972895468 = +(768881411673972895468). +-105056 = 768881411673972895468 div -7318757822164254. +1989908685027244 = 768881411673972895468 rem -7318757822164254. +768874093234249269984 = 768881411673972895468 band -7318757822164254. +-318098538770 = 768881411673972895468 bor -7318757822164254. +-768874093552347808754 = 768881411673972895468 bxor -7318757822164254. +-768881411673972895469 = bnot(768881411673972895468). +1744597869527381584003786176799407787844738102215515492761961756558697632737056644556336255557654110596433804500802027126351973090052059686348113033076149181819228376621109013589970153641994880427935169332083607354819336020908133882778522143888586620649102893574792953387671612174288395085127937425408 = 768881411673972895468 bsl 928. +0 = 768881411673972895468 bsr 928. +97523379246321139975 = 97523379246321146323 + -6348. +97523379246321152671 = 97523379246321146323 - -6348. +-619078411455646636858404 = 97523379246321146323 * -6348. +-97523379246321146323 = -(97523379246321146323). +97523379246321146323 = +(97523379246321146323). +-15362851173018454 = 97523379246321146323 div -6348. +331 = 97523379246321146323 rem -6348. +97523379246321139984 = 97523379246321146323 band -6348. +-9 = 97523379246321146323 bor -6348. +-97523379246321139993 = 97523379246321146323 bxor -6348. +-97523379246321146324 = bnot(97523379246321146323). +12190422405790143290 = 97523379246321146323 bsl -3. +780187033970569170584 = 97523379246321146323 bsr -3. +26473395236717784918939914261 = 26473395236717784918939914226 + 35. +26473395236717784918939914191 = 26473395236717784918939914226 - 35. +926568833285122472162896997910 = 26473395236717784918939914226 * 35. +-26473395236717784918939914226 = -(26473395236717784918939914226). +26473395236717784918939914226 = +(26473395236717784918939914226). +756382721049079569112568977 = 26473395236717784918939914226 div 35. +31 = 26473395236717784918939914226 rem 35. +34 = 26473395236717784918939914226 band 35. +26473395236717784918939914227 = 26473395236717784918939914226 bor 35. +26473395236717784918939914193 = 26473395236717784918939914226 bxor 35. +-26473395236717784918939914227 = bnot(26473395236717784918939914226). +27462941423975092133770269895553664313413731473513731049365080553912333227837462701951873909017702412472899040824845665565845174978755925962484247416291407045000410969434175858998730926298219165286384212639744 = 26473395236717784918939914226 bsl 598. +0 = 26473395236717784918939914226 bsr 598. +44253593145128125682376644835 = -5238646474973384 + 44253593145133364328851618219. +-44253593145138602975326591603 = -5238646474973384 - 44253593145133364328851618219. +-231828929734659208811078400956033413354483096 = -5238646474973384 * 44253593145133364328851618219. +5238646474973384 = -(-5238646474973384). +-5238646474973384 = +(-5238646474973384). +0 = -5238646474973384 div 44253593145133364328851618219. +-5238646474973384 = -5238646474973384 rem 44253593145133364328851618219. +44253593145132800824777382184 = -5238646474973384 band 44253593145133364328851618219. +-4675142400737349 = -5238646474973384 bor 44253593145133364328851618219. +-44253593145137475967178119533 = -5238646474973384 bxor 44253593145133364328851618219. +5238646474973383 = bnot(-5238646474973384). +-2879976356520494944057556992 = -5238646474973384 bsl 39. +-9530 = -5238646474973384 bsr 39. +-61074776157 = -61599175326 + 524399169. +-62123574495 = -61599175326 - 524399169. +-32302556352039704094 = -61599175326 * 524399169. +61599175326 = -(-61599175326). +-61599175326 = +(-61599175326). +-117 = -61599175326 div 524399169. +-244472553 = -61599175326 rem 524399169. +138485824 = -61599175326 band 524399169. +-61213261981 = -61599175326 bor 524399169. +-61351747805 = -61599175326 bxor 524399169. +61599175325 = bnot(-61599175326). +-230 = -61599175326 bsl -28. +-16535402717858758656 = -61599175326 bsr -28. +46569222308238723841 = 97243965961854867 + 46471978342276868974. +-46374734376315014107 = 97243965961854867 - 46471978342276868974. +4519119480096428414454840194163196458 = 97243965961854867 * 46471978342276868974. +-97243965961854867 = -(97243965961854867). +97243965961854867 = +(97243965961854867). +0 = 97243965961854867 div 46471978342276868974. +97243965961854867 = 97243965961854867 rem 46471978342276868974. +20585147107904258 = 97243965961854867 band 46471978342276868974. +46548637161130819583 = 97243965961854867 bor 46471978342276868974. +46528052014022915325 = 97243965961854867 bxor 46471978342276868974. +-97243965961854868 = bnot(97243965961854867). +6077747872615929 = 97243965961854867 bsl -4. +1555903455389677872 = 97243965961854867 bsr -4. +-9443337600386540895 = -62221842737 + -9443337538164698158. +9443337475942855421 = -62221842737 - -9443337538164698158. +587581863212092584392149578446 = -62221842737 * -9443337538164698158. +62221842737 = -(-62221842737). +-62221842737 = +(-62221842737). +0 = -62221842737 div -9443337538164698158. +-62221842737 = -62221842737 rem -9443337538164698158. +-9443337582130756926 = -62221842737 band -9443337538164698158. +-18255783969 = -62221842737 bor -9443337538164698158. +9443337563874972957 = -62221842737 bxor -9443337538164698158. +62221842736 = bnot(-62221842737). +-3982197935168 = -62221842737 bsl 6. +-972216293 = -62221842737 bsr 6. +-92946333875615637858065426480 = -41989427184345 + -92946333875615595868638242135. +92946333875615553879211057790 = -41989427184345 - -92946333875615595868638242135. +3902763318321980061088044077940023391376575 = -41989427184345 * -92946333875615595868638242135. +41989427184345 = -(-41989427184345). +-41989427184345 = +(-41989427184345). +0 = -41989427184345 div -92946333875615595868638242135. +-41989427184345 = -41989427184345 rem -92946333875615595868638242135. +-92946333875615596006624552927 = -41989427184345 band -92946333875615595868638242135. +-41851440873553 = -41989427184345 bor -92946333875615595868638242135. +92946333875615554155183679374 = -41989427184345 bxor -92946333875615595868638242135. +41989427184344 = bnot(-41989427184345). +-78212 = -41989427184345 bsl -29. +-22542902066816892272640 = -41989427184345 bsr -29. +73412760701 = 73412756377 + 4324. +73412752053 = 73412756377 - 4324. +317436758574148 = 73412756377 * 4324. +-73412756377 = -(73412756377). +73412756377 = +(73412756377). +16977973 = 73412756377 div 4324. +1125 = 73412756377 rem 4324. +128 = 73412756377 band 4324. +73412760573 = 73412756377 bor 4324. +73412760445 = 73412756377 bxor 4324. +-73412756378 = bnot(73412756377). +4588297273 = 73412756377 bsl -4. +1174604102032 = 73412756377 bsr -4. +8615882880057551270 = 4665767863572685 + 8611217112193978585. +-8606551344330405900 = 4665767863572685 - 8611217112193978585. +40177940068321845575900022480950725 = 4665767863572685 * 8611217112193978585. +-4665767863572685 = -(4665767863572685). +4665767863572685 = +(4665767863572685). +0 = 4665767863572685 div 8611217112193978585. +4665767863572685 = 4665767863572685 rem 8611217112193978585. +17955648983241 = 4665767863572685 band 8611217112193978585. +8615864924408568029 = 4665767863572685 bor 8611217112193978585. +8615846968759584788 = 4665767863572685 bxor 8611217112193978585. +-4665767863572686 = bnot(4665767863572685). +0 = 4665767863572685 bsl -93. +46207526818621075710052698991316946145771520 = 4665767863572685 bsr -93. +-39467433864158659742658 = -39467433864217874379444 + 59214636786. +-39467433864277089016230 = -39467433864217874379444 - 59214636786. +-2337049761145137873347751604626984 = -39467433864217874379444 * 59214636786. +39467433864217874379444 = -(-39467433864217874379444). +-39467433864217874379444 = +(-39467433864217874379444). +-666514834952 = -39467433864217874379444 div 59214636786. +-54456635172 = -39467433864217874379444 rem 59214636786. +40953447488 = -39467433864217874379444 band 59214636786. +-39467433864199613190146 = -39467433864217874379444 bor 59214636786. +-39467433864240566637634 = -39467433864217874379444 bxor 59214636786. +39467433864217874379443 = bnot(-39467433864217874379444). +-335402457668306942374505095499667157298433588811630592532361265952607363769192115735984351204439323261922619019955576664690066828623553597851655044917278817794907884804757365885534387240588638854958716813312 = -39467433864217874379444 bsl 611. +-1 = -39467433864217874379444 bsr 611. +6126905 = 6126912 + -7. +6126919 = 6126912 - -7. +-42888384 = 6126912 * -7. +-6126912 = -(6126912). +6126912 = +(6126912). +-875273 = 6126912 div -7. +1 = 6126912 rem -7. +6126912 = 6126912 band -7. +-7 = 6126912 bor -7. +-6126919 = 6126912 bxor -7. +-6126913 = bnot(6126912). +0 = 6126912 bsl -32. +26314886665469952 = 6126912 bsr -32. +-7154169647745 = -7154169647741 + -4. +-7154169647737 = -7154169647741 - -4. +28616678590964 = -7154169647741 * -4. +7154169647741 = -(-7154169647741). +-7154169647741 = +(-7154169647741). +1788542411935 = -7154169647741 div -4. +-1 = -7154169647741 rem -4. +-7154169647744 = -7154169647741 band -4. +-1 = -7154169647741 bor -4. +7154169647743 = -7154169647741 bxor -4. +7154169647740 = bnot(-7154169647741). +-1 = -7154169647741 bsl -244. +-202245178288604698038496862819314736706844432058191949633859085890283884187663525216256 = -7154169647741 bsr -244. +3690966049 = 4242728246 + -551762197. +4794490443 = 4242728246 - -551762197. +-2340977058286916462 = 4242728246 * -551762197. +-4242728246 = -(4242728246). +4242728246 = +(4242728246). +-7 = 4242728246 div -551762197. +380392867 = 4242728246 rem -551762197. +3691037730 = 4242728246 band -551762197. +-71681 = 4242728246 bor -551762197. +-3691109411 = 4242728246 bxor -551762197. +-4242728247 = bnot(4242728246). +1086138430976 = 4242728246 bsl 8. +16573157 = 4242728246 bsr 8. +-28899446413897218455215387171 = -328252375 + -28899446413897218454887134796. +28899446413897218454558882421 = -328252375 - -28899446413897218454887134796. +9486311921546994963710532353732140500 = -328252375 * -28899446413897218454887134796. +328252375 = -(-328252375). +-328252375 = +(-328252375). +0 = -328252375 div -28899446413897218454887134796. +-328252375 = -328252375 rem -28899446413897218454887134796. +-28899446413897218455156621280 = -328252375 band -28899446413897218454887134796. +-58765891 = -328252375 bor -28899446413897218454887134796. +28899446413897218455097855389 = -328252375 bxor -28899446413897218454887134796. +328252374 = bnot(-328252375). +-41031547 = -328252375 bsl -3. +-2626019000 = -328252375 bsr -3. +3625286175567416254712 = 85876386829 + 3625286175481539867883. +-3625286175395663481054 = 85876386829 - 3625286175481539867883. +311326477971478693042906061313007 = 85876386829 * 3625286175481539867883. +-85876386829 = -(85876386829). +85876386829 = +(85876386829). +0 = 85876386829 div 3625286175481539867883. +85876386829 = 85876386829 rem 3625286175481539867883. +12190753801 = 85876386829 band 3625286175481539867883. +3625286175555225500911 = 85876386829 bor 3625286175481539867883. +3625286175543034747110 = 85876386829 bxor 3625286175481539867883. +-85876386830 = bnot(85876386829). +0 = 85876386829 bsl -43. +755376686959001895698432 = 85876386829 bsr -43. +89427374879114797914 = 486913296 + 89427374878627884618. +-89427374878140971322 = 486913296 - 89427374878627884618. +43543377854780303256858080928 = 486913296 * 89427374878627884618. +-486913296 = -(486913296). +486913296 = +(486913296). +0 = 486913296 div 89427374878627884618. +486913296 = 486913296 rem 89427374878627884618. +67380224 = 486913296 band 89427374878627884618. +89427374879047417690 = 486913296 bor 89427374878627884618. +89427374878980037466 = 486913296 bxor 89427374878627884618. +-486913297 = bnot(486913296). +0 = 486913296 bsl -676. +152661210848739746084796801219929303017091608483351569718679717829647832381127607004270259131421098930744261831142132636907808415233236106921022961095308743313013280041597545067006268505764100610866637431694688256 = 486913296 bsr -676. +-6999135574145138500199069 = -6999135574144648672339887 + -489827859182. +-6999135574144158844480705 = -6999135574144648672339887 - -489827859182. +3428371594407851689973765427877792434 = -6999135574144648672339887 * -489827859182. +6999135574144648672339887 = -(-6999135574144648672339887). +-6999135574144648672339887 = +(-6999135574144648672339887). +14288969977806 = -6999135574144648672339887 div -489827859182. +-65639025195 = -6999135574144648672339887 rem -489827859182. +-6999135574144648806662128 = -6999135574144648672339887 band -489827859182. +-489693536941 = -6999135574144648672339887 bor -489827859182. +6999135574144159113125187 = -6999135574144648672339887 bxor -489827859182. +6999135574144648672339886 = bnot(-6999135574144648672339887). +-1970081522727088896154641004058086735872 = -6999135574144648672339887 bsl 48. +-24865924695 = -6999135574144648672339887 bsr 48. +28133112160341859011 = 8294987549896678 + 28124817172791962333. +-28116522185242065655 = 8294987549896678 - 28124817172791962333. +233295008291429613932376743017829774 = 8294987549896678 * 28124817172791962333. +-8294987549896678 = -(8294987549896678). +8294987549896678 = +(8294987549896678). +0 = 8294987549896678 div 28124817172791962333. +8294987549896678 = 8294987549896678 rem 28124817172791962333. +3773748453976772 = 8294987549896678 band 28124817172791962333. +28129338411887882239 = 8294987549896678 bor 28124817172791962333. +28125564663433905467 = 8294987549896678 bxor 28124817172791962333. +-8294987549896679 = bnot(8294987549896678). +1263082162412447579800888840669276340899121737001091513533517862335233925901939815520623946825386759209517435329525794796703333180486616796703609541310798284672613427814355760158969931165101163017718864257813588701421019625991708955623833787170994552942292643771145249627718231570271772775626465609777152 = 8294987549896678 bsl 954. +0 = 8294987549896678 bsr 954. +-779237291937111325192769 = -779237253649537953318198 + -38287573371874571. +-779237215361964581443627 = -779237253649537953318198 - -38287573371874571. +29835103523204720212081208891876907743058 = -779237253649537953318198 * -38287573371874571. +779237253649537953318198 = -(-779237253649537953318198). +-779237253649537953318198 = +(-779237253649537953318198). +20352223 = -779237253649537953318198 div -38287573371874571. +-22256284756296865 = -779237253649537953318198 rem -38287573371874571. +-779237291934568402545984 = -779237253649537953318198 band -38287573371874571. +-2542922646785 = -779237253649537953318198 bor -38287573371874571. +779237291932025479899199 = -779237253649537953318198 bxor -38287573371874571. +779237253649537953318197 = bnot(-779237253649537953318198). +-6087791044137015260299 = -779237253649537953318198 bsl -7. +-99742368467140858024729344 = -779237253649537953318198 bsr -7. +-298617752514520 = 3 + -298617752514523. +298617752514526 = 3 - -298617752514523. +-895853257543569 = 3 * -298617752514523. +-3 = -(3). +3 = +(3). +0 = 3 div -298617752514523. +3 = 3 rem -298617752514523. +1 = 3 band -298617752514523. +-298617752514521 = 3 bor -298617752514523. +-298617752514522 = 3 bxor -298617752514523. +-4 = bnot(3). +0 = 3 bsl -9. +1536 = 3 bsr -9. +-133 = -47 + -86. +39 = -47 - -86. +4042 = -47 * -86. +47 = -(-47). +-47 = +(-47). +0 = -47 div -86. +-47 = -47 rem -86. +-128 = -47 band -86. +-5 = -47 bor -86. +123 = -47 bxor -86. +46 = bnot(-47). +-1 = -47 bsl -74. +-887804898779493300174848 = -47 bsr -74. +-509981125680411160658784391928 = -826657747793126416252762779123 + 316676622112715255593978387195. +-1143334369905841671846741166318 = -826657747793126416252762779123 - 316676622112715255593978387195. +-261783183214432167649135582111582362841923892371405556529985 = -826657747793126416252762779123 * 316676622112715255593978387195. +826657747793126416252762779123 = -(-826657747793126416252762779123). +-826657747793126416252762779123 = +(-826657747793126416252762779123). +-2 = -826657747793126416252762779123 div 316676622112715255593978387195. +-193304503567695905064806004733 = -826657747793126416252762779123 rem 316676622112715255593978387195. +123847801736915507221384729097 = -826657747793126416252762779123 band 316676622112715255593978387195. +-633828927417326667880169121025 = -826657747793126416252762779123 bor 316676622112715255593978387195. +-757676729154242175101553850122 = -826657747793126416252762779123 bxor 316676622112715255593978387195. +826657747793126416252762779122 = bnot(-826657747793126416252762779123). +-1 = -826657747793126416252762779123 bsl -736. +-298815106411787030647290347359184362814657491801384110694109341430405716236858687575876812387232946571630146667000682675592981845434535225432344189083261459357626833404822948698396070901561854958883208841441498296598547928675344224375690492086507798528 = -826657747793126416252762779123 bsr -736. +-64584896933529 = -64584813557954 + -83375575. +-64584730182379 = -64584813557954 - -83375575. +5384795966662210573550 = -64584813557954 * -83375575. +64584813557954 = -(-64584813557954). +-64584813557954 = +(-64584813557954). +774625 = -64584813557954 div -83375575. +-8773579 = -64584813557954 rem -83375575. +-64584882765272 = -64584813557954 band -83375575. +-14168257 = -64584813557954 bor -83375575. +64584868597015 = -64584813557954 bxor -83375575. +64584813557953 = bnot(-64584813557954). +-4133428067709056 = -64584813557954 bsl 6. +-1009137711844 = -64584813557954 bsr 6. +5445452782307633783919491483 = 5445459651994218436231385824 + -6869686584652311894341. +5445466521680803088543280165 = 5445459651994218436231385824 - -6869686584652311894341. +-37408601118570129338094041961378427211853093221984 = 5445459651994218436231385824 * -6869686584652311894341. +-5445459651994218436231385824 = -(5445459651994218436231385824). +5445459651994218436231385824 = +(5445459651994218436231385824). +-792679 = 5445459651994218436231385824 div -6869686584652311894341. +3359758608496137056285 = 5445459651994218436231385824 rem -6869686584652311894341. +5445457804436360510423843488 = 5445459651994218436231385824 band -6869686584652311894341. +-5022128726726504352005 = 5445459651994218436231385824 bor -6869686584652311894341. +-5445462826565087236928195493 = 5445459651994218436231385824 bxor -6869686584652311894341. +-5445459651994218436231385825 = bnot(5445459651994218436231385824). +424541713960740958963994971066282255333546899910452547992056400302574875373415528379911049066750750745702499309271450700245418359668606110820892628974614398415116198945474660651745336645526790587577936231743543715623590567622817663647964067135091598708138221633309269545040067703054877683963344265271410827531273633792 = 5445459651994218436231385824 bsl 963. +0 = 5445459651994218436231385824 bsr 963. +-56292853672347789967622755530 = -2348 + -56292853672347789967622753182. +56292853672347789967622750834 = -2348 - -56292853672347789967622753182. +132175620422672610843978224471336 = -2348 * -56292853672347789967622753182. +2348 = -(-2348). +-2348 = +(-2348). +0 = -2348 div -56292853672347789967622753182. +-2348 = -2348 rem -56292853672347789967622753182. +-56292853672347789967622753216 = -2348 band -56292853672347789967622753182. +-2314 = -2348 bor -56292853672347789967622753182. +56292853672347789967622750902 = -2348 bxor -56292853672347789967622753182. +2347 = bnot(-2348). +-161353331376128 = -2348 bsl 36. +-1 = -2348 bsr 36. +81677755761110325989 = 81677755761141741122 + -31415133. +81677755761173156255 = 81677755761141741122 - -31415133. +-2565917560377784029199199226 = 81677755761141741122 * -31415133. +-81677755761141741122 = -(81677755761141741122). +81677755761141741122 = +(81677755761141741122). +-2599949386212 = 81677755761141741122 div -31415133. +23394926 = 81677755761141741122 rem -31415133. +81677755761110852610 = 81677755761141741122 band -31415133. +-526621 = 81677755761141741122 bor -31415133. +-81677755761111379231 = 81677755761141741122 bxor -31415133. +-81677755761141741123 = bnot(81677755761141741122). +0 = 81677755761141741122 bsl -441. +463801217193409525842586227224346187120848525564428471008166082428333282429928854270435247339902105628804687447690604120298658543401340136044500661305344 = 81677755761141741122 bsr -441. +3686559983349955873379 = 3686559983349881939528 + 73933851. +3686559983349808005677 = 3686559983349881939528 - 73933851. +272561576511552652184654162328 = 3686559983349881939528 * 73933851. +-3686559983349881939528 = -(3686559983349881939528). +3686559983349881939528 = +(3686559983349881939528). +49862950914728 = 3686559983349881939528 div 73933851. +68282000 = 3686559983349881939528 rem 73933851. +2106376 = 3686559983349881939528 band 73933851. +3686559983349953767003 = 3686559983349881939528 bor 73933851. +3686559983349951660627 = 3686559983349881939528 bxor 73933851. +-3686559983349881939529 = bnot(3686559983349881939528). +2423975815203786007743325477570123552079224796171620812901156999316537218240556378219798115949609720528071885440199041531037808941745592396171939222230680705206120186559996389841922298304117353704995561336328522084056218553932578816 = 3686559983349881939528 bsl 697. +0 = 3686559983349881939528 bsr 697. +57484957125928146 = -7693579689369341 + 65178536815297487. +-72872116504666828 = -7693579689369341 - 65178536815297487. +-501456267024984596441840332146067 = -7693579689369341 * 65178536815297487. +7693579689369341 = -(-7693579689369341). +-7693579689369341 = +(-7693579689369341). +0 = -7693579689369341 div 65178536815297487. +-7693579689369341 = -7693579689369341 rem 65178536815297487. +64328614120784131 = -7693579689369341 band 65178536815297487. +-6843656994855985 = -7693579689369341 bor 65178536815297487. +-71172271115640116 = -7693579689369341 bxor 65178536815297487. +7693579689369340 = bnot(-7693579689369341). +-1102825898098619242482183019680173987957272873402146047893375711191417365700739748008122193597413717796130157914356711424 = -7693579689369341 bsl 346. +-1 = -7693579689369341 bsr 346. +-519158957389930531939580311985 = -519158957389938888268468295316 + 8356328887983331. +-519158957389947244597356278647 = -519158957389938888268468295316 - 8356328887983331. +-4338262993092853551931673024332658790593377596 = -519158957389938888268468295316 * 8356328887983331. +519158957389938888268468295316 = -(-519158957389938888268468295316). +-519158957389938888268468295316 = +(-519158957389938888268468295316). +-62127635753603 = -519158957389938888268468295316 div 8356328887983331. +-94845381103723 = -519158957389938888268468295316 rem 8356328887983331. +8356293808359520 = -519158957389938888268468295316 band 8356328887983331. +-519158957389938888233388671505 = -519158957389938888268468295316 bor 8356328887983331. +-519158957389947244527197031025 = -519158957389938888268468295316 bxor 8356328887983331. +519158957389938888268468295315 = bnot(-519158957389938888268468295316). +-4055929354608897564597408558 = -519158957389938888268468295316 bsl -7. +-66452346545912177698363941800448 = -519158957389938888268468295316 bsr -7. +-28977693743494607236553 = 327952916 + -28977693743494935189469. +28977693743495263142385 = 327952916 - -28977693743494935189469. +-9503319162134120026617371041604 = 327952916 * -28977693743494935189469. +-327952916 = -(327952916). +327952916 = +(327952916). +0 = 327952916 div -28977693743494935189469. +327952916 = 327952916 rem -28977693743494935189469. +285222912 = 327952916 band -28977693743494935189469. +-28977693743494892459465 = 327952916 bor -28977693743494935189469. +-28977693743495177682377 = 327952916 bxor -28977693743494935189469. +-327952917 = bnot(327952916). +0 = 327952916 bsl -829. +1174026506388461224997001534527826734857654163263098943331637410142530672452265566015726828228263252542300150382587480100197773428316022689359675598503380136107671318105408084540110960461813695296459050154533107209859133108602988474181342077223930952671035392 = 327952916 bsr -829. +-2695050304640900494 = -3466487676266667 + -2691583816964633827. +2688117329288367160 = -3466487676266667 - -2691583816964633827. +9330342131146699470866724060744609 = -3466487676266667 * -2691583816964633827. +3466487676266667 = -(-3466487676266667). +-3466487676266667 = +(-3466487676266667). +0 = -3466487676266667 div -2691583816964633827. +-3466487676266667 = -3466487676266667 rem -2691583816964633827. +-2692728133733317867 = -3466487676266667 band -2691583816964633827. +-2322170907582627 = -3466487676266667 bor -2691583816964633827. +2690405962825735240 = -3466487676266667 bxor -2691583816964633827. +3466487676266666 = bnot(-3466487676266667). +-1 = -3466487676266667 bsl -996. +-2321482113640535431413620257407215827129049952400819330081663821876398892083620880412644946852926812279497835369537647617146819081816303894972183011212579895044715021815984947621783999582159904772883937113585197454877221630252530865836836630100784077944139096919685291647777681531880061996596278375284733806077018112 = -3466487676266667 bsr -996. +-22437719121122816933 = -23285647816458958477 + 847928695336141544. +-24133576511795100021 = -23285647816458958477 - 847928695336141544. +-19744568973066917792526540430090668488 = -23285647816458958477 * 847928695336141544. +23285647816458958477 = -(-23285647816458958477). +-23285647816458958477 = +(-23285647816458958477). +-27 = -23285647816458958477 div 847928695336141544. +-391573042383136789 = -23285647816458958477 rem 847928695336141544. +630577232458088544 = -23285647816458958477 band 847928695336141544. +-23068296353580905477 = -23285647816458958477 bor 847928695336141544. +-23698873586038994021 = -23285647816458958477 bxor 847928695336141544. +23285647816458958476 = bnot(-23285647816458958477). +-38817258929776399754088580725456443760777990968496296036332720682810882753979348016638665186177153265633575379988311077403580431663080426551349837729969580718177343869422008191109185431721874421090512735255464683562656344729123003655067404229022059383475929088 = -23285647816458958477 bsl 798. +-1 = -23285647816458958477 bsr 798. +-989442199970150700183057 = -989442199876381553248442 + -93769146934615. +-989442199782612406313827 = -989442199876381553248442 - -93769146934615. +92779151023517125455724277559824619830 = -989442199876381553248442 * -93769146934615. +989442199876381553248442 = -(-989442199876381553248442). +-989442199876381553248442 = +(-989442199876381553248442). +10551895076 = -989442199876381553248442 div -93769146934615. +-56297040792702 = -989442199876381553248442 rem -93769146934615. +-989442199899747529125376 = -989442199876381553248442 band -93769146934615. +-70403171057681 = -989442199876381553248442 bor -93769146934615. +989442199829344358067695 = -989442199876381553248442 bxor -93769146934615. +989442199876381553248441 = bnot(-989442199876381553248442). +-3957768799505526212993768 = -989442199876381553248442 bsl 2. +-247360549969095388312111 = -989442199876381553248442 bsr 2. +-454565619835185753747499735 = 23857 + -454565619835185753747523592. +454565619835185753747547449 = 23857 - -454565619835185753747523592. +-10844571992408026527154670334344 = 23857 * -454565619835185753747523592. +-23857 = -(23857). +23857 = +(23857). +0 = 23857 div -454565619835185753747523592. +23857 = 23857 rem -454565619835185753747523592. +21808 = 23857 band -454565619835185753747523592. +-454565619835185753747521543 = 23857 bor -454565619835185753747523592. +-454565619835185753747543351 = 23857 bxor -454565619835185753747523592. +-23858 = bnot(23857). +381712 = 23857 bsl 4. +1491 = 23857 bsr 4. +4424861271793435821209060 = -895284491 + 4424861271793436716493551. +-4424861271793437611778042 = -895284491 - 4424861271793436716493551. +-3961509671463199647866640111817541 = -895284491 * 4424861271793436716493551. +895284491 = -(-895284491). +-895284491 = +(-895284491). +0 = -895284491 div 4424861271793436716493551. +-895284491 = -895284491 rem 4424861271793436716493551. +4424861271793436714863333 = -895284491 band 4424861271793436716493551. +-893654273 = -895284491 bor 4424861271793436716493551. +-4424861271793437608517606 = -895284491 bxor 4424861271793436716493551. +895284490 = bnot(-895284491). +-20335232416252554641923252366849810142015369362484154992319414677966476941037681564548311931469593765231637616504453672554373676561313854128128 = -895284491 bsl 443. +-1 = -895284491 bsr 443. +-479897902363968905109082 = -479897986781358672282469 + 84417389767173387. +-479898071198748439455856 = -479897986781358672282469 - 84417389767173387. +-40511735398603776920128864530205763452503 = -479897986781358672282469 * 84417389767173387. +479897986781358672282469 = -(-479897986781358672282469). +-479897986781358672282469 = +(-479897986781358672282469). +-5684823 = -479897986781358672282469 div 84417389767173387. +-67832966756876968 = -479897986781358672282469 rem 84417389767173387. +72594190081467403 = -479897986781358672282469 band 84417389767173387. +-479897974958158986576485 = -479897986781358672282469 bor 84417389767173387. +-479898047552349068043888 = -479897986781358672282469 bxor 84417389767173387. +479897986781358672282468 = bnot(-479897986781358672282469). +-1 = -479897986781358672282469 bsl -554. +-28298702654068005841545709516918834456567407751897587427005307095333461302591905673285423371447222444481771769836293532214420357015734577061387734681527826892801158705423150865290221632618496 = -479897986781358672282469 bsr -554. +-63589298 = -63688694 + 99396. +-63788090 = -63688694 - 99396. +-6330401428824 = -63688694 * 99396. +63688694 = -(-63688694). +-63688694 = +(-63688694). +-640 = -63688694 div 99396. +-75254 = -63688694 rem 99396. +0 = -63688694 band 99396. +-63589298 = -63688694 bor 99396. +-63589298 = -63688694 bxor 99396. +63688693 = bnot(-63688694). +-1 = -63688694 bsl -366. +-9572839033616149482117465315062621977561566009507969171174157968312164591652007173476852839438977804043377850519126016 = -63688694 bsr -366. +38915975846452919995301805206 = 463577688 + 38915975846452919994838227518. +-38915975846452919994374649830 = 463577688 - 38915975846452919994838227518. +18040578109162487652056077446812418384 = 463577688 * 38915975846452919994838227518. +-463577688 = -(463577688). +463577688 = +(463577688). +0 = 463577688 div 38915975846452919994838227518. +463577688 = 463577688 rem 38915975846452919994838227518. +444662296 = 463577688 band 38915975846452919994838227518. +38915975846452919994857142910 = 463577688 bor 38915975846452919994838227518. +38915975846452919994412480614 = 463577688 bxor 38915975846452919994838227518. +-463577689 = bnot(463577688). +0 = 463577688 bsl -934. +67319126996976393712644982790218279208550252032390219414949744296596194471837978968081786211424320887982063355469556203181254294641466766425359065272182089051181133983012727913586133826172285933782992420679866256197858058290960678672764073003328205861839447865053537609972137876760236654592 = 463577688 bsr -934. +-138361293209433 = 674896677931891 + -813257971141324. +1488154649073215 = 674896677931891 - -813257971141324. +-548865103024909248965207563684 = 674896677931891 * -813257971141324. +-674896677931891 = -(674896677931891). +674896677931891 = +(674896677931891). +0 = 674896677931891 div -813257971141324. +674896677931891 = 674896677931891 rem -813257971141324. +4743800062256 = 674896677931891 band -813257971141324. +-143105093271689 = 674896677931891 bor -813257971141324. +-147848893333945 = 674896677931891 bxor -813257971141324. +-674896677931892 = bnot(674896677931891). +94983263351489061205990965248 = 674896677931891 bsl 47. +4 = 674896677931891 bsr 47. +627853533456289133315151352 = 627853534329433388814597617 + -873144255499446265. +627853535202577644314043882 = 627853534329433388814597617 - -873144255499446265. +-548206706794769143536531955029983892288550505 = 627853534329433388814597617 * -873144255499446265. +-627853534329433388814597617 = -(627853534329433388814597617). +627853534329433388814597617 = +(627853534329433388814597617). +-719071940 = 627853534329433388814597617 div -873144255499446265. +627590894115293517 = 627853534329433388814597617 rem -873144255499446265. +627853533749023109104031745 = 627853534329433388814597617 band -873144255499446265. +-292733975788880393 = 627853534329433388814597617 bor -873144255499446265. +-627853534041757084892912138 = 627853534329433388814597617 bxor -873144255499446265. +-627853534329433388814597618 = bnot(627853534329433388814597617). +80365252394167473768268494976 = 627853534329433388814597617 bsl 7. +4905105736948698350114043 = 627853534329433388814597617 bsr 7. +-21576635897 = 626 + -21576636523. +21576637149 = 626 - -21576636523. +-13506974463398 = 626 * -21576636523. +-626 = -(626). +626 = +(626). +0 = 626 div -21576636523. +626 = 626 rem -21576636523. +528 = 626 band -21576636523. +-21576636425 = 626 bor -21576636523. +-21576636953 = 626 bxor -21576636523. +-627 = bnot(626). +1126528014153616374255758842324569857460972158422799924928429195382004130200140562727887787800414270630340196022633632138851349820295772642127732201288637029325733888 = 626 bsl 539. +0 = 626 bsr 539. +-327875629828116419647977544 = -327875629828116419647977461 + -83. +-327875629828116419647977378 = -327875629828116419647977461 - -83. +27213677275733662830782129263 = -327875629828116419647977461 * -83. +327875629828116419647977461 = -(-327875629828116419647977461). +-327875629828116419647977461 = +(-327875629828116419647977461). +3950308793109836381300933 = -327875629828116419647977461 div -83. +-22 = -327875629828116419647977461 rem -83. +-327875629828116419647977463 = -327875629828116419647977461 band -83. +-81 = -327875629828116419647977461 bor -83. +327875629828116419647977382 = -327875629828116419647977461 bxor -83. +327875629828116419647977460 = bnot(-327875629828116419647977461). +-10246113432128638113999296 = -327875629828116419647977461 bsl -5. +-10492020154499725428735278752 = -327875629828116419647977461 bsr -5. +9315714251516243906868654 = 9315714251516325428488326 + -81521619672. +9315714251516406950107998 = 9315714251516325428488326 - -81521619672. +-759432114185144030880207746063949072 = 9315714251516325428488326 * -81521619672. +-9315714251516325428488326 = -(9315714251516325428488326). +9315714251516325428488326 = +(9315714251516325428488326). +-114272928935880 = 9315714251516325428488326 div -81521619672. +32393856966 = 9315714251516325428488326 rem -81521619672. +9315714251516323801090048 = 9315714251516325428488326 band -81521619672. +-79894221394 = 9315714251516325428488326 bor -81521619672. +-9315714251516403695311442 = 9315714251516325428488326 bxor -81521619672. +-9315714251516325428488327 = bnot(9315714251516325428488326). +1273487671781282264641552716631249308204448980984801118850118055677058047356019203824800731291141143228184946951674778353664 = 9315714251516325428488326 bsl 326. +0 = 9315714251516325428488326 bsr 326. +59719273612193636529940 = -46 + 59719273612193636529986. +-59719273612193636530032 = -46 - 59719273612193636529986. +-2747086586160907280379356 = -46 * 59719273612193636529986. +46 = -(-46). +-46 = +(-46). +0 = -46 div 59719273612193636529986. +-46 = -46 rem 59719273612193636529986. +59719273612193636529986 = -46 band 59719273612193636529986. +-46 = -46 bor 59719273612193636529986. +-59719273612193636530032 = -46 bxor 59719273612193636529986. +45 = bnot(-46). +-1 = -46 bsl -682. +-923027997860813832599966181230491327725660823554481496951755224384924618139899131077685015368534350419773927945648948725886893781694240485015409391212411953346024661529191785876527911616053943612974127120384 = -46 bsr -682. +8239777107128 = -9584735 + 8239786691863. +-8239796276598 = -9584735 - 8239786691863. +-78976171898033511305 = -9584735 * 8239786691863. +9584735 = -(-9584735). +-9584735 = +(-9584735). +0 = -9584735 div 8239786691863. +-9584735 = -9584735 rem 8239786691863. +8239778172161 = -9584735 band 8239786691863. +-1065033 = -9584735 bor 8239786691863. +-8239779237194 = -9584735 bxor 8239786691863. +9584734 = bnot(-9584735). +-1 = -9584735 bsl -546. +-2207789901237298349168515420337438685802160456150401071122584087718795318977399464587385366042827588336888176608306170711999671293512097614322126374505966913691887641559040 = -9584735 bsr -546. +864214577958738583386 = -999868 + 864214577958739583254. +-864214577958740583122 = -999868 - 864214577958739583254. +-864100501634449029629010472 = -999868 * 864214577958739583254. +999868 = -(-999868). +-999868 = +(-999868). +0 = -999868 div 864214577958739583254. +-999868 = -999868 rem 864214577958739583254. +864214577958738731012 = -999868 band 864214577958739583254. +-147626 = -999868 bor 864214577958739583254. +-864214577958738878638 = -999868 bxor 864214577958739583254. +999867 = bnot(-999868). +-1 = -999868 bsl -44. +-17589863875858137088 = -999868 bsr -44. +742429259336656208630042 = 742429266981345577992641 + -7644689369362599. +742429274626034947355240 = 742429266981345577992641 - -7644689369362599. +-5675641124795959371173671938168082633959 = 742429266981345577992641 * -7644689369362599. +-742429266981345577992641 = -(742429266981345577992641). +742429266981345577992641 = +(742429266981345577992641). +-97116996 = 742429266981345577992641 div -7644689369362599. +75715528360037 = 742429266981345577992641 rem -7644689369362599. +742429262468394699456833 = 742429266981345577992641 band -7644689369362599. +-3131738490826791 = 742429266981345577992641 bor -7644689369362599. +-742429265600133190283624 = 742429266981345577992641 bxor -7644689369362599. +-742429266981345577992642 = bnot(742429266981345577992641). +56096369380706971764952345809247950674566578176 = 742429266981345577992641 bsl 76. +9 = 742429266981345577992641 bsr 76. +-63822114144981621 = -34 + -63822114144981587. +63822114144981553 = -34 - -63822114144981587. +2169951880929373958 = -34 * -63822114144981587. +34 = -(-34). +-34 = +(-34). +0 = -34 div -63822114144981587. +-34 = -34 rem -63822114144981587. +-63822114144981620 = -34 band -63822114144981587. +-1 = -34 bor -63822114144981587. +63822114144981619 = -34 bxor -63822114144981587. +33 = bnot(-34). +-18253611008 = -34 bsl 29. +-1 = -34 bsr 29. +-2686231576924555149905426542 = -2686231576924555149813974296 + -91452246. +-2686231576924555149722522050 = -2686231576924555149813974296 - -91452246. +245661910985872341001354431555468816 = -2686231576924555149813974296 * -91452246. +2686231576924555149813974296 = -(-2686231576924555149813974296). +-2686231576924555149813974296 = +(-2686231576924555149813974296). +29373051996170276122 = -2686231576924555149813974296 div -91452246. +-16904284 = -2686231576924555149813974296 rem -91452246. +-2686231576924555149884258136 = -2686231576924555149813974296 band -91452246. +-21168406 = -2686231576924555149813974296 bor -91452246. +2686231576924555149863089730 = -2686231576924555149813974296 bxor -91452246. +2686231576924555149813974295 = bnot(-2686231576924555149813974296). +-145620906 = -2686231576924555149813974296 bsl -64. +-49552226422244501234349603813943975169109262336 = -2686231576924555149813974296 bsr -64. +-7794906949236057903 = -8239525163563949492 + 444618214327891589. +-8684143377891841081 = -8239525163563949492 - 444618214327891589. +-3663442965133532096405715590047622788 = -8239525163563949492 * 444618214327891589. +8239525163563949492 = -(-8239525163563949492). +-8239525163563949492 = +(-8239525163563949492). +-18 = -8239525163563949492 div 444618214327891589. +-236397305661900890 = -8239525163563949492 rem 444618214327891589. +298101241817375236 = -8239525163563949492 band 444618214327891589. +-8093008191053433139 = -8239525163563949492 bor 444618214327891589. +-8391109432870808375 = -8239525163563949492 bxor 444618214327891589. +8239525163563949491 = bnot(-8239525163563949492). +-1 = -8239525163563949492 bsl -269. +-7815756456038475044314658489534671849000407135891980184024346413048071743431833478349947290521698304 = -8239525163563949492 bsr -269. +-9469201222362472158468 = -9511385564486716393926 + 42184342124244235458. +-9553569906610960629384 = -9511385564486716393926 - 42184342124244235458. +-401231542727905526424290941252210625028108 = -9511385564486716393926 * 42184342124244235458. +9511385564486716393926 = -(-9511385564486716393926). +-9511385564486716393926 = +(-9511385564486716393926). +-225 = -9511385564486716393926 div 42184342124244235458. +-19908586531763415876 = -9511385564486716393926 rem 42184342124244235458. +4683851916089193474 = -9511385564486716393926 band 42184342124244235458. +-9473885074278561351942 = -9511385564486716393926 bor 42184342124244235458. +-9478568926194650545416 = -9511385564486716393926 bxor 42184342124244235458. +9511385564486716393925 = bnot(-9511385564486716393926). +-1 = -9511385564486716393926 bsl -872. +-299502192571225438047488105658859863385967144993669725823404832331225269910529398842051240815323832342514425020449726133790958582625570706749851376388969819379334603895213893319813641128404044517800989825299954131142773830774705719482501075599631003152051945016770640324681096543338496 = -9511385564486716393926 bsr -872. +-82327367158839231346468686 = -82327367158839231414763514 + 68294828. +-82327367158839231483058342 = -82327367158839231414763514 - 68294828. +-5622533379805773989123470849305592 = -82327367158839231414763514 * 68294828. +82327367158839231414763514 = -(-82327367158839231414763514). +-82327367158839231414763514 = +(-82327367158839231414763514). +-1205470012441340820 = -82327367158839231414763514 div 68294828. +-23484554 = -82327367158839231414763514 rem 68294828. +4 = -82327367158839231414763514 band 68294828. +-82327367158839231346468690 = -82327367158839231414763514 bor 68294828. +-82327367158839231346468694 = -82327367158839231414763514 bxor 68294828. +82327367158839231414763513 = bnot(-82327367158839231414763514). +-1 = -82327367158839231414763514 bsl -862. +-2531631490728627937601786650854934811248022860364659715090149968584266679474566383501961515903027741185156659521588388177636000048472950697199597078612943528485007433241218981825673198379847255299771693621571458318840535791756308399134792078730413455274294383363650980665154094975942656 = -82327367158839231414763514 bsr -862. +576646511682247658 = 2852342282936486 + 573794169399311172. +-570941827116374686 = 2852342282936486 - 573794169399311172. +1636657371080076004094657826221592 = 2852342282936486 * 573794169399311172. +-2852342282936486 = -(2852342282936486). +2852342282936486 = +(2852342282936486). +0 = 2852342282936486 div 573794169399311172. +2852342282936486 = 2852342282936486 rem 573794169399311172. +565151124971524 = 2852342282936486 band 573794169399311172. +576081360557276134 = 2852342282936486 bor 573794169399311172. +575516209432304610 = 2852342282936486 bxor 573794169399311172. +-2852342282936487 = bnot(2852342282936486). +802862977660366763796847394816 = 2852342282936486 bsl 48. +10 = 2852342282936486 bsr 48. +-3924188576621262044924576719 = -2961569231199212855 + -3924188573659692813725363864. +3924188570698123582526151009 = -2961569231199212855 - -3924188573659692813725363864. +11621756137174072111357977307746881505261271720 = -2961569231199212855 * -3924188573659692813725363864. +2961569231199212855 = -(-2961569231199212855). +-2961569231199212855 = +(-2961569231199212855). +0 = -2961569231199212855 div -3924188573659692813725363864. +-2961569231199212855 = -2961569231199212855 rem -3924188573659692813725363864. +-3924188576542156021877931960 = -2961569231199212855 band -3924188573659692813725363864. +-79106023046644759 = -2961569231199212855 bor -3924188573659692813725363864. +3924188576463049998831287201 = -2961569231199212855 bxor -3924188573659692813725363864. +2961569231199212854 = bnot(-2961569231199212855). +-5784314904685963 = -2961569231199212855 bsl -9. +-1516323446373996981760 = -2961569231199212855 bsr -9. +-7831461881754721320824764644 = -7831461881754721314434837393 + -6389927251. +-7831461881754721308044910142 = -7831461881754721314434837393 - -6389927251. +50042471693392233425017707121284496643 = -7831461881754721314434837393 * -6389927251. +7831461881754721314434837393 = -(-7831461881754721314434837393). +-7831461881754721314434837393 = +(-7831461881754721314434837393). +1225594842340204494 = -7831461881754721314434837393 div -6389927251. +-5311571399 = -7831461881754721314434837393 rem -6389927251. +-7831461881754721319406006227 = -7831461881754721314434837393 band -6389927251. +-1418758417 = -7831461881754721314434837393 bor -6389927251. +7831461881754721317987247810 = -7831461881754721314434837393 bxor -6389927251. +7831461881754721314434837392 = bnot(-7831461881754721314434837393). +-442783854038468215329094768091161141255478419537582706029054537536642857581179154220410293681154686976 = -7831461881754721314434837393 bsl 245. +-1 = -7831461881754721314434837393 bsr 245. +194621195850105967080077323 = 96387968691682123552961471 + 98233227158423843527115852. +-1845258466741719974154381 = 96387968691682123552961471 - 98233227158423843527115852. +9468501223829055524727701090123235136541605909338292 = 96387968691682123552961471 * 98233227158423843527115852. +-96387968691682123552961471 = -(96387968691682123552961471). +96387968691682123552961471 = +(96387968691682123552961471). +0 = 96387968691682123552961471 div 98233227158423843527115852. +96387968691682123552961471 = 96387968691682123552961471 rem 98233227158423843527115852. +78583429525471920982360076 = 96387968691682123552961471 band 98233227158423843527115852. +116037766324634046097717247 = 96387968691682123552961471 bor 98233227158423843527115852. +37454336799162125115357171 = 96387968691682123552961471 bxor 98233227158423843527115852. +-96387968691682123552961472 = bnot(96387968691682123552961471). +5610518197743345 = 96387968691682123552961471 bsl -34. +1655932693034586511551203367572209664 = 96387968691682123552961471 bsr -34. +-6176529541955489 = -6176529541946177 + -9312. +-6176529541936865 = -6176529541946177 - -9312. +57515843094602800224 = -6176529541946177 * -9312. +6176529541946177 = -(-6176529541946177). +-6176529541946177 = +(-6176529541946177). +663287107167 = -6176529541946177 div -9312. +-7073 = -6176529541946177 rem -9312. +-6176529541955424 = -6176529541946177 band -9312. +-65 = -6176529541946177 bor -9312. +6176529541955359 = -6176529541946177 bxor -9312. +6176529541946176 = bnot(-6176529541946177). +-1 = -6176529541946177 bsl -282. +-47995807212208277884944016617820070836245614453104659072077011457368858099803947103643668713578692608 = -6176529541946177 bsr -282. +-579636899835487569585335692 = -579636899835487569585335765 + 73. +-579636899835487569585335838 = -579636899835487569585335765 - 73. +-42313493687990592579729510845 = -579636899835487569585335765 * 73. +579636899835487569585335765 = -(-579636899835487569585335765). +-579636899835487569585335765 = +(-579636899835487569585335765). +-7940231504595720131305969 = -579636899835487569585335765 div 73. +-28 = -579636899835487569585335765 rem 73. +9 = -579636899835487569585335765 band 73. +-579636899835487569585335701 = -579636899835487569585335765 bor 73. +-579636899835487569585335710 = -579636899835487569585335765 bxor 73. +579636899835487569585335764 = bnot(-579636899835487569585335765). +-1 = -579636899835487569585335765 bsl -938. +-1346765423176583012049052892147042667014251665156490772334510940228576398548649372195525300955339723355712093608524844502210775957221752905511057470718258827159087451739739288214013652339412227414100683885806358080844304086823596559794764688306073651238227667486207613978771789074030450792545845265846931292160 = -579636899835487569585335765 bsr -938. +-37156449122464181194286 = 382447 + -37156449122464181576733. +37156449122464181959180 = 382447 - -37156449122464181576733. +-14210372497539058851476805651 = 382447 * -37156449122464181576733. +-382447 = -(382447). +382447 = +(382447). +0 = 382447 div -37156449122464181576733. +382447 = 382447 rem -37156449122464181576733. +332259 = 382447 band -37156449122464181576733. +-37156449122464181526545 = 382447 bor -37156449122464181576733. +-37156449122464181858804 = 382447 bxor -37156449122464181576733. +-382448 = bnot(382447). +3267607335707377193126915465837706790293842145846939127631744887147137869862514545738527125050530725888 = 382447 bsl 322. +0 = 382447 bsr 322. +-3879793355513634615720575 = -481911 + -3879793355513634615238664. +3879793355513634614756753 = -481911 - -3879793355513634615238664. +1869715095748931171064279806904 = -481911 * -3879793355513634615238664. +481911 = -(-481911). +-481911 = +(-481911). +0 = -481911 div -3879793355513634615238664. +-481911 = -481911 rem -3879793355513634615238664. +-3879793355513634615720568 = -481911 band -3879793355513634615238664. +-7 = -481911 bor -3879793355513634615238664. +3879793355513634615720561 = -481911 bxor -3879793355513634615238664. +481910 = bnot(-481911). +-1 = -481911 bsl -92. +-2386307689088227574627647415648256 = -481911 bsr -92. +-685793482466922729770089 = 43851784289 + -685793482466966581554378. +685793482467010433338667 = 43851784289 - -685793482466966581554378. +-30073267859943522102494310379567242 = 43851784289 * -685793482466966581554378. +-43851784289 = -(43851784289). +43851784289 = +(43851784289). +0 = 43851784289 div -685793482466966581554378. +43851784289 = 43851784289 rem -685793482466966581554378. +9127133216 = 43851784289 band -685793482466966581554378. +-685793482466931856903305 = 43851784289 bor -685793482466966581554378. +-685793482466940984036521 = 43851784289 bxor -685793482466966581554378. +-43851784290 = bnot(43851784289). +0 = 43851784289 bsl -741. +507240656676445006921350498546236949549885605308873515813999060954631952492340984108575825868855107686850300348339344660908756789690404717943725680905979044051237707408360970203848608972443834876606623368978764950416702005167708438528 = 43851784289 bsr -741. +-64297936826539773755448431895 = 2395351967 + -64297936826539773757843783862. +64297936826539773760239135829 = 2395351967 - -64297936826539773757843783862. +-154016189451493784874586089352564556554 = 2395351967 * -64297936826539773757843783862. +-2395351967 = -(2395351967). +2395351967 = +(2395351967). +0 = 2395351967 div -64297936826539773757843783862. +2395351967 = 2395351967 rem -64297936826539773757843783862. +2361666314 = 2395351967 band -64297936826539773757843783862. +-64297936826539773757810098209 = 2395351967 bor -64297936826539773757843783862. +-64297936826539773760171764523 = 2395351967 bxor -64297936826539773757843783862. +-2395351968 = bnot(2395351967). +379558669840677493225295095876575821824 = 2395351967 bsl 97. +0 = 2395351967 bsr 97. +770813703325541 = 836295641311454 + -65481937985913. +901777579297367 = 836295641311454 - -65481937985913. +-54762259322245972818697547502 = 836295641311454 * -65481937985913. +-836295641311454 = -(836295641311454). +836295641311454 = +(836295641311454). +-12 = 836295641311454 div -65481937985913. +50512385480498 = 836295641311454 rem -65481937985913. +774130274175110 = 836295641311454 band -65481937985913. +-3316570849569 = 836295641311454 bor -65481937985913. +-777446845024679 = 836295641311454 bxor -65481937985913. +-836295641311455 = bnot(836295641311454). +0 = 836295641311454 bsl -782. +21272397638013034718728490721075051503817452457058679878289406207574916622366800339593607966879094691976196311442781198819613867431211340106115654351939124120269224915055093698208503418889470534301291559958922191784577789792542951420477967228643311616 = 836295641311454 bsr -782. +315 = -77 + 392. +-469 = -77 - 392. +-30184 = -77 * 392. +77 = -(-77). +-77 = +(-77). +0 = -77 div 392. +-77 = -77 rem 392. +384 = -77 band 392. +-69 = -77 bor 392. +-453 = -77 bxor 392. +76 = bnot(-77). +-41339060224 = -77 bsl 29. +-1 = -77 bsr 29. +-726958148793677870 = -726958148793677877 + 7. +-726958148793677884 = -726958148793677877 - 7. +-5088707041555745139 = -726958148793677877 * 7. +726958148793677877 = -(-726958148793677877). +-726958148793677877 = +(-726958148793677877). +-103851164113382553 = -726958148793677877 div 7. +-6 = -726958148793677877 rem 7. +3 = -726958148793677877 band 7. +-726958148793677873 = -726958148793677877 bor 7. +-726958148793677876 = -726958148793677877 bxor 7. +726958148793677876 = bnot(-726958148793677877). +-2839680268725305 = -726958148793677877 bsl -8. +-186101286091181536512 = -726958148793677877 bsr -8. +-27391664628842574182975932 = -31724496561664731869374853 + 4332831932822157686398921. +-36057328494486889555773774 = -31724496561664731869374853 - 4332831932822157686398921. +-137456911755087696017154216110617535911133043733613 = -31724496561664731869374853 * 4332831932822157686398921. +31724496561664731869374853 = -(-31724496561664731869374853). +-31724496561664731869374853 = +(-31724496561664731869374853). +-7 = -31724496561664731869374853 div 4332831932822157686398921. +-1394673031909628064582406 = -31724496561664731869374853 rem 4332831932822157686398921. +1813444657374202021451337 = -31724496561664731869374853 band 4332831932822157686398921. +-29205109286216776204427269 = -31724496561664731869374853 bor 4332831932822157686398921. +-31018553943590978225878606 = -31724496561664731869374853 bxor 4332831932822157686398921. +31724496561664731869374852 = bnot(-31724496561664731869374853). +-2454564032491009351568915678640966559254341004296192 = -31724496561664731869374853 bsl 86. +-1 = -31724496561664731869374853 bsr 86. +2275149 = -6 + 2275155. +-2275161 = -6 - 2275155. +-13650930 = -6 * 2275155. +6 = -(-6). +-6 = +(-6). +0 = -6 div 2275155. +-6 = -6 rem 2275155. +2275154 = -6 band 2275155. +-5 = -6 bor 2275155. +-2275159 = -6 bxor 2275155. +5 = bnot(-6). +-1325135298583788247187473125557188886870612922656714218591204650969464832 = -6 bsl 237. +-1 = -6 bsr 237. +-297695611366842322174181901 = -6 + -297695611366842322174181895. +297695611366842322174181889 = -6 - -297695611366842322174181895. +1786173668201053933045091370 = -6 * -297695611366842322174181895. +6 = -(-6). +-6 = +(-6). +0 = -6 div -297695611366842322174181895. +-6 = -6 rem -297695611366842322174181895. +-297695611366842322174181896 = -6 band -297695611366842322174181895. +-5 = -6 bor -297695611366842322174181895. +297695611366842322174181891 = -6 bxor -297695611366842322174181895. +5 = bnot(-6). +-1 = -6 bsl -398. +-3873374817130362884483878758004517811494558689243835269245989034810971433025261791944468029920206747153854757959121240064 = -6 bsr -398. +4526392995126238 = 4526392995561573 + -435335. +4526392995996908 = 4526392995561573 - -435335. +-1970497294722797381955 = 4526392995561573 * -435335. +-4526392995561573 = -(4526392995561573). +4526392995561573 = +(4526392995561573). +-10397493873 = 4526392995561573 div -435335. +359118 = 4526392995561573 rem -435335. +4526392995299425 = 4526392995561573 band -435335. +-173187 = 4526392995561573 bor -435335. +-4526392995472612 = 4526392995561573 bxor -435335. +-4526392995561574 = bnot(4526392995561573). +9492534123427943940096 = 4526392995561573 bsl 21. +2158352372 = 4526392995561573 bsr 21. +7887314996470303626382 = 7887373824819569326219 + -58828349265699837. +7887432653168835026056 = 7887373824819569326219 - -58828349265699837. +-464001182155624425965132306817588126303 = 7887373824819569326219 * -58828349265699837. +-7887373824819569326219 = -(7887373824819569326219). +7887373824819569326219 = +(7887373824819569326219). +-134074 = 7887373824819569326219 div -58828349265699837. +21725370129380281 = 7887373824819569326219 rem -58828349265699837. +7887355810341930080259 = 7887373824819569326219 band -58828349265699837. +-40813871626453877 = 7887373824819569326219 bor -58828349265699837. +-7887396624213556534136 = 7887373824819569326219 bxor -58828349265699837. +-7887373824819569326220 = bnot(7887373824819569326219). +985921728102446165777 = 7887373824819569326219 bsl -3. +63098990598556554609752 = 7887373824819569326219 bsr -3. +-39829885621163298980777562 = -4847991611 + -39829885621163294132785951. +39829885621163289284794340 = -4847991611 - -39829885621163294132785951. +193094951358489174016871810506657061 = -4847991611 * -39829885621163294132785951. +4847991611 = -(-4847991611). +-4847991611 = +(-4847991611). +0 = -4847991611 div -39829885621163294132785951. +-4847991611 = -4847991611 rem -39829885621163294132785951. +-39829885621163298442443583 = -4847991611 band -39829885621163294132785951. +-538333979 = -4847991611 bor -39829885621163294132785951. +39829885621163297904109604 = -4847991611 bxor -39829885621163294132785951. +4847991610 = bnot(-4847991611). +-1 = -4847991611 bsl -815. +-1059274032173169249210912480478494242895499365554911866173767690067157635577659137412971079812073458566849467649816801488739198889427389825097658891419842676658538651753087239335473072810778095703758240053305602292270128237182995593610156636408404139573248 = -4847991611 bsr -815. +-95223736697 = -95222763361 + -973336. +-95221790025 = -95222763361 - -973336. +92683743598742296 = -95222763361 * -973336. +95222763361 = -(-95222763361). +-95222763361 = +(-95222763361). +97831 = -95222763361 div -973336. +-329145 = -95222763361 rem -973336. +-95223209848 = -95222763361 band -973336. +-526849 = -95222763361 bor -973336. +95222682999 = -95222763361 bxor -973336. +95222763360 = bnot(-95222763361). +-1 = -95222763361 bsl -54. +-1715380806359154077124788224 = -95222763361 bsr -54. +82182257492664591951363162 = 82182257492664591951363615 + -453. +82182257492664591951364068 = 82182257492664591951363615 - -453. +-37228562644177060153967717595 = 82182257492664591951363615 * -453. +-82182257492664591951363615 = -(82182257492664591951363615). +82182257492664591951363615 = +(82182257492664591951363615). +-181417786959524485543849 = 82182257492664591951363615 div -453. +18 = 82182257492664591951363615 rem -453. +82182257492664591951363611 = 82182257492664591951363615 band -453. +-449 = 82182257492664591951363615 bor -453. +-82182257492664591951364060 = 82182257492664591951363615 bxor -453. +-82182257492664591951363616 = bnot(82182257492664591951363615). +0 = 82182257492664591951363615 bsl -89. +50868353534515221204638696196059782526438483039354880 = 82182257492664591951363615 bsr -89. +34336558417852744164668007 = 34336558417383317722736162 + 469426441931845. +34336558416913891280804317 = 34336558417383317722736162 - 469426441931845. +16118488446057193649802819013002520878890 = 34336558417383317722736162 * 469426441931845. +-34336558417383317722736162 = -(34336558417383317722736162). +34336558417383317722736162 = +(34336558417383317722736162). +73145769710 = 34336558417383317722736162 div 469426441931845. +51895837321212 = 34336558417383317722736162 rem 469426441931845. +11823306867712 = 34336558417383317722736162 band 469426441931845. +34336558417840920857800295 = 34336558417383317722736162 bor 469426441931845. +34336558417829097550932583 = 34336558417383317722736162 bxor 469426441931845. +-34336558417383317722736163 = bnot(34336558417383317722736162). +9438361309430711520968256731299708928 = 34336558417383317722736162 bsl 38. +124915671830907 = 34336558417383317722736162 bsr 38. +6363678596284926877774 = 6363678596284926877719 + 55. +6363678596284926877664 = 6363678596284926877719 - 55. +350002322795670978274545 = 6363678596284926877719 * 55. +-6363678596284926877719 = -(6363678596284926877719). +6363678596284926877719 = +(6363678596284926877719). +115703247205180488685 = 6363678596284926877719 div 55. +44 = 6363678596284926877719 rem 55. +23 = 6363678596284926877719 band 55. +6363678596284926877751 = 6363678596284926877719 bor 55. +6363678596284926877728 = 6363678596284926877719 bxor 55. +-6363678596284926877720 = bnot(6363678596284926877719). +0 = 6363678596284926877719 bsl -357. +1868171270807695465811717792912671932573589457822593548078554753678289760300921328694949457367392182152900585249481507182338899968 = 6363678596284926877719 bsr -357. +2836235199466365630442 = -876 + 2836235199466365631318. +-2836235199466365632194 = -876 - 2836235199466365631318. +-2484542034732536293034568 = -876 * 2836235199466365631318. +876 = -(-876). +-876 = +(-876). +0 = -876 div 2836235199466365631318. +-876 = -876 rem 2836235199466365631318. +2836235199466365630484 = -876 band 2836235199466365631318. +-42 = -876 bor 2836235199466365631318. +-2836235199466365630526 = -876 bxor 2836235199466365631318. +875 = bnot(-876). +-1926344371863552 = -876 bsl 41. +-1 = -876 bsr 41. +-47372461657264100128016242 = -786194966312368178575 + -47371675462297787759837667. +47370889267331475391659092 = -786194966312368178575 - -47371675462297787759837667. +37243372794241647509924771819376743578467384525 = -786194966312368178575 * -47371675462297787759837667. +786194966312368178575 = -(-786194966312368178575). +-786194966312368178575 = +(-786194966312368178575). +0 = -786194966312368178575 div -47371675462297787759837667. +-786194966312368178575 = -786194966312368178575 rem -47371675462297787759837667. +-47372414666538015693719023 = -786194966312368178575 band -47371675462297787759837667. +-46990726084434297219 = -786194966312368178575 bor -47371675462297787759837667. +47372367675811931259421804 = -786194966312368178575 bxor -47371675462297787759837667. +786194966312368178574 = bnot(-786194966312368178575). +-1 = -786194966312368178575 bsl -842. +-23056140391842376856942385979048877753494478796369537038283990637967359275756168535019576389602874038491715400459610608590330696454643966505877991077027671488589191268781221316986692007983001771463057149877393715414378574703287577707240626738075837126331648151212247534796800 = -786194966312368178575 bsr -842. +37024255800679 = 7448912425833 + 29575343374846. +-22126430949013 = 7448912425833 - 29575343374846. +220304142763168062892796718 = 7448912425833 * 29575343374846. +-7448912425833 = -(7448912425833). +7448912425833 = +(7448912425833). +0 = 7448912425833 div 29575343374846. +7448912425833 = 7448912425833 rem 29575343374846. +3049456533864 = 7448912425833 band 29575343374846. +33974799266815 = 7448912425833 bor 29575343374846. +30925342732951 = 7448912425833 bxor 29575343374846. +-7448912425834 = bnot(7448912425833). +232778513307 = 7448912425833 bsl -5. +238365197626656 = 7448912425833 bsr -5. +-8498864996039499763036 = -9265742822333137134835 + 766877826293637371799. +-10032620648626774506634 = -9265742822333137134835 - 766877826293637371799. +-7105692714586708823837484658209598489518165 = -9265742822333137134835 * 766877826293637371799. +9265742822333137134835 = -(-9265742822333137134835). +-9265742822333137134835 = +(-9265742822333137134835). +-12 = -9265742822333137134835 div 766877826293637371799. +-63208906809488673247 = -9265742822333137134835 rem 766877826293637371799. +176581658718206710533 = -9265742822333137134835 band 766877826293637371799. +-8675446654757706473569 = -9265742822333137134835 bor 766877826293637371799. +-8852028313475913184102 = -9265742822333137134835 bxor 766877826293637371799. +9265742822333137134834 = bnot(-9265742822333137134835). +-144777231598955267732 = -9265742822333137134835 bsl -6. +-593007540629320776629440 = -9265742822333137134835 bsr -6. +-56882487688527177609281 = -56882487688532411578145 + 5233968864. +-56882487688537645547009 = -56882487688532411578145 - 5233968864. +-297721169468641972054844032877280 = -56882487688532411578145 * 5233968864. +56882487688532411578145 = -(-56882487688532411578145). +-56882487688532411578145 = +(-56882487688532411578145). +-10867945371203 = -56882487688532411578145 div 5233968864. +-2987354753 = -56882487688532411578145 rem 5233968864. +4949803200 = -56882487688532411578145 band 5233968864. +-56882487688532127412481 = -56882487688532411578145 bor 5233968864. +-56882487688537077215681 = -56882487688532411578145 bxor 5233968864. +56882487688532411578144 = bnot(-56882487688532411578145). +-512351900715962790238789615423942819840 = -56882487688532411578145 bsl 53. +-6315225 = -56882487688532411578145 bsr 53. +64575 = -33319 + 97894. +-131213 = -33319 - 97894. +-3261730186 = -33319 * 97894. +33319 = -(-33319). +-33319 = +(-33319). +0 = -33319 div 97894. +-33319 = -33319 rem 97894. +97344 = -33319 band 97894. +-32769 = -33319 bor 97894. +-130113 = -33319 bxor 97894. +33318 = bnot(-33319). +-1 = -33319 bsl -363. +-626008722523530794560396832035391363321042934776610478176769823043853380062349109822135895417456867330568331722752 = -33319 bsr -363. +67769193761565562434810930047 = 67769193738113729497422973453 + 23451832937387956594. +67769193714661896560035016859 = 67769193738113729497422973453 - 23451832937387956594. +1589311809847721219260337275925999570019178299082 = 67769193738113729497422973453 * 23451832937387956594. +-67769193738113729497422973453 = -(67769193738113729497422973453). +67769193738113729497422973453 = +(67769193738113729497422973453). +2889718424 = 67769193738113729497422973453 div 23451832937387956594. +22373712892028885597 = 67769193738113729497422973453 rem 23451832937387956594. +23361758981359929344 = 67769193738113729497422973453 band 23451832937387956594. +67769193738203803453451000703 = 67769193738113729497422973453 bor 23451832937387956594. +67769193714842044472091071359 = 67769193738113729497422973453 bxor 23451832937387956594. +-67769193738113729497422973454 = bnot(67769193738113729497422973453). +2117787304316054046794467920 = 67769193738113729497422973453 bsl -5. +2168614199619639343917535150496 = 67769193738113729497422973453 bsr -5. +-7885694187608415931205573899 = -8273167911729764246432215673 + 387473724121348315226641774. +-8660641635851112561658857447 = -8273167911729764246432215673 - 387473724121348315226641774. +-3205635181039170021882665399154579563048311525879323902 = -8273167911729764246432215673 * 387473724121348315226641774. +8273167911729764246432215673 = -(-8273167911729764246432215673). +-8273167911729764246432215673 = +(-8273167911729764246432215673). +-21 = -8273167911729764246432215673 div 387473724121348315226641774. +-136219705181449626672738419 = -8273167911729764246432215673 rem 387473724121348315226641774. +387463095885847653291132166 = -8273167911729764246432215673 band 387473724121348315226641774. +-8273157283494263584496706065 = -8273167911729764246432215673 bor 387473724121348315226641774. +-8660620379380111237787838231 = -8273167911729764246432215673 bxor 387473724121348315226641774. +8273167911729764246432215672 = bnot(-8273167911729764246432215673). +-2068291977932441061608053919 = -8273167911729764246432215673 bsl -2. +-33092671646919056985728862692 = -8273167911729764246432215673 bsr -2. +-9340882561511109548174122 = -8616146697814932781717359 + -724735863696176766456763. +-7891410834118756015260596 = -8616146697814932781717359 - -724735863696176766456763. +6244430518773866671246836981563234056856560048917 = -8616146697814932781717359 * -724735863696176766456763. +8616146697814932781717359 = -(-8616146697814932781717359). +-8616146697814932781717359 = +(-8616146697814932781717359). +11 = -8616146697814932781717359 div -724735863696176766456763. +-644052197156988350692966 = -8616146697814932781717359 rem -724735863696176766456763. +-9340734807308439922137087 = -8616146697814932781717359 band -724735863696176766456763. +-147754202669626037035 = -8616146697814932781717359 bor -724735863696176766456763. +9340587053105770296100052 = -8616146697814932781717359 bxor -724735863696176766456763. +8616146697814932781717358 = bnot(-8616146697814932781717359). +-1 = -8616146697814932781717359 bsl -455. +-801606281495502293128590378590436882741939672196195224471519060616467399151958617949152781733879053032977845343629338540173896768533078295212512138385883777728512 = -8616146697814932781717359 bsr -455. +-721711695065839494 = -721711699848178775 + 4782339281. +-721711704630518056 = -721711699848178775 - 4782339281. +-3451470211741227091992960775 = -721711699848178775 * 4782339281. +721711699848178775 = -(-721711699848178775). +-721711699848178775 = +(-721711699848178775). +-150911856 = -721711699848178775 div 4782339281. +-2930763239 = -721711699848178775 rem 4782339281. +67899521 = -721711699848178775 band 4782339281. +-721711695133739015 = -721711699848178775 bor 4782339281. +-721711695201638536 = -721711699848178775 bxor 4782339281. +721711699848178774 = bnot(-721711699848178775). +-109061988533053345959846156529321168076800 = -721711699848178775 bsl 77. +-1 = -721711699848178775 bsr 77. +733733191817308369 = 733733191817313955 + -5586. +733733191817319541 = 733733191817313955 - -5586. +-4098633609491515752630 = 733733191817313955 * -5586. +-733733191817313955 = -(733733191817313955). +733733191817313955 = +(733733191817313955). +-131352164664753 = 733733191817313955 div -5586. +3697 = 733733191817313955 rem -5586. +733733191817308706 = 733733191817313955 band -5586. +-337 = 733733191817313955 bor -5586. +-733733191817309043 = 733733191817313955 bxor -5586. +-733733191817313956 = bnot(733733191817313955). +5538162991525838594741869954611567113668786757581083286911736941383154599216724252392860416284411687606958361153300446379109181948976694609697270551828111996701734676461057576930545500160 = 733733191817313955 bsl 561. +0 = 733733191817313955 bsr 561. +94448894682821423222216 = 94448894682821423222291 + -75. +94448894682821423222366 = 94448894682821423222291 - -75. +-7083667101211606741671825 = 94448894682821423222291 * -75. +-94448894682821423222291 = -(94448894682821423222291). +94448894682821423222291 = +(94448894682821423222291). +-1259318595770952309630 = 94448894682821423222291 div -75. +41 = 94448894682821423222291 rem -75. +94448894682821423222289 = 94448894682821423222291 band -75. +-73 = 94448894682821423222291 bor -75. +-94448894682821423222362 = 94448894682821423222291 bxor -75. +-94448894682821423222292 = bnot(94448894682821423222291). +2951527958838169475696 = 94448894682821423222291 bsl -5. +3022364629850285543113312 = 94448894682821423222291 bsr -5. +8281516573311517468 = 29388669 + 8281516573282128799. +-8281516573252740130 = 29388669 - 8281516573282128799. +243382749390202726889178531 = 29388669 * 8281516573282128799. +-29388669 = -(29388669). +29388669 = +(29388669). +0 = 29388669 div 8281516573282128799. +29388669 = 29388669 rem 8281516573282128799. +29377309 = 29388669 band 8281516573282128799. +8281516573282140159 = 29388669 bor 8281516573282128799. +8281516573252762850 = 29388669 bxor 8281516573282128799. +-29388670 = bnot(29388669). +0 = 29388669 bsl -516. +6304602068298530802555856986719955291286766182900851726331355532331216818815000284114895397254950905461564494075161261146530244310801391837457379857631751736131584 = 29388669 bsr -516. +73857 = 73381 + 476. +72905 = 73381 - 476. +34929356 = 73381 * 476. +-73381 = -(73381). +73381 = +(73381). +154 = 73381 div 476. +77 = 73381 rem 476. +132 = 73381 band 476. +73725 = 73381 bor 476. +73593 = 73381 bxor 476. +-73382 = bnot(73381). +18785536 = 73381 bsl 8. +286 = 73381 bsr 8. +-672 = -678 + 6. +-684 = -678 - 6. +-4068 = -678 * 6. +678 = -(-678). +-678 = +(-678). +-113 = -678 div 6. +0 = -678 rem 6. +2 = -678 band 6. +-674 = -678 bor 6. +-676 = -678 bxor 6. +677 = bnot(-678). +-11 = -678 bsl -6. +-43392 = -678 bsr -6. +646871226767987500146156850189 = 646871226767894615366929898452 + 92884779226951737. +646871226767801730587702946715 = 646871226767894615366929898452 - 92884779226951737. +60084491086603324173941866316678094918915011124 = 646871226767894615366929898452 * 92884779226951737. +-646871226767894615366929898452 = -(646871226767894615366929898452). +646871226767894615366929898452 = +(646871226767894615366929898452). +6964232807049 = 646871226767894615366929898452 div 92884779226951737. +53875763773504339 = 646871226767894615366929898452 rem 92884779226951737. +90619621955096592 = 646871226767894615366929898452 band 92884779226951737. +646871226767896880524201753597 = 646871226767894615366929898452 bor 92884779226951737. +646871226767806260902246657005 = 646871226767894615366929898452 bxor 92884779226951737. +-646871226767894615366929898453 = bnot(646871226767894615366929898452). +0 = 646871226767894615366929898452 bsl -275. +39270519047433881707202790258921294936734613845970943458816343766813625805071514463646288271302578826787722100736 = 646871226767894615366929898452 bsr -275. +-7 = -3 + -4. +1 = -3 - -4. +12 = -3 * -4. +3 = -(-3). +-3 = +(-3). +0 = -3 div -4. +-3 = -3 rem -4. +-4 = -3 band -4. +-3 = -3 bor -4. +1 = -3 bxor -4. +2 = bnot(-3). +-1 = -3 bsl -7. +-384 = -3 bsr -7. +714249984402415 = 5123119881 + 714244861282534. +-714239738162653 = 5123119881 - 714244861282534. +3659162048738637093458454 = 5123119881 * 714244861282534. +-5123119881 = -(5123119881). +5123119881 = +(5123119881). +0 = 5123119881 div 714244861282534. +5123119881 = 5123119881 rem 714244861282534. +287049728 = 5123119881 band 714244861282534. +714249697352687 = 5123119881 bor 714244861282534. +714249410302959 = 5123119881 bxor 714244861282534. +-5123119882 = bnot(5123119881). +655759344768 = 5123119881 bsl 7. +40024374 = 5123119881 bsr 7. +959939234339641868150277905 = 959893656998498311384448464 + 45577341143556765829441. +959848079657354754618619023 = 959893656998498311384448464 - 45577341143556765829441. +43749400666556822964792371935459754694087278428624 = 959893656998498311384448464 * 45577341143556765829441. +-959893656998498311384448464 = -(959893656998498311384448464). +959893656998498311384448464 = +(959893656998498311384448464). +21060 = 959893656998498311384448464 div 45577341143556765829441. +34852515192823016421004 = 959893656998498311384448464 rem 45577341143556765829441. +5354212576714157230400 = 959893656998498311384448464 band 45577341143556765829441. +959933880127065153993047505 = 959893656998498311384448464 bor 45577341143556765829441. +959928525914488439835817105 = 959893656998498311384448464 bxor 45577341143556765829441. +-959893656998498311384448465 = bnot(959893656998498311384448464). +104071878 = 959893656998498311384448464 bsl -63. +8853456314314218895471508657041030238449958912 = 959893656998498311384448464 bsr -63. +59247603122112336157 = 462133893243347993 + 58785469228868988164. +-58323335335625640171 = 462133893243347993 - 58785469228868988164. +27166757760874259441608768381650154852 = 462133893243347993 * 58785469228868988164. +-462133893243347993 = -(462133893243347993). +462133893243347993 = +(462133893243347993). +0 = 462133893243347993 div 58785469228868988164. +462133893243347993 = 462133893243347993 rem 58785469228868988164. +453122219436942336 = 462133893243347993 band 58785469228868988164. +58794480902675393821 = 462133893243347993 bor 58785469228868988164. +58341358683238451485 = 462133893243347993 bxor 58785469228868988164. +-462133893243347994 = bnot(462133893243347993). +902605260240914 = 462133893243347993 bsl -9. +236612553340594172416 = 462133893243347993 bsr -9. +-698011569432077309818 = -35126663965523543 + -697976442768111786275. +697941316104146262732 = -35126663965523543 - -697976442768111786275. +24517583960966937814813969629296772325 = -35126663965523543 * -697976442768111786275. +35126663965523543 = -(-35126663965523543). +-35126663965523543 = +(-35126663965523543). +0 = -35126663965523543 div -697976442768111786275. +-35126663965523543 = -35126663965523543 rem -697976442768111786275. +-697985602812498640759 = -35126663965523543 band -697976442768111786275. +-25966619578669059 = -35126663965523543 bor -697976442768111786275. +697959636192919971700 = -35126663965523543 bxor -697976442768111786275. +35126663965523542 = bnot(-35126663965523543). +-1 = -35126663965523543 bsl -439. +-49866053955979679484958059718662141146464390837730256639612968936119505528878470902001368771063691814798804304753403053643510683012393077590861021184 = -35126663965523543 bsr -439. +-347226718057629 = -269767376619753 + -77459341437876. +-192308035181877 = -269767376619753 - -77459341437876. +20896003334389534767523964628 = -269767376619753 * -77459341437876. +269767376619753 = -(-269767376619753). +-269767376619753 = +(-269767376619753). +3 = -269767376619753 div -77459341437876. +-37389352306125 = -269767376619753 rem -77459341437876. +-272107596934140 = -269767376619753 band -77459341437876. +-75119121123489 = -269767376619753 bor -77459341437876. +196988475810651 = -269767376619753 bxor -77459341437876. +269767376619752 = bnot(-269767376619753). +-2671646694484568040711421504928585273573376 = -269767376619753 bsl 93. +-1 = -269767376619753 bsr 93. +58815216586799 = 4212156 + 58815212374643. +-58815208162487 = 4212156 - 58815212374643. +247738849695126760308 = 4212156 * 58815212374643. +-4212156 = -(4212156). +4212156 = +(4212156). +0 = 4212156 div 58815212374643. +4212156 = 4212156 rem 58815212374643. +4210736 = 4212156 band 58815212374643. +58815212376063 = 4212156 bor 58815212374643. +58815208165327 = 4212156 bxor 58815212374643. +-4212157 = bnot(4212156). +1053039 = 4212156 bsl -2. +16848624 = 4212156 bsr -2. +-88676814525367380585 = -88239588111222488472 + -437226414144892113. +-87802361697077596359 = -88239588111222488472 - -437226414144892113. +38580678695492062162453604775826221336 = -88239588111222488472 * -437226414144892113. +88239588111222488472 = -(-88239588111222488472). +-88239588111222488472 = +(-88239588111222488472). +201 = -88239588111222488472 div -437226414144892113. +-357078868099173759 = -88239588111222488472 rem -437226414144892113. +-88671935875773808088 = -88239588111222488472 band -437226414144892113. +-4878649593572497 = -88239588111222488472 bor -437226414144892113. +88667057226180235591 = -88239588111222488472 bxor -437226414144892113. +88239588111222488471 = bnot(-88239588111222488472). +-5647333639118239262208 = -88239588111222488472 bsl 6. +-1378743564237851383 = -88239588111222488472 bsr 6. +-437977443717588881112365 = -437977531113424834577219 + 87395835953464854. +-437977618509260788042073 = -437977531113424834577219 - 87395835953464854. +-38277412460492425885954993823007265561026 = -437977531113424834577219 * 87395835953464854. +437977531113424834577219 = -(-437977531113424834577219). +-437977531113424834577219 = +(-437977531113424834577219). +-5011423 = -437977531113424834577219 div 87395835953464854. +-28712004135549977 = -437977531113424834577219 rem 87395835953464854. +620127049614356 = -437977531113424834577219 band 87395835953464854. +-437977444337715930726721 = -437977531113424834577219 bor 87395835953464854. +-437977444957842980341077 = -437977531113424834577219 bxor 87395835953464854. +437977531113424834577218 = bnot(-437977531113424834577219). +-855424865455907880034 = -437977531113424834577219 bsl -9. +-224244495930073515303536128 = -437977531113424834577219 bsr -9. +57529768662798 = 57529743235679 + 25427119. +57529717808560 = 57529743235679 - 25427119. +1462815627293054978801 = 57529743235679 * 25427119. +-57529743235679 = -(57529743235679). +57529743235679 = +(57529743235679). +2262534 = 57529743235679 div 25427119. +21976133 = 57529743235679 rem 25427119. +25221135 = 57529743235679 band 25427119. +57529743441663 = 57529743235679 bor 25427119. +57529718220528 = 57529743235679 bxor 25427119. +-57529743235680 = bnot(57529743235679). +0 = 57529743235679 bsl -653. +2150203697232589654792902726688504035787373753317740472616158352025532118481145934218614454598229143742728790729735919344159937791585638765207158020340521212411106021591913143080783578332048708490009799261421568 = 57529743235679 bsr -653. +-48168881458034390938 = -48168881457472155651 + -562235287. +-48168881456909920364 = -48168881457472155651 - -562235287. +27082244890710835726948656837 = -48168881457472155651 * -562235287. +48168881457472155651 = -(-48168881457472155651). +-48168881457472155651 = +(-48168881457472155651). +85673885242 = -48168881457472155651 div -562235287. +-31221197 = -48168881457472155651 rem -562235287. +-48168881458025805719 = -48168881457472155651 band -562235287. +-8585219 = -48168881457472155651 bor -562235287. +48168881458017220500 = -48168881457472155651 bxor -562235287. +48168881457472155650 = bnot(-48168881457472155651). +-1 = -48168881457472155651 bsl -581. +-381236121260383005492774074595693584190866122338627672539864171434414087748651811581315483199933807980438282682217386828359838278877913308263353248432527750572413075499014900574630363563558961152 = -48168881457472155651 bsr -581. +739882768287751160101 = 739786335162219961386 + 96433125531198715. +739689902036688762671 = 739786335162219961386 - 96433125531198715. +71339908524963803426561871285592818990 = 739786335162219961386 * 96433125531198715. +-739786335162219961386 = -(739786335162219961386). +739786335162219961386 = +(739786335162219961386). +7671 = 739786335162219961386 div 96433125531198715. +47829212394618621 = 739786335162219961386 rem 96433125531198715. +4512679860372522 = 739786335162219961386 band 96433125531198715. +739878255607890787579 = 739786335162219961386 bor 96433125531198715. +739873742928030415057 = 739786335162219961386 bxor 96433125531198715. +-739786335162219961387 = bnot(739786335162219961386). +0 = 739786335162219961386 bsl -833. +42373339545823064452953060540077710062123552824101456154188513062975916538654414695114452913159036766478308994464946252072164053125988212949097361157966884473506561283361047162159722712646669544255918471902633142986531002304367793320129801334124644819367270027037362880512 = 739786335162219961386 bsr -833. +-625353 = -37665 + -587688. +550023 = -37665 - -587688. +22135268520 = -37665 * -587688. +37665 = -(-37665). +-37665 = +(-37665). +0 = -37665 div -587688. +-37665 = -37665 rem -587688. +-587688 = -37665 band -587688. +-37665 = -37665 bor -587688. +550023 = -37665 bxor -587688. +37664 = bnot(-37665). +-74 = -37665 bsl -9. +-19284480 = -37665 bsr -9. +-26738861699899329205016202072 = -26738861699899323541179316717 + -5663836885355. +-26738861699899317877342431362 = -26738861699899323541179316717 - -5663836885355. +151444551168295885362544490277960363979535 = -26738861699899323541179316717 * -5663836885355. +26738861699899323541179316717 = -(-26738861699899323541179316717). +-26738861699899323541179316717 = +(-26738861699899323541179316717). +4720980183775786 = -26738861699899323541179316717 div -5663836885355. +-259272302687 = -26738861699899323541179316717 rem -5663836885355. +-26738861699899324806125844975 = -26738861699899323541179316717 band -5663836885355. +-4398890357097 = -26738861699899323541179316717 bor -5663836885355. +26738861699899320407235487878 = -26738861699899323541179316717 bxor -5663836885355. +26738861699899323541179316716 = bnot(-26738861699899323541179316717). +-21764540494837285653113708660260658306913102977080703667325446600276054925599603068742626374079187394458447357144933268540651762235834868524509702008202349633834638069722456773697396880298420647631419469270408138078722014103016323178222961281900930669016503419928576 = -26738861699899323541179316717 bsl 787. +-1 = -26738861699899323541179316717 bsr 787. +-64769727830985007813 = -53446138352252 + -64769674384846655561. +64769620938708303309 = -53446138352252 - -64769674384846655561. +3461688978202826803362677532673372 = -53446138352252 * -64769674384846655561. +53446138352252 = -(-53446138352252). +-53446138352252 = +(-53446138352252). +0 = -53446138352252 div -64769674384846655561. +-53446138352252 = -53446138352252 rem -64769674384846655561. +-64769709619149263484 = -53446138352252 band -64769674384846655561. +-18211835744329 = -53446138352252 bor -64769674384846655561. +64769691407313519155 = -53446138352252 bxor -64769674384846655561. +53446138352251 = bnot(-53446138352252). +-459098832640827335901184 = -53446138352252 bsl 33. +-6222 = -53446138352252 bsr 33. +2937974356524398868985611 = 2937974356524398868985294 + 317. +2937974356524398868984977 = 2937974356524398868985294 - 317. +931337871018234441468338198 = 2937974356524398868985294 * 317. +-2937974356524398868985294 = -(2937974356524398868985294). +2937974356524398868985294 = +(2937974356524398868985294). +9268057907017031132445 = 2937974356524398868985294 div 317. +229 = 2937974356524398868985294 rem 317. +268 = 2937974356524398868985294 band 317. +2937974356524398868985343 = 2937974356524398868985294 bor 317. +2937974356524398868985075 = 2937974356524398868985294 bxor 317. +-2937974356524398868985295 = bnot(2937974356524398868985294). +12921347868425151865191655869383704576 = 2937974356524398868985294 bsl 42. +668018027800 = 2937974356524398868985294 bsr 42. +24957774184222492454005 = 741 + 24957774184222492453264. +-24957774184222492452523 = 741 - 24957774184222492453264. +18493710670508866907868624 = 741 * 24957774184222492453264. +-741 = -(741). +741 = +(741). +0 = 741 div 24957774184222492453264. +741 = 741 rem 24957774184222492453264. +128 = 741 band 24957774184222492453264. +24957774184222492453877 = 741 bor 24957774184222492453264. +24957774184222492453749 = 741 bxor 24957774184222492453264. +-742 = bnot(741). +0 = 741 bsl -291. +2948132145437215214697105967014353940115504061926677268987070455022649498290297850159955968 = 741 bsr -291. +-74144284777679928900317788815 = -8444544183 + -74144284777679928891873244632. +74144284777679928883428700449 = -8444544183 - -74144284777679928891873244632. +626114688722052491759721843930491575656 = -8444544183 * -74144284777679928891873244632. +8444544183 = -(-8444544183). +-8444544183 = +(-8444544183). +0 = -8444544183 div -74144284777679928891873244632. +-8444544183 = -8444544183 rem -74144284777679928891873244632. +-74144284777679928895217186296 = -8444544183 band -74144284777679928891873244632. +-5100602519 = -8444544183 bor -74144284777679928891873244632. +74144284777679928890116583777 = -8444544183 bxor -74144284777679928891873244632. +8444544182 = bnot(-8444544183). +-1055568023 = -8444544183 bsl -3. +-67556353464 = -8444544183 bsr -3. +191999140043763205552 = -26334813434414254169 + 218333953478177459721. +-244668766912591713890 = -26334813434414254169 - 218333953478177459721. +-5749783931245884542559171755125253826849 = -26334813434414254169 * 218333953478177459721. +26334813434414254169 = -(-26334813434414254169). +-26334813434414254169 = +(-26334813434414254169). +0 = -26334813434414254169 div 218333953478177459721. +-26334813434414254169 = -26334813434414254169 rem 218333953478177459721. +194881452636271019521 = -26334813434414254169 band 218333953478177459721. +-2882312592507813969 = -26334813434414254169 bor 218333953478177459721. +-197763765228778833490 = -26334813434414254169 bxor 218333953478177459721. +26334813434414254168 = bnot(-26334813434414254169). +-105339253737657016676 = -26334813434414254169 bsl 2. +-6583703358603563543 = -26334813434414254169 bsr 2. +97077970270216582312757580721 = 96665975928744285133262424376 + 411994341472297179495156345. +96253981587271987953767268031 = 96665975928744285133262424376 - 411994341472297179495156345. +39825835095539932495287151918398938981709695283859065720 = 96665975928744285133262424376 * 411994341472297179495156345. +-96665975928744285133262424376 = -(96665975928744285133262424376). +96665975928744285133262424376 = +(96665975928744285133262424376). +234 = 96665975928744285133262424376 div 411994341472297179495156345. +259300024226745131395839646 = 96665975928744285133262424376 rem 411994341472297179495156345. +96752176571981774075594808 = 96665975928744285133262424376 band 411994341472297179495156345. +96981218093644600538681985913 = 96665975928744285133262424376 bor 411994341472297179495156345. +96884465917072618764606391105 = 96665975928744285133262424376 bxor 411994341472297179495156345. +-96665975928744285133262424377 = bnot(96665975928744285133262424376). +6186622459439634248528795160064 = 96665975928744285133262424376 bsl 6. +1510405873886629455207225380 = 96665975928744285133262424376 bsr 6. +669655565377865995388648200720 = 669655565377865995339383557353 + 49264643367. +669655565377865995290118913986 = 669655565377865995339383557353 - 49264643367. +32990342607067320855911215082619335527551 = 669655565377865995339383557353 * 49264643367. +-669655565377865995339383557353 = -(669655565377865995339383557353). +669655565377865995339383557353 = +(669655565377865995339383557353). +13593025740371762130 = 669655565377865995339383557353 div 49264643367. +7577265643 = 669655565377865995339383557353 rem 49264643367. +48593423393 = 669655565377865995339383557353 band 49264643367. +669655565377865995340054777327 = 669655565377865995339383557353 bor 49264643367. +669655565377865995291461353934 = 669655565377865995339383557353 bxor 49264643367. +-669655565377865995339383557354 = bnot(669655565377865995339383557353). +0 = 669655565377865995339383557353 bsl -788. +1090154534911603833409211258660596520018679181593386620841863895484444978620280882365041667806860194849327859281038497075397363173136686064640477233061715543249397573262429774489673948938528155747849665389296215168513071882659601605167905661417721061215192707412000768 = 669655565377865995339383557353 bsr -788. +62680198872129 = 84249394156647 + -21569195284518. +105818589441165 = 84249394156647 - -21569195284518. +-1817191635167048815825891146 = 84249394156647 * -21569195284518. +-84249394156647 = -(84249394156647). +84249394156647 = +(84249394156647). +-3 = 84249394156647 div -21569195284518. +19541808303093 = 84249394156647 rem -21569195284518. +83571591480386 = 84249394156647 band -21569195284518. +-20891392608257 = 84249394156647 bor -21569195284518. +-104462984088643 = 84249394156647 bxor -21569195284518. +-84249394156648 = bnot(84249394156647). +0 = 84249394156647 bsl -385. +6639190301205371846453424945009347141230397653878083794429127533671990806472252090083489931149828497016074919504445953734191611904 = 84249394156647 bsr -385. +8112728482719164532 = 8112728482719164141 + 391. +8112728482719163750 = 8112728482719164141 - 391. +3172076836743193179131 = 8112728482719164141 * 391. +-8112728482719164141 = -(8112728482719164141). +8112728482719164141 = +(8112728482719164141). +20748666196212696 = 8112728482719164141 div 391. +5 = 8112728482719164141 rem 391. +133 = 8112728482719164141 band 391. +8112728482719164399 = 8112728482719164141 bor 391. +8112728482719164266 = 8112728482719164141 bxor 391. +-8112728482719164142 = bnot(8112728482719164141). +63380691271243469 = 8112728482719164141 bsl -7. +1038429245788053010048 = 8112728482719164141 bsr -7. +-667126619869642686 = -667126619869638824 + -3862. +-667126619869634962 = -667126619869638824 - -3862. +2576443005936545138288 = -667126619869638824 * -3862. +667126619869638824 = -(-667126619869638824). +-667126619869638824 = +(-667126619869638824). +172741227309590 = -667126619869638824 div -3862. +-2244 = -667126619869638824 rem -3862. +-667126619869642680 = -667126619869638824 band -3862. +-6 = -667126619869638824 bor -3862. +667126619869642674 = -667126619869638824 bxor -3862. +667126619869638823 = bnot(-667126619869638824). +-5211926717731554 = -667126619869638824 bsl -7. +-85392207343313769472 = -667126619869638824 bsr -7. +-426557362126 = 661597599 + -427218959725. +427880557324 = 661597599 - -427218959725. +-282647038001337700275 = 661597599 * -427218959725. +-661597599 = -(661597599). +661597599 = +(661597599). +0 = 661597599 div -427218959725. +661597599 = 661597599 rem -427218959725. +121897107 = 661597599 band -427218959725. +-426679259233 = 661597599 bor -427218959725. +-426801156340 = 661597599 bxor -427218959725. +-661597600 = bnot(661597599). +42342246336 = 661597599 bsl 6. +10337462 = 661597599 bsr 6. +-6867177441679752363 = 5 + -6867177441679752368. +6867177441679752373 = 5 - -6867177441679752368. +-34335887208398761840 = 5 * -6867177441679752368. +-5 = -(5). +5 = +(5). +0 = 5 div -6867177441679752368. +5 = 5 rem -6867177441679752368. +0 = 5 band -6867177441679752368. +-6867177441679752363 = 5 bor -6867177441679752368. +-6867177441679752363 = 5 bxor -6867177441679752368. +-6 = bnot(5). +2156795733372051183573361206961570453890971553803245798488288819937280 = 5 bsl 228. +0 = 5 bsr 228. +3827466834441551602834674714 = -3685667364298319745 + 3827466838127218967132994459. +-3827466841812886331431314204 = -3685667364298319745 - 3827466838127218967132994459. +-14106769613219570758389934564963414364095292955 = -3685667364298319745 * 3827466838127218967132994459. +3685667364298319745 = -(-3685667364298319745). +-3685667364298319745 = +(-3685667364298319745). +0 = -3685667364298319745 div 3827466838127218967132994459. +-3685667364298319745 = -3685667364298319745 rem 3827466838127218967132994459. +3827466838118178164054104091 = -3685667364298319745 band 3827466838127218967132994459. +-3676626561219429377 = -3685667364298319745 bor 3827466838127218967132994459. +-3827466841794804725273533468 = -3685667364298319745 bxor 3827466838127218967132994459. +3685667364298319744 = bnot(-3685667364298319745). +-16997140652508683198578488716537364480 = -3685667364298319745 bsl 62. +-1 = -3685667364298319745 bsr 62. +-8352846793286413624906528 = 3341361 + -8352846793286413628247889. +8352846793286413631589250 = 3341361 - -8352846793286413628247889. +-27909876514062284327295994636929 = 3341361 * -8352846793286413628247889. +-3341361 = -(3341361). +3341361 = +(3341361). +0 = 3341361 div -8352846793286413628247889. +3341361 = 3341361 rem -8352846793286413628247889. +1208353 = 3341361 band -8352846793286413628247889. +-8352846793286413626114881 = 3341361 bor -8352846793286413628247889. +-8352846793286413627323234 = 3341361 bxor -8352846793286413628247889. +-3341362 = bnot(3341361). +14695461088388972544 = 3341361 bsl 42. +0 = 3341361 bsr 42. +53092 = 53969 + -877. +54846 = 53969 - -877. +-47330813 = 53969 * -877. +-53969 = -(53969). +53969 = +(53969). +-61 = 53969 div -877. +472 = 53969 rem -877. +53393 = 53969 band -877. +-301 = 53969 bor -877. +-53694 = 53969 bxor -877. +-53970 = bnot(53969). +843 = 53969 bsl -6. +3454016 = 53969 bsr -6. +4887551645628250 = -484517 + 4887551646112767. +-4887551646597284 = -484517 - 4887551646112767. +-2368101860919619528539 = -484517 * 4887551646112767. +484517 = -(-484517). +-484517 = +(-484517). +0 = -484517 div 4887551646112767. +-484517 = -484517 rem 4887551646112767. +4887551646112603 = -484517 band 4887551646112767. +-484353 = -484517 bor 4887551646112767. +-4887551646596956 = -484517 bxor 4887551646112767. +484516 = bnot(-484517). +-7571 = -484517 bsl -6. +-31009088 = -484517 bsr -6. +9818661703 = 9818661771 + -68. +9818661839 = 9818661771 - -68. +-667669000428 = 9818661771 * -68. +-9818661771 = -(9818661771). +9818661771 = +(9818661771). +-144392084 = 9818661771 div -68. +59 = 9818661771 rem -68. +9818661768 = 9818661771 band -68. +-65 = 9818661771 bor -68. +-9818661833 = 9818661771 bxor -68. +-9818661772 = bnot(9818661771). +0 = 9818661771 bsl -71. +23183659627001955918025020407808 = 9818661771 bsr -71. +-712255146394710796767561401884 = -712255146394711532165679291249 + 735398117889365. +-712255146394712267563797180614 = -712255146394711532165679291249 - 735398117889365. +-523791094115684997786158104614938540994666885 = -712255146394711532165679291249 * 735398117889365. +712255146394711532165679291249 = -(-712255146394711532165679291249). +-712255146394711532165679291249 = +(-712255146394711532165679291249). +-968530009893042 = -712255146394711532165679291249 div 735398117889365. +-381715239992919 = -712255146394711532165679291249 rem 735398117889365. +572648593671173 = -712255146394711532165679291249 band 735398117889365. +-712255146394711369416155073057 = -712255146394711532165679291249 bor 735398117889365. +-712255146394711942064748744230 = -712255146394711532165679291249 bxor 735398117889365. +712255146394711532165679291248 = bnot(-712255146394711532165679291249). +-4713310 = -712255146394711532165679291249 bsl -77. +-107632954578745541137618349763529320349863629687881728 = -712255146394711532165679291249 bsr -77. +543191318463985309537255 = 543191317734459435141817 + 729525874395438. +543191317004933560746379 = 543191317734459435141817 - 729525874395438. +396272121034241707641659530986667830846 = 543191317734459435141817 * 729525874395438. +-543191317734459435141817 = -(543191317734459435141817). +543191317734459435141817 = +(543191317734459435141817). +744581291 = 543191317734459435141817 div 729525874395438. +359200364591359 = 543191317734459435141817 rem 729525874395438. +158380282873896 = 543191317734459435141817 band 729525874395438. +543191318305605026663359 = 543191317734459435141817 bor 729525874395438. +543191318147224743789463 = 543191317734459435141817 bxor 729525874395438. +-543191317734459435141818 = bnot(543191317734459435141817). +4556619033477828293306127220736 = 543191317734459435141817 bsl 23. +64753451077277593 = 543191317734459435141817 bsr 23. +-169 = -73 + -96. +23 = -73 - -96. +7008 = -73 * -96. +73 = -(-73). +-73 = +(-73). +0 = -73 div -96. +-73 = -73 rem -96. +-96 = -73 band -96. +-73 = -73 bor -96. +23 = -73 bxor -96. +72 = bnot(-73). +-1183260298938720648325803804880682671968392870912882397264386660419600215754462088621791463176322566339993928604003740665292367298847889052639616651915309957638540123626211700113408 = -73 bsl 592. +-1 = -73 bsr 592. +8831173783751346 = 9 + 8831173783751337. +-8831173783751328 = 9 - 8831173783751337. +79480564053762033 = 9 * 8831173783751337. +-9 = -(9). +9 = +(9). +0 = 9 div 8831173783751337. +9 = 9 rem 8831173783751337. +9 = 9 band 8831173783751337. +8831173783751337 = 9 bor 8831173783751337. +8831173783751328 = 9 bxor 8831173783751337. +-10 = bnot(9). +21250649172913403461632 = 9 bsl 71. +0 = 9 bsr 71. +811781846846508316055933 = -8115277375891 + 811781846854623593431824. +-811781846862738870807715 = -8115277375891 - 811781846854623593431824. +-6587834855938339387465949533929755184 = -8115277375891 * 811781846854623593431824. +8115277375891 = -(-8115277375891). +-8115277375891 = +(-8115277375891). +0 = -8115277375891 div 811781846854623593431824. +-8115277375891 = -8115277375891 rem 811781846854623593431824. +811781846848984164991488 = -8115277375891 band 811781846854623593431824. +-2475848935555 = -8115277375891 bor 811781846854623593431824. +-811781846851460013927043 = -8115277375891 bxor 811781846854623593431824. +8115277375890 = bnot(-8115277375891). +-1510015450930589366813802127150545214557626373979929896039337967719857490005174837056015495287940938465420445761003514563307717354269184123213736574976 = -8115277375891 bsl 456. +-1 = -8115277375891 bsr 456. +3753491446477699 = 23456 + 3753491446454243. +-3753491446430787 = 23456 - 3753491446454243. +88041895368030723808 = 23456 * 3753491446454243. +-23456 = -(23456). +23456 = +(23456). +0 = 23456 div 3753491446454243. +23456 = 23456 rem 3753491446454243. +21408 = 23456 band 3753491446454243. +3753491446456291 = 23456 bor 3753491446454243. +3753491446434883 = 23456 bxor 3753491446454243. +-23457 = bnot(23456). +0 = 23456 bsl -444. +1065545569817359701545308702363814647362438234767608276372664631998817196374241355596196080346377387112077856674786216850561725987549085696 = 23456 bsr -444. +17398133890995795 = 21932873413385293 + -4534739522389498. +26467612935774791 = 21932873413385293 - -4534739522389498. +-99459867907244142309416690852914 = 21932873413385293 * -4534739522389498. +-21932873413385293 = -(21932873413385293). +21932873413385293 = +(21932873413385293). +-4 = 21932873413385293 div -4534739522389498. +3793915323827301 = 21932873413385293 rem -4534739522389498. +21923733720815620 = 21932873413385293 band -4534739522389498. +-4525599829819825 = 21932873413385293 bor -4534739522389498. +-26449333550635445 = 21932873413385293 bxor -4534739522389498. +-21932873413385294 = bnot(21932873413385293). +0 = 21932873413385293 bsl -247. +4960260225612245530309503124020715866594788167704014792650628470837551940641670763437359104 = 21932873413385293 bsr -247. +53441059870677 = 54137324433324 + -696264562647. +54833588995971 = 54137324433324 - -696264562647. +-37693900519447081972448628 = 54137324433324 * -696264562647. +-54137324433324 = -(54137324433324). +54137324433324 = +(54137324433324). +-77 = 54137324433324 div -696264562647. +524953109505 = 54137324433324 rem -696264562647. +53999607081000 = 54137324433324 band -696264562647. +-558547210323 = 54137324433324 bor -696264562647. +-54558154291323 = 54137324433324 bxor -696264562647. +-54137324433325 = bnot(54137324433324). +1 = 54137324433324 bsl -45. +1904787766755887616589037568 = 54137324433324 bsr -45. +8257786268962687995 = 8257786268955161814 + 7526181. +8257786268947635633 = 8257786268955161814 - 7526181. +62149594119471228696452334 = 8257786268955161814 * 7526181. +-8257786268955161814 = -(8257786268955161814). +8257786268955161814 = +(8257786268955161814). +1097208035384 = 8257786268955161814 div 7526181. +773310 = 8257786268955161814 rem 7526181. +2266116 = 8257786268955161814 band 7526181. +8257786268960421879 = 8257786268955161814 bor 7526181. +8257786268958155763 = 8257786268955161814 bxor 7526181. +-8257786268955161815 = bnot(8257786268955161814). +2064446567238790453 = 8257786268955161814 bsl -2. +33031145075820647256 = 8257786268955161814 bsr -2. +6852732571801646526 = -33923148 + 6852732571835569674. +-6852732571869492822 = -33923148 - 6852732571835569674. +-232466261238798661715413752 = -33923148 * 6852732571835569674. +33923148 = -(-33923148). +-33923148 = +(-33923148). +0 = -33923148 div 6852732571835569674. +-33923148 = -33923148 rem 6852732571835569674. +6852732571835569664 = -33923148 band 6852732571835569674. +-33923138 = -33923148 bor 6852732571835569674. +-6852732571869492802 = -33923148 bxor 6852732571835569674. +33923147 = bnot(-33923148). +-21782271568400745073903219172783846555237631662776043049986741799362091680002283776431101407811523695564419536863711473859250454968134546588361401779957252264574810298924994276642619876092046681855009415287374086144 = -33923148 bsl 687. +-1 = -33923148 bsr 687. +4933596866441911751760609356 = -87768791 + 4933596866441911751848378147. +-4933596866441911751936146938 = -87768791 - 4933596866441911751848378147. +-433015832248995066188424165273010277 = -87768791 * 4933596866441911751848378147. +87768791 = -(-87768791). +-87768791 = +(-87768791). +0 = -87768791 div 4933596866441911751848378147. +-87768791 = -87768791 rem 4933596866441911751848378147. +4933596866441911751848231201 = -87768791 band 4933596866441911751848378147. +-87621845 = -87768791 bor 4933596866441911751848378147. +-4933596866441911751935853046 = -87768791 bxor 4933596866441911751848378147. +87768790 = bnot(-87768791). +-1 = -87768791 bsl -823. +-4909378852518964665397930710056376487208812040153826207402671768865531237643441262508997952270996583077595683649423749336461411177429052678292244331311794729913386285051361522165088879213446951378294299353770172247965285722703217125354394092893822599036928 = -87768791 bsr -823. +8741864586305876256 = 8741864585723676465 + 582199791. +8741864585141476674 = 8741864585723676465 - 582199791. +5089511734758626021674618815 = 8741864585723676465 * 582199791. +-8741864585723676465 = -(8741864585723676465). +8741864585723676465 = +(8741864585723676465). +15015231404 = 8741864585723676465 div 582199791. +498239901 = 8741864585723676465 rem 582199791. +580944161 = 8741864585723676465 band 582199791. +8741864585724932095 = 8741864585723676465 bor 582199791. +8741864585143987934 = 8741864585723676465 bxor 582199791. +-8741864585723676466 = bnot(8741864585723676465). +0 = 8741864585723676465 bsl -72. +41282288317406626147881407260211690864640 = 8741864585723676465 bsr -72. +-26994448456349269779196434055 = -995853541223 + -26994448456349268783342892832. +26994448456349267787489351609 = -995853541223 - -26994448456349268783342892832. +26882517088617165256418668582616183213536 = -995853541223 * -26994448456349268783342892832. +995853541223 = -(-995853541223). +-995853541223 = +(-995853541223). +0 = -995853541223 div -26994448456349268783342892832. +-995853541223 = -995853541223 rem -26994448456349268783342892832. +-26994448456349269615645245312 = -995853541223 band -26994448456349268783342892832. +-163551188743 = -995853541223 bor -26994448456349268783342892832. +26994448456349269452094056569 = -995853541223 bxor -26994448456349268783342892832. +995853541222 = bnot(-995853541223). +-1 = -995853541223 bsl -219. +-839004948739536910209664142641239584601848226954266016490647922432867223732224 = -995853541223 bsr -219. +7478630468 = -248785 + 7478879253. +-7479128038 = -248785 - 7478879253. +-1860632974957605 = -248785 * 7478879253. +248785 = -(-248785). +-248785 = +(-248785). +0 = -248785 div 7478879253. +-248785 = -248785 rem 7478879253. +7478715397 = -248785 band 7478879253. +-84929 = -248785 bor 7478879253. +-7478800326 = -248785 bxor 7478879253. +248784 = bnot(-248785). +-1 = -248785 bsl -88. +-76995228168403332922694655016960 = -248785 bsr -88. +9112624 = 9112626 + -2. +9112628 = 9112626 - -2. +-18225252 = 9112626 * -2. +-9112626 = -(9112626). +9112626 = +(9112626). +-4556313 = 9112626 div -2. +0 = 9112626 rem -2. +9112626 = 9112626 band -2. +-2 = 9112626 bor -2. +-9112628 = 9112626 bxor -2. +-9112627 = bnot(9112626). +0 = 9112626 bsl -87. +1410110573554122214116613347606528 = 9112626 bsr -87. +-9231217449626140093169195 = 7158295958 + -9231217449626147251465153. +9231217449626154409761111 = 7158295958 - -9231217449626147251465153. +-66079786557077918481275814297751574 = 7158295958 * -9231217449626147251465153. +-7158295958 = -(7158295958). +7158295958 = +(7158295958). +0 = 7158295958 div -9231217449626147251465153. +7158295958 = 7158295958 rem -9231217449626147251465153. +4431299606 = 7158295958 band -9231217449626147251465153. +-9231217449626144524468801 = 7158295958 bor -9231217449626147251465153. +-9231217449626148955768407 = 7158295958 bxor -9231217449626147251465153. +-7158295959 = bnot(7158295958). +13981046 = 7158295958 bsl -9. +3665047530496 = 7158295958 bsr -9. +733622196575874592956977683677 = 733622196575874592956977683719 + -42. +733622196575874592956977683761 = 733622196575874592956977683719 - -42. +-30812132256186732904193062716198 = 733622196575874592956977683719 * -42. +-733622196575874592956977683719 = -(733622196575874592956977683719). +733622196575874592956977683719 = +(733622196575874592956977683719). +-17467195156568442689451849612 = 733622196575874592956977683719 div -42. +15 = 733622196575874592956977683719 rem -42. +733622196575874592956977683718 = 733622196575874592956977683719 band -42. +-41 = 733622196575874592956977683719 bor -42. +-733622196575874592956977683759 = 733622196575874592956977683719 bxor -42. +-733622196575874592956977683720 = bnot(733622196575874592956977683719). +0 = 733622196575874592956977683719 bsl -982. +29986667558820548860569388339118939628021609752472298746240482499913429520272515420974508069522157046073722363662951409931227880373184804148721237710463162469842938171830741413264701323225102429378796617204756120261640476470840409010032421701834204666551977915902768691582481649109164531815901034693474889878223588005223858176 = 733622196575874592956977683719 bsr -982. +811349291315272899466 = 811349291315272899411 + 55. +811349291315272899356 = 811349291315272899411 - 55. +44624211022340009467605 = 811349291315272899411 * 55. +-811349291315272899411 = -(811349291315272899411). +811349291315272899411 = +(811349291315272899411). +14751805296641325443 = 811349291315272899411 div 55. +46 = 811349291315272899411 rem 55. +19 = 811349291315272899411 band 55. +811349291315272899447 = 811349291315272899411 bor 55. +811349291315272899428 = 811349291315272899411 bxor 55. +-811349291315272899412 = bnot(811349291315272899411). +1124801795688128809117845354257026935140522772168575758953903827993679735658665042098288387621672886911021174779684507191627912556218392869482195320832 = 811349291315272899411 bsl 429. +0 = 811349291315272899411 bsr 429. +885975861442819814306863 = 885975861442819814297548 + 9315. +885975861442819814288233 = 885975861442819814297548 - 9315. +8252865149339866570181659620 = 885975861442819814297548 * 9315. +-885975861442819814297548 = -(885975861442819814297548). +885975861442819814297548 = +(885975861442819814297548). +95112813896169598958 = 885975861442819814297548 div 9315. +3778 = 885975861442819814297548 rem 9315. +1088 = 885975861442819814297548 band 9315. +885975861442819814305775 = 885975861442819814297548 bor 9315. +885975861442819814304687 = 885975861442819814297548 bxor 9315. +-885975861442819814297549 = bnot(885975861442819814297548). +0 = 885975861442819814297548 bsl -927. +1005143040823854522478619626628497929067403976849016345635161191003470159625580516200556688949945723013240038033686213398765835282099300420928799390266566436852158165277864040471010072625095701590737584910653891758231878828261163348792412956637359318013736327093066282518636197068463689890831796424146944 = 885975861442819814297548 bsr -927. +41399875836504791656137563799 = 41399875836262823738481646965 + 241967917655916834. +41399875836020855820825730131 = 41399875836262823738481646965 - 241967917655916834. +10017441747314024011053170597295347749388508810 = 41399875836262823738481646965 * 241967917655916834. +-41399875836262823738481646965 = -(41399875836262823738481646965). +41399875836262823738481646965 = +(41399875836262823738481646965). +171096549647 = 41399875836262823738481646965 div 241967917655916834. +66041286697589367 = 41399875836262823738481646965 rem 241967917655916834. +72339653133074720 = 41399875836262823738481646965 band 241967917655916834. +41399875836432452003004489079 = 41399875836262823738481646965 bor 241967917655916834. +41399875836360112349871414359 = 41399875836262823738481646965 bxor 241967917655916834. +-41399875836262823738481646966 = bnot(41399875836262823738481646965). +71817336515 = 41399875836262823738481646965 bsl -59. +23865403569840390970934364411101718826104913920 = 41399875836262823738481646965 bsr -59. +4274843908092340195 = -4185377341 + 4274843912277717536. +-4274843916463094877 = -4185377341 - 4274843912277717536. +-17891834846758950674372751776 = -4185377341 * 4274843912277717536. +4185377341 = -(-4185377341). +-4185377341 = +(-4185377341). +0 = -4185377341 div 4274843912277717536. +-4185377341 = -4185377341 rem 4274843912277717536. +4274843909710426112 = -4185377341 band 4274843912277717536. +-1618085917 = -4185377341 bor 4274843912277717536. +-4274843911328512029 = -4185377341 bxor 4274843912277717536. +4185377340 = bnot(-4185377341). +-1295311547485420108782786396968452096 = -4185377341 bsl 88. +-1 = -4185377341 bsr 88. +-6242811754787962 = -6242811754788576 + 614. +-6242811754789190 = -6242811754788576 - 614. +-3833086417440185664 = -6242811754788576 * 614. +6242811754788576 = -(-6242811754788576). +-6242811754788576 = +(-6242811754788576). +-10167445854704 = -6242811754788576 div 614. +-320 = -6242811754788576 rem 614. +32 = -6242811754788576 band 614. +-6242811754787994 = -6242811754788576 bor 614. +-6242811754788026 = -6242811754788576 bxor 614. +6242811754788575 = bnot(-6242811754788576). +-97543933668572 = -6242811754788576 bsl -6. +-399539952306468864 = -6242811754788576 bsr -6. +-7538171139905556212306216 = -7629586458271768482155827 + 91415318366212269849611. +-7721001776637980752005438 = -7629586458271768482155827 - 91415318366212269849611. +-697461075085455621116210985649692909134357333297 = -7629586458271768482155827 * 91415318366212269849611. +7629586458271768482155827 = -(-7629586458271768482155827). +-7629586458271768482155827 = +(-7629586458271768482155827). +-83 = -7629586458271768482155827 div 91415318366212269849611. +-42115033876150084638114 = -7629586458271768482155827 rem 91415318366212269849611. +77236661554355152924681 = -7629586458271768482155827 band 91415318366212269849611. +-7615407801459911365230897 = -7629586458271768482155827 bor 91415318366212269849611. +-7692644463014266518155578 = -7629586458271768482155827 bxor 91415318366212269849611. +7629586458271768482155826 = bnot(-7629586458271768482155827). +-3469534230259 = -7629586458271768482155827 bsl -41. +-16777638051984237727202732308906901504 = -7629586458271768482155827 bsr -41. +-4267121652459075945934652272 = -4267121648737814333378672448 + -3721261612555979824. +-4267121645016552720822692624 = -4267121648737814333378672448 - -3721261612555979824. +15879075987554610274837263875481017808992689152 = -4267121648737814333378672448 * -3721261612555979824. +4267121648737814333378672448 = -(-4267121648737814333378672448). +-4267121648737814333378672448 = +(-4267121648737814333378672448). +1146686821 = -4267121648737814333378672448 div -3721261612555979824. +-126664144455972944 = -4267121648737814333378672448 rem -3721261612555979824. +-4267121651089823294832672576 = -4267121648737814333378672448 band -3721261612555979824. +-1369252651101979696 = -4267121648737814333378672448 bor -3721261612555979824. +4267121649720570643730692880 = -4267121648737814333378672448 bxor -3721261612555979824. +4267121648737814333378672447 = bnot(-4267121648737814333378672448). +-1 = -4267121648737814333378672448 bsl -651. +-39871465739338534063342663826501196000324697659784107528606747974331669942608986453404016148280232658289099588827686503977278355928542987546437376620656531497244946319740519491056964833008916902911927004689951702106037551104 = -4267121648737814333378672448 bsr -651. +-4036400470114176 = -4273587136568859 + 237186666454683. +-4510773803023542 = -4273587136568859 - 237186666454683. +-1013637886726381765650632516697 = -4273587136568859 * 237186666454683. +4273587136568859 = -(-4273587136568859). +-4273587136568859 = +(-4273587136568859). +-18 = -4273587136568859 div 237186666454683. +-4227140384565 = -4273587136568859 rem 237186666454683. +230005444362369 = -4273587136568859 band 237186666454683. +-4266405914476545 = -4273587136568859 bor 237186666454683. +-4496411358838914 = -4273587136568859 bxor 237186666454683. +4273587136568858 = bnot(-4273587136568859). +-1 = -4273587136568859 bsl -92. +-21161778510934196433939532476604893483761664 = -4273587136568859 bsr -92. +-91484855776220637360611 = 596954114912 + -91484855776817591475523. +91484855777414545590435 = 596954114912 - -91484855776817591475523. +-54612261108102115527342428577298976 = 596954114912 * -91484855776817591475523. +-596954114912 = -(596954114912). +596954114912 = +(596954114912). +0 = 596954114912 div -91484855776817591475523. +596954114912 = 596954114912 rem -91484855776817591475523. +558882628128 = 596954114912 band -91484855776817591475523. +-91484855776779519988739 = 596954114912 bor -91484855776817591475523. +-91484855777338402616867 = 596954114912 bxor -91484855776817591475523. +-596954114913 = bnot(596954114912). +2503807031991861248 = 596954114912 bsl 22. +142324 = 596954114912 bsr 22. +65569748663986084 = -4498113 + 65569748668484197. +-65569748672982310 = -4498113 - 65569748668484197. +-294940138892441456820261 = -4498113 * 65569748668484197. +4498113 = -(-4498113). +-4498113 = +(-4498113). +0 = -4498113 div 65569748668484197. +-4498113 = -4498113 rem 65569748668484197. +65569748663994405 = -4498113 band 65569748668484197. +-8321 = -4498113 bor 65569748668484197. +-65569748664002726 = -4498113 bxor 65569748668484197. +4498112 = bnot(-4498113). +-178188613885762551182954379538857984 = -4498113 bsl 95. +-1 = -4498113 bsr 95. +-777223525640658 = -777223525611319 + -29339. +-777223525581980 = -777223525611319 - -29339. +22802961017910488141 = -777223525611319 * -29339. +777223525611319 = -(-777223525611319). +-777223525611319 = +(-777223525611319). +26491138948 = -777223525611319 div -29339. +-15947 = -777223525611319 rem -29339. +-777223525627839 = -777223525611319 band -29339. +-12819 = -777223525611319 bor -29339. +777223525615020 = -777223525611319 bxor -29339. +777223525611318 = bnot(-777223525611319). +-198969222556497664 = -777223525611319 bsl 8. +-3036029396920 = -777223525611319 bsr 8. +96417343 = 97244955 + -827612. +98072567 = 97244955 - -827612. +-80481091697460 = 97244955 * -827612. +-97244955 = -(97244955). +97244955 = +(97244955). +-117 = 97244955 div -827612. +414351 = 97244955 rem -827612. +96687872 = 97244955 band -827612. +-270529 = 97244955 bor -827612. +-96958401 = 97244955 bxor -827612. +-97244956 = bnot(97244955). +0 = 97244955 bsl -881. +1567809384369929985858068741727183110280701137458891778377229107393402021905611996672699880982016244270146370873154137628391215170843459394808333944286332041143039007815016768028549464218926813385360539034073368739559839619975355452669118002097778858629874794621716041564160 = 97244955 bsr -881. +3198551991723789764315794183 = 3198551987886863514642434571 + 3836926249673359612. +3198551984049937264969074959 = 3198551987886863514642434571 - 3836926249673359612. +12272608083268012387137280170851540240463946452 = 3198551987886863514642434571 * 3836926249673359612. +-3198551987886863514642434571 = -(3198551987886863514642434571). +3198551987886863514642434571 = +(3198551987886863514642434571). +833623525 = 3198551987886863514642434571 div 3836926249673359612. +2469127376294362271 = 3198551987886863514642434571 rem 3836926249673359612. +3758253958181683208 = 3198551987886863514642434571 band 3836926249673359612. +3198551987965535806134110975 = 3198551987886863514642434571 bor 3836926249673359612. +3198551984207281847952427767 = 3198551987886863514642434571 bxor 3836926249673359612. +-3198551987886863514642434572 = bnot(3198551987886863514642434571). +173393850 = 3198551987886863514642434571 bsl -64. +59002869927003905065155415068870526795027316736 = 3198551987886863514642434571 bsr -64. +-439573608517099225018102502 = 47624424382333611295892 + -439621232941481558629398394. +439668857365863892240694286 = 47624424382333611295892 - -439621232941481558629398394. +-20936708165089858529216529838982016081590683597448 = 47624424382333611295892 * -439621232941481558629398394. +-47624424382333611295892 = -(47624424382333611295892). +47624424382333611295892 = +(47624424382333611295892). +0 = 47624424382333611295892 div -439621232941481558629398394. +47624424382333611295892 = 47624424382333611295892 rem -439621232941481558629398394. +47614587867083402395780 = 47624424382333611295892 band -439621232941481558629398394. +-439621223104966308420498282 = 47624424382333611295892 bor -439621232941481558629398394. +-439668837692833391822894062 = 47624424382333611295892 bxor -439621232941481558629398394. +-47624424382333611295893 = bnot(47624424382333611295892). +5953053047791701411986 = 47624424382333611295892 bsl -3. +380995395058668890367136 = 47624424382333611295892 bsr -3. +-89689944725641365990750893772 = -89688946256488841397951674395 + -998469152524592799219377. +-89687947787336316805152455018 = -89688946256488841397951674395 - -998469152524592799219377. +89551646159540163343803048054284057336968126078751915 = -89688946256488841397951674395 * -998469152524592799219377. +89688946256488841397951674395 = -(-89688946256488841397951674395). +-89688946256488841397951674395 = +(-89688946256488841397951674395). +89826 = -89688946256488841397951674395 div -998469152524592799219377. +-456161814768615271915993 = -89688946256488841397951674395 rem -998469152524592799219377. +-89688957491206761847796203195 = -89688946256488841397951674395 band -998469152524592799219377. +-987234434604142954690577 = -89688946256488841397951674395 bor -998469152524592799219377. +89687970256772157704841512618 = -89688946256488841397951674395 bxor -998469152524592799219377. +89688946256488841397951674394 = bnot(-89688946256488841397951674395). +-1577824628671779641725474254499699039928320 = -89688946256488841397951674395 bsl 44. +-5098226339242095 = -89688946256488841397951674395 bsr 44. +-107944578653 = -7956649228 + -99987929425. +92031280197 = -7956649228 - -99987929425. +795568881468744733900 = -7956649228 * -99987929425. +7956649228 = -(-7956649228). +-7956649228 = +(-7956649228). +0 = -7956649228 div -99987929425. +-7956649228 = -7956649228 rem -99987929425. +-102542277980 = -7956649228 band -99987929425. +-5402300673 = -7956649228 bor -99987929425. +97139977307 = -7956649228 bxor -99987929425. +7956649227 = bnot(-7956649228). +-124322645 = -7956649228 bsl -6. +-509225550592 = -7956649228 bsr -6. +-51547258647535796118556002179 = -51547258555743582681958687423 + -91792213436597314756. +-51547258463951369245361372667 = -51547258555743582681958687423 - -91792213436597314756. +4731636959420281983396358032954664794408149513788 = -51547258555743582681958687423 * -91792213436597314756. +51547258555743582681958687423 = -(-51547258555743582681958687423). +-51547258555743582681958687423 = +(-51547258555743582681958687423). +561564610 = -51547258555743582681958687423 div -91792213436597314756. +-16184051893958302263 = -51547258555743582681958687423 rem -91792213436597314756. +-51547258563298109923031492352 = -51547258555743582681958687423 band -91792213436597314756. +-84237686195524509827 = -51547258555743582681958687423 bor -91792213436597314756. +51547258479060423727506982525 = -51547258555743582681958687423 bxor -91792213436597314756. +51547258555743582681958687422 = bnot(-51547258555743582681958687423). +-206189034222974330727834749692 = -51547258555743582681958687423 bsl 2. +-12886814638935895670489671856 = -51547258555743582681958687423 bsr 2. +-224891864892188194404827 = -75871363 + -224891864892188118533464. +224891864892188042662101 = -75871363 - -224891864892188118533464. +17062852316982160605539474791432 = -75871363 * -224891864892188118533464. +75871363 = -(-75871363). +-75871363 = +(-75871363). +0 = -75871363 div -224891864892188118533464. +-75871363 = -75871363 rem -224891864892188118533464. +-224891864892188118611416 = -75871363 band -224891864892188118533464. +-75793411 = -75871363 bor -224891864892188118533464. +224891864892188042818005 = -75871363 bxor -224891864892188118533464. +75871362 = bnot(-75871363). +-14456257168929956743916818538905745587330375758255603855674002658551814160518532039738027833047217492154099127703139584735390894188138005134344978432 = -75871363 bsl 466. +-1 = -75871363 bsr 466. +-92626589181922614192054168450 = -92626589178671292863737413479 + -3251321328316754971. +-92626589175419971535420658508 = -92626589178671292863737413479 - -3251321328316754971. +301158804965847909758322589425413031470155654109 = -92626589178671292863737413479 * -3251321328316754971. +92626589178671292863737413479 = -(-92626589178671292863737413479). +-92626589178671292863737413479 = +(-92626589178671292863737413479). +28488906455 = -92626589178671292863737413479 div -3251321328316754971. +-1108917885762175674 = -92626589178671292863737413479 rem -3251321328316754971. +-92626589180980516345207242623 = -92626589178671292863737413479 band -3251321328316754971. +-942097846846925827 = -92626589178671292863737413479 bor -3251321328316754971. +92626589180038418498360316796 = -92626589178671292863737413479 bxor -3251321328316754971. +92626589178671292863737413478 = bnot(-92626589178671292863737413479). +-21566308377932592497 = -92626589178671292863737413479 bsl -32. +-397828171262420703583790375223934582784 = -92626589178671292863737413479 bsr -32. +81117343425000610841 = 81117343429423544534 + -4422933693. +81117343433846478227 = 81117343429423544534 - -4422933693. +-358776631340649562686914584062 = 81117343429423544534 * -4422933693. +-81117343429423544534 = -(81117343429423544534). +81117343429423544534 = +(81117343429423544534). +-18340167196 = 81117343429423544534 div -4422933693. +2981809706 = 81117343429423544534 rem -4422933693. +81117343429387886658 = 81117343429423544534 band -4422933693. +-4387275817 = 81117343429423544534 bor -4422933693. +-81117343433775162475 = 81117343429423544534 bxor -4422933693. +-81117343429423544535 = bnot(81117343429423544534). +0 = 81117343429423544534 bsl -75. +3064526590324287910001030154146913621901312 = 81117343429423544534 bsr -75. +2289828191515276228 = 897 + 2289828191515275331. +-2289828191515274434 = 897 - 2289828191515275331. +2053975887789201971907 = 897 * 2289828191515275331. +-897 = -(897). +897 = +(897). +0 = 897 div 2289828191515275331. +897 = 897 rem 2289828191515275331. +1 = 897 band 2289828191515275331. +2289828191515276227 = 897 bor 2289828191515275331. +2289828191515276226 = 897 bxor 2289828191515275331. +-898 = bnot(897). +0 = 897 bsl -77. +135550807524290296213929984 = 897 bsr -77. +9192773900209659062759187325 = 8917952238734891769776674856 + 274821661474767292982512469. +8643130577260124476794162387 = 8917952238734891769776674856 - 274821661474767292982512469. +2450846451201743538156756726936311131318670343378779464 = 8917952238734891769776674856 * 274821661474767292982512469. +-8917952238734891769776674856 = -(8917952238734891769776674856). +8917952238734891769776674856 = +(8917952238734891769776674856). +32 = 8917952238734891769776674856 div 274821661474767292982512469. +123659071542338394336275848 = 8917952238734891769776674856 rem 274821661474767292982512469. +232424254142200712549107712 = 8917952238734891769776674856 band 274821661474767292982512469. +8960349646067458350210079613 = 8917952238734891769776674856 bor 274821661474767292982512469. +8727925391925257637660971901 = 8917952238734891769776674856 bxor 274821661474767292982512469. +-8917952238734891769776674857 = bnot(8917952238734891769776674856). +0 = 8917952238734891769776674856 bsl -584. +564654261126213671114483452323326413544879874913914808333671107414843491072816921551217451075660814076529724813634685375060836733551015518497888460292811462963241339175888195957918257118982987786271850496 = 8917952238734891769776674856 bsr -584. +584763 = 427 + 584336. +-583909 = 427 - 584336. +249511472 = 427 * 584336. +-427 = -(427). +427 = +(427). +0 = 427 div 584336. +427 = 427 rem 584336. +128 = 427 band 584336. +584635 = 427 bor 584336. +584507 = 427 bxor 584336. +-428 = bnot(427). +4228803174198859019055408349184 = 427 bsl 93. +0 = 427 bsr 93. +2873569340219161220 = 7391242189536 + 2873561948976971684. +-2873554557734782148 = 7391242189536 - 2873561948976971684. +21239192311523887704890833098624 = 7391242189536 * 2873561948976971684. +-7391242189536 = -(7391242189536). +7391242189536 = +(7391242189536). +0 = 7391242189536 div 2873561948976971684. +7391242189536 = 7391242189536 rem 2873561948976971684. +103756167840 = 7391242189536 band 2873561948976971684. +2873569236462993380 = 7391242189536 bor 2873561948976971684. +2873569132706825540 = 7391242189536 bxor 2873561948976971684. +-7391242189537 = bnot(7391242189536). +17043044132146902307495080886272 = 7391242189536 bsl 61. +0 = 7391242189536 bsr 61. +73238685419183094543 = -3683395 + 73238685419186777938. +-73238685419190461333 = -3683395 - 73238685419186777938. +-269767007679605481922939510 = -3683395 * 73238685419186777938. +3683395 = -(-3683395). +-3683395 = +(-3683395). +0 = -3683395 div 73238685419186777938. +-3683395 = -3683395 rem 73238685419186777938. +73238685419183622928 = -3683395 band 73238685419186777938. +-528385 = -3683395 bor 73238685419186777938. +-73238685419184151313 = -3683395 bxor 73238685419186777938. +3683394 = bnot(-3683395). +-1 = -3683395 bsl -844. +-432080467963048262555853318747661237135491073876285524679401425413095676321779140263983609193746870415010306742107002773190381670106317989361810254628326460421320780438073712482013284075623886968942998082030670994745774987273376488656463788581076528831733432320 = -3683395 bsr -844. +92722951385418647291709 = 558134 + 92722951385418646733575. +-92722951385418646175441 = 558134 - 92722951385418646733575. +51751831748549250975997149050 = 558134 * 92722951385418646733575. +-558134 = -(558134). +558134 = +(558134). +0 = 558134 div 92722951385418646733575. +558134 = 558134 rem 92722951385418646733575. +32774 = 558134 band 92722951385418646733575. +92722951385418647258935 = 558134 bor 92722951385418646733575. +92722951385418647226161 = 558134 bxor 92722951385418646733575. +-558135 = bnot(558134). +321742345526118965051392 = 558134 bsl 59. +0 = 558134 bsr 59. +-63546419921881191 = -497245399 + -63546419424635792. +63546418927390393 = -497245399 - -63546419424635792. +31598164681824374822721008 = -497245399 * -63546419424635792. +497245399 = -(-497245399). +-497245399 = +(-497245399). +0 = -497245399 div -63546419424635792. +-497245399 = -497245399 rem -63546419424635792. +-63546419443662816 = -497245399 band -63546419424635792. +-478218375 = -497245399 bor -63546419424635792. +63546418965444441 = -497245399 bxor -63546419424635792. +497245398 = bnot(-497245399). +-1942365 = -497245399 bsl -8. +-127294822144 = -497245399 bsr -8. +-35008318338433879811771391803 = -34379533892997313329548513238 + -628784445436566482222878565. +-33750749447560746847325634673 = -34379533892997313329548513238 - -628784445436566482222878565. +21617316153275957220539326692103788726389233444368943470 = -34379533892997313329548513238 * -628784445436566482222878565. +34379533892997313329548513238 = -(-34379533892997313329548513238). +-34379533892997313329548513238 = +(-34379533892997313329548513238). +54 = -34379533892997313329548513238 div -628784445436566482222878565. +-425173839422723289513070728 = -34379533892997313329548513238 rem -628784445436566482222878565. +-34389252543110051313847685110 = -34379533892997313329548513238 band -628784445436566482222878565. +-619065795323828497923706693 = -34379533892997313329548513238 bor -628784445436566482222878565. +33770186747786222815923978417 = -34379533892997313329548513238 bxor -628784445436566482222878565. +34379533892997313329548513237 = bnot(-34379533892997313329548513238). +-8196719620942428905857 = -34379533892997313329548513238 bsl -22. +-144198216525534203287378647268196352 = -34379533892997313329548513238 bsr -22. +-94420 = 545 + -94965. +95510 = 545 - -94965. +-51755925 = 545 * -94965. +-545 = -(545). +545 = +(545). +0 = 545 div -94965. +545 = 545 rem -94965. +1 = 545 band -94965. +-94421 = 545 bor -94965. +-94422 = 545 bxor -94965. +-546 = bnot(545). +0 = 545 bsl -44. +9587741394206720 = 545 bsr -44. +2795644593395452536265 = 2795644593395373913827 + 78622438. +2795644593395295291389 = 2795644593395373913827 - 78622438. +219800393714262995026680650226 = 2795644593395373913827 * 78622438. +-2795644593395373913827 = -(2795644593395373913827). +2795644593395373913827 = +(2795644593395373913827). +35557846646721 = 2795644593395373913827 div 78622438. +44188029 = 2795644593395373913827 rem 78622438. +76490466 = 2795644593395373913827 band 78622438. +2795644593395376045799 = 2795644593395373913827 bor 78622438. +2795644593395299555333 = 2795644593395373913827 bxor 78622438. +-2795644593395373913828 = bnot(2795644593395373913827). +698911148348843478456 = 2795644593395373913827 bsl -2. +11182578373581495655308 = 2795644593395373913827 bsr -2. +-8787568974423759098778 = -8787568974423759158612 + 59834. +-8787568974423759218446 = -8787568974423759158612 - 59834. +-525795402015671205496390408 = -8787568974423759158612 * 59834. +8787568974423759158612 = -(-8787568974423759158612). +-8787568974423759158612 = +(-8787568974423759158612). +-146865811652634942 = -8787568974423759158612 div 59834. +-38984 = -8787568974423759158612 rem 59834. +32936 = -8787568974423759158612 band 59834. +-8787568974423759131714 = -8787568974423759158612 bor 59834. +-8787568974423759164650 = -8787568974423759158612 bxor 59834. +8787568974423759158611 = bnot(-8787568974423759158612). +-1 = -8787568974423759158612 bsl -579. +-17387463699334606574369673082096282686305542007575594251570474477704968929224742151269560686612629435515287574348276272141023568588788324161754188375467588140470398322054786885776003241773530873856 = -8787568974423759158612 bsr -579. +-44295264476766669313925 = 2264128488185265259789 + -46559392964951934573714. +48823521453137199833503 = 2264128488185265259789 - -46559392964951934573714. +-105416448004560298652327962495129255180586346 = 2264128488185265259789 * -46559392964951934573714. +-2264128488185265259789 = -(2264128488185265259789). +2264128488185265259789 = +(2264128488185265259789). +0 = 2264128488185265259789 div -46559392964951934573714. +2264128488185265259789 = 2264128488185265259789 rem -46559392964951934573714. +590302565758291542284 = 2264128488185265259789 band -46559392964951934573714. +-44885567042524960856209 = 2264128488185265259789 bor -46559392964951934573714. +-45475869608283252398493 = 2264128488185265259789 bxor -46559392964951934573714. +-2264128488185265259790 = bnot(2264128488185265259789). +35377007627894769684 = 2264128488185265259789 bsl -6. +144904223243856976626496 = 2264128488185265259789 bsr -6. +-61546169223333011082 = -61546169215361312324 + -7971698758. +-61546169207389613566 = -61546169215361312324 - -7971698758. +490627520693753607974480893592 = -61546169215361312324 * -7971698758. +61546169215361312324 = -(-61546169215361312324). +-61546169215361312324 = +(-61546169215361312324). +7720583916 = -61546169215361312324 div -7971698758. +-1149335996 = -61546169215361312324 rem -7971698758. +-61546169219790896712 = -61546169215361312324 band -7971698758. +-3542114370 = -61546169215361312324 bor -7971698758. +61546169216248782342 = -61546169215361312324 bxor -7971698758. +61546169215361312323 = bnot(-61546169215361312324). +-121777909929335523574588157034445100959831387059408680082411440556553243672720190039604708970499490782835119930156702044709277648871091652309490418630295508362600151076627660779355865587239616512 = -61546169215361312324 bsl 579. +-1 = -61546169215361312324 bsr 579. +23649639883984821896606 = 23649639883984817244112 + 4652494. +23649639883984812591618 = 23649639883984817244112 - 4652494. +110029807662400058319327615328 = 23649639883984817244112 * 4652494. +-23649639883984817244112 = -(23649639883984817244112). +23649639883984817244112 = +(23649639883984817244112). +5083217707316724 = 23649639883984817244112 div 4652494. +2734456 = 23649639883984817244112 rem 4652494. +4343232 = 23649639883984817244112 band 4652494. +23649639883984817553374 = 23649639883984817244112 bor 4652494. +23649639883984813210142 = 23649639883984817244112 bxor 4652494. +-23649639883984817244113 = bnot(23649639883984817244112). +175260237560112780376561341239759785667109378118687222490628883487671117225086117574386608280067637248 = 23649639883984817244112 bsl 262. +0 = 23649639883984817244112 bsr 262. +86829374765368359338103465 = -7856119756 + 86829374765368367194223221. +-86829374765368375050342977 = -7856119756 - 86829374765368367194223221. +-682141966495338294131999335572054076 = -7856119756 * 86829374765368367194223221. +7856119756 = -(-7856119756). +-7856119756 = +(-7856119756). +0 = -7856119756 div 86829374765368367194223221. +-7856119756 = -7856119756 rem 86829374765368367194223221. +86829374765368366858510388 = -7856119756 band 86829374765368367194223221. +-7520406923 = -7856119756 bor 86829374765368367194223221. +-86829374765368374378917311 = -7856119756 bxor 86829374765368367194223221. +7856119755 = bnot(-7856119756). +-982014970 = -7856119756 bsl -3. +-62848958048 = -7856119756 bsr -3. +362130164919076 = 522657498 + 362129642261578. +-362129119604080 = 522657498 - 362129642261578. +189269772776071419011844 = 522657498 * 362129642261578. +-522657498 = -(522657498). +522657498 = +(522657498). +0 = 522657498 div 362129642261578. +522657498 = 522657498 rem 362129642261578. +2100298 = 522657498 band 362129642261578. +362130162818778 = 522657498 bor 362129642261578. +362130160718480 = 522657498 bxor 362129642261578. +-522657499 = bnot(522657498). +65332187 = 522657498 bsl -3. +4181259984 = 522657498 bsr -3. +244396629458857238594742 = 244396629458857238497869 + 96873. +244396629458857238400996 = 244396629458857238497869 - 96873. +23675434685567877265004063637 = 244396629458857238497869 * 96873. +-244396629458857238497869 = -(244396629458857238497869). +244396629458857238497869 = +(244396629458857238497869). +2522856001763724035 = 244396629458857238497869 div 96873. +55314 = 244396629458857238497869 rem 96873. +2633 = 244396629458857238497869 band 96873. +244396629458857238592109 = 244396629458857238497869 bor 96873. +244396629458857238589476 = 244396629458857238497869 bxor 96873. +-244396629458857238497870 = bnot(244396629458857238497869). +0 = 244396629458857238497869 bsl -748. +361852826053798945056603619852469940983689527163516744953429110981220955101854721603121186998792297986447974170815227941556273391909578309489775202609859011419169533779429522341079176324810902171648165179355508332095987761507345817482628118624600064 = 244396629458857238497869 bsr -748. +9425386805 = -884964 + 9426271769. +-9427156733 = -884964 - 9426271769. +-8341911169781316 = -884964 * 9426271769. +884964 = -(-884964). +-884964 = +(-884964). +0 = -884964 div 9426271769. +-884964 = -884964 rem 9426271769. +9425681944 = -884964 band 9426271769. +-295139 = -884964 bor 9426271769. +-9425977083 = -884964 bxor 9426271769. +884963 = bnot(-884964). +-1 = -884964 bsl -32. +-3800891438137344 = -884964 bsr -32. +-52275425127615427747385716 = -52275425127615134534422791 + -293212962925. +-52275425127614841321459866 = -52275425127615134534422791 - -293212962925. +15327832289832029835910596953758023675 = -52275425127615134534422791 * -293212962925. +52275425127615134534422791 = -(-52275425127615134534422791). +-52275425127615134534422791 = +(-52275425127615134534422791). +178284836407408 = -52275425127615134534422791 div -293212962925. +-122435074391 = -52275425127615134534422791 rem -293212962925. +-52275425127615135676879215 = -52275425127615134534422791 band -293212962925. +-292070506501 = -52275425127615134534422791 bor -293212962925. +52275425127614843606372714 = -52275425127615134534422791 bxor -293212962925. +52275425127615134534422790 = bnot(-52275425127615134534422791). +-102100439702373309637545 = -52275425127615134534422791 bsl -9. +-26765017665338948881624468992 = -52275425127615134534422791 bsr -9. +-5791622013186222891 = 21325272293193394 + -5812947285479416285. +5834272557772609679 = 21325272293193394 - -5812947285479416285. +-123962683688827946451651497738021290 = 21325272293193394 * -5812947285479416285. +-21325272293193394 = -(21325272293193394). +21325272293193394 = +(21325272293193394). +0 = 21325272293193394 div -5812947285479416285. +21325272293193394 = 21325272293193394 rem -5812947285479416285. +18088310044104226 = 21325272293193394 band -5812947285479416285. +-5809710323230327117 = 21325272293193394 bor -5812947285479416285. +-5827798633274431343 = 21325272293193394 bxor -5812947285479416285. +-21325272293193395 = bnot(21325272293193394). +0 = 21325272293193394 bsl -72. +100705751115445181549959465091385524224 = 21325272293193394 bsr -72. +-817650 = -817625 + -25. +-817600 = -817625 - -25. +20440625 = -817625 * -25. +817625 = -(-817625). +-817625 = +(-817625). +32705 = -817625 div -25. +0 = -817625 rem -25. +-817625 = -817625 band -25. +-25 = -817625 bor -25. +817600 = -817625 bxor -25. +817624 = bnot(-817625). +-494223986631205589484568576000 = -817625 bsl 79. +-1 = -817625 bsr 79. +-61546673668249674831 = -61546673668249682778 + 7947. +-61546673668249690725 = -61546673668249682778 - 7947. +-489111415641580229036766 = -61546673668249682778 * 7947. +61546673668249682778 = -(-61546673668249682778). +-61546673668249682778 = +(-61546673668249682778). +-7744642464860913 = -61546673668249682778 div 7947. +-7167 = -61546673668249682778 rem 7947. +7170 = -61546673668249682778 band 7947. +-61546673668249682001 = -61546673668249682778 bor 7947. +-61546673668249689171 = -61546673668249682778 bxor 7947. +61546673668249682777 = bnot(-61546673668249682778). +-12296527315240313535790507724854437742769532445677260456347466338808971349679816879668566025398914953954251685556928523433067603371295396887270529671962667521138491392 = -61546673668249682778 bsl 486. +-1 = -61546673668249682778 bsr 486. +-27965925300435250777907714 = -27965925294615931585626426 + -5819319192281288. +-27965925288796612393345138 = -27965925294615931585626426 - -5819319192281288. +162742645796863224139466778328025478116688 = -27965925294615931585626426 * -5819319192281288. +27965925294615931585626426 = -(-27965925294615931585626426). +-27965925294615931585626426 = +(-27965925294615931585626426). +4805703961 = -27965925294615931585626426 div -5819319192281288. +-1946425217844658 = -27965925294615931585626426 rem -5819319192281288. +-27965925294756682026148352 = -27965925294615931585626426 band -5819319192281288. +-5678568751759362 = -27965925294615931585626426 bor -5819319192281288. +27965925289078113274388990 = -27965925294615931585626426 bxor -5819319192281288. +27965925294615931585626425 = bnot(-27965925294615931585626426). +-15374430021472587653227382187950604288 = -27965925294615931585626426 bsl 39. +-50869721771262 = -27965925294615931585626426 bsr 39. +-331224228819562 = 2873623 + -331224231693185. +331224234566808 = 2873623 - -331224231693185. +-951813570350865359255 = 2873623 * -331224231693185. +-2873623 = -(2873623). +2873623 = +(2873623). +0 = 2873623 div -331224231693185. +2873623 = 2873623 rem -331224231693185. +4119 = 2873623 band -331224231693185. +-331224228823681 = 2873623 bor -331224231693185. +-331224228827800 = 2873623 bxor -331224231693185. +-2873624 = bnot(2873623). +0 = 2873623 bsl -34. +49368467224133632 = 2873623 bsr -34. +-8565982141776 = -8565982141871 + 95. +-8565982141966 = -8565982141871 - 95. +-813768303477745 = -8565982141871 * 95. +8565982141871 = -(-8565982141871). +-8565982141871 = +(-8565982141871). +-90168233072 = -8565982141871 div 95. +-31 = -8565982141871 rem 95. +81 = -8565982141871 band 95. +-8565982141857 = -8565982141871 bor 95. +-8565982141938 = -8565982141871 bxor 95. +8565982141870 = bnot(-8565982141871). +-1 = -8565982141871 bsl -877. +-8631442106926386804633469430411434898438751867311358071196192924586562956798386296912193704448921210697577795369113498160118240574191024547489063711324965470124352836122308377305392149641151166260838018968859937647572032501383839126081894291756559516775212532659331407556902912 = -8565982141871 bsr -877. +-672377636817477109183605829215 = -2381459636356532 + -672377636817474727723969472683. +672377636817472346264333116151 = -2381459636356532 - -672377636817474727723969472683. +1601240202469607707134531348515651407422615356 = -2381459636356532 * -672377636817474727723969472683. +2381459636356532 = -(-2381459636356532). +-2381459636356532 = +(-2381459636356532). +0 = -2381459636356532 div -672377636817474727723969472683. +-2381459636356532 = -2381459636356532 rem -672377636817474727723969472683. +-672377636817477033279646264764 = -2381459636356532 band -672377636817474727723969472683. +-75903959564451 = -2381459636356532 bor -672377636817474727723969472683. +672377636817476957375686700313 = -2381459636356532 bxor -672377636817474727723969472683. +2381459636356531 = bnot(-2381459636356532). +-1 = -2381459636356532 bsl -793. +-124059431457391911820834127222744003825780855300797096084676852440688587721933431499226186664140076792406508037832096528642693463799600994501404016585580340103134786630206913198714638849726646741120678936315390537699641011434629481596256055697334645817344 = -2381459636356532 bsr -793. +243423426533490497385 = -2752962661628964252 + 246176389195119461637. +-248929351856748425889 = -2752962661628964252 - 246176389195119461637. +-677714407628803869811252130296158400524 = -2752962661628964252 * 246176389195119461637. +2752962661628964252 = -(-2752962661628964252). +-2752962661628964252 = +(-2752962661628964252). +0 = -2752962661628964252 div 246176389195119461637. +-2752962661628964252 = -2752962661628964252 rem 246176389195119461637. +246167319718196674564 = -2752962661628964252 band 246176389195119461637. +-2743893184706177179 = -2752962661628964252 bor 246176389195119461637. +-248911212902902851743 = -2752962661628964252 bxor 246176389195119461637. +2752962661628964251 = bnot(-2752962661628964252). +-1 = -2752962661628964252 bsl -344. +-98654938348724579057088257125813202232942319359331674402848732439372762784482382719112423178289753421639095077566867832832 = -2752962661628964252 bsr -344. +59563200878650243717310553 = 387926856318447916625 + 59562812951793925269393928. +-59562425024937606821477303 = 387926856318447916625 - 59562812951793925269393928. +23106014781873150682478281572899806248025253000 = 387926856318447916625 * 59562812951793925269393928. +-387926856318447916625 = -(387926856318447916625). +387926856318447916625 = +(387926856318447916625). +0 = 387926856318447916625 div 59562812951793925269393928. +387926856318447916625 = 387926856318447916625 rem 59562812951793925269393928. +504697853253652992 = 387926856318447916625 band 59562812951793925269393928. +59563200373952390463657561 = 387926856318447916625 bor 59562812951793925269393928. +59563199869254537210004569 = 387926856318447916625 bxor 59562812951793925269393928. +-387926856318447916626 = bnot(387926856318447916625). +0 = 387926856318447916625 bsl -339. +434428568394404113651715053735778402879314662187017182623400694761038553681201573026512080787373278668453710770196185088000 = 387926856318447916625 bsr -339. +-398144453763324514738573635323 = -398144453763324514738573635261 + -62. +-398144453763324514738573635199 = -398144453763324514738573635261 - -62. +24684956133326119913791565386182 = -398144453763324514738573635261 * -62. +398144453763324514738573635261 = -(-398144453763324514738573635261). +-398144453763324514738573635261 = +(-398144453763324514738573635261). +6421684738118137334493123149 = -398144453763324514738573635261 div -62. +-23 = -398144453763324514738573635261 rem -62. +-398144453763324514738573635262 = -398144453763324514738573635261 band -62. +-61 = -398144453763324514738573635261 bor -62. +398144453763324514738573635201 = -398144453763324514738573635261 bxor -62. +398144453763324514738573635260 = bnot(-398144453763324514738573635261). +-66658626423574540504601335910866168511615294895439043499808639641139326582462538933358943305828698678104818612542582390243992313525876300514024008852709600577683640004396953447056036298558556275689987750562606287020911012956502425536525446485803440775585979670704756615591316235396069700234868591477005062590091593068392872935424 = -398144453763324514738573635261 bsl 994. +-1 = -398144453763324514738573635261 bsr 994. +-9214385556315649651785 = -23732441 + -9214385556315625919344. +9214385556315602186903 = -23732441 - -9214385556315625919344. +218679861566512769508902238704 = -23732441 * -9214385556315625919344. +23732441 = -(-23732441). +-23732441 = +(-23732441). +0 = -23732441 div -9214385556315625919344. +-23732441 = -23732441 rem -9214385556315625919344. +-9214385556315632743424 = -23732441 band -9214385556315625919344. +-16908361 = -23732441 bor -9214385556315625919344. +9214385556315615835063 = -23732441 bxor -9214385556315625919344. +23732440 = bnot(-23732441). +-189859528 = -23732441 bsl 3. +-2966556 = -23732441 bsr 3. +-5372494371976352850019706251 = -5372494272395186453391223932 + -99581166396628482319. +-5372494172814020056762741613 = -5372494272395186453391223932 - -99581166396628482319. +534999246104318529343725713325254090903031658308 = -5372494272395186453391223932 * -99581166396628482319. +5372494272395186453391223932 = -(-5372494272395186453391223932). +-5372494272395186453391223932 = +(-5372494272395186453391223932). +53950907 = -5372494272395186453391223932 div -99581166396628482319. +-25179158090247710599 = -5372494272395186453391223932 rem -99581166396628482319. +-5372494371618570459932474752 = -5372494272395186453391223932 band -99581166396628482319. +-357782390087231499 = -5372494272395186453391223932 bor -99581166396628482319. +5372494371260788069845243253 = -5372494272395186453391223932 bxor -99581166396628482319. +5372494272395186453391223931 = bnot(-5372494272395186453391223932). +-1 = -5372494272395186453391223932 bsl -854. +-645345458602619608664758166580222950342667274088042452990234746151398093692985776277122254975220509919775283657920615386043642023172791487611710501770303088256267014951620113959939334848651815055530778938513276209771519928127843414309468085959460683078343358732552273870214550507225088 = -5372494272395186453391223932 bsr -854. +-622311400235520025 = -622311491388362663 + 91152842638. +-622311582541205301 = -622311491388362663 - 91152842638. +-56725461446342513964913624994 = -622311491388362663 * 91152842638. +622311491388362663 = -(-622311491388362663). +-622311491388362663 = +(-622311491388362663). +-6827121 = -622311491388362663 div 91152842638. +-5204777465 = -622311491388362663 rem 91152842638. +86572609544 = -622311491388362663 band 91152842638. +-622311486808129569 = -622311491388362663 bor 91152842638. +-622311573380739113 = -622311491388362663 bxor 91152842638. +622311491388362662 = bnot(-622311491388362663). +-175165112545312982471309344636928 = -622311491388362663 bsl 48. +-2211 = -622311491388362663 bsr 48. +-45751395297 = -45751395299 + 2. +-45751395301 = -45751395299 - 2. +-91502790598 = -45751395299 * 2. +45751395299 = -(-45751395299). +-45751395299 = +(-45751395299). +-22875697649 = -45751395299 div 2. +-1 = -45751395299 rem 2. +0 = -45751395299 band 2. +-45751395297 = -45751395299 bor 2. +-45751395297 = -45751395299 bxor 2. +45751395298 = bnot(-45751395299). +-210991070023942822323915063296 = -45751395299 bsl 62. +-1 = -45751395299 bsr 62. +649148398141948497246 = 83997982 + 649148398141864499264. +-649148398141780501282 = 83997982 - 649148398141864499264. +54527155462449167655616485248 = 83997982 * 649148398141864499264. +-83997982 = -(83997982). +83997982 = +(83997982). +0 = 83997982 div 649148398141864499264. +83997982 = 83997982 rem 649148398141864499264. +83955712 = 83997982 band 649148398141864499264. +649148398141864541534 = 83997982 bor 649148398141864499264. +649148398141780585822 = 83997982 bxor 649148398141864499264. +-83997983 = bnot(83997982). +0 = 83997982 bsl -58. +24210769947844712341700608 = 83997982 bsr -58. +-53736505071733726558540 = -53727351395785129141971 + -9153675948597416569. +-53718197719836531725402 = -53727351395785129141971 - -9153675948597416569. +491802764253440175135261132926726228717499 = -53727351395785129141971 * -9153675948597416569. +53727351395785129141971 = -(-53727351395785129141971). +-53727351395785129141971 = +(-53727351395785129141971). +5869 = -53727351395785129141971 div -9153675948597416569. +-4427253466891298510 = -53727351395785129141971 rem -9153675948597416569. +-53735349860211478214395 = -53727351395785129141971 band -9153675948597416569. +-1155211522248344145 = -53727351395785129141971 bor -9153675948597416569. +53734194648689229870250 = -53727351395785129141971 bxor -9153675948597416569. +53727351395785129141970 = bnot(-53727351395785129141971). +-3127343451825 = -53727351395785129141971 bsl -34. +-923028868582388327631607943921664 = -53727351395785129141971 bsr -34. +96451138707169 = 96451212451614 + -73744445. +96451286196059 = 96451212451614 - -73744445. +-7112741131821363784230 = 96451212451614 * -73744445. +-96451212451614 = -(96451212451614). +96451212451614 = +(96451212451614). +-1307911 = 96451212451614 div -73744445. +41647219 = 96451212451614 rem -73744445. +96451141082882 = 96451212451614 band -73744445. +-2375713 = 96451212451614 bor -73744445. +-96451143458595 = 96451212451614 bxor -73744445. +-96451212451615 = bnot(96451212451614). +49383020775226368 = 96451212451614 bsl 9. +188381274319 = 96451212451614 bsr 9. +-57601894722972806209645 = -57667814637436523686832 + 65919914463717477187. +-57733734551900241164019 = -57667814637436523686832 - 65919914463717477187. +-3801457408209330340454544221357103092301584 = -57667814637436523686832 * 65919914463717477187. +57667814637436523686832 = -(-57667814637436523686832). +-57667814637436523686832 = +(-57667814637436523686832). +-874 = -57667814637436523686832 div 65919914463717477187. +-53809396147448625394 = -57667814637436523686832 rem 65919914463717477187. +28985752554527866944 = -57667814637436523686832 band 65919914463717477187. +-57630880475527334076589 = -57667814637436523686832 bor 65919914463717477187. +-57659866228081861943533 = -57667814637436523686832 bxor 65919914463717477187. +57667814637436523686831 = bnot(-57667814637436523686832). +-461342517099492189494656 = -57667814637436523686832 bsl 3. +-7208476829679565460854 = -57667814637436523686832 bsr 3. +5495366208771220 = 5495368997358978 + -2788587758. +5495371785946736 = 5495368997358978 - -2788587758. +-15324318711727980382191324 = 5495368997358978 * -2788587758. +-5495368997358978 = -(5495368997358978). +5495368997358978 = +(5495368997358978). +-1970663 = 5495368997358978 div -2788587758. +2280415424 = 5495368997358978 rem -2788587758. +5495368926692610 = 5495368997358978 band -2788587758. +-2717921390 = 5495368997358978 bor -2788587758. +-5495371644614000 = 5495368997358978 bxor -2788587758. +-5495368997358979 = bnot(5495368997358978). +0 = 5495368997358978 bsl -453. +127815903730368892198224471153194858502094152297957879933628492677771799528319523153257752893153933771965334340879654516057785486043490331701019647410176 = 5495368997358978 bsr -453. +-82828718716766876699 = -5674763721141391318 + -77153954995625485381. +71479191274484094063 = -5674763721141391318 - -77153954995625485381. +437830464751751117528858834313409322158 = -5674763721141391318 * -77153954995625485381. +5674763721141391318 = -(-5674763721141391318). +-5674763721141391318 = +(-5674763721141391318). +0 = -5674763721141391318 div -77153954995625485381. +-5674763721141391318 = -5674763721141391318 rem -77153954995625485381. +-81783662566975434710 = -5674763721141391318 band -77153954995625485381. +-1045056149791441989 = -5674763721141391318 bor -77153954995625485381. +80738606417183992721 = -5674763721141391318 bxor -77153954995625485381. +5674763721141391317 = bnot(-5674763721141391318). +-1452739512612196177408 = -5674763721141391318 bsl 8. +-22167045785708560 = -5674763721141391318 bsr 8. +62049501291561 = 7638117936322 + 54411383355239. +-46773265418917 = 7638117936322 - 54411383355239. +415600563145743330907090958 = 7638117936322 * 54411383355239. +-7638117936322 = -(7638117936322). +7638117936322 = +(7638117936322). +0 = 7638117936322 div 54411383355239. +7638117936322 = 7638117936322 rem 54411383355239. +481624335426 = 7638117936322 band 54411383355239. +61567876956135 = 7638117936322 bor 54411383355239. +61086252620709 = 7638117936322 bxor 54411383355239. +-7638117936323 = bnot(7638117936322). +30552471745288 = 7638117936322 bsl 2. +1909529484080 = 7638117936322 bsr 2. +718248518674927168763 = -79 + 718248518674927168842. +-718248518674927168921 = -79 - 718248518674927168842. +-56741632975319246338518 = -79 * 718248518674927168842. +79 = -(-79). +-79 = +(-79). +0 = -79 div 718248518674927168842. +-79 = -79 rem 718248518674927168842. +718248518674927168768 = -79 band 718248518674927168842. +-5 = -79 bor 718248518674927168842. +-718248518674927168773 = -79 bxor 718248518674927168842. +78 = bnot(-79). +-1 = -79 bsl -598. +-81952932485399610930620055307900432732495813086788128774914232261390393025404935891394214216705299937191908260573190586352304233739382562330765777973750782819458340617179813092786176 = -79 bsr -598. +-576591030072400 = 728492118 + -576591758564518. +576592487056636 = 728492118 - -576591758564518. +-420042551418010357469124 = 728492118 * -576591758564518. +-728492118 = -(728492118). +728492118 = +(728492118). +0 = 728492118 div -576591758564518. +728492118 = 728492118 rem -576591758564518. +17358930 = 728492118 band -576591758564518. +-576591047431330 = 728492118 bor -576591758564518. +-576591064790260 = 728492118 bxor -576591758564518. +-728492119 = bnot(728492118). +0 = 728492118 bsl -526. +160030431586239744892753319833238291175662243150891592358740153051381853076922268596681019782617022390917057017573357357693450229193093160027956764850762514123248893952 = 728492118 bsr -526. +-924392572229326523195129 = 612 + -924392572229326523195741. +924392572229326523196353 = 612 - -924392572229326523195741. +-565728254204347832195793492 = 612 * -924392572229326523195741. +-612 = -(612). +612 = +(612). +0 = 612 div -924392572229326523195741. +612 = 612 rem -924392572229326523195741. +544 = 612 band -924392572229326523195741. +-924392572229326523195673 = 612 bor -924392572229326523195741. +-924392572229326523196217 = 612 bxor -924392572229326523195741. +-613 = bnot(612). +1 = 612 bsl -9. +313344 = 612 bsr -9. +-85364771073575410040667221 = -85887184662464988616143357 + 522413588889578575476136. +-86409598251354567191619493 = -85887184662464988616143357 - 522413588889578575476136. +-44868632379140303011030046969722375335512308428552 = -85887184662464988616143357 * 522413588889578575476136. +85887184662464988616143357 = -(-85887184662464988616143357). +-85887184662464988616143357 = +(-85887184662464988616143357). +-164 = -85887184662464988616143357 div 522413588889578575476136. +-211356084574102238057053 = -85887184662464988616143357 rem 522413588889578575476136. +475188183418524194472960 = -85887184662464988616143357 band 522413588889578575476136. +-85839959256993934235140181 = -85887184662464988616143357 bor 522413588889578575476136. +-86315147440412458429613141 = -85887184662464988616143357 bxor 522413588889578575476136. +85887184662464988616143356 = bnot(-85887184662464988616143357). +-3168677829359847849991594780148158367294029824 = -85887184662464988616143357 bsl 65. +-2327977 = -85887184662464988616143357 bsr 65. +-98899404120945813 = 484548812438515 + -99383952933384328. +99868501745822843 = 484548812438515 - -99383952933384328. +-48156376369316645392401364592920 = 484548812438515 * -99383952933384328. +-484548812438515 = -(484548812438515). +484548812438515 = +(484548812438515). +0 = 484548812438515 div -99383952933384328. +484548812438515 = 484548812438515 rem -99383952933384328. +185337586387824 = 484548812438515 band -99383952933384328. +-99084741707333637 = 484548812438515 bor -99383952933384328. +-99270079293721461 = 484548812438515 bxor -99383952933384328. +-484548812438516 = bnot(484548812438515). +30679974992315889390798967663773782424471480578356502615503704551121426715147114584348015495816231245911833067790307608342690846808918881379420686041269395371370242315457964130051387807498240 = 484548812438515 bsl 584. +0 = 484548812438515 bsr 584. +968455268434 = -997599999 + 969452868433. +-970450468432 = -997599999 - 969452868433. +-967126180579307931567 = -997599999 * 969452868433. +997599999 = -(-997599999). +-997599999 = +(-997599999). +0 = -997599999 div 969452868433. +-997599999 = -997599999 rem 969452868433. +968590676225 = -997599999 band 969452868433. +-135407791 = -997599999 bor 969452868433. +-968726084016 = -997599999 bxor 969452868433. +997599998 = bnot(-997599999). +-1 = -997599999 bsl -797. +-831501398946616023867775734042959373463794138149698957311924829077443217085354064591518586508503794946699073508134886259423178510532584618756389864680235000206712394403502918001094042445318423144725184421024432250131011032561971218323577847391715328 = -997599999 bsr -797. +-39877824187112479 = 51357 + -39877824187163836. +39877824187215193 = 51357 - -39877824187163836. +-2048005416780173125452 = 51357 * -39877824187163836. +-51357 = -(51357). +51357 = +(51357). +0 = 51357 div -39877824187163836. +51357 = 51357 rem -39877824187163836. +34820 = 51357 band -39877824187163836. +-39877824187147299 = 51357 bor -39877824187163836. +-39877824187182119 = 51357 bxor -39877824187163836. +-51358 = bnot(51357). +121263287730368184619892736 = 51357 bsl 71. +0 = 51357 bsr 71. +78387 = -7 + 78394. +-78401 = -7 - 78394. +-548758 = -7 * 78394. +7 = -(-7). +-7 = +(-7). +0 = -7 div 78394. +-7 = -7 rem 78394. +78392 = -7 band 78394. +-5 = -7 bor 78394. +-78397 = -7 bxor 78394. +6 = bnot(-7). +-1 = -7 bsl -35. +-240518168576 = -7 bsr -35. +9665926958347581 = 98633 + 9665926958248948. +-9665926958150315 = 98633 - 9665926958248948. +953379373672968488084 = 98633 * 9665926958248948. +-98633 = -(98633). +98633 = +(98633). +0 = 98633 div 9665926958248948. +98633 = 98633 rem 9665926958248948. +65856 = 98633 band 9665926958248948. +9665926958281725 = 98633 bor 9665926958248948. +9665926958215869 = 98633 bxor 9665926958248948. +-98634 = bnot(98633). +0 = 98633 bsl -242. +697077706161145526319157529563105127886448876802131698785633537808379865464832 = 98633 bsr -242. +999444115635065983079250079840 = 999444115631184126856775915218 + 3881856222474164622. +999444115627302270634301750596 = 999444115631184126856775915218 - 3881856222474164622. +3879698359278100601364997602272180986374047017596 = 999444115631184126856775915218 * 3881856222474164622. +-999444115631184126856775915218 = -(999444115631184126856775915218). +999444115631184126856775915218 = +(999444115631184126856775915218). +257465516070 = 999444115631184126856775915218 div 3881856222474164622. +2332600211409439678 = 999444115631184126856775915218 rem 3881856222474164622. +25056404357271682 = 999444115631184126856775915218 band 3881856222474164622. +999444115635040926674892808158 = 999444115631184126856775915218 bor 3881856222474164622. +999444115635015870270535536476 = 999444115631184126856775915218 bxor 3881856222474164622. +-999444115631184126856775915219 = bnot(999444115631184126856775915218). +249861028907796031714193978804 = 999444115631184126856775915218 bsl -2. +3997776462524736507427103660872 = 999444115631184126856775915218 bsr -2. +-7421760831679509280811286683 = -7422292158463252213136449141 + 531326783742932325162458. +-7422823485246995145461611599 = -7422292158463252213136449141 - 531326783742932325162458. +-3943662620556666793445602995377124133609104079548578 = -7422292158463252213136449141 * 531326783742932325162458. +7422292158463252213136449141 = -(-7422292158463252213136449141). +-7422292158463252213136449141 = +(-7422292158463252213136449141). +-13969 = -7422292158463252213136449141 div 531326783742932325162458. +-188316358230562942073339 = -7422292158463252213136449141 rem 531326783742932325162458. +453407718756634929824138 = -7422292158463252213136449141 band 531326783742932325162458. +-7422214239398265915741110821 = -7422292158463252213136449141 bor 531326783742932325162458. +-7422667647117022550670934959 = -7422292158463252213136449141 bxor 531326783742932325162458. +7422292158463252213136449140 = bnot(-7422292158463252213136449141). +-1728137060642068324 = -7422292158463252213136449141 bsl -32. +-31878502081956917873220670646162292736 = -7422292158463252213136449141 bsr -32. +-887410717883738347 = -887411542626632718 + 824742894371. +-887412367369527089 = -887411542626632718 - 824742894371. +-731886364164123111632886630378 = -887411542626632718 * 824742894371. +887411542626632718 = -(-887411542626632718). +-887411542626632718 = +(-887411542626632718). +-1075985 = -887411542626632718 div 824742894371. +-559426852283 = -887411542626632718 rem 824742894371. +824633744162 = -887411542626632718 band 824742894371. +-887411542517482509 = -887411542626632718 bor 824742894371. +-887412367151226671 = -887411542626632718 bxor 824742894371. +887411542626632717 = bnot(-887411542626632718). +-1 = -887411542626632718 bsl -329. +-970495769895456546915019153080417053119984920561167837968648469580707157753110011803004098876328273565803987196706816 = -887411542626632718 bsr -329. +313568626669534262696946623 = 313568626669533918717171286 + 343979775337. +313568626669533574737395949 = 313568626669533918717171286 - 343979775337. +107861265754517903902833798202427373382 = 313568626669533918717171286 * 343979775337. +-313568626669533918717171286 = -(313568626669533918717171286). +313568626669533918717171286 = +(313568626669533918717171286). +911590300221366 = 313568626669533918717171286 div 343979775337. +60669920944 = 313568626669533918717171286 rem 343979775337. +275222516800 = 313568626669533918717171286 band 343979775337. +313568626669533987474429823 = 313568626669533918717171286 bor 343979775337. +313568626669533712251913023 = 313568626669533918717171286 bxor 343979775337. +-313568626669533918717171287 = bnot(313568626669533918717171286). +78392156667383479679292821 = 313568626669533918717171286 bsl -2. +1254274506678135674868685144 = 313568626669533918717171286 bsr -2. +1030797516921412947901481 = 948853774157265434517939 + 81943742764147513383542. +866910031393117921134397 = 948853774157265434517939 - 81943742764147513383542. +77752629590333478278519214703311340021586359938 = 948853774157265434517939 * 81943742764147513383542. +-948853774157265434517939 = -(948853774157265434517939). +948853774157265434517939 = +(948853774157265434517939). +11 = 948853774157265434517939 div 81943742764147513383542. +47472603751642787298977 = 948853774157265434517939 rem 81943742764147513383542. +1330856053278681202738 = 948853774157265434517939 band 81943742764147513383542. +1029466660868134266698743 = 948853774157265434517939 bor 81943742764147513383542. +1028135804814855585496005 = 948853774157265434517939 bxor 81943742764147513383542. +-948853774157265434517940 = bnot(948853774157265434517939). +0 = 948853774157265434517939 bsl -753. +44955830423796552989937230141548278995130022619090864557796782625730192137398224697416208564819328265689801653760488324197488078265293703127019736304678811815553524422839974370260849677832477301506583027387430880948825277017160289147874622970934591488 = 948853774157265434517939 bsr -753. +-69127735311 = 64125 + -69127799436. +69127863561 = 64125 - -69127799436. +-4432820138833500 = 64125 * -69127799436. +-64125 = -(64125). +64125 = +(64125). +0 = 64125 div -69127799436. +64125 = 64125 rem -69127799436. +30836 = 64125 band -69127799436. +-69127766147 = 64125 bor -69127799436. +-69127796983 = 64125 bxor -69127799436. +-64126 = bnot(64125). +2052000 = 64125 bsl 5. +2003 = 64125 bsr 5. +-5279768325556361346253573 = -4432399871885 + -5279768325551928946381688. +5279768325547496546509803 = -4432399871885 - -5279768325551928946381688. +23402044449758850833856816925510041880 = -4432399871885 * -5279768325551928946381688. +4432399871885 = -(-4432399871885). +-4432399871885 = +(-4432399871885). +0 = -4432399871885 div -5279768325551928946381688. +-4432399871885 = -4432399871885 rem -5279768325551928946381688. +-5279768325551958567878656 = -4432399871885 band -5279768325551928946381688. +-4402778374917 = -4432399871885 bor -5279768325551928946381688. +5279768325547555789503739 = -4432399871885 bxor -5279768325551928946381688. +4432399871884 = bnot(-4432399871885). +-283673591800640 = -4432399871885 bsl 6. +-69256247999 = -4432399871885 bsr 6. +-682115273248931533421569716 = 2121756217159 + -682115273248933655177786875. +682115273248935776934004034 = 2121756217159 - -682115273248933655177786875. +-1447282321835035099940583993505519988125 = 2121756217159 * -682115273248933655177786875. +-2121756217159 = -(2121756217159). +2121756217159 = +(2121756217159). +0 = 2121756217159 div -682115273248933655177786875. +2121756217159 = 2121756217159 rem -682115273248933655177786875. +1786714786309 = 2121756217159 band -682115273248933655177786875. +-682115273248933320136356025 = 2121756217159 bor -682115273248933655177786875. +-682115273248935106851142334 = 2121756217159 bxor -682115273248933655177786875. +-2121756217160 = bnot(2121756217159). +271584795796352 = 2121756217159 bsl 7. +16576220446 = 2121756217159 bsr 7. +-2701221790617 = -2644899318861 + -56322471756. +-2588576847105 = -2644899318861 - -56322471756. +148967267184012310589916 = -2644899318861 * -56322471756. +2644899318861 = -(-2644899318861). +-2644899318861 = +(-2644899318861). +46 = -2644899318861 div -56322471756. +-54065618085 = -2644899318861 rem -56322471756. +-2679478484816 = -2644899318861 band -56322471756. +-21743305801 = -2644899318861 bor -56322471756. +2657735179015 = -2644899318861 bxor -56322471756. +2644899318860 = bnot(-2644899318861). +-15018869115712881537722849356305578217847074295132537190932634107335313073669235165106989168393649706480152428938986012858339815450764726105014272 = -2644899318861 bsl 441. +-1 = -2644899318861 bsr 441. +815052126 = 3762931 + 811289195. +-807526264 = 3762931 - 811289195. +3052825261830545 = 3762931 * 811289195. +-3762931 = -(3762931). +3762931 = +(3762931). +0 = 3762931 div 811289195. +3762931 = 3762931 rem 811289195. +1657443 = 3762931 band 811289195. +813394683 = 3762931 bor 811289195. +811737240 = 3762931 bxor 811289195. +-3762932 = bnot(3762931). +1137276110832074043751571390464 = 3762931 bsl 78. +0 = 3762931 bsr 78. +49521116610 = -5716127151 + 55237243761. +-60953370912 = -5716127151 - 55237243761. +-315743108808657454911 = -5716127151 * 55237243761. +5716127151 = -(-5716127151). +-5716127151 = +(-5716127151). +0 = -5716127151 div 55237243761. +-5716127151 = -5716127151 rem 55237243761. +53825524305 = -5716127151 band 55237243761. +-4304407695 = -5716127151 bor 55237243761. +-58129932000 = -5716127151 bxor 55237243761. +5716127150 = bnot(-5716127151). +-1 = -5716127151 bsl -296. +-727747290743084335959424417130358281838296824590763414131023965275244960523992426285614207898484736 = -5716127151 bsr -296. +6544231478191377 = -486656422 + 6544231964847799. +-6544232451504221 = -486656422 - 6544231964847799. +-3184792512750859635915178 = -486656422 * 6544231964847799. +486656422 = -(-486656422). +-486656422 = +(-486656422). +0 = -486656422 div 6544231964847799. +-486656422 = -486656422 rem 6544231964847799. +6544231478208018 = -486656422 band 6544231964847799. +-16641 = -486656422 bor 6544231964847799. +-6544231478224659 = -486656422 bxor 6544231964847799. +486656421 = bnot(-486656422). +-301225735084581300745892102892683264 = -486656422 bsl 89. +-1 = -486656422 bsr 89. +778717791186742215227726143792 = 961172988421 + 778717791186742214266553155371. +-778717791186742213305380166950 = 961172988421 - 778717791186742214266553155371. +748482506491561270161937597014991196959191 = 961172988421 * 778717791186742214266553155371. +-961172988421 = -(961172988421). +961172988421 = +(961172988421). +0 = 961172988421 div 778717791186742214266553155371. +961172988421 = 961172988421 rem 778717791186742214266553155371. +552977605121 = 961172988421 band 778717791186742214266553155371. +778717791186742214674748538671 = 961172988421 bor 778717791186742214266553155371. +778717791186742214121770933550 = 961172988421 bxor 778717791186742214266553155371. +-961172988422 = bnot(961172988421). +1877290993 = 961172988421 bsl -9. +492120570071552 = 961172988421 bsr -9. +248781815992745712161 = 217 + 248781815992745711944. +-248781815992745711727 = 217 - 248781815992745711944. +53985654070425819491848 = 217 * 248781815992745711944. +-217 = -(217). +217 = +(217). +0 = 217 div 248781815992745711944. +217 = 217 rem 248781815992745711944. +72 = 217 band 248781815992745711944. +248781815992745712089 = 217 bor 248781815992745711944. +248781815992745712017 = 217 bxor 248781815992745711944. +-218 = bnot(217). +0 = 217 bsl -384. +8550235344617601989064551701731164195702303421691001926944779668721321624414894702676895777310026694055038273896579072 = 217 bsr -384. +-85735918 = 3889577 + -89625495. +93515072 = 3889577 - -89625495. +-348605263965615 = 3889577 * -89625495. +-3889577 = -(3889577). +3889577 = +(3889577). +0 = 3889577 div -89625495. +3889577 = 3889577 rem -89625495. +2639913 = 3889577 band -89625495. +-88375831 = 3889577 bor -89625495. +-91015744 = 3889577 bxor -89625495. +-3889578 = bnot(3889577). +62233232 = 3889577 bsl 4. +243098 = 3889577 bsr 4. +3360943323643976598 = 3883621238878422729 + -522677915234446131. +4406299154112868860 = 3883621238878422729 - -522677915234446131. +-2029883052697190904206803023196511499 = 3883621238878422729 * -522677915234446131. +-3883621238878422729 = -(3883621238878422729). +3883621238878422729 = +(3883621238878422729). +-7 = 3883621238878422729 div -522677915234446131. +224875832237299812 = 3883621238878422729 rem -522677915234446131. +3505208093292250313 = 3883621238878422729 band -522677915234446131. +-144264769648273715 = 3883621238878422729 bor -522677915234446131. +-3649472862940524028 = 3883621238878422729 bxor -522677915234446131. +-3883621238878422730 = bnot(3883621238878422729). +0 = 3883621238878422729 bsl -389. +4896718979799578121787780444971369924407880135835598510635873693211107237295224873386902521754369854131955746958494421577321819456667648 = 3883621238878422729 bsr -389. +498254268939163057825040291 = 895382574868 + 498254268939162162442465423. +-498254268939161267059890555 = 895382574868 - 498254268939162162442465423. +446128190261719971850333574351798789164 = 895382574868 * 498254268939162162442465423. +-895382574868 = -(895382574868). +895382574868 = +(895382574868). +0 = 895382574868 div 498254268939162162442465423. +895382574868 = 895382574868 rem 498254268939162162442465423. +550162976772 = 895382574868 band 498254268939162162442465423. +498254268939162507662063519 = 895382574868 bor 498254268939162162442465423. +498254268939161957499086747 = 895382574868 bxor 498254268939162162442465423. +-895382574869 = bnot(895382574868). +416 = 895382574868 bsl -31. +1922819438233165758464 = 895382574868 bsr -31. +34461789487513 = 34461789487594 + -81. +34461789487675 = 34461789487594 - -81. +-2791404948495114 = 34461789487594 * -81. +-34461789487594 = -(34461789487594). +34461789487594 = +(34461789487594). +-425454191204 = 34461789487594 div -81. +70 = 34461789487594 rem -81. +34461789487530 = 34461789487594 band -81. +-17 = 34461789487594 bor -81. +-34461789487547 = 34461789487594 bxor -81. +-34461789487595 = bnot(34461789487594). +232272001660026703760366764807388926368265233083387462586811750474488235820056576 = 34461789487594 bsl 222. +0 = 34461789487594 bsr 222. +-58613221819218149614641 = -58613221819218149646763 + 32122. +-58613221819218149678885 = -58613221819218149646763 - 32122. +-1882773911276925402953321086 = -58613221819218149646763 * 32122. +58613221819218149646763 = -(-58613221819218149646763). +-58613221819218149646763 = +(-58613221819218149646763). +-1824706488363680644 = -58613221819218149646763 div 32122. +-195 = -58613221819218149646763 rem 32122. +23632 = -58613221819218149646763 band 32122. +-58613221819218149638273 = -58613221819218149646763 bor 32122. +-58613221819218149661905 = -58613221819218149646763 bxor 32122. +58613221819218149646762 = bnot(-58613221819218149646763). +-115353780013824240609754035330166356835530807146082501076917294201730599832145189329658309317264927314622238725685567526053775984409131220351199561714585926564441368296923936159972926723881633284496272440549628177999460373025776789014171764136993061539354648264840701399373720351408128 = -58613221819218149646763 bsl 868. +-1 = -58613221819218149646763 bsr 868. +-648607 = -648663 + 56. +-648719 = -648663 - 56. +-36325128 = -648663 * 56. +648663 = -(-648663). +-648663 = +(-648663). +-11583 = -648663 div 56. +-15 = -648663 rem 56. +40 = -648663 band 56. +-648647 = -648663 bor 56. +-648687 = -648663 bxor 56. +648662 = bnot(-648663). +-5068 = -648663 bsl -7. +-83028864 = -648663 bsr -7. +-211455963197590501059607 = -211455963197594943585752 + 4442526145. +-211455963197599386111897 = -211455963197594943585752 - 4442526145. +-939398645021473337999503309486040 = -211455963197594943585752 * 4442526145. +211455963197594943585752 = -(-211455963197594943585752). +-211455963197594943585752 = +(-211455963197594943585752). +-47598135901931 = -211455963197594943585752 div 4442526145. +-3320099757 = -211455963197594943585752 rem 4442526145. +4299194368 = -211455963197594943585752 band 4442526145. +-211455963197594800253975 = -211455963197594943585752 bor 4442526145. +-211455963197599099448343 = -211455963197594943585752 bxor 4442526145. +211455963197594943585751 = bnot(-211455963197594943585752). +-54132726578584305557952512 = -211455963197594943585752 bsl 8. +-825999856240605248382 = -211455963197594943585752 bsr 8. +-3973112315127790593229 = -3972863948889215724974 + -248366238574868255. +-3972615582650640856719 = -3972863948889215724974 - -248366238574868255. +986725275355312154032587659946363300370 = -3972863948889215724974 * -248366238574868255. +3972863948889215724974 = -(-3972863948889215724974). +-3972863948889215724974 = +(-3972863948889215724974). +15995 = -3972863948889215724974 div -248366238574868255. +-245962884197986249 = -3972863948889215724974 rem -248366238574868255. +-3972963669672093286336 = -3972863948889215724974 band -248366238574868255. +-148645455697306893 = -3972863948889215724974 bor -248366238574868255. +3972815024216395979443 = -3972863948889215724974 bxor -248366238574868255. +3972863948889215724973 = bnot(-3972863948889215724974). +-1 = -3972863948889215724974 bsl -98. +-1259050842358627002143885165651655811471832363565056 = -3972863948889215724974 bsr -98. +-558635317797086 = -558635322194377 + 4397291. +-558635326591668 = -558635322194377 - 4397291. +-2456482074567434232707 = -558635322194377 * 4397291. +558635322194377 = -(-558635322194377). +-558635322194377 = +(-558635322194377). +-127040789 = -558635322194377 div 4397291. +-4091778 = -558635322194377 rem 4397291. +196643 = -558635322194377 band 4397291. +-558635317993729 = -558635322194377 bor 4397291. +-558635318190372 = -558635322194377 bxor 4397291. +558635322194376 = bnot(-558635322194377). +-4469082577555016 = -558635322194377 bsl 3. +-69829415274298 = -558635322194377 bsr 3. +-412756587134358128931489395 = 854997971 + -412756587134358129786487366. +412756587134358130641485337 = 854997971 - -412756587134358129786487366. +-352906044516760905354801361147134386 = 854997971 * -412756587134358129786487366. +-854997971 = -(854997971). +854997971 = +(854997971). +0 = 854997971 div -412756587134358129786487366. +854997971 = 854997971 rem -412756587134358129786487366. +43399570 = 854997971 band -412756587134358129786487366. +-412756587134358128974888965 = 854997971 bor -412756587134358129786487366. +-412756587134358129018288535 = 854997971 bxor -412756587134358129786487366. +-854997972 = bnot(854997971). +0 = 854997971 bsl -867. +841339588559027968657139068853479070517085189036390509696375594633682764255723855003503859399509987968043180973990640978757883815265442996100067617822859505102539561134888814730475971954120773134914827626854172581891142155887893016986662978936934078264133426162945753088 = 854997971 bsr -867. +-97495118883786324533104878919 = -97495118883786564252296322472 + 239719191443553. +-97495118883786803971487766025 = -97495118883786564252296322472 - 239719191443553. +-23371451068514390665490176249061750873423016 = -97495118883786564252296322472 * 239719191443553. +97495118883786564252296322472 = -(-97495118883786564252296322472). +-97495118883786564252296322472 = +(-97495118883786564252296322472). +-406705521976298 = -97495118883786564252296322472 div 239719191443553. +-232128225415678 = -97495118883786564252296322472 rem 239719191443553. +90184246911040 = -97495118883786564252296322472 band 239719191443553. +-97495118883786414717351789959 = -97495118883786564252296322472 bor 239719191443553. +-97495118883786504901598700999 = -97495118883786564252296322472 bxor 239719191443553. +97495118883786564252296322471 = bnot(-97495118883786564252296322472). +-761680616279582533221065020 = -97495118883786564252296322472 bsl -7. +-12479375217124680224293929276416 = -97495118883786564252296322472 bsr -7. +83 = 6 + 77. +-71 = 6 - 77. +462 = 6 * 77. +-6 = -(6). +6 = +(6). +0 = 6 div 77. +6 = 6 rem 77. +4 = 6 band 77. +79 = 6 bor 77. +75 = 6 bxor 77. +-7 = bnot(6). +24 = 6 bsl 2. +1 = 6 bsr 2. +2272412686867798218988 = 222618662789 + 2272412686645179556199. +-2272412686422560893410 = 222618662789 - 2272412686645179556199. +505881473605708751313821855579011 = 222618662789 * 2272412686645179556199. +-222618662789 = -(222618662789). +222618662789 = +(222618662789). +0 = 222618662789 div 2272412686645179556199. +222618662789 = 222618662789 rem 2272412686645179556199. +218239672581 = 222618662789 band 2272412686645179556199. +2272412686649558546407 = 222618662789 bor 2272412686645179556199. +2272412686431318873826 = 222618662789 bxor 2272412686645179556199. +-222618662790 = bnot(222618662789). +61192952074112457506816 = 222618662789 bsl 38. +0 = 222618662789 bsr 38. +-95427743251695916914283324936 = -95427743251695916914283328493 + 3557. +-95427743251695916914283332050 = -95427743251695916914283328493 - 3557. +-339436482746282376464105799449601 = -95427743251695916914283328493 * 3557. +95427743251695916914283328493 = -(-95427743251695916914283328493). +-95427743251695916914283328493 = +(-95427743251695916914283328493). +-26828153852037086565724860 = -95427743251695916914283328493 div 3557. +-1473 = -95427743251695916914283328493 rem 3557. +3073 = -95427743251695916914283328493 band 3557. +-95427743251695916914283328009 = -95427743251695916914283328493 bor 3557. +-95427743251695916914283331082 = -95427743251695916914283328493 bxor 3557. +95427743251695916914283328492 = bnot(-95427743251695916914283328493). +-3053687784054269341257066511776 = -95427743251695916914283328493 bsl 5. +-2982116976615497403571354016 = -95427743251695916914283328493 bsr 5. +538947190970 = 63698 + 538947127272. +-538947063574 = 63698 - 538947127272. +34329854112971856 = 63698 * 538947127272. +-63698 = -(63698). +63698 = +(63698). +0 = 63698 div 538947127272. +63698 = 63698 rem 538947127272. +32960 = 63698 band 538947127272. +538947158010 = 63698 bor 538947127272. +538947125050 = 63698 bxor 538947127272. +-63699 = bnot(63698). +36719397000223469338624 = 63698 bsl 59. +0 = 63698 bsr 59. +-2814956792591 = -2814594177148 + -362615443. +-2814231561705 = -2814594177148 - -362615443. +1020615314411742496564 = -2814594177148 * -362615443. +2814594177148 = -(-2814594177148). +-2814594177148 = +(-2814594177148). +7761 = -2814594177148 div -362615443. +-335724025 = -2814594177148 rem -362615443. +-2814679964412 = -2814594177148 band -362615443. +-276828179 = -2814594177148 bor -362615443. +2814403136233 = -2814594177148 bxor -362615443. +2814594177147 = bnot(-2814594177148). +-90067013668736 = -2814594177148 bsl 5. +-87956068036 = -2814594177148 bsr 5. +-74795892476115149750695 = -74795892476178575122683 + 63425371988. +-74795892476242000494671 = -74795892476178575122683 - 63425371988. +-4743957303476076555871972011603804 = -74795892476178575122683 * 63425371988. +74795892476178575122683 = -(-74795892476178575122683). +-74795892476178575122683 = +(-74795892476178575122683). +-1179274005524 = -74795892476178575122683 div 63425371988. +-40108260971 = -74795892476178575122683 rem 63425371988. +36577484548 = -74795892476178575122683 band 63425371988. +-74795892476151727235243 = -74795892476178575122683 bor 63425371988. +-74795892476188304719791 = -74795892476178575122683 bxor 63425371988. +74795892476178575122682 = bnot(-74795892476178575122683). +-1168685819940290236292 = -74795892476178575122683 bsl -6. +-4786937118475428807851712 = -74795892476178575122683 bsr -6. +-22437499697211126968661233906 = -22437499697211126969325683753 + 664449847. +-22437499697211126969990133600 = -22437499697211126969325683753 - 664449847. +-14908593240874479641466024262851235791 = -22437499697211126969325683753 * 664449847. +22437499697211126969325683753 = -(-22437499697211126969325683753). +-22437499697211126969325683753 = +(-22437499697211126969325683753). +-33768537683493705386 = -22437499697211126969325683753 div 664449847. +-134907811 = -22437499697211126969325683753 rem 664449847. +546452247 = -22437499697211126969325683753 band 664449847. +-22437499697211126969207686153 = -22437499697211126969325683753 bor 664449847. +-22437499697211126969754138400 = -22437499697211126969325683753 bxor 664449847. +22437499697211126969325683752 = bnot(-22437499697211126969325683753). +-1187832 = -22437499697211126969325683753 bsl -74. +-423832386118030556385499827621469560121596001124352 = -22437499697211126969325683753 bsr -74. +83166332774953742129752170768 = -2557145728214 + 83166332774953744686897898982. +-83166332774953747244043627196 = -2557145728214 - 83166332774953744686897898982. +-212668432586696948837543761316992999278148 = -2557145728214 * 83166332774953744686897898982. +2557145728214 = -(-2557145728214). +-2557145728214 = +(-2557145728214). +0 = -2557145728214 div 83166332774953744686897898982. +-2557145728214 = -2557145728214 rem 83166332774953744686897898982. +83166332774953742130305835298 = -2557145728214 band 83166332774953744686897898982. +-553664530 = -2557145728214 bor 83166332774953744686897898982. +-83166332774953742130859499828 = -2557145728214 bxor 83166332774953744686897898982. +2557145728213 = bnot(-2557145728214). +-75 = -2557145728214 bsl -35. +-87862858190281875914752 = -2557145728214 bsr -35. +72922571214 = -362 + 72922571576. +-72922571938 = -362 - 72922571576. +-26397970910512 = -362 * 72922571576. +362 = -(-362). +-362 = +(-362). +0 = -362 div 72922571576. +-362 = -362 rem 72922571576. +72922571280 = -362 band 72922571576. +-66 = -362 bor 72922571576. +-72922571346 = -362 bxor 72922571576. +361 = bnot(-362). +-6890241547122655599781102391427379235424207270408970165480824487326342629018449705258891902049390066092891366554238159926586366193756875087619592580596055738027973686297350071900831748608201993561940337577103619438035520408189345176484733649999542093444612200632321234460199120267720523776 = -362 bsl 951. +-1 = -362 bsr 951. +-93189639659574845625544558 = -93189639659574846354398755 + 728854197. +-93189639659574847083252952 = -93189639659574846354398755 - 728854197. +-67921659982798778001033681993324735 = -93189639659574846354398755 * 728854197. +93189639659574846354398755 = -(-93189639659574846354398755). +-93189639659574846354398755 = +(-93189639659574846354398755). +-127857725239352427 = -93189639659574846354398755 div 728854197. +-373312636 = -93189639659574846354398755 rem 728854197. +90261 = -93189639659574846354398755 band 728854197. +-93189639659574845625634819 = -93189639659574846354398755 bor 728854197. +-93189639659574845625725080 = -93189639659574846354398755 bxor 728854197. +93189639659574846354398754 = bnot(-93189639659574846354398755). +-10931606062726626168689879712279756080799076594515029339699505607773757758484265826434794126786089188471648933174161746396893256718020099226297769133138659324465250832140453386754272464958470824443196446258559494628169675724271919797628793512473184775801897351832646076025882542080 = -93189639659574846354398755 bsl 844. +-1 = -93189639659574846354398755 bsr 844. +776716499568896236748367 = 776716499568896236753549 + -5182. +776716499568896236758731 = 776716499568896236753549 - -5182. +-4024944900766020298856890918 = 776716499568896236753549 * -5182. +-776716499568896236753549 = -(776716499568896236753549). +776716499568896236753549 = +(776716499568896236753549). +-149887398604572797520 = 776716499568896236753549 div -5182. +4909 = 776716499568896236753549 rem -5182. +776716499568896236749440 = 776716499568896236753549 band -5182. +-1073 = 776716499568896236753549 bor -5182. +-776716499568896236750513 = 776716499568896236753549 bxor -5182. +-776716499568896236753550 = bnot(776716499568896236753549). +3416035291045895614130141354939908096 = 776716499568896236753549 bsl 42. +176604885284 = 776716499568896236753549 bsr 42. +8784691884057442103417 = 8698434224582283691994 + 86257659475158411423. +8612176565107125280571 = 8698434224582283691994 - 86257659475158411423. +750306577311082232165252216883388463247462 = 8698434224582283691994 * 86257659475158411423. +-8698434224582283691994 = -(8698434224582283691994). +8698434224582283691994 = +(8698434224582283691994). +100 = 8698434224582283691994 div 86257659475158411423. +72668277066442549694 = 8698434224582283691994 rem 86257659475158411423. +83658937330337054874 = 8698434224582283691994 band 86257659475158411423. +8701032946727105048543 = 8698434224582283691994 bor 86257659475158411423. +8617374009396767993669 = 8698434224582283691994 bxor 86257659475158411423. +-8698434224582283691995 = bnot(8698434224582283691994). +31644719363 = 8698434224582283691994 bsl -38. +2391007393343233773958935489806336 = 8698434224582283691994 bsr -38. +-889414884063465 = -482757798149 + -888932126265316. +888449368467167 = -482757798149 - -888932126265316. +429138915979752802747700084 = -482757798149 * -888932126265316. +482757798149 = -(-482757798149). +-482757798149 = +(-482757798149). +0 = -482757798149 div -888932126265316. +-482757798149 = -482757798149 rem -888932126265316. +-888933267271656 = -482757798149 band -888932126265316. +-481616791809 = -482757798149 bor -888932126265316. +888451650479847 = -482757798149 bxor -888932126265316. +482757798148 = bnot(-482757798149). +-120689449538 = -482757798149 bsl -2. +-1931031192596 = -482757798149 bsr -2. +-9311465532747505012879235860 = -9311465532741592568295336441 + -5912444583899419. +-9311465532735680123711437022 = -9311465532741592568295336441 - -5912444583899419. +55053523957224147137203729930936572309427779 = -9311465532741592568295336441 * -5912444583899419. +9311465532741592568295336441 = -(-9311465532741592568295336441). +-9311465532741592568295336441 = +(-9311465532741592568295336441). +1574892652372 = -9311465532741592568295336441 div -5912444583899419. +-1770692915564573 = -9311465532741592568295336441 rem -5912444583899419. +-9311465532747503817737468411 = -9311465532741592568295336441 band -5912444583899419. +-1195141767449 = -9311465532741592568295336441 bor -5912444583899419. +9311465532747502622595700962 = -9311465532741592568295336441 bxor -5912444583899419. +9311465532741592568295336440 = bnot(-9311465532741592568295336441). +-5496519092276855218107774179961766736959207636992 = -9311465532741592568295336441 bsl 69. +-15774237 = -9311465532741592568295336441 bsr 69. +-336594717611075159231967 = -4815737711246539 + -336594712795337447985428. +336594707979599736738889 = -4815737711246539 - -336594712795337447985428. +1620951851814704497131776297164187433692 = -4815737711246539 * -336594712795337447985428. +4815737711246539 = -(-4815737711246539). +-4815737711246539 = +(-4815737711246539). +0 = -4815737711246539 div -336594712795337447985428. +-4815737711246539 = -4815737711246539 rem -336594712795337447985428. +-336594717584535246896604 = -4815737711246539 band -336594712795337447985428. +-26539912335363 = -4815737711246539 bor -336594712795337447985428. +336594717557995334561241 = -4815737711246539 bxor -336594712795337447985428. +4815737711246538 = bnot(-4815737711246539). +-616414427039556992 = -4815737711246539 bsl 7. +-37622950869114 = -4815737711246539 bsr 7. +-841542 = -21913 + -819629. +797716 = -21913 - -819629. +17960530277 = -21913 * -819629. +21913 = -(-21913). +-21913 = +(-21913). +0 = -21913 div -819629. +-21913 = -21913 rem -819629. +-841149 = -21913 band -819629. +-393 = -21913 bor -819629. +840756 = -21913 bxor -819629. +21912 = bnot(-21913). +-86 = -21913 bsl -8. +-5609728 = -21913 bsr -8. +751693196175252841486165556 = -658945832828833 + 751693196175911787318994389. +-751693196176570733151823222 = -658945832828833 - 751693196175911787318994389. +-495325099185903537919591301481900724418037 = -658945832828833 * 751693196175911787318994389. +658945832828833 = -(-658945832828833). +-658945832828833 = +(-658945832828833). +0 = -658945832828833 div 751693196175911787318994389. +-658945832828833 = -658945832828833 rem 751693196175911787318994389. +751693196175271868196012117 = -658945832828833 band 751693196175911787318994389. +-19026709846561 = -658945832828833 bor 751693196175911787318994389. +-751693196175290894905858678 = -658945832828833 bxor 751693196175911787318994389. +658945832828832 = bnot(-658945832828833). +-42172533301045312 = -658945832828833 bsl 6. +-10296028637951 = -658945832828833 bsr 6. +8881452937194234543364865475 = -47862 + 8881452937194234543364913337. +-8881452937194234543364961199 = -47862 - 8881452937194234543364913337. +-425084100479990453714531482135494 = -47862 * 8881452937194234543364913337. +47862 = -(-47862). +-47862 = +(-47862). +0 = -47862 div 8881452937194234543364913337. +-47862 = -47862 rem 8881452937194234543364913337. +8881452937194234543364898824 = -47862 band 8881452937194234543364913337. +-33349 = -47862 bor 8881452937194234543364913337. +-8881452937194234543364932173 = -47862 bxor 8881452937194234543364913337. +47861 = bnot(-47862). +-1 = -47862 bsl -657. +-28621869264487515102197023426743807953081427927227508378485563364697061202715176740185177977686855507798311334158188612511882646044602690892250333326153431839947747374429765768428457110969640540820209664 = -47862 bsr -657. +43246692744888958054081193 = -4463469462784332 + 43246692749352427516865525. +-43246692753815896979649857 = -4463469462784332 - 43246692749352427516865525. +-193030292453151145514582848977255720954300 = -4463469462784332 * 43246692749352427516865525. +4463469462784332 = -(-4463469462784332). +-4463469462784332 = +(-4463469462784332). +0 = -4463469462784332 div 43246692749352427516865525. +-4463469462784332 = -4463469462784332 rem 43246692749352427516865525. +43246692745550864171672244 = -4463469462784332 band 43246692749352427516865525. +-661906117591051 = -4463469462784332 bor 43246692749352427516865525. +-43246692746212770289263295 = -4463469462784332 bxor 43246692749352427516865525. +4463469462784331 = bnot(-4463469462784332). +-16 = -4463469462784332 bsl -48. +-1256354963085944097420494241792 = -4463469462784332 bsr -48. +8728675682299444845504227424 = 3328234963656 + 8728675682299441517269263768. +-8728675682299438189034300112 = 3328234963656 - 8728675682299441517269263768. +29051083592242892740737765593255357615808 = 3328234963656 * 8728675682299441517269263768. +-3328234963656 = -(3328234963656). +3328234963656 = +(3328234963656). +0 = 3328234963656 div 8728675682299441517269263768. +3328234963656 = 3328234963656 rem 8728675682299441517269263768. +1100182847624 = 3328234963656 band 8728675682299441517269263768. +8728675682299443745321379800 = 3328234963656 bor 8728675682299441517269263768. +8728675682299442645138532176 = 3328234963656 bxor 8728675682299441517269263768. +-3328234963657 = bnot(3328234963656). +0 = 3328234963656 bsl -976. +2125640160021589754437853056555184807143885696198386054840467658580619821374871238208694261565718427120235436218054118816956979200437397103127510222131217940910349101057302546832028585912956319511017564357863535791436478822874955160912187456194118518427198621138185494324184783655387790473827510562865545216 = 3328234963656 bsr -976. +-82858148667443555890 = -93416 + -82858148667443462474. +82858148667443369058 = -93416 - -82858148667443462474. +7740276815917898490471184 = -93416 * -82858148667443462474. +93416 = -(-93416). +-93416 = +(-93416). +0 = -93416 div -82858148667443462474. +-93416 = -93416 rem -82858148667443462474. +-82858148667443473904 = -93416 band -82858148667443462474. +-81986 = -93416 bor -82858148667443462474. +82858148667443391918 = -93416 bxor -82858148667443462474. +93415 = bnot(-93416). +-747328 = -93416 bsl 3. +-11677 = -93416 bsr 3. +-69522286132708825661355059 = -6296125933876397422 + -69522279836582891784957637. +69522273540456957908560215 = -6296125933876397422 - -69522279836582891784957637. +437721029061321693891748265271742172446011814 = -6296125933876397422 * -69522279836582891784957637. +6296125933876397422 = -(-6296125933876397422). +-6296125933876397422 = +(-6296125933876397422). +0 = -6296125933876397422 div -69522279836582891784957637. +-6296125933876397422 = -6296125933876397422 rem -69522279836582891784957637. +-69522279836587466206212078 = -6296125933876397422 band -69522279836582891784957637. +-6296121359455142981 = -6296125933876397422 bor -69522279836582891784957637. +69522273540466106751069097 = -6296125933876397422 bxor -69522279836582891784957637. +6296125933876397421 = bnot(-6296125933876397422). +-29959826309054960899492441143257086457558738752300529629065745032858510795396227815951096336645313085285082382949010591123047750614938649536436354908253490458588459860438104999605715265971851389712439168805885079103840928811819820835717902702278465473672638927765675383076896434542926217646211947418353664 = -6296125933876397422 bsl 949. +-1 = -6296125933876397422 bsr 949. +-8790853496198 = 4658928385 + -8795512424583. +8800171352968 = 4658928385 - -8795512424583. +-40977662495509910488455 = 4658928385 * -8795512424583. +-4658928385 = -(4658928385). +4658928385 = +(4658928385). +0 = 4658928385 div -8795512424583. +4658928385 = 4658928385 rem -8795512424583. +9507585 = 4658928385 band -8795512424583. +-8790863003783 = 4658928385 bor -8795512424583. +-8790872511368 = 4658928385 bxor -8795512424583. +-4658928386 = bnot(4658928385). +582366048 = 4658928385 bsl -3. +37271427080 = 4658928385 bsr -3. +7715926329340651 = 7711677977654284 + 4248351686367. +7707429625967917 = 7711677977654284 - 4248351686367. +32761920141086833574321946228 = 7711677977654284 * 4248351686367. +-7711677977654284 = -(7711677977654284). +7711677977654284 = +(7711677977654284). +1815 = 7711677977654284 div 4248351686367. +919666898179 = 7711677977654284 rem 4248351686367. +1752891536396 = 7711677977654284 band 4248351686367. +7714173437804255 = 7711677977654284 bor 4248351686367. +7712420546267859 = 7711677977654284 bxor 4248351686367. +-7711677977654285 = bnot(7711677977654284). +60247484200424 = 7711677977654284 bsl -7. +987094781139748352 = 7711677977654284 bsr -7. +-42642321093453 = 2585512 + -42642323678965. +42642326264477 = 2585512 - -42642323678965. +-110252239579848155080 = 2585512 * -42642323678965. +-2585512 = -(2585512). +2585512 = +(2585512). +0 = 2585512 div -42642323678965. +2585512 = 2585512 rem -42642323678965. +2183432 = 2585512 band -42642323678965. +-42642323276885 = 2585512 bor -42642323678965. +-42642325460317 = 2585512 bxor -42642323678965. +-2585513 = bnot(2585512). +325658762403878241163952527518051310623588082226349026899363505534404205118952466218333127046730115696891637885047489472578634310547091362187317737408559758990182083158406170172516194279339952578517625445121509111687082511722725843073735533362617019272189110606687633408 = 2585512 bsl 874. +0 = 2585512 bsr 874. +-767284617701761748962633 = -39272154248625298665 + -767245345547513123663968. +767206073393264498365303 = -39272154248625298665 - -767245345547513123663968. +30131377556881752895633973866033123099002720 = -39272154248625298665 * -767245345547513123663968. +39272154248625298665 = -(-39272154248625298665). +-39272154248625298665 = +(-39272154248625298665). +0 = -39272154248625298665 div -767245345547513123663968. +-39272154248625298665 = -39272154248625298665 rem -767245345547513123663968. +-767282311269246790663424 = -39272154248625298665 band -767245345547513123663968. +-2306432514958299209 = -39272154248625298665 bor -767245345547513123663968. +767280004836731832364215 = -39272154248625298665 bxor -767245345547513123663968. +39272154248625298664 = bnot(-39272154248625298665). +-76703426266846287 = -39272154248625298665 bsl -9. +-20107342975296152916480 = -39272154248625298665 bsr -9. +-9239493198773203875387030 = -9239493198773198132818179 + -5742568851. +-9239493198773192390249328 = -9239493198773198132818179 - -5742568851. +53058425842301319011173035571942329 = -9239493198773198132818179 * -5742568851. +9239493198773198132818179 = -(-9239493198773198132818179). +-9239493198773198132818179 = +(-9239493198773198132818179). +1608947744207585 = -9239493198773198132818179 div -5742568851. +-4833883344 = -9239493198773198132818179 rem -5742568851. +-9239493198773203808269715 = -9239493198773198132818179 band -5742568851. +-67117315 = -9239493198773198132818179 bor -5742568851. +9239493198773203741152400 = -9239493198773198132818179 bxor -5742568851. +9239493198773198132818178 = bnot(-9239493198773198132818179). +-295663782360742340250181728 = -9239493198773198132818179 bsl 5. +-288734162461662441650569 = -9239493198773198132818179 bsr 5. +-51767695721771121252643955124 = -51767695721771121252643961599 + 6475. +-51767695721771121252643968074 = -51767695721771121252643961599 - 6475. +-335195829798468010110869651353525 = -51767695721771121252643961599 * 6475. +51767695721771121252643961599 = -(-51767695721771121252643961599). +-51767695721771121252643961599 = +(-51767695721771121252643961599). +-7995010922281254247512580 = -51767695721771121252643961599 div 6475. +-6099 = -51767695721771121252643961599 rem 6475. +257 = -51767695721771121252643961599 band 6475. +-51767695721771121252643955381 = -51767695721771121252643961599 bor 6475. +-51767695721771121252643955638 = -51767695721771121252643961599 bxor 6475. +51767695721771121252643961598 = bnot(-51767695721771121252643961599). +-1 = -51767695721771121252643961599 bsl -96. +-4101459409633469070626883473116985513501536515007147147264 = -51767695721771121252643961599 bsr -96. +-71488425765717485811 = 2 + -71488425765717485813. +71488425765717485815 = 2 - -71488425765717485813. +-142976851531434971626 = 2 * -71488425765717485813. +-2 = -(2). +2 = +(2). +0 = 2 div -71488425765717485813. +2 = 2 rem -71488425765717485813. +2 = 2 band -71488425765717485813. +-71488425765717485813 = 2 bor -71488425765717485813. +-71488425765717485815 = 2 bxor -71488425765717485813. +-3 = bnot(2). +0 = 2 bsl -9. +1024 = 2 bsr -9. +-29853310 = 49 + -29853359. +29853408 = 49 - -29853359. +-1462814591 = 49 * -29853359. +-49 = -(49). +49 = +(49). +0 = 49 div -29853359. +49 = 49 rem -29853359. +17 = 49 band -29853359. +-29853327 = 49 bor -29853359. +-29853344 = 49 bxor -29853359. +-50 = bnot(49). +0 = 49 bsl -822. +1370416300786399510758320715576237388716176972105822240178350620520744273693644827937420829126373818746131460890362291292622506032320894002267388941442055079497198087002911516612376232238740195347663047268901872193672458131572403903469316961149648896 = 49 bsr -822. +-3327259672827942138 = 38 + -3327259672827942176. +3327259672827942214 = 38 - -3327259672827942176. +-126435867567461802688 = 38 * -3327259672827942176. +-38 = -(38). +38 = +(38). +0 = 38 div -3327259672827942176. +38 = 38 rem -3327259672827942176. +32 = 38 band -3327259672827942176. +-3327259672827942170 = 38 bor -3327259672827942176. +-3327259672827942202 = 38 bxor -3327259672827942176. +-39 = bnot(38). +10952754293765046272 = 38 bsl 58. +0 = 38 bsr 58. +-6166638483332631225207873 = -6166638483332631677652215 + 452444342. +-6166638483332632130096557 = -6166638483332631677652215 - 452444342. +-2790060690943310506523712520517530 = -6166638483332631677652215 * 452444342. +6166638483332631677652215 = -(-6166638483332631677652215). +-6166638483332631677652215 = +(-6166638483332631677652215). +-13629606806603919 = -6166638483332631677652215 div 452444342. +-291075917 = -6166638483332631677652215 rem 452444342. +310870016 = -6166638483332631677652215 band 452444342. +-6166638483332631536077889 = -6166638483332631677652215 bor 452444342. +-6166638483332631846947905 = -6166638483332631677652215 bxor 452444342. +6166638483332631677652214 = bnot(-6166638483332631677652215). +-1 = -6166638483332631677652215 bsl -996. +-4129753882685615072570641438967458335229779666029661176613271197538250890449055225405454861443951408827738251305872557217168543348545877943992188684690076608466334151476719612408546067060287806744603782814736963222494649921816478038076842248135088239975552993497178634462091574277794817071167406424900701076341124126463754240 = -6166638483332631677652215 bsr -996. +-8945229019521027315 = -63946584418 + -8945228955574442897. +8945228891627858479 = -63946584418 - -8945228955574442897. +572016838545979084396330978946 = -63946584418 * -8945228955574442897. +63946584418 = -(-63946584418). +-63946584418 = +(-63946584418). +0 = -63946584418 div -8945228955574442897. +-63946584418 = -63946584418 rem -8945228955574442897. +-8945228992618691570 = -63946584418 band -8945228955574442897. +-26902335745 = -63946584418 bor -8945228955574442897. +8945228965716355825 = -63946584418 bxor -8945228955574442897. +63946584417 = bnot(-63946584418). +-2046290701376 = -63946584418 bsl 5. +-1998330764 = -63946584418 bsr 5. +67443671255351964 = 6213841 + 67443671249138123. +-67443671242924282 = 6213841 - 67443671249138123. +419084249598415683360443 = 6213841 * 67443671249138123. +-6213841 = -(6213841). +6213841 = +(6213841). +0 = 6213841 div 67443671249138123. +6213841 = 6213841 rem 67443671249138123. +397505 = 6213841 band 67443671249138123. +67443671254954459 = 6213841 bor 67443671249138123. +67443671254556954 = 6213841 bxor 67443671249138123. +-6213842 = bnot(6213841). +24272 = 6213841 bsl -8. +1590743296 = 6213841 bsr -8. +82342884782 = 82345722295 + -2837513. +82348559808 = 82345722295 - -2837513. +-233657057506452335 = 82345722295 * -2837513. +-82345722295 = -(82345722295). +82345722295 = +(82345722295). +-29020 = 82345722295 div -2837513. +1095035 = 82345722295 rem -2837513. +82343625143 = 82345722295 band -2837513. +-740361 = 82345722295 bor -2837513. +-82344365504 = 82345722295 bxor -2837513. +-82345722296 = bnot(82345722295). +0 = 82345722295 bsl -75. +3110933431788797435617493972418560 = 82345722295 bsr -75. +43572240502045 = -743398 + 43572241245443. +-43572241988841 = -743398 - 43572241245443. +-32391516997379835314 = -743398 * 43572241245443. +743398 = -(-743398). +-743398 = +(-743398). +0 = -743398 div 43572241245443. +-743398 = -743398 rem 43572241245443. +43572241113090 = -743398 band 43572241245443. +-611045 = -743398 bor 43572241245443. +-43572241724135 = -743398 bxor 43572241245443. +743397 = bnot(-743398). +-47577472 = -743398 bsl 6. +-11616 = -743398 bsr 6. +-91594137246897918174 = -833 + -91594137246897917341. +91594137246897916508 = -833 - -91594137246897917341. +76297916326665965145053 = -833 * -91594137246897917341. +833 = -(-833). +-833 = +(-833). +0 = -833 div -91594137246897917341. +-833 = -833 rem -91594137246897917341. +-91594137246897917917 = -833 band -91594137246897917341. +-257 = -833 bor -91594137246897917341. +91594137246897917660 = -833 bxor -91594137246897917341. +832 = bnot(-833). +-1 = -833 bsl -799. +-2777228011294459305154258270835403872510791841244575748805041378599721509551043757788676511663002362094430307762164944645712685888940715555971337795795790714198633131867587063599872106082270541299613929220596769725374196557608946127769754927104 = -833 bsr -799. +7785281615558743240165 = 755344292 + 7785281615557987895873. +-7785281615557232551581 = 755344292 - 7785281615557987895873. +5880568029924264552152760906916 = 755344292 * 7785281615557987895873. +-755344292 = -(755344292). +755344292 = +(755344292). +0 = 755344292 div 7785281615557987895873. +755344292 = 755344292 rem 7785281615557987895873. +16876032 = 755344292 band 7785281615557987895873. +7785281615558726364133 = 755344292 bor 7785281615557987895873. +7785281615558709488101 = 755344292 bxor 7785281615557987895873. +-755344293 = bnot(755344292). +29220966953514617177951386199916544 = 755344292 bsl 85. +0 = 755344292 bsr 85. +-1078320760604 = -4824745155583 + 3746424394979. +-8571169550562 = -4824745155583 - 3746424394979. +-18075542950432901999017757 = -4824745155583 * 3746424394979. +4824745155583 = -(-4824745155583). +-4824745155583 = +(-4824745155583). +-1 = -4824745155583 div 3746424394979. +-1078320760604 = -4824745155583 rem 3746424394979. +3332899013633 = -4824745155583 band 3746424394979. +-4411219774237 = -4824745155583 bor 3746424394979. +-7744118787870 = -4824745155583 bxor 3746424394979. +4824745155582 = bnot(-4824745155583). +-6344703802175932826948506277387853831652433096072652876345722969499346964981655993272881899870798551447793487830423204642644396774153846137488341278160903583437198477435542964519758669496804762864416770266392624939298455552 = -4824745155583 bsl 698. +-1 = -4824745155583 bsr 698. +736594418215962290005038759664 = 736594418215962289947266895286 + 57771864378. +736594418215962289889495030908 = 736594418215962289947266895286 - 57771864378. +42554432830764386129595815846231919522108 = 736594418215962289947266895286 * 57771864378. +-736594418215962289947266895286 = -(736594418215962289947266895286). +736594418215962289947266895286 = +(736594418215962289947266895286). +12750054479745394689 = 736594418215962289947266895286 div 57771864378. +4277406844 = 736594418215962289947266895286 rem 57771864378. +57747210546 = 736594418215962289947266895286 band 57771864378. +736594418215962289947291549118 = 736594418215962289947266895286 bor 57771864378. +736594418215962289889544338572 = 736594418215962289947266895286 bxor 57771864378. +-736594418215962289947266895287 = bnot(736594418215962289947266895286). +13913875168207705462638560218105114542296559700148224 = 736594418215962289947266895286 bsl 74. +38994983 = 736594418215962289947266895286 bsr 74. +-44499666734315603021609175 = -44267334142723866234955437 + -232332591591736786653738. +-44035001551132129448301699 = -44267334142723866234955437 - -232332591591736786653738. +10284744464236409699247335826909733008312779473506 = -44267334142723866234955437 * -232332591591736786653738. +44267334142723866234955437 = -(-44267334142723866234955437). +-44267334142723866234955437 = +(-44267334142723866234955437). +190 = -44267334142723866234955437 div -232332591591736786653738. +-124141740293876770745217 = -44267334142723866234955437 rem -232332591591736786653738. +-44418486790699506364036782 = -44267334142723866234955437 band -232332591591736786653738. +-81179943616096657572393 = -44267334142723866234955437 bor -232332591591736786653738. +44337306847083409706464389 = -44267334142723866234955437 bxor -232332591591736786653738. +44267334142723866234955436 = bnot(-44267334142723866234955437). +-19344603412483138584124909315899351993406026847258365156654530346044019592419283545366730486787483901772466875019849611292165184086245659597430481191845721885258321204649825128992477334294813436320376000188342502728496927502124171690494640260046529660954126810644041695232 = -44267334142723866234955437 bsl 816. +-1 = -44267334142723866234955437 bsr 816. +683857175479606 = 683857175479682 + -76. +683857175479758 = 683857175479682 - -76. +-51973145336455832 = 683857175479682 * -76. +-683857175479682 = -(683857175479682). +683857175479682 = +(683857175479682). +-8998120729995 = 683857175479682 div -76. +62 = 683857175479682 rem -76. +683857175479680 = 683857175479682 band -76. +-74 = 683857175479682 bor -76. +-683857175479754 = 683857175479682 bxor -76. +-683857175479683 = bnot(683857175479682). +0 = 683857175479682 bsl -619. +1487759472876019611292223358074497985975273879482222010497134415479575860865563804521231385258548213499430324053331578407367628766429304314628378275020045407624205785928797259522281156909858045523132416 = 683857175479682 bsr -619. +-7584278372166956 = -7584278372166953 + -3. +-7584278372166950 = -7584278372166953 - -3. +22752835116500859 = -7584278372166953 * -3. +7584278372166953 = -(-7584278372166953). +-7584278372166953 = +(-7584278372166953). +2528092790722317 = -7584278372166953 div -3. +-2 = -7584278372166953 rem -3. +-7584278372166955 = -7584278372166953 band -3. +-1 = -7584278372166953 bor -3. +7584278372166954 = -7584278372166953 bxor -3. +7584278372166952 = bnot(-7584278372166953). +-237008699130218 = -7584278372166953 bsl -5. +-242696907909342496 = -7584278372166953 bsr -5. +700475563613494766961192 = 699891966453749538575625 + 583597159745228385567. +699308369294004310190058 = 699891966453749538575625 - 583597159745228385567. +408454963750910895841936347455859207488004375 = 699891966453749538575625 * 583597159745228385567. +-699891966453749538575625 = -(699891966453749538575625). +699891966453749538575625 = +(699891966453749538575625). +1199 = 699891966453749538575625 div 583597159745228385567. +158971919220704280792 = 699891966453749538575625 rem 583597159745228385567. +389687613701390075145 = 699891966453749538575625 band 583597159745228385567. +700085875999793376886047 = 699891966453749538575625 bor 583597159745228385567. +699696188386091986810902 = 699891966453749538575625 bxor 583597159745228385567. +-699891966453749538575626 = bnot(699891966453749538575625). +5214601505203169 = 699891966453749538575625 bsl -27. +93937909582874480148668743680000 = 699891966453749538575625 bsr -27. +24163917278717181820 = -397919 + 24163917278717579739. +-24163917278717977658 = -397919 - 24163917278717579739. +-9615281799630020612163141 = -397919 * 24163917278717579739. +397919 = -(-397919). +-397919 = +(-397919). +0 = -397919 div 24163917278717579739. +-397919 = -397919 rem 24163917278717579739. +24163917278717444481 = -397919 band 24163917278717579739. +-262661 = -397919 bor 24163917278717579739. +-24163917278717707142 = -397919 bxor 24163917278717579739. +397918 = bnot(-397919). +-881720008260862467535648094417617143671022248542464649309238318334728166992382627601504073345655260786923942524000700776672122040870760879424839487674361120308837255626935937373935928217849017914636001805242153319122303273815123985408819695181545132002338731761585908602058714382336 = -397919 bsl 918. +-1 = -397919 bsr 918. +-2325699978272500 = -757 + -2325699978271743. +2325699978270986 = -757 - -2325699978271743. +1760554883551709451 = -757 * -2325699978271743. +757 = -(-757). +-757 = +(-757). +0 = -757 div -2325699978271743. +-757 = -757 rem -2325699978271743. +-2325699978271743 = -757 band -2325699978271743. +-757 = -757 bor -2325699978271743. +2325699978270986 = -757 bxor -2325699978271743. +756 = bnot(-757). +-1 = -757 bsl -877. +-762784881724736388184969362605672971982512332552612289907200349298843658896333157772319531835473043892418893832961361713245271878325525191685977948563471335830018462728971192771396177065000182871130646346122493022804369769311775658227284340604108071713601504782843904 = -757 bsr -877. +-399326552934552554555 = -399326552934552554837 + 282. +-399326552934552555119 = -399326552934552554837 - 282. +-112610087927543820464034 = -399326552934552554837 * 282. +399326552934552554837 = -(-399326552934552554837). +-399326552934552554837 = +(-399326552934552554837). +-1416051606150895584 = -399326552934552554837 div 282. +-149 = -399326552934552554837 rem 282. +10 = -399326552934552554837 band 282. +-399326552934552554565 = -399326552934552554837 bor 282. +-399326552934552554575 = -399326552934552554837 bxor 282. +399326552934552554836 = bnot(-399326552934552554837). +-162519239404282077726356668430744933325304730894253957182797269749815524173310489155599580175893087324766269535394202666586959435660185747865985481001922616246731215114933426566027267436359691332683403034291364290584270445935905624013135372400880425231187968 = -399326552934552554837 bsl 786. +-1 = -399326552934552554837 bsr 786. +7788556563963559887277654637 = 7788556563963286199292257816 + 273687985396821. +7788556563963012511306860995 = 7788556563963286199292257816 - 273687985396821. +2131634355140298218131081660650893798802936 = 7788556563963286199292257816 * 273687985396821. +-7788556563963286199292257816 = -(7788556563963286199292257816). +7788556563963286199292257816 = +(7788556563963286199292257816). +28457794932688 = 7788556563963286199292257816 div 273687985396821. +46202628072968 = 7788556563963286199292257816 rem 273687985396821. +220625256055824 = 7788556563963286199292257816 band 273687985396821. +7788556563963339262021598813 = 7788556563963286199292257816 bor 273687985396821. +7788556563963118636765542989 = 7788556563963286199292257816 bxor 273687985396821. +-7788556563963286199292257817 = bnot(7788556563963286199292257816). +1122449294055010765489568052730189407481495552 = 7788556563963286199292257816 bsl 57. +54043967661 = 7788556563963286199292257816 bsr 57. +455741584345907566712 = 455741584345945741559 + -38174847. +455741584345983916406 = 455741584345945741559 - -38174847. +-17397865253944073754316366473 = 455741584345945741559 * -38174847. +-455741584345945741559 = -(455741584345945741559). +455741584345945741559 = +(455741584345945741559). +-11938268785882 = 455741584345945741559 div -38174847. +24631505 = 455741584345945741559 rem -38174847. +455741584345941416065 = 455741584345945741559 band -38174847. +-33849353 = 455741584345945741559 bor -38174847. +-455741584345975265418 = 455741584345945741559 bxor -38174847. +-455741584345945741560 = bnot(455741584345945741559). +233339691185124219678208 = 455741584345945741559 bsl 9. +890120281925675276 = 455741584345945741559 bsr 9. +-374898793368034 = -374967657234849 + 68863866815. +-375036521101664 = -374967657234849 - 68863866815. +-25821722807753212712635935 = -374967657234849 * 68863866815. +374967657234849 = -(-374967657234849). +-374967657234849 = +(-374967657234849). +-5445 = -374967657234849 div 68863866815. +-3902427174 = -374967657234849 rem 68863866815. +68863669791 = -374967657234849 band 68863866815. +-374967657037825 = -374967657234849 bor 68863866815. +-375036520707616 = -374967657234849 bxor 68863866815. +374967657234848 = bnot(-374967657234849). +-5858869644295 = -374967657234849 bsl -6. +-23997930063030336 = -374967657234849 bsr -6. +695698116237678489407423938 = 695698116237678482758846255 + 6648577683. +695698116237678476110268572 = 695698116237678482758846255 - 6648577683. +4625402969722969084199765481821127165 = 695698116237678482758846255 * 6648577683. +-695698116237678482758846255 = -(695698116237678482758846255). +695698116237678482758846255 = +(695698116237678482758846255). +104638638428868077 = 695698116237678482758846255 div 6648577683. +3065520664 = 695698116237678482758846255 rem 6648577683. +4295493123 = 695698116237678482758846255 band 6648577683. +695698116237678485111930815 = 695698116237678482758846255 bor 6648577683. +695698116237678480816437692 = 695698116237678482758846255 bxor 6648577683. +-695698116237678482758846256 = bnot(695698116237678482758846255). +5435141533106863146553486 = 695698116237678482758846255 bsl -7. +89049358878422845793132320640 = 695698116237678482758846255 bsr -7. +867155941797334727149668788 = -2397633985559 + 867155941797337124783654347. +-867155941797339522417639906 = -2397633985559 - 867155941797337124783654347. +-2079122556832717644348186887614245574973 = -2397633985559 * 867155941797337124783654347. +2397633985559 = -(-2397633985559). +-2397633985559 = +(-2397633985559). +0 = -2397633985559 div 867155941797337124783654347. +-2397633985559 = -2397633985559 rem 867155941797337124783654347. +867155941797334891131568585 = -2397633985559 band 867155941797337124783654347. +-163981899797 = -2397633985559 bor 867155941797337124783654347. +-867155941797335055113468382 = -2397633985559 bxor 867155941797337124783654347. +2397633985558 = bnot(-2397633985559). +-4682878879 = -2397633985559 bsl -9. +-1227588600606208 = -2397633985559 bsr -9. +-99391269544746942 = -999 + -99391269544745943. +99391269544744944 = -999 - -99391269544745943. +99291878275201197057 = -999 * -99391269544745943. +999 = -(-999). +-999 = +(-999). +0 = -999 div -99391269544745943. +-999 = -999 rem -99391269544745943. +-99391269544745975 = -999 band -99391269544745943. +-967 = -999 bor -99391269544745943. +99391269544745008 = -999 bxor -99391269544745943. +998 = bnot(-999). +-271670709669862569774540092593109073255558924599964104333437283359848016026107591934168749958637596868208865360261250311337591172257307920471096554899364231471046369057053606816100556734464 = -999 bsl 616. +-1 = -999 bsr 616. +51170326738252384475287511615 = -53532239445214813437776259 + 51223858977697599288725287874. +-51277391217142814102163064133 = -53532239445214813437776259 - 51223858977697599288725287874. +-2742127884102024373168869308493551385093294966177783366 = -53532239445214813437776259 * 51223858977697599288725287874. +53532239445214813437776259 = -(-53532239445214813437776259). +-53532239445214813437776259 = +(-53532239445214813437776259). +0 = -53532239445214813437776259 div 51223858977697599288725287874. +-53532239445214813437776259 = -53532239445214813437776259 rem 51223858977697599288725287874. +51223547227586499364060668480 = -53532239445214813437776259 band 51223858977697599288725287874. +-53220489334114888773156865 = -53532239445214813437776259 bor 51223858977697599288725287874. +-51276767716920614252833825345 = -53532239445214813437776259 bxor 51223858977697599288725287874. +53532239445214813437776258 = bnot(-53532239445214813437776259). +-1713031662246874030008840288 = -53532239445214813437776259 bsl 5. +-1672882482662962919930509 = -53532239445214813437776259 bsr 5. +73264835839749594226010 = 8662 + 73264835839749594217348. +-73264835839749594208686 = 8662 - 73264835839749594217348. +634620008043910985110668376 = 8662 * 73264835839749594217348. +-8662 = -(8662). +8662 = +(8662). +0 = 8662 div 73264835839749594217348. +8662 = 8662 rem 73264835839749594217348. +8580 = 8662 band 73264835839749594217348. +73264835839749594217430 = 8662 bor 73264835839749594217348. +73264835839749594208850 = 8662 bxor 73264835839749594217348. +-8663 = bnot(8662). +67 = 8662 bsl -7. +1108736 = 8662 bsr -7. +-88648668659335769732449251 = -88648668659335769732446832 + -2419. +-88648668659335769732444413 = -88648668659335769732446832 - -2419. +214441129486933226982788886608 = -88648668659335769732446832 * -2419. +88648668659335769732446832 = -(-88648668659335769732446832). +-88648668659335769732446832 = +(-88648668659335769732446832). +36646824580130537301548 = -88648668659335769732446832 div -2419. +-2220 = -88648668659335769732446832 rem -2419. +-88648668659335769732447104 = -88648668659335769732446832 band -2419. +-2147 = -88648668659335769732446832 bor -2419. +88648668659335769732444957 = -88648668659335769732446832 bxor -2419. +88648668659335769732446831 = bnot(-88648668659335769732446832). +-1 = -88648668659335769732446832 bsl -277. +-21526876367714690857102338451583587804202513123842334826095893895994143205595507487537586045998436466561122304 = -88648668659335769732446832 bsr -277. +472407689385533914110659 = -92176733159392931236298 + 564584422544926845346957. +-656761155704319776583255 = -92176733159392931236298 - 564584422544926845346957. +-52041547662873668367867286690437311862762245186 = -92176733159392931236298 * 564584422544926845346957. +92176733159392931236298 = -(-92176733159392931236298). +-92176733159392931236298 = +(-92176733159392931236298). +0 = -92176733159392931236298 div 564584422544926845346957. +-92176733159392931236298 = -92176733159392931236298 rem 564584422544926845346957. +472421606637668457948164 = -92176733159392931236298 band 564584422544926845346957. +-13917252134543837505 = -92176733159392931236298 bor 564584422544926845346957. +-472435523889803001785669 = -92176733159392931236298 bxor 564584422544926845346957. +92176733159392931236297 = bnot(-92176733159392931236298). +-197948027185855697436738379055104 = -92176733159392931236298 bsl 31. +-42923136222825 = -92176733159392931236298 bsr 31. +926565856438049866558555264 = 933124279636981428678231393 + -6558423198931562119676129. +939682702835912990797907522 = 933124279636981428678231393 - -6558423198931562119676129. +-6119823923057481252398382601992868036026185680517697 = 933124279636981428678231393 * -6558423198931562119676129. +-933124279636981428678231393 = -(933124279636981428678231393). +933124279636981428678231393 = +(933124279636981428678231393). +-142 = 933124279636981428678231393 div -6558423198931562119676129. +1828185388699607684221075 = 933124279636981428678231393 rem -6558423198931562119676129. +931552902605547407822423297 = 933124279636981428678231393 band -6558423198931562119676129. +-4987046167497541263868033 = 933124279636981428678231393 bor -6558423198931562119676129. +-936539948773044949086291330 = 933124279636981428678231393 bxor -6558423198931562119676129. +-933124279636981428678231394 = bnot(933124279636981428678231393). +108629963318465909 = 933124279636981428678231393 bsl -33. +8015476528288787976664720680111046656 = 933124279636981428678231393 bsr -33. +-272843753421484620759016887177 = -272836611788825721137484413564 + -7141632658899621532473613. +-272829470156166821515951939951 = -272836611788825721137484413564 - -7141632658899621532473613. +1948498857294595260358231217824490200133654665609286732 = -272836611788825721137484413564 * -7141632658899621532473613. +272836611788825721137484413564 = -(-272836611788825721137484413564). +-272836611788825721137484413564 = +(-272836611788825721137484413564). +38203 = -272836611788825721137484413564 div -7141632658899621532473613. +-4819320883479732394976125 = -272836611788825721137484413564 rem -7141632658899621532473613. +-272837556339268983097432947584 = -272836611788825721137484413564 band -7141632658899621532473613. +-6197082215637661583939593 = -272836611788825721137484413564 bor -7141632658899621532473613. +272831359257053345435849007991 = -272836611788825721137484413564 bxor -7141632658899621532473613. +272836611788825721137484413563 = bnot(-272836611788825721137484413564). +-1 = -272836611788825721137484413564 bsl -975. +-87126129236002257870538958730310744500573154348629344446020418054995206413443356585847042214910091639020918677712597473077059225043718786652309645154890346722009375561018953488114368585295148197269160637768429141827421422749860346865955452200127047946305111734795397098009767822432538074840838252544803626856997705431908352 = -272836611788825721137484413564 bsr -975. +542255456896764093697 = 542255456889625635573 + 7138458124. +542255456882487177449 = 542255456889625635573 - 7138458124. +3870867871517079889574745245052 = 542255456889625635573 * 7138458124. +-542255456889625635573 = -(542255456889625635573). +542255456889625635573 = +(542255456889625635573). +75962546458 = 542255456889625635573 div 7138458124. +6788110781 = 542255456889625635573 rem 7138458124. +692333060 = 542255456889625635573 band 7138458124. +542255456896071760637 = 542255456889625635573 bor 7138458124. +542255456895379427577 = 542255456889625635573 bxor 7138458124. +-542255456889625635574 = bnot(542255456889625635573). +8676087310234010169168 = 542255456889625635573 bsl 4. +33890966055601602223 = 542255456889625635573 bsr 4. +55994598326593711852577100 = -5774543 + 55994598326593711858351643. +-55994598326593711864126186 = -5774543 - 55994598326593711858351643. +-323343215804643432655661471624149 = -5774543 * 55994598326593711858351643. +5774543 = -(-5774543). +-5774543 = +(-5774543). +0 = -5774543 div 55994598326593711858351643. +-5774543 = -5774543 rem 55994598326593711858351643. +55994598326593711857820177 = -5774543 band 55994598326593711858351643. +-5243077 = -5774543 bor 55994598326593711858351643. +-55994598326593711863063254 = -5774543 bxor 55994598326593711858351643. +5774542 = bnot(-5774543). +-1443636 = -5774543 bsl -2. +-23098172 = -5774543 bsr -2. +-242182668347924615038 = -242182668347924614996 + -42. +-242182668347924614954 = -242182668347924614996 - -42. +10171672070612833829832 = -242182668347924614996 * -42. +242182668347924614996 = -(-242182668347924614996). +-242182668347924614996 = +(-242182668347924614996). +5766254008283919404 = -242182668347924614996 div -42. +-28 = -242182668347924614996 rem -42. +-242182668347924615036 = -242182668347924614996 band -42. +-2 = -242182668347924614996 bor -42. +242182668347924615034 = -242182668347924614996 bxor -42. +242182668347924614995 = bnot(-242182668347924614996). +-3874922693566793839936 = -242182668347924614996 bsl 4. +-15136416771745288438 = -242182668347924614996 bsr 4. +7797689768344356 = 7797689768344352 + 4. +7797689768344348 = 7797689768344352 - 4. +31190759073377408 = 7797689768344352 * 4. +-7797689768344352 = -(7797689768344352). +7797689768344352 = +(7797689768344352). +1949422442086088 = 7797689768344352 div 4. +0 = 7797689768344352 rem 4. +0 = 7797689768344352 band 4. +7797689768344356 = 7797689768344352 bor 4. +7797689768344356 = 7797689768344352 bxor 4. +-7797689768344353 = bnot(7797689768344352). +4942373057617620444148698860578715267472818176 = 7797689768344352 bsl 99. +0 = 7797689768344352 bsr 99. +3825348573927459346362328 = -67412241 + 3825348573927459413774569. +-3825348573927459481186810 = -67412241 - 3825348573927459413774569. +-257875319974604210519089965099129 = -67412241 * 3825348573927459413774569. +67412241 = -(-67412241). +-67412241 = +(-67412241). +0 = -67412241 div 3825348573927459413774569. +-67412241 = -67412241 rem 3825348573927459413774569. +3825348573927459413774569 = -67412241 band 3825348573927459413774569. +-67412241 = -67412241 bor 3825348573927459413774569. +-3825348573927459481186810 = -67412241 bxor 3825348573927459413774569. +67412240 = bnot(-67412241). +-1078595856 = -67412241 bsl 4. +-4213266 = -67412241 bsr 4. +4912958129896753774 = -71229483 + 4912958129967983257. +-4912958130039212740 = -71229483 - 4912958129967983257. +-349947467598266253948766131 = -71229483 * 4912958129967983257. +71229483 = -(-71229483). +-71229483 = +(-71229483). +0 = -71229483 div 4912958129967983257. +-71229483 = -71229483 rem 4912958129967983257. +4912958129899113105 = -71229483 band 4912958129967983257. +-2359331 = -71229483 bor 4912958129967983257. +-4912958129901472436 = -71229483 bxor 4912958129967983257. +71229482 = bnot(-71229483). +-1 = -71229483 bsl -762. +-1727891579105090281002224014699820654642608174830491410613854965292061717054813855570284937448861315846627197740623061370480532122428365964742753217260345878982568113105352124889753543881032588882929824556216264339246144840554599659077632 = -71229483 bsr -762. +46494293391644389 = 46494293391868173 + -223784. +46494293392091957 = 46494293391868173 - -223784. +-10404678952405827226632 = 46494293391868173 * -223784. +-46494293391868173 = -(46494293391868173). +46494293391868173 = +(46494293391868173). +-207764153790 = 46494293391868173 div -223784. +126813 = 46494293391868173 rem -223784. +46494293391868168 = 46494293391868173 band -223784. +-223779 = 46494293391868173 bor -223784. +-46494293392091947 = 46494293391868173 bxor -223784. +-46494293391868174 = bnot(46494293391868173). +0 = 46494293391868173 bsl -91. +115114294776150565191781242098022401917845504 = 46494293391868173 bsr -91. +-412781543671019436383555080573 = -8847989186169711636 + -412781543662171447197385368937. +412781543653323458011215657301 = -8847989186169711636 - -412781543662171447197385368937. +3652286634573333633165948299445552201166761850932 = -8847989186169711636 * -412781543662171447197385368937. +8847989186169711636 = -(-8847989186169711636). +-8847989186169711636 = +(-8847989186169711636). +0 = -8847989186169711636 div -412781543662171447197385368937. +-8847989186169711636 = -8847989186169711636 rem -412781543662171447197385368937. +-412781543670982818247229615484 = -8847989186169711636 band -412781543662171447197385368937. +-36618136325465089 = -8847989186169711636 bor -412781543662171447197385368937. +412781543670946200110904150395 = -8847989186169711636 bxor -412781543662171447197385368937. +8847989186169711635 = bnot(-8847989186169711636). +-250128699564397448650083420076872233779944628446086238630703601982129156400429730446574616576 = -8847989186169711636 bsl 244. +-1 = -8847989186169711636 bsr 244. +-6743223186536623446244856 = -6743223186536623446251414 + 6558. +-6743223186536623446257972 = -6743223186536623446251414 - 6558. +-44222057657307176560516773012 = -6743223186536623446251414 * 6558. +6743223186536623446251414 = -(-6743223186536623446251414). +-6743223186536623446251414 = +(-6743223186536623446251414). +-1028243852780820897568 = -6743223186536623446251414 div 6558. +-470 = -6743223186536623446251414 rem 6558. +2058 = -6743223186536623446251414 band 6558. +-6743223186536623446246914 = -6743223186536623446251414 bor 6558. +-6743223186536623446248972 = -6743223186536623446251414 bxor 6558. +6743223186536623446251413 = bnot(-6743223186536623446251414). +-93581021 = -6743223186536623446251414 bsl -56. +-485900438882598815873542327663439070101504 = -6743223186536623446251414 bsr -56. +276366 = -7313 + 283679. +-290992 = -7313 - 283679. +-2074544527 = -7313 * 283679. +7313 = -(-7313). +-7313 = +(-7313). +0 = -7313 div 283679. +-7313 = -7313 rem 283679. +278543 = -7313 band 283679. +-2177 = -7313 bor 283679. +-280720 = -7313 bxor 283679. +7312 = bnot(-7313). +-2853668393557606398511702567684678149242437277163616753279126855717542940748618247492474816462914598136476793411355829154301380767829403805612507136 = -7313 bsl 477. +-1 = -7313 bsr 477. +-639444299611848222499 = -3155 + -639444299611848219344. +639444299611848216189 = -3155 - -639444299611848219344. +2017446765275381132030320 = -3155 * -639444299611848219344. +3155 = -(-3155). +-3155 = +(-3155). +0 = -3155 div -639444299611848219344. +-3155 = -3155 rem -639444299611848219344. +-639444299611848220384 = -3155 band -639444299611848219344. +-2115 = -3155 bor -639444299611848219344. +639444299611848218269 = -3155 bxor -639444299611848219344. +3154 = bnot(-3155). +-25240 = -3155 bsl 3. +-395 = -3155 bsr 3. +-36455956348806219 = -36455956348738666 + -67553. +-36455956348671113 = -36455956348738666 - -67553. +2462709219226343104298 = -36455956348738666 * -67553. +36455956348738666 = -(-36455956348738666). +-36455956348738666 = +(-36455956348738666). +539664505628 = -36455956348738666 div -67553. +-50382 = -36455956348738666 rem -67553. +-36455956348739562 = -36455956348738666 band -67553. +-66657 = -36455956348738666 bor -67553. +36455956348672905 = -36455956348738666 bxor -67553. +36455956348738665 = bnot(-36455956348738666). +-328366062855229048242919725596672 = -36455956348738666 bsl 53. +-5 = -36455956348738666 bsr 53. +-679412090374 = -679451664999 + 39574625. +-679491239624 = -679451664999 - 39574625. +-26889044847961050375 = -679451664999 * 39574625. +679451664999 = -(-679451664999). +-679451664999 = +(-679451664999). +-17168 = -679451664999 div 39574625. +-34502999 = -679451664999 rem 39574625. +154625 = -679451664999 band 39574625. +-679412244999 = -679451664999 bor 39574625. +-679412399624 = -679451664999 bxor 39574625. +679451664998 = bnot(-679451664999). +-155670007609233581977874185118449598377546383149890798288746270941756522693250308637177806401228008507407190240376022799438910969536738155724260046465671742417127808182973484591722793433869805526063007222467423793961010534599949406815404079106073067451699148357632 = -679451664999 bsl 835. +-1 = -679451664999 bsr 835. +-31223276117594453328647389 = -8 + -31223276117594453328647381. +31223276117594453328647373 = -8 - -31223276117594453328647381. +249786208940755626629179048 = -8 * -31223276117594453328647381. +8 = -(-8). +-8 = +(-8). +0 = -8 div -31223276117594453328647381. +-8 = -8 rem -31223276117594453328647381. +-31223276117594453328647384 = -8 band -31223276117594453328647381. +-5 = -8 bor -31223276117594453328647381. +31223276117594453328647379 = -8 bxor -31223276117594453328647381. +7 = bnot(-8). +-645562469521727147413979793000752968582426448207305878207664839135161905504210298657411338320034457858975792993186873344 = -8 bsl 395. +-1 = -8 bsr 395. +-7822355794946638 = 6175 + -7822355794952813. +7822355794958988 = 6175 - -7822355794952813. +-48303047033833620275 = 6175 * -7822355794952813. +-6175 = -(6175). +6175 = +(6175). +0 = 6175 div -7822355794952813. +6175 = 6175 rem -7822355794952813. +6163 = 6175 band -7822355794952813. +-7822355794952801 = 6175 bor -7822355794952813. +-7822355794958964 = 6175 bxor -7822355794952813. +-6176 = bnot(6175). +15288559485174446395004184166400 = 6175 bsl 91. +0 = 6175 bsr 91. +-64646795518781450802 = -27267 + -64646795518781423535. +64646795518781396268 = -27267 - -64646795518781423535. +1762724173410613075528845 = -27267 * -64646795518781423535. +27267 = -(-27267). +-27267 = +(-27267). +0 = -27267 div -64646795518781423535. +-27267 = -27267 rem -64646795518781423535. +-64646795518781423535 = -27267 band -64646795518781423535. +-27267 = -27267 bor -64646795518781423535. +64646795518781396268 = -27267 bxor -64646795518781423535. +27266 = bnot(-27267). +-4219363881399307994459302526976 = -27267 bsl 87. +-1 = -27267 bsr 87. +436976517494451682725159518 = 51571916895 + 436976517494451631153242623. +-436976517494451579581325728 = 51571916895 - 436976517494451631153242623. +22535716645290373145432221563127815585 = 51571916895 * 436976517494451631153242623. +-51571916895 = -(51571916895). +51571916895 = +(51571916895). +0 = 51571916895 div 436976517494451631153242623. +51571916895 = 51571916895 rem 436976517494451631153242623. +34366292063 = 51571916895 band 436976517494451631153242623. +436976517494451648358867455 = 51571916895 bor 436976517494451631153242623. +436976517494451613992575392 = 51571916895 bxor 436976517494451631153242623. +-51571916896 = bnot(51571916895). +6601205362560 = 51571916895 bsl 7. +402905600 = 51571916895 bsr 7. +-912671397920102774968391 = 3249731726658748667948 + -915921129646761523636339. +919170861373420272304287 = 3249731726658748667948 - -915921129646761523636339. +-2976497954130201920617341300258571233417362372 = 3249731726658748667948 * -915921129646761523636339. +-3249731726658748667948 = -(3249731726658748667948). +3249731726658748667948 = +(3249731726658748667948). +0 = 3249731726658748667948 div -915921129646761523636339. +3249731726658748667948 = 3249731726658748667948 rem -915921129646761523636339. +562967133327372 = 3249731726658748667948 band -915921129646761523636339. +-912671398483069908295763 = 3249731726658748667948 bor -915921129646761523636339. +-912671399046037041623135 = 3249731726658748667948 bxor -915921129646761523636339. +-3249731726658748667949 = bnot(3249731726658748667948). +11 = 3249731726658748667948 bsl -68. +959151511518210887716537591521349612863488 = 3249731726658748667948 bsr -68. +-62758589555098529255606427693 = -26295371273478989759811 + -62758563259727255776616667882. +62758536964355982297626908071 = -26295371273478989759811 - -62758563259727255776616667882. +1650259721504646028505429441211136333805018338090302 = -26295371273478989759811 * -62758563259727255776616667882. +26295371273478989759811 = -(-26295371273478989759811). +-26295371273478989759811 = +(-26295371273478989759811). +0 = -26295371273478989759811 div -62758563259727255776616667882. +-26295371273478989759811 = -26295371273478989759811 rem -62758563259727255776616667882. +-62758586872718261130464813036 = -26295371273478989759811 band -62758563259727255776616667882. +-2682380268125141614657 = -26295371273478989759811 bor -62758563259727255776616667882. +62758584190337993005323198379 = -26295371273478989759811 bxor -62758563259727255776616667882. +26295371273478989759810 = bnot(-26295371273478989759811). +-841451880751327672313952 = -26295371273478989759811 bsl 5. +-821730352296218429995 = -26295371273478989759811 bsr 5. +-23513526692704330458733 = -23513526661191814622388 + -31512515836345. +-23513526629679298786043 = -23513526661191814622388 - -31512515836345. +740970381279127431619689386181091860 = -23513526661191814622388 * -31512515836345. +23513526661191814622388 = -(-23513526661191814622388). +-23513526661191814622388 = +(-23513526661191814622388). +746164691 = -23513526661191814622388 div -31512515836345. +-19532841127993 = -23513526661191814622388 rem -31512515836345. +-23513526679471195684284 = -23513526661191814622388 band -31512515836345. +-13233134774449 = -23513526661191814622388 bor -31512515836345. +23513526666238060909835 = -23513526661191814622388 bxor -31512515836345. +23513526661191814622387 = bnot(-23513526661191814622388). +-1298275173872345034147165274034282455511155004697235724928149296177900551399900966119521910784 = -23513526661191814622388 bsl 235. +-1 = -23513526661191814622388 bsr 235. +9482913998 = 3 + 9482913995. +-9482913992 = 3 - 9482913995. +28448741985 = 3 * 9482913995. +-3 = -(3). +3 = +(3). +0 = 3 div 9482913995. +3 = 3 rem 9482913995. +3 = 3 band 9482913995. +9482913995 = 3 bor 9482913995. +9482913992 = 3 bxor 9482913995. +-4 = bnot(3). +96 = 3 bsl 5. +0 = 3 bsr 5. +-55166011823650092204876573962 = 647941623139971541625682 + -55166659765273232176418199644. +55167307706896372147959825326 = 647941623139971541625682 - -55166659765273232176418199644. +-35744775071521699508529009213111107931222023393657208 = 647941623139971541625682 * -55166659765273232176418199644. +-647941623139971541625682 = -(647941623139971541625682). +647941623139971541625682 = +(647941623139971541625682). +0 = 647941623139971541625682 div -55166659765273232176418199644. +647941623139971541625682 = 647941623139971541625682 rem -55166659765273232176418199644. +5398843323464184029952 = 647941623139971541625682 band -55166659765273232176418199644. +-55166017222493415669060603914 = 647941623139971541625682 bor -55166659765273232176418199644. +-55166022621336739133244633866 = 647941623139971541625682 bxor -55166659765273232176418199644. +-647941623139971541625683 = bnot(647941623139971541625682). +3059817803972356533925082117027148782131740672 = 647941623139971541625682 bsl 72. +137 = 647941623139971541625682 bsr 72. +-94676213915211394031 = -94676213915211394576 + 545. +-94676213915211395121 = -94676213915211394576 - 545. +-51598536583790210043920 = -94676213915211394576 * 545. +94676213915211394576 = -(-94676213915211394576). +-94676213915211394576 = +(-94676213915211394576). +-173717823697635586 = -94676213915211394576 div 545. +-206 = -94676213915211394576 rem 545. +32 = -94676213915211394576 band 545. +-94676213915211394063 = -94676213915211394576 bor 545. +-94676213915211394095 = -94676213915211394576 bxor 545. +94676213915211394575 = bnot(-94676213915211394576). +-24237110762294117011456 = -94676213915211394576 bsl 8. +-369828960606294511 = -94676213915211394576 bsr 8. +8476635749175533995 = -421 + 8476635749175534416. +-8476635749175534837 = -421 - 8476635749175534416. +-3568663650402899989136 = -421 * 8476635749175534416. +421 = -(-421). +-421 = +(-421). +0 = -421 div 8476635749175534416. +-421 = -421 rem 8476635749175534416. +8476635749175534160 = -421 band 8476635749175534416. +-165 = -421 bor 8476635749175534416. +-8476635749175534325 = -421 bxor 8476635749175534416. +420 = bnot(-421). +-1 = -421 bsl -45. +-14812620649398272 = -421 bsr -45. +217959599599587342411256227 = 593 + 217959599599587342411255634. +-217959599599587342411255041 = 593 - 217959599599587342411255634. +129250042562555294049874590962 = 593 * 217959599599587342411255634. +-593 = -(593). +593 = +(593). +0 = 593 div 217959599599587342411255634. +593 = 593 rem 217959599599587342411255634. +592 = 593 band 217959599599587342411255634. +217959599599587342411255635 = 593 bor 217959599599587342411255634. +217959599599587342411255043 = 593 bxor 217959599599587342411255634. +-594 = bnot(593). +151808 = 593 bsl 8. +2 = 593 bsr 8. +79988115792698 = -563244 + 79988116355942. +-79988116919186 = -563244 - 79988116355942. +-45052826608786195848 = -563244 * 79988116355942. +563244 = -(-563244). +-563244 = +(-563244). +0 = -563244 div 79988116355942. +-563244 = -563244 rem 79988116355942. +79988116316996 = -563244 band 79988116355942. +-524298 = -563244 bor 79988116355942. +-79988116841294 = -563244 bxor 79988116355942. +563243 = bnot(-563244). +-1 = -563244 bsl -863. +-34640394721061065329294333911444814820087240462411338301543274614380197084003586409358386052212163938506038968169842635468627438974162867844936272174280595390147919468853578393758858430914247218108454374614230194304365670276172533634851456485821480532627746981937152 = -563244 bsr -863. +-8556525880857951556791276 = 726465657566678 + -8556525881584417214357954. +8556525882310882871924632 = 726465657566678 - -8556525881584417214357954. +-6216022201051522826115155263983714656812 = 726465657566678 * -8556525881584417214357954. +-726465657566678 = -(726465657566678). +726465657566678 = +(726465657566678). +0 = 726465657566678 div -8556525881584417214357954. +726465657566678 = 726465657566678 rem -8556525881584417214357954. +21996143711254 = 726465657566678 band -8556525881584417214357954. +-8556525880879947700502530 = 726465657566678 bor -8556525881584417214357954. +-8556525880901943844213784 = 726465657566678 bxor -8556525881584417214357954. +-726465657566679 = bnot(726465657566678). +185975208337069568 = 726465657566678 bsl 8. +2837756474869 = 726465657566678 bsr 8. +9789649 = -28126 + 9817775. +-9845901 = -28126 - 9817775. +-276134739650 = -28126 * 9817775. +28126 = -(-28126). +-28126 = +(-28126). +0 = -28126 div 9817775. +-28126 = -28126 rem 9817775. +9798178 = -28126 band 9817775. +-8529 = -28126 bor 9817775. +-9806707 = -28126 bxor 9817775. +28125 = bnot(-28126). +-1 = -28126 bsl -64. +-518833123817154848751616 = -28126 bsr -64. +63316455963147 = 9 + 63316455963138. +-63316455963129 = 9 - 63316455963138. +569848103668242 = 9 * 63316455963138. +-9 = -(9). +9 = +(9). +0 = 9 div 63316455963138. +9 = 9 rem 63316455963138. +0 = 9 band 63316455963138. +63316455963147 = 9 bor 63316455963138. +63316455963147 = 9 bxor 63316455963138. +-10 = bnot(9). +144 = 9 bsl 4. +0 = 9 bsr 4. +7296844515889252715100 = 7296838576556419786673 + 5939332832928427. +7296832637223586858246 = 7296838576556419786673 - 5939332832928427. +43338352934320271488477932101217453371 = 7296838576556419786673 * 5939332832928427. +-7296838576556419786673 = -(7296838576556419786673). +7296838576556419786673 = +(7296838576556419786673). +1228561 = 7296838576556419786673 div 5939332832928427. +5892001038583126 = 7296838576556419786673 rem 5939332832928427. +4531096076493473 = 7296838576556419786673 band 5939332832928427. +7296839984793176221627 = 7296838576556419786673 bor 5939332832928427. +7296835453697099728154 = 7296838576556419786673 bxor 5939332832928427. +-7296838576556419786674 = bnot(7296838576556419786673). +0 = 7296838576556419786673 bsl -532. +102587024151951932244548571765698531258935873397019643020672834543681182372243810323536922545540017678616196319719868675345631069947330350527532819302325602914141803302531159931486208 = 7296838576556419786673 bsr -532. +-91245673612382390408697634 = -91245673612417952937469295 + 35562528771661. +-91245673612453515466240956 = -91245673612417952937469295 - 35562528771661. +-3244926893131202344473484034258253648995 = -91245673612417952937469295 * 35562528771661. +91245673612417952937469295 = -(-91245673612417952937469295). +-91245673612417952937469295 = +(-91245673612417952937469295). +-2565781364938 = -91245673612417952937469295 div 35562528771661. +-18695824047277 = -91245673612417952937469295 rem 35562528771661. +378108185089 = -91245673612417952937469295 band 35562528771661. +-91245673612382768516882723 = -91245673612417952937469295 bor 35562528771661. +-91245673612383146625067812 = -91245673612417952937469295 bxor 35562528771661. +91245673612417952937469294 = bnot(-91245673612417952937469295). +-1 = -91245673612417952937469295 bsl -686. +-29294717018410934065107356110468495676928046273552651572128166411163755894770684486824260955216737260266573314290990495657167626170151376088394384892210106258096923019338891602242482231931183866946163680066951951064290274210354298880 = -91245673612417952937469295 bsr -686. +-9199662011147518 = -9283927165491291 + 84265154343773. +-9368192319835064 = -9283927165491291 - 84265154343773. +-782311555516470615236251580943 = -9283927165491291 * 84265154343773. +9283927165491291 = -(-9283927165491291). +-9283927165491291 = +(-9283927165491291). +-110 = -9283927165491291 div 84265154343773. +-14760187676261 = -9283927165491291 rem 84265154343773. +4402375435013 = -9283927165491291 band 84265154343773. +-9204064386582531 = -9283927165491291 bor 84265154343773. +-9208466762017544 = -9283927165491291 bxor 84265154343773. +9283927165491290 = bnot(-9283927165491291). +-74271417323930328 = -9283927165491291 bsl 3. +-1160490895686412 = -9283927165491291 bsr 3. +6122188 = -584 + 6122772. +-6123356 = -584 - 6122772. +-3575698848 = -584 * 6122772. +584 = -(-584). +-584 = +(-584). +0 = -584 div 6122772. +-584 = -584 rem 6122772. +6122768 = -584 band 6122772. +-580 = -584 bor 6122772. +-6123348 = -584 bxor 6122772. +583 = bnot(-584). +-40656514292775909541113955958999178066065146610003036490756964576006724512479669093619584378194349631816514721542040006552767998615772335677788607951626176238085401761267009442877174808838144 = -584 bsl 624. +-1 = -584 bsr 624. +53933372059795890975 = 37215668448636 + 53933334844127442339. +-53933297628458993703 = 37215668448636 - 53933334844127442339. +2007165107888314254907326673199604 = 37215668448636 * 53933334844127442339. +-37215668448636 = -(37215668448636). +37215668448636 = +(37215668448636). +0 = 37215668448636 div 53933334844127442339. +37215668448636 = 37215668448636 rem 53933334844127442339. +35494148744480 = 37215668448636 band 53933334844127442339. +53933336565647146495 = 37215668448636 bor 53933334844127442339. +53933301071498402015 = 37215668448636 bxor 53933334844127442339. +-37215668448637 = bnot(37215668448636). +595450695178176 = 37215668448636 bsl 4. +2325979278039 = 37215668448636 bsr 4. +9566197812430892 = 9534647661 + 9566188277783231. +-9566178743135570 = 9534647661 - 9566188277783231. +91210234687451501719172691 = 9534647661 * 9566188277783231. +-9534647661 = -(9534647661). +9534647661 = +(9534647661). +0 = 9534647661 div 9566188277783231. +9534647661 = 9534647661 rem 9566188277783231. +395309 = 9534647661 band 9566188277783231. +9566197812035583 = 9534647661 bor 9566188277783231. +9566197811640274 = 9534647661 bxor 9566188277783231. +-9534647662 = bnot(9534647661). +0 = 9534647661 bsl -793. +496696626687282375377939935965836735613470956377184826911039002953819968230271768556956314417265994372395239252551698187320658279355797931861652732925518299196794659366716565832577633856476303462101737891022331623015356684381760015565255495240384512 = 9534647661 bsr -793. +938397723693288956 = 938397723693288917 + 39. +938397723693288878 = 938397723693288917 - 39. +36597511224038267763 = 938397723693288917 * 39. +-938397723693288917 = -(938397723693288917). +938397723693288917 = +(938397723693288917). +24061480094699715 = 938397723693288917 div 39. +32 = 938397723693288917 rem 39. +5 = 938397723693288917 band 39. +938397723693288951 = 938397723693288917 bor 39. +938397723693288946 = 938397723693288917 bxor 39. +-938397723693288918 = bnot(938397723693288917). +58649857730830557 = 938397723693288917 bsl -4. +15014363579092622672 = 938397723693288917 bsr -4. +43959977489574816370 = -9768 + 43959977489574826138. +-43959977489574835906 = -9768 - 43959977489574826138. +-429401060118166901715984 = -9768 * 43959977489574826138. +9768 = -(-9768). +-9768 = +(-9768). +0 = -9768 div 43959977489574826138. +-9768 = -9768 rem 43959977489574826138. +43959977489574826136 = -9768 band 43959977489574826138. +-9766 = -9768 bor 43959977489574826138. +-43959977489574835902 = -9768 bxor 43959977489574826138. +9767 = bnot(-9768). +-1 = -9768 bsl -94. +-193475172859833512403434326720512 = -9768 bsr -94. +2962685 = 2962587 + 98. +2962489 = 2962587 - 98. +290333526 = 2962587 * 98. +-2962587 = -(2962587). +2962587 = +(2962587). +30230 = 2962587 div 98. +47 = 2962587 rem 98. +2 = 2962587 band 98. +2962683 = 2962587 bor 98. +2962681 = 2962587 bxor 98. +-2962588 = bnot(2962587). +46290 = 2962587 bsl -6. +189605568 = 2962587 bsr -6. +-889113815585846537540801435783 = -889113815585846533226317722798 + -4314483712985. +-889113815585846528911834009813 = -889113815585846533226317722798 - -4314483712985. +3836067076335083713688673459976825023132030 = -889113815585846533226317722798 * -4314483712985. +889113815585846533226317722798 = -(-889113815585846533226317722798). +-889113815585846533226317722798 = +(-889113815585846533226317722798). +206076526122915435 = -889113815585846533226317722798 div -4314483712985. +-734351299323 = -889113815585846533226317722798 rem -4314483712985. +-889113815585846533930864343038 = -889113815585846533226317722798 band -4314483712985. +-3609937092745 = -889113815585846533226317722798 bor -4314483712985. +889113815585846530320927250293 = -889113815585846533226317722798 bxor -4314483712985. +889113815585846533226317722797 = bnot(-889113815585846533226317722798). +-1791816582989376561490997744830221417691895980460967584164720991418785143992020564566076037250058614790535884958141103004067848722060363009988868482825768479955320716208227978961243998689015388323903187582743175153472415090077713829853735621254211466096507757345074364569772653221305600664666112 = -889113815585846533226317722798 bsl 878. +-1 = -889113815585846533226317722798 bsr 878. +-28463619149739495954188715 = -28463619149739495954188711 + -4. +-28463619149739495954188707 = -28463619149739495954188711 - -4. +113854476598957983816754844 = -28463619149739495954188711 * -4. +28463619149739495954188711 = -(-28463619149739495954188711). +-28463619149739495954188711 = +(-28463619149739495954188711). +7115904787434873988547177 = -28463619149739495954188711 div -4. +-3 = -28463619149739495954188711 rem -4. +-28463619149739495954188712 = -28463619149739495954188711 band -4. +-3 = -28463619149739495954188711 bor -4. +28463619149739495954188709 = -28463619149739495954188711 bxor -4. +28463619149739495954188710 = bnot(-28463619149739495954188711). +-53017622138819650 = -28463619149739495954188711 bsl -29. +-15281289171741307755345603494674432 = -28463619149739495954188711 bsr -29. +-39144435271099 = -39144434357238 + -913861. +-39144433443377 = -39144434357238 - -913861. +35772571926139875918 = -39144434357238 * -913861. +39144434357238 = -(-39144434357238). +-39144434357238 = +(-39144434357238). +42834122 = -39144434357238 div -913861. +-792196 = -39144434357238 rem -913861. +-39144434693110 = -39144434357238 band -913861. +-577989 = -39144434357238 bor -913861. +39144434115121 = -39144434357238 bxor -913861. +39144434357237 = bnot(-39144434357238). +-156577737428952 = -39144434357238 bsl 2. +-9786108589310 = -39144434357238 bsr 2. +-2267949984571668733125 = -2267949984568444421677 + -3224311448. +-2267949984565220110229 = -2267949984568444421677 - -3224311448. +7312577098735458688364890458296 = -2267949984568444421677 * -3224311448. +2267949984568444421677 = -(-2267949984568444421677). +-2267949984568444421677 = +(-2267949984568444421677). +703390482323 = -2267949984568444421677 div -3224311448. +-153887973 = -2267949984568444421677 rem -3224311448. +-2267949984568447047360 = -2267949984568444421677 band -3224311448. +-3221685765 = -2267949984568444421677 bor -3224311448. +2267949984565225361595 = -2267949984568444421677 bxor -3224311448. +2267949984568444421676 = bnot(-2267949984568444421677). +-4429589813610243012 = -2267949984568444421677 bsl -9. +-1161190392099043543898624 = -2267949984568444421677 bsr -9. +-24642187589952063846 = -917727727296215997 + -23724459862655847849. +22806732135359631852 = -917727727296215997 - -23724459862655847849. +21772594631085447961223694261471840453 = -917727727296215997 * -23724459862655847849. +917727727296215997 = -(-917727727296215997). +-917727727296215997 = +(-917727727296215997). +0 = -917727727296215997 div -23724459862655847849. +-917727727296215997 = -917727727296215997 rem -23724459862655847849. +-24048798206334435261 = -917727727296215997 band -23724459862655847849. +-593389383617628585 = -917727727296215997 bor -23724459862655847849. +23455408822716806676 = -917727727296215997 bxor -23724459862655847849. +917727727296215996 = bnot(-917727727296215997). +-3584873934750844 = -917727727296215997 bsl -8. +-234938298187831295232 = -917727727296215997 bsr -8. +68879551139130795 = 68879551138896923 + 233872. +68879551138663051 = 68879551138896923 - 233872. +16108998383956101175856 = 68879551138896923 * 233872. +-68879551138896923 = -(68879551138896923). +68879551138896923 = +(68879551138896923). +294518160099 = 68879551138896923 div 233872. +223595 = 68879551138896923 rem 233872. +4112 = 68879551138896923 band 233872. +68879551139126683 = 68879551138896923 bor 233872. +68879551139122571 = 68879551138896923 bxor 233872. +-68879551138896924 = bnot(68879551138896923). +8816582545778806144 = 68879551138896923 bsl 7. +538121493272632 = 68879551138896923 bsr 7. +-524372124561571424235676612096 = 6114152 + -524372124561571424235682726248. +524372124561571424235688840400 = 6114152 - -524372124561571424235682726248. +-3206090874132381046633448012054661696 = 6114152 * -524372124561571424235682726248. +-6114152 = -(6114152). +6114152 = +(6114152). +0 = 6114152 div -524372124561571424235682726248. +6114152 = 6114152 rem -524372124561571424235682726248. +5261832 = 6114152 band -524372124561571424235682726248. +-524372124561571424235681873928 = 6114152 bor -524372124561571424235682726248. +-524372124561571424235687135760 = 6114152 bxor -524372124561571424235682726248. +-6114153 = bnot(6114152). +0 = 6114152 bsl -77. +923944527231053024723514425344 = 6114152 bsr -77. +9493229794381587 = -2 + 9493229794381589. +-9493229794381591 = -2 - 9493229794381589. +-18986459588763178 = -2 * 9493229794381589. +2 = -(-2). +-2 = +(-2). +0 = -2 div 9493229794381589. +-2 = -2 rem 9493229794381589. +9493229794381588 = -2 band 9493229794381589. +-1 = -2 bor 9493229794381589. +-9493229794381589 = -2 bxor 9493229794381589. +1 = bnot(-2). +-562949953421312 = -2 bsl 48. +-1 = -2 bsr 48. +338654 = 337727 + 927. +336800 = 337727 - 927. +313072929 = 337727 * 927. +-337727 = -(337727). +337727 = +(337727). +364 = 337727 div 927. +299 = 337727 rem 927. +799 = 337727 band 927. +337855 = 337727 bor 927. +337056 = 337727 bxor 927. +-337728 = bnot(337727). +0 = 337727 bsl -588. +342139512825066188696171867817584175304682721844858761456258145259871851083995905654085415654237920686906788977435249420947941207823631015480153949487501614780300719462251368873459712 = 337727 bsr -588. +39138662259334119678064 = -322563763953267 + 39138662581897883631331. +-39138662904461647584598 = -322563763953267 - 39138662581897883631331. +-12624714318513872489316281894141008377 = -322563763953267 * 39138662581897883631331. +322563763953267 = -(-322563763953267). +-322563763953267 = +(-322563763953267). +0 = -322563763953267 div 39138662581897883631331. +-322563763953267 = -322563763953267 rem 39138662581897883631331. +39138662260743179346049 = -322563763953267 band 39138662581897883631331. +-1409059667985 = -322563763953267 bor 39138662581897883631331. +-39138662262152239014034 = -322563763953267 bxor 39138662581897883631331. +322563763953266 = bnot(-322563763953267). +-181587255892894736365129826304 = -322563763953267 bsl 49. +-1 = -322563763953267 bsr 49. +-6288977272882750121716142727 = 2621979282859 + -6288977272882752743695425586. +6288977272882755365674708445 = 2621979282859 - -6288977272882752743695425586. +-16489568119869669586504346611499079830374 = 2621979282859 * -6288977272882752743695425586. +-2621979282859 = -(2621979282859). +2621979282859 = +(2621979282859). +0 = 2621979282859 div -6288977272882752743695425586. +2621979282859 = 2621979282859 rem -6288977272882752743695425586. +285349006730 = 2621979282859 band -6288977272882752743695425586. +-6288977272882750407065149457 = 2621979282859 bor -6288977272882752743695425586. +-6288977272882750692414156187 = 2621979282859 bxor -6288977272882752743695425586. +-2621979282860 = bnot(2621979282859). +45633792032927766636558829632437146623729424500201394081270271387439117523627148615542082354664238135683294503022951256421709887736295998881361127556508864099138488079282435334867583874528003946971136 = 2621979282859 bsl 622. +0 = 2621979282859 bsr 622. +-981608 = -95 + -981513. +981418 = -95 - -981513. +93243735 = -95 * -981513. +95 = -(-95). +-95 = +(-95). +0 = -95 div -981513. +-95 = -95 rem -981513. +-981599 = -95 band -981513. +-9 = -95 bor -981513. +981590 = -95 bxor -981513. +94 = bnot(-95). +-3040 = -95 bsl 5. +-3 = -95 bsr 5. +-72159589933345004080192207563 = -25565764779621271 + -72159589933319438315412586292. +72159589933293872550632965021 = -25565764779621271 - -72159589933319438315412586292. +1844815102829171715237701492238966502366217132 = -25565764779621271 * -72159589933319438315412586292. +25565764779621271 = -(-25565764779621271). +-25565764779621271 = +(-25565764779621271). +0 = -25565764779621271 div -72159589933319438315412586292. +-25565764779621271 = -25565764779621271 rem -72159589933319438315412586292. +-72159589933344228730818396088 = -25565764779621271 band -72159589933319438315412586292. +-775349373811475 = -25565764779621271 bor -72159589933319438315412586292. +72159589933343453381444584613 = -25565764779621271 bxor -72159589933319438315412586292. +25565764779621270 = bnot(-25565764779621271). +-1 = -25565764779621271 bsl -552. +-376891545469205666692423721188611135467462423258473339765083709194668716109829979210087156306882816693633085329973128696206684696862091342922014883525884084455336719448376222119100416 = -25565764779621271 bsr -552. +853762466 = 4 + 853762462. +-853762458 = 4 - 853762462. +3415049848 = 4 * 853762462. +-4 = -(4). +4 = +(4). +0 = 4 div 853762462. +4 = 4 rem 853762462. +4 = 4 band 853762462. +853762462 = 4 bor 853762462. +853762458 = 4 bxor 853762462. +-5 = bnot(4). +0 = 4 bsl -3. +32 = 4 bsr -3. +1423394379825560705171 = 583911822985914123515 + 839482556839646581656. +-255570733853732458141 = 583911822985914123515 - 839482556839646581656. +490183790129114306563518065187741117240840 = 583911822985914123515 * 839482556839646581656. +-583911822985914123515 = -(583911822985914123515). +583911822985914123515 = +(583911822985914123515). +0 = 583911822985914123515 div 839482556839646581656. +583911822985914123515 = 583911822985914123515 rem 839482556839646581656. +249184450009142952088 = 583911822985914123515 band 839482556839646581656. +1174209929816417753083 = 583911822985914123515 bor 839482556839646581656. +925025479807274800995 = 583911822985914123515 bxor 839482556839646581656. +-583911822985914123516 = bnot(583911822985914123515). +0 = 583911822985914123515 bsl -489. +933286854102346590916038334878114268698088764671016388629042772055499685121238063867877641091156694537038817124889329230541736781305155973928074893116930143895085383680 = 583911822985914123515 bsr -489. +-95896673865189 = -96592446293331 + 695772428142. +-97288218721473 = -96592446293331 - 695772428142. +-67206360897686637451321002 = -96592446293331 * 695772428142. +96592446293331 = -(-96592446293331). +-96592446293331 = +(-96592446293331). +-138 = -96592446293331 div 695772428142. +-575851209735 = -96592446293331 rem 695772428142. +138798215724 = -96592446293331 band 695772428142. +-96035472080913 = -96592446293331 bor 695772428142. +-96174270296637 = -96592446293331 bxor 695772428142. +96592446293330 = bnot(-96592446293331). +-1 = -96592446293331 bsl -221. +-325515900064727033006723633047949897409224347669638580099791894982130765043597312 = -96592446293331 bsr -221. +-7289159845218643776343174512 = -7289159845218643776343173517 + -995. +-7289159845218643776343172522 = -7289159845218643776343173517 - -995. +7252714045992550557461457649415 = -7289159845218643776343173517 * -995. +7289159845218643776343173517 = -(-7289159845218643776343173517). +-7289159845218643776343173517 = +(-7289159845218643776343173517). +7325788789164466106877561 = -7289159845218643776343173517 div -995. +-322 = -7289159845218643776343173517 rem -995. +-7289159845218643776343174127 = -7289159845218643776343173517 band -995. +-385 = -7289159845218643776343173517 bor -995. +7289159845218643776343173742 = -7289159845218643776343173517 bxor -995. +7289159845218643776343173516 = bnot(-7289159845218643776343173517). +-70496428321463939690824451884876015117562414876327936 = -7289159845218643776343173517 bsl 83. +-754 = -7289159845218643776343173517 bsr 83. +35376388787642844912187156 = 593 + 35376388787642844912186563. +-35376388787642844912185970 = 593 - 35376388787642844912186563. +20978198551072207032926631859 = 593 * 35376388787642844912186563. +-593 = -(593). +593 = +(593). +0 = 593 div 35376388787642844912186563. +593 = 593 rem 35376388787642844912186563. +65 = 593 band 35376388787642844912186563. +35376388787642844912187091 = 593 bor 35376388787642844912186563. +35376388787642844912187026 = 593 bxor 35376388787642844912186563. +-594 = bnot(593). +0 = 593 bsl -35. +20375324852224 = 593 bsr -35. +-88383936180025438134421 = -88383944478485252746958 + 8298459814612537. +-88383952776945067359495 = -88383944478485252746958 - 8298459814612537. +-733450611511655493711281995007675412446 = -88383944478485252746958 * 8298459814612537. +88383944478485252746958 = -(-88383944478485252746958). +-88383944478485252746958 = +(-88383944478485252746958). +-10650644 = -88383944478485252746958 div 8298459814612537. +-3244741123223130 = -88383944478485252746958 rem 8298459814612537. +8289244542320688 = -88383944478485252746958 band 8298459814612537. +-88383944469269980455109 = -88383944478485252746958 bor 8298459814612537. +-88383952758514522775797 = -88383944478485252746958 bxor 8298459814612537. +88383944478485252746957 = bnot(-88383944478485252746958). +-1 = -88383944478485252746958 bsl -498. +-72328793436171923303501242904921538868908174232957948869553245322491821288425462681446794260789939913028086656509573167011669502730599213013225742326068691415924548464279552 = -88383944478485252746958 bsr -498. +-432 = -516 + 84. +-600 = -516 - 84. +-43344 = -516 * 84. +516 = -(-516). +-516 = +(-516). +-6 = -516 div 84. +-12 = -516 rem 84. +84 = -516 band 84. +-516 = -516 bor 84. +-600 = -516 bxor 84. +515 = bnot(-516). +-129 = -516 bsl -2. +-2064 = -516 bsr -2. +-5596641981436881743594547168 = -5596641981436935356756388516 + 53613161841348. +-5596641981436988969918229864 = -5596641981436935356756388516 - 53613161841348. +-300053672318860964426375383823133041159568 = -5596641981436935356756388516 * 53613161841348. +5596641981436935356756388516 = -(-5596641981436935356756388516). +-5596641981436935356756388516 = +(-5596641981436935356756388516). +-104389328836797 = -5596641981436935356756388516 div 53613161841348. +-42033257906160 = -5596641981436935356756388516 rem 53613161841348. +17868295372868 = -5596641981436935356756388516 band 53613161841348. +-5596641981436899611889920036 = -5596641981436935356756388516 bor 53613161841348. +-5596641981436917480185292904 = -5596641981436935356756388516 bxor 53613161841348. +5596641981436935356756388515 = bnot(-5596641981436935356756388516). +-1289155062446397240207348514759687647736457136729469815900398414886254960824036212425282575915046285725246915330099303076472005333399133729486620438473826088340577967551488726816896503852826624 = -5596641981436935356756388516 bsl 546. +-1 = -5596641981436935356756388516 bsr 546. +284396196340718960184592278332 = -217734169182222469124 + 284396196558453129366814747456. +-284396196776187298549037216580 = -217734169182222469124 - 284396196558453129366814747456. +-61922769576238829194488665641522602052528817548544 = -217734169182222469124 * 284396196558453129366814747456. +217734169182222469124 = -(-217734169182222469124). +-217734169182222469124 = +(-217734169182222469124). +0 = -217734169182222469124 div 284396196558453129366814747456. +-217734169182222469124 = -217734169182222469124 rem 284396196558453129366814747456. +284396196489160710023662412608 = -217734169182222469124 band 284396196558453129366814747456. +-148441749839070134276 = -217734169182222469124 bor 284396196558453129366814747456. +-284396196637602459862732546884 = -217734169182222469124 bxor 284396196558453129366814747456. +217734169182222469123 = bnot(-217734169182222469124). +-1 = -217734169182222469124 bsl -439. +-309096925320254733711942867352297104175140757235372806325969408707524208701220561286286948547716279158327238545931855047770537522991128544603004429402112 = -217734169182222469124 bsr -439. +985223770122340129850815 = -3398973293555211497613 + 988622743415895341348428. +-992021716709450552846041 = -3398973293555211497613 - 988622743415895341348428. +-3360302302271914570872637267312734552723302364 = -3398973293555211497613 * 988622743415895341348428. +3398973293555211497613 = -(-3398973293555211497613). +-3398973293555211497613 = +(-3398973293555211497613). +0 = -3398973293555211497613 div 988622743415895341348428. +-3398973293555211497613 = -3398973293555211497613 rem 988622743415895341348428. +988175400125004939593280 = -3398973293555211497613 band 988622743415895341348428. +-2951630002664809742465 = -3398973293555211497613 bor 988622743415895341348428. +-991127030127669749335745 = -3398973293555211497613 bxor 988622743415895341348428. +3398973293555211497612 = bnot(-3398973293555211497613). +-217534290787533535847232 = -3398973293555211497613 bsl 6. +-53108957711800179651 = -3398973293555211497613 bsr 6. +-1048780507735075470499531127922 = -299912126399476783966892396589 + -748868381335598686532638731333. +448956254936121902565746334744 = -299912126399476783966892396589 - -748868381335598686532638731333. +224594708639693654151248600938408959574771763247688856623137 = -299912126399476783966892396589 * -748868381335598686532638731333. +299912126399476783966892396589 = -(-299912126399476783966892396589). +-299912126399476783966892396589 = +(-299912126399476783966892396589). +0 = -299912126399476783966892396589 div -748868381335598686532638731333. +-299912126399476783966892396589 = -299912126399476783966892396589 rem -748868381335598686532638731333. +-949414776692567621220798692461 = -299912126399476783966892396589 band -748868381335598686532638731333. +-99365731042507849278732435461 = -299912126399476783966892396589 bor -748868381335598686532638731333. +850049045650059771942066257000 = -299912126399476783966892396589 bxor -748868381335598686532638731333. +299912126399476783966892396588 = bnot(-299912126399476783966892396589). +-2515845262811662145798945293165658112 = -299912126399476783966892396589 bsl 23. +-35752311515745733257162 = -299912126399476783966892396589 bsr 23. +544613 = -84835 + 629448. +-714283 = -84835 - 629448. +-53399221080 = -84835 * 629448. +84835 = -(-84835). +-84835 = +(-84835). +0 = -84835 div 629448. +-84835 = -84835 rem 629448. +561288 = -84835 band 629448. +-16675 = -84835 bor 629448. +-577963 = -84835 bxor 629448. +84834 = bnot(-84835). +-1 = -84835 bsl -97. +-13442642333795230159496602053509120 = -84835 bsr -97. +-36121523960803135913611 = -36121524847967313194856 + 887164177281245. +-36121525735131490476101 = -36121524847967313194856 - 887164177281245. +-32045722873890969789282230872999275720 = -36121524847967313194856 * 887164177281245. +36121524847967313194856 = -(-36121524847967313194856). +-36121524847967313194856 = +(-36121524847967313194856). +-40715716 = -36121524847967313194856 div 887164177281245. +-160410489648436 = -36121524847967313194856 rem 887164177281245. +3092378554520 = -36121524847967313194856 band 887164177281245. +-36121523963895514468131 = -36121524847967313194856 bor 887164177281245. +-36121523966987893022651 = -36121524847967313194856 bxor 887164177281245. +36121524847967313194855 = bnot(-36121524847967313194856). +-1 = -36121524847967313194856 bsl -555. +-4260039921983946223320372338255047661798517726710739357683710915733751398170472437637779148660565183876332275255098994351650385918924882566819183379734039604666474308285291287373178478788608 = -36121524847967313194856 bsr -555. +-5228933976190874131121760902 = -5228933976191629529339534856 + 755398217773954. +-5228933976192384927557308810 = -5228933976191629529339534856 - 755398217773954. +-3949927406472831763397050258582202111940624 = -5228933976191629529339534856 * 755398217773954. +5228933976191629529339534856 = -(-5228933976191629529339534856). +-5228933976191629529339534856 = +(-5228933976191629529339534856). +-6922089373735 = -5228933976191629529339534856 div 755398217773954. +-185139684836666 = -5228933976191629529339534856 rem 755398217773954. +578372112294272 = -5228933976191629529339534856 band 755398217773954. +-5228933976191452503234055174 = -5228933976191629529339534856 bor 755398217773954. +-5228933976192030875346349446 = -5228933976191629529339534856 bxor 755398217773954. +5228933976191629529339534855 = bnot(-5228933976191629529339534856). +-20915735904766518117358139424 = -5228933976191629529339534856 bsl 2. +-1307233494047907382334883714 = -5228933976191629529339534856 bsr 2. +-2313941712627712635797936 = -58825119 + -2313941712627712576972817. +2313941712627712518147698 = -58825119 - -2313941712627712576972817. +136117896604388995038222619790223 = -58825119 * -2313941712627712576972817. +58825119 = -(-58825119). +-58825119 = +(-58825119). +0 = -58825119 div -2313941712627712576972817. +-58825119 = -58825119 rem -2313941712627712576972817. +-2313941712627712585365919 = -58825119 band -2313941712627712576972817. +-50432017 = -58825119 bor -2313941712627712576972817. +2313941712627712534933902 = -58825119 bxor -2313941712627712576972817. +58825118 = bnot(-58825119). +-459572 = -58825119 bsl -7. +-7529615232 = -58825119 bsr -7. +-39532178545449714486969974045 = -39144824719771556967531838878 + -387353825678157519438135167. +-38757470894093399448093703711 = -39144824719771556967531838878 - -387353825678157519438135167. +15162897610704422948379732234328403070831799486629622626 = -39144824719771556967531838878 * -387353825678157519438135167. +39144824719771556967531838878 = -(-39144824719771556967531838878). +-39144824719771556967531838878 = +(-39144824719771556967531838878). +101 = -39144824719771556967531838878 div -387353825678157519438135167. +-22088326277647504280187011 = -39144824719771556967531838878 rem -387353825678157519438135167. +-39454500041501834731337220096 = -39144824719771556967531838878 band -387353825678157519438135167. +-77678503947879755632753949 = -39144824719771556967531838878 bor -387353825678157519438135167. +39376821537553954975704466147 = -39144824719771556967531838878 bxor -387353825678157519438135167. +39144824719771556967531838877 = bnot(-39144824719771556967531838878). +-36261288297047112456574047448012037405591068471788300549971762926424652906450749839118480673786272849854464 = -39144824719771556967531838878 bsl 259. +-1 = -39144824719771556967531838878 bsr 259. +96442260946113395843907062 = 9714399119165457325774274 + 86727861826947938518132788. +-77013462707782481192358514 = 9714399119165457325774274 - 86727861826947938518132788. +842509064538806544487422868581886775245460846295912 = 9714399119165457325774274 * 86727861826947938518132788. +-9714399119165457325774274 = -(9714399119165457325774274). +9714399119165457325774274 = +(9714399119165457325774274). +0 = 9714399119165457325774274 div 86727861826947938518132788. +9714399119165457325774274 = 9714399119165457325774274 rem 86727861826947938518132788. +42842645781906634850304 = 9714399119165457325774274 band 86727861826947938518132788. +96399418300331489209056758 = 9714399119165457325774274 bor 86727861826947938518132788. +96356575654549582574206454 = 9714399119165457325774274 bxor 86727861826947938518132788. +-9714399119165457325774275 = bnot(9714399119165457325774274). +155430385906647317212388384 = 9714399119165457325774274 bsl 4. +607149944947841082860892 = 9714399119165457325774274 bsr 4. +58725190968083356687400 = -259348471451611166831 + 58984539439534967854231. +-59243887910986579021062 = -259348471451611166831 - 58984539439534967854231. +-15297550142920667545306486335476338230211961 = -259348471451611166831 * 58984539439534967854231. +259348471451611166831 = -(-259348471451611166831). +-259348471451611166831 = +(-259348471451611166831). +0 = -259348471451611166831 div 58984539439534967854231. +-259348471451611166831 = -259348471451611166831 rem 58984539439534967854231. +58762157292493824984209 = -259348471451611166831 band 58984539439534967854231. +-36966324410468296809 = -259348471451611166831 bor 58984539439534967854231. +-58799123616904293281018 = -259348471451611166831 bxor 58984539439534967854231. +259348471451611166830 = bnot(-259348471451611166831). +-11781532008619042716132876004244721666502104356517640457399534631670477333637333442414731753378215776210292300440032904923490970981846667962649607139229696 = -259348471451611166831 bsl 444. +-1 = -259348471451611166831 bsr 444. +591644923315353855980747 = 698822196362898 + 591644922616531659617849. +-591644921917709463254951 = 698822196362898 - 591644922616531659617849. +413454604289841479405363865188402166402 = 698822196362898 * 591644922616531659617849. +-698822196362898 = -(698822196362898). +698822196362898 = +(698822196362898). +0 = 698822196362898 div 591644922616531659617849. +698822196362898 = 698822196362898 rem 591644922616531659617849. +20419084056080 = 698822196362898 band 591644922616531659617849. +591644923294934771924667 = 698822196362898 bor 591644922616531659617849. +591644923274515687868587 = 698822196362898 bxor 591644922616531659617849. +-698822196362899 = bnot(698822196362898). +2795288785451592 = 698822196362898 bsl 2. +174705549090724 = 698822196362898 bsr 2. +-71129950541462559969961 = -6896237721355314 + -71129943645224838614647. +71129936748987117259333 = -6896237721355314 - -71129943645224838614647. +490529000484077238376825442807011684158 = -6896237721355314 * -71129943645224838614647. +6896237721355314 = -(-6896237721355314). +-6896237721355314 = +(-6896237721355314). +0 = -6896237721355314 div -71129943645224838614647. +-6896237721355314 = -6896237721355314 rem -71129943645224838614647. +-71129950400634273123960 = -6896237721355314 band -71129943645224838614647. +-140828286846001 = -6896237721355314 bor -71129943645224838614647. +71129950259805986277959 = -6896237721355314 bxor -71129943645224838614647. +6896237721355313 = bnot(-6896237721355314). +-1 = -6896237721355314 bsl -578. +-6822596977107109636132725784345838907142012186166156789606892117950408498673939962039999041421050078931352102357161071567561607022595870779761007920162403830610258693924129685610207763234816 = -6896237721355314 bsr -578. +-7443127918909037783 = -281491387173284 + -7442846427521864499. +7442564936134691215 = -281491387173284 - -7442846427521864499. +2095097165400850810996268880844716 = -281491387173284 * -7442846427521864499. +281491387173284 = -(-281491387173284). +-281491387173284 = +(-281491387173284). +0 = -281491387173284 div -7442846427521864499. +-281491387173284 = -281491387173284 rem -7442846427521864499. +-7443127917531093940 = -281491387173284 band -7442846427521864499. +-1377943843 = -281491387173284 bor -7442846427521864499. +7443127916153150097 = -281491387173284 bxor -7442846427521864499. +281491387173283 = bnot(-281491387173284). +-72061795116360704 = -281491387173284 bsl 8. +-1099575731146 = -281491387173284 bsr 8. +-771246567331013984771121652752 = -771782222179325333442389628311 + 535654848311348671267975559. +-772317877027636682113657603870 = -771782222179325333442389628311 - 535654848311348671267975559. +-413408889150862109611410971768391972038899579623442450849 = -771782222179325333442389628311 * 535654848311348671267975559. +771782222179325333442389628311 = -(-771782222179325333442389628311). +-771782222179325333442389628311 = +(-771782222179325333442389628311). +-1440 = -771782222179325333442389628311 div 535654848311348671267975559. +-439240610983246816504823351 = -771782222179325333442389628311 rem 535654848311348671267975559. +67800214851217117319241729 = -771782222179325333442389628311 band 535654848311348671267975559. +-771314367545865201888440894481 = -771782222179325333442389628311 bor 535654848311348671267975559. +-771382167760716419005760136210 = -771782222179325333442389628311 bxor 535654848311348671267975559. +771782222179325333442389628310 = bnot(-771782222179325333442389628311). +-3644638498094299663555727589154918055519413606547456 = -771782222179325333442389628311 bsl 72. +-163431243 = -771782222179325333442389628311 bsr 72. +873839764774485360398501843 = -3643612469677871 + 873839764778128972868179714. +-873839764781772585337857585 = -3643612469677871 - 873839764778128972868179714. +-3183933463445968379222577364230379716908894 = -3643612469677871 * 873839764778128972868179714. +3643612469677871 = -(-3643612469677871). +-3643612469677871 = +(-3643612469677871). +0 = -3643612469677871 div 873839764778128972868179714. +-3643612469677871 = -3643612469677871 rem 873839764778128972868179714. +873839764774733644420550656 = -3643612469677871 band 873839764778128972868179714. +-248284022048813 = -3643612469677871 bor 873839764778128972868179714. +-873839764774981928442599469 = -3643612469677871 bxor 873839764778128972868179714. +3643612469677870 = bnot(-3643612469677871). +-1865529584475069952 = -3643612469677871 bsl 9. +-7116430604840 = -3643612469677871 bsr 9. +88329617515 = 89922 + 88329527593. +-88329437671 = 89922 - 88329527593. +7942767780217746 = 89922 * 88329527593. +-89922 = -(89922). +89922 = +(89922). +0 = 89922 div 88329527593. +89922 = 89922 rem 88329527593. +65792 = 89922 band 88329527593. +88329551723 = 89922 bor 88329527593. +88329485931 = 89922 bxor 88329527593. +-89923 = bnot(89922). +56994838636861422120693272816910336 = 89922 bsl 99. +0 = 89922 bsr 99. +37972972863670164457235 = 37972972864637848691766 + -967684234531. +37972972865605532926297 = 37972972864637848691766 - -967684234531. +-36745847179383510889822181472571746 = 37972972864637848691766 * -967684234531. +-37972972864637848691766 = -(37972972864637848691766). +37972972864637848691766 = +(37972972864637848691766). +-39241078349 = 37972972864637848691766 div -967684234531. +314786422447 = 37972972864637848691766 rem -967684234531. +37972972863675535859732 = 37972972864637848691766 band -967684234531. +-5371402497 = 37972972864637848691766 bor -967684234531. +-37972972863680907262229 = 37972972864637848691766 bxor -967684234531. +-37972972864637848691767 = bnot(37972972864637848691766). +19442162106694578530184192 = 37972972864637848691766 bsl 9. +74165962626245798226 = 37972972864637848691766 bsr 9. +6279872 = 6279929 + -57. +6279986 = 6279929 - -57. +-357955953 = 6279929 * -57. +-6279929 = -(6279929). +6279929 = +(6279929). +-110174 = 6279929 div -57. +11 = 6279929 rem -57. +6279873 = 6279929 band -57. +-1 = 6279929 bor -57. +-6279874 = 6279929 bxor -57. +-6279930 = bnot(6279929). +0 = 6279929 bsl -88. +1943543888242349716091745572225024 = 6279929 bsr -88. +34392885586249287 = 34392885586249381 + -94. +34392885586249475 = 34392885586249381 - -94. +-3232931245107441814 = 34392885586249381 * -94. +-34392885586249381 = -(34392885586249381). +34392885586249381 = +(34392885586249381). +-365881761555844 = 34392885586249381 div -94. +45 = 34392885586249381 rem -94. +34392885586249376 = 34392885586249381 band -94. +-89 = 34392885586249381 bor -94. +-34392885586249465 = 34392885586249381 bxor -94. +-34392885586249382 = bnot(34392885586249381). +0 = 34392885586249381 bsl -84. +665255158340299183156934914780744590032896 = 34392885586249381 bsr -84. +-2764682352159 = -2764682352698 + 539. +-2764682353237 = -2764682352698 - 539. +-1490163788104222 = -2764682352698 * 539. +2764682352698 = -(-2764682352698). +-2764682352698 = +(-2764682352698). +-5129280802 = -2764682352698 div 539. +-420 = -2764682352698 rem 539. +514 = -2764682352698 band 539. +-2764682352673 = -2764682352698 bor 539. +-2764682353187 = -2764682352698 bxor 539. +2764682352697 = bnot(-2764682352698). +-1 = -2764682352698 bsl -52. +-12451022413408498996591198208 = -2764682352698 bsr -52. +411347001767816756104233336410 = 438724827454564951793956448838 + -27377825686748195689723112428. +466102653141313147483679561266 = 438724827454564951793956448838 - -27377825686748195689723112428. +-12011331850499758360055954360069623806117771462827503958664 = 438724827454564951793956448838 * -27377825686748195689723112428. +-438724827454564951793956448838 = -(438724827454564951793956448838). +438724827454564951793956448838 = +(438724827454564951793956448838). +-16 = 438724827454564951793956448838 div -27377825686748195689723112428. +679616466593820758386649990 = 438724827454564951793956448838 rem -27377825686748195689723112428. +436229415513727871705332989956 = 438724827454564951793956448838 band -27377825686748195689723112428. +-24882413745911115601099653546 = 438724827454564951793956448838 bor -27377825686748195689723112428. +-461111829259638987306432643502 = 438724827454564951793956448838 bxor -27377825686748195689723112428. +-438724827454564951793956448839 = bnot(438724827454564951793956448838). +2903237 = 438724827454564951793956448838 bsl -77. +66298221451974587282214130220604359757665273628327936 = 438724827454564951793956448838 bsr -77. +49489484348507721380 = 49489484349336544761 + -828823381. +49489484350165368142 = 49489484349336544761 - -828823381. +-41018041742363700135669856941 = 49489484349336544761 * -828823381. +-49489484349336544761 = -(49489484349336544761). +49489484349336544761 = +(49489484349336544761). +-59710531198 = 49489484349336544761 div -828823381. +504204323 = 49489484349336544761 rem -828823381. +49489484348776325289 = 49489484349336544761 band -828823381. +-268603909 = 49489484349336544761 bor -828823381. +-49489484349044929198 = 49489484349336544761 bxor -828823381. +-49489484349336544762 = bnot(49489484349336544761). +1583663499178769432352 = 49489484349336544761 bsl 5. +1546546385916767023 = 49489484349336544761 bsr 5. +-5964308434181410553351390 = -48966654222568461613 + -5964259467527187984889777. +5964210500872965416428164 = -48966654222568461613 - -5964259467527187984889777. +292049831040084103997351697544933156260630301 = -48966654222568461613 * -5964259467527187984889777. +48966654222568461613 = -(-48966654222568461613). +-48966654222568461613 = +(-48966654222568461613). +0 = -48966654222568461613 div -5964259467527187984889777. +-48966654222568461613 = -48966654222568461613 rem -5964259467527187984889777. +-5964268730447095049959357 = -48966654222568461613 band -5964259467527187984889777. +-39703734315503392033 = -48966654222568461613 bor -5964259467527187984889777. +5964229026712779546567324 = -48966654222568461613 bxor -5964259467527187984889777. +48966654222568461612 = bnot(-48966654222568461613). +-391733233780547692904 = -48966654222568461613 bsl 3. +-6120831777821057702 = -48966654222568461613 bsr 3. +-4789495265182100 = -4789495265248472 + 66372. +-4789495265314844 = -4789495265248472 - 66372. +-317888379745071583584 = -4789495265248472 * 66372. +4789495265248472 = -(-4789495265248472). +-4789495265248472 = +(-4789495265248472). +-72161382288 = -4789495265248472 div 66372. +-29336 = -4789495265248472 rem 66372. +66304 = -4789495265248472 band 66372. +-4789495265248404 = -4789495265248472 bor 66372. +-4789495265314708 = -4789495265248472 bxor 66372. +4789495265248471 = bnot(-4789495265248472). +-1115142 = -4789495265248472 bsl -32. +-20570725528589032553971712 = -4789495265248472 bsr -32. +6123210 = 6131949 + -8739. +6140688 = 6131949 - -8739. +-53587102311 = 6131949 * -8739. +-6131949 = -(6131949). +6131949 = +(6131949). +-701 = 6131949 div -8739. +5910 = 6131949 rem -8739. +6131917 = 6131949 band -8739. +-8707 = 6131949 bor -8739. +-6140624 = 6131949 bxor -8739. +-6131950 = bnot(6131949). +8020551919344756729031218299753941701989984953287274290321164245870588083001099769758356086157870363219782747805318726955028674740546508065587792294262127816212374137239461470559298462333691609017014070959373923245739782857993726237262890385083410627678458699969911445122461553439023249052980524793987072 = 6131949 bsl 987. +0 = 6131949 bsr 987. +-71521222332273642257324 = -71521222332273642293443 + 36119. +-71521222332273642329562 = -71521222332273642293443 - 36119. +-2583275029419391685996867717 = -71521222332273642293443 * 36119. +71521222332273642293443 = -(-71521222332273642293443). +-71521222332273642293443 = +(-71521222332273642293443). +-1980155107624066067 = -71521222332273642293443 div 36119. +-19470 = -71521222332273642293443 rem 36119. +1301 = -71521222332273642293443 band 36119. +-71521222332273642258625 = -71521222332273642293443 bor 36119. +-71521222332273642259926 = -71521222332273642293443 bxor 36119. +71521222332273642293442 = bnot(-71521222332273642293443). +-1117519098941775660836 = -71521222332273642293443 bsl -6. +-4577358229265513106780352 = -71521222332273642293443 bsr -6. +665326317763636533 = -777616 + 665326317764414149. +-665326317765191765 = -777616 - 665326317764414149. +-517368389914692672888784 = -777616 * 665326317764414149. +777616 = -(-777616). +-777616 = +(-777616). +0 = -777616 div 665326317764414149. +-777616 = -777616 rem 665326317764414149. +665326317764346432 = -777616 band 665326317764414149. +-709899 = -777616 bor 665326317764414149. +-665326317765056331 = -777616 bxor 665326317764414149. +777615 = bnot(-777616). +-1 = -777616 bsl -64. +-14344483339621726689427456 = -777616 bsr -64. +-742789355945246516934055414343 = -742789355945246516936898773466 + 2843359123. +-742789355945246516939742132589 = -742789355945246516936898773466 - 2843359123. +-2112016891694210972416505142862061430318 = -742789355945246516936898773466 * 2843359123. +742789355945246516936898773466 = -(-742789355945246516936898773466). +-742789355945246516936898773466 = +(-742789355945246516936898773466). +-261236559932512793930 = -742789355945246516936898773466 div 2843359123. +-1814250076 = -742789355945246516936898773466 rem 2843359123. +2684499458 = -742789355945246516936898773466 band 2843359123. +-742789355945246516936739913801 = -742789355945246516936898773466 bor 2843359123. +-742789355945246516939424413259 = -742789355945246516936898773466 bxor 2843359123. +742789355945246516936898773465 = bnot(-742789355945246516936898773466). +-1 = -742789355945246516936898773466 bsl -592. +-12039906237866742069817054125723223154051261965793698359567866550315976451949665083616194680102781002958123515976277237215956114495168853552580898628325007810674596671065137644155374117516458451655322853441536 = -742789355945246516936898773466 bsr -592. +51953632733124287146 = 51953632739515644477 + -6391357331. +51953632745907001808 = 51953632739515644477 - -6391357331. +-332054231481784927717263610887 = 51953632739515644477 * -6391357331. +-51953632739515644477 = -(51953632739515644477). +51953632739515644477 = +(51953632739515644477). +-8128732294 = 51953632739515644477 div -6391357331. +522297163 = 51953632739515644477 rem -6391357331. +51953632737822973997 = 51953632739515644477 band -6391357331. +-4698686851 = 51953632739515644477 bor -6391357331. +-51953632742521660848 = 51953632739515644477 bxor -6391357331. +-51953632739515644478 = bnot(51953632739515644477). +207814530958062577908 = 51953632739515644477 bsl 2. +12988408184878911119 = 51953632739515644477 bsr 2. +-262672270 = 5713 + -262677983. +262683696 = 5713 - -262677983. +-1500679316879 = 5713 * -262677983. +-5713 = -(5713). +5713 = +(5713). +0 = 5713 div -262677983. +5713 = 5713 rem -262677983. +4609 = 5713 band -262677983. +-262676879 = 5713 bor -262677983. +-262681488 = 5713 bxor -262677983. +-5714 = bnot(5713). +11 = 5713 bsl -9. +2925056 = 5713 bsr -9. +-568921276688204408271309170952 = -5283749879527367 + -568921276688199124521429643585. +568921276688193840771550116218 = -5283749879527367 - -568921276688199124521429643585. +3006037727161827951841235319900749663063490695 = -5283749879527367 * -568921276688199124521429643585. +5283749879527367 = -(-5283749879527367). +-5283749879527367 = +(-5283749879527367). +0 = -5283749879527367 div -568921276688199124521429643585. +-5283749879527367 = -5283749879527367 rem -568921276688199124521429643585. +-568921276688199758976725202887 = -5283749879527367 band -568921276688199124521429643585. +-4649294583968065 = -5283749879527367 bor -568921276688199124521429643585. +568921276688195109682141234822 = -5283749879527367 bxor -568921276688199124521429643585. +5283749879527366 = bnot(-5283749879527367). +-42269999036218936 = -5283749879527367 bsl 3. +-660468734940921 = -5283749879527367 bsr 3. +11904699374459 = 4233227718792 + 7671471655667. +-3438243936875 = 4233227718792 - 7671471655667. +32475086456696701729194264 = 4233227718792 * 7671471655667. +-4233227718792 = -(4233227718792). +4233227718792 = +(4233227718792). +0 = 4233227718792 div 7671471655667. +4233227718792 = 4233227718792 rem 7671471655667. +3127273111680 = 4233227718792 band 7671471655667. +8777426262779 = 4233227718792 bor 7671471655667. +5650153151099 = 4233227718792 bxor 7671471655667. +-4233227718793 = bnot(4233227718792). +0 = 4233227718792 bsl -249. +3829486576376904164635311492615690175490415617529800201345103258022357798923215887663104 = 4233227718792 bsr -249. +25125316857724427543 = 25125316857179548718 + 544878825. +25125316856634669893 = 25125316857179548718 - 544878825. +13690253126892685319494096350 = 25125316857179548718 * 544878825. +-25125316857179548718 = -(25125316857179548718). +25125316857179548718 = +(25125316857179548718). +46111751281 = 25125316857179548718 div 544878825. +496023893 = 25125316857179548718 rem 544878825. +5382184 = 25125316857179548718 band 544878825. +25125316857719045359 = 25125316857179548718 bor 544878825. +25125316857713663175 = 25125316857179548718 bxor 544878825. +-25125316857179548719 = bnot(25125316857179548718). +0 = 25125316857179548718 bsl -93. +248829085897875822412742556034438954413935558656 = 25125316857179548718 bsr -93. +-88767522295277243892987472925 = 4 + -88767522295277243892987472929. +88767522295277243892987472933 = 4 - -88767522295277243892987472929. +-355070089181108975571949891716 = 4 * -88767522295277243892987472929. +-4 = -(4). +4 = +(4). +0 = 4 div -88767522295277243892987472929. +4 = 4 rem -88767522295277243892987472929. +4 = 4 band -88767522295277243892987472929. +-88767522295277243892987472929 = 4 bor -88767522295277243892987472929. +-88767522295277243892987472933 = 4 bxor -88767522295277243892987472929. +-5 = bnot(4). +0 = 4 bsl -4. +64 = 4 bsr -4. +254705954978575608208360764 = 254712299555523954647979436 + -6344576948346439618672. +254718644132472301087598108 = 254712299555523954647979436 - -6344576948346439618672. +-1616041784220290360650451738363048745803137628992 = 254712299555523954647979436 * -6344576948346439618672. +-254712299555523954647979436 = -(254712299555523954647979436). +254712299555523954647979436 = +(254712299555523954647979436). +-40146 = 254712299555523954647979436 div -6344576948346439618672. +2913387207789716773324 = 254712299555523954647979436 rem -6344576948346439618672. +254706297445885094062916992 = 254712299555523954647979436 band -6344576948346439618672. +-342467309485854556228 = 254712299555523954647979436 bor -6344576948346439618672. +-254706639913194579917473220 = 254712299555523954647979436 bxor -6344576948346439618672. +-254712299555523954647979437 = bnot(254712299555523954647979436). +1809839741579 = 254712299555523954647979436 bsl -47. +35847569292654369877447765855454005035008 = 254712299555523954647979436 bsr -47. +-2175263430742300103586 = 7632491378239 + -2175263438374791481825. +2175263446007282860064 = 7632491378239 - -2175263438374791481825. +-16602679438794118279348731369006175 = 7632491378239 * -2175263438374791481825. +-7632491378239 = -(7632491378239). +7632491378239 = +(7632491378239). +0 = 7632491378239 div -2175263438374791481825. +7632491378239 = 7632491378239 rem -2175263438374791481825. +3092706555423 = 7632491378239 band -2175263438374791481825. +-2175263433835006659009 = 7632491378239 bor -2175263438374791481825. +-2175263436927713214432 = 7632491378239 bxor -2175263438374791481825. +-7632491378240 = bnot(7632491378239). +30529965512956 = 7632491378239 bsl 2. +1908122844559 = 7632491378239 bsr 2. +-8812069618852 = -296325119 + -8811773293733. +8811476968614 = -296325119 - -8811773293733. +2611149769866453179227 = -296325119 * -8811773293733. +296325119 = -(-296325119). +-296325119 = +(-296325119). +0 = -296325119 div -8811773293733. +-296325119 = -296325119 rem -8811773293733. +-8812060606463 = -296325119 band -8811773293733. +-9012389 = -296325119 bor -8811773293733. +8812051594074 = -296325119 bxor -8811773293733. +296325118 = bnot(-296325119). +-1 = -296325119 bsl -51. +-667264847754458942144512 = -296325119 bsr -51. +961537478172334855 = 961537478172334783 + 72. +961537478172334711 = 961537478172334783 - 72. +69230698428408104376 = 961537478172334783 * 72. +-961537478172334783 = -(961537478172334783). +961537478172334783 = +(961537478172334783). +13354687196837983 = 961537478172334783 div 72. +7 = 961537478172334783 rem 72. +8 = 961537478172334783 band 72. +961537478172334847 = 961537478172334783 bor 72. +961537478172334839 = 961537478172334783 bxor 72. +-961537478172334784 = bnot(961537478172334783). +3846149912689339132 = 961537478172334783 bsl 2. +240384369543083695 = 961537478172334783 bsr 2. +-56935718366269633695631884973 = -56935718366269633696146472629 + 514587656. +-56935718366269633696661060285 = -56935718366269633696146472629 - 514587656. +-29298417856774840267678629582825267624 = -56935718366269633696146472629 * 514587656. +56935718366269633696146472629 = -(-56935718366269633696146472629). +-56935718366269633696146472629 = +(-56935718366269633696146472629). +-110643381554938880415 = -56935718366269633696146472629 div 514587656. +-127315389 = -56935718366269633696146472629 rem 514587656. +480952328 = -56935718366269633696146472629 band 514587656. +-56935718366269633696112837301 = -56935718366269633696146472629 bor 514587656. +-56935718366269633696593789629 = -56935718366269633696146472629 bxor 514587656. +56935718366269633696146472628 = bnot(-56935718366269633696146472629). +-33865750362788801638712217592875907723541573597845853713336988398679128310391930228722966719990357450223634399287920490900190621337960232425893678083539509097136354066085984633396253311133907314718439783298422229060401777256132142149667079426124235341914505345677881203404137903510253441797823517381377673087942656 = -56935718366269633696146472629 bsl 946. +-1 = -56935718366269633696146472629 bsr 946. +5478134454819665063141 = -77499384391 + 5478134454897164447532. +-5478134454974663831923 = -77499384391 - 5478134454897164447532. +-424552047865656599895221619273012 = -77499384391 * 5478134454897164447532. +77499384391 = -(-77499384391). +-77499384391 = +(-77499384391). +0 = -77499384391 div 5478134454897164447532. +-77499384391 = -77499384391 rem 5478134454897164447532. +5478134454828428176680 = -77499384391 band 5478134454897164447532. +-8763113539 = -77499384391 bor 5478134454897164447532. +-5478134454837191290219 = -77499384391 bxor 5478134454897164447532. +77499384390 = bnot(-77499384391). +-1 = -77499384391 bsl -957. +-94406979572560835598169159724368584579513338907559188265909267851122163141033431114034831856378837816438432447149999435369909239179642280099783886954506143034676884689536633413822594071691266396363194959504310276820454223562606194235221588028210734969962226246140583709705654278369610908548257021952 = -77499384391 bsr -957. +-4849115565564 = 8187 + -4849115573751. +4849115581938 = 8187 - -4849115573751. +-39699709202299437 = 8187 * -4849115573751. +-8187 = -(8187). +8187 = +(8187). +0 = 8187 div -4849115573751. +8187 = 8187 rem -4849115573751. +4617 = 8187 band -4849115573751. +-4849115570181 = 8187 bor -4849115573751. +-4849115574798 = 8187 bxor -4849115573751. +-8188 = bnot(8187). +65496 = 8187 bsl 3. +1023 = 8187 bsr 3. +-431578567135440151878 = -431578567418864531161 + 283424379283. +-431578567702288910444 = -431578567418864531161 - 283424379283. +-122319887582538047208971236337563 = -431578567418864531161 * 283424379283. +431578567418864531161 = -(-431578567418864531161). +-431578567418864531161 = +(-431578567418864531161). +-1522729161 = -431578567418864531161 div 283424379283. +-146316159598 = -431578567418864531161 rem 283424379283. +2751987971 = -431578567418864531161 band 283424379283. +-431578567138192139849 = -431578567418864531161 bor 283424379283. +-431578567140944127820 = -431578567418864531161 bxor 283424379283. +431578567418864531160 = bnot(-431578567418864531161). +-8152288646014973407771771735780730783924224 = -431578567418864531161 bsl 74. +-1 = -431578567418864531161 bsr 74. +-495291200701 = -495246754927 + -44445774. +-495202309153 = -495246754927 - -44445774. +22011625343718828498 = -495246754927 * -44445774. +495246754927 = -(-495246754927). +-495246754927 = +(-495246754927). +11142 = -495246754927 div -44445774. +-31941019 = -495246754927 rem -44445774. +-495257646192 = -495246754927 band -44445774. +-33554509 = -495246754927 bor -44445774. +495224091683 = -495246754927 bxor -44445774. +495246754926 = bnot(-495246754927). +-68066195707570939756544 = -495246754927 bsl 37. +-4 = -495246754927 bsr 37. +-6095142424482 = -749949895633 + -5345192528849. +4595242633216 = -749949895633 - -5345192528849. +4008626579148598891616417 = -749949895633 * -5345192528849. +749949895633 = -(-749949895633). +-749949895633 = +(-749949895633). +0 = -749949895633 div -5345192528849. +-749949895633 = -749949895633 rem -5345192528849. +-5491627346897 = -749949895633 band -5345192528849. +-603515077585 = -749949895633 bor -5345192528849. +4888112269312 = -749949895633 bxor -5345192528849. +749949895632 = bnot(-749949895633). +-187487473909 = -749949895633 bsl -2. +-2999799582532 = -749949895633 bsr -2. +-621829506476310151076 = -621822948751363498914 + -6557724946652162. +-621816391026416846752 = -621822948751363498914 - -6557724946652162. +4077743863427625266245768430822752068 = -621822948751363498914 * -6557724946652162. +621822948751363498914 = -(-621822948751363498914). +-621822948751363498914 = +(-621822948751363498914). +94822 = -621822948751363498914 div -6557724946652162. +-6353859912193750 = -621822948751363498914 rem -6557724946652162. +-621827742773743976354 = -621822948751363498914 band -6557724946652162. +-1763702566174722 = -621822948751363498914 bor -6557724946652162. +621825979071177801632 = -621822948751363498914 bxor -6557724946652162. +621822948751363498913 = bnot(-621822948751363498914). +-279752784190103629808262213481877267604434642103946792685969727886783900024504628125643344380628874645015331155431963989708755535149879893839797241498386941273765158340250824404369408 = -621822948751363498914 bsl 537. +-1 = -621822948751363498914 bsr 537. +249491668436548300378842774138 = -373671939733595218 + 249491668436921972318576369356. +-249491668437295644258309964574 = -373671939733595218 - 249491668436921972318576369356. +-93228035692195627484154251188872698411363339608 = -373671939733595218 * 249491668436921972318576369356. +373671939733595218 = -(-373671939733595218). +-373671939733595218 = +(-373671939733595218). +0 = -373671939733595218 div 249491668436921972318576369356. +-373671939733595218 = -373671939733595218 rem 249491668436921972318576369356. +249491668436839922216563169932 = -373671939733595218 band 249491668436921972318576369356. +-291621837720395794 = -373671939733595218 bor 249491668436921972318576369356. +-249491668437131544054283565726 = -373671939733595218 bxor 249491668436921972318576369356. +373671939733595217 = bnot(-373671939733595218). +-1 = -373671939733595218 bsl -268. +-177226770805200883084300797497432069977324995854719724156211341765268018946668965966541256401092608 = -373671939733595218 bsr -268. +782229585818934957 = 782229158144523791 + 427674411166. +782228730470112625 = 782229158144523791 - 427674411166. +334539394606335105443403050306 = 782229158144523791 * 427674411166. +-782229158144523791 = -(782229158144523791). +782229158144523791 = +(782229158144523791). +1829029 = 782229158144523791 div 427674411166. +257563985977 = 782229158144523791 rem 427674411166. +283469946894 = 782229158144523791 band 427674411166. +782229302348988063 = 782229158144523791 bor 427674411166. +782229018879041169 = 782229158144523791 bxor 427674411166. +-782229158144523792 = bnot(782229158144523791). +0 = 782229158144523791 bsl -692. +16072779992163944869162500501258888552545266030817826252520110008131745637803626241572391467228352301587824476241604259730959710633625940025608756154401018658504704342516809504287240332863674263352125923608713986070835401588736 = 782229158144523791 bsr -692. +431372269785776272290886 = 431372269785861816229748 + -85543938862. +431372269785947360168610 = 431372269785861816229748 - -85543938862. +-36901283073323933039537842257666776 = 431372269785861816229748 * -85543938862. +-431372269785861816229748 = -(431372269785861816229748). +431372269785861816229748 = +(431372269785861816229748). +-5042698238173 = 431372269785861816229748 div -85543938862. +75589650622 = 431372269785861816229748 rem -85543938862. +431372269785858016154704 = 431372269785861816229748 band -85543938862. +-81743863818 = 431372269785861816229748 bor -85543938862. +-431372269785939760018522 = 431372269785861816229748 bxor -85543938862. +-431372269785861816229749 = bnot(431372269785861816229748). +55215650532590312477407744 = 431372269785861816229748 bsl 7. +3370095857702045439294 = 431372269785861816229748 bsr 7. +4167637475335631083 = -6411 + 4167637475335637494. +-4167637475335643905 = -6411 - 4167637475335637494. +-26718723854376771974034 = -6411 * 4167637475335637494. +6411 = -(-6411). +-6411 = +(-6411). +0 = -6411 div 4167637475335637494. +-6411 = -6411 rem 4167637475335637494. +4167637475335635188 = -6411 band 4167637475335637494. +-4105 = -6411 bor 4167637475335637494. +-4167637475335639293 = -6411 bxor 4167637475335637494. +6410 = bnot(-6411). +-1 = -6411 bsl -417. +-2169871265748113289154933268376624709806030040311811531178948314370158350139387923499667470402055521872848517269721472045355630592 = -6411 bsr -417. +-72198400604812844524850328532 = -69517263963635144889192757364 + -2681136641177699635657571168. +-66836127322457445253535186196 = -69517263963635144889192757364 - -2681136641177699635657571168. +186385283607324270996007753661156514502862074176986081152 = -69517263963635144889192757364 * -2681136641177699635657571168. +69517263963635144889192757364 = -(-69517263963635144889192757364). +-69517263963635144889192757364 = +(-69517263963635144889192757364). +25 = -69517263963635144889192757364 div -2681136641177699635657571168. +-2488847934192653997753478164 = -69517263963635144889192757364 rem -2681136641177699635657571168. +-72032475452338347505308269440 = -69517263963635144889192757364 band -2681136641177699635657571168. +-165925152474497019542059092 = -69517263963635144889192757364 bor -2681136641177699635657571168. +71866550299863850485766210348 = -69517263963635144889192757364 bxor -2681136641177699635657571168. +69517263963635144889192757363 = bnot(-69517263963635144889192757364). +-1975799476771134 = -69517263963635144889192757364 bsl -45. +-2445921281894091002472893945597486430158848 = -69517263963635144889192757364 bsr -45. +-597883 = -762 + -597121. +596359 = -762 - -597121. +455006202 = -762 * -597121. +762 = -(-762). +-762 = +(-762). +0 = -762 div -597121. +-762 = -762 rem -597121. +-597754 = -762 band -597121. +-129 = -762 bor -597121. +597625 = -762 bxor -597121. +761 = bnot(-762). +-6096 = -762 bsl 3. +-96 = -762 bsr 3. +-439134683934183283784740784307 = 782114871 + -439134683934183283785522899178. +439134683934183283786305014049 = 782114871 - -439134683934183283785522899178. +-343453766676809531488270633958147476038 = 782114871 * -439134683934183283785522899178. +-782114871 = -(782114871). +782114871 = +(782114871). +0 = 782114871 div -439134683934183283785522899178. +782114871 = 782114871 rem -439134683934183283785522899178. +605552662 = 782114871 band -439134683934183283785522899178. +-439134683934183283785346336969 = 782114871 bor -439134683934183283785522899178. +-439134683934183283785951889631 = 782114871 bxor -439134683934183283785522899178. +-782114872 = bnot(782114871). +1761166120798261774123008 = 782114871 bsl 51. +0 = 782114871 bsr 51. +-2817223291852954659512177 = -2817223291852954658876965 + -635212. +-2817223291852954658241753 = -2817223291852954658876965 - -635212. +1789534041664499034774554691580 = -2817223291852954658876965 * -635212. +2817223291852954658876965 = -(-2817223291852954658876965). +-2817223291852954658876965 = +(-2817223291852954658876965). +4435091421215207928 = -2817223291852954658876965 div -635212. +-516229 = -2817223291852954658876965 rem -635212. +-2817223291852954659438448 = -2817223291852954658876965 band -635212. +-73729 = -2817223291852954658876965 bor -635212. +2817223291852954659364719 = -2817223291852954658876965 bxor -635212. +2817223291852954658876964 = bnot(-2817223291852954658876965). +-5502389241900302068120 = -2817223291852954658876965 bsl -9. +-1442418325428712785345006080 = -2817223291852954658876965 bsr -9. +-131461936887 = -54764697521 + -76697239366. +21932541845 = -54764697521 - -76697239366. +4200301114574723811686 = -54764697521 * -76697239366. +54764697521 = -(-54764697521). +-54764697521 = +(-54764697521). +0 = -54764697521 div -76697239366. +-54764697521 = -54764697521 rem -76697239366. +-128240517110 = -54764697521 band -76697239366. +-3221419777 = -54764697521 bor -76697239366. +125019097333 = -54764697521 bxor -76697239366. +54764697520 = bnot(-54764697521). +-1 = -54764697521 bsl -292. +-435772105794347831388572420830297697694089413640651371434988576327209811006398295311758623628066816 = -54764697521 bsr -292. +-718383814066737940583 = -718384471966434468442 + 657899696527859. +-718385129866130996301 = -718384471966434468442 - 657899696527859. +-472624926097043467979643525709325678 = -718384471966434468442 * 657899696527859. +718384471966434468442 = -(-718384471966434468442). +-718384471966434468442 = +(-718384471966434468442). +-1091936 = -718384471966434468442 div 657899696527859. +-108938590223418 = -718384471966434468442 rem 657899696527859. +313869310370 = -718384471966434468442 band 657899696527859. +-718383814380607250953 = -718384471966434468442 bor 657899696527859. +-718383814694476561323 = -718384471966434468442 bxor 657899696527859. +718384471966434468441 = bnot(-718384471966434468442). +-11224757374475538570 = -718384471966434468442 bsl -6. +-45976606205851805980288 = -718384471966434468442 bsr -6. +69587853318633335 = 69587853318632789 + 546. +69587853318632243 = 69587853318632789 - 546. +37994967911973502794 = 69587853318632789 * 546. +-69587853318632789 = -(69587853318632789). +69587853318632789 = +(69587853318632789). +127450280803356 = 69587853318632789 div 546. +413 = 69587853318632789 rem 546. +0 = 69587853318632789 band 546. +69587853318633335 = 69587853318632789 bor 546. +69587853318633335 = 69587853318632789 bxor 546. +-69587853318632790 = bnot(69587853318632789). +2226811306196249248 = 69587853318632789 bsl 5. +2174620416207274 = 69587853318632789 bsr 5. +7881966812303549621 = 7881967199162492797 + -386858943176. +7881967586021435973 = 7881967199162492797 - -386858943176. +-3049209500815898675745132303272 = 7881967199162492797 * -386858943176. +-7881967199162492797 = -(7881967199162492797). +7881967199162492797 = +(7881967199162492797). +-20374266 = 7881967199162492797 div -386858943176. +186415783981 = 7881967199162492797 rem -386858943176. +7881966889655100728 = 7881967199162492797 band -386858943176. +-77351551107 = 7881967199162492797 bor -386858943176. +-7881966967006651835 = 7881967199162492797 bxor -386858943176. +-7881967199162492798 = bnot(7881967199162492797). +0 = 7881967199162492797 bsl -87. +1219675348022161883312283936183914520501026816 = 7881967199162492797 bsr -87. +5434826832880908507321 = 5491168191821856 + 5434821341712716685465. +-5434815850544524863609 = 5491168191821856 - 5434821341712716685465. +29843518079847451852035006528064523040 = 5491168191821856 * 5434821341712716685465. +-5491168191821856 = -(5491168191821856). +5491168191821856 = +(5491168191821856). +0 = 5491168191821856 div 5434821341712716685465. +5491168191821856 = 5491168191821856 rem 5434821341712716685465. +2267748507648 = 5491168191821856 band 5434821341712716685465. +5434826830613159999673 = 5491168191821856 bor 5434821341712716685465. +5434826828345411492025 = 5491168191821856 bxor 5434821341712716685465. +-5491168191821857 = bnot(5491168191821856). +27694469519309956907906736988340335288164603951096450650305569038190403118530742434158245364055453483480375607197928499621306185023488 = 5491168191821856 bsl 391. +0 = 5491168191821856 bsr 391. +-12965631870144917 = -6643255557847534 + -6322376312297383. +-320879245550151 = -6643255557847534 - -6322376312297383. +42001161575473185936773981203522 = -6643255557847534 * -6322376312297383. +6643255557847534 = -(-6643255557847534). +-6643255557847534 = +(-6643255557847534). +1 = -6643255557847534 div -6322376312297383. +-320879245550151 = -6643255557847534 rem -6322376312297383. +-6753389257916400 = -6643255557847534 band -6322376312297383. +-6212242612228517 = -6643255557847534 bor -6322376312297383. +541146645687883 = -6643255557847534 bxor -6322376312297383. +6643255557847533 = bnot(-6643255557847534). +-161152725708367740895437494628907697939243534943643461141618092139904119253051381194500954345652785574706775810270689912233366294097741715204603746816563384034817788972520647289946562585108549405788710464323092207350516362491917360517306946420736 = -6643255557847534 bsl 762. +-1 = -6643255557847534 bsr 762. +31342846592922 = -26985445 + 31342873578367. +-31342900563812 = -26985445 - 31342873578367. +-845801391090975868315 = -26985445 * 31342873578367. +26985445 = -(-26985445). +-26985445 = +(-26985445). +0 = -26985445 div 31342873578367. +-26985445 = -26985445 rem 31342873578367. +31342863583259 = -26985445 band 31342873578367. +-16990337 = -26985445 bor 31342873578367. +-31342880573596 = -26985445 bxor 31342873578367. +26985444 = bnot(-26985445). +-254870321986644506167413309440 = -26985445 bsl 73. +-1 = -26985445 bsr 73. +572927541962185236192615839 = 328 + 572927541962185236192615511. +-572927541962185236192615183 = 328 - 572927541962185236192615511. +187920233763596757471177887608 = 328 * 572927541962185236192615511. +-328 = -(328). +328 = +(328). +0 = 328 div 572927541962185236192615511. +328 = 328 rem 572927541962185236192615511. +64 = 328 band 572927541962185236192615511. +572927541962185236192615775 = 328 bor 572927541962185236192615511. +572927541962185236192615711 = 328 bxor 572927541962185236192615511. +-329 = bnot(328). +0 = 328 bsl -45. +11540474045136896 = 328 bsr -45. +7522286436127792454065865 = -848625735117776 + 7522286436976418189183641. +-7522286437825043924301417 = -848625735117776 - 7522286436976418189183641. +-6383605857345588870864671022250427502416 = -848625735117776 * 7522286436976418189183641. +848625735117776 = -(-848625735117776). +-848625735117776 = +(-848625735117776). +0 = -848625735117776 div 7522286436976418189183641. +-848625735117776 = -848625735117776 rem 7522286436976418189183641. +7522286436976143037005840 = -848625735117776 band 7522286436976418189183641. +-848350582939975 = -848625735117776 bor 7522286436976418189183641. +-7522286437824493619945815 = -848625735117776 bxor 7522286436976418189183641. +848625735117775 = bnot(-848625735117776). +-230777533236791811937923527909470948120033583019220046964229501521150351925362156486191065861179888824870818927545456120268239397752217898933816374173017707522176554440297628809587477866933704705703936 = -848625735117776 bsl 616. +-1 = -848625735117776 bsr 616. +-791719256114 = -2172 + -791719253942. +791719251770 = -2172 - -791719253942. +1719614219562024 = -2172 * -791719253942. +2172 = -(-2172). +-2172 = +(-2172). +0 = -2172 div -791719253942. +-2172 = -2172 rem -791719253942. +-791719256064 = -2172 band -791719253942. +-50 = -2172 bor -791719253942. +791719256014 = -2172 bxor -791719253942. +2171 = bnot(-2172). +-1 = -2172 bsl -683. +-87165948319725549756831588940549007122614578641753643973009232494089403069559170117423124060019852570076042239041283331853318838862603927541455182509276467942068068036582806909731244523046485457712165395890176 = -2172 bsr -683. +399884239982556913673 = 399884239982557689298 + -775625. +399884239982558464923 = 399884239982557689298 - -775625. +-310160213636471307761761250 = 399884239982557689298 * -775625. +-399884239982557689298 = -(399884239982557689298). +399884239982557689298 = +(399884239982557689298). +-515563887165263 = 399884239982557689298 div -775625. +574923 = 399884239982557689298 rem -775625. +399884239982557143058 = 399884239982557689298 band -775625. +-229385 = 399884239982557689298 bor -775625. +-399884239982557372443 = 399884239982557689298 bxor -775625. +-399884239982557689299 = bnot(399884239982557689298). +6248191249727463895 = 399884239982557689298 bsl -6. +25592591358883692115072 = 399884239982557689298 bsr -6. +-44980302852142023255246380639 = -446625714922843593693761866 + -44533677137219179661552618773. +44087051422296336067858856907 = -446625714922843593693761866 - -44533677137219179661552618773. +19889885389553610740544285445999387722022564646143110418 = -446625714922843593693761866 * -44533677137219179661552618773. +446625714922843593693761866 = -(-446625714922843593693761866). +-446625714922843593693761866 = +(-446625714922843593693761866). +0 = -446625714922843593693761866 div -44533677137219179661552618773. +-446625714922843593693761866 = -446625714922843593693761866 rem -44533677137219179661552618773. +-44553095738867805362119875934 = -446625714922843593693761866 band -44533677137219179661552618773. +-427207113274217893126504705 = -446625714922843593693761866 bor -44533677137219179661552618773. +44125888625593587468993371229 = -446625714922843593693761866 bxor -44533677137219179661552618773. +446625714922843593693761865 = bnot(-446625714922843593693761866). +-26336697907466707431452259915040757780966340589709535579395555585980697709376097601034270890825071371732371680377763343497440940619798904912648202171728902307721468032616760270952556509102342144 = -446625714922843593693761866 bsl 554. +-1 = -446625714922843593693761866 bsr 554. +-75684508410009542805739174389 = -498153796625829811465951162 + -75186354613383712994273223227. +74688200816757883182807272065 = -498153796625829811465951162 - -75186354613383712994273223227. +37454368005113071165177808884019876888070327805106039774 = -498153796625829811465951162 * -75186354613383712994273223227. +498153796625829811465951162 = -(-498153796625829811465951162). +-498153796625829811465951162 = +(-498153796625829811465951162). +0 = -498153796625829811465951162 div -75186354613383712994273223227. +-498153796625829811465951162 = -498153796625829811465951162 rem -75186354613383712994273223227. +-75510346904256744945233131452 = -498153796625829811465951162 band -75186354613383712994273223227. +-174161505752797860506042937 = -498153796625829811465951162 bor -75186354613383712994273223227. +75336185398503947084727088515 = -498153796625829811465951162 bxor -75186354613383712994273223227. +498153796625829811465951161 = bnot(-498153796625829811465951162). +-72729507697548556594247865846124256119427484441651488108647007093339614933858206268651285532108070827403091989906633866101143522475573303639107187558734195229322724513812266307402531853259074857977300118498648191385206784 = -498153796625829811465951162 bsl 645. +-1 = -498153796625829811465951162 bsr 645. +-349641534929400177572 = -3662276865181 + -349641531267123312391. +349641527604846447210 = -3662276865181 - -349641531267123312391. +1280484091066044959231076453757771 = -3662276865181 * -349641531267123312391. +3662276865181 = -(-3662276865181). +-3662276865181 = +(-3662276865181). +0 = -3662276865181 div -349641531267123312391. +-3662276865181 = -3662276865181 rem -349641531267123312391. +-349641534843492171679 = -3662276865181 band -349641531267123312391. +-85908005893 = -3662276865181 bor -349641531267123312391. +349641534757584165786 = -3662276865181 bxor -349641531267123312391. +3662276865180 = bnot(-3662276865181). +-1 = -3662276865181 bsl -67. +-540456672472489650321132741459968 = -3662276865181 bsr -67. +95194355719099220632332 = 95194355719153182466249 + -53961833917. +95194355719207144300166 = 95194355719153182466249 - -53961833917. +-5136862013152763128125724995967333 = 95194355719153182466249 * -53961833917. +-95194355719153182466249 = -(95194355719153182466249). +95194355719153182466249 = +(95194355719153182466249). +-1764105272359 = 95194355719153182466249 div -53961833917. +12773666046 = 95194355719153182466249 rem -53961833917. +95194355719150760247361 = 95194355719153182466249 band -53961833917. +-51539615029 = 95194355719153182466249 bor -53961833917. +-95194355719202299862390 = 95194355719153182466249 bxor -53961833917. +-95194355719153182466250 = bnot(95194355719153182466249). +11899294464894147808281 = 95194355719153182466249 bsl -3. +761554845753225459729992 = 95194355719153182466249 bsr -3. +865761194182852538761799504 = 865761194182852485987565723 + 52774233781. +865761194182852433213331942 = 865761194182852485987565723 - 52774233781. +45689883660323594356944820124704288663 = 865761194182852485987565723 * 52774233781. +-865761194182852485987565723 = -(865761194182852485987565723). +865761194182852485987565723 = +(865761194182852485987565723). +16404997896805987 = 865761194182852485987565723 div 52774233781. +14849118876 = 865761194182852485987565723 rem 52774233781. +26607761 = 865761194182852485987565723 band 52774233781. +865761194182852538735191743 = 865761194182852485987565723 bor 52774233781. +865761194182852538708583982 = 865761194182852485987565723 bxor 52774233781. +-865761194182852485987565724 = bnot(865761194182852485987565723). +0 = 865761194182852485987565723 bsl -234. +23901056636578152198835723665750983422335028724869521276981945661302774128209516129727702244524032 = 865761194182852485987565723 bsr -234. +22552956143687134 = -2377925557 + 22552958521612691. +-22552960899538248 = -2377925557 - 22552958521612691. +-53629256454503754784443887 = -2377925557 * 22552958521612691. +2377925557 = -(-2377925557). +-2377925557 = +(-2377925557). +0 = -2377925557 div 22552958521612691. +-2377925557 = -2377925557 rem 22552958521612691. +22552956222085123 = -2377925557 band 22552958521612691. +-78397989 = -2377925557 bor 22552958521612691. +-22552956300483112 = -2377925557 bxor 22552958521612691. +2377925556 = bnot(-2377925557). +-864184189159900223931269425922722087985704133795314350665511079338331311401567617994038073478470737101191118267652517926430688278248306503581696 = -2377925557 bsl 447. +-1 = -2377925557 bsr 447. +52736489523359951 = 8 + 52736489523359943. +-52736489523359935 = 8 - 52736489523359943. +421891916186879544 = 8 * 52736489523359943. +-8 = -(8). +8 = +(8). +0 = 8 div 52736489523359943. +8 = 8 rem 52736489523359943. +0 = 8 band 52736489523359943. +52736489523359951 = 8 bor 52736489523359943. +52736489523359951 = 8 bxor 52736489523359943. +-9 = bnot(8). +943490606205385338060388645247067222729230305104110107094051575061406040598037213021531681294414691885367093757690961224942646157481198158140358562858174010912348831744 = 8 bsl 555. +0 = 8 bsr 555. +6473257884965793731994114438 = -685361747213 + 6473257884965794417355861651. +-6473257884965795102717608864 = -685361747213 - 6473257884965794417355861651. +-4436523334200485826619574672716462828663 = -685361747213 * 6473257884965794417355861651. +685361747213 = -(-685361747213). +-685361747213 = +(-685361747213). +0 = -685361747213 div 6473257884965794417355861651. +-685361747213 = -685361747213 rem 6473257884965794417355861651. +6473257884965794391582124691 = -685361747213 band 6473257884965794417355861651. +-659588010253 = -685361747213 bor 6473257884965794417355861651. +-6473257884965795051170134944 = -685361747213 bxor 6473257884965794417355861651. +685361747212 = bnot(-685361747213). +-398103322863127778168772896219995089013190570480005198583607340512926062411749281505673152733301559458222748590173533454802569120231995000055804716173753625150327419277696152317604800338665813575874556829151703700450096632420017690406582733979166862176980635624381604665642256255139974393888768 = -685361747213 bsl 936. +-1 = -685361747213 bsr 936. +9739756856122388822877 = -2488 + 9739756856122388825365. +-9739756856122388827853 = -2488 - 9739756856122388825365. +-24232515058032503397508120 = -2488 * 9739756856122388825365. +2488 = -(-2488). +-2488 = +(-2488). +0 = -2488 div 9739756856122388825365. +-2488 = -2488 rem 9739756856122388825365. +9739756856122388825088 = -2488 band 9739756856122388825365. +-2211 = -2488 bor 9739756856122388825365. +-9739756856122388827299 = -2488 bxor 9739756856122388825365. +2487 = bnot(-2488). +-1 = -2488 bsl -999. +-13329567073397165472598407610306422523383875857616838076600254831327167075994205363815387832467256475107277731094361146505328087354012386702364814502925027056094602311881343345863816808697589700496175002598389814879575934936644066843601936668919866265726568418242058456569574710575864737225483851078303744 = -2488 bsr -999. +31877226767652310946210254518 = -4866892436167135 + 31877226767657177838646421653. +-31877226767662044731082588788 = -4866892436167135 - 31877226767657177838646421653. +-155143033841495248559827480439514486390974155 = -4866892436167135 * 31877226767657177838646421653. +4866892436167135 = -(-4866892436167135). +-4866892436167135 = +(-4866892436167135). +0 = -4866892436167135 div 31877226767657177838646421653. +-4866892436167135 = -4866892436167135 rem 31877226767657177838646421653. +31877226767656894024783110145 = -4866892436167135 band 31877226767657177838646421653. +-4583078572855627 = -4866892436167135 bor 31877226767657177838646421653. +-31877226767661477103355965772 = -4866892436167135 bxor 31877226767657177838646421653. +4866892436167134 = bnot(-4866892436167135). +-1216723109041784 = -4866892436167135 bsl -2. +-19467569744668540 = -4866892436167135 bsr -2. +-6716805724025 = -3592552651 + -6713213171374. +6709620618723 = -3592552651 - -6713213171374. +24117571775547781012474 = -3592552651 * -6713213171374. +3592552651 = -(-3592552651). +-3592552651 = +(-3592552651). +0 = -3592552651 div -6713213171374. +-3592552651 = -3592552651 rem -6713213171374. +-6716769941232 = -3592552651 band -6713213171374. +-35782793 = -3592552651 bor -6713213171374. +6716734158439 = -3592552651 bxor -6713213171374. +3592552650 = bnot(-3592552651). +-14033409 = -3592552651 bsl -8. +-919693478656 = -3592552651 bsr -8. +6342688856832569926635 = 243589238 + 6342688856832326337397. +-6342688856832082748159 = 243589238 - 6342688856832326337397. +1545010745506877466293866133486 = 243589238 * 6342688856832326337397. +-243589238 = -(243589238). +243589238 = +(243589238). +0 = 243589238 div 6342688856832326337397. +243589238 = 243589238 rem 6342688856832326337397. +234913908 = 243589238 band 6342688856832326337397. +6342688856832335012727 = 243589238 bor 6342688856832326337397. +6342688856832100098819 = 243589238 bxor 6342688856832326337397. +-243589239 = bnot(243589238). +7794855616 = 243589238 bsl 5. +7612163 = 243589238 bsr 5. +-66498536559289764002685355478 = -661563588547 + -66498536559289763341121766931. +66498536559289762679558178384 = -661563588547 - -66498536559289763341121766931. +43993010479287610065554884623365714939257 = -661563588547 * -66498536559289763341121766931. +661563588547 = -(-661563588547). +-661563588547 = +(-661563588547). +0 = -661563588547 div -66498536559289763341121766931. +-661563588547 = -661563588547 rem -66498536559289763341121766931. +-66498536559289763452790996947 = -661563588547 band -66498536559289763341121766931. +-549894358531 = -661563588547 bor -66498536559289763341121766931. +66498536559289762902896638416 = -661563588547 bxor -66498536559289763341121766931. +661563588546 = bnot(-661563588547). +-1 = -661563588547 bsl -931. +-12008743190950049197359166028745504918110862504433494660009085601342677414452326029787292755507771918146614791028819877647480428524086999078135313170114862205662956040149928337601463362981762236859328550390963427343128800748578481098842371714721549472086991926143438587884108107257246652563456 = -661563588547 bsr -931. +2478045 = 776 + 2477269. +-2476493 = 776 - 2477269. +1922360744 = 776 * 2477269. +-776 = -(776). +776 = +(776). +0 = 776 div 2477269. +776 = 776 rem 2477269. +0 = 776 band 2477269. +2478045 = 776 bor 2477269. +2478045 = 776 bxor 2477269. +-777 = bnot(776). +0 = 776 bsl -765. +150594254953168766709451010380862747859917943660319571280488047688526942410578557974095205656378708361197309877621714100998643264279136995970095865678994570502832132674022440838375732706265049148050510921790497468836606144820157612032 = 776 bsr -765. +-5804070374514233830 = -5896262786855451155 + 92192412341217325. +-5988455199196668480 = -5896262786855451155 - 92192412341217325. +-543590690117952952955498064777260375 = -5896262786855451155 * 92192412341217325. +5896262786855451155 = -(-5896262786855451155). +-5896262786855451155 = +(-5896262786855451155). +-63 = -5896262786855451155 div 92192412341217325. +-88140809358759680 = -5896262786855451155 rem 92192412341217325. +1125900510822445 = -5896262786855451155 band 92192412341217325. +-5805196275025056275 = -5896262786855451155 bor 92192412341217325. +-5806322175535878720 = -5896262786855451155 bxor 92192412341217325. +5896262786855451154 = bnot(-5896262786855451155). +-1 = -5896262786855451155 bsl -769. +-18308109307104973221907306379181569546935285356107783425114666977827898124798039943215443809688591451372916367417021091895961849411086899368966313551780601272324189197241852897140354823763739530137256577861266851140500438226450994295781619332924047360 = -5896262786855451155 bsr -769. +-443211342895884 = -443211342896345 + 461. +-443211342896806 = -443211342896345 - 461. +-204320429075215045 = -443211342896345 * 461. +443211342896345 = -(-443211342896345). +-443211342896345 = +(-443211342896345). +-961412891315 = -443211342896345 div 461. +-130 = -443211342896345 rem 461. +261 = -443211342896345 band 461. +-443211342896145 = -443211342896345 bor 461. +-443211342896406 = -443211342896345 bxor 461. +443211342896344 = bnot(-443211342896345). +-816729958176514552203192674502448526511752999823230523651292759264447583415583111736446478648044233525141009345655080859402927179022658877860939660281020224748231941212147957104640 = -443211342896345 bsl 549. +-1 = -443211342896345 bsr 549. +89113643731118361834094922652 = 88487169551642615174247139488 + 626474179475746659847783164. +87860695372166868514399356324 = 88487169551642615174247139488 - 626474179475746659847783164. +55434926938996580796277853360910097493380621825085980032 = 88487169551642615174247139488 * 626474179475746659847783164. +-88487169551642615174247139488 = -(88487169551642615174247139488). +88487169551642615174247139488 = +(88487169551642615174247139488). +141 = 88487169551642615174247139488 div 626474179475746659847783164. +154310245562336135709713364 = 88487169551642615174247139488 rem 626474179475746659847783164. +2517041061918882394161312 = 88487169551642615174247139488 band 626474179475746659847783164. +89111126690056442951700761340 = 88487169551642615174247139488 bor 626474179475746659847783164. +89108609648994524069306600028 = 88487169551642615174247139488 bxor 626474179475746659847783164. +-88487169551642615174247139489 = bnot(88487169551642615174247139488). +345653006061103965524402888 = 88487169551642615174247139488 bsl -8. +22652715405220509484607267708928 = 88487169551642615174247139488 bsr -8. +-4252961282927655944807871 = -4252961282927655944727952 + -79919. +-4252961282927655944648033 = -4252961282927655944727952 - -79919. +339892412770295335446713195888 = -4252961282927655944727952 * -79919. +4252961282927655944727952 = -(-4252961282927655944727952). +-4252961282927655944727952 = +(-4252961282927655944727952). +53215897132442297134 = -4252961282927655944727952 div -79919. +-75806 = -4252961282927655944727952 rem -79919. +-4252961282927655944797616 = -4252961282927655944727952 band -79919. +-10255 = -4252961282927655944727952 bor -79919. +4252961282927655944787361 = -4252961282927655944727952 bxor -79919. +4252961282927655944727951 = bnot(-4252961282927655944727952). +-140426011681400209026547427003774677314553319113895083364477823906168064213545836899087212036304588754345279546615537065261329107956356443202764600141444295955266753800881336952656684971045506141440117127722873350801409015632681065196238844967911192617187951283431435238988282881545167534292992 = -4252961282927655944727952 bsl 892. +-1 = -4252961282927655944727952 bsr 892. +453762865478398111269668210 = -49 + 453762865478398111269668259. +-453762865478398111269668308 = -49 - 453762865478398111269668259. +-22234380408441507452213744691 = -49 * 453762865478398111269668259. +49 = -(-49). +-49 = +(-49). +0 = -49 div 453762865478398111269668259. +-49 = -49 rem 453762865478398111269668259. +453762865478398111269668227 = -49 band 453762865478398111269668259. +-17 = -49 bor 453762865478398111269668259. +-453762865478398111269668244 = -49 bxor 453762865478398111269668259. +48 = bnot(-49). +-1683627180032 = -49 bsl 35. +-1 = -49 bsr 35. +-57713179591551324250701492252 = -57713179591551319632367534597 + -4618333957655. +-57713179591551315014033576942 = -57713179591551319632367534597 - -4618333957655. +266538737111902982398789855692898145490035 = -57713179591551319632367534597 * -4618333957655. +57713179591551319632367534597 = -(-57713179591551319632367534597). +-57713179591551319632367534597 = +(-57713179591551319632367534597). +12496536656014303 = -57713179591551319632367534597 div -4618333957655. +-4300091195132 = -57713179591551319632367534597 rem -4618333957655. +-57713179591551319852619132439 = -57713179591551319632367534597 band -4618333957655. +-4398082359813 = -57713179591551319632367534597 bor -4618333957655. +57713179591551315454536772626 = -57713179591551319632367534597 bxor -4618333957655. +57713179591551319632367534596 = bnot(-57713179591551319632367534597). +-3693643493859284456471522214208 = -57713179591551319632367534597 bsl 6. +-901768431117989369255742729 = -57713179591551319632367534597 bsr 6. +265837649729404089302891 = 52315144254666596 + 265837597414259834636295. +-265837545099115579969699 = 52315144254666596 - 265837597414259834636295. +13907332257040986924721914497828145701820 = 52315144254666596 * 265837597414259834636295. +-52315144254666596 = -(52315144254666596). +52315144254666596 = +(52315144254666596). +0 = 52315144254666596 div 265837597414259834636295. +52315144254666596 = 52315144254666596 rem 265837597414259834636295. +36183072789757956 = 52315144254666596 band 265837597414259834636295. +265837613546331299544935 = 52315144254666596 bor 265837597414259834636295. +265837577363258509786979 = 52315144254666596 bxor 265837597414259834636295. +-52315144254666597 = bnot(52315144254666596). +13968058738787516388706915168375689068407128218376520265019126620449392236038299189412454557317871103017234726912 = 52315144254666596 bsl 317. +0 = 52315144254666596 bsr 317. +5116298099 = 5179827677 + -63529578. +5243357255 = 5179827677 - -63529578. +-329072266432530306 = 5179827677 * -63529578. +-5179827677 = -(5179827677). +5179827677 = +(5179827677). +-81 = 5179827677 div -63529578. +33931859 = 5179827677 rem -63529578. +5170824596 = 5179827677 band -63529578. +-54526497 = 5179827677 bor -63529578. +-5225351093 = 5179827677 bxor -63529578. +-5179827678 = bnot(5179827677). +0 = 5179827677 bsl -39. +2847640380368723378176 = 5179827677 bsr -39. +-5273151 = 444 + -5273595. +5274039 = 444 - -5273595. +-2341476180 = 444 * -5273595. +-444 = -(444). +444 = +(444). +0 = 444 div -5273595. +444 = 444 rem -5273595. +4 = 444 band -5273595. +-5273155 = 444 bor -5273595. +-5273159 = 444 bxor -5273595. +-445 = bnot(444). +0 = 444 bsl -615. +60371268815525015505453353909579794056790872133325356518541618524410670228023909318704166657475021526268636746724722291408353593834957315660243678866525384771343637568234134848022345940992 = 444 bsr -615. +494826194665397615344866324725 = 494826194665397615344865332937 + 991788. +494826194665397615344864341149 = 494826194665397615344865332937 - 991788. +490762681954805370127653298822921356 = 494826194665397615344865332937 * 991788. +-494826194665397615344865332937 = -(494826194665397615344865332937). +494826194665397615344865332937 = +(494826194665397615344865332937). +498923353242222748556007 = 494826194665397615344865332937 div 991788. +262421 = 494826194665397615344865332937 rem 991788. +328200 = 494826194665397615344865332937 band 991788. +494826194665397615344865996525 = 494826194665397615344865332937 bor 991788. +494826194665397615344865668325 = 494826194665397615344865332937 bxor 991788. +-494826194665397615344865332938 = bnot(494826194665397615344865332937). +140345557827981039314391893049623959037326578794917044229687953213535487381280129496170628842737120271071911974932563929194833801299266628684553435862103204230956193711098219747098614967226001563675077822808620342930577054561672425384147736363482328577856355552345156862561716239253724614734782765811613302784 = 494826194665397615344865332937 bsl 925. +0 = 494826194665397615344865332937 bsr 925. +-334577614673512267637522355505 = -334577614612144943799776698692 + -61367323837745656813. +-334577614550777619962031041879 = -334577614612144943799776698692 - -61367323837745656813. +20532132824763961997155896186806543924462337988596 = -334577614612144943799776698692 * -61367323837745656813. +334577614612144943799776698692 = -(-334577614612144943799776698692). +-334577614612144943799776698692 = +(-334577614612144943799776698692). +5452048316 = -334577614612144943799776698692 div -61367323837745656813. +-25137078336146121784 = -334577614612144943799776698692 rem -61367323837745656813. +-334577614613560205755450520560 = -334577614612144943799776698692 band -61367323837745656813. +-59952061882071834945 = -334577614612144943799776698692 bor -61367323837745656813. +334577614553608143873378685615 = -334577614612144943799776698692 bxor -61367323837745656813. +334577614612144943799776698691 = bnot(-334577614612144943799776698692). +-10455550456629529493743021835 = -334577614612144943799776698692 bsl -5. +-10706483667588638201592854358144 = -334577614612144943799776698692 bsr -5. +-21297477526471769336883823 = 93839 + -21297477526471769336977662. +21297477526471769337071501 = 93839 - -21297477526471769336977662. +-1998533993606584362812646824418 = 93839 * -21297477526471769336977662. +-93839 = -(93839). +93839 = +(93839). +0 = 93839 div -21297477526471769336977662. +93839 = 93839 rem -21297477526471769336977662. +91650 = 93839 band -21297477526471769336977662. +-21297477526471769336975473 = 93839 bor -21297477526471769336977662. +-21297477526471769337067123 = 93839 bxor -21297477526471769336977662. +-93840 = bnot(93839). +0 = 93839 bsl -42. +412708286555488256 = 93839 bsr -42. +264197895362246034877072924 = -3751257145287 + 264197895362249786134218211. +-264197895362253537391363498 = -3751257145287 - 264197895362249786134218211. +-991074242747426669479673681623388221557 = -3751257145287 * 264197895362249786134218211. +3751257145287 = -(-3751257145287). +-3751257145287 = +(-3751257145287). +0 = -3751257145287 div 264197895362249786134218211. +-3751257145287 = -3751257145287 rem 264197895362249786134218211. +264197895362249608294072353 = -3751257145287 band 264197895362249786134218211. +-3573416999429 = -3751257145287 bor 264197895362249786134218211. +-264197895362253181711071782 = -3751257145287 bxor 264197895362249786134218211. +3751257145286 = bnot(-3751257145287). +-937814286322 = -3751257145287 bsl -2. +-15005028581148 = -3751257145287 bsr -2. +-72757343598454287140636 = -72757343674813464813435 + 76359177672799. +-72757343751172642486234 = -72757343674813464813435 - 76359177672799. +-5555690932665979868743179456009254565 = -72757343674813464813435 * 76359177672799. +72757343674813464813435 = -(-72757343674813464813435). +-72757343674813464813435 = +(-72757343674813464813435). +-952830372 = -72757343674813464813435 div 76359177672799. +-7226299362207 = -72757343674813464813435 rem 76359177672799. +74913912717317 = -72757343674813464813435 band 76359177672799. +-72757343673368199857953 = -72757343674813464813435 bor 76359177672799. +-72757343748282112575270 = -72757343674813464813435 bxor 76359177672799. +72757343674813464813434 = bnot(-72757343674813464813435). +-568416747459480193855 = -72757343674813464813435 bsl -7. +-9312939990376123496119680 = -72757343674813464813435 bsr -7. +-2443173978 = 3 + -2443173981. +2443173984 = 3 - -2443173981. +-7329521943 = 3 * -2443173981. +-3 = -(3). +3 = +(3). +0 = 3 div -2443173981. +3 = 3 rem -2443173981. +3 = 3 band -2443173981. +-2443173981 = 3 bor -2443173981. +-2443173984 = 3 bxor -2443173981. +-4 = bnot(3). +805306368 = 3 bsl 28. +0 = 3 bsr 28. +-3645448931891413927754625081 = -3645448931891413927754625956 + 875. +-3645448931891413927754626831 = -3645448931891413927754625956 - 875. +-3189767815404987186785297711500 = -3645448931891413927754625956 * 875. +3645448931891413927754625956 = -(-3645448931891413927754625956). +-3645448931891413927754625956 = +(-3645448931891413927754625956). +-4166227350733044488862429 = -3645448931891413927754625956 div 875. +-581 = -3645448931891413927754625956 rem 875. +72 = -3645448931891413927754625956 band 875. +-3645448931891413927754625153 = -3645448931891413927754625956 bor 875. +-3645448931891413927754625225 = -3645448931891413927754625956 bxor 875. +3645448931891413927754625955 = bnot(-3645448931891413927754625956). +-227840558243213370484664123 = -3645448931891413927754625956 bsl -4. +-58327182910262622844074015296 = -3645448931891413927754625956 bsr -4. +64229 = 2 + 64227. +-64225 = 2 - 64227. +128454 = 2 * 64227. +-2 = -(2). +2 = +(2). +0 = 2 div 64227. +2 = 2 rem 64227. +2 = 2 band 64227. +64227 = 2 bor 64227. +64225 = 2 bxor 64227. +-3 = bnot(2). +0 = 2 bsl -342. +17917957937422433684459538244547554224973163977877196279199912807710334969441287563047019946172856926208 = 2 bsr -342. +-626757338901836109135953560 = -7541582214176877 + -626757338894294526921776683. +626757338886752944707599806 = -7541582214176877 - -626757338894294526921776683. +4726741999610040988142421334831059256358991 = -7541582214176877 * -626757338894294526921776683. +7541582214176877 = -(-7541582214176877). +-7541582214176877 = +(-7541582214176877). +0 = -7541582214176877 div -626757338894294526921776683. +-7541582214176877 = -7541582214176877 rem -626757338894294526921776683. +-626757338898942175994691183 = -7541582214176877 band -626757338894294526921776683. +-2893933141262377 = -7541582214176877 bor -626757338894294526921776683. +626757338896048242853428806 = -7541582214176877 bxor -626757338894294526921776683. +7541582214176876 = bnot(-7541582214176877). +-638132215910912451466994730205580201861516135967930979297281833843378789064718565091603858502704883635901837540941628509603367251144433729536 = -7541582214176877 bsl 415. +-1 = -7541582214176877 bsr 415. +-2284559120046200332 = 4745398416 + -2284559124791598748. +2284559129536997164 = 4745398416 - -2284559124791598748. +-10841143252044399028866783168 = 4745398416 * -2284559124791598748. +-4745398416 = -(4745398416). +4745398416 = +(4745398416). +0 = 4745398416 div -2284559124791598748. +4745398416 = 4745398416 rem -2284559124791598748. +38338560 = 4745398416 band -2284559124791598748. +-2284559120084538892 = 4745398416 bor -2284559124791598748. +-2284559120122877452 = 4745398416 bxor -2284559124791598748. +-4745398417 = bnot(4745398416). +303705498624 = 4745398416 bsl 6. +74146850 = 4745398416 bsr 6. +298778172512467885395267 = 298778172512467885395351 + -84. +298778172512467885395435 = 298778172512467885395351 - -84. +-25097366491047302373209484 = 298778172512467885395351 * -84. +-298778172512467885395351 = -(298778172512467885395351). +298778172512467885395351 = +(298778172512467885395351). +-3556883006100808159468 = 298778172512467885395351 div -84. +39 = 298778172512467885395351 rem -84. +298778172512467885395332 = 298778172512467885395351 band -84. +-65 = 298778172512467885395351 bor -84. +-298778172512467885395397 = 298778172512467885395351 bxor -84. +-298778172512467885395352 = bnot(298778172512467885395351). +0 = 298778172512467885395351 bsl -932. +10846879746341106854250683491297020349676922920531953549343983959344035170292491338416736773485060621087087608945540330413744546847830071999340448032004155221819772944774757727017866168531570434935738393729944261378667160894741412044825672639034861257924274515240621449999856178042342680768857979429584896 = 298778172512467885395351 bsr -932. +2268984308828144 = 69581485 + 2268984239246659. +-2268984169665174 = 69581485 - 2268984239246659. +157879292808377814508615 = 69581485 * 2268984239246659. +-69581485 = -(69581485). +69581485 = +(69581485). +0 = 69581485 div 2268984239246659. +69581485 = 69581485 rem 2268984239246659. +67405825 = 69581485 band 2268984239246659. +2268984241422319 = 69581485 bor 2268984239246659. +2268984174016494 = 69581485 bxor 2268984239246659. +-69581486 = bnot(69581485). +0 = 69581485 bsl -694. +5718876052055462937007598889387116086563452902110056711829245940354116255675625230745152443578140260237867922542525497080081186403510634308518282758545191993483541352254200013787566857722994263858933317597726496522240 = 69581485 bsr -694. +7902836001462 = 7899921622616 + 2914378846. +7897007243770 = 7899921622616 - 2914378846. +23023364462010065581136 = 7899921622616 * 2914378846. +-7899921622616 = -(7899921622616). +7899921622616 = +(7899921622616). +2710 = 7899921622616 div 2914378846. +1954949956 = 7899921622616 rem 2914378846. +134587480 = 7899921622616 band 2914378846. +7902701413982 = 7899921622616 bor 2914378846. +7902566826502 = 7899921622616 bxor 2914378846. +-7899921622617 = bnot(7899921622616). +500196041351084719973947319032291808337454016879701655445979098134205560779805962638448159616474260573226784074964131350101141996230429830484541064783979489766718649243075961677495618502656 = 7899921622616 bsl 584. +0 = 7899921622616 bsr 584. +69472832278273138 = 69472832278272622 + 516. +69472832278272106 = 69472832278272622 - 516. +35847981455588672952 = 69472832278272622 * 516. +-69472832278272622 = -(69472832278272622). +69472832278272622 = +(69472832278272622). +134637271857117 = 69472832278272622 div 516. +250 = 69472832278272622 rem 516. +516 = 69472832278272622 band 516. +69472832278272622 = 69472832278272622 bor 516. +69472832278272106 = 69472832278272622 bxor 516. +-69472832278272623 = bnot(69472832278272622). +271378251087002 = 69472832278272622 bsl -8. +17785045063237791232 = 69472832278272622 bsr -8. +-9782188648367 = -6133259365129 + -3648929283238. +-2484330081891 = -6133259365129 - -3648929283238. +22379829699112912901407702 = -6133259365129 * -3648929283238. +6133259365129 = -(-6133259365129). +-6133259365129 = +(-6133259365129). +1 = -6133259365129 div -3648929283238. +-2484330081891 = -6133259365129 rem -3648929283238. +-8613955305390 = -6133259365129 band -3648929283238. +-1168233342977 = -6133259365129 bor -3648929283238. +7445721962413 = -6133259365129 bxor -3648929283238. +6133259365128 = bnot(-6133259365129). +-6550281245928027744902992954685820792419231494427770677357445851271727377820455966876392907848330511124529152 = -6133259365129 bsl 319. +-1 = -6133259365129 bsr 319. +-93313685820166552986 = -98457538278635145628 + 5143852458468592642. +-103601390737103738270 = -98457538278635145628 - 5143852458468592642. +-506451050329322960710577528667879269176 = -98457538278635145628 * 5143852458468592642. +98457538278635145628 = -(-98457538278635145628). +-98457538278635145628 = +(-98457538278635145628). +-19 = -98457538278635145628 div 5143852458468592642. +-724341567731885430 = -98457538278635145628 rem 5143852458468592642. +81208305330045952 = -98457538278635145628 band 5143852458468592642. +-93394894125496598938 = -98457538278635145628 bor 5143852458468592642. +-93476102430826644890 = -98457538278635145628 bxor 5143852458468592642. +98457538278635145627 = bnot(-98457538278635145628). +-1538399035603674151 = -98457538278635145628 bsl -6. +-6301282449832649320192 = -98457538278635145628 bsr -6. +-6060 = -5229 + -831. +-4398 = -5229 - -831. +4345299 = -5229 * -831. +5229 = -(-5229). +-5229 = +(-5229). +6 = -5229 div -831. +-243 = -5229 rem -831. +-6015 = -5229 band -831. +-45 = -5229 bor -831. +5970 = -5229 bxor -831. +5228 = bnot(-5229). +-1 = -5229 bsl -76. +-395092069422805997158662144 = -5229 bsr -76. +-4343754474128429969041 = -52584374 + -4343754474128377384667. +4343754474128324800293 = -52584374 - -4343754474128377384667. +228413609831739920408471393458 = -52584374 * -4343754474128377384667. +52584374 = -(-52584374). +-52584374 = +(-52584374). +0 = -52584374 div -4343754474128377384667. +-52584374 = -52584374 rem -4343754474128377384667. +-4343754474128377536512 = -52584374 band -4343754474128377384667. +-52432529 = -52584374 bor -4343754474128377384667. +4343754474128325103983 = -52584374 bxor -4343754474128377384667. +52584373 = bnot(-52584374). +-2083081664491428131440587534952824832 = -52584374 bsl 95. +-1 = -52584374 bsr 95. +-3638 = -3631 + -7. +-3624 = -3631 - -7. +25417 = -3631 * -7. +3631 = -(-3631). +-3631 = +(-3631). +518 = -3631 div -7. +-5 = -3631 rem -7. +-3631 = -3631 band -7. +-7 = -3631 bor -7. +3624 = -3631 bxor -7. +3630 = bnot(-3631). +-908 = -3631 bsl -2. +-14524 = -3631 bsr -2. +-884549755474144167619 = -884549755474144168175 + 556. +-884549755474144168731 = -884549755474144168175 - 556. +-491809664043624157505300 = -884549755474144168175 * 556. +884549755474144168175 = -(-884549755474144168175). +-884549755474144168175 = +(-884549755474144168175). +-1590916826392345626 = -884549755474144168175 div 556. +-119 = -884549755474144168175 rem 556. +512 = -884549755474144168175 band 556. +-884549755474144168131 = -884549755474144168175 bor 556. +-884549755474144168643 = -884549755474144168175 bxor 556. +884549755474144168174 = bnot(-884549755474144168175). +-1591805238744975374454665900570029007819284350200031663884462025031376025609117149208746513976100952086165260745837921603193537457214918655990196564258865998806977944368611206784614400 = -884549755474144168175 bsl 539. +-1 = -884549755474144168175 bsr 539. +-6898178838912644673024105 = 95931631866715232 + -6898178934844276539739337. +6898179030775908406454569 = 95931631866715232 - -6898178934844276539739337. +-661753562128210935363300938280983687481184 = 95931631866715232 * -6898178934844276539739337. +-95931631866715232 = -(95931631866715232). +95931631866715232 = +(95931631866715232). +0 = 95931631866715232 div -6898178934844276539739337. +95931631866715232 = 95931631866715232 rem -6898178934844276539739337. +22607067303022624 = 95931631866715232 band -6898178934844276539739337. +-6898178861519711976046729 = 95931631866715232 bor -6898178934844276539739337. +-6898178884126779279069353 = 95931631866715232 bxor -6898178934844276539739337. +-95931631866715233 = bnot(95931631866715232). +0 = 95931631866715232 bsl -93. +950060864974336740620950611578780579207839744 = 95931631866715232 bsr -93. +432547742614636761652035 = 432547742614636761651666 + 369. +432547742614636761651297 = 432547742614636761651666 - 369. +159610117024800965049464754 = 432547742614636761651666 * 369. +-432547742614636761651666 = -(432547742614636761651666). +432547742614636761651666 = +(432547742614636761651666). +1172216104646712091196 = 432547742614636761651666 div 369. +342 = 432547742614636761651666 rem 369. +336 = 432547742614636761651666 band 369. +432547742614636761651699 = 432547742614636761651666 bor 369. +432547742614636761651363 = 432547742614636761651666 bxor 369. +-432547742614636761651667 = bnot(432547742614636761651666). +55366111054673505491413248 = 432547742614636761651666 bsl 7. +3379279239176849700403 = 432547742614636761651666 bsr 7. +-903415491 = 51542996 + -954958487. +1006501483 = 51542996 - -954958487. +-49221421475607052 = 51542996 * -954958487. +-51542996 = -(51542996). +51542996 = +(51542996). +0 = 51542996 div -954958487. +51542996 = 51542996 rem -954958487. +51411264 = 51542996 band -954958487. +-954826755 = 51542996 bor -954958487. +-1006238019 = 51542996 bxor -954958487. +-51542997 = bnot(51542996). +206171984 = 51542996 bsl 2. +12885749 = 51542996 bsr 2. +-394039090394236209 = 57478469399929949 + -451517559794166158. +508996029194096107 = 57478469399929949 - -451517559794166158. +-25952538244160020554537424066465942 = 57478469399929949 * -451517559794166158. +-57478469399929949 = -(57478469399929949). +57478469399929949 = +(57478469399929949). +0 = 57478469399929949 div -451517559794166158. +57478469399929949 = 57478469399929949 rem -451517559794166158. +38315819969545296 = 57478469399929949 band -451517559794166158. +-432354910363781505 = 57478469399929949 bor -451517559794166158. +-470670730333326801 = 57478469399929949 bxor -451517559794166158. +-57478469399929950 = bnot(57478469399929949). +898101084373905 = 57478469399929949 bsl -6. +3678622041595516736 = 57478469399929949 bsr -6. +441188502936649166298 = 7965182897847 + 441188494971466268451. +-441188487006283370604 = 7965182897847 - 441188494971466268451. +3514147054873580279719147811924997 = 7965182897847 * 441188494971466268451. +-7965182897847 = -(7965182897847). +7965182897847 = +(7965182897847). +0 = 7965182897847 div 441188494971466268451. +7965182897847 = 7965182897847 rem 441188494971466268451. +6771039383075 = 7965182897847 band 441188494971466268451. +441188496165609783223 = 7965182897847 bor 441188494971466268451. +441188489394570400148 = 7965182897847 bxor 441188494971466268451. +-7965182897848 = bnot(7965182897847). +0 = 7965182897847 bsl -395. +642752892715792032020916564971604842268294905551325536647355633728692499974443520789917622155430822468256301261612127218720409911296 = 7965182897847 bsr -395. +158154113 = -635671774 + 793825887. +-1429497661 = -635671774 - 793825887. +-504612709836413538 = -635671774 * 793825887. +635671774 = -(-635671774). +-635671774 = +(-635671774). +0 = -635671774 div 793825887. +-635671774 = -635671774 rem 793825887. +168837634 = -635671774 band 793825887. +-10683521 = -635671774 bor 793825887. +-179521155 = -635671774 bxor 793825887. +635671773 = bnot(-635671774). +-3001875079643887983740745416704 = -635671774 bsl 72. +-1 = -635671774 bsr 72. +-749159243735 = 584196 + -749159827931. +749160412127 = 584196 - -749159827931. +-437656174837978476 = 584196 * -749159827931. +-584196 = -(584196). +584196 = +(584196). +0 = 584196 div -749159827931. +584196 = 584196 rem -749159827931. +532996 = 584196 band -749159827931. +-749159776731 = 584196 bor -749159827931. +-749160309727 = 584196 bxor -749159827931. +-584197 = bnot(584196). +74777088 = 584196 bsl 7. +4564 = 584196 bsr 7. +-289323663941639762 = -824322113 + -289323663117317649. +289323662292995536 = -824322113 - -289323663117317649. +238495893321767451315872337 = -824322113 * -289323663117317649. +824322113 = -(-824322113). +-824322113 = +(-824322113). +0 = -824322113 div -289323663117317649. +-824322113 = -824322113 rem -289323663117317649. +-289323663117450833 = -824322113 band -289323663117317649. +-824188929 = -824322113 bor -289323663117317649. +289323662293261904 = -824322113 bxor -289323663117317649. +824322112 = bnot(-824322113). +-1610005 = -824322113 bsl -9. +-422052921856 = -824322113 bsr -9. +-326847 = 44525 + -371372. +415897 = 44525 - -371372. +-16535338300 = 44525 * -371372. +-44525 = -(44525). +44525 = +(44525). +0 = 44525 div -371372. +44525 = 44525 rem -371372. +1348 = 44525 band -371372. +-328195 = 44525 bor -371372. +-329543 = 44525 bxor -371372. +-44526 = bnot(44525). +6416728749077482700800 = 44525 bsl 57. +0 = 44525 bsr 57. +23581337831219595386137516208 = -3 + 23581337831219595386137516211. +-23581337831219595386137516214 = -3 - 23581337831219595386137516211. +-70744013493658786158412548633 = -3 * 23581337831219595386137516211. +3 = -(-3). +-3 = +(-3). +0 = -3 div 23581337831219595386137516211. +-3 = -3 rem 23581337831219595386137516211. +23581337831219595386137516209 = -3 band 23581337831219595386137516211. +-1 = -3 bor 23581337831219595386137516211. +-23581337831219595386137516210 = -3 bxor 23581337831219595386137516211. +2 = bnot(-3). +-1536 = -3 bsl 9. +-1 = -3 bsr 9. +473833510 = 58349 + 473775161. +-473716812 = 58349 - 473775161. +27644306869189 = 58349 * 473775161. +-58349 = -(58349). +58349 = +(58349). +0 = 58349 div 473775161. +58349 = 58349 rem 473775161. +8233 = 58349 band 473775161. +473825277 = 58349 bor 473775161. +473817044 = 58349 bxor 473775161. +-58350 = bnot(58349). +14937344 = 58349 bsl 8. +227 = 58349 bsr 8. +-33376122770 = 86 + -33376122856. +33376122942 = 86 - -33376122856. +-2870346565616 = 86 * -33376122856. +-86 = -(86). +86 = +(86). +0 = 86 div -33376122856. +86 = 86 rem -33376122856. +16 = 86 band -33376122856. +-33376122786 = 86 bor -33376122856. +-33376122802 = 86 bxor -33376122856. +-87 = bnot(86). +0 = 86 bsl -65. +3172839980678042877952 = 86 bsr -65. +-929864438874349386957477629 = -929864438874349386957477632 + 3. +-929864438874349386957477635 = -929864438874349386957477632 - 3. +-2789593316623048160872432896 = -929864438874349386957477632 * 3. +929864438874349386957477632 = -(-929864438874349386957477632). +-929864438874349386957477632 = +(-929864438874349386957477632). +-309954812958116462319159210 = -929864438874349386957477632 div 3. +-2 = -929864438874349386957477632 rem 3. +0 = -929864438874349386957477632 band 3. +-929864438874349386957477629 = -929864438874349386957477632 bor 3. +-929864438874349386957477629 = -929864438874349386957477632 bxor 3. +929864438874349386957477631 = bnot(-929864438874349386957477632). +-7438915510994795095659821056 = -929864438874349386957477632 bsl 3. +-116233054859293673369684704 = -929864438874349386957477632 bsr 3. +-3817912565748568606797 = -3817912565738985778851 + -9582827946. +-3817912565729402950905 = -3817912565738985778851 - -9582827946. +36586399230348115063269938570046 = -3817912565738985778851 * -9582827946. +3817912565738985778851 = -(-3817912565738985778851). +-3817912565738985778851 = +(-3817912565738985778851). +398411887101 = -3817912565738985778851 div -9582827946. +-8926054305 = -3817912565738985778851 rem -9582827946. +-3817912565739170987948 = -3817912565738985778851 band -9582827946. +-9397618849 = -3817912565738985778851 bor -9582827946. +3817912565729773369099 = -3817912565738985778851 bxor -9582827946. +3817912565738985778850 = bnot(-3817912565738985778851). +-1043841503321345663125349288538610526431071093780390609101774787620215813866056745943147557256981444124967678463891734528 = -3817912565738985778851 bsl 327. +-1 = -3817912565738985778851 bsr 327. +-38146852966143458950 = -38146852966148174367 + 4715417. +-38146852966152889784 = -38146852966148174367 - 4715417. +-179878318973075525929116039 = -38146852966148174367 * 4715417. +38146852966148174367 = -(-38146852966148174367). +-38146852966148174367 = +(-38146852966148174367). +-8089815379243 = -38146852966148174367 div 4715417. +-4285036 = -38146852966148174367 rem 4715417. +426369 = -38146852966148174367 band 4715417. +-38146852966143885319 = -38146852966148174367 bor 4715417. +-38146852966144311688 = -38146852966148174367 bxor 4715417. +38146852966148174366 = bnot(-38146852966148174367). +-5902939582440887005209827326210539013093195776 = -38146852966148174367 bsl 87. +-1 = -38146852966148174367 bsr 87. +27296884958896974342379 = 9828 + 27296884958896974332551. +-27296884958896974322723 = 9828 - 27296884958896974332551. +268273785376039463740311228 = 9828 * 27296884958896974332551. +-9828 = -(9828). +9828 = +(9828). +0 = 9828 div 27296884958896974332551. +9828 = 9828 rem 27296884958896974332551. +516 = 9828 band 27296884958896974332551. +27296884958896974341863 = 9828 bor 27296884958896974332551. +27296884958896974341347 = 9828 bxor 27296884958896974332551. +-9829 = bnot(9828). +157248 = 9828 bsl 4. +614 = 9828 bsr 4. +481750492244047 = 594898489335 + 481155593754712. +-480560695265377 = 594898489335 - 481155593754712. +286238735859763129337996520 = 594898489335 * 481155593754712. +-594898489335 = -(594898489335). +594898489335 = +(594898489335). +0 = 594898489335 div 481155593754712. +594898489335 = 594898489335 rem 481155593754712. +594856511568 = 594898489335 band 481155593754712. +481155635732479 = 594898489335 bor 481155593754712. +480560779220911 = 594898489335 bxor 481155593754712. +-594898489336 = bnot(594898489335). +18590577791 = 594898489335 bsl -5. +19036751658720 = 594898489335 bsr -5. +-56521177399366874777959624 = -56521177399366874777956856 + -2768. +-56521177399366874777954088 = -56521177399366874777956856 - -2768. +156450619041447509385384577408 = -56521177399366874777956856 * -2768. +56521177399366874777956856 = -(-56521177399366874777956856). +-56521177399366874777956856 = +(-56521177399366874777956856). +20419500505551616610533 = -56521177399366874777956856 div -2768. +-1512 = -56521177399366874777956856 rem -2768. +-56521177399366874777959424 = -56521177399366874777956856 band -2768. +-200 = -56521177399366874777956856 bor -2768. +56521177399366874777959224 = -56521177399366874777956856 bxor -2768. +56521177399366874777956855 = bnot(-56521177399366874777956856). +-4270619419569590861925385289086088873382212796416 = -56521177399366874777956856 bsl 76. +-749 = -56521177399366874777956856 bsr 76. +3331606320261 = -4222816969137 + 7554423289398. +-11777240258535 = -4222816969137 - 7554423289398. +-31900946858513628185309526 = -4222816969137 * 7554423289398. +4222816969137 = -(-4222816969137). +-4222816969137 = +(-4222816969137). +0 = -4222816969137 div 7554423289398. +-4222816969137 = -4222816969137 rem 7554423289398. +4435698128390 = -4222816969137 band 7554423289398. +-1104091808129 = -4222816969137 bor 7554423289398. +-5539789936519 = -4222816969137 bxor 7554423289398. +4222816969136 = bnot(-4222816969137). +-326724637791776765240250227125458567168 = -4222816969137 bsl 86. +-1 = -4222816969137 bsr 86. +-3869944912635894845431 = -3869944912635894845426 + -5. +-3869944912635894845421 = -3869944912635894845426 - -5. +19349724563179474227130 = -3869944912635894845426 * -5. +3869944912635894845426 = -(-3869944912635894845426). +-3869944912635894845426 = +(-3869944912635894845426). +773988982527178969085 = -3869944912635894845426 div -5. +-1 = -3869944912635894845426 rem -5. +-3869944912635894845430 = -3869944912635894845426 band -5. +-1 = -3869944912635894845426 bor -5. +3869944912635894845429 = -3869944912635894845426 bxor -5. +3869944912635894845425 = bnot(-3869944912635894845426). +-8115862713424192146874826752 = -3869944912635894845426 bsl 21. +-1845333534543941 = -3869944912635894845426 bsr 21. +-791938612820188974009 = 7984591332 + -791938612828173565341. +791938612836158156673 = 7984591332 - -791938612828173565341. +-6323306183463938655213284224212 = 7984591332 * -791938612828173565341. +-7984591332 = -(7984591332). +7984591332 = +(7984591332). +0 = 7984591332 div -791938612828173565341. +7984591332 = 7984591332 rem -791938612828173565341. +3641376864 = 7984591332 band -791938612828173565341. +-791938612823830350873 = 7984591332 bor -791938612828173565341. +-791938612827471727737 = 7984591332 bxor -791938612828173565341. +-7984591333 = bnot(7984591332). +152795239135758123610193604886969735300219218331318199952071007164863589275883561950294154464429070843944911676374127825687842495580767193068162538932842201844502675203742537259543974199411276738883515609776128 = 7984591332 bsl 662. +0 = 7984591332 bsr 662. +-95762135561856276171733400868 = -322622315345758699 + -95762135561533653856387642169. +95762135561211031541041883470 = -322622315345758699 - -95762135561533653856387642169. +30895001897316403762773969256055325231030978131 = -322622315345758699 * -95762135561533653856387642169. +322622315345758699 = -(-322622315345758699). +-322622315345758699 = +(-322622315345758699). +0 = -322622315345758699 div -95762135561533653856387642169. +-322622315345758699 = -322622315345758699 rem -95762135561533653856387642169. +-95762135561847268696518360059 = -322622315345758699 band -95762135561533653856387642169. +-9007475215040809 = -322622315345758699 bor -95762135561533653856387642169. +95762135561838261221303319250 = -322622315345758699 bxor -95762135561533653856387642169. +322622315345758698 = bnot(-322622315345758699). +-2567161184092343845628212333860085140646302889367202631469553957315392947157823861052588997808445984866304 = -322622315345758699 bsl 292. +-1 = -322622315345758699 bsr 292. +-99095 = -6558 + -92537. +85979 = -6558 - -92537. +606857646 = -6558 * -92537. +6558 = -(-6558). +-6558 = +(-6558). +0 = -6558 div -92537. +-6558 = -6558 rem -92537. +-96766 = -6558 band -92537. +-2329 = -6558 bor -92537. +94437 = -6558 bxor -92537. +6557 = bnot(-6558). +-606859543878319811624706237634247050128856807962137244692439035497596391899422384533757007425919985914188536281096075659160210009175834225362040755136016959601808532043977599179663642833949482510332748217129266385338025669296128 = -6558 bsl 744. +-1 = -6558 bsr 744. +-4816162758613654499450998419 = -4816162758613654499451532177 + 533758. +-4816162758613654499452065935 = -4816162758613654499451532177 - 533758. +-2570665401712106998318250911731166 = -4816162758613654499451532177 * 533758. +4816162758613654499451532177 = -(-4816162758613654499451532177). +-4816162758613654499451532177 = +(-4816162758613654499451532177). +-9023120512692370886153 = -4816162758613654499451532177 div 533758. +-279203 = -4816162758613654499451532177 rem 533758. +1134 = -4816162758613654499451532177 band 533758. +-4816162758613654499450999553 = -4816162758613654499451532177 bor 533758. +-4816162758613654499451000687 = -4816162758613654499451532177 bxor 533758. +4816162758613654499451532176 = bnot(-4816162758613654499451532177). +-875143398867689885702861582865761345058340424630704765607334381359968415311325768611320589070116093115457035529403987868423505377358747196387899692483366279446528 = -4816162758613654499451532177 bsl 446. +-1 = -4816162758613654499451532177 bsr 446. +-234214727464624993697749987957 = 45666987 + -234214727464624993697795654944. +234214727464624993697841321931 = 45666987 - -234214727464624993697795654944. +-10695880914335572547072316102984133728 = 45666987 * -234214727464624993697795654944. +-45666987 = -(45666987). +45666987 = +(45666987). +0 = 45666987 div -234214727464624993697795654944. +45666987 = 45666987 rem -234214727464624993697795654944. +2626208 = 45666987 band -234214727464624993697795654944. +-234214727464624993697752614165 = 45666987 bor -234214727464624993697795654944. +-234214727464624993697755240373 = 45666987 bxor -234214727464624993697795654944. +-45666988 = bnot(45666987). +0 = 45666987 bsl -814. +4989061176068287327376163286037207456904942639896041682600096896425602836184001940372722721400138276293043823722192536810459596531044311721135428994959988087426858384533388806703417525251556871597511867028804791274242795579764130948539744305141942059008 = 45666987 bsr -814. +294237733793 = 294237675975 + 57818. +294237618157 = 294237675975 - 57818. +17012233949522550 = 294237675975 * 57818. +-294237675975 = -(294237675975). +294237675975 = +(294237675975). +5089032 = 294237675975 div 57818. +23799 = 294237675975 rem 57818. +41410 = 294237675975 band 57818. +294237692383 = 294237675975 bor 57818. +294237650973 = 294237675975 bxor 57818. +-294237675976 = bnot(294237675975). +2298731843 = 294237675975 bsl -7. +37662422524800 = 294237675975 bsr -7. +619635526811414968622238 = 619635526811414968622274 + -36. +619635526811414968622310 = 619635526811414968622274 - -36. +-22306878965210938870401864 = 619635526811414968622274 * -36. +-619635526811414968622274 = -(619635526811414968622274). +619635526811414968622274 = +(619635526811414968622274). +-17212097966983749128396 = 619635526811414968622274 div -36. +18 = 619635526811414968622274 rem -36. +619635526811414968622272 = 619635526811414968622274 band -36. +-34 = 619635526811414968622274 bor -36. +-619635526811414968622306 = 619635526811414968622274 bxor -36. +-619635526811414968622275 = bnot(619635526811414968622274). +0 = 619635526811414968622274 bsl -898. +1309400240447349610752865658212333969519436336204740814484295543713792185287997964704284463880988952952448374164567391624130625099714206654273655760270277077772585340072874724861337858038465105456883583603200323496638775911839793771182071797910195619316242423523255972536276419270994033698144256 = 619635526811414968622274 bsr -898. +9775526678384975794014685742 = -33684429226 + 9775526678384975827699114968. +-9775526678384975861383544194 = -33684429226 - 9775526678384975827699114968. +-329283036544933582249851608562433254768 = -33684429226 * 9775526678384975827699114968. +33684429226 = -(-33684429226). +-33684429226 = +(-33684429226). +0 = -33684429226 div 9775526678384975827699114968. +-33684429226 = -33684429226 rem 9775526678384975827699114968. +9775526678384975806094910032 = -33684429226 band 9775526678384975827699114968. +-12080224290 = -33684429226 bor 9775526678384975827699114968. +-9775526678384975818175134322 = -33684429226 bxor 9775526678384975827699114968. +33684429225 = bnot(-33684429226). +-121887201088907928216526935522257963350171324723121089166932176873234351228518345474048 = -33684429226 bsl 251. +-1 = -33684429226 bsr 251. +9086916786367603 = -34196395468764 + 9121113181836367. +-9155309577305131 = -34196395468764 - 9121113181836367. +-311909193481432730867307740388 = -34196395468764 * 9121113181836367. +34196395468764 = -(-34196395468764). +-34196395468764 = +(-34196395468764). +0 = -34196395468764 div 9121113181836367. +-34196395468764 = -34196395468764 rem 9121113181836367. +9113310836871172 = -34196395468764 band 9121113181836367. +-26394050503569 = -34196395468764 bor 9121113181836367. +-9139704887374741 = -34196395468764 bxor 9121113181836367. +34196395468763 = bnot(-34196395468764). +-21166543575010053090615518150392773869568 = -34196395468764 bsl 89. +-1 = -34196395468764 bsr 89. +999476298913469228469154575859 = 42153428 + 999476298913469228469112422431. +-999476298913469228469070269003 = 42153428 - 999476298913469228469112422431. +42131352203955403352488280722850743468 = 42153428 * 999476298913469228469112422431. +-42153428 = -(42153428). +42153428 = +(42153428). +0 = 42153428 div 999476298913469228469112422431. +42153428 = 42153428 rem 999476298913469228469112422431. +8519700 = 42153428 band 999476298913469228469112422431. +999476298913469228469146056159 = 42153428 bor 999476298913469228469112422431. +999476298913469228469137536459 = 42153428 bxor 999476298913469228469112422431. +-42153429 = bnot(42153428). +329323 = 42153428 bsl -7. +5395638784 = 42153428 bsr -7. +595927225325835812808187095571 = -494321158288683628236833357 + 596421546484124496436423928928. +-596915867642413180064660762285 = -494321158288683628236833357 - 596421546484124496436423928928. +-294823789686360385692280171002505341469922006947147651296 = -494321158288683628236833357 * 596421546484124496436423928928. +494321158288683628236833357 = -(-494321158288683628236833357). +-494321158288683628236833357 = +(-494321158288683628236833357). +0 = -494321158288683628236833357 div 596421546484124496436423928928. +-494321158288683628236833357 = -494321158288683628236833357 rem 596421546484124496436423928928. +596111740048785683094737824800 = -494321158288683628236833357 band 596421546484124496436423928928. +-184514722949870286550729229 = -494321158288683628236833357 bor 596421546484124496436423928928. +-596296254771735553381288554029 = -494321158288683628236833357 bxor 596421546484124496436423928928. +494321158288683628236833356 = bnot(-494321158288683628236833357). +-74299794547651704779075817488211167888677617799570034016983255678418711265003573368175743881415842265896826807944841365719178660594843648 = -494321158288683628236833357 bsl 366. +-1 = -494321158288683628236833357 bsr 366. +76696419294522 = -6 + 76696419294528. +-76696419294534 = -6 - 76696419294528. +-460178515767168 = -6 * 76696419294528. +6 = -(-6). +-6 = +(-6). +0 = -6 div 76696419294528. +-6 = -6 rem 76696419294528. +76696419294528 = -6 band 76696419294528. +-6 = -6 bor 76696419294528. +-76696419294534 = -6 bxor 76696419294528. +5 = bnot(-6). +-27881567033958432427463671840310635502461128781113646107295722362173887321757582003971905896802931573558726071066118244696023473353966982021078073395669899233430703258389872636425370184393082566316984920919089447613770288253960251652945605131537339056475845727265198365445600290275328 = -6 bsl 939. +-1 = -6 bsr 939. +-5963204504535392 = 612459256858577 + -6575663761393969. +7188123018252546 = 612459256858577 - -6575663761393969. +-4027326140655225441893413722113 = 612459256858577 * -6575663761393969. +-612459256858577 = -(612459256858577). +612459256858577 = +(612459256858577). +0 = 612459256858577 div -6575663761393969. +612459256858577 = 612459256858577 rem -6575663761393969. +36315161740993 = 612459256858577 band -6575663761393969. +-5999519666276385 = 612459256858577 bor -6575663761393969. +-6035834828017378 = 612459256858577 bxor -6575663761393969. +-612459256858578 = bnot(612459256858577). +0 = 612459256858577 bsl -439. +869451376832272522741917124901056592656087690916267199941797101960482731922298972310236064550080148577974253133047874586483234014371207396380901376 = 612459256858577 bsr -439. +526301200591041754927532011 = 527268739875958669246658124 + -967539284916914319126113. +528236279160875583565784237 = 527268739875958669246658124 - -967539284916914319126113. +-510153219538627557276352650964165768447981351992012 = 527268739875958669246658124 * -967539284916914319126113. +-527268739875958669246658124 = -(527268739875958669246658124). +527268739875958669246658124 = +(527268739875958669246658124). +-544 = 527268739875958669246658124 div -967539284916914319126113. +927368881157279642052652 = 527268739875958669246658124 rem -967539284916914319126113. +527248039701759342747455500 = 527268739875958669246658124 band -967539284916914319126113. +-946839110717587819923489 = 527268739875958669246658124 bor -967539284916914319126113. +-528194878812476930567378989 = 527268739875958669246658124 bxor -967539284916914319126113. +-527268739875958669246658125 = bnot(527268739875958669246658124). +1029821757570231775872379 = 527268739875958669246658124 bsl -9. +269961594816490838654288959488 = 527268739875958669246658124 bsr -9. +25 = -33 + 58. +-91 = -33 - 58. +-1914 = -33 * 58. +33 = -(-33). +-33 = +(-33). +0 = -33 div 58. +-33 = -33 rem 58. +26 = -33 band 58. +-1 = -33 bor 58. +-27 = -33 bxor 58. +32 = bnot(-33). +-1 = -33 bsl -977. +-42152147337373282422182591699338030515344570620396863276533797760273915156272521069378312231204466007006912477349345499552697890314872698114811308379775639597158519812726929488050396676904946289297638894444767674739146716812152782613332623269622692606550393553215967599486611419264865489676926976 = -33 bsr -977. +-363991769580627863095264 = 97355814189858 + -363991769677983677285122. +363991769775339491474980 = 97355814189858 - -363991769677983677285122. +-35436715095407368188328987401306692676 = 97355814189858 * -363991769677983677285122. +-97355814189858 = -(97355814189858). +97355814189858 = +(97355814189858). +0 = 97355814189858 div -363991769677983677285122. +97355814189858 = 97355814189858 rem -363991769677983677285122. +70967526733858 = 97355814189858 band -363991769677983677285122. +-363991769651595389829122 = 97355814189858 bor -363991769677983677285122. +-363991769722562916562980 = 97355814189858 bxor -363991769677983677285122. +-97355814189859 = bnot(97355814189858). +0 = 97355814189858 bsl -51. +219225804253897867858525814784 = 97355814189858 bsr -51. +-442434983275624365774696314360 = 35967576152264915259 + -442434983311591941926961229619. +442434983347559518079226144878 = 35967576152264915259 - -442434983311591941926961229619. +-15913313954685740093802190705270834339315475856321 = 35967576152264915259 * -442434983311591941926961229619. +-35967576152264915259 = -(35967576152264915259). +35967576152264915259 = +(35967576152264915259). +0 = 35967576152264915259 div -442434983311591941926961229619. +35967576152264915259 = 35967576152264915259 rem -442434983311591941926961229619. +26734058852615229449 = 35967576152264915259 band -442434983311591941926961229619. +-442434983302358424627311543809 = 35967576152264915259 bor -442434983311591941926961229619. +-442434983329092483479926773258 = 35967576152264915259 bxor -442434983311591941926961229619. +-35967576152264915260 = bnot(35967576152264915259). +143870304609059661036 = 35967576152264915259 bsl 2. +8991894038066228814 = 35967576152264915259 bsr 2. +-9425177621947 = -9425177618185 + -3762. +-9425177614423 = -9425177618185 - -3762. +35457518199611970 = -9425177618185 * -3762. +9425177618185 = -(-9425177618185). +-9425177618185 = +(-9425177618185). +2505363534 = -9425177618185 div -3762. +-3277 = -9425177618185 rem -3762. +-9425177620410 = -9425177618185 band -3762. +-1537 = -9425177618185 bor -3762. +9425177618873 = -9425177618185 bxor -3762. +9425177618184 = bnot(-9425177618185). +-1 = -9425177618185 bsl -74. +-178036571516839993116237002482647040 = -9425177618185 bsr -74. +7498725127338 = 7498725127332 + 6. +7498725127326 = 7498725127332 - 6. +44992350763992 = 7498725127332 * 6. +-7498725127332 = -(7498725127332). +7498725127332 = +(7498725127332). +1249787521222 = 7498725127332 div 6. +0 = 7498725127332 rem 6. +4 = 7498725127332 band 6. +7498725127334 = 7498725127332 bor 6. +7498725127330 = 7498725127332 bxor 6. +-7498725127333 = bnot(7498725127332). +0 = 7498725127332 bsl -638. +8553122025330921140993595282243144990572367479830507462601522123573495966844348731535465006154186485117158657367833571146441807249102545221406114737060457937917228945748790915862864350301737636832538001408 = 7498725127332 bsr -638. +8974004074 = -43849548455 + 52823552529. +-96673100984 = -43849548455 - 52823552529. +-2316288926185623292695 = -43849548455 * 52823552529. +43849548455 = -(-43849548455). +-43849548455 = +(-43849548455). +0 = -43849548455 div 52823552529. +-43849548455 = -43849548455 rem 52823552529. +18388119569 = -43849548455 band 52823552529. +-9414115495 = -43849548455 bor 52823552529. +-27802235064 = -43849548455 bxor 52823552529. +43849548454 = bnot(-43849548455). +-171287299 = -43849548455 bsl -8. +-11225484404480 = -43849548455 bsr -8. +-2696151341480155039610 = -2696668659469524633754 + 517317989369594144. +-2697185977458894227898 = -2696668659469524633754 - 517317989369594144. +-1395035208912773235167847251805223136576 = -2696668659469524633754 * 517317989369594144. +2696668659469524633754 = -(-2696668659469524633754). +-2696668659469524633754 = +(-2696668659469524633754). +-5212 = -2696668659469524633754 div 517317989369594144. +-407298875199955226 = -2696668659469524633754 rem 517317989369594144. +10205393930699040 = -2696668659469524633754 band 517317989369594144. +-2696161546874085738650 = -2696668659469524633754 bor 517317989369594144. +-2696171752268016437690 = -2696668659469524633754 bxor 517317989369594144. +2696668659469524633753 = bnot(-2696668659469524633754). +-46328414802279076042559230836736 = -2696668659469524633754 bsl 34. +-156966774927 = -2696668659469524633754 bsr 34. +-337159831121812558591892981637 = -213354536394912 + -337159831121812345237356586725. +337159831121812131882820191813 = -213354536394912 - -337159831121812345237356586725. +71934579459981095625165181309631098976743200 = -213354536394912 * -337159831121812345237356586725. +213354536394912 = -(-213354536394912). +-213354536394912 = +(-213354536394912). +0 = -213354536394912 div -337159831121812345237356586725. +-213354536394912 = -213354536394912 rem -337159831121812345237356586725. +-337159831121812415620346210048 = -213354536394912 band -337159831121812345237356586725. +-142971546771589 = -213354536394912 bor -337159831121812345237356586725. +337159831121812272648799438459 = -213354536394912 bxor -337159831121812345237356586725. +213354536394911 = bnot(-213354536394912). +-1876686348839708223074205696 = -213354536394912 bsl 43. +-25 = -213354536394912 bsr 43. +296274581723538294441 = 296274581723538337699 + -43258. +296274581723538380957 = 296274581723538337699 - -43258. +-12816245856196821412183342 = 296274581723538337699 * -43258. +-296274581723538337699 = -(296274581723538337699). +296274581723538337699 = +(296274581723538337699). +-6849012476849099 = 296274581723538337699 div -43258. +13157 = 296274581723538337699 rem -43258. +296274581723538327298 = 296274581723538337699 band -43258. +-32857 = 296274581723538337699 bor -43258. +-296274581723538360155 = 296274581723538337699 bxor -43258. +-296274581723538337700 = bnot(296274581723538337699). +4629290339430286526 = 296274581723538337699 bsl -6. +18961573230306453612736 = 296274581723538337699 bsr -6. +-2795179228387527847137412139 = 73811352538545589 + -2795179228461339199675957728. +2795179228535150552214503317 = 73811352538545589 - -2795179228461339199675957728. +-206315959440379770010957884816805519764861792 = 73811352538545589 * -2795179228461339199675957728. +-73811352538545589 = -(73811352538545589). +73811352538545589 = +(73811352538545589). +0 = 73811352538545589 div -2795179228461339199675957728. +73811352538545589 = 73811352538545589 rem -2795179228461339199675957728. +591574440442912 = 73811352538545589 band -2795179228461339199675957728. +-2795179228388119421577855051 = 73811352538545589 bor -2795179228461339199675957728. +-2795179228388710996018297963 = 73811352538545589 bxor -2795179228461339199675957728. +-73811352538545590 = bnot(73811352538545589). +21951745852486365331390533787549643026759044079118398227826506135038082976341265195515789437916237414977760255060471755358280849338222559163449801749157628373115303872545583140012311157645083351087974141647608316563146738157835625890058188866567715570838242838777132323892260829840559655555770559234048 = 73811352538545589 bsl 945. +0 = 73811352538545589 bsr 945. +3856978036337648058739 = 3856981361636182577366 + -3325298534518627. +3856984686934717095993 = 3856981361636182577366 - -3325298534518627. +-12825614469514456438512789842995596482 = 3856981361636182577366 * -3325298534518627. +-3856981361636182577366 = -(3856981361636182577366). +3856981361636182577366 = +(3856981361636182577366). +-1159890 = 3856981361636182577366 div -3325298534518627. +844433372306336 = 3856981361636182577366 rem -3325298534518627. +3856978458830441795732 = 3856981361636182577366 band -3325298534518627. +-422492793736993 = 3856981361636182577366 bor -3325298534518627. +-3856978881323235532725 = 3856981361636182577366 bxor -3325298534518627. +-3856981361636182577367 = bnot(3856981361636182577366). +30132666887782676385 = 3856981361636182577366 bsl -7. +493693614289431369902848 = 3856981361636182577366 bsr -7. +-661321514381874695658958184 = -99198762598991 + -661321514381775496896359193. +661321514381676298133760202 = -99198762598991 - -661321514381775496896359193. +65602275906762959875107760914366155374263 = -99198762598991 * -661321514381775496896359193. +99198762598991 = -(-99198762598991). +-99198762598991 = +(-99198762598991). +0 = -99198762598991 div -661321514381775496896359193. +-99198762598991 = -99198762598991 rem -661321514381775496896359193. +-661321514381854730469895007 = -99198762598991 band -661321514381775496896359193. +-19965189063177 = -99198762598991 bor -661321514381775496896359193. +661321514381834765280831830 = -99198762598991 bxor -661321514381775496896359193. +99198762598990 = bnot(-99198762598991). +-843011706507761063802353817455684884896075820720354110340744260908722957174197815508162477953706034861601895234230996573606424974614263170204716079184952542065012482111122397761684618867382385901568 = -99198762598991 bsl 611. +-1 = -99198762598991 bsr 611. +-79187846614272646 = -72626285391 + -79187773987987255. +79187701361701864 = -72626285391 - -79187773987987255. +5751113873129568587300691705 = -72626285391 * -79187773987987255. +72626285391 = -(-72626285391). +-72626285391 = +(-72626285391). +0 = -72626285391 div -79187773987987255. +-72626285391 = -72626285391 rem -79187773987987255. +-79187776282541951 = -72626285391 band -79187773987987255. +-70331730695 = -72626285391 bor -79187773987987255. +79187705950811256 = -72626285391 bxor -79187773987987255. +72626285390 = bnot(-72626285391). +-1162020566256 = -72626285391 bsl 4. +-4539142837 = -72626285391 bsr 4. +654631766685886951274 = 266748 + 654631766685886684526. +-654631766685886417778 = 266748 - 654631766685886684526. +174621714499926901323941448 = 266748 * 654631766685886684526. +-266748 = -(266748). +266748 = +(266748). +0 = 266748 div 654631766685886684526. +266748 = 266748 rem 654631766685886684526. +4460 = 266748 band 654631766685886684526. +654631766685886946814 = 266748 bor 654631766685886684526. +654631766685886942354 = 266748 bxor 654631766685886684526. +-266749 = bnot(266748). +4167 = 266748 bsl -6. +17071872 = 266748 bsr -6. +3194331913276412233660393 = 36414377791915 + 3194331913239997855868478. +-3194331913203583478076563 = 36414377791915 - 3194331913239997855868478. +116319609081491930476239322338291755370 = 36414377791915 * 3194331913239997855868478. +-36414377791915 = -(36414377791915). +36414377791915 = +(36414377791915). +0 = 36414377791915 div 3194331913239997855868478. +36414377791915 = 36414377791915 rem 3194331913239997855868478. +1185411792938 = 36414377791915 band 3194331913239997855868478. +3194331913275226821867455 = 36414377791915 bor 3194331913239997855868478. +3194331913274041410074517 = 36414377791915 bxor 3194331913239997855868478. +-36414377791916 = bnot(36414377791915). +0 = 36414377791915 bsl -243. +514709092139009613858501395657339641731606256350238568349145338242232949900516335288320 = 36414377791915 bsr -243. +6339132293665891298 = 6339132293665891257 + 41. +6339132293665891216 = 6339132293665891257 - 41. +259904424040301541537 = 6339132293665891257 * 41. +-6339132293665891257 = -(6339132293665891257). +6339132293665891257 = +(6339132293665891257). +154612982772338811 = 6339132293665891257 div 41. +6 = 6339132293665891257 rem 41. +41 = 6339132293665891257 band 41. +6339132293665891257 = 6339132293665891257 bor 41. +6339132293665891216 = 6339132293665891257 bxor 41. +-6339132293665891258 = bnot(6339132293665891257). +6540876802517922337097795615425271354928844298415014190466702337110754307535259672876481376235273683129339522762233785446355493168525251329916155541611588867156042761429400960498727161711020718201875316876620233162795732755392651208565655320924567661735650320962331384548650016829341696 = 6339132293665891257 bsl 887. +0 = 6339132293665891257 bsr 887. +383295354711715984308705 = -42155431778539617 + 383295396867147762848322. +-383295439022579541387939 = -42155431778539617 - 383295396867147762848322. +-16157982953661315158369020707121438972674 = -42155431778539617 * 383295396867147762848322. +42155431778539617 = -(-42155431778539617). +-42155431778539617 = +(-42155431778539617). +0 = -42155431778539617 div 383295396867147762848322. +-42155431778539617 = -42155431778539617 rem 383295396867147762848322. +383295395389385881420290 = -42155431778539617 band 383295396867147762848322. +-40677669897111585 = -42155431778539617 bor 383295396867147762848322. +-383295436067055778531875 = -42155431778539617 bxor 383295396867147762848322. +42155431778539616 = bnot(-42155431778539617). +-1414501569043646637932544 = -42155431778539617 bsl 25. +-1256329769 = -42155431778539617 bsr 25. +48709579420901383 = -23944221635562 + 48733523642536945. +-48757467864172507 = -23944221635562 - 48733523642536945. +-1166886291178805365042910838090 = -23944221635562 * 48733523642536945. +23944221635562 = -(-23944221635562). +-23944221635562 = +(-23944221635562). +0 = -23944221635562 div 48733523642536945. +-23944221635562 = -23944221635562 rem 48733523642536945. +48732696319148048 = -23944221635562 band 48733523642536945. +-23116898246665 = -23944221635562 bor 48733523642536945. +-48755813217394713 = -23944221635562 bxor 48733523642536945. +23944221635561 = bnot(-23944221635562). +-187064231528 = -23944221635562 bsl -7. +-3064860369351936 = -23944221635562 bsr -7. +-433297913832315274130561120 = 7923238216626 + -433297913832323197368777746. +433297913832331120606994372 = 7923238216626 - -433297913832323197368777746. +-3433122590060582667514644803870396004996 = 7923238216626 * -433297913832323197368777746. +-7923238216626 = -(7923238216626). +7923238216626 = +(7923238216626). +0 = 7923238216626 div -433297913832323197368777746. +7923238216626 = 7923238216626 rem -433297913832323197368777746. +7698800182178 = 7923238216626 band -433297913832323197368777746. +-433297913832322972930743298 = 7923238216626 bor -433297913832323197368777746. +-433297913832330671730925476 = 7923238216626 bxor -433297913832323197368777746. +-7923238216627 = bnot(7923238216626). +0 = 7923238216626 bsl -88. +2452123457289354197191493662153749037056 = 7923238216626 bsr -88. +473357648279047 = -9836574172179 + 483194222451226. +-493030796623405 = -9836574172179 - 483194222451226. +-4752975808709843967153641454 = -9836574172179 * 483194222451226. +9836574172179 = -(-9836574172179). +-9836574172179 = +(-9836574172179). +0 = -9836574172179 div 483194222451226. +-9836574172179 = -9836574172179 rem 483194222451226. +482703497271816 = -9836574172179 band 483194222451226. +-9345848992769 = -9836574172179 bor 483194222451226. +-492049346264585 = -9836574172179 bxor 483194222451226. +9836574172178 = bnot(-9836574172179). +-1 = -9836574172179 bsl -828. +-17606793912749172550843427523076589979264544829358355822456798783172507525100432953497835342733207977676835352380503993144327689305889086352246266155981325126663410035213905986199732431751681161072054055564182178329935567160742995579258415951996305623912099610624 = -9836574172179 bsr -828. +952179116216 = 4474585 + 952174641631. +-952170167046 = 4474585 - 952174641631. +4260586368822448135 = 4474585 * 952174641631. +-4474585 = -(4474585). +4474585 = +(4474585). +0 = 4474585 div 952174641631. +4474585 = 4474585 rem 952174641631. +217 = 4474585 band 952174641631. +952179115999 = 4474585 bor 952174641631. +952179115782 = 4474585 bxor 952174641631. +-4474586 = bnot(4474585). +34957 = 4474585 bsl -7. +572746880 = 4474585 bsr -7. +6360004 = 91 + 6359913. +-6359822 = 91 - 6359913. +578752083 = 91 * 6359913. +-91 = -(91). +91 = +(91). +0 = 91 div 6359913. +91 = 91 rem 6359913. +73 = 91 band 6359913. +6359931 = 91 bor 6359913. +6359858 = 91 bxor 6359913. +-92 = bnot(91). +5 = 91 bsl -4. +1456 = 91 bsr -4. +4766 = -9 + 4775. +-4784 = -9 - 4775. +-42975 = -9 * 4775. +9 = -(-9). +-9 = +(-9). +0 = -9 div 4775. +-9 = -9 rem 4775. +4775 = -9 band 4775. +-9 = -9 bor 4775. +-4784 = -9 bxor 4775. +8 = bnot(-9). +-1 = -9 bsl -274. +-273187812969243150598049330647057346246588461741707120176036120119533415106982445056 = -9 bsr -274. +965284315779889295267486240 = 965284315779953794811369987 + -64499543883747. +965284315780018294355253734 = 965284315779953794811369987 - -64499543883747. +-62260398085941826544035961668579732901289 = 965284315779953794811369987 * -64499543883747. +-965284315779953794811369987 = -(965284315779953794811369987). +965284315779953794811369987 = +(965284315779953794811369987). +-14965754138041 = 965284315779953794811369987 div -64499543883747. +10057317050360 = 965284315779953794811369987 rem -64499543883747. +965284315779951418077151233 = 965284315779953794811369987 band -64499543883747. +-62122809664993 = 965284315779953794811369987 bor -64499543883747. +-965284315780013540886816226 = 965284315779953794811369987 bxor -64499543883747. +-965284315779953794811369988 = bnot(965284315779953794811369987). +4380475155801998892845301196571361280019643826879041496383329462320530168980671956908579027196908153533698762167225859842996267500189793598273681761756447031851518995847141414482166450061962739401970301137712309293255063821878024688218282842638050668650497046538763680360490864062383649123060113105846534144 = 965284315779953794811369987 bsl 929. +0 = 965284315779953794811369987 bsr 929. +-9566681586293604325086935 = -9566681586787938453518878 + 494334128431943. +-9566681587282272581950821 = -9566681586787938453518878 - 494334128431943. +-4729137204190733020979865587096688719954 = -9566681586787938453518878 * 494334128431943. +9566681586787938453518878 = -(-9566681586787938453518878). +-9566681586787938453518878 = +(-9566681586787938453518878). +-19352662574 = -9566681586787938453518878 div 494334128431943. +-432165851317596 = -9566681586787938453518878 rem 494334128431943. +494334128423234 = -9566681586787938453518878 band 494334128431943. +-9566681586787938453510169 = -9566681586787938453518878 bor 494334128431943. +-9566681587282272581933403 = -9566681586787938453518878 bxor 494334128431943. +9566681586787938453518877 = bnot(-9566681586787938453518878). +-153066905388607015256302048 = -9566681586787938453518878 bsl 4. +-597917599174246153344930 = -9566681586787938453518878 bsr 4. +48668267991694166982 = 48668267991782878894 + -88711912. +48668267991871590806 = 48668267991782878894 - -88711912. +-4317455107279459475551185328 = 48668267991782878894 * -88711912. +-48668267991782878894 = -(48668267991782878894). +48668267991782878894 = +(48668267991782878894). +-548610292513 = 48668267991782878894 div -88711912. +75364038 = 48668267991782878894 rem -88711912. +48668267991765502984 = 48668267991782878894 band -88711912. +-71336002 = 48668267991782878894 bor -88711912. +-48668267991836838986 = 48668267991782878894 bxor -88711912. +-48668267991782878895 = bnot(48668267991782878894). +6083533498972859861 = 48668267991782878894 bsl -3. +389346143934263031152 = 48668267991782878894 bsr -3. +25782325836398723569174 = 56476212692 + 25782325836342247356482. +-25782325836285771143790 = 56476212692 - 25782325836342247356482. +1456088117627711545009952176869544 = 56476212692 * 25782325836342247356482. +-56476212692 = -(56476212692). +56476212692 = +(56476212692). +0 = 56476212692 div 25782325836342247356482. +56476212692 = 56476212692 rem 25782325836342247356482. +38690920512 = 56476212692 band 25782325836342247356482. +25782325836360032648662 = 56476212692 bor 25782325836342247356482. +25782325836321341728150 = 56476212692 bxor 25782325836342247356482. +-56476212693 = bnot(56476212692). +3529763293 = 56476212692 bsl -4. +903619403072 = 56476212692 bsr -4. +544126888057471 = 59572428437918 + 484554459619553. +-424982031181635 = 59572428437918 - 484554459619553. +28866085869959848332359410654 = 59572428437918 * 484554459619553. +-59572428437918 = -(59572428437918). +59572428437918 = +(59572428437918). +0 = 59572428437918 div 484554459619553. +59572428437918 = 59572428437918 rem 484554459619553. +52922593321088 = 59572428437918 band 484554459619553. +491204294736383 = 59572428437918 bor 484554459619553. +438281701415295 = 59572428437918 bxor 484554459619553. +-59572428437919 = bnot(59572428437918). +920879540142378034005739088998035113353252370667466073858283381752546665759251813181966234183165163005062487859289803948100779213626721216453025126753265034957176202865336813677264764928 = 59572428437918 bsl 572. +0 = 59572428437918 bsr 572. +-41927729416296284512550 = -41927729416296284513545 + 995. +-41927729416296284514540 = -41927729416296284513545 - 995. +-41718090769214803090977275 = -41927729416296284513545 * 995. +41927729416296284513545 = -(-41927729416296284513545). +-41927729416296284513545 = +(-41927729416296284513545). +-42138421523915863832 = -41927729416296284513545 div 995. +-705 = -41927729416296284513545 rem 995. +739 = -41927729416296284513545 band 995. +-41927729416296284513289 = -41927729416296284513545 bor 995. +-41927729416296284514028 = -41927729416296284513545 bxor 995. +41927729416296284513544 = bnot(-41927729416296284513545). +-10481932354074071128387 = -41927729416296284513545 bsl -2. +-167710917665185138054180 = -41927729416296284513545 bsr -2. +-369624136911445327 = -3858 + -369624136911441469. +369624136911437611 = -3858 - -369624136911441469. +1426009920204341187402 = -3858 * -369624136911441469. +3858 = -(-3858). +-3858 = +(-3858). +0 = -3858 div -369624136911441469. +-3858 = -3858 rem -369624136911441469. +-369624136911441726 = -3858 band -369624136911441469. +-3601 = -3858 bor -369624136911441469. +369624136911438125 = -3858 bxor -369624136911441469. +3857 = bnot(-3858). +-8 = -3858 bsl -9. +-1975296 = -3858 bsr -9. +-31967719691456702 = -36927457 + -31967719654529245. +31967719617601788 = -36927457 - -31967719654529245. +1180486592930683549979965 = -36927457 * -31967719654529245. +36927457 = -(-36927457). +-36927457 = +(-36927457). +0 = -36927457 div -31967719654529245. +-36927457 = -36927457 rem -31967719654529245. +-31967719657832445 = -36927457 band -31967719654529245. +-33624257 = -36927457 bor -31967719654529245. +31967719624208188 = -36927457 bxor -31967719654529245. +36927456 = bnot(-36927457). +-48300888692627902203159381368269173925083523002745591981120571759374314593897558949114155183332909821880923825185557097902569365832709524017917692999614979130075339638477474642603071212430748615690802283865575088373754619400438658556406320794723029719741519942422027023311439600814151120859653113743671296 = -36927457 bsl 987. +-1 = -36927457 bsr 987. +-47994771759541 = -265696 + -47994771493845. +47994771228149 = -265696 - -47994771493845. +12752018806828641120 = -265696 * -47994771493845. +265696 = -(-265696). +-265696 = +(-265696). +0 = -265696 div -47994771493845. +-265696 = -265696 rem -47994771493845. +-47994771496928 = -265696 band -47994771493845. +-262613 = -265696 bor -47994771493845. +47994771234315 = -265696 bxor -47994771493845. +265695 = bnot(-265696). +-4251136 = -265696 bsl 4. +-16606 = -265696 bsr 4. +-9199171888129156 = -9194377219277887 + -4794668851269. +-9189582550426618 = -9194377219277887 - -4794668851269. +44083994060088968983983588603 = -9194377219277887 * -4794668851269. +9194377219277887 = -(-9194377219277887). +-9194377219277887 = +(-9194377219277887). +1917 = -9194377219277887 div -4794668851269. +-2997031395214 = -9194377219277887 rem -4794668851269. +-9199050555303039 = -9194377219277887 band -4794668851269. +-121332826117 = -9194377219277887 bor -4794668851269. +9198929222476922 = -9194377219277887 bxor -4794668851269. +9194377219277886 = bnot(-9194377219277887). +-2913814450185593058043228609701771773244080128 = -9194377219277887 bsl 98. +-1 = -9194377219277887 bsr 98. +39784597364028809470 = 39874589917552972417 + -89992553524162947. +39964582471077135364 = 39874589917552972417 - -89992553524162947. +-3588416167409434062145463651704432899 = 39874589917552972417 * -89992553524162947. +-39874589917552972417 = -(39874589917552972417). +39874589917552972417 = +(39874589917552972417). +-443 = 39874589917552972417 div -89992553524162947. +7888706348786896 = 39874589917552972417 rem -89992553524162947. +39793806323820397057 = 39874589917552972417 band -89992553524162947. +-9208959791587587 = 39874589917552972417 bor -89992553524162947. +-39803015283611984644 = 39874589917552972417 bxor -89992553524162947. +-39874589917552972418 = bnot(39874589917552972417). +44177613724782317629726103087440850907624966483292366382746735726976564189959417102355828270623805771784678778871474506348138709591737092478985716719593842928610997636257349819585597367194459440485450001490045881291799831376541790352579216953353874488253428812593792225588439865380516445525377024 = 39874589917552972417 bsl 917. +0 = 39874589917552972417 bsr 917. +-44416525916238423771346329 = 371862112393 + -44416525916238795633458722. +44416525916239167495571115 = 371862112393 - -44416525916238795633458722. +-16516823152370988325676184911690141746 = 371862112393 * -44416525916238795633458722. +-371862112393 = -(371862112393). +371862112393 = +(371862112393). +0 = 371862112393 div -44416525916238795633458722. +371862112393 = 371862112393 rem -44416525916238795633458722. +354343190664 = 371862112393 band -44416525916238795633458722. +-44416525916238778114536993 = 371862112393 bor -44416525916238795633458722. +-44416525916239132457727657 = 371862112393 bxor -44416525916238795633458722. +-371862112394 = bnot(371862112393). +0 = 371862112393 bsl -72. +1756069175813808117623456454934528 = 371862112393 bsr -72. +-3865686417158761331434189 = -863 + -3865686417158761331433326. +3865686417158761331432463 = -863 - -3865686417158761331433326. +3336087378008011029026960338 = -863 * -3865686417158761331433326. +863 = -(-863). +-863 = +(-863). +0 = -863 div -3865686417158761331433326. +-863 = -863 rem -3865686417158761331433326. +-3865686417158761331433344 = -863 band -3865686417158761331433326. +-845 = -863 bor -3865686417158761331433326. +3865686417158761331432499 = -863 bxor -3865686417158761331433326. +862 = bnot(-863). +-4 = -863 bsl -8. +-220928 = -863 bsr -8. +727539561357448124806725677 = 727539561357448124539998794 + 266726883. +727539561357448124273271911 = 727539561357448124539998794 - 266726883. +194054359460059387092749687147379102 = 727539561357448124539998794 * 266726883. +-727539561357448124539998794 = -(727539561357448124539998794). +727539561357448124539998794 = +(727539561357448124539998794). +2727657419358993238 = 727539561357448124539998794 div 266726883. +150181640 = 727539561357448124539998794 rem 266726883. +213909570 = 727539561357448124539998794 band 266726883. +727539561357448124592816107 = 727539561357448124539998794 bor 266726883. +727539561357448124378906537 = 727539561357448124539998794 bxor 266726883. +-727539561357448124539998795 = bnot(727539561357448124539998794). +0 = 727539561357448124539998794 bsl -793. +37900346059551112482395129926244905271818313722396862075761608118559495567606489509093257379637005489271882584535403108973651072452029113565088475423250923853072711617314417667217591005076220972638849002500670093256802323450051418911175916633384168603386087995342848 = 727539561357448124539998794 bsr -793. +4845615483639054675854643916 = -97549726517766 + 4845615483639152225581161682. +-4845615483639249775307679448 = -97549726517766 - 4845615483639152225581161682. +-472688465239251728979641804071054891442412 = -97549726517766 * 4845615483639152225581161682. +97549726517766 = -(-97549726517766). +-97549726517766 = +(-97549726517766). +0 = -97549726517766 div 4845615483639152225581161682. +-97549726517766 = -97549726517766 rem 4845615483639152225581161682. +4845615483639064090704499922 = -97549726517766 band 4845615483639152225581161682. +-9414849856006 = -97549726517766 bor 4845615483639152225581161682. +-4845615483639073505554355928 = -97549726517766 bxor 4845615483639152225581161682. +97549726517765 = bnot(-97549726517766). +-390198906071064 = -97549726517766 bsl 2. +-24387431629442 = -97549726517766 bsr 2. +6639170004 = 6639178221 + -8217. +6639186438 = 6639178221 - -8217. +-54554127441957 = 6639178221 * -8217. +-6639178221 = -(6639178221). +6639178221 = +(6639178221). +-807980 = 6639178221 div -8217. +6561 = 6639178221 rem -8217. +6639178213 = 6639178221 band -8217. +-8209 = 6639178221 bor -8217. +-6639186422 = 6639178221 bxor -8217. +-6639178222 = bnot(6639178221). +53113425768 = 6639178221 bsl 3. +829897277 = 6639178221 bsr 3. +33481279823977461794349784 = 33481277286797878946675326 + 2537179582847674458. +33481274749618296099000868 = 33481277286797878946675326 - 2537179582847674458. +84948013139725160201646406502066349869023308 = 33481277286797878946675326 * 2537179582847674458. +-33481277286797878946675326 = -(33481277286797878946675326). +33481277286797878946675326 = +(33481277286797878946675326). +13196258 = 33481277286797878946675326 div 2537179582847674458. +919207592098897162 = 33481277286797878946675326 rem 2537179582847674458. +2391556963994576986 = 33481277286797878946675326 band 2537179582847674458. +33481277432420497799772798 = 33481277286797878946675326 bor 2537179582847674458. +33481275040863533805195812 = 33481277286797878946675326 bxor 2537179582847674458. +-33481277286797878946675327 = bnot(33481277286797878946675326). +2470482213481859956052584333671314613562507264 = 33481277286797878946675326 bsl 66. +453755 = 33481277286797878946675326 bsr 66. +2949630 = 2949658 + -28. +2949686 = 2949658 - -28. +-82590424 = 2949658 * -28. +-2949658 = -(2949658). +2949658 = +(2949658). +-105344 = 2949658 div -28. +26 = 2949658 rem -28. +2949632 = 2949658 band -28. +-2 = 2949658 bor -28. +-2949634 = 2949658 bxor -28. +-2949659 = bnot(2949658). +204247949655482574992198843144245417155122976000711607807759657083365083062948847360093802222986870853603096865933994972242869949257164051767014234801443625572032584030766673239601613500109640599284135073096453005744860671238600929503948062015275568879262681196614132524091845902336 = 2949658 bsl 913. +0 = 2949658 bsr 913. +54213750915990011984673215 = 681915667814577758327862 + 53531835248175434226345353. +-52849919580360856468017491 = 681915667814577758327862 - 53531835248175434226345353. +36504197182599504119108093734255607396776614125286 = 681915667814577758327862 * 53531835248175434226345353. +-681915667814577758327862 = -(681915667814577758327862). +681915667814577758327862 = +(681915667814577758327862). +0 = 681915667814577758327862 div 53531835248175434226345353. +681915667814577758327862 = 681915667814577758327862 rem 53531835248175434226345353. +1302260960919421977600 = 681915667814577758327862 band 53531835248175434226345353. +54212448655029092562695615 = 681915667814577758327862 bor 53531835248175434226345353. +54211146394068173140718015 = 681915667814577758327862 bxor 53531835248175434226345353. +-681915667814577758327863 = bnot(681915667814577758327862). +1610127846915616446784725449733263096310398976 = 681915667814577758327862 bsl 71. +288 = 681915667814577758327862 bsr 71. +6851766981 = -52815 + 6851819796. +-6851872611 = -52815 - 6851819796. +-361878862525740 = -52815 * 6851819796. +52815 = -(-52815). +-52815 = +(-52815). +0 = -52815 div 6851819796. +-52815 = -52815 rem 6851819796. +6851801360 = -52815 band 6851819796. +-34379 = -52815 bor 6851819796. +-6851835739 = -52815 bxor 6851819796. +52814 = bnot(-52815). +-1 = -52815 bsl -47. +-7433050447486648320 = -52815 bsr -47. +-66628139849827523346014 = -66628139849827523391548 + 45534. +-66628139849827523437082 = -66628139849827523391548 - 45534. +-3033845719922046450110746632 = -66628139849827523391548 * 45534. +66628139849827523391548 = -(-66628139849827523391548). +-66628139849827523391548 = +(-66628139849827523391548). +-1463261295950883370 = -66628139849827523391548 div 45534. +-21968 = -66628139849827523391548 rem 45534. +33220 = -66628139849827523391548 band 45534. +-66628139849827523379234 = -66628139849827523391548 bor 45534. +-66628139849827523412454 = -66628139849827523391548 bxor 45534. +66628139849827523391547 = bnot(-66628139849827523391548). +-1 = -66628139849827523391548 bsl -837. +-61061020653629541530678333423590394702630673329368349208169542556834451981708470066769456666195053957164684750814833252120673860604316558971076065384053138153960634900506615586342480493979509916032696769423700469570953563285507702655565472021062634858074372881152933841862656 = -66628139849827523391548 bsr -837. +9211374728442040 = 8224434745967512 + 986939982474528. +7237494763492984 = 8224434745967512 - 986939982474528. +8117023484048075436999255534336 = 8224434745967512 * 986939982474528. +-8224434745967512 = -(8224434745967512). +8224434745967512 = +(8224434745967512). +8 = 8224434745967512 div 986939982474528. +328914886171288 = 8224434745967512 rem 986939982474528. +281562201522432 = 8224434745967512 band 986939982474528. +8929812526919608 = 8224434745967512 bor 986939982474528. +8648250325397176 = 8224434745967512 bxor 986939982474528. +-8224434745967513 = bnot(8224434745967512). +1939919231042380565962104015342735378726303987800599269510469133672945844084547228682084943200234731603251107588955360021639289241623954321289129635876931859117892133750335247044575232 = 8224434745967512 bsl 556. +0 = 8224434745967512 bsr 556. +-5483258629748897366 = 8354925 + -5483258629757252291. +5483258629765607216 = 8354925 - -5483258629757252291. +-45812214607224611097383175 = 8354925 * -5483258629757252291. +-8354925 = -(8354925). +8354925 = +(8354925). +0 = 8354925 div -5483258629757252291. +8354925 = 8354925 rem -5483258629757252291. +3755053 = 8354925 band -5483258629757252291. +-5483258629752652419 = 8354925 bor -5483258629757252291. +-5483258629756407472 = 8354925 bxor -5483258629757252291. +-8354926 = bnot(8354925). +0 = 8354925 bsl -26. +560689525555200 = 8354925 bsr -26. +4381739694537252289 = 4381739686354483342 + 8182768947. +4381739678171714395 = 4381739686354483342 - 8182768947. +35854763439338985925146380874 = 4381739686354483342 * 8182768947. +-4381739686354483342 = -(4381739686354483342). +4381739686354483342 = +(4381739686354483342). +535483735 = 4381739686354483342 div 8182768947. +7972906297 = 4381739686354483342 rem 8182768947. +6025322498 = 4381739686354483342 band 8182768947. +4381739688511929791 = 4381739686354483342 bor 8182768947. +4381739682486607293 = 4381739686354483342 bxor 8182768947. +-4381739686354483343 = bnot(4381739686354483342). +0 = 4381739686354483342 bsl -893. +289356139145147333863788455805704466017305954143094341143482572359115241899220389383039670575892056266347435138152573334213173358216552878730871724255074771593291995484866587673770807274116435463555953886907273598495937987036797992684062401606201791030148991671207019891702586048316964864 = 4381739686354483342 bsr -893. +79187393169177576755434820123 = -5365966382688351766 + 79187393174543543138123171889. +-79187393179909509520811523655 = -5365966382688351766 - 79187393174543543138123171889. +-424916889707325692610969117094605702893314705974 = -5365966382688351766 * 79187393174543543138123171889. +5365966382688351766 = -(-5365966382688351766). +-5365966382688351766 = +(-5365966382688351766). +0 = -5365966382688351766 div 79187393174543543138123171889. +-5365966382688351766 = -5365966382688351766 rem 79187393174543543138123171889. +79187393173804384522707683360 = -5365966382688351766 band 79187393174543543138123171889. +-4626807767272863237 = -5365966382688351766 bor 79187393174543543138123171889. +-79187393178431192289980546597 = -5365966382688351766 bxor 79187393174543543138123171889. +5365966382688351765 = bnot(-5365966382688351766). +-2747374787936436104192 = -5365966382688351766 bsl 9. +-10480403091188188 = -5365966382688351766 bsr 9. +-5611968923644672949873679 = -5611968923644672949873582 + -97. +-5611968923644672949873485 = -5611968923644672949873582 - -97. +544360985593533276137737454 = -5611968923644672949873582 * -97. +5611968923644672949873582 = -(-5611968923644672949873582). +-5611968923644672949873582 = +(-5611968923644672949873582). +57855349728295597421377 = -5611968923644672949873582 div -97. +-13 = -5611968923644672949873582 rem -97. +-5611968923644672949873646 = -5611968923644672949873582 band -97. +-33 = -5611968923644672949873582 bor -97. +5611968923644672949873613 = -5611968923644672949873582 bxor -97. +5611968923644672949873581 = bnot(-5611968923644672949873582). +-158647853125905587983965055420542576055990822820929885620968234464499599091920176631475980690522112 = -5611968923644672949873582 bsl 244. +-1 = -5611968923644672949873582 bsr 244. +-73539392680305865807 = -73539393618444719756 + 938138853949. +-73539394556583573705 = -73539393618444719756 - 938138853949. +-68990162449312133579704318916444 = -73539393618444719756 * 938138853949. +73539393618444719756 = -(-73539393618444719756). +-73539393618444719756 = +(-73539393618444719756). +-78388602 = -73539393618444719756 div 938138853949. +-375500430458 = -73539393618444719756 rem 938138853949. +1684561972 = -73539393618444719756 band 938138853949. +-73539392681990427779 = -73539393618444719756 bor 938138853949. +-73539392683674989751 = -73539393618444719756 bxor 938138853949. +73539393618444719755 = bnot(-73539393618444719756). +-11112958963017639143168135532523822495301632 = -73539393618444719756 bsl 77. +-1 = -73539393618444719756 bsr 77. +783890351610663724836834062 = 54536735517382498342324 + 783835814875146342338491738. +-783781278139628959840149414 = 54536735517382498342324 - 783835814875146342338491738. +42747846524897846348628188420967043453483369719112 = 54536735517382498342324 * 783835814875146342338491738. +-54536735517382498342324 = -(54536735517382498342324). +54536735517382498342324 = +(54536735517382498342324). +0 = 54536735517382498342324 div 783835814875146342338491738. +54536735517382498342324 = 54536735517382498342324 rem 783835814875146342338491738. +54309592454742337934608 = 54536735517382498342324 band 783835814875146342338491738. +783836042018208982498899454 = 54536735517382498342324 bor 783835814875146342338491738. +783781732425754240160964846 = 54536735517382498342324 bxor 783835814875146342338491738. +-54536735517382498342325 = bnot(54536735517382498342324). +0 = 54536735517382498342324 bsl -548. +50248923489998030034903198320077145750115194695859954245153889712191233506311786196207510945877569332115110911097771254434310271268639802234354416067215336690923897090580052311182927724544 = 54536735517382498342324 bsr -548. +71759253949874661270359909355 = 71759253949874661271235447583 + -875538228. +71759253949874661272110985811 = 71759253949874661271235447583 - -875538228. +-62827970045875261751517711147606702924 = 71759253949874661271235447583 * -875538228. +-71759253949874661271235447583 = -(71759253949874661271235447583). +71759253949874661271235447583 = +(71759253949874661271235447583). +-81960160795942608768 = 71759253949874661271235447583 div -875538228. +803464479 = 71759253949874661271235447583 rem -875538228. +71759253949874661270429386764 = 71759253949874661271235447583 band -875538228. +-69477409 = 71759253949874661271235447583 bor -875538228. +-71759253949874661270498864173 = 71759253949874661271235447583 bxor -875538228. +-71759253949874661271235447584 = bnot(71759253949874661271235447583). +14952866907201716632509004323935665096218601299062227623271212072714077064817014161146843592699415623073129145583197929812711978595091326214835567719882706352747661494762832039731719901097875516322832472336710965583335005123342937603392785017008665065918059346283986944 = 71759253949874661271235447583 bsl 795. +0 = 71759253949874661271235447583 bsr 795. +9114771611346090 = -39233 + 9114771611385323. +-9114771611424556 = -39233 - 9114771611385323. +-357599834629480377259 = -39233 * 9114771611385323. +39233 = -(-39233). +-39233 = +(-39233). +0 = -39233 div 9114771611385323. +-39233 = -39233 rem 9114771611385323. +9114771611346091 = -39233 band 9114771611385323. +-1 = -39233 bor 9114771611385323. +-9114771611346092 = -39233 bxor 9114771611385323. +39232 = bnot(-39233). +-77 = -39233 bsl -9. +-20087296 = -39233 bsr -9. +-92493277314758890 = -92493277314686391 + -72499. +-92493277314613892 = -92493277314686391 - -72499. +6705670112037448661109 = -92493277314686391 * -72499. +92493277314686391 = -(-92493277314686391). +-92493277314686391 = +(-92493277314686391). +1275786939332 = -92493277314686391 div -72499. +-55723 = -92493277314686391 rem -72499. +-92493277314752439 = -92493277314686391 band -72499. +-6451 = -92493277314686391 bor -72499. +92493277314745988 = -92493277314686391 bxor -72499. +92493277314686390 = bnot(-92493277314686391). +-5919569748139929024 = -92493277314686391 bsl 6. +-1445207458041975 = -92493277314686391 bsr 6. +64821233361388145113497646784 = 562 + 64821233361388145113497646222. +-64821233361388145113497645660 = 562 - 64821233361388145113497646222. +36429533149100137553785677176764 = 562 * 64821233361388145113497646222. +-562 = -(562). +562 = +(562). +0 = 562 div 64821233361388145113497646222. +562 = 562 rem 64821233361388145113497646222. +2 = 562 band 64821233361388145113497646222. +64821233361388145113497646782 = 562 bor 64821233361388145113497646222. +64821233361388145113497646780 = 562 bxor 64821233361388145113497646222. +-563 = bnot(562). +0 = 562 bsl -298. +286203554674995295120716619221517631627731309310064043214377733134290572616748807218767331328 = 562 bsr -298. +-214404149705 = -214397688214 + -6461491. +-214391226723 = -214397688214 - -6461491. +1385328732815567074 = -214397688214 * -6461491. +214397688214 = -(-214397688214). +-214397688214 = +(-214397688214). +33180 = -214397688214 div -6461491. +-5416834 = -214397688214 rem -6461491. +-214404143544 = -214397688214 band -6461491. +-6161 = -214397688214 bor -6461491. +214404137383 = -214397688214 bxor -6461491. +214397688213 = bnot(-214397688214). +-26799711027 = -214397688214 bsl -3. +-1715181505712 = -214397688214 bsr -3. +-7935720450961869732011057 = -222425217168495549558481 + -7713295233793374182452576. +7490870016624878632894095 = -222425217168495549558481 - -7713295233793374182452576. +1715631367461212905019038579907922366374521097056 = -222425217168495549558481 * -7713295233793374182452576. +222425217168495549558481 = -(-222425217168495549558481). +-222425217168495549558481 = +(-222425217168495549558481). +0 = -222425217168495549558481 div -7713295233793374182452576. +-222425217168495549558481 = -222425217168495549558481 rem -7713295233793374182452576. +-7779429221288574896254944 = -222425217168495549558481 band -7713295233793374182452576. +-156291229673294835756113 = -222425217168495549558481 bor -7713295233793374182452576. +7623137991615280060498831 = -222425217168495549558481 bxor -7713295233793374182452576. +222425217168495549558480 = bnot(-222425217168495549558481). +-1 = -222425217168495549558481 bsl -288. +-110617228861385846832181611898216202123399104524737012955318627588625390123827573845641751515474090468820647936 = -222425217168495549558481 bsr -288. +939060 = 936531 + 2529. +934002 = 936531 - 2529. +2368486899 = 936531 * 2529. +-936531 = -(936531). +936531 = +(936531). +370 = 936531 div 2529. +801 = 936531 rem 2529. +2113 = 936531 band 2529. +936947 = 936531 bor 2529. +934834 = 936531 bxor 2529. +-936532 = bnot(936531). +0 = 936531 bsl -69. +552830325571048962703491072 = 936531 bsr -69. +-2852442502912101042364 = -2852942484288572612327 + 499981376471569963. +-2853442465665044182290 = -2852942484288572612327 - 499981376471569963. +-1426418110288820897544258290069856733901 = -2852942484288572612327 * 499981376471569963. +2852942484288572612327 = -(-2852942484288572612327). +-2852942484288572612327 = +(-2852942484288572612327). +-5706 = -2852942484288572612327 div 499981376471569963. +-48750141794403449 = -2852942484288572612327 rem 499981376471569963. +463872967389347849 = -2852942484288572612327 band 499981376471569963. +-2852906375879490390213 = -2852942484288572612327 bor 499981376471569963. +-2853370248846879738062 = -2852942484288572612327 bxor 499981376471569963. +2852942484288572612326 = bnot(-2852942484288572612327). +-730353275977874588755712 = -2852942484288572612327 bsl 8. +-11144306579252236767 = -2852942484288572612327 bsr 8. +-4551914114467152301 = 3681681323 + -4551914118148833624. +4551914121830514947 = 3681681323 - -4551914118148833624. +-16758697192688576087715204552 = 3681681323 * -4551914118148833624. +-3681681323 = -(3681681323). +3681681323 = +(3681681323). +0 = 3681681323 div -4551914118148833624. +3681681323 = 3681681323 rem -4551914118148833624. +52510376 = 3681681323 band -4551914118148833624. +-4551914114519662677 = 3681681323 bor -4551914118148833624. +-4551914114572173053 = 3681681323 bxor -4551914118148833624. +-3681681324 = bnot(3681681323). +7190783 = 3681681323 bsl -9. +1885020837376 = 3681681323 bsr -9. +-89182662169448522409091 = -89182662164652578816278 + -4795943592813. +-89182662159856635223465 = -89182662164652578816278 - -4795943592813. +427715017198571888620065965968210014 = -89182662164652578816278 * -4795943592813. +89182662164652578816278 = -(-89182662164652578816278). +-89182662164652578816278 = +(-89182662164652578816278). +18595436005 = -89182662164652578816278 div -4795943592813. +-908659384213 = -89182662164652578816278 rem -4795943592813. +-89182662169170959917950 = -89182662164652578816278 band -4795943592813. +-277562491141 = -89182662164652578816278 bor -4795943592813. +89182662168893397426809 = -89182662164652578816278 bxor -4795943592813. +89182662164652578816277 = bnot(-89182662164652578816278). +-1393479096322696544005 = -89182662164652578816278 bsl -6. +-5707690378537765044241792 = -89182662164652578816278 bsr -6. +632545389415606345 = 9131421835176 + 632536257993771169. +-632527126571935993 = 9131421835176 - 632536257993771169. +5775955397784841728006978840744 = 9131421835176 * 632536257993771169. +-9131421835176 = -(9131421835176). +9131421835176 = +(9131421835176). +0 = 9131421835176 div 632536257993771169. +9131421835176 = 9131421835176 rem 632536257993771169. +9071256537248 = 9131421835176 band 632536257993771169. +632536318159069097 = 9131421835176 bor 632536257993771169. +632527246902531849 = 9131421835176 bxor 632536257993771169. +-9131421835177 = bnot(9131421835176). +4966446146660946458439123605341255292009634626855273740252574599074841436823948039774841525780525323097117652732871837238747964247145232892143144668276764293363353532420323977978151928168918047260672 = 9131421835176 bsl 617. +0 = 9131421835176 bsr 617. +628467798272410 = 617 + 628467798271793. +-628467798271176 = 617 - 628467798271793. +387764631533696281 = 617 * 628467798271793. +-617 = -(617). +617 = +(617). +0 = 617 div 628467798271793. +617 = 617 rem 628467798271793. +545 = 617 band 628467798271793. +628467798271865 = 617 bor 628467798271793. +628467798271320 = 617 bxor 628467798271793. +-618 = bnot(617). +44459535521401536512 = 617 bsl 56. +0 = 617 bsr 56. +3349939166095985147910546 = 3349938368558747723283131 + 797537237424627415. +3349937571021510298655716 = 3349938368558747723283131 - 797537237424627415. +2671700592003107001257687187823898229636365 = 3349938368558747723283131 * 797537237424627415. +-3349938368558747723283131 = -(3349938368558747723283131). +3349938368558747723283131 = +(3349938368558747723283131). +4200353 = 3349938368558747723283131 div 797537237424627415. +440730501686805636 = 3349938368558747723283131 rem 797537237424627415. +76853680943405715 = 3349938368558747723283131 band 797537237424627415. +3349939089242304204504831 = 3349938368558747723283131 bor 797537237424627415. +3349939012388623261099116 = 3349938368558747723283131 bxor 797537237424627415. +-3349938368558747723283132 = bnot(3349938368558747723283131). +0 = 3349938368558747723283131 bsl -85. +129594463611788089464584360769616723420831434145792 = 3349938368558747723283131 bsr -85. +6386447 = 6779 + 6379668. +-6372889 = 6779 - 6379668. +43247769372 = 6779 * 6379668. +-6779 = -(6779). +6779 = +(6779). +0 = 6779 div 6379668. +6779 = 6779 rem 6379668. +6160 = 6779 band 6379668. +6380287 = 6779 bor 6379668. +6374127 = 6779 bxor 6379668. +-6780 = bnot(6779). +3581308626568674705022511401949066075591266023198867798505445646491822385432037822377074577662428076737997723659290075314143434105868705257021403735000267391861953330829255465579830958328494843898451274884763646191719483796562837027585492576741740274122582039905765890719744 = 6779 bsl 896. +0 = 6779 bsr 896. +-416640072 = -7576 + -416632496. +416624920 = -7576 - -416632496. +3156407789696 = -7576 * -416632496. +7576 = -(-7576). +-7576 = +(-7576). +0 = -7576 div -416632496. +-7576 = -7576 rem -416632496. +-416636864 = -7576 band -416632496. +-3208 = -7576 bor -416632496. +416633656 = -7576 bxor -416632496. +7575 = bnot(-7576). +-18122040996845715967928180977059971505791224602120730723781423931381466355085051103893937433367232236603569150272235755161925780488396639187638504473606485280134063274303615014969202379566754146275033088 = -7576 bsl 659. +-1 = -7576 bsr 659. +95447279398571924885740904 = -541 + 95447279398571924885741445. +-95447279398571924885741986 = -541 - 95447279398571924885741445. +-51636978154627411363186121745 = -541 * 95447279398571924885741445. +541 = -(-541). +-541 = +(-541). +0 = -541 div 95447279398571924885741445. +-541 = -541 rem 95447279398571924885741445. +95447279398571924885740929 = -541 band 95447279398571924885741445. +-25 = -541 bor 95447279398571924885741445. +-95447279398571924885740954 = -541 bxor 95447279398571924885741445. +540 = bnot(-541). +-1 = -541 bsl -76. +-40876804275719648969752576 = -541 bsr -76. +-56166218967 = -99819836458 + 43653617491. +-143473453949 = -99819836458 - 43653617491. +-4357496958751708286878 = -99819836458 * 43653617491. +99819836458 = -(-99819836458). +-99819836458 = +(-99819836458). +-2 = -99819836458 div 43653617491. +-12512601476 = -99819836458 rem 43653617491. +34364195666 = -99819836458 band 43653617491. +-90530414633 = -99819836458 bor 43653617491. +-124894610299 = -99819836458 bxor 43653617491. +99819836457 = bnot(-99819836458). +-1 = -99819836458 bsl -584. +-6320250937891014880117158995322339818026510986708959014357773064574126455177221787777628770828395108621203423478412972882583915910031223087169043632598445656991544468013674755319270473728 = -99819836458 bsr -584. +-39394918556145756519903048269 = -39394918556145756519934536445 + 31488176. +-39394918556145756519966024621 = -39394918556145756519934536445 - 31488176. +-1240474129001583462952846192058574320 = -39394918556145756519934536445 * 31488176. +39394918556145756519934536445 = -(-39394918556145756519934536445). +-39394918556145756519934536445 = +(-39394918556145756519934536445). +-1251101955100408372969 = -39394918556145756519934536445 div 31488176. +-13021901 = -39394918556145756519934536445 rem 31488176. +10506240 = -39394918556145756519934536445 band 31488176. +-39394918556145756519913554509 = -39394918556145756519934536445 bor 31488176. +-39394918556145756519924060749 = -39394918556145756519934536445 bxor 31488176. +39394918556145756519934536444 = bnot(-39394918556145756519934536445). +-1 = -39394918556145756519934536445 bsl -733. +-1780028798475663899313794956801320316158277918977430074417848601707585154174768737231872948239599259481202593635313473975351259309647662557576980403048292705610626819624592707960493930346520749099995844854314387825837143542701975430418076519565885440 = -39394918556145756519934536445 bsr -733. +-942218636829645973571 = 9541594 + -942218636829655515165. +942218636829665056759 = 9541594 - -942218636829655515165. +-8990267691862020085565273010 = 9541594 * -942218636829655515165. +-9541594 = -(9541594). +9541594 = +(9541594). +0 = 9541594 div -942218636829655515165. +9541594 = 9541594 rem -942218636829655515165. +9476034 = 9541594 band -942218636829655515165. +-942218636829655449605 = 9541594 bor -942218636829655515165. +-942218636829664925639 = 9541594 bxor -942218636829655515165. +-9541595 = bnot(9541594). +0 = 9541594 bsl -53. +85943038365841120821248 = 9541594 bsr -53. +359263544344378002 = 22525 + 359263544344355477. +-359263544344332952 = 22525 - 359263544344355477. +8092411336356607119425 = 22525 * 359263544344355477. +-22525 = -(22525). +22525 = +(22525). +0 = 22525 div 359263544344355477. +22525 = 22525 rem 359263544344355477. +661 = 22525 band 359263544344355477. +359263544344377341 = 22525 bor 359263544344355477. +359263544344376680 = 22525 bxor 359263544344355477. +-22526 = bnot(22525). +90100 = 22525 bsl 2. +5631 = 22525 bsr 2. +-3326662191 = -3326662578 + 387. +-3326662965 = -3326662578 - 387. +-1287418417686 = -3326662578 * 387. +3326662578 = -(-3326662578). +-3326662578 = +(-3326662578). +-8596027 = -3326662578 div 387. +-129 = -3326662578 rem 387. +2 = -3326662578 band 387. +-3326662193 = -3326662578 bor 387. +-3326662195 = -3326662578 bxor 387. +3326662577 = bnot(-3326662578). +-446497093041782784 = -3326662578 bsl 27. +-25 = -3326662578 bsr 27. +9122678121848255133767059 = 9122678121848255133774381 + -7322. +9122678121848255133781703 = 9122678121848255133774381 - -7322. +-66796249208172924089496017682 = 9122678121848255133774381 * -7322. +-9122678121848255133774381 = -(9122678121848255133774381). +9122678121848255133774381 = +(9122678121848255133774381). +-1245927085748191086284 = 9122678121848255133774381 div -7322. +2933 = 9122678121848255133774381 rem -7322. +9122678121848255133770276 = 9122678121848255133774381 band -7322. +-3217 = 9122678121848255133774381 bor -7322. +-9122678121848255133773493 = 9122678121848255133774381 bxor -7322. +-9122678121848255133774382 = bnot(9122678121848255133774381). +71270922826939493232612 = 9122678121848255133774381 bsl -7. +1167702799596576657123120768 = 9122678121848255133774381 bsr -7. +-93467851987533385442390274598 = -6998279695768832496435489362 + -86469572291764552945954785236. +79471292595995720449519295874 = -6998279695768832496435489362 - -86469572291764552945954785236. +605138252071271103733214166260700576672786898959272659432 = -6998279695768832496435489362 * -86469572291764552945954785236. +6998279695768832496435489362 = -(-6998279695768832496435489362). +-6998279695768832496435489362 = +(-6998279695768832496435489362). +0 = -6998279695768832496435489362 div -86469572291764552945954785236. +-6998279695768832496435489362 = -6998279695768832496435489362 rem -86469572291764552945954785236. +-86653344739603769203471773652 = -6998279695768832496435489362 band -86469572291764552945954785236. +-6814507247929616238918500946 = -6998279695768832496435489362 bor -86469572291764552945954785236. +79838837491674152964553272706 = -6998279695768832496435489362 bxor -86469572291764552945954785236. +6998279695768832496435489361 = bnot(-6998279695768832496435489362). +-437392480985552031027218086 = -6998279695768832496435489362 bsl -4. +-111972475132301319942967829792 = -6998279695768832496435489362 bsr -4. +-47887784345477057051 = -47887784399154513386 + 53677456335. +-47887784452831969721 = -47887784399154513386 - 53677456335. +-2570494456065510603195188000310 = -47887784399154513386 * 53677456335. +47887784399154513386 = -(-47887784399154513386). +-47887784399154513386 = +(-47887784399154513386). +-892139599 = -47887784399154513386 div 53677456335. +-29107603721 = -47887784399154513386 rem 53677456335. +52334754310 = -47887784399154513386 band 53677456335. +-47887784397811811361 = -47887784399154513386 bor 53677456335. +-47887784450146565671 = -47887784399154513386 bxor 53677456335. +47887784399154513385 = bnot(-47887784399154513386). +-21776844 = -47887784399154513386 bsl -41. +-105306351550601034262356082819072 = -47887784399154513386 bsr -41. +-79316814638770194316947865550 = -46945142255491325454964751682 + -32371672383278868861983113868. +-14573469872212456592981637814 = -46945142255491325454964751682 - -32371672383278868861983113868. +1519692765081186408722971619574264846511184431031750525976 = -46945142255491325454964751682 * -32371672383278868861983113868. +46945142255491325454964751682 = -(-46945142255491325454964751682). +-46945142255491325454964751682 = +(-46945142255491325454964751682). +1 = -46945142255491325454964751682 div -32371672383278868861983113868. +-14573469872212456592981637814 = -46945142255491325454964751682 rem -32371672383278868861983113868. +-79142615909218722686232428492 = -46945142255491325454964751682 band -32371672383278868861983113868. +-174198729551471630715437058 = -46945142255491325454964751682 bor -32371672383278868861983113868. +78968417179667251055516991434 = -46945142255491325454964751682 bxor -32371672383278868861983113868. +46945142255491325454964751681 = bnot(-46945142255491325454964751682). +-1467035695484103920467648491 = -46945142255491325454964751682 bsl -5. +-1502244552175722414558872053824 = -46945142255491325454964751682 bsr -5. +-959256731475517667191147619 = -959256731475517597311251448 + -69879896171. +-959256731475517527431355277 = -959256731475517597311251448 - -69879896171. +67032760796841997328593639956313405608 = -959256731475517597311251448 * -69879896171. +959256731475517597311251448 = -(-959256731475517597311251448). +-959256731475517597311251448 = +(-959256731475517597311251448). +13727220331412097 = -959256731475517597311251448 div -69879896171. +-49137870861 = -959256731475517597311251448 rem -69879896171. +-959256731475517666097871872 = -959256731475517597311251448 band -69879896171. +-1093275747 = -959256731475517597311251448 bor -69879896171. +959256731475517665004596125 = -959256731475517597311251448 bxor -69879896171. +959256731475517597311251447 = bnot(-959256731475517597311251448). +-74218894740472983230499719574570888012122512290742272 = -959256731475517597311251448 bsl 86. +-13 = -959256731475517597311251448 bsr 86. +-7636256537005201989969009000 = -7735619899564627144133283782 + 99363362559425154164274782. +-7834983262124052298297558564 = -7735619899564627144133283782 - 99363362559425154164274782. +-768637204702344044187714998374778579284830200232185524 = -7735619899564627144133283782 * 99363362559425154164274782. +7735619899564627144133283782 = -(-7735619899564627144133283782). +-7735619899564627144133283782 = +(-7735619899564627144133283782). +-77 = -7735619899564627144133283782 div 99363362559425154164274782. +-84640982488890273484125568 = -7735619899564627144133283782 rem 99363362559425154164274782. +226685510059814126366746 = -7735619899564627144133283782 band 99363362559425154164274782. +-7636483222515261804095375746 = -7735619899564627144133283782 bor 99363362559425154164274782. +-7636709908025321618221742492 = -7735619899564627144133283782 bxor 99363362559425154164274782. +7735619899564627144133283781 = bnot(-7735619899564627144133283782). +-1 = -7735619899564627144133283782 bsl -952. +-294476738258171150599617898367824151666477449653244545539179271066059551908021445021373336676213218319522988394235273605055872991465124045264656669368839068869654064706291126766925685578764235202272405610013145652686307873063005905912788538570286021969964306150351272383224523163385128550321369284951279666695503872 = -7735619899564627144133283782 bsr -952. +5189354565971672 = 4398231646349891 + 791122919621781. +3607108726728110 = 4398231646349891 - 791122919621781. +3479541861233238334550910575871 = 4398231646349891 * 791122919621781. +-4398231646349891 = -(4398231646349891). +4398231646349891 = +(4398231646349891). +5 = 4398231646349891 div 791122919621781. +442617048240986 = 4398231646349891 rem 791122919621781. +703691879940097 = 4398231646349891 band 791122919621781. +4485662686031575 = 4398231646349891 bor 791122919621781. +3781970806091478 = 4398231646349891 bxor 791122919621781. +-4398231646349892 = bnot(4398231646349891). +0 = 4398231646349891 bsl -57. +633851980914895752036374598909952 = 4398231646349891 bsr -57. +-66462493333953656144175 = -66462493333953656144148 + -27. +-66462493333953656144121 = -66462493333953656144148 - -27. +1794487320016748715891996 = -66462493333953656144148 * -27. +66462493333953656144148 = -(-66462493333953656144148). +-66462493333953656144148 = +(-66462493333953656144148). +2461573827183468746079 = -66462493333953656144148 div -27. +-15 = -66462493333953656144148 rem -27. +-66462493333953656144156 = -66462493333953656144148 band -27. +-19 = -66462493333953656144148 bor -27. +66462493333953656144137 = -66462493333953656144148 bxor -27. +66462493333953656144147 = bnot(-66462493333953656144148). +-531699946671629249153184 = -66462493333953656144148 bsl 3. +-8307811666744207018019 = -66462493333953656144148 bsr 3. +-95484272407718148579925639801 = -5163374558913331895812 + -95484267244343589666593743989. +95484262080969030753261848177 = -5163374558913331895812 - -95484267244343589666593743989. +493021036265925287117377824018467509063892349274068 = -5163374558913331895812 * -95484267244343589666593743989. +5163374558913331895812 = -(-5163374558913331895812). +-5163374558913331895812 = +(-5163374558913331895812). +0 = -5163374558913331895812 div -95484267244343589666593743989. +-5163374558913331895812 = -5163374558913331895812 rem -95484267244343589666593743989. +-95484272054337006900938718840 = -5163374558913331895812 band -95484267244343589666593743989. +-353381141678986920961 = -5163374558913331895812 bor -95484267244343589666593743989. +95484271700955865221951797879 = -5163374558913331895812 bxor -95484267244343589666593743989. +5163374558913331895811 = bnot(-5163374558913331895812). +-80677727483020810873 = -5163374558913331895812 bsl -6. +-330455971770453241331968 = -5163374558913331895812 bsr -6. +-728291976857434384373484660277 = -6136 + -728291976857434384373484654141. +728291976857434384373484648005 = -6136 - -728291976857434384373484654141. +4468799569997217382515701837809176 = -6136 * -728291976857434384373484654141. +6136 = -(-6136). +-6136 = +(-6136). +0 = -6136 div -728291976857434384373484654141. +-6136 = -6136 rem -728291976857434384373484654141. +-728291976857434384373484658688 = -6136 band -728291976857434384373484654141. +-1589 = -6136 bor -728291976857434384373484654141. +728291976857434384373484657099 = -6136 bxor -728291976857434384373484654141. +6135 = bnot(-6136). +-196352 = -6136 bsl 5. +-192 = -6136 bsr 5. +-255897171117657553338 = 7 + -255897171117657553345. +255897171117657553352 = 7 - -255897171117657553345. +-1791280197823602873415 = 7 * -255897171117657553345. +-7 = -(7). +7 = +(7). +0 = 7 div -255897171117657553345. +7 = 7 rem -255897171117657553345. +7 = 7 band -255897171117657553345. +-255897171117657553345 = 7 bor -255897171117657553345. +-255897171117657553352 = 7 bxor -255897171117657553345. +-8 = bnot(7). +3584 = 7 bsl 9. +0 = 7 bsr 9. +327659896220292618768682756 = 61713382968829984 + 327659896158579235799852772. +-327659896096865852831022788 = 61713382968829984 - 327659896158579235799852772. +20221000655161464908942372144898492299115648 = 61713382968829984 * 327659896158579235799852772. +-61713382968829984 = -(61713382968829984). +61713382968829984 = +(61713382968829984). +0 = 61713382968829984 div 327659896158579235799852772. +61713382968829984 = 61713382968829984 rem 327659896158579235799852772. +52399225577504 = 61713382968829984 band 327659896158579235799852772. +327659896220240219543105252 = 61713382968829984 bor 327659896158579235799852772. +327659896220187820317527748 = 61713382968829984 bxor 327659896158579235799852772. +-61713382968829985 = bnot(61713382968829984). +2673606666864789640199890437071214500263506125978353728418541999859694514267787931734957644905255199855096668552593175655049499727010700453740544 = 61713382968829984 bsl 424. +0 = 61713382968829984 bsr 424. +-41468119058294390 = -535695115 + -41468118522599275. +41468117986904160 = -535695115 - -41468118522599275. +22214268520797448720041625 = -535695115 * -41468118522599275. +535695115 = -(-535695115). +-535695115 = +(-535695115). +0 = -535695115 div -41468118522599275. +-535695115 = -535695115 rem -41468118522599275. +-41468118621429611 = -535695115 band -41468118522599275. +-436864779 = -535695115 bor -41468118522599275. +41468118184564832 = -535695115 bxor -41468118522599275. +535695114 = bnot(-535695115). +-555718804966498486056123639866735224318786187703107235755854288182306793058727785492506975888007348999538127502749434140163481607696271161478154955312821425111515949552269758866058180034560 = -535695115 bsl 598. +-1 = -535695115 bsr 598. +-7687388271331556624628222776 = 567539817 + -7687388271331556625195762593. +7687388271331556625763302410 = 567539817 - -7687388271331556625195762593. +-4362898932719457993388740691206665481 = 567539817 * -7687388271331556625195762593. +-567539817 = -(567539817). +567539817 = +(567539817). +0 = 567539817 div -7687388271331556625195762593. +567539817 = 567539817 rem -7687388271331556625195762593. +29587529 = 567539817 band -7687388271331556625195762593. +-7687388271331556624657810305 = 567539817 bor -7687388271331556625195762593. +-7687388271331556624687397834 = 567539817 bxor -7687388271331556625195762593. +-567539818 = bnot(567539817). +0 = 567539817 bsl -895. +149914090761418128044033419526669597570583809234739872029132135692094377387859729432730742794061566488239060704529433522179169649225275380409858787494111834380321602201016086825595741332105663784597330220645777832121347009089521887862272784249805703749598764308570959644779872256 = 567539817 bsr -895. +-271876793993788 = 47 + -271876793993835. +271876793993882 = 47 - -271876793993835. +-12778209317710245 = 47 * -271876793993835. +-47 = -(47). +47 = +(47). +0 = 47 div -271876793993835. +47 = 47 rem -271876793993835. +5 = 47 band -271876793993835. +-271876793993793 = 47 bor -271876793993835. +-271876793993798 = 47 bxor -271876793993835. +-48 = bnot(47). +0 = 47 bsl -7. +6016 = 47 bsr -7. +2957935961678274511090515 = -628899 + 2957935961678274511719414. +-2957935961678274512348313 = -628899 - 2957935961678274511719414. +-1860242968363505162145827745186 = -628899 * 2957935961678274511719414. +628899 = -(-628899). +-628899 = +(-628899). +0 = -628899 div 2957935961678274511719414. +-628899 = -628899 rem 2957935961678274511719414. +2957935961678274511651668 = -628899 band 2957935961678274511719414. +-561153 = -628899 bor 2957935961678274511719414. +-2957935961678274512212821 = -628899 bxor 2957935961678274511719414. +628898 = bnot(-628899). +-1 = -628899 bsl -262. +-4660577864272570751084055609662644259904872965519147845366453447999523796315271069696 = -628899 bsr -262. +-2134739549478317544367 = 417825184917526139286 + -2552564734395843683653. +2970389919313369822939 = 417825184917526139286 - -2552564734395843683653. +-1066525832162899381985364983898885799291758 = 417825184917526139286 * -2552564734395843683653. +-417825184917526139286 = -(417825184917526139286). +417825184917526139286 = +(417825184917526139286). +0 = 417825184917526139286 div -2552564734395843683653. +417825184917526139286 = 417825184917526139286 rem -2552564734395843683653. +380467502953848819858 = 417825184917526139286 band -2552564734395843683653. +-2515207052432166364225 = 417825184917526139286 bor -2552564734395843683653. +-2895674555386015184083 = 417825184917526139286 bxor -2552564734395843683653. +-417825184917526139287 = bnot(417825184917526139286). +0 = 417825184917526139286 bsl -586. +105821051628775302540019449117422307372788400977033737301827098767360059441259056456375975687517232564538623450082399539570963500720198873199082481060631384759042571813704318479195354072313709461504 = 417825184917526139286 bsr -586. +65348459157074999199412310 = 65348459156717665282542516 + 357333916869794. +65348459156360331365672722 = 65348459156717665282542516 - 357333916869794. +23351220871875678725546248635536441161704 = 65348459156717665282542516 * 357333916869794. +-65348459156717665282542516 = -(65348459156717665282542516). +65348459156717665282542516 = +(65348459156717665282542516). +182877851979 = 65348459156717665282542516 div 357333916869794. +327187134320190 = 65348459156717665282542516 rem 357333916869794. +343617061024 = 65348459156717665282542516 band 357333916869794. +65348459157074655582351286 = 65348459156717665282542516 bor 357333916869794. +65348459157074311965290262 = 65348459156717665282542516 bxor 357333916869794. +-65348459156717665282542517 = bnot(65348459156717665282542516). +963369646005615849436861831463875639304554151636736647798813648922317577483620894478811593879355376037264307609013532944946246538408084699742556180761937401506292607357517926271625814853287936 = 65348459156717665282542516 bsl 552. +0 = 65348459156717665282542516 bsr 552. +82983973517509960 = 82983973517475534 + 34426. +82983973517441108 = 82983973517475534 - 34426. +2856806272312612733484 = 82983973517475534 * 34426. +-82983973517475534 = -(82983973517475534). +82983973517475534 = +(82983973517475534). +2410502919812 = 82983973517475534 div 34426. +27622 = 82983973517475534 rem 34426. +1610 = 82983973517475534 band 34426. +82983973517508350 = 82983973517475534 bor 34426. +82983973517506740 = 82983973517475534 bxor 34426. +-82983973517475535 = bnot(82983973517475534). +104071373546698694201735881906791178166996828921478528184482511645647327574232864181745195351097946190811926743969178466711406403669731970037407822299028809439676023308953516811124116217612698305359897905687757289995370496 = 82983973517475534 bsl 678. +0 = 82983973517475534 bsr 678. +-63745812445273723555466583743 = -63745812445273723555466625664 + 41921. +-63745812445273723555466667585 = -63745812445273723555466625664 - 41921. +-2672288203518319765168716414460544 = -63745812445273723555466625664 * 41921. +63745812445273723555466625664 = -(-63745812445273723555466625664). +-63745812445273723555466625664 = +(-63745812445273723555466625664). +-1520617648559760586709921 = -63745812445273723555466625664 div 41921. +-27423 = -63745812445273723555466625664 rem 41921. +8576 = -63745812445273723555466625664 band 41921. +-63745812445273723555466592319 = -63745812445273723555466625664 bor 41921. +-63745812445273723555466600895 = -63745812445273723555466625664 bxor 41921. +63745812445273723555466625663 = bnot(-63745812445273723555466625664). +-6592 = -63745812445273723555466625664 bsl -83. +-616511668459223720181482832961376249103493771047206912 = -63745812445273723555466625664 bsr -83. +-31346355498113217 = -64 + -31346355498113153. +31346355498113089 = -64 - -31346355498113153. +2006166751879241792 = -64 * -31346355498113153. +64 = -(-64). +-64 = +(-64). +0 = -64 div -31346355498113153. +-64 = -64 rem -31346355498113153. +-31346355498113216 = -64 band -31346355498113153. +-1 = -64 bor -31346355498113153. +31346355498113215 = -64 bxor -31346355498113153. +63 = bnot(-64). +-645562469521727147413979793000752968582426448207305878207664839135161905504210298657411338320034457858975792993186873344 = -64 bsl 392. +-1 = -64 bsr 392. +-6149421864998047819362004 = 345328854531 + -6149421864998393148216535. +6149421864998738477071066 = 345328854531 - -6149421864998393148216535. +-2123572808667780828029214937103870085 = 345328854531 * -6149421864998393148216535. +-345328854531 = -(345328854531). +345328854531 = +(345328854531). +0 = 345328854531 div -6149421864998393148216535. +345328854531 = 345328854531 rem -6149421864998393148216535. +344201372161 = 345328854531 band -6149421864998393148216535. +-6149421864998392020734165 = 345328854531 bor -6149421864998393148216535. +-6149421864998736222106326 = 345328854531 bxor -6149421864998393148216535. +-345328854532 = bnot(345328854531). +1236229985648790720140825348929489781677170882473230453855854197366391334552042905720116564304224528376972518078198688469362639253242806828985118145108745184426782194439105078579460863521995194467044977426616924637733277133789922549224835456258032541070390198272 = 345328854531 bsl 829. +0 = 345328854531 bsr 829. +-45456559819945214994526 = 518218891 + -45456559819945733213417. +45456559819946251432308 = 518218891 - -45456559819945733213417. +-23556448018567437546038824060547 = 518218891 * -45456559819945733213417. +-518218891 = -(518218891). +518218891 = +(518218891). +0 = 518218891 div -45456559819945733213417. +518218891 = 518218891 rem -45456559819945733213417. +136323075 = 518218891 band -45456559819945733213417. +-45456559819945351317601 = 518218891 bor -45456559819945733213417. +-45456559819945487640676 = 518218891 bxor -45456559819945733213417. +-518218892 = bnot(518218891). +2024292 = 518218891 bsl -8. +132664036096 = 518218891 bsr -8. +981107618657309 = -833879618242 + 981941498275551. +-982775377893793 = -833879618242 - 981941498275551. +-818821001717993969202201342 = -833879618242 * 981941498275551. +833879618242 = -(-833879618242). +-833879618242 = +(-833879618242). +0 = -833879618242 div 981941498275551. +-833879618242 = -833879618242 rem 981941498275551. +981932873663518 = -833879618242 band 981941498275551. +-825255006209 = -833879618242 bor 981941498275551. +-982758128669727 = -833879618242 bxor 981941498275551. +833879618241 = bnot(-833879618242). +-928839414178366905934203589000236592058142035897290206229403095403923419980586576125314662445572910144126809670971212444331872797646975882602165499109003875192023740319959678259052811936697283459940352 = -833879618242 bsl 628. +-1 = -833879618242 bsr 628. +91739893931159218326346947398 = 941 + 91739893931159218326346946457. +-91739893931159218326346945516 = 941 - 91739893931159218326346946457. +86327240189220824445092476616037 = 941 * 91739893931159218326346946457. +-941 = -(941). +941 = +(941). +0 = 941 div 91739893931159218326346946457. +941 = 941 rem 91739893931159218326346946457. +905 = 941 band 91739893931159218326346946457. +91739893931159218326346946493 = 941 bor 91739893931159218326346946457. +91739893931159218326346945588 = 941 bxor 91739893931159218326346946457. +-942 = bnot(941). +252597764096 = 941 bsl 28. +0 = 941 bsr 28. +-9456264219673416 = -9456264219274591 + -398825. +-9456264218875766 = -9456264219274591 - -398825. +3771394577252188755575 = -9456264219274591 * -398825. +9456264219274591 = -(-9456264219274591). +-9456264219274591 = +(-9456264219274591). +23710309582 = -9456264219274591 div -398825. +-233441 = -9456264219274591 rem -398825. +-9456264219672063 = -9456264219274591 band -398825. +-1353 = -9456264219274591 bor -398825. +9456264219670710 = -9456264219274591 bxor -398825. +9456264219274590 = bnot(-9456264219274591). +-634599149439364706074624 = -9456264219274591 bsl 26. +-140909318 = -9456264219274591 bsr 26. +6865215386180237197481 = 353463884 + 6865215386179883733597. +-6865215386179530269713 = 353463884 - 6865215386179883733597. +2426605694895701627145616910748 = 353463884 * 6865215386179883733597. +-353463884 = -(353463884). +353463884 = +(353463884). +0 = 353463884 div 6865215386179883733597. +353463884 = 353463884 rem 6865215386179883733597. +335610444 = 353463884 band 6865215386179883733597. +6865215386179901587037 = 353463884 bor 6865215386179883733597. +6865215386179565976593 = 353463884 bxor 6865215386179883733597. +-353463885 = bnot(353463884). +178082501288577240848078587402645659914638037742368543155041634761774079512727259778196069624589135450143236703554934037709754321498623217036440075322058651839594907283944119630839112845539422125720019636017744203172611037538391169810880104228736423635165207073176078516224 = 353463884 bsl 876. +0 = 353463884 bsr 876. +3734635776523991788537932207 = 84552 + 3734635776523991788537847655. +-3734635776523991788537763103 = 84552 - 3734635776523991788537847655. +315770924176656553704452094925560 = 84552 * 3734635776523991788537847655. +-84552 = -(84552). +84552 = +(84552). +0 = 84552 div 3734635776523991788537847655. +84552 = 84552 rem 3734635776523991788537847655. +68160 = 84552 band 3734635776523991788537847655. +3734635776523991788537864047 = 84552 bor 3734635776523991788537847655. +3734635776523991788537795887 = 84552 bxor 3734635776523991788537847655. +-84553 = bnot(84552). +660 = 84552 bsl -7. +10822656 = 84552 bsr -7. +2782778678603311 = -39836525 + 2782778718439836. +-2782778758276361 = -39836525 - 2782778718439836. +-110856233986596487809900 = -39836525 * 2782778718439836. +39836525 = -(-39836525). +-39836525 = +(-39836525). +0 = -39836525 div 2782778718439836. +-39836525 = -39836525 rem 2782778718439836. +2782778718421136 = -39836525 band 2782778718439836. +-39817825 = -39836525 bor 2782778718439836. +-2782778758238961 = -39836525 bxor 2782778718439836. +39836524 = bnot(-39836525). +-1 = -39836525 bsl -46. +-2803246236652116377600 = -39836525 bsr -46. +7561228265255773898606129 = 64399986374386 + 7561228265191373912231743. +-7561228265126973925857357 = 64399986374386 - 7561228265191373912231743. +486942997251946772560427191460391334798 = 64399986374386 * 7561228265191373912231743. +-64399986374386 = -(64399986374386). +64399986374386 = +(64399986374386). +0 = 64399986374386 div 7561228265191373912231743. +64399986374386 = 64399986374386 rem 7561228265191373912231743. +2207613781554 = 64399986374386 band 7561228265191373912231743. +7561228265253566284824575 = 64399986374386 bor 7561228265191373912231743. +7561228265251358671043021 = 64399986374386 bxor 7561228265191373912231743. +-64399986374387 = bnot(64399986374386). +155709612621651092297023693430164815872 = 64399986374386 bsl 81. +0 = 64399986374386 bsr 81. +-293768271718296280472 = -293768271719154417444 + 858136972. +-293768271720012554416 = -293768271719154417444 - 858136972. +-252093415162748406185818139568 = -293768271719154417444 * 858136972. +293768271719154417444 = -(-293768271719154417444). +-293768271719154417444 = +(-293768271719154417444). +-342332612746 = -293768271719154417444 div 858136972. +-453372332 = -293768271719154417444 rem 858136972. +50725004 = -293768271719154417444 band 858136972. +-293768271718347005476 = -293768271719154417444 bor 858136972. +-293768271718397730480 = -293768271719154417444 bxor 858136972. +293768271719154417443 = bnot(-293768271719154417444). +-75204677560103530865664 = -293768271719154417444 bsl 8. +-1147532311402946944 = -293768271719154417444 bsr 8. +7334628981256154244320 = 6 + 7334628981256154244314. +-7334628981256154244308 = 6 - 7334628981256154244314. +44007773887536925465884 = 6 * 7334628981256154244314. +-6 = -(6). +6 = +(6). +0 = 6 div 7334628981256154244314. +6 = 6 rem 7334628981256154244314. +2 = 6 band 7334628981256154244314. +7334628981256154244318 = 6 bor 7334628981256154244314. +7334628981256154244316 = 6 bxor 7334628981256154244314. +-7 = bnot(6). +48 = 6 bsl 3. +0 = 6 bsr 3. +-484689735605708013667484 = -484689729221194738721122 + -6384513274946362. +-484689722836681463774760 = -484689729221194738721122 - -6384513274946362. +3094508010442875433029193488499026458164 = -484689729221194738721122 * -6384513274946362. +484689729221194738721122 = -(-484689729221194738721122). +-484689729221194738721122 = +(-484689729221194738721122). +75916472 = -484689729221194738721122 div -6384513274946362. +-5950100946446258 = -484689729221194738721122 rem -6384513274946362. +-484689729226143887483770 = -484689729221194738721122 band -6384513274946362. +-6379564126183714 = -484689729221194738721122 bor -6384513274946362. +484689722846579761300056 = -484689729221194738721122 bxor -6384513274946362. +484689729221194738721121 = bnot(-484689729221194738721122). +-3407152045104124367017271929002010304822004118541879927081529418883046659294496161374843964190705909987297679873244728454802455339323150218637293463093441609411771424703629741634093056 = -484689729221194738721122 bsl 531. +-1 = -484689729221194738721122 bsr 531. +97275658985222212 = -9831226364 + 97275668816448576. +-97275678647674940 = -9831226364 - 97275668816448576. +-956339119844001917221457664 = -9831226364 * 97275668816448576. +9831226364 = -(-9831226364). +-9831226364 = +(-9831226364). +0 = -9831226364 div 97275668816448576. +-9831226364 = -9831226364 rem 97275668816448576. +97275668798325760 = -9831226364 band 97275668816448576. +-9813103548 = -9831226364 bor 97275668816448576. +-97275678611429308 = -9831226364 bxor 97275668816448576. +9831226363 = bnot(-9831226364). +-218069947164034966789202107619672282027864460589294264974753653179697026601398604901956177657410076397815275462605092654470227515792045375488 = -9831226364 bsl 433. +-1 = -9831226364 bsr 433. +811334966792538 = 811334971748727 + -4956189. +811334976704916 = 811334971748727 - -4956189. +-4021129462296351521403 = 811334971748727 * -4956189. +-811334971748727 = -(811334971748727). +811334971748727 = +(811334971748727). +-163701378 = 811334971748727 div -4956189. +2820285 = 811334971748727 rem -4956189. +811334966989155 = 811334971748727 band -4956189. +-196617 = 811334971748727 bor -4956189. +-811334967185772 = 811334971748727 bxor -4956189. +-811334971748728 = bnot(811334971748727). +0 = 811334971748727 bsl -584. +51370957898696338924979062684267574889692713921960031697929223518883541308686122246026955424429435685879870308869332170294114526221878140437663970272288492929969523669597608930525213183967232 = 811334971748727 bsr -584. +9386646838474838885886405 = 9386646838474838878344919 + 7541486. +9386646838474838870803433 = 9386646838474838878344919 - 7541486. +70789265719302258753293909809634 = 9386646838474838878344919 * 7541486. +-9386646838474838878344919 = -(9386646838474838878344919). +9386646838474838878344919 = +(9386646838474838878344919). +1244668071846163856 = 9386646838474838878344919 div 7541486. +4614903 = 9386646838474838878344919 rem 7541486. +135878 = 9386646838474838878344919 band 7541486. +9386646838474838885750527 = 9386646838474838878344919 bor 7541486. +9386646838474838885614649 = 9386646838474838878344919 bxor 7541486. +-9386646838474838878344920 = bnot(9386646838474838878344919). +73333178425584678737069 = 9386646838474838878344919 bsl -7. +1201490795324779376428149632 = 9386646838474838878344919 bsr -7. +-37668595329896688694811341665 = 968955878746223172532899 + -37669564285775434917983874564. +37670533241654181141156407463 = 968955878746223172532899 - -37669564285775434917983874564. +-36500145764510881221050255830505417406356885779281036 = 968955878746223172532899 * -37669564285775434917983874564. +-968955878746223172532899 = -(968955878746223172532899). +968955878746223172532899 = +(968955878746223172532899). +0 = 968955878746223172532899 div -37669564285775434917983874564. +968955878746223172532899 = 968955878746223172532899 rem -37669564285775434917983874564. +326658692321257898512544 = 968955878746223172532899 band -37669564285775434917983874564. +-37668921988589009952709854209 = 968955878746223172532899 bor -37669564285775434917983874564. +-37669248647281331210608366753 = 968955878746223172532899 bxor -37669564285775434917983874564. +-968955878746223172532900 = bnot(968955878746223172532899). +15058883548636265840324379812208556560337747233343885124606900333031925746470989114966905517118570701931937792 = 968955878746223172532899 bsl 283. +0 = 968955878746223172532899 bsr 283. +627532199385515150887717802077 = 5458823246133 + 627532199385515145428894555944. +-627532199385515139970071309811 = 5458823246133 - 627532199385515145428894555944. +3425587357702618774070593756411997650164552 = 5458823246133 * 627532199385515145428894555944. +-5458823246133 = -(5458823246133). +5458823246133 = +(5458823246133). +0 = 5458823246133 div 627532199385515145428894555944. +5458823246133 = 5458823246133 rem 627532199385515145428894555944. +4425430077728 = 5458823246133 band 627532199385515145428894555944. +627532199385515146462287724349 = 5458823246133 bor 627532199385515145428894555944. +627532199385515142036857646621 = 5458823246133 bxor 627532199385515145428894555944. +-5458823246134 = bnot(5458823246133). +2794917502020096 = 5458823246133 bsl 9. +10661764152 = 5458823246133 bsr 9. +-31585827561050681201 = -2338687527 + -31585827558711993674. +31585827556373306147 = -2338687527 - -31585827558711993674. +73869380941532599790686704198 = -2338687527 * -31585827558711993674. +2338687527 = -(-2338687527). +-2338687527 = +(-2338687527). +0 = -2338687527 div -31585827558711993674. +-2338687527 = -2338687527 rem -31585827558711993674. +-31585827558881865584 = -2338687527 band -31585827558711993674. +-2168815617 = -2338687527 bor -31585827558711993674. +31585827556713049967 = -2338687527 bxor -31585827558711993674. +2338687526 = bnot(-2338687527). +-1 = -2338687527 bsl -533. +-65759709852165087769940772575489996288042718555253349062666077449644046015414156042793337269979323586161617517094356159490764375295512553139276209064246923605092528553984 = -2338687527 bsr -533. +5812121546762844266932235 = 5812121546762844267224589 + -292354. +5812121546762844267516943 = 5812121546762844267224589 - -292354. +-1699196982682304572900177492506 = 5812121546762844267224589 * -292354. +-5812121546762844267224589 = -(5812121546762844267224589). +5812121546762844267224589 = +(5812121546762844267224589). +-19880424234875679030 = 5812121546762844267224589 div -292354. +87969 = 5812121546762844267224589 rem -292354. +5812121546762844267218956 = 5812121546762844267224589 band -292354. +-286721 = 5812121546762844267224589 bor -292354. +-5812121546762844267505677 = 5812121546762844267224589 bxor -292354. +-5812121546762844267224590 = bnot(5812121546762844267224589). +615 = 5812121546762844267224589 bsl -73. +54893935973594670110177900039258388459461541888 = 5812121546762844267224589 bsr -73. +3331753125934228494 = -7443 + 3331753125934235937. +-3331753125934243380 = -7443 - 3331753125934235937. +-24798238516328518079091 = -7443 * 3331753125934235937. +7443 = -(-7443). +-7443 = +(-7443). +0 = -7443 div 3331753125934235937. +-7443 = -7443 rem 3331753125934235937. +3331753125934235681 = -7443 band 3331753125934235937. +-7187 = -7443 bor 3331753125934235937. +-3331753125934242868 = -7443 bxor 3331753125934235937. +7442 = bnot(-7443). +-1 = -7443 bsl -798. +-12407507855981188840494084219584580446037109048249326109457336723239932290269158877083504967771744646499906831136730902159687587677902608573286114774374592008271564466080702589660172920510407946514421653774850994637431059410734325347533184827392 = -7443 bsr -798. +26635721247961419918017306131 = 28479837341185584372 + 26635721219481582576831721759. +-26635721191001745235646137387 = 28479837341185584372 - 26635721219481582576831721759. +758581007796000805728711634493377859651322750348 = 28479837341185584372 * 26635721219481582576831721759. +-28479837341185584372 = -(28479837341185584372). +28479837341185584372 = +(28479837341185584372). +0 = 28479837341185584372 div 26635721219481582576831721759. +28479837341185584372 = 28479837341185584372 rem 26635721219481582576831721759. +9804530054297034772 = 28479837341185584372 band 26635721219481582576831721759. +26635721238156889863720271359 = 28479837341185584372 bor 26635721219481582576831721759. +26635721228352359809423236587 = 28479837341185584372 bxor 26635721219481582576831721759. +-28479837341185584373 = bnot(28479837341185584372). +8208754229589487061188871904735264768 = 28479837341185584372 bsl 58. +98 = 28479837341185584372 bsr 58. +784958823981468756737666093662 = 632875826637545 + 784958823981468123861839456117. +-784958823981467490986012818572 = 632875826637545 - 784958823981468123861839456117. +496781464603706821016997050696933563692112765 = 632875826637545 * 784958823981468123861839456117. +-632875826637545 = -(632875826637545). +632875826637545 = +(632875826637545). +0 = 632875826637545 div 784958823981468123861839456117. +632875826637545 = 632875826637545 rem 784958823981468123861839456117. +67620506509921 = 632875826637545 band 784958823981468123861839456117. +784958823981468689117159583741 = 632875826637545 bor 784958823981468123861839456117. +784958823981468621496653073820 = 632875826637545 bxor 784958823981468123861839456117. +-632875826637546 = bnot(632875826637545). +0 = 632875826637545 bsl -593. +20516625748444697013132472763415875732836671730728516550567464549598887302810888413024109757475171676866082875547269136780171543238563532659989925889572073146078421290869696111709877260926320640 = 632875826637545 bsr -593. +-2914193355372640051694253540 = 515622817551199632229525229 + -3429816172923839683923778769. +3945438990475039316153303998 = 515622817551199632229525229 - -3429816172923839683923778769. +-1768491478765662757411666562480603349534105948500063101 = 515622817551199632229525229 * -3429816172923839683923778769. +-515622817551199632229525229 = -(515622817551199632229525229). +515622817551199632229525229 = +(515622817551199632229525229). +0 = 515622817551199632229525229 div -3429816172923839683923778769. +515622817551199632229525229 = 515622817551199632229525229 rem -3429816172923839683923778769. +206122455245401623684473389 = 515622817551199632229525229 band -3429816172923839683923778769. +-3120315810618041675378726929 = 515622817551199632229525229 bor -3429816172923839683923778769. +-3326438265863443299063200318 = 515622817551199632229525229 bxor -3429816172923839683923778769. +-515622817551199632229525230 = bnot(515622817551199632229525229). +0 = 515622817551199632229525229 bsl -276. +62605275486156137647802923481395651866850404438681977171102591552274731760454431062534142921293166485537030144 = 515622817551199632229525229 bsr -276. +-9913453277908 = -3738727 + -9913449539181. +9913445800454 = -3738727 - -9913449539181. +37063681455273562587 = -3738727 * -9913449539181. +3738727 = -(-3738727). +-3738727 = +(-3738727). +0 = -3738727 div -9913449539181. +-3738727 = -3738727 rem -9913449539181. +-9913451114095 = -3738727 band -9913449539181. +-2163813 = -3738727 bor -9913449539181. +9913448950282 = -3738727 bxor -9913449539181. +3738726 = bnot(-3738727). +-934682 = -3738727 bsl -2. +-14954908 = -3738727 bsr -2. +56395812787692 = 56399367924819 + -3555137127. +56402923061946 = 56399367924819 - -3555137127. +-200507486848856971655013 = 56399367924819 * -3555137127. +-56399367924819 = -(56399367924819). +56399367924819 = +(56399367924819). +-15864 = 56399367924819 div -3555137127. +672542091 = 56399367924819 rem -3555137127. +56397216114705 = 56399367924819 band -3555137127. +-1403327013 = 56399367924819 bor -3555137127. +-56398619441718 = 56399367924819 bxor -3555137127. +-56399367924820 = bnot(56399367924819). +0 = 56399367924819 bsl -729. +159272602282009369804829167225421786302420595178138543748234819107412786245682622256854084210389395589458167604383150065493827422572034432629455384375599948907220540068921691169946166324347611732916449742155274846225999064909299580928 = 56399367924819 bsr -729. +4994279985463060 = 3395489689 + 4994276589973371. +-4994273194483682 = 3395489689 - 4994276589973371. +16958014665268662015071619 = 3395489689 * 4994276589973371. +-3395489689 = -(3395489689). +3395489689 = +(3395489689). +0 = 3395489689 div 4994276589973371. +3395489689 = 3395489689 rem 4994276589973371. +2181173017 = 3395489689 band 4994276589973371. +4994277804290043 = 3395489689 bor 4994276589973371. +4994275623117026 = 3395489689 bxor 4994276589973371. +-3395489690 = bnot(3395489689). +0 = 3395489689 bsl -291. +13509247370636319377028265275489356165531332673832186424934247239333258613907867043126852213276672 = 3395489689 bsr -291. +523243201587728280751 = 523242478127831926822 + 723459896353929. +523241754667935572893 = 523242478127831926822 - 723459896353929. +378544948994334247525429156540183638 = 523242478127831926822 * 723459896353929. +-523242478127831926822 = -(523242478127831926822). +523242478127831926822 = +(523242478127831926822). +723250 = 523242478127831926822 div 723459896353929. +108089852777572 = 523242478127831926822 rem 723459896353929. +723038416994304 = 523242478127831926822 band 723459896353929. +523242478549311286447 = 523242478127831926822 bor 723459896353929. +523241755510894292143 = 523242478127831926822 bxor 723459896353929. +-523242478127831926823 = bnot(523242478127831926822). +0 = 523242478127831926822 bsl -999. +2803294094797220652232266501811179882751129680863999088493038299717880199239545298634531365335411847272580723990775872043912169086424045641711796232129861039764268922701116650361817709508239089301422949197285315743815759829635246059669306007739749073740441686438866628351372490944813670278407068149346034570668047425601536 = 523242478127831926822 bsr -999. +4252353997369259107525 = 4252353997362499368692 + 6759738833. +4252353997355739629859 = 4252353997362499368692 - 6759738833. +28744802447634066560485296816436 = 4252353997362499368692 * 6759738833. +-4252353997362499368692 = -(4252353997362499368692). +4252353997362499368692 = +(4252353997362499368692). +629070752941 = 4252353997362499368692 div 6759738833. +2672710839 = 4252353997362499368692 rem 6759738833. +2172112 = 4252353997362499368692 band 6759738833. +4252353997369256935413 = 4252353997362499368692 bor 6759738833. +4252353997369254763301 = 4252353997362499368692 bxor 6759738833. +-4252353997362499368693 = bnot(4252353997362499368692). +33221515604394526317 = 4252353997362499368692 bsl -7. +544301311662399919192576 = 4252353997362499368692 bsr -7. +54472535782100 = 54472535869625 + -87525. +54472535957150 = 54472535869625 - -87525. +-4767708701988928125 = 54472535869625 * -87525. +-54472535869625 = -(54472535869625). +54472535869625 = +(54472535869625). +-622365448 = 54472535869625 div -87525. +33425 = 54472535869625 rem -87525. +54472535869465 = 54472535869625 band -87525. +-87365 = 54472535869625 bor -87525. +-54472535956830 = 54472535869625 bxor -87525. +-54472535869626 = bnot(54472535869625). +0 = 54472535869625 bsl -377. +16768181217720974853415558020309662149305308050341966976476256634902959995822887523210131218903662344688915902893996573196288000 = 54472535869625 bsr -377. +-2579111915618386289526442805 = -2579111915618386289527399793 + 956988. +-2579111915618386289528356781 = -2579111915618386289527399793 - 956988. +-2468179153903808258442247273103484 = -2579111915618386289527399793 * 956988. +2579111915618386289527399793 = -(-2579111915618386289527399793). +-2579111915618386289527399793 = +(-2579111915618386289527399793). +-2695030570517484325328 = -2579111915618386289527399793 div 956988. +-407729 = -2579111915618386289527399793 rem 956988. +137740 = -2579111915618386289527399793 band 956988. +-2579111915618386289526580545 = -2579111915618386289527399793 bor 956988. +-2579111915618386289526718285 = -2579111915618386289527399793 bxor 956988. +2579111915618386289527399792 = bnot(-2579111915618386289527399793). +-1 = -2579111915618386289527399793 bsl -511. +-17290118597218821021024529513821890190835063660820584345872985981883877694306832228957223603920918937419348656157110128014320605373240673410652865615970155698006925060701575985496064 = -2579111915618386289527399793 bsr -511. +984438258742911654929765 = -63 + 984438258742911654929828. +-984438258742911654929891 = -63 - 984438258742911654929828. +-62019610300803434260579164 = -63 * 984438258742911654929828. +63 = -(-63). +-63 = +(-63). +0 = -63 div 984438258742911654929828. +-63 = -63 rem 984438258742911654929828. +984438258742911654929792 = -63 band 984438258742911654929828. +-27 = -63 bor 984438258742911654929828. +-984438258742911654929819 = -63 bxor 984438258742911654929828. +62 = bnot(-63). +-260019964543335238439042237888598017270995168283403561672355661474066061414638016772564743132206272166910053785743743021637405439442728037865499653462228073009596571030760314864297543856366138955785364634510194292666607675338659293334523473611900765772194770285605421056 = -63 bsl 889. +-1 = -63 bsr 889. +91797984805388653757851517010 = 91798462158182776484622633323 + -477352794122726771116313. +91798939510976899211393749636 = 91798462158182776484622633323 - -477352794122726771116313. +-43820252407377947171728929967148734684504702382698099 = 91798462158182776484622633323 * -477352794122726771116313. +-91798462158182776484622633323 = -(91798462158182776484622633323). +91798462158182776484622633323 = +(91798462158182776484622633323). +-192307 = 91798462158182776484622633323 div -477352794122726771116313. +178378823559311557829232 = 91798462158182776484622633323 rem -477352794122726771116313. +91798008423564741150336221283 = 91798462158182776484622633323 band -477352794122726771116313. +-23618176087392484704273 = 91798462158182776484622633323 bor -477352794122726771116313. +-91798032041740828542820925556 = 91798462158182776484622633323 bxor -477352794122726771116313. +-91798462158182776484622633324 = bnot(91798462158182776484622633323). +5875101578123697695015848532672 = 91798462158182776484622633323 bsl 6. +1434350971221605882572228645 = 91798462158182776484622633323 bsr 6. +-9847688181859085960044534308 = -9854555878181727326733483689 + 6867696322641366688949381. +-9861423574504368693422433070 = -9854555878181727326733483689 - 6867696322641366688949381. +-67678097165852512684070512237042486621497513510146509 = -9854555878181727326733483689 * 6867696322641366688949381. +9854555878181727326733483689 = -(-9854555878181727326733483689). +-9854555878181727326733483689 = +(-9854555878181727326733483689). +-1434 = -9854555878181727326733483689 div 6867696322641366688949381. +-6279351514007494780071335 = -9854555878181727326733483689 rem 6867696322641366688949381. +604647396178036289257477 = -9854555878181727326733483689 band 6867696322641366688949381. +-9848292829255263996333791785 = -9854555878181727326733483689 bor 6867696322641366688949381. +-9848897476651442032623049262 = -9854555878181727326733483689 bxor 6867696322641366688949381. +9854555878181727326733483688 = bnot(-9854555878181727326733483689). +-3049837322744065660367024103424449271192547190672195584 = -9854555878181727326733483689 bsl 88. +-32 = -9854555878181727326733483689 bsr 88. +-986483217873878995 = -37444 + -986483217873841551. +986483217873804107 = -37444 - -986483217873841551. +36937877610068123035644 = -37444 * -986483217873841551. +37444 = -(-37444). +-37444 = +(-37444). +0 = -37444 div -986483217873841551. +-37444 = -37444 rem -986483217873841551. +-986483217873878992 = -37444 band -986483217873841551. +-3 = -37444 bor -986483217873841551. +986483217873878989 = -37444 bxor -986483217873841551. +37443 = bnot(-37444). +-1483309658592056928426329838190592 = -37444 bsl 95. +-1 = -37444 bsr 95. +-349988546208659 = 8353537459 + -349996899746118. +350005253283577 = 8353537459 - -349996899746118. +-2923712212563064302834162 = 8353537459 * -349996899746118. +-8353537459 = -(8353537459). +8353537459 = +(8353537459). +0 = 8353537459 div -349996899746118. +8353537459 = 8353537459 rem -349996899746118. +8338807986 = 8353537459 band -349996899746118. +-349996885016645 = 8353537459 bor -349996899746118. +-350005223824631 = 8353537459 bxor -349996899746118. +-8353537460 = bnot(8353537459). +3983 = 8353537459 bsl -21. +17518637789216768 = 8353537459 bsr -21. +-621886761 = 9885 + -621896646. +621906531 = 9885 - -621896646. +-6147448345710 = 9885 * -621896646. +-9885 = -(9885). +9885 = +(9885). +0 = 9885 div -621896646. +9885 = 9885 rem -621896646. +1048 = 9885 band -621896646. +-621887809 = 9885 bor -621896646. +-621888857 = 9885 bxor -621896646. +-9886 = bnot(9885). +77 = 9885 bsl -7. +1265280 = 9885 bsr -7. +999851860769505 = 999851388881667 + 471887838. +999850916993829 = 999851388881667 - 471887838. +471817710220667078465946 = 999851388881667 * 471887838. +-999851388881667 = -(999851388881667). +999851388881667 = +(999851388881667). +2118832 = 999851388881667 div 471887838. +337316451 = 999851388881667 rem 471887838. +134236930 = 999851388881667 band 471887838. +999851726532575 = 999851388881667 bor 471887838. +999851592295645 = 999851388881667 bxor 471887838. +-999851388881668 = bnot(999851388881667). +127980977776853376 = 999851388881667 bsl 7. +7811338975638 = 999851388881667 bsr 7. +591659823198345342511450469317 = 591659823198345342511446313699 + 4155618. +591659823198345342511442158081 = 591659823198345342511446313699 - 4155618. +2458712211159861475556731507241210982 = 591659823198345342511446313699 * 4155618. +-591659823198345342511446313699 = -(591659823198345342511446313699). +591659823198345342511446313699 = +(591659823198345342511446313699). +142375892875222251542717 = 591659823198345342511446313699 div 4155618. +3779593 = 591659823198345342511446313699 rem 4155618. +1132770 = 591659823198345342511446313699 band 4155618. +591659823198345342511449336547 = 591659823198345342511446313699 bor 4155618. +591659823198345342511448203777 = 591659823198345342511446313699 bxor 4155618. +-591659823198345342511446313700 = bnot(591659823198345342511446313699). +0 = 591659823198345342511446313699 bsl -227. +127608938228185338488286093170817910594843289499086799450886247183853299206472132392911663238479872 = 591659823198345342511446313699 bsr -227. +97342756719869374268 = 97342756789528864195 + -69659489927. +97342756859188354122 = 97342756789528864195 - -69659489927. +-6780846786046596774467353463765 = 97342756789528864195 * -69659489927. +-97342756789528864195 = -(97342756789528864195). +97342756789528864195 = +(97342756789528864195). +-1397408406 = 97342756789528864195 div -69659489927. +7866737833 = 97342756789528864195 rem -69659489927. +97342756789125939521 = 97342756789528864195 band -69659489927. +-69256565253 = 97342756789528864195 bor -69659489927. +-97342756858382504774 = 97342756789528864195 bxor -69659489927. +-97342756789528864196 = bnot(97342756789528864195). +0 = 97342756789528864195 bsl -653. +3638235524365231785090583033971798644167750991518951290046858219409184295614139712285888748466465048994893130074583871738843577903195379854051907486739870268645716009456943061582792921520195791432792560529229417021440 = 97342756789528864195 bsr -653. +389678954744234422040883672 = 389678954839351938193496446 + -95117516152612774. +389678954934469454346109220 = 389678954839351938193496446 - -95117516152612774. +-37065294281265321678205132948334177383201204 = 389678954839351938193496446 * -95117516152612774. +-389678954839351938193496446 = -(389678954839351938193496446). +389678954839351938193496446 = +(389678954839351938193496446). +-4096815924 = 389678954839351938193496446 div -95117516152612774. +14000711464483270 = 389678954839351938193496446 rem -95117516152612774. +389678954821231161930815578 = 389678954839351938193496446 band -95117516152612774. +-76996739889931906 = 389678954839351938193496446 bor -95117516152612774. +-389678954898227901820747484 = 389678954839351938193496446 bxor -95117516152612774. +-389678954839351938193496447 = bnot(389678954839351938193496446). +107114135486366560536017955549582721024 = 389678954839351938193496446 bsl 38. +1417643779275211 = 389678954839351938193496446 bsr 38. +-84775522259114738152919513 = -84775522259114738152919831 + 318. +-84775522259114738152920149 = -84775522259114738152919831 - 318. +-26958616078398486732628506258 = -84775522259114738152919831 * 318. +84775522259114738152919831 = -(-84775522259114738152919831). +-84775522259114738152919831 = +(-84775522259114738152919831). +-266589692638725591675848 = -84775522259114738152919831 div 318. +-167 = -84775522259114738152919831 rem 318. +40 = -84775522259114738152919831 band 318. +-84775522259114738152919553 = -84775522259114738152919831 bor 318. +-84775522259114738152919593 = -84775522259114738152919831 bxor 318. +84775522259114738152919830 = bnot(-84775522259114738152919831). +-331154383824666945909844 = -84775522259114738152919831 bsl -8. +-21702533698333372967147476736 = -84775522259114738152919831 bsr -8. +-54388 = 736 + -55124. +55860 = 736 - -55124. +-40571264 = 736 * -55124. +-736 = -(736). +736 = +(736). +0 = 736 div -55124. +736 = 736 rem -55124. +160 = 736 band -55124. +-54548 = 736 bor -55124. +-54708 = 736 bxor -55124. +-737 = bnot(736). +0 = 736 bsl -388. +463998024968741387203797976219291196168619009649001099961759103128397619581151152160014399417524766586138851213853065216 = 736 bsr -388. +92644319712923691793287 = 8385535252126162 + 92644311327388439667125. +-92644302941853187540963 = 8385535252126162 - 92644311327388439667125. +776872138544766865531637813315783824250 = 8385535252126162 * 92644311327388439667125. +-8385535252126162 = -(8385535252126162). +8385535252126162 = +(8385535252126162). +0 = 8385535252126162 div 92644311327388439667125. +8385535252126162 = 8385535252126162 rem 92644311327388439667125. +6764784243458448 = 8385535252126162 band 92644311327388439667125. +92644312948139448334839 = 8385535252126162 bor 92644311327388439667125. +92644306183355204876391 = 8385535252126162 bxor 92644311327388439667125. +-8385535252126163 = bnot(8385535252126162). +281371872401070158249984 = 8385535252126162 bsl 25. +249908424 = 8385535252126162 bsr 25. +-29189349977685776166969722520 = -29189349977685776166969727281 + 4761. +-29189349977685776166969732042 = -29189349977685776166969727281 - 4761. +-138970495243761980330942871584841 = -29189349977685776166969727281 * 4761. +29189349977685776166969727281 = -(-29189349977685776166969727281). +-29189349977685776166969727281 = +(-29189349977685776166969727281). +-6130928371704636876070096 = -29189349977685776166969727281 div 4761. +-225 = -29189349977685776166969727281 rem 4761. +649 = -29189349977685776166969727281 band 4761. +-29189349977685776166969723169 = -29189349977685776166969727281 bor 4761. +-29189349977685776166969723818 = -29189349977685776166969727281 bxor 4761. +29189349977685776166969727280 = bnot(-29189349977685776166969727281). +-1 = -29189349977685776166969727281 bsl -563. +-881276080166012926281107714324665601604190299552786912735934932557813868523097097100922140056103562533709036837914341738001573003565008318526683760280034928105733555883921301952092024813908339458048 = -29189349977685776166969727281 bsr -563. +-58881726281 = -5 + -58881726276. +58881726271 = -5 - -58881726276. +294408631380 = -5 * -58881726276. +5 = -(-5). +-5 = +(-5). +0 = -5 div -58881726276. +-5 = -5 rem -58881726276. +-58881726280 = -5 band -58881726276. +-1 = -5 bor -58881726276. +58881726279 = -5 bxor -58881726276. +4 = bnot(-5). +-80 = -5 bsl 4. +-1 = -5 bsr 4. +7970339327155153060970032148 = -27584345718728311767683193 + 7997923672873881372737715341. +-8025508018592609684505398534 = -27584345718728311767683193 - 7997923672873881372737715341. +-220617491624554464326103592082184976562231515503963813 = -27584345718728311767683193 * 7997923672873881372737715341. +27584345718728311767683193 = -(-27584345718728311767683193). +-27584345718728311767683193 = +(-27584345718728311767683193). +0 = -27584345718728311767683193 div 7997923672873881372737715341. +-27584345718728311767683193 = -27584345718728311767683193 rem 7997923672873881372737715341. +7970646287930818855716007045 = -27584345718728311767683193 band 7997923672873881372737715341. +-306960775665794745974897 = -27584345718728311767683193 bor 7997923672873881372737715341. +-7970953248706484650461981942 = -27584345718728311767683193 bxor 7997923672873881372737715341. +27584345718728311767683192 = bnot(-27584345718728311767683193). +-53875675231891233921257 = -27584345718728311767683193 bsl -9. +-14123185007988895625053794816 = -27584345718728311767683193 bsr -9. +-58817458847070320482149769860 = -58817458847842812994772557344 + 772492512622787484. +-58817458848615305507395344828 = -58817458847842812994772557344 - 772492512622787484. +-45436046571457497602599660023827514268515482496 = -58817458847842812994772557344 * 772492512622787484. +58817458847842812994772557344 = -(-58817458847842812994772557344). +-58817458847842812994772557344 = +(-58817458847842812994772557344). +-76139843282 = -58817458847842812994772557344 div 772492512622787484. +-225367181021474856 = -58817458847842812994772557344 rem 772492512622787484. +756676585255575936 = -58817458847842812994772557344 band 772492512622787484. +-58817458847826997067405345796 = -58817458847842812994772557344 bor 772492512622787484. +-58817458848583673652660921732 = -58817458847842812994772557344 bxor 772492512622787484. +58817458847842812994772557343 = bnot(-58817458847842812994772557344). +-1 = -58817458847842812994772557344 bsl -213. +-774275172673422732549803392048349440221676987250114196486616281772697653613546737517406978048 = -58817458847842812994772557344 bsr -213. +-59195539 = 91593 + -59287132. +59378725 = 91593 - -59287132. +-5430286281276 = 91593 * -59287132. +-91593 = -(91593). +91593 = +(91593). +0 = 91593 div -59287132. +91593 = 91593 rem -59287132. +82304 = 91593 band -59287132. +-59277843 = 91593 bor -59287132. +-59360147 = 91593 bxor -59287132. +-91594 = bnot(91593). +0 = 91593 bsl -221. +308667799385541068839116989108173629036305871136719831907715371694555136 = 91593 bsr -221. +-5343798581253211314197119350 = -5343798581253211316914762972 + 2717643622. +-5343798581253211319632406594 = -5343798581253211316914762972 - 2717643622. +-14522540131595438502431626308497564584 = -5343798581253211316914762972 * 2717643622. +5343798581253211316914762972 = -(-5343798581253211316914762972). +-5343798581253211316914762972 = +(-5343798581253211316914762972). +-1966335297974257831 = -5343798581253211316914762972 div 2717643622. +-2314059090 = -5343798581253211316914762972 rem 2717643622. +2692465444 = -5343798581253211316914762972 band 2717643622. +-5343798581253211316889584794 = -5343798581253211316914762972 bor 2717643622. +-5343798581253211319582050238 = -5343798581253211316914762972 bxor 2717643622. +5343798581253211316914762971 = bnot(-5343798581253211316914762972). +-607519562123936 = -5343798581253211316914762972 bsl -43. +-47004549412646382184706045100711452082176 = -5343798581253211316914762972 bsr -43. +99984403910220432 = 99984399368494261 + 4541726171. +99984394826768090 = 99984399368494261 - 4541726171. +454101763303606258047004631 = 99984399368494261 * 4541726171. +-99984399368494261 = -(99984399368494261). +99984399368494261 = +(99984399368494261). +22014625 = 99984399368494261 div 4541726171. +861243386 = 99984399368494261 rem 4541726171. +238034065 = 99984399368494261 band 4541726171. +99984403672186367 = 99984399368494261 bor 4541726171. +99984403434152302 = 99984399368494261 bxor 4541726171. +-99984399368494262 = bnot(99984399368494261). +990197530257271489688167149327288051760627712 = 99984399368494261 bsl 93. +0 = 99984399368494261 bsr 93. +79212883456597265552 = 79212883456949412315 + -352146763. +79212883457301559078 = 79212883456949412315 - -352146763. +-27894560497260985401479586345 = 79212883456949412315 * -352146763. +-79212883456949412315 = -(79212883456949412315). +79212883456949412315 = +(79212883456949412315). +-224942812996 = 79212883456949412315 div -352146763. +293680367 = 79212883456949412315 rem -352146763. +79212883456599171217 = 79212883456949412315 band -352146763. +-1905665 = 79212883456949412315 bor -352146763. +-79212883456601076882 = 79212883456949412315 bxor -352146763. +-79212883456949412316 = bnot(79212883456949412315). +37771646240687 = 79212883456949412315 bsl -21. +166121456967508373935226880 = 79212883456949412315 bsr -21. +828850801818857828 = 828856788173989676 + -5986355131848. +828862774529121524 = 828856788173989676 - -5986355131848. +-4961831087452413774035170801248 = 828856788173989676 * -5986355131848. +-828856788173989676 = -(828856788173989676). +828856788173989676 = +(828856788173989676). +-138457 = 828856788173989676 div -5986355131848. +4015683711140 = 828856788173989676 rem -5986355131848. +828856438998172200 = 828856788173989676 band -5986355131848. +-5637179314372 = 828856788173989676 bor -5986355131848. +-828862076177486572 = 828856788173989676 bxor -5986355131848. +-828856788173989677 = bnot(828856788173989676). +207214197043497419 = 828856788173989676 bsl -2. +3315427152695958704 = 828856788173989676 bsr -2. +108892 = 81938 + 26954. +54984 = 81938 - 26954. +2208556852 = 81938 * 26954. +-81938 = -(81938). +81938 = +(81938). +3 = 81938 div 26954. +1076 = 81938 rem 26954. +16386 = 81938 band 26954. +92506 = 81938 bor 26954. +76120 = 81938 bxor 26954. +-81939 = bnot(81938). +1280 = 81938 bsl -6. +5244032 = 81938 bsr -6. +-71218210020096204 = -71453447486777563 + 235237466681359. +-71688684953458922 = -71453447486777563 - 235237466681359. +-16808527972439071951918631548117 = -71453447486777563 * 235237466681359. +71453447486777563 = -(-71453447486777563). +-71453447486777563 = +(-71453447486777563). +-303 = -71453447486777563 div 235237466681359. +-176495082325786 = -71453447486777563 rem 235237466681359. +5988602253317 = -71453447486777563 band 235237466681359. +-71224198622349521 = -71453447486777563 bor 235237466681359. +-71230187224602838 = -71453447486777563 bxor 235237466681359. +71453447486777562 = bnot(-71453447486777563). +-8931680935847196 = -71453447486777563 bsl -3. +-571627579894220504 = -71453447486777563 bsr -3. +5537188928 = -55 + 5537188983. +-5537189038 = -55 - 5537188983. +-304545394065 = -55 * 5537188983. +55 = -(-55). +-55 = +(-55). +0 = -55 div 5537188983. +-55 = -55 rem 5537188983. +5537188929 = -55 band 5537188983. +-1 = -55 bor 5537188983. +-5537188930 = -55 bxor 5537188983. +54 = bnot(-55). +-944892805120 = -55 bsl 34. +-1 = -55 bsr 34. +-64978773561394548434684261 = -552972 + -64978773561394548434131289. +64978773561394548433578317 = -552972 - -64978773561394548434131289. +35931442373791466236718447140908 = -552972 * -64978773561394548434131289. +552972 = -(-552972). +-552972 = +(-552972). +0 = -552972 div -64978773561394548434131289. +-552972 = -552972 rem -64978773561394548434131289. +-64978773561394548434663772 = -552972 band -64978773561394548434131289. +-20489 = -552972 bor -64978773561394548434131289. +64978773561394548434643283 = -552972 bxor -64978773561394548434131289. +552971 = bnot(-552972). +-1 = -552972 bsl -888. +-1141140951059183916429476701347093831796640795206430430992744879655851254861708042942529136026209259783179256047700706874292693338567652448845722812494564936414782818063663435167780487470972195163956703592653739352416185551169596085347445351191428494052238781860093657874432 = -552972 bsr -888. +-7931161752156336473679481555 = -7931161752156336685154151379 + 211474669824. +-7931161752156336896628821203 = -7931161752156336685154151379 - 211474669824. +-1677239812857998620522352805416939287296 = -7931161752156336685154151379 * 211474669824. +7931161752156336685154151379 = -(-7931161752156336685154151379). +-7931161752156336685154151379 = +(-7931161752156336685154151379). +-37504074406438623 = -7931161752156336685154151379 div 211474669824. +-106507939027 = -7931161752156336685154151379 rem 211474669824. +73627222016 = -7931161752156336685154151379 band 211474669824. +-7931161752156336547306703571 = -7931161752156336685154151379 bor 211474669824. +-7931161752156336620933925587 = -7931161752156336685154151379 bxor 211474669824. +7931161752156336685154151378 = bnot(-7931161752156336685154151379). +-12313272113186103921130374203648000551845741068461661724876816962650434751748552394322870652014840162966396119852328739173423034400378461241792451490464791783699965196730140308013088409468006269539623602257087703480757573735187413571225145620726804090846183424 = -7931161752156336685154151379 bsl 768. +-1 = -7931161752156336685154151379 bsr 768. +714957416338999897061 = 714958245882488652896 + -829543488755835. +714959075425977408731 = 714958245882488652896 - -829543488755835. +-593088957604111741020359952209648160 = 714958245882488652896 * -829543488755835. +-714958245882488652896 = -(714958245882488652896). +714958245882488652896 = +(714958245882488652896). +-861869 = 714958245882488652896 div -829543488755835. +428771985897281 = 714958245882488652896 rem -829543488755835. +714957981904603087872 = 714958245882488652896 band -829543488755835. +-565565603190811 = 714958245882488652896 bor -829543488755835. +-714958547470206278683 = 714958245882488652896 bxor -829543488755835. +-714958245882488652897 = bnot(714958245882488652896). +45757327736479273785344 = 714958245882488652896 bsl 6. +11171222591913885201 = 714958245882488652896 bsr 6. +996378621616514 = 996378621622899 + -6385. +996378621629284 = 996378621622899 - -6385. +-6361877499062210115 = 996378621622899 * -6385. +-996378621622899 = -(996378621622899). +996378621622899 = +(996378621622899). +-156049901585 = 996378621622899 div -6385. +2674 = 996378621622899 rem -6385. +996378621616643 = 996378621622899 band -6385. +-129 = 996378621622899 bor -6385. +-996378621616772 = 996378621622899 bxor -6385. +-996378621622900 = bnot(996378621622899). +1191685205215865960980475238890439746942267230329209039566398371784516186461927373794119083796406545393401897213207408688658831871831161338124049068588648198137657255470407110838856633687430191838787047644626681856 = 996378621622899 bsl 658. +0 = 996378621622899 bsr 658. +-7856694390025 = -7856982256154 + 287866129. +-7857270122283 = -7856982256154 - 287866129. +-2261759067700738407866 = -7856982256154 * 287866129. +7856982256154 = -(-7856982256154). +-7856982256154 = +(-7856982256154). +-27293 = -7856982256154 div 287866129. +-251997357 = -7856982256154 rem 287866129. +17306880 = -7856982256154 band 287866129. +-7856711696905 = -7856982256154 bor 287866129. +-7856729003785 = -7856982256154 bxor 287866129. +7856982256153 = bnot(-7856982256154). +-30691336939 = -7856982256154 bsl -8. +-2011387457575424 = -7856982256154 bsr -8. +5458631248550523 = 5458631248551254 + -731. +5458631248551985 = 5458631248551254 - -731. +-3990259442690966674 = 5458631248551254 * -731. +-5458631248551254 = -(5458631248551254). +5458631248551254 = +(5458631248551254). +-7467347809235 = 5458631248551254 div -731. +469 = 5458631248551254 rem -731. +5458631248551172 = 5458631248551254 band -731. +-649 = 5458631248551254 bor -731. +-5458631248551821 = 5458631248551254 bxor -731. +-5458631248551255 = bnot(5458631248551254). +2342024938910654820051888536507780965891187943829321942042078042290919638154856722380825766850939794692762065322883142094692838537470620714612390306960835945300214088204288 = 5458631248551254 bsl 517. +0 = 5458631248551254 bsr 517. +37877562043706634320734816 = -219639748162211523 + 37877562263346382482946339. +-37877562482986130645157862 = -219639748162211523 - 37877562263346382482946339. +-8319418236519886147530691974581819176464297 = -219639748162211523 * 37877562263346382482946339. +219639748162211523 = -(-219639748162211523). +-219639748162211523 = +(-219639748162211523). +0 = -219639748162211523 div 37877562263346382482946339. +-219639748162211523 = -219639748162211523 rem 37877562263346382482946339. +37877562046028814865936673 = -219639748162211523 band 37877562263346382482946339. +-2322180545201857 = -219639748162211523 bor 37877562263346382482946339. +-37877562048350995411138530 = -219639748162211523 bxor 37877562263346382482946339. +219639748162211522 = bnot(-219639748162211523). +-1 = -219639748162211523 bsl -89. +-135950419234279581409087868002800581870616576 = -219639748162211523 bsr -89. +69778474864706102665228970530 = 69778474864697313953383437367 + 8788711845533163. +69778474864688525241537904204 = 69778474864697313953383437367 - 8788711845533163. +613262908606603356476071407813496285731901821 = 69778474864697313953383437367 * 8788711845533163. +-69778474864697313953383437367 = -(69778474864697313953383437367). +69778474864697313953383437367 = +(69778474864697313953383437367). +7939556568823 = 69778474864697313953383437367 div 8788711845533163. +1978346045060218 = 69778474864697313953383437367 rem 8788711845533163. +4239721133118499 = 69778474864697313953383437367 band 8788711845533163. +69778474864701862944095852031 = 69778474864697313953383437367 bor 8788711845533163. +69778474864697623222962733532 = 69778474864697313953383437367 bxor 8788711845533163. +-69778474864697313953383437368 = bnot(69778474864697313953383437367). +1116455597835157023254134997872 = 69778474864697313953383437367 bsl 4. +4361154679043582122086464835 = 69778474864697313953383437367 bsr 4. +68916954866495927 = 68916954866738219 + -242292. +68916954866980511 = 68916954866738219 - -242292. +-16698026828571736557948 = 68916954866738219 * -242292. +-68916954866738219 = -(68916954866738219). +68916954866738219 = +(68916954866738219). +-284437599535 = 68916954866738219 div -242292. +203999 = 68916954866738219 rem -242292. +68916954866664456 = 68916954866738219 band -242292. +-168529 = 68916954866738219 bor -242292. +-68916954866832985 = 68916954866738219 bxor -242292. +-68916954866738220 = bnot(68916954866738219). +2603608942112997136130701629317963579392 = 68916954866738219 bsl 75. +0 = 68916954866738219 bsr 75. +798375855535459387752176231 = -558 + 798375855535459387752176789. +-798375855535459387752177347 = -558 - 798375855535459387752176789. +-445493727388786338365714648262 = -558 * 798375855535459387752176789. +558 = -(-558). +-558 = +(-558). +0 = -558 div 798375855535459387752176789. +-558 = -558 rem 798375855535459387752176789. +798375855535459387752176784 = -558 band 798375855535459387752176789. +-553 = -558 bor 798375855535459387752176789. +-798375855535459387752177337 = -558 bxor 798375855535459387752176789. +557 = bnot(-558). +-1 = -558 bsl -555. +-65808469782825627329712108005982938785363813781011679969810097360533071331713095608251834770285424759004354789598944545439749569484313571530290009759357637261136331014144 = -558 bsr -555. +31341992556638337 = 31341992588568319 + -31929982. +31341992620498301 = 31341992588568319 - -31929982. +-1000749259197119831440258 = 31341992588568319 * -31929982. +-31341992588568319 = -(31341992588568319). +31341992588568319 = +(31341992588568319). +-981585037 = 31341992588568319 div -31929982. +25688985 = 31341992588568319 rem -31929982. +31341992575778946 = 31341992588568319 band -31929982. +-19140609 = 31341992588568319 bor -31929982. +-31341992594919555 = 31341992588568319 bxor -31929982. +-31341992588568320 = bnot(31341992588568319). +0 = 31341992588568319 bsl -82. +151560576313962352491548366831053308952576 = 31341992588568319 bsr -82. +-71152585374235 = -71152585374226 + -9. +-71152585374217 = -71152585374226 - -9. +640373268368034 = -71152585374226 * -9. +71152585374226 = -(-71152585374226). +-71152585374226 = +(-71152585374226). +7905842819358 = -71152585374226 div -9. +-4 = -71152585374226 rem -9. +-71152585374234 = -71152585374226 band -9. +-1 = -71152585374226 bor -9. +71152585374233 = -71152585374226 bxor -9. +71152585374225 = bnot(-71152585374226). +-1401777304902370023267168911069106526994726800019700595916679983405075563365032665475935344090222914425442753620093033909959262208 = -71152585374226 bsl 383. +-1 = -71152585374226 bsr 383. +-79667436337 = -421 + -79667435916. +79667435495 = -421 - -79667435916. +33539990520636 = -421 * -79667435916. +421 = -(-421). +-421 = +(-421). +0 = -421 div -79667435916. +-421 = -421 rem -79667435916. +-79667435952 = -421 band -79667435916. +-385 = -421 bor -79667435916. +79667435567 = -421 bxor -79667435916. +420 = bnot(-421). +-1 = -421 bsl -43. +-3703155162349568 = -421 bsr -43. +83279812644292437334481164553 = 551264226118 + 83279812644292436783216938435. +-83279812644292436231952712317 = 551264226118 - 83279812644292436783216938435. +45909181468607901372980522896879525045330 = 551264226118 * 83279812644292436783216938435. +-551264226118 = -(551264226118). +551264226118 = +(551264226118). +0 = 551264226118 div 83279812644292436783216938435. +551264226118 = 551264226118 rem 83279812644292436783216938435. +550844238146 = 551264226118 band 83279812644292436783216938435. +83279812644292436783636926407 = 551264226118 bor 83279812644292436783216938435. +83279812644292436232792688261 = 551264226118 bxor 83279812644292436783216938435. +-551264226119 = bnot(551264226118). +36994715978618109952 = 551264226118 bsl 26. +8214 = 551264226118 bsr 26. +87569964599575541 = 87569964599575535 + 6. +87569964599575529 = 87569964599575535 - 6. +525419787597453210 = 87569964599575535 * 6. +-87569964599575535 = -(87569964599575535). +87569964599575535 = +(87569964599575535). +14594994099929255 = 87569964599575535 div 6. +5 = 87569964599575535 rem 6. +6 = 87569964599575535 band 6. +87569964599575535 = 87569964599575535 bor 6. +87569964599575529 = 87569964599575535 bxor 6. +-87569964599575536 = bnot(87569964599575535). +350279858398302140 = 87569964599575535 bsl 2. +21892491149893883 = 87569964599575535 bsr 2. +-79139683474112 = 3266 + -79139683477378. +79139683480644 = 3266 - -79139683477378. +-258470206237116548 = 3266 * -79139683477378. +-3266 = -(3266). +3266 = +(3266). +0 = 3266 div -79139683477378. +3266 = 3266 rem -79139683477378. +2114 = 3266 band -79139683477378. +-79139683476226 = 3266 bor -79139683477378. +-79139683478340 = 3266 bxor -79139683477378. +-3267 = bnot(3266). +0 = 3266 bsl -97. +517518357543174653161029083594752 = 3266 bsr -97. +-528826609416005235279143258934 = -528822366958813963365687686735 + -4242457191271913455572199. +-528818124501622691452232114536 = -528822366958813963365687686735 - -4242457191271913455572199. +2243506253609855016895612866281530019759954648087080265 = -528822366958813963365687686735 * -4242457191271913455572199. +528822366958813963365687686735 = -(-528822366958813963365687686735). +-528822366958813963365687686735 = +(-528822366958813963365687686735). +124650 = -528822366958813963365687686735 div -4242457191271913455572199. +-78066769951128613081385 = -528822366958813963365687686735 rem -4242457191271913455572199. +-528822378175597133599814448879 = -528822366958813963365687686735 band -4242457191271913455572199. +-4231240408101679328810055 = -528822366958813963365687686735 bor -4242457191271913455572199. +528818146935189031920485638824 = -528822366958813963365687686735 bxor -4242457191271913455572199. +528822366958813963365687686734 = bnot(-528822366958813963365687686735). +-1 = -528822366958813963365687686735 bsl -694. +-43463711218466338955572487038712869586135496388142499896172260074134030839763399010045581644463349710359458383073992347886041147194909733968081404679983369726128835813905894046541858902553215110731412580659716174189772604269171919017738240 = -528822366958813963365687686735 bsr -694. +797319233226109 = 797319233226116 + -7. +797319233226123 = 797319233226116 - -7. +-5581234632582812 = 797319233226116 * -7. +-797319233226116 = -(797319233226116). +797319233226116 = +(797319233226116). +-113902747603730 = 797319233226116 div -7. +6 = 797319233226116 rem -7. +797319233226112 = 797319233226116 band -7. +-3 = 797319233226116 bor -7. +-797319233226115 = 797319233226116 bxor -7. +-797319233226117 = bnot(797319233226116). +0 = 797319233226116 bsl -678. +999929314538887397457460885892402574280556113199216091903682678906350648933619397885255043195645170578694143264320226870569053104450492035830990612081822756284334114092839013846886137293561013683556295378342835969327104 = 797319233226116 bsr -678. +74658793917586461856003213 = 74658793917586461855943656 + 59557. +74658793917586461855884099 = 74658793917586461855943656 - 59557. +4446453789349696908754436320392 = 74658793917586461855943656 * 59557. +-74658793917586461855943656 = -(74658793917586461855943656). +74658793917586461855943656 = +(74658793917586461855943656). +1253568747881633760195 = 74658793917586461855943656 div 59557. +10041 = 74658793917586461855943656 rem 59557. +34976 = 74658793917586461855943656 band 59557. +74658793917586461855968237 = 74658793917586461855943656 bor 59557. +74658793917586461855933261 = 74658793917586461855943656 bxor 59557. +-74658793917586461855943657 = bnot(74658793917586461855943656). +180513887256515809585267167850601915130806022438912 = 74658793917586461855943656 bsl 81. +30 = 74658793917586461855943656 bsr 81. +328255484272303502 = 328255484352167823 + -79864321. +328255484432032144 = 328255484352167823 - -79864321. +-26215901372312008061943183 = 328255484352167823 * -79864321. +-328255484352167823 = -(328255484352167823). +328255484352167823 = +(328255484352167823). +-4110164341 = 328255484352167823 div -79864321. +59790362 = 328255484352167823 rem -79864321. +328255484280724879 = 328255484352167823 band -79864321. +-8421377 = 328255484352167823 bor -79864321. +-328255484289146256 = 328255484352167823 bxor -79864321. +-328255484352167824 = bnot(328255484352167823). +41031935544020977 = 328255484352167823 bsl -3. +2626043874817342584 = 328255484352167823 bsr -3. +-77397692958105440346617 = -77397692957873165781294 + -232274565323. +-77397692957640891215971 = -77397692957873165781294 - -232274565323. +17977515488793007732415981534467962 = -77397692957873165781294 * -232274565323. +77397692957873165781294 = -(-77397692957873165781294). +-77397692957873165781294 = +(-77397692957873165781294). +333216393496 = -77397692957873165781294 div -232274565323. +-92041442086 = -77397692957873165781294 rem -232274565323. +-77397692957959335696880 = -77397692957873165781294 band -232274565323. +-146104649737 = -77397692957873165781294 bor -232274565323. +77397692957813231047143 = -77397692957873165781294 bxor -232274565323. +77397692957873165781293 = bnot(-77397692957873165781294). +-2476726174651941305001408 = -77397692957873165781294 bsl 5. +-2418677904933536430666 = -77397692957873165781294 bsr 5. +558623004797590356 = -71322676152166 + 558694327473742522. +-558765650149894688 = -71322676152166 - 558694327473742522. +-39847574586461917438398376602652 = -71322676152166 * 558694327473742522. +71322676152166 = -(-71322676152166). +-71322676152166 = +(-71322676152166). +0 = -71322676152166 div 558694327473742522. +-71322676152166 = -71322676152166 rem 558694327473742522. +558623382767739034 = -71322676152166 band 558694327473742522. +-377970148678 = -71322676152166 bor 558694327473742522. +-558623760737887712 = -71322676152166 bxor 558694327473742522. +71322676152165 = bnot(-71322676152166). +-9521519476763252171233415047488689967244976902650839894022363196561548524908584988430404213853455719885438976 = -71322676152166 bsl 316. +-1 = -71322676152166 bsr 316. +41146241257 = 48132563528 + -6986322271. +55118885799 = 48132563528 - -6986322271. +-336269600535988732088 = 48132563528 * -6986322271. +-48132563528 = -(48132563528). +48132563528 = +(48132563528). +-6 = 48132563528 div -6986322271. +6214629902 = 48132563528 rem -6986322271. +43293876736 = 48132563528 band -6986322271. +-2147635479 = 48132563528 bor -6986322271. +-45441512215 = 48132563528 bxor -6986322271. +-48132563529 = bnot(48132563528). +376035652 = 48132563528 bsl -7. +6160968131584 = 48132563528 bsr -7. +-24099764783368 = -24152264348513 + 52499565145. +-24204763913658 = -24152264348513 - 52499565145. +-1267983375564019227379385 = -24152264348513 * 52499565145. +24152264348513 = -(-24152264348513). +-24152264348513 = +(-24152264348513). +-460 = -24152264348513 div 52499565145. +-2464381813 = -24152264348513 rem 52499565145. +34763753497 = -24152264348513 band 52499565145. +-24134528536865 = -24152264348513 bor 52499565145. +-24169292290362 = -24152264348513 bxor 52499565145. +24152264348512 = bnot(-24152264348513). +-1545744918304832 = -24152264348513 bsl 6. +-377379130446 = -24152264348513 bsr 6. +5539295 = 7879 + 5531416. +-5523537 = 7879 - 5531416. +43582026664 = 7879 * 5531416. +-7879 = -(7879). +7879 = +(7879). +0 = 7879 div 5531416. +7879 = 7879 rem 5531416. +1536 = 7879 band 5531416. +5537759 = 7879 bor 5531416. +5536223 = 7879 bxor 5531416. +-7880 = bnot(7879). +984 = 7879 bsl -3. +63032 = 7879 bsr -3. +58172169302819364 = 58172169262996546 + 39822818. +58172169223173728 = 58172169262996546 - 39822818. +2316579709225505585986628 = 58172169262996546 * 39822818. +-58172169262996546 = -(58172169262996546). +58172169262996546 = +(58172169262996546). +1460774806 = 58172169262996546 div 39822818. +24673238 = 58172169262996546 rem 39822818. +1836098 = 58172169262996546 band 39822818. +58172169300983266 = 58172169262996546 bor 39822818. +58172169299147168 = 58172169262996546 bxor 39822818. +-58172169262996547 = bnot(58172169262996546). +0 = 58172169262996546 bsl -583. +1841631485232425883936462493764158299079473394554733660956254705586690260117048334965703753053493372091793188222396847239863698388545793745284307475542137916335156259717659697262445460631584768 = 58172169262996546 bsr -583. +-524374052553398976132976328851 = 515975493941411182952824 + -524374568528892917544159281675. +524375084504386858955342234499 = 515975493941411182952824 - -524374568528892917544159281675. +-270564427007009890743217691173433382599028713252700200 = 515975493941411182952824 * -524374568528892917544159281675. +-515975493941411182952824 = -(515975493941411182952824). +515975493941411182952824 = +(515975493941411182952824). +0 = 515975493941411182952824 div -524374568528892917544159281675. +515975493941411182952824 = 515975493941411182952824 rem -524374568528892917544159281675. +24793884116422100140400 = 515975493941411182952824 band -524374568528892917544159281675. +-524374077347283092555076469251 = 515975493941411182952824 bor -524374568528892917544159281675. +-524374102141167208977176609651 = 515975493941411182952824 bxor -524374568528892917544159281675. +-515975493941411182952825 = bnot(515975493941411182952824). +0 = 515975493941411182952824 bsl -383. +10165234804733592749048078667408891909669893160380371407515909658118733874352020029652328005348506648156359666196339278592623350726306824192 = 515975493941411182952824 bsr -383. +65522935517544286668033 = 65522935517544323655995 + -36987962. +65522935517544360643957 = 65522935517544323655995 - -36987962. +-2423559849051379776703644132190 = 65522935517544323655995 * -36987962. +-65522935517544323655995 = -(65522935517544323655995). +65522935517544323655995 = +(65522935517544323655995). +-1771466498141863 = 65522935517544323655995 div -36987962. +24402789 = 65522935517544323655995 rem -36987962. +65522935517544288782594 = 65522935517544323655995 band -36987962. +-2114561 = 65522935517544323655995 bor -36987962. +-65522935517544290897155 = 65522935517544323655995 bxor -36987962. +-65522935517544323655996 = bnot(65522935517544323655995). +255948966865407514281 = 65522935517544323655995 bsl -8. +16773871492491346855934720 = 65522935517544323655995 bsr -8. +-5488878154392571 = -5488877264739374 + -889653197. +-5488876375086177 = -5488877264739374 - -889653197. +4883197206515999450878678 = -5488877264739374 * -889653197. +5488877264739374 = -(-5488877264739374). +-5488877264739374 = +(-5488877264739374). +6169681 = -5488877264739374 div -889653197. +-838619217 = -5488877264739374 rem -889653197. +-5488877868916718 = -5488877264739374 band -889653197. +-285475853 = -5488877264739374 bor -889653197. +5488877583440865 = -5488877264739374 bxor -889653197. +5488877264739373 = bnot(-5488877264739374). +-171527414523106 = -5488877264739374 bsl -5. +-175644072471659968 = -5488877264739374 bsr -5. +-975351984431271311365207286 = -275691 + -975351984431271311364931595. +975351984431271311364655904 = -275691 - -975351984431271311364931595. +268895763939841619101509356357145 = -275691 * -975351984431271311364931595. +275691 = -(-275691). +-275691 = +(-275691). +0 = -275691 div -975351984431271311364931595. +-275691 = -275691 rem -975351984431271311364931595. +-975351984431271311365207275 = -275691 band -975351984431271311364931595. +-11 = -275691 bor -975351984431271311364931595. +975351984431271311365207264 = -275691 bxor -975351984431271311364931595. +275690 = bnot(-275691). +-8822112 = -275691 bsl 5. +-8616 = -275691 bsr 5. +-547541251554946824913030723705 = -547541251554946824865281451454 + -47749272251. +-547541251554946824817532179203 = -547541251554946824865281451454 - -47749272251. +26144696289150433026320340423217485802954 = -547541251554946824865281451454 * -47749272251. +547541251554946824865281451454 = -(-547541251554946824865281451454). +-547541251554946824865281451454 = +(-547541251554946824865281451454). +11467007259853679081 = -547541251554946824865281451454 div -47749272251. +-2628970123 = -547541251554946824865281451454 rem -47749272251. +-547541251554946824874241800128 = -547541251554946824865281451454 band -47749272251. +-38788923577 = -547541251554946824865281451454 bor -47749272251. +547541251554946824835452876551 = -547541251554946824865281451454 bxor -47749272251. +547541251554946824865281451453 = bnot(-547541251554946824865281451454). +-68442656444368353108160181432 = -547541251554946824865281451454 bsl -3. +-4380330012439574598922251611632 = -547541251554946824865281451454 bsr -3. +-893417919092660 = -272535657287 + -893145383435373. +892872847778086 = -272535657287 - -893145383435373. +243413964127409022641013051 = -272535657287 * -893145383435373. +272535657287 = -(-272535657287). +-272535657287 = +(-272535657287). +0 = -272535657287 div -893145383435373. +-272535657287 = -272535657287 rem -893145383435373. +-893353154576239 = -272535657287 band -893145383435373. +-64764516421 = -272535657287 bor -893145383435373. +893288390059818 = -272535657287 bxor -893145383435373. +272535657286 = bnot(-272535657287). +-1 = -272535657287 bsl -257. +-63114946297853855695226119544089564744479648846237524090765976921107249191234398809227264 = -272535657287 bsr -257. +4868490155316553 = -6893813846725 + 4875383969163278. +-4882277783010003 = -6893813846725 - 4875383969163278. +-33609989514718896288790564550 = -6893813846725 * 4875383969163278. +6893813846725 = -(-6893813846725). +-6893813846725 = +(-6893813846725). +0 = -6893813846725 div 4875383969163278. +-6893813846725 = -6893813846725 rem 4875383969163278. +4873184929130506 = -6893813846725 band 4875383969163278. +-4694773813953 = -6893813846725 bor 4875383969163278. +-4877879702944459 = -6893813846725 bxor 4875383969163278. +6893813846724 = bnot(-6893813846725). +-53857920678 = -6893813846725 bsl -7. +-882408172380800 = -6893813846725 bsr -7. +88531884 = -345648 + 88877532. +-89223180 = -345648 - 88877532. +-30720341180736 = -345648 * 88877532. +345648 = -(-345648). +-345648 = +(-345648). +0 = -345648 div 88877532. +-345648 = -345648 rem 88877532. +88615376 = -345648 band 88877532. +-83492 = -345648 bor 88877532. +-88698868 = -345648 bxor 88877532. +345647 = bnot(-345648). +-1 = -345648 bsl -22. +-1449752788992 = -345648 bsr -22. +-7182728122643761525984115570 = 6713161799745 + -7182728122643768239145915315. +7182728122643774952307715060 = 6713161799745 - -7182728122643768239145915315. +-48218816050886264279813462417710758594675 = 6713161799745 * -7182728122643768239145915315. +-6713161799745 = -(6713161799745). +6713161799745 = +(6713161799745). +0 = 6713161799745 div -7182728122643768239145915315. +6713161799745 = 6713161799745 rem -7182728122643768239145915315. +34378565697 = 6713161799745 band -7182728122643768239145915315. +-7182728122643761560362681267 = 6713161799745 bor -7182728122643768239145915315. +-7182728122643761594741246964 = 6713161799745 bxor -7182728122643768239145915315. +-6713161799746 = bnot(6713161799745). +400135 = 6713161799745 bsl -24. +112628165557270609920 = 6713161799745 bsr -24. +677832337812136399 = 9225519627 + 677832328586616772. +-677832319361097145 = 9225519627 - 677832328586616772. +6253355451190946199613384044 = 9225519627 * 677832328586616772. +-9225519627 = -(9225519627). +9225519627 = +(9225519627). +0 = 9225519627 div 677832328586616772. +9225519627 = 9225519627 rem 677832328586616772. +10633728 = 9225519627 band 677832328586616772. +677832337801502671 = 9225519627 bor 677832328586616772. +677832337790868943 = 9225519627 bxor 677832328586616772. +-9225519628 = bnot(9225519627). +0 = 9225519627 bsl -73. +87132569347201742402958114422784 = 9225519627 bsr -73. +9582164918175358592318162218 = 9582164555961441837585497692 + 362213916754732664526. +9582164193747525082852833166 = 9582164555961441837585497692 - 362213916754732664526. +3470793354803167580245453739625958279418983273992 = 9582164555961441837585497692 * 362213916754732664526. +-9582164555961441837585497692 = -(9582164555961441837585497692). +9582164555961441837585497692 = +(9582164555961441837585497692). +26454435 = 9582164555961441837585497692 div 362213916754732664526. +39077955621505624882 = 9582164555961441837585497692 rem 362213916754732664526. +20910215406356022860 = 9582164555961441837585497692 band 362213916754732664526. +9582164897265143185962139358 = 9582164555961441837585497692 bor 362213916754732664526. +9582164876354927779606116498 = 9582164555961441837585497692 bxor 362213916754732664526. +-9582164555961441837585497693 = bnot(9582164555961441837585497692). +5336676852399686120194739528601269773861139218240560986439407944118521240903591147655063511501698925729523074806326316313266339822586508845390959601173850920852656732314354269052161587782993297354961379357339760459776 = 9582164555961441837585497692 bsl 627. +0 = 9582164555961441837585497692 bsr 627. +-341814826686116351943 = -4927348123992595974 + -336887478562123755969. +331960130438131159995 = -4927348123992595974 - -336887478562123755969. +1659961885489676382779337545251587868806 = -4927348123992595974 * -336887478562123755969. +4927348123992595974 = -(-4927348123992595974). +-4927348123992595974 = +(-4927348123992595974). +0 = -4927348123992595974 div -336887478562123755969. +-4927348123992595974 = -4927348123992595974 rem -336887478562123755969. +-337185055900363997126 = -4927348123992595974 band -336887478562123755969. +-4629770785752354817 = -4927348123992595974 bor -336887478562123755969. +332555285114611642309 = -4927348123992595974 bxor -336887478562123755969. +4927348123992595973 = bnot(-4927348123992595974). +-1 = -4927348123992595974 bsl -78. +-1489199592331088637185911635105985232633856 = -4927348123992595974 bsr -78. +-9392058631397766 = -9392647166833978 + 588535436212. +-9393235702270190 = -9392647166833978 - 588535436212. +-5527905697518041181213211336 = -9392647166833978 * 588535436212. +9392647166833978 = -(-9392647166833978). +-9392647166833978 = +(-9392647166833978). +-15959 = -9392647166833978 div 588535436212. +-210140326670 = -9392647166833978 rem 588535436212. +38689440388 = -9392647166833978 band 588535436212. +-9392097320838154 = -9392647166833978 bor 588535436212. +-9392136010278542 = -9392647166833978 bxor 588535436212. +9392647166833977 = bnot(-9392647166833978). +-385989066975312680106234949556957333505791913465331437801724024961539883462898484456837898372667490205649698957301760942139537259995987721900399294371093260505471227570348896124947635073654541278753777384183516606078780440576 = -9392647166833978 bsl 693. +-1 = -9392647166833978 bsr 693. +-4961296591226261882489848 = -27175 + -4961296591226261882462673. +4961296591226261882435498 = -27175 - -4961296591226261882462673. +134823234866573666655923138775 = -27175 * -4961296591226261882462673. +27175 = -(-27175). +-27175 = +(-27175). +0 = -27175 div -4961296591226261882462673. +-27175 = -27175 rem -4961296591226261882462673. +-4961296591226261882465271 = -27175 band -4961296591226261882462673. +-24577 = -27175 bor -4961296591226261882462673. +4961296591226261882440694 = -27175 bxor -4961296591226261882462673. +27174 = bnot(-27175). +-1 = -27175 bsl -622. +-472962660918743725076957086124059359565633715379637207464178301520968638110717040932839129057119628101290148783349716257736074641431341276559891019300274545920364209273300933908470558831411200 = -27175 bsr -622. +-4518784533548335134124 = 311734 + -4518784533548335445858. +4518784533548335757592 = 311734 - -4518784533548335445858. +-1408658777781156801879097772 = 311734 * -4518784533548335445858. +-311734 = -(311734). +311734 = +(311734). +0 = 311734 div -4518784533548335445858. +311734 = 311734 rem -4518784533548335445858. +311446 = 311734 band -4518784533548335445858. +-4518784533548335445570 = 311734 bor -4518784533548335445858. +-4518784533548335757016 = 311734 bxor -4518784533548335445858. +-311735 = bnot(311734). +0 = 311734 bsl -44. +5484082524369977344 = 311734 bsr -44. +21275919429780858025821 = 21275919429779874153175 + 983872646. +21275919429778890280529 = 21275919429779874153175 - 983872646. +20932795145460335980631296551050 = 21275919429779874153175 * 983872646. +-21275919429779874153175 = -(21275919429779874153175). +21275919429779874153175 = +(21275919429779874153175). +21624668107481 = 21275919429779874153175 div 983872646. +730288449 = 21275919429779874153175 rem 983872646. +8683654 = 21275919429779874153175 band 983872646. +21275919429780849342167 = 21275919429779874153175 bor 983872646. +21275919429780840658513 = 21275919429779874153175 bxor 983872646. +-21275919429779874153176 = bnot(21275919429779874153175). +0 = 21275919429779874153175 bsl -618. +23143319841309774529218182426277225740061130868854095682779067358923745953370169676763359692335210842040982434765721084951676031564401410968549003375379240299973134221202155012423338818501642607167135757107200 = 21275919429779874153175 bsr -618. +-3339502453047626442278 = 515477399815852872455 + -3854979852863479314733. +4370457252679332187188 = 515477399815852872455 - -3854979852863479314733. +-1987154990896565405463692075357393051379515 = 515477399815852872455 * -3854979852863479314733. +-515477399815852872455 = -(515477399815852872455). +515477399815852872455 = +(515477399815852872455). +0 = 515477399815852872455 div -3854979852863479314733. +515477399815852872455 = 515477399815852872455 rem -3854979852863479314733. +202997527792201105923 = 515477399815852872455 band -3854979852863479314733. +-3542499980839827548201 = 515477399815852872455 bor -3854979852863479314733. +-3745497508632028654124 = 515477399815852872455 bxor -3854979852863479314733. +-515477399815852872456 = bnot(515477399815852872455). +507242775050453558664206926574664259334949441075912623324632243027555334273558726787570601860054774624788985787370365824153046190847018043828663361852299868268568559992782257302728452053620442820422112636486933611624357943645384009909453643531871800768007627880329628193139185418240 = 515477399815852872455 bsl 867. +0 = 515477399815852872455 bsr 867. +-984265841769192217048 = -984174278811462362262 + -91562957729854786. +-984082715853732507476 = -984174278811462362262 - -91562957729854786. +90113907889624247031558125489786485932 = -984174278811462362262 * -91562957729854786. +984174278811462362262 = -(-984174278811462362262). +-984174278811462362262 = +(-984174278811462362262). +10748 = -984174278811462362262 div -91562957729854786. +-55609130983122334 = -984174278811462362262 rem -91562957729854786. +-984265476721666913750 = -984174278811462362262 band -91562957729854786. +-365047525303298 = -984174278811462362262 bor -91562957729854786. +984265111674141610452 = -984174278811462362262 bxor -91562957729854786. +984174278811462362261 = bnot(-984174278811462362262). +-144460950166215404152568275607761337046688597771011357538634752049580194971460310077327877110179810448579921881907952828108767232 = -984174278811462362262 bsl 356. +-1 = -984174278811462362262 bsr 356. +6618887092721257518 = 6594487817164322823 + 24399275556934695. +6570088541607388128 = 6594487817164322823 - 24399275556934695. +160900725407841093880781221309043985 = 6594487817164322823 * 24399275556934695. +-6594487817164322823 = -(6594487817164322823). +6594487817164322823 = +(6594487817164322823). +270 = 6594487817164322823 div 24399275556934695. +6683416791955173 = 6594487817164322823 rem 24399275556934695. +1129211462422535 = 6594487817164322823 band 24399275556934695. +6617757881258834983 = 6594487817164322823 bor 24399275556934695. +6616628669796412448 = 6594487817164322823 bxor 24399275556934695. +-6594487817164322824 = bnot(6594487817164322823). +2881758163258708472009229807991022233836603862499931168191263405427528350157214552701788026582250369607836895526645645608425613267889411032227731280317762877832901610956911686886424172368524206909418827646354584671451685390926741598329380603293086612065494790832128 = 6594487817164322823 bsl 816. +0 = 6594487817164322823 bsr 816. +9294547468162 = 55151716 + 9294492316446. +-9294437164730 = 55151716 - 9294492316446. +512607200600811921336 = 55151716 * 9294492316446. +-55151716 = -(55151716). +55151716 = +(55151716). +0 = 55151716 div 9294492316446. +55151716 = 55151716 rem 9294492316446. +38371332 = 55151716 band 9294492316446. +9294509096830 = 55151716 bor 9294492316446. +9294470725498 = 55151716 bxor 9294492316446. +-55151717 = bnot(55151716). +1764854912 = 55151716 bsl 5. +1723491 = 55151716 bsr 5. +6847874423084035 = 6763526927266637 + 84347495817398. +6679179431449239 = 6763526927266637 - 84347495817398. +570486559208481411318209550526 = 6763526927266637 * 84347495817398. +-6763526927266637 = -(6763526927266637). +6763526927266637 = +(6763526927266637). +80 = 6763526927266637 div 84347495817398. +15727261874797 = 6763526927266637 rem 84347495817398. +4552707579908 = 6763526927266637 band 84347495817398. +6843321715504127 = 6763526927266637 bor 84347495817398. +6838769007924219 = 6763526927266637 bxor 84347495817398. +-6763526927266638 = bnot(6763526927266637). +72861841021346594950469669310145622757531257645856262087320576422892113884140671863370529611731381331417851598231496342896189603706299843552141018223872279795445980361061454826487169875371327280810397754559309096395131065861144576 = 6763526927266637 bsl 711. +0 = 6763526927266637 bsr 711. +-80167305584397671 = -2243787451848889 + -77923518132548782. +75679730680699893 = -2243787451848889 - -77923518132548782. +174843812189732329080955885003198 = -2243787451848889 * -77923518132548782. +2243787451848889 = -(-2243787451848889). +-2243787451848889 = +(-2243787451848889). +0 = -2243787451848889 div -77923518132548782. +-2243787451848889 = -2243787451848889 rem -77923518132548782. +-78812679878540478 = -2243787451848889 band -77923518132548782. +-1354625705857193 = -2243787451848889 bor -77923518132548782. +77458054172683285 = -2243787451848889 bxor -77923518132548782. +2243787451848888 = bnot(-2243787451848889). +-1 = -2243787451848889 bsl -64. +-41390572880057349064804798377754624 = -2243787451848889 bsr -64. +65170746308571457407813069 = 7625473793728984683221438 + 57545272514842472724591631. +-49919798721113488041370193 = 7625473793728984683221438 - 57545272514842472724591631. +438809967514924101539814551646840646904176094585378 = 7625473793728984683221438 * 57545272514842472724591631. +-7625473793728984683221438 = -(7625473793728984683221438). +7625473793728984683221438 = +(7625473793728984683221438). +0 = 7625473793728984683221438 div 57545272514842472724591631. +7625473793728984683221438 = 7625473793728984683221438 rem 57545272514842472724591631. +7293718166728473898913806 = 7625473793728984683221438 band 57545272514842472724591631. +57877028141842983508899263 = 7625473793728984683221438 bor 57545272514842472724591631. +50583309975114509609985457 = 7625473793728984683221438 bxor 57545272514842472724591631. +-7625473793728984683221439 = bnot(7625473793728984683221438). +488030322798655019726172032 = 7625473793728984683221438 bsl 6. +119148028027015385675334 = 7625473793728984683221438 bsr 6. +455461316337253539450 = 5 + 455461316337253539445. +-455461316337253539440 = 5 - 455461316337253539445. +2277306581686267697225 = 5 * 455461316337253539445. +-5 = -(5). +5 = +(5). +0 = 5 div 455461316337253539445. +5 = 5 rem 455461316337253539445. +5 = 5 band 455461316337253539445. +455461316337253539445 = 5 bor 455461316337253539445. +455461316337253539440 = 5 bxor 455461316337253539445. +-6 = bnot(5). +640 = 5 bsl 7. +0 = 5 bsr 7. +-83155929185183823425319556194 = -973 + -83155929185183823425319555221. +83155929185183823425319554248 = -973 - -83155929185183823425319555221. +80910719097183860192835927230033 = -973 * -83155929185183823425319555221. +973 = -(-973). +-973 = +(-973). +0 = -973 div -83155929185183823425319555221. +-973 = -973 rem -83155929185183823425319555221. +-83155929185183823425319556061 = -973 band -83155929185183823425319555221. +-133 = -973 bor -83155929185183823425319555221. +83155929185183823425319555928 = -973 bxor -83155929185183823425319555221. +972 = bnot(-973). +-1 = -973 bsl -926. +-551936131267121475258832859306279466631971807943188022102838904996646980063275701698092945100692798280286467837470154868351864411893918324920836698689510334353191615202094443262570906360157660665413947103968791351892059132305975847540610225280473447712219195406678019400605653532672 = -973 bsr -926. +-47638341697598172697398233 = -47638341697598172697392918 + -5315. +-47638341697598172697387603 = -47638341697598172697392918 - -5315. +253197786122734287886643359170 = -47638341697598172697392918 * -5315. +47638341697598172697392918 = -(-47638341697598172697392918). +-47638341697598172697392918 = +(-47638341697598172697392918). +8962999378663814242218 = -47638341697598172697392918 div -5315. +-4248 = -47638341697598172697392918 rem -5315. +-47638341697598172697393112 = -47638341697598172697392918 band -5315. +-5121 = -47638341697598172697392918 bor -5315. +47638341697598172697387991 = -47638341697598172697392918 bxor -5315. +47638341697598172697392917 = bnot(-47638341697598172697392918). +-1 = -47638341697598172697392918 bsl -653. +-1780507485120814963816905410710360908621808249817282740913166131099101078121931803923807431316809972356332314045330221899193989705837846871622622680409917642160646232237830315179310472531087430300491432785096334823082950656 = -47638341697598172697392918 bsr -653. +-72339946578891567854753983517 = -519829187751 + -72339946578891567334924795766. +72339946578891566815095608015 = -519829187751 - -72339946578891567334924795766. +37604415672055934689617280357709343862266 = -519829187751 * -72339946578891567334924795766. +519829187751 = -(-519829187751). +-519829187751 = +(-519829187751). +0 = -519829187751 div -72339946578891567334924795766. +-519829187751 = -519829187751 rem -72339946578891567334924795766. +-72339946578891567442436030456 = -519829187751 band -72339946578891567334924795766. +-412317953061 = -519829187751 bor -72339946578891567334924795766. +72339946578891567030118077395 = -519829187751 bxor -72339946578891567334924795766. +519829187750 = bnot(-519829187751). +-16634534008032 = -519829187751 bsl 5. +-16244662118 = -519829187751 bsr 5. +662264339361468698253212818 = 662264339361468697367817694 + 885395124. +662264339361468696482422570 = 662264339361468697367817694 - 885395124. +586365616869725658128097420788524056 = 662264339361468697367817694 * 885395124. +-662264339361468697367817694 = -(662264339361468697367817694). +662264339361468697367817694 = +(662264339361468697367817694). +747987335156669213 = 662264339361468697367817694 div 885395124. +96700282 = 662264339361468697367817694 rem 885395124. +71568532 = 662264339361468697367817694 band 885395124. +662264339361468698181644286 = 662264339361468697367817694 bor 885395124. +662264339361468698110075754 = 662264339361468697367817694 bxor 885395124. +-662264339361468697367817695 = bnot(662264339361468697367817694). +0 = 662264339361468697367817694 bsl -99. +419759893650658802452305031968642128034251818337904361472 = 662264339361468697367817694 bsr -99. +5551635323614192491 = 5551635323614192528 + -37. +5551635323614192565 = 5551635323614192528 - -37. +-205410506973725123536 = 5551635323614192528 * -37. +-5551635323614192528 = -(5551635323614192528). +5551635323614192528 = +(5551635323614192528). +-150044197935518716 = 5551635323614192528 div -37. +36 = 5551635323614192528 rem -37. +5551635323614192528 = 5551635323614192528 band -37. +-37 = 5551635323614192528 bor -37. +-5551635323614192565 = 5551635323614192528 bxor -37. +-5551635323614192529 = bnot(5551635323614192528). +173488603862943516 = 5551635323614192528 bsl -5. +177652330355654160896 = 5551635323614192528 bsr -5. +-7922868694817488596 = -7922868694817488664 + 68. +-7922868694817488732 = -7922868694817488664 - 68. +-538755071247589229152 = -7922868694817488664 * 68. +7922868694817488664 = -(-7922868694817488664). +-7922868694817488664 = +(-7922868694817488664). +-116512774923786598 = -7922868694817488664 div 68. +0 = -7922868694817488664 rem 68. +64 = -7922868694817488664 band 68. +-7922868694817488660 = -7922868694817488664 bor 68. +-7922868694817488724 = -7922868694817488664 bxor 68. +7922868694817488663 = bnot(-7922868694817488664). +-1 = -7922868694817488664 bsl -779. +-25191213038852209044292937828015099025257271256952343863342072868140826251837776329735427118358786135914611789331358205206094825046490733380868271669321943129071304927884001954104300135133945628429755034568960848769397911798990400314322641925013799698432 = -7922868694817488664 bsr -779. +-3439612141528135279856463 = -563955965296 + -3439612141527571323891167. +3439612141527007367925871 = -563955965296 - -3439612141527571323891167. +1939789785519023253963531752332940432 = -563955965296 * -3439612141527571323891167. +563955965296 = -(-563955965296). +-563955965296 = +(-563955965296). +0 = -563955965296 div -3439612141527571323891167. +-563955965296 = -563955965296 rem -3439612141527571323891167. +-3439612141528129776598528 = -563955965296 band -3439612141527571323891167. +-5503257935 = -563955965296 bor -3439612141527571323891167. +3439612141528124273340593 = -563955965296 bxor -3439612141527571323891167. +563955965295 = bnot(-563955965296). +-541940339221058495495078070836423910083159626032191856894560088569230104128272088057519676587986666583808881852814217227628213601444998530249842725234595206451724231979262967335650884326365777356470287467946345934412644176179721180848261386551415577421540255883551834112 = -563955965296 bsl 857. +-1 = -563955965296 bsr 857. +74846914192869903940589 = 74846914187975425696327 + 4894478244262. +74846914183080947452065 = 74846914187975425696327 - 4894478244262. +366336593143190538994560613742225674 = 74846914187975425696327 * 4894478244262. +-74846914187975425696327 = -(74846914187975425696327). +74846914187975425696327 = +(74846914187975425696327). +15292112959 = 74846914187975425696327 div 4894478244262. +1352928105069 = 74846914187975425696327 rem 4894478244262. +27394054 = 74846914187975425696327 band 4894478244262. +74846914192869876546535 = 74846914187975425696327 bor 4894478244262. +74846914192869849152481 = 74846914187975425696327 bxor 4894478244262. +-74846914187975425696328 = bnot(74846914187975425696327). +9355864273496928212040 = 74846914187975425696327 bsl -3. +598775313503803405570616 = 74846914187975425696327 bsr -3. +27729278293582772620091 = 4568124133468954 + 27729273725458639151137. +-27729269157334505682183 = 4568124133468954 - 27729273725458639151137. +126670764508834179830296294753703300698 = 4568124133468954 * 27729273725458639151137. +-4568124133468954 = -(4568124133468954). +4568124133468954 = +(4568124133468954). +0 = 4568124133468954 div 27729273725458639151137. +4568124133468954 = 4568124133468954 rem 27729273725458639151137. +4521193025757184 = 4568124133468954 band 27729273725458639151137. +27729273772389746862907 = 4568124133468954 bor 27729273725458639151137. +27729269251196721105723 = 4568124133468954 bxor 27729273725458639151137. +-4568124133468955 = bnot(4568124133468954). +2338879556336104448 = 4568124133468954 bsl 9. +8922117448181 = 4568124133468954 bsr 9. +613853613779 = -9 + 613853613788. +-613853613797 = -9 - 613853613788. +-5524682524092 = -9 * 613853613788. +9 = -(-9). +-9 = +(-9). +0 = -9 div 613853613788. +-9 = -9 rem 613853613788. +613853613780 = -9 band 613853613788. +-1 = -9 bor 613853613788. +-613853613781 = -9 bxor 613853613788. +8 = bnot(-9). +-2 = -9 bsl -3. +-72 = -9 bsr -3. +-751857743733561031471334097 = -751857796426246214427919613 + 52692685182956585516. +-751857849118931397384505129 = -751857796426246214427919613 - 52692685182956585516. +-39617406169439652737022658089983852693808125308 = -751857796426246214427919613 * 52692685182956585516. +751857796426246214427919613 = -(-751857796426246214427919613). +-751857796426246214427919613 = +(-751857796426246214427919613). +-14268731 = -751857796426246214427919613 div 52692685182956585516. +-45882952911021619417 = -751857796426246214427919613 rem 52692685182956585516. +37686689255231390208 = -751857796426246214427919613 band 52692685182956585516. +-751857781420250286702724305 = -751857796426246214427919613 bor 52692685182956585516. +-751857819106939541934114513 = -751857796426246214427919613 bxor 52692685182956585516. +751857796426246214427919612 = bnot(-751857796426246214427919613). +-1 = -751857796426246214427919613 bsl -515. +-80646119400903926685731137644641022840104071743500325701578097649871103598441439752640723378625217462686403820548821827652110516083907867978512175536328261507327541587791080046198784 = -751857796426246214427919613 bsr -515. +96996894948146060580 = -345647483986177414 + 97342542432132237994. +-97688189916118415408 = -345647483986177414 - 97342542432132237994. +-33646204876484223153688510072955467516 = -345647483986177414 * 97342542432132237994. +345647483986177414 = -(-345647483986177414). +-345647483986177414 = +(-345647483986177414). +0 = -345647483986177414 div 97342542432132237994. +-345647483986177414 = -345647483986177414 rem 97342542432132237994. +96999656947326190122 = -345647483986177414 band 97342542432132237994. +-2761999180129542 = -345647483986177414 bor 97342542432132237994. +-97002418946506319664 = -345647483986177414 bxor 97342542432132237994. +345647483986177413 = bnot(-345647483986177414). +-675092742160503 = -345647483986177414 bsl -9. +-176971511800922835968 = -345647483986177414 bsr -9. +-569275717333336783105837 = -36525449459652 + -569275717296811333646185. +569275717260285884186533 = -36525449459652 - -569275717296811333646185. +20793051440731822236629637395201227620 = -36525449459652 * -569275717296811333646185. +36525449459652 = -(-36525449459652). +-36525449459652 = +(-36525449459652). +0 = -36525449459652 div -569275717296811333646185. +-36525449459652 = -36525449459652 rem -569275717296811333646185. +-569275717332064800602092 = -36525449459652 band -569275717296811333646185. +-1271982503745 = -36525449459652 bor -569275717296811333646185. +569275717330792818098347 = -36525449459652 bxor -569275717296811333646185. +36525449459651 = bnot(-36525449459652). +-1 = -36525449459652 bsl -71. +-86243279150004899242472755634896896 = -36525449459652 bsr -71. +-613417895681019799187662 = 952595656291 + -613417895681972394843953. +613417895682924990500244 = 952595656291 - -613417895681972394843953. +-584339222917812668483720392567758323 = 952595656291 * -613417895681972394843953. +-952595656291 = -(952595656291). +952595656291 = +(952595656291). +0 = 952595656291 div -613417895681972394843953. +952595656291 = 952595656291 rem -613417895681972394843953. +601431744579 = 952595656291 band -613417895681972394843953. +-613417895681621230932241 = 952595656291 bor -613417895681972394843953. +-613417895682222662676820 = 952595656291 bxor -613417895681972394843953. +-952595656292 = bnot(952595656291). +0 = 952595656291 bsl -58. +274567004333241643758732181504 = 952595656291 bsr -58. +-813328478207627017348061145252 = -813328514393849498522623473498 + 36186222481174562328246. +-813328550580071979697185801744 = -813328514393849498522623473498 - 36186222481174562328246. +-29431286572139025330671384515676263999375822557824508 = -813328514393849498522623473498 * 36186222481174562328246. +813328514393849498522623473498 = -(-813328514393849498522623473498). +-813328514393849498522623473498 = +(-813328514393849498522623473498). +-22476192 = -813328514393849498522623473498 div 36186222481174562328246. +-30152253650116999354266 = -813328514393849498522623473498 rem 36186222481174562328246. +16549625396562181163174 = -813328514393849498522623473498 band 36186222481174562328246. +-813328494757252413910242308426 = -813328514393849498522623473498 bor 36186222481174562328246. +-813328511306877810472423471600 = -813328514393849498522623473498 bxor 36186222481174562328246. +813328514393849498522623473497 = bnot(-813328514393849498522623473498). +-13972877480903395438802672539183330885632 = -813328514393849498522623473498 bsl 34. +-47341950377091386968 = -813328514393849498522623473498 bsr 34. +-246978517966895 = 419452542 + -246978937419437. +246979356871979 = 419452542 - -246978937419437. +-103595943121041769858854 = 419452542 * -246978937419437. +-419452542 = -(419452542). +419452542 = +(419452542). +0 = 419452542 div -246978937419437. +419452542 = 419452542 rem -246978937419437. +402653266 = 419452542 band -246978937419437. +-246978920620161 = 419452542 bor -246978937419437. +-246979323273427 = 419452542 bxor -246978937419437. +-419452543 = bnot(419452542). +870262426717854295966065008483023523861908222876206258988889127949838197693295466809932634868090555026014842069068940974580873883527751424812991148802465193116752608480453708173520085712896 = 419452542 bsl 599. +0 = 419452542 bsr 599. +7346833259 = 7356131752 + -9298493. +7365430245 = 7356131752 - -9298493. +-68400939603049736 = 7356131752 * -9298493. +-7356131752 = -(7356131752). +7356131752 = +(7356131752). +-791 = 7356131752 div -9298493. +1023789 = 7356131752 rem -9298493. +7355763072 = 7356131752 band -9298493. +-8929813 = 7356131752 bor -9298493. +-7364692885 = 7356131752 bxor -9298493. +-7356131753 = bnot(7356131752). +0 = 7356131752 bsl -99. +4662502415390368373544927386193285349376 = 7356131752 bsr -99. +87759834593295 = 87759834951214 + -357919. +87759835309133 = 87759834951214 - -357919. +-31410912365903563666 = 87759834951214 * -357919. +-87759834951214 = -(87759834951214). +87759834951214 = +(87759834951214). +-245194680 = 87759834951214 div -357919. +280294 = 87759834951214 rem -357919. +87759834875936 = 87759834951214 band -357919. +-282641 = 87759834951214 bor -357919. +-87759835158577 = 87759834951214 bxor -357919. +-87759834951215 = bnot(87759834951214). +26523782599410241230670220080936124416 = 87759834951214 bsl 78. +0 = 87759834951214 bsr 78. +-2886281968227901 = 657 + -2886281968228558. +2886281968229215 = 657 - -2886281968228558. +-1896287253126162606 = 657 * -2886281968228558. +-657 = -(657). +657 = +(657). +0 = 657 div -2886281968228558. +657 = 657 rem -2886281968228558. +528 = 657 band -2886281968228558. +-2886281968228429 = 657 bor -2886281968228558. +-2886281968228957 = 657 bxor -2886281968228558. +-658 = bnot(657). +0 = 657 bsl -647. +383683006179556129106847967352971699258220944545574895921987773985257444461580933495601243780545665235784703665900995277199677312248788833901055806343359324375239744135000841242169388071170391146496 = 657 bsr -647. +-386217743711406946466 = 58569695 + -386217743711465516161. +386217743711524085856 = 58569695 - -386217743711465516161. +-22620655452768703284567340895 = 58569695 * -386217743711465516161. +-58569695 = -(58569695). +58569695 = +(58569695). +0 = 58569695 div -386217743711465516161. +58569695 = 58569695 rem -386217743711465516161. +20812639 = 58569695 band -386217743711465516161. +-386217743711427759105 = 58569695 bor -386217743711465516161. +-386217743711448571744 = 58569695 bxor -386217743711465516161. +-58569696 = bnot(58569695). +0 = 58569695 bsl -75. +2212700516639182759395076341760 = 58569695 bsr -75. +935526528909122527908635 = -77259628266821 + 935526528986382156175456. +-935526529063641784442277 = -77259628266821 - 935526528986382156175456. +-72278431863237226442629106583259345376 = -77259628266821 * 935526528986382156175456. +77259628266821 = -(-77259628266821). +-77259628266821 = +(-77259628266821). +0 = -77259628266821 div 935526528986382156175456. +-77259628266821 = -77259628266821 rem 935526528986382156175456. +935526528916011801384992 = -77259628266821 band 935526528986382156175456. +-6889273476357 = -77259628266821 bor 935526528986382156175456. +-935526528922901074861349 = -77259628266821 bxor 935526528986382156175456. +77259628266820 = bnot(-77259628266821). +-3060569192057672483181072812828412690300928 = -77259628266821 bsl 95. +-1 = -77259628266821 bsr 95. +-6590 = 91 + -6681. +6772 = 91 - -6681. +-607971 = 91 * -6681. +-91 = -(91). +91 = +(91). +0 = 91 div -6681. +91 = 91 rem -6681. +67 = 91 band -6681. +-6657 = 91 bor -6681. +-6724 = 91 bxor -6681. +-92 = bnot(91). +0 = 91 bsl -834. +10424561026324885878408437351857641210622713058670117520716687691641227297948457114001683472760164728656286861355715898107080457315574709118961989479129506981866686248104433205225115659178348274553194562996355270081238721512852480435990598506756643487744 = 91 bsr -834. +-996686702714 = -996686696237 + -6477. +-996686689760 = -996686696237 - -6477. +6455539731527049 = -996686696237 * -6477. +996686696237 = -(-996686696237). +-996686696237 = +(-996686696237). +153880916 = -996686696237 div -6477. +-3305 = -996686696237 rem -6477. +-996686700397 = -996686696237 band -6477. +-2317 = -996686696237 bor -6477. +996686698080 = -996686696237 bxor -6477. +996686696236 = bnot(-996686696237). +-470182267614744941834464066213763821417723793602057510484725260491419503503826402776606703887379095487930410700653614976462478299254219106840621721874843375463342071648306975473664 = -996686696237 bsl 557. +-1 = -996686696237 bsr 557. +23987 = -72861 + 96848. +-169709 = -72861 - 96848. +-7056442128 = -72861 * 96848. +72861 = -(-72861). +-72861 = +(-72861). +0 = -72861 div 96848. +-72861 = -72861 rem 96848. +25152 = -72861 band 96848. +-1165 = -72861 bor 96848. +-26317 = -72861 bxor 96848. +72860 = bnot(-72861). +-11483478293901992599543452562946255381807659531941531638693522422906990135972233049433019414388679354019246888006979682304 = -72861 bsl 386. +-1 = -72861 bsr 386. +69291931734315477708 = 69291931734273229525 + 42248183. +69291931734230981342 = 69291931734273229525 - 42248183. +2927458212333082772973203075 = 69291931734273229525 * 42248183. +-69291931734273229525 = -(69291931734273229525). +69291931734273229525 = +(69291931734273229525). +1640116256225 = 69291931734273229525 div 42248183. +4540350 = 69291931734273229525 rem 42248183. +8389333 = 69291931734273229525 band 42248183. +69291931734307088375 = 69291931734273229525 bor 42248183. +69291931734298699042 = 69291931734273229525 bxor 42248183. +-69291931734273229526 = bnot(69291931734273229525). +277167726937092918100 = 69291931734273229525 bsl 2. +17322982933568307381 = 69291931734273229525 bsr 2. +-2832927225825495987764600788 = 53892974 + -2832927225825495987818493762. +2832927225825495987872386736 = 53892974 - -2832927225825495987818493762. +-152674873325305583808606401034628188 = 53892974 * -2832927225825495987818493762. +-53892974 = -(53892974). +53892974 = +(53892974). +0 = 53892974 div -2832927225825495987818493762. +53892974 = 53892974 rem -2832927225825495987818493762. +33816622 = 53892974 band -2832927225825495987818493762. +-2832927225825495987798417410 = 53892974 bor -2832927225825495987818493762. +-2832927225825495987832234032 = 53892974 bxor -2832927225825495987818493762. +-53892975 = bnot(53892974). +0 = 53892974 bsl -954. +8206311791222122719336074185028366232549318925851085049614006002078274316481391281454698884993554155752540906133304458402903004243858966440184097786445439478278285019852093783289495160356162789520040176852907588015026362705746248987255627889422108774672178028038905455213511938638920115516604416 = 53892974 bsr -954. +-68611845705004 = -286215 + -68611845418789. +68611845132574 = -286215 - -68611845418789. +19637739336538693635 = -286215 * -68611845418789. +286215 = -(-286215). +-286215 = +(-286215). +0 = -286215 div -68611845418789. +-286215 = -286215 rem -68611845418789. +-68611845422887 = -286215 band -68611845418789. +-282117 = -286215 bor -68611845418789. +68611845140770 = -286215 bxor -68611845418789. +286214 = bnot(-286215). +-436275029945650252199650317932251510839763192091237655245680473241785045032372664532584673480623708264409113813922556919931954276878660438935470080 = -286215 bsl 469. +-1 = -286215 bsr 469. +-512732740390153 = 49352993 + -512732789743146. +512732839096139 = 49352993 - -512732789743146. +-25304897783063956335978 = 49352993 * -512732789743146. +-49352993 = -(49352993). +49352993 = +(49352993). +0 = 49352993 div -512732789743146. +49352993 = 49352993 rem -512732789743146. +3211520 = 49352993 band -512732789743146. +-512732743601673 = 49352993 bor -512732789743146. +-512732746813193 = 49352993 bxor -512732789743146. +-49352994 = bnot(49352993). +0 = 49352993 bsl -74. +932251679890000880576088768512 = 49352993 bsr -74. +531482923494787 = 531448591528994 + 34331965793. +531414259563201 = 531448591528994 - 34331965793. +18245674865111451575702242 = 531448591528994 * 34331965793. +-531448591528994 = -(531448591528994). +531448591528994 = +(531448591528994). +15479 = 531448591528994 div 34331965793. +24093019147 = 531448591528994 rem 34331965793. +6509572128 = 531448591528994 band 34331965793. +531476413922659 = 531448591528994 bor 34331965793. +531469904350531 = 531448591528994 bxor 34331965793. +-531448591528995 = bnot(531448591528994). +1037985530330 = 531448591528994 bsl -9. +272101678862844928 = 531448591528994 bsr -9. +-8489992563173627951104 = -8489992562348759397818 + -824868553286. +-8489992561523890844532 = -8489992562348759397818 - -824868553286. +7003127882313521318655030205129948 = -8489992562348759397818 * -824868553286. +8489992562348759397818 = -(-8489992562348759397818). +-8489992562348759397818 = +(-8489992562348759397818). +10292539979 = -8489992562348759397818 div -824868553286. +-232712576824 = -8489992562348759397818 rem -824868553286. +-8489992562623733790718 = -8489992562348759397818 band -824868553286. +-549894160386 = -8489992562348759397818 bor -824868553286. +8489992562073839630332 = -8489992562348759397818 bxor -824868553286. +8489992562348759397817 = bnot(-8489992562348759397818). +-120650051 = -8489992562348759397818 bsl -46. +-597430114690189927379778990245937152 = -8489992562348759397818 bsr -46. +57476985649093700 = -5453973 + 57476985654547673. +-57476985660001646 = -5453973 - 57476985654547673. +-313477927881290335754829 = -5453973 * 57476985654547673. +5453973 = -(-5453973). +-5453973 = +(-5453973). +0 = -5453973 div 57476985654547673. +-5453973 = -5453973 rem 57476985654547673. +57476985653298249 = -5453973 band 57476985654547673. +-4204549 = -5453973 bor 57476985654547673. +-57476985657502798 = -5453973 bxor 57476985654547673. +5453972 = bnot(-5453973). +-1 = -5453973 bsl -258. +-2526107713255652489211518863283154459432889832307270655903890391297559981606842662912 = -5453973 bsr -258. +-25599391846587506442715334 = -25599391855744375581629931 + 9156869138914597. +-25599391864901244720544528 = -25599391855744375581629931 - 9156869138914597. +-234410281258847347773596153584801468002807 = -25599391855744375581629931 * 9156869138914597. +25599391855744375581629931 = -(-25599391855744375581629931). +-25599391855744375581629931 = +(-25599391855744375581629931). +-2795648978 = -25599391855744375581629931 div 9156869138914597. +-5858042449298065 = -25599391855744375581629931 rem 9156869138914597. +8867702833157 = -25599391855744375581629931 band 9156869138914597. +-25599391846596374145548491 = -25599391855744375581629931 bor 9156869138914597. +-25599391846605241848381648 = -25599391855744375581629931 bxor 9156869138914597. +25599391855744375581629930 = bnot(-25599391855744375581629931). +-3276722157535280074448631168 = -25599391855744375581629931 bsl 7. +-199995248873002934231484 = -25599391855744375581629931 bsr 7. +-6847695562908190 = -6847695562916685 + 8495. +-6847695562925180 = -6847695562916685 - 8495. +-58171173806977239075 = -6847695562916685 * 8495. +6847695562916685 = -(-6847695562916685). +-6847695562916685 = +(-6847695562916685). +-806085410584 = -6847695562916685 div 8495. +-5605 = -6847695562916685 rem 8495. +8227 = -6847695562916685 band 8495. +-6847695562916417 = -6847695562916685 bor 8495. +-6847695562924644 = -6847695562916685 bxor 8495. +6847695562916684 = bnot(-6847695562916685). +-6738305309360558911484947669955640850019842627085458412460504846319924825267906933730937584276189428450798629439606252598836059693897767836404630423790207590427281228188700926861329466744518920219435577244877120735671164418722952535662164634929364198997228429265378305827143680 = -6847695562916685 bsl 867. +-1 = -6847695562916685 bsr 867. +-78957516664711610812330364 = 4787424172 + -78957516664711615599754536. +78957516664711620387178708 = 4787424172 - -78957516664711615599754536. +-378003123841733207931437142913044192 = 4787424172 * -78957516664711615599754536. +-4787424172 = -(4787424172). +4787424172 = +(4787424172). +0 = 4787424172 div -78957516664711615599754536. +4787424172 = 4787424172 rem -78957516664711615599754536. +4299702920 = 4787424172 band -78957516664711615599754536. +-78957516664711615112033284 = 4787424172 bor -78957516664711615599754536. +-78957516664711619411736204 = 4787424172 bxor -78957516664711615599754536. +-4787424173 = bnot(4787424172). +598428021 = 4787424172 bsl -3. +38299393376 = 4787424172 bsr -3. +-68926612091105 = -72337987637636 + 3411375546531. +-75749363184167 = -72337987637636 - 3411375546531. +-246772042112293231084840716 = -72337987637636 * 3411375546531. +72337987637636 = -(-72337987637636). +-72337987637636 = +(-72337987637636). +-21 = -72337987637636 div 3411375546531. +-699101160485 = -72337987637636 rem 3411375546531. +2268914081824 = -72337987637636 band 3411375546531. +-71195526172929 = -72337987637636 bor 3411375546531. +-73464440254753 = -72337987637636 bxor 3411375546531. +72337987637635 = bnot(-72337987637636). +-5337601379034546763031602584879104 = -72337987637636 bsl 66. +-1 = -72337987637636 bsr 66. +366997256288629962285709 = 366997256282391586138967 + 6238376146742. +366997256276153209992225 = 366997256282391586138967 - 6238376146742. +2289466929511832274961970530796295514 = 366997256282391586138967 * 6238376146742. +-366997256282391586138967 = -(366997256282391586138967). +366997256282391586138967 = +(366997256282391586138967). +58828972099 = 366997256282391586138967 div 6238376146742. +2639338387509 = 366997256282391586138967 rem 6238376146742. +35972555542 = 366997256282391586138967 band 6238376146742. +366997256288593989730167 = 366997256282391586138967 bor 6238376146742. +366997256288558017174625 = 366997256282391586138967 bxor 6238376146742. +-366997256282391586138968 = bnot(366997256282391586138967). +62107066059550596845185833471899010129125068295383964890558683963063224157463976245047477053513779620293728948896445559395991275930251116411787149312 = 366997256282391586138967 bsl 416. +0 = 366997256282391586138967 bsr 416. +-907849704 = -832371363 + -75478341. +-756893022 = -832371363 - -75478341. +62826009575148783 = -832371363 * -75478341. +832371363 = -(-832371363). +-832371363 = +(-832371363). +11 = -832371363 div -75478341. +-2109612 = -832371363 rem -75478341. +-905969639 = -832371363 band -75478341. +-1880065 = -832371363 bor -75478341. +904089574 = -832371363 bxor -75478341. +832371362 = bnot(-832371363). +-67168464082180747975884535694311826060656310067695512550203247399763807063777091066513318216137651486880217824718100934881705984 = -832371363 bsl 395. +-1 = -832371363 bsr 395. +33349 = 33351 + -2. +33353 = 33351 - -2. +-66702 = 33351 * -2. +-33351 = -(33351). +33351 = +(33351). +-16675 = 33351 div -2. +1 = 33351 rem -2. +33350 = 33351 band -2. +-1 = 33351 bor -2. +-33351 = 33351 bxor -2. +-33352 = bnot(33351). +1067232 = 33351 bsl 5. +1042 = 33351 bsr 5. +-489348 = 377 + -489725. +490102 = 377 - -489725. +-184626325 = 377 * -489725. +-377 = -(377). +377 = +(377). +0 = 377 div -489725. +377 = 377 rem -489725. +257 = 377 band -489725. +-489605 = 377 bor -489725. +-489862 = 377 bxor -489725. +-378 = bnot(377). +23 = 377 bsl -4. +6032 = 377 bsr -4. +49559794142498886273111105 = -8485389 + 49559794142498886281596494. +-49559794142498886290081883 = -8485389 - 49559794142498886281596494. +-420534132059024482166109792626166 = -8485389 * 49559794142498886281596494. +8485389 = -(-8485389). +-8485389 = +(-8485389). +0 = -8485389 div 49559794142498886281596494. +-8485389 = -8485389 rem 49559794142498886281596494. +49559794142498886281593922 = -8485389 band 49559794142498886281596494. +-8482817 = -8485389 bor 49559794142498886281596494. +-49559794142498886290076739 = -8485389 bxor 49559794142498886281596494. +8485388 = bnot(-8485389). +-16574 = -8485389 bsl -9. +-4344519168 = -8485389 bsr -9. +-2286769281656285670353 = -44554 + -2286769281656285625799. +2286769281656285581245 = -44554 - -2286769281656285625799. +101884718574914149771848646 = -44554 * -2286769281656285625799. +44554 = -(-44554). +-44554 = +(-44554). +0 = -44554 div -2286769281656285625799. +-44554 = -44554 rem -2286769281656285625799. +-2286769281656285626320 = -44554 band -2286769281656285625799. +-44033 = -44554 bor -2286769281656285625799. +2286769281656285582287 = -44554 bxor -2286769281656285625799. +44553 = bnot(-44554). +-1 = -44554 bsl -591. +-361088899718601094284300429607218738129313534045565495395325227865307315155645917099008882536697778224055407500156045627407096798855266088022640276092018629127585730603029014293512192 = -44554 bsr -591. +49523073771743412 = 54281959185659176 + -4758885413915764. +59040844599574940 = 54281959185659176 - -4758885413915764. +-258321623807404275527695677650464 = 54281959185659176 * -4758885413915764. +-54281959185659176 = -(54281959185659176). +54281959185659176 = +(54281959185659176). +-11 = 54281959185659176 div -4758885413915764. +1934219632585772 = 54281959185659176 rem -4758885413915764. +54061892131369224 = 54281959185659176 band -4758885413915764. +-4538818359625812 = 54281959185659176 bor -4758885413915764. +-58600710490995036 = 54281959185659176 bxor -4758885413915764. +-54281959185659177 = bnot(54281959185659176). +0 = 54281959185659176 bsl -78. +16405715499702717044095293200073169567744 = 54281959185659176 bsr -78. +75484079292225385591313 = 75491318149378877719244 + -7238857153492127931. +75498557006532369847175 = 75491318149378877719244 - -7238857153492127931. +-546470868412181397694378331179405548604164 = 75491318149378877719244 * -7238857153492127931. +-75491318149378877719244 = -(75491318149378877719244). +75491318149378877719244 = +(75491318149378877719244). +-10428 = 75491318149378877719244 div -7238857153492127931. +4515752762967654776 = 75491318149378877719244 rem -7238857153492127931. +75484079573734998934084 = 75491318149378877719244 band -7238857153492127931. +-281509613342771 = 75491318149378877719244 bor -7238857153492127931. +-75484079855244612276855 = 75491318149378877719244 bxor -7238857153492127931. +-75491318149378877719245 = bnot(75491318149378877719244). +38651554892481985392252928 = 75491318149378877719244 bsl 9. +147443980760505620545 = 75491318149378877719244 bsr 9. +846314546781048692419533467 = -44582885879577817 + 846314546825631578299111284. +-846314546870214464178689101 = -44582885879577817 - 846314546825631578299111284. +-37731144859353749299911077263371216220787028 = -44582885879577817 * 846314546825631578299111284. +44582885879577817 = -(-44582885879577817). +-44582885879577817 = +(-44582885879577817). +0 = -44582885879577817 div 846314546825631578299111284. +-44582885879577817 = -44582885879577817 rem 846314546825631578299111284. +846314546788968766774706980 = -44582885879577817 band 846314546825631578299111284. +-7920074355173513 = -44582885879577817 bor 846314546825631578299111284. +-846314546796888841129880493 = -44582885879577817 bxor 846314546825631578299111284. +44582885879577816 = bnot(-44582885879577817). +-1 = -44582885879577817 bsl -216. +-4695125881176098779573626983064072496921988771806705828324879944082052820250918912 = -44582885879577817 bsr -216. +-23378346714231806796 = -58913948147 + -23378346655317858649. +23378346596403910502 = -58913948147 - -23378346655317858649. +1377310702613987206250261473403 = -58913948147 * -23378346655317858649. +58913948147 = -(-58913948147). +-58913948147 = +(-58913948147). +0 = -58913948147 div -23378346655317858649. +-58913948147 = -58913948147 rem -23378346655317858649. +-23378346675274488315 = -58913948147 band -23378346655317858649. +-38957318481 = -58913948147 bor -23378346655317858649. +23378346636317169834 = -58913948147 bxor -23378346655317858649. +58913948146 = bnot(-58913948147). +-7540985362816 = -58913948147 bsl 7. +-460265220 = -58913948147 bsr 7. +-995879234083410706492793 = -84936519757496 + -995879233998474186735297. +995879233913537666977801 = -84936519757496 - -995879233998474186735297. +84586516234591384969560304166383536312 = -84936519757496 * -995879233998474186735297. +84936519757496 = -(-84936519757496). +-84936519757496 = +(-84936519757496). +0 = -84936519757496 div -995879233998474186735297. +-84936519757496 = -84936519757496 rem -995879233998474186735297. +-995879234069068735495928 = -84936519757496 band -995879233998474186735297. +-14341970996865 = -84936519757496 bor -995879233998474186735297. +995879234054726764499063 = -84936519757496 bxor -995879233998474186735297. +84936519757495 = bnot(-84936519757496). +-21234129939374 = -84936519757496 bsl -2. +-339746079029984 = -84936519757496 bsr -2. +9738893580548867195 = -42543967528973 + 9738936124516396168. +-9738978668483925141 = -42543967528973 - 9738936124516396168. +-414332982248167708124130086175464 = -42543967528973 * 9738936124516396168. +42543967528973 = -(-42543967528973). +-42543967528973 = +(-42543967528973). +0 = -42543967528973 div 9738936124516396168. +-42543967528973 = -42543967528973 rem 9738936124516396168. +9738893793318700160 = -42543967528973 band 9738936124516396168. +-212769832965 = -42543967528973 bor 9738936124516396168. +-9738894006088533125 = -42543967528973 bxor 9738936124516396168. +42543967528972 = bnot(-42543967528973). +-340351740231784 = -42543967528973 bsl 3. +-5317995941122 = -42543967528973 bsr 3. +-71223385482623257918611962250 = -71223385482623257918611962322 + 72. +-71223385482623257918611962394 = -71223385482623257918611962322 - 72. +-5128083754748874570140061287184 = -71223385482623257918611962322 * 72. +71223385482623257918611962322 = -(-71223385482623257918611962322). +-71223385482623257918611962322 = +(-71223385482623257918611962322). +-989213687258656359980721698 = -71223385482623257918611962322 div 72. +-66 = -71223385482623257918611962322 rem 72. +8 = -71223385482623257918611962322 band 72. +-71223385482623257918611962258 = -71223385482623257918611962322 bor 72. +-71223385482623257918611962266 = -71223385482623257918611962322 bxor 72. +71223385482623257918611962321 = bnot(-71223385482623257918611962322). +-176340561244792838116701740498131728651107744015770976256 = -71223385482623257918611962322 bsl 91. +-29 = -71223385482623257918611962322 bsr 91. +87477546472702745 = 87516898231171237 + -39351758468492. +87556249989639729 = 87516898231171237 - -39351758468492. +-3443943841104645261102521164604 = 87516898231171237 * -39351758468492. +-87516898231171237 = -(87516898231171237). +87516898231171237 = +(87516898231171237). +-2223 = 87516898231171237 div -39351758468492. +37939155713521 = 87516898231171237 rem -39351758468492. +87481705092876324 = 87516898231171237 band -39351758468492. +-4158620173579 = 87516898231171237 bor -39351758468492. +-87485863713049903 = 87516898231171237 bxor -39351758468492. +-87516898231171238 = bnot(87516898231171237). +0 = 87516898231171237 bsl -322. +747739840183165556231747713118623014305740385103595472270217127206668955381854797942139748885855913209911257858048 = 87516898231171237 bsr -322. +-2572165226296481 = -2572165226297448 + 967. +-2572165226298415 = -2572165226297448 - 967. +-2487283773829632216 = -2572165226297448 * 967. +2572165226297448 = -(-2572165226297448). +-2572165226297448 = +(-2572165226297448). +-2659943357081 = -2572165226297448 div 967. +-121 = -2572165226297448 rem 967. +896 = -2572165226297448 band 967. +-2572165226297377 = -2572165226297448 bor 967. +-2572165226298273 = -2572165226297448 bxor 967. +2572165226297447 = bnot(-2572165226297448). +-1 = -2572165226297448 bsl -277. +-624608171349100629421385803006244944484997667512182838365822583265372804924905146864213810642681856 = -2572165226297448 bsr -277. +-7256638636891165207778490262 = -7184166541211583221336 + -7256631452724623996195268926. +7256624268558082784612047590 = -7184166541211583221336 - -7256631452724623996195268926. +52132848884567848459087375659910565373045901005136 = -7184166541211583221336 * -7256631452724623996195268926. +7184166541211583221336 = -(-7184166541211583221336). +-7184166541211583221336 = +(-7184166541211583221336). +0 = -7184166541211583221336 div -7256631452724623996195268926. +-7184166541211583221336 = -7184166541211583221336 rem -7256631452724623996195268926. +-7256633891158678290607239040 = -7184166541211583221336 band -7256631452724623996195268926. +-4745732486917171251222 = -7184166541211583221336 bor -7256631452724623996195268926. +7256629145426191373435987818 = -7184166541211583221336 bxor -7256631452724623996195268926. +7184166541211583221335 = bnot(-7184166541211583221336). +-1 = -7184166541211583221336 bsl -351. +-32953752038621890334425178917985074997854170453384134811778334942985990684658696341917651315139497320317419007913299938092515328 = -7184166541211583221336 bsr -351. +-3462186111954578 = -67714158933844334 + 64251972821889756. +-131966131755734090 = -67714158933844334 - 64251972821889756. +-4350768299474489564409187813242504 = -67714158933844334 * 64251972821889756. +67714158933844334 = -(-67714158933844334). +-67714158933844334 = +(-67714158933844334). +-1 = -67714158933844334 div 64251972821889756. +-3462186111954578 = -67714158933844334 rem 64251972821889756. +1201027477574288 = -67714158933844334 band 64251972821889756. +-4663213589528866 = -67714158933844334 bor 64251972821889756. +-5864241067103154 = -67714158933844334 bxor 64251972821889756. +67714158933844333 = bnot(-67714158933844334). +-1 = -67714158933844334 bsl -374. +-2605540732319311553167826272165063781607477544645504809702612489304829956429336753861030327061751678134696824627057563959721721856 = -67714158933844334 bsr -374. +-9652719261564706635 = -9748574598338171976 + 95855336773465341. +-9844429935111637317 = -9748574598338171976 - 95855336773465341. +-934452901184955092352836156733483816 = -9748574598338171976 * 95855336773465341. +9748574598338171976 = -(-9748574598338171976). +-9748574598338171976 = +(-9748574598338171976). +-101 = -9748574598338171976 div 95855336773465341. +-67185584218172535 = -9748574598338171976 rem 95855336773465341. +5641634999967928 = -9748574598338171976 band 95855336773465341. +-9658360896564674563 = -9748574598338171976 bor 95855336773465341. +-9664002531564642491 = -9748574598338171976 bxor 95855336773465341. +9748574598338171975 = bnot(-9748574598338171976). +-93275643364251906664796184423084838717559727181712738294726887614128686525946534428737553711187915471796433618576288688299419188855051822432041930762382413770591440466736418794551446453706979125411803145109989230641152 = -9748574598338171976 bsl 661. +-1 = -9748574598338171976 bsr 661. +64322201122929545141550 = 64919146984647711792883 + -596945861718166651333. +65516092846365878444216 = 64919146984647711792883 - -596945861718166651333. +-38753216138758848495241667646258677771863039 = 64919146984647711792883 * -596945861718166651333. +-64919146984647711792883 = -(64919146984647711792883). +64919146984647711792883 = +(64919146984647711792883). +-108 = 64919146984647711792883 div -596945861718166651333. +448993919085713448919 = 64919146984647711792883 rem -596945861718166651333. +64323950833336603647539 = 64919146984647711792883 band -596945861718166651333. +-1749710407058505989 = 64919146984647711792883 bor -596945861718166651333. +-64325700543743662153528 = 64919146984647711792883 bxor -596945861718166651333. +-64919146984647711792884 = bnot(64919146984647711792883). +0 = 64919146984647711792883 bsl -342. +581609272502131059560435752570029234159994619290776929561934516217066618271246715576422981086520311125732738535288214055288832 = 64919146984647711792883 bsr -342. +-5251933002520669 = -5318314627357648 + 66381624836979. +-5384696252194627 = -5318314627357648 - 66381624836979. +-353038366358273161551528865392 = -5318314627357648 * 66381624836979. +5318314627357648 = -(-5318314627357648). +-5318314627357648 = +(-5318314627357648). +-80 = -5318314627357648 div 66381624836979. +-7784640399328 = -5318314627357648 rem 66381624836979. +26410307616816 = -5318314627357648 band 66381624836979. +-5278343310137485 = -5318314627357648 bor 66381624836979. +-5304753617754301 = -5318314627357648 bxor 66381624836979. +5318314627357647 = bnot(-5318314627357648). +-83098666052464 = -5318314627357648 bsl -6. +-340372136150889472 = -5318314627357648 bsr -6. +-57081174464 = 32783127 + -57113957591. +57146740718 = 32783127 - -57113957591. +-1872374125178367057 = 32783127 * -57113957591. +-32783127 = -(32783127). +32783127 = +(32783127). +0 = 32783127 div -57113957591. +32783127 = 32783127 rem -57113957591. +28584705 = 32783127 band -57113957591. +-57109759169 = 32783127 bor -57113957591. +-57138343874 = 32783127 bxor -57113957591. +-32783128 = bnot(32783127). +0 = 32783127 bsl -335. +2294557385324912875494980346220154405065163305775677015722414843609744103577089254776917819792648174080884736 = 32783127 bsr -335. +-614181602134994308355643270 = -614181598438261869879976828 + -3696732438475666442. +-614181594741529431404310386 = -614181598438261869879976828 - -3696732438475666442. +2270465038061558370394846287066022208817205976 = -614181598438261869879976828 * -3696732438475666442. +614181598438261869879976828 = -(-614181598438261869879976828). +-614181598438261869879976828 = +(-614181598438261869879976828). +166141750 = -614181598438261869879976828 div -3696732438475666442. +-1828147314789823328 = -614181598438261869879976828 rem -3696732438475666442. +-614181599683582487689394044 = -614181598438261869879976828 band -3696732438475666442. +-2451411820666249226 = -614181598438261869879976828 bor -3696732438475666442. +614181597232170667023144818 = -614181598438261869879976828 bxor -3696732438475666442. +614181598438261869879976827 = bnot(-614181598438261869879976828). +-4798293737798920858437319 = -614181598438261869879976828 bsl -7. +-78615244600097519344637033984 = -614181598438261869879976828 bsr -7. +-3462738347991127928203 = -456319 + -3462738347991127471884. +3462738347991127015565 = -456319 - -3462738347991127471884. +1580113300216963296842634996 = -456319 * -3462738347991127471884. +456319 = -(-456319). +-456319 = +(-456319). +0 = -456319 div -3462738347991127471884. +-456319 = -456319 rem -3462738347991127471884. +-3462738347991127488384 = -456319 band -3462738347991127471884. +-439819 = -456319 bor -3462738347991127471884. +3462738347991127048565 = -456319 bxor -3462738347991127471884. +456318 = bnot(-456319). +-1 = -456319 bsl -394. +-18411401283105313136299990322644412116910265901219350689865213233082371597360983704565705280678737735984373430178627553591296 = -456319 bsr -394. +7848387228643692381463657 = 7848387228643692381462858 + 799. +7848387228643692381462059 = 7848387228643692381462858 - 799. +6270861395686310212788823542 = 7848387228643692381462858 * 799. +-7848387228643692381462858 = -(7848387228643692381462858). +7848387228643692381462858 = +(7848387228643692381462858). +9822762488915760177049 = 7848387228643692381462858 div 799. +707 = 7848387228643692381462858 rem 799. +266 = 7848387228643692381462858 band 799. +7848387228643692381463391 = 7848387228643692381462858 bor 799. +7848387228643692381463125 = 7848387228643692381462858 bxor 799. +-7848387228643692381462859 = bnot(7848387228643692381462858). +13941536331 = 7848387228643692381462858 bsl -49. +4418249224797386599965305306964553629696 = 7848387228643692381462858 bsr -49. +-5549579159671479070701 = -92853964 + -5549579159671386216737. +5549579159671293362773 = -92853964 - -5549579159671386216737. +515300423507277147598993595468 = -92853964 * -5549579159671386216737. +92853964 = -(-92853964). +-92853964 = +(-92853964). +0 = -92853964 div -5549579159671386216737. +-92853964 = -92853964 rem -5549579159671386216737. +-5549579159671453376492 = -92853964 band -5549579159671386216737. +-25694209 = -92853964 bor -5549579159671386216737. +5549579159671427682283 = -92853964 bxor -5549579159671386216737. +92853963 = bnot(-92853964). +-1 = -92853964 bsl -735. +-16782136989272980093816490385033612560449506270868835380490349714294723959512373280455297308712315539869175004841888273922635762863717436251445878139037165327133779761272117074039733622046904552059825139314096655650358806553034752 = -92853964 bsr -735. +7873498039473 = 7873498115865 + -76392. +7873498192257 = 7873498115865 - -76392. +-601472268067159080 = 7873498115865 * -76392. +-7873498115865 = -(7873498115865). +7873498115865 = +(7873498115865). +-103067050 = 7873498115865 div -76392. +32265 = 7873498115865 rem -76392. +7873498105112 = 7873498115865 band -76392. +-65639 = 7873498115865 bor -76392. +-7873498170751 = 7873498115865 bxor -76392. +-7873498115866 = bnot(7873498115865). +1082125341208249400033280 = 7873498115865 bsl 37. +57 = 7873498115865 bsr 37. +-467100769590 = -628469971 + -466472299619. +465843829648 = -628469971 - -466472299619. +293163832613856241049 = -628469971 * -466472299619. +628469971 = -(-628469971). +-628469971 = +(-628469971). +0 = -628469971 div -466472299619. +-628469971 = -628469971 rem -466472299619. +-467077692659 = -628469971 band -466472299619. +-23076931 = -628469971 bor -466472299619. +467054615728 = -628469971 bxor -466472299619. +628469970 = bnot(-628469971). +-5398515943926136832 = -628469971 bsl 33. +-1 = -628469971 bsr 33. +-7456232186824215298555595 = -97 + -7456232186824215298555498. +7456232186824215298555401 = -97 - -7456232186824215298555498. +723254522121948883959883306 = -97 * -7456232186824215298555498. +97 = -(-97). +-97 = +(-97). +0 = -97 div -7456232186824215298555498. +-97 = -97 rem -7456232186824215298555498. +-7456232186824215298555498 = -97 band -7456232186824215298555498. +-97 = -97 bor -7456232186824215298555498. +7456232186824215298555401 = -97 bxor -7456232186824215298555498. +96 = bnot(-97). +-1 = -97 bsl -778. +-154208517072044817110477834630003453808555974308167240991219760833051589028432443365473490592131797361866045314684635239422610702621836283873378166455290440194900103858198979418496750291215410327603723183913469408088684692295841394720768 = -97 bsr -778. +-66178579725227678922255570214 = 45732325748 + -66178579725227678967987895962. +66178579725227679013720221710 = 45732325748 - -66178579725227678967987895962. +-3026500365534100548029990922255317829576 = 45732325748 * -66178579725227678967987895962. +-45732325748 = -(45732325748). +45732325748 = +(45732325748). +0 = 45732325748 div -66178579725227678967987895962. +45732325748 = 45732325748 rem -66178579725227678967987895962. +8590524772 = 45732325748 band -66178579725227678967987895962. +-66178579725227678930846094986 = 45732325748 bor -66178579725227678967987895962. +-66178579725227678939436619758 = 45732325748 bxor -66178579725227678967987895962. +-45732325749 = bnot(45732325748). +5716540718 = 45732325748 bsl -3. +365858605984 = 45732325748 bsr -3. +-37712225963798 = -37712225963791 + -7. +-37712225963784 = -37712225963791 - -7. +263985581746537 = -37712225963791 * -7. +37712225963791 = -(-37712225963791). +-37712225963791 = +(-37712225963791). +5387460851970 = -37712225963791 div -7. +-1 = -37712225963791 rem -7. +-37712225963791 = -37712225963791 band -7. +-7 = -37712225963791 bor -7. +37712225963784 = -37712225963791 bxor -7. +37712225963790 = bnot(-37712225963791). +-5061649286682638286848 = -37712225963791 bsl 27. +-280978 = -37712225963791 bsr 27. +-40228549198831930 = 4349648727446694 + -44578197926278624. +48927846653725318 = 4349648727446694 - -44578197926278624. +-193899501881904670273392751669056 = 4349648727446694 * -44578197926278624. +-4349648727446694 = -(4349648727446694). +4349648727446694 = +(4349648727446694). +0 = 4349648727446694 div -44578197926278624. +4349648727446694 = 4349648727446694 rem -44578197926278624. +317041655414816 = 4349648727446694 band -44578197926278624. +-40545590854246746 = 4349648727446694 bor -44578197926278624. +-40862632509661562 = 4349648727446694 bxor -44578197926278624. +-4349648727446695 = bnot(4349648727446694). +6752908344513747637690457064417473670326630538753659067616117393202915830263445258130617408615993113903675936677510161499392289297220214035812746737076986874754312746973700128193439161869643768009306177595926894863094335723318300478027259459928064 = 4349648727446694 bsl 768. +0 = 4349648727446694 bsr 768. +848583217115039357 = 848583134997193418 + 82117845939. +848583052879347479 = 848583134997193418 - 82117845939. +69683819146133168296708829502 = 848583134997193418 * 82117845939. +-848583134997193418 = -(848583134997193418). +848583134997193418 = +(848583134997193418). +10333723 = 848583134997193418 div 82117845939. +61706892521 = 848583134997193418 rem 82117845939. +73056395906 = 848583134997193418 band 82117845939. +848583144058643451 = 848583134997193418 bor 82117845939. +848583071002247545 = 848583134997193418 bxor 82117845939. +-848583134997193419 = bnot(848583134997193418). +5 = 848583134997193418 bsl -57. +122293718098119922577138408275050496 = 848583134997193418 bsr -57. +-569568392787 = -569568392782 + -5. +-569568392777 = -569568392782 - -5. +2847841963910 = -569568392782 * -5. +569568392782 = -(-569568392782). +-569568392782 = +(-569568392782). +113913678556 = -569568392782 div -5. +-2 = -569568392782 rem -5. +-569568392782 = -569568392782 band -5. +-5 = -569568392782 bor -5. +569568392777 = -569568392782 bxor -5. +569568392781 = bnot(-569568392782). +-9113094284512 = -569568392782 bsl 4. +-35598024549 = -569568392782 bsr 4. +65335161399831779703913704 = 57185822923562963328294152 + 8149338476268816375619552. +49036484447294146952674600 = 57185822923562963328294152 - 8149338476268816375619552. +466026627048086949714978241189501601930310298459904 = 57185822923562963328294152 * 8149338476268816375619552. +-57185822923562963328294152 = -(57185822923562963328294152). +57185822923562963328294152 = +(57185822923562963328294152). +7 = 57185822923562963328294152 div 8149338476268816375619552. +140453589681248698957288 = 57185822923562963328294152 rem 8149338476268816375619552. +7317611534847486666611968 = 57185822923562963328294152 band 8149338476268816375619552. +58017549864984293037301736 = 57185822923562963328294152 bor 8149338476268816375619552. +50699938330136806370689768 = 57185822923562963328294152 bxor 8149338476268816375619552. +-57185822923562963328294153 = bnot(57185822923562963328294152). +29279141336864237224086605824 = 57185822923562963328294152 bsl 9. +111691060397583912750574 = 57185822923562963328294152 bsr 9. +499824736561663365 = -2773 + 499824736561666138. +-499824736561668911 = -2773 - 499824736561666138. +-1386013994485500200674 = -2773 * 499824736561666138. +2773 = -(-2773). +-2773 = +(-2773). +0 = -2773 div 499824736561666138. +-2773 = -2773 rem 499824736561666138. +499824736561664010 = -2773 band 499824736561666138. +-645 = -2773 bor 499824736561666138. +-499824736561664655 = -2773 bxor 499824736561666138. +2772 = bnot(-2773). +-790727989541646708830748053912931740245557665662516042968506303258418127416853899548806014111441930724135945277973580717033736137023380598072164364974356246501423827000063419161238133443739516928 = -2773 bsl 636. +-1 = -2773 bsr 636. +-5636784153952403932489085934 = -5636784153952933259926817425 + 529327437731491. +-5636784153953462587364548916 = -5636784153952933259926817425 - 529327437731491. +-2983704513257376458668302178379317330030675 = -5636784153952933259926817425 * 529327437731491. +5636784153952933259926817425 = -(-5636784153952933259926817425). +-5636784153952933259926817425 = +(-5636784153952933259926817425). +-10648955168676 = -5636784153952933259926817425 div 529327437731491. +-148631224841509 = -5636784153952933259926817425 rem 529327437731491. +423630351897635 = -5636784153952933259926817425 band 529327437731491. +-5636784153952827562840983569 = -5636784153952933259926817425 bor 529327437731491. +-5636784153953251193192881204 = -5636784153952933259926817425 bxor 529327437731491. +5636784153952933259926817424 = bnot(-5636784153952933259926817425). +-3098854860267376316756012568798455398400 = -5636784153952933259926817425 bsl 39. +-10253250646115582 = -5636784153952933259926817425 bsr 39. +56279753385219477533778544977 = -94599 + 56279753385219477533778639576. +-56279753385219477533778734175 = -94599 - 56279753385219477533778639576. +-5324008390488377355217925525250024 = -94599 * 56279753385219477533778639576. +94599 = -(-94599). +-94599 = +(-94599). +0 = -94599 div 56279753385219477533778639576. +-94599 = -94599 rem 56279753385219477533778639576. +56279753385219477533778545240 = -94599 band 56279753385219477533778639576. +-263 = -94599 bor 56279753385219477533778639576. +-56279753385219477533778545503 = -94599 bxor 56279753385219477533778639576. +94598 = bnot(-94599). +-1 = -94599 bsl -222. +-637595998691445843483926240054242510523850056306978904034980106491396096 = -94599 bsr -222. +617541146396428695254820 = 9829596 + 617541146396428685425224. +-617541146396428675595628 = 9829596 - 617541146396428685425224. +6070179982453749820541040129504 = 9829596 * 617541146396428685425224. +-9829596 = -(9829596). +9829596 = +(9829596). +0 = 9829596 div 617541146396428685425224. +9829596 = 9829596 rem 617541146396428685425224. +14408 = 9829596 band 617541146396428685425224. +617541146396428695240412 = 9829596 bor 617541146396428685425224. +617541146396428695226004 = 9829596 bxor 617541146396428685425224. +-9829597 = bnot(9829596). +0 = 9829596 bsl -781. +125015045161014717203289441762288117900434356357580493144604519274682108643919458274266784431377843036784250025653017056568044245117426098854979177853711924930146744848176268478031998571177718143882247174738400267205847645084736774447973793792 = 9829596 bsr -781. +660109205356653082434571 = 8611421642786154821912 + 651497783713866927612659. +-642886362071080772790747 = 8611421642786154821912 - 651497783713866927612659. +5610322114900806920083336854208274531461784008 = 8611421642786154821912 * 651497783713866927612659. +-8611421642786154821912 = -(8611421642786154821912). +8611421642786154821912 = +(8611421642786154821912). +0 = 8611421642786154821912 div 651497783713866927612659. +8611421642786154821912 = 8611421642786154821912 rem 651497783713866927612659. +8573375208632380563472 = 8611421642786154821912 band 651497783713866927612659. +651535830148020701871099 = 8611421642786154821912 bor 651497783713866927612659. +642962454939388321307627 = 8611421642786154821912 bxor 651497783713866927612659. +-8611421642786154821913 = bnot(8611421642786154821912). +1301321245944051079661665054096505666025816064 = 8611421642786154821912 bsl 77. +0 = 8611421642786154821912 bsr 77. +377194245837736757882924482170 = 377194245837736846762764359958 + -88879839877788. +377194245837736935642604237746 = 377194245837736846762764359958 - -88879839877788. +-33524964172881053730057518754198488760812904 = 377194245837736846762764359958 * -88879839877788. +-377194245837736846762764359958 = -(377194245837736846762764359958). +377194245837736846762764359958 = +(377194245837736846762764359958). +-4243867297200223 = 377194245837736846762764359958 div -88879839877788. +88683878013234 = 377194245837736846762764359958 rem -88879839877788. +377194245837736828345893732612 = 377194245837736846762764359958 band -88879839877788. +-70462969250442 = 377194245837736846762764359958 bor -88879839877788. +-377194245837736898808862983054 = 377194245837736846762764359958 bxor -88879839877788. +-377194245837736846762764359959 = bnot(377194245837736846762764359958). +12070215866807579096408459518656 = 377194245837736846762764359958 bsl 5. +11787320182429276461336386248 = 377194245837736846762764359958 bsr 5. +-4741322768177 = -4741322797952 + 29775. +-4741322827727 = -4741322797952 - 29775. +-141172886309020800 = -4741322797952 * 29775. +4741322797952 = -(-4741322797952). +-4741322797952 = +(-4741322797952). +-159238381 = -4741322797952 div 29775. +-3677 = -4741322797952 rem 29775. +1024 = -4741322797952 band 29775. +-4741322769201 = -4741322797952 bor 29775. +-4741322770225 = -4741322797952 bxor 29775. +4741322797951 = bnot(-4741322797952). +-2427557272551424 = -4741322797952 bsl 9. +-9260396090 = -4741322797952 bsr 9. +99364986943748632704689 = 99364986943748642619248 + -9914559. +99364986943748652533807 = 99364986943748642619248 - -9914559. +-985160025588025598418448831632 = 99364986943748642619248 * -9914559. +-99364986943748642619248 = -(99364986943748642619248). +99364986943748642619248 = +(99364986943748642619248). +-10022128764753797 = 99364986943748642619248 div -9914559. +1788725 = 99364986943748642619248 rem -9914559. +99364986943748641437504 = 99364986943748642619248 band -9914559. +-8732815 = 99364986943748642619248 bor -9914559. +-99364986943748650170319 = 99364986943748642619248 bxor -9914559. +-99364986943748642619249 = bnot(99364986943748642619248). +3179679582199956563815936 = 99364986943748642619248 bsl 5. +3105155841992145081851 = 99364986943748642619248 bsr 5. +8667485381021 = 8667485389556 + -8535. +8667485398091 = 8667485389556 - -8535. +-73976987799860460 = 8667485389556 * -8535. +-8667485389556 = -(8667485389556). +8667485389556 = +(8667485389556). +-1015522599 = 8667485389556 div -8535. +7091 = 8667485389556 rem -8535. +8667485389472 = 8667485389556 band -8535. +-8451 = 8667485389556 bor -8535. +-8667485397923 = 8667485389556 bxor -8535. +-8667485389557 = bnot(8667485389556). +277359532465792 = 8667485389556 bsl 5. +270858918423 = 8667485389556 bsr 5. +6134725647932282021187 = 6134686373166524876423 + 39274765757144764. +6134647098400767731659 = 6134686373166524876423 - 39274765757144764. +240938370299663236613351775854421499172 = 6134686373166524876423 * 39274765757144764. +-6134686373166524876423 = -(6134686373166524876423). +6134686373166524876423 = +(6134686373166524876423). +156199 = 6134686373166524876423 div 39274765757144764. +7236666269884387 = 6134686373166524876423 rem 39274765757144764. +36028938685990532 = 6134686373166524876423 band 39274765757144764. +6134689618993596030655 = 6134686373166524876423 bor 39274765757144764. +6134653590054910040123 = 6134686373166524876423 bxor 39274765757144764. +-6134686373166524876424 = bnot(6134686373166524876423). +1533671593291631219105 = 6134686373166524876423 bsl -2. +24538745492666099505692 = 6134686373166524876423 bsr -2. +796190 = 796128 + 62. +796066 = 796128 - 62. +49359936 = 796128 * 62. +-796128 = -(796128). +796128 = +(796128). +12840 = 796128 div 62. +48 = 796128 rem 62. +32 = 796128 band 62. +796158 = 796128 bor 62. +796126 = 796128 bxor 62. +-796129 = bnot(796128). +458936545809819934654464 = 796128 bsl 59. +0 = 796128 bsr 59. +-4853967239688694934843182549 = -4853967239688771551186895246 + 76616343712697. +-4853967239688848167530607943 = -4853967239688771551186895246 - 76616343712697. +-371893222406166024238845641488852059138462 = -4853967239688771551186895246 * 76616343712697. +4853967239688771551186895246 = -(-4853967239688771551186895246). +-4853967239688771551186895246 = +(-4853967239688771551186895246). +-63354201002995 = -4853967239688771551186895246 div 76616343712697. +-13611670367731 = -4853967239688771551186895246 rem 76616343712697. +1142467605040 = -4853967239688771551186895246 band 76616343712697. +-4853967239688696077310787589 = -4853967239688771551186895246 bor 76616343712697. +-4853967239688697219778392629 = -4853967239688771551186895246 bxor 76616343712697. +4853967239688771551186895245 = bnot(-4853967239688771551186895246). +-1 = -4853967239688771551186895246 bsl -666. +-1486188693811800700044646223823865461549051074643879329904045362554983936403642602692697466395741062471646174962499126670468038568597407402903708616589970221885698780048932809206830445140876586892595078611386751158397833675014144 = -4853967239688771551186895246 bsr -666. +-374855932158674925467 = 797 + -374855932158674926264. +374855932158674927061 = 797 - -374855932158674926264. +-298760177930463916232408 = 797 * -374855932158674926264. +-797 = -(797). +797 = +(797). +0 = 797 div -374855932158674926264. +797 = 797 rem -374855932158674926264. +264 = 797 band -374855932158674926264. +-374855932158674925731 = 797 bor -374855932158674926264. +-374855932158674925995 = 797 bxor -374855932158674926264. +-798 = bnot(797). +13371441152 = 797 bsl 24. +0 = 797 bsr 24. +-57766182273728 = 9255 + -57766182282983. +57766182292238 = 9255 - -57766182282983. +-534626017029007665 = 9255 * -57766182282983. +-9255 = -(9255). +9255 = +(9255). +0 = 9255 div -57766182282983. +9255 = 9255 rem -57766182282983. +1 = 9255 band -57766182282983. +-57766182273729 = 9255 bor -57766182282983. +-57766182273730 = 9255 bxor -57766182282983. +-9256 = bnot(9255). +2369280 = 9255 bsl 8. +36 = 9255 bsr 8. +43583457932098704125432925625 = 43583457926631745136214938829 + 5466958989217986796. +43583457921164786146996952033 = 43583457926631745136214938829 - 5466958989217986796. +238268977093203339917214546461418761963669701884 = 43583457926631745136214938829 * 5466958989217986796. +-43583457926631745136214938829 = -(43583457926631745136214938829). +43583457926631745136214938829 = +(43583457926631745136214938829). +7972157466 = 43583457926631745136214938829 div 5466958989217986796. +4421758198994119893 = 43583457926631745136214938829 rem 5466958989217986796. +5231643519462150348 = 43583457926631745136214938829 band 5466958989217986796. +43583457926867060605970775277 = 43583457926631745136214938829 bor 5466958989217986796. +43583457921635417086508624929 = 43583457926631745136214938829 bxor 5466958989217986796. +-43583457926631745136214938830 = bnot(43583457926631745136214938829). +9909731017303726 = 43583457926631745136214938829 bsl -42. +191682075076070720302541032957128229257216 = 43583457926631745136214938829 bsr -42. +688582391845697458364529253983 = 747334547 + 688582391845697458363781919436. +-688582391845697458363034584889 = 747334547 - 688582391845697458363781919436. +514601409882180803945348321968493555492 = 747334547 * 688582391845697458363781919436. +-747334547 = -(747334547). +747334547 = +(747334547). +0 = 747334547 div 688582391845697458363781919436. +747334547 = 747334547 rem 688582391845697458363781919436. +67641984 = 747334547 band 688582391845697458363781919436. +688582391845697458364461611999 = 747334547 bor 688582391845697458363781919436. +688582391845697458364393970015 = 747334547 bxor 688582391845697458363781919436. +-747334548 = bnot(747334547). +1459637 = 747334547 bsl -9. +382635288064 = 747334547 bsr -9. +4198468694770 = 4192924421877 + 5544272893. +4187380148984 = 4192924421877 - 5544272893. +23246717214610347280161 = 4192924421877 * 5544272893. +-4192924421877 = -(4192924421877). +4192924421877 = +(4192924421877). +756 = 4192924421877 div 5544272893. +1454114769 = 4192924421877 rem 5544272893. +138691317 = 4192924421877 band 5544272893. +4198330003453 = 4192924421877 bor 5544272893. +4198191312136 = 4192924421877 bxor 5544272893. +-4192924421878 = bnot(4192924421877). +8189305511 = 4192924421877 bsl -9. +2146777304001024 = 4192924421877 bsr -9. +695779499497740362954764 = -946965296458 + 695779499498687328251222. +-695779499499634293547680 = -946965296458 - 695779499498687328251222. +-658879040012173308179266399930771676 = -946965296458 * 695779499498687328251222. +946965296458 = -(-946965296458). +-946965296458 = +(-946965296458). +0 = -946965296458 div 695779499498687328251222. +-946965296458 = -946965296458 rem 695779499498687328251222. +695779499498394708101142 = -946965296458 band 695779499498687328251222. +-654345146378 = -946965296458 bor 695779499498687328251222. +-695779499499049053247520 = -946965296458 bxor 695779499498687328251222. +946965296457 = bnot(-946965296458). +-29592665515 = -946965296458 bsl -5. +-30302889486656 = -946965296458 bsr -5. +-8749549967799272686 = -5 + -8749549967799272681. +8749549967799272676 = -5 - -8749549967799272681. +43747749838996363405 = -5 * -8749549967799272681. +5 = -(-5). +-5 = +(-5). +0 = -5 div -8749549967799272681. +-5 = -5 rem -8749549967799272681. +-8749549967799272685 = -5 band -8749549967799272681. +-1 = -5 bor -8749549967799272681. +8749549967799272684 = -5 bxor -8749549967799272681. +4 = bnot(-5). +-160 = -5 bsl 5. +-1 = -5 bsr 5. +-4442553739 = -4442554356 + 617. +-4442554973 = -4442554356 - 617. +-2741056037652 = -4442554356 * 617. +4442554356 = -(-4442554356). +-4442554356 = +(-4442554356). +-7200250 = -4442554356 div 617. +-106 = -4442554356 rem 617. +8 = -4442554356 band 617. +-4442553747 = -4442554356 bor 617. +-4442553755 = -4442554356 bxor 617. +4442554355 = bnot(-4442554356). +-71080869696 = -4442554356 bsl 4. +-277659648 = -4442554356 bsr 4. +-80761627119765 = -47577995383167 + -33183631736598. +-14394363646569 = -47577995383167 - -33183631736598. +1578810677560573582627045866 = -47577995383167 * -33183631736598. +47577995383167 = -(-47577995383167). +-47577995383167 = +(-47577995383167). +1 = -47577995383167 div -33183631736598. +-14394363646569 = -47577995383167 rem -33183631736598. +-69749188329344 = -47577995383167 band -33183631736598. +-11012438790421 = -47577995383167 bor -33183631736598. +58736749538923 = -47577995383167 bxor -33183631736598. +47577995383166 = bnot(-47577995383167). +-6504062805347175992854226195333100911915243382216748635078916338179559855776585782654748012038802701462209036288 = -47577995383167 bsl 326. +-1 = -47577995383167 bsr 326. +7153697534725 = 7153697524993 + 9732. +7153697515261 = 7153697524993 - 9732. +69619784313231876 = 7153697524993 * 9732. +-7153697524993 = -(7153697524993). +7153697524993 = +(7153697524993). +735069618 = 7153697524993 div 9732. +2617 = 7153697524993 rem 9732. +1024 = 7153697524993 band 9732. +7153697533701 = 7153697524993 bor 9732. +7153697532677 = 7153697524993 bxor 9732. +-7153697524994 = bnot(7153697524993). +697876402438937479803173358990579965085580863789430026221840561487579144890078941736343300387089227788186901649794788881497645969466145766479590030808449024 = 7153697524993 bsl 475. +0 = 7153697524993 bsr 475. + +0 = 7153697524993 bsr 475833444444444444444444444444444444444444444444. +-1 = -83987348 bsr 475833444444444444444444444444444444444444444444. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/eq_math.dat erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/eq_math.dat --- erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/eq_math.dat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/eq_math.dat 1997-11-09 23:03:07.000000000 +0000 @@ -0,0 +1,78 @@ +1 = fac(1). +2 = fac(2). +6 = fac(3). +24 = fac(4). +120 = fac(5). +720 = fac(6). +5040 = fac(7). +40320 = fac(8). +362880 = fac(9). +3628800 = fac(10). +39916800 = fac(11). +479001600 = fac(12). +6227020800 = fac(13). +87178291200 = fac(14). +1307674368000 = fac(15). +20922789888000 = fac(16). +355687428096000 = fac(17). +6402373705728000 = fac(18). +121645100408832000 = fac(19). +2432902008176640000 = fac(20). +265252859812191058636308480000000 = fac(30). +815915283247897734345611269596115894272000000000 = fac(40). +30414093201713378043612608166064768844377641568960512000000000000 = fac(50). +8320987112741390144276341183223364380754172606361245952449277696409600000000000000 = fac(60). +11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000 = fac(70). +71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000 = fac(80). +1485715964481761497309522733620825737885569961284688766942216863704985393094065876545992131370884059645617234469978112000000000000000000000 = fac(90). +93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 = fac(100). +385620482362580421735677065923463640617493109590223590278828403276373402575165543560686168588507361534030051833058916347592172932262498857766114955245039357760034644709279247692495585280000000000000000000000000000000 = fac(128). +857817775342842654119082271681232625157781520279485619859655650377269452553147589377440291360451408450375885342336584306157196834693696475322289288497426025679637332563368786442675207626794560187968867971521143307702077526646451464709187326100832876325702818980773671781454170250523018608495319068138257481070252817559459476987034665712738139286205234756808218860701203611083152093501947437109101726968262861606263662435022840944191408424615936000000000000000000000000000000000000000000000000000000000000000 = fac(256). +402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 = fac(999). +2 = 1 bsl 1. +4 = 1 bsl 2. +8 = 1 bsl 3. +16 = 1 bsl 4. +32 = 1 bsl 5. +1024 = 1 bsl 10. +1048576 = 1 bsl 20. +134217728 = 1 bsl 27. +268435456 = 1 bsl 28. +1073741824 = 1 bsl 30. +2147483648 = 1 bsl 31. +4294967296 = 1 bsl 32. +1099511627776 = 1 bsl 40. +1125899906842624 = 1 bsl 50. +1152921504606846976 = 1 bsl 60. +1180591620717411303424 = 1 bsl 70. +1208925819614629174706176 = 1 bsl 80. +1237940039285380274899124224 = 1 bsl 90. +1267650600228229401496703205376 = 1 bsl 100. +3072 = 3 bsl 10. +3145728 = 3 bsl 20. +402653184 = 3 bsl 27. +805306368 = 3 bsl 28. +3221225472 = 3 bsl 30. +6442450944 = 3 bsl 31. +12884901888 = 3 bsl 32. +3298534883328 = 3 bsl 40. +3377699720527872 = 3 bsl 50. +3458764513820540928 = 3 bsl 60. +3541774862152233910272 = 3 bsl 70. +3626777458843887524118528 = 3 bsl 80. +3713820117856140824697372672 = 3 bsl 90. +3802951800684688204490109616128 = 3 bsl 100. +5120 = 5 bsl 10. +5242880 = 5 bsl 20. +671088640 = 5 bsl 27. +1342177280 = 5 bsl 28. +5368709120 = 5 bsl 30. +10737418240 = 5 bsl 31. +21474836480 = 5 bsl 32. +5497558138880 = 5 bsl 40. +5629499534213120 = 5 bsl 50. +5764607523034234880 = 5 bsl 60. +5902958103587056517120 = 5 bsl 70. +6044629098073145873530880 = 5 bsl 80. +6189700196426901374495621120 = 5 bsl 90. +6338253001141147007483516026880 = 5 bsl 100. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/literal_test.erl erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/literal_test.erl --- erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/literal_test.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/literal_test.erl 2009-11-20 13:30:35.000000000 +0000 @@ -0,0 +1,38 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(literal_test). + +-export([t/0]). + +t() -> + 2639222 = do_band(-30710410, 11032439), + -104896167137483835127591520601167100453480347078199925156632915223228188306305878154109985624943277357501787279310034030156370067160844817777591157023073455111626047495778039507502639061242015835277440456218702874565483838389693116456108032 = do_bsl(-283388912239613, 746), + 899396154689163167548626101 = do_plus(899396154689163167641847368, -93221267), + ok. + +do_plus(A, B) -> + A + B. + +do_band(A, B) -> + A band B. + +do_bsl(X, S) -> + X bsl S. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/negative.dat erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/negative.dat --- erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE_data/negative.dat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE_data/negative.dat 2001-10-08 10:02:35.000000000 +0100 @@ -0,0 +1,10 @@ +%% 'bor' operations. +(-1 bsl 28) bor 0 = -1 bsl 28. +0 bor (-1 bsl 28) = -1 bsl 28. +(-1 bsl 28) bor (-1 bsl 28) = -1 bsl 28. + +%%(-1 bsl 28) bor -16#FFFFffff = -16#10000001. Not sure about the result yet. + +%% 'band' operations. +(-1 bsl 28) band 16#FFFFffffFFFF = 16#FFFFf0000000. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/big_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/big_SUITE.erl 2009-03-12 12:16:35.000000000 +0000 @@ -0,0 +1,396 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(big_SUITE). + + +-export([all/1]). +-export([t_div/1, eq_28/1, eq_32/1, eq_big/1, eq_math/1, big_literals/1, + borders/1, negative/1, big_float/1, big_float_1/1, big_float_2/1, + shift_limit_1/1, powmod/1, system_limit/1, otp_6692/1]). + +%% Internal exports. +-export([eval/1, funcall/2]). +-export([init/3]). + +-export([fac/1, fib/1, pow/2, gcd/2, lcm/2]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-include("test_server.hrl"). + +all(suite) -> + [t_div, eq_28, eq_32, eq_big, eq_math, big_literals, borders, + negative, big_float, shift_limit_1, powmod, system_limit, otp_6692]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(3)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +%% +%% Syntax of data files: +%% Expr1 = Expr2. +%% ... +%% built in functions are: +%% fac(N). +%% fib(N). +%% pow(X, N) == X ^ N +%% gcd(Q, R) +%% lcm(Q, R) +%% +eq_28(Config) when is_list(Config) -> + TestFile = test_file(Config, "eq_28.dat"), + test(TestFile). + +eq_32(Config) when is_list(Config) -> + TestFile = test_file(Config, "eq_32.dat"), + test(TestFile). + +eq_big(Config) when is_list(Config) -> + TestFile = test_file(Config, "eq_big.dat"), + test(TestFile). + +eq_math(Config) when is_list(Config) -> + TestFile = test_file(Config, "eq_math.dat"), + test(TestFile). + + +borders(doc) -> "Tests border cases between small/big."; +borders(Config) when is_list(Config) -> + TestFile = test_file(Config, "borders.dat"), + test(TestFile). + +negative(Config) when is_list(Config) -> + TestFile = test_file(Config, "negative.dat"), + test(TestFile). + + +%% Find test file +test_file(Config, Name) -> + DataDir = ?config(data_dir, Config), + filename:join(DataDir, Name). + +%% +%% +%% Run test on file test_big_seq.erl +%% +%% +test(File) -> + test(File, [node()]). + +test(File, Nodes) -> + ?line {ok,Fd} = file:open(File, [read]), + Res = test(File, Fd, Nodes), + file:close(Fd), + case Res of + {0,Cases} -> {comment, integer_to_list(Cases) ++ " cases"}; + {_,_} -> test_server:fail() + end. + +test(File, Fd, Ns) -> + test(File, Fd, Ns, 0, 0, 0). + +test(File, Fd, Ns, L, Cases, Err) -> + case io:parse_erl_exprs(Fd, '') of + {eof,_} -> {Err, Cases}; + {error, {Line,_Mod,Message}, _} -> + Fmt = erl_parse:format_error(Message), + io:format("~s:~w: error ~s~n", [File, Line+L, Fmt]), + {Err+1, Cases}; + {ok, [{match,ThisLine,Expr1,Expr2}], Line} -> + case multi_match(Ns, {op,0,'-',Expr1,Expr2}) of + [] -> + test(File, Fd, Ns, Line+L-1,Cases+1, Err); + [_|_] -> + PP = erl_pp:expr({op,0,'=/=',Expr1,Expr2}), + io:format("~s:~w : error ~s~n", [File,ThisLine+L, PP]), + test(File, Fd, Ns, Line+L-1,Cases+1, Err+1) + end; + {ok, Exprs, Line} -> + PP = erl_pp:exprs(Exprs), + io:format("~s: ~w: equation expected not ~s~n", [File,Line+L,PP]), + test(File, Fd, Ns, Line+L-1,Cases+1, Err+1) + end. + +multi_match(Ns, Expr) -> + multi_match(Ns, Expr, []). + +multi_match([Node|Ns], Expr, Rs) -> + ?line X = rpc:call(Node, big_SUITE, eval, [Expr]), + if X == 0 -> multi_match(Ns, Expr, Rs); + true -> multi_match(Ns, Expr, [{Node,X}|Rs]) + end; +multi_match([], _, Rs) -> Rs. + +eval(Expr) -> + Fun = {?MODULE,funcall}, + {value,V,_} = erl_eval:expr(Expr, [], Fun), %Applied arithmetic BIFs. + V = eval(Expr, Fun), %Real arithmetic instructions. + V. + +funcall(F, As) -> apply(?MODULE, F, As). + +%% Like a subset of erl_eval:expr/3, but uses real arithmetic instructions instead of +%% applying them (it does make a difference). + +eval({op,_,Op,A0}, LFH) -> + A = eval(A0, LFH), + Res = eval_op(Op, A), + erlang:garbage_collect(), + Res; +eval({op,_,Op,A0,B0}, LFH) -> + [A,B] = eval_list([A0,B0], LFH), + Res = eval_op(Op, A, B), + erlang:garbage_collect(), + Res; +eval({integer,_,I}, _) -> I; +eval({call,_,{atom,_,Local},Args0}, LFH) -> + Args = eval_list(Args0, LFH), + LFH(Local, Args). + +eval_list([E|Es], LFH) -> + [eval(E, LFH)|eval_list(Es, LFH)]; +eval_list([], _) -> []. + +eval_op('-', A) -> -A; +eval_op('+', A) -> +A; +eval_op('bnot', A) -> bnot A. + +eval_op('-', A, B) -> A - B; +eval_op('+', A, B) -> A + B; +eval_op('*', A, B) -> A * B; +eval_op('div', A, B) -> A div B; +eval_op('rem', A, B) -> A rem B; +eval_op('band', A, B) -> A band B; +eval_op('bor', A, B) -> A bor B; +eval_op('bxor', A, B) -> A bxor B; +eval_op('bsl', A, B) -> A bsl B; +eval_op('bsr', A, B) -> A bsr B. + +%% Built in test functions + +fac(0) -> 1; +fac(1) -> 1; +fac(N) -> N * fac(N-1). + +%% +%% X ^ N +%% +pow(_, 0) -> 1; +pow(X, 1) -> X; +pow(X, N) when (N band 1) == 1 -> + X2 = pow(X, N bsr 1), + X*X2*X2; +pow(X, N) -> + X2 = pow(X, N bsr 1), + X2*X2. + +fib(0) -> 1; +fib(1) -> 1; +fib(N) -> fib(N-1) + fib(N-2). + +%% +%% Gcd +%% +gcd(Q, 0) -> Q; +gcd(Q, R) -> gcd(R, Q rem R). + +%% +%% Least common multiple +%% +lcm(Q, R) -> + Q*R div gcd(Q, R). + + +%% Test case t_div cut in from R2D test suite. + +t_div(Config) when is_list(Config) -> + ?line 'try'(fun() -> 98765432101234 div 98765432101235 end, 0), + + % Big remainder, small quotient. + ?line 'try'(fun() -> 339254531512 div 68719476736 end, 4), + ok. + +'try'(Fun, Result) -> + 'try'(89, Fun, Result, []). + +'try'(0, _, _, _) -> + ok; +'try'(Iter, Fun, Result, Filler) -> + spawn(?MODULE, init, [self(), Fun, list_to_tuple(Filler)]), + receive + {result, Result} -> + 'try'(Iter-1, Fun, Result, [0|Filler]); + {result, Other} -> + io:format("Expected ~p; got ~p~n", [Result, Other]), + test_server:fail() + end. + +init(ReplyTo, Fun, _Filler) -> + ReplyTo ! {result, Fun()}. + +big_literals(doc) -> + "Tests that big-number literals work correctly."; +big_literals(Config) when is_list(Config) -> + %% Note: The literal test cannot be compiler on a pre-R4 Beam emulator, + %% so we compile it now. + ?line DataDir = ?config(data_dir, Config), + ?line Test = filename:join(DataDir, "literal_test"), + ?line {ok, Mod, Bin} = compile:file(Test, [binary]), + ?line {module, Mod} = code:load_binary(Mod, Mod, Bin), + ?line ok = Mod:t(), + ok. + +big_float(doc) -> + ["Test cases for mixing bignums and floats"]; +big_float(suite) -> + [big_float_1, big_float_2]. + +big_float_1(doc) -> + ["OTP-2436, part 1"]; +big_float_1(Config) when is_list(Config) -> + %% F is a number very close to a maximum float. + ?line F = id(1.7e308), + ?line I = trunc(F), + ?line true = (I == F), + ?line false = (I /= F), + ?line true = (I > F/2), + ?line false = (I =< F/2), + ?line true = (I*2 >= F), + ?line false = (I*2 < F), + ?line true = (I*I > F), + ?line false = (I*I =< F), + + ?line true = (F == I), + ?line false = (F /= I), + ?line false = (F/2 > I), + ?line true = (F/2 =< I), + ?line false = (F >= I*2), + ?line true = (F < I*2), + ?line false = (F > I*I), + ?line true = (F =< I*I), + ok. + +big_float_2(doc) -> + ["OTP-2436, part 2"]; +big_float_2(Config) when is_list(Config) -> + ?line F = id(1.7e308), + ?line I = trunc(F), + ?line {'EXIT', _} = (catch 1/(2*I)), + ?line _Ignore = 2/I, + ?line {'EXIT', _} = (catch 4/(2*I)), + ok. + +shift_limit_1(doc) -> + ["OTP-3256"]; +shift_limit_1(Config) when is_list(Config) -> + ?line case catch (id(1) bsl 100000000) of + {'EXIT', {system_limit, _}} -> + ok + end, + ok. + +powmod(Config) when is_list(Config) -> + A = 1696192905348584855517250509684275447603964214606878827319923580493120589769459602596313014087329389174229999430092223701630077631205171572331191216670754029016160388576759960413039261647653627052707047, + B = 43581177444506616087519351724629421082877485633442736512567383077022781906420535744195118099822189576169114064491200598595995538299156626345938812352676950427869649947439032133573270227067833308153431095, + C = 52751775381034251994634567029696659541685100826881826508158083211003576763074162948462801435204697796532659535818017760528684167216110865807581759669824808936751316879636014972704885388116861127856231, + 42092892863788727404752752803608028634538446791189806757622214958680350350975318060071308251566643822307995215323107194784213893808887471095918905937046217646432382915847269148913963434734284563536888 = powmod(A, B, C), + ok. + +powmod(A, 1, C) -> + A rem C; +powmod(A, 2, C) -> + A*A rem C; +powmod(A, B, C) -> + B1 = B div 2, + B2 = B - B1, + P = powmod(A, B1, C), + case B2 of + B1 -> + (P*P) rem C; + _ -> + (P*P*A) rem C + end. + +system_limit(Config) when is_list(Config) -> + ?line Maxbig = maxbig(), + ?line {'EXIT',{system_limit,_}} = (catch Maxbig+1), + ?line {'EXIT',{system_limit,_}} = (catch -Maxbig-1), + ?line {'EXIT',{system_limit,_}} = (catch 2*Maxbig), + ?line {'EXIT',{system_limit,_}} = (catch bnot Maxbig), + ?line {'EXIT',{system_limit,_}} = (catch apply(erlang, id('bnot'), [Maxbig])), + ?line {'EXIT',{system_limit,_}} = (catch Maxbig bsl 2), + ?line {'EXIT',{system_limit,_}} = (catch apply(erlang, id('bsl'), [Maxbig,2])), + ?line {'EXIT',{system_limit,_}} = (catch id(1) bsl (1 bsl 45)), + ?line {'EXIT',{system_limit,_}} = (catch id(1) bsl (1 bsl 69)), + ok. + +maxbig() -> + %% We assume that the maximum arity is (1 bsl 19) - 1. + Ws = erlang:system_info(wordsize), + (((1 bsl ((16777184 * (Ws div 4))-1)) - 1) bsl 1) + 1. + +id(I) -> I. + +otp_6692(suite) -> + []; +otp_6692(doc) -> + ["Tests for DIV/REM bug reported in OTP-6692"]; +otp_6692(Config) when is_list(Config)-> + ?line loop1(1,1000). + +fact(N) -> + fact(N,1). + +fact(0,P) -> P; +fact(N,P) -> fact(N-1,P*N). + +raised(X,1) -> + X; +raised(X,N) -> + X*raised(X,N-1). + +loop1(M,M) -> + ok; +loop1(N,M) -> + loop2(fact(N),raised(7,7),1,8), + loop1(N+1,M). + +loop2(_,_,M,M) -> + ok; +loop2(X,Y,N,M) -> + Z = raised(Y,N), + case X rem Z of + Z -> + exit({failed,X,'REM',Z,'=',Z}); + 0 -> + case (X div Z) * Z of + X -> + ok; + Wrong -> + exit({failed,X,'DIV',Z,'*',Z,'=',Wrong}) + end; + _ -> + ok + end, + loop2(X,Y,N+1,M). + Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/bad_binary and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/bad_binary differ diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.1197 erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.1197 --- erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.1197 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.1197 2009-09-18 15:10:22.000000000 +0100 @@ -0,0 +1 @@ +<<131,104,3,108,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,16,52,164,138,66,218,149,102,245,119,235,94,64,69,150,116,121,109,0,0,0,16,69,128,138,148,31,134,101,69,254,137,55,67,50,87,61,209,109,0,0,0,16,102,135,75,119,127,212,19,209,35,70,255,181,98,150,204,245,109,0,0,0,16,249,179,20,179,193,238,148,70,246,210,217,238,180,230,213,19,109,0,0,0,16,53,94,111,136,10,236,80,242,175,115,246,172,67,209,60,111,109,0,0,0,16,215,248,244,92,112,145,239,153,42,113,41,150,30,100,224,175,109,0,0,0,16,200,44,221,92,158,142,48,188,76,52,143,53,27,36,227,193,109,0,0,0,16,103,194,1,2,29,34,16,42,54,48,191,81,89,103,122,214,106,107,0,9,10,21,25,30,7,36,41,12,10,107,0,30,45,33,40,4,13,27,38,10,3,25,39,0,18,4,3,4,20,8,46,20,6,33,2,23,10,12,37,33,45,33>>. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.2224 erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.2224 --- erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.2224 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.2224 2009-09-18 15:10:23.000000000 +0100 @@ -0,0 +1 @@ +<<131,104,3,108,176,0,0,1,109,0,0,0,16,212,29,140,217,143,0,178,4,233,128,9,152,236,248,66,126,106,107,0,1,0,107,0,3,1,6,4>>. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.24619 erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.24619 --- erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.24619 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.24619 2009-09-18 15:10:23.000000000 +0100 @@ -0,0 +1 @@ +<<131,104,3,108,157,157,0,7,109,0,0,0,16,55,233,12,238,67,82,29,243,29,211,100,103,94,222,253,111,109,0,0,0,16,123,199,42,7,103,210,55,190,77,163,10,206,25,26,205,194,109,0,0,0,16,112,190,42,171,14,14,14,14,14,14,14,14,14,73,114,31,109,0,0,0,16,36,164,198,221,134,71,27,5,151,55,181,122,115,75,182,107,109,0,0,0,16,191,181,181,232,197,52,185,67,212,192,200,78,208,248,48,138,109,0,0,0,16,58,191,0,250,97,191,174,47,255,145,51,55,94,20,36,22,109,0,0,0,16,19,32,200,163,20,224,40,199,252,222,64,38,59,226,140,105,106,107,0,7,6,1,4,9,5,6,4,107,0,6,8,7,9,9,0,6>>. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.25681 erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.25681 --- erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.25681 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.25681 2009-09-18 15:10:23.000000000 +0100 @@ -0,0 +1 @@ +<<131,104,3,108,146,146,146,146,109,0,0,0,16,5,44,160,195,30,175,203,35,219,89,215,184,2,78,94,170,106,107,0,1,4,107,0,4,2,5,3,0>>. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.26563 erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.26563 --- erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.26563 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.26563 2009-09-18 15:10:23.000000000 +0100 @@ -0,0 +1 @@ +<<131,104,3,108,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,43,35,116,53,8,115,151,70,109,0,0,0,16,46,214,206,144,145,5,5,151,216,205,186,160,20,122,56,211,109,0,0,0,16,231,252,248,228,158,57,175,60,102,175,36,111,220,245,53,223,109,0,0,0,16,11,114,118,250,109,208,21,68,191,28,20,37,85,92,109,233,109,0,0,0,16,241,70,203,137,71,9,64,196,13,97,57,45,198,58,101,16,109,0,0,0,16,55,10,73,208,111,248,3,206,218,97,250,249,167,97,111,253,106,107,0,6,10,17,13,21,18,3,107,0,22,10,24,17,24,18,11,9,2,10,5,8,13,16,12,21,3,12,15,24,15,9,11>>. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.26744 erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.26744 --- erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.26744 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.26744 2009-09-18 15:10:24.000000000 +0100 @@ -0,0 +1 @@ +<<131,104,3,108,0,0,0,34,109,0,0,0,16,246,40,48,114,226,31,172,131,140,186,199,103,184,69,163,250,109,0,0,0,16,70,137,87,84,123,59,151,104,51,248,19,182,201,216,104,107,109,0,0,0,16,75,247,173,46,233,103,101,172,74,156,58,219,100,163,0,15,109,0,0,0,16,165,61,109,30,82,118,124,174,79,99,109,226,67,30,250,201,109,0,0,0,16,171,87,99,231,11,27,105,249,22,185,117,13,190,221,68,43,109,0,0,0,16,28,138,81,135,98,250,241,78,63,129,1,111,189,226,232,62,109,0,0,0,16,140,242,136,145,115,249,196,75,89,2,77,154,77,146,188,139,109,0,0,0,16,23,94,33,183,84,175,41,135,44,181,221,17,82,139,116,240,109,0,0,0,16,25,92,169,206,39,56,163,245,227,229,124,198,10,125,58,216,109,0,0,0,16,242,242,226,156,245,143,114,37,12,97,30,171,229,203,72,148,109,0,0,0,16,88,244,34,176,67,151,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,44,229,66,176,163,15,18,95,127,249,160,57,55,191,22,109,0,0,0,16,216,32,191,62,114,130,211,165,62,177,139,90,101,213,148,153,109,0,0,0,16,89,69,176,67,182,240,212,246,155,244,183,194,27,76,211,241,109,0,0,0,16,89,223,126,234,29,229,230,116,177,209,128,89,205,173,125,192,109,0,0,0,16,0,223,16,80,225,217,146,95,191,172,211,105,204,53,184,0,109,0,0,0,16,109,122,166,47,188,116,57,251,215,211,182,101,15,67,248,98,109,0,0,0,16,30,14,197,5,205,206,164,77,34,144,27,11,45,20,124,37,109,0,0,0,16,120,12,166,133,0,60,236,29,97,123,234,166,243,70,225,190,109,0,0,0,16,153,158,57,172,15,245,115,49,233,53,112,251,201,28,250,95,109,0,0,0,16,253,120,180,234,85,203,127,112,237,225,193,159,73,44,64,231,109,0,0,0,16,18,51,70,243,111,230,11,148,243,73,182,43,168,82,227,129,109,0,0,0,16,61,147,55,3,76,53,153,52,117,47,51,176,153,85,97,216,109,0,0,0,16,113,142,196,76,220,119,212,32,42,51,80,42,159,137,71,183,109,0,0,0,16,207,4,245,17,147,229,41,4,66,99,23,243,85,156,222,34,109,0,0,0,16,146,201,209,199,145,105,193,201,188,11,226,207,215,23,156,30,109,0,0,0,16,141,156,48,124,183,243,196,163,40,34,165,25,34,209,206,170,109,0,0,0,16,160,252,133,213,54,168,44,75,148,247,79,183,170,194,80,228,109,0,0,0,16,221,101,172,89,69,146,157,172,253,251,151,231,116,217,76,209,109,0,0,0,16,250,199,222,195,91,93,106,169,252,80,246,217,80,160,207,76,109,0,0,0,16,146,101,163,61,212,184,154,55,158,19,200,188,141,102,164,115,109,0,0,0,16,80,97,213,9,68,43,15,183,17,103,106,252,92,177,75,49,109,0,0,0,16,14,108,183,17,228,213,68,27,3,156,218,105,141,132,206,120,109,0,0,0,16,85,46,106,151,41,124,83,229,146,32,140,249,127,187,59,96,106,107,0,34,4,7,13,36,26,38,29,4,2,9,10,38,20,41,10,38,44,44,27,38,9,20,41,19,3,41,1,19,22,14,6,37,16,9,107,0,21,29,44,0,11,30,4,5,12,45,44,11,43,11,21,42,27,45,16,44,11,46>>. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.27459 erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.27459 --- erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.27459 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.27459 2009-09-18 15:10:24.000000000 +0100 @@ -0,0 +1 @@ +<<131,104,3,108,0,0,0,22,109,0,0,0,16,226,66,101,167,212,253,41,123,50,225,132,86,201,118,10,221,109,0,0,0,16,169,167,250,110,49,5,132,236,14,41,12,236,33,224,162,32,109,0,0,0,16,19,212,176,127,21,145,23,227,37,69,236,192,15,15,88,151,109,0,0,0,16,59,91,152,82,86,126,247,97,138,172,127,95,45,116,239,116,109,0,0,0,16,20,167,126,55,177,97,157,117,16,231,14,242,108,48,99,108,109,0,0,0,16,164,40,48,217,95,155,48,112,128,190,231,207,101,255,133,46,109,0,0,0,16,106,176,58,142,146,193,78,37,119,98,59,15,159,223,27,213,109,0,0,0,16,11,124,59,66,82,164,203,178,45,254,62,41,149,60,186,80,109,0,0,0,16,109,178,163,249,96,68,62,121,3,244,194,251,10,56,39,200,109,0,0,0,16,212,29,140,217,143,0,178,4,233,128,9,152,236,248,66,126,109,0,0,0,16,156,22,40,137,15,93,180,84,160,180,174,215,114,13,224,148,109,0,0,0,16,93,94,191,98,203,74,126,252,62,90,216,238,14,13,138,247,109,0,0,0,16,136,233,85,1,4,240,228,125,156,73,95,136,32,15,55,89,109,0,0,0,16,142,34,55,192,14,202,6,201,109,29,102,197,165,181,70,199,109,0,0,0,16,195,209,131,241,209,212,72,96,92,244,0,245,215,133,84,79,109,0,0,0,16,125,74,14,90,3,167,45,63,216,3,89,225,61,100,248,35,109,0,0,0,16,39,87,149,29,170,91,68,106,115,163,48,196,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,252,10,34,41,217,19,207,125,36,59,89,207,34,55,138,91,109,0,0,0,16,32,110,118,6,239,38,57,44,131,209,5,122,105,63,68,184,109,0,0,0,16,27,187,87,135,62,179,16,242,240,163,46,113,111,99,144,218,109,0,0,0,16,17,40,32,235,194,249,160,229,181,252,153,106,65,252,184,124,106,107,0,22,5,23,26,4,13,21,19,25,27,0,2,10,18,2,29,11,12,5,25,8,3,17,107,0,19,21,20,0,2,18,22,1,33,3,32,20,2,19,14,19,16,19,28,33>>. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.527 erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.527 --- erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.527 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.527 2009-09-18 15:10:24.000000000 +0100 @@ -0,0 +1 @@ +<<131,104,3,108,183,183,183,183,183,183,183,183,183,212,29,140,217,143,0,178,4,233,128,9,152,236,248,66,126,109,0,0,0,16,111,126,36,22,107,79,30,119,213,219,164,180,225,120,123,224,109,0,0,0,16,14,69,79,49,229,113,56,180,7,19,44,94,76,79,28,42,109,0,0,0,16,251,14,34,199,154,199,86,121,233,136,30,107,161,131,179,84,109,0,0,0,16,230,230,11,16,202,117,16,238,148,246,255,105,98,84,219,245,109,0,0,0,16,212,29,140,217,143,0,178,4,233,128,9,152,236,248,66,126,109,0,0,0,16,223,31,62,219,145,21,172,176,161,224,66,9,183,169,147,123,109,0,0,0,16,243,121,234,243,200,49,176,77,225,83,70,157,27,236,52,94,109,0,0,0,16,102,186,19,229,71,77,36,30,128,247,161,46,212,52,100,93,109,0,0,0,16,226,185,112,99,61,36,116,197,254,193,204,138,97,228,254,178,109,0,0,0,16,230,253,160,240,211,224,173,255,246,158,51,68,98,209,239,106,109,0,0,0,16,212,29,140,217,143,0,178,4,233,128,9,152,236,248,66,126,109,0,0,0,16,109,53,240,214,48,20,94,143,112,27,180,172,186,100,207,103,109,0,0,0,16,185,122,218,11,245,247,117,236,175,192,101,22,47,247,213,93,109,0,0,0,16,55,83,136,179,218,183,199,99,80,205,69,122,209,147,136,162,109,0,0,0,16,127,11,36,195,150,130,218,123,120,49,162,50,95,182,15,195,106,107,0,16,0,2,3,5,11,0,2,6,10,14,2,0,12,17,3,5,107,0,3,3,10,2>>. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.8929 erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.8929 --- erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.8929 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE_data/zzz.terms.8929 2009-09-18 15:10:24.000000000 +0100 @@ -0,0 +1 @@ +<<131,104,3,108,0,0,0,21,109,0,0,0,16,123,228,24,65,132,178,1,218,6,16,174,5,79,241,119,229,109,0,0,0,16,183,232,168,242,114,241,182,252,130,145,187,84,195,110,40,25,109,0,0,0,16,66,82,177,244,114,57,249,15,18,65,96,242,176,74,53,28,109,0,0,0,16,47,133,166,135,215,134,84,208,17,228,162,235,112,124,148,175,109,0,0,0,16,63,40,157,117,204,109,93,163,234,121,88,204,132,5,20,13,109,0,0,0,16,61,43,105,42,38,153,95,240,96,250,203,163,119,26,60,213,109,0,0,0,16,210,182,163,73,245,168,197,235,86,247,170,147,57,54,191,53,109,0,0,0,16,115,123,197,83,101,37,58,233,125,174,138,46,126,247,215,92,109,0,0,0,16,1,255,56,198,14,1,187,166,68,144,31,120,55,83,173,248,109,0,0,0,16,194,65,213,139,79,189,84,102,162,249,58,2,119,30,134,91,109,0,0,0,16,63,48,4,66,133,134,117,230,157,150,136,210,143,30,94,155,109,0,0,0,16,15,192,239,194,248,186,65,210,185,236,136,68,211,183,140,202,109,0,0,0,16,147,139,158,102,146,47,236,193,207,187,249,192,209,174,224,63,109,0,0,0,16,37,246,103,28,128,66,188,29,13,164,191,101,236,147,220,38,109,0,0,0,16,192,5,210,30,111,116,229,81,90,183,152,255,37,27,203,136,109,0,0,0,16,79,158,149,156,199,24,38,151,226,113,87,159,1,52,165,103,109,0,0,0,16,56,202,139,53,165,157,149,169,169,253,235,156,199,62,23,124,109,0,0,0,16,53,97,55,75,222,77,234,235,193,28,105,92,95,73,124,38,109,0,0,0,16,37,248,57,253,174,178,47,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,0,0,0,16,105,105,28,123,220,195,206,109,93,138,19,97,242,45,4,172,106,107,0,21,29,26,34,20,23,42,44,21,6,8,33,25,29,41,16,15,34,27,9,30,1,107,0,10,42,24,26,42,13,35,23,18,12,3>>. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/binary_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/binary_SUITE.erl 2009-09-18 15:07:30.000000000 +0100 @@ -0,0 +1,1313 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(binary_SUITE). +-compile({nowarn_deprecated_function, {erlang,hash,2}}). + +%% Tests binaries and the BIFs: +%% list_to_binary/1 +%% iolist_to_binary/1 +%% bitstr_to_list/1 +%% binary_to_list/1 +%% binary_to_list/3 +%% binary_to_term/1 +%% bitstr_to_list/1 +%% term_to_binary/1 +%% erlang:external_size/1 +%% size(Binary) +%% iolist_size/1 +%% concat_binary/1 +%% split_binary/2 +%% hash(Binary, N) +%% phash(Binary, N) +%% phash2(Binary, N) +%% + +-include("test_server.hrl"). + +-export([all/1, init_per_testcase/2, fin_per_testcase/2, + copy_terms/1, conversions/1, deep_lists/1, deep_bitstr_lists/1, + bad_list_to_binary/1, bad_binary_to_list/1, + t_split_binary/1, bad_split/1, t_concat_binary/1, + terms/1, terms_float/1, external_size/1, t_iolist_size/1, + t_hash/1, + bad_size/1, + bad_term_to_binary/1, + bad_binary_to_term_2/1, + bad_binary_to_term/1, bad_terms/1, more_bad_terms/1, + otp_5484/1,otp_5933/1, + ordering/1,unaligned_order/1,gc_test/1, + bit_sized_binary_sizes/1, + bitlevel_roundtrip/1, + otp_6817/1,deep/1,obsolete_funs/1,robustness/1,otp_8117/1, + otp_8180/1]). + +%% Internal exports. +-export([sleeper/0]). + +all(suite) -> + [copy_terms,conversions,deep_lists,deep_bitstr_lists, + t_split_binary, bad_split, t_concat_binary, + bad_list_to_binary, bad_binary_to_list, terms, terms_float, + external_size, t_iolist_size, + bad_binary_to_term_2, + bad_binary_to_term, bad_terms, t_hash, bad_size, bad_term_to_binary, + more_bad_terms, otp_5484, otp_5933, ordering, unaligned_order, + gc_test, bit_sized_binary_sizes, bitlevel_roundtrip, otp_6817, otp_8117, + deep,obsolete_funs,robustness,otp_8180]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(2)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +-define(heap_binary_size, 64). + +copy_terms(Config) when is_list(Config) -> + Self = self(), + ?line Pid = spawn_link(fun() -> copy_server(Self) end), + F = fun(Term) -> + Pid ! Term, + receive + Term -> ok; + Other -> + io:format("Sent: ~P\nGot back:~P", [Term,12,Other,12]), + ?t:fail(bad_term) + end + end, + ?line test_terms(F), + ok. + +copy_server(Parent) -> + receive + Term -> + Parent ! Term, + copy_server(Parent) + end. + +%% Tests list_to_binary/1, binary_to_list/1 and size/1, +%% using flat lists. + +conversions(suite) -> []; +conversions(Config) when is_list(Config) -> + ?line test_bin([]), + ?line test_bin([1]), + ?line test_bin([1, 2]), + ?line test_bin([1, 2, 3]), + ?line test_bin(lists:seq(0, ?heap_binary_size)), + ?line test_bin(lists:seq(0, ?heap_binary_size+1)), + ?line test_bin(lists:seq(0, 255)), + ?line test_bin(lists:duplicate(50000, $@)), + + %% Binary in list. + List = [1,2,3,4,5], + ?line B1 = make_sub_binary(list_to_binary(List)), + ?line 5 = size(B1), + ?line 5 = size(make_unaligned_sub_binary(B1)), + ?line 40 = bit_size(B1), + ?line 40 = bit_size(make_unaligned_sub_binary(B1)), + ?line B2 = list_to_binary([42,B1,19]), + ?line B2 = list_to_binary([42,make_unaligned_sub_binary(B1),19]), + ?line B2 = iolist_to_binary(B2), + ?line B2 = iolist_to_binary(make_unaligned_sub_binary(B2)), + ?line 7 = size(B2), + ?line 7 = size(make_sub_binary(B2)), + ?line 56 = bit_size(B2), + ?line 56 = bit_size(make_sub_binary(B2)), + ?line [42,1,2,3,4,5,19] = binary_to_list(B2), + ?line [42,1,2,3,4,5,19] = binary_to_list(make_sub_binary(B2)), + ?line [42,1,2,3,4,5,19] = binary_to_list(make_unaligned_sub_binary(B2)), + ?line [42,1,2,3,4,5,19] = bitstring_to_list(B2), + ?line [42,1,2,3,4,5,19] = bitstring_to_list(make_sub_binary(B2)), + ?line [42,1,2,3,4,5,19] = bitstring_to_list(make_unaligned_sub_binary(B2)), + + ok. + +test_bin(List) -> + ?line Size = length(List), + ?line Bin = list_to_binary(List), + ?line Bin = iolist_to_binary(List), + ?line Bin = list_to_bitstring(List), + ?line Size = iolist_size(List), + ?line Size = iolist_size(Bin), + ?line Size = iolist_size(make_unaligned_sub_binary(Bin)), + ?line Size = size(Bin), + ?line Size = size(make_sub_binary(Bin)), + ?line Size = size(make_unaligned_sub_binary(Bin)), + ?line List = binary_to_list(Bin), + ?line List = binary_to_list(make_sub_binary(Bin)), + ?line List = binary_to_list(make_unaligned_sub_binary(Bin)), + ?line List = bitstring_to_list(Bin), + ?line List = bitstring_to_list(make_unaligned_sub_binary(Bin)). + +%% Tests list_to_binary/1, iolist_to_binary/1, list_to_bitstr/1, binary_to_list/1,3, +%% bitstr_to_list/1, and size/1, using deep lists. + +deep_lists(Config) when is_list(Config) -> + ?line test_deep_list(["abc"]), + ?line test_deep_list([[12,13,[123,15]]]), + ?line test_deep_list([[12,13,[lists:seq(0, 255), []]]]), + ok. + +test_deep_list(List) -> + ?line FlatList = lists:flatten(List), + ?line Size = length(FlatList), + ?line Bin = list_to_binary(List), + ?line Bin = iolist_to_binary(List), + ?line Bin = iolist_to_binary(Bin), + ?line Bin = list_to_bitstring(List), + ?line Size = size(Bin), + ?line Size = iolist_size(List), + ?line Size = iolist_size(FlatList), + ?line Size = iolist_size(Bin), + ?line Bitsize = bit_size(Bin), + ?line Bitsize = 8*Size, + ?line FlatList = binary_to_list(Bin), + ?line FlatList = bitstring_to_list(Bin), + io:format("testing plain binary..."), + ?line t_binary_to_list_3(FlatList, Bin, 1, Size), + io:format("testing unaligned sub binary..."), + ?line t_binary_to_list_3(FlatList, make_unaligned_sub_binary(Bin), 1, Size). + +t_binary_to_list_3(List, Bin, From, To) -> + ?line going_up(List, Bin, From, To), + ?line going_down(List, Bin, From, To), + ?line going_center(List, Bin, From, To). + +going_up(List, Bin, From, To) when From =< To -> + ?line List = binary_to_list(Bin, From, To), + ?line going_up(tl(List), Bin, From+1, To); +going_up(_List, _Bin, From, To) when From > To -> + ok. + +going_down(List, Bin, From, To) when To > 0-> + ?line compare(List, binary_to_list(Bin, From, To), To-From+1), + ?line going_down(List, Bin, From, To-1); +going_down(_List, _Bin, _From, _To) -> + ok. + +going_center(List, Bin, From, To) when From >= To -> + ?line compare(List, binary_to_list(Bin, From, To), To-From+1), + ?line going_center(tl(List), Bin, From+1, To-1); +going_center(_List, _Bin, _From, _To) -> + ok. + +compare([X|Rest1], [X|Rest2], Left) when Left > 0 -> + ?line compare(Rest1, Rest2, Left-1); +compare([_X|_], [_Y|_], _Left) -> + ?line test_server:fail(); +compare(_List, [], 0) -> + ok. + +deep_bitstr_lists(Config) when is_list(Config) -> + ?line {<<7:3>>,[<<7:3>>]} = test_deep_bitstr([<<7:3>>]), + ?line {<<42,5:3>>=Bin,[42,<<5:3>>]=List} = test_deep_bitstr([42,<<5:3>>]), + ?line {Bin,List} = test_deep_bitstr([42|<<5:3>>]), + ?line {Bin,List} = test_deep_bitstr([<<42,5:3>>]), + ?line {Bin,List} = test_deep_bitstr([<<1:3>>,<<10:5>>|<<5:3>>]), + ?line {Bin,List} = test_deep_bitstr([<<1:3>>,<<10:5>>,<<5:3>>]), + ?line {Bin,List} = test_deep_bitstr([[<<1:3>>,<<10:5>>],[],<<5:3>>]), + ?line {Bin,List} = test_deep_bitstr([[[<<1:3>>]|<<10:5>>],[],<<5:3>>]), + ?line {Bin,List} = test_deep_bitstr([[<<0:1>>,<<0:1>>,[],<<1:1>>,<<10:5>>], + <<1:1>>,<<0:1>>,<<1:1>>]), + ok. + +test_deep_bitstr(List) -> + %%?line {'EXIT',{badarg,_}} = list_to_binary(List), + Bin = list_to_bitstring(List), + {Bin,bitstring_to_list(Bin)}. + +bad_list_to_binary(suite) -> []; +bad_list_to_binary(Config) when is_list(Config) -> + ?line test_bad_bin(atom), + ?line test_bad_bin(42), + ?line test_bad_bin([1|2]), + ?line test_bad_bin([256]), + ?line test_bad_bin([255, [256]]), + ?line test_bad_bin([-1]), + ?line test_bad_bin([atom_in_list]), + ?line test_bad_bin([[<<8>>]|bad_tail]), + + {'EXIT',{badarg,_}} = (catch list_to_binary(id(<<1,2,3>>))), + {'EXIT',{badarg,_}} = (catch list_to_binary(id([<<42:7>>]))), + {'EXIT',{badarg,_}} = (catch list_to_bitstring(id(<<1,2,3>>))), + + %% Funs used to be implemented as a type of binary internally. + ?line test_bad_bin(fun(X, Y) -> X*Y end), + ?line test_bad_bin([1,fun(X) -> X + 1 end,2|fun() -> 0 end]), + ?line test_bad_bin([fun(X) -> X + 1 end]), + ok. + +test_bad_bin(List) -> + {'EXIT',{badarg,_}} = (catch list_to_binary(List)), + {'EXIT',{badarg,_}} = (catch iolist_to_binary(List)), + {'EXIT',{badarg,_}} = (catch list_to_bitstring(List)). + +bad_binary_to_list(doc) -> "Tries binary_to_list/1,3 with bad arguments."; +bad_binary_to_list(Config) when is_list(Config) -> + ?line bad_bin_to_list(fun(X) -> X * 42 end), + + GoodBin = list_to_binary(lists:seq(1, 10)), + ?line bad_bin_to_list(fun(X) -> X * 44 end, 1, 2), + ?line bad_bin_to_list(GoodBin, 0, 1), + ?line bad_bin_to_list(GoodBin, 2, 1), + ?line bad_bin_to_list(GoodBin, 11, 11), + {'EXIT',{badarg,_}} = (catch binary_to_list(id(<<42:7>>))), + ok. + +bad_bin_to_list(BadBin) -> + {'EXIT',{badarg,_}} = (catch binary_to_list(BadBin)), + {'EXIT',{badarg,_}} = (catch bitstring_to_list(BadBin)). + +bad_bin_to_list(Bin, First, Last) -> + {'EXIT',{badarg,_}} = (catch binary_to_list(Bin, First, Last)). + + +%% Tries to split a binary at all possible positions. + +t_split_binary(suite) -> []; +t_split_binary(Config) when is_list(Config) -> + ?line L = lists:seq(0, ?heap_binary_size-5), %Heap binary. + ?line B = list_to_binary(L), + ?line split(L, B, size(B)), + + %% Sub binary of heap binary. + ?line split(L, make_sub_binary(B), size(B)), + {X,_Y} = split_binary(B, size(B) div 2), + ?line split(binary_to_list(X), X, size(X)), + + %% Unaligned sub binary of heap binary. + ?line split(L, make_unaligned_sub_binary(B), size(B)), + {X,_Y} = split_binary(B, size(B) div 2), + ?line split(binary_to_list(X), X, size(X)), + + %% Reference-counted binary. + ?line L2 = lists:seq(0, ?heap_binary_size+1), + ?line B2 = list_to_binary(L2), + ?line split(L2, B2, size(B2)), + + %% Sub binary of reference-counted binary. + ?line split(L2, make_sub_binary(B2), size(B2)), + {X2,_Y2} = split_binary(B2, size(B2) div 2), + ?line split(binary_to_list(X2), X2, size(X2)), + + %% Unaligned sub binary of reference-counted binary. + ?line split(L2, make_unaligned_sub_binary(B2), size(B2)), + {X2,_Y2} = split_binary(B2, size(B2) div 2), + ?line split(binary_to_list(X2), X2, size(X2)), + + ok. + +split(L, B, Pos) when Pos > 0 -> + ?line {B1, B2} = split_binary(B, Pos), + ?line B1 = list_to_binary(lists:sublist(L, 1, Pos)), + ?line B2 = list_to_binary(lists:nthtail(Pos, L)), + ?line split(L, B, Pos-1); +split(_L, _B, 0) -> + ok. + +bad_split(doc) -> "Tries split_binary/2 with bad arguments."; +bad_split(suite) -> []; +bad_split(Config) when is_list(Config) -> + GoodBin = list_to_binary([1,2,3]), + ?line bad_split(GoodBin, -1), + ?line bad_split(GoodBin, 4), + ?line bad_split(GoodBin, a), + + %% Funs are a kind of binaries. + ?line bad_split(fun(_X) -> 1 end, 1), + ok. + +bad_split(Bin, Pos) -> + {'EXIT',{badarg,_}} = (catch split_binary(Bin, Pos)). + +%% Tests concat_binary/2 and size/1. + +t_concat_binary(suite) -> []; +t_concat_binary(Config) when is_list(Config) -> + test_concat([]), + + test_concat([[]]), + test_concat([[], []]), + test_concat([[], [], []]), + + test_concat([[1], []]), + test_concat([[], [2]]), + test_concat([[], [3], []]), + + test_concat([[1, 2, 3], [4, 5, 6, 7]]), + test_concat([[1, 2, 3], [4, 5, 6, 7], [9, 10]]), + + test_concat([lists:seq(0, 255), lists:duplicate(1024, $@), + lists:duplicate(2048, $a), + lists:duplicate(4000, $b)]), + ok. + +test_concat(Lists) -> + test_concat(Lists, 0, [], []). + +test_concat([List|Rest], Size, Combined, Binaries) -> + ?line Bin = list_to_binary(List), + ?line test_concat(Rest, Size+length(List), Combined++List, [Bin|Binaries]); +test_concat([], Size, Combined, Binaries0) -> + ?line Binaries = lists:reverse(Binaries0), + ?line Bin = concat_binary(Binaries), + ?line Size = size(Bin), + ?line Size = iolist_size(Bin), + ?line Combined = binary_to_list(Bin). + +t_hash(doc) -> "Test hash/2 with different type of binaries."; +t_hash(Config) when is_list(Config) -> + test_hash([]), + test_hash([253]), + test_hash(lists:seq(1, ?heap_binary_size)), + test_hash(lists:seq(1, ?heap_binary_size+1)), + test_hash([X rem 256 || X <- lists:seq(1, 312)]), + ok. + +test_hash(List) -> + Bin = list_to_binary(List), + Sbin = make_sub_binary(List), + Unaligned = make_unaligned_sub_binary(Sbin), + ?line test_hash_1(Bin, Sbin, Unaligned, fun erlang:hash/2), + ?line test_hash_1(Bin, Sbin, Unaligned, fun erlang:phash/2), + ?line test_hash_1(Bin, Sbin, Unaligned, fun erlang:phash2/2). + +test_hash_1(Bin, Sbin, Unaligned, Hash) when is_function(Hash, 2) -> + N = 65535, + case {Hash(Bin, N),Hash(Sbin, N),Hash(Unaligned, N)} of + {H,H,H} -> ok; + {H1,H2,H3} -> + io:format("Different hash values: ~p, ~p, ~p\n", [H1,H2,H3]), + ?t:fail() + end. + +bad_size(doc) -> "Try bad arguments to size/1."; +bad_size(suite) -> []; +bad_size(Config) when is_list(Config) -> + ?line {'EXIT',{badarg,_}} = (catch size(fun(X) -> X + 33 end)), + ok. + +bad_term_to_binary(Config) when is_list(Config) -> + T = id({a,b,c}), + ?line {'EXIT',{badarg,_}} = (catch term_to_binary(T, not_a_list)), + ?line {'EXIT',{badarg,_}} = (catch term_to_binary(T, [blurf])), + ?line {'EXIT',{badarg,_}} = (catch term_to_binary(T, [{compressed,-1}])), + ?line {'EXIT',{badarg,_}} = (catch term_to_binary(T, [{compressed,10}])), + ?line {'EXIT',{badarg,_}} = (catch term_to_binary(T, [{compressed,cucumber}])), + ?line {'EXIT',{badarg,_}} = (catch term_to_binary(T, [{compressed}])), + ?line {'EXIT',{badarg,_}} = (catch term_to_binary(T, [{version,1}|bad_tail])), + ?line {'EXIT',{badarg,_}} = (catch term_to_binary(T, [{minor_version,-1}])), + ?line {'EXIT',{badarg,_}} = (catch term_to_binary(T, [{minor_version,x}])), + + ok. + +%% Tests binary_to_term/1 and term_to_binary/1. + +terms(Config) when is_list(Config) -> + TestFun = fun(Term) -> + try + S = io_lib:format("~p", [Term]), + io:put_chars(S) + catch + error:badarg -> + io:put_chars("bit sized binary") + end, + Bin = term_to_binary(Term), + case erlang:external_size(Bin) of + Sz when is_integer(Sz), size(Bin) =< Sz -> + ok + end, + Term = binary_to_term(Bin), + Unaligned = make_unaligned_sub_binary(Bin), + Term = binary_to_term(Unaligned), + BinC = erlang:term_to_binary(Term, [compressed]), + Term = binary_to_term(BinC), + true = size(BinC) =< size(Bin), + Bin = term_to_binary(Term, [{compressed,0}]), + terms_compression_levels(Term, size(Bin), 1), + UnalignedC = make_unaligned_sub_binary(BinC), + Term = binary_to_term(UnalignedC) + end, + ?line test_terms(TestFun), + ok. + +terms_compression_levels(Term, UncompressedSz, Level) when Level < 10 -> + BinC = erlang:term_to_binary(Term, [{compressed,Level}]), + Term = binary_to_term(BinC), + Sz = byte_size(BinC), + true = Sz =< UncompressedSz, + terms_compression_levels(Term, UncompressedSz, Level+1); +terms_compression_levels(_, _, _) -> ok. + +terms_float(Config) when is_list(Config) -> + ?line test_floats(fun(Term) -> + Bin0 = term_to_binary(Term), + Bin0 = term_to_binary(Term, [{minor_version,0}]), + Term = binary_to_term(Bin0), + Bin1 = term_to_binary(Term, [{minor_version,1}]), + Term = binary_to_term(Bin1), + true = size(Bin1) < size(Bin0) + end). + +external_size(Config) when is_list(Config) -> + %% Build a term whose external size only fits in a big num (on 32-bit CPU). + ?line external_size_1(16#11111111111111117777777777777777888889999, 0, 16#FFFFFFF), + + %% Test that the same binary aligned and unaligned has the same external size. + ?line Bin = iolist_to_binary([1,2,3,96]), + ?line Unaligned = make_unaligned_sub_binary(Bin), + case {erlang:external_size(Bin),erlang:external_size(Unaligned)} of + {X,X} -> ok; + {Sz1,Sz2} -> + io:format(" Aligned size: ~p\n", [Sz1]), + io:format("Unaligned size: ~p\n", [Sz2]), + ?line ?t:fail() + end. + +external_size_1(Term, Size0, Limit) when Size0 < Limit -> + case erlang:external_size(Term) of + Size when is_integer(Size), Size0 < Size -> + io:format("~p", [Size]), + external_size_1([Term|Term], Size, Limit) + end; +external_size_1(_, _, _) -> ok. + +t_iolist_size(Config) when is_list(Config) -> + %% Build a term whose external size only fits in a big num (on 32-bit CPU). + Bin = iolist_to_binary(lists:seq(0, 254)), + ?line ok = t_iolist_size_1(Bin, 0, 16#7FFFFFFF), + ?line ok = t_iolist_size_1(make_unaligned_sub_binary(Bin), 0, 16#7FFFFFFF). + +t_iolist_size_1(IOList, Size0, Limit) when Size0 < Limit -> + case iolist_size(IOList) of + Size when is_integer(Size), Size0 < Size -> + io:format("~p", [Size]), + t_iolist_size_1([IOList|IOList], Size, Limit) + end; +t_iolist_size_1(_, _, _) -> ok. + +bad_binary_to_term_2(doc) -> "OTP-4053."; +bad_binary_to_term_2(suite) -> []; +bad_binary_to_term_2(Config) when is_list(Config) -> + ?line {ok, N} = test_server:start_node(plopp, slave, []), + ?line R = rpc:call(N, erlang, binary_to_term, [<<131,111,255,255,255,0>>]), + ?line case R of + {badrpc, {'EXIT', _}} -> + ok; + _Other -> + test_server:fail({rpcresult, R}) + end, + ?line test_server:stop_node(N), + ok. + +bad_binary_to_term(doc) -> "Try bad input to binary_to_term/1."; +bad_binary_to_term(Config) when is_list(Config) -> + ?line bad_bin_to_term(an_atom), + ?line bad_bin_to_term({an,tuple}), + ?line bad_bin_to_term({a,list}), + ?line bad_bin_to_term(fun() -> self() end), + ?line bad_bin_to_term(fun(X) -> 42*X end), + ?line bad_bin_to_term(fun(X, Y) -> {X,Y} end), + ?line bad_bin_to_term(fun(X, Y, Z) -> {X,Y,Z} end), + ?line bad_bin_to_term(bit_sized_binary(term_to_binary({you,should,'not',see,this,term}))), + + %% Bad float. + ?line bad_bin_to_term(<<131,70,-1:64>>), + ok. + +bad_bin_to_term(BadBin) -> + {'EXIT',{badarg,_}} = (catch binary_to_term(BadBin)). + +%% Tests bad input to binary_to_term/1. + +bad_terms(suite) -> []; +bad_terms(Config) when is_list(Config) -> + ?line test_terms(fun corrupter/1). + +corrupter(Term) -> + ?line try + S = io_lib:format("About to corrupt: ~P", [Term,12]), + io:put_chars(S) + catch + error:badarg -> + io:format("About to corrupt: <= 0 -> + ?line {ShorterBin, _} = split_binary(Bin, Pos), + ?line catch binary_to_term(ShorterBin), %% emulator shouldn't crash + ?line MovedBin = list_to_binary([ShorterBin]), + ?line catch binary_to_term(MovedBin), %% emulator shouldn't crash + ?line corrupter(MovedBin, Pos-1); +corrupter(_Bin, _) -> + ok. + +more_bad_terms(suite) -> []; +more_bad_terms(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line BadFile = filename:join(Data, "bad_binary"), + ?line ok = io:format("File: ~s\n", [BadFile]), + ?line case file:read_file(BadFile) of + {ok,Bin} -> + ?line {'EXIT',{badarg,_}} = (catch binary_to_term(Bin)), + ok; + Other -> + ?line ?t:fail(Other) + end. + +otp_5484(Config) when is_list(Config) -> + ?line {'EXIT',_} = + (catch + binary_to_term( + <<131, + 104,2, %Tuple, 2 elements + 103, %Pid + 100,0,20,"wslin1427198@wslin14", + %% Obviously bad values follow. + 255,255,255,255, + 255,255,255,255, + 255, + 106>>)), + + ?line {'EXIT',_} = + (catch + binary_to_term( + <<131, + 104,2, %Tuple, 2 elements + 103, %Pid + 106, %[] instead of atom. + 0,0,0,17, + 0,0,0,135, + 2, + 106>>)), + + ?line {'EXIT',_} = + (catch + binary_to_term( + %% A old-type fun in a list containing a bad creator pid. + <<131,108,0,0,0,1,117,0,0,0,0,103,100,0,13,110,111,110,111,100,101,64,110,111,104,111,115,116,255,255,0,25,255,0,0,0,0,100,0,1,116,97,0,98,6,142,121,72,106>>)), + + ?line {'EXIT',_} = + (catch + binary_to_term( + %% A new-type fun in a list containing a bad creator pid. + %% + <<131, + 108,0,0,0,1, %List, 1 element + 112,0,0,0,66,0,52,216,81,158,148,250,237,109,185,9,208,60,202,156,244,218,0,0,0,0,0,0,0,0,100,0,1,116,97,0,98,6,142,121,72, + 103, %Pid. + 106, %[] instead of an atom. + 0,0,0,27,0,0,0,0,0,106>>)), + + ?line {'EXIT',_} = + (catch + binary_to_term( + %% A new-type fun in a list containing a bad module. + <<131, + 108,0,0,0,1, %List, 1 element + 112,0,0,0,70,0,224,90,4,101,48,28,110,228,153,48,239,169,232,77,108,145,0,0,0,0,0,0,0,2, + %%100,0,1,116, + 107,0,1,64, %String instead of atom (same length). + 97,0,98,6,64,82,230,103,100,0,13,110,111,110,111,100,101,64,110,111,104,111,115,116,0,0,0,48,0,0,0,0,0,97,42,97,7,106>>)), + + ?line {'EXIT',_} = + (catch + binary_to_term( + %% A new-type fun in a list containing a bad index. + <<131, + 108,0,0,0,1, %List, 1 element + 112,0,0,0,70,0,224,90,4,101,48,28,110,228,153,48,239,169,232,77,108,145,0,0,0,0,0,0,0,2, + 100,0,1,116, + %%97,0, %Integer: 0. + 104,0, %Tuple {} instead of integer. + 98,6,64,82,230,103,100,0,13,110,111,110,111,100,101,64,110,111,104,111,115,116,0,0,0,48,0,0,0,0,0,97,42,97,7,106>>)), + + ?line {'EXIT',_} = + (catch + binary_to_term( + %% A new-type fun in a list containing a bad unique value. + <<131, + 108,0,0,0,1, %List, 1 element + 112,0,0,0,70,0,224,90,4,101,48,28,110,228,153,48,239,169,232,77,108,145,0,0,0,0,0,0,0,2, + 100,0,1,116, + 97,0, %Integer: 0. + %%98,6,64,82,230, %Integer. + 100,0,2,64,65, %Atom instead of integer. + 103,100,0,13,110,111,110,111,100,101,64,110,111,104,111,115,116,0,0,0,48,0,0,0,0,0,97,42,97,7,106>>)), + + %% An absurdly large atom. + ?line {'EXIT',_} = + (catch binary_to_term(iolist_to_binary([<<131,100,65000:16>>| + lists:duplicate(65000, 42)]))), + + %% Longer than 255 characters. + ?line {'EXIT',_} = + (catch binary_to_term(iolist_to_binary([<<131,100,256:16>>| + lists:duplicate(256, 42)]))), + + %% OTP-7218. Thanks to Matthew Dempsky. Also make sure that we + %% cover the other error cases for external funs (EXPORT_EXT). + ?line {'EXIT',_} = + (catch binary_to_term( + <<131, + 113, %EXPORT_EXP + 97,13, %Integer: 13 + 97,13, %Integer: 13 + 97,13>>)), %Integer: 13 + ?line {'EXIT',_} = + (catch binary_to_term( + <<131, + 113, %EXPORT_EXP + 100,0,1,64, %Atom: '@' + 97,13, %Integer: 13 + 97,13>>)), %Integer: 13 + ?line {'EXIT',_} = + (catch binary_to_term( + <<131, + 113, %EXPORT_EXP + 100,0,1,64, %Atom: '@' + 100,0,1,64, %Atom: '@' + 106>>)), %NIL + ?line {'EXIT',_} = + (catch binary_to_term( + <<131, + 113, %EXPORT_EXP + 100,0,1,64, %Atom: '@' + 100,0,1,64, %Atom: '@' + 98,255,255,255,255>>)), %Integer: -1 + ?line {'EXIT',_} = + (catch binary_to_term( + <<131, + 113, %EXPORT_EXP + 100,0,1,64, %Atom: '@' + 100,0,1,64, %Atom: '@' + 113,97,13,97,13,97,13>>)), %fun 13:13/13 + + %% Bad funs. + ?line {'EXIT',_} = (catch binary_to_term(fake_fun(0, lists:seq(0, 256)))), + ok. + +fake_fun(Arity, Env0) -> + Uniq = erlang:md5([]), + Index = 0, + NumFree = length(Env0), + Mod = list_to_binary(?MODULE_STRING), + OldIndex = 0, + OldUniq = 16#123456, + <<131,Pid/binary>> = term_to_binary(self()), + Env1 = [term_to_binary(Term) || Term <- Env0], + Env = << <> || <<131,Bin/binary>> <- Env1 >>, + B = <>, + <<131,$p,(byte_size(B)+4):32,B/binary>>. + + +%% More bad terms submitted by Matthias Lang. +otp_5933(Config) when is_list(Config) -> + ?line try_bad_lengths(<<131,$m>>), %binary + ?line try_bad_lengths(<<131,$n>>), %bignum + ?line try_bad_lengths(<<131,$o>>), %huge bignum + ok. + +try_bad_lengths(B) -> + try_bad_lengths(B, 16#FFFFFFFF). + +try_bad_lengths(B, L) when L > 16#FFFFFFF0 -> + Bin = <>, + io:format("~p\n", [Bin]), + {'EXIT',_} = (catch binary_to_term(Bin)), + try_bad_lengths(B, L-1); +try_bad_lengths(_, _) -> ok. + + +otp_6817(Config) when is_list(Config) -> + process_flag(min_heap_size, 20000), %Use the heap, not heap fragments. + + %% Floats are only validated when the heap fragment has been allocated. + BadFloat = <<131,99,53,46,48,$X,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,101,45,48,49,0,0,0,0,0>>, + ?line otp_6817_try_bin(BadFloat), + + %% {Binary,BadFloat}: When the error in float is discovered, a refc-binary + %% has been allocated and the list of refc-binaries goes through the + %% limbo area between the heap top and stack. + BinAndFloat = + <<131,104,2,109,0,0,1,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, + 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45, + 46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70, + 71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, + 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115, + 116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134, + 135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153, + 154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172, + 173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210, + 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229, + 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248, + 249,250,251,252,253,254,255,99,51,46,49,52,$B,$l,$u,$r,$f,48,48,48,48,48,48, + 48,48,49,50,52,51,52,101,43,48,48,0,0,0,0,0>>, + ?line otp_6817_try_bin(BinAndFloat), + + %% {Fun,BadFloat} + FunAndFloat = + <<131,104,2,112,0,0,0,66,0,238,239,135,138,137,216,89,57,22,111,52,126,16,84, + 71,8,0,0,0,0,0,0,0,0,100,0,1,116,97,0,98,5,175,169,123,103,100,0,13,110,111, + 110,111,100,101,64,110,111,104,111,115,116,0,0,0,41,0,0,0,0,0,99,50,46,55,48, + $Y,57,57,57,57,57,57,57,57,57,57,57,57,57,54,52,52,55,101,43,48,48,0,0,0,0,0>>, + ?line otp_6817_try_bin(FunAndFloat), + + %% [ExternalPid|BadFloat] + ExtPidAndFloat = + <<131,108,0,0,0,1,103,100,0,13,107,97,108,108,101,64,115,116,114,105,100,101, + 114,0,0,0,36,0,0,0,0,2,99,48,46,$@,48,48,48,48,48,48,48,48,48,48,48,48,48,48, + 48,48,48,48,48,101,43,48,48,0,0,0,0,0>>, + ?line otp_6817_try_bin(ExtPidAndFloat), + ok. + +otp_6817_try_bin(Bin) -> + erlang:garbage_collect(), + + %% If the bug is present, the heap pointer will moved when the invalid term + %% is found and we will have a linked list passing through the limbo area + %% between the heap top and the stack pointer. + catch binary_to_term(Bin), + + %% If the bug is present, we will overwrite the pointers in the limbo area. + Filler = erlang:make_tuple(1024, 16#3FA), + id(Filler), + + %% Will crash if the bug is present. + erlang:garbage_collect(). + +otp_8117(doc) -> "Some bugs in binary_to_term when 32-bit integers are negative."; +otp_8117(suite) -> []; +otp_8117(Config) when is_list(Config) -> + [otp_8117_do(Op,-(1 bsl N)) || Op <- ['fun',list,tuple], + N <- lists:seq(0,31)], + ok. + +otp_8117_do('fun',Neg) -> + % Fun with negative num_free + FunBin = term_to_binary(fun() -> ok end), + ?line <> = FunBin, + ?line bad_bin_to_term(<>); +otp_8117_do(list,Neg) -> + %% List with negative length + ?line bad_bin_to_term(<<131,104,2,108,Neg:32,97,11,104,1,97,12,97,13,106,97,14>>); +otp_8117_do(tuple,Neg) -> + %% Tuple with negative arity + ?line bad_bin_to_term(<<131,104,2,105,Neg:32,97,11,97,12,97,13,97,14>>). + + +ordering(doc) -> "Tests ordering of binaries."; +ordering(suite) -> []; +ordering(Config) when is_list(Config) -> + B1 = list_to_binary([7,8,9]), + B2 = make_sub_binary([1,2,3,4]), + B3 = list_to_binary([1,2,3,5]), + Unaligned = make_unaligned_sub_binary(B2), + + %% From R8 binaries are compared as strings. + + ?line false = B1 == B2, + ?line false = B1 =:= B2, + ?line true = B1 /= B2, + ?line true = B1 =/= B2, + + ?line true = B1 > B2, + ?line true = B2 < B3, + ?line true = B2 =< B1, + ?line true = B2 =< B3, + + ?line true = B2 =:= Unaligned, + ?line true = B2 == Unaligned, + ?line true = Unaligned < B3, + ?line true = Unaligned =< B3, + + %% Binaries are greater than all other terms. + + ?line true = B1 > 0, + ?line true = B1 > 39827491247298471289473333333333333333333333333333, + ?line true = B1 > -3489274937438742190467869234328742398347, + ?line true = B1 > 3.14, + ?line true = B1 > [], + ?line true = B1 > [a], + ?line true = B1 > {a}, + ?line true = B1 > self(), + ?line true = B1 > make_ref(), + ?line true = B1 > xxx, + ?line true = B1 > fun() -> 1 end, + ?line true = B1 > fun erlang:send/2, + + ?line Path = ?config(priv_dir, Config), + ?line AFile = filename:join(Path, "vanilla_file"), + ?line Port = open_port(AFile, [out]), + ?line true = B1 > Port, + + ?line true = B1 >= 0, + ?line true = B1 >= 39827491247298471289473333333333333333333333333333, + ?line true = B1 >= -3489274937438742190467869234328742398347, + ?line true = B1 >= 3.14, + ?line true = B1 >= [], + ?line true = B1 >= [a], + ?line true = B1 >= {a}, + ?line true = B1 >= self(), + ?line true = B1 >= make_ref(), + ?line true = B1 >= xxx, + ?line true = B1 >= fun() -> 1 end, + ?line true = B1 >= fun erlang:send/2, + ?line true = B1 >= Port, + + ok. + +%% Test that comparisions between binaries with different alignment work. +unaligned_order(Config) when is_list(Config) -> + L = lists:seq(0, 7), + [test_unaligned_order(I, J) || I <- L, J <- L], + ok. + +test_unaligned_order(I, J) -> + Align = {I,J}, + io:format("~p ~p", [I,J]), + ?line true = test_unaligned_order_1('=:=', <<1,2,3,16#AA,16#7C,4,16#5F,5,16#5A>>, + <<1,2,3,16#AA,16#7C,4,16#5F,5,16#5A>>, + Align), + ?line false = test_unaligned_order_1('=/=', <<1,2,3>>, <<1,2,3>>, Align), + ?line true = test_unaligned_order_1('==', <<4,5,6>>, <<4,5,6>>, Align), + ?line false = test_unaligned_order_1('/=', <<1,2,3>>, <<1,2,3>>, Align), + + ?line true = test_unaligned_order_1('<', <<1,2>>, <<1,2,3>>, Align), + ?line true = test_unaligned_order_1('=<', <<1,2>>, <<1,2,3>>, Align), + ?line true = test_unaligned_order_1('=<', <<1,2,7,8>>, <<1,2,7,8>>, Align), + ok. + +test_unaligned_order_1(Op, A, B, {Aa,Ba}) -> + erlang:Op(unaligned_sub_bin(A, Aa), unaligned_sub_bin(B, Ba)). + +test_terms(Test_Func) -> + ?line Test_Func(atom), + ?line Test_Func(''), + ?line Test_Func('a'), + ?line Test_Func('ab'), + ?line Test_Func('abc'), + ?line Test_Func('abcd'), + ?line Test_Func('abcde'), + ?line Test_Func('abcdef'), + ?line Test_Func('abcdefg'), + ?line Test_Func('abcdefgh'), + + ?line Test_Func(fun() -> ok end), + X = id([a,{b,c},c]), + Y = id({x,y,z}), + Z = id(1 bsl 8*257), + ?line Test_Func(fun() -> X end), + ?line Test_Func(fun() -> {X,Y} end), + ?line Test_Func([fun() -> {X,Y,Z} end, + fun() -> {Z,X,Y} end, + fun() -> {Y,Z,X} end]), + + ?line Test_Func({trace_ts,{even_bigger,{some_data,fun() -> ok end}},{1,2,3}}), + ?line Test_Func({trace_ts,{even_bigger,{some_data,<<1,2,3,4,5,6,7,8,9,10>>}}, + {1,2,3}}), + + ?line Test_Func(1), + ?line Test_Func(42), + ?line Test_Func(-23), + ?line Test_Func(256), + ?line Test_Func(25555), + ?line Test_Func(-3333), + + ?line Test_Func(1.0), + + ?line Test_Func(183749783987483978498378478393874), + ?line Test_Func(-37894183749783987483978498378478393874), + Very_Big = very_big_num(), + ?line Test_Func(Very_Big), + ?line Test_Func(-Very_Big+1), + + ?line Test_Func([]), + ?line Test_Func("abcdef"), + ?line Test_Func([a, b, 1, 2]), + ?line Test_Func([a|b]), + + ?line Test_Func({}), + ?line Test_Func({1}), + ?line Test_Func({a, b}), + ?line Test_Func({a, b, c}), + ?line Test_Func(list_to_tuple(lists:seq(0, 255))), + ?line Test_Func(list_to_tuple(lists:seq(0, 256))), + + ?line Test_Func(make_ref()), + ?line Test_Func([make_ref(), make_ref()]), + + ?line Test_Func(make_port()), + + ?line Test_Func(make_pid()), + + ?line Test_Func(Bin0 = list_to_binary(lists:seq(0, 14))), + ?line Test_Func(Bin1 = list_to_binary(lists:seq(0, ?heap_binary_size))), + ?line Test_Func(Bin2 = list_to_binary(lists:seq(0, ?heap_binary_size+1))), + ?line Test_Func(Bin3 = list_to_binary(lists:seq(0, 255))), + + ?line Test_Func(make_unaligned_sub_binary(Bin0)), + ?line Test_Func(make_unaligned_sub_binary(Bin1)), + ?line Test_Func(make_unaligned_sub_binary(Bin2)), + ?line Test_Func(make_unaligned_sub_binary(Bin3)), + + ?line Test_Func(make_sub_binary(lists:seq(42, 43))), + ?line Test_Func(make_sub_binary([42,43,44])), + ?line Test_Func(make_sub_binary([42,43,44,45])), + ?line Test_Func(make_sub_binary([42,43,44,45,46])), + ?line Test_Func(make_sub_binary([42,43,44,45,46,47])), + ?line Test_Func(make_sub_binary([42,43,44,45,46,47,48])), + ?line Test_Func(make_sub_binary(lists:seq(42, 49))), + ?line Test_Func(make_sub_binary(lists:seq(0, 14))), + ?line Test_Func(make_sub_binary(lists:seq(0, ?heap_binary_size))), + ?line Test_Func(make_sub_binary(lists:seq(0, ?heap_binary_size+1))), + ?line Test_Func(make_sub_binary(lists:seq(0, 255))), + + ?line Test_Func(make_unaligned_sub_binary(lists:seq(42, 43))), + ?line Test_Func(make_unaligned_sub_binary([42,43,44])), + ?line Test_Func(make_unaligned_sub_binary([42,43,44,45])), + ?line Test_Func(make_unaligned_sub_binary([42,43,44,45,46])), + ?line Test_Func(make_unaligned_sub_binary([42,43,44,45,46,47])), + ?line Test_Func(make_unaligned_sub_binary([42,43,44,45,46,47,48])), + ?line Test_Func(make_unaligned_sub_binary(lists:seq(42, 49))), + ?line Test_Func(make_unaligned_sub_binary(lists:seq(0, 14))), + ?line Test_Func(make_unaligned_sub_binary(lists:seq(0, ?heap_binary_size))), + ?line Test_Func(make_unaligned_sub_binary(lists:seq(0, ?heap_binary_size+1))), + ?line Test_Func(make_unaligned_sub_binary(lists:seq(0, 255))), + + %% Bit level binaries. + ?line Test_Func(<<1:1>>), + ?line Test_Func(<<2:2>>), + ?line Test_Func(<<42:10>>), + ?line Test_Func(list_to_bitstring([<<5:6>>|lists:seq(0, 255)])), + + ?line Test_Func(F = fun(A) -> 42*A end), + ?line Test_Func(lists:duplicate(32, F)), + + ?line Test_Func(FF = fun binary_SUITE:all/1), + ?line Test_Func(lists:duplicate(32, FF)), + + ok. + +test_floats(Test_Func) -> + ?line Test_Func(5.5), + ?line Test_Func(-15.32), + ?line Test_Func(1.2435e25), + ?line Test_Func(1.2333e-20), + ?line Test_Func(199.0e+15), + ok. + +very_big_num() -> + very_big_num(33, 1). + +very_big_num(Left, Result) when Left > 0 -> + ?line very_big_num(Left-1, Result*256); +very_big_num(0, Result) -> + ?line Result. + +make_port() -> + ?line open_port({spawn, efile}, [eof]). + +make_pid() -> + ?line spawn_link(?MODULE, sleeper, []). + +sleeper() -> + ?line receive after infinity -> ok end. + + +gc_test(doc) -> "Test that binaries are garbage collected properly."; +gc_test(suite) -> []; +gc_test(Config) when is_list(Config) -> + case erlang:system_info(heap_type) of + private -> gc_test_1(); + hybrid -> {skip,"Hybrid heap"} + end. + +gc_test_1() -> + %% Note: This test is only relevant for REFC binaries. + %% Therefore, we take care that all binaries are REFC binaries. + B = list_to_binary(lists:seq(0, ?heap_binary_size)), + Self = self(), + F1 = fun() -> + gc(), + {binary,[]} = process_info(self(), binary), + Self ! {self(),done} + end, + F = fun() -> + receive go -> ok end, + {binary,[{_,65,1}]} = process_info(self(), binary), + gc(), + {B1,B2} = my_split_binary(B, 4), + gc(), + gc(), + {binary,L1} = process_info(self(), binary), + [Binfo1,Binfo2,Binfo3] = L1, + {_,65,3} = Binfo1 = Binfo2 = Binfo3, + 65 = size(B), + 4 = size(B1), + 61 = size(B2), + F1() + end, + gc(), + gc(), + 65 = size(B), + gc_test1(spawn_opt(erlang, apply, [F,[]], [link,{fullsweep_after,0}])). + +gc_test1(Pid) -> + gc(), + Pid ! go, + receive + {Pid,done} -> ok + after 10000 -> + ?line ?t:fail() + end. + +%% Like split binary, but returns REFC binaries. Only useful for gc_test/1. + +my_split_binary(B, Pos) -> + Self = self(), + Ref = make_ref(), + spawn(fun() -> Self ! {Ref,split_binary(B, Pos)} end), + receive + {Ref,Result} -> Result + end. + +gc() -> + erlang:garbage_collect(), + gc1(). +gc1() -> ok. + +bit_sized_binary_sizes(Config) when is_list(Config) -> + ?line [bsbs_1(A) || A <- lists:seq(0, 7)], + ok. + +bsbs_1(0) -> + BinSize = 32+8, + io:format("A: ~p BinSize: ~p", [0,BinSize]), + Bin = binary_to_term(<<131,$M,5:32,0,0,0,0,0,0>>), + BinSize = bit_size(Bin); +bsbs_1(A) -> + BinSize = 32+A, + io:format("A: ~p BinSize: ~p", [A,BinSize]), + Bin = binary_to_term(<<131,$M,5:32,A,0,0,0,0,0>>), + BinSize = bit_size(Bin). + +bitlevel_roundtrip(Config) when is_list(Config) -> + case ?t:is_release_available("r11b") of + true -> bitlevel_roundtrip_1(); + false -> {skip,"No R11B found"} + end. + +bitlevel_roundtrip_1() -> + Name = bitlevelroundtrip, + ?line N = list_to_atom(atom_to_list(Name) ++ "@" ++ hostname()), + ?line ?t:start_node(Name, slave, [{erl,[{release,"r11b"}]}]), + + ?line {<<128>>,1} = roundtrip(N, <<1:1>>), + ?line {<<64>>,2} = roundtrip(N, <<1:2>>), + ?line {<<16#E0>>,3} = roundtrip(N, <<7:3>>), + ?line {<<16#70>>,4} = roundtrip(N, <<7:4>>), + ?line {<<16#10>>,5} = roundtrip(N, <<2:5>>), + ?line {<<16#8>>,6} = roundtrip(N, <<2:6>>), + ?line {<<16#2>>,7} = roundtrip(N, <<1:7>>), + ?line {<<8,128>>,1} = roundtrip(N, <<8,1:1>>), + ?line {<<42,248>>,5} = roundtrip(N, <<42,31:5>>), + + ?line ?t:stop_node(N), + ok. + +roundtrip(Node, Term) -> + {badrpc,{'EXIT',Res}} = rpc:call(Node, erlang, exit, [Term]), + io:format("<<~p bits>> => ~w", [bit_size(Term),Res]), + Res. + +deep(Config) when is_list(Config) -> + ?line deep_roundtrip(lists:foldl(fun(E, A) -> + [E,A] + end, [], lists:seq(1, 1000000))), + ?line deep_roundtrip(lists:foldl(fun(E, A) -> + {E,A} + end, [], lists:seq(1, 1000000))), + ?line deep_roundtrip(lists:foldl(fun(E, A) -> + fun() -> {E,A} end + end, [], lists:seq(1, 1000000))), + ok. + +deep_roundtrip(T) -> + B = term_to_binary(T), + true = deep_eq(T, binary_to_term(B)). + +%% +%% FIXME: =:= runs out of stack. +%% +deep_eq([H1|T1], [H2|T2]) -> + deep_eq(H1, H2) andalso deep_eq(T1, T2); +deep_eq(T1, T2) when tuple_size(T1) =:= tuple_size(T2) -> + deep_eq_tup(T1, T2, tuple_size(T1)); +deep_eq(T1, T2) when is_function(T1), is_function(T2) -> + {uniq,U1} = erlang:fun_info(T1, uniq), + {index,I1} = erlang:fun_info(T1, index), + {arity,A1} = erlang:fun_info(T1, arity), + {env,E1} = erlang:fun_info(T1, env), + {uniq,U2} = erlang:fun_info(T2, uniq), + {index,I2} = erlang:fun_info(T2, index), + {arity,A2} = erlang:fun_info(T2, arity), + {env,E2} = erlang:fun_info(T2, env), + U1 =:= U2 andalso I1 =:= I2 andalso A1 =:= A2 andalso + deep_eq(E1, E2); +deep_eq(T1, T2) -> + T1 =:= T2. + +deep_eq_tup(_T1, _T2, 0) -> + true; +deep_eq_tup(T1, T2, N) -> + deep_eq(element(N, T1), element(N, T2)) andalso + deep_eq_tup(T1, T2, N-1). + +obsolete_funs(Config) when is_list(Config) -> + erts_debug:set_internal_state(available_internal_state, true), + + X = id({1,2,3}), + Y = id([a,b,c,d]), + Z = id({x,y,z}), + ?line obsolete_fun(fun() -> ok end), + ?line obsolete_fun(fun() -> X end), + ?line obsolete_fun(fun(A) -> {A,X} end), + ?line obsolete_fun(fun() -> {X,Y} end), + ?line obsolete_fun(fun() -> {X,Y,Z} end), + + ?line obsolete_fun(fun ?MODULE:all/1), + + erts_debug:set_internal_state(available_internal_state, false), + ok. + +obsolete_fun(Fun) -> + Tuple = case erlang:fun_info(Fun, type) of + {type,external} -> + {module,M} = erlang:fun_info(Fun, module), + {name,F} = erlang:fun_info(Fun, name), + {M,F}; + {type,local} -> + {module,M} = erlang:fun_info(Fun, module), + {index,I} = erlang:fun_info(Fun, index), + {uniq,U} = erlang:fun_info(Fun, uniq), + {env,E} = erlang:fun_info(Fun, env), + {'fun',M,I,U,list_to_tuple(E)} + end, + Tuple = no_fun_roundtrip(Fun). + +no_fun_roundtrip(Term) -> + binary_to_term(erts_debug:get_internal_state({term_to_binary_no_funs,Term})). + +%% Test non-standard encodings never generated by term_to_binary/1 +%% but recognized by binary_to_term/1. + +robustness(Config) when is_list(Config) -> + ?line [] = binary_to_term(<<131,107,0,0>>), %Empty string. + ?line [] = binary_to_term(<<131,108,0,0,0,0,106>>), %Zero-length list. + + %% {[],a} where [] is a zero-length list. + ?line {[],a} = binary_to_term(<<131,104,2,108,0,0,0,0,106,100,0,1,97>>), + + %% {42,a} where 42 is a zero-length list with 42 in the tail. + ?line {42,a} = binary_to_term(<<131,104,2,108,0,0,0,0,97,42,100,0,1,97>>), + + %% {{x,y},a} where {x,y} is a zero-length list with {x,y} in the tail. + ?line {{x,y},a} = binary_to_term(<<131,104,2,108,0,0,0,0, + 104,2,100,0,1,120,100,0,1, + 121,100,0,1,97>>), + + %% Bignums fitting in 32 bits. + ?line 16#7FFFFFFF = binary_to_term(<<131,98,127,255,255,255>>), + ?line -1 = binary_to_term(<<131,98,255,255,255,255>>), + + ok. + +%% OTP-8180: Test several terms that have been known to crash the emulator. +%% (Thanks to Scott Lystig Fritchie.) +otp_8180(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line Wc = filename:join(Data, "zzz.*"), + Files = filelib:wildcard(Wc), + [run_otp_8180(F) || F <- Files], + ok. + +run_otp_8180(Name) -> + io:format("~s", [Name]), + ?line {ok,Bins} = file:consult(Name), + [begin + io:format("~p\n", [Bin]), + ?line {'EXIT',{badarg,_}} = (catch binary_to_term(Bin)) + end || Bin <- Bins], + ok. + +%% Utilities. + +make_sub_binary(Bin) when is_binary(Bin) -> + {_,B} = split_binary(list_to_binary([0,1,3,Bin]), 3), + B; +make_sub_binary(List) -> + make_sub_binary(list_to_binary(List)). + +make_unaligned_sub_binary(Bin0) when is_binary(Bin0) -> + Bin1 = <<0:3,Bin0/binary,31:5>>, + Sz = size(Bin0), + <<0:3,Bin:Sz/binary,31:5>> = id(Bin1), + Bin; +make_unaligned_sub_binary(List) -> + make_unaligned_sub_binary(list_to_binary(List)). + +%% Add 1 bit to the size of the binary. +bit_sized_binary(Bin0) -> + Bin = <>, + BitSize = bit_size(Bin), + BitSize = 8*size(Bin) + 1, + Bin. + +unaligned_sub_bin(Bin, 0) -> Bin; +unaligned_sub_bin(Bin0, Offs) -> + F = random:uniform(256), + Roffs = 8-Offs, + Bin1 = <>, + Sz = size(Bin0), + <<_:Offs,Bin:Sz/binary,_:Roffs>> = id(Bin1), + Bin. + +hostname() -> + from($@, atom_to_list(node())). + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(_, []) -> []. + +id(I) -> I. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/bs_bincomp_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/bs_bincomp_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/bs_bincomp_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/bs_bincomp_SUITE.erl 2009-09-18 15:09:15.000000000 +0100 @@ -0,0 +1,130 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% Originally based on Per Gustafsson's test suite. +%% + +-module(bs_bincomp_SUITE). + +-export([all/1, + byte_aligned/1,bit_aligned/1,extended_byte_aligned/1, + extended_bit_aligned/1,mixed/1,tracing/1]). + +-include("test_server.hrl"). + +all(suite) -> + [byte_aligned,bit_aligned,extended_byte_aligned, + extended_bit_aligned,mixed,tracing]. + + +byte_aligned(Config) when is_list(Config) -> + <<"abcdefg">> = << <<(X+32)>> || <> <= <<"ABCDEFG">> >>, + <<1:32/little,2:32/little,3:32/little,4:32/little>> = + << <> || <> <= <<1:32,2:32,3:32,4:32>> >>, + <<1:32/little,2:32/little,3:32/little,4:32/little>> = + << <> || <> <= <<1:16,2:16,3:16,4:16>> >>, + ok. + +bit_aligned(Config) when is_list(Config) -> + <<$a:7,$b:7,$c:7,$d:7,$e:7,$f:7,$g:7>> = + << <<(X+32):7>> || <> <= <<"ABCDEFG">> >>, + <<"ABCDEFG">> = + << <<(X-32)>> || <> <= <<$a:7,$b:7,$c:7,$d:7,$e:7,$f:7,$g:7>> >>, + <<1:31/little,2:31/little,3:31/little,4:31/little>> = + << <> || <> <= <<1:31,2:31,3:31,4:31>> >>, + <<1:31/little,2:31/little,3:31/little,4:31/little>> = + << <> || <> <= <<1:15,2:15,3:15,4:15>> >>, + ok. + +extended_byte_aligned(Config) when is_list(Config) -> + <<"abcdefg">> = << <<(X+32)>> || X <- "ABCDEFG" >>, + "abcdefg" = [(X+32) || <> <= <<"ABCDEFG">>], + <<1:32/little,2:32/little,3:32/little,4:32/little>> = + << <> || X <- [1,2,3,4] >>, + [256,512,768,1024] = + [X || <> <= <<1:16,2:16,3:16,4:16>>], + ok. + +extended_bit_aligned(Config) when is_list(Config) -> + <<$a:7,$b:7,$c:7,$d:7,$e:7,$f:7,$g:7>> = + << <<(X+32):7>> || X <- "ABCDEFG" >>, + "ABCDEFG" = [(X-32) || <> <= <<$a:7,$b:7,$c:7,$d:7,$e:7,$f:7,$g:7>>], + <<1:31/little,2:31/little,3:31/little,4:31/little>> = + << <> || X <- [1,2,3,4] >>, + [256,512,768,1024] = + [X || <> <= <<1:15,2:15,3:15,4:15>>], + ok. + +mixed(Config) when is_list(Config) -> + <<2,3,3,4,4,5,5,6>> = + << <<(X+Y)>> || <> <= <<1,2,3,4>>, <> <= <<1,2>> >>, + <<2,3,3,4,4,5,5,6>> = + << <<(X+Y)>> || <> <= <<1,2,3,4>>, Y <- [1,2] >>, + <<2,3,3,4,4,5,5,6>> = + << <<(X+Y)>> || X <- [1,2,3,4], Y <- [1,2] >>, + [2,3,3,4,4,5,5,6] = + [(X+Y) || <> <= <<1,2,3,4>>, <> <= <<1,2>>], + [2,3,3,4,4,5,5,6] = + [(X+Y) || <> <= <<1,2,3,4>>, Y <- [1,2]], + <<2:3,3:3,3:3,4:3,4:3,5:3,5:3,6:3>> = + << <<(X+Y):3>> || <> <= <<1:3,2:3,3:3,4:3>>, <> <= <<1:3,2:3>> >>, + <<2:3,3:3,3:3,4:3,4:3,5:3,5:3,6:3>> = + << <<(X+Y):3>> || <> <= <<1:3,2:3,3:3,4:3>>, Y <- [1,2] >>, + <<2:3,3:3,3:3,4:3,4:3,5:3,5:3,6:3>> = + << <<(X+Y):3>> || X <- [1,2,3,4], Y <- [1,2] >>, + [2,3,3,4,4,5,5,6] = + [(X+Y) || <> <= <<1:3,2:3,3:3,4:3>>, <> <= <<1:3,2:3>>], + [2,3,3,4,4,5,5,6] = + [(X+Y) || <> <= <<1:3,2:3,3:3,4:3>>, Y <- [1,2]], + ok. + +%% OTP-8179: Call tracing on binary comprehensions would cause a crash. +tracing(Config) when is_list(Config) -> + Self = self(), + Tracer = spawn_opt(fun() -> tracer(Self, 0) end, + [link,{priority,max}]), + Pattern = [{'_',[],[{return_trace}]}], + erlang:trace_pattern({?MODULE,'_','_'}, Pattern, [local]), + erlang:trace(self(), true, [call,{tracer,Tracer}]), + random_binaries(1000), + Tracer ! done, + receive + {Tracer,N} -> + {comment,integer_to_list(N) ++ " trace messages"} + end. + +random_binary() -> + Seq = [1,2,3,4,5,6,7,8,9,10], + << <<($a + random:uniform($z - $a)):8>> || _ <- Seq >>. + +random_binaries(N) when N > 0 -> + random_binary(), + random_binaries(N - 1); +random_binaries(_) -> ok. + +tracer(Parent, N) -> + receive + Msg -> + case Msg of + done -> + Parent ! {self(),N}; + _ -> + tracer(Parent, N+1) + end + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/bs_bit_binaries_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/bs_bit_binaries_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/bs_bit_binaries_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/bs_bit_binaries_SUITE.erl 2009-09-18 15:09:16.000000000 +0100 @@ -0,0 +1,183 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% Originally based on Per Gustafsson's test suite. +%% + +-module(bs_bit_binaries_SUITE). + +-export([all/1, + misc/1,horrid_match/1,test_bitstr/1,test_bit_size/1,asymmetric_tests/1, + big_asymmetric_tests/1,binary_to_and_from_list/1, + big_binary_to_and_from_list/1,send_and_receive/1, + send_and_receive_alot/1,append/1]). + +-include("test_server.hrl"). + +all(suite) -> + [misc,horrid_match,test_bitstr,test_bit_size,asymmetric_tests, + big_asymmetric_tests,binary_to_and_from_list,big_binary_to_and_from_list, + send_and_receive,send_and_receive_alot,append]. + +misc(Config) when is_list(Config) -> + ?line <<1:100>> = id(<<1:100>>), + ?line {ok,ok} = {match(7),match(9)}, + ?line {ok,ok} = {match1(15),match1(31)}, + ok. + + +match(N) -> + %% Move N to a Y register to cover another instruction. + <<0:N>> = id(<<0:N>>), + <<0:N,0:1>> = id(<<0:N,0:1>>), + ok. + +match1(N) -> + %% Putting the binary inside a list will force another + %% instruction to be used. + [<<42:N/little>>] = id([<<42:N/little>>]), + ok. + +test_bit_size(Config) when is_list(Config) -> + ?line 101 = bit_size(<<1:101>>), + ?line 1001 = bit_size(<<1:1001>>), + ?line 80 = bit_size(<<1:80>>), + ?line 800 = bit_size(<<1:800>>), + ?line Bin = <<0:16#1000000>>, + ?line BigBin = list_to_bitstring([Bin||_ <- lists:seq(1,16#10)]++[<<1:1>>]), + ?line 16#10000001 = erlang:bit_size(BigBin), + %% Only run these on computers with lots of memory + %% HugeBin = list_to_bitstring([BigBin||_ <- lists:seq(1,16#10)]++[<<1:1>>]), + %% 16#100000011 = bit_size(HugeBin), + ?line 0 = bit_size(<<>>), + ok. + +horrid_match(Config) when is_list(Config) -> + ?line <<1:4,B:24/bitstring>> = <<1:4,42:24/little>>, + ?line <<42:24/little>> = B, + ok. + +test_bitstr(Config) when is_list(Config) -> + ?line <<1:7,B/bitstring>> = <<1:7,<<1:1,6>>/bitstring>>, + ?line <<1:1,6>> = B, + ?line B = <<1:1,6>>, + ok. + +asymmetric_tests(Config) when is_list(Config) -> + ?line <<1:12>> = <<0,1:4>>, + ?line <<0,1:4>> = <<1:12>>, + ?line <<1:1,X/bitstring>> = <<128,255,0,0:2>>, + ?line <<1,254,0,0:1>> = X, + ?line X = <<1,254,0,0:1>>, + ?line <<1:1,X1:25/bitstring>> = <<128,255,0,0:2>>, + ?line <<1,254,0,0:1>> = X1, + ?line X1 = <<1,254,0,0:1>>, + ok. + +big_asymmetric_tests(Config) when is_list(Config) -> + ?line <<1:875,1:12>> = <<1:875,0,1:4>>, + ?line <<1:875,0,1:4>> = <<1:875,1:12>>, + ?line <<1:1,X/bitstring>> = <<128,255,0,0:2,1:875>>, + ?line <<1,254,0,0:1,1:875>> = X, + ?line X = <<1,254,0,0:1,1:875>>, + ?line <<1:1,X1:900/bitstring>> = <<128,255,0,0:2,1:875>>, + ?line <<1,254,0,0:1,1:875>> = X1, + ?line X1 = <<1,254,0,0:1,1:875>>, + ok. + +binary_to_and_from_list(Config) when is_list(Config) -> + ?line <<1,2,3,4,1:1>> = list_to_bitstring(bitstring_to_list(<<1,2,3,4,1:1>>)), + ?line [1,2,3,4,<<1:1>>] = bitstring_to_list(<<1,2,3,4,1:1>>), + ?line <<1:1,1,2,3,4>> = list_to_bitstring([<<1:1>>,1,2,3,4]), + ?line [128,129,1,130,<<0:1>>] = bitstring_to_list(<<1:1,1,2,3,4>>), + ok. + +big_binary_to_and_from_list(Config) when is_list(Config) -> + ?line <<1:800,2,3,4,1:1>> = list_to_bitstring(bitstring_to_list(<<1:800,2,3,4,1:1>>)), + ?line [1,2,3,4|_Rest1] = bitstring_to_list(<<1,2,3,4,1:800,1:1>>), + ?line <<1:801,1,2,3,4>> = list_to_bitstring([<<1:801>>,1,2,3,4]), + ok. + +send_and_receive(Config) when is_list(Config) -> + ?line Bin = <<1,2:7>>, + Pid = spawn_link(fun() -> receiver(Bin) end), + ?line Pid ! {self(),<<1:7,8:5,Bin/bitstring>>}, + ?line receive + ok -> + ok + end. + +receiver(Bin) -> + receive + {Pid,<<1:7,8:5,Bin/bitstring>>} -> + Pid ! ok + end. + +send_and_receive_alot(Config) when is_list(Config) -> + Bin = <<1:1000001>>, + Pid = spawn_link(fun() -> receiver_alot(Bin) end), + spamalot(100,Bin,Pid). + +spamalot(N,Bin,Pid) when N > 0 -> + Pid ! {self(),<<1:7,8:5,Bin/bitstring>>}, + receive + ok -> + ok + end, + spamalot(N-1,Bin,Pid); +spamalot(0,_Bin,Pid) -> + Pid ! no_more, + ok. + +receiver_alot(Bin) -> + receive + {Pid,<<1:7,8:5,Bin/bitstring>>} -> + Pid ! ok; + no_more -> ok + end, + receiver_alot(Bin). + +append(Config) when is_list(Config) -> + cs_init(), + ?line <<(-1):256/signed-unit:8>> = cs(do_append(id(<<>>), 256*8)), + ?line <<(-1):256/signed-unit:8>> = cs(do_append2(id(<<>>), 256*4)), + cs_end(). + +do_append(Bin, N) when N > 0 -> do_append(<>, N-1); +do_append(Bin, 0) -> Bin. + +do_append2(Bin, N) when N > 0 -> do_append2(<>, N-1); +do_append2(Bin, 0) -> Bin. + +cs_init() -> + erts_debug:set_internal_state(available_internal_state, true), + ok. + +cs_end() -> + erts_debug:set_internal_state(available_internal_state, false), + ok. + +%% Verify that the allocated size is exact (rounded up to the nearest byte). +cs(Bin) -> + ByteSize = byte_size(Bin), + {refc_binary,ByteSize,{binary,ByteSize},_} = + erts_debug:get_internal_state({binary_info,Bin}), + Bin. + +id(I) -> I. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/bs_construct_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/bs_construct_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/bs_construct_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/bs_construct_SUITE.erl 2009-04-16 10:23:58.000000000 +0100 @@ -0,0 +1,790 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% Purpose : Common utilities used by several optimization passes. +%% + +-module(bs_construct_SUITE). + +-export([all/1, + test1/1, test2/1, test3/1, test4/1, test5/1, testf/1, + not_used/1, in_guard/1, + mem_leak/1, coerce_to_float/1, bjorn/1, + huge_float_field/1, huge_binary/1, system_limit/1, badarg/1, + copy_writable_binary/1, kostis/1, dynamic/1, bs_add/1, + otp_7422/1]). + +-include("test_server.hrl"). + +all(suite) -> + [test1, test2, test3, test4, test5, testf, + not_used, in_guard, mem_leak, coerce_to_float, bjorn, + huge_float_field, huge_binary, system_limit, badarg, + copy_writable_binary, kostis, dynamic, bs_add, + otp_7422]. + +big(1) -> + 57285702734876389752897683. + +i(X) -> X. + +r(L) -> + lists:reverse(L). + +-define(T(B, L), {B, ??B, L}). +-define(N(B), {B, ??B, unknown}). + +-define(FAIL(Expr), ?line fail_check(catch Expr, ??Expr, [])). + +-define(FAIL_VARS(Expr, Vars), ?line fail_check(catch Expr, ??Expr, Vars)). + +l(I_13, I_big1) -> + [ + ?T(<<-43>>, + [256-43]), + ?T(<<56>>, + [56]), + ?T(<<1,2>>, + [1, 2]), + ?T(<<4:4, 7:4>>, + [4*16+7]), + ?T(<<777:16/big>>, + [3, 9]), + ?T(<<777:16/little>>, + [9, 3]), + ?T(<<0.0:32/float>>, + [0,0,0,0]), + ?T(<<0.125:32/float>>, + [62,0,0,0]), + ?T(<<0.125:32/little-float>>, + [0,0,0,62]), + ?T(<>, + [138, 99, 0, 147]), + ?T(<<57285702734876389752897684:32>>, + [138, 99, 0, 148]), + ?T(<>, + r([138, 99, 0, 147])), + ?T(<<-1:17/unit:8>>, + lists:duplicate(17, 255)), + + ?T(<>, + [13]), + + ?T(<<4:8/unit:2,5:2/unit:8>>, + [0, 4, 0, 5]), + + ?T(<<1:1, 0:6, 1:1>>, + [129]), + ?T(<<1:1/little, 0:6/little, 1:1/little>>, + [129]), + + ?T(<<<<1,2>>/binary>>, + [1, 2]), + ?T(<<<<1,2>>:1/binary>>, + [1]), + ?T(<<4,3,<<1,2>>:1/binary>>, + [4,3,1]), + + ?T(<<(256*45+47)>>, + [47]), + + ?T(<<57:0>>, + []), + + ?T(<<"apa">>, + "apa"), + + ?T(<<1:3,"string",9:5>>, + [46,110,142,77,45,204,233]), + + ?T(<<>>, + []), + + ?T(<<37.98:64/native-float>>, + native_3798()), + + ?T(<<32978297842987249827298387697777669766334937:128/native-integer>>, + native_bignum()), + + %% Unit tests. + ?T(<<<<5:3>>/bitstring>>, <<5:3>>), + ?T(<<42,<<7:4>>/binary-unit:4>>, <<42,7:4>>), + ?T(<<<<344:17>>/binary-unit:17>>, <<344:17>>), + ?T(<<<<42,3,7656:16>>/binary-unit:16>>, <<42,3,7656:16>>) + + ]. + +native_3798() -> + case <<1:16/native>> of + <<0,1>> -> [64,66,253,112,163,215,10,61]; + <<1,0>> -> [61,10,215,163,112,253,66,64] + end. + +native_bignum() -> + case <<1:16/native>> of + <<0,1>> -> [129,205,18,177,1,213,170,101,39,231,109,128,176,11,73,217]; + <<1,0>> -> [217,73,11,176,128,109,231,39,101,170,213,1,177,18,205,129] + end. + +evaluate(Str, Vars) -> + {ok,Tokens,_} = + erl_scan:string(Str ++ " . "), + {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + case erl_eval:expr(Expr, Vars) of + {value, Result, _} -> + Result + end. + +eval_list([], _Vars) -> + []; +eval_list([{C_bin, Str, Bytes} | Rest], Vars) -> + case catch evaluate(Str, Vars) of + {'EXIT', Error} -> + io:format("Evaluation error: ~p, ~p, ~p~n", [Str, Vars, Error]), + exit(Error); + E_bin -> + [{C_bin, E_bin, Str, Bytes} | eval_list(Rest, Vars)] + end. + +one_test({C_bin, E_bin, Str, Bytes}) when is_list(Bytes) -> + io:format(" ~s, ~p~n", [Str, Bytes]), + Bin = list_to_binary(Bytes), + if + C_bin == Bin -> + ok; + true -> + io:format("ERROR: Compiled: ~p. Expected ~p. Got ~p.~n", + [Str, Bytes, binary_to_list(C_bin)]), + test_server:fail(comp) + end, + if + E_bin == Bin -> + ok; + true -> + io:format("ERROR: Interpreted: ~p. Expected ~p. Got ~p.~n", + [Str, Bytes, binary_to_list(E_bin)]), + test_server:fail(comp) + end; +one_test({C_bin, E_bin, Str, Result}) -> + io:format(" ~s ~p~n", [Str, C_bin]), + if + C_bin == E_bin -> + ok; + true -> + Arbitrary = case Result of + unknown -> + size(C_bin); + _ -> + Result + end, + case equal_lists(binary_to_list(C_bin), + binary_to_list(E_bin), + Arbitrary) of + false -> + io:format("ERROR: Compiled not equal to interpreted:" + "~n ~p, ~p.~n", + [binary_to_list(C_bin), binary_to_list(E_bin)]), + test_server:fail(comp); + 0 -> + ok; + %% For situations where the final bits may not matter, like + %% for floats: + N when is_integer(N) -> + io:format("Info: compiled and interpreted differ in the" + " last bytes:~n ~p, ~p.~n", + [binary_to_list(C_bin), binary_to_list(E_bin)]), + ok + end + end. + +equal_lists([], [], _) -> + 0; +equal_lists([], _, _) -> + false; +equal_lists(_, [], _) -> + false; +equal_lists([A|AR], [A|BR], R) -> + equal_lists(AR, BR, R); +equal_lists(A, B, R) -> + if + length(A) /= length(B) -> + false; + length(A) =< R -> + R; + true -> + false + end. + +fail_check({'EXIT',{badarg,_}}, Str, Vars) -> + try evaluate(Str, Vars) of + Res -> + io:format("Interpreted result: ~p", [Res]), + ?t:fail(did_not_fail_in_intepreted_code) + catch + error:badarg -> + ok + end; +fail_check(Res, _, _) -> + io:format("Compiled result: ~p", [Res]), + ?t:fail(did_not_fail_in_compiled_code). + +%%% Simple working cases +test1(suite) -> []; +test1(Config) when is_list(Config) -> + ?line I_13 = i(13), + ?line I_big1 = big(1), + ?line Vars = [{'I_13', I_13}, + {'I_big1', I_big1}], + ?line lists:foreach(fun one_test/1, eval_list(l(I_13, I_big1), Vars)). + +%%% Misc + +%%% <> +comp(N, A, S) -> + M1 = (1 bsl S) - 1, + M2 = (1 bsl (N-S)) - 1, + [((A band M1) bsl (N-S)) bor (A band M2)]. + +gen(N, S, A) -> + [?T(<>, comp(N, A, S))]. + +gen_l(N, S, A) -> + [?T(<>, comp(N, A, S))]. + +test2(suite) -> []; +test2(Config) when is_list(Config) -> + ?line test2(0, 8, 2#10101010101010101), + ?line test2(0, 8, 2#1111111111). + +test2(End, End, _) -> + ok; +test2(I, End, A) -> + test2(I, A), + test2(I+1, End, A). + +test2(S, A) -> + N = 8, + Vars = [{'A',A}, {'N',N}, {'S',S}], + io:format("Vars: ~p\n", [Vars]), + lists:foreach(fun one_test/1, eval_list(gen(N, S, A), Vars)), + lists:foreach(fun one_test/1, eval_list(gen_l(N, S, A), Vars)). + +%%% Tests without facit + +t3() -> + [?N(<<4711:13, 9876:13, 3:6>>), + ?N(<<4.57:64/float>>), + ?N(<<4.57:32/float>>), + + ?N(<<>>) + ]. + +test3(suite) -> []; +test3(Config) when is_list(Config) -> + ?line Vars = [], + ?line lists:foreach(fun one_test/1, eval_list(t3(), Vars)). + +gen_u(N, S, A) -> + [?N(<>)]. + +gen_u_l(N, S, A) -> + [?N(<>)]. + +test4(suite) -> []; +test4(Config) when is_list(Config) -> + ?line test4(0, 16, 2#10101010101010101), + ?line test4(0, 16, 2#1111111111). + +test4(End, End, _) -> + ok; +test4(I, End, A) -> + test4(I, A), + test4(I+1, End, A). + +test4(S, A) -> + N = 16, + Vars = [{'A', A}, {'N', 16}, {'S', S}], + lists:foreach(fun one_test/1, eval_list(gen_u(N, S, A), Vars)), + lists:foreach(fun one_test/1, eval_list(gen_u_l(N, S, A), Vars)). + +gen_b(N, S, A) -> + [?T(<>, + binary_to_list(<>))]. + +test5(suite) -> []; +test5(doc) -> ["OTP-3995"]; +test5(Config) when is_list(Config) -> + ?line test5(0, 8, <<73>>), + ?line test5(0, 8, <<68>>). + +test5(End, End, _) -> + ok; +test5(I, End, A) -> + test5(I, A), + test5(I+1, End, A). + +test5(S, A) -> + N = 8, + Vars = [{'A', A}, {'N', 8}, {'S', S}], + lists:foreach(fun one_test/1, eval_list(gen_b(N, S, A), Vars)). + +%%% Failure cases +testf(suite) -> []; +testf(Config) when is_list(Config) -> + ?line ?FAIL(<<3.14>>), + ?line ?FAIL(<<<<1,2>>>>), + + ?line ?FAIL(<<2.71/binary>>), + ?line ?FAIL(<<24334/binary>>), + ?line ?FAIL(<<24334344294788947129487129487219847/binary>>), + BigInt = id(24334344294788947129487129487219847), + ?line ?FAIL_VARS(<>, [{'BigInt',BigInt}]), + ?line ?FAIL_VARS(<<42,BigInt/binary>>, [{'BigInt',BigInt}]), + ?line ?FAIL_VARS(<>, [{'BigInt',BigInt}]), + + %% One negative field size, but the sum of field sizes will be 1 byte. + %% Make sure that we reject that properly. + I_minus_777 = id(-777), + I_minus_2047 = id(-2047), + ?line ?FAIL_VARS(<>, + ordsets:from_list([{'I_minus_777',I_minus_777}, + {'I_minus_2047',I_minus_2047}])), + ?line ?FAIL(<<<<1,2,3>>/float>>), + + %% Negative field widths. + ?line testf_1(-8, <<1,2,3,4,5>>), + ?line ?FAIL(<<0:(-(1 bsl 100))>>), + + ?line ?FAIL(<<42:(-16)>>), + ?line ?FAIL(<<3.14:(-8)/float>>), + ?line ?FAIL(<<<<23,56,0,2>>:(-16)/binary>>), + ?line ?FAIL(<<<<23,56,0,2>>:(2.5)/binary>>), + ?line ?FAIL(<<<<23,56,0,2>>:(anka)>>), + ?line ?FAIL(<<<<23,56,0,2>>:(anka)>>), + + %% Unit failures. + ?line ?FAIL(<<<<1:1>>/binary>>), + Sz = id(1), + ?line ?FAIL_VARS(<<<<1:Sz>>/binary>>, [{'Sz',Sz}]), + ?line {'EXIT',{badarg,_}} = (catch <<<<1:(id(1))>>/binary>>), + ?line ?FAIL(<<<<7,8,9>>/binary-unit:16>>), + ?line ?FAIL(<<<<7,8,9,3:7>>/binary-unit:16>>), + ?line ?FAIL(<<<<7,8,9,3:7>>/binary-unit:17>>), + + ok. + +testf_1(W, B) -> + Vars = [{'W',W}], + ?FAIL_VARS(<<42:W>>, Vars), + ?FAIL_VARS(<<3.14:W/float>>, Vars), + ?FAIL_VARS(<>, [{'B',B}|Vars]). + +not_used(doc) -> + "Test that constructed binaries that are not used will still give an exception."; +not_used(Config) when is_list(Config) -> + ?line ok = not_used1(3, <<"dum">>), + ?line {'EXIT',{badarg,_}} = (catch not_used1(3, "dum")), + ?line {'EXIT',{badarg,_}} = (catch not_used2(444, -2)), + ?line {'EXIT',{badarg,_}} = (catch not_used2(444, anka)), + ?line {'EXIT',{badarg,_}} = (catch not_used3(444)), + ok. + +not_used1(I, BinString) -> + <>, + ok. + +not_used2(I, Sz) -> + <>, + ok. + +not_used3(I) -> + <>, + ok. + +in_guard(Config) when is_list(Config) -> + ?line 1 = in_guard(<<16#74ad:16>>, 16#e95, 5), + ?line 2 = in_guard(<<16#3A,16#F7,"hello">>, 16#3AF7, <<"hello">>), + ?line 3 = in_guard(<<16#FBCD:14,3.1415/float,3:2>>, 16#FBCD, 3.1415), + nope = in_guard(<<1>>, 42, b), + nope = in_guard(<<1>>, a, b), + nope = in_guard(<<1,2>>, 1, 1), + nope = in_guard(<<4,5>>, 1, 2.71), + nope = in_guard(<<4,5>>, 1, <<12,13>>), + ok. + +in_guard(Bin, A, B) when <> == Bin -> 1; +in_guard(Bin, A, B) when <> == Bin -> 2; +in_guard(Bin, A, B) when <> == Bin -> 3; +in_guard(Bin, A, B) when {a,b,<>} == Bin -> cant_happen; +in_guard(_, _, _) -> nope. + +mem_leak(doc) -> "Make sure that construction has no memory leak"; +mem_leak(Config) when is_list(Config) -> + ?line B = make_bin(16, <<0>>), + ?line mem_leak(1024, B), + ok. + +mem_leak(0, _) -> ok; +mem_leak(N, B) -> + ?line big_bin(B, <<23>>), + ?line {'EXIT',{badarg,_}} = (catch big_bin(B, bad)), + maybe_gc(), + mem_leak(N-1, B). + +big_bin(B1, B2) -> + <>. + +make_bin(0, Acc) -> Acc; +make_bin(N, Acc) -> make_bin(N-1, <>). + +maybe_gc() -> + case erlang:system_info(heap_type) of + shared -> erlang:garbage_collect(); + hybrid -> erlang:garbage_collect(); + private -> ok + end. + +-define(COF(Int0), + ?line (fun(Int) -> + true = <> =:= <<(float(Int)):32/float>>, + true = <> =:= <<(float(Int)):64/float>> + end)(nonliteral(Int0)), + ?line true = <> =:= <<(float(Int0)):32/float>>, + ?line true = <> =:= <<(float(Int0)):64/float>>). + +-define(COF64(Int0), + ?line (fun(Int) -> + true = <> =:= <<(float(Int)):64/float>> + end)(nonliteral(Int0)), + ?line true = <> =:= <<(float(Int0)):64/float>>). + +nonliteral(X) -> X. + +coerce_to_float(Config) when is_list(Config) -> + ?COF(0), + ?COF(-1), + ?COF(1), + ?COF(42), + ?COF(255), + ?COF(-255), + ?COF(38474), + ?COF(387498738948729893849444444443), + ?COF(-37489378937773899999999999999993), + ?COF64(298748888888888888888888888883478264866528467367364766666666666666663), + ?COF64(-367546729879999999999947826486652846736736476555566666663), + ok. + +bjorn(Config) when is_list(Config) -> + ?line error = bjorn_1(), + ok. + +bjorn_1() -> + Bitstr = <<7:13>>, + try + do_something() + catch + throw:blurf -> + ignore + end, + do_more(Bitstr, 13). + +do_more(Bin, Sz) -> + %% Previous bug in the bs_bits_to_bytes instruction: The exeption code + %% was not set - the previous exception (throw:blurf) would be used, + %% causing the catch to slip. + try <> of + _V -> ok + catch + error:_ -> + error + end. + +do_something() -> + throw(blurf). + +huge_float_field(Config) when is_list(Config) -> + ?line {'EXIT',{badarg,_}} = (catch <<0.0:9/float-unit:8>>), + ?line huge_float_check(catch <<0.0:67108865/float-unit:64>>), + ?line huge_float_check(catch <<0.0:((1 bsl 26)+1)/float-unit:64>>), + ?line huge_float_check(catch <<0.0:(id(67108865))/float-unit:64>>), +%% ?line huge_float_check(catch <<0.0:((1 bsl 60)+1)/float-unit:64>>), + ?line huge_float_check(catch <<3839739387439387383739387987347983:((1 bsl 26)+1)/float-unit:64>>), +%% ?line huge_float_check(catch <<3839739387439387383739387987347983:((1 bsl 60)+1)/float-unit:64>>), + ok. + +huge_float_check({'EXIT',{system_limit,_}}) -> ok; +huge_float_check({'EXIT',{badarg,_}}) -> ok. + +huge_binary(Config) when is_list(Config) -> + ?line 16777216 = size(<<0:(id(1 bsl 26)),(-1):(id(1 bsl 26))>>), + ok. + +system_limit(Config) when is_list(Config) -> + WordSize = erlang:system_info(wordsize), + BitsPerWord = WordSize * 8, + ?line {'EXIT',{system_limit,_}} = + (catch <<0:(id(0)),42:(id(1 bsl BitsPerWord))>>), + ?line {'EXIT',{system_limit,_}} = + (catch <<42:(id(1 bsl BitsPerWord)),0:(id(0))>>), + ?line {'EXIT',{system_limit,_}} = + (catch <<(id(<<>>))/binary,0:(id(1 bsl 100))>>), + + case WordSize of + 4 -> + system_limit_32(); + 8 -> + ok + end. + +system_limit_32() -> + ?line {'EXIT',{badarg,_}} = (catch <<42:(-1)>>), + ?line {'EXIT',{badarg,_}} = (catch <<42:(id(-1))>>), + ?line {'EXIT',{badarg,_}} = (catch <<42:(id(-389739873536870912))/unit:8>>), + ?line {'EXIT',{system_limit,_}} = (catch <<42:536870912/unit:8>>), + ?line {'EXIT',{system_limit,_}} = (catch <<42:(id(536870912))/unit:8>>), + ?line {'EXIT',{system_limit,_}} = (catch <<0:(id(8)),42:536870912/unit:8>>), + ?line {'EXIT',{system_limit,_}} = + (catch <<0:(id(8)),42:(id(536870912))/unit:8>>), + ok. + +badarg(Config) when is_list(Config) -> + ?line {'EXIT',{badarg,_}} = + (catch <<0:(id(1 bsl 100)),0:(id(-1))>>), + ?line {'EXIT',{badarg,_}} = + (catch <<0:(id(1 bsl 100)),0:(id(-(1 bsl 70)))>>), + ?line {'EXIT',{badarg,_}} = + (catch <<0:(id(-(1 bsl 70))),0:(id(1 bsl 100))>>), + + ?line {'EXIT',{badarg,_}} = + (catch <<(id(<<>>))/binary,0:(id(-(1 bsl 100)))>>), + + ok. + +copy_writable_binary(Config) when is_list(Config) -> + ?line [copy_writable_binary_1(I) || I <- lists:seq(0, 256)], + ok. + +copy_writable_binary_1(_) -> + ?line Bin0 = <<(id(<<>>))/binary,0,1,2,3,4,5,6,7>>, + ?line SubBin = make_sub_bin(Bin0), + ?line id(<<42,34,55,Bin0/binary>>), %Make reallocation likelier. + ?line Pid = spawn(fun() -> + copy_writable_binary_holder(Bin0, SubBin) + end), + ?line Tab = ets:new(holder, []), + ?line ets:insert(Tab, {17,Bin0}), + ?line ets:insert(Tab, {42,SubBin}), + ?line id(<>), + ?line Pid ! self(), + ?line [{17,Bin0}] = ets:lookup(Tab, 17), + ?line [{42,Bin0}] = ets:lookup(Tab, 42), + receive + {Pid,Bin0,Bin0} -> ok; + Other -> + io:format("Unexpected message: ~p", [Other]), + ?line ?t:fail() + end, + ok. + +copy_writable_binary_holder(Bin, SubBin) -> + receive + Pid -> + Pid ! {self(),Bin,SubBin} + end. + +make_sub_bin(Bin0) -> + N = bit_size(Bin0), + <<_:17,Bin:N/bitstring,_:5>> = <<(-1):17,Bin0/bitstring,(-1):5>>, + Bin = Bin0, %Assertion. + Bin. + +%% Make sure that bit syntax expression with huge field size are +%% not constructed at compile time. + +kostis(Config) when is_list(Config) -> + case have_250_terabytes_of_ram() of + true -> + Bin = <<0:800000000000>>, + EmbeddedBin = <<0,(<<0:99999999999>>)/bitstring,1>>, + Bin0 = list_to_binary([Bin,Bin,Bin,Bin,Bin]), + Bin1 = list_to_binary([Bin0,Bin0,Bin0,Bin0,Bin0,Bin0]), + Bin2 = list_to_binary([Bin1,Bin1]), + id({EmbeddedBin,Bin0,Bin1,Bin2}); + false -> + ok + end. + +%% I'm not even certain how much 250 TB really is... +%% but I'm sure I don't have it :-) + +have_250_terabytes_of_ram() -> false. + +%% Test that different ways of using bit syntax instructions +%% give the same result. + +dynamic(Config) when is_list(Config) -> + ?line dynamic_1(fun dynamic_big/5), + ?line dynamic_1(fun dynamic_little/5), + ok. + +dynamic_1(Dynamic) -> + <> = erlang:md5([0]), + <> = erlang:md5([1]), + <> = erlang:md5([2]), + 8385 = dynamic_2(0, {Int,Lpad,Rpad,Dynamic}, 0). + +dynamic_2(129, _, Count) -> Count; +dynamic_2(Bef, Data, Count0) -> + Count = dynamic_3(Bef, 128-Bef, Data, Count0), + dynamic_2(Bef+1, Data, Count). + +dynamic_3(_, -1, _, Count) -> Count; +dynamic_3(Bef, N, {Int0,Lpad,Rpad,Dynamic}=Data, Count) -> + Int1 = Int0 band ((1 bsl (N+3))-1), + Dynamic(Bef, N, Int1, Lpad, Rpad), + Dynamic(Bef, N, -Int1, Lpad, Rpad), + + %% OTP-7085: Test a small number in a wide field. + Int2 = Int0 band 16#FFFFFF, + Dynamic(Bef, N, Int2, Lpad, Rpad), + Dynamic(Bef, N, -Int2, Lpad, Rpad), + dynamic_3(Bef, N-1, Data, Count+1). + +dynamic_big(Bef, N, Int, Lpad, Rpad) -> + NumBin = id(<>), + MaskedInt = Int band ((1 bsl N) - 1), + <> = NumBin, + + %% Construct the binary in two different ways. + Bin = id(<>), + Bin = <>, + + %% Further verify the result by matching. + LpadMasked = Lpad band ((1 bsl Bef) - 1), + RpadMasked = Rpad band ((1 bsl (128-Bef-N)) - 1), + Rbits = (128-Bef-N), + <> = id(Bin), + ok. + +dynamic_little(Bef, N, Int, Lpad, Rpad) -> + NumBin = id(<>), + MaskedInt = Int band ((1 bsl N) - 1), + <> = NumBin, + + %% Construct the binary in two different ways. + Bin = id(<>), + Bin = <>, + + %% Further verify the result by matching. + LpadMasked = Lpad band ((1 bsl Bef) - 1), + RpadMasked = Rpad band ((1 bsl (128-Bef-N)) - 1), + Rbits = (128-Bef-N), + <> = id(Bin), + ok. + +%% Test that the bs_add/5 instruction handles big numbers correctly. +bs_add(Config) when is_list(Config) -> + Mod = bs_construct_bs_add, + N = 2000, + Code = [{module, Mod}, + {exports, [{bs_add,2}]}, + {labels, 2}, + + %% bs_add(Number, -SmallestBig) -> Number + N + {function, bs_add, 2, 2}, + {label,1}, + {func_info,{atom,Mod},{atom,bs_add},2}, + + {label,2}, + {move,{x,0},{x,2}}] ++ + lists:duplicate(N-1, {bs_add,{f,0},[{x,2},{integer,1},1],{x,2}}) ++ + [{gc_bif,abs,{f,0},3,[{x,1}],{x,4}}, %Force GC, ignore result. + {gc_bif,'+',{f,0},3,[{x,2},{integer,1}],{x,0}}, %Safe result in {x,0} + return], + + %% Write assembly file and assemble it. + ?line PrivDir = ?config(priv_dir, Config), + ?line RootName = filename:join(PrivDir, atom_to_list(Mod)), + ?line AsmFile = RootName ++ ".S", + ?line {ok,Fd} = file:open(AsmFile, [write]), + ?line [io:format(Fd, "~p. \n", [T]) || T <- Code], + ?line ok = file:close(Fd), + ?line {ok,Mod} = compile:file(AsmFile, [from_asm,report,{outdir,PrivDir}]), + ?line LoadRc = code:load_abs(RootName), + ?line {module,_Module} = LoadRc, + + %% Find smallest positive bignum. + ?line SmallestBig = smallest_big(), + ?line io:format("~p\n", [SmallestBig]), + ?line Expected = SmallestBig + N, + DoTest = fun() -> + exit(Mod:bs_add(SmallestBig, -SmallestBig)) + end, + ?line {Pid,Mref} = spawn_monitor(DoTest), + receive + {'DOWN',Mref,process,Pid,Res} -> ok + end, + ?line Expected = Res, + + %% Clean up. + ?line ok = file:delete(AsmFile), + ?line ok = file:delete(code:which(Mod)), + ok. + + +smallest_big() -> + smallest_big_1(1 bsl 24). + +smallest_big_1(N) -> + case erts_debug:flat_size(N) of + 0 -> smallest_big_1(N+N); + _ -> N + end. + +otp_7422(Config) when is_list(Config) -> + otp_7422_int(0), + otp_7422_bin(0). + +otp_7422_int(N) when N < 512 -> + T = erlang:make_tuple(N, []), + spawn_link(fun() -> + id(T), + %% A size of field 0 would write one byte beyond + %% the current position in the binary. It could + %% overwrite the continuation pointer stored on + %% the stack if HTOP was equal to E (the stack pointer). + id(<<0:(id(0))>>) + end), + otp_7422_int(N+1); +otp_7422_int(_) -> ok. + +otp_7422_bin(N) when N < 512 -> + T = erlang:make_tuple(N, []), + Z = id(<<>>), + spawn_link(fun() -> + id(T), + id(<>) + end), + otp_7422_bin(N+1); +otp_7422_bin(_) -> ok. + +id(I) -> I. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/bs_match_bin_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/bs_match_bin_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/bs_match_bin_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/bs_match_bin_SUITE.erl 2009-09-18 15:08:11.000000000 +0100 @@ -0,0 +1,195 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(bs_match_bin_SUITE). + +-export([all/1,byte_split_binary/1,bit_split_binary/1,match_huge_bin/1]). + +-include("test_server.hrl"). + +all(suite) -> + [byte_split_binary,bit_split_binary,match_huge_bin]. + +byte_split_binary(doc) -> "Tries to split a binary at all byte-aligned positions."; +byte_split_binary(Config) when is_list(Config) -> + ?line L = lists:seq(0, 57), + ?line B = mkbin(L), + ?line byte_split(L, B, size(B)), + ?line Unaligned = make_unaligned_sub_binary(B), + ?line byte_split(L, Unaligned, size(Unaligned)). + +byte_split(L, B, Pos) when Pos >= 0 -> + ?line Sz1 = Pos, + ?line Sz2 = size(B) - Pos, + ?line <> = B, + ?line B1 = list_to_binary(lists:sublist(L, 1, Pos)), + ?line B2 = list_to_binary(lists:nthtail(Pos, L)), + ?line byte_split(L, B, Pos-1); +byte_split(_, _, _) -> ok. + +bit_split_binary(doc) -> "Tries to split a binary at all positions."; +bit_split_binary(Config) when is_list(Config) -> + Fun = fun(Bin, List, SkipBef, N) -> + ?line SkipAft = 8*size(Bin) - N - SkipBef, + %%io:format("~p, ~p, ~p", [SkipBef,N,SkipAft]), + ?line <<_:SkipBef,OutBin:N/binary-unit:1,_:SkipAft>> = Bin, + ?line OutBin = make_bin_from_list(List, N) + end, + ?line bit_split_binary1(Fun, erlang:md5(<<1,2,3>>)), + ?line bit_split_binary1(Fun, + make_unaligned_sub_binary(erlang:md5(<<1,2,3>>))), + ok. + +bit_split_binary1(Action, Bin) -> + BitList = bits_to_list(binary_to_list(Bin), 16#80), + bit_split_binary2(Action, Bin, BitList, 0). + +bit_split_binary2(Action, Bin, [_|T]=List, Bef) -> + bit_split_binary3(Action, Bin, List, Bef, size(Bin)*8), + bit_split_binary2(Action, Bin, T, Bef+1); +bit_split_binary2(_, _, [], _) -> ok. + +bit_split_binary3(Action, Bin, List, Bef, Aft) when Bef =< Aft -> + Action(Bin, List, Bef, (Aft-Bef) div 8 * 8), + bit_split_binary3(Action, Bin, List, Bef, Aft-8); +bit_split_binary3(_, _, _, _, _) -> ok. + +make_bin_from_list(_, 0) -> mkbin([]); +make_bin_from_list(List, N) -> + list_to_binary([make_int(List, 8, 0), + make_bin_from_list(lists:nthtail(8, List), N-8)]). + + +make_int(_, 0, Acc) -> Acc; +make_int([H|T], N, Acc) -> make_int(T, N-1, Acc bsl 1 bor H). + +bits_to_list([_|T], 0) -> bits_to_list(T, 16#80); +bits_to_list([H|_]=List, Mask) -> + [case H band Mask of + 0 -> 0; + _ -> 1 + end|bits_to_list(List, Mask bsr 1)]; +bits_to_list([], _) -> []. + +mkbin(L) when is_list(L) -> list_to_binary(L). + +make_unaligned_sub_binary(Bin0) -> + Bin1 = <<0:3,Bin0/binary,31:5>>, + Sz = size(Bin0), + <<0:3,Bin:Sz/binary,31:5>> = id(Bin1), + Bin. + +id(I) -> I. + +match_huge_bin(Config) when is_list(Config) -> + ?line Bin = <<0:(1 bsl 27),13:8>>, + ?line skip_huge_bin_1(1 bsl 27, Bin), + ?line 16777216 = match_huge_bin_1(1 bsl 27, Bin), + + %% Test overflowing the size of a binary field. + ?line nomatch = overflow_huge_bin_skip_32(Bin), + ?line nomatch = overflow_huge_bin_32(Bin), + ?line nomatch = overflow_huge_bin_skip_64(Bin), + ?line nomatch = overflow_huge_bin_64(Bin), + + %% Size in variable + ?line ok = overflow_huge_bin(Bin, lists:seq(25, 32)++lists:seq(50, 64)), + ?line ok = overflow_huge_bin_unit128(Bin, lists:seq(25, 32)++lists:seq(50, 64)), + + ok. + +overflow_huge_bin(Bin, [Sz0|Sizes]) -> + Sz = id(1 bsl Sz0), + case Bin of + <<_:Sz/binary-unit:8,0,_/binary>> -> + {error,Sz}; + _ -> + case Bin of + <> -> + {error,Sz,size(NewBin)}; + _ -> + overflow_huge_bin(Bin, Sizes) + end + end; +overflow_huge_bin(_, []) -> ok. + +overflow_huge_bin_unit128(Bin, [Sz0|Sizes]) -> + Sz = id(1 bsl Sz0), + case Bin of + <<_:Sz/binary-unit:128,0,_/binary>> -> + {error,Sz}; + _ -> + case Bin of + <> -> + {error,Sz,size(NewBin)}; + _ -> + overflow_huge_bin_unit128(Bin, Sizes) + end + end; +overflow_huge_bin_unit128(_, []) -> ok. + +skip_huge_bin_1(I, Bin) -> + <<_:I/binary-unit:1,13>> = Bin, + ok. + +match_huge_bin_1(I, Bin) -> + case Bin of + <> -> size(Val); + _ -> nomatch + end. + +overflow_huge_bin_skip_32(<<_:4294967296/binary,0,_/binary>>) -> 1; % 1 bsl 32 +overflow_huge_bin_skip_32(<<_:33554432/binary-unit:128,0,_/binary>>) -> 2; % 1 bsl 25 +overflow_huge_bin_skip_32(<<_:67108864/binary-unit:64,0,_/binary>>) -> 3; % 1 bsl 26 +overflow_huge_bin_skip_32(<<_:134217728/binary-unit:32,0,_/binary>>) -> 4; % 1 bsl 27 +overflow_huge_bin_skip_32(<<_:268435456/binary-unit:16,0,_/binary>>) -> 5; % 1 bsl 28 +overflow_huge_bin_skip_32(<<_:536870912/binary-unit:8,0,_/binary>>) -> 6; % 1 bsl 29 +overflow_huge_bin_skip_32(<<_:1073741824/binary-unit:8,0,_/binary>>) -> 7; % 1 bsl 30 +overflow_huge_bin_skip_32(<<_:2147483648/binary-unit:8,0,_/binary>>) -> 8; % 1 bsl 31 +overflow_huge_bin_skip_32(_) -> nomatch. + +overflow_huge_bin_32(<>) -> {1,Bin}; % 1 bsl 32 +overflow_huge_bin_32(<>) -> {2,Bin}; % 1 bsl 25 +overflow_huge_bin_32(<>) -> {3,Bin}; % 1 bsl 26 +overflow_huge_bin_32(<>) -> {4,Bin}; % 1 bsl 27 +overflow_huge_bin_32(<>) -> {5,Bin}; % 1 bsl 28 +overflow_huge_bin_32(<>) -> {6,Bin}; % 1 bsl 29 +overflow_huge_bin_32(<>) -> {7,Bin}; % 1 bsl 30 +overflow_huge_bin_32(<>) -> {8,Bin}; % 1 bsl 31 +overflow_huge_bin_32(_) -> nomatch. + +overflow_huge_bin_skip_64(<<_:18446744073709551616/binary,0,_/binary>>) -> 1; % 1 bsl 64 +overflow_huge_bin_skip_64(<<_:144115188075855872/binary-unit:128,0,_/binary>>) -> 2; % 1 bsl 57 +overflow_huge_bin_skip_64(<<_:288230376151711744/binary-unit:64,0,_/binary>>) -> 3; % 1 bsl 58 +overflow_huge_bin_skip_64(<<_:576460752303423488/binary-unit:32,0,_/binary>>) -> 4; % 1 bsl 59 +overflow_huge_bin_skip_64(<<_:1152921504606846976/binary-unit:16,0,_/binary>>) -> 5; % 1 bsl 60 +overflow_huge_bin_skip_64(<<_:2305843009213693952/binary-unit:8,0,_/binary>>) -> 6; % 1 bsl 61 +overflow_huge_bin_skip_64(<<_:4611686018427387904/binary-unit:8,0,_/binary>>) -> 7; % 1 bsl 62 +overflow_huge_bin_skip_64(<<_:9223372036854775808/binary-unit:8,_/binary>>) -> 8; % 1 bsl 63 +overflow_huge_bin_skip_64(_) -> nomatch. + +overflow_huge_bin_64(<>) -> {1,Bin}; % 1 bsl 64 +overflow_huge_bin_64(<>) -> {2,Bin}; % 1 bsl 57 +overflow_huge_bin_64(<>) -> {3,Bin}; % 1 bsl 58 +overflow_huge_bin_64(<>) -> {4,Bin}; % 1 bsl 59 +overflow_huge_bin_64(<>) -> {5,Bin}; % 1 bsl 60 +overflow_huge_bin_64(<>) -> {6,Bin}; % 1 bsl 61 +overflow_huge_bin_64(<>) -> {7,Bin}; % 1 bsl 62 +overflow_huge_bin_64(<>) -> {8,Bin}; % 1 bsl 63 +overflow_huge_bin_64(_) -> nomatch. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/bs_match_int_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/bs_match_int_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/bs_match_int_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/bs_match_int_SUITE.erl 2009-09-18 15:08:11.000000000 +0100 @@ -0,0 +1,331 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(bs_match_int_SUITE). + +-export([all/1,integer/1,signed_integer/1,dynamic/1,more_dynamic/1,mml/1, + match_huge_int/1,bignum/1,unaligned_32_bit/1]). + +-include("test_server.hrl"). + +-import(lists, [seq/2]). + +all(suite) -> + [integer,signed_integer,dynamic,more_dynamic,mml,match_huge_int,bignum, + unaligned_32_bit]. + +integer(Config) when is_list(Config) -> + ?line 0 = get_int(mkbin([])), + ?line 0 = get_int(mkbin([0])), + ?line 42 = get_int(mkbin([42])), + ?line 255 = get_int(mkbin([255])), + ?line 256 = get_int(mkbin([1,0])), + ?line 257 = get_int(mkbin([1,1])), + ?line 258 = get_int(mkbin([1,2])), + ?line 258 = get_int(mkbin([1,2])), + ?line 65534 = get_int(mkbin([255,254])), + ?line 16776455 = get_int(mkbin([255,253,7])), + ?line 4245492555 = get_int(mkbin([253,13,19,75])), + ?line 4294967294 = get_int(mkbin([255,255,255,254])), + ?line 4294967295 = get_int(mkbin([255,255,255,255])), + ?line Eight = [200,1,19,128,222,42,97,111], + ?line cmp128(Eight, uint(Eight)), + ?line fun_clause(catch get_int(mkbin(seq(1,5)))), + ok. + +get_int(Bin) -> + I = get_int1(Bin), + get_int(Bin, I). + +get_int(Bin0, I) when size(Bin0) < 4 -> + Bin = <<0,Bin0/binary>>, + I = get_int1(Bin), + get_int(Bin, I); +get_int(_, I) -> I. + +get_int1(<>) -> I; +get_int1(<>) -> I; +get_int1(<>) -> I; +get_int1(<>) -> I; +get_int1(<>) -> I. + +cmp128(<>, I) -> equal; +cmp128(_, _) -> not_equal. + +signed_integer(Config) when is_list(Config) -> + ?line {no_match,_} = sint(mkbin([])), + ?line {no_match,_} = sint(mkbin([1,2,3])), + ?line 127 = sint(mkbin([127])), + ?line -1 = sint(mkbin([255])), + ?line -128 = sint(mkbin([128])), + ?line 42 = sint(mkbin([42,255])), + ?line 127 = sint(mkbin([127,255])). + +sint(Bin) -> + case Bin of + <> -> I; + <> -> I; + Other -> {no_match,Other} + end. + +uint(L) -> uint(L, 0). +uint([H|T], Acc) -> uint(T, Acc bsl 8 bor H); +uint([], Acc) -> Acc. + +dynamic(Config) when is_list(Config) -> + dynamic(mkbin([255]), 8), + dynamic(mkbin([255,255]), 16), + dynamic(mkbin([255,255,255]), 24), + dynamic(mkbin([255,255,255,255]), 32), + ok. + +dynamic(Bin, S1) when S1 >= 0 -> + S2 = size(Bin) * 8 - S1, + dynamic(Bin, S1, S2, (1 bsl S1) - 1, (1 bsl S2) - 1), + dynamic(Bin, S1-1); +dynamic(_, _) -> ok. + +dynamic(Bin, S1, S2, A, B) -> +% io:format("~p ~p ~p ~p\n", [S1,S2,A,B]), + case Bin of + <> -> + io:format("~p ~p ~p ~p\n", [S1,S2,A,B]), + ok; + _Other -> erlang:error(badmatch, [Bin,S1,S2,A,B]) + end. + +more_dynamic(doc) -> "Extract integers at different alignments and of different sizes."; +more_dynamic(Config) when is_list(Config) -> + + % Unsigned big-endian numbers. + Unsigned = fun(Bin, List, SkipBef, N) -> + SkipAft = 8*size(Bin) - N - SkipBef, + <<_:SkipBef,Int:N,_:SkipAft>> = Bin, + Int = make_int(List, N, 0) + end, + ?line more_dynamic1(Unsigned, erlang:md5(mkbin([42]))), + + %% Signed big-endian numbers. + Signed = fun(Bin, List, SkipBef, N) -> + SkipAft = 8*size(Bin) - N - SkipBef, + <<_:SkipBef,Int:N/signed,_:SkipAft>> = Bin, + case make_signed_int(List, N) of + Int -> ok; + Other -> + io:format("Bin = ~p,", [Bin]), + io:format("SkipBef = ~p, N = ~p", [SkipBef,N]), + io:format("Expected ~p, got ~p", [Int,Other]), + ?t:fail() + end + end, + ?line more_dynamic1(Signed, erlang:md5(mkbin([43]))), + + %% Unsigned little-endian numbers. + UnsLittle = fun(Bin, List, SkipBef, N) -> + SkipAft = 8*size(Bin) - N - SkipBef, + <<_:SkipBef,Int:N/little,_:SkipAft>> = Bin, + Int = make_int(big_to_little(List, N), N, 0) + end, + ?line more_dynamic1(UnsLittle, erlang:md5(mkbin([44]))), + + %% Signed little-endian numbers. + SignLittle = fun(Bin, List, SkipBef, N) -> + SkipAft = 8*size(Bin) - N - SkipBef, + <<_:SkipBef,Int:N/signed-little,_:SkipAft>> = Bin, + Little = big_to_little(List, N), + Int = make_signed_int(Little, N) + end, + ?line more_dynamic1(SignLittle, erlang:md5(mkbin([45]))), + + ok. + +more_dynamic1(Action, Bin) -> + BitList = bits_to_list(binary_to_list(Bin), 16#80), + more_dynamic2(Action, Bin, BitList, 0). + +more_dynamic2(Action, Bin, [_|T]=List, Bef) -> + more_dynamic3(Action, Bin, List, Bef, size(Bin)*8), + more_dynamic2(Action, Bin, T, Bef+1); +more_dynamic2(_, _, [], _) -> ok. + +more_dynamic3(Action, Bin, List, Bef, Aft) when Bef =< Aft -> +%% io:format("~p, ~p", [Bef,Aft-Bef]), + Action(Bin, List, Bef, Aft-Bef), + more_dynamic3(Action, Bin, List, Bef, Aft-1); +more_dynamic3(_, _, _, _, _) -> ok. + +big_to_little(List, N) -> big_to_little(List, N, []). + +big_to_little([B0,B1,B2,B3,B4,B5,B6,B7|T], N, Acc) when N >= 8 -> + big_to_little(T, N-8, [B0,B1,B2,B3,B4,B5,B6,B7|Acc]); +big_to_little(List, N, Acc) -> lists:sublist(List, 1, N) ++ Acc. + +make_signed_int(_List, 0) -> 0; +make_signed_int([0|_]=List, N) -> make_int(List, N, 0); +make_signed_int([1|_]=List0, N) -> + List1 = reversed_sublist(List0, N, []), + List2 = two_complement_and_reverse(List1, 1, []), + -make_int(List2, length(List2), 0). + +reversed_sublist(_List, 0, Acc) -> Acc; +reversed_sublist([H|T], N, Acc) -> reversed_sublist(T, N-1, [H|Acc]). + +two_complement_and_reverse([H|T], Carry, Acc) -> + Sum = 1-H+Carry, + two_complement_and_reverse(T, Sum div 2, [Sum rem 2|Acc]); +two_complement_and_reverse([], Carry, Acc) -> [Carry|Acc]. + +make_int(_List, 0, Acc) -> Acc; +make_int([H|T], N, Acc) -> make_int(T, N-1, Acc bsl 1 bor H). + +bits_to_list([_|T], 0) -> bits_to_list(T, 16#80); +bits_to_list([H|_]=List, Mask) -> + [case H band Mask of + 0 -> 0; + _ -> 1 + end|bits_to_list(List, Mask bsr 1)]; +bits_to_list([], _) -> []. + +fun_clause({'EXIT',{function_clause,_}}) -> ok. +mkbin(L) when is_list(L) -> list_to_binary(L). + + +mml(Config) when is_list(Config) -> + ?line single_byte_binary = mml_choose(<<42>>), + ?line multi_byte_binary = mml_choose(<<42,43>>). + +mml_choose(<<_A:8>>) -> single_byte_binary; +mml_choose(<<_A:8,_T/binary>>) -> multi_byte_binary. + +match_huge_int(Config) when is_list(Config) -> + Sz = 1 bsl 27, + ?line Bin = <<0:Sz,13:8>>, + ?line skip_huge_int_1(Sz, Bin), + ?line 0 = match_huge_int_1(Sz, Bin), + + %% Test overflowing the size of an integer field. + ?line nomatch = overflow_huge_int_skip_32(Bin), + case erlang:system_info(wordsize) of + 4 -> + ?line nomatch = overflow_huge_int_32(Bin); + 8 -> + %% An attempt will be made to allocate heap space for + %% the bignum (which will probably fail); only if the + %% allocation succeds will the matching fail because + %% the binary is too small. + ok + end, + ?line nomatch = overflow_huge_int_skip_64(Bin), + ?line nomatch = overflow_huge_int_64(Bin), + + %% Test overflowing the size of an integer field using variables as sizes. + ?line Sizes = case erlang:system_info(wordsize) of + 4 -> lists:seq(25, 32); + 8 -> [] + end ++ lists:seq(50, 64), + ?line ok = overflow_huge_int_unit128(Bin, Sizes), + + ok. + +overflow_huge_int_unit128(Bin, [Sz0|Sizes]) -> + Sz = id(1 bsl Sz0), + case Bin of + <<_:Sz/unit:128,0,_/binary>> -> + {error,Sz}; + _ -> + case Bin of + <> -> + {error,Sz,Var}; + _ -> + overflow_huge_int_unit128(Bin, Sizes) + end + end; +overflow_huge_int_unit128(_, []) -> ok. + +match_huge_int_1(I, Bin) -> + <> = Bin, + Int. + +skip_huge_int_1(I, Bin) -> + <<_:I,13>> = Bin. + +overflow_huge_int_skip_32(<<_:4294967296,0,_/binary>>) -> 1; % 1 bsl 32 +overflow_huge_int_skip_32(<<_:33554432/unit:128,0,_/binary>>) -> 2; % 1 bsl 25 +overflow_huge_int_skip_32(<<_:67108864/unit:64,0,_/binary>>) -> 3; % 1 bsl 26 +overflow_huge_int_skip_32(<<_:134217728/unit:32,0,_/binary>>) -> 4; % 1 bsl 27 +overflow_huge_int_skip_32(<<_:268435456/unit:16,0,_/binary>>) -> 5; % 1 bsl 28 +overflow_huge_int_skip_32(<<_:536870912/unit:8,0,_/binary>>) -> 6; % 1 bsl 29 +overflow_huge_int_skip_32(<<_:1073741824/unit:8,0,_/binary>>) -> 7; % 1 bsl 30 +overflow_huge_int_skip_32(<<_:2147483648/unit:8,0,_/binary>>) -> 8; % 1 bsl 31 +overflow_huge_int_skip_32(_) -> nomatch. + +overflow_huge_int_32(<>) -> {1,Int}; % 1 bsl 32 +overflow_huge_int_32(<>) -> {2,Int}; % 1 bsl 25 +overflow_huge_int_32(<>) -> {3,Int}; % 1 bsl 26 +overflow_huge_int_32(<>) -> {4,Int}; % 1 bsl 27 +overflow_huge_int_32(<>) -> {5,Int}; % 1 bsl 28 +overflow_huge_int_32(<>) -> {6,Int}; % 1 bsl 29 +overflow_huge_int_32(<>) -> {7,Int}; % 1 bsl 30 +overflow_huge_int_32(<>) -> {8,Int}; % 1 bsl 31 +overflow_huge_int_32(_) -> nomatch. + +overflow_huge_int_skip_64(<<_:18446744073709551616,_/binary>>) -> 1; % 1 bsl 64 +overflow_huge_int_skip_64(<<_:144115188075855872/unit:128,0,_/binary>>) -> 2; % 1 bsl 57 +overflow_huge_int_skip_64(<<_:288230376151711744/unit:64,0,_/binary>>) -> 3; % 1 bsl 58 +overflow_huge_int_skip_64(<<_:576460752303423488/unit:32,0,_/binary>>) -> 4; % 1 bsl 59 +overflow_huge_int_skip_64(<<_:1152921504606846976/unit:16,0,_/binary>>) -> 5; % 1 bsl 60 +overflow_huge_int_skip_64(<<_:2305843009213693952/unit:8,0,_/binary>>) -> 6; % 1 bsl 61 +overflow_huge_int_skip_64(<<_:4611686018427387904/unit:8,0,_/binary>>) -> 7; % 1 bsl 62 +overflow_huge_int_skip_64(<<_:9223372036854775808/unit:8,0,_/binary>>) -> 8; % 1 bsl 63 +overflow_huge_int_skip_64(_) -> nomatch. + +overflow_huge_int_64(<>) -> {1,Int}; % 1 bsl 64 +overflow_huge_int_64(<>) -> {2,Int}; % 1 bsl 57 +overflow_huge_int_64(<>) -> {3,Int}; % 1 bsl 58 +overflow_huge_int_64(<>) -> {4,Int}; % 1 bsl 59 +overflow_huge_int_64(<>) -> {5,Int}; % 1 bsl 60 +overflow_huge_int_64(<>) -> {6,Int}; % 1 bsl 61 +overflow_huge_int_64(<>) -> {7,Int}; % 1 bsl 62 +overflow_huge_int_64(<>) -> {8,Int}; % 1 bsl 63 +overflow_huge_int_64(_) -> nomatch. + +bignum(Config) when is_list(Config) -> + ?line Bin = id(<<42,0:1024/unit:8,43>>), + ?line <<42:1025/little-integer-unit:8,_:8>> = Bin, + ?line <<_:8,43:1025/integer-unit:8>> = Bin, + + ?line BignumBin = id(<<0:512/unit:8,258254417031933722623:9/unit:8>>), + ?line <<258254417031933722623:(512+9)/unit:8>> = BignumBin, + erlang:garbage_collect(), %Search for holes in debug-build. + ok. + +unaligned_32_bit(Config) when is_list(Config) -> + %% There used to be a risk for heap overflow (fixed in R11B-5). + ?line L = unaligned_32_bit_1(<<-1:(64*1024)>>), + ?line unaligned_32_bit_verify(L, 1638). + +unaligned_32_bit_1(<<1:1,U:32,_:7,T/binary>>) -> + [U|unaligned_32_bit_1(T)]; +unaligned_32_bit_1(_) -> + []. + +unaligned_32_bit_verify([], 0) -> ok; +unaligned_32_bit_verify([4294967295|T], N) when N > 0 -> + unaligned_32_bit_verify(T, N-1). + +id(I) -> I. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/bs_match_misc_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/bs_match_misc_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/bs_match_misc_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/bs_match_misc_SUITE.erl 2009-04-16 10:23:59.000000000 +0100 @@ -0,0 +1,537 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(bs_match_misc_SUITE). + +-export([all/1,bound_var/1,bound_tail/1,t_float/1,little_float/1,sean/1, + kenneth/1,encode_binary/1,native/1,happi/1, + size_var/1,wiger/1,x0_context/1,huge_float_field/1, + writable_binary_matched/1,otp_7198/1]). + +-include("test_server.hrl"). + +all(suite) -> + [bound_var,bound_tail,t_float,little_float,sean, + kenneth,encode_binary,native,happi, + size_var,wiger,x0_context,huge_float_field, + writable_binary_matched,otp_7198]. + +bound_var(doc) -> "Test matching of bound variables."; +bound_var(Config) when is_list(Config) -> + ?line ok = bound_var(42, 13, <<42,13>>), + ?line nope = bound_var(42, 13, <<42,255>>), + ?line nope = bound_var(42, 13, <<154,255>>), + ok. + +bound_var(A, B, <>) -> ok; +bound_var(_, _, _) -> nope. + +bound_tail(doc) -> "Test matching of a bound tail."; +bound_tail(Config) when is_list(Config) -> + ?line ok = bound_tail(<<>>, <<13,14>>), + ?line ok = bound_tail(<<2,3>>, <<1,1,2,3>>), + ?line nope = bound_tail(<<2,3>>, <<1,1,2,7>>), + ?line nope = bound_tail(<<2,3>>, <<1,1,2,3,4>>), + ?line nope = bound_tail(<<2,3>>, <<>>), + ok. + +bound_tail(T, <<_:16,T/binary>>) -> ok; +bound_tail(_, _) -> nope. + +t_float(Config) when is_list(Config) -> + F = f1(), + G = f_one(), + + ?line G = match_float(<<63,128,0,0>>, 32, 0), + ?line G = match_float(<<63,240,0,0,0,0,0,0>>, 64, 0), + + ?line fcmp(F, match_float(<>, 32, 0)), + ?line fcmp(F, match_float(<>, 64, 0)), + ?line fcmp(F, match_float(<<1:1,F:32/float,127:7>>, 32, 1)), + ?line fcmp(F, match_float(<<1:1,F:64/float,127:7>>, 64, 1)), + ?line fcmp(F, match_float(<<1:13,F:32/float,127:3>>, 32, 13)), + ?line fcmp(F, match_float(<<1:13,F:64/float,127:3>>, 64, 13)), + + ?line {'EXIT',{{badmatch,_},_}} = (catch match_float(<<0,0>>, 16, 0)), + ?line {'EXIT',{{badmatch,_},_}} = (catch match_float(<<0,0>>, 16#7fffffff, 0)), + + ok. + + +fcmp(F1, F2) when (F1 - F2) / F2 < 0.0000001 -> ok. + +match_float(Bin0, Fsz, I) -> + Bin = make_sub_bin(Bin0), + Bsz = size(Bin) * 8, + Tsz = Bsz - Fsz - I, + <<_:I,F:Fsz/float,_:Tsz>> = Bin, + F. + +little_float(Config) when is_list(Config) -> + F = f2(), + G = f_one(), + + ?line G = match_float_little(<<0,0,0,0,0,0,240,63>>, 64, 0), + ?line G = match_float_little(<<0,0,128,63>>, 32, 0), + + ?line fcmp(F, match_float_little(<>, 32, 0)), + ?line fcmp(F, match_float_little(<>, 64, 0)), + ?line fcmp(F, match_float_little(<<1:1,F:32/float-little,127:7>>, 32, 1)), + ?line fcmp(F, match_float_little(<<1:1,F:64/float-little,127:7>>, 64, 1)), + ?line fcmp(F, match_float_little(<<1:13,F:32/float-little,127:3>>, 32, 13)), + ?line fcmp(F, match_float_little(<<1:13,F:64/float-little,127:3>>, 64, 13)), + + ok. + +match_float_little(Bin0, Fsz, I) -> + Bin = make_sub_bin(Bin0), + Bsz = size(Bin) * 8, + Tsz = Bsz - Fsz - I, + <<_:I,F:Fsz/float-little,_:Tsz>> = Bin, + F. + + +make_sub_bin(Bin0) -> + Sz = size(Bin0), + Bin1 = <<37,Bin0/binary,38,39>>, + <<_:8,Bin:Sz/binary,_:8,_:8>> = Bin1, + Bin. + +f1() -> + 3.1415. + +f2() -> + 2.7133. + +f_one() -> + 1.0. + +sean(Config) when is_list(Config) -> + ?line small = sean1(<<>>), + ?line small = sean1(<<1>>), + ?line small = sean1(<<1,2>>), + ?line small = sean1(<<1,2,3>>), + ?line large = sean1(<<1,2,3,4>>), + + ?line small = sean1(<<4>>), + ?line small = sean1(<<4,5>>), + ?line small = sean1(<<4,5,6>>), + ?line {'EXIT',{function_clause,_}} = (catch sean1(<<4,5,6,7>>)), + ok. + +sean1(<>) when byte_size(B) < 4 -> small; +sean1(<<1, _B/binary>>) -> large. + +kenneth(Config) when is_list(Config) -> + {ok,[145,148,113,129,0,0,0,0]} = + msisdn_internal_storage(<<145,148,113,129,0,0,0,0>>, []). + +msisdn_internal_storage(<<>>,MSISDN) -> + {ok,lists:reverse(MSISDN)}; +msisdn_internal_storage(<<2#11111111:8,_Rest/binary>>,MSISDN) -> + {ok,lists:reverse(MSISDN)}; +msisdn_internal_storage(<<2#1111:4,DigitN:4,_Rest/binary>>,MSISDN) when + DigitN < 10 -> + {ok,lists:reverse([(DigitN bor 2#11110000)|MSISDN])}; +msisdn_internal_storage(<>,MSISDN) when + DigitNplus1 < 10, + DigitN < 10 -> + NewMSISDN=[((DigitNplus1 bsl 4) bor DigitN)|MSISDN], + msisdn_internal_storage(Rest,NewMSISDN); +msisdn_internal_storage(_Rest,_MSISDN) -> + {fault}. %% Mandatory IE incorrect + +encode_binary(Config) when is_list(Config) -> + "C2J2QiSc" = encodeBinary(<<11,98,118,66,36,156>>, []), + ok. + +encodeBinary(<<>>, Output) -> + lists:reverse(Output); +encodeBinary(<>, Output) -> + <> = Data, + Char1 = getBase64Char(DChar1), + Char2 = getBase64Char(DChar2), + Char3 = "=", + Char4 = "=", + NewOutput = Char4 ++ Char3 ++ Char2 ++ Char1 ++ Output, + encodeBinary(<<>>, NewOutput); +encodeBinary(<>, Output) -> + <> = Data, + Char1 = getBase64Char(DChar1), + Char2 = getBase64Char(DChar2), + Char3 = getBase64Char(DChar3), + Char4 = "=", + NewOutput = Char4 ++ Char3 ++ Char2 ++ Char1 ++ Output, + encodeBinary(<<>>, NewOutput); +encodeBinary(<>, Output) -> + <> = Data, + Char1 = getBase64Char(DChar1), + Char2 = getBase64Char(DChar2), + Char3 = getBase64Char(DChar3), + Char4 = getBase64Char(DChar4), + NewOutput = Char4 ++ Char3 ++ Char2 ++ Char1 ++ Output, + encodeBinary(Rest, NewOutput); +encodeBinary(_Data, _) -> + error. + +getBase64Char(0) -> "A"; +getBase64Char(1) -> "B"; +getBase64Char(2) -> "C"; +getBase64Char(3) -> "D"; +getBase64Char(4) -> "E"; +getBase64Char(5) -> "F"; +getBase64Char(6) -> "G"; +getBase64Char(7) -> "H"; +getBase64Char(8) -> "I"; +getBase64Char(9) -> "J"; +getBase64Char(10) -> "K"; +getBase64Char(11) -> "L"; +getBase64Char(12) -> "M"; +getBase64Char(13) -> "N"; +getBase64Char(14) -> "O"; +getBase64Char(15) -> "P"; +getBase64Char(16) -> "Q"; +getBase64Char(17) -> "R"; +getBase64Char(18) -> "S"; +getBase64Char(19) -> "T"; +getBase64Char(20) -> "U"; +getBase64Char(21) -> "V"; +getBase64Char(22) -> "W"; +getBase64Char(23) -> "X"; +getBase64Char(24) -> "Y"; +getBase64Char(25) -> "Z"; +getBase64Char(26) -> "a"; +getBase64Char(27) -> "b"; +getBase64Char(28) -> "c"; +getBase64Char(29) -> "d"; +getBase64Char(30) -> "e"; +getBase64Char(31) -> "f"; +getBase64Char(32) -> "g"; +getBase64Char(33) -> "h"; +getBase64Char(34) -> "i"; +getBase64Char(35) -> "j"; +getBase64Char(36) -> "k"; +getBase64Char(37) -> "l"; +getBase64Char(38) -> "m"; +getBase64Char(39) -> "n"; +getBase64Char(40) -> "o"; +getBase64Char(41) -> "p"; +getBase64Char(42) -> "q"; +getBase64Char(43) -> "r"; +getBase64Char(44) -> "s"; +getBase64Char(45) -> "t"; +getBase64Char(46) -> "u"; +getBase64Char(47) -> "v"; +getBase64Char(48) -> "w"; +getBase64Char(49) -> "x"; +getBase64Char(50) -> "y"; +getBase64Char(51) -> "z"; +getBase64Char(52) -> "0"; +getBase64Char(53) -> "1"; +getBase64Char(54) -> "2"; +getBase64Char(55) -> "3"; +getBase64Char(56) -> "4"; +getBase64Char(57) -> "5"; +getBase64Char(58) -> "6"; +getBase64Char(59) -> "7"; +getBase64Char(60) -> "8"; +getBase64Char(61) -> "9"; +getBase64Char(62) -> "+"; +getBase64Char(63) -> "/"; +getBase64Char(_Else) -> + %% This is an illegal input. +% cgLogEM:log(error, ?MODULE, getBase64Char, [Else], +% "illegal input", +% ?LINE, version()), + "**". + +-define(M(F), <> = <>). + +native(Config) when is_list(Config) -> + ?line ?M(3.14:64/native-float), + ?line ?M(333:16/native), + ?line ?M(38658345:32/native), + case <<1:16/native>> of + <<0,1>> -> native_big(); + <<1,0>> -> native_little() + end. + +native_big() -> + ?line <<37.33:64/native-float>> = <<37.33:64/big-float>>, + ?line <<3974:16/native-integer>> = <<3974:16/big-integer>>, + {comment,"Big endian"}. + +native_little() -> + ?line <<37869.32343:64/native-float>> = <<37869.32343:64/little-float>>, + ?line <<7974:16/native-integer>> = <<7974:16/little-integer>>, + {comment,"Little endian"}. + +happi(Config) when is_list(Config) -> + Bin = <<".123">>, + ?line <<"123">> = lex_digits1(Bin, 1, []), + ?line <<"123">> = lex_digits2(Bin, 1, []), + ok. + +lex_digits1(<<$., Rest/binary>>,_Val,_Acc) -> + Rest; +lex_digits1(<>,Val, Acc) when N >= $0 , N =< $9 -> + lex_digits1(Rest,Val*10+dec(N),Acc); +lex_digits1(_Other,_Val,_Acc) -> + not_ok. + +lex_digits2(<>,Val, Acc) when N >= $0 , N =< $9 -> + lex_digits2(Rest,Val*10+dec(N),Acc); +lex_digits2(<<$., Rest/binary>>,_Val,_Acc) -> + Rest; +lex_digits2(_Other,_Val,_Acc) -> + not_ok. + +dec(A) -> + A-$0. + +size_var(Config) when is_list(Config) -> + ?line {<<45>>,<<>>} = split(<<1:16,45>>), + ?line {<<45>>,<<46,47>>} = split(<<1:16,45,46,47>>), + ?line {<<45,46>>,<<47>>} = split(<<2:16,45,46,47>>), + + ?line {<<45,46,47>>,<<48>>} = split_2(<<16:8,3:16,45,46,47,48>>), + + ?line {<<45,46>>,<<47>>} = split(2, <<2:16,45,46,47>>), + ?line {'EXIT',{function_clause,_}} = (catch split(42, <<2:16,45,46,47>>)), + + ?line <<"cdef">> = skip(<<2:8,"abcdef">>), + + ok. + +split(<>) -> + {B,T}. + +split(N, <>) -> + {B,T}. + +split_2(<>) -> + {B,T}. + +skip(<>) -> T. + +wiger(Config) when is_list(Config) -> + ?line ok1 = wcheck(<<3>>), + ?line ok2 = wcheck(<<1,2,3>>), + ?line ok3 = wcheck(<<4>>), + ?line {error,<<1,2,3,4>>} = wcheck(<<1,2,3,4>>), + ?line {error,<<>>} = wcheck(<<>>), + ok. + +wcheck(<>) when A==3-> + ok1; +wcheck(<<_,_:2/binary>>) -> + ok2; +wcheck(<<_>>) -> + ok3; +wcheck(Other) -> + {error,Other}. + +%% Test that having the match context in x(0) works. + +x0_context(Config) when is_list(Config) -> + x0_0([], <<3.0:64/float,42:16,123456:32>>). + +x0_0(_, Bin) -> + <<3.0:64/float,42:16,_/binary>> = Bin, + x0_1([], Bin, 64, 16, 2). + +x0_1(_, Bin, FloatSz, IntSz, BinSz) -> + <<_:FloatSz/float,42:IntSz,B:BinSz/binary,C:1/binary,D/binary>> = Bin, + id({B,C,D}), + <<_:FloatSz/float,42:IntSz,B:BinSz/binary,_/binary>> = Bin, + x0_2([], Bin). + +x0_2(_, Bin) -> + <<_:64,0:7,42:9,_/binary>> = Bin, + x0_3([], Bin). + +x0_3(_, Bin) -> + case Bin of + <<_:72,7:8,_/binary>> -> + ?line ?t:fail(); + <<_:64,0:16,_/binary>> -> + ?line ?t:fail(); + <<_:64,42:16,123456:32,_/binary>> -> + ok + end. + + +huge_float_field(Config) when is_list(Config) -> + Sz = 1 bsl 27, + ?line Bin = <<0:Sz>>, + + ?line nomatch = overflow_huge_float_skip_32(Bin), + ?line nomatch = overflow_huge_float_32(Bin), + + ?line ok = overflow_huge_float(Bin, lists:seq(25, 32)++lists:seq(50, 64)), + ?line ok = overflow_huge_float_unit128(Bin, lists:seq(25, 32)++lists:seq(50, 64)), + ok. + +overflow_huge_float_skip_32(<<_:4294967296/float,0,_/binary>>) -> 1; % 1 bsl 32 +overflow_huge_float_skip_32(<<_:33554432/float-unit:128,0,_/binary>>) -> 2; % 1 bsl 25 +overflow_huge_float_skip_32(<<_:67108864/float-unit:64,0,_/binary>>) -> 3; % 1 bsl 26 +overflow_huge_float_skip_32(<<_:134217728/float-unit:32,0,_/binary>>) -> 4; % 1 bsl 27 +overflow_huge_float_skip_32(<<_:268435456/float-unit:16,0,_/binary>>) -> 5; % 1 bsl 28 +overflow_huge_float_skip_32(<<_:536870912/float-unit:8,0,_/binary>>) -> 6; % 1 bsl 29 +overflow_huge_float_skip_32(<<_:1073741824/float-unit:8,0,_/binary>>) -> 7; % 1 bsl 30 +overflow_huge_float_skip_32(<<_:2147483648/float-unit:8,0,_/binary>>) -> 8; % 1 bsl 31 +overflow_huge_float_skip_32(_) -> nomatch. + +overflow_huge_float_32(<>) -> {1,F}; % 1 bsl 32 +overflow_huge_float_32(<>) -> {2,F}; % 1 bsl 25 +overflow_huge_float_32(<>) -> {3,F}; % 1 bsl 26 +overflow_huge_float_32(<>) -> {4,F}; % 1 bsl 27 +overflow_huge_float_32(<>) -> {5,F}; % 1 bsl 28 +overflow_huge_float_32(<>) -> {6,F}; % 1 bsl 29 +overflow_huge_float_32(<>) -> {7,F}; % 1 bsl 30 +overflow_huge_float_32(<>) -> {8,F}; % 1 bsl 31 +overflow_huge_float_32(_) -> nomatch. + + +overflow_huge_float(Bin, [Sz0|Sizes]) -> + Sz = id(1 bsl Sz0), + case Bin of + <<_:Sz/float-unit:8,0,_/binary>> -> + {error,Sz}; + _ -> + case Bin of + <> -> + {error,Sz,Var}; + _ -> + overflow_huge_float(Bin, Sizes) + end + end; +overflow_huge_float(_, []) -> ok. + +overflow_huge_float_unit128(Bin, [Sz0|Sizes]) -> + Sz = id(1 bsl Sz0), + case Bin of + <<_:Sz/float-unit:128,0,_/binary>> -> + {error,Sz}; + _ -> + case Bin of + <> -> + {error,Sz,Var}; + _ -> + overflow_huge_float_unit128(Bin, Sizes) + end + end; +overflow_huge_float_unit128(_, []) -> ok. + + +%% +%% Test that a writable binary can be safely matched. +%% + +writable_binary_matched(Config) when is_list(Config) -> + ?line WritableBin = create_writeable_binary(), + ?line writable_binary_matched(WritableBin, WritableBin, 500). + +writable_binary_matched(<<0>>, _, N) -> + if + N =:= 0 -> ok; + true -> + put(grow_heap, [N|get(grow_heap)]), + ?line WritableBin = create_writeable_binary(), + ?line writable_binary_matched(WritableBin, WritableBin, N-1) + end; +writable_binary_matched(<>, WritableBin0, N) -> + ?line WritableBin = writable_binary(WritableBin0, B), + writable_binary_matched(T, WritableBin, N). + +writable_binary(WritableBin0, B) when is_binary(WritableBin0) -> + %% Heavy append to force the binary to move. + ?line WritableBin = <>, + ?line id(<<(id(0)):128/unit:8>>), + WritableBin. + +create_writeable_binary() -> + <<(id(<<>>))/binary,1,2,3,4,5,6,0>>. + +otp_7198(Config) when is_list(Config) -> + %% When a match context was reused, and grown at the same time to + %% increase the number of saved positions, the thing word was not updated + %% to account for the new size. Therefore, if there was a garbage collection, + %% the new slots would be included in the garbage collection. + ?line [do_otp_7198(FillerSize) || FillerSize <- lists:seq(0, 256)], + ok. + +do_otp_7198(FillerSize) -> + Filler = erlang:make_tuple(FillerSize, 42), + {Pid,Ref} = spawn_monitor(fun() -> do_otp_7198_test(Filler) end), + receive + {'DOWN',Ref,process,Pid,normal} -> + ok; + {'DOWN',Ref,process,Pid,Reason} -> + io:format("unexpected: ~p", [Reason]), + ?line ?t:fail() + end. + +do_otp_7198_test(_) -> + [{'KEYWORD',114}, + {'KEYWORD',101}, + {'KEYWORD',103}, + {'KEYWORD',105}, + {'KEYWORD',111}, + {'FIELD',110}, + {'KEYWORD',119}, + {'KEYWORD',104}, + {'KEYWORD',97}, + {'KEYWORD',116}, + {'KEYWORD',101}, + {'KEYWORD',118}, + {'KEYWORD',101}, + {'KEYWORD',114}, + '$thats_all_folks$'] = otp_7198_scan(<<"region:whatever">>, []). + + +otp_7198_scan(<<>>, TokAcc) -> + lists:reverse(['$thats_all_folks$' | TokAcc]); + +otp_7198_scan(<>, TokAcc) when + (D =:= $D orelse D =:= $d) and + ((Z =:= $\s) or (Z =:= $() or (Z =:= $))) -> + otp_7198_scan(<>, ['AND' | TokAcc]); + +otp_7198_scan(<>, TokAcc) when + (D =:= $D) or (D =:= $d) -> + otp_7198_scan(<<>>, ['AND' | TokAcc]); + +otp_7198_scan(<>, TokAcc) when + (N =:= $N orelse N =:= $n) and + ((Z =:= $\s) or (Z =:= $() or (Z =:= $))) -> + otp_7198_scan(<>, ['NOT' | TokAcc]); + +otp_7198_scan(<>, TokAcc) when + (C >= $A) and (C =< $Z); + (C >= $a) and (C =< $z); + (C >= $0) and (C =< $9) -> + case Rest of + <<$:, R/binary>> -> + otp_7198_scan(R, [{'FIELD', C} | TokAcc]); + _ -> + otp_7198_scan(Rest, [{'KEYWORD', C} | TokAcc]) + end. + + +id(I) -> I. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/bs_match_tail_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/bs_match_tail_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/bs_match_tail_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/bs_match_tail_SUITE.erl 2009-09-18 15:08:11.000000000 +0100 @@ -0,0 +1,87 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(bs_match_tail_SUITE). + +-author('bjorn@erix.ericsson.se'). +-export([all/1,aligned/1,unaligned/1,zero_tail/1]). + +-include("test_server.hrl"). + +all(suite) -> [aligned,unaligned,zero_tail]. + +aligned(doc) -> "Test aligned tails."; +aligned(Config) when is_list(Config) -> + ?line Tail1 = mkbin([]), + ?line {258,Tail1} = al_get_tail_used(mkbin([1,2])), + ?line Tail2 = mkbin(lists:seq(1, 127)), + ?line {35091,Tail2} = al_get_tail_used(mkbin([137,19|Tail2])), + + ?line 64896 = al_get_tail_unused(mkbin([253,128])), + ?line 64895 = al_get_tail_unused(mkbin([253,127|lists:seq(42, 255)])), + + ?line Tail3 = mkbin(lists:seq(0, 19)), + ?line {0,Tail1} = get_dyn_tail_used(Tail1, 0), + ?line {0,Tail3} = get_dyn_tail_used(mkbin([Tail3]), 0), + ?line {73,Tail3} = get_dyn_tail_used(mkbin([73|Tail3]), 8), + + ?line 0 = get_dyn_tail_unused(mkbin([]), 0), + ?line 233 = get_dyn_tail_unused(mkbin([233]), 8), + ?line 23 = get_dyn_tail_unused(mkbin([23,22,2]), 8), + ok. + +al_get_tail_used(<>) -> {A,T}. +al_get_tail_unused(<>) -> A. + +unaligned(doc) -> "Test that an non-aligned tail cannot be matched out."; +unaligned(Config) when is_list(Config) -> + ?line {'EXIT',{function_clause,_}} = (catch get_tail_used(mkbin([42]))), + ?line {'EXIT',{{badmatch,_},_}} = (catch get_dyn_tail_used(mkbin([137]), 3)), + ?line {'EXIT',{function_clause,_}} = (catch get_tail_unused(mkbin([42,33]))), + ?line {'EXIT',{{badmatch,_},_}} = (catch get_dyn_tail_unused(mkbin([44]), 7)), + ok. + +get_tail_used(<>) -> {A,T}. + +get_tail_unused(<>) -> A. + +get_dyn_tail_used(Bin, Sz) -> + <> = Bin, + {A,T}. + +get_dyn_tail_unused(Bin, Sz) -> + <> = Bin, + A. + +zero_tail(doc) -> "Test that zero tails are tested correctly."; +zero_tail(Config) when is_list(Config) -> + ?line 7 = (catch test_zero_tail(mkbin([7]))), + ?line {'EXIT',{function_clause,_}} = (catch test_zero_tail(mkbin([1,2]))), + ?line {'EXIT',{function_clause,_}} = (catch test_zero_tail2(mkbin([1,2,3]))), + ok. + +test_zero_tail(<>) -> A. + +test_zero_tail2(<<_A:4,_B:4>>) -> ok. + +mkbin(L) when is_list(L) -> list_to_binary(L). + + + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/bs_utf_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/bs_utf_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/bs_utf_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/bs_utf_SUITE.erl 2009-09-18 15:09:28.000000000 +0100 @@ -0,0 +1,394 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(bs_utf_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + utf8_roundtrip/1,utf16_roundtrip/1,utf32_roundtrip/1, + utf8_illegal_sequences/1,utf16_illegal_sequences/1, + utf32_illegal_sequences/1, + bad_construction/1]). + +-include("test_server.hrl"). + +-define(FAIL(Expr), ?line fail_check(catch Expr, ??Expr, [])). + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(6)), + [{watchdog,Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +all(suite) -> + [utf8_roundtrip,utf16_roundtrip,utf32_roundtrip, + utf8_illegal_sequences,utf16_illegal_sequences, + utf32_illegal_sequences,bad_construction]. + +utf8_roundtrip(Config) when is_list(Config) -> + ?line utf8_roundtrip(0, 16#D7FF), + ?line utf8_roundtrip(16#E000, 16#FFFD), + ?line utf8_roundtrip(16#10000, 16#10FFFF), + ok. + +utf8_roundtrip(First, Last) when First =< Last -> + Bin = int_to_utf8(First), + Bin = id(<>), + Bin = id(<<(id(<<>>))/binary,First/utf8>>), + Unaligned = id(<<3:2,First/utf8>>), + <<_:2,Bin/binary>> = Unaligned, + <> = Bin, + <> = make_unaligned(Bin), + utf8_roundtrip(First+1, Last); +utf8_roundtrip(_, _) -> ok. + +utf16_roundtrip(Config) when is_list(Config) -> + Big = fun utf16_big_roundtrip/1, + Little = fun utf16_little_roundtrip/1, + PidRefs = [spawn_monitor(fun() -> + do_utf16_roundtrip(Fun) + end) || Fun <- [Big,Little]], + [receive {'DOWN',Ref,process,Pid,Reason} -> normal=Reason end || + {Pid,Ref} <- PidRefs], + ok. + +do_utf16_roundtrip(Fun) -> + do_utf16_roundtrip(0, 16#D7FF, Fun), + do_utf16_roundtrip(16#E000, 16#FFFD, Fun), + do_utf16_roundtrip(16#10000, 16#10FFFF, Fun). + +do_utf16_roundtrip(First, Last, Fun) when First =< Last -> + Fun(First), + do_utf16_roundtrip(First+1, Last, Fun); +do_utf16_roundtrip(_, _, _) -> ok. + +utf16_big_roundtrip(Char) -> + Bin = id(<>), + Bin = id(<<(id(<<>>))/binary,Char/utf16>>), + Unaligned = id(<<3:2,Char/utf16>>), + <<_:2,Bin/binary>> = Unaligned, + <> = Bin, + <> = make_unaligned(Bin), + ok. + +utf16_little_roundtrip(Char) -> + Bin = id(<>), + Bin = id(<<(id(<<>>))/binary,Char/little-utf16>>), + Unaligned = id(<<3:2,Char/little-utf16>>), + <<_:2,Bin/binary>> = Unaligned, + <> = Bin, + <> = make_unaligned(Bin), + ok. + +utf32_roundtrip(Config) when is_list(Config) -> + Big = fun utf32_big_roundtrip/1, + Little = fun utf32_little_roundtrip/1, + PidRefs = [spawn_monitor(fun() -> + do_utf32_roundtrip(Fun) + end) || Fun <- [Big,Little]], + [receive {'DOWN',Ref,process,Pid,Reason} -> normal=Reason end || + {Pid,Ref} <- PidRefs], + ok. + +do_utf32_roundtrip(Fun) -> + do_utf32_roundtrip(0, 16#D7FF, Fun), + do_utf32_roundtrip(16#E000, 16#FFFD, Fun), + do_utf32_roundtrip(16#10000, 16#10FFFF, Fun). + +do_utf32_roundtrip(First, Last, Fun) when First =< Last -> + Fun(First), + do_utf32_roundtrip(First+1, Last, Fun); +do_utf32_roundtrip(_, _, _) -> ok. + +utf32_big_roundtrip(Char) -> + Bin = id(<>), + Bin = id(<<(id(<<>>))/binary,Char/utf32>>), + Unaligned = id(<<3:2,Char/utf32>>), + <<_:2,Bin/binary>> = Unaligned, + <> = Bin, + <> = make_unaligned(Bin), + ok. + +utf32_little_roundtrip(Char) -> + Bin = id(<>), + Bin = id(<<(id(<<>>))/binary,Char/little-utf32>>), + Unaligned = id(<<3:2,Char/little-utf32>>), + <<_:2,Bin/binary>> = Unaligned, + <> = Bin, + <> = make_unaligned(Bin), + ok. + +utf8_illegal_sequences(Config) when is_list(Config) -> + ?line fail_range(16#10FFFF+1, 16#10FFFF+512), %Too large. + ?line fail_range(16#D800, 16#DFFF), %Reserved for UTF-16. + ?line fail_range(16#FFFE, 16#FFFF), %Non-characters. + + %% Illegal first character. + ?line [fail(<>) || I <- lists:seq(16#80, 16#BF)], + + %% Short sequences. + ?line short_sequences(16#80, 16#10FFFF), + + %% Overlong sequences. (Using more bytes than necessary + %% is not allowed.) + ?line overlong(0, 127, 2), + ?line overlong(128, 16#7FF, 3), + ?line overlong(16#800, 16#FFFF, 4), + ok. + +fail_range(Char, End) when Char =< End -> + {'EXIT',_} = (catch <>), + Bin = int_to_utf8(Char), + fail(Bin), + fail_range(Char+1, End); +fail_range(_, _) -> ok. + +short_sequences(Char, End) -> + Step = (End - Char) div erlang:system_info(schedulers) + 1, + PidRefs = short_sequences_1(Char, Step, End), + [receive {'DOWN',Ref,process,Pid,Reason} -> normal=Reason end || + {Pid,Ref} <- PidRefs], + ok. + +short_sequences_1(Char, Step, End) when Char =< End -> + CharEnd = lists:min([Char+Step-1,End]), + [spawn_monitor(fun() -> + io:format("~p - ~p\n", [Char,CharEnd]), + do_short_sequences(Char, CharEnd) + end)|short_sequences_1(Char+Step, Step, End)]; +short_sequences_1(_, _, _) -> []. + +do_short_sequences(Char, End) when Char =< End -> + short_sequence(Char), + do_short_sequences(Char+1, End); +do_short_sequences(_, _) -> ok. + +short_sequence(I) -> + case int_to_utf8(I) of + <> -> + <> = S0, + <> = S1, + fail(S0), + fail(S1), + fail(S2), + fail(<>), + fail(<>), + fail(<>); + <> -> + <> = S0, + fail(S0), + fail(S1), + fail(<>), + fail(<>), + fail(<>); + <> -> + fail(S), + fail(<>) + end. + +overlong(Char, Last, NumBytes) when Char =< Last -> + overlong(Char, NumBytes), + overlong(Char+1, Last, NumBytes); +overlong(_, _, _) -> ok. + +overlong(Char, NumBytes) when NumBytes < 5 -> + case int_to_utf8(Char, NumBytes) of + <>=Bin -> + ?t:fail({illegal_encoding_accepted,Bin,Char}); + <>=Bin -> + ?t:fail({illegal_encoding_accepted,Bin,Char,OtherChar}); + _ -> ok + end, + overlong(Char, NumBytes+1); +overlong(_, _) -> ok. + +fail(Bin) -> + fail_1(Bin), + fail_1(make_unaligned(Bin)). + +fail_1(<>=Bin) -> + ?t:fail({illegal_encoding_accepted,Bin,Char}); +fail_1(_) -> ok. + + +utf16_illegal_sequences(Config) when is_list(Config) -> + ?line utf16_fail_range(16#10FFFF+1, 16#10FFFF+512), %Too large. + ?line utf16_fail_range(16#D800, 16#DFFF), %Reserved for UTF-16. + ?line utf16_fail_range(16#FFFE, 16#FFFF), %Non-characters. + + ?line lonely_hi_surrogate(16#D800, 16#DFFF), + ?line leading_lo_surrogate(16#DC00, 16#DFFF), + + ok. + +utf16_fail_range(Char, End) when Char =< End -> + {'EXIT',_} = (catch <>), + {'EXIT',_} = (catch <>), + utf16_fail_range(Char+1, End); +utf16_fail_range(_, _) -> ok. + +lonely_hi_surrogate(Char, End) when Char =< End -> + BinBig = <>, + BinLittle = <>, + case {BinBig,BinLittle} of + {<>,_} -> + ?t:fail({lonely_hi_surrogate_accepted,Bad}); + {_,<>} -> + ?t:fail({lonely_hi_surrogate_accepted,Bad}); + {_,_} -> + ok + end, + lonely_hi_surrogate(Char+1, End); +lonely_hi_surrogate(_, _) -> ok. + +leading_lo_surrogate(Char, End) when Char =< End -> + leading_lo_surrogate(Char, 16#D800, 16#DFFF), + leading_lo_surrogate(Char+1, End); +leading_lo_surrogate(_, _) -> ok. + +leading_lo_surrogate(HiSurr, LoSurr, End) when LoSurr =< End -> + BinBig = <>, + BinLittle = <>, + case {BinBig,BinLittle} of + {<>,_} -> + ?t:fail({leading_lo_surrogate_accepted,Bad}); + {_,<>} -> + ?t:fail({leading_lo_surrogate_accepted,Bad}); + {_,_} -> + ok + end, + leading_lo_surrogate(HiSurr, LoSurr+1, End); +leading_lo_surrogate(_, _, _) -> ok. + +utf32_illegal_sequences(Config) when is_list(Config) -> + ?line utf32_fail_range(16#10FFFF+1, 16#10FFFF+512), %Too large. + ?line utf32_fail_range(16#D800, 16#DFFF), %Reserved for UTF-16. + ?line utf32_fail_range(16#FFFE, 16#FFFF), %Non-characters. + ?line utf32_fail_range(-100, -1), + ok. + +utf32_fail_range(Char, End) when Char =< End -> + {'EXIT',_} = (catch <>), + {'EXIT',_} = (catch <>), + case {<>,<>} of + {<>,_} -> + ?line ?t:fail(Unexpected); + {_,<>} -> + ?line ?t:fail(Unexpected); + {_,_} -> ok + end, + utf32_fail_range(Char+1, End); +utf32_fail_range(_, _) -> ok. + +bad_construction(Config) when is_list(Config) -> + ?FAIL(<<3.14/utf8>>), + ?FAIL(<<3.1415/utf16>>), + ?FAIL(<<3.1415/utf32>>), + + ?FAIL(<<(-1)/utf8>>), + ?FAIL(<<(-1)/utf16>>), + {'EXIT',_} = (catch <<(id(-1))/utf8>>), + {'EXIT',_} = (catch <<(id(-1))/utf16>>), + {'EXIT',_} = (catch <<(id(-1))/utf32>>), + + ?FAIL(<<16#D800/utf8>>), + ?FAIL(<<16#D800/utf16>>), + ?FAIL(<<16#D800/utf32>>), + + ok. + +%% This function intentionally allows construction of +%% UTF-8 sequence in illegal ranges. +int_to_utf8(I) when I =< 16#7F -> + <>; +int_to_utf8(I) when I =< 16#7FF -> + B2 = I, + B1 = (I bsr 6), + <<1:1,1:1,0:1,B1:5,1:1,0:1,B2:6>>; +int_to_utf8(I) when I =< 16#FFFF -> + B3 = I, + B2 = (I bsr 6), + B1 = (I bsr 12), + <<1:1,1:1,1:1,0:1,B1:4,1:1,0:1,B2:6,1:1,0:1,B3:6>>; +int_to_utf8(I) when I =< 16#3FFFFF -> + B4 = I, + B3 = (I bsr 6), + B2 = (I bsr 12), + B1 = (I bsr 18), + <<1:1,1:1,1:1,1:1,0:1,B1:3,1:1,0:1,B2:6,1:1,0:1,B3:6,1:1,0:1,B4:6>>; +int_to_utf8(I) when I =< 16#3FFFFFF -> + B5 = I, + B4 = (I bsr 6), + B3 = (I bsr 12), + B2 = (I bsr 18), + B1 = (I bsr 24), + <<1:1,1:1,1:1,1:1,1:1,0:1,B1:2,1:1,0:1,B2:6,1:1,0:1,B3:6,1:1,0:1,B4:6, + 1:1,0:1,B5:6>>. + +%% int_to_utf8(I, NumberOfBytes) -> Binary. +%% This function can be used to construct overlong sequences. +int_to_utf8(I, 1) -> + <>; +int_to_utf8(I, 2) -> + B2 = I, + B1 = (I bsr 6), + <<1:1,1:1,0:1,B1:5,1:1,0:1,B2:6>>; +int_to_utf8(I, 3) -> + B3 = I, + B2 = (I bsr 6), + B1 = (I bsr 12), + <<1:1,1:1,1:1,0:1,B1:4,1:1,0:1,B2:6,1:1,0:1,B3:6>>; +int_to_utf8(I, 4) -> + B4 = I, + B3 = (I bsr 6), + B2 = (I bsr 12), + B1 = (I bsr 18), + <<1:1,1:1,1:1,1:1,0:1,B1:3,1:1,0:1,B2:6,1:1,0:1,B3:6,1:1,0:1,B4:6>>. + +make_unaligned(Bin0) when is_binary(Bin0) -> + Bin1 = <<0:3,Bin0/binary,31:5>>, + Sz = byte_size(Bin0), + <<0:3,Bin:Sz/binary,31:5>> = id(Bin1), + Bin. + +fail_check({'EXIT',{badarg,_}}, Str, Vars) -> + try evaluate(Str, Vars) of + Res -> + io:format("Interpreted result: ~p", [Res]), + ?t:fail(did_not_fail_in_intepreted_code) + catch + error:badarg -> + ok + end; +fail_check(Res, _, _) -> + io:format("Compiled result: ~p", [Res]), + ?t:fail(did_not_fail_in_compiled_code). + +evaluate(Str, Vars) -> + {ok,Tokens,_} = + erl_scan:string(Str ++ " . "), + {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + case erl_eval:expr(Expr, Vars) of + {value, Result, _} -> + Result + end. + +id(I) -> I. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE_data/busy_drv.c erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE_data/busy_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE_data/busy_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE_data/busy_drv.c 2006-05-03 09:00:18.000000000 +0100 @@ -0,0 +1,97 @@ +/* + * Purpose: Provides a driver whose busy state can be controlled from Erlang. + * Author: Bjorn Gustavsson + */ + +#include "erl_driver.h" +#include +#include + +#define NO 0 +#define YES 1 + +static ErlDrvData busy_start(ErlDrvPort, char*); +static void busy_stop(ErlDrvData), busy_from_erlang(ErlDrvData, char*, int); + +ErlDrvEntry busy_driver_entry = +{ + NULL, + busy_start, + busy_stop, + busy_from_erlang, + NULL, + NULL, + "busy_drv", + NULL, + NULL +}; + +static ErlDrvPort master_port; +static ErlDrvPort slave_port; +static int next_slave_state; + +DRIVER_INIT(busy_drv) +{ + master_port = (ErlDrvPort)-1; + slave_port = (ErlDrvPort)-1; + return &busy_driver_entry; +} + +static ErlDrvData busy_start(ErlDrvPort port, char* buf) +{ + char *s; + int slave = YES; + + s = strchr(buf, ' '); + if (s && s[1] == 'm') { + /* This is the master port */ + if (master_port != (ErlDrvPort)-1) + return ERL_DRV_ERROR_GENERAL; /* Already open */ + if (slave_port != (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + master_port = port; + next_slave_state = 1; + } else { + if (slave_port != (ErlDrvPort)-1) + return ERL_DRV_ERROR_GENERAL; /* Already open */ + if (master_port == (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + slave_port = port; + } + return (ErlDrvData)port; +} + +static void busy_stop(ErlDrvData port) +{ + if ((ErlDrvPort)port == master_port) { + master_port = (ErlDrvPort)-1; + } else if ((ErlDrvPort)port == slave_port) { + slave_port = (ErlDrvPort)-1; + } +} + +static void +busy_from_erlang(ErlDrvData port, char* buf, int count) +{ + if ((ErlDrvPort)port == slave_port) { + set_busy_port(slave_port, next_slave_state); + next_slave_state = 0; + return; + } + + if (slave_port == (ErlDrvPort)-1 || count < 1) { + driver_failure((ErlDrvPort)port, -1); + return; + } + + switch (buf[0]) { + case 'l': /* Lock port (set to busy) */ + set_busy_port(slave_port, 1); + break; + case 'u': /* Unlock port (not busy) */ + set_busy_port(slave_port, 0); + break; + } +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE_data/hard_busy_drv.c erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE_data/hard_busy_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE_data/hard_busy_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE_data/hard_busy_drv.c 2009-11-20 13:33:06.000000000 +0000 @@ -0,0 +1,23 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ +#define ERTS_TEST_BUSY_DRV_NAME "hard_busy_drv" +#define ERTS_TEST_BUSY_DRV_FLAGS \ + ERL_DRV_FLAG_USE_PORT_LOCKING + +#include "hs_busy_drv.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE_data/hs_busy_drv.c erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE_data/hs_busy_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE_data/hs_busy_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE_data/hs_busy_drv.c 2009-11-20 13:33:07.000000000 +0000 @@ -0,0 +1,94 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +#include +#include "erl_driver.h" + +ErlDrvData start(ErlDrvPort port, char *command); +void output(ErlDrvData drv_data, char *buf, int len); +int control(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen); + +static ErlDrvEntry busy_drv_entry = { + NULL /* init */, + start, + NULL /* stop */, + output, + NULL /* ready_input */, + NULL /* ready_output */, + ERTS_TEST_BUSY_DRV_NAME, + NULL /* finish */, + NULL /* handle */, + control, + NULL /* timeout */, + NULL /* outputv */, + NULL /* ready_async */, + NULL /* flush */, + NULL /* call */, + NULL /* event */, + ERL_DRV_EXTENDED_MARKER, + ERL_DRV_EXTENDED_MAJOR_VERSION, + ERL_DRV_EXTENDED_MINOR_VERSION, + ERTS_TEST_BUSY_DRV_FLAGS, + NULL /* handle2 */, + NULL /* handle_monitor */, + NULL /* stop_select */ +}; + +DRIVER_INIT(busy_drv) +{ + return &busy_drv_entry; +} + +ErlDrvData start(ErlDrvPort port, char *command) +{ + return (ErlDrvData) port; +} + +void output(ErlDrvData drv_data, char *buf, int len) +{ + int res; + ErlDrvPort port = (ErlDrvPort) drv_data; + ErlDrvTermData msg[] = { + ERL_DRV_PORT, driver_mk_port(port), + ERL_DRV_ATOM, driver_mk_atom("caller"), + ERL_DRV_PID, driver_caller(port), + ERL_DRV_TUPLE, (ErlDrvTermData) 3 + }; + res = driver_output_term(port, msg, sizeof(msg)/sizeof(ErlDrvTermData)); + if (res <= 0) + driver_failure_atom(port, "driver_output_term failed"); +} + +int control(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen) +{ + switch (command) { + case 'B': /* busy */ + set_busy_port((ErlDrvPort) drv_data, 1); + break; + case 'N': /* not busy */ + set_busy_port((ErlDrvPort) drv_data, 0); + break; + default: + driver_failure_posix((ErlDrvPort) drv_data, EINVAL); + break; + } + return 0; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE_data/Makefile.src 2009-11-20 13:30:26.000000000 +0000 @@ -0,0 +1,25 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +all: busy_drv@dll@ hard_busy_drv@dll@ soft_busy_drv@dll@ + +@SHLIB_RULES@ + +hard_busy_drv@obj@: hard_busy_drv.c hs_busy_drv.c +soft_busy_drv@obj@: soft_busy_drv.c hs_busy_drv.c diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE_data/soft_busy_drv.c erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE_data/soft_busy_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE_data/soft_busy_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE_data/soft_busy_drv.c 2009-11-20 13:33:06.000000000 +0000 @@ -0,0 +1,23 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ +#define ERTS_TEST_BUSY_DRV_NAME "soft_busy_drv" +#define ERTS_TEST_BUSY_DRV_FLAGS \ + (ERL_DRV_FLAG_USE_PORT_LOCKING|ERL_DRV_FLAG_SOFT_BUSY) + +#include "hs_busy_drv.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/busy_port_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/busy_port_SUITE.erl 2009-11-20 13:30:23.000000000 +0000 @@ -0,0 +1,628 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(busy_port_SUITE). + +-export([all/1, io_to_busy/1, message_order/1, send_3/1, + system_monitor/1, no_trap_exit/1, + no_trap_exit_unlinked/1, trap_exit/1, multiple_writers/1, + hard_busy_driver/1, soft_busy_driver/1]). + +-include("test_server.hrl"). + +%% Internal exports. +-export([init/2]). + +all(suite) -> {req, [dynamic_loading], + [io_to_busy, message_order, send_3, + system_monitor, no_trap_exit, + no_trap_exit_unlinked, trap_exit, multiple_writers, + hard_busy_driver, soft_busy_driver]}. + +%% Tests I/O operations to a busy port, to make sure a suspended send +%% operation is correctly restarted. This used to crash Beam. + +io_to_busy(suite) -> []; +io_to_busy(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(30)), + + ?line start_busy_driver(Config), + ?line process_flag(trap_exit, true), + ?line Writer = fun_spawn(fun writer/0), + ?line Generator = fun_spawn(fun() -> generator(100, Writer) end), + ?line wait_for([Writer, Generator]), + + ?line test_server:timetrap_cancel(Dog), + ok. + +generator(N, Writer) -> + generator(N, Writer, lists:duplicate(128, 42)). + +generator(0, Writer, _Data) -> + Writer ! stop, + erlang:garbage_collect(), + receive after 2000 -> ok end, + + %% Calling process_info(Pid, current_function) on a suspended process + %% used to crash Beam. + {current_function, {erlang, send, 2}} = + process_info(Writer, current_function), + unlock_slave(); +generator(N, Writer, Data) -> + Writer ! {exec, Data}, + generator(N-1, Writer, [42|Data]). + +writer() -> + {Owner, Port} = get_slave(), + Port ! {Owner, {connect, self()}}, + X = {a, b, c, d}, + forget({element(1, X), element(2, X), element(3, X), element(4, X)}), + writer_loop(Port). + +writer_loop(Port) -> + receive + {exec, Data} -> + Port ! {self(), {command, Data}}, + writer_loop(Port); + stop -> + erlang:garbage_collect() + end. + +forget(_) -> + ok. + +%% Test the interaction of busy ports and message sending. +%% This used to cause the wrong message to be received. + +message_order(suite) -> {req, dynamic_loading}; +message_order(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + + ?line start_busy_driver(Config), + ?line Self = self(), + ?line Busy = fun_spawn(fun () -> send_to_busy_1(Self) end), + ?line receive after 1000 -> ok end, + ?line Busy ! first, + ?line Busy ! second, + ?line receive after 1 -> ok end, + ?line unlock_slave(), + ?line Busy ! third, + ?line receive + {Busy, first} -> + ok; + Other -> + test_server:fail({unexpected_message, Other}) + end, + + ?line test_server:timetrap_cancel(Dog), + ok. + +send_to_busy_1(Parent) -> + {Owner, Slave} = get_slave(), + Slave ! {Owner, {command, "set_me_busy"}}, + Slave ! {Owner, {command, "hello"}}, + Slave ! {Owner, {command, "hello again"}}, + receive + Message -> + Parent ! {self(), Message} + end. + +%% Test the bif send/3 +send_3(suite) -> {req,dynamic_loading}; +send_3(doc) -> ["Test the BIF send/3"]; +send_3(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + %% + ?line start_busy_driver(Config), + ?line {Owner,Slave} = get_slave(), + ?line ok = erlang:send(Slave, {Owner,{command,"set busy"}}, + [nosuspend]), + ?line nosuspend = erlang:send(Slave, {Owner,{command,"busy"}}, + [nosuspend]), + ?line unlock_slave(), + ?line ok = erlang:send(Slave, {Owner,{command,"not busy"}}, + [nosuspend]), + ?line ok = command(stop), + %% + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Test the erlang:system_monitor(Pid, [busy_port]) +system_monitor(suite) -> {req,dynamic_loading}; +system_monitor(doc) -> ["Test erlang:system_monitor({Pid,[busy_port]})."]; +system_monitor(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Self = self(), + %% + ?line OldMonitor = erlang:system_monitor(Self, [busy_port]), + ?line {Self,[busy_port]} = erlang:system_monitor(), + ?line Void = make_ref(), + ?line start_busy_driver(Config), + ?line {Owner,Slave} = get_slave(), + ?line Master = command(get_master), + ?line Parent = self(), + ?line Busy = + spawn_link( + fun() -> + Slave ! {Owner,{command,"set busy"}}, + receive {Parent,alpha} -> ok end, + Slave ! {Owner,{command,"busy"}}, + Slave ! {Owner,{command,"free"}}, + Parent ! {self(),alpha}, + command(lock), + receive {Parent,beta} -> ok end, + command({port_command,"busy"}), + command({port_command,"free"}), + Parent ! {self(),beta} + end), + ?line Void = rec(Void), + ?line Busy ! {self(),alpha}, + ?line {monitor,Busy,busy_port,Slave} = rec(Void), + ?line unlock_slave(), + ?line {Busy,alpha} = rec(Void), + ?line Void = rec(Void), + ?line Busy ! {self(), beta}, + ?line {monitor,Owner,busy_port,Slave} = rec(Void), + ?line Master ! {Owner, {command, "u"}}, + ?line {Busy,beta} = rec(Void), + ?line Void = rec(Void), + ?line NewMonitor = erlang:system_monitor(OldMonitor), + ?line OldMonitor = erlang:system_monitor(), + ?line OldMonitor = erlang:system_monitor(OldMonitor), + %% + ?line test_server:timetrap_cancel(Dog), + ok. + + + +rec(Tag) -> + receive X -> X after 1000 -> Tag end. + + + + +%% Assuming the following scenario, +%% +%% +---------------+ +-----------+ +%% | process with | | | +%% | no trap_exit |------------------| busy port | +%% | (suspended) | | | +%% +---------------+ +-----------+ +%% +%% tests that the suspended process is killed if the port is killed. + +no_trap_exit(suite) -> []; +no_trap_exit(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line process_flag(trap_exit, true), + ?line Pid = fun_spawn(fun no_trap_exit_process/3, + [self(), linked, Config]), + ?line receive + {Pid, port_created, Port} -> + io:format("Process ~w created port ~w", [Pid, Port]), + ?line exit(Port, die); + Other1 -> + test_server:fail({unexpected_message, Other1}) + end, + ?line receive + {'EXIT', Pid, die} -> + ok; + Other2 -> + test_server:fail({unexpected_message, Other2}) + end, + + ?line test_server:timetrap_cancel(Dog), + ok. + +%% The same scenario as above, but the port has been explicitly +%% unlinked from the process. + +no_trap_exit_unlinked(suite) -> []; +no_trap_exit_unlinked(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line process_flag(trap_exit, true), + ?line Pid = fun_spawn(fun no_trap_exit_process/3, + [self(), unlink, Config]), + ?line receive + {Pid, port_created, Port} -> + io:format("Process ~w created port ~w", [Pid, Port]), + ?line exit(Port, die); + Other1 -> + test_server:fail({unexpected_message, Other1}) + end, + ?line receive + {'EXIT', Pid, normal} -> + ok; + Other2 -> + test_server:fail({unexpected_message, Other2}) + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +no_trap_exit_process(ResultTo, Link, Config) -> + ?line load_busy_driver(Config), + ?line _Master = open_port({spawn, "busy_drv master"}, [eof]), + ?line Slave = open_port({spawn, "busy_drv slave"}, [eof]), + ?line case Link of + linked -> ok; + unlink -> unlink(Slave) + end, + ?line Slave ! {self(), {command, "lock port"}}, + ?line ResultTo ! {self(), port_created, Slave}, + ?line Slave ! {self(), {command, "suspend me"}}, + ok. + +%% Assuming the following scenario, +%% +%% +---------------+ +-----------+ +%% | process with | | | +%% | trap_exit |------------------| busy port | +%% | (suspended) | | | +%% +---------------+ +-----------+ +%% +%% tests that the suspended process is scheduled runnable and +%% receives an 'EXIT' message if the port is killed. + +trap_exit(suite) -> []; +trap_exit(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Pid = fun_spawn(fun busy_port_exit_process/2, [self(), Config]), + ?line receive + {Pid, port_created, Port} -> + io:format("Process ~w created port ~w", [Pid, Port]), + ?line unlink(Pid), + ?line {status, suspended} = process_info(Pid, status), + ?line exit(Port, die); + Other1 -> + test_server:fail({unexpected_message, Other1}) + end, + ?line receive + {Pid, ok} -> + ok; + Other2 -> + test_server:fail({unexpected_message, Other2}) + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +busy_port_exit_process(ResultTo, Config) -> + ?line process_flag(trap_exit, true), + ?line load_busy_driver(Config), + ?line _Master = open_port({spawn, "busy_drv master"}, [eof]), + ?line Slave = open_port({spawn, "busy_drv slave"}, [eof]), + ?line Slave ! {self(), {command, "lock port"}}, + ?line ResultTo ! {self(), port_created, Slave}, + ?line Slave ! {self(), {command, "suspend me"}}, + receive + {'EXIT', Slave, die} -> + ResultTo ! {self(), ok}; + Other -> + ResultTo ! {self(), {unexpected_message, Other}} + end. + +%% Tests that several processes suspended by a write to a busy port +%% will start running as soon as the port becamomes ready. +%% This should work even if some of the processes have terminated +%% in the meantime. + +multiple_writers(suite) -> []; +multiple_writers(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line start_busy_driver(Config), + ?line process_flag(trap_exit, true), + + %% Start the waiters and make sure they have blocked. + ?line W1 = fun_spawn(fun quick_writer/0), + ?line W2 = fun_spawn(fun quick_writer/0), + ?line W3 = fun_spawn(fun quick_writer/0), + ?line W4 = fun_spawn(fun quick_writer/0), + ?line W5 = fun_spawn(fun quick_writer/0), + ?line test_server:sleep(500), % Make sure writers have blocked. + + %% Kill two of the processes. + exit(W1, kill), + receive {'EXIT', W1, killed} -> ok end, + exit(W3, kill), + receive {'EXIT', W3, killed} -> ok end, + + %% Unlock the port. The surviving processes should be become runnable. + ?line unlock_slave(), + ?line wait_for([W2, W4, W5]), + + ?line test_server:timetrap_cancel(Dog), + ok. + +quick_writer() -> + {Owner, Port} = get_slave(), + Port ! {Owner, {command, "port to busy"}}, + Port ! {Owner, {command, "lock me"}}, + ok. + +hard_busy_driver(Config) when is_list(Config) -> + hs_test(Config, true). + +soft_busy_driver(Config) when is_list(Config) -> + hs_test(Config, false). + +hs_test(Config, HardBusy) when is_list(Config) -> + ?line Me = self(), + ?line DrvName = case HardBusy of + true -> 'hard_busy_drv'; + false -> 'soft_busy_drv' + end, + ?line erl_ddll:start(), + ?line Path = ?config(data_dir, Config), + case erl_ddll:load_driver(Path, DrvName) of + ok -> ok; + {error, Error} -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + ?line ?t:fail() + end, + + ?line Port = open_port({spawn, DrvName}, []), + + NotSuspended = fun (Proc) -> + chk_not_value({status,suspended}, + process_info(Proc, status)) + end, + NotBusyEnd = fun (Proc, Res, Time) -> + receive + {Port, caller, Proc} -> ok + after + 500 -> exit(missing_caller_message) + end, + chk_value({return, true}, Res), + chk_range(0, Time, 100) + end, + ForceEnd = fun (Proc, Res, Time) -> + case HardBusy of + false -> + NotBusyEnd(Proc, Res, Time); + true -> + chk_value({error, notsup}, Res), + chk_range(0, Time, 100), + receive + Msg -> exit({unexpected_msg, Msg}) + after + 500 -> ok + end + end + end, + BadArg = fun (_Proc, Res, Time) -> + chk_value({error, badarg}, Res), + chk_range(0, Time, 100) + end, + + %% Not busy + + %% Not busy; nosuspend option + ?line hs_busy_pcmd(Port, [nosuspend], NotSuspended, NotBusyEnd), + + %% Not busy; force option + ?line hs_busy_pcmd(Port, [force], NotSuspended, ForceEnd), + + %% Not busy; force and nosuspend option + ?line hs_busy_pcmd(Port, [force, nosuspend], NotSuspended, ForceEnd), + + %% Not busy; no option + ?line hs_busy_pcmd(Port, [], NotSuspended, NotBusyEnd), + + %% Not busy; bad option + ?line hs_busy_pcmd(Port, [bad_option], NotSuspended, BadArg), + + + %% Make busy + ?line erlang:port_control(Port, $B, []), + + + %% Busy; nosuspend option + ?line hs_busy_pcmd(Port, [nosuspend], NotSuspended, + fun (_Proc, Res, Time) -> + chk_value({return, false}, Res), + chk_range(0, Time, 100), + receive + Msg -> exit({unexpected_msg, Msg}) + after + 500 -> ok + end + end), + + %% Busy; force option + ?line hs_busy_pcmd(Port, [force], NotSuspended, ForceEnd), + + %% Busy; force and nosuspend option + ?line hs_busy_pcmd(Port, [force, nosuspend], NotSuspended, ForceEnd), + + %% Busy; bad option + ?line hs_busy_pcmd(Port, [bad_option], NotSuspended, BadArg), + + %% no option on busy port + ?line hs_busy_pcmd(Port, [], + fun (Proc) -> + receive after 1000 -> ok end, + chk_value({status,suspended}, + process_info(Proc, status)), + + %% Make not busy + erlang:port_control(Port, $N, []) + end, + fun (_Proc, Res, Time) -> + chk_value({return, true}, Res), + chk_range(1000, Time, 2000) + end), + + ?line true = erlang:port_close(Port), + ?line ok = erl_ddll:unload_driver(DrvName), + ?line ok = erl_ddll:stop(), + ?line ok. + +hs_busy_pcmd(Prt, Opts, StartFun, EndFun) -> + Tester = self(), + P = spawn_link(fun () -> + erlang:yield(), + Tester ! {self(), doing_port_command}, + Start = os:timestamp(), + Res = try {return, + erlang:port_command(Prt, [], Opts)} + catch Exception:Error -> {Exception, Error} + end, + End = os:timestamp(), + Time = round(timer:now_diff(End, Start)/1000), + Tester ! {self(), port_command_result, Res, Time} + end), + receive + {P, doing_port_command} -> + ok + end, + StartFun(P), + receive + {P, port_command_result, Res, Time} -> + EndFun(P, Res, Time) + end. + +%%% Utilities. + +chk_range(Min, Val, Max) when Min =< Val, Val =< Max -> + ok; +chk_range(Min, Val, Max) -> + exit({bad_range, Min, Val, Max}). + +chk_value(Exp, Exp) -> + ok; +chk_value(Exp, Val) -> + exit({unexpected_value, Val, expected, Exp}). + +chk_not_value(NotExp, NotExp) -> + exit({unexpected_not_value, NotExp}); +chk_not_value(_, _) -> + ok. + +wait_for([]) -> + ok; +wait_for(Pids) -> + io:format("Waiting for ~p", [Pids]), + receive + {'EXIT', Pid, normal} -> + wait_for(lists:delete(Pid, Pids)); + Other -> + test_server:fail({bad_exit, Other}) + end. + +fun_spawn(Fun) -> + fun_spawn(Fun, []). + +fun_spawn(Fun, Args) -> + spawn_link(erlang, apply, [Fun, Args]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% These routines provide a port which will become busy when the +%% the first message is sent to it. The unlock_slave/0 function can +%% be called (from another process) to make the port non-busy. +%% +%% Typical usage: +%% +%% start_busy_driver(Config) Load driver; start server. +%% +%% P r o c e s s O n e +%% {Owner, Port} = get_slave() O Obtain port and its owner. +%% Port ! {Owner, {command, List}} Send to port (will not block +%% but port will become busy). +%% Port ! {Owner, {command, List}} Will block the process. +%% +%% P r o c e s s T w o +%% unlock_slave() Set port to non-busy. Process One +%% will continue executing. Further +%% writes to the port will not block. +%% +%% Any process can call busy_drv:lock() to lock the port again. +%% +%% Note: This module must be used in an installed test suite (outside of +%% clearcase). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +load_busy_driver(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line erl_ddll:start(), + case erl_ddll:load_driver(DataDir, "busy_drv") of + ok -> ok; + {error, Error} -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + ?line ?t:fail() + end. + +%%% Interface functions. + +start_busy_driver(Config) when is_list(Config) -> + ?line Pid = spawn_link(?MODULE, init, [Config, self()]), + ?line receive + {Pid, started} -> + ok; + Other -> + test_server:fail({unexpected_message, Other}) + end. + +unlock_slave() -> + command(unlock). + +get_slave() -> + ?line command(get_slave). + +%% Internal functions. + +command(Msg) -> + ?line whereis(busy_drv_server) ! {self(), Msg}, + ?line receive + {busy_drv_reply, Reply} -> + Reply + end. + +%%% Server. + +init(Config, ReplyTo) -> + register(busy_drv_server, self()), + load_busy_driver(Config), + Driver = "busy_drv", + Master = open_port({spawn, Driver++" master"}, []), + Slave = open_port({spawn, Driver++" slave"}, []), + ReplyTo ! {self(), started}, + loop(Master, Slave). + +loop(Master, Slave) -> + receive + {Pid, get_master} -> + Pid ! {busy_drv_reply, Master}, + loop(Master, Slave); + {Pid, get_slave} -> + Pid ! {busy_drv_reply, {self(), Slave}}, + loop(Master, Slave); + {Pid, unlock} -> + Master ! {self(), {command, "u"}}, + Pid ! {busy_drv_reply, ok}, + loop(Master, Slave); + {Pid, lock} -> + Master ! {self(), {command, "l"}}, + Pid ! {busy_drv_reply, ok}, + loop(Master, Slave); + {Pid, {port_command,Data}} -> + erlang:port_command(Slave, Data), + Pid ! {busy_drv_reply, ok}, + loop(Master, Slave); + {Pid, stop} -> + Pid ! {busy_drv_reply, ok} + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/call_trace_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/call_trace_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/call_trace_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/call_trace_SUITE.erl 2009-09-18 15:08:03.000000000 +0100 @@ -0,0 +1,1240 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +%%% Purpose : Tests the new call_trace BIF. + +-module(call_trace_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + hipe/1,process_specs/1,basic/1,flags/1,errors/1,pam/1,change_pam/1, + return_trace/1,exception_trace/1,on_load/1,deep_exception/1, + exception_nocatch/1,bit_syntax/1]). + +%% Helper functions. + +-export([bar/0,foo/0,foo/1,foo/2,expect/1,worker_foo/1,pam_foo/2,nasty/0, + id/1,deep/3,deep_1/3,deep_2/2,deep_3/2,deep_4/1,deep_5/1, + bs_sum_a/2,bs_sum_b/2]). + +%% Debug +-export([abbr/1,abbr/2]). + + +-include("test_server.hrl"). + +-define(P, 20). + +all(suite) -> + Common = [errors,on_load], + NotHipe = [process_specs,basic,flags,pam,change_pam,return_trace, + exception_trace,deep_exception,exception_nocatch,bit_syntax], + Hipe = [hipe], + case test_server:is_native(?MODULE) of + true -> Hipe ++ Common; + false -> NotHipe ++ Common + end. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog = ?t:timetrap(?t:seconds(30)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +hipe(Config) when is_list(Config) -> + ?line 0 = erlang:trace_pattern({?MODULE,worker_foo,1}, true), + ?line 0 = erlang:trace_pattern({?MODULE,worker_foo,1}, true, [local]), + ?line AllFuncs = erlang:trace_pattern({'_','_','_'}, true), + + %% Make sure that a traced, exported function can still be found. + ?line true = erlang:function_exported(error_handler, undefined_function, 3), + ?line AllFuncs = erlang:trace_pattern({'_','_','_'}, false), + ok. + +process_specs(doc) -> + "Tests 'all', 'new', and 'existing' for specifying processes."; +process_specs(suite) -> []; +process_specs(Config) when is_list(Config) -> + ?line Tracer = start_tracer(), + ?line {flags,[call]} = trace_info(self(), flags), + ?line {tracer,Tracer} = trace_info(self(), tracer), + ?line trace_func({?MODULE,worker_foo,1}, []), + + %% Test the 'new' flag. + + ?line {Work1A,Work1B} = start_and_trace(new, [1,2,3], A1B={3,2,1}), + {flags,[]} = trace_info(Work1A, flags), + {tracer,[]} = trace_info(Work1A, tracer), + {tracer,Tracer} = trace_info(Work1B, tracer), + {flags,[call]} = trace_info(Work1B, flags), + ?line expect({trace,Work1B,call,{?MODULE,worker_foo,[A1B]}}), + ?line unlink(Work1B), + ?line Mref = erlang:monitor(process, Work1B), + ?line exit(Work1B, kill), + receive + {'DOWN',Mref,_,_,_} -> ok + end, + ?line undefined = trace_info(Work1B, flags), + ?line {flags,[]} = trace_info(new, flags), + ?line {tracer,[]} = trace_info(new, tracer), + + %% Test the 'existing' flag. + ?line {Work2A,_Work2B} = start_and_trace(existing, A2A=[5,6,7], [7,6,5]), + ?line expect({trace,Work2A,call,{?MODULE,worker_foo,[A2A]}}), + + %% Test the 'all' flag. + ?line {Work3A,Work3B} = start_and_trace(all, A3A=[12,13], A3B=[13,12]), + ?line expect({trace,Work3A,call,{?MODULE,worker_foo,[A3A]}}), + ?line expect({trace,Work3B,call,{?MODULE,worker_foo,[A3B]}}), + + ok. + +start_and_trace(Flag, A1, A2) -> + W1 = start_worker(), + trace_pid(Flag, true, [call]), + W2 = start_worker(), + call_worker(W1, A1), + call_worker(W2, A2), + case Flag of + new -> + {flags,[call]} = trace_info(new, flags), + {tracer,_} = trace_info(new, tracer); + _Other -> + ok + end, + trace_pid(Flag, false, [call]), + {W1,W2}. + +start_worker() -> + ?line spawn(fun worker_loop/0). + +call_worker(Pid, Arg) -> + Pid ! {self(),{call,Arg}}, + receive + {result,Res} -> Res + after 5000 -> + ?line ?t:fail(no_answer_from_worker) + end. + +worker_loop() -> + receive + {From,{call,Arg}} -> + From ! {result,?MODULE:worker_foo(Arg)}, + worker_loop(); + Other -> + exit({unexpected_message,Other}) + end. + +worker_foo(_Arg) -> + ok. + +basic(doc) -> + "Basic test of the call tracing (we trace one process)."; +basic(suite) -> []; +basic(Config) when is_list(Config) -> + ?line start_tracer(), + ?line trace_info(self(), flags), + ?line trace_info(self(), tracer), + ?line 0 = trace_func({?MODULE,no_such_function,0}, []), + ?line {traced,undefined} = + trace_info({?MODULE,no_such_function,0}, traced), + ?line {match_spec, undefined} = + trace_info({?MODULE,no_such_function,0}, match_spec), + + %% Trace some functions... + + ?line trace_func({lists,'_','_'}, []), + ?line 3 = trace_func({?MODULE,foo,'_'}, true), + ?line 1 = trace_func({?MODULE,bar,0}, true), + ?line {traced,global} = trace_info({?MODULE,bar,0}, traced), + ?line 1 = trace_func({erlang,list_to_integer,1}, true), + ?line {traced,global} = trace_info({erlang,list_to_integer,1}, traced), + + %% ... and call them... + + ?line AList = [x,y,z], + ?line true = lists:member(y, AList), + ?line foo0 = ?MODULE:foo(), + ?line 4 = ?MODULE:foo(3), + ?line 11 = ?MODULE:foo(7, 4), + ?line ok = ?MODULE:bar(), + ?line 42 = list_to_integer(non_literal("42")), + + %% ... make sure the we got trace messages (but not for ?MODULE:expect/1). + + ?line Self = self(), + ?line ?MODULE:expect({trace,Self,call,{lists,member,[y,AList]}}), + ?line ?MODULE:expect({trace,Self,call,{?MODULE,foo,[]}}), + ?line ?MODULE:expect({trace,Self,call,{?MODULE,foo,[3]}}), + ?line ?MODULE:expect({trace,Self,call,{?MODULE,foo,[7,4]}}), + ?line ?MODULE:expect({trace,Self,call,{?MODULE,bar,[]}}), + ?line ?MODULE:expect({trace,Self,call,{erlang,list_to_integer,["42"]}}), + + %% Turn off trace for this module and call functions... + + ?line trace_func({?MODULE,'_','_'}, false), + ?line {traced,false} = trace_info({?MODULE,bar,0}, traced), + ?line foo0 = ?MODULE:foo(), + ?line 4 = ?MODULE:foo(3), + ?line 11 = ?MODULE:foo(7, 4), + ?line ok = ?MODULE:bar(), + ?line [1,2,3,4,5,6,7,8,9,10] = lists:seq(1, 10), + ?line 777 = list_to_integer(non_literal("777")), + + %% ... turn on all trace messages... + + ?line trace_func({'_','_','_'}, false), + ?line [b,a] = lists:reverse([a,b]), + + %% Read out the remaing trace messages. + + ?line ?MODULE:expect({trace,Self,call,{lists,seq,[1,10]}}), + ?line ?MODULE:expect({trace,Self,call,{erlang,list_to_integer,["777"]}}), + receive + Any -> + ?line ?t:fail({unexpected_message,Any}) + after 1 -> + ok + end, + + %% Turn on and then off tracing on all external functions. + %% This might cause the emulator to crasch later if it doesn't + %% restore all export entries properly. + + ?line AllFuncs = trace_func({'_','_','_'}, true), + io:format("AllFuncs = ~p", [AllFuncs]), + %% Make sure that a traced, exported function can still be found. + ?line true = erlang:function_exported(error_handler, undefined_function, 3), + ?line AllFuncs = trace_func({'_','_','_'}, false), + ?line erlang:trace_delivered(all), + receive + {trace_delivered,_,_} -> ok + end, + c:flush(), % Print the traces messages. + c:flush(), % Print the traces messages. + + ?line {traced,false} = trace_info({erlang,list_to_integer,1}, traced), + + ok. + +non_literal(X) -> X. + +bar() -> + ok. + +foo() -> foo0. +foo(X) -> X+1. +foo(X, Y) -> X+Y. + +flags(doc) -> "Test flags (arity, timestamp) for call_trace/3. " + "Also, test the '{tracer,Pid}' option."; +flags(Config) when is_list(Config) -> + ?line Tracer = start_tracer_loop(), + ?line trace_pid(self(), true, [call,{tracer,Tracer}]), + + %% Trace some functions... + + ?line trace_func({filename,'_','_'}, true), + + %% ... and call them... + + ?line Self = self(), + ?line filename:absname("nisse"), + ?line ?MODULE:expect({trace,Self,call,{filename,absname,["nisse"]}}), + ?line trace_pid(Self, true, [call,arity]), + ?line filename:absname("kalle"), + ?line filename:absname("kalle", "/root"), + ?line ?MODULE:expect({trace,Self,call,{filename,absname,1}}), + ?line ?MODULE:expect({trace,Self,call,{filename,absname,2}}), + ?line trace_info(Self, flags), + + %% Timestamp + arity. + + flag_test(fun() -> + ?line trace_pid(Self, true, [timestamp]), + ?line "dum" = filename:basename("/abcd/dum"), + ?line Ts = expect({trace_ts,Self,call,{filename,basename,1},ts}), + ?line trace_info(Self, flags), + Ts + end), + + %% Timestamp. + + ?line AnArg = "/abcd/hejsan", + flag_test(fun() -> + ?line trace_pid(Self, false, [arity]), + ?line "hejsan" = filename:basename(AnArg), + ?line Ts = expect({trace_ts,Self,call, + {filename,basename,[AnArg]},ts}), + ?line trace_info(Self, flags), + Ts + end), + + %% All flags turned off. + + ?line trace_pid(Self, false, [timestamp]), + ?line AnotherArg = filename:join(AnArg, "hoppsan"), + ?line "hoppsan" = filename:basename(AnotherArg), + ?line expect({trace,Self,call,{filename,join,[AnArg,"hoppsan"]}}), + ?line expect({trace,Self,call,{filename,basename,[AnotherArg]}}), + ?line trace_info(Self, flags), + + ok. + +flag_test(Test) -> + Now = now(), + Ts = Test(), + case timer:now_diff(Ts, Now) of + Time when Time < 5*1000000 -> + %% Reasonable short time. + ok; + _Diff -> + %% Too large difference. + io:format("Now = ~p\n", [Now]), + io:format("Ts = ~p\n", [Ts]), + ?line ?t:fail() + end, + flag_test_cpu_timestamp(Test). + +flag_test_cpu_timestamp(Test) -> + try erlang:trace(all, true, [cpu_timestamp]) of + _ -> + io:format("CPU timestamps"), + Ts = Test(), + erlang:trace(all, false, [cpu_timestamp]), + Origin = {0,0,0}, + Hour = 3600*1000000, + case timer:now_diff(Ts, Origin) of + Diff when Diff < 4*Hour -> + %% In the worst case, CPU timestamps count from when this + %% Erlang emulator was started. The above test is a conservative + %% test that all CPU timestamps should pass. + ok; + _Time -> + io:format("Strange CPU timestamp: ~p", [Ts]), + ?line ?t:fail() + end, + io:format("Turned off CPU timestamps") + catch + error:badarg -> ok + end. + +errors(doc) -> "Test bad arguments for trace/3 and trace_pattern/3."; +errors(suite) -> []; +errors(Config) when is_list(Config) -> + ?line expect_badarg_pid(aaa, true, []), + ?line expect_badarg_pid({pid,dum}, false, []), + ?line expect_badarg_func({'_','_',1}, []), + ?line expect_badarg_func({'_',gosh,1}, []), + ?line expect_badarg_func({xxx,'_',2}, []), + ?line expect_badarg_func({xxx,yyy,b}, glurp), + ok. + +expect_badarg_pid(What, How, Flags) -> + case catch erlang:trace(What, How, Flags) of + {'EXIT',{badarg,Where}} -> + io:format("trace(~p, ~p, ~p) ->\n {'EXIT',{badarg,~p}}", + [What,How,Flags,Where]), + ok; + Other -> + io:format("trace(~p, ~p, ~p) -> ~p", + [What,How,Flags,Other]), + ?t:fail({unexpected,Other}) + end. + +expect_badarg_func(MFA, Pattern) -> + case catch erlang:trace_pattern(MFA, Pattern) of + {'EXIT',{badarg,Where}} -> + io:format("trace_pattern(~p, ~p) ->\n {'EXIT',{badarg,~p}}", + [MFA,Pattern,Where]), + ok; + Other -> + io:format("trace_pattern(~p, ~p) -> ~p", + [MFA, Pattern, Other]), + ?t:fail({unexpected,Other}) + end. + +pam(doc) -> "Basic test of PAM."; +pam(suite) -> []; +pam(Config) when is_list(Config) -> + ?line start_tracer(), + ?line Self = self(), + + %% Build the match program. + ?line Prog1 = {[{a,tuple},'$1'],[],[]}, + ?line Prog2 = {[{a,bigger,tuple},'$1'],[],[{message,'$1'}]}, + ?line MatchProg = [Prog1,Prog2], + ?line pam_trace(MatchProg), + + %% Do some calls. + ?line ?MODULE:pam_foo(not_a_tuple, [a,b]), + ?line ?MODULE:pam_foo({a,tuple}, [a,list]), + ?line ?MODULE:pam_foo([this,one,will,'not',match], dummy_arg), + ?line LongList = lists:seq(1,10), + ?line ?MODULE:pam_foo({a,bigger,tuple}, LongList), + + %% Check that we get the correct trace messages. + ?line expect({trace,Self,call,{?MODULE,pam_foo,[{a,tuple},[a,list]]}}), + ?line expect({trace,Self,call, + {?MODULE,pam_foo,[{a,bigger,tuple},LongList]}, + LongList}), + + ?line trace_func({?MODULE,pam_foo,'_'}, false), + ok. + +pam_trace(Prog) -> + 1 = trace_func({?MODULE,pam_foo,'_'}, Prog), + {match_spec,Prog} = trace_info({?MODULE,pam_foo,2}, match_spec), + ok. + +pam_foo(A, B) -> + {ok,A,B}. + + +change_pam(doc) -> "Test changing PAM programs for a function."; +change_pam(suite) -> []; +change_pam(Config) when is_list(Config) -> + ?line start_tracer(), + ?line Self = self(), + + %% Install the first match program. + %% Test using timestamp at the same time. + + ?line trace_pid(Self, true, [call,arity,timestamp]), + ?line Prog1 = [{['$1','$2'],[],[{message,'$1'}]}], + ?line change_pam_trace(Prog1), + ?line [x,y] = lists:append(id([x]), id([y])), + ?line {heap_size,_} = erlang:process_info(Self, heap_size), + ?line expect({trace_ts,Self,call,{lists,append,2},[x],ts}), + ?line expect({trace_ts,Self,call,{erlang,process_info,2},Self,ts}), + + %% Install a new PAM program. + + ?line Prog2 = [{['$1','$2'],[],[{message,'$2'}]}], + ?line change_pam_trace(Prog2), + ?line [xx,yy] = lists:append(id([xx]), id([yy])), + ?line {current_function,_} = erlang:process_info(Self, current_function), + ?line expect({trace_ts,Self,call,{lists,append,2},[yy],ts}), + ?line expect({trace_ts,Self,call,{erlang,process_info,2},current_function,ts}), + + ?line 1 = trace_func({lists,append,2}, false), + ?line 1 = trace_func({erlang,process_info,2}, false), + ?line {match_spec,false} = trace_info({lists,append,2}, match_spec), + ?line {match_spec,false} = trace_info({erlang,process_info,2}, match_spec), + + ok. + +change_pam_trace(Prog) -> + 1 = trace_func({lists,append,2}, Prog), + 1 = trace_func({erlang,process_info,2}, Prog), + {match_spec,Prog} = trace_info({lists,append,2}, match_spec), + {match_spec,Prog} = trace_info({erlang,process_info,2}, match_spec), + ok. + +return_trace(doc) -> "Test the new return trace."; +return_trace(suite) -> []; +return_trace(Config) when is_list(Config) -> + return_trace(). + +return_trace() -> + X = {save,me}, + ?line start_tracer(), + ?line Self = self(), + + %% Test call and return trace and timestamp. + + ?line trace_pid(Self, true, [call,timestamp]), + Stupid = {pointless,tuple}, + ?line Prog1 = [{['$1','$2'],[],[{return_trace},{message,{Stupid}}]}], + ?line 1 = trace_func({lists,append,2}, Prog1), + ?line 1 = trace_func({erlang,process_info,2}, Prog1), + ?line {match_spec,Prog1} = trace_info({lists,append,2}, match_spec), + ?line {match_spec,Prog1} = trace_info({erlang,process_info,2}, match_spec), + + ?line [x,y] = lists:append(id([x]), id([y])), + Current = {current_function,{?MODULE,return_trace,0}}, + ?line Current = erlang:process_info(Self, current_function), + ?line expect({trace_ts,Self,call,{lists,append,[[x],[y]]},Stupid,ts}), + ?line expect({trace_ts,Self,return_from,{lists,append,2},[x,y],ts}), + ?line expect({trace_ts,Self,call,{erlang,process_info,[Self,current_function]}, + Stupid,ts}), + ?line expect({trace_ts,Self,return_from,{erlang,process_info,2},Current,ts}), + + %% Try catch/exit. + + ?line 1 = trace_func({?MODULE,nasty,0}, [{[],[],[{return_trace},{message,false}]}]), + ?line {'EXIT',good_bye} = (catch ?MODULE:nasty()), + ?line 1 = trace_func({?MODULE,nasty,0}, false), + + %% Turn off trace. + + ?line 1 = trace_func({lists,append,2}, false), + ?line 1 = trace_func({erlang,process_info,2}, false), + ?line {match_spec,false} = trace_info({lists,append,2}, match_spec), + ?line {match_spec,false} = trace_info({erlang,process_info,2}, match_spec), + + %% No timestamp, no trace message for call. + + ?line trace_pid(Self, false, [timestamp]), + ?line Prog2 = [{['$1','$2'],[],[{return_trace},{message,false}]}, + {['$1'],[],[{return_trace},{message,false}]}], + ?line 1 = trace_func({lists,seq,2}, Prog2), + ?line 1 = trace_func({erlang,atom_to_list,1}, Prog2), + ?line {match_spec,Prog2} = trace_info({lists,seq,2}, match_spec), + ?line {match_spec,Prog2} = trace_info({erlang,atom_to_list,1}, match_spec), + + ?line lists:seq(2, 7), + ?line atom_to_list(non_literal(nisse)), + ?line expect({trace,Self,return_from,{lists,seq,2},[2,3,4,5,6,7]}), + ?line expect({trace,Self,return_from,{erlang,atom_to_list,1},"nisse"}), + + %% Turn off trace. + + ?line 1 = trace_func({lists,seq,2}, false), + ?line 1 = trace_func({erlang,atom_to_list,1}, false), + ?line {match_spec,false} = trace_info({lists,seq,2}, match_spec), + ?line {match_spec,false} = trace_info({erlang,atom_to_list,1}, match_spec), + + ?line {save,me} = X, + + ok. + +nasty() -> + exit(good_bye). + +exception_trace(doc) -> "Test the new exception trace."; +exception_trace(suite) -> []; +exception_trace(Config) when is_list(Config) -> + exception_trace(). + +exception_trace() -> + X = {save,me}, + ?line start_tracer(), + ?line Self = self(), + + %% Test call and return trace and timestamp. + + ?line trace_pid(Self, true, [call,timestamp]), + Stupid = {pointless,tuple}, + ?line Prog1 = [{['$1','$2'],[],[{exception_trace},{message,{Stupid}}]}], + ?line 1 = trace_func({lists,append,2}, Prog1), + ?line 1 = trace_func({erlang,process_info,2}, Prog1), + ?line {match_spec,Prog1} = trace_info({lists,append,2}, match_spec), + ?line {match_spec,Prog1} = + trace_info({erlang,process_info,2}, match_spec), + + ?line [x,y] = lists:append(id([x]), id([y])), + Current = {current_function,{?MODULE,exception_trace,0}}, + ?line Current = erlang:process_info(Self, current_function), + ?line expect({trace_ts,Self,call,{lists,append,[[x],[y]]},Stupid,ts}), + ?line expect({trace_ts,Self,return_from,{lists,append,2},[x,y],ts}), + ?line expect({trace_ts,Self,call,{erlang,process_info, + [Self,current_function]}, + Stupid,ts}), + ?line expect({trace_ts,Self,return_from, + {erlang,process_info,2},Current,ts}), + + %% Try catch/exit. + + ?line 1 = trace_func({?MODULE,nasty,0}, + [{[],[],[{exception_trace},{message,false}]}]), + ?line {'EXIT',good_bye} = (catch ?MODULE:nasty()), + ?line expect({trace_ts,Self,exception_from, + {?MODULE,nasty,0},{exit,good_bye},ts}), + ?line 1 = trace_func({?MODULE,nasty,0}, false), + + %% Turn off trace. + + ?line 1 = trace_func({lists,append,2}, false), + ?line 1 = trace_func({erlang,process_info,2}, false), + ?line {match_spec,false} = trace_info({lists,append,2}, match_spec), + ?line {match_spec,false} = + trace_info({erlang,process_info,2}, match_spec), + + %% No timestamp, no trace message for call. + + ?line trace_pid(Self, false, [timestamp]), + ?line Prog2 = [{['$1','$2'],[],[{exception_trace},{message,false}]}, + {['$1'],[],[{exception_trace},{message,false}]}], + ?line 1 = trace_func({lists,seq,2}, Prog2), + ?line 1 = trace_func({erlang,atom_to_list,1}, Prog2), + ?line {match_spec,Prog2} = trace_info({lists,seq,2}, match_spec), + ?line {match_spec,Prog2} = + trace_info({erlang,atom_to_list,1}, match_spec), + + ?line lists:seq(2, 7), + ?line atom_to_list(non_literal(nisse)), + ?line expect({trace,Self,return_from,{lists,seq,2},[2,3,4,5,6,7]}), + ?line expect({trace,Self,return_from,{erlang,atom_to_list,1},"nisse"}), + + %% Turn off trace. + + ?line 1 = trace_func({lists,seq,2}, false), + ?line 1 = trace_func({erlang,atom_to_list,1}, false), + ?line {match_spec,false} = trace_info({lists,seq,2}, match_spec), + ?line {match_spec,false} = + trace_info({erlang,atom_to_list,1}, match_spec), + + ?line expect(), + ?line {save,me} = X, + ok. + +on_load(doc) -> "Test the on_load argument for trace_pattern/3."; +on_load(suite) -> []; +on_load(Config) when is_list(Config) -> + ?line 0 = erlang:trace_pattern(on_load, []), + ?line {traced,global} = erlang:trace_info(on_load, traced), + ?line {match_spec,[]} = erlang:trace_info(on_load, match_spec), + + ?line 0 = erlang:trace_pattern(on_load, true, [local]), + ?line {traced,local} = erlang:trace_info(on_load, traced), + ?line {match_spec,[]} = erlang:trace_info(on_load, match_spec), + + ?line 0 = erlang:trace_pattern(on_load, false, [local]), + ?line {traced,false} = erlang:trace_info(on_load, traced), + ?line {match_spec,false} = erlang:trace_info(on_load, match_spec), + + ?line Pam1 = [{[],[],[{message,false}]}], + ?line 0 = erlang:trace_pattern(on_load, Pam1), + ?line {traced,global} = erlang:trace_info(on_load, traced), + ?line {match_spec,Pam1} = erlang:trace_info(on_load, match_spec), + + ?line 0 = erlang:trace_pattern(on_load, true, [local]), + ?line 0 = erlang:trace_pattern(on_load, false, [local]), + + ok. + + + +deep_exception(doc) -> "Test the new exception trace."; +deep_exception(suite) -> []; +deep_exception(Config) when is_list(Config) -> + deep_exception(). + +deep_exception() -> + ?line start_tracer(), + ?line Self = self(), + ?line N = 200000, + ?line LongImproperList = seq(1, N-1, N), + + Prog = [{'_',[],[{exception_trace}]}], +%% ?line 1 = trace_pid(Self, true, [call]), + ?line 1 = trace_func({?MODULE,deep,'_'}, Prog), + ?line 1 = trace_func({?MODULE,deep_1,'_'}, Prog), + ?line 1 = trace_func({?MODULE,deep_2,'_'}, Prog), + ?line 1 = trace_func({?MODULE,deep_3,'_'}, Prog), + ?line 1 = trace_func({?MODULE,deep_4,'_'}, Prog), + ?line 1 = trace_func({?MODULE,deep_5,'_'}, Prog), + ?line 1 = trace_func({?MODULE,id,'_'}, Prog), + ?line 1 = trace_func({erlang,'++','_'}, Prog), + ?line 1 = trace_func({erlang,exit,1}, Prog), + ?line 1 = trace_func({erlang,throw,1}, Prog), + ?line 2 = trace_func({erlang,error,'_'}, Prog), + ?line 1 = trace_func({lists,reverse,2}, Prog), + + ?line deep_exception(?LINE, exit, [paprika], 1, + [{trace,Self,call,{erlang,exit,[paprika]}}, + {trace,Self,exception_from,{erlang,exit,1}, + {exit,paprika}}], + exception_from, {exit,paprika}), + ?line deep_exception(?LINE, throw, [3.14], 2, + [{trace,Self,call,{erlang,throw,[3.14]}}, + {trace,Self,exception_from,{erlang,throw,1}, + {throw,3.14}}], + exception_from, {throw,3.14}), + ?line deep_exception(?LINE, error, [{paprika}], 3, + [{trace,Self,call,{erlang,error,[{paprika}]}}, + {trace,Self,exception_from,{erlang,error,1}, + {error,{paprika}}}], + exception_from, {error,{paprika}}), + ?line deep_exception(?LINE, error, ["{paprika}",[]], 3, + [{trace,Self,call,{erlang,error,["{paprika}",[]]}}, + {trace,Self,exception_from,{erlang,error,2}, + {error,"{paprika}"}}], + exception_from, {error,"{paprika}"}), + ?line deep_exception(?LINE, id, [broccoli], 4, [], + return_from, broccoli), + ?line deep_exception( + ?LINE, append, [1,2], 5, + [{trace,Self,call,{erlang,'++',[1,2]}}, + {trace,Self,exception_from,{erlang,'++',2},{error,badarg}}], + exception_from, {error,badarg}), + ?line deep_exception(?LINE, '=', [1,2], 6, [], + exception_from, {error,{badmatch,2}}), + %% + ?line io:format("== Subtest: ~w", [?LINE]), + ?line try lists:reverse(LongImproperList, []) of + R1 -> test_server:fail({returned,abbr(R1)}) + catch error:badarg -> ok + end, + ?line expect(fun ({trace,S,call,{lists,reverse,[L1,L2]}}) + when is_list(L1), is_list(L2), S == Self -> + next; + ({trace,S,exception_from, + {lists,reverse,2},{error,badarg}}) + when S == Self -> + expected; + ('_') -> + {trace,Self,exception_from, + {lists,reverse,2},{error,badarg}}; + (_) -> + {unexpected, + {trace,Self,exception_from, + {lists,reverse,2},{error,badarg}}} + end), + ?line deep_exception(?LINE, deep_5, [1,2], 7, + [{trace,Self,call,{erlang,error,[undef]}}, + {trace,Self,exception_from,{erlang,error,1}, + {error,undef}}], + exception_from, {error,undef}), + ?line deep_exception(?LINE, deep_5, [undef], 8, + [{trace,Self,call,{?MODULE,deep_5,[undef]}}, + {trace,Self,exception_from,{?MODULE,deep_5,1}, + {error,function_clause}}], + exception_from, {error,function_clause}), + + %% Apply + %% + ?line deep_exception(?LINE, apply, [erlang,error,[[mo|rot]]], 1, + [{trace,Self,call,{erlang,error,[[mo|rot]]}}, + {trace,Self,exception_from,{erlang,error,1}, + {error,[mo|rot]}}], + exception_from, {error,[mo|rot]}), + ?line deep_exception(?LINE, apply, [erlang,error,[[mo|"rot"],[]]], 1, + [{trace,Self,call,{erlang,error,[[mo|"rot"],[]]}}, + {trace,Self,exception_from,{erlang,error,2}, + {error,[mo|"rot"]}}], + exception_from, {error,[mo|"rot"]}), + ?line Morot = make_ref(), + ?line deep_exception(?LINE, apply, [erlang,throw,[Morot]], 3, + [{trace,Self,call,{erlang,throw,[Morot]}}, + {trace,Self,exception_from,{erlang,throw,1}, + {throw,Morot}}], + exception_from, {throw,Morot}), + ?line deep_exception(?LINE, apply, [erlang,exit,[["morot"|Morot]]], 2, + [{trace,Self,call,{erlang,exit,[["morot"|Morot]]}}, + {trace,Self,exception_from,{erlang,exit,1}, + {exit,["morot"|Morot]}}], + exception_from, {exit,["morot"|Morot]}), + ?line deep_exception( + ?LINE, apply, [?MODULE,id,[spenat]], 4, + [{trace,Self,call,{?MODULE,id,[spenat]}}, + {trace,Self,return_from,{?MODULE,id,1},spenat}], + return_from, spenat), + ?line deep_exception( + ?LINE, apply, [erlang,'++',[1,2]], 5, + [{trace,Self,call,{erlang,'++',[1,2]}}, + {trace,Self,exception_from,{erlang,'++',2},{error,badarg}}], + exception_from, {error,badarg}), + ?line io:format("== Subtest: ~w", [?LINE]), + ?line try apply(lists, reverse, [LongImproperList, []]) of + R2 -> test_server:fail({returned,abbr(R2)}) + catch error:badarg -> ok + end, + ?line expect(fun ({trace,S,call,{lists,reverse,[L1,L2]}}) + when is_list(L1), is_list(L2), S == Self -> + next; + ({trace,S,exception_from, + {lists,reverse,2},{error,badarg}}) + when S == Self -> + expected; + ('_') -> + {trace,Self,exception_from, + {lists,reverse,2},{error,badarg}}; + (_) -> + {unexpected, + {trace,Self,exception_from, + {lists,reverse,2},{error,badarg}}} + end), + ?line deep_exception(?LINE, apply, [?MODULE,deep_5,[1,2]], 7, + [{trace,Self,call,{erlang,error,[undef]}}, + {trace,Self,exception_from,{erlang,error,1}, + {error,undef}}], + exception_from, {error,undef}), + ?line deep_exception(?LINE, apply, [?MODULE,deep_5,[undef]], 8, + [{trace,Self,call,{?MODULE,deep_5,[undef]}}, + {trace,Self,exception_from,{?MODULE,deep_5,1}, + {error,function_clause}}], + exception_from, {error,function_clause}), + %% Apply of fun + %% + ?line deep_exception(?LINE, apply, + [fun () -> + erlang:error([{"palsternacka",3.14},17]) + end, []], 1, + [{trace,Self,call, + {erlang,error,[[{"palsternacka",3.14},17]]}}, + {trace,Self,exception_from,{erlang,error,1}, + {error,[{"palsternacka",3.14},17]}}], + exception_from, {error,[{"palsternacka",3.14},17]}), + ?line deep_exception(?LINE, apply, + [fun () -> + erlang:error(["palsternacka",17], []) + end, []], 1, + [{trace,Self,call, + {erlang,error,[["palsternacka",17],[]]}}, + {trace,Self,exception_from,{erlang,error,2}, + {error,["palsternacka",17]}}], + exception_from, {error,["palsternacka",17]}), + ?line deep_exception(?LINE, apply, + [fun () -> erlang:throw(Self) end, []], 2, + [{trace,Self,call,{erlang,throw,[Self]}}, + {trace,Self,exception_from,{erlang,throw,1}, + {throw,Self}}], + exception_from, {throw,Self}), + ?line deep_exception(?LINE, apply, + [fun () -> + erlang:exit({1,2,3,4,[5,palsternacka]}) + end, []], 3, + [{trace,Self,call, + {erlang,exit,[{1,2,3,4,[5,palsternacka]}]}}, + {trace,Self,exception_from,{erlang,exit,1}, + {exit,{1,2,3,4,[5,palsternacka]}}}], + exception_from, {exit,{1,2,3,4,[5,palsternacka]}}), + ?line deep_exception(?LINE, apply, + [fun () -> ?MODULE:id(bladsallad) end, []], 4, + [{trace,Self,call,{?MODULE,id,[bladsallad]}}, + {trace,Self,return_from,{?MODULE,id,1},bladsallad}], + return_from, bladsallad), + ?line deep_exception(?LINE, apply, + [fun (A, B) -> A ++ B end, [1,2]], 5, + [{trace,Self,call,{erlang,'++',[1,2]}}, + {trace,Self,exception_from, + {erlang,'++',2},{error,badarg}}], + exception_from, {error,badarg}), + ?line deep_exception(?LINE, apply, [fun (A, B) -> A = B end, [1,2]], 6, + [], + exception_from, {error,{badmatch,2}}), + ?line io:format("== Subtest: ~w", [?LINE]), + ?line try apply(fun() -> lists:reverse(LongImproperList, []) end, []) of + R3 -> test_server:fail({returned,abbr(R3)}) + catch error:badarg -> ok + end, + ?line expect(fun ({trace,S,call,{lists,reverse,[L1,L2]}}) + when is_list(L1), is_list(L2), S == Self -> + next; + ({trace,S,exception_from, + {lists,reverse,2},{error,badarg}}) + when S == Self -> + expected; + ('_') -> + {trace,Self,exception_from, + {lists,reverse,2},{error,badarg}}; + (_) -> + {unexpected, + {trace,Self,exception_from, + {lists,reverse,2},{error,badarg}}} + end), + ?line deep_exception(?LINE, apply, + [fun () -> ?MODULE:deep_5(1,2) end, []], 7, + [{trace,Self,call,{erlang,error,[undef]}}, + {trace,Self,exception_from,{erlang,error,1}, + {error,undef}}], + exception_from, {error,undef}), + ?line deep_exception(?LINE, apply, + [fun () -> ?MODULE:deep_5(undef) end, []], 8, + [{trace,Self,call,{?MODULE,deep_5,[undef]}}, + {trace,Self,exception_from,{?MODULE,deep_5,1}, + {error,function_clause}}], + exception_from, {error,function_clause}), + + ?line trace_func({?MODULE,'_','_'}, false), + ?line trace_func({erlang,'_','_'}, false), + ?line trace_func({lists,'_','_'}, false), + ?line expect(), + ?line ok. + + +deep_exception(Line, B, Q, N, Extra, Tag, R) -> + ?line Self = self(), + ?line io:format("== Subtest: ~w", [Line]), + ?line Result = ?MODULE:deep(N, B, Q), + ?line Result = deep_expect(Self, B, Q, N, Extra, Tag, R). + +deep_expect(Self, B, Q, N, Extra, Tag, R) -> + ?line expect({trace,Self,call,{?MODULE,deep,[N,B,Q]}}), + ?line Result = deep_expect_N(Self, B, Q, N, Extra, Tag, R), + ?line expect({trace,Self,return_from,{?MODULE,deep,3},Result}), + ?line Result. + +deep_expect_N(Self, B, Q, N, Extra, Tag, R) -> + deep_expect_N(Self, B, Q, N, Extra, Tag, R, N). + +deep_expect_N(Self, B, Q, N, Extra, Tag, R, J) when J > 0 -> + ?line expect({trace,Self,call,{?MODULE,deep_1,[J,B,Q]}}), + ?line deep_expect_N(Self, B, Q, N, Extra, Tag, R, J-1); +deep_expect_N(Self, B, Q, N, Extra, Tag, R, 0) -> + ?line expect({trace,Self,call,{?MODULE,deep_2,[B,Q]}}), + ?line expect({trace,Self,call,{?MODULE,deep_3,[B,Q]}}), + ?line expect({trace,Self,return_from,{?MODULE,deep_3,2},{B,Q}}), + ?line expect({trace,Self,call,{?MODULE,deep_4,[{B,Q}]}}), + ?line expect({trace,Self,call,{?MODULE,id,[{B,Q}]}}), + ?line expect({trace,Self,return_from,{?MODULE,id,1},{B,Q}}), + ?line deep_expect_Extra(Self, N, Extra, Tag, R), + ?line expect({trace,Self,Tag,{?MODULE,deep_4,1},R}), + ?line expect({trace,Self,Tag,{?MODULE,deep_2,2},R}), + ?line deep_expect_N(Self, N, Tag, R). + +deep_expect_Extra(Self, N, [E|Es], Tag, R) -> + ?line expect(E), + ?line deep_expect_Extra(Self, N, Es, Tag, R); +deep_expect_Extra(_Self, _N, [], _Tag, _R) -> + ?line ok. + +deep_expect_N(Self, N, Tag, R) when N > 0 -> + ?line expect({trace,Self,Tag,{?MODULE,deep_1,3},R}), + ?line deep_expect_N(Self, N-1, Tag, R); +deep_expect_N(_Self, 0, return_from, R) -> + ?line {value,R}; +deep_expect_N(_Self, 0, exception_from, R) -> + ?line R. + + + +exception_nocatch(doc) -> "Test the new exception trace."; +exception_nocatch(suite) -> []; +exception_nocatch(Config) when is_list(Config) -> + exception_nocatch(). + +exception_nocatch() -> + Prog = [{'_',[],[{exception_trace}]}], + ?line 1 = erlang:trace_pattern({?MODULE,deep_1,'_'}, Prog), + ?line 1 = erlang:trace_pattern({?MODULE,deep_2,'_'}, Prog), + ?line 1 = erlang:trace_pattern({?MODULE,deep_3,'_'}, Prog), + ?line 1 = erlang:trace_pattern({?MODULE,deep_4,'_'}, Prog), + ?line 1 = erlang:trace_pattern({?MODULE,deep_5,'_'}, Prog), + ?line 1 = erlang:trace_pattern({?MODULE,id,'_'}, Prog), + ?line 1 = erlang:trace_pattern({erlang,exit,1}, Prog), + ?line 1 = erlang:trace_pattern({erlang,throw,1}, Prog), + ?line 2 = erlang:trace_pattern({erlang,error,'_'}, Prog), + ?line Q1 = {make_ref(),Prog}, + ?line T1 = + exception_nocatch(?LINE, exit, [Q1], 3, + [{trace,t1,call,{erlang,exit,[Q1]}}, + {trace,t1,exception_from,{erlang,exit,1}, + {exit,Q1}}], + exception_from, {exit,Q1}), + ?line expect({trace,T1,exit,Q1}), + ?line Q2 = {cake,14.125}, + ?line T2 = + exception_nocatch(?LINE, throw, [Q2], 2, + [{trace,t2,call,{erlang,throw,[Q2]}}, + {trace,t2,exception_from,{erlang,throw,1}, + {error,{nocatch,Q2}}}], + exception_from, {error,{nocatch,Q2}}), + ?line expect({trace,T2,exit,{{nocatch,Q2},[{erlang,throw,[Q2]}, + {?MODULE,deep_4,1}]}}), + ?line Q3 = {dump,[dump,{dump}]}, + ?line T3 = + exception_nocatch(?LINE, error, [Q3], 4, + [{trace,t3,call,{erlang,error,[Q3]}}, + {trace,t3,exception_from,{erlang,error,1}, + {error,Q3}}], + exception_from, {error,Q3}), + ?line expect({trace,T3,exit,{Q3,[{erlang,error,[Q3]}, + {?MODULE,deep_4,1}]}}), + ?line T4 = + exception_nocatch(?LINE, '=', [17,4711], 5, [], + exception_from, {error,{badmatch,4711}}), + ?line expect({trace,T4,exit,{{badmatch,4711},[{?MODULE,deep_4,1}]}}), + %% + ?line erlang:trace_pattern({?MODULE,'_','_'}, false), + ?line erlang:trace_pattern({erlang,'_','_'}, false), + ?line expect(), + ?line ok. + +exception_nocatch(Line, B, Q, N, Extra, Tag, R) -> + ?line io:format("== Subtest: ~w", [Line]), + ?line Go = make_ref(), + ?line Tracee = + spawn(fun () -> + receive + Go -> + deep_1(N, B, Q) + end + end), + ?line 1 = erlang:trace(Tracee, true, [call,return_to,procs]), + ?line Tracee ! Go, + ?line deep_expect_N(Tracee, B, Q, N-1, + [setelement(2, T, Tracee) || T <- Extra], Tag, R), + ?line Tracee. + +%% Make sure that code that uses the optimized bit syntax matching +%% can be traced without crashing the emulator. (Actually, it seems +%% that we can't trigger the bug using external call trace, but we +%% will keep the test case anyway.) + +bit_syntax(Config) when is_list(Config) -> + ?line start_tracer(), + ?line 1 = trace_func({?MODULE,bs_sum_a,'_'}, []), + ?line 1 = trace_func({?MODULE,bs_sum_b,'_'}, []), + + ?line 6 = call_bs_sum_a(<<1,2,3>>), + ?line 10 = call_bs_sum_b(<<1,2,3,4>>), + + ?line trace_func({?MODULE,'_','_'}, false), + ?line erlang:trace_delivered(all), + receive + {trace_delivered,_,_} -> ok + end, + + Self = self(), + ?line expect({trace,Self,call,{?MODULE,bs_sum_a,[<<2,3>>,1]}}), + ?line expect({trace,Self,call,{?MODULE,bs_sum_b,[1,<<2,3,4>>]}}), + + ok. + +call_bs_sum_a(<>) -> + ?MODULE:bs_sum_a(T, H). + +call_bs_sum_b(<>) -> + ?MODULE:bs_sum_b(H, T). + +bs_sum_a(<>, Acc) -> bs_sum_a(T, H+Acc); +bs_sum_a(<<>>, Acc) -> Acc. + +bs_sum_b(Acc, <>) -> bs_sum_b(H+Acc, T); +bs_sum_b(Acc, <<>>) -> Acc. + + + + +%%% Help functions. + +expect() -> + case flush() of + [] -> ok; + Msgs -> + test_server:fail({unexpected,abbr(Msgs)}) + end. + +expect({trace_ts,Pid,Type,MFA,Term,ts}=Message) -> + receive + M -> + case M of + {trace_ts,Pid,Type,MFA,Term,Ts}=MessageTs -> + ok = io:format("Expected and got ~p", [abbr(MessageTs)]), + Ts; + _ -> + io:format("Expected ~p; got ~p", [abbr(Message),abbr(M)]), + test_server:fail({unexpected,abbr([M|flush()])}) + end + after 5000 -> + io:format("Expected ~p; got nothing", [abbr(Message)]), + test_server:fail(no_trace_message) + end; +expect({trace_ts,Pid,Type,MFA,ts}=Message) -> + receive + M -> + case M of + {trace_ts,Pid,Type,MFA,Ts} -> + ok = io:format("Expected and got ~p", [abbr(M)]), + Ts; + _ -> + io:format("Expected ~p; got ~p", [abbr(Message),abbr(M)]), + test_server:fail({unexpected,abbr([M|flush()])}) + end + after 5000 -> + io:format("Expected ~p; got nothing", [abbr(Message)]), + test_server:fail(no_trace_message) + end; +expect(Validator) when is_function(Validator) -> + receive + M -> + case Validator(M) of + expected -> + ok = io:format("Expected and got ~p", [abbr(M)]); + next -> + ok = io:format("Expected and got ~p", [abbr(M)]), + expect(Validator); + {unexpected,Message} -> + io:format("Expected ~p; got ~p", [abbr(Message),abbr(M)]), + test_server:fail({unexpected,abbr([M|flush()])}) + end + after 5000 -> + io:format("Expected ~p; got nothing", [abbr(Validator('_'))]), + test_server:fail(no_trace_message) + end; +expect(Message) -> + receive + M -> + case M of + Message -> + ok = io:format("Expected and got ~p", [abbr(Message)]); + Other -> + io:format("Expected ~p; got ~p", + [abbr(Message),abbr(Other)]), + test_server:fail({unexpected,abbr([Other|flush()])}) + end + after 5000 -> + io:format("Expected ~p; got nothing", [abbr(Message)]), + test_server:fail(no_trace_message) + end. + +trace_info(What, Key) -> + get(tracer) ! {apply,self(),{erlang,trace_info,[What,Key]}}, + Res = receive + {apply_result,Result} -> Result + end, + ok = io:format("erlang:trace_info(~p, ~p) -> ~p", + [What,Key,Res]), + Res. + +trace_func(MFA, MatchSpec) -> + get(tracer) ! {apply,self(),{erlang,trace_pattern,[MFA, MatchSpec]}}, + Res = receive + {apply_result,Result} -> Result + end, + ok = io:format("trace_pattern(~p, ~p) -> ~p", [MFA,MatchSpec,Res]), + Res. + +trace_pid(Pid, On, Flags) -> + get(tracer) ! {apply,self(),{erlang,trace,[Pid,On,Flags]}}, + Res = receive + {apply_result,Result} -> Result + end, + ok = io:format("trace(~p, ~p, ~p) -> ~p", [Pid,On,Flags,Res]), + Res. + +start_tracer() -> + Self = self(), + put(tracer, spawn(fun() -> tracer(Self) end)), + get(tracer). + +start_tracer_loop() -> + Self = self(), + put(tracer, spawn(fun() -> tracer_loop(Self) end)), + get(tracer). + +tracer(RelayTo) -> + erlang:trace(RelayTo, true, [call]), + tracer_loop(RelayTo). + +tracer_loop(RelayTo) -> + receive + {apply,From,{M,F,A}} -> + From ! {apply_result,apply(M, F, A)}, + tracer_loop(RelayTo); + Msg -> + RelayTo ! Msg, + tracer_loop(RelayTo) + end. + +id(I) -> I. + +deep(N, Class, Reason) -> + try ?MODULE:deep_1(N, Class, Reason) of + Value -> {value,Value} + catch C:R -> {C,R} + end. + +deep_1(1, Class, Reason) -> + ?MODULE:deep_2(Class, Reason); +deep_1(N, Class, Reason) when is_integer(N), N > 1 -> + ?MODULE:deep_1(N-1, Class, Reason). + +deep_2(Class, Reason) -> + ?MODULE:deep_4(?MODULE:deep_3(Class, Reason)). + +deep_3(Class, Reason) -> + {Class,Reason}. + +deep_4(CR) -> + case ?MODULE:id(CR) of + {exit,[Reason]} -> + erlang:exit(Reason); + {throw,[Reason]} -> + erlang:throw(Reason); + {error,[Reason,Arglist]} -> + erlang:error(Reason, Arglist); + {error,[Reason]} -> + erlang:error(Reason); + {id,[Reason]} -> + Reason; + {reverse,[A,B]} -> + lists:reverse(A, B); + {append,[A,B]} -> + A ++ B; + {apply,[Fun,Args]} -> + erlang:apply(Fun, Args); + {apply,[M,F,Args]} -> + erlang:apply(M, F, Args); + {deep_5,[A,B]} -> + ?MODULE:deep_5(A, B); + {deep_5,[A]} -> + ?MODULE:deep_5(A); + {'=',[A,B]} -> + A = B + end. + +deep_5(A) when is_integer(A) -> + A. + +flush() -> + receive X -> + [X|flush()] + after 1000 -> + [] + end. + +%% Abbreviate large complex terms +abbr(Term) -> + abbr(Term, 20). +%% +abbr(Tuple, N) when is_tuple(Tuple) -> + abbr_tuple(Tuple, 1, N, []); +abbr(List, N) when is_list(List) -> + abbr_list(List, N, []); +abbr(Term, _) -> Term. +%% +abbr_tuple(_, _, 0, R) -> + list_to_tuple(reverse(R, ['...'])); +abbr_tuple(Tuple, J, N, R) when J =< size(Tuple) -> + M = N-1, + abbr_tuple(Tuple, J+1, M, [abbr(element(J, Tuple), M)|R]); +abbr_tuple(_, _, _, R) -> + list_to_tuple(reverse(R)). +%% +abbr_list(_, 0, R) -> + case io_lib:printable_list(R) of + true -> + reverse(R, "..."); + false -> + reverse(R, '...') + end; +abbr_list([H|T], N, R) -> + M = N-1, + abbr_list(T, M, [abbr(H, M)|R]); +abbr_list(T, _, R) -> + reverse(R, T). + +%% Lean and mean list functions + +%% Do not build garbage +seq(M, N, R) when M =< N -> + seq(M, N-1, [N|R]); +seq(_, _, R) -> R. + +%% lists:reverse can not be called since it is traced +reverse(L) -> + reverse(L, []). +%% +reverse([], R) -> R; +reverse([H|T], R) -> + reverse(T, [H|R]). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE_data/another_code_test.erl erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE_data/another_code_test.erl --- erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE_data/another_code_test.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE_data/another_code_test.erl 2009-11-20 13:32:27.000000000 +0000 @@ -0,0 +1,23 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(another_code_test). +-export([x/1]). + +x(answer) -> 42. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE_data/cpbugx.erl erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE_data/cpbugx.erl --- erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE_data/cpbugx.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE_data/cpbugx.erl 2009-11-20 13:32:45.000000000 +0000 @@ -0,0 +1,45 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(cpbugx). + +-export([before/0,before2/0,before3/0]). + +before() -> + 1 + lethal(). + +lethal() -> + 4711. + +before2() -> + {status,lethal2(self())}. + +lethal2(Pid) -> + try + is_process_alive(Pid) + catch + _ -> + error + end. + +before3() -> + atom_to_list(lethal3(self())). + +lethal3(Pid) -> + Pid ! garbage. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE_data/literals.erl erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE_data/literals.erl --- erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE_data/literals.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE_data/literals.erl 2009-11-20 13:32:30.000000000 +0000 @@ -0,0 +1,83 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(literals). +-export([a/0,b/0,huge_bignum/0]). + +a() -> + {a,42.0,[7,38877938333399637266518333334747]}. + +b() -> + [{init,get_flag,1}, + {init,get_flags,0}, + {init,get_args,0}, + {string,re_sh_to_awk,1}, + {string,re_parse,1}, + {string,re_match,2}, + {string,re_sub,3}, + {string,re_gsub,3}, + {string,re_split,2}, + {string,index,2}, + {erl_eval,seq,2}, + {erl_eval,seq,3}, + {erl_eval,arg_list,2}, + {erl_eval,arg_list,3}, + {erl_pp,seq,1}, + {erl_pp,seq,2}, + {io,scan_erl_seq,1}, + {io,scan_erl_seq,2}, + {io,scan_erl_seq,3}, + {io,parse_erl_seq,1}, + {io,parse_erl_seq,2}, + {io,parse_erl_seq,3}, + {io,parse_exprs,2}, + {io_lib,scan,1}, + {io_lib,scan,2}, + {io_lib,scan,3}, + {io_lib,reserved_word,1}, + {lists,keymap,4}, + {lists,all,3}, + {lists,any,3}, + {lists,map,3}, + {lists,flatmap,3}, + {lists,foldl,4}, + {lists,foldr,4}, + {lists,mapfoldl,4}, + {lists,mapfoldr,4}, + {lists,filter,3}, + {lists,foreach,3}, + {erlang,old_binary_to_term,1}, + {erlang,info,1}, + {file,file_info,1}, + {dict,dict_to_list,1}, + {dict,list_to_dict,1}, + {orddict,dict_to_list,1}, + {orddict,list_to_dict,1}, + {sets,new_set,0}, + {sets,set_to_list,1}, + {sets,list_to_set,1}, + {sets,subset,2}, + {ordsets,new_set,0}, + {ordsets,set_to_list,1}, + {ordsets,list_to_set,1}, + {ordsets,subset,2}, + {calendar,local_time_to_universal_time,1}]. + +huge_bignum() -> + 36#9987333333392789234879423987243987423432879423879234897423879423874328794323248423872348742323487423987423879243872347824374238792437842374283926276478623462342363243SDKJFSDLEFHDSHJFE48H3838973879JFSDKJLFASLKJVBJKLEJKLDYEIOEHFEOU39873487SFHJSLDFASUIDFHSDHFEYR0R987YDFHDHFDLKHFSIDFHSIDFSIFDHSIFHWIHR07373767667987769707660766789076874238792437842374283926276478623462342363243SDKJFSDLEFHDSHJFE48H3838973879JFSDKJLFASLKJVBJKLEJKLDYEIOEHFEOU39873487SFHJSLDFASUIDFHSDHFEYR0R987YDFHDHFDLKHFSIDFHSIDFSIFDHSIFHWIHR0737376766798779987333333392789234879423987243987423432879423879234897423879423874328794323248423872348742323487423987423879243872347824374238792437842374283926276478623462342363243SDKJFSDLEFHDSHJFE48H3838973879JFSDKJLFASLKJVBJKLEJKLDYEIOEHFEOU39873487SFHJSLDFASUIDFHSDHFEYR0R987YDFHDHFDLKHFSIDFHSIDFSIFDHSIFHWIHR07373767667987769707660766789076874238792437842374283926276478623462342363243SDKJFSDLEFHDSHJFE48H3838973879JFSDKJLFASLKJVBJKLEJKLDYEIOEHFEOU39873487SFHJSLDFASUIDFHSDHFEYR0R987YDFHDHFDLKHFSIDFHSIDFSIFDHSIFHWIHR07373767667987779JFSDKJLFASLKJVBJKLEJKLDYEIOEHFEOU39873487SFHJSLDFASUIDFHSDHFEYR0R987YDFHDHFDLKHFSIDFHSIDFSIFDHSIFHWIHR07373767667987769707660766789076874238792437842374283926276478623462342363243SDKJFSDLEFHDSHJFE48H3838973879JFSDKJLFASLKJVBJKLEJKLDYEIOEHFEOU39873487SFHJSLDFASUIDFHSDHFEYR0R987YDFHDHFDLKHFSIDFHSIDFSIFDHSIFHWIHR0737376766798779987333333392789234879423987243987423432879423879234897423879423874328794323248423872348742323487423987423879243872347824374238792437842374283926276478623462342363243SDKJFSDLEFHDSHJFE48H3838973879JFSDKJLFASLKJVBJKLEJKLDYEIOEHFEOU39873487SFHJSLDFASUIDFHSDHFEYR0R987YDFHDHFDLKHFSIDFHSIDFSIFDHSIFHWIHR07373767667987769707660766789076874238792437842374283926276478623462342363243SDKJFSDLEFHDSHJFE48H3838973879JFSDKJLFASLKJVBJKLEJKLDYEIOEHFEOU39873487SFHJSLDFASUIDFHSDHFEYR0R987YDFHDHFDLKHFSIDFHSIDFSIFDHSIFHWIHR073737676679877. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE_data/many_funs.erl erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE_data/many_funs.erl --- erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE_data/many_funs.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE_data/many_funs.erl 2009-11-20 13:32:29.000000000 +0000 @@ -0,0 +1,47 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(many_funs). + +-export([make_fun/1,many_funs/0]). + +make_fun(A) -> + fun(X) -> A + X end. + +%% Force dynamic allocation of lambda table. +many_funs() -> + [fun(_) -> 1 end, + fun(_) -> 2 end, + fun(_) -> 3 end, + fun(_) -> 4 end, + fun(_) -> 5 end, + fun(_) -> 6 end, + fun(_) -> 7 end, + fun(_) -> 8 end, + fun(_) -> 9 end, + fun(_) -> 10 end, + fun(_) -> 11 end, + fun(_) -> 12 end, + fun(_) -> 13 end, + fun(_) -> 14 end, + fun(_) -> 15 end, + fun(_) -> 16 end]. + + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE_data/my_code_test.erl erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE_data/my_code_test.erl --- erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE_data/my_code_test.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE_data/my_code_test.erl 2009-11-20 13:30:58.000000000 +0000 @@ -0,0 +1,27 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(my_code_test). + +-export([make_fun/1]). + +make_fun(A) -> + fun(X) -> A + X end. + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/code_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/code_SUITE.erl 2009-09-18 15:08:09.000000000 +0100 @@ -0,0 +1,520 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(code_SUITE). +-export([all/1, + new_binary_types/1,t_check_process_code/1,t_check_process_code_ets/1, + external_fun/1,get_chunk/1,module_md5/1,make_stub/1, + make_stub_many_funs/1,constant_pools/1, + false_dependency/1,coverage/1]). + +-include("test_server.hrl"). + +all(suite) -> + [new_binary_types,t_check_process_code,t_check_process_code_ets, + external_fun,get_chunk,module_md5,make_stub,make_stub_many_funs, + constant_pools,false_dependency,coverage]. + +new_binary_types(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "my_code_test"), + ?line {ok,my_code_test,Bin} = compile:file(File, [binary]), + ?line {module,my_code_test} = erlang:load_module(my_code_test, + make_sub_binary(Bin)), + ?line true = erlang:delete_module(my_code_test), + ?line true = erlang:purge_module(my_code_test), + + ?line {module,my_code_test} = erlang:load_module(my_code_test, + make_unaligned_sub_binary(Bin)), + ?line true = erlang:delete_module(my_code_test), + ?line true = erlang:purge_module(my_code_test), + + %% Try heap binaries and bad binaries. + ?line {error,badfile} = erlang:load_module(my_code_test, <<1,2>>), + ?line {error,badfile} = erlang:load_module(my_code_test, + make_sub_binary(<<1,2>>)), + ?line {error,badfile} = erlang:load_module(my_code_test, + make_unaligned_sub_binary(<<1,2>>)), + ?line {'EXIT',{badarg,_}} = (catch erlang:load_module(my_code_test, + bit_sized_binary(Bin))), + ok. + +t_check_process_code(doc) -> "Test check_process_code/2."; +t_check_process_code(Config) when is_list(Config) -> + case erlang:system_info(heap_type) of + private -> t_check_process_code_1(Config); + hybrid -> {skip,"Hybrid heap"} + end. + +t_check_process_code_1(Config) -> + ?line Priv = ?config(priv_dir, Config), + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "my_code_test"), + ?line Code = filename:join(Priv, "my_code_test"), + + ?line {ok,my_code_test} = c:c(File, [{outdir,Priv}]), + + ?line MyFun = fun(X, Y) -> X + Y end, %Confuse things. + ?line F = my_code_test:make_fun(42), + ?line 2 = fun_refc(F), + ?line MyFun2 = fun(X, Y) -> X * Y end, %Confuse things. + ?line 44 = F(2), + + %% Delete the module and call the fun again. + ?line true = erlang:delete_module(my_code_test), + ?line 2 = fun_refc(F), + ?line 45 = F(3), + ?line {'EXIT',{undef,_}} = (catch my_code_test:make_fun(33)), + + %% The fun should still be there, preventing purge. + ?line true = erlang:check_process_code(self(), my_code_test), + gc(), + gc(), %Place funs on the old heap. + ?line true = erlang:check_process_code(self(), my_code_test), + + %% Using the funs here guarantees that they will not be prematurely garbed. + ?line 48 = F(6), + ?line 3 = MyFun(1, 2), + ?line 12 = MyFun2(3, 4), + + %% Kill all funs. + t_check_process_code1(Code, []). + +%% The real fun was killed, but we have some fakes which look similar. + +t_check_process_code1(Code, Fakes) -> + ?line MyFun = fun(X, Y) -> X + Y + 1 end, %Confuse things. + ?line false = erlang:check_process_code(self(), my_code_test), + ?line 4 = MyFun(1, 2), + t_check_process_code2(Code, Fakes). + +t_check_process_code2(Code, _) -> + ?line false = erlang:check_process_code(self(), my_code_test), + ?line true = erlang:purge_module(my_code_test), + + %% In the next test we will load the same module twice. + ?line {module,my_code_test} = code:load_abs(Code), + ?line F = my_code_test:make_fun(37), + ?line 2 = fun_refc(F), + ?line false = erlang:check_process_code(self(), my_code_test), + ?line {module,my_code_test} = code:load_abs(Code), + ?line 2 = fun_refc(F), + + %% Still false because the fun with the same identify is found + %% in the current code. + ?line false = erlang:check_process_code(self(), my_code_test), + + %% Some fake funs in the same module should not do any difference. + ?line false = erlang:check_process_code(self(), my_code_test), + + 38 = F(1), + t_check_process_code3(Code, F, []). + +t_check_process_code3(Code, F, Fakes) -> + Pid = spawn_link(fun() -> body(F, Fakes) end), + ?line true = erlang:purge_module(my_code_test), + ?line false = erlang:check_process_code(self(), my_code_test), + ?line false = erlang:check_process_code(Pid, my_code_test), + + ?line true = erlang:delete_module(my_code_test), + ?line true = erlang:check_process_code(self(), my_code_test), + ?line true = erlang:check_process_code(Pid, my_code_test), + 39 = F(2), + t_check_process_code4(Code, Pid). + +t_check_process_code4(_Code, Pid) -> + Pid ! drop_funs, + receive after 1 -> ok end, + ?line false = erlang:check_process_code(Pid, my_code_test), + ok. + +body(F, Fakes) -> + receive + jog -> + 40 = F(3), + erlang:garbage_collect(), + body(F, Fakes); + drop_funs -> + dropped_body() + end. + +dropped_body() -> + receive + X -> exit(X) + end. + +gc() -> + erlang:garbage_collect(), + gc1(). +gc1() -> ok. + +t_check_process_code_ets(doc) -> + "Test check_process_code/2 in combination with a fun obtained from an ets table."; +t_check_process_code_ets(Config) when is_list(Config) -> + case {test_server:is_native(?MODULE),erlang:system_info(heap_type)} of + {true,_} -> + {skipped,"Native code"}; + {_,hybrid} -> + {skipped,"Hybrid heap"}; + {false,private} -> + do_check_process_code_ets(Config) + end. + +do_check_process_code_ets(Config) -> + ?line Priv = ?config(priv_dir, Config), + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "my_code_test"), + + ?line erlang:purge_module(my_code_test), + ?line erlang:delete_module(my_code_test), + ?line {ok,my_code_test} = c:c(File, [{outdir,Priv}]), + + ?line T = ets:new(my_code_test, []), + ?line ets:insert(T, {7,my_code_test:make_fun(107)}), + ?line ets:insert(T, {8,my_code_test:make_fun(108)}), + ?line erlang:delete_module(my_code_test), + ?line false = erlang:check_process_code(self(), my_code_test), + Body = fun() -> + [{7,F1}] = ets:lookup(T, 7), + [{8,F2}] = ets:lookup(T, 8), + IdleLoop = fun() -> receive _X -> ok end end, + RecLoop = fun(Again) -> + receive + call -> 110 = F1(3), + 100 = F2(-8), + Again(Again); + {drop_funs,To} -> + To ! funs_dropped, + IdleLoop() + end + end, + true = erlang:check_process_code(self(), my_code_test), + RecLoop(RecLoop) + end, + ?line Pid = spawn_link(Body), + receive after 1 -> ok end, + ?line true = erlang:check_process_code(Pid, my_code_test), + Pid ! call, + Pid ! {drop_funs,self()}, + + receive + funs_dropped -> ok; + Other -> ?t:fail({unexpected,Other}) + after 10000 -> + ?line ?t:fail(no_funs_dropped_answer) + end, + + ?line false = erlang:check_process_code(Pid, my_code_test), + ok. + +fun_refc(F) -> + {refc,Count} = erlang:fun_info(F, refc), + Count. + + +external_fun(Config) when is_list(Config) -> + ?line false = erlang:function_exported(another_code_test, x, 1), + ?line ExtFun = erlang:make_fun(id(another_code_test), x, 1), + ?line {'EXIT',{undef,_}} = (catch ExtFun(answer)), + ?line false = erlang:function_exported(another_code_test, x, 1), + ?line false = lists:member(another_code_test, erlang:loaded()), + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "another_code_test"), + ?line {ok,another_code_test,Code} = compile:file(File, [binary,report]), + ?line {module,another_code_test} = erlang:load_module(another_code_test, Code), + ?line 42 = ExtFun(answer), + ok. + +get_chunk(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "my_code_test"), + ?line {ok,my_code_test,Code} = compile:file(File, [binary]), + + %% Should work. + ?line Chunk = get_chunk_ok("Atom", Code), + ?line Chunk = get_chunk_ok("Atom", make_sub_binary(Code)), + ?line Chunk = get_chunk_ok("Atom", make_unaligned_sub_binary(Code)), + + %% Should fail. + ?line {'EXIT',{badarg,_}} = (catch code:get_chunk(bit_sized_binary(Code), "Atom")), + ?line {'EXIT',{badarg,_}} = (catch code:get_chunk(Code, "bad chunk id")), + + %% Invalid beam code or missing chunk should return 'undefined'. + ?line undefined = code:get_chunk(<<"not a beam module">>, "Atom"), + ?line undefined = code:get_chunk(Code, "XXXX"), + + ok. + +get_chunk_ok(Chunk, Code) -> + case code:get_chunk(Code, Chunk) of + Bin when is_binary(Bin) -> Bin + end. + +module_md5(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "my_code_test"), + ?line {ok,my_code_test,Code} = compile:file(File, [binary]), + + %% Should work. + ?line Chunk = module_md5_ok(Code), + ?line Chunk = module_md5_ok(make_sub_binary(Code)), + ?line Chunk = module_md5_ok(make_unaligned_sub_binary(Code)), + + %% Should fail. + ?line {'EXIT',{badarg,_}} = (catch code:module_md5(bit_sized_binary(Code))), + + %% Invalid beam code should return 'undefined'. + ?line undefined = code:module_md5(<<"not a beam module">>), + ok. + +module_md5_ok(Code) -> + case code:module_md5(Code) of + Bin when is_binary(Bin), size(Bin) =:= 16 -> Bin + end. + + +make_stub(Config) when is_list(Config) -> + %% No old code to purge if hybrid heap because of skipped test cases, + %% so we'll need a catch here. + ?line (catch erlang:purge_module(my_code_test)), + + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "my_code_test"), + ?line {ok,my_code_test,Code} = compile:file(File, [binary]), + + ?line my_code_test = code:make_stub_module(my_code_test, Code, {[],[]}), + ?line true = erlang:delete_module(my_code_test), + ?line true = erlang:purge_module(my_code_test), + + ?line my_code_test = code:make_stub_module(my_code_test, + make_unaligned_sub_binary(Code), + {[],[]}), + ?line true = erlang:delete_module(my_code_test), + ?line true = erlang:purge_module(my_code_test), + + ?line my_code_test = code:make_stub_module(my_code_test, zlib:gzip(Code), + {[],[]}), + ?line true = erlang:delete_module(my_code_test), + ?line true = erlang:purge_module(my_code_test), + + %% Should fail. + ?line {'EXIT',{badarg,_}} = + (catch code:make_stub_module(my_code_test, <<"bad">>, {[],[]})), + ?line {'EXIT',{badarg,_}} = + (catch code:make_stub_module(my_code_test, + bit_sized_binary(Code), + {[],[]})), + ok. + +make_stub_many_funs(Config) when is_list(Config) -> + %% No old code to purge if hybrid heap because of skipped test cases, + %% so we'll need a catch here. + ?line (catch erlang:purge_module(many_funs)), + + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "many_funs"), + ?line {ok,many_funs,Code} = compile:file(File, [binary]), + + ?line many_funs = code:make_stub_module(many_funs, Code, {[],[]}), + ?line true = erlang:delete_module(many_funs), + ?line true = erlang:purge_module(many_funs), + ?line many_funs = code:make_stub_module(many_funs, + make_unaligned_sub_binary(Code), + {[],[]}), + ?line true = erlang:delete_module(many_funs), + ?line true = erlang:purge_module(many_funs), + + %% Should fail. + ?line {'EXIT',{badarg,_}} = + (catch code:make_stub_module(many_funs, <<"bad">>, {[],[]})), + ?line {'EXIT',{badarg,_}} = + (catch code:make_stub_module(many_funs, + bit_sized_binary(Code), + {[],[]})), + ok. + +constant_pools(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "literals"), + ?line {ok,literals,Code} = compile:file(File, [report,binary,constant_pool]), + ?line {module,literals} = erlang:load_module(literals, + make_sub_binary(Code)), + + %% Initialize. + ?line A = literals:a(), + ?line B = literals:b(), + ?line C = literals:huge_bignum(), + ?line process_flag(trap_exit, true), + Self = self(), + + %% Have a process WITHOUT old heap that references the literals + %% in the 'literals' module. + ?line NoOldHeap = spawn_link(fun() -> no_old_heap(Self) end), + receive go -> ok end, + ?line true = erlang:delete_module(literals), + ?line false = erlang:check_process_code(NoOldHeap, literals), + ?line erlang:check_process_code(self(), literals), + ?line true = erlang:purge_module(literals), + ?line NoOldHeap ! done, + ?line receive + {'EXIT',NoOldHeap,{A,B,C}} -> + ok; + Other -> + ?line ?t:fail({unexpected,Other}) + end, + ?line {module,literals} = erlang:load_module(literals, Code), + + %% Have a process WITH an old heap that references the literals + %% in the 'literals' module. + ?line OldHeap = spawn_link(fun() -> old_heap(Self) end), + receive go -> ok end, + ?line true = erlang:delete_module(literals), + ?line false = erlang:check_process_code(OldHeap, literals), + ?line erlang:check_process_code(self(), literals), + ?line erlang:purge_module(literals), + ?line OldHeap ! done, + receive + {'EXIT',OldHeap,{A,B,C,[1,2,3|_]=Seq}} when length(Seq) =:= 16 -> + ok + end. + +no_old_heap(Parent) -> + A = literals:a(), + B = literals:b(), + Res = {A,B,literals:huge_bignum()}, + Parent ! go, + receive + done -> + exit(Res) + end. + +old_heap(Parent) -> + A = literals:a(), + B = literals:b(), + Res = {A,B,literals:huge_bignum(),lists:seq(1, 16)}, + create_old_heap(), + Parent ! go, + receive + done -> + exit(Res) + end. + +create_old_heap() -> + case process_info(self(), [heap_size,total_heap_size]) of + [{heap_size,Sz},{total_heap_size,Total}] when Sz < Total -> + ok; + _ -> + create_old_heap() + end. + +%% OTP-7559: c_p->cp could contain garbage and create a false dependency +%% to a module in a process. (Thanks to Richard Carlsson.) +false_dependency(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "cpbugx"), + ?line {ok,cpbugx,Code} = compile:file(File, [binary,report]), + + do_false_dependency(fun cpbugx:before/0, Code), + do_false_dependency(fun cpbugx:before2/0, Code), + do_false_dependency(fun cpbugx:before3/0, Code), + +%% %% Spawn process. Make sure it has called cpbugx:before/0 and returned. +%% Parent = self(), +%% ?line Pid = spawn_link(fun() -> false_dependency_loop(Parent) end), +%% ?line receive initialized -> ok end, + +%% %% Reload the module. Make sure the process is still alive. +%% ?line {module,cpbugx} = erlang:load_module(cpbugx, Bin), +%% ?line io:put_chars(binary_to_list(element(2, process_info(Pid, backtrace)))), +%% ?line true = is_process_alive(Pid), + +%% %% There should not be any dependency to cpbugx. +%% ?line false = erlang:check_process_code(Pid, cpbugx), + + + + +%% %% Kill the process. +%% ?line unlink(Pid), exit(Pid, kill), + ok. + +do_false_dependency(Init, Code) -> + ?line {module,cpbugx} = erlang:load_module(cpbugx, Code), + + %% Spawn process. Make sure it has the appropriate init function + %% and returned. CP should not contain garbage after the return. + Parent = self(), + ?line Pid = spawn_link(fun() -> false_dependency_loop(Parent, Init) end), + ?line receive initialized -> ok end, + + %% Reload the module. Make sure the process is still alive. + ?line {module,cpbugx} = erlang:load_module(cpbugx, Code), + ?line io:put_chars(binary_to_list(element(2, process_info(Pid, backtrace)))), + ?line true = is_process_alive(Pid), + + %% There should not be any dependency to cpbugx. + ?line false = erlang:check_process_code(Pid, cpbugx), + + %% Kill the process and completely unload the code. + ?line unlink(Pid), exit(Pid, kill), + ?line true = erlang:purge_module(cpbugx), + ?line true = erlang:delete_module(cpbugx), + ?line true = erlang:purge_module(cpbugx), + ok. + +false_dependency_loop(Parent, Init) -> + Init(), + Parent ! initialized, + receive + _ -> false_dependency_loop(Parent, Init) + end. + +coverage(Config) when is_list(Config) -> + ?line code:is_module_native(?MODULE), + ?line {'EXIT',{badarg,_}} = (catch erlang:purge_module({a,b,c})), + ?line {'EXIT',{badarg,_}} = (catch code:is_module_native({a,b,c})), + ?line {'EXIT',{badarg,_}} = (catch erlang:check_process_code(not_a_pid, ?MODULE)), + ?line {'EXIT',{badarg,_}} = (catch erlang:check_process_code(self(), [not_a_module])), + ?line {'EXIT',{badarg,_}} = (catch erlang:delete_module([a,b,c])), + ?line {'EXIT',{badarg,_}} = (catch erlang:module_loaded(42)), + ok. + +%% Utilities. + +make_sub_binary(Bin) when is_binary(Bin) -> + {_,B1} = split_binary(list_to_binary([0,1,3,Bin,4,5,6,7]), 3), + {B,_} = split_binary(B1, size(Bin)), + B; +make_sub_binary(List) -> + make_sub_binary(list_to_binary(List)). + +make_unaligned_sub_binary(Bin0) -> + Bin1 = <<0:3,Bin0/binary,31:5>>, + Sz = size(Bin0), + <<0:3,Bin:Sz/binary,31:5>> = id(Bin1), + Bin. + +%% Add 1 bit to the size of the binary. +bit_sized_binary(Bin0) -> + Bin = <>, + BitSize = bit_size(Bin), + BitSize = 8*size(Bin) + 1, + Bin. + +id(I) -> I. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/crypto_reference.erl erlang-13.b.3-dfsg/erts/emulator/test/crypto_reference.erl --- erlang-13.b.1-dfsg/erts/emulator/test/crypto_reference.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/crypto_reference.erl 2009-09-18 15:09:25.000000000 +0100 @@ -0,0 +1,856 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% +%% Reference implementations of crc32, adler32 and md5 in erlang. Used +%% by crypto_SUITE. +%% + +-module(crypto_reference). + +-export([adler32/1, crc32/1, md5_init/0, md5_update/2, md5_final/1]). +-export([crc32_table/0, reflect8_table/0]). + +-define(BASE, 65521). +-define(NMAX, 5552). + +-define(AINIT,<<0,0,0,1>>). + +adler32(Bin) when is_binary(Bin) -> + B2 = adler32(Bin,0,1), + <> = B2, + Sum; + +adler32(IoList) -> + adler32(erlang:iolist_to_binary(IoList)). + +adler32(<<>>,B,A) -> + <>; + +adler32(<>,B,A) -> + NewA = (A+CH) rem ?BASE, + NewB = (B+NewA) rem ?BASE, + adler32(T,NewB,NewA). + +-define(FINAL_XOR_VALUE,16#FFFFFFFF). +-define(INITIAL_REMAINDER,16#FFFFFFFF). + +reflect_bin(<<>>,Res) -> + Res; +reflect_bin(<>,BS) -> + reflect_bin(Rest,<>). +reflect(Data,8) -> + reflect8(Data); +reflect(Data,32) -> + <> = <>, + ND = reflect8(D), + NC = reflect8(C), + NB = reflect8(B), + NA = reflect8(A), + <> = <>, + Result; +reflect(Data,Size) -> + <> = reflect_bin(<>,<<>>), + NewData. +crc32(<<>>,Remainder) -> + reflect(Remainder,32) bxor ?FINAL_XOR_VALUE; +crc32(<>,Remainder) -> + Data = reflect(CH,8) bxor (Remainder bsr 24), + NewRem = crcTab32(Data) bxor ((Remainder bsl 8) band 16#FFFFFFFF), +% io:format("CH = ~p (~p)~n",[CH,reflect(CH,8)]), +% io:format("No reflect = ~p~n",[(CH bxor (Remainder bsr 24))]), +% io:format("Data = ~p, NewRem = ~p~n",[Data,NewRem]), + crc32(T,NewRem). + +crc32(Bin) when is_binary(Bin) -> + crc32(Bin,?INITIAL_REMAINDER); +crc32(L) -> + crc32(erlang:iolist_to_binary(L)). + +bitmod2(0,Remainder,_Topbit,_Polynomial,_Mask) -> + %io:format("~p ",[Remainder]), + Remainder; +bitmod2(N,Remainder,Topbit,Polynomial,Mask) -> + %io:format("~p ",[Remainder]), + case (Remainder band Topbit) of + 0 -> + bitmod2(N-1,(Remainder bsl 1) band Mask,Topbit,Polynomial,Mask); + _ -> + bitmod2(N-1,((Remainder bsl 1) bxor Polynomial) band Mask,Topbit,Polynomial,Mask) + end. + +mask(CrcSize) -> + 16#FFFFFFFF bsr (32 - CrcSize). + +calc_crc_table(256,_CrcSize,_Polynomial) -> + ok; +calc_crc_table(Dividend,CrcSize,Polynomial) -> + Mask = mask(CrcSize), + Remainder = (Dividend bsl (CrcSize - 8)) band Mask, + TopBit = 1 bsl (CrcSize - 1), + Rem2 = bitmod2(8,Remainder,TopBit,Polynomial,Mask), + io:format("crcTab~p(~p) -> ~p;~n",[CrcSize,Dividend,Rem2]), + calc_crc_table(Dividend+1,CrcSize,Polynomial). + +crc32_table() -> + calc_crc_table(0,32,16#04C11DB7). + +reflect8_table(256) -> + ok; +reflect8_table(N) -> + X = reflect(N,8), + io:format("reflect8(~p) -> ~p;~n",[N,X]), + reflect8_table(N+1). +reflect8_table() -> + reflect8_table(0). + +%CRC32 table calculated with crc32_table above +crcTab32(0) -> 0; +crcTab32(1) -> 79764919; +crcTab32(2) -> 159529838; +crcTab32(3) -> 222504665; +crcTab32(4) -> 319059676; +crcTab32(5) -> 398814059; +crcTab32(6) -> 445009330; +crcTab32(7) -> 507990021; +crcTab32(8) -> 638119352; +crcTab32(9) -> 583659535; +crcTab32(10) -> 797628118; +crcTab32(11) -> 726387553; +crcTab32(12) -> 890018660; +crcTab32(13) -> 835552979; +crcTab32(14) -> 1015980042; +crcTab32(15) -> 944750013; +crcTab32(16) -> 1276238704; +crcTab32(17) -> 1221641927; +crcTab32(18) -> 1167319070; +crcTab32(19) -> 1095957929; +crcTab32(20) -> 1595256236; +crcTab32(21) -> 1540665371; +crcTab32(22) -> 1452775106; +crcTab32(23) -> 1381403509; +crcTab32(24) -> 1780037320; +crcTab32(25) -> 1859660671; +crcTab32(26) -> 1671105958; +crcTab32(27) -> 1733955601; +crcTab32(28) -> 2031960084; +crcTab32(29) -> 2111593891; +crcTab32(30) -> 1889500026; +crcTab32(31) -> 1952343757; +crcTab32(32) -> 2552477408; +crcTab32(33) -> 2632100695; +crcTab32(34) -> 2443283854; +crcTab32(35) -> 2506133561; +crcTab32(36) -> 2334638140; +crcTab32(37) -> 2414271883; +crcTab32(38) -> 2191915858; +crcTab32(39) -> 2254759653; +crcTab32(40) -> 3190512472; +crcTab32(41) -> 3135915759; +crcTab32(42) -> 3081330742; +crcTab32(43) -> 3009969537; +crcTab32(44) -> 2905550212; +crcTab32(45) -> 2850959411; +crcTab32(46) -> 2762807018; +crcTab32(47) -> 2691435357; +crcTab32(48) -> 3560074640; +crcTab32(49) -> 3505614887; +crcTab32(50) -> 3719321342; +crcTab32(51) -> 3648080713; +crcTab32(52) -> 3342211916; +crcTab32(53) -> 3287746299; +crcTab32(54) -> 3467911202; +crcTab32(55) -> 3396681109; +crcTab32(56) -> 4063920168; +crcTab32(57) -> 4143685023; +crcTab32(58) -> 4223187782; +crcTab32(59) -> 4286162673; +crcTab32(60) -> 3779000052; +crcTab32(61) -> 3858754371; +crcTab32(62) -> 3904687514; +crcTab32(63) -> 3967668269; +crcTab32(64) -> 881225847; +crcTab32(65) -> 809987520; +crcTab32(66) -> 1023691545; +crcTab32(67) -> 969234094; +crcTab32(68) -> 662832811; +crcTab32(69) -> 591600412; +crcTab32(70) -> 771767749; +crcTab32(71) -> 717299826; +crcTab32(72) -> 311336399; +crcTab32(73) -> 374308984; +crcTab32(74) -> 453813921; +crcTab32(75) -> 533576470; +crcTab32(76) -> 25881363; +crcTab32(77) -> 88864420; +crcTab32(78) -> 134795389; +crcTab32(79) -> 214552010; +crcTab32(80) -> 2023205639; +crcTab32(81) -> 2086057648; +crcTab32(82) -> 1897238633; +crcTab32(83) -> 1976864222; +crcTab32(84) -> 1804852699; +crcTab32(85) -> 1867694188; +crcTab32(86) -> 1645340341; +crcTab32(87) -> 1724971778; +crcTab32(88) -> 1587496639; +crcTab32(89) -> 1516133128; +crcTab32(90) -> 1461550545; +crcTab32(91) -> 1406951526; +crcTab32(92) -> 1302016099; +crcTab32(93) -> 1230646740; +crcTab32(94) -> 1142491917; +crcTab32(95) -> 1087903418; +crcTab32(96) -> 2896545431; +crcTab32(97) -> 2825181984; +crcTab32(98) -> 2770861561; +crcTab32(99) -> 2716262478; +crcTab32(100) -> 3215044683; +crcTab32(101) -> 3143675388; +crcTab32(102) -> 3055782693; +crcTab32(103) -> 3001194130; +crcTab32(104) -> 2326604591; +crcTab32(105) -> 2389456536; +crcTab32(106) -> 2200899649; +crcTab32(107) -> 2280525302; +crcTab32(108) -> 2578013683; +crcTab32(109) -> 2640855108; +crcTab32(110) -> 2418763421; +crcTab32(111) -> 2498394922; +crcTab32(112) -> 3769900519; +crcTab32(113) -> 3832873040; +crcTab32(114) -> 3912640137; +crcTab32(115) -> 3992402750; +crcTab32(116) -> 4088425275; +crcTab32(117) -> 4151408268; +crcTab32(118) -> 4197601365; +crcTab32(119) -> 4277358050; +crcTab32(120) -> 3334271071; +crcTab32(121) -> 3263032808; +crcTab32(122) -> 3476998961; +crcTab32(123) -> 3422541446; +crcTab32(124) -> 3585640067; +crcTab32(125) -> 3514407732; +crcTab32(126) -> 3694837229; +crcTab32(127) -> 3640369242; +crcTab32(128) -> 1762451694; +crcTab32(129) -> 1842216281; +crcTab32(130) -> 1619975040; +crcTab32(131) -> 1682949687; +crcTab32(132) -> 2047383090; +crcTab32(133) -> 2127137669; +crcTab32(134) -> 1938468188; +crcTab32(135) -> 2001449195; +crcTab32(136) -> 1325665622; +crcTab32(137) -> 1271206113; +crcTab32(138) -> 1183200824; +crcTab32(139) -> 1111960463; +crcTab32(140) -> 1543535498; +crcTab32(141) -> 1489069629; +crcTab32(142) -> 1434599652; +crcTab32(143) -> 1363369299; +crcTab32(144) -> 622672798; +crcTab32(145) -> 568075817; +crcTab32(146) -> 748617968; +crcTab32(147) -> 677256519; +crcTab32(148) -> 907627842; +crcTab32(149) -> 853037301; +crcTab32(150) -> 1067152940; +crcTab32(151) -> 995781531; +crcTab32(152) -> 51762726; +crcTab32(153) -> 131386257; +crcTab32(154) -> 177728840; +crcTab32(155) -> 240578815; +crcTab32(156) -> 269590778; +crcTab32(157) -> 349224269; +crcTab32(158) -> 429104020; +crcTab32(159) -> 491947555; +crcTab32(160) -> 4046411278; +crcTab32(161) -> 4126034873; +crcTab32(162) -> 4172115296; +crcTab32(163) -> 4234965207; +crcTab32(164) -> 3794477266; +crcTab32(165) -> 3874110821; +crcTab32(166) -> 3953728444; +crcTab32(167) -> 4016571915; +crcTab32(168) -> 3609705398; +crcTab32(169) -> 3555108353; +crcTab32(170) -> 3735388376; +crcTab32(171) -> 3664026991; +crcTab32(172) -> 3290680682; +crcTab32(173) -> 3236090077; +crcTab32(174) -> 3449943556; +crcTab32(175) -> 3378572211; +crcTab32(176) -> 3174993278; +crcTab32(177) -> 3120533705; +crcTab32(178) -> 3032266256; +crcTab32(179) -> 2961025959; +crcTab32(180) -> 2923101090; +crcTab32(181) -> 2868635157; +crcTab32(182) -> 2813903052; +crcTab32(183) -> 2742672763; +crcTab32(184) -> 2604032198; +crcTab32(185) -> 2683796849; +crcTab32(186) -> 2461293480; +crcTab32(187) -> 2524268063; +crcTab32(188) -> 2284983834; +crcTab32(189) -> 2364738477; +crcTab32(190) -> 2175806836; +crcTab32(191) -> 2238787779; +crcTab32(192) -> 1569362073; +crcTab32(193) -> 1498123566; +crcTab32(194) -> 1409854455; +crcTab32(195) -> 1355396672; +crcTab32(196) -> 1317987909; +crcTab32(197) -> 1246755826; +crcTab32(198) -> 1192025387; +crcTab32(199) -> 1137557660; +crcTab32(200) -> 2072149281; +crcTab32(201) -> 2135122070; +crcTab32(202) -> 1912620623; +crcTab32(203) -> 1992383480; +crcTab32(204) -> 1753615357; +crcTab32(205) -> 1816598090; +crcTab32(206) -> 1627664531; +crcTab32(207) -> 1707420964; +crcTab32(208) -> 295390185; +crcTab32(209) -> 358241886; +crcTab32(210) -> 404320391; +crcTab32(211) -> 483945776; +crcTab32(212) -> 43990325; +crcTab32(213) -> 106832002; +crcTab32(214) -> 186451547; +crcTab32(215) -> 266083308; +crcTab32(216) -> 932423249; +crcTab32(217) -> 861060070; +crcTab32(218) -> 1041341759; +crcTab32(219) -> 986742920; +crcTab32(220) -> 613929101; +crcTab32(221) -> 542559546; +crcTab32(222) -> 756411363; +crcTab32(223) -> 701822548; +crcTab32(224) -> 3316196985; +crcTab32(225) -> 3244833742; +crcTab32(226) -> 3425377559; +crcTab32(227) -> 3370778784; +crcTab32(228) -> 3601682597; +crcTab32(229) -> 3530312978; +crcTab32(230) -> 3744426955; +crcTab32(231) -> 3689838204; +crcTab32(232) -> 3819031489; +crcTab32(233) -> 3881883254; +crcTab32(234) -> 3928223919; +crcTab32(235) -> 4007849240; +crcTab32(236) -> 4037393693; +crcTab32(237) -> 4100235434; +crcTab32(238) -> 4180117107; +crcTab32(239) -> 4259748804; +crcTab32(240) -> 2310601993; +crcTab32(241) -> 2373574846; +crcTab32(242) -> 2151335527; +crcTab32(243) -> 2231098320; +crcTab32(244) -> 2596047829; +crcTab32(245) -> 2659030626; +crcTab32(246) -> 2470359227; +crcTab32(247) -> 2550115596; +crcTab32(248) -> 2947551409; +crcTab32(249) -> 2876312838; +crcTab32(250) -> 2788305887; +crcTab32(251) -> 2733848168; +crcTab32(252) -> 3165939309; +crcTab32(253) -> 3094707162; +crcTab32(254) -> 3040238851; +crcTab32(255) -> 2985771188; +crcTab32(_) -> exit(not_a_byte). + +%% +%% Reflect8 table generated with code above crcTab32 +%% + +reflect8(0) -> 0; +reflect8(1) -> 128; +reflect8(2) -> 64; +reflect8(3) -> 192; +reflect8(4) -> 32; +reflect8(5) -> 160; +reflect8(6) -> 96; +reflect8(7) -> 224; +reflect8(8) -> 16; +reflect8(9) -> 144; +reflect8(10) -> 80; +reflect8(11) -> 208; +reflect8(12) -> 48; +reflect8(13) -> 176; +reflect8(14) -> 112; +reflect8(15) -> 240; +reflect8(16) -> 8; +reflect8(17) -> 136; +reflect8(18) -> 72; +reflect8(19) -> 200; +reflect8(20) -> 40; +reflect8(21) -> 168; +reflect8(22) -> 104; +reflect8(23) -> 232; +reflect8(24) -> 24; +reflect8(25) -> 152; +reflect8(26) -> 88; +reflect8(27) -> 216; +reflect8(28) -> 56; +reflect8(29) -> 184; +reflect8(30) -> 120; +reflect8(31) -> 248; +reflect8(32) -> 4; +reflect8(33) -> 132; +reflect8(34) -> 68; +reflect8(35) -> 196; +reflect8(36) -> 36; +reflect8(37) -> 164; +reflect8(38) -> 100; +reflect8(39) -> 228; +reflect8(40) -> 20; +reflect8(41) -> 148; +reflect8(42) -> 84; +reflect8(43) -> 212; +reflect8(44) -> 52; +reflect8(45) -> 180; +reflect8(46) -> 116; +reflect8(47) -> 244; +reflect8(48) -> 12; +reflect8(49) -> 140; +reflect8(50) -> 76; +reflect8(51) -> 204; +reflect8(52) -> 44; +reflect8(53) -> 172; +reflect8(54) -> 108; +reflect8(55) -> 236; +reflect8(56) -> 28; +reflect8(57) -> 156; +reflect8(58) -> 92; +reflect8(59) -> 220; +reflect8(60) -> 60; +reflect8(61) -> 188; +reflect8(62) -> 124; +reflect8(63) -> 252; +reflect8(64) -> 2; +reflect8(65) -> 130; +reflect8(66) -> 66; +reflect8(67) -> 194; +reflect8(68) -> 34; +reflect8(69) -> 162; +reflect8(70) -> 98; +reflect8(71) -> 226; +reflect8(72) -> 18; +reflect8(73) -> 146; +reflect8(74) -> 82; +reflect8(75) -> 210; +reflect8(76) -> 50; +reflect8(77) -> 178; +reflect8(78) -> 114; +reflect8(79) -> 242; +reflect8(80) -> 10; +reflect8(81) -> 138; +reflect8(82) -> 74; +reflect8(83) -> 202; +reflect8(84) -> 42; +reflect8(85) -> 170; +reflect8(86) -> 106; +reflect8(87) -> 234; +reflect8(88) -> 26; +reflect8(89) -> 154; +reflect8(90) -> 90; +reflect8(91) -> 218; +reflect8(92) -> 58; +reflect8(93) -> 186; +reflect8(94) -> 122; +reflect8(95) -> 250; +reflect8(96) -> 6; +reflect8(97) -> 134; +reflect8(98) -> 70; +reflect8(99) -> 198; +reflect8(100) -> 38; +reflect8(101) -> 166; +reflect8(102) -> 102; +reflect8(103) -> 230; +reflect8(104) -> 22; +reflect8(105) -> 150; +reflect8(106) -> 86; +reflect8(107) -> 214; +reflect8(108) -> 54; +reflect8(109) -> 182; +reflect8(110) -> 118; +reflect8(111) -> 246; +reflect8(112) -> 14; +reflect8(113) -> 142; +reflect8(114) -> 78; +reflect8(115) -> 206; +reflect8(116) -> 46; +reflect8(117) -> 174; +reflect8(118) -> 110; +reflect8(119) -> 238; +reflect8(120) -> 30; +reflect8(121) -> 158; +reflect8(122) -> 94; +reflect8(123) -> 222; +reflect8(124) -> 62; +reflect8(125) -> 190; +reflect8(126) -> 126; +reflect8(127) -> 254; +reflect8(128) -> 1; +reflect8(129) -> 129; +reflect8(130) -> 65; +reflect8(131) -> 193; +reflect8(132) -> 33; +reflect8(133) -> 161; +reflect8(134) -> 97; +reflect8(135) -> 225; +reflect8(136) -> 17; +reflect8(137) -> 145; +reflect8(138) -> 81; +reflect8(139) -> 209; +reflect8(140) -> 49; +reflect8(141) -> 177; +reflect8(142) -> 113; +reflect8(143) -> 241; +reflect8(144) -> 9; +reflect8(145) -> 137; +reflect8(146) -> 73; +reflect8(147) -> 201; +reflect8(148) -> 41; +reflect8(149) -> 169; +reflect8(150) -> 105; +reflect8(151) -> 233; +reflect8(152) -> 25; +reflect8(153) -> 153; +reflect8(154) -> 89; +reflect8(155) -> 217; +reflect8(156) -> 57; +reflect8(157) -> 185; +reflect8(158) -> 121; +reflect8(159) -> 249; +reflect8(160) -> 5; +reflect8(161) -> 133; +reflect8(162) -> 69; +reflect8(163) -> 197; +reflect8(164) -> 37; +reflect8(165) -> 165; +reflect8(166) -> 101; +reflect8(167) -> 229; +reflect8(168) -> 21; +reflect8(169) -> 149; +reflect8(170) -> 85; +reflect8(171) -> 213; +reflect8(172) -> 53; +reflect8(173) -> 181; +reflect8(174) -> 117; +reflect8(175) -> 245; +reflect8(176) -> 13; +reflect8(177) -> 141; +reflect8(178) -> 77; +reflect8(179) -> 205; +reflect8(180) -> 45; +reflect8(181) -> 173; +reflect8(182) -> 109; +reflect8(183) -> 237; +reflect8(184) -> 29; +reflect8(185) -> 157; +reflect8(186) -> 93; +reflect8(187) -> 221; +reflect8(188) -> 61; +reflect8(189) -> 189; +reflect8(190) -> 125; +reflect8(191) -> 253; +reflect8(192) -> 3; +reflect8(193) -> 131; +reflect8(194) -> 67; +reflect8(195) -> 195; +reflect8(196) -> 35; +reflect8(197) -> 163; +reflect8(198) -> 99; +reflect8(199) -> 227; +reflect8(200) -> 19; +reflect8(201) -> 147; +reflect8(202) -> 83; +reflect8(203) -> 211; +reflect8(204) -> 51; +reflect8(205) -> 179; +reflect8(206) -> 115; +reflect8(207) -> 243; +reflect8(208) -> 11; +reflect8(209) -> 139; +reflect8(210) -> 75; +reflect8(211) -> 203; +reflect8(212) -> 43; +reflect8(213) -> 171; +reflect8(214) -> 107; +reflect8(215) -> 235; +reflect8(216) -> 27; +reflect8(217) -> 155; +reflect8(218) -> 91; +reflect8(219) -> 219; +reflect8(220) -> 59; +reflect8(221) -> 187; +reflect8(222) -> 123; +reflect8(223) -> 251; +reflect8(224) -> 7; +reflect8(225) -> 135; +reflect8(226) -> 71; +reflect8(227) -> 199; +reflect8(228) -> 39; +reflect8(229) -> 167; +reflect8(230) -> 103; +reflect8(231) -> 231; +reflect8(232) -> 23; +reflect8(233) -> 151; +reflect8(234) -> 87; +reflect8(235) -> 215; +reflect8(236) -> 55; +reflect8(237) -> 183; +reflect8(238) -> 119; +reflect8(239) -> 247; +reflect8(240) -> 15; +reflect8(241) -> 143; +reflect8(242) -> 79; +reflect8(243) -> 207; +reflect8(244) -> 47; +reflect8(245) -> 175; +reflect8(246) -> 111; +reflect8(247) -> 239; +reflect8(248) -> 31; +reflect8(249) -> 159; +reflect8(250) -> 95; +reflect8(251) -> 223; +reflect8(252) -> 63; +reflect8(253) -> 191; +reflect8(254) -> 127; +reflect8(255) -> 255; +reflect8(_) -> exit(not_a_byte). + +%%% +%%% Old MD5 implementation by Tony, modified to fit testing +%%% + +-record(md5_ctx, + { + state = { 16#67452301, 16#efcdab89, 16#98badcfe, 16#10325476 }, + count = 0, %% number of bits (64 bit) + buffer = <<>> %% input buffer (16 bytes) + }). + +-define(S11, 7). +-define(S12, 12). +-define(S13, 17). +-define(S14, 22). +-define(S21, 5). +-define(S22, 9). +-define(S23, 14). +-define(S24, 20). +-define(S31, 4). +-define(S32, 11). +-define(S33, 16). +-define(S34, 23). +-define(S41, 6). +-define(S42, 10). +-define(S43, 15). +-define(S44, 21). + +%% F, G, H and I are basic MD5 functions. + +-define(F(X, Y, Z), (((X) band (Y)) bor ((bnot (X)) band (Z)))). +-define(G(X, Y, Z), (((X) band (Z)) bor ((Y) band (bnot (Z))))). +-define(H(X, Y, Z), ((X) bxor (Y) bxor (Z))). +-define(I(X, Y, Z), ((Y) bxor ((X) bor (bnot (Z))))). + +-define(U32(X), ((X) band 16#ffffffff)). + +-define(ROTATE_LEFT(X,N), rotate_left(X,N)). + +%% FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +%% Rotation is separate from addition to prevent recomputation. +%% +-define(FF(A, B, C, D, X, S, AC), + ?ROTATE_LEFT(A + ?F((B), (C), (D)) + (X) + (AC),(S)) + (B)). + +-define(GG(A, B, C, D, X, S, AC), + ?ROTATE_LEFT(A + ?G((B), (C), (D)) + (X) + (AC),(S)) + (B)). + +-define( HH(A, B, C, D, X, S, AC), + ?ROTATE_LEFT(A + ?H((B), (C), (D)) + (X) + (AC),(S)) + (B)). + +-define(II(A, B, C, D, X, S, AC), + ?ROTATE_LEFT(A + ?I((B), (C), (D)) + (X) + (AC),(S)) + (B)). + +md5_init() -> + #md5_ctx {}. + +md5_update(CTX, Input) when is_list(Input) -> + md5_update(CTX,iolist_to_binary(Input)); +md5_update(CTX, Input) when is_binary(Input) -> + Buffer = CTX#md5_ctx.buffer, + LenI = size(Input), + Len = LenI + size(Buffer), + md5_update(<>, Len,CTX#md5_ctx.state, + CTX#md5_ctx.count+(LenI bsl 3)). + +%% +%% update state, count reflects number of bytes +%% including bytes in buffer +%% +md5_update(Buf0, Len0, State0, Count) when Len0 >= 64 -> + {Xs,Buf1} = decode(Buf0, 64), + State1 = transform(State0, Xs), + md5_update(Buf1, Len0 - 64, State1, Count); +md5_update(Buf0, _Len0, State0, Count) -> + #md5_ctx { state = State0, count = Count, buffer = Buf0 }. + +%% produce a digest +md5_final(CTX) -> + %% pad out to a length 56 (we later add a count that makes 64) + Count = CTX#md5_ctx.count, %% number of bits + Index = (Count bsr 3) rem 64, %% number of bytes + PadLen = if Index < 56 -> + 56 - Index; + true -> 120 - Index + end, + CTX1 = md5_update(CTX, list_to_binary(padding(PadLen,[]))), + CTX2 = md5_update(CTX1, list_to_binary(encode([?U32(Count), ?U32(Count bsr 32)]))), + list_to_binary(encode(tuple_to_list(CTX2#md5_ctx.state))). + +%% generate padding info to final +padding(0,Acc) -> Acc; +padding(1,Acc) -> [16#80 | Acc]; +padding(N,Acc) -> padding(N-1, [0 | Acc]). + +%% rotate X as 32-bit unsigned left N bits +rotate_left(X, N) -> + ?U32(X bsl N) bor (?U32(X) bsr (32 - N)). + +%% +%% decodes Len number of bytes into 32 bit integers +%% returns {Xs, Tail} +%% +decode(Buf, Len) -> + decode(Buf, Len, []). + +decode(Buf, 0, Acc) -> + {lists:reverse(Acc), Buf}; +decode(<>, N, Acc) -> + decode(Buf, N-4, [ A | Acc]). + +%% +%% Encodes input 32-bit ints into byte buffer output. +%% +encode(Xs) -> encode(Xs, []). + +encode([X | Xs], Acc) -> + encode(Xs, [(X bsr 24) band 16#ff, + (X bsr 16) band 16#ff, + (X bsr 8) band 16#ff, + X band 16#ff | Acc]); +encode([], Acc) -> lists:reverse(Acc). + + +transform({A0,B0,C0,D0}, Xs) -> + [X0,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15] = Xs, + + %% Round 1 + A1 = ?FF (A0, B0, C0, D0, X0, ?S11, 16#d76aa478), + D1 = ?FF (D0, A1, B0, C0, X1, ?S12, 16#e8c7b756), + C1 = ?FF (C0, D1, A1, B0, X2, ?S13, 16#242070db), + B1 = ?FF (B0, C1, D1, A1, X3, ?S14, 16#c1bdceee), + + A2 = ?FF (A1, B1, C1, D1, X4, ?S11, 16#f57c0faf), + D2 = ?FF (D1, A2, B1, C1, X5, ?S12, 16#4787c62a), + C2 = ?FF (C1, D2, A2, B1, X6, ?S13, 16#a8304613), + B2 = ?FF (B1, C2, D2, A2, X7, ?S14, 16#fd469501), + + A3 = ?FF (A2, B2, C2, D2, X8, ?S11, 16#698098d8), + D3 = ?FF (D2, A3, B2, C2, X9, ?S12, 16#8b44f7af), + C3 = ?FF (C2, D3, A3, B2, X10, ?S13, 16#ffff5bb1), + B3 = ?FF (B2, C3, D3, A3, X11, ?S14, 16#895cd7be), + + A4 = ?FF (A3, B3, C3, D3, X12, ?S11, 16#6b901122), + D4 = ?FF (D3, A4, B3, C3, X13, ?S12, 16#fd987193), + C4 = ?FF (C3, D4, A4, B3, X14, ?S13, 16#a679438e), + B4 = ?FF (B3, C4, D4, A4, X15, ?S14, 16#49b40821), + + %% Round 2 + A5 = ?GG (A4, B4, C4, D4, X1, ?S21, 16#f61e2562), + D5 = ?GG (D4, A5, B4, C4, X6, ?S22, 16#c040b340), + C5 = ?GG (C4, D5, A5, B4, X11, ?S23, 16#265e5a51), + B5 = ?GG (B4, C5, D5, A5, X0, ?S24, 16#e9b6c7aa), + + A6 = ?GG (A5, B5, C5, D5, X5, ?S21, 16#d62f105d), + D6 = ?GG (D5, A6, B5, C5, X10, ?S22, 16#2441453), + C6 = ?GG (C5, D6, A6, B5, X15, ?S23, 16#d8a1e681), + B6 = ?GG (B5, C6, D6, A6, X4, ?S24, 16#e7d3fbc8), + + A7 = ?GG (A6, B6, C6, D6, X9, ?S21, 16#21e1cde6), + D7 = ?GG (D6, A7, B6, C6, X14, ?S22, 16#c33707d6), + C7 = ?GG (C6, D7, A7, B6, X3, ?S23, 16#f4d50d87), + B7 = ?GG (B6, C7, D7, A7, X8, ?S24, 16#455a14ed), + + A8 = ?GG (A7, B7, C7, D7, X13, ?S21, 16#a9e3e905), + D8 = ?GG (D7, A8, B7, C7, X2, ?S22, 16#fcefa3f8), + C8 = ?GG (C7, D8, A8, B7, X7, ?S23, 16#676f02d9), + B8 = ?GG (B7, C8, D8, A8, X12, ?S24, 16#8d2a4c8a), + + %% Round 3 + A9 = ?HH (A8, B8, C8, D8, X5, ?S31, 16#fffa3942), + D9 = ?HH (D8, A9, B8, C8, X8, ?S32, 16#8771f681), + C9 = ?HH (C8, D9, A9, B8, X11, ?S33, 16#6d9d6122), + B9 = ?HH (B8, C9, D9, A9, X14, ?S34, 16#fde5380c), + + A10 = ?HH (A9, B9, C9, D9, X1, ?S31, 16#a4beea44), + D10 = ?HH (D9, A10, B9, C9, X4, ?S32, 16#4bdecfa9), + C10 = ?HH (C9, D10, A10, B9, X7, ?S33, 16#f6bb4b60), + B10 = ?HH (B9, C10, D10, A10, X10, ?S34, 16#bebfbc70), + + A11 = ?HH (A10, B10, C10, D10, X13, ?S31, 16#289b7ec6), + D11 = ?HH (D10, A11, B10, C10, X0, ?S32, 16#eaa127fa), + C11 = ?HH (C10, D11, A11, B10, X3, ?S33, 16#d4ef3085), + B11 = ?HH (B10, C11, D11, A11, X6, ?S34, 16#4881d05), + + A12 = ?HH (A11, B11, C11, D11, X9, ?S31, 16#d9d4d039), + D12 = ?HH (D11, A12, B11, C11, X12, ?S32, 16#e6db99e5), + C12 = ?HH (C11, D12, A12, B11, X15, ?S33, 16#1fa27cf8), + B12 = ?HH (B11, C12, D12, A12, X2, ?S34, 16#c4ac5665), + + %% Round 4 + A13 = ?II (A12, B12, C12, D12, X0, ?S41, 16#f4292244), + D13 = ?II (D12, A13, B12, C12, X7, ?S42, 16#432aff97), + C13 = ?II (C12, D13, A13, B12, X14, ?S43, 16#ab9423a7), + B13 = ?II (B12, C13, D13, A13, X5, ?S44, 16#fc93a039), + + A14 = ?II (A13, B13, C13, D13, X12, ?S41, 16#655b59c3), + D14 = ?II (D13, A14, B13, C13, X3, ?S42, 16#8f0ccc92), + C14 = ?II (C13, D14, A14, B13, X10, ?S43, 16#ffeff47d), + B14 = ?II (B13, C14, D14, A14, X1, ?S44, 16#85845dd1), + + A15 = ?II (A14, B14, C14, D14, X8, ?S41, 16#6fa87e4f), + D15 = ?II (D14, A15, B14, C14, X15, ?S42, 16#fe2ce6e0), + C15 = ?II (C14, D15, A15, B14, X6, ?S43, 16#a3014314), + B15 = ?II (B14, C15, D15, A15, X13, ?S44, 16#4e0811a1), + + A16 = ?II (A15, B15, C15, D15, X4, ?S41, 16#f7537e82), + D16 = ?II (D15, A16, B15, C15, X11, ?S42, 16#bd3af235), + C16 = ?II (C15, D16, A16, B15, X2, ?S43, 16#2ad7d2bb), + B16 = ?II (B15, C16, D16, A16, X9, ?S44, 16#eb86d391), + + {?U32(A0+A16), ?U32(B0+B16), ?U32(C0+C16), ?U32(D0+D16)}. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/crypto_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/crypto_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/crypto_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/crypto_SUITE.erl 2009-03-12 12:16:37.000000000 +0000 @@ -0,0 +1,330 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(crypto_SUITE). + +-include("test_server.hrl"). + +-export([all/1, + t_md5/1,t_md5_update/1,error/1,unaligned_context/1,random_lists/1, + misc_errors/1]). + +all(suite) -> + [t_md5,t_md5_update,error,unaligned_context,random_lists,misc_errors]. + + +misc_errors(doc) -> + ["Test crc32, adler32 and md5 error cases not covered by other tests"]; +misc_errors(suite) -> + []; +misc_errors(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(2)), + ?line 1 = erlang:adler32([]), + ?line L = lists:duplicate(600,3), + ?line 1135871753 = erlang:adler32(L), + ?line L2 = lists:duplicate(22000,3), + ?line 1100939744 = erlang:adler32(L2), + ?line {'EXIT', {badarg,_}} = (catch erlang:adler32(L++[a])), + ?line {'EXIT', {badarg,_}} = (catch erlang:crc32(L++[a])), + ?line {'EXIT', {badarg,_}} = (catch erlang:crc32([1,2,3|<<25:7>>])), + ?line {'EXIT', {badarg,_}} = (catch erlang:crc32([1,2,3|4])), + ?line Big = 111111111111111111111111111111, + ?line {'EXIT', {badarg,_}} = (catch erlang:crc32(Big,<<"hej">>)), + ?line {'EXIT', {badarg,_}} = (catch erlang:crc32(25,[1,2,3|4])), + ?line {'EXIT', {badarg,_}} = (catch erlang:crc32_combine(Big,3,3)), + ?line {'EXIT', {badarg,_}} = (catch erlang:crc32_combine(3,Big,3)), + ?line {'EXIT', {badarg,_}} = (catch erlang:crc32_combine(3,3,Big)), + ?line {'EXIT', {badarg,_}} = (catch erlang:adler32(Big,<<"hej">>)), + ?line {'EXIT', {badarg,_}} = (catch erlang:adler32(25,[1,2,3|4])), + ?line {'EXIT', {badarg,_}} = (catch erlang:adler32_combine(Big,3,3)), + ?line {'EXIT', {badarg,_}} = (catch erlang:adler32_combine(3,Big,3)), + ?line {'EXIT', {badarg,_}} = (catch erlang:adler32_combine(3,3,Big)), + ?line {'EXIT', {badarg,_}} = (catch erlang:md5_update(<<"hej">>,<<"hej">>)), + ?line {'EXIT', {badarg,_}} = (catch erlang:md5_final(<<"hej">>)), + ?line test_server:timetrap_cancel(Dog), + ok. + + +%% +%% Most of the real code for these test cases are in +%% the modules crypto_reference and random_iolist. +%% +-define(REF,crypto_reference). + +nicesplit(N,L) -> + nicesplit(N,L,[]). +nicesplit(0,Tail,Acc) -> + {lists:reverse(Acc),Tail}; +nicesplit(_,[],Acc) -> + {lists:reverse(Acc),[]}; +nicesplit(N,[H|Tail],Acc) -> + nicesplit(N-1,Tail,[H|Acc]). + +run_in_para([],_) -> + true; +run_in_para(FunList,Schedulers) -> + {ThisTime,NextTime} = nicesplit(Schedulers,FunList), + case length(ThisTime) of + 1 -> + [{L,Fun}] = ThisTime, + try + Fun() + catch + _:Reason -> + exit({error_at_line,L,Reason}) + end; + _ -> + These = [ {L,erlang:spawn_monitor(F)} || {L,F} <- ThisTime ], + collect_workers(These) + end, + run_in_para(NextTime,Schedulers). + +collect_workers([]) -> + ok; +collect_workers([{L,{Pid,Ref}}|T]) -> + receive + {'DOWN',Ref,process,Pid,normal} -> + collect_workers(T); + {'DOWN',Ref,process,Pid,Other} -> + exit({error_at_line,L,Other}) + end. + +random_lists(doc) -> + ["Test crc32, adler32 and md5 on a number of pseudo-randomly generated " + "lists."]; +random_lists(suite) -> + []; +random_lists(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(5)), + ?line Num = erlang:system_info(schedulers_online), + ?line B = list_to_binary( + lists:duplicate( + (erlang:system_info(context_reductions)*10) - 50,$!)), + ?line CRC32_1 = fun(L) -> erlang:crc32(L) end, + ?line CRC32_2 = fun(L) -> ?REF:crc32(L) end, + ?line ADLER32_1 = fun(L) -> erlang:adler32(L) end, + ?line ADLER32_2 = fun(L) -> ?REF:adler32(L) end, + ?line MD5_1 = fun(L) -> erlang:md5(L) end, + ?line MD5_2 = fun(L) -> ?REF:md5_final( + ?REF:md5_update(?REF:md5_init(),L)) end, + ?line MD5_3 = fun(L) -> erlang:md5_final( + erlang:md5_update(erlang:md5_init(),L)) end, + ?line CRC32_1_L = fun(L) -> erlang:crc32([B|L]) end, + ?line CRC32_2_L = fun(L) -> ?REF:crc32([B|L]) end, + ?line ADLER32_1_L = fun(L) -> erlang:adler32([B|L]) end, + ?line ADLER32_2_L = fun(L) -> ?REF:adler32([B|L]) end, + ?line MD5_1_L = fun(L) -> erlang:md5([B|L]) end, + ?line MD5_2_L = fun(L) -> ?REF:md5_final( + ?REF:md5_update(?REF:md5_init(),[B|L])) end, + ?line MD5_3_L = fun(L) -> erlang:md5_final( + erlang:md5_update( + erlang:md5_init(),[B|L])) end, + ?line Wlist0 = + [{?LINE, fun() -> random_iolist:run(150, CRC32_1, CRC32_2) end}, + {?LINE, fun() -> random_iolist:run(150, ADLER32_1, ADLER32_2) end}, + {?LINE, fun() -> random_iolist:run(150,MD5_1,MD5_2) end}, + {?LINE, fun() -> random_iolist:run(150,MD5_1,MD5_3) end}, + {?LINE, fun() -> random_iolist:run(150, CRC32_1_L, CRC32_2_L) end}, + {?LINE, + fun() -> random_iolist:run(150, ADLER32_1_L, ADLER32_2_L) end}, + {?LINE, fun() -> random_iolist:run(150,MD5_1_L,MD5_2_L) end}, + {?LINE, fun() -> random_iolist:run(150,MD5_1_L,MD5_3_L) end}], + ?line run_in_para(Wlist0,Num), + ?line CRC32_1_2 = fun(L1,L2) -> erlang:crc32([L1,L2]) end, + ?line CRC32_2_2 = fun(L1,L2) -> erlang:crc32(erlang:crc32(L1),L2) end, + ?line CRC32_3_2 = fun(L1,L2) -> erlang:crc32_combine( + erlang:crc32(L1), + erlang:crc32(L2), + erlang:iolist_size(L2)) + end, + ?line ADLER32_1_2 = fun(L1,L2) -> erlang:adler32([L1,L2]) end, + ?line ADLER32_2_2 = fun(L1,L2) -> erlang:adler32( + erlang:adler32(L1),L2) end, + ?line ADLER32_3_2 = fun(L1,L2) -> erlang:adler32_combine( + erlang:adler32(L1), + erlang:adler32(L2), + erlang:iolist_size(L2)) + end, + ?line MD5_1_2 = fun(L1,L2) -> erlang:md5([L1,L2]) end, + ?line MD5_2_2 = fun(L1,L2) -> + erlang:md5_final( + erlang:md5_update( + erlang:md5_update( + erlang:md5_init(), + L1), + L2)) + end, + ?line CRC32_1_L_2 = fun(L1,L2) -> erlang:crc32([[B|L1],[B|L2]]) end, + ?line CRC32_2_L_2 = fun(L1,L2) -> erlang:crc32( + erlang:crc32([B|L1]),[B|L2]) end, + ?line CRC32_3_L_2 = fun(L1,L2) -> erlang:crc32_combine( + erlang:crc32([B|L1]), + erlang:crc32([B|L2]), + erlang:iolist_size([B|L2])) + end, + ?line ADLER32_1_L_2 = fun(L1,L2) -> erlang:adler32([[B|L1],[B|L2]]) end, + ?line ADLER32_2_L_2 = fun(L1,L2) -> erlang:adler32( + erlang:adler32([B|L1]), + [B|L2]) + end, + ?line ADLER32_3_L_2 = fun(L1,L2) -> erlang:adler32_combine( + erlang:adler32([B|L1]), + erlang:adler32([B|L2]), + erlang:iolist_size([B|L2])) + end, + ?line MD5_1_L_2 = fun(L1,L2) -> erlang:md5([[B|L1],[B|L2]]) end, + ?line MD5_2_L_2 = fun(L1,L2) -> + erlang:md5_final( + erlang:md5_update( + erlang:md5_update( + erlang:md5_init(), + [B|L1]), + [B|L2])) + end, + ?line Wlist1 = + [{?LINE, fun() -> random_iolist:run2(150,CRC32_1_2,CRC32_2_2) end}, + {?LINE, fun() -> random_iolist:run2(150,CRC32_1_2,CRC32_3_2) end}, + {?LINE, fun() -> random_iolist:run2(150,ADLER32_1_2,ADLER32_2_2) end}, + {?LINE, fun() -> random_iolist:run2(150,ADLER32_1_2,ADLER32_3_2) end}, + {?LINE, fun() -> random_iolist:run2(150,MD5_1_2,MD5_2_2) end}, + {?LINE, fun() -> random_iolist:run2(150,CRC32_1_L_2,CRC32_2_L_2) end}, + {?LINE, fun() -> random_iolist:run2(150,CRC32_1_L_2,CRC32_3_L_2) end}, + {?LINE, + fun() -> random_iolist:run2(150,ADLER32_1_L_2,ADLER32_2_L_2) end}, + {?LINE, + fun() -> random_iolist:run2(150,ADLER32_1_L_2,ADLER32_3_L_2) end}, + {?LINE, fun() -> random_iolist:run2(150,MD5_1_L_2,MD5_2_L_2) end}], + ?line run_in_para(Wlist1,Num), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% +%% +t_md5(doc) -> + ["Generate MD5 message digests and check the result. Examples are " + "from RFC-1321."]; +t_md5(Config) when is_list(Config) -> + ?line t_md5_test("", "d41d8cd98f00b204e9800998ecf8427e"), + ?line t_md5_test("a", "0cc175b9c0f1b6a831c399e269772661"), + ?line t_md5_test("abc", "900150983cd24fb0d6963f7d28e17f72"), + ?line t_md5_test(["message ","digest"], "f96b697d7cb7938d525a2f31aaf161d0"), + ?line t_md5_test(["message ",unaligned_sub_bin(<<"digest">>)], + "f96b697d7cb7938d525a2f31aaf161d0"), + ?line t_md5_test("abcdefghijklmnopqrstuvwxyz", + "c3fcd3d76192e4007dfb496cca67e13b"), + ?line t_md5_test("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789", + "d174ab98d277d9f5a5611c2c9f419d9f"), + ?line t_md5_test("12345678901234567890123456789012345678901234567890" + "123456789012345678901234567890", + "57edf4a22be3c955ac49da2e2107b67a"), + ok. + +%% +%% +t_md5_update(doc) -> + ["Generate MD5 message using md5_init, md5_update, and md5_final, and" + "check the result. Examples are from RFC-1321."]; +t_md5_update(Config) when is_list(Config) -> + ?line t_md5_update_1(fun(Str) -> Str end), + ?line t_md5_update_1(fun(Str) -> list_to_binary(Str) end), + ?line t_md5_update_1(fun(Str) -> unaligned_sub_bin(list_to_binary(Str)) end), + ok. + +t_md5_update_1(Tr) when is_function(Tr, 1) -> + Ctx = erlang:md5_init(), + Ctx1 = erlang:md5_update(Ctx, Tr("ABCDEFGHIJKLMNOPQRSTUVWXYZ")), + Ctx2 = erlang:md5_update(Ctx1, Tr("abcdefghijklmnopqrstuvwxyz" + "0123456789")), + m(erlang:md5_final(Ctx2), + hexstr2bin("d174ab98d277d9f5a5611c2c9f419d9f")), + ok. + +%% +%% +error(Config) when is_list(Config) -> + ?line {'EXIT',{badarg,_}} = (catch erlang:md5(bit_sized_binary(<<"abc">>))), + ?line Ctx0 = erlang:md5_init(), + ?line {'EXIT',{badarg,_}} = + (catch erlang:md5_update(Ctx0, bit_sized_binary(<<"abcfjldjd">>))), + ?line {'EXIT',{badarg,_}} = + (catch erlang:md5_update(Ctx0, ["something",bit_sized_binary(<<"abcfjldjd">>)])), + ?line {'EXIT',{badarg,_}} = + (catch erlang:md5_update(bit_sized_binary(Ctx0), "something")), + ?line {'EXIT',{badarg,_}} = (catch erlang:md5_final(bit_sized_binary(Ctx0))), + ?line m(erlang:md5_final(Ctx0), hexstr2bin("d41d8cd98f00b204e9800998ecf8427e")), + ok. + + +%% +%% +unaligned_context(Config) when is_list(Config) -> + ?line Ctx0 = erlang:md5_init(), + ?line Ctx1 = erlang:md5_update(unaligned_sub_bin(Ctx0), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), + ?line Ctx = erlang:md5_update(unaligned_sub_bin(Ctx1), + "abcdefghijklmnopqrstuvwxyz0123456789"), + ?line m(erlang:md5_final(unaligned_sub_bin(Ctx)), + hexstr2bin("d174ab98d277d9f5a5611c2c9f419d9f")), + ok. + +%% +%% Help functions +%% + +t_md5_test(Str, ResultStr) -> + ResultBin = hexstr2bin(ResultStr), + m(erlang:md5(Str), ResultBin), + Bin = list_to_binary(Str), + m(erlang:md5(Bin), ResultBin), + UnalignedSubBin = unaligned_sub_bin(Bin), + m(erlang:md5(UnalignedSubBin), ResultBin). + +m(X, X) -> true. + +hexstr2bin(S) -> + list_to_binary(hexstr2list(S)). + +hexstr2list([X,Y|T]) -> + [mkint(X)*16 + mkint(Y) | hexstr2list(T)]; +hexstr2list([]) -> + []. + +mkint(C) when $0 =< C, C =< $9 -> + C - $0; +mkint(C) when $A =< C, C =< $F -> + C - $A + 10; +mkint(C) when $a =< C, C =< $f -> + C - $a + 10. + +unaligned_sub_bin(Bin0) -> + Bin1 = <<0:3,Bin0/binary,31:5>>, + Sz = size(Bin0), + <<0:3,Bin:Sz/binary,31:5>> = id(Bin1), + Bin. + +%% Add 1 bit to the size of the binary. +bit_sized_binary(Bin0) -> + Bin = <>, + BitSize = bit_size(Bin), + BitSize = 8*size(Bin) + 1, + Bin. + +id(I) -> I. + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/dummy_drv.c erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/dummy_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/dummy_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/dummy_drv.c 2001-10-08 09:42:35.000000000 +0100 @@ -0,0 +1,49 @@ +#include +#include "erl_driver.h" + +#ifndef DRIVER_INIT +# define DRIVER_INIT(x) driver_init +#endif + +static ErlDrvPort erlang_port; +static ErlDrvData dummy_start(ErlDrvPort, char*); +static void dummy_read(ErlDrvData port, char *buf, int count); +static void dummy_stop(ErlDrvData), easy_read(ErlDrvData, char*, int); + +static ErlDrvEntry dummy_driver_entry = { + NULL, + dummy_start, + dummy_stop, + dummy_read, + NULL, + NULL, + "dummy_drv", + NULL +}; + +DRIVER_INIT(dummy_drv) +{ + erlang_port = (ErlDrvPort)-1; + return &dummy_driver_entry; +} + +static ErlDrvData dummy_start(ErlDrvPort port,char *buf) +{ + if (erlang_port != (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + + erlang_port = port; + return (ErlDrvData)port; +} + +static void dummy_read(ErlDrvData port, char *buf, int count) +{ + driver_output(erlang_port, buf, count); +} + +static void dummy_stop(ErlDrvData port) +{ + erlang_port = (ErlDrvPort)-1; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/echo_drv.c erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/echo_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/echo_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/echo_drv.c 2001-10-08 09:37:47.000000000 +0100 @@ -0,0 +1,52 @@ +#include +#include "erl_driver.h" + +static ErlDrvPort erlang_port; +static ErlDrvData echo_start(ErlDrvPort, char *); +static void from_erlang(ErlDrvData, char*, int); +static int echo_call(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen, unsigned *ret_flags); +static ErlDrvEntry echo_driver_entry = { + NULL, /* Init */ + echo_start, + NULL, /* Stop */ + from_erlang, + NULL, /* Ready input */ + NULL, /* Ready output */ + "echo_drv", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + echo_call +}; + +DRIVER_INIT(echo_drv) +{ + return &echo_driver_entry; +} + +static ErlDrvData +echo_start(ErlDrvPort port, char *buf) +{ + return (ErlDrvData) port; +} + +static void +from_erlang(ErlDrvData data, char *buf, int count) +{ + driver_output((ErlDrvPort) data, buf, count); +} + +static int +echo_call(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen, unsigned *ret_flags) +{ + *rbuf = buf; + *ret_flags |= DRIVER_CALL_KEEP_BUFFER; + return len; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/echo_drv_fail_init.c erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/echo_drv_fail_init.c --- erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/echo_drv_fail_init.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/echo_drv_fail_init.c 2007-11-26 19:01:47.000000000 +0000 @@ -0,0 +1,59 @@ +#include +#include "erl_driver.h" + +static ErlDrvPort erlang_port; +static ErlDrvData echo_start(ErlDrvPort, char *); +static void from_erlang(ErlDrvData, char*, int); +static int echo_call(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen, unsigned *ret_flags); +static int echo_failing_init(void); + +static ErlDrvEntry echo_driver_entry = { + echo_failing_init, + echo_start, + NULL, /* Stop */ + from_erlang, + NULL, /* Ready input */ + NULL, /* Ready output */ + "echo_drv", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + echo_call +}; + +DRIVER_INIT(echo_drv) +{ + return &echo_driver_entry; +} + +static int echo_failing_init(void) +{ + return -1; +} + +static ErlDrvData +echo_start(ErlDrvPort port, char *buf) +{ + return (ErlDrvData) port; +} + +static void +from_erlang(ErlDrvData data, char *buf, int count) +{ + driver_output((ErlDrvPort) data, buf, count); +} + +static int +echo_call(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen, unsigned *ret_flags) +{ + *rbuf = buf; + *ret_flags |= DRIVER_CALL_KEEP_BUFFER; + return len; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/initfail_drv.c erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/initfail_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/initfail_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/initfail_drv.c 2001-10-08 09:37:50.000000000 +0100 @@ -0,0 +1,46 @@ +#include +#include "erl_driver.h" + +static ErlDrvPort erlang_port; +static ErlDrvData easy_start(ErlDrvPort, char*); +static void easy_stop(ErlDrvData), easy_read(ErlDrvData, char*, int); + +static ErlDrvEntry easy_driver_entry = +{ + NULL, + easy_start, + easy_stop, + easy_read, + NULL, + NULL, + "easy", + NULL +}; + +DRIVER_INIT(initfail_drv) +{ + erlang_port = (ErlDrvPort)-1; + return 0; +} + +static ErlDrvData easy_start(ErlDrvPort port, char *buf) +{ + if (erlang_port != (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + + fprintf(stderr, "Easy driver started with args %s\n", buf); + erlang_port = port; + return (ErlDrvData)port; +} + +static void easy_read(ErlDrvData port, char *buf, int count) +{ + driver_output(erlang_port, buf, count); +} + +static void easy_stop(ErlDrvData port) +{ + erlang_port = (ErlDrvPort) -1; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/lock_drv.c erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/lock_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/lock_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/lock_drv.c 2007-11-26 19:01:31.000000000 +0000 @@ -0,0 +1,55 @@ +#include +#include "erl_driver.h" + +static ErlDrvPort erlang_port; +static ErlDrvData echo_start(ErlDrvPort, char *); +static void from_erlang(ErlDrvData, char*, int); +static int echo_call(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen, unsigned *ret_flags); +static ErlDrvEntry echo_driver_entry = { + NULL, /* Init */ + echo_start, + NULL, /* Stop */ + from_erlang, + NULL, /* Ready input */ + NULL, /* Ready output */ + "lock_drv", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + echo_call +}; + +DRIVER_INIT(echo_drv) +{ + return &echo_driver_entry; +} + +static ErlDrvData +echo_start(ErlDrvPort port, char *buf) +{ + driver_lock_driver(port); + return (ErlDrvData) port; +} + +static void +from_erlang(ErlDrvData data, char *buf, int count) +{ + driver_output((ErlDrvPort) data, buf, count); +} + +static int +echo_call(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen, unsigned *ret_flags) +{ + ErlDrvPort port = (ErlDrvPort) drv_data; + driver_lock_driver(port); + *rbuf = buf; + *ret_flags |= DRIVER_CALL_KEEP_BUFFER; + return len; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/Makefile.src 2007-11-26 18:57:25.000000000 +0000 @@ -0,0 +1,3 @@ +all: echo_drv@dll@ echo_drv_fail_init@dll@ noinit_drv@dll@ wrongname_drv@dll@ initfail_drv@dll@ dummy_drv@dll@ lock_drv@dll@ + +@SHLIB_RULES@ diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/noinit_drv.c erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/noinit_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/noinit_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/noinit_drv.c 2003-07-07 13:05:04.000000000 +0100 @@ -0,0 +1,58 @@ +#include +#include "erl_driver.h" + +static ErlDrvPort erlang_port; +static ErlDrvData easy_start(ErlDrvPort, char*); +static void easy_stop(ErlDrvData), easy_read(ErlDrvData, char*, int); + +static ErlDrvEntry easy_driver_entry = +{ + NULL, + easy_start, + easy_stop, + easy_read, + NULL, + NULL, + "easy", + NULL +}; + +#ifdef __WIN32__ +/* + * Define a correct driver_init here, or the module won't compile. + * Note that it will not actually be used. + */ +DRIVER_INIT(noinit_drv) + +#else +/* + * Provoke an error when loading the module. + */ +int no_driver_init(void *handle) +#endif +{ + erlang_port = (ErlDrvPort)-1; + return &easy_driver_entry; +} + +static ErlDrvData easy_start(ErlDrvPort port,char *buf) +{ + if (erlang_port != (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + + fprintf(stderr, "Easy driver started with args %s\n", buf); + erlang_port = port; + return (ErlDrvData)port; +} + +static void easy_read(ErlDrvData port, char *buf, int count) +{ + driver_output(erlang_port, buf, count); +} + +static void easy_stop(ErlDrvData port) +{ + erlang_port = (ErlDrvPort)-1; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/wrongname_drv.c erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/wrongname_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE_data/wrongname_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE_data/wrongname_drv.c 2001-10-08 09:37:53.000000000 +0100 @@ -0,0 +1,50 @@ +#include +#include "erl_driver.h" + +#ifndef DRIVER_INIT +# define DRIVER_INIT(x) driver_init +#endif + +static ErlDrvPort erlang_port; +static ErlDrvData easy_start(ErlDrvPort, char*); +static void easy_stop(ErlDrvData), easy_read(ErlDrvData, char*, int); + +static ErlDrvEntry easy_driver_entry = +{ + NULL, + easy_start, + easy_stop, + easy_read, + NULL, + NULL, + "easy", + NULL +}; + +DRIVER_INIT(wrongname_drv) +{ + erlang_port = (ErlDrvPort)-1; + return &easy_driver_entry; +} + +static ErlDrvData easy_start(ErlDrvPort port,char *buf) +{ + if (erlang_port != (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + + fprintf(stderr, "Easy driver started with args %s\n", buf); + erlang_port = port; + return (ErlDrvData)port; +} + +static void easy_read(ErlDrvData port, char *buf, int count) +{ + driver_output(erlang_port, buf, count); +} + +static void easy_stop(ErlDrvData port) +{ + erlang_port = (ErlDrvPort)-1; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/ddll_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ddll_SUITE.erl 2009-09-18 15:07:35.000000000 +0100 @@ -0,0 +1,1120 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(ddll_SUITE). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Checks if the dynamic driver and linker loader works. +%%% +%%% These tests can only be run installed (outside clearcase). +%%% +%%% XXX In this suite is missing test cases for reference counts +%%% and that drivers are unloaded when their processes die. +%%% (For me to add :-) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +-export([all/1, ddll_test/1, errors/1, + reference_count/1, + kill_port/1, dont_kill_port/1]). +-export([unload_on_process_exit/1, delayed_unload_with_ports/1, + unload_due_to_process_exit/1, + no_unload_due_to_process_exit/1, no_unload_due_to_process_exit_2/1, + unload_reload_thingie/1, unload_reload_thingie_2/1, + unload_reload_thingie_3/1, reload_pending/1, reload_pending_kill/1, + load_fail_init/1, + reload_pending_fail_init/1, + more_error_codes/1, forced_port_killing/1, + no_trap_exit_and_kill_ports/1, + monitor_demonitor/1, monitor_demonitor_load/1, new_interface/1, + lock_driver/1]). + +% Private exports +-export([echo_loader/2, nice_echo_loader/2 ,properties/1, load_and_unload/1]). + +-import(ordsets, [subtract/2]). + +-include("test_server.hrl"). + +all(suite) -> + [ddll_test, errors, + reference_count, + kill_port, + dont_kill_port, + properties, + load_and_unload, + unload_on_process_exit, + delayed_unload_with_ports, + unload_due_to_process_exit, + no_unload_due_to_process_exit, + no_unload_due_to_process_exit_2, + unload_reload_thingie, + unload_reload_thingie_2, + unload_reload_thingie_3, + reload_pending, + load_fail_init, + reload_pending_fail_init, + reload_pending_kill, + more_error_codes, + forced_port_killing, + no_trap_exit_and_kill_ports, + monitor_demonitor, + monitor_demonitor_load, + new_interface, + lock_driver + ]. + +unload_on_process_exit(suite) -> + []; +unload_on_process_exit(doc) -> + ["Check that the driver is unloaded on process exit"]; +unload_on_process_exit(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line false = lists:member("echo_drv",element(2,erl_ddll:loaded_drivers())), + Parent = self(), + ?line Pid = spawn(fun() -> + receive go -> ok end, + erl_ddll:try_load(Path, echo_drv, []), + Parent ! gone, + receive go -> ok end, + erl_ddll:loaded_drivers(), + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + ?line false = lists:member("echo_drv",element(2,erl_ddll:loaded_drivers())), + Pid ! go, + ?line receive + gone -> ok + end, + ?line true = lists:member("echo_drv",element(2,erl_ddll:loaded_drivers())), + Pid ! go, + ?line receive + {'DOWN', Ref, process, Pid, banan} -> + ok + end, + receive after 500 -> ok end, + ?line false = lists:member("echo_drv",element(2,erl_ddll:loaded_drivers())), + ?line test_server:timetrap_cancel(Dog), + ok. + +delayed_unload_with_ports(suite) -> + []; +delayed_unload_with_ports(doc) -> + ["Check that the driver is unloaded when the last port is closed"]; +delayed_unload_with_ports(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line erl_ddll:try_load(Path, echo_drv, []), + ?line erl_ddll:try_load(Path, echo_drv, []), + ?line Port = open_port({spawn, echo_drv}, [eof]), + ?line 1 = erl_ddll:info(echo_drv, port_count), + ?line Port2 = open_port({spawn, echo_drv}, [eof]), + ?line 2 = erl_ddll:info(echo_drv, port_count), + ?line {ok,pending_process} = erl_ddll:try_unload(echo_drv,[{monitor, pending_driver}]), + ?line {ok,pending_driver,Ref} = erl_ddll:try_unload(echo_drv,[{monitor, pending_driver}]), + ?line ok = receive _ -> false after 0 -> ok end, + ?line Port ! {self(), close}, + ?line 1 = erl_ddll:info(echo_drv, port_count), + ?line ok = receive {Port,closed} -> ok after 1000 -> false end, + ?line Port2 ! {self(), close}, + ?line ok = receive {Port2,closed} -> ok after 1000 -> false end, + ?line ok = receive {'DOWN', Ref, driver, echo_drv, unloaded} -> ok after 1000 -> false end, + ?line test_server:timetrap_cancel(Dog), + ok. + +unload_due_to_process_exit(suite) -> + []; +unload_due_to_process_exit(doc) -> + ["Check that the driver with ports is unloaded on process exit"]; +unload_due_to_process_exit(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line Parent = self(), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded}), + receive X -> Parent ! {got,X} end + end, + ?line Pid = spawn(fun() -> + receive go -> ok end, + {ok, loaded} = erl_ddll:try_load(Path, echo_drv, []), + spawn(F3), + receive go -> ok end, + _Port = open_port({spawn, echo_drv}, [eof]), + _Port2 = open_port({spawn, echo_drv}, [eof]), + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + Pid ! go, + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + Pid ! go, + ?line ok = receive {'DOWN', Ref, process, Pid, banan} -> ok after 300 -> error end, + ?line ok = receive {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok after 300 -> error end, + ?line test_server:timetrap_cancel(Dog), + ok. + +no_unload_due_to_process_exit(suite) -> + []; +no_unload_due_to_process_exit(doc) -> + ["Check that a driver with driver loaded in another process is not unloaded on process exit"]; +no_unload_due_to_process_exit(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line Parent = self(), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded}), + receive X -> Parent ! {got,X} end + end, + ?line Pid = spawn(fun() -> + receive go -> ok end, + {ok, loaded} = erl_ddll:try_load(Path, echo_drv, []), + spawn(F3), + receive go -> ok end, + _Port = open_port({spawn, echo_drv}, [eof]), + _Port2 = open_port({spawn, echo_drv}, [eof]), + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + Pid ! go, + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + ?line {ok, already_loaded} = erl_ddll:try_load(Path, echo_drv, []), + Pid ! go, + ?line ok = receive {'DOWN', Ref, process, Pid, banan} -> ok after 300 -> error end, + ?line ok = receive X -> {error, X} after 300 -> ok end, + ?line ok = unload_expect_fast(echo_drv,[]), + ?line ok = receive {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok after 300 -> error end, + ?line test_server:timetrap_cancel(Dog), + ok. + +no_unload_due_to_process_exit_2(suite) -> + []; +no_unload_due_to_process_exit_2(doc) -> + ["Check that a driver with open ports in another process is not unloaded on process exit"]; +no_unload_due_to_process_exit_2(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line Parent = self(), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded}), + receive X -> Parent ! {got,X} end + end, + ?line Pid = spawn(fun() -> + receive go -> ok end, + {ok, loaded} = erl_ddll:try_load(Path, echo_drv, []), + spawn(F3), + receive go -> ok end, + _Port = open_port({spawn, echo_drv}, [eof]), + _Port2 = open_port({spawn, echo_drv}, [eof]), + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + Pid ! go, + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + ?line Port = open_port({spawn, echo_drv}, [eof]), + Pid ! go, + ?line ok = receive {'DOWN', Ref, process, Pid, banan} -> ok after 300 -> error end, + ?line ok = receive X -> {error, X} after 300 -> ok end, + ?line erlang:port_close(Port), + ?line ok = receive {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok after 300 -> error end, + ?line test_server:timetrap_cancel(Dog), + ok. + +unload_reload_thingie(suite) -> + []; +unload_reload_thingie(doc) -> + ["Check delayed unload and reload"]; +unload_reload_thingie(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line Parent = self(), + ?line {ok, loaded} = erl_ddll:try_load(Path, echo_drv, []), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded_only}), + receive X -> Parent ! {got,X} end + end, + ?line Pid = spawn(fun() -> + receive go -> ok end, + _Port = open_port({spawn, echo_drv}, [eof]), + spawn(F3), + receive go -> ok end, + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + Pid ! go, + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + ?line {ok,pending_driver,Ref3} = erl_ddll:try_unload(echo_drv,[{monitor,pending}]), + ?line Ref4 = erl_ddll:monitor(driver,{echo_drv,loaded}), + ?line ok = receive {'DOWN',Ref4, driver,echo_drv,load_cancelled} -> ok after 1000 -> false end, + ?line {ok,already_loaded} = erl_ddll:try_load(Path, echo_drv, []), + ?line ok = receive {'UP',Ref3, driver,echo_drv,unload_cancelled} -> ok after 1000 -> false end, + ?line Pid ! go, + ?line ok = receive {'DOWN', Ref, process, Pid, banan} -> ok after 300 -> error end, + ?line [{Parent,1}] = erl_ddll:info(echo_drv, processes), + ?line 0 = erl_ddll:info(echo_drv, port_count), + ?line ok = unload_expect_fast(echo_drv,[{monitor,pending}]), + ?line ok = receive + {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok + after 300 -> error + end, + ?line ok = receive X -> {error, X} after 300 -> ok end, + ?line test_server:timetrap_cancel(Dog), + ok. + +unload_reload_thingie_2(suite) -> + []; +unload_reload_thingie_2(doc) -> + ["Check delayed unload and reload"]; +unload_reload_thingie_2(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line Parent = self(), + ?line {ok, loaded} = erl_ddll:try_load(Path, echo_drv, []), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded_only}), + receive X -> Parent ! {got,X} end + end, + ?line Pid = spawn(fun() -> + receive go -> ok end, + _Port = open_port({spawn, echo_drv}, [eof]), + spawn(F3), + receive go -> ok end, + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + Pid ! go, + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + ?line {ok,pending_driver,Ref3} = erl_ddll:try_load(Path,echo_drv,[{monitor,pending_driver},{reload,pending_driver}]), + ?line Ref4 = erl_ddll:monitor(driver,{echo_drv,unloaded}), + ?line Pid ! go, + ?line ok = receive {'DOWN', Ref, process, Pid, banan} -> ok after 300 -> error end, + ?line ok = receive {'DOWN',Ref4, driver,echo_drv,unloaded} -> ok after 1000 -> false end, + ?line ok = receive {'UP',Ref3, driver,echo_drv,loaded} -> ok after 1000 -> false end, + ?line [{Parent,1}] = erl_ddll:info(echo_drv, processes), + ?line 0 = erl_ddll:info(echo_drv, port_count), + ?line ok = receive + {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok + after 300 -> error + end, + ?line ok = unload_expect_fast(echo_drv,[{monitor,pending}]), + ?line ok = receive X -> {error, X} after 300 -> ok end, + ?line test_server:timetrap_cancel(Dog), + ok. + +unload_reload_thingie_3(suite) -> + []; +unload_reload_thingie_3(doc) -> + ["Check delayed unload and reload failure"]; +unload_reload_thingie_3(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line Parent = self(), + ?line {ok, loaded} = erl_ddll:try_load(Path, echo_drv, []), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded}), + receive X -> Parent ! {got,X} end + end, + ?line Pid = spawn(fun() -> + receive go -> ok end, + _Port = open_port({spawn, echo_drv}, [eof]), + spawn(F3), + receive go -> ok end, + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + Pid ! go, + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + ?line {ok,pending_driver,Ref3} = erl_ddll:try_load(filename:join([Path,"skrumpf"]),echo_drv,[{monitor,pending_driver},{reload,pending_driver}]), + ?line Ref4 = erl_ddll:monitor(driver,{echo_drv,unloaded}), + ?line Pid ! go, + ?line ok = receive {'DOWN', Ref, process, Pid, banan} -> ok after 300 -> error end, + ?line ok = receive + {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok + after 300 -> error + end, + ?line ok = receive {'DOWN',Ref4,driver,echo_drv,unloaded} -> ok after 300 -> false end, + ?line ok = receive + {'DOWN',Ref3, driver,echo_drv,{load_failure,_}} -> ok + after 1000 -> false + end, + ?line {'EXIT',_} = (catch erl_ddll:info(echo_drv, port_count)), + ?line {error, not_loaded} = erl_ddll:try_unload(echo_drv,[{monitor,pending}]), + ?line ok = receive X -> {error, X} after 300 -> ok end, + ?line test_server:timetrap_cancel(Dog), + ok. + +reload_pending(suite) -> []; +reload_pending(doc) -> ["Reload a driver that is pending on a user"]; +reload_pending(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line Parent = self(), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded}), + receive X -> Parent ! {got,X} end + end, + ?line Pid = spawn(fun() -> + receive go -> ok end, + {ok, loaded} = erl_ddll:try_load(Path, echo_drv, []), + spawn(F3), + receive go -> ok end, + _Port = open_port({spawn, echo_drv}, [eof]), + _Port2 = open_port({spawn, echo_drv}, [eof]), + Parent ! opened, + receive go -> ok end, + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + Pid ! go, + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + ?line {ok, already_loaded} = erl_ddll:try_load(Path, echo_drv, []), + ?line Port = open_port({spawn, echo_drv}, [eof]), + Pid ! go, + ?line receive opened -> ok end, + ?line {error, pending_process} = + erl_ddll:try_load(Path, echo_drv, + [{reload,pending_driver}, + {monitor,pending_driver}]), + ?line {ok, pending_process, Ref3} = + erl_ddll:try_load(Path, echo_drv, + [{reload,pending}, + {monitor,pending}]), + ?line ok = receive X -> {error, X} after 300 -> ok end, + Pid ! go, + ?line ok = receive {'DOWN', Ref, process, Pid, banan} -> ok after 300 -> error end, + ?line ok = receive Y -> {error, Y} after 300 -> ok end, + ?line erlang:port_close(Port), + ?line ok = receive {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok after 300 -> error end, + ?line ok = receive {'UP', Ref3, driver, echo_drv, loaded} -> ok after 300 -> error end, + [{Parent,1}] = erl_ddll:info(echo_drv,processes), + ?line ok = receive Z -> {error, Z} after 300 -> ok end, + ?line test_server:timetrap_cancel(Dog), + ok. + +load_fail_init(suite) -> []; +load_fail_init(doc) -> ["Tests failure in the init in driver struct."]; +load_fail_init(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line PathFailing = ?config(priv_dir, Config), + ?line [_|_] = AllFailInits = filelib:wildcard("echo_drv_fail_init.*",Path), + ?line lists:foreach(fun(Name) -> + Src = filename:join([Path,Name]), + Ext = filename:extension(Name), + Dst =filename:join([PathFailing,"echo_drv"++Ext]), + file:delete(Dst), + {ok,_} = file:copy(Src,Dst) + end, + AllFailInits), + ?line [_|_] = filelib:wildcard("echo_drv.*",PathFailing), + ?line {error, driver_init_failed} = erl_ddll:try_load(PathFailing, + echo_drv, + [{monitor,pending}]), + ?line ok = receive XX -> + {unexpected,XX} + after 300 -> + ok + end, + ?line test_server:timetrap_cancel(Dog), + ok. + + +reload_pending_fail_init(suite) -> []; +reload_pending_fail_init(doc) -> ["Reload a driver that is pending but init fails"]; +reload_pending_fail_init(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line PathFailing = ?config(priv_dir, Config), + ?line [_|_] = AllFailInits = filelib:wildcard("echo_drv_fail_init.*",Path), + ?line lists:foreach(fun(Name) -> + Src = filename:join([Path,Name]), + Ext = filename:extension(Name), + Dst =filename:join([PathFailing,"echo_drv"++Ext]), + file:delete(Dst), + {ok,_} = file:copy(Src,Dst) + end, + AllFailInits), + ?line [_|_] = filelib:wildcard("echo_drv.*",PathFailing), + ?line Parent = self(), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded}), + receive X -> Parent ! {got,X} end + end, + ?line Pid = spawn(fun() -> + receive go -> ok end, + {ok, loaded} = erl_ddll:try_load(Path, echo_drv, []), + spawn(F3), + receive go -> ok end, + _Port = open_port({spawn, echo_drv}, [eof]), + _Port2 = open_port({spawn, echo_drv}, [eof]), + Parent ! opened, + receive go -> ok end, + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + Pid ! go, + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + ?line {ok, already_loaded} = erl_ddll:try_load(Path, echo_drv, []), + ?line Port = open_port({spawn, echo_drv}, [eof]), + Pid ! go, + ?line receive opened -> ok end, + ?line {ok, pending_process, Ref3} = + erl_ddll:try_load(PathFailing, echo_drv, + [{reload,pending}, + {monitor,pending}]), + ?line ok = receive X -> {error, X} after 300 -> ok end, + Pid ! go, + ?line ok = receive {'DOWN', Ref, process, Pid, banan} -> ok after 300 -> error end, + ?line ok = receive Y -> {error, Y} after 300 -> ok end, + ?line erlang:port_close(Port), + ?line ok = receive {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok after 300 -> error end, + ?line ok = receive {'DOWN', Ref3, driver, echo_drv, {load_failure,driver_init_failed}} -> ok after 300 -> error end, + ?line {'EXIT',{badarg,_}} = (catch erl_ddll:info(echo_drv,processes)), + + ?line ok = receive Z -> {error, Z} after 300 -> ok end, + ?line test_server:timetrap_cancel(Dog), + ok. + +reload_pending_kill(suite) -> []; +reload_pending_kill(doc) -> ["Reload a driver with kill_ports option " + "that is pending on a user"]; +reload_pending_kill(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line OldFlag = process_flag(trap_exit,true), + ?line Path = ?config(data_dir, Config), + ?line Parent = self(), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded}), + receive X -> Parent ! {got,X} end + end, + ?line Pid = spawn(fun() -> + process_flag(trap_exit,true), + receive go -> ok end, + {ok, loaded} = erl_ddll:try_load(Path, echo_drv, [{driver_options,[kill_ports]}]), + spawn(F3), + receive go -> ok end, + Port = open_port({spawn, echo_drv}, [eof]), + Port2 = open_port({spawn, echo_drv}, [eof]), + Parent ! opened, + receive go -> ok end, + receive + {'EXIT', Port2, driver_unloaded} -> + Parent ! first_exit + end, + receive + {'EXIT', Port, driver_unloaded} -> + Parent ! second_exit + end, + receive go -> ok end, + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + Pid ! go, + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + ?line {ok, already_loaded} = erl_ddll:try_load(Path, echo_drv, [{driver_options,[kill_ports]}]), + ?line {error,inconsistent} = erl_ddll:try_load(Path, echo_drv, []), + ?line Port = open_port({spawn, echo_drv}, [eof]), + Pid ! go, + ?line receive opened -> ok end, + ?line {error, pending_process} = + erl_ddll:try_load(Path, echo_drv, + [{driver_options,[kill_ports]}, + {reload,pending_driver}, + {monitor,pending_driver}]), + ?line {ok, pending_process, Ref3} = + erl_ddll:try_load(Path, echo_drv, + [{driver_options,[kill_ports]}, + {reload,pending}, + {monitor,pending}]), + ?line ok = receive + {'EXIT', Port, driver_unloaded} -> + ok + after 300 -> error + end, + Pid ! go, + ?line ok = receive {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok after 300 -> error end, + ?line ok = receive {'UP', Ref3, driver, echo_drv, loaded} -> ok after 300 -> error end, + ?line [_,_] = erl_ddll:info(echo_drv,processes), + ?line ok = receive first_exit -> ok after 300 -> error end, + ?line ok = receive second_exit -> ok after 300 -> error end, + ?line 0 = erl_ddll:info(echo_drv,port_count), + ?line ok = receive X -> {error, X} after 300 -> ok end, + Pid ! go, + ?line ok = receive {'DOWN', Ref, process, Pid, banan} -> ok after 300 -> error end, + ?line ok = receive Y -> {error, Y} after 300 -> ok end, + ?line Port2 = open_port({spawn, echo_drv}, [eof]), + ?line true = is_port(Port2), + [{Parent,1}] = erl_ddll:info(echo_drv,processes), + ?line 1 = erl_ddll:info(echo_drv,port_count), + ?line erlang:port_close(Port2), + ?line ok = receive {'EXIT', Port2, normal} -> ok after 300 -> error end, + ?line 0 = erl_ddll:info(echo_drv,port_count), + ?line [{Parent,1}] = erl_ddll:info(echo_drv,processes), + ?line Port3 = open_port({spawn, echo_drv}, [eof]), + ?line {ok, pending_driver, Ref4} = + erl_ddll:try_unload(echo_drv,[{monitor,pending_driver}]), + ?line ok = receive + {'EXIT', Port3, driver_unloaded} -> + ok + after 300 -> error + end, + ?line ok = receive {'DOWN', Ref4, driver, echo_drv, unloaded} -> ok after 300 -> error end, + io:format("Port = ~w, Port2 = ~w, Port3 = ~w~n",[Port,Port2,Port3]), + ?line ok = receive Z -> {error, Z} after 300 -> ok end, + ?line process_flag(trap_exit,OldFlag), + ?line test_server:timetrap_cancel(Dog), + ok. + + +more_error_codes(suite) -> + []; +more_error_codes(doc) -> + ["Some more error code checking"]; +more_error_codes(Config) when is_list(Config) -> + ?line {error,Err} = erl_ddll:try_load("./echo_dr",echo_dr,[]), + ?line true = is_list(erl_ddll:format_error(Err)), + ?line true = is_list(erl_ddll:format_error(not_loaded)), + ok. + +forced_port_killing(suite) -> + []; +forced_port_killing(doc) -> + ["Check kill_ports option to try_unload "]; +forced_port_killing(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line OldFlag=process_flag(trap_exit,true), + ?line Parent = self(), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded}), + receive X -> Parent ! {got,X} end + end, + ?line {ok, loaded} = erl_ddll:try_load(Path, echo_drv, []), + ?line spawn(F3), + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + ?line Port = open_port({spawn, echo_drv}, [eof]), + ?line Port2 = open_port({spawn, echo_drv}, [eof]), + ?line {ok, pending_driver, Ref1} = + erl_ddll:try_unload(echo_drv,[{monitor,pending_driver},kill_ports]), + ?line ok = receive + {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok + after 300 -> error + end, + ?line ok = receive {'EXIT',Port,driver_unloaded} -> ok after 300 -> false end, + ?line ok = receive {'EXIT',Port2,driver_unloaded} -> ok after 300 -> false end, + ?line ok = receive {'DOWN',Ref1, driver, echo_drv, unloaded} -> ok after 300 -> false end, + ?line process_flag(trap_exit,OldFlag), + ?line ok = receive X -> {error, X} after 300 -> ok end, + ?line test_server:timetrap_cancel(Dog), + ok. + +no_trap_exit_and_kill_ports(suite) -> + []; +no_trap_exit_and_kill_ports(doc) -> + ["Check delayed unload and reload with no trap_exit"]; +no_trap_exit_and_kill_ports(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line Parent = self(), + ?line OldFlag=process_flag(trap_exit,true), + ?line F3 = fun() -> + Parent ! erl_ddll:monitor(driver,{echo_drv,unloaded}), + receive X -> Parent ! {got,X} end + end, + ?line Pid = spawn(fun() -> + process_flag(trap_exit,false), + receive go -> ok end, + {ok, loaded} = erl_ddll:try_load(Path, echo_drv, + [{driver_options,[kill_ports]}]), + spawn(F3), + receive go -> ok end, + _Port = open_port({spawn, echo_drv}, [eof]), + _Port2 = open_port({spawn, echo_drv}, [eof]), + exit(banan) + end), + ?line Ref = erlang:monitor(process,Pid), + Pid ! go, + ?line {ok,Ref2} = receive + R when is_reference(R) -> {ok,R}; + Other -> {error, Other} + after 500 -> {error, timeout} + end, + ?line {error, inconsistent} = erl_ddll:try_load(Path, echo_drv, []), + ?line MyPort = open_port({spawn, echo_drv}, [eof]), + Pid ! go, + ?line ok = receive {'DOWN', Ref, process, Pid, banan} -> ok after 300 -> error end, + ?line ok = receive {got,{'DOWN', Ref2, driver, echo_drv, unloaded}} -> ok after 300 -> error end, + ?line ok = receive {'EXIT',MyPort,driver_unloaded} -> ok after 300 -> error end, + ?line process_flag(trap_exit,OldFlag), + ?line test_server:timetrap_cancel(Dog), + ok. + +monitor_demonitor(suite) -> + []; +monitor_demonitor(doc) -> + ["Check monitor and demonitor of drivers"]; +monitor_demonitor(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line erl_ddll:try_load(Path, echo_drv, []), + ?line Ref = erl_ddll:monitor(driver,{echo_drv,unloaded}), + ?line Self = self(), + ?line [{Self,1}] = erl_ddll:info(echo_drv,awaiting_unload), + ?line true = erl_ddll:demonitor(Ref), + ?line [] = erl_ddll:info(echo_drv,awaiting_unload), + ?line erl_ddll:try_unload(echo_drv,[]), + ?line ok = receive _ -> error after 300 -> ok end, + ?line test_server:timetrap_cancel(Dog), + ok. + +monitor_demonitor_load(suite) -> + []; +monitor_demonitor_load(doc) -> + ["Check monitor/demonitor of driver loading"]; +monitor_demonitor_load(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line {ok,loaded} = erl_ddll:try_load(Path, echo_drv, []), + ?line Port = open_port({spawn, echo_drv}, [eof]), + ?line Ref = erl_ddll:monitor(driver,{echo_drv,loaded}), + ?line ok = receive {'UP',Ref,driver,echo_drv,loaded} -> ok after 500 -> error end, + ?line {ok, pending_driver} = erl_ddll:try_unload(echo_drv,[]), + ?line Ref2 = erl_ddll:monitor(driver,{echo_drv,loaded}), + ?line ok = receive {'DOWN',Ref2,driver,echo_drv,load_cancelled} -> ok after 0 -> error end, + ?line {ok,already_loaded} = erl_ddll:try_load(Path, echo_drv, []), + ?line {ok, pending_driver} = + erl_ddll:try_load(Path, echo_drv, [{reload,pending_driver}]), + ?line Ref3 = erl_ddll:monitor(driver,{echo_drv,loaded}), + ?line Ref4 = erl_ddll:monitor(driver,{echo_drv,unloaded}), + ?line ok = receive _ -> error after 300 -> ok end, + ?line Self = self(), + ?line [{Self,1}] = erl_ddll:info(echo_drv,awaiting_load), + ?line true = erl_ddll:demonitor(Ref3), + ?line [] = erl_ddll:info(echo_drv,awaiting_load), + ?line erlang:port_close(Port), + ?line ok = receive {'DOWN',Ref4,driver,echo_drv,unloaded} -> ok after 300 -> error end, + ?line ok = receive _ -> error after 300 -> ok end, + ?line ok = unload_expect_fast(echo_drv,[]), + ?line test_server:timetrap_cancel(Dog), + ok. + +new_interface(suite) -> + []; +new_interface(doc) -> + ["Test the new load/unload/reload interface"]; +new_interface(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + % Typical scenario + ?line ok = erl_ddll:load(Path, echo_drv), + ?line Port = open_port({spawn, echo_drv}, [eof]), + ?line ok = erl_ddll:unload(echo_drv), + ?line Port ! {self(), {command, "text"}}, + ?line ok = receive + {Port, {data, "text"}} -> ok; + _ -> error + after + 1000 -> error + end, + ?line Ref = erl_ddll:monitor(driver,{echo_drv,unloaded}), + ?line ok = receive X -> {error, X} after 300 -> ok end, + ?line erlang:port_close(Port), + ?line ok = receive {'DOWN', Ref, driver, echo_drv, unloaded} -> ok after 300 -> error end, + % More than one user + ?line ok = erl_ddll:load(Path, echo_drv), + ?line Ref2 = erl_ddll:monitor(driver,{echo_drv,unloaded}), + ?line ok = erl_ddll:load(Path, echo_drv), + ?line ok = erl_ddll:load(Path, echo_drv), + ?line Port2 = open_port({spawn, echo_drv}, [eof]), + ?line ok = erl_ddll:unload(echo_drv), + ?line Port2 ! {self(), {command, "text"}}, + ?line ok = receive + {Port2, {data, "text"}} -> ok; + _ -> error + after + 1000 -> error + end, + ?line ok = erl_ddll:unload(echo_drv), + ?line Port2 ! {self(), {command, "text"}}, + ?line ok = receive + {Port2, {data, "text"}} -> ok; + _ -> error + after + 1000 -> error + end, + ?line ok = erl_ddll:unload(echo_drv), + ?line Port2 ! {self(), {command, "text"}}, + ?line ok = receive + {Port2, {data, "text"}} -> ok; + _ -> error + after + 1000 -> error + end, + ?line ok = receive X2 -> {error, X2} after 300 -> ok end, + ?line ok = erl_ddll:load(Path, echo_drv), + ?line ok = receive {'UP', Ref2, driver, echo_drv, unload_cancelled} -> ok after 300 -> error end, + ?line Ref3 = erl_ddll:monitor(driver,{echo_drv,unloaded_only}), + ?line erlang:port_close(Port2), + ?line ok = receive X3 -> {error, X3} after 300 -> ok end, + ?line ok = erl_ddll:unload(echo_drv), + ?line ok = receive {'DOWN', Ref3, driver, echo_drv, unloaded} -> ok after 300 -> error end, + ?line test_server:timetrap_cancel(Dog), + ok. + + + + +ddll_test(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + + %?line {error,{already_started,ErlDdllPid}} = erl_ddll:start(), + %?line ErlDdllPid = whereis(ddll_server), + + %% Load the echo driver and verify that it was loaded. + {ok,L1,L2}=load_echo_driver(Path), + + %% Verify that the driver works. + + ?line Port = open_port({spawn, echo_drv}, [eof]), + ?line {hej, "hopp",4711,123445567436543653} = + erlang:port_call(Port,{hej, "hopp",4711,123445567436543653}), + ?line {hej, "hopp",4711,123445567436543653} = + erlang:port_call(Port,47,{hej, "hopp",4711,123445567436543653}), + ?line Port ! {self(), {command, "text"}}, + ?line 1 = receive + {Port, {data, "text"}} -> 1; + _Other -> 2 + after + 1000 -> 2 + end, + ?line Port ! {self(), close}, + ?line receive {Port, closed} -> ok end, + +%% %% Unload the driver and verify that it was unloaded. + ok = unload_echo_driver(L1,L2), + +%% %?line {error, {already_started, _}} = erl_ddll:start(), + + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests errors having to do with bad drivers. + +errors(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + + ?line {ok, L1} = erl_ddll:loaded_drivers(), + + ?line {error, {open_error, _}} = erl_ddll:load_driver(Path, bad_name), + ?line {error, driver_init_failed} = erl_ddll:load_driver(Path, initfail_drv), + ?line {error, bad_driver_name} = erl_ddll:load_driver(Path, wrongname_drv), + + %% We assume that there is a statically linked driver named "ddll": + ?line {error, linked_in_driver} = erl_ddll:unload_driver(efile), + ?line {error, not_loaded} = erl_ddll:unload_driver("__pucko_driver__"), + + case os:type() of + {unix, _} -> + ?line {error, no_driver_init} = + erl_ddll:load_driver(Path, noinit_drv); + _ -> + ok + end, + + ?line {ok, L1} = erl_ddll:loaded_drivers(), + + ?line test_server:timetrap_cancel(Dog), + ok. + +reference_count(doc) -> + ["Check that drivers are unloaded when their reference count ", + "reaches zero, and that they cannot be unloaded while ", + "they are still referenced."]; +reference_count(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + + %% Spawn a process that loads the driver (and holds a reference + %% to it). + Pid1=spawn_link(?MODULE, echo_loader, [Path, self()]), + receive + {Pid1, echo_loaded} -> ok + after 2000 -> test_server:fail("echo_loader failed to start.") + end, + + Pid1 ! {self(), die}, + ?line test_server:sleep(200), % Give time to unload. + % Verify that the driver was automaticly unloaded when the + % process died. + ?line {error, not_loaded}=erl_ddll:unload_driver(echo_drv), + + ?line test_server:timetrap_cancel(Dog), + ok. + +% Loads the echo driver, send msg to started, sits and waits to +% get a signal to die, then unloads the driver and terminates. +echo_loader(Path, Starter) -> + ?line {ok, L1, L2}=load_echo_driver(Path), + ?line Starter ! {self(), echo_loaded}, + receive + {Starter, die} -> + ?line unload_echo_driver(L1,L2) + end. + +% Loads the echo driver, send msg to started, sits and waits to +% get a signal to die, then unloads the driver and terminates. +nice_echo_loader(Path, Starter) -> + ?line {ok, L1, L2}=load_nice_echo_driver(Path), + ?line Starter ! {self(), echo_loaded}, + receive + {Starter, die} -> + ?line unload_echo_driver(L1,L2) + end. + + +kill_port(doc) -> + ["Test that a port that uses a driver is killed when the ", + "process that loaded the driver dies."]; +kill_port(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + + %% Spawn a process that loads the driver (and holds a reference + %% to it). + ?line Pid1=spawn(?MODULE, echo_loader, [Path, self()]), + ?line receive + {Pid1, echo_loaded} -> + ok + after 3000 -> + ?line exit(Pid1, kill), + ?line test_server:fail("echo_loader failed to start.") + end, + + % Spawn off a port that uses the driver. + ?line Port = open_port({spawn, echo_drv}, [eof]), + + % Kill the process / unload the driver. + ?line process_flag(trap_exit, true), + ?line exit(Pid1, kill), + ?line test_server:sleep(200), % Give some time to unload. + ?line {error, not_loaded} = erl_ddll:unload_driver(echo_drv), + + % See if the port is killed. + receive + {'EXIT', Port, Reason} -> + io:format("Port exited with reason ~w", [Reason]) + after 5000 -> + ?line test_server:fail("Echo port did not terminate.") + end, + + %% Cleanup and exit. + ?line test_server:timetrap_cancel(Dog), + ok. + +dont_kill_port(doc) -> + ["Test that a port that uses a driver is not killed when the ", + "process that loaded the driver dies and it's nicely opened."]; +dont_kill_port(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + + %% Spawn a process that loads the driver (and holds a reference + %% to it). + ?line Pid1=spawn(?MODULE, nice_echo_loader, [Path, self()]), + ?line receive + {Pid1, echo_loaded} -> + ok + after 3000 -> + ?line exit(Pid1, kill), + ?line test_server:fail("echo_loader failed to start.") + end, + + % Spawn off a port that uses the driver. + ?line Port = open_port({spawn, echo_drv}, [eof]), + + % Kill the process / unload the driver. + ?line process_flag(trap_exit, true), + ?line exit(Pid1, kill), + ?line test_server:sleep(200), % Give some time to unload. + ?line {hej, "hopp",4711,123445567436543653} = + erlang:port_call(Port,{hej, "hopp",4711,123445567436543653}), + ?line [] = erl_ddll:info(echo_drv,processes), + %% unload should work with no owner + ?line ok = erl_ddll:unload_driver(echo_drv), %Kill ports while at it + + % See if the port is killed. + receive + {'EXIT', Port, Reason} -> + io:format("Port exited with reason ~w", [Reason]) + after 5000 -> + ?line test_server:fail("Echo port did not terminate.") + end, + + %% Cleanup and exit. + ?line test_server:timetrap_cancel(Dog), + ok. + +properties(doc) -> ["Test that a process that loaded a driver ", + "is the only process that can unload it."]; +properties(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + + % Let another process load the echo driver. + Pid=spawn_link(?MODULE, echo_loader, [Path, self()]), + receive + {Pid, echo_loaded} -> ok + after 2000 -> test_server:fail("echo_loader failed to start.") + end, + + % Try to unload the driver from this process (the wrong one). + ?line {error, _} = erl_ddll:unload_driver(echo_drv), + ?line {ok, Drivers} = erl_ddll:loaded_drivers(), + ?line case lists:member("echo_drv", Drivers) of + true -> + ok; + false -> + test_server:fail("Unload from wrong process " + "succeeded.") + end, + + % Unload the driver and terminate dummy process. + ?line Pid ! {self(), die}, + ?line test_server:sleep(200), % Give time to unload. + ?line test_server:timetrap_cancel(Dog), + ok. + +load_and_unload(doc) -> ["Load two drivers and unload them in load order."]; +load_and_unload(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(60)), + ?line Path = ?config(data_dir, Config), + ?line {ok, Loaded_drivers1} = erl_ddll:loaded_drivers(), + ?line ok = erl_ddll:load_driver(Path, echo_drv), + ?line ok = erl_ddll:load_driver(Path, dummy_drv), + ?line ok = erl_ddll:unload_driver(echo_drv), + ?line ok = erl_ddll:unload_driver(dummy_drv), + ?line {ok, Loaded_drivers2} = erl_ddll:loaded_drivers(), + ?line Set1 = ordsets:from_list(Loaded_drivers1), + ?line Set2 = ordsets:from_list(Loaded_drivers2), + ?line io:format("~p == ~p\n", [Loaded_drivers1, Loaded_drivers2]), + ?line [] = ordsets:to_list(ordsets:subtract(Set2, Set1)), + + ?line test_server:timetrap_cancel(Dog), + ok. + +lock_driver(suite) -> + []; +lock_driver(doc) -> + ["Check multiple calls to driver_lock_driver"]; +lock_driver(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line {ok, _} = erl_ddll:try_load(Path, lock_drv, []), + ?line Port1 = open_port({spawn, lock_drv}, [eof]), + ?line Port2 = open_port({spawn, lock_drv}, [eof]), + ?line true = erl_ddll:info(lock_drv,permanent), + ?line erlang:port_close(Port1), + ?line erlang:port_close(Port2), + ?line test_server:timetrap_cancel(Dog), + ok. + + +% Load and unload the echo_drv driver. +% Make sure that the driver doesn't exist before we load it, +% and that it exists before we unload it. +load_echo_driver(Path) -> + ?line {ok, L1} = erl_ddll:loaded_drivers(), + ?line ok = erl_ddll:load_driver(Path, echo_drv), + ?line {ok, L2} = erl_ddll:loaded_drivers(), + ?line ["echo_drv"] = ordsets:to_list(subtract(ordsets:from_list(L2), + ordsets:from_list(L1))), + {ok,L1,L2}. + +load_nice_echo_driver(Path) -> + ?line {ok, L1} = erl_ddll:loaded_drivers(), + ?line ok = erl_ddll:load(Path, echo_drv), + ?line {ok, L2} = erl_ddll:loaded_drivers(), + ?line ["echo_drv"] = ordsets:to_list(subtract(ordsets:from_list(L2), + ordsets:from_list(L1))), + {ok,L1,L2}. + +unload_echo_driver(L1,L2) -> + ?line {ok, L2} = erl_ddll:loaded_drivers(), + ?line ok = erl_ddll:unload_driver(echo_drv), + ?line {ok, L3} = erl_ddll:loaded_drivers(), + ?line [] = ordsets:to_list(subtract(ordsets:from_list(L3), + ordsets:from_list(L1))), + ok. + +unload_expect_fast(Driver,XFlags) -> + {ok, pending_driver, Ref} = + erl_ddll:try_unload(Driver, + [{monitor,pending_driver}]++XFlags), + receive + {'DOWN', Ref, driver, Driver, unloaded} -> + case lists:member(atom_to_list(Driver),element(2,erl_ddll:loaded_drivers())) of + true -> + {error, {still_there, Driver}}; + false -> + ok + end + after 1000 -> + {error,{unable_to_unload, Driver}} + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/decode_packet_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/decode_packet_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/decode_packet_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/decode_packet_SUITE.erl 2009-09-18 15:09:27.000000000 +0100 @@ -0,0 +1,514 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% Test suite for erlang:decode_packet/3 + +-module(decode_packet_SUITE). + +-include("test_server.hrl"). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + basic/1, packet_size/1, neg/1, http/1, line/1, ssl/1]). + +all(suite) -> + [basic, packet_size, neg, http, line, ssl]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Seed = {S1,S2,S3} = now(), + random:seed(S1,S2,S3), + io:format("*** SEED: ~p ***\n", [Seed]), + Dog=?t:timetrap(?t:minutes(1)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +basic(doc) -> []; +basic(suite) -> []; +basic(Config) when is_list(Config) -> + ?line Packet = <<101,22,203,54,175>>, + ?line Rest = <<123,34,0,250>>, + ?line Bin = <>, + ?line {ok, Bin, <<>>} = decode_pkt(raw,Bin), + + ?line {more, 5+1} = decode_pkt(1,<<5,1,2,3,4>>), + ?line {more, 5+2} = decode_pkt(2,<<0,5,1,2,3,4>>), + ?line {more, 5+4} = decode_pkt(4,<<0,0,0,5,1,2,3,4>>), + + ?line {more, undefined} = decode_pkt(1,<<>>), + ?line {more, undefined} = decode_pkt(2,<<0>>), + ?line {more, undefined} = decode_pkt(4,<<0,0,0>>), + + Types = [1,2,4,asn1,sunrm,cdr,fcgi,tpkt,ssl_tls], + + %% Run tests for different header types and bit offsets. + + lists:foreach(fun({Type,Bits})->basic_pack(Type,Packet,Rest,Bits), + more_length(Type,Packet,Bits) end, + [{T,B} || T<-Types, B<-lists:seq(0,32)]), + ok. + +basic_pack(Type,Body,Rest,BitOffs) -> + ?line {Bin,Unpacked,_} = pack(Type,Body,Rest,BitOffs), + ?line {ok, Unpacked, Rest} = decode_pkt(Type,Bin), + case Rest of + <<>> -> ok; + _ -> + ?line <<_:1,NRest/bits>> = Rest, + basic_pack(Type,Body,NRest,BitOffs) + end. + +more_length(Type,Body,BitOffs) -> + ?line {Bin,_,_} = pack(Type,Body,<<>>,BitOffs), + HdrSize = byte_size(Bin) - byte_size(Body), + more_length_do(Type,HdrSize,Bin,byte_size(Bin)). + +more_length_do(_,_,_,0) -> + ok; +more_length_do(Type,HdrSize,Bin,Size) -> + TrySize = (Size*3) div 4, + NSize = if TrySize < HdrSize -> Size - 1; + true -> TrySize + end, + {B1,_} = split_binary(Bin,NSize), + ?line {more, Length} = decode_pkt(Type,B1), + case Length of + L when L=:=byte_size(Bin) -> ok; + undefined when NSize ok + end, + more_length_do(Type,HdrSize,Bin,NSize). + + + +pack(Type,Packet,Rest) -> + {Bin,Unpacked} = pack(Type,Packet), + {<>,Unpacked}. + +%pack(0,B,R,Bits) -> +% pack(raw,B,R,Bits); +%pack(raw,Body,Rest,BitOffs) -> +% Orig = <<0:BitOffs,Body/binary,Rest/bits>>, +% <<_:BitOffs,Bin/bits>> = Orig, +% {Bin,<>,Orig}; +pack(Type,Body,Rest,BitOffs) -> + {Packet,Unpacked} = pack(Type,Body), + + %% Make Bin a sub-bin with an arbitrary bitoffset within Orig + Prefix = random:uniform(1 bsl BitOffs) - 1, + Orig = <>, + <<_:BitOffs,Bin/bits>> = Orig, + {Bin,Unpacked,Orig}. + +pack(1,Bin) -> + Psz = byte_size(Bin), + {<>, Bin}; +pack(2,Bin) -> + Psz = byte_size(Bin), + {<>, Bin}; +pack(4,Bin) -> + Psz = byte_size(Bin), + {<>, Bin}; +pack(asn1,Bin) -> + Ident = case random:uniform(3) of + 1 -> <<17>>; + 2 -> <<16#1f,16#81,17>>; + 3 -> <<16#1f,16#81,16#80,16#80,17>> + end, + Psz = byte_size(Bin), + Length = case random:uniform(4) of + 1 when Psz < 128 -> + <>; + R when R=<2 andalso Psz < 16#10000 -> + <<16#82,Psz:16>>; + R when R=<3 andalso Psz < 16#1000000 -> + <<16#83,Psz:24>>; + _ when Psz < 16#100000000 -> + <<16#84,Psz:32>> + end, + Res = <>, + {Res,Res}; +pack(sunrm,Bin) -> + Psz = byte_size(Bin), + Res = if Psz < 16#80000000 -> + <> + end, + {Res,Res}; +pack(cdr,Bin) -> + GIOP = <<"GIOP">>, + Major = random:uniform(256) - 1, + Minor = random:uniform(256) - 1, + MType = random:uniform(256) - 1, + Psz = byte_size(Bin), + Res = case random:uniform(2) of + 1 -> <>; + 2 -> <> + end, + {Res,Res}; +pack(fcgi,Bin) -> + Ver = 1, + Type = random:uniform(256) - 1, + Id = random:uniform(65536) - 1, + PaddSz = random:uniform(16) - 1, + Psz = byte_size(Bin), + Reserv = random:uniform(256) - 1, + Padd = case PaddSz of + 0 -> <<>>; + _ -> list_to_binary([random:uniform(256)-1 + || _<- lists:seq(1,PaddSz)]) + end, + Res = <>, + {<>, Res}; +pack(tpkt,Bin) -> + Ver = 3, + Reserv = random:uniform(256) - 1, + Size = byte_size(Bin) + 4, + Res = <>, + {Res, Res}; +pack(ssl_tls,Bin) -> + Content = case (random:uniform(256) - 1) of + C when C<128 -> C; + _ -> v2hello + end, + Major = random:uniform(256) - 1, + Minor = random:uniform(256) - 1, + pack_ssl(Content,Major,Minor,Bin). + +pack_ssl(Content, Major, Minor, Body) -> + case Content of + v2hello -> + Size = byte_size(Body), + Res = <<1:1,(Size+3):15, 1:8, Major:8, Minor:8, Body/binary>>, + C = 22, + Data = <<1:8, (Size+2):24, Major:8, Minor:8, Body/binary>>; + C when is_integer(C) -> + Size = byte_size(Body), + Res = <>, + Data = Body + end, + {Res, {ssl_tls,[],C,{Major,Minor}, Data}}. + + +packet_size(doc) -> []; +packet_size(suite) -> []; +packet_size(Config) when is_list(Config) -> + ?line Packet = <<101,22,203,54,175>>, + ?line Rest = <<123,34,0,250>>, + + F = fun({Type,Max})-> + ?line {Bin,Unpacked} = pack(Type,Packet,Rest), + ?line case decode_pkt(Type,Bin,[{packet_size,Max}]) of + {ok,Unpacked,Rest} when Max=:=0; Max>=byte_size(Packet) -> + ok; + {error,_} when Max + ok; + {error,_} when Type=:=fcgi, Max=/=0 -> + %% packet includes random amount of padding + ok + end + end, + ?line lists:foreach(F, [{T,D} || T<-[1,2,4,asn1,sunrm,cdr,fcgi,tpkt,ssl_tls], + D<-lists:seq(0, byte_size(Packet)*2)]), + + %% Test OTP-8102, "negative" 4-byte sizes. + lists:foreach(fun(Size) -> + ?line {error,_} = decode_pkt(4,<>) + end, + lists:seq(-10,-1)), + ok. + + +neg(doc) -> []; +neg(suite) -> []; +neg(Config) when is_list(Config) -> + ?line Bin = <<"dummy">>, + Fun = fun()->dummy end, + + BadargF = fun(T,B,Opts)-> {'EXIT',{badarg,_}} = (catch decode_pkt(T,B,Opts)) end, + + %% Invalid Type args + lists:foreach(fun(T)-> BadargF(T,Bin,[]) end, + [3,-1,5,2.0,{2},unknown,[],"line",Bin,Fun,self()]), + + %% Invalid Bin args + lists:foreach(fun(B)-> BadargF(0,B,[]) end, + [3,2.0,unknown,[],"Bin",[Bin],{Bin},Fun,self()]), + + %% Invalid options + InvOpts = [2,false,self(),Bin,"Options",Fun, + packet_size,{packet_size},{packet_size,0,false}, + {packet_size,-1},{packet_size,100.0},{packet_size,false}, + {line_length,-1},{line_length,100.0},{line_length,false}], + + lists:foreach(fun(Opt)-> BadargF(0,Bin,Opt), + BadargF(0,Bin,[Opt]), + BadargF(0,Bin,[Opt,{packet_size,1000}]), + BadargF(0,Bin,[{packet_size,1000},Opt]) end, + InvOpts), + ok. + + +http(doc) -> []; +http(suite) -> []; +http(Config) when is_list(Config) -> + ?line <<"foo">> = http_do(http_request("foo")), + ?line <<" bar">> = http_do(http_request(" bar")), + ?line <<"Hello!">> = http_do(http_response("Hello!")), + + %% Test all known header atoms + Val = "dummy value", + ValB = list_to_binary(Val), + Rest = <<"Rest">>, + HdrF = fun(Str,N) -> + ?line StrA = list_to_atom(Str), + ?line StrB = list_to_binary(Str), + ?line Bin = <>, + ?line {ok, {http_header,N,StrA,undefined,Val}, Rest} = decode_pkt(httph,Bin), + ?line {ok, {http_header,N,StrA,undefined,ValB}, Rest} = decode_pkt(httph_bin,Bin), + ?line N + 1 + end, + ?line lists:foldl(HdrF, 1, http_hdr_strings()), + + %% Test all known method atoms + MethF = fun(Meth) -> + ?line MethA = list_to_atom(Meth), + ?line MethB = list_to_binary(Meth), + ?line Bin = <>, + ?line {ok, {http_request,MethA,{abs_path,"/invalid/url"},{1,0}}, + Rest} = decode_pkt(http,Bin), + ?line {ok, {http_request,MethA,{abs_path,<<"/invalid/url">>},{1,0}}, + Rest} = decode_pkt(http_bin,Bin) + end, + ?line lists:foreach(MethF, http_meth_strings()), + + %% Test all uri variants + UriF = fun({Str,ResL,ResB}) -> + Bin = <<"GET ",(list_to_binary(Str))/binary," HTTP/1.1\r\n",Rest/binary>>, + {ok, {http_request, 'GET', ResL, {1,1}}, Rest} = decode_pkt(http,Bin), + {ok, {http_request, 'GET', ResB, {1,1}}, Rest} = decode_pkt(http_bin,Bin) + end, + lists:foreach(UriF, http_uri_variants()), + ok. + +http_with_bin(http) -> + http_bin; +http_with_bin(httph) -> + httph_bin. + +http_do(Tup) -> + http_do(Tup,http). +http_do({Bin, []}, _) -> + Bin; +http_do({Bin,[{_Line,PL,PB}|Tail]}, Type) -> + ?line {ok, PL, Rest} = decode_pkt(Type,Bin), + ?line {ok, PB, Rest} = decode_pkt(http_with_bin(Type),Bin), + + %% Same tests again but as SubBin + PreLen = random:uniform(64), + Prefix = random:uniform(1 bsl PreLen) - 1, + SufLen = random:uniform(64), + Suffix = random:uniform(1 bsl SufLen) - 1, + Orig = <>, + BinLen = bit_size(Bin), + <<_:PreLen, SubBin:BinLen/bits, _/bits>> = Orig, % Make SubBin + ?line SubBin = Bin, % just to make sure + + ?line {ok, PL, Rest} = decode_pkt(Type,SubBin), + ?line {ok, PB, Rest} = decode_pkt(http_with_bin(Type),SubBin), + http_do({Rest, Tail}, httph). + +http_request(Msg) -> + QnA = [{"POST /invalid/url HTTP/1.1\r\n", + {http_request, 'POST', {abs_path, "/invalid/url" }, {1,1}}, + {http_request, 'POST', {abs_path,<<"/invalid/url">>}, {1,1}}}, + {"Connection: close\r\n", + {http_header,2,'Connection',undefined, "close"}, + {http_header,2,'Connection',undefined,<<"close">>}}, + {"Host\t : localhost:8000\r\n", % white space before : + {http_header,14,'Host',undefined, "localhost:8000"}, + {http_header,14,'Host',undefined,<<"localhost:8000">>}}, + {"User-Agent: perl post\r\n", + {http_header,24,'User-Agent',undefined, "perl post"}, + {http_header,24,'User-Agent',undefined,<<"perl post">>}}, + {"Content-Length: 4\r\n", + {http_header,38,'Content-Length',undefined, "4"}, + {http_header,38,'Content-Length',undefined,<<"4">>}}, + {"Content-Type: text/xml; charset=utf-8\r\n", + {http_header,42,'Content-Type',undefined, "text/xml; charset=utf-8"}, + {http_header,42,'Content-Type',undefined,<<"text/xml; charset=utf-8">>}}, + {"Other-Field: with some text\r\n", + {http_header,0, "Other-Field" ,undefined, "with some text"}, + {http_header,0,<<"Other-Field">>,undefined,<<"with some text">>}}, + {"Multi-Line: Once upon a time in a land far far away,\r\n" + " there lived a princess imprisoned in the highest tower\r\n" + " of the most haunted castle.\r\n", + {http_header,0, "Multi-Line" ,undefined, "Once upon a time in a land far far away,\r\n there lived a princess imprisoned in the highest tower\r\n of the most haunted castle."}, + {http_header,0,<<"Multi-Line">>,undefined,<<"Once upon a time in a land far far away,\r\n there lived a princess imprisoned in the highest tower\r\n of the most haunted castle.">>}}, + {"\r\n", + http_eoh, + http_eoh}], + Bin = lists:foldl(fun({Line,_,_},Acc) -> LineBin = list_to_binary(Line), + <> end, + <<"">>, QnA), + MsgBin = list_to_binary(Msg), + {<>, QnA}. + + +http_response(Msg) -> + QnA = [{"HTTP/1.0 404 Object Not Found\r\n", + {http_response, {1,0}, 404, "Object Not Found"}, + {http_response, {1,0}, 404, <<"Object Not Found">>}}, + {"Server: inets/4.7.16\r\n", + {http_header, 30, 'Server', undefined, "inets/4.7.16"}, + {http_header, 30, 'Server', undefined, <<"inets/4.7.16">>}}, + {"Date: Fri, 04 Jul 2008 17:16:22 GMT\r\n", + {http_header, 3, 'Date', undefined, "Fri, 04 Jul 2008 17:16:22 GMT"}, + {http_header, 3, 'Date', undefined, <<"Fri, 04 Jul 2008 17:16:22 GMT">>}}, + {"Content-Type: text/html\r\n", + {http_header, 42, 'Content-Type', undefined, "text/html"}, + {http_header, 42, 'Content-Type', undefined, <<"text/html">>}}, + {"Content-Length: 207\r\n", + {http_header, 38, 'Content-Length', undefined, "207"}, + {http_header, 38, 'Content-Length', undefined, <<"207">>}}, + {"\r\n", + http_eoh, + http_eoh}], + + + + Bin = lists:foldl(fun({Line,_,_},Acc) -> LineBin = list_to_binary(Line), + <> end, + <<"">>, QnA), + MsgBin = list_to_binary(Msg), + {<>, QnA}. + +http_hdr_strings() -> + %% Must be correct order + ["Cache-Control","Connection","Date","Pragma","Transfer-Encoding", + "Upgrade","Via","Accept", "Accept-Charset", "Accept-Encoding", + "Accept-Language", "Authorization","From","Host","If-Modified-Since", + "If-Match","If-None-Match","If-Range","If-Unmodified-Since","Max-Forwards", + "Proxy-Authorization","Range","Referer","User-Agent","Age","Location", + "Proxy-Authenticate","Public","Retry-After","Server","Vary","Warning", + "Www-Authenticate","Allow","Content-Base","Content-Encoding", + "Content-Language","Content-Length","Content-Location","Content-Md5", + "Content-Range","Content-Type","Etag","Expires","Last-Modified", + "Accept-Ranges","Set-Cookie","Set-Cookie2","X-Forwarded-For","Cookie", + "Keep-Alive","Proxy-Connection"]. + +http_meth_strings() -> + ["OPTIONS", "GET", "HEAD", "POST", "PUT", "DELETE", "TRACE"]. + +http_uri_variants() -> + [{"*", '*', '*'}, + {"http://tools.ietf.org/html/rfc3986", + {absoluteURI,http, "tools.ietf.org", undefined, "/html/rfc3986"}, + {absoluteURI,http,<<"tools.ietf.org">>,undefined,<<"/html/rfc3986">>}}, + {"http://otp.ericsson.se:8000/product/internal/", + {absoluteURI,http, "otp.ericsson.se" ,8000, "/product/internal/"}, + {absoluteURI,http,<<"otp.ericsson.se">>,8000,<<"/product/internal/">>}}, + {"https://example.com:8042/over/there?name=ferret#nose", + {absoluteURI,https, "example.com", 8042, "/over/there?name=ferret#nose"}, + {absoluteURI,https,<<"example.com">>,8042,<<"/over/there?name=ferret#nose">>}}, + {"ftp://cnn.example.com&story=breaking_news@10.0.0.1/top_story.htm", + {scheme, "ftp", "//cnn.example.com&story=breaking_news@10.0.0.1/top_story.htm"}, + {scheme,<<"ftp">>,<<"//cnn.example.com&story=breaking_news@10.0.0.1/top_story.htm">>}}, + {"/some/absolute/path", + {abs_path, "/some/absolute/path"}, + {abs_path,<<"/some/absolute/path">>}}, + {"something_else", "something_else", <<"something_else">>}]. + + +line(doc) -> []; +line(suite) -> []; +line(Config) when is_list(Config) -> + Text = <<"POST /invalid/url HTTP/1.1\r\n" + "Connection: close\r\n" + "Host\t : localhost:8000\r\n" + "User-Agent: perl post\r\n" + "Content-Length: 4\r\n" + "Content-Type: text/xml; charset=utf-8\r\n" + "Other-Field: with some text\r\n" + "Multi-Line: Once upon a time in a land far far away,\r\n" + " there lived a princess imprisoned in the highest tower\r\n" + " of the most haunted castle.\r\n" + "\r\nThe residue">>, + + lists:foreach(fun(MaxLen) -> line_do(Text,MaxLen) end, + [0,7,19,29,37]), + ok. + +line_do(Bin,MaxLen) -> + Res = decode_pkt(line,Bin,[{line_length,MaxLen}]), + MyRes = decode_line(Bin,MaxLen), + ?line MyRes = Res, + case Res of + {ok,_,Rest} -> + line_do(Rest,MaxLen); + {more,undefined} -> + ok + end. + +% Emulates decode_packet(line,Bin,[{line_length,MaxLen}]) +decode_line(Bin,MaxLen) -> + ?line case find_in_binary($\n,Bin) of + notfound when MaxLen>0 andalso byte_size(Bin) >= MaxLen -> + {LineB,Rest} = split_binary(Bin,MaxLen), + {ok,LineB,Rest}; + notfound -> + {more,undefined}; + Pos when MaxLen>0 andalso Pos > MaxLen -> + {LineB,Rest} = split_binary(Bin,MaxLen), + {ok,LineB,Rest}; + Pos -> + {LineB,Rest} = split_binary(Bin,Pos), + {ok,LineB,Rest} + end. + +find_in_binary(Byte, Bin) -> + case string:chr(binary_to_list(Bin),Byte) of + 0 -> notfound; + P -> P + end. + +ssl(doc) -> []; +ssl(suite) -> []; +ssl(Config) when is_list(Config) -> + Major = 34, + Minor = 17, + Body = <<234,189,73,199,1,32,4,0,254>>, + Rest = <<23,123,203,12,234>>, + + F = fun(Content) -> + {Packet,Unpacked} = pack_ssl(Content, Major, Minor, Body), + Bin = <>, + ?line {ok, Unpacked, Rest} = decode_pkt(ssl_tls, Bin) + end, + F(25), + F(v2hello), + ok. + +decode_pkt(Type,Bin) -> + decode_pkt(Type,Bin,[]). +decode_pkt(Type,Bin,Opts) -> + %%io:format("decode_packet(~p,~p,~p)\n",[Type,Bin,Opts]), + Res = erlang:decode_packet(Type,Bin,Opts), + %%io:format(" -> ~p\n",[Res]), + Res. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/dgawd_handler.erl erlang-13.b.3-dfsg/erts/emulator/test/dgawd_handler.erl --- erlang-13.b.1-dfsg/erts/emulator/test/dgawd_handler.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/dgawd_handler.erl 2009-09-18 15:09:13.000000000 +0100 @@ -0,0 +1,118 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : dgawd_handler.erl +%%% Author : Rickard Green +%%% Description : Find out if Driver Gone Away Without Deselecting +%%% have been reported. +%%% +%%% Created : 13 Sep 2006 by Rickard Green +%%%------------------------------------------------------------------- +-module(dgawd_handler). +-behaviour(gen_event). + +%% API +-export([install/0, restore/0]). +-export([got_dgawd_report/0]). + +%% gen_event callbacks +-export([init/1, handle_event/2, handle_call/2, + handle_info/2, terminate/2, code_change/3]). + +%%==================================================================== +%% API +%%==================================================================== + +install() -> + gen_event:add_handler(error_logger, ?MODULE, []). + +restore() -> + gen_event:delete_handler(error_logger, ?MODULE, []). + +got_dgawd_report() -> + gen_event:call(error_logger, ?MODULE, got_dgawd_report, 10*60*1000). + +%%==================================================================== +%% gen_event callbacks +%%==================================================================== + +init([]) -> + {ok, false}. + +handle_event(_, true) -> + {ok, true}; +handle_event({_, _, {emulator, _,IOList}}, false) -> + {ok, dgawd(lists:flatten(IOList))}; +handle_event(_, State) -> + {ok, State}. + +handle_call(got_dgawd_report, State) -> + {ok, State, State}; +handle_call(_Query, _State) -> + {error, bad_query}. + +handle_info(_, State) -> + {ok, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%% +%% Internal functions +%% + +dgawd([]) -> + false; +dgawd([$d,$r,$i,$v,$e,$r|Cs]) -> + gawd(Cs); +dgawd([_|Cs]) -> + dgawd(Cs). + +gawd([]) -> + false; +gawd([$g,$o,$n,$e|Cs]) -> + awd(Cs); +gawd([_|Cs]) -> + gawd(Cs). + +awd([]) -> + false; +awd([$a,$w,$a,$y|Cs]) -> + wd(Cs); +awd([_|Cs]) -> + awd(Cs). + +wd([]) -> + false; +wd([$w,$i,$t,$h,$o,$u,$t|Cs]) -> + d(Cs); +wd([_|Cs]) -> + wd(Cs). + + +d([]) -> + false; +d([$d,$e,$s,$e,$l,$e,$c,$t,$i,$n,$g|_Cs]) -> + true; +d([_|Cs]) -> + d(Cs). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/hosts.dn_sp erlang-13.b.3-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/hosts.dn_sp --- erlang-13.b.1-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/hosts.dn_sp 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/hosts.dn_sp 1998-01-28 13:39:52.000000000 +0000 @@ -0,0 +1,7 @@ +# +# Internet host table +# +127.0.0.1 localhost +150.236.20.72 elrond +150.236.20.16 gandalf +150.236.20.99 gandalfina diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/hosts.underscore erlang-13.b.3-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/hosts.underscore --- erlang-13.b.1-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/hosts.underscore 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/hosts.underscore 1998-01-28 13:39:53.000000000 +0000 @@ -0,0 +1,7 @@ +# +# Internet host table +# +127.0.0.1 localhost +150.236.20.72 elrond loghost +150.236.20.16 gandalf +150.236.20.199 under_score diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/nsswitch.conf.dn_sp erlang-13.b.3-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/nsswitch.conf.dn_sp --- erlang-13.b.1-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/nsswitch.conf.dn_sp 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/nsswitch.conf.dn_sp 1998-01-28 13:39:55.000000000 +0000 @@ -0,0 +1,31 @@ +# +# /etc/nsswitch.nis: +# +# An example file that could be copied over to /etc/nsswitch.conf; it +# uses NIS (YP) in conjunction with files. +# +# "hosts:" and "services:" in this file are used only if the +# /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports. + +# the following two lines obviate the "+" entry in /etc/passwd and /etc/group. +passwd: files nis +group: files nis + +# consult /etc "files" only if nis is down. +hosts: nis [NOTFOUND=return] +networks: nis [NOTFOUND=return] files +protocols: nis [NOTFOUND=return] files +rpc: nis [NOTFOUND=return] files +ethers: nis [NOTFOUND=return] files +netmasks: nis [NOTFOUND=return] files +bootparams: nis [NOTFOUND=return] files +publickey: nis [NOTFOUND=return] files + +netgroup: nis + +automount: files nis +aliases: files nis + +# for efficient getservbyname() avoid nis +services: files nis +sendmailvars: files diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/resolv.conf.dn_sp erlang-13.b.3-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/resolv.conf.dn_sp --- erlang-13.b.1-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/resolv.conf.dn_sp 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/dist_init_unix_SUITE_data/resolv.conf.dn_sp 1998-01-28 13:39:57.000000000 +0000 @@ -0,0 +1,6 @@ +domain du.etx.ericsson.se +nameserver 150.236.14.16 +nameserver 150.236.16.2 +nameserver 130.100.128.25 +search du.etx.ericsson.se etx.ericsson.se ericsson.se +lookup yp bind file diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/distribution_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/distribution_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/distribution_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/distribution_SUITE_data/Makefile.src 1998-08-03 11:04:25.000000000 +0100 @@ -0,0 +1,4 @@ +all: run + +run: + @erl_name@ -compile run diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/distribution_SUITE_data/run.erl erlang-13.b.3-dfsg/erts/emulator/test/distribution_SUITE_data/run.erl --- erlang-13.b.1-dfsg/erts/emulator/test/distribution_SUITE_data/run.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/distribution_SUITE_data/run.erl 2009-11-20 13:30:41.000000000 +0000 @@ -0,0 +1,48 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(run). + +-compile(export_all). + +host() -> + from($@, atom_to_list(node())). + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(H, []) -> []. + +start() -> + net_kernel:start([fideridum,shortnames]), + {ok, Node} = slave:start(host(), heppel), + P = spawn(Node, a, b, []), + B1 = term_to_binary(P), + N1 = node(P), + ok = net_kernel:stop(), + N2 = node(P), + io:format("~w~n", [N1 == N2]), + if + N1 == N2 -> + init:stop(); + true -> + %% Make sure that the io:format/2 output is really written + %% (especially on Windows). + erlang:yield(), + init:stop() + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/distribution_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/distribution_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/distribution_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/distribution_SUITE.erl 2009-09-18 15:07:41.000000000 +0100 @@ -0,0 +1,1842 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(distribution_SUITE). + +%% Tests distribution and the tcp driver. + +-include("test_server.hrl"). + +-export([all/1, + ping/1, bulk_send/1, bulk_send_small/1, + bulk_send_big/1, + local_send/1, local_send_small/1, local_send_big/1, + local_send_legal/1, link_to_busy/1, exit_to_busy/1, + lost_exit/1, link_to_dead/1, link_to_dead_new_node/1, + applied_monitor_node/1, ref_port_roundtrip/1, nil_roundtrip/1, + trap_bif/1, trap_bif_1/1, trap_bif_2/1, trap_bif_3/1, + stop_dist/1, dist_auto_connect/1, + dist_auto_connect_never/1, dist_auto_connect_once/1, + dist_parallel_send/1, + atom_roundtrip/1, + atom_roundtrip_r12b/1, + contended_atom_cache_entry/1, + bad_dist_ext/1, + bad_dist_ext_receive/1, + bad_dist_ext_process_info/1, + bad_dist_ext_control/1, + bad_dist_ext_connection_id/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +%% Internal exports. +-export([sender/3, receiver2/2, dummy_waiter/0, dead_process/0, + roundtrip/1, bounce/1, do_dist_auto_connect/1, inet_rpc_server/1, + dist_parallel_sender/3, dist_parallel_receiver/0, + dist_evil_parallel_receiver/0]). + +all(suite) -> [ + ping, bulk_send, local_send, link_to_busy, exit_to_busy, + lost_exit, link_to_dead, link_to_dead_new_node, + applied_monitor_node, ref_port_roundtrip, nil_roundtrip, + stop_dist, trap_bif, dist_auto_connect, dist_parallel_send, + atom_roundtrip, atom_roundtrip_r12b, + contended_atom_cache_entry, + bad_dist_ext + ]. + +-define(DEFAULT_TIMETRAP, 4*60*1000). + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?t:timetrap(?DEFAULT_TIMETRAP), + [{watchdog, Dog},{testcase, Func}|Config]. + +fin_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +%%% Don't be too hard on vxworks, the cross server gets nodedown +%%% cause the card is too busy if we don't sleep a little between pings. +sleep() -> + case os:type() of + vxworks -> + receive + after 10 -> + ok + end; + _ -> + ok + end. + +ping(doc) -> + ["Tests pinging a node in different ways."]; +ping(Config) when is_list(Config) -> + Times = 1024, + + %% Ping a non-existing node many times. This used to crash the emulator + %% on Windows. + + ?line Host = hostname(), + ?line BadName = list_to_atom("__pucko__@" ++ Host), + ?line io:format("Pinging ~s (assumed to not exist)", [BadName]), + ?line test_server:do_times(Times, + fun() -> pang = net_adm:ping(BadName), + sleep() + end), + + %% Pings another node. + + ?line {ok, OtherNode} = start_node(distribution_SUITE_other), + ?line io:format("Pinging ~s (assumed to exist)", [OtherNode]), + ?line test_server:do_times(Times, fun() -> pong = net_adm:ping(OtherNode),sleep() end), + ?line stop_node(OtherNode), + + %% Pings our own node many times. + + ?line Node = node(), + ?line io:format("Pinging ~s (the same node)", [Node]), + ?line test_server:do_times(Times, fun() -> pong = net_adm:ping(Node),sleep() end), + + ok. + +bulk_send(doc) -> + ["Tests sending large amount of data to another node and measure", + "the time. This tests that a process that is suspended on a ", + "busy port will eventually be resumed."]; +bulk_send(suite) -> + [bulk_send_small, bulk_send_big]. + +bulk_send_small(Config) when is_list(Config) -> + ?line bulk_send(64, 32). + +bulk_send_big(Config) when is_list(Config) -> + ?line bulk_send(32, 64). + +bulk_send(Terms, BinSize) -> + ?line Dog = test_server:timetrap(test_server:seconds(30)), + + ?line io:format("Sending ~w binaries, each of size ~w K", + [Terms, BinSize]), + ?line {ok, Node} = start_node(bulk_receiver), + ?line Recv = spawn(Node, erlang, apply, [fun receiver/2, [0, 0]]), + ?line Bin = list_to_binary(lists:duplicate(BinSize*1024, 253)), + ?line Size = Terms*size(Bin), + ?line {Elapsed, {Terms, Size}} = test_server:timecall(?MODULE, sender, + [Recv, Bin, Terms]), + ?line stop_node(Node), + + ?line test_server:timetrap_cancel(Dog), + {comment, integer_to_list(trunc(Size/1024/Elapsed+0.5)) ++ " K/s"}. + +sender(To, _Bin, 0) -> + To ! {done, self()}, + receive + Any -> + Any + end; +sender(To, Bin, Left) -> + To ! {term, Bin}, + sender(To, Bin, Left-1). + +%% Receiver process to be run on a slave node. + +receiver(Terms, Size) -> + receive + {term, Bin} -> + receiver(Terms+1, Size+size(Bin)); + {done, ReplyTo} -> + ReplyTo ! {Terms, Size} + end. + + +local_send(suite) -> + [local_send_small, local_send_big, local_send_legal]; +local_send(doc) -> + ["Tests sending small and big messages to a non-existing ", + "local registered process."]. + +local_send_big(doc) -> + ["Sends several big message to an non-registered process on ", + "the local node."]; +local_send_big(Config) when is_list(Config) -> + Data0=local_send_big(doc)++local_send(doc), + Data1=[Data0,[Data0, Data0, [Data0], Data0],Data0], + Data2=Data0++lists:flatten(Data1)++ + list_to_binary(lists:flatten(Data1)), + Func=fun() -> Data2= {arbitrary_name, node()} ! Data2 end, + ?line test_server:do_times(4096, Func), + ok. + +local_send_small(doc) -> + ["Sends a small message to an non-registered process on the ", + "local node."]; +local_send_small(Config) when is_list(Config) -> + Data={some_stupid, "arbitrary", 'Data'}, + Func=fun() -> Data= {unregistered_name, node()} ! Data end, + ?line test_server:do_times(4096, Func), + ok. + +local_send_legal(doc) -> + ["Sends data to a registered process on the local node, ", + "as if it was on another node."]; +local_send_legal(Config) when is_list(Config) -> + Times=16384, + Data={local_send_legal(doc), local_send_legal(doc)}, + Pid=spawn(?MODULE,receiver2, [0, 0]) , + ?line true=register(registered_process, Pid), + + Func=fun() -> Data={registered_process, node()} ! Data end, + TotalSize=size(Data)*Times, + ?line test_server:do_times(Times, Func), + + % Check that all msgs really came through. + Me=self(), + ?line {done, Me}= + {registered_process, node()} ! {done, Me}, + receive + {Times, TotalSize} -> + ok; + _ -> + test_server:fail("Wrong number of msgs received.") + end, + ok. + +receiver2(Num, TotSize) -> + receive + {done, ReplyTo} -> + ReplyTo ! {Num, TotSize}; + Stuff -> + receiver2(Num+1, TotSize+size(Stuff)) + end. + +link_to_busy(doc) -> "Test that link/1 to a busy distribution port works."; +link_to_busy(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(30)), + ?line {ok, Node} = start_node(link_to_busy), + ?line Recv = spawn(Node, erlang, apply, [fun sink/1, [link_to_busy_sink]]), + + Tracer = case os:getenv("TRACE_BUSY_DIST_PORT") of + "true" -> start_busy_dist_port_tracer(); + _ -> false + end, + + %% We will spawn off a process which will try to link to the other + %% node. The linker process will not actually run until this + %% process is suspended due to the busy distribution port (because + %% of the big send). When the link/1 is run, the linker + %% process will block, too, because of the because busy port, + %% and will later be restarted. + + ?line do_busy_test(Node, fun () -> linker(Recv) end), + + %% Same thing, but we apply link/1 instead of calling it directly. + + ?line do_busy_test(Node, fun () -> applied_linker(Recv) end), + + %% Same thing again, but we apply link/1 in the tail of a function. + + ?line do_busy_test(Node, fun () -> tail_applied_linker(Recv) end), + + %% Done. + ?line stop_node(Node), + ?line stop_busy_dist_port_tracer(Tracer), + ?line test_server:timetrap_cancel(Dog), + ok. + +linker(Pid) -> + true = link(Pid), + {links, Links} = process_info(self(), links), + true = lists:member(Pid, Links). + +applied_linker(Pid) -> + true = apply(erlang, link, [Pid]), + {links, Links} = process_info(self(), links), + true = lists:member(Pid, Links). + +tail_applied_linker(Pid) -> + apply(erlang, link, [Pid]). + +exit_to_busy(doc) -> "Test that exit/2 to a busy distribution port works."; +exit_to_busy(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(30)), + ?line {ok, Node} = start_node(exit_to_busy), + + Tracer = case os:getenv("TRACE_BUSY_DIST_PORT") of + "true" -> start_busy_dist_port_tracer(); + _ -> false + end, + + %% We will spawn off a process which will try to exit a process on + %% the other node. That process will not actually run until this + %% process is suspended due to the busy distribution port + %% The process executing exit/2 will block, + %% too, because of the busy distribution port, and will be allowed + %% to continue when the port becomes non-busy. + + ?line Recv1 = spawn(Node, fun () -> sink(exit_to_busy_sink) end), + ?line M1 = erlang:monitor(process, Recv1), + ?line do_busy_test(Node, fun () -> joey_killer(Recv1) end), + ?line receive + {'DOWN', M1, process, Recv1, R1} -> + ?line joey_said_die = R1 + end, + + %% Same thing, but tail call to exit/2. + ?line Recv2 = spawn(Node, fun () -> sink(exit_to_busy_sink) end), + ?line M2 = erlang:monitor(process, Recv2), + ?line do_busy_test(Node, fun () -> tail_joey_killer(Recv2) end), + ?line receive + {'DOWN', M2, process, Recv2, R2} -> + ?line joey_said_die = R2 + end, + + %% Same thing, but we apply exit/2 instead of calling it directly. + ?line Recv3 = spawn(Node, fun () -> sink(exit_to_busy_sink) end), + ?line M3 = erlang:monitor(process, Recv3), + ?line do_busy_test(Node, fun () -> applied_joey_killer(Recv3) end), + ?line receive + {'DOWN', M3, process, Recv3, R3} -> + ?line joey_said_die = R3 + end, + + %% Same thing again, but we apply exit/2 in the tail of a function. + ?line Recv4 = spawn(Node, fun () -> sink(exit_to_busy_sink) end), + ?line M4 = erlang:monitor(process, Recv4), + ?line do_busy_test(Node, fun () -> tail_applied_joey_killer(Recv4) end), + ?line receive + {'DOWN', M4, process, Recv4, R4} -> + ?line joey_said_die = R4 + end, + + %% Done. + ?line stop_node(Node), + ?line stop_busy_dist_port_tracer(Tracer), + ?line test_server:timetrap_cancel(Dog), + ok. + +make_busy_data() -> + Size = 1024*1024, + Key = '__busy__port__data__', + case get(Key) of + undefined -> + Data = list_to_binary(lists:duplicate(Size, 253)), + put(Key, Data), + Data; + Data -> + true = is_binary(Data), + true = size(Data) == Size, + Data + end. + +make_busy(Node, Time) when is_integer(Time) -> + Own = 500, + freeze_node(Node, Time+Own), + Data = make_busy_data(), + %% first make port busy + Pid = spawn_link(fun () -> + forever(fun () -> + dport_reg_send(Node, + '__noone__', + Data) + end) + end), + receive after Own -> ok end, + until(fun () -> + case process_info(Pid, status) of + {status, suspended} -> true; + _ -> false + end + end), + %% then dist entry + make_busy(Node, [nosuspend], Data), + Pid. + +make_busy(Node, Opts, Data) -> + case erlang:send({'__noone__', Node}, Data, Opts) of + nosuspend -> nosuspend; + _ -> make_busy(Node, Opts, Data) + end. + +unmake_busy(Pid) -> + unlink(Pid), + exit(Pid, bang). + +do_busy_test(Node, Fun) -> + Busy = make_busy(Node, 1000), + {P, M} = spawn_monitor(Fun), + receive after 100 -> ok end, + Pinfo = process_info(P, [status, current_function]), + unmake_busy(Busy), + ?t:format("~p : ~p~n", [P, Pinfo]), + case Pinfo of + undefined -> + receive + {'DOWN', M, process, P, Reason} -> + ?t:format("~p died with exit reason ~p~n", [P, Reason]) + end, + ?t:fail(premature_death); + _ -> + %% Don't match arity; it is different in debug and + %% optimized emulator + [{status, suspended}, + {current_function, {erlang, bif_return_trap, _}}] = Pinfo, + receive + {'DOWN', M, process, P, Reason} -> + ?t:format("~p died with exit reason ~p~n", [P, Reason]), + normal = Reason + end + end. + +remote_is_process_alive(Pid) -> + rpc:call(node(Pid), erlang, is_process_alive, + [Pid]). + +joey_killer(Pid) -> + exit(Pid, joey_said_die), + until(fun () -> false == remote_is_process_alive(Pid) end). + +tail_joey_killer(Pid) -> + exit(Pid, joey_said_die). + +applied_joey_killer(Pid) -> + apply(erlang, exit, [Pid, joey_said_die]), + until(fun () -> false == remote_is_process_alive(Pid) end). + +tail_applied_joey_killer(Pid) -> + apply(erlang, exit, [Pid, joey_said_die]). + +sink(Name) -> + register(Name, self()), + sink1(). + +sink1() -> + receive + _Any -> sink1() + end. + +lost_exit(doc) -> + "Test that EXIT and DOWN messages send to another node are not lost if " + "if the distribution port is busy."; +lost_exit(Config) when is_list(Config) -> + ?line {ok, Node} = start_node(lost_exit), + + Tracer = case os:getenv("TRACE_BUSY_DIST_PORT") of + "true" -> start_busy_dist_port_tracer(); + _ -> false + end, + + Self = self(), + Die = make_ref(), + ?line R1 = spawn(fun () -> receive after infinity -> ok end end), + ?line MR1 = erlang:monitor(process, R1), + + ?line {L1, ML1} = spawn_monitor(fun() -> + link(R1), + Self ! {self(), linked}, + receive + Die -> + exit(controlled_suicide) + end + end), + + ?line R2 = spawn(fun () -> + M = erlang:monitor(process, L1), + receive + {'DOWN', M, process, L1, R} -> + Self ! {self(), got_down_message, L1, R} + end + end), + + ?line receive {L1, linked} -> ok end, + + Busy = make_busy(Node, 2000), + receive after 100 -> ok end, + L1 ! Die, + ?line receive + {'DOWN', ML1, process, L1, RL1} -> + ?line controlled_suicide = RL1 + end, + receive after 500 -> ok end, + unmake_busy(Busy), + + ?line receive + {'DOWN', MR1, process, R1, RR1} -> + ?line controlled_suicide = RR1 + end, + + ?line receive + {R2, got_down_message, L1, RR2} -> + ?line controlled_suicide = RR2 + end, + + %% Done. + ?line stop_busy_dist_port_tracer(Tracer), + ?line stop_node(Node), + ok. + +dummy_waiter() -> + receive + after infinity -> + ok + end. + +link_to_dead(doc) -> + ["Test that linking to a dead remote process gives an EXIT message ", + "AND that the link is teared down."]; +link_to_dead(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line {ok, Node} = start_node(link_to_dead), +% ?line monitor_node(Node, true), + ?line net_adm:ping(Node), %% Ts_cross_server workaround. + ?line Pid = spawn(Node, ?MODULE, dead_process, []), + receive + after 5000 -> ok + end, + ?line link(Pid), + ?line receive + {'EXIT', Pid, noproc} -> + ok; + Other -> + ?line test_server:fail({unexpected_message, Other}) + after 5000 -> + ?line test_server:fail(nothing_received) + end, + ?line {links, Links} = process_info(self(), links), + ?line io:format("Pid=~p, links=~p", [Pid, Links]), + ?line false = lists:member(Pid, Links), + ?line stop_node(Node), + ?line receive + Message -> + ?line test_server:fail({unexpected_message, Message}) + after 3000 -> + ok + end, + ok. + +dead_process() -> + erlang:error(die). + +link_to_dead_new_node(doc) -> + ["Test that linking to a pid on node that has gone and restarted gives ", + "the correct EXIT message (OTP-2304)."]; +link_to_dead_new_node(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + + %% Start the node, get a Pid and stop the node again. + ?line {ok, Node} = start_node(link_to_dead_new_node), + ?line Pid = spawn(Node, ?MODULE, dead_process, []), + ?line stop_node(Node), + + %% Start a new node with the same name. + ?line {ok, Node} = start_node(link_to_dead_new_node), + ?line link(Pid), + ?line receive + {'EXIT', Pid, noproc} -> + ok; + Other -> + ?line test_server:fail({unexpected_message, Other}) + after 5000 -> + ?line test_server:fail(nothing_received) + end, + + %% Make sure that the link wasn't created. + ?line {links, Links} = process_info(self(), links), + ?line io:format("Pid=~p, links=~p", [Pid, Links]), + ?line false = lists:member(Pid, Links), + ?line stop_node(Node), + ?line receive + Message -> + ?line test_server:fail({unexpected_message, Message}) + after 3000 -> + ok + end, + ok. + +applied_monitor_node(doc) -> + "Test that monitor_node/2 works when applied."; +applied_monitor_node(Config) when is_list(Config) -> + ?line NonExisting = list_to_atom("__non_existing__@" ++ hostname()), + + %% Tail-recursive call to apply (since the node is non-existing, + %% there will be a trap). + + ?line true = tail_apply(erlang, monitor_node, [NonExisting, true]), + ?line [{nodedown, NonExisting}] = test_server:messages_get(), + + %% Ordinary call (with trap). + + ?line true = apply(erlang, monitor_node, [NonExisting, true]), + ?line [{nodedown, NonExisting}] = test_server:messages_get(), + + ok. + +tail_apply(M, F, A) -> + apply(M, F, A). + +ref_port_roundtrip(doc) -> + "Test that sending a port or reference to another node and back again " + "doesn't correct them in any way."; +ref_port_roundtrip(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Port = open_port({spawn, efile}, []), + ?line Ref = make_ref(), + ?line {ok, Node} = start_node(ref_port_roundtrip), + ?line net_adm:ping(Node), + ?line Term = {Port, Ref}, + ?line io:format("Term before: ~p", [show_term(Term)]), + ?line Pid = spawn_link(Node, ?MODULE, roundtrip, [Term]), + ?line receive after 5000 -> ok end, + ?line stop_node(Node), + ?line receive + {'EXIT', Pid, {Port, Ref}} -> + ?line io:format("Term after: ~p", [show_term(Term)]), + ok; + Other -> + ?line io:format("Term after: ~p", [show_term(Term)]), + ?line test_server:fail({unexpected, Other}) + after 10000 -> + ?line test_server:fail(timeout) + end, + ok. + +roundtrip(Term) -> + exit(Term). + +nil_roundtrip(doc) -> + "Test that the smallest external term [] aka NIL can be sent to " + "another node node and back again."; +nil_roundtrip(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line {ok, Node} = start_node(nil_roundtrip), + ?line net_adm:ping(Node), + ?line Pid = spawn_link(Node, ?MODULE, bounce, [self()]), + ?line Pid ! [], + ?line receive + [] -> + ?line receive + {'EXIT', Pid, []} -> + ?line stop_node(Node), + ok + end + end. + +bounce(Dest) -> + receive Msg -> + Dest ! Msg, + exit(Msg) + end. + +show_term(Term) -> + binary_to_list(term_to_binary(Term)). + +stop_dist(doc) -> + ["Tests behaviour after net_kernel:stop (OTP-2586)."]; +stop_dist(Config) when is_list(Config) -> + ?line Str = os:cmd(atom_to_list(lib:progname()) + ++ " -noshell -pa " + ++ ?config(data_dir, Config) + ++ " -s run"), + %% The "true" may be followed by an error report, so ignore anything that + %% follows it. + ?line "true\n"++_ = Str, + + %% "May fail on FreeBSD due to differently configured name lookup - ask Arndt", + %% if you can find him. + + ok. + +trap_bif(doc) -> + ["Verifies that BIFs which are traps to Erlang work (OTP-2680)."]; +trap_bif(suite) -> [trap_bif_1, trap_bif_2, trap_bif_3]. + +trap_bif_1(doc) -> + [""]; +trap_bif_1(Config) when is_list(Config) -> + ?line {true} = tr1(), + ok. + +trap_bif_2(doc) -> + [""]; +trap_bif_2(Config) when is_list(Config) -> + ?line {true} = tr2(), + ok. + +trap_bif_3(doc) -> + [""]; +trap_bif_3(Config) when is_list(Config) -> + ?line {hoo} = tr3(), + ok. + +tr1() -> + ?line NonExisting = 'abc@boromir', + ?line X = erlang:monitor_node(NonExisting, true), + {X}. + +tr2() -> + ?line NonExisting = 'abc@boromir', + ?line X = apply(erlang, monitor_node, [NonExisting, true]), + {X}. + +tr3() -> + ?line NonExisting = 'abc@boromir', + ?line X = {NonExisting, glirp} ! hoo, + {X}. + + + +dist_auto_connect(doc) -> + ["Tests the kernel parameter 'dist_auto_connect'."]; +dist_auto_connect(suite) -> + [dist_auto_connect_never, dist_auto_connect_once]. + +% This has to be done by nodes with differrent cookies, otherwise global +% will connect nodes, which is correct, but makes it hard to test. +% * Start two nodes, n1 and n2. n2 with the dist_auto_connect once parameter +% * n2 pings n1 -> connection +% * check that they now know each other +% * Kill n1 +% * Make sure n2 gets pang when pinging n1 +% * restart n1 +% * Make sure n2 *still gets pang*! +% * Ping n2 from n1 -> pong +% * n2 now also gets pong when pinging n1 +% * disconnect n2 from n1 +% * n2 gets pang when pinging n1 +% * n2 forces connection by using net_kernel:connect_node (ovverrides) +% * n2 gets pong when pinging n1. +dist_auto_connect_once(doc) -> "Test the dist_auto_connect once kernel parameter"; +dist_auto_connect_once(Config) when is_list(Config) -> + ?line Sock = start_relay_node(dist_auto_connect_relay_node,[]), + ?line NN = inet_rpc_nodename(Sock), + ?line Sock2 = start_relay_node(dist_auto_connect_once_node, + "-kernel dist_auto_connect once"), + ?line NN2 = inet_rpc_nodename(Sock2), + ?line {ok,[]} = do_inet_rpc(Sock,erlang,nodes,[]), + ?line {ok, pong} = do_inet_rpc(Sock2,net_adm,ping,[NN]), + ?line {ok,[NN2]} = do_inet_rpc(Sock,erlang,nodes,[]), + ?line {ok,[NN]} = do_inet_rpc(Sock2,erlang,nodes,[]), + ?line [_,HostPartPeer] = string:tokens(atom_to_list(NN),"@"), + ?line [_,MyHostPart] = string:tokens(atom_to_list(node()),"@"), + % Give net_kernel a chance to change the state of the node to up to. + ?line receive after 1000 -> ok end, + case HostPartPeer of + MyHostPart -> + ?line ok = stop_relay_node(Sock), + ?line {ok,pang} = do_inet_rpc(Sock2,net_adm,ping,[NN]); + _ -> + ?line {ok, true} = do_inet_rpc(Sock,net_kernel,disconnect,[NN2]), + receive + after 500 -> ok + end + end, + ?line {ok, []} = do_inet_rpc(Sock2,erlang,nodes,[]), + Sock3 = case HostPartPeer of + MyHostPart -> + ?line start_relay_node(dist_auto_connect_relay_node,[]); + _ -> + Sock + end, + ?line TS1 = timestamp(), + ?line {ok, pang} = do_inet_rpc(Sock2,net_adm,ping,[NN]), + ?line TS2 = timestamp(), + RefT = net_kernel:connecttime() - 1000, + ?line true = ((TS2 - TS1) < RefT), + ?line TS3 = timestamp(), + ?line {ok, true} = do_inet_rpc(Sock2,erlang,monitor_node, + [NN,true,[allow_passive_connect]]), + ?line TS4 = timestamp(), + ?line true = ((TS4 - TS3) > RefT), + ?line {ok, pong} = do_inet_rpc(Sock3,net_adm,ping,[NN2]), + ?line {ok, pong} = do_inet_rpc(Sock2,net_adm,ping,[NN]), + ?line {ok, true} = do_inet_rpc(Sock3,net_kernel,disconnect,[NN2]), + receive + after 500 -> ok + end, + ?line {ok, pang} = do_inet_rpc(Sock2,net_adm,ping,[NN]), + ?line {ok, true} = do_inet_rpc(Sock2,net_kernel,connect_node,[NN]), + ?line {ok, pong} = do_inet_rpc(Sock2,net_adm,ping,[NN]), + ?line stop_relay_node(Sock3), + ?line stop_relay_node(Sock2). + + + +%% Start a relay node and a lonely (dist_auto_connect never) node. +%% Lonely node pings relay node. That should fail. +%% Lonely node connects to relay node with net_kernel:connect_node/1. +%% Result is sent here through relay node. +dist_auto_connect_never(Config) when is_list(Config) -> + Self = self(), + ?line {ok, RelayNode} = + start_node(dist_auto_connect_relay), + ?line spawn(RelayNode, + fun() -> + register(dist_auto_connect_relay, self()), + dist_auto_connect_relay(Self) + end), + ?line {ok, Handle} = dist_auto_connect_start(dist_auto_connect, never), + ?line Result = + receive + {do_dist_auto_connect, ok} -> + ok; + {do_dist_auto_connect, Error} -> + {error, Error}; + Other -> + {error, Other} + after 32000 -> + timeout + end, + ?line stop_node(RelayNode), + ?line Stopped = dist_auto_connect_stop(Handle), + ?line Junk = + receive + {do_dist_auto_connect, _} = J -> + J + after 0 -> + ok + end, + ?line {ok, ok, ok} = {Result, Stopped, Junk}, + ok. + + +do_dist_auto_connect([never]) -> + Node = list_to_atom("dist_auto_connect_relay@" ++ hostname()), + io:format("~p:do_dist_auto_connect([false]) Node=~p~n", + [?MODULE, Node]), + Ping = net_adm:ping(Node), + io:format("~p:do_dist_auto_connect([false]) Ping=~p~n", + [?MODULE, Ping]), + Result = case Ping of + pang -> ok; + _ -> {error, Ping} + end, + io:format("~p:do_dist_auto_connect([false]) Result=~p~n", + [?MODULE, Result]), + net_kernel:connect_node(Node), + catch {dist_auto_connect_relay, Node} ! {do_dist_auto_connect, Result}; +% receive after 1000 -> ok end, +% halt(); + +do_dist_auto_connect(Arg) -> + io:format("~p:do_dist_auto_connect(~p)~n", + [?MODULE, Arg]), + receive after 10000 -> ok end, + halt(). + + +dist_auto_connect_start(Name, Value) when is_atom(Name) -> + dist_auto_connect_start(atom_to_list(Name), Value); +dist_auto_connect_start(Name, Value) when is_list(Name), is_atom(Value) -> + Node = list_to_atom(lists:append([Name, "@", hostname()])), + ModuleDir = filename:dirname(code:which(?MODULE)), + ValueStr = atom_to_list(Value), + Cookie = atom_to_list(erlang:get_cookie()), + Cmd = lists:concat( + [%"xterm -e ", + atom_to_list(lib:progname()), +% " -noinput ", + " -detached ", + long_or_short(), " ", Name, + " -setcookie ", Cookie, + " -pa ", ModuleDir, + " -s ", atom_to_list(?MODULE), + " do_dist_auto_connect ", ValueStr, + " -kernel dist_auto_connect ", ValueStr]), + io:format("~p:dist_auto_connect_start() cmd: ~p~n", [?MODULE, Cmd]), + Port = open_port({spawn, Cmd}, [stream]), + {ok, {Port, Node}}. + + +dist_auto_connect_stop({Port, Node}) -> + Pid = spawn_link(fun() -> rpc:call(Node, erlang, halt, []) end), + dist_auto_connect_stop(Port, Node, Pid, 5000). + +dist_auto_connect_stop(Port, _Node, Pid, N) when is_integer(N), N =< 0 -> + exit(Pid, normal), + catch erlang:port_close(Port), + Result = {error, node_not_down}, + io:format("~p:dist_auto_connect_stop() ~p~n", [?MODULE, Result]), + Result; +dist_auto_connect_stop(Port, Node, Pid, N) when is_integer(N) -> + case net_adm:ping(Node) of + pong -> + receive after 100 -> ok end, + dist_auto_connect_stop(Port, Node, Pid, N-100); + pang -> + exit(Pid, normal), + catch erlang:port_close(Port), + io:format("~p:dist_auto_connect_stop() ok~n", [?MODULE]), + ok + end. + + +dist_auto_connect_relay(Parent) -> + receive X -> + catch Parent ! X + end, + dist_auto_connect_relay(Parent). + + +dist_parallel_send(doc) -> + []; +dist_parallel_send(suite) -> + []; +dist_parallel_send(Config) when is_list(Config) -> + ?line {ok, RNode} = start_node(dist_parallel_receiver), + ?line {ok, SNode} = start_node(dist_parallel_sender), + ?line WatchDog = spawn_link( + fun () -> + TRef = erlang:start_timer((?DEFAULT_TIMETRAP + div 2), + self(), + oops), + receive + {timeout, TRef, _ } -> + spawn(SNode, + fun () -> + abort(timeout) + end), + spawn(RNode, + fun () -> + abort(timeout) + end) +%% rpc:cast(SNode, erlang, halt, +%% ["Timetrap (sender)"]), +%% rpc:cast(RNode, erlang, halt, +%% ["Timetrap (receiver)"]) + end + end), + ?line MkSndrs = fun (Receiver) -> + lists:map(fun (_) -> + spawn_link(SNode, + ?MODULE, + dist_parallel_sender, + [self(), + Receiver, + 1000]) + end, + lists:seq(1, 64)) + end, + ?line SndrsStart = fun (Sndrs) -> + Parent = self(), + spawn_link( + SNode, + fun () -> + lists:foreach(fun (P) -> + P ! {go, Parent} + end, + Sndrs) + end) + end, + ?line SndrsWait = fun (Sndrs) -> + lists:foreach(fun (P) -> + receive {P, done} -> ok end + end, + Sndrs) + end, + ?line DPR = spawn_link(RNode, ?MODULE, dist_parallel_receiver, []), + ?line Sndrs1 = MkSndrs(DPR), + ?line SndrsStart(Sndrs1), + ?line SndrsWait(Sndrs1), + ?line unlink(DPR), + ?line exit(DPR, bang), + + ?line DEPR = spawn_link(RNode, ?MODULE, dist_evil_parallel_receiver, []), + ?line Sndrs2 = MkSndrs(DEPR), + ?line SndrsStart(Sndrs2), + ?line SndrsWait(Sndrs2), + ?line unlink(DEPR), + ?line exit(DEPR, bang), + + ?line unlink(WatchDog), + ?line exit(WatchDog, bang), + + ?line stop_node(RNode), + ?line stop_node(SNode), + + ?line ok. + +do_dist_parallel_sender(Parent, _Receiver, 0) -> + Parent ! {self(), done}; +do_dist_parallel_sender(Parent, Receiver, N) -> + Receiver ! {self(), "Some data"}, + do_dist_parallel_sender(Parent, Receiver, N-1). + +dist_parallel_sender(Parent, Receiver, N) -> + receive {go, Parent} -> ok end, + do_dist_parallel_sender(Parent, Receiver, N). + +dist_parallel_receiver() -> + receive {_Sender, _Data} -> ok end, + dist_parallel_receiver(). + +dist_evil_parallel_receiver() -> + receive {Sender, _Data} -> ok end, + net_kernel:disconnect(node(Sender)), + dist_evil_parallel_receiver(). + +atom_roundtrip(Config) when is_list(Config) -> + ?line AtomData = atom_data(), + ?line verify_atom_data(AtomData), + ?line {ok, Node} = start_node(Config), + ?line do_atom_roundtrip(Node, AtomData), + ?line stop_node(Node), + ?line ok. + +atom_roundtrip_r12b(Config) when is_list(Config) -> + case ?t:is_release_available("r12b") of + true -> + ?line AtomData = atom_data(), + ?line verify_atom_data(AtomData), + ?line {ok, Node} = start_node(Config, [], "r12b"), + ?line do_atom_roundtrip(Node, AtomData), + ?line stop_node(Node), + ?line ok; + false -> + ?line {skip,"No OTP R12B available"} + end. + +do_atom_roundtrip(Node, AtomData) -> + ?line Parent = self(), + ?line Proc = spawn_link(Node, fun () -> verify_atom_data_loop(Parent) end), + ?line Proc ! {self(), AtomData}, + ?line receive {Proc, AD1} -> AtomData = AD1 end, + ?line Proc ! {self(), AtomData}, + ?line receive {Proc, AD2} -> AtomData = AD2 end, + ?line RevAtomData = lists:reverse(AtomData), + ?line Proc ! {self(), RevAtomData}, + ?line receive {Proc, RAD1} -> RevAtomData = RAD1 end, + ?line unlink(Proc), + ?line exit(Proc, bang), + ?line ok. + +verify_atom_data_loop(From) -> + receive + {From, AtomData} -> + verify_atom_data(AtomData), + From ! {self(), AtomData}, + verify_atom_data_loop(From) + end. + +atom_data() -> + lists:map(fun (N) -> + ATxt = "a"++integer_to_list(N), + {list_to_atom(ATxt), ATxt} + end, + lists:seq(1, 2000)). + +verify_atom_data(AtomData) -> + lists:foreach(fun ({Atom, AtomTxt}) -> + AtomTxt = atom_to_list(Atom) + end, + AtomData). + +contended_atom_cache_entry(Config) when is_list(Config) -> + ?line TestServer = self(), + ?line ProcessPairs = 10, + ?line Msgs = 100000, + ?line {ok, SNode} = start_node(Config), + ?line {ok, RNode} = start_node(Config), + ?line Success = make_ref(), + ?line Mstr + = spawn_link( + SNode, + fun () -> + erts_debug:set_internal_state(available_internal_state, + true), + Master = self(), + CIX = get_cix(), + TestAtoms = get_conflicting_atoms(CIX, ProcessPairs), + io:format("Testing with the following atoms all using " + "cache index ~p:~n ~p~n", + [CIX, TestAtoms]), + Ps = lists:map( + fun (A) -> + Ref = make_ref(), + R = spawn_link( + RNode, + fun () -> + Atom = receive + {Ref, txt, ATxt} -> + list_to_atom( + ATxt) + end, + receive_ref_atom(Ref, + Atom, + Msgs), + Master ! {self(), success} + end), + S = spawn_link( + SNode, + fun () -> + receive go -> ok end, + R ! {Ref, + txt, + atom_to_list(A)}, + send_ref_atom(R, Ref, A, Msgs) + end), + {S, R} + end, + TestAtoms), + lists:foreach(fun ({S, _}) -> + S ! go + end, + Ps), + lists:foreach(fun ({_, R}) -> + receive {R, success} -> ok end + end, + Ps), + TestServer ! Success + end), + ?line receive + Success -> + ok + end, + ?line stop_node(SNode), + ?line stop_node(RNode), + ?line ok. + +send_ref_atom(To, Ref, Atom, 0) -> + ok; +send_ref_atom(To, Ref, Atom, N) -> + To ! {Ref, Atom}, + send_ref_atom(To, Ref, Atom, N-1). + +receive_ref_atom(Ref, Atom, 0) -> + ok; +receive_ref_atom(Ref, Atom, N) -> + receive + {Ref, Value} -> + Atom = Value + end, + receive_ref_atom(Ref, Atom, N-1). + +get_cix() -> + get_cix(1000). + +get_cix(CIX) when is_integer(CIX), CIX < 0 -> + get_cix(0); +get_cix(CIX) when is_integer(CIX) -> + get_cix(CIX, + unwanted_cixs(), + erts_debug:get_internal_state(max_atom_out_cache_index)). + +get_cix(CIX, Unwanted, MaxCIX) when CIX > MaxCIX -> + get_cix(0, Unwanted, MaxCIX); +get_cix(CIX, Unwanted, MaxCIX) -> + case lists:member(CIX, Unwanted) of + true -> get_cix(CIX+1, Unwanted, MaxCIX); + false -> CIX + end. + +unwanted_cixs() -> + lists:map(fun (Node) -> + erts_debug:get_internal_state({atom_out_cache_index, + Node}) + end, + nodes()). + + +get_conflicting_atoms(CIX, 0) -> + []; +get_conflicting_atoms(CIX, N) -> + {A, B, C} = now(), + Atom = list_to_atom("atom" ++ integer_to_list(A*1000000000000 + + B*1000000 + + C)), + case erts_debug:get_internal_state({atom_out_cache_index, Atom}) of + CIX -> + [Atom|get_conflicting_atoms(CIX, N-1)]; + _ -> + get_conflicting_atoms(CIX, N) + end. + + +bad_dist_ext(doc) -> []; +bad_dist_ext(suite) -> + [bad_dist_ext_receive, + bad_dist_ext_process_info, + bad_dist_ext_control, + bad_dist_ext_connection_id]. + + +bad_dist_ext_receive(Config) when is_list(Config) -> + ?line {ok, Offender} = start_node(bad_dist_ext_receive_offender), + ?line {ok, Victim} = start_node(bad_dist_ext_receive_victim), + ?line start_node_monitors([Offender,Victim]), + + ?line Parent = self(), + + ?line P = spawn_link(Victim, + fun () -> + Parent ! {self(), started}, + receive check_msgs -> ok end, + bad_dist_ext_check_msgs([one, + two, + three]), + Parent ! {self(), messages_checked}, + receive done -> ok end + end), + + ?line receive {P, started} -> ok end, + ?line pong = rpc:call(Victim, net_adm, ping, [Offender]), + ?line verify_up(Offender, Victim), + ?line true = lists:member(Offender, rpc:call(Victim, erlang, nodes, [])), + ?line P ! one, + ?line send_bad_msg(Offender, P), + ?line P ! two, + ?line verify_down(Offender, connection_closed, Victim, killed), + ?line {message_queue_len, 2} + = rpc:call(Victim, erlang, process_info, [P, message_queue_len]), + + ?line Suspended = make_ref(), + ?line S = spawn(Victim, + fun () -> + erlang:suspend_process(P), + Parent ! Suspended, + receive after infinity -> ok end + end), + ?line MS = erlang:monitor(process, S), + ?line receive Suspended -> ok end, + ?line pong = rpc:call(Victim, net_adm, ping, [Offender]), + ?line verify_up(Offender, Victim), + ?line true = lists:member(Offender, rpc:call(Victim, erlang, nodes, [])), + ?line send_bad_msgs(Offender, P, 5), + ?line true = lists:member(Offender, rpc:call(Victim, erlang, nodes, [])), + ?line P ! three, + ?line send_bad_msgs(Offender, P, 5), + + %% Make sure bad msgs has reached Victim + ?line rpc:call(Offender, rpc, call, [Victim, erlang, node, []]), + + ?line verify_still_up(Offender, Victim), + ?line {message_queue_len, 13} + = rpc:call(Victim, erlang, process_info, [P, message_queue_len]), + + ?line exit(S, bang), + ?line receive {'DOWN', MS, process, S, bang} -> ok end, + ?line verify_down(Offender, connection_closed, Victim, killed), + ?line {message_queue_len, 3} + = rpc:call(Victim, erlang, process_info, [P, message_queue_len]), + + ?line P ! check_msgs, + ?line receive {P, messages_checked} -> ok end, + + ?line {message_queue_len, 0} + = rpc:call(Victim, erlang, process_info, [P, message_queue_len]), + + ?line P ! done, + ?line unlink(P), + ?line verify_no_down(Offender, Victim), + ?line stop_node(Offender), + ?line stop_node(Victim). + + +bad_dist_ext_process_info(Config) when is_list(Config) -> + ?line {ok, Offender} = start_node(bad_dist_ext_process_info_offender), + ?line {ok, Victim} = start_node(bad_dist_ext_process_info_victim), + ?line start_node_monitors([Offender,Victim]), + + ?line Parent = self(), + ?line P = spawn_link(Victim, + fun () -> + Parent ! {self(), started}, + receive check_msgs -> ok end, + bad_dist_ext_check_msgs([one, two]), + Parent ! {self(), messages_checked}, + receive done -> ok end + end), + + ?line receive {P, started} -> ok end, + ?line P ! one, + + ?line Suspended = make_ref(), + ?line S = spawn(Victim, + fun () -> + erlang:suspend_process(P), + Parent ! Suspended, + receive after infinity -> ok end + end), + + ?line receive Suspended -> ok end, + ?line pong = rpc:call(Victim, net_adm, ping, [Offender]), + ?line verify_up(Offender, Victim), + ?line send_bad_msgs(Offender, P, 5), + + ?line P ! two, + ?line send_bad_msgs(Offender, P, 5), + + %% Make sure bad msgs has reached Victim + ?line rpc:call(Offender, rpc, call, [Victim, erlang, node, []]), + + ?line verify_still_up(Offender, Victim), + ?line {message_queue_len, 12} + = rpc:call(Victim, erlang, process_info, [P, message_queue_len]), + ?line verify_still_up(Offender, Victim), + ?line [{message_queue_len, 2}, + {messages, [one, two]}] + = rpc:call(Victim, erlang, process_info, [P, [message_queue_len, + messages]]), + ?line verify_down(Offender, connection_closed, Victim, killed), + + ?line P ! check_msgs, + ?line exit(S, bang), + ?line receive {P, messages_checked} -> ok end, + + ?line {message_queue_len, 0} + = rpc:call(Victim, erlang, process_info, [P, message_queue_len]), + + ?line P ! done, + ?line unlink(P), + ?line verify_no_down(Offender, Victim), + ?line stop_node(Offender), + ?line stop_node(Victim). + +bad_dist_ext_control(Config) when is_list(Config) -> + ?line {ok, Offender} = start_node(bad_dist_ext_control_offender), + ?line {ok, Victim} = start_node(bad_dist_ext_control_victim), + ?line start_node_monitors([Offender,Victim]), + + ?line pong = rpc:call(Victim, net_adm, ping, [Offender]), + ?line verify_up(Offender, Victim), + ?line send_bad_dhdr(Offender, Victim), + ?line verify_down(Offender, connection_closed, Victim, killed), + + ?line pong = rpc:call(Victim, net_adm, ping, [Offender]), + ?line verify_up(Offender, Victim), + ?line send_bad_ctl(Offender, Victim), + ?line verify_down(Offender, connection_closed, Victim, killed), + + ?line verify_no_down(Offender, Victim), + ?line stop_node(Offender), + ?line stop_node(Victim). + +bad_dist_ext_connection_id(Config) when is_list(Config) -> + ?line {ok, Offender} = start_node(bad_dist_ext_receive_offender), + ?line {ok, Victim} = start_node(bad_dist_ext_receive_victim), + ?line start_node_monitors([Offender,Victim]), + + ?line Parent = self(), + ?line P = spawn_link(Victim, + fun () -> + Parent ! {self(), started}, + receive check_msgs -> ok end, + bad_dist_ext_check_msgs([]), + Parent ! {self(), messages_checked}, + receive done -> ok end + end), + + ?line receive {P, started} -> ok end, + ?line Suspended = make_ref(), + ?line S = spawn(Victim, + fun () -> + erlang:suspend_process(P), + Parent ! Suspended, + receive after infinity -> ok end + end), + ?line MS = erlang:monitor(process, S), + ?line receive Suspended -> ok end, + ?line pong = rpc:call(Victim, net_adm, ping, [Offender]), + ?line verify_up(Offender, Victim), + ?line send_bad_msg(Offender, P), + + %% Make sure bad msg has reached Victim + ?line rpc:call(Offender, rpc, call, [Victim, erlang, node, []]), + + ?line {message_queue_len, 1} + = rpc:call(Victim, erlang, process_info, [P, message_queue_len]), + + ?line true = rpc:call(Offender, net_kernel, disconnect, [Victim]), + ?line verify_down(Offender, disconnect, Victim, connection_closed), + ?line pong = rpc:call(Offender, net_adm, ping, [Victim]), + + ?line verify_up(Offender, Victim), + %% We have a new connection between Offender and Victim, bad message + %% should not bring it down. + + ?line {message_queue_len, 1} + = rpc:call(Victim, erlang, process_info, [P, message_queue_len]), + + ?line exit(S, bang), + ?line receive {'DOWN', MS, process, S, bang} -> ok end, + %% Wait for a while (if the connection is taken down it might take a + %% while). + ?line receive after 2000 -> ok end, + ?line verify_still_up(Offender, Victim), + + ?line P ! check_msgs, + ?line receive {P, messages_checked} -> ok end, + + ?line {message_queue_len, 0} + = rpc:call(Victim, erlang, process_info, [P, message_queue_len]), + + ?line verify_still_up(Offender, Victim), + ?line P ! done, + ?line unlink(P), + ?line verify_no_down(Offender, Victim), + ?line stop_node(Offender), + ?line stop_node(Victim). + + +bad_dist_ext_check_msgs([]) -> + receive + Msg -> + exit({unexpected_message, Msg}) + after 0 -> + ok + end; +bad_dist_ext_check_msgs([M|Ms]) -> + receive + Msg -> + M = Msg, + bad_dist_ext_check_msgs(Ms) + end. + +-define(COOKIE, ''). +-define(DOP_LINK, 1). +-define(DOP_SEND, 2). +-define(DOP_EXIT, 3). +-define(DOP_UNLINK, 4). +-define(DOP_NODE_LINK, 5). +-define(DOP_REG_SEND, 6). +-define(DOP_GROUP_LEADER, 7). +-define(DOP_EXIT2, 8). + +-define(DOP_SEND_TT, 12). +-define(DOP_EXIT_TT, 13). +-define(DOP_REG_SEND_TT, 16). +-define(DOP_EXIT2_TT, 18). + +-define(DOP_MONITOR_P, 19). +-define(DOP_DEMONITOR_P, 20). +-define(DOP_MONITOR_P_EXIT, 21). + +dport_reg_send(Node, Name, Msg) -> + DPrt = case dport(Node) of + undefined -> + pong = net_adm:ping(Node), + dport(Node); + Prt -> + Prt + end, + port_command(DPrt, [dmsg_hdr(), + dmsg_ext({?DOP_REG_SEND, + self(), + ?COOKIE, + Name}), + dmsg_ext(Msg)]). + + +dport_send(To, Msg) -> + Node = node(To), + DPrt = case dport(Node) of + undefined -> + pong = net_adm:ping(Node), + dport(Node); + Prt -> + Prt + end, + port_command(DPrt, [dmsg_hdr(), + dmsg_ext({?DOP_SEND, + ?COOKIE, + To}), + dmsg_ext(Msg)]). + +%% send_bad_msgs(): +%% Send a valid distribution header and control message +%% but an invalid message. This invalid message will be +%% enqueued in the receivers message queue. +send_bad_msg(BadNode, To) -> + send_bad_msgs(BadNode, To, 1). + +send_bad_msgs(BadNode, To, Repeat) when is_atom(BadNode), + is_pid(To), + is_integer(Repeat) -> + Parent = self(), + Done = make_ref(), + spawn_link(BadNode, + fun () -> + Node = node(To), + pong = net_adm:ping(Node), + DPrt = dport(Node), + DData = [dmsg_hdr(), + dmsg_ext({?DOP_SEND, ?COOKIE, To}), + dmsg_bad_atom_cache_ref()], + repeat(fun () -> port_command(DPrt, DData) end, Repeat), + Parent ! Done + end), + receive Done -> ok end. + +%% send_bad_ctl(): +%% Send a valid distribution header but an invalid control message. +send_bad_ctl(BadNode, ToNode) when is_atom(BadNode), is_atom(ToNode) -> + Parent = self(), + Done = make_ref(), + spawn_link(BadNode, + fun () -> + pong = net_adm:ping(ToNode), + %% We creat a valid ctl msg and replace an + %% atom with an invalid atom cache reference + <<131,Replace/binary>> = term_to_binary(replace), + Ctl = dmsg_ext({?DOP_REG_SEND, + self(), + ?COOKIE, + replace}), + CtlBeginSize = size(Ctl) - size(Replace), + <> = Ctl, + port_command(dport(ToNode), + [dmsg_fake_hdr2(), + CtlBegin, + dmsg_bad_atom_cache_ref(), + dmsg_ext({a, message})]), + Parent ! Done + end), + receive Done -> ok end. + +%% send_bad_dhr(): +%% Send an invalid distribution header +send_bad_dhdr(BadNode, ToNode) when is_atom(BadNode), is_atom(ToNode) -> + Parent = self(), + Done = make_ref(), + spawn_link(BadNode, + fun () -> + pong = net_adm:ping(ToNode), + port_command(dport(ToNode), dmsg_bad_hdr()), + Parent ! Done + end), + receive Done -> ok end. + +dport(Node) when is_atom(Node) -> + case catch erts_debug:get_internal_state(available_internal_state) of + true -> true; + _ -> erts_debug:set_internal_state(available_internal_state, true) + end, + erts_debug:get_internal_state({dist_port, Node}). + +dmsg_hdr() -> + [131, % Version Magic + $D, % Dist header + 0]. % No atom cache referenses + +dmsg_bad_hdr() -> + [131, % Version Magic + $D, % Dist header + 255]. % 255 atom references + + +dmsg_fake_hdr1() -> + A = <<"fake header atom 1">>, + [131, % Version Magic + $D, 1, 16#8, 0, size(A), A]. % Fake header + +dmsg_fake_hdr2() -> + A1 = <<"fake header atom 1">>, + A2 = <<"atom 2">>, + A3 = <<"atom 3">>, + [131, % Version Magic + $D, + 3, + 16#88, 16#08, % Flags + 0, size(A1), A1, + 1, size(A2), A2, + 2, size(A3), A3]. + +dmsg_ext(Term) -> + <<131, Res/binary>> = term_to_binary(Term), + Res. + +dmsg_bad_atom_cache_ref() -> + [$R, 137]. + +%%% Utilities + +timestamp() -> + {A,B,C} = erlang:now(), + (C div 1000) + (B * 1000) + (A * 1000000000). + +start_node(X) -> + start_node(X, [], []). + +start_node(X, Y) -> + start_node(X, Y, []). + +start_node(Name, Args, Rel) when is_atom(Name), is_list(Rel) -> + Pa = filename:dirname(code:which(?MODULE)), + Cookie = atom_to_list(erlang:get_cookie()), + RelArg = case Rel of + [] -> []; + _ -> [{erl,[{release,Rel}]}] + end, + test_server:start_node(Name, slave, + [{args, + Args++" -setcookie "++Cookie++" -pa "++Pa} + | RelArg]); +start_node(Config, Args, Rel) when is_list(Config), is_list(Rel) -> + Name = list_to_atom((atom_to_list(?MODULE) + ++ "-" + ++ atom_to_list(?config(testcase, Config)) + ++ "-" + ++ integer_to_list(timestamp()))), + start_node(Name, Args, Rel). + +stop_node(Node) -> + test_server:stop_node(Node). + +freeze_node(Node, MS) -> + Own = 300, + DoingIt = make_ref(), + Freezer = self(), + spawn_link(Node, + fun () -> + erts_debug:set_internal_state(available_internal_state, + true), + dport_send(Freezer, DoingIt), + receive after Own -> ok end, + erts_debug:set_internal_state(block, MS+Own) + end), + receive DoingIt -> ok end, + receive after Own -> ok end. + +inet_rpc_nodename({N,H,_Sock}) -> + list_to_atom(N++"@"++H). + +do_inet_rpc({_,_,Sock},M,F,A) -> + Bin = term_to_binary({M,F,A}), + gen_tcp:send(Sock,Bin), + case gen_tcp:recv(Sock,0) of + {ok, Bin2} -> + T = binary_to_term(Bin2), + {ok,T}; + Else -> + {error, Else} + end. + +inet_rpc_server([Host, PortList]) -> + Port = list_to_integer(PortList), + {ok, Sock} = gen_tcp:connect(Host, Port,[binary, {packet, 4}, + {active, false}]), + inet_rpc_server_loop(Sock). + +inet_rpc_server_loop(Sock) -> + case gen_tcp:recv(Sock,0) of + {ok, Bin} -> + {M,F,A} = binary_to_term(Bin), + Res = (catch apply(M,F,A)), + RB = term_to_binary(Res), + gen_tcp:send(Sock,RB), + inet_rpc_server_loop(Sock); + _ -> + erlang:halt() + end. + + +start_relay_node(Node, Args) -> + Pa = filename:dirname(code:which(?MODULE)), + Cookie = "NOT"++atom_to_list(erlang:get_cookie()), + {ok, LSock} = gen_tcp:listen(0, [binary, {packet, 4}, + {active, false}]), + {ok, Port} = inet:port(LSock), + {ok, Host} = inet:gethostname(), + RunArg = "-run " ++ atom_to_list(?MODULE) ++ " inet_rpc_server " ++ + Host ++ " " ++ integer_to_list(Port), + {ok, NN} = + test_server:start_node(Node, peer, + [{args, Args ++ + " -setcookie "++Cookie++" -pa "++Pa++" "++ + RunArg}]), + [N,H] = string:tokens(atom_to_list(NN),"@"), + {ok, Sock} = gen_tcp:accept(LSock), + pang = net_adm:ping(NN), + {N,H,Sock}. + +stop_relay_node({N,H,Sock}) -> + catch do_inet_rpc(Sock,erlang,halt,[]), + catch gen_tcp:close(Sock), + wait_dead(N,H,10). + +wait_dead(N,H,0) -> + {error,{not_dead,N,H}}; +wait_dead(N,H,X) -> + case erl_epmd:port_please(N,H) of + {port,_,_} -> + receive + after 1000 -> + ok + end, + wait_dead(N,H,X-1); + noport -> + ok; + Else -> + {error, {unexpected, Else}} + end. + + +start_node_monitors(Nodes) -> + Master = self(), + lists:foreach(fun (Node) -> + spawn(Node, + fun () -> + node_monitor(Master) + end) + end, + Nodes), + ok. + +node_monitor(Master) -> + Opts = [nodedown_reason,{node_type,all}], + Nodes0 = nodes(connected), + net_kernel:monitor_nodes(true, Opts), + Nodes1 = nodes(connected), + case lists:sort(Nodes0) == lists:sort(Nodes1) of + true -> + lists:foreach(fun (Node) -> + Master ! {nodeup, node(), Node} + end, + Nodes0), + ?t:format("~p ~p: ~p~n", [node(), erlang:now(), Nodes0]), + node_monitor_loop(Master); + false -> + net_kernel:monitor_nodes(false, Opts), + flush_node_changes(), + node_monitor(Master) + end. + +flush_node_changes() -> + receive + {NodeChange, _Node, _InfoList} when NodeChange == nodeup; + NodeChange == nodedown -> + flush_node_changes() + after 0 -> + ok + end. + +node_monitor_loop(Master) -> + receive + {nodeup, Node, InfoList} = Msg -> + Master ! {nodeup, node(), Node}, + ?t:format("~p ~p: ~p~n", [node(), erlang:now(), Msg]), + node_monitor_loop(Master); + {nodedown, Node, InfoList} = Msg -> + Reason = case lists:keysearch(nodedown_reason, 1, InfoList) of + {value, {nodedown_reason, R}} -> R; + _ -> undefined + end, + Master ! {nodedown, node(), Node, Reason}, + ?t:format("~p ~p: ~p~n", [node(), erlang:now(), Msg]), + node_monitor_loop(Master) + end. + +verify_up(A, B) -> + receive {nodeup, A, B} -> ok end, + receive {nodeup, B, A} -> ok end. + +verify_still_up(A, B) -> + true = lists:member(B, rpc:call(A, erlang, nodes, [connected])), + true = lists:member(A, rpc:call(B, erlang, nodes, [connected])), + verify_no_down(A, B). + +verify_no_down(A, B) -> + receive + {nodedown, A, B, _} = Msg0 -> + ?t:fail(Msg0) + after 0 -> + ok + end, + receive + {nodedown, B, A, _} = Msg1 -> + ?t:fail(Msg1) + after 0 -> + ok + end. + +verify_down(A, B) -> + receive {nodedown, A, B, _} -> ok end, + receive {nodedown, B, A, _} -> ok end. + +verify_down(A, ReasonA, B, ReasonB) -> + receive + {nodedown, A, B, _} = Msg0 -> + {nodedown, A, B, ReasonA} = Msg0 + end, + receive + {nodedown, B, A, _} = Msg1 -> + {nodedown, B, A, ReasonB} = Msg1 + end, + ok. + +hostname() -> + from($@, atom_to_list(node())). + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(_, []) -> []. + +fun_spawn(Fun) -> + fun_spawn(Fun, []). + +fun_spawn(Fun, Args) -> + spawn_link(erlang, apply, [Fun, Args]). + + +long_or_short() -> + case net_kernel:longnames() of + true -> " -name "; + false -> " -sname " + end. + +until(Fun) -> + case Fun() of + true -> + ok; + false -> + receive after 10 -> ok end, + until(Fun) + end. + +forever(Fun) -> + Fun(), + forever(Fun). + +abort(Why) -> + erts_debug:set_internal_state(available_internal_state, true), + erts_debug:set_internal_state(abort, Why). + + +start_busy_dist_port_tracer() -> + Tracer = spawn_link(fun () -> busy_dist_port_tracer() end), + erlang:system_monitor(Tracer, [busy_dist_port]), + Tracer. + +stop_busy_dist_port_tracer(Tracer) when is_pid(Tracer) -> + unlink(Tracer), + exit(Tracer, bye); +stop_busy_dist_port_tracer(_) -> + true. + +busy_dist_port_tracer() -> + receive + {monitor, _SuspendedProcess, busy_dist_port, _Port} = M -> + erlang:display(M), + busy_dist_port_tracer() + end. + +repeat(_Fun, 0) -> + ok; +repeat(Fun, N) -> + Fun(), + repeat(Fun, N-1). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/caller_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/caller_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/caller_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/caller_drv.c 2009-03-12 12:16:45.000000000 +0000 @@ -0,0 +1,134 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include +#include +#include "erl_driver.h" + +static ErlDrvData start(ErlDrvPort port, + char *command); +static void output(ErlDrvData drv_data, + char *buf, int len); +static void outputv(ErlDrvData drv_data, + ErlIOVec *ev); +static int control(ErlDrvData drv_data, + unsigned int command, char *buf, + int len, char **rbuf, int rlen); +static int call(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen, + unsigned int *flags); + +static ErlDrvEntry caller_drv_entry = { + NULL /* init */, + start, + NULL /* stop */, + output, + NULL /* ready_input */, + NULL /* ready_output */, + "caller_drv", + NULL /* finish */, + NULL /* handle */, + control, + NULL /* timeout */, + outputv, + NULL /* ready_async */, + NULL /* flush */, + call, + NULL /* event */, + ERL_DRV_EXTENDED_MARKER, + ERL_DRV_EXTENDED_MAJOR_VERSION, + ERL_DRV_EXTENDED_MINOR_VERSION, + ERL_DRV_FLAG_USE_PORT_LOCKING, + NULL /* handle2 */, + NULL /* handle_monitor */ +}; + +DRIVER_INIT(caller_drv) +{ + char buf[10]; + size_t bufsz = sizeof(buf); + char *use_outputv; + use_outputv = (erl_drv_getenv("CALLER_DRV_USE_OUTPUTV", buf, &bufsz) == 0 + ? buf + : "false"); + if (strcmp(use_outputv, "true") != 0) + caller_drv_entry.outputv = NULL; + return &caller_drv_entry; +} + +void +send_caller(ErlDrvData drv_data, char *func) +{ + int res; + ErlDrvPort port = (ErlDrvPort) drv_data; + ErlDrvTermData msg[] = { + ERL_DRV_ATOM, driver_mk_atom("caller"), + ERL_DRV_PORT, driver_mk_port(port), + ERL_DRV_ATOM, driver_mk_atom(func), + ERL_DRV_PID, driver_caller(port), + ERL_DRV_TUPLE, (ErlDrvTermData) 4 + }; + res = driver_output_term(port, msg, sizeof(msg)/sizeof(ErlDrvTermData)); + if (res <= 0) + driver_failure_atom(port, "driver_output_term failed"); +} + +static ErlDrvData +start(ErlDrvPort port, char *command) +{ + send_caller((ErlDrvData) port, "start"); + return (ErlDrvData) port; +} + +static void +output(ErlDrvData drv_data, char *buf, int len) +{ + send_caller(drv_data, "output"); +} + +static void +outputv(ErlDrvData drv_data, ErlIOVec *ev) +{ + send_caller(drv_data, "outputv"); +} + +static int +control(ErlDrvData drv_data, + unsigned int command, char *buf, + int len, char **rbuf, int rlen) +{ + send_caller(drv_data, "control"); + return 0; +} + +static int +call(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen, + unsigned int *flags) +{ + /* echo call */ + if (len > rlen) + *rbuf = driver_alloc(len); + memcpy((void *) *rbuf, (void *) buf, len); + send_caller(drv_data, "call"); + return len; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/chkio_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/chkio_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/chkio_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/chkio_drv.c 2009-03-12 12:16:45.000000000 +0000 @@ -0,0 +1,1575 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#ifndef UNIX +#if !defined(__WIN32__) && !defined(_OSE_) && !defined(VXWORKS) +#define UNIX 1 +#endif +#endif + +#ifdef UNIX +#include +#include +#include /* rand */ +#include +#include +#include +#include +#include +#ifdef HAVE_POLL_H +# include +#endif +#endif /* UNIX */ + +#include "erl_driver.h" + +#define CHKIO_STOP 0 +#define CHKIO_USE_FALLBACK_POLLSET 1 +#define CHKIO_BAD_FD_IN_POLLSET 2 +#define CHKIO_DRIVER_EVENT 3 +#define CHKIO_FD_CHANGE 4 +#define CHKIO_STEAL 5 +#define CHKIO_STEAL_AUX 6 +#define CHKIO_SMP_SELECT 7 +#define CHKIO_DRV_USE 8 + +#define CHKIO_FALLBACK_FDS 10 + +#define TRACEF(x) /*erts_printf x*/ + +#ifdef UNIX +typedef struct { + int fd; + int cnt; +} ChkioFallbackFd; + +typedef struct { + ChkioFallbackFd dev_null[CHKIO_FALLBACK_FDS]; + ChkioFallbackFd dev_zero[CHKIO_FALLBACK_FDS]; + ChkioFallbackFd pipe_in[CHKIO_FALLBACK_FDS]; + ChkioFallbackFd pipe_out[CHKIO_FALLBACK_FDS]; +} ChkioFallbackData; + +typedef struct { + int in_fd; + struct erl_drv_event_data in_data; + int in_ok; + int out_fd; + struct erl_drv_event_data out_data; + int out_ok; +} ChkioDriverEvent; + +typedef struct { + int fds[2]; + int same_fd; +} ChkioFdChange; + +typedef struct { + int fds[2]; +} ChkioBadFdInPollset; + +typedef struct { + int driver_select_fds[2]; + int driver_event_fds[2]; + struct erl_drv_event_data event_data[2]; +} ChkioSteal; + +typedef struct { + int driver_select_fds[2]; + int driver_event_fds[2]; + struct erl_drv_event_data event_data[2]; +} ChkioStealAux; + + +typedef struct chkio_smp_select { + struct chkio_smp_select* next; + int read_fd; + int write_fd; + int next_read; + int next_write; + enum {Closed, Opened, Selected, Waiting} state; + int wasSelected; + unsigned rand_state; +}ChkioSmpSelect; + +ChkioSmpSelect* smp_pipes; +unsigned smp_pipes_cnt; +ErlDrvMutex* smp_pipes_mtx; + +typedef struct { + int script_line; + int fd_in; + int fd_out; + int fd_pipe[2]; + volatile int fd_stop_select; + int timeouts_left; + void* expected_callback; + int expected_fd; +}ChkioDrvUse; +static ChkioDrvUse drv_use_singleton; + +typedef struct { + ErlDrvPort port; + ErlDrvTermData id; + int test; + void *test_data; +} ChkioDrvData; + + +#endif /* UNIX */ + +static int chkio_drv_init(void); +static void chkio_drv_finish(void); +static ErlDrvData chkio_drv_start(ErlDrvPort, char *); +static void chkio_drv_stop(ErlDrvData); +static void chkio_drv_ready_input(ErlDrvData, ErlDrvEvent); +static void chkio_drv_ready_output(ErlDrvData, ErlDrvEvent); +static void chkio_drv_ready_event(ErlDrvData, ErlDrvEvent, ErlDrvEventData); +static int chkio_drv_control(ErlDrvData, unsigned int, + char *, int, char **, int); +static void chkio_drv_timeout(ErlDrvData); +static void chkio_drv_stop_select(ErlDrvEvent, void*); + + +static ErlDrvEntry chkio_drv_entry = { + chkio_drv_init, + chkio_drv_start, + chkio_drv_stop, + NULL, /* output */ + chkio_drv_ready_input, + chkio_drv_ready_output, + "chkio_drv", + chkio_drv_finish, + NULL, /* handle */ + chkio_drv_control, + chkio_drv_timeout, + NULL, /* outputv */ + NULL, /* ready_async */ + NULL, /* flush */ + NULL, /* call */ + chkio_drv_ready_event, + + ERL_DRV_EXTENDED_MARKER, + ERL_DRV_EXTENDED_MAJOR_VERSION, + ERL_DRV_EXTENDED_MINOR_VERSION, + ERL_DRV_FLAG_USE_PORT_LOCKING, + NULL,/* void *handle2 */ + NULL,/* process_exit */ + chkio_drv_stop_select +}; + + +#ifdef UNIX + +static void chkio_drv_use(ChkioDrvData *cddp, void* callback); + +static void +stop_use_fallback_pollset(ChkioDrvData *cddp) +{ + int i; + ChkioFallbackData *cbdp = (ChkioFallbackData *) cddp->test_data; + if (cbdp) { + for (i = 0; i < CHKIO_FALLBACK_FDS; i++) { + if (cbdp->dev_null[i].fd >= 0) { + if (driver_select(cddp->port, + (ErlDrvEvent) cbdp->dev_null[i].fd, + DO_WRITE, + 0) != 0) { + fprintf(stderr, + "%s:%d: Failed to deselect dev_null fd=%d\n", + __FILE__, __LINE__, cbdp->dev_null[i].fd); + abort(); + } + close(cbdp->dev_null[i].fd); + } + if (cbdp->dev_zero[i].fd >= 0) { + if (driver_select(cddp->port, + (ErlDrvEvent) cbdp->dev_zero[i].fd, + DO_READ, + 0) != 0) { + fprintf(stderr, + "%s:%d: Failed to deselct dev_zero fd=%d\n", + __FILE__, __LINE__, cbdp->dev_zero[i].fd); + abort(); + } + close(cbdp->dev_zero[i].fd); + } + if (cbdp->pipe_in[i].fd >= 0) { + if (driver_select(cddp->port, + (ErlDrvEvent) cbdp->pipe_in[i].fd, + DO_READ, + 0) != 0) { + fprintf(stderr, + "%s:%d: Failed to deselect pipe_in fd=%d\n", + __FILE__, __LINE__, cbdp->pipe_in[i].fd); + abort(); + } + close(cbdp->pipe_in[i].fd); + } + if (cbdp->pipe_out[i].fd >= 0) { + if (driver_select(cddp->port, + (ErlDrvEvent) cbdp->pipe_out[i].fd, + DO_WRITE, + 0) != 0) { + fprintf(stderr, + "%s:%d: Failed to deselect pipe_out fd=%d\n", + __FILE__, __LINE__, cbdp->pipe_out[i].fd); + abort(); + } + close(cbdp->pipe_out[i].fd); + } + } + driver_free((void *) cbdp); + cddp->test_data = NULL; + } + cddp->test = CHKIO_STOP; +} + +static void +stop_driver_event(ChkioDrvData *cddp) +{ + if (cddp->test_data) { + ChkioDriverEvent *cdep = cddp->test_data; + cddp->test_data = NULL; + + if (cdep->in_fd >= 0) { + driver_event(cddp->port, (ErlDrvEvent) cdep->in_fd, NULL); + close(cdep->in_fd); + } + if (cdep->out_fd >= 0) { + driver_event(cddp->port, (ErlDrvEvent) cdep->out_fd, NULL); + close(cdep->out_fd); + } + driver_free(cdep); + } +} + +static void +stop_fd_change(ChkioDrvData *cddp) +{ + if (cddp->test_data) { + ChkioFdChange *cfcp = (ChkioFdChange *) cddp->test_data; + cddp->test_data = NULL; + driver_cancel_timer(cddp->port); + if (cfcp->fds[0] >= 0) { + driver_select(cddp->port, (ErlDrvEvent) cfcp->fds[0], DO_READ, 0); + close(cfcp->fds[0]); + close(cfcp->fds[1]); + } + driver_free((void *) cfcp); + } +} + +static void +stop_bad_fd_in_pollset(ChkioDrvData *cddp) +{ + if (cddp->test_data) { + ChkioBadFdInPollset *bfipp = (ChkioBadFdInPollset *) cddp->test_data; + cddp->test_data = NULL; + driver_select(cddp->port, (ErlDrvEvent) bfipp->fds[0], DO_WRITE, 0); + driver_select(cddp->port, (ErlDrvEvent) bfipp->fds[1], DO_READ, 0); + driver_free((void *) bfipp); + } +} + +static void +stop_steal(ChkioDrvData *cddp) +{ + if (cddp->test_data) { + ChkioSteal *csp = cddp->test_data; + cddp->test_data = NULL; + if (csp->driver_select_fds[0] >= 0) + driver_select(cddp->port, + (ErlDrvEvent) csp->driver_select_fds[0], + DO_READ, + 0); + if (csp->driver_select_fds[1] >= 0) + driver_select(cddp->port, + (ErlDrvEvent) csp->driver_select_fds[1], + DO_WRITE, + 0); + if (csp->driver_event_fds[0] >= 0) + driver_event(cddp->port, + (ErlDrvEvent) csp->driver_event_fds[0], + NULL); + if (csp->driver_event_fds[1] >= 0) + driver_event(cddp->port, + (ErlDrvEvent) csp->driver_event_fds[1], + NULL); + driver_free(csp); + } +} + +static void +stop_steal_aux(ChkioDrvData *cddp) +{ + if (cddp->test_data) { + ChkioStealAux *csap = cddp->test_data; + cddp->test_data = NULL; + if (csap->driver_select_fds[0] >= 0) + close(csap->driver_select_fds[0]); + if (csap->driver_select_fds[1] >= 0) + close(csap->driver_select_fds[1]); + if (csap->driver_event_fds[0] >= 0) + close(csap->driver_event_fds[0]); + if (csap->driver_event_fds[1] >= 0) + close(csap->driver_event_fds[1]); + driver_free(csap); + } +} + +static void free_smp_select(ChkioSmpSelect* pip, ErlDrvPort port) +{ + switch (pip->state) { + case Waiting: { + int word; + fprintf(stderr, "Closing pipe in state Waiting. Event lost?\n"); + for (;;) { + int bytes = read(pip->read_fd, &word, sizeof(word)); + if (bytes != sizeof(word)) { + if (bytes != 0) { + fprintf(stderr, "Failed to read from pipe, bytes=%d, errno=%d\n", bytes, errno); + } + break; + } + fprintf(stderr, "Read from pipe: %d\n", word); + } + abort(); + } + case Selected: + driver_select(port, (ErlDrvEvent)pip->read_fd, DO_READ, 0); + /*fall through*/ + case Opened: + close(pip->read_fd); + close(pip->write_fd); + pip->state = Closed; + break; + } + driver_free(pip); +} + +static void +stop_smp_select(ChkioDrvData *cddp) +{ + ChkioSmpSelect* pip = (ChkioSmpSelect*)cddp->test_data; + if (pip) free_smp_select(pip, cddp->port); + erl_drv_mutex_lock(smp_pipes_mtx); + if (smp_pipes_cnt > 0 && --smp_pipes_cnt == 0) { + while (smp_pipes) { + ChkioSmpSelect* next = smp_pipes->next; + free_smp_select(smp_pipes, cddp->port); + smp_pipes = next; + } + } + erl_drv_mutex_unlock(smp_pipes_mtx); +} + +#endif /* UNIX */ + +/* ------------------------------------------------------------------------- +** Entry functions +**/ + +DRIVER_INIT(chkio_drv) +{ + return &chkio_drv_entry; +} + + +static int +chkio_drv_init(void) +{ +#ifdef UNIX + smp_pipes_mtx = erl_drv_mutex_create("smp_pipes_mtx"); +#endif + return 0; +} + +static void +chkio_drv_finish(void) +{ +#ifdef UNIX + erl_drv_mutex_destroy(smp_pipes_mtx); +#endif +} + + +static ErlDrvData +chkio_drv_start(ErlDrvPort port, char *command) +{ +#ifndef UNIX + return NULL; +#else + ChkioDrvData *cddp = driver_alloc(sizeof(ChkioDrvData)); + if (!cddp) { + errno = ENOMEM; + return ERL_DRV_ERROR_ERRNO; + } + cddp->port = port; + cddp->id = driver_mk_port(port); + cddp->test = CHKIO_STOP; + cddp->test_data = NULL; + return (ErlDrvData) cddp; +#endif +} + +static void +chkio_drv_stop(ErlDrvData drv_data) { +#ifdef UNIX + int fd; + ChkioDrvData *cddp = (ChkioDrvData *) drv_data; + + switch (cddp->test) { + case CHKIO_STOP: + break; + case CHKIO_USE_FALLBACK_POLLSET: + stop_use_fallback_pollset(cddp); + break; + case CHKIO_BAD_FD_IN_POLLSET: + stop_bad_fd_in_pollset(cddp); + break; + case CHKIO_DRIVER_EVENT: + stop_driver_event(cddp); + break; + case CHKIO_FD_CHANGE: + stop_fd_change(cddp); + break; + case CHKIO_STEAL: + stop_steal(cddp); + break; + case CHKIO_STEAL_AUX: + stop_steal_aux(cddp); + break; + case CHKIO_SMP_SELECT: + stop_smp_select(cddp); + break; + case CHKIO_DRV_USE: + chkio_drv_use(cddp, chkio_drv_stop); + break; + default: + fprintf(stderr, "%s:%d: Invalid state\n", __FILE__, __LINE__); + abort(); + break; + } + cddp->test = CHKIO_STOP; + + /* Make sure erts_poll() will handle update requests soon */ + fd = open("/dev/null", O_WRONLY); + if (fd < 0) { + fprintf(stderr, "%s:%d: Failed to open /dev/null\n", + __FILE__, __LINE__); + } + driver_select(cddp->port, (ErlDrvEvent) fd, DO_WRITE, 1); + driver_select(cddp->port, (ErlDrvEvent) fd, DO_WRITE, 0); + close(fd); + + + driver_free((void *) cddp); + +#endif +} + + +static void +chkio_drv_ready_output(ErlDrvData drv_data, ErlDrvEvent event) +{ +#ifdef UNIX + ChkioDrvData *cddp = (ChkioDrvData *) drv_data; + int fd = (int) event; + + switch (cddp->test) { + case CHKIO_USE_FALLBACK_POLLSET: { + int i; + int fd_found = 0; + ChkioFallbackData *cbdp = (ChkioFallbackData *) cddp->test_data; + for (i = 0; i < CHKIO_FALLBACK_FDS; i++) { + if (cbdp->dev_null[i].fd == fd) { + cbdp->dev_null[i].cnt++; + fd_found = 1; + break; + } + if (cbdp->pipe_out[i].fd == fd) { + cbdp->pipe_out[i].cnt++; + fd_found = 1; + break; + } + } + if (!fd_found) + driver_failure_atom(cddp->port, "output_fd_not_found"); + break; + } + case CHKIO_STEAL: + break; + case CHKIO_STEAL_AUX: + break; + case CHKIO_DRV_USE: + chkio_drv_use(cddp, chkio_drv_ready_output); + break; + default: + driver_failure_atom(cddp->port, "unexpected_ready_output"); + break; + } +#endif +} + +static void +chkio_drv_ready_input(ErlDrvData drv_data, ErlDrvEvent event) +{ +#ifdef UNIX + ChkioDrvData *cddp = (ChkioDrvData *) drv_data; + int fd = (int) event; + + switch (cddp->test) { + case CHKIO_USE_FALLBACK_POLLSET: { + int i; + int fd_found = 0; + ChkioFallbackData *cbdp = (ChkioFallbackData *) cddp->test_data; + for (i = 0; i < CHKIO_FALLBACK_FDS; i++) { + if (cbdp->dev_zero[i].fd == fd) { + cbdp->dev_zero[i].cnt++; + fd_found = 1; + break; + } + if (cbdp->pipe_in[i].fd == fd) { + cbdp->pipe_in[i].cnt++; + fd_found = 1; + break; + } + } + if (!fd_found) + driver_failure_atom(cddp->port, "input_fd_not_found"); + break; + } + case CHKIO_STEAL: + break; + case CHKIO_STEAL_AUX: + break; + case CHKIO_SMP_SELECT: { + ChkioSmpSelect* pip = (ChkioSmpSelect*) cddp->test_data; + int word=123456, bytes; + unsigned inPipe, n; + if (pip == NULL) { + printf("Read event on uninitiated pipe %d\n", fd); + abort(); + } + if (pip->state != Selected && pip->state != Waiting) { + printf("Read event on pipe in strange state %d\n", pip->state); + abort(); + } + + TRACEF(("Got read event on fd=%d, state=%d\n", fd, pip->state)); + + inPipe = (pip->next_write - pip->next_read); + if (inPipe == 0) { + bytes = read(pip->read_fd, &word, sizeof(word)); + printf("Unexpected empty pipe, expected %u -> %u, bytes=%d, word=%d\n", + pip->next_read, pip->next_write-1, bytes, word); + abort(); + } + + n = rand_r(&pip->rand_state) % (inPipe*4); + if (n > inPipe) n = inPipe; + TRACEF(("Read %u of %u words in pipe\n", n, inPipe)); + for (; n; n--) { + bytes = read(pip->read_fd, &word, sizeof(word)); + if (bytes != sizeof(word)) { + printf("Failed to read from pipe, ret=%u errno=%d\n", bytes, errno); + abort(); + } + if (word != pip->next_read) { + printf("Unexpected word in pipe %d, expected %d\n", word, pip->next_read); + abort(); + } + TRACEF(("Read %d from fd=%d\n", word, fd)); + pip->next_read++; + } + pip->state = Selected; /* not Waiting anymore */ + break; + } + case CHKIO_DRV_USE: + chkio_drv_use(cddp, chkio_drv_ready_input); + break; + default: + driver_failure_atom(cddp->port, "unexpected_ready_input"); + break; + } +#endif +} + +static void +chkio_drv_ready_event(ErlDrvData drv_data, + ErlDrvEvent event, + ErlDrvEventData event_data) +{ +#ifdef UNIX + ChkioDrvData *cddp = (ChkioDrvData *) drv_data; + switch (cddp->test) { + case CHKIO_DRIVER_EVENT: { +#ifdef HAVE_POLL_H + ChkioDriverEvent *cdep = cddp->test_data; + int fd = (int) event; + if (fd == cdep->in_fd) { + if (event_data->events == POLLIN + && event_data->revents == POLLIN) { + cdep->in_ok++; + } + else { + driver_failure_atom(cddp->port, "invalid_input_fd_events"); + } + break; + } + if (fd == cdep->out_fd) { + if (event_data->events == POLLOUT + && event_data->revents == POLLOUT) { + cdep->out_ok++; + } + else { + driver_failure_atom(cddp->port, "invalid_output_fd_events"); + } + break; + } +#endif + } + case CHKIO_STEAL: +#ifdef HAVE_POLL_H + break; +#endif + case CHKIO_STEAL_AUX: +#ifdef HAVE_POLL_H + break; +#endif + default: + driver_failure_atom(cddp->port, "unexpected_ready_event"); + break; + } +#endif /* UNIX */ +} + +static void +chkio_drv_timeout(ErlDrvData drv_data) +{ +#ifdef UNIX + ChkioDrvData *cddp = (ChkioDrvData *) drv_data; + switch (cddp->test) { + case CHKIO_FD_CHANGE: { + ChkioFdChange *cfcp = cddp->test_data; + int in_fd = cfcp->fds[0]; + int out_fd = cfcp->fds[1]; + if (in_fd >= 0) { + if (driver_select(cddp->port, (ErlDrvEvent) in_fd, DO_READ, 0) < 0) + driver_failure_atom(cddp->port, "deselect_failed"); + (void) write(out_fd, (void *) "!", 1); + close(out_fd); + close(in_fd); + } + if (pipe(cfcp->fds) < 0) { + driver_failure_posix(cddp->port, errno); + } + else { + if (driver_select(cddp->port, (ErlDrvEvent) cfcp->fds[0], + DO_READ, 1) < 0) + driver_failure_atom(cddp->port, "select_failed"); + if (cfcp->fds[0] == in_fd) + cfcp->same_fd++; + if (driver_set_timer(cddp->port, 10) < 0) + driver_failure_atom(cddp->port, "set_timer_failed"); + } + break; + } + case CHKIO_DRV_USE: + chkio_drv_use(cddp, chkio_drv_timeout); + break; + default: + driver_failure_atom(cddp->port, "unexpected_driver_timeout"); + break; + } +#endif /* UNIX */ +} + +static int +chkio_drv_control(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen) +{ + char *res_str; + int res_len = -1; +#ifndef UNIX +#ifdef __WIN32__ + res_str = "skip: windows_different"; +#else + res_str = "nyiftos"; +#endif +#else + ChkioDrvData *cddp = (ChkioDrvData *) drv_data; + res_len = 0; + switch (command) { + case CHKIO_STOP: { + + /* + * --- STOP BEGIN --------------------------------------------------- + */ + switch (cddp->test) { + case CHKIO_STOP: + driver_failure_atom(cddp->port, "stop_when_stopped"); + break; + case CHKIO_USE_FALLBACK_POLLSET: { + char *c; + int i; + ChkioFallbackData *cbdp = (ChkioFallbackData *) cddp->test_data; + c = driver_alloc(sizeof(char)*(4*20+21*CHKIO_FALLBACK_FDS*8)); + if (!c) + return 0; + *rbuf = c; + c += sprintf(c, "/dev/null: "); + for (i = 0; i < CHKIO_FALLBACK_FDS; i++) { + c += sprintf(c, "%d=%d ", + cbdp->dev_null[i].fd, + cbdp->dev_null[i].cnt); + } + c += sprintf(c, "\n/dev/zero: "); + for (i = 0; i < CHKIO_FALLBACK_FDS; i++) { + c += sprintf(c, "%d=%d ", + cbdp->dev_zero[i].fd, + cbdp->dev_zero[i].cnt); + } + c += sprintf(c, "\npipe_in: "); + for (i = 0; i < CHKIO_FALLBACK_FDS; i++) { + c += sprintf(c, "%d=%d ", + cbdp->pipe_in[i].fd, + cbdp->pipe_in[i].cnt); + } + c += sprintf(c, "\npipe_out: "); + for (i = 0; i < CHKIO_FALLBACK_FDS; i++) { + c += sprintf(c, "%d=%d ", + cbdp->pipe_out[i].fd, + cbdp->pipe_out[i].cnt); + } + c += sprintf(c, "\n"); + res_len = (int) (c - *rbuf); + stop_use_fallback_pollset(cddp); + break; + } + case CHKIO_BAD_FD_IN_POLLSET: + res_str = "ok"; + res_len = -1; + stop_bad_fd_in_pollset(cddp); + break; + case CHKIO_DRIVER_EVENT: { + ChkioDriverEvent *cdep = cddp->test_data; + if (!cdep->in_ok || !cdep->out_ok) { + if (!cdep->in_ok) + driver_failure_atom(cddp->port, "got_no_input_events"); + if (!cdep->out_ok) + driver_failure_atom(cddp->port, "got_no_output_events"); + } + else { + char *c = driver_alloc(sizeof(char)*2*30); + if (!c) + driver_failure_posix(cddp->port, ENOMEM); + *rbuf = c; + res_len = sprintf(c, "in=%d\nout=%d\n", + cdep->in_ok, cdep->out_ok); + } + stop_driver_event(cddp); + break; + } + case CHKIO_FD_CHANGE: { + ChkioFdChange *cfcp = cddp->test_data; + if (!cfcp->same_fd) + driver_failure_atom(cddp->port, "never_same_fd"); + else { + char *c = driver_alloc(sizeof(char)*30); + if (!c) + driver_failure_posix(cddp->port, ENOMEM); + else { + *rbuf = c; + res_len = sprintf(c, "same_fd=%d\n", cfcp->same_fd); + } + } + stop_fd_change(cddp); + break; + } + case CHKIO_STEAL: + stop_steal(cddp); + res_str = "ok"; + res_len = -1; + break; + case CHKIO_STEAL_AUX: + stop_steal_aux(cddp); + res_str = "ok"; + res_len = -1; + break; + default: + driver_failure_atom(cddp->port, "invalid_state"); + break; + } + break; + } + /* + * --- STOP END ----------------------------------------------------- + */ + + case CHKIO_USE_FALLBACK_POLLSET: { + ChkioFallbackData *cbdp = driver_alloc(sizeof(ChkioFallbackData)); + cddp->test_data = (void *) cbdp; + if (!cbdp) + driver_failure_posix(cddp->port, ENOMEM); + else { + int i; + for (i = 0; i < CHKIO_FALLBACK_FDS; i++) { + cbdp->dev_null[i].fd = -1; + cbdp->dev_null[i].cnt = 0; + cbdp->dev_zero[i].fd = -1; + cbdp->dev_zero[i].cnt = 0; + cbdp->pipe_in[i].fd = -1; + cbdp->pipe_in[i].cnt = 0; + cbdp->pipe_out[i].fd = -1; + cbdp->pipe_out[i].cnt = 0; + } + for (i = 0; i < CHKIO_FALLBACK_FDS; i++) { + int fds[2]; + cbdp->dev_null[i].fd = open("/dev/null", O_WRONLY); + if (driver_select(cddp->port, + (ErlDrvEvent) cbdp->dev_null[i].fd, + DO_WRITE, + 1) != 0) { + driver_failure_posix(cddp->port, errno); + break; + } + cbdp->dev_zero[i].fd = open("/dev/zero", O_RDONLY); + if (driver_select(cddp->port, + (ErlDrvEvent) cbdp->dev_zero[i].fd, + DO_READ, + 1) != 0) { + driver_failure_posix(cddp->port, errno); + break; + } + if (pipe(fds) < 0) + driver_failure_posix(cddp->port, errno); + cbdp->pipe_in[i].fd = fds[0]; + cbdp->pipe_out[i].fd = fds[1]; + if (driver_select(cddp->port, + (ErlDrvEvent) cbdp->pipe_in[i].fd, + DO_READ, + 1) != 0) { + driver_failure_posix(cddp->port, EIO); + break; + } + if (i % 2 == 0) + (void) write(cbdp->pipe_out[i].fd, "!", 1); + if (driver_select(cddp->port, + (ErlDrvEvent) cbdp->pipe_out[i].fd, + DO_WRITE, + 1) != 0) { + driver_failure_posix(cddp->port, EIO); + break; + } + } + res_str = "ok"; + res_len = -1; + } + break; + } + case CHKIO_BAD_FD_IN_POLLSET: { + int i; + int error = 0; + int fds[11]; + for (i = 0; i < 11; i++) + fds[i] = -1; + /* We open a bunch of fds and use the last ones so we decrease the + risk of selecting on a fd that someone else just opened */ + for (i = 0; i < 10; i++) { + fds[i] = open("/dev/null", O_WRONLY); + if (fds[i] < 0) { + error = 1; + driver_failure_posix(cddp->port, errno); + break; + } + } + fds[10] = open("/dev/zero", O_RDONLY); + if (fds[10] < 0) { + error = 1; + driver_failure_posix(cddp->port, errno); + } + for (i = 0; i < 11; i++) { + if (fds[i] >= 0) + close(fds[i]); + } + if (!error) { + ChkioBadFdInPollset *bfipp; + bfipp = driver_alloc(sizeof(ChkioBadFdInPollset)); + if (!bfipp) + driver_failure_posix(cddp->port, ENOMEM); + else { + bfipp->fds[0] = fds[9]; + bfipp->fds[1] = fds[10]; + cddp->test_data = (void *) bfipp; + driver_select(cddp->port, (ErlDrvEvent) fds[9], DO_WRITE, 1); + driver_select(cddp->port, (ErlDrvEvent) fds[10], DO_READ, 1); + } + } + res_str = "ok"; + res_len = -1; + break; + } + case CHKIO_DRIVER_EVENT: { +#ifndef HAVE_POLL_H + res_str = "skip: Need the poll.h header for this test, but it doesn't exist"; + res_len = -1; +#else /* HAVE_POLL_H */ + int in_fd = open("/dev/zero", O_RDONLY); + int out_fd = open("/dev/null", O_WRONLY); + + if (in_fd < 0 || out_fd < 0) { + if (in_fd >= 0) + close(in_fd); + if (out_fd >= 0) + close(out_fd); + driver_failure_posix(cddp->port, errno); + } + else { + ChkioDriverEvent *cdep = driver_alloc(sizeof(ChkioDriverEvent)); + if (!cdep) + driver_failure_posix(cddp->port, ENOMEM); + else { + int res; + cddp->test_data = cdep; + + cdep->in_fd = in_fd; + cdep->in_data.events = POLLIN; + cdep->in_data.revents = 0; + cdep->in_ok = 0; + + res = driver_event(cddp->port, + (ErlDrvEvent) in_fd, + &cdep->in_data); + if (res < 0) { + res_str = "skip: driver_event() not supported"; + res_len = -1; + close(in_fd); + close(out_fd); + cdep->in_fd = -1; + cdep->out_fd = -1; + } + else { + res_str = "ok"; + res_len = -1; + + cdep->out_fd = out_fd; + cdep->out_data.events = POLLOUT; + cdep->out_data.revents = 0; + cdep->out_ok = 0; + + res = driver_event(cddp->port, + (ErlDrvEvent) out_fd, + &cdep->out_data); + if (res < 0) { + close(out_fd); + cdep->out_fd = -1; + driver_failure_atom(cddp->port, "driver_event_failed"); + } + } + + } + } +#endif /* HAVE_POLL_H */ + break; + } + case CHKIO_FD_CHANGE: { + ChkioFdChange *cfcp = driver_alloc(sizeof(ChkioFdChange)); + if (!cfcp) + driver_failure_posix(cddp->port, ENOMEM); + else { + cfcp->fds[0] = -1; + cfcp->fds[1] = -1; + cfcp->same_fd = 0; + cddp->test_data = cfcp; + driver_set_timer(cddp->port, 1); + res_str = "ok"; + res_len = -1; + } + break; + } + case CHKIO_STEAL: { + ChkioSteal *csp = driver_alloc(sizeof(ChkioSteal)); + char *c = driver_alloc(sizeof(char)*len+1); + if (!c || !csp) { + if (c) + driver_free(c); + if (csp) + driver_free(csp); + driver_failure_posix(cddp->port, ENOMEM); + res_str = "error"; + res_len = -1; + } + else { + int driver_event_fds[2]; + int driver_select_fds[2]; + cddp->test_data = csp; + memcpy(c, buf, len); + c[len] = '\0'; + if (sscanf(c, + "fds:%d:%d:%d:%d", + &driver_select_fds[0], + &driver_select_fds[1], + &driver_event_fds[0], + &driver_event_fds[1]) != 4) + driver_failure_atom(cddp->port, "bad_input"); + else { + int res = 0; + if (driver_event_fds[0] < 0) { /* Have no working driver_event() ... */ + csp->driver_select_fds[0] = driver_select_fds[0]; /* In */ + csp->driver_select_fds[1] = driver_select_fds[1]; /* Out */ + csp->driver_event_fds[0] = -1; + csp->driver_event_fds[1] = -1; + } + else { /* Have working driver_event() ... */ +#ifndef HAVE_POLL_H + driver_failure_atom(cddp->port, "unexpected_result"); + res = -1; +#else + csp->driver_select_fds[0] = driver_select_fds[0]; /* In */ + csp->driver_event_fds[1] = driver_select_fds[1]; /* Out */ + csp->driver_event_fds[0] = driver_event_fds[0]; /* In */ + csp->driver_select_fds[1] = driver_event_fds[1]; /* Out */ + + /* Steal with driver_event() */ + + csp->event_data[0].events = POLLIN; + csp->event_data[0].revents = 0; + res = driver_event(cddp->port, + (ErlDrvEvent) csp->driver_event_fds[0], + &csp->event_data[0]); + if (res < 0) + driver_failure_atom(cddp->port, + "driver_event_failed_to_steal"); + if (res >= 0) { + csp->event_data[1].events = POLLOUT; + csp->event_data[1].revents = 0; + res = driver_event(cddp->port, + (ErlDrvEvent) csp->driver_event_fds[1], + &csp->event_data[1]); + if (res < 0) + driver_failure_atom(cddp->port, + "driver_event_failed_to_steal"); + } +#endif + } + + /* Steal with driver_select() */ + if (res >= 0) { + res = driver_select(cddp->port, + (ErlDrvEvent) csp->driver_select_fds[0], + DO_READ, + 1); + if (res < 0) + driver_failure_atom(cddp->port, + "driver_select_failed_to_steal"); + } + if (res >= 0) { + res = driver_select(cddp->port, + (ErlDrvEvent) csp->driver_select_fds[1], + DO_WRITE, + 1); + if (res < 0) + driver_failure_atom(cddp->port, + "driver_select_failed_to_steal"); + } + + res_str = res >= 0 ? "ok" : "error"; + res_len = -1; + } + driver_free(c); + } + break; + } + case CHKIO_STEAL_AUX: { + int read_fds[2]; + int write_fds[2]; + + read_fds[0] = open("/dev/zero", O_RDONLY); + write_fds[0] = open("/dev/null", O_WRONLY); + +#ifdef HAVE_POLL_H + read_fds[1] = open("/dev/zero", O_RDONLY); + write_fds[1] = open("/dev/null", O_WRONLY); +#else + read_fds[1] = -1; + write_fds[1] = -1; +#endif + + if (read_fds[0] < 0 + || write_fds[0] < 0 +#ifdef HAVE_POLL_H + || read_fds[1] < 0 + || write_fds[1] < 0 +#endif + ) { + if (read_fds[0] < 0) + close(read_fds[0]); + if (write_fds[0] < 0) + close(write_fds[0]); +#ifdef HAVE_POLL_H + if (read_fds[1] < 0) + close(read_fds[1]); + if (write_fds[1] < 0) + close(write_fds[1]); +#endif + driver_failure_posix(cddp->port, errno); + } + else { + ChkioStealAux *csap = driver_alloc(sizeof(ChkioStealAux)); + if (!csap) { + driver_failure_posix(cddp->port, ENOMEM); + res_str = "error"; + res_len = -1; + } + else { + int res; + cddp->test_data = csap; + + csap->driver_select_fds[0] = read_fds[0]; + csap->driver_select_fds[1] = write_fds[0]; + + csap->driver_event_fds[0] = read_fds[1]; + csap->driver_event_fds[1] = write_fds[1]; + + res = driver_select(cddp->port, + (ErlDrvEvent) csap->driver_select_fds[0], + DO_READ, + 1); + if (res < 0) + driver_failure_atom(cddp->port, "driver_select_failed"); + if (res >= 0) { + res = driver_select(cddp->port, + (ErlDrvEvent) csap->driver_select_fds[1], + DO_WRITE, + 1); + if (res < 0) + driver_failure_atom(cddp->port, "driver_select_failed"); + } +#ifdef HAVE_POLL_H + if (res >= 0) { + csap->event_data[0].events = POLLIN; + csap->event_data[0].revents = 0; + res = driver_event(cddp->port, + (ErlDrvEvent) csap->driver_event_fds[0], + &csap->event_data[0]); + if (res < 0) { + close(csap->driver_event_fds[0]); + csap->driver_event_fds[0] = -1; + close(csap->driver_event_fds[1]); + csap->driver_event_fds[1] = -1; + res = 0; + } + else { + csap->event_data[1].events = POLLOUT; + csap->event_data[1].revents = 0; + res = driver_event(cddp->port, + (ErlDrvEvent) csap->driver_event_fds[1], + &csap->event_data[1]); + if (res < 0) + driver_failure_atom(cddp->port, + "driver_event_failed"); + } + } +#endif + if (res < 0) { + res_str = "error"; + res_len = -1; + } + else { + char *c = driver_alloc(sizeof(char)*(3+4*21+1)); + if (!c) { + res_str = "error"; + res_len = -1; + driver_failure_posix(cddp->port, ENOMEM); + } + else { + *rbuf = c; + res_len = sprintf(c, + "fds:%d:%d:%d:%d", + csap->driver_select_fds[0], + csap->driver_select_fds[1], + csap->driver_event_fds[0], + csap->driver_event_fds[1]); + } + } + } + } + break; + } + case CHKIO_SMP_SELECT: { + int rounds = 1; /*rand(); */ + ChkioSmpSelect* pip = (ChkioSmpSelect*) cddp->test_data; + if (pip == NULL) { + erl_drv_mutex_lock(smp_pipes_mtx); + if (smp_pipes) { + pip = smp_pipes; + smp_pipes = smp_pipes->next; + } + else { + cddp->test_data = driver_alloc(sizeof(ChkioSmpSelect)); + pip = (ChkioSmpSelect*) cddp->test_data; + pip->state = Closed; + pip->rand_state = 1; + smp_pipes_cnt++; + } + erl_drv_mutex_unlock(smp_pipes_mtx); + } + while (rounds--) { + int op = rand_r(&pip->rand_state); + switch (pip->state) { + case Closed: { + int fds[2], flags; + if (pipe(fds) < 0 || + (flags = fcntl(fds[0], F_GETFL, 0)) < 0 || + fcntl(fds[0], F_SETFL, flags|O_NONBLOCK) < 0) { + + driver_failure_posix(cddp->port, errno); + rounds = 0; + break; + } + TRACEF(("%T: Created pipe [%d->%d]\n", cddp->id, fds[1], fds[0])); + pip->read_fd = fds[0]; + pip->write_fd = fds[1]; + pip->state = Opened; + pip->wasSelected = 0; + pip->next_write = pip->next_read = rand_r(&pip->rand_state) % 1024; + if (op & 1) break; + op >>= 1; + }/*fall through*/ + case Opened: { + if (op & 1) { + TRACEF(("%T: Write %d to opened pipe [%d->%d]\n", cddp->id, pip->next_write, pip->write_fd, pip->read_fd)); + if (write(pip->write_fd, &pip->next_write, sizeof(int)) != sizeof(int)) { + fprintf(stderr, "Failed to write to pipe fd=%d, errno=%d\n", pip->write_fd, errno); + abort(); + } + pip->next_write++; + } + op >>= 1; + if (pip->wasSelected && (op & 1)) { + TRACEF(("%T: Close pipe [%d->%d]\n", cddp->id, pip->write_fd, pip->read_fd)); + if (close(pip->read_fd) || close(pip->write_fd)) { + fprintf(stderr, "Failed to close pipe, errno=%d\n", errno); + abort(); + } + pip->state = Closed; + break; + } + else { + TRACEF(("%T: Select on pipe [%d->%d]\n", cddp->id, pip->write_fd, pip->read_fd)); + if (driver_select(cddp->port, (ErlDrvEvent)pip->read_fd, DO_READ, 1)) { + fprintf(stderr, "driver_select failed for fd=%d\n", pip->read_fd); + abort(); + } + pip->state = Selected; + pip->wasSelected = 1; + op >>= 1; + if (pip->next_write != pip->next_read) { /* pipe not empty */ + if (op & 1) { + pip->state = Waiting; /* Wait for reader */ + break; + } + op >>= 1; + } + } + }/*fall through*/ + case Selected: + if (op & 1) { + TRACEF(("%T: Write %d to selected pipe [%d->%d]\n", cddp->id, + pip->next_write, pip->write_fd, pip->read_fd)); + if (write(pip->write_fd, &pip->next_write, sizeof(int)) != sizeof(int)) { + fprintf(stderr, "Failed to write to pipe fd=%d, errno=%d\n", pip->write_fd, errno); + abort(); + } + pip->next_write++; + } + op >>= 1; + if (op & 1) { + TRACEF(("%T: Deselect on pipe [%d->%d]\n", cddp->id, pip->write_fd, pip->read_fd)); + if (driver_select(cddp->port, (ErlDrvEvent)pip->read_fd, DO_READ, 0)) { + fprintf(stderr, "driver_(de)select failed for fd=%d\n", pip->read_fd); + abort(); + } + pip->state = Opened; + } + op >>= 1; + if (op & 1) { + TRACEF(("%T: Write %d to pipe [%d->%d] state=%d\n", cddp->id, + pip->next_write, pip->write_fd, pip->read_fd, pip->state)); + if (write(pip->write_fd, &pip->next_write, sizeof(int)) != sizeof(int)) { + fprintf(stderr, "Failed to write to pipe fd=%d, errno=%d\n", pip->write_fd, errno); + abort(); + } + pip->next_write++; + } + break; + case Waiting: + break; + default: + fprintf(stderr, "Strange state %d\n", pip->state); + abort(); + } + if (pip->state == Opened) { /* share unselected pipes with others */ + erl_drv_mutex_lock(smp_pipes_mtx); + pip->next = smp_pipes; + smp_pipes = pip; + erl_drv_mutex_unlock(smp_pipes_mtx); + cddp->test_data = NULL; + } + else { + cddp->test_data = pip; + } + } + res_str = "ok"; + res_len = -1; + break; + } + case CHKIO_DRV_USE: + chkio_drv_use(cddp, chkio_drv_control); + res_str = "ok"; + res_len = -1; + break; + default: + driver_failure_atom(cddp->port, "invalid_state"); + break; + } + cddp->test = command; +#endif /* UNIX */ + + if (res_len >= 0) + return res_len; + + res_len = strlen(res_str); + if (res_len > rlen) { + char *abuf = driver_alloc(sizeof(char)*res_len); + if (!abuf) + return 0; + *rbuf = abuf; + } + + memcpy((void *) *rbuf, (void *) res_str, res_len); + + return res_len; +} + +#ifdef UNIX + +#define ASSERT(cond) \ + do{ \ + if (!(cond)) { assert_failed(cddp->port, #cond, __LINE__); return; } \ + /*else fprintf(stderr, "Assertion '%s' at line %d: OK\r\n", #cond, __LINE__);*/ \ + }while(0) + +static void assert_print(char* str, int line) +{ + fprintf(stderr, "Assertion '%s' at line %d: FAILED\r\n", str, line); +} + +static void assert_failed(ErlDrvPort port, char* str, int line) +{ + char buf[30]; + assert_print(str,line); + snprintf(buf,sizeof(buf),"failed_at_line_%d",line); + driver_failure_atom(port,buf); + /*abort();*/ +} + +#define my_driver_select(PORT,FD,MODE,ON) \ + do{ if(driver_select(PORT, (ErlDrvEvent)(long)FD, MODE, ON) != 0) { \ + assert_failed(cddp->port, "driver_select", __LINE__); \ + return; \ + } \ + }while(0) + + +static void chkio_drv_use(ChkioDrvData *cddp, void* callback) +{ + ChkioDrvUse* cdu = (ChkioDrvUse*) cddp->test_data; + int fd_stop_select = -1; + + /*fprintf(stderr, "Callback: %p\r\n", callback);*/ + + if (cdu == NULL) { + int ret; + ASSERT(callback == chkio_drv_control); + cdu = &drv_use_singleton; + ASSERT(cdu->script_line == 0); + cddp->test_data = cdu; + cdu->fd_stop_select = -1; + cdu->script_line = 1; + cdu->fd_in = open("/dev/zero", O_RDONLY); + ASSERT(cdu->fd_in > 0); + cdu->fd_out = open("/dev/null", O_WRONLY); + ASSERT(cdu->fd_out > 0); + ret = pipe(cdu->fd_pipe); + ASSERT(ret == 0); + } + else { + if (callback == chkio_drv_timeout) { + if (cdu->fd_stop_select >= 0) { + fd_stop_select = cdu->fd_stop_select; + cdu->fd_stop_select = -1; + fprintf(stderr,"timeout detected stop_select fd=%d\r\n", fd_stop_select); + callback = chkio_drv_stop_select; + ASSERT(fd_stop_select == cdu->expected_fd); + } + else if (--cdu->timeouts_left > 0) { + driver_set_timer(cddp->port, 100); + return; + } + } + ASSERT(callback == cdu->expected_callback); + } + +#define NEXT_CALLBACK(fn) \ + cdu->expected_callback = fn; \ + /*fprintf(stderr, "Next expected callback: %p\r\n", fn);*/ \ + cdu->script_line = __LINE__; break; case __LINE__: \ + fprintf(stderr, "Script line %d\r\n", cdu->script_line) + + switch (cdu->script_line) { + case 1: + my_driver_select(cddp->port, cdu->fd_in, ERL_DRV_READ|ERL_DRV_USE, 1); + NEXT_CALLBACK(chkio_drv_ready_input); + + my_driver_select(cddp->port, cdu->fd_in, ERL_DRV_READ|ERL_DRV_USE, 0); + cdu->expected_fd = cdu->fd_in; + NEXT_CALLBACK(chkio_drv_stop_select); + + my_driver_select(cddp->port, cdu->fd_out, ERL_DRV_WRITE|ERL_DRV_USE, 1); + NEXT_CALLBACK(chkio_drv_ready_output); + + my_driver_select(cddp->port, cdu->fd_out, ERL_DRV_WRITE|ERL_DRV_USE, 0); + cdu->expected_fd = cdu->fd_out; + NEXT_CALLBACK(chkio_drv_stop_select); + + my_driver_select(cddp->port, cdu->fd_in, ERL_DRV_READ|ERL_DRV_USE, 1); + NEXT_CALLBACK(chkio_drv_ready_input); + + my_driver_select(cddp->port, cdu->fd_in, ERL_DRV_READ, 0); + NEXT_CALLBACK(chkio_drv_timeout); + + my_driver_select(cddp->port, cdu->fd_out, ERL_DRV_WRITE|ERL_DRV_USE, 1); + NEXT_CALLBACK(chkio_drv_ready_output); + + my_driver_select(cddp->port, cdu->fd_out, ERL_DRV_WRITE, 0); + NEXT_CALLBACK(chkio_drv_timeout); + + my_driver_select(cddp->port, cdu->fd_in, ERL_DRV_USE, 0); + cdu->expected_fd = cdu->fd_in; + NEXT_CALLBACK(chkio_drv_stop_select); + + my_driver_select(cddp->port, cdu->fd_out, ERL_DRV_USE, 0); + cdu->expected_fd = cdu->fd_out; + NEXT_CALLBACK(chkio_drv_stop_select); + + my_driver_select(cddp->port, cdu->fd_in, ERL_DRV_READ, 1); + NEXT_CALLBACK(chkio_drv_ready_input); + + my_driver_select(cddp->port, cdu->fd_in, ERL_DRV_USE, 0); + cdu->expected_fd = cdu->fd_in; + NEXT_CALLBACK(chkio_drv_stop_select); + + my_driver_select(cddp->port, cdu->fd_out, ERL_DRV_WRITE, 1); + NEXT_CALLBACK(chkio_drv_ready_output); + + my_driver_select(cddp->port, cdu->fd_out, ERL_DRV_USE, 0); + cdu->expected_fd = cdu->fd_out; + NEXT_CALLBACK(chkio_drv_stop_select); + + my_driver_select(cddp->port, cdu->fd_pipe[0], ERL_DRV_READ|ERL_DRV_USE, 1); + NEXT_CALLBACK(chkio_drv_timeout); + + my_driver_select(cddp->port, cdu->fd_pipe[0], ERL_DRV_USE, 0); + my_driver_select(cddp->port, cdu->fd_pipe[0], ERL_DRV_READ|ERL_DRV_USE, 1); + /* stop_select may or may not have been called up until now. + In either case it should not be called from here on. */ + cdu->fd_stop_select = -1; + NEXT_CALLBACK(chkio_drv_timeout); + + my_driver_select(cddp->port, cdu->fd_pipe[0], ERL_DRV_USE, 0); + cdu->expected_fd = cdu->fd_pipe[0]; + NEXT_CALLBACK(chkio_drv_stop_select); + + /* switch off USE again */ + my_driver_select(cddp->port, cdu->fd_pipe[0], ERL_DRV_USE, 0); + cdu->expected_fd = cdu->fd_pipe[0]; + NEXT_CALLBACK(chkio_drv_stop_select); + + my_driver_select(cddp->port, cdu->fd_pipe[1], ERL_DRV_READ|ERL_DRV_WRITE|ERL_DRV_USE, 1); + NEXT_CALLBACK(chkio_drv_ready_output); + + /* ERL_DRV_USE_NO_CALLBACK does not clear all */ + my_driver_select(cddp->port, cdu->fd_pipe[1], ERL_DRV_READ|ERL_DRV_USE_NO_CALLBACK, 0); + NEXT_CALLBACK(chkio_drv_ready_output); + + my_driver_select(cddp->port, cdu->fd_pipe[1], ERL_DRV_WRITE|ERL_DRV_USE_NO_CALLBACK, 0); + NEXT_CALLBACK(chkio_drv_timeout); + + cdu->script_line = 0; /* The End */ + cdu->expected_callback = chkio_drv_stop; + break; + + case 0: /* close port */ + ASSERT(cdu->fd_stop_select < 0); + close(cdu->fd_in); cdu->fd_in = -1; + close(cdu->fd_out); cdu->fd_out = -1; + close(cdu->fd_pipe[0]); cdu->fd_pipe[0] = -1; + close(cdu->fd_pipe[1]); cdu->fd_pipe[1] = -1; + /*driver_free(cdu); No, it's static */ + return; + + default: + ASSERT(0); + } + if (cdu->script_line) { + driver_set_timer(cddp->port, 100); + cdu->timeouts_left = 5; + } + else { + if (callback != chkio_drv_timeout) { + driver_cancel_timer(cddp->port); + } + driver_output(cddp->port, "TheEnd", 6); + } +} + +#endif /* UNIX */ + +static void chkio_drv_stop_select(ErlDrvEvent e, void* null) +{ +#ifdef UNIX + /*fprintf(stderr,"STOP_SELECT\r\n");*/ + if (!(null == NULL)) { + assert_print("null==NULL", __LINE__); abort(); + } + if (!(drv_use_singleton.fd_stop_select < 0)) { + assert_print("fd_stop_select<0", __LINE__); abort(); + } + drv_use_singleton.fd_stop_select = (int)(long)e; + /* Can't call chkio_drv_use directly here. That could even be recursive. + * Next timeout will detect it instead. + */ +#endif /* UNIX */ +} + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/invalid_extended_marker_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/invalid_extended_marker_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/invalid_extended_marker_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/invalid_extended_marker_drv.c 2007-11-26 19:01:33.000000000 +0000 @@ -0,0 +1,32 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Implementation of a driver with an invalid extended + * marker. + */ + +#define VSN_MISMATCH_DRV_EXTENDED_MARKER (0xdeadbeef) +#define VSN_MISMATCH_DRV_NAME_STR "invalid_extended_marker_drv" +#define VSN_MISMATCH_DRV_NAME invalid_extended_marker_drv +#define VSN_MISMATCH_DRV_MAJOR_VSN_DIFF 0 +#define VSN_MISMATCH_DRV_MINOR_VSN_DIFF 0 + +#include "vsn_mismatch_drv_impl.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/ioq_exit_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/ioq_exit_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/ioq_exit_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/ioq_exit_drv.c 2007-11-26 19:01:31.000000000 +0000 @@ -0,0 +1,423 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Tests that port I/O queues can be flushed via: + * - ready_input(), + * - ready_output(), + * - timeout(), + * - driver_async() -> read_async(), and + * - event() + */ + +#ifndef UNIX +#if !defined(__WIN32__) && !defined(_OSE_) && !defined(VXWORKS) +#define UNIX 1 +#endif +#endif + +#if defined(DEBUG) || 0 +# define PRINTF(X) printf X +#else +# define PRINTF(X) +#endif + +#if defined(UNIX) +#include +#include +#include +#include +#include +#include +#ifdef HAVE_POLL_H +# include +#endif +#elif defined(__WIN32__) +#include +#endif + +#include + +#include "erl_driver.h" + +typedef enum { + IOQ_EXIT_INVALID = 0, + IOQ_EXIT_READY_INPUT = 1, + IOQ_EXIT_READY_OUTPUT = 2, + IOQ_EXIT_TIMEOUT = 3, + IOQ_EXIT_READY_ASYNC = 4, + IOQ_EXIT_EVENT = 5, + IOQ_EXIT_READY_INPUT_ASYNC = 6, + IOQ_EXIT_READY_OUTPUT_ASYNC = 7, + IOQ_EXIT_TIMEOUT_ASYNC = 8, + IOQ_EXIT_EVENT_ASYNC = 9 +} IOQExitTest; + +typedef struct { + ErlDrvPort port; + IOQExitTest test; + int ifd; + int ofd; + int outstanding_async_task; + long async_task; +#ifdef HAVE_POLL_H + struct erl_drv_event_data event_data; +#endif +} IOQExitDrvData; + +#define EV2FD(EV) ((int) ((long) (EV))) +#define FD2EV(FD) ((ErlDrvEvent) ((long) (FD))) + +static ErlDrvData start(ErlDrvPort port, char *command); +static void stop(ErlDrvData drv_data); +static void ready_input(ErlDrvData drv_data, ErlDrvEvent event); +static void ready_output(ErlDrvData drv_data, ErlDrvEvent event); +static int control(ErlDrvData, unsigned int, char *, int, char **, int); +static void timeout(ErlDrvData drv_data); +static void ready_async(ErlDrvData drv_data, ErlDrvThreadData thread_data); +static void flush(ErlDrvData drv_data); +static void event(ErlDrvData drv_data, ErlDrvEvent event, + ErlDrvEventData event_data); +static void async_invoke(void*); +static void do_driver_async(IOQExitDrvData *); + +static ErlDrvEntry ioq_exit_drv_entry = { + NULL /* init */, + start, + stop, + NULL /* output */, + ready_input, + ready_output, + "ioq_exit_drv", + NULL /* finish */, + NULL /* handle */, + control, + timeout, + NULL /* outputv */, + ready_async, + flush, + NULL /* call */, + event, + ERL_DRV_EXTENDED_MARKER, + ERL_DRV_EXTENDED_MAJOR_VERSION, + ERL_DRV_EXTENDED_MINOR_VERSION, + ERL_DRV_FLAG_USE_PORT_LOCKING, + NULL /* handle2 */, + NULL /* process_exit */ +}; + +DRIVER_INIT(ioq_exit_drv) +{ + return &ioq_exit_drv_entry; +} + +static ErlDrvData +start(ErlDrvPort port, char *command) +{ + IOQExitDrvData *ddp = driver_alloc(sizeof(IOQExitDrvData)); + PRINTF(("%p = start(%ld, %s) called\r\n", ddp, (long) port, command)); + if (!ddp) { + errno = ENOMEM; + return ERL_DRV_ERROR_ERRNO; + } + + ddp->port = port; + ddp->test = IOQ_EXIT_INVALID; + ddp->ifd = -1; + ddp->ofd = -1; + ddp->outstanding_async_task = 0; + ddp->async_task = -1; +#ifdef HAVE_POLL_H + ddp->event_data.events = (short) 0; + ddp->event_data.revents = (short) 0; +#endif + + return (ErlDrvData) ddp; +} + +static int control(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen) +{ + IOQExitDrvData *ddp = (IOQExitDrvData *) drv_data; + char *res_str = "nyiftos"; + + PRINTF(("control(%p, %d, ...) called\r\n", drv_data, command)); + + switch (command) { + case IOQ_EXIT_READY_INPUT: + case IOQ_EXIT_READY_INPUT_ASYNC: +#ifdef UNIX + ddp->ifd = open("/dev/zero", O_RDONLY); + if (ddp->ifd < 0) { + driver_failure_posix(ddp->port, errno); + return 0; + } + break; +#else + goto done; +#endif + case IOQ_EXIT_READY_OUTPUT: + case IOQ_EXIT_READY_OUTPUT_ASYNC: +#ifdef UNIX + ddp->ofd = open("/dev/null", O_WRONLY); + if (ddp->ofd < 0) { + driver_failure_posix(ddp->port, errno); + return 0; + } + break; +#else + goto done; +#endif + case IOQ_EXIT_EVENT: + case IOQ_EXIT_EVENT_ASYNC: +#ifdef UNIX +#ifdef HAVE_POLL_H + ddp->ofd = open("/dev/null", O_WRONLY); + if (ddp->ofd < 0) { + driver_failure_posix(ddp->port, errno); + return 0; + } + else if (driver_event(ddp->port, FD2EV(ddp->ofd), NULL) != 0) { + res_str = "skip: driver_event() not supported"; + goto done; + } +#else + res_str = "skip: No poll.h found which is needed for this test"; + goto done; +#endif + break; +#else /* UNIX */ + goto done; +#endif + case IOQ_EXIT_TIMEOUT: + case IOQ_EXIT_TIMEOUT_ASYNC: + break; + case IOQ_EXIT_READY_ASYNC: + break; + default: + res_str = "error: command not supported"; + goto done; + } + + driver_enq(ddp->port, "!", 1); + ddp->test = (IOQExitTest) command; + res_str = "ok"; + + done: { + int res_len = strlen(res_str); + if (res_len > rlen) { + char *abuf = driver_alloc(sizeof(char)*res_len); + if (!abuf) + return 0; + *rbuf = abuf; + } + + memcpy((void *) *rbuf, (void *) res_str, res_len); + + return res_len; + } +} + +static void stop(ErlDrvData drv_data) +{ + IOQExitDrvData *ddp = (IOQExitDrvData *) drv_data; + + PRINTF(("stop(%p) called\r\n", drv_data)); + + if (ddp) { + switch (ddp->test) { +#ifdef UNIX + case IOQ_EXIT_READY_INPUT: + case IOQ_EXIT_READY_INPUT_ASYNC: + if (ddp->ifd >= 0) { + driver_select(ddp->port, FD2EV(ddp->ifd), DO_READ, 0); + close(ddp->ifd); + } + break; + case IOQ_EXIT_READY_OUTPUT: + case IOQ_EXIT_READY_OUTPUT_ASYNC: + if (ddp->ofd >= 0) { + driver_select(ddp->port, FD2EV(ddp->ofd), DO_WRITE, 0); + close(ddp->ofd); + } + break; + case IOQ_EXIT_EVENT: + case IOQ_EXIT_EVENT_ASYNC: + if (ddp->ofd >= 0) { + driver_event(ddp->port, FD2EV(ddp->ofd), NULL); + close(ddp->ofd); + } + break; +#endif + case IOQ_EXIT_TIMEOUT: + case IOQ_EXIT_TIMEOUT_ASYNC: + driver_cancel_timer(ddp->port); + break; + case IOQ_EXIT_READY_ASYNC: + if (ddp->outstanding_async_task) + driver_async_cancel(ddp->async_task); + break; + default: + break; + } + driver_free(ddp); + } +} + + +static void flush(ErlDrvData drv_data) +{ + IOQExitDrvData *ddp = (IOQExitDrvData *) drv_data; + + PRINTF(("flush(%p) called\r\n", drv_data)); + + switch (ddp->test) { +#ifdef UNIX + case IOQ_EXIT_READY_INPUT: + case IOQ_EXIT_READY_INPUT_ASYNC: + driver_select(ddp->port, FD2EV(ddp->ifd), DO_READ, 1); + break; + case IOQ_EXIT_READY_OUTPUT: + case IOQ_EXIT_READY_OUTPUT_ASYNC: + driver_select(ddp->port, FD2EV(ddp->ofd), DO_WRITE, 1); + break; + case IOQ_EXIT_EVENT: + case IOQ_EXIT_EVENT_ASYNC: +#ifdef HAVE_POLL_H + ddp->event_data.events |= POLLOUT; + driver_event(ddp->port, FD2EV(ddp->ofd), &ddp->event_data); +#endif + break; +#endif + case IOQ_EXIT_TIMEOUT: + case IOQ_EXIT_TIMEOUT_ASYNC: + driver_set_timer(ddp->port, 0); + break; + case IOQ_EXIT_READY_ASYNC: + do_driver_async(ddp); + break; + default: + break; + } +} + +static void ready_input(ErlDrvData drv_data, ErlDrvEvent event) +{ + IOQExitDrvData *ddp = (IOQExitDrvData *) drv_data; + + PRINTF(("ready_input(%p, %d) called\r\n", drv_data, EV2FD(event))); + +#ifdef UNIX + if (ddp->ifd == EV2FD(event)) { + driver_select(ddp->port, FD2EV(ddp->ifd), DO_READ, 0); + close(ddp->ifd); + ddp->ifd = -1; + if (ddp->test == IOQ_EXIT_READY_INPUT_ASYNC) + do_driver_async(ddp); + else + driver_deq(ddp->port, 1); + } +#endif +} + +static void ready_output(ErlDrvData drv_data, ErlDrvEvent event) +{ + IOQExitDrvData *ddp = (IOQExitDrvData *) drv_data; + + PRINTF(("ready_output(%p, %d) called\r\n", drv_data, EV2FD(event))); + +#ifdef UNIX + if (ddp->ofd == EV2FD(event)) { + driver_select(ddp->port, FD2EV(ddp->ofd), DO_WRITE, 0); + close(ddp->ofd); + ddp->ofd = -1; + if (ddp->test == IOQ_EXIT_READY_OUTPUT_ASYNC) + do_driver_async(ddp); + else + driver_deq(ddp->port, 1); + } +#endif +} + +static void timeout(ErlDrvData drv_data) +{ + IOQExitDrvData *ddp = (IOQExitDrvData *) drv_data; + + PRINTF(("timeout(%p) called\r\n", drv_data)); + + if (ddp->test == IOQ_EXIT_TIMEOUT_ASYNC) + do_driver_async(ddp); + else + driver_deq(ddp->port, 1); +} + +static void ready_async(ErlDrvData drv_data, ErlDrvThreadData thread_data) +{ + IOQExitDrvData *ddp = (IOQExitDrvData *) drv_data; + + PRINTF(("ready_async(%p, %p) called\r\n", drv_data, thread_data)); + + if (drv_data == (ErlDrvData) thread_data) { + driver_deq(ddp->port, 1); + ddp->outstanding_async_task = 0; + } +} + +static void event(ErlDrvData drv_data, + ErlDrvEvent event, + ErlDrvEventData event_data) +{ + IOQExitDrvData *ddp = (IOQExitDrvData *) drv_data; + + PRINTF(("event(%p, %d, %p) called\r\n", drv_data, EV2FD(event), event_data)); + +#if defined(UNIX) && defined(HAVE_POLL_H) + if (ddp->ofd == EV2FD(event)) { + driver_event(ddp->port, FD2EV(ddp->ofd), NULL); + close(ddp->ofd); + ddp->ofd = -1; + if (ddp->test == IOQ_EXIT_EVENT_ASYNC) + do_driver_async(ddp); + else + driver_deq(ddp->port, 1); + } +#endif +} + +static void async_invoke(void *arg) +{ + PRINTF(("async_invoke(%p) called\r\n", arg)); +} + +static void do_driver_async(IOQExitDrvData *ddp) +{ + ErlDrvSysInfo si; + long task; + ddp->outstanding_async_task = 1; + task = driver_async(ddp->port, NULL, async_invoke, ddp, NULL); + /* If no async threads, ddp has been deallocated now */ + driver_system_info(&si, sizeof(ErlDrvSysInfo)); + if (si.async_threads) + ddp->async_task = task; +} + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/io_ready_exit_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/io_ready_exit_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/io_ready_exit_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/io_ready_exit_drv.c 2007-11-26 19:01:08.000000000 +0000 @@ -0,0 +1,151 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#ifndef UNIX +#if !defined(__WIN32__) && !defined(_OSE_) && !defined(VXWORKS) +#define UNIX 1 +#endif +#endif + +#include +#include +#ifdef UNIX +#include +#endif +#include "erl_driver.h" + +typedef struct { + ErlDrvPort port; + int fds[2]; +} IOReadyExitDrvData; + +static ErlDrvData io_ready_exit_drv_start(ErlDrvPort, char *); +static void io_ready_exit_drv_stop(ErlDrvData); +static void io_ready_exit_ready_input(ErlDrvData, ErlDrvEvent); +static void io_ready_exit_ready_output(ErlDrvData, ErlDrvEvent); +static void io_ready_exit_drv_output(ErlDrvData, char *, int); +static void io_ready_exit_drv_finish(void); +static int io_ready_exit_drv_control(ErlDrvData, unsigned int, + char *, int, char **, int); + +static ErlDrvEntry io_ready_exit_drv_entry = { + NULL, /* init */ + io_ready_exit_drv_start, + io_ready_exit_drv_stop, + NULL /* output */, + io_ready_exit_ready_input, + io_ready_exit_ready_output, + "io_ready_exit_drv", + NULL /* finish */, + NULL, /* handle */ + io_ready_exit_drv_control, + NULL, /* timeout */ + NULL, /* outputv */ + NULL /* ready_async */ +}; + +/* ------------------------------------------------------------------------- +** Entry functions +**/ + +DRIVER_INIT(io_ready_exit_drv) +{ + return &io_ready_exit_drv_entry; +} + +static ErlDrvData +io_ready_exit_drv_start(ErlDrvPort port, char *command) { + IOReadyExitDrvData *oeddp = driver_alloc(sizeof(IOReadyExitDrvData)); + oeddp->port = port; + oeddp->fds[0] = -1; + oeddp->fds[1] = -1; + return (ErlDrvData) oeddp; +} + +static void +io_ready_exit_drv_stop(ErlDrvData drv_data) { + IOReadyExitDrvData *oeddp = (IOReadyExitDrvData *) drv_data; +#ifdef UNIX + if (oeddp->fds[0] >= 0) { + driver_select(oeddp->port, + (ErlDrvEvent) oeddp->fds[0], + DO_READ|DO_WRITE, + 0); + close(oeddp->fds[0]); + } + if (oeddp->fds[1] >= 0) + close(oeddp->fds[1]); +#endif + driver_free((void *) oeddp); +} + + +static void +io_ready_exit_ready_output(ErlDrvData drv_data, ErlDrvEvent event) +{ + IOReadyExitDrvData *oeddp = (IOReadyExitDrvData *) drv_data; + driver_failure_atom(oeddp->port, "ready_output_driver_failure"); +} + +static void +io_ready_exit_ready_input(ErlDrvData drv_data, ErlDrvEvent event) +{ + IOReadyExitDrvData *oeddp = (IOReadyExitDrvData *) drv_data; + driver_failure_atom(oeddp->port, "ready_input_driver_failure"); +} + +static int +io_ready_exit_drv_control(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen) +{ + char *abuf; + char *res_str; + int res_len; + IOReadyExitDrvData *oeddp = (IOReadyExitDrvData *) drv_data; +#ifndef UNIX + res_str = "nyiftos"; +#else + if (pipe(oeddp->fds) < 0) { + res_str = "pipe failed"; + } + else { + res_str = "ok"; + write(oeddp->fds[1], "!", 1); + driver_select(oeddp->port, + (ErlDrvEvent) oeddp->fds[0], + DO_READ|DO_WRITE, + 1); + } +#endif + res_len = strlen(res_str); + if (res_len > rlen) { + abuf = driver_alloc(sizeof(char)*res_len); + if (!abuf) + return 0; + *rbuf = abuf; + } + + memcpy((void *) *rbuf, (void *) res_str, res_len); + + return res_len; +} + + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/larger_major_vsn_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/larger_major_vsn_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/larger_major_vsn_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/larger_major_vsn_drv.c 2007-11-26 19:01:32.000000000 +0000 @@ -0,0 +1,31 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Implementation of a driver with a larger major + * driver version than the current system. + */ + +#define VSN_MISMATCH_DRV_NAME_STR "larger_major_vsn_drv" +#define VSN_MISMATCH_DRV_NAME larger_major_vsn_drv +#define VSN_MISMATCH_DRV_MAJOR_VSN_DIFF 1 +#define VSN_MISMATCH_DRV_MINOR_VSN_DIFF 0 + +#include "vsn_mismatch_drv_impl.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/larger_minor_vsn_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/larger_minor_vsn_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/larger_minor_vsn_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/larger_minor_vsn_drv.c 2007-11-26 19:01:33.000000000 +0000 @@ -0,0 +1,31 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Implementation of a driver with a larger minor + * driver version than the current system. + */ + +#define VSN_MISMATCH_DRV_NAME_STR "larger_minor_vsn_drv" +#define VSN_MISMATCH_DRV_NAME larger_minor_vsn_drv +#define VSN_MISMATCH_DRV_MAJOR_VSN_DIFF 0 +#define VSN_MISMATCH_DRV_MINOR_VSN_DIFF 1 + +#include "vsn_mismatch_drv_impl.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/Makefile.src 2009-11-20 13:30:29.000000000 +0000 @@ -0,0 +1,33 @@ + +MISC_DRVS = outputv_drv@dll@ \ + timer_drv@dll@ \ + queue_drv@dll@ \ + io_ready_exit_drv@dll@ \ + chkio_drv@dll@ \ + monitor_drv@dll@ \ + ioq_exit_drv@dll@ \ + peek_non_existing_queue_drv@dll@ \ + otp_6879_drv@dll@ \ + caller_drv@dll@ \ + many_events_drv@dll@ \ + missing_callback_drv@dll@ \ + thr_alloc_drv@dll@ + +SYS_INFO_DRVS = sys_info_1_0_drv@dll@ \ + sys_info_1_1_drv@dll@ \ + sys_info_curr_drv@dll@ + +VSN_MISMATCH_DRVS = zero_extended_marker_garb_drv@dll@ \ + invalid_extended_marker_drv@dll@ \ + larger_major_vsn_drv@dll@ \ + larger_minor_vsn_drv@dll@ \ + smaller_major_vsn_drv@dll@ \ + smaller_minor_vsn_drv@dll@ + +all: $(MISC_DRVS) $(SYS_INFO_DRVS) $(VSN_MISMATCH_DRVS) + +@SHLIB_RULES@ + +$(SYS_INFO_DRVS): sys_info_drv_impl.h sys_info_drv_impl.c +$(VSN_MISMATCH_DRVS): vsn_mismatch_drv_impl.c + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/many_events_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/many_events_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/many_events_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/many_events_drv.c 2009-03-12 12:16:45.000000000 +0000 @@ -0,0 +1,98 @@ +#ifdef __WIN32__ +#include +#endif + +#include +#include "erl_driver.h" + +static ErlDrvPort erlang_port; +static ErlDrvData many_events_start(ErlDrvPort, char *); +static void from_erlang(ErlDrvData, char*, int); +static void from_port(ErlDrvData drv_data, ErlDrvEvent event); +static int many_events_call(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen, unsigned *ret_flags); +static ErlDrvEntry many_events_driver_entry = { + NULL, /* Init */ + many_events_start, + NULL, /* Stop */ + from_erlang, + from_port, /* Ready input */ + NULL, /* Ready output */ + "many_events_drv", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + many_events_call +}; + +DRIVER_INIT(many_events_drv) +{ + return &many_events_driver_entry; +} + +static ErlDrvData +many_events_start(ErlDrvPort port, char *buf) +{ + return (ErlDrvData) port; +} + +static void +from_erlang(ErlDrvData data, char *buf, int count) +{ + int i; + int num; + char *b2 = driver_alloc(count + 1); + char b3[1024]; + + memcpy(b2,buf,count); + b2[count] = '\0'; + + num = atoi(b2); + + driver_free(b2); + + if(num < 0) + num = 0; +#ifdef __WIN32__ + for (i = 0; i < num; ++i) { + HANDLE ev = CreateEvent(NULL, TRUE, FALSE, NULL); + + if (ev == INVALID_HANDLE_VALUE || + driver_select((ErlDrvPort) data, (ErlDrvEvent) ev, + DO_READ, 1) != 0) { + break; + } + SetEvent(ev); + } +#else + i = num; +#endif + sprintf(b3,"%d",i); + driver_output((ErlDrvPort) data, b3, strlen(b3)); +} + +static void from_port(ErlDrvData data, ErlDrvEvent ev) +{ +#ifdef __WIN32__ + /*static int counter = 0;*/ + driver_select((ErlDrvPort) data, (ErlDrvEvent) ev, + DO_READ, 0); + CloseHandle((HANDLE) ev); + /*fprintf(stderr,"Close no %d\r\n",counter++);*/ +#endif + return; +} + +static int +many_events_call(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen, unsigned *ret_flags) +{ + *rbuf = buf; + *ret_flags |= DRIVER_CALL_KEEP_BUFFER; + return len; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/missing_callback_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/missing_callback_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/missing_callback_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/missing_callback_drv.c 2009-03-12 12:16:46.000000000 +0000 @@ -0,0 +1,144 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson AB. Portions + * created by Ericsson are Copyright 2008, Ericsson Utvecklings AB. All + * Rights Reserved.'' + * + * $Id$ + */ + +#ifndef UNIX +#if !defined(__WIN32__) && !defined(_OSE_) && !defined(VXWORKS) +#define UNIX 1 +#endif +#endif + +#ifdef UNIX +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_POLL_H +# include +#endif +#endif /* UNIX */ + +#include "erl_driver.h" + +typedef struct { + int ofd; + int ifd; + int efd; +#ifdef HAVE_POLL_H + struct erl_drv_event_data edata; +#endif +} mcd_data_t; + +static ErlDrvData start(ErlDrvPort port, char *command); +static void stop(ErlDrvData data); + +static ErlDrvEntry missing_callback_drv_entry = { + NULL /* init */, + start, + stop, + NULL /* output */, + NULL /* ready_input */, + NULL /* ready_output */, + "missing_callback_drv", + NULL /* finish */, + NULL /* handle */, + NULL /* control */, + NULL /* timeout */, + NULL /* outputv */, + NULL /* ready_async */, + NULL /* flush */, + NULL /* call */, + NULL /* event */, + ERL_DRV_EXTENDED_MARKER, + ERL_DRV_EXTENDED_MAJOR_VERSION, + ERL_DRV_EXTENDED_MINOR_VERSION, + ERL_DRV_FLAG_USE_PORT_LOCKING, + NULL, /* handle2 */ + NULL /* process_exit */ +}; + +DRIVER_INIT(missing_callback_drv) +{ + return &missing_callback_drv_entry; +} + +static ErlDrvData +start(ErlDrvPort port, char *command) +{ + mcd_data_t *mcd = driver_alloc(sizeof(mcd_data_t)); + + if (!mcd) + goto error; + + mcd->ofd = -1; + mcd->ifd = -1; + mcd->efd = -1; + +#ifdef UNIX + + mcd->ofd = open("/dev/null", O_WRONLY); + if (mcd->ofd < 0) + goto error; + if (driver_select(port, (ErlDrvEvent) (long) mcd->ofd, DO_WRITE, 1) != 0) + goto error; + + mcd->ifd = open("/dev/zero", O_RDONLY); + if (mcd->ifd < 0) + goto error; + if (driver_select(port, (ErlDrvEvent) (long) mcd->ifd, DO_READ, 1) != 0) + goto error; + +#ifdef HAVE_POLL_H + mcd->efd = open("/dev/null", O_WRONLY); + if (mcd->efd < 0) + goto error; + mcd->edata.events = POLLOUT; + mcd->edata.revents = 0; + driver_event(port, (ErlDrvEvent) (long) mcd->efd, &mcd->edata); +#endif +#endif + + driver_set_timer(port, 0); + + return (ErlDrvData) mcd; + + error: + stop((ErlDrvData) mcd); + return ERL_DRV_ERROR_GENERAL; +} + +static void +stop(ErlDrvData data) +{ + mcd_data_t *mcd = (mcd_data_t *) data; + if (mcd) { +#ifdef UNIX + if (mcd->ofd >= 0) + close(mcd->ofd); + if (mcd->ifd >= 0) + close(mcd->ifd); +#ifdef HAVE_POLL_H + if (mcd->efd >= 0) + close(mcd->efd); +#endif +#endif + driver_free(mcd); + } +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/monitor_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/monitor_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/monitor_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/monitor_drv.c 2007-11-26 19:01:31.000000000 +0000 @@ -0,0 +1,293 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include +#include +#include "erl_driver.h" + +static ErlDrvData monitor_drv_start(ErlDrvPort, char *); +static int monitor_drv_control(ErlDrvData, unsigned int, + char *, int, char **, int); +static void handle_monitor(ErlDrvData drv_data, ErlDrvMonitor *monitor); + +#define OP_I_AM_IPID 1 +#define OP_MONITOR_ME 2 +#define OP_DEMONITOR_ME 3 +#define OP_MONITOR_ME_LATER 4 +#define OP_DO_DELAYED_MONITOR 5 + +typedef struct one_monitor { + ErlDrvTermData pid; + int later_id; + ErlDrvMonitor mon; + struct one_monitor *next; +} OneMonitor; + + +typedef struct { + ErlDrvPort port; + ErlDrvTermData ipid; + int later_counter; + OneMonitor *first; +} MyDrvData; + + +static ErlDrvEntry monitor_drv_entry = { + NULL /* init */, + monitor_drv_start, + NULL /* stop */, + NULL /* output */, + NULL /* ready_input */, + NULL /* ready_output */, + "monitor_drv", + NULL /* finish */, + NULL /* handle */, + monitor_drv_control, + NULL /* timeout */, + NULL /* outputv */, + NULL /* ready_async */, + NULL /* flush */, + NULL /* call */, + NULL /* event */, + ERL_DRV_EXTENDED_MARKER, + ERL_DRV_EXTENDED_MAJOR_VERSION, + ERL_DRV_EXTENDED_MINOR_VERSION, + 0, + NULL, /* handle2 */ + handle_monitor +}; + +DRIVER_INIT(monitor_drv) +{ + return &monitor_drv_entry; +} + +static ErlDrvData +monitor_drv_start(ErlDrvPort port, char *command) { + MyDrvData *data = driver_alloc(sizeof(MyDrvData)); + data->port = port; + data->ipid = driver_term_nil; + data->first = NULL; + data->later_counter = 0; + return (ErlDrvData) data; +} + +static void monitor_drv_stop(ErlDrvData data) +{ + driver_free((void *) data); +} + +static void handle_monitor(ErlDrvData drv_data, ErlDrvMonitor *monitor) +{ + + MyDrvData *data = (MyDrvData *) drv_data; + OneMonitor *p,*o; + for (p = data->first, o = NULL; + p != NULL && driver_compare_monitors(&p->mon,monitor); + o = p, p = p->next) + ; + if (!p) { + fprintf(stderr,"Spooky Monitor executed!\r\n"); + } else { + ErlDrvTermData spec[] = { + ERL_DRV_ATOM, driver_mk_atom("monitor_fired"), + ERL_DRV_PORT, driver_mk_port(data->port), + ERL_DRV_PID, p->pid, + ERL_DRV_TUPLE, TERM_DATA(3) + }; + if (!o) { + data->first = p->next; + } else { + o->next = p->next; + } + driver_free(p); + driver_send_term(data->port, data->ipid, spec, sizeof(spec)/sizeof(ErlDrvTermData)); + } + + return; +} + +static int +monitor_drv_control(ErlDrvData drv_data, + unsigned int command, + char *ibuf, int ilen, + char **rbuf, int rlen) +{ + MyDrvData *data = (MyDrvData *) drv_data; + char *answer = NULL; + char buff[64]; + int alen; + + switch (command) { + case OP_I_AM_IPID: + data->ipid = driver_caller(data->port); + answer = "ok"; + break; + case OP_MONITOR_ME: + { + int res; + OneMonitor *om = driver_alloc(sizeof(OneMonitor)); + om->pid = driver_caller(data->port); + om->later_id = 0; + res = driver_monitor_process(data->port,om->pid,&(om->mon)); + if (res < 0) { + answer = "error"; + driver_free(om); + } else if (res > 0) { + answer = "noproc"; + driver_free(om); + } else { + om->next = data->first; + data->first = om; + answer = "ok"; + } + break; + } + case OP_DEMONITOR_ME: + { + int res; + OneMonitor *p,*q = NULL; + int found = 0; + ErlDrvTermData pid = driver_caller(data->port); + for (p = data->first; p != NULL; p = p->next) { + if (p->pid == pid) { + q = p; + ++found; + } + } + if (q == NULL) { + answer = "not_monitored"; + } else { + if (q->later_id > 0) { + if (found > 1) { + answer = "delayd_but_more"; + } else { + answer = "delayed"; + } + } else { + res = driver_demonitor_process(data->port, &(q->mon)); + if (res < 0) { + answer = "error"; + } else if (res > 0) { + if (found > 1) { + answer = "gone_but_more"; + } else { + answer = "gone"; + } + } else { + if (found > 1) { + answer = "ok_but_more"; + } else { + answer = "ok"; + } + } + } + if (data->first == q) { + data->first = q->next; + } else { + for (p = data->first; p != NULL; p = p->next) { + if (p->next == q) { + p->next = q->next; + break; + } + } + } + driver_free(q); + } + break; + } + case OP_MONITOR_ME_LATER: + { + int res; + OneMonitor *om = driver_alloc(sizeof(OneMonitor)); + om->pid = driver_caller(data->port); + om->later_id = (++(data->later_counter)); + om->next = data->first; + data->first = om; + sprintf(buff,"ok:%d",om->later_id); + answer = buff; + break; + } + case OP_DO_DELAYED_MONITOR: + { + int id = 0, sign = 1, in_number = 0; + OneMonitor *p, *q; + char *bp; + for (bp = ibuf; bp < (ibuf + ilen); ++bp) { + if (*bp <= '9' && *bp >= '0') { + int x = *bp - '0'; + in_number++; + id *= 10; + id += x; + } else if (*bp == '-') { + if (in_number) { + break; + } + sign = -1; + ++in_number; + } else { + if (in_number) { + break; + } + } + } + id *= sign; + q = NULL; + for (p = data->first; p != NULL; q = p, p = p->next) { + if (p->later_id != 0 && p->later_id == id) { + break; + } + } + if (p == NULL) { + answer = "not_found"; + } else { + int res = driver_monitor_process(data->port,p->pid,&(p->mon)); + if (res != 0) { + if (res < 0) { + answer = "error"; + } else { + answer = "noproc"; + } + if (q == NULL) { + data->first = p->next; + } else { + q->next = p->next; + } + driver_free(p); + } else { + p->later_id = 0; + answer = "ok"; + } + } + break; + } + default: + answer = "unknown_op"; + } + if (answer == NULL) { + answer = "internal_error"; + } + alen = strlen(answer); + if (alen >= rlen) { + *rbuf = driver_alloc(alen+1); + } + strcpy(*rbuf,answer); + return alen; +} + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/otp_6879_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/otp_6879_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/otp_6879_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/otp_6879_drv.c 2007-11-26 19:01:49.000000000 +0000 @@ -0,0 +1,71 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include +#include +#include "erl_driver.h" + +static int call(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen, + unsigned int *flags); + +static ErlDrvEntry otp_6879_drv_entry = { + NULL /* init */, + NULL /* start */, + NULL /* stop */, + NULL /* output */, + NULL /* ready_input */, + NULL /* ready_output */, + "otp_6879_drv", + NULL /* finish */, + NULL /* handle */, + NULL /* control */, + NULL /* timeout */, + NULL /* outputv */, + NULL /* ready_async */, + NULL /* flush */, + call, + NULL /* event */, + ERL_DRV_EXTENDED_MARKER, + ERL_DRV_EXTENDED_MAJOR_VERSION, + ERL_DRV_EXTENDED_MINOR_VERSION, + ERL_DRV_FLAG_USE_PORT_LOCKING, + NULL /* handle2 */, + NULL /* handle_monitor */ +}; + +DRIVER_INIT(otp_6879_drv) +{ + return &otp_6879_drv_entry; +} + + +static int call(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen, + unsigned int *flags) +{ + /* echo call */ + if (len > rlen) + *rbuf = driver_alloc(len); + memcpy((void *) *rbuf, (void *) buf, len); + return len; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/outputv_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/outputv_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/outputv_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/outputv_drv.c 2001-10-08 09:42:08.000000000 +0100 @@ -0,0 +1,63 @@ +#include +#include "erl_driver.h" + +static ErlDrvPort erlang_port; +static ErlDrvData outputv_start(ErlDrvPort, char*); +static void outputv_stop(ErlDrvData), outputv_read(ErlDrvData, char*, int), outputv(ErlDrvData, ErlIOVec*); + +static ErlDrvEntry outputv_driver_entry = +{ + NULL, + outputv_start, + outputv_stop, + outputv_read, + NULL, + NULL, + "outputv_drv", + NULL, + NULL, + NULL, + NULL, + outputv, + NULL +}; + +DRIVER_INIT(outputv_drv) +{ + erlang_port = (ErlDrvPort)-1; + return &outputv_driver_entry; +} + +static ErlDrvData outputv_start(ErlDrvPort port, char *buf) +{ + if (erlang_port != (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + + erlang_port = port; + return (ErlDrvData)port; +} + +static void outputv_read(ErlDrvData port, char *buf, int count) +{ + erlang_port = (ErlDrvPort)-1; +} + +static void outputv_stop(ErlDrvData port) +{ + erlang_port = (ErlDrvPort)-1; +} + +/* Erts outputv -> drv, echo it back */ +static void outputv(ErlDrvData port, ErlIOVec* ev) +{ + driver_outputv(erlang_port, NULL, 0, ev, 0); +} + + + + + + + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/peek_non_existing_queue_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/peek_non_existing_queue_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/peek_non_existing_queue_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/peek_non_existing_queue_drv.c 2007-11-26 19:01:44.000000000 +0000 @@ -0,0 +1,231 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Tests that port I/O queues can be flushed via: + * - ready_input(), + * - ready_output(), + * - timeout(), + * - driver_async() -> read_async(), and + * - event() + */ + +#ifndef UNIX +#if !defined(__WIN32__) && !defined(_OSE_) && !defined(VXWORKS) +#define UNIX 1 +#endif +#endif + +#if defined(DEBUG) || 0 +# define PRINTF(X) printf X +#else +# define PRINTF(X) +#endif + +#if defined(UNIX) +#include +#include +#elif defined(__WIN32__) +#include +#endif + +#include + +#include "erl_driver.h" + +#define PEEK_NONXQ_TEST 0 +#define PEEK_NONXQ_WAIT 1 + +typedef struct { + ErlDrvTermData caller; + ErlDrvPort port; + int cmd; +} PeekNonXQDrvData; + +typedef struct { + ErlDrvPort port; + ErlDrvPDL pdl; +} AsyncData; + +static ErlDrvData start(ErlDrvPort, char *); +static void stop(ErlDrvData); +static int control(ErlDrvData, unsigned int, char *, int, char **, int); +static void ready_async(ErlDrvData, ErlDrvThreadData); +static void async_test(void *); +static void async_wait(void *); +static void async_free(void *); +static void do_sleep(unsigned); + +static ErlDrvEntry peek_non_existing_queue_drv_entry = { + NULL /* init */, + start, + stop, + NULL /* output */, + NULL /* ready_input */, + NULL /* ready_output */, + "peek_non_existing_queue_drv", + NULL /* finish */, + NULL /* handle */, + control, + NULL /* timeout */, + NULL /* outputv */, + ready_async, + NULL /* flush */, + NULL /* call */, + NULL /* event */, + ERL_DRV_EXTENDED_MARKER, + ERL_DRV_EXTENDED_MAJOR_VERSION, + ERL_DRV_EXTENDED_MINOR_VERSION, + ERL_DRV_FLAG_USE_PORT_LOCKING, + NULL /* handle2 */, + NULL /* process_exit */ +}; + +DRIVER_INIT(peek_non_existing_queue_drv) +{ + return &peek_non_existing_queue_drv_entry; +} + +static ErlDrvData +start(ErlDrvPort port, char *command) +{ + PeekNonXQDrvData *dp = driver_alloc(sizeof(PeekNonXQDrvData)); + if (!dp) { + errno = ENOMEM; + return ERL_DRV_ERROR_ERRNO; + } + + dp->port = port; + return (ErlDrvData) dp; +} + +static void stop(ErlDrvData drv_data) +{ + driver_free(drv_data); +} + +static int control(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen) +{ + PeekNonXQDrvData *dp = (PeekNonXQDrvData *) drv_data; + unsigned int key = 0; + char *res_str = "ok"; + ErlDrvSysInfo si; + driver_system_info(&si, sizeof(ErlDrvSysInfo)); + if (si.async_threads == 0) { + res_str = "skipped: No async-threads available"; + goto done; + } + + dp->cmd = command; + dp->caller = driver_caller(dp->port); + + switch (command) { + case PEEK_NONXQ_TEST: { + AsyncData *adp = driver_alloc(sizeof(AsyncData)); + if (!adp) { + res_str = "enomem"; + goto done; + } + driver_enq(dp->port, "!", 1); + adp->port = dp->port; + adp->pdl = driver_pdl_create(dp->port); + (void) driver_async(dp->port, &key, async_test, adp, async_free); + break; + } + case PEEK_NONXQ_WAIT: + (void) driver_async(dp->port, &key, async_wait, NULL, NULL); + break; + } + + done: { + int res_len = strlen(res_str); + if (res_len > rlen) { + char *abuf = driver_alloc(sizeof(char)*res_len); + if (!abuf) + return 0; + *rbuf = abuf; + } + + memcpy((void *) *rbuf, (void *) res_str, res_len); + + return res_len; + } +} + +static void ready_async(ErlDrvData drv_data, ErlDrvThreadData thread_data) +{ + PeekNonXQDrvData *dp = (PeekNonXQDrvData *) drv_data; + if (dp->cmd == PEEK_NONXQ_WAIT) { + ErlDrvTermData spec[] = { + ERL_DRV_PORT, driver_mk_port(dp->port), + ERL_DRV_ATOM, driver_mk_atom("test_successful"), + ERL_DRV_TUPLE, 2 + }; + driver_send_term(dp->port, + dp->caller, + spec, + sizeof(spec) / sizeof(spec[0])); + } + if (thread_data) + driver_free(thread_data); +} + +static void async_test(void *vadp) +{ + SysIOVec *vec; + int vlen = 4711; + AsyncData *adp = (AsyncData *)vadp; + + do_sleep(1); + + driver_pdl_lock(adp->pdl); + vec = driver_peekq(adp->port, &vlen); + if (vlen >= 0 || vec) + abort(); /* A crude way to fail the test, but what the ... */ + vlen = driver_sizeq(adp->port); + if (vlen >= 0) + abort(); /* ... */ + driver_pdl_unlock(adp->pdl); +} + +static void async_wait(void *vadp) +{ + /* Will always be executed after async_test in the same thread */ +} + + +static void async_free(void *vadp) +{ + driver_free(vadp); +} + +static void +do_sleep(unsigned secs) +{ +#ifdef __WIN32__ + Sleep((DWORD) secs*1000); +#else + sleep(secs); +#endif +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/queue_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/queue_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/queue_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/queue_drv.c 2002-10-09 15:27:02.000000000 +0100 @@ -0,0 +1,195 @@ +#include +#include "erl_driver.h" + +#define put_int32(i, s) {((char*)(s))[0] = (char)((i) >> 24) & 0xff; \ + ((char*)(s))[1] = (char)((i) >> 16) & 0xff; \ + ((char*)(s))[2] = (char)((i) >> 8) & 0xff; \ + ((char*)(s))[3] = (char)((i) & 0xff);} + +#define get_int32(s) ((((unsigned char*) (s))[0] << 24) | \ + (((unsigned char*) (s))[1] << 16) | \ + (((unsigned char*) (s))[2] << 8) | \ + (((unsigned char*) (s))[3])) + +/* + * Data operations. To use, send code using erlang:port_control/2, + * then send the data to the port. + */ + +#define PUSHQ 0 +#define ENQ 1 +#define PUSHQ_BIN 2 +#define ENQ_BIN 3 +#define PUSHQV 4 +#define ENQV 5 + +/* + * Control operations. Data is returned directly. + */ +#define DEQ 6 +#define BYTES_QUEUED 7 +#define READ_HEAD 8 + +static ErlDrvPort erlang_port; +static unsigned opcode; /* Opcode for next operation. */ +static ErlDrvData queue_start(ErlDrvPort, char*); +static void queue_stop(ErlDrvData), queue_read(ErlDrvData, char*, int); +static void queue_outputv(ErlDrvData, ErlIOVec*); +static int control(ErlDrvData, unsigned int, char*, int, char**, int); +static ErlDrvBinary* read_head(ErlDrvPort, int bytes); + +static ErlDrvEntry queue_driver_entry = +{ + NULL, + queue_start, + queue_stop, + queue_read, + NULL, + NULL, + "queue_drv", + NULL, + NULL, + control, + NULL, + queue_outputv, + NULL +}; + +DRIVER_INIT(queue_drv) +{ + erlang_port = (ErlDrvPort) -1; + return &queue_driver_entry; +} + +static ErlDrvData queue_start(ErlDrvPort port, char *buf) +{ + if (erlang_port != (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + erlang_port = port; + opcode = 0xFFFFFFFF; + set_port_control_flags(erlang_port, PORT_CONTROL_FLAG_BINARY); + return (ErlDrvData)port; +} + +/* messages from Erlang */ +static void queue_read(ErlDrvData port, char *buf, int len) +{ +} + +static void queue_stop(ErlDrvData port) +{ + erlang_port = (ErlDrvPort) -1; +} + +static int +control(ErlDrvData drv_data, unsigned command, char* buf, int len, char** rbuf, int rlen) +{ + ErlDrvBinary* b; + + switch (command) { + case PUSHQ: + case ENQ: + case PUSHQ_BIN: + case ENQ_BIN: + case PUSHQV: + case ENQV: + opcode = command; + *rbuf = NULL; + return 0; + case DEQ: + *rbuf = NULL; + if (len != 4) { + driver_failure_atom(erlang_port, "deq: bad length"); + } else { + int n = get_int32(buf); + driver_deq(erlang_port, n); + } + return 0; + case BYTES_QUEUED: + *rbuf = (char*)(b = driver_alloc_binary(4)); + put_int32(driver_sizeq(erlang_port), b->orig_bytes); + return 0; + case READ_HEAD: + if (len != 4) { + driver_failure_atom(erlang_port, "read_head: bad length"); + return 0; + } else { + int n = get_int32(buf); + *rbuf = (char *) read_head(erlang_port, n); + return 0; /* Ignored anyway */ + } + default: + driver_failure_atom(erlang_port, "bad opcode to control()"); + return 0; + } +} + +static void +queue_outputv(ErlDrvData drv_data, ErlIOVec* ev) +{ + ErlDrvBinary* bin; + ErlDrvPort ix = (ErlDrvPort) drv_data; + int i = ev->vsize - 1; + int offset; + + switch (opcode) { + case PUSHQ: + driver_pushq(ix, ev->iov[i].iov_base, ev->iov[i].iov_len); + break; + case ENQ: + driver_enq(ix, ev->iov[i].iov_base, ev->iov[i].iov_len); + break; + case PUSHQ_BIN: + case ENQ_BIN: + if (ev->binv[i] != NULL) { + bin = ev->binv[i]; + offset = ev->iov[i].iov_base - bin->orig_bytes; + } else { + bin = driver_alloc_binary(ev->iov[i].iov_len); + memcpy(bin->orig_bytes, ev->iov[i].iov_base, ev->iov[i].iov_len); + offset = 0; + } + if (opcode == PUSHQ_BIN) { + driver_pushq_bin(ix, bin, offset, ev->iov[i].iov_len); + } else { + driver_enq_bin(ix, bin, offset, ev->iov[i].iov_len); + } + if (ev->binv[i] == NULL) { + driver_free_binary(bin); + } + break; + case PUSHQV: + driver_pushqv(ix, ev, 0); + break; + case ENQV: + driver_enqv(ix, ev, 0); + break; + default: + fprintf(stderr, "[queue_drv] Bad opcode %d\n", opcode); + driver_failure_atom(ix, "bad_opcode"); + break; + } +} + +static ErlDrvBinary* +read_head(ErlDrvPort ix, int bytes) +{ + int len_io_queue; + SysIOVec* iov = driver_peekq(ix, &len_io_queue); + int bytes_left = bytes; + int copied = 0; + ErlDrvBinary* b; + int iv; + + b = driver_alloc_binary(bytes); + iv = 0; + while (bytes_left > 0 && iv < len_io_queue) { + int n = (iov[iv].iov_len < bytes_left) ? iov[iv].iov_len : bytes_left; + memcpy(b->orig_bytes+copied, iov[iv].iov_base, n); + copied += n; + bytes_left -= n; + iv++; + } + return b; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/smaller_major_vsn_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/smaller_major_vsn_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/smaller_major_vsn_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/smaller_major_vsn_drv.c 2007-11-26 19:01:33.000000000 +0000 @@ -0,0 +1,31 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Implementation of a driver with a smaller major + * driver version than the current system. + */ + +#define VSN_MISMATCH_DRV_NAME_STR "smaller_major_vsn_drv" +#define VSN_MISMATCH_DRV_NAME smaller_major_vsn_drv +#define VSN_MISMATCH_DRV_MAJOR_VSN_DIFF (-1) +#define VSN_MISMATCH_DRV_MINOR_VSN_DIFF 0 + +#include "vsn_mismatch_drv_impl.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/smaller_minor_vsn_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/smaller_minor_vsn_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/smaller_minor_vsn_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/smaller_minor_vsn_drv.c 2007-11-26 19:01:33.000000000 +0000 @@ -0,0 +1,31 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Implementation of a driver with a smaller minor + * driver version than the current system. + */ + +#define VSN_MISMATCH_DRV_NAME_STR "smaller_minor_vsn_drv" +#define VSN_MISMATCH_DRV_NAME smaller_minor_vsn_drv +#define VSN_MISMATCH_DRV_MAJOR_VSN_DIFF 0 +#define VSN_MISMATCH_DRV_MINOR_VSN_DIFF (-1) + +#include "vsn_mismatch_drv_impl.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_1_0_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_1_0_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_1_0_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_1_0_drv.c 2007-11-26 19:01:31.000000000 +0000 @@ -0,0 +1,72 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Driver that fakes driver version 1.0 and tests + * driver_system_info(). + * + */ + +#include "sys_info_drv_impl.h" + +#define SYS_INFO_DRV_MAJOR_VSN 1 +#define SYS_INFO_DRV_MINOR_VSN 0 +#define SYS_INFO_DRV_NAME_STR "sys_info_1_0_drv" +#define SYS_INFO_DRV_NAME sys_info_1_0_drv +#define SYS_INFO_DRV_LAST_FIELD smp_support + +#define SYS_INFO_DRV_RES_FORMAT "ok: " \ + "drv_drv_vsn=%d.%d " \ + "emu_drv_vsn=%d.%d " \ + "erts_vsn=%s " \ + "otp_vsn=%s " \ + "thread=%s " \ + "smp=%s" + + +static size_t +sys_info_drv_max_res_len(ErlDrvSysInfo *sip) +{ + size_t slen = strlen(SYS_INFO_DRV_RES_FORMAT) + 1; + slen += 2*20; /* drv_drv_vsn */ + slen += 2*20; /* emu_drv_vsn */ + slen += strlen(sip->erts_version) + 1; + slen += strlen(sip->otp_release) + 1; + slen += 5; /* threads */ + slen += 5; /* smp */ + return slen; +} + +static size_t +sys_info_drv_sprintf_sys_info(ErlDrvSysInfo *sip, char *str) +{ + return sprintf(str, + SYS_INFO_DRV_RES_FORMAT, + SYS_INFO_DRV_MAJOR_VSN, + SYS_INFO_DRV_MINOR_VSN, + sip->driver_major_version, + sip->driver_minor_version, + sip->erts_version, + sip->otp_release, + sip->thread_support ? "true" : "false", + sip->smp_support ? "true" : "false"); +} + +#include "sys_info_drv_impl.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_1_1_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_1_1_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_1_1_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_1_1_drv.c 2007-11-26 19:01:32.000000000 +0000 @@ -0,0 +1,80 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Driver that fakes driver version 1.1 and tests + * driver_system_info(). + * + */ + +#include "sys_info_drv_impl.h" + +#define SYS_INFO_DRV_MAJOR_VSN 1 +#define SYS_INFO_DRV_MINOR_VSN 1 +#define SYS_INFO_DRV_NAME_STR "sys_info_1_1_drv" +#define SYS_INFO_DRV_NAME sys_info_1_1_drv +#define SYS_INFO_DRV_LAST_FIELD scheduler_threads + +#define SYS_INFO_DRV_RES_FORMAT "ok: " \ + "drv_drv_vsn=%d.%d " \ + "emu_drv_vsn=%d.%d " \ + "erts_vsn=%s " \ + "otp_vsn=%s " \ + "thread=%s " \ + "smp=%s " \ + "async_thrs=%d " \ + "sched_thrs=%d" + + +static size_t +sys_info_drv_max_res_len(ErlDrvSysInfo *sip) +{ + size_t slen = strlen(SYS_INFO_DRV_RES_FORMAT) + 1; + slen += 2*20; /* drv_drv_vsn */ + slen += 2*20; /* emu_drv_vsn */ + slen += strlen(sip->erts_version) + 1; + slen += strlen(sip->otp_release) + 1; + slen += 5; /* threads */ + slen += 5; /* smp */ + slen += 20; /* async_thrs */ + slen += 20; /* sched_thrs */ + return slen; +} + +static size_t +sys_info_drv_sprintf_sys_info(ErlDrvSysInfo *sip, char *str) +{ + return sprintf(str, + SYS_INFO_DRV_RES_FORMAT, + SYS_INFO_DRV_MAJOR_VSN, + SYS_INFO_DRV_MINOR_VSN, + sip->driver_major_version, + sip->driver_minor_version, + sip->erts_version, + sip->otp_release, + sip->thread_support ? "true" : "false", + sip->smp_support ? "true" : "false", + sip->async_threads, + sip->scheduler_threads); +} + +#include "sys_info_drv_impl.c" + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_curr_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_curr_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_curr_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_curr_drv.c 2007-11-26 19:01:32.000000000 +0000 @@ -0,0 +1,77 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Driver that tests driver_system_info() on current + * driver version. + * + */ + +#include "sys_info_drv_impl.h" + +#define SYS_INFO_DRV_MAJOR_VSN ERL_DRV_EXTENDED_MAJOR_VERSION +#define SYS_INFO_DRV_MINOR_VSN ERL_DRV_EXTENDED_MINOR_VERSION +#define SYS_INFO_DRV_NAME_STR "sys_info_curr_drv" +#define SYS_INFO_DRV_NAME sys_info_curr_drv +#define ERL_DRV_SYS_INFO_SIZE sizeof(ErlDrvSysInfo) + +#define SYS_INFO_DRV_RES_FORMAT "ok: " \ + "drv_drv_vsn=%d.%d " \ + "emu_drv_vsn=%d.%d " \ + "erts_vsn=%s " \ + "otp_vsn=%s " \ + "thread=%s " \ + "smp=%s " \ + "async_thrs=%d " \ + "sched_thrs=%d" + +static size_t +sys_info_drv_max_res_len(ErlDrvSysInfo *sip) +{ + size_t slen = strlen(SYS_INFO_DRV_RES_FORMAT) + 1; + slen += 2*20; /* drv_drv_vsn */ + slen += 2*20; /* emu_drv_vsn */ + slen += strlen(sip->erts_version) + 1; + slen += strlen(sip->otp_release) + 1; + slen += 5; /* threads */ + slen += 5; /* smp */ + slen += 20; /* async_thrs */ + slen += 20; /* sched_thrs */ + return slen; +} + +static size_t +sys_info_drv_sprintf_sys_info(ErlDrvSysInfo *sip, char *str) +{ + return sprintf(str, + SYS_INFO_DRV_RES_FORMAT, + SYS_INFO_DRV_MAJOR_VSN, + SYS_INFO_DRV_MINOR_VSN, + sip->driver_major_version, + sip->driver_minor_version, + sip->erts_version, + sip->otp_release, + sip->thread_support ? "true" : "false", + sip->smp_support ? "true" : "false", + sip->async_threads, + sip->scheduler_threads); +} + +#include "sys_info_drv_impl.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_drv_impl.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_drv_impl.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_drv_impl.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_drv_impl.c 2007-11-26 19:01:30.000000000 +0000 @@ -0,0 +1,154 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Implementation of a driver that fakes different driver + * versions and tests driver_system_info(). This file should + * be included by an implementation that defines: + * * SYS_INFO_DRV_MAJOR_VSN + * * SYS_INFO_DRV_MINOR_VSN + * * SYS_INFO_DRV_NAME_STR + * * SYS_INFO_DRV_NAME + * * ERL_DRV_SYS_INFO_SIZE, or SYS_INFO_DRV_LAST_FIELD + * and implements: + * * static size_t sys_info_drv_max_res_len(ErlDrvSysInfo *) + * * static size_t sys_info_drv_sprintf_sys_info(ErlDrvSysInfo *, + * char *) + * + */ + +#if !defined(ERL_DRV_SYS_INFO_SIZE) && defined(SYS_INFO_DRV_LAST_FIELD) + +#define ERL_DRV_SYS_INFO_SIZE_FROM_LAST_FIELD(LAST_FIELD) \ + (((size_t) &((ErlDrvSysInfo *) 0)->LAST_FIELD) \ + + sizeof(((ErlDrvSysInfo *) 0)->LAST_FIELD)) + +#define ERL_DRV_SYS_INFO_SIZE \ + ERL_DRV_SYS_INFO_SIZE_FROM_LAST_FIELD(SYS_INFO_DRV_LAST_FIELD) + +#endif + +static ErlDrvData start(ErlDrvPort, char *); +static int control(ErlDrvData, unsigned int, char *, int, char **, int); + +static ErlDrvEntry drv_entry = { + NULL /* init */, + start, + NULL /* stop */, + NULL /* output */, + NULL /* ready_input */, + NULL /* ready_output */, + SYS_INFO_DRV_NAME_STR, + NULL /* finish */, + NULL /* handle */, + control, + NULL /* timeout */, + NULL /* outputv */, + NULL /* ready_async */, + NULL /* flush */, + NULL /* call */, + NULL /* event */, + ERL_DRV_EXTENDED_MARKER, + SYS_INFO_DRV_MAJOR_VSN, + SYS_INFO_DRV_MINOR_VSN, + ERL_DRV_FLAG_USE_PORT_LOCKING, + NULL /* handle2 */, + NULL /* process_exit */ +}; + +DRIVER_INIT(SYS_INFO_DRV_NAME) +{ + return &drv_entry; +} + +static ErlDrvData +start(ErlDrvPort port, char *command) +{ + return (ErlDrvData) port; +} + +static int +control(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen) +{ + int res; + char *str; + size_t slen, slen2; + ErlDrvPort port = (ErlDrvPort) drv_data; + unsigned deadbeef[] = {0xdeadbeef, + 0xdeadbeef, + 0xdeadbeef, + 0xdeadbeef, + 0xdeadbeef, + 0xdeadbeef, + 0xdeadbeef, + 0xdeadbeef, + 0xdeadbeef, + 0xdeadbeef}; + ErlDrvSysInfo *sip = driver_alloc(ERL_DRV_SYS_INFO_SIZE + sizeof(deadbeef)); + char *beyond_end_format = "error: driver_system_info() wrote beyond end " + "of the ErlDrvSysInfo struct"; + char *buf_overflow_format = "error: Internal buffer overflow"; + + if (!sip) { + driver_failure_atom(port, "enomem"); + return 0; + } + + memset((char *) sip, 0xed, ERL_DRV_SYS_INFO_SIZE); + memcpy(((char *) sip) + ERL_DRV_SYS_INFO_SIZE, + (char *) &deadbeef[0], + sizeof(deadbeef)); + + driver_system_info(sip, ERL_DRV_SYS_INFO_SIZE); + + slen = sys_info_drv_max_res_len(sip); + slen2 = strlen(beyond_end_format) + 1; + if (slen2 > slen) + slen = slen2; + slen2 = strlen(buf_overflow_format) + 1; + if (slen2 > slen) + slen = slen2; + str = driver_alloc(slen); + if (!str) { + driver_free(sip); + driver_failure_atom(port, "enomem"); + return 0; + } + *rbuf = str; + + /* Check that the emulator didn't write beyond ERL_DRV_SYS_INFO_SIZE */ + if (memcmp(((char *) sip) + ERL_DRV_SYS_INFO_SIZE, + (char *) &deadbeef[0], + sizeof(deadbeef)) != 0) { + res = sprintf(str, beyond_end_format); + } + else { + res = sys_info_drv_sprintf_sys_info(sip, str); + if (res > slen) + res = sprintf(str, buf_overflow_format); + } + driver_free(sip); + return res; +} + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_drv_impl.h erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_drv_impl.h --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_drv_impl.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/sys_info_drv_impl.h 2007-11-26 19:01:32.000000000 +0000 @@ -0,0 +1,29 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Header file used by 'sys_info_drv's. + * + */ + +#include +#include +#include "erl_driver.h" + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/thr_alloc_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/thr_alloc_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/thr_alloc_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/thr_alloc_drv.c 2009-11-20 13:33:06.000000000 +0000 @@ -0,0 +1,125 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ +#include +#include +#include +#include "erl_driver.h" + +ErlDrvData start(ErlDrvPort port, char *command); +int control(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen); + +static int call(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen, + unsigned int *flags); + +static ErlDrvEntry thr_alloc_drv_entry = { + NULL /* init */, + start, + NULL /* stop */, + NULL /* output */, + NULL /* ready_input */, + NULL /* ready_output */, + "thr_alloc_drv", + NULL /* finish */, + NULL /* handle */, + control, + NULL /* timeout */, + NULL /* outputv */, + NULL /* ready_async */, + NULL /* flush */, + NULL /* call */, + NULL /* event */, + ERL_DRV_EXTENDED_MARKER, + ERL_DRV_EXTENDED_MAJOR_VERSION, + ERL_DRV_EXTENDED_MINOR_VERSION, + ERL_DRV_FLAG_USE_PORT_LOCKING, + NULL /* handle2 */, + NULL /* handle_monitor */ +}; + +DRIVER_INIT(thr_alloc_drv) +{ + return &thr_alloc_drv_entry; +} + +void * +test_thread(void *vsize) +{ + int i; + int size = (int) (long) vsize; + void *mem; + mem = driver_alloc(size); + if (mem) + driver_free(mem); +} + +ErlDrvData start(ErlDrvPort port, char *command) +{ + return (ErlDrvData) port; +} + +int control(ErlDrvData drv_data, unsigned int command, char *buf, + int len, char **rbuf, int rlen) +{ + ErlDrvPort port = (ErlDrvPort) drv_data; + char *result = "failure"; + int result_len; + if (len <= 20) { + int res; + ErlDrvTid tid; + char ibuf[21]; + int size; + memcpy((void *) ibuf, buf, len); + ibuf[len] = '\0'; + size = atoi(ibuf); + if (size > 0) { + res = erl_drv_thread_create("test_thread", + &tid, + test_thread, + (void *) (long) size, + NULL); + if (res == 0) { + res = erl_drv_thread_join(tid, NULL); + if (res == 0) + result = "ok"; + } + if (res != 0) + driver_failure_posix(port, res); + } + } + + result_len = strlen(result); + if (result_len <= rlen) { + memcpy(*rbuf, result, result_len); + return result_len; + } + else { + *rbuf = driver_alloc(result_len); + if (!*rbuf) { + driver_failure_posix(port, ENOMEM); + return 0; + } + else { + memcpy(*rbuf, result, result_len); + return result_len; + } + } +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/timer_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/timer_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/timer_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/timer_drv.c 2007-11-26 18:57:32.000000000 +0000 @@ -0,0 +1,96 @@ +#ifdef VXWORKS +#include +#include +#include +#include +#include +#include +#endif +#include +#include "erl_driver.h" + +#define get_int32(s) ((((unsigned char*) (s))[0] << 24) | \ + (((unsigned char*) (s))[1] << 16) | \ + (((unsigned char*) (s))[2] << 8) | \ + (((unsigned char*) (s))[3])) + +#define START_TIMER 0 +#define CANCEL_TIMER 1 +#define DELAY_START_TIMER 2 +#define TIMER 3 +#define CANCELLED 4 + +static ErlDrvPort erlang_port; +static ErlDrvData timer_start(ErlDrvPort, char*); +static void timer_stop(ErlDrvData), timer_read(ErlDrvData, char*, int), timer(ErlDrvData); + +static ErlDrvEntry timer_driver_entry = +{ + NULL, + timer_start, + timer_stop, + timer_read, + NULL, + NULL, + "timer_drv", + NULL, + NULL, + NULL, + timer, + NULL, + NULL +}; + +DRIVER_INIT(timer_drv) +{ + erlang_port = (ErlDrvPort)-1; + return &timer_driver_entry; +} + +static ErlDrvData timer_start(ErlDrvPort port, char *buf) +{ + if (erlang_port != (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + erlang_port = port; + return (ErlDrvData)port; +} + +/* set the timer, this is monitored from erlang measuring the time */ +static void timer_read(ErlDrvData port, char *buf, int len) +{ + char reply[1]; + + if (buf[0] == START_TIMER) { + /* fprintf(stderr, "[timer_drv] Setting timeout: %i\n", get_int32(buf + 1)); */ + driver_set_timer(port, get_int32(buf + 1)); + } else if (buf[0] == CANCEL_TIMER) { + /* fprintf(stderr, "[timer_drv] Timer cancelled\n"); */ + driver_cancel_timer(port); + reply[0] = CANCELLED; + driver_output(port, reply, 1); + } else if (buf[0] == DELAY_START_TIMER) { +#ifndef __WIN32__ +#ifdef VXWORKS + taskDelay(sysClkRateGet()); +#else + sleep(1); +#endif +#endif + driver_set_timer(port, get_int32(buf + 1)); + } +} + +static void timer_stop(ErlDrvData port) +{ + erlang_port = (ErlDrvPort)-1; +} + +static void timer(ErlDrvData port) +{ + char reply[1]; + + /* fprintf(stderr, "[timer_drv] timer timed out\n"); */ + reply[0] = TIMER; + driver_output((ErlDrvPort)port, reply, 1); +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/vsn_mismatch_drv_impl.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/vsn_mismatch_drv_impl.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/vsn_mismatch_drv_impl.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/vsn_mismatch_drv_impl.c 2007-11-26 19:01:32.000000000 +0000 @@ -0,0 +1,67 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Implementation of a driver that fakes driver version. It + * is used for checking that version mismatches are handled + * correct by the emulator. The following makros have to be + * defined before it can be used: + * * VSN_MISMATCH_DRV_NAME_STR + * * VSN_MISMATCH_DRV_NAME + * * VSN_MISMATCH_DRV_MAJOR_VSN_DIFF + * * VSN_MISMATCH_DRV_MINOR_VSN_DIFF + */ + +#include "erl_driver.h" + +static ErlDrvEntry drv_entry = { + NULL /* init */, + NULL /* start */, + NULL /* stop */, + NULL /* output */, + NULL /* ready_input */, + NULL /* ready_output */, + VSN_MISMATCH_DRV_NAME_STR, + NULL /* finish */, + NULL /* handle */, + NULL /* control */, + NULL /* timeout */, + NULL /* outputv */, + NULL /* ready_async */, + NULL /* flush */, + NULL /* call */, + NULL /* event */, +#ifdef VSN_MISMATCH_DRV_EXTENDED_MARKER + VSN_MISMATCH_DRV_EXTENDED_MARKER, +#else + ERL_DRV_EXTENDED_MARKER, +#endif + ERL_DRV_EXTENDED_MAJOR_VERSION + VSN_MISMATCH_DRV_MAJOR_VSN_DIFF, + ERL_DRV_EXTENDED_MINOR_VERSION + VSN_MISMATCH_DRV_MINOR_VSN_DIFF, + ERL_DRV_FLAG_USE_PORT_LOCKING, + NULL /* handle2 */, + NULL /* process_exit */ +}; + +DRIVER_INIT(VSN_MISMATCH_DRV_NAME) +{ + return &drv_entry; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/zero_extended_marker_garb_drv.c erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/zero_extended_marker_garb_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE_data/zero_extended_marker_garb_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE_data/zero_extended_marker_garb_drv.c 2007-11-26 19:01:33.000000000 +0000 @@ -0,0 +1,32 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Author: Rickard Green + * + * Description: Implementation of a driver with an invalid extended + * marker. + */ + +#define VSN_MISMATCH_DRV_EXTENDED_MARKER 0 +#define VSN_MISMATCH_DRV_NAME_STR "zero_extended_marker_garb_drv" +#define VSN_MISMATCH_DRV_NAME zero_extended_marker_garb_drv +#define VSN_MISMATCH_DRV_MAJOR_VSN_DIFF 0 +#define VSN_MISMATCH_DRV_MINOR_VSN_DIFF 0 + +#include "vsn_mismatch_drv_impl.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/driver_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/driver_SUITE.erl 2009-11-20 13:30:29.000000000 +0000 @@ -0,0 +1,1993 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +%%% Purpose : Test interaction Erlang/Drivers (new features as of R3A) + +%%% Checks that new features (as of R3) of the Erlang/Driver +%%% implementation works as expected. +%%% +%%% Things that should be tested: +%%% - outputv +%%% - timeouts +%%% - queueing + +-module(driver_SUITE). +-export([all/1, + init_per_testcase/2, + fin_per_testcase/2, + end_per_suite/1, + outputv_echo/1, + timer/1, + timer_measure/1, + timer_cancel/1, + timer_change/1, + timer_delay/1, + queue_echo/1, + fun_to_port/1, + driver_unloaded/1, + io_ready_exit/1, + use_fallback_pollset/1, + bad_fd_in_pollset/1, + driver_event/1, + fd_change/1, + steal_control/1, + otp_6602/1, + 'driver_system_info_ver1.0'/1, + 'driver_system_info_ver1.1'/1, + driver_system_info_current_ver/1, + driver_monitor/1, + ioq_exit/1, + ioq_exit_ready_input/1, + ioq_exit_ready_output/1, + ioq_exit_timeout/1, + ioq_exit_ready_async/1, + ioq_exit_event/1, + ioq_exit_ready_input_async/1, + ioq_exit_ready_output_async/1, + ioq_exit_timeout_async/1, + ioq_exit_event_async/1, + zero_extended_marker_garb_drv/1, + invalid_extended_marker_drv/1, + larger_major_vsn_drv/1, + larger_minor_vsn_drv/1, + smaller_major_vsn_drv/1, + smaller_minor_vsn_drv/1, + peek_non_existing_queue/1, + otp_6879/1, + caller/1, + many_events/1, + missing_callbacks/1, + smp_select/1, + driver_select_use/1, + thread_mseg_alloc_cache_clean/1]). + +-export([bin_prefix/2]). + +-include("test_server.hrl"). + + +% First byte in communication with the timer driver +-define(START_TIMER, 0). +-define(CANCEL_TIMER, 1). +-define(DELAY_START_TIMER, 2). +-define(TIMER, 3). +-define(CANCELLED, 4). + +% First byte in communication with queue driver +-define(PUSHQ, 0). +-define(ENQ, 1). +-define(PUSHQ_BIN, 2). +-define(ENQ_BIN, 3). +-define(PUSHQV, 4). +-define(ENQV, 5). + +-define(DEQ, 6). +-define(BYTES_QUEUED, 7). +-define(READ_HEAD, 8). + +-define(RANDOM, random). + +% Max data size that is queued in one instance +-define(MAX_DATA_SIZE, 16384). + +% This is the allowed delay when testing the driver timer functionality +-define(delay, 100). + +-define(heap_binary_size, 64). + +init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(2)), + case catch erts_debug:get_internal_state(available_internal_state) of + true -> ok; + _ -> erts_debug:set_internal_state(available_internal_state, true) + end, + erlang:display({init_per_testcase, Case}), + ?line 0 = erts_debug:get_internal_state(check_io_debug), + [{watchdog, Dog},{testcase, Case}|Config]. + +fin_per_testcase(Case, Config) -> + Dog = ?config(watchdog, Config), + erlang:display({fin_per_testcase, Case}), + ?line 0 = erts_debug:get_internal_state(check_io_debug), + ?t:timetrap_cancel(Dog). + +end_per_suite(_Config) -> + catch erts_debug:set_internal_state(available_internal_state, false). + +all(suite) -> + [ + fun_to_port, + outputv_echo, + queue_echo, + timer, + driver_unloaded, + io_ready_exit, + use_fallback_pollset, + bad_fd_in_pollset, + driver_event, + fd_change, + steal_control, + otp_6602, + 'driver_system_info_ver1.0', + 'driver_system_info_ver1.1', + driver_system_info_current_ver, + driver_monitor, + ioq_exit, + zero_extended_marker_garb_drv, + invalid_extended_marker_drv, + larger_major_vsn_drv, + larger_minor_vsn_drv, + smaller_major_vsn_drv, + smaller_minor_vsn_drv, + peek_non_existing_queue, + otp_6879, + caller, + many_events, + missing_callbacks, + smp_select, + driver_select_use, + thread_mseg_alloc_cache_clean + ]. + +fun_to_port(doc) -> "Test sending a fun to port with an outputv-capable driver."; +fun_to_port(Config) when is_list(Config) -> + ?line Path = ?config(data_dir, Config), + ?line erl_ddll:start(), + ?line ok = load_driver(Path, outputv_drv), + + ?line fun_to_port_1(fun() -> 33 end), + ?line fun_to_port_1([fun() -> 42 end]), + ?line fun_to_port_1([1|fun() -> 42 end]), + L = build_io_list(65536), + ?line fun_to_port_1([L,fun() -> 42 end]), + ?line fun_to_port_1([L|fun() -> 42 end]), + ok. + +fun_to_port_1(Term) -> + Port = open_port({spawn,outputv_drv}, []), + {'EXIT',{badarg,_}} = (catch port_command(Port, Term)), + port_close(Port). + +build_io_list(0) -> []; +build_io_list(1) -> [7]; +build_io_list(N) -> + L = build_io_list(N div 2), + case N rem 2 of + 0 -> [L|L]; + 1 -> [7,L|L] + end. + + + +outputv_echo(doc) -> ["Test echoing data with a driver that supports outputv."]; +outputv_echo(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(10)), + Name = 'outputv_drv', + P = start_driver(Config, Name, true), + + ?line ov_test(P, {bin,0}), + ?line ov_test(P, {bin,1}), + ?line ov_test(P, {bin,2}), + ?line ov_test(P, {bin,3}), + ?line ov_test(P, {bin,4}), + ?line ov_test(P, {bin,5}), + ?line ov_test(P, {bin,6}), + ?line ov_test(P, {bin,7}), + ?line ov_test(P, {bin,8}), + ?line ov_test(P, {bin,15}), + ?line ov_test(P, {bin,16}), + ?line ov_test(P, {bin,17}), + + ?line ov_test(P, {list,0}), + ?line ov_test(P, {list,1}), + ?line ov_test(P, {list,2}), + ?line ov_test(P, [int,int,{list,0},int]), + ?line ov_test(P, [int,int,{list,1},int]), + ?line ov_test(P, [int,int,{list,2}]), + ?line ov_test(P, [{list,3},int,int,{list,2}]), + ?line ov_test(P, {list,33}), + + ?line ov_test(P, [{bin,0}]), + ?line ov_test(P, [{bin,1}]), + ?line ov_test(P, [{bin,2}]), + ?line ov_test(P, [{bin,3}]), + ?line ov_test(P, [{bin,4}]), + ?line ov_test(P, [{bin,5}]), + ?line ov_test(P, [{bin,6},int]), + ?line ov_test(P, [int,{bin,3}]), + ?line ov_test(P, [int|{bin,4}]), + ?line ov_test(P, [{bin,17},int,{bin,13}|{bin,3}]), + + ?line ov_test(P, [int,{bin,17},int,{bin,?heap_binary_size+1}|{bin,3}]), + + stop_driver(P, Name), + ?line test_server:timetrap_cancel(Dog), + ok. + +ov_test(Port, Template) -> + Self = self(), + spawn_opt(erlang, apply, [fun () -> ov_test(Self, Port, Template) end,[]], + [link,{fullsweep_after,0}]), + receive + done -> ok + end. + +ov_test(Parent, Port, Template) -> + true = port_connect(Port, self()), + + HeapData = build_data(Template), + io:format("Mostly heap binaries"), + ov_send_and_test(Port, HeapData, HeapData), + + %% Try sub binaries. + io:format("Mostly sub binaries of heap binaries"), + SubHeapData = make_sub_binaries(HeapData), + ov_send_and_test(Port, SubHeapData, HeapData), + + %% Try refc binaries. + io:format("Refc binaries"), + RefcData = make_refc_binaries(HeapData), + ov_send_and_test(Port, RefcData, RefcData), + + %% Try sub binaries of heap binaries. + io:format("Sub binaries of refc binaries"), + SubRefcData = make_sub_binaries(RefcData), + ov_send_and_test(Port, SubRefcData, RefcData), + io:format("", []), + + %% Garbage collect and make sure that there are no binaries left. + %% R7 note: + %% - dead variables on the stack are killed after last use, + %% - erlang:garbage_collect/0 collects garbage immediately. + %% (there used to be dummy functions here) + erlang:garbage_collect(), + {binary,[]} = process_info(self(), binary), + + %% Reassign Port back to parent and tell him we are done. + true = port_connect(Port, Parent), + Parent ! done. + +ov_send_and_test(Port, Data, ExpectedResult) -> + io:format("~p ! ~P", [Port,Data,12]), + Port ! {self(),{command,Data}}, + receive + {Port,{data,ReturnData}} -> + io:format("~p returned ~P", [Port,ReturnData,12]), + compare(ReturnData, ExpectedResult); + {Port,{data,OtherData}} -> + io:format("~p returned WRONG data ~p", [Port,OtherData]), + ?line test_server:fail(); + Wrong -> + ?line test_server:fail({unexpected_port_or_data,Wrong}) + end. + +compare(Got, Expected) -> + case {list_to_binary([Got]),list_to_binary([Expected])} of + {B,B} -> ok; + {_Gb,_Eb} -> + ?t:fail(got_bad_data) + end. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Driver timer test suites +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +timer(suite) -> [timer_measure,timer_cancel,timer_delay,timer_change]. + +timer_measure(doc) -> ["Check that timers time out in good time."]; +timer_measure(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(1)), + Name = 'timer_drv', + ?line Port = start_driver(Config, Name, false), + + ?line try_timeouts(Port, 8997), + + ?line stop_driver(Port, Name), + ?line test_server:timetrap_cancel(Dog), + ok. + +try_timeouts(_, 0) -> ok; +try_timeouts(Port, Timeout) -> + ?line TimeBefore = now(), + ?line erlang:port_command(Port, <>), + receive + {Port,{data,[?TIMER]}} -> + ?line Elapsed = erl_millisecs() - erl_millisecs(TimeBefore), + io:format("Elapsed: ~p Timeout: ~p\n", [Elapsed,Timeout]), + if + Elapsed < Timeout -> + ?line ?t:fail(too_short); + Elapsed > Timeout + ?delay -> + ?line ?t:fail(too_long); + true -> + try_timeouts(Port, Timeout div 2) + end + after Timeout + ?delay -> + ?line test_server:fail("driver failed to timeout") + end. + +timer_cancel(doc) -> ["Try cancelling timers set in a driver."]; +timer_cancel(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(1)), + Name = 'timer_drv', + ?line Port = start_driver(Config, Name, false), + + ?line try_cancel(Port, 10000), + + ?line stop_driver(Port, Name), + ?line test_server:timetrap_cancel(Dog), + ok. + +try_cancel(Port, Timeout) -> + ?line T_before = erl_millisecs(), + Port ! {self(),{command,<>}}, + receive + {Port, {data, [?TIMER]}} -> + ?line test_server:fail("driver timed out before cancelling it") + after Timeout -> + Port ! {self(), {command, [?CANCEL_TIMER]}}, + receive + {Port, {data, [?TIMER]}} -> + ?line test_server:fail("driver timed out after cancelling it"); + {Port, {data, [?CANCELLED]}} -> + ?line Time_milli_secs = erl_millisecs() - T_before, + + io:format("Time_milli_secs: ~p Timeout: ~p\n", + [Time_milli_secs, Timeout]), + if + Time_milli_secs > (Timeout + ?delay) -> + ?line test_server:fail("too long real time"); + Timeout == 0 -> ok; + true -> try_cancel(Port, Timeout div 2) + end + after ?delay -> + test_server:fail("No message from driver") + end + end. + +%% Test that timers don't time out too early if we do a sleep +%% before setting a timer. + +timer_delay(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(1)), + Name = 'timer_drv', + ?line Port = start_driver(Config, Name, false), + + ?line TimeBefore = now(), + Timeout0 = 350, + ?line erlang:port_command(Port, <>), + Timeout = Timeout0 + + case os:type() of + {win32,_} -> 0; %Driver doesn't sleep on Windows. + _ -> 1000 + end, + receive + {Port,{data,[?TIMER]}} -> + ?line Elapsed = erl_millisecs() - erl_millisecs(TimeBefore), + io:format("Elapsed time: ~p Timeout: ~p\n", + [Elapsed,Timeout]), + if + Elapsed < Timeout -> + ?line ?t:fail(too_short); + Elapsed > Timeout + ?delay -> + ?line ?t:fail(too_long); + true -> + ok + end + end, + + ?line stop_driver(Port, Name), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Test that driver_set_timer with new timout really changes +%% the timer (ticket OTP-5942), it didn't work before + +timer_change(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(1)), + Name = 'timer_drv', + ?line Port = start_driver(Config, Name, false), + + ?line try_change_timer(Port, 10000), + + ?line stop_driver(Port, Name), + ?line test_server:timetrap_cancel(Dog), + ok. + +try_change_timer(_Port, 0) -> ok; +try_change_timer(Port, Timeout) -> + ?line Timeout_3 = Timeout*3, + ?line TimeBefore = now(), + ?line erlang:port_command(Port, <>), + ?line erlang:port_command(Port, <>), + receive + {Port,{data,[?TIMER]}} -> + ?line Elapsed = erl_millisecs() - erl_millisecs(TimeBefore), + io:format("Elapsed: ~p Timeout: ~p\n", [Elapsed,Timeout]), + if + Elapsed < Timeout -> + ?line ?t:fail(too_short); + Elapsed > Timeout + ?delay -> + ?line ?t:fail(too_long); + true -> + try_timeouts(Port, Timeout div 2) + end + after Timeout + ?delay -> + ?line test_server:fail("driver failed to timeout") + end. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Queue test suites +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +queue_echo(doc) -> + ["1) Queue up data in a driver that uses the full driver_queue API to do this." + "2) Get the data back, a random amount at a time."]; +queue_echo(Config) when is_list(Config) -> + case ?t:is_native(?MODULE) of + true -> exit(crashes_native_code); + false -> queue_echo_1(Config) + end. + +queue_echo_1(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(10)), + Name = 'queue_drv', + ?line P = start_driver(Config, Name, true), + + ?line q_echo(P, [{?ENQ, {list,1}}, + {?ENQ, {list,0}}, + {?ENQ, {bin,0}}, + {?ENQ, {bin,1}}, + {?ENQ, {bin,2}}, + {?ENQ, {bin,3}}, + {?ENQ, {bin,4}}, + {?ENQ, {bin,5}}, + {?ENQ, {bin,600}}, + {?PUSHQ, {list,0}}, + {?PUSHQ, {list,1}}, + {?PUSHQ, {bin,0}}, + {?PUSHQ, {bin,1}}, + {?PUSHQ, {bin,888}}, + {?ENQ_BIN, {bin,0}}, + {?ENQ_BIN, {bin,1}}, + {?ENQ_BIN, {bin,2}}, + {?ENQ_BIN, {bin,3}}, + {?ENQ_BIN, {bin,4}}, + {?ENQ_BIN, {bin,777}}, + {?PUSHQ_BIN, {bin,0}}, + {?PUSHQ_BIN, {bin,1}}, + {?PUSHQ_BIN, {bin,334}}, + {?ENQV, [{bin,0},{list,1},{bin,1},{bin,555}]}, + {?ENQV, [{bin,0},{list,1},{bin,1}]}, + {?PUSHQV, [{bin,0},{list,1},{bin,1},{bin,319}]}]), + + ?line stop_driver(P, Name), + ?line test_server:timetrap_cancel(Dog), + ok. + +q_echo(Port, SpecList) -> + io:format("Heap binaries"), + HeapData = [{M,build_data(T)} || {M,T} <- SpecList], + {HeapDataReturn,HeapDataLen} = feed_driver(Port, HeapData), + dequeue(Port, HeapDataReturn, HeapDataLen, 1), + + %% Try sub binaries. + io:format("Sub binaries of heap binaries"), + SubHeapData = make_sub_binaries(HeapData), + %% The following line will generate a warning. + {HeapDataReturn,HeapDataLen} = feed_driver(Port, SubHeapData), + dequeue(Port, HeapDataReturn, HeapDataLen, 1), + + %% Try refc binaries. + io:format("Refc binaries"), + RefcData = make_refc_binaries(HeapData), + {RefcDataReturn,RefcDataLen} = feed_driver(Port, RefcData), + dequeue(Port, RefcDataReturn, RefcDataLen, 1), + + %% Try sub binaries of refc binaries. + io:format("Sub binaries of refc binaries"), + SubRefcData = make_sub_binaries(RefcData), + {RefcDataReturn,RefcDataLen} = feed_driver(Port, SubRefcData), + dequeue(Port, RefcDataReturn, RefcDataLen, 1), + + %% Try a writable binary. + io:format("Writable binaries"), + WritableBinData = make_writable_binaries(HeapData), + {WritableDataReturn,WritableDatalen} = feed_driver(Port, WritableBinData), + _ = append_to_writable_binaries(WritableBinData), + dequeue(Port, WritableDataReturn, WritableDatalen, 1), + + %% Try dequeing more than one byte at the time. + io:format("Heap binaries -- dequeueing more than one byte at the time"), + feed_and_dequeue(Port, HeapData, 2), + feed_and_dequeue(Port, HeapData, 3), + feed_and_dequeue(Port, HeapData, 4), + + io:format("\n"). + +feed_and_dequeue(Port, Data, DeqSize) -> + {DataReturn,DataLen} = feed_driver(Port, Data), + dequeue(Port, DataReturn, DataLen, DeqSize), + ok. + +%% Send all data according to the specification to the driver side (where it +%% is queued up for later return to this process). + +feed_driver(Port, Description) -> + feed_driver(Port, Description, <<>>, 0). + +feed_driver(Port, [], ExpectedInPort, Qb) -> + io:format("Expected in port: ~P", [ExpectedInPort,12]), + io:format("In port: ~P", [read_head(Port, Qb),12]), + {ExpectedInPort,Qb}; +feed_driver(Port, [{Method0,Data}|T], Expected_return, Qb_before) -> + Method = case Method0 of + ?RANDOM -> uniform(6)-1; + Other -> Other + end, + Size = size(list_to_binary([Data])), + + %% *********************************************************************** + %% NOTE! Never never never change this to io:format/2, as that will imply + %% message sending, and sending as message will spoil the test of + %% writable binaries. + + %% erlang:display({sending,method_name(Method),Data}), + %% *********************************************************************** + + queue_op(Port, Method, Data), + + Qb_in_driver = bytes_queued(Port), + case Qb_before + Size of + Qb_in_driver -> ok; + Sum -> + io:format("Qb_before: ~p\n" + "Qb_before+Size: ~p\n" + "Qb_in_driver: ~p", + [Qb_before,Sum,Qb_in_driver]), + ?t:fail() + end, + X_return = case Method of + ?ENQ -> list_to_binary([Expected_return,Data]); + ?PUSHQ -> list_to_binary([Data,Expected_return]); + ?PUSHQ_BIN -> list_to_binary([Data,Expected_return]); + ?ENQ_BIN -> list_to_binary([Expected_return,Data]); + ?PUSHQV -> list_to_binary([Data,Expected_return]); + ?ENQV -> list_to_binary([Expected_return,Data]) + end, + feed_driver(Port, T, X_return, Qb_before + Size). + +%% method_name(0) -> pushq; +%% method_name(1) -> enq; +%% method_name(2) -> pushq_bin; +%% method_name(3) -> enq_bin; +%% method_name(4) -> pushqv; +%% method_name(5) -> enqv. + +dequeue(Port, DataList, LenToGet, DeqSize) -> + io:format("Dequeuing ~p bytes, ~p byte(s) at once...", [LenToGet,DeqSize]), + compare_return(Port, DataList, LenToGet, DeqSize). + +compare_return(Port, _Data_list, 0, _Back_len) -> + 0 = bytes_queued(Port); +compare_return(Port, QueuedInPort0, Len_to_get, DeqSize) -> + case bytes_queued(Port) of + Len_to_get -> ok; + BytesInQueue -> + io:format("Len_to_get: ~p", [Len_to_get]), + io:format("Bytes in queue: ~p", [BytesInQueue]), + ?line test_server:fail() + end, + BytesToDequeue = if (DeqSize > Len_to_get) -> Len_to_get; + true -> DeqSize + end, + Dequeued = read_head(Port, BytesToDequeue), + case bin_prefix(Dequeued, QueuedInPort0) of + true -> + deq(Port, BytesToDequeue), + <<_:BytesToDequeue/binary,QueuedInPort/binary>> = QueuedInPort0, + compare_return(Port, QueuedInPort, Len_to_get - BytesToDequeue, DeqSize); + false -> + io:format("Bytes to dequeue: ~p", [BytesToDequeue]), + io:format("Dequeued: ~p", [Dequeued]), + io:format("Queued in port: ~P", [QueuedInPort0,12]), + ?t:fail() + end. + +%% bin_prefix(PrefixBinary, Binary) +%% Is PrefixBinary a prefix of Binary? + +bin_prefix(<>, <>) -> + bin_prefix(PreTail, Tail); +bin_prefix(<<>>, _Bin) -> true; +bin_prefix(_, _) -> false. + +queue_op(Port, Method, Data) -> + [] = erlang:port_control(Port, Method, []), + Port ! {self(),{command,Data}}, + ok. + +bytes_queued(Port) -> + case erlang:port_control(Port, ?BYTES_QUEUED, []) of + <> -> I; + Bad -> ?t:fail({bad_result,Bad}) + end. + +deq(Port, Size) -> + [] = erlang:port_control(Port, ?DEQ, <>). + +read_head(Port, Size) -> + erlang:port_control(Port, ?READ_HEAD, <>). + + +driver_unloaded(doc) -> + []; +driver_unloaded(suite) -> + []; +driver_unloaded(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Drv = timer_drv, + ?line User = self(), + ?line Loaded = make_ref(), + ?line Die = make_ref(), + ?line Loader = spawn(fun () -> + erl_ddll:start(), + ok = load_driver(?config(data_dir, + Config), + Drv), + User ! Loaded, + receive Die -> exit(bye) end + end), + ?line receive Loaded -> ok end, + ?line Port = open_port({spawn, Drv}, []), + ?line Loader ! Die, + ?line receive + {'EXIT', Port, Reason} -> + ?line driver_unloaded = Reason + %% Reason used to be -1 + end. + + +io_ready_exit(doc) -> []; +io_ready_exit(suite) -> []; +io_ready_exit(Config) when is_list(Config) -> + ?line OTE = process_flag(trap_exit, true), + ?line Test = self(), + ?line Dgawd = spawn(fun () -> + ok = dgawd_handler:install(), + Mon = erlang:monitor(process, Test), + Test ! dgawd_handler_started, + receive + {'DOWN', Mon, _, _, _} -> ok; + stop_dgawd_handler -> ok + end, + dgawd_handler:restore(), + Test ! dgawd_handler_stopped + end), + ?line receive dgawd_handler_started -> ok end, + ?line Drv = io_ready_exit_drv, + ?line erl_ddll:start(), + ?line ok = load_driver(?config(data_dir, Config), Drv), + ?line Port = open_port({spawn, Drv}, []), + ?line case erlang:port_control(Port, 0, "") of + "ok" -> + receive + {'EXIT', Port, Reason} -> + ?line case Reason of + ready_output_driver_failure -> + ?t:format("Exited in output_ready()~n"), + ?line ok; + ready_input_driver_failure -> + ?t:format("Exited in input_ready()~n"), + ?line ok; + Error -> ?line ?t:fail(Error) + end + end, + receive after 2000 -> ok end, + ?line false = dgawd_handler:got_dgawd_report(), + ?line Dgawd ! stop_dgawd_handler, + ?line receive dgawd_handler_stopped -> ok end, + ?line process_flag(trap_exit, OTE), + ?line ok; + "nyiftos" -> + ?line process_flag(trap_exit, OTE), + ?line {skipped, "Not yet implemented for this OS"}; + Error -> + ?line process_flag(trap_exit, OTE), + ?line ?t:fail({unexpected_control_result, Error}) + end. + + +-define(CHKIO_STOP, 0). +-define(CHKIO_USE_FALLBACK_POLLSET, 1). +-define(CHKIO_BAD_FD_IN_POLLSET, 2). +-define(CHKIO_DRIVER_EVENT, 3). +-define(CHKIO_FD_CHANGE, 4). +-define(CHKIO_STEAL, 5). +-define(CHKIO_STEAL_AUX, 6). +-define(CHKIO_SMP_SELECT, 7). +-define(CHKIO_DRV_USE, 8). + +use_fallback_pollset(doc) -> []; +use_fallback_pollset(suite) -> []; +use_fallback_pollset(Config) when is_list(Config) -> + FlbkFun = fun () -> + ChkIoDuring = erlang:system_info(check_io), + case lists:keysearch(fallback_poll_set_size, + 1, + ChkIoDuring) of + {value, + {fallback_poll_set_size, N}} when N > 0 -> + ?line ok; + Error -> + ?line ?t:fail({failed_to_use_fallback, Error}) + end + end, + ?line {BckupTest, Handel, OkRes} + = case chkio_test_init(Config) of + {erts_poll_info, ChkIo} = Hndl -> + case lists:keysearch(fallback, 1, ChkIo) of + {value, {fallback, B}} when B =/= false -> + ?line {FlbkFun, Hndl, ok}; + _ -> + ?line {fun () -> ok end, + Hndl, + {comment, + "This implementation does not use " + "a fallback pollset"}} + end; + Skip -> + {fun () -> ok end, Skip, ok} + end, + ?line case chkio_test_fini(chkio_test(Handel, + ?CHKIO_USE_FALLBACK_POLLSET, + fun () -> + ?line sleep(1000), + ?line BckupTest() + end)) of + {skipped, _} = Res -> ?line Res; + _ -> ?line OkRes + end. + +bad_fd_in_pollset(doc) -> []; +bad_fd_in_pollset(suite) -> []; +bad_fd_in_pollset(Config) when is_list(Config) -> + ?line chkio_test_fini(chkio_test(chkio_test_init(Config), + ?CHKIO_BAD_FD_IN_POLLSET, + fun () -> ?line sleep(1000) end)). + +driver_event(doc) -> []; +driver_event(suite) -> []; +driver_event(Config) when is_list(Config) -> + ?line chkio_test_fini(chkio_test(chkio_test_init(Config), + ?CHKIO_DRIVER_EVENT, + fun () -> ?line sleep(1000) end)). + +fd_change(doc) -> []; +fd_change(suite) -> []; +fd_change(Config) when is_list(Config) -> + ?line chkio_test_fini(chkio_test(chkio_test_init(Config), + ?CHKIO_FD_CHANGE, + fun () -> ?line sleep(1000) end)). + +steal_control(doc) -> []; +steal_control(suite) -> []; +steal_control(Config) when is_list(Config) -> + ?line chkio_test_fini(case chkio_test_init(Config) of + {erts_poll_info, _} = Hndl -> + ?line steal_control_test(Hndl); + Skip -> + ?line Skip + end). + +steal_control_test(Hndl = {erts_poll_info, Before}) -> + ?line Port = open_chkio_port(), + ?line case erlang:port_control(Port, ?CHKIO_STEAL_AUX, "") of + [$f,$d,$s,$:| _] = FdList -> + ?line chk_chkio_port(Port), + sleep(500), + ?line chk_chkio_port(Port), + ?line Res = chkio_test(Hndl, + ?CHKIO_STEAL, + FdList, + fun () -> + ?line chk_chkio_port(Port), + ?line sleep(500), + ?line chk_chkio_port(Port) + end), + ?line case erlang:port_control(Port, ?CHKIO_STOP, "") of + "ok" -> + ?line chk_chkio_port(Port), + ?line ok; + StopErr -> + ?line chk_chkio_port(Port), + ?line ?t:fail({stop_error, StopErr}) + end, + ?line close_chkio_port(Port), + ?line Res; + [$s,$k,$i,$p,$:,$\ |Skip] -> + ?line chk_chkio_port(Port), + ?line close_chkio_port(Port), + {chkio_test_result, + {skipped, Skip}, + Before}; + StartErr -> + ?line chk_chkio_port(Port), + ?line ?t:fail({start_error, StartErr}) + end. + +chkio_test_init(Config) when is_list(Config) -> + ?line wait_until_no_pending_updates(), + ?line ChkIo = erlang:system_info(check_io), + ?line case catch lists:keysearch(name, 1, ChkIo) of + {value, {name, erts_poll}} -> + ?line ?t:format("Before test: ~p~n", [ChkIo]), + ?line Path = ?config(data_dir, Config), + ?line erl_ddll:start(), + ?line ok = load_driver(Path, 'chkio_drv'), + ?line process_flag(trap_exit, true), + ?line {erts_poll_info, ChkIo}; + _ -> + ?line {skipped, "Test written to test erts_poll() which isn't used"} + end. + + +chkio_test_fini({skipped, _} = Res) -> + Res; +chkio_test_fini({chkio_test_result, Res, Before}) -> + ?line ok = erl_ddll:unload_driver('chkio_drv'), + ?line ok = erl_ddll:stop(), + ?line wait_until_no_pending_updates(), + ?line After = erlang:system_info(check_io), + ?line ?t:format("After test: ~p~n", [After]), + ?line verify_chkio_state(Before, After), + ?line Res. + +open_chkio_port() -> + open_port({spawn, 'chkio_drv'}, []). + +close_chkio_port(Port) when is_port(Port) -> + true = erlang:port_close(Port), + receive + {'EXIT', Port, normal} -> + ok; + {'EXIT', Port, Reason} -> + ?t:fail({abnormal_port_exit, Port, Reason}); + {Port, Message} -> + ?t:fail({strange_message_from_port, Message}) + end. + +chk_chkio_port(Port) -> + receive + {'EXIT', Port, Reason} when Reason /= normal -> + ?t:fail({port_exited, Port, Reason}) + after 0 -> + ok + end. + + +chkio_test({skipped, _} = Res, _Test, _Fun) -> + ?line Res; +chkio_test({erts_poll_info, _Before} = EPI, Test, Fun) when is_integer(Test) -> + chkio_test(EPI, Test, "", Fun). + +chkio_test({skipped, _} = Res, _Test, _TestArgs, _Fun) -> + ?line Res; +chkio_test({erts_poll_info, Before}, + Test, + TestArgs, + Fun) when is_integer(Test), + is_list(TestArgs) -> + ?line Port = open_chkio_port(), + ?line case erlang:port_control(Port, Test, TestArgs) of + "ok" -> + ?line chk_chkio_port(Port), + ?line Fun(), + ?line During = erlang:system_info(check_io), + ?line erlang:display(During), + ?line 0 = erts_debug:get_internal_state(check_io_debug), + ?line ?t:format("During test: ~p~n", [During]), + ?line chk_chkio_port(Port), + ?line case erlang:port_control(Port, ?CHKIO_STOP, "") of + Res when is_list(Res) -> + ?line chk_chkio_port(Port), + ?line ?t:format("~s", [Res]), + ?line close_chkio_port(Port), + ?line Res, + ?line case Res of + [$c,$o,$m,$m,$e,$n,$t,$:,$\ |Cmnt] -> + ?line {chkio_test_result, + {comment, Cmnt}, + Before}; + _ -> + ?line {chkio_test_result, + Res, + Before} + end; + StopErr -> + ?line chk_chkio_port(Port), + ?line ?t:fail({stop_error, StopErr}) + end; + [$s,$k,$i,$p,$:,$\ |Skip] -> + ?line chk_chkio_port(Port), + ?line close_chkio_port(Port), + {chkio_test_result, + {skipped, Skip}, + Before}; + StartErr -> + ?line chk_chkio_port(Port), + ?line ?t:fail({start_error, StartErr}) + end. + +verify_chkio_state(Before, After) -> + ?line TotSetSize = lists:keysearch(total_poll_set_size, 1, Before), + ?line TotSetSize = lists:keysearch(total_poll_set_size, 1, After), + ?line case lists:keysearch(fallback, 1, Before) of + {value,{fallback,false}} -> + ?line ok; + _ -> + ?line BckupSetSize = lists:keysearch(fallback_poll_set_size, + 1, + Before), + ?line BckupSetSize = lists:keysearch(fallback_poll_set_size, + 1, + After) + end, + ?line ok. + + + +wait_until_no_pending_updates() -> + case lists:keysearch(pending_updates, 1, erlang:system_info(check_io)) of + {value, {pending_updates, 0}} -> + ok; + false -> + ok; + _ -> + receive after 10 -> ok end, + wait_until_no_pending_updates() + end. + +otp_6602(doc) -> ["Missed port lock when stealing control of fd from a " + "driver that didn't use the same lock. The lock checker " + "used to trigger on this and dump core."]; +otp_6602(suite) -> + []; +otp_6602(Config) when is_list(Config) -> + ?line {ok, Node} = start_node(Config), + ?line Done = make_ref(), + ?line Parent = self(), + ?line Tester = spawn_link(Node, + fun () -> + %% Inet driver use port locking... + {ok, S} = gen_udp:open(0), + {ok, Fd} = inet:getfd(S), + {ok, Port} = inet:port(S), + %% Steal fd (lock checker used to + %% trigger here). + {ok, _S2} = gen_udp:open(Port,[{fd,Fd}]), + Parent ! Done + end), + ?line receive Done -> ok end, + ?line unlink(Tester), + ?line stop_node(Node), + ?line ok. + +-define(EXPECTED_SYSTEM_INFO_NAMES1, + ["drv_drv_vsn", + "emu_drv_vsn", + "erts_vsn", + "otp_vsn", + "thread", + "smp"]). +-define(EXPECTED_SYSTEM_INFO_NAMES2, + (?EXPECTED_SYSTEM_INFO_NAMES1 ++ + ["async_thrs", + "sched_thrs"])). + +-define(EXPECTED_SYSTEM_INFO_NAMES, ?EXPECTED_SYSTEM_INFO_NAMES2). + +'driver_system_info_ver1.0'(doc) -> + []; +'driver_system_info_ver1.0'(suite) -> + []; +'driver_system_info_ver1.0'(Config) when is_list(Config) -> + ?line driver_system_info_test(Config, sys_info_1_0_drv). + +'driver_system_info_ver1.1'(doc) -> + []; +'driver_system_info_ver1.1'(suite) -> + []; +'driver_system_info_ver1.1'(Config) when is_list(Config) -> + ?line driver_system_info_test(Config, sys_info_1_1_drv). + +driver_system_info_current_ver(doc) -> + []; +driver_system_info_current_ver(suite) -> + []; +driver_system_info_current_ver(Config) when is_list(Config) -> + ?line driver_system_info_test(Config, sys_info_curr_drv). + +driver_system_info_test(Config, Name) -> + ?line Port = start_driver(Config, Name, false), + ?line case erlang:port_control(Port, 0, []) of + [$o,$k,$:,_ | Result] -> + ?line check_driver_system_info_result(Result); + [$e,$r,$r,$o,$r,$:,_ | Error] -> + ?line ?t:fail(Error); + Unexpected -> + ?line ?t:fail({unexpected_result, Unexpected}) + end, + ?line stop_driver(Port, Name), + ?line ok. + +check_driver_system_info_result(Result) -> + ?line ?t:format("All names: ~p~n", [?EXPECTED_SYSTEM_INFO_NAMES]), + ?line ?t:format("Result: ~p~n", [Result]), + ?line {[], Ns, DDVSN} = chk_sis(lists:map(fun (Str) -> + string:tokens(Str, "=") + end, + string:tokens(Result, " ")), + ?EXPECTED_SYSTEM_INFO_NAMES), + ?line case {DDVSN, + drv_vsn_str2tup(erlang:system_info(driver_version))} of + {DDVSN, DDVSN} -> + ?line [] = Ns; + {{1, 0}, _} -> + ?line ExpNs = lists:sort(?EXPECTED_SYSTEM_INFO_NAMES + -- ?EXPECTED_SYSTEM_INFO_NAMES1), + ?line ExpNs = lists:sort(Ns); + {{1, 1}, _} -> + ?line ExpNs = lists:sort(?EXPECTED_SYSTEM_INFO_NAMES + -- ?EXPECTED_SYSTEM_INFO_NAMES2), + ?line ExpNs = lists:sort(Ns) + end. + +chk_sis(SIs, Ns) -> + chk_sis(SIs, Ns, unknown). + +chk_sis(SIs, [], DDVSN) -> + ?line {SIs, [], DDVSN}; +chk_sis([], Ns, DDVSN) -> + ?line {[], Ns, DDVSN}; +chk_sis([[N, _] = SI| SIs], Ns, DDVSN) -> + ?line true = lists:member(N, Ns), + ?line case check_si_res(SI) of + {driver_version, NewDDVSN} -> + ?line chk_sis(SIs, lists:delete(N, Ns), NewDDVSN); + _ -> + ?line chk_sis(SIs, lists:delete(N, Ns), DDVSN) + end. + +%% Data in first version of driver_system_info() (driver version 1.0) +check_si_res(["drv_drv_vsn", Value]) -> + ?line DDVSN = drv_vsn_str2tup(Value), + ?line {Major, DMinor} = DDVSN, + ?line {Major, EMinor} = drv_vsn_str2tup(erlang:system_info(driver_version)), + ?line true = DMinor =< EMinor, + ?line {driver_version, DDVSN}; +check_si_res(["emu_drv_vsn", Value]) -> + ?line Value = erlang:system_info(driver_version); +check_si_res(["erts_vsn", Value]) -> + ?line Value = erlang:system_info(version); +check_si_res(["otp_vsn", Value]) -> + ?line Value = erlang:system_info(otp_release); +check_si_res(["thread", "true"]) -> + ?line true = erlang:system_info(threads); +check_si_res(["thread", "false"]) -> + ?line false = erlang:system_info(threads); +check_si_res(["smp", "true"]) -> + ?line true = erlang:system_info(smp_support); +check_si_res(["smp", "false"]) -> + ?line false = erlang:system_info(smp_support); + +%% Data added in second version of driver_system_info() (driver version 1.1) +check_si_res(["async_thrs", Value]) -> + ?line Value = integer_to_list(erlang:system_info(thread_pool_size)); +check_si_res(["sched_thrs", Value]) -> + ?line Value = integer_to_list(erlang:system_info(schedulers)); + +check_si_res(Unexpected) -> + ?line ?t:fail({unexpected_result, Unexpected}). + +-define(MON_OP_I_AM_IPID,1). +-define(MON_OP_MONITOR_ME,2). +-define(MON_OP_DEMONITOR_ME,3). +-define(MON_OP_MONITOR_ME_LATER,4). +-define(MON_OP_DO_DELAYED_MONITOR,5). + +driver_monitor(suite) -> + []; +driver_monitor(doc) -> + ["Test monitoring of processes from drivers"]; +driver_monitor(Config) when is_list(Config) -> + ?line Name = monitor_drv, + ?line Port = start_driver(Config, Name, false), + ?line "ok" = port_control(Port,?MON_OP_I_AM_IPID,[]), + ?line "ok" = port_control(Port,?MON_OP_MONITOR_ME,[]), + ?line "ok" = port_control(Port,?MON_OP_DEMONITOR_ME,[]), + ?line {monitors, []} = erlang:port_info(Port,monitors), + + ?line "ok:"++Id1 = port_control(Port,?MON_OP_MONITOR_ME_LATER,[]), + ?line {monitored_by, []} = process_info(self(),monitored_by), + ?line "ok" = port_control(Port,?MON_OP_DO_DELAYED_MONITOR,Id1), + ?line {monitored_by, [Port]} = process_info(self(),monitored_by), + ?line "ok" = port_control(Port,?MON_OP_DEMONITOR_ME,[]), + ?line {monitored_by, []} = process_info(self(),monitored_by), + + ?line "ok" = port_control(Port,?MON_OP_MONITOR_ME,[]), + ?line Me = self(), + ?line {Pid1,Ref1} = + spawn_monitor(fun() -> + Me ! port_control(Port,?MON_OP_MONITOR_ME,[]), + Me ! process_info(self(),monitored_by), + Me ! erlang:port_info(Port,monitors) + end), + ?line ok = receive + "ok" -> + ok + after 1000 -> + timeout + end, + ?line ok = receive + {monitored_by, L} -> + L2 = lists:sort(L), + L3 = lists:sort([Me,Port]), + case L2 of + L3 -> + ok; + _ -> + mismatch + end + after 1000 -> + timeout + end, + ?line ok = receive + {monitors, LL} -> + LL2 = lists:sort(LL), + LL3 = lists:sort([{process,Me},{process,Pid1}]), + case LL2 of + LL3 -> + ok; + _ -> + mismatch + end + after 1000 -> + timeout + end, + ?line ok = receive + {'DOWN', Ref1, process, Pid1, _} -> + ok + after 1000 -> + timeout + end, + ?line ok = receive + {monitor_fired,Port,Pid1} -> + ok + after 1000 -> + timeout + end, + ?line "ok" = port_control(Port,?MON_OP_DEMONITOR_ME,[]), + ?line {monitors,[]} = erlang:port_info(Port,monitors), + ?line {monitored_by, []} = process_info(self(),monitored_by), + + ?line "ok" = port_control(Port,?MON_OP_MONITOR_ME,[]), + ?line {Pid2,Ref2} = + spawn_monitor(fun() -> + receive go -> ok end, + Me ! port_control(Port,?MON_OP_MONITOR_ME_LATER,[]), + Me ! process_info(self(),monitored_by), + Me ! erlang:port_info(Port,monitors) + end), + ?line Pid2 ! go, + ?line {ok,Id2} = receive + "ok:"++II -> + {ok,II} + after 1000 -> + timeout + end, + ?line ok = receive + {monitored_by, [Me]} -> + ok + after 1000 -> + timeout + end, + ?line ok = receive + {monitors, [{process,Me}]} -> + ok + after 1000 -> + timeout + end, + ?line ok = receive + {'DOWN', Ref2, process, Pid2, _} -> + ok + after 1000 -> + timeout + end, + ?line "noproc" = port_control(Port,?MON_OP_DO_DELAYED_MONITOR,Id2), + ?line {monitors,[{process,Me}]} = erlang:port_info(Port,monitors), + ?line "ok" = port_control(Port,?MON_OP_DEMONITOR_ME,[]), + ?line "not_monitored" = port_control(Port,?MON_OP_DEMONITOR_ME,[]), + ?line {monitors,[]} = erlang:port_info(Port,monitors), + ?line {monitored_by, []} = process_info(self(),monitored_by), + + + ?line "ok" = port_control(Port,?MON_OP_MONITOR_ME,[]), + ?line {Pid3,Ref3} = + spawn_monitor(fun() -> + receive go -> ok end, + Me ! port_control(Port,?MON_OP_MONITOR_ME_LATER,[]), + Me ! process_info(self(),monitored_by), + Me ! erlang:port_info(Port,monitors) , + receive die -> ok end + end), + ?line Pid3 ! go, + ?line {ok,Id3} = receive + "ok:"++III -> + {ok,III} + after 1000 -> + timeout + end, + ?line ok = receive + {monitored_by, [Me]} -> + ok + after 1000 -> + timeout + end, + ?line ok = receive + {monitors, [{process,Me}]} -> + ok + after 1000 -> + timeout + end, + ?line "ok" = port_control(Port,?MON_OP_DO_DELAYED_MONITOR,Id3), + ?line LLL1 = lists:sort([{process,Me},{process,Pid3}]), + ?line {monitors,LLL2} = erlang:port_info(Port,monitors), + ?line LLL1 = lists:sort(LLL2), + ?line "ok" = port_control(Port,?MON_OP_DEMONITOR_ME,[]), + ?line {monitors,[{process,Pid3}]} = erlang:port_info(Port,monitors), + ?line Pid3 ! die, + ?line ok = receive + {'DOWN', Ref3, process, Pid3, _} -> + ok + after 1000 -> + timeout + end, + ?line "not_found" = port_control(Port,?MON_OP_DO_DELAYED_MONITOR,Id2), + ?line {monitors,[]} = erlang:port_info(Port,monitors), + ?line "not_monitored" = port_control(Port,?MON_OP_DEMONITOR_ME,[]), + ?line {monitors,[]} = erlang:port_info(Port,monitors), + ?line {monitored_by, []} = process_info(self(),monitored_by), + + ?line stop_driver(Port, Name), + ?line ok. + +ioq_exit(doc) -> []; +ioq_exit(suite) -> + [ioq_exit_ready_input, + ioq_exit_ready_output, + ioq_exit_timeout, + ioq_exit_ready_async, + ioq_exit_event, + ioq_exit_ready_input_async, + ioq_exit_ready_output_async, + ioq_exit_timeout_async, + ioq_exit_event_async]. + +-define(IOQ_EXIT_READY_INPUT, 1). +-define(IOQ_EXIT_READY_OUTPUT, 2). +-define(IOQ_EXIT_TIMEOUT, 3). +-define(IOQ_EXIT_READY_ASYNC, 4). +-define(IOQ_EXIT_EVENT, 5). +-define(IOQ_EXIT_READY_INPUT_ASYNC, 6). +-define(IOQ_EXIT_READY_OUTPUT_ASYNC, 7). +-define(IOQ_EXIT_TIMEOUT_ASYNC, 8). +-define(IOQ_EXIT_EVENT_ASYNC, 9). + +ioq_exit_test(Config, TestNo) -> + ?line Drv = ioq_exit_drv, + ?line try + begin + ?line case load_driver(?config(data_dir, Config), + Drv) of + ok -> ?line ok; + {error, permanent} -> ?line ok; + LoadError -> ?line ?t:fail({load_error, LoadError}) + end, + case open_port({spawn, Drv}, []) of + Port when is_port(Port) -> + try port_control(Port, TestNo, "") of + "ok" -> + ?line ok; + "nyiftos" -> + ?line throw({skipped, + "Not yet implemented for " + "this OS"}); + [$s,$k,$i,$p,$:,$ | Comment] -> + ?line throw({skipped, Comment}); + [$e,$r,$r,$o,$r,$:,$ | Error] -> + ?line ?t:fail(Error) + after + Port ! {self(), close}, + receive {Port, closed} -> ok end, + false = lists:member(Port, erlang:ports()), + ok + end; + Error -> + ?line ?t:fail({open_port_failed, Error}) + end + end + catch + throw:Term -> ?line Term + after + erl_ddll:unload_driver(Drv) + end. + +ioq_exit_ready_input(doc) -> []; +ioq_exit_ready_input(suite) -> []; +ioq_exit_ready_input(Config) when is_list(Config) -> + ioq_exit_test(Config, ?IOQ_EXIT_READY_INPUT). + +ioq_exit_ready_output(doc) -> []; +ioq_exit_ready_output(suite) -> []; +ioq_exit_ready_output(Config) when is_list(Config) -> + ioq_exit_test(Config, ?IOQ_EXIT_READY_OUTPUT). + +ioq_exit_timeout(doc) -> []; +ioq_exit_timeout(suite) -> []; +ioq_exit_timeout(Config) when is_list(Config) -> + ioq_exit_test(Config, ?IOQ_EXIT_TIMEOUT). + +ioq_exit_ready_async(doc) -> []; +ioq_exit_ready_async(suite) -> []; +ioq_exit_ready_async(Config) when is_list(Config) -> + ioq_exit_test(Config, ?IOQ_EXIT_READY_ASYNC). + +ioq_exit_event(doc) -> []; +ioq_exit_event(suite) -> []; +ioq_exit_event(Config) when is_list(Config) -> + ioq_exit_test(Config, ?IOQ_EXIT_EVENT). + +ioq_exit_ready_input_async(doc) -> []; +ioq_exit_ready_input_async(suite) -> []; +ioq_exit_ready_input_async(Config) when is_list(Config) -> + ioq_exit_test(Config, ?IOQ_EXIT_READY_INPUT_ASYNC). + +ioq_exit_ready_output_async(doc) -> []; +ioq_exit_ready_output_async(suite) -> []; +ioq_exit_ready_output_async(Config) when is_list(Config) -> + ioq_exit_test(Config, ?IOQ_EXIT_READY_OUTPUT_ASYNC). + +ioq_exit_timeout_async(doc) -> []; +ioq_exit_timeout_async(suite) -> []; +ioq_exit_timeout_async(Config) when is_list(Config) -> + ioq_exit_test(Config, ?IOQ_EXIT_TIMEOUT_ASYNC). + +ioq_exit_event_async(doc) -> []; +ioq_exit_event_async(suite) -> []; +ioq_exit_event_async(Config) when is_list(Config) -> + ioq_exit_test(Config, ?IOQ_EXIT_EVENT_ASYNC). + + +vsn_mismatch_test(Config, LoadResult) -> + ?line Path = ?config(data_dir, Config), + ?line DrvName = ?config(testcase, Config), + ?line LoadResult = load_driver(Path, DrvName), + ?line case LoadResult of + ok -> + ?line Port = open_port({spawn, DrvName}, []), + ?line true = is_port(Port), + ?line true = port_close(Port), + ?line ok = erl_ddll:unload_driver(DrvName); + _ -> + ?line ok + end. + +zero_extended_marker_garb_drv(doc) -> []; +zero_extended_marker_garb_drv(suite) -> []; +zero_extended_marker_garb_drv(Config) when is_list(Config) -> + vsn_mismatch_test(Config, {error, driver_incorrect_version}). + +invalid_extended_marker_drv(doc) -> []; +invalid_extended_marker_drv(suite) -> []; +invalid_extended_marker_drv(Config) when is_list(Config) -> + vsn_mismatch_test(Config, {error, driver_incorrect_version}). + +larger_major_vsn_drv(doc) -> []; +larger_major_vsn_drv(suite) -> []; +larger_major_vsn_drv(Config) when is_list(Config) -> + vsn_mismatch_test(Config, {error, driver_incorrect_version}). + +larger_minor_vsn_drv(doc) -> []; +larger_minor_vsn_drv(suite) -> []; +larger_minor_vsn_drv(Config) when is_list(Config) -> + vsn_mismatch_test(Config, {error, driver_incorrect_version}). + +smaller_major_vsn_drv(doc) -> []; +smaller_major_vsn_drv(suite) -> []; +smaller_major_vsn_drv(Config) when is_list(Config) -> + vsn_mismatch_test(Config, {error, driver_incorrect_version}). + +smaller_minor_vsn_drv(doc) -> []; +smaller_minor_vsn_drv(suite) -> []; +smaller_minor_vsn_drv(Config) when is_list(Config) -> + DrvVsnStr = erlang:system_info(driver_version), + case drv_vsn_str2tup(DrvVsnStr) of + {_, 0} -> + {skipped, + "Cannot perform test when minor driver version is 0. " + "Current driver version is " ++ DrvVsnStr ++ "."}; + _ -> + vsn_mismatch_test(Config, ok) + end. + +-define(PEEK_NONXQ_TEST, 0). +-define(PEEK_NONXQ_WAIT, 1). + +peek_non_existing_queue(doc) -> []; +peek_non_existing_queue(suite) -> []; +peek_non_existing_queue(Config) when is_list(Config) -> + ?line OTE = process_flag(trap_exit, true), + ?line Drv = peek_non_existing_queue_drv, + ?line try + begin + ?line case load_driver(?config(data_dir, Config), + Drv) of + ok -> ?line ok; + {error, permanent} -> ?line ok; + LoadError -> ?line ?t:fail({load_error, LoadError}) + end, + case open_port({spawn, Drv}, []) of + Port1 when is_port(Port1) -> + try port_control(Port1, ?PEEK_NONXQ_TEST, "") of + "ok" -> + ?line ok; + [$s,$k,$i,$p,$p,$e,$d,$:,$ | SkipReason] -> + ?line throw({skipped, SkipReason}); + [$e,$r,$r,$o,$r,$:,$ | Error1] -> + ?line ?t:fail(Error1) + after + exit(Port1, kill), + receive {'EXIT', Port1, _} -> ok end + end; + Error1 -> + ?line ?t:fail({open_port1_failed, Error1}) + end, + case open_port({spawn, Drv}, []) of + Port2 when is_port(Port2) -> + try port_control(Port2, ?PEEK_NONXQ_WAIT, "") of + "ok" -> + ?line ok; + [$e,$r,$r,$o,$r,$:,$ | Error2] -> + ?line ?t:fail(Error2) + after + receive {Port2, test_successful} -> ok end, + Port2 ! {self(), close}, + receive {Port2, closed} -> ok end + end; + Error2 -> + ?line ?t:fail({open_port2_failed, Error2}) + end + end + catch + throw:Term -> ?line Term + after + process_flag(trap_exit, OTE), + erl_ddll:unload_driver(Drv) + end. + +otp_6879(doc) -> + []; +otp_6879(suite) -> + []; +otp_6879(Config) when is_list(Config) -> + ?line Drv = 'otp_6879_drv', + ?line Parent = self(), + ?line ok = load_driver(?config(data_dir, Config), Drv), + ?line Procs = lists:map( + fun (No) -> + spawn_link( + fun () -> + case open_port({spawn, Drv}, []) of + Port when is_port(Port) -> + Res = otp_6879_call(Port, No, 10000), + erlang:port_close(Port), + Parent ! {self(), Res}; + _ -> + Parent ! {self(), + open_port_failed} + end + end) + end, + lists:seq(1,10)), + ?line lists:foreach(fun (P) -> + ?line receive + {P, ok} -> + ?line ok; + {P, Error} -> + ?line ?t:fail({P, Error}) + end + end, + Procs), + %% Also try it when input exeeds default buffer (256 bytes) + ?line Data = lists:seq(1, 1000), + ?line case open_port({spawn, Drv}, []) of + Port when is_port(Port) -> + ?line ok = otp_6879_call(Port, Data, 10), + ?line erlang:port_close(Port); + _ -> + ?line ?t:fail(open_port_failed) + end, + ?line erl_ddll:unload_driver(Drv), + ?line ok. + +otp_6879_call(_Port, _Data, 0) -> + ok; +otp_6879_call(Port, Data, N) -> + case catch erlang:port_call(Port, 0, Data) of + Data -> otp_6879_call(Port, Data, N-1); + BadData -> {mismatch, Data, BadData} + end. + +caller(doc) -> + []; +caller(suite) -> + []; +caller(Config) when is_list(Config) -> + ?line run_caller_test(Config, false), + ?line run_caller_test(Config, true). + +run_caller_test(Config, Outputv) -> + ?line Drv = 'caller_drv', + ?line Cmd = case Outputv of + true -> + ?line os:putenv("CALLER_DRV_USE_OUTPUTV", + "true"), + outputv; + false -> + ?line os:putenv("CALLER_DRV_USE_OUTPUTV", + "false"), + output + end, + ?line ok = load_driver(?config(data_dir, Config), Drv), + ?line Port = open_port({spawn, Drv}, []), + ?line true = is_port(Port), + ?line chk_caller(Port, start, self()), + ?line chk_caller(Port, + Cmd, + spawn_link( + fun () -> + port_command(Port, "") + end)), + ?line Port ! {self(), {command, ""}}, + ?line chk_caller(Port, Cmd, self()), + ?line chk_caller(Port, + control, + spawn_link( + fun () -> + port_control(Port, 0, "") + end)), + ?line chk_caller(Port, + call, + spawn_link( + fun () -> + erlang:port_call(Port, 0, "") + end)), + ?line true = port_close(Port), + ?line erl_ddll:unload_driver(Drv), + ?line ok. + +chk_caller(Port, Callback, ExpectedCaller) -> + receive + {caller, Port, Callback, Caller} -> + ExpectedCaller = Caller + end. + +many_events(suite) -> + []; +many_events(doc) -> + ["Check that many simultaneously signalled events work (win32)"]; +many_events(Config) when is_list(Config) -> + ?line Name = 'many_events_drv', + ?line Port = start_driver(Config, Name, false), + Number = "1000", + Port ! {self(), {command, Number}}, + receive + {Port, {data,Number}} -> + ?line receive %% Just to make sure the emulator does not crash + %% after this case is run (if faulty) + after 2000 -> + ok + end + after 1000 -> + ?line exit(the_driver_does_not_respond) + end, + ?line stop_driver(Port, Name), + ?line ok. + + +missing_callbacks(doc) -> + []; +missing_callbacks(suite) -> + []; +missing_callbacks(Config) when is_list(Config) -> + ?line Name = 'missing_callback_drv', + ?line Port = start_driver(Config, Name, false), + + ?line Port ! {self(), {command, "tjenix"}}, + ?line true = erlang:port_command(Port, "halloj"), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(Port, 4711, "mors")), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_call(Port, 17, "hej")), + + ?line %% Give the (non-existing) ready_output(), ready_input(), event(), + ?line %% and timeout() some time to be called. + ?line receive after 1000 -> ok end, + + ?line stop_driver(Port, Name), + ?line ok. + +smp_select(doc) -> + ["Test concurrent calls to driver_select."]; +smp_select(suite) -> + []; +smp_select(Config) when is_list(Config) -> + case os:type() of + {win32,_} -> {skipped, "Test not implemented for this OS"}; + _ -> smp_select0(Config) + end. + +smp_select0(Config) -> + ?line DrvName = 'chkio_drv', + Path = ?config(data_dir, Config), + erl_ddll:start(), + ?line ok = load_driver(Path, DrvName), + Master = self(), + ProcFun = fun()-> io:format("Worker ~p starting\n",[self()]), + ?line Port = open_port({spawn, DrvName}, []), + smp_select_loop(Port, 100000), + sleep(500), % wait for driver to handle pending events + ?line true = erlang:port_close(Port), + Master ! {ok,self()}, + io:format("Worker ~p finished\n",[self()]) + end, + ?line Pids = lists:map(fun(_) -> spawn_link(ProcFun) end, + lists:seq(1,4)), + TimeoutMsg = make_ref(), + {ok,TRef} = timer:send_after(5*1000, TimeoutMsg), % Limit test duration on slow machines + smp_select_wait(Pids, TimeoutMsg), + timer:cancel(TRef), + ?line ok = erl_ddll:unload_driver(DrvName), + ?line ok = erl_ddll:stop(), + ok. + +smp_select_loop(_, 0) -> + ok; +smp_select_loop(Port, N) -> + ?line "ok" = erlang:port_control(Port, ?CHKIO_SMP_SELECT, []), + receive + stop -> + io:format("Worker ~p stopped with ~p laps left\n",[self(), N]), + ok + after 0 -> + smp_select_loop(Port, N-1) + end. + +smp_select_wait([], _) -> + ok; +smp_select_wait(Pids, TimeoutMsg) -> + receive + {ok,Pid} when is_pid(Pid) -> + smp_select_wait(lists:delete(Pid,Pids), TimeoutMsg); + TimeoutMsg -> + lists:foreach(fun(Pid)-> Pid ! stop end, + Pids), + smp_select_wait(Pids, TimeoutMsg) + end. + + +driver_select_use(doc) -> + ["Test driver_select() with new ERL_DRV_USE flag."]; +driver_select_use(suite) -> + []; +driver_select_use(Config) when is_list(Config) -> + case os:type() of + {win32,_} -> {skipped, "Test not implemented for this OS"}; + _ -> driver_select_use0(Config) + end. + +driver_select_use0(Config) -> + ?line DrvName = 'chkio_drv', + Path = ?config(data_dir, Config), + erl_ddll:start(), + ?line ok = load_driver(Path, DrvName), + ?line Port = open_port({spawn, DrvName}, []), + ?line "ok" = erlang:port_control(Port, ?CHKIO_DRV_USE, []), + ?line {Port,{data,"TheEnd"}} = receive Msg -> Msg + after 10000 -> timeout end, + ?line true = erlang:port_close(Port), + ?line ok = erl_ddll:unload_driver(DrvName), + ?line ok = erl_ddll:stop(), + ok. + +thread_mseg_alloc_cache_clean(Config) when is_list(Config) -> + case {erlang:system_info(threads), + erlang:system_info({allocator,mseg_alloc}), + driver_alloc_sbct()} of + {_, false, _} -> + ?line {skipped, "No mseg_alloc"}; + {false, _, _} -> + ?line {skipped, "No threads"}; + {_, _, false} -> + ?line {skipped, "driver_alloc() not using the alloc_util framework"}; + {_, _, SBCT} when is_integer(SBCT), SBCT > 10*1024*1024 -> + ?line {skipped, "driver_alloc() using too large single block threshold"}; + {_, _, 0} -> + ?line {skipped, "driver_alloc() using too low single block threshold"}; + {true, MsegAllocInfo, SBCT} -> + ?line DrvName = 'thr_alloc_drv', + ?line Path = ?config(data_dir, Config), + ?line erl_ddll:start(), + ?line ok = load_driver(Path, DrvName), + ?line Port = open_port({spawn, DrvName}, []), + ?line CCI = mseg_alloc_cci(MsegAllocInfo), + ?line ?t:format("CCI = ~p~n", [CCI]), + ?line CCC = mseg_alloc_ccc(), + ?line ?t:format("CCC = ~p~n", [CCC]), + ?line thread_mseg_alloc_cache_clean_test(Port, + 10, + CCI, + SBCT+100), + ?line true = erlang:port_close(Port), + ?line ok = erl_ddll:unload_driver(DrvName), + ?line ok = erl_ddll:stop(), + ?line ok + end. + +mseg_alloc_cci(MsegAllocInfo) -> + ?line {value,{options, OL}} + = lists:keysearch(options, 1, MsegAllocInfo), + ?line {value,{cci,CCI}} = lists:keysearch(cci,1,OL), + ?line CCI. + +mseg_alloc_ccc() -> + mseg_alloc_ccc(erlang:system_info({allocator,mseg_alloc})). + +mseg_alloc_ccc(MsegAllocInfo) -> + ?line {value,{calls, CL}} + = lists:keysearch(calls, 1, MsegAllocInfo), + ?line {value,{mseg_check_cache, GigaCCC, CCC}} + = lists:keysearch(mseg_check_cache, 1, CL), + ?line GigaCCC*1000000000 + CCC. + +mseg_alloc_cached_segments() -> + mseg_alloc_cached_segments(erlang:system_info({allocator,mseg_alloc})). + +mseg_alloc_cached_segments(MsegAllocInfo) -> + ?line {value,{status, SL}} + = lists:keysearch(status, 1, MsegAllocInfo), + ?line {value,{cached_segments, CS}} + = lists:keysearch(cached_segments, 1, SL), + ?line CS. + +driver_alloc_sbct() -> + {_, _, _, As} = erlang:system_info(allocator), + case lists:keysearch(driver_alloc, 1, As) of + {value,{driver_alloc,DAOPTs}} -> + case lists:keysearch(sbct, 1, DAOPTs) of + {value,{sbct,SBCT}} -> + SBCT; + _ -> + false + end; + _ -> + false + end. + +thread_mseg_alloc_cache_clean_test(_Port, 0, _CCI, _Size) -> + ?line ok; +thread_mseg_alloc_cache_clean_test(Port, N, CCI, Size) -> + ?line wait_until(fun () -> 0 == mseg_alloc_cached_segments() end), + ?line receive after CCI+500 -> ok end, + ?line OCCC = mseg_alloc_ccc(), + ?line "ok" = erlang:port_control(Port, 0, integer_to_list(Size)), + ?line receive after CCI+500 -> ok end, + ?line CCC = mseg_alloc_ccc(), + ?line ?t:format("CCC = ~p~n", [CCC]), + ?line true = CCC > OCCC, + ?line thread_mseg_alloc_cache_clean_test(Port, N-1, CCI, Size). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Utilities +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +wait_until(Fun) -> + case Fun() of + true -> ok; + false -> + receive after 100 -> ok end, + wait_until(Fun) + end. + +drv_vsn_str2tup(Str) -> + [Major, Minor] = string:tokens(Str, "."), + {list_to_integer(Major), list_to_integer(Minor)}. + +%% Build port data from a template. + +build_data({bin,Size}) -> build_binary(Size); +build_data({list,Size}) -> build_list(Size); +build_data(int) -> random_char(); +build_data([]) -> []; +build_data([H|T]) -> [build_data(H)|build_data(T)]. + +%% Transform all binaries in a term. + +transform_bins(_Transform, []) -> []; +transform_bins(Transform, [H|T]) -> + [transform_bins(Transform, H)|transform_bins(Transform, T)]; +transform_bins(Transform, Tuple) when is_tuple(Tuple) -> + list_to_tuple([transform_bins(Transform, E) || E <- tuple_to_list(Tuple)]); +transform_bins(Transform, Bin) when is_binary(Bin) -> + Transform(Bin); +transform_bins(_Transform, Other) -> Other. + + +%% Convert all binaries in a term to sub binaries. + +make_sub_binaries(Term) -> + MakeSub = fun(Bin0) -> + Bin1 = <<243:8,0:3,Bin0/binary,31:5,19:8>>, + Sz = size(Bin0), + <<243:8,0:3,Bin:Sz/binary,31:5,19:8>> = id(Bin1), + Bin + end, + transform_bins(MakeSub, Term). + +id(I) -> I. + +%% Convert all binaries in a term to refc binaries. + +make_refc_binaries(Term) -> + F = fun(B0) -> list_to_binary([build_binary(?heap_binary_size+1),B0]) end, + transform_bins(F, Term). + +build_binary(Elements) -> + list_to_binary(build_list(Elements)). + +build_list(Elements) -> build_list(Elements, []). + +build_list(0, Acc) -> Acc; +build_list(Elements, Acc) -> build_list(Elements-1, [random_char()|Acc]). + + +%% Convert all binaries in a list to writable binaries. + +make_writable_binaries(Term) -> + transform_bins(fun(Bin) -> <> end, Term). + +append_to_writable_binaries(Term) -> + transform_bins(fun(Bin) -> <> end, Term). + +random_char() -> + uniform(256) - 1. + +uniform(N) -> + case get(random_seed) of + undefined -> + {X, Y, Z} = time(), + random:seed(X, Y, Z); + _ -> + ok + end, + random:uniform(N). + +%% return millisecs from statistics source +erl_millisecs() -> + {Ms, S, Us} = erlang:now(), + Ms * 1000000000 + S * 1000 + Us / 1000. + +erl_millisecs({Ms,S,Us}) -> + Ms * 1000000000 + S * 1000 + Us / 1000. + +%% Start/stop drivers. +start_driver(Config, Name, Binary) -> + Path = ?config(data_dir, Config), + erl_ddll:start(), + + %% Load the driver + ok = load_driver(Path, Name), + + %% open port. + case Binary of + true -> + open_port({spawn, Name}, [binary]); + false -> + open_port({spawn, Name}, []) + end. + +stop_driver(Port, Name) -> + ?line true = erlang:port_close(Port), + receive + {Port,Message} -> + ?t:fail({strange_message_from_port,Message}) + after 0 -> + ok + end, + + %% Unload the driver. + ok = erl_ddll:unload_driver(Name), + ?line ok = erl_ddll:stop(). + +load_driver(Dir, Driver) -> + case erl_ddll:load_driver(Dir, Driver) of + ok -> ok; + {error, Error} = Res -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + Res + end. + +sleep() -> + receive after infinity -> ok end. + +sleep(infinity) -> + sleep(); +sleep(Ms) when is_integer(Ms), Ms >= 0 -> + receive after Ms -> ok end. + + +start_node(Config) when is_list(Config) -> + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line {A, B, C} = now(), + ?line Name = list_to_atom(atom_to_list(?MODULE) + ++ "-" + ++ atom_to_list(?config(testcase, Config)) + ++ "-" + ++ integer_to_list(A) + ++ "-" + ++ integer_to_list(B) + ++ "-" + ++ integer_to_list(C)), + ?line ?t:start_node(Name, slave, [{args, "-pa "++Pa}]). + +stop_node(Node) -> + ?t:stop_node(Node). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/efile_SUITE_data/existing_file erlang-13.b.3-dfsg/erts/emulator/test/efile_SUITE_data/existing_file --- erlang-13.b.1-dfsg/erts/emulator/test/efile_SUITE_data/existing_file 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/efile_SUITE_data/existing_file 1997-05-20 23:15:19.000000000 +0100 @@ -0,0 +1 @@ +This file must exist, but its contents is not important. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/efile_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/efile_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/efile_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/efile_SUITE.erl 2009-09-18 15:07:29.000000000 +0100 @@ -0,0 +1,76 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(efile_SUITE). +-export([all/1]). +-export([iter_max_files/1]). + +-include("test_server.hrl"). + +all(suite) -> [iter_max_files]. + +%% +%% Open as many files as possible. Do this several times and check +%% that we get the same number of files every time. +%% + +iter_max_files(suite) -> []; +iter_max_files(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir,Config), + ?line TestFile = filename:join(DataDir, "existing_file"), + ?line L = do_iter_max_files(10, TestFile), + ?line io:format("Number of files opened in each test:~n~w\n", [L]), + ?line all_equal(L), + Head = hd(L), + if Head >= 2 -> ok; + true -> ?line test_server:fail(too_few_files) + end, + {comment, "Max files: " ++ integer_to_list(hd(L))}. + +do_iter_max_files(N, Name) when N > 0 -> + ?line [max_files(Name)| do_iter_max_files(N-1, Name)]; +do_iter_max_files(_, _) -> + []. + +all_equal([E, E| T]) -> + ?line all_equal([E| T]); +all_equal([_]) -> + ok; +all_equal([]) -> + ok. + +max_files(Name) -> + ?line Fds = open_files(Name), + ?line N = length(Fds), + ?line close_files(Fds), + N. + +close_files([Fd| Fds]) -> + ?line file:close(Fd), + ?line close_files(Fds); +close_files([]) -> + ok. + +open_files(Name) -> + ?line case file:open(Name, [read,raw]) of + {ok, Fd} -> + [Fd| open_files(Name)]; + {error, Reason} -> + io:format("Error reason: ~p", [Reason]), + [] + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/emulator.spec erlang-13.b.3-dfsg/erts/emulator/test/emulator.spec --- erlang-13.b.1-dfsg/erts/emulator/test/emulator.spec 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/emulator.spec 1997-11-09 23:01:00.000000000 +0000 @@ -0,0 +1 @@ +{topcase, {dir, "../emulator_test"}}. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/emulator.spec.ose erlang-13.b.3-dfsg/erts/emulator/test/emulator.spec.ose --- erlang-13.b.1-dfsg/erts/emulator/test/emulator.spec.ose 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/emulator.spec.ose 2004-09-14 12:58:41.000000000 +0100 @@ -0,0 +1,2 @@ +{topcase, {dir, "../emulator_test"}}. +{skip, {obsolete_SUITE, "Not on ose"}}. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/emulator.spec.vxworks erlang-13.b.3-dfsg/erts/emulator/test/emulator.spec.vxworks --- erlang-13.b.1-dfsg/erts/emulator/test/emulator.spec.vxworks 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/emulator.spec.vxworks 2007-11-26 18:58:10.000000000 +0000 @@ -0,0 +1,26 @@ +{topcase, {dir, "../emulator_test"}}. + +% Added since R11 +{skip,{distribution_SUITE,link_to_dead_new_node,"Does not work in distributed test environments"}}. +{skip,{binary_SUITE,terms_float,"Floats, VxWorks, PPC = Floating points never equal..."}}. +{skip,{system_info_SUITE,process_count,"Fix-allocs starving VxWorks cards"}}. +{skip,{monitor_SUITE,mixer,"Fix-allocs starving VxWorks cards"}}. + +{skip,{node_container_SUITE,"Too memory consuming..."}}. + +{skip,{trace_SUITE,system_monitor_long_gc_1,"Too memory consuming..."}}. +{skip,{trace_SUITE,system_monitor_long_gc_2,"Too memory consuming..."}}. +{skip,{trace_SUITE,system_monitor_large_heap_1,"Too memory consuming..."}}. +{skip,{trace_SUITE,system_monitor_large_heap_2,"Too memory consuming..."}}. +% End added since R11 + +{skip, {distribution_SUITE,stop_dist,"Not written to work on VxWorks."}}. +{skip, {distribution_SUITE,dist_auto_connect_never, + "Not written to work on VxWorks."}}. +{skip, {distribution_SUITE,dist_auto_connect_once, + "Not written to work on VxWorks."}}. +{skip, {trace_SUITE,system_monitor_long_gc, + "Too memory consuming for VxWorks cards."}}. +{skip, {trace_meta_SUITE,stack_grow, + "Too memory consuming for VxWorks cards."}}. +{skip, {obsolete_SUITE, "Not on vxworks"}}. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/emulator.spec.win erlang-13.b.3-dfsg/erts/emulator/test/emulator.spec.win --- erlang-13.b.1-dfsg/erts/emulator/test/emulator.spec.win 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/emulator.spec.win 2004-09-14 12:58:40.000000000 +0100 @@ -0,0 +1,2 @@ +{topcase, {dir, "../emulator_test"}}. +{skip, {obsolete_SUITE, "Not on windows"}}. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/basic.c erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/basic.c --- erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/basic.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/basic.c 2007-11-26 19:01:48.000000000 +0000 @@ -0,0 +1,291 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" + +#ifdef __WIN32__ +#include +#else +#include +#endif +#include + +#define NO_OF_THREADS 2 + +static int die; +static int cw_passed; +static int res_tf0; +static int res_tf1; +static ErlDrvMutex *mtx; +static ErlDrvCond *cnd; +static int need_join[NO_OF_THREADS]; +static ErlDrvTid tid[NO_OF_THREADS]; +static ErlDrvThreadOpts *topts; + +typedef struct { + int n; +} thr_arg_t; + +static void +do_sleep(unsigned secs) +{ +#ifdef __WIN32__ + Sleep((DWORD) secs*1000); +#else + sleep(secs); +#endif +} + +static void *tf0(void *vta) +{ + if (((thr_arg_t *) vta)->n == 0) { + + erl_drv_mutex_lock(mtx); + + erl_drv_cond_wait(cnd, mtx); + + if (die) { + erl_drv_mutex_unlock(mtx); + return NULL; + } + + cw_passed++; + + erl_drv_cond_wait(cnd, mtx); + + if (die) { + erl_drv_mutex_unlock(mtx); + return NULL; + } + + cw_passed++; + + erl_drv_mutex_unlock(mtx); + if (erl_drv_equal_tids(erl_drv_thread_self(), tid[0])) + res_tf0 = 0; + } + + return (void *) &res_tf0; +} + + +static void *tf1(void *vta) +{ + + if (((thr_arg_t *) vta)->n == 1) { + + erl_drv_mutex_lock(mtx); + + erl_drv_cond_wait(cnd, mtx); + + if (die) { + erl_drv_mutex_unlock(mtx); + return NULL; + } + + cw_passed++; + + erl_drv_cond_wait(cnd, mtx); + + if (die) { + erl_drv_mutex_unlock(mtx); + return NULL; + } + + cw_passed++; + + erl_drv_mutex_unlock(mtx); + + if (erl_drv_equal_tids(erl_drv_thread_self(), tid[1])) + res_tf1 = 1; + + erl_drv_thread_exit((void *) &res_tf1); + + res_tf1 = 4711; + } + return NULL; +} + +void +testcase_run(TestCaseState_t *tcs) +{ + int i, r; + void *tres[2]; + thr_arg_t ta[2]; + ErlDrvTid my_tid; + ErlDrvSysInfo sinfo; + + driver_system_info(&sinfo, sizeof(ErlDrvSysInfo)); + if (!sinfo.thread_support) + testcase_skipped(tcs, "No thread support; nothing to test"); + + testcase_printf(tcs, "Initializing\n"); + + cw_passed = 0; + die = 0; + my_tid = erl_drv_thread_self(); + + for (i = 0; i < NO_OF_THREADS; i++) + need_join[i] = 0; + + res_tf0 = 17; + res_tf1 = 17; + + mtx = NULL; + cnd = NULL; + /* Create mutex and cond */ + mtx = erl_drv_mutex_create("mutex"); + ASSERT(tcs, mtx); + cnd = erl_drv_cond_create("cond"); + ASSERT(tcs, cnd); + topts = erl_drv_thread_opts_create("thread opts"); + ASSERT(tcs, topts); + topts->suggested_stack_size = 0; /* As small as possible */ + + testcase_printf(tcs, "Creating threads 0 & 1\n"); + + /* Create the threads */ + ta[0].n = 0; + r = erl_drv_thread_create("thread 0", &tid[0], tf0, (void *) &ta[0], topts); + ASSERT(tcs, r == 0); + need_join[0] = 1; + + ta[1].n = 1; + r = erl_drv_thread_create("thread 1", &tid[1], tf1, (void *) &ta[1], NULL); + ASSERT(tcs, r == 0); + need_join[1] = 1; + + testcase_printf(tcs, "Testing tids\n"); + + ASSERT(tcs, !erl_drv_equal_tids(tid[0], my_tid)); + ASSERT(tcs, !erl_drv_equal_tids(tid[1], my_tid)); + ASSERT(tcs, !erl_drv_equal_tids(tid[0], tid[1])); + ASSERT(tcs, erl_drv_equal_tids(my_tid, erl_drv_thread_self())); + + testcase_printf(tcs, "Testing mutex/cond\n"); + + /* Make sure the threads waits on cond wait */ + do_sleep(1); + + erl_drv_mutex_lock(mtx); + + ASSERT_CLNUP(tcs, cw_passed == 0, erl_drv_mutex_unlock(mtx)); + + /* Let one thread pass one cond wait */ + erl_drv_cond_signal(cnd); + + erl_drv_mutex_unlock(mtx); + + do_sleep(1); + + erl_drv_mutex_lock(mtx); + + ASSERT_CLNUP(tcs, cw_passed == 1, erl_drv_mutex_unlock(mtx)); + + + /* Let both threads pass one cond wait */ + erl_drv_cond_broadcast(cnd); + + erl_drv_mutex_unlock(mtx); + + do_sleep(1); + + erl_drv_mutex_lock(mtx); + + ASSERT_CLNUP(tcs, cw_passed == 3, erl_drv_mutex_unlock(mtx)); + + + /* Let the thread that only have passed one cond wait pass the other one */ + erl_drv_cond_signal(cnd); + + erl_drv_mutex_unlock(mtx); + + do_sleep(1); + + erl_drv_mutex_lock(mtx); + + ASSERT_CLNUP(tcs, cw_passed == 4, erl_drv_mutex_unlock(mtx)); + + + testcase_printf(tcs, "Testing join\n"); + + /* Both threads should have passed both cond waits and exited; + join them and check returned values */ + + erl_drv_thread_join(tid[0], &tres[0]); + ASSERT_CLNUP(tcs, r == 0, erl_drv_mutex_unlock(mtx)); + need_join[0] = 0; + + ASSERT_CLNUP(tcs, tres[0] == &res_tf0, erl_drv_mutex_unlock(mtx)); + ASSERT_CLNUP(tcs, res_tf0 == 0, erl_drv_mutex_unlock(mtx)); + + r = erl_drv_thread_join(tid[1], &tres[1]); + ASSERT_CLNUP(tcs, r == 0, erl_drv_mutex_unlock(mtx)); + need_join[1] = 0; + + ASSERT_CLNUP(tcs, tres[1] == &res_tf1, erl_drv_mutex_unlock(mtx)); + ASSERT_CLNUP(tcs, res_tf1 == 1, erl_drv_mutex_unlock(mtx)); + + /* Test signaling when noone waits */ + + erl_drv_cond_signal(cnd); + + /* Test broadcasting when noone waits */ + + erl_drv_cond_broadcast(cnd); + + erl_drv_mutex_unlock(mtx); + + erl_drv_mutex_destroy(mtx); + mtx = NULL; + + erl_drv_cond_destroy(cnd); + cnd = NULL; + + erl_drv_thread_opts_destroy(topts); + topts = NULL; + + testcase_printf(tcs, "done\n"); +} + +char * +testcase_name(void) +{ + return "basic"; +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + int i; + for (i = 0; i < NO_OF_THREADS; i++) { + if (need_join[i]) { + erl_drv_mutex_lock(mtx); + die = 1; + erl_drv_cond_broadcast(cnd); + erl_drv_mutex_unlock(mtx); + erl_drv_thread_join(tid[i], NULL); + } + } + if (mtx) + erl_drv_mutex_destroy(mtx); + if (cnd) + erl_drv_cond_destroy(cnd); + if (topts) + erl_drv_thread_opts_destroy(topts); +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/Makefile.src 2007-11-26 19:01:48.000000000 +0000 @@ -0,0 +1,33 @@ +# ``The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved via the world wide web at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# The Initial Developer of the Original Code is Ericsson Utvecklings AB. +# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings +# AB. All Rights Reserved.'' +# +# $Id$ +# + +TEST_DRVS = basic@dll@ rwlock@dll@ tsd@dll@ +CC = @CC@ +LD = @LD@ +CFLAGS = @SHLIB_CFLAGS@ -I@erl_include@ @DEFS@ +SHLIB_EXTRA_LDLIBS = testcase_driver@obj@ + +all: $(TEST_DRVS) + +@SHLIB_RULES@ + +testcase_driver@obj@: testcase_driver.c testcase_driver.h +$(TEST_DRVS): testcase_driver@obj@ + + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/rwlock.c erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/rwlock.c --- erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/rwlock.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/rwlock.c 2007-11-26 19:01:49.000000000 +0000 @@ -0,0 +1,214 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" + +#ifdef __WIN32__ +#include +#else +#include +#endif +#include + +#define NO_OF_THREADS 17 + +struct { + int alive; + ErlDrvTid tid; +} test_thr[NO_OF_THREADS] = {0}; + + +static int die; +static int ready; +static int rlocked; +static int rwlocked; +static int do_rlock; +static int do_rwlock; +static ErlDrvMutex *mtx; +static ErlDrvCond *cnd; +static ErlDrvRWLock *rwlck; + +static void +do_sleep(unsigned secs) +{ +#ifdef __WIN32__ + Sleep((DWORD) secs*1000); +#else + sleep(secs); +#endif +} + +static void *tf(void *unused) +{ + + erl_drv_mutex_lock(mtx); + ready++; + if (ready == NO_OF_THREADS) + erl_drv_cond_broadcast(cnd); + while (!do_rlock) + erl_drv_cond_wait(cnd, mtx); + erl_drv_mutex_unlock(mtx); + + erl_drv_rwlock_rlock(rwlck); + + /* make sure everyone rlocks at the same time */ + erl_drv_mutex_lock(mtx); + rlocked++; + if (rlocked == NO_OF_THREADS) + erl_drv_cond_broadcast(cnd); + while (rlocked != NO_OF_THREADS && !die) + erl_drv_cond_wait(cnd, mtx); + erl_drv_mutex_unlock(mtx); + + erl_drv_rwlock_runlock(rwlck); + + erl_drv_mutex_lock(mtx); + while (!do_rwlock && !die) + erl_drv_cond_wait(cnd, mtx); + if (die) { + erl_drv_mutex_unlock(mtx); + return NULL; + } + erl_drv_mutex_unlock(mtx); + + erl_drv_rwlock_rwlock(rwlck); + rwlocked++; + erl_drv_rwlock_rwunlock(rwlck); + + return NULL; +} + +void +testcase_run(TestCaseState_t *tcs) +{ + int i, r; + ErlDrvSysInfo sinfo; + + driver_system_info(&sinfo, sizeof(ErlDrvSysInfo)); + if (!sinfo.thread_support) + testcase_skipped(tcs, "No thread support; nothing to test"); + + testcase_printf(tcs, "Initializing\n"); + die = 0; + ready = 0; + rlocked = 0; + rwlocked = 0; + do_rlock = 0; + do_rwlock = 0; + + mtx = erl_drv_mutex_create("test mutex"); + cnd = erl_drv_cond_create("test cond"); + rwlck = erl_drv_rwlock_create("test rwlock"); + ASSERT(tcs, mtx && cnd && rwlck); + + testcase_printf(tcs, "Creating %d threads\n", NO_OF_THREADS); + /* Create the threads */ + for (i = 0; i < NO_OF_THREADS; i++) { + char name[100]; + sprintf(name, "thread %d", i); + r = erl_drv_thread_create(name, + &test_thr[i].tid, + tf, + NULL, + NULL); + ASSERT(tcs, r == 0); + test_thr[i].alive = 1; + } + + testcase_printf(tcs, "Testing\n"); + erl_drv_rwlock_rwlock(rwlck); + + erl_drv_mutex_lock(mtx); + while (ready != NO_OF_THREADS) + erl_drv_cond_wait(cnd, mtx); + do_rlock = 1; + erl_drv_cond_broadcast(cnd); + erl_drv_mutex_unlock(mtx); + + do_sleep(1); + + erl_drv_mutex_lock(mtx); + + ASSERT_CLNUP(tcs, + rlocked == 0, + do { + erl_drv_mutex_unlock(mtx); + erl_drv_rwlock_rwunlock(rwlck); + } while (0)); + + erl_drv_mutex_unlock(mtx); + erl_drv_rwlock_rwunlock(rwlck); + + do_sleep(2); + + erl_drv_mutex_lock(mtx); + ASSERT_CLNUP(tcs, rlocked == NO_OF_THREADS, erl_drv_mutex_unlock(mtx)); + do_rwlock = 1; + erl_drv_cond_broadcast(cnd); + erl_drv_mutex_unlock(mtx); + + testcase_printf(tcs, "Joining threads\n"); + /* Join the threads */ + for (i = 0; i < NO_OF_THREADS; i++) { + void *res; + r = erl_drv_thread_join(test_thr[i].tid, NULL); + test_thr[i].alive = 0; + ASSERT(tcs, r == 0); + } + + erl_drv_mutex_lock(mtx); + ASSERT_CLNUP(tcs, rwlocked == NO_OF_THREADS, erl_drv_mutex_unlock(mtx)); + erl_drv_mutex_unlock(mtx); + + erl_drv_mutex_destroy(mtx); + mtx = NULL; + erl_drv_cond_destroy(cnd); + cnd = NULL; + erl_drv_rwlock_destroy(rwlck); + rwlck = NULL; + + testcase_printf(tcs, "done\n"); +} + +char * +testcase_name(void) +{ + return "rwlock"; +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + int i; + for (i = 0; i < NO_OF_THREADS; i++) { + if (test_thr[i].alive) { + erl_drv_mutex_lock(mtx); + die = 1; + erl_drv_cond_broadcast(cnd); + erl_drv_mutex_unlock(mtx); + erl_drv_thread_join(test_thr[i].tid, NULL); + } + } + + if (mtx) + erl_drv_mutex_destroy(mtx); + if (cnd) + erl_drv_cond_destroy(cnd); + if (rwlck) + erl_drv_rwlock_destroy(rwlck); +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/testcase_driver.c erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/testcase_driver.c --- erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/testcase_driver.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/testcase_driver.c 2009-03-12 12:16:46.000000000 +0000 @@ -0,0 +1,260 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include +#include +#include +#include +#include + +#ifdef __WIN32__ +#undef HAVE_VSNPRINTF +#define HAVE_VSNPRINTF 1 +#define vsnprintf _vsnprintf +#endif + +#ifndef HAVE_VSNPRINTF +#define HAVE_VSNPRINTF 0 +#endif + +#define COMMENT_BUF_SZ 4096 + +#define TESTCASE_FAILED 0 +#define TESTCASE_SKIPPED 1 +#define TESTCASE_SUCCEEDED 2 + +typedef struct { + TestCaseState_t visible; + ErlDrvPort port; + int result; + jmp_buf done_jmp_buf; + char *comment; + char comment_buf[COMMENT_BUF_SZ]; +} InternalTestCaseState_t; + +ErlDrvData testcase_drv_start(ErlDrvPort port, char *command); +void testcase_drv_stop(ErlDrvData drv_data); +void testcase_drv_run(ErlDrvData drv_data, char *buf, int len); + +static ErlDrvEntry testcase_drv_entry = { + NULL, + testcase_drv_start, + testcase_drv_stop, + testcase_drv_run +}; + + +DRIVER_INIT(testcase_drv) +{ + testcase_drv_entry.driver_name = testcase_name(); + return &testcase_drv_entry; +} + +ErlDrvData +testcase_drv_start(ErlDrvPort port, char *command) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) + driver_alloc(sizeof(InternalTestCaseState_t)); + if (!itcs) { + return ERL_DRV_ERROR_GENERAL; + } + + itcs->visible.testcase_name = testcase_name(); + itcs->visible.extra = NULL; + itcs->port = port; + itcs->result = TESTCASE_FAILED; + itcs->comment = ""; + + return (ErlDrvData) itcs; +} + +void +testcase_drv_stop(ErlDrvData drv_data) +{ + testcase_cleanup((TestCaseState_t *) drv_data); + driver_free((void *) drv_data); +} + +void +testcase_drv_run(ErlDrvData drv_data, char *buf, int len) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) drv_data; + ErlDrvTermData result_atom; + ErlDrvTermData msg[12]; + + itcs->visible.command = buf; + itcs->visible.command_len = len; + + if (setjmp(itcs->done_jmp_buf) == 0) { + testcase_run((TestCaseState_t *) itcs); + itcs->result = TESTCASE_SUCCEEDED; + } + + switch (itcs->result) { + case TESTCASE_SUCCEEDED: + result_atom = driver_mk_atom("succeeded"); + break; + case TESTCASE_SKIPPED: + result_atom = driver_mk_atom("skipped"); + break; + case TESTCASE_FAILED: + default: + result_atom = driver_mk_atom("failed"); + break; + } + + msg[0] = ERL_DRV_ATOM; + msg[1] = (ErlDrvTermData) result_atom; + + msg[2] = ERL_DRV_PORT; + msg[3] = driver_mk_port(itcs->port); + + msg[4] = ERL_DRV_ATOM; + msg[5] = driver_mk_atom(itcs->visible.testcase_name); + + msg[6] = ERL_DRV_STRING; + msg[7] = (ErlDrvTermData) itcs->comment; + msg[8] = (ErlDrvTermData) strlen(itcs->comment); + + msg[9] = ERL_DRV_TUPLE; + msg[10] = (ErlDrvTermData) 4; + + driver_output_term(itcs->port, msg, 11); +} + +int +testcase_assertion_failed(TestCaseState_t *tcs, + char *file, int line, char *assertion) +{ + testcase_failed(tcs, "%s:%d: Assertion failed: \"%s\"", + file, line, assertion); + return 0; +} + +void +testcase_printf(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + ErlDrvTermData msg[12]; + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + msg[0] = ERL_DRV_ATOM; + msg[1] = (ErlDrvTermData) driver_mk_atom("print"); + + msg[2] = ERL_DRV_PORT; + msg[3] = driver_mk_port(itcs->port); + + msg[4] = ERL_DRV_ATOM; + msg[5] = driver_mk_atom(itcs->visible.testcase_name); + + msg[6] = ERL_DRV_STRING; + msg[7] = (ErlDrvTermData) itcs->comment_buf; + msg[8] = (ErlDrvTermData) strlen(itcs->comment_buf); + + msg[9] = ERL_DRV_TUPLE; + msg[10] = (ErlDrvTermData) 4; + + driver_output_term(itcs->port, msg, 11); +} + + +void testcase_succeeded(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + itcs->result = TESTCASE_SUCCEEDED; + itcs->comment = itcs->comment_buf; + + longjmp(itcs->done_jmp_buf, 1); +} + +void testcase_skipped(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + itcs->result = TESTCASE_SKIPPED; + itcs->comment = itcs->comment_buf; + + longjmp(itcs->done_jmp_buf, 1); +} + +void testcase_failed(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + char buf[10]; + size_t bufsz = sizeof(buf); + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + itcs->result = TESTCASE_FAILED; + itcs->comment = itcs->comment_buf; + + if (erl_drv_getenv("ERL_ABORT_ON_FAILURE", buf, &bufsz) == 0 + && strcmp("true", buf) == 0) { + fprintf(stderr, "Testcase \"%s\" failed: %s\n", + itcs->visible.testcase_name, itcs->comment); + abort(); + } + + longjmp(itcs->done_jmp_buf, 1); +} + +void *testcase_alloc(size_t size) +{ + return driver_alloc(size); +} + +void *testcase_realloc(void *ptr, size_t size) +{ + return driver_realloc(ptr, size); +} + +void testcase_free(void *ptr) +{ + driver_free(ptr); +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/testcase_driver.h erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/testcase_driver.h --- erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/testcase_driver.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/testcase_driver.h 2007-11-26 19:01:49.000000000 +0000 @@ -0,0 +1,58 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#ifndef TESTCASE_DRIVER_H__ +#define TESTCASE_DRIVER_H__ + +#include "erl_driver.h" +#include + +typedef struct { + char *testcase_name; + char *command; + int command_len; + void *extra; +} TestCaseState_t; + +#define ASSERT_CLNUP(TCS, B, CLN) \ +do { \ + if (!(B)) { \ + CLN; \ + testcase_assertion_failed((TCS), __FILE__, __LINE__, #B); \ + } \ +} while (0) + +#define ASSERT(TCS, B) ASSERT_CLNUP(TCS, B, (void) 0) + + +void testcase_printf(TestCaseState_t *tcs, char *frmt, ...); +void testcase_succeeded(TestCaseState_t *tcs, char *frmt, ...); +void testcase_skipped(TestCaseState_t *tcs, char *frmt, ...); +void testcase_failed(TestCaseState_t *tcs, char *frmt, ...); +int testcase_assertion_failed(TestCaseState_t *tcs, char *file, int line, + char *assertion); +void *testcase_alloc(size_t size); +void *testcase_realloc(void *ptr, size_t size); +void testcase_free(void *ptr); + + +char *testcase_name(void); +void testcase_run(TestCaseState_t *tcs); +void testcase_cleanup(TestCaseState_t *tcs); + +#endif diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/tsd.c erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/tsd.c --- erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/tsd.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE_data/tsd.c 2007-11-26 19:01:49.000000000 +0000 @@ -0,0 +1,173 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include + +#define NO_OF_THREADS 17 +#define NO_OF_KEYS 4711 + +struct { + int alive; + ErlDrvTid tid; +} test_thr[NO_OF_THREADS] = {0}; + +struct { + int used; + ErlDrvTSDKey key; +} test_key[NO_OF_KEYS] = {0}; + +typedef struct { + int n; +} thr_arg_t; + +static void *tf(void *vta) +{ + int i; + int thr_val = (((thr_arg_t *) vta)->n << 16); + + for (i = 0; i < NO_OF_KEYS; i++) + erl_drv_tsd_set(test_key[i].key, (void *) (thr_val | i)); + + for (i = 0; i < NO_OF_KEYS; i++) + if (erl_drv_tsd_get(test_key[i].key) != ((void *) (thr_val | i))) + return (void *) 1; + + for (i = 0; i < NO_OF_KEYS; i++) + erl_drv_tsd_set(test_key[i].key, NULL); + + for (i = 0; i < NO_OF_KEYS; i++) + if (erl_drv_tsd_get(test_key[i].key) != NULL) + return (void *) 2; + + return (void *) 3; +} + +void +thr_key_clnup(void) +{ + int i; + for (i = 0; i < NO_OF_KEYS; i++) + erl_drv_tsd_set(test_key[i].key, NULL); +} + +void +testcase_run(TestCaseState_t *tcs) +{ + int i, r; + thr_arg_t ta[NO_OF_THREADS]; + ErlDrvSysInfo sinfo; + + testcase_printf(tcs, "Initializing\n"); + + driver_system_info(&sinfo, sizeof(ErlDrvSysInfo)); + + for (i = 0; i < NO_OF_KEYS; i++) { + char name[100]; + sprintf(name, "key %d", i); + r = erl_drv_tsd_key_create(name, &test_key[i].key); + ASSERT(tcs, r == 0); + test_key[i].used = 1; + } + + for (i = 0; i < NO_OF_KEYS; i++) + erl_drv_tsd_set(test_key[i].key, + (void *) (((NO_OF_THREADS+1) << 16) | i)); + + if (!sinfo.thread_support) + testcase_printf(tcs, "No thread support; testing tsd in one thread\n"); + else { + testcase_printf(tcs, "Creating %d threads\n", NO_OF_THREADS); + + /* Create the threads */ + for (i = 0; i < NO_OF_THREADS; i++) { + char name[100]; + ta[i].n = 0; + sprintf(name, "thread %d", i); + r = erl_drv_thread_create(name, + &test_thr[i].tid, + tf, + (void *) &ta[i], + NULL); + ASSERT_CLNUP(tcs, r == 0, thr_key_clnup()); + test_thr[i].alive = 1; + } + } + + testcase_printf(tcs, "Testing tsd\n"); + + for (i = 0; i < NO_OF_KEYS; i++) + ASSERT_CLNUP(tcs, + ((void *) (((NO_OF_THREADS+1) << 16) | i) + == erl_drv_tsd_get(test_key[i].key)), + thr_key_clnup()); + + testcase_printf(tcs, "Joining threads\n"); + + if (sinfo.thread_support) { + /* Join the threads */ + for (i = 0; i < NO_OF_THREADS; i++) { + void *res; + r = erl_drv_thread_join(test_thr[i].tid, &res); + test_thr[i].alive = 0; + ASSERT_CLNUP(tcs, r == 0, thr_key_clnup()); + ASSERT_CLNUP(tcs, res == ((void *) 3), thr_key_clnup()); + } + } + + thr_key_clnup(); + + for (i = 0; i < NO_OF_KEYS; i++) + ASSERT(tcs, NULL == erl_drv_tsd_get(test_key[i].key)); + + testcase_printf(tcs, "Destroying keys\n"); + + for (i = 0; i < NO_OF_KEYS; i++) + if (test_key[i].used) { + test_key[i].used = 0; + erl_drv_tsd_key_destroy(test_key[i].key); + } + + testcase_printf(tcs, "done\n"); + + if (!sinfo.thread_support) + testcase_succeeded(tcs, "No thread support; only one thread tested"); +} + +char * +testcase_name(void) +{ + return "tsd"; +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + int i; + for (i = 0; i < NO_OF_THREADS; i++) + if (test_thr[i].alive) { + test_thr[i].alive = 0; + erl_drv_thread_join(test_thr[i].tid, NULL); + } + + for (i = 0; i < NO_OF_KEYS; i++) + if (test_key[i].used) { + test_key[i].used = 0; + erl_drv_tsd_key_destroy(test_key[i].key); + } +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/erl_drv_thread_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/erl_drv_thread_SUITE.erl 2009-11-20 13:32:37.000000000 +0000 @@ -0,0 +1,119 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(erl_drv_thread_SUITE). +-author('rickard.s.green@ericsson.com'). +-export([all/1]). + +-export([basic/1, rwlock/1, tsd/1]). + +-include("test_server.hrl"). + +-define(DEFAULT_TIMETRAP_SECS, 240). + +all(doc) -> []; +all(suite) -> + [basic, rwlock, tsd]. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% Testcases %% +%% %% + +basic(suite) -> []; +basic(doc) -> []; +basic(Cfg) -> ?line drv_case(Cfg, basic). + +rwlock(suite) -> []; +rwlock(doc) -> []; +rwlock(Cfg) -> ?line drv_case(Cfg, rwlock). + +tsd(suite) -> []; +tsd(doc) -> []; +tsd(Cfg) -> ?line drv_case(Cfg, tsd). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% Internal functions %% +%% %% + +drv_case(Config, CaseName) -> + drv_case(Config, CaseName, ""). + +drv_case(Config, CaseName, TimeTrap) when is_integer(TimeTrap) -> + drv_case(Config, CaseName, "", TimeTrap); +drv_case(Config, CaseName, Command) when is_list(Command) -> + drv_case(Config, CaseName, Command, ?DEFAULT_TIMETRAP_SECS). + +drv_case(Config, CaseName, TimeTrap, Command) when is_list(Command), + is_integer(TimeTrap) -> + drv_case(Config, CaseName, Command, TimeTrap); +drv_case(Config, CaseName, Command, TimeTrap) when is_list(Config), + is_atom(CaseName), + is_list(Command), + is_integer(TimeTrap) -> + case ?t:os_type() of + {Family, _} when Family == unix; Family == win32 -> + ?line run_drv_case(Config, CaseName, Command, TimeTrap); + SkipOs -> + ?line {skipped, + lists:flatten(["Not run on " + | io_lib:format("~p",[SkipOs])])} + end. + +run_drv_case(Config, CaseName, Command, TimeTrap) -> + ?line Dog = test_server:timetrap(test_server:seconds(TimeTrap)), + ?line DataDir = ?config(data_dir,Config), + case erl_ddll:load_driver(DataDir, CaseName) of + ok -> ok; + {error, Error} -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + ?line ?t:fail() + end, + ?line Port = open_port({spawn, atom_to_list(CaseName)}, []), + ?line true = is_port(Port), + ?line Port ! {self(), {command, Command}}, + ?line Result = receive_drv_result(Port, CaseName), + ?line Port ! {self(), close}, + ?line receive + {Port, closed} -> + ok + end, + ?line ok = erl_ddll:unload_driver(CaseName), + ?line test_server:timetrap_cancel(Dog), + ?line Result. + +receive_drv_result(Port, CaseName) -> + ?line receive + {print, Port, CaseName, Str} -> + ?line ?t:format("~s", [Str]), + ?line receive_drv_result(Port, CaseName); + {'EXIT', Port, Error} -> + ?line ?t:fail(Error); + {'EXIT', error, Error} -> + ?line ?t:fail(Error); + {failed, Port, CaseName, Comment} -> + ?line ?t:fail(Comment); + {skipped, Port, CaseName, Comment} -> + ?line {skipped, Comment}; + {succeeded, Port, CaseName, ""} -> + ?line succeeded; + {succeeded, Port, CaseName, Comment} -> + ?line {comment, Comment} + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/erl_link_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/erl_link_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/erl_link_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/erl_link_SUITE.erl 2009-06-05 13:53:25.000000000 +0100 @@ -0,0 +1,1133 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%---------------------------------------------------------------------- +%%% File : erl_link_SUITE.erl +%%% Author : Rickard Green +%%% Purpose : Test erlang links +%%% Created : 13 Dec 2001 by Rickard Green +%%%---------------------------------------------------------------------- + +-module(erl_link_SUITE). +-author('rickard.green@uab.ericsson.se'). + +%-define(line_trace, 1). +-include("test_server.hrl"). + +-export([all/1]). + +% Test cases +-export([links/1, + dist_links/1, + monitor_nodes/1, + process_monitors/1, + dist_process_monitors/1, + busy_dist_port_monitor/1, + busy_dist_port_link/1, + otp_5772_link/1, + otp_5772_dist_link/1, + otp_5772_monitor/1, + otp_5772_dist_monitor/1, + otp_7946/1]). + +-export([init_per_testcase/2, fin_per_testcase/2, end_per_suite/1]). + +% Internal exports +-export([test_proc/0]). + + +-define(LINK_UNDEF, 0). +-define(LINK_PID, 1). +-define(LINK_NODE, 3). + + +% These are to be kept in sync with erl_monitors.h +-define(MON_ORIGIN, 1). +-define(MON_TARGET, 3). + + +-record(erl_link, {type = ?LINK_UNDEF, + pid = [], + targets = []}). + +% This is to be kept in sync with erl_bif_info.c (make_monitor_list) + +-record(erl_monitor, { + type, % MON_ORIGIN or MON_TARGET (1 or 3) + ref, + pid, % Process or nodename + name = [] % registered name or [] + }). + + + +all(suite) -> [links, dist_links, monitor_nodes, process_monitors, + dist_process_monitors, busy_dist_port_monitor, + busy_dist_port_link, otp_5772_link, otp_5772_dist_link, + otp_5772_monitor, otp_5772_dist_monitor, + otp_7946]. + +links(doc) -> ["Tests node local links"]; +links(suite) -> []; +links(Config) when is_list(Config) -> + ?line common_link_test(node(), node()), + ?line true = link(self()), + ?line [] = find_erl_link(self(), ?LINK_PID, self()), + ?line true = unlink(self()), + ?line ok. + +dist_links(doc) -> ["Tests distributed links"]; +dist_links(suite) -> []; +dist_links(Config) when is_list(Config) -> + ?line [NodeName] = get_names(1, dist_link), + ?line {ok, Node} = start_node(NodeName), + ?line common_link_test(node(), Node), + ?line TP4 = spawn(?MODULE, test_proc, []), + ?line TP5 = spawn(?MODULE, test_proc, []), + ?line TP6 = spawn(Node, ?MODULE, test_proc, []), + ?line true = tp_call(TP6, fun() -> link(TP4) end), + ?line check_link(TP4, TP6), + ?line true = tp_call(TP5, + fun() -> + process_flag(trap_exit,true), + link(TP6) + end), + ?line check_link(TP5, TP6), + ?line rpc:cast(Node, erlang, halt, []), + ?line wait_until(fun () -> ?line is_proc_dead(TP4) end), + ?line check_unlink(TP4, TP6), + ?line true = tp_call(TP5, + fun() -> + receive + {'EXIT', TP6, noconnection} -> + true + end + end), + ?line check_unlink(TP5, TP6), + ?line tp_cast(TP5, fun() -> exit(normal) end), + ?line ok. + +common_link_test(NodeA, NodeB) -> + ?line TP1 = spawn(NodeA, ?MODULE, test_proc, []), + ?line check_unlink(TP1, self()), + ?line TP2 = tp_call(TP1, + fun () -> + spawn_link(NodeB, ?MODULE, test_proc, []) + end), + ?line check_link(TP1, TP2), + ?line true = tp_call(TP2, fun() -> unlink(TP1) end), + ?line check_unlink(TP1, TP2), + ?line true = tp_call(TP2, fun() -> link(TP1) end), + ?line check_link(TP1, TP2), + ?line false = tp_call(TP2, fun() -> process_flag(trap_exit, true) end), + ?line tp_cast(TP1, fun () -> exit(died) end), + ?line true = tp_call(TP2, fun() -> + receive + {'EXIT', TP1, died} -> + true + end + end), + ?line check_unlink(TP1, TP2), + ?line TP3 = tp_call(TP2, + fun () -> + spawn_link(NodeA, ?MODULE, test_proc, []) + end), + ?line check_link(TP3, TP2), + ?line tp_cast(TP2, fun() -> exit(died) end), + ?line wait_until(fun () -> ?line is_proc_dead(TP3) end), + ?line check_unlink(TP3, TP2), + ?line ok. + +monitor_nodes(doc) -> ["Tests monitor of nodes"]; +monitor_nodes(suite) -> []; +monitor_nodes(Config) when is_list(Config) -> + ?line [An, Bn, Cn, Dn] = get_names(4, dist_link), + ?line {ok, A} = start_node(An), + ?line {ok, B} = start_node(Bn), + ?line C = list_to_atom(lists:concat([Cn, "@", hostname()])), + ?line D = list_to_atom(lists:concat([Dn, "@", hostname()])), + ?line 0 = no_of_monitor_node(self(), A), + ?line 0 = no_of_monitor_node(self(), B), + ?line monitor_node(A, true), + ?line monitor_node(B, true), + ?line monitor_node(D, true), + ?line monitor_node(D, true), + + %% Has been known to crash the emulator. + ?line {memory,_} = process_info(self(), memory), + + ?line monitor_node(A, false), + ?line monitor_node(B, true), + ?line monitor_node(C, true), + ?line monitor_node(C, false), + ?line monitor_node(C, true), + ?line monitor_node(B, true), + ?line monitor_node(A, false), + ?line monitor_node(B, true), + ?line monitor_node(B, false), + ?line monitor_node(A, true), + ?line check_monitor_node(self(), A, 1), + ?line check_monitor_node(self(), B, 3), + ?line check_monitor_node(self(), C, 0), + ?line check_monitor_node(self(), D, 0), + ?line receive {nodedown, C} -> ok end, + ?line receive {nodedown, C} -> ok end, + ?line receive {nodedown, C} -> ok end, + ?line receive {nodedown, D} -> ok end, + ?line receive {nodedown, D} -> ok end, + ?line stop_node(A), + ?line receive {nodedown, A} -> ok end, + ?line check_monitor_node(self(), A, 0), + ?line check_monitor_node(self(), B, 3), + ?line stop_node(B), + ?line receive {nodedown, B} -> ok end, + ?line receive {nodedown, B} -> ok end, + ?line receive {nodedown, B} -> ok end, + ?line check_monitor_node(self(), B, 0), + ?line receive + {nodedown, X} -> + ?line ?t:fail({unexpected_nodedown, X}) + after 0 -> + ?line ok + end, + ?line ok. + + +process_monitors(doc) -> ["Tests node local process monitors"]; +process_monitors(suite) -> []; +process_monitors(Config) when is_list(Config) -> + ?line common_process_monitors(node(), node()), + ?line Mon1 = erlang:monitor(process,self()), + ?line [] = find_erl_monitor(self(), Mon1), + ?line [Name] = get_names(1, process_monitors), + ?line true = register(Name, self()), + ?line Mon2 = erlang:monitor(process, Name), + ?line [] = find_erl_monitor(self(), Mon2), + ?line receive + {'DOWN', Mon1, _, _, _} = Msg -> + ?line ?t:fail({unexpected_down_msg, Msg}); + {'DOWN', Mon2, _, _, _} = Msg -> + ?line ?t:fail({unexpected_down_msg, Msg}) + after 500 -> + ?line true = erlang:demonitor(Mon1), + ?line true = erlang:demonitor(Mon2), + ?line ok + end. + +dist_process_monitors(doc) -> ["Tests distributed process monitors"]; +dist_process_monitors(suite) -> []; +dist_process_monitors(Config) when is_list(Config) -> + ?line [Name] = get_names(1,dist_process_monitors), + ?line {ok, Node} = start_node(Name), + ?line common_process_monitors(node(), Node), + ?line TP1 = spawn(Node, ?MODULE, test_proc, []), + ?line R1 = erlang:monitor(process, TP1), + ?line TP1O = get_down_object(TP1, self()), + ?line check_process_monitor(self(), TP1, R1), + ?line tp_cast(TP1, fun () -> halt() end), + ?line receive + {'DOWN',R1,process,TP1O,noconnection} -> + ?line ok + end, + ?line check_process_demonitor(self(), TP1, R1), + ?line R2 = erlang:monitor(process, TP1), + ?line receive + {'DOWN',R2,process,TP1O,noconnection} -> + ?line ok + end, + ?line check_process_demonitor(self(), TP1, R2), + ?line ok. + + +common_process_monitors(NodeA, NodeB) -> + ?line TP1 = spawn(NodeA, ?MODULE, test_proc, []), + ?line TP2 = spawn(NodeB, ?MODULE, test_proc, []), + ?line run_common_process_monitors(TP1, TP2), + ?line TP3 = spawn(NodeA, ?MODULE, test_proc, []), + ?line TP4 = spawn(NodeB, ?MODULE, test_proc, []), + ?line [TP4N] = get_names(1, common_process_monitors), + ?line true = tp_call(TP4, fun () -> register(TP4N,self()) end), + ?line run_common_process_monitors(TP3, + case node() == node(TP4) of + true -> TP4N; + false -> {TP4N, node(TP4)} + end), + ?line ok. + +run_common_process_monitors(TP1, TP2) -> + ?line R1 = tp_call(TP1, fun () -> erlang:monitor(process, TP2) end), + ?line check_process_monitor(TP1, TP2, R1), + + ?line tp_call(TP2, fun () -> catch erlang:demonitor(R1) end), + ?line check_process_monitor(TP1, TP2, R1), + + ?line true = tp_call(TP1, fun () -> erlang:demonitor(R1) end), + ?line check_process_demonitor(TP1, TP2, R1), + + ?line R2 = tp_call(TP1, fun () -> erlang:monitor(process, TP2) end), + ?line TP2O = get_down_object(TP2, TP1), + ?line check_process_monitor(TP1, TP2, R2), + ?line tp_cast(TP2, fun () -> exit(bye) end), + ?line wait_until(fun () -> ?line is_proc_dead(TP2) end), + ?line ok = tp_call(TP1, fun () -> + ?line receive + {'DOWN',R2,process,TP2O,bye} -> + ?line ok + end + end), + ?line check_process_demonitor(TP1, TP2, R2), + + ?line R3 = tp_call(TP1, fun () -> erlang:monitor(process, TP2) end), + ?line ok = tp_call(TP1, fun () -> + ?line receive + {'DOWN',R3,process,TP2O,noproc} -> + ?line ok + end + end), + ?line check_process_demonitor(TP1, TP2, R3), + + ?line tp_cast(TP1, fun () -> exit(normal) end), + ?line wait_until(fun () -> ?line is_proc_dead(TP1) end), + ?line ok. + + +busy_dist_port_monitor(doc) -> ["Tests distributed monitor/2, demonitor/1, " + "and 'DOWN' message over busy distribution " + "port"]; +busy_dist_port_monitor(suite) -> []; +busy_dist_port_monitor(Config) when is_list(Config) -> + + ?line Tracer = case os:getenv("TRACE_BUSY_DIST_PORT") of + "true" -> start_busy_dist_port_tracer(); + _ -> false + end, + + ?line [An] = get_names(1, busy_dist_port_monitor), + ?line {ok, A} = start_node(An), + ?line TP1 = spawn(A, ?MODULE, test_proc, []), + %% Check monitor over busy port + ?line M1 = suspend_on_busy_test(A, + "erlang:monitor(process, TP1)", + fun () -> erlang:monitor(process, TP1) end), + ?line check_process_monitor(self(), TP1, M1), + %% Check demonitor over busy port + ?line suspend_on_busy_test(A, + "erlang:demonitor(M1)", + fun () -> erlang:demonitor(M1) end), + ?line check_process_demonitor(self(), TP1, M1), + %% Check down message over busy port + ?line TP2 = spawn(?MODULE, test_proc, []), + ?line M2 = tp_call(TP1, fun () -> erlang:monitor(process, TP2) end), + ?line check_process_monitor(TP1, TP2, M2), + ?line Ref = make_ref(), + ?line Busy = make_busy(A, 1000), + ?line receive after 100 -> ok end, + ?line tp_cast(TP2, fun () -> exit(Ref) end), + ?line receive after 100 -> ok end, + ?line unmake_busy(Busy), + ?line Ref = tp_call(TP1, fun () -> + receive + {'DOWN', M2, process, TP2, Ref} -> + Ref + end + end), + ?line tp_cast(TP1, fun () -> exit(normal) end), + ?line stop_node(A), + ?line stop_busy_dist_port_tracer(Tracer), + ?line ok. + +busy_dist_port_link(doc) -> ["Tests distributed link/1, unlink/1, and 'EXIT'", + " message over busy distribution port"]; +busy_dist_port_link(suite) -> []; +busy_dist_port_link(Config) when is_list(Config) -> + ?line Tracer = case os:getenv("TRACE_BUSY_DIST_PORT") of + "true" -> start_busy_dist_port_tracer(); + _ -> false + end, + + ?line [An] = get_names(1, busy_dist_port_link), + ?line {ok, A} = start_node(An), + ?line TP1 = spawn(A, ?MODULE, test_proc, []), + %% Check link over busy port + ?line suspend_on_busy_test(A, + "link(TP1)", + fun () -> link(TP1) end), + ?line check_link(self(), TP1), + %% Check unlink over busy port + ?line suspend_on_busy_test(A, + "unlink(TP1)", + fun () -> unlink(TP1) end), + ?line check_unlink(self(), TP1), + %% Check trap exit message over busy port + ?line TP2 = spawn(?MODULE, test_proc, []), + ?line ok = tp_call(TP1, fun () -> + process_flag(trap_exit, true), + link(TP2), + ok + end), + ?line check_link(TP1, TP2), + ?line Ref = make_ref(), + ?line Busy = make_busy(A, 1000), + ?line receive after 100 -> ok end, + ?line tp_cast(TP2, fun () -> exit(Ref) end), + ?line receive after 100 -> ok end, + ?line unmake_busy(Busy), + ?line Ref = tp_call(TP1, fun () -> + receive + {'EXIT', TP2, Ref} -> + Ref + end + end), + ?line tp_cast(TP1, fun () -> exit(normal) end), + ?line stop_node(A), + ?line stop_busy_dist_port_tracer(Tracer), + ?line ok. + + +otp_5772_link(doc) -> []; +otp_5772_link(suite) -> []; +otp_5772_link(Config) when is_list(Config) -> + ?line otp_5772_link_test(node()). + +otp_5772_dist_link(doc) -> []; +otp_5772_dist_link(suite) -> []; +otp_5772_dist_link(Config) when is_list(Config) -> + ?line [An] = get_names(1, otp_5772_dist_link), + ?line {ok, A} = start_node(An), + ?line otp_5772_link_test(A), + ?line stop_node(A). + +otp_5772_link_test(Node) -> + ?line Prio = process_flag(priority, high), + ?line TE = process_flag(trap_exit, true), + ?line TP1 = spawn_opt(Node, ?MODULE, test_proc, [], + [link, {priority, low}]), + exit(TP1, bang), + unlink(TP1), + ?line receive + {'EXIT', TP1, _} -> + ?line ok + after 0 -> + ?line ok + end, + ?line receive + {'EXIT', TP1, _} = Exit -> + ?line ?t:fail({got_late_exit_message, Exit}) + after 1000 -> + ?line ok + end, + ?line process_flag(trap_exit, TE), + ?line process_flag(priority, Prio), + ?line ok. + +otp_5772_monitor(doc) -> []; +otp_5772_monitor(suite) -> []; +otp_5772_monitor(Config) when is_list(Config) -> + ?line otp_5772_monitor_test(node()). + +otp_5772_dist_monitor(doc) -> []; +otp_5772_dist_monitor(suite) -> []; +otp_5772_dist_monitor(Config) when is_list(Config) -> + ?line [An] = get_names(1, otp_5772_dist_monitor), + ?line {ok, A} = start_node(An), + ?line otp_5772_monitor_test(A), + ?line stop_node(A), + ?line ok. + +otp_5772_monitor_test(Node) -> + ?line Prio = process_flag(priority, high), + ?line TP1 = spawn_opt(Node, ?MODULE, test_proc, [], [{priority, low}]), + ?line M1 = erlang:monitor(process, TP1), + ?line exit(TP1, bang), + ?line erlang:demonitor(M1), + ?line receive + {'DOWN', M1, _, _, _} -> + ?line ok + after 0 -> + ?line ok + end, + ?line receive + {'DOWN', M1, _, _, _} = Down -> + ?line ?t:fail({got_late_down_message, Down}) + after 1000 -> + ?line ok + end, + ?line process_flag(priority, Prio), + ?line ok. + +otp_7946(Config) when is_list(Config) -> + ?line [NodeName] = get_names(1, otp_7946), + ?line {ok, Node} = start_node(NodeName), + ?line Proc = rpc:call(Node, erlang, whereis, [net_kernel]), + ?line Mon = erlang:monitor(process, Proc), + ?line rpc:cast(Node, erlang, halt, []), + ?line receive {'DOWN', Mon, process, Proc , _} -> ok end, + ?line {Linker, LMon} = spawn_monitor(fun () -> + link(Proc), + receive + after infinity -> ok + end + end), + ?line receive + {'DOWN', LMon, process, Linker, Reason} -> + ?line ?t:format("Reason=~p~n", [Reason]), + ?line Reason = noconnection + end. + +%% +%% -- Internal utils -------------------------------------------------------- +%% + +-define(BUSY_DATA_KEY, '__busy__port__data__'). +-define(BUSY_DATA_SIZE, 1024*1024). + +busy_data() -> + case get(?BUSY_DATA_KEY) of + undefined -> + set_busy_data([]); + Data -> + true = is_binary(Data), + true = size(Data) == ?BUSY_DATA_SIZE, + Data + end. + +set_busy_data(SetData) -> + case get(?BUSY_DATA_KEY) of + undefined -> + Data = case SetData of + D when is_binary(D), size(D) == ?BUSY_DATA_SIZE -> + SetData; + _ -> + list_to_binary(lists:duplicate(?BUSY_DATA_SIZE, 253)) + end, + put(?BUSY_DATA_KEY, Data), + Data; + OldData -> + OldData + end. + +freeze_node(Node, MS) -> + Own = 500, + DoingIt = make_ref(), + Freezer = self(), + spawn_link(Node, + fun () -> + erts_debug:set_internal_state(available_internal_state, + true), + dport_send(Freezer, DoingIt), + receive after Own -> ok end, + erts_debug:set_internal_state(block, MS+Own) + end), + receive DoingIt -> ok end, + receive after Own -> ok end. + +make_busy(Node, Time) when is_integer(Time) -> + Own = 500, + freeze_node(Node, Time+Own), + Data = busy_data(), + %% first make port busy + Pid = spawn_link(fun () -> + forever(fun () -> + dport_reg_send(Node, + '__noone__', + Data) + end) + end), + receive after Own -> ok end, + wait_until(fun () -> + case process_info(Pid, status) of + {status, suspended} -> true; + _ -> false + end + end), + %% then dist entry + make_busy(Node, [nosuspend], Data), + Pid. + +make_busy(Node, Opts, Data) -> + case erlang:send({'__noone__', Node}, Data, Opts) of + nosuspend -> nosuspend; + _ -> make_busy(Node, Opts, Data) + end. + +unmake_busy(Pid) -> + unlink(Pid), + exit(Pid, bang). + +suspend_on_busy_test(Node, Doing, Fun) -> + Tester = self(), + DoIt = make_ref(), + Done = make_ref(), + Data = busy_data(), + spawn_link(fun () -> + set_busy_data(Data), + Busy = make_busy(Node, 1000), + Tester ! DoIt, + receive after 100 -> ok end, + Info = process_info(Tester, [status, current_function]), + unmake_busy(Busy), + ?t:format("~p doing ~s: ~p~n", [Tester, Doing, Info]), + Tester ! {Done, Info} + end), + receive DoIt -> ok end, + Res = Fun(), + receive + {Done, MyInfo} -> + %% Don't match arity; it is different in + %% debug and optimized emulator + [{status, suspended}, + {current_function, {erlang, bif_return_trap, _}}] = MyInfo, + ok + end, + Res. + +% get_node(Name) when is_atom(Name) -> +% ?line node(); +% get_node({Name, Node}) when is_atom(Name) -> +% ?line Node; +% get_node(NC) when is_pid(NC); is_port(NC); is_reference(NC) -> +% ?line node(NC). + +get_down_object(Item, _) when is_pid(Item) -> + Item; +get_down_object({Name, Node} = Item, _) when is_atom(Name); is_atom(Node) -> + Item; +get_down_object(Item, Watcher) when is_atom(Item), is_pid(Watcher) -> + {Item, node(Watcher)}; +get_down_object(Item, {_,Node}) when is_atom(Item), is_atom(Node) -> + {Item, Node}; +get_down_object(Item, Watcher) when is_atom(Item), is_atom(Watcher) -> + {Item, node()}. + +is_proc_dead(P) -> + case is_proc_alive(P) of + true -> false; + false -> true + end. + +is_proc_alive(Pid) when is_pid(Pid), node(Pid) == node() -> + ?line is_process_alive(Pid); +is_proc_alive(Name) when is_atom(Name) -> + ?line case catch whereis(Name) of + Pid when is_pid(Pid) -> + ?line is_proc_alive(Pid); + _ -> + ?line false + end; +is_proc_alive({Name, Node}) when is_atom(Name), Node == node() -> + ?line is_proc_alive(Name); +is_proc_alive(Proc) -> + ?line is_remote_proc_alive(Proc). + +is_remote_proc_alive({Name, Node}) when is_atom(Name), is_atom(Node) -> + ?line is_remote_proc_alive(Name, Node); +is_remote_proc_alive(Pid) when is_pid(Pid) -> + ?line is_remote_proc_alive(Pid, node(Pid)); +is_remote_proc_alive(_) -> + ?line false. + +is_remote_proc_alive(PN, Node) -> + ?line S = self(), + ?line R = make_ref(), + ?line monitor_node(Node, true), + ?line _P = spawn(Node, fun () -> S ! {R, is_proc_alive(PN)} end), + ?line receive + {R, Bool} -> + ?line monitor_node(Node, false), + ?line Bool; + {nodedown, Node} -> + ?line false + end. + +wait_until(Fun) -> + ?line case Fun() of + true -> + ?line ok; + _ -> + ?line receive + after 100 -> + ?line wait_until(Fun) + end + end. + +forever(Fun) -> + Fun(), + forever(Fun). + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + ?line Dog = ?t:timetrap(?t:minutes(1)), + case catch erts_debug:get_internal_state(available_internal_state) of + true -> ok; + _ -> erts_debug:set_internal_state(available_internal_state, true) + end, + ?line [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + ?line Dog = ?config(watchdog, Config), + ?line ?t:timetrap_cancel(Dog). + +end_per_suite(_Config) -> + catch erts_debug:set_internal_state(available_internal_state, false). + +tp_call(Tp, Fun) -> + ?line R = make_ref(), + ?line Tp ! {call, self(), R, Fun}, + ?line receive + {R, Res} -> + ?line Res + end. + +tp_cast(Tp, Fun) -> + ?line Tp ! {cast, Fun}. + +test_proc() -> + ?line receive + {call, From, Ref, Fun} -> + ?line From ! {Ref, Fun()}; + {cast, Fun} -> + ?line Fun() + end, + ?line test_proc(). + +expand_link_list([#erl_link{type = ?LINK_NODE, targets = N} = Rec | T]) -> + lists:duplicate(N,Rec#erl_link{targets = []}) ++ expand_link_list(T); +expand_link_list([#erl_link{targets = [#erl_link{pid = Pid}]} = Rec | T]) -> + [Rec#erl_link{targets = [Pid]} | expand_link_list(T)]; +expand_link_list([#erl_link{targets = [#erl_link{pid = Pid}|TT]} = Rec | T]) -> + [ Rec#erl_link{targets = [Pid]} | expand_link_list( + [Rec#erl_link{targets = TT} | T])]; +expand_link_list([#erl_link{targets = []} = Rec | T]) -> + [Rec | expand_link_list(T)]; +expand_link_list([]) -> + []. + +get_local_link_list(Obj) -> + case catch erts_debug:get_internal_state({link_list, Obj}) of + LL when is_list(LL) -> + expand_link_list(LL); + _ -> + [] + end. + +get_remote_link_list(Node, Obj) -> + case catch rpc:call(Node, erts_debug, get_internal_state, + [{link_list, Obj}]) of + LL when is_list(LL) -> + expand_link_list(LL); + _ -> + [] + end. + + +get_link_list({Node, DistEntry}) when Node == node(), is_atom(DistEntry) -> + get_local_link_list(DistEntry); +get_link_list({Node, DistEntry}) when is_atom(Node), is_atom(DistEntry) -> + get_remote_link_list(Node, DistEntry); +get_link_list(P) when is_pid(P); is_port(P) -> + case node(P) of + Node when Node == node() -> + get_local_link_list(P); + Node -> + get_remote_link_list(Node, P) + end; +get_link_list(undefined) -> + []. + +get_local_monitor_list(Obj) -> + case catch erts_debug:get_internal_state({monitor_list, Obj}) of + LL when is_list(LL) -> + LL; + _ -> + [] + end. + +get_remote_monitor_list(Node, Obj) -> + case catch rpc:call(Node, erts_debug, get_internal_state, + [{monitor_list, Obj}]) of + LL when is_list(LL) -> + LL; + _ -> + [] + end. + + +get_monitor_list({Node, DistEntry}) when Node == node(), is_atom(DistEntry) -> + get_local_monitor_list(DistEntry); +get_monitor_list({Node, DistEntry}) when is_atom(Node), is_atom(DistEntry) -> + get_remote_monitor_list(Node, DistEntry); +get_monitor_list(P) when is_pid(P) -> + case node(P) of + Node when Node == node() -> + get_local_monitor_list(P); + Node -> + get_remote_monitor_list(Node, P) + end; +get_monitor_list(undefined) -> + []. + + +find_erl_monitor(Pid, Ref) when is_reference(Ref) -> + lists:foldl(fun (#erl_monitor{ref = R} = EL, Acc) when R == Ref -> + [EL|Acc]; + (_, Acc) -> + Acc + end, + [], + get_monitor_list(Pid)). + +% find_erl_link(Obj, Ref) when is_reference(Ref) -> +% ?line lists:foldl(fun (#erl_link{ref = R} = EL, Acc) when R == Ref -> +% ?line [EL|Acc]; +% (_, Acc) -> +% ?line Acc +% end, +% [], +% get_link_list(Obj)). + +find_erl_link(Obj, Type, [Item, Data]) when is_pid(Item); + is_port(Item); + is_atom(Item) -> + lists:foldl(fun (#erl_link{type = T, pid = I, targets = D} = EL, + Acc) when T == Type, I == Item -> + case Data of + D -> + [EL|Acc]; + [] -> + [EL|Acc]; + _ -> + Acc + end; + (_, Acc) -> + Acc + end, + [], + get_link_list(Obj)); +find_erl_link(Obj, Type, Item) when is_pid(Item); is_port(Item); is_atom(Item) -> + find_erl_link(Obj, Type, [Item, []]). + + + +check_link(A, B) -> + ?line [#erl_link{type = ?LINK_PID, + pid = B, + targets = []}] = find_erl_link(A, ?LINK_PID, B), + ?line [#erl_link{type = ?LINK_PID, + pid = A, + targets = []}] = find_erl_link(B, ?LINK_PID, A), + ?line case node(A) == node(B) of + false -> + ?line [#erl_link{type = ?LINK_PID, + pid = A, + targets = [B]}] = find_erl_link({node(A), + node(B)}, + ?LINK_PID, + [A, [B]]), + ?line [#erl_link{type = ?LINK_PID, + pid = B, + targets = [A]}] = find_erl_link({node(B), + node(A)}, + ?LINK_PID, + [B, [A]]); + true -> + ?line [] = find_erl_link({node(A), node(B)}, + ?LINK_PID, + [A, [B]]), + ?line [] = find_erl_link({node(B), node(A)}, + ?LINK_PID, + [B, [A]]) + end, + ?line ok. + +check_unlink(A, B) -> + ?line [] = find_erl_link(A, ?LINK_PID, B), + ?line [] = find_erl_link(B, ?LINK_PID, A), + ?line [] = find_erl_link({node(A), node(B)}, ?LINK_PID, [A, [B]]), + ?line [] = find_erl_link({node(B), node(A)}, ?LINK_PID, [B, [A]]), + ?line ok. + +check_process_monitor(From, {Name, Node}, Ref) when is_pid(From), + is_atom(Name), + Node == node(From), + is_reference(Ref) -> + ?line check_process_monitor(From, Name, Ref); +check_process_monitor(From, {Name, Node}, Ref) when is_pid(From), + is_atom(Name), + is_atom(Node), + is_reference(Ref) -> + ?line MonitoredPid = rpc:call(Node, erlang, whereis, [Name]), + ?line [#erl_monitor{type = ?MON_ORIGIN, + ref = Ref, + pid = Node, + name = Name}] = find_erl_monitor(From, Ref), + ?line [#erl_monitor{type = ?MON_TARGET, + ref = Ref, + pid = From, + name = Name}] = find_erl_monitor({node(From), Node}, Ref), + ?line [#erl_monitor{type = ?MON_ORIGIN, + ref = Ref, + pid = MonitoredPid, + name = Name}] = find_erl_monitor({Node, node(From)}, Ref), + ?line [#erl_monitor{type = ?MON_TARGET, + ref = Ref, + pid = From, + name = Name}] = find_erl_monitor(MonitoredPid, Ref), + ?line ok; +check_process_monitor(From, Name, Ref) when is_pid(From), + is_atom(Name), + undefined /= Name, + is_reference(Ref) -> + ?line MonitoredPid = rpc:call(node(From), erlang, whereis, [Name]), + + ?line [#erl_monitor{type = ?MON_ORIGIN, + ref = Ref, + pid = MonitoredPid, + name = Name}] = find_erl_monitor(From, Ref), + + + ?line [#erl_monitor{type = ?MON_TARGET, + ref = Ref, + pid = From, + name = Name}] = find_erl_monitor(MonitoredPid,Ref), + ok; +check_process_monitor(From, To, Ref) when is_pid(From), + is_pid(To), + is_reference(Ref) -> + ?line OriMon = [#erl_monitor{type = ?MON_ORIGIN, + ref = Ref, + pid = To}], + + ?line OriMon = find_erl_monitor(From, Ref), + + ?line TargMon = [#erl_monitor{type = ?MON_TARGET, + ref = Ref, + pid = From}], + ?line TargMon = find_erl_monitor(To, Ref), + + + ?line case node(From) == node(To) of + false -> + ?line TargMon = find_erl_monitor({node(From), node(To)}, Ref), + ?line OriMon = find_erl_monitor({node(To), node(From)}, Ref); + true -> + ?line [] = find_erl_monitor({node(From), node(From)}, Ref) + end, + ?line ok. + + +check_process_demonitor(From, {undefined, Node}, Ref) when is_pid(From), + is_reference(Ref) -> + ?line [] = find_erl_monitor(From, Ref), + ?line case node(From) == Node of + false -> + ?line [] = find_erl_monitor({node(From), Node}, Ref), + ?line [] = find_erl_monitor({Node, node(From)}, Ref); + true -> + ?line [] = find_erl_monitor({Node, Node}, Ref) + end, + ?line ok; +check_process_demonitor(From, {Name, Node}, Ref) when is_pid(From), + is_atom(Name), + Node == node(From), + is_reference(Ref) -> + ?line MonitoredPid = rpc:call(Node, erlang, whereis, [Name]), + ?line case rpc:call(Node, erlang, whereis, [Name]) of + undefined -> + ?line check_process_demonitor(From, {undefined, Node}, Ref); + MonitoredPid -> + ?line check_process_demonitor(From, MonitoredPid, Ref) + end; +check_process_demonitor(From, {Name, Node}, Ref) when is_pid(From), + is_atom(Name), + is_atom(Node), + is_reference(Ref) -> + ?line MonitoredPid = rpc:call(Node, erlang, whereis, [Name]), + ?line [] = find_erl_monitor(From, Ref), + ?line [] = find_erl_monitor({node(From), Node}, Ref), + ?line [] = find_erl_monitor({Node, node(From)}, Ref), + ?line [] = find_erl_monitor(MonitoredPid, Ref), + ?line ok; +check_process_demonitor(From, undefined, Ref) when is_pid(From), + is_reference(Ref) -> + ?line [] = find_erl_monitor(From, Ref), + ?line case node(From) == node() of + false -> + ?line [] = find_erl_monitor({node(From), node()}, Ref), + ?line [] = find_erl_monitor({node(), node(From)}, Ref); + true -> + ?line [] = find_erl_monitor({node(), node()}, Ref) + end, + ?line ok; +check_process_demonitor(From, Name, Ref) when is_pid(From), + is_atom(Name), + undefined /= Name, + is_reference(Ref) -> + ?line check_process_demonitor(From, {Name, node()}, Ref); +check_process_demonitor(From, To, Ref) when is_pid(From), + is_pid(To), + is_reference(Ref) -> + ?line [] = find_erl_monitor(From, Ref), + ?line [] = find_erl_monitor(To, Ref), + ?line case node(From) == node(To) of + false -> + ?line [] = find_erl_monitor({node(From), node(To)}, Ref), + ?line [] = find_erl_monitor({node(To), node(From)}, Ref); + true -> + ?line [] = find_erl_monitor({node(From), node(From)}, Ref) + end, + ?line ok. + +no_of_monitor_node(From, Node) when is_pid(From), is_atom(Node) -> + ?line length(find_erl_link(From, ?LINK_NODE, Node)). + +check_monitor_node(From, Node, No) when is_pid(From), + is_atom(Node), + is_integer(No), + No >= 0 -> + ?line LL = lists:duplicate(No, #erl_link{type = ?LINK_NODE, pid = Node}), + ?line DLL = lists:duplicate(No, #erl_link{type = ?LINK_NODE, pid = From}), + ?line LL = find_erl_link(From, ?LINK_NODE, Node), + ?line DLL = find_erl_link({node(From), Node}, ?LINK_NODE, From), + ?line ok. + + + +hostname() -> + ?line from($@, atom_to_list(node())). + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(_H, []) -> []. + +get_names(N, T) when is_atom(T) -> + get_names(N, T, []). +get_names(0, _, Acc) -> + Acc; +get_names(N, T, Acc) -> + {A, B, C} = now(), + get_names(N-1, T, [list_to_atom(atom_to_list(?MODULE) + ++ "-" + ++ atom_to_list(T) + ++ "-" + ++ integer_to_list(A) + ++ "-" + ++ integer_to_list(B) + ++ "-" + ++ integer_to_list(C)) | Acc]). + +start_node(Name) -> + ?line start_node(Name, ""). + +start_node(Name, Args) -> + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line Res = ?t:start_node(Name, slave, [{args, Args ++ " -pa " ++ Pa}]), + ?line {ok, Node} = Res, + ?line rpc:call(Node, erts_debug, set_internal_state, + [available_internal_state, true]), + ?line Res. + + +stop_node(Node) -> + ?line ?t:stop_node(Node). + +-define(COOKIE, ''). +-define(DOP_LINK, 1). +-define(DOP_SEND, 2). +-define(DOP_EXIT, 3). +-define(DOP_UNLINK, 4). +-define(DOP_NODE_LINK, 5). +-define(DOP_REG_SEND, 6). +-define(DOP_GROUP_LEADER, 7). +-define(DOP_EXIT2, 8). + +-define(DOP_SEND_TT, 12). +-define(DOP_EXIT_TT, 13). +-define(DOP_REG_SEND_TT, 16). +-define(DOP_EXIT2_TT, 18). + +-define(DOP_MONITOR_P, 19). +-define(DOP_DEMONITOR_P, 20). +-define(DOP_MONITOR_P_EXIT, 21). + +dport_send(To, Msg) -> + Node = node(To), + DPrt = case dport(Node) of + undefined -> + pong = net_adm:ping(Node), + dport(Node); + Prt -> + Prt + end, + port_command(DPrt, [dmsg_hdr(), + dmsg_ext({?DOP_SEND, + ?COOKIE, + To}), + dmsg_ext(Msg)]). + +dport_reg_send(Node, Name, Msg) -> + DPrt = case dport(Node) of + undefined -> + pong = net_adm:ping(Node), + dport(Node); + Prt -> + Prt + end, + port_command(DPrt, [dmsg_hdr(), + dmsg_ext({?DOP_REG_SEND, + self(), + ?COOKIE, + Name}), + dmsg_ext(Msg)]). + +dport(Node) when is_atom(Node) -> + case catch erts_debug:get_internal_state(available_internal_state) of + true -> true; + _ -> erts_debug:set_internal_state(available_internal_state, true) + end, + erts_debug:get_internal_state({dist_port, Node}). + +dmsg_hdr() -> + [131, % Version Magic + $D, % Dist header + 0]. % No atom cache referenses + +dmsg_ext(Term) -> + <<131, Res/binary>> = term_to_binary(Term), + Res. + +start_busy_dist_port_tracer() -> + Tracer = spawn_link(fun () -> busy_dist_port_tracer() end), + erlang:system_monitor(Tracer, [busy_dist_port]), + Tracer. + +stop_busy_dist_port_tracer(Tracer) when is_pid(Tracer) -> + unlink(Tracer), + exit(Tracer, bye); +stop_busy_dist_port_tracer(_) -> + true. + +busy_dist_port_tracer() -> + receive + {monitor, _SuspendedProcess, busy_dist_port, _Port} = M -> + erlang:display(M), + busy_dist_port_tracer() + end. + + + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/erts_debug_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/erts_debug_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/erts_debug_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/erts_debug_SUITE.erl 2009-09-18 15:09:01.000000000 +0100 @@ -0,0 +1,72 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(erts_debug_SUITE). +-include("test_server.hrl"). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + flat_size/1,flat_size_big/1,df/1]). + +all(suite) -> + [flat_size,flat_size_big,df]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(2)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +flat_size(Config) when is_list(Config) -> + 0 = erts_debug:flat_size([]), + 0 = erts_debug:flat_size(42), + 2 = erts_debug:flat_size([a|b]), + 1 = erts_debug:flat_size({}), + 2 = erts_debug:flat_size({[]}), + 3 = erts_debug:flat_size({a,b}), + 7 = erts_debug:flat_size({a,[b,c]}), + ok. + +flat_size_big(Config) when is_list(Config) -> + %% Build a term whose external size only fits in a big num (on 32-bit CPU). + flat_size_big_1(16#11111111111111117777777777777777888889999, 0, 16#FFFFFFF). + +flat_size_big_1(Term, Size0, Limit) when Size0 < Limit -> + case erts_debug:flat_size(Term) of + Size when is_integer(Size), Size0 < Size -> + io:format("~p", [Size]), + flat_size_big_1([Term|Term], Size, Limit) + end; +flat_size_big_1(_, _, _) -> ok. + +df(Config) when is_list(Config) -> + ?line P0 = pps(), + ?line PrivDir = ?config(priv_dir, Config), + ?line ok = file:set_cwd(PrivDir), + ?line erts_debug:df(?MODULE), + ?line Beam = filename:join(PrivDir, ?MODULE_STRING++".dis"), + ?line {ok,Bin} = file:read_file(Beam), + ?line ok = io:put_chars(binary_to_list(Bin)), + ?line ok = file:delete(Beam), + ?line true = (P0 == pps()), + ok. + +pps() -> + {erlang:ports()}. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/estone_SUITE_data/estone_cat.c erlang-13.b.3-dfsg/erts/emulator/test/estone_SUITE_data/estone_cat.c --- erlang-13.b.1-dfsg/erts/emulator/test/estone_SUITE_data/estone_cat.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/estone_SUITE_data/estone_cat.c 2003-07-07 13:18:32.000000000 +0100 @@ -0,0 +1,40 @@ +/* + * Author: Bjorn Gustavsson + * Purpose: Simple portable cat utility for the estone benchmark. + * + * Compiling instructions: + * + * Unix: gcc -O2 -o estone_cat estone_cat.c + * Windows: cl -Ox estone_cat.c + */ + +#include +#include +#include + +#ifdef VXWORKS +estone_cat(argc, argv) +#else +main(argc, argv) +#endif +int argc; +char *argv[]; +{ + char buf[16384]; + int n; + +#ifdef _O_BINARY + _setmode(0, _O_BINARY); + _setmode(1, _O_BINARY); +#endif + + for (;;) { + n = read(0, buf, sizeof(buf)); + if (n <= 0 && errno == EINTR) + continue; + if (n <= 0) + break; + write(1, buf, n); + } + return 0; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/estone_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/estone_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/estone_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/estone_SUITE_data/Makefile.src 2003-07-07 13:18:31.000000000 +0100 @@ -0,0 +1,15 @@ +CC = @CC@ +LD = @LD@ +CFLAGS = @CFLAGS@ @DEFS@ +CROSSLDFLAGS = @CROSSLDFLAGS@ + +PROG = estone_cat +PROGS = $(PROG)@exe@ + +all: $(PROGS) + +$(PROG)@exe@: $(PROG)@obj@ + $(LD) $(CROSSLDFLAGS) -o $(PROG) $(PROG)@obj@ @LIBS@ + +$(PROG)@obj@: $(PROG).c + $(CC) -c -o $(PROG)@obj@ $(CFLAGS) $(PROG).c diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/estone_SUITE_data/sunspeed.sh erlang-13.b.3-dfsg/erts/emulator/test/estone_SUITE_data/sunspeed.sh --- erlang-13.b.1-dfsg/erts/emulator/test/estone_SUITE_data/sunspeed.sh 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/estone_SUITE_data/sunspeed.sh 2003-07-07 13:18:33.000000000 +0100 @@ -0,0 +1,10 @@ +#!/bin/sh +# +# sunspeed +# +# Returns CPU speed in Mhz on sun/solaris 5.x & 6.x +# + +echo `/usr/sbin/psrinfo -v | sed 's/.* \([0-9]*\)\ MHz.*/\1/;s/.*[^0-9].*//g'` | sed 's/ /+/g' + +# \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/estone_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/estone_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/estone_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/estone_SUITE.erl 2009-09-18 15:08:34.000000000 +0100 @@ -0,0 +1,1107 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(estone_SUITE). +%% Test functions +-export([all/1,estone/1]). +-export([init_per_testcase/2, fin_per_testcase/2]). + +%% Internal exports for EStone tests +-export([lists/1, + msgp/1, + msgp_medium/1, + msgp_huge/1, + pattern/1, + trav/1, + port_io/1, + large_dataset_work/1, + large_local_dataset_work/1,mk_big_procs/1,big_proc/0, + alloc/1, + bif_dispatch/1, + binary_h/1,echo/1, + ets/1, + generic/1,req/2,gserv/4,handle_call/3, + int_arith/1, + float_arith/1, + fcalls/1,remote0/1,remote1/1,app0/1,app1/1, + timer/1, + links/1,lproc/1, + run_micro/3,p1/1,ppp/3,macro/2,micros/0]). + + +-include("test_server.hrl"). + +%% Test suite defines +-define(default_timeout, ?t:minutes(10)). + +%% EStone defines +-define(TOTAL, (3000 * 1000 * 100)). %% 300 secs +-define(BIGPROCS, 2). +-define(BIGPROC_SIZE, 50). +-define(STONEFACTOR, 31000000). %% Factor to make the reference + %% implementation to make 1000 TS_ESTONES. +-record(micro, + {function, %% The name of the function implementing the micro + weight, %% How important is this in typical applications ?? + loops = 100,%% initial data + tt1, %% time to do one round + str}). %% Header string + + + + +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +all(suite) -> [estone]. + +estone(suite) -> + []; +estone(doc) -> + ["EStone Test"]; +estone(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir,Config), + ?line Mhz=get_cpu_speed(os:type(),DataDir), + ?line L = ?MODULE:macro(?MODULE:micros(),DataDir), + ?line {Total, Stones} = sum_micros(L, 0, 0), + ?line pp(Mhz,Total,Stones,L), + ?line {comment,Mhz ++ " MHz, " ++ + integer_to_list(Stones) ++ " ESTONES"}. + +%% +%% Calculate CPU speed +%% +%% get_cpu_speed() now returns a string. For multiprocessor +%% machines (at least on Solaris) the format is: +[+...] +%% +get_cpu_speed({win32, _},_DataDir) -> + RegH = + case catch win32reg:open([read]) of + {ok, Handle} -> + Handle; + _ -> + io:format("Error.~nCannot determine CPU clock" + "frequency.~n" + "Please set the environment variable" + "\"CPU_SPEED\"~n"), + exit(self(), {error, no_cpu_speed}) + end, + case win32reg:change_key(RegH,"\\hkey_local_machine\\hardware\\" + "description\\system\\centralprocessor" + "\\0") of + ok -> + ok; + _ -> + io:format("Error.~nRegistry seems to be damaged or" + "unavailable.~n" + "Please set the environment variable" + "\"CPU_SPEED\",~nor correct your registry" + "if possible.~n"), + win32reg:close(RegH), + exit(self(), {error, no_cpu_speed}) + end, + case win32reg:value(RegH, "~MHZ") of + {ok, Speed} -> + win32reg:close(RegH), + integer_to_list(Speed); + _ -> + io:format("Error.~nRegistry seems to be damaged or " + "unavailable.~n"), + io:format("Please set the environment variable" + "\"CPU_SPEED\"~n"), + win32reg:close(RegH), + exit(self(), {error, no_cpu_speed}) + end; +get_cpu_speed({unix, sunos},DataDir) -> + os:cmd(filename:join(DataDir,"sunspeed.sh")) -- "\n"; +get_cpu_speed(_Other,_DataDir) -> + %% Cannot determine CPU speed + "UNKNOWN". + + +%% +%% Pretty Print EStone Result +%% +pp(Mhz,Total,Stones,Ms) -> + io:format("EStone test completed~n",[]), + io:format("**** CPU speed ~s MHz ****~n",[Mhz]), + io:format("**** Total time ~w seconds ****~n", [Total / 1000000]), + io:format("**** ESTONES = ~w ****~n~n", [Stones]), + io:format("~-31s ~-12s ~-10s % ~-10s ~n~n", + [" Title", "Millis", "Estone", "Loops"]), + erlang:display({'ESTONES', Stones}), + pp2(Ms). + +sum_micros([], Tot, Stones) -> {Tot, Stones}; +sum_micros([H|T], Tot, Sto) -> + sum_micros(T, ks(microsecs, H) + Tot, ks(estones, H) + Sto). + +pp2([]) -> ok; +pp2([R|Tail]) -> + io:format("~-35s ~-12w ~-10w ~-2w ~-10w ~n", + [ks(title,R), + round(ks(microsecs, R) / 1000), + ks(estones, R), + ks(weight_percentage, R), + ks(loops, R)]), + pp2(Tail). + +ks(K, L) -> + {value, {_, V}} = lists:keysearch(K, 1, L), + V. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% EStone test +micro(lists) -> + #micro{function = lists, + weight = 7, + loops = 6400, + str = "list manipulation"}; +micro(msgp) -> + #micro{function = msgp, + weight = 10, + loops = 1515, + str = "small messages"}; +micro(msgp_medium) -> + #micro{function = msgp_medium, + weight = 14, + loops = 1527, + str = "medium messages"}; +micro(msgp_huge) -> + #micro{function = msgp_huge, + weight = 4, + loops = 52, + str = "huge messages"}; + +micro(pattern) -> + #micro{function = pattern, + weight = 5, + loops = 1046, + str = "pattern matching"}; + +micro(trav) -> + #micro{function = trav, + weight = 4, + loops = 2834, + str = "traverse"}; + +micro(port_io) -> + #micro{function = port_io, + weight = 12, + loops = 4800, + str = "Port i/o"}; + +micro(large_dataset_work) -> + #micro{function = large_dataset_work, + weight = 3, + loops = 1193, + str = "Work with large dataset"}; + +micro(large_local_dataset_work) -> + #micro{function = large_local_dataset_work, + weight = 3, + loops = 1174, + str = "Work with large local dataset"}; + +micro(alloc) -> + #micro{function = alloc, + weight = 2, + loops = 3710, + str = "Alloc and dealloc"}; + +micro(bif_dispatch) -> + #micro{function = bif_dispatch, + weight = 5, + loops = 1623, + str = "Bif dispatch"}; + +micro(binary_h) -> + #micro{function = binary_h, + weight = 4, + loops = 581, + str = "Binary handling"}; +micro(ets) -> + #micro{function = ets, + weight = 6, + loops = 342, + str = "ets datadictionary"}; +micro(generic) -> + #micro{function = generic, + weight = 9, + loops = 7977, + str = "Generic server (with timeout)"}; +micro(int_arith) -> + #micro{function = int_arith, + weight = 3, + loops = 4157, + str = "Small Integer arithmetics"}; +micro(float_arith) -> + #micro{function = float_arith, + weight = 1, + loops = 5526, + str = "Float arithmetics"}; +micro(fcalls) -> + #micro{function = fcalls, + weight = 5, + loops = 882, + str = "Function calls"}; + +micro(timer) -> + #micro{function = timer, + weight = 2, + loops = 2312, + str = "Timers"}; + +micro(links) -> + #micro{function = links, + weight = 1, + loops = 30, + str = "Links"}. + + + +%% Return a list of micro's +micros() -> + [ + micro(lists), + micro(msgp), + micro(msgp_medium), + micro(msgp_huge), + micro(pattern), + micro(trav), + micro(port_io), + micro(large_dataset_work), + micro(large_local_dataset_work), + micro(alloc), + micro(bif_dispatch), + micro(binary_h), + micro(ets), + micro(generic), + micro(int_arith), + micro(float_arith), + micro(fcalls), + micro(timer), + micro(links) + ]. + +macro(Ms,DataDir) -> + erlang:now(), %% compensate for old 4.3 firsttime clock bug :-( + statistics(reductions), + statistics(runtime), + lists(500), %% fixup cache on first round + run_micros(Ms,DataDir). + +run_micros([],_) -> + io:nl(), + []; +run_micros([H|T],DataDir) -> + R = run_micro(H,DataDir), + [R| run_micros(T,DataDir)]. + +run_micro(M,DataDir) -> + Pid = spawn(?MODULE, run_micro, [self(),M,DataDir]), + Res = receive {Pid, Reply} -> Reply end, + {value,{title,Title}} = lists:keysearch(title,1,Reply), + {value,{estones,Estones}} = lists:keysearch(estones,1,Reply), + erlang:display({Title,Estones}), + Res. + + +run_micro(Top, M, DataDir) -> + EstoneCat = filename:join(DataDir,"estone_cat"), + put(estone_cat,EstoneCat), + Top ! {self(), apply_micro(M)}. + +apply_micro(M) -> + {GC0, Words0, _} = statistics(garbage_collection), + statistics(reductions), + Before = erlang:now(), + + Compensate = apply_micro(M#micro.function, M#micro.loops), + After = erlang:now(), + {GC1, Words1, _} = statistics(garbage_collection), + {_, Reds} = statistics(reductions), + Elapsed = subtr(Before, After), + MicroSecs = Elapsed - Compensate, + [{title, M#micro.str}, + {tt1, M#micro.tt1}, + {function, M#micro.function}, + {weight_percentage, M#micro.weight}, + {loops, M#micro.loops}, + {microsecs,MicroSecs}, + {estones, (M#micro.weight * M#micro.weight * ?STONEFACTOR) div MicroSecs}, + {gcs, GC1 - GC0}, + {kilo_word_reclaimed, (Words1 - Words0) div 1000}, + {kilo_reductions, Reds div 1000}, + {gc_intensity, gci(Elapsed, GC1 - GC0, Words1 - Words0)}]. + + +subtr(Before, After) -> + (element(1,After)*1000000000000 + +element(2,After)*1000000+element(3,After)) - + (element(1,Before)*1000000000000 + +element(2,Before)*1000000+element(3,Before)). + +gci(Micros, Words, Gcs) -> + ((256 * Gcs) / Micros) + (Words / Micros). + +apply_micro(Name, Loops) -> + io:format("~w(~w)~n", [Name, Loops]), + apply(?MODULE, Name, [Loops]). + +%%%%%%%%%%%% micro bench manipulating lists. %%%%%%%%%%%%%%%%%%%%%%%%% +lists(I) -> + L1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + L2 = "aaaaaaaaaa", + lists(I, L1, L2). + +lists(0, _,_) -> + 0; +lists(I, L1, L2) -> + revt(10, L1), + appt(10, L1, L2), + lists(I-1, L1, L2). + +revt(0, _) -> + done; +revt(I, L) -> + reverse(L), + revt(I-1, L). + +reverse(L) -> + reverse(L, []). +reverse([H|T], Ack) -> reverse(T, [H|Ack]); +reverse([], Ack) -> Ack. + +append([H|T], L) -> + [H | append(T, L)]; +append([], L) -> + L. + +appt(0, _L1, _L2) -> ok; +appt(I, L1, L2) -> + append(L1, L2), + appt(I-1, L1, L2). + + +%%%%%%%%%%%%%%% small message passing and ctxt switching %%%%%%% +msgp(I) -> + msgp(I, small()). + +msgp(0, _) -> + 0; +msgp(I, Msg) -> + P1 = spawn(?MODULE, p1, [self()]), + P2 = spawn(?MODULE, p1, [P1]), + P3 = spawn(?MODULE, p1, [P2]), + P4 = spawn(?MODULE, p1, [P3]), + msgp_loop(100, P4, Msg), + msgp(I-1, Msg). + +p1(To) -> + receive + {_From, {message, X}} -> + To ! {self(), {message, X}}, + p1(To); + stop -> + To ! stop, + exit(normal) + end. + +msgp_loop(0, P, _) -> + P ! stop, + receive + stop -> ok + end; +msgp_loop(I, P, Msg) -> + P ! {self(), {message, Msg}}, + receive + {_From, {message, _}} -> + msgp_loop(I-1, P, Msg) + end. + +%%%%%%%%%%%% large massage passing and ctxt switching %%%%%%% +msgp_medium(I) -> + msgp_medium(I, big()). + +msgp_medium(0, _) -> + 0; +msgp_medium(I, Msg) -> + P1 = spawn(?MODULE , p1, [self()]), + P2 = spawn(?MODULE, p1, [P1]), + P3 = spawn(?MODULE, p1, [P2]), + P4 = spawn(?MODULE, p1, [P3]), + msgp_loop(100, P4, Msg), + msgp_medium(I-1, Msg). + + + +%%%%%%%%%%%% huge massage passing and ctxt switching %%%%%%% +msgp_huge(I) -> + msgp_huge(I, very_big(15)). + +msgp_huge(0, _) -> + 0; +msgp_huge(I, Msg) -> + P1 = spawn(?MODULE , p1, [self()]), + P4 = spawn(?MODULE, p1, [P1]), + msgp_loop(100, P4, Msg), + msgp_huge(I-1, Msg). + + +%%%%%% typical protocol pattern matching %%%%%%% +pattern(0) -> + 0; +pattern(I) -> + Tail = "aaabbaaababba", + P1 = [0, 1,2,3,4,5|Tail], + pat_loop1(100, P1), + pat_loop2(100, P1), + pat_loop3(100, P1), + pat_loop4(100, P1), + pat_loop5(100, P1), + pattern(I-1). + +pat_loop1(0, _) -> + ok; +pat_loop1(_I, [_, _X, _Y, 0 |_T]) -> + ok; +pat_loop1(_I, [_, _X, _Y, 1| _T]) -> + ok; +pat_loop1(_I, [_, _X, _Y, 2 | _T]) -> + ok; +pat_loop1(I, [_, X, Y, 3 | T]) -> + pat_loop1(I-1, [0, X,Y,3|T]). + +pat_loop2(0, _) -> + ok; +pat_loop2(_I, [_X, Y | _Tail]) when Y bsl 1 == 0 -> + ok; +pat_loop2(_I, [_X, Y | _Tail]) when Y bsl 2 == 0 -> + ok; +pat_loop2(I, [X, Y | Tail]) when Y bsl 2 == 4 -> + pat_loop2(I-1, [X, Y |Tail]). + + +pat_loop3(0, _) -> + ok; +pat_loop3(_I, [{c, h} | _Tail]) -> + ok; +pat_loop3(_I, [1, 0 |_T]) -> + ok; +pat_loop3(_I, [X, _Y |_Tail]) when is_binary(X), size(X) == 1 -> + ok; +pat_loop3(_I, [no, _Y|_Tail]) -> + ok; +pat_loop3(_I, []) -> + ok; +pat_loop3(_I, [X,_Y|_T]) when X /= 0 -> + ok; +pat_loop3(_I, [2,3|_T]) -> + ok; +pat_loop3(_I, [1, 2]) -> + ok; +pat_loop3(I, [0, 1 |T]) -> + pat_loop3(I-1, [0,1|T]). + + +pat_loop4(0, _) -> ok; +pat_loop4(_I, [20|_T]) -> ok; +pat_loop4(_I, [219|_T]) -> ok; +pat_loop4(_I, [18|_T]) -> ok; +pat_loop4(_I, [17|_T]) -> ok; +pat_loop4(_I, [16|_T]) -> ok; +pat_loop4(_I, [15|_T]) -> ok; +pat_loop4(_I, [14|_T]) -> ok; +pat_loop4(_I, [13|_T]) -> ok; +pat_loop4(_I, [12|_T]) -> ok; +pat_loop4(_I, [11|_T]) -> ok; +pat_loop4(_I, [10|_T]) -> ok; +pat_loop4(_I, [9|_T]) -> ok; +pat_loop4(_I, [8|_T]) -> ok; +pat_loop4(_I, [7|_T]) -> ok; +pat_loop4(_I, [6|_T]) -> ok; +pat_loop4(_I, [5|_T]) -> ok; +pat_loop4(_I, [4|_T]) -> ok; +pat_loop4(_I, [3|_T]) -> ok; +pat_loop4(_I, [1|_T]) -> ok; +pat_loop4(_I, [21|_T]) -> ok; +pat_loop4(_I, [22|_T]) -> ok; +pat_loop4(_I, [23|_T]) -> ok; +pat_loop4(_I, [24|_T]) -> ok; +pat_loop4(_I, [25|_T]) -> ok; +pat_loop4(_I, [26|_T]) -> ok; +pat_loop4(_I, [27|_T]) -> ok; +pat_loop4(I, [0|T]) -> + pat_loop4(I-1, [0|T]). + +pat_loop5(0, _) -> ok; +pat_loop5(_I, [0, 20|_T]) -> ok; +pat_loop5(_I, [0, 19|_T]) -> ok; +pat_loop5(_I, [0, 18|_T]) -> ok; +pat_loop5(_I, [0, 17|_T]) -> ok; +pat_loop5(_I, [0, 16|_T]) -> ok; +pat_loop5(_I, [0, 15|_T]) -> ok; +pat_loop5(_I, [0, 14|_T]) -> ok; +pat_loop5(_I, [0, 13|_T]) -> ok; +pat_loop5(_I, [0, 12|_T]) -> ok; +pat_loop5(_I, [0, 11|_T]) -> ok; +pat_loop5(_I, [0, 10|_T]) -> ok; +pat_loop5(_I, [0, 9|_T]) -> ok; +pat_loop5(_I, [0, 8|_T]) -> ok; +pat_loop5(_I, [0, 7|_T]) -> ok; +pat_loop5(_I, [0, 6|_T]) -> ok; +pat_loop5(I, [0, 1|T]) -> + pat_loop5(I-1, [0,1|T]). + +%%%%%%%%%% term traversal representing simple pattern matchhing %%% +%%%%%%%%% + some arith +trav(I) -> + X = very_big(10), + trav(I, X). + +trav(0, _) -> 0; +trav(I, T) -> + do_trav(T), + trav(I-1, T). + +do_trav(T) when is_tuple(T) -> + tup_trav(T, 1, 1 + size(T)); +do_trav([H|T]) -> + do_trav(H) + do_trav(T); +do_trav(X) when is_integer(X) -> 1; +do_trav(_X) -> 0. +tup_trav(_T, P, P) -> 0; +tup_trav(T, P, End) -> + do_trav(element(P, T)) + tup_trav(T, P+1, End). + + +%% Port I/O +port_io(I) -> + EstoneCat = get(estone_cat), + Before = erlang:now(), + Pps = make_port_pids(5, I, EstoneCat), %% 5 ports + send_procs(Pps, go), + After = erlang:now(), + wait_for_pids(Pps), + subtr(Before, After). + +make_port_pids(0, _, _) -> + []; +make_port_pids(NoPorts, J, EstoneCat) -> + [spawn(?MODULE, ppp, [self(),J,EstoneCat]) | make_port_pids(NoPorts-1, J, EstoneCat)]. +ppp(Top, I, EstoneCat) -> + P = open_port({spawn, EstoneCat}, []),%% cat sits at the other end + Str = lists:duplicate(200, 88), %% 200 X'es + Cmd = {self(), {command, Str}}, + receive + go -> ok + end, + ppp_loop(P, I, Cmd), + Cmd2 = {self(), {command, "abcde"}}, + Res = ppp_loop(P, I, Cmd2), + P ! {self(), close}, + receive + {P, closed} -> + closed + end, + Top ! {self(), Res}. + +ppp_loop(_P, 0, _) -> + ok; +ppp_loop(P, I, Cmd) -> + P ! Cmd, + receive + {P, _} -> %% no match + ppp_loop(P, I-1, Cmd) + end. + +%% Working with a very large non-working data set +%% where the passive data resides in remote processes +large_dataset_work(I) -> + {Minus, Ps} = timer:tc(?MODULE, mk_big_procs, [?BIGPROCS]), + trav(I), + lists(I), + send_procs(Ps, stop), + Minus. %% Don't count time to create the big procs. + +mk_big_procs(0) -> []; +mk_big_procs(I) -> + [ mk_big_proc()| mk_big_procs(I-1)]. + +mk_big_proc() -> + P = spawn(?MODULE, big_proc, []), + P ! {self(), running}, + receive + {P, yes} -> P + end. + +big_proc() -> + X = very_big(?BIGPROC_SIZE), %% creates a big heap + Y = very_big(?BIGPROC_SIZE), + Z = very_big(?BIGPROC_SIZE), + + receive + {From, running} -> + From ! {self(), yes} + end, + receive + stop -> + {X, Y, Z} %% Can't be garbed away now by very (not super) + %% smart compiler + end. + +%% Working with a large non-working data set +%% where the data resides in the local process. +large_local_dataset_work(I) -> + {Minus, _Data} = timer:tc(?MODULE, very_big, [?BIGPROC_SIZE]), + trav(I), + lists(I), + Minus. + + +%% Fast allocation and also deallocation that is gc test +%% Important to not let variable linger on the stack un-necessarily +alloc(0) -> 0; +alloc(I) -> + _X11 = very_big(), + _X12 = very_big(), + _X13 = very_big(), + _Z = [_X14 = very_big(), + _X15 = very_big(), + _X16 = very_big()], + _X17 = very_big(), + _X18 = very_big(), + _X19 = very_big(), + _X20 = very_big(), + _X21 = very_big(), + _X22 = very_big(), + _X23 = very_big(), + _X24 = very_big(), + alloc(I-1). + +%% Time to call bif's +%% Lot's of element stuff which reflects the record code which +%% is becomming more and more common +bif_dispatch(0) -> + 0; +bif_dispatch(I) -> + disp(), disp(), disp(), disp(), disp(), disp(), + disp(), disp(), disp(), disp(), disp(), disp(), + bif_dispatch(I-1). + +disp() -> + Tup = {a}, + L = [x], + self(),self(),self(),self(),self(),self(),self(),self(),self(), + make_ref(), + atom_to_list(''), + _X = list_to_atom([]), + tuple_to_list({}), + _X2 = list_to_tuple([]), + element(1, Tup), + element(1, Tup), + _Elem = element(1, Tup),element(1, Tup),element(1, Tup),element(1, Tup), + element(1, Tup),element(1, Tup),element(1, Tup),element(1, Tup), + element(1, Tup),element(1, Tup),element(1, Tup),element(1, Tup), + element(1, Tup),element(1, Tup),element(1, Tup),element(1, Tup), + setelement(1, Tup,k), + setelement(1, Tup,k), + setelement(1, Tup,k),setelement(1, Tup,k),setelement(1, Tup,k), + setelement(1, Tup,k),setelement(1, Tup,k),setelement(1, Tup,k), + setelement(1, Tup,k), + setelement(1, Tup,k), + setelement(1, Tup,k), + setelement(1, Tup,k), + _Y = setelement(1, Tup,k), + _Date = date(), time(), + put(a, 1), + get(a), + erase(a), + hd(L), + tl(L), + _Len = length(L),length(L),length(L),length(L), + node(),node(),node(),node(),node(),node(),node(),node(), + S=self(), + node(S),node(S),node(S), + size(Tup), + _W = whereis(code_server),whereis(code_server), + whereis(code_server),whereis(code_server), + whereis(code_server),whereis(code_server), + _W2 = whereis(code_server). + + +%% Generic server like behaviour +generic(I) -> + register(funky, spawn(?MODULE, gserv, [funky, ?MODULE, [], []])), + g_loop(I). + +g_loop(0) -> + exit(whereis(funky), kill), + 0; +g_loop(I) -> + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [xyz]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [xyz]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + ?MODULE:req(funky, {call, [abc]}), + g_loop(I-1). + +req(Name, Req) -> + R = make_ref(), + Name ! {self(), R, Req}, + receive + {Name, R, Reply} -> Reply + after 2000 -> + exit(timeout) + end. + +gserv(Name, Mod, State, Debug) -> + receive + {From, Ref, {call, Req}} when Debug == [] -> + case catch apply(Mod, handle_call, [From, State, Req]) of + {reply, Reply, State2} -> + From ! {Name, Ref, Reply}, + gserv(Name, Mod, State2, Debug); + {noreply, State2} -> + gserv(Name, Mod, State2, Debug); + {'EXIT', Reason} -> + exit(Reason) + end; + {_From, _Ref, _Req} when Debug /= [] -> + exit(nodebug) + end. + +handle_call(_From, _State, [xyz]) -> + R = atom_to_list(xyz), + {reply, R, []}; +handle_call(_From, State, [abc]) -> + R = 1 + 3, + {reply, R, [R | State]}. + + + +%% Binary handling, creating, manipulating and sending binaries +binary_h(I) -> + Before = erlang:now(), + P = spawn(?MODULE, echo, [self()]), + B = list_to_binary(lists:duplicate(2000, 5)), + After = erlang:now(), + Compensate = subtr(Before, After), + binary_h_2(I, P, B), + Compensate. + +binary_h_2(0, P, _B) -> + exit(P, kill); +binary_h_2(I, P, B) -> + echo_loop(P, 20, B), + split_loop(B, {abc,1,2222,self(),"ancnd"}, 100), + binary_h_2(I-1, P, B). + +split_loop(_B, _, 0) -> + ok; +split_loop(B, Term, I) -> + {X, Y} = split_binary(B, I), + size(X), + binary_to_list(Y, 1, 2), + binary_to_term(term_to_binary(Term)), + split_loop(B, Term, I-1). + + +echo_loop(_P, 0, _B) -> + k; +echo_loop(P, I, B) -> + P ! B, + P ! B, + P ! B, + P ! B, + P ! B, + P ! B, + P ! B, + P ! B, + P ! B, + P ! B, + receive _ -> ok end, + receive _ -> ok end, + receive _ -> ok end, + receive _ -> ok end, + receive _ -> ok end, + receive _ -> ok end, + receive _ -> ok end, + receive _ -> ok end, + receive _ -> ok end, + receive _ -> ok end, + echo_loop(P, I-1, B). + + +ets(0) -> + 0; +ets(I) -> + T1 = ets:new(a, [set]), + T2 = ets:new(c, [bag, private]), + L = [T1, T2], + run_tabs(L, L, 1), + ets:delete(T1), + ets:delete(T2), + ets(I-1). + +run_tabs(_, _, 0) -> + ok; +run_tabs([], L, I) -> + run_tabs(L, L, I-1); +run_tabs([Tab|Tail], L, I) -> + Begin = I * 20, + End = (I+1) * 20, + run_tab(Tab, Begin, End, I), + run_tabs(Tail, L, I). + +run_tab(_Tab, X, X, _) -> + ok; +run_tab(Tab, Beg, End, J) -> + ets:insert(Tab, {Beg, J}), + ets:insert(Tab, {J, Beg}), + ets:insert(Tab, {{foo,Beg}, J}), + ets:insert(Tab, {{foo, J}, Beg}), + ets:delete(Tab, haha), + ets:match_delete(Tab, {k, j}), + ets:match(Tab, {Beg, '$1'}), + ets:match(Tab, {'$1', J}), + ets:delete(Tab, Beg), + K = ets:first(Tab), + _K2 = ets:next(Tab, K), + run_tab(Tab, Beg+1, End, J). + + +%%%% Integer arith %%%%% +int_arith(0) -> + 0; +int_arith(I) -> + do_arith(I) + + do_arith(I) + + do_arith(I) + + do_arith(I) + + do_arith(I) + + do_arith(I) + + do_arith(I) + + do_arith(I) + + do_arith(I) + + 66, + int_arith(I-1). + +do_arith(I) -> + do_arith2(I) - + do_arith2(I) - + do_arith2(I) - + do_arith2(I) - + do_arith2(I) - + do_arith2(I) - + do_arith2(I) - + 99. + +do_arith2(I) -> + X = 23, + _Y = 789 + I, + Z = I + 1, + U = (X bsl 1 bsr I) * X div 2 bsr 4, + U1 = Z + Z + Z + Z + X bsl 4 * 2 bsl 2, + Z - U + U1 div 2. + + +%%%% Float arith %%%%% +float_arith(0) -> + 0; +float_arith(I) -> + f_do_arith(I) + + f_do_arith(I) + + f_do_arith(I) + + f_do_arith(I) + + f_do_arith(I) + + f_do_arith(I) + + f_do_arith(I) + + f_do_arith(I) + + f_do_arith(I) + + 66, + float_arith(I-1). + +f_do_arith(I) -> + X = 23.4, + _Y = 789.99 + I, + Z = I + 1.88, + U = (X * 1 / I) * X / 2 * 4, + U1 = Z + Z + Z + Z + X * 4 * 2 / 2, + Z - U + U1 / 2. + +%%%% time to do various function calls +fcalls(0) -> + 0; +fcalls(I) -> + local0(400), + remote0(400), + app0(400), + local1(400), + remote1(400), + app1(400), + fcalls(I-1). + + +local0(0) -> 0; +local0(N) -> + local0(N-1). + +local1(0) -> 0; +local1(N) -> + 1+local1(N-1). + +remote0(0) -> 0; +remote0(N) -> + ?MODULE:remote0(N-1). + +remote1(0) -> 0; +remote1(N) -> + 1+?MODULE:remote1(N-1). + +app0(0) -> 0; +app0(N) -> + apply(?MODULE, app0, [N-1]). + +app1(0) -> 0; +app1(N) -> + 1 + apply(?MODULE, app1, [N-1]). + +%%%%%% jog the time queue implementation +timer(I) -> + L = [50, 50, 50, 100, 1000, 3000, 8000, 50000, 100000], + timer(I, L). + +timer(0, _) -> 0; +timer(N, L) -> + send_self(100), + recv(100,L, L), + timer(N-1). + +recv(0, _, _) -> + ok; +recv(N, [], L) -> + recv(N, L, L); +recv(N, [Timeout|Tail], L) -> + receive + hi_dude -> + recv(N-1, Tail, L) + after Timeout -> + io:format("XXXXX this wasn't supposed to happen???~n", []), + ok + end. + +send_self(0) -> + ok; +send_self(N) -> + self() ! hi_dude, + send_self(N-1). + + +%%%%%%%%%%%% managing many links %%%%% +links(I) -> + L = mk_link_procs(100), + send_procs(L, {procs, L, I}), + wait_for_pids(L), + 0. + +mk_link_procs(0) -> + []; +mk_link_procs(I) -> + [spawn_link(?MODULE, lproc, [self()]) | mk_link_procs(I-1)]. + + +lproc(Top) -> + process_flag(trap_exit,true), + receive + {procs, Procs, I} -> + Top ! {self(), lproc(Procs, Procs, link, I)} + end. + +lproc(_, _, _, 0) -> + done; +lproc([], Procs, link, I) -> + lproc(Procs, Procs, unlink, I-1); +lproc([], Procs, unlink, I) -> + lproc(Procs, Procs, link, I-1); +lproc([Pid|Tail], Procs, unlink, I) -> + unlink(Pid), + lproc(Tail, Procs, unlink, I); +lproc([Pid|Tail], Procs, link, I) -> + link(Pid), + lproc(Tail, Procs, unlink, I). + + + +%%%%%%%%%%% various utility functions %%%%%%% + +echo(Pid) -> + receive + X -> Pid ! X, + echo(Pid) + end. + +very_big() -> + very_big(2). +very_big(0) -> []; +very_big(I) -> + {1,2,3,a,v,f,r,t,y,u,self(), self(), self(), + "22222222222222222", {{"234", self()}}, + [[very_big(I-1)]]}. + +big() -> + {self(), funky_stuff, baby, {1, [123, true,[]], "abcdef"}}. + +small() -> {self(), true}. + +%% Wait for a list of children to respond +wait_for_pids([]) -> + ok; +wait_for_pids([P|Tail]) -> + receive + {P, _Res} -> wait_for_pids(Tail) + end. + +send_procs([P|Tail], Msg) -> P ! Msg, send_procs(Tail, Msg); +send_procs([], _) -> ok. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/evil_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/evil_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/evil_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/evil_SUITE.erl 2009-09-18 15:08:34.000000000 +0100 @@ -0,0 +1,377 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(evil_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + heap_frag/1, + encode_decode_ext/1, + decode_integer_ext/1, + decode_small_big_ext/1, + decode_large_big_ext/1, + decode_small_big_ext_neg/1, + decode_large_big_ext_neg/1, + decode_too_small/1, + decode_pos_neg_zero/1 + ]). + +-include("test_server.hrl"). + +all(suite) -> + [ + heap_frag, + encode_decode_ext, + decode_integer_ext, + decode_small_big_ext, + decode_large_big_ext, + decode_small_big_ext_neg, + decode_large_big_ext_neg, + decode_too_small, + decode_pos_neg_zero + ]. + +init_per_testcase(_Case, Config) -> + ?line Dog = test_server:timetrap(?t:minutes(0.5)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +heap_frag(Config) when is_list(Config) -> + N = 512, + Self = self(), + ?line Pid = spawn_link(fun() -> appender(Self, N) end), + receive + {Pid,Res} -> + ?line Res = my_appender(N); + Garbage -> + io:format("Garbage: ~p\n", [Garbage]), + ?line ?t:fail(got_garbage) + end. + + +%% ######################################################################## %% + +%% "Interesting" integers taken from erl_interface ei_decode_SUITE.erl +%% These test cases are not "evil" but the next test case is.... + +encode_decode_ext(Config) when is_list(Config) -> + ?line enc_dec( 2, 0), % SMALL_INTEGER_EXT smallest + ?line enc_dec( 2, 255), % SMALL_INTEGER_EXT largest + ?line enc_dec( 5, 256), % INTEGER_EXT smallest pos (*) + ?line enc_dec( 5, -1), % INTEGER_EXT largest neg + + ?line enc_dec( 5, 16#07ffffff), % INTEGER_EXT largest (28 bits) + ?line enc_dec( 5,-16#08000000), % INTEGER_EXT smallest + ?line enc_dec( 7, 16#08000000), % SMALL_BIG_EXT smallest pos(*) + ?line enc_dec( 7,-16#08000001), % SMALL_BIG_EXT largest neg (*) + + ?line enc_dec( 7, 16#7fffffff), % SMALL_BIG_EXT largest i32 + ?line enc_dec( 7,-16#80000000), % SMALL_BIG_EXT smallest i32 + + ?line enc_dec( 7, 16#80000000), % SMALL_BIG_EXT u32 + ?line enc_dec( 7, 16#ffffffff), % SMALL_BIG_EXT largest u32 + + ?line enc_dec( 9, 16#7fffffffffff), % largest i48 + ?line enc_dec( 9,-16#800000000000), % smallest i48 + ?line enc_dec( 9, 16#ffffffffffff), % largest u48 + ?line enc_dec(11, 16#7fffffffffffffff), % largest i64 + ?line enc_dec(11,-16#8000000000000000), % smallest i64 + ?line enc_dec(11, 16#ffffffffffffffff), % largest u64 + + ok. + + +%% ######################################################################## %% + +%% "Interesting" integers taken from erl_interface ei_decode_SUITE.erl +%% These test the decoding "unusual", i.e. integers packed according +%% to "erts/emulator/internal_doc/erl_ext_dist.txt" but not the way +%% the emulator or erl_interface encode them. +%% +%% NOTE!!!! The comments below after a decode line is how it currently +%% is encoded in the external format by the emulator and +%% erl_interface, i.e. not how it is encoded in the test case below. + +decode_integer_ext(Config) when is_list(Config) -> + ?line decode( 0, <<131,98, 0:32>>), % SMALL_INTEGER_EXT + ?line decode( 42, <<131,98, 42:32>>), % SMALL_INTEGER_EXT + ?line decode(255, <<131,98,255:32>>), % SMALL_INTEGER_EXT + ?line decode( 16#08000000, <<131,98, 16#08000000:32>>), % SMALL_BIG_EXT + ?line decode(-16#08000001, <<131,98,-16#08000001:32>>), % SMALL_BIG_EXT + ?line decode( 16#7fffffff, <<131,98, 16#7fffffff:32>>), % SMALL_BIG_EXT + ?line decode(-16#80000000, <<131,98,-16#80000000:32>>), % SMALL_BIG_EXT + ok. + +decode_small_big_ext(Config) when is_list(Config) -> + ?line decode(256,<<131,110,2,0,0,1>>), % INTEGER_EXT + ?line decode(16#07ffffff,<<131,110,4,0,255,255,255,7>>), % INTEGER_EXT + ?line decode(16#7fffffff,<<131,110,4,0,255,255,255,127>>), % SMALL_BIG_EXT + + ?line decode(42,<<131,110,1,0,42>>), % SMALL_INTEGER_EXT + ?line decode(42,<<131,110,2,0,42,0>>), % Redundant zeros from now on + ?line decode(42,<<131,110,3,0,42,0,0>>), + ?line decode(42,<<131,110,4,0,42,0,0,0>>), + ?line decode(42,<<131,110,5,0,42,0,0,0,0>>), + ?line decode(42,<<131,110,6,0,42,0,0,0,0,0>>), + ?line decode(42,<<131,110,7,0,42,0,0,0,0,0,0>>), + ?line decode(42,<<131,110,8,0,42,0,0,0,0,0,0,0>>), + ok. + +decode_large_big_ext(Config) when is_list(Config) -> + ?line decode(256,<<131,111,2:32,0,0,1>>), % INTEGER_EXT + ?line decode(16#07ffffff,<<131,111,4:32,0,255,255,255,7>>), % INTEG_EXT + ?line decode(16#7fffffff,<<131,111,4:32,0,255,255,255,127>>), % SMA_BIG + ?line decode(16#ffffffff,<<131,111,4:32,0,255,255,255,255>>), % SMA_BIG + + N = largest_small_big(), + ?line decode(N,<<131,111,255:32,0,N:2040/little>>), % SMALL_BIG_EXT + + ?line decode(42,<<131,111,1:32,0,42>>), + ?line decode(42,<<131,111,2:32,0,42,0>>), % Redundant zeros from now on + ?line decode(42,<<131,111,3:32,0,42,0,0>>), + ?line decode(42,<<131,111,4:32,0,42,0,0,0>>), + ?line decode(42,<<131,111,5:32,0,42,0,0,0,0>>), + ?line decode(42,<<131,111,6:32,0,42,0,0,0,0,0>>), + ?line decode(42,<<131,111,7:32,0,42,0,0,0,0,0,0>>), + ?line decode(42,<<131,111,8:32,0,42,0,0,0,0,0,0,0>>), + ok. + +decode_small_big_ext_neg(Config) when is_list(Config) -> + ?line decode(-1,<<131,110,1,1,1>>), % INTEGER_EXT + ?line decode(-16#08000000,<<131,110,4,1,0,0,0,8>>), % INTEGER_EXT + ?line decode(-16#80000000,<<131,110,4,1,0,0,0,128>>), % SMALL_BIG_EXT + ?line decode(-16#ffffffff,<<131,110,4,1,255,255,255,255>>), % SMALL_BIG_EXT + + N = largest_small_big(), + ?line decode(-N,<<131,111,255:32,1,N:2040/little>>), % SMALL_BIG_EXT + + ?line decode(-42,<<131,110,1,1,42>>), + ?line decode(-42,<<131,110,2,1,42,0>>), % Redundant zeros from now on + ?line decode(-42,<<131,110,3,1,42,0,0>>), + ?line decode(-42,<<131,110,4,1,42,0,0,0>>), + ?line decode(-42,<<131,110,5,1,42,0,0,0,0>>), + ?line decode(-42,<<131,110,6,1,42,0,0,0,0,0>>), + ?line decode(-42,<<131,110,7,1,42,0,0,0,0,0,0>>), + ?line decode(-42,<<131,110,8,1,42,0,0,0,0,0,0,0>>), + ok. + +decode_large_big_ext_neg(Config) when is_list(Config) -> + ?line decode(-1,<<131,111,1:32,1,1>>), % INTEGER_EXT + ?line decode(-16#08000000,<<131,111,4:32,1,0,0,0,8>>), % INTEGER_EXT + ?line decode(-16#80000000,<<131,111,4:32,1,0,0,0,128>>), % SMALL_BIG_EXT + + ?line decode(-42,<<131,111,1:32,1,42>>), + ?line decode(-42,<<131,111,2:32,1,42,0>>), % Redundant zeros from now on + ?line decode(-42,<<131,111,3:32,1,42,0,0>>), + ?line decode(-42,<<131,111,4:32,1,42,0,0,0>>), + ?line decode(-42,<<131,111,5:32,1,42,0,0,0,0>>), + ?line decode(-42,<<131,111,6:32,1,42,0,0,0,0,0>>), + ?line decode(-42,<<131,111,7:32,1,42,0,0,0,0,0,0>>), + ?line decode(-42,<<131,111,8:32,1,42,0,0,0,0,0,0,0>>), + ok. + +decode_pos_neg_zero(Config) when is_list(Config) -> + ?line decode( 0, <<131,110,0,0>>), % SMALL_BIG_EXT (positive zero) + ?line decode( 0, <<131,110,1,0,0>>), % SMALL_BIG_EXT (positive zero) + ?line decode( 0, <<131,110,0,1>>), % SMALL_BIG_EXT (negative zero) + ?line decode( 0, <<131,110,1,1,0>>), % SMALL_BIG_EXT (negative zero) + + ?line decode( 0, <<131,111,0:32,0>>), % SMALL_BIG_EXT (positive zero) + ?line decode( 0, <<131,111,1:32,0,0>>), % SMALL_BIG_EXT (positive zero) + ?line decode( 0, <<131,111,0:32,1>>), % SMALL_BIG_EXT (negative zero) + ?line decode( 0, <<131,111,1:32,1,0>>), % SMALL_BIG_EXT (negative zero) + + N = largest_small_big(), + ?line decode( N,<<131,110,255,0,N:2040/little>>), % largest SMALL_BIG_EXT + ?line decode(-N,<<131,110,255,1,N:2040/little>>), % largest SMALL_BIG_EXT + + ok. + +%% Test to decode uncompleted encodings for all in "erl_ext_dist.txt" + +decode_too_small(Config) when is_list(Config) -> + ?line decode_badarg(<<131, 97>>), + ?line decode_badarg(<<131, 98>>), + ?line decode_badarg(<<131, 98, 0>>), + ?line decode_badarg(<<131, 98, 0, 0>>), + ?line decode_badarg(<<131, 98, 0, 0, 0>>), + ?line decode_badarg(<<131, 99>>), + ?line decode_badarg(<<131, 99, 0>>), + ?line decode_badarg(<<131, 99, 0:240>>), + + ?line decode_badarg(<<131,100>>), + ?line decode_badarg(<<131,100, 1:16/big>>), + ?line decode_badarg(<<131,100, 2:16/big>>), + ?line decode_badarg(<<131,100, 2:16/big, "A">>), + + % FIXME node name "A" seem ok, should it be? +% ?line decode_badarg(<<131,101,100,1:16/big,"A",42:32/big,0>>), + + ?line decode_badarg(<<131,101>>), + ?line decode_badarg(<<131,101,106>>), + ?line decode_badarg(<<131,101,255>>), + ?line decode_badarg(<<131,101,106,42:8/big>>), + ?line decode_badarg(<<131,101,106,42:16/big>>), + ?line decode_badarg(<<131,101,255,42:24/big>>), + ?line decode_badarg(<<131,101,255,42:32/big,0>>), + ?line decode_badarg(<<131,101,100,1:16/big,"A">>), + ?line decode_badarg(<<131,101,100,1:16/big,"A",42:32/big>>), + + ?line decode_badarg(<<131,102>>), + ?line decode_badarg(<<131,102,106,42:32/big,0>>), + ?line decode_badarg(<<131,102,255,42:32/big,0>>), + ?line decode_badarg(<<131,102,100,1:16/big,"A">>), + ?line decode_badarg(<<131,102,100,1:16/big,"A",42:32/big>>), + + ?line decode_badarg(<<131,103>>), + ?line decode_badarg(<<131,103,106,42:32/big,0>>), + ?line decode_badarg(<<131,103,255,42:32/big,0>>), + ?line decode_badarg(<<131,103,100,1:16/big,"A">>), + ?line decode_badarg(<<131,103,100,1:16/big,"A",42:32/big>>), + ?line decode_badarg(<<131,103,100,1:16/big,"A",4:32/big,2:32/big>>), + + ?line decode_badarg(<<131,104>>), + ?line decode_badarg(<<131,104, 1>>), + ?line decode_badarg(<<131,104, 2, 106>>), + ?line decode_badarg(<<131,105, 1:32/big>>), + ?line decode_badarg(<<131,105, 2:32/big, 106>>), + + ?line decode_badarg(<<131,107>>), + ?line decode_badarg(<<131,107, 1:16/big>>), + ?line decode_badarg(<<131,107, 2:16/big>>), + ?line decode_badarg(<<131,107, 2:16/big, "A">>), + + ?line decode_badarg(<<131,108>>), + ?line decode_badarg(<<131,108, 1:32/big>>), + ?line decode_badarg(<<131,108, 2:32/big>>), + ?line decode_badarg(<<131,108, 2:32/big, 106>>), % FIXME don't use NIL + + ?line decode_badarg(<<131,109>>), + ?line decode_badarg(<<131,109, 1:32/big>>), + ?line decode_badarg(<<131,109, 2:32/big>>), + ?line decode_badarg(<<131,109, 2:32/big, 42>>), + + N = largest_small_big(), + + ?line decode_badarg(<<131,110>>), + ?line decode_badarg(<<131,110,1>>), + ?line decode_badarg(<<131,110,1,0>>), + ?line decode_badarg(<<131,110,1,1>>), + ?line decode_badarg(<<131,110,2,0,42>>), + ?line decode_badarg(<<131,110,2,1,42>>), + ?line decode_badarg(<<131,110,255,0,N:2032/little>>), + ?line decode_badarg(<<131,110,255,1,N:2032/little>>), + + ?line decode_badarg(<<131,111>>), + ?line decode_badarg(<<131,111, 1:32/big>>), + ?line decode_badarg(<<131,111, 1:32/big,0>>), + ?line decode_badarg(<<131,111, 1:32/big,1>>), + ?line decode_badarg(<<131,111, 2:32/big,0,42>>), + ?line decode_badarg(<<131,111, 2:32/big,1,42>>), + ?line decode_badarg(<<131,111,256:32/big,0,N:2032/little>>), + ?line decode_badarg(<<131,111,256:32/big,1,N:2032/little>>), + ?line decode_badarg(<<131,111,256:32/big,0,N:2040/little>>), + ?line decode_badarg(<<131,111,256:32/big,1,N:2040/little>>), + ?line decode_badarg(<<131,111,257:32/big,0,N:2048/little>>), + ?line decode_badarg(<<131,111,257:32/big,1,N:2048/little>>), + + % Emulator dies if trying to create large bignum.... +% ?line decode_badarg(<<131,111,16#ffffffff:32/big,0>>), +% ?line decode_badarg(<<131,111,16#ffffffff:32/big,1>>), + + ?line decode_badarg(<<131, 78>>), + ?line decode_badarg(<<131, 78, 42>>), + ?line decode_badarg(<<131, 78, 42, 1>>), + ?line decode_badarg(<<131, 78, 42, 1:16/big>>), + ?line decode_badarg(<<131, 78, 42, 2:16/big>>), + ?line decode_badarg(<<131, 78, 42, 2:16/big, "A">>), + + ?line decode_badarg(<<131, 67>>), + + ?line decode_badarg(<<131,114>>), + ?line decode_badarg(<<131,114,0>>), + ?line decode_badarg(<<131,114,1:16/big>>), + ?line decode_badarg(<<131,114,1:16/big,100>>), + ?line decode_badarg(<<131,114,1:16/big,100,1:16/big>>), + ?line decode_badarg(<<131,114,1:16/big,100,1:16/big,"A">>), + ?line decode_badarg(<<131,114,1:16/big,100,1:16/big,"A",0>>), + ?line decode_badarg(<<131,114,1:16/big,100,1:16/big,"A",0,42:8>>), + ?line decode_badarg(<<131,114,1:16/big,100,1:16/big,"A",0,42:16>>), + ?line decode_badarg(<<131,114,1:16/big,100,1:16/big,"A",0,42:24>>), + + ?line decode_badarg(<<131,117>>), % FIXME needs more tests + + ok. + +%% ######################################################################## %% + +decode_badarg(Bin) -> + io:format("Trying ~w\n",[Bin]), + {'EXIT',{badarg,_}} = (catch binary_to_term(Bin)). + +enc_dec(_Size, Term) -> + Bin = term_to_binary(Term), + Term = binary_to_term(Bin), + ok. + +decode(Term, Binary) -> + io:format("Encoding ~w to ~w ... ",[Binary,Term]), + NewTerm = binary_to_term(Binary), + io:format("got ~w\n",[NewTerm]), + Term = NewTerm. + +largest_small_big() -> + List = lists:duplicate(255,255), + Limbs = list_to_binary(List), + binary_to_term(<<131,110,255,0,Limbs/binary>>). + +%% ######################################################################## %% + +appender(Parent, N) -> + seed(), + Res = appender_1(N, {}), + Parent ! {self(),Res}. + +appender_1(0, T) -> T; +appender_1(N, T0) -> + U = rnd_term(), + T = erlang:append_element(T0, U), + appender_1(N-1, T). + +my_appender(N) -> + seed(), + my_appender_1(N, []). + +my_appender_1(0, T) -> + list_to_tuple(lists:reverse(T)); +my_appender_1(N, T0) -> + U = rnd_term(), + T = [U|T0], + my_appender_1(N-1, T). + +seed() -> + random:seed(3172, 9815, 20129). + +rnd_term() -> + U0 = random:uniform(), + B = <>, + {U0,U0 * 2.5 + 3.14,[U0*2.3,B]}. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/exception_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/exception_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/exception_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/exception_SUITE.erl 2009-09-18 15:07:48.000000000 +0100 @@ -0,0 +1,497 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(exception_SUITE). + +-export([all/1, badmatch/1, pending_errors/1, nil_arith/1, + stacktrace/1, nested_stacktrace/1, raise/1, gunilla/1, per/1, + exception_with_heap_frag/1]). + +-export([bad_guy/2]). + +-include("test_server.hrl"). +-import(lists, [foreach/2]). + +all(suite) -> + [badmatch, pending_errors, nil_arith, + stacktrace, nested_stacktrace, raise, gunilla, per, + exception_with_heap_frag]. + +-define(try_match(E), + catch ?MODULE:bar(), + {'EXIT', {{badmatch, nomatch}, _}} = (catch E = id(nomatch))). + +%% Test that deliberately bad matches are reported correctly. + +badmatch(Config) when is_list(Config) -> + ?line ?try_match(a), + ?line ?try_match(42), + ?line ?try_match({a, b, c}), + ?line ?try_match([]), + ?line ?try_match(1.0), + ok. + +%% Test various exceptions, in the presence of a previous error suppressed +%% in a guard. +pending_errors(Config) when is_list(Config) -> + ?line pending(e_badmatch, {badmatch, b}), + ?line pending(x, function_clause), + ?line pending(e_case, {case_clause, xxx}), + ?line pending(e_if, if_clause), + ?line pending(e_badarith, badarith), + ?line pending(e_undef, undef), + ?line pending(e_timeoutval, timeout_value), + ?line pending(e_badarg, badarg), + ?line pending(e_badarg_spawn, badarg), + ok. + +bad_guy(pe_badarith, Other) when Other+1 == 0 -> % badarith (suppressed) + ok; +bad_guy(pe_badarg, Other) when length(Other) > 0 -> % badarg (suppressed) + ok; +bad_guy(_, e_case) -> + case id(xxx) of + ok -> ok + end; % case_clause +bad_guy(_, e_if) -> + if + a == b -> ok + end; % if_clause +bad_guy(_, e_badarith) -> + 1+b; % badarith +bad_guy(_, e_undef) -> + non_existing_module:foo(); % undef +bad_guy(_, e_timeoutval) -> + receive + after arne -> % timeout_value + ok + end; +bad_guy(_, e_badarg) -> + node(xxx); % badarg +bad_guy(_, e_badarg_spawn) -> + spawn({}, {}, {}); % badarg +bad_guy(_, e_badmatch) -> + a = id(b). % badmatch + +pending(Arg, Expected) -> + pending(pe_badarith, Arg, Expected), + pending(pe_badarg, Arg, Expected). + +pending(First, Second, Expected) -> + pending_catched(First, Second, Expected), + pending_exit_message([First, Second], Expected). + +pending_catched(First, Second, Expected) -> + ok = io:format("Catching bad_guy(~p, ~p)", [First, Second]), + case catch bad_guy(First, Second) of + {'EXIT', Reason} -> + pending(Reason, bad_guy, [First, Second], Expected); + Other -> + test_server:fail({not_exit, Other}) + end. + +pending_exit_message(Args, Expected) -> + ok = io:format("Trapping EXITs from spawn_link(~p, ~p, ~p)", + [?MODULE, bad_guy, Args]), + process_flag(trap_exit, true), + Pid = spawn_link(?MODULE, bad_guy, Args), + receive + {'EXIT', Pid, Reason} -> + pending(Reason, bad_guy, Args, Expected); + Other -> + test_server:fail({unexpected_message, Other}) + after 10000 -> + test_server:fail(timeout) + end, + process_flag(trap_exit, false). + +pending({badarg, [{erlang,Bif,BifArgs},{?MODULE,Func,Arity}|_]}, Func, Args, _Code) + when is_atom(Bif), is_list(BifArgs), length(Args) == Arity -> + ok; +pending({undef,[{non_existing_module,foo,[]}|_]}, _, _, _) -> + ok; +pending({function_clause,[{?MODULE,Func,Args}|_]}, Func, Args, _Code) -> + ok; +pending({Code,[{?MODULE,Func,Arity}|_]}, Func, Args, Code) when length(Args) == Arity -> + ok; +pending(Reason, _Function, _Args, _Code) -> + test_server:fail({bad_exit_reason,Reason}). + +%% Test that doing arithmetics on [] gives a badarith EXIT and not a crash. + +nil_arith(Config) when is_list(Config) -> + ?line ba_plus_minus_times([], []), + + ?line ba_plus_minus_times([], 0), + ?line ba_plus_minus_times([], 42), + ?line ba_plus_minus_times([], 38724978123478923784), + ?line ba_plus_minus_times([], 38.72), + + ?line ba_plus_minus_times(0, []), + ?line ba_plus_minus_times(334, []), + ?line ba_plus_minus_times(387249797813478923784, []), + ?line ba_plus_minus_times(344.22, []), + + ?line ba_div_rem([], []), + + ?line ba_div_rem([], 0), + ?line ba_div_rem([], 1), + ?line ba_div_rem([], 42), + ?line ba_div_rem([], 38724978123478923784), + ?line ba_div_rem(344.22, []), + + ?line ba_div_rem(0, []), + ?line ba_div_rem(1, []), + ?line ba_div_rem(334, []), + ?line ba_div_rem(387249797813478923784, []), + ?line ba_div_rem(344.22, []), + + ?line ba_div_rem(344.22, 0.0), + ?line ba_div_rem(1, 0.0), + ?line ba_div_rem(392873498733971, 0.0), + + ?line ba_bop([], []), + ?line ba_bop(0, []), + ?line ba_bop(42, []), + ?line ba_bop(-42342742987343, []), + ?line ba_bop(238.342, []), + ?line ba_bop([], 0), + ?line ba_bop([], -243), + ?line ba_bop([], 243), + ?line ba_bop([], 2438724982478933), + ?line ba_bop([], 3987.37), + + ?line ba_bnot([]), + ?line ba_bnot(23.33), + + ?line ba_shift([], []), + ?line ba_shift([], 0), + ?line ba_shift([], 4), + ?line ba_shift([], -4), + ?line ba_shift([], 2343333333333), + ?line ba_shift([], -333333333), + ?line ba_shift([], 234.00), + ?line ba_shift(23, []), + ?line ba_shift(0, []), + ?line ba_shift(-3433443433433323, []), + ?line ba_shift(433443433433323, []), + ?line ba_shift(343.93, []), + ok. + +ba_plus_minus_times(A, B) -> + io:format("~p + ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A + B), + io:format("~p - ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A - B), + io:format("~p * ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A * B). + +ba_div_rem(A, B) -> + io:format("~p / ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A / B), + io:format("~p div ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A div B), + io:format("~p rem ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A rem B). + +ba_bop(A, B) -> + io:format("~p band ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A band B), + io:format("~p bor ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A bor B), + io:format("~p bxor ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A bxor B). + +ba_shift(A, B) -> + io:format("~p bsl ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A bsl B), + io:format("~p bsr ~p", [A, B]), + {'EXIT', {badarith, _}} = (catch A bsr B). + +ba_bnot(A) -> + io:format("bnot ~p", [A]), + {'EXIT', {badarith, _}} = (catch bnot A). + + + +stacktrace(Conf) when is_list(Conf) -> + Tag = make_ref(), + ?line {_,Mref} = spawn_monitor(fun() -> exit({Tag,erlang:get_stacktrace()}) end), + ?line {Tag,[]} = receive {'DOWN',Mref,_,_,Info} -> Info end, + V = [make_ref()|self()], + ?line {value2,{caught1,badarg,[{erlang,abs,[V]}|_]=St1}} = + stacktrace_1({'abs',V}, error, {value,V}), + ?line St1 = erase(stacktrace1), + ?line St1 = erase(stacktrace2), + ?line St1 = erlang:get_stacktrace(), + ?line {caught2,{error,badarith},[{?MODULE,my_add,2}|_]=St2} = + stacktrace_1({'div',{1,0}}, error, {'add',{0,a}}), + ?line [{?MODULE,my_div,2}|_] = erase(stacktrace1), + ?line St2 = erase(stacktrace2), + ?line St2 = erlang:get_stacktrace(), + ?line {caught2,{error,{try_clause,V}},[{?MODULE,stacktrace_1,3}|_]=St3} = + stacktrace_1({value,V}, error, {value,V}), + ?line St3 = erase(stacktrace1), + ?line St3 = erase(stacktrace2), + ?line St3 = erlang:get_stacktrace(), + ?line {caught2,{throw,V},[{?MODULE,foo,1}|_]=St4} = + stacktrace_1({value,V}, error, {throw,V}), + ?line [{?MODULE,stacktrace_1,3}|_] = erase(stacktrace1), + ?line St4 = erase(stacktrace2), + ?line St4 = erlang:get_stacktrace(), + ok. + +stacktrace_1(X, C1, Y) -> + erase(stacktrace1), + erase(stacktrace2), + try try foo(X) of + C1 -> value1 + catch + C1:D1 -> {caught1,D1,erlang:get_stacktrace()} + after + put(stacktrace1, erlang:get_stacktrace()), + foo(Y) + end of + V2 -> {value2,V2} + catch + C2:D2 -> {caught2,{C2,D2},erlang:get_stacktrace()} + after + put(stacktrace2, erlang:get_stacktrace()) + end. + + + +nested_stacktrace(Conf) when is_list(Conf) -> + V = [{make_ref()}|[self()]], + ?line value1 = + nested_stacktrace_1({{value,{V,x1}},void,{V,x1}}, + {void,void,void}), + ?line {caught1, + [{?MODULE,my_add,2}|_], + value2, + [{?MODULE,my_add,2}|_]} = + nested_stacktrace_1({{'add',{V,x1}},error,badarith}, + {{value,{V,x2}},void,{V,x2}}), + ?line {caught1, + [{?MODULE,my_add,2}|_], + {caught2,[{erlang,abs,[V]}|_]}, + [{erlang,abs,[V]}|_]} = + nested_stacktrace_1({{'add',{V,x1}},error,badarith}, + {{'abs',V},error,badarg}), + ok. + +nested_stacktrace_1({X1,C1,V1}, {X2,C2,V2}) -> + try foo(X1) of + V1 -> value1 + catch + C1:V1 -> + S1 = erlang:get_stacktrace(), + T2 = + try foo(X2) of + V2 -> value2 + catch + C2:V2 -> {caught2,erlang:get_stacktrace()} + end, + {caught1,S1,T2,erlang:get_stacktrace()} + end. + + + +raise(Conf) when is_list(Conf) -> + ?line erase(raise), + ?line A = + try + ?line try foo({'div',{1,0}}) + catch + error:badarith -> + put(raise, A0 = erlang:get_stacktrace()), + ?line erlang:raise(error, badarith, A0) + end + catch + error:badarith -> + ?line A1 = erlang:get_stacktrace(), + ?line A1 = get(raise) + end, + ?line A = erlang:get_stacktrace(), + ?line A = get(raise), + ?line [{?MODULE,my_div,2}|_] = A, + %% + N = 8, % Must be even + ?line N = erlang:system_flag(backtrace_depth, N), + ?line try even(N) + catch error:function_clause -> ok + end, + ?line B = odd_even(N, []), + ?line B = erlang:get_stacktrace(), + %% + ?line C0 = odd_even(N+1, []), + ?line C = lists:sublist(C0, N), + ?line try odd(N+1) + catch error:function_clause -> ok + end, + ?line C = erlang:get_stacktrace(), + ?line try erlang:raise(error, function_clause, C0) + catch error:function_clause -> ok + end, + ?line C = erlang:get_stacktrace(), + ok. + +odd_even(N, R) when is_integer(N), N > 1 -> + odd_even(N-1, + [if (N rem 2) == 0 -> + {?MODULE,even,1}; + true -> + {?MODULE,odd,1} + end|R]); +odd_even(1, R) -> + [{?MODULE,odd,[1]}|R]. + +even(N) when is_integer(N), N > 1, (N rem 2) == 0 -> + odd(N-1)++[N]. + +odd(N) when is_integer(N), N > 1, (N rem 2) == 1 -> + even(N-1)++[N]. + + +foo({value,Value}) -> Value; +foo({'div',{A,B}}) -> + my_div(A, B); +foo({'add',{A,B}}) -> + my_add(A, B); +foo({'abs',X}) -> + my_abs(X); +foo({error,Error}) -> + erlang:error(Error); +foo({throw,Throw}) -> + erlang:throw(Throw); +foo({exit,Exit}) -> + erlang:exit(Exit); +foo({raise,{Class,Reason,Stacktrace}}) -> + erlang:raise(Class, Reason, Stacktrace). +%%foo(function_clause) -> % must not be defined! + +my_div(A, B) -> + A div B. + +my_add(A, B) -> + A + B. + +my_abs(X) -> abs(X). + +gunilla(Config) when is_list(Config) -> + ?line {throw,kalle} = gunilla_1(), + ?line [] = erlang:get_stacktrace(), + ok. + +gunilla_1() -> + try try arne() + after + pelle + end + catch + C:R -> + {C,R} + end. + +arne() -> + %% Empty stack trace used to cause change the error class to 'error'. + erlang:raise(throw, kalle, []). + +per(Config) when is_list(Config) -> + try + t1(0,pad,0), + t2(0,pad,0) + catch + error:badarith -> + ok + end. + +t1(_,X,_) -> + (1 bsl X) + 1. + +t2(_,X,_) -> + (X bsl 1) + 1. + +%% +%% Make sure that even if a BIF builds an heap fragment, then causes an exception, +%% the stacktrace term will still be OK (specifically, that it does not contain +%% stale pointers to the arguments). +%% +exception_with_heap_frag(Config) when is_list(Config) -> + Sizes = lists:seq(0, 512), + + %% Floats are only validated when the heap fragment has been allocated. + BadFloat = <<131,99,53,46,48,$X,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,101,45,48,49,0,0,0,0,0>>, + ?line do_exception_with_heap_frag(BadFloat, Sizes), + + %% {Binary,BadFloat}: When the error in float is discovered, a refc-binary + %% has been allocated and the list of refc-binaries goes through the + %% heap fragment. + BinAndFloat = + <<131,104,2,109,0,0,1,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, + 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45, + 46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70, + 71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, + 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115, + 116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134, + 135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153, + 154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172, + 173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210, + 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229, + 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248, + 249,250,251,252,253,254,255,99,51,46,49,52,$B,$l,$u,$r,$f,48,48,48,48,48,48, + 48,48,49,50,52,51,52,101,43,48,48,0,0,0,0,0>>, + ?line do_exception_with_heap_frag(BinAndFloat, Sizes), + + %% {Fun,BadFloat} + FunAndFloat = + <<131,104,2,112,0,0,0,66,0,238,239,135,138,137,216,89,57,22,111,52,126,16,84, + 71,8,0,0,0,0,0,0,0,0,100,0,1,116,97,0,98,5,175,169,123,103,100,0,13,110,111, + 110,111,100,101,64,110,111,104,111,115,116,0,0,0,41,0,0,0,0,0,99,50,46,55,48, + $Y,57,57,57,57,57,57,57,57,57,57,57,57,57,54,52,52,55,101,43,48,48,0,0,0,0,0>>, + ?line do_exception_with_heap_frag(FunAndFloat, Sizes), + + %% [ExternalPid|BadFloat] + ExtPidAndFloat = + <<131,108,0,0,0,1,103,100,0,13,107,97,108,108,101,64,115,116,114,105,100,101, + 114,0,0,0,36,0,0,0,0,2,99,48,46,$@,48,48,48,48,48,48,48,48,48,48,48,48,48,48, + 48,48,48,48,48,101,43,48,48,0,0,0,0,0>>, + ?line do_exception_with_heap_frag(ExtPidAndFloat, Sizes), + + ok. + +do_exception_with_heap_frag(Bin, [Sz|Sizes]) -> + Filler = erlang:make_tuple(Sz, a), + spawn(fun() -> + try + binary_to_term(Bin) + catch + _:_ -> + %% term_to_binary/1 is an easy way to traverse the + %% entire stacktrace term to make sure that every part + %% of it is OK. + term_to_binary(erlang:get_stacktrace()) + end, + id(Filler) + end), + do_exception_with_heap_frag(Bin, Sizes); +do_exception_with_heap_frag(_, []) -> ok. + +id(I) -> I. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/float_SUITE_data/fp_drv.c erlang-13.b.3-dfsg/erts/emulator/test/float_SUITE_data/fp_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/float_SUITE_data/fp_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/float_SUITE_data/fp_drv.c 2009-03-12 12:16:46.000000000 +0000 @@ -0,0 +1,142 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson AB. Portions + * created by Ericsson are Copyright 2008, Ericsson AB. All Rights + * Reserved.'' + * + * $Id$ + */ + +#if defined(DEBUG) || 0 +# define PRINTF(X) printf X +#else +# define PRINTF(X) +#endif + +#include +#ifdef __WIN32__ +#include +#if defined (__GNUC__) +int _finite(double x); +#endif +#ifndef finite +#define finite _finite +#endif +#endif +#include "erl_driver.h" + +#define ERTS_FP_CONTROL_TEST 0 +#define ERTS_FP_THREAD_TEST 1 + +static int control(ErlDrvData, unsigned int, char *, int, char **, int); + +static ErlDrvEntry fp_drv_entry = { + NULL /* init */, + NULL /* start */, + NULL /* stop */, + NULL /* output */, + NULL /* ready_input */, + NULL /* ready_output */, + "fp_drv", + NULL /* finish */, + NULL /* handle */, + control, + NULL /* timeout */, + NULL /* outputv */, + NULL /* ready_async */, + NULL /* flush */, + NULL /* call */, + NULL /* event */, + ERL_DRV_EXTENDED_MARKER, + ERL_DRV_EXTENDED_MAJOR_VERSION, + ERL_DRV_EXTENDED_MINOR_VERSION, + ERL_DRV_FLAG_USE_PORT_LOCKING, + NULL /* handle2 */, + NULL /* process_exit */ +}; + +DRIVER_INIT(fp_drv) +{ + return &fp_drv_entry; +} + +void * +do_test(void *unused) +{ + double x, y, z; + + x = 3.23e133; + y = 3.57e257; + z = x*y; + if (finite(z)) + return "is finite (1)"; + + x = 5.0; + y = 0.0; + z = x/y; + if (finite(z)) + return "is finite (2)"; + + z = log(-1.0); + if (finite(z)) + return "is finite (3)"; + + z = log(0.0); + if (finite(z)) + return "is finite (4)"; + + return "ok"; +} + +static int control(ErlDrvData drv_data, + unsigned int command, + char *buf, int len, + char **rbuf, int rlen) +{ + char *res_str; + PRINTF(("control(%p, %d, ...) called\r\n", drv_data, command)); + + switch (command) { + case ERTS_FP_THREAD_TEST: { + ErlDrvTid tid; + ErlDrvSysInfo info; + driver_system_info(&info, sizeof(ErlDrvSysInfo)); + if (!info.thread_support) + res_str = "skip: no thread support"; + else if (0 != erl_drv_thread_create("test", &tid, do_test, NULL, NULL)) + res_str = "failed to create thread"; + else if (0 != erl_drv_thread_join(tid, &res_str)) + res_str = "failed to join thread"; + break; + } + case ERTS_FP_CONTROL_TEST: + res_str = do_test(NULL); + break; + default: + res_str = "unknown command"; + break; + } + + done: { + int res_len = strlen(res_str); + if (res_len > rlen) { + char *abuf = driver_alloc(sizeof(char)*res_len); + if (!abuf) + return 0; + *rbuf = abuf; + } + + memcpy((void *) *rbuf, (void *) res_str, res_len); + + return res_len; + } +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/float_SUITE_data/has_fpe_bug.erl erlang-13.b.3-dfsg/erts/emulator/test/float_SUITE_data/has_fpe_bug.erl --- erlang-13.b.1-dfsg/erts/emulator/test/float_SUITE_data/has_fpe_bug.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/float_SUITE_data/has_fpe_bug.erl 2009-11-20 13:30:25.000000000 +0000 @@ -0,0 +1,31 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(has_fpe_bug). + +-export([start/0]). + +start() -> + case catch math:log(-1.0) of + {'EXIT', {badarith, _}} -> + halt(0); % Ok. + _ -> + file:write_file(skip_reason, "Known FPE bug"), + halt(1) + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/float_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/float_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/float_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/float_SUITE_data/Makefile.src 2009-03-12 12:16:46.000000000 +0000 @@ -0,0 +1,8 @@ +DRVS = fp_drv@dll@ + +all: has_fpe_bug $(DRVS) + +has_fpe_bug: + @erl_name@ -compile has_fpe_bug -s has_fpe_bug + +@SHLIB_RULES@ diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/float_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/float_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/float_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/float_SUITE.erl 2009-09-18 15:07:30.000000000 +0100 @@ -0,0 +1,167 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(float_SUITE). + +-include("test_server.hrl"). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + fpe/1,fp_drv/1,fp_drv_thread/1,denormalized/1,match/1,bad_float_unpack/1]). + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(3)), + [{watchdog, Dog},{testcase,Func}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +all(suite) -> + [fpe,fp_drv,fp_drv_thread,denormalized,match,bad_float_unpack]. + +%% Forces floating point exceptions and tests that subsequent, legal, +%% operations are calculated correctly. Original version by Sebastian +%% Strollo. + +fpe(Config) when is_list(Config) -> + ?line 0.0 = math:log(1.0), + ?line {'EXIT', {badarith, _}} = (catch math:log(-1.0)), + ?line 0.0 = math:log(1.0), + ?line {'EXIT', {badarith, _}} = (catch math:log(0.0)), + ?line 0.0 = math:log(1.0), + ?line {'EXIT',{badarith,_}} = (catch 3.23e133 * id(3.57e257)), + ?line 0.0 = math:log(1.0), + ?line {'EXIT',{badarith,_}} = (catch 5.0/id(0.0)), + ?line 0.0 = math:log(1.0), + ok. + + +-define(ERTS_FP_CONTROL_TEST, 0). +-define(ERTS_FP_THREAD_TEST, 1). + +fp_drv(Config) when is_list(Config) -> + fp_drv_test(?ERTS_FP_CONTROL_TEST, ?config(data_dir, Config)). + +fp_drv_thread(Config) when is_list(Config) -> + %% Run in a separate node since it used to crash the emulator... + ?line Parent = self(), + ?line DrvDir = ?config(data_dir, Config), + ?line {ok,Node} = start_node(Config), + ?line Tester = spawn_link(Node, + fun () -> + Parent ! + {self(), + fp_drv_test(?ERTS_FP_THREAD_TEST, + DrvDir)} + end), + ?line Result = receive {Tester, Res} -> Res end, + ?line stop_node(Node), + ?line Result. + +fp_drv_test(Test, DrvDir) -> + ?line Drv = fp_drv, + ?line try + begin + ?line case erl_ddll:load_driver(DrvDir, Drv) of + ok -> + ok; + {error, permanent} -> + ok; + {error, LoadError} -> + exit({load_error, + erl_ddll:format_error(LoadError)}); + LoadError -> + exit({load_error, LoadError}) + end, + case open_port({spawn, Drv}, []) of + Port when is_port(Port) -> + try port_control(Port, Test, "") of + "ok" -> + 0.0 = math:log(1.0), + ok; + [$s,$k,$i,$p,$:,$ | Reason] -> + {skipped, Reason}; + Error -> + exit(Error) + after + Port ! {self(), close}, + receive {Port, closed} -> ok end, + false = lists:member(Port, erlang:ports()), + ok + end; + Error -> + exit({open_port_failed, Error}) + end + end + catch + throw:Term -> ?line Term + after + erl_ddll:unload_driver(Drv) + end. + +denormalized(Config) when is_list(Config) -> + ?line Denormalized = 1.0e-307 / 1000, + ?line roundtrip(Denormalized), + ?line NegDenormalized = -1.0e-307 / 1000, + ?line roundtrip(NegDenormalized), + ok. + +roundtrip(N) -> + N = binary_to_term(term_to_binary(N)), + N = binary_to_term(term_to_binary(N, [{minor_version,1}])). + +match(Config) when is_list(Config) -> + ?line one = match_1(1.0), + ?line two = match_1(2.0), + ?line a_lot = match_1(1000.0), + ?line {'EXIT',_} = (catch match_1(0.5)), + ok. + +match_1(1.0) -> one; +match_1(2.0) -> two; +match_1(1000.0) -> a_lot. + +%% Thanks to Per Gustafsson. + +bad_float_unpack(Config) when is_list(Config) -> + ?line Bin = <<-1:64>>, + ?line -1 = bad_float_unpack_match(Bin), + ok. + +bad_float_unpack_match(<>) -> F; +bad_float_unpack_match(<>) -> I. + +id(I) -> I. + +start_node(Config) when is_list(Config) -> + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line {A, B, C} = now(), + ?line Name = list_to_atom(atom_to_list(?MODULE) + ++ "-" + ++ atom_to_list(?config(testcase, Config)) + ++ "-" + ++ integer_to_list(A) + ++ "-" + ++ integer_to_list(B) + ++ "-" + ++ integer_to_list(C)), + ?line ?t:start_node(Name, slave, [{args, "-pa "++Pa}]). + +stop_node(Node) -> + ?t:stop_node(Node). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/fun_r11_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/fun_r11_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/fun_r11_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/fun_r11_SUITE.erl 2009-09-18 15:09:23.000000000 +0100 @@ -0,0 +1,76 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(fun_r11_SUITE). +-compile(r11). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2,dist_old_release/1]). + +-define(default_timeout, ?t:minutes(1)). +-include("test_server.hrl"). + +all(suite) -> [dist_old_release]. + +init_per_testcase(_Case, Config) -> + ?line Dog = test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +dist_old_release(Config) when is_list(Config) -> + case ?t:is_release_available("r11b") of + true -> do_dist_old(Config); + false -> {skip,"No R11B found"} + end. + +do_dist_old(Config) when is_list(Config) -> + ?line Pa = filename:dirname(code:which(?MODULE)), + Name = fun_dist_r11, + ?line {ok,Node} = ?t:start_node(Name, peer, + [{args,"-pa "++Pa}, + {erl,[{release,"r11b"}]}]), + + ?line Pid = spawn_link(Node, + fun() -> + receive + Fun when is_function(Fun) -> + R11BFun = fun(H) -> cons(H, [b,c]) end, + Fun(Fun, R11BFun) + end + end), + Self = self(), + Fun = fun(F, R11BFun) -> + {pid,Self} = erlang:fun_info(F, pid), + {module,?MODULE} = erlang:fun_info(F, module), + Self ! {ok,F,R11BFun} + end, + ?line Pid ! Fun, + ?line receive + {ok,Fun,R11BFun} -> + ?line [a,b,c] = R11BFun(a); + Other -> + ?line ?t:fail({bad_message,Other}) + end, + ok. + +cons(H, T) -> + [H|T]. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/fun_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/fun_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/fun_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/fun_SUITE.erl 2009-09-18 15:08:01.000000000 +0100 @@ -0,0 +1,884 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(fun_SUITE). +-compile({nowarn_deprecated_function, {erlang,hash,2}}). + +-define(default_timeout, ?t:minutes(1)). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + bad_apply/1,bad_fun_call/1,badarity/1,ext_badarity/1, + equality/1,ordering/1, + fun_to_port/1,t_hash/1,t_phash/1,t_phash2/1,md5/1, + refc/1,refc_ets/1,refc_dist/1, + const_propagation/1,t_arity/1,t_is_function2/1, + t_fun_info/1]). + +-export([nothing/0]). + +-include("test_server.hrl"). + +all(suite) -> + [bad_apply,bad_fun_call,badarity,ext_badarity,equality,ordering, + fun_to_port,t_hash,t_phash,t_phash2,md5, + refc,refc_ets,refc_dist,const_propagation, + t_arity,t_is_function2,t_fun_info]. + +init_per_testcase(_Case, Config) -> + ?line Dog = test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +bad_apply(doc) -> + "Test that the correct EXIT code is returned for all types of bad funs."; +bad_apply(suite) -> []; +bad_apply(Config) when is_list(Config) -> + ?line bad_apply_fc(42, [0]), + ?line bad_apply_fc(xx, [1]), + ?line bad_apply_fc({}, [2]), + ?line bad_apply_fc({1}, [3]), + ?line bad_apply_fc({1,2,3}, [4]), + ?line bad_apply_fc({1,2,3}, [5]), + ?line bad_apply_fc({1,2,3,4}, [6]), + ?line bad_apply_fc({1,2,3,4,5,6}, [7]), + ?line bad_apply_fc({1,2,3,4,5}, [8]), + ?line bad_apply_badarg({1,2}, [9]), + ok. + +bad_apply_fc(Fun, Args) -> + Res = (catch apply(Fun, Args)), + erlang:garbage_collect(), + erlang:yield(), + case Res of + {'EXIT',{{badfun,Fun},_Where}} -> + ok = io:format("apply(~p, ~p) -> ~p\n", [Fun,Args,Res]); + Other -> + ok = io:format("apply(~p, ~p) -> ~p\n", [Fun,Args,Res]), + ?t:fail({bad_result,Other}) + end. + +bad_apply_badarg(Fun, Args) -> + Res = (catch apply(Fun, Args)), + erlang:garbage_collect(), + erlang:yield(), + case Res of + {'EXIT',{{badfun,Fun},_Where}} -> + ok = io:format("apply(~p, ~p) -> ~p\n", [Fun,Args,Res]); + Other -> + ok = io:format("apply(~p, ~p) -> ~p\n", [Fun,Args,Res]), + ?t:fail({bad_result, Other}) + end. + +bad_fun_call(doc) -> + "Try directly calling bad funs."; +bad_fun_call(suite) -> []; +bad_fun_call(Config) when is_list(Config) -> + ?line bad_call_fc(42), + ?line bad_call_fc(xx), + ?line bad_call_fc({}), + ?line bad_call_fc({1}), + ?line bad_call_fc({1,2,3}), + ?line bad_call_fc({1,2,3}), + ?line bad_call_fc({1,2,3,4}), + ?line bad_call_fc({1,2,3,4,5,6}), + ?line bad_call_fc({1,2,3,4,5}), + ?line bad_call_fc({1,2}), + ok. + +bad_call_fc(Fun) -> + Args = [some,stupid,args], + Res = (catch Fun(Fun(Args))), + case Res of + {'EXIT',{{badfun,Fun},_Where}} -> + ok = io:format("~p(~p) -> ~p\n", [Fun,Args,Res]); + Other -> + ok = io:format("~p(~p) -> ~p\n", [Fun,Args,Res]), + ?t:fail({bad_result,Other}) + end. + +%% Call and apply valid funs with wrong number of arguments. + +badarity(Config) when is_list(Config) -> + ?line Fun = fun() -> ok end, + ?line Stupid = {stupid,arguments}, + ?line Args = [some,{stupid,arguments},here], + + %% Simple call. + + ?line Res = (catch Fun(some, Stupid, here)), + erlang:garbage_collect(), + erlang:yield(), + case Res of + {'EXIT',{{badarity,{Fun,Args}},_}} -> + ?line ok = io:format("~p(~p) -> ~p\n", [Fun,Args,Res]); + _ -> + ?line ok = io:format("~p(~p) -> ~p\n", [Fun,Args,Res]), + ?line ?t:fail({bad_result,Res}) + end, + + %% Apply. + + ?line Res2 = (catch apply(Fun, Args)), + erlang:garbage_collect(), + erlang:yield(), + case Res2 of + {'EXIT',{{badarity,{Fun,Args}},_}} -> + ?line ok = io:format("apply(~p, ~p) -> ~p\n", [Fun,Args,Res2]); + _ -> + ?line ok = io:format("apply(~p, ~p) -> ~p\n", [Fun,Args,Res2]), + ?line ?t:fail({bad_result,Res2}) + end, + ok. + +%% Call and apply valid external funs with wrong number of arguments. + +ext_badarity(Config) when is_list(Config) -> + ?line Fun = fun ?MODULE:nothing/0, + ?line Stupid = {stupid,arguments}, + ?line Args = [some,{stupid,arguments},here], + + %% Simple call. + + ?line Res = (catch Fun(some, Stupid, here)), + erlang:garbage_collect(), + erlang:yield(), + case Res of + {'EXIT',{{badarity,{Fun,Args}},_}} -> + ?line ok = io:format("~p(~p) -> ~p\n", [Fun,Args,Res]); + _ -> + ?line ok = io:format("~p(~p) -> ~p\n", [Fun,Args,Res]), + ?line ?t:fail({bad_result,Res}) + end, + + %% Apply. + + ?line Res2 = (catch apply(Fun, Args)), + erlang:garbage_collect(), + erlang:yield(), + case Res2 of + {'EXIT',{{badarity,{Fun,Args}},_}} -> + ?line ok = io:format("apply(~p, ~p) -> ~p\n", [Fun,Args,Res2]); + _ -> + ?line ok = io:format("apply(~p, ~p) -> ~p\n", [Fun,Args,Res2]), + ?line ?t:fail({bad_result,Res2}) + end, + ok. + +nothing() -> + ok. + +%% Test equality of funs. + +equality(Config) when is_list(Config) -> + F0 = fun() -> 1 end, + F0_copy = copy_term(F0), + ?line true = eq(F0, F0), + ?line true = eq(F0, F0_copy), + + %% Compare different arities. + F1 = fun(X) -> X + 1 end, + ?line true = eq(F1, F1), + ?line false = eq(F0, F1), + ?line false = eq(F0_copy, F1), + + %% Compare different environments. + G1 = make_fun(1), + G2 = make_fun(2), + ?line true = eq(G1, G1), + ?line true = eq(G2, G2), + ?line false = eq(G1, G2), + ?line false = eq(G2, G1), + G1_copy = copy_term(G1), + ?line true = eq(G1, G1_copy), + + %% Compare fun with binaries. + B = list_to_binary([7,8,9]), + ?line false = eq(B, G1), + ?line false = eq(G1, B), + + %% Compare external funs. + FF0 = fun aa:blurf/0, + FF0_copy = copy_term(FF0), + FF1 = fun erlang:abs/0, + FF2 = fun erlang:exit/1, + FF3 = fun erlang:exit/2, + FF4 = fun z:ff/0, + + ?line true = eq(FF0, FF0), + ?line true = eq(FF0, FF0_copy), + ?line true = eq(FF1, FF1), + ?line true = eq(FF2, FF2), + ?line true = eq(FF3, FF3), + ?line true = eq(FF4, FF4), + ?line false = eq(FF0, FF1), + ?line false = eq(FF0, FF2), + ?line false = eq(FF0, FF3), + ?line false = eq(FF0, FF4), + ?line false = eq(FF1, FF0), + ?line false = eq(FF1, FF2), + ?line false = eq(FF1, FF3), + ?line false = eq(FF1, FF4), + ?line false = eq(FF2, FF3), + ?line false = eq(FF2, FF4), + ?line false = eq(FF3, FF4), + + ok. + +eq(X, X) -> true; +eq(_, _) -> false. + +copy_term(Term) -> + binary_to_term(term_to_binary(Term)). + +make_fun(X) -> + fun() -> X end. + +ordering(doc) -> "Tests ordering of funs."; +ordering(Config) when is_list(Config) -> + F1 = make_fun(1, 2), + F1_copy = copy_term(F1), + F2 = make_fun(1, 3), + F3 = make_fun(3, 4), + + FF0 = fun aa:blurf/0, + FF1 = fun erlang:abs/0, + FF2 = fun erlang:exit/1, + FF3 = fun erlang:exit/2, + FF4 = fun z:ff/0, + + ?line true = FF0 < FF1, + ?line true = FF1 < FF2, + ?line true = FF2 < FF3, + ?line true = FF3 < FF4, + + ?line true = FF0 > F1, + ?line true = FF0 > F2, + ?line true = FF0 > F3, + ?line true = FF4 > F1, + ?line true = FF4 > F2, + ?line true = FF4 > F3, + + ?line true = F1 == F1, + ?line true = F1 == F1_copy, + ?line true = F1 /= F2, + + ?line true = F1 < F2, + ?line true = F2 > F1, + ?line true = F2 < F3, + ?line true = F3 > F2, + + ?line false = F1 > F2, + ?line false = F2 > F3, + + %% Compare with binaries. + + B = list_to_binary([7,8,9,10]), + ?line false = B == F1, + ?line false = F1 == B, + + ?line true = F1 < B, + ?line true = B > F2, + + ?line false = F1 > B, + ?line false = B < F2, + + ?line false = F1 >= B, + ?line false = B =< F2, + + %% Compare module funs with binaries. + ?line false = B == FF1, + ?line false = FF1 == B, + + ?line true = FF1 < B, + ?line true = B > FF2, + + ?line false = FF1 > B, + ?line false = B < FF2, + + ?line false = FF1 >= B, + ?line false = B =< FF2, + + %% Create a port and ref. + + ?line Path = ?config(priv_dir, Config), + ?line AFile = filename:join(Path, "vanilla_file"), + ?line P = open_port(AFile, [out]), + ?line R = make_ref(), + + %% Compare funs with ports and refs. + + ?line true = R < F3, + ?line true = F3 > R, + ?line true = F3 < P, + ?line true = P > F3, + + ?line true = R =< F3, + ?line true = F3 >= R, + ?line true = F3 =< P, + ?line true = P >= F3, + + ?line false = R > F3, + ?line false = F3 < R, + ?line false = F3 > P, + ?line false = P < F3, + + %% Compare funs with conses and nils. + + ?line true = F1 < [a], + ?line true = F1 < [], + ?line true = [a,b] > F1, + ?line true = [] > F1, + + ?line false = [1] < F1, + ?line false = [] < F1, + ?line false = F1 > [2], + ?line false = F1 > [], + + ?line false = [1] =< F1, + ?line false = [] =< F1, + ?line false = F1 >= [2], + ?line false = F1 >= [], + + %% Compare module funs with conses and nils. + + ?line true = FF1 < [a], + ?line true = FF1 < [], + ?line true = [a,b] > FF1, + ?line true = [] > FF1, + + ?line false = [1] < FF1, + ?line false = [] < FF1, + ?line false = FF1 > [2], + ?line false = FF1 > [], + + ?line false = [1] =< FF1, + ?line false = [] =< FF1, + ?line false = FF1 >= [2], + ?line false = FF1 >= [], + ok. + +make_fun(X, Y) -> + fun(A) -> A*X+Y end. + +fun_to_port(doc) -> "Try sending funs to ports (should fail)."; +fun_to_port(suite) -> []; +fun_to_port(Config) when is_list(Config) -> + ?line fun_to_port(Config, xxx), + ?line fun_to_port(Config, fun() -> 42 end), + ?line fun_to_port(Config, [fun() -> 43 end]), + ?line fun_to_port(Config, [1,fun() -> 44 end]), + ?line fun_to_port(Config, [0,1|fun() -> 45 end]), + B64K = build_io_list(65536), + ?line fun_to_port(Config, [B64K,fun() -> 45 end]), + ?line fun_to_port(Config, [B64K|fun() -> 45 end]), + ok. + +fun_to_port(Config, IoList) -> + Path = ?config(priv_dir, Config), + AFile = filename:join(Path, "vanilla_file"), + Port = open_port(AFile, [out]), + case catch port_command(Port, IoList) of + {'EXIT',{badarg,_}} -> ok; + Other -> ?t:fail({unexpected_retval,Other}) + end. + +build_io_list(0) -> []; +build_io_list(1) -> [7]; +build_io_list(N) -> + L = build_io_list(N div 2), + case N rem 2 of + 0 -> [L|L]; + 1 -> [7,L|L] + end. + +t_hash(doc) -> "Test the hash/2 BIF on funs."; +t_hash(suite) -> []; +t_hash(Config) when is_list(Config) -> + F1 = fun(_X) -> 1 end, + F2 = fun(_X) -> 2 end, + ?line true = hash(F1) /= hash(F2), + + G1 = make_fun(1, 2, 3), + G2 = make_fun(1, 2, 3), + G3 = make_fun(1, 2, 4), + ?line true = hash(G1) == hash(G2), + ?line true = hash(G2) /= hash(G3), + + FF0 = fun erlang:abs/1, + FF1 = fun erlang:exit/1, + FF2 = fun erlang:exit/2, + FF3 = fun blurf:exit/2, + ?line true = hash(FF0) =/= hash(FF1), + ?line true = hash(FF0) =/= hash(FF2), + ?line true = hash(FF0) =/= hash(FF3), + ?line true = hash(FF1) =/= hash(FF2), + ?line true = hash(FF1) =/= hash(FF3), + ?line true = hash(FF2) =/= hash(FF3), + ok. + +hash(Term) -> + erlang:hash(Term, 16#7ffffff). + +t_phash(doc) -> "Test the phash/2 BIF on funs."; +t_phash(suite) -> []; +t_phash(Config) when is_list(Config) -> + F1 = fun(_X) -> 1 end, + F2 = fun(_X) -> 2 end, + ?line true = phash(F1) /= phash(F2), + + G1 = make_fun(1, 2, 3), + G2 = make_fun(1, 2, 3), + G3 = make_fun(1, 2, 4), + ?line true = phash(G1) == phash(G2), + ?line true = phash(G2) /= phash(G3), + + FF0 = fun erlang:abs/1, + FF1 = fun erlang:exit/1, + FF2 = fun erlang:exit/2, + FF3 = fun blurf:exit/2, + ?line true = phash(FF0) =/= phash(FF1), + ?line true = phash(FF0) =/= phash(FF2), + ?line true = phash(FF0) =/= phash(FF3), + ?line true = phash(FF1) =/= phash(FF2), + ?line true = phash(FF1) =/= phash(FF3), + ?line true = phash(FF2) =/= phash(FF3), + + ok. + +phash(Term) -> + erlang:phash(Term, 16#7ffffff). + +t_phash2(doc) -> "Test the phash2/2 BIF on funs."; +t_phash2(suite) -> []; +t_phash2(Config) when is_list(Config) -> + F1 = fun(_X) -> 1 end, + F2 = fun(_X) -> 2 end, + ?line true = phash2(F1) /= phash2(F2), + + G1 = make_fun(1, 2, 3), + G2 = make_fun(1, 2, 3), + G3 = make_fun(1, 2, 4), + ?line true = phash2(G1) == phash2(G2), + ?line true = phash2(G2) /= phash2(G3), + + FF0 = fun erlang:abs/1, + FF1 = fun erlang:exit/1, + FF2 = fun erlang:exit/2, + FF3 = fun blurf:exit/2, + ?line true = phash2(FF0) =/= phash2(FF1), + ?line true = phash2(FF0) =/= phash2(FF2), + ?line true = phash2(FF0) =/= phash2(FF3), + ?line true = phash2(FF1) =/= phash2(FF2), + ?line true = phash2(FF1) =/= phash2(FF3), + ?line true = phash2(FF2) =/= phash2(FF3), + + ok. + +phash2(Term) -> + erlang:phash2(Term, 16#7ffffff). + +make_fun(X, Y, Z) -> + fun() -> {X,Y,Z} end. + +md5(doc) -> "Test that MD5 bifs reject funs properly."; +md5(suite) -> []; +md5(Config) when is_list(Config) -> + _ = size(erlang:md5_init()), + + %% Try funs in the i/o list. + ?line bad_md5(fun(_X) -> 42 end), + ?line bad_md5([fun(_X) -> 43 end]), + ?line bad_md5([1,fun(_X) -> 44 end]), + ?line bad_md5([1|fun(_X) -> 45 end]), + ?line B64K = build_io_list(65536), + ?line bad_md5([B64K,fun(_X) -> 46 end]), + ?line bad_md5([B64K|fun(_X) -> 46 end]), + ok. + +bad_md5(Bad) -> + {'EXIT',{badarg,_}} = (catch erlang:md5(Bad)). + +refc(Config) when is_list(Config) -> + case erlang:system_info(heap_type) of + private -> refc_1(); + hybrid -> {skip,"Hybrid heap"} + end. + +refc_1() -> + ?line F1 = fun_factory(2), + ?line {refc,2} = erlang:fun_info(F1, refc), + ?line F2 = fun_factory(42), + ?line {refc,3} = erlang:fun_info(F1, refc), + + ?line process_flag(trap_exit, true), + ?line Pid = spawn_link(fun() -> {refc,4} = erlang:fun_info(F1, refc) end), + receive + {'EXIT',Pid,normal} -> ok; + Other -> ?line ?t:fail({unexpected,Other}) + end, + ?line process_flag(trap_exit, false), + ?line {refc,3} = erlang:fun_info(F1, refc), + + %% Garbage collect. Only the F2 fun will be left. + ?line 7 = F1(5), + ?line true = erlang:garbage_collect(), + ?line 40 = F2(-2), + ?line {refc,2} = erlang:fun_info(F2, refc), + ok. + +fun_factory(Const) -> + fun(X) -> X + Const end. + +refc_ets(Config) when is_list(Config) -> + case erlang:system_info(heap_type) of + private -> refc_ets_1(); + hybrid -> {skip,"Hybrid heap"} + end. + +refc_ets_1() -> + ?line F = fun(X) -> X + 33 end, + ?line {refc,2} = erlang:fun_info(F, refc), + + refc_ets_set(F, [set]), + refc_ets_set(F, [ordered_set]), + refc_ets_bag(F, [bag]), + refc_ets_bag(F, [duplicate_bag]), + ok. + +refc_ets_set(F1, Options) -> + ?line io:format("~p", [Options]), + ?line Tab = ets:new(kalle, Options), + ?line true = ets:insert(Tab, {a_key,F1}), + ?line 3 = fun_refc(F1), + ?line [{a_key,F3}] = ets:lookup(Tab, a_key), + ?line 4 = fun_refc(F1), + ?line true = ets:insert(Tab, {a_key,not_a_fun}), + ?line 3 = fun_refc(F1), + ?line true = ets:insert(Tab, {another_key,F1}), + ?line 4 = fun_refc(F1), + ?line true = ets:delete(Tab), + ?line 3 = fun_refc(F1), + ?line 10 = F3(-23), + ?line true = erlang:garbage_collect(), + ?line 2 = fun_refc(F1), + ok. + +refc_ets_bag(F1, Options) -> + ?line io:format("~p", [Options]), + ?line Tab = ets:new(kalle, Options), + ?line true = ets:insert(Tab, {a_key,F1}), + ?line 3 = fun_refc(F1), + ?line [{a_key,F3}] = ets:lookup(Tab, a_key), + ?line 4 = fun_refc(F1), + ?line true = ets:insert(Tab, {a_key,not_a_fun}), + ?line 4 = fun_refc(F1), + ?line true = ets:insert(Tab, {another_key,F1}), + ?line 5 = fun_refc(F1), + ?line true = ets:delete(Tab), + ?line 3 = fun_refc(F1), + ?line 10 = F3(-23), + ?line true = erlang:garbage_collect(), + ?line 2 = fun_refc(F1), + ok. + +refc_dist(Config) when is_list(Config) -> + case erlang:system_info(heap_type) of + private -> refc_dist_1(); + hybrid -> {skip,"Hybrid heap"} + end. + +refc_dist_1() -> + ?line {ok,Node} = start_node(fun_SUITE_refc_dist), + ?line process_flag(trap_exit, true), + ?line Pid = spawn_link(Node, + fun() -> receive + Fun when is_function(Fun) -> + 2 = fun_refc(Fun), + exit({normal,Fun}) end + end), + ?line F = fun() -> 42 end, + ?line 2 = fun_refc(F), + ?line Pid ! F, + F2 = receive + {'EXIT',Pid,{normal,Fun}} -> Fun; + Other -> ?line ?t:fail({unexpected,Other}) + end, + %% dist.c:net_mess2 have a reference to Fun for a while since + %% Fun is passed in an exit signal. Wait until it is gone. + ?line wait_until(fun () -> 4 =/= fun_refc(F2) end), + ?line 3 = fun_refc(F2), + ?line 3 = fun_refc(F), + refc_dist_send(Node, F). + +refc_dist_send(Node, F) -> + ?line true = erlang:garbage_collect(), + ?line Pid = spawn_link(Node, + fun() -> receive + {To,Fun} when is_function(Fun) -> + wait_until(fun () -> + 2 =:= fun_refc(Fun) + end), + To ! Fun + end + end), + ?line 2 = fun_refc(F), + Pid ! {self(),F}, + F2 = receive + Fun when is_function(Fun) -> Fun; + Other -> ?line ?t:fail({unexpected,Other}) + end, + receive {'EXIT',Pid,normal} -> ok end, + %% No reference from dist.c:net_mess2 since Fun is passed + %% in an ordinary message. + ?line 3 = fun_refc(F), + ?line 3 = fun_refc(F2), + refc_dist_reg_send(Node, F). + +refc_dist_reg_send(Node, F) -> + ?line true = erlang:garbage_collect(), + ?line 2 = fun_refc(F), + ?line Ref = make_ref(), + ?line Me = self(), + ?line Pid = spawn_link(Node, + fun() -> + true = register(my_fun_tester, self()), + Me ! Ref, + receive + {Me,Fun} when is_function(Fun) -> + 2 = fun_refc(Fun), + Me ! Fun + end + end), + erlang:yield(), + ?line 2 = fun_refc(F), + receive Ref -> ok end, + {my_fun_tester,Node} ! {self(),F}, + F2 = receive + Fun when is_function(Fun) -> Fun; + Other -> ?line ?t:fail({unexpected,Other}) + end, + receive {'EXIT',Pid,normal} -> ok end, + + ?line 3 = fun_refc(F), + ?line 3 = fun_refc(F2), + ok. + +fun_refc(F) -> + {refc,Count} = erlang:fun_info(F, refc), + Count. + +const_propagation(Config) when is_list(Config) -> + ?line Fun1 = fun start_node/1, + ?line 2 = fun_refc(Fun1), + ?line Fun2 = Fun1, + ?line my_cmp({Fun1,Fun2}), + + ?line Fun3 = fun() -> ok end, + ?line 2 = fun_refc(Fun3), + ?line Fun4 = Fun3, + ?line my_cmp({Fun3,Fun4}), + ok. + +my_cmp({Fun,Fun}) -> ok; +my_cmp({Fun1,Fun2}) -> + io:format("Fun1: ~p", [erlang:fun_info(Fun1)]), + io:format("Fun2: ~p", [erlang:fun_info(Fun2)]), + ?t:fail(). + +t_arity(Config) when is_list(Config) -> + ?line 0 = fun_arity(fun() -> ok end), + ?line 0 = fun_arity(fun() -> Config end), + ?line 1 = fun_arity(fun(X) -> X+1 end), + ?line 1 = fun_arity(fun(X) -> Config =:= X end), + A = id(42), + + %% Test that the arity is transferred properly. + ?line process_flag(trap_exit, true), + ?line {ok,Node} = start_node(fun_test_arity), + ?line hello_world = spawn_call(Node, fun() -> hello_world end), + ?line 0 = spawn_call(Node, fun(X) -> X end), + ?line 42 = spawn_call(Node, fun(_X) -> A end), + ?line 43 = spawn_call(Node, fun(X, Y) -> A+X+Y end), + ?line 1 = spawn_call(Node, fun(X, Y) -> X+Y end), + ?line 45 = spawn_call(Node, fun(X, Y, Z) -> A+X+Y+Z end), + ok. + +t_is_function2(Config) when is_list(Config) -> + ?line true = is_function({a,b}, 0), + ?line true = is_function({a,b}, 234343434333433433), + ?line true = is_function(fun() -> ok end, 0), + ?line true = is_function(fun(_) -> ok end, 1), + ?line false = is_function(fun(_) -> ok end, 0), + + ?line true = is_function(fun erlang:abs/1, 1), + ?line true = is_function(fun erlang:abs/99, 99), + ?line false = is_function(fun erlang:abs/1, 0), + ?line false = is_function(fun erlang:abs/99, 0), + + ?line false = is_function(id(self()), 0), + ?line false = is_function(id({a,b,c}), 0), + ?line false = is_function(id({a}), 0), + ?line false = is_function(id([a,b,c]), 0), + + %% Bad arity argument. + ?line bad_arity(a), + ?line bad_arity(-1), + ?line bad_arity(-9738974938734938793873498378), + ?line bad_arity([]), + ?line bad_arity(fun() -> ok end), + ?line bad_arity({}), + ?line bad_arity({a,b}), + ?line bad_arity(self()), + ok. + +bad_arity(A) -> + {'EXIT',_} = (catch is_function(fun() -> ok end, A)), + {'EXIT',_} = (catch is_function(no_fun, A)), + ok. + +t_fun_info(Config) when is_list(Config) -> + ?line F = fun t_fun_info/1, + ?line try F(blurf) of + FAny -> + io:format("should fail; returned ~p\n", [FAny]), + ?line ?t:fail() + catch + error:function_clause -> ok + end, + ?line {module,?MODULE} = erlang:fun_info(F, module), + ?line case erlang:fun_info(F, name) of + undefined -> + ?line ?t:fail(); + _ -> ok + end, + ?line {arity,1} = erlang:fun_info(F, arity), + ?line {env,[]} = erlang:fun_info(F, env), + ?line verify_not_undef(F, index), + ?line verify_not_undef(F, uniq), + ?line verify_not_undef(F, new_index), + ?line verify_not_undef(F, new_uniq), + ?line verify_not_undef(F, refc), + ?line {'EXIT',_} = (catch erlang:fun_info(F, blurf)), + + %% Module fun. + ?line FF = fun ?MODULE:t_fun_info/1, + ?line try FF(blurf) of + FFAny -> + io:format("should fail; returned ~p\n", [FFAny]), + ?line ?t:fail() + catch + error:function_clause -> ok + end, + + ?line {module,?MODULE} = erlang:fun_info(FF, module), + ?line {name,t_fun_info} = erlang:fun_info(FF, name), + ?line {arity,1} = erlang:fun_info(FF, arity), + ?line {env,[]} = erlang:fun_info(FF, env), + ?line verify_undef(FF, index), + ?line verify_undef(FF, uniq), + ?line verify_undef(FF, new_index), + ?line verify_undef(FF, new_uniq), + ?line verify_undef(FF, refc), + ?line {'EXIT',_} = (catch erlang:fun_info(FF, blurf)), + + %% Not fun. + ?line bad_info(abc), + ?line bad_info(42), + ?line bad_info({fun erlang:list_to_integer/1}), + ?line bad_info([42]), + ?line bad_info([]), + ?line bad_info(self()), + ?line bad_info(<<>>), + ?line bad_info(<<1,2>>), + ok. + +bad_info(Term) -> + try erlang:fun_info(Term, module) of + Any -> + io:format("should fail; returned ~p\n", [Any]), + ?t:fail() + catch + error:badarg -> ok + end. + +verify_undef(Fun, Tag) -> + {Tag,undefined} = erlang:fun_info(Fun, Tag). + +verify_not_undef(Fun, Tag) -> + case erlang:fun_info(Fun, Tag) of + {Tag,undefined} -> + ?t:fail(); + {Tag,_} -> ok + end. + +id(X) -> + X. + +spawn_call(Node, AFun) -> + Pid = spawn_link(Node, + fun() -> + receive + {Fun,Fun,Fun} when is_function(Fun) -> + Arity = fun_arity(Fun), + Args = case Arity of + 0 -> []; + _ -> lists:seq(0, Arity-1) + end, + Res = apply(Fun, Args), + {pid,Creator} = erlang:fun_info(Fun, pid), + Creator ! {result,Res} + end + end), + Pid ! {AFun,AFun,AFun}, + Res = receive + {result,R} -> R; + Other -> ?t:fail({bad_message,Other}) + after 10000 -> + ?t:fail(timeout_waiting_for_result) + end, + receive + {'EXIT',Pid,normal} -> ok; + Other2 -> ?t:fail({bad_message_waiting_for_exit,Other2}) + after 10000 -> + ?t:fail(timeout_waiting_for_exit) + end, + Res. + +fun_arity(F) -> + {arity,Arity} = erlang:fun_info(F, arity), + Arity. + +start_node(Name) -> + Pa = filename:dirname(code:which(?MODULE)), + Cookie = atom_to_list(erlang:get_cookie()), + test_server:start_node(Name, slave, + [{args, "-setcookie " ++ Cookie ++" -pa " ++ Pa}]). + +wait_until(Fun) -> + case catch Fun() of + true -> ok; + _ -> receive after 100 -> wait_until(Fun) end + end. + +% stop_node(Node) -> +% test_server:stop_node(Node). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/gc_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/gc_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/gc_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/gc_SUITE.erl 2009-09-18 15:07:48.000000000 +0100 @@ -0,0 +1,181 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% Test the garbage collector (or Memory Recycler) + +-module(gc_SUITE). + +-include("test_server.hrl"). +-export([all/1]). + +-define(default_timeout, ?t:minutes(10)). + +-export([grow_heap/1, grow_stack/1, grow_stack_heap/1]). + +all(suite) -> + [grow_heap,grow_stack, grow_stack_heap]. + +grow_heap(doc) -> ["Produce a growing list of elements, ", + "for X calls, then drop one item per call", + "until the list is empty."]; +grow_heap(Config) when is_list(Config) -> + ?line Dog=test_server:timetrap(test_server:minutes(40)), + ?line ok=grow_heap1(256), + case os:type() of + vxworks -> + stop_here; + _ -> + ?line ok=grow_heap1(512), + ?line ok=grow_heap1(1024), + ?line ok=grow_heap1(2048) + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +grow_heap1(Len) -> + io:format("~ngrow_heap with ~p items.",[Len]), + show_heap("before:"), + grow_heap1([], Len, 0, up), + show_heap("after:"). + +grow_heap1(List, MaxLen, MaxLen, up) -> + show_heap("top:"), + grow_heap1(List, MaxLen, MaxLen-1, down); +grow_heap1(List, MaxLen, CurLen, up) -> + NewList=[make_arbit()|List], + grow_heap1(NewList, MaxLen, CurLen+1, up); +grow_heap1([], _MaxLen, _, down) -> + ok; +grow_heap1([_|List], MaxLen, CurLen, down) -> + ?line {_,_,C}=erlang:now(), + ?line Num=C rem (length(List))+1, + ?line Elem=lists:nth(Num, List), + ?line NewList=lists:delete(Elem, List), + grow_heap1(NewList, MaxLen, CurLen-1, down). + + + +grow_stack(doc) -> ["Increase and decrease stack size, and ", + "drop off some garbage from time to time."]; +grow_stack(Config) when is_list(Config) -> + ?line Dog=test_server:timetrap(test_server:minutes(80)), + show_heap("before:"), + case os:type() of + vxworks -> + ?line grow_stack1(25, 0); + _ -> + ?line grow_stack1(200, 0) + end, + show_heap("after:"), + ?line test_server:timetrap_cancel(Dog), + ok. + +grow_stack1(0, _) -> + ok; +grow_stack1(Recs, 0) -> +% show_heap("running:"), + grow_stack1(Recs-1, Recs), + grow_stack1(0,0); +grow_stack1(Recs, CurRecs) -> + grow_stack1(Recs, CurRecs-1), + make_arbit(), + grow_stack1(1,0), + ok. + + +%% Let's see how BEAM handles this one... +grow_stack_heap(doc) -> ["While growing the heap, bounces the size ", + "of the stack, and while reducing the heap", + "bounces the stack usage."]; +grow_stack_heap(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {comment, "Takes too long to run on VxWorks/cpu32"}; + _ -> + ?line Dog=test_server:timetrap(test_server:minutes(40)), + ?line grow_stack_heap1(16), + ?line grow_stack_heap1(32), + ?line test_server:timetrap_cancel(Dog), + ok + end. + +grow_stack_heap1(MaxLen) -> + io:format("~ngrow_stack_heap with ~p items.",[MaxLen]), + show_heap("before:"), + grow_stack_heap1([], MaxLen, 0, up), + show_heap("after:"). + +grow_stack_heap1(List, MaxLen, MaxLen, up) -> + show_heap("top:"), + grow_stack_heap1(List, MaxLen, MaxLen-1, down); +grow_stack_heap1(List, MaxLen, CurLen, up) -> + grow_stack1(CurLen*2,0), + grow_stack_heap1([make_arbit()|List], MaxLen, CurLen+1, up), + ok; + +grow_stack_heap1([], _MaxLen, _, down) -> ok; +grow_stack_heap1([_|List], MaxLen, CurLen, down) -> + grow_stack1(CurLen*2,0), + ?line {_,_,C}=erlang:now(), + ?line Num=C rem (length(List))+1, + ?line Elem=lists:nth(Num, List), + ?line NewList=lists:delete(Elem, List), + grow_stack_heap1(NewList, MaxLen, CurLen-1, down), + ok. + + +%% Create an arbitrary element/term. +make_arbit() -> + {AA,BB,CC}=erlang:now(), + A=AA+1, B=BB+1, C=CC+1, + New = + case C rem 9 of + 0 -> make_string((B div C) +5); + 1 -> C; + 2 -> make_ref(); + 3 -> self(); + 4 -> list_to_binary(make_string((C div B) + 12)); + 5 -> (C*B)/(A+1); + 6 -> list_to_tuple(make_string((B div C) +5)); + 7 -> list_to_atom(make_string(((C div B) rem 254) + 2)); + 8 -> fun(X) -> {X,AA,make_string((B div C)+10)} end + end, + New. + +%% Create an arbitrary string of a certain length. +make_string(Length) -> + Alph="abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"++ + "0123456789", + make_string(Alph, Length, []). + +make_string(_, 0, Acc) -> + Acc; +make_string(Alph, Length, Acc) -> + {_,_,C}=erlang:now(), + Pos=1+(Length*C rem length(Alph)), + make_string(Alph, Length-1, + [lists:nth(Pos,Alph)|Acc]). + +show_heap(String) -> + garbage_collect(self()), + receive after 1 -> ok end, + {heap_size, HSize}=process_info(self(), heap_size), + {stack_size, SSize}=process_info(self(), stack_size), + io:format("Heap/Stack "++String++"~p/~p", [HSize, SSize]). + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/guard_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/guard_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/guard_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/guard_SUITE.erl 2009-09-18 15:07:42.000000000 +0100 @@ -0,0 +1,390 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(guard_SUITE). + +-export([all/1, bad_arith/1, bad_tuple/1, test_heap_guards/1, guard_bifs/1, + type_tests/1]). + +-include("test_server.hrl"). + +-export([init/3]). +-import(lists, [member/2]). + +all(suite) -> [bad_arith, bad_tuple, test_heap_guards, guard_bifs, type_tests]. + +bad_arith(doc) -> "Test that a bad arithmetic operation in a guard works correctly."; +bad_arith(Config) when is_list(Config) -> + ?line 5 = bad_arith1(2, 3), + ?line 10 = bad_arith1(1, infinity), + ?line 10 = bad_arith1(infinity, 1), + ok. + +bad_arith1(T1, T2) when T1+T2 < 10 -> + T1+T2; +bad_arith1(_, _) -> + 10. + +bad_tuple(doc) -> "Test that bad arguments to element/2 are handled correctly."; +bad_tuple(Config) when is_list(Config) -> + ?line error = bad_tuple1(a), + ?line error = bad_tuple1({a, b}), + ?line x = bad_tuple1({x, b}), + ?line y = bad_tuple1({a, b, y}), + ok. + +bad_tuple1(T) when element(1, T) == x -> + x; +bad_tuple1(T) when element(3, T) == y -> + y; +bad_tuple1(_) -> + error. + +test_heap_guards(doc) -> ""; +test_heap_guards(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(2)), + + ?line process_flag(trap_exit, true), + ?line Tuple = {a, tuple, is, built, here, xxx}, + ?line List = [a, list, is, built, here], + + ?line 'try'(fun a_case/1, [Tuple], [Tuple]), + ?line 'try'(fun a_case/1, [List], [List, List]), + ?line 'try'(fun a_case/1, [a], [a]), + + ?line 'try'(fun an_if/1, [Tuple], [Tuple]), + ?line 'try'(fun an_if/1, [List], [List, List]), + ?line 'try'(fun an_if/1, [a], [a]), + + ?line 'try'(fun receive_test/1, [Tuple], [Tuple]), + ?line 'try'(fun receive_test/1, [List], [List, List]), + ?line 'try'(fun receive_test/1, [a], [a]), + ?line test_server:timetrap_cancel(Dog). + +a_case(V) -> + case V of + T when T == {a, tuple, is, built, here, xxx} -> + [T]; + L when L == [a, list, is, built, here] -> + [L, L]; + a -> + [a] + end. + +an_if(V) -> + if + V == {a, tuple, is, built, here, xxx} -> + [V]; + V == [a, list, is, built, here] -> + [V, V]; + V == a -> + [a] + end. + +receive_test(V) -> + self() ! V, + a_receive(). + +a_receive() -> + receive + T when T == {a, tuple, is, built, here, xxx} -> + [T]; + L when L == [a, list, is, built, here] -> + [L, L]; + a -> + [a] + end. + +'try'(Fun, Args, Result) -> + 'try'(512, Fun, Args, Result, []). + +'try'(0, _, _, _, _) -> + ok; +'try'(Iter, Fun, Args, Result, Filler) -> + Pid = spawn_link(?MODULE, init, [Fun,Args,list_to_tuple(Filler)]), + receive + {'EXIT', Pid, {result, Result}} -> + ?line 'try'(Iter-1, Fun, Args, Result, [0|Filler]); + {result, Other} -> + ?line io:format("Expected ~p; got ~p~n", [Result, Other]), + ?line test_server:fail(); + Other -> + ?line test_server:fail({unexpected_message, Other}) + end. + +init(Fun, Args, Filler) -> + Result = {result,apply(Fun, Args)}, + dummy(Filler), + exit(Result). + +dummy(_) -> + ok. + +guard_bifs(doc) -> "Test all guard bifs with nasty (but legal arguments)."; +guard_bifs(Config) when is_list(Config) -> + ?line Big = -237849247829874297658726487367328971246284736473821617265433, + ?line Float = 387924.874, + + %% Succeding use of guard bifs. + + ?line try_gbif('abs/1', Big, -Big), + ?line try_gbif('float/1', Big, float(Big)), + ?line try_gbif('float/1', Big, float(id(Big))), + ?line try_gbif('trunc/1', Float, 387924.0), + ?line try_gbif('round/1', Float, 387925.0), + ?line try_gbif('length/1', [], 0), + + ?line try_gbif('length/1', [a], 1), + ?line try_gbif('length/1', [a, b], 2), + ?line try_gbif('length/1', lists:seq(0, 31), 32), + + ?line try_gbif('hd/1', [a], a), + ?line try_gbif('hd/1', [a, b], a), + + ?line try_gbif('tl/1', [a], []), + ?line try_gbif('tl/1', [a, b], [b]), + ?line try_gbif('tl/1', [a, b, c], [b, c]), + + ?line try_gbif('size/1', {}, 0), + ?line try_gbif('size/1', {a}, 1), + ?line try_gbif('size/1', {a, b}, 2), + ?line try_gbif('size/1', {a, b, c}, 3), + ?line try_gbif('size/1', list_to_binary([]), 0), + ?line try_gbif('size/1', list_to_binary([1]), 1), + ?line try_gbif('size/1', list_to_binary([1, 2]), 2), + ?line try_gbif('size/1', list_to_binary([1, 2, 3]), 3), + + ?line try_gbif('bit_size/1', <<0:7>>, 7), + + ?line try_gbif('element/2', {x}, {1, x}), + ?line try_gbif('element/2', {x, y}, {1, x}), + ?line try_gbif('element/2', {x, y}, {2, y}), + + ?line try_gbif('self/0', 0, self()), + ?line try_gbif('node/0', 0, node()), + ?line try_gbif('node/1', self(), node()), + + %% Failing use of guard bifs. + + ?line try_fail_gbif('abs/1', Big, 1), + ?line try_fail_gbif('abs/1', [], 1), + + ?line try_fail_gbif('float/1', Big, 42), + ?line try_fail_gbif('float/1', [], 42), + + ?line try_fail_gbif('trunc/1', Float, 0.0), + ?line try_fail_gbif('trunc/1', [], 0.0), + + ?line try_fail_gbif('round/1', Float, 1.0), + ?line try_fail_gbif('round/1', [], a), + + ?line try_fail_gbif('length/1', [], 1), + ?line try_fail_gbif('length/1', [a], 0), + ?line try_fail_gbif('length/1', a, 0), + ?line try_fail_gbif('length/1', {a}, 0), + + ?line try_fail_gbif('hd/1', [], 0), + ?line try_fail_gbif('hd/1', [a], x), + ?line try_fail_gbif('hd/1', x, x), + + ?line try_fail_gbif('tl/1', [], 0), + ?line try_fail_gbif('tl/1', [a], x), + ?line try_fail_gbif('tl/1', x, x), + + ?line try_fail_gbif('size/1', {}, 1), + ?line try_fail_gbif('size/1', [], 0), + ?line try_fail_gbif('size/1', [a], 1), + ?line try_fail_gbif('size/1', fun() -> 1 end, 0), + ?line try_fail_gbif('size/1', fun() -> 1 end, 1), + + ?line try_fail_gbif('element/2', {}, {1, x}), + ?line try_fail_gbif('element/2', {x}, {1, y}), + ?line try_fail_gbif('element/2', [], {1, z}), + + ?line try_fail_gbif('self/0', 0, list_to_pid("<0.0.0>")), + ?line try_fail_gbif('node/0', 0, xxxx), + ?line try_fail_gbif('node/1', self(), xxx), + ?line try_fail_gbif('node/1', yyy, xxx), + ok. + +try_gbif(Id, X, Y) -> + case guard_bif(Id, X, Y) of + {Id, X, Y} -> + io:format("guard_bif(~p, ~p, ~p) -- ok", [Id, X, Y]); + Other -> + ?line ok = io:format("guard_bif(~p, ~p, ~p) -- bad result: ~p\n", + [Id, X, Y, Other]), + ?line test_server:fail() + end. + +try_fail_gbif(Id, X, Y) -> + case catch guard_bif(Id, X, Y) of + {'EXIT', {function_clause,[{?MODULE,guard_bif,[Id,X,Y]}|_]}} -> + io:format("guard_bif(~p, ~p, ~p) -- ok", [Id,X,Y]); + Other -> + ?line ok = io:format("guard_bif(~p, ~p, ~p) -- bad result: ~p\n", + [Id, X, Y, Other]), + ?line test_server:fail() + end. + +guard_bif('abs/1', X, Y) when abs(X) == Y -> + {'abs/1', X, Y}; +guard_bif('float/1', X, Y) when float(X) == Y -> + {'float/1', X, Y}; +guard_bif('trunc/1', X, Y) when trunc(X) == Y -> + {'trunc/1', X, Y}; +guard_bif('round/1', X, Y) when round(X) == Y -> + {'round/1', X, Y}; +guard_bif('length/1', X, Y) when length(X) == Y -> + {'length/1', X, Y}; +guard_bif('hd/1', X, Y) when hd(X) == Y -> + {'hd/1', X, Y}; +guard_bif('tl/1', X, Y) when tl(X) == Y -> + {'tl/1', X, Y}; +guard_bif('size/1', X, Y) when size(X) == Y -> + {'size/1', X, Y}; +guard_bif('bit_size/1', X, Y) when bit_size(X) == Y -> + {'bit_size/1', X, Y}; +guard_bif('element/2', X, {Pos, Expected}) when element(Pos, X) == Expected -> + {'element/2', X, {Pos, Expected}}; +guard_bif('self/0', X, Y) when self() == Y -> + {'self/0', X, Y}; +guard_bif('node/0', X, Y) when node() == Y -> + {'node/0', X, Y}; +guard_bif('node/1', X, Y) when node(X) == Y -> + {'node/1', X, Y}. + +type_tests(doc) -> "Test the type tests."; +type_tests(Config) when is_list(Config) -> + ?line Types = all_types(), + ?line Tests = type_test_desc(), + ?line put(errors, 0), + ?line put(violations, 0), + ?line type_tests(Tests, Types), + ?line case {get(errors), get(violations)} of + {0, 0} -> + ok; + {0, N} -> + {comment, integer_to_list(N) ++ " standard violation(s)"}; + {Errors, Violations} -> + io:format("~p sub test(s) failed, ~p violation(s)", + [Errors, Violations]), + ?line test_server:fail() + end. + +type_tests([{Test, AllowedTypes}| T], AllTypes) -> + type_tests(Test, AllTypes, AllowedTypes), + type_tests(T, AllTypes); +type_tests([], _) -> + ok. + +type_tests(Test, [Type|T], Allowed) -> + {TypeTag, Value} = Type, + case member(TypeTag, Allowed) of + true -> + case catch type_test(Test, Value) of + Test -> + ok; + _Other -> + io:format("Test ~p(~p) failed", [Test, Value]), + put(errors, get(errors) + 1) + end; + false -> + case catch type_test(Test, Value) of + {'EXIT', {function_clause, {?MODULE,type_test,[Test,Value]}}} -> + ok; + {'EXIT', {function_clause,[{?MODULE,type_test,[Test,Value]}|_]}} -> + ok; + {'EXIT',Other} -> + ?line test_server:fail({unexpected_error_reason,Other}); + tuple when is_function(Value) -> + io:format("Standard violation: Test ~p(~p) should fail", + [Test, Value]), + put(violations, get(violations) + 1); + _Other -> + io:format("Test ~p(~p) succeeded (should fail)", [Test, Value]), + put(errors, get(errors) + 1) + end + end, + type_tests(Test, T, Allowed); +type_tests(_, [], _) -> + ok. + +all_types() -> + [{small, 42}, + {big, 392742928742947293873938792874019287447829874290742}, + {float, 3.14156}, + {nil, []}, + {cons, [a]}, + {tuple, {a, b}}, + {atom, xxxx}, + {ref, make_ref()}, + {pid, self()}, + {port, open_port({spawn, efile}, [])}, + {function, fun(_) -> "" end}, + {function, fun erlang:abs/1}, + {binary, list_to_binary([])}, + {bitstring, <<0:7>>}]. + +type_test_desc() -> + [{binary, [binary]}, + {bitstring, [binary, bitstring]}, + {integer, [small, big]}, + {float, [float]}, + {number, [small, big, float]}, + {atom, [atom]}, + {list, [cons, nil]}, + {nonempty_list, [cons]}, + {nil, [nil]}, + {tuple, [tuple]}, + {pid, [pid]}, + {port, [port]}, + {reference, [ref]}, + {function, [function]}]. + +type_test(integer, X) when is_integer(X) -> + integer; +type_test(float, X) when is_float(X) -> + float; +type_test(number, X) when is_number(X) -> + number; +type_test(atom, X) when is_atom(X) -> + atom; +type_test(list, X) when is_list(X) -> + list; +type_test(nonempty_list, [_]) -> + nonempty_list; +type_test(nil, []) -> + nil; +type_test(tuple, X) when is_tuple(X) -> + tuple; +type_test(pid, X) when is_pid(X) -> + pid; +type_test(reference, X) when is_reference(X) -> + reference; +type_test(port, X) when is_port(X) -> + port; +type_test(binary, X) when is_binary(X) -> + binary; +type_test(bitstring, X) when is_bitstring(X) -> + bitstring; +type_test(function, X) when is_function(X) -> + function. + +id(I) -> I. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/hash_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/hash_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/hash_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/hash_SUITE.erl 2009-09-18 15:08:11.000000000 +0100 @@ -0,0 +1,717 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% +%% Verifying erlang:phash/2. And now also phash2/2, to some extent. +%% Test the hashing algorithm for integer numbers in 2 ways: +%% 1 Test that numbers in diferent sequences get sufficiently spread +%% in a "bit pattern" way (modulo 256 etc). +%% 2 Test that numbers are correctly hashed compared to a reference implementation, +%% regardless of their internal representation. The hashing algorithm should never +%% change. +%% The hashing of other datatypes is tested with a few samples, so that we are sure +%% it does not change across versions. +%% Also tests that the limit can be between 0 and 16#FFFFFFFF. +%% +-module(hash_SUITE). +-export([basic_test/0,cmp_test/1,range_test/0,spread_test/1, + phash2_test/0, otp_5292_test/0, bit_level_binaries/0, + otp_7127_test/0]). +-compile({nowarn_deprecated_function, {erlang,hash,2}}). + +%% +%% Define to run outside of test server +%% +%-define(STANDALONE,1). + +%% +%% Define for debug output +%% +%-define(debug,1). + +-ifdef(STANDALONE). +-define(config(A,B),config(A,B)). +-export([config/2]). +-else. +-include("test_server.hrl"). +-endif. + +-ifdef(debug). +-ifdef(STANDALONE). +-define(line, erlang:display({?MODULE,?LINE}), ). +-endif. +-define(dbgformat(A,B),io:format(A,B)). +-else. +-ifdef(STANDALONE). +-define(line, noop, ). +-endif. +-define(dbgformat(A,B),noop). +-endif. + +-ifdef(STANDALONE). +config(priv_dir,_) -> + ".". +-else. +%% When run in test server. +-export([all/1,test_basic/1,test_cmp/1,test_range/1,test_spread/1, + test_phash2/1,otp_5292/1,bit_level_binaries/1,otp_7127/1, + fin_per_testcase/2,init_per_testcase/2]). +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(test_server:minutes(10)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. +all(doc) -> + ["Test erlang:phash"]; +all(suite) -> + [test_basic, test_cmp, test_range, test_spread, test_phash2, otp_5292, + bit_level_binaries, otp_7127]. + +test_basic(suite) -> + []; +test_basic(doc) -> + ["Tests basic functionality of erlang:phash and that the " + "hashes has not changed (neither hash nor phash)"]; +test_basic(Config) when is_list(Config) -> + basic_test(). + + +test_cmp(suite) -> + []; +test_cmp(doc) -> + ["Compares integer hashes made by erlang:phash with those of a reference " + "implementation"]; +test_cmp(Config) when is_list(Config) -> + cmp_test(10000). + +test_range(suite) -> + []; +test_range(doc) -> + ["Tests ranges on erlang:phash from 1 to 2^32"]; +test_range(Config) when is_list(Config) -> + range_test(). + +test_spread(suite) -> + []; +test_spread(doc) -> + ["Tests that the hashes are spread ok"]; +test_spread(Config) when is_list(Config) -> + spread_test(10). + +test_phash2(suite) -> + []; +test_phash2(doc) -> + ["Tests phash2"]; +test_phash2(Config) when is_list(Config) -> + phash2_test(). + +otp_5292(suite) -> + []; +otp_5292(doc) -> + ["Tests hash, phash and phash2 regarding integers."]; +otp_5292(Config) when is_list(Config) -> + otp_5292_test(). + +%% Test hashing bit-level binaries. +bit_level_binaries(Config) when is_list(Config) -> + bit_level_binaries(). + +otp_7127(suite) -> + []; +otp_7127(doc) -> + ["Tests phash2/1."]; +otp_7127(Config) when is_list(Config) -> + otp_7127_test(). + +-endif. + + + +%% +%% Here are the real tests, they can be run without test_server, +%% define -DSTANDALONE when compiling. +%% +basic_test() -> + ?line 685556714 = erlang:phash({a,b,c},16#FFFFFFFF), + ?line 14468079 = erlang:hash({a,b,c},16#7FFFFFF), + ?line 37442646 = erlang:phash([a,b,c,{1,2,3},c:pid(0,2,3), + 16#77777777777777],16#FFFFFFFF), + ?line Comment = case erlang:hash([a,b,c,{1,2,3},c:pid(0,2,3), + 16#77777777777777],16#7FFFFFF) of + 102727602 -> + ?line big = erlang:system_info(endian), + "Big endian machine"; + 105818829 -> + ?line little = erlang:system_info(endian), + "Little endian machine" + end, + ExternalReference = <<131,114,0,3,100,0,13,110,111,110,111,100,101,64, + 110,111,104,111,115,116,0,0,0,0,122,0,0,0,0,0,0,0,0>>, + ?line 1113403635 = erlang:phash(binary_to_term(ExternalReference), + 16#FFFFFFFF), + ?line 123 = erlang:hash(binary_to_term(ExternalReference), + 16#7FFFFFF), + ExternalFun = <<131,117,0,0,0,3,103,100,0,13,110,111,110,111,100,101,64, + 110,111,104,111,115,116,0,0,0,38,0,0,0,0,0,100,0,8,101, + 114,108,95,101,118,97,108,97,20,98,5,182,139,98,108,0,0, + 0,3,104,2,100,0,1,66,109,0,0,0,33,131,114,0,3,100,0,13, + 110,111,110,111,100,101,64,110,111,104,111,115,116,0,0, + 0,0,122,0,0,0,0,0,0,0,0,104,2,100,0,1,76,107,0,33,131, + 114,0,3,100,0,13,110,111,110,111,100,101,64,110,111,104, + 111,115,116,0,0,0,0,122,0,0,0,0,0,0,0,0,104,2,100,0,1,82, + 114,0,3,100,0,13,110,111,110,111,100,101,64,110,111,104, + 111,115,116,0,0,0,0,122,0,0,0,0,0,0,0,0,106,108,0,0,0,1, + 104,5,100,0,6,99,108,97,117,115,101,97,1,106,106,108,0,0, + 0,1,104,3,100,0,7,105,110,116,101,103,101,114,97,1,97,1, + 106,106,104,3,100,0,4,101,118,97,108,104,2,100,0,5,115, + 104,101,108,108,100,0,10,108,111,99,97,108,95,102,117, + 110,99,108,0,0,0,1,103,100,0,13,110,111,110,111,100,101, + 64,110,111,104,111,115,116,0,0,0,22,0,0,0,0,0,106>>, + ?line 170987488 = erlang:phash(binary_to_term(ExternalFun), + 16#FFFFFFFF), + ?line 124460689 = erlang:hash(binary_to_term(ExternalFun), + 16#7FFFFFF), + case (catch erlang:phash(1,0)) of + {'EXIT',{badarg, _}} -> + {comment, Comment}; + _ -> + exit(phash_accepted_zero_as_range) + end. + + +range_test() -> + random:seed(), + F = fun(From,From,_FF) -> + ok; + (From,To,FF) -> + R = random:uniform(16#FFFFFFFFFFFFFFFF), + X = erlang:phash(R, From), + Y = erlang:phash(R, 16#100000000) - 1, + Z = (Y rem From) + 1, + case X =:= Z of + true -> + FF(From*2,To,FF); + _ -> + exit({range_test_failed, hash_on, R, range, From}) + end + end, + F(1,16#100000000,F). + + + +spread_test(N) -> + ?line test_fun(N,{erlang,phash},16#50000000000,fun(X) -> + X + end), + ?line test_fun(N,{erlang,phash},0,fun(X) -> + X + end), + ?line test_fun(N,{erlang,phash},16#123456789ABCDEF123456789ABCDEF,fun(X) -> + X + end), + ?line test_fun(N,{erlang,phash},16#50000000000,fun(X) -> + integer_to_list(X) + end), + ?line test_fun(N,{erlang,phash},16#50000000000,fun(X) -> + integer_to_bytelist(X,[]) + end), + ?line test_fun(N,{erlang,phash},16#50000000000,fun(X) -> + integer_to_binary(X) + end). + + + +cmp_test(N) -> + % No need to save seed, the error indicates what number caused it. + random:seed(), + do_cmp_hashes(N,8). +do_cmp_hashes(0,_) -> + ok; +do_cmp_hashes(N,Steps) -> + ?line R0 = random:uniform(1 bsl Steps - 1) + random:uniform(16#FFFFFFFF), + ?line R = case random:uniform(2) of + 1 -> + R0; + _ -> + -R0 + end, + ?line NSteps = case N rem 10 of + 0 -> + case (Steps + 8) rem 1024 of + 0 -> + 8; + OK -> + OK + end; + _ -> + Steps + end, + ?line X = erlang:phash(R,16#FFFFFFFF), + ?line Y = make_hash(R,16#FFFFFFFF), + ?line case X =:= Y of + true -> + do_cmp_hashes(N - 1, NSteps); + _ -> + exit({missmatch_on_input, R, phash, X, make_hash, Y}) + end. + +phash2_test() -> + Max = 1 bsl 32, + BPort = <<131,102,100,0,13,110,111,110,111,100,101,64,110,111,104, + 111,115,116,0,0,0,1,0>>, + Port = binary_to_term(BPort), + + BXPort = <<131,102,100,0,11,97,112,97,64,108,101,103,111,108,97,115, + 0,0,0,24,3>>, + XPort = binary_to_term(BXPort), + + BRef = <<131,114,0,3,100,0,13,110,111,110,111,100,101,64,110,111,104, + 111,115,116,0,0,0,1,255,0,0,0,0,0,0,0,0>>, + Ref = binary_to_term(BRef), + + BXRef = <<131,114,0,3,100,0,11,97,112,97,64,108,101,103,111,108,97,115, + 2,0,0,0,155,0,0,0,0,0,0,0,0>>, + XRef = binary_to_term(BXRef), + + BXPid = <<131,103,100,0,11,97,112,97,64,108,101,103,111,108,97,115, + 0,0,0,36,0,0,0,0,1>>, + XPid = binary_to_term(BXPid), + + + %% X = f1(), Y = f2(), Z = f3(X, Y), + + %% F1 = fun f1/0, % -> abc + B1 = <<131,112,0,0,0,66,0,215,206,77,69,249,50,170,17,129,47,21,98, + 13,196,76,242,0,0,0,1,0,0,0,0,100,0,1,116,97,1,98,2,195,126, + 58,103,100,0,13,110,111,110,111,100,101,64,110,111,104,111, + 115,116,0,0,0,112,0,0,0,0,0>>, + F1 = binary_to_term(B1), + + %% F2 = fun f2/0, % -> abd + B2 = <<131,112,0,0,0,66,0,215,206,77,69,249,50,170,17,129,47,21,98, + 13,196,76,242,0,0,0,2,0,0,0,0,100,0,1,116,97,2,98,3,130,152, + 185,103,100,0,13,110,111,110,111,100,101,64,110,111,104,111, + 115,116,0,0,0,112,0,0,0,0,0>>, + F2 = binary_to_term(B2), + + %% F3 = fun f3/2, % -> {abc, abd} + B3 = <<131,112,0,0,0,66,2,215,206,77,69,249,50,170,17,129,47,21,98, + 13,196,76,242,0,0,0,3,0,0,0,0,100,0,1,116,97,3,98,7,168,160, + 93,103,100,0,13,110,111,110,111,100,101,64,110,111,104,111, + 115,116,0,0,0,112,0,0,0,0,0>>, + F3 = binary_to_term(B3), + + %% F4 = fun () -> 123456789012345678901234567 end, + B4 = <<131,112,0,0,0,66,0,215,206,77,69,249,50,170,17,129,47,21,98, + 13,196,76,242,0,0,0,4,0,0,0,0,100,0,1,116,97,4,98,2,230,21, + 171,103,100,0,13,110,111,110,111,100,101,64,110,111,104,111, + 115,116,0,0,0,112,0,0,0,0,0>>, + F4 = binary_to_term(B4), + + %% F5 = fun() -> {X,Y,Z} end, + B5 = <<131,112,0,0,0,92,0,215,206,77,69,249,50,170,17,129,47,21,98, + 13,196,76,242,0,0,0,5,0,0,0,3,100,0,1,116,97,5,98,0,99,101, + 130,103,100,0,13,110,111,110,111,100,101,64,110,111,104,111, + 115,116,0,0,0,112,0,0,0,0,0,100,0,3,97,98,99,100,0,3,97,98, + 100,104,2,100,0,3,97,98,99,100,0,3,97,98,100>>, + F5 = binary_to_term(B5), + + Chars = lists:seq(32,127), + NotAHeapBin = list_to_binary(lists:flatten(lists:duplicate(500,Chars))), + <<_:128,SubBin/binary>> = NotAHeapBin, + L = [%% nil + {[], 3468870702}, + + %% atom :( not very good ): + %% (cannot use block_hash due to compatibility issues...) + {abc,26499}, + {abd,26500}, + + %% small + {0,3175731469}, + {1, 539485162}, + {-1, 1117813597}, + {1 bsl 20, 1477815345}, + {-(1 bsl 20), 3076904293}, + + %% bignum + {4294967296, 2108323275}, + {-4294967296, 2586067094}, + {981494972710656, 1622082818}, + {-981494972710656, 3367191372}, + {36893488147419103232, 2545846594}, + {-36893488147419103232, 1649047068}, + {1606938044258990275541962092341162602522202993782792835301376, + 2573322433}, + {-1606938044258990275541962092341162602522202993782792835301376, + 2288753377}, + + %% binary + {<<>>, 147926629}, + {<<0:8>>, 2914887855}, + {<<0:32>>, 2014511533}, + {<<"abc">>, 1306188027}, + {<<"12345678901234567890">>, 3021061640}, + {NotAHeapBin,2644086993}, + {SubBin,3575839236}, + + %% unaligned sub binaries + {unaligned_sub_bin(<<>>), 147926629}, + {unaligned_sub_bin(<<0:8>>), 2914887855}, + {unaligned_sub_bin(<<0:32>>), 2014511533}, + {unaligned_sub_bin(<<"abc">>), 1306188027}, + {unaligned_sub_bin(<<"12345678901234567890">>), 3021061640}, + {unaligned_sub_bin(NotAHeapBin),2644086993}, + {unaligned_sub_bin(SubBin),3575839236}, + + %% bit-level binaries + {<<0:7>>, 1055790816}, + {<<"abc",13:4>>, 670412287}, + {<<5:3,"12345678901234567890">>, 289973273}, + + %% fun + {F1, 3826013332}, + {F2, 126009152}, + {F3, 3482452479}, + {F4, 633704783}, + {F5, 1241537408}, + + %% module fun + {fun lists:map/2, 840287883}, + {fun lists:map/3, 2318478565}, + {fun lists:filter/2, 635165125}, + {fun lists:filter/3, 3824649396}, + {fun xxx:map/2, 2630071865}, + {fun xxx:map/3, 4237970519}, + + %% pid + {c:pid(0,0,0), 2858162279}, + {c:pid(0,1,0), 2870503209}, + {c:pid(0,2,0), 1707788908}, + {XPid, 1290188489}, + + %% port + {Port,1954394636}, + {XPort,274735}, + + %% ref + {Ref, 1675501484}, + {XRef, 3845846926}, + + %% float + {0.0, 423528920}, + {3.14, 3731709215}, + {-3.14, 1827518724}, + + %% list + {[0.0], 167906877}, + {[{}], 4050867804}, + {[<<>>], 440873397}, + {[[]], 499070068}, + {[abc], 3112446404}, + {[a,b,c], 1505666924}, + {[a,b|c], 433753489}, + {"abc", 519996486}, + {"abc"++[1009], 290369864}, + {"abc"++[1009]++"de", 4134369195}, + {"1234567890123456", 963649519}, + + %% tuple + {{}, 221703996}, + {{{}}, 2165044361}, + {{<<>>}, 682464809}, + {{0.0}, 688441152}, + {{[]}, 1775079505}, + {{abc}, 2032039329}, + {{a,1,{},-3.14}, 1364396939}, + {{c:pid(0,2,0)}, 686997880}, + {{F4}, 2279632930}, + {{a,<<>>}, 2724468891}, + {{b,<<>>}, 2702508511} + ], + SpecFun = fun(S) -> sofs:no_elements(S) > 1 end, + F = sofs:relation_to_family(sofs:converse(sofs:relation(L))), + D = sofs:to_external(sofs:family_specification(SpecFun, F)), + ?line [] = D, + ?line [] = [{E,H,H2} || {E,H} <- L, (H2 = erlang:phash2(E, Max)) =/= H], + ok. + +-ifdef(FALSE). +f1() -> + abc. + +f2() -> + abd. + +f3(X, Y) -> + {X, Y}. +-endif. + +otp_5292_test() -> + H = fun(E) -> [erlang:hash(E, 16#7FFFFFF), + erlang:hash(-E, 16#7FFFFFF)] + end, + S1 = md5([md5(hash_int(S, E, H)) || {Start, N, Sz} <- d(), + {S, E} <- int(Start, N, Sz)]), + PH = fun(E) -> [erlang:phash(E, 1 bsl 32), + erlang:phash(-E, 1 bsl 32), + erlang:phash2(E, 1 bsl 32), + erlang:phash2(-E, 1 bsl 32)] + end, + S2 = md5([md5(hash_int(S, E, PH)) || {Start, N, Sz} <- d(), + {S, E} <- int(Start, N, Sz)]), + ?line Comment = case S1 of + <<43,186,76,102,87,4,110,245,203,177,206,6,130,69,43,99>> -> + ?line big = erlang:system_info(endian), + "Big endian machine"; + <<21,206,139,15,149,28,167,81,98,225,132,254,49,125,174,195>> -> + ?line little = erlang:system_info(endian), + "Little endian machine" + end, + ?line <<140,37,79,80,26,242,130,22,20,229,123,240,223,244,43,99>> = S2, + ?line 2 = erlang:hash(1, (1 bsl 27) -1), + ?line {'EXIT', _} = (catch erlang:hash(1, (1 bsl 27))), + {comment, Comment}. + +d() -> + [%% Start, NumOfIntervals, SizeOfInterval + {(1 bsl I)-100, 2, 100} || I <- lists:seq(1, 1000)]. + +int(Start, N, Sz) -> + {_, R} = lists:mapfoldl(fun(S, Acc) -> + {S + Sz, [{S,S+Sz-1} | Acc]} + end, [], lists:seq(Start, Start+(N-1)*Sz, Sz)), + lists:reverse(R). + +hash_int(Start, End, F) -> + HL = lists:flatmap(fun(E) -> F(E) end, lists:seq(Start, End)), + {Start, End, md5(HL)}. + +md5(T) -> + erlang:md5(term_to_binary(T)). + +bit_level_binaries() -> + ?line [3511317,7022633,14044578,28087749,56173436,112344123,90467083|_] = + bit_level_all_different(fun erlang:hash/2), + ?line [3511317,7022633,14044578,28087749,56173436,112344123,90467083|_] = + bit_level_all_different(fun erlang:phash/2), + ?line [102233154,19716,102133857,4532024,123369135,24565730,109558721|_] = + bit_level_all_different(fun erlang:phash2/2), + + ?line 13233341 = test_hash_phash(<<42:7>>, 16#7FFFFFF), + ?line 79121243 = test_hash_phash(<<99:7>>, 16#7FFFFFF), + ?line 95517726 = test_hash_phash(<<16#378ABF73:31>>, 16#7FFFFFF), + + ?line 64409098 = test_phash2(<<99:7>>, 16#7FFFFFF), + ?line 55555814 = test_phash2(<<123,19:2>>, 16#7FFFFFF), + ?line 83868582 = test_phash2(<<123,45,6:3>>, 16#7FFFFFF), + ?line 2123204 = test_phash2(<<123,45,7:3>>, 16#7FFFFFF), + + ok. + +bit_level_all_different(Hash) -> + {name,Name} = erlang:fun_info(Hash, name), + Seq = lists:seq(1, 32), + Hashes0 = [Hash(<<1:Sz>>, 16#7FFFFFF) || Sz <- Seq], + io:format("~p/2 ~p", [Name,Hashes0]), + Hashes0 = [Hash(unaligned_sub_bitstr(<<1:Sz>>), 16#7FFFFFF) || Sz <- Seq], + 32 = length(lists:usort(Hashes0)), + + Hashes1 = [Hash(<<(1 bsl (Sz-1)):Sz>>, 16#7FFFFFF) || Sz <- Seq], + io:format("~p/2 ~p", [Name,Hashes1]), + Hashes1 = [Hash(unaligned_sub_bitstr(<<(1 bsl (Sz-1)):Sz>>), 16#7FFFFFF) || + Sz <- Seq], + 32 = length(lists:usort(Hashes1)), + + Hashes2 = [Hash(<<0:Sz>>, 16#7FFFFFF) || Sz <- Seq], + io:format("~p/2 ~p", [Name,Hashes2]), + Hashes2 = [Hash(unaligned_sub_bitstr(<<0:Sz>>), 16#7FFFFFF) || Sz <- Seq], + 32 = length(lists:usort(Hashes2)), + + Hashes1. + +test_hash_phash(Bitstr, Rem) -> + Hash = erlang:hash(Bitstr, Rem), + Hash = erlang:phash(Bitstr, Rem), + Hash = erlang:hash(unaligned_sub_bitstr(Bitstr), Rem), + Hash = erlang:phash(unaligned_sub_bitstr(Bitstr), Rem). + +test_phash2(Bitstr, Rem) -> + Hash = erlang:phash2(Bitstr, Rem), + Hash = erlang:phash2(unaligned_sub_bitstr(Bitstr), Rem). + +otp_7127_test() -> + %% Used to return 2589127136. + ?line 38990304 = erlang:phash2(<<"Scott9">>), + ok. + +%% +%% Reference implementation of integer hashing +%% + +%% +%% These are primes just above 2^28 that will never be changed, they are also in +%% utils.c. +%% +-define(FN2,268439161). +-define(FN3,268435459). +-define(FN4,268436141). + +make_hash(N,M) -> + Prime1 = ?FN2, + {Prime2, BL0} = to_bytes(N), + BL = pad(BL0), + (integer_hash(BL, Prime1, Prime2) rem M) + 1. + +to_bytes(N) when N < 0 -> + {?FN4,to_bytes(-N,[])}; +to_bytes(N) -> + {?FN3,to_bytes(N,[])}. +to_bytes(0,Acc) -> + Acc; +to_bytes(N,Acc) -> + to_bytes(N bsr 8, [N band 16#FF | Acc]). + +pad([]) -> + [0,0,0,0]; +pad(L) -> + case 4 - (length(L) rem 4) of + 4 -> + L; + N -> + lists:duplicate(N,0) ++ L + end. + +integer_hash(BL,P1,P2) -> + (do_ihash(0,lists:reverse(BL),P1) * P2) band 16#FFFFFFFF. + +do_ihash(Hash,[],_) -> + Hash; +do_ihash(Hash, [H|T], P) -> + do_ihash((((Hash * P) band 16#FFFFFFFF) + H) band 16#FFFFFFFF, T, P). + + + + +%% +%% Utilities for the test of "spreading" +%% +-ifdef(debug). +hex(N) -> + hex(0,N,[]). +hex(X,0,Acc) when X >= 8 -> + [$0, $x | Acc]; +hex(X,N,Acc) -> + hex(X+1,N bsr 4, [trans(N band 16#F) | Acc]). + +trans(N) when N < 10 -> + N + $0; +trans(10) -> + $A; +trans(11) -> + $B; +trans(12) -> + $C; +trans(13) -> + $D; +trans(14) -> + $E; +trans(15) -> + $F. +-endif. + +gen_keys(N, Template, BP,Fun) -> + Ratio = (1 bsl (BP * 8)), + Low = Template + Ratio, + High = Template + (N*Ratio), + ?dbgformat("N = ~p, BP = ~p, Template = ~p, Low = ~s, High = ~s~n", + [hex(N),hex(BP),hex(Template),hex(Low),hex(High-1)]), + Fun(Template), + gen_keys2(Low, High,Ratio,Fun). + +gen_keys2(High,High2,_,_) when High >= High2 -> + []; +gen_keys2(Low,High,R,Fun) -> + Fun(Low), + gen_keys2(Low + R,High,R,Fun). + +test_fun(N,{HM,HF}, Template, Fun) -> + init_table(), + test_fun_1(0,1,N+1,{HM,HF},Template,Fun). + +test_fun_1(_,To,To,_,_,_) -> + ok; +test_fun_1(A,X,To,Y,Z,W) when A > To -> + ?dbgformat("~p:~p(~p,~p,~p,~p,~p,~p)~n",[?MODULE,test_fun_1,To,X,To,Y,Z,W]), + test_fun_1(0,X+1,To,Y,Z,W); +test_fun_1(Pos,Siz,To,{HM,HF},Template,Fun) when 1 bsl (Siz*8) =< 65536 -> + io:format("Byte: ~p, Size: ~p~n",[Pos,Siz]), + N = 1 bsl (Siz*8), + gen_keys(N,Template,Pos,fun (X) -> + P = HM:HF(Fun(X),N), + ets:insert(?MODULE,{P}) + end + ), + Hits = collect_hits(), + io:format( + "Hashing of ~p values spread over ~p buckets~n", + [N,Hits]), + case (N div Hits) > 2 of + true -> + exit({not_spread_enough, Hits, on, N}); + _ -> + test_fun_1(Pos + Siz, Siz, To,{HM,HF},Template,Fun) + end; +test_fun_1(_,_,_,_,_,_) -> + ok. + +init_table() -> + (catch ets:delete(?MODULE)), + ets:new(?MODULE,[ordered_set,named_table]). + +collect_hits() -> + N = ets:info(?MODULE,size), + init_table(), + N. + +integer_to_binary(N) -> + list_to_binary(lists:reverse(integer_to_bytelist(N,[]))). + +integer_to_bytelist(0,Acc) -> + Acc; +integer_to_bytelist(N,Acc) -> + integer_to_bytelist(N bsr 8, [N band 16#FF | Acc]). + +unaligned_sub_bin(Bin0) when is_binary(Bin0) -> + Bin1 = <<42:6,Bin0/binary,3:2>>, + Sz = size(Bin0), + <<42:6,Bin:Sz/binary,3:2>> = id(Bin1), + Bin. + +unaligned_sub_bitstr(Bin0) when is_bitstring(Bin0) -> + Bin1 = <<(-1):4,Bin0/bits,(-1):64>>, + Bits = bit_size(Bin0), + <<_:4,Bin:Bits/bits,_:64>> = id(Bin1), + Bin. + +id(I) -> I. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/hibernate_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/hibernate_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/hibernate_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/hibernate_SUITE.erl 2009-09-18 15:08:42.000000000 +0100 @@ -0,0 +1,353 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(hibernate_SUITE). + +-include("test_server.hrl"). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + basic/1,min_heap_size/1,bad_args/1, + messages_in_queue/1,undefined_mfa/1, no_heap/1]). + +%% Used by test cases. +-export([basic_hibernator/1,messages_in_queue_restart/2, no_heap_loop/0]). + +all(suite) -> + [basic,min_heap_size,bad_args,messages_in_queue,undefined_mfa,no_heap]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(3)), + [{watchdog,Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +%%% +%%% Testing the basic functionality of erlang:hibernate/3. +%%% + +basic(Config) when is_list(Config) -> + Ref = make_ref(), + Info = {self(),Ref}, + ExpectedHeapSz = case erlang:system_info(heap_type) of + private -> erts_debug:size([Info]); + hybrid -> erts_debug:size([a|b]) + end, + ?line Child = spawn_link(fun() -> basic_hibernator(Info) end), + ?line hibernate_wake_up(100, ExpectedHeapSz, Child), + ?line Child ! please_quit_now, + ok. + +hibernate_wake_up(0, _, _) -> ok; +hibernate_wake_up(N, ExpectedHeapSz, Child) -> + {heap_size,Before} = process_info(Child, heap_size), + case N rem 2 of + 0 -> + Child ! {acquire_old_heap,self()}, + receive + done -> ok + end; + 1 -> ok + end, + ?line Child ! {hibernate,self()}, + ?line wait_until(fun () -> + {current_function,{erlang,hibernate,3}} == + process_info(Child, current_function) + end), + ?line {message_queue_len,0} = process_info(Child, message_queue_len), + ?line {status,waiting} = process_info(Child, status), + ?line {heap_size,ExpectedHeapSz} = process_info(Child, heap_size), + io:format("Before hibernation: ~p After hibernation: ~p\n", + [Before,ExpectedHeapSz]), + ?line Child ! {whats_up,self()}, + ?line receive + {all_fine,X,Child,_Ref} -> + if + N =:= 1 -> io:format("~p\n", [X]); + true -> ok + end, + {backtrace,Bin} = process_info(Child, backtrace), + if + size(Bin) > 1000 -> + io:format("~s\n", [binary_to_list(Bin)]), + ?line ?t:fail(stack_is_growing); + true -> + hibernate_wake_up(N-1, ExpectedHeapSz, Child) + end; + Other -> + ?line io:format("~p\n", [Other]), + ?line ?t:fail(unexpected_message) + end. + +basic_hibernator(Info) -> + {catchlevel,0} = process_info(self(), catchlevel), + receive + Any -> + basic_hibernator_msg(Any, Info), + basic_hibernator(Info) + end. + +basic_hibernator_msg({hibernate,_}, Info) -> + catch erlang:hibernate(?MODULE, basic_hibernator, [Info]), + exit(hibernate_returned); +basic_hibernator_msg({acquire_old_heap,Parent}, _) -> + acquire_old_heap(), + Parent ! done; +basic_hibernator_msg({whats_up,Parent}, {Parent,Ref}) -> + {heap_size,HeapSize} = process_info(self(), heap_size), + io:format("Heap size after waking up: ~p\n", [HeapSize]), + X = whats_up_calc(5000, 2, math:pi(), 4, 5, 6, 7, 8.5, 9, []), + Parent ! {all_fine,X,self(),Ref}; +basic_hibernator_msg(please_quit_now, _) -> + exit(normal); +basic_hibernator_msg(Other, _) -> + exit({unexpected,Other}). + +acquire_old_heap() -> + case process_info(self(), [heap_size,total_heap_size]) of + [{heap_size,Sz},{total_heap_size,Total}] when Sz < Total -> + ok; + _ -> + acquire_old_heap() + end. + +%% The point with this calculation is to force memory to be +%% allocated for the argument registers in the process structure. +%% The allocation will be forced if the process is scheduled out +%% while calling a function with more than 6 arguments. +whats_up_calc(0, A2, A3, A4, A5, A6, A7, A8, A9, Acc) -> + {Acc,A2+A3+A4+A5+A6+A7+A8+A9}; +whats_up_calc(A1, A2, A3, A4, A5, A6, A7, A8, A9, Acc) -> + whats_up_calc(A1-1, A2+1, A3+2, A4+3, A5+4, A6+5, A7+6, A8+7, A9+8, [A1,A2|Acc]). + +%%% +%%% Testing setting the minimum heap size. +%%% + +min_heap_size(Config) when is_list(Config) -> + ?line erlang:trace(new, true, [call]), + MFA = {?MODULE,min_hibernator,1}, + ?line 1 = erlang:trace_pattern(MFA, true, [local]), + Ref = make_ref(), + Info = {self(),Ref}, + ?line Child = spawn_opt(fun() -> min_hibernator(Info) end, + [{min_heap_size,15000},link]), + receive + {trace,Child,call,{?MODULE,min_hibernator,_}} -> + ?line 1 = erlang:trace_pattern(MFA, false, [local]), + ?line erlang:trace(new, false, [call]) + end, + {heap_size,HeapSz} = process_info(Child, heap_size), + io:format("Heap size: ~p\n", [HeapSz]), + ?line if + HeapSz < 20 -> ok + end, + ?line Child ! wake_up, + receive + {heap_size,AfterSize} -> + io:format("Heap size after wakeup: ~p\n", [AfterSize]), + ?line + if + AfterSize >= 15000 -> ok + end; + Other -> + io:format("Unexpected: ~p\n", [Other]), + ?line ?t:fail() + end. + +min_hibernator({Parent,_Ref}) -> + erlang:hibernate(erlang, apply, [fun min_hibernator_recv/1, [Parent]]). + +min_hibernator_recv(Parent) -> + receive + wake_up -> + Parent ! process_info(self(), heap_size) + end. + +%%% +%%% Testing feeding erlang:hibernate/3 with bad arguments. +%%% + +bad_args(Config) when is_list(Config) -> + ?line bad_args(?MODULE, {name,glurf}, [0]), + ?line {'EXIT',{system_limit,_}} = + (catch erlang:hibernate(x, y, lists:duplicate(5122, xxx))), + ?line bad_args(42, name, [0]), + ?line bad_args(xx, 42, [1]), + ?line bad_args(xx, 42, glurf), + ?line bad_args(xx, 42, {}), + ?line bad_args({}, name, [2]), + ?line bad_args({1}, name, [3]), + ?line bad_args({1,2,3}, name, [4]), + ?line bad_args({1,2,3}, name, [5]), + ?line bad_args({1,2,3,4}, name, [6]), + ?line bad_args({1,2,3,4,5,6}, name,[7]), + ?line bad_args({1,2,3,4,5}, name, [8]), + ?line bad_args({1,2}, name, [9]), + ?line bad_args([1,2], name, [9]), + ?line bad_args(55.0, name, [9]), + ok. + +bad_args(Mod, Name, Args) -> + Res = (catch erlang:hibernate(Mod, Name, Args)), + erlang:garbage_collect(), + case Res of + {'EXIT',{badarg,_Where}} -> + io:format("erlang:hibernate(~p, ~p, ~p) -> ~p\n", [Mod,Name,Args,Res]); + Other -> + io:format("erlang:hibernate(~p, ~p, ~p) -> ~p\n", [Mod,Name,Args,Res]), + ?t:fail({bad_result,Other}) + end. + + +%%% +%%% Testing calling erlang:hibernate/3 with messages already in the message queue. +%%% + +messages_in_queue(Config) when is_list(Config) -> + Self = self(), + Msg = {Self,make_ref(),a,message}, + Pid = spawn_link(fun() -> messages_in_queue_1(Self, Msg) end), + Pid ! Msg, + Pid ! go_ahead, + receive + done -> ok; + Other -> + ?line io:format("~p\n", [Other]), + ?line ?t:fail(unexpected_message) + end. + +messages_in_queue_1(Parent, ExpectedMsg) -> + receive + go_ahead -> ok + end, + {message_queue_len,1} = process_info(self(), message_queue_len), + erlang:hibernate(?MODULE, messages_in_queue_restart, + [Parent,ExpectedMsg]). + +messages_in_queue_restart(Parent, ExpectedMessage) -> + ?line receive + ExpectedMessage -> + Parent ! done; + Other -> + io:format("~p\n", [Other]), + ?t:fail(unexpected_message) + end, + ok. + + +%%% +%%% Test that trying to hibernate to an undefined MFA gives the correct +%%% exit behavior. +%%% + +undefined_mfa(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Pid = spawn_link(fun() -> + %% Will be a call_only instruction. + erlang:hibernate(?MODULE, blarf, []) end), + ?line Pid ! {a,message}, + ?line receive + {'EXIT',Pid,{undef,Undef}} -> + io:format("~p\n", [Undef]), + ok; + Other -> + ?line io:format("~p\n", [Other]), + ?line ?t:fail(unexpected_message) + end, + undefined_mfa_1(). + +undefined_mfa_1() -> + ?line Pid = spawn_link(fun() -> + %% Force a call_last instruction by calling bar() + %% (if that is not obvious). + bar(), + erlang:hibernate(?MODULE, blarf, []) + end), + ?line Pid ! {another,message}, + ?line receive + {'EXIT',Pid,{undef,Undef}} -> + io:format("~p\n", [Undef]), + ok; + Other -> + ?line io:format("~p\n", [Other]), + ?line ?t:fail(unexpected_message) + end, + ok. + +bar() -> + ok. + +%% +%% No heap +%% + +no_heap(doc) -> []; +no_heap(suite) -> []; +no_heap(Config) when is_list(Config) -> + ?line H = spawn_link(fun () -> clean_dict(), no_heap_loop() end), + ?line lists:foreach(fun (_) -> + wait_until(fun () -> is_hibernated(H) end), + ?line [{heap_size,1}, + {total_heap_size,1}] + = process_info(H, + [heap_size, + total_heap_size]), + receive after 10 -> ok end, + H ! again + end, + lists:seq(1, 100)), + ?line unlink(H), + ?line exit(H, bye). + +no_heap_loop() -> + flush(), + erlang:hibernate(?MODULE, no_heap_loop, []). + +clean_dict() -> + {dictionary, Dict} = process_info(self(), dictionary), + lists:foreach(fun ({Key, _}) -> erase(Key) end, Dict). + +%% +%% Misc +%% + +is_hibernated(P) -> + case process_info(P, [current_function, status]) of + [{current_function, {erlang, hibernate, _}}, + {status, waiting}] -> + true; + _ -> + false + end. + +flush() -> + receive + _Msg -> flush() + after 0 -> + ok + end. + + +wait_until(Fun) -> + case catch Fun() of + true -> ok; + _ -> receive after 10 -> wait_until(Fun) end + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ignore_cores.erl erlang-13.b.3-dfsg/erts/emulator/test/ignore_cores.erl --- erlang-13.b.1-dfsg/erts/emulator/test/ignore_cores.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ignore_cores.erl 2009-03-12 12:17:23.000000000 +0000 @@ -0,0 +1,158 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : ignore_cores.erl +%%% Author : Rickard Green +%%% Description : +%%% +%%% Created : 11 Feb 2008 by Rickard Green +%%%------------------------------------------------------------------- + +-module(ignore_cores). + +-include("test_server.hrl"). + +-export([init/1, fini/1, setup/3, setup/4, restore/1, dir/1]). + +-record(ignore_cores, {org_cwd, + org_path, + org_pwd_env, + ign_dir = false, + cores_dir = false}). + +%% +%% Takes a testcase config +%% + +init(Config) -> + {ok, OrgCWD} = file:get_cwd(), + [{ignore_cores, + #ignore_cores{org_cwd = OrgCWD, + org_path = code:get_path(), + org_pwd_env = os:getenv("PWD")}} + | lists:keydelete(ignore_cores, 1, Config)]. + +fini(Config) -> + #ignore_cores{org_cwd = OrgCWD, + org_path = OrgPath, + org_pwd_env = OrgPWD} = ?config(ignore_cores, Config), + ok = file:set_cwd(OrgCWD), + true = code:set_path(OrgPath), + case OrgPWD of + false -> ok; + _ -> true = os:putenv("PWD", OrgPWD) + end, + lists:keydelete(ignore_cores, 1, Config). + +setup(Suite, Testcase, Config) -> + setup(Suite, Testcase, Config, false). + +setup(Suite, Testcase, Config, SetCwd) when is_atom(Suite), + is_atom(Testcase), + is_list(Config) -> + #ignore_cores{org_cwd = OrgCWD, + org_path = OrgPath, + org_pwd_env = OrgPWD} = ?config(ignore_cores, Config), + Path = lists:map(fun (".") -> OrgCWD; (Dir) -> Dir end, OrgPath), + true = code:set_path(Path), + PrivDir = ?config(priv_dir, Config), + IgnDir = filename:join([PrivDir, + atom_to_list(Suite) + ++ "_" + ++ atom_to_list(Testcase) + ++ "_wd"]), + ok = file:make_dir(IgnDir), + case SetCwd of + false -> + ok; + _ -> + ok = file:set_cwd(IgnDir), + OrgPWD = case os:getenv("PWD") of + false -> false; + PWD -> + os:putenv("PWD", IgnDir), + PWD + end + end, + ok = file:write_file(filename:join([IgnDir, "ignore_core_files"]), <<>>), + %% cores are dumped in /cores on MacOS X + CoresDir = case {?t:os_type(), filelib:is_dir("/cores")} of + {{unix,darwin}, true} -> + filelib:fold_files("/cores", + "^core.*$", + false, + fun (C,Cs) -> [C|Cs] end, + []); + _ -> + false + end, + lists:keyreplace(ignore_cores, + 1, + Config, + {ignore_cores, + #ignore_cores{org_cwd = OrgCWD, + org_path = OrgPath, + org_pwd_env = OrgPWD, + ign_dir = IgnDir, + cores_dir = CoresDir}}). + +restore(Config) -> + #ignore_cores{org_cwd = OrgCWD, + org_path = OrgPath, + org_pwd_env = OrgPWD, + ign_dir = IgnDir, + cores_dir = CoresDir} = ?config(ignore_cores, Config), + try + case CoresDir of + false -> + ok; + _ -> + %% Move cores dumped by these testcases in /cores + %% to cwd. + lists:foreach(fun (C) -> + case lists:member(C, CoresDir) of + true -> ok; + _ -> + Dst = filename:join( + [IgnDir, + filename:basename(C)]), + {ok, _} = file:copy(C, Dst), + file:delete(C) + end + end, + filelib:fold_files("/cores", + "^core.*$", + false, + fun (C,Cs) -> [C|Cs] end, + [])) + end + after + catch file:set_cwd(OrgCWD), + catch code:set_path(OrgPath), + case OrgPWD of + false -> ok; + _ -> catch os:putenv("PWD", OrgPWD) + end + end. + + +dir(Config) -> + #ignore_cores{ign_dir = Dir} = ?config(ignore_cores, Config), + Dir. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/list_bif_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/list_bif_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/list_bif_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/list_bif_SUITE.erl 2009-09-18 15:07:47.000000000 +0100 @@ -0,0 +1,145 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(list_bif_SUITE). +-include("test_server.hrl"). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2]). +-export([hd_test/1,tl_test/1,t_length/1,t_list_to_pid/1, + t_list_to_float/1,t_list_to_integer/1]). + + +all(suite) -> + [hd_test,tl_test,t_length,t_list_to_pid,t_list_to_float,t_list_to_integer]. + +init_per_testcase(_Case, Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(60)), + [{watchdog,Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +t_list_to_integer(suite) -> + []; +t_list_to_integer(doc) -> + ["tests list_to_integer and string:to_integer"]; +t_list_to_integer(Config) when is_list(Config) -> + ?line {'EXIT',{badarg,_}} = (catch list_to_integer("12373281903728109372810937209817320981321ABC")), + ?line 12373281903728109372810937209817320981321 = (catch list_to_integer("12373281903728109372810937209817320981321")), + ?line 12373 = (catch list_to_integer("12373")), + ?line -12373 = (catch list_to_integer("-12373")), + ?line 12373 = (catch list_to_integer("+12373")), + ?line {'EXIT',{badarg,_}} = ( catch list_to_integer(abc)), + ?line {'EXIT',{badarg,_}} = (catch list_to_integer("")), + ?line {12373281903728109372810937209817320981321,"ABC"} = string:to_integer("12373281903728109372810937209817320981321ABC"), + ?line {-12373281903728109372810937209817320981321,"ABC"} = string:to_integer("-12373281903728109372810937209817320981321ABC"), + ?line {12,[345]} = string:to_integer([$1,$2,345]), + ?line {12,[a]} = string:to_integer([$1,$2,a]), + ?line {error,no_integer} = string:to_integer([$A]), + ?line {error,not_a_list} = string:to_integer($A), + ok. + +%% Test hd/1 with correct and incorrect arguments. +hd_test(Config) when is_list(Config) -> + ?line $h = hd(id("hejsan")), + ?line case catch hd(id($h)) of + {'EXIT', {badarg, _}} -> ok; + Res -> + Str=io_lib:format("hd/1 with incorrect args "++ + "succeeded.~nResult: ~p", [Res]), + test_server:fail(Str) + end, + ok. + + +%% Test tl/1 with correct and incorrect arguments. +tl_test(Config) when is_list(Config) -> + ?line "ejsan" = tl(id("hejsan")), + ?line case catch tl(id(104)) of + {'EXIT', {badarg, _}} -> + ok; + Res -> + Str=io_lib:format("tl/1 with incorrect args "++ + "succeeded.~nResult: ~p", [Res]), + test_server:fail(Str) + end, + ok. + + +%% Test length/1 with correct and incorrect arguments. + +t_length(Config) when is_list(Config) -> + ?line 0 = length(""), + ?line 0 = length([]), + ?line 1 = length([1]), + ?line 2 = length([1,a]), + ?line 2 = length("ab"), + ?line 3 = length("abc"), + ?line 4 = length(id([x|"abc"])), + ?line 6 = length("hejsan"), + ?line {'EXIT',{badarg,_}} = (catch length(id([a,b|c]))), + ?line case catch length({tuple}) of + {'EXIT', {badarg, _}} -> + ok; + Res -> + Str = io_lib:format("length/1 with incorrect args "++ + "succeeded.~nResult: ~p", [Res]), + ?line test_server:fail(Str) + end, + ok. + + +%% Test list_to_pid/1 with correct and incorrect arguments. + +t_list_to_pid(Config) when is_list(Config) -> + ?line Me = self(), + ?line MyListedPid = pid_to_list(Me), + ?line Me = list_to_pid(MyListedPid), + ?line case catch list_to_pid(id("Incorrect list")) of + {'EXIT', {badarg, _}} -> + ok; + Res -> + Str=io_lib:format("list_to_pid/1 with incorrect "++ + "arg succeeded.~nResult: ~p", + [Res]), + test_server:fail(Str) + end, + ok. + + +%% Test list_to_float/1 with correct and incorrect arguments. + +t_list_to_float(Config) when is_list(Config) -> + ?line 5.89000 = list_to_float(id("5.89")), + ?line 5.89898 = list_to_float(id("5.89898")), + ?line case catch list_to_float(id("58")) of + {'EXIT', {badarg, _}} -> ok; + Res -> + Str=io_lib:format("list_to_float with incorrect "++ + "arg succeeded.~nResult: ~p", + [Res]), + test_server:fail(Str) + end, + ok. + +id(I) -> I. + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/long_timers_test.erl erlang-13.b.3-dfsg/erts/emulator/test/long_timers_test.erl --- erlang-13.b.1-dfsg/erts/emulator/test/long_timers_test.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/long_timers_test.erl 2009-11-20 13:32:25.000000000 +0000 @@ -0,0 +1,317 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +%%%------------------------------------------------------------------- +%%% File : long_timer_test.erl +%%% Author : Rickard Green +%%% Description : +%%% +%%% Created : 21 Aug 2006 by Rickard Green +%%%------------------------------------------------------------------- + + +-define(MAX_TIMEOUT, 60). % Minutes +-define(MAX_LATE, 10*1000). % Milliseconds +-define(REG_NAME, '___LONG___TIMERS___TEST___SERVER___'). + +-define(DRV_NAME, timer_driver). + +% First byte in communication with the timer driver +-define(START_TIMER, 0). +-define(CANCEL_TIMER, 1). +-define(DELAY_START_TIMER, 2). +-define(TIMER, 3). +-define(CANCELLED, 4). + +-module(long_timers_test). + +-export([start/1, check_result/0]). + +-record(timeout_rec,{pid, type, timeout, timeout_diff}). + +start(DrvDir) when is_list(DrvDir) -> + Starter = self(), + StartDone = make_ref(), + stop_node(full_node_name(?REG_NAME)), + Node = start_node(?REG_NAME), + Test = spawn(Node, fun () -> test(Starter, DrvDir, StartDone) end), + Mon = erlang:monitor(process, Test), + receive + StartDone -> + erlang:demonitor(Mon), + net_kernel:disconnect(Node), + receive {'DOWN',Mon,_,_,_} -> ok after 0 -> ok end; + {'DOWN',Mon,_,_,Reason} -> + stop_node(full_node_name(?REG_NAME)), + {error, Reason} + end. + +check_result() -> + Node = full_node_name(?REG_NAME), + LTTS = {?REG_NAME, Node}, + Mon = erlang:monitor(process, LTTS), + (catch LTTS ! {get_result, ?REG_NAME, self()}), + receive + {'DOWN', Mon, process, _, Reason} -> + {?REG_NAME, 'DOWN', Reason}; + {result, ?REG_NAME, TORs, Start, End} -> + erlang:demonitor(Mon), + receive {'DOWN', Mon, _, _, _} -> ok after 0 -> ok end, + stop_node(Node), + check(TORs, (timer:now_diff(End, Start) div 1000) - ?MAX_LATE, ok) + end. + +check([#timeout_rec{timeout = Timeout, + type = Type, + timeout_diff = undefined} | TORs], + NeedRes, + _Ok) when Timeout < NeedRes -> + io:format("~p timeout = ~p failed! No timeout.~n", + [Type, Timeout]), + check(TORs, NeedRes, failed); +check([#timeout_rec{timeout_diff = undefined} | TORs], + NeedRes, + Ok) -> + check(TORs, NeedRes, Ok); +check([#timeout_rec{timeout = Timeout, + type = Type, + timeout_diff = {error, Reason}} | TORs], + NeedRes, + _Ok) -> + io:format("~p timeout = ~p failed! exit reason ~p~n", + [Type, Timeout, Reason]), + check(TORs, NeedRes, failed); +check([#timeout_rec{timeout = Timeout, + type = Type, + timeout_diff = TimeoutDiff} | TORs], + NeedRes, + Ok) -> + case (0 =< TimeoutDiff) and (TimeoutDiff =< ?MAX_LATE) of + true -> + io:format("~p timeout = ~p succeded! timeout diff = ~p.~n", + [Type, Timeout, TimeoutDiff]), + check(TORs, NeedRes, Ok); + false -> + io:format("~p timeout = ~p failed! timeout diff = ~p.~n", + [Type, Timeout, TimeoutDiff]), + check(TORs, NeedRes, failed) + end; +check([], _NeedRes, Ok) -> + Ok. + +receive_after(Timeout) -> + Start = now(), + receive + {get_result, ?REG_NAME} -> + ?REG_NAME ! #timeout_rec{pid = self(), + type = receive_after, + timeout = Timeout} + after Timeout -> + Stop = now(), + receive + {get_result, ?REG_NAME} -> + TimeoutDiff = ((timer:now_diff(Stop, Start) div 1000) + - Timeout), + ?REG_NAME ! #timeout_rec{pid = self(), + type = receive_after, + timeout = Timeout, + timeout_diff = TimeoutDiff} + end + end. + +driver(Timeout) -> + Port = open_port({spawn, ?DRV_NAME},[]), + link(Port), + Start = now(), + erlang:port_command(Port, <>), + receive + {get_result, ?REG_NAME} -> + ?REG_NAME ! #timeout_rec{pid = self(), + type = driver, + timeout = Timeout}; + {Port,{data,[?TIMER]}} -> + Stop = now(), + unlink(Port), + true = erlang:port_close(Port), + receive + {get_result, ?REG_NAME} -> + TimeoutDiff = ((timer:now_diff(Stop, Start) div 1000) + - Timeout), + ?REG_NAME ! #timeout_rec{pid = self(), + type = driver, + timeout = Timeout, + timeout_diff = TimeoutDiff} + end + end. + +bif_timer(Timeout) -> + Tmr = erlang:start_timer(Timeout, self(), ok), + Start = now(), + receive + {get_result, ?REG_NAME} -> + ?REG_NAME ! #timeout_rec{pid = self(), + type = bif_timer, + timeout = Timeout}; + {timeout, Tmr, ok} -> + Stop = now(), + receive + {get_result, ?REG_NAME} -> + TimeoutDiff = ((timer:now_diff(Stop, Start) div 1000) + - Timeout), + ?REG_NAME ! #timeout_rec{pid = self(), + type = bif_timer, + timeout = Timeout, + timeout_diff = TimeoutDiff} + end + end. + +test(Starter, DrvDir, StartDone) -> + erl_ddll:start(), + ok = load_driver(DrvDir, ?DRV_NAME), + process_flag(trap_exit, true), + register(?REG_NAME, self()), + {group_leader, GL} = process_info(whereis(net_kernel),group_leader), + group_leader(GL, self()), + Start = now(), + TORs = lists:map(fun (Min) -> + TO = Min*60*1000, + [#timeout_rec{pid = spawn_opt( + fun () -> + receive_after(TO) + end, + [link, {priority, high}]), + type = receive_after, + timeout = TO}, + #timeout_rec{pid = spawn_opt( + fun () -> + driver(TO) + end, + [link, {priority, high}]), + type = driver, + timeout = TO}, + #timeout_rec{pid = spawn_opt( + fun () -> + bif_timer(TO) + end, + [link, {priority, high}]), + type = bif_timer, + timeout = TO}] + end, + lists:seq(1, ?MAX_TIMEOUT)), + FlatTORs = lists:flatten(TORs), + Starter ! StartDone, + test_loop(FlatTORs, Start). + +test_loop(TORs, Start) -> + receive + {get_result, ?REG_NAME, Pid} -> + End = now(), + Pid ! {result, ?REG_NAME, get_test_results(TORs), Start, End}, + erl_ddll:unload_driver(?DRV_NAME), + erl_ddll:stop(), + exit(bye) + end. + +get_test_results(TORs) -> + lists:foreach(fun (#timeout_rec{pid = Pid}) -> + Pid ! {get_result, ?REG_NAME} + end, + TORs), + get_test_results(TORs, []). + +get_test_results([#timeout_rec{pid = Pid, + timeout = Timeout} = TOR | TORs], NewTORs) -> + receive + #timeout_rec{pid = Pid, timeout = Timeout} = NewTOR -> + get_test_results(TORs, [NewTOR | NewTORs]); + #timeout_rec{pid = Pid} = NewTOR -> + exit({timeout_mismatch, TOR, NewTOR}); + {'EXIT', Pid, Reason} -> + get_test_results(TORs, + [TOR#timeout_rec{timeout_diff = {error, Reason}} + | NewTORs]) + end; +get_test_results([], NewTORs) -> + lists:reverse(NewTORs). + +mk_node_cmdline(Name) -> + Static = "-detached -noinput", + Pa = filename:dirname(code:which(?MODULE)), + Prog = case catch init:get_argument(progname) of + {ok,[[P]]} -> P; + _ -> exit(no_progname_argument_found) + end, + NameSw = case net_kernel:longnames() of + false -> "-sname "; + true -> "-name "; + _ -> exit(not_distributed_node) + end, + {ok, Pwd} = file:get_cwd(), + NameStr = atom_to_list(Name), + Prog ++ " " + ++ Static ++ " " + ++ NameSw ++ " " ++ NameStr ++ " " + ++ "-pa " ++ Pa ++ " " + ++ "-env ERL_CRASH_DUMP " ++ Pwd ++ "/erl_crash_dump." ++ NameStr ++ " " + ++ "-setcookie " ++ atom_to_list(erlang:get_cookie()). + +full_node_name(PreName) -> + HostSuffix = lists:dropwhile(fun ($@) -> false; (_) -> true end, + atom_to_list(node())), + list_to_atom(atom_to_list(PreName) ++ HostSuffix). + +ping_node(_Node, 0) -> + pang; +ping_node(Node, N) when is_integer(N), N > 0 -> + case catch net_adm:ping(Node) of + pong -> pong; + _ -> + receive after 100 -> ok end, + ping_node(Node, N-1) + end. + +start_node(Name) -> + FullName = full_node_name(Name), + CmdLine = mk_node_cmdline(Name), + io:format("Starting node ~p: ~s~n", [FullName, CmdLine]), + case open_port({spawn, CmdLine}, []) of + Port when is_port(Port) -> + unlink(Port), + erlang:port_close(Port), + case ping_node(FullName, 50) of + pong -> FullName; + Other -> exit({failed_to_start_node, FullName, Other}) + end; + Error -> + exit({failed_to_start_node, FullName, Error}) + end. + +stop_node(Node) -> + monitor_node(Node, true), + spawn(Node, fun () -> halt() end), + receive {nodedown, Node} -> ok end. + +load_driver(Dir, Driver) -> + case erl_ddll:load_driver(Dir, Driver) of + ok -> ok; + {error, Error} = Res -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + Res + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/Makefile erlang-13.b.3-dfsg/erts/emulator/test/Makefile --- erlang-13.b.1-dfsg/erts/emulator/test/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/Makefile 2009-11-20 13:30:09.000000000 +0000 @@ -0,0 +1,194 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +include $(ERL_TOP)/make/target.mk + +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +EBIN = . + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + +MODULES= \ + a_SUITE \ + after_SUITE \ + alloc_SUITE \ + beam_SUITE \ + beam_literals_SUITE \ + bif_SUITE \ + big_SUITE \ + binary_SUITE \ + bs_bincomp_SUITE \ + bs_bit_binaries_SUITE \ + bs_construct_SUITE \ + bs_match_bin_SUITE \ + bs_match_int_SUITE \ + bs_match_tail_SUITE \ + bs_match_misc_SUITE \ + bs_utf_SUITE \ + busy_port_SUITE \ + call_trace_SUITE \ + code_SUITE \ + crypto_SUITE \ + ddll_SUITE \ + decode_packet_SUITE \ + distribution_SUITE \ + driver_SUITE \ + efile_SUITE \ + erts_debug_SUITE \ + estone_SUITE \ + erl_link_SUITE \ + erl_drv_thread_SUITE \ + evil_SUITE \ + exception_SUITE \ + float_SUITE \ + fun_SUITE \ + fun_r11_SUITE \ + gc_SUITE \ + guard_SUITE \ + hash_SUITE \ + hibernate_SUITE \ + list_bif_SUITE \ + match_spec_SUITE \ + module_info_SUITE \ + monitor_SUITE \ + nested_SUITE \ + nif_SUITE \ + node_container_SUITE \ + nofrag_SUITE \ + num_bif_SUITE \ + obsolete_SUITE \ + op_SUITE \ + port_SUITE \ + port_bif_SUITE \ + process_SUITE \ + pseudoknot_SUITE \ + ref_SUITE \ + register_SUITE \ + save_calls_SUITE \ + send_term_SUITE \ + sensitive_SUITE \ + signal_SUITE \ + statistics_SUITE \ + system_info_SUITE \ + system_profile_SUITE \ + time_SUITE \ + timer_bif_SUITE \ + trace_SUITE \ + trace_bif_SUITE \ + trace_nif_SUITE \ + trace_port_SUITE \ + tuple_SUITE \ + trace_local_SUITE \ + trace_meta_SUITE \ + trace_call_count_SUITE \ + scheduler_SUITE \ + old_scheduler_SUITE \ + z_SUITE \ + old_mod \ + long_timers_test \ + ignore_cores \ + dgawd_handler \ + random_iolist \ + crypto_reference + +NO_OPT= bs_bincomp \ + bs_bit_binaries \ + bs_construct \ + bs_match_bin \ + bs_match_int \ + bs_match_tail \ + bs_match_misc \ + bs_utf + + +NO_OPT_MODULES= $(NO_OPT:%=%_no_opt_SUITE) +NO_OPT_ERL_FILES= $(NO_OPT_MODULES:%=%.erl) + +ERL_FILES= $(MODULES:%=%.erl) + +TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR)) + +EMAKEFILE=Emakefile + +TEST_SPEC_FILES = emulator.spec \ + emulator.spec.win \ + emulator.spec.vxworks \ + emulator.spec.ose +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/emulator_test + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- +ERL_MAKE_FLAGS += +ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/test_server/include + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- + +make_emakefile: $(NO_OPT_ERL_FILES) + # This special rule can be removed when communication with R7B nodes + # is no longer supported. + $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) +compressed -o$(EBIN) \ + '*_SUITE_make' > $(EMAKEFILE) + $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) +compressed -o$(EBIN) \ + $(MODULES) >> $(EMAKEFILE) + $(ERL_TOP)/make/make_emakefile +no_copt +no_postopt $(ERL_COMPILE_FLAGS) \ + -o$(EBIN) $(NO_OPT_MODULES) >> $(EMAKEFILE) + +tests debug opt: make_emakefile + erl $(ERL_MAKE_FLAGS) -make + +clean: + rm -f $(EMAKEFILE) + rm -f $(TARGET_FILES) + rm -f core *~ + +docs: + +# ---------------------------------------------------- +# Special targets +# ---------------------------------------------------- + +%_no_opt_SUITE.erl: %_SUITE.erl + sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@ + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + +release_spec: + +release_tests_spec: make_emakefile + $(INSTALL_DIR) $(RELSYSDIR) + $(INSTALL_DATA) $(EMAKEFILE) $(TEST_SPEC_FILES) \ + $(ERL_FILES) $(RELSYSDIR) + $(INSTALL_DATA) $(NO_OPT_ERL_FILES) $(RELSYSDIR) + chmod -f -R u+w $(RELSYSDIR) + tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -) + +release_docs_spec: + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/match_spec_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/match_spec_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/match_spec_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/match_spec_SUITE.erl 2009-09-18 15:08:06.000000000 +0100 @@ -0,0 +1,942 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(match_spec_SUITE). + +-export([all/1, not_run/1]). +-export([test_1/1, test_2/1, test_3/1, bad_match_spec_bin/1, + trace_control_word/1, silent/1, silent_no_ms/1, + ms_trace2/1, ms_trace3/1, boxed_and_small/1, + destructive_in_test_bif/1, guard_exceptions/1, + unary_plus/1, unary_minus/1, moving_labels/1]). +-export([fpe/1]). + +-export([runner/2]). +-export([f1/1, f2/2, f3/2, fn/1, fn/2, fn/3]). +-export([do_boxed_and_small/0]). + +% This test suite assumes that tracing in general works. What we test is +% the match spec functionality. + +-include("test_server.hrl"). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?t:timetrap(?t:seconds(10)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + + +all(suite) -> + case test_server:is_native(?MODULE) of + false -> [test_1, test_2, test_3, bad_match_spec_bin, + trace_control_word, silent, silent_no_ms, + ms_trace2, ms_trace3, boxed_and_small, + destructive_in_test_bif, guard_exceptions, + unary_plus, unary_minus, fpe, moving_labels]; + true -> [not_run] + end. + +not_run(Config) when is_list(Config) -> + {skipped, "Native Code"}. + +test_1(doc) -> + [""]; +test_1(suite) -> []; +test_1(Config) when is_list(Config) -> + ?line tr(fun() -> ?MODULE:f1(a) end, + {?MODULE, f1, 1}, + [], + [{call, {?MODULE, f1, [a]}}]), + + ?line tr(fun() -> ?MODULE:f2(a, a) end, + {?MODULE, f2, 2}, + [{['$1','$1'],[{is_atom, '$1'}],[]}], + [{call, {?MODULE, f2, [a, a]}}]), + + ?line tr(fun() -> ?MODULE:f2(a, a) end, + {?MODULE, f2, 2}, + [{['$1','$1'],[{is_atom, '$1'}],[{message, false}]}], + []), + + ?line tr(fun() -> ?MODULE:f2(a, a) end, + {?MODULE, f2, 2}, + [{['$1','$1'],[{is_atom, '$1'}],[{message, 4711}]}], + [{call, {?MODULE, f2, [a, a]}, 4711}]), + + Ref = make_ref(), + ?line tr(fun() -> ?MODULE:f2(Ref, Ref) end, + {?MODULE, f2, 2}, + [{[Ref,'$1'],[{is_reference, '$1'}],[{message, 4711}]}], + [{call, {?MODULE, f2, [Ref, Ref]}, 4711}]), + ?line tr(fun() -> ?MODULE:f2(Ref, Ref) end, + {?MODULE, f2, 2}, + [{['$1',Ref],[{is_reference, '$1'}],[{message, 4711}]}], + [{call, {?MODULE, f2, [Ref, Ref]}, 4711}]), + + ?line tr(fun() -> ?MODULE:f2(a, a) end, + {?MODULE, f2, 2}, + [{['$0','$0'],[{is_atom, '$0'}],[{message, 4711}]}], + [{call, {?MODULE, f2, [a, a]}, 4711}]), + + ?line tr(fun() -> ?MODULE:f2(a, b) end, + {?MODULE, f2, 2}, + [{['_','_'],[],[]}], + [{call, {?MODULE, f2, [a, b]}}]), + + ?line tr(fun() -> ?MODULE:f2(a, b) end, + {?MODULE, f2, 2}, + [{['_','_'],[],[{message, '$_'}]}], + [{call, {?MODULE, f2, [a, b]}, [a, b]}]), + + ?line tr(fun() -> ?MODULE:f2(a, '$_') end, + {?MODULE, f2, 2}, + [{['$1','$_'],[{is_atom, '$1'}],[]}], + [{call, {?MODULE, f2, [a, '$_']}}]), + + ?line tr(fun() -> ?MODULE:f1({a}) end, + {?MODULE, f1, 1}, + [{['$1'],[{'==', '$1', {const, {a}}}],[]}], + [{call, {?MODULE, f1, [{a}]}}]), + + ?line tr(fun() -> ?MODULE:f1({a}) end, + {?MODULE, f1, 1}, + [{['$1'],[{'==', '$1', {{a}}}],[]}], + [{call, {?MODULE, f1, [{a}]}}]), + +%% Undocumented, currently. + ?line tr(fun() -> ?MODULE:f2(a, a) end, + {?MODULE, f2, 2}, + [{['$1','$1'],[{is_atom, '$1'}],[{message, 4711}, + {message, true}]}], + [{call, {?MODULE, f2, [a, a]}}]), + + ?line tr(fun() -> ?MODULE:f2(a, a) end, + {?MODULE, f2, 2}, + [{['$1','$1'],[{is_atom, '$1'}],[{message, 4711}, + {message, false}]}], + []), + + ?line tr(fun() -> ?MODULE:f2(a, a) end, + {?MODULE, f2, 2}, + [{['$1','$1'],[{is_atom, '$1'}],[kakalorum]}], + [{call, {?MODULE, f2, [a, a]}}]), + +% case tr0(fun() -> ?MODULE:f2(a, a) end, +% {?MODULE, f2, 2}, +% [{['$1','$1'],[{is_atom, '$1'}],[{message, {process_dump}}]}]) of +% [{trace, _, call, {?MODULE, f2, [a, a]}, Bin}] -> +% erlang:display(binary_to_list(Bin)) +% end, + +% Error cases + ?line errchk([{['$1','$1'],[{is_atom, '$1'}],[{banka, kanin}]}]), + + ok. + +test_2(doc) -> + [""]; +test_2(suite) -> []; +test_2(Config) when is_list(Config) -> + ?line tr(fun() -> ?MODULE:f2(a, a) end, + {?MODULE, f2, 2}, + [{['$1','$1'],[{is_atom, '$1'}],[{return_trace}]}], + [{call, {?MODULE, f2, [a, a]}}, + {return_from, {?MODULE, f2, 2}, {a, a}}]), + ok. + +test_3(doc) -> + ["Test the enable_trace/2 and caller/0 PAM instructions"]; +test_3(suite) -> []; +test_3(Config) when is_list(Config) -> + ?line Fun1 = fun() -> + register(fnoppelklopfer,self()), + ?MODULE:f2(a, b), + ?MODULE:f2(a, b) + end, + ?line P1 = spawn(?MODULE, runner, [self(), Fun1]), + ?line Pat = [{['$1','$1'],[],[{message, + [{enable_trace, P1, call},{caller}]}]}, + {['_','_'],[],[{message, + [{disable_trace, fnoppelklopfer, call}]}]}], + ?line Fun2 = fun() -> ?MODULE:f3(a, a) end, + ?line P2 = spawn(?MODULE, runner, [self(), Fun2]), + ?line erlang:trace(P2, true, [call]), + ?line erlang:trace_pattern({?MODULE, f2, 2}, Pat), + ?line collect(P2, [{trace, P2, call, {?MODULE, f2, [a, a]}, [true, + {?MODULE,f3,2}]}]), + ?line collect(P1, [{trace, P1, call, {?MODULE, f2, [a, b]}, [true]}]), + ?line ok. + +bad_match_spec_bin(Config) when is_list(Config) -> + {'EXIT',{badarg,_}} = (catch ets:match_spec_run([1], <<>>)), + B0 = <<1,2>>, + {B,_} = split_binary(B0, 0), + {'EXIT',{badarg,_}} = (catch ets:match_spec_run([1], B)), + ok. + + + +trace_control_word(doc) -> + ["Test the erlang:system_info(trace_control_word) and ", + "erlang:system_flag(trace_control_word, Value) BIFs, ", + "as well as the get_tcw/0 and set_tcw/1 PAM instructions"]; +trace_control_word(suite) -> []; +trace_control_word(Config) when is_list(Config) -> + ?line 32 = Bits = tcw_bits(), + ?line High = 1 bsl (Bits - 1), + ?line erlang:system_flag(trace_control_word, 17), + ?line tr(fun() -> ?MODULE:f1(a) end, + {?MODULE, f1, 1}, + [{'_',[{'=:=', {get_tcw}, 17}],[]}], + [{call, {?MODULE, f1, [a]}}]), + ?line tr(fun() -> ?MODULE:f1(a) end, + {?MODULE, f1, 1}, + [{'_',[{'=:=', {get_tcw}, 18}],[]}], + []), + ?line erlang:system_flag(trace_control_word, High), + ?line tr(fun() -> ?MODULE:f1(a) end, + {?MODULE, f1, 1}, + [{'_',[{'=:=', {get_tcw}, High}],[]}], + [{call, {?MODULE, f1, [a]}}]), + ?line erlang:system_flag(trace_control_word, 0), + ?line tr(fun() -> + ?MODULE:f1(a), + ?MODULE:f1(start), + ?MODULE:f1(b), + ?MODULE:f1(c), + ?MODULE:f1(high), + ?MODULE:f1(d), + ?MODULE:f1(stop), + ?MODULE:f1(e) + end, + {?MODULE, f1, 1}, + [{[start], + [], + [{message, {set_tcw, 17}}]}, + {[stop], + [], + [{message, {set_tcw, 0}}]}, + {[high], + [], + [{message, {set_tcw, High}}]}, + {['_'], + [{'>', {get_tcw}, 0}], + [{set_tcw, {'+', 1, {get_tcw}}}, {message, {get_tcw}}] }], + [{call, {?MODULE, f1, [start]}, 0}, + {call, {?MODULE, f1, [b]}, 18}, + {call, {?MODULE, f1, [c]}, 19}, + {call, {?MODULE, f1, [high]}, 19}, + {call, {?MODULE, f1, [d]}, High + 1}, + {call, {?MODULE, f1, [stop]}, High + 1}]), + ?line 0 = erlang:system_info(trace_control_word), + ok. + +tcw_bits() -> + ?line tcw_bits(erlang:system_flag(trace_control_word, 0), 0, 0). + +tcw_bits(Save, Prev, Bits) -> + ?line Curr = 1 bsl Bits, + ?line case catch erlang:system_flag(trace_control_word, Curr) of + {'EXIT' , {badarg, _}} -> + ?line Prev = erlang:system_flag(trace_control_word, Save), + Bits; + Prev -> + ?line Curr = erlang:system_info(trace_control_word), + tcw_bits(Save, Curr, Bits+1) + end. + + + +silent(doc) -> + ["Test the erlang:trace(_, _, [silent]) flag ", + "as well as the silent/0 PAM instruction"]; +silent(suite) -> []; +silent(Config) when is_list(Config) -> + %% Global call trace + ?line tr(fun() -> + ?MODULE:f1(a), % No trace - not active + ?MODULE:f1(miss), % No trace - no activation + ?MODULE:f1(b), % No trace - still not active + ?MODULE:f1(start), % Trace - activation + ?MODULE:f1(c), % Trace - active + f1(d), % No trace - local call + ?MODULE:f1(miss), % Trace - no inactivation + ?MODULE:f1(e), % Trace - still active + ?MODULE:f1(stop), % No trace - inactivation + ?MODULE:f1(f) % No trace - not active + end, + {?MODULE, f1, 1}, + [call, silent], + [{[start], + [], + [{silent, false}, {message, start}]}, + {[stop], + [], + [{silent, true}, {message, stop}]}, + {[miss], + [], + [{silent, neither_true_nor_false}, {message, miss}]}, + {['$1'], + [], + [{message, '$1'}] }], + [global], + [{call, {?MODULE, f1, [start]}, start}, + {call, {?MODULE, f1, [c]}, c}, + {call, {?MODULE, f1, [miss]}, miss}, + {call, {?MODULE, f1, [e]}, e} ]), + %% Local call trace + ?line tr(fun() -> + ?MODULE:f1(a), % No trace - not active + f1(b), % No trace - not active + ?MODULE:f1(start), % Trace - activation + ?MODULE:f1(c), % Trace - active + f1(d), % Trace - active + f1(stop), % No trace - inactivation + ?MODULE:f1(e), % No trace - not active + f1(f) % No trace - not active + end, + {?MODULE, f1, 1}, + [call, silent], + [{[start], + [], + [{silent, false}, {message, start}]}, + {[stop], + [], + [{silent, true}, {message, stop}]}, + {['$1'], + [], + [{message, '$1'}] }], + [local], + [{call, {?MODULE, f1, [start]}, start}, + {call, {?MODULE, f1, [c]}, c}, + {call, {?MODULE, f1, [d]}, d} ]), + ok. + +silent_no_ms(doc) -> + ["Test the erlang:trace(_, _, [silent]) flag without match specs"]; +silent_no_ms(suite) -> []; +silent_no_ms(Config) when is_list(Config) -> + %% Global call trace + %% + %% Trace f2/2 and erlang:integer_to_list/1 without match spec + %% and use match spec on f1/1 to control silent flag. + ?line tr( + fun () -> + ?MODULE:f1(a), + ?MODULE:f2(b, c), + erlang:integer_to_list(id(1)), + ?MODULE:f3(d, e), + ?MODULE:f1(start), + ?MODULE:f2(f, g), + erlang:integer_to_list(id(2)), + ?MODULE:f3(h, i), + ?MODULE:f1(stop), + ?MODULE:f2(j, k), + erlang:integer_to_list(id(3)), + ?MODULE:f3(l, m) + end, + fun (Tracee) -> + ?line 1 = + erlang:trace(Tracee, true, + [call,silent,return_to]), + ?line 1 = + erlang:trace_pattern( + {?MODULE,f2,2}, + [], + [global]), + ?line 1 = + erlang:trace_pattern( + {erlang,integer_to_list,1}, + [], + [global]), + ?line 1 = + erlang:trace_pattern( + {?MODULE,f1,1}, + [{[start],[],[{silent,false}]}, + {[stop],[],[{silent,true}]}], + [global]), + %% + %% Expected: (no return_to for global call trace) + %% + ?line + [{trace,Tracee,call,{?MODULE,f1,[start]}}, + {trace,Tracee,call,{?MODULE,f2,[f,g]}}, + {trace,Tracee,call,{erlang,integer_to_list,[2]}}, + {trace,Tracee,call,{?MODULE,f2,[h,i]}}] + end), + %% Local call trace + %% + %% Trace f2/2 and erlang:integer_to_list/1 without match spec + %% and use match spec on f1/1 to control silent flag. + ?line tr( + fun () -> + ?MODULE:f1(a), + ?MODULE:f2(b, c), + erlang:integer_to_list(id(1)), + ?MODULE:f3(d, e), + ?MODULE:f1(start), + ?MODULE:f2(f, g), + erlang:integer_to_list(id(2)), + ?MODULE:f3(h, i), + ?MODULE:f1(stop), + ?MODULE:f2(j, k), + erlang:integer_to_list(id(3)), + ?MODULE:f3(l, m) + end, + fun (Tracee) -> + ?line 1 = + erlang:trace(Tracee, true, + [call,silent,return_to]), + ?line 1 = + erlang:trace_pattern( + {?MODULE,f2,2}, + [], + [local]), + ?line 1 = + erlang:trace_pattern( + {erlang,integer_to_list,1}, + [], + [local]), + ?line 1 = + erlang:trace_pattern( + {?MODULE,f1,1}, + [{[start],[],[{silent,false}]}, + {[stop],[],[{silent,true}]}], + [local]), + %% + %% Expected: + %% + ?line + [{trace,Tracee,call,{?MODULE,f1,[start]}}, + {trace,Tracee,return_to, + {?MODULE,'-silent_no_ms/1-fun-2-',0}}, + {trace,Tracee,call,{?MODULE,f2,[f,g]}}, + {trace,Tracee,return_to, + {?MODULE,'-silent_no_ms/1-fun-2-',0}}, + {trace,Tracee,call,{erlang,integer_to_list,[2]}}, + {trace,Tracee,return_to, + {?MODULE,'-silent_no_ms/1-fun-2-',0}}, + {trace,Tracee,call,{?MODULE,f2,[h,i]}}, + {trace,Tracee,return_to,{?MODULE,f3,2}}] + end). + +ms_trace2(doc) -> + ["Test the match spec functions {trace/2}"]; +ms_trace2(suite) -> []; +ms_trace2(Config) when is_list(Config) -> + Tracer = self(), + %% Meta trace init + %% + %% Trace global f1/1, local f2/2, global erlang:integer_to_list/1 + %% without match spec. Use match spec functions + %% {trace/2} to control trace through fn/2,3. + ?line tr( + fun () -> + ?MODULE:f1(a), + ?MODULE:f2(b, c), + erlang:integer_to_list(id(1)), + ?MODULE:f3(d, e), + fn([all], [call,return_to,{tracer,Tracer}]), + ?MODULE:f1(f), + f2(g, h), + f1(i), + erlang:integer_to_list(id(2)), + ?MODULE:f3(j, k), + fn([call,return_to], []), + ?MODULE:f1(l), + ?MODULE:f2(m, n), + erlang:integer_to_list(id(3)), + ?MODULE:f3(o, p) + end, + fun (Tracee) -> + ?line 1 = + erlang:trace(Tracee, false, [all]), + ?line 1 = + erlang:trace_pattern( + {?MODULE,f1,1}, + [], + [global]), + ?line 1 = + erlang:trace_pattern( + {?MODULE,f2,2}, + [], + [local]), + ?line 1 = + erlang:trace_pattern( + {erlang,integer_to_list,1}, + [], + [global]), + ?line 3 = + erlang:trace_pattern( + {?MODULE,fn,'_'}, + [{['$1','$2'],[], + [{trace,'$1','$2'},{message,ms_trace2}]}], + [meta]), + %% + %% Expected: (no return_to for global call trace) + %% + ?line Origin = {match_spec_SUITE,'-ms_trace2/1-fun-0-',1}, + ?line + [{trace_ts,Tracee,call, + {?MODULE,fn, + [[all],[call,return_to,{tracer,Tracer}]]}, + ms_trace2}, + {trace,Tracee,call,{?MODULE,f1,[f]}}, + {trace,Tracee,call,{?MODULE,f2,[g,h]}}, + {trace,Tracee,return_to,Origin}, + {trace,Tracee,call,{erlang,integer_to_list,[2]}}, + {trace,Tracee,call,{?MODULE,f2,[j,k]}}, + {trace,Tracee,return_to,{?MODULE,f3,2}}, + {trace_ts,Tracee,call, + {?MODULE,fn, + [[call,return_to],[]]}, + ms_trace2}] + end), + ok. + + + +ms_trace3(doc) -> + ["Test the match spec functions {trace/3}"]; +ms_trace3(suite) -> []; +ms_trace3(Config) when is_list(Config) -> + TraceeName = 'match_spec_SUITE:ms_trace3', + Tracer = self(), + %% Meta trace init + %% + %% Trace global f1/1, local f2/2, global erlang:integer_to_list/1 + %% without match spec. Use match spec functions + %% {trace/2} to control trace through fn/2,3. + Tag = make_ref(), + Controller = + spawn_link( + fun () -> + receive + {Tracee,Tag,start} -> + fn(TraceeName, [all], + [call,return_to,send,'receive', + {tracer,Tracer}]), + Tracee ! {self(),Tag,started}, + receive {Tracee,Tag,stop_1} -> ok end, + fn(Tracee, [call,return_to], []), + Tracee ! {self(),Tag,stopped_1}, + receive {Tracee,Tag,stop_2} -> ok end, + fn(Tracee, [all], []), + Tracee ! {self(),Tag,stopped_2} + end + end), + ?line tr( + fun () -> %% Action + register(TraceeName, self()), + ?MODULE:f1(a), + ?MODULE:f2(b, c), + erlang:integer_to_list(id(1)), + ?MODULE:f3(d, e), + Controller ! {self(),Tag,start}, + receive {Controller,Tag,started} -> ok end, + ?MODULE:f1(f), + f2(g, h), + f1(i), + erlang:integer_to_list(id(2)), + ?MODULE:f3(j, k), + Controller ! {self(),Tag,stop_1}, + receive {Controller,Tag,stopped_1} -> ok end, + ?MODULE:f1(l), + ?MODULE:f2(m, n), + erlang:integer_to_list(id(3)), + ?MODULE:f3(o, p), + Controller ! {self(),Tag,stop_2}, + receive {Controller,Tag,stopped_2} -> ok end, + ?MODULE:f1(q), + ?MODULE:f2(r, s), + erlang:integer_to_list(id(4)), + ?MODULE:f3(t, u) + end, + + fun (Tracee) -> %% Startup + ?line 1 = + erlang:trace(Tracee, false, [all]), + ?line 1 = + erlang:trace_pattern( + {?MODULE,f1,1}, + [], + [global]), + ?line 1 = + erlang:trace_pattern( + {?MODULE,f2,2}, + [], + [local]), + ?line 1 = + erlang:trace_pattern( + {erlang,integer_to_list,1}, + [], + [global]), + ?line 3 = + erlang:trace_pattern( + {?MODULE,fn,'_'}, + [{['$1','$2','$3'],[], + [{trace,'$1','$2','$3'},{message,Tag}]}], + [meta]), + %% + %% Expected: (no return_to for global call trace) + %% + ?line Origin = {match_spec_SUITE,'-ms_trace3/1-fun-1-',2}, + ?line + [{trace_ts,Controller,call, + {?MODULE,fn,[TraceeName,[all], + [call,return_to,send,'receive', + {tracer,Tracer}]]}, + Tag}, + {trace,Tracee,'receive',{Controller,Tag,started}}, + {trace,Tracee,call,{?MODULE,f1,[f]}}, + {trace,Tracee,call,{?MODULE,f2,[g,h]}}, + {trace,Tracee,return_to,Origin}, + {trace,Tracee,call,{erlang,integer_to_list,[2]}}, + {trace,Tracee,call,{?MODULE,f2,[j,k]}}, + {trace,Tracee,return_to,{?MODULE,f3,2}}, + {trace,Tracee,send,{Tracee,Tag,stop_1},Controller}, + {trace_ts,Controller,call, + {?MODULE,fn,[Tracee,[call,return_to],[]]}, + Tag}, + {trace_ts,Controller,call, + {?MODULE,fn,[Tracee,[all],[]]}, + Tag}] + end), + ok. + + + +destructive_in_test_bif(doc) -> + ["Test that destructive operations in test bif does not really happen"]; +destructive_in_test_bif(suite) -> []; +destructive_in_test_bif(Config) when is_list(Config) -> + ?line {ok,OldToken,_,_} = erlang:match_spec_test + ([], + [{'_',[],[{message,{get_seq_token}}]}],trace), + ?line {ok,_,_,_} = erlang:match_spec_test + ([], + [{'_',[],[{message,{set_seq_token, label, 1}}]}], + trace), + ?line {ok,OldToken,_,_} = erlang:match_spec_test + ([], + [{'_',[],[{message,{get_seq_token}}]}],trace), + ?line {ok, OldTCW,_,_} = erlang:match_spec_test + ([],[{'_',[],[{message,{get_tcw}}]}],trace), + ?line {ok,OldTCW,_,_} = erlang:match_spec_test + ([], + [{'_',[],[{message,{set_tcw, OldTCW+1}}]}], + trace), + ?line {ok, OldTCW,_,_} = erlang:match_spec_test + ([],[{'_',[],[{message,{get_tcw}}]}],trace), + ok. + +boxed_and_small(doc) -> + ["Test that the comparision between boxed and small does not crash emulator"]; +boxed_and_small(suite) -> []; +boxed_and_small(Config) when is_list(Config) -> + ?line {ok, Node} = start_node(match_spec_suite_other), + ?line ok = rpc:call(Node,?MODULE,do_boxed_and_small,[]), + ?line stop_node(Node), + ok. + +do_boxed_and_small() -> + {ok, false, _, _} = erlang:match_spec_test({0,3},[{{1.47,'_'},[],['$_']}],table), + {ok, false, _, _} = erlang:match_spec_test({0,3},[{{12345678901234567890,'_'},[],['$_']}],table), + {ok, false, _, _} = erlang:match_spec_test({0,3},[{{<<1,2,3,4>>,'_'},[],['$_']}],table), + {ok, false, _, _} = erlang:match_spec_test({0,3},[{{make_ref(),'_'},[],['$_']}],table), + ok. + +errchk(Pat) -> + case catch erlang:trace_pattern({?MODULE, f2, 2}, Pat) of + {'EXIT', {badarg, _}} -> + ok; + Other -> + test_server:fail({noerror, Other}) + end. + +unary_minus(suite) -> + []; +unary_minus(doc) -> + ["Checks that unary minus works"]; +unary_minus(Config) when is_list(Config) -> + ?line {ok,true,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'<',{'-','$1'},-4}], + [true]}], + table), + ?line {ok,false,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'<',{'-','$1'},-6}], + [true]}], + table), + ?line {ok,true,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'=:=',{'-','$1',2},3}], + [true]}], + table), + ?line {ok,false,[],[]} = erlang:match_spec_test + (hej, + [{'$1', + [{'=/=',{'-','$1'},0}], + [true]}], + table), + ok. +unary_plus(suite) -> + []; +unary_plus(doc) -> + ["Checks that unary plus works"]; +unary_plus(Config) when is_list(Config) -> + ?line {ok,true,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'<',{'+','$1'},6}], + [true]}], + table), + ?line {ok,false,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'<',{'+','$1'},4}], + [true]}], + table), + ?line {ok,true,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'=:=',{'+','$1',2},7}], + [true]}], + table), + ?line {ok,false,[],[]} = erlang:match_spec_test + (hej, + [{'$1', + [{'=/=',{'+','$1'},0}], + [true]}], + table), + ok. + + + + +guard_exceptions(suite) -> + []; +guard_exceptions(doc) -> + ["Checks that exceptions in guards are handled correctly"]; +guard_exceptions(Config) when is_list(Config) -> + ?line {ok,false,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'or',{is_integer,'$1'},{'or','$1','$1'}}], + [true]}], + table), + ?line {ok,true,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'orelse',{is_integer,'$1'}, + {'or','$1','$1'}}], + [true]}], + table), + ?line {ok,false,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'orelse',{'or','$1',true}, + {is_integer,'$1'}}], + [true]}], + table), + ?line {ok,false,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'or',{is_integer,'$1'}, + {'orelse','$1',true}}], + [true]}], + table), + ?line {ok,true,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'or',{is_integer,'$1'}, + {'orelse',true,'$1'}}], + [true]}], + table), + ?line {ok,true,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'or',{is_integer,'$1'}, + {'andalso',false,'$1'}}], + [true]}], + table), + ?line {ok,false,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'or',{is_integer,'$1'}, + {'andalso','$1',false}}], + [true]}], + table), + + ?line {ok,false,[],[]} = erlang:match_spec_test + (5, + [{'$1', + [{'or',{is_integer,'$1'}, + {'andalso','$1',false}}], + [true]}], + table), + + ok. + +fpe(suite) -> + []; +fpe(doc) -> + ["Checks floating point exceptions in match-specs"]; +fpe(Config) when is_list(Config) -> + MS = [{{'$1'},[],[{'/','$1',0}]}], + case catch (['EXIT','EXIT'] = + ets:match_spec_run([{1},{2}],ets:match_spec_compile(MS))) of + {'EXIT',_} -> test_server:fail({error, + "Floating point exceptions faulty"}); + _ -> ok + end. + +moving_labels(Config) when is_list(Config) -> + %% Force an andalso/orelse construction to be moved by placing it + %% in a tuple followed by a constant term. Labels should still + %% point at their correct target. + %% + Ms = [{{'$1','$2'},[],[{{ok,{'andalso','$1','$2'},[1,2,3]}}]}], + ?line {ok,{ok,false,[1,2,3]},[],[]} = + erlang:match_spec_test({true,false}, Ms, table), + + Ms2 = [{{'$1','$2'},[],[{{ok,{'orelse','$1','$2'},[1,2,3]}}]}], + ?line {ok,{ok,true,[1,2,3]},[],[]} = + erlang:match_spec_test({true,false}, Ms2, table), + + ok. + +tr(Fun, MFA, Pat, Expected) -> + tr(Fun, MFA, [call], Pat, [global], Expected). + +tr(Fun, MFA, TraceFlags, Pat, PatFlags, Expected0) -> + tr(Fun, + fun(P) -> + erlang:trace(P, true, TraceFlags), + erlang:trace_pattern(MFA, Pat, PatFlags), + lists:map( + fun(X) -> + list_to_tuple([trace, P | tuple_to_list(X)]) + end, + Expected0) + end). + +tr(RunFun, ControlFun) -> + P = spawn(?MODULE, runner, [self(), RunFun]), + collect(P, ControlFun(P)). + +collect(P, TMs) -> + start_collect(P), + collect(TMs), + stop_collect(P). + +collect([]) -> + receive + M -> + ?t:format("Got unexpected: ~p~n", [M]), + flush({got_unexpected,M}) + after 17 -> + ok + end; +collect([TM | TMs]) -> + ?t:format( "Expecting: ~p~n", [TM]), + receive + M -> + case if element(1, M) == trace_ts -> + list_to_tuple(lists:reverse( + tl(lists:reverse(tuple_to_list(M))))); + true -> M + end of + TM -> + ?t:format("Got: ~p~n", [M]), + collect(TMs); + _ -> + ?t:format("Got unexpected: ~p~n", [M]), + flush({got_unexpected,M}) + end + end. + +flush(Reason) -> + receive + M -> + ?t:format("In queue: ~p~n", [M]), + flush(Reason) + after 17 -> + ?t:fail(Reason) + end. + +start_collect(P) -> + P ! {go, self()}. + +stop_collect(P) -> + P ! {done, self()}, + receive + {gone, P} -> + ok + end. + + +runner(Collector, Fun) -> + receive + {go, Collector} -> + go + end, + Fun(), + receive + {done, Collector} -> + Collector ! {gone, self()} + end. + +f1(X) -> + {X}. + +f2(X, Y) -> + {X, Y}. + +f3(X,Y) -> + ?MODULE:f2(X,Y), + ok. + +fn(X) -> + [X]. +fn(X, Y) -> + [X, Y]. +fn(X, Y, Z) -> + [X, Y, Z]. + +id(X) -> + X. + +start_node(Name) -> + Pa = filename:dirname(code:which(?MODULE)), + Cookie = atom_to_list(erlang:get_cookie()), + test_server:start_node(Name, slave, + [{args, "-setcookie " ++ Cookie ++" -pa " ++ Pa}]). + +stop_node(Node) -> + test_server:stop_node(Node). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/module_info_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/module_info_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/module_info_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/module_info_SUITE.erl 2009-09-18 15:08:58.000000000 +0100 @@ -0,0 +1,105 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(module_info_SUITE). + +-include("test_server.hrl"). + +-export([all/1,init_per_testcase/2,end_per_testcase/2, + exports/1,functions/1,native/1]). + +%%-compile(native). + +%% Helper. +-export([native_proj/1,native_filter/1]). + +all(suite) -> + [exports,functions,native]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(3)), + [{watchdog,Dog}|Config]. + +end_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +%% Should return all functions exported from this module. (local) +all_exported() -> + All = add_arity(all(suite)), + lists:sort([{all,1},{init_per_testcase,2},{end_per_testcase,2}, + {module_info,0},{module_info,1},{native_proj,1}, + {native_filter,1}|All]). + +%% Should return all functions in this module. (local) +all_functions() -> + Locals = [{add_arity,1},{add_arity,2},{all_exported,0},{all_functions,0}], + lists:sort(Locals++all_exported()). + +%% Test that the list of exported functions from this module is correct. +exports(Config) when is_list(Config) -> + ?line All = all_exported(), + ?line All = lists:sort(?MODULE:module_info(exports)), + ?line (catch ?MODULE:foo()), + ?line All = lists:sort(?MODULE:module_info(exports)), + ok. + +%% Test that the list of exported functions from this module is correct. +functions(Config) when is_list(Config) -> + ?line All = all_functions(), + ?line All = lists:sort(?MODULE:module_info(functions)), + ok. + +%% Test that the list of exported functions from this module is correct. +native(Config) when is_list(Config) -> + ?line All = all_functions(), + ?line case ?MODULE:module_info(native_addresses) of + [] -> + {comment,"no native functions"}; + L -> + %% Verify that all functions have unique addresses. + ?line S0 = sofs:set(L, [{name,arity,addr}]), + ?line S1 = sofs:projection({external,fun ?MODULE:native_proj/1}, S0), + ?line S2 = sofs:relation_to_family(S1), + ?line S3 = sofs:family_specification(fun ?MODULE:native_filter/1, S2), + ?line 0 = sofs:no_elements(S3), + ?line S4 = sofs:range(S1), + + %% Verify that the set of function with native addresses + %% is a subset of all functions in the module. + ?line AllSet = sofs:set(All, [{name,arity}]), + ?line true = sofs:is_subset(S4, AllSet), + + {comment,integer_to_list(sofs:no_elements(S0))++" native functions"} + end. + +native_proj({Name,Arity,Addr}) -> + {Addr,{Name,Arity}}. + +native_filter(Set) -> + sofs:no_elements(Set) =/= 1. + +%% Helper functions (local). + +add_arity(L) -> + add_arity(L, []). + +add_arity([H|T], Acc) -> + add_arity(T, [{H,1}|Acc]); +add_arity([], Acc) -> lists:reverse(Acc). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/monitor_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/monitor_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/monitor_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/monitor_SUITE.erl 2009-09-18 15:08:02.000000000 +0100 @@ -0,0 +1,943 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(monitor_SUITE). + +-include("test_server.hrl"). + +-export([all/1, + case_1/1, case_1a/1, case_2/1, case_2a/1, mon_e_1/1, demon_e_1/1, demon_1/1, + demon_2/1, demon_3/1, demonitor_flush/1, remove_monitor/1, + local_remove_monitor/1, remote_remove_monitor/1, mon_1/1, mon_2/1, + large_exit/1, list_cleanup/1, mixer/1, named_down/1, otp_5827/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-export([y2/1, g/1, g0/0, g1/0, large_exit_sub/1]). + +all(suite) -> + [case_1, case_1a, case_2, case_2a, mon_e_1, demon_e_1, demon_1, mon_1, + mon_2, demon_2, demon_3, demonitor_flush, remove_monitor, + large_exit, list_cleanup, mixer, named_down, + otp_5827]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(15)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +case_1(doc) -> + "A monitors B, B kills A and then exits (yielded core dump)"; +case_1(suite) -> []; +case_1(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line spawn_link(?MODULE, g0, []), + ?line receive _ -> ok end, + ok. + +case_1a(doc) -> + "A monitors B, B kills A and then exits (yielded core dump)"; +case_1a(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line spawn_link(?MODULE, g1, []), + ?line receive _ -> ok end, + ok. + +g0() -> + ?line B = spawn(?MODULE, g, [self()]), + ?line erlang:monitor(process, B), + ?line B ! ok, + ?line receive ok -> ok end, + ok. + +g1() -> + ?line {B,_} = spawn_monitor(?MODULE, g, [self()]), + ?line B ! ok, + ?line receive ok -> ok end, + ok. + +g(Parent) -> + ?line receive ok -> ok end, + ?line exit(Parent, foo), + ?line ok. + + +case_2(doc) -> + "A monitors B, B demonitors A (yielded core dump)"; +case_2(Config) when is_list(Config) -> + ?line B = spawn(?MODULE, y2, [self()]), + ?line R = erlang:monitor(process, B), + ?line B ! R, + ?line receive + {'EXIT', _} -> ok; + Other -> + test_server:fail({rec, Other}) + end, + ?line expect_down(R, B, normal), + ok. + +case_2a(doc) -> + "A monitors B, B demonitors A (yielded core dump)"; +case_2a(Config) when is_list(Config) -> + ?line {B,R} = spawn_monitor(?MODULE, y2, [self()]), + ?line B ! R, + ?line receive + {'EXIT', _} -> ok; + Other -> + test_server:fail({rec, Other}) + end, + ?line expect_down(R, B, normal), + ok. + +y2(Parent) -> + ?line R = receive T -> T end, + ?line Parent ! (catch erlang:demonitor(R)), + ok. + +expect_down(Ref, P) -> + receive + {'DOWN', Ref, process, P, Reason} -> + Reason; + Other -> + test_server:fail({rec, Other}) + end. + +expect_down(Ref, P, Reason) -> + receive + {'DOWN', Ref, process, P, Reason} -> + ok; + Other -> + test_server:fail({rec, Other}) + end. + +expect_no_msg() -> + receive + Msg -> + test_server:fail({msg, Msg}) + after 0 -> + ok + end. + +%%% Error cases for monitor/2 + +mon_e_1(doc) -> + "Error cases for monitor/2"; +mon_e_1(suite) -> []; +mon_e_1(Config) when is_list(Config) -> + ?line {ok, N} = test_server:start_node(hej, slave, []), + ?line mon_error(plutt, self()), + ?line mon_error(process, [bingo]), + ?line mon_error(process, {rex, N, junk}), + ?line mon_error(process, 1), + + ?line true = test_server:stop_node(N), + ok. + +%%% We would also like to have a test case that tries to monitor something +%%% on an R5 node, but this isn't possible to do systematically. +%%% +%%% Likewise against an R6 node, which is not capable of monitoring +%%% by name, which gives a badarg on the R7 node at the call to +%%% erlang:monitor(process, {Name, Node}). This has been tested +%%% manually at least once. + +mon_error(Type, Item) -> + case catch erlang:monitor(Type, Item) of + {'EXIT', _} -> + ok; + Other -> + test_server:fail({err, Other}) + end. + +%%% Error cases for demonitor/1 + +demon_e_1(doc) -> + "Error cases for demonitor/1"; +demon_e_1(suite) -> []; +demon_e_1(Config) when is_list(Config) -> + ?line {ok, N} = test_server:start_node(hej, slave, []), + ?line demon_error(plutt, badarg), + ?line demon_error(1, badarg), + + %% Demonitor with ref created at other node + ?line R1 = rpc:call(N, erlang, make_ref, []), + ?line demon_error(R1, badarg), + + %% Demonitor with ref created at wrong monitor link end + ?line P0 = self(), + ?line P2 = spawn( + fun() -> + P0 ! {self(), ref, erlang:monitor(process,P0)}, + receive {P0, stop} -> ok end + end ), + ?line receive + {P2, ref, R2} -> + ?line demon_error(R2, badarg), + ?line P2 ! {self(), stop}; + Other2 -> + test_server:fail({rec, Other2}) + end, + + ?line true = test_server:stop_node(N), + ok. + +demon_error(Ref, Reason) -> + case catch erlang:demonitor(Ref) of + {'EXIT', {Reason, _}} -> + ok; + Other -> + test_server:fail({err, Other}) + end. + +%%% No-op cases for demonitor/1 + +demon_1(doc) -> + "demonitor/1"; +demon_1(suite) -> []; +demon_1(Config) when is_list(Config) -> + ?line true = erlang:demonitor(make_ref()), + ok. + + +%%% Cases for demonitor/1 + +demon_2(doc) -> + "Cases for demonitor/1"; +demon_2(suite) -> []; +demon_2(Config) when is_list(Config) -> + ?line R1 = erlang:monitor(process, self()), + ?line true = erlang:demonitor(R1), + %% Extra demonitor + ?line true = erlang:demonitor(R1), + ?line expect_no_msg(), + + %% Normal 'DOWN' + ?line P2 = spawn(timer, sleep, [1]), + ?line R2 = erlang:monitor(process, P2), + ?line case expect_down(R2, P2) of + normal -> ?line ok; + noproc -> ?line ok; + BadReason -> ?line ?t:fail({bad_reason, BadReason}) + end, + +%% OTP-5772 +% %% 'DOWN' before demonitor +% ?line P3 = spawn(timer, sleep, [100000]), +% ?line R3 = erlang:monitor(process, P3), +% ?line exit(P3, frop), +% ?line erlang:demonitor(R3), +% ?line expect_down(R3, P3, frop), + + %% Demonitor before 'DOWN' + ?line P4 = spawn(timer, sleep, [100000]), + ?line R4 = erlang:monitor(process, P4), + ?line erlang:demonitor(R4), + ?line exit(P4, frop), + ?line expect_no_msg(), + + ok. + +demon_3(doc) -> + "Distributed case for demonitor/1 (OTP-3499)"; +demon_3(suite) -> []; +demon_3(Config) when is_list(Config) -> + ?line {ok, N} = test_server:start_node(hej, slave, []), + + %% 'DOWN' before demonitor + ?line P2 = spawn(N, timer, sleep, [100000]), + ?line R2 = erlang:monitor(process, P2), + ?line true = test_server:stop_node(N), + ?line true = erlang:demonitor(R2), + ?line expect_down(R2, P2, noconnection), + + ?line {ok, N2} = test_server:start_node(hej, slave, []), + + %% Demonitor before 'DOWN' + ?line P3 = spawn(N2, timer, sleep, [100000]), + ?line R3 = erlang:monitor(process, P3), + ?line true = erlang:demonitor(R3), + ?line true = test_server:stop_node(N2), + ?line expect_no_msg(), + + ok. + +demonitor_flush(suite) -> []; +demonitor_flush(doc) -> []; +demonitor_flush(Config) when is_list(Config) -> + ?line {'EXIT', {badarg, _}} = (catch erlang:demonitor(make_ref(), flush)), + ?line {'EXIT', {badarg, _}} = (catch erlang:demonitor(make_ref(), [flus])), + ?line {'EXIT', {badarg, _}} = (catch erlang:demonitor(x, [flush])), + ?line {ok, N} = test_server:start_node(demonitor_flush, slave, []), + ?line ok = demonitor_flush_test(N), + ?line true = test_server:stop_node(N), + ?line ok = demonitor_flush_test(node()). + +demonitor_flush_test(Node) -> + ?line P = spawn(Node, timer, sleep, [100000]), + ?line M1 = erlang:monitor(process, P), + ?line M2 = erlang:monitor(process, P), + ?line M3 = erlang:monitor(process, P), + ?line M4 = erlang:monitor(process, P), + ?line true = erlang:demonitor(M1, [flush, flush]), + ?line exit(P, bang), + ?line receive {'DOWN', M2, process, P, bang} -> ok end, + ?line receive after 100 -> ok end, + ?line true = erlang:demonitor(M3, [flush]), + ?line true = erlang:demonitor(M4, []), + ?line receive {'DOWN', M4, process, P, bang} -> ok end, + ?line receive + {'DOWN', M, _, _, _} =DM when M == M1, + M == M3 -> + ?line ?t:fail({unexpected_down_message, DM}) + after 100 -> + ?line ok + end. + +-define(RM_MON_GROUPS, 100). +-define(RM_MON_GPROCS, 100). + +remove_monitor(suite) -> + [local_remove_monitor, remote_remove_monitor]. + +local_remove_monitor(Config) when is_list(Config) -> + Gs = generate(fun () -> start_remove_monitor_group(node()) end, + ?RM_MON_GROUPS), + {True, False} = lists:foldl(fun (G, {T, F}) -> + receive + {rm_mon_res, G, {GT, GF}} -> + {T+GT, F+GF} + end + end, + {0, 0}, + Gs), + erlang:display({local_remove_monitor, True, False}), + {comment, + "True = "++integer_to_list(True)++"; False = "++integer_to_list(False)}. + +remote_remove_monitor(Config) when is_list(Config) -> + ?line {ok, N} = test_server:start_node(demonitor_flush, slave, []), + Gs = generate(fun () -> start_remove_monitor_group(node()) end, + ?RM_MON_GROUPS), + {True, False} = lists:foldl(fun (G, {T, F}) -> + receive + {rm_mon_res, G, {GT, GF}} -> + {T+GT, F+GF} + end + end, + {0, 0}, + Gs), + erlang:display({remote_remove_monitor, True, False}), + ?line true = test_server:stop_node(N), + {comment, + "True = "++integer_to_list(True)++"; False = "++integer_to_list(False)}. + +start_remove_monitor_group(Node) -> + Master = self(), + spawn_link( + fun () -> + Ms = generate(fun () -> + P = spawn(Node, fun () -> ok end), + erlang:monitor(process, P) + end, ?RM_MON_GPROCS), + Res = lists:foldl(fun (M, {T, F}) -> + case erlang:demonitor(M, [info]) of + true -> + receive + {'DOWN', M, _, _, _} -> + exit(down_msg_found) + after 0 -> + ok + end, + {T+1, F}; + false -> + receive + {'DOWN', M, _, _, _} -> + ok + after 0 -> + exit(no_down_msg_found) + end, + {T, F+1} + end + end, + {0,0}, + Ms), + Master ! {rm_mon_res, self(), Res} + end). + + +%%% Cases for monitor/2 + +mon_1(doc) -> + "Cases for monitor/2"; +mon_1(suite) -> []; +mon_1(Config) when is_list(Config) -> + %% Normal case + ?line P2 = spawn(timer, sleep, [1]), + ?line R2 = erlang:monitor(process, P2), + ?line case expect_down(R2, P2) of + normal -> ?line ok; + noproc -> ?line ok; + BadReason -> ?line ?t:fail({bad_reason, BadReason}) + end, + ?line {P2A,R2A} = spawn_monitor(timer, sleep, [1]), + ?line expect_down(R2A, P2A, normal), + + %% 'DOWN' with other reason + ?line P3 = spawn(timer, sleep, [100000]), + ?line R3 = erlang:monitor(process, P3), + ?line exit(P3, frop), + ?line expect_down(R3, P3, frop), + ?line {P3A,R3A} = spawn_monitor(timer, sleep, [100000]), + ?line exit(P3A, frop), + ?line expect_down(R3A, P3A, frop), + + %% Monitor fails because process is dead + ?line R4 = erlang:monitor(process, P3), + ?line expect_down(R4, P3, noproc), + + %% Normal case (named process) + ?line P5 = start_jeeves(jeeves), + ?line R5 = erlang:monitor(process, jeeves), + ?line tell_jeeves(P5, stop), + ?line expect_down(R5, {jeeves, node()}, normal), + + %% 'DOWN' with other reason and node explicit activation + ?line P6 = start_jeeves(jeeves), + ?line R6 = erlang:monitor(process, {jeeves, node()}), + ?line tell_jeeves(P6, {exit, frop}), + ?line expect_down(R6, {jeeves, node()}, frop), + + %% Monitor (named process) fails because process is dead + ?line R7 = erlang:monitor(process, {jeeves, node()}), + ?line expect_down(R7, {jeeves, node()}, noproc), + + ok. + +mon_2(doc) -> + "Distributed cases for monitor/2"; +mon_2(suite) -> []; +mon_2(Config) when is_list(Config) -> + ?line {ok, N1} = test_server:start_node(hej1, slave, []), + + %% Normal case + ?line P2 = spawn(N1, timer, sleep, [4000]), + ?line R2 = erlang:monitor(process, P2), + ?line expect_down(R2, P2, normal), + + %% 'DOWN' with other reason + ?line P3 = spawn(N1, timer, sleep, [100000]), + ?line R3 = erlang:monitor(process, P3), + ?line exit(P3, frop), + ?line expect_down(R3, P3, frop), + + %% Monitor fails because process is dead + ?line R4 = erlang:monitor(process, P3), + ?line expect_down(R4, P3, noproc), + + %% Other node goes down + ?line P5 = spawn(N1, timer, sleep, [100000]), + ?line R5 = erlang:monitor(process, P5), + + ?line true = test_server:stop_node(N1), + + ?line expect_down(R5, P5, noconnection), + + %% Monitor fails because other node is dead + ?line P6 = spawn(N1, timer, sleep, [100000]), + ?line R6 = erlang:monitor(process, P6), + ?line R6_Reason = expect_down(R6, P6), + ?line true = (R6_Reason == noconnection) orelse (R6_Reason == noproc), + + %% Start a new node that can load code in this module + ?line PA = filename:dirname(code:which(?MODULE)), + ?line {ok, N2} = test_server:start_node + (hej2, slave, [{args, "-pa " ++ PA}]), + + %% Normal case (named process) + ?line P7 = start_jeeves({jeeves, N2}), + ?line R7 = erlang:monitor(process, {jeeves, N2}), + ?line tell_jeeves(P7, stop), + ?line expect_down(R7, {jeeves, N2}, normal), + + %% 'DOWN' with other reason (named process) + ?line P8 = start_jeeves({jeeves, N2}), + ?line R8 = erlang:monitor(process, {jeeves, N2}), + ?line tell_jeeves(P8, {exit, frop}), + ?line expect_down(R8, {jeeves, N2}, frop), + + %% Monitor (named process) fails because process is dead + ?line R9 = erlang:monitor(process, {jeeves, N2}), + ?line expect_down(R9, {jeeves, N2}, noproc), + + %% Other node goes down (named process) + ?line _P10 = start_jeeves({jeeves, N2}), + ?line R10 = erlang:monitor(process, {jeeves, N2}), + + ?line true = test_server:stop_node(N2), + + ?line expect_down(R10, {jeeves, N2}, noconnection), + + %% Monitor (named process) fails because other node is dead + ?line R11 = erlang:monitor(process, {jeeves, N2}), + ?line expect_down(R11, {jeeves, N2}, noconnection), + + ok. + +%%% Large exit reason. Crashed first attempt to release R5B. + +large_exit(doc) -> + "Large exit reason"; +large_exit(suite) -> []; +large_exit(Config) when is_list(Config) -> + ?line f(100), + ok. + +f(0) -> + ok; +f(N) -> + f(), + f(N-1). + +f() -> + ?line S0 = {big, tuple, with, [list, 4563784278]}, + ?line S = {S0, term_to_binary(S0)}, + ?line P = spawn(?MODULE, large_exit_sub, [S]), + ?line R = erlang:monitor(process, P), + ?line P ! hej, + receive + {'DOWN', R, process, P, X} -> + ?line io:format(" -> ~p~n", [X]), + if + X == S -> + ok; + true -> + test_server:fail({X, S}) + end; + Other -> + ?line io:format(" -> ~p~n", [Other]), + exit({answer, Other}) + end. + +large_exit_sub(S) -> + receive _X -> ok end, + exit(S). + +%%% Testing of monitor link list cleanup +%%% by using erlang:process_info(self(), monitors) +%%% and erlang:process_info(self(), monitored_by) + +list_cleanup(doc) -> + "Testing of monitor link list cleanup by using " ++ + "erlang:process_info/2"; +list_cleanup(suite) -> []; +list_cleanup(Config) when is_list(Config) -> + ?line P0 = self(), + ?line M = node(), + ?line PA = filename:dirname(code:which(?MODULE)), + ?line true = register(master_bertie, self()), + + %% Normal local case, monitor and demonitor + ?line P1 = start_jeeves(jeeves), + ?line {[], []} = monitors(), + ?line expect_jeeves(P1, monitors, {monitors, {[], []}}), + ?line R1a = erlang:monitor(process, P1), + ?line {[{process, P1}], []} = monitors(), + ?line expect_jeeves(P1, monitors, {monitors, {[], [P0]}}), + ?line true = erlang:demonitor(R1a), + ?line expect_no_msg(), + ?line {[], []} = monitors(), + ?line expect_jeeves(P1, monitors, {monitors, {[], []}}), + %% Remonitor named and try again, now exiting the monitored process + ?line R1b = erlang:monitor(process, jeeves), + ?line {[{process, {jeeves, M}}], []} = monitors(), + ?line expect_jeeves(P1, monitors, {monitors, {[], [P0]}}), + ?line tell_jeeves(P1, stop), + ?line expect_down(R1b, {jeeves, node()}, normal), + ?line {[], []} = monitors(), + + %% Slightly weird local case - the monitoring process crashes + ?line P2 = start_jeeves(jeeves), + ?line {[], []} = monitors(), + ?line expect_jeeves(P2, monitors, {monitors, {[], []}}), + ?line {monitor_process, _R2} = + ask_jeeves(P2, {monitor_process, master_bertie}), + ?line {[], [P2]} = monitors(), + ?line expect_jeeves(P2, monitors, + {monitors, {[{process, {master_bertie, node()}}], []}}), + ?line tell_jeeves(P2, {exit, frop}), + timer:sleep(2000), + ?line {[], []} = monitors(), + + %% Start a new node that can load code in this module + ?line {ok, J} = test_server:start_node + (jeeves, slave, [{args, "-pa " ++ PA}]), + + %% Normal remote case, monitor and demonitor + ?line P3 = start_jeeves({jeeves, J}), + ?line {[], []} = monitors(), + ?line expect_jeeves(P3, monitors, {monitors, {[], []}}), + ?line R3a = erlang:monitor(process, P3), + ?line {[{process, P3}], []} = monitors(), + ?line expect_jeeves(P3, monitors, {monitors, {[], [P0]}}), + ?line true = erlang:demonitor(R3a), + ?line expect_no_msg(), + ?line {[], []} = monitors(), + ?line expect_jeeves(P3, monitors, {monitors, {[], []}}), + %% Remonitor named and try again, now exiting the monitored process + ?line R3b = erlang:monitor(process, {jeeves, J}), + ?line {[{process, {jeeves, J}}], []} = monitors(), + ?line expect_jeeves(P3, monitors, {monitors, {[], [P0]}}), + ?line tell_jeeves(P3, stop), + ?line expect_down(R3b, {jeeves, J}, normal), + ?line {[], []} = monitors(), + + %% Slightly weird remote case - the monitoring process crashes + ?line P4 = start_jeeves({jeeves, J}), + ?line {[], []} = monitors(), + ?line expect_jeeves(P4, monitors, {monitors, {[], []}}), + ?line {monitor_process, _R4} = + ask_jeeves(P4, {monitor_process, {master_bertie, M}}), + ?line {[], [P4]} = monitors(), + ?line expect_jeeves(P4, monitors, + {monitors, {[{process, {master_bertie, M}}], []}} ), + ?line tell_jeeves(P4, {exit, frop}), + timer:sleep(2000), + ?line {[], []} = monitors(), + + %% Now, the monitoring remote node crashes + ?line P5 = start_jeeves({jeeves, J}), + ?line {[], []} = monitors(), + ?line expect_jeeves(P5, monitors, {monitors, {[], []}}), + ?line {monitor_process, _R5} = + ask_jeeves(P5, {monitor_process, P0}), + ?line {[], [P5]} = monitors(), + ?line expect_jeeves(P5, monitors, + {monitors, {[{process, P0}], []}} ), + ?line test_server:stop_node(J), + timer:sleep(4000), + ?line {[], []} = monitors(), + + ?line true = unregister(master_bertie), + ok. + + +%%% Mixed internal and external monitors + +mixer(doc) -> + "Test mixing of internal and external monitors."; +mixer(Config) when is_list(Config) -> + ?line PA = filename:dirname(code:which(?MODULE)), + ?line NN = [j0,j1,j2,j3], +% ?line NN = [j0,j1], + ?line NL0 = [begin + {ok, J} = test_server:start_node + (X, slave, [{args, "-pa " ++ PA}]), + J + end || X <- NN], + ?line NL1 = lists:duplicate(2,node()) ++ NL0, + ?line Perm = perm(NL1), + ?line lists:foreach( + fun(NL) -> + ?line Js = [ start_jeeves({[],M}) || M <- (NL ++ NL) ], + ?line [ask_jeeves(P,{monitor_process,self()}) || P <- Js], + ?line {monitored_by,MB} = + process_info(self(),monitored_by), + ?line MBL = lists:sort(MB), + ?line JsL = lists:sort(Js), + ?line MBL = JsL, + ?line {monitors,[]} = process_info(self(),monitors), + ?line [tell_jeeves(P,{exit,flaff}) || P <- Js], + ?line wait_for_m([],[],200) + end, + Perm), + ?line lists:foreach( + fun(NL) -> + ?line Js = [ start_jeeves({[],M}) || M <- (NL ++ NL) ], + ?line Rs = [begin + {monitor_process,Ref} = + ask_jeeves(P,{monitor_process,self()}), + {P,Ref} + end + || P <- Js], + ?line {monitored_by,MB} = + process_info(self(),monitored_by), + ?line MBL = lists:sort(MB), + ?line JsL = lists:sort(Js), + ?line MBL = JsL, + ?line {monitors,[]} = process_info(self(),monitors), + ?line [ask_jeeves(P,{demonitor,Ref}) || {P,Ref} <- Rs], + ?line wait_for_m([],[],200), + ?line [tell_jeeves(P,{exit,flaff}) || P <- Js] + end, + Perm), + ?line lists:foreach( + fun(NL) -> + ?line Js = [ start_jeeves({[],M}) || M <- (NL ++ NL) ], + ?line [ask_jeeves(P,{monitor_process,self()}) || P <- Js], + ?line [erlang:monitor(process,P) || P <- Js], + ?line {monitored_by,MB} = + process_info(self(),monitored_by), + ?line MBL = lists:sort(MB), + ?line JsL = lists:sort(Js), + ?line MBL = JsL, + ?line {monitors,M} = + process_info(self(),monitors), + ?line ML = lists:sort([P||{process,P} <- M]), + ?line ML = JsL, + ?line [begin + tell_jeeves(P,{exit,flaff}), + receive {'DOWN',_,process,P,_} -> ok end + end || P <- Js], + ?line wait_for_m([],[],200) + end, + Perm), + ?line lists:foreach( + fun(NL) -> + ?line Js = [ start_jeeves({[],M}) || M <- (NL ++ NL) ], + ?line Rs = [begin + {monitor_process,Ref} = + ask_jeeves(P,{monitor_process,self()}), + {P,Ref} + end + || P <- Js], + ?line R2s = [{P,erlang:monitor(process,P)} || P <- Js], + ?line {monitored_by,MB} = + process_info(self(),monitored_by), + ?line MBL = lists:sort(MB), + ?line JsL = lists:sort(Js), + ?line MBL = JsL, + ?line {monitors,M} = + process_info(self(),monitors), + ?line ML = lists:sort([P||{process,P} <- M]), + ?line ML = JsL, + ?line [ask_jeeves(P,{demonitor,Ref}) || {P,Ref} <- Rs], + ?line wait_for_m(lists:sort(M),[],200), + ?line [erlang:demonitor(Ref) || {_P,Ref} <- R2s], + ?line wait_for_m([],[],200), + ?line [tell_jeeves(P,{exit,flaff}) || P <- Js] + end, + Perm), + [test_server:stop_node(K) || K <- NL0 ], + ok. + +named_down(doc) -> ["Test that DOWN message for a named monitor isn't" + " delivered until name has been unregistered"]; +named_down(suite) -> []; +named_down(Config) when is_list(Config) -> + ?line {A,B,C} = now(), + ?line Name = list_to_atom(atom_to_list(?MODULE) + ++ "-named_down-" + ++ integer_to_list(A) + ++ "-" ++ integer_to_list(B) + ++ "-" ++ integer_to_list(C)), + ?line Prio = process_flag(priority,high), + %% Spawn a bunch of high prio cpu bound processes to prevent + %% normal prio processes from terminating during the next + %% 500 ms... + ?line Self = self(), + ?line spawn_opt(fun () -> + WFun = fun + (F, hej) -> F(F, hopp); + (F, hopp) -> F(F, hej) + end, + NoSchedulers = erlang:system_info(schedulers_online), + lists:foreach(fun (_) -> + spawn_opt(fun () -> + WFun(WFun, + hej) + end, + [{priority,high}, + link]) + end, + lists:seq(1, NoSchedulers)), + receive after 500 -> ok end, + unlink(Self), + exit(bang) + end, + [{priority,high}, link]), + ?line NamedProc = spawn_link(fun () -> + receive after infinity -> ok end + end), + ?line true = register(Name, NamedProc), + ?line unlink(NamedProc), + ?line exit(NamedProc, bang), + ?line Mon = erlang:monitor(process, Name), + ?line receive {'DOWN',Mon, _, _, _} -> ok end, + ?line true = register(Name, self()), + ?line true = unregister(Name), + ?line process_flag(priority,Prio), + ok. + +otp_5827(doc) -> []; +otp_5827(suite) -> []; +otp_5827(Config) when is_list(Config) -> + %% Make a pid with the same nodename but with another creation + ?line [CreEnd | RPTail] + = lists:reverse(binary_to_list(term_to_binary(self()))), + ?line NewCreEnd = case CreEnd of + 0 -> 1; + 1 -> 2; + _ -> CreEnd - 1 + end, + ?line OtherCreationPid + = binary_to_term(list_to_binary(lists:reverse([NewCreEnd | RPTail]))), + %% If the bug is present erlang:monitor(process, OtherCreationPid) + %% will hang... + ?line Parent = self(), + ?line Ok = make_ref(), + ?line spawn(fun () -> + Mon = erlang:monitor(process, OtherCreationPid), + % Should get the DOWN message right away + receive + {'DOWN', Mon, process, OtherCreationPid, noproc} -> + Parent ! Ok + end + end), + ?line receive + Ok -> + ?line ok + after 1000 -> + ?line ?t:fail("erlang:monitor/2 hangs") + end. + + +wait_for_m(_,_,0) -> + exit(monitor_wait_timeout); +wait_for_m(Monitors, MonitoredBy, N) -> + {monitors,M0} = process_info(self(),monitors), + {monitored_by,MB0} = process_info(self(),monitored_by), + case lists:sort(M0) of + Monitors -> + case lists:sort(MB0) of + MonitoredBy -> + ok; + _ -> + receive after 100 -> ok end, + wait_for_m(Monitors,MonitoredBy,N-1) + end; + _ -> + receive after 100 -> ok end, + wait_for_m(Monitors,MonitoredBy,N-1) + end. + +% All permutations of a list... +perm([]) -> + []; +perm([X]) -> + [[X]]; +perm(List) -> + perm([],List,[]). + +perm(_,[],Acc) -> + Acc; +perm(Pre,[El|Post],Acc) -> + Res = [[El|X] || X <- perm(Pre ++ Post)], + perm(Pre ++ [El], Post, Res ++ Acc). + + +%%% Our butler for named process monitor tests + +jeeves(Parent, Name, Ref) + when is_pid(Parent), (is_atom(Name) or (Name =:= [])), is_reference(Ref) -> + %%io:format("monitor_SUITE:jeeves(~p, ~p)~n", [Parent, Name]), + case Name of + Atom when is_atom(Atom) -> + register(Name, self()); + [] -> + ok + end, + Parent ! {self(), Ref}, + jeeves_loop(Parent). + +jeeves_loop(Parent) -> + receive + {Parent, monitors} -> + Parent ! {self(), {monitors, monitors()}}, + jeeves_loop(Parent); + {Parent, {monitor_process, P}} -> + Parent ! {self(), {monitor_process, + catch erlang:monitor(process, P) }}, + jeeves_loop(Parent); + {Parent, {demonitor, Ref}} -> + Parent ! {self(), {demonitor, catch erlang:demonitor(Ref)}}, + jeeves_loop(Parent); + {Parent, stop} -> + ok; + {Parent, {exit, Reason}} -> + exit(Reason); + Other -> + io:format("~p:jeeves_loop received ~p~n", [?MODULE, Other]) + end. + + +start_jeeves({Name, Node}) + when (is_atom(Name) or (Name =:= [])), is_atom(Node) -> + Parent = self(), + Ref = make_ref(), + Pid = spawn(Node, fun() -> jeeves(Parent, Name, Ref) end), + receive + {Pid, Ref} -> + ok; + Other -> + test_server:fail({rec, Other}) + end, + Pid; +start_jeeves(Name) when is_atom(Name) -> + start_jeeves({Name, node()}). + + +tell_jeeves(Pid, What) when is_pid(Pid) -> + Pid ! {self(), What}. + + +ask_jeeves(Pid, Request) when is_pid(Pid) -> + Pid ! {self(), Request}, + receive + {Pid, Response} -> + Response; + Other -> + test_server:fail({rec, Other}) + end. + + +expect_jeeves(Pid, Request, Response) when is_pid(Pid) -> + Pid ! {self(), Request}, + receive + {Pid, Response} -> + ok; + Other -> + test_server:fail({rec, Other}) + end. + + +monitors() -> + monitors(self()). + +monitors(Pid) when is_pid(Pid) -> + {monitors, Monitors} = process_info(self(), monitors), + {monitored_by, MonitoredBy} = process_info(self(), monitored_by), + {Monitors, MonitoredBy}. + +generate(_Fun, 0) -> + []; +generate(Fun, N) -> + [Fun() | generate(Fun, N-1)]. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nested_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/nested_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/nested_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nested_SUITE.erl 2009-09-18 15:07:42.000000000 +0100 @@ -0,0 +1,92 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(nested_SUITE). + +-export([all/1, case_in_case/1, case_in_after/1, catch_in_catch/1, bif_in_bif/1]). + +-include("test_server.hrl"). + +all(suite) -> [case_in_case, case_in_after, catch_in_catch, bif_in_bif]. + +case_in_case(suite) -> []; +case_in_case(Config) when is_list(Config) -> + ?line done = search_any([a], [{a, 1}]), + ?line done = search_any([x], [{a, 1}]), + ok. + +search_any([Key|Rest], List) -> + ?line case case lists:keysearch(Key, 1, List) of + {value, _} -> + true; + _ -> + false + end of + true -> + ok; + false -> + error; + Other -> + test_server:fail({other_result, Other}) + end, + ?line search_any(Rest, List); +search_any([], _) -> + done. + +case_in_after(suite) -> []; +case_in_after(Config) when is_list(Config) -> + receive + after case {x, y, z} of + {x, y, z} -> 0 + end -> + ok + end, + ok. + +catch_in_catch(doc) -> "Test a catch within a catch in the same function."; +catch_in_catch(suite) -> []; +catch_in_catch(Config) when is_list(Config) -> + ?line {outer, inner_exit} = catcher(), + ok. + +catcher() -> + case (catch + case (catch ?MODULE:non_existing()) of % bogus function + {'EXIT', _} -> + inner_exit; + Res1 -> + {inner, Res1} + end) of + {'EXIT', _} -> + outer_exit; + Res2 -> + {outer, Res2} + end. + +bif_in_bif(doc) -> "Test a BIF call within a BIF call."; +bif_in_bif(suite) -> []; +bif_in_bif(Config) when is_list(Config) -> + Self = self(), + put(pid, Self), + Self = register_me(), + ok. + +register_me() -> + register(?MODULE, Pid = get(pid)), + Pid. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/Makefile.src 2009-11-20 13:33:08.000000000 +0000 @@ -0,0 +1,14 @@ + +NIF_LIBS = nif_SUITE.1@dll@ \ + nif_mod.1@dll@ \ + nif_mod.2@dll@ \ + nif_mod.3@dll@ + +all: $(NIF_LIBS) + + +@SHLIB_RULES@ + +$(NIF_LIBS): nif_SUITE.c nif_mod.c nif_mod.h + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.1.c erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.1.c --- erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.1.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.1.c 2009-11-20 13:33:10.000000000 +0000 @@ -0,0 +1,2 @@ +#define NIF_LIB_VER 1 +#include "nif_mod.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.2.c erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.2.c --- erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.2.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.2.c 2009-11-20 13:33:10.000000000 +0000 @@ -0,0 +1,2 @@ +#define NIF_LIB_VER 2 +#include "nif_mod.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.3.c erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.3.c --- erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.3.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.3.c 2009-11-20 13:33:11.000000000 +0000 @@ -0,0 +1,2 @@ +#define NIF_LIB_VER 3 +#include "nif_mod.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.c erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.c --- erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.c 2009-11-20 13:33:09.000000000 +0000 @@ -0,0 +1,103 @@ +#include "erl_nif.h" +#include +#include + +#include "nif_mod.h" + + +static int static_cntA; /* zero by default */ +static int static_cntB = NIF_LIB_VER * 100; + +static void add_call(ErlNifEnv* env, NifModPrivData* data, const char* func_name) +{ + CallInfo* call = enif_alloc(env, sizeof(CallInfo)+strlen(func_name)); + strcpy(call->func_name, func_name); + call->lib_ver = NIF_LIB_VER; + call->static_cntA = ++static_cntA; + call->static_cntB = ++static_cntB; + call->next = data->call_history; + data->call_history = call; +} + +#define ADD_CALL(FUNC_NAME) add_call(env, enif_get_data(env),FUNC_NAME) + +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +{ + NifModPrivData* data = enif_alloc(env, sizeof(NifModPrivData)); + assert(data != NULL); + data->ref_cnt = 1; + data->call_history = NULL; + add_call(env, data, "load"); + + data->calls = 0; + *priv_data = data; + return 0; +} + +static int reload(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +{ + add_call(env, *priv_data, "reload"); + return 0; +} + +static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info) +{ + NifModPrivData* data = *old_priv_data; + add_call(env, data, "upgrade"); + data->ref_cnt++; + *priv_data = *old_priv_data; + return 0; +} + +static void unload(ErlNifEnv* env, void* priv_data) +{ + NifModPrivData* data = priv_data; + add_call(env, data, "unload"); + if (--data->ref_cnt == 0) { + enif_free(env, data); + } +} + +static ERL_NIF_TERM lib_version(ErlNifEnv* env) +{ + ADD_CALL("lib_version"); + return enif_make_int(env, NIF_LIB_VER); +} + +static ERL_NIF_TERM call_history(ErlNifEnv* env) +{ + NifModPrivData* data = (NifModPrivData*) enif_get_data(env); + ERL_NIF_TERM list = enif_make_list(env, 0); /* NIL */ + + while (data->call_history != NULL) { + CallInfo* call = data->call_history; + ERL_NIF_TERM tpl = enif_make_tuple(env, 2, + enif_make_atom(env,call->func_name), + enif_make_int(env,call->lib_ver)); + list = enif_make_list_cell(env, tpl, list); + data->call_history = call->next; + enif_free(env,call); + } + return list; +} + +static ERL_NIF_TERM get_priv_data_ptr(ErlNifEnv* env) +{ + ADD_CALL("get_priv_data_ptr"); + return enif_make_ulong(env, (unsigned long)enif_get_data(env)); +} + + +static ErlNifFunc nif_funcs[] = +{ + {"lib_version", 0, lib_version}, + {"call_history", 0, call_history}, + {"get_priv_data_ptr", 0, get_priv_data_ptr} +}; + +#if NIF_LIB_VER != 3 +ERL_NIF_INIT(nif_mod,nif_funcs,load,reload,upgrade,unload) +#else +ERL_NIF_INIT_GLOB /* avoid link error on windows */ +#endif + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.erl erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.erl --- erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.erl 2009-11-20 13:33:09.000000000 +0000 @@ -0,0 +1,64 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(nif_mod). + +-include("test_server.hrl"). + +-export([load_nif_lib/2, start/0, lib_version/0, call_history/0, get_priv_data_ptr/0]). + +-export([loop/0, upgrade/1]). + +-define(nif_stub,nif_stub_error(?LINE)). + +load_nif_lib(Config, Ver) -> + ?line Path = ?config(data_dir, Config), + erlang:load_nif(filename:join(Path,libname(Ver)), 0). + +libname(no_init) -> libname(3); +libname(Ver) when is_integer(Ver) -> + "nif_mod." ++ integer_to_list(Ver). + +start() -> + spawn_opt(?MODULE,loop,[], + [link, monitor]). + +loop() -> + receive + {Pid,lib_version} -> + Pid ! {self(),lib_version()}, + loop(); + {Pid,upgrade} -> + ?MODULE:upgrade(Pid); + die -> + void + end. + +upgrade(Pid) -> + Pid ! {self(),upgraded}, + loop(). + +lib_version() -> % NIF + undefined. + +call_history() -> ?nif_stub. +get_priv_data_ptr() -> ?nif_stub. + +nif_stub_error(Line) -> + exit({nif_not_loaded,module,?MODULE,line,Line}). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.h erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.h --- erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_mod.h 2009-11-20 13:33:09.000000000 +0000 @@ -0,0 +1,17 @@ +typedef struct call_info_t +{ + struct call_info_t* next; + unsigned lib_ver; + int static_cntA; + int static_cntB; + char func_name[1]; /* must be last */ +}CallInfo; + + +typedef struct +{ + int calls; + int ref_cnt; + CallInfo* call_history; +}NifModPrivData; + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_SUITE.1.c erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_SUITE.1.c --- erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_SUITE.1.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_SUITE.1.c 2009-11-20 13:33:09.000000000 +0000 @@ -0,0 +1,2 @@ +#define NIF_SUITE_LIB_VER 1 +#include "nif_SUITE.c" diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_SUITE.c erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_SUITE.c --- erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE_data/nif_SUITE.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE_data/nif_SUITE.c 2009-11-20 13:33:09.000000000 +0000 @@ -0,0 +1,149 @@ +#include "erl_nif.h" +#include +#include + +#include "nif_mod.h" + +static int static_cntA; /* zero by default */ +static int static_cntB = NIF_SUITE_LIB_VER * 100; + +typedef struct +{ + int ref_cnt; + CallInfo* call_history; + NifModPrivData* nif_mod; +}PrivData; + +void add_call(ErlNifEnv* env, PrivData* data, const char* func_name) +{ + CallInfo* call = enif_alloc(env, sizeof(CallInfo)+strlen(func_name)); + strcpy(call->func_name, func_name); + call->lib_ver = NIF_SUITE_LIB_VER; + call->next = data->call_history; + call->static_cntA = ++static_cntA; + call->static_cntB = ++static_cntB; + data->call_history = call; +} + +#define ADD_CALL(FUNC_NAME) add_call(env, enif_get_data(env),FUNC_NAME) + +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +{ + PrivData* data = enif_alloc(env, sizeof(PrivData)); + assert(data != NULL); + data->ref_cnt = 1; + data->call_history = NULL; + data->nif_mod = NULL; + + add_call(env, data, "load"); + + *priv_data = data; + return 0; +} + +static int reload(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +{ + add_call(env, *priv_data, "reload"); + return 0; +} + +static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info) +{ + PrivData* data = *old_priv_data; + add_call(env, data, "upgrade"); + data->ref_cnt++; + *priv_data = *old_priv_data; + return 0; +} + +static void unload(ErlNifEnv* env, void* priv_data) +{ + PrivData* data = priv_data; + add_call(env, data, "unload"); + if (--data->ref_cnt == 0) { + enif_free(env, priv_data); + } +} + +static ERL_NIF_TERM lib_version(ErlNifEnv* env) +{ + ADD_CALL("lib_version"); + return enif_make_int(env, NIF_SUITE_LIB_VER); +} + +static ERL_NIF_TERM make_call_history(ErlNifEnv* env, CallInfo** headp) +{ + ERL_NIF_TERM list = enif_make_list(env, 0); /* NIL */ + + while (*headp != NULL) { + CallInfo* call = *headp; + ERL_NIF_TERM tpl = enif_make_tuple(env, 4, + enif_make_atom(env,call->func_name), + enif_make_int(env,call->lib_ver), + enif_make_int(env,call->static_cntA), + enif_make_int(env,call->static_cntB)); + list = enif_make_list_cell(env, tpl, list); + *headp = call->next; + enif_free(env,call); + } + return list; +} + +static ERL_NIF_TERM call_history(ErlNifEnv* env) +{ + PrivData* data = (PrivData*) enif_get_data(env); + + return make_call_history(env,&data->call_history); +} + +static ERL_NIF_TERM hold_nif_mod_priv_data(ErlNifEnv* env, ERL_NIF_TERM a1) +{ + PrivData* data = (PrivData*) enif_get_data(env); + unsigned long ptr_as_ulong; + + if (!enif_get_ulong(env,a1,&ptr_as_ulong)) { + return enif_make_badarg(env); + } + if (data->nif_mod != NULL && --(data->nif_mod->ref_cnt) == 0) { + enif_free(env,data->nif_mod); + } + data->nif_mod = (NifModPrivData*) ptr_as_ulong; + return enif_make_int(env,++(data->nif_mod->ref_cnt)); +} + +static ERL_NIF_TERM nif_mod_call_history(ErlNifEnv* env) +{ + PrivData* data = (PrivData*) enif_get_data(env); + + if (data->nif_mod == NULL) { + return enif_make_string(env,"nif_mod pointer is NULL"); + } + return make_call_history(env,&data->nif_mod->call_history); +} + +static ERL_NIF_TERM list_seq(ErlNifEnv* env, ERL_NIF_TERM a1) +{ + ERL_NIF_TERM list; + int n; + if (!enif_get_int(env, a1, &n)) { + return enif_make_badarg(env); + } + list = enif_make_list(env, 0); /* NIL */ + while (n > 0) { + list = enif_make_list_cell(env, enif_make_int(env,n), list); + n--; + } + return list; +} + +static ErlNifFunc nif_funcs[] = +{ + {"lib_version", 0, lib_version}, + {"call_history", 0, call_history}, + {"hold_nif_mod_priv_data", 1, hold_nif_mod_priv_data}, + {"nif_mod_call_history", 0, nif_mod_call_history}, + {"list_seq", 1, list_seq} +}; + +ERL_NIF_INIT(nif_SUITE,nif_funcs,load,reload,upgrade,unload) + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/nif_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nif_SUITE.erl 2009-11-20 13:33:08.000000000 +0000 @@ -0,0 +1,235 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(nif_SUITE). + +%%-define(line_trace,true). + +-include("test_server.hrl"). + +-export([all/1, fin_per_testcase/2, basic/1, reload/1, upgrade/1, heap_frag/1, + neg/1]). + +-define(nif_stub,nif_stub_error(?LINE)). + +all(suite) -> + [basic, reload, upgrade, heap_frag, neg]. + +fin_per_testcase(_Func, _Config) -> + P1 = code:purge(nif_mod), + Del = code:delete(nif_mod), + P2 = code:purge(nif_mod), + io:format("fin purged=~p, deleted=~p and then purged=~p\n",[P1,Del,P2]). + +basic(doc) -> ["Basic smoke test of load_nif and a simple NIF call"]; +basic(suite) -> []; +basic(Config) when is_list(Config) -> + ensure_lib_loaded(Config), + ?line true = (lib_version() =/= undefined), + ?line [{load,1,1,101},{lib_version,1,2,102}] = call_history(), + ?line [] = call_history(), + ?line [?MODULE] = erlang:system_info(taints), + ok. + +reload(doc) -> ["Test reload callback in nif lib"]; +reload(suite) -> []; +reload(Config) when is_list(Config) -> + ensure_lib_loaded(Config), + + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "nif_mod"), + ?line {ok,nif_mod,Bin} = compile:file(File, [binary,return_errors]), + ?line {module,nif_mod} = erlang:load_module(nif_mod,Bin), + + ?line nif_mod:load_nif_lib(Config, 1), + + ?line hold_nif_mod_priv_data(nif_mod:get_priv_data_ptr()), + ?line [{load,1,1,101},{get_priv_data_ptr,1,2,102}] = nif_mod_call_history(), + + ?line nif_mod:load_nif_lib(Config, 2), + ?line 2 = nif_mod:lib_version(), + ?line [{reload,2,1,201},{lib_version,2,2,202}] = nif_mod_call_history(), + + ?line nif_mod:load_nif_lib(Config, 1), + ?line 1 = nif_mod:lib_version(), + ?line [{reload,1,1,101},{lib_version,1,2,102}] = nif_mod_call_history(), + + ?line true = erlang:delete_module(nif_mod), + ?line [] = nif_mod_call_history(), + + %%?line false= check_process_code(Pid, nif_mod), + ?line true = erlang:purge_module(nif_mod), + ?line [{unload,1,3,103}] = nif_mod_call_history(), + + ?line [?MODULE, nif_mod] = erlang:system_info(taints), + ok. + +upgrade(doc) -> ["Test upgrade callback in nif lib"]; +upgrade(suite) -> []; +upgrade(Config) when is_list(Config) -> + ensure_lib_loaded(Config), + + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "nif_mod"), + ?line {ok,nif_mod,Bin} = compile:file(File, [binary,return_errors]), + ?line {module,nif_mod} = erlang:load_module(nif_mod,Bin), + + ?line nif_mod:load_nif_lib(Config, 1), + ?line {Pid,MRef} = nif_mod:start(), + ?line 1 = call(Pid,lib_version), + + ?line hold_nif_mod_priv_data(nif_mod:get_priv_data_ptr()), + ?line [{load,1,1,101},{lib_version,1,2,102},{get_priv_data_ptr,1,3,103}] = nif_mod_call_history(), + + %% Module upgrade with same lib-version + ?line {module,nif_mod} = erlang:load_module(nif_mod,Bin), + ?line undefined = nif_mod:lib_version(), + ?line 1 = call(Pid,lib_version), + ?line [{lib_version,1,4,104}] = nif_mod_call_history(), + + ?line nif_mod:load_nif_lib(Config, 1), + ?line 1 = nif_mod:lib_version(), + ?line [{upgrade,1,5,105},{lib_version,1,6,106}] = nif_mod_call_history(), + + ?line upgraded = call(Pid,upgrade), + ?line false = check_process_code(Pid, nif_mod), + ?line true = erlang:purge_module(nif_mod), + ?line [{unload,1,7,107}] = nif_mod_call_history(), + + ?line 1 = nif_mod:lib_version(), + ?line [{lib_version,1,8,108}] = nif_mod_call_history(), + + ?line true = erlang:delete_module(nif_mod), + ?line [] = nif_mod_call_history(), + + ?line Pid ! die, + ?line {'DOWN', MRef, process, Pid, normal} = receive_any(), + ?line false = check_process_code(Pid, nif_mod), + ?line true = erlang:purge_module(nif_mod), + ?line [{unload,1,9,109}] = nif_mod_call_history(), + + %% Module upgrade with different lib version + ?line {module,nif_mod} = erlang:load_module(nif_mod,Bin), + ?line undefined = nif_mod:lib_version(), + ?line {Pid2,MRef2} = nif_mod:start(), + ?line undefined = call(Pid2,lib_version), + + ?line nif_mod:load_nif_lib(Config, 1), + ?line hold_nif_mod_priv_data(nif_mod:get_priv_data_ptr()), + ?line 1 = call(Pid2,lib_version), + ?line [{load,1,1,101},{get_priv_data_ptr,1,2,102},{lib_version,1,3,103}] = nif_mod_call_history(), + + ?line {module,nif_mod} = erlang:load_module(nif_mod,Bin), + ?line undefined = nif_mod:lib_version(), + ?line [] = nif_mod_call_history(), + ?line 1 = call(Pid2,lib_version), + ?line [{lib_version,1,4,104}] = nif_mod_call_history(), + + ?line nif_mod:load_nif_lib(Config, 2), + ?line 2 = nif_mod:lib_version(), + ?line [{upgrade,2,1,201},{lib_version,2,2,202}] = nif_mod_call_history(), + + ?line 1 = call(Pid2,lib_version), + ?line [{lib_version,1,5,105}] = nif_mod_call_history(), + + ?line upgraded = call(Pid2,upgrade), + ?line false = check_process_code(Pid2, nif_mod), + ?line true = erlang:purge_module(nif_mod), + ?line [{unload,1,6,106}] = nif_mod_call_history(), + + ?line 2 = nif_mod:lib_version(), + ?line [{lib_version,2,3,203}] = nif_mod_call_history(), + + ?line true = erlang:delete_module(nif_mod), + ?line [] = nif_mod_call_history(), + + ?line Pid2 ! die, + ?line {'DOWN', MRef2, process, Pid2, normal} = receive_any(), + ?line false= check_process_code(Pid2, nif_mod), + ?line true = erlang:purge_module(nif_mod), + ?line [{unload,2,4,204}] = nif_mod_call_history(), + + ?line [?MODULE, nif_mod] = erlang:system_info(taints), + ok. + +heap_frag(doc) -> ["Test NIF building heap fragments"]; +heap_frag(suite) -> []; +heap_frag(Config) when is_list(Config) -> + ensure_lib_loaded(Config), + + heap_frag_do(1,1000000), + ok. + +heap_frag_do(N, Max) when N > Max -> + ok; +heap_frag_do(N, Max) -> + io:format("Create list of length ~p\n",[N]), + L = lists:seq(1,N), + L = list_seq(N), + heap_frag_do(((N*5) div 4) + 1, Max). + + +neg(doc) -> ["Negative testing of load_nif"]; +neg(suite) -> []; +neg(Config) when is_list(Config) -> + ?line {'EXIT',{badarg,_}} = (catch erlang:load_nif(badarg, 0)), + ?line {error,load_failed,_} = erlang:load_nif("pink_unicorn", 0), + + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "nif_mod"), + ?line {ok,nif_mod,Bin} = compile:file(File, [binary,return_errors]), + ?line {module,nif_mod} = erlang:load_module(nif_mod,Bin), + + ?line {error,bad_lib,_} = nif_mod:load_nif_lib(Config, no_init), + ?line ok. + + + +ensure_lib_loaded(Config) -> + ensure_lib_loaded(Config, 1). + +ensure_lib_loaded(Config, Ver) -> + ?line case lib_version() of + undefined -> + ?line Path = ?config(data_dir, Config), + ?line Lib = "nif_SUITE." ++ integer_to_list(Ver), + ?line ok = erlang:load_nif(filename:join(Path,Lib), 0); + Ver when is_integer(Ver) -> + ok + end. + +call(Pid,Cmd) -> + %%io:format("~p calling ~p with ~p\n",[self(), Pid, Cmd]), + Pid ! {self(), Cmd}, + receive + {Pid,Reply} -> Reply + end. + +receive_any() -> + receive M -> M end. + +%% The NIFs: +lib_version() -> undefined. +call_history() -> ?nif_stub. +hold_nif_mod_priv_data(_Ptr) -> ?nif_stub. +nif_mod_call_history() -> ?nif_stub. +list_seq(_To) -> ?nif_stub. + +nif_stub_error(Line) -> + exit({nif_not_loaded,module,?MODULE,line,Line}). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/node_container_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/node_container_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/node_container_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/node_container_SUITE.erl 2009-09-18 15:08:35.000000000 +0100 @@ -0,0 +1,1288 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%---------------------------------------------------------------------- +%%% File : node_container_SUITE.erl +%%% Author : Rickard +%%% Purpose : +%%% Created : 24 Jul 2002 by Rickard +%%%---------------------------------------------------------------------- + +-module(node_container_SUITE). +-author('rickard.green@uab.ericsson.se'). + +%-define(line_trace, 1). + +-include("test_server.hrl"). + +%-compile(export_all). +-export([all/1, init_per_testcase/2, fin_per_testcase/2, end_per_suite/1, + node_container_refc_check/1]). + +-export([term_to_binary_to_term_eq/1, + round_trip_eq/1, + cmp/1, + ref_eq/1, + node_table_gc/1, + dist_link_refc/1, + dist_monitor_refc/1, + node_controller_refc/1, + ets_refc/1, + match_spec_refc/1, + timer_refc/1, + otp_4715/1, + pid_wrap/1, + port_wrap/1, + bad_nc/1, + unique_pid/1, + iter_max_procs/1]). + +-define(DEFAULT_TIMEOUT, ?t:minutes(10)). + +all(doc) -> []; +all(suite) -> + [term_to_binary_to_term_eq, + round_trip_eq, + cmp, + ref_eq, + node_table_gc, + dist_link_refc, + dist_monitor_refc, + node_controller_refc, + ets_refc, + match_spec_refc, + timer_refc, + otp_4715, + pid_wrap, + port_wrap, + bad_nc, + unique_pid, + iter_max_procs]. + +available_internal_state(Bool) when Bool == true; Bool == false -> + case {Bool, + (catch erts_debug:get_internal_state(available_internal_state))} of + {true, true} -> + true; + {false, true} -> + erts_debug:set_internal_state(available_internal_state, false), + true; + {true, _} -> + erts_debug:set_internal_state(available_internal_state, true), + false; + {false, _} -> + false + end. + +init_per_testcase(_Case, Config) when is_list(Config) -> + Dog = ?t:timetrap(?DEFAULT_TIMEOUT), + available_internal_state(true), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) when is_list(Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +end_per_suite(_Config) -> + available_internal_state(false). + +%%% +%%% The test cases ------------------------------------------------------------- +%%% + +-define(MAX_PIDS_PORTS, ((1 bsl 28) - 1)). + +%% +%% Test case: term_to_binary_to_term_eq +%% +term_to_binary_to_term_eq(doc) -> + ["Tests that node container terms that are converted to external format " + "and back stay equal to themselves."]; +term_to_binary_to_term_eq(suite) -> []; +term_to_binary_to_term_eq(Config) when is_list(Config) -> + ?line ThisNode = {node(), erlang:system_info(creation)}, + % Get local node containers + ?line LPid = self(), + ?line LXPid = mk_pid(ThisNode, 32767, 8191), + ?line LPort = hd(erlang:ports()), + ?line LXPort = mk_port(ThisNode, 268435455), + ?line LLRef = make_ref(), + ?line LHLRef = mk_ref(ThisNode, [47, 11]), + ?line LSRef = mk_ref(ThisNode, [4711]), + % Test local nc:s + ?line LPid = binary_to_term(term_to_binary(LPid)), + ?line LXPid = binary_to_term(term_to_binary(LXPid)), + ?line LPort = binary_to_term(term_to_binary(LPort)), + ?line LXPort = binary_to_term(term_to_binary(LXPort)), + ?line LLRef = binary_to_term(term_to_binary(LLRef)), + ?line LHLRef = binary_to_term(term_to_binary(LHLRef)), + ?line LSRef = binary_to_term(term_to_binary(LSRef)), + % Get remote node containers + ?line RNode = {get_nodename(), 3}, + ?line RPid = mk_pid(RNode, 4711, 1), + ?line RXPid = mk_pid(RNode, 32767, 8191), + ?line RPort = mk_port(RNode, 4711), + ?line RXPort = mk_port(RNode, 268435455), + ?line RLRef = mk_ref(RNode, [4711, 4711, 4711]), + ?line RHLRef = mk_ref(RNode, [4711, 4711]), + ?line RSRef = mk_ref(RNode, [4711]), + % Test remote nc:s + ?line RPid = binary_to_term(term_to_binary(RPid)), + ?line RXPid = binary_to_term(term_to_binary(RXPid)), + ?line RPort = binary_to_term(term_to_binary(RPort)), + ?line RXPort = binary_to_term(term_to_binary(RXPort)), + ?line RLRef = binary_to_term(term_to_binary(RLRef)), + ?line RHLRef = binary_to_term(term_to_binary(RHLRef)), + ?line RSRef = binary_to_term(term_to_binary(RSRef)), + ?line nc_refc_check(node()), + ?line ok. + + +%% +%% Test case: round_trip_eq +%% +round_trip_eq(doc) -> + ["Tests that node containers that are sent beteen nodes stay equal to " + "themselves."]; +round_trip_eq(suite) -> []; +round_trip_eq(Config) when is_list(Config) -> + ?line ThisNode = {node(), erlang:system_info(creation)}, + ?line NodeFirstName = get_nodefirstname(), + ?line ?line {ok, Node} = start_node(NodeFirstName), + ?line Self = self(), + ?line RPid = spawn_link(Node, + fun () -> + receive + {Self, Data} -> + Self ! {self(), Data} + end + end), + ?line SentPid = self(), + ?line SentXPid = mk_pid(ThisNode, 17471, 8190), + ?line SentPort = hd(erlang:ports()), + ?line SentXPort = mk_port(ThisNode, 268435451), + ?line SentLRef = make_ref(), + ?line SentHLRef = mk_ref(ThisNode, [4711, 17]), + ?line SentSRef = mk_ref(ThisNode, [4711]), + ?line RPid ! {Self, {SentPid, + SentXPid, + SentPort, + SentXPort, + SentLRef, + SentHLRef, + SentSRef}}, + receive + {RPid, {RecPid, + RecXPid, + RecPort, + RecXPort, + RecLRef, + RecHLRef, + RecSRef}} -> + ?line stop_node(Node), + ?line SentPid = RecPid, + ?line SentXPid = RecXPid, + ?line SentPort = RecPort, + ?line SentXPort = RecXPort, + ?line SentLRef = RecLRef, + ?line SentHLRef = RecHLRef, + ?line SentSRef = RecSRef, + ?line nc_refc_check(node()), + ?line ok + end. + + + +%% +%% Test case: cmp +%% +cmp(doc) -> + ["Tests that Erlang term comparison works as it should on node " + "containers."]; +cmp(suite) -> []; +cmp(Config) when is_list(Config) -> + + %% Inter type comparison --------------------------------------------------- + + %% The Erlang term order: + %% number < atom < ref < fun < port < pid < tuple < nil < cons < binary + RNode = {get_nodename(), 2}, + + IRef = make_ref(), + ERef = mk_ref({get_nodename(), 2}, [1,2,3]), + + IPid = self(), + EPid = mk_pid(RNode, 1, 2), + + IPort = hd(erlang:ports()), + EPort = mk_port(RNode, 1), + + %% Test pids ---------------------------------------------------- + ?line true = 1 < IPid, + ?line true = 1.3 < IPid, + ?line true = (1 bsl 64) < IPid, + ?line true = an_atom < IPid, + ?line true = IRef < IPid, + ?line true = ERef < IPid, + ?line true = fun () -> a_fun end < IPid, + ?line true = IPort < IPid, + ?line true = EPort < IPid, + ?line true = IPid < {a, tuple}, + ?line true = IPid < [], + ?line true = IPid < [a|cons], + ?line true = IPid < <<"a binary">>, + + ?line true = 1 < EPid, + ?line true = 1.3 < EPid, + ?line true = (1 bsl 64) < EPid, + ?line true = an_atom < EPid, + ?line true = IRef < EPid, + ?line true = ERef < EPid, + ?line true = fun () -> a_fun end < EPid, + ?line true = IPort < EPid, + ?line true = EPort < EPid, + ?line true = EPid < {a, tuple}, + ?line true = EPid < [], + ?line true = EPid < [a|cons], + ?line true = EPid < <<"a binary">>, + + %% Test ports -------------------------------------------------- + ?line true = 1 < IPort, + ?line true = 1.3 < IPort, + ?line true = (1 bsl 64) < IPort, + ?line true = an_atom < IPort, + ?line true = IRef < IPort, + ?line true = ERef < IPort, + ?line true = fun () -> a_fun end < IPort, + ?line true = IPort < IPid, + ?line true = IPort < EPid, + ?line true = IPort < {a, tuple}, + ?line true = IPort < [], + ?line true = IPort < [a|cons], + ?line true = IPort < <<"a binary">>, + + ?line true = 1 < EPort, + ?line true = 1.3 < EPort, + ?line true = (1 bsl 64) < EPort, + ?line true = an_atom < EPort, + ?line true = IRef < EPort, + ?line true = ERef < EPort, + ?line true = fun () -> a_fun end < EPort, + ?line true = EPort < IPid, + ?line true = EPort < EPid, + ?line true = EPort < {a, tuple}, + ?line true = EPort < [], + ?line true = EPort < [a|cons], + ?line true = EPort < <<"a binary">>, + + %% Test refs ---------------------------------------------------- + ?line true = 1 < IRef, + ?line true = 1.3 < IRef, + ?line true = (1 bsl 64) < IRef, + ?line true = an_atom < IRef, + ?line true = IRef < fun () -> a_fun end, + ?line true = IRef < IPort, + ?line true = IRef < EPort, + ?line true = IRef < IPid, + ?line true = IRef < EPid, + ?line true = IRef < {a, tuple}, + ?line true = IRef < [], + ?line true = IRef < [a|cons], + ?line true = IRef < <<"a binary">>, + + ?line true = 1 < ERef, + ?line true = 1.3 < ERef, + ?line true = (1 bsl 64) < ERef, + ?line true = an_atom < ERef, + ?line true = ERef < fun () -> a_fun end, + ?line true = ERef < IPort, + ?line true = ERef < EPort, + ?line true = ERef < IPid, + ?line true = ERef < EPid, + ?line true = ERef < {a, tuple}, + ?line true = ERef < [], + ?line true = ERef < [a|cons], + ?line true = ERef < <<"a binary">>, + + + %% Intra type comparison --------------------------------------------------- + + + %% Test pids ---------------------------------------------------- + %% + %% Significance (most -> least): + %% serial, number, nodename, creation + %% + + ?line Pid = mk_pid({b@b, 2}, 4711, 1), + + ?line true = mk_pid({a@b, 1}, 4710, 2) > Pid, + ?line true = mk_pid({a@b, 1}, 4712, 1) > Pid, + ?line true = mk_pid({c@b, 1}, 4711, 1) > Pid, + ?line true = mk_pid({b@b, 3}, 4711, 1) > Pid, + ?line true = mk_pid({b@b, 2}, 4711, 1) =:= Pid, + + %% Test ports --------------------------------------------------- + %% + %% Significance (most -> least): + %% nodename, creation, number + %% + %% OBS: Comparison between ports has changed in R9. This + %% since it wasn't stable in R8 (and eariler releases). + %% Significance used to be: dist_slot, number, + %% creation. + + ?line Port = mk_port({b@b, 2}, 4711), + + ?line true = mk_port({c@b, 1}, 4710) > Port, + ?line true = mk_port({b@b, 3}, 4710) > Port, + ?line true = mk_port({b@b, 2}, 4712) > Port, + ?line true = mk_port({b@b, 2}, 4711) =:= Port, + + %% Test refs ---------------------------------------------------- + %% Significance (most -> least): + %% nodename, creation, (number high, number mid), number low, + %% + %% OBS: Comparison between refs has changed in R9. This + %% since it wasn't stable in R8 (and eariler releases). + %% Significance used to be: dist_slot, number, + %% creation. + %% + + ?line Ref = mk_ref({b@b, 2}, [4711, 4711, 4711]), + + ?line true = mk_ref({c@b, 1}, [4710, 4710, 4710]) > Ref, + ?line true = mk_ref({b@b, 3}, [4710, 4710, 4710]) > Ref, + ?line true = mk_ref({b@b, 2}, [4710, 4710, 4712]) > Ref, + ?line true = mk_ref({b@b, 2}, [4710, 4712, 4711]) > Ref, + ?line true = mk_ref({b@b, 2}, [4712, 4711, 4711]) > Ref, + ?line true = mk_ref({b@b, 2}, [4711, 4711, 4711]) =:= Ref, + + ok. + +%% +%% Test case: ref_eq +%% +ref_eq(doc) -> ["Test that one word refs \"works\"."]; +ref_eq(suite) -> []; +ref_eq(Config) when is_list(Config) -> + ?line ThisNode = {node(), erlang:system_info(creation)}, + ?line AnotherNode = {get_nodename(),2}, + ?line LLongRef = mk_ref(ThisNode, [4711, 0, 0]), + ?line LHalfLongRef = mk_ref(ThisNode, [4711, 0]), + ?line LShortRef = mk_ref(ThisNode, [4711]), + ?line true = LLongRef =:= LShortRef, + ?line true = LLongRef =:= LHalfLongRef, + ?line true = LLongRef =:= LLongRef, + ?line true = LHalfLongRef =:= LShortRef, + ?line true = LHalfLongRef =:= LHalfLongRef, + ?line true = LShortRef =:= LShortRef, + ?line false = LShortRef == mk_ref(ThisNode, [4711, 0, 1]), % Not any more + ?line RLongRef = mk_ref(AnotherNode, [4711, 0, 0]), + ?line RHalfLongRef = mk_ref(AnotherNode, [4711, 0]), + ?line RShortRef = mk_ref(AnotherNode, [4711]), + ?line true = RLongRef =:= RShortRef, + ?line true = RLongRef =:= RHalfLongRef, + ?line true = RLongRef =:= RLongRef, + ?line true = RHalfLongRef =:= RShortRef, + ?line true = RHalfLongRef =:= RHalfLongRef, + ?line true = RShortRef =:= RShortRef, + ?line false = RShortRef == mk_ref(AnotherNode, [4711, 0, 1]), % Not any more + ?line nc_refc_check(node()), + ?line ok. + +%% +%% Test case: node_table_gc +%% +node_table_gc(doc) -> + ["Tests that node tables are garbage collected."]; +node_table_gc(suite) -> []; +node_table_gc(Config) when is_list(Config) -> + ?line PreKnown = nodes(known), + ?line ?t:format("PreKnown = ~p~n", [PreKnown]), + ?line make_node_garbage(0, 200000, 1000, []), + ?line PostKnown = nodes(known), + ?line PostAreas = erlang:system_info(allocated_areas), + ?line ?t:format("PostKnown = ~p~n", [PostKnown]), + ?line ?t:format("PostAreas = ~p~n", [PostAreas]), + ?line true = length(PostKnown) =< length(PreKnown), + ?line nc_refc_check(node()), + ?line ok. + +make_node_garbage(N, L, I, Ps) when N < L -> + ?line Self = self(), + ?line P = spawn_link(fun () -> + % Generate two node entries and one dist + % entry per node name + ?line PL1 = make_faked_pid_list(N, + I div 2, + 1), + ?line put(a, PL1), + ?line PL2 = make_faked_pid_list(N, + I div 2, + 2), + ?line put(b, PL2), + ?line Self ! {self(), length(nodes(known))} + end), + ?line receive + {P, KnownLength} -> + ?line true = KnownLength >= I div 2 + end, + ?line make_node_garbage(N+(I div 2)*2, L, I, [P|Ps]); +make_node_garbage(_, _, _, Ps) -> + %% Cleanup garbage... + ProcIsCleanedUp + = fun (Proc) -> + undefined == erts_debug:get_internal_state({process_status, + Proc}) + end, + lists:foreach(fun (P) -> wait_until(fun () -> ProcIsCleanedUp(P) end) end, + Ps), + ?line case erlang:system_info(heap_type) of + shared -> ?line garbage_collect(); + _ -> ?line ok + end, + ?line ok. + + +make_faked_pid_list(Start, No, Creation) -> + make_faked_pid_list(Start, No, Creation, []). + +make_faked_pid_list(_Start, 0, _Creation, Acc) -> + Acc; +make_faked_pid_list(Start, No, Creation, Acc) -> + make_faked_pid_list(Start+1, + No-1, + Creation, + [mk_pid({"faked_node-" + ++ integer_to_list(Start rem 50000) + ++ "@" + ++ atom_to_list(?MODULE), + Creation}, + 4711, + 3) | Acc]). + +%% +%% Test case: dist_link_refc +%% +dist_link_refc(doc) -> + ["Tests that external reference counts are incremented and decremented " + "as they should for distributed links"]; +dist_link_refc(suite) -> []; +dist_link_refc(Config) when is_list(Config) -> + ?line NodeFirstName = get_nodefirstname(), + ?line ?line {ok, Node} = start_node(NodeFirstName), + ?line RP = spawn_execer(Node), + ?line LP = spawn_link_execer(node()), + ?line true = sync_exec(RP, fun () -> link(LP) end), + ?line wait_until(fun () -> + ?line {links, Links} = process_info(LP, links), + ?line lists:member(RP, Links) + end), + ?line NodeCre = sync_exec(RP, fun() -> erlang:system_info(creation) end), + ?line 1 = reference_type_count( + link, + refering_entity_id({process, LP}, + get_node_references({Node, NodeCre}))), + ?line exec(RP, fun() -> exit(normal) end), + ?line wait_until(fun () -> + ?line {links, Links} = process_info(LP, links), + ?line not lists:member(RP, Links) + end), + ?line 0 = reference_type_count( + link, + refering_entity_id({process, LP}, + get_node_references({Node, NodeCre}))), + ?line exit(LP, normal), + ?line stop_node(Node), + ?line nc_refc_check(node()), + ?line ok. + + +%% +%% Test case: dist_monitor_refc +%% +dist_monitor_refc(doc) -> + ["Tests that external reference counts are incremented and decremented " + "as they should for distributed monitors"]; +dist_monitor_refc(suite) -> []; +dist_monitor_refc(Config) when is_list(Config) -> + ?line NodeFirstName = get_nodefirstname(), + ?line {ok, Node} = start_node(NodeFirstName), + ?line RP = spawn_execer(Node), + ?line LP = spawn_link_execer(node()), + ?line RMon = sync_exec(RP, fun () -> erlang:monitor(process, LP) end), + ?line true = is_reference(RMon), + ?line LMon = sync_exec(LP, fun () -> erlang:monitor(process, RP) end), + ?line true = is_reference(LMon), + ?line NodeCre = sync_exec(RP, fun() -> erlang:system_info(creation) end), + ?line wait_until(fun () -> + ?line {monitored_by, MonBy} + = process_info(LP, monitored_by), + ?line {monitors, Mon} + = process_info(LP, monitors), + ?line (lists:member(RP, MonBy) + and lists:member({process,RP}, Mon)) + end), + ?line 3 = reference_type_count( + monitor, + refering_entity_id({process, LP}, + get_node_references({Node, NodeCre}))), + ?line exec(RP, fun () -> exit(normal) end), + ?line wait_until(fun () -> + ?line {monitored_by, MonBy} + = process_info(LP, monitored_by), + ?line {monitors, Mon} + = process_info(LP, monitors), + ?line ((not lists:member(RP, MonBy)) + and (not lists:member({process,RP}, Mon))) + end), + ?line ok = sync_exec(LP, + fun () -> + receive + {'DOWN', LMon, process, _, _} -> + ok + end + end), + ?line 0 = reference_type_count( + link, + refering_entity_id({process, LP}, + get_node_references({Node, NodeCre}))), + ?line exit(LP, normal), + ?line stop_node(Node), + ?line nc_refc_check(node()), + ?line ok. + + +%% +%% Test case: node_controller_refc +%% +node_controller_refc(doc) -> + ["Tests that external reference counts are incremented and decremented " + "as they should for entities controlling a connections."]; +node_controller_refc(suite) -> []; +node_controller_refc(Config) when is_list(Config) -> + ?line NodeFirstName = get_nodefirstname(), + ?line ?line {ok, Node} = start_node(NodeFirstName), + ?line true = lists:member(Node, nodes()), + ?line 1 = reference_type_count(control, get_dist_references(Node)), + ?line P = spawn_link_execer(node()), + ?line Node + = sync_exec(P, + fun () -> + put(remote_net_kernel, + rpc:call(Node,erlang,whereis,[net_kernel])), + node(get(remote_net_kernel)) + end), + ?line Creation = rpc:call(Node, erlang, system_info, [creation]), + ?line monitor_node(Node,true), + ?line stop_node(Node), + ?line receive {nodedown, Node} -> ok end, + ?line DistRefs = get_dist_references(Node), + ?line true = reference_type_count(node, DistRefs) > 0, + ?line 0 = reference_type_count(control, DistRefs), + % Get rid of all references to Node + ?line exec(P, fun () -> exit(normal) end), + ?line wait_until(fun () -> not is_process_alive(P) end), + ?line case erlang:system_info(heap_type) of + shared -> + ?line garbage_collect(); + hybrid -> + ?line lists:foreach(fun (Proc) -> garbage_collect(Proc) end, + processes()), + ?line erlang:garbage_collect_message_area(); + _ -> + ?line lists:foreach(fun (Proc) -> garbage_collect(Proc) end, + processes()) + end, + ?line false = get_node_references({Node,Creation}), + ?line false = get_dist_references(Node), + ?line false = lists:member(Node, nodes(known)), + ?line nc_refc_check(node()), + ?line ok. + +%% +%% Test case: ets_refc +%% +ets_refc(doc) -> + ["Tests that external reference counts are incremented and decremented " + "as they should for data stored in ets tables."]; +ets_refc(suite) -> []; +ets_refc(Config) when is_list(Config) -> + ?line RNode = {get_nodename(), 1}, + ?line RPid = mk_pid(RNode, 4711, 2), + ?line RPort = mk_port(RNode, 4711), + ?line RRef = mk_ref(RNode, [4711, 47, 11]), + ?line Tab = ets:new(ets_refc, []), + ?line 0 = reference_type_count(ets, get_node_references(RNode)), + ?line true = ets:insert(Tab, [{a, self()}, + {b, RPid}, + {c, hd(erlang:ports())}, + {d, RPort}, + {e, make_ref()}]), + ?line 2 = reference_type_count(ets, get_node_references(RNode)), + ?line true = ets:insert(Tab, {f, RRef}), + ?line 3 = reference_type_count(ets, get_node_references(RNode)), + ?line true = ets:delete(Tab, d), + ?line 2 = reference_type_count(ets, get_node_references(RNode)), + ?line true = ets:delete_all_objects(Tab), + ?line 0 = reference_type_count(ets, get_node_references(RNode)), + ?line true = ets:insert(Tab, [{b, RPid}, {e, make_ref()}]), + ?line 1 = reference_type_count(ets, get_node_references(RNode)), + ?line true = ets:delete(Tab), + ?line 0 = reference_type_count(ets, get_node_references(RNode)), + ?line nc_refc_check(node()), + ?line ok. + +%% +%% Test case: match_spec_refc +%% +match_spec_refc(doc) -> + ["Tests that external reference counts are incremented and decremented " + "as they should for data stored in match specifications."]; +match_spec_refc(suite) -> []; +match_spec_refc(Config) when is_list(Config) -> + ?line RNode = {get_nodename(), 1}, + ?line RPid = mk_pid(RNode, 4711, 2), + ?line RPort = mk_port(RNode, 4711), + ?line RRef = mk_ref(RNode, [4711, 47, 11]), + ?line ok = do_match_spec_test(RNode, RPid, RPort, RRef), + ?line garbage_collect(), + ?line NodeRefs = get_node_references(RNode), + ?line 0 = reference_type_count(binary, NodeRefs), + ?line 0 = reference_type_count(ets, NodeRefs), + ?line nc_refc_check(node()), + ?line ok. + +do_match_spec_test(RNode, RPid, RPort, RRef) -> + ?line Tab = ets:new(match_spec_refc, []), + ?line true = ets:insert(Tab, [{a, RPid, RPort, RRef}, + {b, self(), RPort, RRef}, + {c, RPid, RPort, make_ref()}, + {d, RPid, RPort, RRef}]), + ?line {M1, C1} = ets:select(Tab, [{{'$1',RPid,RPort,RRef},[],['$1']}], 1), + ?line NodeRefs = get_node_references(RNode), + ?line 3 = reference_type_count(binary, NodeRefs), + ?line 10 = reference_type_count(ets, NodeRefs), + ?line {M2, C2} = ets:select(C1), + ?line '$end_of_table' = ets:select(C2), + ?line ets:delete(Tab), + ?line [a,d] = lists:sort(M1++M2), + ?line ok. + + +%% +%% Test case: ets_refc +%% +timer_refc(doc) -> + ["Tests that external reference counts are incremented and decremented " + "as they should for data stored in bif timers."]; +timer_refc(suite) -> []; +timer_refc(Config) when is_list(Config) -> + ?line RNode = {get_nodename(), 1}, + ?line RPid = mk_pid(RNode, 4711, 2), + ?line RPort = mk_port(RNode, 4711), + ?line RRef = mk_ref(RNode, [4711, 47, 11]), + ?line 0 = reference_type_count(timer, get_node_references(RNode)), + ?line Pid = spawn(fun () -> receive after infinity -> ok end end), + ?line erlang:start_timer(10000, Pid, {RPid, RPort, RRef}), + ?line 3 = reference_type_count(timer, get_node_references(RNode)), + ?line exit(Pid, kill), + ?line Mon = erlang:monitor(process, Pid), + ?line receive {'DOWN', Mon, process, Pid, _} -> ok end, + ?line 0 = reference_type_count(timer, get_node_references(RNode)), + ?line erlang:send_after(500, Pid, {timer, RPid, RPort, RRef}), + ?line 0 = reference_type_count(timer, get_node_references(RNode)), + ?line erlang:send_after(500, self(), {timer, RPid, RPort, RRef}), + ?line erlang:send_after(400, bananfluga, {timer, RPid, RPort, RRef}), + ?line 6 = reference_type_count(timer, get_node_references(RNode)), + ?line receive {timer, RPid, RPort, RRef} -> ok end, + ?line 0 = reference_type_count(timer, get_node_references(RNode)), + ?line nc_refc_check(node()), + ?line ok. + +otp_4715(doc) -> []; +otp_4715(suite) -> []; +otp_4715(Config) when is_list(Config) -> + case ?t:is_release_available("r9b") of + true -> otp_4715_1(Config); + false -> {skip,"No R9B found"} + end. + +otp_4715_1(Config) -> + case erlang:system_info(compat_rel) of + 9 -> + ?line run_otp_4715(Config); + _ -> + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line ?t:run_on_shielded_node(fun () -> + run_otp_4715(Config) + end, + "+R9 -pa " ++ Pa) + end. + +run_otp_4715(Config) when is_list(Config) -> + ?line erts_debug:set_internal_state(available_internal_state, true), + ?line PidList = [mk_pid({a@b, 1}, 4710, 2), + mk_pid({a@b, 1}, 4712, 1), + mk_pid({c@b, 1}, 4711, 1), + mk_pid({b@b, 3}, 4711, 1), + mk_pid({b@b, 2}, 4711, 1)], + + ?line R9Sorted = old_mod:sort_on_old_node(PidList), + ?line R9Sorted = lists:sort(PidList). + +pid_wrap(doc) -> []; +pid_wrap(suite) -> []; +pid_wrap(Config) when is_list(Config) -> ?line pp_wrap(pid). + +port_wrap(doc) -> []; +port_wrap(suite) -> []; +port_wrap(Config) when is_list(Config) -> + ?line case ?t:os_type() of + {unix, _} -> + ?line pp_wrap(port); + _ -> + ?line {skip, "Only run on unix"} + end. + +get_next_id(pid) -> + erts_debug:get_internal_state(next_pid); +get_next_id(port) -> + erts_debug:get_internal_state(next_port). + +set_next_id(pid, N) -> + erts_debug:set_internal_state(next_pid, N); +set_next_id(port, N) -> + erts_debug:set_internal_state(next_port, N). + +pp_wrap(What) -> + ?line N = set_high_pp_next(What), + ?line Cre = N + 100, + ?line ?t:format("no creations = ~p~n", [Cre]), + ?line PreCre = get_next_id(What), + ?line ?t:format("pre creations = ~p~n", [PreCre]), + ?line true = is_integer(PreCre), + ?line do_pp_creations(What, Cre), + ?line PostCre = get_next_id(What), + ?line ?t:format("post creations = ~p~n", [PostCre]), + ?line true = is_integer(PostCre), + ?line true = PreCre > PostCre, + ?line Now = set_next_id(What, ?MAX_PIDS_PORTS div 2), + ?line ?t:format("reset to = ~p~n", [Now]), + ?line true = is_integer(Now), + ?line ok. + +set_high_pp_next(What) -> + ?line set_high_pp_next(What, ?MAX_PIDS_PORTS-1). + +set_high_pp_next(What, N) -> + ?line M = set_next_id(What, N), + ?line true = is_integer(M), + ?line case {M >= N, M =< ?MAX_PIDS_PORTS} of + {true, true} -> + ?line ?MAX_PIDS_PORTS - M + 1; + _ -> + ?line set_high_pp_next(What, N - 100) + end. + +do_pp_creations(_What, N) when is_integer(N), N =< 0 -> + ?line done; +do_pp_creations(pid, N) when is_integer(N) -> + %% Create new pid and make sure it works... + ?line Me = self(), + ?line Ref = make_ref(), + ?line Pid = spawn_link(fun () -> + receive + Ref -> + Me ! Ref + end + end), + ?line Pid ! Ref, + ?line receive + Ref -> + ?line do_pp_creations(pid, N - 1) + end; +do_pp_creations(port, N) when is_integer(N) -> + %% Create new port and make sure it works... + ?line "hej" = os:cmd("echo hej") -- "\n", + ?line do_pp_creations(port, N - 1). + +bad_nc(doc) -> []; +bad_nc(suite) -> []; +bad_nc(Config) when is_list(Config) -> + % Make sure emulator don't crash on bad node containers... + ?line MaxPidNum = (1 bsl 15) - 1, + ?line MaxPidSer = ?MAX_PIDS_PORTS bsr 15, + ?line ThisNode = {node(), erlang:system_info(creation)}, + ?line {'EXIT', {badarg, mk_pid, _}} + = (catch mk_pid(ThisNode, MaxPidNum + 1, 17)), + ?line {'EXIT', {badarg, mk_pid, _}} + = (catch mk_pid(ThisNode, 4711, MaxPidSer + 1)), + ?line {'EXIT', {badarg, mk_port, _}} + = (catch mk_port(ThisNode, ?MAX_PIDS_PORTS + 1)), + ?line {'EXIT', {badarg, mk_ref, _}} + = (catch mk_ref(ThisNode,[(1 bsl 18), 4711, 4711])), + ?line {'EXIT', {badarg, mk_ref, _}} + = (catch mk_ref(ThisNode, [4711, 4711, 4711, 4711, 4711, 4711, 4711])), + ?line RemNode = {x@y, 2}, + ?line {'EXIT', {badarg, mk_pid, _}} + = (catch mk_pid(RemNode, MaxPidNum + 1, MaxPidSer)), + ?line {'EXIT', {badarg, mk_pid, _}} + = (catch mk_pid(RemNode, MaxPidNum, MaxPidSer + 1)), + ?line {'EXIT', {badarg, mk_port, _}} + = (catch mk_port(RemNode, ?MAX_PIDS_PORTS + 1)), + ?line {'EXIT', {badarg, mk_ref, _}} + = (catch mk_ref(RemNode, [(1 bsl 18), 4711, 4711])), + ?line {'EXIT', {badarg, mk_ref, _}} + = (catch mk_ref(RemNode, [4711, 4711, 4711, 4711, 4711, 4711, 4711])), + ?line BadNode = {x@y, 4}, + ?line {'EXIT', {badarg, mk_pid, _}} + = (catch mk_pid(BadNode, 4711, 17)), + ?line {'EXIT', {badarg, mk_port, _}} + = (catch mk_port(BadNode, 4711)), + ?line {'EXIT', {badarg, mk_ref, _}} + = (catch mk_ref(BadNode, [4711, 4711, 17])), + ?line ok. + + + +-define(NO_PIDS, 1000000). + +unique_pid(doc) -> []; +unique_pid(suite) -> []; +unique_pid(Config) when is_list(Config) -> + case catch erlang:system_info(modified_timing_level) of + Level when is_integer(Level) -> + {skip, + "Modified timing (level " ++ integer_to_list(Level) + ++ ") is enabled. spawn() is too slow for this " + " test when modified timing is enabled."}; + _ -> + ?line ?NO_PIDS = length(lists:usort(mkpidlist(?NO_PIDS, []))), + ?line ok + end. + +mkpidlist(0, Ps) -> Ps; +mkpidlist(N, Ps) -> mkpidlist(N-1, [spawn(fun () -> ok end)|Ps]). + + +iter_max_procs(doc) -> []; +iter_max_procs(suite) -> []; +iter_max_procs(Config) when is_list(Config) -> + ?line NoMoreTests = make_ref(), + ?line erlang:send_after(10000, self(), NoMoreTests), + ?line Res = chk_max_proc_line(), + ?line Res = chk_max_proc_line(), + ?line done = chk_max_proc_line_until(NoMoreTests, Res), + ?line {comment, + io_lib:format("max processes = ~p; " + "process line length = ~p", + [element(2, Res), element(1, Res)])}. + + +max_proc_line(Root, Parent, N) -> + Me = self(), + case catch spawn_link(fun () -> max_proc_line(Root, Me, N+1) end) of + {'EXIT', {system_limit, _}} when Root /= self() -> + Root ! {proc_line_length, N, self()}, + receive remove_proc_line -> Parent ! {exiting, Me} end; + P when is_pid(P), Root =/= self() -> + receive {exiting, P} -> Parent ! {exiting, Me} end; + P when is_pid(P) -> + P; + Unexpected -> + exit({unexpected_spawn_result, Unexpected}) + end. + +chk_max_proc_line() -> + ?line Child = max_proc_line(self(), self(), 0), + ?line receive + {proc_line_length, PLL, End} -> + ?line PC = erlang:system_info(process_count), + ?line LP = length(processes()), + ?line ?t:format("proc line length = ~p; " + "process count = ~p; " + "length processes = ~p~n", + [PLL, PC, LP]), + ?line End ! remove_proc_line, + ?line PC = LP, + ?line receive {exiting, Child} -> ok end, + ?line {PLL, PC} + end. + +chk_max_proc_line_until(NoMoreTests, Res) -> + receive + NoMoreTests -> + ?line done + after 0 -> + ?line Res = chk_max_proc_line(), + ?line chk_max_proc_line_until(NoMoreTests, Res) + end. + +%% +%% -- Internal utils --------------------------------------------------------- +%% + +-define(ND_REFS, erts_debug:get_internal_state(node_and_dist_references)). + +node_container_refc_check(Node) when is_atom(Node) -> + AIS = available_internal_state(true), + nc_refc_check(Node), + available_internal_state(AIS). + +nc_refc_check(Node) when is_atom(Node) -> + Ref = make_ref(), + Self = self(), + ?t:format("Starting reference count check of node ~w~n", [Node]), + spawn_link(Node, + fun () -> + {{node_references, NodeRefs}, + {dist_references, DistRefs}} = ?ND_REFS, + check_nd_refc({node(), erlang:system_info(creation)}, + NodeRefs, + DistRefs, + fun (ErrMsg) -> + Self ! {Ref, ErrMsg, failed}, + exit(normal) + end), + Self ! {Ref, succeded} + end), + receive + {Ref, ErrorMsg, failed} -> + ?t:format("~s~n", [ErrorMsg]), + ?t:fail(reference_count_check_failed); + {Ref, succeded} -> + ?t:format("Reference count check of node ~w succeded!~n", [Node]), + ok + end. + +check_nd_refc({ThisNodeName, ThisCreation}, NodeRefs, DistRefs, Fail) -> + case catch begin + check_refc(ThisNodeName,ThisCreation,"node table",NodeRefs), + check_refc(ThisNodeName,ThisCreation,"dist table",DistRefs), + ok + end of + ok -> + ok; + {'EXIT', Reason} -> + {Y,Mo,D} = date(), + {H,Mi,S} = time(), + ErrMsg = io_lib:format("~n" + "*** Reference count check of node ~w " + "failed (~p) at ~w~w~w ~w:~w:~w~n" + "*** Node table references:~n ~p~n" + "*** Dist table references:~n ~p~n", + [node(), Reason, Y, Mo, D, H, Mi, S, + NodeRefs, DistRefs]), + Fail(lists:flatten(ErrMsg)) + end. + + +check_refc(ThisNodeName,ThisCreation,Table,EntryList) when is_list(EntryList) -> + lists:foreach( + fun ({Entry, Refc, ReferrerList}) -> + FoundRefs = + lists:foldl( + fun ({_Referrer, ReferencesList}, A1) -> + A1 + lists:foldl(fun ({_T,Rs},A2) -> + A2+Rs + end, + 0, + ReferencesList) + end, + 0, + ReferrerList), + + %% Reference count equals found references ? + case Refc =:= FoundRefs of + true -> + ok; + false -> + exit({invalid_reference_count, Table, Entry}) + end, + + %% All entries in table referred to? + case {Entry, Refc} of + {ThisNodeName, 0} -> ok; + {{ThisNodeName, ThisCreation}, 0} -> ok; + {_, 0} -> exit({not_referred_entry_in_table, Table, Entry}); + {_, _} -> ok + end + + end, + EntryList), + ok. + +get_node_references({NodeName, Creation} = Node) when is_atom(NodeName), + is_integer(Creation) -> + {{node_references, NodeRefs}, + {dist_references, DistRefs}} = ?ND_REFS, + check_nd_refc({node(), erlang:system_info(creation)}, + NodeRefs, + DistRefs, + fun (ErrMsg) -> + ?t:format("~s", [ErrMsg]), + ?t:fail(reference_count_check_failed) + end), + find_references(Node, NodeRefs). + +get_dist_references(NodeName) when is_atom(NodeName) -> + ?line {{node_references, NodeRefs}, + {dist_references, DistRefs}} = ?ND_REFS, + ?line check_nd_refc({node(), erlang:system_info(creation)}, + NodeRefs, + DistRefs, + fun (ErrMsg) -> + ?line ?t:format("~s", [ErrMsg]), + ?line ?t:fail(reference_count_check_failed) + end), + ?line find_references(NodeName, DistRefs). + +find_references(N, NRefList) -> + case lists:keysearch(N, 1, NRefList) of + {value, {N, _, ReferrersList}} -> ReferrersList; + _ -> false + end. + +%% Currently unused +% refering_entity_type(RefererType, ReferingEntities) -> +% lists:filter(fun ({{RT, _}, _}) when RT == RefererType -> +% true; +% (_) -> +% false +% end, +% ReferingEntities). + +refering_entity_id(ReferingEntityId, [{ReferingEntityId,_} = ReferingEntity + | _ReferingEntities]) -> + ReferingEntity; +refering_entity_id(ReferingEntityId, [_ | ReferingEntities]) -> + refering_entity_id(ReferingEntityId, ReferingEntities); +refering_entity_id(_, []) -> + false. + +reference_type_count(_, false) -> + 0; +reference_type_count(Type, {_, _ReferenceCountList} = ReferingEntity) -> + reference_type_count(Type, [ReferingEntity]); +reference_type_count(Type, ReferingEntities) when is_list(ReferingEntities) -> + lists:foldl(fun ({_, ReferenceCountList}, Acc1) -> + lists:foldl(fun ({T, N}, Acc2) when T == Type -> + N + Acc2; + (_, Acc2) -> + Acc2 + end, + Acc1, + ReferenceCountList) + end, + 0, + ReferingEntities). + + +start_node(Name, Args) -> + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line Res = test_server:start_node(Name, + slave, + [{args, "-pa "++Pa++" "++Args}]), + ?line {ok, Node} = Res, + ?line rpc:call(Node, erts_debug, set_internal_state, + [available_internal_state, true]), + ?line Res. + +start_node(Name) -> + ?line start_node(Name, ""). + +stop_node(Node) -> + ?line nc_refc_check(Node), + ?line true = test_server:stop_node(Node). + +hostname() -> + from($@, atom_to_list(node())). + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(_H, []) -> []. + +wait_until(Pred) -> + case Pred() of + true -> ok; + false -> receive after 100 -> wait_until(Pred) end + end. + + +get_nodefirstname() -> + {A, B, C} = now(), + list_to_atom(atom_to_list(?MODULE) + ++ "-" + ++ integer_to_list(A) + ++ "-" + ++ integer_to_list(B) + ++ "-" + ++ integer_to_list(C)). + +get_nodename() -> + {A, B, C} = now(), + list_to_atom(atom_to_list(?MODULE) + ++ "-" + ++ integer_to_list(A) + ++ "-" + ++ integer_to_list(B) + ++ "-" + ++ integer_to_list(C) + ++ "@" + ++ hostname()). + + + +-define(VERSION_MAGIC, 131). + +-define(ATOM_EXT, 100). +-define(REFERENCE_EXT, 101). +-define(PORT_EXT, 102). +-define(PID_EXT, 103). +-define(NEW_REFERENCE_EXT, 114). + +uint32_be(Uint) when is_integer(Uint), 0 =< Uint, Uint < 1 bsl 32 -> + [(Uint bsr 24) band 16#ff, + (Uint bsr 16) band 16#ff, + (Uint bsr 8) band 16#ff, + Uint band 16#ff]; +uint32_be(Uint) -> + exit({badarg, uint32_be, [Uint]}). + + +uint16_be(Uint) when is_integer(Uint), 0 =< Uint, Uint < 1 bsl 16 -> + [(Uint bsr 8) band 16#ff, + Uint band 16#ff]; +uint16_be(Uint) -> + exit({badarg, uint16_be, [Uint]}). + +uint8(Uint) when is_integer(Uint), 0 =< Uint, Uint < 1 bsl 8 -> + Uint band 16#ff; +uint8(Uint) -> + exit({badarg, uint8, [Uint]}). + + + +mk_pid({NodeName, Creation}, Number, Serial) when is_atom(NodeName) -> + mk_pid({atom_to_list(NodeName), Creation}, Number, Serial); +mk_pid({NodeName, Creation}, Number, Serial) -> + case catch binary_to_term(list_to_binary([?VERSION_MAGIC, + ?PID_EXT, + ?ATOM_EXT, + uint16_be(length(NodeName)), + NodeName, + uint32_be(Number), + uint32_be(Serial), + uint8(Creation)])) of + Pid when is_pid(Pid) -> + Pid; + {'EXIT', {badarg, _}} -> + exit({badarg, mk_pid, [{NodeName, Creation}, Number, Serial]}); + Other -> + exit({unexpected_binary_to_term_result, Other}) + end. + +mk_port({NodeName, Creation}, Number) when is_atom(NodeName) -> + mk_port({atom_to_list(NodeName), Creation}, Number); +mk_port({NodeName, Creation}, Number) -> + case catch binary_to_term(list_to_binary([?VERSION_MAGIC, + ?PORT_EXT, + ?ATOM_EXT, + uint16_be(length(NodeName)), + NodeName, + uint32_be(Number), + uint8(Creation)])) of + Port when is_port(Port) -> + Port; + {'EXIT', {badarg, _}} -> + exit({badarg, mk_port, [{NodeName, Creation}, Number]}); + Other -> + exit({unexpected_binary_to_term_result, Other}) + end. + +mk_ref({NodeName, Creation}, Numbers) when is_atom(NodeName), + is_integer(Creation), + is_list(Numbers) -> + mk_ref({atom_to_list(NodeName), Creation}, Numbers); +mk_ref({NodeName, Creation}, [Number]) when is_list(NodeName), + is_integer(Creation), + is_integer(Number) -> + case catch binary_to_term(list_to_binary([?VERSION_MAGIC, + ?REFERENCE_EXT, + ?ATOM_EXT, + uint16_be(length(NodeName)), + NodeName, + uint32_be(Number), + uint8(Creation)])) of + Ref when is_reference(Ref) -> + Ref; + {'EXIT', {badarg, _}} -> + exit({badarg, mk_ref, [{NodeName, Creation}, [Number]]}); + Other -> + exit({unexpected_binary_to_term_result, Other}) + end; +mk_ref({NodeName, Creation}, Numbers) when is_list(NodeName), + is_integer(Creation), + is_list(Numbers) -> + case catch binary_to_term(list_to_binary([?VERSION_MAGIC, + ?NEW_REFERENCE_EXT, + uint16_be(length(Numbers)), + ?ATOM_EXT, + uint16_be(length(NodeName)), + NodeName, + uint8(Creation), + lists:map(fun (N) -> + uint32_be(N) + end, + Numbers)])) of + Ref when is_reference(Ref) -> + Ref; + {'EXIT', {badarg, _}} -> + exit({badarg, mk_ref, [{NodeName, Creation}, Numbers]}); + Other -> + exit({unexpected_binary_to_term_result, Other}) + end. + +exec_loop() -> + receive + {exec_fun, Fun} when is_function(Fun) -> + Fun(); + {sync_exec_fun, From, Fun} when is_pid(From), is_function(Fun) -> + From ! {sync_exec_fun_res, self(), Fun()} + end, + exec_loop(). + +spawn_execer(Node) -> + spawn(Node, fun () -> exec_loop() end). + +spawn_link_execer(Node) -> + spawn_link(Node, fun () -> exec_loop() end). + +exec(Pid, Fun) when is_pid(Pid), is_function(Fun) -> + Pid ! {exec_fun, Fun}. + +sync_exec(Pid, Fun) when is_pid(Pid), is_function(Fun) -> + Pid ! {sync_exec_fun, self(), Fun}, + receive + {sync_exec_fun_res, Pid, Res} -> + Res + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/nofrag_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/nofrag_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/nofrag_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/nofrag_SUITE.erl 2009-09-18 15:09:22.000000000 +0100 @@ -0,0 +1,208 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(nofrag_SUITE). + +-include("test_server.hrl"). + +-export([all/1,init_per_testcase/2,end_per_testcase/2, + error_handler/1,error_handler_apply/1, + error_handler_fixed_apply/1,error_handler_fun/1, + error_handler_tuple_fun/1, + debug_breakpoint/1]). + +%% Exported functions for an error_handler module. +-export([undefined_function/3,undefined_lambda/3,breakpoint/3]). + +all(suite) -> + [error_handler,error_handler_apply,error_handler_fixed_apply, + error_handler_fun,error_handler_tuple_fun,debug_breakpoint]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(3)), + [{watchdog,Dog}|Config]. + +end_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +error_handler(Config) when is_list(Config) -> + ?line process_flag(error_handler, ?MODULE), + %% The term_to_binary/1 - binary_to_term/1 roundtrip is a good way + %% to traverse the entire term. + ?line Term = collect(1024), + ?line Term = binary_to_term(term_to_binary(Term)), + ?line 1024 = length(Term), + ?line [[a,b,c,d,[e,f,g]]] = lists:usort(Term), + ok. + +collect(0) -> + []; +collect(N) -> + %% The next line calls the error handle function, which is + %% ?MODULE:undefined_function/3 (it simply returns the list + %% of args, i.e. [a,b,c,d,[e,f,g]]). + C = fooblurf:x(a, b, c, d, [e,f,id(g)]), + + %% The variable C will be saved onto the stack frame; if C + %% points into a heap fragment the garbage collector will reach + %% it and the emulator will crash sooner or later (sooner if + %% the emulator is debug-compiled). + Res = collect(N-1), + [C|Res]. + +collect_apply(0, _) -> + []; +collect_apply(N, Mod) -> + %% The next line calls the error handle function, which is + %% ?MODULE:undefined_function/3 (it simply returns the list + %% of args). + + C = apply(Mod, xyz, id([{a,id(42)},b,c,d,[e,f,id(g)]])), + + %% The variable C will be saved onto the stack frame; if C + %% points into a heap fragment the garbage collector will reach + %% it and the emulator will crash sooner or later (sooner if + %% the emulator is debug-compiled). + Res = collect_apply(N-1, Mod), + [C|Res]. + +error_handler_apply(Config) when is_list(Config) -> + ?line process_flag(error_handler, ?MODULE), + + %% The term_to_binary/1 - binary_to_term/1 roundtrip is a good way + %% to traverse the entire term. + ?line Term = collect_apply(1024, fooblurfbar), + ?line Term = binary_to_term(term_to_binary(Term)), + ?line 1024 = length(Term), + ?line [[{a,42},b,c,d,[e,f,g]]] = lists:usort(Term), + ok. + +error_handler_fixed_apply(Config) when is_list(Config) -> + ?line process_flag(error_handler, ?MODULE), + + %% The term_to_binary/1 - binary_to_term/1 roundtrip is a good way + %% to traverse the entire term. + ?line Term = collect_fixed_apply(1024, fooblurfbar), + ?line Term = binary_to_term(term_to_binary(Term)), + ?line 1024 = length(Term), + ?line [[{a,2},b,c,d,[e,f,g]]] = lists:usort(Term), + ok. + +collect_fixed_apply(0, _) -> + []; +collect_fixed_apply(N, Mod) -> + %% The next line calls the error handle function, which is + %% ?MODULE:undefined_function/3 (it simply returns the list + %% of args). + C = Mod:x({a,id(2)}, b, c, d, [e,f,id(g)]), + + %% The variable C will be saved onto the stack frame; if C + %% points into a heap fragment the garbage collector will reach + %% it and the emulator will crash sooner or later (sooner if + %% the emulator is debug-compiled). + Res = collect_fixed_apply(N-1, Mod), + [C|Res]. + +undefined_function(_Mod, _Name, Args) -> + Args. + +error_handler_fun(Config) when is_list(Config) -> + ?line process_flag(error_handler, ?MODULE), + + %% fun(A, B, C) -> {A,B,C,X} end in module foobarblurf. + B = <<131,112,0,0,0,84,3,109,96,69,208,5,175,207,75,36,93,112,218,232,222,22,251,0, + 0,0,0,0,0,0,1,100,0,11,102,111,111,98,97,114,98,108,117,114,102,97,0,98,5, + 244,197,144,103,100,0,13,110,111,110,111,100,101,64,110,111,104,111,115,116, + 0,0,0,46,0,0,0,0,0,104,3,97,1,97,2,97,3>>, + ?line Fun = binary_to_term(B), + ?line Term = collect_fun(1024, Fun), + ?line Term = binary_to_term(term_to_binary(Term)), + ?line 1024 = length(Term), + ?line [[{foo,bar},{99,1.0},[e,f,g]]] = lists:usort(Term), + ?line {env,[{1,2,3}]} = erlang:fun_info(Fun, env), + ok. + +collect_fun(0, _) -> + []; +collect_fun(N, Fun) -> + %% The next line calls the error handle function, which is + %% ?MODULE:undefined_lambda/3 (it simply returns the list + %% of args). + C = Fun({foo,id(bar)}, {99,id(1.0)}, [e,f,id(g)]), + + %% The variable C will be saved onto the stack frame; if C + %% points into a heap fragment the garbage collector will reach + %% it and the emulator will crash sooner or later (sooner if + %% the emulator is debug-compiled). + Res = collect_fun(N-1, Fun), + [C|Res]. + +undefined_lambda(foobarblurf, Fun, Args) when is_function(Fun) -> + Args. + +error_handler_tuple_fun(Config) when is_list(Config) -> + ?line process_flag(error_handler, ?MODULE), + ?line Term = collect_tuple_fun(1024, {?MODULE,very_undefined_function}), + ?line Term = binary_to_term(term_to_binary(Term)), + ?line 1024 = length(Term), + ?line [[{foo,bar},42.0,[e,f,g]]] = lists:usort(Term), + ok. + +collect_tuple_fun(0, _) -> + []; +collect_tuple_fun(N, Fun) -> + %% The next line calls the error handle function, which is + %% ?MODULE:undefined_function/3 (it simply returns the list + %% of args). + C = Fun({foo,id(bar)}, 42.0, [e,f,id(g)]), + + %% The variable C will be saved onto the stack frame; if C + %% points into a heap fragment the garbage collector will reach + %% it and the emulator will crash sooner or later (sooner if + %% the emulator is debug-compiled). + Res = collect_tuple_fun(N-1, Fun), + [C|Res]. + +debug_breakpoint(Config) when is_list(Config) -> + ?line process_flag(error_handler, ?MODULE), + ?line erts_debug:breakpoint({?MODULE,foobar,5}, true), + ?line Term = break_collect(1024), + ?line Term = binary_to_term(term_to_binary(Term)), + ?line 1024 = length(Term), + ?line [[a,b,c,{d,e},[f,g,h]]] = lists:usort(Term), + ?line erts_debug:breakpoint({?MODULE,foobar,5}, false), + ok. + +break_collect(0) -> + []; +break_collect(N) -> + C = foobar(a, b, c, {id(d),e}, [f,g,id(h)]), + Res = break_collect(N-1), + [C|Res]. + +breakpoint(?MODULE, foobar, Args) -> + Args. + +foobar(_, _, _, _, _) -> + exit(dont_execute_me). + +id(I) -> I. + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/num_bif_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/num_bif_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/num_bif_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/num_bif_SUITE.erl 2009-09-18 15:07:30.000000000 +0100 @@ -0,0 +1,268 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(num_bif_SUITE). + +-include("test_server.hrl"). + +%% Tests the BIFs: +%% abs/1 +%% float/1 +%% float_to_list/1 +%% integer_to_list/1 +%% list_to_float/1 +%% list_to_integer/1 +%% round/1 +%% trunc/1 + +-export([all/1, t_abs/1, t_float/1, + t_float_to_list/1, t_integer_to_list/1, + t_list_to_integer/1, + t_list_to_float/1, t_list_to_float_safe/1, t_list_to_float_risky/1, + t_round/1, t_trunc/1]). + +all(suite) -> [t_abs, t_float, t_float_to_list, t_integer_to_list, + t_list_to_float, t_list_to_integer, + t_round, t_trunc]. + +t_abs(Config) when is_list(Config) -> + %% Floats. + ?line 5.5 = abs(id(5.5)), + ?line 0.0 = abs(id(0.0)), + ?line 100.0 = abs(id(-100.0)), + + %% Integers. + ?line 5 = abs(id(5)), + ?line 0 = abs(id(0)), + ?line 100 = abs(id(-100)), + + %% The largest smallnum. OTP-3190. + ?line X = id((1 bsl 27) - 1), + ?line X = abs(X), + ?line X = abs(X-1)+1, + ?line X = abs(X+1)-1, + ?line X = abs(-X), + ?line X = abs(-X-1)-1, + ?line X = abs(-X+1)+1, + + %% Bignums. + BigNum = id(13984792374983749), + ?line BigNum = abs(BigNum), + ?line BigNum = abs(-BigNum), + ok. + +t_float(Config) when is_list(Config) -> + ?line 0.0 = float(id(0)), + ?line 2.5 = float(id(2.5)), + ?line 0.0 = float(id(0.0)), + ?line -100.55 = float(id(-100.55)), + ?line 42.0 = float(id(42)), + ?line -100.0 = float(id(-100)), + + %% Bignums. + ?line 4294967305.0 = float(id(4294967305)), + ?line -4294967305.0 = float(id(-4294967305)), + + %% Extremly big bignums. + ?line Big = id(list_to_integer(id(lists:duplicate(2000, $1)))), + ?line {'EXIT', {badarg, _}} = (catch float(Big)), + + %% Invalid types and lists. + ?line {'EXIT', {badarg, _}} = (catch list_to_integer(id(atom))), + ?line {'EXIT', {badarg, _}} = (catch list_to_integer(id(123))), + ?line {'EXIT', {badarg, _}} = (catch list_to_integer(id([$1,[$2]]))), + ?line {'EXIT', {badarg, _}} = (catch list_to_integer(id("1.2"))), + ?line {'EXIT', {badarg, _}} = (catch list_to_integer(id("a"))), + ?line {'EXIT', {badarg, _}} = (catch list_to_integer(id(""))), + ok. + + +%% Tests float_to_list/1. + +t_float_to_list(Config) when is_list(Config) -> + ?line test_ftl("0.0e+0", 0.0), + ?line test_ftl("2.5e+1", 25.0), + ?line test_ftl("2.5e+0", 2.5), + ?line test_ftl("2.5e-1", 0.25), + ?line test_ftl("-3.5e+17", -350.0e15), + ok. + +test_ftl(Expect, Float) -> + %% No ?line on the next line -- we want the line number from t_float_to_list. + Expect = remove_zeros(lists:reverse(float_to_list(Float)), []). + +%% Removes any non-significant zeros in a floating point number. +%% Example: 2.500000e+01 -> 2.5e+1 + +remove_zeros([$+, $e|Rest], [$0, X|Result]) -> + remove_zeros([$+, $e|Rest], [X|Result]); +remove_zeros([$-, $e|Rest], [$0, X|Result]) -> + remove_zeros([$-, $e|Rest], [X|Result]); +remove_zeros([$0, $.|Rest], [$e|Result]) -> + remove_zeros(Rest, [$., $0, $e|Result]); +remove_zeros([$0|Rest], [$e|Result]) -> + remove_zeros(Rest, [$e|Result]); +remove_zeros([Char|Rest], Result) -> + remove_zeros(Rest, [Char|Result]); +remove_zeros([], Result) -> + Result. + +%% Tests integer_to_list/1. + +t_integer_to_list(Config) when is_list(Config) -> + ?line "0" = integer_to_list(id(0)), + ?line "42" = integer_to_list(id(42)), + ?line "-42" = integer_to_list(id(-42)), + ?line "32768" = integer_to_list(id(32768)), + ?line "268435455" = integer_to_list(id(268435455)), + ?line "-268435455" = integer_to_list(id(-268435455)), + ?line "123456932798748738738" = integer_to_list(id(123456932798748738738)), + ?line Big_List = id(lists:duplicate(2000, id($1))), + ?line Big = list_to_integer(Big_List), + ?line Big_List = integer_to_list(Big), + ok. + +%% Tests list_to_float/1. + +t_list_to_float(suite) -> [t_list_to_float_safe, t_list_to_float_risky]. + +t_list_to_float_safe(Config) when is_list(Config) -> + ?line 0.0 = list_to_float(id("0.0")), + ?line 0.0 = list_to_float(id("-0.0")), + ?line 0.5 = list_to_float(id("0.5")), + ?line -0.5 = list_to_float(id("-0.5")), + ?line 100.0 = list_to_float(id("1.0e2")), + ?line 127.5 = list_to_float(id("127.5")), + ?line -199.5 = list_to_float(id("-199.5")), + + ?line {'EXIT',{badarg,_}} = (catch list_to_float(id("0"))), + ?line {'EXIT',{badarg,_}} = (catch list_to_float(id("0..0"))), + ?line {'EXIT',{badarg,_}} = (catch list_to_float(id("0e12"))), + ?line {'EXIT',{badarg,_}} = (catch list_to_float(id("--0.0"))), + + ok. + +%% This might crash the emulator... +%% (Known to crash the Unix version of Erlang 4.4.1) + +t_list_to_float_risky(Config) when is_list(Config) -> + ?line Many_Ones = lists:duplicate(25000, id($1)), + ?line id(list_to_float("2."++Many_Ones)), + ?line {'EXIT', {badarg, _}} = (catch list_to_float("2"++Many_Ones)), + ok. + +%% Tests list_to_integer/1. + +t_list_to_integer(Config) when is_list(Config) -> + ?line 0 = list_to_integer(id("0")), + ?line 0 = list_to_integer(id("00")), + ?line 0 = list_to_integer(id("-0")), + ?line 1 = list_to_integer(id("1")), + ?line -1 = list_to_integer(id("-1")), + ?line 42 = list_to_integer(id("42")), + ?line -12 = list_to_integer(id("-12")), + ?line 32768 = list_to_integer(id("32768")), + ?line 268435455 = list_to_integer(id("268435455")), + ?line -268435455 = list_to_integer(id("-268435455")), + + %% Bignums. + ?line 123456932798748738738 = list_to_integer(id("123456932798748738738")), + ?line id(list_to_integer(lists:duplicate(2000, id($1)))), + ok. + +%% Tests round/1. + +t_round(Config) when is_list(Config) -> + ?line 0 = round(id(0.0)), + ?line 0 = round(id(0.4)), + ?line 1 = round(id(0.5)), + ?line 0 = round(id(-0.4)), + ?line -1 = round(id(-0.5)), + ?line 255 = round(id(255.3)), + ?line 256 = round(id(255.6)), + ?line -1033 = round(id(-1033.3)), + ?line -1034 = round(id(-1033.6)), + + % OTP-3722: + ?line X = id((1 bsl 27) - 1), + ?line MX = -X, + ?line MXm1 = -X-1, + ?line MXp1 = -X+1, + ?line F = id(X + 0.0), + ?line X = round(F), + ?line X = round(F+1)-1, + ?line X = round(F-1)+1, + ?line MX = round(-F), + ?line MXm1 = round(-F-1), + ?line MXp1 = round(-F+1), + + ?line X = round(F+0.1), + ?line X = round(F+1+0.1)-1, + ?line X = round(F-1+0.1)+1, + ?line MX = round(-F+0.1), + ?line MXm1 = round(-F-1+0.1), + ?line MXp1 = round(-F+1+0.1), + + ?line X = round(F-0.1), + ?line X = round(F+1-0.1)-1, + ?line X = round(F-1-0.1)+1, + ?line MX = round(-F-0.1), + ?line MXm1 = round(-F-1-0.1), + ?line MXp1 = round(-F+1-0.1), + + ?line 0.5 = abs(round(F+0.5)-(F+0.5)), + ?line 0.5 = abs(round(F-0.5)-(F-0.5)), + ?line 0.5 = abs(round(-F-0.5)-(-F-0.5)), + ?line 0.5 = abs(round(-F+0.5)-(-F+0.5)), + + %% Bignums. + ?line 4294967296 = round(id(4294967296.1)), + ?line 4294967297 = round(id(4294967296.9)), + ?line -4294967296 = -round(id(4294967296.1)), + ?line -4294967297 = -round(id(4294967296.9)), + ok. + +t_trunc(Config) when is_list(Config) -> + ?line 0 = trunc(id(0.0)), + ?line 5 = trunc(id(5.3333)), + ?line -10 = trunc(id(-10.978987)), + + % The largest smallnum, converted to float (OTP-3722): + ?line X = id((1 bsl 27) - 1), + ?line F = id(X + 0.0), + io:format("X = ~p/~w/~w, F = ~p/~w/~w, trunc(F) = ~p/~w/~w~n", + [X, X, binary_to_list(term_to_binary(X)), + F, F, binary_to_list(term_to_binary(F)), + trunc(F), trunc(F), binary_to_list(term_to_binary(trunc(F)))]), + ?line X = trunc(F), + ?line X = trunc(F+1)-1, + ?line X = trunc(F-1)+1, + ?line X = -trunc(-F), + ?line X = -trunc(-F-1)-1, + ?line X = -trunc(-F+1)+1, + + %% Bignums. + ?line 4294967305 = trunc(id(4294967305.7)), + ?line -4294967305 = trunc(id(-4294967305.7)), + ok. + +% Calling this function (which is not supposed to be inlined) prevents +% the compiler from calculating the answer, so we don't test the compiler +% instead of the newest runtime system. +id(X) -> X. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/obsolete_SUITE_data/erl_threads.c erlang-13.b.3-dfsg/erts/emulator/test/obsolete_SUITE_data/erl_threads.c --- erlang-13.b.1-dfsg/erts/emulator/test/obsolete_SUITE_data/erl_threads.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/obsolete_SUITE_data/erl_threads.c 2007-11-26 19:00:16.000000000 +0000 @@ -0,0 +1,302 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" + +#ifndef __WIN32__ + +#define NO_OF_THREADS 2 + +#include +#include + +static int die; +static int cw_passed; +static int res_tf0; +static int res_tf1; +static erl_mutex_t mtx; +static erl_cond_t cnd; +static erl_thread_t tid[NO_OF_THREADS]; +static int need_join[NO_OF_THREADS]; + +typedef struct { + int n; +} thr_arg_t; + + +static void *tf0(void *vta) +{ + int r; + + if (((thr_arg_t *) vta)->n != 0) + goto fail; + + r = erts_mutex_lock(mtx); + if (r != 0) { + erts_mutex_unlock(mtx); + goto fail; + } + + r = erts_cond_wait(cnd, mtx); + if (r != 0 || die) { + erts_mutex_unlock(mtx); + goto fail; + } + + cw_passed++; + + r = erts_cond_wait(cnd, mtx); + if (r != 0 || die) { + erts_mutex_unlock(mtx); + goto fail; + } + + cw_passed++; + + r = erts_mutex_unlock(mtx); + if (r != 0) + goto fail; + + res_tf0 = 0; + + return (void *) &res_tf0; + + fail: + return NULL; +} + + +static void *tf1(void *vta) +{ + int r; + + if (((thr_arg_t *) vta)->n != 1) + goto fail; + + r = erts_mutex_lock(mtx); + if (r != 0) { + erts_mutex_unlock(mtx); + goto fail; + } + + r = erts_cond_wait(cnd, mtx); + if (r != 0 || die) { + erts_mutex_unlock(mtx); + goto fail; + } + + cw_passed++; + + r = erts_cond_wait(cnd, mtx); + if (r != 0 || die) { + erts_mutex_unlock(mtx); + goto fail; + } + + cw_passed++; + + r = erts_mutex_unlock(mtx); + if (r != 0) + goto fail; + + res_tf1 = 1; + + erts_thread_exit((void *) &res_tf1); + + res_tf1 = 4711; + + fail: + return NULL; +} + +#endif /* #ifndef __WIN32__ */ + +void +testcase_run(TestCaseState_t *tcs) +{ +#ifdef __WIN32__ + testcase_skipped(tcs, "Nothing to test; not supported on windows."); +#else + int i, r; + void *tres[NO_OF_THREADS]; + thr_arg_t ta[NO_OF_THREADS]; + erl_thread_t t1; + + die = 0; + cw_passed = 0; + + for (i = 0; i < NO_OF_THREADS; i++) + need_join[i] = 0; + + res_tf0 = 17; + res_tf1 = 17; + + cnd = mtx = NULL; + + /* Create mutex and cond */ + mtx = erts_mutex_create(); + ASSERT(tcs, mtx); + cnd = erts_cond_create(); + ASSERT(tcs, cnd); + + /* Create the threads */ + ta[0].n = 0; + r = erts_thread_create(&tid[0], tf0, (void *) &ta[0], 0); + ASSERT(tcs, r == 0); + need_join[0] = 1; + + ta[1].n = 1; + r = erts_thread_create(&tid[1], tf1, (void *) &ta[1], 0); + ASSERT(tcs, r == 0); + need_join[1] = 1; + + /* Make sure the threads waits on cond wait */ + sleep(1); + + r = erts_mutex_lock(mtx); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + + ASSERT_CLNUP(tcs, cw_passed == 0, (void) erts_mutex_unlock(mtx)); + + + /* Let one thread pass one cond wait */ + r = erts_cond_signal(cnd); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + + r = erts_mutex_unlock(mtx); + ASSERT(tcs, r == 0); + + sleep(1); + + r = erts_mutex_lock(mtx); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + + ASSERT_CLNUP(tcs, cw_passed == 1, (void) erts_mutex_unlock(mtx)); + + + /* Let both threads pass one cond wait */ + r = erts_cond_broadcast(cnd); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + + r = erts_mutex_unlock(mtx); + ASSERT(tcs, r == 0); + + sleep(1); + + r = erts_mutex_lock(mtx); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + + ASSERT_CLNUP(tcs, cw_passed == 3, (void) erts_mutex_unlock(mtx)); + + + /* Let the thread that only have passed one cond wait pass the other one */ + r = erts_cond_signal(cnd); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + + r = erts_mutex_unlock(mtx); + ASSERT(tcs, r == 0); + + sleep(1); + + r = erts_mutex_lock(mtx); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + + ASSERT_CLNUP(tcs, cw_passed == 4, (void) erts_mutex_unlock(mtx)); + + /* Both threads should have passed both cond waits and exited; + join them and check returned values */ + + r = erts_thread_join(tid[0], &tres[0]); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + need_join[0] = 0; + + ASSERT_CLNUP(tcs, tres[0] == &res_tf0, (void) erts_mutex_unlock(mtx)); + ASSERT_CLNUP(tcs, res_tf0 == 0, (void) erts_mutex_unlock(mtx)); + + r = erts_thread_join(tid[1], &tres[1]); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + need_join[1] = 0; + + ASSERT_CLNUP(tcs, tres[1] == &res_tf1, (void) erts_mutex_unlock(mtx)); + ASSERT_CLNUP(tcs, res_tf1 == 1, (void) erts_mutex_unlock(mtx)); + + /* Test signaling when noone waits */ + + r = erts_cond_signal(cnd); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + + /* Test broadcasting when noone waits */ + + r = erts_cond_broadcast(cnd); + ASSERT_CLNUP(tcs, r == 0, (void) erts_mutex_unlock(mtx)); + + /* erts_cond_timedwait() not supported anymore */ + r = erts_cond_timedwait(cnd, mtx, 1000); + ASSERT_CLNUP(tcs, r != 0, (void) erts_mutex_unlock(mtx)); + ASSERT_CLNUP(tcs, + strcmp(erl_errno_id(r), "enotsup") == 0, + (void) erts_mutex_unlock(mtx)); + + r = erts_mutex_unlock(mtx); + ASSERT(tcs, r == 0); + + r = erts_mutex_destroy(mtx); + ASSERT(tcs, r == 0); + mtx = NULL; + + r = erts_cond_destroy(cnd); + ASSERT(tcs, r == 0); + cnd = NULL; + + /* ... */ + t1 = erts_thread_self(); + + if (cw_passed == 4711) { + /* We don't want to execute this just check that the + symbol/symbols is/are defined */ + erts_thread_kill(t1); + } + +#endif /* #ifndef __WIN32__ */ +} + +char * +testcase_name(void) +{ + return "erl_threads"; +} + +void +testcase_cleanup(TestCaseState_t *tcs) +{ + int i; + for (i = 0; i < NO_OF_THREADS; i++) { + if (need_join[i]) { + erts_mutex_lock(mtx); + die = 1; + erts_cond_broadcast(cnd); + erts_mutex_unlock(mtx); + erts_thread_join(tid[1], NULL); + } + } + if (mtx) + erts_mutex_destroy(mtx); + if (cnd) + erts_cond_destroy(cnd); +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/obsolete_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/obsolete_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/obsolete_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/obsolete_SUITE_data/Makefile.src 2004-09-14 12:58:31.000000000 +0100 @@ -0,0 +1,33 @@ +# ``The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved via the world wide web at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# The Initial Developer of the Original Code is Ericsson Utvecklings AB. +# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings +# AB. All Rights Reserved.'' +# +# $Id$ +# + +TEST_DRVS = erl_threads@dll@ +CC = @CC@ +LD = @LD@ +CFLAGS = @SHLIB_CFLAGS@ -I@erl_include@ @DEFS@ +SHLIB_EXTRA_LDLIBS = testcase_driver@obj@ + +all: $(TEST_DRVS) + +@SHLIB_RULES@ + +testcase_driver@obj@: testcase_driver.c testcase_driver.h +$(TEST_DRVS): testcase_driver@obj@ + + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/obsolete_SUITE_data/testcase_driver.c erlang-13.b.3-dfsg/erts/emulator/test/obsolete_SUITE_data/testcase_driver.c --- erlang-13.b.1-dfsg/erts/emulator/test/obsolete_SUITE_data/testcase_driver.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/obsolete_SUITE_data/testcase_driver.c 2009-03-12 12:16:46.000000000 +0000 @@ -0,0 +1,262 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "testcase_driver.h" +#include +#include +#include +#include +#include + +#ifdef __WIN32__ +#undef HAVE_VSNPRINTF +#define HAVE_VSNPRINTF 1 +#define vsnprintf _vsnprintf +#endif + +#ifndef HAVE_VSNPRINTF +#define HAVE_VSNPRINTF 0 +#endif + +#define COMMENT_BUF_SZ 4096 + +#define TESTCASE_FAILED 0 +#define TESTCASE_SKIPPED 1 +#define TESTCASE_SUCCEEDED 2 + +typedef struct { + TestCaseState_t visible; + int port; + int result; + jmp_buf done_jmp_buf; + char *comment; + char comment_buf[COMMENT_BUF_SZ]; +} InternalTestCaseState_t; + +long testcase_drv_start(int port, char *command); +int testcase_drv_stop(long drv_data); +int testcase_drv_run(long drv_data, char *buf, int len); + +static DriverEntry testcase_drv_entry = { + NULL, + testcase_drv_start, + testcase_drv_stop, + testcase_drv_run +}; + + +int DRIVER_INIT(testcase_drv)(void *arg) +{ + testcase_drv_entry.driver_name = testcase_name(); + return (int) &testcase_drv_entry; +} + +long +testcase_drv_start(int port, char *command) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) + driver_alloc(sizeof(InternalTestCaseState_t)); + if (!itcs) { + return -1; + } + + itcs->visible.testcase_name = testcase_name(); + itcs->visible.extra = NULL; + itcs->port = port; + itcs->result = TESTCASE_FAILED; + itcs->comment = ""; + + return (long) itcs; +} + +int +testcase_drv_stop(long drv_data) +{ + testcase_cleanup((TestCaseState_t *) drv_data); + driver_free((void *) drv_data); + return 0; +} + +int +testcase_drv_run(long drv_data, char *buf, int len) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) drv_data; + DriverTermData result_atom; + DriverTermData msg[12]; + + itcs->visible.command = buf; + itcs->visible.command_len = len; + + if (setjmp(itcs->done_jmp_buf) == 0) { + testcase_run((TestCaseState_t *) itcs); + itcs->result = TESTCASE_SUCCEEDED; + } + + switch (itcs->result) { + case TESTCASE_SUCCEEDED: + result_atom = driver_mk_atom("succeeded"); + break; + case TESTCASE_SKIPPED: + result_atom = driver_mk_atom("skipped"); + break; + case TESTCASE_FAILED: + default: + result_atom = driver_mk_atom("failed"); + break; + } + + msg[0] = ERL_DRV_ATOM; + msg[1] = (DriverTermData) result_atom; + + msg[2] = ERL_DRV_PORT; + msg[3] = driver_mk_port(itcs->port); + + msg[4] = ERL_DRV_ATOM; + msg[5] = driver_mk_atom(itcs->visible.testcase_name); + + msg[6] = ERL_DRV_STRING; + msg[7] = (DriverTermData) itcs->comment; + msg[8] = (DriverTermData) strlen(itcs->comment); + + msg[9] = ERL_DRV_TUPLE; + msg[10] = (DriverTermData) 4; + + driver_output_term(itcs->port, msg, 11); + return 0; +} + +int +testcase_assertion_failed(TestCaseState_t *tcs, + char *file, int line, char *assertion) +{ + testcase_failed(tcs, "%s:%d: Assertion failed: \"%s\"", + file, line, assertion); + return 0; +} + +void +testcase_printf(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + DriverTermData msg[12]; + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + msg[0] = ERL_DRV_ATOM; + msg[1] = (DriverTermData) driver_mk_atom("print"); + + msg[2] = ERL_DRV_PORT; + msg[3] = driver_mk_port(itcs->port); + + msg[4] = ERL_DRV_ATOM; + msg[5] = driver_mk_atom(itcs->visible.testcase_name); + + msg[6] = ERL_DRV_STRING; + msg[7] = (DriverTermData) itcs->comment_buf; + msg[8] = (DriverTermData) strlen(itcs->comment_buf); + + msg[9] = ERL_DRV_TUPLE; + msg[10] = (DriverTermData) 4; + + driver_output_term(itcs->port, msg, 11); +} + + +void testcase_succeeded(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + itcs->result = TESTCASE_SUCCEEDED; + itcs->comment = itcs->comment_buf; + + longjmp(itcs->done_jmp_buf, 1); +} + +void testcase_skipped(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + itcs->result = TESTCASE_SKIPPED; + itcs->comment = itcs->comment_buf; + + longjmp(itcs->done_jmp_buf, 1); +} + +void testcase_failed(TestCaseState_t *tcs, char *frmt, ...) +{ + InternalTestCaseState_t *itcs = (InternalTestCaseState_t *) tcs; + char buf[10]; + size_t bufsz = sizeof(buf); + va_list va; + va_start(va, frmt); +#if HAVE_VSNPRINTF + vsnprintf(itcs->comment_buf, COMMENT_BUF_SZ, frmt, va); +#else + vsprintf(itcs->comment_buf, frmt, va); +#endif + va_end(va); + + itcs->result = TESTCASE_FAILED; + itcs->comment = itcs->comment_buf; + + if (erl_drv_getenv("ERL_ABORT_ON_FAILURE", buf, &bufsz) == 0 + && strcmp("true", buf) == 0) { + fprintf(stderr, "Testcase \"%s\" failed: %s\n", + itcs->visible.testcase_name, itcs->comment); + abort(); + } + + longjmp(itcs->done_jmp_buf, 1); +} + +void *testcase_alloc(size_t size) +{ + return driver_alloc(size); +} + +void *testcase_realloc(void *ptr, size_t size) +{ + return driver_realloc(ptr, size); +} + +void testcase_free(void *ptr) +{ + driver_free(ptr); +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/obsolete_SUITE_data/testcase_driver.h erlang-13.b.3-dfsg/erts/emulator/test/obsolete_SUITE_data/testcase_driver.h --- erlang-13.b.1-dfsg/erts/emulator/test/obsolete_SUITE_data/testcase_driver.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/obsolete_SUITE_data/testcase_driver.h 2007-11-26 19:00:17.000000000 +0000 @@ -0,0 +1,57 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#ifndef TESTCASE_DRIVER_H__ +#define TESTCASE_DRIVER_H__ + +#include "obsolete/driver.h" +#include + +typedef struct { + char *testcase_name; + char *command; + int command_len; + void *extra; +} TestCaseState_t; + +#define ASSERT_CLNUP(TCS, B, CLN) \ +do { \ + if (!(B)) { \ + CLN; \ + testcase_assertion_failed((TCS), __FILE__, __LINE__, #B); \ + } \ +} while (0) + +#define ASSERT(TCS, B) ASSERT_CLNUP(TCS, B, (void) 0) + +void testcase_printf(TestCaseState_t *tcs, char *frmt, ...); +void testcase_succeeded(TestCaseState_t *tcs, char *frmt, ...); +void testcase_skipped(TestCaseState_t *tcs, char *frmt, ...); +void testcase_failed(TestCaseState_t *tcs, char *frmt, ...); +int testcase_assertion_failed(TestCaseState_t *tcs, char *file, int line, + char *assertion); +void *testcase_alloc(size_t size); +void *testcase_realloc(void *ptr, size_t size); +void testcase_free(void *ptr); + + +char *testcase_name(void); +void testcase_run(TestCaseState_t *tcs); +void testcase_cleanup(TestCaseState_t *tcs); + +#endif diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/obsolete_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/obsolete_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/obsolete_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/obsolete_SUITE.erl 2009-11-20 13:32:00.000000000 +0000 @@ -0,0 +1,123 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +-module(obsolete_SUITE). +-author('rickard.s.green@ericsson.com'). +-compile(nowarn_obsolete_guard). + +-export([all/1]). + +-export([erl_threads/1]). + +-include("test_server.hrl"). + +-define(DEFAULT_TIMETRAP_SECS, 240). + +all(doc) -> []; +all(suite) -> + case catch erlang:system_info(wordsize) of + 4 -> [erl_threads]; + _ -> {skip, "Only expected to work on 32-bit architectures"} + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% Testcases %% +%% %% + +erl_threads(suite) -> []; +erl_threads(doc) -> []; +erl_threads(Cfg) -> + ?line case erlang:system_info(threads) of + true -> + ?line drv_case(Cfg, erl_threads); + false -> + ?line {skip, "Emulator not compiled with threads support"} + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% Internal functions %% +%% %% + +drv_case(Config, CaseName) -> + drv_case(Config, CaseName, ""). + +drv_case(Config, CaseName, TimeTrap) when integer(TimeTrap) -> + drv_case(Config, CaseName, "", TimeTrap); +drv_case(Config, CaseName, Command) when list(Command) -> + drv_case(Config, CaseName, Command, ?DEFAULT_TIMETRAP_SECS). + +drv_case(Config, CaseName, TimeTrap, Command) when list(Command), + integer(TimeTrap) -> + drv_case(Config, CaseName, Command, TimeTrap); +drv_case(Config, CaseName, Command, TimeTrap) when list(Config), + atom(CaseName), + list(Command), + integer(TimeTrap) -> + case ?t:os_type() of + {Family, _} when Family == unix; Family == win32 -> + ?line run_drv_case(Config, CaseName, Command, TimeTrap); + SkipOs -> + ?line {skipped, + lists:flatten(["Not run on " + | io_lib:format("~p",[SkipOs])])} + end. + +run_drv_case(Config, CaseName, Command, TimeTrap) -> + ?line Dog = test_server:timetrap(test_server:seconds(TimeTrap)), + ?line DataDir = ?config(data_dir,Config), + case erl_ddll:load_driver(DataDir, CaseName) of + ok -> ok; + {error, Error} -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + ?line ?t:fail() + end, + ?line Port = open_port({spawn, atom_to_list(CaseName)}, []), + ?line true = is_port(Port), + ?line Port ! {self(), {command, Command}}, + ?line Result = receive_drv_result(Port, CaseName), + ?line Port ! {self(), close}, + ?line receive + {Port, closed} -> + ok + end, + ?line ok = erl_ddll:unload_driver(CaseName), + ?line test_server:timetrap_cancel(Dog), + ?line Result. + +receive_drv_result(Port, CaseName) -> + ?line receive + {print, Port, CaseName, Str} -> + ?line ?t:format("~s", [Str]), + ?line receive_drv_result(Port, CaseName); + {'EXIT', Port, Error} -> + ?line ?t:fail(Error); + {'EXIT', error, Error} -> + ?line ?t:fail(Error); + {failed, Port, CaseName, Comment} -> + ?line ?t:fail(Comment); + {skipped, Port, CaseName, Comment} -> + ?line {skipped, Comment}; + {succeeded, Port, CaseName, ""} -> + ?line succeeded; + {succeeded, Port, CaseName, Comment} -> + ?line {comment, Comment} + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/old_mod.erl erlang-13.b.3-dfsg/erts/emulator/test/old_mod.erl --- erlang-13.b.1-dfsg/erts/emulator/test/old_mod.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/old_mod.erl 2009-09-18 15:08:41.000000000 +0100 @@ -0,0 +1,47 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(old_mod). +-compile(r10). + +-export([sort_on_old_node/1, sorter/3]). + +-include("test_server.hrl"). + +sorter(Receiver, Ref, List) -> + Receiver ! {Ref, lists:sort(List)}. + +sort_on_old_node(List) when is_list(List) -> + OldVersion = "r10", + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line {X, Y, Z} = now(), + ?line NodeName = list_to_atom(OldVersion + ++ "_" + ++ integer_to_list(X) + ++ integer_to_list(Y) + ++ integer_to_list(Z)), + ?line {ok, Node} = ?t:start_node(NodeName, + peer, + [{args, " -pa " ++ Pa}, + {erl, [{release, OldVersion++"b_patched"}]}]), + ?line Ref = make_ref(), + ?line spawn_link(Node, ?MODULE, sorter, [self(), Ref, List]), + ?line SortedPids = receive {Ref, SP} -> SP end, + ?line true = ?t:stop_node(Node), + ?line SortedPids. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/old_scheduler_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/old_scheduler_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/old_scheduler_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/old_scheduler_SUITE.erl 2009-09-18 15:08:49.000000000 +0100 @@ -0,0 +1,394 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(old_scheduler_SUITE). + +-include("test_server.hrl"). + +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). +-export([equal/1, many_low/1, few_low/1, max/1, high/1]). + +-define(default_timeout, ?t:minutes(11)). + +all(suite) -> + case catch erlang:system_info(modified_timing_level) of + Level when is_integer(Level) -> + {skipped, + "Modified timing (level " ++ integer_to_list(Level) + ++ ") is enabled. Testcases gets messed up by modfied " + "timing."}; + _ -> + [equal, many_low, few_low, max, high] + end. + +%%----------------------------------------------------------------------------------- +%% TEST SUITE DESCRIPTION +%% +%% The test case function spawns two controlling processes: Starter and Receiver. +%% Starter spawns a number of prio A and a number of prio B test processes. Each +%% test process loops for a number of times, sends a report to the Receiver, then +%% loops again. For each report, the Receiver increases a counter that corresponds +%% to the priority of the sender. After a certain amount of time, the Receiver +%% sends the collected data to the main test process and waits for the test case +%% to terminate. From this data, it's possible to calculate the average run time +%% relationship between the prio A and B test processes. +%% +%% Note that in order to be able to run tests with high or max prio test processes, +%% the main test process and the Receiver needs to run at max prio, or they will +%% be starved by the test processes. The controlling processes must not wait for +%% messages from a normal (or low) prio process while max or high prio test processes +%% are running (which happens e.g. if an io function is called). +%%----------------------------------------------------------------------------------- + +init_per_testcase(_Case, Config) -> + ?line Dog = test_server:timetrap(?default_timeout), + %% main test process needs max prio + ?line Prio = process_flag(priority, max), + ?line MS = erlang:system_flag(multi_scheduling, block), + [{prio,Prio},{watchdog,Dog},{multi_scheduling, MS}|Config]. + +fin_per_testcase(_Case, Config) -> + erlang:system_flag(multi_scheduling, unblock), + Dog=?config(watchdog, Config), + Prio=?config(prio, Config), + process_flag(priority, Prio), + test_server:timetrap_cancel(Dog), + ok. + +ok(Config) when is_list(Config) -> + case ?config(multi_scheduling, Config) of + blocked -> + {comment, + "Multi-scheduling blocked during test. This testcase was not " + "written to work with multiple schedulers."}; + _ -> ok + end. + +%% Run equal number of low and normal prio processes. + +equal(suite) -> []; +equal(doc) -> []; +equal(Config) when is_list(Config) -> + ?line Self = self(), + + %% specify number of test processes to run + Normal = {normal,500}, + Low = {low,500}, + + %% specify time of test (in seconds) + Time = 30, + + %% start controllers + ?line Receiver = + spawn(fun() -> receiver(now(), Time, Self, Normal, Low) end), + ?line Starter = + spawn(fun() -> starter(Normal, Low, Receiver) end), + + %% receive test data from Receiver + ?line {NRs,NAvg,LRs,LAvg,Ratio} = + receive + {Receiver,Res} -> Res + end, + + %% stop controllers and test processes + ?line exit(Starter, kill), + ?line exit(Receiver, kill), + + io:format("Reports: ~w normal (~w/proc), ~w low (~w/proc). Ratio: ~w~n", + [NRs,NAvg,LRs,LAvg,Ratio]), + + %% runtime ratio between normal and low should be ~8 + if Ratio < 7.5 ; Ratio > 8.5 -> + ?t:fail({bad_ratio,Ratio}); + true -> + ok(Config) + end. + + +%% Run many low and few normal prio processes. + +many_low(suite) -> []; +many_low(doc) -> []; +many_low(Config) when is_list(Config) -> + ?line Self = self(), + Normal = {normal,1}, + Low = {low,1000}, + + %% specify time of test (in seconds) + Time = 30, + + ?line Receiver = + spawn(fun() -> receiver(now(), Time, Self, Normal, Low) end), + ?line Starter = + spawn(fun() -> starter(Normal, Low, Receiver) end), + ?line {NRs,NAvg,LRs,LAvg,Ratio} = + receive + {Receiver,Res} -> Res + end, + ?line exit(Starter, kill), + ?line exit(Receiver, kill), + io:format("Reports: ~w normal (~w/proc), ~w low (~w/proc). Ratio: ~w~n", + [NRs,NAvg,LRs,LAvg,Ratio]), + if Ratio < 7.5 ; Ratio > 8.5 -> + ?t:fail({bad_ratio,Ratio}); + true -> + ok(Config) + end. + + +%% Run few low and many normal prio processes. + +few_low(suite) -> []; +few_low(doc) -> []; +few_low(Config) when is_list(Config) -> + ?line Self = self(), + Normal = {normal,1000}, + Low = {low,1}, + + %% specify time of test (in seconds) + Time = 30, + + ?line Receiver = + spawn(fun() -> receiver(now(), Time, Self, Normal, Low) end), + ?line Starter = + spawn(fun() -> starter(Normal, Low, Receiver) end), + ?line {NRs,NAvg,LRs,LAvg,Ratio} = + receive + {Receiver,Res} -> Res + end, + ?line exit(Starter, kill), + ?line exit(Receiver, kill), + io:format("Reports: ~w normal (~w/proc), ~w low (~w/proc). Ratio: ~w~n", + [NRs,NAvg,LRs,LAvg,Ratio]), + if Ratio < 7.0 ; Ratio > 8.5 -> + ?t:fail({bad_ratio,Ratio}); + true -> + ok(Config) + end. + + +%% Run max prio processes and verify they get at least as much +%% runtime as high, normal and low. + +max(suite) -> []; +max(doc) -> []; +max(Config) when is_list(Config) -> + max = process_flag(priority, max), % should already be max (init_per_tc) + ?line Self = self(), + Max = {max,2}, + High = {high,2}, + Normal = {normal,100}, + Low = {low,100}, + + %% specify time of test (in seconds) + Time = 30, + + ?line Receiver1 = + spawn(fun() -> receiver(now(), Time, Self, Max, High) end), + ?line Starter1 = + spawn(fun() -> starter(Max, High, Receiver1) end), + ?line {M1Rs,M1Avg,HRs,HAvg,Ratio1} = + receive + {Receiver1,Res1} -> Res1 + end, + ?line exit(Starter1, kill), + ?line exit(Receiver1, kill), + io:format("Reports: ~w max (~w/proc), ~w high (~w/proc). Ratio: ~w~n", + [M1Rs,M1Avg,HRs,HAvg,Ratio1]), + if Ratio1 < 1.0 -> + ?t:fail({bad_ratio,Ratio1}); + true -> + ok(Config) + end, + + ?line Receiver2 = + spawn(fun() -> receiver(now(), Time, Self, Max, Normal) end), + ?line Starter2 = + spawn(fun() -> starter(Max, Normal, Receiver2) end), + ?line {M2Rs,M2Avg,NRs,NAvg,Ratio2} = + receive + {Receiver2,Res2} -> Res2 + end, + ?line exit(Starter2, kill), + ?line exit(Receiver2, kill), + io:format("Reports: ~w max (~w/proc), ~w normal (~w/proc). Ratio: ~w~n", + [M2Rs,M2Avg,NRs,NAvg,Ratio2]), + if Ratio2 < 1.0 -> + ?t:fail({bad_ratio,Ratio2}); + true -> + ok + end, + + ?line Receiver3 = + spawn(fun() -> receiver(now(), Time, Self, Max, Low) end), + ?line Starter3 = + spawn(fun() -> starter(Max, Low, Receiver3) end), + ?line {M3Rs,M3Avg,LRs,LAvg,Ratio3} = + receive + {Receiver3,Res3} -> Res3 + end, + ?line exit(Starter3, kill), + ?line exit(Receiver3, kill), + io:format("Reports: ~w max (~w/proc), ~w low (~w/proc). Ratio: ~w~n", + [M3Rs,M3Avg,LRs,LAvg,Ratio3]), + if Ratio3 < 1.0 -> + ?t:fail({bad_ratio,Ratio3}); + true -> + ok(Config) + end. + + +%% Run high prio processes and verify they get at least as much +%% runtime as normal and low. + +high(suite) -> []; +high(doc) -> []; +high(Config) when is_list(Config) -> + max = process_flag(priority, max), % should already be max (init_per_tc) + ?line Self = self(), + High = {high,2}, + Normal = {normal,100}, + Low = {low,100}, + + %% specify time of test (in seconds) + Time = 30, + + ?line Receiver1 = + spawn(fun() -> receiver(now(), Time, Self, High, Normal) end), + ?line Starter1 = + spawn(fun() -> starter(High, Normal, Receiver1) end), + ?line {H1Rs,H1Avg,NRs,NAvg,Ratio1} = + receive + {Receiver1,Res1} -> Res1 + end, + ?line exit(Starter1, kill), + ?line exit(Receiver1, kill), + io:format("Reports: ~w high (~w/proc), ~w normal (~w/proc). Ratio: ~w~n", + [H1Rs,H1Avg,NRs,NAvg,Ratio1]), + if Ratio1 < 1.0 -> + ?t:fail({bad_ratio,Ratio1}); + true -> + ok + end, + + ?line Receiver2 = + spawn(fun() -> receiver(now(), Time, Self, High, Low) end), + ?line Starter2 = + spawn(fun() -> starter(High, Low, Receiver2) end), + ?line {H2Rs,H2Avg,LRs,LAvg,Ratio2} = + receive + {Receiver2,Res2} -> Res2 + end, + ?line exit(Starter2, kill), + ?line exit(Receiver2, kill), + io:format("Reports: ~w high (~w/proc), ~w low (~w/proc). Ratio: ~w~n", + [H2Rs,H2Avg,LRs,LAvg,Ratio2]), + if Ratio2 < 1.0 -> + ?t:fail({bad_ratio,Ratio2}); + true -> + ok(Config) + end. + + +%%----------------------------------------------------------------------------------- +%% Controller processes and help functions +%%----------------------------------------------------------------------------------- + +receiver(T0, TimeSec, Main, {P1,P1N}, {P2,P2N}) -> + %% prio should be max so that mailbox doesn't overflow + process_flag(priority, max), + receiver(T0, TimeSec*1000, Main, P1,P1N,0, P2,P2N,0, 100000). + +%% uncomment lines below to get life sign (debug) +receiver(T0, Time, Main, P1,P1N,P1Rs, P2,P2N,P2Rs, 0) -> +% T = elapsed_ms(T0, now()), +% erlang:display({round(T/1000),P1Rs,P2Rs}), + receiver(T0, Time, Main, P1,P1N,P1Rs, P2,P2N,P2Rs, 100000); + +receiver(T0, Time, Main, P1,P1N,P1Rs, P2,P2N,P2Rs, C) -> + Remain = Time - elapsed_ms(T0, now()), % test time remaining + Remain1 = if Remain < 0 -> + 0; + true -> + Remain + end, + {P1Rs1,P2Rs1} = + receive + {_Pid,P1} -> % report from a P1 process + {P1Rs+1,P2Rs}; + {_Pid,P2} -> % report from a P2 process + {P1Rs,P2Rs+1} + after Remain1 -> + {P1Rs,P2Rs} + end, + if Remain > 0 -> % keep going + receiver(T0, Time, Main, P1,P1N,P1Rs1, P2,P2N,P2Rs1, C-1); + true -> % finish + %% calculate results and send to main test process + P1Avg = P1Rs1/P1N, + P2Avg = P2Rs1/P2N, + Ratio = if P2Avg < 1.0 -> P1Avg; + true -> P1Avg/P2Avg + end, + Main ! {self(),{P1Rs1,round(P1Avg),P2Rs1,round(P2Avg),Ratio}}, + flush_loop() + end. + +starter({P1,P1N}, {P2,P2N}, Receiver) -> + %% start N1 processes with prio P1 + start_p(P1, P1N, Receiver), + %% start N2 processes with prio P2 + start_p(P2, P2N, Receiver), + erlang:display({started,P1N+P2N}), + flush_loop(). + +start_p(_, 0, _) -> + ok; +start_p(Prio, N, Receiver) -> + spawn_link(fun() -> p(Prio, Receiver) end), + start_p(Prio, N-1, Receiver). + +p(Prio, Receiver) -> + %% set process priority + process_flag(priority, Prio), + p_loop(0, Prio, Receiver). + +p_loop(100, Prio, Receiver) -> + receive after 0 -> ok end, + %% if Receiver gone, we're done + case is_process_alive(Receiver) of + false -> exit(bye); + true -> ok + end, + %% send report + Receiver ! {self(),Prio}, + p_loop(0, Prio, Receiver); + +p_loop(N, Prio, Receiver) -> + p_loop(N+1, Prio, Receiver). + + +flush_loop() -> + receive _ -> + ok + end, + flush_loop(). + +elapsed_ms({_MS0,S0,MuS0},{_MS1,S1,MuS1}) -> + round(((S1-S0)*1000)+((MuS1-MuS0)/1000)). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/op_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/op_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/op_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/op_SUITE.erl 2009-09-18 15:08:03.000000000 +0100 @@ -0,0 +1,368 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(op_SUITE). + +-include("test_server.hrl"). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + bsl_bsr/1,logical/1,t_not/1,relop_simple/1,relop/1,complex_relop/1]). + +-export([]). +-import(lists, [foldl/3,flatmap/2]). + +all(suite) -> + [bsl_bsr,logical,t_not,relop_simple,relop,complex_relop]. + +init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(3)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +%% Test the bsl and bsr operators. +bsl_bsr(Config) when is_list(Config) -> + Vs = [unvalue(V) || V <- [-16#8000009-2,-1,0,1,2,73,16#8000000,bad,[]]], + Cases = [{Op,X,Y} || Op <- ['bsr','bsl'], X <- Vs, Y <- Vs], + ?line run_test_module(Cases, false), + {comment,integer_to_list(length(Cases)) ++ " cases"}. + +logical(doc) -> "Test the logical operators and internal BIFs."; +logical(Config) when is_list(Config) -> + Vs0 = [true,false,bad], + Vs = [unvalue(V) || V <- Vs0], + Cases = [{Op,X,Y} || Op <- ['and','or','xor'], X <- Vs, Y <- Vs], + ?line run_test_module(Cases, false), + {comment,integer_to_list(length(Cases)) ++ " cases"}. + +t_not(doc) -> "Test the not operator and internal BIFs."; +t_not(Config) when is_list(Config) -> + ?line Cases = [{'not',unvalue(V)} || V <- [true,false,42,bad]], + ?line run_test_module(Cases, false), + {comment,integer_to_list(length(Cases)) ++ " cases"}. + +relop_simple(doc) -> "Test that simlpe relations between relation operators hold."; +relop_simple(Config) when is_list(Config) -> + Big1 = 19738924729729787487784874, + Big2 = 38374938373887374983978484, + F1 = float(Big1), + F2 = float(Big2), + T1 = erlang:make_tuple(3,87), + T2 = erlang:make_tuple(3,87), + Terms = [-F2,Big2,-F1,-Big1,-33,-33.0,0,0.0,42,42.0,Big1,F1,Big2,F2,a,b, + {T1,a},{T2,b},[T1,Big1],[T2,Big2]], + + ?line Combos = [{V1,V2} || V1 <- Terms, V2 <- Terms], + + lists:foreach(fun({A,B}) -> relop_simple_do(A,B) end, + Combos), + + repeat(fun() -> Size = random:uniform(100), + Rnd1 = make_rand_term(Size), + {Rnd2,0} = clone_and_mutate(Rnd1, random:uniform(Size)), + relop_simple_do(Rnd1,Rnd2) + end, + 1000), + ok. + +relop_simple_do(V1,V2) -> + %%io:format("compare ~p\n and ~p\n",[V1,V2]), + + L = V1 < V2, + ?line L = not (V1 >= V2), + ?line L = V2 > V1, + ?line L = not (V2 =< V1), + + G = V1 > V2, + ?line G = not (V1 =< V2), + ?line G = V2 < V1, + ?line G = not (V2 >= V1), + + ID = V1 =:= V2, + ?line ID = V2 =:= V1, + ?line ID = not (V1 =/= V2), + ?line ID = not (V2 =/= V1), + + EQ = V1 == V2, + ?line EQ = V2 == V1, + ?line EQ = not (V1 /= V2), + ?line EQ = not (V2 /= V1), + + ?line case {L, EQ, ID, G, cmp_emu(V1,V2)} of + { true, false, false, false, -1} -> ok; + {false, true, false, false, 0} -> ok; + {false, true, true, false, 0} -> ok; + {false, false, false, true, +1} -> ok + end. + +%% Emulate internal "cmp" +cmp_emu(A,B) when is_tuple(A), is_tuple(B) -> + SA = size(A), + SB = size(B), + if SA =:= SB -> cmp_emu(tuple_to_list(A),tuple_to_list(B)); + SA > SB -> +1; + SA < SB -> -1 + end; +cmp_emu([A|TA],[B|TB]) -> + case cmp_emu(A,B) of + 0 -> cmp_emu(TA,TB); + CMP -> CMP + end; +cmp_emu(A,B) -> + %% We cheat and use real "cmp" for the primitive types. + if A < B -> -1; + A > B -> +1; + true -> 0 + end. + +make_rand_term(1) -> + make_rand_term_single(); +make_rand_term(Arity) -> + case random:uniform(3) of + 1 -> + make_rand_list(Arity); + 2 -> + list_to_tuple(make_rand_list(Arity)); + 3 -> + {Car,Rest} = make_rand_term_rand_size(Arity), + [Car|make_rand_term(Rest)] + end. + +make_rand_term_single() -> + Range = 1 bsl random:uniform(200), + case random:uniform(12) of + 1 -> random; + 2 -> uniform; + 3 -> random:uniform(Range) - (Range div 2); + 4 -> Range * (random:uniform() - 0.5); + 5 -> 0; + 6 -> 0.0; + 7 -> make_ref(); + 8 -> self(); + 9 -> term_to_binary(random:uniform(Range)); + 10 -> fun(X) -> X*Range end; + 11 -> fun(X) -> X/Range end; + 12 -> [] + end. + +make_rand_term_rand_size(1) -> + {make_rand_term(1), 0}; +make_rand_term_rand_size(MaxArity) -> + Arity = random:uniform(MaxArity-1), + {make_rand_term(Arity), MaxArity-Arity}. + +make_rand_list(0) -> []; +make_rand_list(Arity) -> + {Term, Rest} = make_rand_term_rand_size(Arity), + [Term | make_rand_list(Rest)]. + + +clone_and_mutate(Term, 0) -> + {clone(Term), 0}; +clone_and_mutate(_Term, 1) -> + {Mutation, _} = make_rand_term_rand_size(10), % MUTATE! + {Mutation, 0}; +clone_and_mutate(Term, Cnt) when is_tuple(Term) -> + {Clone,NewCnt} = clone_and_mutate(tuple_to_list(Term),Cnt), + {my_list_to_tuple(Clone), NewCnt}; +clone_and_mutate([Term|Tail], Cnt) -> + {Car,Cnt1} = clone_and_mutate(Term,Cnt), + {Cdr,Cnt2} = clone_and_mutate(Tail,Cnt1), + {[Car | Cdr], Cnt2}; +clone_and_mutate(Term, Cnt) -> + {clone(Term), Cnt-1}. + +clone(Term) -> + binary_to_term(term_to_binary(Term)). + +my_list_to_tuple(List) -> + try list_to_tuple(List) + catch + error:badarg -> + %%io:format("my_list_to_tuple got badarg exception.\n"), + list_to_tuple(purify_list(List)) + end. + +purify_list(List) -> + lists:reverse(purify_list(List, [])). +purify_list([], Acc) -> Acc; +purify_list([H|T], Acc) -> purify_list(T, [H|Acc]); +purify_list(Other, Acc) -> [Other|Acc]. + + +relop(doc) -> "Test the relational operators and internal BIFs on literals."; +relop(Config) when is_list(Config) -> + Big1 = -38374938373887374983978484, + Big2 = 19738924729729787487784874, + F1 = float(Big1), + F2 = float(Big2), + Vs0 = [a,b,-33,-33.0,0,0.0,42,42.0,Big1,Big2,F1,F2], + ?line Vs = [unvalue(V) || V <- Vs0], + Ops = ['==', '/=', '=:=', '=/=', '<', '=<', '>', '>='], + ?line binop(Ops, Vs). + +complex_relop(doc) -> + "Test the relational operators and internal BIFs on lists and tuples."; +complex_relop(Config) when is_list(Config) -> + Big = 99678557475484872464269855544643333, + Float = float(Big), + Vs0 = [an_atom,42.0,42,Big,Float], + Vs = flatmap(fun(X) -> [unvalue({X}),unvalue([X])] end, Vs0), + Ops = ['==', '/=', '=:=', '=/=', '<', '=<', '>', '>='], + ?line binop(Ops, Vs). + +binop(Ops, Vs) -> + Run = fun(Op, N) -> ?line Cases = [{Op,V1,V2} || V1 <- Vs, V2 <- Vs], + ?line run_test_module(Cases, true), + N + length(Cases) end, + ?line NumCases = foldl(Run, 0, Ops), + {comment,integer_to_list(NumCases) ++ " cases"}. + +run_test_module(Cases, GuardsOk) -> + ?line Es = [expr(C) || C <- Cases], + ?line Ok = unvalue(ok), + ?line Gts = case GuardsOk of + true -> + Ges = [guard_expr(C) || C <- Cases], + ?line lists:foldr(fun guard_test/2, [Ok], Ges); + false -> + [Ok] + end, + ?line Fun1 = make_function(guard_tests, Gts), + ?line Bts = lists:foldr(fun body_test/2, [Ok], Es), + ?line Fun2 = make_function(body_tests, Bts), + ?line Bbts = lists:foldr(fun internal_bif/2, [Ok], Es), + ?line Fun3 = make_function(bif_tests, Bbts), + ?line Id = {function,1,id,1,[{clause,1,[{var,1,'I'}],[],[{var,1,'I'}]}]}, + ?line Module = make_module(op_tests, [Fun1,Fun2,Fun3,Id]), + ?line lists:foreach(fun(F) -> io:put_chars([erl_pp:form(F),"\n"]) end, Module), + + %% Compile, load, and run the generated module. + + Native = case ?t:is_native(?MODULE) of + true -> [native]; + false -> [] + end, + ?line {ok,Mod,Code1} = compile:forms(Module, [time|Native]), + ?line code:delete(Mod), + ?line code:purge(Mod), + ?line {module,Mod} = code:load_binary(Mod, Mod, Code1), + ?line run_function(Mod, guard_tests), + ?line run_function(Mod, body_tests), + ?line run_function(Mod, bif_tests), + + ?line true = code:delete(Mod), + ?line code:purge(Mod), + + ok. + +expr({Op,X}) -> + E = {op,1,Op,{call,1,{atom,1,id},[X]}}, + Res = eval([{op,1,Op,X}]), + {E,{Op,X},Res}; +expr({Op,X,Y}) -> + E = {op,1,Op,{call,1,{atom,1,id},[X]},Y}, + Res = eval([{op,1,Op,X,Y}]), + {E,{Op,value(X),value(Y)},Res}. + +guard_expr({Op,X}) -> + E = {op,1,Op,X}, + Res = eval([E]), + {E,{Op,X},Res}; +guard_expr({Op,X,Y}) -> + E = {op,1,Op,X,Y}, + Res = eval([E]), + {E,{Op,value(X),value(Y)},Res}. + +run_function(Mod, Name) -> + case catch Mod:Name() of + {'EXIT',Reason} -> + io:format("~p", [get(last)]), + ?t:fail({'EXIT',Reason}); + _Other -> + ok + end. + +guard_test({E,Expr,Res}, Tail) -> + True = unvalue(true), + [save_term(Expr), + {match,1,unvalue(Res), + {'if',1,[{clause,1,[],[[E]],[True]}, + {clause,1,[],[[True]],[unvalue(false)]}]}}|Tail]. + +body_test({E,Expr,{'EXIT',_}}, Tail) -> + [save_term(Expr), + {match,1,{tuple,1,[unvalue('EXIT'), {var,1,'_'}]}, + {'catch',1,E}}|Tail]; +body_test({E,Expr,Res}, Tail) -> + [save_term(Expr), + {match,1,unvalue(Res),E}|Tail]. + +internal_bif({{op,_,Op,X},Expr,Res}, Tail) -> + internal_bif(Op, [X], Expr, Res, Tail); +internal_bif({{op,_,Op,X,Y},Expr,Res}, Tail) -> + internal_bif(Op, [X,Y], Expr, Res, Tail). + +internal_bif(Op, Args, Expr, {'EXIT',_}, Tail) -> + [save_term(Expr), + {match,1,{tuple,1,[unvalue('EXIT'), {var,1,'_'}]}, + {'catch',1,{call,1,{remote,1,{atom,1,erlang},unvalue(Op)},Args}}}|Tail]; +internal_bif(Op, Args, Expr, Res, Tail) -> + [save_term(Expr), + {match,1,unvalue(Res), + {call,1,{remote,1,{atom,1,erlang},unvalue(Op)},Args}}|Tail]. + +save_term(Term) -> + {call,1, + {atom,1,put}, + [{atom,1,last},unvalue(Term)]}. + +make_module(Name, Funcs) -> + [{attribute,1,module,Name}, + {attribute,0,compile,export_all}, + {attribute,0,compile,[{hipe,[{regalloc,linear_scan}]}]} | + Funcs ++ [{eof,0}]]. + +make_function(Name, Body) -> + {function,1,Name,0,[{clause,1,[],[],Body}]}. + +eval(E) -> + ?line case catch erl_eval:exprs(E, []) of + {'EXIT',Reason} -> {'EXIT',Reason}; + {value,Val,_Bs} -> Val + end. + +unvalue(V) -> erl_parse:abstract(V). + +value({nil,_}) -> []; +value({integer,_,X}) -> X; +value({string,_,X}) -> X; +value({float,_,X}) -> X; +value({atom,_,X}) -> X; +value({tuple,_,Es}) -> + list_to_tuple(lists:map(fun(X) -> value(X) end, Es)); +value({cons,_,H,T}) -> + [value(H) | value(T)]. + +repeat(_, 0) -> ok; +repeat(Fun, N) -> + Fun(), + repeat(Fun, N-1). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_bif_SUITE_data/control_drv.c erlang-13.b.3-dfsg/erts/emulator/test/port_bif_SUITE_data/control_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/port_bif_SUITE_data/control_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_bif_SUITE_data/control_drv.c 2006-05-03 09:00:51.000000000 +0100 @@ -0,0 +1,84 @@ +#include +#include +#include "erl_driver.h" + + +static ErlDrvPort erlang_port; +static ErlDrvData control_start(ErlDrvPort, char*); +static void control_stop(ErlDrvData); +static void control_read(ErlDrvData, char*, int); +static int control_control(ErlDrvData, unsigned int, char*, int, char**, int); + +static ErlDrvEntry control_driver_entry = +{ + NULL, + control_start, + control_stop, + control_read, + NULL, + NULL, + "control_drv", + NULL, + NULL, + control_control, + NULL, + NULL, + NULL +}; + +DRIVER_INIT(control_drv) +{ + erlang_port = (ErlDrvPort)-1; + return &control_driver_entry; +} + +static ErlDrvData control_start(ErlDrvPort port,char *buf) +{ + if (erlang_port != (ErlDrvPort)-1) + return ERL_DRV_ERROR_GENERAL; + + erlang_port = port; + return (ErlDrvData)port; +} + +static void control_read(ErlDrvData port, char *buf, int count) +{ + driver_output(erlang_port, buf, count); +} + +static void control_stop(ErlDrvData port) +{ + erlang_port = (ErlDrvPort)-1; +} + +static int control_control(ErlDrvData port, unsigned command, char* buf, int count, + char** res, int res_size) +{ + switch (command) { + case 'e': + if (count > res_size) { + *res = (char *) driver_alloc(count); + } + memcpy(*res, buf, count); + return count; + case 'b': + set_busy_port(erlang_port, buf[0]); + return 0; + case 'i': + driver_output(erlang_port, buf, count); + return 0; + default: + if (command < 256) { + return -1; + } else { + char* p = *res; + int i; + + for (i = 3; i >= 0; i--) { + p[i] = command; + command >>= 8; + } + return 4; + } + } +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_bif_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/port_bif_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/port_bif_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_bif_SUITE_data/Makefile.src 1998-08-03 11:03:08.000000000 +0100 @@ -0,0 +1,14 @@ +CC = @CC@ +LD = @LD@ +CFLAGS = @CFLAGS@ -I@erl_include@ @DEFS@ +CROSSLDFLAGS = @CROSSLDFLAGS@ + +all: control_drv@dll@ port_test@exe@ + +port_test@exe@: port_test@obj@ + $(LD) $(CROSSLDFLAGS) -o port_test port_test@obj@ @LIBS@ + +port_test@obj@: port_test.c + $(CC) -c -o port_test@obj@ $(CFLAGS) port_test.c + +@SHLIB_RULES@ diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_bif_SUITE_data/port_test.c erlang-13.b.3-dfsg/erts/emulator/test/port_bif_SUITE_data/port_test.c --- erlang-13.b.1-dfsg/erts/emulator/test/port_bif_SUITE_data/port_test.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_bif_SUITE_data/port_test.c 2007-11-26 18:57:40.000000000 +0000 @@ -0,0 +1,602 @@ +/* + * Author: Bjorn Gustavsson + * Purpose: A port program to be used for testing the open_port bif. + */ + +#ifdef VXWORKS +#include +#include +#include +#include +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifndef __WIN32__ +#include + +#ifdef VXWORKS +#include "reclaim.h" +#include +#else +#include +#endif + +#define O_BINARY 0 +#define _setmode(fd, mode) +#endif + +#ifdef __WIN32__ +#include "windows.h" +#include "winbase.h" +#endif + + +#ifdef VXWORKS +#define REDIR_STDOUT(fd) ioTaskStdSet(0, 1, fd); +#else +#define REDIR_STDOUT(fd) if (dup2(fd, 1) == -1) { \ + fprintf(stderr, "%s: failed to duplicate handle %d to 1: %d\n", \ + port_data->progname, fd, errno); \ + exit(1); \ +} +#endif + +#ifdef VXWORKS +#define MAIN(argc, argv) port_test(argc, argv) +#else +#define MAIN(argc, argv) main(argc, argv) +#endif + + +extern int errno; + +typedef struct { + char* progname; /* Name of this program (from argv[0]). */ + int header_size; /* Number of bytes in each packet header: + * 1, 2, or 4, or 0 for a continous byte stream. */ + int fd_from_erl; /* File descriptor from Erlang. */ + int fd_to_erl; /* File descriptor to Erlang. */ + unsigned char* io_buf; /* Buffer for file i/o. */ + int io_buf_size; /* Current size of i/o buffer. */ + int delay_mode; /* If set, this program will wait 5 seconds + * after reading the header for a packet + * before reading the rest. + */ + int break_mode; /* If set, this program will close standard + * input, which should case broken pipe + * error in the writer. + */ + int quit_mode; /* If set, this program will exit + * just after reading the packet header. + */ + int slow_writes; /* Writes back the reply in chunks with + * sleeps in between. The value is the + * chunk size. If 0, normal writes are done. + */ + char* output_file; /* File into which the result will be written. */ + int no_packet_loop; /* No packet loop. */ + + int limited_bytecount; /* Only answer a limited number of bytes, then exit (stream mode) */ + +} PORT_TEST_DATA; + +PORT_TEST_DATA* port_data; + +static int packet_loop(); +static void reply(); +static void write_reply(); +static void ensure_buf_big_enough(); +static int readn(); +static void delay(unsigned ms); +static void dump(unsigned char* buf, int sz, int max); +static void replace_stdout(char* filename); +static void generate_reply(char* spec); + +#ifndef VXWORKS +#ifndef HAVE_STRERROR +extern int sys_nerr; +#ifndef sys_errlist /* sys_errlist is sometimes defined to + call a function on win32 */ +extern char *sys_errlist[]; +#endif + +char* +strerror(err) +int err; +{ + static char msgstr[1024]; + + if (err == 0) { + msgstr[0] = '\0'; + } else if (0 < err && err < sys_nerr) { + strcpy(msgstr, sys_errlist[err]); + } else { + sprintf(msgstr, "Unknown error %d", err); + } + return msgstr; +} +#endif +#endif + + +MAIN(argc, argv) +int argc; +char *argv[]; +{ + int ret; +#ifdef VXWORKS + if(taskVarAdd(0, (int *)&port_data) != OK) { + fprintf(stderr, "Can't do taskVarAdd in port_test\n"); + exit(1); + } +#endif + if((port_data = (PORT_TEST_DATA *) malloc(sizeof(PORT_TEST_DATA))) == NULL) { + fprintf(stderr, "Couldn't malloc for port_data"); + exit(1); + } + port_data->header_size = 0; + port_data->io_buf_size = 0; + port_data->delay_mode = 0; + port_data->break_mode = 0; + port_data->quit_mode = 0; + port_data->slow_writes = 0; + port_data->output_file = NULL; + port_data->no_packet_loop = 0; + + port_data->progname = argv[0]; + port_data->fd_from_erl = 0; + port_data->fd_to_erl = 1; + + port_data->limited_bytecount = 0; + + _setmode(0, _O_BINARY); + _setmode(1, _O_BINARY); + + while (argc > 1 && argv[1][0] == '-') { + switch (argv[1][1]) { + case 'b': /* Break mode. */ + port_data->break_mode = 1; + break; + case 'c': /* Close standard output. */ + close(port_data->fd_to_erl); + break; + case 'd': /* Delay mode. */ + port_data->delay_mode = 1; + break; + case 'n': /* No packet loop. */ + port_data->no_packet_loop = 1; + break; + case 'o': /* Output to file. */ + port_data->output_file = argv[1]+2; + break; + case 'q': /* Quit mode. */ + port_data->quit_mode = 1; + break; + case 'r': /* Generate reply. */ + generate_reply(argv[1]+2); + break; + case 's': /* Slow writes. */ + port_data->slow_writes = atoi(argv[1]+2); + break; + case 'h': /* Header size for packets. */ + switch (argv[1][2]) { + case '0': port_data->header_size = 0; break; + case '1': port_data->header_size = 1; break; + case '2': port_data->header_size = 2; break; + case '4': port_data->header_size = 4; break; + case '\0': + fprintf(stderr, "%s: missing header size for -h\n", port_data->progname); + return 1; + default: + fprintf(stderr, "%s: illegal packet header size: %c\n", + port_data->progname, argv[1][2]); + return 1; + } + break; + case 'e': + port_data->fd_to_erl = 2; + break; + case 'l': + port_data->limited_bytecount = atoi(argv[1]+2); + break; + default: + fprintf(stderr, "Unrecognized switch: %s\n", argv[1]); + free(port_data); + exit(1); + } + argc--, argv++; + } + + if (argc > 1) { + /* XXX Add error printout here */ + } + + if (port_data->no_packet_loop){ + free(port_data); + exit(0); + } + + /* + * If an output file was given, let it replace standard output. + */ + + if (port_data->output_file) + replace_stdout(port_data->output_file); + + ret = packet_loop(); + if(port_data->io_buf_size > 0) + free(port_data->io_buf); + free(port_data); + return ret; +} + +static int +packet_loop(void) +{ + int total_read = 0; + port_data->io_buf = (unsigned char*) malloc(1); /* Allocate once, so realloc works (SunOS) */ + + + for (;;) { + int packet_length; /* Length of current packet. */ + int i; + int bytes_read; /* Number of bytes read. */ + + /* + * Read the packet header, if any. + */ + + if (port_data->header_size == 0) { + if(port_data->limited_bytecount && + port_data->limited_bytecount - total_read < 4096) + packet_length = port_data->limited_bytecount - total_read; + else + packet_length = 4096; + } else { + ensure_buf_big_enough(port_data->header_size); + if (readn(port_data->fd_from_erl, port_data->io_buf, port_data->header_size) != port_data->header_size) { + return(1); + } + + /* + * Get the length of this packet. + */ + + packet_length = 0; + for (i = 0; i < port_data->header_size; i++) + packet_length = (packet_length << 8) | port_data->io_buf[i]; + } + + + /* + * Delay if delay mode. + */ + + if (port_data->delay_mode) { + delay(5000L); + } + + if (port_data->quit_mode) { + return(1); + } else if (port_data->break_mode) { + close(0); + delay(32000L); + return(1); + } + + /* + * Read the packet itself. + */ + + ensure_buf_big_enough(packet_length+4+1); /* At least five bytes. */ + port_data->io_buf[4] = '\0'; + if (port_data->header_size == 0) { + bytes_read = read(port_data->fd_from_erl, port_data->io_buf+4, packet_length); + if (bytes_read == 0) + return(1); + if (bytes_read < 0) { + fprintf(stderr, "Error reading %d bytes: %s\n", + packet_length, strerror(errno)); + return(1); + } + total_read += bytes_read; + } else { + bytes_read = readn(port_data->fd_from_erl, port_data->io_buf+4, packet_length); + if (bytes_read != packet_length) { + fprintf(stderr, "%s: couldn't read packet of length %d\r\n", + port_data->progname, packet_length); + return(1); + } + } + + /* + * Act on the command. + */ + if (port_data->header_size == 0) { + reply(port_data->io_buf+4, bytes_read); + if(port_data->limited_bytecount && + port_data->limited_bytecount <= total_read){ + delay(5000L); + return(0); + } + } else { + switch (port_data->io_buf[4]) { + case 'p': /* ping */ + port_data->io_buf[4] = 'P'; + reply(port_data->io_buf+4, bytes_read); + break; + case 'e': /* echo */ + reply(port_data->io_buf+4, bytes_read); + break; + default: + fprintf(stderr, "%s: bad packet of length %d received: ", + port_data->progname, bytes_read); + dump(port_data->io_buf+4, bytes_read, 10); + fprintf(stderr, "\r\n"); + return(1); + } + } + } +} + +/* + * Sends a packet back to Erlang. + */ + +static void +reply(buf, size) + char* buf; /* Buffer with reply. The four bytes before + * this pointer must be allocated so that + * this function can put the header there. + */ + int size; /* Size of buffer to send. */ +{ + int n; /* Temporary to hold size. */ + int i; /* Loop counter. */ + + /* + * Fill the header starting with the least significant byte + * (this will work even if there is no header). + */ + + n = size; + for (i = 0; i < port_data->header_size; i++) { + *--buf = (char) n; /* Store least significant byte. */ + n = n >> 8; + } + + size += port_data->header_size; + write_reply(buf, size); +} + + + +static void +write_reply(buf, size) + char* buf; /* Buffer with reply. Must contain header. */ + int size; /* Size of buffer to send. */ +{ + int n; /* Temporary to hold size. */ + + if (port_data->slow_writes <= 0) { /* Normal, "fast", write. */ + write(port_data->fd_to_erl, buf, size); + } else { + /* + * Write chunks with delays in between. + */ + + while (size > 0) { + n = size > port_data->slow_writes ? port_data->slow_writes : size; + write(port_data->fd_to_erl, buf, n); + size -= n; + buf += n; + if (size) + delay(500L); + } + } +} + + +/* + * Ensures that our I/O buffer is big enough for the packet to come. + */ + +static void +ensure_buf_big_enough(size) + int size; /* Needed size of buffer. */ +{ + if (port_data->io_buf_size >= size) + return; + + port_data->io_buf = (unsigned char*) realloc(port_data->io_buf, size); + if (port_data->io_buf == NULL) { + fprintf(stderr, "%s: insufficient memory for i/o buffer of size %d\n", + port_data->progname, size); + exit(1); + } + port_data->io_buf_size = size; +} + +/* + * Reads len number of bytes. + */ +static int +readn(fd, buf, len) + int fd; /* File descriptor to read from. */ + unsigned char *buf; /* Store in this buffer. */ + int len; /* Number of bytes to read. */ +{ + int n; /* Byte count in last read call. */ + int sofar; /* Bytes read so far. */ + + sofar = 0; + do { + if ((n = read(fd, buf+sofar, len-sofar)) <= 0) + /* error or EOF in read */ + return(n); + sofar += n; + } while (sofar < len); + return sofar; +} + +static void +replace_stdout(filename) +char* filename; /* Name of file to replace standard output. */ +{ + int fd; + + fd = open(filename, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0666); + if (fd == -1) { + fprintf(stderr, "%s: failed to open %s for writing: %d\n", + port_data->progname, filename, errno); + exit(1); + } + REDIR_STDOUT(fd); +} + +static void +dump(buf, sz, max) + unsigned char* buf; + int sz; + int max; +{ + int i, imax; + char comma[5]; + + comma[0] = ','; + comma[1] = '\0'; + if (!sz) + return; + if (sz > max) + imax = max; + else + imax = sz; + + for (i=0; i max) + strcpy(comma, ",..."); + else + comma[0] = 0; + } + if (isdigit(buf[i])) { + fprintf(stderr, "%u%s", (int)(buf[i]), comma); + } else { + if (isalpha(buf[i])) { + fprintf(stderr, "%c%s", buf[i], comma); + } + else { + fprintf(stderr, "%u%s", (int)(buf[i]), comma); + } + } + } +} + +/* + * Delays (sleeps) the given number of milli-seconds. + */ + +static void +delay(unsigned ms) +{ +#ifdef VXWORKS + taskDelay((sysClkRateGet() * ms) / 1000); +#else +#ifdef __WIN32__ + Sleep(ms); +#else + struct timeval t; + t.tv_sec = ms/1000; + t.tv_usec = (ms % 1000) * 1000; + + select(0, NULL, NULL, NULL, &t); +#endif +#endif +} + +/* + * Generates a reply buffer given the specification. + * + * ,,, + * + * Where: + * is + */ +static void +generate_reply(spec) +char* spec; /* Specification for reply. */ +{ + typedef struct item { + int start; /* Start character. */ + int incrementer; /* How much to increment. */ + size_t size; /* Size of reply buffer. */ + } Item; + + Item items[256]; + int last; + int cur; + size_t total_size; + char* buf; /* Reply buffer. */ + char* s; /* Current pointer into buffer. */ + int c; + + total_size = 0; + last = 0; + while (*spec) { + char* colon; + + items[last].incrementer = 1; + items[last].start = *spec++; + items[last].size = atoi(spec); + + total_size += port_data->header_size+items[last].size; + last++; + if ((colon = strchr(spec, ':')) == NULL) { + spec += strlen(spec); + } else { + *colon = '\0'; + spec = colon+1; + } + } + + buf = (char *) malloc(total_size); + if (buf == NULL) { + fprintf(stderr, "%s: insufficent memory for reply buffer of size %d\n", + port_data->progname, total_size); + exit(1); + } + + s = buf; + for (cur = 0; cur < last; cur++) { + int i; + size_t n; + + n = items[cur].size; + s += port_data->header_size; + for (i = 0; i < port_data->header_size; i++) { + *--s = (char) n; /* Store least significant byte. */ + n = n >> 8; + } + s += port_data->header_size; + + c = items[cur].start; + for (i = 0; i < items[cur].size; i++) { + *s++ = c; + c++; + if (c > 126) { + c = 33; + } + } + } + write_reply(buf, s-buf); +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_bif_SUITE_data/reclaim.h erlang-13.b.3-dfsg/erts/emulator/test/port_bif_SUITE_data/reclaim.h --- erlang-13.b.1-dfsg/erts/emulator/test/port_bif_SUITE_data/reclaim.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_bif_SUITE_data/reclaim.h 1998-05-04 16:28:34.000000000 +0100 @@ -0,0 +1,60 @@ +#ifndef __RECLAIM_H__ +#define __RECLAIM_H__ + + +/* The Erlang release for VxWorks includes a simple mechanism for + "resource reclamation" at task exit - it allows replacement of the + functions that open/close "files" and malloc/free memory with versions + that keep track, to be able to "reclaim" file descriptors and memory + when a task exits (regardless of *how* it exits). + + The interface to this mechanism is made available via this file, + with the following caveats: + + - The interface may change (or perhaps even be removed, though that + isn't likely until VxWorks itself provides similar functionality) + in future releases - i.e. you must always use the version of this + file that comes with the Erlang release you are using. + + - Disaster is guaranteed if you use the mechanism incorrectly (see + below for the correct way), e.g. allocate memory with the "tracking" + version of malloc() and free it with the "standard" version of free(). + + - The mechanism (of course) incurs some performance penalty - thus + for a simple program you may be better off with careful programming, + making sure that you do whatever close()/free()/etc calls that are + appropriate at all exit points (though if you need to guard against + taskDelete() etc, things get messy...). + + To use the mechanism, simply program your application normally, i.e. + use open()/close()/malloc()/free() etc as usual, but #include this + file before any usage of the relevant functions. NOTE: To avoid the + "disaster" mentioned above, you *must* #include it in *all* (or none) + of the files that manipulate a particular file descriptor, allocated + memory area, etc. Finally, note that you can obviously not load your + application before the Erlang system when using this interface. +*/ + +/* Sorry, no ANSI prototypes yet... */ +extern int save_open(),save_creat(),save_socket(),save_accept(),save_close(); +#define open save_open +#define creat save_creat +#define socket save_socket +#define accept save_accept +#define close save_close +extern FILE *save_fopen(), *save_fdopen(), *save_freopen(); +extern int save_fclose(); +#define fopen save_fopen +#define fdopen save_fdopen +#define freopen save_freopen +#define fclose save_fclose +/* XXX Should do opendir/closedir too... */ +extern char *save_malloc(), *save_calloc(), *save_realloc(); +extern void save_free(), save_cfree(); +#define malloc save_malloc +#define calloc save_calloc +#define realloc save_realloc +#define free save_free +#define cfree save_cfree + +#endif diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_bif_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/port_bif_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/port_bif_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_bif_SUITE.erl 2009-11-20 13:30:25.000000000 +0000 @@ -0,0 +1,446 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(port_bif_SUITE). + + +-export([all/1, command/1, command_e/1, + command_e_1/1, command_e_2/1, command_e_3/1, command_e_4/1, + port_info/1, port_info1/1, port_info2/1, + connect/1, control/1, echo_to_busy/1]). + +-export([do_command_e_1/1, do_command_e_2/1, do_command_e_4/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-include("test_server.hrl"). + +all(suite) -> + [command, port_info, connect, control, echo_to_busy]. + + +init_per_testcase(_Func, Config) when is_list(Config) -> + Dog=test_server:timetrap(test_server:minutes(10)), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Func, Config) when is_list(Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog). + +command(Config) when is_list(Config) -> + ?line load_control_drv(Config), + + ?line P = open_port({spawn, control_drv}, []), + ?line do_command(P, "hello"), + ?line do_command(P, <<"hello">>), + ?line do_command(P, sub_bin(<<"1234kalle">>)), + ?line do_command(P, unaligned_sub_bin(<<"blurf">>)), + ?line do_command(P, ["bl"|unaligned_sub_bin(<<"urf">>)]), + ?line true = erlang:port_close(P), + ok. + +do_command(P, Data) -> + true = erlang:port_command(P, Data), + receive + {P,{data,Data}} -> + ok; + {P,{data,Data0}} -> + case {list_to_binary(Data0),list_to_binary([Data])} of + {B,B} -> ok; + _ -> test_server:fail({unexpected_data,Data0}) + end; + Other -> + test_server:fail({unexpected_message,Other}) + end. + + +command_e(suite) -> [command_e_1, + command_e_2, + command_e_3, + command_e_4]; +command_e(doc) -> "Tests port_command/2 with errors". + +%% port_command/2: badarg 1st arg +command_e_1(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line Program = filename:join(DataDir, "port_test"), + + process_flag(trap_exit, true), + ?line _ = spawn_link(?MODULE, do_command_e_1, [Program]), + ?line receive + {'EXIT', Pid, {badarg, _}} when is_pid(Pid) -> + ok; + Other -> + ?line test_server:fail(Other) + after 10000 -> + ?line test_server:fail(timeout) + end, + ok. + +do_command_e_1(Program) -> + ?line _ = open_port({spawn, Program}, []), + ?line erlang:port_command(apple, "plock"), + exit(survived). + +%% port_command/2: badarg 2nd arg +command_e_2(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line Program = filename:join(DataDir, "port_test"), + + process_flag(trap_exit, true), + ?line _ = spawn_link(?MODULE, do_command_e_2, [Program]), + ?line receive + {'EXIT', Pid, {badarg, _}} when is_pid(Pid) -> + ok; + Other -> + ?line test_server:fail(Other) + after 10000 -> + ?line test_server:fail(timeout) + end, + ok. + +do_command_e_2(Program) -> + ?line P = open_port({spawn, Program}, []), + ?line erlang:port_command(P, 1), + exit(survived). + +%% port_command/2: Posix signals trapped +command_e_3(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line Program = filename:join(DataDir, "port_test"), + + process_flag(trap_exit, true), + ?line P = open_port({spawn, Program}, [{packet, 1}]), + ?line Data = lists:duplicate(257, $a), + ?line erlang:port_command(P, Data), + ?line receive + {'EXIT', Port, einval} when is_port(Port) -> + ok; + Other -> + test_server:fail(Other) + after 10000 -> + test_server:fail(timeout) + end, + ok. + +%% port_command/2: Posix exit signals not trapped +command_e_4(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line Program = filename:join(DataDir, "port_test"), + + process_flag(trap_exit, true), + ?line _ = spawn_link(?MODULE, do_command_e_4, [Program]), + ?line receive + {'EXIT', Pid, {einval, _}} when is_pid(Pid) -> + ok; + Other -> + ?line test_server:fail(Other) + after 10000 -> + ?line test_server:fail(timeout) + end, + ok. + +do_command_e_4(Program) -> + ?line P = open_port({spawn, Program}, [{packet, 1}]), + ?line Data = lists:duplicate(257, $a), + ?line erlang:port_command(P, Data), + exit(survived). + +port_info(suite) -> [port_info1, port_info2]. + +%% Tests the port_info/1 BIF +port_info1(Config) when is_list(Config) -> + ?line load_control_drv(Config), + Me=self(), + ?line P = open_port({spawn, control_drv}, []), + ?line A1 = erlang:port_info(P), + ?line false = lists:keysearch(registered_name, 1, A1), + ?line register(myport, P), + ?line A = erlang:port_info(P), + ?line {value,{registered_name,myport}}= + lists:keysearch(registered_name, 1, A), + ?line {value,{name,"control_drv"}}=lists:keysearch(name, 1, A), + ?line {value,{links,[Me]}}=lists:keysearch(links, 1, A), + ?line {value,{id,_IdNum}}=lists:keysearch(id, 1, A), + ?line {value,{connected,_}}=lists:keysearch(connected, 1, A), + ?line {value,{input,0}}=lists:keysearch(input, 1, A), + ?line {value,{output,0}}=lists:keysearch(output, 1, A), + ?line true=erlang:port_close(P), + ok. + +%% Tests erlang:port_info/2" +port_info2(Config) when is_list(Config) -> + ?line load_control_drv(Config), + + ?line P = open_port({spawn,control_drv}, [binary]), + ?line [] = erlang:port_info(P, registered_name), + ?line register(myport, P), + ?line {registered_name, myport} = erlang:port_info(P, registered_name), + + ?line {name, "control_drv"}=erlang:port_info(P, name), + ?line {id, _IdNum} = erlang:port_info(P, id), + Me=self(), + ?line {links, [Me]} = erlang:port_info(P, links), + ?line {connected, Me} = erlang:port_info(P, connected), + ?line {input, 0}=erlang:port_info(P, input), + ?line {output,0}=erlang:port_info(P, output), + + ?line erlang:port_control(P, $i, "abc"), + ?line receive + {P,{data,<<"abc">>}} -> ok + end, + ?line {input,3} = erlang:port_info(P, input), + ?line {output,0} = erlang:port_info(P, output), + + ?line Bin = list_to_binary(lists:duplicate(2047, 42)), + ?line output_test(P, Bin, 3, 0), + + ?line true = erlang:port_close(P), + ok. + +output_test(_, _, Input, Output) when Output > 16#1fffffff -> + io:format("~p bytes received\n", [Input]); +output_test(P, Bin, Input0, Output0) -> + erlang:port_command(P, Bin), + receive + {P,{data,Bin}} -> ok; + Other -> + io:format("~p", [Other]), + ?line ?t:fail() + end, + Input = Input0 + size(Bin), + Output = Output0 + size(Bin), + {input,Input} = erlang:port_info(P, input), + {output,Output} = erlang:port_info(P, output), + + %% We can't test much here, but hopefully a debug-built emulator will crasch + %% if there is something wrong with the heap allocation. + case erlang:statistics(io) of + {{input,In},{output,Out}} when is_integer(In), is_integer(Out) -> + ok + end, + output_test(P, Bin, Input, Output). + +%% Tests the port_connect/2 BIF. +connect(Config) when is_list(Config) -> + ?line load_control_drv(Config), + + ?line P = open_port({spawn, control_drv}, []), + register(myport, P), + + ?line true = erlang:port_connect(myport, self()), + + %% Connect the port to another process. + + Data = "hello, world", + Parent = self(), + ?line Rec = + fun(Me) -> receive + {P,{data,Data}} -> + Parent ! connect_ok, + Me(Me) + end + end, + ?line RecPid = spawn_link(fun() -> Rec(Rec) end), + ?line true = erlang:port_connect(P, RecPid), + ?line unlink(P), + + %% Send a command to the port and make sure that the + %% other process receives the echo. + + ?line erlang:port_command(P, Data), + ?line receive + connect_ok -> ok + end, + + %% Tests some errors. + + ?line {'EXIT',{badarg, _}}=(catch erlang:port_connect(self(), self())), + ?line {'EXIT',{badarg, _}}=(catch erlang:port_connect(self(), P)), + ?line {'EXIT',{badarg, _}}=(catch erlang:port_connect(P, P)), + ?line {'EXIT',{badarg, _}}=(catch erlang:port_connect(P, xxxx)), + ?line {'EXIT',{badarg, _}}=(catch erlang:port_connect(P, [])), + + ?line process_flag(trap_exit, true), + ?line exit(P, you_should_die), + ?line receive + {'EXIT',RecPid,you_should_die} -> ok; + Other -> ?line ?t:fail({bad_message,Other}) + end, + + %% Done. + ok. + +%% Tests port_control/3 +control(Config) when is_list(Config) -> + ?line load_control_drv(Config), + ?line P = open_port({spawn, control_drv}, []), + + %% Test invalid (out-of-range) arguments. + + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(self(), 1, [])), + + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, -1, [])), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, -34887348739733833, [])), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, 16#100000000, [])), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, a, [])), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, 'e', dum)), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, $e, dum)), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, $e, fun(X) -> X end)), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, $e, + [fun(X) -> X end])), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, $e, + [1|fun(X) -> X end])), + + %% Test errors detected by the driver. + + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, 177, [])), + ?line {'EXIT', {badarg, _}} = (catch erlang:port_control(P, 155, + random_packet(1024))), + + %% Test big op codes. + + register(myport, P), + ?line test_op(myport, 256), + ?line test_op(P, 256), + ?line test_op(P, 16#0033A837), + ?line test_op(P, 16#0ab37938), + ?line test_op(P, 16#eab37938), + ?line test_op(P, 16#ffffFFFF), + + %% Test the echo function of the driver. + + ?line echo(P, 0), + ?line echo(P, 1), + ?line echo(P, 10), + ?line echo(P, 13), + ?line echo(P, 63), + ?line echo(P, 64), + ?line echo(P, 65), + ?line echo(P, 127), + ?line echo(P, 1023), + ?line echo(P, 1024), + ?line echo(P, 11243), + ?line echo(P, 70000), + + %% Done. + + ?line true=erlang:port_close(myport), + ok. + +test_op(P, Op) -> + R = port_control(P, Op, []), + <> = list_to_binary(R). + +echo_to_busy(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line load_control_drv(Config), + ?line P = open_port({spawn, control_drv}, []), + ?line erlang:port_control(P, $b, [1]), % Set to busy. + Self = self(), + ?line Echoer = spawn(fun() -> echoer(P, Self) end), + ?line receive after 500 -> ok end, + ?line erlang:port_control(P, $b, [0]), % Set to not busy. + ?line receive + {Echoer, done} -> + ok; + {Echoer, Other} -> + test_server:fail(Other); + Other -> + test_server:fail({unexpected_message, Other}) + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +echoer(P, ReplyTo) -> + Msg = random_packet(73), + true = erlang:port_connect(P, self()), + erlang:port_command(P, Msg), + receive + {P, {data, Msg}} -> + ReplyTo ! {self(), done}; + Other -> + ReplyTo ! {self(), {bad_message, Other}} + end. + +echo(P, Size) -> + io:format("Echo test, size ~w", [Size]), + Packet = random_packet(Size), + Packet = erlang:port_control(P, $e, Packet), + Bin = list_to_binary(Packet), + Packet = erlang:port_control(P, $e, Bin), + Packet = erlang:port_control(P, $e, sub_bin(Bin)), + Packet = erlang:port_control(P, $e, unaligned_sub_bin(Bin)), + Packet = erlang:port_control(P, $e, [unaligned_sub_bin(Bin)]). + +load_control_drv(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line erl_ddll:start(), + ?line ok = load_driver(DataDir, "control_drv"). + +load_driver(Dir, Driver) -> + case erl_ddll:load_driver(Dir, Driver) of + ok -> ok; + {error, Error} = Res -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + Res + end. + +random_packet(Size) -> + random_packet(Size, "", random_char()). + +random_packet(0, Result, _NextChar) -> + Result; +random_packet(Left, Result, NextChar0) -> + NextChar = + if + NextChar0 >= 126 -> + 33; + true -> + NextChar0+1 + end, + random_packet(Left-1, [NextChar0|Result], NextChar). + +random_char() -> + random_char("abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789"). + +random_char(Chars) -> + lists:nth(uniform(length(Chars)), Chars). + +uniform(N) -> + case get(random_seed) of + undefined -> + {X, Y, Z} = time(), + random:seed(X, Y, Z); + _ -> + ok + end, + random:uniform(N). + +unaligned_sub_bin(Bin0) -> + Bin1 = <<0:3,Bin0/binary,31:5>>, + Sz = size(Bin0), + <<0:3,Bin:Sz/binary,31:5>> = id(Bin1), + Bin. + +sub_bin(Bin) when is_binary(Bin) -> + {_,B} = split_binary(list_to_binary([0,1,3,Bin]), 3), + B. + +id(I) -> I. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/dir/dummy erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/dir/dummy --- erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/dir/dummy 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/dir/dummy 1998-05-05 21:19:25.000000000 +0100 @@ -0,0 +1 @@ +Dumma WinZip!! diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/echo_args.c erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/echo_args.c --- erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/echo_args.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/echo_args.c 2009-06-05 13:54:22.000000000 +0100 @@ -0,0 +1,12 @@ +#include + +int main(int argc, char **argv) +{ + int i; + + for(i = 0; i < argc; ++i) { + printf("argv[%d]:|%s|\n",i,argv[i]); + } + return 0; +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/echo_drv.c erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/echo_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/echo_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/echo_drv.c 2009-06-05 13:53:27.000000000 +0100 @@ -0,0 +1,85 @@ +#include +#include "erl_driver.h" + + + +/* ------------------------------------------------------------------------- +** Data types +**/ + +typedef struct _erl_drv_data EchoDrvData; + + + +/* ------------------------------------------------------------------------- +** Entry struct +**/ + +static EchoDrvData *echo_drv_start(ErlDrvPort port, char *command); +static void echo_drv_stop(EchoDrvData *data_p); +static void echo_drv_output(EchoDrvData *data_p, char *buf, int len); +static void echo_drv_finish(void); +static int echo_drv_control(EchoDrvData *data_p, unsigned int command, + char *buf, int len, + char **rbuf, int rlen); + +static ErlDrvEntry echo_drv_entry = { + NULL, /* init */ + echo_drv_start, + echo_drv_stop, + echo_drv_output, + NULL, /* ready_input */ + NULL, /* ready_output */ + "echo_drv", + echo_drv_finish, + NULL, /* handle */ + echo_drv_control, + NULL, /* timeout */ + NULL, /* outputv */ + NULL /* ready_async */ +}; + + + +/* ------------------------------------------------------------------------- +** Entry functions +**/ + +DRIVER_INIT(echo_drv) +{ + return &echo_drv_entry; +} + +static EchoDrvData *echo_drv_start(ErlDrvPort port, char *command) { + void *void_ptr; + int res = -4711; + if (command) { + while(*command != '\0' && *command != ' ') + ++command; + while(*command != '\0' && *command == ' ') + ++command; + if(*command == '-') { + res = driver_output(port, command+1, strlen(command) - 1); + } + } + return void_ptr = port; +} + +static void echo_drv_stop(EchoDrvData *data_p) { +} + +static void echo_drv_output(EchoDrvData *data_p, char *buf, int len) { + void *void_ptr; + ErlDrvPort port = void_ptr = data_p; + + driver_output(port, buf, len); +} + +static void echo_drv_finish() { +} + +static int echo_drv_control(EchoDrvData *data_p, unsigned int command, + char *buf, int len, + char **rbuf, int rlen) { + return 0; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/exit_drv.c erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/exit_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/exit_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/exit_drv.c 2004-09-14 12:57:38.000000000 +0100 @@ -0,0 +1,68 @@ +#include +#include "erl_driver.h" + +typedef struct _erl_drv_data ExitDrvData; + +static ExitDrvData *exit_drv_start(ErlDrvPort port, char *command); +static void exit_drv_stop(ExitDrvData *data_p); +static void exit_drv_output(ExitDrvData *data_p, char *buf, int len); +static void exit_drv_finish(void); +static int exit_drv_control(ExitDrvData *data_p, unsigned int command, + char *buf, int len, + char **rbuf, int rlen); + +static ErlDrvEntry exit_drv_entry = { + NULL, /* init */ + exit_drv_start, + exit_drv_stop, + exit_drv_output, + NULL, /* ready_input */ + NULL, /* ready_output */ + "exit_drv", + exit_drv_finish, + NULL, /* handle */ + exit_drv_control, + NULL, /* timeout */ + NULL, /* outputv */ + NULL /* ready_async */ +}; + +DRIVER_INIT(exit_drv) +{ + return &exit_drv_entry; +} + +static ExitDrvData * +exit_drv_start(ErlDrvPort port, char *command) +{ + return (ExitDrvData *) port; +} + +static void +exit_drv_stop(ExitDrvData *datap) +{ + +} + +static void +exit_drv_output(ExitDrvData *datap, char *buf, int len) +{ + driver_exit((ErlDrvPort) datap, 0); +} + +static void +exit_drv_finish(void) +{ + +} + +static int +exit_drv_control(ExitDrvData *datap, + unsigned int command, + char *buf, + int len, + char **rbuf, + int rlen) +{ + return 0; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/failure_drv.c erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/failure_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/failure_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/failure_drv.c 2007-11-26 19:01:07.000000000 +0000 @@ -0,0 +1,63 @@ +#include +#include "erl_driver.h" + +typedef struct _erl_drv_data FailureDrvData; + +static FailureDrvData *failure_drv_start(ErlDrvPort, char *); +static void failure_drv_stop(FailureDrvData *); +static void failure_drv_output(FailureDrvData *, char *, int); +static void failure_drv_finish(void); +static int failure_drv_control(FailureDrvData *, unsigned int, + char *, int, char **, int); + +static ErlDrvEntry failure_drv_entry = { + NULL, /* init */ + failure_drv_start, + failure_drv_stop, + failure_drv_output, + NULL, /* ready_input */ + NULL, /* ready_output */ + "failure_drv", + failure_drv_finish, + NULL, /* handle */ + failure_drv_control, + NULL, /* timeout */ + NULL, /* outputv */ + NULL /* ready_async */ +}; + + + +/* ------------------------------------------------------------------------- +** Entry functions +**/ + +DRIVER_INIT(failure_drv) +{ + return &failure_drv_entry; +} + +static FailureDrvData *failure_drv_start(ErlDrvPort port, char *command) { + void *void_ptr; + + return void_ptr = port; +} + +static void failure_drv_stop(FailureDrvData *data_p) { +} + +static void failure_drv_output(FailureDrvData *data_p, char *buf, int len) { + void *void_ptr; + ErlDrvPort port = void_ptr = data_p; + + driver_failure_atom(port, "driver_failed"); +} + +static void failure_drv_finish() { +} + +static int failure_drv_control(FailureDrvData *data_p, unsigned int command, + char *buf, int len, + char **rbuf, int rlen) { + return 0; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/Makefile.src 2009-06-05 13:53:09.000000000 +0100 @@ -0,0 +1,26 @@ +CC = @CC@ +LD = @LD@ +CFLAGS = @CFLAGS@ -I@erl_include@ @DEFS@ +CROSSLDFLAGS = @CROSSLDFLAGS@ + +PROGS = port_test@exe@ echo_args@exe@ +DRIVERS = echo_drv@dll@ exit_drv@dll@ failure_drv@dll@ + +all: $(PROGS) $(DRIVERS) port_test.@EMULATOR@ + +port_test@exe@: port_test@obj@ + $(LD) $(CROSSLDFLAGS) -o port_test port_test@obj@ @LIBS@ + +port_test@obj@: port_test.c + $(CC) -c -o port_test@obj@ $(CFLAGS) port_test.c + +echo_args@exe@: echo_args@obj@ + $(LD) $(CROSSLDFLAGS) -o echo_args echo_args@obj@ @LIBS@ + +echo_args@obj@: echo_args.c + $(CC) -c -o echo_args@obj@ $(CFLAGS) echo_args.c + +port_test.@EMULATOR@: port_test.erl + @erl_name@ -compile port_test + +@SHLIB_RULES@ diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/port_test.c erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/port_test.c --- erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/port_test.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/port_test.c 2007-11-26 18:56:40.000000000 +0000 @@ -0,0 +1,605 @@ +/* + * Author: Bjorn Gustavsson + * Purpose: A port program to be used for testing the open_port bif. + */ + +#ifdef VXWORKS +#include +#include +#include +#include +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifndef __WIN32__ +#include + +#ifdef VXWORKS +#include "reclaim.h" +#include +#else +#include +#endif + +#define O_BINARY 0 +#define _setmode(fd, mode) +#endif + +#ifdef __WIN32__ +#include "windows.h" +#include "winbase.h" +#endif + + +#ifdef VXWORKS +#define REDIR_STDOUT(fd) ioTaskStdSet(0, 1, fd); +#else +#define REDIR_STDOUT(fd) if (dup2(fd, 1) == -1) { \ + fprintf(stderr, "%s: failed to duplicate handle %d to 1: %d\n", \ + port_data->progname, fd, errno); \ + exit(1); \ +} +#endif + +#ifdef VXWORKS +#define MAIN(argc, argv) port_test(argc, argv) +#else +#define MAIN(argc, argv) main(argc, argv) +#endif + + +extern int errno; + +typedef struct { + char* progname; /* Name of this program (from argv[0]). */ + int header_size; /* Number of bytes in each packet header: + * 1, 2, or 4, or 0 for a continous byte stream. */ + int fd_from_erl; /* File descriptor from Erlang. */ + int fd_to_erl; /* File descriptor to Erlang. */ + unsigned char* io_buf; /* Buffer for file i/o. */ + int io_buf_size; /* Current size of i/o buffer. */ + int delay_mode; /* If set, this program will wait 5 seconds + * after reading the header for a packet + * before reading the rest. + */ + int break_mode; /* If set, this program will close standard + * input, which should case broken pipe + * error in the writer. + */ + int quit_mode; /* If set, this program will exit + * just after reading the packet header. + */ + int slow_writes; /* Writes back the reply in chunks with + * sleeps in between. The value is the + * chunk size. If 0, normal writes are done. + */ + char* output_file; /* File into which the result will be written. */ + int no_packet_loop; /* No packet loop. */ + + int limited_bytecount; /* Only answer a limited number of bytes, then exit (stream mode) */ + +} PORT_TEST_DATA; + +PORT_TEST_DATA* port_data; + +static int packet_loop(); +static void reply(); +static void write_reply(); +static void ensure_buf_big_enough(); +static int readn(); +static void delay(unsigned ms); +static void dump(unsigned char* buf, int sz, int max); +static void replace_stdout(char* filename); +static void generate_reply(char* spec); + +#ifndef VXWORKS +#ifndef HAVE_STRERROR +extern int sys_nerr; +#ifndef sys_errlist /* sys_errlist is sometimes defined to + call a function on win32 */ +extern char *sys_errlist[]; +#endif + +char* +strerror(err) +int err; +{ + static char msgstr[1024]; + + if (err == 0) { + msgstr[0] = '\0'; + } else if (0 < err && err < sys_nerr) { + strcpy(msgstr, sys_errlist[err]); + } else { + sprintf(msgstr, "Unknown error %d", err); + } + return msgstr; +} +#endif +#endif + + +MAIN(argc, argv) +int argc; +char *argv[]; +{ + int ret; +#ifdef VXWORKS + if(taskVarAdd(0, (int *)&port_data) != OK) { + fprintf(stderr, "Can't do taskVarAdd in port_test\n"); + exit(1); + } +#endif + if((port_data = (PORT_TEST_DATA *) malloc(sizeof(PORT_TEST_DATA))) == NULL) { + fprintf(stderr, "Couldn't malloc for port_data"); + exit(1); + } + port_data->header_size = 0; + port_data->io_buf_size = 0; + port_data->delay_mode = 0; + port_data->break_mode = 0; + port_data->quit_mode = 0; + port_data->slow_writes = 0; + port_data->output_file = NULL; + port_data->no_packet_loop = 0; + + port_data->progname = argv[0]; + port_data->fd_from_erl = 0; + port_data->fd_to_erl = 1; + + port_data->limited_bytecount = 0; + + _setmode(0, _O_BINARY); + _setmode(1, _O_BINARY); + + while (argc > 1 && argv[1][0] == '-') { + switch (argv[1][1]) { + case 'b': /* Break mode. */ + port_data->break_mode = 1; + break; + case 'c': /* Close standard output. */ + close(port_data->fd_to_erl); + break; + case 'd': /* Delay mode. */ + port_data->delay_mode = 1; + break; + case 'e': + port_data->fd_to_erl = 2; + break; + case 'h': /* Header size for packets. */ + switch (argv[1][2]) { + case '0': port_data->header_size = 0; break; + case '1': port_data->header_size = 1; break; + case '2': port_data->header_size = 2; break; + case '4': port_data->header_size = 4; break; + case '\0': + fprintf(stderr, "%s: missing header size for -h\n", port_data->progname); + return 1; + default: + fprintf(stderr, "%s: illegal packet header size: %c\n", + port_data->progname, argv[1][2]); + return 1; + } + break; + case 'l': + port_data->limited_bytecount = atoi(argv[1]+2); + break; + case 'n': /* No packet loop. */ + port_data->no_packet_loop = 1; + break; + case 'o': /* Output to file. */ + port_data->output_file = argv[1]+2; + break; + case 'q': /* Quit mode. */ + port_data->quit_mode = 1; + break; + case 'r': /* Generate reply. */ + generate_reply(argv[1]+2); + break; + case 's': /* Slow writes. */ + port_data->slow_writes = atoi(argv[1]+2); + break; + default: + fprintf(stderr, "Unrecognized switch: %s\n", argv[1]); + free(port_data); + exit(1); + } + argc--, argv++; + } + + if (argc > 1) { + /* XXX Add error printout here */ + } + + if (port_data->no_packet_loop){ + free(port_data); + exit(0); + } + + /* + * If an output file was given, let it replace standard output. + */ + + if (port_data->output_file) + replace_stdout(port_data->output_file); + + ret = packet_loop(); + if(port_data->io_buf_size > 0) + free(port_data->io_buf); + free(port_data); + return ret; +} + +static int +packet_loop(void) +{ + int total_read = 0; + port_data->io_buf = (unsigned char*) malloc(1); /* Allocate once, so realloc works (SunOS) */ + + + for (;;) { + int packet_length; /* Length of current packet. */ + int i; + int bytes_read; /* Number of bytes read. */ + + /* + * Read the packet header, if any. + */ + + if (port_data->header_size == 0) { + if(port_data->limited_bytecount && + port_data->limited_bytecount - total_read < 4096) + packet_length = port_data->limited_bytecount - total_read; + else + packet_length = 4096; + } else { + ensure_buf_big_enough(port_data->header_size); + if (readn(port_data->fd_from_erl, port_data->io_buf, port_data->header_size) != port_data->header_size) { + return(1); + } + + /* + * Get the length of this packet. + */ + + packet_length = 0; + for (i = 0; i < port_data->header_size; i++) + packet_length = (packet_length << 8) | port_data->io_buf[i]; + } + + + /* + * Delay if delay mode. + */ + + if (port_data->delay_mode) { + delay(5000L); + } + + if (port_data->quit_mode) { + return(1); + } else if (port_data->break_mode) { + close(0); + delay(32000L); + return(1); + } + + /* + * Read the packet itself. + */ + + ensure_buf_big_enough(packet_length+4+1); /* At least five bytes. */ + port_data->io_buf[4] = '\0'; + if (port_data->header_size == 0) { + bytes_read = read(port_data->fd_from_erl, port_data->io_buf+4, packet_length); + if (bytes_read == 0) + return(1); + if (bytes_read < 0) { + fprintf(stderr, "Error reading %d bytes: %s\n", + packet_length, strerror(errno)); + return(1); + } + total_read += bytes_read; + } else { + bytes_read = readn(port_data->fd_from_erl, port_data->io_buf+4, packet_length); + if (bytes_read != packet_length) { + fprintf(stderr, "%s: couldn't read packet of length %d\r\n", + port_data->progname, packet_length); + return(1); + } + } + + /* + * Act on the command. + */ + if (port_data->header_size == 0) { + reply(port_data->io_buf+4, bytes_read); + if(port_data->limited_bytecount && + port_data->limited_bytecount <= total_read){ + delay(5000L); + return(0); + } + } else { + switch (port_data->io_buf[4]) { + case 'p': /* ping */ + port_data->io_buf[4] = 'P'; + reply(port_data->io_buf+4, bytes_read); + break; + case 'e': /* echo */ + reply(port_data->io_buf+4, bytes_read); + break; + case 'x': /* exit */ + return(5); + break; + default: + fprintf(stderr, "%s: bad packet of length %d received: ", + port_data->progname, bytes_read); + dump(port_data->io_buf+4, bytes_read, 10); + fprintf(stderr, "\r\n"); + return(1); + } + } + } +} + +/* + * Sends a packet back to Erlang. + */ + +static void +reply(buf, size) + char* buf; /* Buffer with reply. The four bytes before + * this pointer must be allocated so that + * this function can put the header there. + */ + int size; /* Size of buffer to send. */ +{ + int n; /* Temporary to hold size. */ + int i; /* Loop counter. */ + + /* + * Fill the header starting with the least significant byte + * (this will work even if there is no header). + */ + + n = size; + for (i = 0; i < port_data->header_size; i++) { + *--buf = (char) n; /* Store least significant byte. */ + n = n >> 8; + } + + size += port_data->header_size; + write_reply(buf, size); +} + + + +static void +write_reply(buf, size) + char* buf; /* Buffer with reply. Must contain header. */ + int size; /* Size of buffer to send. */ +{ + int n; /* Temporary to hold size. */ + + if (port_data->slow_writes <= 0) { /* Normal, "fast", write. */ + write(port_data->fd_to_erl, buf, size); + } else { + /* + * Write chunks with delays in between. + */ + + while (size > 0) { + n = size > port_data->slow_writes ? port_data->slow_writes : size; + write(port_data->fd_to_erl, buf, n); + size -= n; + buf += n; + if (size) + delay(500L); + } + } +} + + +/* + * Ensures that our I/O buffer is big enough for the packet to come. + */ + +static void +ensure_buf_big_enough(size) + int size; /* Needed size of buffer. */ +{ + if (port_data->io_buf_size >= size) + return; + + port_data->io_buf = (unsigned char*) realloc(port_data->io_buf, size); + if (port_data->io_buf == NULL) { + fprintf(stderr, "%s: insufficient memory for i/o buffer of size %d\n", + port_data->progname, size); + exit(1); + } + port_data->io_buf_size = size; +} + +/* + * Reads len number of bytes. + */ +static int +readn(fd, buf, len) + int fd; /* File descriptor to read from. */ + unsigned char *buf; /* Store in this buffer. */ + int len; /* Number of bytes to read. */ +{ + int n; /* Byte count in last read call. */ + int sofar; /* Bytes read so far. */ + + sofar = 0; + do { + if ((n = read(fd, buf+sofar, len-sofar)) <= 0) + /* error or EOF in read */ + return(n); + sofar += n; + } while (sofar < len); + return sofar; +} + +static void +replace_stdout(filename) +char* filename; /* Name of file to replace standard output. */ +{ + int fd; + + fd = open(filename, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0666); + if (fd == -1) { + fprintf(stderr, "%s: failed to open %s for writing: %d\n", + port_data->progname, filename, errno); + exit(1); + } + REDIR_STDOUT(fd); +} + +static void +dump(buf, sz, max) + unsigned char* buf; + int sz; + int max; +{ + int i, imax; + char comma[5]; + + comma[0] = ','; + comma[1] = '\0'; + if (!sz) + return; + if (sz > max) + imax = max; + else + imax = sz; + + for (i=0; i max) + strcpy(comma, ",..."); + else + comma[0] = 0; + } + if (isdigit(buf[i])) { + fprintf(stderr, "%u%s", (int)(buf[i]), comma); + } else { + if (isalpha(buf[i])) { + fprintf(stderr, "%c%s", buf[i], comma); + } + else { + fprintf(stderr, "%u%s", (int)(buf[i]), comma); + } + } + } +} + +/* + * Delays (sleeps) the given number of milli-seconds. + */ + +static void +delay(unsigned ms) +{ +#ifdef VXWORKS + taskDelay((sysClkRateGet() * ms) / 1000); +#else +#ifdef __WIN32__ + Sleep(ms); +#else + struct timeval t; + t.tv_sec = ms/1000; + t.tv_usec = (ms % 1000) * 1000; + + select(0, NULL, NULL, NULL, &t); +#endif +#endif +} + +/* + * Generates a reply buffer given the specification. + * + * ,,, + * + * Where: + * is + */ +static void +generate_reply(spec) +char* spec; /* Specification for reply. */ +{ + typedef struct item { + int start; /* Start character. */ + int incrementer; /* How much to increment. */ + size_t size; /* Size of reply buffer. */ + } Item; + + Item items[256]; + int last; + int cur; + size_t total_size; + char* buf; /* Reply buffer. */ + char* s; /* Current pointer into buffer. */ + int c; + + total_size = 0; + last = 0; + while (*spec) { + char* colon; + + items[last].incrementer = 1; + items[last].start = *spec++; + items[last].size = atoi(spec); + + total_size += port_data->header_size+items[last].size; + last++; + if ((colon = strchr(spec, ':')) == NULL) { + spec += strlen(spec); + } else { + *colon = '\0'; + spec = colon+1; + } + } + + buf = (char *) malloc(total_size); + if (buf == NULL) { + fprintf(stderr, "%s: insufficent memory for reply buffer of size %d\n", + port_data->progname, total_size); + exit(1); + } + + s = buf; + for (cur = 0; cur < last; cur++) { + int i; + size_t n; + + n = items[cur].size; + s += port_data->header_size; + for (i = 0; i < port_data->header_size; i++) { + *--s = (char) n; /* Store least significant byte. */ + n = n >> 8; + } + s += port_data->header_size; + + c = items[cur].start; + for (i = 0; i < items[cur].size; i++) { + *s++ = c; + c++; + if (c > 126) { + c = 33; + } + } + } + write_reply(buf, s-buf); +} + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/port_test.erl erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/port_test.erl --- erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/port_test.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/port_test.erl 2009-11-20 13:30:37.000000000 +0000 @@ -0,0 +1,36 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(port_test). + +-export([env/1, pwd/0]). + +env([A]) -> + Var = atom_to_list(A), + Val = os:getenv(Var), + case Val of + false -> + io:format("0~n"); + _ -> + io:format("1~s~n", [Val]) + end. + +pwd() -> + {ok, Pwd} = file:get_cwd(), + io:format("~s~n", [Pwd]). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/reclaim.h erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/reclaim.h --- erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE_data/reclaim.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE_data/reclaim.h 1997-11-09 23:02:58.000000000 +0000 @@ -0,0 +1,60 @@ +#ifndef __RECLAIM_H__ +#define __RECLAIM_H__ + + +/* The Erlang release for VxWorks includes a simple mechanism for + "resource reclamation" at task exit - it allows replacement of the + functions that open/close "files" and malloc/free memory with versions + that keep track, to be able to "reclaim" file descriptors and memory + when a task exits (regardless of *how* it exits). + + The interface to this mechanism is made available via this file, + with the following caveats: + + - The interface may change (or perhaps even be removed, though that + isn't likely until VxWorks itself provides similar functionality) + in future releases - i.e. you must always use the version of this + file that comes with the Erlang release you are using. + + - Disaster is guaranteed if you use the mechanism incorrectly (see + below for the correct way), e.g. allocate memory with the "tracking" + version of malloc() and free it with the "standard" version of free(). + + - The mechanism (of course) incurs some performance penalty - thus + for a simple program you may be better off with careful programming, + making sure that you do whatever close()/free()/etc calls that are + appropriate at all exit points (though if you need to guard against + taskDelete() etc, things get messy...). + + To use the mechanism, simply program your application normally, i.e. + use open()/close()/malloc()/free() etc as usual, but #include this + file before any usage of the relevant functions. NOTE: To avoid the + "disaster" mentioned above, you *must* #include it in *all* (or none) + of the files that manipulate a particular file descriptor, allocated + memory area, etc. Finally, note that you can obviously not load your + application before the Erlang system when using this interface. +*/ + +/* Sorry, no ANSI prototypes yet... */ +extern int save_open(),save_creat(),save_socket(),save_accept(),save_close(); +#define open save_open +#define creat save_creat +#define socket save_socket +#define accept save_accept +#define close save_close +extern FILE *save_fopen(), *save_fdopen(), *save_freopen(); +extern int save_fclose(); +#define fopen save_fopen +#define fdopen save_fdopen +#define freopen save_freopen +#define fclose save_fclose +/* XXX Should do opendir/closedir too... */ +extern char *save_malloc(), *save_calloc(), *save_realloc(); +extern void save_free(), save_cfree(); +#define malloc save_malloc +#define calloc save_calloc +#define realloc save_realloc +#define free save_free +#define cfree save_cfree + +#endif diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/port_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/port_SUITE.erl 2009-11-20 13:30:06.000000000 +0000 @@ -0,0 +1,2288 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(port_SUITE). + +%%% +%%% Author: Bjorn Gustavsson; iter_max_ports contributed by Peter Hogfeldt. +%%% + +%% +%% There are a lot of things to test with open_port(Name, Settings). +%% +%% Name can be +%% +%% {spawn, Command} +%% which according to The Book and the manual page starts an +%% external program. That is not true. It might very well be +%% a linked-in program (the notion of 'linked-in driver' is +%% silly, since any driver is 'linked-in'). +%% [Spawn of external program is tested.] +%% +%% Atom +%% Read all contents of Atom, or write to it. +%% +%% {fd, In, Out} +%% Open file descriptors In and Out. [Not tested] +%% +%% PortSettings can be +%% +%% {packet, N} +%% N is 1, 2 or 4. +%% +%% stream (default) +%% Without packet length. +%% +%% use_stdio (default for spawned ports) +%% The spawned process use file descriptors 0 and 1 for I/O. +%% +%% nouse_stdio [Not tested] +%% Use filedescriptors 3 and 4. This option is probably only +%% meaningful on Unix. +%% +%% in (default for Atom) +%% Input only (from Erlang's point of view). +%% +%% out +%% Output only (from Erlang's point of view). +%% +%% binary +%% The port is a binary port, i.e. messages received and sent +%% to a port are binaries. +%% +%% eof +%% Port is not closed on eof and will not send an exit signal, +%% instead it will send a {Port, eof} to the controlling process +%% (output can still be sent to the port (??)). +%% + + +-export([all/1, init_per_testcase/2, fin_per_testcase/2, + init_per_suite/1, end_per_suite/1, + stream/1, stream_small/1, stream_big/1, + basic_ping/1, slow_writes/1, bad_packet/1, bad_port_messages/1, + multiple_packets/1, mul_basic/1, mul_slow_writes/1, + dying_port/1, port_program_with_path/1, + open_input_file_port/1, open_output_file_port/1, + iter_max_ports/1, eof/1, input_only/1, output_only/1, + name1/1, + t_binary/1, options/1, parallell/1, t_exit/1, + env/1, bad_env/1, cd/1, exit_status/1, + tps/1, tps_16_bytes/1, tps_1K/1, line/1, stderr_to_stdout/1, + otp_3906/1, otp_4389/1, win_massive/1, win_massive_client/1, + mix_up_ports/1, otp_5112/1, otp_5119/1, otp_6224/1, + exit_status_multi_scheduling_block/1, ports/1, + spawn_driver/1,spawn_executable/1]). + +-export([]). + +%% Internal exports. +-export([tps/3]). +-export([otp_3906_forker/5, otp_3906_start_forker_starter/4]). +-export([env_slave_main/1]). + +-include("test_server.hrl"). +-include_lib("kernel/include/file.hrl"). + +all(suite) -> + [ + otp_6224, stream, basic_ping, slow_writes, bad_packet, + bad_port_messages, options, multiple_packets, parallell, + dying_port, port_program_with_path, + open_input_file_port, open_output_file_port, + name1, + env, bad_env, cd, exit_status, + iter_max_ports, t_exit, tps, line, stderr_to_stdout, + otp_3906, otp_4389, win_massive, mix_up_ports, + otp_5112, otp_5119, + exit_status_multi_scheduling_block, + ports, spawn_driver, spawn_executable + ]. + +-define(DEFAULT_TIMEOUT, ?t:minutes(5)). + +init_per_testcase(Case, Config) -> + [{testcase, Case} |Config]. + +fin_per_testcase(_Case, _Config) -> + ok. + +init_per_suite(Config) when is_list(Config) -> + ignore_cores:init(Config). + +end_per_suite(Config) when is_list(Config) -> + ignore_cores:fini(Config). + + +-define(WIN_MASSIVE_PORT, 50000). + +%% Tests that you can open a massive amount of ports (sockets) +%% on a Windows machine given the correct environment. +win_massive(Config) when is_list(Config) -> + case os:type() of + {win32,_} -> + do_win_massive(); + _ -> + {skip,"Only on Windows."} + end. + +do_win_massive() -> + ?line Dog = test_server:timetrap(test_server:seconds(360)), + ?line SuiteDir = filename:dirname(code:which(?MODULE)), + ?line Env = " -env ERL_MAX_PORTS 8192", + ?line {ok, Node} = + test_server:start_node(win_massive, + slave, + [{args, " -pa " ++ SuiteDir ++ Env}]), + ?line ok = rpc:call(Node,?MODULE,win_massive_client,[3000]), + ?line test_server:stop_node(Node), + ?line test_server:timetrap_cancel(Dog), + ok. + +win_massive_client(N) -> + {ok,P}=gen_tcp:listen(?WIN_MASSIVE_PORT,[{reuseaddr,true}]), + L = win_massive_loop(P,N), + Len = length(L), + lists:foreach(fun(E) -> + gen_tcp:close(E) + end, + L), + case Len div 2 of + N -> + ok; + _Else -> + {too_few, Len} + end. + +win_massive_loop(_,0) -> + []; +win_massive_loop(P,N) -> + case (catch gen_tcp:connect("localhost",?WIN_MASSIVE_PORT,[])) of + {ok,A} -> + case (catch gen_tcp:accept(P)) of + {ok,B} -> + %erlang:display(N), + [A,B|win_massive_loop(P,N-1)]; + _Else -> + [A] + end; + _Else0 -> + [] + end. + + + + +stream(suite) -> [stream_small, stream_big]. + +%% Test that we can send a stream of bytes and get it back. +%% We will send only a small amount of data, to avoid deadlock. + +stream_small(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line stream_ping(Config, 512, "", []), + ?line stream_ping(Config, 1777, "", []), + ?line stream_ping(Config, 1777, "-s512", []), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Send big amounts of data (much bigger than the buffer size in port test). +%% This will deadlock the emulator if the spawn driver haven't proper +%% non-blocking reads and writes. + +stream_big(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(180)), + case os:type() of + vxworks -> + %% Don't stress VxWorks too much + ?line stream_ping(Config, 43755, "", []), + ?line stream_ping(Config, 51255, "", []), + ?line stream_ping(Config, 52345, " -s40000", []); + _ -> + ?line stream_ping(Config, 43755, "", []), + ?line stream_ping(Config, 100000, "", []), + ?line stream_ping(Config, 77777, " -s40000", []) + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Sends packet with header size of 1, 2, and 4, with packets of various +%% sizes. + +basic_ping(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(120)), + ?line ping(Config, sizes(1), 1, "", []), + ?line ping(Config, sizes(2), 2, "", []), + ?line ping(Config, sizes(4), 4, "", []), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Let the port program insert delays between characters sent back to +%% Erlang, to test that the Erlang emulator can handle a packet coming in +%% small chunks rather than all at once. + +slow_writes(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(20)), + ?line ping(Config, [8], 4, "-s1", []), + ?line ping(Config, [10], 2, "-s2", []), + ?line test_server:timetrap_cancel(Dog), + ok. + +bad_packet(doc) -> + ["Test that we get {'EXIT', Port, einval} if we try to send a bigger " + "packet than the packet header allows."]; +bad_packet(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line PortTest = port_test(Config), + ?line process_flag(trap_exit, true), + + ?line bad_packet(PortTest, 1, 256), + ?line bad_packet(PortTest, 1, 257), + ?line bad_packet(PortTest, 2, 65536), + ?line bad_packet(PortTest, 2, 65537), + + ?line test_server:timetrap_cancel(Dog), + ok. + +bad_packet(PortTest, HeaderSize, PacketSize) -> + %% Intentionally no ?line macros. + P = open_port({spawn, PortTest}, [{packet, HeaderSize}]), + P ! {self(), {command, make_zero_packet(PacketSize)}}, + receive + {'EXIT', P, einval} -> ok; + Other -> test_server:fail({unexpected_message, Other}) + end. + +make_zero_packet(0) -> []; +make_zero_packet(N) when N rem 2 == 0 -> + P = make_zero_packet(N div 2), + [P|P]; +make_zero_packet(N) -> + P = make_zero_packet(N div 2), + [0, P|P]. + +%% Test sending bad messages to a port. +bad_port_messages(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line PortTest = port_test(Config), + ?line process_flag(trap_exit, true), + + ?line bad_message(PortTest, {a,b}), + ?line bad_message(PortTest, {a}), + ?line bad_message(PortTest, {self(),{command,bad_command}}), + ?line bad_message(PortTest, {self(),{connect,no_pid}}), + + ?line test_server:timetrap_cancel(Dog), + ok. + +bad_message(PortTest, Message) -> + P = open_port({spawn,PortTest}, []), + P ! Message, + receive + {'EXIT',P,badsig} -> ok; + Other -> test_server:fail({unexpected_message, Other}) + end. + +%% Tests various options (stream and {packet, Number} are implicitly +%% tested in other test cases). + +options(suite) -> [t_binary, eof, input_only, output_only]. + +%% Tests the 'binary' option for a port. + +t_binary(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(300)), + + %% Packet mode. + ?line ping(Config, sizes(1), 1, "", [binary]), + ?line ping(Config, sizes(2), 2, "", [binary]), + ?line ping(Config, sizes(4), 4, "", [binary]), + + %% Stream mode. + case os:type() of + vxworks -> + %% don't stress VxWorks too much + ?line stream_ping(Config, 435, "", [binary]), + ?line stream_ping(Config, 43755, "", [binary]), + ?line stream_ping(Config, 50000, "", [binary]); + _ -> + ?line stream_ping(Config, 435, "", [binary]), + ?line stream_ping(Config, 43755, "", [binary]), + ?line stream_ping(Config, 100000, "", [binary]) + end, + + ?line test_server:timetrap_cancel(Dog), + ok. + +name1(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(100)), + ?line PortTest = port_test(Config), + ?line Command = lists:concat([PortTest, " "]), + ?line P = open_port({spawn, Command}, []), + ?line register(myport, P), + ?line P = whereis(myport), + Text = "hej", + ?line myport ! {self(), {command, Text}}, + ?line receive + {P, {data, Text}} -> + ok + end, + ?line myport ! {self(), close}, + ?line receive + {P, closed} -> ok + end, + ?line undefined = whereis(myport), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Test that the 'eof' option works. + +eof(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(100)), + ?line PortTest = port_test(Config), + ?line Command = lists:concat([PortTest, " -h0 -q"]), + ?line P = open_port({spawn, Command}, [eof]), + ?line receive + {P, eof} -> + ok + end, + ?line P ! {self(), close}, + ?line receive + {P, closed} -> ok + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests that the 'in' option for a port works. + +input_only(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(300)), + ?line expect_input(Config, [0, 1, 10, 13, 127, 128, 255], 1, "", [in]), + ?line expect_input(Config, [0, 1, 255, 2048], 2, "", [in]), + ?line expect_input(Config, [0, 1, 255, 2048], 4, "", [in]), + ?line expect_input(Config, [0, 1, 10, 13, 127, 128, 255], + 1, "", [in, binary]), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests that the 'out' option for a port works. + +output_only(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(100)), + ?line Dir = ?config(priv_dir, Config), + ?line Filename = filename:join(Dir, "output_only_stream"), + ?line output_and_verify(Config, Filename, "-h0", + random_packet(35777, "echo")), + ?line test_server:timetrap_cancel(Dog), + ok. + +output_and_verify(Config, Filename, Options, Data) -> + ?line PortTest = port_test(Config), + ?line Command = lists:concat([PortTest, " ", + Options, " -o", Filename]), + ?line Port = open_port({spawn, Command}, [out]), + ?line Port ! {self(), {command, Data}}, + ?line Port ! {self(), close}, + ?line receive + {Port, closed} -> ok + end, + Wait_time = case os:type() of + vxworks -> 5000; + _ -> 500 + end, + ?line test_server:sleep(Wait_time), + ?line {ok, Written} = file:read_file(Filename), + ?line Data = binary_to_list(Written), + ok. + +%% Test that receiving several packages written in the same +%% write operation works. + +multiple_packets(suite) -> [mul_basic, mul_slow_writes]. + +%% Basic test of receiving multiple packages, written in +%% one operation by the other end. +mul_basic(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(600)), + case os:type() of + vxworks -> + %% don't stress vxworks too much + ?line expect_input(Config, [0, 1, 255, 10, 13], 1, "", []), + ?line expect_input(Config, [0, 10, 13, 1600, 8191, 16383], 2, "", []), + ?line expect_input(Config, [10, 35000], 4, "", []); + _ -> + ?line expect_input(Config, [0, 1, 255, 10, 13], 1, "", []), + ?line expect_input(Config, [0, 10, 13, 1600, 32767, 65535], 2, "", []), + ?line expect_input(Config, [10, 70000], 4, "", []) + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Test reading a buffer consisting of several packets, some +%% of which might be incomplete. (The port program builds +%% a buffer with several packets, but writes it in chunks with +%% delays in between.) + +mul_slow_writes(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(250)), + ?line expect_input(Config, [0, 20, 255, 10, 1], 1, "-s64", []), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Runs several port tests in parallell. Each individual test +%% finishes in about 5 seconds. Running in parallell, all tests +%% should also finish in about 5 seconds. + +parallell(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(300)), + ?line Testers = + [fun() -> stream_ping(Config, 1007, "-s100", []) end, + fun() -> stream_ping(Config, 10007, "-s1000", []) end, + fun() -> stream_ping(Config, 10007, "-s1000", []) end, + + fun() -> expect_input(Config, [21, 22, 23, 24, 25], 1, + "-s10", [in]) end, + + fun() -> ping(Config, [10], 1, "-d", []) end, + fun() -> ping(Config, [20000], 2, "-d", []) end, + fun() -> ping(Config, [101], 1, "-s10", []) end, + fun() -> ping(Config, [1001], 2, "-s100", []) end, + fun() -> ping(Config, [10001], 4, "-s1000", []) end, + + fun() -> ping(Config, [501, 501], 2, "-s100", []) end, + fun() -> ping(Config, [11, 12, 13, 14, 11], 1, "-s5", []) end], + ?line process_flag(trap_exit, true), + ?line Pids = lists:map(fun fun_spawn/1, Testers), + ?line wait_for(Pids), + ?line test_server:timetrap_cancel(Dog), + ok. + +wait_for([]) -> + ok; +wait_for(Pids) -> + io:format("Waiting for ~p", [Pids]), + receive + {'EXIT', Pid, normal} -> + wait_for(lists:delete(Pid, Pids)); + Other -> + test_server:fail({bad_exit, Other}) + end. + +%% Tests starting port programs that terminate by themselves. +%% This used to cause problems on Windows. + +dying_port(suite) -> []; +dying_port(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(150)), + ?line process_flag(trap_exit, true), + + ?line P1 = make_dying_port(Config), + ?line P2 = make_dying_port(Config), + ?line P3 = make_dying_port(Config), + ?line P4 = make_dying_port(Config), + ?line P5 = make_dying_port(Config), + + %% This should be big enough to be sure to block in the write. + ?line Garbage = random_packet(16384), + + ?line P1 ! {self(), {command, Garbage}}, + ?line P3 ! {self(), {command, Garbage}}, + ?line P5 ! {self(), {command, Garbage}}, + + ?line wait_for_port_exit(P1), + ?line wait_for_port_exit(P2), + ?line wait_for_port_exit(P3), + ?line wait_for_port_exit(P4), + ?line wait_for_port_exit(P5), + + ?line test_server:timetrap_cancel(Dog), + ok. + +wait_for_port_exit(Port) -> + receive + {'EXIT', Port, _} -> + ok + end. + +make_dying_port(Config) when is_list(Config) -> + PortTest = port_test(Config), + Command = lists:concat([PortTest, " -h0 -d -q"]), + open_port({spawn, Command}, [stream]). + +%% Tests that port program with complete path (but without any +%% .exe extension) can be started, even if there is a file with +%% the same name but without the extension in the same directory. +%% (In practice, the file with the same name could be a Unix +%% executable.) +%% +%% This used to failed on Windows (the .exe extension had to be +%% explicitly given). +%% +%% This testcase works on Unix, but is not very useful. + +port_program_with_path(suite) -> []; +port_program_with_path(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(100)), + ?line DataDir = ?config(data_dir, Config), + ?line PrivDir = ?config(priv_dir, Config), + + %% Create a copy of the port test program in a directory not + %% included in PATH (i.e. in priv_dir), with the name 'my_port_test.exe'. + %% Also, place a file named 'my_port_test' in the same directory. + %% This used to confuse the CreateProcess() call in spawn driver. + %% (On Unix, there will be a single file created, which will be + %% a copy of the port program.) + + ?line PortTest = os:find_executable("port_test", DataDir), + io:format("os:find_executable(~p, ~p) returned ~p", + ["port_test", DataDir, PortTest]), + ?line {ok, PortTestPgm} = file:read_file(PortTest), + ?line NewName = filename:join(PrivDir, filename:basename(PortTest)), + ?line RedHerring = filename:rootname(NewName), + ?line ok = file:write_file(RedHerring, "I'm just here to confuse.\n"), + ?line ok = file:write_file(NewName, PortTestPgm), + ?line ok = file:write_file_info(NewName, #file_info{mode=8#111}), + ?line PgmWithPathAndNoExt = filename:rootname(NewName), + + %% Open the port using the path to the copied port test program, + %% but without the .exe extension, and verified that it was started. + %% + %% If the bug is present the open_port call will fail with badarg. + + ?line Command = lists:concat([PgmWithPathAndNoExt, " -h2"]), + %% allow VxWorks time to write file + case os:type() of + vxworks -> test_server:sleep(2500); + _ -> time + end, + ?line P = open_port({spawn, Command}, [{packet, 2}]), + ?line Message = "echo back to me", + ?line P ! {self(), {command, Message}}, + ?line receive + {P, {data, Message}} -> + ok + end, + ?line test_server:timetrap_cancel(Dog), + ok. + + +%% Tests that files can be read using open_port(Filename, [in]). +%% This used to fail on Windows. +open_input_file_port(suite) -> []; +open_input_file_port(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line PrivDir = ?config(priv_dir, Config), + + %% Create a file with the file driver and read it back using + %% open_port/2. + + ?line MyFile1 = filename:join(PrivDir, "my_input_file"), + ?line FileData1 = "An input file", + ?line ok = file:write_file(MyFile1, FileData1), + case os:type() of + vxworks -> + %% Can't open input file with vanilla driver on VxWorks + ?line process_flag(trap_exit, true), + ?line case catch open_port(MyFile1, [in]) of + {'EXIT', {badarg, _}} -> + ok + end; + _ -> + ?line case open_port(MyFile1, [in]) of + InputPort when is_port(InputPort) -> + ?line receive + {InputPort, {data, FileData1}} -> + ok + end + end + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests that files can be written using open_port(Filename, [out]). +open_output_file_port(suite) -> []; +open_output_file_port(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(100)), + ?line PrivDir = ?config(priv_dir, Config), + + %% Create a file with open_port/2 and read it back with + %% the file driver. + + ?line MyFile2 = filename:join(PrivDir, "my_output_file"), + ?line FileData2_0 = "A file created ", + ?line FileData2_1 = "with open_port/2.\n", + ?line FileData2 = FileData2_0 ++ FileData2_1, + ?line OutputPort = open_port(MyFile2, [out]), + ?line OutputPort ! {self(), {command, FileData2_0}}, + ?line OutputPort ! {self(), {command, FileData2_1}}, + ?line OutputPort ! {self(), close}, + ?line {ok, Bin} = file:read_file(MyFile2), + ?line FileData2 = binary_to_list(Bin), + + ?line test_server:timetrap_cancel(Dog), + ok. + +%% +%% Open as many ports as possible. Do this several times and check +%% that we get the same number of ports every time. +%% + +iter_max_ports(suite) -> []; +iter_max_ports(Config) when is_list(Config) -> + %% The child_setup program might dump core if we get out of memory. + %% This is hard to do anything about and is harmless. We run this test + %% in a working directory with an ignore_core_files file which will make + %% the search for core files ignore cores generated by this test. + %% + Config2 = ignore_cores:setup(?MODULE, iter_max_ports, Config, true), + try + iter_max_ports_test(Config2) + after + ignore_cores:restore(Config2) + end. + + +iter_max_ports_test(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(20)), + ?line PortTest = port_test(Config), + ?line Command = lists:concat([PortTest, " -h0 -q"]), + ?line Iters = case os:type() of + {win32,_} -> 4; + _ -> 10 + end, + ?line L = do_iter_max_ports(Iters, Command), + io:format("Result: ~p",[L]), + ?line all_equal(L), + ?line test_server:timetrap_cancel(Dog), + {comment, "Max ports: " ++ integer_to_list(hd(L))}. + +do_iter_max_ports(N, Command) when N > 0 -> + [max_ports(Command)| do_iter_max_ports(N-1, Command)]; +do_iter_max_ports(_, _) -> + []. + +all_equal([E,E|T]) -> + all_equal([E|T]); +all_equal([_]) -> ok; +all_equal([]) -> ok. + +max_ports(Command) -> + test_server:sleep(500), + ?line Ps = open_ports({spawn, Command}, [eof]), + ?line N = length(Ps), + ?line close_ports(Ps), + io:format("Got ~p ports\n",[N]), + N. + +close_ports([P|Ps]) -> + P ! {self(), close}, + receive + {P,closed} -> + ok + end, + close_ports(Ps); +close_ports([]) -> + ok. + +open_ports(Name, Settings) -> + test_server:sleep(50), + case catch open_port(Name, Settings) of + P when is_port(P) -> + [P| open_ports(Name, Settings)]; + {'EXIT', {Code, _}} -> + case Code of + enfile -> + []; + emfile -> + []; + system_limit -> + []; + Other -> + ?line test_server:fail({open_ports, Other}) + end; + Other -> + ?line test_server:fail({open_ports, Other}) + end. + +%% Tests that exit(Port, Term) works (has been known to crash the emulator). + +t_exit(suite) -> []; +t_exit(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Pid = fun_spawn(fun suicide_port/1, [Config]), + ?line receive + {'EXIT', Pid, die} -> + ok; + Other -> + test_server:fail({bad_message, Other}) + end. + +suicide_port(Config) when is_list(Config) -> + ?line Port = port_expect(Config, [], 0, "", []), + ?line exit(Port, die), + ?line receive after infinity -> ok end. + +tps(suite) -> [tps_16_bytes, tps_1K]. + +tps_16_bytes(doc) -> ""; +tps_16_bytes(suite) -> []; +tps_16_bytes(Config) when is_list(Config) -> + ?line tps(16, Config). + +tps_1K(doc) -> ""; +tps_1K(suite) -> []; +tps_1K(Config) when is_list(Config) -> + ?line tps(1024, Config). + +tps(Size, Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(300)), + ?line PortTest = port_test(Config), + ?line Packet = list_to_binary(random_packet(Size, "e")), + ?line Port = open_port({spawn, PortTest}, [binary, {packet, 2}]), + ?line Transactions = 10000, + ?line {Elapsed, ok} = test_server:timecall(?MODULE, tps, + [Port, Packet, Transactions]), + ?line test_server:timetrap_cancel(Dog), + {comment, integer_to_list(trunc(Transactions/Elapsed+0.5)) ++ " transactions/s"}. + +tps(_Port, _Packet, 0) -> ok; +tps(Port, Packet, N) -> + ?line port_command(Port, Packet), + ?line receive + {Port, {data, Packet}} -> + ?line tps(Port, Packet, N-1); + Other -> + ?line test_server:fail({bad_message, Other}) + end. + +%% Line I/O test +line(Config) when is_list(Config) -> + ?line Siz = 110, + ?line Dog = test_server:timetrap(test_server:seconds(300)), + ?line Packet1 = random_packet(Siz), + ?line Packet2 = random_packet(Siz div 2), + %% Test that packets are split into lines + ?line port_expect(Config,[{lists:append([Packet1, io_lib:nl(), Packet2, + io_lib:nl()]), + [{eol, Packet1}, {eol, Packet2}]}], + 0, "", [{line,Siz}]), + %% Test the same for binaries + ?line port_expect(Config,[{lists:append([Packet1, io_lib:nl(), Packet2, + io_lib:nl()]), + [{eol, Packet1}, {eol, Packet2}]}], + 0, "", [{line,Siz},binary]), + %% Test that too long lines get split + ?line port_expect(Config,[{lists:append([Packet1, io_lib:nl(), Packet1, + Packet2, io_lib:nl()]), + [{eol, Packet1}, {noeol, Packet1}, + {eol, Packet2}]}], 0, "", [{line,Siz}]), + %% Test that last output from closing port program gets received. + ?line L1 = lists:append([Packet1, io_lib:nl(), Packet2]), + ?line S1 = lists:flatten(io_lib:format("-l~w", [length(L1)])), + io:format("S1 = ~w, L1 = ~w~n", [S1,L1]), + ?line port_expect(Config,[{L1, + [{eol, Packet1}, {noeol, Packet2}, eof]}], 0, + S1, [{line,Siz},eof]), + %% Test that lonely Don't get treated as newlines + ?line port_expect(Config,[{lists:append([Packet1, [13], Packet2, + io_lib:nl()]), + [{noeol, Packet1}, {eol, [13 |Packet2]}]}], + 0, "", [{line,Siz}]), + %% Test that packets get built up to lines (delayed output from + %% port program) + ?line port_expect(Config,[{Packet2,[]}, + {lists:append([Packet2, io_lib:nl(), + Packet1, io_lib:nl()]), + [{eol, lists:append(Packet2, Packet2)}, + {eol, Packet1}]}], 0, "-d", [{line,Siz}]), + %% Test that we get badarg if trying both packet and line + ?line bad_argument(Config, [{packet, 5}, {line, 5}]), + ?line test_server:timetrap_cancel(Dog), + ok. + +%%% Redirection of stderr test +stderr_to_stdout(suite) -> + []; +stderr_to_stdout(doc) -> + "Test that redirection of standard error to standard output works."; +stderr_to_stdout(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(60)), + %% See that it works + ?line Packet = random_packet(10), + ?line port_expect(Config,[{Packet,[Packet]}], 0, "-e -l10", + [stderr_to_stdout]), + %% ?line stream_ping(Config, 10, "-e", [stderr_to_stdout]), + %% See that it doesn't always happen (will generate garbage on stderr) + ?line port_expect(Config,[{Packet,[eof]}], 0, "-e -l10", [line,eof]), + ?line test_server:timetrap_cancel(Dog), + ok. + + +bad_argument(Config, ArgList) -> + PortTest = port_test(Config), + case catch open_port({spawn, PortTest}, ArgList) of + {'EXIT', {badarg, _}} -> + ok + end. + + +%% 'env' option +%% (Can perhaps be made smaller by calling the other utility functions +%% in this module.) +env(suite) -> + []; +env(doc) -> + ["Test that the 'env' option works"]; +env(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {skipped,"Environments not implemented on VxWorks (could be...)"}; + _ -> + env2(Config) + end. + +env2(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(60)), + ?line Priv = ?config(priv_dir, Config), + ?line Temp = filename:join(Priv, "env_fun.bin"), + + PluppVal = "dirty monkey", + ?line env_slave(Temp, [{"plupp",PluppVal}]), + + Long = "LongAndBoringEnvName", + ?line os:putenv(Long, "nisse"), + + ?line env_slave(Temp, [{"plupp",PluppVal}, + {"DIR_PLUPP","###glurfrik"}], + fun() -> + PluppVal = os:getenv("plupp"), + "###glurfrik" = os:getenv("DIR_PLUPP"), + "nisse" = os:getenv(Long) + end), + + + ?line env_slave(Temp, [{"must_define_something","some_value"}, + {"certainly_not_existing",false}, + {Long,false}, + {"glurf","a glorfy string"}]), + + ?line test_server:timetrap_cancel(Dog), + ok. + +env_slave(File, Env) -> + F = fun() -> + lists:foreach(fun({Name,Val}) -> + Val = os:getenv(Name) + end, Env) + end, + env_slave(File, Env, F). + +env_slave(File, Env, Body) -> + file:write_file(File, term_to_binary(Body)), + Program = atom_to_list(lib:progname()), + Dir = filename:dirname(code:which(?MODULE)), + Cmd = Program ++ " -pz " ++ Dir ++ + " -noinput -run " ++ ?MODULE_STRING ++ " env_slave_main " ++ + File ++ " -run erlang halt", + Port = open_port({spawn, Cmd}, [{env,Env},{line,256}]), + receive + {Port,{data,{eol,"ok"}}} -> + ok; + {Port,{data,{eol,Error}}} -> + io:format("~p\n", [Error]), + test_server:fail(); + Other -> + test_server:fail(Other) + end. + +env_slave_main([File]) -> + {ok,Body0} = file:read_file(File), + Body = binary_to_term(Body0), + case Body() of + {'EXIT',Reason} -> + io:format("Error: ~p\n", [Reason]); + _ -> + io:format("ok\n") + end, + init:stop(). + + +%% 'env' option +%% Test bad environments. +bad_env(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {skipped,"Environments not implemented on VxWorks"}; + _ -> + bad_env_1() + end. + +bad_env_1() -> + ?line try_bad_env([abbb]), + ?line try_bad_env([{"key","value"}|{"another","value"}]), + ?line try_bad_env([{"key","value","value2"}]), + ?line try_bad_env([{"key",[a,b,c]}]), + ?line try_bad_env([{"key",value}]), + ?line try_bad_env({a,tuple}), + ?line try_bad_env(42), + ?line try_bad_env([a|b]), + ?line try_bad_env(self()), + ok. + +try_bad_env(Env) -> + try open_port({spawn,"ls"}, [{env,Env}]) + catch + error:badarg -> ok + end. + +%% 'cd' option +%% (Can perhaps be made smaller by calling the other utility functions +%% in this module.) +cd(suite) -> + []; +cd(doc) -> + ["Test that the 'cd' option works"]; +cd(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {skipped,"Task specific directories does not exist on VxWorks"}; + _ -> + cd2(Config) + end. +cd2(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(60)), + + ?line Program = atom_to_list(lib:progname()), + ?line DataDir = ?config(data_dir, Config), + ?line TestDir = filename:join(DataDir, "dir"), + ?line Cmd = Program ++ " -pz " ++ DataDir ++ + " -noshell -s port_test pwd -s erlang halt", + ?line _ = open_port({spawn, Cmd}, + [{cd, TestDir}, + {line, 256}]), + ?line receive + {_, {data, {eol, String}}} -> + case filename_equal(String, TestDir) of + true -> + ok; + false -> + ?line test_server:fail({cd, String}) + end; + Other2 -> + ?line test_server:fail({env, Other2}) + end, + + ?line test_server:timetrap_cancel(Dog), + ok. + +filename_equal(A, B) -> + case os:type() of + {win32, _} -> + win_filename_equal(A, B); + _ -> + A == B + end. + +win_filename_equal([], []) -> + true; +win_filename_equal([], _) -> + false; +win_filename_equal(_, []) -> + false; +win_filename_equal([C1 | Rest1], [C2 | Rest2]) -> + case tolower(C1) == tolower(C2) of + true -> + win_filename_equal(Rest1, Rest2); + false -> + false + end. + +tolower(C) when C >= $A, C =< $Z -> + C + 32; +tolower(C) -> + C. + +otp_3906(suite) -> + []; +otp_3906(doc) -> + ["Tests that child process deaths are managed correctly when there are " + " a large amount of concurrently dying children. See ticket OTP-3906."]; +otp_3906(Config) when is_list(Config) -> + case os:type() of + {unix, OSName} -> + otp_3906(Config, OSName); + _ -> + {skipped, "Only run on Unix systems"} + end. + +-define(OTP_3906_CHILDREN, 1000). +-define(OTP_3906_EXIT_STATUS, 17). +-define(OTP_3906_PROGNAME, "otp_3906"). +-define(OTP_3906_TICK_TIMEOUT, 5000). +-define(OTP_3906_OSP_P_ERLP, 10). +-define(OTP_3906_MAX_CONC_OSP, 50). + +otp_3906(Config, OSName) -> + ?line TSDir = filename:dirname(code:which(test_server)), + ?line {ok, Variables} = file:consult(filename:join(TSDir, "variables")), + case lists:keysearch('CC', 1, Variables) of + {value,{'CC', CC}} -> + SuiteDir = filename:dirname(code:which(?MODULE)), + PrivDir = ?config(priv_dir, Config), + Prog = otp_3906_make_prog(CC, PrivDir), + {ok, Node} = test_server:start_node(otp_3906, + slave, + [{args, " -pa " ++ SuiteDir}, + {linked, false}]), + OP = process_flag(priority, max), + OTE = process_flag(trap_exit, true), + FS = spawn_link(Node, + ?MODULE, + otp_3906_start_forker_starter, + [?OTP_3906_CHILDREN, [], self(), Prog]), + Result = receive + {'EXIT', _ForkerStarter, Reason} -> + {failed, Reason}; + {emulator_pid, EmPid} -> + case otp_3906_wait_result(FS, 0, 0) of + {succeded, + ?OTP_3906_CHILDREN, + ?OTP_3906_CHILDREN} -> + succeded; + {succeded, Forked, Exited} -> + otp_3906_list_defunct(EmPid, OSName), + {failed, + {mismatch, + {forked, Forked}, + {exited, Exited}}}; + Res -> + otp_3906_list_defunct(EmPid, OSName), + Res + end + end, + process_flag(trap_exit, OTE), + process_flag(priority, OP), + test_server:stop_node(Node), + case Result of + succeded -> + ok; + _ -> + ?line test_server:fail(Result) + end; + _ -> + {skipped, "No C compiler found"} + end. + +otp_3906_list_defunct(EmPid, OSName) -> + % Guess ps switches to use and what to grep for (could be improved) + {Switches, Zombie} = case OSName of + BSD when BSD == darwin; + BSD == openbsd; + BSD == netbsd; + BSD == freebsd -> + {"-ajx", "Z"}; + _ -> + {"-ef", "[dD]efunct"} + end, + test_server:format("Emulator pid: ~s~n" + "Listing of zombie processes:~n" + "~s~n", + [EmPid, + otp_3906_htmlize(os:cmd("ps " + ++ Switches + ++ " | grep " + ++ Zombie))]). + +otp_3906_htmlize([]) -> + []; +otp_3906_htmlize([C | Cs]) -> + case [C] of + "<" -> "<" ++ otp_3906_htmlize(Cs); + ">" -> ">" ++ otp_3906_htmlize(Cs); + _ -> [C | otp_3906_htmlize(Cs)] + end. + +otp_3906_make_prog(CC, PrivDir) -> + SrcFileName = filename:join(PrivDir, ?OTP_3906_PROGNAME ++ ".c"), + TrgtFileName = filename:join(PrivDir, ?OTP_3906_PROGNAME), + {ok, SrcFile} = file:open(SrcFileName, write), + io:format(SrcFile, + "int ~n" + "main(void) ~n" + "{ ~n" + " return ~p; ~n" + "} ~n", + [?OTP_3906_EXIT_STATUS]), + file:close(SrcFile), + os:cmd(CC ++ " " ++ SrcFileName ++ " -o " ++ TrgtFileName), + TrgtFileName. + + +otp_3906_wait_result(ForkerStarter, F, E) -> + receive + {'EXIT', ForkerStarter, Reason} -> + {failed, {Reason, {forked, F}, {exited, E}}}; + forked -> + otp_3906_wait_result(ForkerStarter, F+1, E); + exited -> + otp_3906_wait_result(ForkerStarter, F, E+1); + tick -> + otp_3906_wait_result(ForkerStarter, F, E); + succeded -> + {succeded, F, E} + after + ?OTP_3906_TICK_TIMEOUT -> + unlink(ForkerStarter), + exit(ForkerStarter, timeout), + {failed, {timeout, {forked, F}, {exited, E}}} + end. + +otp_3906_collect([], _) -> + done; +otp_3906_collect(RefList, Sup) -> + otp_3906_collect(otp_3906_collect_one(RefList, Sup), Sup). + +otp_3906_collect_one(RefList, Sup) -> + receive + Ref when is_reference(Ref) -> + Sup ! tick, + lists:delete(Ref, RefList) + end. + +otp_3906_start_forker(N, Sup, Prog) -> + Ref = make_ref(), + spawn_opt(?MODULE, + otp_3906_forker, + [N, self(), Ref, Sup, Prog], + [link, {priority, max}]), + Ref. + +otp_3906_start_forker_starter(N, RefList, Sup, Prog) -> + process_flag(priority, max), + EmPid = os:getpid(), + Sup ! {emulator_pid, EmPid}, + otp_3906_forker_starter(N, RefList, Sup, Prog). + +otp_3906_forker_starter(0, RefList, Sup, _) -> + otp_3906_collect(RefList, Sup), + unlink(Sup), + Sup ! succeded; +otp_3906_forker_starter(N, RefList, Sup, Prog) + when length(RefList) >= ?OTP_3906_MAX_CONC_OSP -> + otp_3906_forker_starter(N, otp_3906_collect_one(RefList, Sup), Sup, Prog); +otp_3906_forker_starter(N, RefList, Sup, Prog) + when is_integer(N), N > ?OTP_3906_OSP_P_ERLP -> + otp_3906_forker_starter(N-?OTP_3906_OSP_P_ERLP, + [otp_3906_start_forker(?OTP_3906_OSP_P_ERLP, + Sup, + Prog)|RefList], + Sup, + Prog); +otp_3906_forker_starter(N, RefList, Sup, Prog) when is_integer(N) -> + otp_3906_forker_starter(0, + [otp_3906_start_forker(N, + Sup, + Prog)|RefList], + Sup, + Prog). + +otp_3906_forker(0, Parent, Ref, _, _) -> + unlink(Parent), + Parent ! Ref; +otp_3906_forker(N, Parent, Ref, Sup, Prog) -> + Port = erlang:open_port({spawn, Prog}, [exit_status, in]), + Sup ! forked, + receive + {Port, {exit_status, ?OTP_3906_EXIT_STATUS}} -> + Sup ! exited, + otp_3906_forker(N-1, Parent, Ref, Sup, Prog); + {Port, Res} -> + exit(Res); + Other -> + exit(Other) + end. + + +otp_4389(suite) -> []; +otp_4389(doc) -> []; +otp_4389(Config) when is_list(Config) -> + case {os:type(),erlang:system_info(heap_type)} of + {{unix, _},private} -> + ?line Dog = test_server:timetrap(test_server:seconds(240)), + ?line TCR = self(), + case get_true_cmd() of + True when is_list(True) -> + ?line lists:foreach( + fun (P) -> + ?line receive + {P, ok} -> ?line ok; + {P, Err} -> ?line ?t:fail(Err) + end + end, + lists:map( + fun(_) -> + spawn_link( + fun() -> + process_flag(trap_exit, true), + case catch open_port({spawn, True}, + [stream,exit_status]) of + P when is_port(P) -> + receive + {P,{exit_status,_}} -> + TCR ! {self(),ok}; + {'EXIT',_,{R2,_}} when R2 == emfile; + R2 == eagain -> + TCR ! {self(),ok}; + Err2 -> + TCR ! {self(),{msg,Err2}} + end; + {'EXIT',{R1,_}} when R1 == emfile; + R1 == eagain -> + TCR ! {self(),ok}; + Err1 -> + TCR ! {self(), {open_port,Err1}} + end + end) + end, + lists:duplicate(1000,[]))), + ?line test_server:timetrap_cancel(Dog), + {comment, + "This test case doesn't always fail when the bug that " + "it tests for is present (it is most likely to fail on" + " a multi processor machine). If the test case fails it" + " will fail by deadlocking the emulator."}; + _ -> + ?line {skipped, "\"true\" command not found"} + end; + _ -> + {skip,"Only run on Unix and private heaps"} + end. + +get_true_cmd() -> + DoFileExist = fun (FileName) -> + case file:read_file_info(FileName) of + {ok, _} -> throw(FileName); + _ -> not_found + end + end, + catch begin + %% First check in /usr/bin and /bin + DoFileExist("/usr/bin/true"), + DoFileExist("/bin/true"), + %% Try which + case filename:dirname(os:cmd("which true")) of + "." -> not_found; + TrueDir -> filename:join(TrueDir, "true") + end + end. + +%% 'exit_status' option +exit_status(suite) -> + []; +exit_status(doc) -> + ["Test that the 'exit_status' option works"]; +exit_status(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(60)), + ?line port_expect(Config,[{"x", + [{exit_status, 5}]}], + 1, "", [exit_status]), + ?line test_server:timetrap_cancel(Dog), + ok. + +spawn_driver(suite) -> + []; +spawn_driver(doc) -> + ["Test spawning a driver specifically"]; +spawn_driver(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line ok = load_driver(Path, "echo_drv"), + ?line Port = erlang:open_port({spawn_driver, "echo_drv"}, []), + ?line Port ! {self(), {command, "Hello port!"}}, + ?line receive + {Port, {data, "Hello port!"}} = Msg1 -> + io:format("~p~n", [Msg1]), + ok; + Other -> + test_server:fail({unexpected, Other}) + end, + ?line Port ! {self(), close}, + ?line receive {Port, closed} -> ok end, + + ?line Port2 = erlang:open_port({spawn_driver, "echo_drv -Hello port?"}, + []), + ?line receive + {Port2, {data, "Hello port?"}} = Msg2 -> + io:format("~p~n", [Msg2]), + ok; + Other2 -> + test_server:fail({unexpected2, Other2}) + end, + ?line Port2 ! {self(), close}, + ?line receive {Port2, closed} -> ok end, + ?line {'EXIT',{badarg,_}} = (catch erlang:open_port({spawn_driver, "ls"}, [])), + ?line {'EXIT',{badarg,_}} = (catch erlang:open_port({spawn_driver, "cmd"}, [])), + ?line {'EXIT',{badarg,_}} = (catch erlang:open_port({spawn_driver, os:find_executable("erl")}, [])), + ?line test_server:timetrap_cancel(Dog), + ok. + +spawn_executable(suite) -> + []; +spawn_executable(doc) -> + ["Test spawning an executable specifically"]; +spawn_executable(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line DataDir = ?config(data_dir, Config), + ?line EchoArgs1 = filename:join([DataDir,"echo_args"]), + ?line ExactFile1 = filename:nativename(os:find_executable(EchoArgs1)), + ?line [ExactFile1] = run_echo_args(DataDir,[]), + ?line ["echo_args"] = run_echo_args(DataDir,["echo_args"]), + ?line ["echo_arguments"] = run_echo_args(DataDir,["echo_arguments"]), + ?line [ExactFile1,"hello world","dlrow olleh"] = + run_echo_args(DataDir,[ExactFile1,"hello world","dlrow olleh"]), + ?line [ExactFile1] = run_echo_args(DataDir,[default]), + ?line [ExactFile1,"hello world","dlrow olleh"] = + run_echo_args(DataDir,[switch_order,ExactFile1,"hello world", + "dlrow olleh"]), + ?line [ExactFile1,"hello world","dlrow olleh"] = + run_echo_args(DataDir,[default,"hello world","dlrow olleh"]), + + ?line [ExactFile1,"hello world","dlrow olleh"] = + run_echo_args_2("\""++ExactFile1++"\" "++"\"hello world\" \"dlrow olleh\""), + + ?line PrivDir = ?config(priv_dir, Config), + ?line SpaceDir =filename:join([PrivDir,"With Spaces"]), + ?line file:make_dir(SpaceDir), + ?line Executable = filename:basename(ExactFile1), + ?line file:copy(ExactFile1,filename:join([SpaceDir,Executable])), + ?line ExactFile2 = filename:nativename(filename:join([SpaceDir,Executable])), + ?line chmodplusx(ExactFile2), + io:format("|~s|~n",[ExactFile2]), + ?line [ExactFile2] = run_echo_args(SpaceDir,[]), + ?line ["echo_args"] = run_echo_args(SpaceDir,["echo_args"]), + ?line ["echo_arguments"] = run_echo_args(SpaceDir,["echo_arguments"]), + ?line [ExactFile2,"hello world","dlrow olleh"] = + run_echo_args(SpaceDir,[ExactFile2,"hello world","dlrow olleh"]), + ?line [ExactFile2] = run_echo_args(SpaceDir,[default]), + ?line [ExactFile2,"hello world","dlrow olleh"] = + run_echo_args(SpaceDir,[switch_order,ExactFile2,"hello world", + "dlrow olleh"]), + ?line [ExactFile2,"hello world","dlrow olleh"] = + run_echo_args(SpaceDir,[default,"hello world","dlrow olleh"]), + ?line [ExactFile2,"hello world","dlrow olleh"] = + run_echo_args_2("\""++ExactFile2++"\" "++"\"hello world\" \"dlrow olleh\""), + + ?line ExeExt = + case string:to_lower(lists:last(string:tokens(ExactFile2,"."))) of + "exe" -> + ".exe"; + _ -> + "" + end, + Executable2 = "spoky name"++ExeExt, + ?line file:copy(ExactFile1,filename:join([SpaceDir,Executable2])), + ?line ExactFile3 = filename:nativename(filename:join([SpaceDir,Executable2])), + ?line chmodplusx(ExactFile3), + ?line [ExactFile3] = run_echo_args(SpaceDir,Executable2,[]), + ?line ["echo_args"] = run_echo_args(SpaceDir,Executable2,["echo_args"]), + ?line ["echo_arguments"] = run_echo_args(SpaceDir,Executable2,["echo_arguments"]), + ?line [ExactFile3,"hello world","dlrow olleh"] = + run_echo_args(SpaceDir,Executable2,[ExactFile3,"hello world","dlrow olleh"]), + ?line [ExactFile3] = run_echo_args(SpaceDir,Executable2,[default]), + ?line [ExactFile3,"hello world","dlrow olleh"] = + run_echo_args(SpaceDir,Executable2, + [switch_order,ExactFile3,"hello world", + "dlrow olleh"]), + ?line [ExactFile3,"hello world","dlrow olleh"] = + run_echo_args(SpaceDir,Executable2, + [default,"hello world","dlrow olleh"]), + ?line [ExactFile3,"hello world","dlrow olleh"] = + run_echo_args_2("\""++ExactFile3++"\" "++"\"hello world\" \"dlrow olleh\""), + ?line {'EXIT',{enoent,_}} = (catch run_echo_args(SpaceDir,"fnurflmonfi", + [default,"hello world", + "dlrow olleh"])), + NonExec = "kronxfrt"++ExeExt, + ?line file:write_file(filename:join([SpaceDir,NonExec]), + <<"Not an executable">>), + ?line {'EXIT',{eacces,_}} = (catch run_echo_args(SpaceDir,NonExec, + [default,"hello world", + "dlrow olleh"])), + ?line {'EXIT',{enoent,_}} = (catch open_port({spawn_executable,"cmd"},[])), + ?line {'EXIT',{enoent,_}} = (catch open_port({spawn_executable,"sh"},[])), + case os:type() of + {win32,_} -> + test_bat_file(SpaceDir); + {unix,_} -> + test_sh_file(SpaceDir) + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +test_bat_file(Dir) -> + FN = "tf.bat", + Full = filename:join([Dir,FN]), + D = [<<"@echo off\r\n">>, + <<"echo argv[0]:^|%0^|\r\n">>, + <<"if \"%1\" == \"\" goto done\r\n">>, + <<"echo argv[1]:^|%1^|\r\n">>, + <<"if \"%2\" == \"\" goto done\r\n">>, + <<"echo argv[2]:^|%2^|\r\n">>, + <<"if \"%3\" == \"\" goto done\r\n">>, + <<"echo argv[3]:^|%3^|\r\n">>, + <<"if \"%4\" == \"\" goto done\r\n">>, + <<"echo argv[4]:^|%4^|\r\n">>, + <<"if \"%5\" == \"\" goto done\r\n">>, + <<"echo argv[5]:^|%5^|\r\n">>, + <<"\r\n">>, + <<":done\r\n">>, + <<"\r\n">>], + ?line file:write_file(Full,list_to_binary(D)), + ?line EF = filename:basename(FN), + ?line [DN,"hello","world"] = + run_echo_args(Dir,FN, + [default,"hello","world"]), + %% The arg0 argumant should be ignored when running batch files + ?line [DN,"hello","world"] = + run_echo_args(Dir,FN, + ["knaskurt","hello","world"]), + ?line EF = filename:basename(DN), + ok. + +test_sh_file(Dir) -> + FN = "tf.sh", + Full = filename:join([Dir,FN]), + D = [<<"#! /bin/sh\n">>, + <<"echo 'argv[0]:|'$0'|'\n">>, + <<"i=1\n">>, + <<"while [ '!' -z \"$1\" ]; do\n">>, + <<" echo 'argv['$i']:|'\"$1\"'|'\n">>, + <<" shift\n">>, + <<" i=`expr $i + 1`\n">>, + <<"done\n">>], + ?line file:write_file(Full,list_to_binary(D)), + ?line chmodplusx(Full), + ?line [Full,"hello","world"] = + run_echo_args(Dir,FN, + [default,"hello","world"]), + ?line [Full,"hello","world of spaces"] = + run_echo_args(Dir,FN, + [default,"hello","world of spaces"]), + ?line file:write_file(filename:join([Dir,"testfile1"]),<<"testdata1">>), + ?line file:write_file(filename:join([Dir,"testfile2"]),<<"testdata2">>), + ?line Pattern = filename:join([Dir,"testfile*"]), + ?line L = filelib:wildcard(Pattern), + ?line 2 = length(L), + ?line [Full,"hello",Pattern] = + run_echo_args(Dir,FN, + [default,"hello",Pattern]), + ok. + + + +chmodplusx(Filename) -> + case file:read_file_info(Filename) of + {ok,FI} -> + FI2 = FI#file_info{mode = ((FI#file_info.mode) bor 8#00100)}, + file:write_file_info(Filename,FI2); + _ -> + ok + end. + +run_echo_args_2(FullnameAndArgs) -> + Port = open_port({spawn,FullnameAndArgs},[eof]), + Data = collect_data(Port), + Port ! {self(), close}, + receive {Port, closed} -> ok end, + parse_echo_args_output(Data). + + +run_echo_args(Where,Args) -> + run_echo_args(Where,"echo_args",Args). +run_echo_args(Where,Prog,Args) -> + ArgvArg = case Args of + [] -> + []; + [default|T] -> + [{args,T}]; + [switch_order,H|T] -> + [{args,T},{arg0,H}]; + [H|T] -> + [{arg0,H},{args,T}] + end, + Command = filename:join([Where,Prog]), + Port = open_port({spawn_executable,Command},ArgvArg++[eof]), + Data = collect_data(Port), + Port ! {self(), close}, + receive {Port, closed} -> ok end, + parse_echo_args_output(Data). + +collect_data(Port) -> + receive + {Port, {data, Data}} -> + Data ++ collect_data(Port); + {Port, eof} -> + [] + end. + +parse_echo_args_output(Data) -> + [lists:last(string:tokens(S,"|")) || S <- string:tokens(Data,"\r\n")]. + +mix_up_ports(suite) -> + []; +mix_up_ports(doc) -> + ["Test that the emulator does not mix up ports when the port table wraps"]; +mix_up_ports(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line ok = load_driver(Path, "echo_drv"), + ?line Port = erlang:open_port({spawn, "echo_drv"}, []), + ?line Port ! {self(), {command, "Hello port!"}}, + ?line receive + {Port, {data, "Hello port!"}} = Msg1 -> + io:format("~p~n", [Msg1]), + ok; + Other -> + test_server:fail({unexpected, Other}) + end, + ?line Port ! {self(), close}, + ?line receive {Port, closed} -> ok end, + ?line loop(start, done, + fun(P) -> + ?line Q = + (catch erlang:open_port({spawn, "echo_drv"}, [])), +%% ?line io:format("~p ", [Q]), + if is_port(Q) -> + Q; + true -> + io:format("~p~n", [P]), + done + end + end), + ?line Port ! {self(), {command, "Hello again port!"}}, + ?line receive + Msg2 -> + test_server:fail({unexpected, Msg2}) + after 1000 -> + ok + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +loop(Stop, Stop, Fun) when is_function(Fun) -> + ok; +loop(Start, Stop, Fun) when is_function(Fun) -> + loop(Fun(Start), Stop, Fun). + + +otp_5112(suite) -> + []; +otp_5112(doc) -> + ["Test that link to connected process is taken away when port calls", + "driver_exit() also when the port index has wrapped"]; +otp_5112(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line ok = load_driver(Path, "exit_drv"), + ?line Port = otp_5112_get_wrapped_port(), + ?line ?t:format("Max ports: ~p~n",[max_ports()]), + ?line ?t:format("Port: ~p~n",[Port]), + ?line {links, Links1} = process_info(self(),links), + ?line ?t:format("Links1: ~p~n",[Links1]), + ?line true = lists:member(Port, Links1), + ?line Port ! {self(), {command, ""}}, + ?line {links, Links2} = process_info(self(),links), + ?line ?t:format("Links2: ~p~n",[Links2]), + ?line false = lists:member(Port, Links2), %% This used to fail + ?line test_server:timetrap_cancel(Dog), + ok. + +otp_5112_get_wrapped_port() -> + ?line P1 = erlang:open_port({spawn, "exit_drv"}, []), + ?line case port_ix(P1) < max_ports() of + true -> + ?line ?t:format("Need to wrap port index (~p)~n", [P1]), + ?line otp_5112_wrap_port_ix([P1]), + ?line P2 = erlang:open_port({spawn, "exit_drv"}, []), + ?line false = port_ix(P2) < max_ports(), + ?line P2; + false -> + ?line ?t:format("Port index already wrapped (~p)~n", [P1]), + ?line P1 + end. + +otp_5112_wrap_port_ix(Ports) -> + ?line case (catch erlang:open_port({spawn, "exit_drv"}, [])) of + Port when is_port(Port) -> + ?line otp_5112_wrap_port_ix([Port|Ports]); + _ -> + %% Port table now full; empty port table + ?line lists:foreach(fun (P) -> P ! {self(), close} end, + Ports), + ?line ok + end. + + +otp_5119(suite) -> + []; +otp_5119(doc) -> + ["Test that port index is not unnecessarily wrapped"]; +otp_5119(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line ok = load_driver(Path, "exit_drv"), + ?line PI1 = port_ix(otp_5119_fill_empty_port_tab([])), + ?line PI2 = port_ix(erlang:open_port({spawn, "exit_drv"}, [])), + ?line {PortIx1, PortIx2} + = case PI2 > PI1 of + true -> + ?line {PI1, PI2}; + false -> + ?line {port_ix(otp_5119_fill_empty_port_tab([PI2])), + port_ix(erlang:open_port({spawn, "exit_drv"}, []))} + end, + ?line MaxPorts = max_ports(), + ?line ?t:format("PortIx1 = ~p ~p~n", [PI1, PortIx1]), + ?line ?t:format("PortIx2 = ~p ~p~n", [PI2, PortIx2]), + ?line ?t:format("MaxPorts = ~p~n", [MaxPorts]), + ?line true = PortIx2 > PortIx1, + ?line true = PortIx2 =< PortIx1 + MaxPorts, + ?line test_server:timetrap_cancel(Dog), + ?line ok. + +otp_5119_fill_empty_port_tab(Ports) -> + ?line case (catch erlang:open_port({spawn, "exit_drv"}, [])) of + Port when is_port(Port) -> + ?line otp_5119_fill_empty_port_tab([Port|Ports]); + _ -> + %% Port table now full; empty port table + ?line lists:foreach(fun (P) -> P ! {self(), close} end, + Ports), + ?line [LastPort|_] = Ports, + ?line LastPort + end. + +-define(DEF_MAX_PORTS, 1024). + +max_ports_env() -> + ?line case os:getenv("ERL_MAX_PORTS") of + EMP when is_list(EMP) -> + case catch list_to_integer(EMP) of + Int when is_integer(Int) -> ?line Int; + _ -> ?line false + end; + _ -> ?line false + end. + +max_ports() -> + ?line PreMaxPorts + = case max_ports_env() of + Env when is_integer(Env) -> ?line Env; + _ -> + ?line case os:type() of + {unix, _} -> + ?line UlimStr = string:strip(os:cmd("ulimit -n") + -- "\n"), + ?line case catch list_to_integer(UlimStr) of + Ulim when is_integer(Ulim) -> ?line Ulim; + _ -> ?line ?DEF_MAX_PORTS + end; + _ -> ?line ?DEF_MAX_PORTS + end + end, + ?line case PreMaxPorts > ?DEF_MAX_PORTS of + true -> ?line PreMaxPorts; + false -> ?line ?DEF_MAX_PORTS + end. + +port_ix(Port) when is_port(Port) -> + ?line ["#Port",_,PortIxStr] = string:tokens(erlang:port_to_list(Port), + "<.>"), + ?line list_to_integer(PortIxStr). + + +otp_6224(doc) -> ["Check that port command failure doesn't crash the emulator"]; +otp_6224(suite) -> []; +otp_6224(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Path = ?config(data_dir, Config), + ?line ok = load_driver(Path, "failure_drv"), + ?line Go = make_ref(), + ?line Failer = spawn(fun () -> + receive Go -> ok end, + ?line Port = open_port({spawn, "failure_drv"}, + []), + Port ! {self(), {command, "Fail, please!"}}, + otp_6224_loop() + end), + ?line Mon = erlang:monitor(process, Failer), + ?line Failer ! Go, + ?line receive + {'DOWN', Mon, process, Failer, Reason} -> + ?line case Reason of + {driver_failed, _} -> ?line ok; + driver_failed -> ?line ok; + _ -> ?line ?t:fail({unexpected_exit_reason, + Reason}) + end + end, + ?line test_server:timetrap_cancel(Dog), + ?line ok. + +otp_6224_loop() -> + receive _ -> ok after 0 -> ok end, + otp_6224_loop(). + + +-define(EXIT_STATUS_MSB_MAX_PROCS, 64). +-define(EXIT_STATUS_MSB_MAX_PORTS, 300). + +exit_status_multi_scheduling_block(doc) -> []; +exit_status_multi_scheduling_block(suite) -> []; +exit_status_multi_scheduling_block(Config) when is_list(Config) -> + ?line Repeat = 3, + ?line case ?t:os_type() of + {unix, _} -> + ?line Dog = ?t:timetrap(test_server:minutes(2*Repeat)), + ?line SleepSecs = 6, + try + lists:foreach(fun (_) -> + exit_status_msb_test(Config, + SleepSecs) + end, + lists:seq(1, Repeat)) + after + %% Wait for the system to recover (regardless + %% of success or not) otherwise later testcases + %% may unnecessarily fail. + ?t:timetrap_cancel(Dog), + receive after SleepSecs+500 -> ok end + end; + _ -> ?line {skip, "Not implemented for this OS"} + end. + +exit_status_msb_test(Config, SleepSecs) when is_list(Config) -> + %% + %% We want to start port programs from as many schedulers as possible + %% and we want these port programs to terminate while multi-scheduling + %% is blocked. + %% + ?line NoSchedsOnln = erlang:system_info(schedulers_online), + ?line Parent = self(), + ?line ?t:format("SleepSecs = ~p~n", [SleepSecs]), + ?line PortProg = "sleep " ++ integer_to_list(SleepSecs), + ?line Start = now(), + ?line NoProcs = case NoSchedsOnln of + NProcs when NProcs < ?EXIT_STATUS_MSB_MAX_PROCS -> + NProcs; + _ -> + ?EXIT_STATUS_MSB_MAX_PROCS + end, + ?line NoPortsPerProc = case 20*NoProcs of + TNPorts when TNPorts < ?EXIT_STATUS_MSB_MAX_PORTS -> 20; + _ -> ?EXIT_STATUS_MSB_MAX_PORTS div NoProcs + end, + ?line ?t:format("NoProcs = ~p~nNoPortsPerProc = ~p~n", + [NoProcs, NoPortsPerProc]), + ProcFun + = fun () -> + PrtSIds = lists:map( + fun (_) -> + erlang:yield(), + case catch open_port({spawn, PortProg}, + [exit_status]) of + Prt when is_port(Prt) -> + {Prt, + erlang:system_info(scheduler_id)}; + {'EXIT', {Err, _}} when Err == eagain; + Err == emfile -> + noop; + {'EXIT', Err} when Err == eagain; + Err == emfile -> + noop; + Error -> + ?t:fail(Error) + end + end, + lists:seq(1, NoPortsPerProc)), + SIds = lists:filter(fun (noop) -> false; + (_) -> true + end, + lists:map(fun (noop) -> noop; + ({_, SId}) -> SId + end, + PrtSIds)), + process_flag(scheduler, 0), + Parent ! {self(), started, SIds}, + lists:foreach( + fun (noop) -> + noop; + ({Port, _}) -> + receive + {Port, {exit_status, 0}} -> + ok; + {Port, {exit_status, Status}} when Status > 128 -> + %% Sometimes happens when we have created + %% too many ports. + ok; + {Port, {exit_status, _}} = ESMsg -> + {Port, {exit_status, 0}} = ESMsg + end + end, + PrtSIds), + Parent ! {self(), done} + end, + ?line Procs = lists:map(fun (N) -> + spawn_opt(ProcFun, + [link, + {scheduler, + (N rem NoSchedsOnln)+1}]) + end, + lists:seq(1, NoProcs)), + ?line SIds = lists:map(fun (P) -> + receive {P, started, SIds} -> SIds end + end, + Procs), + ?line StartedTime = timer:now_diff(now(), Start)/1000000, + ?line ?t:format("StartedTime = ~p~n", [StartedTime]), + ?line true = StartedTime < SleepSecs, + ?line erlang:system_flag(multi_scheduling, block), + ?line lists:foreach(fun (P) -> receive {P, done} -> ok end end, Procs), + ?line DoneTime = timer:now_diff(now(), Start)/1000000, + ?line ?t:format("DoneTime = ~p~n", [DoneTime]), + ?line true = DoneTime > SleepSecs, + ?line ok = verify_multi_scheduling_blocked(), + ?line erlang:system_flag(multi_scheduling, unblock), + ?line case {length(lists:usort(lists:flatten(SIds))), NoSchedsOnln} of + {N, N} -> + ?line ok; + {N, M} -> + ?line ?t:fail("Failed to create ports on all" + ++ integer_to_list(M) ++ " available" + "schedulers. Only created ports on " + ++ integer_to_list(N) ++ " schedulers.") + end. + +save_sid(SIds) -> + SId = erlang:system_info(scheduler_id), + case lists:member(SId, SIds) of + true -> SIds; + false -> [SId|SIds] + end. + +sid_proc(SIds) -> + NewSIds = save_sid(SIds), + receive + {From, want_sids} -> + From ! {self(), sids, NewSIds} + after 0 -> + sid_proc(NewSIds) + end. + +verify_multi_scheduling_blocked() -> + ?line Procs = lists:map(fun (_) -> + spawn_link(fun () -> sid_proc([]) end) + end, + lists:seq(1, 3*erlang:system_info(schedulers_online))), + ?line receive after 1000 -> ok end, + ?line SIds = lists:map(fun (P) -> + P ! {self(), want_sids}, + receive {P, sids, PSIds} -> PSIds end + end, + Procs), + ?line 1 = length(lists:usort(lists:flatten(SIds))), + ?line ok. + + +%%% Pinging functions. + +stream_ping(Config, Size, CmdLine, Options) -> + Data = random_packet(Size), + port_expect(Config, [{Data, [Data]}], 0, CmdLine, Options). + +ping(Config, Sizes, HSize, CmdLine, Options) -> + Actions = lists:map(fun(Size) -> + [$p|Packet] = random_packet(Size, "ping"), + {[$p|Packet], [[$P|Packet]]} + end, + Sizes), + port_expect(Config, Actions, HSize, CmdLine, Options). + +%% expect_input(Sizes, HSize, CmdLine, Options) +%% +%% Sizes = Size of packets to generated. +%% HSize = Header size: 1, 2, or 4 +%% CmdLine = Additional command line options. +%% Options = Addtional port options. + +expect_input(Config, Sizes, HSize, CmdLine, Options) -> + expect_input1(Config, Sizes, {HSize, CmdLine, Options}, [], []). + +expect_input1(Config, [0|Rest], Params, Expect, ReplyCommand) -> + expect_input1(Config, Rest, Params, [""|Expect], ["x0"|ReplyCommand]); +expect_input1(Config, [Size|Rest], Params, Expect, ReplyCommand) -> + Packet = random_packet(Size), + Fmt = io_lib:format("~c~p", [hd(Packet), Size]), + expect_input1(Config, Rest, Params, [Packet|Expect], [Fmt|ReplyCommand]); +expect_input1(Config, [], {HSize, CmdLine0, Options}, Expect, ReplyCommand) -> + CmdLine = build_cmd_line(CmdLine0, ReplyCommand, []), + port_expect(Config, [{false, lists:reverse(Expect)}], + HSize, CmdLine, Options). + +build_cmd_line(FixedCmdLine, [Cmd|Rest], []) -> + build_cmd_line(FixedCmdLine, Rest, [Cmd]); +build_cmd_line(FixedCmdLine, [Cmd|Rest], Result) -> + build_cmd_line(FixedCmdLine, Rest, [Cmd, $:|Result]); +build_cmd_line(FixedCmdLine, [], Result) -> + lists:flatten([FixedCmdLine, " -r", Result, " -n"]). + +%% port_expect(Actions, HSize, CmdLine, Options) +%% +%% Actions = [{Send, ExpectList}|Rest] +%% HSize = 0 (stream), or 1, 2, 4 (header size aka "packet bytes") +%% CmdLine = Command line for port_test. Don't include -h. +%% Options = Options for open_port/2. Don't include {packet, Number} or +%% or stream. +%% +%% Send = false | list() +%% ExpectList = List of lists or binaries. +%% +%% Returns the port. + +port_expect(Config, Actions, HSize, CmdLine, Options0) -> +% io:format("port_expect(~p, ~p, ~p, ~p)", +% [Actions, HSize, CmdLine, Options0]), + ?line PortTest = port_test(Config), + ?line Cmd = lists:concat([PortTest, " -h", HSize, " ", CmdLine]), + ?line PortType = + case HSize of + 0 -> stream; + _ -> {packet, HSize} + end, + ?line Options = [PortType|Options0], + ?line io:format("open_port({spawn, ~p}, ~p)", [Cmd, Options]), + ?line Port = open_port({spawn, Cmd}, Options), + ?line port_expect(Port, Actions, Options), + Port. + +port_expect(Port, [{Send, Expects}|Rest], Options) when is_list(Expects) -> + ?line port_send(Port, Send), + ?line IsBinaryPort = lists:member(binary, Options), + ?line Receiver = + case {lists:member(stream, Options), line_option(Options)} of + {false, _} -> fun receive_all/2; + {true,false} -> fun stream_receive_all/2; + {_, true} -> fun receive_all/2 + end, + ?line Receiver(Port, maybe_to_binary(Expects, IsBinaryPort)), + ?line port_expect(Port, Rest, Options); +port_expect(_, [], _) -> + ok. + +%%% Check for either line or {line,N} in option list +line_option([{line,_}|_]) -> + true; +line_option([line|_]) -> + true; +line_option([_|T]) -> + line_option(T); +line_option([]) -> + false. + +any_list_to_binary({Atom, List}) -> + {Atom, list_to_binary(List)}; +any_list_to_binary(List) -> + list_to_binary(List). + +maybe_to_binary(Expects, true) -> + lists:map(fun any_list_to_binary/1, Expects); +maybe_to_binary(Expects, false) -> + Expects. + +port_send(_Port, false) -> ok; +port_send(Port, Send) when is_list(Send) -> +% io:format("port_send(~p, ~p)", [Port, Send]), + Port ! {self(), {command, Send}}. + +receive_all(Port, [Expect|Rest]) -> +% io:format("receive_all(~p, [~p|Rest])", [Port, Expect]), + receive + {Port, {data, Expect}} -> + io:format("Received ~s", [format(Expect)]), + ok; + {Port, {data, Other}} -> + io:format("Received ~s; expected ~s", + [format(Other), format(Expect)]), + test_server:fail(bad_message); + Other -> + %% (We're not yet prepared for receiving both 'eol' and + %% 'exit_status'; remember that they may appear in any order.) + case {Expect, Rest, Other} of + {eof, [], {Port, eof}} -> + io:format("Received soft EOF.",[]), + ok; + {{exit_status, S}, [], {Port, {exit_status, S}}} -> + io:format("Received exit status ~p.",[S]), + ok; + _ -> +%%% io:format("Unexpected message: ~s", [format(Other)]), + io:format("Unexpected message: ~w", [Other]), + ?line test_server:fail(unexpected_message) + end + end, + receive_all(Port, Rest); +receive_all(_Port, []) -> + ok. + +stream_receive_all(Port, [Expect]) -> + stream_receive_all1(Port, Expect). + +stream_receive_all1(_Port, Empty) when is_binary(Empty), size(Empty) == 0 -> + ok; +stream_receive_all1(_Port, []) -> + ok; +stream_receive_all1(Port, Expect) -> + receive + {Port, {data, Data}} -> + Remaining = compare(Data, Expect), + stream_receive_all1(Port, Remaining); + Other -> + test_server:fail({bad_message, Other}) + end. + +compare(B1, B2) when is_binary(B1), is_binary(B2), byte_size(B1) =< byte_size(B2) -> + case split_binary(B2, size(B1)) of + {B1,Remaining} -> + Remaining; + _Other -> + test_server:fail(nomatch) + end; +compare(B1, B2) when is_binary(B1), is_binary(B2) -> + test_server:fail(too_much_data); +compare([X|Rest1], [X|Rest2]) -> + compare(Rest1, Rest2); +compare([_|_], [_|_]) -> + test_server:fail(nomatch); +compare([], Remaining) -> + Remaining; +compare(_Data, []) -> + test_server:fail(too_much_data). + +maybe_to_list(Bin) when is_binary(Bin) -> + binary_to_list(Bin); +maybe_to_list(List) -> + List. + +format({Eol,List}) -> + io_lib:format("tuple<~w,~s>",[Eol, maybe_to_list(List)]); +format(List) when is_list(List) -> + case list_at_least(50, List) of + true -> + io_lib:format("\"~-50s...\"", [List]); + false -> + io_lib:format("~p", [List]) + end; +format(Bin) when is_binary(Bin), size(Bin) >= 50 -> + io_lib:format("binary<~-50s...>", [binary_to_list(Bin, 1, 50)]); +format(Bin) when is_binary(Bin) -> + io_lib:format("binary<~s>", [binary_to_list(Bin)]). + + +list_at_least(Number, [_|Rest]) when Number > 0 -> + list_at_least(Number-1, Rest); +list_at_least(Number, []) when Number > 0 -> + false; +list_at_least(0, _List) -> true. + + +%%% Utility functions. + +random_packet(Size) -> + random_packet(Size, ""). + +random_packet(Size, Prefix) -> + build_packet(Size-length(Prefix), lists:reverse(Prefix), random_char()). + +build_packet(0, Result, _NextChar) -> + lists:reverse(Result); +build_packet(Left, Result, NextChar0) -> + NextChar = + if + NextChar0 >= 126 -> + 33; + true -> + NextChar0+1 + end, + build_packet(Left-1, [NextChar0|Result], NextChar). + +sizes() -> + case os:type() of + vxworks -> + % don't stress VxWorks too much + [10, 13, 64, 127, 128, 255, 256, 1023, 1024, + 8191, 8192, 16383, 16384]; + _ -> + [10, 13, 64, 127, 128, 255, 256, 1023, 1024, + 32767, 32768, 65535, 65536] + end. + +sizes(Header_Size) -> + sizes(Header_Size, sizes(), []). + +sizes(1, [Packet_Size|Rest], Result) when Packet_Size < 256 -> + sizes(1, Rest, [Packet_Size|Result]); +sizes(2, [Packet_Size|Rest], Result) when Packet_Size < 65536 -> + sizes(2, Rest, [Packet_Size|Result]); +sizes(4, [Packet_Size|Rest], Result) -> + sizes(4, Rest, [Packet_Size|Result]); +sizes(_, _, Result) -> + Result. + +random_char() -> + random_char("abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789"). + +random_char(Chars) -> + lists:nth(uniform(length(Chars)), Chars). + +uniform(N) -> + case get(random_seed) of + undefined -> + {X, Y, Z} = Seed = time(), + io:format("Random seed = ~p\n",[Seed]), + random:seed(X, Y, Z); + _ -> + ok + end, + random:uniform(N). + +fun_spawn(Fun) -> + fun_spawn(Fun, []). + +fun_spawn(Fun, Args) -> + spawn_link(erlang, apply, [Fun, Args]). + +port_test(Config) when is_list(Config) -> + ?line filename:join(?config(data_dir, Config), "port_test"). + + +ports(doc) -> "Test that erlang:ports/0 returns a consistent snapshot of ports"; +ports(suite) -> []; +ports(Config) when is_list(Config) -> + ?line Path = ?config(data_dir, Config), + ?line ok = load_driver(Path, "exit_drv"), + + receive after 1000 -> ok end, % Wait for other ports to stabilize + + ?line OtherPorts = erlang:ports(), + io:format("Other ports: ~p\n",[OtherPorts]), + MaxPorts = 1024 - length(OtherPorts), + + TrafficPid = spawn_link(fun() -> ports_traffic(MaxPorts) end), + + ports_snapshots(100, TrafficPid, OtherPorts), + TrafficPid ! {self(),die}, + ?line receive {TrafficPid, dead} -> ok end, + ok. + +ports_snapshots(0, _, _) -> + ok; +ports_snapshots(Iter, TrafficPid, OtherPorts) -> + + TrafficPid ! start, + ?line receive after 1 -> ok end, + + Snapshot = erlang:ports(), + + TrafficPid ! {self(), stop}, + ?line receive {TrafficPid, EventList, TrafficPorts} -> ok end, + + %%io:format("Snapshot=~p\n", [Snapshot]), + ports_verify(Snapshot, OtherPorts ++ TrafficPorts, EventList), + + ports_snapshots(Iter-1, TrafficPid, OtherPorts). + + +ports_traffic(MaxPorts) -> + ports_traffic_stopped(MaxPorts, {[],0}). + +ports_traffic_stopped(MaxPorts, {PortList, PortCnt}) -> + receive + start -> + %%io:format("Traffic started in ~p\n",[self()]), + ports_traffic_started(MaxPorts, {PortList, PortCnt}, []); + {Pid,die} -> + ?line lists:foreach(fun(Port)-> erlang:port_close(Port) end, + PortList), + Pid ! {self(),dead} + end. + +ports_traffic_started(MaxPorts, {PortList, PortCnt}, EventList) -> + receive + {Pid, stop} -> + %%io:format("Traffic stopped in ~p\n",[self()]), + Pid ! {self(), EventList, PortList}, + ports_traffic_stopped(MaxPorts, {PortList, PortCnt}) + + after 0 -> + ports_traffic_do(MaxPorts, {PortList, PortCnt}, EventList) + end. + +ports_traffic_do(MaxPorts, {PortList, PortCnt}, EventList) -> + N = uniform(MaxPorts), + case N > PortCnt of + true -> % Open port + ?line P = open_port({spawn, "exit_drv"}, []), + %%io:format("Created port ~p\n",[P]), + ports_traffic_started(MaxPorts, {[P|PortList], PortCnt+1}, + [{open,P}|EventList]); + + false -> % Close port + ?line P = lists:nth(N, PortList), + %%io:format("Close port ~p\n",[P]), + ?line true = erlang:port_close(P), + ports_traffic_started(MaxPorts, {lists:delete(P,PortList), PortCnt-1}, + [{close,P}|EventList]) + end. + +ports_verify(Ports, PortsAfter, EventList) -> + %%io:format("Candidate=~p\nEvents=~p\n", [PortsAfter, EventList]), + case lists:sort(Ports) =:= lists:sort(PortsAfter) of + true -> + io:format("Snapshot of ~p ports verified ok.\n",[length(Ports)]), + ok; + false -> + %% Note that we track the event list "backwards", undoing open/close: + case EventList of + [{open,P} | Tail] -> + ports_verify(Ports, lists:delete(P,PortsAfter), Tail); + + [{close,P} | Tail] -> + ports_verify(Ports, [P | PortsAfter], Tail); + + [] -> + ?line test_server:fail("Inconsistent snapshot from erlang:ports()") + end + end. + +load_driver(Dir, Driver) -> + case erl_ddll:load_driver(Dir, Driver) of + ok -> ok; + {error, Error} = Res -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + Res + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/process_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/process_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/process_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/process_SUITE.erl 2009-11-20 13:30:08.000000000 +0000 @@ -0,0 +1,2067 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(process_SUITE). + +%% Tests processes, trapping exit messages and the BIFs: +%% exit/1 +%% exit/2 +%% process_info/1,2 +%% register/2 (partially) + +-include("test_server.hrl"). + +-define(heap_binary_size, 64). + +-export([all/1, spawn_with_binaries/1, + t_exit_1/1, t_exit_2/1, t_exit_2_other/1, t_exit_2_other_normal/1, + self_exit/1, normal_suicide_exit/1, abnormal_suicide_exit/1, + t_exit_2_catch/1, trap_exit_badarg/1, trap_exit_badarg_in_bif/1, + exit_and_timeout/1, exit_twice/1, + t_process_info/1, process_info_other_msg/1, + process_info_other_dist_msg/1, + process_info_2_list/1, process_info_lock_reschedule/1, + process_info_lock_reschedule2/1, + bump_reductions/1, low_prio/1, binary_owner/1, yield/1, yield2/1, + process_status_exiting/1, + otp_4725/1, bad_register/1, garbage_collect/1, otp_6237/1, + process_info_messages/1, process_flag_badarg/1, + processes_large_tab/1, processes_default_tab/1, processes_small_tab/1, + processes_this_tab/1, processes_apply_trap/1, + processes_last_call_trap/1, processes_gc_trap/1, + processes_term_proc_list/1, processes_bif/1, + otp_7738/1, otp_7738_waiting/1, otp_7738_suspended/1, + otp_7738_resume/1]). +-export([prio_server/2, prio_client/2]). + +-export([init_per_testcase/2, fin_per_testcase/2, end_per_suite/1]). + +-export([hangaround/2, processes_bif_test/0, do_processes/1, + processes_term_proc_list_test/1]). + +all(suite) -> + [spawn_with_binaries, t_exit_1, t_exit_2, + trap_exit_badarg, trap_exit_badarg_in_bif, + t_process_info, process_info_other_msg, process_info_other_dist_msg, + process_info_2_list, + process_info_lock_reschedule, process_info_lock_reschedule2, + process_status_exiting, + bump_reductions, low_prio, yield, yield2, otp_4725, bad_register, + garbage_collect, process_info_messages, process_flag_badarg, otp_6237, + processes_bif, + otp_7738]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(10)), + [{watchdog, Dog},{testcase, Func}|Config]. + +fin_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +end_per_suite(Config) -> + catch erts_debug:set_internal_state(available_internal_state, false), + Config. + +fun_spawn(Fun) -> + spawn_link(erlang, apply, [Fun, []]). + +%% Tests that binaries as arguments to spawn/3 doesn't leak +%% (unclear if this test case will actually prove anything on +%% a modern computer with lots of memory). +spawn_with_binaries(Config) when is_list(Config) -> + ?line L = lists:duplicate(2048, 42), + ?line TwoMeg = lists:duplicate(1024, L), + ?line Fun = fun() -> spawn(?MODULE, binary_owner, [list_to_binary(TwoMeg)]), + receive after 1 -> ok end end, + ?line Iter = case test_server:purify_is_running() of + true -> 10; + false -> 150 + end, + ?line test_server:do_times(Iter, Fun), + ok. + +binary_owner(Bin) when is_binary(Bin) -> + ok. + +%% Tests exit/1 with a big message. +t_exit_1(Config) when is_list(Config) -> + ?line start_spawner(), + ?line Dog = test_server:timetrap(test_server:seconds(20)), + ?line process_flag(trap_exit, true), + ?line test_server:do_times(10, fun t_exit_1/0), + ?line test_server:timetrap_cancel(Dog), + ?line stop_spawner(), + ok. + +t_exit_1() -> + ?line Pid = fun_spawn(fun() -> exit(kb_128()) end), + ?line Garbage = kb_128(), + ?line receive + {'EXIT', Pid, Garbage} -> ok + end. + +t_exit_2(suite) -> [t_exit_2_other, t_exit_2_other_normal, + self_exit, normal_suicide_exit, + abnormal_suicide_exit, t_exit_2_catch, + exit_and_timeout, exit_twice]. + +%% Tests exit/2 with a lot of data in the exit message. +t_exit_2_other(Config) when is_list(Config) -> + ?line start_spawner(), + ?line Dog = test_server:timetrap(test_server:seconds(20)), + ?line process_flag(trap_exit, true), + ?line test_server:do_times(10, fun t_exit_2_other/0), + ?line test_server:timetrap_cancel(Dog), + ?line stop_spawner(), + ok. + +t_exit_2_other() -> + ?line Pid = fun_spawn(fun() -> receive x -> ok end end), + ?line Garbage = kb_128(), + ?line exit(Pid, Garbage), + ?line receive + {'EXIT', Pid, Garbage} -> ok + end. + +%% Tests that exit(Pid, normal) does not kill another process.; +t_exit_2_other_normal(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(20)), + ?line process_flag(trap_exit, true), + ?line Pid = fun_spawn(fun() -> receive x -> ok end end), + ?line exit(Pid, normal), + ?line receive + {'EXIT', Pid, Reason} -> + ?line test_server:fail({process_died, Reason}) + after 1000 -> + ok + end, + ?line case process_info(Pid) of + undefined -> + test_server:fail(process_died_on_normal); + List when is_list(List) -> + ok + end, + exit(Pid, kill), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests that we can trap an exit message sent with exit/2 from +%% the same process. +self_exit(Config) when is_list(Config) -> + ?line start_spawner(), + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line process_flag(trap_exit, true), + ?line test_server:do_times(200, fun self_exit/0), + ?line test_server:timetrap_cancel(Dog), + ?line stop_spawner(), + ok. + +self_exit() -> + ?line Garbage = eight_kb(), + ?line P = self(), + ?line true = exit(P, Garbage), + ?line receive + {'EXIT', P, Garbage} -> ok + end. + +%% Tests exit(self(), normal) is equivalent to exit(normal) for a process +%% that doesn't trap exits. +normal_suicide_exit(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Pid = fun_spawn(fun() -> exit(self(), normal) end), + ?line receive + {'EXIT', Pid, normal} -> ok; + Other -> test_server:fail({bad_message, Other}) + end. + +%% Tests exit(self(), Term) is equivalent to exit(Term) for a process +%% that doesn't trap exits."; +abnormal_suicide_exit(Config) when is_list(Config) -> + ?line Garbage = eight_kb(), + ?line process_flag(trap_exit, true), + ?line Pid = fun_spawn(fun() -> exit(self(), Garbage) end), + ?line receive + {'EXIT', Pid, Garbage} -> ok; + Other -> test_server:fail({bad_message, Other}) + end. + +%% Tests that exit(self(), die) cannot be catched. +t_exit_2_catch(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Pid = fun_spawn(fun() -> catch exit(self(), die) end), + ?line receive + {'EXIT', Pid, normal} -> + test_server:fail(catch_worked); + {'EXIT', Pid, die} -> + ok; + Other -> + test_server:fail({bad_message, Other}) + end. + +%% Tests trapping of an 'EXIT' message generated by a bad argument to +%% the abs/1 bif. The 'EXIT' message will intentionally be very big. +trap_exit_badarg(Config) when is_list(Config) -> + ?line start_spawner(), + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line process_flag(trap_exit, true), + ?line test_server:do_times(10, fun trap_exit_badarg/0), + ?line test_server:timetrap_cancel(Dog), + ?line stop_spawner(), + ok. + +trap_exit_badarg() -> + ?line Pid = fun_spawn(fun() -> bad_guy(kb_128()) end), + ?line Garbage = kb_128(), + ?line receive + {'EXIT', Pid, {badarg,[{erlang,abs,[Garbage]},{?MODULE,bad_guy,1}|_]}} -> + ok; + Other -> + ?line ok = io:format("Bad EXIT message: ~P", [Other, 30]), + ?line test_server:fail(bad_exit_message) + end. + +bad_guy(Arg) -> + ?line abs(Arg). + + +kb_128() -> + Eight = eight_kb(), + {big_binary(), + Eight, Eight, Eight, Eight, Eight, Eight, Eight, Eight, + big_binary(), + Eight, Eight, Eight, Eight, Eight, Eight, Eight, Eight, + big_binary()}. + +eight_kb() -> + %%% This is really much more than eight kb, so vxworks platforms + %%% gets away with 1/8 of the other platforms (due to limited + %%% memory resources). + B64 = case os:type() of + vxworks -> + ?line lists:seq(1, 8); + _ -> + ?line lists:seq(1, 64) + end, + ?line B512 = {<<1>>,B64,<<2,3>>,B64,make_unaligned_sub_binary(<<4,5,6,7,8,9>>), + B64,make_sub_binary([1,2,3,4,5,6]), + B64,make_sub_binary(lists:seq(1, ?heap_binary_size+1)), + B64,B64,B64,B64,big_binary()}, + ?line lists:duplicate(8, {B512,B512}). + +big_binary() -> + big_binary(10, [42]). +big_binary(0, Acc) -> + list_to_binary(Acc); +big_binary(N, Acc) -> + big_binary(N-1, [Acc|Acc]). + +%% Test receiving an EXIT message when spawning a BIF with bad arguments. +trap_exit_badarg_in_bif(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line process_flag(trap_exit, true), + ?line test_server:do_times(10, fun trap_exit_badarg_bif/0), + ?line test_server:timetrap_cancel(Dog), + ok. + +trap_exit_badarg_bif() -> + ?line Pid = spawn_link(erlang, node, [1]), + ?line receive + {'EXIT', Pid, {badarg, _}} -> + ok; + Other -> + ?line test_server:fail({unexpected, Other}) + end. + +%% The following sequences of events have crasched Beam. +%% +%% 1) An exit is sent to a process which is currently not running. +%% The exit reason will (on purpose) overwrite the message queue +%% pointer. +%% 2) Before the process is scheduled in, it receives a timeout (from +%% a 'receive after'). +%% 3) The process will crash the next time it executes 'receive'. + +exit_and_timeout(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(20)), + + ?line process_flag(trap_exit, true), + ?line Parent = self(), + ?line Low = fun_spawn(fun() -> eat_low(Parent) end), + ?line High = fun_spawn(fun() -> eat_high(Low) end), + ?line eat_wait_for(Low, High), + + ?line test_server:timetrap_cancel(Dog), + ok. + + +eat_wait_for(Low, High) -> + ?line receive + {'EXIT', Low, {you, are, dead}} -> + ok; + {'EXIT', High, normal} -> + eat_wait_for(Low, High); + Other -> + test_server:fail({bad_message, Other}) + end. + +eat_low(_Parent) -> + receive + after 2500 -> + ok + end, + receive + Any -> + io:format("Received: ~p\n", [Any]) + after 1000 -> + ok + end. + +eat_high(Low) -> + process_flag(priority, high), + receive after 1000 -> ok end, + exit(Low, {you, are, dead}), + {_, Sec, _} = now(), + loop(Sec, Sec). + +%% Busy loop for 5 seconds. + +loop(OrigSec, CurrentSec) when CurrentSec < OrigSec+5 -> + {_, NewSec, _} = now(), + loop(OrigSec, NewSec); +loop(_, _) -> + ok. + + +%% Tries to send two different exit messages to a process. +%% (The second one should be ignored.) +exit_twice(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(20)), + + ?line process_flag(trap_exit, true), + ?line Low = fun_spawn(fun etwice_low/0), + ?line High = fun_spawn(fun() -> etwice_high(Low) end), + ?line etwice_wait_for(Low, High), + + ?line test_server:timetrap_cancel(Dog), + ok. + +etwice_wait_for(Low, High) -> + ?line receive + {'EXIT', Low, first} -> + ok; + {'EXIT', Low, Other} -> + test_server:fail({wrong_exit_reason, Other}); + {'EXIT', High, normal} -> + etwice_wait_for(Low, High); + Other -> + test_server:fail({bad_message, Other}) + end. + +etwice_low() -> + etwice_low(). + +etwice_high(Low) -> + process_flag(priority, high), + exit(Low, first), + exit(Low, second). + +%% Tests the process_info/1 BIF. +t_process_info(Config) when is_list(Config) -> + ?line [] = process_info(self(), registered_name), + ?line register(my_name, self()), + ?line {registered_name, my_name} = process_info(self(), registered_name), + ?line {status, running} = process_info(self(), status), + ?line {current_function, {?MODULE, t_process_info, 1}} = + process_info(self(), current_function), + ?line Gleader = group_leader(), + ?line {group_leader, Gleader} = process_info(self(), group_leader), + ?line {'EXIT',{badarg,_Info}} = (catch process_info('not_a_pid')), + ok. + +%% Tests the process_info/1 BIF on another process with messages. +process_info_other_msg(Config) when is_list(Config) -> + Self = self(), + ?line Pid = spawn_link(fun() -> other_process(Self) end), + receive + {go_ahead,Pid} -> ok + end, + + ?line Own = {my,own,message}, + + ?line {messages,[Own]} = process_info(Pid, messages), + + ?line Garbage = kb_128(), + ?line MsgA = {a,Garbage}, + ?line MsgB = {b,Garbage}, + ?line MsgC = {c,Garbage}, + ?line MsgD = {d,Garbage}, + ?line MsgE = {e,Garbage}, + + ?line Pid ! MsgA, + ?line {messages,[Own,MsgA]} = process_info(Pid, messages), + ?line Pid ! MsgB, + ?line {messages,[Own,MsgA,MsgB]} = process_info(Pid, messages), + ?line Pid ! MsgC, + ?line {messages,[Own,MsgA,MsgB,MsgC]} = process_info(Pid, messages), + ?line Pid ! MsgD, + ?line {messages,[Own,MsgA,MsgB,MsgC,MsgD]} = process_info(Pid, messages), + ?line Pid ! MsgE, + ?line {messages,[Own,MsgA,MsgB,MsgC,MsgD,MsgE]=All} = process_info(Pid, messages), + ?line {memory,BytesOther} = process_info(Pid, memory), + ?line {memory,BytesSelf} = process_info(self(), memory), + + io:format("Memory ~p: ~p\n", [Pid,BytesOther]), + io:format("Memory ~p (self): ~p\n", [self(),BytesSelf]), + + [Own,MsgA,MsgB,MsgC,MsgD,MsgE] = All, + + ?line Pid ! {self(),empty}, + ?line receive + empty -> ok + end, + ?line {messages,[]} = process_info(Pid, messages), + ?line Pid ! stop, + ok. + +process_info_other_dist_msg(Config) when is_list(Config) -> + %% + %% Check that process_info can handle messages that have not been + %% decoded yet. + %% + ?line {ok, Node} = start_node(Config), + ?line Self = self(), + ?line Pid = spawn_link(fun() -> other_process(Self) end), + ?line receive {go_ahead,Pid} -> ok end, + + ?line Own = {my,own,message}, + + ?line {messages,[Own]} = process_info(Pid, messages), + ?line Garbage = kb_128(), + ?line MsgA = {a,self(),Garbage}, + ?line MsgB = {b,self(),Garbage}, + ?line MsgC = {c,self(),Garbage}, + ?line MsgD = {d,self(),Garbage}, + ?line MsgE = {e,self(),Garbage}, + + %% We don't want the other process to decode messages itself + %% therefore we suspend it. + ?line true = erlang:suspend_process(Pid), + ?line spawn_link(Node, fun () -> + Pid ! MsgA, + Pid ! MsgB, + Pid ! MsgC, + Self ! check_abc + end), + ?line receive check_abc -> ok end, + ?line [{status,suspended}, + {messages,[Own,MsgA,MsgB,MsgC]}, + {status,suspended}]= process_info(Pid, [status,messages,status]), + ?line spawn_link(Node, fun () -> + Pid ! MsgD, + Pid ! MsgE, + Self ! check_de + end), + ?line receive check_de -> ok end, + ?line {messages,[Own,MsgA,MsgB,MsgC,MsgD,MsgE]=All} + = process_info(Pid, messages), + ?line true = erlang:resume_process(Pid), + ?line Pid ! {self(), get_all_messages}, + ?line receive + {all_messages, AllMsgs} -> + ?line All = AllMsgs + end, + ?line {messages,[]} = process_info(Pid, messages), + ?line Pid ! stop, + ?line stop_node(Node), + ?line ok. + + +other_process(Parent) -> + self() ! {my,own,message}, + Parent ! {go_ahead,self()}, + other_process_1(). + +other_process_1() -> + receive + {Parent,get_all_messages} -> + Parent ! {all_messages, get_all_messages()}, + other_process_1(); + {Parent,empty} -> + receive_all(), + Parent ! empty, + other_process_1(); + stop -> ok + end. + +get_all_messages() -> + get_all_messages([]). + +get_all_messages(Msgs) -> + receive + Msg -> + get_all_messages([Msg|Msgs]) + after 0 -> + lists:reverse(Msgs) + end. + +receive_all() -> + receive + _ -> receive_all() + after 0 -> ok + end. + +chk_pi_order([],[]) -> + ok; +chk_pi_order([{Arg, _}| Values], [Arg|Args]) -> + chk_pi_order(Values, Args). + +process_info_2_list(doc) -> + []; +process_info_2_list(suite) -> + []; +process_info_2_list(Config) when is_list(Config) -> + ?line Proc = spawn(fun () -> + receive after infinity -> ok end end), + register(process_SUITE_process_info_2_list1, self()), + register(process_SUITE_process_info_2_list2, Proc), + ?line erts_debug:set_internal_state(available_internal_state,true), + ?line AllArgs = erts_debug:get_internal_state(process_info_args), + ?line A1 = lists:sort(AllArgs) ++ [status] ++ lists:reverse(AllArgs), + + %% Verify that argument is accepted as single atom + ?line lists:foreach(fun (A) -> + ?line {A, _} = process_info(Proc, A), + ?line {A, _} = process_info(self(), A) + end, + A1), + + %% Verify that order is preserved + ?line ok = chk_pi_order(process_info(self(), A1), A1), + ?line ok = chk_pi_order(process_info(Proc, A1), A1), + + %% Small arg list + ?line A2 = [status, stack_size, trap_exit, priority], + ?line [{status, _}, {stack_size, _}, {trap_exit, _}, {priority, _}] + = process_info(Proc, A2), + ?line [{status, _}, {stack_size, _}, {trap_exit, _}, {priority, _}] + = process_info(self(), A2), + + %% Huge arg list (note values are shared) + ?line A3 = lists:duplicate(5000,backtrace), + ?line V3 = process_info(Proc, A3), + ?line 5000 = length(V3), + ?line lists:foreach(fun ({backtrace, _}) -> ok end, V3), + ?line ok. + +process_info_lock_reschedule(doc) -> + []; +process_info_lock_reschedule(suite) -> + []; +process_info_lock_reschedule(Config) when is_list(Config) -> + %% We need a process that is running and an item that requires + %% process_info to take the main process lock. + ?line Target1 = spawn_link(fun tok_loop/0), + ?line Name1 = process_info_lock_reschedule_running, + ?line register(Name1, Target1), + ?line Target2 = spawn_link(fun () -> receive after infinity -> ok end end), + ?line Name2 = process_info_lock_reschedule_waiting, + ?line register(Name2, Target2), + ?line PI = fun(_) -> + ?line erlang:yield(), + ?line [{registered_name, Name1}] + = process_info(Target1, [registered_name]), + ?line [{registered_name, Name2}] + = process_info(Target2, [registered_name]), + ?line erlang:yield(), + ?line {registered_name, Name1} + = process_info(Target1, registered_name), + ?line {registered_name, Name2} + = process_info(Target2, registered_name), + ?line erlang:yield(), + ?line [{registered_name, Name1}| _] + = process_info(Target1), + ?line [{registered_name, Name2}| _] + = process_info(Target2) + end, + ?line lists:foreach(PI, lists:seq(1,1000)), + %% Make sure Target1 still is willing to "tok loop" + ?line case process_info(Target1, status) of + {status, OkStatus} when OkStatus == runnable; + OkStatus == running; + OkStatus == garbage_collecting -> + ?line unlink(Target1), + ?line unlink(Target2), + ?line exit(Target1, bang), + ?line exit(Target2, bang), + ?line OkStatus; + {status, BadStatus} -> + ?line ?t:fail(BadStatus) + end. + +pi_loop(_Name, _Pid, 0) -> + ok; +pi_loop(Name, Pid, N) -> + {registered_name, Name} = process_info(Pid, registered_name), + pi_loop(Name, Pid, N-1). + +process_info_lock_reschedule2(doc) -> + []; +process_info_lock_reschedule2(suite) -> + []; +process_info_lock_reschedule2(Config) when is_list(Config) -> + ?line Parent = self(), + ?line Fun = fun () -> + receive {go, Name, Pid} -> ok end, + pi_loop(Name, Pid, 10000), + Parent ! {done, self()}, + receive after infinity -> ok end + end, + ?line P1 = spawn_link(Fun), + ?line N1 = process_info_lock_reschedule2_1, + ?line true = register(N1, P1), + ?line P2 = spawn_link(Fun), + ?line N2 = process_info_lock_reschedule2_2, + ?line true = register(N2, P2), + ?line P3 = spawn_link(Fun), + ?line N3 = process_info_lock_reschedule2_3, + ?line true = register(N3, P3), + ?line P4 = spawn_link(Fun), + ?line N4 = process_info_lock_reschedule2_4, + ?line true = register(N4, P4), + ?line P5 = spawn_link(Fun), + ?line N5 = process_info_lock_reschedule2_5, + ?line true = register(N5, P5), + ?line P6 = spawn_link(Fun), + ?line N6 = process_info_lock_reschedule2_6, + ?line true = register(N6, P6), + ?line P1 ! {go, N2, P2}, + ?line P2 ! {go, N1, P1}, + ?line P3 ! {go, N1, P1}, + ?line P4 ! {go, N1, P1}, + ?line P5 ! {go, N6, P6}, + ?line P6 ! {go, N5, P5}, + ?line receive {done, P1} -> ok end, + ?line receive {done, P2} -> ok end, + ?line receive {done, P3} -> ok end, + ?line receive {done, P4} -> ok end, + ?line receive {done, P5} -> ok end, + ?line receive {done, P6} -> ok end, + ?line unlink(P1), exit(P1, bang), + ?line unlink(P2), exit(P2, bang), + ?line unlink(P3), exit(P3, bang), + ?line unlink(P4), exit(P4, bang), + ?line unlink(P5), exit(P5, bang), + ?line unlink(P6), exit(P6, bang), + ?line ok. + +process_status_exiting(Config) when is_list(Config) -> + %% Make sure that erts_debug:get_internal_state({process_status,P}) + %% returns exiting if it is in status P_EXITING. + ?line erts_debug:set_internal_state(available_internal_state,true), + ?line Prio = process_flag(priority, max), + ?line P = spawn_opt(fun () -> receive after infinity -> ok end end, + [{priority, normal}]), + ?line erlang:yield(), + %% The tok_loop processes are here to make it hard for the exiting + %% process to be scheduled in for exit... + ?line TokLoops = lists:map(fun (_) -> + spawn_opt(fun tok_loop/0, + [link,{priority, high}]) + end, + lists:seq(1, erlang:system_info(schedulers_online))), + ?line exit(P, boom), + ?line wait_until( + fun () -> + exiting =:= erts_debug:get_internal_state({process_status,P}) + end), + ?line lists:foreach(fun (Tok) -> unlink(Tok), exit(Tok,bang) end, TokLoops), + ?line process_flag(priority, Prio), + ?line ok. + +otp_4725(Config) when is_list(Config) -> + ?line Tester = self(), + ?line Ref1 = make_ref(), + ?line Pid1 = spawn_opt(fun () -> + Tester ! {Ref1, process_info(self())}, + receive + Ref1 -> bye + end + end, + [link, + {priority, max}, + {fullsweep_after, 600}]), + ?line receive + {Ref1, ProcInfo1A} -> + ?line ProcInfo1B = process_info(Pid1), + ?line Pid1 ! Ref1, + ?line check_proc_infos(ProcInfo1A, ProcInfo1B) + end, + ?line Ref2 = make_ref(), + ?line Pid2 = spawn_opt(fun () -> + Tester ! {Ref2, process_info(self())}, + receive + Ref2 -> bye + end + end, + []), + ?line receive + {Ref2, ProcInfo2A} -> + ?line ProcInfo2B = process_info(Pid2), + ?line Pid2 ! Ref2, + ?line check_proc_infos(ProcInfo2A, ProcInfo2B) + end, + ?line ok. + +check_proc_infos(A, B) -> + ?line IC = lists:keysearch(initial_call, 1, A), + ?line IC = lists:keysearch(initial_call, 1, B), + + ?line L = lists:keysearch(links, 1, A), + ?line L = lists:keysearch(links, 1, B), + + ?line D = lists:keysearch(dictionary, 1, A), + ?line D = lists:keysearch(dictionary, 1, B), + + ?line TE = lists:keysearch(trap_exit, 1, A), + ?line TE = lists:keysearch(trap_exit, 1, B), + + ?line EH = lists:keysearch(error_handler, 1, A), + ?line EH = lists:keysearch(error_handler, 1, B), + + ?line P = lists:keysearch(priority, 1, A), + ?line P = lists:keysearch(priority, 1, B), + + ?line GL = lists:keysearch(group_leader, 1, A), + ?line GL = lists:keysearch(group_leader, 1, B), + + ?line GC = lists:keysearch(garbage_collection, 1, A), + ?line GC = lists:keysearch(garbage_collection, 1, B), + + ?line ok. + + +%% Dummies. + +start_spawner() -> + ok. + +stop_spawner() -> + ok. + +%% Tests erlang:bump_reductions/1. +bump_reductions(Config) when is_list(Config) -> + ?line erlang:garbage_collect(), + ?line receive after 1 -> ok end, % Clear reductions. + ?line {reductions,R1} = process_info(self(), reductions), + ?line true = erlang:bump_reductions(100), + ?line {reductions,R2} = process_info(self(), reductions), + ?line case R2-R1 of + Diff when Diff < 100 -> + ?line ok = io:format("R1 = ~w, R2 = ~w", [R1, R2]), + ?line test_server:fail({small_diff, Diff}); + Diff when Diff > 110 -> + ?line ok = io:format("R1 = ~w, R2 = ~w", [R1, R2]), + ?line test_server:fail({big_diff, Diff}); + Diff -> + io:format("~p\n", [Diff]), + ok + end, + + %% Make sure that a bignum reduction doesn't crash the emulator (32-bit CPU). + bump_big(R2, 16#08000000). + +bump_big(Prev, Limit) -> + ?line true = erlang:bump_reductions(100000), %Limited to CONTEXT_REDUCTIONS. + ?line case process_info(self(), reductions) of + {reductions,Big} when is_integer(Big), Big > Limit -> + ?line erlang:garbage_collect(), + ?line io:format("~p\n", [Big]); + {reductions,R} when is_integer(R), R > Prev -> + bump_big(R, Limit) + end, + ok. + +%% Priority 'low' should be mixed with 'normal' using a factor of +%% about 8. (OTP-2644) +low_prio(Config) when is_list(Config) -> + case erlang:system_info(schedulers_online) of + 1 -> + ?line ok = low_prio_test(Config); + _ -> + ?line erlang:system_flag(multi_scheduling, block), + ?line ok = low_prio_test(Config), + ?line erlang:system_flag(multi_scheduling, unblock), + ?line {comment, + "Test not written for SMP runtime system. " + "Multi scheduling blocked during test."} + end. + +low_prio_test(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line S = spawn_link(?MODULE, prio_server, [0, 0]), + ?line PCs = spawn_prio_clients(S, erlang:system_info(schedulers_online)), + ?line timer:sleep(2000), + ?line lists:foreach(fun (P) -> exit(P, kill) end, PCs), + ?line S ! exit, + ?line receive {'EXIT', S, {A, B}} -> check_prio(A, B) end, + ok. + +check_prio(A, B) -> + ?line Prop = A/B, + ?line ok = io:format("Low=~p, High=~p, Prop=~p\n", [A, B, Prop]), + + %% It isn't 1/8, it's more like 0.3, but let's check that + %% the low-prio processes get some little chance to run at all. + ?line true = (Prop < 1.0), + ?line true = (Prop > 1/32). + +prio_server(A, B) -> + receive + low -> + prio_server(A+1, B); + normal -> + prio_server(A, B+1); + exit -> + exit({A, B}) + end. + +spawn_prio_clients(_, 0) -> + []; +spawn_prio_clients(S, N) -> + [spawn_opt(?MODULE, prio_client, [S, normal], [link, {priority,normal}]), + spawn_opt(?MODULE, prio_client, [S, low], [link, {priority,low}]) + | spawn_prio_clients(S, N-1)]. + +prio_client(S, Prio) -> + S ! Prio, + prio_client(S, Prio). + +make_sub_binary(Bin) when is_binary(Bin) -> + {_,B} = split_binary(list_to_binary([0,1,3,Bin]), 3), + B; +make_sub_binary(List) -> + make_sub_binary(list_to_binary(List)). + +make_unaligned_sub_binary(Bin0) -> + Bin1 = <<0:3,Bin0/binary,31:5>>, + Sz = size(Bin0), + <<0:3,Bin:Sz/binary,31:5>> = id(Bin1), + Bin. + +yield(doc) -> + "Tests erlang:yield/1."; +yield(Config) when is_list(Config) -> + case catch erlang:system_info(modified_timing_level) of + Level when is_integer(Level) -> + {skipped, + "Modified timing (level " ++ integer_to_list(Level) + ++ ") is enabled. Testcase gets messed up by modfied " + "timing."}; + _ -> + MS = erlang:system_flag(multi_scheduling, block), + yield_test(), + erlang:system_flag(multi_scheduling, unblock), + case MS of + blocked -> + {comment, + "Multi-scheduling blocked during test. This test-case " + "was not written to work with multiple schedulers (the " + "yield2 test-case tests almost the same thing)."}; + _ -> + ok + end + end. + +yield_test() -> + ?line erlang:garbage_collect(), + ?line receive after 1 -> ok end, % Clear reductions. + ?line SC = schedcnt(start), + ?line {reductions, R1} = process_info(self(), reductions), + ?line {ok, true} = call_yield(middle), + ?line true = call_yield(final), + ?line true = call_yield(), + ?line true = apply(erlang, yield, []), + ?line {reductions, R2} = process_info(self(), reductions), + ?line Schedcnt = schedcnt(stop, SC), + ?line case {R2-R1, Schedcnt} of + {Diff, 4} when Diff < 30 -> + ?line ok = io:format("R1 = ~w, R2 = ~w, Schedcnt = ~w", + [R1, R2, Schedcnt]); + {Diff, _} -> + ?line ok = io:format("R1 = ~w, R2 = ~w, Schedcnt = ~w", + [R1, R2, Schedcnt]), + ?line test_server:fail({measurement_error, Diff, Schedcnt}) + end. + +call_yield() -> + erlang:yield(). + +call_yield(middle) -> + {ok, erlang:yield()}; +call_yield(final) -> + case self() of + Self when is_pid(Self) -> + ok + end, + erlang:yield(). + +schedcnt(start) -> + Ref = make_ref(), + Fun = + fun (F, Cnt) -> + receive + {Ref, Parent} -> + Parent ! {Ref, Cnt} + after 0 -> + erlang:yield(), + F(F, Cnt+1) + end + end, + Pid = spawn_link(fun () -> Fun(Fun, 0) end), + {Ref, Pid}. + +schedcnt(stop, {Ref, Pid}) when is_reference(Ref), is_pid(Pid) -> + Pid ! {Ref, self()}, + receive + {Ref, Cnt} -> + Cnt + end. + +yield2(doc) -> []; +yield2(suite) -> []; +yield2(Config) when is_list(Config) -> + ?line Me = self(), + ?line Go = make_ref(), + ?line RedDiff = make_ref(), + ?line Done = make_ref(), + ?line P = spawn(fun () -> + receive Go -> ok end, + {reductions, R1} = process_info(self(), reductions), + {ok, true} = call_yield(middle), + true = call_yield(final), + true = call_yield(), + true = apply(erlang, yield, []), + {reductions, R2} = process_info(self(), reductions), + Me ! {RedDiff, R2 - R1}, + exit(Done) + end), + ?line erlang:yield(), + + ?line 1 = erlang:trace(P, true, [running, procs, {tracer, self()}]), + + ?line P ! Go, + + %% receive Go -> ok end, + ?line {trace, P, in, _} = next_tmsg(P), + + %% {ok, true} = call_yield(middle), + ?line {trace, P, out, _} = next_tmsg(P), + ?line {trace, P, in, _} = next_tmsg(P), + + %% true = call_yield(final), + ?line {trace, P, out, _} = next_tmsg(P), + ?line {trace, P, in, _} = next_tmsg(P), + + %% true = call_yield(), + ?line {trace, P, out, _} = next_tmsg(P), + ?line {trace, P, in, _} = next_tmsg(P), + + %% true = apply(erlang, yield, []), + ?line {trace, P, out, _} = next_tmsg(P), + ?line {trace, P, in, _} = next_tmsg(P), + + %% exit(Done) + ?line {trace, P, exit, Done} = next_tmsg(P), + + + ?line receive + {RedDiff, Reductions} when Reductions < 30, Reductions > 0 -> + io:format("Reductions = ~p~n", [Reductions]), + ?line ok; + {RedDiff, Reductions} -> + ?line ?t:fail({unexpected_reduction_count, Reductions}) + end, + + ?line none = next_tmsg(P), + + ?line ok. + +next_tmsg(Pid) -> + receive + TMsg when is_tuple(TMsg), + element(1, TMsg) == trace, + element(2, TMsg) == Pid -> + TMsg + after 100 -> + none + end. + +%% Test that bad arguments to register/2 cause an exception. +bad_register(Config) when is_list(Config) -> + Name = a_long_and_unused_name, + + ?line {'EXIT',{badarg,_}} = (catch register({bad,name}, self())), + ?line fail_register(undefined, self()), + ?line fail_register([bad,name], self()), + + ?line {Dead,Mref} = spawn_monitor(fun() -> true end), + receive + {'DOWN',Mref,process,Dead,_} -> ok + end, + ?line fail_register(Name, Dead), + ?line fail_register(Name, make_ref()), + ?line fail_register(Name, []), + ?line fail_register(Name, {bad,process}), + ?line fail_register(Name, <<>>), + ok. + +fail_register(Name, Process) -> + {'EXIT',{badarg,_}} = (catch register(Name, Process)), + {'EXIT',{badarg,_}} = (catch Name ! anything_goes), + ok. + +garbage_collect(doc) -> []; +garbage_collect(suite) -> []; +garbage_collect(Config) when is_list(Config) -> + ?line Prio = process_flag(priority, high), + ?line true = erlang:garbage_collect(), + ?line TokLoopers = lists:map(fun (_) -> + spawn_opt(fun tok_loop/0, + [{priority, low}, link]) + end, + lists:seq(1, 10)), + ?line lists:foreach(fun (Pid) -> + ?line Mon = erlang:monitor(process, Pid), + ?line DownBefore = receive + {'DOWN', Mon, _, _, _} -> + ?line true + after 0 -> + ?line false + end, + ?line GC = erlang:garbage_collect(Pid), + ?line DownAfter = receive + {'DOWN', Mon, _, _, _} -> + ?line true + after 0 -> + ?line false + end, + ?line true = erlang:demonitor(Mon), + ?line case {DownBefore, DownAfter} of + {true, _} -> ?line false = GC; + {false, false} -> ?line true = GC; + _ -> ?line GC + end + end, + processes()), + ?line lists:foreach(fun (Pid) -> + unlink(Pid), + exit(Pid, bang) + end, TokLoopers), + ?line process_flag(priority, Prio), + ?line ok. + +process_info_messages(doc) -> + ["This used to cause the nofrag emulator to dump core"]; +process_info_messages(suite) -> + []; +process_info_messages(Config) when is_list(Config) -> + ?line process_info_messages_test(), + ?line ok. + +process_info_messages_loop(0) -> ok; +process_info_messages_loop(N) -> process_info_messages_loop(N-1). + +process_info_messages_send_my_msgs_to(Rcvr) -> + receive + Msg -> + Rcvr ! Msg, + process_info_messages_send_my_msgs_to(Rcvr) + after 0 -> + ok + end. + +process_info_messages_test() -> + ?line Go = make_ref(), + ?line Done = make_ref(), + ?line Rcvr = self(), + ?line Rcvr2 = spawn_link(fun () -> + receive {Go, Rcvr} -> ok end, + garbage_collect(), + Rcvr ! {Done, self()} + end), + ?line Sndrs = lists:map( + fun (_) -> + spawn_link(fun () -> + Rcvr ! {Go, self()}, + receive {Go, Rcvr} -> ok end, + BigData = lists:seq(1, 1000), + Rcvr ! BigData, + Rcvr ! BigData, + Rcvr ! BigData, + Rcvr ! {Done, self()} + end) + end, + lists:seq(1, 10)), + ?line lists:foreach(fun (Sndr) -> receive {Go, Sndr} -> ok end end, + Sndrs), + ?line garbage_collect(), + ?line erlang:yield(), + ?line lists:foreach(fun (Sndr) -> Sndr ! {Go, self()} end, Sndrs), + ?line process_info_messages_loop(100000000), + ?line Msgs = process_info(self(), messages), + ?line lists:foreach(fun (Sndr) -> receive {Done, Sndr} -> ok end end, + Sndrs), + ?line garbage_collect(), + ?line Rcvr2 ! Msgs, + ?line process_info_messages_send_my_msgs_to(Rcvr2), + ?line Rcvr2 ! {Go, self()}, + ?line garbage_collect(), + ?line receive {Done, Rcvr2} -> ok end, + ?line Msgs. + +chk_badarg(Fun) -> + try Fun(), exit(no_badarg) catch error:badarg -> ok end. + +process_flag_badarg(doc) -> + []; +process_flag_badarg(suite) -> + []; +process_flag_badarg(Config) when is_list(Config) -> + ?line chk_badarg(fun () -> process_flag(gurka, banan) end), + ?line chk_badarg(fun () -> process_flag(trap_exit, gurka) end), + ?line chk_badarg(fun () -> process_flag(error_handler, 1) end), + ?line chk_badarg(fun () -> process_flag(min_heap_size, gurka) end), + ?line chk_badarg(fun () -> process_flag(priority, 4711) end), + ?line chk_badarg(fun () -> process_flag(save_calls, hmmm) end), + ?line P= spawn_link(fun () -> receive die -> ok end end), + ?line chk_badarg(fun () -> process_flag(P, save_calls, hmmm) end), + ?line chk_badarg(fun () -> process_flag(gurka, save_calls, hmmm) end), + ?line P ! die, + ?line ok. + +-include_lib("stdlib/include/ms_transform.hrl"). + +otp_6237(doc) -> []; +otp_6237(suite) -> []; +otp_6237(Config) when is_list(Config) -> + ?line Slctrs = lists:map(fun (_) -> + spawn_link(fun () -> + otp_6237_select_loop() + end) + end, + lists:seq(1,5)), + ?line lists:foreach(fun (_) -> otp_6237_test() end, lists:seq(1, 100)), + ?line lists:foreach(fun (S) -> unlink(S),exit(S, kill) end, Slctrs), + ?line ok. + +otp_6237_test() -> + ?line Parent = self(), + ?line Inited = make_ref(), + ?line Die = make_ref(), + ?line Pid = spawn_link(fun () -> + register(otp_6237,self()), + otp_6237 = ets:new(otp_6237, + [named_table, + ordered_set]), + ets:insert(otp_6237, + [{I,I} + || I <- lists:seq(1, 100)]), + %% Inserting a lot of bif timers + %% increase the possibility that + %% the test will fail when the + %% original cleanup order is used + lists:foreach( + fun (_) -> + erlang:send_after(1000000, + self(), + {a,b,c}) + end, + lists:seq(1,1000)), + Parent ! Inited, + receive Die -> bye end + end), + ?line receive + Inited -> ?line ok + end, + ?line Pid ! Die, + otp_6237_whereis_loop(). + +otp_6237_whereis_loop() -> + ?line case whereis(otp_6237) of + undefined -> + ?line otp_6237 = ets:new(otp_6237, + [named_table,ordered_set]), + ?line ets:delete(otp_6237), + ?line ok; + _ -> + ?line otp_6237_whereis_loop() + end. + +otp_6237_select_loop() -> + catch ets:select(otp_6237, ets:fun2ms(fun({K, does_not_exist}) -> K end)), + otp_6237_select_loop(). + + +processes_bif(doc) -> + []; +processes_bif(suite) -> + [processes_large_tab, + processes_default_tab, + processes_small_tab, + processes_this_tab, + processes_last_call_trap, + processes_apply_trap, + processes_gc_trap, + processes_term_proc_list]. + +-define(NoTestProcs, 10000). +-record(processes_bif_info, {min_start_reds, + tab_chunks, + tab_chunks_size, + tab_indices_per_red, + free_term_proc_reds, + term_procs_per_red, + term_procs_max_reds, + conses_per_red, + debug_level}). + +processes_large_tab(doc) -> + []; +processes_large_tab(suite) -> + []; +processes_large_tab(Config) when is_list(Config) -> + ?line enable_internal_state(), + ?line MaxDbgLvl = 20, + ?line MinProcTabSize = 2*(1 bsl 15), + ?line ProcTabSize0 = 1000000, + ?line ProcTabSize1 = case {erlang:system_info(schedulers_online), + erlang:system_info(logical_processors)} of + {Schdlrs, Cpus} when is_integer(Cpus), + Schdlrs =< Cpus -> + ProcTabSize0; + _ -> + ProcTabSize0 div 4 + end, + ?line ProcTabSize2 = case erlang:system_info(debug_compiled) of + true -> ProcTabSize1 - 500000; + false -> ProcTabSize1 + end, + %% With high debug levels this test takes so long time that + %% the connection times out; therefore, shrink the test on + %% high debug levels. + ?line DbgLvl = case erts_debug:get_internal_state(processes_bif_info) of + #processes_bif_info{debug_level = Lvl} when Lvl > MaxDbgLvl -> + 20; + #processes_bif_info{debug_level = Lvl} when Lvl < 0 -> + ?line ?t:fail({debug_level, Lvl}); + #processes_bif_info{debug_level = Lvl} -> + Lvl + end, + ?line ProcTabSize3 = ProcTabSize2 - (1300000 * DbgLvl div MaxDbgLvl), + ?line ProcTabSize = case ProcTabSize3 < MinProcTabSize of + true -> MinProcTabSize; + false -> ProcTabSize3 + end, + ?line {ok, LargeNode} = start_node(Config, + "+P " ++ integer_to_list(ProcTabSize)), + ?line Res = rpc:call(LargeNode, ?MODULE, processes_bif_test, []), + ?line case rpc:call(LargeNode, + erts_debug, + get_internal_state, + [processes_bif_info]) of + #processes_bif_info{tab_chunks = Chunks} when is_integer(Chunks), + Chunks > 1 -> ok; + PBInfo -> ?t:fail(PBInfo) + end, + ?line stop_node(LargeNode), + ?line chk_processes_bif_test_res(Res). + +processes_default_tab(doc) -> + []; +processes_default_tab(suite) -> + []; +processes_default_tab(Config) when is_list(Config) -> + ?line {ok, DefaultNode} = start_node(Config, ""), + ?line Res = rpc:call(DefaultNode, ?MODULE, processes_bif_test, []), + ?line stop_node(DefaultNode), + ?line chk_processes_bif_test_res(Res). + +processes_small_tab(doc) -> + []; +processes_small_tab(suite) -> + []; +processes_small_tab(Config) when is_list(Config) -> + ?line {ok, SmallNode} = start_node(Config, "+P 500"), + ?line Res = rpc:call(SmallNode, ?MODULE, processes_bif_test, []), + ?line PBInfo = rpc:call(SmallNode, + erts_debug, + get_internal_state, + [processes_bif_info]), + ?line stop_node(SmallNode), + ?line 1 = PBInfo#processes_bif_info.tab_chunks, + ?line chk_processes_bif_test_res(Res). + +processes_this_tab(doc) -> + []; +processes_this_tab(suite) -> + []; +processes_this_tab(Config) when is_list(Config) -> + ?line chk_processes_bif_test_res(processes_bif_test()). + +chk_processes_bif_test_res(ok) -> ok; +chk_processes_bif_test_res({comment, _} = Comment) -> Comment; +chk_processes_bif_test_res(Failure) -> ?t:fail(Failure). + +print_processes_bif_info(#processes_bif_info{min_start_reds = MinStartReds, + tab_chunks = TabChunks, + tab_chunks_size = TabChunksSize, + tab_indices_per_red = TabIndPerRed, + free_term_proc_reds = FreeTPReds, + term_procs_per_red = TPPerRed, + term_procs_max_reds = TPMaxReds, + conses_per_red = ConsesPerRed, + debug_level = DbgLvl}) -> + ?t:format("processes/0 bif info on node ~p:~n" + "Min start reductions = ~p~n" + "Process table chunks = ~p~n" + "Process table chunks size = ~p~n" + "Process table indices per reduction = ~p~n" + "Reduction cost for free() on terminated process struct = ~p~n" + "Inspect terminated processes per reduction = ~p~n" + "Max reductions during inspection of terminated processes = ~p~n" + "Create cons-cells per reduction = ~p~n" + "Debug level = ~p~n", + [node(), + MinStartReds, + TabChunks, + TabChunksSize, + TabIndPerRed, + FreeTPReds, + TPPerRed, + TPMaxReds, + ConsesPerRed, + DbgLvl]). + +processes_bif_cleaner() -> + receive {'EXIT', _, _} -> ok end, + processes_bif_cleaner(). + +spawn_initial_hangarounds(Cleaner) -> + TabSz = erlang:system_info(process_limit), + spawn_initial_hangarounds(Cleaner, + TabSz, + TabSz*2, + 0, + []). + +processes_unexpected_result(CorrectProcs, Procs) -> + ProcInfo = [registered_name, + initial_call, + current_function, + status, + priority], + MissingProcs = CorrectProcs -- Procs, + ?t:format("Missing processes: ~p", + [lists:map(fun (Pid) -> + [{pid, Pid} + | case process_info(Pid, ProcInfo) of + undefined -> []; + Res -> Res + end] + end, + MissingProcs)]), + SuperfluousProcs = Procs -- CorrectProcs, + ?t:format("Superfluous processes: ~p", + [lists:map(fun (Pid) -> + [{pid, Pid} + | case process_info(Pid, ProcInfo) of + undefined -> []; + Res -> Res + end] + end, + SuperfluousProcs)]), + ?t:fail(unexpected_result). + +hangaround(Cleaner, Type) -> + %% Type is only used to distinguish different processes from + %% when doing process_info + try link(Cleaner) catch error:Reason -> exit(Reason) end, + receive after infinity -> ok end, + exit(Type). + +spawn_initial_hangarounds(_Cleaner, NP, Max, Len, HAs) when NP > Max -> + {Len, HAs}; +spawn_initial_hangarounds(Cleaner, NP, Max, Len, HAs) -> + erts_debug:set_internal_state(next_pid,NP), + HA1 = spawn_opt(?MODULE, hangaround, [Cleaner, initial_hangaround], + [{priority, low}]), + HA2 = spawn_opt(?MODULE, hangaround, [Cleaner, initial_hangaround], + [{priority, normal}]), + HA3 = spawn_opt(?MODULE, hangaround, [Cleaner, initial_hangaround], + [{priority, high}]), + spawn_initial_hangarounds(Cleaner, NP+30, Max, Len+3, [HA1,HA2,HA3|HAs]). + +do_processes(WantReds) -> + erts_debug:set_internal_state(reds_left, WantReds), + processes(). + +processes_bif_test() -> + ?line Tester = self(), + ?line enable_internal_state(), + ?line PBInfo = erts_debug:get_internal_state(processes_bif_info), + ?line print_processes_bif_info(PBInfo), + ?line WantReds = PBInfo#processes_bif_info.min_start_reds + 10, + ?line WillTrap = case PBInfo of + #processes_bif_info{tab_chunks = 1} -> + false; + #processes_bif_info{tab_chunks = Chunks, + tab_chunks_size = ChunksSize, + tab_indices_per_red = IndiciesPerRed + } -> + Chunks*ChunksSize >= IndiciesPerRed*WantReds + end, + ?line Processes = fun () -> + erts_debug:set_internal_state(reds_left,WantReds), + processes() + end, + + ?line ok = do_processes_bif_test(WantReds, WillTrap, Processes), + + case WillTrap of + false -> + ok; + true -> + %% Do it again with a process suspended while + %% in the processes/0 bif. + ?line erlang:system_flag(multi_scheduling, block), + ?line Suspendee = spawn_link(fun () -> + Tester ! {suspend_me, self()}, + Tester ! {self(), + done, + hd(Processes())}, + receive + after infinity -> + ok + end + end), + ?line receive {suspend_me, Suspendee} -> ok end, + ?line erlang:suspend_process(Suspendee), + ?line erlang:system_flag(multi_scheduling, unblock), + + ?line [{status,suspended}, + {current_function,{erlang,processes_trap,2}}] + = process_info(Suspendee, [status, current_function]), + + ?line ok = do_processes_bif_test(WantReds, WillTrap, Processes), + + ?line erlang:resume_process(Suspendee), + ?line receive {Suspendee, done, _} -> ok end, + ?line unlink(Suspendee), + ?line exit(Suspendee, bang) + end, + case get(processes_bif_testcase_comment) of + undefined -> ?line ok; + Comment -> ?line {comment, Comment} + end. + +do_processes_bif_test(WantReds, DieTest, Processes) -> + ?line Tester = self(), + ?line SpawnProcesses = fun (Prio) -> + spawn_opt(?MODULE, + do_processes, + [WantReds], + [link, {priority, Prio}]) + end, + ?line Cleaner = spawn_link(fun () -> + process_flag(trap_exit, true), + Tester ! {cleaner_alive, self()}, + processes_bif_cleaner() + end), + ?line receive {cleaner_alive, Cleaner} -> ok end, + try + ?line DoIt = make_ref(), + ?line GetGoing = make_ref(), + ?line {NoTestProcs, TestProcs} = spawn_initial_hangarounds(Cleaner), + ?line ?t:format("Testing with ~p processes~n", [NoTestProcs]), + ?line SpawnHangAround = fun () -> + spawn(?MODULE, + hangaround, + [Cleaner, new_hangaround]) + end, + ?line Killer = spawn_opt(fun () -> + Splt = NoTestProcs div 10, + {TP1, TP23} = lists:split(Splt, + TestProcs), + {TP2, TP3} = lists:split(Splt, TP23), + erlang:system_flag(multi_scheduling, + block), + Tester ! DoIt, + receive GetGoing -> ok end, + erlang:system_flag(multi_scheduling, + unblock), + SpawnProcesses(high), + lists:foreach( + fun (P) -> + SpawnHangAround(), + exit(P, bang) + end, + TP1), + SpawnProcesses(high), + erlang:yield(), + lists:foreach( + fun (P) -> + SpawnHangAround(), + exit(P, bang) + end, + TP2), + SpawnProcesses(high), + lists:foreach( + fun (P) -> + SpawnHangAround(), + exit(P, bang) + end, + TP3) + end, + [{priority, high}, link]), + ?line receive DoIt -> ok end, + ?line process_flag(priority, low), + ?line SpawnProcesses(low), + ?line erlang:yield(), + ?line process_flag(priority, normal), + ?line CorrectProcs0 = erts_debug:get_internal_state(processes), + ?line Killer ! GetGoing, + ?line erts_debug:set_internal_state(reds_left, WantReds), + ?line Procs0 = processes(), + ?line Procs = lists:sort(Procs0), + ?line CorrectProcs = lists:sort(CorrectProcs0), + ?line LengthCorrectProcs = length(CorrectProcs), + ?line ?t:format("~p = length(CorrectProcs)~n", [LengthCorrectProcs]), + ?line true = LengthCorrectProcs > NoTestProcs, + ?line case CorrectProcs =:= Procs of + true -> + ?line ok; + false -> + ?line processes_unexpected_result(CorrectProcs, Procs) + end, + ?line unlink(Killer), + ?line exit(Killer, bang) + after + unlink(Cleaner), + exit(Cleaner, kill), + %% Wait for the system to recover to a normal state... + wait_until_system_recover() + end, + ?line do_processes_bif_die_test(DieTest, Processes), + ?line ok. + + +do_processes_bif_die_test(false, _Processes) -> + ?line ?t:format("Skipping test killing process executing processes/0~n",[]), + ?line ok; +do_processes_bif_die_test(true, Processes) -> + ?line do_processes_bif_die_test(5, Processes); +do_processes_bif_die_test(N, Processes) -> + ?line ?t:format("Doing test killing process executing processes/0~n",[]), + try + ?line Tester = self(), + ?line Oooh_Nooooooo = make_ref(), + ?line {_, DieWhileDoingMon} = erlang:spawn_monitor( + fun () -> + Victim = self(), + spawn_opt( + fun () -> + exit(Victim, got_him) + end, + [link, + {priority, max}]), + Tester ! {Oooh_Nooooooo, + hd(Processes())}, + exit(ohhhh_nooooo) + end), + ?line receive + {'DOWN', DieWhileDoingMon, _, _, Reason} -> + case Reason of + got_him -> ok; + _ -> throw({kill_in_trap, Reason}) + end + end, + ?line receive + {Oooh_Nooooooo, _} -> + ?line throw({kill_in_trap, 'Oooh_Nooooooo'}) + after 0 -> + ?line ok + end, + ?line PrcsCllrsSeqLen = 2*erlang:system_info(schedulers_online), + ?line PrcsCllrsSeq = lists:seq(1, PrcsCllrsSeqLen), + ?line ProcsCallers = lists:map( + fun (_) -> + spawn_link( + fun () -> + Tester ! hd(Processes()) + end) + end, + PrcsCllrsSeq), + ?line erlang:yield(), + {ProcsCallers1, ProcsCallers2} = lists:split(PrcsCllrsSeqLen div 2, + ProcsCallers), + ?line process_flag(priority, high), + ?line lists:foreach( + fun (P) -> + unlink(P), + exit(P, bang) + end, + lists:reverse(ProcsCallers2) ++ ProcsCallers1), + ?line process_flag(priority, normal), + ?line ok + catch + throw:{kill_in_trap, R} when N > 0 -> + ?t:format("Failed to kill in trap: ~p~n", [R]), + ?t:format("Trying again~p~n", []), + do_processes_bif_die_test(N-1, Processes) + end. + + +wait_until_system_recover() -> + %% If system hasn't recovered after 10 seconds we give up + Tmr = erlang:start_timer(10000, self(), no_more_wait), + wait_until_system_recover(Tmr). + +wait_until_system_recover(Tmr) -> + try + lists:foreach(fun (P) when P == self() -> + ok; + (P) -> + case process_info(P, initial_call) of + {initial_call,{?MODULE, _, _}} -> + throw(wait); + {initial_call,{_, _, _}} -> + ok; + undefined -> + ok + end + end, + processes()) + catch + throw:wait -> + receive + {timeout, Tmr, _} -> + Comment = "WARNING: Test processes still hanging around!", + ?t:format("~s~n", [Comment]), + put(processes_bif_testcase_comment, Comment), + lists:foreach( + fun (P) when P == self() -> + ok; + (P) -> + case process_info(P, initial_call) of + {initial_call,{?MODULE, _, _} = MFA} -> + ?t:format("~p ~p~n", [P, MFA]); + {initial_call,{_, _, _}} -> + ok; + undefined -> + ok + end + end, + processes()) + after 100 -> + wait_until_system_recover(Tmr) + end + end, + erlang:cancel_timer(Tmr), + receive {timeout, Tmr, _} -> ok after 0 -> ok end, + ok. + +processes_last_call_trap(doc) -> + []; +processes_last_call_trap(suite) -> + []; +processes_last_call_trap(Config) when is_list(Config) -> + ?line enable_internal_state(), + ?line Processes = fun () -> processes() end, + ?line PBInfo = erts_debug:get_internal_state(processes_bif_info), + ?line print_processes_bif_info(PBInfo), + ?line WantReds = case PBInfo#processes_bif_info.min_start_reds of + R when R > 10 -> R - 1; + _R -> 9 + end, + ?line lists:foreach(fun (_) -> + ?line erts_debug:set_internal_state(reds_left, + WantReds), + Processes(), + ?line erts_debug:set_internal_state(reds_left, + WantReds), + my_processes() + end, + lists:seq(1,100)). + +my_processes() -> + processes(). + +processes_apply_trap(doc) -> + []; +processes_apply_trap(suite) -> + []; +processes_apply_trap(Config) when is_list(Config) -> + ?line enable_internal_state(), + ?line PBInfo = erts_debug:get_internal_state(processes_bif_info), + ?line print_processes_bif_info(PBInfo), + ?line WantReds = case PBInfo#processes_bif_info.min_start_reds of + R when R > 10 -> R - 1; + _R -> 9 + end, + ?line lists:foreach(fun (_) -> + ?line erts_debug:set_internal_state(reds_left, + WantReds), + ?line apply(erlang, processes, []) + end, + lists:seq(1,100)). + +processes_gc_trap(doc) -> + []; +processes_gc_trap(suite) -> + []; +processes_gc_trap(Config) when is_list(Config) -> + ?line Tester = self(), + ?line enable_internal_state(), + ?line PBInfo = erts_debug:get_internal_state(processes_bif_info), + ?line print_processes_bif_info(PBInfo), + ?line WantReds = PBInfo#processes_bif_info.min_start_reds + 10, + ?line Processes = fun () -> + erts_debug:set_internal_state(reds_left,WantReds), + processes() + end, + + ?line erlang:system_flag(multi_scheduling, block), + ?line Suspendee = spawn_link(fun () -> + Tester ! {suspend_me, self()}, + Tester ! {self(), + done, + hd(Processes())}, + receive after infinity -> ok end + end), + ?line receive {suspend_me, Suspendee} -> ok end, + ?line erlang:suspend_process(Suspendee), + ?line erlang:system_flag(multi_scheduling, unblock), + + ?line [{status,suspended}, {current_function,{erlang,processes_trap,2}}] + = process_info(Suspendee, [status, current_function]), + + ?line erlang:garbage_collect(Suspendee), + ?line erlang:garbage_collect(Suspendee), + + ?line erlang:resume_process(Suspendee), + ?line receive {Suspendee, done, _} -> ok end, + ?line erlang:garbage_collect(Suspendee), + ?line erlang:garbage_collect(Suspendee), + + ?line unlink(Suspendee), + ?line exit(Suspendee, bang), + ?line ok. + + +processes_term_proc_list(doc) -> + []; +processes_term_proc_list(suite) -> + []; +processes_term_proc_list(Config) when is_list(Config) -> + ?line Tester = self(), + ?line as_expected = processes_term_proc_list_test(false), + ?line {ok, Node} = start_node(Config, "+Mis true"), + ?line RT = spawn_link(Node, + fun () -> + receive after 1000 -> ok end, + processes_term_proc_list_test(false), + Tester ! {it_worked, self()} + end), + ?line receive {it_worked, RT} -> ok end, + ?line stop_node(Node), + ?line ok. + +-define(CHK_TERM_PROC_LIST(MC, XB), + chk_term_proc_list(?LINE, MC, XB)). + +chk_term_proc_list(Line, MustChk, ExpectBlks) -> + case {MustChk, instrument:memory_status(types)} of + {false, false} -> + not_enabled; + {_, MS} -> + {value, + {processes_term_proc_el, + DL}} = lists:keysearch(processes_term_proc_el, 1, MS), + case lists:keysearch(blocks, 1, DL) of + {value, {blocks, ExpectBlks, _, _}} -> + ok; + {value, {blocks, Blks, _, _}} -> + exit({line, Line, + mismatch, expected, ExpectBlks, actual, Blks}); + Unexpected -> + exit(Unexpected) + end + end, + ok. + +processes_term_proc_list_test(MustChk) -> + ?line Tester = self(), + ?line enable_internal_state(), + ?line PBInfo = erts_debug:get_internal_state(processes_bif_info), + ?line print_processes_bif_info(PBInfo), + ?line WantReds = PBInfo#processes_bif_info.min_start_reds + 10, + ?line #processes_bif_info{tab_chunks = Chunks, + tab_chunks_size = ChunksSize, + tab_indices_per_red = IndiciesPerRed + } = PBInfo, + ?line true = Chunks > 1, + ?line true = Chunks*ChunksSize >= IndiciesPerRed*WantReds, + ?line Processes = fun () -> + erts_debug:set_internal_state(reds_left, + WantReds), + processes() + end, + ?line Exit = fun (P) -> + unlink(P), + exit(P, bang), + wait_until( + fun () -> + not lists:member( + P, + erts_debug:get_internal_state( + processes)) + end) + end, + ?line SpawnSuspendProcessesProc + = fun () -> + erlang:system_flag(multi_scheduling, block), + P = spawn_link(fun () -> + Tester ! {suspend_me, self()}, + Tester ! {self(), + done, + hd(Processes())}, + receive after infinity -> ok end + end), + receive {suspend_me, P} -> ok end, + erlang:suspend_process(P), + erlang:system_flag(multi_scheduling, unblock), + [{status,suspended}, + {current_function,{erlang,processes_trap,2}}] + = process_info(P, [status, current_function]), + P + end, + ?line ResumeProcessesProc = fun (P) -> + erlang:resume_process(P), + receive {P, done, _} -> ok end + end, + ?line ?CHK_TERM_PROC_LIST(MustChk, 0), + ?line HangAround = fun () -> receive after infinity -> ok end end, + ?line HA1 = spawn_link(HangAround), + ?line HA2 = spawn_link(HangAround), + ?line HA3 = spawn_link(HangAround), + ?line S1 = SpawnSuspendProcessesProc(), + ?line ?CHK_TERM_PROC_LIST(MustChk, 1), + ?line Exit(HA1), + ?line ?CHK_TERM_PROC_LIST(MustChk, 2), + ?line S2 = SpawnSuspendProcessesProc(), + ?line ?CHK_TERM_PROC_LIST(MustChk, 3), + ?line S3 = SpawnSuspendProcessesProc(), + ?line ?CHK_TERM_PROC_LIST(MustChk, 4), + ?line Exit(HA2), + ?line ?CHK_TERM_PROC_LIST(MustChk, 5), + ?line S4 = SpawnSuspendProcessesProc(), + ?line ?CHK_TERM_PROC_LIST(MustChk, 6), + ?line Exit(HA3), + ?line ?CHK_TERM_PROC_LIST(MustChk, 7), + ?line ResumeProcessesProc(S1), + ?line ?CHK_TERM_PROC_LIST(MustChk, 5), + ?line ResumeProcessesProc(S3), + ?line ?CHK_TERM_PROC_LIST(MustChk, 4), + ?line ResumeProcessesProc(S4), + ?line ?CHK_TERM_PROC_LIST(MustChk, 3), + ?line ResumeProcessesProc(S2), + ?line ?CHK_TERM_PROC_LIST(MustChk, 0), + ?line Exit(S1), + ?line Exit(S2), + ?line Exit(S3), + ?line Exit(S4), + + + ?line HA4 = spawn_link(HangAround), + ?line HA5 = spawn_link(HangAround), + ?line HA6 = spawn_link(HangAround), + ?line S5 = SpawnSuspendProcessesProc(), + ?line ?CHK_TERM_PROC_LIST(MustChk, 1), + ?line Exit(HA4), + ?line ?CHK_TERM_PROC_LIST(MustChk, 2), + ?line S6 = SpawnSuspendProcessesProc(), + ?line ?CHK_TERM_PROC_LIST(MustChk, 3), + ?line Exit(HA5), + ?line ?CHK_TERM_PROC_LIST(MustChk, 4), + ?line S7 = SpawnSuspendProcessesProc(), + ?line ?CHK_TERM_PROC_LIST(MustChk, 5), + ?line Exit(HA6), + ?line ?CHK_TERM_PROC_LIST(MustChk, 6), + ?line S8 = SpawnSuspendProcessesProc(), + ?line ?CHK_TERM_PROC_LIST(MustChk, 7), + + ?line erlang:system_flag(multi_scheduling, block), + ?line Exit(S8), + ?line ?CHK_TERM_PROC_LIST(MustChk, 7), + ?line Exit(S5), + ?line ?CHK_TERM_PROC_LIST(MustChk, 6), + ?line Exit(S7), + ?line ?CHK_TERM_PROC_LIST(MustChk, 6), + ?line Exit(S6), + ?line ?CHK_TERM_PROC_LIST(MustChk, 0), + ?line erlang:system_flag(multi_scheduling, unblock), + ?line as_expected. + +otp_7738(doc) -> + []; +otp_7738(suite) -> + [otp_7738_waiting, otp_7738_suspended, otp_7738_resume]. + +otp_7738_waiting(doc) -> + []; +otp_7738_waiting(suite) -> + []; +otp_7738_waiting(Config) when is_list(Config) -> + ?line otp_7738_test(waiting). + +otp_7738_suspended(doc) -> + []; +otp_7738_suspended(suite) -> + []; +otp_7738_suspended(Config) when is_list(Config) -> + ?line otp_7738_test(suspended). + +otp_7738_resume(doc) -> + []; +otp_7738_resume(suite) -> + []; +otp_7738_resume(Config) when is_list(Config) -> + ?line otp_7738_test(resume). + +otp_7738_test(Type) -> + ?line T = self(), + ?line S = spawn_link(fun () -> + receive + {suspend, Suspendee} -> + erlang:suspend_process(Suspendee), + T ! {suspended, Suspendee}, + receive + after 10 -> + erlang:resume_process(Suspendee), + Suspendee ! wake_up + end; + {send, To, Msg} -> + receive after 10 -> ok end, + To ! Msg + end + end), + ?line R = spawn_link(fun () -> + X = lists:seq(1, 20000000), + T ! {initialized, self()}, + ?line case Type of + _ when Type == suspended; + Type == waiting -> + receive _ -> ok end; + _ when Type == resume -> + Receive = fun (F) -> + receive + _ -> + ok + after 0 -> + F(F) + end + end, + Receive(Receive) + end, + T ! {woke_up, self()}, + id(X) + end), + ?line receive {initialized, R} -> ok end, + ?line receive after 10 -> ok end, + ?line case Type of + suspended -> + ?line erlang:suspend_process(R), + ?line S ! {send, R, wake_up}; + waiting -> + ?line S ! {send, R, wake_up}; + resume -> + ?line S ! {suspend, R}, + ?line receive {suspended, R} -> ok end + end, + ?line erlang:garbage_collect(R), + ?line case Type of + suspended -> + ?line erlang:resume_process(R); + _ -> + ?line ok + end, + ?line receive + {woke_up, R} -> + ?line ok + after 2000 -> + ?line I = process_info(R, [status, message_queue_len]), + ?line ?t:format("~p~n", [I]), + ?line ?t:fail(no_progress) + end, + ?line ok. + +%% Internal functions + +wait_until(Fun) -> + case Fun() of + true -> true; + false -> receive after 10 -> wait_until(Fun) end + end. + +tok_loop() -> + tok_loop(hej). + +tok_loop(hej) -> + tok_loop(hopp); +tok_loop(hopp) -> + tok_loop(hej). + +id(I) -> I. + +start_node(Config) -> + start_node(Config, ""). + +start_node(Config, Args) when is_list(Config) -> + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line {A, B, C} = now(), + ?line Name = list_to_atom(atom_to_list(?MODULE) + ++ "-" + ++ atom_to_list(?config(testcase, Config)) + ++ "-" + ++ integer_to_list(A) + ++ "-" + ++ integer_to_list(B) + ++ "-" + ++ integer_to_list(C)), + ?line ?t:start_node(Name, slave, [{args, "-pa "++Pa++" "++Args}]). + +stop_node(Node) -> + ?t:stop_node(Node). + +enable_internal_state() -> + case catch erts_debug:get_internal_state(available_internal_state) of + true -> true; + _ -> erts_debug:set_internal_state(available_internal_state, true) + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/pseudoknot_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/pseudoknot_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/pseudoknot_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/pseudoknot_SUITE.erl 2009-09-18 15:08:29.000000000 +0100 @@ -0,0 +1,3326 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(pseudoknot_SUITE). + +-export([all/1,test/1]). + +all(suite) -> [test]. + +test(Config) when is_list(Config) -> + statistics(runtime), + R = loop(1,0), + {_,Time} = statistics(runtime), + io:format("\nruntime = ~p msecs\nresult = ~p\n", [Time,R]), + true = abs(R-33.7976) < 0.0001, + {comment,lists:flatten(io_lib:format("Time: ~w", [Time]))}. + +append([H|T], Z) -> + [H|append(T, Z)]; +append([], X) -> + X. + +atan2(Y,X) when X>0.0 -> + math:atan(Y/X); +atan2(Y,X) when Y<0.0 -> + if + X == 0.0 -> -1.57079632679489661923; + true -> math:atan(Y/X) - 3.14159265358979323846 + end; +atan2(Y,X) -> + if + X == 0.0 -> 1.57079632679489661923; + true -> math:atan(Y/X) + 3.14159265358979323846 + end. + +% -- POINTS ------------------------------------------------------------------ + +%pt ::= {X, Y, Z} where X,Y,Z are floats + +pt_sub({X1, Y1, Z1}, {X2, Y2, Z2}) + when is_float(X1), is_float(Y1), is_float(Z1), + is_float(X2), is_float(Y2), is_float(Z2) -> + {X1 - X2, Y1 - Y2, Z1 - Z2}. + +pt_dist({X1, Y1, Z1}, {X2, Y2, Z2}) + when is_float(X1), is_float(Y1), is_float(Z1), + is_float(X2), is_float(Y2), is_float(Z2) -> + Dx = X1 - X2, + Dy = Y1 - Y2, + Dz = Z1 - Z2, + math:sqrt(Dx * Dx + Dy * Dy + Dz * Dz). + +pt_phi({X, Y, Z}) + when is_float(X), is_float(Z) -> + B = atan2(X, Z), + atan2(math:cos(B) * Z + math:sin(B) * X, Y). + +pt_theta ({X, _, Z}) -> + atan2(X, Z). + +% -- COORDINATE TRANSFORMATIONS ---------------------------------------------- + +% The notation for the transformations follows "Paul, R.P. (1981) Robot +% Manipulators. MIT Press." with the exception that our transformation +% matrices don't have the perspective terms and are the transpose of +% Paul's one. See also "M\"antyl\"a, M. (1985) An Introduction to +% Solid Modeling, Computer Science Press" Appendix A. +% +% The components of a transformation matrix are named like this: +% +% a b c +% d e f +% g h i +% tx ty tz +% +% The components tx, ty, and tz are the translation vector. + +%tfo ::= {A,B,C,D,E,F,G,H,I,Tx,Ty,Tz} where all elements are floats + +tfo_id() -> {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}. + +% The function "tfo-apply" multiplies a transformation matrix, tfo, by a +% point vector, p. The result is a new point. + +tfo_apply ({A,B,C,D,E,F,G,H,I,Tx,Ty,Tz}, {X,Y,Z}) + when is_float(A), is_float(B), is_float(C), is_float(D), is_float(E), + is_float(F), is_float(G), is_float(H), is_float(I), + is_float(Tx), is_float(Ty), is_float(Tz), is_float(X), is_float(Y), is_float(Z) -> + {X * A + Y * D + Z * G + Tx, + X * B + Y * E + Z * H + Ty, + X * C + Y * F + Z * I + Tz}. + +% The function "tfo-combine" multiplies two transformation matrices A and B. +% The result is a new matrix which cumulates the transformations described +% by A and B. + +tfo_combine({A_a,A_b,A_c,A_d,A_e,A_f,A_g,A_h,A_i,A_tx,A_ty,A_tz}, + {B_a,B_b,B_c,B_d,B_e,B_f,B_g,B_h,B_i,B_tx,B_ty,B_tz}) + when is_float(A_a), is_float(A_b), is_float(A_c), is_float(A_d), is_float(A_e), + is_float(A_f), is_float(A_g), is_float(A_h), is_float(A_i), is_float(A_tx), + is_float(A_ty), is_float(A_tz), + is_float(B_a), is_float(B_b), is_float(B_c), is_float(B_d), is_float(B_e), + is_float(B_f), is_float(B_g), is_float(B_h), is_float(B_i), is_float(B_tx), + is_float(B_ty), is_float(B_tz) -> + {A_a * B_a + A_b * B_d + A_c * B_g, + A_a * B_b + A_b * B_e + A_c * B_h, + A_a * B_c + A_b * B_f + A_c * B_i, + A_d * B_a + A_e * B_d + A_f * B_g, + A_d * B_b + A_e * B_e + A_f * B_h, + A_d * B_c + A_e * B_f + A_f * B_i, + A_g * B_a + A_h * B_d + A_i * B_g, + A_g * B_b + A_h * B_e + A_i * B_h, + A_g * B_c + A_h * B_f + A_i * B_i, + A_tx * B_a + A_ty * B_d + A_tz * B_g + B_tx, + A_tx * B_b + A_ty * B_e + A_tz * B_h + B_ty, + A_tx * B_c + A_ty * B_f + A_tz * B_i + B_tz}. + +% The function "tfo-inv-ortho" computes the inverse of a homogeneous +% transformation matrix. + +tfo_inv_ortho({A,B,C,D,E,F,G,H,I,Tx,Ty,Tz}) + when is_float(A), is_float(B), is_float(C), is_float(D), is_float(E), is_float(F), + is_float(G), is_float(H), is_float(I), is_float(Tx), is_float(Ty), is_float(Tz) -> + {A,D,G, + B,E,H, + C,F,I, + -(A * Tx + B * Ty + C * Tz), + -(D * Tx + E * Ty + F * Tz), + -(G * Tx + H * Ty + I * Tz)}. + +% Given three points p1, p2, and p3, the function "tfo-align" computes +% a transformation matrix such that point p1 gets mapped to (0,0,0), p2 gets +% mapped to the Y axis and p3 gets mapped to the YZ plane. + +tfo_align({X1,Y1,Z1},{X2,Y2,Z2},{X3,Y3,Z3}) + when is_float(X1), is_float(Y1), is_float(Z1), + is_float(X2), is_float(Y2), is_float(Z2), + is_float(X3), is_float(Y3), is_float(Z3) -> + X31 = X3 - X1, + Y31 = Y3 - Y1, + Z31 = Z3 - Z1, + Rotpy = pt_sub({X2,Y2,Z2},{X1,Y1,Z1}), + Phi = pt_phi(Rotpy), + Theta = pt_theta(Rotpy), + Sinp = math:sin(Phi), + Sint = math:sin(Theta), + Cosp = math:cos(Phi), + Cost = math:cos(Theta), + Sinpsint = Sinp * Sint, + Sinpcost = Sinp * Cost, + Cospsint = Cosp * Sint, + Cospcost = Cosp * Cost, + Rotpz = {Cost * X31 - Sint * Z31, + Sinpsint * X31 + Cosp * Y31 + Sinpcost * Z31, + Cospsint * X31 - Sinp * Y31 + Cospcost * Z31}, + Rho = pt_theta(Rotpz), + Cosr = math:cos(Rho), + Sinr = math:sin(Rho), + X = Z1 * Sint - X1 * Cost, + Y = -X1 * Sinpsint - Y1 * Cosp - Z1 * Sinpcost, + Z = Y1 * Sinp - Z1 * Cospcost - X1 * Cospsint, + {Cost * Cosr - Cospsint * Sinr, + Sinpsint, + Cost * Sinr + Cospsint * Cosr, + Sinp * Sinr, + Cosp, + -Sinp * Cosr, + -Sint * Cosr - Cospcost * Sinr, + Sinpcost, + Cospcost * Cosr - Sint * Sinr, + X * Cosr - Z * Sinr, + Y, + X * Sinr + Z * Cosr}. + +% -- NUCLEIC ACID CONFORMATIONS DATA BASE ------------------------------------ + +% Numbering of atoms follows the paper: +% +% IUPAC-IUB Joint Commission on Biochemical Nomenclature (JCBN) +% (1983) Abbreviations and Symbols for the Description of +% Conformations of Polynucleotide Chains. Eur. J. Biochem 131, +% 9-15. + +% Define part common to all 4 nucleotide types. + +%nuc ::= { +% tfo,tfo,tfo,tfo, +% pt,pt,pt,pt,pt,pt,pt,pt,pt,pt,pt,pt,pt, +% pt,pt,pt,pt,pt,pt,pt,pt,pt,pt,pt,pt, +% A/C/G/U, +% nuc_specific +% } + +% dgf_base_tfo ; defines the standard position for wc and wc_dumas +% p_o3'_275_tfo ; defines the standard position for the connect function +% p_o3'_180_tfo +% p_o3'_60_tfo +% p o1p o2p o5' c5' h5' h5'' c4' h4' o4' c1' h1' c2' h2'' o2' h2' c3' +% h3' o3' n1 n3 c2 c4 c5 c6 + +type({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,X, + _}) -> X. + +nuc_C1_({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,X,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _}) -> X. + +nuc_C2({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,X,_,_,_,_, + _}) -> X. + +nuc_C3_({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + X,_,_,_,_,_,_,_,_,_, + _}) -> X. + +nuc_C4({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,X,_,_,_, + _}) -> X. + +nuc_C4_({_,_,_,_,_,_,_,_,_,_, + _,X,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _}) -> X. + +nuc_N1({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,X,_,_,_,_,_,_, + _}) -> X. + +nuc_O3_({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,X,_,_,_,_,_,_,_, + _}) -> X. + +nuc_P({_,_,_,_,X,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _}) -> X. + +nuc_dgf_base_tfo({X,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _}) -> X. + +nuc_p_o3__180_tfo({_,_,X,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _}) -> X. + +nuc_p_o3__275_tfo({_,X,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _}) -> X. + +nuc_p_o3__60_tfo({_,_,_,X,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _}) -> X. + +rA_N9({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,a, + {_,_,X,_,_,_,_,_}}) -> X. + +rG_N9({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,g, + {_,_,X,_,_,_,_,_,_}}) -> X. + + +%nuc ::= { +% tfo,tfo,tfo,tfo, +% pt,pt,pt,pt,pt,pt,pt,pt,pt,pt,pt,pt,pt, +% pt,pt,pt,pt,pt,pt,pt,pt,pt,pt,pt,pt, +% A/C/G/U, +% nuc_specific +% } + +% Define remaining atoms for each nucleotide type. + +%nuc_specific +% a {N6,N7,N9,C8,H2,H61,H62,H8} +% c {N4,O2,H41,H42,H5,H6} +% g {N2,N7,N9,C8,O6,H1,H21,H22,H8} +% u {O2,O4,H3,H5,H6} + +% Database of nucleotide conformations: + +rA() -> + { + {-0.0018, -0.8207, 0.5714, % dgf_base_tfo + 0.2679, -0.5509, -0.7904, + 0.9634, 0.1517, 0.2209, + 0.0073, 8.4030, 0.6232}, + {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo + -0.0433, -0.4257, 0.9038, + -0.5788, 0.7480, 0.3246, + 1.5227, 6.9114, -7.0765}, + {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo + 0.4552, 0.6637, 0.5935, + -0.8042, 0.0203, 0.5941, + -6.9472, -4.1186, -5.9108}, + {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo + -0.8247, 0.5587, -0.0878, + 0.0426, 0.2162, 0.9754, + 6.2694, -7.0540, 3.3316}, + {2.8930, 8.5380, -3.3280}, % P + {1.6980, 7.6960, -3.5570}, % O1P + {3.2260, 9.5010, -4.4020}, % O2P + {4.1590, 7.6040, -3.0340}, % O5' + {5.4550, 8.2120, -2.8810}, % C5' + {5.4546, 8.8508, -1.9978}, % H5' + {5.7588, 8.6625, -3.8259}, % H5'' + {6.4970, 7.1480, -2.5980}, % C4' + {7.4896, 7.5919, -2.5214}, % H4' + {6.1630, 6.4860, -1.3440}, % O4' + {6.5400, 5.1200, -1.4190}, % C1' + {7.2763, 4.9681, -0.6297}, % H1' + {7.1940, 4.8830, -2.7770}, % C2' + {6.8667, 3.9183, -3.1647}, % H2'' + {8.5860, 5.0910, -2.6140}, % O2' + {8.9510, 4.7626, -1.7890}, % H2' + {6.5720, 6.0040, -3.6090}, % C3' + {5.5636, 5.7066, -3.8966}, % H3' + {7.3801, 6.3562, -4.7350}, % O3' + {4.7150, 0.4910, -0.1360}, % N1 + {6.3490, 2.1730, -0.6020}, % N3 + {5.9530, 0.9650, -0.2670}, % C2 + {5.2900, 2.9790, -0.8260}, % C4 + {3.9720, 2.6390, -0.7330}, % C5 + {3.6770, 1.3160, -0.3660}, % C6 + a, { + {2.4280, 0.8450, -0.2360}, % N6 + {3.1660, 3.7290, -1.0360}, % N7 + {5.3170, 4.2990, -1.1930}, % N9 + {4.0100, 4.6780, -1.2990}, % C8 + {6.6890, 0.1903, -0.0518}, % H2 + {1.6470, 1.4460, -0.4040}, % H61 + {2.2780, -0.1080, -0.0280}, % H62 + {3.4421, 5.5744, -1.5482}} % H8 + }. + +rA01() -> + { + {-0.0043, -0.8175, 0.5759, % dgf_base_tfo + 0.2617, -0.5567, -0.7884, + 0.9651, 0.1473, 0.2164, + 0.0359, 8.3929, 0.5532}, + {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo + -0.0433, -0.4257, 0.9038, + -0.5788, 0.7480, 0.3246, + 1.5227, 6.9114, -7.0765}, + {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo + 0.4552, 0.6637, 0.5935, + -0.8042, 0.0203, 0.5941, + -6.9472, -4.1186, -5.9108}, + {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo + -0.8247, 0.5587, -0.0878, + 0.0426, 0.2162, 0.9754, + 6.2694, -7.0540, 3.3316}, + {2.8930, 8.5380, -3.3280}, % P + {1.6980, 7.6960, -3.5570}, % O1P + {3.2260, 9.5010, -4.4020}, % O2P + {4.1590, 7.6040, -3.0340}, % O5' + {5.4352, 8.2183, -2.7757}, % C5' + {5.3830, 8.7883, -1.8481}, % H5' + {5.7729, 8.7436, -3.6691}, % H5'' + {6.4830, 7.1518, -2.5252}, % C4' + {7.4749, 7.5972, -2.4482}, % H4' + {6.1626, 6.4620, -1.2827}, % O4' + {6.5431, 5.0992, -1.3905}, % C1' + {7.2871, 4.9328, -0.6114}, % H1' + {7.1852, 4.8935, -2.7592}, % C2' + {6.8573, 3.9363, -3.1645}, % H2'' + {8.5780, 5.1025, -2.6046}, % O2' + {8.9516, 4.7577, -1.7902}, % H2' + {6.5522, 6.0300, -3.5612}, % C3' + {5.5420, 5.7356, -3.8459}, % H3' + {7.3487, 6.4089, -4.6867}, % O3' + {4.7442, 0.4514, -0.1390}, % N1 + {6.3687, 2.1459, -0.5926}, % N3 + {5.9795, 0.9335, -0.2657}, % C2 + {5.3052, 2.9471, -0.8125}, % C4 + {3.9891, 2.5987, -0.7230}, % C5 + {3.7016, 1.2717, -0.3647}, % C6 + a, { + {2.4553, 0.7925, -0.2390}, % N6 + {3.1770, 3.6859, -1.0198}, % N7 + {5.3247, 4.2695, -1.1710}, % N9 + {4.0156, 4.6415, -1.2759}, % C8 + {6.7198, 0.1618, -0.0547}, % H2 + {1.6709, 1.3900, -0.4039}, % H61 + {2.3107, -0.1627, -0.0373}, % H62 + {3.4426, 5.5361, -1.5199}} % H8 + }. + +rA02() -> + { + {0.5566, 0.0449, 0.8296, % dgf_base_tfo + 0.5125, 0.7673, -0.3854, + -0.6538, 0.6397, 0.4041, + -9.1161, -3.7679, -2.9968}, + {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo + -0.0433, -0.4257, 0.9038, + -0.5788, 0.7480, 0.3246, + 1.5227, 6.9114, -7.0765}, + {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo + 0.4552, 0.6637, 0.5935, + -0.8042, 0.0203, 0.5941, + -6.9472, -4.1186, -5.9108}, + {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo + -0.8247, 0.5587, -0.0878, + 0.0426, 0.2162, 0.9754, + 6.2694, -7.0540, 3.3316}, + {2.8930, 8.5380, -3.3280}, % P + {1.6980, 7.6960, -3.5570}, % O1P + {3.2260, 9.5010, -4.4020}, % O2P + {4.1590, 7.6040, -3.0340}, % O5' + {4.5778, 6.6594, -4.0364}, % C5' + {4.9220, 7.1963, -4.9204}, % H5' + {3.7996, 5.9091, -4.1764}, % H5'' + {5.7873, 5.8869, -3.5482}, % C4' + {6.0405, 5.0875, -4.2446}, % H4' + {6.9135, 6.8036, -3.4310}, % O4' + {7.7293, 6.4084, -2.3392}, % C1' + {8.7078, 6.1815, -2.7624}, % H1' + {7.1305, 5.1418, -1.7347}, % C2' + {7.2040, 5.1982, -0.6486}, % H2'' + {7.7417, 4.0392, -2.3813}, % O2' + {8.6785, 4.1443, -2.5630}, % H2' + {5.6666, 5.2728, -2.1536}, % C3' + {5.1747, 5.9805, -1.4863}, % H3' + {4.9997, 4.0086, -2.1973}, % O3' + {10.3245, 8.5459, 1.5467}, % N1 + {9.8051, 6.9432, -0.1497}, % N3 + {10.5175, 7.4328, 0.8408}, % C2 + {8.7523, 7.7422, -0.4228}, % C4 + {8.4257, 8.9060, 0.2099}, % C5 + {9.2665, 9.3242, 1.2540}, % C6 + a, { + {9.0664, 10.4462, 1.9610}, % N6 + {7.2750, 9.4537, -0.3428}, % N7 + {7.7962, 7.5519, -1.3859}, % N9 + {6.9479, 8.6157, -1.2771}, % C8 + {11.4063, 6.9047, 1.1859}, % H2 + {8.2845, 11.0341, 1.7552}, % H61 + {9.6584, 10.6647, 2.7198}, % H62 + {6.0430, 8.9853, -1.7594}} % H8 + }. + +rA03() -> + { + {-0.5021, 0.0731, 0.8617, % dgf_base_tfo + -0.8112, 0.3054, -0.4986, + -0.2996, -0.9494, -0.0940, + 6.4273, -5.1944, -3.7807}, + {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo + -0.0433, -0.4257, 0.9038, + -0.5788, 0.7480, 0.3246, + 1.5227, 6.9114, -7.0765}, + {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo + 0.4552, 0.6637, 0.5935, + -0.8042, 0.0203, 0.5941, + -6.9472, -4.1186, -5.9108}, + {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo + -0.8247, 0.5587, -0.0878, + 0.0426, 0.2162, 0.9754, + 6.2694, -7.0540, 3.3316}, + {2.8930, 8.5380, -3.3280}, % P + {1.6980, 7.6960, -3.5570}, % O1P + {3.2260, 9.5010, -4.4020}, % O2P + {4.1590, 7.6040, -3.0340}, % O5' + {4.1214, 6.7116, -1.9049}, % C5' + {3.3465, 5.9610, -2.0607}, % H5' + {4.0789, 7.2928, -0.9837}, % H5'' + {5.4170, 5.9293, -1.8186}, % C4' + {5.4506, 5.3400, -0.9023}, % H4' + {5.5067, 5.0417, -2.9703}, % O4' + {6.8650, 4.9152, -3.3612}, % C1' + {7.1090, 3.8577, -3.2603}, % H1' + {7.7152, 5.7282, -2.3894}, % C2' + {8.5029, 6.2356, -2.9463}, % H2'' + {8.1036, 4.8568, -1.3419}, % O2' + {8.3270, 3.9651, -1.6184}, % H2' + {6.7003, 6.7565, -1.8911}, % C3' + {6.5898, 7.5329, -2.6482}, % H3' + {7.0505, 7.2878, -0.6105}, % O3' + {9.6740, 4.7656, -7.6614}, % N1 + {9.0739, 4.3013, -5.3941}, % N3 + {9.8416, 4.2192, -6.4581}, % C2 + {7.9885, 5.0632, -5.6446}, % C4 + {7.6822, 5.6856, -6.8194}, % C5 + {8.5831, 5.5215, -7.8840}, % C6 + a, { + {8.4084, 6.0747, -9.0933}, % N6 + {6.4857, 6.3816, -6.7035}, % N7 + {6.9740, 5.3703, -4.7760}, % N9 + {6.1133, 6.1613, -5.4808}, % C8 + {10.7627, 3.6375, -6.4220}, % H2 + {7.6031, 6.6390, -9.2733}, % H61 + {9.1004, 5.9708, -9.7893}, % H62 + {5.1705, 6.6830, -5.3167}} % H8 + }. + +rA04() -> + { + {-0.5426, -0.8175, 0.1929, % dgf_base_tfo + 0.8304, -0.5567, -0.0237, + 0.1267, 0.1473, 0.9809, + -0.5075, 8.3929, 0.2229}, + {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo + -0.0433, -0.4257, 0.9038, + -0.5788, 0.7480, 0.3246, + 1.5227, 6.9114, -7.0765}, + {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo + 0.4552, 0.6637, 0.5935, + -0.8042, 0.0203, 0.5941, + -6.9472, -4.1186, -5.9108}, + {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo + -0.8247, 0.5587, -0.0878, + 0.0426, 0.2162, 0.9754, + 6.2694, -7.0540, 3.3316}, + {2.8930, 8.5380, -3.3280}, % P + {1.6980, 7.6960, -3.5570}, % O1P + {3.2260, 9.5010, -4.4020}, % O2P + {4.1590, 7.6040, -3.0340}, % O5' + {5.4352, 8.2183, -2.7757}, % C5' + {5.3830, 8.7883, -1.8481}, % H5' + {5.7729, 8.7436, -3.6691}, % H5'' + {6.4830, 7.1518, -2.5252}, % C4' + {7.4749, 7.5972, -2.4482}, % H4' + {6.1626, 6.4620, -1.2827}, % O4' + {6.5431, 5.0992, -1.3905}, % C1' + {7.2871, 4.9328, -0.6114}, % H1' + {7.1852, 4.8935, -2.7592}, % C2' + {6.8573, 3.9363, -3.1645}, % H2'' + {8.5780, 5.1025, -2.6046}, % O2' + {8.9516, 4.7577, -1.7902}, % H2' + {6.5522, 6.0300, -3.5612}, % C3' + {5.5420, 5.7356, -3.8459}, % H3' + {7.3487, 6.4089, -4.6867}, % O3' + {3.6343, 2.6680, 2.0783}, % N1 + {5.4505, 3.9805, 1.2446}, % N3 + {4.7540, 3.3816, 2.1851}, % C2 + {4.8805, 3.7951, 0.0354}, % C4 + {3.7416, 3.0925, -0.2305}, % C5 + {3.0873, 2.4980, 0.8606}, % C6 + a, { + {1.9600, 1.7805, 0.7462}, % N6 + {3.4605, 3.1184, -1.5906}, % N7 + {5.3247, 4.2695, -1.1710}, % N9 + {4.4244, 3.8244, -2.0953}, % C8 + {5.0814, 3.4352, 3.2234}, % H2 + {1.5423, 1.6454, -0.1520}, % H61 + {1.5716, 1.3398, 1.5392}, % H62 + {4.2675, 3.8876, -3.1721}} % H8 + }. + +rA05() -> + { + {-0.5891, 0.0449, 0.8068, % dgf_base_tfo + 0.5375, 0.7673, 0.3498, + -0.6034, 0.6397, -0.4762, + -0.3019, -3.7679, -9.5913}, + {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo + -0.0433, -0.4257, 0.9038, + -0.5788, 0.7480, 0.3246, + 1.5227, 6.9114, -7.0765}, + {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo + 0.4552, 0.6637, 0.5935, + -0.8042, 0.0203, 0.5941, + -6.9472, -4.1186, -5.9108}, + {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo + -0.8247, 0.5587, -0.0878, + 0.0426, 0.2162, 0.9754, + 6.2694, -7.0540, 3.3316}, + {2.8930, 8.5380, -3.3280}, % P + {1.6980, 7.6960, -3.5570}, % O1P + {3.2260, 9.5010, -4.4020}, % O2P + {4.1590, 7.6040, -3.0340}, % O5' + {4.5778, 6.6594, -4.0364}, % C5' + {4.9220, 7.1963, -4.9204}, % H5' + {3.7996, 5.9091, -4.1764}, % H5'' + {5.7873, 5.8869, -3.5482}, % C4' + {6.0405, 5.0875, -4.2446}, % H4' + {6.9135, 6.8036, -3.4310}, % O4' + {7.7293, 6.4084, -2.3392}, % C1' + {8.7078, 6.1815, -2.7624}, % H1' + {7.1305, 5.1418, -1.7347}, % C2' + {7.2040, 5.1982, -0.6486}, % H2'' + {7.7417, 4.0392, -2.3813}, % O2' + {8.6785, 4.1443, -2.5630}, % H2' + {5.6666, 5.2728, -2.1536}, % C3' + {5.1747, 5.9805, -1.4863}, % H3' + {4.9997, 4.0086, -2.1973}, % O3' + {10.2594, 10.6774, -1.0056}, % N1 + {9.7528, 8.7080, -2.2631}, % N3 + {10.4471, 9.7876, -1.9791}, % C2 + {8.7271, 8.5575, -1.3991}, % C4 + {8.4100, 9.3803, -0.3580}, % C5 + {9.2294, 10.5030, -0.1574}, % C6 + a, { + {9.0349, 11.3951, 0.8250}, % N6 + {7.2891, 8.9068, 0.3121}, % N7 + {7.7962, 7.5519, -1.3859}, % N9 + {6.9702, 7.8292, -0.3353}, % C8 + {11.3132, 10.0537, -2.5851}, % H2 + {8.2741, 11.2784, 1.4629}, % H61 + {9.6733, 12.1368, 0.9529}, % H62 + {6.0888, 7.3990, 0.1403}} % H8 + }. + +rA06() -> + { + {-0.9815, 0.0731, -0.1772, % dgf_base_tfo + 0.1912, 0.3054, -0.9328, + -0.0141, -0.9494, -0.3137, + 5.7506, -5.1944, 4.7470}, + {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo + -0.0433, -0.4257, 0.9038, + -0.5788, 0.7480, 0.3246, + 1.5227, 6.9114, -7.0765}, + {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo + 0.4552, 0.6637, 0.5935, + -0.8042, 0.0203, 0.5941, + -6.9472, -4.1186, -5.9108}, + {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo + -0.8247, 0.5587, -0.0878, + 0.0426, 0.2162, 0.9754, + 6.2694, -7.0540, 3.3316}, + {2.8930, 8.5380, -3.3280}, % P + {1.6980, 7.6960, -3.5570}, % O1P + {3.2260, 9.5010, -4.4020}, % O2P + {4.1590, 7.6040, -3.0340}, % O5' + {4.1214, 6.7116, -1.9049}, % C5' + {3.3465, 5.9610, -2.0607}, % H5' + {4.0789, 7.2928, -0.9837}, % H5'' + {5.4170, 5.9293, -1.8186}, % C4' + {5.4506, 5.3400, -0.9023}, % H4' + {5.5067, 5.0417, -2.9703}, % O4' + {6.8650, 4.9152, -3.3612}, % C1' + {7.1090, 3.8577, -3.2603}, % H1' + {7.7152, 5.7282, -2.3894}, % C2' + {8.5029, 6.2356, -2.9463}, % H2'' + {8.1036, 4.8568, -1.3419}, % O2' + {8.3270, 3.9651, -1.6184}, % H2' + {6.7003, 6.7565, -1.8911}, % C3' + {6.5898, 7.5329, -2.6482}, % H3' + {7.0505, 7.2878, -0.6105}, % O3' + {6.6624, 3.5061, -8.2986}, % N1 + {6.5810, 3.2570, -5.9221}, % N3 + {6.5151, 2.8263, -7.1625}, % C2 + {6.8364, 4.5817, -5.8882}, % C4 + {7.0116, 5.4064, -6.9609}, % C5 + {6.9173, 4.8260, -8.2361}, % C6 + a, { + {7.0668, 5.5163, -9.3763}, % N6 + {7.2573, 6.7070, -6.5394}, % N7 + {6.9740, 5.3703, -4.7760}, % N9 + {7.2238, 6.6275, -5.2453}, % C8 + {6.3146, 1.7741, -7.3641}, % H2 + {7.2568, 6.4972, -9.3456}, % H61 + {7.0437, 5.0478, -10.2446}, % H62 + {7.4108, 7.6227, -4.8418}} % H8 + }. + +rA07() -> + { + {0.2379, 0.1310, -0.9624, % dgf_base_tfo + -0.5876, -0.7696, -0.2499, + -0.7734, 0.6249, -0.1061, + 30.9870, -26.9344, 42.6416}, + {0.7529, 0.1548, 0.6397, % p_o3'_275_tfo + 0.2952, -0.9481, -0.1180, + 0.5882, 0.2777, -0.7595, + -58.8919, -11.3095, 6.0866}, + {-0.0239, 0.9667, -0.2546, % p_o3'_180_tfo + 0.9731, -0.0359, -0.2275, + -0.2290, -0.2532, -0.9399, + 3.5401, -29.7913, 52.2796}, + {-0.8912, -0.4531, 0.0242, % p_o3'_60_tfo + -0.1183, 0.1805, -0.9764, + 0.4380, -0.8730, -0.2145, + 19.9023, 54.8054, 15.2799}, + {41.8210, 8.3880, 43.5890}, % P + {42.5400, 8.0450, 44.8330}, % O1P + {42.2470, 9.6920, 42.9910}, % O2P + {40.2550, 8.2030, 43.7340}, % O5' + {39.3505, 8.4697, 42.6565}, % C5' + {39.1377, 7.5433, 42.1230}, % H5' + {39.7203, 9.3119, 42.0717}, % H5'' + {38.0405, 8.9195, 43.2869}, % C4' + {37.3687, 9.3036, 42.5193}, % H4' + {37.4319, 7.8146, 43.9387}, % O4' + {37.1959, 8.1354, 45.3237}, % C1' + {36.1788, 8.5202, 45.3970}, % H1' + {38.1721, 9.2328, 45.6504}, % C2' + {39.1555, 8.7939, 45.8188}, % H2'' + {37.7862, 10.0617, 46.7013}, % O2' + {37.3087, 9.6229, 47.4092}, % H2' + {38.1844, 10.0268, 44.3367}, % C3' + {39.1578, 10.5054, 44.2289}, % H3' + {37.0547, 10.9127, 44.3441}, % O3' + {34.8811, 4.2072, 47.5784}, % N1 + {35.1084, 6.1336, 46.1818}, % N3 + {34.4108, 5.1360, 46.7207}, % C2 + {36.3908, 6.1224, 46.6053}, % C4 + {36.9819, 5.2334, 47.4697}, % C5 + {36.1786, 4.1985, 48.0035}, % C6 + a, { + {36.6103, 3.2749, 48.8452}, % N6 + {38.3236, 5.5522, 47.6595}, % N7 + {37.3887, 7.0024, 46.2437}, % N9 + {38.5055, 6.6096, 46.9057}, % C8 + {33.3553, 5.0152, 46.4771}, % H2 + {37.5730, 3.2804, 49.1507}, % H61 + {35.9775, 2.5638, 49.1828}, % H62 + {39.5461, 6.9184, 47.0041}} % H8 + }. + +rA08() -> + { + {0.1084, -0.0895, -0.9901, % dgf_base_tfo + 0.9789, -0.1638, 0.1220, + -0.1731, -0.9824, 0.0698, + -2.9039, 47.2655, 33.0094}, + {0.7529, 0.1548, 0.6397, % p_o3'_275_tfo + 0.2952, -0.9481, -0.1180, + 0.5882, 0.2777, -0.7595, + -58.8919, -11.3095, 6.0866}, + {-0.0239, 0.9667, -0.2546, % p_o3'_180_tfo + 0.9731, -0.0359, -0.2275, + -0.2290, -0.2532, -0.9399, + 3.5401, -29.7913, 52.2796}, + {-0.8912, -0.4531, 0.0242, % p_o3'_60_tfo + -0.1183, 0.1805, -0.9764, + 0.4380, -0.8730, -0.2145, + 19.9023, 54.8054, 15.2799}, + {41.8210, 8.3880, 43.5890}, % P + {42.5400, 8.0450, 44.8330}, % O1P + {42.2470, 9.6920, 42.9910}, % O2P + {40.2550, 8.2030, 43.7340}, % O5' + {39.4850, 8.9301, 44.6977}, % C5' + {39.0638, 9.8199, 44.2296}, % H5' + {40.0757, 9.0713, 45.6029}, % H5'' + {38.3102, 8.0414, 45.0789}, % C4' + {37.7842, 8.4637, 45.9351}, % H4' + {37.4200, 7.9453, 43.9769}, % O4' + {37.2249, 6.5609, 43.6273}, % C1' + {36.3360, 6.2168, 44.1561}, % H1' + {38.4347, 5.8414, 44.1590}, % C2' + {39.2688, 5.9974, 43.4749}, % H2'' + {38.2344, 4.4907, 44.4348}, % O2' + {37.6374, 4.0386, 43.8341}, % H2' + {38.6926, 6.6079, 45.4637}, % C3' + {39.7585, 6.5640, 45.6877}, % H3' + {37.8238, 6.0705, 46.4723}, % O3' + {33.9162, 6.2598, 39.7758}, % N1 + {34.6709, 6.5759, 42.0215}, % N3 + {33.7257, 6.5186, 41.0858}, % C2 + {35.8935, 6.3324, 41.5018}, % C4 + {36.2105, 6.0601, 40.1932}, % C5 + {35.1538, 6.0151, 39.2537}, % C6 + a, { + {35.3088, 5.7642, 37.9649}, % N6 + {37.5818, 5.8677, 40.0507}, % N7 + {37.0932, 6.3197, 42.1810}, % N9 + {38.0509, 6.0354, 41.2635}, % C8 + {32.6830, 6.6898, 41.3532}, % H2 + {36.2305, 5.5855, 37.5925}, % H61 + {34.5056, 5.7512, 37.3528}, % H62 + {39.1318, 5.8993, 41.2285}} % H8 + }. + +rA09() -> + { + {0.8467, 0.4166, -0.3311, % dgf_base_tfo + -0.3962, 0.9089, 0.1303, + 0.3552, 0.0209, 0.9346, + -42.7319, -26.6223, -29.8163}, + {0.7529, 0.1548, 0.6397, % p_o3'_275_tfo + 0.2952, -0.9481, -0.1180, + 0.5882, 0.2777, -0.7595, + -58.8919, -11.3095, 6.0866}, + {-0.0239, 0.9667, -0.2546, % p_o3'_180_tfo + 0.9731, -0.0359, -0.2275, + -0.2290, -0.2532, -0.9399, + 3.5401, -29.7913, 52.2796}, + {-0.8912, -0.4531, 0.0242, % p_o3'_60_tfo + -0.1183, 0.1805, -0.9764, + 0.4380, -0.8730, -0.2145, + 19.9023, 54.8054, 15.2799}, + {41.8210, 8.3880, 43.5890}, % P + {42.5400, 8.0450, 44.8330}, % O1P + {42.2470, 9.6920, 42.9910}, % O2P + {40.2550, 8.2030, 43.7340}, % O5' + {39.3505, 8.4697, 42.6565}, % C5' + {39.1377, 7.5433, 42.1230}, % H5' + {39.7203, 9.3119, 42.0717}, % H5'' + {38.0405, 8.9195, 43.2869}, % C4' + {37.6479, 8.1347, 43.9335}, % H4' + {38.2691, 10.0933, 44.0524}, % O4' + {37.3999, 11.1488, 43.5973}, % C1' + {36.5061, 11.1221, 44.2206}, % H1' + {37.0364, 10.7838, 42.1836}, % C2' + {37.8636, 11.0489, 41.5252}, % H2'' + {35.8275, 11.3133, 41.7379}, % O2' + {35.6214, 12.1896, 42.0714}, % H2' + {36.9316, 9.2556, 42.2837}, % C3' + {37.1778, 8.8260, 41.3127}, % H3' + {35.6285, 8.9334, 42.7926}, % O3' + {38.1482, 15.2833, 46.4641}, % N1 + {37.3641, 13.0968, 45.9007}, % N3 + {37.5032, 14.1288, 46.7300}, % C2 + {37.9570, 13.3377, 44.7113}, % C4 + {38.6397, 14.4660, 44.3267}, % C5 + {38.7473, 15.5229, 45.2609}, % C6 + a, { + {39.3720, 16.6649, 45.0297}, % N6 + {39.1079, 14.3351, 43.0223}, % N7 + {38.0132, 12.4868, 43.6280}, % N9 + {38.7058, 13.1402, 42.6620}, % C8 + {37.0731, 14.0857, 47.7306}, % H2 + {39.8113, 16.8281, 44.1350}, % H61 + {39.4100, 17.3741, 45.7478}, % H62 + {39.0412, 12.9660, 41.6397}} % H8 + }. + +rA10() -> + { + {0.7063, 0.6317, -0.3196, % dgf_base_tfo + -0.0403, -0.4149, -0.9090, + -0.7068, 0.6549, -0.2676, + 6.4402, -52.1496, 30.8246}, + {0.7529, 0.1548, 0.6397, % p_o3'_275_tfo + 0.2952, -0.9481, -0.1180, + 0.5882, 0.2777, -0.7595, + -58.8919, -11.3095, 6.0866}, + {-0.0239, 0.9667, -0.2546, % p_o3'_180_tfo + 0.9731, -0.0359, -0.2275, + -0.2290, -0.2532, -0.9399, + 3.5401, -29.7913, 52.2796}, + {-0.8912, -0.4531, 0.0242, % p_o3'_60_tfo + -0.1183, 0.1805, -0.9764, + 0.4380, -0.8730, -0.2145, + 19.9023, 54.8054, 15.2799}, + {41.8210, 8.3880, 43.5890}, % P + {42.5400, 8.0450, 44.8330}, % O1P + {42.2470, 9.6920, 42.9910}, % O2P + {40.2550, 8.2030, 43.7340}, % O5' + {39.4850, 8.9301, 44.6977}, % C5' + {39.0638, 9.8199, 44.2296}, % H5' + {40.0757, 9.0713, 45.6029}, % H5'' + {38.3102, 8.0414, 45.0789}, % C4' + {37.7099, 7.8166, 44.1973}, % H4' + {38.8012, 6.8321, 45.6380}, % O4' + {38.2431, 6.6413, 46.9529}, % C1' + {37.3505, 6.0262, 46.8385}, % H1' + {37.8484, 8.0156, 47.4214}, % C2' + {38.7381, 8.5406, 47.7690}, % H2'' + {36.8286, 8.0368, 48.3701}, % O2' + {36.8392, 7.3063, 48.9929}, % H2' + {37.3576, 8.6512, 46.1132}, % C3' + {37.5207, 9.7275, 46.1671}, % H3' + {35.9985, 8.2392, 45.9032}, % O3' + {39.9117, 2.2278, 48.8527}, % N1 + {38.6207, 3.6941, 47.4757}, % N3 + {38.9872, 2.4888, 47.9057}, % C2 + {39.2961, 4.6720, 48.1174}, % C4 + {40.2546, 4.5307, 49.0912}, % C5 + {40.5932, 3.2189, 49.4985}, % C6 + a, { + {41.4938, 2.9317, 50.4229}, % N6 + {40.7195, 5.7755, 49.5060}, % N7 + {39.1730, 6.0305, 47.9170}, % N9 + {40.0413, 6.6250, 48.7728}, % C8 + {38.5257, 1.5960, 47.4838}, % H2 + {41.9907, 3.6753, 50.8921}, % H61 + {41.6848, 1.9687, 50.6599}, % H62 + {40.3571, 7.6321, 49.0452}} % H8 + }. + +rAs() -> [rA01(),rA02(),rA03(),rA04(),rA05(),rA06(),rA07(), + rA08(),rA09(),rA10()]. + +rC() -> + { + {-0.0359, -0.8071, 0.5894, % dgf_base_tfo + -0.2669, 0.5761, 0.7726, + -0.9631, -0.1296, -0.2361, + 0.1584, 8.3434, 0.5434}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {5.2430, -8.2420, 2.8260}, % C5' + {5.1974, -8.8497, 1.9223}, % H5' + {5.5548, -8.7348, 3.7469}, % H5'' + {6.3140, -7.2060, 2.5510}, % C4' + {7.2954, -7.6762, 2.4898}, % H4' + {6.0140, -6.5420, 1.2890}, % O4' + {6.4190, -5.1840, 1.3620}, % C1' + {7.1608, -5.0495, 0.5747}, % H1' + {7.0760, -4.9560, 2.7270}, % C2' + {6.7770, -3.9803, 3.1099}, % H2'' + {8.4500, -5.1930, 2.5810}, % O2' + {8.8309, -4.8755, 1.7590}, % H2' + {6.4060, -6.0590, 3.5580}, % C3' + {5.4021, -5.7313, 3.8281}, % H3' + {7.1570, -6.4240, 4.7070}, % O3' + {5.2170, -4.3260, 1.1690}, % N1 + {4.2960, -2.2560, 0.6290}, % N3 + {5.4330, -3.0200, 0.7990}, % C2 + {2.9930, -2.6780, 0.7940}, % C4 + {2.8670, -4.0630, 1.1830}, % C5 + {3.9570, -4.8300, 1.3550}, % C6 + c, { + {2.0187, -1.8047, 0.5874}, % N4 + {6.5470, -2.5560, 0.6290}, % O2 + {1.0684, -2.1236, 0.7109}, % H41 + {2.2344, -0.8560, 0.3162}, % H42 + {1.8797, -4.4972, 1.3404}, % H5 + {3.8479, -5.8742, 1.6480}} % H6 + }. + +rC01() -> + { + {-0.0137, -0.8012, 0.5983, % dgf_base_tfo + -0.2523, 0.5817, 0.7733, + -0.9675, -0.1404, -0.2101, + 0.2031, 8.3874, 0.4228}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {5.2416, -8.2422, 2.8181}, % C5' + {5.2050, -8.8128, 1.8901}, % H5' + {5.5368, -8.7738, 3.7227}, % H5'' + {6.3232, -7.2037, 2.6002}, % C4' + {7.3048, -7.6757, 2.5577}, % H4' + {6.0635, -6.5092, 1.3456}, % O4' + {6.4697, -5.1547, 1.4629}, % C1' + {7.2354, -5.0043, 0.7018}, % H1' + {7.0856, -4.9610, 2.8521}, % C2' + {6.7777, -3.9935, 3.2487}, % H2'' + {8.4627, -5.1992, 2.7423}, % O2' + {8.8693, -4.8638, 1.9399}, % H2' + {6.3877, -6.0809, 3.6362}, % C3' + {5.3770, -5.7562, 3.8834}, % H3' + {7.1024, -6.4754, 4.7985}, % O3' + {5.2764, -4.2883, 1.2538}, % N1 + {4.3777, -2.2062, 0.7229}, % N3 + {5.5069, -2.9779, 0.9088}, % C2 + {3.0693, -2.6246, 0.8500}, % C4 + {2.9279, -4.0146, 1.2149}, % C5 + {4.0101, -4.7892, 1.4017}, % C6 + c, { + {2.1040, -1.7437, 0.6331}, % N4 + {6.6267, -2.5166, 0.7728}, % O2 + {1.1496, -2.0600, 0.7287}, % H41 + {2.3303, -0.7921, 0.3815}, % H42 + {1.9353, -4.4465, 1.3419}, % H5 + {3.8895, -5.8371, 1.6762}} % H6 + }. + +rC02() -> + { + {0.5141, 0.0246, 0.8574, % dgf_base_tfo + -0.5547, -0.7529, 0.3542, + 0.6542, -0.6577, -0.3734, + -9.1111, -3.4598, -3.2939}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {4.3825, -6.6585, 4.0489}, % C5' + {4.6841, -7.2019, 4.9443}, % H5' + {3.6189, -5.8889, 4.1625}, % H5'' + {5.6255, -5.9175, 3.5998}, % C4' + {5.8732, -5.1228, 4.3034}, % H4' + {6.7337, -6.8605, 3.5222}, % O4' + {7.5932, -6.4923, 2.4548}, % C1' + {8.5661, -6.2983, 2.9064}, % H1' + {7.0527, -5.2012, 1.8322}, % C2' + {7.1627, -5.2525, 0.7490}, % H2'' + {7.6666, -4.1249, 2.4880}, % O2' + {8.5944, -4.2543, 2.6981}, % H2' + {5.5661, -5.3029, 2.2009}, % C3' + {5.0841, -6.0018, 1.5172}, % H3' + {4.9062, -4.0452, 2.2042}, % O3' + {7.6298, -7.6136, 1.4752}, % N1 + {8.6945, -8.7046, -0.2857}, % N3 + {8.6943, -7.6514, 0.6066}, % C2 + {7.7426, -9.6987, -0.3801}, % C4 + {6.6642, -9.5742, 0.5722}, % C5 + {6.6391, -8.5592, 1.4526}, % C6 + c, { + {7.9033, -10.6371, -1.3010}, % N4 + {9.5840, -6.8186, 0.6136}, % O2 + {7.2009, -11.3604, -1.3619}, % H41 + {8.7058, -10.6168, -1.9140}, % H42 + {5.8585, -10.3083, 0.5822}, % H5 + {5.8197, -8.4773, 2.1667}} % H6 + }. + +rC03() -> + { + {-0.4993, 0.0476, 0.8651, % dgf_base_tfo + 0.8078, -0.3353, 0.4847, + 0.3132, 0.9409, 0.1290, + 6.2989, -5.2303, -3.8577}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {3.9938, -6.7042, 1.9023}, % C5' + {3.2332, -5.9343, 2.0319}, % H5' + {3.9666, -7.2863, 0.9812}, % H5'' + {5.3098, -5.9546, 1.8564}, % C4' + {5.3863, -5.3702, 0.9395}, % H4' + {5.3851, -5.0642, 3.0076}, % O4' + {6.7315, -4.9724, 3.4462}, % C1' + {7.0033, -3.9202, 3.3619}, % H1' + {7.5997, -5.8018, 2.4948}, % C2' + {8.3627, -6.3254, 3.0707}, % H2'' + {8.0410, -4.9501, 1.4724}, % O2' + {8.2781, -4.0644, 1.7570}, % H2' + {6.5701, -6.8129, 1.9714}, % C3' + {6.4186, -7.5809, 2.7299}, % H3' + {6.9357, -7.3841, 0.7235}, % O3' + {6.8024, -5.4718, 4.8475}, % N1 + {7.9218, -5.5700, 6.8877}, % N3 + {7.8908, -5.0886, 5.5944}, % C2 + {6.9789, -6.3827, 7.4823}, % C4 + {5.8742, -6.7319, 6.6202}, % C5 + {5.8182, -6.2769, 5.3570}, % C6 + c, { + {7.1702, -6.7511, 8.7402}, % N4 + {8.7747, -4.3728, 5.1568}, % O2 + {6.4741, -7.3461, 9.1662}, % H41 + {7.9889, -6.4396, 9.2429}, % H42 + {5.0736, -7.3713, 6.9922}, % H5 + {4.9784, -6.5473, 4.7170}} % H6 + }. + +rC04() -> + { + {-0.5669, -0.8012, 0.1918, % dgf_base_tfo + -0.8129, 0.5817, 0.0273, + -0.1334, -0.1404, -0.9811, + -0.3279, 8.3874, 0.3355}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {5.2416, -8.2422, 2.8181}, % C5' + {5.2050, -8.8128, 1.8901}, % H5' + {5.5368, -8.7738, 3.7227}, % H5'' + {6.3232, -7.2037, 2.6002}, % C4' + {7.3048, -7.6757, 2.5577}, % H4' + {6.0635, -6.5092, 1.3456}, % O4' + {6.4697, -5.1547, 1.4629}, % C1' + {7.2354, -5.0043, 0.7018}, % H1' + {7.0856, -4.9610, 2.8521}, % C2' + {6.7777, -3.9935, 3.2487}, % H2'' + {8.4627, -5.1992, 2.7423}, % O2' + {8.8693, -4.8638, 1.9399}, % H2' + {6.3877, -6.0809, 3.6362}, % C3' + {5.3770, -5.7562, 3.8834}, % H3' + {7.1024, -6.4754, 4.7985}, % O3' + {5.2764, -4.2883, 1.2538}, % N1 + {3.8961, -3.0896, -0.1893}, % N3 + {5.0095, -3.8907, -0.0346}, % C2 + {3.0480, -2.6632, 0.8116}, % C4 + {3.4093, -3.1310, 2.1292}, % C5 + {4.4878, -3.9124, 2.3088}, % C6 + c, { + {2.0216, -1.8941, 0.4804}, % N4 + {5.7005, -4.2164, -0.9842}, % O2 + {1.4067, -1.5873, 1.2205}, % H41 + {1.8721, -1.6319, -0.4835}, % H42 + {2.8048, -2.8507, 2.9918}, % H5 + {4.7491, -4.2593, 3.3085}} % H6 + }. + +rC05() -> + { + {-0.6298, 0.0246, 0.7763, % dgf_base_tfo + -0.5226, -0.7529, -0.4001, + 0.5746, -0.6577, 0.4870, + -0.0208, -3.4598, -9.6882}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {4.3825, -6.6585, 4.0489}, % C5' + {4.6841, -7.2019, 4.9443}, % H5' + {3.6189, -5.8889, 4.1625}, % H5'' + {5.6255, -5.9175, 3.5998}, % C4' + {5.8732, -5.1228, 4.3034}, % H4' + {6.7337, -6.8605, 3.5222}, % O4' + {7.5932, -6.4923, 2.4548}, % C1' + {8.5661, -6.2983, 2.9064}, % H1' + {7.0527, -5.2012, 1.8322}, % C2' + {7.1627, -5.2525, 0.7490}, % H2'' + {7.6666, -4.1249, 2.4880}, % O2' + {8.5944, -4.2543, 2.6981}, % H2' + {5.5661, -5.3029, 2.2009}, % C3' + {5.0841, -6.0018, 1.5172}, % H3' + {4.9062, -4.0452, 2.2042}, % O3' + {7.6298, -7.6136, 1.4752}, % N1 + {8.5977, -9.5977, 0.7329}, % N3 + {8.5951, -8.5745, 1.6594}, % C2 + {7.7372, -9.7371, -0.3364}, % C4 + {6.7596, -8.6801, -0.4476}, % C5 + {6.7338, -7.6721, 0.4408}, % C6 + c, { + {7.8849, -10.7881, -1.1289}, % N4 + {9.3993, -8.5377, 2.5743}, % O2 + {7.2499, -10.8809, -1.9088}, % H41 + {8.6122, -11.4649, -0.9468}, % H42 + {6.0317, -8.6941, -1.2588}, % H5 + {5.9901, -6.8809, 0.3459}} % H6 + }. + +rC06() -> + { + {-0.9837, 0.0476, -0.1733, % dgf_base_tfo + -0.1792, -0.3353, 0.9249, + -0.0141, 0.9409, 0.3384, + 5.7793, -5.2303, 4.5997}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {3.9938, -6.7042, 1.9023}, % C5' + {3.2332, -5.9343, 2.0319}, % H5' + {3.9666, -7.2863, 0.9812}, % H5'' + {5.3098, -5.9546, 1.8564}, % C4' + {5.3863, -5.3702, 0.9395}, % H4' + {5.3851, -5.0642, 3.0076}, % O4' + {6.7315, -4.9724, 3.4462}, % C1' + {7.0033, -3.9202, 3.3619}, % H1' + {7.5997, -5.8018, 2.4948}, % C2' + {8.3627, -6.3254, 3.0707}, % H2'' + {8.0410, -4.9501, 1.4724}, % O2' + {8.2781, -4.0644, 1.7570}, % H2' + {6.5701, -6.8129, 1.9714}, % C3' + {6.4186, -7.5809, 2.7299}, % H3' + {6.9357, -7.3841, 0.7235}, % O3' + {6.8024, -5.4718, 4.8475}, % N1 + {6.6920, -5.0495, 7.1354}, % N3 + {6.6201, -4.5500, 5.8506}, % C2 + {6.9254, -6.3614, 7.4926}, % C4 + {7.1046, -7.2543, 6.3718}, % C5 + {7.0391, -6.7951, 5.1106}, % C6 + c, { + {6.9614, -6.6648, 8.7815}, % N4 + {6.4083, -3.3696, 5.6340}, % O2 + {7.1329, -7.6280, 9.0324}, % H41 + {6.8204, -5.9469, 9.4777}, % H42 + {7.2954, -8.3135, 6.5440}, % H5 + {7.1753, -7.4798, 4.2735}} % H6 + }. + +rC07() -> + { + {0.0033, 0.2720, -0.9623, % dgf_base_tfo + 0.3013, -0.9179, -0.2584, + -0.9535, -0.2891, -0.0850, + 43.0403, 13.7233, 34.5710}, + {0.9187, 0.2887, 0.2694, % p_o3'_275_tfo + 0.0302, -0.7316, 0.6811, + 0.3938, -0.6176, -0.6808, + -48.4330, 26.3254, 13.6383}, + {-0.1504, 0.7744, -0.6145, % p_o3'_180_tfo + 0.7581, 0.4893, 0.4311, + 0.6345, -0.4010, -0.6607, + -31.9784, -13.4285, 44.9650}, + {-0.6236, -0.7810, -0.0337, % p_o3'_60_tfo + -0.6890, 0.5694, -0.4484, + 0.3694, -0.2564, -0.8932, + 12.1105, 30.8774, 46.0946}, + {33.3400, 11.0980, 46.1750}, % P + {34.5130, 10.2320, 46.4660}, % O1P + {33.4130, 12.3960, 46.9340}, % O2P + {31.9810, 10.3390, 46.4820}, % O5' + {30.8152, 11.1619, 46.2003}, % C5' + {30.4519, 10.9454, 45.1957}, % H5' + {31.0379, 12.2016, 46.4400}, % H5'' + {29.7081, 10.7448, 47.1428}, % C4' + {28.8710, 11.4416, 47.0982}, % H4' + {29.2550, 9.4394, 46.8162}, % O4' + {29.3907, 8.5625, 47.9460}, % C1' + {28.4416, 8.5669, 48.4819}, % H1' + {30.4468, 9.2031, 48.7952}, % C2' + {31.4222, 8.9651, 48.3709}, % H2'' + {30.3701, 8.9157, 50.1624}, % O2' + {30.0652, 8.0304, 50.3740}, % H2' + {30.1622, 10.6879, 48.6120}, % C3' + {31.0952, 11.2399, 48.7254}, % H3' + {29.1076, 11.1535, 49.4702}, % O3' + {29.7883, 7.2209, 47.5235}, % N1 + {29.1825, 5.0438, 46.8275}, % N3 + {28.8008, 6.2912, 47.2263}, % C2 + {30.4888, 4.6890, 46.7186}, % C4 + {31.5034, 5.6405, 47.0249}, % C5 + {31.1091, 6.8691, 47.4156}, % C6 + c, { + {30.8109, 3.4584, 46.3336}, % N4 + {27.6171, 6.5989, 47.3189}, % O2 + {31.7923, 3.2301, 46.2638}, % H41 + {30.0880, 2.7857, 46.1215}, % H42 + {32.5542, 5.3634, 46.9395}, % H5 + {31.8523, 7.6279, 47.6603}} % H6 + }. + +rC08() -> + { + {0.0797, -0.6026, -0.7941, % dgf_base_tfo + 0.7939, 0.5201, -0.3150, + 0.6028, -0.6054, 0.5198, + -36.8341, 41.5293, 1.6628}, + {0.9187, 0.2887, 0.2694, % p_o3'_275_tfo + 0.0302, -0.7316, 0.6811, + 0.3938, -0.6176, -0.6808, + -48.4330, 26.3254, 13.6383}, + {-0.1504, 0.7744, -0.6145, % p_o3'_180_tfo + 0.7581, 0.4893, 0.4311, + 0.6345, -0.4010, -0.6607, + -31.9784, -13.4285, 44.9650}, + {-0.6236, -0.7810, -0.0337, % p_o3'_60_tfo + -0.6890, 0.5694, -0.4484, + 0.3694, -0.2564, -0.8932, + 12.1105, 30.8774, 46.0946}, + {33.3400, 11.0980, 46.1750}, % P + {34.5130, 10.2320, 46.4660}, % O1P + {33.4130, 12.3960, 46.9340}, % O2P + {31.9810, 10.3390, 46.4820}, % O5' + {31.8779, 9.9369, 47.8760}, % C5' + {31.3239, 10.6931, 48.4322}, % H5' + {32.8647, 9.6624, 48.2489}, % H5'' + {31.0429, 8.6773, 47.9401}, % C4' + {31.0779, 8.2331, 48.9349}, % H4' + {29.6956, 8.9669, 47.5983}, % O4' + {29.2784, 8.1700, 46.4782}, % C1' + {28.8006, 7.2731, 46.8722}, % H1' + {30.5544, 7.7940, 45.7875}, % C2' + {30.8837, 8.6410, 45.1856}, % H2'' + {30.5100, 6.6007, 45.0582}, % O2' + {29.6694, 6.4168, 44.6326}, % H2' + {31.5146, 7.5954, 46.9527}, % C3' + {32.5255, 7.8261, 46.6166}, % H3' + {31.3876, 6.2951, 47.5516}, % O3' + {28.3976, 8.9302, 45.5933}, % N1 + {26.2155, 9.6135, 44.9910}, % N3 + {27.0281, 8.8961, 45.8192}, % C2 + {26.7044, 10.3489, 43.9595}, % C4 + {28.1088, 10.3837, 43.7247}, % C5 + {28.8978, 9.6708, 44.5535}, % C6 + c, { + {25.8715, 11.0249, 43.1749}, % N4 + {26.5733, 8.2371, 46.7484}, % O2 + {26.2707, 11.5609, 42.4177}, % H41 + {24.8760, 10.9939, 43.3427}, % H42 + {28.5089, 10.9722, 42.8990}, % H5 + {29.9782, 9.6687, 44.4097}} % H6 + }. + +rC09() -> + { + {0.8727, 0.4760, -0.1091, % dgf_base_tfo + -0.4188, 0.6148, -0.6682, + -0.2510, 0.6289, 0.7359, + -8.1687, -52.0761, -25.0726}, + {0.9187, 0.2887, 0.2694, % p_o3'_275_tfo + 0.0302, -0.7316, 0.6811, + 0.3938, -0.6176, -0.6808, + -48.4330, 26.3254, 13.6383}, + {-0.1504, 0.7744, -0.6145, % p_o3'_180_tfo + 0.7581, 0.4893, 0.4311, + 0.6345, -0.4010, -0.6607, + -31.9784, -13.4285, 44.9650}, + {-0.6236, -0.7810, -0.0337, % p_o3'_60_tfo + -0.6890, 0.5694, -0.4484, + 0.3694, -0.2564, -0.8932, + 12.1105, 30.8774, 46.0946}, + {33.3400, 11.0980, 46.1750}, % P + {34.5130, 10.2320, 46.4660}, % O1P + {33.4130, 12.3960, 46.9340}, % O2P + {31.9810, 10.3390, 46.4820}, % O5' + {30.8152, 11.1619, 46.2003}, % C5' + {30.4519, 10.9454, 45.1957}, % H5' + {31.0379, 12.2016, 46.4400}, % H5'' + {29.7081, 10.7448, 47.1428}, % C4' + {29.4506, 9.6945, 47.0059}, % H4' + {30.1045, 10.9634, 48.4885}, % O4' + {29.1794, 11.8418, 49.1490}, % C1' + {28.4388, 11.2210, 49.6533}, % H1' + {28.5211, 12.6008, 48.0367}, % C2' + {29.1947, 13.3949, 47.7147}, % H2'' + {27.2316, 13.0683, 48.3134}, % O2' + {27.0851, 13.3391, 49.2227}, % H2' + {28.4131, 11.5507, 46.9391}, % C3' + {28.4451, 12.0512, 45.9713}, % H3' + {27.2707, 10.6955, 47.1097}, % O3' + {29.8751, 12.7405, 50.0682}, % N1 + {30.7172, 13.1841, 52.2328}, % N3 + {30.0617, 12.3404, 51.3847}, % C2 + {31.1834, 14.3941, 51.8297}, % C4 + {30.9913, 14.8074, 50.4803}, % C5 + {30.3434, 13.9610, 49.6548}, % C6 + c, { + {31.8090, 15.1847, 52.6957}, % N4 + {29.6470, 11.2494, 51.7616}, % O2 + {32.1422, 16.0774, 52.3606}, % H41 + {31.9392, 14.8893, 53.6527}, % H42 + {31.3632, 15.7771, 50.1491}, % H5 + {30.1742, 14.2374, 48.6141}} % H6 + }. + +rC10() -> + { + {0.1549, 0.8710, -0.4663, % dgf_base_tfo + 0.6768, -0.4374, -0.5921, + -0.7197, -0.2239, -0.6572, + 25.2447, -14.1920, 50.3201}, + {0.9187, 0.2887, 0.2694, % p_o3'_275_tfo + 0.0302, -0.7316, 0.6811, + 0.3938, -0.6176, -0.6808, + -48.4330, 26.3254, 13.6383}, + {-0.1504, 0.7744, -0.6145, % p_o3'_180_tfo + 0.7581, 0.4893, 0.4311, + 0.6345, -0.4010, -0.6607, + -31.9784, -13.4285, 44.9650}, + {-0.6236, -0.7810, -0.0337, % p_o3'_60_tfo + -0.6890, 0.5694, -0.4484, + 0.3694, -0.2564, -0.8932, + 12.1105, 30.8774, 46.0946}, + {33.3400, 11.0980, 46.1750}, % P + {34.5130, 10.2320, 46.4660}, % O1P + {33.4130, 12.3960, 46.9340}, % O2P + {31.9810, 10.3390, 46.4820}, % O5' + {31.8779, 9.9369, 47.8760}, % C5' + {31.3239, 10.6931, 48.4322}, % H5' + {32.8647, 9.6624, 48.2489}, % H5'' + {31.0429, 8.6773, 47.9401}, % C4' + {30.0440, 8.8473, 47.5383}, % H4' + {31.6749, 7.6351, 47.2119}, % O4' + {31.9159, 6.5022, 48.0616}, % C1' + {31.0691, 5.8243, 47.9544}, % H1' + {31.9300, 7.0685, 49.4493}, % C2' + {32.9024, 7.5288, 49.6245}, % H2'' + {31.5672, 6.1750, 50.4632}, % O2' + {31.8416, 5.2663, 50.3200}, % H2' + {30.8618, 8.1514, 49.3749}, % C3' + {31.1122, 8.9396, 50.0850}, % H3' + {29.5351, 7.6245, 49.5409}, % O3' + {33.1890, 5.8629, 47.7343}, % N1 + {34.4004, 4.2636, 46.4828}, % N3 + {33.2062, 4.8497, 46.7851}, % C2 + {35.5600, 4.6374, 47.0822}, % C4 + {35.5444, 5.6751, 48.0577}, % C5 + {34.3565, 6.2450, 48.3432}, % C6 + c, { + {36.6977, 4.0305, 46.7598}, % N4 + {32.1661, 4.5034, 46.2348}, % O2 + {37.5405, 4.3347, 47.2259}, % H41 + {36.7033, 3.2923, 46.0706}, % H42 + {36.4713, 5.9811, 48.5428}, % H5 + {34.2986, 7.0426, 49.0839}} % H6 + }. + +rCs() -> [rC01(),rC02(),rC03(),rC04(),rC05(),rC06(),rC07(), + rC08(),rC09(),rC10()]. + +rG() -> + { + {-0.0018, -0.8207, 0.5714, % dgf_base_tfo + 0.2679, -0.5509, -0.7904, + 0.9634, 0.1517, 0.2209, + 0.0073, 8.4030, 0.6232}, + {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo + -0.0433, -0.4257, 0.9038, + -0.5788, 0.7480, 0.3246, + 1.5227, 6.9114, -7.0765}, + {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo + 0.4552, 0.6637, 0.5935, + -0.8042, 0.0203, 0.5941, + -6.9472, -4.1186, -5.9108}, + {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo + -0.8247, 0.5587, -0.0878, + 0.0426, 0.2162, 0.9754, + 6.2694, -7.0540, 3.3316}, + {2.8930, 8.5380, -3.3280}, % P + {1.6980, 7.6960, -3.5570}, % O1P + {3.2260, 9.5010, -4.4020}, % O2P + {4.1590, 7.6040, -3.0340}, % O5' + {5.4550, 8.2120, -2.8810}, % C5' + {5.4546, 8.8508, -1.9978}, % H5' + {5.7588, 8.6625, -3.8259}, % H5'' + {6.4970, 7.1480, -2.5980}, % C4' + {7.4896, 7.5919, -2.5214}, % H4' + {6.1630, 6.4860, -1.3440}, % O4' + {6.5400, 5.1200, -1.4190}, % C1' + {7.2763, 4.9681, -0.6297}, % H1' + {7.1940, 4.8830, -2.7770}, % C2' + {6.8667, 3.9183, -3.1647}, % H2'' + {8.5860, 5.0910, -2.6140}, % O2' + {8.9510, 4.7626, -1.7890}, % H2' + {6.5720, 6.0040, -3.6090}, % C3' + {5.5636, 5.7066, -3.8966}, % H3' + {7.3801, 6.3562, -4.7350}, % O3' + {4.7150, 0.4910, -0.1360}, % N1 + {6.3490, 2.1730, -0.6020}, % N3 + {5.9530, 0.9650, -0.2670}, % C2 + {5.2900, 2.9790, -0.8260}, % C4 + {3.9720, 2.6390, -0.7330}, % C5 + {3.6770, 1.3160, -0.3660}, % C6 + g, { + {6.8426, 0.0056, -0.0019}, % N2 + {3.1660, 3.7290, -1.0360}, % N7 + {5.3170, 4.2990, -1.1930}, % N9 + {4.0100, 4.6780, -1.2990}, % C8 + {2.4280, 0.8450, -0.2360}, % O6 + {4.6151, -0.4677, 0.1305}, % H1 + {6.6463, -0.9463, 0.2729}, % H21 + {7.8170, 0.2642, -0.0640}, % H22 + {3.4421, 5.5744, -1.5482}} % H8 + }. + +% rG01() -> +% { +% {-0.0043, -0.8175, 0.5759, % dgf_base_tfo +% 0.2617, -0.5567, -0.7884, +% 0.9651, 0.1473, 0.2164, +% 0.0359, 8.3929, 0.5532}, +% {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo +% -0.0433, -0.4257, 0.9038, +% -0.5788, 0.7480, 0.3246, +% 1.5227, 6.9114, -7.0765}, +% {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo +% 0.4552, 0.6637, 0.5935, +% -0.8042, 0.0203, 0.5941, +% -6.9472, -4.1186, -5.9108}, +% {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo +% -0.8247, 0.5587, -0.0878, +% 0.0426, 0.2162, 0.9754, +% 6.2694, -7.0540, 3.3316}, +% {2.8930, 8.5380, -3.3280}, % P +% {1.6980, 7.6960, -3.5570}, % O1P +% {3.2260, 9.5010, -4.4020}, % O2P +% {4.1590, 7.6040, -3.0340}, % O5' +% {5.4352, 8.2183, -2.7757}, % C5' +% {5.3830, 8.7883, -1.8481}, % H5' +% {5.7729, 8.7436, -3.6691}, % H5'' +% {6.4830, 7.1518, -2.5252}, % C4' +% {7.4749, 7.5972, -2.4482}, % H4' +% {6.1626, 6.4620, -1.2827}, % O4' +% {6.5431, 5.0992, -1.3905}, % C1' +% {7.2871, 4.9328, -0.6114}, % H1' +% {7.1852, 4.8935, -2.7592}, % C2' +% {6.8573, 3.9363, -3.1645}, % H2'' +% {8.5780, 5.1025, -2.6046}, % O2' +% {8.9516, 4.7577, -1.7902}, % H2' +% {6.5522, 6.0300, -3.5612}, % C3' +% {5.5420, 5.7356, -3.8459}, % H3' +% {7.3487, 6.4089, -4.6867}, % O3' +% {4.7442, 0.4514, -0.1390}, % N1 +% {6.3687, 2.1459, -0.5926}, % N3 +% {5.9795, 0.9335, -0.2657}, % C2 +% {5.3052, 2.9471, -0.8125}, % C4 +% {3.9891, 2.5987, -0.7230}, % C5 +% {3.7016, 1.2717, -0.3647}, % C6 +% g, { +% {6.8745, -0.0224, -0.0058}, % N2 +% {3.1770, 3.6859, -1.0198}, % N7 +% {5.3247, 4.2695, -1.1710}, % N9 +% {4.0156, 4.6415, -1.2759}, % C8 +% {2.4553, 0.7925, -0.2390}, % O6 +% {4.6497, -0.5095, 0.1212}, % H1 +% {6.6836, -0.9771, 0.2627}, % H21 +% {7.8474, 0.2424, -0.0653}, % H22 +% {3.4426, 5.5361, -1.5199}} % H8 +% }. + +% rG02() -> +% { +% {0.5566, 0.0449, 0.8296, % dgf_base_tfo +% 0.5125, 0.7673, -0.3854, +% -0.6538, 0.6397, 0.4041, +% -9.1161, -3.7679, -2.9968}, +% {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo +% -0.0433, -0.4257, 0.9038, +% -0.5788, 0.7480, 0.3246, +% 1.5227, 6.9114, -7.0765}, +% {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo +% 0.4552, 0.6637, 0.5935, +% -0.8042, 0.0203, 0.5941, +% -6.9472, -4.1186, -5.9108}, +% {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo +% -0.8247, 0.5587, -0.0878, +% 0.0426, 0.2162, 0.9754, +% 6.2694, -7.0540, 3.3316}, +% {2.8930, 8.5380, -3.3280}, % P +% {1.6980, 7.6960, -3.5570}, % O1P +% {3.2260, 9.5010, -4.4020}, % O2P +% {4.1590, 7.6040, -3.0340}, % O5' +% {4.5778, 6.6594, -4.0364}, % C5' +% {4.9220, 7.1963, -4.9204}, % H5' +% {3.7996, 5.9091, -4.1764}, % H5'' +% {5.7873, 5.8869, -3.5482}, % C4' +% {6.0405, 5.0875, -4.2446}, % H4' +% {6.9135, 6.8036, -3.4310}, % O4' +% {7.7293, 6.4084, -2.3392}, % C1' +% {8.7078, 6.1815, -2.7624}, % H1' +% {7.1305, 5.1418, -1.7347}, % C2' +% {7.2040, 5.1982, -0.6486}, % H2'' +% {7.7417, 4.0392, -2.3813}, % O2' +% {8.6785, 4.1443, -2.5630}, % H2' +% {5.6666, 5.2728, -2.1536}, % C3' +% {5.1747, 5.9805, -1.4863}, % H3' +% {4.9997, 4.0086, -2.1973}, % O3' +% {10.3245, 8.5459, 1.5467}, % N1 +% {9.8051, 6.9432, -0.1497}, % N3 +% {10.5175, 7.4328, 0.8408}, % C2 +% {8.7523, 7.7422, -0.4228}, % C4 +% {8.4257, 8.9060, 0.2099}, % C5 +% {9.2665, 9.3242, 1.2540}, % C6 +% g, { +% {11.6077, 6.7966, 1.2752}, % N2 +% {7.2750, 9.4537, -0.3428}, % N7 +% {7.7962, 7.5519, -1.3859}, % N9 +% {6.9479, 8.6157, -1.2771}, % C8 +% {9.0664, 10.4462, 1.9610}, % O6 +% {10.9838, 8.7524, 2.2697}, % H1 +% {12.2274, 7.0896, 2.0170}, % H21 +% {11.8502, 5.9398, 0.7984}, % H22 +% {6.0430, 8.9853, -1.7594}} % H8 +% }. + +% rG03() -> +% { +% {-0.5021, 0.0731, 0.8617, % dgf_base_tfo +% -0.8112, 0.3054, -0.4986, +% -0.2996, -0.9494, -0.0940, +% 6.4273, -5.1944, -3.7807}, +% {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo +% -0.0433, -0.4257, 0.9038, +% -0.5788, 0.7480, 0.3246, +% 1.5227, 6.9114, -7.0765}, +% {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo +% 0.4552, 0.6637, 0.5935, +% -0.8042, 0.0203, 0.5941, +% -6.9472, -4.1186, -5.9108}, +% {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo +% -0.8247, 0.5587, -0.0878, +% 0.0426, 0.2162, 0.9754, +% 6.2694, -7.0540, 3.3316}, +% {2.8930, 8.5380, -3.3280}, % P +% {1.6980, 7.6960, -3.5570}, % O1P +% {3.2260, 9.5010, -4.4020}, % O2P +% {4.1590, 7.6040, -3.0340}, % O5' +% {4.1214, 6.7116, -1.9049}, % C5' +% {3.3465, 5.9610, -2.0607}, % H5' +% {4.0789, 7.2928, -0.9837}, % H5'' +% {5.4170, 5.9293, -1.8186}, % C4' +% {5.4506, 5.3400, -0.9023}, % H4' +% {5.5067, 5.0417, -2.9703}, % O4' +% {6.8650, 4.9152, -3.3612}, % C1' +% {7.1090, 3.8577, -3.2603}, % H1' +% {7.7152, 5.7282, -2.3894}, % C2' +% {8.5029, 6.2356, -2.9463}, % H2'' +% {8.1036, 4.8568, -1.3419}, % O2' +% {8.3270, 3.9651, -1.6184}, % H2' +% {6.7003, 6.7565, -1.8911}, % C3' +% {6.5898, 7.5329, -2.6482}, % H3' +% {7.0505, 7.2878, -0.6105}, % O3' +% {9.6740, 4.7656, -7.6614}, % N1 +% {9.0739, 4.3013, -5.3941}, % N3 +% {9.8416, 4.2192, -6.4581}, % C2 +% {7.9885, 5.0632, -5.6446}, % C4 +% {7.6822, 5.6856, -6.8194}, % C5 +% {8.5831, 5.5215, -7.8840}, % C6 +% g, { +% {10.9733, 3.5117, -6.4286}, % N2 +% {6.4857, 6.3816, -6.7035}, % N7 +% {6.9740, 5.3703, -4.7760}, % N9 +% {6.1133, 6.1613, -5.4808}, % C8 +% {8.4084, 6.0747, -9.0933}, % O6 +% {10.3759, 4.5855, -8.3504}, % H1 +% {11.6254, 3.3761, -7.1879}, % H21 +% {11.1917, 3.0460, -5.5593}, % H22 +% {5.1705, 6.6830, -5.3167}} % H8 +% }. + +% rG04() -> +% { +% {-0.5426, -0.8175, 0.1929, % dgf_base_tfo +% 0.8304, -0.5567, -0.0237, +% 0.1267, 0.1473, 0.9809, +% -0.5075, 8.3929, 0.2229}, +% {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo +% -0.0433, -0.4257, 0.9038, +% -0.5788, 0.7480, 0.3246, +% 1.5227, 6.9114, -7.0765}, +% {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo +% 0.4552, 0.6637, 0.5935, +% -0.8042, 0.0203, 0.5941, +% -6.9472, -4.1186, -5.9108}, +% {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo +% -0.8247, 0.5587, -0.0878, +% 0.0426, 0.2162, 0.9754, +% 6.2694, -7.0540, 3.3316}, +% {2.8930, 8.5380, -3.3280}, % P +% {1.6980, 7.6960, -3.5570}, % O1P +% {3.2260, 9.5010, -4.4020}, % O2P +% {4.1590, 7.6040, -3.0340}, % O5' +% {5.4352, 8.2183, -2.7757}, % C5' +% {5.3830, 8.7883, -1.8481}, % H5' +% {5.7729, 8.7436, -3.6691}, % H5'' +% {6.4830, 7.1518, -2.5252}, % C4' +% {7.4749, 7.5972, -2.4482}, % H4' +% {6.1626, 6.4620, -1.2827}, % O4' +% {6.5431, 5.0992, -1.3905}, % C1' +% {7.2871, 4.9328, -0.6114}, % H1' +% {7.1852, 4.8935, -2.7592}, % C2' +% {6.8573, 3.9363, -3.1645}, % H2'' +% {8.5780, 5.1025, -2.6046}, % O2' +% {8.9516, 4.7577, -1.7902}, % H2' +% {6.5522, 6.0300, -3.5612}, % C3' +% {5.5420, 5.7356, -3.8459}, % H3' +% {7.3487, 6.4089, -4.6867}, % O3' +% {3.6343, 2.6680, 2.0783}, % N1 +% {5.4505, 3.9805, 1.2446}, % N3 +% {4.7540, 3.3816, 2.1851}, % C2 +% {4.8805, 3.7951, 0.0354}, % C4 +% {3.7416, 3.0925, -0.2305}, % C5 +% {3.0873, 2.4980, 0.8606}, % C6 +% g, { +% {5.1433, 3.4373, 3.4609}, % N2 +% {3.4605, 3.1184, -1.5906}, % N7 +% {5.3247, 4.2695, -1.1710}, % N9 +% {4.4244, 3.8244, -2.0953}, % C8 +% {1.9600, 1.7805, 0.7462}, % O6 +% {3.2489, 2.2879, 2.9191}, % H1 +% {4.6785, 3.0243, 4.2568}, % H21 +% {5.9823, 3.9654, 3.6539}, % H22 +% {4.2675, 3.8876, -3.1721}} % H8 +% }. + +% rG05() -> +% { +% {-0.5891, 0.0449, 0.8068, % dgf_base_tfo +% 0.5375, 0.7673, 0.3498, +% -0.6034, 0.6397, -0.4762, +% -0.3019, -3.7679, -9.5913}, +% {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo +% -0.0433, -0.4257, 0.9038, +% -0.5788, 0.7480, 0.3246, +% 1.5227, 6.9114, -7.0765}, +% {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo +% 0.4552, 0.6637, 0.5935, +% -0.8042, 0.0203, 0.5941, +% -6.9472, -4.1186, -5.9108}, +% {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo +% -0.8247, 0.5587, -0.0878, +% 0.0426, 0.2162, 0.9754, +% 6.2694, -7.0540, 3.3316}, +% {2.8930, 8.5380, -3.3280}, % P +% {1.6980, 7.6960, -3.5570}, % O1P +% {3.2260, 9.5010, -4.4020}, % O2P +% {4.1590, 7.6040, -3.0340}, % O5' +% {4.5778, 6.6594, -4.0364}, % C5' +% {4.9220, 7.1963, -4.9204}, % H5' +% {3.7996, 5.9091, -4.1764}, % H5'' +% {5.7873, 5.8869, -3.5482}, % C4' +% {6.0405, 5.0875, -4.2446}, % H4' +% {6.9135, 6.8036, -3.4310}, % O4' +% {7.7293, 6.4084, -2.3392}, % C1' +% {8.7078, 6.1815, -2.7624}, % H1' +% {7.1305, 5.1418, -1.7347}, % C2' +% {7.2040, 5.1982, -0.6486}, % H2'' +% {7.7417, 4.0392, -2.3813}, % O2' +% {8.6785, 4.1443, -2.5630}, % H2' +% {5.6666, 5.2728, -2.1536}, % C3' +% {5.1747, 5.9805, -1.4863}, % H3' +% {4.9997, 4.0086, -2.1973}, % O3' +% {10.2594, 10.6774, -1.0056}, % N1 +% {9.7528, 8.7080, -2.2631}, % N3 +% {10.4471, 9.7876, -1.9791}, % C2 +% {8.7271, 8.5575, -1.3991}, % C4 +% {8.4100, 9.3803, -0.3580}, % C5 +% {9.2294, 10.5030, -0.1574}, % C6 +% g, { +% {11.5110, 10.1256, -2.7114}, % N2 +% {7.2891, 8.9068, 0.3121}, % N7 +% {7.7962, 7.5519, -1.3859}, % N9 +% {6.9702, 7.8292, -0.3353}, % C8 +% {9.0349, 11.3951, 0.8250}, % O6 +% {10.9013, 11.4422, -0.9512}, % H1 +% {12.1031, 10.9341, -2.5861}, % H21 +% {11.7369, 9.5180, -3.4859}, % H22 +% {6.0888, 7.3990, 0.1403}} % H8 +% }. + +% rG06() -> +% { +% {-0.9815, 0.0731, -0.1772, % dgf_base_tfo +% 0.1912, 0.3054, -0.9328, +% -0.0141, -0.9494, -0.3137, +% 5.7506, -5.1944, 4.7470}, +% {-0.8143, -0.5091, -0.2788, % p_o3'_275_tfo +% -0.0433, -0.4257, 0.9038, +% -0.5788, 0.7480, 0.3246, +% 1.5227, 6.9114, -7.0765}, +% {0.3822, -0.7477, 0.5430, % p_o3'_180_tfo +% 0.4552, 0.6637, 0.5935, +% -0.8042, 0.0203, 0.5941, +% -6.9472, -4.1186, -5.9108}, +% {0.5640, 0.8007, -0.2022, % p_o3'_60_tfo +% -0.8247, 0.5587, -0.0878, +% 0.0426, 0.2162, 0.9754, +% 6.2694, -7.0540, 3.3316}, +% {2.8930, 8.5380, -3.3280}, % P +% {1.6980, 7.6960, -3.5570}, % O1P +% {3.2260, 9.5010, -4.4020}, % O2P +% {4.1590, 7.6040, -3.0340}, % O5' +% {4.1214, 6.7116, -1.9049}, % C5' +% {3.3465, 5.9610, -2.0607}, % H5' +% {4.0789, 7.2928, -0.9837}, % H5'' +% {5.4170, 5.9293, -1.8186}, % C4' +% {5.4506, 5.3400, -0.9023}, % H4' +% {5.5067, 5.0417, -2.9703}, % O4' +% {6.8650, 4.9152, -3.3612}, % C1' +% {7.1090, 3.8577, -3.2603}, % H1' +% {7.7152, 5.7282, -2.3894}, % C2' +% {8.5029, 6.2356, -2.9463}, % H2'' +% {8.1036, 4.8568, -1.3419}, % O2' +% {8.3270, 3.9651, -1.6184}, % H2' +% {6.7003, 6.7565, -1.8911}, % C3' +% {6.5898, 7.5329, -2.6482}, % H3' +% {7.0505, 7.2878, -0.6105}, % O3' +% {6.6624, 3.5061, -8.2986}, % N1 +% {6.5810, 3.2570, -5.9221}, % N3 +% {6.5151, 2.8263, -7.1625}, % C2 +% {6.8364, 4.5817, -5.8882}, % C4 +% {7.0116, 5.4064, -6.9609}, % C5 +% {6.9173, 4.8260, -8.2361}, % C6 +% g, { +% {6.2717, 1.5402, -7.4250}, % N2 +% {7.2573, 6.7070, -6.5394}, % N7 +% {6.9740, 5.3703, -4.7760}, % N9 +% {7.2238, 6.6275, -5.2453}, % C8 +% {7.0668, 5.5163, -9.3763}, % O6 +% {6.5754, 2.9964, -9.1545}, % H1 +% {6.1908, 1.1105, -8.3354}, % H21 +% {6.1346, 0.9352, -6.6280}, % H22 +% {7.4108, 7.6227, -4.8418}} % H8 +% }. + +% rG07() -> +% { +% {0.0894, -0.6059, 0.7905, % dgf_base_tfo +% -0.6810, 0.5420, 0.4924, +% -0.7268, -0.5824, -0.3642, +% 34.1424, 45.9610, -11.8600}, +% {-0.8644, -0.4956, -0.0851, % p_o3'_275_tfo +% -0.0427, 0.2409, -0.9696, +% 0.5010, -0.8345, -0.2294, +% 4.0167, 54.5377, 12.4779}, +% {0.3706, -0.6167, 0.6945, % p_o3'_180_tfo +% -0.2867, -0.7872, -0.5460, +% 0.8834, 0.0032, -0.4686, +% -52.9020, 18.6313, -0.6709}, +% {0.4155, 0.9025, -0.1137, % p_o3'_60_tfo +% 0.9040, -0.4236, -0.0582, +% -0.1007, -0.0786, -0.9918, +% -7.6624, -25.2080, 49.5181}, +% {31.3810, 0.1400, 47.5810}, % P +% {29.9860, 0.6630, 47.6290}, % O1P +% {31.7210, -0.6460, 48.8090}, % O2P +% {32.4940, 1.2540, 47.2740}, % O5' +% {33.8709, 0.7918, 47.2113}, % C5' +% {34.1386, 0.5870, 46.1747}, % H5' +% {34.0186, -0.0095, 47.9353}, % H5'' +% {34.7297, 1.9687, 47.6685}, % C4' +% {35.7723, 1.6845, 47.8113}, % H4' +% {34.6455, 2.9768, 46.6660}, % O4' +% {34.1690, 4.1829, 47.2627}, % C1' +% {35.0437, 4.7633, 47.5560}, % H1' +% {33.4145, 3.7532, 48.4954}, % C2' +% {32.4340, 3.3797, 48.2001}, % H2'' +% {33.3209, 4.6953, 49.5217}, % O2' +% {33.2374, 5.6059, 49.2295}, % H2' +% {34.2724, 2.5970, 48.9773}, % C3' +% {33.6373, 1.8935, 49.5157}, % H3' +% {35.3453, 3.1884, 49.7285}, % O3' +% {34.0511, 7.8930, 43.7791}, % N1 +% {34.9937, 6.3369, 45.3199}, % N3 +% {35.0882, 7.3126, 44.4200}, % C2 +% {33.7190, 5.9650, 45.5374}, % C4 +% {32.5845, 6.4770, 44.9458}, % C5 +% {32.7430, 7.5179, 43.9914}, % C6 +% g, { +% {36.3030, 7.7827, 44.1036}, % N2 +% {31.4499, 5.8335, 45.4368}, % N7 +% {33.2760, 4.9817, 46.4043}, % N9 +% {31.9235, 4.9639, 46.2934}, % C8 +% {31.8602, 8.1000, 43.3695}, % O6 +% {34.2623, 8.6223, 43.1283}, % H1 +% {36.5188, 8.5081, 43.4347}, % H21 +% {37.0888, 7.3524, 44.5699}, % H22 +% {31.0815, 4.4201, 46.7218}} % H8 +% }. + +% rG08() -> +% { +% {0.2224, 0.6335, 0.7411, % dgf_base_tfo +% -0.3644, -0.6510, 0.6659, +% 0.9043, -0.4181, 0.0861, +% -47.6824, -0.5823, -31.7554}, +% {-0.8644, -0.4956, -0.0851, % p_o3'_275_tfo +% -0.0427, 0.2409, -0.9696, +% 0.5010, -0.8345, -0.2294, +% 4.0167, 54.5377, 12.4779}, +% {0.3706, -0.6167, 0.6945, % p_o3'_180_tfo +% -0.2867, -0.7872, -0.5460, +% 0.8834, 0.0032, -0.4686, +% -52.9020, 18.6313, -0.6709}, +% {0.4155, 0.9025, -0.1137, % p_o3'_60_tfo +% 0.9040, -0.4236, -0.0582, +% -0.1007, -0.0786, -0.9918, +% -7.6624, -25.2080, 49.5181}, +% {31.3810, 0.1400, 47.5810}, % P +% {29.9860, 0.6630, 47.6290}, % O1P +% {31.7210, -0.6460, 48.8090}, % O2P +% {32.4940, 1.2540, 47.2740}, % O5' +% {32.5924, 2.3488, 48.2255}, % C5' +% {33.3674, 2.1246, 48.9584}, % H5' +% {31.5994, 2.5917, 48.6037}, % H5'' +% {33.0722, 3.5577, 47.4258}, % C4' +% {33.0310, 4.4778, 48.0089}, % H4' +% {34.4173, 3.3055, 47.0316}, % O4' +% {34.5056, 3.3910, 45.6094}, % C1' +% {34.7881, 4.4152, 45.3663}, % H1' +% {33.1122, 3.1198, 45.1010}, % C2' +% {32.9230, 2.0469, 45.1369}, % H2'' +% {32.7946, 3.6590, 43.8529}, % O2' +% {33.5170, 3.6707, 43.2207}, % H2' +% {32.2730, 3.8173, 46.1566}, % C3' +% {31.3094, 3.3123, 46.2244}, % H3' +% {32.2391, 5.2039, 45.7807}, % O3' +% {39.3337, 2.7157, 44.1441}, % N1 +% {37.4430, 3.8242, 45.0824}, % N3 +% {38.7276, 3.7646, 44.7403}, % C2 +% {36.7791, 2.6963, 44.7704}, % C4 +% {37.2860, 1.5653, 44.1678}, % C5 +% {38.6647, 1.5552, 43.8235}, % C6 +% g, { +% {39.5123, 4.8216, 44.9936}, % N2 +% {36.2829, 0.6110, 44.0078}, % N7 +% {35.4394, 2.4314, 44.9931}, % N9 +% {35.2180, 1.1815, 44.5128}, % C8 +% {39.2907, 0.6514, 43.2796}, % O6 +% {40.3076, 2.8048, 43.9352}, % H1 +% {40.4994, 4.9066, 44.7977}, % H21 +% {39.0738, 5.6108, 45.4464}, % H22 +% {34.3856, 0.4842, 44.4185}} % H8 +% }. + +% rG09() -> +% { +% {-0.9699, -0.1688, -0.1753, % dgf_base_tfo +% -0.1050, -0.3598, 0.9271, +% -0.2196, 0.9176, 0.3312, +% 45.6217, -38.9484, -12.3208}, +% {-0.8644, -0.4956, -0.0851, % p_o3'_275_tfo +% -0.0427, 0.2409, -0.9696, +% 0.5010, -0.8345, -0.2294, +% 4.0167, 54.5377, 12.4779}, +% {0.3706, -0.6167, 0.6945, % p_o3'_180_tfo +% -0.2867, -0.7872, -0.5460, +% 0.8834, 0.0032, -0.4686, +% -52.9020, 18.6313, -0.6709}, +% {0.4155, 0.9025, -0.1137, % p_o3'_60_tfo +% 0.9040, -0.4236, -0.0582, +% -0.1007, -0.0786, -0.9918, +% -7.6624, -25.2080, 49.5181}, +% {31.3810, 0.1400, 47.5810}, % P +% {29.9860, 0.6630, 47.6290}, % O1P +% {31.7210, -0.6460, 48.8090}, % O2P +% {32.4940, 1.2540, 47.2740}, % O5' +% {33.8709, 0.7918, 47.2113}, % C5' +% {34.1386, 0.5870, 46.1747}, % H5' +% {34.0186, -0.0095, 47.9353}, % H5'' +% {34.7297, 1.9687, 47.6685}, % C4' +% {34.5880, 2.8482, 47.0404}, % H4' +% {34.3575, 2.2770, 49.0081}, % O4' +% {35.5157, 2.1993, 49.8389}, % C1' +% {35.9424, 3.2010, 49.8893}, % H1' +% {36.4701, 1.2820, 49.1169}, % C2' +% {36.1545, 0.2498, 49.2683}, % H2'' +% {37.8262, 1.4547, 49.4008}, % O2' +% {38.0227, 1.6945, 50.3094}, % H2' +% {36.2242, 1.6797, 47.6725}, % C3' +% {36.4297, 0.8197, 47.0351}, % H3' +% {37.0289, 2.8480, 47.4426}, % O3' +% {34.3005, 3.5042, 54.6070}, % N1 +% {34.7693, 3.7936, 52.2874}, % N3 +% {34.4484, 4.2541, 53.4939}, % C2 +% {34.9354, 2.4584, 52.2785}, % C4 +% {34.8092, 1.5915, 53.3422}, % C5 +% {34.4646, 2.1367, 54.6085}, % C6 +% g, { +% {34.2514, 5.5708, 53.6503}, % N2 +% {35.0641, 0.2835, 52.9337}, % N7 +% {35.2669, 1.6690, 51.1915}, % N9 +% {35.3288, 0.3954, 51.6563}, % C8 +% {34.3151, 1.5317, 55.6650}, % O6 +% {34.0623, 3.9797, 55.4539}, % H1 +% {33.9950, 6.0502, 54.5016}, % H21 +% {34.3512, 6.1432, 52.8242}, % H22 +% {35.5414, -0.6006, 51.2679}} % H8 +% }. + +% rG10() -> +% { +% {-0.0980, -0.9723, 0.2122, % dgf_base_tfo +% -0.9731, 0.1383, 0.1841, +% -0.2083, -0.1885, -0.9597, +% 17.8469, 38.8265, 37.0475}, +% {-0.8644, -0.4956, -0.0851, % p_o3'_275_tfo +% -0.0427, 0.2409, -0.9696, +% 0.5010, -0.8345, -0.2294, +% 4.0167, 54.5377, 12.4779}, +% {0.3706, -0.6167, 0.6945, % p_o3'_180_tfo +% -0.2867, -0.7872, -0.5460, +% 0.8834, 0.0032, -0.4686, +% -52.9020, 18.6313, -0.6709}, +% {0.4155, 0.9025, -0.1137, % p_o3'_60_tfo +% 0.9040, -0.4236, -0.0582, +% -0.1007, -0.0786, -0.9918, +% -7.6624, -25.2080, 49.5181}, +% {31.3810, 0.1400, 47.5810}, % P +% {29.9860, 0.6630, 47.6290}, % O1P +% {31.7210, -0.6460, 48.8090}, % O2P +% {32.4940, 1.2540, 47.2740}, % O5' +% {32.5924, 2.3488, 48.2255}, % C5' +% {33.3674, 2.1246, 48.9584}, % H5' +% {31.5994, 2.5917, 48.6037}, % H5'' +% {33.0722, 3.5577, 47.4258}, % C4' +% {34.0333, 3.3761, 46.9447}, % H4' +% {32.0890, 3.8338, 46.4332}, % O4' +% {31.6377, 5.1787, 46.5914}, % C1' +% {32.2499, 5.8016, 45.9392}, % H1' +% {31.9167, 5.5319, 48.0305}, % C2' +% {31.1507, 5.0820, 48.6621}, % H2'' +% {32.0865, 6.8890, 48.3114}, % O2' +% {31.5363, 7.4819, 47.7942}, % H2' +% {33.2398, 4.8224, 48.2563}, % C3' +% {33.3166, 4.5570, 49.3108}, % H3' +% {34.2528, 5.7056, 47.7476}, % O3' +% {28.2782, 6.3049, 42.9364}, % N1 +% {30.4001, 5.8547, 43.9258}, % N3 +% {29.6195, 6.1568, 42.8913}, % C2 +% {29.7005, 5.7006, 45.0649}, % C4 +% {28.3383, 5.8221, 45.2343}, % C5 +% {27.5519, 6.1461, 44.0958}, % C6 +% g, { +% {30.1838, 6.3385, 41.6890}, % N2 +% {27.9936, 5.5926, 46.5651}, % N7 +% {30.2046, 5.3825, 46.3136}, % N9 +% {29.1371, 5.3398, 47.1506}, % C8 +% {26.3361, 6.3024, 44.0495}, % O6 +% {27.8122, 6.5394, 42.0833}, % H1 +% {29.7125, 6.5595, 40.8235}, % H21 +% {31.1859, 6.2231, 41.6389}, % H22 +% {28.9406, 5.1504, 48.2059}} % H8 +% }. + +% rGs() -> [rG01(),rG02(),rG03(),rG04(),rG05(),rG06(),rG07(), +% rG08(),rG09(),rG10()]. + +rU() -> + { + {-0.0359, -0.8071, 0.5894, % dgf_base_tfo + -0.2669, 0.5761, 0.7726, + -0.9631, -0.1296, -0.2361, + 0.1584, 8.3434, 0.5434}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {5.2430, -8.2420, 2.8260}, % C5' + {5.1974, -8.8497, 1.9223}, % H5' + {5.5548, -8.7348, 3.7469}, % H5'' + {6.3140, -7.2060, 2.5510}, % C4' + {7.2954, -7.6762, 2.4898}, % H4' + {6.0140, -6.5420, 1.2890}, % O4' + {6.4190, -5.1840, 1.3620}, % C1' + {7.1608, -5.0495, 0.5747}, % H1' + {7.0760, -4.9560, 2.7270}, % C2' + {6.7770, -3.9803, 3.1099}, % H2'' + {8.4500, -5.1930, 2.5810}, % O2' + {8.8309, -4.8755, 1.7590}, % H2' + {6.4060, -6.0590, 3.5580}, % C3' + {5.4021, -5.7313, 3.8281}, % H3' + {7.1570, -6.4240, 4.7070}, % O3' + {5.2170, -4.3260, 1.1690}, % N1 + {4.2960, -2.2560, 0.6290}, % N3 + {5.4330, -3.0200, 0.7990}, % C2 + {2.9930, -2.6780, 0.7940}, % C4 + {2.8670, -4.0630, 1.1830}, % C5 + {3.9570, -4.8300, 1.3550}, % C6 + u, { + {6.5470, -2.5560, 0.6290}, % O2 + {2.0540, -1.9000, 0.6130}, % O4 + {4.4300, -1.3020, 0.3600}, % H3 + {1.9590, -4.4570, 1.3250}, % H5 + {3.8460, -5.7860, 1.6240}} % H6 + }. + +rU01() -> + { + {-0.0137, -0.8012, 0.5983, % dgf_base_tfo + -0.2523, 0.5817, 0.7733, + -0.9675, -0.1404, -0.2101, + 0.2031, 8.3874, 0.4228}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {5.2416, -8.2422, 2.8181}, % C5' + {5.2050, -8.8128, 1.8901}, % H5' + {5.5368, -8.7738, 3.7227}, % H5'' + {6.3232, -7.2037, 2.6002}, % C4' + {7.3048, -7.6757, 2.5577}, % H4' + {6.0635, -6.5092, 1.3456}, % O4' + {6.4697, -5.1547, 1.4629}, % C1' + {7.2354, -5.0043, 0.7018}, % H1' + {7.0856, -4.9610, 2.8521}, % C2' + {6.7777, -3.9935, 3.2487}, % H2'' + {8.4627, -5.1992, 2.7423}, % O2' + {8.8693, -4.8638, 1.9399}, % H2' + {6.3877, -6.0809, 3.6362}, % C3' + {5.3770, -5.7562, 3.8834}, % H3' + {7.1024, -6.4754, 4.7985}, % O3' + {5.2764, -4.2883, 1.2538}, % N1 + {4.3777, -2.2062, 0.7229}, % N3 + {5.5069, -2.9779, 0.9088}, % C2 + {3.0693, -2.6246, 0.8500}, % C4 + {2.9279, -4.0146, 1.2149}, % C5 + {4.0101, -4.7892, 1.4017}, % C6 + u, { + {6.6267, -2.5166, 0.7728}, % O2 + {2.1383, -1.8396, 0.6581}, % O4 + {4.5223, -1.2489, 0.4716}, % H3 + {2.0151, -4.4065, 1.3290}, % H5 + {3.8886, -5.7486, 1.6535}} % H6 + }. + +rU02() -> + { + {0.5141, 0.0246, 0.8574, % dgf_base_tfo + -0.5547, -0.7529, 0.3542, + 0.6542, -0.6577, -0.3734, + -9.1111, -3.4598, -3.2939}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {4.3825, -6.6585, 4.0489}, % C5' + {4.6841, -7.2019, 4.9443}, % H5' + {3.6189, -5.8889, 4.1625}, % H5'' + {5.6255, -5.9175, 3.5998}, % C4' + {5.8732, -5.1228, 4.3034}, % H4' + {6.7337, -6.8605, 3.5222}, % O4' + {7.5932, -6.4923, 2.4548}, % C1' + {8.5661, -6.2983, 2.9064}, % H1' + {7.0527, -5.2012, 1.8322}, % C2' + {7.1627, -5.2525, 0.7490}, % H2'' + {7.6666, -4.1249, 2.4880}, % O2' + {8.5944, -4.2543, 2.6981}, % H2' + {5.5661, -5.3029, 2.2009}, % C3' + {5.0841, -6.0018, 1.5172}, % H3' + {4.9062, -4.0452, 2.2042}, % O3' + {7.6298, -7.6136, 1.4752}, % N1 + {8.6945, -8.7046, -0.2857}, % N3 + {8.6943, -7.6514, 0.6066}, % C2 + {7.7426, -9.6987, -0.3801}, % C4 + {6.6642, -9.5742, 0.5722}, % C5 + {6.6391, -8.5592, 1.4526}, % C6 + u, { + {9.5840, -6.8186, 0.6136}, % O2 + {7.8505, -10.5925, -1.2223}, % O4 + {9.4601, -8.7514, -0.9277}, % H3 + {5.9281, -10.2509, 0.5782}, % H5 + {5.8831, -8.4931, 2.1028}} % H6 + }. + +rU03() -> + { + {-0.4993, 0.0476, 0.8651, % dgf_base_tfo + 0.8078, -0.3353, 0.4847, + 0.3132, 0.9409, 0.1290, + 6.2989, -5.2303, -3.8577}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {3.9938, -6.7042, 1.9023}, % C5' + {3.2332, -5.9343, 2.0319}, % H5' + {3.9666, -7.2863, 0.9812}, % H5'' + {5.3098, -5.9546, 1.8564}, % C4' + {5.3863, -5.3702, 0.9395}, % H4' + {5.3851, -5.0642, 3.0076}, % O4' + {6.7315, -4.9724, 3.4462}, % C1' + {7.0033, -3.9202, 3.3619}, % H1' + {7.5997, -5.8018, 2.4948}, % C2' + {8.3627, -6.3254, 3.0707}, % H2'' + {8.0410, -4.9501, 1.4724}, % O2' + {8.2781, -4.0644, 1.7570}, % H2' + {6.5701, -6.8129, 1.9714}, % C3' + {6.4186, -7.5809, 2.7299}, % H3' + {6.9357, -7.3841, 0.7235}, % O3' + {6.8024, -5.4718, 4.8475}, % N1 + {7.9218, -5.5700, 6.8877}, % N3 + {7.8908, -5.0886, 5.5944}, % C2 + {6.9789, -6.3827, 7.4823}, % C4 + {5.8742, -6.7319, 6.6202}, % C5 + {5.8182, -6.2769, 5.3570}, % C6 + u, { + {8.7747, -4.3728, 5.1568}, % O2 + {7.1154, -6.7509, 8.6509}, % O4 + {8.7055, -5.3037, 7.4491}, % H3 + {5.1416, -7.3178, 6.9665}, % H5 + {5.0441, -6.5310, 4.7784}} % H6 + }. + +rU04() -> + { + {-0.5669, -0.8012, 0.1918, % dgf_base_tfo + -0.8129, 0.5817, 0.0273, + -0.1334, -0.1404, -0.9811, + -0.3279, 8.3874, 0.3355}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {5.2416, -8.2422, 2.8181}, % C5' + {5.2050, -8.8128, 1.8901}, % H5' + {5.5368, -8.7738, 3.7227}, % H5'' + {6.3232, -7.2037, 2.6002}, % C4' + {7.3048, -7.6757, 2.5577}, % H4' + {6.0635, -6.5092, 1.3456}, % O4' + {6.4697, -5.1547, 1.4629}, % C1' + {7.2354, -5.0043, 0.7018}, % H1' + {7.0856, -4.9610, 2.8521}, % C2' + {6.7777, -3.9935, 3.2487}, % H2'' + {8.4627, -5.1992, 2.7423}, % O2' + {8.8693, -4.8638, 1.9399}, % H2' + {6.3877, -6.0809, 3.6362}, % C3' + {5.3770, -5.7562, 3.8834}, % H3' + {7.1024, -6.4754, 4.7985}, % O3' + {5.2764, -4.2883, 1.2538}, % N1 + {3.8961, -3.0896, -0.1893}, % N3 + {5.0095, -3.8907, -0.0346}, % C2 + {3.0480, -2.6632, 0.8116}, % C4 + {3.4093, -3.1310, 2.1292}, % C5 + {4.4878, -3.9124, 2.3088}, % C6 + u, { + {5.7005, -4.2164, -0.9842}, % O2 + {2.0800, -1.9458, 0.5503}, % O4 + {3.6834, -2.7882, -1.1190}, % H3 + {2.8508, -2.8721, 2.9172}, % H5 + {4.7188, -4.2247, 3.2295}} % H6 + }. + +rU05() -> + { + {-0.6298, 0.0246, 0.7763, % dgf_base_tfo + -0.5226, -0.7529, -0.4001, + 0.5746, -0.6577, 0.4870, + -0.0208, -3.4598, -9.6882}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {4.3825, -6.6585, 4.0489}, % C5' + {4.6841, -7.2019, 4.9443}, % H5' + {3.6189, -5.8889, 4.1625}, % H5'' + {5.6255, -5.9175, 3.5998}, % C4' + {5.8732, -5.1228, 4.3034}, % H4' + {6.7337, -6.8605, 3.5222}, % O4' + {7.5932, -6.4923, 2.4548}, % C1' + {8.5661, -6.2983, 2.9064}, % H1' + {7.0527, -5.2012, 1.8322}, % C2' + {7.1627, -5.2525, 0.7490}, % H2'' + {7.6666, -4.1249, 2.4880}, % O2' + {8.5944, -4.2543, 2.6981}, % H2' + {5.5661, -5.3029, 2.2009}, % C3' + {5.0841, -6.0018, 1.5172}, % H3' + {4.9062, -4.0452, 2.2042}, % O3' + {7.6298, -7.6136, 1.4752}, % N1 + {8.5977, -9.5977, 0.7329}, % N3 + {8.5951, -8.5745, 1.6594}, % C2 + {7.7372, -9.7371, -0.3364}, % C4 + {6.7596, -8.6801, -0.4476}, % C5 + {6.7338, -7.6721, 0.4408}, % C6 + u, { + {9.3993, -8.5377, 2.5743}, % O2 + {7.8374, -10.6990, -1.1008}, % O4 + {9.2924, -10.3081, 0.8477}, % H3 + {6.0932, -8.6982, -1.1929}, % H5 + {6.0481, -6.9515, 0.3446}} % H6 + }. + +rU06() -> + { + {-0.9837, 0.0476, -0.1733, % dgf_base_tfo + -0.1792, -0.3353, 0.9249, + -0.0141, 0.9409, 0.3384, + 5.7793, -5.2303, 4.5997}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {3.9938, -6.7042, 1.9023}, % C5' + {3.2332, -5.9343, 2.0319}, % H5' + {3.9666, -7.2863, 0.9812}, % H5'' + {5.3098, -5.9546, 1.8564}, % C4' + {5.3863, -5.3702, 0.9395}, % H4' + {5.3851, -5.0642, 3.0076}, % O4' + {6.7315, -4.9724, 3.4462}, % C1' + {7.0033, -3.9202, 3.3619}, % H1' + {7.5997, -5.8018, 2.4948}, % C2' + {8.3627, -6.3254, 3.0707}, % H2'' + {8.0410, -4.9501, 1.4724}, % O2' + {8.2781, -4.0644, 1.7570}, % H2' + {6.5701, -6.8129, 1.9714}, % C3' + {6.4186, -7.5809, 2.7299}, % H3' + {6.9357, -7.3841, 0.7235}, % O3' + {6.8024, -5.4718, 4.8475}, % N1 + {6.6920, -5.0495, 7.1354}, % N3 + {6.6201, -4.5500, 5.8506}, % C2 + {6.9254, -6.3614, 7.4926}, % C4 + {7.1046, -7.2543, 6.3718}, % C5 + {7.0391, -6.7951, 5.1106}, % C6 + u, { + {6.4083, -3.3696, 5.6340}, % O2 + {6.9679, -6.6901, 8.6800}, % O4 + {6.5626, -4.3957, 7.8812}, % H3 + {7.2781, -8.2254, 6.5350}, % H5 + {7.1657, -7.4312, 4.3503}} % H6 + }. + +rU07() -> + { + {-0.9434, 0.3172, 0.0971, % dgf_base_tfo + 0.2294, 0.4125, 0.8816, + 0.2396, 0.8539, -0.4619, + 8.3625, -52.7147, 1.3745}, + {0.2765, -0.1121, -0.9545, % p_o3'_275_tfo + -0.8297, 0.4733, -0.2959, + 0.4850, 0.8737, 0.0379, + -14.7774, -45.2464, 21.9088}, + {0.1063, -0.6334, -0.7665, % p_o3'_180_tfo + -0.5932, -0.6591, 0.4624, + -0.7980, 0.4055, -0.4458, + 43.7634, 4.3296, 28.4890}, + {0.7136, -0.5032, -0.4873, % p_o3'_60_tfo + 0.6803, 0.3317, 0.6536, + -0.1673, -0.7979, 0.5791, + -17.1858, 41.4390, -27.0751}, + {21.3880, 15.0780, 45.5770}, % P + {21.9980, 14.5500, 46.8210}, % O1P + {21.1450, 14.0270, 44.5420}, % O2P + {22.1250, 16.3600, 44.9460}, % O5' + {21.5037, 16.8594, 43.7323}, % C5' + {20.8147, 17.6663, 43.9823}, % H5' + {21.1086, 16.0230, 43.1557}, % H5'' + {22.5654, 17.4874, 42.8616}, % C4' + {22.1584, 17.7243, 41.8785}, % H4' + {23.0557, 18.6826, 43.4751}, % O4' + {24.4788, 18.6151, 43.6455}, % C1' + {24.9355, 19.0840, 42.7739}, % H1' + {24.7958, 17.1427, 43.6474}, % C2' + {24.5652, 16.7400, 44.6336}, % H2'' + {26.1041, 16.8773, 43.2455}, % O2' + {26.7516, 17.5328, 43.5149}, % H2' + {23.8109, 16.5979, 42.6377}, % C3' + {23.5756, 15.5686, 42.9084}, % H3' + {24.2890, 16.7447, 41.2729}, % O3' + {24.9420, 19.2174, 44.8923}, % N1 + {25.2655, 20.5636, 44.8883}, % N3 + {25.1663, 21.2219, 43.8561}, % C2 + {25.6911, 21.1219, 46.0494}, % C4 + {25.8051, 20.4068, 47.2048}, % C5 + {26.2093, 20.9962, 48.2534}, % C6 + u, { + {25.4692, 19.0221, 47.2053}, % O2 + {25.0502, 18.4827, 46.0370}, % O4 + {25.9599, 22.1772, 46.0966}, % H3 + {25.5545, 18.4409, 48.1234}, % H5 + {24.7854, 17.4265, 45.9883}} % H6 + }. + +rU08() -> + { + {-0.0080, -0.7928, 0.6094, % dgf_base_tfo + -0.7512, 0.4071, 0.5197, + -0.6601, -0.4536, -0.5988, + 44.1482, 30.7036, 2.1088}, + {0.2765, -0.1121, -0.9545, % p_o3'_275_tfo + -0.8297, 0.4733, -0.2959, + 0.4850, 0.8737, 0.0379, + -14.7774, -45.2464, 21.9088}, + {0.1063, -0.6334, -0.7665, % p_o3'_180_tfo + -0.5932, -0.6591, 0.4624, + -0.7980, 0.4055, -0.4458, + 43.7634, 4.3296, 28.4890}, + {0.7136, -0.5032, -0.4873, % p_o3'_60_tfo + 0.6803, 0.3317, 0.6536, + -0.1673, -0.7979, 0.5791, + -17.1858, 41.4390, -27.0751}, + {21.3880, 15.0780, 45.5770}, % P + {21.9980, 14.5500, 46.8210}, % O1P + {21.1450, 14.0270, 44.5420}, % O2P + {22.1250, 16.3600, 44.9460}, % O5' + {23.5096, 16.1227, 44.5783}, % C5' + {23.5649, 15.8588, 43.5222}, % H5' + {23.9621, 15.4341, 45.2919}, % H5'' + {24.2805, 17.4138, 44.7151}, % C4' + {25.3492, 17.2309, 44.6030}, % H4' + {23.8497, 18.3471, 43.7208}, % O4' + {23.4090, 19.5681, 44.3321}, % C1' + {24.2595, 20.2496, 44.3524}, % H1' + {23.0418, 19.1813, 45.7407}, % C2' + {22.0532, 18.7224, 45.7273}, % H2'' + {23.1307, 20.2521, 46.6291}, % O2' + {22.8888, 21.1051, 46.2611}, % H2' + {24.0799, 18.1326, 46.0700}, % C3' + {23.6490, 17.4370, 46.7900}, % H3' + {25.3329, 18.7227, 46.5109}, % O3' + {22.2515, 20.1624, 43.6698}, % N1 + {22.4760, 21.0609, 42.6406}, % N3 + {23.6229, 21.3462, 42.3061}, % C2 + {21.3986, 21.6081, 42.0236}, % C4 + {20.1189, 21.3012, 42.3804}, % C5 + {19.1599, 21.8516, 41.7578}, % C6 + u, { + {19.8919, 20.3745, 43.4387}, % O2 + {20.9790, 19.8423, 44.0440}, % O4 + {21.5235, 22.3222, 41.2097}, % H3 + {18.8732, 20.1200, 43.7312}, % H5 + {20.8545, 19.1313, 44.8608}} % H6 + }. + +rU09() -> + { + {-0.0317, 0.1374, 0.9900, % dgf_base_tfo + -0.3422, -0.9321, 0.1184, + 0.9391, -0.3351, 0.0765, + -32.1929, 25.8198, -28.5088}, + {0.2765, -0.1121, -0.9545, % p_o3'_275_tfo + -0.8297, 0.4733, -0.2959, + 0.4850, 0.8737, 0.0379, + -14.7774, -45.2464, 21.9088}, + {0.1063, -0.6334, -0.7665, % p_o3'_180_tfo + -0.5932, -0.6591, 0.4624, + -0.7980, 0.4055, -0.4458, + 43.7634, 4.3296, 28.4890}, + {0.7136, -0.5032, -0.4873, % p_o3'_60_tfo + 0.6803, 0.3317, 0.6536, + -0.1673, -0.7979, 0.5791, + -17.1858, 41.4390, -27.0751}, + {21.3880, 15.0780, 45.5770}, % P + {21.9980, 14.5500, 46.8210}, % O1P + {21.1450, 14.0270, 44.5420}, % O2P + {22.1250, 16.3600, 44.9460}, % O5' + {21.5037, 16.8594, 43.7323}, % C5' + {20.8147, 17.6663, 43.9823}, % H5' + {21.1086, 16.0230, 43.1557}, % H5'' + {22.5654, 17.4874, 42.8616}, % C4' + {23.0565, 18.3036, 43.3915}, % H4' + {23.5375, 16.5054, 42.4925}, % O4' + {23.6574, 16.4257, 41.0649}, % C1' + {24.4701, 17.0882, 40.7671}, % H1' + {22.3525, 16.9643, 40.5396}, % C2' + {21.5993, 16.1799, 40.6133}, % H2'' + {22.4693, 17.4849, 39.2515}, % O2' + {23.0899, 17.0235, 38.6827}, % H2' + {22.0341, 18.0633, 41.5279}, % C3' + {20.9509, 18.1709, 41.5846}, % H3' + {22.7249, 19.3020, 41.2100}, % O3' + {23.8580, 15.0648, 40.5757}, % N1 + {25.1556, 14.5982, 40.4523}, % N3 + {26.1047, 15.3210, 40.7448}, % C2 + {25.3391, 13.3315, 40.0020}, % C4 + {24.2974, 12.5148, 39.6749}, % C5 + {24.5450, 11.3410, 39.2610}, % C6 + u, { + {22.9633, 12.9979, 39.8053}, % O2 + {22.8009, 14.2648, 40.2524}, % O4 + {26.3414, 12.9194, 39.8855}, % H3 + {22.1227, 12.3533, 39.5486}, % H5 + {21.7989, 14.6788, 40.3650}} % H6 + }. + +rU10() -> + { + {-0.9674, 0.1021, -0.2318, % dgf_base_tfo + -0.2514, -0.2766, 0.9275, + 0.0306, 0.9555, 0.2933, + 27.8571, -42.1305, -24.4563}, + {0.2765, -0.1121, -0.9545, % p_o3'_275_tfo + -0.8297, 0.4733, -0.2959, + 0.4850, 0.8737, 0.0379, + -14.7774, -45.2464, 21.9088}, + {0.1063, -0.6334, -0.7665, % p_o3'_180_tfo + -0.5932, -0.6591, 0.4624, + -0.7980, 0.4055, -0.4458, + 43.7634, 4.3296, 28.4890}, + {0.7136, -0.5032, -0.4873, % p_o3'_60_tfo + 0.6803, 0.3317, 0.6536, + -0.1673, -0.7979, 0.5791, + -17.1858, 41.4390, -27.0751}, + {21.3880, 15.0780, 45.5770}, % P + {21.9980, 14.5500, 46.8210}, % O1P + {21.1450, 14.0270, 44.5420}, % O2P + {22.1250, 16.3600, 44.9460}, % O5' + {23.5096, 16.1227, 44.5783}, % C5' + {23.5649, 15.8588, 43.5222}, % H5' + {23.9621, 15.4341, 45.2919}, % H5'' + {24.2805, 17.4138, 44.7151}, % C4' + {23.8509, 18.1819, 44.0720}, % H4' + {24.2506, 17.8583, 46.0741}, % O4' + {25.5830, 18.0320, 46.5775}, % C1' + {25.8569, 19.0761, 46.4256}, % H1' + {26.4410, 17.1555, 45.7033}, % C2' + {26.3459, 16.1253, 46.0462}, % H2'' + {27.7649, 17.5888, 45.6478}, % O2' + {28.1004, 17.9719, 46.4616}, % H2' + {25.7796, 17.2997, 44.3513}, % C3' + {25.9478, 16.3824, 43.7871}, % H3' + {26.2154, 18.4984, 43.6541}, % O3' + {25.7321, 17.6281, 47.9726}, % N1 + {25.5136, 18.5779, 48.9560}, % N3 + {25.2079, 19.7276, 48.6503}, % C2 + {25.6482, 18.1987, 50.2518}, % C4 + {25.9847, 16.9266, 50.6092}, % C5 + {26.0918, 16.6439, 51.8416}, % C6 + u, { + {26.2067, 15.9515, 49.5943}, % O2 + {26.0713, 16.3497, 48.3080}, % O4 + {25.4890, 18.9105, 51.0618}, % H3 + {26.4742, 14.9310, 49.8682}, % H5 + {26.2346, 15.6394, 47.4975}} % H6 + }. + +rUs() -> [rU01(),rU02(),rU03(),rU04(),rU05(),rU06(),rU07(), + rU08(),rU09(),rU10()]. + +rG_() -> + { + {-0.2067, -0.0264, 0.9780, % dgf_base_tfo + 0.9770, -0.0586, 0.2049, + 0.0519, 0.9979, 0.0379, + 1.0331, -46.8078, -36.4742}, + {-0.8644, -0.4956, -0.0851, % p_o3'_275_tfo + -0.0427, 0.2409, -0.9696, + 0.5010, -0.8345, -0.2294, + 4.0167, 54.5377, 12.4779}, + {0.3706, -0.6167, 0.6945, % p_o3'_180_tfo + -0.2867, -0.7872, -0.5460, + 0.8834, 0.0032, -0.4686, + -52.9020, 18.6313, -0.6709}, + {0.4155, 0.9025, -0.1137, % p_o3'_60_tfo + 0.9040, -0.4236, -0.0582, + -0.1007, -0.0786, -0.9918, + -7.6624, -25.2080, 49.5181}, + {31.3810, 0.1400, 47.5810}, % P + {29.9860, 0.6630, 47.6290}, % O1P + {31.7210, -0.6460, 48.8090}, % O2P + {32.4940, 1.2540, 47.2740}, % O5' + {32.1610, 2.2370, 46.2560}, % C5' + {31.2986, 2.8190, 46.5812}, % H5' + {32.0980, 1.7468, 45.2845}, % H5'' + {33.3476, 3.1959, 46.1947}, % C4' + {33.2668, 3.8958, 45.3630}, % H4' + {33.3799, 3.9183, 47.4216}, % O4' + {34.6515, 3.7222, 48.0398}, % C1' + {35.2947, 4.5412, 47.7180}, % H1' + {35.1756, 2.4228, 47.4827}, % C2' + {34.6778, 1.5937, 47.9856}, % H2'' + {36.5631, 2.2672, 47.4798}, % O2' + {37.0163, 2.6579, 48.2305}, % H2' + {34.6953, 2.5043, 46.0448}, % C3' + {34.5444, 1.4917, 45.6706}, % H3' + {35.6679, 3.3009, 45.3487}, % O3' + {37.4804, 4.0914, 52.2559}, % N1 + {36.9670, 4.1312, 49.9281}, % N3 + {37.8045, 4.2519, 50.9550}, % C2 + {35.7171, 3.8264, 50.3222}, % C4 + {35.2668, 3.6420, 51.6115}, % C5 + {36.2037, 3.7829, 52.6706}, % C6 + g, { + {39.0869, 4.5552, 50.7092}, % N2 + {33.9075, 3.3338, 51.6102}, % N7 + {34.6126, 3.6358, 49.5108}, % N9 + {33.5805, 3.3442, 50.3425}, % C8 + {35.9958, 3.6512, 53.8724}, % O6 + {38.2106, 4.2053, 52.9295}, % H1 + {39.8218, 4.6863, 51.3896}, % H21 + {39.3420, 4.6857, 49.7407}, % H22 + {32.5194, 3.1070, 50.2664}} % H8 + }. + +rU_() -> + { + {-0.0109, 0.5907, 0.8068, % dgf_base_tfo + 0.2217, -0.7853, 0.5780, + 0.9751, 0.1852, -0.1224, + -1.4225, -11.0956, -2.5217}, + {-0.8313, -0.4738, -0.2906, % p_o3'_275_tfo + 0.0649, 0.4366, -0.8973, + 0.5521, -0.7648, -0.3322, + 1.6833, 6.8060, -7.0011}, + {0.3445, -0.7630, 0.5470, % p_o3'_180_tfo + -0.4628, -0.6450, -0.6082, + 0.8168, -0.0436, -0.5753, + -6.8179, -3.9778, -5.9887}, + {0.5855, 0.7931, -0.1682, % p_o3'_60_tfo + 0.8103, -0.5790, 0.0906, + -0.0255, -0.1894, -0.9816, + 6.1203, -7.1051, 3.1984}, + {2.6760, -8.4960, 3.2880}, % P + {1.4950, -7.6230, 3.4770}, % O1P + {2.9490, -9.4640, 4.3740}, % O2P + {3.9730, -7.5950, 3.0340}, % O5' + {5.2430, -8.2420, 2.8260}, % C5' + {5.1974, -8.8497, 1.9223}, % H5' + {5.5548, -8.7348, 3.7469}, % H5'' + {6.3140, -7.2060, 2.5510}, % C4' + {5.8744, -6.2116, 2.4731}, % H4' + {7.2798, -7.2260, 3.6420}, % O4' + {8.5733, -6.9410, 3.1329}, % C1' + {8.9047, -6.0374, 3.6446}, % H1' + {8.4429, -6.6596, 1.6327}, % C2' + {9.2880, -7.1071, 1.1096}, % H2'' + {8.2502, -5.2799, 1.4754}, % O2' + {8.7676, -4.7284, 2.0667}, % H2' + {7.1642, -7.4416, 1.3021}, % C3' + {7.4125, -8.5002, 1.2260}, % H3' + {6.5160, -6.9772, 0.1267}, % O3' + {9.4531, -8.1107, 3.4087}, % N1 + {11.5931, -9.0015, 3.6357}, % N3 + {10.8101, -7.8950, 3.3748}, % C2 + {11.1439, -10.2744, 3.9206}, % C4 + {9.7056, -10.4026, 3.9332}, % C5 + {8.9192, -9.3419, 3.6833}, % C6 + u, { + {11.3013, -6.8063, 3.1326}, % O2 + {11.9431, -11.1876, 4.1375}, % O4 + {12.5840, -8.8673, 3.6158}, % H3 + {9.2891, -11.2898, 4.1313}, % H5 + {7.9263, -9.4537, 3.6977}} % H6 + }. + + +% -- PARTIAL INSTANTIATIONS -------------------------------------------------- + +%var ::= {Int, Tfo, Nuc} + +absolute_pos({_I,T,_N}, P) -> tfo_apply(T,P). + +atom_pos(Atom, {I,T,N}) -> + absolute_pos({I,T,N}, p_apply(Atom, N)). + +get_var(Id,[{Id,T,N}|_]) -> {Id,T,N}; +get_var(Id,[_|Lst]) -> get_var(Id,Lst). + +% make_relative_nuc(T, +% { +% Dgf_base_tfo,P_o3__275_tfo,P_o3__180_tfo,P_o3__60_tfo, +% P,O1p,O2p,O5_,C5_,H5_,H5__,C4_,H4_,O4_,C1_,H1_,C2_,H2__,O2_,H2_, +% C3_,H3_,O3_,N1,N3,C2,C4,C5,C6, +% a, {N6,N7,N9,C8,H2,H61,H62,H8} +% }) -> +% { +% Dgf_base_tfo, P_o3__275_tfo, P_o3__180_tfo, P_o3__60_tfo, +% tfo_apply(T, P), +% tfo_apply(T, O1p), +% tfo_apply(T, O2p), +% tfo_apply(T, O5_), +% tfo_apply(T, C5_), +% tfo_apply(T, H5_), +% tfo_apply(T, H5__), +% tfo_apply(T, C4_), +% tfo_apply(T, H4_), +% tfo_apply(T, O4_), +% tfo_apply(T, C1_), +% tfo_apply(T, H1_), +% tfo_apply(T, C2_), +% tfo_apply(T, H2__), +% tfo_apply(T, O2_), +% tfo_apply(T, H2_), +% tfo_apply(T, C3_), +% tfo_apply(T, H3_), +% tfo_apply(T, O3_), +% tfo_apply(T, N1), +% tfo_apply(T, N3), +% tfo_apply(T, C2), +% tfo_apply(T, C4), +% tfo_apply(T, C5), +% tfo_apply(T, C6), +% a, { +% tfo_apply(T, N6), +% tfo_apply(T, N7), +% tfo_apply(T, N9), +% tfo_apply(T, C8), +% tfo_apply(T, H2), +% tfo_apply(T, H61), +% tfo_apply(T, H62), +% tfo_apply(T, H8)} +% }; + +% make_relative_nuc(T, +% { +% Dgf_base_tfo,P_o3__275_tfo,P_o3__180_tfo,P_o3__60_tfo, +% P,O1p,O2p,O5_,C5_,H5_,H5__,C4_,H4_,O4_,C1_,H1_,C2_,H2__,O2_,H2_, +% C3_,H3_,O3_,N1,N3,C2,C4,C5,C6, +% c, {N4,O2,H41,H42,H5,H6} +% }) -> +% { +% Dgf_base_tfo, P_o3__275_tfo, P_o3__180_tfo, P_o3__60_tfo, +% tfo_apply(T, P), +% tfo_apply(T, O1p), +% tfo_apply(T, O2p), +% tfo_apply(T, O5_), +% tfo_apply(T, C5_), +% tfo_apply(T, H5_), +% tfo_apply(T, H5__), +% tfo_apply(T, C4_), +% tfo_apply(T, H4_), +% tfo_apply(T, O4_), +% tfo_apply(T, C1_), +% tfo_apply(T, H1_), +% tfo_apply(T, C2_), +% tfo_apply(T, H2__), +% tfo_apply(T, O2_), +% tfo_apply(T, H2_), +% tfo_apply(T, C3_), +% tfo_apply(T, H3_), +% tfo_apply(T, O3_), +% tfo_apply(T, N1), +% tfo_apply(T, N3), +% tfo_apply(T, C2), +% tfo_apply(T, C4), +% tfo_apply(T, C5), +% tfo_apply(T, C6), +% c, { +% tfo_apply(T, N4), +% tfo_apply(T, O2), +% tfo_apply(T, H41), +% tfo_apply(T, H42), +% tfo_apply(T, H5), +% tfo_apply(T, H6)} +% }; + +% make_relative_nuc(T, +% { +% Dgf_base_tfo,P_o3__275_tfo,P_o3__180_tfo,P_o3__60_tfo, +% P,O1p,O2p,O5_,C5_,H5_,H5__,C4_,H4_,O4_,C1_,H1_,C2_,H2__,O2_,H2_, +% C3_,H3_,O3_,N1,N3,C2,C4,C5,C6, +% g, {N2,N7,N9,C8,O6,H1,H21,H22,H8} +% }) -> +% { +% Dgf_base_tfo, P_o3__275_tfo, P_o3__180_tfo, P_o3__60_tfo, +% tfo_apply(T, P), +% tfo_apply(T, O1p), +% tfo_apply(T, O2p), +% tfo_apply(T, O5_), +% tfo_apply(T, C5_), +% tfo_apply(T, H5_), +% tfo_apply(T, H5__), +% tfo_apply(T, C4_), +% tfo_apply(T, H4_), +% tfo_apply(T, O4_), +% tfo_apply(T, C1_), +% tfo_apply(T, H1_), +% tfo_apply(T, C2_), +% tfo_apply(T, H2__), +% tfo_apply(T, O2_), +% tfo_apply(T, H2_), +% tfo_apply(T, C3_), +% tfo_apply(T, H3_), +% tfo_apply(T, O3_), +% tfo_apply(T, N1), +% tfo_apply(T, N3), +% tfo_apply(T, C2), +% tfo_apply(T, C4), +% tfo_apply(T, C5), +% tfo_apply(T, C6), +% g, { +% tfo_apply(T, N2), +% tfo_apply(T, N7), +% tfo_apply(T, N9), +% tfo_apply(T, C8), +% tfo_apply(T, O6), +% tfo_apply(T, H1), +% tfo_apply(T, H21), +% tfo_apply(T, H22), +% tfo_apply(T, H8)} +% }; + +% make_relative_nuc(T, +% { +% Dgf_base_tfo,P_o3__275_tfo,P_o3__180_tfo,P_o3__60_tfo, +% P,O1p,O2p,O5_,C5_,H5_,H5__,C4_,H4_,O4_,C1_,H1_,C2_,H2__,O2_,H2_, +% C3_,H3_,O3_,N1,N3,C2,C4,C5,C6, +% u, {O2,O4,H3,H5,H6} +% }) -> +% { +% Dgf_base_tfo, P_o3__275_tfo, P_o3__180_tfo, P_o3__60_tfo, +% tfo_apply(T, P), +% tfo_apply(T, O1p), +% tfo_apply(T, O2p), +% tfo_apply(T, O5_), +% tfo_apply(T, C5_), +% tfo_apply(T, H5_), +% tfo_apply(T, H5__), +% tfo_apply(T, C4_), +% tfo_apply(T, H4_), +% tfo_apply(T, O4_), +% tfo_apply(T, C1_), +% tfo_apply(T, H1_), +% tfo_apply(T, C2_), +% tfo_apply(T, H2__), +% tfo_apply(T, O2_), +% tfo_apply(T, H2_), +% tfo_apply(T, C3_), +% tfo_apply(T, H3_), +% tfo_apply(T, O3_), +% tfo_apply(T, N1), +% tfo_apply(T, N3), +% tfo_apply(T, C2), +% tfo_apply(T, C4), +% tfo_apply(T, C5), +% tfo_apply(T, C6), +% u, { +% tfo_apply(T, O2), +% tfo_apply(T, O4), +% tfo_apply(T, H3), +% tfo_apply(T, H5), +% tfo_apply(T, H6)} +% }. + +% -- SEARCH ------------------------------------------------------------------ + +% Sequential backtracking algorithm + +search(Partial_inst,[],_) -> + [Partial_inst]; +search(Partial_inst,[{F,Arg0,Arg1}|T],Constraint) -> + try_assignments(p_apply(F, Arg0,Arg1,Partial_inst), + Constraint, + Partial_inst, + T); +search(Partial_inst,[{F,Arg0,Arg1,Arg2}|T],Constraint) -> + try_assignments(p_apply(F, Arg0,Arg1,Arg2,Partial_inst), + Constraint, + Partial_inst, + T). + +try_assignments([],_,_,_) -> []; +try_assignments([V|Vs], Constraint, Partial_inst,T) -> + case p_apply(Constraint, V, Partial_inst) of + true -> append(search([V|Partial_inst],T,Constraint), + try_assignments(Vs, Constraint, Partial_inst,T)); + _ -> try_assignments(Vs, Constraint, Partial_inst,T) + end. + + +% -- DOMAINS ----------------------------------------------------------------- + +% Primary structure: strand A CUGCCACGUCUG, strand B CAGACGUGGCAG +% +% Secondary structure: strand A CUGCCACGUCUG +% |||||| +% GACGGUGCAGAC strand B +% +% Tertiary structure: +% +% 5' end of strand A C1----G12 3' end of strand B +% U2-------A11 +% G3-------C10 +% C4-----G9 +% C5---G8 +% A6 +% G6-C7 +% C5----G8 +% A4-------U9 +% G3--------C10 +% A2-------U11 +% 5' end of strand B C1----G12 3' end of strand A +% +% "helix", "stacked" and "connected" describe the spatial relationship +% between two consecutive nucleotides. E.g. the nucleotides C1 and U2 +% from the strand A. +% +% "wc" (stands for Watson-Crick and is a type of base-pairing), +% and "wc-dumas" describe the spatial relationship between +% nucleotides from two chains that are growing in opposite directions. +% E.g. the nucleotides C1 from strand A and G12 from strand B. + +% Dynamic Domains + +% Given, +% "ref" a nucleotide which is already positioned, +% "nuc" the nucleotide to be placed, +% and "tfo" a transformation matrix which expresses the desired +% relationship between "ref" and "nuc", +% the function "dgf-base" computes the transformation matrix that +% places the nucleotide "nuc" in the given relationship to "ref". + +dgf_base(Tfo, V, Nuc) -> + {_I,_T,N} = V, + tfo_combine(nuc_dgf_base_tfo(Nuc), + tfo_combine(Tfo,tfo_inv_ortho(process_type(type(N),V)))). + +process_type(a,V) -> + tfo_align(atom_pos(nuc_C1_, V),atom_pos(rA_N9, V),atom_pos(nuc_C4, V)); +process_type(c,V) -> + tfo_align(atom_pos(nuc_C1_, V),atom_pos(nuc_N1, V),atom_pos(nuc_C2, V)); +process_type(g,V) -> + tfo_align(atom_pos(nuc_C1_, V),atom_pos(rG_N9, V),atom_pos(nuc_C4, V)); +process_type(_,V) -> + tfo_align(atom_pos(nuc_C1_, V),atom_pos(nuc_N1, V),atom_pos(nuc_C2, V)). + + +% Placement of first nucleotide. + +reference(Nuc,I,_) -> + [{I,tfo_id(),Nuc}]. + +% The transformation matrix for wc is from: +% +% Chandrasekaran R. et al (1989) A Re-Examination of the Crystal +% Structure of A-DNA Using Fiber Diffraction Data. J. Biomol. +% Struct. & Dynamics 6(6):1189-1202. + +wc_tfo() -> + { + -1.0000, 0.0028, -0.0019, + 0.0028, 0.3468, -0.9379, + -0.0019, -0.9379, -0.3468, + -0.0080, 6.0730, 8.7208 + }. + +wc(Nuc,I,J,Partial_inst) -> + [{I,dgf_base(wc_tfo(),get_var(J,Partial_inst),Nuc),Nuc}]. + +wc_dumas_tfo() -> + { + -0.9737, -0.1834, 0.1352, + -0.1779, 0.2417, -0.9539, + 0.1422, -0.9529, -0.2679, + 0.4837, 6.2649, 8.0285 + }. + +wc_dumas(Nuc,I,J,Partial_inst) -> + [{I,dgf_base(wc_dumas_tfo(),get_var(J,Partial_inst),Nuc),Nuc}]. + +helix5__tfo() -> + { + 0.9886, -0.0961, 0.1156, + 0.1424, 0.8452, -0.5152, + -0.0482, 0.5258, 0.8492, + -3.8737, 0.5480, 3.8024 + }. + +helix5_(Nuc,I,J,Partial_inst) -> + [{I,dgf_base(helix5__tfo(),get_var(J,Partial_inst),Nuc),Nuc}]. + +helix3__tfo() -> + { + 0.9886, 0.1424, -0.0482, + -0.0961, 0.8452, 0.5258, + 0.1156, -0.5152, 0.8492, + 3.4426, 2.0474, -3.7042 + }. + +helix3_(Nuc,I,J,Partial_inst) -> + [{I,dgf_base(helix3__tfo(),get_var(J,Partial_inst),Nuc),Nuc}]. + +g37_a38_tfo() -> + { + 0.9991, 0.0164, -0.0387, + -0.0375, 0.7616, -0.6470, + 0.0189, 0.6478, 0.7615, + -3.3018, 0.9975, 2.5585 + }. + +g37_a38(Nuc,I,J,Partial_inst) -> + {I,dgf_base(g37_a38_tfo(),get_var(J,Partial_inst),Nuc),Nuc}. + +stacked5_(Nuc,I,J,Partial_inst) -> + [g37_a38(Nuc,I,J,Partial_inst) | helix5_(Nuc,I,J,Partial_inst)]. + +a38_g37_tfo() -> + { + 0.9991, -0.0375, 0.0189, + 0.0164, 0.7616, 0.6478, + -0.0387, -0.6470, 0.7615, + 3.3819, 0.7718, -2.5321 + }. + +a38_g37(Nuc,I,J,Partial_inst) -> + {I,dgf_base(a38_g37_tfo(),get_var(J,Partial_inst),Nuc),Nuc}. + +stacked3_(Nuc,I,J,Partial_inst) -> + [a38_g37(Nuc,I,J,Partial_inst) | helix3_(Nuc,I,J,Partial_inst)]. + +p_o3_(Nucs,I,J,Partial_inst) -> + generate([],Nucs,I,J,Partial_inst). + + +generate(Domains,[],_,_,_) -> + Domains; +generate(Domains,[N|Ns],I,J,Partial_inst) -> + Ref = get_var(J,Partial_inst), + Align = tfo_inv_ortho(tfo_align(atom_pos(nuc_O3_,Ref), + atom_pos(nuc_C3_,Ref), + atom_pos(nuc_C4_,Ref))), + generate([{I,tfo_combine(nuc_p_o3__60_tfo(N),Align),N}, + {I,tfo_combine(nuc_p_o3__180_tfo(N),Align),N}, + {I,tfo_combine(nuc_p_o3__275_tfo(N),Align),N} | Domains], + Ns,I,J,Partial_inst). + + +% -- PROBLEM STATEMENT ------------------------------------------------------- + +% Define anticodon problem -- Science 253:1255 Figure 3a, 3b and 3c + +% anticodon_domains() -> +% [ +% {reference, rC(), 27}, +% {helix5_, rC(), 28, 27}, +% {helix5_, rA(), 29, 28}, +% {helix5_, rG(), 30, 29}, +% {helix5_, rA(), 31, 30}, +% {wc, rU(), 39, 31}, +% {helix5_, rC(), 40, 39}, +% {helix5_, rU(), 41, 40}, +% {helix5_, rG(), 42, 41}, +% {helix5_, rG(), 43, 42}, +% {stacked3_, rA(), 38, 39}, +% {stacked3_, rG(), 37, 38}, +% {stacked3_, rA(), 36, 37}, +% {stacked3_, rA(), 35, 36}, +% {stacked3_, rG(), 34, 35}, %<-. Distance +% {p_o3_, rCs(), 32, 31}, % | Constraint +% {p_o3_, rUs(), 33, 32} %<-' 3.0 Angstroms +% ]. + +% Anticodon constraint + +anticodon_constraint({33,T,N},Partial_inst) -> + check0(dist(34,{33,T,N},Partial_inst)); +anticodon_constraint(_,_) -> true. + +check0(Dist) when is_float(Dist), Dist =< 3.0 -> true; +check0(_) -> false. + +dist(J,V,Partial_inst) -> + pt_dist(atom_pos(nuc_P, get_var(J,Partial_inst)), + atom_pos(nuc_O3_,V)). + +% anticodon() -> search([], anticodon_domains(), anticodon_constraint). + +% Define pseudoknot problem -- Science 253:1255 Figure 4a and 4b +pseudoknot_domains() -> + [ + {reference, rA(), 23}, + {wc_dumas, rU(), 8, 23}, + {helix3_, rG(), 22, 23}, + {wc_dumas, rC(), 9, 22}, + {helix3_, rG(), 21, 22}, + {wc_dumas, rC(), 10, 21}, + {helix3_, rC(), 20, 21}, + {wc_dumas, rG(), 11, 20}, + {helix3_, rU_(), 19, 20}, %<-. + {wc_dumas, rA(), 12, 19}, % | Distance +% % | Constraint +% Helix 1 % | 4.0 Angstroms + {helix3_, rC(), 3, 19}, % | + {wc_dumas, rG(), 13, 3}, % | + {helix3_, rC(), 2, 3}, % | + {wc_dumas, rG(), 14, 2}, % | + {helix3_, rC(), 1, 2}, % | + {wc_dumas, rG_(), 15, 1}, % | +% % | +% L2 LOOP % | + {p_o3_, rUs(), 16, 15}, % | + {p_o3_, rCs(), 17, 16}, % | + {p_o3_, rAs(), 18, 17}, %<-' +% +% L1 LOOP + {helix3_, rU(), 7, 8}, %<-. + {p_o3_, rCs(), 4, 3}, % | Constraint + {stacked5_, rU(), 5, 4}, % | 4.5 Angstroms + {stacked5_, rC(), 6, 5} %<-' + ]. + +% Pseudoknot constraint + +pseudoknot_constraint({18,T,N}, Partial_inst) -> + check1(dist(19, {18,T,N}, Partial_inst)); +pseudoknot_constraint({6,T,N}, Partial_inst) -> + check2(dist(7, {6,T,N}, Partial_inst)); +pseudoknot_constraint(_,_) -> true. + +check1(Dist) when is_float(Dist), Dist =< 4.0 -> true; +check1(_) -> false. + +check2(Dist) when is_float(Dist), Dist =< 4.5 -> true; +check2(_) -> false. + +pseudoknot() -> search([], pseudoknot_domains(), pseudoknot_constraint). + +% -- TESTING ----------------------------------------------------------------- + +list_of_atoms(N) -> + append(list_of_common_atoms(N),list_of_specific_atoms(N)). + +list_of_common_atoms + ({ + _,_,_,_, + P,O1p,O2p,O5_,C5_,H5_,H5__,C4_,H4_,O4_,C1_,H1_,C2_,H2__,O2_,H2_, + C3_,H3_,O3_,N1,N3,C2,C4,C5,C6, + _,_ + }) -> + [P,O1p,O2p,O5_,C5_,H5_,H5__,C4_,H4_,O4_,C1_,H1_,C2_,H2__,O2_,H2_, + C3_,H3_,O3_,N1,N3,C2,C4,C5,C6]. + +list_of_specific_atoms({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,a, + {N6,N7,N9,C8,H2,H61,H62,H8}}) -> + [N6,N7,N9,C8,H2,H61,H62,H8]; +list_of_specific_atoms({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,c, + {N4,O2,H41,H42,H5,H6}}) -> + [N4,O2,H41,H42,H5,H6]; +list_of_specific_atoms({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,g, + {N2,N7,N9,C8,O6,H1,H21,H22,H8}}) -> + [N2,N7,N9,C8,O6,H1,H21,H22,H8]; +list_of_specific_atoms({_,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,_, + _,_,_,_,_,_,_,_,_,u, + {O2,O4,H3,H5,H6}}) -> + [O2,O4,H3,H5,H6]. + +var_most_distant_atom(V) -> + {_,_,N} = V, + maximum(map(distance,V,list_of_atoms(N))). + +distance(V,P) -> + {X,Y,Z} = absolute_pos(V,P), + distance(X,Y,Z). + +distance(X,Y,Z) when is_float(X), is_float(Y), is_float(Z) -> + math:sqrt(X * X + Y * Y + Z * Z). + +sol_most_distant_atom(S) -> + maximum(map(var_most_distant_atom,S)). + +most_distant_atom(Sols) -> + maximum(map(sol_most_distant_atom, Sols)). + +maximum([H|T]) -> + max(T,H). + +max([H|T],M) when is_float(H), is_float(M), H > M -> + max(T,H); +max([_|T],M) -> + max(T,M); +max([],M) -> M. + +map(_Func,[]) -> []; +map(Func,[H|T]) -> + [p_apply(Func,H) | map(Func, T)]. + +map(_Func,_Arg,[]) -> []; +map(Func,Arg,[H|T]) -> + [p_apply(Func,Arg,H) | map(Func,Arg,T)]. + +% p_apply implements higher order functions +p_apply(sol_most_distant_atom, S) -> sol_most_distant_atom(S); +p_apply(var_most_distant_atom, V) -> var_most_distant_atom(V); +p_apply(nuc_C1_, X) -> nuc_C1_(X); +p_apply(nuc_C2, X) -> nuc_C2(X); +p_apply(nuc_C3_, X) -> nuc_C3_(X); +p_apply(nuc_C4, X) -> nuc_C4(X); +p_apply(nuc_C4_, X) -> nuc_C4_(X); +p_apply(nuc_N1, X) -> nuc_N1(X); +p_apply(nuc_O3_, X) -> nuc_O3_(X); +p_apply(nuc_P, X) -> nuc_P(X); +p_apply(nuc_dgf_base_tfo, X) -> nuc_dgf_base_tfo(X); +p_apply(nuc_p_o3__180_tfo, X) -> nuc_p_o3__180_tfo(X); +p_apply(nuc_p_o3__275_tfo, X) -> nuc_p_o3__275_tfo(X); +p_apply(nuc_p_o3__60_tfo, X) -> nuc_p_o3__60_tfo(X); +p_apply(rA_N9, X) -> rA_N9(X); +p_apply(rG_N9, X) -> rG_N9(X). + +p_apply(anticodon_constraint, V, P) -> anticodon_constraint(V, P); +p_apply(pseudoknot_constraint, V, P) -> pseudoknot_constraint(V, P); +p_apply(distance, V, P) -> distance(V, P). + +p_apply(reference, A1, A2, A3) -> reference(A1, A2, A3). + +p_apply(helix5_, A1, A2, A3, A4) -> helix5_(A1, A2, A3, A4); +p_apply(wc, A1, A2, A3, A4) -> wc(A1, A2, A3, A4); +p_apply(stacked3_, A1, A2, A3, A4) -> stacked3_(A1, A2, A3, A4); +p_apply(p_o3_, A1, A2, A3, A4) -> p_o3_(A1, A2, A3, A4); +p_apply(wc_dumas, A1, A2, A3, A4) -> wc_dumas(A1, A2, A3, A4); +p_apply(helix3_, A1, A2, A3, A4) -> helix3_(A1, A2, A3, A4); +p_apply(stacked5_, A1, A2, A3, A4) -> stacked5_(A1, A2, A3, A4). + +loop(0,R) -> R; +loop(N,_) -> loop(N-1,most_distant_atom(pseudoknot())). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/random_iolist.erl erlang-13.b.3-dfsg/erts/emulator/test/random_iolist.erl --- erlang-13.b.1-dfsg/erts/emulator/test/random_iolist.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/random_iolist.erl 2009-09-18 15:09:25.000000000 +0100 @@ -0,0 +1,195 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% +%% Generate random iolists to be used by crypto_SUITE.erl +%% + +-module(random_iolist). + +-export([run/3, run2/3, standard_seed/0, compare/3, compare2/3, + random_iolist/1]). + +run(Iter,Fun1,Fun2) -> + standard_seed(), + compare(Iter,Fun1,Fun2). + +run2(Iter,Fun1,Fun2) -> + standard_seed(), + compare2(Iter,Fun1,Fun2). + +random_byte() -> + random:uniform(256) - 1. + +random_list(0,Acc) -> + Acc; +random_list(N,Acc) -> + random_list(N-1,[random_byte() | Acc]). + +random_binary(N) -> + B = list_to_binary(random_list(N,[])), + case {random:uniform(2),size(B)} of + {2,M} when M > 1 -> + S = M-1, + <<_:3,C:S/binary,_:5>> = B, + C; + _ -> + B + end. +random_list(N) -> + random_list(N,[]). + +front() -> + case random:uniform(10) of + 10 -> + false; + _ -> + true + end. + +any_type() -> + case random:uniform(10) of + 1 -> + list; + 2 -> + binary; + 3 -> + iolist; + _ -> + byte + end. + +tail_type() -> + case random:uniform(5) of + 1 -> + list; + 2 -> + iolist; + _ -> + binary + end. + +random_length(N) -> + UpperLimit = 255, + case N of + M when M > UpperLimit -> + random:uniform(UpperLimit+1) - 1; + _ -> + random:uniform(N+1) - 1 + end. + +random_iolist(0,Acc) -> + Acc; +random_iolist(N,Acc) -> + case front() of + true -> + case any_type() of + list -> + X = random_length(N), + L = random_list(X), + random_iolist(N-X,[L|Acc]); + binary -> + X = random_length(N), + B = random_binary(X), + random_iolist(N-X,[B|Acc]); + iolist -> + X = random_length(N), + B = random_iolist(X), + random_iolist(N-X,[B|Acc]); + byte -> + C = random_byte(), + random_iolist(N-1,[C|Acc]) + end; + false -> + case tail_type() of + list -> + X = random_length(N), + L = random_list(X), + random_iolist(N-X,[Acc|L]); + binary -> + X = random_length(N), + B = random_binary(X), + random_iolist(N-X,[Acc|B]); + iolist -> + X = random_length(N), + B = random_iolist(X), + random_iolist(N-X,[Acc|B]) + end + end. + +random_iolist(N) -> + random_iolist(N,[]). + + +standard_seed() -> + random:seed(1201,855653,380975). + +do_comp(List,F1,F2) -> + X = F1(List), + Y = F2(List), + case X =:= Y of + false -> + exit({not_matching,List,X,Y}); + _ -> + true + end. + +do_comp(List,List2,F1,F2) -> + X = F1(List,List2), + Y = F2(List,List2), + case X =:= Y of + false -> + exit({not_matching,List,List2,X,Y}); + _ -> + true + end. + +compare(0,Fun1,Fun2) -> + do_comp(<<>>,Fun1,Fun2), + do_comp([],Fun1,Fun2), + do_comp([[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],Fun1,Fun2), + true; + +compare(N,Fun1,Fun2) -> + L = random_iolist(N), + do_comp(L,Fun1,Fun2), + compare(N-1,Fun1,Fun2). + +compare2(0,Fun1,Fun2) -> + L = random_iolist(100), + do_comp(<<>>,L,Fun1,Fun2), + do_comp(L,<<>>,Fun1,Fun2), + do_comp(<<>>,<<>>,Fun1,Fun2), + do_comp([],L,Fun1,Fun2), + do_comp(L,[],Fun1,Fun2), + do_comp([],[],Fun1,Fun2), + do_comp([[]|<<>>],L,Fun1,Fun2), + do_comp(L,[[]|<<>>],Fun1,Fun2), + do_comp([[]|<<>>],[[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],L,Fun1,Fun2), + do_comp(L,[<<>>,[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],[<<>>,[]|<<>>],Fun1,Fun2), + true; + +compare2(N,Fun1,Fun2) -> + L = random_iolist(N), + L2 = random_iolist(N), + do_comp(L,L2,Fun1,Fun2), + compare2(N-1,Fun1,Fun2). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/ref_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/ref_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/ref_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/ref_SUITE.erl 2009-09-18 15:08:06.000000000 +0100 @@ -0,0 +1,58 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(ref_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2]). +-export([wrap_1/1]). + +-export([loop_ref/1]). + +-include("test_server.hrl"). + +init_per_testcase(_, Config) -> + ?line Dog=test_server:timetrap(test_server:minutes(2)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> [wrap_1]. + +wrap_1(doc) -> "Check that refs don't wrap around easily."; +wrap_1(Config) when is_list(Config) -> + ?line spawn_link(?MODULE, loop_ref, [self()]), + ?line receive + done -> + test_server:fail(wrapfast) + after 30000 -> + ok + end, + ok. + +loop_ref(Parent) -> + Ref0 = make_ref(), + loop_ref(Ref0, first, 0), + Parent ! done. + +loop_ref(R, R, _) -> ok; +loop_ref(R0, _, N) -> + loop_ref(R0, make_ref(), N+1). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/register_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/register_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/register_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/register_SUITE.erl 2009-09-18 15:10:21.000000000 +0100 @@ -0,0 +1,87 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(register_SUITE). + + +%-define(line_trace, 1). + +-include("test_server.hrl"). + +%-compile(export_all). +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([otp_8099/1]). + +-define(DEFAULT_TIMEOUT, ?t:minutes(2)). + +all(doc) -> []; +all(suite) -> + [otp_8099]. + +init_per_testcase(Case, Config) when is_list(Config) -> + Dog = ?t:timetrap(?DEFAULT_TIMEOUT), + [{watchdog, Dog}, {testcase, Case} | Config]. + +fin_per_testcase(_Case, Config) when is_list(Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +%% +%% Test cases +%% + +-define(OTP_8099_NAME, otp_8099_reg_proc). + +otp_8099(Config) when is_list(Config) -> + case catch erlang:system_info(lock_counting) of + true -> {skipped, + "Lock counting enabled. Current lock counting " + "implementation cannot handle this many " + "processes."}; + _ -> + otp_8099_test(1000000) + end. + +otp_8099_test(0) -> + ok; +otp_8099_test(N) -> + ?line P = spawn(fun () -> otp_8099_proc() end), + ?line case catch register(?OTP_8099_NAME, P) of + true -> + ?line ok; + _ -> + ?line OP = whereis(?OTP_8099_NAME), + ?line (catch unregister(?OTP_8099_NAME)), + ?line (catch exit(OP, kill)), + ?line true = (catch register(?OTP_8099_NAME, P)) + end, + ?line P = whereis(?OTP_8099_NAME), + ?line exit(P, kill), + ?line otp_8099_test(N-1). + +otp_8099_proc() -> + receive _ -> ok end, + otp_8099_proc(). + +%% +%% Utils +%% + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/save_calls_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/save_calls_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/save_calls_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/save_calls_SUITE.erl 2009-09-18 15:08:04.000000000 +0100 @@ -0,0 +1,256 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(save_calls_SUITE). + +-include("test_server.hrl"). + +-export([all/1]). + +-export([save_calls_1/1,dont_break_reductions/1]). + +-export([do_bopp/1, do_bipp/0, do_bepp/0]). + +all(suite) -> + [save_calls_1, dont_break_reductions]. + +dont_break_reductions(suite) -> + []; +dont_break_reductions(doc) -> + ["Check that save_calls dont break reduction-based scheduling"]; +dont_break_reductions(Config) when is_list(Config) -> + ?line RPS1 = reds_per_sched(0), + ?line RPS2 = reds_per_sched(20), + ?line Diff = abs(RPS1 - RPS2), + ?line true = (Diff < (0.05 * RPS1)), + ok. + + +reds_per_sched(SaveCalls) -> + ?line Parent = self(), + ?line HowMany = 10000, + ?line Pid = spawn(fun() -> + process_flag(save_calls,SaveCalls), + receive + go -> + carmichaels_below(HowMany), + Parent ! erlang:process_info(self(),reductions) + end + end), + ?line TH = spawn(fun() -> trace_handler(0,Parent,Pid) end), + ?line erlang:trace(Pid, true,[running,procs,{tracer,TH}]), + ?line Pid ! go, + ?line {Sched,Reds} = receive + {accumulated,X} -> + receive {reductions,Y} -> + {X,Y} + after 30000 -> + timeout + end + after 30000 -> + timeout + end, + ?line Reds div Sched. + + + +trace_handler(Acc,Parent,Client) -> + receive + {trace,Client,out,_} -> + trace_handler(Acc+1,Parent,Client); + {trace,Client,exit,_} -> + Parent ! {accumulated, Acc}; + _ -> + trace_handler(Acc,Parent,Client) + after 10000 -> + ok + end. + +save_calls_1(doc) -> "Test call saving."; +save_calls_1(Config) when is_list(Config) -> + case test_server:is_native(?MODULE) of + true -> {skipped,"Native code"}; + false -> save_calls_1() + end. + +save_calls_1() -> + ?line erlang:process_flag(self(), save_calls, 0), + ?line {last_calls, false} = process_info(self(), last_calls), + + ?line erlang:process_flag(self(), save_calls, 10), + ?line {last_calls, _L1} = process_info(self(), last_calls), + ?line ?MODULE:do_bipp(), + ?line {last_calls, L2} = process_info(self(), last_calls), + ?line L21 = lists:filter(fun is_local_function/1, L2), + ?line case L21 of + [{?MODULE,do_bipp,0}, + timeout, + 'send', + {?MODULE,do_bopp,1}, + 'receive', + timeout, + {?MODULE,do_bepp,0}] -> + ok; + X -> + test_server:fail({l21, X}) + end, + + ?line erlang:process_flag(self(), save_calls, 10), + ?line {last_calls, L3} = process_info(self(), last_calls), + ?line L31 = lists:filter(fun is_local_function/1, L3), + ?line [] = L31, + ok. + +do_bipp() -> + do_bopp(0), + do_bapp(), + ?MODULE:do_bopp(0), + do_bopp(3), + apply(?MODULE, do_bepp, []). + +do_bapp() -> + self() ! heffaklump. + +do_bopp(T) -> + receive + X -> X + after T -> ok + end. + +do_bepp() -> + ok. + +is_local_function({?MODULE, _, _}) -> + true; +is_local_function({_, _, _}) -> + false; +is_local_function(_) -> + true. + + +% Number crunching for reds test. +carmichaels_below(N) -> + random:seed(3172,9814,20125), + carmichaels_below(1,N). + +carmichaels_below(N,N2) when N >= N2 -> + 0; +carmichaels_below(N,N2) -> + X = case fast_prime(N,10) of + false -> 0; + true -> + case fast_prime2(N,10) of + true -> + %io:format("Prime: ~p~n",[N]), + 0; + false -> + io:format("Carmichael: ~p (dividable by ~p)~n", + [N,smallest_divisor(N)]), + 1 + end + end, + X+carmichaels_below(N+2,N2). + +expmod(_,E,_) when E == 0 -> + 1; +expmod(Base,Exp,Mod) when (Exp rem 2) == 0 -> + X = expmod(Base,Exp div 2,Mod), + (X*X) rem Mod; +expmod(Base,Exp,Mod) -> + (Base * expmod(Base,Exp - 1,Mod)) rem Mod. + +uniform(N) -> + random:uniform(N-1). + +fermat(N) -> + R = uniform(N), + expmod(R,N,N) == R. + +do_fast_prime(1,_) -> + true; +do_fast_prime(_N,0) -> + true; +do_fast_prime(N,Times) -> + case fermat(N) of + true -> + do_fast_prime(N,Times-1); + false -> + false + end. + +fast_prime(N,T) -> + do_fast_prime(N,T). + +expmod2(_,E,_) when E == 0 -> + 1; +expmod2(Base,Exp,Mod) when (Exp rem 2) == 0 -> +%% Uncomment the code below to simulate scheduling bug! +% case erlang:process_info(self(),last_calls) of +% {last_calls,false} -> ok; +% _ -> erlang:yield() +% end, + X = expmod2(Base,Exp div 2,Mod), + Y=(X*X) rem Mod, + if + Y == 1, X =/= 1, X =/= (Mod - 1) -> + 0; + true -> + Y rem Mod + end; +expmod2(Base,Exp,Mod) -> + (Base * expmod2(Base,Exp - 1,Mod)) rem Mod. + +miller_rabbin(N) -> + R = uniform(N), + expmod2(R,N,N) == R. + +do_fast_prime2(1,_) -> + true; +do_fast_prime2(_N,0) -> + true; +do_fast_prime2(N,Times) -> + case miller_rabbin(N) of + true -> + do_fast_prime2(N,Times-1); + false -> + false + end. + +fast_prime2(N,T) -> + do_fast_prime2(N,T). + +smallest_divisor(N) -> + find_divisor(N,2). + +find_divisor(N,TD) -> + if + TD*TD > N -> + N; + true -> + case divides(TD,N) of + true -> + TD; + false -> + find_divisor(N,TD+1) + end + end. + +divides(A,B) -> + (B rem A) == 0. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/scheduler_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/scheduler_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/scheduler_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/scheduler_SUITE.erl 2009-09-18 15:09:30.000000000 +0100 @@ -0,0 +1,1378 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +%%%------------------------------------------------------------------- +%%% File : scheduler_SUITE.erl +%%% Author : Rickard Green +%%% Description : +%%% +%%% Created : 27 Oct 2008 by Rickard Green +%%%------------------------------------------------------------------- +-module(scheduler_SUITE). + + +%-define(line_trace, 1). + +-include("test_server.hrl"). + +%-compile(export_all). +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([equal/1, + few_low/1, + many_low/1, + equal_with_part_time_high/1, + equal_with_part_time_max/1, + equal_and_high_with_part_time_max/1, + equal_with_high/1, + equal_with_high_max/1, + bound_process/1, + scheduler_bind/1, + scheduler_bind_types/1, + cpu_topology/1, + sct_cmd/1, + sbt_cmd/1]). + +-define(DEFAULT_TIMEOUT, ?t:minutes(10)). + +-define(MIN_SCHEDULER_TEST_TIMEOUT, ?t:minutes(1)). + +all(doc) -> []; +all(suite) -> + [equal, + few_low, + many_low, + equal_with_part_time_high, + equal_with_part_time_max, + equal_and_high_with_part_time_max, + equal_with_high, + equal_with_high_max, + bound_process, + scheduler_bind]. + +init_per_testcase(Case, Config) when is_list(Config) -> + Dog = ?t:timetrap(?DEFAULT_TIMEOUT), + process_flag(priority, max), + erlang:display({'------------', ?MODULE, Case, '------------'}), + OkRes = ok, + [{watchdog, Dog}, {testcase, Case}, {ok_res, OkRes} |Config]. + +fin_per_testcase(_Case, Config) when is_list(Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +-define(ERTS_RUNQ_CHECK_BALANCE_REDS_PER_SCHED, (2000*2000)). +-define(DEFAULT_TEST_REDS_PER_SCHED, 200000000). + +%% +%% Test cases +%% + +equal(Config) when is_list(Config) -> + low_normal_test(Config, 500, 500). + +few_low(Config) when is_list(Config) -> + low_normal_test(Config, 1000, 2*active_schedulers()). + +many_low(Config) when is_list(Config) -> + low_normal_test(Config, 2*active_schedulers(), 1000). + +low_normal_test(Config, NW, LW) -> + ?line Tracer = start_tracer(), + ?line Low = workers(LW, low), + ?line Normal = workers(NW, normal), + ?line Res = do_it(Tracer, Low, Normal, [], []), + ?line chk_result(Res, LW, NW, 0, 0, true, false, false), + ?line workers_exit([Low, Normal]), + ?line ok(Res, Config). + +equal_with_part_time_high(Config) when is_list(Config) -> + ?line NW = 500, + ?line LW = 500, + ?line HW = 1, + ?line Tracer = start_tracer(), + ?line Normal = workers(NW, normal), + ?line Low = workers(LW, low), + ?line High = part_time_workers(HW, high), + ?line Res = do_it(Tracer, Low, Normal, High, []), + ?line chk_result(Res, LW, NW, HW, 0, true, true, false), + ?line workers_exit([Low, Normal, High]), + ?line ok(Res, Config). + +equal_and_high_with_part_time_max(Config) when is_list(Config) -> + ?line NW = 500, + ?line LW = 500, + ?line HW = 500, + ?line MW = 1, + ?line Tracer = start_tracer(), + ?line Low = workers(LW, low), + ?line Normal = workers(NW, normal), + ?line High = workers(HW, high), + ?line Max = part_time_workers(MW, max), + ?line Res = do_it(Tracer, Low, Normal, High, Max), + ?line chk_result(Res, LW, NW, HW, MW, false, true, true), + ?line workers_exit([Low, Normal, Max]), + ?line ok(Res, Config). + +equal_with_part_time_max(Config) when is_list(Config) -> + ?line NW = 500, + ?line LW = 500, + ?line MW = 1, + ?line Tracer = start_tracer(), + ?line Low = workers(LW, low), + ?line Normal = workers(NW, normal), + ?line Max = part_time_workers(MW, max), + ?line Res = do_it(Tracer, Low, Normal, [], Max), + ?line chk_result(Res, LW, NW, 0, MW, true, false, true), + ?line workers_exit([Low, Normal, Max]), + ?line ok(Res, Config). + +equal_with_high(Config) when is_list(Config) -> + ?line NW = 500, + ?line LW = 500, + ?line HW = 1, + ?line Tracer = start_tracer(), + ?line Low = workers(LW, low), + ?line Normal = workers(NW, normal), + ?line High = workers(HW, high), + ?line Res = do_it(Tracer, Low, Normal, High, []), + ?line LNExe = case active_schedulers() of + S when S =< HW -> false; + _ -> true + end, + ?line chk_result(Res, LW, NW, HW, 0, LNExe, true, false), + ?line workers_exit([Low, Normal, High]), + ?line ok(Res, Config). + +equal_with_high_max(Config) when is_list(Config) -> + ?line NW = 500, + ?line LW = 500, + ?line HW = 1, + ?line MW = 1, + ?line Tracer = start_tracer(), + ?line Normal = workers(NW, normal), + ?line Low = workers(LW, low), + ?line High = workers(HW, high), + ?line Max = workers(MW, max), + ?line Res = do_it(Tracer, Low, Normal, High, Max), + ?line {LNExe, HExe} = case active_schedulers() of + S when S =< MW -> {false, false}; + S when S =< (MW + HW) -> {false, true}; + _ -> {true, true} + end, + ?line chk_result(Res, LW, NW, HW, MW, LNExe, HExe, true), + ?line workers_exit([Low, Normal, Max]), + ?line ok(Res, Config). + +bound_process(Config) when is_list(Config) -> + case erlang:system_info(run_queues) == erlang:system_info(schedulers) of + true -> + ?line NStartBase = 20000, + ?line NStart = case {erlang:system_info(debug_compiled), + erlang:system_info(lock_checking)} of + {true, true} -> NStartBase div 100; + {_, true} -> NStartBase div 10; + _ -> NStartBase + end, + ?line MStart = 100, + ?line Seq = lists:seq(1, 100), + ?line Tester = self(), + ?line Procs = lists:map( + fun (N) when N rem 2 == 0 -> + spawn_opt(fun () -> + bound_loop(NStart, + NStart, + MStart, + 1), + Tester ! {self(), done} + end, + [{scheduler, 1}, link]); + (_N) -> + spawn_link(fun () -> + bound_loop(NStart, + NStart, + MStart, + false), + Tester ! {self(), done} + end) + end, + Seq), + ?line lists:foreach(fun (P) -> receive {P, done} -> ok end end, + Procs), + ?line ok; + false -> + {skipped, "Functionality not supported"} + end. + +bound_loop(_, 0, 0, _) -> + ok; +bound_loop(NS, 0, M, false) -> + bound_loop(NS, NS, M-1, false); +bound_loop(NS, N, M, false) -> + erlang:system_info(scheduler_id), + bound_loop(NS, N-1, M, false); +bound_loop(NS, 0, M, Sched) -> + NewSched = (Sched rem erlang:system_info(schedulers_online)) + 1, + Sched = process_flag(scheduler, NewSched), + NewSched = erlang:system_info(scheduler_id), + bound_loop(NS, NS, M-1, NewSched); +bound_loop(NS, N, M, Sched) -> + Sched = erlang:system_info(scheduler_id), + bound_loop(NS, N-1, M, Sched). + +scheduler_bind(suite) -> + [scheduler_bind_types, + cpu_topology, + sct_cmd, + sbt_cmd]. + +-define(TOPOLOGY_A_CMD, + "+sct" + "L0-1t0-1c0p0n0" + ":L2-3t0-1c1p0n0" + ":L4-5t0-1c0p1n0" + ":L6-7t0-1c1p1n0" + ":L8-9t0-1c0p2n1" + ":L10-11t0-1c1p2n1" + ":L12-13t0-1c0p3n1" + ":L14-15t0-1c1p3n1"). + +-define(TOPOLOGY_A_TERM, + [{node,[{processor,[{core,[{thread,{logical,0}}, + {thread,{logical,1}}]}, + {core,[{thread,{logical,2}}, + {thread,{logical,3}}]}]}, + {processor,[{core,[{thread,{logical,4}}, + {thread,{logical,5}}]}, + {core,[{thread,{logical,6}}, + {thread,{logical,7}}]}]}]}, + {node,[{processor,[{core,[{thread,{logical,8}}, + {thread,{logical,9}}]}, + {core,[{thread,{logical,10}}, + {thread,{logical,11}}]}]}, + {processor,[{core,[{thread,{logical,12}}, + {thread,{logical,13}}]}, + {core,[{thread,{logical,14}}, + {thread,{logical,15}}]}]}]}]). + +-define(TOPOLOGY_B_CMD, + "+sct" + "L0-1t0-1c0n0p0" + ":L2-3t0-1c1n0p0" + ":L4-5t0-1c2n1p0" + ":L6-7t0-1c3n1p0" + ":L8-9t0-1c0n2p1" + ":L10-11t0-1c1n2p1" + ":L12-13t0-1c2n3p1" + ":L14-15t0-1c3n3p1"). + +-define(TOPOLOGY_B_TERM, + [{processor,[{node,[{core,[{thread,{logical,0}}, + {thread,{logical,1}}]}, + {core,[{thread,{logical,2}}, + {thread,{logical,3}}]}]}, + {node,[{core,[{thread,{logical,4}}, + {thread,{logical,5}}]}, + {core,[{thread,{logical,6}}, + {thread,{logical,7}}]}]}]}, + {processor,[{node,[{core,[{thread,{logical,8}}, + {thread,{logical,9}}]}, + {core,[{thread,{logical,10}}, + {thread,{logical,11}}]}]}, + {node,[{core,[{thread,{logical,12}}, + {thread,{logical,13}}]}, + {core,[{thread,{logical,14}}, + {thread,{logical,15}}]}]}]}]). + +-define(TOPOLOGY_C_TERM, + [{node,[{processor,[{core,[{thread,{logical,0}}, + {thread,{logical,1}}]}, + {core,[{thread,{logical,2}}, + {thread,{logical,3}}]}]}, + {processor,[{core,[{thread,{logical,4}}, + {thread,{logical,5}}]}, + {core,[{thread,{logical,6}}, + {thread,{logical,7}}]}]}]}, + {processor,[{node,[{core,[{thread,{logical,8}}, + {thread,{logical,9}}]}, + {core,[{thread,{logical,10}}, + {thread,{logical,11}}]}]}, + {node,[{core,[{thread,{logical,12}}, + {thread,{logical,13}}]}, + {core,[{thread,{logical,14}}, + {thread,{logical,15}}]}]}]}, + {node,[{processor,[{core,[{thread,{logical,16}}, + {thread,{logical,17}}]}, + {core,[{thread,{logical,18}}, + {thread,{logical,19}}]}]}, + {processor,[{core,[{thread,{logical,20}}, + {thread,{logical,21}}]}, + {core,[{thread,{logical,22}}, + {thread,{logical,23}}]}]}]}, + {processor,[{node,[{core,[{thread,{logical,24}}, + {thread,{logical,25}}]}, + {core,[{thread,{logical,26}}, + {thread,{logical,27}}]}]}, + {node,[{core,[{thread,{logical,28}}, + {thread,{logical,29}}]}, + {core,[{thread,{logical,30}}, + {thread,{logical,31}}]}]}]}]). + + +-define(TOPOLOGY_C_CMD, + "+sct" + "L0-1t0-1c0p0n0" + ":L2-3t0-1c1p0n0" + ":L4-5t0-1c0p1n0" + ":L6-7t0-1c1p1n0" + ":L8-9t0-1c0n1p2" + ":L10-11t0-1c1n1p2" + ":L12-13t0-1c2n2p2" + ":L14-15t0-1c3n2p2" + ":L16-17t0-1c0p3n3" + ":L18-19t0-1c1p3n3" + ":L20-21t0-1c0p4n3" + ":L22-23t0-1c1p4n3" + ":L24-25t0-1c0n4p5" + ":L26-27t0-1c1n4p5" + ":L28-29t0-1c2n5p5" + ":L30-31t0-1c3n5p5"). + +-define(TOPOLOGY_D_TERM, + [{processor,[{node,[{core,[{thread,{logical,0}}, + {thread,{logical,1}}]}, + {core,[{thread,{logical,2}}, + {thread,{logical,3}}]}]}, + {node,[{core,[{thread,{logical,4}}, + {thread,{logical,5}}]}, + {core,[{thread,{logical,6}}, + {thread,{logical,7}}]}]}]}, + {node,[{processor,[{core,[{thread,{logical,8}}, + {thread,{logical,9}}]}, + {core,[{thread,{logical,10}}, + {thread,{logical,11}}]}]}, + {processor,[{core,[{thread,{logical,12}}, + {thread,{logical,13}}]}, + {core,[{thread,{logical,14}}, + {thread,{logical,15}}]}]}]}, + {processor,[{node,[{core,[{thread,{logical,16}}, + {thread,{logical,17}}]}, + {core,[{thread,{logical,18}}, + {thread,{logical,19}}]}]}, + {node,[{core,[{thread,{logical,20}}, + {thread,{logical,21}}]}, + {core,[{thread,{logical,22}}, + {thread,{logical,23}}]}]}]}, + {node,[{processor,[{core,[{thread,{logical,24}}, + {thread,{logical,25}}]}, + {core,[{thread,{logical,26}}, + {thread,{logical,27}}]}]}, + {processor,[{core,[{thread,{logical,28}}, + {thread,{logical,29}}]}, + {core,[{thread,{logical,30}}, + {thread,{logical,31}}]}]}]}]). + +-define(TOPOLOGY_D_CMD, + "+sct" + "L0-1t0-1c0n0p0" + ":L2-3t0-1c1n0p0" + ":L4-5t0-1c2n1p0" + ":L6-7t0-1c3n1p0" + ":L8-9t0-1c0p1n2" + ":L10-11t0-1c1p1n2" + ":L12-13t0-1c0p2n2" + ":L14-15t0-1c1p2n2" + ":L16-17t0-1c0n3p3" + ":L18-19t0-1c1n3p3" + ":L20-21t0-1c2n4p3" + ":L22-23t0-1c3n4p3" + ":L24-25t0-1c0p4n5" + ":L26-27t0-1c1p4n5" + ":L28-29t0-1c0p5n5" + ":L30-31t0-1c1p5n5"). + +-define(TOPOLOGY_E_CMD, + "+sct" + "L0-1t0-1c0p0n0" + ":L2-3t0-1c1p0n0" + ":L4-5t0-1c2p0n0" + ":L6-7t0-1c3p0n0" + ":L8-9t0-1c0p1n1" + ":L10-11t0-1c1p1n1" + ":L12-13t0-1c2p1n1" + ":L14-15t0-1c3p1n1"). + +-define(TOPOLOGY_E_TERM, + [{node,[{processor,[{core,[{thread,{logical,0}}, + {thread,{logical,1}}]}, + {core,[{thread,{logical,2}}, + {thread,{logical,3}}]}, + {core,[{thread,{logical,4}}, + {thread,{logical,5}}]}, + {core,[{thread,{logical,6}}, + {thread,{logical,7}}]}]}]}, + {node,[{processor,[{core,[{thread,{logical,8}}, + {thread,{logical,9}}]}, + {core,[{thread,{logical,10}}, + {thread,{logical,11}}]}, + {core,[{thread,{logical,12}}, + {thread,{logical,13}}]}, + {core,[{thread,{logical,14}}, + {thread,{logical,15}}]}]}]}]). + +-define(TOPOLOGY_F_CMD, + "+sct" + "L0-1t0-1c0n0p0" + ":L2-3t0-1c1n0p0" + ":L4-5t0-1c2n0p0" + ":L6-7t0-1c3n0p0" + ":L8-9t0-1c4n1p0" + ":L10-11t0-1c5n1p0" + ":L12-13t0-1c6n1p0" + ":L14-15t0-1c7n1p0" + ":L16-17t0-1c8n2p0" + ":L18-19t0-1c9n2p0" + ":L20-21t0-1c10n2p0" + ":L22-23t0-1c11n2p0" + ":L24-25t0-1c12n3p0" + ":L26-27t0-1c13n3p0" + ":L28-29t0-1c14n3p0" + ":L30-31t0-1c15n3p0"). + +-define(TOPOLOGY_F_TERM, + [{processor,[{node,[{core,[{thread,{logical,0}}, + {thread,{logical,1}}]}, + {core,[{thread,{logical,2}}, + {thread,{logical,3}}]}, + {core,[{thread,{logical,4}}, + {thread,{logical,5}}]}, + {core,[{thread,{logical,6}}, + {thread,{logical,7}}]}]}, + {node,[{core,[{thread,{logical,8}}, + {thread,{logical,9}}]}, + {core,[{thread,{logical,10}}, + {thread,{logical,11}}]}, + {core,[{thread,{logical,12}}, + {thread,{logical,13}}]}, + {core,[{thread,{logical,14}}, + {thread,{logical,15}}]}]}, + {node,[{core,[{thread,{logical,16}}, + {thread,{logical,17}}]}, + {core,[{thread,{logical,18}}, + {thread,{logical,19}}]}, + {core,[{thread,{logical,20}}, + {thread,{logical,21}}]}, + {core,[{thread,{logical,22}}, + {thread,{logical,23}}]}]}, + {node,[{core,[{thread,{logical,24}}, + {thread,{logical,25}}]}, + {core,[{thread,{logical,26}}, + {thread,{logical,27}}]}, + {core,[{thread,{logical,28}}, + {thread,{logical,29}}]}, + {core,[{thread,{logical,30}}, + {thread,{logical,31}}]}]}]}]). + +bindings(Node, BindType) -> + Parent = self(), + Ref = make_ref(), + spawn_link(Node, + fun () -> + enable_internal_state(), + Res = (catch erts_debug:get_internal_state( + {fake_scheduler_bindings, BindType})), + Parent ! {Ref, Res} + end), + receive + {Ref, Res} -> + ?t:format("~p: ~p~n", [BindType, Res]), + Res + end. + +scheduler_bind_types(Config) when is_list(Config) -> + ?line OldRelFlags = clear_erl_rel_flags(), + try + scheduler_bind_types_test(Config, + ?TOPOLOGY_A_TERM, + ?TOPOLOGY_A_CMD, + a), + scheduler_bind_types_test(Config, + ?TOPOLOGY_B_TERM, + ?TOPOLOGY_B_CMD, + b), + scheduler_bind_types_test(Config, + ?TOPOLOGY_C_TERM, + ?TOPOLOGY_C_CMD, + c), + scheduler_bind_types_test(Config, + ?TOPOLOGY_D_TERM, + ?TOPOLOGY_D_CMD, + d), + scheduler_bind_types_test(Config, + ?TOPOLOGY_E_TERM, + ?TOPOLOGY_E_CMD, + e), + scheduler_bind_types_test(Config, + ?TOPOLOGY_F_TERM, + ?TOPOLOGY_F_CMD, + f) + after + restore_erl_rel_flags(OldRelFlags) + end, + ?line ok. + +scheduler_bind_types_test(Config, Topology, CmdLine, TermLetter) -> + ?line ?t:format("Testing (~p): ~p~n", [TermLetter, Topology]), + ?line {ok, Node0} = start_node(Config), + ?line _ = rpc:call(Node0, erlang, system_flag, [cpu_topology, Topology]), + ?line cmp(Topology, rpc:call(Node0, erlang, system_info, [cpu_topology])), + ?line check_bind_types(Node0, TermLetter), + ?line stop_node(Node0), + ?line {ok, Node1} = start_node(Config, CmdLine), + ?line cmp(Topology, rpc:call(Node1, erlang, system_info, [cpu_topology])), + ?line check_bind_types(Node1, TermLetter), + ?line stop_node(Node1). + +check_bind_types(Node, a) -> + ?line {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} + = bindings(Node, no_spread), + ?line {0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15} + = bindings(Node, thread_spread), + ?line {0,4,8,12,2,6,10,14,1,5,9,13,3,7,11,15} + = bindings(Node, processor_spread), + ?line {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15} + = bindings(Node, spread), + ?line {0,2,4,6,1,3,5,7,8,10,12,14,9,11,13,15} + = bindings(Node, no_node_thread_spread), + ?line {0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15} + = bindings(Node, no_node_processor_spread), + ?line {0,4,2,6,8,12,10,14,1,5,3,7,9,13,11,15} + = bindings(Node, thread_no_node_processor_spread), + ?line {0,4,2,6,8,12,10,14,1,5,3,7,9,13,11,15} + = bindings(Node, default_bind), + ?line ok; +check_bind_types(Node, b) -> + ?line {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} + = bindings(Node, no_spread), + ?line {0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15} + = bindings(Node, thread_spread), + ?line {0,8,2,10,4,12,6,14,1,9,3,11,5,13,7,15} + = bindings(Node, processor_spread), + ?line {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15} + = bindings(Node, spread), + ?line {0,2,1,3,4,6,5,7,8,10,9,11,12,14,13,15} + = bindings(Node, no_node_thread_spread), + ?line {0,2,1,3,4,6,5,7,8,10,9,11,12,14,13,15} + = bindings(Node, no_node_processor_spread), + ?line {0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15} + = bindings(Node, thread_no_node_processor_spread), + ?line {0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15} + = bindings(Node, default_bind), + ?line ok; +check_bind_types(Node, c) -> + ?line {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, + 25,26,27,28,29,30,31} = bindings(Node, no_spread), + ?line {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,1,3,5,7,9,11,13,15, + 17,19,21,23,25,27,29,31} = bindings(Node, thread_spread), + ?line {0,4,8,16,20,24,2,6,10,18,22,26,12,28,14,30,1,5,9,17,21,25, + 3,7,11,19,23,27,13,29,15,31} = bindings(Node, processor_spread), + ?line {0,8,16,24,4,20,12,28,2,10,18,26,6,22,14,30,1,9,17,25,5,21,13,29,3,11, + 19,27,7,23,15,31} = bindings(Node, spread), + ?line {0,2,4,6,1,3,5,7,8,10,9,11,12,14,13,15,16,18,20,22,17,19,21,23,24,26, + 25,27,28,30,29,31} = bindings(Node, no_node_thread_spread), + ?line {0,4,2,6,1,5,3,7,8,10,9,11,12,14,13,15,16,20,18,22,17,21,19,23,24,26, + 25,27,28,30,29,31} = bindings(Node, no_node_processor_spread), + ?line {0,4,2,6,8,10,12,14,16,20,18,22,24,26,28,30,1,5,3,7,9,11,13,15,17,21, + 19,23,25,27,29,31} = bindings(Node, thread_no_node_processor_spread), + ?line {0,4,2,6,8,10,12,14,16,20,18,22,24,26,28,30,1,5,3,7,9,11,13,15,17,21, + 19,23,25,27,29,31} = bindings(Node, default_bind), + ?line ok; +check_bind_types(Node, d) -> + ?line {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, + 25,26,27,28,29,30,31} = bindings(Node, no_spread), + ?line {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,1,3,5,7,9,11,13,15, + 17,19,21,23,25,27,29,31} = bindings(Node, thread_spread), + ?line {0,8,12,16,24,28,2,10,14,18,26,30,4,20,6,22,1,9,13,17,25,29,3,11,15, + 19,27,31,5,21,7,23} = bindings(Node, processor_spread), + ?line {0,8,16,24,12,28,4,20,2,10,18,26,14,30,6,22,1,9,17,25,13,29,5,21,3,11, + 19,27,15,31,7,23} = bindings(Node, spread), + ?line {0,2,1,3,4,6,5,7,8,10,12,14,9,11,13,15,16,18,17,19,20,22,21,23,24,26, + 28,30,25,27,29,31} = bindings(Node, no_node_thread_spread), + ?line {0,2,1,3,4,6,5,7,8,12,10,14,9,13,11,15,16,18,17,19,20,22,21,23,24,28, + 26,30,25,29,27,31} = bindings(Node, no_node_processor_spread), + ?line {0,2,4,6,8,12,10,14,16,18,20,22,24,28,26,30,1,3,5,7,9,13,11,15,17,19, + 21,23,25,29,27,31} = bindings(Node, thread_no_node_processor_spread), + ?line {0,2,4,6,8,12,10,14,16,18,20,22,24,28,26,30,1,3,5,7,9,13,11,15,17,19, + 21,23,25,29,27,31} = bindings(Node, default_bind), + ?line ok; +check_bind_types(Node, e) -> + ?line {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} + = bindings(Node, no_spread), + ?line {0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15} + = bindings(Node, thread_spread), + ?line {0,8,2,10,4,12,6,14,1,9,3,11,5,13,7,15} + = bindings(Node, processor_spread), + ?line {0,8,2,10,4,12,6,14,1,9,3,11,5,13,7,15} + = bindings(Node, spread), + ?line {0,2,4,6,1,3,5,7,8,10,12,14,9,11,13,15} + = bindings(Node, no_node_thread_spread), + ?line {0,2,4,6,1,3,5,7,8,10,12,14,9,11,13,15} + = bindings(Node, no_node_processor_spread), + ?line {0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15} + = bindings(Node, thread_no_node_processor_spread), + ?line {0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15} + = bindings(Node, default_bind), + ?line ok; +check_bind_types(Node, f) -> + ?line {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, + 25,26,27,28,29,30,31} = bindings(Node, no_spread), + ?line {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,1,3,5,7,9,11,13,15, + 17,19,21,23,25,27,29,31} = bindings(Node, thread_spread), + ?line {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,1,3,5,7,9,11,13, + 15,17,19,21,23,25,27,29,31} = bindings(Node, processor_spread), + ?line {0,8,16,24,2,10,18,26,4,12,20,28,6,14,22,30,1,9,17,25,3,11,19,27,5,13, + 21,29,7,15,23,31} = bindings(Node, spread), + ?line {0,2,4,6,1,3,5,7,8,10,12,14,9,11,13,15,16,18,20,22,17,19,21,23,24,26, + 28,30,25,27,29,31} = bindings(Node, no_node_thread_spread), + ?line {0,2,4,6,1,3,5,7,8,10,12,14,9,11,13,15,16,18,20,22,17,19,21,23,24,26, + 28,30,25,27,29,31} = bindings(Node, no_node_processor_spread), + ?line {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,1,3,5,7,9,11,13,15,17,19, + 21,23,25,27,29,31} = bindings(Node, thread_no_node_processor_spread), + ?line {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,1,3,5,7,9,11,13,15,17,19, + 21,23,25,27,29,31} = bindings(Node, default_bind), + ?line ok; +check_bind_types(Node, _) -> + ?line bindings(Node, no_spread), + ?line bindings(Node, thread_spread), + ?line bindings(Node, processor_spread), + ?line bindings(Node, spread), + ?line bindings(Node, no_node_thread_spread), + ?line bindings(Node, no_node_processor_spread), + ?line bindings(Node, thread_no_node_processor_spread), + ?line bindings(Node, default_bind), + ?line ok. + +cpu_topology(Config) when is_list(Config) -> + ?line OldRelFlags = clear_erl_rel_flags(), + try + ?line cpu_topology_test( + Config, + [{node,[{processor,[{core,{logical,0}}, + {core,{logical,1}}]}]}, + {processor,[{node,[{core,{logical,2}}, + {core,{logical,3}}]}]}, + {node,[{processor,[{core,{logical,4}}, + {core,{logical,5}}]}]}, + {processor,[{node,[{core,{logical,6}}, + {core,{logical,7}}]}]}], + "+sct " + "L0-1c0-1p0n0" + ":L2-3c0-1n1p1" + ":L4-5c0-1p2n2" + ":L6-7c0-1n3p3"), + ?line cpu_topology_test( + Config, + [{node,[{processor,[{core,{logical,0}}, + {core,{logical,1}}]}, + {processor,[{core,{logical,2}}, + {core,{logical,3}}]}]}, + {processor,[{node,[{core,{logical,4}}, + {core,{logical,5}}]}, + {node,[{core,{logical,6}}, + {core,{logical,7}}]}]}, + {node,[{processor,[{core,{logical,8}}, + {core,{logical,9}}]}, + {processor,[{core,{logical,10}}, + {core,{logical,11}}]}]}, + {processor,[{node,[{core,{logical,12}}, + {core,{logical,13}}]}, + {node,[{core,{logical,14}}, + {core,{logical,15}}]}]}], + "+sct " + "L0-1c0-1p0n0" + ":L2-3c0-1p1n0" + ":L4-5c0-1n1p2" + ":L6-7c2-3n2p2" + ":L8-9c0-1p3n3" + ":L10-11c0-1p4n3" + ":L12-13c0-1n4p5" + ":L14-15c2-3n5p5"), + ?line cpu_topology_test( + Config, + [{node,[{processor,[{core,{logical,0}}, + {core,{logical,1}}]}]}, + {processor,[{node,[{core,{logical,2}}, + {core,{logical,3}}]}]}, + {processor,[{node,[{core,{logical,4}}, + {core,{logical,5}}]}]}, + {node,[{processor,[{core,{logical,6}}, + {core,{logical,7}}]}]}, + {node,[{processor,[{core,{logical,8}}, + {core,{logical,9}}]}]}, + {processor,[{node,[{core,{logical,10}}, + {core,{logical,11}}]}]}], + "+sct " + "L0-1c0-1p0n0" + ":L2-3c0-1n1p1" + ":L4-5c0-1n2p2" + ":L6-7c0-1p3n3" + ":L8-9c0-1p4n4" + ":L10-11c0-1n5p5") + after + restore_erl_rel_flags(OldRelFlags) + end, + ?line ok. + +cpu_topology_test(Config, Topology, Cmd) -> + ?line ?t:format("Testing~n ~p~n ~p~n", [Topology, Cmd]), + ?line cpu_topology_bif_test(Config, Topology), + ?line cpu_topology_cmdline_test(Config, Topology, Cmd), + ?line ok. + +cpu_topology_bif_test(_Config, false) -> + ?line ok; +cpu_topology_bif_test(Config, Topology) -> + ?line {ok, Node} = start_node(Config), + ?line _ = rpc:call(Node, erlang, system_flag, [cpu_topology, Topology]), + ?line cmp(Topology, rpc:call(Node, erlang, system_info, [cpu_topology])), + ?line stop_node(Node), + ?line ok. + +cpu_topology_cmdline_test(_Config, _Topology, false) -> + ?line ok; +cpu_topology_cmdline_test(Config, Topology, Cmd) -> + ?line {ok, Node} = start_node(Config, Cmd), + ?line cmp(Topology, rpc:call(Node, erlang, system_info, [cpu_topology])), + ?line stop_node(Node), + ?line ok. + +sct_cmd(Config) when is_list(Config) -> + ?line Topology = ?TOPOLOGY_A_TERM, + ?line OldRelFlags = clear_erl_rel_flags(), + try + ?line {ok, Node} = start_node(Config, ?TOPOLOGY_A_CMD), + ?line cmp(Topology, + rpc:call(Node, erlang, system_info, [cpu_topology])), + ?line cmp(Topology, + rpc:call(Node, erlang, system_flag, [cpu_topology, Topology])), + ?line cmp(Topology, + rpc:call(Node, erlang, system_info, [cpu_topology])), + ?line stop_node(Node) + after + restore_erl_rel_flags(OldRelFlags) + end, + ?line ok. + +-define(BIND_TYPES, + [{"u", unbound}, + {"ns", no_spread}, + {"ts", thread_spread}, + {"ps", processor_spread}, + {"s", spread}, + {"nnts", no_node_thread_spread}, + {"nnps", no_node_processor_spread}, + {"tnnps", thread_no_node_processor_spread}, + {"db", thread_no_node_processor_spread}]). + +sbt_cmd(Config) when is_list(Config) -> + Bind = try + OldVal = erlang:system_flag(scheduler_bind_type, default_bind), + erlang:system_flag(scheduler_bind_type, OldVal), + go_for_it + catch + error:notsup -> notsup; + error:_ -> go_for_it + end, + case Bind of + notsup -> + ?line {skipped, "Binding of schedulers not supported"}; + go_for_it -> + CpuTCmd = case erlang:system_info({cpu_topology,detected}) of + undefined -> + case os:type() of + linux -> + case erlang:system_info(logical_processors) of + 1 -> + "+sctL0"; + N when is_integer(N) -> + NS = integer_to_list(N-1), + "+sctL0-"++NS++"p0-"++NS; + _ -> + false + end; + _ -> + false + end; + _ -> + "" + end, + case CpuTCmd of + false -> + ?line {skipped, "Don't know how to create cpu topology"}; + _ -> + case erlang:system_info(logical_processors) of + LP when is_integer(LP) -> + OldRelFlags = clear_erl_rel_flags(), + try + lists:foreach(fun ({ClBt, Bt}) -> + ?line sbt_test(Config, + CpuTCmd, + ClBt, + Bt, + LP) + end, + ?BIND_TYPES) + after + restore_erl_rel_flags(OldRelFlags) + end, + ?line ok; + _ -> + ?line {skipped, + "Don't know the amount of logical processors"} + end + end + end. + +sbt_test(Config, CpuTCmd, ClBt, Bt, LP) -> + ?line ?t:format("Testing +sbt ~s (~p)~n", [ClBt, Bt]), + ?line LPS = integer_to_list(LP), + ?line Cmd = CpuTCmd++" +sbt "++ClBt++" +S"++LPS++":"++LPS, + ?line {ok, Node} = start_node(Config, Cmd), + ?line Bt = rpc:call(Node, + erlang, + system_info, + [scheduler_bind_type]), + ?line SB = rpc:call(Node, + erlang, + system_info, + [scheduler_bindings]), + ?line ?t:format("scheduler bindings: ~p~n", [SB]), + ?line BS = case {Bt, erlang:system_info(logical_processors_available)} of + {unbound, _} -> 0; + {_, Int} when is_integer(Int) -> Int; + {_, _} -> LP + end, + ?line lists:foldl(fun (S, 0) -> + ?line unbound = S, + 0; + (S, N) -> + ?line true = is_integer(S), + N-1 + end, + BS, + tuple_to_list(SB)), + ?line stop_node(Node), + ?line ok. + + +% +%% Utils +%% + +erl_rel_flag_var() -> + "ERL_"++erlang:system_info(otp_release)++"_FLAGS". + +clear_erl_rel_flags() -> + EnvVar = erl_rel_flag_var(), + case os:getenv(EnvVar) of + false -> + false; + Value -> + os:putenv(EnvVar, ""), + Value + end. + +restore_erl_rel_flags(false) -> + ok; +restore_erl_rel_flags(OldValue) -> + os:putenv(erl_rel_flag_var(), OldValue), + ok. + +ok(too_slow, _Config) -> + {comment, "Too slow system to do any actual testing..."}; +ok(_Res, Config) -> + ?config(ok_res, Config). + +chk_result(too_slow, + _LWorkers, + _NWorkers, + _HWorkers, + _MWorkers, + _LNShouldWork, + _HShouldWork, + _MShouldWork) -> + ?line ok; +chk_result([{low, L, Lmin, _Lmax}, + {normal, N, Nmin, _Nmax}, + {high, H, Hmin, _Hmax}, + {max, M, Mmin, _Mmax}] = Res, + LWorkers, + NWorkers, + HWorkers, + MWorkers, + LNShouldWork, + HShouldWork, + MShouldWork) -> + ?line ?t:format("~p~n", [Res]), + ?line Relax = relax_limits(), + case {L, N} of + {0, 0} -> + ?line false = LNShouldWork; + _ -> + ?line {LminRatioLim, + NminRatioLim, + LNRatioLimMin, + LNRatioLimMax} = case Relax of + false -> {0.5, 0.5, 0.05, 0.25}; + true -> {0.05, 0.05, 0.01, 0.4} + end, + ?line Lavg = L/LWorkers, + ?line Navg = N/NWorkers, + ?line Ratio = Lavg/Navg, + ?line LminRatio = Lmin/Lavg, + ?line NminRatio = Nmin/Navg, + ?line ?t:format("low min ratio=~p~n" + "normal min ratio=~p~n" + "low avg=~p~n" + "normal avg=~p~n" + "low/normal ratio=~p~n", + [LminRatio, NminRatio, Lavg, Navg, Ratio]), + erlang:display({low_min_ratio, LminRatio}), + erlang:display({normal_min_ratio, NminRatio}), + erlang:display({low_avg, Lavg}), + erlang:display({normal_avg, Navg}), + erlang:display({low_normal_ratio, Ratio}), + ?line chk_lim(LminRatioLim, LminRatio, 1.0, low_min_ratio), + ?line chk_lim(NminRatioLim, NminRatio, 1.0, normal_min_ratio), + ?line chk_lim(LNRatioLimMin, Ratio, LNRatioLimMax, low_normal_ratio), + ?line true = LNShouldWork, + ?line ok + end, + case H of + 0 -> + ?line false = HShouldWork; + _ -> + ?line HminRatioLim = case Relax of + false -> 0.5; + true -> 0.1 + end, + ?line Havg = H/HWorkers, + ?line HminRatio = Hmin/Havg, + erlang:display({high_min_ratio, HminRatio}), + ?line chk_lim(HminRatioLim, HminRatio, 1.0, high_min_ratio), + ?line true = HShouldWork, + ?line ok + end, + case M of + 0 -> + ?line false = MShouldWork; + _ -> + ?line MminRatioLim = case Relax of + false -> 0.5; + true -> 0.1 + end, + ?line Mavg = M/MWorkers, + ?line MminRatio = Mmin/Mavg, + erlang:display({max_min_ratio, MminRatio}), + ?line chk_lim(MminRatioLim, MminRatio, 1.0, max_min_ratio), + ?line true = MShouldWork, + ?line ok + end, + ?line ok. + + + +chk_lim(Min, V, Max, _What) when Min =< V, V =< Max -> + ok; +chk_lim(_Min, V, _Max, What) -> + ?t:fail({bad, What, V}). + +snd(_Msg, []) -> + []; +snd(Msg, [P|Ps]) -> + P ! Msg, + Ps. + +relax_limits() -> + case strange_system_scale() of + Scale when Scale > 1 -> + ?t:format("Relaxing limits~n", []), + true; + _ -> + false + end. + +strange_system_scale() -> + S0 = 1, + S1 = case erlang:system_info(schedulers_online) + > erlang:system_info(logical_processors) of + true -> S0*2; + false -> S0 + end, + S2 = case erlang:system_info(debug_compiled) of + true -> S1*10; + false -> + case erlang:system_info(lock_checking) of + true -> S1*2; + false -> S1 + end + end, + S3 = case lock_counting() of + true -> S2*2; + false -> S2 + end, + S3. + +lock_counting() -> + lock_counting(erlang:system_info(system_version)). + +lock_counting([]) -> + false; +lock_counting([$[,$l,$o,$c,$k,$-,$c,$o,$u,$n,$t,$i,$n,$g,$],_]) -> + true; +lock_counting([_C|Cs]) -> + lock_counting(Cs). + +go_work([], [], [], []) -> + []; +go_work(L, N, [], []) -> + go_work(snd(go_work, L), snd(go_work, N), [], []); +go_work(L, N, H, []) -> + go_work(L, N, snd(go_work, H), []); +go_work(L, N, H, M) -> + go_work(L, N, H, snd(go_work, M)). + +stop_work([], [], [], []) -> + []; +stop_work([], [], [], M) -> + stop_work([], [], [], snd(stop_work, M)); +stop_work([], [], H, M) -> + stop_work([], [], snd(stop_work, H), M); +stop_work(L, N, H, M) -> + stop_work(snd(stop_work, L), snd(stop_work, N), H, M). + +wait_balance(N) when is_integer(N) -> + case erlang:system_info(schedulers_active) of + 1 -> + done; + _ -> + erts_debug:set_internal_state(available_internal_state,true), + Start = erts_debug:get_internal_state(nbalance), + End = (Start + N) band ((1 bsl (8*erlang:system_info(wordsize)))-1), + wait_balance(Start, End), + erts_debug:set_internal_state(available_internal_state,false) + end. + +wait_balance(Start, End) -> + X = erts_debug:get_internal_state(nbalance), + case End =< X of + true -> + case Start =< End of + true -> + done; + false -> + case X < Start of + true -> + done; + false -> + receive after 250 -> ok end, + wait_balance(Start, End) + end + end; + false -> + receive after 250 -> ok end, + wait_balance(Start, End) + end. + +wait_reds(RedsLimit, Timeout) -> + Stop = erlang:start_timer(Timeout, self(), stop), + statistics(reductions), + wait_reds(0, RedsLimit, Stop). + +wait_reds(Reds, RedsLimit, Stop) when Reds < RedsLimit -> + receive + {timeout, Stop, stop} -> + erlang:display(timeout), + erlang:display({reduction_limit, RedsLimit}), + erlang:display({reductions, Reds}), + done + after 10000 -> + {_, NewReds} = statistics(reductions), + wait_reds(NewReds+Reds, RedsLimit, Stop) + end; +wait_reds(Reds, RedsLimit, Stop) when is_reference(Stop) -> + erlang:cancel_timer(Stop), + receive {timeout, Stop, stop} -> ok after 0 -> ok end, + wait_reds(Reds, RedsLimit, false); +wait_reds(Reds, RedsLimit, _Stop) -> + erlang:display({reduction_limit, RedsLimit}), + erlang:display({reductions, Reds}), + done. + +do_it(Tracer, Low, Normal, High, Max) -> + do_it(Tracer, Low, Normal, High, Max, ?DEFAULT_TEST_REDS_PER_SCHED). + +do_it(Tracer, Low, Normal, High, Max, RedsPerSchedLimit) -> + OldPrio = process_flag(priority, max), + go_work(Low, Normal, High, Max), + StartWait = now(), + %% Give the emulator a chance to balance the load... + wait_balance(5), + EndWait = now(), + BalanceWait = timer:now_diff(EndWait,StartWait) div 1000, + erlang:display({balance_wait, BalanceWait}), + Timeout = ?DEFAULT_TIMEOUT - ?t:seconds(10) - BalanceWait, + Res = case Timeout < ?MIN_SCHEDULER_TEST_TIMEOUT of + true -> + stop_work(Low, Normal, High, Max), + too_slow; + false -> + set_tracing(true, Tracer, normal, Normal), + set_tracing(true, Tracer, low, Low), + set_tracing(true, Tracer, high, High), + set_tracing(true, Tracer, max, Max), + wait_reds(RedsPerSchedLimit + * erlang:system_info(schedulers_online), + Timeout), + set_tracing(false, Tracer, normal, Normal), + set_tracing(false, Tracer, low, Low), + set_tracing(false, Tracer, high, High), + set_tracing(false, Tracer, max, Max), + stop_work(Low, Normal, High, Max), + get_trace_result(Tracer) + end, + process_flag(priority, OldPrio), + Res. + +workers_exit([]) -> + ok; +workers_exit([P|Ps]) when is_pid(P) -> + Mon = erlang:monitor(process, P), + unlink(P), + exit(P, kill), + workers_exit(Ps), + receive {'DOWN', Mon, process, P, _} -> ok end, + ok; +workers_exit([[]]) -> + ok; +workers_exit([Ps|Pss]) -> + workers_exit(Ps), + workers_exit(Pss). + +do_work(PartTime) -> + lists:reverse(lists:seq(1, 50)), + receive stop_work -> receive after infinity -> ok end after 0 -> ok end, + case PartTime of + true -> receive after 1 -> ok end; + false -> ok + end, + do_work(PartTime). + +workers(N, _Prio, _PartTime) when N =< 0 -> + []; +workers(N, Prio, PartTime) -> + Parent = self(), + W = spawn_opt(fun () -> + Parent ! {ready, self()}, + receive + go_work -> + do_work(PartTime) + end + end, + [{priority, Prio}, link]), + Ws = workers(N-1, Prio, PartTime), + receive {ready, W} -> ok end, + [W|Ws]. + +workers(N, Prio) -> + workers(N, Prio, false). + +part_time_workers(N, Prio) -> + workers(N, Prio, true). + +tracer(Low, Normal, High, Max) -> + receive + {tracees, Prio, Tracees} -> + save_tracees(Prio, Tracees), + case Prio of + low -> tracer(Tracees++Low, Normal, High, Max); + normal -> tracer(Low, Tracees++Normal, High, Max); + high -> tracer(Low, Normal, Tracees++High, Max); + max -> tracer(Low, Normal, High, Tracees++Max) + end; + {get_result, Ref, Who} -> + Delivered = erlang:trace_delivered(all), + receive + {trace_delivered, all, Delivered} -> + ok + end, + {Lc, Nc, Hc, Mc} = read_trace(), + GetMinMax + = fun (Prio, Procs) -> + LargeNum = 1 bsl 64, + case lists:foldl(fun (P, {Mn, Mx} = MnMx) -> + {Prio, C} = get(P), + case C < Mn of + true -> + case C > Mx of + true -> + {C, C}; + false -> + {C, Mx} + end; + false -> + case C > Mx of + true -> {Mn, C}; + false -> MnMx + end + end + end, + {LargeNum, 0}, + Procs) of + {LargeNum, 0} -> {0, 0}; + Res -> Res + end + end, + {Lmin, Lmax} = GetMinMax(low, Low), + {Nmin, Nmax} = GetMinMax(normal, Normal), + {Hmin, Hmax} = GetMinMax(high, High), + {Mmin, Mmax} = GetMinMax(max, Max), + Who ! {trace_result, Ref, [{low, Lc, Lmin, Lmax}, + {normal, Nc, Nmin, Nmax}, + {high, Hc, Hmin, Hmax}, + {max, Mc, Mmin, Mmax}]} + end. + +read_trace() -> + read_trace(0,0,0,0). + +read_trace(Low, Normal, High, Max) -> + receive + {trace, Proc, in, _} -> + {Prio, Count} = get(Proc), + put(Proc, {Prio, Count+1}), + case Prio of + low -> read_trace(Low+1, Normal, High, Max); + normal -> read_trace(Low, Normal+1, High, Max); + high -> read_trace(Low, Normal, High+1, Max); + max -> read_trace(Low, Normal, High, Max+1) + end; + {trace, _Proc, out, _} -> + read_trace(Low, Normal, High, Max) + after 0 -> + {Low, Normal, High, Max} + end. + +save_tracees(_Prio, []) -> + ok; +save_tracees(Prio, [T|Ts]) -> + put(T, {Prio, 0}), + save_tracees(Prio, Ts). + +start_tracer() -> + Tracer = spawn_link(fun () -> tracer([], [], [], []) end), + true = erlang:suspend_process(Tracer), + Tracer. + +get_trace_result(Tracer) -> + erlang:resume_process(Tracer), + Ref = make_ref(), + Tracer ! {get_result, Ref, self()}, + receive + {trace_result, Ref, Res} -> + Res + end. + + +set_tracing(_On, _Tracer, _Prio, []) -> + ok; +set_tracing(true, Tracer, Prio, Pids) -> + Tracer ! {tracees, Prio, Pids}, + set_tracing(true, Tracer, Pids); +set_tracing(false, Tracer, _Prio, Pids) -> + set_tracing(false, Tracer, Pids). + +set_tracing(_On, _Tracer, []) -> + ok; +set_tracing(On, Tracer, [Pid|Pids]) -> + 1 = erlang:trace(Pid, On, [running, {tracer, Tracer}]), + set_tracing(On, Tracer, Pids). + +active_schedulers() -> + case erlang:system_info(schedulers_online) of + 1 -> + 1; + N -> + case erlang:system_info(multi_scheduling) of + blocked -> 1; + enabled -> N + end + end. + +start_node(Config) -> + start_node(Config, ""). + +start_node(Config, Args) when is_list(Config) -> + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line {A, B, C} = now(), + ?line Name = list_to_atom(atom_to_list(?MODULE) + ++ "-" + ++ atom_to_list(?config(testcase, Config)) + ++ "-" + ++ integer_to_list(A) + ++ "-" + ++ integer_to_list(B) + ++ "-" + ++ integer_to_list(C)), + ?line ?t:start_node(Name, slave, [{args, "-pa "++Pa++" "++Args}]). + +stop_node(Node) -> + ?t:stop_node(Node). + + +enable_internal_state() -> + case catch erts_debug:get_internal_state(available_internal_state) of + true -> true; + _ -> erts_debug:set_internal_state(available_internal_state, true) + end. + +cmp(X, X) -> + ok; +cmp(X, Y) -> + ?t:format("cmp failed:~n X=~p~n Y=~p~n", [X,Y]), + cmp_aux(X, Y). + + +cmp_aux([X0|Y0], [X1|Y1]) -> + cmp_aux(X0, X1), + cmp_aux(Y0, Y1); +cmp_aux(T0, T1) when is_tuple(T0), is_tuple(T1), size(T0) == size(T1) -> + cmp_tuple(T0, T1, 1, size(T0)); +cmp_aux(X, X) -> + ok; +cmp_aux(F0, F1) -> + ?t:fail({no_match, F0, F1}). + +cmp_tuple(_T0, _T1, N, Sz) when N > Sz -> + ok; +cmp_tuple(T0, T1, N, Sz) -> + cmp_aux(element(N, T0), element(N, T1)), + cmp_tuple(T0, T1, N+1, Sz). Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/erts/emulator/test/send_term_SUITE_data/ext_terms.bin and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/erts/emulator/test/send_term_SUITE_data/ext_terms.bin differ diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/send_term_SUITE_data/ext_terms.h erlang-13.b.3-dfsg/erts/emulator/test/send_term_SUITE_data/ext_terms.h --- erlang-13.b.1-dfsg/erts/emulator/test/send_term_SUITE_data/ext_terms.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/send_term_SUITE_data/ext_terms.h 2007-11-26 19:01:51.000000000 +0000 @@ -0,0 +1,110 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson AB. + * Portions created by Ericsson are Copyright 2007, Ericsson AB. + * All Rights Reserved.'' + * + * $Id$ + */ + +/* + * Do not modify this file. This file and ext_terms.bin were + * automatically generated by send_term_SUITE:generate_external_terms_files/1 + * and needs to be consistent with each other. + */ +#ifndef EXT_TERMS_H__ +#define EXT_TERMS_H__ +static struct { + unsigned char ext[162]; + int ext_size; + unsigned char cext[162]; + int cext_size; +} ext_terms[] = { + {{131,104,3,98,0,0,18,103,98,255,255,237,153,108,0,0,0,2,100,0,7,97,110,95,97,116,111,109,107,0,6,97,32,108,105,115,116,106}, + 38, + {131,104,3,98,0,0,18,103,98,255,255,237,153,108,0,0,0,2,100,0,7,97,110,95,97,116,111,109,107,0,6,97,32,108,105,115,116,106}, + 38}, + {{131,108,0,0,0,4,110,9,0,0,0,160,222,197,173,201,53,54,110,7,1,199,113,21,183,140,242,3,107,0,6,98,108,117,112,112,33,100,0,5,98,108,105,112,112,106}, + 46, + {131,108,0,0,0,4,110,9,0,0,0,160,222,197,173,201,53,54,110,7,1,199,113,21,183,140,242,3,107,0,6,98,108,117,112,112,33,100,0,5,98,108,105,112,112,106}, + 46}, + {{131,104,5,103,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,0,0,0,38,0,0,0,0,3,104,2,114,0,3,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,40,0,0,0,0,0,0,0,0,102,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,0,0,0,1,3,103,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,0,0,0,37,0,0,0,0,3,102,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,0,0,0,1,3,114,0,3,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,59,0,0,0,0,0,0,0,0}, + 162, + {131,80,0,0,0,161,120,156,203,96,77,79,97,224,77,140,207,203,79,73,117,72,207,47,74,74,76,103,96,96,80,3,98,6,230,12,166,34,6,102,116,89,102,160,140,6,3,20,164,97,209,203,200,12,52,145,39,17,85,80,21,108,96,26,166,4,35,51,216,14,20,97,144,21,214,48,43,0,1,209,36,52}, + 82}, + {{131,104,5,104,0,106,106,112,0,0,0,79,0,21,87,190,182,1,38,106,214,65,228,1,52,27,227,2,212,0,0,0,1,0,0,0,0,100,0,15,115,101,110,100,95,116,101,114,109,95,83,85,73,84,69,97,1,98,0,184,11,180,103,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,0,0,0,37,0,0,0,0,3,109,0,0,0,31,104,101,106,32,104,111,112,112,32,116,114,97,108,108,97,108,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97}, + 123, + {131,80,0,0,0,122,120,156,203,96,205,96,200,202,42,96,96,96,240,103,16,13,223,183,141,81,45,235,154,227,19,70,19,233,199,76,87,128,130,140,64,204,144,194,192,95,156,154,151,18,95,146,90,148,27,31,28,234,25,226,154,200,152,196,176,131,123,75,122,10,3,79,98,94,126,74,170,67,122,126,81,82,98,58,80,173,42,72,3,115,46,144,144,207,72,205,82,200,200,47,40,80,40,41,74,204,201,73,204,73,68,5,0,18,237,35,68}, + 117}, + {{131,108,0,0,0,4,110,10,0,28,199,113,166,118,185,145,86,105,9,110,5,1,28,103,24,89,10,107,0,2,98,33,100,0,10,98,108,105,112,112,112,112,112,112,112,106}, + 46, + {131,108,0,0,0,4,110,10,0,28,199,113,166,118,185,145,86,105,9,110,5,1,28,103,24,89,10,107,0,2,98,33,100,0,10,98,108,105,112,112,112,112,112,112,112,106}, + 46}, + {{131,104,5,98,0,0,18,103,103,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,0,0,0,38,0,0,0,0,3,104,2,114,0,3,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,40,0,0,0,0,0,0,0,0,102,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,0,0,0,1,3,98,255,255,237,153,108,0,0,0,2,100,0,7,97,110,95,97,116,111,109,107,0,6,97,32,108,105,115,116,106}, + 120, + {131,80,0,0,0,119,120,156,203,96,77,98,96,16,74,79,79,97,224,77,140,207,203,79,73,117,72,207,47,74,74,76,103,96,96,80,3,98,6,230,12,166,34,6,102,116,89,102,160,140,6,3,20,164,97,209,203,200,156,244,255,255,219,153,57,64,38,83,10,3,123,98,94,124,98,73,126,110,54,3,91,162,66,78,102,113,73,22,0,167,192,30,158}, + 93}, + {{131,104,4,103,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,0,0,0,38,0,0,0,0,3,104,2,114,0,3,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,40,0,0,0,0,0,0,0,0,102,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,0,0,0,1,3,103,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,0,0,0,0,0,0,0,0,3,102,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,0,0,0,1,3}, + 131, + {131,80,0,0,0,130,120,156,203,96,73,79,97,224,77,140,207,203,79,73,117,72,207,47,74,74,76,103,96,96,80,3,98,6,230,12,166,34,6,102,116,89,102,160,140,6,3,20,164,97,209,203,200,12,52,145,39,17,85,16,12,152,211,48,37,24,153,1,215,214,30,50}, + 72}, + {{131,104,3,98,0,0,18,103,98,255,255,237,153,108,0,0,0,2,100,0,7,97,110,95,97,116,111,109,107,0,6,97,32,108,105,115,116,106}, + 38, + {131,104,3,98,0,0,18,103,98,255,255,237,153,108,0,0,0,2,100,0,7,97,110,95,97,116,111,109,107,0,6,97,32,108,105,115,116,106}, + 38}, + {{131,104,3,98,0,0,18,103,98,255,255,237,153,108,0,0,0,2,100,0,4,97,116,111,109,107,0,4,108,105,115,116,106}, + 33, + {131,104,3,98,0,0,18,103,98,255,255,237,153,108,0,0,0,2,100,0,4,97,116,111,109,107,0,4,108,105,115,116,106}, + 33}, + {{131,104,4,103,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,0,0,0,38,0,0,0,0,3,104,2,114,0,3,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,40,0,0,0,0,0,0,0,0,102,100,0,13,97,95,110,111,100,101,64,103,111,114,98,97,103,0,0,0,1,3,103,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,0,0,0,0,0,0,0,0,3,102,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,0,0,0,1,3}, + 131, + {131,80,0,0,0,130,120,156,203,96,73,79,97,224,77,140,207,203,79,73,117,72,207,47,74,74,76,103,96,96,80,3,98,6,230,12,166,34,6,102,116,89,102,160,140,6,3,20,164,97,209,203,200,12,52,145,39,17,85,16,12,152,211,48,37,24,153,1,215,214,30,50}, + 72}, + {{131,104,4,110,8,0,28,199,17,175,172,214,173,61,98,255,255,82,100,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,0,114,0,3,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,60,0,0,0,0,0,0,0,0}, + 74, + {131,80,0,0,0,73,120,156,203,96,201,227,96,144,57,46,184,126,205,181,181,182,73,255,255,7,165,100,48,98,133,12,69,12,204,41,12,60,137,121,249,41,169,14,233,249,69,73,137,233,204,12,12,12,54,12,80,0,0,73,17,18,208}, + 63}, + {{131,104,4,110,9,0,28,199,241,98,116,219,231,23,24,98,255,255,82,100,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,107,0,1,1,106,106,106,106,106,106,106,106,106,106,114,0,3,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,61,0,0,0,0,0,0,0,0}, + 115, + {131,80,0,0,0,114,120,156,203,96,201,227,100,144,57,254,49,169,228,246,115,113,137,164,255,255,131,82,114,24,24,24,24,73,34,178,25,24,25,179,224,160,136,129,57,133,129,39,49,47,63,37,213,33,61,191,40,41,49,157,25,168,200,150,1,10,0,208,188,23,70}, + 71}, + {{131,104,4,110,8,0,28,199,129,17,222,251,42,6,98,255,255,82,100,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,97,2,114,0,3,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,62,0,0,0,0,0,0,0,0}, + 76, + {131,80,0,0,0,75,120,156,203,96,201,227,96,144,57,222,40,120,239,183,22,91,210,255,255,65,41,25,140,216,97,34,83,17,3,115,10,3,79,98,94,126,74,170,67,122,126,81,82,98,58,51,3,3,131,29,3,20,0,0,76,82,18,165}, + 64}, + {{131,104,4,110,9,0,28,199,113,221,139,146,14,239,240,98,255,255,82,100,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,97,3,114,0,3,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,63,0,0,0,0,0,0,0,0}, + 77, + {131,80,0,0,0,76,120,156,203,96,201,227,100,144,57,94,120,183,123,18,223,251,15,73,255,255,7,165,100,48,98,135,137,204,69,12,204,41,12,60,137,121,249,41,169,14,233,249,69,73,137,233,204,12,12,12,246,12,80,0,0,192,110,20,101}, + 65}, + {{131,104,4,110,9,0,28,199,177,214,190,98,202,104,2,98,255,255,82,100,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,97,4,114,0,3,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,64,0,0,0,0,0,0,0,0}, + 77, + {131,80,0,0,0,76,120,156,203,96,201,227,100,144,57,190,241,218,190,164,83,25,76,73,255,255,7,165,100,48,98,135,137,44,69,12,204,41,12,60,137,121,249,41,169,14,233,249,69,73,137,233,204,12,12,12,14,12,80,0,0,164,94,19,234}, + 65}, + {{131,104,4,110,7,0,28,199,85,220,50,202,15,98,255,255,82,100,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,108,0,0,0,1,107,0,1,5,106,106,106,106,106,106,106,106,106,106,114,0,3,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,65,0,0,0,0,0,0,0,0}, + 113, + {131,80,0,0,0,112,120,156,203,96,201,99,103,144,57,30,122,199,232,20,127,210,255,255,65,41,57,12,12,12,140,36,17,217,12,140,172,89,112,80,196,192,156,194,192,147,152,151,159,146,234,144,158,95,148,148,152,206,12,84,228,200,0,5,0,46,116,21,208}, + 69}, + {{131,104,4,110,9,0,28,199,241,98,116,219,231,23,24,98,255,255,82,100,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,97,6,114,0,3,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,66,0,0,0,0,0,0,0,0}, + 77, + {131,80,0,0,0,76,120,156,203,96,201,227,100,144,57,254,49,169,228,246,115,113,137,164,255,255,131,82,50,24,177,195,68,182,34,6,230,20,6,158,196,188,252,148,84,135,244,252,162,164,196,116,102,6,6,6,39,6,40,0,0,155,123,19,203}, + 65}, + {{131,104,4,110,7,0,28,199,59,73,56,148,1,98,255,255,82,100,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,97,7,114,0,3,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,67,0,0,0,0,0,0,0,0}, + 75, + {131,80,0,0,0,74,120,156,203,96,201,99,103,144,57,110,237,105,49,133,49,233,255,255,160,148,12,70,236,48,145,189,136,129,57,133,129,39,49,47,63,37,213,33,61,191,40,41,49,157,153,129,129,193,153,1,10,0,245,21,17,100}, + 62}, + {{131,104,4,110,8,0,28,199,17,175,172,214,173,61,98,255,255,82,100,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,97,8,114,0,3,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,3,0,0,0,68,0,0,0,0,0,0,0,0}, + 76, + {131,80,0,0,0,75,120,156,203,96,201,227,96,144,57,46,184,126,205,181,181,182,73,255,255,7,165,100,48,98,135,137,28,69,12,204,41,12,60,137,121,249,41,169,14,233,249,69,73,137,233,204,12,12,12,46,12,80,0,0,112,226,19,66}, + 64} +}; +#define NO_OF_EXT_TERMS 19 +#endif diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/send_term_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/send_term_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/send_term_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/send_term_SUITE_data/Makefile.src 2006-05-03 09:11:43.000000000 +0100 @@ -0,0 +1,3 @@ +all: send_term_drv@dll@ + +@SHLIB_RULES@ diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/send_term_SUITE_data/send_term_drv.c erlang-13.b.3-dfsg/erts/emulator/test/send_term_SUITE_data/send_term_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/send_term_SUITE_data/send_term_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/send_term_SUITE_data/send_term_drv.c 2009-11-20 13:32:09.000000000 +0000 @@ -0,0 +1,718 @@ +/* ``The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved via the world wide web at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * The Initial Developer of the Original Code is Ericsson Utvecklings AB. + * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings + * AB. All Rights Reserved.'' + * + * $Id$ + */ + +#include "erl_driver.h" +#include +#include + +static ErlDrvPort erlang_port; +static ErlDrvData send_term_drv_start(ErlDrvPort port, char *command); +static void send_term_drv_stop(ErlDrvData drv_data); +static void send_term_drv_run(ErlDrvData drv_data, char *buf, int len); + + +static int make_ext_term_list(ErlDrvTermData *td, int bad); + +#define FAIL_TERM(M, L) fail_term((M), (L), __LINE__) + +static ErlDrvEntry send_term_drv_entry = { + NULL, + send_term_drv_start, + send_term_drv_stop, + send_term_drv_run, + NULL, + NULL, + "send_term_drv", +}; + +DRIVER_INIT(send_term_drv) +{ + erlang_port = (ErlDrvPort)-1; + return &send_term_drv_entry; +} + +static ErlDrvData send_term_drv_start(ErlDrvPort port, char *buf) +{ + if (erlang_port != (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + + erlang_port = port; + return (ErlDrvData)port; +} + +static void send_term_drv_stop(ErlDrvData drv_data) +{ +} + +static void output_term(ErlDrvTermData* msg, int len); +static void fail_term(ErlDrvTermData* msg, int len, int line); + +static void send_term_drv_run(ErlDrvData port, char *buf, int count) +{ + ErlDrvTermData msg[1024]; + + switch (*buf) { + case 0: + msg[0] = ERL_DRV_NIL; + output_term(msg, 1); + break; + + case 1: /* Most term types inside a tuple. */ + { + double f = 3.1416; + + msg[0] = ERL_DRV_ATOM; + msg[1] = driver_mk_atom("blurf"), + msg[2] = ERL_DRV_INT; + msg[3] = (ErlDrvTermData) 42; + msg[4] = ERL_DRV_NIL; + msg[5] = ERL_DRV_INT; + msg[6] = (ErlDrvTermData) -42; + msg[7] = ERL_DRV_TUPLE; + msg[8] = (ErlDrvTermData) 0; + msg[9] = ERL_DRV_PORT; + msg[10] = driver_mk_port(erlang_port); + msg[11] = ERL_DRV_STRING_CONS; + msg[12] = (ErlDrvTermData) "abc"; + msg[13] = (ErlDrvTermData) 3; + msg[14] = ERL_DRV_LIST; + msg[15] = (ErlDrvTermData) 3; + msg[16] = ERL_DRV_STRING; + msg[17] = (ErlDrvTermData) "kalle"; + msg[18] = (ErlDrvTermData) 5; + msg[19] = ERL_DRV_FLOAT; + msg[20] = (ErlDrvTermData) &f; + msg[21] = ERL_DRV_PID; + msg[22] = driver_connected(erlang_port); + msg[23] = ERL_DRV_TUPLE; + msg[24] = (ErlDrvTermData) 7; + output_term(msg, 25); + } + break; + + case 2: /* Deep stack */ + { + int i; + + for (i = 0; i < 400; i += 2) { + msg[i] = ERL_DRV_INT; + msg[i+1] = (ErlDrvTermData) (i / 2); + } + msg[i] = ERL_DRV_NIL; + msg[i+1] = ERL_DRV_LIST; + msg[i+2] = (ErlDrvTermData) 201; + output_term(msg, i+3); + } + break; + + case 3: /* Binaries */ + { + ErlDrvBinary* bin; + int i; + + bin = driver_alloc_binary(256); + for (i = 0; i < 256; i++) { + bin->orig_bytes[i] = i; + } + msg[0] = ERL_DRV_BINARY; + msg[1] = (ErlDrvTermData) bin; + msg[2] = (ErlDrvTermData) 256; + msg[3] = (ErlDrvTermData) 0; + msg[4] = ERL_DRV_BINARY; + msg[5] = (ErlDrvTermData) bin; + msg[6] = (ErlDrvTermData) 256-23-17; + msg[7] = (ErlDrvTermData) 23; + msg[8] = ERL_DRV_TUPLE; + msg[9] = (ErlDrvTermData) 2; + output_term(msg, 10); + driver_free_binary(bin); + } + break; + + case 4: /* Pids */ + msg[0] = ERL_DRV_PID; + msg[1] = driver_connected(erlang_port); + msg[2] = ERL_DRV_PID; + msg[3] = driver_caller(erlang_port); + msg[4] = ERL_DRV_TUPLE; + msg[5] = (ErlDrvTermData) 2; + output_term(msg, 6); + break; + + case 5: + output_term(msg, make_ext_term_list(msg, 0)); + break; + + case 6: + msg[0] = ERL_DRV_INT; + msg[1] = ~((ErlDrvTermData) 0); + msg[2] = ERL_DRV_UINT; + msg[3] = ~((ErlDrvTermData) 0); + msg[4] = ERL_DRV_TUPLE; + msg[5] = (ErlDrvTermData) 2; + output_term(msg, 6); + break; + + case 7: { + int len = 0; + char buf[1024]; + memset(buf, 17, sizeof(buf)); + /* empty heap binary */ + msg[len++] = ERL_DRV_BUF2BINARY; + msg[len++] = (ErlDrvTermData) NULL; /* NULL is ok if size == 0 */ + msg[len++] = (ErlDrvTermData) 0; + /* empty heap binary again */ + msg[len++] = ERL_DRV_BUF2BINARY; + msg[len++] = (ErlDrvTermData) &buf[0]; /* ptr is ok if size == 0 */ + msg[len++] = (ErlDrvTermData) 0; + /* heap binary */ + msg[len++] = ERL_DRV_BUF2BINARY; + msg[len++] = (ErlDrvTermData) &buf[0]; + msg[len++] = (ErlDrvTermData) 17; + /* off heap binary */ + msg[len++] = ERL_DRV_BUF2BINARY; + msg[len++] = (ErlDrvTermData) &buf[0]; + msg[len++] = (ErlDrvTermData) sizeof(buf); + + msg[len++] = ERL_DRV_TUPLE; + msg[len++] = (ErlDrvTermData) 4; + + output_term(msg, len); + break; + } + + case 8: + msg[0] = ERL_DRV_NIL; + output_term(msg, 1); + break; + + case 9: + msg[0] = ERL_DRV_ATOM; + msg[1] = (ErlDrvTermData) driver_mk_atom(""); + output_term(msg, 2); + break; + + case 10: + msg[0] = ERL_DRV_ATOM; + msg[1] = (ErlDrvTermData) driver_mk_atom("an_atom"); + output_term(msg, 2); + break; + + case 11: + msg[0] = ERL_DRV_INT; + msg[1] = (ErlDrvTermData) -4711; + output_term(msg, 2); + break; + + case 12: + msg[0] = ERL_DRV_UINT; + msg[1] = (ErlDrvTermData) 4711; + output_term(msg, 2); + + break; + case 13: + msg[0] = ERL_DRV_PORT; + msg[1] = driver_mk_port(erlang_port); + output_term(msg, 2); + break; + + case 14: { + ErlDrvBinary *dbin = driver_alloc_binary(0); + msg[0] = ERL_DRV_BINARY; + msg[1] = (ErlDrvTermData) dbin; + msg[2] = (ErlDrvTermData) 0; + msg[3] = (ErlDrvTermData) 0; + output_term(msg, 4); + driver_free_binary(dbin); + break; + } + + case 15: { + char buf[] = "hejsan"; + ErlDrvBinary *dbin = driver_alloc_binary(sizeof(buf)-1); + if (dbin) + memcpy((void *) dbin->orig_bytes, (void *) buf, sizeof(buf)-1); + msg[0] = ERL_DRV_BINARY; + msg[1] = (ErlDrvTermData) dbin; + msg[2] = (ErlDrvTermData) (dbin ? sizeof(buf)-1 : 0); + msg[3] = (ErlDrvTermData) 0; + output_term(msg, 4); + driver_free_binary(dbin); + break; + } + + case 16: + msg[0] = ERL_DRV_BUF2BINARY; + msg[1] = (ErlDrvTermData) NULL; + msg[2] = (ErlDrvTermData) 0; + output_term(msg, 3); + break; + + case 17: { + char buf[] = ""; + msg[0] = ERL_DRV_BUF2BINARY; + msg[1] = (ErlDrvTermData) buf; + msg[2] = (ErlDrvTermData) sizeof(buf)-1; + output_term(msg, 3); + break; + } + + case 18: { + char buf[] = "hoppsan"; + msg[0] = ERL_DRV_BUF2BINARY; + msg[1] = (ErlDrvTermData) buf; + msg[2] = (ErlDrvTermData) sizeof(buf)-1; + output_term(msg, 3); + break; + } + + case 19: + msg[0] = ERL_DRV_STRING; + msg[1] = (ErlDrvTermData) buf; + msg[2] = (ErlDrvTermData) 0; + output_term(msg, 3); + break; + + case 20: { + char buf[] = ""; + msg[0] = ERL_DRV_STRING; + msg[1] = (ErlDrvTermData) buf; + msg[2] = (ErlDrvTermData) sizeof(buf)-1; + output_term(msg, 3); + break; + } + + case 21: { + char buf[] = "hippsan"; + msg[0] = ERL_DRV_STRING; + msg[1] = (ErlDrvTermData) buf; + msg[2] = (ErlDrvTermData) sizeof(buf)-1; + output_term(msg, 3); + break; + } + + case 22: + msg[0] = ERL_DRV_TUPLE; + msg[1] = (ErlDrvTermData) 0; + output_term(msg, 2); + break; + + case 23: + msg[0] = ERL_DRV_NIL; + msg[1] = ERL_DRV_LIST; + msg[2] = (ErlDrvTermData) 1; + output_term(msg, 3); + break; + + case 24: + msg[0] = ERL_DRV_PID; + msg[1] = driver_connected(erlang_port); + output_term(msg, 2); + break; + + case 25: + msg[0] = ERL_DRV_NIL; + msg[1] = ERL_DRV_STRING_CONS; + msg[2] = (ErlDrvTermData) ""; + msg[3] = (ErlDrvTermData) 0; + output_term(msg, 4); + break; + + case 26: { + double my_float = 0.0; + msg[0] = ERL_DRV_FLOAT; + msg[1] = (ErlDrvTermData) &my_float; + output_term(msg, 2); + break; + } + + case 27: { + char buf[] = {131, 106}; /* [] */ + msg[0] = ERL_DRV_EXT2TERM; + msg[1] = (ErlDrvTermData) buf; + msg[2] = (ErlDrvTermData) sizeof(buf); + output_term(msg, 3); + break; + } + + case 28: { + ErlDrvUInt64 x = ~((ErlDrvUInt64) 0); + msg[0] = ERL_DRV_UINT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 29: { + ErlDrvUInt64 x = ((ErlDrvUInt64) 4711) << 32; + msg[0] = ERL_DRV_UINT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 30: { + ErlDrvUInt64 x = 4711; + msg[0] = ERL_DRV_UINT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 31: { + ErlDrvUInt64 x = 0; + msg[0] = ERL_DRV_UINT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 32: { + ErlDrvSInt64 x = ((((ErlDrvUInt64) 0x7fffffff) << 32) + | ((ErlDrvUInt64) 0xffffffff)); + msg[0] = ERL_DRV_INT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 33: { + ErlDrvSInt64 x = (ErlDrvSInt64) (((ErlDrvUInt64) 4711) << 32); + msg[0] = ERL_DRV_INT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 34: { + ErlDrvSInt64 x = 4711; + msg[0] = ERL_DRV_INT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 35: { + ErlDrvSInt64 x = 0; + msg[0] = ERL_DRV_INT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 36: { + ErlDrvSInt64 x = -1; + msg[0] = ERL_DRV_INT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 37: { + ErlDrvSInt64 x = -4711; + msg[0] = ERL_DRV_INT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 38: { + ErlDrvSInt64 x = ((ErlDrvSInt64) ((ErlDrvUInt64) 4711) << 32)*-1; + msg[0] = ERL_DRV_INT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + case 39: { + ErlDrvSInt64 x = ((ErlDrvSInt64) 1) << 63; + msg[0] = ERL_DRV_INT64; + msg[1] = (ErlDrvTermData) &x; + output_term(msg, 2); + + break; + } + + + case 127: /* Error cases */ + { + long refc; + ErlDrvBinary* bin = driver_alloc_binary(256); + + FAIL_TERM(msg, 0); + + msg[0] = ERL_DRV_LIST; + msg[1] = (ErlDrvTermData) 0; + FAIL_TERM(msg, 2); + + /* Not an atom */ + msg[0] = ERL_DRV_ATOM; + msg[1] = (ErlDrvTermData) driver_connected(erlang_port); + FAIL_TERM(msg, 2); + msg[0] = ERL_DRV_ATOM; + msg[1] = driver_term_nil; + FAIL_TERM(msg, 2); + + /* Not a pid */ + msg[0] = ERL_DRV_PID; + msg[1] = (ErlDrvTermData) driver_mk_atom("blurf"); + FAIL_TERM(msg, 2); + msg[0] = ERL_DRV_PID; + msg[1] = driver_term_nil; + FAIL_TERM(msg, 2); + + /* Not a port */ + msg[0] = ERL_DRV_PORT; + msg[1] = (ErlDrvTermData) driver_mk_atom("blurf"); + FAIL_TERM(msg, 2); + msg[0] = ERL_DRV_PORT; + msg[1] = driver_term_nil; + FAIL_TERM(msg, 2); + + /* Missing parameter on stack */ + msg[0] = ERL_DRV_STRING_CONS; + msg[1] = (ErlDrvTermData) "abc"; + msg[2] = (ErlDrvTermData) 3; + FAIL_TERM(msg, 3); + + /* + * The first binary reference is correct, the second is incorrect. + * There should not be any "binary leak". + */ + msg[0] = ERL_DRV_BINARY; + msg[1] = (ErlDrvTermData) bin; + msg[2] = (ErlDrvTermData) 256; + msg[3] = (ErlDrvTermData) 0; + msg[4] = ERL_DRV_BINARY; + msg[5] = (ErlDrvTermData) bin; + msg[6] = (ErlDrvTermData) 257; + msg[7] = (ErlDrvTermData) 0; + msg[8] = ERL_DRV_TUPLE; + msg[9] = (ErlDrvTermData) 2; + FAIL_TERM(msg, 10); + + msg[0] = ERL_DRV_BINARY; + msg[1] = (ErlDrvTermData) bin; + msg[2] = (ErlDrvTermData) 256; + msg[3] = (ErlDrvTermData) 0; + msg[4] = ERL_DRV_BINARY; + msg[5] = (ErlDrvTermData) bin; + msg[6] = (ErlDrvTermData) 256; + msg[7] = (ErlDrvTermData) 50; + msg[8] = ERL_DRV_TUPLE; + msg[9] = (ErlDrvTermData) 2; + FAIL_TERM(msg, 10); + + /* + * We have succefully built two binaries. We expect the ref count + * to be 1 (SMP) or 3 (non-SMP). + */ + refc = driver_binary_get_refc(bin); + if (refc > 3) { + char sbuf[128]; + sprintf(sbuf, "bad_refc:%d", refc); + driver_failure_atom(erlang_port, sbuf); + } + driver_free_binary(bin); + + + FAIL_TERM(msg, make_ext_term_list(msg, 1)); + + + /* + * Check that we fail for missing args. + * + * We setup valid terms but pass a too small size. We + * want valid terms since we want to verify that the + * failure really is due to the small size. + */ + msg[0] = ERL_DRV_ATOM; + msg[1] = (ErlDrvTermData) driver_mk_atom("an_atom"); + FAIL_TERM(msg, 1); + + msg[0] = ERL_DRV_INT; + msg[1] = (ErlDrvTermData) -4711; + FAIL_TERM(msg, 1); + + msg[0] = ERL_DRV_UINT; + msg[1] = (ErlDrvTermData) 4711; + FAIL_TERM(msg, 1); + + msg[0] = ERL_DRV_PORT; + msg[1] = driver_mk_port(erlang_port); + FAIL_TERM(msg, 1); + + { + char buf[] = "hejsan"; + ErlDrvBinary *dbin = driver_alloc_binary(sizeof(buf)-1); + if (!dbin) + driver_failure_posix(erlang_port, ENOMEM); + else { + memcpy((void *) dbin->orig_bytes, (void *) buf, sizeof(buf)-1); + msg[0] = ERL_DRV_BINARY; + msg[1] = (ErlDrvTermData) dbin; + msg[2] = (ErlDrvTermData) sizeof(buf)-1; + msg[3] = (ErlDrvTermData) 0; + FAIL_TERM(msg, 1); + FAIL_TERM(msg, 2); + FAIL_TERM(msg, 3); + driver_free_binary(dbin); + } + } + + { + char buf[] = "hoppsan"; + msg[0] = ERL_DRV_BUF2BINARY; + msg[1] = (ErlDrvTermData) buf; + msg[2] = (ErlDrvTermData) sizeof(buf)-1; + FAIL_TERM(msg, 1); + FAIL_TERM(msg, 2); + } + + { + char buf[] = "hippsan"; + msg[0] = ERL_DRV_STRING; + msg[1] = (ErlDrvTermData) buf; + msg[2] = (ErlDrvTermData) sizeof(buf)-1; + FAIL_TERM(msg, 1); + FAIL_TERM(msg, 2); + } + + msg[0] = ERL_DRV_TUPLE; + msg[1] = (ErlDrvTermData) 0; + FAIL_TERM(msg, 1); + + msg[0] = ERL_DRV_NIL; + msg[1] = ERL_DRV_LIST; + msg[2] = (ErlDrvTermData) 1; + FAIL_TERM(msg, 2); + + msg[0] = ERL_DRV_PID; + msg[1] = driver_connected(erlang_port); + FAIL_TERM(msg, 1); + + msg[0] = ERL_DRV_NIL; + msg[1] = ERL_DRV_STRING_CONS; + msg[2] = (ErlDrvTermData) ""; + msg[3] = (ErlDrvTermData) 0; + FAIL_TERM(msg, 2); + FAIL_TERM(msg, 3); + + { + double my_float = 0.0; + msg[0] = ERL_DRV_FLOAT; + msg[1] = (ErlDrvTermData) &my_float; + FAIL_TERM(msg, 1); + } + + { + char buf[] = {131, 106}; /* [] */ + msg[0] = ERL_DRV_EXT2TERM; + msg[1] = (ErlDrvTermData) buf; + msg[2] = (ErlDrvTermData) sizeof(buf); + FAIL_TERM(msg, 1); + FAIL_TERM(msg, 2); + } + + /* Signal end of test case */ + msg[0] = ERL_DRV_NIL; + driver_output_term(erlang_port, msg, 1); + } + break; + + default: + driver_failure_atom(erlang_port, "bad_request"); + break; + } +} + +static void output_term(ErlDrvTermData* msg, int len) +{ + if (driver_output_term(erlang_port, msg, len) <= 0) { + driver_failure_atom(erlang_port, "driver_output_term_failed"); + } +} + +static void fail_term(ErlDrvTermData* msg, int len, int line) +{ + int status = driver_output_term(erlang_port, msg, len); + + if (status == 1) { + char buf[1024]; + sprintf(buf, "%s:%d: unexpected success", __FILE__, line); + driver_failure_atom(erlang_port, buf); + } else if (status == 0) { + char buf[1024]; + sprintf(buf, "%s:%d: unexpected port error", __FILE__, line); + driver_failure_atom(erlang_port, buf); + } +} + +#include "ext_terms.h" + +/* + * <<131,103,100,0,12,97,110,111,100,101,64,103,111,114,98,97,103,0,0,0,36,0,0,0,0,1>> + * is a valid pid: <0.36.0> + * + * We replace the nodename tag (atom tag: 100) with a pid tag (103) to get an + * invalid pid. + */ +static unsigned char bad_ext_term[] = { + 131,103,103,0,12,97,110,111,100,101,64,103,111,114,98,97,103,0,0,0,36,0,0,0,0,1 + /* ^ + * | + * The bad tag. + */ +}; + +static int make_ext_term_list(ErlDrvTermData *td, int bad) +{ + int tdix = 0; + int i; + for (i = 0; i < NO_OF_EXT_TERMS; i++) { + td[tdix++] = ERL_DRV_EXT2TERM; + td[tdix++] = (ErlDrvTermData) &ext_terms[i].ext[0]; + td[tdix++] = (ErlDrvTermData) ext_terms[i].ext_size; + td[tdix++] = ERL_DRV_EXT2TERM; + td[tdix++] = (ErlDrvTermData) &ext_terms[i].cext[0]; + td[tdix++] = (ErlDrvTermData) ext_terms[i].cext_size; + td[tdix++] = ERL_DRV_TUPLE; + td[tdix++] = (ErlDrvTermData) 2; + } + if (bad) { /* Include a bad ext term */ + td[tdix++] = ERL_DRV_EXT2TERM; + td[tdix++] = (ErlDrvTermData) &bad_ext_term[0]; + td[tdix++] = (ErlDrvTermData) sizeof(bad_ext_term); + } + td[tdix++] = ERL_DRV_NIL; + td[tdix++] = ERL_DRV_LIST; + td[tdix++] = (ErlDrvTermData) (NO_OF_EXT_TERMS + (bad ? 2 : 1)); + return tdix; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/send_term_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/send_term_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/send_term_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/send_term_SUITE.erl 2009-11-20 13:32:08.000000000 +0000 @@ -0,0 +1,354 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(send_term_SUITE). + +-export([all/1,basic/1]). +-export([init_per_testcase/2,fin_per_testcase/2]). + +-export([generate_external_terms_files/1]). + +-include("test_server.hrl"). + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(3)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +all(suite) -> + [basic]. + +basic(Config) when is_list(Config) -> + Drv = "send_term_drv", + ?line P = start_driver(Config, Drv), + + ?line [] = term(P, 0), + ?line Self = self(), + ?line {blurf,42,[],[-42,{}|"abc"++P],"kalle",3.1416,Self} = term(P, 1), + ?line Deep = lists:seq(0, 199), + ?line Deep = term(P, 2), + ?line {B1,B2} = term(P, 3), + ?line B1 = list_to_binary(lists:seq(0, 255)), + ?line B2 = list_to_binary(lists:seq(23, 255-17)), + + %% Pid sending. We need another process. + ?line Child = spawn_link(fun() -> + erlang:port_command(P, [4]) + end), + ?line {Self,Child} = receive_any(), + + %% ERL_DRV_EXT2TERM + ?line ExpectExt2Term = expected_ext2term_drv(?config(data_dir, Config)), + ?line ExpectExt2Term = term(P, 5), + + %% ERL_DRV_INT, ERL_DRV_UINT + ?line case erlang:system_info(wordsize) of + 4 -> + ?line {-1, 4294967295} = term(P, 6); + 8 -> + ?line {-1, 18446744073709551615} = term(P, 6) + end, + + %% ERL_DRV_BUF2BINARY + ?line ExpectedBinTup = {<<>>, + <<>>, + list_to_binary(lists:duplicate(17,17)), + list_to_binary(lists:duplicate(1024,17))}, + ?line ExpectedBinTup = term(P, 7), + + %% single terms + ?line [] = term(P, 8), % ERL_DRV_NIL + ?line '' = term(P, 9), % ERL_DRV_ATOM + ?line an_atom = term(P, 10), % ERL_DRV_ATOM + ?line -4711 = term(P, 11), % ERL_DRV_INT + ?line 4711 = term(P, 12), % ERL_DRV_UINT + ?line P = term(P, 13), % ERL_DRV_PORT + ?line <<>> = term(P, 14), % ERL_DRV_BINARY + ?line <<"hejsan">> = term(P, 15), % ERL_DRV_BINARY + ?line <<>> = term(P, 16), % ERL_DRV_BUF2BINARY + ?line <<>> = term(P, 17), % ERL_DRV_BUF2BINARY + ?line <<"hoppsan">> = term(P, 18), % ERL_DRV_BUF2BINARY + ?line "" = term(P, 19), % ERL_DRV_STRING + ?line "" = term(P, 20), % ERL_DRV_STRING + ?line "hippsan" = term(P, 21), % ERL_DRV_STRING + ?line {} = term(P, 22), % ERL_DRV_TUPLE + ?line [] = term(P, 23), % ERL_DRV_LIST + ?line Self = term(P, 24), % ERL_DRV_PID + ?line [] = term(P, 25), % ERL_DRV_STRING_CONS + ?line AFloat = term(P, 26), % ERL_DRV_FLOAT + ?line true = AFloat < 0.001, + ?line true = AFloat > -0.001, + ?line [] = term(P, 27), % ERL_DRV_EXT2TERM + ?line 18446744073709551615 = term(P, 28), % ERL_DRV_UINT64 + ?line 20233590931456 = term(P, 29), % ERL_DRV_UINT64 + ?line 4711 = term(P, 30), % ERL_DRV_UINT64 + ?line 0 = term(P, 31), % ERL_DRV_UINT64 + ?line 9223372036854775807 = term(P, 32), % ERL_DRV_INT64 + ?line 20233590931456 = term(P, 33), % ERL_DRV_INT64 + ?line 4711 = term(P, 34), % ERL_DRV_INT64 + ?line 0 = term(P, 35), % ERL_DRV_INT64 + ?line -1 = term(P, 36), % ERL_DRV_INT64 + ?line -4711 = term(P, 37), % ERL_DRV_INT64 + ?line -20233590931456 = term(P, 38), % ERL_DRV_INT64 + ?line -9223372036854775808 = term(P, 39), % ERL_DRV_INT64 + + %% Failure cases. + ?line [] = term(P, 127), + ?line receive + Any -> + ?line io:format("Unexpected: ~p\n", [Any]), + ?line ?t:fail() + after 0 -> + ok + end, + + ?line ok = chk_temp_alloc(), + + %% In a private heap system, verify that there are no binaries + %% left for the process. + ?line erlang:garbage_collect(), %Get rid of binaries. + case erlang:system_info(heap_type) of + private -> + ?line {binary,[]} = process_info(self(), binary); + _ -> ok + end, + + ?line stop_driver(P, Drv), + ok. + +term(P, Op) -> + erlang:port_command(P, [Op]), + receive_any(). + +receive_any() -> + receive + Any -> Any + end. + +chk_temp_alloc() -> + case erlang:system_info({allocator,temp_alloc}) of + false -> + %% Temp alloc is not enabled + ?line ok; + TIL -> + %% Verify that we havn't got anything allocated by temp_alloc + lists:foreach( + fun ({instance, _, TI}) -> + ?line {value, {mbcs, MBCInfo}} + = lists:keysearch(mbcs, 1, TI), + ?line {value, {blocks, 0, _, _}} + = lists:keysearch(blocks, 1, MBCInfo), + ?line {value, {sbcs, SBCInfo}} + = lists:keysearch(sbcs, 1, TI), + ?line {value, {blocks, 0, _, _}} + = lists:keysearch(blocks, 1, SBCInfo) + end, + TIL), + ?line ok + end. + + +%% Start/stop drivers. +start_driver(Config, Name) -> + Path = ?config(data_dir, Config), + erl_ddll:start(), + ok = load_driver(Path, Name), + open_port({spawn, Name}, []). + +load_driver(Dir, Driver) -> + case erl_ddll:load_driver(Dir, Driver) of + ok -> ok; + {error, Error} = Res -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + Res + end. + +stop_driver(Port, Name) -> + ?line true = erlang:port_close(Port), + receive + {Port,Message} -> + ?t:fail({strange_message_from_port,Message}) + after 0 -> + ok + end, + + %% Unload the driver. + ok = erl_ddll:unload_driver(Name), + ?line ok = erl_ddll:stop(). + +get_external_terms(DataDir) -> + {ok, Bin} = file:read_file([DataDir, "ext_terms.bin"]), + binary_to_term(Bin). + +expected_ext2term_drv(DataDir) -> + make_expected_ext2term_drv(get_external_terms(DataDir)). + +make_expected_ext2term_drv([]) -> + []; +make_expected_ext2term_drv([T|Ts]) -> + [{T, T} | make_expected_ext2term_drv(Ts)]. + +%% +%% Generation of send_term_SUITE_data/ext_terms.h and +%% send_term_SUITE_data/ext_terms.bin +%% +%% These files should normally not need to be regenerated, +%% but we may want that if we introduce new types or make +%% backward incompatible changes to the external format. +%% + +generate_external_terms_files(BaseDir) -> + {ok,Node} = slave:start(hostname(), a_node), + RPid = rpc:call(Node, erlang, self, []), + true = is_pid(RPid), + RRef = rpc:call(Node, erlang, make_ref, []), + true = is_reference(RRef), + RPort = hd(rpc:call(Node, erlang, ports, [])), + true = is_port(RPort), + slave:stop(Node), + Terms = + [{4711, -4711, [an_atom, "a list"]}, + [1000000000000000000000,-1111111111111111, "blupp!", blipp], + {RPid, {RRef, RPort}, self(), hd(erlang:ports()), make_ref()}, + {{}, [], [], fun () -> ok end, <<"hej hopp trallalaaaaaaaaaaaaaaa">>}, + [44444444444444444444444,-44444444444, "b!", blippppppp], + {4711, RPid, {RRef, RPort}, -4711, [an_atom, "a list"]}, + {RPid, {RRef, RPort}, hd(processes()), hd(erlang:ports())}, + {4711, -4711, [an_atom, "a list"]}, + {4711, -4711, [atom, "list"]}, + {RPid, {RRef, RPort}, hd(processes()), hd(erlang:ports())}, + {4444444444444444444,-44444, {{{{{{{{{{{{}}}}}}}}}}}}, make_ref()}, + {444444444444444444444,-44444, [[[[[[[[[[[1]]]]]]]]]]], make_ref()}, + {444444444444444444,-44444, {{{{{{{{{{{{2}}}}}}}}}}}}, make_ref()}, + {4444444444444444444444,-44444, {{{{{{{{{{{{3}}}}}}}}}}}}, make_ref()}, + {44444444444444444444,-44444, {{{{{{{{{{{{4}}}}}}}}}}}}, make_ref()}, + {4444444444444444,-44444, [[[[[[[[[[[5]]]]]]]]]]], make_ref()}, + {444444444444444444444,-44444, {{{{{{{{{{{{6}}}}}}}}}}}}, make_ref()}, + {444444444444444,-44444, {{{{{{{{{{{{7}}}}}}}}}}}}, make_ref()}, + {4444444444444444444,-44444, {{{{{{{{{{{{8}}}}}}}}}}}}, make_ref()}], + ok = file:write_file(filename:join([BaseDir, + "send_term_SUITE_data", + "ext_terms.bin"]), + term_to_binary(Terms, [compressed])), + {ok, IoDev} = file:open(filename:join([BaseDir, + "send_term_SUITE_data", + "ext_terms.h"]), + [write]), + write_ext_terms_h(IoDev, Terms), + file:close(IoDev). + +write_ext_terms_h(IoDev, Terms) -> + write_license(IoDev), + io:format(IoDev, "#ifndef EXT_TERMS_H__~n",[]), + io:format(IoDev, "#define EXT_TERMS_H__~n",[]), + {ExtTerms, MaxSize} = make_ext_terms(Terms), + io:format(IoDev, + "static struct {~n" + " unsigned char ext[~p];~n" + " int ext_size;~n" + " unsigned char cext[~p];~n" + " int cext_size;~n" + "} ext_terms[] = {~n",[MaxSize, MaxSize]), + E = write_ext_terms_h(IoDev, ExtTerms, 0), + io:format(IoDev, "};~n",[]), + io:format(IoDev, "#define NO_OF_EXT_TERMS ~p~n", [E]), + io:format(IoDev, "#endif~n",[]). + +make_ext_terms([]) -> + {[], 0}; +make_ext_terms([T|Ts]) -> + E = term_to_binary(T), + ESz = size(E), + CE = term_to_binary(T, [compressed]), + CESz = size(CE), + true = CESz =< ESz, % Assertion + {ExtTerms, MaxSize} = make_ext_terms(Ts), + NewMaxSize = case MaxSize < ESz of + true -> ESz; + false -> MaxSize + end, + {[{E, ESz, CE, CESz} | ExtTerms], NewMaxSize}. + +write_ext_terms_h(IoDev, [], N) -> + io:format(IoDev, "~n",[]), + N; +write_ext_terms_h(IoDev, [ET|ETs], 0) -> + write_ext_term(IoDev, ET), + write_ext_terms_h(IoDev, ETs, 1); +write_ext_terms_h(IoDev, [ET|ETs], N) -> + io:format(IoDev, ",~n",[]), + write_ext_term(IoDev, ET), + write_ext_terms_h(IoDev, ETs, N+1). + +write_ext_term(IoDev, {E, ESz, CE, CESz}) -> + ESz = write_bytes(IoDev, " {{", binary_to_list(E), 0), + io:format(IoDev, + ",~n" + " ~p,~n", + [ESz]), + CESz = write_bytes(IoDev, " {", binary_to_list(CE), 0), + io:format(IoDev, + ",~n" + " ~p}", + [CESz]). + +write_bytes(IoDev, _, [], N) -> + io:format(IoDev, "}",[]), + N; +write_bytes(IoDev, Prefix, [B|Bs], N) -> + io:format(IoDev, "~s~w", [Prefix, B]), + write_bytes(IoDev, ",", Bs, N+1). + +write_license(IoDev) -> + S = "/* ``The contents of this file are subject to the Erlang Public License,~n" + " * Version 1.1, (the \"License\"); you may not use this file except in~n" + " * compliance with the License. You should have received a copy of the~n" + " * Erlang Public License along with this software. If not, it can be~n" + " * retrieved via the world wide web at http://www.erlang.org/.~n" + " * ~n" + " * Software distributed under the License is distributed on an \"AS IS\"~n" + " * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See~n" + " * the License for the specific language governing rights and limitations~n" + " * under the License.~n" + " * ~n" + " * The Initial Developer of the Original Code is Ericsson AB.~n" + " * Portions created by Ericsson are Copyright 2007, Ericsson AB.~n" + " * All Rights Reserved.''~n" + " * ~n" + " * $Id$~n" + " */~n" + "~n" + "/*~n" + " * Do not modify this file. This file and ext_terms.bin were~n" + " * automatically generated by send_term_SUITE:generate_external_terms_files/1~n" + " * and needs to be consistent with each other.~n" + " */~n", + io:format(IoDev, S, []). + + +hostname() -> + hostname(atom_to_list(node())). + +hostname([$@ | Hostname]) -> + list_to_atom(Hostname); +hostname([_C | Cs]) -> + hostname(Cs). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/sensitive_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/sensitive_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/sensitive_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/sensitive_SUITE.erl 2009-03-12 12:16:41.000000000 +0000 @@ -0,0 +1,461 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(sensitive_SUITE). + +-include("test_server.hrl"). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + stickiness/1,send_trace/1,recv_trace/1,proc_trace/1,call_trace/1, + meta_trace/1,running_trace/1,gc_trace/1,seq_trace/1, + t_process_info/1,t_process_display/1,save_calls/1]). + +-export([remote_process_display/0,an_exported_function/1]). + +-import(lists, [keysearch/3,foreach/2,sort/1]). + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(5)), + [{watchdog,Dog}|Config]. + +fin_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +all(suite) -> + [stickiness,send_trace,recv_trace,proc_trace,call_trace, + meta_trace,running_trace,gc_trace,seq_trace, + t_process_info,t_process_display,save_calls]. + +stickiness(Config) when is_list(Config) -> + ?line {Tracer,Mref} = spawn_monitor(fun() -> + receive after infinity -> ok end + end), + ?line false = process_flag(sensitive, true), + put(foo, bar), + + Flags = sort([send,'receive',procs,call,running,garbage_collection, + set_on_spawn,set_on_first_spawn,set_on_link,set_on_first_link]), + ?line foreach(fun(F) -> + 1 = erlang:trace(self(), true, [F,{tracer,Tracer}]) + end, Flags), + ?line foreach(fun(F) -> + 1 = erlang:trace(self(), false, [F,{tracer,Tracer}]) + end, Flags), + ?line 1 = erlang:trace(self(), true, [{tracer,Tracer}|Flags]), + ?line 1 = erlang:trace(self(), false, [{tracer,Tracer}|Flags]), + + ?line {messages,[]} = process_info(Tracer, messages), + exit(Tracer, kill), + receive {'DOWN',Mref,_,_,_} -> ok end, + + case process_info(self(), dictionary) of + {dictionary,[]} -> ok; + {dictionary,_} -> ?line ?t:fail(sensitive_flag_cleared) + end, + + NewTracer = spawn_link(fun() -> receive after infinity -> ok end end), + ?line 1 = erlang:trace(self(), true, [{tracer,NewTracer}|Flags]), + ?line Flags = sort(element(2, erlang:trace_info(self(), flags))), + ?line {tracer,NewTracer} = erlang:trace_info(self(), tracer), + + %% Process still sensitive. Tracer should disappear when we clear + %% all trace flags. + ?line 1 = erlang:trace(self(), false, [{tracer,NewTracer}|Flags]), + ?line {tracer,[]} = erlang:trace_info(self(), tracer), + + ?line unlink(NewTracer), exit(NewTracer, kill), + ok. + +send_trace(Config) when is_list(Config) -> + ?line {Dead,Mref} = spawn_monitor(fun() -> ok end), + receive {'DOWN',Mref,_,_,_} -> ok end, + ?line Tracer = spawn_link(fun() -> receive after infinity -> ok end end), + ?line Sink = spawn_link(fun() -> receive after infinity -> ok end end), + Self = self(), + + ?line 1 = erlang:trace(self(), true, [send,{tracer,Tracer}]), + ?line Dead ! before, + ?line Sink ! before, + ?line false = process_flag(sensitive, true), + ?line Sink ! {blurf,lists:seq(1, 50)}, + ?line true = process_flag(sensitive, true), + ?line Sink ! lists:seq(1, 100), + ?line Dead ! forget_me, + ?line true = process_flag(sensitive, false), + ?line Sink ! after1, + ?line false = process_flag(sensitive, false), + ?line Sink ! after2, + ?line Dead ! after2, + ?line wait_trace(Self), + + ?line {messages,Messages} = process_info(Tracer, messages), + ?line [{trace,Self,send_to_non_existing_process,before,Dead}, + {trace,Self,send,before,Sink}, + {trace,Self,send,after1,Sink}, + {trace,Self,send,after2,Sink}, + {trace,Self,send_to_non_existing_process,after2,Dead}] = Messages, + + ?line unlink(Tracer), exit(Tracer, kill), + ?line unlink(Sink), exit(Sink, kill), + ok. + +recv_trace(Config) when is_list(Config) -> + Parent = self(), + ?line Tracer = spawn_link(fun() -> receive after infinity -> ok end end), + ?line Sender = spawn_link(fun() -> recv_trace_sender(Parent) end), + + ?line 1 = erlang:trace(self(), true, ['receive',{tracer,Tracer}]), + + Sender ! 1, + receive a -> wait_trace(Sender) end, + + ?line false = process_flag(sensitive, true), + + Sender ! 2, + receive {b,[x,y,z]} -> wait_trace(Sender) end, + + ?line true = process_flag(sensitive, false), + + Sender ! 3, + receive c -> wait_trace(Sender) end, + + ?line {messages,Messages} = process_info(Tracer, messages), + [{trace,Parent,'receive',a}, + {trace,Parent,'receive',{trace_delivered,_,_}}, + {trace,Parent,'receive',c}, + {trace,Parent,'receive',{trace_delivered,_,_}}] = Messages, + + ?line unlink(Tracer), exit(Tracer, kill), + ?line unlink(Sender), exit(Sender, kill), + ok. + +recv_trace_sender(Pid) -> + receive + 1 -> Pid ! a; + 2 -> Pid ! {b,[x,y,z]}; + 3 -> Pid ! c + end, + recv_trace_sender(Pid). + +proc_trace(Config) when is_list(Config) -> + Self = self(), + ?line Tracer = spawn_link(fun() -> receive after infinity -> ok end end), + + ?line 1 = erlang:trace(self(), true, [procs,{tracer,Tracer}]), + ?line false = process_flag(sensitive, true), + + spawn(fun() -> ok end), + ?line register(nisse, self()), + ?line unregister(nisse), + ?line link(Tracer), + ?line unlink(Tracer), + ?line Linker0 = spawn_link(fun() -> ok end), + Mref0 = erlang:monitor(process, Linker0), + + ?line {_,Mref} = spawn_monitor(fun() -> link(Self), unlink(Self) end), + + receive {'DOWN',Mref0,_,_,_} -> ok end, + + receive {'DOWN',Mref,_,_,_} -> ok end, + + ?line true = process_flag(sensitive, false), + + Dead = spawn(fun() -> ok end), + ?line register(arne, self()), + ?line unregister(arne), + ?line {Linker,Mref2} = spawn_monitor(fun() -> link(Self), unlink(Self) end), + receive {'DOWN',Mref2,_,_,_} -> ok end, + ?line Last = spawn_link(fun() -> ok end), + receive after 10 -> ok end, + ?line wait_trace(all), + ?line {messages,Messages} = process_info(Tracer, messages), + [{trace,Self,spawn,Dead,{erlang,apply,_}}, + {trace,Self,register,arne}, + {trace,Self,unregister,arne}, + {trace,Self,spawn,Linker,_}, + {trace,Self,getting_linked,Linker}, + {trace,Self,getting_unlinked,Linker}, + {trace,Self,spawn,Last,_}, + {trace,Self,link,Last}, + {trace,Self,getting_unlinked,Last}] = Messages, + + ?line unlink(Tracer), exit(Tracer, kill), + ok. + +call_trace(Config) when is_list(Config) -> + Self = self(), + ?line Tracer = spawn_link(fun() -> receive after infinity -> ok end end), + + ?line 1 = erlang:trace(self(), true, [call,{tracer,Tracer}]), + ?line 1 = erlang:trace_pattern({?MODULE,an_exported_function,1}, + true, [global]), + ?line 1 = erlang:trace_pattern({erlang,list_to_binary,1}, true, [global]), + ?line 1 = erlang:trace_pattern({erlang,binary_to_list,1}, true, [local]), + ?line Local = erlang:trace_pattern({?MODULE,'_','_'}, true, [local]), + + ?line false = process_flag(sensitive, true), + ?line {ok,42} = a_local_function(42), + ?line 7 = an_exported_function(6), + ?line <<7,8,9,10>> = list_to_binary(id([7,8,9,10])), + ?line [42,43] = binary_to_list(id(<<42,43>>)), + ?line true = process_flag(sensitive, false), + + ?line {ok,{a,b}} = a_local_function({a,b}), + ?line 1 = an_exported_function(0), + ?line <<1,2,3>> = list_to_binary(id([1,2,3])), + ?line [42,43,44] = binary_to_list(id(<<42,43,44>>)), + + ?line wait_trace(Self), + + ?line {messages,Messages} = process_info(Tracer, messages), + ?line [{trace,Self,call,{?MODULE,a_local_function,[{a,b}]}}, + {trace,Self,call,{?MODULE,an_exported_function,[0]}}, + {trace,Self,call,{?MODULE,id,[_]}}, + {trace,Self,call,{erlang,list_to_binary,[[1,2,3]]}}, + {trace,Self,call,{sensitive_SUITE,id,[<<42,43,44>>]}}, + {trace,Self,call,{erlang,binary_to_list,[<<42,43,44>>]}}, + {trace,Self,call,{?MODULE,wait_trace,[Self]}}] = Messages, + + ?line Local = erlang:trace_pattern({?MODULE,'_','_'}, false, [local]), + ?line erlang:trace_pattern({erlang,'_','_'}, false, [local]), + ?line erlang:trace_pattern({'_','_','_'}, false, [global]), + + ?line unlink(Tracer), exit(Tracer, kill), + ok. + +meta_trace(Config) when is_list(Config) -> + Self = self(), + ?line Tracer = spawn_link(fun() -> receive after infinity -> ok end end), + + ?line Local = erlang:trace_pattern({?MODULE,'_','_'}, true, [{meta,Tracer}]), + ?line 1 = erlang:trace_pattern({erlang,list_to_binary,1}, true, [{meta,Tracer}]), + + ?line false = process_flag(sensitive, true), + ?line {ok,blurf} = a_local_function(blurf), + ?line 100 = an_exported_function(99), + ?line <<8,9,10>> = list_to_binary(id([8,9,10])), + ?line true = process_flag(sensitive, false), + + ?line {ok,{x,y}} = a_local_function({x,y}), + ?line 1 = an_exported_function(0), + ?line <<10>> = list_to_binary(id([10])), + ?line wait_trace(Self), + + ?line Local = erlang:trace_pattern({?MODULE,'_','_'}, false, [meta]), + ?line 1 = erlang:trace_pattern({erlang,list_to_binary,1}, false, [meta]), + ?line a_local_function(0), + + ?line {messages,Messages} = process_info(Tracer, messages), + ?line [{trace_ts,Self,call,{?MODULE,a_local_function,[{x,y}]},{_,_,_}}, + {trace_ts,Self,call,{?MODULE,an_exported_function,[0]},{_,_,_}}, + {trace_ts,Self,call,{?MODULE,id,[_]},{_,_,_}}, + {trace_ts,Self,call,{erlang,list_to_binary,[[10]]},{_,_,_}}, + {trace_ts,Self,call,{?MODULE,wait_trace,[Self]},{_,_,_}}] = Messages, + + ?line unlink(Tracer), exit(Tracer, kill), + ok. + +a_local_function(A) -> + {ok,A}. + +an_exported_function(X) -> + X+1. + +running_trace(Config) when is_list(Config) -> + Self = self(), + ?line Tracer = spawn_link(fun() -> receive after infinity -> ok end end), + + ?line false = process_flag(sensitive, true), + ?line 1 = erlang:trace(Self, true, [running,{tracer,Tracer}]), + erlang:yield(), erlang:yield(), erlang:yield(), erlang:yield(), + erlang:yield(), erlang:yield(), erlang:yield(), erlang:yield(), + ?line true = process_flag(sensitive, false), + erlang:yield(), + ?line 1 = erlang:trace(Self, false, [running,{tracer,Tracer}]), + + ?line wait_trace(Self), + ?line {messages,Messages} = process_info(Tracer, messages), + ?line [{trace,Self,out,{sensitive_SUITE,running_trace,1}}, + {trace,Self,in,{sensitive_SUITE,running_trace,1}}] = Messages, + + ?line unlink(Tracer), exit(Tracer, kill), + ok. + +gc_trace(Config) when is_list(Config) -> + Self = self(), + ?line Tracer = spawn_link(fun() -> receive after infinity -> ok end end), + + ?line false = process_flag(sensitive, true), + ?line 1 = erlang:trace(Self, true, [garbage_collection,{tracer,Tracer}]), + erlang:garbage_collect(), erlang:garbage_collect(), + erlang:garbage_collect(), erlang:garbage_collect(), + erlang:garbage_collect(), erlang:garbage_collect(), + erlang:garbage_collect(), erlang:garbage_collect(), + ?line true = process_flag(sensitive, false), + erlang:garbage_collect(), + ?line 1 = erlang:trace(Self, false, [garbage_collection,{tracer,Tracer}]), + + ?line wait_trace(Self), + ?line {messages,Messages} = process_info(Tracer, messages), + ?line [{trace,Self,gc_start,_},{trace,Self,gc_end,_}] = Messages, + + ?line unlink(Tracer), exit(Tracer, kill), + ok. + +seq_trace(Config) when is_list(Config) -> + Self = self(), + ?line Tracer = spawn_link(fun() -> receive after infinity -> ok end end), + ?line seq_trace:set_system_tracer(Tracer), + + ?line false = process_flag(sensitive, true), + + ?line Echo = spawn_link(fun() -> + receive + {Pid,Message} -> + Pid ! {reply,Message} + end + end), + ?line Sender = spawn_link(fun() -> + seq_trace:set_token(label, 42), + seq_trace:set_token('receive', true), + seq_trace:set_token(send, true), + seq_trace:set_token(print, true), + seq_trace:print(42, "trace started"), + Self ! blurf + end), + seq_trace:set_token(label, 17), + seq_trace:set_token('receive', true), + seq_trace:set_token(send, true), + seq_trace:set_token(print, true), + seq_trace:print(17, "trace started"), + Echo ! {Self,hello}, + receive {reply,hello} -> ok end, + receive blurf -> ok end, + + ?line wait_trace(all), + + ?line {messages,Messages} = process_info(Tracer, messages), + ?line [{seq_trace,17,{'receive',{0,2},Self,Echo,{Self,hello}}}, + {seq_trace,17,{send,{2,3},Echo,Self,{reply,hello}}}] = + [M || {seq_trace,17,_}=M <- Messages], + + ?line [{seq_trace,42,{print,{0,1},Sender,[],"trace started"}}, + {seq_trace,42,{send,{0,2},Sender,Self,blurf}}] = + [M || {seq_trace,42,_}=M <- Messages], + + ?line unlink(Tracer), exit(Tracer, kill), + ?line unlink(Echo), exit(Echo, kill), + ?line unlink(Sender), exit(Sender, kill), + ok. + +t_process_info(Config) when is_list(Config) -> + Parent = self(), + ?line Pid = spawn_link(fun() -> + put(foo, bar), + false = process_flag(sensitive, true), + Parent ! go, + receive + revert -> + true = process_flag(sensitive, false), + Parent ! go_again, + receive never -> ok end + end end), + receive go -> ok end, + + ?line put(foo, bar), + ?line self() ! Pid ! {i,am,a,message}, + + ?line false = process_flag(sensitive, true), + ?line t_process_info_suppressed(self()), + ?line t_process_info_suppressed(Pid), + + ?line true = process_flag(sensitive, false), + Pid ! revert, + receive go_again -> ok end, + + ?line t_process_info_normal(self()), + ?line t_process_info_normal(Pid), + ok. + +t_process_info_suppressed(Pid) -> + [] = my_process_info(Pid, dictionary), + <<>> = my_process_info(Pid, backtrace), + [] = my_process_info(Pid, messages). + +t_process_info_normal(Pid) -> + {value,{foo,bar}} = keysearch(foo, 1, my_process_info(Pid, dictionary)), + case process_info(Pid, backtrace) of + {backtrace,Bin} when size(Bin) > 20 -> ok + end, + [{i,am,a,message}] = my_process_info(Pid, messages). + +my_process_info(Pid, Tag) -> + {Tag,Value} = process_info(Pid, Tag), + All = process_info(Pid), + case keysearch(Tag, 1, All) of + false -> Value; + {value,{Tag,Value}} -> Value + end. + +t_process_display(Config) when is_list(Config) -> + ?line Dir = filename:dirname(code:which(?MODULE)), + ?line Cmd = atom_to_list(lib:progname()) ++ " -noinput -pa " ++ Dir ++ + " -run " ++ ?MODULE_STRING ++ " remote_process_display", + ?line io:put_chars(Cmd), + ?line P = open_port({spawn,Cmd}, [in,stderr_to_stdout,eof]), + <<"done",_/binary>> = get_all(P), + ok. + +remote_process_display() -> + false = process_flag(sensitive, true), + erlang:process_display(self(), backtrace), + erlang:display(done), + receive after 10 -> ok end, + init:stop(). + +get_all(P) -> + get_all(P, []). + +get_all(P, Acc) -> + receive + {P,{data,S}} -> + get_all(P, [Acc|S]); + {P,eof} -> + iolist_to_binary(Acc) + end. + +save_calls(Config) when is_list(Config) -> + process_flag(save_calls, 10), + + false = process_flag(sensitive, true), + ?line {last_calls,LastCalls} = process_info(self(), last_calls), + ?line [{erlang,process_flag,2}] = LastCalls, + ?line [2,4,6] = lists:map(fun(E) -> 2*E end, [1,2,3]), + ?line {last_calls,LastCalls} = process_info(self(), last_calls), + ok. + +wait_trace(Pid) -> + Ref = erlang:trace_delivered(Pid), + receive + {trace_delivered,Pid,Ref} -> ok + end. + +id(I) -> I. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/signal_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/signal_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/signal_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/signal_SUITE.erl 2009-11-20 13:32:24.000000000 +0000 @@ -0,0 +1,544 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : signal_SUITE.erl +%%% Author : Rickard Green +%%% Description : Test signals +%%% +%%% Created : 10 Jul 2006 by Rickard Green +%%%------------------------------------------------------------------- +-module(signal_SUITE). +-author('rickard.s.green@ericsson.com'). + +-define(DEFAULT_TIMEOUT_SECONDS, 120). + +%-define(line_trace, 1). +-include("test_server.hrl"). +-export([all/1]). + +% Test cases +-export([xm_sig_order/1, + pending_exit_unlink_process/1, + pending_exit_unlink_dist_process/1, + pending_exit_unlink_port/1, + pending_exit_trap_exit/1, + pending_exit_receive/1, + pending_exit_exit/1, + pending_exit_gc/1, + pending_exit_is_process_alive/1, + pending_exit_process_display/1, + pending_exit_process_info_1/1, + pending_exit_process_info_2/1, + pending_exit_group_leader/1, + exit_before_pending_exit/1]). + +-export([init_per_testcase/2, fin_per_testcase/2, end_per_suite/1]). + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(?DEFAULT_TIMEOUT_SECONDS)), + available_internal_state(true), + ?line [{testcase, Func},{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + ?line Dog = ?config(watchdog, Config), + ?line ?t:timetrap_cancel(Dog). + +end_per_suite(_Config) -> + available_internal_state(true), + erts_debug:set_internal_state(not_running_optimization, true), + available_internal_state(false). + +all(suite) -> + [xm_sig_order, + pending_exit_unlink_process, + pending_exit_unlink_dist_process, + pending_exit_unlink_port, + pending_exit_trap_exit, + pending_exit_receive, + pending_exit_trap_exit, + pending_exit_gc, + pending_exit_is_process_alive, + pending_exit_process_display, + pending_exit_process_info_1, + pending_exit_process_info_2, + pending_exit_group_leader, + exit_before_pending_exit]. + +xm_sig_order(doc) -> ["Test that exit signals and messages are received " + "in correct order"]; +xm_sig_order(suite) -> []; +xm_sig_order(Config) when is_list(Config) -> + ?line LNode = node(), + ?line repeat(fun () -> xm_sig_order_test(LNode) end, 1000), + ?line {ok, RNode} = start_node(Config), + ?line repeat(fun () -> xm_sig_order_test(RNode) end, 1000), + ?line stop_node(RNode), + ?line ok. + + +xm_sig_order_test(Node) -> + ?line P = spawn(Node, fun () -> xm_sig_order_proc() end), + ?line M = erlang:monitor(process, P), + ?line P ! may_reach, + ?line P ! may_reach, + ?line P ! may_reach, + ?line exit(P, good_signal_order), + ?line P ! may_not_reach, + ?line P ! may_not_reach, + ?line P ! may_not_reach, + ?line receive + {'DOWN', M, process, P, R} -> + ?line good_signal_order = R + end. + +xm_sig_order_proc() -> + receive + may_not_reach -> exit(bad_signal_order); + may_reach -> ok + after 0 -> ok + end, + xm_sig_order_proc(). + +pending_exit_unlink_process(doc) -> []; +pending_exit_unlink_process(suite) -> []; +pending_exit_unlink_process(Config) when is_list(Config) -> + ?line pending_exit_test(self(), unlink). + +pending_exit_unlink_dist_process(doc) -> []; +pending_exit_unlink_dist_process(suite) -> []; +pending_exit_unlink_dist_process(Config) when is_list(Config) -> + ?line {ok, Node} = start_node(Config), + ?line From = spawn(Node, fun () -> receive after infinity -> ok end end), + ?line Res = pending_exit_test(From, unlink), + ?line stop_node(Node), + ?line Res. + +pending_exit_unlink_port(doc) -> []; +pending_exit_unlink_port(suite) -> []; +pending_exit_unlink_port(Config) when is_list(Config) -> + ?line pending_exit_test(hd(erlang:ports()), unlink). + +pending_exit_trap_exit(doc) -> []; +pending_exit_trap_exit(suite) -> []; +pending_exit_trap_exit(Config) when is_list(Config) -> + ?line pending_exit_test(self(), trap_exit). + +pending_exit_receive(doc) -> []; +pending_exit_receive(suite) -> []; +pending_exit_receive(Config) when is_list(Config) -> + ?line pending_exit_test(self(), 'receive'). + +pending_exit_exit(doc) -> []; +pending_exit_exit(suite) -> []; +pending_exit_exit(Config) when is_list(Config) -> + ?line pending_exit_test(self(), exit). + +pending_exit_gc(doc) -> []; +pending_exit_gc(suite) -> []; +pending_exit_gc(Config) when is_list(Config) -> + ?line pending_exit_test(self(), gc). + +pending_exit_test(From, Type) -> + ?line case catch erlang:system_info(smp_support) of + true -> + ?line OTE = process_flag(trap_exit, true), + ?line Ref = make_ref(), + ?line Master = self(), + ?line ExitBySignal = case Type of + gc -> + lists:duplicate(10000, + exit_by_signal); + _ -> + exit_by_signal + end, + ?line Pid = spawn_link( + fun () -> + receive go -> ok end, + false = have_pending_exit(), + exit = fake_exit(From, + self(), + ExitBySignal), + true = have_pending_exit(), + Master ! {self(), Ref, Type}, + case Type of + gc -> + force_gc(), + erlang:yield(); + unlink -> + unlink(From); + trap_exit -> + process_flag(trap_exit, true); + 'receive' -> + receive _ -> ok + after 0 -> ok + end; + exit -> + ok + end, + exit(exit_by_myself) + end), + ?line Mon = erlang:monitor(process, Pid), + ?line Pid ! go, + ?line Reason = receive + {'DOWN', Mon, process, Pid, R} -> + ?line receive + {Pid, Ref, Type} -> + ?line ok + after 0 -> + ?line ?t:fail(premature_exit) + end, + ?line case Type of + exit -> + ?line exit_by_myself = R; + _ -> + ?line ExitBySignal = R + end + end, + ?line receive + {'EXIT', Pid, R2} -> + ?line Reason = R2 + end, + ?line process_flag(trap_exit, OTE), + ?line ok, + {comment, + "Test only valid with current SMP emulator."}; + _ -> + {skipped, + "SMP support not enabled. " + "Test only valid with current SMP emulator."} + end. + + + +exit_before_pending_exit(doc) -> []; +exit_before_pending_exit(suite) -> []; +exit_before_pending_exit(Config) when is_list(Config) -> + %% This is a testcase testcase very specific to the smp + %% implementation as it is of the time of writing. + %% + %% The testcase tries to check that a process can + %% exit by itself even though it has a pending exit. + ?line OTE = process_flag(trap_exit, true), + ?line Master = self(), + ?line Tester = spawn_link( + fun () -> + Opts = case {erlang:system_info(run_queues), + erlang:system_info(schedulers_online)} of + {RQ, SO} when RQ =:= 1; SO =:= 1 -> []; + _ -> + process_flag(scheduler, 1), + [{scheduler, 2}] + end, + P = self(), + Exiter = spawn_opt(fun () -> + receive + {exit_me, P, R} -> + exit(P, R) + end + end, Opts), + erlang:yield(), + Exiter ! {exit_me, self(), exited_by_exiter}, + %% We want to get a pending exit + %% before we exit ourselves. We + %% don't want to be scheduled out + %% since we will then see the + %% pending exit. + %% + %% Do something that takes + %% relatively long time but + %% consumes few reductions... + repeat(fun() -> erlang:system_info(procs) end,10), + %% ... then exit. + Master ! {self(), + pending_exit, + have_pending_exit()}, + exit(exited_by_myself) + end), + ?line PendingExit = receive {Tester, pending_exit, PE} -> PE end, + ?line receive + {'EXIT', Tester, exited_by_myself} -> + ?line process_flag(trap_exit, OTE), + ?line ok; + Msg -> + ?line ?t:fail({unexpected_message, Msg}) + end, + NoScheds = integer_to_list(erlang:system_info(schedulers_online)), + {comment, + "Was " + ++ case PendingExit of + true -> ""; + false ->"*not*" + end ++ " able to trigger a pending exit. " + ++ "Running on " ++ NoScheds ++ " scheduler(s). " + ++ "This test is only interesting with at least two schedulers."}. + +-define(PE_INFO_REPEAT, 100). + +pending_exit_is_process_alive(Config) when is_list(Config) -> + ?line S = exit_op_test_init(), + ?line TestFun = fun (P) -> false = is_process_alive(P) end, + ?line repeated_exit_op_test(TestFun, ?PE_INFO_REPEAT), + ?line verify_pending_exit_success(S), + ?line comment(). + +pending_exit_process_info_1(Config) when is_list(Config) -> + ?line S = exit_op_test_init(), + ?line TestFun = fun (P) -> + undefined = process_info(P) + end, + ?line repeated_exit_op_test(TestFun, ?PE_INFO_REPEAT), + ?line verify_pending_exit_success(S), + ?line comment(). + +pending_exit_process_info_2(Config) when is_list(Config) -> + ?line S0 = exit_op_test_init(), + ?line repeated_exit_op_test(fun (P) -> + undefined = process_info(P, messages) + end, ?PE_INFO_REPEAT), + ?line S1 = verify_pending_exit_success(S0), + ?line repeated_exit_op_test(fun (P) -> + undefined = process_info(P, status) + end, ?PE_INFO_REPEAT), + ?line S2 = verify_pending_exit_success(S1), + ?line repeated_exit_op_test(fun (P) -> + undefined = process_info(P, links) + end, ?PE_INFO_REPEAT), + ?line S3 = verify_pending_exit_success(S2), + ?line repeated_exit_op_test(fun (P) -> + undefined = process_info(P, [messages]) + end, ?PE_INFO_REPEAT), + ?line S4 = verify_pending_exit_success(S3), + ?line repeated_exit_op_test(fun (P) -> + undefined = process_info(P, [status]) + end, ?PE_INFO_REPEAT), + ?line S5 = verify_pending_exit_success(S4), + ?line repeated_exit_op_test(fun (P) -> + undefined = process_info(P, [links]) + end, ?PE_INFO_REPEAT), + ?line S6 = verify_pending_exit_success(S5), + ?line repeated_exit_op_test(fun (P) -> + undefined = process_info(P, [status, + links]) + end, ?PE_INFO_REPEAT), + ?line S7 = verify_pending_exit_success(S6), + ?line repeated_exit_op_test(fun (P) -> + undefined = process_info(P, [messages, + status]) + end, ?PE_INFO_REPEAT), + ?line S8 = verify_pending_exit_success(S7), + ?line repeated_exit_op_test(fun (P) -> + undefined = process_info(P, [messages, + links]) + end, ?PE_INFO_REPEAT), + ?line S9 = verify_pending_exit_success(S8), + ?line repeated_exit_op_test( + fun (P) -> + undefined = process_info(P, [message_queue_len, + status]) + end, ?PE_INFO_REPEAT), + ?line S10 = verify_pending_exit_success(S9), + ?line repeated_exit_op_test(fun (P) -> + undefined = process_info(P, [messages, + links, + status]) + end, ?PE_INFO_REPEAT), + ?line verify_pending_exit_success(S10), + ?line comment(). + +pending_exit_process_display(Config) when is_list(Config) -> + ?line S = exit_op_test_init(), + ?line TestFun = fun (P) -> + badarg = try + erlang:process_display(P, backtrace) + catch + error:badarg -> badarg + end + end, + ?line repeated_exit_op_test(TestFun, ?PE_INFO_REPEAT), + ?line verify_pending_exit_success(S), + ?line comment(). + +pending_exit_group_leader(Config) when is_list(Config) -> + ?line S = exit_op_test_init(), + ?line TestFun = fun (P) -> + badarg = try + group_leader(self(), P) + catch + error:badarg -> badarg + end + end, + ?line repeated_exit_op_test(TestFun, ?PE_INFO_REPEAT), + ?line verify_pending_exit_success(S), + ?line comment(). + +%% +%% -- Internal utils -------------------------------------------------------- +%% +exit_op_test_init() -> + put(no_pending_exit_success, 0), + put(no_pending_exit_tries, 0), + {case {erlang:system_info(run_queues), + erlang:system_info(schedulers_online)} of + {RQ, SO} when RQ =:= 1; SO =:= 1 -> false; + _ -> true + end, 0, 0}. + +verify_pending_exit_success({false, _, _} = S) -> + S; +verify_pending_exit_success({true, S, T}) -> + NewS = get(no_pending_exit_success), + NewT = get(no_pending_exit_tries), + case NewT =:= T of + true -> ok; + _ -> case NewS > S of + true -> ok; + _ -> exit(no_pending_exits) + end + end, + {true, NewS, NewT}. + +comment() -> + {comment, + "Pending exit trigger ratio " + ++ integer_to_list(get(no_pending_exit_success)) + ++ "/" + ++ integer_to_list(get(no_pending_exit_tries)) + ++ "." + ++ case get(not_running_opt_test) of + true -> " No 'not running optimization' to disable."; + _ -> "" + end}. + +repeated_exit_op_test(TestFun, N) -> + WorkFun0 = fun () -> + lists:sort(lists:reverse(lists:seq(1, 1000))) + end, + repeat(fun () -> exit_op_test(TestFun, WorkFun0) end, N), + try erts_debug:set_internal_state(not_running_optimization, false) of + Bool when Bool == true; Bool == false -> + WorkFun1 = fun () -> + erts_debug:set_internal_state(sleep, 0), + lists:sort(lists:reverse(lists:seq(1, 1000))) + end, + repeat(fun () -> + exit_op_test(TestFun, WorkFun1) + end, N) + catch + error:notsup -> put(not_running_opt_test, true) + after + catch erts_debug:set_internal_state(not_running_optimization, true) + end. + +exit_op_test(TestFun, WorkFun) -> + Opts = case {erlang:system_info(run_queues), + erlang:system_info(schedulers_online)} of + {RQ, SO} when RQ =:= 1; SO =:= 1 -> []; + _ -> + process_flag(scheduler, 1), + [{scheduler, 2}] + end, + Master = self(), + Going = make_ref(), + P = spawn_opt(fun () -> + loop(10, WorkFun), + Master ! Going, + loop(infinity, WorkFun) + end, Opts), + receive Going -> ok end, + loop(10, WorkFun), + erlang:yield(), + exit(P, bang), + PE0 = have_pending_exit(P), + TestFun(P), + PE = case PE0 of + true -> true; + _ -> false + end, + case {PE, get(no_pending_exit_success), get(no_pending_exit_tries)} of + {true, undefined, undefined} -> + put(no_pending_exit_success, 1), + put(no_pending_exit_tries, 1); + {false, undefined, undefined} -> + put(no_pending_exit_success, 0), + put(no_pending_exit_tries, 1); + {true, S, T} -> + put(no_pending_exit_success, S+1), + put(no_pending_exit_tries, T+1); + {false, _S, T} -> + put(no_pending_exit_tries, T+1) + end, + ok. + +loop(infinity, WorkFun) -> + do_loop(infinity, WorkFun); +loop(0, _WorkFun) -> + ok; +loop(N, WorkFun) when is_integer(N) -> + do_loop(N-1, WorkFun). + +do_loop(N, WorkFun) -> + WorkFun(), + loop(N, WorkFun). + +repeat(_Fun, N) when is_integer(N), N =< 0 -> + ok; +repeat(Fun, N) when is_integer(N) -> + Fun(), + repeat(Fun, N-1). + +start_node(Config) -> + {A, B, C} = now(), + Name = list_to_atom(atom_to_list(?MODULE) + ++ "-" ++ atom_to_list(?config(testcase, Config)) + ++ "-" ++ integer_to_list(A) + ++ "-" ++ integer_to_list(B) + ++ "-" ++ integer_to_list(C)), + Pa = filename:dirname(code:which(?MODULE)), + ?t:start_node(Name, slave, [{args, "-pa " ++ Pa}]). + +stop_node(Node) -> + ?t:stop_node(Node). + +have_pending_exit() -> + have_pending_exit(self()). + +have_pending_exit(Pid) -> + erts_debug:get_internal_state({have_pending_exit, Pid}). + +force_gc() -> + erts_debug:set_internal_state(force_gc, self()). + +fake_exit(From, To, Reason) -> + erts_debug:set_internal_state(send_fake_exit_signal, {From, To, Reason}). + +available_internal_state(Bool) when Bool == true; Bool == false -> + case {Bool, + (catch erts_debug:get_internal_state(available_internal_state))} of + {true, true} -> + true; + {false, true} -> + erts_debug:set_internal_state(available_internal_state, false), + true; + {true, _} -> + erts_debug:set_internal_state(available_internal_state, true), + false; + {false, _} -> + false + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/statistics_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/statistics_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/statistics_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/statistics_SUITE.erl 2009-09-18 15:07:29.000000000 +0100 @@ -0,0 +1,341 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(statistics_SUITE). + +%% Tests the statistics/1 bif. + +-export([all/1, + init_per_testcase/2, + fin_per_testcase/2, + wall_clock/1, wall_clock_zero_diff/1, wall_clock_update/1, + runtime/1, runtime_zero_diff/1, runtime_zero_update/1, + runtime_update/1, runtime_diff/1, + run_queue/1, run_queue_one/1, + reductions/1, reductions_big/1, garbage_collection/1, io/1, + badarg/1]). + +%% Internal exports. + +-export([hog/1]). + +-include("test_server.hrl"). + +init_per_testcase(_, Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(300)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> [wall_clock, runtime, reductions, reductions_big, run_queue, + garbage_collection, io, badarg]. + + +%%% Testing statistics(wall_clock). + +wall_clock(suite) -> [wall_clock_zero_diff, wall_clock_update]. + + +wall_clock_zero_diff(doc) -> + "Tests that the 'Wall clock since last call' element of the result " + "is zero when statistics(runtime) is called twice in succession."; +wall_clock_zero_diff(Config) when is_list(Config) -> + wall_clock_zero_diff1(16). + +wall_clock_zero_diff1(N) when N > 0 -> + ?line {Time, _} = statistics(wall_clock), + ?line case statistics(wall_clock) of + {Time, 0} -> ok; + _ -> wall_clock_zero_diff1(N-1) + end; +wall_clock_zero_diff1(0) -> + ?line test_server:fail("Difference never zero."). + +wall_clock_update(doc) -> + "Test that the time differences returned by two calls to " + "statistics(wall_clock) are compatible, and are within a small number " + "of ms of the amount of real time we waited for."; +wall_clock_update(Config) when is_list(Config) -> + wall_clock_update1(6). + +wall_clock_update1(N) when N > 0 -> + ?line {T1_wc_time, _} = statistics(wall_clock), + ?line receive after 1000 -> ok end, + ?line {T2_wc_time, Wc_Diff} = statistics(wall_clock), + + ?line Wc_Diff = T2_wc_time - T1_wc_time, + ?line test_server:format("Wall clock diff = ~p; should be = 1000..1040~n", + [Wc_Diff]), + case ?t:is_debug() of + false -> + ?line true = Wc_Diff =< 1040; + true -> + ?line true = Wc_Diff =< 2000 %Be more tolerant in debug-compiled emulator. + end, + ?line true = Wc_Diff >= 1000, + wall_clock_update1(N-1); +wall_clock_update1(0) -> + ok. + + +%%% Test statistics(runtime). + +runtime(suite) -> [runtime_zero_diff, runtime_zero_update, runtime_update, + runtime_diff]. + +runtime_zero_diff(doc) -> + "Tests that the difference between the times returned from two consectuitive " + "calls to statistics(runtime) is zero."; +runtime_zero_diff(Config) when is_list(Config) -> + ?line runtime_zero_diff1(16). + +runtime_zero_diff1(N) when N > 0 -> + ?line {T1, _} = statistics(runtime), + ?line case statistics(runtime) of + {T1, 0} -> ok; + _ -> runtime_zero_diff1(N-1) + end; +runtime_zero_diff1(0) -> + ?line test_server:fail("statistics(runtime) never returned zero difference"). + +runtime_zero_update(doc) -> + "Test that the time differences returned by two calls to " + "statistics(runtime) several seconds apart is zero."; +runtime_zero_update(Config) when is_list(Config) -> + case ?t:is_debug() of + false -> ?line runtime_zero_update1(6); + true -> {skip,"Unreliable in DEBUG build"} + end. + +runtime_zero_update1(N) when N > 0 -> + ?line {T1, _} = statistics(runtime), + ?line receive after 7000 -> ok end, + ?line case statistics(runtime) of + {T, Td} when Td =< 80 -> + test_server:format("ok, Runtime before: {~p, _} after: {~p, ~p}", + [T1, T, Td]), + ok; + {T, R} -> + test_server:format("nok, Runtime before: {~p, _} after: {~p, ~p}", + [T1, T, R]), + runtime_zero_update1(N-1) + end; +runtime_zero_update1(0) -> + ?line test_server:fail("statistics(runtime) never returned zero difference"). + +runtime_update(doc) -> + "Test that the statistics(runtime) returns a substanstially updated difference " + "after running a process that takes all CPU power of the Erlang process " + "for a second."; +runtime_update(Config) when is_list(Config) -> + case ?t:is_cover() of + false -> + ?line process_flag(priority, high), + ?line test_server:m_out_of_n(1, 10, fun runtime_update/0); + true -> + {skip,"Cover-compiled"} + end. + +runtime_update() -> + ?line {T1,_} = statistics(runtime), + ?line spawn_link(fun cpu_heavy/0), + receive after 1000 -> ok end, + ?line {T2,Diff} = statistics(runtime), + ?line Delta = abs(Diff-1000), + ?line test_server:format("T1 = ~p, T2 = ~p, Diff = ~p, abs(Diff-1000) = ~p", + [T1,T2,Diff,Delta]), + ?line if + abs(Diff-1000) =:= Delta, Delta =< 100 -> + ok + end. + +cpu_heavy() -> + cpu_heavy(). + +runtime_diff(doc) -> + "Test that the difference between two consecutive absolute runtimes is " + "equal to the last relative runtime. The loop runs a lot of times since " + "the bug which this test case tests for showed up only rarely."; +runtime_diff(Config) when is_list(Config) -> + runtime_diff1(1000). + +runtime_diff1(N) when N > 0 -> + ?line {T1_wc_time, _} = statistics(runtime), + ?line do_much(), + ?line {T2_wc_time, Wc_Diff} = statistics(runtime), + ?line Wc_Diff = T2_wc_time - T1_wc_time, + runtime_diff1(N-1); +runtime_diff1(0) -> + ok. + +%%% do_much(100000) takes about 760 ms on boromir. +%%% do_much(1000) takes about 8 ms on boromir. + +do_much() -> + do_much(1000). + +do_much(0) -> + ok; +do_much(N) -> + _ = 4784728478274827 * 72874284728472, + do_much(N-1). + + +reductions(doc) -> + "Test that statistics(reductions) is callable, and that " + "Total_Reductions and Reductions_Since_Last_Call make sense. " + "(This to fail on pre-R3A version of JAM."; +reductions(Config) when is_list(Config) -> + {Reductions, _} = statistics(reductions), + + %% Each loop of reductions/2 takes 4 reductions + that the garbage built + %% outside the heap in the BIF calls will bump the reductions. + %% 300 * 4 is more than CONTEXT_REDS (1000). Thus, there will be one or + %% more context switches. + + reductions(300, Reductions). + +reductions(N, Previous) when N > 0 -> + ?line {Reductions, Diff} = statistics(reductions), + ?line build_some_garbage(), + ?line if Reductions > 0 -> ok end, + ?line if Diff >= 0 -> ok end, + io:format("Previous = ~p, Reductions = ~p, Diff = ~p, DiffShouldBe = ~p", + [Previous, Reductions, Diff, Reductions-Previous]), + ?line if Reductions == Previous+Diff -> reductions(N-1, Reductions) end; +reductions(0, _) -> + ok. + +build_some_garbage() -> + %% This will build garbage outside the process heap, which will cause + %% a garbage collection in the scheduler. + processes(). + +reductions_big(doc) -> + "Test that the number of reductions can be returned as a big number."; +reductions_big(Config) when is_list(Config) -> + ?line reductions_big_loop(), + ok. + +reductions_big_loop() -> + erlang:yield(), + case statistics(reductions) of + {Red, Diff} when Red >= 16#7ffFFFF -> + ok = io:format("Reductions = ~w, Diff = ~w", [Red, Diff]); + _ -> + reductions_big_loop() + end. + + +%%% Tests of statistics(run_queue). + +run_queue(suite) -> [run_queue_one]. + +run_queue_one(doc) -> + "Tests that statistics(run_queue) returns 1 if we start a " + "CPU-bound process."; +run_queue_one(Config) when is_list(Config) -> + ?line MS = erlang:system_flag(multi_scheduling, block), + ?line run_queue_one_test(Config), + ?line erlang:system_flag(multi_scheduling, unblock), + case MS of + blocked -> + {comment, + "Multi-scheduling blocked during test. This test-case " + "was not written to work with multiple schedulers."}; + _ -> ok + end. + + +run_queue_one_test(Config) when is_list(Config) -> + ?line Hog = spawn_link(?MODULE, hog, [self()]), + ?line receive + hog_started -> + Hog ! go + end, + ?line receive after 100 -> ok end, % Give hog a head start. + ?line case statistics(run_queue) of + N when N >= 1 -> ok; + Other -> ?line ?t:fail({unexpected,Other}) + end, + ok. + +%% CPU-bound process, going at low priority. It will always be ready +%% to run. + +hog(Pid) -> + ?line process_flag(priority, low), + ?line Pid ! hog_started, + ?line receive + go -> hog_iter(0) + end. + +hog_iter(N) when N > 0 -> + ?line hog_iter(N-1); +hog_iter(0) -> + ?line hog_iter(10000). + + +garbage_collection(doc) -> + "Tests that statistics(garbage_collection) is callable. " + "It is not clear how to test anything more."; +garbage_collection(Config) when is_list(Config) -> + ?line Bin = list_to_binary(lists:duplicate(19999, 42)), + ?line case statistics(garbage_collection) of + {Gcs0,R,0} when is_integer(Gcs0), is_integer(R) -> + ?line io:format("Reclaimed: ~p", [R]), + ?line Gcs = garbage_collection_1(Gcs0, Bin), + ?line io:format("Reclaimed: ~p", + [element(2, statistics(garbage_collection))]), + {comment,integer_to_list(Gcs-Gcs0)++" GCs"} + end. + +garbage_collection_1(Gcs0, Bin) -> + case statistics(garbage_collection) of + {Gcs,Reclaimed,0} when Gcs >= Gcs0 -> + if + Reclaimed > 16#7ffffff -> + Gcs; + true -> + _ = binary_to_list(Bin), + erlang:garbage_collect(), + garbage_collection_1(Gcs, Bin) + end + end. + +io(doc) -> + "Tests that statistics(io) is callable. " + "This could be improved to test something more."; +io(Config) when is_list(Config) -> + ?line case statistics(io) of + {{input,In},{output,Out}} when is_integer(In), is_integer(Out) -> ok + end. + +badarg(doc) -> + "Tests that some illegal arguments to statistics fails."; +badarg(Config) when is_list(Config) -> + ?line case catch statistics(1) of + {'EXIT', {badarg, _}} -> ok + end, + ?line case catch statistics(bad_atom) of + {'EXIT', {badarg, _}} -> ok + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/suite_release.exclude erlang-13.b.3-dfsg/erts/emulator/test/suite_release.exclude --- erlang-13.b.1-dfsg/erts/emulator/test/suite_release.exclude 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/suite_release.exclude 2004-09-14 12:57:21.000000000 +0100 @@ -0,0 +1,6 @@ +driver_SUITE.erl +driver_SUITE_data +port_SUITE.erl +port_SUITE_data +fun_r7_SUITE.erl +node_container_SUITE.erl diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/system_info_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/system_info_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/system_info_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/system_info_SUITE.erl 2009-09-18 15:08:59.000000000 +0100 @@ -0,0 +1,142 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +%%%------------------------------------------------------------------- +%%% File : system_info_SUITE.erl +%%% Author : Rickard Green +%%% Description : Misc tests of erlang:system_info/1 +%%% +%%% Created : 15 Jul 2005 by Rickard Green +%%%------------------------------------------------------------------- +-module(system_info_SUITE). +-author('rickard.s.green@ericsson.com'). + +%-define(line_trace, 1). + +-include("test_server.hrl"). + +%-compile(export_all). +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([process_count/1, system_version/1, misc_smoke_tests/1]). + +-define(DEFAULT_TIMEOUT, ?t:minutes(2)). + +all(doc) -> []; +all(suite) -> [process_count, system_version, misc_smoke_tests]. + +init_per_testcase(_Case, Config) when is_list(Config) -> + Dog = ?t:timetrap(?DEFAULT_TIMEOUT), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) when is_list(Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +%%% +%%% The test cases ------------------------------------------------------------- +%%% + +process_count(doc) -> []; +process_count(suite) -> []; +process_count(Config) when is_list(Config) -> + case catch erlang:system_info(modified_timing_level) of + Level when is_integer(Level) -> + {skipped, + "Modified timing (level " ++ integer_to_list(Level) + ++ ") is enabled. spawn() is too slow for this " + " test when modified timing is enabled."}; + _ -> + process_count_test() + end. + +process_count_test() -> + ?line OldPrio = process_flag(priority, max), + ?line check_procs(10), + ?line check_procs(11234), + ?line check_procs(57), + ?line check_procs(1030), + ?line check_procs(687), + ?line check_procs(7923), + ?line check_procs(5302), + ?line check_procs(12456), + ?line check_procs(14), + ?line check_procs(1125), + ?line check_procs(236), + ?line check_procs(125), + ?line check_procs(2346), + ?line process_flag(priority, OldPrio), + ?line ok. + + +check_procs(N) -> + ?line CP = length(processes()), + ?line Procs = start_procs(N), + ?line check_pc(CP+N), + ?line stop_procs(Procs), + ?line check_pc(CP). + +check_pc(E) -> + ?line P = length(processes()), + ?line SI = erlang:system_info(process_count), + ?line ?t:format("E=~p; P=~p; SI=~p~n", [E, P, SI]), + ?line E = P, + ?line P = SI. + +start_procs(N) -> + lists:map(fun (_) -> + P = spawn_opt(fun () -> + receive after infinity -> bye end + end, + [{priority, max}]), + {P, erlang:monitor(process, P)} + end, + lists:seq(1, N)). + +stop_procs(PMs) -> + lists:foreach(fun ({P, _}) -> + exit(P, boom) + end, PMs), + lists:foreach(fun ({P, M}) -> + receive {'DOWN', M, process, P, boom} -> ok end + end, PMs). + + +system_version(doc) -> []; +system_version(suite) -> []; +system_version(Config) when is_list(Config) -> + ?line {comment, erlang:system_info(system_version)}. + +misc_smoke_tests(doc) -> []; +misc_smoke_tests(suite) -> []; +misc_smoke_tests(Config) when is_list(Config) -> + ?line true = is_binary(erlang:system_info(info)), + ?line true = is_binary(erlang:system_info(procs)), + ?line true = is_binary(erlang:system_info(loaded)), + ?line true = is_binary(erlang:system_info(dist)), + ?line ok. + + + + + + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/system_profile_SUITE_data/echo_drv.c erlang-13.b.3-dfsg/erts/emulator/test/system_profile_SUITE_data/echo_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/system_profile_SUITE_data/echo_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/system_profile_SUITE_data/echo_drv.c 2007-11-26 19:01:45.000000000 +0000 @@ -0,0 +1,66 @@ +#include +#include "erl_driver.h" + +typedef struct _erl_drv_data { + ErlDrvPort erlang_port; +} EchoDrvData; + +static EchoDrvData echo_drv_data, *echo_drv_data_p; + +static EchoDrvData *echo_drv_start(ErlDrvPort port, char *command); +static void echo_drv_stop(EchoDrvData *data_p); +static void echo_drv_output(EchoDrvData *data_p, char *buf, int len); +static void echo_drv_finish(void); +static int echo_drv_control(EchoDrvData *data_p, unsigned int command, + char *buf, int len, + char **rbuf, int rlen); + +static ErlDrvEntry echo_drv_entry = { + NULL, /* init */ + echo_drv_start, + echo_drv_stop, + echo_drv_output, + NULL, /* ready_input */ + NULL, /* ready_output */ + "echo_drv", + echo_drv_finish, + NULL, /* handle */ + echo_drv_control, + NULL, /* timeout */ + NULL, /* outputv */ + NULL /* ready_async */ +}; + +DRIVER_INIT(echo_drv) +{ + echo_drv_data_p = NULL; + return &echo_drv_entry; +} + +static EchoDrvData *echo_drv_start(ErlDrvPort port, char *command) +{ + if (echo_drv_data_p != NULL) { + return ERL_DRV_ERROR_GENERAL; + } + echo_drv_data_p = &echo_drv_data; + echo_drv_data_p->erlang_port = port; + return echo_drv_data_p; +} + +static void echo_drv_stop(EchoDrvData *data_p) { + echo_drv_data_p = NULL; +} + +static void echo_drv_output(EchoDrvData *data_p, char *buf, int len) { + driver_output(data_p->erlang_port, buf, len); +} + +static void echo_drv_finish() { + echo_drv_data_p = NULL; +} + +static int echo_drv_control(EchoDrvData *data_p, unsigned int command, + char *buf, int len, + char **rbuf, int rlen) { + return 0; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/system_profile_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/system_profile_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/system_profile_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/system_profile_SUITE_data/Makefile.src 2007-11-26 19:01:45.000000000 +0000 @@ -0,0 +1,3 @@ +all: echo_drv@dll@ + +@SHLIB_RULES@ diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/system_profile_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/system_profile_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/system_profile_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/system_profile_SUITE.erl 2009-09-18 15:09:22.000000000 +0100 @@ -0,0 +1,474 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +%%% Purpose : Tests system_profile BIF + +-module(system_profile_SUITE). + +-export([all/1, + system_profile_on_and_off/1, + runnable_procs/1, + runnable_ports/1, + scheduler/1 + ]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-export([profiler_process/1, ring_loop/1, port_echo_start/0, list_load/0, run_load/2]). + +-include("test_server.hrl"). + +-define(default_timeout, ?t:minutes(1)). + +init_per_testcase(_Case, Config) -> + ?line Dog=?t:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +all(suite) -> + %% Test specification on test suite level + [system_profile_on_and_off, + runnable_procs, + runnable_ports, + scheduler]. + +%% No specification clause needed for an init function in a conf case!!! + +%% Test switching system_profiling on and off. +system_profile_on_and_off(suite) -> + []; +system_profile_on_and_off(doc) -> + ["Tests switching system_profiling on and off."]; +system_profile_on_and_off(Config) when is_list(Config) -> + ?line Pid = start_profiler_process(), + + % Test runnable_ports on and off + ?line undefined = erlang:system_profile(Pid, [runnable_ports]), + ?line {Pid, [runnable_ports]} = erlang:system_profile(), + ?line {Pid, [runnable_ports]} = erlang:system_profile(undefined, []), + + % Test runnable_procs on and off + ?line undefined = erlang:system_profile(Pid, [runnable_procs]), + ?line {Pid, [runnable_procs]} = erlang:system_profile(), + ?line {Pid, [runnable_procs]} = erlang:system_profile(undefined, []), + + % Test scheduler on and off + ?line undefined = erlang:system_profile(Pid, [scheduler]), + ?line {Pid, [scheduler]} = erlang:system_profile(), + ?line {Pid, [scheduler]} = erlang:system_profile(undefined, []), + + % Test combined runnable_ports, runnable_procs, scheduler; on and off + ?line undefined = erlang:system_profile(Pid, [scheduler, runnable_procs, runnable_ports]), + ?line {Pid, [scheduler,runnable_procs,runnable_ports]} = erlang:system_profile(), + ?line {Pid, [scheduler,runnable_procs,runnable_ports]} = erlang:system_profile(undefined, []), + + % Test turned off and kill process + ?line undefined = erlang:system_profile(), + ?line exit(Pid,kill), + ok. + +%% Test runnable_procs + +runnable_procs(suite) -> + []; +runnable_procs(doc) -> + ["Tests system_profiling with runnable_procs."]; +runnable_procs(Config) when is_list(Config) -> + ?line Pid = start_profiler_process(), + % start a ring of processes + % FIXME: Set #laps and #nodes in config file + Nodes = 10, + Laps = 10, + ?line Master = ring(Nodes), + ?line undefined = erlang:system_profile(Pid, [runnable_procs]), + % loop a message + ?line ok = ring_message(Master, message, Laps), + ?line Events = get_profiler_events(), + ?line kill_em_all = kill_ring(Master), + ?line erlang:system_profile(undefined, []), + put(master, Master), + put(laps, Laps), + ?line true = has_runnable_event(Events), + Pids = sort_events_by_pid(Events), + ?line ok = check_events(Pids), + erase(), + ?line exit(Pid,kill), + ok. + +runnable_ports(suite) -> + []; +runnable_ports(doc) -> + ["Tests system_profiling with runnable_port."]; +runnable_ports(Config) when is_list(Config) -> + ?line Pid = start_profiler_process(), + ?line undefined = erlang:system_profile(Pid, [runnable_ports]), + ?line EchoPid = echo(Config), + % FIXME: Set config to number_of_echos + Laps = 10, + put(laps, Laps), + ?line ok = echo_message(EchoPid, Laps, message), + ?line Events = get_profiler_events(), + ?line kill_em_all = kill_echo(EchoPid), + ?line erlang:system_profile(undefined, []), + ?line true = has_runnable_event(Events), + Pids = sort_events_by_pid(Events), + ?line ok = check_events(Pids), + erase(), + ?line exit(Pid,kill), + ok. + +scheduler(suite) -> + []; +scheduler(doc) -> + ["Tests system_profiling with scheduler."]; +scheduler(Config) when is_list(Config) -> + case {erlang:system_info(smp_support), erlang:system_info(schedulers_online)} of + {false,_} -> ?line {skipped, "No need for scheduler test when smp support is disabled."}; + {_, 1} -> ?line {skipped, "No need for scheduler test when only one scheduler online."}; + _ -> + Nodes = 10, + ?line ok = check_block_system(Nodes), + ?line ok = check_multi_scheduling_block(Nodes), + ok + end. + +%%% Check scheduler profiling + +check_multi_scheduling_block(Nodes) -> + ?line Pid = start_profiler_process(), + ?line undefined = erlang:system_profile(Pid, [scheduler]), + ?line {ok, Supervisor} = start_load(Nodes), + ?line erlang:system_flag(multi_scheduling, block), + ?line erlang:system_flag(multi_scheduling, unblock), + ?line {Pid, [scheduler]} = erlang:system_profile(undefined, []), + ?line Events = get_profiler_events(), + ?line true = has_scheduler_event(Events), + stop_load(Supervisor), + ?line exit(Pid,kill), + erase(), + ok. + +check_block_system(Nodes) -> + ?line Dummy = spawn(?MODULE, profiler_process, [[]]), + ?line Pid = start_profiler_process(), + ?line undefined = erlang:system_profile(Pid, [scheduler]), + ?line {ok, Supervisor} = start_load(Nodes), + % FIXME: remove wait !! + wait(300), + ?line undefined = erlang:system_monitor(Dummy, [busy_port]), + ?line {Dummy, [busy_port]} = erlang:system_monitor(undefined, []), + ?line {Pid, [scheduler]} = erlang:system_profile(undefined, []), + ?line Events = get_profiler_events(), + ?line true = has_scheduler_event(Events), + stop_load(Supervisor), + ?line exit(Pid,kill), + ?line exit(Dummy,kill), + erase(), + ok. + +%%% Check events + +check_events([]) -> ok; +check_events([Pid | Pids]) -> + Master = get(master), + Laps = get(laps), + CheckPids = get(pids), + {Events, N} = get_pid_events(Pid), + ?line ok = check_event_flow(Events), + ?line ok = check_event_ts(Events), + IsMember = lists:member(Pid, CheckPids), + case Pid of + Master -> + io:format("Expected ~p and got ~p profile events from ~p: ok~n", [Laps*2+2, N, Pid]), + ?line N = Laps*2 + 2, + check_events(Pids); + Pid when IsMember == true -> + io:format("Expected ~p and got ~p profile events from ~p: ok~n", [Laps*2, N, Pid]), + ?line N = Laps*2, + check_events(Pids); + Pid -> + check_events(Pids) + end. + +%% timestamp consistency check for descending timestamps + +check_event_ts(Events) -> + check_event_ts(Events, undefined). +check_event_ts([], _) -> ok; +check_event_ts([Event | Events], undefined) -> + check_event_ts(Events, Event); +check_event_ts([{Pid, _, _, TS1}=Event | Events], {Pid,_,_,TS0}) -> + Time = timer:now_diff(TS1, TS0), + if + Time < 0.0 -> timestamp_error; + true -> check_event_ts(Events, Event) + end. + +%% consistency check for active vs. inactive activity (runnable) + +check_event_flow(Events) -> + check_event_flow(Events, undefined). +check_event_flow([], _) -> ok; +check_event_flow([Event | PidEvents], undefined) -> + check_event_flow(PidEvents, Event); +check_event_flow([{Pid,Act,_,_}=Event | Events], PrevEvent) -> + case PrevEvent of + {Pid, Act, _MFA, _TS} -> consistency_error; + _ -> check_event_flow(Events, Event) + end. + + + +get_pid_events(Pid) -> + Events = get({pid_events, Pid}), + {Events, length(Events)}. + +sort_events_by_pid(Events) -> + sort_events_by_pid(lists:reverse(Events), []). +sort_events_by_pid([], Pids) -> Pids; +sort_events_by_pid([Event | Events],Pids) -> + case Event of + {profile,Pid,Act,MFA,TS} -> + case get({pid_events, Pid}) of + undefined -> + put({pid_events, Pid}, [{Pid,Act,MFA,TS}]), + sort_events_by_pid(Events, [Pid | Pids]); + PidEvents -> + put({pid_events, Pid}, [{Pid,Act,MFA,TS}|PidEvents]), + sort_events_by_pid(Events, Pids) + end + end. + + +%%% +%% Process ring +%%% + +%% API + +% Returns master pid +ring(N) -> + Pids = build_ring(N, []), + put(pids, Pids), + setup_ring(Pids). + +ring_message(Master, Message, Laps) -> + Master ! {message, Master, Laps, Message}, + receive + {laps_complete, Master} -> ok + end. + +kill_ring(Master) -> Master ! kill_em_all. + +%% Process ring helpers + +build_ring(0, Pids) -> Pids; +build_ring(N, Pids) -> + build_ring(N - 1, [spawn_link(?MODULE, ring_loop, [undefined]) | Pids]). + +setup_ring([Master | Relayers]) -> + % Relayers may not include the master pid + Master ! {setup_ring, Relayers, self()}, + receive + {setup_complete, Master} -> Master + end. + +ring_loop(RelayTo) -> + receive + kill_em_all -> + RelayTo ! kill_em_all; + {setup_ring, [Pid | Pids], Supervisor} -> + put(supervisor, Supervisor), + Pid ! {relay_to, Pids, self()}, + ring_loop(Pid); + {setup_complete, _} -> + get(supervisor) ! {setup_complete, self()}, + ring_loop(RelayTo); + {relay_to, [], Master} -> + Master ! {setup_complete, self()}, + ring_loop(Master); + {relay_to, [Pid | Pids], Master} -> + Pid ! {relay_to, Pids, Master}, + ring_loop(Pid); + {message, Master, Lap, Msg}=Message -> + case {self(), Lap} of + {Master, 0} -> + get(supervisor) ! {laps_complete, self()}, + ring_loop(RelayTo); + {Master, Lap} -> + RelayTo ! {message, Master, Lap - 1, Msg}, + ring_loop(RelayTo); + _ -> + RelayTo ! Message, + ring_loop(RelayTo) + end + end. + +%%% +%% Echo driver +%%% + +%% API + +echo(Config) -> + Path = ?config(data_dir, Config), + erl_ddll:load_driver(Path, echo_drv), + Pid = spawn_link(?MODULE, port_echo_start, []), + Pid ! {self(), get_ports}, + receive + {port, Port} -> + put(pids, [Port]), + put(master, Port), + Pid + end. + +echo_message(Pid, N, Msg) -> + Pid ! {start_echo, self(), N, Msg}, + receive + {echo_complete, Pid} -> ok + end. + +kill_echo(Pid) -> Pid ! kill_em_all. + + +%% Echo driver helpers +port_echo_start() -> + Port = open_port({spawn,echo_drv}, [eof,binary]), + receive + {Pid, get_ports} -> + Pid ! {port, Port}, + port_echo_loop(Port) + end. + +port_echo_loop(Port) -> + receive + {start_echo, Pid, Echos, Msg} -> + port_command(Port, term_to_binary({Pid, Echos, Msg})), + port_echo_loop(Port); + {Port, {data, Data}} -> + {Pid, Echos, Msg} = binary_to_term(Data), + case Echos of + 0 -> + Pid ! {echo_complete, self()}, + port_echo_loop(Port); + Echos -> + port_command(Port, term_to_binary({Pid, Echos - 1, Msg})), + port_echo_loop(Port) + end; + kill_em_all -> + port_close(Port), + ok + end. + + + +%%% +%% Helpers +%%% + +start_load(N) -> + Pid = spawn_link(?MODULE, run_load, [N, []]), + {ok, Pid}. + + +stop_load(Supervisor) -> + erlang:unlink(Supervisor), + exit(Supervisor, kill). + +run_load(0, _Pids) -> + receive + % wait for an exit signal or a message then kill + % all associated processes. + _ -> exit(annihilated) + end; +run_load(N, Pids) -> + Pid = spawn_link(?MODULE, list_load, []), + run_load(N - 1, [Pid | Pids]). + +list_load() -> + ok = case math:sin(random:uniform(32451)) of + A when is_float(A) -> ok; + _ -> ok + end, + list_load(). + + +has_scheduler_event(Events) -> + lists:any( + fun (Pred) -> + case Pred of + {profile, scheduler, _ID, _Activity, _NR, _TS} -> true; + _ -> false + end + end, Events). + +has_runnable_event(Events) -> + lists:any( + fun (Pred) -> + case Pred of + {profile, _Pid, _Activity, _MFA, _TS} -> true; + _ -> false + end + end, Events). + +wait(Time) -> receive after Time -> ok end. + +%%% +%% Receivers +%%% + +%% Process receiver + + +get_profiler_events() -> + Pid = get(profiler), + Pid ! {self(), get_events}, + receive + Events -> Events + end. + +start_profiler_process() -> + Pid = spawn(?MODULE, profiler_process, [[]]), + put(profiler, Pid), + Pid. + +profiler_process(Events) -> + receive + {Pid, get_events} -> + Ref = erlang:trace_delivered(all), + profiler_process_followup(Pid, Events, Ref); + Event -> + profiler_process([Event | Events]) + end. + +profiler_process_followup(Pid, Events, Ref) -> + receive + {trace_delivered,all,Ref} -> + Pid ! lists:reverse(Events); + Event -> + profiler_process_followup(Pid, [Event | Events], Ref) + end. + +%% Port receiver + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/timer_bif_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/timer_bif_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/timer_bif_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/timer_bif_SUITE.erl 2009-09-18 15:07:51.000000000 +0100 @@ -0,0 +1,558 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(timer_bif_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2,end_per_suite/1]). +-export([start_timer_1/1, send_after_1/1, send_after_2/1, send_after_3/1, + cancel_timer_1/1, + start_timer_big/1, send_after_big/1, + start_timer_e/1, send_after_e/1, cancel_timer_e/1, + read_timer_trivial/1, read_timer/1, + cleanup/1, evil_timers/1, registered_process/1]). + +-include("test_server.hrl"). + +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(test_server:seconds(30)), + case catch erts_debug:get_internal_state(available_internal_state) of + true -> ok; + _ -> erts_debug:set_internal_state(available_internal_state, true) + end, + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +end_per_suite(_Config) -> + catch erts_debug:set_internal_state(available_internal_state, false). + +all(suite) -> + [start_timer_1, send_after_1, send_after_2, cancel_timer_1, + start_timer_e, send_after_e, cancel_timer_e, + start_timer_big, send_after_big, read_timer_trivial, read_timer, + cleanup, evil_timers, registered_process]. + +start_timer_1(doc) -> ["Basic start_timer/3 functionality"]; +start_timer_1(Config) when is_list(Config) -> + ?line Ref1 = erlang:start_timer(1000, self(), plopp), + ?line ok = get(1100, {timeout, Ref1, plopp}), + + ?line false = erlang:read_timer(Ref1), + ?line false = erlang:cancel_timer(Ref1), + ?line false = erlang:read_timer(Ref1), + + ?line Ref2 = erlang:start_timer(1000, self(), plapp), + ?line Left2 = erlang:cancel_timer(Ref2), + UpperLimit = case os:type() of + vxworks -> + %% The ticks of vxworks have a far lesser granularity + %% than what is expected in this testcase, in + %% fact the Left2 variable can get a little more than 1000... + 1100; + _ -> + 1000 + end, + ?line RetVal = case os:type() of + vxworks -> + {comment, "VxWorks behaves slightly unexpected, should be fixed,"}; + _ -> + ok + end, + ?line true = (Left2 > 900) and (Left2 =< UpperLimit), + ?line empty = get_msg(), + ?line false = erlang:cancel_timer(Ref2), + + ?line Ref3 = erlang:start_timer(1000, self(), plopp), + ?line no_message = get(900, {timeout, Ref3, plopp}), + + RetVal. + +send_after_1(doc) -> ["Basic send_after/3 functionality"]; +send_after_1(Config) when is_list(Config) -> + ?line Ref3 = erlang:send_after(1000, self(), plipp), + ?line ok = get(1500, plipp), + ?line false = erlang:read_timer(Ref3), + ok. + +start_timer_big(doc) -> ["Big timeouts for start_timer/3"]; +start_timer_big(Config) when is_list(Config) -> + ?line Big = 1 bsl 31, + ?line R = erlang:start_timer(Big, self(), hej), + ?line timer:sleep(200), + ?line Left = erlang:cancel_timer(R), + ?line case Big - Left of + Diff when Diff >= 200, Diff < 10000 -> + ok; + _Diff -> + test_server:fail({big, Big, Left}) + end, + ok. + +send_after_big(doc) -> ["Big timeouts for send_after/3"]; +send_after_big(Config) when is_list(Config) -> + ?line Big = 1 bsl 31, + ?line R = erlang:send_after(Big, self(), hej), + ?line timer:sleep(200), + ?line Left = erlang:cancel_timer(R), + ?line case Big - Left of + Diff when Diff >= 200, Diff < 10000 -> + ok; + _Diff -> + test_server:fail({big, Big, Left}) + end, + ok. + +send_after_2(doc) -> ["send_after/3: messages in the right order, kind version"]; +send_after_2(Config) when is_list(Config) -> + ?line _ = erlang:send_after(5000, self(), last), + ?line _ = erlang:send_after(0, self(), a0), + ?line _ = erlang:send_after(200, self(), a2), + ?line _ = erlang:send_after(100, self(), a1), + ?line _ = erlang:send_after(500, self(), a5), + ?line _ = erlang:send_after(300, self(), a3), + ?line _ = erlang:send_after(400, self(), a4), + ?line [a0,a1,a2,a3,a4,a5,last] = collect(last), + ok. + +send_after_3(doc) -> ["send_after/3: messages in the right order, worse than send_after_2"]; +send_after_3(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {skipped, "VxWorks timer granularity and order is not working good, this is subject to change!"}; + _ -> + do_send_after_3() + end. + +do_send_after_3() -> + ?line _ = erlang:send_after(100, self(), b1), + ?line _ = erlang:send_after(101, self(), b2), + ?line _ = erlang:send_after(102, self(), b3), + ?line _ = erlang:send_after(103, self(), last), + ?line [b1, b2, b3, last] = collect(last), + +% This behaviour is not guaranteed: +% ?line _ = erlang:send_after(100, self(), c1), +% ?line _ = erlang:send_after(100, self(), c2), +% ?line _ = erlang:send_after(100, self(), c3), +% ?line _ = erlang:send_after(100, self(), last), +% ?line [c1, c2, c3, last] = collect(last), + + ok. + +cancel_timer_1(doc) -> ["Check trivial cancel_timer/1 behaviour"]; +cancel_timer_1(Config) when is_list(Config) -> + ?line false = erlang:cancel_timer(make_ref()), + + ok. + +start_timer_e(doc) -> ["Error cases for start_timer/3"]; +start_timer_e(Config) when is_list(Config) -> + ?line {'EXIT', _} = (catch erlang:start_timer(-4, self(), hej)), + ?line {'EXIT', _} = (catch erlang:start_timer(4728472847827482, + self(), hej)), + + ?line {'EXIT', _} = (catch erlang:start_timer(4.5, self(), hej)), + ?line {'EXIT', _} = (catch erlang:start_timer(a, self(), hej)), + + ?line Node = start_slave(), + ?line Pid = spawn(Node, timer, sleep, [10000]), + ?line {'EXIT', _} = (catch erlang:start_timer(1000, Pid, hej)), + ?line stop_slave(Node), + + + ok. + +send_after_e(doc) -> ["Error cases for send_after/3"]; +send_after_e(suite) -> []; +send_after_e(Config) when is_list(Config) -> + ?line {'EXIT', _} = (catch erlang:send_after(-4, self(), hej)), + ?line {'EXIT', _} = (catch erlang:send_after(4728472847827482, + self(), hej)), + + ?line {'EXIT', _} = (catch erlang:send_after(4.5, self(), hej)), + ?line {'EXIT', _} = (catch erlang:send_after(a, self(), hej)), + + ?line Node = start_slave(), + ?line Pid = spawn(Node, timer, sleep, [10000]), + ?line {'EXIT', _} = (catch erlang:send_after(1000, Pid, hej)), + ?line stop_slave(Node), + ok. + +cancel_timer_e(doc) -> ["Error cases for cancel_timer/1"]; +cancel_timer_e(suite) -> []; +cancel_timer_e(Config) when is_list(Config) -> + ?line {'EXIT', _} = (catch erlang:cancel_timer(1)), + ?line {'EXIT', _} = (catch erlang:cancel_timer(self())), + ?line {'EXIT', _} = (catch erlang:cancel_timer(a)), + ok. + +read_timer_trivial(doc) -> ["Trivial and error test cases for read_timer/1."]; +read_timer_trivial(suite) -> []; +read_timer_trivial(Config) when is_list(Config) -> + ?line false = erlang:read_timer(make_ref()), + ?line {'EXIT', _} = (catch erlang:read_timer(42)), + ?line {'EXIT', _} = (catch erlang:read_timer(423497834744444444457667444444)), + ?line {'EXIT', _} = (catch erlang:read_timer(self())), + ?line {'EXIT', _} = (catch erlang:read_timer(ab)), + ok. + +read_timer(doc) -> ["Test that read_timer/1 seems to return the correct values."]; +read_timer(suite) -> []; +read_timer(Config) when is_list(Config) -> + ?line Big = 1 bsl 31, + ?line R = erlang:send_after(Big, self(), hej_hopp), + + ?line receive after 200 -> ok end, % Delay and clear reductions. + ?line Left = erlang:read_timer(R), + ?line Left = erlang:cancel_timer(R), + ?line false = erlang:read_timer(R), + + ?line case Big - Left of + Diff when Diff >= 200, Diff < 10000 -> + ok; + _Diff -> + test_server:fail({big, Big, Left}) + end, + ok. + +cleanup(doc) -> []; +cleanup(suite) -> []; +cleanup(Config) when is_list(Config) -> + ?line Mem = mem(), + %% Timer on dead process + ?line P1 = spawn(fun () -> ok end), + ?line wait_until(fun () -> process_is_cleaned_up(P1) end), + ?line T1 = erlang:start_timer(10000, P1, "hej"), + ?line T2 = erlang:send_after(10000, P1, "hej"), + ?line Mem = mem(), + ?line false = erlang:read_timer(T1), + ?line false = erlang:read_timer(T2), + ?line Mem = mem(), + %% Process dies before timeout + ?line P2 = spawn(fun () -> receive after 500 -> ok end end), + ?line T3 = erlang:start_timer(10000, P2, "hej"), + ?line T4 = erlang:send_after(10000, P2, "hej"), + ?line true = Mem < mem(), + ?line true = is_integer(erlang:read_timer(T3)), + ?line true = is_integer(erlang:read_timer(T4)), + ?line wait_until(fun () -> process_is_cleaned_up(P2) end), + ?line false = erlang:read_timer(T3), + ?line false = erlang:read_timer(T4), + ?line Mem = mem(), + %% Cancel timer + ?line P3 = spawn(fun () -> receive after 20000 -> ok end end), + ?line T5 = erlang:start_timer(10000, P3, "hej"), + ?line T6 = erlang:send_after(10000, P3, "hej"), + ?line true = Mem < mem(), + ?line true = is_integer(erlang:cancel_timer(T5)), + ?line true = is_integer(erlang:cancel_timer(T6)), + ?line false = erlang:read_timer(T5), + ?line false = erlang:read_timer(T6), + ?line exit(P3, kill), + ?line Mem = mem(), + %% Timeout + ?line Ref = make_ref(), + ?line T7 = erlang:start_timer(500, self(), Ref), + ?line T8 = erlang:send_after(500, self(), Ref), + ?line true = Mem < mem(), + ?line true = is_integer(erlang:read_timer(T7)), + ?line true = is_integer(erlang:read_timer(T8)), + ?line receive {timeout, T7, Ref} -> ok end, + ?line receive Ref -> ok end, + ?line Mem = mem(), + ?line ok. + + +evil_timers(doc) -> []; +evil_timers(suite) -> []; +evil_timers(Config) when is_list(Config) -> + %% Create a composite term consisting of at least: + %% * externals (remote pids, ports, and refs) + %% * large (off heap) binaries + %% * small (heap) binaries + %% * funs + %% * bignums + %% * tuples + %% * lists + %% since data of these types have to be adjusted if moved + %% in memory + ?line Self = self(), + ?line R1 = make_ref(), + ?line Node = start_slave(), + ?line spawn_link(Node, + fun () -> + Self ! {R1, + [lists:sublist(erlang:ports(), 3), + [make_ref(), make_ref(), make_ref()], + lists:sublist(processes(), 3), + [fun () -> gurka end, + fun (A) -> A + 1 end, + fun (A, B) -> A + B end]]} + end), + ?line ExtList = receive {R1, L} -> L end, + ?line stop_slave(Node), + ?line BinList = [<<"bla">>, + <<"blipp">>, + <<"blupp">>, + list_to_binary(lists:duplicate(1000000,$a)), + list_to_binary(lists:duplicate(1000000,$b)), + list_to_binary(lists:duplicate(1000000,$c))], + ?line FunList = [fun () -> gurka end, + fun (A) -> A + 1 end, + fun (A, B) -> A + B end], + ?line PidList = lists:sublist(processes(), 3), + ?line PortList = lists:sublist(erlang:ports(), 3), + ?line RefList = [make_ref(), make_ref(), make_ref()], + ?line BigList = [111111111111, 22222222222222, 333333333333333333], + ?line Msg = {BinList,[FunList,{RefList,ExtList,PidList,PortList,BigList}]}, + %% ?line ?t:format("Msg=~p~n",[Msg]), + + ?line Prio = process_flag(priority, max), + %% + %% In the smp case there are four major cases we want to test: + %% + %% 1. A timer started with erlang:start_timer(Time, Receiver, Msg), + %% where Msg is a composite term, expires, and the receivers main + %% lock *can not* be acquired immediately (typically when the + %% receiver *is* running). + %% + %% The wrap tuple ({timeout, TRef, Msg}) will in this case + %% be allocated in the previously allocated message buffer along + %% with Msg, i.e. the previously allocated message buffer will be + %% reallocated and potentially moved. + ?line TimeOutMsgs0 = evil_setup_timers(200, Self, Msg), + ?line RecvTimeOutMsgs0 = evil_recv_timeouts(200), + %% 2. A timer started with erlang:start_timer(Time, Receiver, Msg), + %% where Msg is an immediate term, expires, and the receivers main + %% lock *can not* be acquired immediately (typically when the + %% receiver *is* running). + %% + %% The wrap tuple will in this case be allocated in a new + %% message buffer. + ?line TimeOutMsgs1 = evil_setup_timers(200, Self, immediate), + ?line RecvTimeOutMsgs1 = evil_recv_timeouts(200), + %% 3. A timer started with erlang:start_timer(Time, Receiver, Msg), + %% where Msg is a composite term, expires, and the receivers main + %% lock *can* be acquired immediately (typically when the receiver + %% *is not* running). + %% + %% The wrap tuple will in this case be allocated on the receivers + %% heap, and Msg is passed in the previously allocated message + %% buffer. + ?line R2 = make_ref(), + ?line spawn_link(fun () -> + Self ! {R2, evil_setup_timers(200, Self, Msg)} + end), + ?line receive after 1000 -> ok end, + ?line TimeOutMsgs2 = receive {R2, TOM2} -> TOM2 end, + ?line RecvTimeOutMsgs2 = evil_recv_timeouts(200), + %% 4. A timer started with erlang:start_timer(Time, Receiver, Msg), + %% where Msg is an immediate term, expires, and the Receivers main + %% lock *can* be acquired immediately (typically when the receiver + %% *is not* running). + %% + %% The wrap tuple will in this case be allocated on the receivers + %% heap. + ?line R3 = make_ref(), + ?line spawn_link(fun () -> + Self ! {R3, evil_setup_timers(200,Self,immediate)} + end), + ?line receive after 1000 -> ok end, + ?line TimeOutMsgs3 = receive {R3, TOM3} -> TOM3 end, + ?line RecvTimeOutMsgs3 = evil_recv_timeouts(200), + + %% Garge collection will hopefully crash the emulator if something + %% is wrong... + ?line garbage_collect(), + ?line garbage_collect(), + ?line garbage_collect(), + + %% Make sure we got the timeouts we expected + %% + %% Note timeouts are *not* guaranteed to be delivered in order + ?line ok = match(lists:sort(RecvTimeOutMsgs0), lists:sort(TimeOutMsgs0)), + ?line ok = match(lists:sort(RecvTimeOutMsgs1), lists:sort(TimeOutMsgs1)), + ?line ok = match(lists:sort(RecvTimeOutMsgs2), lists:sort(TimeOutMsgs2)), + ?line ok = match(lists:sort(RecvTimeOutMsgs3), lists:sort(TimeOutMsgs3)), + + ?line process_flag(priority, Prio), + ?line ok. + +evil_setup_timers(N, Receiver, Msg) -> + ?line evil_setup_timers(0, N, Receiver, Msg, []). + +evil_setup_timers(N, N, _Receiver, _Msg, TOs) -> + ?line TOs; +evil_setup_timers(N, Max, Receiver, Msg, TOs) -> + ?line TRef = erlang:start_timer(N, Receiver, Msg), + ?line evil_setup_timers(N+1, Max, Receiver, Msg, [{timeout,TRef,Msg}|TOs]). + + +evil_recv_timeouts(M) -> + ?line evil_recv_timeouts([], 0, M). + +evil_recv_timeouts(TOs, N, N) -> + ?line TOs; +evil_recv_timeouts(TOs, N, M) -> + ?line receive + {timeout, _, _} = TO -> + ?line evil_recv_timeouts([TO|TOs], N+1, M) + after 0 -> + ?line evil_recv_timeouts(TOs, N, M) + end. + +registered_process(doc) -> []; +registered_process(suite) -> []; +registered_process(Config) when is_list(Config) -> + ?line Mem = mem(), + %% Cancel + ?line T1 = erlang:start_timer(500, ?MODULE, "hej"), + ?line T2 = erlang:send_after(500, ?MODULE, "hej"), + ?line undefined = whereis(?MODULE), + ?line true = Mem < mem(), + ?line true = is_integer(erlang:cancel_timer(T1)), + ?line true = is_integer(erlang:cancel_timer(T2)), + ?line false = erlang:read_timer(T1), + ?line false = erlang:read_timer(T2), + ?line Mem = mem(), + %% Timeout register after start + ?line Ref1 = make_ref(), + ?line T3 = erlang:start_timer(500, ?MODULE, Ref1), + ?line T4 = erlang:send_after(500, ?MODULE, Ref1), + ?line undefined = whereis(?MODULE), + ?line true = Mem < mem(), + ?line true = is_integer(erlang:read_timer(T3)), + ?line true = is_integer(erlang:read_timer(T4)), + ?line true = register(?MODULE, self()), + ?line receive {timeout, T3, Ref1} -> ok end, + ?line receive Ref1 -> ok end, + ?line Mem = mem(), + %% Timeout register before start + ?line Ref2 = make_ref(), + ?line T5 = erlang:start_timer(500, ?MODULE, Ref2), + ?line T6 = erlang:send_after(500, ?MODULE, Ref2), + ?line true = Mem < mem(), + ?line true = is_integer(erlang:read_timer(T5)), + ?line true = is_integer(erlang:read_timer(T6)), + ?line receive {timeout, T5, Ref2} -> ok end, + ?line receive Ref2 -> ok end, + ?line Mem = mem(), + ?line true = unregister(?MODULE), + ?line ok. + +mem() -> + AA = erlang:system_info(allocated_areas), + {value,{bif_timer,Mem}} = lists:keysearch(bif_timer, 1, AA), + Mem. + +process_is_cleaned_up(P) when is_pid(P) -> + undefined == erts_debug:get_internal_state({process_status, P}). + +wait_until(Pred) when is_function(Pred) -> + case catch Pred() of + true -> ok; + _ -> receive after 50 -> ok end, wait_until(Pred) + end. + +get(Time, Msg) -> + receive + Msg -> + ok + after Time + -> + no_message + end. + +get_msg() -> + receive + Msg -> + {ok, Msg} + after 0 -> + empty + end. + +start_slave() -> + ?line {A, B, C} = now(), + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line Name = atom_to_list(?MODULE) ++ "-" ++ integer_to_list(A+B+C), + {ok, Node} = ?t:start_node(Name, slave, [{args, "-pa " ++ Pa}]), + Node. + +stop_slave(Node) -> + test_server:stop_node(Node). + +collect(Last) -> + collect(Last, []). + +receive_one() -> + receive + Msg -> + Msg + end. + +collect(Last, Msgs0) -> + Msg = receive_one(), + Msgs = Msgs0 ++ [Msg], + case Msg of + Last -> + Msgs; + _ -> + collect(Last, Msgs) + end. + +match(X, X) -> + %erlang:display({match, X}), + ok; +match(X, Y) -> + %erlang:display({mismatch, X, Y}), + match_aux(X, Y). + +match_aux(X, X) -> + unexpected_error; +match_aux(X, Y) when is_list(X), is_list(Y), length(X) =/= length(Y) -> + %% erlang:display({mismatch, X, Y}), + {list_length_mismatch, length(X), length(Y)}; +match_aux([X|Xs], [X|Ys]) -> + match_aux(Xs, Ys); +match_aux([X|_], [Y|_]) -> + match_aux(X, Y); +match_aux(X, Y) when is_tuple(X), is_tuple(Y), size(X) =/= size(Y) -> + %% erlang:display({mismatch, X, Y}), + {tuple_size_mismatch, size(X), size(Y)}; +match_aux(X, Y) when is_tuple(X), is_tuple(Y) -> + match_aux(tuple_to_list(X), tuple_to_list(Y)); +match_aux(X, Y) -> + %% erlang:display({mismatch, X, Y}), + {mismatch, type(X), type(Y)}. + +type(X) when is_list(X) -> list; +type(X) when is_tuple(X) -> tuple; +type(X) when is_float(X) -> float; +type(X) when is_integer(X) -> integer; +type(X) when is_pid(X) -> {pid, node(X)}; +type(X) when is_reference(X) -> {reference, node(X)}; +type(X) when is_port(X) -> {port, node(X)}; +type(X) when is_binary(X) -> binary; +type(X) when is_atom(X) -> atom; +type(_) -> unknown. + + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/time_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/time_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/time_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/time_SUITE.erl 2009-09-18 15:07:28.000000000 +0100 @@ -0,0 +1,439 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(time_SUITE). + +%% "Time is on my side." -- The Rolling Stones + +%% Tests the BIFs: +%% erlang:localtime_to_universaltime/1 +%% erlang:universaltime_to_localtime/1 +%% date/0 +%% time/0 +%% now/0 +%% + +-export([all/1, univ_to_local/1, local_to_univ/1, + bad_univ_to_local/1, bad_local_to_univ/1, + consistency/1, + now/1, now_unique/1, now_update/1, timestamp/1]). + +-include("test_server.hrl"). + +-export([linear_time/1]). + +%% The following defines the timezone in which the test is run. +%% It is interpreted as the number of hours to be added to UTC +%% to obtain the local time. The number will be positive east +%% of Greenwhich, negative west of Greenwhich. +%% +%% Allowable range is -12 through 11. + +-define(timezone, 1). + +%% Similarly to timezone, but the difference when Daylight Saving Time +%% is in use. [Same range.] + +-define(dst_timezone, 2). + +all(suite) -> [univ_to_local, local_to_univ, + bad_univ_to_local, bad_local_to_univ, consistency, now, timestamp]. + + +%% Tests conversion from univeral to local time. + +univ_to_local(Config) when is_list(Config) -> + ?line test_univ_to_local(test_data()). + +test_univ_to_local([{Utc, Local}|Rest]) -> + ?line io:format("Testing ~p => ~p~n", [Local, Utc]), + ?line Local = erlang:universaltime_to_localtime(Utc), + ?line test_univ_to_local(Rest); +test_univ_to_local([]) -> + ok. + +%% Tests conversion from local to universal time. + +local_to_univ(Config) when is_list(Config) -> + ?line test_local_to_univ(test_data()). + +test_local_to_univ([{Utc, Local}|Rest]) -> + ?line io:format("Testing ~p => ~p~n", [Utc, Local]), + ?line Utc = erlang:localtime_to_universaltime(Local), + ?line test_local_to_univ(Rest); +test_local_to_univ([]) -> + ok. + +%% Test bad arguments to erlang:universaltime_to_localtime; should +%% generate a badarg. + +bad_univ_to_local(Config) when is_list(Config) -> + ?line bad_test_univ_to_local(bad_dates()). + +bad_test_univ_to_local([Utc|Rest]) -> + ?line io:format("Testing ~p~n", [Utc]), + ?line case catch erlang:universaltime_to_localtime(Utc) of + {'EXIT', {badarg, _}} -> bad_test_univ_to_local(Rest) + end; +bad_test_univ_to_local([]) -> + ok. + +%% Test bad arguments to erlang:localtime_to_universaltime/1; should +%% generate a badarg. + +bad_local_to_univ(Config) when is_list(Config) -> + ?line bad_test_local_to_univ(bad_dates()). + +bad_test_local_to_univ([Local|Rest]) -> + ?line io:format("Testing ~p~n", [Local]), + ?line case catch erlang:localtime_to_universaltime(Local) of + {'EXIT', {badarg, _}} -> bad_test_local_to_univ(Rest) + end; +bad_test_local_to_univ([]) -> + ok. + +%% Test that the the different time functions return +%% consistent results. (See the test case for assumptions +%% and limitations.) +consistency(Config) when is_list(Config) -> + %% Test the following equations: + %% date() & time() == erlang:localtime() + %% erlang:universaltime() + timezone == erlang:localtime() + %% + %% Assumptions: + %% Middle-European time zone, EU rules for daylight-saving time. + %% + %% Limitations: + %% Localtime and universaltime must be in the same month. + %% Daylight-saving calculations are incorrect from the last + %% Sunday of March and October to the end of the month. + + ?line ok = compare_date_time_and_localtime(16), + ?line ok = compare_local_and_universal(16). + +compare_date_time_and_localtime(Times) when Times > 0 -> + ?line {Year, Mon, Day} = date(), + ?line {Hour, Min, Sec} = time(), + ?line case erlang:localtime() of + {{Year, Mon, Day}, {Hour, Min, Sec}} -> ok; + _ -> compare_date_time_and_localtime(Times-1) + end; +compare_date_time_and_localtime(0) -> + error. + +compare_local_and_universal(Times) when Times > 0 -> + case compare(erlang:universaltime(), erlang:localtime()) of + true -> ok; + false -> compare_local_and_universal(Times-1) + end; +compare_local_and_universal(0) -> + error. + +compare(Utc0, Local) -> + io:format("local = ~p, utc = ~p", [Local, Utc0]), + Utc = linear_time(Utc0)+effective_timezone(Utc0)*3600, + case linear_time(Local) of + Utc -> true; + Other -> + io:format("Failed: local = ~p, utc = ~p~n", + [Other, Utc]), + false + end. + +%% This function converts a date and time to a linear time. +%% Two linear times can be subtracted to give their difference +%% in seconds. +%% +%% XXX Limitations: The length of months and leap years are not +%% taken into account; thus a comparision of dates is only +%% valid if they are in the SAME month. + +linear_time({{Year, Mon, Day}, {Hour, Min, Sec}}) -> + 86400*(366*Year + 31*(Mon-1) + (Day-1)) + + 3600*Hour + 60*Min + Sec. + +%% This functions returns either the normal timezone or the +%% the DST timezone, depending on the given UTC time. +%% +%% XXX This function uses an approximation of the EU rule for +%% daylight saving time. This function will fail in the +%% following intervals: After the last Sunday in March upto +%% the end of March, and after the last Sunday in October +%% upto the end of October. + +effective_timezone(Time) -> + case os:type() of + {unix,_} -> + case os:cmd("date '+%Z'") of + "SAST"++_ -> + 2; + _ -> + effective_timezone1(Time) + end; + _ -> + effective_timezone1(Time) + end. + +effective_timezone1({{_Year,Mon,_Day}, _}) when Mon < 4 -> + ?timezone; +effective_timezone1({{_Year,Mon,_Day}, _}) when Mon > 10 -> + ?timezone; +effective_timezone1(_) -> + ?dst_timezone. + +%% Test (the bif) os:timestamp/0, which is something quite like, but not +%% similar to erlang:now... + +timestamp(suite) -> + []; +timestamp(doc) -> + ["Test that os:timestamp works."]; +timestamp(Config) when is_list(Config) -> + repeating_timestamp_check(100000). + +repeating_timestamp_check(0) -> + ok; +repeating_timestamp_check(N) -> + {A,B,C} = TS = os:timestamp(), + if + is_integer(A), + is_integer(B), + is_integer(C), + B < 1000000, + C < 1000000 -> + ok; + true -> + test_server:fail( + lists:flatten( + io_lib:format("Strange return from os:timestamp/0 ~w~n",[TS]))) + end, + %% I assume the now and timestamp should not differ more than 1 hour, + %% which is safe assuming the system has not had a large time-warp + %% during the testrun... + Secs = A*1000000+B+round(C/1000000), + {NA,NB,NC} = erlang:now(), + NSecs = NA*1000000+NB+round(NC/1000000), + case Secs - NSecs of + TooLarge when TooLarge > 3600 -> + test_server:fail( + lists:flatten( + io_lib:format("os:timestamp/0 is ~w s more than erlang:now/0", + [TooLarge]))); + TooSmall when TooSmall < -3600 -> + test_server:fail( + lists:flatten( + io_lib:format("os:timestamp/0 is ~w s less than erlang:now/0", + [-TooSmall]))); + _ -> + ok + end, + repeating_timestamp_check(N-1). + + +%% Test now/0. + +now(suite) -> [now_unique, now_update]. + +%% Tests that successive calls to now/0 returns different values. +%% Also returns a comment string with the median difference between +%% times (in microseconds). + +now_unique(Config) when is_list(Config) -> + ?line now_unique(1000, now(), []), + ?line fast_now_unique(100000, now()). + +now_unique(N, Previous, Result) when N > 0 -> + ?line case now() of + Previous -> + test_server:fail("now/0 returned the same value twice"); + New -> + now_unique(N-1, New, [New|Result]) + end; +now_unique(0, _, [Then|Rest]) -> + ?line now_calc_increment(Rest, microsecs(Then), []). + +now_calc_increment([Then|Rest], Previous, _Result) -> + ?line This = microsecs(Then), + ?line now_calc_increment(Rest, This, [Previous-This]); +now_calc_increment([], _, Differences) -> + {comment, "Median increment: " ++ integer_to_list(median(Differences))}. + +fast_now_unique(0, _) -> ok; +fast_now_unique(N, Then) -> + case now() of + Then -> + ?line ?t:fail("now/0 returned the same value twice"); + Now -> + fast_now_unique(N-1, Now) + end. + +median(Unsorted_List) -> + ?line Length = length(Unsorted_List), + ?line List = lists:sort(Unsorted_List), + ?line case Length rem 2 of + 0 -> % Even length. + [A, B] = lists:nthtail((Length div 2)-1, List), + (A+B)/2; + 1 -> % Odd list length. + lists:nth((Length div 2)+1, List) + end. + +microsecs({Mega_Secs, Secs, Microsecs}) -> + (Mega_Secs*1000000+Secs)*1000000+Microsecs. + +%% Test that the time differences returned by two calls to +%% now/0 one second apart is comparable to the difference of two +%% calls to erlang:localtime(). + +now_update(Config) when is_list(Config) -> + case ?t:is_debug() of + false -> ?line now_update1(10); + true -> {skip,"Unreliable in DEBUG build"} + end. + + +now_update1(N) when N > 0 -> + ?line T1_linear = linear_time(erlang:localtime()), + ?line T1_now = microsecs(now()), + + ?line receive after 1008 -> ok end, + + ?line T2_linear = linear_time(erlang:localtime()), + ?line T2_now = microsecs(now()), + + ?line Linear_Diff = (T2_linear-T1_linear)*1000000, + ?line Now_Diff = T2_now-T1_now, + test_server:format("Localtime diff = ~p; now() diff = ~p", + [Linear_Diff, Now_Diff]), + ?line case abs(Linear_Diff - Now_Diff) of + Abs_Delta when Abs_Delta =< 40000 -> ok; + _ -> now_update1(N-1) + end; +now_update1(0) -> + ?line test_server:fail(). + +%% Returns the test data: a list of {Utc, Local} tuples. + +test_data() -> + {TZ,DSTTZ} = + case os:type() of + {unix,_} -> + case os:cmd("date '+%Z'") of + "SAST"++_ -> + {2,2}; + _ -> + {?timezone,?dst_timezone} + end; + _ -> + {?timezone,?dst_timezone} + end, + ?line test_data(nondst_dates(), TZ) ++ + test_data(dst_dates(), DSTTZ) ++ + crossover_test_data(crossover_dates(), TZ). + + +%% test_data1() -> +%% ?line test_data(nondst_dates(), ?timezone) ++ +%% test_data(dst_dates(), ?dst_timezone) ++ +%% crossover_test_data(crossover_dates(), ?timezone). + +crossover_test_data([{Year, Month, Day}|Rest], TimeZone) when TimeZone > 0 -> + Hour = 23, + Min = 35, + Sec = 55, + ?line Utc = {{Year, Month, Day}, {Hour, Min, Sec}}, + ?line Local = {{Year, Month, Day+1}, {Hour+TimeZone-24, Min, Sec}}, + ?line [{Utc, Local}|crossover_test_data(Rest, TimeZone)]; +crossover_test_data([{Year, Month, Day}|Rest], TimeZone) when TimeZone < 0 -> + Hour = 0, + Min = 23, + Sec = 12, + ?line Utc = {{Year, Month, Day}, {Hour, Min, Sec}}, + ?line Local = {{Year, Month, Day-1}, {Hour+TimeZone+24, Min, Sec}}, + ?line [{Utc, Local}|crossover_test_data(Rest, TimeZone)]; +crossover_test_data([], _) -> + []. + +test_data([Date|Rest], TimeZone) -> + Hour = 12, + Min = 45, + Sec = 7, + ?line Utc = {Date, {Hour, Min, Sec}}, + ?line Local = {Date, {Hour+TimeZone, Min, Sec}}, + ?line [{Utc, Local}|test_data(Rest, TimeZone)]; +test_data([], _) -> + []. + +nondst_dates() -> + [{1996, 01, 30}, + {1997, 01, 30}, + {1998, 01, 30}, + {1999, 01, 30}, + {1996, 02, 29}, + {1997, 02, 28}, + {1998, 02, 28}, + {1999, 02, 28}, + {1996, 03, 2}, + {1997, 03, 2}, + {1998, 03, 2}, + {1999, 03, 2}]. + +dst_dates() -> + [{1996, 06, 1}, + {1997, 06, 2}, + {1998, 06, 3}, + {1999, 06, 4}]. + +%% The following dates should not be near the end or beginning of +%% a month, because they will be used to test when the dates are +%% different in UTC and local time. + +crossover_dates() -> + [{1996, 01, 25}, + {1997, 01, 25}, + {1998, 01, 25}, + {1999, 01, 25}, + {1996, 02, 27}, + {1997, 02, 27}, + {1998, 02, 27}, + {1999, 02, 27}]. + +bad_dates() -> + [{{1900, 7, 1}, {12, 0, 0}}, % Year + + {{1996, 0, 20}, {12, 0, 0}}, % Month + {{1996, 13, 20}, {12, 0, 0}}, + + {{1996, 1, 0}, {12, 0, 0}}, % Date + {{1996, 1, 32}, {12, 0, 0}}, + {{1996, 2, 30}, {12, 0, 0}}, + {{1997, 2, 29}, {12, 0, 0}}, + {{1998, 2, 29}, {12, 0, 0}}, + {{1999, 2, 29}, {12, 0, 0}}, + {{1996, 4, 31}, {12, 0, 0}}, + + {{1996, 4, 30}, {-1, 0, 0}}, % Hour + {{1996, 4, 30}, {25, 0, 0}}, + + {{1996, 4, 30}, {12,-1, 0}}, % Minute + {{1996, 4, 30}, {12, 60, 0}}, + + {{1996, 4, 30}, {12, 0, -1}}, % Sec + {{1996, 4, 30}, {12, 0, 60}}]. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_bif_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/trace_bif_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/trace_bif_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_bif_SUITE.erl 2009-09-18 15:07:50.000000000 +0100 @@ -0,0 +1,268 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(trace_bif_SUITE). + +-include("test_server.hrl"). + +-export([all/1]). +-export([trace_bif/1, trace_bif_timestamp/1, trace_on_and_off/1, trace_bif_local/1, + trace_bif_timestamp_local/1, trace_bif_return/1, not_run/1, + trace_info_old_code/1]). + +-export([bif_process/0]). + +all(suite) -> + case test_server:is_native(?MODULE) of + true -> [not_run]; + false -> + [trace_bif, trace_bif_timestamp, trace_on_and_off, + trace_bif_local, trace_bif_timestamp_local, + trace_bif_return, trace_info_old_code] + end. + +not_run(Config) when is_list(Config) -> + {skipped,"Native code"}. + +trace_on_and_off(doc) -> + "Tests switching tracing on and off."; +trace_on_and_off(Config) when is_list(Config) -> + ?line Pid = spawn(?MODULE, bif_process, []), + ?line Self = self(), + ?line 1 = erlang:trace(Pid, true, [call,timestamp]), + ?line {flags,[timestamp,call]} = erlang:trace_info(Pid,flags), + ?line {tracer, Self} = erlang:trace_info(Pid,tracer), + ?line 1 = erlang:trace(Pid, false, [timestamp]), + ?line {flags,[call]} = erlang:trace_info(Pid,flags), + ?line {tracer, Self} = erlang:trace_info(Pid,tracer), + ?line 1 = erlang:trace(Pid, false, [call]), + ?line {flags,[]} = erlang:trace_info(Pid,flags), + ?line {tracer, []} = erlang:trace_info(Pid,tracer), + ?line exit(Pid,kill), + ok. + +trace_bif(doc) -> "Test tracing BIFs."; +trace_bif(Config) when is_list(Config) -> + do_trace_bif([]). + +trace_bif_local(doc) -> "Test tracing BIFs with local flag."; +trace_bif_local(Config) when is_list(Config) -> + do_trace_bif([local]). + +do_trace_bif(Flags) -> + ?line Pid = spawn(?MODULE, bif_process, []), + ?line 1 = erlang:trace(Pid, true, [call]), + ?line erlang:trace_pattern({erlang,'_','_'}, [], Flags), + ?line Pid ! {do_bif, time, []}, + ?line receive_trace_msg({trace,Pid,call,{erlang,time, []}}), + ?line Pid ! {do_bif, statistics, [runtime]}, + ?line receive_trace_msg({trace,Pid,call, + {erlang,statistics, [runtime]}}), + + ?line Pid ! {do_time_bif}, + ?line receive_trace_msg({trace,Pid,call, + {erlang,time, []}}), + + ?line Pid ! {do_statistics_bif}, + ?line receive_trace_msg({trace,Pid,call, + {erlang,statistics, [runtime]}}), + + ?line 1 = erlang:trace(Pid, false, [call]), + ?line erlang:trace_pattern({erlang,'_','_'}, false, Flags), + ?line exit(Pid, die), + ok. + +trace_bif_timestamp(doc) -> "Test tracing BIFs with timestamps."; +trace_bif_timestamp(Config) when is_list(Config) -> + do_trace_bif_timestamp([]). + +trace_bif_timestamp_local(doc) -> + "Test tracing BIFs with timestamps and local flag."; +trace_bif_timestamp_local(Config) when is_list(Config) -> + do_trace_bif_timestamp([local]). + +do_trace_bif_timestamp(Flags) -> + ?line Pid=spawn(?MODULE, bif_process, []), + ?line 1 = erlang:trace(Pid, true, [call,timestamp]), + ?line erlang:trace_pattern({erlang,'_','_'}, [], Flags), + + ?line Pid ! {do_bif, time, []}, + ?line receive_trace_msg_ts({trace_ts,Pid,call,{erlang,time,[]}}), + + ?line Pid ! {do_bif, statistics, [runtime]}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {erlang,statistics, [runtime]}}), + + ?line Pid ! {do_time_bif}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {erlang,time, []}}), + + ?line Pid ! {do_statistics_bif}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {erlang,statistics, [runtime]}}), + + %% We should be able to turn off the timestamp. + ?line 1 = erlang:trace(Pid, false, [timestamp]), + + ?line Pid ! {do_statistics_bif}, + ?line receive_trace_msg({trace,Pid,call, + {erlang,statistics, [runtime]}}), + + ?line Pid ! {do_bif, statistics, [runtime]}, + ?line receive_trace_msg({trace,Pid,call, + {erlang,statistics, [runtime]}}), + + ?line 1 = erlang:trace(Pid, false, [call]), + ?line erlang:trace_pattern({erlang,'_','_'}, false, Flags), + + ?line exit(Pid, die), + ok. + +trace_bif_return(doc) -> + "Test tracing BIF's with return/return_to trace."; +trace_bif_return(Config) when is_list(Config) -> + ?line Pid=spawn(?MODULE, bif_process, []), + ?line 1 = erlang:trace(Pid, true, [call,timestamp,return_to]), + ?line erlang:trace_pattern({erlang,'_','_'}, [{'_',[],[{return_trace}]}], + [local]), + + + ?line Pid ! {do_bif, time, []}, + ?line receive_trace_msg_ts({trace_ts,Pid,call,{erlang,time,[]}}), + ?line receive_trace_msg_ts_return_from({trace_ts,Pid,return_from, + {erlang,time,0}}), + ?line receive_trace_msg_ts_return_to({trace_ts,Pid,return_to, + {?MODULE, bif_process,0}}), + + + ?line Pid ! {do_bif, statistics, [runtime]}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {erlang,statistics, [runtime]}}), + ?line receive_trace_msg_ts_return_from({trace_ts,Pid,return_from, + {erlang,statistics,1}}), + ?line receive_trace_msg_ts_return_to({trace_ts,Pid,return_to, + {?MODULE, bif_process,0}}), + + + ?line Pid ! {do_time_bif}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {erlang,time, []}}), + ?line receive_trace_msg_ts_return_from({trace_ts,Pid,return_from, + {erlang,time,0}}), + ?line receive_trace_msg_ts_return_to({trace_ts,Pid,return_to, + {?MODULE, bif_process,0}}), + + + + ?line Pid ! {do_statistics_bif}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {erlang,statistics, [runtime]}}), + ?line receive_trace_msg_ts_return_from({trace_ts,Pid,return_from, + {erlang,statistics,1}}), + ?line receive_trace_msg_ts_return_to({trace_ts,Pid,return_to, + {?MODULE, bif_process,0}}), + ok. + + +receive_trace_msg(Mess) -> + receive + Mess -> + ok; + Other -> + io:format("Expected: ~p,~nGot: ~p~n", [Mess, Other]), + ?t:fail() + after 5000 -> + io:format("Expected: ~p,~nGot: timeout~n", [Mess]), + ?t:fail() + end. + +receive_trace_msg_ts({trace_ts, Pid, call, {erlang,F,A}}) -> + receive + {trace_ts, Pid, call, {erlang, F, A}, _Ts} -> + ok; + Other -> + io:format("Expected: {trace, ~p, call, {~p, ~p, ~p}, TimeStamp}},~n" + "Got: ~p~n", + [Pid, erlang, F, A, Other]), + ?t:fail() + after 5000 -> + io:format("Got timeout~n", []), + ?t:fail() + end. + +receive_trace_msg_ts_return_from({trace_ts, Pid, return_from, {erlang,F,A}}) -> + receive + {trace_ts, Pid, return_from, {erlang, F, A}, _Value, _Ts} -> + ok; + Other -> + io:format("Expected: {trace_ts, ~p, return_from, {~p, ~p, ~p}, Value, TimeStamp}},~n" + "Got: ~p~n", + [Pid, erlang, F, A, Other]), + ?t:fail() + after 5000 -> + io:format("Got timeout~n", []), + ?t:fail() + end. + +receive_trace_msg_ts_return_to({trace_ts, Pid, return_to, {M,F,A}}) -> + receive + {trace_ts, Pid, return_to, {M, F, A}, _Ts} -> + ok; + Other -> + io:format("Expected: {trace_ts, ~p, return_to, {~p, ~p, ~p}, TimeStamp}},~n" + "Got: ~p~n", + [Pid, M, F, A, Other]), + ?t:fail() + after 5000 -> + io:format("Got timeout~n", []), + ?t:fail() + end. + +bif_process() -> + receive + {do_bif, Name, Args} -> + apply(erlang, Name, Args), + bif_process(); + {do_time_bif} -> + _ = time(), %Assignment tells compiler to keep call. + bif_process(); + {do_statistics_bif} -> + statistics(runtime), + bif_process(); + _Stuff -> + bif_process() + end. + + + +trace_info_old_code(doc) -> "trace_info on deleted module (OTP-5057)."; +trace_info_old_code(Config) when is_list(Config) -> + ?line MFA = {M,F,0} = {test,foo,0}, + ?line Fname = atom_to_list(M)++".erl", + ?line AbsForms = + [{attribute,1,module,M}, % -module(M). + {attribute,2,export,[{F,0}]}, % -export([F/0]). + {function,3,F,0, % F() -> + [{clause,4,[],[],[{atom,4,F}]}]}], % F. + %% + ?line {ok,M,Mbin} = compile:forms(AbsForms), + ?line {module,M} = code:load_binary(M, Fname, Mbin), + ?line true = erlang:delete_module(M), + ?line {traced,undefined} = erlang:trace_info(MFA, traced), + ok. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_call_count_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/trace_call_count_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/trace_call_count_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_call_count_SUITE.erl 2009-09-18 15:08:36.000000000 +0100 @@ -0,0 +1,362 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% +%%% Define to run outside of test server +%%% +%%% -define(STANDALONE,1). +%%% +%%% +%%% Define for debug output +%%% +%%% -define(debug,1). + +-module(trace_call_count_SUITE). + +%% Exported end user tests +-export([basic_test/0, on_and_off_test/0, info_test/0, + pause_and_restart_test/0, combo_test/0]). + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Test server related stuff +%% + +-ifdef(STANDALONE). +-define(config(A,B),config(A,B)). +-export([config/2]). +-else. +-include("test_server.hrl"). +-endif. + +-ifdef(debug). +-ifdef(STANDALONE). +-define(line, erlang:display({?MODULE,?LINE}), ). +-endif. +-define(dbgformat(A,B),io:format(A,B)). +-else. +-ifdef(STANDALONE). +-define(line, noop, ). +-endif. +-define(dbgformat(A,B),noop). +-endif. + +-ifdef(STANDALONE). +config(priv_dir,_) -> + ".". +-else. +%% When run in test server. +-export([all/1, init_per_testcase/2, fin_per_testcase/2, not_run/1]). +-export([basic/1, on_and_off/1, info/1, + pause_and_restart/1, combo/1]). + +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(test_server:seconds(30)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + erlang:trace_pattern({'_','_','_'}, false, [local,meta,call_count]), + erlang:trace_pattern(on_load, false, [local,meta,call_count]), + erlang:trace(all, false, [all]), + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(doc) -> + ["Test call count tracing of local function calls."]; +all(suite) -> + case test_server:is_native(?MODULE) of + true -> [not_run]; + false -> [basic, on_and_off, info, + pause_and_restart, combo] + end. + +not_run(Config) when is_list(Config) -> + {skipped,"Native code"}. + +basic(suite) -> + []; +basic(doc) -> + ["Tests basic call count trace"]; +basic(Config) when is_list(Config) -> + basic_test(). + +on_and_off(suite) -> + []; +on_and_off(doc) -> + ["Tests turning trace parameters on and off"]; +on_and_off(Config) when is_list(Config) -> + on_and_off_test(). + +info(suite) -> + []; +info(doc) -> + ["Tests the trace_info BIF"]; +info(Config) when is_list(Config) -> + info_test(). + +pause_and_restart(suite) -> + []; +pause_and_restart(doc) -> + ["Tests pausing and restarting call counters"]; +pause_and_restart(Config) when is_list(Config) -> + pause_and_restart_test(). + +combo(suite) -> + []; +combo(doc) -> + ["Tests combining local call trace and meta trace with call count trace"]; +combo(Config) when is_list(Config) -> + combo_test(). + +-endif. %-ifdef(STANDALONE). ... -else. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Result examination macros + +-define(CT(P,MFA),{trace,P,call,MFA}). +-define(CTT(P, MFA),{trace_ts,P,call,MFA,{_,_,_}}). +-define(RF(P,MFA,V),{trace,P,return_from,MFA,V}). +-define(RFT(P,MFA,V),{trace_ts,P,return_from,MFA,V,{_,_,_}}). +-define(RT(P,MFA),{trace,P,return_to,MFA}). +-define(RTT(P,MFA),{trace_ts,P,return_to,MFA,{_,_,_}}). + +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% The Tests +%%% + +basic_test() -> + ?line P = erlang:trace_pattern({'_','_','_'}, false, [call_count]), + ?line M = 1000, + %% + ?line 1 = erlang:trace_pattern({?MODULE,seq,'_'}, true, [call_count]), + ?line 2 = erlang:trace_pattern({?MODULE,seq_r,'_'}, true, [call_count]), + ?line L = seq(1, M, fun(X) -> X+1 end), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line {call_count,0} = erlang:trace_info({?MODULE,seq_r,3}, call_count), + ?line Lr = seq_r(1, M, fun(X) -> X+1 end), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line {call_count,1} = erlang:trace_info({?MODULE,seq_r,3}, call_count), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq_r,4}, call_count), + ?line L = lists:reverse(Lr), + %% + ?line P = erlang:trace_pattern({'_','_','_'}, false, [call_count]), + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +on_and_off_test() -> + ?line P = erlang:trace_pattern({'_','_','_'}, false, [call_count]), + ?line M = 100, + %% + ?line 1 = erlang:trace_pattern({?MODULE,seq,'_'}, true, [call_count]), + ?line L = seq(1, M, fun(X) -> X+1 end), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line N = erlang:trace_pattern({?MODULE,'_','_'}, true, [call_count]), + ?line L = seq(1, M, fun(X) -> X+1 end), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line P = erlang:trace_pattern({'_','_','_'}, true, [call_count]), + ?line L = seq(1, M, fun(X) -> X+1 end), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line 1 = erlang:trace_pattern({?MODULE,seq,'_'}, false, [call_count]), + ?line {call_count,false} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line L = seq(1, M, fun(X) -> X+1 end), + ?line {call_count,false} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line {call_count,0} = erlang:trace_info({?MODULE,seq_r,4}, call_count), + ?line Lr = seq_r(1, M, fun(X) -> X+1 end), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq_r,4}, call_count), + ?line N = erlang:trace_pattern({?MODULE,'_','_'}, false, [call_count]), + ?line {call_count,false} = erlang:trace_info({?MODULE,seq_r,4}, call_count), + ?line Lr = seq_r(1, M, fun(X) -> X+1 end), + ?line {call_count,false} = erlang:trace_info({?MODULE,seq_r,4}, call_count), + ?line L = lists:reverse(Lr), + %% + ?line P = erlang:trace_pattern({'_','_','_'}, false, [call_count]), + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +info_test() -> + ?line P = erlang:trace_pattern({'_','_','_'}, false, [call_count]), + %% + ?line 1 = erlang:trace_pattern({?MODULE,seq,3}, true, [call_count]), + ?line {call_count,0} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line 1 = erlang:trace_pattern({?MODULE,seq,'_'}, pause, [call_count]), + ?line {call_count,0} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line {all,[_|_]=L} = erlang:trace_info({?MODULE,seq,3}, all), + ?line {value,{call_count,0}} = lists:keysearch(call_count, 1, L), + ?line 1 = erlang:trace_pattern({?MODULE,seq,'_'}, restart, [call_count]), + ?line {call_count,0} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line 1 = erlang:trace_pattern({?MODULE,seq,'_'}, false, [call_count]), + ?line {call_count,false} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line {all,false} = erlang:trace_info({?MODULE,seq,3}, all), + %% + ?line P = erlang:trace_pattern({'_','_','_'}, false, [call_count]), + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +pause_and_restart_test() -> + ?line P = erlang:trace_pattern({'_','_','_'}, false, [call_count]), + ?line M = 100, + %% + ?line 1 = erlang:trace_pattern({?MODULE,seq,'_'}, true, [call_count]), + ?line {call_count,0} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line L = seq(1, M, fun(X) -> X+1 end), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line 1 = erlang:trace_pattern({?MODULE,seq,'_'}, pause, [call_count]), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line L = seq(1, M, fun(X) -> X+1 end), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line 1 = erlang:trace_pattern({?MODULE,seq,'_'}, restart, [call_count]), + ?line {call_count,0} = erlang:trace_info({?MODULE,seq,3}, call_count), + ?line L = seq(1, M, fun(X) -> X+1 end), + ?line {call_count,M} = erlang:trace_info({?MODULE,seq,3}, call_count), + %% + ?line P = erlang:trace_pattern({'_','_','_'}, false, [call_count]), + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +combo_test() -> + ?line Self = self(), + + ?line MetaMatchSpec = [{'_',[],[{return_trace}]}], + ?line Flags = lists:sort([call, return_to]), + ?line LocalTracer = spawn_link(fun () -> relay_n(5, Self) end), + ?line MetaTracer = spawn_link(fun () -> relay_n(9, Self) end), + ?line 2 = erlang:trace_pattern({?MODULE,seq_r,'_'}, [], [local]), + ?line 2 = erlang:trace_pattern({?MODULE,seq_r,'_'}, + MetaMatchSpec, + [{meta,MetaTracer}, call_count]), + ?line 1 = erlang:trace(Self, true, [{tracer,LocalTracer} | Flags]), + %% + ?line {traced,local} = + erlang:trace_info({?MODULE,seq_r,3}, traced), + ?line {match_spec,[]} = + erlang:trace_info({?MODULE,seq_r,3}, match_spec), + ?line {meta,MetaTracer} = + erlang:trace_info({?MODULE,seq_r,3}, meta), + ?line {meta_match_spec,MetaMatchSpec} = + erlang:trace_info({?MODULE,seq_r,3}, meta_match_spec), + ?line {call_count,0} = + erlang:trace_info({?MODULE,seq_r,3}, call_count), + %% + ?line {all,[_|_]=TraceInfo} = + erlang:trace_info({?MODULE,seq_r,3}, all), + ?line {value,{traced,local}} = + lists:keysearch(traced, 1, TraceInfo), + ?line {value,{match_spec,[]}} = + lists:keysearch(match_spec, 1, TraceInfo), + ?line {value,{meta,MetaTracer}} = + lists:keysearch(meta, 1, TraceInfo), + ?line {value,{meta_match_spec,MetaMatchSpec}} = + lists:keysearch(meta_match_spec, 1, TraceInfo), + ?line {value,{call_count,0}} = + lists:keysearch(call_count, 1, TraceInfo), + %% + ?line [3,2,1] = seq_r(1, 3, fun(X) -> X+1 end), + %% + ?line List = collect(100), + ?line {MetaR, LocalR} = + lists:foldl( + fun ({P,X}, {M,L}) when P == MetaTracer -> + {[X|M],L}; + ({P,X}, {M,L}) when P == LocalTracer -> + {M,[X|L]} + end, + {[],[]}, + List), + ?line Meta = lists:reverse(MetaR), + ?line Local = lists:reverse(LocalR), + ?line [?CTT(Self,{?MODULE,seq_r,[1,3,_]}), + ?CTT(Self,{?MODULE,seq_r,[1,3,_,[]]}), + ?CTT(Self,{?MODULE,seq_r,[2,3,_,[1]]}), + ?CTT(Self,{?MODULE,seq_r,[3,3,_,[2,1]]}), + ?RFT(Self,{?MODULE,seq_r,4},[3,2,1]), + ?RFT(Self,{?MODULE,seq_r,4},[3,2,1]), + ?RFT(Self,{?MODULE,seq_r,4},[3,2,1]), + ?RFT(Self,{?MODULE,seq_r,3},[3,2,1])] = Meta, + ?line [?CT(Self,{?MODULE,seq_r,[1,3,_]}), + ?CT(Self,{?MODULE,seq_r,[1,3,_,[]]}), + ?CT(Self,{?MODULE,seq_r,[2,3,_,[1]]}), + ?CT(Self,{?MODULE,seq_r,[3,3,_,[2,1]]}), + ?RT(Self,{?MODULE,combo_test,0})] = Local, + ?line {call_count,1} = erlang:trace_info({?MODULE,seq_r,3}, call_count), + ?line {call_count,3} = erlang:trace_info({?MODULE,seq_r,4}, call_count), + %% + ?line erlang:trace_pattern({'_','_','_'}, false, [local,meta,call_count]), + ?line erlang:trace_pattern(on_load, false, [local,meta,call_count]), + ?line erlang:trace(all, false, [all]), + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Local helpers + +%% Stack recursive seq +seq(Stop, Stop, Succ) when is_function(Succ) -> + [Stop]; +seq(Start, Stop, Succ) when is_function(Succ) -> + [Start | seq(Succ(Start), Stop, Succ)]. + + + +%% Tail recursive seq, result list is reversed +seq_r(Start, Stop, Succ) when is_function(Succ) -> + seq_r(Start, Stop, Succ, []). + +seq_r(Stop, Stop, _, R) -> + [Stop | R]; +seq_r(Start, Stop, Succ, R) -> + seq_r(Succ(Start), Stop, Succ, [Start | R]). + + + +%% Message relay process +relay_n(0, _) -> + ok; +relay_n(N, Dest) -> + receive Msg -> + Dest ! {self(), Msg}, + relay_n(N-1, Dest) + end. + + + +%% Collect received messages +collect(Time) -> + Ref = erlang:start_timer(Time, self(), done), + L = lists:reverse(collect([], Ref)), + ?dbgformat("Got: ~p~n",[L]), + L. + +collect(A, 0) -> + receive + Mess -> + collect([Mess | A], 0) + after 0 -> + A + end; +collect(A, Ref) -> + receive + {timeout, Ref, done} -> + collect(A, 0); + Mess -> + collect([Mess | A], Ref) + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_local_SUITE_data/trace_local_dummy.erl erlang-13.b.3-dfsg/erts/emulator/test/trace_local_SUITE_data/trace_local_dummy.erl --- erlang-13.b.1-dfsg/erts/emulator/test/trace_local_SUITE_data/trace_local_dummy.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_local_SUITE_data/trace_local_dummy.erl 2009-11-20 13:31:02.000000000 +0000 @@ -0,0 +1,28 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(trace_local_dummy). + +-export([dummy/0]). + +dummy() -> + dummy2(). + +dummy2() -> + hoppla. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_local_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/trace_local_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/trace_local_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_local_SUITE.erl 2009-09-18 15:08:12.000000000 +0100 @@ -0,0 +1,1259 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(trace_local_SUITE). +-compile({nowarn_deprecated_function, {erlang,hash,2}}). + +-export([basic_test/0, bit_syntax_test/0, return_test/0, + on_and_off_test/0, stack_grow_test/0, + info_test/0, delete_test/1, exception_test/1, + not_run/1]). + +-export([exported/1, exported_wrap/1, loop/4, apply_slave_async/5, + match/2, clause/2, id/1, undef/1, lists_reverse/2]). + +%% +%% Define to run outside of test server +%% +%% (rotten feature) +%% +%%-define(STANDALONE,1). + +%% +%% Define for debug output +%% +%%-define(debug,1). + +-ifdef(STANDALONE). +-define(config(A,B),config(A,B)). +-export([config/2]). +-define(DEFAULT_RECEIVE_TIMEOUT, 1000). +-else. +-include("test_server.hrl"). +-define(DEFAULT_RECEIVE_TIMEOUT, infinity). +-endif. + +-ifdef(debug). +-ifdef(STANDALONE). +-define(line, erlang:display({?MODULE,?LINE}), ). +-endif. +-define(dbgformat(A,B),io:format(A,B)). +-else. +-ifdef(STANDALONE). +-define(line, noop, ). +-endif. +-define(dbgformat(A,B),noop). +-endif. + +-ifdef(STANDALONE). +config(priv_dir,_) -> + ".". +-else. + +%%% When run in test server %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +-export([all/1, basic/1, bit_syntax/1, + return/1, on_and_off/1, stack_grow/1,info/1, delete/1, + exception/1, exception_apply/1, + exception_function/1, exception_apply_function/1, + exception_nocatch/1, exception_nocatch_apply/1, + exception_nocatch_function/1, exception_nocatch_apply_function/1, + exception_meta/1, exception_meta_apply/1, + exception_meta_function/1, exception_meta_apply_function/1, + exception_meta_nocatch/1, exception_meta_nocatch_apply/1, + exception_meta_nocatch_function/1, + exception_meta_nocatch_apply_function/1, + init_per_testcase/2, fin_per_testcase/2]). +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(test_server:minutes(2)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + shutdown(), + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. +all(doc) -> + ["Test tracing of local function calls and return traces."]; +all(suite) -> + case test_server:is_native(?MODULE) of + true -> [not_run]; + false -> [basic, bit_syntax, return, on_and_off, stack_grow, info, delete, + exception, exception_apply, + exception_function, exception_apply_function, + exception_nocatch, exception_nocatch_apply, + exception_nocatch_function, + exception_nocatch_apply_function, + exception_meta, exception_meta_apply, + exception_meta_function, exception_meta_apply_function, + exception_meta_nocatch, exception_meta_nocatch_apply, + exception_meta_nocatch_function, + exception_meta_nocatch_apply_function] + end. + +not_run(Config) when is_list(Config) -> + {skipped,"Native code"}. + +basic(doc) -> + ["Tests basic local call-trace"]; +basic(Config) when is_list(Config) -> + basic_test(). + +bit_syntax(doc) -> + "OTP-7399: Make sure that code that uses the optimized bit syntax matching " + "can be traced without crashing the emulator."; +bit_syntax(Config) when is_list(Config) -> + bit_syntax_test(). + +return(doc) -> + ["Tests the different types of return trace"]; +return(Config) when is_list(Config) -> + return_test(). + +on_and_off(doc) -> + ["Tests turning trace parameters on and off, " + "both for trace and trace_pattern"]; +on_and_off(Config) when is_list(Config) -> + on_and_off_test(). + +stack_grow(doc) -> + ["Tests the stack growth during return traces"]; +stack_grow(Config) when is_list(Config) -> + stack_grow_test(). + +info(doc) -> + ["Tests the trace_info BIF"]; +info(Config) when is_list(Config) -> + info_test(). + +delete(doc) -> + ["Tests putting trace on deleted modules"]; +delete(Config) when is_list(Config) -> + delete_test(Config). + +exception(doc) -> + ["Tests exception_trace"]; +exception(Config) when is_list(Config) -> + exception_test([]). + +exception_apply(doc) -> + ["Tests exception_trace"]; +exception_apply(Config) when is_list(Config) -> + exception_test([apply]). + +exception_function(doc) -> + ["Tests exception_trace"]; +exception_function(Config) when is_list(Config) -> + exception_test([function]). + +exception_apply_function(doc) -> + ["Tests exception_trace"]; +exception_apply_function(Config) when is_list(Config) -> + exception_test([apply,function]). + +exception_nocatch(doc) -> + ["Tests exception_trace"]; +exception_nocatch(Config) when is_list(Config) -> + exception_test([nocatch]). + +exception_nocatch_apply(doc) -> + ["Tests exception_trace"]; +exception_nocatch_apply(Config) when is_list(Config) -> + exception_test([nocatch,apply]). + +exception_nocatch_function(doc) -> + ["Tests exception_trace"]; +exception_nocatch_function(Config) when is_list(Config) -> + exception_test([nocatch,function]). + +exception_nocatch_apply_function(doc) -> + ["Tests exception_trace"]; +exception_nocatch_apply_function(Config) when is_list(Config) -> + exception_test([nocatch,apply,function]). + +exception_meta(doc) -> + ["Tests meta exception_trace"]; +exception_meta(Config) when is_list(Config) -> + exception_test([meta]). + +exception_meta_apply(doc) -> + ["Tests meta exception_trace"]; +exception_meta_apply(Config) when is_list(Config) -> + exception_test([meta,apply]). + +exception_meta_function(doc) -> + ["Tests meta exception_trace"]; +exception_meta_function(Config) when is_list(Config) -> + exception_test([meta,function]). + +exception_meta_apply_function(doc) -> + ["Tests meta exception_trace"]; +exception_meta_apply_function(Config) when is_list(Config) -> + exception_test([meta,apply,function]). + +exception_meta_nocatch(doc) -> + ["Tests meta exception_trace"]; +exception_meta_nocatch(Config) when is_list(Config) -> + exception_test([meta,nocatch]). + +exception_meta_nocatch_apply(doc) -> + ["Tests meta exception_trace"]; +exception_meta_nocatch_apply(Config) when is_list(Config) -> + exception_test([meta,nocatch,apply]). + +exception_meta_nocatch_function(doc) -> + ["Tests meta exception_trace"]; +exception_meta_nocatch_function(Config) when is_list(Config) -> + exception_test([meta,nocatch,function]). + +exception_meta_nocatch_apply_function(doc) -> + ["Tests meta exception_trace"]; +exception_meta_nocatch_apply_function(Config) when is_list(Config) -> + exception_test([meta,nocatch,apply,function]). + +-endif. + + + +%%% Message patterns and expect functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +-define(pCT(P,M,F,A), {trace, P,call,{M,F,A}}). +-define(pCTT(P,M,F,A), {trace_ts,P,call,{M,F,A},{_,_,_}}). +-define(pRF(P,M,F,A,V), {trace, P,return_from,{M,F,A},V}). +-define(pRFT(P,M,F,A,V),{trace_ts,P,return_from,{M,F,A},V,{_,_,_}}). +-define(pEF(P,M,F,A,V), {trace, P,exception_from,{M,F,A},V}). +-define(pEFT(P,M,F,A,V),{trace_ts,P,exception_from,{M,F,A},V,{_,_,_}}). +-define(pRT(P,M,F,A), {trace, P,return_to,{M,F,A}}). +-define(pRTT(P,M,F,A), {trace_ts,P,return_to,{M,F,A},{_,_,_}}). + +-define(CT(M,F,A), ?pCT(_,M,F,A) = receive_next()). +-define(CTT(M,F,A), ?pCTT(_,M,F,A) = receive_next()). +-define(RF(M,F,A,V), ?pRF(_,M,F,A,V) = receive_next()). +-define(RFT(M,F,A,V), ?pRFT(_,M,F,A,V) = receive_next()). +-define(EF(M,F,A,V), ?pEF(_,M,F,A,V) = receive_next()). +-define(EFT(M,F,A,V), ?pEFT(_,M,F,A,V) = receive_next()). +-define(RT(M,F,A), ?pRT(_,M,F,A) = receive_next()). +-define(RTT(M,F,A), ?pRTT(_,M,F,A) = receive_next()). +-define(NM, receive_no_next(100)). + +expect() -> + {Pid,_} = get(slave), + expect_receive(Pid). + +expect(Msg) -> + {Pid,_} = get(slave), + expect_pid(Pid, Msg). + + + +expect_pid(_Pid, []) -> + ok; +expect_pid(Pid, [Line|T]) when is_integer(Line) -> + put(test_server_loc, {?MODULE,Line}), + expect_pid(Pid, T); +expect_pid(Pid, [true|[_|_]=T]) -> + expect_pid(Pid, T); +expect_pid(Pid, [false|[_|T]]) -> + expect_pid(Pid, T); +expect_pid(Pid, [H|T]) -> + expect_pid(Pid, H), + expect_pid(Pid, T); +expect_pid(Pid, Msg) when is_tuple(Msg) -> + same(Msg, expect_receive(Pid)); +expect_pid(Pid, Fun) when is_function(Fun, 1) -> + case Fun(expect_receive(Pid)) of + next -> + expect_pid(Pid, Fun); + done -> + ok; + Other -> + expect_pid(Pid, Other) + end. + +expect_receive(Pid) when is_pid(Pid) -> + receive + Msg when is_tuple(Msg), + element(1, Msg) == trace, + element(2, Msg) =/= Pid; + %% + is_tuple(Msg), + element(1, Msg) == trace_ts, + element(2, Msg) =/= Pid -> + expect_receive(Pid); + Msg -> + expect_msg(Pid, Msg) + after 100 -> + {nm} + end. + +expect_msg(P, ?pCT(P,M,F,Args)) -> {ct,{M,F},Args}; +expect_msg(P, ?pCTT(P,M,F,Args)) -> {ctt,{M,F},Args}; +expect_msg(P, ?pRF(P,M,F,Arity,V)) -> {rf,{M,F,Arity},V}; +expect_msg(P, ?pRFT(P,M,F,Arity,V)) -> {rft,{M,F,Arity},V}; +expect_msg(P, ?pEF(P,M,F,Arity,V)) -> {ef,{M,F,Arity},V}; +expect_msg(P, ?pEFT(P,M,F,Arity,V)) -> {eft,{M,F,Arity},V}; +expect_msg(P, ?pRT(P,M,F,Arity)) -> {rt,{M,F,Arity}}; +expect_msg(P, ?pRTT(P,M,F,Arity)) -> {rtt,{M,F,Arity}}; +expect_msg(P, Msg) when is_tuple(Msg) -> + case tuple_to_list(Msg) of + [trace,P|T] -> + list_to_tuple([trace|T]); + [trace_ts,P|[_|_]=T] -> + list_to_tuple([trace_ts|reverse(tl(reverse(T)))]); + _ -> + Msg + end. + +same(A, B) -> + case [A|B] of + [X|X] -> + ok + end. + + + +%%% tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +basic_test() -> + ?line setup([call]), + ?line erlang:trace_pattern({?MODULE,'_','_'},[],[local]), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,[local]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported,[1]), + ?line ?CT(?MODULE,local,[1]), + ?line ?CT(?MODULE,local2,[1]), + ?line ?CT(?MODULE,local_tail,[1]), + ?line erlang:trace_pattern({?MODULE,'_','_'},[],[]), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,[local]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line [1,1,1,1] = lambda_slave(fun() -> + exported_wrap(1) + end), + ?line ?NM, + ?line erlang:trace_pattern({?MODULE,'_','_'},[],[local]), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,[local]), + ?line [1,1,1,1] = lambda_slave(fun() -> + exported_wrap(1) + end), + ?line ?CT(?MODULE,_,_), %% The fun + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported,[1]), + ?line ?CT(?MODULE,local,[1]), + ?line ?CT(?MODULE,local2,[1]), + ?line ?CT(?MODULE,local_tail,[1]), + ?line erlang:trace_pattern({?MODULE,'_','_'},false,[local]), + ?line shutdown(), + ?line ?NM, + ok. + +%% OTP-7399. +bit_syntax_test() -> + ?line setup([call]), + ?line erlang:trace_pattern({?MODULE,'_','_'},[],[local]), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,[local]), + + ?line lambda_slave(fun() -> + 6 = bs_sum_a(<<1,2,3>>, 0), + 10 = bs_sum_b(0, <<1,2,3,4>>), + 26 = bs_sum_c(<<3:4,5:4,7:4,11:4>>, 0) + end), + ?line ?CT(?MODULE,_,[]), %Ignore call to the fun. + + ?line ?CT(?MODULE,bs_sum_a,[<<1,2,3>>,0]), + ?line ?CT(?MODULE,bs_sum_a,[<<2,3>>,1]), + ?line ?CT(?MODULE,bs_sum_a,[<<3>>,3]), + ?line ?CT(?MODULE,bs_sum_a,[<<>>,6]), + + ?line ?CT(?MODULE,bs_sum_b,[0,<<1,2,3,4>>]), + ?line ?CT(?MODULE,bs_sum_b,[1,<<2,3,4>>]), + ?line ?CT(?MODULE,bs_sum_b,[3,<<3,4>>]), + ?line ?CT(?MODULE,bs_sum_b,[6,<<4>>]), + ?line ?CT(?MODULE,bs_sum_b,[10,<<>>]), + + ?line ?CT(?MODULE,bs_sum_c,[<<3:4,5:4,7:4,11:4>>, 0]), + ?line ?CT(?MODULE,bs_sum_c,[<<5:4,7:4,11:4>>, 3]), + ?line ?CT(?MODULE,bs_sum_c,[<<7:4,11:4>>, 8]), + ?line ?CT(?MODULE,bs_sum_c,[<<11:4>>, 15]), + ?line ?CT(?MODULE,bs_sum_c,[<<>>, 26]), + + ?line erlang:trace_pattern({?MODULE,'_','_'},false,[local]), + ?line shutdown(), + ?line ?NM, + + ok. + +bs_sum_a(<>, Acc) -> bs_sum_a(T, H+Acc); +bs_sum_a(<<>>, Acc) -> Acc. + +bs_sum_b(Acc, <>) -> bs_sum_b(H+Acc, T); +bs_sum_b(Acc, <<>>) -> Acc. + +bs_sum_c(<>, Acc) -> bs_sum_c(T, H+Acc); +bs_sum_c(<<>>, Acc) -> Acc. + +return_test() -> + ?line setup([call]), + ?line erlang:trace_pattern({?MODULE,'_','_'},[{'_',[],[{return_trace}]}], + [local]), + ?line erlang:trace_pattern({erlang,hash,'_'},[{'_',[],[{return_trace}]}], + [local]), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,[local]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported,[1]), + ?line ?CT(?MODULE,local,[1]), + ?line ?CT(?MODULE,local2,[1]), + ?line ?CT(?MODULE,local_tail,[1]), + ?line ?CT(erlang,hash,[1,1]), + ?line ?RF(erlang,hash,2,1), + ?line ?RF(?MODULE,local_tail,1,[1,1]), + ?line ?RF(?MODULE,local2,1,[1,1]), + ?line ?RF(?MODULE,local,1,[1,1,1]), + ?line ?RF(?MODULE,exported,1,[1,1,1,1]), + ?line ?RF(?MODULE,exported_wrap,1,[1,1,1,1]), + ?line shutdown(), + ?line setup([call,return_to]), + ?line erlang:trace_pattern({?MODULE,'_','_'},[], + [local]), + ?line erlang:trace_pattern({erlang,hash,'_'},[], + [local]), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,[local]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported,[1]), + ?line ?CT(?MODULE,local,[1]), + ?line ?CT(?MODULE,local2,[1]), + ?line ?CT(?MODULE,local_tail,[1]), + ?line ?CT(erlang,hash,[1,1]), + ?line ?RT(?MODULE,local_tail,1), + ?line ?RT(?MODULE,local,1), + ?line ?RT(?MODULE,exported,1), + ?line ?RT(?MODULE,slave,2), + ?line shutdown(), + ?line setup([call,return_to]), + ?line erlang:trace_pattern({?MODULE,'_','_'},[{'_',[],[{return_trace}]}], + [local]), + ?line erlang:trace_pattern({erlang,hash,'_'},[{'_',[],[{return_trace}]}], + [local]), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,[local]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported,[1]), + ?line ?CT(?MODULE,local,[1]), + ?line ?CT(?MODULE,local2,[1]), + ?line ?CT(?MODULE,local_tail,[1]), + ?line ?CT(erlang,hash,[1,1]), + ?line ?RF(erlang,hash,2,1), + ?line ?RT(?MODULE,local_tail,1), + ?line ?RF(?MODULE,local_tail,1,[1,1]), + ?line ?RF(?MODULE,local2,1,[1,1]), + ?line ?RT(?MODULE,local,1), + ?line ?RF(?MODULE,local,1,[1,1,1]), + ?line ?RT(?MODULE,exported,1), + ?line ?RF(?MODULE,exported,1,[1,1,1,1]), + ?line ?RF(?MODULE,exported_wrap,1,[1,1,1,1]), + ?line ?RT(?MODULE,slave,2), + ?line shutdown(), + ?line ?NM, + ok. + +on_and_off_test() -> + ?line Pid = setup([call]), + ?line 1 = erlang:trace_pattern({?MODULE,local_tail,1},[],[local]), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,[local]), + ?line LocalTail = fun() -> + local_tail(1) + end, + ?line [1,1] = lambda_slave(LocalTail), + ?line ?CT(?MODULE,local_tail,[1]), + ?line erlang:trace(Pid,true,[return_to]), + ?line [1,1] = lambda_slave(LocalTail), + ?line ?CT(?MODULE,local_tail,[1]), + ?line ?RT(?MODULE,_,_), + ?line 0 = erlang:trace_pattern({?MODULE,local_tail,1},[],[global]), + ?line [1,1] = lambda_slave(LocalTail), + ?line ?NM, + ?line 1 = erlang:trace_pattern({?MODULE,exported_wrap,1},[],[global]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line 1 = erlang:trace_pattern({?MODULE,exported_wrap,1},[],[local]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line ?RT(?MODULE,slave,2), + ?line 1 = erlang:trace_pattern({erlang,hash,2},[],[local]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line ?CT(erlang,hash,[1,1]), + ?line ?RT(?MODULE,local_tail,1), + ?line ?RT(?MODULE,slave,2), + ?line erlang:trace(Pid,true,[timestamp]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CTT(?MODULE,exported_wrap,[1]), + ?line ?CTT(erlang,hash,[1,1]), + ?line ?RTT(?MODULE,local_tail,1), + ?line ?RTT(?MODULE,slave,2), + ?line erlang:trace(Pid,false,[return_to,timestamp]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line ?CT(erlang,hash,[1,1]), + ?line erlang:trace(Pid,true,[return_to]), + ?line 1 = erlang:trace_pattern({erlang,hash,2},[],[]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line ?CT(erlang,hash,[1,1]), + ?line ?RT(?MODULE,slave,2), + ?line 1 = erlang:trace_pattern({?MODULE,exported_wrap,1},[],[]), + ?line [1,1,1,1] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CT(?MODULE,exported_wrap,[1]), + ?line ?CT(erlang,hash,[1,1]), + ?line shutdown(), + ?line erlang:trace_pattern({'_','_','_'},false,[local]), + ?line N = erlang:trace_pattern({erlang,'_','_'},true,[local]), + ?line case erlang:trace_pattern({erlang,'_','_'},false,[local]) of + N -> + ok; + Else -> + exit({number_mismatch, {expected, N}, {got, Else}}) + end, + ?line case erlang:trace_pattern({erlang,'_','_'},false,[local]) of + N -> + ok; + Else2 -> + exit({number_mismatch, {expected, N}, {got, Else2}}) + end, + ?line M = erlang:trace_pattern({erlang,'_','_'},true,[]), + ?line case erlang:trace_pattern({erlang,'_','_'},false,[]) of + M -> + ok; + Else3 -> + exit({number_mismatch, {expected, N}, {got, Else3}}) + end, + ?line case erlang:trace_pattern({erlang,'_','_'},false,[]) of + M -> + ok; + Else4 -> + exit({number_mismatch, {expected, N}, {got, Else4}}) + end, + ?line ?NM, + ok. + + +stack_grow_test() -> + ?line setup([call,return_to]), + ?line 1 = erlang:trace_pattern({?MODULE,loop,4}, + [{'_',[],[{return_trace}]}],[local]), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,[local]), + ?line Num = 1 bsl 15, + ?line Fun = + fun(_F,0) -> ok; + (F,N) -> + receive _A -> + receive _B -> + receive _C -> + F(F,N-1) + end + end + end + end, + ?line apply_slave_async(?MODULE,loop,[{hej,hopp},[a,b,c],4.5,Num]), + ?line Fun(Fun,Num + 1), + ?line ?NM, + ok. + + +info_test() -> + ?line Flags1 = lists:sort([call,return_to]), + ?line Pid = setup(Flags1), + ?line Prog = [{['$1'],[{is_integer,'$1'}],[{message, false}]}, + {'_',[],[]}], + ?line erlang:trace_pattern({?MODULE,exported_wrap,1},Prog,[local]), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,[local]), + ?line Self = self(), + ?line {flags,L} = erlang:trace_info(Pid,flags), + ?line case lists:sort(L) of + Flags1 -> + ok; + Wrong1 -> + exit({bad_result, {erlang,trace_info,[Pid,flags]}, + {expected, Flags1}, {got, Wrong1}}) + end, + ?line {tracer,Tracer} = erlang:trace_info(Pid,tracer), + ?line case Tracer of + Self -> + ok; + Wrong2 -> + exit({bad_result, {erlang,trace_info,[Pid,tracer]}, + {expected, Self}, {got, Wrong2}}) + end, + ?line {traced,local} = erlang:trace_info({?MODULE,exported_wrap,1},traced), + ?line {match_spec, MS} = + erlang:trace_info({?MODULE,exported_wrap,1},match_spec), + ?line case MS of + Prog -> + ok; + Wrong3 -> + exit({bad_result, {erlang,trace_info, + [{?MODULE,exported_wrap,1}, + match_spec]}, + {expected, Prog}, {got, Wrong3}}) + end, + ?line erlang:garbage_collect(self()), + ?line receive + after 1 -> + ok + end, + ?line io:format("~p~n",[MS]), + ?line {match_spec,MS2} = + erlang:trace_info({?MODULE,exported_wrap,1},match_spec), + ?line io:format("~p~n",[MS2]), + ?line erlang:trace_pattern({?MODULE,exported_wrap,1},[],[]), + ?line {traced,global} = + erlang:trace_info({?MODULE,exported_wrap,1},traced), + ?line {match_spec,[]} = + erlang:trace_info({?MODULE,exported_wrap,1},match_spec), + ?line {traced,undefined} = + erlang:trace_info({?MODULE,exported_wrap,2},traced), + ?line {match_spec,undefined} = + erlang:trace_info({?MODULE,exported_wrap,2},match_spec), + ?line {traced,false} = erlang:trace_info({?MODULE,exported,1},traced), + ?line {match_spec,false} = + erlang:trace_info({?MODULE,exported,1},match_spec), + ?line shutdown(), + ok. + +delete_test(Config) -> + ?line Priv = ?config(priv_dir, Config), + ?line Data = ?config(data_dir, Config), + ?line File = filename:join(Data, "trace_local_dummy"), + ?line {ok,trace_local_dummy} = c:c(File, [{outdir,Priv}]), + ?line code:purge(trace_local_dummy), + ?line code:delete(trace_local_dummy), + ?line 0 = erlang:trace_pattern({trace_local_dummy,'_','_'},true,[local]), + ?line ?NM, + ok. + + + +%%% exception_test %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +exception_test(Opts) -> + ?line {ProcFlags,PatFlags} = + case proplists:get_bool(meta, Opts) of + true -> {[timestamp],[meta]}; + false -> {[call,return_to,timestamp],[local]} + end, + ?line case proplists:get_bool(nocatch, Opts) of + false -> + ?line Exceptions = exceptions(), + ?line exception_test_setup(ProcFlags, PatFlags), + ?line lists:foreach( + fun ({Func,Args}) -> + ?line exception_test(Opts, Func, Args) + end, + Exceptions), + ?line shutdown(); + true -> + ?line Exceptions = exceptions(), + ?line lists:foreach( + fun ({Func,Args}) -> + ?line exception_test_setup( + [procs|ProcFlags], + PatFlags), + ?line exception_test(Opts, Func, Args), + ?line shutdown() + end, + Exceptions) + end, + ?line ok. + +exceptions() -> + ?line Ref = make_ref(), + ?line N = case os:type() of + vxworks -> + ?line 2000; % Limited memory on themachines, not actually + % VxWorks' fault /PaN + _ -> + ?line 200000 + end, + ?line LiL = seq(1, N-1, N), % Long Improper List + ?line LL = seq(1, N, []), % Long List + [{{erlang,exit}, [done]}, + {{erlang,error}, [1.0]}, + {{erlang,error}, [Ref,[]]}, + {{erlang,throw}, [4711]}, + {{erlang,'++'}, [[17],seventeen]}, + {{erlang,'++'}, [Ref,[125.125]]}, + {{?MODULE,match}, [ref,Ref]}, + {{?MODULE,match}, [Ref,Ref]}, + {{?MODULE,clause}, [ref,Ref]}, + {{?MODULE,clause}, [Ref,Ref]}, + {{?MODULE,id}, [4711.0]}, + {{?MODULE,undef}, [[Ref|Ref]]}, + {{?MODULE,lists_reverse}, [LiL,[]]}, + {{?MODULE,lists_reverse}, [LL,[]]}]. + +exception_test_setup(ProcFlags, PatFlags) -> + ?line Pid = setup(ProcFlags), + ?line io:format("=== exception_test_setup(~p, ~p): ~p~n", + [ProcFlags,PatFlags,Pid]), + ?line Mprog = [{'_',[],[{exception_trace}]}], + ?line erlang:trace_pattern({?MODULE,'_','_'}, Mprog, PatFlags), + ?line erlang:trace_pattern({?MODULE,slave,'_'},false,PatFlags), + ?line [1,1,1,1,1] = + [erlang:trace_pattern({erlang,F,A}, Mprog, PatFlags) + || {F,A} <- [{exit,1},{error,1},{error,2},{throw,1},{'++',2}]], + ?line 1 = erlang:trace_pattern({lists,reverse,2}, Mprog, PatFlags), + ?line ok. + +-record(exc_opts, {nocatch=false, meta=false}). + +exception_test(Opts, Func0, Args0) -> + ?line io:format("=== exception_test(~p, ~p, ~p)~n", + [Opts,Func0,abbr(Args0)]), + ?line Apply = proplists:get_bool(apply, Opts), + ?line Function = proplists:get_bool(function, Opts), + ?line Nocatch = proplists:get_bool(nocatch, Opts), + ?line Meta = proplists:get_bool(meta, Opts), + ?line ExcOpts = #exc_opts{nocatch=Nocatch,meta=Meta}, + + %% Func0 and Args0 are for the innermost call, now we will + %% wrap them in wrappers... + ?line {Func1,Args1} = + case Function of + true -> {fun exc/2,[Func0,Args0]}; + false -> {Func0,Args0} + end, + + ?line {Func,Args} = + case Apply of + true -> {{erlang,apply},[Func1,Args1]}; + false -> {Func1,Args1} + end, + + ?line R1 = exc_slave(ExcOpts, Func, Args), + ?line Stack2 = [{?MODULE,exc_top,3},{?MODULE,slave,2}], + ?line Stack3 = [{?MODULE,exc,2}|Stack2], + ?line Rs = + case x_exc_top(ExcOpts, Func, Args) of % Emulation + {crash,{Reason,Stack}}=R when is_list(Stack) -> + [R, + {crash,{Reason,Stack++Stack2}}, + {crash,{Reason,Stack++Stack3}}]; + R -> + [R] + end, + ?line exception_validate(R1, Rs), + ?line case R1 of + {crash,Crash} -> + ?line expect({trace_ts,exit,Crash}); + _ when not Meta -> + ?line expect({rtt,{?MODULE,slave,2}}); + _ -> + ok + end, + ?line expect({nm}). + +exception_validate(R1, [R2|Rs]) -> + case [R1|R2] of + [R|R] -> + ok; + [{crash,{badarg,[{lists,reverse,[L1a,L1b]}|T]}}| + {crash,{badarg,[{lists,reverse,[L2a,L2b]}|T]}}] -> + same({crash,{badarg,[{lists,reverse, + [lists:reverse(L1b, L1a),[]]}|T]}}, + {crash,{badarg,[{lists,reverse, + [lists:reverse(L2b, L2a),[]]}|T]}}); + _ when is_list(Rs), Rs =/= [] -> + exception_validate(R1, Rs) + end. + + + +%%% Tracee target functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% + +loop(D1,D2,D3,0) -> + io:format("~p~n",[[D1,D2,D3]]), + 0; +loop(D1,D2,D3,N) -> + max(N,loop(D1,D2,D3,N-1)). + +max(A, B) when A > B -> A; +max(_, B) -> B. + +exported_wrap(Val) -> + exported(Val). + +exported(Val) -> + [Val | local(Val)]. %% Non tail recursive local call + +local(Val) -> + [Val | local2(Val)]. %% Non tail recursive local call + +local2(Val) -> + local_tail(Val). %% Tail recursive call + +local_tail(Val) -> + [Val , erlang:hash(1,1)]. + + + +%%% exc_slave/3 tracee target functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% + +exc_top(ExcOpts, Func, Args) -> + case ExcOpts#exc_opts.nocatch of + false -> + try exc_jump(Func, Args) of + Value -> + {value,Value} + catch + Class:Reason -> + {Class,Reason} + end; + true -> + {value,exc_jump(Func, Args)} + end. + +%% x_* functions emulate the non-x_* ones. +%% x_* functions below x_exc_top +%% return {value,Value} or {Class,Reason}. +%% The only possible place for exception +%% is below exc/2. +x_exc_top(ExcOpts, Func, Args) -> + ?line Rtt = not ExcOpts#exc_opts.meta, + ?line expect({ctt,{?MODULE,exc_top},[ExcOpts,Func,Args]}), + ?line case x_exc_jump(ExcOpts, Func, Args) of + Result when not ExcOpts#exc_opts.nocatch -> + ?line expect([Rtt,{rtt,{?MODULE,exc_top,3}}, + ?LINE,{rft,{?MODULE,exc_top,3},Result}]), + ?line Result; + {value,_}=Result -> + + ?line expect([Rtt,{rtt,{?MODULE,exc_top,3}}, + ?LINE,{rft,{?MODULE,exc_top,3},Result}]), + ?line Result; + {exit,Reason}=CR -> + ?line expect({eft,{?MODULE,exc_top,3},CR}), + ?line {crash,Reason}; + {error,Reason}=CR -> + ?line expect({eft,{?MODULE,exc_top,3},CR}), + ?line {crash,{Reason,x_exc_stacktrace()}}; + CR -> + ?line expect({eft,{?MODULE,exc_top,3},CR}), + ?line {crash,CR} + end. + +exc_jump(Func, Args) -> + exc(Func, Args, jump). + +x_exc_jump(ExcOpts, Func, Args) -> + ?line expect({ctt,{?MODULE,exc_jump},[Func,Args]}), + ?line case x_exc(ExcOpts, Func, Args, jump) of + {value,Value}=Result -> + ?line expect({rft,{?MODULE,exc_jump,2},Value}), + ?line Result; + CR -> + ?line expect({eft,{?MODULE,exc_jump,2},CR}), + ?line CR + end. + +exc(Func, Args, jump) -> + exc(Func, Args, do); +exc(Func, Args, do) -> + exc(Func, Args). + +x_exc(ExcOpts, Func, Args, jump) -> + ?line expect({ctt,{?MODULE,exc},[Func,Args,jump]}), + ?line case x_exc(ExcOpts, Func, Args, do) of + {value,Value}=Result -> + ?line expect({rft,{?MODULE,exc,3},Value}), + ?line Result; + CR -> + ?line expect({eft,{?MODULE,exc,3},CR}), + ?line CR + end; +x_exc(ExcOpts, Func, Args, do) -> + ?line expect({ctt,{?MODULE,exc},[Func,Args,do]}), + ?line case x_exc(ExcOpts, Func, Args) of + {value,Value}=Result -> + ?line expect({rft,{?MODULE,exc,3},Value}), + ?line Result; + CR -> + ?line expect({eft,{?MODULE,exc,3},CR}), + ?line CR + end. + +exc({erlang,apply}, [{M,F},A]) -> + erlang:apply(M, F, id(A)); +exc({erlang,apply}, [F,A]) -> + erlang:apply(F, id(A)); +exc({erlang,error}, [E]) -> + erlang:error(id(E)); +exc({erlang,error}, [E,S]) -> + erlang:error(E, id(S)); +exc({erlang,exit}, [E]) -> + erlang:exit(id(E)); +exc({erlang,throw}, [E]) -> + erlang:throw(id(E)); +exc({erlang,'++'}, [A,B]) -> + erlang:'++'(A, id(B)); +exc({?MODULE,match}, [A,B]) -> + match(A, id(B)); +exc({?MODULE,clause}, [A,B]) -> + clause(A, id(B)); +exc({?MODULE,id}, [E]) -> + id(id(E)); +exc({?MODULE,undef}, [E]) -> + undef(id(E)); +exc({?MODULE,lists_reverse}, [A,B]) -> + lists_reverse(A, id(B)); +exc(Func, [A,B]) when is_function(Func, 2) -> + Func(A, id(B)). + +x_exc(ExcOpts, {erlang,apply}=Func0, [{_,_}=Func,Args]=Args0) -> + ?line expect({ctt,{?MODULE,exc},[Func0,Args0]}), + ?line x_exc_body(ExcOpts, Func, Args, true); +x_exc(ExcOpts, {erlang,apply}=Func0, [Func,Args]=Args0) + when is_function(Func, 2)-> + ?line expect({ctt,{?MODULE,exc},[Func0,Args0]}), + ?line x_exc_func(ExcOpts, Func, Args, Args); +x_exc(ExcOpts, {_,_}=Func, Args) -> + ?line expect({ctt,{?MODULE,exc},[Func,Args]}), + ?line x_exc_body(ExcOpts, Func, Args, false); +x_exc(ExcOpts, Func0, [_,Args]=Args0) + when is_function(Func0, 2) -> + ?line expect({ctt,{?MODULE,exc},[Func0,Args0]}), + ?line x_exc_func(ExcOpts, Func0, Args0, Args). + +x_exc_func(ExcOpts, Func, [Func1,Args1]=Args, Id) -> + %% Assumes the called fun =:= fun exc/2, + %% will utterly fail otherwise. + ?line Rtt = not ExcOpts#exc_opts.meta, + ?line {module,M} = erlang:fun_info(Func, module), + ?line {name,F} = erlang:fun_info(Func, name), + ?line expect([{ctt,{?MODULE,id},[Id]}, + ?LINE,{rft,{?MODULE,id,1},Id}, + ?LINE,Rtt,{rtt,{?MODULE,exc,2}}, + ?LINE,{ctt,{M,F},Args}]), + ?line case x_exc(ExcOpts, Func1, Args1) of + {value,Value}=Result -> + ?line expect([{rft,{M,F,2},Value}, + ?LINE,{rft,{?MODULE,exc,2},Value}]), + ?line Result; + CR -> + ?line expect([{eft,{M,F,2},CR}, + ?LINE,{eft,{?MODULE,exc,2},CR}]), + ?line CR + end. + +x_exc_body(ExcOpts, {M,F}=Func, Args, Apply) -> + ?line Nocatch = ExcOpts#exc_opts.nocatch, + ?line Rtt = not ExcOpts#exc_opts.meta, + ?line Id = case Apply of + true -> Args; + false -> lists:last(Args) + end, + ?line expect([{ctt,{?MODULE,id},[Id]}, + ?LINE,{rft,{?MODULE,id,1},Id}, + ?LINE,Rtt,{rtt,{?MODULE,exc,2}}, + ?LINE,{ctt,{M,F},Args}]), + ?line Arity = length(Args), + ?line try exc(Func, Args) of + Value -> + ?line x_exc_value(Rtt, M, F, Args, Arity, Value), + ?line case expect() of + {rtt,{M,F,Arity}} when Rtt, Apply -> + %% We may get the above when + %% applying a BIF. + ?line expect({rft,{?MODULE,exc,2},Value}); + {rtt,{?MODULE,exc,2}} when Rtt, not Apply -> + %% We may get the above when + %% calling a BIF. + ?line expect({rft,{?MODULE,exc,2},Value}); + {rft,{?MODULE,exc,2},Value} -> + ?line ok + end, + ?line {value,Value} + catch + Thrown when Nocatch -> + ?line CR = {error,{nocatch,Thrown}}, + ?line x_exc_exception(Rtt, M, F, Args, Arity, CR), + ?line expect({eft,{?MODULE,exc,2},CR}), + ?line CR; + Class:Reason -> + ?line CR = {Class,Reason}, + ?line x_exc_exception(Rtt, M, F, Args, Arity, CR), + ?line expect({eft,{?MODULE,exc,2},CR}), + ?line CR + end. + +x_exc_value(Rtt, ?MODULE, lists_reverse, [La,Lb], 2, R) -> + ?line L = lists:reverse(Lb, La), + ?line expect([fun ({ctt,{lists,reverse},[L1,L2]}) -> + ?line same(L, lists:reverse(L2, L1)), + ?line next; + (Msg) -> + ?line same({rft,{lists,reverse,2},R}, Msg), + ?line same(R, lists:reverse(L, [])), + ?line done + end, + ?LINE,Rtt,{rtt,{?MODULE,lists_reverse,2}}, + ?LINE,{rft,{?MODULE,lists_reverse,2},R}]); +x_exc_value(_Rtt, M, F, _, Arity, Value) -> + ?line expect({rft,{M,F,Arity},Value}). + +x_exc_exception(_Rtt, ?MODULE, lists_reverse, [La,Lb], 2, CR) -> + ?line L = lists:reverse(Lb, La), + ?line expect([fun ({ctt,{lists,reverse},[L1,L2]}) -> + ?line same(L, lists:reverse(L2, L1)), + ?line next; + (Msg) -> + ?line same({eft,{lists,reverse,2},CR}, Msg), + ?line done + end, + ?LINE,{eft,{?MODULE,lists_reverse,2},CR}]); +x_exc_exception(Rtt, ?MODULE, undef, [_], 1, {Class,Reason}=CR) -> + ?line expect([{ctt,{erlang,Class},[Reason]}, + ?LINE,{eft,{erlang,Class,1},CR}, + ?LINE,Rtt,{rtt,{error_handler,crash,1}}, + ?LINE,{eft,{?MODULE,undef,1},CR}]); +x_exc_exception(_Rtt, M, F, _, Arity, CR) -> + ?line expect({eft,{M,F,Arity},CR}). + +x_exc_stacktrace() -> + x_exc_stacktrace(erlang:get_stacktrace()). +%% Truncate stacktrace to below exc/2 +x_exc_stacktrace([{?MODULE,x_exc,4}|_]) -> []; +x_exc_stacktrace([{?MODULE,x_exc_func,4}|_]) -> []; +x_exc_stacktrace([{?MODULE,x_exc_body,4}|_]) -> []; +x_exc_stacktrace([{?MODULE,exc,2}|_]) -> []; +x_exc_stacktrace([H|T]) -> + [H|x_exc_stacktrace(T)]. + + + +match(A, B) -> + A = B. + +clause(A, A) -> + A. + +id(Id) -> + Id. + +undef(X) -> + ?MODULE:undef(X, X). % undef + +lists_reverse(A, B) -> + lists:reverse(A, B). + + + +%%% Tracee (slave) handling %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% + +slave(Dest, Sync) -> + Dest ! Sync, + receive + {From,Tag,{apply,M,F,A}} when is_pid(From) -> + ?line ?dbgformat("Apply: ~p:~p/~p (~p)~n",[M,F,length(A),A]), + ?line Res = apply(M,F,A), + ?line ?dbgformat("done Apply: ~p:~p/~p (~p)~n",[M,F,length(A),A]), + From ! {Tag,Res}, + slave(From, Tag); + {From,Tag,{lambda,Fun}} when is_pid(From) -> + Res = Fun(), + From ! {Tag,Res}, + slave(From, Tag); + {From,Tag,{exc_top,Catch,Func,Args}} when is_pid(From) -> + ?line ?dbgformat("Exc: ~p ~p~p ~n",[Catch,Func,Args]), + ?line Res = exc_top(Catch, Func, Args), + ?line ?dbgformat("done Exc: ~p ~p~p ~n",[Catch,Func,Args]), + From ! {Tag,Res}, + slave(From,Tag); + die -> + exit(normal) + end. + +setup(ProcFlags) -> + trace_off(), + flush(100), + Self = self(), + Sync = make_ref(), + Pid = spawn(fun () -> slave(Self, Sync) end), + Mref = erlang:monitor(process, Pid), + receive + Sync -> + put(slave, {Pid,Mref}), + case ProcFlags of + [] -> ok; + _ -> + erlang:trace(Pid, true, ProcFlags) + end, + Pid + end. + +shutdown() -> + trace_off(), + {Pid,Mref} = get(slave), + try erlang:is_process_alive(Pid) of + true -> + Pid ! die, + receive + {'DOWN',Mref,process,Pid,Reason} -> + Reason + end; + _ -> + not_alive + catch _:_ -> + undefined + end. + +trace_off() -> + erlang:trace_pattern({'_','_','_'},false,[]), + erlang:trace_pattern({'_','_','_'},false,[local]), + erlang:trace_pattern({'_','_','_'},false,[meta]), + erlang:trace(all, false, [all]). + + +apply_slave_async(M,F,A) -> + {Pid,Mref} = get(slave), + spawn(?MODULE,apply_slave_async,[M,F,A,Pid,Mref]), + Pid. + +apply_slave_async(M,F,A,Pid,Mref) -> + Tag = make_ref(), + Pid ! {self(),Tag,{apply,M,F,A}}, + result(Tag, Mref). + +apply_slave(M,F,A) -> + request({apply,M,F,A}). + +lambda_slave(Fun) -> + request({lambda,Fun}). + +exc_slave(Opts, Func, Args) -> + try request({exc_top,Opts,Func,Args}) + catch + Reason -> + {crash,Reason} + end. + +request(Request) -> + Tag = make_ref(), + {Pid,Mref} = get(slave), + Pid ! {self(),Tag,Request}, + result(Tag, Mref). + +result(Tag, Mref) -> + receive + {Tag,Result} -> + receive + Tag -> + Result + end; + {'DOWN',Mref,process,_Pid,Reason} -> + throw(Reason) + end. + + + +%%% Some receive helpers %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% + +receive_next() -> + receive_next(?DEFAULT_RECEIVE_TIMEOUT). + +receive_next(TO) -> + receive + M -> + M + after TO -> + ?t:fail(timeout) + end. + +receive_no_next(TO) -> + receive M -> + ?t:fail({unexpected_message,[M|flush(TO)]}) + after TO -> + ok + end. + +flush(T) -> + receive + M -> + [M|flush(T)] + after T -> + [] + end. + + + +%%% Helpers %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% + +%% Do not build garbage +%% +seq(M, N, R) when M =< N -> + seq(M, N-1, [N|R]); +seq(_, _, R) -> R. + +%% Do not call traced lists:reverse +reverse(L) -> + reverse(L, []). +%% +reverse([], R) -> R; +reverse([H|T], R) -> + reverse(T, [H|R]). + +%% Abbreviate large complex terms to avoid croaking printout +%% +abbr(Term) -> + abbr(Term, 20). +%% +abbr(Tuple, N) when is_tuple(Tuple) -> + list_to_tuple(abbr_tuple(Tuple, N, 1)); +abbr(List, N) when is_list(List) -> + abbr_list(List, N, []); +abbr(Term, _) -> Term. +%% +abbr_tuple(Tuple, N, J) when J =< size(Tuple) -> + if J > N; N =< 0 -> + ['...']; + true -> + [abbr(element(J, Tuple), N-1)|abbr_tuple(Tuple, J+1, N)] + end; +abbr_tuple(_, _, _) -> + []. +%% +abbr_list(_, 0, R) -> + case io_lib:printable_list(R) of + true -> + reverse(R, "..."); + false -> + reverse(R, '...') + end; +abbr_list([H|T], N, R) -> + M = N-1, + abbr_list(T, M, [abbr(H, M)|R]); +abbr_list(T, _, R) -> + reverse(R, T). diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_meta_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/trace_meta_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/trace_meta_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_meta_SUITE.erl 2009-09-18 15:08:35.000000000 +0100 @@ -0,0 +1,758 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% +%%% Define to run outside of test server +%%% +%%% -define(STANDALONE,1). +%%% +%%% +%%% Define for debug output +%%% +%%% -define(debug,1). + +-module(trace_meta_SUITE). + +%% Exported end user tests +-export([basic_test/0, return_test/0, on_and_off_test/0, stack_grow_test/0, + info_test/0, tracer_test/0, combo_test/0, nosilent_test/0]). + +%% Internal exports +-export([exported/1, exported_wrap/1, loop/4, id/1, receiver/1]). + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Test server related stuff +%% + +-ifdef(STANDALONE). +-define(config(A,B),config(A,B)). +-export([config/2]). +-else. +-include("test_server.hrl"). +-endif. + +-ifdef(debug). +-ifdef(STANDALONE). +-define(line, erlang:display({?MODULE,?LINE}), ). +-endif. +-define(dbgformat(A,B),io:format(A,B)). +-else. +-ifdef(STANDALONE). +-define(line, noop, ). +-endif. +-define(dbgformat(A,B),noop). +-endif. + +-ifdef(STANDALONE). +config(priv_dir,_) -> + ".". +-else. +%% When run in test server. +-export([all/1, init_per_testcase/2, fin_per_testcase/2, not_run/1]). +-export([basic/1, return/1, on_and_off/1, stack_grow/1, + info/1, tracer/1, combo/1, nosilent/1]). + +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(test_server:minutes(5)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + shutdown(), + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. +all(doc) -> + ["Test meta tracing of local function calls and return trace."]; +all(suite) -> + case test_server:is_native(?MODULE) of + true -> [not_run]; + false -> [basic, return, on_and_off, stack_grow, + info, tracer, combo, nosilent] + end. + +not_run(Config) when is_list(Config) -> + {skipped,"Native code"}. + +basic(suite) -> + []; +basic(doc) -> + ["Tests basic meta trace"]; +basic(Config) when is_list(Config) -> + basic_test(). + +return(suite) -> + []; +return(doc) -> + ["Tests return trace"]; +return(Config) when is_list(Config) -> + return_test(). + +on_and_off(suite) -> + []; +on_and_off(doc) -> + ["Tests turning trace parameters on and off"]; +on_and_off(Config) when is_list(Config) -> + on_and_off_test(). + +stack_grow(doc) -> + ["Tests the stack growth during return traces"]; +stack_grow(Config) when is_list(Config) -> + stack_grow_test(). + +info(doc) -> + ["Tests the trace_info BIF"]; +info(Config) when is_list(Config) -> + info_test(). + +tracer(suite) -> + []; +tracer(doc) -> + ["Tests stopping and changing tracer process"]; +tracer(Config) when is_list(Config) -> + tracer_test(). + +combo(suite) -> + []; +combo(doc) -> + ["Tests combining local call trace with meta trace"]; +combo(Config) when is_list(Config) -> + combo_test(). + +nosilent(suite) -> + []; +nosilent(doc) -> + ["Tests that meta trace is not silenced by the silent process flag"]; +nosilent(Config) when is_list(Config) -> + nosilent_test(). + +-endif. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Result examination macros + +-define(CT(P,MFA),{trace,P,call,MFA}). +-define(CTT(P, MFA),{trace_ts,P,call,MFA,{_,_,_}}). +-define(RF(P,MFA,V),{trace,P,return_from,MFA,V}). +-define(RFT(P,MFA,V),{trace_ts,P,return_from,MFA,V,{_,_,_}}). +-define(RT(P,MFA),{trace,P,return_to,MFA}). +-define(RTT(P,MFA),{trace_ts,P,return_to,MFA,{_,_,_}}). +-define(NM, receive_no_next(100)). + +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% The Tests +%%% + +basic_test() -> + ?line Pid = setup(), + ?line erlang:trace_pattern({?MODULE,'_','_'},[],[meta]), + ?line [1,1,1,0] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CTT(Pid,{?MODULE,exported_wrap,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,exported,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,local,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,local2,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,local_tail,[1]}) = receive_next(), + ?line erlang:trace_pattern({?MODULE,'_','_'},false,[meta]), + ?line [1,1,1,0] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?NM, + ?line [1,1,1,0] = lambda_slave(fun() -> + exported_wrap(1) + end), + ?line ?NM, + ?line erlang:trace_pattern({?MODULE,'_','_'},[],[meta]), + ?line [1,1,1,0] = lambda_slave(fun() -> + exported_wrap(1) + end), + ?line ?CTT(Pid,{?MODULE,_,_}) = receive_next(), %% The fun + ?line ?CTT(Pid,{?MODULE,exported_wrap,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,exported,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,local,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,local2,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,local_tail,[1]}) = receive_next(), + ?line erlang:trace_pattern({?MODULE,'_','_'},false,[meta]), + ?line shutdown(), + ?line ?NM, + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +return_test() -> + ?line Pid = setup(), + ?line erlang:trace_pattern({?MODULE,'_','_'},[{'_',[],[{return_trace}]}], + [meta]), + ?line erlang:trace_pattern({erlang,phash2,'_'},[{'_',[],[{return_trace}]}], + [meta]), + ?line [1,1,1,0] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CTT(Pid,{?MODULE,exported_wrap,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,exported,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,local,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,local2,[1]}) = receive_next(), + ?line ?CTT(Pid,{?MODULE,local_tail,[1]}) = receive_next(), + ?line ?CTT(Pid,{erlang,phash2,[1,1]}) = receive_next(), + ?line ?RFT(Pid,{erlang,phash2,2},0) = receive_next(), + ?line ?RFT(Pid,{?MODULE,local_tail,1},[1,0]) = receive_next(), + ?line ?RFT(Pid,{?MODULE,local2,1},[1,0]) = receive_next(), + ?line ?RFT(Pid,{?MODULE,local,1},[1,1,0]) = receive_next(), + ?line ?RFT(Pid,{?MODULE,exported,1},[1,1,1,0]) = receive_next(), + ?line ?RFT(Pid,{?MODULE,exported_wrap,1},[1,1,1,0]) = receive_next(), + ?line shutdown(), + ?line ?NM, + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +on_and_off_test() -> + ?line Pid = setup(), + ?line 1 = erlang:trace_pattern({?MODULE,local_tail,1},[],[meta]), + ?line LocalTail = fun() -> + local_tail(1) + end, + ?line [1,0] = lambda_slave(LocalTail), + ?line ?CTT(Pid,{?MODULE,local_tail,[1]}) = receive_next(), + ?line 0 = erlang:trace_pattern({?MODULE,local_tail,1},[],[global]), + ?line [1,0] = lambda_slave(LocalTail), + ?line ?NM, + ?line 1 = erlang:trace_pattern({?MODULE,exported_wrap,1},[],[meta]), + ?line [1,1,1,0] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CTT(Pid,{?MODULE,exported_wrap,[1]}) = receive_next(), + ?line 1 = erlang:trace_pattern({erlang,phash2,2},[],[meta]), + ?line [1,1,1,0] = apply_slave(?MODULE,exported_wrap,[1]), + ?line ?CTT(Pid,{?MODULE,exported_wrap,[1]}) = receive_next(), + ?line ?CTT(Pid,{erlang,phash2,[1,1]}) = receive_next(), + ?line shutdown(), + ?line erlang:trace_pattern({'_','_','_'},false,[meta]), + ?line N = erlang:trace_pattern({erlang,'_','_'},true,[meta]), + ?line case erlang:trace_pattern({erlang,'_','_'},false,[meta]) of + N -> + ok; + Else -> + exit({number_mismatch, {expected, N}, {got, Else}}) + end, + ?line case erlang:trace_pattern({erlang,'_','_'},false,[meta]) of + N -> + ok; + Else2 -> + exit({number_mismatch, {expected, N}, {got, Else2}}) + end, + ?line ?NM, + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +stack_grow_test() -> + ?line Pid = setup(), + ?line 1 = erlang:trace_pattern({?MODULE,loop,4}, + [{'_',[],[{return_trace}]}],[meta]), + ?line Num = 1 bsl 15, + ?line Surface = + fun (This, ?RFT(P,{?MODULE,loop,4},N), N) when P == Pid-> + if N == Num -> + ?NM, + ok; + true -> + This(This, receive_next(), N+1) + end + end, + ?line Dive = + fun (This, ?CTT(P,{?MODULE,loop,[{hej,hopp},[a,b,c],4.5,N]}), N) + when P == Pid-> + if N == 0 -> + Surface(Surface, receive_next(), 0); + true -> + This(This, receive_next(), N-1) + end + end, + ?line apply_slave(?MODULE,loop,[{hej,hopp},[a,b,c],4.5,Num]), +% ?line apply_slave_async(?MODULE,loop,[{hej,hopp},[a,b,c],4.5,Num]), +% ?line List = collect(test_server:seconds(5)), + ?line ok = Dive(Dive, receive_next(), Num), + ?line ?NM, + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +info_test() -> + ?line setup(), + ?line Prog = [{['$1'],[{is_integer,'$1'}],[{message, false}]}, + {'_',[],[]}], + ?line Self = self(), + ?line GoOn = make_ref(), + + ?line Pid = + spawn_link( + fun () -> + erlang:trace_pattern({?MODULE,exported_wrap,1}, + Prog, [{meta, Self}]), + Self ! {self(), GoOn} + end), + ?line receive {Pid, GoOn} -> ok end, + ?line {traced,false} = erlang:trace_info({?MODULE,exported_wrap,1}, traced), + ?line {match_spec, false} = + erlang:trace_info({?MODULE,exported_wrap,1}, match_spec), + ?line {meta, Self} = erlang:trace_info({?MODULE,exported_wrap,1}, meta), + ?line {meta_match_spec, MMS} = + erlang:trace_info({?MODULE,exported_wrap,1}, meta_match_spec), + ?line case MMS of + Prog -> + ok; + Wrong -> + exit({bad_result, {erlang,trace_info, + [{?MODULE,exported_wrap,1}, + meta_match_spec]}, + {expected, Prog}, {got, Wrong}}) + end, + ?line erlang:garbage_collect(self()), + ?line receive + after 1 -> + ok + end, + ?line io:format("~p~n",[MMS]), + ?line {meta_match_spec,MMS2} = + erlang:trace_info({?MODULE,exported_wrap,1}, meta_match_spec), + ?line io:format("~p~n",[MMS2]), + ?line case MMS2 of + Prog -> + ok; + Wrong2 -> + exit({bad_result, {erlang,trace_info, + [{?MODULE,exported_wrap,1}, + meta_match_spec]}, + {expected, Prog}, {got, Wrong2}}) + end, + ?line {all, [_|_]=L} = erlang:trace_info({?MODULE,exported_wrap,1}, all), + ?line {value, {meta, Self}} = + lists:keysearch(meta, 1, L), + ?line {value, {meta_match_spec, MMS}} = + lists:keysearch(meta_match_spec, 1, L), + + ?line erlang:trace_pattern({?MODULE,exported_wrap,1}, true, [meta]), + ?line {meta_match_spec, []} = + erlang:trace_info({?MODULE,exported_wrap,1}, meta_match_spec), + + ?line erlang:trace_pattern({?MODULE,exported_wrap,1}, false, [meta]), + ?line {meta, false} = erlang:trace_info({?MODULE,exported_wrap,1}, meta), + ?line {meta_match_spec, false} = + erlang:trace_info({?MODULE,exported_wrap,1}, meta_match_spec), + ?line {all, false} = erlang:trace_info({?MODULE,exported_wrap,1}, all), + + ?line shutdown(), + ?line ?NM, + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +tracer_test() -> + ?line Slave = setup(), + ?line Self = self(), + + ?line MatchSpec = [{'_',[],[{return_trace}]}], + ?line Tracer1 = spawn_link(fun () -> relay_n(3, Self) end), + ?line Setter = + spawn_link( + fun () -> + erlang:trace_pattern({?MODULE,receiver,1}, + MatchSpec, + [{meta,Tracer1}]), + erlang:trace_pattern({erlang,phash2,2}, + MatchSpec, + [{meta,Tracer1}]), + Self ! {self(), done} + end), + ?line receive {Setter, done} -> ok end, + ?line Ref = make_ref(), + ?line apply_slave_async(?MODULE, receiver, [Ref]), + ?line {Tracer1,?CTT(Slave,{?MODULE,receiver,[Ref]})} = receive_next(100), + ?line {Tracer1,?CTT(Slave,{erlang,phash2,[1,1]})} = receive_next(100), + ?line {Tracer1,?RFT(Slave,{erlang,phash2,2},0)} = receive_next(100), + %% Initiate a return_trace that will fail since the tracer just stopped + ?line Slave ! Ref, + ?line receive_no_next(100), + %% The breakpoint has not been hit since the tracer stopped + ?line {meta,Tracer1} = + erlang:trace_info({?MODULE,receiver,1}, meta), + ?line {meta_match_spec, MatchSpec} = + erlang:trace_info({?MODULE,receiver,1}, meta_match_spec), + ?line {meta,Tracer1} = + erlang:trace_info({erlang,phash2,2}, meta), + ?line {meta_match_spec, MatchSpec} = + erlang:trace_info({erlang,phash2,2}, meta_match_spec), + %% Initiate trace messages that will fail + ?line Ref2 = make_ref(), + ?line apply_slave_async(?MODULE, receiver, [Ref2]), + ?line Slave ! Ref2, + ?line receive_no_next(100), + ?line {meta,[]} = + erlang:trace_info({?MODULE,receiver,1}, meta), + ?line {meta_match_spec, MatchSpec} = + erlang:trace_info({?MODULE,receiver,1}, meta_match_spec), + ?line {meta,[]} = + erlang:trace_info({erlang,phash2,2}, meta), + ?line {meta_match_spec, MatchSpec} = + erlang:trace_info({erlang,phash2,2}, meta_match_spec), + %% Change tracer + ?line Tracer2 = spawn_link(fun () -> relay_n(4, Self) end), + ?line erlang:trace_pattern({?MODULE,receiver,1}, + MatchSpec, + [{meta,Tracer2}]), + ?line erlang:trace_pattern({erlang,phash2,2}, + MatchSpec, + [{meta,Tracer2}]), + ?line Ref3 = make_ref(), + ?line apply_slave_async(?MODULE, receiver, [Ref3]), + ?line {Tracer2,?CTT(Slave,{?MODULE,receiver,[Ref3]})} = receive_next(), + ?line {Tracer2,?CTT(Slave,{erlang,phash2,[1,1]})} = receive_next(), + ?line {Tracer2,?RFT(Slave,{erlang,phash2,2},0)} = receive_next(), + %% Change tracer between call trace and return trace + ?line Tracer3 = spawn_link(fun () -> relay_n(4, Self) end), + ?line erlang:trace_pattern({?MODULE,receiver,1}, + MatchSpec, + [{meta,Tracer3}]), + ?line erlang:trace_pattern({erlang,phash2,2}, + MatchSpec, + [{meta,Tracer3}]), + ?line Slave ! Ref3, + %% The return trace should still come from Tracer2 + ?line {Tracer2,?RFT(Slave,{?MODULE,receiver,1},Ref3)} = receive_next(), + ?line Ref4 = make_ref(), + %% Now should Tracer3 be used + ?line apply_slave_async(?MODULE, receiver, [Ref4]), + ?line Slave ! Ref4, + ?line {Tracer3,?CTT(Slave,{?MODULE,receiver,[Ref4]})} = receive_next(), + ?line {Tracer3,?CTT(Slave,{erlang,phash2,[1,1]})} = receive_next(), + ?line {Tracer3,?RFT(Slave,{erlang,phash2,2},0)} = receive_next(), + ?line {Tracer3,?RFT(Slave,{?MODULE,receiver,1},Ref4)} = receive_next(), + %% The breakpoint has not been hit since the tracer stopped + ?line {meta,Tracer3} = + erlang:trace_info({?MODULE,receiver,1}, meta), + ?line {meta_match_spec, MatchSpec} = + erlang:trace_info({?MODULE,receiver,1}, meta_match_spec), + ?line {meta,Tracer3} = + erlang:trace_info({erlang,phash2,2}, meta), + ?line {meta_match_spec, MatchSpec} = + erlang:trace_info({erlang,phash2,2}, meta_match_spec), + + ?line shutdown(), + ?line ?NM, + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +combo_test() -> + ?line Slave = setup(), + ?line Self = self(), + + ?line MatchSpec = [{'_',[],[{return_trace}]}], + ?line Flags = lists:sort([call, return_to]), + ?line LocalTracer = spawn_link(fun () -> relay_n(6, Self) end), + ?line MetaTracer = spawn_link(fun () -> relay_n(4, Self) end), + ?line 1 = erlang:trace_pattern({?MODULE,receiver,1}, + MatchSpec, + [local,{meta,MetaTracer}]), + ?line 1 = erlang:trace_pattern({erlang,phash2,2}, + MatchSpec, + [local,{meta,MetaTracer}]), + ?line 1 = erlang:trace(Slave, true, + [{tracer,LocalTracer} | Flags]), + %% + ?line {all, TraceInfo1} = + erlang:trace_info({?MODULE,receiver,1}, all), + ?line {meta,MetaTracer} = + erlang:trace_info({?MODULE,receiver,1}, meta), + ?line {value,{meta,MetaTracer}} = + lists:keysearch(meta, 1, TraceInfo1), + ?line {meta_match_spec,MatchSpec} = + erlang:trace_info({?MODULE,receiver,1}, meta_match_spec), + ?line {value,{meta_match_spec,MatchSpec}} = + lists:keysearch(meta_match_spec, 1, TraceInfo1), + ?line {traced,local} = + erlang:trace_info({?MODULE,receiver,1}, traced), + ?line {value,{traced,local}} = + lists:keysearch(traced, 1, TraceInfo1), + ?line {match_spec,MatchSpec} = + erlang:trace_info({?MODULE,receiver,1}, match_spec), + ?line {value,{match_spec,MatchSpec}} = + lists:keysearch(match_spec, 1, TraceInfo1), + %% + ?line {all, TraceInfo2} = + erlang:trace_info({erlang,phash2,2}, all), + ?line {meta,MetaTracer} = + erlang:trace_info({erlang,phash2,2}, meta), + ?line {value,{meta,MetaTracer}} = + lists:keysearch(meta, 1, TraceInfo2), + ?line {meta_match_spec,MatchSpec} = + erlang:trace_info({erlang,phash2,2}, meta_match_spec), + ?line {value,{meta_match_spec,MatchSpec}} = + lists:keysearch(meta_match_spec, 1, TraceInfo2), + ?line {traced,local} = + erlang:trace_info({erlang,phash2,2}, traced), + ?line {value,{traced,local}} = + lists:keysearch(traced, 1, TraceInfo2), + ?line {match_spec,MatchSpec} = + erlang:trace_info({erlang,phash2,2}, match_spec), + ?line {value,{match_spec,MatchSpec}} = + lists:keysearch(match_spec, 1, TraceInfo2), + %% + ?line {flags,Flags1} = erlang:trace_info(Slave, flags), + ?line Flags = lists:sort(Flags1), + ?line {tracer,LocalTracer} = erlang:trace_info(Slave, tracer), + %% + ?line Ref = make_ref(), + ?line apply_slave_async(?MODULE, receiver, [Ref]), + ?line Slave ! Ref, + ?line ?CTT(Slave,{?MODULE,receiver,[Ref]}) = receive_next_bytag(MetaTracer), + ?line ?CTT(Slave,{erlang,phash2,[1,1]}) = receive_next_bytag(MetaTracer), + ?line ?RFT(Slave,{erlang,phash2,2},0) = receive_next_bytag(MetaTracer), + ?line ?RFT(Slave,{?MODULE,receiver,1},Ref) = receive_next_bytag(MetaTracer), + ?line ?CT(Slave,{?MODULE,receiver,[Ref]}) = receive_next_bytag(LocalTracer), + ?line ?CT(Slave,{erlang,phash2,[1,1]}) = receive_next_bytag(LocalTracer), + ?line case {receive_next_bytag(LocalTracer), + receive_next_bytag(LocalTracer)} of + {?RF(Slave,{erlang,phash2,2},0), + ?RT(Slave,{?MODULE,receiver,1})} -> + ?line ok; + {?RT(Slave,{?MODULE,receiver,1}), + ?RF(Slave,{erlang,phash2,2},0)} -> + ?line ok; + Error1 -> ?t:fail({unexpected_message, Error1}) + end, + ?line case {receive_next_bytag(LocalTracer), + receive_next_bytag(LocalTracer)} of + {?RF(Slave,{?MODULE,receiver,1},Ref), + ?RT(Slave,{?MODULE,slave,1})} -> + ?line ok; + {?RT(Slave,{?MODULE,slave,1}), + ?RF(Slave,{?MODULE,receiver,1},Ref)} -> + ?line ok; + Error2 -> ?t:fail({unexpected_message, Error2}) + end, + + ?line shutdown(), + ?line ?NM, + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Use case for Inviso meta tracing: +%% Setup silent local call tracing, and start it using meta trace. + +nosilent_test() -> + ?line Pid = setup(), + ?line Trigger = {?MODULE,id,1}, + ?line TriggerMS = [{[start],[],[{silent,false}]}, + {[stop],[],[{silent,true},{return_trace}]}], + ?line 1 = erlang:trace(Pid, true, [call,silent,return_to]), + ?line erlang:trace_pattern({?MODULE,'_','_'},[],[local]), + ?line 1 = erlang:trace_pattern({?MODULE,local2,1}, + [{'_',[],[{return_trace}]}], + [local]), + ?line 1 = erlang:trace_pattern({?MODULE,slave,1},false,[local]), + ?line 1 = erlang:trace_pattern(Trigger,false,[local]), + ?line 1 = erlang:trace_pattern(Trigger,TriggerMS,[meta]), + ?line [1,1,1,0] = apply_slave(?MODULE,exported_wrap,[1]), + ?line receive_no_next(17), + ?line start = apply_slave(?MODULE, id, [start]), + ?line ?CTT(Pid,{?MODULE,id,[start]}) = receive_next(), + ?line [2,2,2,0] = apply_slave(?MODULE,exported_wrap,[2]), + ?line ?CT(Pid,{?MODULE,exported_wrap,[2]}) = receive_next(), + ?line ?CT(Pid,{?MODULE,exported,[2]}) = receive_next(), + ?line ?CT(Pid,{?MODULE,local,[2]}) = receive_next(), + ?line ?CT(Pid,{?MODULE,local2,[2]}) = receive_next(), + ?line ?CT(Pid,{?MODULE,local_tail,[2]}) = receive_next(), + ?line ?RF(Pid,{?MODULE,local2,1}, [2,0]) = receive_next(), + ?line ?RT(Pid,{?MODULE,local,1}) = receive_next(), + ?line ?RT(Pid,{?MODULE,exported,1}) = receive_next(), + ?line ?RT(Pid,{?MODULE,slave,1}) = receive_next(), + ?line stop = apply_slave(?MODULE, id, [stop]), + ?line ?CTT(Pid,{?MODULE,id,[stop]}) = receive_next(), + ?line ?RFT(Pid,{?MODULE,id,1}, stop) = receive_next(), + ?line [3,3,3,0] = apply_slave(?MODULE,exported_wrap,[3]), + ?line receive_no_next(17), + ?line shutdown(), + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Trace target functions + +loop(D1,D2,D3,0) -> + io:format("~p~n",[[D1,D2,D3]]), + 0; +loop(D1,D2,D3,N) -> + max(N,loop(D1,D2,D3,N-1)). + +max(A,B) when A > B -> + A; +max(_A,B) -> + B. + +id(X) -> + X. + + +exported_wrap(Val) -> + exported(Val). + +exported(Val) -> + [Val | local(Val)]. %% Non tail recursive local call + +local(Val) -> + [Val | local2(Val)]. %% Non tail recursive local call + +local2(Val) -> + local_tail(Val). %% Tail recursive call + +local_tail(Val) -> + [Val , erlang:phash2(1,1)]. + + + +receiver(Msg) -> + erlang:phash2(1,1), + receive Msg -> Msg end. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Trace target process and utilities + +slave(Sync) -> + Sync ! sync, + receive + {From,apply, M, F, A} -> + ?line ?dbgformat("Apply: ~p:~p/~p (~p)~n",[M,F,length(A),A]), + ?line Res = apply(M,F,A), + ?line ?dbgformat("done Apply: ~p:~p/~p (~p)~n",[M,F,length(A),A]), + From ! {apply, Res}, + erlang:trace_pattern({?MODULE,slave,1},false,[meta]), + slave(From); + {From, lambda, Fun} -> + Res = Fun(), + From ! {lambda, Res}, + erlang:trace_pattern({?MODULE,slave,1},false,[meta]), + slave(From); + die -> + exit(normal) + end. + +setup() -> + trace_off(), + Self = self(), + Pid = spawn(fun () -> slave(Self) end), + receive sync -> ok end, + put(slave,Pid), + Pid. + +shutdown() -> + trace_off(), + Pid = get(slave), + case (catch is_process_alive(Pid)) of + true -> + Ref = erlang:monitor(process,Pid), + Pid ! die, + receive + {'DOWN',Ref,process,Pid,_} -> + ok + end; + _ -> + ok + end. + +trace_off() -> + erlang:trace(all, false, [all]), + erlang:trace_pattern({'_','_','_'},false,[]), + erlang:trace_pattern({'_','_','_'},false,[local]), + erlang:trace_pattern({'_','_','_'},false,[meta]), + erlang:trace_pattern(on_load,false,[]), + erlang:trace_pattern(on_load,false,[local]), + erlang:trace_pattern(on_load,false,[meta]), + ok. + +apply_slave_async(M,F,A) -> + Slave = get(slave), + Pid = + spawn( + fun () -> + Slave ! {self(),apply, M, F, A}, + receive + {apply, _} -> + receive + sync -> + ok + end + end + end), + Pid. + +apply_slave(M,F,A) -> + Pid = get(slave), + Pid ! {self(),apply, M, F, A}, + receive + {apply, Res} -> + receive + sync -> + Res + end + end. + +lambda_slave(Fun) -> + Pid = get(slave), + Pid ! {self(), lambda, Fun}, + receive + {lambda, Res} -> + receive + sync -> + Res + end + end. + +relay_n(0, _) -> + ok; +relay_n(N, Dest) -> + receive Msg -> + Dest ! {self(), Msg}, + relay_n(N-1, Dest) + end. + + +receive_next() -> + receive_next(infinity). + +receive_next(TO) -> + receive + M -> + M + after TO -> + ?t:fail(timeout) + end. + +receive_no_next(TO) -> + receive + M -> + ?t:fail({unexpected_message, M}) + after + TO -> + ok + end. + +receive_next_bytag(Tag) -> + receive_next_bytag(Tag, infinity). +receive_next_bytag(Tag, TO) -> + receive + {Tag, Msg} -> + Msg + after + TO -> + timeout + end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_nif_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/trace_nif_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/trace_nif_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_nif_SUITE_data/Makefile.src 2009-11-20 13:33:11.000000000 +0000 @@ -0,0 +1,7 @@ + +NIF_LIBS = trace_nif@dll@ + +all: $(NIF_LIBS) + +@SHLIB_RULES@ + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_nif_SUITE_data/trace_nif.c erlang-13.b.3-dfsg/erts/emulator/test/trace_nif_SUITE_data/trace_nif.c --- erlang-13.b.1-dfsg/erts/emulator/test/trace_nif_SUITE_data/trace_nif.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_nif_SUITE_data/trace_nif.c 2009-11-20 13:33:11.000000000 +0000 @@ -0,0 +1,46 @@ +#include "erl_nif.h" + + +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +{ + return 0; +} + +static int reload(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +{ + return 0; +} + +static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info) +{ + return 0; +} + +static void unload(ErlNifEnv* env, void* priv_data) +{ +} + +static ERL_NIF_TERM nif_0(ErlNifEnv* env) +{ + return enif_make_tuple(env,2, + enif_make_atom(env,"ok"), + enif_make_list(env,0)); +} + +static ERL_NIF_TERM nif_1(ErlNifEnv* env, ERL_NIF_TERM a1) +{ + return enif_make_tuple(env,2, + enif_make_atom(env,"ok"), + enif_make_list(env,1,a1)); +} + + + +static ErlNifFunc nif_funcs[] = +{ + {"nif", 0, nif_0}, + {"nif", 1, nif_1} +}; + +ERL_NIF_INIT(trace_nif_SUITE,nif_funcs,load,reload,upgrade,unload) + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_nif_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/trace_nif_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/trace_nif_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_nif_SUITE.erl 2009-11-20 13:33:08.000000000 +0000 @@ -0,0 +1,292 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(trace_nif_SUITE). + +-include("test_server.hrl"). + +-export([all/1]). +-export([trace_nif/1, + trace_nif_timestamp/1, + trace_nif_local/1, + trace_nif_meta/1, + trace_nif_timestamp_local/1, + trace_nif_return/1, + not_run/1]). + +-export([nif_process/0, nif/0, nif/1]). + +all(suite) -> + case test_server:is_native(?MODULE) of + true -> [not_run]; + false -> + [trace_nif, + trace_nif_timestamp, + trace_nif_local, + trace_nif_meta, + trace_nif_timestamp_local, + trace_nif_return + ] + end. + +not_run(Config) when is_list(Config) -> + {skipped,"Native code"}. + +trace_nif(doc) -> "Test tracing NIFs."; +trace_nif(Config) when is_list(Config) -> + load_nif(Config), + + do_trace_nif([]). + +trace_nif_local(doc) -> "Test tracing NIFs with local flag."; +trace_nif_local(Config) when is_list(Config) -> + load_nif(Config), + do_trace_nif([local]). + +trace_nif_meta(doc) -> "Test tracing NIFs with meta flag."; +trace_nif_meta(Config) when is_list(Config) -> + load_nif(Config), + ?line Pid=spawn_link(?MODULE, nif_process, []), + ?line erlang:trace_pattern({?MODULE,nif,'_'}, [], [meta]), + + ?line Pid ! {apply_nif, nif, []}, + ?line receive_trace_msg_ts({trace_ts,Pid,call,{?MODULE,nif,[]}}), + + ?line Pid ! {apply_nif, nif, ["Arg1"]}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {?MODULE,nif, ["Arg1"]}}), + + ?line Pid ! {call_nif, nif, []}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {?MODULE,nif, []}}), + + ?line Pid ! {call_nif, nif, ["Arg1"]}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {?MODULE,nif, ["Arg1"]}}), + ok. +do_trace_nif(Flags) -> + ?line Pid = spawn(?MODULE, nif_process, []), + ?line 1 = erlang:trace(Pid, true, [call]), + ?line erlang:trace_pattern({?MODULE,nif,'_'}, [], Flags), + ?line Pid ! {apply_nif, nif, []}, + ?line receive_trace_msg({trace,Pid,call,{?MODULE,nif, []}}), + ?line Pid ! {apply_nif, nif, ["Arg1"]}, + ?line receive_trace_msg({trace,Pid,call,{?MODULE,nif, ["Arg1"]}}), + + ?line Pid ! {call_nif, nif, []}, + ?line receive_trace_msg({trace, Pid, call, {?MODULE,nif, []}}), + + ?line Pid ! {call_nif, nif, ["Arg1"]}, + ?line receive_trace_msg({trace, Pid, call, {?MODULE,nif, ["Arg1"]}}), + + + %% Switch off + ?line 1 = erlang:trace(Pid, false, [call]), + + ?line Pid ! {apply_nif, nif, []}, + receive_nothing(), + ?line Pid ! {apply_nif, nif, ["Arg1"]}, + receive_nothing(), + ?line Pid ! {call_nif, nif, []}, + receive_nothing(), + ?line Pid ! {call_nif, nif, ["Arg1"]}, + receive_nothing(), + + %% Switch on again + ?line 1 = erlang:trace(Pid, true, [call]), + ?line erlang:trace_pattern({?MODULE,nif,'_'}, [], Flags), + ?line Pid ! {apply_nif, nif, []}, + ?line receive_trace_msg({trace,Pid,call,{?MODULE,nif, []}}), + ?line Pid ! {apply_nif, nif, ["Arg1"]}, + ?line receive_trace_msg({trace,Pid,call,{?MODULE,nif, ["Arg1"]}}), + + ?line Pid ! {call_nif, nif, []}, + ?line receive_trace_msg({trace, Pid, call, {?MODULE,nif, []}}), + + ?line Pid ! {call_nif, nif, ["Arg1"]}, + ?line receive_trace_msg({trace, Pid, call, {?MODULE,nif, ["Arg1"]}}), + + ?line 1 = erlang:trace(Pid, false, [call]), + ?line erlang:trace_pattern({?MODULE,nif,'_'}, false, Flags), + ?line exit(Pid, die), + ok. + +trace_nif_timestamp(doc) -> "Test tracing NIFs with timestamps."; +trace_nif_timestamp(Config) when is_list(Config) -> + load_nif(Config), + do_trace_nif_timestamp([]). + +trace_nif_timestamp_local(doc) -> + "Test tracing NIFs with timestamps and local flag."; +trace_nif_timestamp_local(Config) when is_list(Config) -> + load_nif(Config), + do_trace_nif_timestamp([local]). + +do_trace_nif_timestamp(Flags) -> + ?line Pid=spawn(?MODULE, nif_process, []), + ?line 1 = erlang:trace(Pid, true, [call,timestamp]), + ?line erlang:trace_pattern({?MODULE,nif,'_'}, [], Flags), + + ?line Pid ! {apply_nif, nif, []}, + ?line receive_trace_msg_ts({trace_ts,Pid,call,{?MODULE,nif,[]}}), + + ?line Pid ! {apply_nif, nif, ["Arg1"]}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {?MODULE,nif, ["Arg1"]}}), + + ?line Pid ! {call_nif, nif, []}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {?MODULE,nif, []}}), + + ?line Pid ! {call_nif, nif, ["Arg1"]}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {?MODULE,nif, ["Arg1"]}}), + + %% We should be able to turn off the timestamp. + ?line 1 = erlang:trace(Pid, false, [timestamp]), + + ?line Pid ! {call_nif, nif, []}, + ?line receive_trace_msg({trace,Pid,call, + {?MODULE,nif, []}}), + + ?line Pid ! {apply_nif, nif, ["tjoho"]}, + ?line receive_trace_msg({trace,Pid,call, + {?MODULE,nif, ["tjoho"]}}), + + ?line 1 = erlang:trace(Pid, false, [call]), + ?line erlang:trace_pattern({erlang,'_','_'}, false, Flags), + + ?line exit(Pid, die), + ok. + +trace_nif_return(doc) -> + "Test tracing NIF's with return/return_to trace."; +trace_nif_return(Config) when is_list(Config) -> + load_nif(Config), + + ?line Pid=spawn(?MODULE, nif_process, []), + ?line 1 = erlang:trace(Pid, true, [call,timestamp,return_to]), + ?line erlang:trace_pattern({?MODULE,nif,'_'}, [{'_',[],[{return_trace}]}], + [local]), + + ?line Pid ! {apply_nif, nif, []}, + ?line receive_trace_msg_ts({trace_ts,Pid,call,{?MODULE,nif,[]}}), + ?line receive_trace_msg_ts_return_from({trace_ts,Pid,return_from, + {?MODULE,nif,0}}), + ?line receive_trace_msg_ts_return_to({trace_ts,Pid,return_to, + {?MODULE, nif_process,0}}), + + ?line Pid ! {call_nif, nif, ["Arg1"]}, + ?line receive_trace_msg_ts({trace_ts,Pid,call, + {?MODULE,nif, ["Arg1"]}}), + ?line receive_trace_msg_ts_return_from({trace_ts,Pid,return_from, + {?MODULE,nif,1}}), + ?line receive_trace_msg_ts_return_to({trace_ts,Pid,return_to, + {?MODULE, nif_process,0}}), + ok. + + +receive_trace_msg(Mess) -> + receive + Mess -> + ok; + Other -> + io:format("Expected: ~p,~nGot: ~p~n", [Mess, Other]), + ?t:fail() + after 5000 -> + io:format("Expected: ~p,~nGot: timeout~n", [Mess]), + ?t:fail() + end. + +receive_nothing() -> + ?line timeout = receive M -> M after 100 -> timeout end. + +receive_trace_msg_ts({trace_ts, Pid, call, {M,F,A}}) -> + receive + {trace_ts, Pid, call, {M, F, A}, _Ts} -> + ok; + Other -> + io:format("Expected: {trace, ~p, call, {~p, ~p, ~p}, TimeStamp}},~n" + "Got: ~p~n", + [Pid, M, F, A, Other]), + ?t:fail() + after 5000 -> + io:format("Got timeout~n", []), + ?t:fail() + end. + +receive_trace_msg_ts_return_from({trace_ts, Pid, return_from, {M,F,A}}) -> + receive + {trace_ts, Pid, return_from, {M, F, A}, _Value, _Ts} -> + ok; + Other -> + io:format("Expected: {trace_ts, ~p, return_from, {~p, ~p, ~p}, Value, TimeStamp}},~n" + "Got: ~p~n", + [Pid, M, F, A, Other]), + ?t:fail() + after 5000 -> + io:format("Got timeout~n", []), + ?t:fail() + end. + +receive_trace_msg_ts_return_to({trace_ts, Pid, return_to, {M,F,A}}) -> + receive + {trace_ts, Pid, return_to, {M, F, A}, _Ts} -> + ok; + Other -> + io:format("Expected: {trace_ts, ~p, return_to, {~p, ~p, ~p}, TimeStamp}},~n" + "Got: ~p~n", + [Pid, M, F, A, Other]), + ?t:fail() + after 5000 -> + io:format("Got timeout~n", []), + ?t:fail() + end. + +nif_process() -> + receive + {apply_nif, Name, Args} -> + ?line {ok,Args} = apply(?MODULE, Name, Args); + + {call_nif, Name, []} -> + ?line {ok, []} = ?MODULE:Name(); + + {call_nif, Name, [A1]} -> + ?line {ok, [A1]} = ?MODULE:Name(A1); + + {call_nif, Name, [A1,A2]} -> + ?line {ok,[A1,A2]} = ?MODULE:Name(A1,A2); + + {call_nif, Name, [A1,A2,A3]} -> + ?line {ok,[A1,A2,A3]} = ?MODULE:Name(A1,A2,A3) + end, + nif_process(). + +load_nif(Config) -> + ?line Path = ?config(data_dir, Config), + + ?line ok = erlang:load_nif(filename:join(Path,"trace_nif"), 0). + + +nif() -> + {"Stub0",[]}. %exit("nif/0 stub called"). + +nif(A1) -> + {"Stub1",[A1]}. %exit(["nif/1 stub called",A1]). + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_port_SUITE_data/echo_drv.c erlang-13.b.3-dfsg/erts/emulator/test/trace_port_SUITE_data/echo_drv.c --- erlang-13.b.1-dfsg/erts/emulator/test/trace_port_SUITE_data/echo_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_port_SUITE_data/echo_drv.c 2001-10-08 09:48:06.000000000 +0100 @@ -0,0 +1,107 @@ +#include +#include "erl_driver.h" + + + +/* ------------------------------------------------------------------------- +** Data types +**/ + +enum e_heavy { + heavy_off, heavy_set, heavy_reset +}; + +typedef struct _erl_drv_data { + ErlDrvPort erlang_port; + enum e_heavy heavy; +} EchoDrvData; + +static EchoDrvData echo_drv_data, *echo_drv_data_p; + + + +/* ------------------------------------------------------------------------- +** Entry struct +**/ + +static EchoDrvData *echo_drv_start(ErlDrvPort port, char *command); +static void echo_drv_stop(EchoDrvData *data_p); +static void echo_drv_output(EchoDrvData *data_p, char *buf, int len); +static void echo_drv_finish(void); +static int echo_drv_control(EchoDrvData *data_p, unsigned int command, + char *buf, int len, + char **rbuf, int rlen); + +static ErlDrvEntry echo_drv_entry = { + NULL, /* init */ + echo_drv_start, + echo_drv_stop, + echo_drv_output, + NULL, /* ready_input */ + NULL, /* ready_output */ + "echo_drv", + echo_drv_finish, + NULL, /* handle */ + echo_drv_control, + NULL, /* timeout */ + NULL, /* outputv */ + NULL /* ready_async */ +}; + + + +/* ------------------------------------------------------------------------- +** Entry functions +**/ + +DRIVER_INIT(echo_drv) +{ + echo_drv_data_p = NULL; + return &echo_drv_entry; +} + +static EchoDrvData *echo_drv_start(ErlDrvPort port, char *command) +{ + if (echo_drv_data_p != NULL) { + return ERL_DRV_ERROR_GENERAL; + } + echo_drv_data_p = &echo_drv_data; + echo_drv_data_p->erlang_port = port; + echo_drv_data_p->heavy = heavy_off; + return echo_drv_data_p; +} + +static void echo_drv_stop(EchoDrvData *data_p) { + echo_drv_data_p = NULL; +} + +static void echo_drv_output(EchoDrvData *data_p, char *buf, int len) { + driver_output(data_p->erlang_port, buf, len); + switch (data_p->heavy) { + case heavy_off: + break; + case heavy_set: + set_port_control_flags(data_p->erlang_port, PORT_CONTROL_FLAG_HEAVY); + data_p->heavy = heavy_reset; + break; + case heavy_reset: + set_port_control_flags(data_p->erlang_port, 0); + data_p->heavy = heavy_off; + break; + } +} + +static void echo_drv_finish() { + echo_drv_data_p = NULL; +} + +static int echo_drv_control(EchoDrvData *data_p, unsigned int command, + char *buf, int len, + char **rbuf, int rlen) { + switch (command) { + case 'h': + data_p->heavy = heavy_set; + break; + } + return 0; +} diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_port_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/emulator/test/trace_port_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/emulator/test/trace_port_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_port_SUITE_data/Makefile.src 1999-06-14 12:11:13.000000000 +0100 @@ -0,0 +1,3 @@ +all: echo_drv@dll@ + +@SHLIB_RULES@ diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_port_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/trace_port_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/trace_port_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_port_SUITE.erl 2009-11-20 13:30:53.000000000 +0000 @@ -0,0 +1,686 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +-module(trace_port_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + call_trace/1, + return_trace/1, + send/1, + receive_trace/1, + process_events/1, + schedule/1, + fake_schedule/1, + fake_schedule_after_register/1, + fake_schedule_after_getting_linked/1, + fake_schedule_after_getting_unlinked/1, + gc/1, + default_tracer/1]). + +-include("test_server.hrl"). + +test_cases() -> + [call_trace, + return_trace, + send, + receive_trace, + process_events, + schedule, + fake_schedule, + fake_schedule_after_register, + fake_schedule_after_getting_linked, + fake_schedule_after_getting_unlinked, + gc, + default_tracer]. + +all(suite) -> test_cases(). + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Dog = ?t:timetrap(?t:seconds(30)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +call_trace(doc) -> "Test sending call trace messages to a port."; +call_trace(Config) when is_list(Config) -> + case test_server:is_native(?MODULE) of + true -> + {skip,"Native code"}; + false -> + ?line start_tracer(Config), + Self = self(), + ?line trace_func({lists,reverse,1}, []), + ?line trace_pid(Self, true, [call]), + ?line trace_info(Self, flags), + ?line trace_info(Self, tracer), + ?line [b,a] = lists:reverse([a,b]), + ?line expect({trace,Self,call,{lists,reverse,[[a,b]]}}), + + ?line trace_pid(Self, true, [timestamp]), + ?line trace_info(Self, flags), + ?line Huge = huge_data(), + ?line lists:reverse(Huge), + ?line expect({trace_ts,Self,call,{lists,reverse,[Huge]},ts}), + + ?line trace_pid(Self, true, [arity]), + ?line trace_info(Self, flags), + ?line [y,x] = lists:reverse([x,y]), + ?line expect({trace_ts,Self,call,{lists,reverse,1},ts}), + + ?line trace_pid(Self, false, [timestamp]), + ?line trace_info(Self, flags), + ?line [z,y,x] = lists:reverse([x,y,z]), + ?line expect({trace,Self,call,{lists,reverse,1}}), + + %% OTP-7399. Delayed sub-binary creation optimization. + ?line trace_pid(Self, false, [arity]), + ?line trace_info(Self, flags), + ?line trace_func({?MODULE,bs_sum_c,2}, [], [local]), + ?line 26 = bs_sum_c(<<3:4,5:4,7:4,11:4>>, 0), + ?line trace_func({?MODULE,bs_sum_c,2}, false, [local]), + ?line expect({trace,Self,call,{?MODULE,bs_sum_c,[<<3:4,5:4,7:4,11:4>>,0]}}), + ?line expect({trace,Self,call,{?MODULE,bs_sum_c,[<<5:4,7:4,11:4>>,3]}}), + ?line expect({trace,Self,call,{?MODULE,bs_sum_c,[<<7:4,11:4>>,8]}}), + ?line expect({trace,Self,call,{?MODULE,bs_sum_c,[<<11:4>>,15]}}), + ?line expect({trace,Self,call,{?MODULE,bs_sum_c,[<<>>,26]}}), + + ?line trace_func({lists,reverse,1}, false), + ok + end. + +bs_sum_c(<>, Acc) -> bs_sum_c(T, H+Acc); +bs_sum_c(<<>>, Acc) -> Acc. + + +return_trace(doc) -> "Test the new return trace."; +return_trace(Config) when is_list(Config) -> + case test_server:is_native(?MODULE) of + true -> + {skip,"Native code"}; + false -> + ?line start_tracer(Config), + Self = self(), + MFA = {lists,reverse,1}, + + %% Plain (no timestamp, small data). + + ?line trace_func(MFA, [{['$1'],[],[{return_trace}, + {message,false}]}]), + ?line trace_pid(Self, true, [call]), + ?line trace_info(Self, flags), + ?line trace_info(Self, tracer), + ?line trace_info(MFA, match_spec), + ?line {traced,global} = trace_info(MFA, traced), + ?line [b,a] = lists:reverse([a,b]), + ?line expect({trace,Self,return_from,MFA,[b,a]}), + + %% Timestamp, huge data. + ?line trace_pid(Self, true, [timestamp]), + ?line Result = lists:reverse(huge_data()), + ?line expect({trace_ts,Self,return_from,MFA,Result,ts}), + + %% Turn off trace. + ?line trace_func(MFA, false), + ?line trace_info(MFA, match_spec), + ?line {traced,false} = trace_info(MFA, traced), + ok + end. + +send(doc) -> "Test sending send trace messages to a port."; +send(Config) when is_list(Config) -> + ?line Tracer = start_tracer(Config), + Self = self(), + ?line Sender = fun_spawn(fun sender/0), + ?line trac(Sender, true, [send]), + + %% Simple message, no timestamp. + + ?line Bin = list_to_binary(lists:seq(1, 10)), + ?line Msg = {some_data,Bin}, + Sender ! {send_please,self(),Msg}, + receive Msg -> ok end, + ?line expect({trace,Sender,send,Msg,Self}), + + %% Timestamp. + + BiggerMsg = {even_bigger,Msg}, + ?line trac(Sender, true, [send,timestamp]), + Sender ! {send_please,self(),BiggerMsg}, + receive BiggerMsg -> ok end, + ?line expect({trace_ts,Sender,send,BiggerMsg,Self,ts}), + + %% Huge message. + + ?line HugeMsg = huge_data(), + Sender ! {send_please,self(),HugeMsg}, + receive HugeMsg -> ok end, + ?line expect({trace_ts,Sender,send,HugeMsg,Self,ts}), + + %% Kill trace port and force a trace. The emulator should not crasch. + + ?line unlink(Tracer), + ?line exit(Tracer, kill), + erlang:yield(), % Make sure that port gets killed. + Sender ! {send_please,Self,good_bye}, + receive good_bye -> ok end, + ok. + +receive_trace(doc) -> "Test sending receive traces to a port."; +receive_trace(Config) when is_list(Config) -> + ?line start_tracer(Config), + ?line Receiver = fun_spawn(fun receiver/0), + ?line trac(Receiver, true, ['receive']), + + Receiver ! {hello,world}, + ?line expect({trace,Receiver,'receive',{hello,world}}), + + ?line trac(Receiver, true, ['receive',timestamp]), + Huge = {hello,huge_data()}, + Receiver ! {hello,huge_data()}, + ?line expect({trace_ts,Receiver,'receive',Huge,ts}), + ok. + +process_events(doc) -> "Tests a few process events (like getting linked)."; +process_events(Config) when is_list(Config) -> + ?line start_tracer(Config), + Self = self(), + ?line Receiver = fun_spawn(fun receiver/0), + ?line trac(Receiver, true, [procs]), + + unlink(Receiver), %It is already linked. + ?line expect({trace,Receiver,getting_unlinked,Self}), + link(Receiver), + ?line expect({trace,Receiver,getting_linked,Self}), + ?line trac(Receiver, true, [procs,timestamp]), + unlink(Receiver), + ?line expect({trace_ts,Receiver,getting_unlinked,Self,ts}), + link(Receiver), + ?line expect({trace_ts,Receiver,getting_linked,Self,ts}), + + unlink(Receiver), + ?line expect({trace_ts,Receiver,getting_unlinked,Self,ts}), + Huge = huge_data(), + exit(Receiver, Huge), + ?line expect({trace_ts,Receiver,exit,Huge,ts}), + + ok. + +schedule(doc) -> "Test sending scheduling events to a port."; +schedule(Config) when is_list(Config) -> + ?line start_tracer(Config), + ?line Receiver = fun_spawn(fun receiver/0), + ?line trac(Receiver, true, [running]), + + Receiver ! hi, + expect({trace,Receiver,in,{?MODULE,receiver,0}}), + expect({trace,Receiver,out,{?MODULE,receiver,0}}), + + ?line trac(Receiver, true, [running,timestamp]), + + Receiver ! hi_again, + expect({trace_ts,Receiver,in,{?MODULE,receiver,0},ts}), + expect({trace_ts,Receiver,out,{?MODULE,receiver,0},ts}), + + ok. + +run_fake_sched_test(Fun, Config) when is_function(Fun), is_list(Config) -> + ?line case catch erlang:system_info(smp_support) of + true -> + ?line {skipped, + "No need for faked schedule out/in trace messages " + "when smp support is enabled"}; + _ -> + ?line Fun(Config) + end. + +fake_schedule(doc) -> "Tests time compensating fake out/in scheduling."; +fake_schedule(Config) when is_list(Config) -> + ?line run_fake_sched_test(fun fake_schedule_test/1, Config). + +fake_schedule_test(Config) when is_list(Config) -> + ?line Tracer = start_tracer(Config), + ?line Port = get(tracer_port), + ?line General = fun_spawn(fun general/0), + %% + ?line trac(General, true, [send, running]), + %% + %% Test that fake out/in scheduling is not generated unless + %% both 'running' and 'timestamp' is active. + ?line [] = erlang:port_control(Port, $h, []), + ?line General ! nop, + ?line expect({trace, General, in, {?MODULE, general, 0}}), + ?line expect({trace, General, out, {?MODULE, general, 0}}), + ?line expect(), + %% + ?line trac(General, false, [running]), + ?line trac(General, true, [timestamp]), + %% + ?line Ref1 = make_ref(), + ?line Msg1 = {Port, {data, term_to_binary(Ref1)}}, + ?line [] = erlang:port_control(Port, $h, []), + ?line General ! {send, Tracer, Msg1}, + ?line expect({trace_ts, General, send, Msg1, Tracer, ts}), + ?line expect(Ref1), + ?line expect(), + %% + ?line trac(General, true, [running]), + %% + %% Test that fake out/in scheduling can be generated by the driver + ?line Ref2 = make_ref(), + ?line Msg2 = {Port, {data, term_to_binary(Ref2)}}, + ?line [] = erlang:port_control(Port, $h, []), + ?line General ! {send, Tracer, Msg2}, + ?line {_,_,_,_,Ts} = + expect({trace_ts, General, in, {?MODULE, general, 0}, ts}), + ?line expect({trace_ts, General, out, 0, Ts}), + ?line expect({trace_ts, General, in, 0, ts}), + ?line expect({trace_ts, General, send, Msg2, Tracer, ts}), + ?line expect(Ref2), + ?line expect({trace_ts, General, out, {?MODULE, general, 0}, ts}), + ?line expect(), + %% + %% Test that fake out/in scheduling is not generated after an + %% 'out' scheduling event + ?line Ref3 = make_ref(), + ?line Msg3 = {Port, {data, term_to_binary(Ref3)}}, + ?line General ! {apply, {erlang, port_control, [Port, $h, []]}}, + ?line expect({trace_ts, General, in, {?MODULE, general, 0}, ts}), + ?line expect({trace_ts, General, out, {?MODULE, general, 0}, ts}), + ?line General ! {send, Tracer, Msg3}, + ?line expect({trace_ts, General, in, {?MODULE, general, 0}, ts}), + ?line expect({trace_ts, General, send, Msg3, Tracer, ts}), + ?line expect(Ref3), + ?line expect({trace_ts, General, out, {?MODULE, general, 0}, ts}), + ?line expect(), + %% + ok. + +fake_schedule_after_register(doc) -> + "Tests fake out/in scheduling contents."; +fake_schedule_after_register(Config) when is_list(Config) -> + ?line run_fake_sched_test(fun fake_schedule_after_register_test/1, Config). + +fake_schedule_after_register_test(Config) when is_list(Config) -> + ?line start_tracer(Config), + ?line Port = get(tracer_port), + ?line G1 = fun_spawn(fun general/0), + ?line G2 = fun_spawn(fun general/0), + %% + ?line trac(G1, true, [running, timestamp, procs]), + ?line trac(G2, true, [running, timestamp]), + %% + %% Test fake out/in scheduling after certain messages + ?line erlang:yield(), + ?line G2 ! {apply, {erlang, port_control, [Port, $h, []]}}, + ?line G2 ! {apply, {erlang, register, [fake_schedule_after_register, G1]}}, + ?line expect({trace_ts, G2, in, {?MODULE, general, 0}, ts}), + ?line {_,_,_,_,Ts} = + expect({trace_ts, G1, register, fake_schedule_after_register, ts}), + ?line expect({trace_ts, G2, out, 0, Ts}), + ?line expect({trace_ts, G2, in, 0, ts}), + ?line expect({trace_ts, G2, out, {?MODULE, general, 0}, ts}), + ?line expect(), + %% + ok. + +fake_schedule_after_getting_linked(doc) -> + "Tests fake out/in scheduling contents."; +fake_schedule_after_getting_linked(Config) when is_list(Config) -> + ?line run_fake_sched_test(fun fake_schedule_after_getting_linked_test/1, + Config). + +fake_schedule_after_getting_linked_test(Config) when is_list(Config) -> + ?line start_tracer(Config), + ?line Port = get(tracer_port), + ?line G1 = fun_spawn(fun general/0), + ?line G2 = fun_spawn(fun general/0), + %% + ?line trac(G1, true, [running, timestamp, procs]), + ?line trac(G2, true, [running, timestamp]), + %% + %% Test fake out/in scheduling after certain messages + ?line erlang:yield(), + ?line G2 ! {apply, {erlang, port_control, [Port, $h, []]}}, + ?line G2 ! {apply, {erlang, link, [G1]}}, + ?line expect({trace_ts, G2, in, {?MODULE, general, 0}, ts}), + ?line {_,_,_,_,Ts} = + expect({trace_ts, G1, getting_linked, G2, ts}), + ?line expect({trace_ts, G2, out, 0, Ts}), + ?line expect({trace_ts, G2, in, 0, ts}), + ?line expect({trace_ts, G2, out, {?MODULE, general, 0}, ts}), + ?line expect(), + %% + ok. + +fake_schedule_after_getting_unlinked(doc) -> + "Tests fake out/in scheduling contents."; +fake_schedule_after_getting_unlinked(Config) when is_list(Config) -> + ?line run_fake_sched_test(fun fake_schedule_after_getting_unlinked_test/1, + Config). + +fake_schedule_after_getting_unlinked_test(Config) when is_list(Config) -> + ?line start_tracer(Config), + ?line Port = get(tracer_port), + ?line G1 = fun_spawn(fun general/0), + ?line G2 = fun_spawn(fun general/0), + %% + ?line trac(G1, true, [running, procs]), + ?line trac(G2, true, [running, timestamp]), + %% + %% Test fake out/in scheduling after certain messages + ?line erlang:yield(), + ?line G2 ! {apply, {erlang, link, [G1]}}, + ?line G2 ! {apply, {erlang, port_control, [Port, $h, []]}}, + ?line G2 ! {apply, {erlang, unlink, [G1]}}, + ?line expect({trace_ts, G2, in, {?MODULE, general, 0}, ts}), + ?line expect({trace, G1, getting_linked, G2}), + ?line expect({trace, G1, getting_unlinked, G2}), + ?line expect({trace_ts, G2, out, 0, ts}), + ?line expect({trace_ts, G2, in, 0, ts}), + ?line expect({trace_ts, G2, out, {?MODULE, general, 0}, ts}), + ?line expect(), + %% + ok. + +gc(doc) -> "Test sending garbage collection events to a port."; +gc(Config) when is_list(Config) -> + ?line start_tracer(Config), + ?line Garber = fun_spawn(fun garber/0, [{min_heap_size, 5000}]), + ?line trac(Garber, true, [garbage_collection]), + ?line trace_info(Garber, flags), + + ?line trace_info(Garber, flags), + Garber ! hi, + expect({trace,Garber,gc_start,info}), + expect({trace,Garber,gc_end,info}), + + ?line trac(Garber, true, [garbage_collection,timestamp]), + Garber ! hi, + expect({trace_ts,Garber,gc_start,info,ts}), + expect({trace_ts,Garber,gc_end,info,ts}), + + ok. + +default_tracer(doc) -> + "Test a port as default tracer."; +default_tracer(Config) when is_list(Config) -> + ?line Tracer = start_tracer(Config), + ?line TracerMonitor = erlang:monitor(process, Tracer), + ?line Port = get(tracer_port), + %% + ?line N = erlang:trace(all, true, [send, {tracer, Port}]), + ?line {flags, [send]} = erlang:trace_info(self(), flags), + ?line {tracer, Port} = erlang:trace_info(self(), tracer), + ?line {flags, [send]} = erlang:trace_info(new, flags), + ?line {tracer, Port} = erlang:trace_info(new, tracer), + ?line G1 = fun_spawn(fun general/0), + ?line {flags, [send]} = erlang:trace_info(G1, flags), + ?line {tracer, Port} = erlang:trace_info(G1, tracer), + ?line unlink(Tracer), + ?line exit(Port, done), + ?line receive + {'DOWN', TracerMonitor, process, Tracer, TracerExitReason} -> + ?line done = TracerExitReason + end, + ?line {flags, []} = erlang:trace_info(self(), flags), + ?line {tracer, []} = erlang:trace_info(self(), tracer), + ?line {flags, []} = erlang:trace_info(new, flags), + ?line {tracer, []} = erlang:trace_info(new, tracer), + ?line M = erlang:trace(all, false, [all]), + ?line {flags, []} = erlang:trace_info(self(), flags), + ?line {tracer, []} = erlang:trace_info(self(), tracer), + ?line {flags, []} = erlang:trace_info(G1, flags), + ?line {tracer, []} = erlang:trace_info(G1, tracer), + ?line G1 ! {apply,{erlang,exit,[normal]}}, + ?line io:format("~p = ~p.~n", [M, N]), + ?line M = N, + ok. + + +%%% Help functions. + +huge_data() -> + case os:type() of + vxworks -> huge_data(4711); + _ -> huge_data(16384) + end. +huge_data(0) -> []; +huge_data(N) when N rem 2 == 0 -> + P = huge_data(N div 2), + [P|P]; +huge_data(N) -> + P = huge_data(N div 2), + [16#1234566,P|P]. + +expect() -> + receive + Other -> + ok = io:format("Unexpected; got ~p", [Other]), + test_server:fail({unexpected, Other}) + after 200 -> + ok + end. + +expect({trace_ts,E1,E2,info,ts}=Message) -> + receive + {trace_ts,E1,E2,_Info,_Ts}=MessageTs -> + ok = io:format("Expected and got ~p", [MessageTs]), + MessageTs; + Other -> + io:format("Expected ~p; got ~p", [Message,Other]), + test_server:fail({unexpected,Other}) + after 5000 -> + io:format("Expected ~p; got nothing", [Message]), + test_server:fail(no_trace_message) + end; +expect({trace,E1,E2,info}=Message) -> + receive + {trace,E1,E2,_Info}=MessageTs -> + ok = io:format("Expected and got ~p", [MessageTs]), + MessageTs; + Other -> + io:format("Expected ~p; got ~p", [Message,Other]), + test_server:fail({unexpected,Other}) + after 5000 -> + io:format("Expected ~p; got nothing", [Message]), + test_server:fail(no_trace_message) + end; +expect({trace_ts,E1,E2,E3,ts}=Message) -> + receive + {trace_ts,E1,E2,E3,_Ts}=MessageTs -> + ok = io:format("Expected and got ~p", [MessageTs]), + MessageTs; + Other -> + io:format("Expected ~p; got ~p", [Message,Other]), + test_server:fail({unexpected,Other}) + after 5000 -> + io:format("Expected ~p; got nothing", [Message]), + test_server:fail(no_trace_message) + end; +expect({trace_ts,E1,E2,E3,E4,ts}=Message) -> + receive + {trace_ts,E1,E2,E3,E4,_Ts}=MessageTs -> + ok = io:format("Expected and got ~p", [MessageTs]), + MessageTs; + Other -> + io:format("Expected ~p; got ~p", [Message,Other]), + test_server:fail({unexpected,Other}) + after 5000 -> + io:format("Expected ~p; got nothing", [Message]), + test_server:fail(no_trace_message) + end; +expect(Message) -> + receive + Message -> + ok = io:format("Expected and got ~p", [Message]), + Message; + Other -> + io:format("Expected ~p; got ~p", [Message,Other]), + test_server:fail({unexpected,Other}) + after 5000 -> + io:format("Expected ~p; got nothing", [Message]), + test_server:fail(no_trace_message) + end. + +trac(What, On, Flags0) -> + Flags = [{tracer,get(tracer_port)}|Flags0], + get(tracer) ! {apply,self(),{erlang,trace,[What,On,Flags]}}, + Res = receive + {apply_result,Result} -> Result + end, + ok = io:format("erlang:trace(~p, ~p, ~p) -> ~p", + [What,On,Flags,Res]), + Res. + +trace_info(What, Key) -> + get(tracer) ! {apply,self(),{erlang,trace_info,[What,Key]}}, + Res = receive + {apply_result,Result} -> Result + end, + ok = io:format("erlang:trace_info(~p, ~p) -> ~p", + [What,Key,Res]), + Res. + +trace_func(MFA, MatchProg) -> + get(tracer) ! {apply,self(),{erlang,trace_pattern,[MFA,MatchProg]}}, + Res = receive + {apply_result,Result} -> Result + end, + ok = io:format("erlang:trace_pattern(~p, ~p) -> ~p", [MFA,MatchProg,Res]), + Res. + +trace_func(MFA, MatchProg, Flags) -> + get(tracer) ! {apply,self(),{erlang,trace_pattern,[MFA,MatchProg,Flags]}}, + Res = receive + {apply_result,Result} -> Result + end, + ok = io:format("erlang:trace_pattern(~p, ~p) -> ~p", [MFA,MatchProg,Res]), + Res. + +trace_pid(Pid, On, Flags0) -> + Flags = [{tracer,get(tracer_port)}|Flags0], + get(tracer) ! {apply,self(),{erlang,trace,[Pid,On,Flags]}}, + Res = receive + {apply_result,Result} -> Result + end, + ok = io:format("erlang:trace(~p, ~p, ~p) -> ~p", + [Pid,On,Flags,Res]), + Res. + +start_tracer(Config) -> + Path = ?config(data_dir, Config), + ok = load_driver(Path, echo_drv), + Self = self(), + put(tracer, fun_spawn(fun() -> tracer(Self) end)), + receive + {started,Port} -> + put(tracer_port, Port) + end, + get(tracer). + +load_driver(Dir, Driver) -> + case erl_ddll:load_driver(Dir, Driver) of + ok -> ok; + {error, Error} = Res -> + io:format("~s\n", [erl_ddll:format_error(Error)]), + Res + end. + +tracer(RelayTo) -> + Port = open_port({spawn,echo_drv}, [eof,binary]), + RelayTo ! {started,Port}, + tracer_loop(RelayTo, Port). + +tracer_loop(RelayTo, Port) -> + receive + {apply,From,{M,F,A}} -> + From ! {apply_result,apply(M, F, A)}, + tracer_loop(RelayTo, Port); + {Port,{data,Msg}} -> + RelayTo ! binary_to_term(Msg), + tracer_loop(RelayTo, Port); + Other -> + exit({bad_message,Other}) + end. + +fun_spawn(Fun) -> + spawn_link(erlang, apply, [Fun,[]]). + +fun_spawn(Fun, Opts) -> + spawn_opt(erlang, apply, [Fun,[]], [link | Opts]). + +% flush() -> +% receive +% X -> +% [X | flush()] +% after 2000 -> +% [] +% end. + + +%%% Models for various kinds of processes. + +%% Sends messages when ordered to. + +sender() -> + receive + {send_please, To, What} -> + To ! What, + sender() + end. + +%% Just consumes messages from its message queue. + +receiver() -> + receive + _Any -> receiver() + end. + +%% Does a garbage collection when it receives a message. + +garber() -> + receive + _Any -> + lists:seq(1, 100), + erlang:garbage_collect(), + garber() + end. + +%% All-purpose process + +general() -> + receive + {apply, {M, F, Args}} -> + erlang:apply(M, F, Args), + general(); + {send, Dest, Msg} -> + Dest ! Msg, + general(); + {call_f_1, Arg} -> + f(Arg), + general(); + nop -> + general() + end. + +f(Arg) -> + Arg. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/trace_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/trace_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/trace_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/trace_SUITE.erl 2009-09-18 15:07:44.000000000 +0100 @@ -0,0 +1,1496 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(trace_SUITE). + +%%% +%%% Tests the trace BIF. +%%% + +-export([all/1, receive_trace/1, self_send/1, + timeout_trace/1, send_trace/1, + procs_trace/1, dist_procs_trace/1, + suspend/1, mutual_suspend/1, suspend_exit/1, suspender_exit/1, + suspend_system_limit/1, suspend_opts/1, suspend_waiting/1, + new_clear/1, existing_clear/1, + set_on_spawn/1, set_on_first_spawn/1, cpu_timestamp/1, + system_monitor_args/1, more_system_monitor_args/1, + system_monitor_long_gc_1/1, system_monitor_long_gc_2/1, + system_monitor_large_heap_1/1, system_monitor_large_heap_2/1, + bad_flag/1, trace_delivered/1]). + +-include("test_server.hrl"). + +%%% Internal exports +-export([process/1]). + +all(suite) -> + [cpu_timestamp, receive_trace, self_send, timeout_trace, send_trace, + procs_trace, dist_procs_trace, + suspend, mutual_suspend, suspend_exit, suspender_exit, + suspend_system_limit, suspend_opts, suspend_waiting, + new_clear, existing_clear, + set_on_spawn, set_on_first_spawn, + system_monitor_args, more_system_monitor_args, + system_monitor_long_gc_1, system_monitor_long_gc_2, + system_monitor_large_heap_1, system_monitor_large_heap_2, + bad_flag, trace_delivered]. + + +%% No longer testing anything, just reporting whether cpu_timestamp +%% is enabled or not. +cpu_timestamp(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + + %% Test whether cpu_timestamp is implemented on this platform. + ?line Works = try erlang:trace(all, true, [cpu_timestamp]) of + _ -> + ?line erlang:trace(all, false, [cpu_timestamp]), + true + catch + error:badarg -> false + end, + + ?line test_server:timetrap_cancel(Dog), + {comment,case Works of + false -> "cpu_timestamp is NOT implemented/does not work"; + true -> "cpu_timestamp works" + end}. + + +%% Tests that trace(Pid, How, ['receive']) works. + +receive_trace(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line Receiver = fun_spawn(fun receiver/0), + ?line process_flag(trap_exit, true), + + %% Trace the process; make sure that we receive the trace messages. + ?line 1 = erlang:trace(Receiver, true, ['receive']), + ?line Hello = {hello, world}, + ?line Receiver ! Hello, + ?line {trace, Receiver, 'receive', Hello} = receive_first(), + ?line Hello2 = {hello, again, world}, + ?line Receiver ! Hello2, + ?line {trace, Receiver, 'receive', Hello2} = receive_first(), + ?line receive_nothing(), + + %% Another process should not be able to trace Receiver. + ?line Intruder = fun_spawn(fun() -> erlang:trace(Receiver, true, ['receive']) end), + ?line {'EXIT', Intruder, {badarg, _}} = receive_first(), + + %% Untrace the process; we should not receive anything. + ?line 1 = erlang:trace(Receiver, false, ['receive']), + ?line Receiver ! {hello, there}, + ?line Receiver ! any_garbage, + ?line receive_nothing(), + + %% Done. + ?line test_server:timetrap_cancel(Dog), + ok. + +self_send(doc) -> ["Test that traces are generated for messages sent ", + "and received to/from self()."]; +self_send(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line Fun = + fun(Self, Parent) -> receive + go_ahead -> + self() ! from_myself, + Self(Self, Parent); + from_myself -> + Parent ! done + end + end, + ?line Self = self(), + ?line SelfSender = fun_spawn(Fun, [Fun, Self]), + ?line erlang:trace(SelfSender, true, ['receive', 'send']), + ?line SelfSender ! go_ahead, + ?line receive {trace, SelfSender, 'receive', go_ahead} -> ok end, + ?line receive {trace, SelfSender, 'receive', from_myself} -> ok end, + ?line receive + {trace,SelfSender,send,from_myself,SelfSender} -> ok + end, + ?line receive {trace,SelfSender,send,done,Self} -> ok end, + ?line receive done -> ok end, + + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Test that we can receive timeout traces. +timeout_trace(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + + ?line Process = fun_spawn(fun process/0), + ?line 1 = erlang:trace(Process, true, ['receive']), + ?line Process ! timeout_please, + ?line {trace, Process, 'receive', timeout_please} = receive_first(), + ?line {trace, Process, 'receive', timeout} = receive_first(), + ?line receive_nothing(), + + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests that trace(Pid, How, [send]) works. + +send_trace(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line process_flag(trap_exit, true), + ?line Sender = fun_spawn(fun sender/0), + ?line Receiver = fun_spawn(fun receiver/0), + + %% Check that a message sent to another process is traced. + ?line 1 = erlang:trace(Sender, true, [send]), + ?line Sender ! {send_please, Receiver, to_receiver}, + ?line {trace, Sender, send, to_receiver, Receiver} = receive_first(), + ?line receive_nothing(), + + %% Check that a message sent to this process is traced. + ?line Sender ! {send_please, self(), to_myself}, + ?line receive to_myself -> ok end, + ?line Self = self(), + ?line {trace, Sender, send, to_myself, Self} = receive_first(), + ?line receive_nothing(), + + %% Another process should not be able to trace Sender. + ?line Intruder = fun_spawn(fun() -> erlang:trace(Sender, true, [send]) end), + ?line {'EXIT', Intruder, {badarg, _}} = receive_first(), + + %% Untrace the sender process and make sure that we receive no more + %% trace messages. + ?line 1 = erlang:trace(Sender, false, [send]), + ?line Sender ! {send_please, Receiver, to_receiver}, + ?line Sender ! {send_please, self(), to_myself_again}, + ?line receive to_myself_again -> ok end, + ?line receive_nothing(), + + %% Done. + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Test trace(Pid, How, [procs]). +procs_trace(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line Name = list_to_atom(atom_to_list(?MODULE)++"_procs_trace"), + ?line Self = self(), + ?line process_flag(trap_exit, true), + %% + ?line Proc1 = spawn_link(?MODULE, process, [Self]), + ?line io:format("Proc1 = ~p ~n", [Proc1]), + ?line Proc2 = spawn(?MODULE, process, [Self]), + ?line io:format("Proc2 = ~p ~n", [Proc2]), + %% + ?line 1 = erlang:trace(Proc1, true, [procs]), + ?line MFA = {?MODULE, process, [Self]}, + %% + %% spawn, link + ?line Proc1 ! {spawn_link_please, Self, MFA}, + ?line Proc3 = receive {spawned, Proc1, P3} -> P3 end, + ?line {trace, Proc1, spawn, Proc3, MFA} = receive_first(), + ?line io:format("Proc3 = ~p ~n", [Proc3]), + ?line {trace, Proc1, link, Proc3} = receive_first(), + ?line receive_nothing(), + %% + %% getting_unlinked by exit() + ?line Proc1 ! {trap_exit_please, true}, + ?line Reason3 = make_ref(), + ?line Proc1 ! {send_please, Proc3, {exit_please, Reason3}}, + ?line receive {Proc1, {'EXIT', Proc3, Reason3}} -> ok end, + ?line {trace, Proc1, getting_unlinked, Proc3} = receive_first(), + ?line Proc1 ! {trap_exit_please, false}, + ?line receive_nothing(), + %% + %% link + ?line Proc1 ! {link_please, Proc2}, + ?line {trace, Proc1, link, Proc2} = receive_first(), + ?line receive_nothing(), + %% + %% unlink + ?line Proc1 ! {unlink_please, Proc2}, + ?line {trace, Proc1, unlink, Proc2} = receive_first(), + ?line receive_nothing(), + %% + %% getting_linked + ?line Proc2 ! {link_please, Proc1}, + ?line {trace, Proc1, getting_linked, Proc2} = receive_first(), + ?line receive_nothing(), + %% + %% getting_unlinked + ?line Proc2 ! {unlink_please, Proc1}, + ?line {trace, Proc1, getting_unlinked, Proc2} = receive_first(), + ?line receive_nothing(), + %% + %% register + ?line true = register(Name, Proc1), + ?line {trace, Proc1, register, Name} = receive_first(), + ?line receive_nothing(), + %% + %% unregister + ?line true = unregister(Name), + ?line {trace, Proc1, unregister, Name} = receive_first(), + ?line receive_nothing(), + %% + %% exit (with registered name, due to link) + ?line Reason4 = make_ref(), + ?line Proc1 ! {spawn_link_please, Self, MFA}, + ?line Proc4 = receive {spawned, Proc1, P4} -> P4 end, + ?line {trace, Proc1, spawn, Proc4, MFA} = receive_first(), + ?line io:format("Proc4 = ~p ~n", [Proc4]), + ?line {trace, Proc1, link, Proc4} = receive_first(), + ?line Proc1 ! {register_please, Name, Proc1}, + ?line {trace, Proc1, register, Name} = receive_first(), + ?line Proc4 ! {exit_please, Reason4}, + ?line receive {'EXIT', Proc1, Reason4} -> ok end, + ?line {trace, Proc1, exit, Reason4} = receive_first(), + ?line {trace, Proc1, unregister, Name} = receive_first(), + ?line receive_nothing(), + %% + %% exit (not linked to tracing process) + ?line 1 = erlang:trace(Proc2, true, [procs]), + ?line Reason2 = make_ref(), + ?line Proc2 ! {exit_please, Reason2}, + ?line {trace, Proc2, exit, Reason2} = receive_first(), + ?line receive_nothing(), + %% + %% Done. + ?line test_server:timetrap_cancel(Dog), + ok. + + +dist_procs_trace(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(15)), + ?line OtherName = atom_to_list(?MODULE)++"_dist_procs_trace", + ?line {ok, OtherNode} = start_node(OtherName), + ?line Self = self(), + ?line process_flag(trap_exit, true), + %% + ?line Proc1 = spawn_link(?MODULE, process, [Self]), + ?line io:format("Proc1 = ~p ~n", [Proc1]), + ?line Proc2 = spawn(OtherNode, ?MODULE, process, [Self]), + ?line io:format("Proc2 = ~p ~n", [Proc2]), + %% + ?line 1 = erlang:trace(Proc1, true, [procs]), + ?line MFA = {?MODULE, process, [Self]}, + %% + %% getting_unlinked by exit() + ?line Proc1 ! {spawn_link_please, Self, OtherNode, MFA}, + ?line Proc1 ! {trap_exit_please, true}, + ?line Proc3 = receive {spawned, Proc1, P3} -> P3 end, + ?line io:format("Proc3 = ~p ~n", [Proc3]), + ?line {trace, Proc1, getting_linked, Proc3} = receive_first(), + ?line Reason3 = make_ref(), + ?line Proc1 ! {send_please, Proc3, {exit_please, Reason3}}, + ?line receive {Proc1, {'EXIT', Proc3, Reason3}} -> ok end, + ?line {trace, Proc1, getting_unlinked, Proc3} = receive_first(), + ?line Proc1 ! {trap_exit_please, false}, + ?line receive_nothing(), + %% + %% link + ?line Proc1 ! {link_please, Proc2}, + ?line {trace, Proc1, link, Proc2} = receive_first(), + ?line receive_nothing(), + %% + %% unlink + ?line Proc1 ! {unlink_please, Proc2}, + ?line {trace, Proc1, unlink, Proc2} = receive_first(), + ?line receive_nothing(), + %% + %% getting_linked + ?line Proc2 ! {link_please, Proc1}, + ?line {trace, Proc1, getting_linked, Proc2} = receive_first(), + ?line receive_nothing(), + %% + %% getting_unlinked + ?line Proc2 ! {unlink_please, Proc1}, + ?line {trace, Proc1, getting_unlinked, Proc2} = receive_first(), + ?line receive_nothing(), + %% + %% exit (with registered name, due to link) + ?line Name = list_to_atom(OtherName), + ?line Reason2 = make_ref(), + ?line Proc1 ! {link_please, Proc2}, + ?line {trace, Proc1, link, Proc2} = receive_first(), + ?line Proc1 ! {register_please, Name, Proc1}, + ?line {trace, Proc1, register, Name} = receive_first(), + ?line Proc2 ! {exit_please, Reason2}, + ?line receive {'EXIT', Proc1, Reason2} -> ok end, + ?line {trace, Proc1, exit, Reason2} = receive_first(), + ?line {trace, Proc1, unregister, Name} = receive_first(), + ?line receive_nothing(), + %% + %% Done. + ?line true = stop_node(OtherNode), + ?line test_server:timetrap_cancel(Dog), + ok. + + + + +%% Tests trace(Pid, How, [set_on_spawn]). + +set_on_spawn(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line Listener = fun_spawn(fun process/0), + + %% Create and trace a process with the set_on_spawn flag. + %% Make sure it is traced. + ?line Father_SOS = fun_spawn(fun process/0), + ?line 1 = erlang:trace(Father_SOS, true, [send, set_on_spawn]), + ?line true = is_send_traced(Father_SOS, Listener, sos_father), + + %% Have the process spawn of two children and test that they + %% are traced. + ?line [Child1, Child2] = spawn_children(Father_SOS, 2), + ?line true = is_send_traced(Child1, Listener, child1), + ?line true = is_send_traced(Child2, Listener, child2), + + %% Second generation. + [Child11, Child12] = spawn_children(Child1, 2), + ?line true = is_send_traced(Child11, Listener, child11), + ?line true = is_send_traced(Child12, Listener, child12), + + %% Done. + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests trace(Pid, How, [set_on_first_spawn]). + +set_on_first_spawn(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Listener = fun_spawn(fun process/0), + + %% Create and trace a process with the set_on_first_spawn flag. + %% Make sure it is traced. + ?line Parent = fun_spawn(fun process/0), + ?line 1 = erlang:trace(Parent, true, [send, set_on_first_spawn]), + ?line is_send_traced(Parent, Listener, sos_father), + + %% Have the process spawn off three children and test that the + %% first is traced. + ?line [Child1, Child2, Child3] = spawn_children(Parent, 3), + ?line true = is_send_traced(Child1, Listener, child1), + ?line false = is_send_traced(Child2, Listener, child2), + ?line false = is_send_traced(Child3, Listener, child3), + ?line receive_nothing(), + + %% Done. + ?line test_server:timetrap_cancel(Dog), + ok. + + +system_monitor_args(doc) -> + ["Tests arguments to erlang:system_monitor/0-2)"]; +system_monitor_args(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line Self = self(), + %% + ?line OldMonitor = erlang:system_monitor(undefined), + ?line undefined = erlang:system_monitor(Self, [{long_gc,0}]), + ?line MinT = case erlang:system_monitor() of + {Self,[{long_gc,T}]} when is_integer(T), T > 0 -> T; + Other1 -> test_server:fault(Other1) + end, + ?line {Self,[{long_gc,MinT}]} = erlang:system_monitor(), + ?line {Self,[{long_gc,MinT}]} = + erlang:system_monitor({Self,[{large_heap,0}]}), + ?line MinN = case erlang:system_monitor() of + {Self,[{large_heap,N}]} when is_integer(N), N > 0 -> N; + Other2 -> test_server:fault(Other2) + end, + ?line {Self,[{large_heap,MinN}]} = erlang:system_monitor(), + ?line {Self,[{large_heap,MinN}]} = + erlang:system_monitor(Self, [busy_port]), + ?line {Self,[busy_port]} = erlang:system_monitor(), + ?line {Self,[busy_port]} = + erlang:system_monitor({Self,[busy_dist_port]}), + ?line {Self,[busy_dist_port]} = erlang:system_monitor(), + ?line All = lists:sort([busy_port,busy_dist_port, + {long_gc,1},{large_heap,65535}]), + ?line {Self,[busy_dist_port]} = erlang:system_monitor(Self, All), + ?line {Self,A1} = erlang:system_monitor(), + ?line All = lists:sort(A1), + ?line {Self,A1} = erlang:system_monitor(Self, []), + ?line Pid = spawn(fun () -> receive {Self,die} -> exit(die) end end), + ?line Mref = erlang:monitor(process, Pid), + ?line undefined = erlang:system_monitor(Pid, All), + ?line {Pid,A2} = erlang:system_monitor(), + ?line All = lists:sort(A2), + ?line Pid ! {Self,die}, + ?line receive {'DOWN',Mref,_,_,_} -> ok end, + ?line undefined = erlang:system_monitor(OldMonitor), + ?line erlang:yield(), + ?line OldMonitor = erlang:system_monitor(), + %% + ?line {'EXIT',{badarg,_}} = (catch erlang:system_monitor(atom)), + ?line {'EXIT',{badarg,_}} = (catch erlang:system_monitor({})), + ?line {'EXIT',{badarg,_}} = (catch erlang:system_monitor({1})), + ?line {'EXIT',{badarg,_}} = (catch erlang:system_monitor({1,2,3})), + ?line {'EXIT',{badarg,_}} = + (catch erlang:system_monitor({Self,atom})), + ?line {'EXIT',{badarg,_}} = + (catch erlang:system_monitor(atom, atom)), + ?line {'EXIT',{badarg,_}} = + (catch erlang:system_monitor({Self,[busy_port|busy_dist_port]})), + ?line {'EXIT',{badarg,_}} = + (catch erlang:system_monitor(Self, [{long_gc,-1}])), + ?line {'EXIT',{badarg,_}} = + (catch erlang:system_monitor({Self,[{long_gc,atom}]})), + ?line {'EXIT',{badarg,_}} = + (catch erlang:system_monitor(Self,[{large_heap,-1}])), + ?line {'EXIT',{badarg,_}} = + (catch erlang:system_monitor({Self,[{large_heap,atom}]})), + %% Done. + ?line test_server:timetrap_cancel(Dog), + ok. + + +more_system_monitor_args(doc) -> + ["Tests arguments to erlang:system_monitor/0-2)"]; +more_system_monitor_args(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + + ?line try_l(64000), + ?line try_l(16#7ffffff), + ?line try_l(16#3fffffff), + ?line try_l(16#7fffffff), + ?line try_l(16#ffffffff), + + %% Done. + ?line test_server:timetrap_cancel(Dog), + ok. + +try_l(Val) -> + Self = self(), + Arbitrary1 = 77777, + Arbitrary2 = 88888, + + ?line erlang:system_monitor(undefined), + + ?line undefined = erlang:system_monitor(Self, [{long_gc,Val},{large_heap,Arbitrary1}]), + + ?line {Self,Comb0} = erlang:system_monitor(Self, [{long_gc,Arbitrary2},{large_heap,Val}]), + ?line [{large_heap,Arbitrary1},{long_gc,Val}] = lists:sort(Comb0), + + ?line {Self,Comb1} = erlang:system_monitor(undefined), + ?line [{large_heap,Val},{long_gc,Arbitrary2}] = lists:sort(Comb1). + +-define(LONG_GC_SLEEP, 670). + +system_monitor_long_gc_1(suite) -> + []; +system_monitor_long_gc_1(doc) -> + ["Tests erlang:system_monitor(Pid, [{long_gc,Time}])"]; +system_monitor_long_gc_1(Config) when is_list(Config) -> + erts_debug:set_internal_state(available_internal_state, true), + try + %% Add ?LONG_GC_SLEEP ms to all gc + ?line erts_debug:set_internal_state(test_long_gc_sleep, + ?LONG_GC_SLEEP), + ?line LoadFun = + fun () -> + garbage_collect(), + self() + end, + ?line long_gc(LoadFun, false) + after + erts_debug:set_internal_state(test_long_gc_sleep, 0), + erts_debug:set_internal_state(available_internal_state, false) + end. + +system_monitor_long_gc_2(suite) -> + []; +system_monitor_long_gc_2(doc) -> + ["Tests erlang:system_monitor(Pid, [{long_gc,Time}])"]; +system_monitor_long_gc_2(Config) when is_list(Config) -> + erts_debug:set_internal_state(available_internal_state, true), + try + %% Add ?LONG_GC_SLEEP ms to all gc + ?line erts_debug:set_internal_state(test_long_gc_sleep, + ?LONG_GC_SLEEP), + ?line Parent = self(), + ?line LoadFun = + fun () -> + Ref = make_ref(), + Pid = + spawn_link( + fun () -> + garbage_collect(), + Parent ! {Ref, self()} + end), + receive {Ref, Pid} -> Pid end + end, + ?line long_gc(LoadFun, true), + ?line long_gc(LoadFun, true), + ?line long_gc(LoadFun, true) + after + erts_debug:set_internal_state(test_long_gc_sleep, 0), + erts_debug:set_internal_state(available_internal_state, false) + end. + +long_gc(LoadFun, ExpectMonMsg) -> + ?line Self = self(), + ?line Time = 1, + ?line OldMonitor = erlang:system_monitor(Self, [{long_gc,Time}]), + ?line Pid = LoadFun(), + ?line Ref = erlang:trace_delivered(Pid), + ?line receive {trace_delivered, Pid, Ref} -> ok end, + ?line {Self,[{long_gc,Time}]} = erlang:system_monitor(OldMonitor), + ?line case {long_gc_check(Pid, Time, undefined), ExpectMonMsg} of + {ok, true} when Pid =/= Self -> + ok; + {ok, false} -> + ?line ?t:fail(unexpected_system_monitor_message_received); + {undefined, false} -> + ok; + {undefined, true} -> + ?line ?t:fail(no_system_monitor_message_received) + end. + +long_gc_check(Pid, Time, Result) -> + receive + {monitor,Pid,long_gc,L} = Monitor -> + case lists:foldl( + fun (_, error) -> + error; + ({timeout,T}, N) when is_integer(T), + Time =< T, T =< 10*?LONG_GC_SLEEP -> + %% OTP-7622. The time T must be within reasonable limits + %% for the test to pass. + N-1; + ({heap_size,_}, N) -> + N-1; + ({old_heap_size,_}, N) -> + N-1; + ({stack_size,_}, N) -> + N-1; + ({mbuf_size,_}, N) -> + N-1; + ({heap_block_size,_}, N) -> + N-1; + ({old_heap_block_size,_}, N) -> + N-1; + (_, _) -> + error + end, 7, L) of + 0 -> + long_gc_check(Pid, Time, ok); + error -> + {error,Monitor} + end; + {monitor,_,long_gc,_} -> + long_gc_check(Pid, Time, Result); + Other -> + {error,Other} + after 0 -> + Result + end. + +system_monitor_large_heap_1(suite) -> + []; +system_monitor_large_heap_1(doc) -> + ["Tests erlang:system_monitor(Pid, [{large_heap,Size}])"]; +system_monitor_large_heap_1(Config) when is_list(Config) -> + ?line LoadFun = + fun (Size) -> + List = seq(1,2*Size), + garbage_collect(), + true = lists:prefix([1], List), + self() + end, + ?line large_heap(LoadFun, false). + +system_monitor_large_heap_2(suite) -> + []; +system_monitor_large_heap_2(doc) -> + ["Tests erlang:system_monitor(Pid, [{large_heap,Size}])"]; +system_monitor_large_heap_2(Config) when is_list(Config) -> + ?line Parent = self(), + ?line LoadFun = + fun (Size) -> + Ref = make_ref(), + Pid = + spawn_opt(fun () -> + garbage_collect(), + Parent ! {Ref, self()} + end, + [link, {min_heap_size, 2*Size}]), + receive {Ref, Pid} -> Pid end + end, + ?line large_heap(LoadFun, true). + +large_heap(LoadFun, ExpectMonMsg) -> + ?line Dog = test_server:timetrap(test_server:seconds(20)), + %% + ?line Size = 65535, + ?line Self = self(), + ?line NewMonitor = {Self,[{large_heap,Size}]}, + ?line OldMonitor = erlang:system_monitor(NewMonitor), + ?line Pid = LoadFun(Size), + ?line Ref = erlang:trace_delivered(Pid), + ?line receive {trace_delivered, Pid, Ref} -> ok end, + ?line {Self,[{large_heap,Size}]} = erlang:system_monitor(OldMonitor), + ?line case {large_heap_check(Pid, Size, undefined), ExpectMonMsg} of + {ok, true} when Pid =/= Self -> + ?line ok; + {ok, false} -> + ?line ?t:fail(unexpected_system_monitor_message_received); + {undefined, false} -> + ?line ok; + {undefined, true} -> + ?line ?t:fail(no_system_monitor_message_received) + end, + %% + ?line test_server:timetrap_cancel(Dog), + ok. + +large_heap_check(Pid, Size, Result) -> + receive + {monitor,Pid,large_heap,L} = Monitor -> + case lists:foldl( + fun (_, error) -> + error; + ({heap_size,_}, N) -> + N-1; + ({old_heap_size,_}, N) -> + N-1; + ({stack_size,_}, N) -> + N-1; + ({mbuf_size,_}, N) -> + N-1; + ({heap_block_size,_}, N) -> + N-1; + ({old_heap_block_size,_}, N) -> + N-1; + (_, _) -> + error + end, 6, L) of + 0 -> + large_heap_check(Pid, Size, ok); + error -> + {error,Monitor} + end; + {monitor,_,large_heap,_} -> + large_heap_check(Pid, Size, Result); + Other -> + {error,Other} + after 0 -> + Result + end. + +seq(N, M) -> + seq(N, M, []). + +seq(M, M, R) -> + lists:reverse(R); +seq(N, M, R) -> + seq(N+1, M, [N|R]). + + +is_send_traced(Pid, Listener, Msg) -> + Pid ! {send_please, Listener, Msg}, + receive + Any -> + {trace, Pid, send, Msg, Listener} = Any, + true + after 1000 -> + false + end. + +%% This procedure assumes that the Parent process is send traced. + +spawn_children(Parent, Number) -> + spawn_children(Parent, Number, []). + +spawn_children(_Parent, 0, Result) -> + lists:reverse(Result); +spawn_children(Parent, Number, Result) -> + Self = self(), + Parent ! {spawn_please, Self, fun process/0}, + Child = + receive + {trace, Parent, send, {spawned, Pid}, Self} -> Pid + end, + receive + {spawned, Child} -> + spawn_children(Parent, Number-1, [Child|Result]) + end. + +suspend(doc) -> "Test erlang:suspend/1 and erlang:resume/1."; +suspend(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(2)), + + ?line Worker = fun_spawn(fun worker/0), + %% Suspend a process and test that it is suspended. + ?line ok = do_suspend(Worker, 10000), + + %% Done. + ?line test_server:timetrap_cancel(Dog), + ok. + +do_suspend(_Pid, 0) -> + ?line ok; +do_suspend(Pid, N) -> + %% Suspend a process and test that it is suspended. + ?line true = erlang:suspend_process(Pid), + ?line {status, suspended} = process_info(Pid, status), + + %% Unsuspend the process and make sure it starts working. + ?line true = erlang:resume_process(Pid), + ?line case process_info(Pid, status) of + {status, runnable} -> ?line ok; + {status, running} -> ?line ok; + {status, garbage_collecting} -> ?line ok; + ST -> ?line ?t:fail(ST) + end, + ?line erlang:yield(), + ?line do_suspend(Pid, N-1). + + + +mutual_suspend(doc) -> + []; +mutual_suspend(suite) -> + []; +mutual_suspend(Config) when is_list(Config) -> + ?line TimeoutSecs = 5*60, + ?line Dog = test_server:timetrap(test_server:minutes(TimeoutSecs)), + ?line Parent = self(), + ?line Fun = fun () -> + receive + {go, Pid} -> + do_mutual_suspend(Pid, 100000) + end, + Parent ! {done, self()}, + receive after infinity -> ok end + end, + ?line P1 = spawn_link(Fun), + ?line P2 = spawn_link(Fun), + ?line T1 = erlang:start_timer((TimeoutSecs - 5)*1000, self(), oops), + ?line T2 = erlang:start_timer((TimeoutSecs - 5)*1000, self(), oops), + ?line P1 ! {go, P2}, + ?line P2 ! {go, P1}, + ?line Res1 = receive + {done, P1} -> done; + {timeout,T1,_} -> timeout + end, + ?line Res2 = receive + {done, P2} -> done; + {timeout,T2,_} -> timeout + end, + ?line P1S = process_info(P1, status), + ?line P2S = process_info(P2, status), + ?line ?t:format("P1S=~p P2S=~p", [P1S, P2S]), + ?line false = {status, suspended} == P1S, + ?line false = {status, suspended} == P2S, + ?line unlink(P1), exit(P1, bang), + ?line unlink(P2), exit(P2, bang), + ?line done = Res1, + ?line done = Res2, + %% Done. + ?line test_server:timetrap_cancel(Dog), + ?line ok. + +do_mutual_suspend(_Pid, 0) -> + ?line ok; +do_mutual_suspend(Pid, N) -> + %% Suspend a process and test that it is suspended. + ?line true = erlang:suspend_process(Pid), + ?line {status, suspended} = process_info(Pid, status), + %% Unsuspend the process. + ?line true = erlang:resume_process(Pid), + ?line do_mutual_suspend(Pid, N-1). + +suspend_exit(doc) -> + []; +suspend_exit(suite) -> + []; +suspend_exit(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(2)), + ?line random:seed(4711,17,4711), + ?line do_suspend_exit(5000), + ?line test_server:timetrap_cancel(Dog), + ?line ok. + +do_suspend_exit(0) -> + ?line ok; +do_suspend_exit(N) -> + ?line Work = random:uniform(50), + ?line Parent = self(), + ?line {Suspendee, Mon2} + = spawn_monitor(fun () -> + suspend_exit_work(Work), + exit(normal) + end), + ?line {Suspender, Mon1} + = spawn_monitor( + fun () -> + suspend_exit_work(Work div 2), + Parent ! {doing_suspend, self()}, + case catch erlang:suspend_process(Suspendee) of + {'EXIT', _} -> + ok; + true -> + ?line erlang:resume_process(Suspendee) + end + end), + ?line receive + {doing_suspend, Suspender} -> + case N rem 2 of + 0 -> exit(Suspender, bang); + 1 -> ok + end + end, + ?line receive {'DOWN', Mon1, process, Suspender, _} -> ok end, + ?line receive {'DOWN', Mon2, process, Suspendee, _} -> ok end, + ?line do_suspend_exit(N-1). + + + + +suspend_exit_work(0) -> + ok; +suspend_exit_work(N) -> + process_info(self()), + suspend_exit_work(N-1). + +-define(CHK_SUSPENDED(P,B), chk_suspended(P, B, ?LINE)). + +chk_suspended(P, Bool, Line) -> + {Bool, Line} = {({status, suspended} == process_info(P, status)), Line}. + +suspender_exit(doc) -> + []; +suspender_exit(suite) -> + []; +suspender_exit(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(3)), + ?line P1 = spawn_link(fun () -> receive after infinity -> ok end end), + ?line {'EXIT', _} = (catch erlang:resume_process(P1)), + ?line {P2, M2} = spawn_monitor( + fun () -> + ?CHK_SUSPENDED(P1, false), + erlang:suspend_process(P1), + ?CHK_SUSPENDED(P1, true), + erlang:suspend_process(P1), + erlang:suspend_process(P1), + erlang:suspend_process(P1), + ?CHK_SUSPENDED(P1, true), + erlang:resume_process(P1), + erlang:resume_process(P1), + erlang:resume_process(P1), + ?CHK_SUSPENDED(P1, true), + erlang:resume_process(P1), + ?CHK_SUSPENDED(P1, false), + erlang:suspend_process(P1), + erlang:suspend_process(P1), + erlang:suspend_process(P1), + ?CHK_SUSPENDED(P1, true), + exit(bang) + end), + ?line receive + {'DOWN', M2,process,P2,R2} -> + ?line bang = R2, + ?line ?CHK_SUSPENDED(P1, false) + end, + ?line Parent = self(), + ?line {P3, M3} = spawn_monitor( + fun () -> + erlang:suspend_process(P1), + ?CHK_SUSPENDED(P1, true), + Parent ! self(), + receive after infinity -> ok end + end), + ?line {P4, M4} = spawn_monitor( + fun () -> + erlang:suspend_process(P1), + ?CHK_SUSPENDED(P1, true), + Parent ! self(), + receive after infinity -> ok end + end), + ?line {P5, M5} = spawn_monitor( + fun () -> + erlang:suspend_process(P1), + ?CHK_SUSPENDED(P1, true), + Parent ! self(), + receive after infinity -> ok end + end), + ?line {P6, M6} = spawn_monitor( + fun () -> + erlang:suspend_process(P1), + ?CHK_SUSPENDED(P1, true), + Parent ! self(), + receive after infinity -> ok end + end), + ?line {P7, M7} = spawn_monitor( + fun () -> + erlang:suspend_process(P1), + ?CHK_SUSPENDED(P1, true), + Parent ! self(), + receive after infinity -> ok end + end), + ?line receive P3 -> ok end, + ?line receive P4 -> ok end, + ?line receive P5 -> ok end, + ?line receive P6 -> ok end, + ?line receive P7 -> ok end, + ?line ?CHK_SUSPENDED(P1, true), + ?line exit(P3, bang), + ?line receive + {'DOWN',M3,process,P3,R3} -> + ?line bang = R3, + ?line ?CHK_SUSPENDED(P1, true) + end, + ?line exit(P4, bang), + ?line receive + {'DOWN',M4,process,P4,R4} -> + ?line bang = R4, + ?line ?CHK_SUSPENDED(P1, true) + end, + ?line exit(P5, bang), + ?line receive + {'DOWN',M5,process,P5,R5} -> + ?line bang = R5, + ?line ?CHK_SUSPENDED(P1, true) + end, + ?line exit(P6, bang), + ?line receive + {'DOWN',M6,process,P6,R6} -> + ?line bang = R6, + ?line ?CHK_SUSPENDED(P1, true) + end, + ?line exit(P7, bang), + ?line receive + {'DOWN',M7,process,P7,R7} -> + ?line bang = R7, + ?line ?CHK_SUSPENDED(P1, false) + end, + ?line unlink(P1), + ?line exit(P1, bong), + ?line test_server:timetrap_cancel(Dog), + ?line ok. + +suspend_system_limit(doc) -> + []; +suspend_system_limit(suite) -> + []; +suspend_system_limit(Config) when is_list(Config) -> + case os:getenv("ERL_EXTREME_TESTING") of + "true" -> + ?line Dog = test_server:timetrap(test_server:minutes(3*60)), + ?line P = spawn_link(fun () -> receive after infinity -> ok end end), + ?line suspend_until_system_limit(P), + ?line unlink(P), + ?line exit(P, bye), + ?line test_server:timetrap_cancel(Dog), + ?line ok; + _ -> + {skip, "Takes too long time for normal testing"} + end. + +suspend_until_system_limit(P) -> + ?line suspend_until_system_limit(P, 0, 0). + +suspend_until_system_limit(P, N, M) -> + NewM = case M of + 1 -> + ?line ?CHK_SUSPENDED(P, true), 2; + 1000000 -> + erlang:display(N), 1; + _ -> + M+1 + end, + ?line case catch erlang:suspend_process(P) of + true -> + suspend_until_system_limit(P, N+1, NewM); + {'EXIT', R} when R == system_limit; + element(1, R) == system_limit -> + ?line ?t:format("system limit at ~p~n", [N]), + ?line resume_from_system_limit(P, N, 0); + Error -> + ?line ?t:fail(Error) + end. + +resume_from_system_limit(P, 0, _) -> + ?line ?CHK_SUSPENDED(P, false), + ?line {'EXIT', _} = (catch erlang:resume_process(P)), + ?line ok; +resume_from_system_limit(P, N, M) -> + ?line NewM = case M of + 1 -> + ?line ?CHK_SUSPENDED(P, true), 2; + 1000000 -> + erlang:display(N), 1; + _ -> + M+1 + end, + ?line erlang:resume_process(P), + ?line resume_from_system_limit(P, N-1, NewM). + +-record(susp_info, {async = 0, + dbl_async = 0, + synced = 0, + async_once = 0}). + +suspend_opts(doc) -> + []; +suspend_opts(suite) -> + []; +suspend_opts(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(3)), + ?line Self = self(), + ?line wait_for_empty_runq(10), + ?line Tok = spawn_link(fun () -> + Self ! self(), + tok_trace_loop(Self, 0, 1000000000) + end), + ?line TC = 1000, + ?line receive Tok -> ok end, + ?line SF = fun (N, #susp_info {async = A, + dbl_async = AA, + synced = S, + async_once = AO} = Acc) -> + ?line erlang:suspend_process(Tok, [asynchronous]), + ?line Res = case {suspend_count(Tok), N rem 4} of + {0, 2} -> + ?line erlang:suspend_process(Tok, + [asynchronous]), + case suspend_count(Tok) of + 2 -> + ?line erlang:resume_process(Tok), + ?line Acc#susp_info{async = A+1}; + 0 -> + ?line erlang:resume_process(Tok), + ?line Acc#susp_info{async = A+1, + dbl_async = AA+1} + end; + {0, 1} -> + ?line erlang:suspend_process(Tok, + [asynchronous, + unless_suspending]), + case suspend_count(Tok) of + 1 -> + ?line Acc#susp_info{async = A+1}; + 0 -> + ?line Acc#susp_info{async = A+1, + async_once = AO+1} + end; + {0, 0} -> + ?line erlang:suspend_process(Tok, + [unless_suspending]), + ?line 1 = suspend_count(Tok), + ?line Acc#susp_info{async = A+1, + synced = S+1}; + {0, _} -> + ?line Acc#susp_info{async = A+1}; + _ -> + Acc + end, + ?line erlang:resume_process(Tok), + ?line erlang:yield(), + ?line Res + end, + ?line SI = repeat_acc(SF, TC, #susp_info{}), + ?line erlang:suspend_process(Tok, [asynchronous]), + %% Verify that it eventually suspends + ?line WaitTime0 = 10, + ?line WaitTime1 = case {erlang:system_info(debug_compiled), + erlang:system_info(lock_checking)} of + {false, false} -> + WaitTime0; + {false, true} -> + WaitTime0*5; + _ -> + WaitTime0*10 + end, + ?line WaitTime = case {erlang:system_info(schedulers_online), + erlang:system_info(logical_processors)} of + {Schdlrs, CPUs} when is_integer(CPUs), + Schdlrs =< CPUs -> + WaitTime1; + _ -> + WaitTime1*10 + end, + ?line receive after WaitTime -> ok end, + ?line 1 = suspend_count(Tok), + ?line erlang:suspend_process(Tok, [asynchronous]), + ?line 2 = suspend_count(Tok), + ?line erlang:suspend_process(Tok, [asynchronous]), + ?line 3 = suspend_count(Tok), + ?line erlang:suspend_process(Tok), + ?line 4 = suspend_count(Tok), + ?line erlang:suspend_process(Tok), + ?line 5 = suspend_count(Tok), + ?line erlang:suspend_process(Tok, [unless_suspending]), + ?line 5 = suspend_count(Tok), + ?line erlang:suspend_process(Tok, [unless_suspending, + asynchronous]), + ?line 5 = suspend_count(Tok), + ?line erlang:resume_process(Tok), + ?line erlang:resume_process(Tok), + ?line erlang:resume_process(Tok), + ?line erlang:resume_process(Tok), + ?line 1 = suspend_count(Tok), + ?line ?t:format("Main suspends: ~p~n" + "Main async: ~p~n" + "Double async: ~p~n" + "Async once: ~p~n" + "Synced: ~p~n", + [TC, + SI#susp_info.async, + SI#susp_info.dbl_async, + SI#susp_info.async_once, + SI#susp_info.synced]), + ?line case erlang:system_info(schedulers_online) of + 1 -> + ?line ok; + _ -> + ?line true = SI#susp_info.async =/= 0 + end, + ?line unlink(Tok), + ?line exit(Tok, bang), + ?line test_server:timetrap_cancel(Dog), + ?line ok. + +suspend_count(Suspendee) -> + suspend_count(self(), Suspendee). + +suspend_count(Suspender, Suspendee) -> + {suspending, SList} = process_info(Suspender, suspending), + + case lists:keysearch(Suspendee, 1, SList) of + {value, {_Suspendee, 0, 0}} -> + ?line ?t:fail({bad_suspendee_list, SList}); + {value, {Suspendee, Count, 0}} when is_integer(Count), Count > 0 -> + {status, suspended} = process_info(Suspendee, status), + Count; + {value, {Suspendee, 0, Outstanding}} when is_integer(Outstanding), + Outstanding > 0 -> + 0; + false -> + 0; + Error -> + ?line ?t:fail({bad_suspendee_list, Error, SList}) + end. + +repeat_acc(Fun, N, Acc) -> + repeat_acc(Fun, 0, N, Acc). + +repeat_acc(_Fun, N, N, Acc) -> + Acc; +repeat_acc(Fun, N, M, Acc) -> + repeat_acc(Fun, N+1, M, Fun(N, Acc)). + +%% Tests that waiting process can be suspended +%% (bug in R2D and earlier; see OTP-1488). + +suspend_waiting(doc) -> "Test that a waiting process can be suspended."; +suspend_waiting(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + + ?line Process = fun_spawn(fun process/0), + ?line receive after 1 -> ok end, + ?line true = erlang:suspend_process(Process), + ?line {status, suspended} = process_info(Process, status), + + %% Done. + ?line test_server:timetrap_cancel(Dog), + ok. + + + +new_clear(doc) -> + "Test that erlang:trace(new, true, ...) is cleared when tracer dies."; +new_clear(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + + ?line Tracer = spawn(fun receiver/0), + ?line 0 = erlang:trace(new, true, [send, {tracer, Tracer}]), + ?line {flags, [send]} = erlang:trace_info(new, flags), + ?line {tracer, Tracer} = erlang:trace_info(new, tracer), + ?line Mref = erlang:monitor(process, Tracer), + ?line true = exit(Tracer, done), + receive + {'DOWN',Mref,_,_,_} -> ok + end, + ?line {flags, []} = erlang:trace_info(new, flags), + ?line {tracer, []} = erlang:trace_info(new, tracer), + + %% Done. + ?line test_server:timetrap_cancel(Dog), + + ok. + + + +existing_clear(doc) -> + "Test that erlang:trace(all, false, ...) works without tracer."; +existing_clear(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line Self = self(), + + ?line Tracer = fun_spawn(fun receiver/0), + ?line N = erlang:trace(existing, true, [send, {tracer, Tracer}]), + ?line {flags, [send]} = erlang:trace_info(Self, flags), + ?line {tracer, Tracer} = erlang:trace_info(Self, tracer), + ?line M = erlang:trace(all, false, [all]), + ?line io:format("Started trace on ~p processes and stopped on ~p~n", + [N, M]), + ?line {flags, []} = erlang:trace_info(Self, flags), + ?line {tracer, []} = erlang:trace_info(Self, tracer), + ?line M = N + 1, % Since trace could not be enabled on the tracer. + + %% Done. + ?line test_server:timetrap_cancel(Dog), + ok. + +bad_flag(doc) -> "Test that an invalid flag cause badarg"; +bad_flag(suite) -> []; +bad_flag(Config) when is_list(Config) -> + %% A bad flag could deadlock the SMP emulator in erts-5.5 + ?line {'EXIT', {badarg, _}} = (catch erlang:trace(new, + true, + [not_a_valid_flag])), + ?line ok. + +trace_delivered(doc) -> "Test erlang:trace_delivered/1"; +trace_delivered(suite) -> []; +trace_delivered(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(60)), + ?line TokLoops = 10000, + ?line Go = make_ref(), + ?line Parent = self(), + ?line Tok = spawn(fun () -> + receive Go -> gone end, + tok_trace_loop(Parent, 0, TokLoops) + end), + ?line 1 = erlang:trace(Tok, true, [procs]), + ?line Mon = erlang:monitor(process, Tok), + ?line NoOfTraceMessages = 4*TokLoops + 1, + ?line io:format("Expect a total of ~p trace messages~n", + [NoOfTraceMessages]), + ?line Tok ! Go, + ?line NoOfTraceMessages = drop_trace_until_down(Tok, Mon), + ?line receive + Msg -> + ?line ?t:fail({unexpected_message, Msg}) + after 1000 -> + ?line test_server:timetrap_cancel(Dog), + ?line ok + end. + +drop_trace_until_down(Proc, Mon) -> + drop_trace_until_down(Proc, Mon, false, 0, 0). + +drop_trace_until_down(Proc, Mon, TDRef, N, D) -> + case receive Msg -> Msg end of + {trace_delivered, Proc, TDRef} -> + io:format("~p trace messages on 'DOWN'~n", [D]), + io:format("Got a total of ~p trace messages~n", [N]), + N; + {'DOWN', Mon, process, Proc, _} -> + Ref = erlang:trace_delivered(Proc), + drop_trace_until_down(Proc, Mon, Ref, N, N); + Trace when is_tuple(Trace), + element(1, Trace) == trace, + element(2, Trace) == Proc -> + drop_trace_until_down(Proc, Mon, TDRef, N+1, D) + end. + +tok_trace_loop(_, N, N) -> + ok; +tok_trace_loop(Parent, N, M) -> + Name = 'A really stupid name which I will unregister at once', + link(Parent), + register(Name, self()), + unregister(Name), + unlink(Parent), + tok_trace_loop(Parent, N+1, M). + +%% Waits for and returns the first message in the message queue. + +receive_first() -> + receive + Any -> Any + end. + +%% Ensures that there is no message in the message queue. + +receive_nothing() -> + receive + Any -> + test_server:fail({unexpected_message, Any}) + after 200 -> + ok + end. + + +%%% Models for various kinds of processes. + +process(Dest) -> + receive + {send_please, To, What} -> + To ! What, + process(Dest); + {spawn_link_please, ReplyTo, {M, F, A}} -> + Pid = spawn_link(M, F, A), + ReplyTo ! {spawned, self(), Pid}, + process(Dest); + {spawn_link_please, ReplyTo, Node, {M, F, A}} -> + Pid = spawn_link(Node, M, F, A), + ReplyTo ! {spawned, self(), Pid}, + process(Dest); + {link_please, Pid} -> + link(Pid), + process(Dest); + {unlink_please, Pid} -> + unlink(Pid), + process(Dest); + {register_please, Name, Pid} -> + register(Name, Pid), + process(Dest); + {unregister_please, Name} -> + unregister(Name), + process(Dest); + {exit_please, Reason} -> + exit(Reason); + {trap_exit_please, State} -> + process_flag(trap_exit, State), + process(Dest); + Other -> + Dest ! {self(), Other}, + process(Dest) + after 3000 -> + exit(timeout) + end. + + +%% A smart process template. + +process() -> + receive + {spawn_please, ReplyTo, Fun} -> + Pid = fun_spawn(Fun), + ReplyTo ! {spawned, Pid}, + process(); + {send_please, To, What} -> + To ! What, + process(); + timeout_please -> + receive after 1 -> process() end; + _Other -> + process() + end. + + +%% Sends messages when ordered to. + +sender() -> + receive + {send_please, To, What} -> + To ! What, + sender() + end. + + +%% Just consumes messages from its message queue. + +receiver() -> + receive + _Any -> receiver() + end. + +%% Works as long as it receives CPU time. Will always be RUNNABLE. + +worker() -> + worker(0). + +worker(Number) -> + worker(Number+1). + +fun_spawn(Fun) -> + spawn_link(erlang, apply, [Fun, []]). + +fun_spawn(Fun, Args) -> + spawn_link(erlang, apply, [Fun, Args]). + + +start_node(Name) -> + Pa = filename:dirname(code:which(?MODULE)), + Cookie = atom_to_list(erlang:get_cookie()), + test_server:start_node(Name, slave, + [{args, "-setcookie " ++ Cookie ++" -pa " ++ Pa}]). + +stop_node(Node) -> + test_server:stop_node(Node). + + +wait_for_empty_runq(DeadLine) -> + case statistics(run_queue) of + 0 -> true; + RQLen -> + erlang:display("Waiting for empty run queue"), + MSDL = DeadLine*1000, + wait_for_empty_runq(MSDL, MSDL, RQLen) + end. + +wait_for_empty_runq(DeadLine, Left, RQLen) when Left =< 0 -> + issue_non_empty_runq_warning(DeadLine, RQLen), + false; +wait_for_empty_runq(DeadLine, Left, _RQLen) -> + Wait = 10, + UntilDeadLine = Left - Wait, + receive after Wait -> ok end, + case statistics(run_queue) of + 0 -> + erlang:display("Waited for " + ++ integer_to_list(DeadLine + - UntilDeadLine) + ++ " ms for empty run queue."), + true; + NewRQLen -> + wait_for_empty_runq(DeadLine, + UntilDeadLine, + NewRQLen) + end. + +issue_non_empty_runq_warning(DeadLine, RQLen) -> + PIs = lists:foldl( + fun (P, Acc) -> + case process_info(P, + [status, + initial_call, + current_function, + registered_name, + reductions, + message_queue_len]) of + [{status, Runnable} | _] = PI when Runnable /= waiting, + Runnable /= suspended -> + [[{pid, P} | PI] | Acc]; + _ -> + Acc + end + end, + [], + processes()), + ?t:format("WARNING: Unexpected runnable processes in system (waited ~p sec).~n" + " Run queue length: ~p~n" + " Self: ~p~n" + " Processes info: ~p~n", + [DeadLine div 1000, RQLen, self(), PIs]), + receive after 1000 -> ok end. diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/tuple_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/tuple_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/tuple_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/tuple_SUITE.erl 2009-04-16 10:23:47.000000000 +0100 @@ -0,0 +1,283 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(tuple_SUITE). +-export([all/1, t_size/1, t_tuple_size/1, t_element/1, t_setelement/1, + t_list_to_tuple/1, t_tuple_to_list/1, + t_make_tuple_2/1, t_make_tuple_3/1, t_append_element/1, + build_and_match/1, tuple_with_case/1, tuple_in_guard/1]). +-include("test_server.hrl"). + +%% Tests tuples and the BIFs: +%% +%% size(Tuple) +%% element/2 +%% setelement/3 +%% tuple_to_list/1 +%% list_to_tuple/1 +%% make_tuple/2 +%% + +all(suite) -> + [build_and_match, t_size, t_tuple_size, + t_list_to_tuple, t_tuple_to_list, + t_element, t_setelement, t_make_tuple_2, + t_make_tuple_3, t_append_element, + tuple_with_case, tuple_in_guard]. + +build_and_match(Config) when is_list(Config) -> + ?line {} = id({}), + ?line {1} = id({1}), + ?line {1, 2} = id({1, 2}), + ?line {1, 2, 3} = id({1, 2, 3}), + ?line {1, 2, 3, 4} = id({1, 2, 3, 4}), + ?line {1, 2, 3, 4, 5} = id({1, 2, 3, 4, 5}), + ?line {1, 2, 3, 4, 5, 6} = id({1, 2, 3, 4, 5, 6}), + ?line {1, 2, 3, 4, 5, 6} = id({1, 2, 3, 4, 5, 6}), + ?line {1, 2, 3, 4, 5, 6, 7} = id({1, 2, 3, 4, 5, 6, 7}), + ?line {1, 2, 3, 4, 5, 6, 7, 8} = id({1, 2, 3, 4, 5, 6, 7, 8}), + ok. + +%% Tests size(Tuple). + +t_size(Config) when is_list(Config) -> + ?line 0 = size({}), + ?line 1 = size({a}), + ?line 1 = size({{a}}), + ?line 2 = size({{a}, {b}}), + ?line 3 = size({1, 2, 3}), + ok. + +t_tuple_size(Config) when is_list(Config) -> + ?line 0 = tuple_size(id({})), + ?line 1 = tuple_size(id({a})), + ?line 1 = tuple_size(id({{a}})), + ?line 2 = tuple_size(id({{a},{b}})), + ?line 3 = tuple_size(id({1,2,3})), + + %% Error cases. + ?line {'EXIT',{badarg,_}} = (catch tuple_size([])), + ?line {'EXIT',{badarg,_}} = (catch tuple_size(<<1,2,3>>)), + ?line error = ludicrous_tuple_size({a,b,c}), + ?line error = ludicrous_tuple_size([a,b,c]), + ok. + + +ludicrous_tuple_size(T) + when tuple_size(T) =:= 16#7777777777777777777777777777777777 -> ok; +ludicrous_tuple_size(T) -> error. + +%% Tests element/2. + +t_element(Config) when is_list(Config) -> + ?line a = element(1, {a}), + ?line a = element(1, {a, b}), + + ?line List = lists:seq(1, 4096), + ?line Tuple = list_to_tuple(lists:seq(1, 4096)), + ?line get_elements(List, Tuple, 1), + + ?line {'EXIT', {badarg, _}} = (catch element(0, id({a,b}))), + ?line {'EXIT', {badarg, _}} = (catch element(3, id({a,b}))), + ?line {'EXIT', {badarg, _}} = (catch element(1, id({}))), + ?line {'EXIT', {badarg, _}} = (catch element(1, id([a,b]))), + ?line {'EXIT', {badarg, _}} = (catch element(1, id(42))), + ?line {'EXIT', {badarg, _}} = (catch element(id(1.5), id({a,b}))), + + ok. + +get_elements([Element|Rest], Tuple, Pos) -> + ?line Element = element(Pos, Tuple), + ?line get_elements(Rest, Tuple, Pos+1); +get_elements([], _Tuple, _Pos) -> + ok. + +%% Tests set_element/3. + +t_setelement(Config) when is_list(Config) -> + ?line {x} = setelement(1, id({1}), x), + ?line {x,2} = setelement(1, id({1,2}), x), + ?line {1,x} = setelement(2, id({1,2}), x), + + ?line Tuple = list_to_tuple(lists:duplicate(2048, x)), + ?line NewTuple = set_all_elements(Tuple, 1), + ?line NewTuple = list_to_tuple(lists:seq(1+7, 2048+7)), + + ?line {'EXIT', {badarg, _}} = (catch setelement(0, {a, b}, x)), + ?line {'EXIT', {badarg, _}} = (catch setelement(3, {a, b}, x)), + ?line {'EXIT', {badarg, _}} = (catch setelement(1, {}, x)), + ?line {'EXIT', {badarg, _}} = (catch setelement(1, [a, b], x)), + ?line {'EXIT', {badarg, _}} = (catch setelement(1.5, {a, b}, x)), + + %% Nested setelement with literals. + AnotherTuple = id({0,0,a,b,c}), + {93748793749387837476555412,3.0,gurka,b,c} = + setelement(1, setelement(2, setelement(3, AnotherTuple, gurka), + 3.0), 93748793749387837476555412), + + ok. + +set_all_elements(Tuple, Pos) when Pos =< size(Tuple) -> + set_all_elements(setelement(Pos, Tuple, Pos+7), Pos+1); +set_all_elements(Tuple, Pos) when Pos > size(Tuple) -> + Tuple. + +%% Tests list_to_tuple/1. + +t_list_to_tuple(Config) when is_list(Config) -> + ?line {} = list_to_tuple([]), + ?line {a} = list_to_tuple([a]), + ?line {a, b} = list_to_tuple([a, b]), + ?line {a, b, c} = list_to_tuple([a, b, c]), + ?line {a, b, c, d} = list_to_tuple([a, b, c, d]), + ?line {a, b, c, d, e} = list_to_tuple([a, b, c, d, e]), + + ?line Size = 4096, + ?line Tuple = list_to_tuple(lists:seq(1, Size)), + ?line Size = size(Tuple), + + ?line {'EXIT', {badarg, _}} = (catch list_to_tuple(id({a,b}))), + ?line {'EXIT', {badarg, _}} = (catch list_to_tuple(id([a|b]))), + ?line {'EXIT', {badarg, _}} = (catch list_to_tuple(id([a|b]))), + + ok. + +%% Tests tuple_to_list/1. + +t_tuple_to_list(Config) when is_list(Config) -> + ?line [] = tuple_to_list({}), + ?line [a] = tuple_to_list({a}), + ?line [a, b] = tuple_to_list({a, b}), + ?line [a, b, c] = tuple_to_list({a, b, c}), + ?line [a, b, c, d] = tuple_to_list({a, b, c, d}), + ?line [a, b, c, d] = tuple_to_list({a, b, c, d}), + + ?line Size = 4096, + ?line List = lists:seq(1, Size), + ?line Tuple = list_to_tuple(List), + ?line Size = size(Tuple), + ?line List = tuple_to_list(Tuple), + + ?line {'EXIT', {badarg,_}} = (catch tuple_to_list(id(a))), + ?line {'EXIT', {badarg,_}} = (catch tuple_to_list(id(42))), + + ok. + +%% Tests the make_tuple/2 BIF. +t_make_tuple_2(Config) when is_list(Config) -> + ?line t_make_tuple1([]), + ?line t_make_tuple1(42), + ?line t_make_tuple1(a), + ?line t_make_tuple1({}), + ?line t_make_tuple1({a}), + ?line t_make_tuple1(erlang:make_tuple(400, [])), + ok. + +t_make_tuple1(Element) -> + lists:foreach(fun(Size) -> t_make_tuple(Size, Element) end, + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 255, 256, 511, 512, 999, + 1000, 1023, 1024, 4095, 4096]). + +t_make_tuple(Size, Element) -> + Tuple = erlang:make_tuple(Size, Element), + lists:foreach(fun(El) when El =:= Element -> + ok; + (Other) -> + test_server:fail({got, Other, expected, Element}) + end, tuple_to_list(Tuple)). + +%% Tests the erlang:make_tuple/3 BIF. +t_make_tuple_3(Config) when is_list(Config) -> + ?line {} = erlang:make_tuple(0, def, []), + ?line {def} = erlang:make_tuple(1, def, []), + ?line {a} = erlang:make_tuple(1, def, [{1,a}]), + ?line {a,def,c,def,e} = erlang:make_tuple(5, def, [{5,e},{1,a},{3,c}]), + ?line {a,def,c,def,e} = erlang:make_tuple(5, def, + [{1,blurf},{5,e},{3,blurf}, + {1,a},{3,c}]), + + %% Error cases. + ?line {'EXIT',{badarg,_}} = (catch erlang:make_tuple(0, def, [{1,a}])), + ?line {'EXIT',{badarg,_}} = (catch erlang:make_tuple(5, def, [{-1,a}])), + ?line {'EXIT',{badarg,_}} = (catch erlang:make_tuple(5, def, [{0,a}])), + ?line {'EXIT',{badarg,_}} = (catch erlang:make_tuple(5, def, [{6,z}])), + ?line {'EXIT',{badarg,_}} = (catch erlang:make_tuple(a, def, [{6,z}])), + ?line {'EXIT',{badarg,_}} = (catch erlang:make_tuple(5, def, [{1,a}|b])), + ?line {'EXIT',{badarg,_}} = (catch erlang:make_tuple(5, def, [42])), + ?line {'EXIT',{badarg,_}} = (catch erlang:make_tuple(5, def, [[a,b,c]])), + ?line {'EXIT',{badarg,_}} = (catch erlang:make_tuple(5, def, non_list)), + ok. + +%% Tests the append_element/2 BIF. +t_append_element(Config) when is_list(Config) -> + t_append_element({}, 2048, 2048). + +t_append_element(_Tuple, 0, _High) -> ok; +t_append_element(Tuple, N, High) -> + NewTuple = erlang:append_element(Tuple, N), + verify_seq(tuple_to_list(Tuple), High, N), + t_append_element(NewTuple, N-1, High). + +verify_seq([], High, High) -> ok; +verify_seq([High], High, High) -> ok; +verify_seq([High|T], High, Lower) -> + verify_seq(T, High-1, Lower). + +%% Tests that a case nested inside a tuple is ok. +%% (This is known to crash earlier versions of BEAM.) + +tuple_with_case(Config) when is_list(Config) -> + ?line {reply, true} = tuple_with_case(), + ok. + +tuple_with_case() -> + %% The following comments apply to the BEAM compiler. + foo(), % Reset var count. + {reply, % Compiler will choose {x,1} for tuple. + case foo() of % Call will reset var count. + {'EXIT', Reason} -> % Case will return in {x,1} (first free). + {error, Reason}; % but the tuple will be build in {x,1}, + _ -> % so case value is lost and a circular + true % data element is built. + end}. + +foo() -> ignored. + +%% Test to build a tuple in a guard. + +tuple_in_guard(Config) when is_list(Config) -> + ?line Tuple1 = id({a,b}), + ?line Tuple2 = id({a,b,c}), + ?line if + Tuple1 == {element(1, Tuple2),element(2, Tuple2)} -> + ok; + true -> + ?line test_server:fail() + end, + ?line if + Tuple2 == {element(1, Tuple2),element(2, Tuple2), + element(3, Tuple2)} -> + ok; + true -> + ?line test_server:fail() + end, + ok. + +%% Use this function to avoid compile-time evaluation of an expression. +id(I) -> I. + diff -Nru erlang-13.b.1-dfsg/erts/emulator/test/z_SUITE.erl erlang-13.b.3-dfsg/erts/emulator/test/z_SUITE.erl --- erlang-13.b.1-dfsg/erts/emulator/test/z_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/emulator/test/z_SUITE.erl 2009-09-18 15:09:05.000000000 +0100 @@ -0,0 +1,312 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : z_SUITE.erl +%%% Author : Rickard Green +%%% Description : Misc tests that should be run last +%%% +%%% Created : 15 Jul 2005 by Rickard Green +%%%------------------------------------------------------------------- +-module(z_SUITE). +-author('rickard.s.green@ericsson.com'). + +%-define(line_trace, 1). + +-include("test_server.hrl"). + +%-compile(export_all). +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([schedulers_alive/1, node_container_refc_check/1, + long_timers/1, pollset_size/1, + check_io_debug/1]). + +-define(DEFAULT_TIMEOUT, ?t:minutes(5)). + +all(doc) -> []; +all(suite) -> + [schedulers_alive, + node_container_refc_check, + long_timers, + pollset_size, + check_io_debug]. + +init_per_testcase(_Case, Config) when is_list(Config) -> + Dog = ?t:timetrap(?DEFAULT_TIMEOUT), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) when is_list(Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +%%% +%%% The test cases ------------------------------------------------------------- +%%% + +schedulers_alive(doc) -> ["Tests that all schedulers are actually used"]; +schedulers_alive(suite) -> []; +schedulers_alive(Config) when is_list(Config) -> + ?line Master = self(), + ?line NoSchedulersOnline = erlang:system_flag( + schedulers_online, + erlang:system_info(schedulers)), + ?line NoSchedulers = erlang:system_info(schedulers), + UsedScheds = + try + ?line ?t:format("Number of schedulers configured: ~p~n", [NoSchedulers]), + ?line case erlang:system_info(multi_scheduling) of + blocked -> + ?line ?t:fail(multi_scheduling_blocked); + disabled -> + ?line ok; + enabled -> + ?t:format("Testing blocking process exit~n"), + BF = fun () -> + blocked = erlang:system_flag(multi_scheduling, + block), + Master ! {self(), blocking}, + receive after infinity -> ok end + end, + ?line Blocker = spawn_link(BF), + ?line Mon = erlang:monitor(process, Blocker), + ?line receive {Blocker, blocking} -> ok end, + ?line [Blocker] + = erlang:system_info(multi_scheduling_blockers), + ?line unlink(Blocker), + ?line exit(Blocker, kill), + ?line receive {'DOWN', Mon, _, _, _} -> ok end, + ?line enabled = erlang:system_info(multi_scheduling), + ?line [] = erlang:system_info(multi_scheduling_blockers), + ?line ok + end, + ?t:format("Testing blocked~n"), + ?line erlang:system_flag(multi_scheduling, block), + ?line case erlang:system_info(multi_scheduling) of + enabled -> + ?line ?t:fail(multi_scheduling_enabled); + blocked -> + ?line [Master] = erlang:system_info(multi_scheduling_blockers); + disabled -> ?line ok + end, + ?line Ps = lists:map( + fun (_) -> + spawn_link(fun () -> + run_on_schedulers(none, + [], + Master) + end) + end, + lists:seq(1,NoSchedulers)), + ?line receive after 1000 -> ok end, + ?line {_, 1} = verify_all_schedulers_used({[],0}, 1), + ?line lists:foreach(fun (P) -> + unlink(P), + exit(P, bang) + end, + Ps), + ?line case erlang:system_flag(multi_scheduling, unblock) of + blocked -> ?line ?t:fail(multi_scheduling_blocked); + disabled -> ?line ok; + enabled -> ?line ok + end, + erts_debug:set_internal_state(available_internal_state, true), + %% node_and_dist_references will use emulator interal thread blocking... + erts_debug:get_internal_state(node_and_dist_references), + erts_debug:set_internal_state(available_internal_state, false), + ?t:format("Testing not blocked~n"), + ?line Ps2 = lists:map( + fun (_) -> + spawn_link(fun () -> + run_on_schedulers(none, + [], + Master) + end) + end, + lists:seq(1,NoSchedulers)), + ?line receive after 1000 -> ok end, + ?line {_, NoSIDs} = verify_all_schedulers_used({[],0},NoSchedulers), + ?line lists:foreach(fun (P) -> + unlink(P), + exit(P, bang) + end, + Ps2), + NoSIDs + after + NoSchedulers = erlang:system_flag(schedulers_online, + NoSchedulersOnline), + NoSchedulersOnline = erlang:system_info(schedulers_online) + end, + ?line {comment, "Number of schedulers " ++ integer_to_list(UsedScheds)}. + + +run_on_schedulers(LastSID, SIDs, ReportTo) -> + case erlang:system_info(scheduler_id) of + LastSID -> + erlang:yield(), + run_on_schedulers(LastSID, SIDs, ReportTo); + SID -> + NewSIDs = case lists:member(SID, SIDs) of + true -> + SIDs; + false -> + ReportTo ! {scheduler_used, SID}, + [SID | SIDs] + end, + erlang:yield(), + run_on_schedulers(SID, NewSIDs, ReportTo) + end. + +wait_on_used_scheduler({SIDs, SIDsLen} = State) -> + receive + {scheduler_used, SID} -> + case lists:member(SID, SIDs) of + true -> + wait_on_used_scheduler(State); + false -> + ?t:format("Scheduler ~p used~n", [SID]), + {[SID|SIDs], SIDsLen+1} + end + end. + +verify_all_schedulers_used({UsedSIDs, UsedSIDsLen} = State, NoSchedulers) -> + ?line case NoSchedulers of + UsedSIDsLen -> + ?line State; + NoSchdlrs when NoSchdlrs < UsedSIDsLen -> + ?line ?t:fail({more_schedulers_used_than_exist, + {existing_schedulers, NoSchdlrs}, + {used_schedulers, UsedSIDsLen}, + {used_scheduler_ids, UsedSIDs}}); + _ -> + ?line NewState = wait_on_used_scheduler(State), + ?line verify_all_schedulers_used(NewState, NoSchedulers) + end. + +node_container_refc_check(doc) -> []; +node_container_refc_check(suite) -> []; +node_container_refc_check(Config) when is_list(Config) -> + ?line node_container_SUITE:node_container_refc_check(node()), + ?line ok. + +long_timers(doc) -> + []; +long_timers(suite) -> + []; +long_timers(Config) when is_list(Config) -> + ?line ok = long_timers_test:check_result(). + +pollset_size(doc) -> + []; +pollset_size(suite) -> + []; +pollset_size(Config) when is_list(Config) -> + ?line Name = pollset_size_testcase_initial_state_holder, + ?line Mon = erlang:monitor(process, Name), + ?line (catch Name ! {get_initial_check_io_result, self()}), + ?line InitChkIo = receive + {initial_check_io_result, ICIO} -> + ?line erlang:demonitor(Mon, [flush]), + ?line ICIO; + {'DOWN', Mon, _, _, Reason} -> + ?line ?t:fail({non_existing, Name, Reason}) + end, + ?line FinChkIo = get_check_io_info(), + ?line io:format("Initial: ~p~nFinal: ~p~n", [InitChkIo, FinChkIo]), + ?line InitPollsetSize = lists:keysearch(total_poll_set_size, 1, InitChkIo), + ?line FinPollsetSize = lists:keysearch(total_poll_set_size, 1, FinChkIo), + ?line case InitPollsetSize =:= FinPollsetSize of + true -> + case InitPollsetSize of + {value, {total_poll_set_size, Size}} -> + ?line {comment, + "Pollset size: " ++ integer_to_list(Size)}; + _ -> + ?line {skipped, + "Pollset size information not available"} + end; + false -> + %% Somtimes we have fewer descriptors in the + %% pollset at the end than when we started, but + %% that is ok as long as there are at least 2 + %% descriptors (dist listen socket and + %% epmd socket) in the pollset. + ?line {value, {total_poll_set_size, InitSize}} + = InitPollsetSize, + ?line {value, {total_poll_set_size, FinSize}} + = FinPollsetSize, + ?line true = FinSize < InitSize, + ?line true = 2 =< FinSize, + ?line {comment, + "Start pollset size: " + ++ integer_to_list(InitSize) + ++ " End pollset size: " + ++ integer_to_list(FinSize)} + end. + +check_io_debug(doc) -> + []; +check_io_debug(suite) -> + []; +check_io_debug(Config) when is_list(Config) -> + ?line case lists:keysearch(name, 1, erlang:system_info(check_io)) of + {value, {name, erts_poll}} -> ?line check_io_debug_test(); + _ -> ?line {skipped, "Not implemented in this emulator"} + end. + +check_io_debug_test() -> + ?line erts_debug:set_internal_state(available_internal_state, true), + ?line erlang:display(erlang:system_info(check_io)), + ?line NoOfErrorFds = erts_debug:get_internal_state(check_io_debug), + ?line erts_debug:set_internal_state(available_internal_state, false), + ?line 0 = NoOfErrorFds, + ?line ok. + + + +%% +%% Internal functions... +%% + +display_check_io(ChkIo) -> + catch erlang:display('--- CHECK IO INFO ---'), + catch erlang:display(ChkIo), + catch erts_debug:set_internal_state(available_internal_state, true), + NoOfErrorFds = (catch erts_debug:get_internal_state(check_io_debug)), + catch erlang:display({'NoOfErrorFds', NoOfErrorFds}), + catch erts_debug:set_internal_state(available_internal_state, false), + catch erlang:display('--- CHECK IO INFO ---'), + ok. + +get_check_io_info() -> + ChkIo = erlang:system_info(check_io), + case lists:keysearch(pending_updates, 1, ChkIo) of + {value, {pending_updates, 0}} -> + display_check_io(ChkIo), + ChkIo; + false -> + ChkIo; + _ -> + receive after 10 -> ok end, + get_check_io_info() + end. + + + diff -Nru erlang-13.b.1-dfsg/erts/epmd/test/epmd.spec erlang-13.b.3-dfsg/erts/epmd/test/epmd.spec --- erlang-13.b.1-dfsg/erts/epmd/test/epmd.spec 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/epmd/test/epmd.spec 1999-02-23 08:49:02.000000000 +0000 @@ -0,0 +1 @@ +{topcase, {dir, "../epmd_test"}}. diff -Nru erlang-13.b.1-dfsg/erts/epmd/test/epmd.spec.vxworks erlang-13.b.3-dfsg/erts/epmd/test/epmd.spec.vxworks --- erlang-13.b.1-dfsg/erts/epmd/test/epmd.spec.vxworks 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/epmd/test/epmd.spec.vxworks 1999-10-26 14:43:57.000000000 +0100 @@ -0,0 +1,2 @@ +{topcase, {dir, "../epmd_test"}}. +{skip,{epmd_rx_SUITE,"EPMD RX does simply not work on VxWorks"}}. diff -Nru erlang-13.b.1-dfsg/erts/epmd/test/epmd_SUITE.erl erlang-13.b.3-dfsg/erts/epmd/test/epmd_SUITE.erl --- erlang-13.b.1-dfsg/erts/epmd/test/epmd_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/epmd/test/epmd_SUITE.erl 2009-11-20 13:30:31.000000000 +0000 @@ -0,0 +1,835 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(epmd_SUITE). +-include("test_server.hrl"). +-include_lib("kernel/include/file.hrl"). + + +% Timeout for test cases (rather long to work on slow machines) +-define(SHORT_TEST_TIMEOUT, ?t:seconds(30)). % Default +-define(MEDIUM_TEST_TIMEOUT, ?t:minutes(3)). +-define(LONG_TEST_TIMEOUT, ?t:minutes(10)). + +% Delay inserted into code +-define(SHORT_PAUSE, 100). +-define(MEDIUM_PAUSE, ?t:seconds(1)). +-define(LONG_PAUSE, ?t:seconds(5)). + +% Test server specific exports +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export( + [ + register_name/1, + register_names_1/1, + register_names_2/1, + register_duplicate_name/1, + get_port_nr/1, + slow_get_port_nr/1, + unregister_others_name_1/1, + unregister_others_name_2/1, + register_overflow/1, + name_with_null_inside/1, + name_null_terminated/1, + stupid_names_req/1, + + no_data/1, + one_byte/1, + two_bytes/1, + partial_packet/1, + zero_length/1, + too_large/1, + alive_req_too_small_1/1, + alive_req_too_small_2/1, + alive_req_too_large/1 + ]). + + +% Port we use for testing +-define(PORT,2243). +-define(EPMDARGS,"-packet_timeout 1"). + +-define(DUMMY_PORT, 1000). % Port number to register + % not in real use. + +% Timeouts etc inside test cases. Time is in milliseconds. +-define(CONN_RETRY, 4). % Times to retry connecting +-define(CONN_SLEEP, 500). +-define(CONN_TIMEOUT, 100). +-define(RECV_TIMEOUT, 2000). +-define(REG_REPEAT_LIM,1000). + +% Message codes in epmd protocol +-define(EPMD_ALIVE_REQ, $a). +-define(EPMD_ALIVE_OK_RESP, $Y). +-define(EPMD_PORT_REQ, $p). +-define(EPMD_NAMES_REQ, $n). +-define(EPMD_DUMP_REQ, $d). +-define(EPMD_KILL_REQ, $k). +-define(EPMD_STOP_REQ, $s). + +%% +%% all/1 +%% + +all(suite) -> + [ + register_name, + register_names_1, + register_names_2, + register_duplicate_name, + get_port_nr, + slow_get_port_nr, + unregister_others_name_1, + unregister_others_name_2, + register_overflow, + name_with_null_inside, + name_null_terminated, + stupid_names_req, + + no_data, + one_byte, + two_bytes, + partial_packet, + zero_length, + too_large, + alive_req_too_small_1, + alive_req_too_small_2, + alive_req_too_large + ]. + +%% +%% Run before and after each test case +%% + +init_per_testcase(_Func, Config) -> + Dog = test_server:timetrap(?SHORT_TEST_TIMEOUT), + cleanup(), + [{watchdog, Dog} | Config]. + +fin_per_testcase(_Func, Config) -> + cleanup(), + Dog = ?config(watchdog, Config), + catch test_server:timetrap_cancel(Dog), % We may have canceled already + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +register_name(doc) -> + ["Register a name"]; +register_name(suite) -> + []; +register_name(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = register_node("foobar"), + ?line ok = close(Sock), % Unregister + ok. + +register_names_1(doc) -> + ["Register and unregister two nodes"]; +register_names_1(suite) -> + []; +register_names_1(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock1} = register_node("foobar"), + ?line {ok,Sock2} = register_node("foozap"), + ?line ok = close(Sock1), % Unregister + ?line ok = close(Sock2), % Unregister + ok. + +register_names_2(doc) -> + ["Register and unregister two nodes"]; +register_names_2(suite) -> + []; +register_names_2(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock1} = register_node("foobar"), + ?line {ok,Sock2} = register_node("foozap"), + ?line ok = close(Sock2), % Unregister + ?line ok = close(Sock1), % Unregister + ok. + +register_duplicate_name(doc) -> + ["Two nodes with the same name"]; +register_duplicate_name(suite) -> + []; +register_duplicate_name(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = register_node("foobar"), + ?line error = register_node("foobar"), + ?line ok = close(Sock), % Unregister + ok. + +% Internal function to register a node name, no close, i.e. unregister + +register_node(Name) -> + register_node(Name,?DUMMY_PORT). + +register_node(Name, Port) -> + case connect() of + {ok,Sock} -> + M = [?EPMD_ALIVE_REQ, put16(Port), Name], + case send(Sock, [size16(M), M]) of + ok -> + case recv(Sock,3) of + {ok, [?EPMD_ALIVE_OK_RESP,_D1,_D0]} -> + {ok,Sock}; + Other -> + test_server:format("recv on sock ~w: ~p~n", + [Sock,Other]), + error + end; + Other -> + test_server:format("send on sock ~w: ~w~n",[Sock,Other]), + error + end; + Other -> + test_server:format("Connect on port ~w: ~p~n",[Port,Other]), + error + end. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +name_with_null_inside(doc) -> + ["Register a name with a null char in it"]; +name_with_null_inside(suite) -> + []; +name_with_null_inside(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line error = register_node("foo\000bar"), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +name_null_terminated(doc) -> + ["Register a name with terminating null byte"]; +name_null_terminated(suite) -> + []; +name_null_terminated(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = register_node("foobar\000"), + ?line error = register_node("foobar"), + ?line ok = close(Sock), % Unregister + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +stupid_names_req(doc) -> + ["Read names from epmd in a stupid way"]; +stupid_names_req(suite) -> + []; +stupid_names_req(Config) when list(Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + LongDog = test_server:timetrap(?MEDIUM_TEST_TIMEOUT), + ?line ok = epmdrun(), + ?line [FirstConn | Conn] = register_many(1, ?REG_REPEAT_LIM, "foo"), + ?line unregister_many([FirstConn]), + sleep(?MEDIUM_PAUSE), + ?line ok = check_names(Conn), + ?line ok = unregister_many(Conn), + test_server:timetrap_cancel(LongDog), + ok. + +check_names(Conn) -> + ?line {ok,Sock} = connect_active(), + ?line {ok,Reply} = do_get_names(Sock), + ?line SortConn = lists:sort(Conn), + ?line SortReply = lists:sort(Reply), + ?line ok = check_names_cmp(SortConn, SortReply), + ok. + + +% Compare if the result was the same as was registered + +check_names_cmp([], []) -> + ok; +check_names_cmp([{Name,Port,_Sock} | Conn], [{Name,Port} | Reply]) -> + check_names_cmp(Conn, Reply). + + +% This code is taken directly from "erl_epmd.erl" in R3A01 + +-define(int16(X), [(X bsr 8) band 16#ff, X band 16#ff]). +-define(u32(X1,X2,X3,X4), + (((X1) bsl 24) bor ((X2) bsl 16) bor ((X3) bsl 8) bor X4)). + +do_get_names(Socket) -> + inet_tcp:send(Socket, [?int16(1),?EPMD_NAMES_REQ]), + receive + {tcp, Socket, [P0,P1,P2,P3 | T]} -> + EpmdPort = ?u32(P0,P1,P2,P3), + if EpmdPort == ?PORT -> + names_loop(Socket, T, []); + true -> + close(Socket), + {error, address} + end; + {tcp_closed, Socket} -> + {ok, []} + end. + +names_loop(Socket, Acc, Ps) -> + receive + {tcp, Socket, Bytes} -> + {NAcc, NPs} = scan_names(Acc ++ Bytes, Ps), + names_loop(Socket, NAcc, NPs); + {tcp_closed, Socket} -> + {_, NPs} = scan_names(Acc, Ps), % Really needed? + {ok, NPs} + end. + +scan_names(Buf, Ps) -> + case scan_line(Buf, []) of + {Line, NBuf} -> + case parse_line(Line) of + {ok, Entry} -> + scan_names(NBuf, [Entry | Ps]); + error -> + scan_names(NBuf, Ps) + end; + [] -> {Buf, Ps} + end. + +scan_line([$\n | Buf], Line) -> {lists:reverse(Line), Buf}; +scan_line([C | Buf], Line) -> scan_line(Buf, [C|Line]); +scan_line([], _) -> []. + +parse_line([$n,$a,$m,$e,$ | Buf0]) -> + case parse_name(Buf0, []) of + {Name, Buf1} -> + case Buf1 of + [$a,$t,$ ,$p,$o,$r,$t,$ | Buf2] -> + case catch list_to_integer(Buf2) of + {'EXIT', _} -> error; + Port -> {ok, {Name, Port}} + end; + _ -> error + end; + error -> error + end; +parse_line(_) -> error. + + +parse_name([$ | Buf], Name) -> {lists:reverse(Name), Buf}; +parse_name([C | Buf], Name) -> parse_name(Buf, [C|Name]); +parse_name([], _Name) -> error. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +get_port_nr(doc) -> + ["Register a name on a port and ask about port nr"]; +get_port_nr(suite) -> + []; +get_port_nr(Config) when list(Config) -> + port_request([?EPMD_PORT_REQ,"foo"]). + +slow_get_port_nr(doc) -> + ["Register with slow write and ask about port nr"]; +slow_get_port_nr(suite) -> + []; +slow_get_port_nr(Config) when list(Config) -> + port_request([?EPMD_PORT_REQ,d,$f,d,$o,d,$o]). + + +% Internal function used above + +port_request(M) -> + ?line ok = epmdrun(), + Port = 1042, + ?line {ok,RSock} = register_node("foo", Port), + ?line {ok,Sock} = connect(), + ?line ok = send(Sock,[size16(M),M]), + R = put16(Port), + ?line {ok,R} = recv(Sock, length(R)), + ?line ok = close(RSock), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +unregister_others_name_1(doc) -> + ["Unregister name of other node"]; +unregister_others_name_1(suite) -> + []; +unregister_others_name_1(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,RSock} = register_node("foo"), + ?line {ok,Sock} = connect(), + M = [?EPMD_STOP_REQ,"foo"], + ?line ok = send(Sock,[size16(M),M]), + R = "STOPPED", + ?line {ok,R} = recv(Sock,length(R)), + ?line ok = close(RSock), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +unregister_others_name_2(doc) -> + ["Unregister name of other node"]; +unregister_others_name_2(suite) -> + []; +unregister_others_name_2(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = connect(), + M = [?EPMD_STOP_REQ,"xxx42"], + ?line ok = send(Sock,[size16(M),M]), + R = "NOEXIST", + ?line {ok,R} = recv(Sock,length(R)), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +register_overflow(doc) -> + ["Register too many, clean and redo 10 times"]; +register_overflow(suite) -> + []; +register_overflow(Config) when list(Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + LongDog = test_server:timetrap(?LONG_TEST_TIMEOUT), + ?line ok = epmdrun(), + ?line Conn = register_many(1, ?REG_REPEAT_LIM, "foo"), + Count = length(Conn), + ?line ok = unregister_many(Conn), + sleep(?MEDIUM_PAUSE), + test_server:format("Limit was ~w names, now reg/unreg all 10 times~n", + [Count]), + ?line ok = register_repeat(Count), + sleep(?MEDIUM_PAUSE), + ?line ok = rregister_repeat(Count), + sleep(?MEDIUM_PAUSE), + ?line ok = register_repeat(Count), + sleep(?MEDIUM_PAUSE), + ?line ok = rregister_repeat(Count), + sleep(?MEDIUM_PAUSE), + ?line ok = register_repeat(Count), + sleep(?MEDIUM_PAUSE), + ?line ok = rregister_repeat(Count), + sleep(?MEDIUM_PAUSE), + ?line ok = register_repeat(Count), + sleep(?MEDIUM_PAUSE), + ?line ok = rregister_repeat(Count), + sleep(?MEDIUM_PAUSE), + ?line ok = register_repeat(Count), + sleep(?MEDIUM_PAUSE), + ?line ok = rregister_repeat(Count), + test_server:timetrap_cancel(LongDog), + ok. + +register_repeat(Count) -> + Conn = register_many(1, ?REG_REPEAT_LIM, "foo"), + ok = unregister_many(Conn), + if + length(Conn) == Count -> + ok; + true -> + error + end. + +rregister_repeat(Count) -> + Conn = register_many(1, ?REG_REPEAT_LIM, "foo"), + ok = unregister_many(lists:reverse(Conn)), + if + length(Conn) == Count -> + ok; + true -> + error + end. + +% Return count of successful registrations + +register_many(I, N, _Prefix) when I > N -> + test_server:format("Done with all ~n", []), + []; +register_many(I, N, Prefix) -> + Name = gen_name(Prefix, I), + Port = ?DUMMY_PORT + I, % Just make it up + case register_node(Name, Port) of + {ok,Sock} -> + [{Name,Port,Sock} | register_many(I + 1, N, Prefix)]; + Any -> + test_server:format("Can't register: ~w of 1..~w ~w~n", + [Name,N,Any]), + [] + end. + +unregister_many([]) -> + ok; +unregister_many([{Name,_Port,Sock} | Socks]) -> + case close(Sock) of + ok -> + unregister_many(Socks); + Any -> + test_server:format("Can't unregister: ~w reason ~w~n", [Name,Any]), + error + end. + +gen_name(Str,Int) -> + Str ++ integer_to_list(Int). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +no_data(doc) -> + ["Open but send no data"]; +no_data(suite) -> + []; +no_data(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = connect(), + sleep(?LONG_PAUSE), + ?line closed = recv(Sock,1), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +one_byte(doc) -> + ["Send one byte only"]; +one_byte(suite) -> + []; +one_byte(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = connect(), + ?line ok = send(Sock,[0]), + sleep(?LONG_PAUSE), + ?line closed = recv(Sock,1), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +two_bytes(doc) -> + ["Send packet size only"]; +two_bytes(suite) -> + []; +two_bytes(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = connect(), + ?line ok = send(Sock,[put16(3)]), + sleep(?LONG_PAUSE), + ?line closed = recv(Sock,1), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +partial_packet(doc) -> + ["Got only part of a packet"]; +partial_packet(suite) -> + []; +partial_packet(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = connect(), + ?line ok = send(Sock,[put16(100),"only a few bytes"]), + sleep(?LONG_PAUSE), + ?line closed = recv(Sock,1), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +zero_length(doc) -> + ["Invalid zero packet size"]; +zero_length(suite) -> + []; +zero_length(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = connect(), + ?line ok = send(Sock,[0,0,0,0,0,0,0,0,0,0]), + sleep(?MEDIUM_PAUSE), + ?line closed = recv(Sock,1), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +too_large(doc) -> + ["Invalid large packet"]; +too_large(suite) -> + []; +too_large(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = connect(), + Size = 63000, + M = lists:duplicate(Size, $z), + ?line ok = send(Sock,[put16(Size),M]), + sleep(?MEDIUM_PAUSE), + ?line closed = recv(Sock,1), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +alive_req_too_small_1(doc) -> + ["Try to register but not enough data"]; +alive_req_too_small_1(suite) -> + []; +alive_req_too_small_1(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = connect(), + M = [?EPMD_ALIVE_REQ, 42], + ?line ok = send(Sock, [size16(M), M]), + sleep(?MEDIUM_PAUSE), + ?line closed = recv(Sock,1), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +alive_req_too_small_2(doc) -> + ["Try to register but not enough data"]; +alive_req_too_small_2(suite) -> + []; +alive_req_too_small_2(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = connect(), + M = [?EPMD_ALIVE_REQ, put16(?DUMMY_PORT)], + ?line ok = send(Sock, [size16(M), M]), + sleep(?MEDIUM_PAUSE), + ?line closed = recv(Sock,1), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +alive_req_too_large(doc) -> + ["Try to register but node name too large"]; +alive_req_too_large(suite) -> + []; +alive_req_too_large(Config) when list(Config) -> + ?line ok = epmdrun(), + ?line {ok,Sock} = connect(), + L = [ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + ], + M = [?EPMD_ALIVE_REQ, put16(?DUMMY_PORT), L], + ?line ok = send(Sock, [size16(M), M]), + sleep(?MEDIUM_PAUSE), + ?line closed = recv(Sock,1), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Terminate all tests with killing epmd. + +cleanup() -> + sleep(?MEDIUM_PAUSE), + case connect() of + {ok,Sock} -> + M = [?EPMD_KILL_REQ], + send(Sock, [size16(M), M]), + recv(Sock,length("OK")), + close(Sock), + sleep(?MEDIUM_PAUSE); + _ -> + true + end. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Normal debug start of epmd + +epmdrun() -> + case os:find_executable(epmd) of + false -> + {error, {could_not_find_epmd_in_path}}; + Path -> + epmdrun(Path) + end. + +epmdrun(Epmd) -> + %% test_server:format("epmdrun() => Epmd = ~p",[Epmd]), + osrun(Epmd ++ " " ?EPMDARGS " -port " ++ integer_to_list(?PORT)). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Start an external process + +osrun(Cmd) -> + _ = open_port({spawn, Cmd}, []), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Wrappers of TCP functions + +% These two functions is the interface for connect. +% Passive mode is the default + +connect() -> + connect(?PORT, passive). + +connect_active() -> + connect(?PORT, active). + + +% Try a few times before giving up + +connect(Port, Mode) -> + case connect_repeat(?CONN_RETRY, Port, Mode) of + {ok,Sock} -> + {ok,Sock}; + {error,timeout} -> + timeout; + {error,Reason} -> + test_server:format("connect: error: ~w~n",[Reason]), + error; + Any -> + test_server:format("connect: unknown message: ~w~n",[Any]), + exit(1) + end. + + +% Try a few times before giving up. Pause a small time between +% each try. + +connect_repeat(1, Port, Mode) -> + connect_mode(Port, Mode); +connect_repeat(Retry, Port, Mode) -> + case connect_mode(Port, Mode) of + {ok,Sock} -> + {ok,Sock}; + {error,Reason} -> + test_server:format("connect: error: ~w~n",[Reason]), + timer:sleep(?CONN_SLEEP), + connect_repeat(Retry - 1, Port, Mode); + Any -> + test_server:format("connect: unknown message: ~w~n",[Any]), + exit(1) + end. + +connect_mode(Port, active) -> + gen_tcp:connect("localhost", Port, [{packet, 0}], ?CONN_TIMEOUT); +connect_mode(Port, passive) -> + gen_tcp:connect("localhost", Port, [{packet, 0}, {active, false}], + ?CONN_TIMEOUT). + + +close(Sock) -> + case gen_tcp:close(Sock) of + {error,_} -> + error; + ok -> + ok; + Any -> + test_server:format("unknown message: ~w~n",[Any]), + exit(1) + end. + +recv(Sock, Len) -> + recv(Sock, Len, ?RECV_TIMEOUT). + +recv(Sock, Len, Timeout) -> + case gen_tcp:recv(Sock, Len, Timeout) of + {ok,[]} -> % Should not be the case + recv(Sock, 1, 1); % any longer + {ok,Data} -> + {ok,Data}; + {error,timeout} -> + timeout; + {error,closed} -> + closed; + {error,_}=Error -> + Error; + Any -> + test_server:format("unknown message: ~w~n",[Any]), + exit(1) + end. + +%% Send data to socket. The list can be non flat and contain +%% the atom 'd' or tuple {d,Seconds} where this is delay +%% put in between the sent characters. + +send(Sock, SendSpec) -> + case send(SendSpec, [], Sock) of + {ok,[]} -> + ok; + {ok,RevBytes} -> + send_direct(Sock, lists:reverse(RevBytes)); + Any -> + Any + end. + + +% If an error, return immediately +% Collect real characters in the first argument to form +% a string to send. Only perform "actions", like a delay, +% when this argument is empty. + +send([], RevBytes, _Sock) -> + {ok,RevBytes}; +send([Byte | Spec], RevBytes, Sock) when integer(Byte) -> + send(Spec, [Byte | RevBytes], Sock); +send([List | Spec], RevBytes, Sock) when list(List) -> + case send(List, RevBytes, Sock) of + {ok,Left} -> + send(Spec, Left, Sock); + Other -> + Other + end; +send([d | Spec], RevBytes, Sock) -> + send([{d,1000} | Spec], RevBytes, Sock); +send([{d,S} | Spec], RevBytes, Sock) -> + case send_direct(Sock, lists:reverse(RevBytes)) of + ok -> + timer:sleep(S), + send(Spec, [], Sock); + Any -> + Any + end. + +%%%% + +send_direct(Sock, Bytes) -> + case gen_tcp:send(Sock, Bytes) of + ok -> + ok; + {error, closed} -> + closed; + {error, _Reason} -> + error; + Any -> + test_server:format("unknown message: ~w~n",[Any]), + Any + end. + +sleep(MilliSeconds) -> + timer:sleep(MilliSeconds). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +put16(N) -> + [N bsr 8, N band 16#ff]. + +size16(List) -> + N = flat_count(List, 0), + [N bsr 8, N band 16#ff]. + +flat_count([H|T], N) when is_integer(H) -> + flat_count(T, N+1); +flat_count([H|T], N) when is_list(H) -> + flat_count(T, flat_count(H, N)); +flat_count([_|T], N) -> + flat_count(T, N); +flat_count([], N) -> N. + diff -Nru erlang-13.b.1-dfsg/erts/epmd/test/Makefile erlang-13.b.3-dfsg/erts/epmd/test/Makefile --- erlang-13.b.1-dfsg/erts/epmd/test/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/epmd/test/Makefile 2009-11-20 13:30:44.000000000 +0000 @@ -0,0 +1,80 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1998-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +include $(ERL_TOP)/make/target.mk + +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +include ../epmd.mk + +EBIN = . + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + +MODULES= epmd_SUITE + +ERL_FILES= $(MODULES:%=%.erl) + +TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR)) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELEPMDDIR = $(RELEASE_PATH)/epmd_test + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + +ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/test_server/include \ + -I$(ERL_TOP)/lib/kernel/src/ \ + $(EPMD_FLAGS) + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- + +tests debug opt: $(TARGET_FILES) + +clean: + rm -f $(TARGET_FILES) + rm -f core *~ + +docs: + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + +release_spec: + +release_tests_spec: opt + $(INSTALL_DIR) $(RELEPMDDIR) + $(INSTALL_DATA) epmd.spec epmd.spec.vxworks $(ERL_FILES) \ + $(TARGET_FILES) $(RELEPMDDIR) + chmod -f -R u+w $(RELEPMDDIR) + +release_docs_spec: + + + + + diff -Nru erlang-13.b.1-dfsg/erts/etc/common/dialyzer.c erlang-13.b.3-dfsg/erts/etc/common/dialyzer.c --- erlang-13.b.1-dfsg/erts/etc/common/dialyzer.c 2009-03-12 12:16:53.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/etc/common/dialyzer.c 2009-11-20 13:32:18.000000000 +0000 @@ -167,8 +167,19 @@ * Push initial arguments. */ + if (argc > 1 && strcmp(argv[1], "--wx") == 0) { + PUSH2("-smp", "--wx"); /* wx currently requires SMP enabled */ + argc--, argv++; + } + if (argc > 1 && strcmp(argv[1], "-smp") == 0) { - PUSH("-smpauto"); + PUSH("-smpauto"); + argc--, argv++; + } + + if (argc > 2 && strcmp(argv[1], "+S") == 0) { + PUSH3("-smp", "+S", argv[2]); + argc--, argv++; argc--, argv++; } diff -Nru erlang-13.b.1-dfsg/erts/etc/common/erlc.c erlang-13.b.3-dfsg/erts/etc/common/erlc.c --- erlang-13.b.1-dfsg/erts/etc/common/erlc.c 2009-03-12 12:16:53.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/etc/common/erlc.c 2009-09-18 15:07:34.000000000 +0100 @@ -193,14 +193,20 @@ /* * Push standard arguments to Erlang. + * + * The @cwd argument was once needed, but from on R13B02 is optional. + * For maximum compatibility between erlc and erl of different versions, + * still provide the @cwd argument, unless it is too long to be + * represented as an atom. */ - if (getcwd(cwd, sizeof(cwd)) == NULL) error("Failed to get current working directory: %s", strerror(errno)); #ifdef __WIN32__ (void) GetShortPathName(cwd, cwd, sizeof(cwd)); #endif - PUSH2("@cwd", cwd); + if (strlen(cwd) < 256) { + PUSH2("@cwd", cwd); + } /* * Parse all command line switches. diff -Nru erlang-13.b.1-dfsg/erts/etc/common/erlexec.c erlang-13.b.3-dfsg/erts/etc/common/erlexec.c --- erlang-13.b.1-dfsg/erts/etc/common/erlexec.c 2009-06-05 13:53:04.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/etc/common/erlexec.c 2009-11-20 13:30:01.000000000 +0000 @@ -120,6 +120,7 @@ static char *pluss_val_switches[] = { "bt", "ct", + "ss", NULL }; @@ -582,6 +583,8 @@ add_epmd_port(); + add_arg("--"); + while (i < argc) { if (!process_args) { /* Copy arguments after '-extra' */ add_arg(argv[i]); diff -Nru erlang-13.b.1-dfsg/erts/etc/common/escript.c erlang-13.b.3-dfsg/erts/etc/common/escript.c --- erlang-13.b.1-dfsg/erts/etc/common/escript.c 2009-06-05 13:53:44.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/etc/common/escript.c 2009-09-21 08:45:33.000000000 +0100 @@ -107,24 +107,6 @@ } #endif /* !HAVE_STRERROR */ -static void -set_env(char *key, char *value) -{ -#ifdef __WIN32__ - if (!SetEnvironmentVariable((LPCTSTR) key, (LPCTSTR) value)) - error("SetEnvironmentVariable(\"%s\", \"%s\") failed!", key, value); -#else - size_t size = strlen(key) + 1 + strlen(value) + 1; - char *str = emalloc(size); - sprintf(str, "%s=%s", key, value); - if (putenv(str) != 0) - error("putenv(\"%s\") failed!", str); -#ifdef HAVE_COPYING_PUTENV - efree(str); -#endif -#endif -} - static char * get_env(char *key) { @@ -266,14 +248,14 @@ } static void -append_shebang_args_to_erl_flags(char* scriptname) +append_shebang_args(char* scriptname) { /* Open script file */ FILE* fd = fopen (scriptname,"r"); if (fd != NULL) { /* Read first line in script file */ - char linebuf[LINEBUFSZ]; + static char linebuf[LINEBUFSZ]; char* ptr = fgets(linebuf, LINEBUFSZ, fd); if (ptr != NULL && linebuf[0] == '#' && linebuf[1] == '!') { @@ -294,43 +276,36 @@ if (ptr != NULL) { /* Use entire line but the leading chars */ - char* emulator_flags = linebuf; - emulator_flags++; - emulator_flags++; - - /* Get rid of trailing newline */ - { - char* linenl = strstr(emulator_flags, "\n"); - if (linenl) { - linenl[0] = '\0'; + char* beg = linebuf + 3; + char* end; + BOOL newline = FALSE; + + /* Push all args */ + while(beg && !newline) { + /* Skip leading spaces */ + while (beg && beg[0] == ' ') { + beg++; } - } - - /* Skip leading spaces */ - while (emulator_flags && emulator_flags[0] == ' ') { - emulator_flags++; - } - - if (emulator_flags) { - /* Read old env setting */ - char* varname = "ERL_FLAGS"; - char* oldenv = getenv(varname); - if (oldenv) { - /* Copy flags from script */ - char* newenv = emalloc(strlen(oldenv)+LINEBUFSZ); - char* tmpenv = newenv; - strcpy(tmpenv, emulator_flags); - tmpenv += strlen(emulator_flags); - /* Append flags from old env setting */ - strcpy(tmpenv, " "); - tmpenv++; - strcpy(tmpenv, oldenv); - set_env(varname, newenv); - efree(newenv); - } else { - /* Set new env */ - set_env(varname, emulator_flags); + + /* Find end of arg */ + end = beg; + while (end && end[0] != ' ') { + if (end[0] == '\n') { + newline = TRUE; + end[0]= '\0'; + break; + } else { + end++; + } } + + /* Empty arg */ + if (beg == end) { + break; + } + end[0]= '\0'; + PUSH(beg); + beg = end + 1; } } } @@ -350,6 +325,8 @@ char* basename; char* absname; char scriptname[PMAX]; + char** last_opt; + char** first_opt; emulator = env = get_env("ESCRIPT_EMULATOR"); if (emulator == NULL) { @@ -362,7 +339,7 @@ * the array, to allow easy addition of commands in the beginning. */ - eargv_size = argc*4+100; + eargv_size = argc*4+1000; eargv_base = (char **) emalloc(eargv_size*sizeof(char*)); eargv = eargv_base; eargc = 0; @@ -380,13 +357,16 @@ PUSH("+B"); PUSH2("-boot", "start_clean"); PUSH("-noshell"); - PUSH3("-run", "escript", "start"); + /* Determine basename of the executable */ for (basename = argv[0]+strlen(argv[0]); basename > argv[0] && !(IS_DIRSEP(basename[-1])); --basename) ; + first_opt = argv; + last_opt = argv; + #ifdef __WIN32__ if (_stricmp(basename, "escript.exe") == 0) { #else @@ -398,7 +378,9 @@ while (argc > 1 && argv[1][0] == '-') { PUSH(argv[1]+1); - argc--, argv++; + argc--; + argv++; + last_opt = argv; } if (argc <= 1) { @@ -424,16 +406,26 @@ } /* - * Read options from the first row in the script and append them - * to ERL_FLAGS + * Read options from the %%! row in the script and add them as args */ - append_shebang_args_to_erl_flags(scriptname); + append_shebang_args(scriptname); /* * Push the script name and everything following it as extra arguments. */ + PUSH3("-run", "escript", "start"); + + /* + * Push all options (without the hyphen) before the script name. + */ + + while (first_opt != last_opt) { + PUSH(first_opt[1]+1); + first_opt++; + } + PUSH("-extra"); PUSH(scriptname); while (argc > 1) { diff -Nru erlang-13.b.1-dfsg/erts/etc/common/inet_gethost.c erlang-13.b.3-dfsg/erts/etc/common/inet_gethost.c --- erlang-13.b.1-dfsg/erts/etc/common/inet_gethost.c 2009-03-12 12:16:54.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/etc/common/inet_gethost.c 2009-11-20 13:30:33.000000000 +0000 @@ -26,6 +26,26 @@ * in which case the process may be killed and restarted when the need arises. * The single numeric parameter to this program is the maximum port pool size, * which is the size of the bookkeeping array. + * + * Windows: + * There is instead of a pool of processes a pool of threads. + * Communication is not done through pipes but via message queues between + * the threads. The only "pipes" involved are the ones used for communicating + * with Erlang. + * Important note: + * For unknown reasons, the combination of a thread doing blocking I/O on + * a named pipe at the same time as another thread tries to resolve a hostname + * may (with certain software configurations) block the gethostbyname call (!) + * For that reason, standard input (and standard output) should be opened + * in asynchronous mode (FILE_FLAG_OVERLAPPED), which has to be done by Erlang. + * A special flag to open_port is used to work around this behaviour in winsock + * and the threads doing read and write handle asynchronous I/O. + * The ReadFile and WriteFile calls try to cope with both types of I/O, why + * the code is not really as Microsoft describes "the right way to do it" in + * their documentation. Important to note is that **there is no supported way + * to retrieve the information if the HANDLE was opened with + * FILE_FLAG_OVERLAPPED from the HANDLE itself**. + * */ #ifdef HAVE_CONFIG_H @@ -96,7 +116,11 @@ #endif /* !WIN32 */ #define PACKET_BYTES 4 +#ifdef WIN32 +#define READ_PACKET_BYTES(X,Y,Z) read_int32((X),(Y),(Z)) +#else #define READ_PACKET_BYTES(X,Y) read_int32((X),(Y)) +#endif #define PUT_PACKET_BYTES(X,Y) put_int32((X),(Y)) /* The serial numbers of the requests */ typedef int SerialType; @@ -331,9 +355,9 @@ static void restart_worker(Worker *w); static void start_que_request(Worker *w) ; #ifdef WIN32 -static int read_int32(HANDLE fd, int *res); -static int read_exact(HANDLE fd, void *vbuff, DWORD nbytes); -static int write_exact(HANDLE fd, AddrByte *buff, DWORD len); +static int read_int32(HANDLE fd, int *res, HANDLE ev); +static int read_exact(HANDLE fd, void *vbuff, DWORD nbytes, HANDLE ev); +static int write_exact(HANDLE fd, AddrByte *buff, DWORD len,HANDLE ev); DWORD WINAPI worker_loop(void *v); DWORD WINAPI reader(void *data); DWORD WINAPI writer(void *data); @@ -385,6 +409,10 @@ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } +#ifdef HARDDEBUG +DWORD WINAPI pseudo_worker_loop(void *v); +static void poll_gethost(int row); +#endif #endif /* @@ -469,9 +497,11 @@ } } WAKEUP_WINSOCK(); /* Why on earth is this needed? */ + #endif init_workers(num_workers); + main_loop(); #ifndef WIN32 kill_all_workers(); @@ -565,7 +595,10 @@ Worker *cw; while (que_first) { - QueItem *qi; + QueItem *qi,*nxt; + qi = que_first; + nxt = qi->next; /* Need to save before it's getting put in another que + in threaded solution */ if ((cw = pick_worker()) == NULL) { break; } @@ -588,8 +621,7 @@ cw->serial = get_serial(que_first->request); #endif /* Went well, lets deque */ - qi = que_first; - que_first = qi->next; + que_first = nxt; if (que_first == NULL) { que_last = NULL; } @@ -691,6 +723,7 @@ AddrByte domainbuff[DOMAINNAME_MAX]; #ifdef WIN32 + { DWORD dummy; /* Create the reader and writer */ @@ -706,6 +739,9 @@ fatal("Could not create reader thread! errno = %d.",GetLastError()); } DEBUGF(4,("Created reader and writer threads.")); +#ifdef HARDDEBUG + poll_gethost(__LINE__); +#endif } #endif @@ -1643,6 +1679,7 @@ QueItem *m = NULL; MesQ *readfrom = ((MesQ **) v)[0]; MesQ *writeto = ((MesQ **) v)[1]; + /* XXX:PaN */ FREE(v); #endif @@ -2203,11 +2240,11 @@ } #ifdef WIN32 -static int read_int32(HANDLE fd, int *res) +static int read_int32(HANDLE fd, int *res, HANDLE ev) { AddrByte b[4]; int r; - if ((r = read_exact(fd,b,4)) < 0) { + if ((r = read_exact(fd,b,4,ev)) < 0) { return -1; } else if (r == 0) { return 0; @@ -2219,28 +2256,54 @@ } return 4; } - -static int read_exact(HANDLE fd, void *vbuff, DWORD nbytes) +/* + * The standard input is expected to be opened with FILE_FLAG_OVERLAPPED + * but this code should handle both cases (although winsock might not). + */ +static int read_exact(HANDLE fd, void *vbuff, DWORD nbytes, HANDLE ev) { DWORD ret,got; BOOL stat; char *buff = vbuff; + OVERLAPPED ov; + DWORD err; + got = 0; for(;;) { - stat = ReadFile(fd, buff, nbytes - got, &ret, NULL); + memset(&ov,0,sizeof(ov)); + ov.hEvent = ev; + ResetEvent(ov.hEvent); + stat = ReadFile(fd, buff, nbytes - got, &ret, &ov); if (!stat) { - if (GetLastError() == ERROR_BROKEN_PIPE) { - DEBUGF(1, ("End of file while reading from pipe.")); - return 0; - } else { - DEBUGF(1, ("Error while reading from pipe," - " errno = %d", - GetLastError())); - return -1; + if ((err = GetLastError()) == ERROR_IO_PENDING) { + DEBUGF(4,("Overlapped read, waiting for completion...")); + WaitForSingleObject(ov.hEvent,INFINITE); + stat = GetOverlappedResult(fd,&ov,&ret,TRUE); + DEBUGF(4,("Overlapped read, completed with status %d," + " result %d",stat,ret)); + } + if (!stat) { + if (GetLastError() == ERROR_BROKEN_PIPE) { + DEBUGF(1, ("End of file while reading from pipe.")); + return 0; + } else { + DEBUGF(1, ("Error while reading from pipe," + " errno = %d", + GetLastError())); + return -1; + } } + } else { + DEBUGF(4,("Read completed syncronously, result %d",ret)); + } + if (ret == 0) { + DEBUGF(1, ("End of file detected as zero read from pipe.")); + return 0; } if (ret < nbytes - got) { + DEBUGF(4,("Not all data read from pipe, still %d bytes to read.", + nbytes - (got + ret))); got += ret; buff += ret; } else { @@ -2248,24 +2311,47 @@ } } } - -static int write_exact(HANDLE fd, AddrByte *buff, DWORD len) +/* + * Now, we actually expect a HANDLE opened with FILE_FLAG_OVERLAPPED, + * but this code should handle both cases (although winsock + * does not always..) + */ +static int write_exact(HANDLE fd, AddrByte *buff, DWORD len, HANDLE ev) { DWORD res,stat; DWORD x = len; + OVERLAPPED ov; + DWORD err; + + for(;;) { - - stat = WriteFile(fd,buff,x,&res,NULL); + memset(&ov,0,sizeof(ov)); + ov.hEvent = ev; + ResetEvent(ov.hEvent); + stat = WriteFile(fd,buff,x,&res,&ov); if (!stat) { - if (GetLastError() == ERROR_BROKEN_PIPE) { - return 0; - } else { - return -1; + if ((err = GetLastError()) == ERROR_IO_PENDING) { + DEBUGF(4,("Overlapped write, waiting for competion...")); + WaitForSingleObject(ov.hEvent,INFINITE); + stat = GetOverlappedResult(fd,&ov,&res,TRUE); + DEBUGF(4,("Overlapped write, completed with status %d," + " result %d",stat,res)); + } + if (!stat) { + if (GetLastError() == ERROR_BROKEN_PIPE) { + return 0; + } else { + return -1; + } } - } else if (res < x) { - /* Hmmm, blocking write but not all written, could this happen - if the other end was closed during the operation? Well, - it costs very little to handle anyway... */ + } else { + DEBUGF(4,("Write completed syncronously, result %d",res)); + } + + if (res < x) { + /* Microsoft states this can happen as HANDLE is a pipe... */ + DEBUGF(4,("Not all data written to pipe, still %d bytes to write.", + x - res)); x -= res; buff += res; } else { @@ -2279,15 +2365,19 @@ QueItem *m; int siz; int r; - HANDLE inp = GetStdHandle(STD_INPUT_HANDLE); + HANDLE inp; + int x = 0; + HANDLE ev = CreateEvent(NULL, TRUE, FALSE, NULL); + inp = GetStdHandle(STD_INPUT_HANDLE); for (;;) { - if ((r = READ_PACKET_BYTES(inp,&siz)) != 4) { + if ((r = READ_PACKET_BYTES(inp,&siz,ev)) != 4) { DEBUGF(1,("Erlang has closed (reading)")); exit(0); } + DEBUGF(4,("Read packet of size %d from erlang",siz)); m = ALLOC(sizeof(QueItem) - 1 + siz); - if (read_exact(inp, m->request, siz) != siz) { + if (read_exact(inp, m->request, siz,ev) != siz) { fatal("Unexpected end of file on main input, errno = %d",errno); } if (siz < 5) { @@ -2308,6 +2398,8 @@ QueItem *m; HANDLE outp = GetStdHandle(STD_OUTPUT_HANDLE); AddrByte hdr[PACKET_BYTES]; + HANDLE ev = CreateEvent(NULL, TRUE, FALSE, NULL); + for (;;) { WaitForSingleObject(event_mesq(mq),INFINITE); @@ -2315,11 +2407,11 @@ fatal("Writer could not talk to main thread!"); } PUT_PACKET_BYTES(hdr, m->req_size); - if (write_exact(outp, hdr, 4) != 4) { + if (write_exact(outp, hdr, 4, ev) != 4) { DEBUGF(1,("Erlang has closed (writing)")); exit(0); } - if (write_exact(outp, m->request, m->req_size) != m->req_size) { + if (write_exact(outp, m->request, m->req_size, ev) != m->req_size) { DEBUGF(1,("Erlang has closed (writing)")); exit(0); } @@ -2635,5 +2727,31 @@ { return q->data_present; } + +#ifdef HARDDEBUG +DWORD WINAPI pseudo_worker_loop(void *v) +{ + HOSTENT *hep; + DEBUGF(1,("gethostbyname(\"ftp.funet.fi\") starting")); + hep = gethostbyname("ftp.funet.fi"); + + DEBUGF(1,("gethostbyname(\"ftp.funet.fi\") -> %d OK",(int) hep)); + return 0; +} + +static void poll_gethost(int row) { + HANDLE h; + DWORD tid; + h = (HANDLE) _beginthreadex(NULL, 0, pseudo_worker_loop, NULL, 0, &tid); + if (h == NULL) { + DEBUGF(1,("Failed to spawn pseudo worker (%d)...",row)); + } else { + DEBUGF(1,("Waiting for pseudo worker (%d)", row)); + WaitForSingleObject(h,INFINITE); + DEBUGF(1,("Done Waiting for pseudo worker (%d)", row)); + } +} #endif + +#endif /* WIN32 */ diff -Nru erlang-13.b.1-dfsg/erts/etc/unix/cerl.src erlang-13.b.3-dfsg/erts/etc/unix/cerl.src --- erlang-13.b.1-dfsg/erts/etc/unix/cerl.src 2009-04-16 10:24:15.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/etc/unix/cerl.src 2009-11-20 13:31:43.000000000 +0000 @@ -223,7 +223,7 @@ PROGNAME="$PROGNAME $cargs" EMU=$EMU$TYPE$EMU_TYPE if [ $run_valgrind != yes ]; then - xargs="$xargs -pz $PRELOADED" + xargs="$xargs -pz $PRELOADED --" fi if [ "x$GDB" = "x" ]; then if [ $run_valgrind = yes ]; then @@ -247,7 +247,7 @@ beam_args=`$EXEC -emu_args_exit ${1+"$@"}` # Ahhhh... Need to quote $PROGNAME... early_beam_args=`echo $beam_args | sed "s|^\(.*-progname\).*$|\1|g"` - late_beam_args=`echo $beam_args | sed "s|^$pre_beam_args.*\(--.*\)$|\1|g"` + late_beam_args=`echo $beam_args | sed "s|^$pre_beam_args.*\(-- -home.*\)$|\1|g"` exec valgrind $valgrind_xml $valgrind_log $valgrind_misc_flags $BINDIR/$EMU $emu_xargs $early_beam_args "$PROGNAME" $late_beam_args -pz $PRELOADED else diff -Nru erlang-13.b.1-dfsg/erts/etc/unix/etp-commands erlang-13.b.3-dfsg/erts/etc/unix/etp-commands --- erlang-13.b.1-dfsg/erts/etc/unix/etp-commands 2009-03-12 12:16:56.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/etc/unix/etp-commands 2009-11-20 13:32:11.000000000 +0000 @@ -32,7 +32,7 @@ % Same as "help etp-help" % % Emulator Toolbox for Pathologists -% - GDB commad toolbox for analyzing core dumps form the +% - GDB command toolbox for analyzing core dumps from the % Erlang emulator (BEAM). % % Should work for 32-bit erts-5.2/R9B, ... @@ -79,7 +79,7 @@ % tag bits. Do not forget about the e.g p, p/x, x and x/4x commands. % % Execution speed of user defined gdb commands is not lightning fast. -% It may well take half a minute do dump a complex term with the default +% It may well take half a minute to dump a complex term with the default % max depth values on our old Sparc Ultra-10's. % % To use the Erlang support module, the environment variable ROOTDIR @@ -735,8 +735,8 @@ printf "#NotExternalPid<%#x>", $etp_extpid_1_p->header else ## External pid - set $etp_extpid_1_number = $etp_extpid_1_p->data[0]&0x7fff - set $etp_extpid_1_serial = ($etp_extpid_1_p->data[0]>>15)&0x1fff + set $etp_extpid_1_number = $etp_extpid_1_p->data.ui[0]&0x7fff + set $etp_extpid_1_serial = ($etp_extpid_1_p->data.ui[0]>>15)&0x1fff set $etp_extpid_1_np = $etp_extpid_1_p->node set $etp_extpid_1_creation = $etp_extpid_1_np->creation set $etp_extpid_1_dep = $etp_extpid_1_np->dist_entry @@ -787,7 +787,7 @@ printf "#NotExternalPort<%#x>", $etp_extport_1->header else ## External port - set $etp_extport_1_number = $etp_extport_1_p->data[0]&0x3ffff + set $etp_extport_1_number = $etp_extport_1_p->data.ui[0]&0x3ffff set $etp_extport_1_np = $etp_extport_1_p->node set $etp_extport_1_creation = $etp_extport_1_np->creation set $etp_extport_1_dep = $etp_extport_1_np->dist_entry @@ -886,15 +886,15 @@ set $etp_ref_1_error = 1 else if $etp_arch64 - set $etp_ref_1_i = (int) ((Uint32 *) $etp_ref_1_p->data)[0] + set $etp_ref_1_i = (int) $etp_ref_1_p->data.ui32[0] if (($etp_ref_1_i + 1) > (2 * ($etp_ref_1_p->header >> 6))) set $etp_ref_1_error = 1 else - set $etp_ref_1_nump = &((Uint32 *) $etp_ref_1_p->data)[1] + set $etp_ref_1_nump = &$etp_ref_1_p->data.ui32[1] end else set $etp_ref_1_i = (int) ($etp_ref_1_p->header >> 6) - set $etp_ref_1_nump = &((Uint32 *) $etp_ref_1_p->data)[0] + set $etp_ref_1_nump = &$etp_ref_1_p->data.ui32[0] end end if $etp_ref_1_error @@ -941,15 +941,15 @@ ## $etp_extref_1_i now equals data (Uint) words set $etp_extref_1_i -= 2 if $etp_arch64 - if ((((int) ((Uint32 *) $etp_extref_1_p->data)[0]) + 1) \ + if ((((int) $etp_extref_1_p->data.ui32[0]) + 1) \ > (2 * $etp_extref_1_i)) set $etp_extref_1_error = 1 else - set $etp_extref_1_nump = &((Uint32 *) $etp_extref_1_p->data)[1] - set $etp_extref_1_i = (int) ((Uint32 *) $etp_extref_1_p->data)[0] + set $etp_extref_1_nump = &$etp_extref_1_p->data.ui32[1] + set $etp_extref_1_i = (int) $etp_extref_1_p->data.ui32[0] end else - set $etp_extref_1_nump = &((Uint32 *) $etp_extref_1_p->data)[0] + set $etp_extref_1_nump = &$etp_extref_1_p->data.ui32[0] end ## $etp_extref_1_i now equals no of ref num (Uint32) words if !$etp_extref_1_error diff -Nru erlang-13.b.1-dfsg/erts/etc/unix/Install.src erlang-13.b.3-dfsg/erts/etc/unix/Install.src --- erlang-13.b.1-dfsg/erts/etc/unix/Install.src 2009-03-12 12:16:56.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/etc/unix/Install.src 2009-09-18 15:07:12.000000000 +0100 @@ -21,43 +21,50 @@ # # start_option=query +unset cross while [ $# -ne 0 ]; do case $1 in -minimal) start_option=minimal ;; -sasl) start_option=sasl ;; + -cross) cross=yes ;; *) ERL_ROOT=$1 ;; esac shift done -if [ -z "$ERL_ROOT" -o ! -d "$ERL_ROOT" ] +if [ -z "$cross" ] then - echo "Install: need ERL_ROOT directory as argument" - exit 1 + TARGET_ERL_ROOT="$ERL_ROOT" +else + TARGET_ERL_ROOT="$ERL_ROOT" + ERL_ROOT=`pwd` fi -if [ `echo $ERL_ROOT | awk '{ print substr($1,1,1) }'` != "/" ] +if [ -z "$ERL_ROOT" -o ! -d "$ERL_ROOT" ] then - echo "Install: need an absolute path to ERL_ROOT" - exit 1 + echo "Install: need ERL_ROOT directory as argument" + exit 1 fi -if [ ! -d $ERL_ROOT/erts-%I_VSN%/bin ] -then - echo "Install: The directory $ERL_ROOT/erts-%I_VSN%/bin does not exist" - echo " Bad location or erts module not un-tared" - exit 1 -fi +case ":$ERL_ROOT" in + :/*) + ;; + *) + echo "Install: need an absolute path to ERL_ROOT" + exit 1 + ;; +esac -if [ -d $ERL_ROOT/erts-%I_VSN%/obj ] +if [ ! -d "$ERL_ROOT/erts-%I_VSN%/bin" ] then - cd $ERL_ROOT/erts-%I_VSN%/obj - sed -e "s;%FINAL_ROOTDIR%;$ERL_ROOT;" Makefile.src > Makefile + echo "Install: The directory $ERL_ROOT/erts-%I_VSN%/bin does not exist" + echo " Bad location or erts module not un-tared" + exit 1 fi if [ ! -d $ERL_ROOT/bin ] then - mkdir $ERL_ROOT/bin + mkdir $ERL_ROOT/bin fi # @@ -76,14 +83,14 @@ cd $ERL_ROOT/erts-%I_VSN%/bin -sed -e "s;%FINAL_ROOTDIR%;$ERL_ROOT;" erl.src > erl +sed -e "s;%FINAL_ROOTDIR%;$TARGET_ERL_ROOT;" erl.src > erl chmod 755 erl # # Create start file for embedded system use, # (cd $ERL_ROOT/erts-%I_VSN%/bin; - sed -e "s;%FINAL_ROOTDIR%;$ERL_ROOT;" start.src > start; + sed -e "s;%FINAL_ROOTDIR%;$TARGET_ERL_ROOT;" start.src > start; chmod 755 start) cd $ERL_ROOT/bin @@ -104,7 +111,7 @@ /bin/rm -f epmd fi -ln -s $ERL_ROOT/erts-%I_VSN%/bin/epmd epmd +ln -s $TARGET_ERL_ROOT/erts-%I_VSN%/bin/epmd epmd cp -p $ERL_ROOT/erts-%I_VSN%/bin/run_erl . cp -p $ERL_ROOT/erts-%I_VSN%/bin/to_erl . @@ -114,7 +121,7 @@ echo "" echo %I_VSN% %I_SYSTEM_VSN% > $ERL_ROOT/releases/start_erl.data -sed -e "s;%ERL_ROOT%;$ERL_ROOT;" $ERL_ROOT/releases/RELEASES.src > $ERL_ROOT/releases/RELEASES +sed -e "s;%ERL_ROOT%;$TARGET_ERL_ROOT;" $ERL_ROOT/releases/RELEASES.src > $ERL_ROOT/releases/RELEASES if [ "$start_option" = "query" ] then diff -Nru erlang-13.b.1-dfsg/erts/etc/win32/cygwin_tools/vc/cc.sh erlang-13.b.3-dfsg/erts/etc/win32/cygwin_tools/vc/cc.sh --- erlang-13.b.1-dfsg/erts/etc/win32/cygwin_tools/vc/cc.sh 2009-04-16 10:24:12.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/etc/win32/cygwin_tools/vc/cc.sh 2009-11-20 13:31:34.000000000 +0000 @@ -249,17 +249,20 @@ RES=$? if test $PREPROCESSING = false; then cat $ERR_FILE >&2 - tail +2 $MSG_FILE + tail -n +2 $MSG_FILE else - tail +2 $ERR_FILE >&2 + tail -n +2 $ERR_FILE >&2 if test $DEPENDENCIES = true; then - #after_pp=`date '+%s'` - #echo Preprocessed $x':' `expr $after_pp '-' $start_time` >&2 if test `grep -v $x $MSG_FILE | grep -c '#line'` != "0"; then o=`echo $x | sed 's,.*/,,' | sed 's,\.cp*$,.o,'` echo -n $o':' - #cat $MSG_FILE | grep '#line' | grep -v $x | awk -F\" '{printf("\"%s\"\n",$2)}' | sort -u | xargs -n1 cygpath -m -s | xargs -n1 cygpath | awk '{printf("\\\n %s ",$1)}' - cat $MSG_FILE | grep '#line' | grep -v $x | awk -F\" '{printf("%s\n",$2)}' | sort -u | tee nisse.txt | cygpath -f - -m -s | cygpath -f - | tee kalle.txt | awk '{printf("\\\n %s ",$0)}' + # Some versions of cygpath does not read paths linewise + # but uses space as separator, why pathnames containing + # spaces need to be removed. To avoid different + # behaviours in different versions of cygwin, we would need to + # write our own cygpath replacement, but this will have to do + # for now... + cat $MSG_FILE | grep '#line' | grep -v $x | awk -F\" '{printf("%s\n",$2)}' | sort -u | grep -v " " | cygpath -f - -m -s | cygpath -f - | awk '{printf("\\\n %s ",$0)}' echo echo after_sed=`date '+%s'` diff -Nru erlang-13.b.1-dfsg/erts/etc/win32/cygwin_tools/vc/ld.sh erlang-13.b.3-dfsg/erts/etc/win32/cygwin_tools/vc/ld.sh --- erlang-13.b.1-dfsg/erts/etc/win32/cygwin_tools/vc/ld.sh 2009-03-12 12:17:06.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/etc/win32/cygwin_tools/vc/ld.sh 2009-11-20 13:31:34.000000000 +0000 @@ -110,10 +110,13 @@ linktype="-debug $linkadd_pdb" +CHMOD_FILE="" + if [ $BUILD_DLL = true ];then case "$OUTPUT_FILENAME" in *.exe|*.EXE) echo "Warning, output set to .exe when building DLL" >&2 + CHMOD_FILE="$OUTPUT_FILENAME"; CMD="-dll -out:\"$OUTPUT_FILENAME\" $CMD"; OUTPUTRES="${OUTPUT_FILENAME}\;2"; MANIFEST="${OUTPUT_FILENAME}.manifest";; @@ -133,6 +136,7 @@ else case "$OUTPUT_FILENAME" in *.exe|*.EXE) + CHMOD_FILE="$OUTPUT_FILENAME"; CMD="-out:\"$OUTPUT_FILENAME\" $CMD"; OUTPUTRES="${OUTPUT_FILENAME}\;1" MANIFEST="${OUTPUT_FILENAME}.manifest";; @@ -142,6 +146,7 @@ OUTPUTRES="${OUTPUT_FILENAME}\;1"; MANIFEST="${OUTPUT_FILENAME}.manifest";; "") + CHMOD_FILE="a.exe"; CMD="-out:\"a.exe\" $CMD"; OUTPUTRES="a.exe\;1"; MANIFEST="a.exe.manifest";; @@ -171,8 +176,17 @@ fi rm -f "$CMANIFEST" fi + +# This works around some strange behaviour +# in cygwin 1.7 Beta on Windows 7 with samba drive. +# Configure will think the compiler failed if test -x fails, +# which it might do as we might not be the owner of the +# file. +if [ '!' -z "$CHMOD_FILE" -a -s "$CHMOD_FILE" -a '!' -x "$CHMOD_FILE" ]; then + chmod +x $CHMOD_FILE +fi -tail +2 /tmp/link.exe.${p}.2 >&2 +tail -n +2 /tmp/link.exe.${p}.2 >&2 cat /tmp/link.exe.${p}.1 rm -f /tmp/link.exe.${p}.2 /tmp/link.exe.${p}.1 exit $RES diff -Nru erlang-13.b.1-dfsg/erts/etc/win32/erlsrv/erlsrv_interactive.c erlang-13.b.3-dfsg/erts/etc/win32/erlsrv/erlsrv_interactive.c --- erlang-13.b.1-dfsg/erts/etc/win32/erlsrv/erlsrv_interactive.c 2009-03-12 12:17:07.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/etc/win32/erlsrv/erlsrv_interactive.c 2009-09-18 15:07:53.000000000 +0100 @@ -41,6 +41,8 @@ "name", "n", "args", "ar", "debugtype", "d", + "internalservicename","i", + "comment","c", NULL, NULL }; @@ -244,6 +246,24 @@ return TRUE; } +static BOOL set_service_comment(char *comment) { + SC_HANDLE scm; + SC_HANDLE service; + SERVICE_DESCRIPTION sd; + BOOL ret = TRUE; + sd.lpDescription = comment; + if (!open_service_config(&scm,&service)) { + return FALSE; + } + if (!ChangeServiceConfig2(service,SERVICE_CONFIG_DESCRIPTION,&sd)) { + last_error = GetLastError(); + ret = FALSE; + } + CloseServiceHandle(service); + CloseServiceHandle(scm); + return ret; +} + static BOOL wait_service_trans(DWORD initial, DWORD passes, DWORD goal, int timeout) { @@ -472,6 +492,7 @@ new[Args].data.bytes = new[Args].data.expand.unexpanded = ""; new[DebugType].data.value = DEBUG_TYPE_NO_DEBUG; new[InternalServiceName].data.bytes = real_service_name; + new[Comment].data.bytes = ""; return TRUE; } @@ -600,6 +621,7 @@ int add = 0; int i; int current; + int set_comment = 0; new_entries = empty_reg_tab(); default_entries = empty_reg_tab(); if(argc < 3){ @@ -640,6 +662,8 @@ for(i = 3; i < argc; ++i){ switch((current = lookup_arg(argv[i]))){ + case Comment: + set_comment = 1; case Machine: case WorkDir: case Args: @@ -740,6 +764,23 @@ new_entries[current].data.bytes); ++i; break; + case InternalServiceName: + if (!add) { + fprintf(stderr,"%s: %s only allowed when adding a new service.\n", + argv[0],argv[i]); + return 1; + } + if(i+1 >= argc){ + fprintf(stderr,"%s: %s requires a parameter.\n", + argv[0],argv[i]); + return 1; + } + new_entries[InternalServiceName].data.expand.unexpanded = + new_entries[InternalServiceName].data.bytes = argv[i+1]; + ++i; + /* Discard old, should maybe be fred' but we'll exit anyway */ + real_service_name = new_entries[InternalServiceName].data.bytes; + break; default: fprintf(stderr,"%s: Unrecognized option %s.\n", argv[0], argv[i]); @@ -778,6 +819,15 @@ /* Update registry */ register_logkeys(); set_keys(service_name, new_entries); + /* Update service comment if needed */ + if(set_comment) { + if (!set_service_comment(new_entries[Comment].data.bytes)) { + fprintf(stderr,"%s: Warning, could not set correct " + "service description (comment)", + argv[0], service_name); + print_last_error(); + } + } /* As I do this, I should also clean up the new entries, which is somewhat harder as I really dont know what is and what is not @@ -981,6 +1031,10 @@ printf("DebugType: %s\n",debugtype); printf("Args: %s\n", keys[Args].data.expand.unexpanded); + printf("InternalServiceName: %s\n", + keys[InternalServiceName].data.bytes); + printf("Comment: %s\n", + keys[Comment].data.bytes); printf("Env:\n"); while(*pek){ printf("\t%s\n",*pek); diff -Nru erlang-13.b.1-dfsg/erts/etc/win32/erlsrv/erlsrv_registry.c erlang-13.b.3-dfsg/erts/etc/win32/erlsrv/erlsrv_registry.c --- erlang-13.b.1-dfsg/erts/etc/win32/erlsrv/erlsrv_registry.c 2009-03-12 12:17:07.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/etc/win32/erlsrv/erlsrv_registry.c 2009-09-18 15:07:54.000000000 +0100 @@ -41,13 +41,8 @@ static const char * const noString = "\0"; +#define MAX_MANDATORY_REG_ENTRY 10 /* InternalServiceName == reg_entries[10] */ static RegEntry reg_entries[] = { -#if defined(NOTYET) - {"Display", REG_SZ,NULL}, - {"Output", REG_EXPAND_SZ,NULL}, - {"User",REG_SZ,NULL}, - {"After",REG_SZ,NULL}, -#endif {"StopAction",REG_SZ,NULL}, {"OnFail",REG_DWORD,NULL}, {"Machine",REG_EXPAND_SZ,NULL}, @@ -58,9 +53,12 @@ {"Name",REG_SZ,NULL}, {"Args",REG_EXPAND_SZ,NULL}, {"DebugType",REG_DWORD,NULL}, - {"InternalServiceName",REG_SZ,NULL} + {"InternalServiceName",REG_SZ,NULL}, + /* Non mandatory follows */ + {"Comment",REG_SZ,NULL} }; + int num_reg_entries = sizeof(reg_entries)/sizeof(RegEntry); RegEntry *empty_reg_tab(void){ @@ -143,6 +141,24 @@ goto error; } else if(ret == ERROR_MORE_DATA){ val_data = realloc(val_data,val_datasiz = val_datalen); + } else if (i > MAX_MANDATORY_REG_ENTRY && ret == ERROR_FILE_NOT_FOUND) { + /* Non mandatory entries, look at the type... */ + switch (reg_entries[i].type){ + case REG_EXPAND_SZ: + case REG_SZ: + case REG_MULTI_SZ: + val_datalen = 0; + break; + case REG_DWORD: + { + DWORD dummy = 0; + memcpy(val_data,&dummy,(val_datalen = sizeof(DWORD))); + } + break; + default: + goto error; + } + break; /* for(;;) */ } else { goto error; } diff -Nru erlang-13.b.1-dfsg/erts/etc/win32/erlsrv/erlsrv_registry.h erlang-13.b.3-dfsg/erts/etc/win32/erlsrv/erlsrv_registry.h --- erlang-13.b.1-dfsg/erts/etc/win32/erlsrv/erlsrv_registry.h 2009-03-12 12:17:07.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/etc/win32/erlsrv/erlsrv_registry.h 2009-09-18 15:07:54.000000000 +0100 @@ -38,12 +38,6 @@ } RegEntryDesc; enum { -#if defined(NOTYET) - Display, - Output, - User, - After, -#endif StopAction, OnFail, Machine, @@ -54,7 +48,8 @@ Name, Args, DebugType, - InternalServiceName + InternalServiceName, + Comment }; #define ON_FAIL_IGNORE 0 diff -Nru erlang-13.b.1-dfsg/erts/etc/win32/nsis/erlang20.nsi erlang-13.b.3-dfsg/erts/etc/win32/nsis/erlang20.nsi --- erlang-13.b.1-dfsg/erts/etc/win32/nsis/erlang20.nsi 2009-03-12 12:17:08.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/etc/win32/nsis/erlang20.nsi 2009-09-18 15:08:50.000000000 +0100 @@ -150,6 +150,21 @@ !insertmacro MUI_STARTMENU_WRITE_END ; And once again, the verbosity... !verbose 1 +; Check that the registry could be written, we only check one key, +; but it should be sufficient... + ReadRegStr $MYTEMP ${MY_STARTMENUPAGE_REGISTRY_ROOT} "${MY_STARTMENUPAGE_REGISTRY_KEY}" "${MY_STARTMENUPAGE_REGISTRY_VALUENAME}" + + StrCmp $MYTEMP "" 0 done_startmenu + +; If startmenu was skipped, this might be unnecessary, but wont hurt... + WriteRegStr HKCU "Software\Ericsson\Erlang\${ERTS_VERSION}" \ + "" $INSTDIR + WriteRegStr HKCU "${MY_STARTMENUPAGE_REGISTRY_KEY}" \ + "${MY_STARTMENUPAGE_REGISTRY_VALUENAME}" \ + "$STARTMENU_FOLDER" + + +done_startmenu: ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" @@ -168,19 +183,15 @@ ; Check that the registry could be written, we only check one key, ; but it should be sufficient... -; ReadRegStr $MYTEMP ${MUI_STARTMENUPAGE_REGISTRY_ROOT} ${MUI_STARTMENUPAGE_REGISTRY_KEY} ${MUI_STARTMENUPAGE_REGISTRY_VALUENAME} - ReadRegStr $MYTEMP ${MY_STARTMENUPAGE_REGISTRY_ROOT} "${MY_STARTMENUPAGE_REGISTRY_KEY}" "${MY_STARTMENUPAGE_REGISTRY_VALUENAME}" + ReadRegStr $MYTEMP HKLM \ + "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \ + "NoRepair" StrCmp $MYTEMP "" 0 done ; Now we're done if we are a superuser. If the registry stuff failed, we ; do the things below... - WriteRegStr HKCU "Software\Ericsson\Erlang\${ERTS_VERSION}" \ - "" $INSTDIR - WriteRegStr HKCU "${MY_STARTMENUPAGE_REGISTRY_KEY}" \ - "${MY_STARTMENUPAGE_REGISTRY_VALUENAME}" \ - "$STARTMENU_FOLDER" WriteRegStr HKCU \ "Software\Microsoft\Windows\CurrentVersion\Uninstall\Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" \ "DisplayName" "Erlang OTP ${OTP_VERSION} (${ERTS_VERSION})" diff -Nru erlang-13.b.1-dfsg/erts/include/internal/erl_misc_utils.h erlang-13.b.3-dfsg/erts/include/internal/erl_misc_utils.h --- erlang-13.b.1-dfsg/erts/include/internal/erl_misc_utils.h 2009-06-05 13:53:41.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/include/internal/erl_misc_utils.h 2009-09-18 15:09:11.000000000 +0100 @@ -40,6 +40,7 @@ int erts_get_cpu_available(erts_cpu_info_t *cpuinfo); char *erts_get_unbind_from_cpu_str(erts_cpu_info_t *cpuinfo); int erts_get_available_cpu(erts_cpu_info_t *cpuinfo, int no); +int erts_get_cpu_topology_size(erts_cpu_info_t *cpuinfo); int erts_get_cpu_topology(erts_cpu_info_t *cpuinfo, erts_cpu_topology_t *topology); int erts_is_cpu_available(erts_cpu_info_t *cpuinfo, int id); diff -Nru erlang-13.b.1-dfsg/erts/include/internal/erts_internal.mk.in erlang-13.b.3-dfsg/erts/include/internal/erts_internal.mk.in --- erlang-13.b.1-dfsg/erts/include/internal/erts_internal.mk.in 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/include/internal/erts_internal.mk.in 2009-09-18 15:10:21.000000000 +0100 @@ -0,0 +1,24 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +# ---------------------------------------------------------------------- + +ERTS_INTERNAL_X_LIBS=@ERTS_INTERNAL_X_LIBS@ + +# ---------------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/erts/include/internal/ethread.h erlang-13.b.3-dfsg/erts/include/internal/ethread.h --- erlang-13.b.1-dfsg/erts/include/internal/ethread.h 2009-03-12 12:17:12.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/include/internal/ethread.h 2009-09-18 15:08:50.000000000 +0100 @@ -681,11 +681,14 @@ #endif +/* __builtin_expect() is needed by both native atomics code + * and the fallback code */ +#if !defined(__GNUC__) || (__GNUC__ < 2) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96) +#define __builtin_expect(X, Y) (X) +#endif + /* For CPU-optimised atomics, spinlocks, and rwlocks. */ #if !defined(ETHR_DISABLE_NATIVE_IMPLS) && defined(__GNUC__) -# if __GNUC__ < 3 && (__GNUC__ != 2 || __GNUC_MINOR__ < 96) -# define __builtin_expect(X, Y) (X) -# endif # if ETHR_SIZEOF_PTR == 4 # if defined(__i386__) # include "i386/ethread.h" diff -Nru erlang-13.b.1-dfsg/erts/include/internal/ethread_header_config.h.in erlang-13.b.3-dfsg/erts/include/internal/ethread_header_config.h.in --- erlang-13.b.1-dfsg/erts/include/internal/ethread_header_config.h.in 2009-03-12 12:17:13.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/include/internal/ethread_header_config.h.in 2009-09-18 15:08:51.000000000 +0100 @@ -47,7 +47,7 @@ /* Define if you have the pthread_spin_lock function. */ #undef ETHR_HAVE_PTHREAD_SPIN_LOCK -/* Define if you have the pthread_rwlock_init function */ +/* Define if you have a pthread_rwlock implementation that can be used */ #undef ETHR_HAVE_PTHREAD_RWLOCK_INIT /* Define if you want to turn on extra sanity checking in the ethread library */ diff -Nru erlang-13.b.1-dfsg/erts/lib_src/common/erl_misc_utils.c erlang-13.b.3-dfsg/erts/lib_src/common/erl_misc_utils.c --- erlang-13.b.1-dfsg/erts/lib_src/common/erl_misc_utils.c 2009-06-05 13:53:41.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/lib_src/common/erl_misc_utils.c 2009-11-20 13:32:23.000000000 +0000 @@ -75,6 +75,11 @@ #include #endif +#ifdef __linux__ +# define ERTS_SYS_NODE_PATH "/sys/devices/system/node" +# define ERTS_SYS_CPU_PATH "/sys/devices/system/cpu" +#endif + static int read_topology(erts_cpu_info_t *cpuinfo); int @@ -98,6 +103,7 @@ int configured; int online; int available; + int topology_size; erts_cpu_topology_t *topology; #if defined(HAVE_SCHED_xETAFFINITY) char *affinity_str; @@ -121,6 +127,7 @@ #elif defined(HAVE_PSET_INFO) cpuinfo->cpuids = NULL; #endif + cpuinfo->topology_size = 0; cpuinfo->topology = NULL; erts_cpu_info_update(cpuinfo); return cpuinfo; @@ -137,8 +144,11 @@ if (cpuinfo->cpuids) free(cpuinfo->cpuids); #endif - if (cpuinfo->topology) + cpuinfo->topology_size = 0; + if (cpuinfo->topology) { + cpuinfo->topology = NULL; free(cpuinfo->topology); + } free(cpuinfo); } } @@ -172,7 +182,7 @@ #elif defined(HAVE_SYS_SYSCTL_H) && defined(CTL_HW) && (defined(HW_NCPU) \ || defined(HW_AVAILCPU)) { - int mib[0]; + int mib[2]; size_t len; #ifdef HW_NCPU @@ -350,6 +360,12 @@ } int +erts_get_cpu_topology_size(erts_cpu_info_t *cpuinfo) +{ + return cpuinfo->topology_size; +} + +int erts_get_cpu_topology(erts_cpu_info_t *cpuinfo, erts_cpu_topology_t *topology) { @@ -484,6 +500,27 @@ static int +pn_cmp(const void *vx, const void *vy) +{ + erts_cpu_topology_t *x = (erts_cpu_topology_t *) vx; + erts_cpu_topology_t *y = (erts_cpu_topology_t *) vy; + + if (x->processor != y->processor) + return x->processor - y->processor; + if (x->node != y->node) + return x->node - y->node; + if (x->processor_node != y->processor_node) + return x->processor_node - y->processor_node; + if (x->core != y->core) + return x->core - y->core; + if (x->thread != y->thread) + return x->thread - y->thread; + if (x->logical != y->logical) + return x->logical - y->logical; + return 0; +} + +static int cpu_cmp(const void *vx, const void *vy) { erts_cpu_topology_t *x = (erts_cpu_topology_t *) vx; @@ -553,6 +590,7 @@ int ix; int res = 0; int got_nodes = 0; + int no_nodes = 0; errno = 0; @@ -578,7 +616,7 @@ ix = -1; - if (realpath("/sys/devices/system/node", npath)) { + if (realpath(ERTS_SYS_NODE_PATH, npath)) { got_nodes = 1; ndir = opendir(npath); } @@ -587,7 +625,7 @@ int node_id = -1; if (!got_nodes) { - if (!realpath("/sys/devices/system/cpu", cpath)) + if (!realpath(ERTS_SYS_CPU_PATH, cpath)) goto error; } else { @@ -600,6 +638,8 @@ if (sscanf(nde->d_name, "node%d", &node_id) != 1) continue; + no_nodes++; + sprintf(tpath, "%s/node%d", npath, node_id); if (!realpath(tpath, cpath)) @@ -646,7 +686,7 @@ ix++; cpuinfo->topology[ix].node = node_id; cpuinfo->topology[ix].processor = processor_id; - cpuinfo->topology[ix].processor_node = -1; /* Currently not detected */ + cpuinfo->topology[ix].processor_node = -1; /* Fixed later */ cpuinfo->topology[ix].core = core_id; cpuinfo->topology[ix].thread = 0; /* we'll numerate later */ cpuinfo->topology[ix].logical = cpu_id; @@ -654,38 +694,96 @@ } } while (got_nodes); - qsort(cpuinfo->topology, - cpuinfo->configured, - sizeof(erts_cpu_topology_t), - cpu_cmp); - res = ix+1; - if (res < cpuinfo->online) + if (!res || res < cpuinfo->online) res = 0; else { erts_cpu_topology_t *prev, *this, *last; + cpuinfo->topology_size = res; + + if (cpuinfo->topology_size != cpuinfo->configured) { + void *t = realloc(cpuinfo->topology, (sizeof(erts_cpu_topology_t) + * cpuinfo->topology_size)); + if (t) + cpuinfo->topology = t; + } + + if (no_nodes > 1) { + int processor = -1; + int processor_node = 0; + int node = -1; + + qsort(cpuinfo->topology, + cpuinfo->topology_size, + sizeof(erts_cpu_topology_t), + pn_cmp); + + prev = NULL; + this = &cpuinfo->topology[0]; + last = &cpuinfo->topology[cpuinfo->configured-1]; + while (1) { + if (processor == this->processor) { + if (node != this->node) + processor_node = 1; + } + else { + if (processor_node) { + make_processor_node: + while (prev->processor == processor) { + prev->processor_node = prev->node; + prev->node = -1; + if (prev == &cpuinfo->topology[0]) + break; + prev--; + } + processor_node = 0; + } + processor = this->processor; + node = this->node; + } + if (this == last) { + if (processor_node) { + prev = this; + goto make_processor_node; + } + break; + } + prev = this++; + } + } + + qsort(cpuinfo->topology, + cpuinfo->topology_size, + sizeof(erts_cpu_topology_t), + cpu_cmp); + this = &cpuinfo->topology[0]; this->thread = 0; - prev = this++; - last = &cpuinfo->topology[cpuinfo->configured-1]; - - while (this <= last) { - this->thread = ((this->node == prev->node - && this->processor == prev->processor - && this->processor_node == prev->processor_node - && this->core == prev->core) - ? prev->thread + 1 - : 0); + if (res > 1) { prev = this++; + last = &cpuinfo->topology[cpuinfo->configured-1]; + + while (1) { + this->thread = ((this->node == prev->node + && this->processor == prev->processor + && this->processor_node == prev->processor_node + && this->core == prev->core) + ? prev->thread + 1 + : 0); + if (this == last) + break; + prev = this++; + } } } error: if (res == 0) { + cpuinfo->topology_size = 0; if (cpuinfo->topology) { free(cpuinfo->topology); cpuinfo->topology = NULL; @@ -782,7 +880,7 @@ if (ks->ks_type == KSTAT_TYPE_NAMED) { /* * Don't know how to figure numa nodes out; - * hope there is only one... + * hope there is none... */ cpuinfo->topology[ix].node = -1; cpuinfo->topology[ix].processor = data_lookup_int(ks,"chip_id"); @@ -798,38 +896,52 @@ kstat_close(ks_ctl); - res = ix+1; + res = ix; - if (res < cpuinfo->online) + if (!res || res < cpuinfo->online) res = 0; else { erts_cpu_topology_t *prev, *this, *last; + cpuinfo->topology_size = res; + + if (cpuinfo->topology_size != cpuinfo->configured) { + void *t = realloc(cpuinfo->topology, (sizeof(erts_cpu_topology_t) + * cpuinfo->topology_size)); + if (t) + cpuinfo->topology = t; + } + qsort(cpuinfo->topology, - cpuinfo->configured, + cpuinfo->topology_size, sizeof(erts_cpu_topology_t), cpu_cmp); this = &cpuinfo->topology[0]; this->thread = 0; - prev = this++; - last = &cpuinfo->topology[cpuinfo->configured-1]; - - while (this <= last) { - this->thread = ((this->node == prev->node - && this->processor == prev->processor - && this->processor_node == prev->processor_node - && this->core == prev->core) - ? prev->thread + 1 - : 0); + if (res > 1) { prev = this++; + last = &cpuinfo->topology[cpuinfo->configured-1]; + + while (1) { + this->thread = ((this->node == prev->node + && this->processor == prev->processor + && this->processor_node == prev->processor_node + && this->core == prev->core) + ? prev->thread + 1 + : 0); + if (this == last) + break; + prev = this++; + } } } error: if (res == 0) { + cpuinfo->topology_size = 0; if (cpuinfo->topology) { free(cpuinfo->topology); cpuinfo->topology = NULL; diff -Nru erlang-13.b.1-dfsg/erts/lib_src/Makefile.in erlang-13.b.3-dfsg/erts/lib_src/Makefile.in --- erlang-13.b.1-dfsg/erts/lib_src/Makefile.in 2009-04-16 10:24:17.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/lib_src/Makefile.in 2009-09-18 15:08:50.000000000 +0100 @@ -439,6 +439,7 @@ $(ERTS_INCL_INT)/README \ $(ERTS_INCL_INT)/ethread.h \ $(ERTS_INCL_INT)/$(TARGET)/ethread.mk \ + $(ERTS_INCL_INT)/$(TARGET)/erts_internal.mk \ $(ERTS_INCL_INT)/$(TARGET)/ethread_header_config.h \ $(ERTS_INCL_INT)/erl_printf.h \ $(ERTS_INCL_INT)/erl_printf_format.h \ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/erts/preloaded/ebin/erlang.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/erts/preloaded/ebin/erlang.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/erts/preloaded/ebin/erl_prim_loader.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/erts/preloaded/ebin/erl_prim_loader.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/erts/preloaded/ebin/init.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/erts/preloaded/ebin/init.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/erts/preloaded/ebin/otp_ring0.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/erts/preloaded/ebin/otp_ring0.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/erts/preloaded/ebin/prim_file.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/erts/preloaded/ebin/prim_file.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/erts/preloaded/ebin/prim_inet.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/erts/preloaded/ebin/prim_inet.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/erts/preloaded/ebin/prim_zip.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/erts/preloaded/ebin/prim_zip.beam differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/erts/preloaded/ebin/zlib.beam and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/erts/preloaded/ebin/zlib.beam differ diff -Nru erlang-13.b.1-dfsg/erts/preloaded/src/erlang.erl erlang-13.b.3-dfsg/erts/preloaded/src/erlang.erl --- erlang-13.b.1-dfsg/erts/preloaded/src/erlang.erl 2009-06-05 13:52:56.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/preloaded/src/erlang.erl 2009-11-20 13:29:31.000000000 +0000 @@ -42,14 +42,14 @@ -export([concat_binary/1]). --export([memory/0, memory/1]). - -export([list_to_integer/2,integer_to_list/2]). --export([demonitor/2]). +-export([flush_monitor_message/2]). -export([set_cpu_topology/1, format_cpu_topology/1]). +-export([await_proc_exit/3]). + -deprecated([hash/2]). -compile(nowarn_bif_clash). @@ -273,11 +273,11 @@ -type dst() :: pid() | port() | atom() | {atom(), node()}. --spec send_nosuspend(dst(), term()) -> bool(). +-spec send_nosuspend(dst(), term()) -> boolean(). send_nosuspend(Pid, Msg) -> send_nosuspend(Pid, Msg, []). --spec send_nosuspend(dst(), term(), ['noconnect' | 'nosuspend']) -> bool(). +-spec send_nosuspend(dst(), term(), ['noconnect' | 'nosuspend']) -> boolean(). send_nosuspend(Pid, Msg, Opts) -> case erlang:send(Pid, Msg, [nosuspend|Opts]) of ok -> true; @@ -429,33 +429,6 @@ concat_binary(List) -> list_to_binary(List). -%% -%% erlang:memory/0 may fail with a notsup exception -%% - -memory() -> - case erlang:system_info(memory) of - Result when is_list(Result) -> Result; - Error -> erlang:error(Error, []) - end. - -%% -%% erlang:memory/1 may fail with a badarg or a notsup exception -%% - -memory(Type) when is_atom(Type) -> - case erlang:system_info({memory, [Type]}) of - [{Type, Bytes}] -> Bytes; - Error -> erlang:error(Error, [Type]) - end; -memory(TypeSpec) -> - case erlang:system_info({memory, TypeSpec}) of - Result when is_list(Result) -> Result; - Error -> erlang:error(Error, [TypeSpec]) - end. - - - integer_to_list(I, 10) -> erlang:integer_to_list(I); integer_to_list(I, Base) @@ -525,26 +498,21 @@ list_to_integer(_, _, _) -> badarg. -demonitor(MRef, Opts) -> - Flush = case catch get_demonitor_opts(Opts, false) of - Bool when Bool; not Bool -> Bool; - _ -> erlang:error(badarg, [MRef, Opts]) - end, - Res = case catch erlang:demonitor(MRef) of - {'EXIT', {Error, _}} -> erlang:error(Error, [MRef, Opts]); - R -> R - end, - case Flush of - true -> receive {_, MRef, _, _, _} -> ok after 0 -> ok end; - _ -> ok - end, +%% erlang:flush_monitor_message/2 is for internal use only! +%% +%% erlang:demonitor(Ref, [flush]) traps to +%% erlang:flush_monitor_message(Ref, Res) when +%% it needs to flush a monitor message. +flush_monitor_message(Ref, Res) when is_reference(Ref), is_atom(Res) -> + receive {_, Ref, _, _, _} -> ok after 0 -> ok end, Res. -%% Currently 'flush' is the only valid option... -get_demonitor_opts([], Flush) -> - Flush; -get_demonitor_opts([flush|Opts], _Flush) -> - get_demonitor_opts(Opts, true). +-record(cpu, {node = -1, + processor = -1, + processor_node = -1, + core = -1, + thread = -1, + logical = -1}). %% erlang:set_cpu_topology/1 is for internal use only! %% @@ -552,29 +520,89 @@ %% erlang:set_cpu_topology(CpuTopology). set_cpu_topology(CpuTopology) -> try format_cpu_topology(erlang:system_flag(internal_cpu_topology, - cput_parse(CpuTopology))) - catch _ : _ -> erlang:error(badarg, [CpuTopology]) + cput_e2i(CpuTopology))) + catch + Class:Exception when Class =/= error; Exception =/= internal_error -> + erlang:error(badarg, [CpuTopology]) + end. + +cput_e2i_clvl({logical, _}, _PLvl) -> + #cpu.logical; +cput_e2i_clvl([E | _], PLvl) -> + case element(1, E) of + node -> case PLvl of + 0 -> #cpu.node; + #cpu.processor -> #cpu.processor_node + end; + processor -> case PLvl of + 0 -> #cpu.node; + #cpu.node -> #cpu.processor + end; + core -> #cpu.core; + thread -> #cpu.thread end. -cput_parse(undefined) -> +cput_e2i(undefined) -> undefined; -cput_parse([]) -> - []; -cput_parse({logical, CpuId}) -> - true = is_integer(CpuId), - CpuId; -cput_parse([LvlEntry | _] = LvlList) -> - Lvl = element(1, LvlEntry), - list_to_tuple([Lvl | cput_parse_lvl(Lvl, LvlList)]). - -cput_parse_lvl(_Lvl, []) -> - []; -cput_parse_lvl(Lvl, [{Lvl, SubLvlList} | Rest]) -> - cput_parse_lvl(Lvl, [{Lvl, [], SubLvlList} | Rest]); -cput_parse_lvl(Lvl, [{Lvl, Info, SubLvlList} | Rest]) -> - [] = Info, %% Currently only [] is a valid info list - [cput_parse(SubLvlList) | cput_parse_lvl(Lvl, Rest)]. +cput_e2i(E) -> + rvrs(cput_e2i(E, -1, -1, #cpu{}, 0, cput_e2i_clvl(E, 0), [])). +cput_e2i([], _NId, _PId, _IS, _PLvl, _Lvl, Res) -> + Res; +cput_e2i([E|Es], NId0, PId, IS, PLvl, Lvl, Res0) -> + case cput_e2i(E, NId0, PId, IS, PLvl, Lvl, Res0) of + [] -> + cput_e2i(Es, NId0, PId, IS, PLvl, Lvl, Res0); + [#cpu{node = N, + processor = P, + processor_node = PN} = CPU|_] = Res1 -> + NId1 = case N > PN of + true -> N; + false -> PN + end, + cput_e2i(Es, NId1, P, CPU, PLvl, Lvl, Res1) + end; +cput_e2i({Tag, [], TagList}, Nid, PId, CPU, PLvl, Lvl, Res) -> + %% Currently [] is the only valid InfoList + cput_e2i({Tag, TagList}, Nid, PId, CPU, PLvl, Lvl, Res); +cput_e2i({node, NL}, Nid0, PId, _CPU, 0, #cpu.node, Res) -> + Nid1 = Nid0+1, + Lvl = cput_e2i_clvl(NL, #cpu.node), + cput_e2i(NL, Nid1, PId, #cpu{node = Nid1}, #cpu.node, Lvl, Res); +cput_e2i({processor, PL}, Nid, PId0, _CPU, 0, #cpu.node, Res) -> + PId1 = PId0+1, + Lvl = cput_e2i_clvl(PL, #cpu.processor), + cput_e2i(PL, Nid, PId1, #cpu{processor = PId1}, #cpu.processor, Lvl, Res); +cput_e2i({processor, PL}, Nid, PId0, CPU, PLvl, CLvl, Res) + when PLvl < #cpu.processor, CLvl =< #cpu.processor -> + PId1 = PId0+1, + Lvl = cput_e2i_clvl(PL, #cpu.processor), + cput_e2i(PL, Nid, PId1, CPU#cpu{processor = PId1, + processor_node = -1, + core = -1, + thread = -1}, #cpu.processor, Lvl, Res); +cput_e2i({node, NL}, Nid0, PId, CPU, #cpu.processor, #cpu.processor_node, + Res) -> + Nid1 = Nid0+1, + Lvl = cput_e2i_clvl(NL, #cpu.processor_node), + cput_e2i(NL, Nid1, PId, CPU#cpu{processor_node = Nid1}, + #cpu.processor_node, Lvl, Res); +cput_e2i({core, CL}, Nid, PId, #cpu{core = C0} = CPU, PLvl, #cpu.core, Res) + when PLvl < #cpu.core -> + Lvl = cput_e2i_clvl(CL, #cpu.core), + cput_e2i(CL, Nid, PId, CPU#cpu{core = C0+1, thread = -1}, #cpu.core, Lvl, + Res); +cput_e2i({thread, TL}, Nid, PId, #cpu{thread = T0} = CPU, PLvl, #cpu.thread, + Res) when PLvl < #cpu.thread -> + Lvl = cput_e2i_clvl(TL, #cpu.thread), + cput_e2i(TL, Nid, PId, CPU#cpu{thread = T0+1}, #cpu.thread, Lvl, Res); +cput_e2i({logical, ID}, _Nid, PId, #cpu{processor=P, core=C, thread=T} = CPU, + PLvl, #cpu.logical, Res) + when PLvl < #cpu.logical, is_integer(ID), 0 =< ID, ID < 65536 -> + [CPU#cpu{processor = case P of -1 -> PId+1; _ -> P end, + core = case C of -1 -> 0; _ -> C end, + thread = case T of -1 -> 0; _ -> T end, + logical = ID} | Res]. %% erlang:format_cpu_topology/1 is for internal use only! %% @@ -582,22 +610,71 @@ %% and erlang:system_info({cpu_topology, Which}) traps to %% erlang:format_cpu_topology(InternalCpuTopology). format_cpu_topology(InternalCpuTopology) -> - try cput_format(InternalCpuTopology) - catch _ : _ -> erlang:error(badarg, [InternalCpuTopology]) + try cput_i2e(InternalCpuTopology) + catch _ : _ -> erlang:error(internal_error, [InternalCpuTopology]) end. -cput_format(undefined) -> - undefined; -cput_format(CpuId) when is_integer(CpuId) -> - {logical, CpuId}; -cput_format(LvlTuple) when is_tuple(LvlTuple) -> - cput_format(element(1, LvlTuple), LvlTuple, 2, size(LvlTuple)). -cput_format(_Lvl, _LvlTuple, Ix, MaxIx) when Ix > MaxIx -> +cput_i2e(undefined) -> undefined; +cput_i2e(Is) -> cput_i2e(Is, true, #cpu.node, cput_i2e_tag_map()). + +cput_i2e([], _Frst, _Lvl, _TM) -> []; -cput_format(Lvl, LvlTuple, Ix, MaxIx) -> - [{Lvl, cput_format(element(Ix, LvlTuple))} - | cput_format(Lvl, LvlTuple, Ix+1, MaxIx)]. +cput_i2e([#cpu{logical = LID}| _], _Frst, Lvl, _TM) when Lvl == #cpu.logical -> + {logical, LID}; +cput_i2e([#cpu{} = I | Is], Frst, Lvl, TM) -> + cput_i2e(element(Lvl, I), Frst, Is, [I], Lvl, TM). + +cput_i2e(V, Frst, [I | Is], SameV, Lvl, TM) when V =:= element(Lvl, I) -> + cput_i2e(V, Frst, Is, [I | SameV], Lvl, TM); +cput_i2e(-1, true, [], SameV, Lvl, TM) -> + cput_i2e(rvrs(SameV), true, Lvl+1, TM); +cput_i2e(_V, true, [], SameV, Lvl, TM) when Lvl =/= #cpu.processor, + Lvl =/= #cpu.processor_node -> + cput_i2e(rvrs(SameV), true, Lvl+1, TM); +cput_i2e(-1, _Frst, Is, SameV, #cpu.node, TM) -> + cput_i2e(rvrs(SameV), true, #cpu.processor, TM) + ++ cput_i2e(Is, false, #cpu.node, TM); +cput_i2e(_V, _Frst, Is, SameV, Lvl, TM) -> + [{cput_i2e_tag(Lvl, TM), cput_i2e(rvrs(SameV), true, Lvl+1, TM)} + | cput_i2e(Is, false, Lvl, TM)]. + +cput_i2e_tag_map() -> list_to_tuple([cpu | record_info(fields, cpu)]). + +cput_i2e_tag(Lvl, TM) -> + case element(Lvl, TM) of processor_node -> node; Other -> Other end. + +rvrs([_] = L) -> L; +rvrs(Xs) -> rvrs(Xs, []). + +rvrs([],Ys) -> Ys; +rvrs([X|Xs],Ys) -> rvrs(Xs, [X|Ys]). + +%% erlang:await_proc_exit/3 is for internal use only! +%% +%% BIFs that need to await a specific process exit before +%% returning traps to erlang:await_proc_exit/3. +%% +%% NOTE: This function is tightly coupled to +%% the implementation of the +%% erts_bif_prep_await_proc_exit_*() +%% functions in bif.c. Do not make +%% any changes to it without reading +%% the comment about them in bif.c! +await_proc_exit(Proc, Op, Data) -> + Mon = erlang:monitor(process, Proc), + receive + {'DOWN', Mon, process, _Proc, Reason} -> + case Op of + apply -> + {M, F, A} = Data, + erlang:apply(M, F, A); + data -> + Data; + reason -> + Reason + end + end. min(A, B) when A > B -> B; min(A, _) -> A. diff -Nru erlang-13.b.1-dfsg/erts/preloaded/src/erl_prim_loader.erl erlang-13.b.3-dfsg/erts/preloaded/src/erl_prim_loader.erl --- erlang-13.b.1-dfsg/erts/preloaded/src/erl_prim_loader.erl 2009-06-05 13:52:55.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/preloaded/src/erl_prim_loader.erl 2009-11-20 13:29:30.000000000 +0000 @@ -65,7 +65,7 @@ data, % data port etc timeout, % idle timeout n_timeouts, % Number of timeouts before archives are released - multi_get = false :: bool(), + multi_get = false :: boolean(), prim_state}). % state for efile code loader -define(IDLE_TIMEOUT, 60000). %% tear inet connection after 1 minutes @@ -122,9 +122,9 @@ {error,Reason} end. -start_it("ose_inet", Id, Pid, Hosts) -> +start_it("ose_inet"=Cmd, Id, Pid, Hosts) -> %% Setup reserved port for ose_inet driver (only OSE) - case catch erlang:open_port({spawn,ose_inet},[binary]) of + case catch erlang:open_port({spawn,Cmd},[binary]) of {'EXIT',Why} -> ?dbg(ose_inet_port_open_fail, Why), Why; @@ -868,7 +868,7 @@ {Res, PS}; {archive, ArchiveFile, FileInArchive} -> debug(PS, {archive_get_file, ArchiveFile, FileInArchive}), - FunnyFile = funny_split(FileInArchive), + FunnyFile = funny_split(FileInArchive, $/), Fun = fun({Funny, _GetInfo, GetBin}, Acc) -> if @@ -893,7 +893,7 @@ {Res, PS}; {archive, ArchiveFile, FileInArchive} -> debug(PS, {archive_list_dir, ArchiveFile, FileInArchive}), - FunnyDir = funny_split(FileInArchive), + FunnyDir = funny_split(FileInArchive, $/), Fun = fun({Funny, _GetInfo, _GetBin}, {Status, Names} = Acc) -> case Funny of @@ -953,7 +953,7 @@ end; {archive, ArchiveFile, FileInArchive} -> debug(PS, {archive_read_file_info, File}), - FunnyFile = funny_split(FileInArchive), + FunnyFile = funny_split(FileInArchive, $/), Fun = fun({Funny, GetInfo, _GetBin}, Acc) -> if @@ -1044,7 +1044,7 @@ Wrapper = fun({N, GI, GB}, A) -> %% Ensure full iteration at open - Funny = funny_split(N), + Funny = funny_split(N, $/), {_Continue, A2} = Fun({Funny, GI, GB}, A), {true, {true, Funny}, A2} end, @@ -1077,15 +1077,17 @@ %%% Look for directory separators is_basename(File) -> - case member($/, File) of + case deep_member($/, File) of true -> false; false -> case erlang:system_info(os_type) of {win32, _} -> case File of - [_,$:|_] -> false; - _ -> not member($\\, File) + [_,$: | _] -> + false; + _ -> + not deep_member($\\, File) end; _ -> true @@ -1111,6 +1113,17 @@ member(X, [_|Y]) -> member(X, Y); member(_X, []) -> false. +deep_member(X, [X|_]) -> + true; +deep_member(X, [List | Y]) when is_list(List) -> + deep_member(X, List) orelse deep_member(X, Y); +deep_member(X, [Atom | Y]) when is_atom(Atom) -> + deep_member(X, atom_to_list(Atom)) orelse deep_member(X, Y); +deep_member(X, [_ | Y]) -> + deep_member(X, Y); +deep_member(_X, []) -> + false. + keymember(X, I, [Y | _]) when element(I,Y) =:= X -> true; keymember(X, I, [_ | T]) -> keymember(X, I, T); keymember(_X, _I, []) -> false. @@ -1147,14 +1160,14 @@ lists:reverse(L, [B, A]). % BIF %% Returns all lists in reverse order -funny_split(List) -> - funny_split(List, [], []). +funny_split(List, Sep) -> + funny_split(List, Sep, [], []). -funny_split([Sep | Tail], Path, Paths) when Sep =:= $/; Sep =:= $\\-> - funny_split(Tail, [], [Path | Paths]); -funny_split([Head | Tail], Path, Paths) -> - funny_split(Tail, [Head | Path], Paths); -funny_split([], Path, Paths) -> +funny_split([Sep | Tail], Sep, Path, Paths) -> + funny_split(Tail, Sep, [], [Path | Paths]); +funny_split([Head | Tail], Sep, Path, Paths) -> + funny_split(Tail, Sep, [Head | Path], Paths); +funny_split([], _Sep, Path, Paths) -> [Path | Paths]. name_split(ArchiveFile, File0) -> @@ -1171,8 +1184,7 @@ %% Top dir in archive ArchiveFile = reverse(RevArchiveFile), {archive, ArchiveFile, []}; - {split, _RevArchiveBase, RevArchiveFile, [Sep | FileInArchive]} - when Sep =:= $/; Sep =:= $\\ -> + {split, _RevArchiveBase, RevArchiveFile, [$/ | FileInArchive]} -> %% File in archive ArchiveFile = reverse(RevArchiveFile), {archive, ArchiveFile, FileInArchive}; @@ -1190,7 +1202,7 @@ {match, _RevPrimArchiveFile, FileInArchive} -> %% Primary archive case FileInArchive of - [Sep | FileInArchive2] when Sep =:= $/; Sep =:= $\\ -> + [$/ | FileInArchive2] -> {archive, ArchiveFile, FileInArchive2}; _ -> {archive, ArchiveFile, FileInArchive} @@ -1251,64 +1263,144 @@ %% A simplified version of filename:absname/1 absname(Name) -> - case pathtype(Name) of + Name2 = normalize(Name, []), + case pathtype(Name2) of absolute -> - normalize(Name, []); + Name2; relative -> case prim_file:get_cwd() of {ok, Cwd} -> - normalize(Cwd ++ "/" ++ Name, []); + Cwd ++ "/" ++ Name2; {error, _} -> - normalize(Name, []) + Name2 end; volumerelative -> case prim_file:get_cwd() of {ok, Cwd} -> - absname_vr(Name, Cwd); + absname_vr(Name2, Cwd); {error, _} -> - normalize(Name, []) + Name2 end end. +%% Assumes normalized name absname_vr([$/ | NameRest], [Drive, $\: | _]) -> %% Absolute path on current drive. - normalize([Drive, $\: | NameRest], []); + [Drive, $\: | NameRest]; absname_vr([Drive, $\: | NameRest], [Drive, $\: | _] = Cwd) -> %% Relative to current directory on current drive. - normalize(Cwd ++ "/" ++ NameRest, []); -absname_vr([Drive, $: | NameRest], _) -> + Cwd ++ "/" ++ NameRest; +absname_vr([Drive, $\: | NameRest], _) -> %% Relative to current directory on another drive. - case prim_file:get_cwd([Drive, $:]) of - {ok, DriveCwd} -> normalize(DriveCwd ++ "/" ++ NameRest, []); - {error, _} -> normalize([Drive, $\:, $/] ++ NameRest, []) + case prim_file:get_cwd([Drive, $\:]) of + {ok, DriveCwd} -> + DriveCwd ++ "/" ++ NameRest; + {error, _} -> + [Drive, $\:, $/] ++ NameRest end. -pathtype(Name) -> +%% Assumes normalized name +pathtype(Name) when is_list(Name) -> case erlang:system_info(os_type) of + {unix, _} -> + unix_pathtype(Name); {win32, _} -> - case Name of - [$/, $/|_] -> absolute; - [$\\, $/|_] -> absolute; - [$/, $\\|_] -> absolute; - [$\\, $\\|_] -> absolute; - [$/|_] -> volumerelative; - [$\\|_] -> volumerelative; - [_Drive, $\:, $/ | _] -> absolute; - [_Drive, $\:, $\\ | _] -> absolute; - [_Drive, $\: | _] -> volumerelative; - _ -> relative + win32_pathtype(Name); + {vxworks, _} -> + case vxworks_first(Name) of + {device, _Rest, _Dev} -> + absolute; + _ -> + relative end; + {ose,_} -> + unix_pathtype(Name) + end. + +unix_pathtype(Name) -> + case Name of + [$/|_] -> + absolute; + [List|Rest] when is_list(List) -> + unix_pathtype(List++Rest); + [Atom|Rest] when is_atom(Atom) -> + atom_to_list(Atom)++Rest; _ -> - case Name of - [$/|_] -> absolute; - [$\\|_] -> absolute; - _ -> relative - end + relative end. -normalize([$\\ | Chars], Acc) -> - normalize(Chars, [$/ | Acc]); -normalize([Char | Chars], Acc) -> - normalize(Chars, [Char | Acc]); -normalize([], Acc) -> - reverse(Acc). +win32_pathtype(Name) -> + case Name of + [List|Rest] when is_list(List) -> + win32_pathtype(List++Rest); + [Atom|Rest] when is_atom(Atom) -> + win32_pathtype(atom_to_list(Atom)++Rest); + [Char, List | Rest] when is_list(List) -> + win32_pathtype([Char | List++Rest]); + [$/, $/|_] -> + absolute; + [$\\, $/|_] -> + absolute; + [$/, $\\|_] -> + absolute; + [$\\, $\\|_] -> + absolute; + [$/|_] -> + volumerelative; + [$\\|_] -> + volumerelative; + [C1, C2, List | Rest] when is_list(List) -> + pathtype([C1, C2|List ++ Rest]); + [_Letter, $:, $/|_] -> + absolute; + [_Letter, $:, $\\|_] -> + absolute; + [_Letter, $:|_] -> + volumerelative; + _ -> + relative + end. + +vxworks_first(Name) -> + case Name of + [] -> + {not_device, [], []}; + [$/ | T] -> + vxworks_first2(device, T, [$/]); + [$\\ | T] -> + vxworks_first2(device, T, [$/]); + [H | T] when is_list(H) -> + vxworks_first(H ++ T); + [H | T] -> + vxworks_first2(not_device, T, [H]) + end. + +vxworks_first2(Devicep, Name, FirstComp) -> + case Name of + [] -> + {Devicep, [], FirstComp}; + [$/ |T ] -> + {Devicep, [$/ | T], FirstComp}; + [$\\ | T] -> + {Devicep, [$/ | T], FirstComp}; + [$: | T]-> + {device, T, [$: | FirstComp]}; + [H | T] when is_list(H) -> + vxworks_first2(Devicep, H ++ T, FirstComp); + [H | T] -> + vxworks_first2(Devicep, T, [H | FirstComp]) + end. + +normalize(Name, Acc) -> + case Name of + [List | Rest] when is_list(List) -> + normalize(List ++ Rest, Acc); + [Atom | Rest] when is_atom(Atom) -> + normalize(atom_to_list(Atom) ++ Rest, Acc); + [$\\ | Chars] -> + normalize(Chars, [$/ | Acc]); + [Char | Chars] -> + normalize(Chars, [Char | Acc]); + [] -> + reverse(Acc) + end. diff -Nru erlang-13.b.1-dfsg/erts/preloaded/src/init.erl erlang-13.b.3-dfsg/erts/preloaded/src/init.erl --- erlang-13.b.1-dfsg/erts/preloaded/src/init.erl 2009-03-12 12:17:20.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/preloaded/src/init.erl 2009-11-20 13:29:32.000000000 +0000 @@ -70,6 +70,8 @@ loaded = [], subscribed = []}). +-define(ON_LOAD_HANDLER, init__boot__on_load_handler). + debug(false, _) -> ok; debug(_, T) -> erlang:display(T). @@ -149,6 +151,7 @@ boot(BootArgs) -> register(init, self()), process_flag(trap_exit, true), + start_on_load_handler_process(), {Start0,Flags,Args} = parse_boot_args(BootArgs), Start = map(fun prepare_run_args/1, Start0), Flags0 = flags_to_atoms_again(Flags), @@ -198,7 +201,7 @@ {ok,[["relaxed"]]} -> relaxed; _Else -> - strict + relaxed end. boot(Start,Flags,Args) -> @@ -303,6 +306,24 @@ {stop,Reason} -> stop(Reason,State); {From,fetch_loaded} -> %% Fetch and reset initially loaded modules. + case whereis(?ON_LOAD_HANDLER) of + undefined -> + %% There is no on_load handler process, + %% probably because init:restart/0 has been + %% called and it is not the first time we + %% pass through here. + ok; + Pid when is_pid(Pid) -> + Pid ! run_on_load, + receive + {'EXIT',Pid,on_load_done} -> + ok; + {'EXIT',Pid,Res} -> + %% Failure to run an on_load handler. + %% This is fatal during start-up. + exit(Res) + end + end, From ! {init,State#state.loaded}, garb_boot_loop(BootPid,State#state{loaded = []}); {From,{ensure_loaded,Module}} -> @@ -1052,6 +1073,9 @@ false -> case erlang:load_module(Mod, BinCode) of {module,Mod} -> {ok,FullName}; + {error,on_load} -> + ?ON_LOAD_HANDLER ! {loaded,Mod}, + {ok,FullName}; Other -> exit({'cannot load',Mod,Other}) end; @@ -1304,3 +1328,45 @@ -spec archive_extension() -> nonempty_string(). archive_extension() -> ".ez". + +%%% +%%% Support for handling of on_load functions. +%%% + +start_on_load_handler_process() -> + register(?ON_LOAD_HANDLER, + spawn_link(fun on_load_handler_init/0)). + +on_load_handler_init() -> + on_load_loop([]). + +on_load_loop(Mods) -> + receive + {loaded,Mod} -> + on_load_loop([Mod|Mods]); + run_on_load -> + run_on_load_handlers(Mods), + exit(on_load_done) + end. + +run_on_load_handlers([M|Ms]) -> + Fun = fun() -> + Res = erlang:call_on_load_function(M), + exit(Res) + end, + {Pid,Ref} = spawn_monitor(Fun), + receive + {'DOWN',Ref,process,Pid,OnLoadRes} -> + Keep = if + is_boolean(OnLoadRes) -> OnLoadRes; + true -> false + end, + erlang:finish_after_on_load(M, Keep), + case Keep of + false -> + exit({on_load_function_failed,M}); + true -> + run_on_load_handlers(Ms) + end + end; +run_on_load_handlers([]) -> ok. diff -Nru erlang-13.b.1-dfsg/erts/preloaded/src/prim_file.erl erlang-13.b.3-dfsg/erts/preloaded/src/prim_file.erl --- erlang-13.b.1-dfsg/erts/preloaded/src/prim_file.erl 2009-03-12 12:17:21.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/preloaded/src/prim_file.erl 2009-11-20 13:31:12.000000000 +0000 @@ -26,7 +26,7 @@ %% Generic file contents operations -export([open/2, close/1, sync/1, position/2, truncate/1, - write/2, pwrite/2, pwrite/3, read/2, pread/2, pread/3, copy/3]). + write/2, pwrite/2, pwrite/3, read/2, read_line/1, pread/2, pread/3, copy/3]). %% Specialized file operations -export([open/1, open/3]). @@ -95,6 +95,7 @@ -define(FILE_SETOPT, 26). -define(FILE_IPREAD, 27). -define(FILE_ALTNAME, 28). +-define(FILE_READ_LINE, 29). %% Driver responses -define(FILE_RESP_OK, 0). @@ -167,7 +168,6 @@ %% Opens a port that can be used for open/3 or read_file/2. %% Returns {ok, Port} | {error, Reason}. open(Portopts) when is_list(Portopts) -> -% drv_open(?FD_DRV, Portopts). case drv_open(?FD_DRV, Portopts) of {error, _} = Error -> Error; @@ -298,6 +298,27 @@ drv_command(Port, [?FILE_FSYNC]). %% Returns {ok, Data} | eof | {error, Reason}. +read_line(#file_descriptor{module = ?MODULE, data = {Port, _}}) -> + case drv_command(Port, <>) of + {ok, {0, _Data}} -> + eof; + {ok, {_Size, Data}} -> + {ok, Data}; + {error, enomem} -> + erlang:garbage_collect(), + case drv_command(Port, <>) of + {ok, {0, _Data}} -> + eof; + {ok, {_Size, Data}} -> + {ok, Data}; + Other -> + Other + end; + Error -> + Error + end. + +%% Returns {ok, Data} | eof | {error, Reason}. read(#file_descriptor{module = ?MODULE, data = {Port, _}}, Size) when is_integer(Size), 0 =< Size -> if @@ -477,7 +498,7 @@ %% Returns {ok, Port}, the Port should be used as first argument in all %% the following functions. Returns {error, Reason} upon failure. start() -> - try erlang:open_port({spawn, ?DRV}, []) of + try erlang:open_port({spawn, atom_to_list(?DRV)}, []) of Port -> {ok, Port} catch diff -Nru erlang-13.b.1-dfsg/erts/preloaded/src/prim_inet.erl erlang-13.b.3-dfsg/erts/preloaded/src/prim_inet.erl --- erlang-13.b.1-dfsg/erts/preloaded/src/prim_inet.erl 2009-06-05 13:53:19.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/preloaded/src/prim_inet.erl 2009-11-20 13:31:12.000000000 +0000 @@ -30,7 +30,7 @@ -export([connect/3, connect/4, async_connect/4]). -export([accept/1, accept/2, async_accept/2]). -export([shutdown/2]). --export([send/2, sendto/4, sendmsg/3]). +-export([send/2, send/3, sendto/4, sendmsg/3]). -export([recv/2, recv/3, async_recv/3]). -export([unrecv/2]). -export([recvfrom/2, recvfrom/3]). @@ -103,9 +103,9 @@ error:Reason -> {error,Reason} end. -protocol2drv(tcp) -> tcp_inet; -protocol2drv(udp) -> udp_inet; -protocol2drv(sctp) -> sctp_inet; +protocol2drv(tcp) -> "tcp_inet"; +protocol2drv(udp) -> "udp_inet"; +protocol2drv(sctp) -> "sctp_inet"; protocol2drv(_) -> erlang:error(eprotonosupport). @@ -357,9 +357,12 @@ %% NOT delegating this task to any back-end. For SCTP, this function MUST NOT %% be called directly -- use "sendmsg" instead: %% -send(S, Data) when is_port(S) -> +send(S, Data, OptList) when is_port(S), is_list(OptList) -> ?DBG_FORMAT("prim_inet:send(~p, ~p)~n", [S,Data]), - try erlang:port_command(S, Data) of + try erlang:port_command(S, Data, OptList) of + false -> % Port busy and nosuspend option passed + ?DBG_FORMAT("prim_inet:send() -> {error,busy}~n", []), + {error,busy}; true -> receive {inet_reply,S,Status} -> @@ -372,6 +375,9 @@ {error,einval} end. +send(S, Data) -> + send(S, Data, []). + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% SENDTO(insock(), IP, Port, Data) -> ok | {error, Reason} diff -Nru erlang-13.b.1-dfsg/erts/preloaded/src/zlib.erl erlang-13.b.3-dfsg/erts/preloaded/src/zlib.erl --- erlang-13.b.1-dfsg/erts/preloaded/src/zlib.erl 2009-03-12 12:17:21.000000000 +0000 +++ erlang-13.b.3-dfsg/erts/preloaded/src/zlib.erl 2009-09-18 15:08:42.000000000 +0100 @@ -132,7 +132,7 @@ %% open a z_stream -spec open() -> zstream(). open() -> - open_port({spawn, zlib_drv}, [binary]). + open_port({spawn, "zlib_drv"}, [binary]). %% close and release z_stream -spec close(zstream()) -> 'ok'. diff -Nru erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/include/erl_test.hrl erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/include/erl_test.hrl --- erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/include/erl_test.hrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/include/erl_test.hrl 2009-09-18 15:07:34.000000000 +0100 @@ -0,0 +1,19 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-record(person, {name, shoe_size}). diff -Nru erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/BAD-MIB.mib erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/BAD-MIB.mib --- erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/BAD-MIB.mib 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/BAD-MIB.mib 1997-05-20 23:16:49.000000000 +0100 @@ -0,0 +1 @@ +All mibs are bad! diff -Nru erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/erl_test_bad.erl erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/erl_test_bad.erl --- erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/erl_test_bad.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/erl_test_bad.erl 2009-09-18 15:07:33.000000000 +0100 @@ -0,0 +1,22 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(erl_test_bad). + +-export([non_existing/1]). diff -Nru erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/erl_test_ok.erl erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/erl_test_ok.erl --- erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/erl_test_ok.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/erl_test_ok.erl 2009-09-18 15:07:33.000000000 +0100 @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(erl_test_ok). +-export([shoe_size/1]). + +-include("erl_test.hrl"). + +shoe_size(#person{shoe_size=Size}) -> + Size. + +foo() -> + ok. diff -Nru erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/GOOD-MIB.mib erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/GOOD-MIB.mib --- erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/GOOD-MIB.mib 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/GOOD-MIB.mib 1997-05-20 23:16:51.000000000 +0100 @@ -0,0 +1,39 @@ + GOOD-MIB DEFINITIONS ::= BEGIN + + IMPORTS + mgmt + FROM RFC1155-SMI + OBJECT-TYPE + FROM RFC-1212; + + + -- textual conventions + + DisplayString ::= + OCTET STRING + + -- This data type is used to model textual information taken + -- from the NVT ASCII character set. By convention, objects + -- with this syntax are declared as having + -- the System group + + -- Implementation of the System group is mandatory for all + -- systems. If an agent is not configured to have a value + -- for any of these variables, a string of length 0 is + -- returned. + + sysDescr OBJECT-TYPE + SYNTAX DisplayString (SIZE (0..255)) + ACCESS read-only + STATUS mandatory + + DESCRIPTION + "A textual description of the entity. This value + should include the full name and version + identification of the system's hardware type, + software operating-system, and networking + software. It is mandatory that this only contain + printable ASCII characters." + ::= { mgmt 1 } + + END diff -Nru erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/start_bad.script erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/start_bad.script --- erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/start_bad.script 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/start_bad.script 1997-05-20 23:16:54.000000000 +0100 @@ -0,0 +1 @@ +script,{"OTP APN 181 01","NT"} diff -Nru erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/start_ok.script erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/start_ok.script --- erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/start_ok.script 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/start_ok.script 1997-05-20 23:16:58.000000000 +0100 @@ -0,0 +1,207 @@ +{script,{"OTP APN 181 01","NT"}, + [{preLoaded,[init,erl_prim_loader]}, + {progress,preloaded}, + {path,["$ROOT/lib/kernel/ebin", + "$ROOT/lib/stdlib/ebin"]}, + {primLoad,[error_handler, + ets, + lib, + lists, + heart, + application_controller, + application_master, + application, + auth, + c, + calendar, + code, + erlang, + erl_distribution, + erl_parse, + erl_scan, + io_lib, + io_lib_format, + io_lib_fread, + io_lib_pretty, + error_logger, + file, + filename, + os, + gen, + gen_event, + gen_server, + global, + kernel, + net_kernel, + proc_lib, + rpc, + supervisor, + sys]}, + {kernel_load_completed}, + {progress,kernel_load_completed}, + {primLoad,[group, + user, + user_drv, + kernel_config, + net, + erl_boot_server, + net_adm]}, + {primLoad,[math, + random, + ordsets, + shell_default, + timer, + gen_fsm, + pg, + unix, + dict, + pool, + string, + digraph, + io, + epp, + queue, + erl_eval, + erl_id_trans, + shell, + erl_internal, + erl_lint, + edlin, + erl_pp, + error_logger_file_h, + error_logger_tty_h, + log_mf_h, + dets, + disk_log, + regexp, + slave, + supervisor_bridge]}, + {progress,modules_loaded}, + {kernelProcess,heart,{heart,start,[]}}, + {kernelProcess,error_logger,{error_logger,start_link,[]}}, + {kernelProcess,application_controller, + {application_controller, + start, + [{application, + kernel, + [{description,"ERTS CXC 138 10"}, + {vsn,"NT"}, + {modules, + [{application,1}, + {erlang,1}, + {group,1}, + {rpc,1}, + {application_controller,1}, + {error_handler,1}, + {heart,1}, + {application_master,1}, + {error_logger,1}, + {init,1}, + {user,1}, + {auth,1}, + {kernel,1}, + {user_drv,1}, + {code,1}, + {kernel_config,1}, + {net,1}, + {erl_boot_server,1}, + {erl_prim_loader,1}, + {file,1}, + {net_adm,1}, + {erl_distribution,1}, + {global,1}, + {net_kernel,1}]}, + {registered, + [init, + erl_prim_loader, + heart, + error_logger, + application_controller, + kernel_sup, + kernel_config, + net_sup, + net_kernel, + auth, + code_server, + file_server, + boot_server, + global_name_server, + rex, + user]}, + {applications,[]}, + {env, + [{error_logger,tty}, + {os, nt}]}, + {maxT,infinity}, + {maxP,infinity}, + {mod,{kernel,[]}}]}]}}, + {progress,init_kernel_started}, + {apply,{application,load, + [{application, + stdlib, + [{description,"ERTS CXC 138 10"}, + {vsn,"NT"}, + {modules, + [{c,1}, + {gen,1}, + {io_lib_format,1}, + {math,1}, + {random,1}, + {sys,1}, + {calendar,1}, + {gen_event,1}, + {io_lib_fread,1}, + {ordsets,1}, + {shell_default,1}, + {timer,1}, + {gen_fsm,1}, + {io_lib_pretty,1}, + {pg,1}, + {slave,1}, + {unix,1}, + {dict,1}, + {gen_server,1}, + {lib,1}, + {pool,1}, + {string,1}, + {digraph,1}, + {io,1}, + {lists,1}, + {proc_lib,1}, + {supervisor,1}, + {epp,1}, + {io_lib,1}, + {log_mf_h,1}, + {queue,1}, + {erl_eval,1}, + {erl_id_trans,1}, + {shell,1}, + {erl_internal,1}, + {erl_lint,1}, + {error_logger_file_h,1}, + {erl_parse,1}, + {error_logger_tty_h,1}, + {edlin,1}, + {erl_pp,1}, + {ets,1}, + {dets,1}, + {disk_log,1}, + {regexp,1}, + {erl_scan,1}, + {supervisor_bridge,1}]}, + {registered, + [timer_server, + rsh_starter, + take_over_monitor, + pool_master, + dets, + disk_log]}, + {applications,[kernel]}, + {env,[]}, + {maxT,infinity}, + {maxP,infinity}]}]}}, + {progress,applications_loaded}, + {apply,{application,start,[kernel,permanent]}}, + {apply,{application,start,[stdlib,permanent]}}, + {apply,{c,erlangrc,[]}}, + {progress,started}]}. diff -Nru erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/yecc_test_bad.yrl erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/yecc_test_bad.yrl --- erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/yecc_test_bad.yrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/yecc_test_bad.yrl 2009-09-18 15:07:33.000000000 +0100 @@ -0,0 +1,32 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +foo + +Nonterminals +form. + +Terminals +atom dot. + +Rootsymbol form. + +form -> atom dot : '$1'. + +Erlang code. diff -Nru erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/yecc_test_ok.yrl erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/yecc_test_ok.yrl --- erlang-13.b.1-dfsg/erts/test/erlc_SUITE_data/src/yecc_test_ok.yrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlc_SUITE_data/src/yecc_test_ok.yrl 2009-09-18 15:07:34.000000000 +0100 @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +Nonterminals +form. + +Terminals +atom dot. + +Rootsymbol form. + +form -> atom dot : '$1'. + +Erlang code. diff -Nru erlang-13.b.1-dfsg/erts/test/erlc_SUITE.erl erlang-13.b.3-dfsg/erts/test/erlc_SUITE.erl --- erlang-13.b.1-dfsg/erts/test/erlc_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlc_SUITE.erl 2009-09-18 15:07:32.000000000 +0100 @@ -0,0 +1,286 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(erlc_SUITE). + +%% Tests the erlc command by compiling various types of files. + +-export([all/1, compile_erl/1, compile_yecc/1, compile_script/1, + compile_mib/1, good_citizen/1, deep_cwd/1]). + +-include("test_server.hrl"). + +all(suite) -> + [compile_erl, compile_yecc, compile_script, compile_mib, + good_citizen, deep_cwd]. + +%% Copy from erlc_SUITE_data/include/erl_test.hrl. + +-record(person, {name, shoe_size}). + +%% Tests that compiling Erlang source code works. + +compile_erl(Config) when is_list(Config) -> + ?line {SrcDir, OutDir, Cmd} = get_cmd(Config), + ?line FileName = filename:join(SrcDir, "erl_test_ok.erl"), + + %% By default, warnings are now turned on. + ?line run(Config, Cmd, FileName, "", + ["Warning: function foo/0 is unused\$", + "_OK_"]), + + %% Test that the compiled file is where it should be, + %% and that it is runnable. + + ?line {module, erl_test_ok} = code:load_abs(filename:join(OutDir, + "erl_test_ok")), + ?line 42 = erl_test_ok:shoe_size(#person{shoe_size=42}), + ?line code:purge(erl_test_ok), + + %% Try disabling warnings. + + ?line run(Config, Cmd, FileName, "-W0", ["_OK_"]), + + %% Check a bad file. + + ?line BadFile = filename:join(SrcDir, "erl_test_bad.erl"), + ?line run(Config, Cmd, BadFile, "", ["function non_existing/1 undefined\$", + "_ERROR_"]), + + ok. + +%% Test that compiling yecc source code works. + +compile_yecc(Config) when is_list(Config) -> + ?line {SrcDir, _, OutDir} = get_dirs(Config), + ?line Cmd = erlc() ++ " -o" ++ OutDir ++ " ", + ?line FileName = filename:join(SrcDir, "yecc_test_ok.yrl"), + ?line run(Config, Cmd, FileName, "-W0", ["_OK_"]), + ?line true = exists(filename:join(OutDir, "yecc_test_ok.erl")), + + ?line BadFile = filename:join(SrcDir, "yecc_test_bad.yrl"), + ?line run(Config, Cmd, BadFile, "-W0", + ["rootsymbol form is not a nonterminal\$", + "undefined nonterminal: form\$", + "Nonterminals is missing\$", + "_ERROR_"]), + ?line exists(filename:join(OutDir, "yecc_test_ok.erl")), + + ok. + +%% Test that compiling start scripts works. + +compile_script(Config) when is_list(Config) -> + ?line {SrcDir, OutDir, Cmd} = get_cmd(Config), + ?line FileName = filename:join(SrcDir, "start_ok.script"), + ?line run(Config, Cmd, FileName, "", ["_OK_"]), + ?line true = exists(filename:join(OutDir, "start_ok.boot")), + + ?line BadFile = filename:join(SrcDir, "start_bad.script"), + ?line run(Config, Cmd, BadFile, "", ["syntax error before:", "_ERROR_"]), + ok. + +%% Test that compiling SNMP mibs works. + +compile_mib(Config) when is_list(Config) -> + ?line {SrcDir, OutDir, Cmd} = get_cmd(Config), + ?line FileName = filename:join(SrcDir, "GOOD-MIB.mib"), + ?line run(Config, Cmd, FileName, "", ["_OK_"]), + ?line Output = filename:join(OutDir, "GOOD-MIB.bin"), + ?line true = exists(Output), + + %% Try -W option. + + ?line ok = file:delete(Output), + ?line run(Config, Cmd, FileName, "-W", + ["_OK_"]), + ?line true = exists(Output), + + %% Try -W option and more verbose. + + ?line ok = file:delete(Output), + ?line case test_server:os_type() of + {unix,_} -> + ?line run(Config, Cmd, FileName, "-W +'{verbosity,info}'", + ["GOOD-MIB.mib: Info. No accessfunction for 'sysDescr'", + "_OK_"]), + ?line true = exists(Output), + ?line ok = file:delete(Output); + _ -> ok %Don't bother -- too much work. + end, + + %% Try a bad file. + + ?line BadFile = filename:join(SrcDir, "BAD-MIB.mib"), + ?line run(Config, Cmd, BadFile, "", + ["Error: syntax error before: mibs\$", "compilation_failed_ERROR_"]), + + %% Make sure that no -I option works. + + ?line NewCmd = erlc() ++ " -o" ++ OutDir ++ " ", + ?line run(Config, NewCmd, FileName, "", ["_OK_"]), + ?line true = exists(Output), + + ok. + +%% Checks that 'erlc' doesn't eat any input (important when called from a +%% shell script with redirected input). +good_citizen(Config) when is_list(Config) -> + case os:type() of + {unix, _} -> + ?line PrivDir = ?config(priv_dir, Config), + ?line Answer = filename:join(PrivDir, "answer"), + ?line Script = filename:join(PrivDir, "test_script"), + ?line Test = filename:join(PrivDir, "test.erl"), + ?line S = ["#! /bin/sh\n", "erlc ", Test, "\n", + "read reply\n", "echo $reply\n"], + ?line ok = file:write_file(Script, S), + ?line ok = file:write_file(Test, "-module(test).\n"), + ?line Cmd = "echo y | sh " ++ Script ++ " > " ++ Answer, + ?line os:cmd(Cmd), + ?line {ok, Answer0} = file:read_file(Answer), + ?line [$y|_] = binary_to_list(Answer0), + ok; + _ -> + {skip, "Unix specific"} + end. + +%% Make sure that compiling an Erlang module deep down in +%% in a directory with more than 255 characters works. +deep_cwd(Config) when is_list(Config) -> + case os:type() of + {unix, _} -> + PrivDir = ?config(priv_dir, Config), + deep_cwd_1(PrivDir); + _ -> + {skip, "Only a problem on Unix"} + end. + +deep_cwd_1(PrivDir) -> + ?line DeepDir0 = filename:join(PrivDir, lists:duplicate(128, $a)), + ?line DeepDir = filename:join(DeepDir0, lists:duplicate(128, $b)), + ?line ok = file:make_dir(DeepDir0), + ?line ok = file:make_dir(DeepDir), + ?line ok = file:set_cwd(DeepDir), + ?line ok = file:write_file("test.erl", "-module(test).\n\n"), + ?line io:format("~s\n", [os:cmd("erlc test.erl")]), + ?line true = filelib:is_file("test.beam"), + ok. + +erlc() -> + case os:find_executable("erlc") of + false -> + test_server:fail("Can't find erlc"); + Erlc -> + Erlc + end. + +%% Runs a command. + +run(Config, Cmd0, Name, Options, Expect) -> + Cmd = Cmd0 ++ " " ++ Options ++ " " ++ Name, + io:format("~s", [Cmd]), + Result = run_command(Config, Cmd), + Messages = split(Result, [], []), + io:format("Result: ~p", [Messages]), + io:format("Expected: ~p", [Expect]), + match_messages(Messages, Expect). + +split([$\n|Rest], Current, Lines) -> + split(Rest, [], [lists:reverse(Current)|Lines]); +split([$\r|Rest], Current, Lines) -> + split(Rest, Current, Lines); +split([Char|Rest], Current, Lines) -> + split(Rest, [Char|Current], Lines); +split([], [], Lines) -> + lists:reverse(Lines); +split([], Current, Lines) -> + split([], [], [lists:reverse(Current)|Lines]). + +match_messages([Msg|Rest1], [Regexp|Rest2]) -> + case re:run(Msg, Regexp, [{capture,none}]) of + match -> + ok; + nomatch -> + io:format("Not matching: ~s\n", [Msg]), + io:format("Regexp : ~s\n", [Regexp]), + test_server:fail(message_mismatch) + end, + match_messages(Rest1, Rest2); +match_messages([], [Expect|Rest]) -> + test_server:fail({too_few_messages, [Expect|Rest]}); +match_messages([Msg|Rest], []) -> + test_server:fail({too_many_messages, [Msg|Rest]}); +match_messages([], []) -> + ok. + +get_cmd(Cfg) -> + ?line {SrcDir, IncDir, OutDir} = get_dirs(Cfg), + ?line Cmd = erlc() ++ " -I" ++ IncDir ++ " -o" ++ OutDir ++ " ", + {SrcDir, OutDir, Cmd}. + +get_dirs(Cfg) -> + ?line DataDir = ?config(data_dir, Cfg), + ?line PrivDir = ?config(priv_dir, Cfg), + ?line SrcDir = filename:join(DataDir, "src"), + ?line IncDir = filename:join(DataDir, "include"), + {SrcDir, IncDir, PrivDir}. + +exists(Name) -> + filelib:is_file(Name). + +%% Runs the command using os:cmd/1. +%% +%% Returns the output from the command (as a list of characters with +%% embedded newlines). The very last line will indicate the +%% exit status of the command, where _OK_ means zero, and _ERROR_ +%% a non-zero exit status. + +run_command(Config, Cmd) -> + TmpDir = filename:join(?config(priv_dir, Config), "tmp"), + file:make_dir(TmpDir), + {RunFile, Run, Script} = run_command(TmpDir, os:type(), Cmd), + ok = file:write_file(filename:join(TmpDir, RunFile), Script), + os:cmd(Run). + +run_command(Dir, {win32, _}, Cmd) -> + BatchFile = filename:join(Dir, "run.bat"), + Run = re:replace(filename:rootname(BatchFile), "/", "\\", + [global,{return,list}]), + {BatchFile, + Run, + ["@echo off\r\n", + "set ERLC_EMULATOR=", atom_to_list(lib:progname()), "\r\n", + Cmd, "\r\n", + "if errorlevel 1 echo _ERROR_\r\n", + "if not errorlevel 1 echo _OK_\r\n"]}; +run_command(Dir, {unix, _}, Cmd) -> + Name = filename:join(Dir, "run"), + {Name, + "/bin/sh " ++ Name, + ["#!/bin/sh\n", + "ERLC_EMULATOR='", atom_to_list(lib:progname()), "'\n", + "export ERLC_EMULATOR\n", + Cmd, "\n", + "case $? in\n", + " 0) echo '_OK_';;\n", + " *) echo '_ERROR_';;\n", + "esac\n"]}; +run_command(_Dir, Other, _Cmd) -> + M = io_lib:format("Don't know how to test exit code for ~p", [Other]), + test_server:fail(lists:flatten(M)). diff -Nru erlang-13.b.1-dfsg/erts/test/erlexec_SUITE_data/erlexec_tests.c erlang-13.b.3-dfsg/erts/test/erlexec_SUITE_data/erlexec_tests.c --- erlang-13.b.1-dfsg/erts/test/erlexec_SUITE_data/erlexec_tests.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlexec_SUITE_data/erlexec_tests.c 2009-03-12 12:17:24.000000000 +0000 @@ -0,0 +1,110 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2008-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ +/* Used by test case otp_7461 to spawn a child process with a given + * command line. Child process group is killed by order received on stdin. + * + * Author: Sverker Eriksson + */ + +#if defined (__WIN32__) || defined(VXWORKS) || defined(_OSE_) +int main() {return 0;} + +#else /* UNIX only */ + +#include +#include +#include +#include +#include +#include +#include + +#define TRY(cmd) if ((cmd) < 0) bail_out(#cmd " failed") + +static void bail_out(const char* msg) +{ + perror(msg); + exit(-1); +} + +static void alarm_handler(int signo) +{ + fprintf(stderr, __FILE__" self terminating after timeout\n"); + exit(1); +} + +int main(int argc, char* argv[]) +{ + pid_t child; + int ret; + char cmd; + int child_exit; + + if (argc < 2) { + fprintf(stderr, "Must specify command to run in background\n"); + exit(-1); + } + TRY(child=fork()); + + if (child == 0) { /* child */ + pid_t gchild; + TRY(setpgid(getpid(), getpid())); /* create process group */ + + TRY(gchild=fork()); + if (gchild == 0) { /* grandchild */ + TRY(execvp(argv[1],&argv[1])); + } + exit(0); + } + /* parent */ + + signal(SIGALRM, alarm_handler); + alarm(10*60); /* suicide in case nothing happens */ + + TRY(wait(&child_exit)); + if (!WIFEXITED(child_exit) || WEXITSTATUS(child_exit)!=0) { + fprintf(stderr, "child did not exit normally (status=%d)\n", child_exit); + exit(-1); + } + + for (;;) + { + TRY(ret=read(STDIN_FILENO, &cmd, 1)); + if (ret == 0) break; /* eof -> exit */ + switch (cmd) + { + case 'K': + ret = kill(-child, SIGINT); /* child process _group_ */ + if (ret < 0 && errno != ESRCH) { + bail_out("kill failed"); + } + write(STDOUT_FILENO, &cmd, 1); /* echo ack */ + break; + case '\n': + break;/* ignore (for interactive testing) */ + default: + fprintf(stderr, "Unknown command '%c'\n", cmd); + exit(-1); + } + } + + return 0; +} + +#endif /* UNIX */ diff -Nru erlang-13.b.1-dfsg/erts/test/erlexec_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/test/erlexec_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/test/erlexec_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlexec_SUITE_data/Makefile.src 2009-03-12 12:17:25.000000000 +0000 @@ -0,0 +1,37 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2008-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +CC = @CC@ +CFLAGS = @ERTS_CFLAGS@ +LIBS = @ERTS_LIBS@ + +ERLX_T_CFLAGS = -Wall $(ERLX_DEFS) $(CFLAGS) @DEFS@ + +GCC = .@DS@gccifier -CC"$(CC)" + +PROGS = erlexec_tests@exe@ + +all: $(PROGS) + +gccifier@exe@: ..@DS@utils@DS@gccifier.c + $(CC) $(CFLAGS) -o gccifier@exe@ ..@DS@utils@DS@gccifier.c $(LIBS) + +erlexec_tests@exe@: gccifier@exe@ erlexec_tests.c + $(GCC) $(ERLX_T_CFLAGS) -o erlexec_tests@exe@ erlexec_tests.c + diff -Nru erlang-13.b.1-dfsg/erts/test/erlexec_SUITE.erl erlang-13.b.3-dfsg/erts/test/erlexec_SUITE.erl --- erlang-13.b.1-dfsg/erts/test/erlexec_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erlexec_SUITE.erl 2009-11-20 13:32:33.000000000 +0000 @@ -0,0 +1,437 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : erlexec_SUITE.erl +%%% Author : Rickard Green +%%% Description : Test erlexec's command line parsing +%%% +%%% Created : 22 May 2007 by Rickard Green +%%%------------------------------------------------------------------- +-module(erlexec_SUITE). + + +%-define(line_trace, 1). + +-define(DEFAULT_TIMEOUT, ?t:minutes(1)). + +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([args_file/1, evil_args_file/1, env/1, args_file_env/1, otp_7461/1, otp_7461_remote/1, otp_8209/1]). + +-include("test_server.hrl"). + + +init_per_testcase(Case, Config) -> + Dog = ?t:timetrap(?DEFAULT_TIMEOUT), + SavedEnv = save_env(), + [{testcase, Case}, {watchdog, Dog}, {erl_flags_env, SavedEnv} |Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + SavedEnv = ?config(erl_flags_env, Config), + restore_env(SavedEnv), + cleanup_nodes(), + ?t:timetrap_cancel(Dog), + ok. + +all(doc) -> []; +all(suite) -> + [args_file, evil_args_file, env, args_file_env, otp_7461, otp_8209]. + + +otp_8209(doc) -> + ["Test that plain first argument does not " + "destroy -home switch [OTP-8209]"]; +otp_8209(suite) -> + []; +otp_8209(Config) when is_list(Config) -> + ?line {ok,[[PName]]} = init:get_argument(progname), + ?line SNameS = "erlexec_test_01", + ?line SName = list_to_atom(SNameS++"@"++ + hd(tl(string:tokens(atom_to_list(node()),"@")))), + ?line Cmd = PName ++ " dummy_param -sname "++SNameS++" -setcookie "++ + atom_to_list(erlang:get_cookie()), + ?line open_port({spawn,Cmd},[]), + ?line pong = loop_ping(SName,40), + ?line {ok,[[_]]} = rpc:call(SName,init,get_argument,[home]), + ?line ["dummy_param"] = rpc:call(SName,init,get_plain_arguments,[]), + ?line ok = cleanup_nodes(), + ok. + +cleanup_nodes() -> + cleanup_node("erlexec_test_01",20). +cleanup_node(SNameS,0) -> + {error, {would_not_die,list_to_atom(SNameS)}}; +cleanup_node(SNameS,N) -> + SName = list_to_atom(SNameS++"@"++ + hd(tl(string:tokens(atom_to_list(node()),"@")))), + case rpc:call(SName,init,stop,[]) of + {badrpc,_} -> + ok; + ok -> + receive after 500 -> ok end, + cleanup_node(SNameS,N-1) + end. + +loop_ping(_,0) -> + pang; +loop_ping(Node,N) -> + case net_adm:ping(Node) of + pang -> + receive + after 500 -> + ok + end, + loop_ping(Node, N-1); + pong -> + pong + end. + +args_file(doc) -> []; +args_file(suite) -> []; +args_file(Config) when is_list(Config) -> + ?line AFN1 = privfile("1", Config), + ?line AFN2 = privfile("2", Config), + ?line AFN3 = privfile("3", Config), + ?line AFN4 = privfile("4", Config), + ?line AFN5 = privfile("5", Config), + ?line AFN6 = privfile("6", Config), + ?line write_file(AFN1, + "-MiscArg2~n" + "# a comment +\\#1000~n" + "+\\#200 # another comment~n" + "~n" + "# another config file to read~n" + " -args_file ~s#acomment~n" + "~n" + "-MiscArg7~n" + "#~n" + "+\\#700~n" + "-extra +XtraArg6~n", + [AFN2]), + ?line write_file(AFN2, + "-MiscArg3~n" + "+\\#300~n" + "-args_file ~s~n" + "-MiscArg5~n" + "+\\#500#anothercomment -MiscArg10~n" + "-args_file ~s~n" + "-args_file ~s~n" + "-args_file ~s~n" + "-extra +XtraArg5~n", + [AFN3, AFN4, AFN5, AFN6]), + ?line write_file(AFN3, + "# comment again~n" + " -MiscArg4 +\\#400 -extra +XtraArg1"), + ?line write_file(AFN4, + " -MiscArg6 +\\#600 -extra +XtraArg2~n" + "+XtraArg3~n" + "+XtraArg4~n" + "# comment again~n"), + ?line write_file(AFN5, ""), + ?line write_file(AFN6, "-extra # +XtraArg10~n"), + ?line CmdLine = "+#100 -MiscArg1 " + ++ "-args_file " ++ AFN1 + ++ " +#800 -MiscArg8 -extra +XtraArg7 +XtraArg8", + ?line {Emu, Misc, Extra} = emu_args(CmdLine), + ?line verify_args(["-#100", "-#200", "-#300", "-#400", + "-#500", "-#600", "-#700", "-#800"], Emu), + ?line verify_args(["-MiscArg1", "-MiscArg2", "-MiscArg3", "-MiscArg4", + "-MiscArg5", "-MiscArg6", "-MiscArg7", "-MiscArg8"], + Misc), + ?line verify_args(["+XtraArg1", "+XtraArg2", "+XtraArg3", "+XtraArg4", + "+XtraArg5", "+XtraArg6", "+XtraArg7", "+XtraArg8"], + Extra), + ?line verify_not_args(["-MiscArg10", "-#1000", "+XtraArg10", + "-MiscArg1", "-MiscArg2", "-MiscArg3", "-MiscArg4", + "-MiscArg5", "-MiscArg6", "-MiscArg7", "-MiscArg8", + "+XtraArg1", "+XtraArg2", "+XtraArg3", "+XtraArg4", + "+XtraArg5", "+XtraArg6", "+XtraArg7", "+XtraArg8"], + Emu), + ?line verify_not_args(["-MiscArg10", "-#1000", "+XtraArg10", + "-#100", "-#200", "-#300", "-#400", + "-#500", "-#600", "-#700", "-#800", + "+XtraArg1", "+XtraArg2", "+XtraArg3", "+XtraArg4", + "+XtraArg5", "+XtraArg6", "+XtraArg7", "+XtraArg8"], + Misc), + ?line verify_not_args(["-MiscArg10", "-#1000", "+XtraArg10", + "-#100", "-#200", "-#300", "-#400", + "-#500", "-#600", "-#700", "-#800", + "-MiscArg1", "-MiscArg2", "-MiscArg3", "-MiscArg4", + "-MiscArg5", "-MiscArg6", "-MiscArg7", "-MiscArg8"], + Extra), + ?line ok. + +evil_args_file(doc) -> []; +evil_args_file(suite) -> []; +evil_args_file(Config) when is_list(Config) -> + ?line Lim = 300, + ?line FNums = lists:seq(1, Lim), + lists:foreach(fun (End) when End == Lim -> + ?line AFN = privfile(integer_to_list(End), Config), + ?line write_file(AFN, + "-MiscArg~p ", + [End]); + (I) -> + ?line AFNX = privfile(integer_to_list(I), Config), + ?line AFNY = privfile(integer_to_list(I+1), Config), + {Frmt, Args} = + case I rem 2 of + 0 -> + {"-MiscArg~p -args_file ~s -MiscArg~p", + [I, AFNY, I]}; + _ -> + {"-MiscArg~p -args_file ~s", + [I, AFNY]} + end, + ?line write_file(AFNX, Frmt, Args) + end, + FNums), + ?line {_Emu, Misc, _Extra} = emu_args("-args_file " + ++ privfile("1", Config)), + ?line ANums = FNums + ++ lists:reverse(lists:filter(fun (I) when I == Lim -> false; + (I) when I rem 2 == 0 -> true; + (_) -> false + end, FNums)), + ?line verify_args(lists:map(fun (I) -> "-MiscArg"++integer_to_list(I) end, + ANums), + Misc), + ?line ok. + + + +env(doc) -> []; +env(suite) -> []; +env(Config) when is_list(Config) -> + ?line os:putenv("ERL_AFLAGS", "-MiscArg1 +#100 -extra +XtraArg1 +XtraArg2"), + ?line CmdLine = "+#200 -MiscArg2 -extra +XtraArg3 +XtraArg4", + ?line os:putenv("ERL_FLAGS", "-MiscArg3 +#300 -extra +XtraArg5"), + ?line os:putenv("ERL_ZFLAGS", "-MiscArg4 +#400 -extra +XtraArg6"), + ?line {Emu, Misc, Extra} = emu_args(CmdLine), + ?line verify_args(["-#100", "-#200", "-#300", "-#400"], Emu), + ?line verify_args(["-MiscArg1", "-MiscArg2", "-MiscArg3", "-MiscArg4"], + Misc), + ?line verify_args(["+XtraArg1", "+XtraArg2", "+XtraArg3", "+XtraArg4", + "+XtraArg5", "+XtraArg6"], + Extra), + ?line ok. + +args_file_env(doc) -> []; +args_file_env(suite) -> []; +args_file_env(Config) when is_list(Config) -> + ?line AFN1 = privfile("1", Config), + ?line AFN2 = privfile("2", Config), + ?line write_file(AFN1, "-MiscArg2 +\\#200 -extra +XtraArg1"), + ?line write_file(AFN2, "-MiscArg3 +\\#400 -extra +XtraArg3"), + ?line os:putenv("ERL_AFLAGS", + "-MiscArg1 +#100 -args_file "++AFN1++ " -extra +XtraArg2"), + ?line CmdLine = "+#300 -args_file "++AFN2++" -MiscArg4 -extra +XtraArg4", + ?line os:putenv("ERL_FLAGS", "-MiscArg5 +#500 -extra +XtraArg5"), + ?line os:putenv("ERL_ZFLAGS", "-MiscArg6 +#600 -extra +XtraArg6"), + ?line {Emu, Misc, Extra} = emu_args(CmdLine), + ?line verify_args(["-#100", "-#200", "-#300", "-#400", + "-#500", "-#600"], Emu), + ?line verify_args(["-MiscArg1", "-MiscArg2", "-MiscArg3", "-MiscArg4", + "-MiscArg5", "-MiscArg6"], + Misc), + ?line verify_args(["+XtraArg1", "+XtraArg2", "+XtraArg3", "+XtraArg4", + "+XtraArg5", "+XtraArg6"], + Extra), + ?line ok. + +%% Make sure "erl -detached" survives when parent process group gets killed +otp_7461(doc) -> []; +otp_7461(suite) -> []; +otp_7461(Config) when is_list(Config) -> + case os:type() of + {unix,_} -> + {NetStarted, _} = net_kernel:start([test_server, shortnames]), + try + net_kernel:monitor_nodes(true), + register(otp_7461, self()), + + otp_7461_do(Config) + after + catch unregister(otp_7461), + catch net_kernel:monitor_nodes(false), + case NetStarted of + ok -> net_kernel:stop(); + _ -> ok + end + end; + _ -> + {skip,"Only on Unix."} + end. + +otp_7461_do(Config) -> + io:format("alive=~p node=~p\n",[is_alive(), node()]), + TestProg = filename:join([?config(data_dir, Config), "erlexec_tests"]), + {ok, [[ErlProg]]} = init:get_argument(progname), + ?line Cmd = TestProg ++ " " ++ ErlProg ++ + " -detached -sname " ++ get_nodename(otp_7461) ++ + " -setcookie " ++ atom_to_list(erlang:get_cookie()) ++ + " -pa " ++ filename:dirname(code:which(?MODULE)) ++ + " -s erlexec_SUITE otp_7461_remote init " ++ atom_to_list(node()), + + %% otp_7461 --------> erlexec_tests.c --------> cerl -detached + %% open_port fork+exec + + io:format("spawn port prog ~p\n",[Cmd]), + ?line Port = open_port({spawn, Cmd}, [eof]), + + io:format("Wait for node to connect...\n",[]), + ?line {nodeup, Slave} = receive Msg -> Msg + after 20*1000 -> timeout end, + io:format("Node alive: ~p\n", [Slave]), + + ?line pong = net_adm:ping(Slave), + io:format("Ping ok towards ~p\n", [Slave]), + + ?line Port ! { self(), {command, "K"}}, % Kill child process group + ?line {Port, {data, "K"}} = receive Msg2 -> Msg2 end, + ?line port_close(Port), + + %% Now the actual test. Detached node should still be alive. + ?line pong = net_adm:ping(Slave), + io:format("Ping still ok towards ~p\n", [Slave]), + + %% Halt node + ?line rpc:cast(Slave, ?MODULE, otp_7461_remote, [[halt, self()]]), + + ?line {nodedown, Slave} = receive Msg3 -> Msg3 + after 20*1000 -> timeout end, + io:format("Node dead: ~p\n", [Slave]), + ok. + + +%% Executed on slave node +otp_7461_remote([init, Master]) -> + io:format("otp_7461_remote(init,~p) at ~p\n",[Master, node()]), + net_kernel:connect_node(Master); +otp_7461_remote([halt, Pid]) -> + io:format("halt order from ~p to node ~p\n",[Pid,node()]), + halt(). + + + +%% +%% Utils +%% + +save_env() -> + {erl_flags, + os:getenv("ERL_AFLAGS"), + os:getenv("ERL_FLAGS"), + os:getenv("ERL_"++erlang:system_info(otp_release)++"_FLAGS"), + os:getenv("ERL_ZFLAGS")}. + +restore_env(EVar, false) when is_list(EVar) -> + restore_env(EVar, ""); +restore_env(EVar, "") when is_list(EVar) -> + case os:getenv(EVar) of + false -> ok; + "" -> ok; + " " -> ok; + _ -> os:putenv(EVar, " ") + end; +restore_env(EVar, Value) when is_list(EVar), is_list(Value) -> + case os:getenv(EVar) of + Value -> ok; + _ -> os:putenv(EVar, Value) + end. + +restore_env({erl_flags, AFlgs, Flgs, RFlgs, ZFlgs}) -> + restore_env("ERL_AFLAGS", AFlgs), + restore_env("ERL_FLAGS", Flgs), + restore_env("ERL_"++erlang:system_info(otp_release)++"_FLAGS", RFlgs), + restore_env("ERL_ZFLAGS", ZFlgs), + ok. + +privfile(Name, Config) -> + filename:join([?config(priv_dir, Config), + atom_to_list(?config(testcase, Config)) ++ "." ++ Name]). + +write_file(FileName, Frmt) -> + write_file(FileName, Frmt, []). + +write_file(FileName, Frmt, Args) -> + {ok, File} = file:open(FileName, [write]), + io:format(File, Frmt, Args), + ok = file:close(File). + +verify_args([], _Ys) -> + ok; +verify_args(Xs, []) -> + exit({args_not_found_in_order, Xs}); +verify_args([X|Xs], [X|Ys]) -> + verify_args(Xs, Ys); +verify_args(Xs, [_Y|Ys]) -> + verify_args(Xs, Ys). + +verify_not_args(Xs, Ys) -> + lists:foreach(fun (X) -> + case lists:member(X, Ys) of + true -> exit({arg_present, X}); + false -> ok + end + end, + Xs). + +emu_args(CmdLineArgs) -> + io:format("CmdLineArgs = ~s~n", [CmdLineArgs]), + {ok,[[Erl]]} = init:get_argument(progname), + EmuCL = os:cmd(Erl ++ " -emu_args_exit " ++ CmdLineArgs), + io:format("EmuCL = ~s", [EmuCL]), + split_emu_clt(string:tokens(EmuCL, [$ ,$\t,$\n,$\r])). + +split_emu_clt(EmuCLT) -> + split_emu_clt(EmuCLT, [], [], [], emu). + +split_emu_clt([], _Emu, _Misc, _Extra, emu) -> + exit(bad_cmd_line); +split_emu_clt([], Emu, Misc, Extra, _Type) -> + {lists:reverse(Emu), lists:reverse(Misc), lists:reverse(Extra)}; + +split_emu_clt(["--"|As], Emu, Misc, Extra, emu) -> + split_emu_clt(As, Emu, Misc, Extra, misc); +split_emu_clt([A|As], Emu, Misc, Extra, emu = Type) -> + split_emu_clt(As, [A|Emu], Misc, Extra, Type); + +split_emu_clt(["-extra"|As], Emu, Misc, Extra, misc) -> + split_emu_clt(As, Emu, Misc, Extra, extra); +split_emu_clt([A|As], Emu, Misc, Extra, misc = Type) -> + split_emu_clt(As, Emu, [A|Misc], Extra, Type); + +split_emu_clt([A|As], Emu, Misc, Extra, extra = Type) -> + split_emu_clt(As, Emu, Misc, [A|Extra], Type). + + +get_nodename(T) -> + {A, B, C} = now(), + atom_to_list(T) + ++ "-" + ++ atom_to_list(?MODULE) + ++ "-" + ++ integer_to_list(A) + ++ "-" + ++ integer_to_list(B) + ++ "-" + ++ integer_to_list(C). diff -Nru erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/character_test.h erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/character_test.h --- erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/character_test.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/character_test.h 2009-03-12 12:17:25.000000000 +0000 @@ -0,0 +1,586 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2005-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* + * This file has been automatically generated. Do NOT edit it; instead, + * run 'erl_print_tests.false character save_expected_result' + */ + +char *character_expected_result[] = { + "a", + "a ", + " a", + "a ", + " a", + "b", + "b ", + " b", + "b ", + " b", + "c", + "c ", + " c", + "c ", + " c", + "d", + "d ", + " d", + "d ", + " d", + "e", + "e ", + " e", + "e ", + " e", + "f", + "f ", + " f", + "f ", + " f", + "g", + "g ", + " g", + "g ", + " g", + "h", + "h ", + " h", + "h ", + " h", + "i", + "i ", + " i", + "i ", + " i", + "j", + "j ", + " j", + "j ", + " j", + "k", + "k ", + " k", + "k ", + " k", + "l", + "l ", + " l", + "l ", + " l", + "m", + "m ", + " m", + "m ", + " m", + "n", + "n ", + " n", + "n ", + " n", + "o", + "o ", + " o", + "o ", + " o", + "p", + "p ", + " p", + "p ", + " p", + "q", + "q ", + " q", + "q ", + " q", + "r", + "r ", + " r", + "r ", + " r", + "s", + "s ", + " s", + "s ", + " s", + "t", + "t ", + " t", + "t ", + " t", + "u", + "u ", + " u", + "u ", + " u", + "v", + "v ", + " v", + "v ", + " v", + "w", + "w ", + " w", + "w ", + " w", + "x", + "x ", + " x", + "x ", + " x", + "y", + "y ", + " y", + "y ", + " y", + "z", + "z ", + " z", + "z ", + " z", + "å", + "å ", + " å", + "å ", + " å", + "ä", + "ä ", + " ä", + "ä ", + " ä", + "ö", + "ö ", + " ö", + "ö ", + " ö", + "A", + "A ", + " A", + "A ", + " A", + "B", + "B ", + " B", + "B ", + " B", + "C", + "C ", + " C", + "C ", + " C", + "D", + "D ", + " D", + "D ", + " D", + "E", + "E ", + " E", + "E ", + " E", + "F", + "F ", + " F", + "F ", + " F", + "G", + "G ", + " G", + "G ", + " G", + "H", + "H ", + " H", + "H ", + " H", + "I", + "I ", + " I", + "I ", + " I", + "J", + "J ", + " J", + "J ", + " J", + "K", + "K ", + " K", + "K ", + " K", + "L", + "L ", + " L", + "L ", + " L", + "M", + "M ", + " M", + "M ", + " M", + "N", + "N ", + " N", + "N ", + " N", + "O", + "O ", + " O", + "O ", + " O", + "P", + "P ", + " P", + "P ", + " P", + "Q", + "Q ", + " Q", + "Q ", + " Q", + "R", + "R ", + " R", + "R ", + " R", + "S", + "S ", + " S", + "S ", + " S", + "T", + "T ", + " T", + "T ", + " T", + "U", + "U ", + " U", + "U ", + " U", + "V", + "V ", + " V", + "V ", + " V", + "X", + "X ", + " X", + "X ", + " X", + "Y", + "Y ", + " Y", + "Y ", + " Y", + "Z", + "Z ", + " Z", + "Z ", + " Z", + "Å", + "Å ", + " Å", + "Å ", + " Å", + "Ä", + "Ä ", + " Ä", + "Ä ", + " Ä", + "Ö", + "Ö ", + " Ö", + "Ö ", + " Ö", + "1", + "1 ", + " 1", + "1 ", + " 1", + "2", + "2 ", + " 2", + "2 ", + " 2", + "3", + "3 ", + " 3", + "3 ", + " 3", + "4", + "4 ", + " 4", + "4 ", + " 4", + "5", + "5 ", + " 5", + "5 ", + " 5", + "6", + "6 ", + " 6", + "6 ", + " 6", + "7", + "7 ", + " 7", + "7 ", + " 7", + "8", + "8 ", + " 8", + "8 ", + " 8", + "9", + "9 ", + " 9", + "9 ", + " 9", + "0", + "0 ", + " 0", + "0 ", + " 0", + "(", + "( ", + " (", + "( ", + " (", + ")", + ") ", + " )", + ") ", + " )", + "[", + "[ ", + " [", + "[ ", + " [", + "]", + "] ", + " ]", + "] ", + " ]", + "{", + "{ ", + " {", + "{ ", + " {", + "}", + "} ", + " }", + "} ", + " }", + "+", + "+ ", + " +", + "+ ", + " +", + "-", + "- ", + " -", + "- ", + " -", + ";", + "; ", + " ;", + "; ", + " ;", + ",", + ", ", + " ,", + ", ", + " ,", + ":", + ": ", + " :", + ": ", + " :", + ".", + ". ", + " .", + ". ", + " .", + "@", + "@ ", + " @", + "@ ", + " @", + "£", + "£ ", + " £", + "£ ", + " £", + "$", + "$ ", + " $", + "$ ", + " $", + "!", + "! ", + " !", + "! ", + " !", + "\"", + "\" ", + " \"", + "\" ", + " \"", + "#", + "# ", + " #", + "# ", + " #", + "¤", + "¤ ", + " ¤", + "¤ ", + " ¤", + "%", + "% ", + " %", + "% ", + " %", + "&", + "& ", + " &", + "& ", + " &", + "/", + "/ ", + " /", + "/ ", + " /", + "\\", + "\\ ", + " \\", + "\\ ", + " \\", + "=", + "= ", + " =", + "= ", + " =", + "?", + "? ", + " ?", + "? ", + " ?", + "'", + "' ", + " '", + "' ", + " '", + "`", + "` ", + " `", + "` ", + " `", + "´", + "´ ", + " ´", + "´ ", + " ´", + "^", + "^ ", + " ^", + "^ ", + " ^", + "~", + "~ ", + " ~", + "~ ", + " ~", + "§", + "§ ", + " §", + "§ ", + " §", + "½", + "½ ", + " ½", + "½ ", + " ½", + "|", + "| ", + " |", + "| ", + " |", + "<", + "< ", + " <", + "< ", + " <", + ">", + "> ", + " >", + "> ", + " >", + "¨", + "¨ ", + " ¨", + "¨ ", + " ¨", + "*", + "* ", + " *", + "* ", + " *", + "_", + "_ ", + " _", + "_ ", + " _", + "\a", + "\a ", + " \a", + "\a ", + " \a", + "\b", + "\b ", + " \b", + "\b ", + " \b", + "\f", + "\f ", + " \f", + "\f ", + " \f", + "\n", + "\n ", + " \n", + "\n ", + " \n", + "\r", + "\r ", + " \r", + "\r ", + " \r", + "\t", + "\t ", + " \t", + "\t ", + " \t", + "\v", + "\v ", + " \v", + "\v ", + " \v", + NULL}; diff -Nru erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/erl_print_tests.c erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/erl_print_tests.c --- erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/erl_print_tests.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/erl_print_tests.c 2009-03-12 12:17:25.000000000 +0000 @@ -0,0 +1,560 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2005-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* + * Description: Test suite for the ethread thread library. + * Author: Rickard Green + */ + +#include +#include +#include +#include +#include +#include +#ifndef __WIN32__ +#include +#endif + +#include "erl_printf.h" +#ifdef THREAD_SAFE +#include "ethread.h" +#endif + +#ifdef __WIN32__ +#undef HAVE_VSNPRINTF +#define HAVE_VSNPRINTF 1 +#define vsnprintf _vsnprintf +#endif + +#ifdef __WIN32__ +#define signed_long_long LONGLONG +#define unsigned_long_long ULONGLONG +#else +#define signed_long_long signed long long +#define unsigned_long_long unsigned long long +#endif + +/* + * Auxiliary functions + */ + +#define PRINT_VA_LIST(FRMT) \ +do { \ + if (FRMT && FRMT != '\0') { \ + va_list args; \ + va_start(args, FRMT); \ + vfprintf(stderr, FRMT, args); \ + va_end(args); \ + } \ +} while (0) + +#define ASSERT(B) \ +do { \ + if (!(B)) \ + fail("%s:%d: Assertion \"%s\" failed!",__FILE__,__LINE__,#B); \ +} while (0) + +static void +print_eol(void) +{ + fprintf(stderr, "\n"); +} + +static void print_line(char *frmt,...) +{ + PRINT_VA_LIST(frmt); + print_eol(); +} + +static void print(char *frmt,...) +{ + PRINT_VA_LIST(frmt); +} + +static void fail(char *frmt,...) +{ + char *abrt_env; + print_eol(); + fprintf(stderr, "EP-TEST-FAILURE"); + PRINT_VA_LIST(frmt); + print_eol(); + abrt_env = getenv("ERL_ABORT_ON_FAILURE"); + if (abrt_env && strcmp("true", abrt_env) == 0) + abort(); + else + exit(1); +} + +static void skip(char *frmt,...) +{ + print_eol(); + fprintf(stderr, "EP-TEST-SKIP"); + PRINT_VA_LIST(frmt); + print_eol(); + exit(0); +} + +static void succeed(char *frmt,...) +{ + print_eol(); + fprintf(stderr, "EP-TEST-SUCCESS"); + PRINT_VA_LIST(frmt); + print_eol(); + exit(0); +} + +#if 0 /* Not used */ + +static void +do_sleep(unsigned secs) +{ +#ifdef __WIN32__ + Sleep((DWORD) secs*1000); +#else + sleep(secs); +#endif +} + +#endif + +static void +send_my_pid(void) +{ +#ifndef __WIN32__ + int pid = (int) getpid(); + fprintf(stderr, "\nEP-TEST-PID%d\n", pid); +#endif +} + +#define BUF_SIZE (1024*1024) + +FILE *outfile = NULL; +char **expected_result; + +#define FENCE_SIZE 512 +static void +print_cmp_test(int n, char *frmt, ...) +{ + int res = -1; + static char clib_buf[BUF_SIZE]; + static unsigned char the_erts_buf[BUF_SIZE]; + char *erts_buf = (char *) &the_erts_buf[FENCE_SIZE]; + va_list args; + + if (outfile) { + char *fp, *tp; + va_start(args, frmt); + if (n < 0) + res = vsprintf(erts_buf, frmt, args); + else { +#ifdef HAVE_VSNPRINTF + res = vsnprintf(erts_buf, (size_t) n, frmt, args); +#else + fail("No vsnprintf()"); +#endif + } + va_end(args); + ASSERT(res >= 0); + fp = erts_buf; + tp = clib_buf; + while (*fp) { + switch (*fp) { + case '\a': *(tp++) = '\\'; *(tp++) = 'a'; break; + case '\b': *(tp++) = '\\'; *(tp++) = 'b'; break; + case '\f': *(tp++) = '\\'; *(tp++) = 'f'; break; + case '\n': *(tp++) = '\\'; *(tp++) = 'n'; break; + case '\r': *(tp++) = '\\'; *(tp++) = 'r'; break; + case '\t': *(tp++) = '\\'; *(tp++) = 't'; break; + case '\v': *(tp++) = '\\'; *(tp++) = 'v'; break; + case '\"': *(tp++) = '\\'; *(tp++) = '\"'; break; + case '\\': *(tp++) = '\\'; *(tp++) = '\\'; break; + default: *(tp++) = *fp; break; + } + fp++; + } + *tp = '\0'; + res = fprintf(outfile, "\t\"%s\",\n", clib_buf); + ASSERT(res >= 0); + } + else { + char *xres; + va_start(args, frmt); + if (n < 0) + res = erts_vsprintf(erts_buf, frmt, args); + else { + int i; + int chk_sz = 2*FENCE_SIZE + n; + for (i = 0; i < chk_sz; i++) + the_erts_buf[i] = 0xeb; + res = erts_vsnprintf(erts_buf, (size_t) n, frmt, args); + for (i = 0; i < chk_sz; i++) + if ((((char *) &the_erts_buf[i]) < erts_buf + || erts_buf + n <= ((char *) &the_erts_buf[i])) + && the_erts_buf[i] != 0xeb) { + int j; + for (j = 0; j < chk_sz; j++) + print(j ? ",%x(%d)" : "%x(%d)", + (unsigned) the_erts_buf[j], j - FENCE_SIZE); + print_eol(); + fail("Garbage written out of bounds (%d,%d)", + i - FENCE_SIZE, n); + } + } + va_end(args); + ASSERT(res >= 0); + + if (expected_result) { + ASSERT(*expected_result); + xres = *expected_result; + expected_result++; + } + else { + va_start(args, frmt); + if (n < 0) + res = vsprintf(clib_buf, frmt, args); + else { +#ifdef HAVE_VSNPRINTF + res = vsnprintf(clib_buf, (size_t) n, frmt, args); +#else + fail("No vsnprintf()"); +#endif + } + va_end(args); + ASSERT(res >= 0); + xres = clib_buf; + } + + if (strcmp(xres, erts_buf) != 0) { + print_line("expected result : \"%s\"", xres); + print_line("erts_buf : \"%s\"", erts_buf); + fail("\"%s\" != \"%s\" (format=\"%s\")", xres, erts_buf, frmt); + } + + print_line("Checked format \"%s\" with result: \"%s\"", frmt, erts_buf); + } +} + +/* + * The test-cases + */ + +#include "integer_64_test.h" +#include "integer_test.h" + +#define INT_SUB_BATCH_TEST(FRMT, TYPE) \ + print_cmp_test(-1, FRMT, ((TYPE) 4711)); \ + print_cmp_test(-1, FRMT, ~((TYPE) 4711)); \ + print_cmp_test(-1, FRMT, (~((TYPE) 0))/2 + (~((TYPE) 0))/4);\ + print_cmp_test(-1, FRMT, ((TYPE) - 1)); \ + print_cmp_test(-1, FRMT, ((TYPE) 1)); \ + print_cmp_test(-1, FRMT, ((TYPE) ((long) 0xabcdef01))); \ + +#define INT_BATCH_TEST(P, X, S) \ + print_line("%s:%d",__FILE__,__LINE__); \ + INT_SUB_BATCH_TEST("%" P "h" X, S char); \ + INT_SUB_BATCH_TEST("%" P "h" X, S short); \ + INT_SUB_BATCH_TEST("%" P X, S int); \ + INT_SUB_BATCH_TEST("%" P "l" X, S long); \ + INT_SUB_BATCH_TEST("%" P "ll" X, S ## _long_long); \ + +static void +integer_test(void) +{ + /* This testcase should be rewritten. It assumes the following + sizes of types... */ + if (sizeof(char) != 1 + || sizeof(short) != 2 + || sizeof(int) != 4 + || sizeof(long) != (sizeof(void *) == 8 ? 8 : 4) + || sizeof(signed_long_long) != 8) + skip("Unexpected size of primitive datatype:" + " sizeof(char) == %d (expected 1);" + " sizeof(short) == %d (expected 2);" + " sizeof(int) == %d (expected 4);" + " sizeof(long) == %d (expected %d);" + " sizeof(signed_long_long) == %d (expected 8)", + sizeof(char), + sizeof(short), + sizeof(int), + sizeof(long), sizeof(void *) == 8 ? 8 : 4, + sizeof(signed_long_long)); + + expected_result = (sizeof(void *) == 8 + ? integer_64_expected_result + : integer_expected_result); + + INT_BATCH_TEST("", "i", signed); + INT_BATCH_TEST("", "d", signed); + INT_BATCH_TEST("", "u", unsigned); + INT_BATCH_TEST("", "o", unsigned); + INT_BATCH_TEST("", "x", unsigned); + INT_BATCH_TEST("", "X", unsigned); + INT_BATCH_TEST("010.5", "i", signed); + INT_BATCH_TEST("010.5", "d", signed); + INT_BATCH_TEST("010.5", "u", unsigned); + INT_BATCH_TEST("010.5", "o", unsigned); + INT_BATCH_TEST("010.5", "x", unsigned); + INT_BATCH_TEST("010.5", "X", unsigned); + INT_BATCH_TEST("-+29", "i", signed); + INT_BATCH_TEST("-+29", "d", signed); + INT_BATCH_TEST("-29", "u", unsigned); + INT_BATCH_TEST("-29", "o", unsigned); + INT_BATCH_TEST("-29", "x", unsigned); + INT_BATCH_TEST("-29", "X", unsigned); + INT_BATCH_TEST("22.8", "i", signed); + INT_BATCH_TEST("22.8", "d", signed); + INT_BATCH_TEST("22.8", "u", unsigned); + INT_BATCH_TEST("22.8", "o", unsigned); + INT_BATCH_TEST("22.8", "x", unsigned); + INT_BATCH_TEST("22.8", "X", unsigned); + INT_BATCH_TEST("-22.8", "i", signed); + INT_BATCH_TEST("-22.8", "d", signed); + INT_BATCH_TEST("-22.8", "u", unsigned); + INT_BATCH_TEST("-22.8", "o", unsigned); + INT_BATCH_TEST("-22.8", "x", unsigned); + INT_BATCH_TEST("-22.8", "X", unsigned); + INT_BATCH_TEST("-823.193", "i", signed); + INT_BATCH_TEST("-823.193", "d", signed); + INT_BATCH_TEST("-823.193", "u", unsigned); + INT_BATCH_TEST("-823.193", "o", unsigned); + INT_BATCH_TEST("-823.193", "x", unsigned); + INT_BATCH_TEST("-823.193", "X", unsigned); + +} + +static void +float_test(void) +{ + expected_result = NULL; + print_cmp_test(-1, "%70.10f", DBL_MAX); + print_cmp_test(-1, "%500.10f", DBL_MAX); + print_cmp_test(-1, "%-500.10f", DBL_MAX); + print_cmp_test(-1, "%500.10e", DBL_MAX); + print_cmp_test(-1, "%-500.10e", DBL_MAX); + print_cmp_test(-1, "%500.10E", DBL_MAX); + print_cmp_test(-1, "%-500.10E", DBL_MAX); + print_cmp_test(-1, "%500.10g", DBL_MAX); + print_cmp_test(-1, "%-500.10g", DBL_MAX); + print_cmp_test(-1, "%500.10G", DBL_MAX); + print_cmp_test(-1, "%-500.10G", DBL_MAX); +} + +char some_characters[] = +"abcdefghijklmnopqrstuvwxyzåäö" +"ABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ" +"1234567890" +"()[]{}+-;,:.@£$!\"#¤%&/\\=?'`´^~§½|<>¨*_" +"\a\b\f\n\r\t\v"; + +#include "string_test.h" + +static void +string_test(void) +{ + expected_result = string_expected_result; + print_cmp_test(-1, "%s", "hej"); + print_cmp_test(-1, "%-10.5s", "hopp"); + print_cmp_test(-1, "%10.5s", "hopp"); + print_cmp_test(-1, "%-500.500s", "hopp"); + print_cmp_test(-1, "%500.500s", "hopp"); + print_cmp_test(-1, "\t%10.4s", some_characters); + print_cmp_test(-1, "\t%500.500s", some_characters); +} + +#include "character_test.h" + +static void +character_test(void) +{ + char *cp; + expected_result = character_expected_result; + for (cp = some_characters; *cp; cp++) { + print_cmp_test(-1, "%c", *cp); + print_cmp_test(-1, "%-10.5c", *cp); + print_cmp_test(-1, "%10.5c", *cp); + print_cmp_test(-1, "%-500.500c", *cp); + print_cmp_test(-1, "%500.500c", *cp); + } +} + +#include "snprintf_test.h" + +static void +snprintf_test(void) +{ + expected_result = snprintf_expected_result; + print_cmp_test(6, "hej hopp"); + print_cmp_test(7, "hej hopp"); + print_cmp_test(8, "hej hopp"); + print_cmp_test(9, "hej hopp"); + print_cmp_test(10, "hej hopp"); + print_cmp_test(6, "hej %d", 4711); + print_cmp_test(7, "hej %d", 4711); + print_cmp_test(8, "hej %d", 4711); + print_cmp_test(9, "hej %d", 4711); + print_cmp_test(10, "hej %d", 4711); + print_cmp_test(sizeof(some_characters)-2, "%s", some_characters); + print_cmp_test(sizeof(some_characters)-1, "%s", some_characters); + print_cmp_test(sizeof(some_characters), "%s", some_characters); + print_cmp_test(sizeof(some_characters)+1, "%s", some_characters); + print_cmp_test(sizeof(some_characters)+2, "%s", some_characters); + print_cmp_test(sizeof(some_characters)/2, "%s%s", + some_characters, some_characters); + print_cmp_test(sizeof(some_characters)*3, "%s%s", + some_characters, some_characters); +} + +static void +quote_test(void) +{ + expected_result = NULL; + print_cmp_test(-1, "\n"); + print_cmp_test(-1, "\\n"); + print_cmp_test(-1, "\r"); + print_cmp_test(-1, "\\r"); + print_cmp_test(-1, "\t"); + print_cmp_test(-1, "\\t"); + print_cmp_test(-1, "\v"); + print_cmp_test(-1, "\\v"); + print_cmp_test(-1, "\b"); + print_cmp_test(-1, "\\b"); + print_cmp_test(-1, "\f"); + print_cmp_test(-1, "\\f"); + print_cmp_test(-1, "\x80"); + print_cmp_test(-1, "\\x80"); + print_cmp_test(-1, "\x14"); + print_cmp_test(-1, "\\x14"); + print_cmp_test(-1, "\xff"); + print_cmp_test(-1, "\\xff"); + print_cmp_test(-1, "\043"); + print_cmp_test(-1, "\\043"); + print_cmp_test(-1, "\053"); + print_cmp_test(-1, "\\053"); + print_cmp_test(-1, "\0143"); + print_cmp_test(-1, "\\0143"); + print_cmp_test(-1, "\\lf"); + print_cmp_test(-1, "\\msss"); + print_cmp_test(-1, "\\ss"); + +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * The dispatcher * +\* */ + +int +main(int argc, char *argv[]) +{ + if (argc < 2) + fail("To few arguments for test case"); + + { + char *testcase; + int save_xres = 0; + int i; + + send_my_pid(); + + testcase = argv[1]; +#ifdef THREAD_SAFE + { + int res = ethr_init(NULL); + if (res != 0) + fail("Failed to initialize the ethread library"); + } +#endif + + for (i = 2; i < argc; i++) { + if (strcmp(argv[i], "save_expected_result") == 0) { + save_xres = 1; + break; + } + } + + if (save_xres) { + char filename[100]; + sprintf(filename, + "%s%s_test.h", + testcase, + sizeof(void *) == 8 ? "_64" : ""); + printf("Saving expected result to %s\n", filename); + outfile = fopen(filename, "w"); + ASSERT(outfile); + fprintf(outfile, + "/*\n" + " * %%CopyrightBegin%%\n" + " * Copyright Ericsson AB 1996-2009. All Rights Reserved.\n" + " * \n" + " * The contents of this file are subject to the Erlang Public License,\n" + " * Version 1.1, (the \"License\"); you may not use this file except in\n" + " * compliance with the License. You should have received a copy of the\n" + " * Erlang Public License along with this software. If not, it can be\n" + " * retrieved online at http://www.erlang.org/.\n" + " * \n" + " * Software distributed under the License is distributed on an \"AS IS\"\n" + " * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See\n" + " * the License for the specific language governing rights and limitations\n" + " * under the License.\n" + " * %%CopyrightEnd%%\n" + " */\n" + "\n"); + fprintf(outfile, + "/* \n" + " * This file has been automatically generated. Do NOT edit it; instead,\n" + " * run '%s %s save_expected_result'%s.\n" + " */\n" + "\n", + argv[0], + testcase, + sizeof(void *) == 8 ? " on a 64-bit machine" : ""); + fprintf(outfile, + "char *%s%s_expected_result[] = {\n", + testcase, + sizeof(void *) == 8 ? "_64" : ""); + } + + if (strcmp("integer", testcase) == 0) + integer_test(); + else if (strcmp("float", testcase) == 0) + float_test(); + else if (strcmp("string", testcase) == 0) + string_test(); + else if (strcmp("character", testcase) == 0) + character_test(); + else if (strcmp("snprintf", testcase) == 0) + snprintf_test(); + else if (strcmp("quote", testcase) == 0) + quote_test(); + else if (!save_xres) + skip("Test case \"%s\" not implemented yet", testcase); + + if (save_xres) { + fprintf(outfile, "\tNULL};\n"); + fclose(outfile); + } + + succeed(NULL); + } + + return 0; +} + + + diff -Nru erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/integer_64_test.h erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/integer_64_test.h --- erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/integer_64_test.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/integer_64_test.h 2009-03-12 12:17:25.000000000 +0000 @@ -0,0 +1,1106 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2005-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* + * This file has been automatically generated. Do NOT edit it; instead, + * run 'erl_print_tests.true integer save_expected_result' on a 64-bit machine. + */ + +char *integer_64_expected_result[] = { + "103", + "-104", + "0", + "-1", + "1", + "1", + "4711", + "-4712", + "0", + "-1", + "1", + "-4351", + "4711", + "-4712", + "0", + "-1", + "1", + "-1412567295", + "4711", + "-4712", + "0", + "-1", + "1", + "2882400001", + "4711", + "-4712", + "0", + "-1", + "1", + "2882400001", + "103", + "-104", + "0", + "-1", + "1", + "1", + "4711", + "-4712", + "0", + "-1", + "1", + "-4351", + "4711", + "-4712", + "0", + "-1", + "1", + "-1412567295", + "4711", + "-4712", + "0", + "-1", + "1", + "2882400001", + "4711", + "-4712", + "0", + "-1", + "1", + "2882400001", + "103", + "65432", + "0", + "255", + "1", + "1", + "4711", + "60824", + "0", + "65535", + "1", + "61185", + "4711", + "4294962584", + "3221225470", + "4294967295", + "1", + "2882400001", + "4711", + "18446744073709546904", + "13835058055282163710", + "18446744073709551615", + "1", + "2882400001", + "4711", + "18446744073709546904", + "13835058055282163710", + "18446744073709551615", + "1", + "2882400001", + "147", + "177630", + "0", + "377", + "1", + "1", + "11147", + "166630", + "0", + "177777", + "1", + "167401", + "11147", + "37777766630", + "27777777776", + "37777777777", + "1", + "25363367401", + "11147", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + "1", + "25363367401", + "11147", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + "1", + "25363367401", + "67", + "ff98", + "0", + "ff", + "1", + "1", + "1267", + "ed98", + "0", + "ffff", + "1", + "ef01", + "1267", + "ffffed98", + "bffffffe", + "ffffffff", + "1", + "abcdef01", + "1267", + "ffffffffffffed98", + "bffffffffffffffe", + "ffffffffffffffff", + "1", + "abcdef01", + "1267", + "ffffffffffffed98", + "bffffffffffffffe", + "ffffffffffffffff", + "1", + "abcdef01", + "67", + "FF98", + "0", + "FF", + "1", + "1", + "1267", + "ED98", + "0", + "FFFF", + "1", + "EF01", + "1267", + "FFFFED98", + "BFFFFFFE", + "FFFFFFFF", + "1", + "ABCDEF01", + "1267", + "FFFFFFFFFFFFED98", + "BFFFFFFFFFFFFFFE", + "FFFFFFFFFFFFFFFF", + "1", + "ABCDEF01", + "1267", + "FFFFFFFFFFFFED98", + "BFFFFFFFFFFFFFFE", + "FFFFFFFFFFFFFFFF", + "1", + "ABCDEF01", + " 00103", + " -00104", + " 00000", + " -00001", + " 00001", + " 00001", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + " -04351", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "-1412567295", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "2882400001", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "2882400001", + " 00103", + " -00104", + " 00000", + " -00001", + " 00001", + " 00001", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + " -04351", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "-1412567295", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "2882400001", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "2882400001", + " 00103", + " 65432", + " 00000", + " 00255", + " 00001", + " 00001", + " 04711", + " 60824", + " 00000", + " 65535", + " 00001", + " 61185", + " 04711", + "4294962584", + "3221225470", + "4294967295", + " 00001", + "2882400001", + " 04711", + "18446744073709546904", + "13835058055282163710", + "18446744073709551615", + " 00001", + "2882400001", + " 04711", + "18446744073709546904", + "13835058055282163710", + "18446744073709551615", + " 00001", + "2882400001", + " 00147", + " 177630", + " 00000", + " 00377", + " 00001", + " 00001", + " 11147", + " 166630", + " 00000", + " 177777", + " 00001", + " 167401", + " 11147", + "37777766630", + "27777777776", + "37777777777", + " 00001", + "25363367401", + " 11147", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + " 00001", + "25363367401", + " 11147", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + " 00001", + "25363367401", + " 00067", + " 0ff98", + " 00000", + " 000ff", + " 00001", + " 00001", + " 01267", + " 0ed98", + " 00000", + " 0ffff", + " 00001", + " 0ef01", + " 01267", + " ffffed98", + " bffffffe", + " ffffffff", + " 00001", + " abcdef01", + " 01267", + "ffffffffffffed98", + "bffffffffffffffe", + "ffffffffffffffff", + " 00001", + " abcdef01", + " 01267", + "ffffffffffffed98", + "bffffffffffffffe", + "ffffffffffffffff", + " 00001", + " abcdef01", + " 00067", + " 0FF98", + " 00000", + " 000FF", + " 00001", + " 00001", + " 01267", + " 0ED98", + " 00000", + " 0FFFF", + " 00001", + " 0EF01", + " 01267", + " FFFFED98", + " BFFFFFFE", + " FFFFFFFF", + " 00001", + " ABCDEF01", + " 01267", + "FFFFFFFFFFFFED98", + "BFFFFFFFFFFFFFFE", + "FFFFFFFFFFFFFFFF", + " 00001", + " ABCDEF01", + " 01267", + "FFFFFFFFFFFFED98", + "BFFFFFFFFFFFFFFE", + "FFFFFFFFFFFFFFFF", + " 00001", + " ABCDEF01", + "+103 ", + "-104 ", + "+0 ", + "-1 ", + "+1 ", + "+1 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-4351 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-1412567295 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "+2882400001 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "+2882400001 ", + "+103 ", + "-104 ", + "+0 ", + "-1 ", + "+1 ", + "+1 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-4351 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-1412567295 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "+2882400001 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "+2882400001 ", + "103 ", + "65432 ", + "0 ", + "255 ", + "1 ", + "1 ", + "4711 ", + "60824 ", + "0 ", + "65535 ", + "1 ", + "61185 ", + "4711 ", + "4294962584 ", + "3221225470 ", + "4294967295 ", + "1 ", + "2882400001 ", + "4711 ", + "18446744073709546904 ", + "13835058055282163710 ", + "18446744073709551615 ", + "1 ", + "2882400001 ", + "4711 ", + "18446744073709546904 ", + "13835058055282163710 ", + "18446744073709551615 ", + "1 ", + "2882400001 ", + "147 ", + "177630 ", + "0 ", + "377 ", + "1 ", + "1 ", + "11147 ", + "166630 ", + "0 ", + "177777 ", + "1 ", + "167401 ", + "11147 ", + "37777766630 ", + "27777777776 ", + "37777777777 ", + "1 ", + "25363367401 ", + "11147 ", + "1777777777777777766630 ", + "1377777777777777777776 ", + "1777777777777777777777 ", + "1 ", + "25363367401 ", + "11147 ", + "1777777777777777766630 ", + "1377777777777777777776 ", + "1777777777777777777777 ", + "1 ", + "25363367401 ", + "67 ", + "ff98 ", + "0 ", + "ff ", + "1 ", + "1 ", + "1267 ", + "ed98 ", + "0 ", + "ffff ", + "1 ", + "ef01 ", + "1267 ", + "ffffed98 ", + "bffffffe ", + "ffffffff ", + "1 ", + "abcdef01 ", + "1267 ", + "ffffffffffffed98 ", + "bffffffffffffffe ", + "ffffffffffffffff ", + "1 ", + "abcdef01 ", + "1267 ", + "ffffffffffffed98 ", + "bffffffffffffffe ", + "ffffffffffffffff ", + "1 ", + "abcdef01 ", + "67 ", + "FF98 ", + "0 ", + "FF ", + "1 ", + "1 ", + "1267 ", + "ED98 ", + "0 ", + "FFFF ", + "1 ", + "EF01 ", + "1267 ", + "FFFFED98 ", + "BFFFFFFE ", + "FFFFFFFF ", + "1 ", + "ABCDEF01 ", + "1267 ", + "FFFFFFFFFFFFED98 ", + "BFFFFFFFFFFFFFFE ", + "FFFFFFFFFFFFFFFF ", + "1 ", + "ABCDEF01 ", + "1267 ", + "FFFFFFFFFFFFED98 ", + "BFFFFFFFFFFFFFFE ", + "FFFFFFFFFFFFFFFF ", + "1 ", + "ABCDEF01 ", + " 00000103", + " -00000104", + " 00000000", + " -00000001", + " 00000001", + " 00000001", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -00004351", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -1412567295", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " 2882400001", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " 2882400001", + " 00000103", + " -00000104", + " 00000000", + " -00000001", + " 00000001", + " 00000001", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -00004351", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -1412567295", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " 2882400001", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " 2882400001", + " 00000103", + " 00065432", + " 00000000", + " 00000255", + " 00000001", + " 00000001", + " 00004711", + " 00060824", + " 00000000", + " 00065535", + " 00000001", + " 00061185", + " 00004711", + " 4294962584", + " 3221225470", + " 4294967295", + " 00000001", + " 2882400001", + " 00004711", + " 18446744073709546904", + " 13835058055282163710", + " 18446744073709551615", + " 00000001", + " 2882400001", + " 00004711", + " 18446744073709546904", + " 13835058055282163710", + " 18446744073709551615", + " 00000001", + " 2882400001", + " 00000147", + " 00177630", + " 00000000", + " 00000377", + " 00000001", + " 00000001", + " 00011147", + " 00166630", + " 00000000", + " 00177777", + " 00000001", + " 00167401", + " 00011147", + " 37777766630", + " 27777777776", + " 37777777777", + " 00000001", + " 25363367401", + " 00011147", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + " 00000001", + " 25363367401", + " 00011147", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + " 00000001", + " 25363367401", + " 00000067", + " 0000ff98", + " 00000000", + " 000000ff", + " 00000001", + " 00000001", + " 00001267", + " 0000ed98", + " 00000000", + " 0000ffff", + " 00000001", + " 0000ef01", + " 00001267", + " ffffed98", + " bffffffe", + " ffffffff", + " 00000001", + " abcdef01", + " 00001267", + " ffffffffffffed98", + " bffffffffffffffe", + " ffffffffffffffff", + " 00000001", + " abcdef01", + " 00001267", + " ffffffffffffed98", + " bffffffffffffffe", + " ffffffffffffffff", + " 00000001", + " abcdef01", + " 00000067", + " 0000FF98", + " 00000000", + " 000000FF", + " 00000001", + " 00000001", + " 00001267", + " 0000ED98", + " 00000000", + " 0000FFFF", + " 00000001", + " 0000EF01", + " 00001267", + " FFFFED98", + " BFFFFFFE", + " FFFFFFFF", + " 00000001", + " ABCDEF01", + " 00001267", + " FFFFFFFFFFFFED98", + " BFFFFFFFFFFFFFFE", + " FFFFFFFFFFFFFFFF", + " 00000001", + " ABCDEF01", + " 00001267", + " FFFFFFFFFFFFED98", + " BFFFFFFFFFFFFFFE", + " FFFFFFFFFFFFFFFF", + " 00000001", + " ABCDEF01", + "00000103 ", + "-00000104 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "00000001 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-00004351 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-1412567295 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "2882400001 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "2882400001 ", + "00000103 ", + "-00000104 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "00000001 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-00004351 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-1412567295 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "2882400001 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "2882400001 ", + "00000103 ", + "00065432 ", + "00000000 ", + "00000255 ", + "00000001 ", + "00000001 ", + "00004711 ", + "00060824 ", + "00000000 ", + "00065535 ", + "00000001 ", + "00061185 ", + "00004711 ", + "4294962584 ", + "3221225470 ", + "4294967295 ", + "00000001 ", + "2882400001 ", + "00004711 ", + "18446744073709546904 ", + "13835058055282163710 ", + "18446744073709551615 ", + "00000001 ", + "2882400001 ", + "00004711 ", + "18446744073709546904 ", + "13835058055282163710 ", + "18446744073709551615 ", + "00000001 ", + "2882400001 ", + "00000147 ", + "00177630 ", + "00000000 ", + "00000377 ", + "00000001 ", + "00000001 ", + "00011147 ", + "00166630 ", + "00000000 ", + "00177777 ", + "00000001 ", + "00167401 ", + "00011147 ", + "37777766630 ", + "27777777776 ", + "37777777777 ", + "00000001 ", + "25363367401 ", + "00011147 ", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + "00000001 ", + "25363367401 ", + "00011147 ", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + "00000001 ", + "25363367401 ", + "00000067 ", + "0000ff98 ", + "00000000 ", + "000000ff ", + "00000001 ", + "00000001 ", + "00001267 ", + "0000ed98 ", + "00000000 ", + "0000ffff ", + "00000001 ", + "0000ef01 ", + "00001267 ", + "ffffed98 ", + "bffffffe ", + "ffffffff ", + "00000001 ", + "abcdef01 ", + "00001267 ", + "ffffffffffffed98 ", + "bffffffffffffffe ", + "ffffffffffffffff ", + "00000001 ", + "abcdef01 ", + "00001267 ", + "ffffffffffffed98 ", + "bffffffffffffffe ", + "ffffffffffffffff ", + "00000001 ", + "abcdef01 ", + "00000067 ", + "0000FF98 ", + "00000000 ", + "000000FF ", + "00000001 ", + "00000001 ", + "00001267 ", + "0000ED98 ", + "00000000 ", + "0000FFFF ", + "00000001 ", + "0000EF01 ", + "00001267 ", + "FFFFED98 ", + "BFFFFFFE ", + "FFFFFFFF ", + "00000001 ", + "ABCDEF01 ", + "00001267 ", + "FFFFFFFFFFFFED98 ", + "BFFFFFFFFFFFFFFE ", + "FFFFFFFFFFFFFFFF ", + "00000001 ", + "ABCDEF01 ", + "00001267 ", + "FFFFFFFFFFFFED98 ", + "BFFFFFFFFFFFFFFE ", + "FFFFFFFFFFFFFFFF ", + "00000001 ", + "ABCDEF01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004351 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001412567295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002882400001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002882400001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004351 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001412567295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002882400001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002882400001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065432 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000255 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060824 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065535 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061185 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004294962584 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003221225470 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004294967295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002882400001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018446744073709546904 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013835058055282163710 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018446744073709551615 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002882400001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018446744073709546904 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013835058055282163710 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018446744073709551615 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002882400001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000147 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000177630 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000377 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011147 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000166630 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000177777 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000167401 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011147 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037777766630 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027777777776 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037777777777 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025363367401 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011147 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001777777777777777766630 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001377777777777777777776 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001777777777777777777777 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025363367401 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011147 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001777777777777777766630 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001377777777777777777776 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001777777777777777777777 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025363367401 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff98 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed98 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffed98 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bffffffe ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abcdef01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffed98 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bffffffffffffffe ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abcdef01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffed98 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bffffffffffffffe ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abcdef01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF98 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ED98 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFF ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EF01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFED98 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFE ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ABCDEF01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFED98 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFE ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ABCDEF01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFED98 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFE ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ABCDEF01 ", + NULL}; diff -Nru erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/integer_test.h erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/integer_test.h --- erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/integer_test.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/integer_test.h 2009-03-12 12:17:25.000000000 +0000 @@ -0,0 +1,1106 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2005-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* + * This file has been automatically generated. Do NOT edit it; instead, + * run 'erl_print_tests.true integer save_expected_result' + */ + +char *integer_expected_result[] = { + "103", + "-104", + "0", + "-1", + "1", + "1", + "4711", + "-4712", + "0", + "-1", + "1", + "-4351", + "4711", + "-4712", + "0", + "-1", + "1", + "-1412567295", + "4711", + "-4712", + "0", + "-1", + "1", + "-1412567295", + "4711", + "-4712", + "0", + "-1", + "1", + "-1412567295", + "103", + "-104", + "0", + "-1", + "1", + "1", + "4711", + "-4712", + "0", + "-1", + "1", + "-4351", + "4711", + "-4712", + "0", + "-1", + "1", + "-1412567295", + "4711", + "-4712", + "0", + "-1", + "1", + "-1412567295", + "4711", + "-4712", + "0", + "-1", + "1", + "-1412567295", + "103", + "65432", + "0", + "255", + "1", + "1", + "4711", + "60824", + "0", + "65535", + "1", + "61185", + "4711", + "4294962584", + "3221225470", + "4294967295", + "1", + "2882400001", + "4711", + "4294962584", + "3221225470", + "4294967295", + "1", + "2882400001", + "4711", + "18446744073709546904", + "13835058055282163710", + "18446744073709551615", + "1", + "18446744072296984321", + "147", + "177630", + "0", + "377", + "1", + "1", + "11147", + "166630", + "0", + "177777", + "1", + "167401", + "11147", + "37777766630", + "27777777776", + "37777777777", + "1", + "25363367401", + "11147", + "37777766630", + "27777777776", + "37777777777", + "1", + "25363367401", + "11147", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + "1", + "1777777777765363367401", + "67", + "ff98", + "0", + "ff", + "1", + "1", + "1267", + "ed98", + "0", + "ffff", + "1", + "ef01", + "1267", + "ffffed98", + "bffffffe", + "ffffffff", + "1", + "abcdef01", + "1267", + "ffffed98", + "bffffffe", + "ffffffff", + "1", + "abcdef01", + "1267", + "ffffffffffffed98", + "bffffffffffffffe", + "ffffffffffffffff", + "1", + "ffffffffabcdef01", + "67", + "FF98", + "0", + "FF", + "1", + "1", + "1267", + "ED98", + "0", + "FFFF", + "1", + "EF01", + "1267", + "FFFFED98", + "BFFFFFFE", + "FFFFFFFF", + "1", + "ABCDEF01", + "1267", + "FFFFED98", + "BFFFFFFE", + "FFFFFFFF", + "1", + "ABCDEF01", + "1267", + "FFFFFFFFFFFFED98", + "BFFFFFFFFFFFFFFE", + "FFFFFFFFFFFFFFFF", + "1", + "FFFFFFFFABCDEF01", + " 00103", + " -00104", + " 00000", + " -00001", + " 00001", + " 00001", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + " -04351", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "-1412567295", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "-1412567295", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "-1412567295", + " 00103", + " -00104", + " 00000", + " -00001", + " 00001", + " 00001", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + " -04351", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "-1412567295", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "-1412567295", + " 04711", + " -04712", + " 00000", + " -00001", + " 00001", + "-1412567295", + " 00103", + " 65432", + " 00000", + " 00255", + " 00001", + " 00001", + " 04711", + " 60824", + " 00000", + " 65535", + " 00001", + " 61185", + " 04711", + "4294962584", + "3221225470", + "4294967295", + " 00001", + "2882400001", + " 04711", + "4294962584", + "3221225470", + "4294967295", + " 00001", + "2882400001", + " 04711", + "18446744073709546904", + "13835058055282163710", + "18446744073709551615", + " 00001", + "18446744072296984321", + " 00147", + " 177630", + " 00000", + " 00377", + " 00001", + " 00001", + " 11147", + " 166630", + " 00000", + " 177777", + " 00001", + " 167401", + " 11147", + "37777766630", + "27777777776", + "37777777777", + " 00001", + "25363367401", + " 11147", + "37777766630", + "27777777776", + "37777777777", + " 00001", + "25363367401", + " 11147", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + " 00001", + "1777777777765363367401", + " 00067", + " 0ff98", + " 00000", + " 000ff", + " 00001", + " 00001", + " 01267", + " 0ed98", + " 00000", + " 0ffff", + " 00001", + " 0ef01", + " 01267", + " ffffed98", + " bffffffe", + " ffffffff", + " 00001", + " abcdef01", + " 01267", + " ffffed98", + " bffffffe", + " ffffffff", + " 00001", + " abcdef01", + " 01267", + "ffffffffffffed98", + "bffffffffffffffe", + "ffffffffffffffff", + " 00001", + "ffffffffabcdef01", + " 00067", + " 0FF98", + " 00000", + " 000FF", + " 00001", + " 00001", + " 01267", + " 0ED98", + " 00000", + " 0FFFF", + " 00001", + " 0EF01", + " 01267", + " FFFFED98", + " BFFFFFFE", + " FFFFFFFF", + " 00001", + " ABCDEF01", + " 01267", + " FFFFED98", + " BFFFFFFE", + " FFFFFFFF", + " 00001", + " ABCDEF01", + " 01267", + "FFFFFFFFFFFFED98", + "BFFFFFFFFFFFFFFE", + "FFFFFFFFFFFFFFFF", + " 00001", + "FFFFFFFFABCDEF01", + "+103 ", + "-104 ", + "+0 ", + "-1 ", + "+1 ", + "+1 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-4351 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-1412567295 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-1412567295 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-1412567295 ", + "+103 ", + "-104 ", + "+0 ", + "-1 ", + "+1 ", + "+1 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-4351 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-1412567295 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-1412567295 ", + "+4711 ", + "-4712 ", + "+0 ", + "-1 ", + "+1 ", + "-1412567295 ", + "103 ", + "65432 ", + "0 ", + "255 ", + "1 ", + "1 ", + "4711 ", + "60824 ", + "0 ", + "65535 ", + "1 ", + "61185 ", + "4711 ", + "4294962584 ", + "3221225470 ", + "4294967295 ", + "1 ", + "2882400001 ", + "4711 ", + "4294962584 ", + "3221225470 ", + "4294967295 ", + "1 ", + "2882400001 ", + "4711 ", + "18446744073709546904 ", + "13835058055282163710 ", + "18446744073709551615 ", + "1 ", + "18446744072296984321 ", + "147 ", + "177630 ", + "0 ", + "377 ", + "1 ", + "1 ", + "11147 ", + "166630 ", + "0 ", + "177777 ", + "1 ", + "167401 ", + "11147 ", + "37777766630 ", + "27777777776 ", + "37777777777 ", + "1 ", + "25363367401 ", + "11147 ", + "37777766630 ", + "27777777776 ", + "37777777777 ", + "1 ", + "25363367401 ", + "11147 ", + "1777777777777777766630 ", + "1377777777777777777776 ", + "1777777777777777777777 ", + "1 ", + "1777777777765363367401 ", + "67 ", + "ff98 ", + "0 ", + "ff ", + "1 ", + "1 ", + "1267 ", + "ed98 ", + "0 ", + "ffff ", + "1 ", + "ef01 ", + "1267 ", + "ffffed98 ", + "bffffffe ", + "ffffffff ", + "1 ", + "abcdef01 ", + "1267 ", + "ffffed98 ", + "bffffffe ", + "ffffffff ", + "1 ", + "abcdef01 ", + "1267 ", + "ffffffffffffed98 ", + "bffffffffffffffe ", + "ffffffffffffffff ", + "1 ", + "ffffffffabcdef01 ", + "67 ", + "FF98 ", + "0 ", + "FF ", + "1 ", + "1 ", + "1267 ", + "ED98 ", + "0 ", + "FFFF ", + "1 ", + "EF01 ", + "1267 ", + "FFFFED98 ", + "BFFFFFFE ", + "FFFFFFFF ", + "1 ", + "ABCDEF01 ", + "1267 ", + "FFFFED98 ", + "BFFFFFFE ", + "FFFFFFFF ", + "1 ", + "ABCDEF01 ", + "1267 ", + "FFFFFFFFFFFFED98 ", + "BFFFFFFFFFFFFFFE ", + "FFFFFFFFFFFFFFFF ", + "1 ", + "FFFFFFFFABCDEF01 ", + " 00000103", + " -00000104", + " 00000000", + " -00000001", + " 00000001", + " 00000001", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -00004351", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -1412567295", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -1412567295", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -1412567295", + " 00000103", + " -00000104", + " 00000000", + " -00000001", + " 00000001", + " 00000001", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -00004351", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -1412567295", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -1412567295", + " 00004711", + " -00004712", + " 00000000", + " -00000001", + " 00000001", + " -1412567295", + " 00000103", + " 00065432", + " 00000000", + " 00000255", + " 00000001", + " 00000001", + " 00004711", + " 00060824", + " 00000000", + " 00065535", + " 00000001", + " 00061185", + " 00004711", + " 4294962584", + " 3221225470", + " 4294967295", + " 00000001", + " 2882400001", + " 00004711", + " 4294962584", + " 3221225470", + " 4294967295", + " 00000001", + " 2882400001", + " 00004711", + " 18446744073709546904", + " 13835058055282163710", + " 18446744073709551615", + " 00000001", + " 18446744072296984321", + " 00000147", + " 00177630", + " 00000000", + " 00000377", + " 00000001", + " 00000001", + " 00011147", + " 00166630", + " 00000000", + " 00177777", + " 00000001", + " 00167401", + " 00011147", + " 37777766630", + " 27777777776", + " 37777777777", + " 00000001", + " 25363367401", + " 00011147", + " 37777766630", + " 27777777776", + " 37777777777", + " 00000001", + " 25363367401", + " 00011147", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + " 00000001", + "1777777777765363367401", + " 00000067", + " 0000ff98", + " 00000000", + " 000000ff", + " 00000001", + " 00000001", + " 00001267", + " 0000ed98", + " 00000000", + " 0000ffff", + " 00000001", + " 0000ef01", + " 00001267", + " ffffed98", + " bffffffe", + " ffffffff", + " 00000001", + " abcdef01", + " 00001267", + " ffffed98", + " bffffffe", + " ffffffff", + " 00000001", + " abcdef01", + " 00001267", + " ffffffffffffed98", + " bffffffffffffffe", + " ffffffffffffffff", + " 00000001", + " ffffffffabcdef01", + " 00000067", + " 0000FF98", + " 00000000", + " 000000FF", + " 00000001", + " 00000001", + " 00001267", + " 0000ED98", + " 00000000", + " 0000FFFF", + " 00000001", + " 0000EF01", + " 00001267", + " FFFFED98", + " BFFFFFFE", + " FFFFFFFF", + " 00000001", + " ABCDEF01", + " 00001267", + " FFFFED98", + " BFFFFFFE", + " FFFFFFFF", + " 00000001", + " ABCDEF01", + " 00001267", + " FFFFFFFFFFFFED98", + " BFFFFFFFFFFFFFFE", + " FFFFFFFFFFFFFFFF", + " 00000001", + " FFFFFFFFABCDEF01", + "00000103 ", + "-00000104 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "00000001 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-00004351 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-1412567295 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-1412567295 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-1412567295 ", + "00000103 ", + "-00000104 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "00000001 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-00004351 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-1412567295 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-1412567295 ", + "00004711 ", + "-00004712 ", + "00000000 ", + "-00000001 ", + "00000001 ", + "-1412567295 ", + "00000103 ", + "00065432 ", + "00000000 ", + "00000255 ", + "00000001 ", + "00000001 ", + "00004711 ", + "00060824 ", + "00000000 ", + "00065535 ", + "00000001 ", + "00061185 ", + "00004711 ", + "4294962584 ", + "3221225470 ", + "4294967295 ", + "00000001 ", + "2882400001 ", + "00004711 ", + "4294962584 ", + "3221225470 ", + "4294967295 ", + "00000001 ", + "2882400001 ", + "00004711 ", + "18446744073709546904 ", + "13835058055282163710 ", + "18446744073709551615 ", + "00000001 ", + "18446744072296984321 ", + "00000147 ", + "00177630 ", + "00000000 ", + "00000377 ", + "00000001 ", + "00000001 ", + "00011147 ", + "00166630 ", + "00000000 ", + "00177777 ", + "00000001 ", + "00167401 ", + "00011147 ", + "37777766630 ", + "27777777776 ", + "37777777777 ", + "00000001 ", + "25363367401 ", + "00011147 ", + "37777766630 ", + "27777777776 ", + "37777777777 ", + "00000001 ", + "25363367401 ", + "00011147 ", + "1777777777777777766630", + "1377777777777777777776", + "1777777777777777777777", + "00000001 ", + "1777777777765363367401", + "00000067 ", + "0000ff98 ", + "00000000 ", + "000000ff ", + "00000001 ", + "00000001 ", + "00001267 ", + "0000ed98 ", + "00000000 ", + "0000ffff ", + "00000001 ", + "0000ef01 ", + "00001267 ", + "ffffed98 ", + "bffffffe ", + "ffffffff ", + "00000001 ", + "abcdef01 ", + "00001267 ", + "ffffed98 ", + "bffffffe ", + "ffffffff ", + "00000001 ", + "abcdef01 ", + "00001267 ", + "ffffffffffffed98 ", + "bffffffffffffffe ", + "ffffffffffffffff ", + "00000001 ", + "ffffffffabcdef01 ", + "00000067 ", + "0000FF98 ", + "00000000 ", + "000000FF ", + "00000001 ", + "00000001 ", + "00001267 ", + "0000ED98 ", + "00000000 ", + "0000FFFF ", + "00000001 ", + "0000EF01 ", + "00001267 ", + "FFFFED98 ", + "BFFFFFFE ", + "FFFFFFFF ", + "00000001 ", + "ABCDEF01 ", + "00001267 ", + "FFFFED98 ", + "BFFFFFFE ", + "FFFFFFFF ", + "00000001 ", + "ABCDEF01 ", + "00001267 ", + "FFFFFFFFFFFFED98 ", + "BFFFFFFFFFFFFFFE ", + "FFFFFFFFFFFFFFFF ", + "00000001 ", + "FFFFFFFFABCDEF01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004351 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001412567295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001412567295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001412567295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004351 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001412567295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001412567295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004712 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "-0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001412567295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065432 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000255 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060824 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065535 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061185 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004294962584 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003221225470 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004294967295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002882400001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004294962584 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003221225470 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004294967295 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002882400001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004711 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018446744073709546904 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013835058055282163710 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018446744073709551615 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018446744072296984321 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000147 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000177630 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000377 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011147 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000166630 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000177777 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000167401 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011147 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037777766630 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027777777776 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037777777777 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025363367401 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011147 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037777766630 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027777777776 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037777777777 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025363367401 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011147 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001777777777777777766630 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001377777777777777777776 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001777777777777777777777 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001777777777765363367401 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff98 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed98 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffed98 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bffffffe ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abcdef01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffed98 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bffffffe ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abcdef01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffed98 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bffffffffffffffe ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffabcdef01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF98 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ED98 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFF ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EF01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFED98 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFE ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ABCDEF01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFED98 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFE ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ABCDEF01 ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001267 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFED98 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFE ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF ", + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ", + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFABCDEF01 ", + NULL}; diff -Nru erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/Makefile.src 2009-03-12 12:17:26.000000000 +0000 @@ -0,0 +1,45 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2005-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +include @erts_lib_include_internal_generated@@DS@ethread.mk + +CC = @CC@ +CFLAGS = @ERTS_CFLAGS@ +LIBS = @ERTS_LIBS@ + +EPTF_CFLAGS = -Wall $(CFLAGS) @DEFS@ -I@erts_lib_include_internal@ -I@erts_lib_include_internal_generated@ +EPTF_LIBS = $(LIBS) -L@erts_lib_internal_path@ -lerts_internal@type_marker@ + +EPTT_CFLAGS = -DTHREAD_SAFE $(ETHR_DEFS) $(EPTF_CFLAGS) +EPTT_LIBS = $(LIBS) -L@erts_lib_internal_path@ -lerts_internal_r@type_marker@ $(ETHR_LIBS) + +GCC = .@DS@gccifier -CC"$(CC)" + +PROGS = erl_print_tests.@emu_threads@@exe@ + +all: $(PROGS) + +gccifier@exe@: ..@DS@utils@DS@gccifier.c + $(CC) $(CFLAGS) -o gccifier@exe@ ..@DS@utils@DS@gccifier.c $(LIBS) + +erl_print_tests.false@exe@: gccifier@exe@ erl_print_tests.c + $(GCC) $(EPTF_CFLAGS) -o erl_print_tests.false@exe@ erl_print_tests.c $(EPTF_LIBS) + +erl_print_tests.true@exe@: gccifier@exe@ erl_print_tests.c + $(GCC) $(EPTT_CFLAGS) -o erl_print_tests.true@exe@ erl_print_tests.c $(EPTT_LIBS) diff -Nru erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/snprintf_test.h erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/snprintf_test.h --- erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/snprintf_test.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/snprintf_test.h 2009-03-12 12:17:26.000000000 +0000 @@ -0,0 +1,43 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2005-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* + * This file has been automatically generated. Do NOT edit it; instead, + * run 'erl_print_tests.false snprintf save_expected_result' + */ + +char *snprintf_expected_result[] = { + "hej h", + "hej ho", + "hej hop", + "hej hopp", + "hej hopp", + "hej 4", + "hej 47", + "hej 471", + "hej 4711", + "hej 4711", + "abcdefghijklmnopqrstuvwxyzåäöABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ1234567890()[]{}+-;,:.@£$!\"#¤%&/\\=?'`´^~§½|<>¨*_\a\b\f\n\r", + "abcdefghijklmnopqrstuvwxyzåäöABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ1234567890()[]{}+-;,:.@£$!\"#¤%&/\\=?'`´^~§½|<>¨*_\a\b\f\n\r\t", + "abcdefghijklmnopqrstuvwxyzåäöABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ1234567890()[]{}+-;,:.@£$!\"#¤%&/\\=?'`´^~§½|<>¨*_\a\b\f\n\r\t\v", + "abcdefghijklmnopqrstuvwxyzåäöABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ1234567890()[]{}+-;,:.@£$!\"#¤%&/\\=?'`´^~§½|<>¨*_\a\b\f\n\r\t\v", + "abcdefghijklmnopqrstuvwxyzåäöABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ1234567890()[]{}+-;,:.@£$!\"#¤%&/\\=?'`´^~§½|<>¨*_\a\b\f\n\r\t\v", + "abcdefghijklmnopqrstuvwxyzåäöABCDEFGHIJKLMNOPQRSTUVXYZÅ", + "abcdefghijklmnopqrstuvwxyzåäöABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ1234567890()[]{}+-;,:.@£$!\"#¤%&/\\=?'`´^~§½|<>¨*_\a\b\f\n\r\t\vabcdefghijklmnopqrstuvwxyzåäöABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ1234567890()[]{}+-;,:.@£$!\"#¤%&/\\=?'`´^~§½|<>¨*_\a\b\f\n\r\t\v", + NULL}; diff -Nru erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/string_test.h erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/string_test.h --- erlang-13.b.1-dfsg/erts/test/erl_print_SUITE_data/string_test.h 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erl_print_SUITE_data/string_test.h 2009-03-12 12:17:26.000000000 +0000 @@ -0,0 +1,33 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2005-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* + * This file has been automatically generated. Do NOT edit it; instead, + * run 'erl_print_tests.false string save_expected_result' + */ + +char *string_expected_result[] = { + "hej", + "hopp ", + " hopp", + "hopp ", + " hopp", + "\t abcd", + "\t abcdefghijklmnopqrstuvwxyzåäöABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ1234567890()[]{}+-;,:.@£$!\"#¤%&/\\=?'`´^~§½|<>¨*_\a\b\f\n\r\t\v", + NULL}; diff -Nru erlang-13.b.1-dfsg/erts/test/erl_print_SUITE.erl erlang-13.b.3-dfsg/erts/test/erl_print_SUITE.erl --- erlang-13.b.1-dfsg/erts/test/erl_print_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/erl_print_SUITE.erl 2009-09-18 15:08:58.000000000 +0100 @@ -0,0 +1,453 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : erl_print_SUITE.erl +%%% Author : Rickard Green +%%% Description : +%%% +%%% Created : 10 Mar 2005 by Rickard Green +%%%------------------------------------------------------------------- +-module(erl_print_SUITE). +-author('rickard.s.green@ericsson.com'). + + +%-define(line_trace, 1). + +-define(DEFAULT_TIMEOUT, ?t:minutes(10)). + +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([erlang_display/1, integer/1, float/1, string/1, character/1, snprintf/1, quote/1]). + +-include("test_server.hrl"). + +all(doc) -> []; +all(suite) -> test_cases(). + +%% +%% +%% Test cases +%% +%% + +test_cases() -> + [erlang_display, + integer, + float, + string, + character, + snprintf, + quote]. + +erlang_display(doc) -> []; +erlang_display(suite) -> []; +erlang_display(Config) when is_list(Config) -> + ?line put(erlang_display_test, ok), + OAIS = erts_debug:set_internal_state(available_internal_state, true), + + %% atoms + ?line chk_display(atom, "atom"), + ?line chk_display(true, "true"), + ?line chk_display(false, "false"), + ?line chk_display('DOWN', "'DOWN'"), + ?line chk_display('EXIT', "'EXIT'"), + ?line chk_display('asdDofw $@{}][', "'asdDofw $@{}]['"), + + %% integers + ?line chk_display(0, "0"), + ?line chk_display(1, "1"), + ?line chk_display(4711, "4711"), + ?line chk_display(((1 bsl 27) - 1), "134217727"), + ?line chk_display((1 bsl 27), "134217728"), + ?line chk_display((1 bsl 32), "4294967296"), + ?line chk_display(11111111111, "11111111111"), + ?line chk_display((1 bsl 59) - 1, "576460752303423487"), + ?line chk_display(1 bsl 59, "576460752303423488"), + ?line chk_display(111111111111111111111, "111111111111111111111"), + ?line chk_display(123456789012345678901234567890, + "123456789012345678901234567890"), + ?line chk_display(1 bsl 10000, str_1_bsl_10000()), + ?line chk_display(-1, "-1"), + ?line chk_display(-4711, "-4711"), + ?line chk_display(-(1 bsl 27), "-134217728"), + ?line chk_display(-((1 bsl 27) + 1), "-134217729"), + ?line chk_display(-(1 bsl 32), "-4294967296"), + ?line chk_display(-11111111111, "-11111111111"), + ?line chk_display(-(1 bsl 59), "-576460752303423488"), + ?line chk_display(-((1 bsl 59) + 1), "-576460752303423489"), + ?line chk_display(-111111111111111111111, "-111111111111111111111"), + ?line chk_display(-123456789012345678901234567890, + "-123456789012345678901234567890"), + ?line chk_display(-(1 bsl 10000), [$- | str_1_bsl_10000()]), + + ?line MyCre = my_cre(), + + %% pids + ?line chk_display(mk_pid_xstr({node(), MyCre}, 4711, 42)), + ?line chk_display(mk_pid_xstr({node(), oth_cre(MyCre)}, 4711, 42)), + ?line chk_display(mk_pid_xstr({node(), oth_cre(oth_cre(MyCre))}, 4711, 42)), + + ?line chk_display(mk_pid_xstr({a@b, MyCre}, 4711, 42)), + ?line chk_display(mk_pid_xstr({a@b, oth_cre(MyCre)}, 4711, 42)), + ?line chk_display(mk_pid_xstr({a@b, oth_cre(oth_cre(MyCre))}, 4711, 42)), + + %% ports + ?line chk_display(mk_port_xstr({node(), MyCre}, 4711)), + ?line chk_display(mk_port_xstr({node(), oth_cre(MyCre)}, 4711)), + ?line chk_display(mk_port_xstr({node(), oth_cre(oth_cre(MyCre))}, 4711)), + + ?line chk_display(mk_port_xstr({c@d, MyCre}, 4711)), + ?line chk_display(mk_port_xstr({c@d, oth_cre(MyCre)}, 4711)), + ?line chk_display(mk_port_xstr({c@d, oth_cre(oth_cre(MyCre))}, 4711)), + + %% refs + ?line chk_display(mk_ref_xstr({node(), MyCre}, [1,2,3])), + ?line chk_display(mk_ref_xstr({node(), oth_cre(MyCre)}, [1,2,3])), + ?line chk_display(mk_ref_xstr({node(), oth_cre(oth_cre(MyCre))}, [1,2,3])), + + ?line chk_display(mk_ref_xstr({e@f, MyCre},[1,2,3] )), + ?line chk_display(mk_ref_xstr({e@f, oth_cre(MyCre)}, [1,2,3])), + ?line chk_display(mk_ref_xstr({e@f, oth_cre(oth_cre(MyCre))}, [1,2,3])), + + %% Compund terms + ?line {Pid, PidStr} = mk_pid_xstr({x@y, oth_cre(MyCre)}, 4712, 41), + ?line {Port, PortStr} = mk_port_xstr({x@y, oth_cre(MyCre)}, 4712), + ?line {Ref, RefStr} = mk_ref_xstr({e@f, oth_cre(MyCre)}, [11,12,13]), + + ?line chk_display({atom,-4711,Ref,{"hej",[Pid,222222222222222222222222,Port,4711]}}, + "{atom,-4711,"++RefStr++",{\"hej\",["++PidStr++",222222222222222222222222,"++PortStr++",4711]}}"), + ?line chk_display({{{{{{{{{{{{{{{{{{{{{{{hi}}}}}}}}}}}}}}}}}}}}}}}, + "{{{{{{{{{{{{{{{{{{{{{{{hi}}}}}}}}}}}}}}}}}}}}}}}"), + ?line chk_display([[[[[[[[[[[[[[[[[[[[[[[yo]]]]]]]]]]]]]]]]]]]]]]], + "[[[[[[[[[[[[[[[[[[[[[[[yo]]]]]]]]]]]]]]]]]]]]]]]"), + ?line chk_display({[{[{[{[{[{[{[{[{[{[{[{[ii]}]}]}]}]}]}]}]}]}]}]}]}, + "{[{[{[{[{[{[{[{[{[{[{[{[ii]}]}]}]}]}]}]}]}]}]}]}]}"), + ?line chk_display([], "[]"), % Not really a compound term :) + ?line chk_display([a|b], "[a|b]"), + ?line chk_display([a,b,c|z], "[a,b,c|z]"), + ?line chk_display([a,b,c], "[a,b,c]"), + ?line chk_display([Pid,Port,Ref], + "["++PidStr++","++PortStr++","++RefStr++"]"), + ?line chk_display("abcdefghijklmnopqrstuvwxyz", + "\"abcdefghijklmnopqrstuvwxyz\""), + ?line chk_display("ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\""), + ?line chk_display("H E J", "\"H E J\""), + ?line chk_display("asdDofw $@{}][", "\"asdDofw $@{}][\""), + + %% + %% TODO: Check binaries, fun and floats... + %% + + erts_debug:set_internal_state(available_internal_state, OAIS), + ?line ok = get(erlang_display_test). + +get_chnl_no(NodeName) when is_atom(NodeName) -> + erts_debug:get_internal_state({channel_number, NodeName}). + +chk_display(Term, Expect) when is_list(Expect) -> + Dstr = erts_debug:display(Term), + case Expect ++ io_lib:nl() of + Dstr -> + ?t:format("Test of \"~p\" succeeded.~n" + " Expected and got: ~s~n", + [Term, io_lib:write_string(Dstr)]); + DoExpect -> + ?t:format("***~n" + "*** Test of \"~p\" failed!~n" + "*** Expected: ~s~n" + "*** Got: ~s~n" + "***~n", + [Term, + io_lib:write_string(DoExpect), + io_lib:write_string(Dstr)]), + put(erlang_display_test, failed) + end. + +chk_display({Term, Expect}) -> + chk_display(Term, Expect). + +mk_pid_xstr({NodeName, Creation}, Number, Serial) -> + Pid = mk_pid({NodeName, Creation}, Number, Serial), + XStr = "<" ++ integer_to_list(get_chnl_no(NodeName)) + ++ "." ++ integer_to_list(Number) + ++ "." ++ integer_to_list(Serial) ++ ">", + {Pid, XStr}. + +mk_port_xstr({NodeName, Creation}, Number) -> + Port = mk_port({NodeName, Creation}, Number), + XStr = "#Port<" ++ integer_to_list(get_chnl_no(NodeName)) + ++ "." ++ integer_to_list(Number) ++ ">", + {Port, XStr}. + +mk_ref_xstr({NodeName, Creation}, Numbers) -> + Ref = mk_ref({NodeName, Creation}, Numbers), + XStr = "#Ref<" ++ integer_to_list(get_chnl_no(NodeName)) + ++ ref_numbers_xstr(Numbers) ++ ">", + {Ref, XStr}. + +ref_numbers_xstr([]) -> + []; +ref_numbers_xstr([N | Ns]) -> + ref_numbers_xstr(Ns) ++ "." ++ integer_to_list(N). + +-define(TESTCASE_IMPL(T), T(A) -> default_testcase_impl(A)). + +?TESTCASE_IMPL(integer). +?TESTCASE_IMPL(float). +?TESTCASE_IMPL(string). +?TESTCASE_IMPL(character). +?TESTCASE_IMPL(snprintf). +?TESTCASE_IMPL(quote). + +%% +%% +%% Auxiliary functions +%% +%% + +default_testcase_impl(doc) -> []; +default_testcase_impl(suite) -> []; +default_testcase_impl(Config) when is_list(Config) -> ?line run_case(Config). + +init_per_testcase(Case, Config) -> + Dog = ?t:timetrap(?DEFAULT_TIMEOUT), + [{testcase, Case}, {watchdog, Dog} |Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +-define(TESTPROG, "erl_print_tests"). +-define(FAILED_MARKER, $E,$P,$-,$T,$E,$S,$T,$-,$F,$A,$I,$L,$U,$R,$E). +-define(SKIPPED_MARKER, $E,$P,$-,$T,$E,$S,$T,$-,$S,$K,$I,$P). +-define(SUCCESS_MARKER, $E,$P,$-,$T,$E,$S,$T,$-,$S,$U,$C,$C,$E,$S,$S). +-define(PID_MARKER, $E,$P,$-,$T,$E,$S,$T,$-,$P,$I,$D). + +port_prog_killer(EProc, OSProc) when is_pid(EProc), is_list(OSProc) -> + ?line process_flag(trap_exit, true), + ?line Ref = erlang:monitor(process, EProc), + ?line receive + {'DOWN', Ref, _, _, Reason} when is_tuple(Reason), + element(1, Reason) + == timetrap_timeout -> + ?line Cmd = "kill -9 " ++ OSProc, + ?line ?t:format("Test case timed out. " + "Trying to kill port program.~n" + " Executing: ~p~n", [Cmd]), + ?line case os:cmd(Cmd) of + [] -> + ok; + OsCmdRes -> + ?line ?t:format(" ~s", [OsCmdRes]) + end; + {'DOWN', Ref, _, _, _} -> + %% OSProc is assumed to have terminated by itself + ?line ok + end. + +get_line(_Port, eol, Data) -> + ?line Data; +get_line(Port, noeol, Data) -> + ?line receive + {Port, {data, {Flag, NextData}}} -> + ?line get_line(Port, Flag, Data ++ NextData); + {Port, eof} -> + ?line ?t:fail(port_prog_unexpectedly_closed) + end. + +read_case_data(Port, TestCase) -> + ?line receive + {Port, {data, {eol, [?SUCCESS_MARKER]}}} -> + ?line ok; + {Port, {data, {Flag, [?SUCCESS_MARKER | CommentStart]}}} -> + ?line {comment, get_line(Port, Flag, CommentStart)}; + {Port, {data, {Flag, [?SKIPPED_MARKER | CommentStart]}}} -> + ?line {skipped, get_line(Port, Flag, CommentStart)}; + {Port, {data, {Flag, [?FAILED_MARKER | ReasonStart]}}} -> + ?line ?t:fail(get_line(Port, Flag, ReasonStart)); + {Port, {data, {eol, [?PID_MARKER | PidStr]}}} -> + ?line ?t:format("Port program pid: ~s~n", [PidStr]), + ?line CaseProc = self(), + ?line list_to_integer(PidStr), % Sanity check + spawn_opt(fun () -> + port_prog_killer(CaseProc, PidStr) + end, + [{priority, max}, link]), + read_case_data(Port, TestCase); + {Port, {data, {Flag, LineStart}}} -> + ?line ?t:format("~s~n", [get_line(Port, Flag, LineStart)]), + read_case_data(Port, TestCase); + {Port, eof} -> + ?line ?t:fail(port_prog_unexpectedly_closed) + end. + +run_case(Config) -> + run_case(Config, ""). + +run_case(Config, TestArgs) -> + run_case(Config, TestArgs, fun (_Port) -> ok end). + +run_case(Config, TestArgs, Fun) -> + Test = atom_to_list(?config(testcase, Config)), + TestProg = filename:join([?config(data_dir, Config), + ?TESTPROG + ++ "." + ++ atom_to_list(erlang:system_info(threads))]), + Cmd = TestProg ++ " " ++ Test ++ " " ++ TestArgs, + case catch open_port({spawn, Cmd}, [stream, + use_stdio, + stderr_to_stdout, + eof, + {line, 1024}]) of + Port when is_port(Port) -> + ?line Fun(Port), + ?line CaseResult = read_case_data(Port, Test), + ?line receive + {Port, eof} -> + ?line ok + end, + ?line CaseResult; + Error -> + ?line ?t:fail({open_port_failed, Error}) + end. + + +-define(VERSION_MAGIC, 131). + +-define(ATOM_EXT, 100). +-define(REFERENCE_EXT, 101). +-define(PORT_EXT, 102). +-define(PID_EXT, 103). +-define(NEW_REFERENCE_EXT, 114). + +uint32_be(Uint) when is_integer(Uint), 0 =< Uint, Uint < 1 bsl 32 -> + [(Uint bsr 24) band 16#ff, + (Uint bsr 16) band 16#ff, + (Uint bsr 8) band 16#ff, + Uint band 16#ff]; +uint32_be(Uint) -> + exit({badarg, uint32_be, [Uint]}). + + +uint16_be(Uint) when is_integer(Uint), 0 =< Uint, Uint < 1 bsl 16 -> + [(Uint bsr 8) band 16#ff, + Uint band 16#ff]; +uint16_be(Uint) -> + exit({badarg, uint16_be, [Uint]}). + +uint8(Uint) when is_integer(Uint), 0 =< Uint, Uint < 1 bsl 8 -> + Uint band 16#ff; +uint8(Uint) -> + exit({badarg, uint8, [Uint]}). + + + +mk_pid({NodeName, Creation}, Number, Serial) when is_atom(NodeName) -> + mk_pid({atom_to_list(NodeName), Creation}, Number, Serial); +mk_pid({NodeName, Creation}, Number, Serial) -> + case catch binary_to_term(list_to_binary([?VERSION_MAGIC, + ?PID_EXT, + ?ATOM_EXT, + uint16_be(length(NodeName)), + NodeName, + uint32_be(Number), + uint32_be(Serial), + uint8(Creation)])) of + Pid when is_pid(Pid) -> + Pid; + {'EXIT', {badarg, _}} -> + exit({badarg, mk_pid, [{NodeName, Creation}, Number, Serial]}); + Other -> + exit({unexpected_binary_to_term_result, Other}) + end. + +mk_port({NodeName, Creation}, Number) when is_atom(NodeName) -> + mk_port({atom_to_list(NodeName), Creation}, Number); +mk_port({NodeName, Creation}, Number) -> + case catch binary_to_term(list_to_binary([?VERSION_MAGIC, + ?PORT_EXT, + ?ATOM_EXT, + uint16_be(length(NodeName)), + NodeName, + uint32_be(Number), + uint8(Creation)])) of + Port when is_port(Port) -> + Port; + {'EXIT', {badarg, _}} -> + exit({badarg, mk_port, [{NodeName, Creation}, Number]}); + Other -> + exit({unexpected_binary_to_term_result, Other}) + end. + +mk_ref({NodeName, Creation}, Numbers) when is_atom(NodeName), + is_integer(Creation), + is_list(Numbers) -> + mk_ref({atom_to_list(NodeName), Creation}, Numbers); +mk_ref({NodeName, Creation}, [Number]) when is_list(NodeName), + is_integer(Creation), + is_integer(Number) -> + case catch binary_to_term(list_to_binary([?VERSION_MAGIC, + ?REFERENCE_EXT, + ?ATOM_EXT, + uint16_be(length(NodeName)), + NodeName, + uint32_be(Number), + uint8(Creation)])) of + Ref when is_reference(Ref) -> + Ref; + {'EXIT', {badarg, _}} -> + exit({badarg, mk_ref, [{NodeName, Creation}, [Number]]}); + Other -> + exit({unexpected_binary_to_term_result, Other}) + end; +mk_ref({NodeName, Creation}, Numbers) when is_list(NodeName), + is_integer(Creation), + is_list(Numbers) -> + case catch binary_to_term(list_to_binary([?VERSION_MAGIC, + ?NEW_REFERENCE_EXT, + uint16_be(length(Numbers)), + ?ATOM_EXT, + uint16_be(length(NodeName)), + NodeName, + uint8(Creation), + lists:map(fun (N) -> + uint32_be(N) + end, + Numbers)])) of + Ref when is_reference(Ref) -> + Ref; + {'EXIT', {badarg, _}} -> + exit({badarg, mk_ref, [{NodeName, Creation}, Numbers]}); + Other -> + exit({unexpected_binary_to_term_result, Other}) + end. + +my_cre() -> erlang:system_info(creation). + +oth_cre(0) -> 1; +oth_cre(1) -> 2; +oth_cre(2) -> 3; +oth_cre(3) -> 1; +oth_cre(N) -> exit({invalid_creation, N}). + +str_1_bsl_10000() -> + "19950631168807583848837421626835850838234968318861924548520089498529438830221946631919961684036194597899331129423209124271556491349413781117593785932096323957855730046793794526765246551266059895520550086918193311542508608460618104685509074866089624888090489894838009253941633257850621568309473902556912388065225096643874441046759871626985453222868538161694315775629640762836880760732228535091641476183956381458969463899410840960536267821064621427333394036525565649530603142680234969400335934316651459297773279665775606172582031407994198179607378245683762280037302885487251900834464581454650557929601414833921615734588139257095379769119277800826957735674444123062018757836325502728323789270710373802866393031428133241401624195671690574061419654342324638801248856147305207431992259611796250130992860241708340807605932320161268492288496255841312844061536738951487114256315111089745514203313820202931640957596464756010405845841566072044962867016515061920631004186422275908670900574606417856951911456055068251250406007519842261898059237118054444788072906395242548339221982707404473162376760846613033778706039803413197133493654622700563169937455508241780972810983291314403571877524768509857276937926433221599399876886660808368837838027643282775172273657572744784112294389733810861607423253291974813120197604178281965697475898164531258434135959862784130128185406283476649088690521047580882615823961985770122407044330583075869039319604603404973156583208672105913300903752823415539745394397715257455290510212310947321610753474825740775273986348298498340756937955646638621874569499279016572103701364433135817214311791398222983845847334440270964182851005072927748364550578634501100852987812389473928699540834346158807043959118985815145779177143619698728131459483783202081474982171858011389071228250905826817436220577475921417653715687725614904582904992461028630081535583308130101987675856234343538955409175623400844887526162643568648833519463720377293240094456246923254350400678027273837755376406726898636241037491410966718557050759098100246789880178271925953381282421954028302759408448955014676668389697996886241636313376393903373455801407636741877711055384225739499110186468219696581651485130494222369947714763069155468217682876200362777257723781365331611196811280792669481887201298643660768551639860534602297871557517947385246369446923087894265948217008051120322365496288169035739121368338393591756418733850510970271613915439590991598154654417336311656936031122249937969999226781732358023111862644575299135758175008199839236284615249881088960232244362173771618086357015468484058622329792853875623486556440536962622018963571028812361567512543338303270029097668650568557157505516727518899194129711337690149916181315171544007728650573189557450920330185304847113818315407324053319038462084036421763703911550639789000742853672196280903477974533320468368795868580237952218629120080742819551317948157624448298518461509704888027274721574688131594750409732115080498190455803416826949787141316063210686391511681774304792596709376". diff -Nru erlang-13.b.1-dfsg/erts/test/ethread_SUITE_data/ethread_tests.c erlang-13.b.3-dfsg/erts/test/ethread_SUITE_data/ethread_tests.c --- erlang-13.b.1-dfsg/erts/test/ethread_SUITE_data/ethread_tests.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/ethread_SUITE_data/ethread_tests.c 2009-03-12 12:17:26.000000000 +0000 @@ -0,0 +1,2403 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2004-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +/* + * Description: Test suite for the ethread thread library. + * Author: Rickard Green + */ + +#define ETHR_NO_SUPP_THR_LIB_NOT_FATAL +#include "ethread.h" +#include "erl_misc_utils.h" + +#include +#include +#include +#ifndef __WIN32__ +#include +#endif +#include + +/* + * Auxiliary functions + */ + +#define PRINT_VA_LIST(FRMT) \ +do { \ + if (FRMT && FRMT != '\0') { \ + va_list args; \ + va_start(args, FRMT); \ + vfprintf(stderr, FRMT, args); \ + va_end(args); \ + } \ +} while (0) + +#define ASSERT(B) \ +do { \ + if (!(B)) \ + fail("%s:%d: Assertion \"%s\" failed!",__FILE__,__LINE__,#B); \ +} while (0) + + +#define ASSERT_PRINT(B, PRNT) \ +do { \ + if (!(B)) { \ + print PRNT; \ + fail("%s:%d: Assertion \"%s\" failed!",__FILE__,__LINE__,#B); \ + } \ +} while (0) + +#define ASSERT_EQ(VAR, VAL, FSTR) \ +do { \ + if ((VAR) != (VAL)) { \ + print("%s=" FSTR "\n", #VAR, (VAR)); \ + fail("%s:%d: Assertion \"%s == " FSTR "\" failed!", \ + __FILE__, __LINE__, #VAR, (VAL)); \ + } \ +} while (0) + +#ifdef __WIN32_ +#define EOL "\r\n" +#else +#define EOL "\n" +#endif + +static void +print_eol(void) +{ + fprintf(stderr, EOL); +} + +static void print_line(char *frmt,...) +{ + PRINT_VA_LIST(frmt); + print_eol(); +} + +static void print(char *frmt,...) +{ + PRINT_VA_LIST(frmt); +} + +static void fail(char *frmt,...) +{ + char *abrt_env; + print_eol(); + fprintf(stderr, "ETHR-TEST-FAILURE"); + PRINT_VA_LIST(frmt); + print_eol(); + abrt_env = getenv("ERL_ABORT_ON_FAILURE"); + if (abrt_env && strcmp("true", abrt_env) == 0) + abort(); + else + exit(1); +} + +static void skip(char *frmt,...) +{ + print_eol(); + fprintf(stderr, "ETHR-TEST-SKIP"); + PRINT_VA_LIST(frmt); + print_eol(); + exit(0); +} + +static void succeed(char *frmt,...) +{ + print_eol(); + fprintf(stderr, "ETHR-TEST-SUCCESS"); + PRINT_VA_LIST(frmt); + print_eol(); + exit(0); +} + +static void +do_sleep(unsigned secs) +{ + while (erts_milli_sleep(secs*1000) != 0); +} + +#define WAIT_UNTIL_INTERVAL 10 + +#define WAIT_UNTIL_LIM(TEST, LIM) \ +do { \ + int ms__ = (LIM)*1000; \ + while (!(TEST)) { \ + while (erts_milli_sleep(WAIT_UNTIL_INTERVAL) != 0); \ + ms__ -= WAIT_UNTIL_INTERVAL; \ + if (ms__ <= 0) \ + break; \ + } \ +} while (0) + +static void +send_my_pid(void) +{ +#ifndef __WIN32__ + int pid = (int) getpid(); + fprintf(stderr, EOL "ETHR-TEST-PID%d" EOL, pid); +#endif +} + +/* + * The test-cases + */ + +#ifndef ETHR_NO_THREAD_LIB + +/* + * The create join thread test case. + * + * Tests ethr_thr_create and ethr_thr_join. + */ + +#define CJTT_NO_THREADS 64 +ethr_tid cjtt_tids[CJTT_NO_THREADS + 1]; +int cjtt_ix[CJTT_NO_THREADS + 1]; +int cjtt_res[CJTT_NO_THREADS + 1]; +void *cjtt_thread(void *vpix) +{ + int ix = *((int *) vpix); + cjtt_res[ix] = ix; + return (void *) &cjtt_res[ix]; +} + +static void +create_join_thread_test(void) +{ + int i, res; + + for (i = 1; i <= CJTT_NO_THREADS; i++) { + cjtt_ix[i] = i; + cjtt_res[i] = 0; + } + + for (i = 1; i <= CJTT_NO_THREADS; i++) { + res = ethr_thr_create(&cjtt_tids[i], + cjtt_thread, + (void *) &cjtt_ix[i], + NULL); + ASSERT(res == 0); + } + + for (i = 1; i <= CJTT_NO_THREADS; i++) { + int *tres; + res = ethr_thr_join(cjtt_tids[i], (void **) &tres); + ASSERT(res == 0); + ASSERT(tres == &cjtt_res[i]); + ASSERT(cjtt_res[i] == i); + } + +} + + +/* + * The eq tid test case. + * + * Tests ethr_equal_tids. + */ + +#define ETT_THREADS 100000 + +static ethr_tid ett_tids[3]; +static ethr_mutex ett_mutex = ETHR_MUTEX_INITER; +static ethr_cond ett_cond = ETHR_COND_INITER; +static int ett_terminate; + +static void * +ett_thread(void *my_tid) +{ + + ASSERT(!ethr_equal_tids(ethr_self(), ett_tids[0])); + ASSERT(ethr_equal_tids(ethr_self(), *((ethr_tid *) my_tid))); + + return NULL; +} + +static void * +ett_thread2(void *unused) +{ + int res; + res = ethr_mutex_lock(&ett_mutex); + ASSERT(res == 0); + while (!ett_terminate) { + res = ethr_cond_wait(&ett_cond, &ett_mutex); + ASSERT(res == 0); + } + res = ethr_mutex_unlock(&ett_mutex); + ASSERT(res == 0); + return NULL; +} + +static void +equal_tids_test(void) +{ + int res, i; + + ett_tids[0] = ethr_self(); + + res = ethr_thr_create(&ett_tids[1], ett_thread, (void *) &ett_tids[1], NULL); + ASSERT(res == 0); + + ASSERT(ethr_equal_tids(ethr_self(), ett_tids[0])); + ASSERT(!ethr_equal_tids(ethr_self(), ett_tids[1])); + + res = ethr_thr_join(ett_tids[1], NULL); + + res = ethr_thr_create(&ett_tids[2], ett_thread, (void *) &ett_tids[2], NULL); + ASSERT(res == 0); + + ASSERT(ethr_equal_tids(ethr_self(), ett_tids[0])); + ASSERT(!ethr_equal_tids(ethr_self(), ett_tids[1])); + ASSERT(!ethr_equal_tids(ethr_self(), ett_tids[2])); + +#if 0 + /* This fails on some linux platforms. Until we decides if a tid + * is allowed to be reused right away or not, we disable the test. + */ + + ASSERT(!ethr_equal_tids(ett_tids[1], ett_tids[2])); +#endif + + res = ethr_thr_join(ett_tids[2], NULL); + ASSERT(res == 0); + + /* Second part of test */ + + ett_terminate = 0; + + res = ethr_thr_create(&ett_tids[1], ett_thread2, NULL, NULL); + ASSERT(res == 0); + + ASSERT(!ethr_equal_tids(ett_tids[0], ett_tids[1])); + + for (i = 0; i < ETT_THREADS; i++) { + res = ethr_thr_create(&ett_tids[2], ett_thread, (void*)&ett_tids[2], NULL); + ASSERT(res == 0); + + ASSERT(!ethr_equal_tids(ett_tids[0], ett_tids[2])); + ASSERT(!ethr_equal_tids(ett_tids[1], ett_tids[2])); + + res = ethr_thr_join(ett_tids[2], NULL); + ASSERT(res == 0); + } + + res = ethr_mutex_lock(&ett_mutex); + ASSERT(res == 0); + ett_terminate = 1; + res = ethr_cond_signal(&ett_cond); + ASSERT(res == 0); + res = ethr_mutex_unlock(&ett_mutex); + ASSERT(res == 0); + res = ethr_thr_join(ett_tids[1], NULL); + ASSERT(res == 0); + + res = ethr_cond_destroy(&ett_cond); + ASSERT(res == 0); + res = ethr_mutex_destroy(&ett_mutex); + ASSERT(res == 0); + +} + +/* + * The mutex test case. + * + * Tests mutexes. + */ + +static ethr_mutex mt_mutex = ETHR_MUTEX_INITER; +static int mt_data; + +void * +mt_thread(void *unused) +{ + int res; + + print_line("Aux thread tries to lock mutex"); + res = ethr_mutex_lock(&mt_mutex); + ASSERT(res == 0); + print_line("Aux thread locked mutex"); + + ASSERT(mt_data == 0); + + mt_data = 1; + print_line("Aux thread wrote"); + + print_line("Aux thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Aux thread woke up"); + + ASSERT(mt_data == 1); + + res = ethr_mutex_unlock(&mt_mutex); + ASSERT(res == 0); + print_line("Aux thread unlocked mutex"); + + return NULL; +} + + +static void +mutex_test(void) +{ + int do_restart = 1; + int res; + ethr_tid tid; + + print_line("Running test with statically initialized mutex"); + + restart: + mt_data = 0; + + print_line("Main thread tries to lock mutex"); + res = ethr_mutex_lock(&mt_mutex); + ASSERT(res == 0); + print_line("Main thread locked mutex"); + + ASSERT(mt_data == 0); + + print_line("Main thread about to create aux thread"); + res = ethr_thr_create(&tid, mt_thread, NULL, NULL); + ASSERT(res == 0); + print_line("Main thread created aux thread"); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(mt_data == 0); + + res = ethr_mutex_unlock(&mt_mutex); + ASSERT(res == 0); + print_line("Main thread unlocked mutex"); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + print_line("Main thread tries to lock mutex"); + res = ethr_mutex_lock(&mt_mutex); + ASSERT(res == 0); + print_line("Main thread locked mutex"); + + ASSERT(mt_data == 1); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(mt_data == 1); + + res = ethr_mutex_unlock(&mt_mutex); + ASSERT(res == 0); + print_line("Main thread unlocked mutex"); + + res = ethr_thr_join(tid, NULL); + ASSERT(res == 0); + print_line("Main thread joined aux thread"); + + res = ethr_mutex_destroy(&mt_mutex); + ASSERT(res == 0); + print_line("Main thread destroyed mutex"); + + if (do_restart) { + do_restart = 0; + + print_line("Running test with dynamically initialized mutex"); + + print_line("Trying to initialize mutex"); + res = ethr_mutex_init(&mt_mutex); + ASSERT(res == 0); + print_line("Initialized mutex"); + + goto restart; + + } + +} + +/* + * The try lock mutex test case. + * + * Tests try lock mutex operation. + */ + +static ethr_mutex tlmt_mtx1 = ETHR_MUTEX_INITER; +static ethr_mutex tlmt_mtx2 = ETHR_MUTEX_INITER; +static ethr_cond tlmt_cnd2 = ETHR_COND_INITER; + +static int tlmt_mtx1_locked; +static int tlmt_mtx1_do_unlock; + +static void * +tlmt_thread(void *unused) +{ + int res; + + res = ethr_mutex_lock(&tlmt_mtx1); + ASSERT(res == 0); + res = ethr_mutex_lock(&tlmt_mtx2); + ASSERT(res == 0); + + tlmt_mtx1_locked = 1; + res = ethr_cond_signal(&tlmt_cnd2); + ASSERT(res == 0); + + while (!tlmt_mtx1_do_unlock) { + res = ethr_cond_wait(&tlmt_cnd2, &tlmt_mtx2); + ASSERT(res == 0 || res == EINTR); + } + + res = ethr_mutex_unlock(&tlmt_mtx2); + ASSERT(res == 0); + res = ethr_mutex_unlock(&tlmt_mtx1); + ASSERT(res == 0); + + res = ethr_mutex_lock(&tlmt_mtx2); + ASSERT(res == 0); + tlmt_mtx1_locked = 0; + res = ethr_cond_signal(&tlmt_cnd2); + ASSERT(res == 0); + res = ethr_mutex_unlock(&tlmt_mtx2); + ASSERT(res == 0); + + return NULL; +} + +static void +try_lock_mutex_test(void) +{ + int i, res; + ethr_tid tid; + + tlmt_mtx1_locked = 0; + tlmt_mtx1_do_unlock = 0; + + res = ethr_thr_create(&tid, tlmt_thread, NULL, NULL); + ASSERT(res == 0); + + res = ethr_mutex_lock(&tlmt_mtx2); + ASSERT(res == 0); + + while (!tlmt_mtx1_locked) { + res = ethr_cond_wait(&tlmt_cnd2, &tlmt_mtx2); + ASSERT(res == 0 || res == EINTR); + } + + res = ethr_mutex_unlock(&tlmt_mtx2); + ASSERT(res == 0); + + for (i = 0; i < 10; i++) { + res = ethr_mutex_trylock(&tlmt_mtx1); + ASSERT(res == EBUSY); + } + + res = ethr_mutex_lock(&tlmt_mtx2); + ASSERT(res == 0); + + tlmt_mtx1_do_unlock = 1; + res = ethr_cond_signal(&tlmt_cnd2); + ASSERT(res == 0); + + while (tlmt_mtx1_locked) { + res = ethr_cond_wait(&tlmt_cnd2, &tlmt_mtx2); + ASSERT(res == 0 || res == EINTR); + } + + res = ethr_mutex_unlock(&tlmt_mtx2); + ASSERT(res == 0); + + res = ethr_mutex_trylock(&tlmt_mtx1); + ASSERT(res == 0); + + res = ethr_mutex_unlock(&tlmt_mtx1); + ASSERT(res == 0); + + res = ethr_thr_join(tid, NULL); + ASSERT(res == 0); + + res = ethr_mutex_destroy(&tlmt_mtx1); + ASSERT(res == 0); + res = ethr_mutex_destroy(&tlmt_mtx2); + ASSERT(res == 0); + res = ethr_cond_destroy(&tlmt_cnd2); + ASSERT(res == 0); +} + +/* + * The recursive mutex test case. + * + * Tests recursive mutexes. + */ + +#ifdef ETHR_HAVE_ETHR_REC_MUTEX_INIT + +static ethr_mutex rmt_mutex +#ifdef ETHR_REC_MUTEX_INITER + = ETHR_REC_MUTEX_INITER +#endif + ; +static int rmt_data; + +void * +rmt_thread(void *unused) +{ + int res; + + print_line("Aux thread tries to lock mutex"); + res = ethr_mutex_lock(&rmt_mutex); + ASSERT(res == 0); + print_line("Aux thread locked mutex"); + + ASSERT(rmt_data == 0); + + rmt_data = 1; + print_line("Aux thread wrote"); + + print_line("Aux thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Aux thread woke up"); + + ASSERT(rmt_data == 1); + + res = ethr_mutex_unlock(&rmt_mutex); + ASSERT(res == 0); + print_line("Aux thread unlocked mutex"); + + return NULL; +} + +#endif + +static void +recursive_mutex_test(void) +{ +#ifdef ETHR_HAVE_ETHR_REC_MUTEX_INIT + int do_restart = 1; + int res; + ethr_tid tid; + +#ifdef ETHR_REC_MUTEX_INITER + print_line("Running test with statically initialized mutex"); +#else + goto dynamic_init; +#endif + + restart: + rmt_data = 0; + + print_line("Main thread tries to lock mutex"); + res = ethr_mutex_lock(&rmt_mutex); + ASSERT(res == 0); + print_line("Main thread locked mutex"); + + print_line("Main thread tries to lock mutex again"); + res = ethr_mutex_lock(&rmt_mutex); + ASSERT(res == 0); + print_line("Main thread locked mutex again"); + + ASSERT(rmt_data == 0); + + print_line("Main thread about to create aux thread"); + res = ethr_thr_create(&tid, rmt_thread, NULL, NULL); + ASSERT(res == 0); + print_line("Main thread created aux thread"); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(rmt_data == 0); + + res = ethr_mutex_unlock(&rmt_mutex); + ASSERT(res == 0); + print_line("Main thread unlocked mutex"); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(rmt_data == 0); + + res = ethr_mutex_unlock(&rmt_mutex); + ASSERT(res == 0); + print_line("Main thread unlocked mutex again"); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + print_line("Main thread tries to lock mutex"); + res = ethr_mutex_lock(&rmt_mutex); + ASSERT(res == 0); + print_line("Main thread locked mutex"); + + ASSERT(rmt_data == 1); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(rmt_data == 1); + + res = ethr_mutex_unlock(&rmt_mutex); + ASSERT(res == 0); + print_line("Main thread unlocked mutex"); + + res = ethr_thr_join(tid, NULL); + ASSERT(res == 0); + print_line("Main thread joined aux thread"); + + res = ethr_mutex_destroy(&rmt_mutex); + ASSERT(res == 0); + print_line("Main thread destroyed mutex"); + + if (do_restart) { +#ifndef ETHR_REC_MUTEX_INITER + dynamic_init: +#endif + do_restart = 0; + + print_line("Running test with dynamically initialized mutex"); + + print_line("Trying to initialize mutex"); + res = ethr_rec_mutex_init(&rmt_mutex); + ASSERT(res == 0); + print_line("Initialized mutex"); + + goto restart; + } + +#ifndef ETHR_REC_MUTEX_INITER + succeed("Static initializer for recursive mutexes not supported"); +#endif + +#else /* #ifdef ETHR_HAVE_ETHR_REC_MUTEX_INIT */ + skip("Recursive mutexes not supported"); +#endif /* #ifdef ETHR_HAVE_ETHR_REC_MUTEX_INIT */ +} + +/* + * The time now test. + * + * Tests ethr_time_now by comparing time values with Erlang. + */ +#define TNT_MAX_TIME_DIFF 200000 +#define TNT_MAX_TIME_VALUES 52 + +static void +time_now_test(void) +{ + int scanf_res, time_now_res, i, no_values, max_abs_diff; + static ethr_timeval tv[TNT_MAX_TIME_VALUES]; + static int ms[TNT_MAX_TIME_VALUES]; + + i = 0; + do { + ASSERT(i < TNT_MAX_TIME_VALUES); + scanf_res = scanf("%d", &ms[i]); + time_now_res = ethr_time_now(&tv[i]); + ASSERT(scanf_res == 1); + ASSERT(time_now_res == 0); +#if 0 + print_line("Got %d; %ld:%ld", ms[i], tv[i].tv_sec, tv[i].tv_nsec); +#endif + i++; + } while (ms[i-1] >= 0); + + no_values = i-1; + + ASSERT(ms[0] == 0); + + print_line("TNT_MAX_TIME_DIFF = %d (us)", TNT_MAX_TIME_DIFF); + + max_abs_diff = 0; + + for (i = 1; i < no_values; i++) { + long diff; + long tn_us; + long e_us; + + tn_us = (tv[i].tv_sec - tv[0].tv_sec) * 1000000; + tn_us += (tv[i].tv_nsec - tv[0].tv_nsec)/1000; + + e_us = ms[i]*1000; + + diff = e_us - tn_us; + + print_line("Erlang time = %ld us; ethr_time_now = %ld us; diff %ld us", + e_us, tn_us, diff); + + if (max_abs_diff < abs((int) diff)) { + max_abs_diff = abs((int) diff); + } + + ASSERT(e_us - TNT_MAX_TIME_DIFF <= tn_us); + ASSERT(tn_us <= e_us + TNT_MAX_TIME_DIFF); + } + + print_line("Max absolute diff = %d us", max_abs_diff); + succeed("Max absolute diff = %d us", max_abs_diff); +} + +/* + * The cond wait test case. + * + * Tests ethr_cond_wait with ethr_cond_signal and ethr_cond_broadcast. + */ + + +static ethr_mutex cwt_mutex = ETHR_MUTEX_INITER; +static ethr_cond cwt_cond = ETHR_COND_INITER; +static int cwt_counter; + +void * +cwt_thread(void *is_timedwait_test_ptr) +{ + int use_timedwait = *((int *) is_timedwait_test_ptr); + int res; + + res = ethr_mutex_lock(&cwt_mutex); + ASSERT(res == 0); + + if (use_timedwait) { + ethr_timeval tv; + res = ethr_time_now(&tv); + ASSERT(res == 0); + tv.tv_sec += 3600; /* Make sure we won't time out */ + + do { + res = ethr_cond_timedwait(&cwt_cond, &cwt_mutex, &tv); + } while (res == EINTR); + ASSERT(res == 0); + } + else { + do { + res = ethr_cond_wait(&cwt_cond, &cwt_mutex); + } while (res == EINTR); + ASSERT(res == 0); + } + + cwt_counter++; + + res = ethr_mutex_unlock(&cwt_mutex); + ASSERT(res == 0); + + return NULL; +} + +static void +cond_wait_test(int is_timedwait_test) +{ + int do_restart = !is_timedwait_test; + ethr_tid tid1, tid2; + int res; + + if (!is_timedwait_test) + print_line("Running test with statically initialized mutex and cond"); + + restart: + /* Wake with signal */ + + cwt_counter = 0; + + res = ethr_thr_create(&tid1, cwt_thread, (void *) &is_timedwait_test, NULL); + ASSERT(res == 0); + res = ethr_thr_create(&tid2, cwt_thread, (void *) &is_timedwait_test, NULL); + ASSERT(res == 0); + + do_sleep(1); /* Make sure threads waits on cond var */ + + res = ethr_mutex_lock(&cwt_mutex); + ASSERT(res == 0); + + res = ethr_cond_signal(&cwt_cond); /* Wake one thread */ + ASSERT(res == 0); + + do_sleep(1); /* Make sure awakened thread waits on mutex */ + + ASSERT(cwt_counter == 0); + + res = ethr_mutex_unlock(&cwt_mutex); + ASSERT(res == 0); + + do_sleep(1); /* Let awakened thread proceed */ + + res = ethr_mutex_lock(&cwt_mutex); + ASSERT(res == 0); + + ASSERT(cwt_counter == 1); + + res = ethr_cond_signal(&cwt_cond); /* Wake the other thread */ + ASSERT(res == 0); + + do_sleep(1); /* Make sure awakened thread waits on mutex */ + + ASSERT(cwt_counter == 1); + + res = ethr_mutex_unlock(&cwt_mutex); + ASSERT(res == 0); + + do_sleep(1); /* Let awakened thread proceed */ + + res = ethr_mutex_lock(&cwt_mutex); + ASSERT(res == 0); + + ASSERT(cwt_counter == 2); + + res = ethr_mutex_unlock(&cwt_mutex); + ASSERT(res == 0); + + res = ethr_thr_join(tid1, NULL); + ASSERT(res == 0); + + res = ethr_thr_join(tid2, NULL); + ASSERT(res == 0); + + + /* Wake with broadcast */ + + cwt_counter = 0; + + res = ethr_thr_create(&tid1, cwt_thread, (void *) &is_timedwait_test, NULL); + ASSERT(res == 0); + res = ethr_thr_create(&tid2, cwt_thread, (void *) &is_timedwait_test, NULL); + ASSERT(res == 0); + + do_sleep(1); /* Make sure threads waits on cond var */ + + res = ethr_mutex_lock(&cwt_mutex); + ASSERT(res == 0); + + res = ethr_cond_broadcast(&cwt_cond); /* Wake the threads */ + ASSERT(res == 0); + + do_sleep(1); /* Make sure awakened threads wait on mutex */ + + ASSERT(cwt_counter == 0); + + res = ethr_mutex_unlock(&cwt_mutex); + ASSERT(res == 0); + + do_sleep(1); /* Let awakened threads proceed */ + + res = ethr_mutex_lock(&cwt_mutex); + ASSERT(res == 0); + + ASSERT(cwt_counter == 2); + + res = ethr_mutex_unlock(&cwt_mutex); + ASSERT(res == 0); + + res = ethr_thr_join(tid1, NULL); + ASSERT(res == 0); + + res = ethr_thr_join(tid2, NULL); + ASSERT(res == 0); + + res = ethr_mutex_destroy(&cwt_mutex); + ASSERT(res == 0); + res = ethr_cond_destroy(&cwt_cond); + ASSERT(res == 0); + + if (do_restart) { + do_restart = 0; + res = ethr_mutex_init(&cwt_mutex); + ASSERT(res == 0); + res = ethr_cond_init(&cwt_cond); + ASSERT(res == 0); + print_line("Running test with dynamically initialized mutex and cond"); + goto restart; + } +} + +/* + * The cond timedwait test case. + * + * Tests ethr_cond_timedwait with ethr_cond_signal and ethr_cond_broadcast. + */ + +#define CTWT_MAX_TIME_DIFF 100000 + +static long +ctwt_check_timeout(long to) +{ + int res; + ethr_timeval tva, tvb; + long diff, abs_diff; + + res = ethr_time_now(&tva); + ASSERT(res == 0); + + tva.tv_sec += to / 1000; + tva.tv_nsec += (to % 1000) * 1000000; + if (tva.tv_nsec >= 1000000000) { + tva.tv_sec++; + tva.tv_nsec -= 1000000000; + ASSERT(tva.tv_nsec < 1000000000); + } + + do { + res = ethr_cond_timedwait(&cwt_cond, &cwt_mutex, &tva); + } while (res == EINTR); + ASSERT(res == ETIMEDOUT); + + res = ethr_time_now(&tvb); + ASSERT(res == 0); + + diff = (tvb.tv_sec - tva.tv_sec) * 1000000; + diff += (tvb.tv_nsec - tva.tv_nsec)/1000; + + print("Timeout=%ld; ", to); + print("tva.tv_sec=%ld tva.tv_nsec=%ld; ", tva.tv_sec, tva.tv_nsec); + print("tvb.tv_sec=%ld tvb.tv_nsec=%ld; ", tvb.tv_sec, tvb.tv_nsec); + print_line("diff (tvb - tva) = %ld us", diff); + + abs_diff = (long) abs((int) diff); + + ASSERT(CTWT_MAX_TIME_DIFF >= abs_diff); + return abs_diff; +} + +static void +cond_timedwait_test(void) +{ + int do_restart = 1; + long abs_diff, max_abs_diff = 0; + int res; + +#define CTWT_UPD_MAX_DIFF if (abs_diff > max_abs_diff) max_abs_diff = abs_diff; + + print_line("Running test with statically initialized mutex and cond"); + + print_line("CTWT_MAX_TIME_DIFF=%d", CTWT_MAX_TIME_DIFF); + + restart: + + res = ethr_mutex_lock(&cwt_mutex); + ASSERT(res == 0); + + abs_diff = ctwt_check_timeout(300); + CTWT_UPD_MAX_DIFF; + abs_diff = ctwt_check_timeout(700); + CTWT_UPD_MAX_DIFF; + abs_diff = ctwt_check_timeout(1000); + CTWT_UPD_MAX_DIFF; + abs_diff = ctwt_check_timeout(2300); + CTWT_UPD_MAX_DIFF; + abs_diff = ctwt_check_timeout(5100); + CTWT_UPD_MAX_DIFF; + + res = ethr_mutex_unlock(&cwt_mutex); + ASSERT(res == 0); + + cond_wait_test(1); + + if (do_restart) { + do_restart = 0; + res = ethr_mutex_init(&cwt_mutex); + ASSERT(res == 0); + res = ethr_cond_init(&cwt_cond); + ASSERT(res == 0); + print_line("Running test with dynamically initialized mutex and cond"); + goto restart; + } + + print_line("Max absolute diff = %d us", max_abs_diff); + succeed("Max absolute diff = %d us", max_abs_diff); + +#undef CTWT_UPD_MAX_DIFF +} + +/* + * The broadcast test case. + * + * Tests that a ethr_cond_broadcast really wakes up all waiting threads. + */ + +#define BCT_THREADS 64 +#define BCT_NO_OF_WAITS 100 + +static int bct_woken = 0; +static int bct_waiting = 0; +static int bct_done = 0; +static ethr_mutex bct_mutex = ETHR_MUTEX_INITER; +static ethr_cond bct_cond = ETHR_COND_INITER; +static ethr_cond bct_cntrl_cond = ETHR_COND_INITER; + + +static void * +bct_thread(void *unused) +{ + int res; + + res = ethr_mutex_lock(&bct_mutex); + ASSERT(res == 0); + + while (!bct_done) { + + bct_waiting++; + if (bct_waiting == BCT_THREADS) { + res = ethr_cond_signal(&bct_cntrl_cond); + ASSERT(res == 0); + } + do { + res = ethr_cond_wait(&bct_cond, &bct_mutex); + } while (res == EINTR); + ASSERT(res == 0); + bct_woken++; + if (bct_woken == BCT_THREADS) { + res = ethr_cond_signal(&bct_cntrl_cond); + ASSERT(res == 0); + } + + } + + res = ethr_mutex_unlock(&bct_mutex); + ASSERT(res == 0); + + return NULL; +} + +static void +broadcast_test(void) +{ + int res, i; + ethr_tid tid[BCT_THREADS]; + + for (i = 0; i < BCT_THREADS; i++) { + res = ethr_thr_create(&tid[i], bct_thread, NULL, NULL); + ASSERT(res == 0); + + } + + res = ethr_mutex_lock(&bct_mutex); + ASSERT(res == 0); + + for (i = 0; i < BCT_NO_OF_WAITS; i++) { + + while (bct_waiting != BCT_THREADS) { + res = ethr_cond_wait(&bct_cntrl_cond, &bct_mutex); + ASSERT(res == 0 || res == EINTR); + } + + bct_waiting = 0; + bct_woken = 0; + + /* Wake all threads */ + res = ethr_cond_broadcast(&bct_cond); + ASSERT(res == 0); + + while (bct_woken != BCT_THREADS) { + res = ethr_cond_wait(&bct_cntrl_cond, &bct_mutex); + ASSERT(res == 0 || res == EINTR); + } + + } + + bct_done = 1; + + /* Wake all threads */ + res = ethr_cond_broadcast(&bct_cond); + ASSERT(res == 0); + + res = ethr_mutex_unlock(&bct_mutex); + ASSERT(res == 0); + + for (i = 0; i < BCT_THREADS - 1; i++) { + res = ethr_thr_join(tid[i], NULL); + ASSERT(res == 0); + } + + res = ethr_mutex_destroy(&bct_mutex); + ASSERT(res == 0); + res = ethr_cond_destroy(&bct_cntrl_cond); + ASSERT(res == 0); + res = ethr_cond_destroy(&bct_cond); + ASSERT(res == 0); + +} + +/* + * The detached thread test case. + * + * Tests detached threads. + */ + +#define DT_THREADS (50*1024) +#define DT_BATCH_SIZE 64 + +static ethr_mutex dt_mutex = ETHR_MUTEX_INITER; +static ethr_cond dt_cond = ETHR_COND_INITER; +static int dt_count; +static int dt_limit; + +static void * +dt_thread(void *unused) +{ + int res; + + res = ethr_mutex_lock(&dt_mutex); + ASSERT(res == 0); + + dt_count++; + + if (dt_count >= dt_limit) + ethr_cond_signal(&dt_cond); + + res = ethr_mutex_unlock(&dt_mutex); + ASSERT(res == 0); + + return NULL; +} + +static void +detached_thread_test(void) +{ + ethr_thr_opts thr_opts = ETHR_THR_OPTS_DEFAULT_INITER; + ethr_tid tid[DT_BATCH_SIZE]; + int i, j, res; + + thr_opts.detached = 1; + dt_count = 0; + dt_limit = 0; + + for (i = 0; i < DT_THREADS/DT_BATCH_SIZE; i++) { + + dt_limit += DT_BATCH_SIZE; + + for (j = 0; j < DT_BATCH_SIZE; j++) { + res = ethr_thr_create(&tid[j], dt_thread, NULL, &thr_opts); + ASSERT(res == 0); + } + + res = ethr_mutex_lock(&dt_mutex); + ASSERT(res == 0); + while (dt_count < dt_limit) { + res = ethr_cond_wait(&dt_cond, &dt_mutex); + ASSERT(res == 0 || res == EINTR); + } + res = ethr_mutex_unlock(&dt_mutex); + ASSERT(res == 0); + + print_line("dt_count = %d", dt_count); + } + do_sleep(1); +} + + + +/* + * The max threads test case. + * + * Tests + */ +#define MTT_TIMES 10 + +static int mtt_terminate; +static ethr_mutex mtt_mutex = ETHR_MUTEX_INITER; +static ethr_cond mtt_cond = ETHR_COND_INITER; +static char mtt_string[22*MTT_TIMES]; /* 22 is enough for ", %d" */ + + +void *mtt_thread(void *unused) +{ + int res; + + res = ethr_mutex_lock(&mtt_mutex); + ASSERT(res == 0); + + while (!mtt_terminate) { + res = ethr_cond_wait(&mtt_cond, &mtt_mutex); + ASSERT(res == 0 || res == EINTR); + } + + res = ethr_mutex_unlock(&mtt_mutex); + ASSERT(res == 0); + + return NULL; +} + + +static int +mtt_create_join_threads(void) +{ + int no_tids = 100, ix = 0, res = 0, no_threads; + ethr_tid *tids; + + mtt_terminate = 0; + + tids = (ethr_tid *) malloc(sizeof(ethr_tid)*no_tids); + ASSERT(tids); + + print_line("Beginning to create threads"); + + while (1) { + if (ix >= no_tids) { + no_tids += 100; + tids = (ethr_tid *) realloc((void *)tids, sizeof(ethr_tid)*no_tids); + ASSERT(tids); + } + res = ethr_thr_create(&tids[ix], mtt_thread, NULL, NULL); + if (res != 0) + break; + ix++; + } while (res == 0); + + no_threads = ix; + + print_line("%d = ethr_thr_create()", res); + print_line("Number of created threads: %d", no_threads); + + res = ethr_mutex_lock(&mtt_mutex); + ASSERT(res == 0); + + mtt_terminate = 1; + + res = ethr_cond_broadcast(&mtt_cond); + ASSERT(res == 0); + + res = ethr_mutex_unlock(&mtt_mutex); + ASSERT(res == 0); + + while (ix) { + res = ethr_thr_join(tids[--ix], NULL); + ASSERT(res == 0); + } + + print_line("All created threads terminated"); + + free((void *) tids); + + return no_threads; + +} + +static void +max_threads_test(void) +{ + int no_threads[MTT_TIMES], i, up, down, eq; + char *str; + + for (i = 0; i < MTT_TIMES; i++) { + no_threads[i] = mtt_create_join_threads(); + } + + str = &mtt_string[0]; + eq = up = down = 0; + for (i = 0; i < MTT_TIMES; i++) { + if (i == 0) { + str += sprintf(str, "%d", no_threads[i]); + continue; + } + + str += sprintf(str, ", %d", no_threads[i]); + + if (no_threads[i] < no_threads[i-1]) + down++; + else if (no_threads[i] > no_threads[i-1]) + up++; + else + eq++; + } + + print_line("Max created threads: %s", mtt_string); + + /* We fail if the no of threads we are able to create constantly decrease */ + ASSERT(!down || up || eq); + + succeed("Max created threads: %s", mtt_string); + +} + + +/* + * The forksafety test case. + * + * Tests forksafety. + */ +#ifdef __WIN32__ +#define NO_FORK_PRESENT +#endif + +#ifndef NO_FORK_PRESENT + +static ethr_mutex ft_test_inner_mutex = ETHR_MUTEX_INITER; +static ethr_mutex ft_test_outer_mutex = ETHR_MUTEX_INITER; +static ethr_mutex ft_go_mutex = ETHR_MUTEX_INITER; +static ethr_cond ft_go_cond = ETHR_COND_INITER; +static int ft_go; +static int ft_have_forked; + +static void * +ft_thread(void *unused) +{ + int res; + + res = ethr_mutex_lock(&ft_test_outer_mutex); + ASSERT(res == 0); + + res = ethr_mutex_lock(&ft_go_mutex); + ASSERT(res == 0); + + ft_go = 1; + res = ethr_cond_signal(&ft_go_cond); + ASSERT(res == 0); + res = ethr_mutex_unlock(&ft_go_mutex); + ASSERT(res == 0); + + do_sleep(1); + ASSERT(!ft_have_forked); + + res = ethr_mutex_lock(&ft_test_inner_mutex); + ASSERT(res == 0); + + res = ethr_mutex_unlock(&ft_test_inner_mutex); + ASSERT(res == 0); + + do_sleep(1); + ASSERT(!ft_have_forked); + + res = ethr_mutex_unlock(&ft_test_outer_mutex); + ASSERT(res == 0); + + do_sleep(1); + ASSERT(ft_have_forked); + + + return NULL; +} + +#endif /* #ifndef NO_FORK_PRESENT */ + +static void +forksafety_test(void) +{ +#ifdef NO_FORK_PRESENT + skip("No fork() present; nothing to test"); +#elif defined(DEBUG) + skip("Doesn't work in debug build"); +#else + char snd_msg[] = "ok, bye!"; + char rec_msg[sizeof(snd_msg)*2]; + ethr_tid tid; + int res; + int fds[2]; + + + res = ethr_mutex_set_forksafe(&ft_test_inner_mutex); + if (res == ENOTSUP) { + skip("Forksafety not supported on this platform!"); + } + ASSERT(res == 0); + res = ethr_mutex_set_forksafe(&ft_test_outer_mutex); + ASSERT(res == 0); + + + res = pipe(fds); + ASSERT(res == 0); + + ft_go = 0; + ft_have_forked = 0; + + res = ethr_mutex_lock(&ft_go_mutex); + ASSERT(res == 0); + + res = ethr_thr_create(&tid, ft_thread, NULL, NULL); + ASSERT(res == 0); + + do { + res = ethr_cond_wait(&ft_go_cond, &ft_go_mutex); + } while (res == EINTR || !ft_go); + ASSERT(res == 0); + + res = ethr_mutex_unlock(&ft_go_mutex); + ASSERT(res == 0); + + res = fork(); + ft_have_forked = 1; + if (res == 0) { + close(fds[0]); + res = ethr_mutex_lock(&ft_test_outer_mutex); + if (res != 0) + _exit(1); + res = ethr_mutex_lock(&ft_test_inner_mutex); + if (res != 0) + _exit(1); + res = ethr_mutex_unlock(&ft_test_inner_mutex); + if (res != 0) + _exit(1); + res = ethr_mutex_unlock(&ft_test_outer_mutex); + if (res != 0) + _exit(1); + + res = ethr_mutex_destroy(&ft_test_inner_mutex); + if (res != 0) + _exit(1); + res = ethr_mutex_destroy(&ft_test_outer_mutex); + if (res != 0) + _exit(1); + + res = (int) write(fds[1], (void *) snd_msg, sizeof(snd_msg)); + if (res != sizeof(snd_msg)) + _exit(1); + close(fds[1]); + _exit(0); + } + ASSERT(res > 0); + close(fds[1]); + + res = (int) read(fds[0], (void *) rec_msg, sizeof(rec_msg)); + ASSERT(res == (int) sizeof(snd_msg)); + ASSERT(strcmp(snd_msg, rec_msg) == 0); + + close(fds[0]); +#endif +} + + +/* + * The vfork test case. + * + * Tests vfork with threads. + */ + +#ifdef __WIN32__ +#define NO_VFORK_PRESENT +#endif + +#ifndef NO_VFORK_PRESENT + +#undef vfork + +static ethr_mutex vt_mutex = ETHR_MUTEX_INITER; + +static void * +vt_thread(void *vprog) +{ + char *prog = (char *) vprog; + int res; + char snd_msg[] = "ok, bye!"; + char rec_msg[sizeof(snd_msg)*2]; + int fds[2]; + char closefd[20]; + char writefd[20]; + + res = pipe(fds); + ASSERT(res == 0); + + res = sprintf(closefd, "%d", fds[0]); + ASSERT(res <= 20); + res = sprintf(writefd, "%d", fds[1]); + ASSERT(res <= 20); + + print("parent: About to vfork and execute "); + print("execlp(\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", NULL)", + prog, prog, "vfork", "exec", snd_msg, closefd, writefd); + print_line(" in child"); + res = vfork(); + if (res == 0) { + execlp(prog, prog, "vfork", "exec", snd_msg, closefd, writefd, NULL); + _exit(1); + } + ASSERT(res > 0); + + print_line("parent: I'm back"); + + close(fds[1]); + + res = (int) read(fds[0], (void *) rec_msg, sizeof(rec_msg)); + print_line("parent: %d = read()", res); + print_line("parent: rec_msg=\"%s\"", rec_msg); + ASSERT(res == (int) sizeof(snd_msg)); + ASSERT(strcmp(snd_msg, rec_msg) == 0); + + close(fds[0]); + + return NULL; +} + +#endif /* #ifndef NO_VFORK_PRESENT */ + +static void +vfork_test(int argc, char *argv[]) +{ +#ifdef NO_VFORK_PRESENT + skip("No vfork() present; nothing to test"); +#else + int res; + ethr_tid tid; + + if (argc == 6 && strcmp("exec", argv[2]) == 0) { + /* We are child after vfork() and execlp() ... */ + + char *snd_msg; + int closefd; + int writefd; + + snd_msg = argv[3]; + closefd = atoi(argv[4]); + writefd = atoi(argv[5]); + + print_line("child: snd_msg=\"%s\"; closefd=%d writefd=%d", + snd_msg, closefd, writefd); + + close(closefd); + + res = (int) write(writefd, (void *) snd_msg, strlen(snd_msg)+1); + print_line("child: %d = write()", res); + if (res != strlen(snd_msg)+1) + exit(1); + close(writefd); + print_line("child: bye"); + exit(0); + } + ASSERT(argc == 2); + + res = ethr_mutex_set_forksafe(&vt_mutex); + ASSERT(res == 0 || res == ENOTSUP); + res = ethr_mutex_lock(&vt_mutex); + ASSERT(res == 0); + + res = ethr_thr_create(&tid, vt_thread, (void *) argv[0], NULL); + ASSERT(res == 0); + + do_sleep(1); + + res = ethr_mutex_unlock(&vt_mutex); + ASSERT(res == 0); + + res = ethr_thr_join(tid, NULL); + ASSERT(res == 0); + + res = ethr_mutex_destroy(&vt_mutex); + ASSERT(res == 0); +#endif +} + + +/* + * The tsd test case. + * + * Tests thread specific data. + */ + +#define TT_THREADS 10 +static ethr_tsd_key tt_key; + +static void * +tt_thread(void *arg) +{ + int res = ethr_tsd_set(tt_key, arg); + ASSERT(res == 0); + return ethr_tsd_get(tt_key); +} + +static void +tsd_test(void) +{ + void *tres; + int i, res; + ethr_tid tid[TT_THREADS]; + int values[TT_THREADS]; + + res = ethr_tsd_key_create(&tt_key); + ASSERT(res == 0); + + for (i = 1; i < TT_THREADS; i++) { + res = ethr_thr_create(&tid[i], tt_thread, (void *) &values[i], NULL); + ASSERT(res == 0); + } + + tres = tt_thread((void *) &values[0]); + ASSERT(tres == (void *) &values[0]); + + for (i = 1; i < TT_THREADS; i++) { + res = ethr_thr_join(tid[i], &tres); + ASSERT(res == 0); + ASSERT(tres == (void *) &values[i]); + } + + res = ethr_tsd_key_delete(tt_key); + ASSERT(res == 0); +} + + +/* + * The spinlock test case. + * + * Tests spinlocks. + */ + +static ethr_spinlock_t st_spinlock; +static int st_data; + +void * +st_thread(void *unused) +{ + int res; + + print_line("Aux thread tries to lock spinlock"); + res = ethr_spin_lock(&st_spinlock); + ASSERT(res == 0); + print_line("Aux thread locked spinlock"); + + ASSERT(st_data == 0); + + st_data = 1; + print_line("Aux thread wrote"); + + print_line("Aux thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Aux thread woke up"); + + ASSERT(st_data == 1); + + res = ethr_spin_unlock(&st_spinlock); + ASSERT(res == 0); + print_line("Aux thread unlocked spinlock"); + + return NULL; +} + + +static void +spinlock_test(void) +{ + int res; + ethr_tid tid; + + print_line("Trying to initialize spinlock"); + res = ethr_spinlock_init(&st_spinlock); + ASSERT(res == 0); + print_line("Initialized spinlock"); + + st_data = 0; + + print_line("Main thread tries to lock spinlock"); + res = ethr_spin_lock(&st_spinlock); + ASSERT(res == 0); + print_line("Main thread locked spinlock"); + + ASSERT(st_data == 0); + + print_line("Main thread about to create aux thread"); + res = ethr_thr_create(&tid, st_thread, NULL, NULL); + ASSERT(res == 0); + print_line("Main thread created aux thread"); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(st_data == 0); + + res = ethr_spin_unlock(&st_spinlock); + ASSERT(res == 0); + print_line("Main thread unlocked spinlock"); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + print_line("Main thread tries to lock spinlock"); + res = ethr_spin_lock(&st_spinlock); + ASSERT(res == 0); + print_line("Main thread locked spinlock"); + + ASSERT(st_data == 1); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(st_data == 1); + + res = ethr_spin_unlock(&st_spinlock); + ASSERT(res == 0); + print_line("Main thread unlocked spinlock"); + + res = ethr_thr_join(tid, NULL); + ASSERT(res == 0); + print_line("Main thread joined aux thread"); + + res = ethr_spinlock_destroy(&st_spinlock); + ASSERT(res == 0); + print_line("Main thread destroyed spinlock"); + +} + + +/* + * The rwspinlock test case. + * + * Tests rwspinlocks. + */ + +static ethr_rwlock_t rwst_rwspinlock; +static int rwst_data; + +void * +rwst_thread(void *unused) +{ + int data; + int res; + + print_line("Aux thread tries to read lock rwspinlock"); + res = ethr_read_lock(&rwst_rwspinlock); + ASSERT(res == 0); + print_line("Aux thread read locked rwspinlock"); + + ASSERT(rwst_data == 4711); + + print_line("Aux thread tries to read unlock rwspinlock"); + res = ethr_read_unlock(&rwst_rwspinlock); + ASSERT(res == 0); + print_line("Aux thread read unlocked rwspinlock"); + + print_line("Aux thread tries to write lock rwspinlock"); + res = ethr_write_lock(&rwst_rwspinlock); + ASSERT(res == 0); + print_line("Aux thread write locked rwspinlock"); + + data = ++rwst_data; + print_line("Aux thread wrote"); + + print_line("Aux thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Aux thread woke up"); + + ASSERT(rwst_data == data); + ++rwst_data; + + print_line("Aux thread tries to write unlock rwspinlock"); + res = ethr_write_unlock(&rwst_rwspinlock); + ASSERT(res == 0); + print_line("Aux thread write unlocked rwspinlock"); + + return NULL; +} + + +static void +rwspinlock_test(void) +{ + int data; + int res; + ethr_tid tid; + + print_line("Trying to initialize rwspinlock"); + res = ethr_rwlock_init(&rwst_rwspinlock); + ASSERT(res == 0); + print_line("Initialized rwspinlock"); + + rwst_data = 4711; + + print_line("Main thread tries to read lock rwspinlock"); + res = ethr_read_lock(&rwst_rwspinlock); + ASSERT(res == 0); + print_line("Main thread read locked rwspinlock"); + + ASSERT(rwst_data == 4711); + + print_line("Main thread about to create aux thread"); + res = ethr_thr_create(&tid, rwst_thread, NULL, NULL); + ASSERT(res == 0); + print_line("Main thread created aux thread"); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(rwst_data == 4711); + + print_line("Main thread tries to read unlock rwspinlock"); + res = ethr_read_unlock(&rwst_rwspinlock); + ASSERT(res == 0); + print_line("Main thread read unlocked rwspinlock"); + + print_line("Main thread tries to write lock rwspinlock"); + res = ethr_write_lock(&rwst_rwspinlock); + ASSERT(res == 0); + print_line("Main thread write locked rwspinlock"); + + data = ++rwst_data; + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(rwst_data == data); + ++rwst_data; + + print_line("Main thread tries to write unlock rwspinlock"); + res = ethr_write_unlock(&rwst_rwspinlock); + ASSERT(res == 0); + print_line("Main thread write unlocked rwspinlock"); + + res = ethr_thr_join(tid, NULL); + ASSERT(res == 0); + print_line("Main thread joined aux thread"); + + res = ethr_rwlock_destroy(&rwst_rwspinlock); + ASSERT(res == 0); + print_line("Main thread destroyed rwspinlock"); + +} + + +/* + * The rwmutex test case. + * + * Tests rwmutexes. + */ + +static ethr_rwmutex rwmt_rwmutex; +static int rwmt_data; + +void * +rwmt_thread(void *unused) +{ + int data; + int res; + + print_line("Aux thread tries to read lock rwmutex"); + res = ethr_rwmutex_rlock(&rwmt_rwmutex); + ASSERT(res == 0); + print_line("Aux thread read locked rwmutex"); + + ASSERT(rwmt_data == 4711); + + print_line("Aux thread tries to read unlock rwmutex"); + res = ethr_rwmutex_runlock(&rwmt_rwmutex); + ASSERT(res == 0); + print_line("Aux thread read unlocked rwmutex"); + + print_line("Aux thread tries to write lock rwmutex"); + res = ethr_rwmutex_rwlock(&rwmt_rwmutex); + ASSERT(res == 0); + print_line("Aux thread write locked rwmutex"); + + data = ++rwmt_data; + print_line("Aux thread wrote"); + + print_line("Aux thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Aux thread woke up"); + + ASSERT(rwmt_data == data); + ++rwmt_data; + + print_line("Aux thread tries to write unlock rwmutex"); + res = ethr_rwmutex_rwunlock(&rwmt_rwmutex); + ASSERT(res == 0); + print_line("Aux thread write unlocked rwmutex"); + + return NULL; +} + + +static void +rwmutex_test(void) +{ + int data; + int res; + ethr_tid tid; + + print_line("Trying to initialize rwmutex"); + res = ethr_rwmutex_init(&rwmt_rwmutex); + ASSERT(res == 0); + print_line("Initialized rwmutex"); + + rwmt_data = 4711; + + print_line("Main thread tries to read lock rwmutex"); + res = ethr_rwmutex_rlock(&rwmt_rwmutex); + ASSERT(res == 0); + print_line("Main thread read locked rwmutex"); + + ASSERT(rwmt_data == 4711); + + print_line("Main thread about to create aux thread"); + res = ethr_thr_create(&tid, rwmt_thread, NULL, NULL); + ASSERT(res == 0); + print_line("Main thread created aux thread"); + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(rwmt_data == 4711); + + print_line("Main thread tries to read unlock rwmutex"); + res = ethr_rwmutex_runlock(&rwmt_rwmutex); + ASSERT(res == 0); + print_line("Main thread read unlocked rwmutex"); + + print_line("Main thread tries to write lock rwmutex"); + res = ethr_rwmutex_rwlock(&rwmt_rwmutex); + ASSERT(res == 0); + print_line("Main thread write locked rwmutex"); + + data = ++rwmt_data; + + print_line("Main thread goes to sleep for 1 second"); + do_sleep(1); + print_line("Main thread woke up"); + + ASSERT(rwmt_data == data); + ++rwmt_data; + + print_line("Main thread tries to write unlock rwmutex"); + res = ethr_rwmutex_rwunlock(&rwmt_rwmutex); + ASSERT(res == 0); + print_line("Main thread write unlocked rwmutex"); + + res = ethr_thr_join(tid, NULL); + ASSERT(res == 0); + print_line("Main thread joined aux thread"); + + res = ethr_rwmutex_destroy(&rwmt_rwmutex); + ASSERT(res == 0); + print_line("Main thread destroyed rwmutex"); + +} + +/* + * The atomic test case. + * + * Tests atomics. + */ + +#define AT_THREADS 4 +#define AT_ITER 10000 + +long at_set_val, at_rm_val, at_max_val; + +static ethr_atomic_t at_ready; +static ethr_atomic_t at_go; +static ethr_atomic_t at_done; +static ethr_atomic_t at_data; + +void * +at_thread(void *unused) +{ + int res, i; + long val, go; + + + res = ethr_atomic_inctest(&at_ready, &val); + ASSERT(res == 0); + ASSERT(val > 0); + ASSERT(val <= AT_THREADS); + + do { + res = ethr_atomic_read(&at_go, &go); + ASSERT(res == 0); + } while (!go); + + for (i = 0; i < AT_ITER; i++) { + res = ethr_atomic_or_old(&at_data, at_set_val, &val); + ASSERT(res == 0); + ASSERT(val >= (i == 0 ? 0 : at_set_val) + (long) 4711); + ASSERT(val <= at_max_val); + + res = ethr_atomic_and_old(&at_data, ~at_rm_val, &val); + ASSERT(res == 0); + ASSERT(val >= at_set_val + (long) 4711); + ASSERT(val <= at_max_val); + + res = ethr_atomic_read(&at_data, &val); + ASSERT(res == 0); + ASSERT(val >= at_set_val + (long) 4711); + ASSERT(val <= at_max_val); + + res = ethr_atomic_inctest(&at_data, &val); + ASSERT(res == 0); + ASSERT(val > at_set_val + (long) 4711); + ASSERT(val <= at_max_val); + + res = ethr_atomic_dectest(&at_data, &val); + ASSERT(res == 0); + ASSERT(val >= at_set_val + (long) 4711); + ASSERT(val <= at_max_val); + + res = ethr_atomic_inc(&at_data); + ASSERT(res == 0); + + res = ethr_atomic_dec(&at_data); + ASSERT(res == 0); + + res = ethr_atomic_addtest(&at_data, (long) 4711, &val); + ASSERT(res == 0); + ASSERT(val >= at_set_val + (long) 2*4711); + ASSERT(val <= at_max_val); + + res = ethr_atomic_add(&at_data, (long) -4711); + ASSERT(res == 0); + ASSERT(val >= at_set_val + (long) 4711); + ASSERT(val <= at_max_val); + } + + res = ethr_atomic_inc(&at_done); + ASSERT(res == 0); + return NULL; +} + + +static void +atomic_test(void) +{ + long data_init, data_final, val; + int res, i; + ethr_tid tid[AT_THREADS]; + ethr_thr_opts thr_opts = ETHR_THR_OPTS_DEFAULT_INITER; + + if (sizeof(long) > 4) { + at_rm_val = ((long) 1) << 57; + at_set_val = ((long) 1) << 60; + } + else { + at_rm_val = ((long) 1) << 27; + at_set_val = ((long) 1) << 30; + } + + at_max_val = at_set_val + at_rm_val + ((long) AT_THREADS + 1) * 4711; + data_init = at_rm_val + (long) 4711; + data_final = at_set_val + (long) 4711; + + thr_opts.detached = 1; + + print_line("Initializing"); + res = ethr_atomic_init(&at_ready, 0); + ASSERT(res == 0); + res = ethr_atomic_init(&at_go, 0); + ASSERT(res == 0); + res = ethr_atomic_init(&at_done, data_init); + ASSERT(res == 0); + res = ethr_atomic_init(&at_data, data_init); + ASSERT(res == 0); + + res = ethr_atomic_read(&at_data, &val); + ASSERT(res == 0); + ASSERT(val == data_init); + res = ethr_atomic_set(&at_done, 0); + ASSERT(res == 0); + res = ethr_atomic_read(&at_done, &val); + ASSERT(res == 0); + ASSERT(val == 0); + + print_line("Creating threads"); + for (i = 0; i < AT_THREADS; i++) { + res = ethr_thr_create(&tid[i], at_thread, NULL, &thr_opts); + ASSERT(res == 0); + } + + print_line("Waiting for threads to ready up"); + do { + res = ethr_atomic_read(&at_ready, &val); + ASSERT(res == 0); + ASSERT(val >= 0); + ASSERT(val <= AT_THREADS); + } while (val != AT_THREADS); + + print_line("Letting threads loose"); + res = ethr_atomic_xchg(&at_go, 17, &val); + ASSERT(res == 0); + ASSERT(val == 0); + res = ethr_atomic_read(&at_go, &val); + ASSERT(res == 0); + ASSERT(val == 17); + + + print_line("Waiting for threads to finish"); + do { + res = ethr_atomic_read(&at_done, &val); + ASSERT(res == 0); + ASSERT(val >= 0); + ASSERT(val <= AT_THREADS); + } while (val != AT_THREADS); + + print_line("Checking result"); + res = ethr_atomic_read(&at_data, &val); + ASSERT(res == 0); + ASSERT(val == data_final); + print_line("Result ok"); + +} + + +/* + * The gate test case. + * + * Tests gates. + */ + +#define GT_THREADS 10 + +static ethr_atomic_t gt_wait1; +static ethr_atomic_t gt_wait2; +static ethr_atomic_t gt_done; + +static ethr_gate gt_gate1; +static ethr_gate gt_gate2; + +void * +gt_thread(void *thr_no) +{ + int no = (int)(long) thr_no; + int swait = no % 2 == 0; + int res; + long done; + + + do { + + res = ethr_atomic_inc(>_wait1); + ASSERT(res == 0); + + if (swait) + res = ethr_gate_swait(>_gate1, INT_MAX); + else + res = ethr_gate_wait(>_gate1); + ASSERT(res == 0); + + res = ethr_atomic_dec(>_wait1); + ASSERT(res == 0); + + res = ethr_atomic_inc(>_wait2); + ASSERT(res == 0); + + if (swait) + res = ethr_gate_swait(>_gate2, INT_MAX); + else + res = ethr_gate_wait(>_gate2); + ASSERT(res == 0); + + res = ethr_atomic_dec(>_wait2); + ASSERT(res == 0); + + res = ethr_atomic_read(>_done, &done); + ASSERT(res == 0); + } while (!done); + return NULL; +} + + +static void +gate_test(void) +{ + long val; + int res, i; + ethr_tid tid[GT_THREADS]; + + print_line("Initializing"); + res = ethr_atomic_init(>_wait1, 0); + ASSERT_EQ(res, 0, "%d"); + res = ethr_atomic_init(>_wait2, 0); + ASSERT_EQ(res, 0, "%d"); + res = ethr_atomic_init(>_done, 0); + ASSERT_EQ(res, 0, "%d"); + res = ethr_gate_init(>_gate1); + ASSERT_EQ(res, 0, "%d"); + res = ethr_gate_init(>_gate2); + ASSERT_EQ(res, 0, "%d"); + + print_line("Creating threads"); + for (i = 0; i < GT_THREADS; i++) { + res = ethr_thr_create(&tid[i], gt_thread, (void *) i, NULL); + ASSERT_EQ(res, 0, "%d"); + } + + print_line("Waiting for threads to ready up"); + do { + res = ethr_atomic_read(>_wait1, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT(0 <= val && val <= GT_THREADS); + } while (val != GT_THREADS); + + print_line("Testing"); + + res = ethr_gate_let_through(>_gate1, 8); + ASSERT_EQ(res, 0, "%d"); + + WAIT_UNTIL_LIM((res = ethr_atomic_read(>_wait2, &val), + (res != 0 || val == 8)), + 60); + + res = ethr_atomic_read(>_wait1, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT_EQ(val, GT_THREADS - 8, "%ld"); + + res = ethr_atomic_read(>_wait2, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT_EQ(val, 8, "%ld"); + + res = ethr_gate_let_through(>_gate2, 4); + ASSERT_EQ(res, 0, "%d"); + + WAIT_UNTIL_LIM((res = ethr_atomic_read(>_wait2, &val), + (res != 0 || val == 4)), + 60); + + res = ethr_atomic_read(>_wait1, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT_EQ(val, GT_THREADS - 4, "%ld"); + + res = ethr_atomic_read(>_wait2, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT_EQ(val, 4, "%ld"); + + res = ethr_gate_let_through(>_gate1, GT_THREADS); + ASSERT_EQ(res, 0, "%d"); + + WAIT_UNTIL_LIM((res = ethr_atomic_read(>_wait2, &val), + (res != 0 || val == GT_THREADS)), + 60); + res = ethr_atomic_read(>_wait1, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT_EQ(val, 0, "%ld"); + + res = ethr_atomic_read(>_wait2, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT_EQ(val, GT_THREADS, "%ld"); + + res = ethr_gate_let_through(>_gate2, GT_THREADS); + ASSERT_EQ(res, 0, "%d"); + + WAIT_UNTIL_LIM((res = ethr_atomic_read(>_wait2, &val), + (res != 0 || val == 4)), + 60); + res = ethr_atomic_read(>_wait1, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT_EQ(val, GT_THREADS - 4, "%ld"); + + res = ethr_atomic_read(>_wait2, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT_EQ(val, 4, "%ld"); + + res = ethr_atomic_set(>_done, 1); + ASSERT_EQ(res, 0, "%d"); + + res = ethr_gate_let_through(>_gate2, GT_THREADS); + ASSERT_EQ(res, 0, "%d"); + res = ethr_gate_let_through(>_gate1, GT_THREADS - 4); + ASSERT_EQ(res, 0, "%d"); + + WAIT_UNTIL_LIM(((res = ethr_atomic_read(>_wait1, &val)) != 0 + || (val == 0 + && ((res = ethr_atomic_read(>_wait2, &val)) != 0 + || val == 0))), + 60); + + res = ethr_atomic_read(>_wait1, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT_EQ(val, 0, "%ld"); + + res = ethr_atomic_read(>_wait2, &val); + ASSERT_EQ(res, 0, "%d"); + ASSERT_EQ(val, 0, "%ld"); + + print_line("Joining threads"); + for (i = 0; i < GT_THREADS; i++) { + res = ethr_thr_join(tid[i], NULL); + ASSERT_EQ(res, 0, "%d"); + } + + res = ethr_gate_destroy(>_gate1); + ASSERT_EQ(res, 0, "%d"); + res = ethr_gate_destroy(>_gate2); + ASSERT_EQ(res, 0, "%d"); + +} + +#endif /* #ifndef ETHR_NO_THREAD_LIB */ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * The dispatcher * +\* */ + +int +main(int argc, char *argv[]) +{ + if (argc < 2) + fail("To few arguments for test case"); + +#ifndef ETHR_NO_THREAD_LIB + { + char *testcase; + int res; + + send_my_pid(); + + testcase = argv[1]; + res = ethr_init(NULL); + + if (res != 0) + fail("Failed to initialize the ethread library"); + + if (strcmp(testcase, "create_join_thread") == 0) + create_join_thread_test(); + else if (strcmp(testcase, "equal_tids") == 0) + equal_tids_test(); + else if (strcmp(testcase, "mutex") == 0) + mutex_test(); + else if (strcmp(testcase, "try_lock_mutex") == 0) + try_lock_mutex_test(); + else if (strcmp(testcase, "recursive_mutex") == 0) + recursive_mutex_test(); + else if (strcmp(testcase, "time_now") == 0) + time_now_test(); + else if (strcmp(testcase, "cond_wait") == 0) + cond_wait_test(0); + else if (strcmp(testcase, "cond_timedwait") == 0) + cond_timedwait_test(); + else if (strcmp(testcase, "broadcast") == 0) + broadcast_test(); + else if (strcmp(testcase, "detached_thread") == 0) + detached_thread_test(); + else if (strcmp(testcase, "max_threads") == 0) + max_threads_test(); + else if (strcmp(testcase, "forksafety") == 0) + forksafety_test(); + else if (strcmp(testcase, "vfork") == 0) + vfork_test(argc, argv); + else if (strcmp(testcase, "tsd") == 0) + tsd_test(); + else if (strcmp(testcase, "spinlock") == 0) + spinlock_test(); + else if (strcmp(testcase, "rwspinlock") == 0) + rwspinlock_test(); + else if (strcmp(testcase, "rwmutex") == 0) + rwmutex_test(); + else if (strcmp(testcase, "atomic") == 0) + atomic_test(); + else if (strcmp(testcase, "gate") == 0) + gate_test(); + else + skip("Test case \"%s\" not implemented yet", testcase); + + succeed(NULL); + } +#else /* #ifndef ETHR_NO_THREAD_LIB */ + skip("No ethread library to test"); +#endif /* #ifndef ETHR_NO_THREAD_LIB */ + + return 0; +} diff -Nru erlang-13.b.1-dfsg/erts/test/ethread_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/test/ethread_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/test/ethread_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/ethread_SUITE_data/Makefile.src 2009-09-18 15:08:51.000000000 +0100 @@ -0,0 +1,41 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2004-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +include @erts_lib_include_internal_generated@@DS@ethread.mk +include @erts_lib_include_internal_generated@@DS@erts_internal.mk + +CC = @CC@ +CFLAGS = @ERTS_CFLAGS@ +LIBS = @ERTS_LIBS@ + +ETHR_T_CFLAGS = -Wall $(ETHR_DEFS) $(CFLAGS) @DEFS@ -I@erts_lib_include_internal@ -I@erts_lib_include_internal_generated@ +ETHR_T_LIBS = $(LIBS) -L@erts_lib_internal_path@ $(ETHR_LIBS) $(ERTS_INTERNAL_X_LIBS) + +GCC = .@DS@gccifier -CC"$(CC)" + +PROGS = ethread_tests@exe@ + +all: $(PROGS) + +gccifier@exe@: ..@DS@utils@DS@gccifier.c + $(CC) $(CFLAGS) -o gccifier@exe@ ..@DS@utils@DS@gccifier.c $(LIBS) + +ethread_tests@exe@: gccifier@exe@ ethread_tests.c + $(GCC) $(ETHR_T_CFLAGS) -o ethread_tests@exe@ ethread_tests.c -lerts_internal_r $(ETHR_T_LIBS) + diff -Nru erlang-13.b.1-dfsg/erts/test/ethread_SUITE.erl erlang-13.b.3-dfsg/erts/test/ethread_SUITE.erl --- erlang-13.b.1-dfsg/erts/test/ethread_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/ethread_SUITE.erl 2009-09-18 15:08:51.000000000 +0100 @@ -0,0 +1,365 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : ethread_SUITE.erl +%%% Author : Rickard Green +%%% Description : +%%% +%%% Created : 17 Jun 2004 by Rickard Green +%%%------------------------------------------------------------------- +-module(ethread_SUITE). +-author('rickard.s.green@ericsson.com'). + +%-define(line_trace, 1). + +-define(DEFAULT_TIMEOUT, ?t:minutes(10)). + +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([create_join_thread/1, + equal_tids/1, + mutex/1, + try_lock_mutex/1, + recursive_mutex/1, + time_now/1, + cond_wait/1, + cond_timedwait/1, + broadcast/1, + detached_thread/1, + max_threads/1, + forksafety/1, + vfork/1, + tsd/1, + spinlock/1, + rwspinlock/1, + rwmutex/1, + atomic/1, + gate/1]). + +-include("test_server.hrl"). + +tests() -> + [create_join_thread, + equal_tids, + mutex, + try_lock_mutex, + recursive_mutex, + time_now, + cond_wait, + cond_timedwait, + broadcast, + detached_thread, + max_threads, + forksafety, + vfork, + tsd, + spinlock, + rwspinlock, + rwmutex, + atomic, + gate]. + +all(doc) -> []; +all(suite) -> tests(). + + +%% +%% +%% The test-cases +%% +%% + +create_join_thread(doc) -> + ["Tests ethr_thr_create and ethr_thr_join."]; +create_join_thread(suite) -> + []; +create_join_thread(Config) -> + run_case(Config, "create_join_thread", ""). + +equal_tids(doc) -> + ["Tests ethr_equal_tids."]; +equal_tids(suite) -> + []; +equal_tids(Config) -> + run_case(Config, "equal_tids", ""). + +mutex(doc) -> + ["Tests mutexes."]; +mutex(suite) -> + []; +mutex(Config) -> + run_case(Config, "mutex", ""). + +try_lock_mutex(doc) -> + ["Tests try lock on mutex."]; +try_lock_mutex(suite) -> + []; +try_lock_mutex(Config) -> + run_case(Config, "try_lock_mutex", ""). + +recursive_mutex(doc) -> + ["Tests recursive mutexes."]; +recursive_mutex(suite) -> + []; +recursive_mutex(Config) -> + run_case(Config, "recursive_mutex", ""). + +time_now(doc) -> + ["Tests ethr_time_now by comparing time values with Erlang."]; +time_now(suite) -> + []; +time_now(Config) -> + run_case(Config, "time_now", "", fun (P) -> + spawn_link(fun () -> + watchdog(P) + end) + end). + +wd_dispatch(P) -> + receive + bye -> + ?line true = port_command(P, "-1 "), + ?line bye; + L when is_list(L) -> + ?line true = port_command(P, L), + ?line wd_dispatch(P) + end. + +watchdog(Port) -> + ?line process_flag(priority, max), + ?line receive after 500 -> ok end, + + ?line random:seed(), + ?line true = port_command(Port, "0 "), + ?line lists:foreach(fun (T) -> + erlang:send_after(T, + self(), + integer_to_list(T) + ++ " ") + end, + lists:usort(lists:map(fun (_) -> + random:uniform(4500)+500 + end, + lists:duplicate(50,0)))), + ?line erlang:send_after(5100, self(), bye), + + wd_dispatch(Port). + +cond_wait(doc) -> + ["Tests ethr_cond_wait with ethr_cond_signal and ethr_cond_broadcast."]; +cond_wait(suite) -> + []; +cond_wait(Config) -> + run_case(Config, "cond_wait", ""). + +cond_timedwait(doc) -> + ["Tests ethr_cond_timedwait with ethr_cond_signal and ethr_cond_broadcast."]; +cond_timedwait(suite) -> + []; +cond_timedwait(Config) -> + run_case(Config, "cond_timedwait", ""). + +broadcast(doc) -> + ["Tests that a ethr_cond_broadcast really wakes up all waiting threads"]; +broadcast(suite) -> + []; +broadcast(Config) -> + run_case(Config, "broadcast", ""). + +detached_thread(doc) -> + ["Tests detached threads."]; +detached_thread(suite) -> + []; +detached_thread(Config) -> + run_case(Config, "detached_thread", ""). + +max_threads(doc) -> + ["Tests maximum number of threads."]; +max_threads(suite) -> + []; +max_threads(Config) -> + run_case(Config, "max_threads", ""). + +forksafety(doc) -> + ["Tests forksafety."]; +forksafety(suite) -> + []; +forksafety(Config) -> + run_case(Config, "forksafety", ""). + +vfork(doc) -> + ["Tests vfork with threads."]; +vfork(suite) -> + case ?t:os_type() of + {unix, osf1} -> + {skip, "vfork() known to hang multi-threaded applications on osf1"}; + _ -> + [] + end; +vfork(Config) -> + run_case(Config, "vfork", ""). + +tsd(doc) -> + ["Tests thread specific data."]; +tsd(suite) -> + []; +tsd(Config) -> + run_case(Config, "tsd", ""). + +spinlock(doc) -> + ["Tests spinlocks."]; +spinlock(suite) -> + []; +spinlock(Config) -> + run_case(Config, "spinlock", ""). + +rwspinlock(doc) -> + ["Tests rwspinlocks."]; +rwspinlock(suite) -> + []; +rwspinlock(Config) -> + run_case(Config, "rwspinlock", ""). + +rwmutex(doc) -> + ["Tests rwmutexes."]; +rwmutex(suite) -> + []; +rwmutex(Config) -> + run_case(Config, "rwmutex", ""). + +atomic(doc) -> + ["Tests atomics."]; +atomic(suite) -> + []; +atomic(Config) -> + run_case(Config, "atomic", ""). + +gate(doc) -> + ["Tests gates."]; +gate(suite) -> + []; +gate(Config) -> + run_case(Config, "gate", ""). + +%% +%% +%% Auxiliary functions +%% +%% + +init_per_testcase(_Case, Config) -> + Dog = ?t:timetrap(?DEFAULT_TIMEOUT), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +-define(TESTPROG, "ethread_tests"). +-define(FAILED_MARKER, $E,$T,$H,$R,$-,$T,$E,$S,$T,$-,$F,$A,$I,$L,$U,$R,$E). +-define(SKIPPED_MARKER, $E,$T,$H,$R,$-,$T,$E,$S,$T,$-,$S,$K,$I,$P). +-define(SUCCESS_MARKER, $E,$T,$H,$R,$-,$T,$E,$S,$T,$-,$S,$U,$C,$C,$E,$S,$S). +-define(PID_MARKER, $E,$T,$H,$R,$-,$T,$E,$S,$T,$-,$P,$I,$D). + +port_prog_killer(EProc, OSProc) when is_pid(EProc), is_list(OSProc) -> + ?line process_flag(trap_exit, true), + ?line Ref = erlang:monitor(process, EProc), + ?line receive + {'DOWN', Ref, _, _, Reason} when is_tuple(Reason), + element(1, Reason) + == timetrap_timeout -> + ?line Cmd = "kill -9 " ++ OSProc, + ?line ?t:format("Test case timed out. " + "Trying to kill port program.~n" + " Executing: ~p~n", [Cmd]), + ?line case os:cmd(Cmd) of + [] -> + ok; + OsCmdRes -> + ?line ?t:format(" ~s", [OsCmdRes]) + end; + {'DOWN', Ref, _, _, _} -> + %% OSProc is assumed to have terminated by itself + ?line ok + end. + +get_line(_Port, eol, Data) -> + ?line Data; +get_line(Port, noeol, Data) -> + ?line receive + {Port, {data, {Flag, NextData}}} -> + ?line get_line(Port, Flag, Data ++ NextData); + {Port, eof} -> + ?line ?t:fail(port_prog_unexpectedly_closed) + end. + +read_case_data(Port, TestCase) -> + ?line receive + {Port, {data, {eol, [?SUCCESS_MARKER]}}} -> + ?line ok; + {Port, {data, {Flag, [?SUCCESS_MARKER | CommentStart]}}} -> + ?line {comment, get_line(Port, Flag, CommentStart)}; + {Port, {data, {Flag, [?SKIPPED_MARKER | CommentStart]}}} -> + ?line {skipped, get_line(Port, Flag, CommentStart)}; + {Port, {data, {Flag, [?FAILED_MARKER | ReasonStart]}}} -> + ?line ?t:fail(get_line(Port, Flag, ReasonStart)); + {Port, {data, {eol, [?PID_MARKER | PidStr]}}} -> + ?line ?t:format("Port program pid: ~s~n", [PidStr]), + ?line CaseProc = self(), + ?line list_to_integer(PidStr), % Sanity check + spawn_opt(fun () -> + port_prog_killer(CaseProc, PidStr) + end, + [{priority, max}, link]), + read_case_data(Port, TestCase); + {Port, {data, {Flag, LineStart}}} -> + ?line ?t:format("~s~n", [get_line(Port, Flag, LineStart)]), + read_case_data(Port, TestCase); + {Port, eof} -> + ?line ?t:fail(port_prog_unexpectedly_closed) + end. + +run_case(Config, Test, TestArgs) -> + run_case(Config, Test, TestArgs, fun (_Port) -> ok end). + +run_case(Config, Test, TestArgs, Fun) -> + TestProg = filename:join([?config(data_dir, Config), ?TESTPROG]), + Cmd = TestProg ++ " " ++ Test ++ " " ++ TestArgs, + case catch open_port({spawn, Cmd}, [stream, + use_stdio, + stderr_to_stdout, + eof, + {line, 1024}]) of + Port when is_port(Port) -> + ?line Fun(Port), + ?line CaseResult = read_case_data(Port, Test), + ?line receive + {Port, eof} -> + ?line ok + end, + ?line CaseResult; + Error -> + ?line ?t:fail({open_port_failed, Error}) + end. + + + + diff -Nru erlang-13.b.1-dfsg/erts/test/ignore_cores.erl erlang-13.b.3-dfsg/erts/test/ignore_cores.erl --- erlang-13.b.1-dfsg/erts/test/ignore_cores.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/ignore_cores.erl 2009-03-12 12:17:23.000000000 +0000 @@ -0,0 +1,158 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : ignore_cores.erl +%%% Author : Rickard Green +%%% Description : +%%% +%%% Created : 11 Feb 2008 by Rickard Green +%%%------------------------------------------------------------------- + +-module(ignore_cores). + +-include("test_server.hrl"). + +-export([init/1, fini/1, setup/3, setup/4, restore/1, dir/1]). + +-record(ignore_cores, {org_cwd, + org_path, + org_pwd_env, + ign_dir = false, + cores_dir = false}). + +%% +%% Takes a testcase config +%% + +init(Config) -> + {ok, OrgCWD} = file:get_cwd(), + [{ignore_cores, + #ignore_cores{org_cwd = OrgCWD, + org_path = code:get_path(), + org_pwd_env = os:getenv("PWD")}} + | lists:keydelete(ignore_cores, 1, Config)]. + +fini(Config) -> + #ignore_cores{org_cwd = OrgCWD, + org_path = OrgPath, + org_pwd_env = OrgPWD} = ?config(ignore_cores, Config), + ok = file:set_cwd(OrgCWD), + true = code:set_path(OrgPath), + case OrgPWD of + false -> ok; + _ -> true = os:putenv("PWD", OrgPWD) + end, + lists:keydelete(ignore_cores, 1, Config). + +setup(Suite, Testcase, Config) -> + setup(Suite, Testcase, Config, false). + +setup(Suite, Testcase, Config, SetCwd) when is_atom(Suite), + is_atom(Testcase), + is_list(Config) -> + #ignore_cores{org_cwd = OrgCWD, + org_path = OrgPath, + org_pwd_env = OrgPWD} = ?config(ignore_cores, Config), + Path = lists:map(fun (".") -> OrgCWD; (Dir) -> Dir end, OrgPath), + true = code:set_path(Path), + PrivDir = ?config(priv_dir, Config), + IgnDir = filename:join([PrivDir, + atom_to_list(Suite) + ++ "_" + ++ atom_to_list(Testcase) + ++ "_wd"]), + ok = file:make_dir(IgnDir), + case SetCwd of + false -> + ok; + _ -> + ok = file:set_cwd(IgnDir), + OrgPWD = case os:getenv("PWD") of + false -> false; + PWD -> + os:putenv("PWD", IgnDir), + PWD + end + end, + ok = file:write_file(filename:join([IgnDir, "ignore_core_files"]), <<>>), + %% cores are dumped in /cores on MacOS X + CoresDir = case {?t:os_type(), filelib:is_dir("/cores")} of + {{unix,darwin}, true} -> + filelib:fold_files("/cores", + "^core.*$", + false, + fun (C,Cs) -> [C|Cs] end, + []); + _ -> + false + end, + lists:keyreplace(ignore_cores, + 1, + Config, + {ignore_cores, + #ignore_cores{org_cwd = OrgCWD, + org_path = OrgPath, + org_pwd_env = OrgPWD, + ign_dir = IgnDir, + cores_dir = CoresDir}}). + +restore(Config) -> + #ignore_cores{org_cwd = OrgCWD, + org_path = OrgPath, + org_pwd_env = OrgPWD, + ign_dir = IgnDir, + cores_dir = CoresDir} = ?config(ignore_cores, Config), + try + case CoresDir of + false -> + ok; + _ -> + %% Move cores dumped by these testcases in /cores + %% to cwd. + lists:foreach(fun (C) -> + case lists:member(C, CoresDir) of + true -> ok; + _ -> + Dst = filename:join( + [IgnDir, + filename:basename(C)]), + {ok, _} = file:copy(C, Dst), + file:delete(C) + end + end, + filelib:fold_files("/cores", + "^core.*$", + false, + fun (C,Cs) -> [C|Cs] end, + [])) + end + after + catch file:set_cwd(OrgCWD), + catch code:set_path(OrgPath), + case OrgPWD of + false -> ok; + _ -> catch os:putenv("PWD", OrgPWD) + end + end. + + +dir(Config) -> + #ignore_cores{ign_dir = Dir} = ?config(ignore_cores, Config), + Dir. diff -Nru erlang-13.b.1-dfsg/erts/test/Makefile erlang-13.b.3-dfsg/erts/test/Makefile --- erlang-13.b.1-dfsg/erts/test/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/Makefile 2009-09-18 15:07:43.000000000 +0100 @@ -0,0 +1,81 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +include $(ERL_TOP)/make/target.mk + +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +EBIN = . + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + +MODULES= \ + erlc_SUITE \ + nt_SUITE \ + otp_SUITE \ + ethread_SUITE \ + erl_print_SUITE \ + run_erl_SUITE \ + erlexec_SUITE \ + z_SUITE + + +ERL_FILES= $(MODULES:%=%.erl) + +TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR)) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/system_test + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- +ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/test_server/include + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- + +tests debug opt: $(TARGET_FILES) + +clean: + rm -f $(TARGET_FILES) + rm -f core *~ + +docs: + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + +release_spec: + +release_tests_spec: opt + $(INSTALL_DIR) $(RELSYSDIR) + $(INSTALL_DATA) system.spec system.dynspec system.spec.vxworks \ + $(ERL_FILES) $(TARGET_FILES) $(RELSYSDIR) + chmod -f -R u+w $(RELSYSDIR) + tar cf - *_SUITE_data utils | (cd $(RELSYSDIR); tar xf -) + +release_docs_spec: diff -Nru erlang-13.b.1-dfsg/erts/test/nt_SUITE_data/Makefile.src erlang-13.b.3-dfsg/erts/test/nt_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/erts/test/nt_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/nt_SUITE_data/Makefile.src 2009-03-12 12:17:27.000000000 +0000 @@ -0,0 +1,33 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1998-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +CC = @CC@ +LD = @LD@ +CFLAGS = @CFLAGS@ -I@erl_include@ @DEFS@ +CROSSLDFLAGS = @CROSSLDFLAGS@ + +PROGS = nt_info@exe@ + +all: $(PROGS) + +nt_info@exe@: nt_info@obj@ + $(LD) $(CROSSLDFLAGS) -o nt_info nt_info@obj@ @LIBS@ + +nt_info@obj@: nt_info.c + $(CC) -c -o nt_info@obj@ $(CFLAGS) nt_info.c diff -Nru erlang-13.b.1-dfsg/erts/test/nt_SUITE_data/nt_info.c erlang-13.b.3-dfsg/erts/test/nt_SUITE_data/nt_info.c --- erlang-13.b.1-dfsg/erts/test/nt_SUITE_data/nt_info.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/nt_SUITE_data/nt_info.c 2009-03-12 12:17:27.000000000 +0000 @@ -0,0 +1,176 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 1998-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ +/* + * This is a simple command that gives some interesting + * system information on NT. + * It is run as a port program by the nt test suite to find out priorities + * of programs etc. + */ +#include +#include +#include + +#if defined(VXWORKS) +int nt_info(int argc, char **argv){ + printf("Hello Älvsjö!\n"); + return 0; +} +#elif !defined(__WIN32__) +int main(int argc, char **argv){ + printf("Hello Älvsjö!\n"); + return 0; +} +#else /* Windows NT, here we go... */ + +#include + + +int erlang_format = 0; + +#if 0 +int last_error = 0; + +void print_last_error(void){ + char *mes; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + (last_error) ? last_error : GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &mes, + 0, + NULL ); + fprintf(stderr,"Error: %s",mes); + LocalFree(mes); +} +#endif + +typedef BOOL (WINAPI *tEnumProcesses)(DWORD *, DWORD, DWORD *); +typedef BOOL (WINAPI *tEnumProcessModules)(HANDLE, HMODULE *, DWORD, DWORD *); +typedef DWORD (WINAPI *tGetModuleBaseName)(HANDLE, HMODULE, char *, DWORD); + +static tGetModuleBaseName pGetModuleBaseName = NULL; +static tEnumProcessModules pEnumProcessModules = NULL; +static tEnumProcesses pEnumProcesses = NULL; + +static BOOL init_fpointers(void){ + HINSTANCE instance = LoadLibrary("PSAPI.DLL"); + if(instance == NULL){ + fprintf(stderr,"Failed to load PSAPI.DLL.\n"); + return FALSE; + } + if((pEnumProcesses = + (tEnumProcesses) GetProcAddress(instance,"EnumProcesses")) == + NULL){ + fprintf(stderr,"Failed to find EnumProcesses in DLL.\n"); + return FALSE; + } + if((pEnumProcessModules = + (tEnumProcessModules) GetProcAddress(instance,"EnumProcessModules")) == + NULL){ + fprintf(stderr,"Failed to find EnumProcessModules in DLL.\n"); + return FALSE; + } + if((pGetModuleBaseName = + (tGetModuleBaseName) GetProcAddress(instance,"GetModuleBaseNameA")) == + NULL){ + fprintf(stderr,"Failed to find GetModuleBaseName in DLL.\n"); + return FALSE; + } + return TRUE; +} + + +void one_line(DWORD pid){ + char pname[MAX_PATH] = "???"; + HMODULE hmod = NULL; + DWORD dummy; + DWORD priority = -1; + struct { + DWORD sym; + char *txt; + } tab[] = { + {HIGH_PRIORITY_CLASS,"high"}, + {IDLE_PRIORITY_CLASS, "idle"}, + {NORMAL_PRIORITY_CLASS,"normal"}, + {REALTIME_PRIORITY_CLASS, "realtime"} + }; + int tabsiz = sizeof(tab)/sizeof(*tab); + char *class = "???"; + int i; + + HANDLE hproc = OpenProcess(PROCESS_QUERY_INFORMATION | + PROCESS_VM_READ, + FALSE, pid ); + if(!hproc) + goto print; + if(!(*pEnumProcessModules)(hproc,&hmod,sizeof(hmod),&dummy)) + goto print; + if(!(*pGetModuleBaseName)(hproc,hmod,pname,sizeof(pname))) + goto print; + if(!(priority = GetPriorityClass(hproc))) + goto print; + for(i=0;i 1) ? "" : "\n"); + else + printf("%-32s %8lu %-9s\n", pname, pid, class); + if(hproc) + CloseHandle(hproc); + if(hmod) + CloseHandle(hmod); +} + +int do_simple_ps(void){ + DWORD procs[1024]; + DWORD num_procs; + DWORD needed; + int i; + + if(!(*pEnumProcesses)(procs,sizeof(procs),&needed)){ + fprintf(stderr,"Failed to EnumProcesses\n"); + return 1; + } + num_procs = needed / sizeof(DWORD); + if(erlang_format > 1) + printf("["); + for(i=0;i 1 && i < num_procs -1) + printf(", "); + } + if(erlang_format > 1) + printf("]. \n"); + return 0; +} + +int main(int argc, char **argv){ + if(argc>1 && !strcmp(argv[1],"-e")) + erlang_format = 1; + else if(argc>1 && !strcmp(argv[1],"-E")) + erlang_format = 2; + if(!init_fpointers()) + return 1; + return do_simple_ps(); +} +#endif diff -Nru erlang-13.b.1-dfsg/erts/test/nt_SUITE.erl erlang-13.b.3-dfsg/erts/test/nt_SUITE.erl --- erlang-13.b.1-dfsg/erts/test/nt_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/nt_SUITE.erl 2009-09-18 15:07:55.000000000 +0100 @@ -0,0 +1,551 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%% Purpose: Test NT specific utilities +-module(nt_SUITE). +-include("test_server.hrl"). +-include_lib("kernel/include/file.hrl"). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2,nt/1,handle_eventlog/2, + middleman/1,service_basic/1, service_env/1, user_env/1, synced/1, + service_prio/1, + logout/1, debug/1, restart/1, restart_always/1,stopaction/1, + shutdown_io/0,do_shutdown_io/0]). +-define(TEST_TIMEOUT, ?t:seconds(180)). + +-define(TEST_SERVICES, [1,2,3,4,5,6,7,8,9,10,11]). + +all(suite) -> + case os:type() of + {win32,nt} -> + [nt, service_basic, service_env, user_env, synced, service_prio, + logout, debug, + restart, restart_always, stopaction]; + _ -> [nt] %%% Just to give a little hint why they are skipped... + end. + +init_per_testcase(_Func, Config) -> + Dog = test_server:timetrap(?TEST_TIMEOUT), + [{watchdog, Dog} | Config]. + +fin_per_testcase(_Func, Config) -> + lists:foreach(fun(X) -> + catch remove_service("test_service_" ++ + integer_to_list(X)) end, + ?TEST_SERVICES), + Dog = ?config(watchdog, Config), + catch test_server:timetrap_cancel(Dog), + ok. + +erlsrv() -> + os:find_executable(erlsrv). + + +recv_prog_output(Port) -> + receive + {Port, {data, {eol,Data}}} -> + %%io:format("Got data: ~s~n", [Data]), + [ Data | recv_prog_output(Port)]; + _X -> + %%io:format("Got data: ~p~n", [_X]), + Port ! {self(), close}, + receive + _ -> + [] + end + end. + + +%%% X == parameters to erlsrv +%%% returns command output without stderr +do_command(X) -> + %%io:format("Command: ~s~n", [erlsrv() ++ " " ++ X]), + Port = open_port({spawn, erlsrv() ++ " " ++ X}, [stream, {line, 100}, eof, in]), + Res = recv_prog_output(Port), + case Res of + [] -> + failed; + _Y -> + %%io:format("~p~n",[_Y]), + ok + end. + + +create_service(Name) -> + ok = do_command("add " ++ Name). + +start_service(Name) -> + ok = do_command("start " ++ Name). + +stop_service(Name) -> + ok = do_command("stop " ++ Name). + +remove_service(Name) -> + ok = do_command("remove " ++ Name). +do_wait_for_it(_,0) -> + false; +do_wait_for_it(FullName,N) -> + case net_adm:ping(FullName) of + pong -> + true; + _ -> + receive + after 1000 -> + do_wait_for_it(FullName,N-1) + end + end. + +wait_for_node(Name) -> + FullName = make_full_name(Name), + do_wait_for_it(FullName,30). + +make_full_name(Name) -> + [_,Suffix] = string:tokens(atom_to_list(node()),"@"), + list_to_atom(Name ++ "@" ++ Suffix). + + +%%% The following tests are only run on NT: + +service_basic(doc) -> + ["Check some basic (cosmetic) service parameters"]; +service_basic(suite) -> []; +service_basic(Config) when is_list(Config) -> + ?line Name = "test_service_20", + ?line IntName = Name++"_internal", + ?line Service = [{servicename,Name}, + {args, ["-setcookie", + atom_to_list(erlang:get_cookie())]}, + {internalservicename,IntName}, + {comment,"Epic comment"}], + ?line ok = erlsrv:store_service(Service), + ?line start_service(Name), + ?line true = wait_for_node(Name), + ?line S2 = erlsrv:get_service(Name), + ?line {value,{comment,"Epic comment"}} = lists:keysearch(comment,1,S2), + ?line {value,{internalservicename,IntName}} = + lists:keysearch(internalservicename,1,S2), + ?line S3 = lists:keyreplace(comment,1,S2,{comment,"Basic comment"}), + ?line S4 = lists:keyreplace(internalservicename,1,S3, + {internalservicename,"WillNotHappen"}), + ?line ok = erlsrv:store_service(S4), + ?line S5 = erlsrv:get_service(Name), + ?line {value,{comment,"Basic comment"}} = lists:keysearch(comment,1,S5), + ?line {value,{internalservicename,IntName}} = + lists:keysearch(internalservicename,1,S5), + ?line NewName = "test_service_21", + ?line S6 = erlsrv:new_service(NewName,S5,[]), % should remove + % internalservicename + ?line ok = erlsrv:store_service(S6), + ?line S7 = erlsrv:get_service(NewName), + ?line {value,{comment,"Basic comment"}} = lists:keysearch(comment,1,S7), + ?line {value,{internalservicename,[$t,$e,$s,$t | _]}} = + lists:keysearch(internalservicename,1,S7), + ?line remove_service(Name), + ?line remove_service(NewName), + ok. + +service_env(doc) -> + ["Check that service name and executable is in the environment of the " ++ + "erlang process created by erlsrv."]; +service_env(suite) -> []; +service_env(Config) when is_list(Config) -> + ?line Name = "test_service_2", + ?line Service = [{servicename,Name}, + {args, ["-setcookie", + atom_to_list(erlang:get_cookie())]}], + ?line ok = erlsrv:store_service(Service), + ?line start_service(Name), + ?line true = wait_for_node(Name), + ?line Name = rpc:call(make_full_name(Name),os,getenv, + ["ERLSRV_SERVICE_NAME"]), + ?line "erlsrv.exe" = filename:basename( + hd( + string:tokens( + rpc:call(make_full_name(Name), + os, + getenv, + ["ERLSRV_EXECUTABLE"]), + "\""))), + ?line remove_service(Name), + ok. +user_env(doc) -> + ["Check that the user defined environment is ADDED to the service's"++ + " normal dito."]; +user_env(suite) -> []; +user_env(Config) when is_list(Config) -> + ?line Name = "test_service_3", + ?line Service = [{servicename,Name},{env,[{"HUBBA","BUBBA"}]}, + {args, ["-setcookie", + atom_to_list(erlang:get_cookie())]}], + ?line ok = erlsrv:store_service(Service), + ?line start_service(Name), + ?line true = wait_for_node(Name), + ?line true = rpc:call(make_full_name(Name),os,getenv, + ["SystemDrive"]) =/= false, + ?line "BUBBA" = rpc:call(make_full_name(Name),os,getenv,["HUBBA"]), + ?line remove_service(Name), + ok. +synced(doc) -> + ["Check that services are stopped and started syncronous and that"++ + " failed stopactions kill the erlang machine anyway."]; +synced(suite) -> []; +synced(Config) when is_list(Config) -> + ?line Name0 = "test_service_4", + ?line Service0 = [{servicename,Name0}, + {machine, "N:\\nickeNyfikenPaSjukhus"}], + ?line ok = erlsrv:store_service(Service0), + ?line true = (catch start_service(Name0)) =/= ok, + ?line remove_service(Name0), + ?line Name = "test_service_5", + ?line Service = [{servicename,Name}, + {stopaction,"erlang:info(garbage_collection)."}, + {args, ["-setcookie", + atom_to_list(erlang:get_cookie())]}], + ?line ok = erlsrv:store_service(Service), + ?line start_service(Name), + ?line true = wait_for_node(Name), + ?line T1 = calendar:datetime_to_gregorian_seconds( + calendar:universal_time()), + ?line stop_service(Name), + ?line Diff1 = calendar:datetime_to_gregorian_seconds( + calendar:universal_time()) - T1, + ?line true = Diff1 > 30, + ?line start_service(Name), + ?line true = wait_for_node(Name), + ?line T2 = calendar:datetime_to_gregorian_seconds( + calendar:universal_time()), + ?line remove_service(Name), + ?line Diff2 = calendar:datetime_to_gregorian_seconds( + calendar:universal_time()) - T2, + ?line true = Diff2 > 30, + ok. +service_prio(doc) -> + ["Check that a service with higher prio create port programs with " + "higher prio."]; +service_prio(suite) -> []; +service_prio(Config) when is_list(Config) -> + ?line Name = "test_service_6", + ?line Service = [{servicename,Name},{prio,"high"}, + {env, [{"HEART_COMMAND","echo off"}]}, + {args, ["-setcookie", + atom_to_list(erlang:get_cookie()), + "-heart"]}], + ?line ok = erlsrv:store_service(Service), + ?line {ok, OldProcs} = get_current_procs(Config), + ?line start_service(Name), + ?line {ok, NewProcs} = get_current_procs(Config), + ?line remove_service(Name), + ?line Diff = arrived_procs(OldProcs,NewProcs), + %% Not really correct, could fail if another heart is + %% started at the same time... + ?line {value, {"heart.exe",_,"high"}} = + lists:keysearch("heart.exe",1,Diff), + ok. +logout(doc) -> + ["Check that logout does not kill services"]; +logout(suite) -> []; +logout(Config) when is_list(Config) -> + ?line {comment, "Have to be run manually by registering a service with " ++ + "heart, logout and log in again and then examine that the heart " ++ + "process id is not changed."}. +debug(doc) -> + ["Check the debug options to erlsrv."]; +debug(suite) -> []; +debug(Config) when is_list(Config) -> + ?line Name0 = "test_service_7", + + %% We used to set the privdir as temporary directory, but for some + %% reason we don't seem to have write access to that directory, + %% so we'll use the directory specified in the next line. + ?line TempDir = "C:/TEMP", + ?line Service0 = [{servicename,Name0}, + {workdir,filename:nativename(TempDir)}, + {debugtype,"reuse"}, + {args, ["-setcookie", + atom_to_list(erlang:get_cookie())]}], + ?line ok = erlsrv:store_service(Service0), + ?line T1 = calendar:datetime_to_gregorian_seconds( + calendar:local_time()), + %% sleep a little + ?line receive after 2000 -> ok end, + ?line start_service(Name0), + ?line true = wait_for_node(Name0), + ?line LF = filename:join(TempDir, Name0++".debug"), + ?line {ok,Info0} = file:read_file_info(LF), + ?line T2 = calendar:datetime_to_gregorian_seconds( + Info0#file_info.mtime), + ?line true = T2 > T1, + ?line remove_service(Name0), + ?line file:delete(LF), + ?line Name1 = "test_service_8", + ?line Service1 = [{servicename,Name1}, + {workdir, filename:nativename(TempDir)}, + {debugtype,"new"}, + {args, ["-setcookie", + atom_to_list(erlang:get_cookie())]}], + ?line ok = erlsrv:store_service(Service1), + ?line T3 = calendar:datetime_to_gregorian_seconds( + calendar:local_time()), + %% sleep a little + ?line receive after 2000 -> ok end, + ?line NF = next_logfile(TempDir, Name1), + ?line start_service(Name1), + ?line true = wait_for_node(Name1), + ?line {ok,Info1} = file:read_file_info(NF), + ?line T4 = calendar:datetime_to_gregorian_seconds( + Info1#file_info.mtime), + ?line true = T4 > T3, + ?line remove_service(Name1), + ?line file:delete(NF), + ok. + +restart(doc) -> + ["Check the restart options to erlsrv"]; +restart(suite) -> []; +restart(Config) when is_list(Config) -> + ?line Name = "test_service_9", + ?line Service = [{servicename,Name}, + {workdir, filename:nativename(logdir(Config))}, + {onfail,"restart"}, + {args, ["-setcookie", + atom_to_list(erlang:get_cookie())]}], + ?line ok = erlsrv:store_service(Service), + ?line start_service(Name), + ?line true = wait_for_node(Name), + ?line receive after 20000 -> ok end, + ?line rpc:call(make_full_name(Name),erlang,halt,[]), + ?line receive after 1000 -> ok end, + ?line true = wait_for_node(Name), + ?line rpc:call(make_full_name(Name),erlang,halt,[]), + ?line receive after 1000 -> ok end, + ?line false = wait_for_node(Name), + ?line remove_service(Name), + ok. + +restart_always(doc) -> + ["Check the restart options to erlsrv"]; +restart_always(suite) -> []; +restart_always(Config) when is_list(Config) -> + ?line Name = "test_service_10", + ?line Service = [{servicename,Name}, + {workdir, filename:nativename(logdir(Config))}, + {onfail,"restart_always"}, + {args, ["-setcookie", + atom_to_list(erlang:get_cookie())]}], + ?line ok = erlsrv:store_service(Service), + ?line start_service(Name), + ?line true = wait_for_node(Name), + ?line rpc:call(make_full_name(Name),erlang,halt,[]), + ?line receive after 1000 -> ok end, + ?line true = wait_for_node(Name), + ?line rpc:call(make_full_name(Name),erlang,halt,[]), + ?line receive after 1000 -> ok end, + ?line true = wait_for_node(Name), + ?line remove_service(Name), + ok. +stopaction(doc) -> + ["Check that stopaction does not hang output while shutting down"]; +stopaction(suite) -> []; +stopaction(Config) when is_list(Config) -> + ?line Name = "test_service_11", + %% Icky, I prepend the first element in the codepath, cause + %% I "suppose" it's the one to where I am. + ?line Service = [{servicename,Name}, + {stopaction,atom_to_list(?MODULE) ++ ":shutdown_io()."}, + {args, ["-setcookie", + atom_to_list(erlang:get_cookie()), + "-pa", hd(code:get_path())]}], + ?line ok = erlsrv:store_service(Service), + ?line start_service(Name), + ?line true = wait_for_node(Name), + ?line T1 = calendar:datetime_to_gregorian_seconds( + calendar:universal_time()), + ?line stop_service(Name), + ?line Diff1 = calendar:datetime_to_gregorian_seconds( + calendar:universal_time()) - T1, + ?line true = Diff1 < 30, + ?line remove_service(Name), + ok. + + +%%% This test is run on all platforms, but just gives a comment on +%%% other platforms than NT. + +nt(doc) -> + ["Run NT specific tests."]; +nt(suite) -> + []; +nt(Config) when is_list(Config) -> + case os:type() of + {win32,nt} -> + nt_run(); + _ -> + {skipped, "This test case is intended for Win NT only."} + end. + + +nt_run() -> + ?line start_all(), + ?line create_service("test_service_1"), + ?line R = start_look_for_single("System","ErlSrv","Informational", + ".*test_service_1.*started.*"), + ?line start_service("test_service_1"), + ?line Res = look_for_single(R), + ?line io:format("Result from eventlog: ~p~n", + [Res]), + ?line remove_service("test_service_1"), + ?line stop_all(), + ok. + +start_all() -> + Pid1 = spawn_link(?MODULE,middleman,[[]]), + register(?MODULE,Pid1), + _Pid2 = nteventlog:start("log_testing", + {?MODULE,handle_eventlog,[Pid1]}). + +stop_all() -> + ?MODULE ! stop, + nteventlog:stop(). + +start_look_for_single(Cat,Fac,Sev,MessRE) -> + Ref = make_ref(), + ?MODULE ! {lookfor, {self(), Ref, {Cat,Fac,Sev,MessRE}}}, + Ref. + +look_for_single(Ref) -> + receive + {Ref,Time,Mes} -> + {Time,Mes} + after 60000 -> + timeout + end. + + +%%% Mes = {Time,Category,Facility,Severity,Message} +handle_eventlog(Mes,Pid) -> + Pid ! Mes. + +%%% Waitfor = [{Pid, Ref, {Category,Facility,Severity,MessageRE}} ...] +middleman(Waitfor) -> + receive + {Time,Category,Facility,Severity,Message} -> + io:format("Middleman got ~s...", [Message]), + case match_event({Time,Category,Facility,Severity,Message}, + Waitfor) of + {ok, {Pid,Ref,Time,Mes}, Rest} -> + io:format("matched~n"), + Pid ! {Ref,Time,Mes}, + middleman(Rest); + _ -> + io:format("no match~n"), + middleman(Waitfor) + end; + {lookfor, X} -> + io:format("Middleman told to look for ~p~n", [X]), + middleman([X|Waitfor]); + stop -> + stopped; + _ -> + middleman(Waitfor) + end. + + +%%% Matches events, not tail recursive. +match_event(_X, []) -> + nomatch; +match_event({Time,Cat,Fac,Sev,Mes},[{Pid,Ref,{Cat,Fac,Sev,MesRE}} | Tail]) -> + case regexp:match(Mes,MesRE) of + {match,_,_} -> + %%io:format("Match!~n"), + {ok,{Pid,Ref,Time,Mes},Tail}; + _Z -> + %%io:format("No match (~p)~n",[_Z]), + case match_event({Time,Cat,Fac,Sev,Mes},Tail) of + {ok,X,Rest} -> + {ok,X,[{Pid,Ref,{Cat,Fac,Sev,MesRE}} | Rest]}; + X -> + X + end + end; +match_event(X,[Y | T]) -> + %%io:format("X == ~p, Y == ~p~n",[X,Y]), + case match_event(X,T) of + {ok,Z,R} -> + {ok,Z,[Y|R]}; + XX -> + XX + end. + +arrived_procs(_,[]) -> + []; +arrived_procs(OldProcs,[{Executable, Pid, Priority} | TNewProcs]) -> + case lists:keysearch(Pid,2,OldProcs) of + {value, _} -> + arrived_procs(OldProcs, TNewProcs); + false -> + [{Executable, Pid, Priority} | arrived_procs(OldProcs, TNewProcs)] + end. + + +get_current_procs(Config) -> + ?line P = open_port({spawn,nt_info(Config) ++ " -E"}, + [{line,10000}]), + ?line L = receive + {P,{data,{eol,D}}} -> + D; + _ -> "error. " + end, + ?line P ! {self(), close}, + ?line receive + {P, closed} -> ok + end, + ?line {done,{ok,Tok,_},_} = erl_scan:tokens([],L,0), + ?line erl_parse:parse_term(Tok). + +nt_info(Config) when is_list(Config) -> + ?line filename:join(?config(data_dir, Config), "nt_info"). + + +logdir(Config) -> + ?line ?config(priv_dir, Config). + +look_for_next(Template,L,N) -> + ?line FN = Template ++ integer_to_list(N), + ?line case lists:member(FN,L) of + true -> + ?line look_for_next(Template,L,N+1); + false -> + ?line FN + end. + +next_logfile(LD, Servicename) -> + ?line {ok, Files} = file:list_dir(LD), + ?line Ftmpl = Servicename ++ ".debug.", + ?line filename:join(LD,look_for_next(Ftmpl,Files,1)). + +%%% Functions run by the service + +do_shutdown_io() -> + receive + after 2000 -> + io:format("IO in shutting down...~n"), + erlang:halt() + end. + +shutdown_io() -> + spawn(?MODULE,do_shutdown_io,[]). diff -Nru erlang-13.b.1-dfsg/erts/test/otp_SUITE.erl erlang-13.b.3-dfsg/erts/test/otp_SUITE.erl --- erlang-13.b.1-dfsg/erts/test/otp_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/otp_SUITE.erl 2009-03-12 12:17:24.000000000 +0000 @@ -0,0 +1,297 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(otp_SUITE). + +-export([all/1,init_per_suite/1,end_per_suite/1]). +-export([undefined_functions/1,deprecated_not_in_obsolete/1, + obsolete_but_not_deprecated/1,call_to_deprecated/1, + call_to_size_1/1,strong_components/1]). + +-include("test_server.hrl"). +-import(lists, [filter/2,foldl/3,foreach/2]). + +all(suite) -> + [undefined_functions,deprecated_not_in_obsolete, + obsolete_but_not_deprecated,call_to_deprecated, + call_to_size_1,strong_components]. + +init_per_suite(Config) -> + Dog = test_server:timetrap(?t:minutes(10)), + Root = code:root_dir(), + Server = daily_xref, + ?line xref:start(Server), + ?line xref:set_default(Server, [{verbose,false}, + {warnings,false}, + {builtins,true}]), + ?line {ok,_Relname} = xref:add_release(Server, Root, {name,otp}), + + %% If we are running the tests in the source tree, the ERTS application + %% is not in the code path. We must add it explicitly. + case code:lib_dir(erts) of + {error,bad_name} -> + Erts = filename:join([code:root_dir(),"erts","preloaded","ebin"]), + ?line {ok,_} = xref:add_directory(Server, Erts, []); + _ -> + ok + end, + + ?line ?t:timetrap_cancel(Dog), + [{xref_server,Server}|Config]. + +end_per_suite(Config) -> + Server = ?config(xref_server, Config), + catch xref:stop(Server), + Config. + +undefined_functions(Config) when is_list(Config) -> + Server = ?config(xref_server, Config), + + %% Exclude calls from generated modules in the SSL application. + ExcludeFrom = "SSL-PKIX|PKIX.*|ssl_pkix_oid", + ?line UndefS = xref_base:analysis(undefined_function_calls), + ?line Q = io_lib:format("Undef = ~s," + "ExcludedFrom = ~p:_/_," + "Undef - Undef | ExcludedFrom", + [UndefS,ExcludeFrom]), + ?line {ok,Undef0} = xref:q(Server, lists:flatten(Q)), + ?line Undef1 = hipe_filter(Undef0), + ?line Undef2 = ssl_crypto_filter(Undef1), + ?line Undef3 = edoc_filter(Undef2), + ?line Undef = eunit_filter(Undef3), + ?line Undef = megaco_filter(Undef), + + case Undef of + [] -> ok; + _ -> + foreach(fun ({MFA1,MFA2}) -> + io:format("~s calls undefined ~s", + [format_mfa(MFA1),format_mfa(MFA2)]) + end, Undef), + ?line ?t:fail({length(Undef),undefined_functions_in_otp}) + + end, + + ok. + +hipe_filter(Undef) -> + case erlang:system_info(hipe_architecture) of + undefined -> + filter(fun ({_,{hipe_bifs,_,_}}) -> false; + ({_,{hipe,_,_}}) -> false; + ({_,{hipe_consttab,_,_}}) -> false; + ({_,{hipe_converters,_,_}}) -> false; + ({{code,_,_},{Mod,_,_}}) -> + not is_hipe_module(Mod); + ({{code_server,_,_},{Mod,_,_}}) -> + not is_hipe_module(Mod); + ({{compile,_,_},{Mod,_,_}}) -> + not is_hipe_module(Mod); + ({{hipe,_,_},{Mod,_,_}}) -> + %% See comment for the next clause. + not is_hipe_module(Mod); + ({{cerl_to_icode,translate_flags1,2}, + {hipe_rtl_arch,endianess,0}}) -> + false; + ({{Caller,_,_},{Callee,_,_}}) -> + %% Part of the hipe application is here + %% for the sake of Dialyzer. There are many + %% undefined calls within the hipe application. + not is_hipe_module(Caller) orelse + not is_hipe_module(Callee); + (_) -> true + end, Undef); + _Arch -> + filter(fun ({{Mod,_,_},{hipe_bifs,write_u64,2}}) -> + %% Unavailable except in 64 bit AMD. Ignore it. + not is_hipe_module(Mod); + (_) -> true + end, Undef) + end. + +is_hipe_module(Mod) -> + case atom_to_list(Mod) of + "hipe_"++_ -> true; + _ -> false + end. + +ssl_crypto_filter(Undef) -> + case {code:lib_dir(crypto),code:lib_dir(ssl)} of + {{error,bad_name},{error,bad_name}} -> + filter(fun({_,{ssl,_,_}}) -> false; + ({_,{crypto,_,_}}) -> false; + (_) -> true + end, Undef); + {_,_} -> Undef + end. + +edoc_filter(Undef) -> + %% Filter away function call that is catched. + filter(fun({{edoc_lib,uri_get_http,1},{http,request_sync,2}}) -> false; + (_) -> true + end, Undef). + +eunit_filter(Undef) -> + filter(fun({{eunit_test,wrapper_test_exported_,0}, + {eunit_test,nonexisting_function,0}}) -> false; + (_) -> true + end, Undef). + +megaco_filter(Undef) -> + %% Intentional calls to undefined functions. + filter(fun({{megaco_compact_text_encoder,encode_action_reply,3}, + {megaco_compact_text_encoder_v3,encode_action_reply,2}}) -> false; + ({{megaco_compact_text_encoder,encode_action_request,3}, + {megaco_compact_text_encoder_v3,encode_action_request,2}}) -> false; + ({{megaco_compact_text_encoder,encode_action_requests,3}, + {megaco_compact_text_encoder_v3,encode_action_requests,2}}) -> false; + ({{megaco_compact_text_encoder,encode_command_request,3}, + {megaco_compact_text_encoder_v3,encode_command_request,2}}) -> false; + ({{megaco_compact_text_encoder,encode_message,3}, + {megaco_compact_text_encoder_v3,encode_message,2}}) -> false; + ({{megaco_compact_text_encoder,encode_transaction,3}, + {megaco_compact_text_encoder_v3,encode_transaction,2}}) -> false; + ({{megaco_pretty_text_encoder,encode_action_reply,3}, + {megaco_pretty_text_encoder_v3,encode_action_reply,2}}) -> false; + ({{megaco_pretty_text_encoder,encode_action_request,3}, + {megaco_pretty_text_encoder_v3,encode_action_request,2}}) -> false; + ({{megaco_pretty_text_encoder,encode_action_requests,3}, + {megaco_pretty_text_encoder_v3,encode_action_requests,2}}) -> false; + ({{megaco_pretty_text_encoder,encode_command_request,3}, + {megaco_pretty_text_encoder_v3,encode_command_request,2}}) -> false; + ({{megaco_pretty_text_encoder,encode_message,3}, + {megaco_pretty_text_encoder_v3,encode_message,2}}) -> false; + ({{megaco_pretty_text_encoder,encode_transaction,3}, + {megaco_pretty_text_encoder_v3,encode_transaction,2}}) -> false; + (_) -> true + end, Undef). + +deprecated_not_in_obsolete(Config) when is_list(Config) -> + ?line Server = ?config(xref_server, Config), + ?line {ok,DeprecatedFunctions} = xref:q(Server, "DF"), + + ?line L = foldl(fun({M,F,A}=MFA, Acc) -> + case otp_internal:obsolete(M, F, A) of + no -> [MFA|Acc]; + _ -> Acc + end + end, [], DeprecatedFunctions), + case L of + [] -> ok; + _ -> + io:put_chars("The following functions have -deprecated() attributes,\n" + "but are not listed in otp_internal:obsolete/3.\n"), + ?line print_mfas(L), + ?line ?t:fail({length(L),deprecated_but_not_obsolete}) + end. + +obsolete_but_not_deprecated(Config) when is_list(Config) -> + ?line Server = ?config(xref_server, Config), + ?line {ok,NotDeprecated} = xref:q(Server, "X - DF"), + + ?line L = foldl(fun({M,F,A}=MFA, Acc) -> + case otp_internal:obsolete(M, F, A) of + no -> Acc; + _ -> [MFA|Acc] + end + end, [], NotDeprecated), + + case L of + [] -> ok; + _ -> + io:put_chars("The following functions are listed " + "in otp_internal:obsolete/3,\n" + "but don't have -deprecated() attributes.\n"), + ?line print_mfas(L), + ?line ?t:fail({length(L),obsolete_but_not_deprecated}) + end. + + +call_to_deprecated(Config) when is_list(Config) -> + Server = ?config(xref_server, Config), + ?line {ok,DeprecatedCalls} = xref:q(Server, "strict(E || DF)"), + foreach(fun ({MFA1,MFA2}) -> + io:format("~s calls deprecated ~s", + [format_mfa(MFA1),format_mfa(MFA2)]) + end, DeprecatedCalls), + {comment,integer_to_list(length(DeprecatedCalls))++" calls to deprecated functions"}. + +call_to_size_1(Config) when is_list(Config) -> + Server = ?config(xref_server, Config), + + %% Applications that do not call erlang:size/1: + Apps = [compiler,debugger,kernel,observer,parsetools, + runtime_tools,stdlib,tools,webtool], + + Fs = [{erlang,size,1}], + + Q1 = io_lib:format("E || ~p : Fun", [Fs]), + ?line {ok,AllCallsToSize1} = xref:q(Server, lists:flatten(Q1)), + + Q2 = io_lib:format("E | ~p : App || ~p : Fun", [Apps,Fs]), + ?line {ok,CallsToSize1} = xref:q(Server, lists:flatten(Q2)), + + case CallsToSize1 of + [] -> + ok; + _ -> + io:format("These calls cause an error:~n"), + foreach(fun ({MFA1,MFA2}) -> + io:format("~s calls soon to be deprecated ~s", + [format_mfa(MFA1),format_mfa(MFA2)]) + end, CallsToSize1) + end, + + %% Enumerate calls to erlang:size/1 from other applications than + %% the ones known not to call erlang:size/1: + case AllCallsToSize1--CallsToSize1 of + [] -> + ok; + Calls -> + io:format("~n~nThese calls do not cause an error (yet):~n"), + foreach(fun ({MFA1,MFA2}) -> + io:format("~s calls soon to be deprecated ~s", + [format_mfa(MFA1),format_mfa(MFA2)]) + end, Calls) + end, + case CallsToSize1 of + [] -> + ok; + _ -> + ?line ?t:fail({length(CallsToSize1),calls_to_size_1}) + end. + +strong_components(Config) when is_list(Config) -> + Server = ?config(xref_server, Config), + ?line {ok,Cs} = xref:q(Server, "components AE"), + io:format("\n\nStrong components:\n\n~p\n", [Cs]), + ok. + +%%% +%%% Common help functions. +%%% + + +print_mfas([MFA|T]) -> + io:format("~s\n", [format_mfa(MFA)]), + print_mfas(T); +print_mfas([]) -> ok. + +format_mfa({M,F,A}) -> + lists:flatten(io_lib:format("~s:~s/~p", [M,F,A])). diff -Nru erlang-13.b.1-dfsg/erts/test/run_erl_SUITE_data/defuncter.pl erlang-13.b.3-dfsg/erts/test/run_erl_SUITE_data/defuncter.pl --- erlang-13.b.1-dfsg/erts/test/run_erl_SUITE_data/defuncter.pl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/run_erl_SUITE_data/defuncter.pl 2009-03-12 12:17:27.000000000 +0000 @@ -0,0 +1,31 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2006-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +$SIG{HUP} = 'IGNORE'; +if (fork() == 0) { + print "child\n"; + my $i = 0; + for (;;) { + sleep(5); + print $i++, "\n"; + } +} else { + print "hejsan\n"; + exit(1); +} diff -Nru erlang-13.b.1-dfsg/erts/test/run_erl_SUITE_data/run_erl_test.pl erlang-13.b.3-dfsg/erts/test/run_erl_SUITE_data/run_erl_test.pl --- erlang-13.b.1-dfsg/erts/test/run_erl_SUITE_data/run_erl_test.pl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/run_erl_SUITE_data/run_erl_test.pl 2009-03-12 12:17:27.000000000 +0000 @@ -0,0 +1,41 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2006-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +my $run_erl = shift; +my $defuncter = shift; +my $pipe = shift; +my $log_dir = shift; +my $cmd = "run_erl $pipe $log_dir \"$^X $defuncter\""; +my $pid; + +if (($pid = fork()) == 0) { + #print join(" ", $run_erl, $pipe, $log_dir, "$^X $defuncter"); + exec($run_erl, $pipe, $log_dir, "$^X $defuncter"); + die "ERROR: exec failed: $!\n"; +} elsif ($pid > 0) { + sleep(1); + my $res = waitpid($pid, 0); + if ($res == $pid) { + print "OK\n"; + exit(0); + } + die "ERROR: waitpid($pid, 0) returned $res\n"; +} else { + die "ERROR: fork() failed: $!\n"; +} diff -Nru erlang-13.b.1-dfsg/erts/test/run_erl_SUITE.erl erlang-13.b.3-dfsg/erts/test/run_erl_SUITE.erl --- erlang-13.b.1-dfsg/erts/test/run_erl_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/run_erl_SUITE.erl 2009-03-12 12:17:24.000000000 +0000 @@ -0,0 +1,270 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(run_erl_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + basic/1,heavy/1,heavier/1,defunct/1]). +-export([ping_me_back/1]). + +-include("test_server.hrl"). + +init_per_testcase(_Case, Config) -> + Dog = ?t:timetrap(?t:minutes(2)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +all(suite) -> + [basic,heavy,heavier,defunct]. + +basic(Config) when is_list(Config) -> + case os:type() of + {unix,_} -> basic_1(Config); + _ -> {skip,"Not Unix"} + end. + +basic_1(Config) -> + ?line {Node,Pipe} = do_run_erl(Config, "basic"), + + ?line ToErl = open_port({spawn,"to_erl "++Pipe}, []), + ?line erlang:port_command(ToErl, "halt().\r\n"), + + receive + {nodedown,Node} -> + ?line io:format("Down: ~p\n", [Node]) + after 10000 -> + ?line ?t:fail() + end, + + ok. + +heavy(Config) when is_list(Config) -> + case os:type() of + {unix,_} -> heavy_1(Config); + _ -> {skip,"Not Unix"} + end. + +heavy_1(Config) -> + ?line {Node,Pipe} = do_run_erl(Config, "heavy"), + + ?line ToErl = open_port({spawn,"to_erl "++Pipe}, []), + IoFormat = "io:format(\"~s\n\", [lists:duplicate(10000, 10)]).\r\n", + ?line erlang:port_command(ToErl, IoFormat), + ?line erlang:port_command(ToErl, IoFormat), + ?line erlang:port_command(ToErl, IoFormat), + ?line erlang:port_command(ToErl, "init:stop().\r\n"), + + receive + {nodedown,Node} -> + ?line io:format("Down: ~p\n", [Node]) + after 10000 -> + ?line ?t:fail() + end, + + ?line case count_new_lines(ToErl, 0) of + Nls when Nls > 30000 -> + ok; + Nls -> + ?line io:format("new_lines: ~p\n", [Nls]), + ?line ?t:fail() + end. + + +ping_me_back([Node]) when is_atom(Node) -> + net_adm:ping(Node); +ping_me_back([Node]) -> + net_adm:ping(list_to_atom(Node)). + +count_new_lines(P, N) -> + receive + {P,{data,S}} -> + count_new_lines(P, count_new_lines_1(S, N)) + after 0 -> + N + end. + +count_new_lines_1([$\n|T], N) -> + count_new_lines_1(T, N+1); +count_new_lines_1([_|T], N) -> + count_new_lines_1(T, N); +count_new_lines_1([], N) -> N. + +heavier(Config) when is_list(Config) -> + case os:type() of + {unix,_} -> heavier_1(Config); + _ -> {skip,"Not Unix"} + end. + +heavier_1(Config) -> + ?line {Node,Pipe} = do_run_erl(Config, "heavier"), + + ?line ToErl = open_port({spawn,"to_erl "++Pipe}, []), + io:format("ToErl = ~p\n", [ToErl]), + X = 1, + Y = 555, + Z = 42, + ?line random:seed(X, Y, Z), + SeedCmd = lists:flatten(io_lib:format("random:seed(~p, ~p, ~p). \r\n", + [X,Y,Z])), + ?line io:format("~p\n", [SeedCmd]), + ?line erlang:port_command(ToErl, SeedCmd), + + Iter = 1000, + MaxLen = 2048, + + Random = "f(F), "++ + "F = fun(F,0) -> ok; "++ + "(F,N) -> " ++ + "io:format(\"\\\"~s\\\"~n\","++ + "[[35|[random:uniform(25)+65 || " ++ + "_ <- lists:seq(1, "++ + "random:uniform("++ + integer_to_list(MaxLen)++ + "))]]]), "++ + "F(F,N-1) "++ + "end,"++ + "F(F,"++integer_to_list(Iter)++")."++" \r\n", + + + ?line io:format("~p\n", [Random]), + ?line erlang:port_command(ToErl, Random), + + %% Finish. + + ?line erlang:port_command(ToErl, "init:stop().\r\n"), + ?line receive_all(Iter, ToErl, MaxLen), + receive + {nodedown,Node} -> + ?line io:format("Down: ~p\n", [Node]) + after 10000 -> + ?line c:flush(), + ?line ?t:fail() + end, + + ok. + +receive_all(Iter, ToErl, MaxLen) -> + receive_all_1(Iter, [], ToErl, MaxLen). + +receive_all_1(0, _, _, _) -> ok; +receive_all_1(Iter, Line, ToErl, MaxLen) -> + NumChars = random:uniform(MaxLen), + Pattern = [random:uniform(25)+65 || _ <- lists:seq(1, NumChars)], + receive_all_2(Iter, {NumChars,Pattern}, Line, ToErl, MaxLen). + + +receive_all_2(Iter, {NumChars,Pattern}, Line0, ToErl, MaxLen) -> + case receive_match(Line0, {NumChars,Pattern}) of + {match,Line} -> + %%io:format("Match: ~p\n", [Line]), + receive_all_1(Iter-1, Line, ToErl, MaxLen); + {nomatch,Line} -> + %%io:format("NoMatch: ~p\n", [Line]), + receive + {ToErl,{data,S}} -> + %%io:format("Recv: ~p\n", [S]), + receive_all_2(Iter, {NumChars,Pattern}, Line++S, ToErl, MaxLen) + after 10000 -> + io:format("Timeout waiting for\n~p\ngot\n~p\n", + [Pattern, Line]), + ?line ?t:fail() + end + end. + + +receive_match("\"#"++T, {NumChars,Pattern}) when length(T) >= NumChars -> + Match = lists:sublist(T, NumChars), + io:format("match candidate: ~p\n", [Match]), + Match = Pattern, + {match,lists:nthtail(NumChars, T)}; +receive_match("\"#"++T, _) -> + {nomatch,"\"#"++T}; +receive_match("\""=Line, _) -> + {nomatch,Line}; +receive_match([_|T], Tpl) -> + receive_match(T, Tpl); +receive_match(Line, _) -> + {nomatch,Line}. + + +defunct(Config) when is_list(Config) -> + case os:type() of + {unix,_} -> defunct_1(Config); + _ -> {skip,"Not Unix"} + end. + +defunct_1(Config) -> + case os:find_executable(perl) of + false -> + {skip,"No perl found"}; + Perl -> + defunct_2(Config, Perl) + end. + +defunct_2(Config, Perl) -> + ?line Data = ?config(data_dir, Config), + ?line RunErlTest = filename:join(Data, "run_erl_test.pl"), + ?line Defuncter = filename:join(Data, "defuncter.pl"), + ?line Priv = ?config(priv_dir, Config), + ?line LogDir = filename:join(Priv, "defunct"), + ?line ok = file:make_dir(LogDir), + ?line Pipe = LogDir ++ "/", + ?line RunErl = os:find_executable(run_erl), + ?line Cmd = Perl ++ " " ++ RunErlTest ++ " " ++ RunErl ++ " " ++ + Defuncter ++ " " ++ Pipe ++ " " ++ LogDir, + ?line io:format("~p", [Cmd]), + ?line Res = os:cmd(Cmd), + ?line io:format("~p\n", [Res]), + "OK"++_ = Res, + ok. + +%%% Utilities. + +do_run_erl(Config, Case) -> + ?line Priv = ?config(priv_dir, Config), + ?line LogDir = filename:join(Priv, Case), + ?line ok = file:make_dir(LogDir), + ?line Pipe = LogDir ++ "/", + ?line NodeName = "run_erl_node_" ++ Case, + ?line Cmd = "run_erl "++Pipe++" "++LogDir++" \"erl -sname " ++ NodeName ++ + " -pa " ++ filename:dirname(code:which(?MODULE)) ++ + " -s " ++ ?MODULE_STRING ++ " ping_me_back " ++ + atom_to_list(node()) ++ "\"", + ?line io:format("~p\n", [Cmd]), + + ?line net_kernel:monitor_nodes(true), + ?line open_port({spawn,Cmd}, []), + ?line [_,Host] = string:tokens(atom_to_list(node()), "@"), + ?line Node = list_to_atom(NodeName++"@"++Host), + + receive + {nodeup,Node} -> + ?line io:format("Up: ~p\n", [Node]); + Other -> + ?line io:format("Unexpected: ~p\n", [Other]), + ?line ?t:fail() + after 10000 -> + ?line ?t:fail() + end, + + {Node,Pipe}. diff -Nru erlang-13.b.1-dfsg/erts/test/system.dynspec erlang-13.b.3-dfsg/erts/test/system.dynspec --- erlang-13.b.1-dfsg/erts/test/system.dynspec 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/system.dynspec 2009-03-12 12:17:24.000000000 +0000 @@ -0,0 +1,18 @@ +%% -*- erlang -*- +%% You can test this file using this command. +%% file:script("system.dynspec", [{'TestCCompiler',{msc | gnuc, undefined}}]). + +case {TestCCompiler, erlang:system_info(c_compiler_used)} of + {{CC, _}, {CC, _}} -> + []; + {{CC1, _}, {CC2, _}} when CC1 == msc; CC2 == msc -> + Comment = + "OTP's static C libraries (compiled with " + ++ atom_to_list(CC2) ++ ") aren't compatible " + "with the C compiler (" ++ atom_to_list(CC1) + ++ ") used for testing.", + StaticLibSuites = [ethread_SUITE, erl_print_SUITE], + lists:map(fun (Suite) -> {skip,{Suite, Comment}} end, StaticLibSuites); + {{CC1, _}, {CC2, _}} -> + [] +end. diff -Nru erlang-13.b.1-dfsg/erts/test/system.spec erlang-13.b.3-dfsg/erts/test/system.spec --- erlang-13.b.1-dfsg/erts/test/system.spec 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/system.spec 1997-11-09 23:01:09.000000000 +0000 @@ -0,0 +1 @@ +{topcase, {dir, "../system_test"}}. diff -Nru erlang-13.b.1-dfsg/erts/test/system.spec.vxworks erlang-13.b.3-dfsg/erts/test/system.spec.vxworks --- erlang-13.b.1-dfsg/erts/test/system.spec.vxworks 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/system.spec.vxworks 1999-10-26 14:43:56.000000000 +0100 @@ -0,0 +1,2 @@ +{topcase, {dir, "../system_test"}}. +{skip,{erlc_SUITE, "Not on VxWorks, erlc is a HOST tool."}} diff -Nru erlang-13.b.1-dfsg/erts/test/utils/gccifier.c erlang-13.b.3-dfsg/erts/test/utils/gccifier.c --- erlang-13.b.1-dfsg/erts/test/utils/gccifier.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/utils/gccifier.c 2009-09-18 15:08:52.000000000 +0100 @@ -0,0 +1,316 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2004-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + * + */ + +/* + * A compiler wrapper that translate (some) gcc command line arguments + * to the Visual C++ compiler and (of course) the gcc compiler. It also + * makes some changes in the command line arguments when debug compiling. + */ + +#include +#include +#include +#include + + +#if !defined(__WIN32__) +#define USE_EXEC +#include +#endif + + +#ifdef __WIN32__ +#define EOL "\r\n" +#else +#define EOL "\n" +#endif + +#define ARGS_INCR 20 + +static char *prog; + +typedef struct { + char **vec; + int no; + int ix; + int chars; +} args_t; + +static void +enomem(void) +{ + fprintf(stderr, "%s: Out of memory%s", prog, EOL); + exit(1); +} + +static void +save_arg(args_t *args, char *arg1, ...) +{ + char *carg; + va_list argp; + + va_start(argp, arg1); + carg = arg1; + while (carg) { + if (args->no <= args->ix) { + args->vec = (char **) (args->no + ? realloc((void *) args->vec, + (sizeof(char *) + *(args->no + ARGS_INCR + 1))) + : malloc((sizeof(char *) + *(args->no + ARGS_INCR + 1)))); + if (!args->vec) + enomem(); + args->no += ARGS_INCR; + } + args->vec[args->ix++] = carg; + args->chars += strlen(carg); + carg = va_arg(argp, char *); + } + args->vec[args->ix++] = " "; + args->chars++; + va_end(argp); +} + +static int +is_prefix(char *prfx, char **str) +{ + int i; + for (i = 0; prfx[i] && (*str)[i]; i++) { + if (prfx[i] != (*str)[i]) + return 0; + } + if (!prfx[i]) { + *str = &(*str)[i]; + return 1; + } + return 0; +} + +static void +cpy(char **dst, char *src) +{ + int i; + for (i = 0; src[i]; i++) + (*dst)[i] = src[i]; + *dst = &(*dst)[i]; +} + +typedef enum { + STDLIB_NONE, + STDLIB_MD, + STDLIB_ML, + STDLIB_MT +} stdlib_t; + +int +main(int argc, char *argv[]) +{ + int res; + int i; + size_t cmd_len; + char *cmd; + char *cmd_end; + char *cc = NULL; + args_t args = {0}; + int is_debug = 0; + int is_purify = 0; + int is_quantify = 0; + int is_purecov = 0; +#ifdef __WIN32__ + int is_shared = 0; + stdlib_t stdlib = STDLIB_NONE; + char *shared_flag = ""; + char *stdlib_flag = ""; + int have_link_args = 0; + args_t link_args = {0}; + +#define CHECK_FIRST_LINK_ARG \ + if (!have_link_args) { \ + save_arg(&link_args, "-link", NULL); \ + have_link_args = 1; \ + } +#else /* #ifdef __WIN32__ */ +#define CHECK_FIRST_LINK_ARG +#endif /* #ifdef __WIN32__ */ + + prog = argv[0]; + + + for (i = 1; i < argc; i++) { + char *arg = argv[i]; + if (is_prefix("-CC", &arg)) { + cc = arg; + } + else if (is_prefix("-O", &arg)) { + if (!is_debug) + save_arg(&args, argv[i], NULL); + } + else if (strcmp("-DDEBUG", arg) == 0) { + save_arg(&args, arg, NULL); +#ifdef __WIN32__ + set_debug: +#endif + if (!is_debug) { + int j; + is_debug = 1; +#ifdef __WIN32__ + save_arg(&args, "-Z7", NULL); + CHECK_FIRST_LINK_ARG; + save_arg(&link_args, "-debug", NULL); + save_arg(&link_args, "-pdb:none", NULL); +#endif + for (j = 0; j < args.ix; j++) { + char *tmp_arg = args.vec[j]; + if (is_prefix("-O", &tmp_arg)) + args.vec[j] = ""; + } + } + } + else if (strcmp("-DPURIFY", arg) == 0) { + save_arg(&args, arg, NULL); + is_purify = 1; + } + else if (strcmp("-DQUANTIFY", arg) == 0) { + save_arg(&args, arg, NULL); + is_quantify = 1; + } + else if (strcmp("-DPURECOV", arg) == 0) { + save_arg(&args, arg, NULL); + is_purecov = 1; + } +#ifdef __WIN32__ + else if (strcmp("-g", arg) == 0) { + goto set_debug; + } + else if (strcmp("-MD", arg) == 0) + stdlib = STDLIB_MD; + else if (strcmp("-MDd", arg) == 0) { + stdlib = STDLIB_MD; + goto set_debug; + } + else if (strcmp("-ML", arg) == 0) + stdlib = STDLIB_ML; + else if (strcmp("-MLd", arg) == 0) { + stdlib = STDLIB_ML; + goto set_debug; + } + else if (strcmp("-MT", arg) == 0) + stdlib = STDLIB_MT; + else if (strcmp("-MTd", arg) == 0) { + stdlib = STDLIB_MT; + goto set_debug; + } + else if (strcmp("-shared", arg) == 0 || strcmp("-LD", arg) == 0) + is_shared = 1; + else if (strcmp("-LDd", arg) == 0) { + is_shared = 1; + goto set_debug; + } + else if (strcmp("-Wall", arg) == 0) { + save_arg(&args, "-W3", NULL); + } + else if (is_prefix("-L", &arg)) { + CHECK_FIRST_LINK_ARG; + save_arg(&link_args, "-libpath:", arg, NULL); + } +#endif /* #ifdef __WIN32__ */ + else if (is_prefix("-l", &arg)) { + CHECK_FIRST_LINK_ARG; + if (is_debug && strcmp("ethread", arg) == 0) + arg = "ethread.debug"; + else if (is_purify && strcmp("ethread", arg) == 0) + arg = "ethread.purify"; + else if (is_quantify && strcmp("ethread", arg) == 0) + arg = "ethread.quantify"; + else if (is_purecov && strcmp("ethread", arg) == 0) + arg = "ethread.purecov"; +#ifdef __WIN32__ + else if (strcmp("socket", arg) == 0) + arg = "ws2_32"; + save_arg(&link_args, arg, ".lib", NULL); +#else + save_arg(&args, "-l", arg, NULL); +#endif + } + else + save_arg(&args, argv[i], NULL); + } + + if (!cc || !cc[0]) { + fprintf(stderr, "%s: Missing compulsory -CC flag%s", prog, EOL); + exit(1); + } + + cmd_len = strlen(cc) + 1 + args.chars + 1; + +#ifdef __WIN32__ + if (is_shared) + shared_flag = is_debug ? "-LDd " : "-LD "; + switch (stdlib) { + case STDLIB_MD: stdlib_flag = is_debug ? "-MDd " : "-MD "; break; + case STDLIB_ML: stdlib_flag = is_debug ? "-MLd " : "-ML "; break; + case STDLIB_MT: stdlib_flag = is_debug ? "-MTd " : "-MT "; break; + case STDLIB_NONE: break; + } + + cmd_len += strlen(shared_flag) + strlen(stdlib_flag) + link_args.chars; +#endif + + cmd = (char *) malloc(sizeof(char) * cmd_len); + + if (!cmd) + enomem(); + cmd_end = cmd; + cpy(&cmd_end, cc); + cpy(&cmd_end, " "); +#ifdef __WIN32__ + cpy(&cmd_end, stdlib_flag); + cpy(&cmd_end, shared_flag); +#endif + for (i = 0; i < args.ix; i++) + cpy(&cmd_end, args.vec[i]); +#ifdef __WIN32__ + for (i = 0; i < link_args.ix; i++) + cpy(&cmd_end, link_args.vec[i]); +#endif + *cmd_end = '\0'; + + printf("==> %s%s", cmd, EOL); + fflush(stdout); + +#ifdef USE_EXEC + (void) execl("/bin/sh", "sh", "-c", cmd, (char *) NULL); + perror(NULL); + res = 1; +#else + res = system(cmd); +#endif + + free((void *) args.vec); +#ifdef __WIN32__ + free((void *) link_args.vec); +#endif + free((void *) cmd); + + if (res < 0) + res = 1; + return res; +} diff -Nru erlang-13.b.1-dfsg/erts/test/z_SUITE.erl erlang-13.b.3-dfsg/erts/test/z_SUITE.erl --- erlang-13.b.1-dfsg/erts/test/z_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/test/z_SUITE.erl 2009-03-12 12:17:24.000000000 +0000 @@ -0,0 +1,315 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(z_SUITE). + +%% +%% This suite expects to be run as the last suite of all suites. +%% + +%-define(line_trace, 1). + +-include_lib("kernel/include/file.hrl"). + +-record(core_search_conf, {search_dir, + extra_search_dir, + cerl, + file, + run_by_ts}). + +-define(DEFAULT_TIMEOUT, ?t:minutes(5)). + +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([search_for_core_files/1, core_files/1]). + +-include("test_server.hrl"). + + +init_per_testcase(Case, Config) -> + Dog = ?t:timetrap(?DEFAULT_TIMEOUT), + [{testcase, Case}, {watchdog, Dog} |Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog), + ok. + +all(doc) -> []; +all(suite) -> + [core_files]. + + +core_files(doc) -> + []; +core_files(suite) -> + []; +core_files(Config) when is_list(Config) -> + case os:type() of + {win32, _} -> + {skipped, "No idea searching for core-files on windows"}; + {unix, darwin} -> + core_file_search( + core_search_conf(true, + os:getenv("OTP_DAILY_BUILD_TOP_DIR"), + "/cores")); + _ -> + core_file_search( + core_search_conf(true, + os:getenv("OTP_DAILY_BUILD_TOP_DIR"))) + end. + +search_for_core_files(Dir) -> + case os:type() of + {win32, _} -> + io:format("No idea searching for core-files on windows"); + {unix, darwin} -> + core_file_search(core_search_conf(false, Dir, "/cores")); + _ -> + core_file_search(core_search_conf(false, Dir)) + end. + +find_cerl(false) -> + case os:getenv("ERL_TOP") of + false -> false; + ETop -> + Cerl = filename:join([ETop, "bin", "cerl"]), + case filelib:is_regular(Cerl) of + true -> Cerl; + _ -> false + end + end; +find_cerl(DBTop) -> + case catch filelib:wildcard(filename:join([DBTop, + "otp_src_R*", + "bin", + "cerl"])) of + [Cerl | _ ] -> + case filelib:is_regular(Cerl) of + true -> Cerl; + _ -> false + end; + _ -> + false + end. + +is_dir(false) -> + false; +is_dir(Dir) -> + filelib:is_dir(Dir). + +core_search_conf(RunByTS, DBTop) -> + core_search_conf(RunByTS, DBTop, false). + +core_search_conf(RunByTS, DBTop, XDir) -> + SearchDir = case is_dir(DBTop) of + false -> + case code:which(test_server) of + non_existing -> + {ok, CWD} = file:get_cwd(), + CWD; + TS -> + filename:dirname(filename:dirname(TS)) + end; + true -> + DBTop + end, + XSearchDir = case is_dir(XDir) of + false -> + false; + true -> + case SearchDir == XDir of + true -> false; + _ -> XDir + end + end, + #core_search_conf{search_dir = SearchDir, + extra_search_dir = XSearchDir, + cerl = find_cerl(DBTop), + file = os:find_executable("file"), + run_by_ts = RunByTS}. + +file_inspect(#core_search_conf{file = File}, Core) -> + FRes0 = os:cmd(File ++ " " ++ Core), + FRes = case regexp:match(FRes0, Core) of + {match, S, E} -> + L = length(FRes0), + case S of + 1 -> + lists:sublist(FRes0, E+1, L+1); + _ -> + lists:sublist(FRes0, 1, S-1) + ++ + " " + ++ + lists:sublist(FRes0, E+1, L+1) + end; + _ -> FRes0 + end, + case regexp:match(FRes, "[Tt][Ee][Xx][Tt]") of + nomatch -> + case regexp:match(FRes, "[Aa][Ss][Cc][Ii][Ii]") of + nomatch -> + probably_a_core; + _ -> + not_a_core + end; + _ -> + not_a_core + end. + +mk_readable(F) -> + catch file:write_file_info(F, #file_info{mode = 8#00444}). + +ignore_core(C) -> + filelib:is_regular(filename:join([filename:dirname(C), + "ignore_core_files"])). + +core_cand(#core_search_conf{file = false}, C, Cs) -> + %% Guess that it is a core file; make it readable by anyone and save it + mk_readable(C), + [C|Cs]; +core_cand(Conf, C, Cs) -> + case file_inspect(Conf, C) of + not_a_core -> Cs; + _ -> + %% Probably a core file; make it readable by anyone and save it + mk_readable(C), + case ignore_core(C) of + true -> [{ignore, C}|Cs]; + _ -> [C|Cs] + end + end. + +time_fstr() -> + "(~w-~.2.0w-~.2.0w ~w.~.2.0w:~.2.0w)". +mod_time_list(F) -> + case catch filelib:last_modified(F) of + {{Y,Mo,D},{H,Mi,S}} -> + [Y,Mo,D,H,Mi,S]; + _ -> + [0,0,0,0,0,0] + end. + +str_strip(S) -> + string:strip(string:strip(string:strip(S), both, $\n), both, $\r). + +format_core(Conf, {ignore, Core}) -> + format_core(Conf, Core, "[ignored] "); +format_core(Conf, Core) -> + format_core(Conf, Core, ""). + +format_core(#core_search_conf{file = false}, Core, Ignore) -> + io:format(" ~s~s " ++ time_fstr() ++ "~s~n", + [Ignore, Core] ++ mod_time_list(Core)); +format_core(#core_search_conf{file = File}, Core, Ignore) -> + FRes = str_strip(os:cmd(File ++ " " ++ Core)), + case catch regexp:match(FRes, Core) of + {match, _, _} -> + io:format(" ~s~s " ++ time_fstr() ++ "~n", + [Ignore, FRes] ++ mod_time_list(Core)); + _ -> + io:format(" ~s~s: ~s " ++ time_fstr() ++ "~n", + [Ignore, Core, FRes] ++ mod_time_list(Core)) + end. + +core_file_search(#core_search_conf{search_dir = Base, + extra_search_dir = XBase, + cerl = Cerl, + run_by_ts = RunByTS} = Conf) -> + case Cerl of + false -> ok; + _ -> catch io:format("A cerl script that probably can be used for " + "inspection of emulator cores:~n ~s~n", + [Cerl]) + end, + io:format("Searching for core-files in: ~s~s~n", + [case XBase of + false -> ""; + _ -> XBase ++ " and " + end, + Base]), + Filter = fun (Core, Cores) -> + case filelib:is_regular(Core) of + true -> + case filename:basename(Core) of + "core" -> + core_cand(Conf, Core, Cores); + "core." ++ _ -> + core_cand(Conf, Core, Cores); + BName -> + case lists:suffix(".core", BName) of + true -> core_cand(Conf, Core, Cores); + _ -> Cores + end + end; + _ -> + Cores + end + end, + case case XBase of + false -> []; + _ -> filelib:fold_files(XBase, "core", true, Filter, []) + end ++ filelib:fold_files(Base, "core", true, Filter, []) of + [] -> + io:format("No core-files found.~n", []), + ok; + Cores -> + io:format("Found core files:~n",[]), + lists:foreach(fun (C) -> format_core(Conf, C) end, Cores), + {ICores, FCores} = lists:foldl(fun ({ignore, IC}, {ICs, FCs}) -> + {[" "++IC|ICs], FCs}; + (FC, {ICs, FCs}) -> + {ICs, [" "++FC|FCs]} + end, + {[],[]}, + Cores), + ICoresComment = + "Core-files marked with [ignored] were found in directories~n" + "containing an ignore_core_files file, i.e., the testcase~n" + "writer has decided that core-files dumped there should be~n" + "ignored. This testcase won't fail on ignored core-files~n" + "found.~n", + Res = lists:flatten([case FCores of + [] -> + []; + _ -> + ["Core-files found:", + lists:reverse(FCores)] + end, + case {FCores, ICores} of + {[], []} -> []; + {_, []} -> []; + {[], _} -> []; + _ -> " " + end, + case ICores of + [] -> []; + _ -> + io:format(ICoresComment, []), + ["Ignored core-files found:", + lists:reverse(ICores)] + end]), + case {RunByTS, ICores, FCores} of + {true, [], []} -> ok; + {true, _, []} -> {comment, Res}; + {true, _, _} -> ?t:fail(Res); + _ -> Res + end + end. diff -Nru erlang-13.b.1-dfsg/erts/vsn.mk erlang-13.b.3-dfsg/erts/vsn.mk --- erlang-13.b.1-dfsg/erts/vsn.mk 2009-06-05 13:53:06.000000000 +0100 +++ erlang-13.b.3-dfsg/erts/vsn.mk 2009-11-20 13:30:08.000000000 +0000 @@ -17,8 +17,8 @@ # %CopyrightEnd% # -VSN = 5.7.2 -SYSTEM_VSN = R13B01 +VSN = 5.7.4 +SYSTEM_VSN = R13B03 # Port number 4365 in 4.2 # Port number 4366 in 4.3 diff -Nru erlang-13.b.1-dfsg/lib/appmon/doc/src/appmon_chapter.xml erlang-13.b.3-dfsg/lib/appmon/doc/src/appmon_chapter.xml --- erlang-13.b.1-dfsg/lib/appmon/doc/src/appmon_chapter.xml 2007-11-26 19:02:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/appmon/doc/src/appmon_chapter.xml 2009-11-20 13:36:55.000000000 +0000 @@ -4,23 +4,21 @@

- 2000 - 2007 - Ericsson AB, All Rights Reserved + 20002009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Appmon @@ -28,6 +26,7 @@ + appmon_chapter.xml
@@ -57,8 +56,8 @@
The Main Window -

The main window shows a load meter and all applications running at the displayed node. Select which node to display in the window by chosing the node name from the Nodes menu. It is also possible to run Appmon in a many-window mode where a new instance of the main window is opened for each node to be displayed.

- +

The main window shows a load meter and all applications running at the displayed node. Select which node to display in the window by choosing the node name from the Nodes menu. It is also possible to run Appmon in a many-window mode where a new instance of the main window is opened for each node to be displayed.

+ The Main Window.

The load meter shows load measured as processor time, or as the length of the ready queue.

@@ -126,7 +125,7 @@

The application window shows the process tree for an application. The window title contains the application name and the node name. The window also contains a menubar and a toolbar.

The application window can be opened from the main window by clicking on the button denoting the application, or from the listbox window by selecting the application and clicking on the Load button.

- + The Application Window.

The application can be shown either as a strict supervision tree, or as a process view with all linked processes. In supervision mode, the tree-gathering and -building algorithm assumes conformance to the OTP design principles.

@@ -169,7 +168,7 @@ The Listbox Window

The listbox window lists all nodes and applications. This window can be more easy to use than the normal, graphical user interface when the system consists of a large number of nodes and/or applications.

- + The Listbox Window.

The window contains three buttons:

@@ -187,7 +186,7 @@ The Process Information Window

The process information window shows information about different processes as given by .

- + The Process Information Window. @@ -219,7 +218,7 @@ version of Appmon is compatible with the browsers Netscape Navigator and Internet Explorer 4.0 and higher.

When WebTool is started, start the Web based version of Appmon via - WebTool. If WebTool succeded to start the web based version of Appmon + WebTool. If WebTool succeeded to start the web based version of Appmon a link named WebAppmon will appear in the topmost frame. Click on the link and the main frame of the browser will show two frames.The left frame will show a combo box for node selection and a list of all applications on @@ -253,13 +252,13 @@

The processes in the process tree can have three different colors:

Blue - The relation to the process above in the process heirarchy + The relation to the process above in the process hierarchy is a primary relation. That means that the process above is the only process that link to it or the process above is a supervisor. Red - The relation to the process above in the process heirarchy is a secondary + The relation to the process above in the process hierarchy is a secondary relation. This means that more than one process has a relation to it - and the process above in the heirarchy is not a supervisor. + and the process above in the hierarchy is not a supervisor. Black The process isn't a regular process instead it's a Port. The name of the process will also begin with Port: @@ -293,10 +292,10 @@ All processes that at least one process in the application tree has a link to. Supervised processes - All procesess that is supervised by one of the supervisors in + All processes that are supervised by one of the supervisors in the application Supervisors only - Only the processes that actually is supervisors in the + Only the processes that actually are supervisors in the applications supervision tree is included
diff -Nru erlang-13.b.1-dfsg/lib/appmon/doc/src/book.xml erlang-13.b.3-dfsg/lib/appmon/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/appmon/doc/src/book.xml 2007-11-26 19:01:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/appmon/doc/src/book.xml 2009-11-20 13:35:58.000000000 +0000 @@ -1,29 +1,27 @@ - +
- 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - Appmon + appmon @@ -35,11 +33,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/appmon/doc/src/Makefile erlang-13.b.3-dfsg/lib/appmon/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/appmon/doc/src/Makefile 2009-03-12 12:28:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/appmon/doc/src/Makefile 2009-11-20 13:35:58.000000000 +0000 @@ -23,17 +23,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(APPMON_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=appmon # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/appmon-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -64,35 +59,17 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PDF_FILE = appmon-$(VSN).pdf -TOP_PS_FILE = appmon-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets @@ -100,21 +77,20 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) pdf: $(TOP_PDF_FILE) -ps: $(TOP_PS_FILE) +html: gifs $(HTML_REF_MAN_FILE) -html: $(HTML_FILES) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + rm -f $(JD_HTML) $(JD_PACK) man: $(MAN3_FILES) @@ -122,36 +98,20 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) part.tex - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) min_head.gif - # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ - $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 release_spec: diff -Nru erlang-13.b.1-dfsg/lib/appmon/doc/src/notes.xml erlang-13.b.3-dfsg/lib/appmon/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/appmon/doc/src/notes.xml 2009-03-12 12:31:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/appmon/doc/src/notes.xml 2009-11-20 13:37:35.000000000 +0000 @@ -26,9 +26,27 @@ nil nil nil + notes.xml

This document describes the changes made to the Appmon application.

+
Appmon 2.1.10.2 + +
Improvements and New Features + + +

+ The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

+

+ Own Id: OTP-8201

+
+
+
+ +
+
Appmon 2.1.10.1 diff -Nru erlang-13.b.1-dfsg/lib/appmon/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/appmon/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/appmon/doc/src/part_notes.xml 2007-11-26 19:02:12.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/appmon/doc/src/part_notes.xml 2009-11-20 13:37:35.000000000 +0000 @@ -1,26 +1,24 @@ - +
- 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Appmon Release Notes diff -Nru erlang-13.b.1-dfsg/lib/appmon/doc/src/part.xml erlang-13.b.3-dfsg/lib/appmon/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/appmon/doc/src/part.xml 2007-11-26 19:02:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/appmon/doc/src/part.xml 2009-11-20 13:36:55.000000000 +0000 @@ -1,26 +1,24 @@ - +
- 2000 - 2007 - Ericsson AB, All Rights Reserved + 20002009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Appmon User's Guide @@ -34,6 +32,6 @@ to supervise applications executing either locally or on remote nodes. The process tree of an application can furthermore be monitored.

- + diff -Nru erlang-13.b.1-dfsg/lib/appmon/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/appmon/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/appmon/doc/src/ref_man.xml 2007-11-26 19:01:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/appmon/doc/src/ref_man.xml 2009-11-20 13:35:52.000000000 +0000 @@ -1,26 +1,24 @@ - +
- 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Appmon Reference Manual @@ -34,6 +32,6 @@ to supervise applications executing either locally or on remote nodes. The process tree of an application can furthermore be monitored.

- + diff -Nru erlang-13.b.1-dfsg/lib/appmon/vsn.mk erlang-13.b.3-dfsg/lib/appmon/vsn.mk --- erlang-13.b.1-dfsg/lib/appmon/vsn.mk 2009-03-12 12:27:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/appmon/vsn.mk 2009-11-20 13:35:55.000000000 +0000 @@ -15,6 +15,5 @@ # under the License. # # %CopyrightEnd% -APPMON_VSN = 2.1.10.1 -TICKETS = OTP-7851 +APPMON_VSN = 2.1.10.2 diff -Nru erlang-13.b.1-dfsg/lib/asn1/c_src/Makefile.in erlang-13.b.3-dfsg/lib/asn1/c_src/Makefile.in --- erlang-13.b.1-dfsg/lib/asn1/c_src/Makefile.in 2009-03-12 12:24:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/asn1/c_src/Makefile.in 2009-09-18 15:10:43.000000000 +0100 @@ -60,7 +60,7 @@ DRIVER_INCLUDES = -I$(ERL_TOP)/erts/emulator/beam \ -I$(ERL_TOP)/erts/emulator/sys/$(ERLANG_OSTYPE) CFLAGS = $(DRIVER_INCLUDES) $(EI_INCLUDES) @DED_CFLAGS@ -LDFLAGS = @DED_LDFLAGS@ +LDFLAGS += @DED_LDFLAGS@ LD_INCL_EI = -L$(EI_LIBDIR) diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/asn1ct.xml erlang-13.b.3-dfsg/lib/asn1/doc/src/asn1ct.xml --- erlang-13.b.1-dfsg/lib/asn1/doc/src/asn1ct.xml 2009-03-12 12:23:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/asn1ct.xml 2009-11-20 13:33:54.000000000 +0000 @@ -34,8 +34,8 @@ asn1ct ASN.1 compiler and compile-time support functions -

The ASN.1 compiler takes an ASN.1 module as input and genarates a - corresponding Erlang module which can encode and decode the datatypes +

The ASN.1 compiler takes an ASN.1 module as input and generates a + corresponding Erlang module which can encode and decode the data-types specified. Alternatively the compiler takes a specification module (se below) specifying all input modules and generates one module with encode/decode functions. There are also some generic functions which @@ -49,8 +49,11 @@ Compile an ASN.1 module and generate encode/decode functions according to the encoding rules BER or PER. Asn1module = atom() | string() - Options = [Option] - Option = ber | per | ber_bin | per_bin | uper_bin | der | compact_bit_string | noobj | {outdir,Dir} | {i,IncludeDir} | optimize | driver | asn1config | undec_rest | {inline,OutputName} | inline + Options = [Option| OldOption] + Option = ber_bin | per_bin | uper_bin | der | compact_bit_string | + noobj | {n2n,EnumTypeName} |{outdir,Dir} | {i,IncludeDir} | optimize | + driver | asn1config | undec_rest | {inline,OutputName} | inline + OldOption = ber | per Reason = term() @@ -71,7 +74,7 @@ involved files in a configuration file. This configuration file must have a double extension ".set.asn", (".asn" can alternatively be ".asn1" or ".py"). The input files' names - must be listed, within qoutation marks (""), one at each row + must be listed, within quotation marks (""), one at each row in the file. If the input files are File1.asn, File2.asn and File3.asn the configuration file shall look like:

@@ -82,68 +85,108 @@

The output files will in this case get their names from the configuration file. If the configuration file has the name SetOfFiles.set.asn the name of the output files will be - SetOfFiles.hrl, SetOfFiles.hrl and SetOfFiles.asn1db.

+ SetOfFiles.hrl, SetOfFiles.erl and SetOfFiles.asn1db.

Sometimes in a system of ASN.1 modules there are different default tag modes, e.g. AUTOMATIC, IMPLICIT or EXPLICIT. The multi file compilation resolves the default tagging as if - the modules were compiled separetely.

-

Another unwanted effect that may occure in multi file compilation + the modules were compiled separately.

+

Another unwanted effect that may occur in multi file compilation is name collisions. The compiler solves this problem in two ways: If the definitions are identical then the output module keeps only one definition with the original name. But if definitions only have same name and differs in the definition, then they will be renamed. The new names will be the definition name and the original module name concatenated.

-

If any name collision have occured the compiler reports a +

If any name collision have occurred the compiler reports a "NOTICE: ..." message that tells if a definition was renamed, and the new name that must be used to encode/decode data.

-

Options is a list with options specific for the asn1 - compiler and options that are applied to the Erlang compiler. - The latter are those that not is recognized as asn1 specific. - For preferred option use see Preferred Option Use - section in users guide. Available options are:

- + +

+ Options is a list with options specific for the asn1 + compiler and options that are applied to the Erlang compiler. + The latter are those that not is recognized as asn1 specific. + For preferred option use see Preferred Option Use + section in users guide. Available options are: +

+ ber | ber_bin | per | per_bin | uper_bin -

The encoding rule to be used. EncodingRule is BER or - PER with the variants aligned or - unaligned. If this option is omitted ber is - the default. The per option means the aligned - variant. To use the unaligned variant the uper_bin - option has to be used.

-

The generated Erlang module always gets the same name - as the ASN.1 module and as a consequence of this only one - encoding rule per ASN.1 module can be used at runtime.

-

The ber_bin and per_bin options are - equivalent with the ber and per options with - the difference that the generated encoding/decoding - functions take advantage of the bit syntax, which in most - cases increases the performance considerably. The result - from encoding is a binary or a list (mayby nested) with - Erlang terms, including binaries.

+

+ The encoding rule to be used. The supported encoding rules + are BER (Basic Encoding Rules), + PER aligned (Packed Encoding Rules) and PER unaligned. + If the encoding rule option is omitted ber + is the default. + The per_bin option means the aligned + variant. To use the unaligned variant the uper_bin + option has to be used. +

+

+ The generated Erlang module always gets the same name + as the ASN.1 module and as a consequence of this only one + encoding rule per ASN.1 module can be used at runtime. +

+

+ The ber_bin and per_bin options are + equivalent with the OldOptions ber and per + with the difference that the generated encoding/decoding + functions take advantage of the bit syntax, which in most + cases increases the performance considerably. The result + from encoding is a binary or an iolist. +

der -

By this option the Distinguished Encoding Rule (DER) is chosed. - DER is regarded as a specialized variant of the BER encoding - rule, therefore the der option only makes sense when - the ber or ber_bin option is used. This option +

+ By this option the Distinguished Encoding Rules (DER) is chosen. + DER is regarded as a specialized variant of the BER encoding + rule, therefore the der option only makes sense together + with the ber or ber_bin option. + This option sometimes adds sorting and value checks when encoding, which - implies a slower encoding. The decoding rutines are the same - as for ber.

+ implies a slower encoding. The decoding routines are the same + as for ber. +

compact_bit_string -

Makes it possible to use a compact notation for values - of the BIT STRING type in Erlang. The notation:

+

+ Makes it possible to use a compact notation for values + of the BIT STRING type in Erlang. The notation: +

 BitString = {Unused,Binary},
 Unused = integer(),
-Binary = binary()            
-

Unused must be a number in the range 0 to 7. It - tells how many bits in the least significant byte in - Binary that is unused. For details see BIT STRING type section in users guide.

+Binary = binary() +
+

+ Unused must be a number in the range 0 to 7. It + tells how many bits in the least significant byte in + Binary that is unused. + For details see + + BIT STRING type section in users guide + . +

+ + {n2n,EnumTypeName} + +

+ Tells the compiler to generate functions for conversion between + names (as atoms) and numbers and vice versa for the EnumTypeName specified. There can be multiple occurrences of this option in order to specify several type names. The type names must be declared as ENUMERATIONS in the ASN.1 spec. + If the EnumTypeName does not exist in the ASN.1 spec the + compilation will stop with an error code. + The generated conversion functions are named + name2num_EnumTypeName/1 and + num2name_EnumTypeName/1. +

+
+ noobj + +

Do not compile (i.e do not produce object code) the generated + .erl file. If this option is omitted the generated Erlang module + will be compiled.

{i,IncludeDir} @@ -155,12 +198,6 @@ parsed. Several {i,IncludeDir} can be given.

- noobj - -

Do not compile (i.e do not produce object code) the generated - .erl file. If this option is omitted the generated Erlang module - will be compiled.

-
{outdir,Dir}

Specifies the directory Dir where all generated files @@ -203,7 +240,7 @@ undec_rest -

A buffer that holds a message, beeing decoded may +

A buffer that holds a message, being decoded may also have some following bytes. Now it is possible to get those following bytes returned together with the decoded value. If an asn1 spec is compiled with this option a tuple @@ -218,13 +255,13 @@ are provided in a target module Module.set.asn as described above. The name of the resulting module containing generated encode/decode functions - and inlined run-time functions will be - OutputName.erl. The merging/inlining of code is done + and in-lined run-time functions will be + OutputName.erl. The merging/in-lining of code is done by the igor module of syntax_tools. By default the functions generated from the first asn1 spec in the .set.asn are exported, unless a {export,[atom()]} or {export_all,true} option - are provided. The list of atoms are names of choosen asn1 + are provided. The list of atoms are names of chosen asn1 specs from the .set.asn file.

inline @@ -269,7 +306,7 @@ Value is a correct instance of Type. The length of strings is for example not always checked. Returns {ok,Bytes} if successful or - {error,Reason} if an error occured. + {error,Reason} if an error occurred.

@@ -333,7 +370,7 @@ {ok,Value} = asn1ct:value(Module,Type), {ok,Bytes} = asn1ct:encode(Module,Type,Value), -{ok,Value} = asn1:decode(Module,Type,Bytes). +{ok,Value} = asn1ct:decode(Module,Type,Bytes). diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/asn1rt.xml erlang-13.b.3-dfsg/lib/asn1/doc/src/asn1rt.xml --- erlang-13.b.1-dfsg/lib/asn1/doc/src/asn1rt.xml 2009-03-12 12:23:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/asn1rt.xml 2009-11-20 13:34:01.000000000 +0000 @@ -119,7 +119,7 @@

info/1 returns the version of the asn1 compiler that was - used to comile the module. It also returns the compiler options + used to compile the module. It also returns the compiler options that was used.

diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/asn1_spec.xml erlang-13.b.3-dfsg/lib/asn1/doc/src/asn1_spec.xml --- erlang-13.b.1-dfsg/lib/asn1/doc/src/asn1_spec.xml 2007-11-26 13:12:08.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/asn1_spec.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,826 +0,0 @@ - - - - -
- - 2003 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Specialized Decodes - EAB/UAB/UKH/KD Bertil Karlsson - - 2003-04-24 - D - asn1_spec.sgml -
- -

When performance is of highest priority and one is interested in - a limited part of the ASN.1 encoded message, before one decide what - to do with the rest of it, one may want to decode only this small - part. The situation may be a server that has to decide to which - addressee it will send a message. The addressee may be interested in - the entire message, but the server may be a bottleneck that one want - to spare any unnecessary load. Instead of making two complete decodes (the normal case of decode), one in the server and one - in the addressee, it is only necessary to make one specialized decode(in the server) and another complete decode(in the - addressee). The following specialized decodes exclusive decode and selected decode support to solve this and - similar problems. -

-

So far this functionality is only provided when using the - optimized BER_BIN version, that is when compiling with the - options ber_bin and optimize. It does also work - using the driver option. We have no intent to make this - available on the default BER version, but maybe in the PER_BIN - version (per_bin). -

- -
- Exclusive Decode -

The basic idea with exclusive - decode is that you specify which parts of the message you want to - exclude from being decoded. These parts remain encoded and are - returned in the value structure as binaries. They may be decoded - in turn by passing them to a certain decode_part/2 - function. The performance gain is high when the message is large - and you can do an exclusive decode and later on one or several - decodes of the parts or a second complete decode instead of two or - more complete decodes. -

- -
- How To Make It Work -

In order to make exclusive decode work you have to do the - following: -

- - First,decide the name of the function for the exclusive - decode. - Second, write instructions that must consist of the name - of the exclusive decode function, the name of the ASN.1 - specification and a notation that tells which parts of the - message structure will be excluded from decode. These - instructions shall be included in a configuration - file. - Third, compile with the additional option - asn1config. The compiler searches for a configuration - file with the same name as the ASN.1 spec but with the - extension .asn1config. This configuration file is not the same - as used for compilation of a set of files. See section - Writing an Exclusive Decode Instruction. - -
- -
- User Interface -

The run-time user interface for exclusive decode consists of - two different functions. First, the function for an exclusive - decode, whose name the user decides in the configuration - file. Second, the compiler generates a decode_part/2 - function when exclusive decode is chosen. This function decodes - the parts that were left undecoded during the exclusive - decode. Both functions are described below. -

-

If the exclusive decode function has for example got the name - decode_exclusive and an ASN.1 encoded message - Bin shall be exclusive decoded, the call is:

-
-{ok,Excl_Message} = 'MyModule':decode_exclusive(Bin)      
- -

The result Excl_Message has the same structure as an - complete decode would have, except for the parts of the top-type - that were not decoded. The undecoded parts will be on their place - in the structure on the format {Type_Key,Undecoded_Value}. -

-

Each undecoded part that shall be decoded must be fed into the decode_part/2 function,like:

-
-{ok,Part_Message} = 'MyModule':decode_part(Type_Key,Undecoded_Value)      
-
- -
- - Writing an Exclusive Decode Instruction -

This instruction is written in the configuration file on the - format:

-
-
-Exclusive_Decode_Instruction = {exclusive_decode,{Module_Name,Decode_Instructions}}.
-
-Module_Name = atom()
-
-Decode_Instructions = [Decode_Instruction]+
-
-Decode_Instruction = {Exclusive_Decode_Function_Name,Type_List}
-
-Exclusive_Decode_Function_Name = atom()
-
-Type_List = [Top_Type,Element_List]
-
-Element_List = [Element]+
-
-Element = {Name,parts} |
-          {Name,undecoded} |
-          {Name,Element_List}
-
-Top_Type = atom()
-
-Name = atom()
-      
-

Observe that the instruction must be a valid Erlang term ended - by a dot. -

-

In the Type_List the "path" from the top type to each - undecoded sub-components is described. The top type of the path is - an atom, the name of it. The action on each component/type that - follows will be described by one of {Name,parts}, {Name,undecoded}, {Name,Element_List}

-

The use and effect of the actions are: -

- - {Name,undecoded} Tells that the element will be - left undecoded during the exclusive decode. The type of Name may - be any ASN.1 type. The value of element Name will be returned as a - tuple,as mentioned above, in the value structure of the top type. - {Name,parts} The type of Name may be one of - SEQUENCE OF or SET OF. The action implies that the different - components of Name will be left undecoded. The value of Name - will be returned as a tuple, as above , where the second element is a list of - binaries. That is because the representation of a SEQUENCE OF/ - SET OF in Erlang is a list of its internal type. Any of the - elements of this list or the entire list can be decoded by the - decode_part function. - {Name,Element_List}This action is used when one or - more of the sub-types of Name will be exclusive decoded. - -

Name in the actions above may be a component name of a - SEQUENCE or a SET or a name of an alternative in a CHOICE. -

-
- -
- Example -

In the examples below we use the definitions from the following ASN.1 spec:

- - -

If Button is a top type and we want to exclude - component number from decode the Type_List in the - instruction in the configuration file will be - ['Button',[{number,undecoded}]]. If we call the decode - function decode_Button_exclusive the Decode_Instruction - will be - {decode_Button_exclusive,['Button',[{number,undecoded}]]}. -

-

We also have another top type Window whose sub - component actions in type Status and the parts of component - buttonList shall be left undecoded. For this type we name - the function decode__Window_exclusive. The whole - Exclusive_Decode_Instruction configuration is as follows:

- -

- - Figure symbolizes the bytes of a Window:status message. The components buttonList and actions are excluded from decode. Only state and enabled are decoded when decode__Window_exclusive is called. - -

-

Compiling GUI.asn including the configuration file is done like:

-
-unix> erlc -bber_bin +optimize +asn1config GUI.asn
-
-erlang> asn1ct:compile('GUI',[ber_bin,optimize,asn1config]).      
-

The module can be used like:

-
-
-1> Button_Msg = {'Button',123,true}.
-{'Button',123,true}
-2> {ok,Button_Bytes} = 'GUI':encode('Button',Button_Msg).
-{ok,[<<48>>,
-     [6],
-     [<<128>>,
-      [1],
-      123],
-     [<<129>>,
-      [1],
-      255]]}
-3> {ok,Exclusive_Msg_Button} = 'GUI':decode_Button_exclusive(list_to_binary(Button_Bytes)).
-{ok,{'Button',{'Button_number',<<28,1,123>>},
-         true}}
-4> 'GUI':decode_part('Button_number',<<128,1,123>>).
-{ok,123}
-5> Window_Msg = 
-{'Window',{status,{'Status',35,
-              [{'Button',3,true},
-               {'Button',4,false},
-               {'Button',5,true},
-               {'Button',6,true},
-               {'Button',7,false},
-               {'Button',8,true},
-               {'Button',9,true},
-               {'Button',10,false},
-               {'Button',11,true},
-               {'Button',12,true},
-               {'Button',13,false},
-               {'Button',14,true}],
-              false,
-              {possibleActions,[{'Action',16,{'Button',17,true}}]}}}}. 
-{'Window',{status,{'Status',35,
-              [{'Button',3,true},
-               {'Button',4,false},
-               {'Button',5,true},
-               {'Button',6,true},
-               {'Button',7,false},
-               {'Button',8,true},
-               {'Button',9,true},
-               {'Button',10,false},
-               {'Button',11,true},
-               {'Button',12,true},
-               {'Button',13,false},
-               {'Button',14,true}],
-              false,
-              {possibleActions,[{'Action',16,{'Button',17,true}}]}}}}
-6> {ok,Window_Bytes}='GUI':encode('Window',Window_Msg).
-{ok,[<<161>>,
-     [127],
-     [<<128>>, ...
-
-
-8> {ok,{status,{'Status',Int,{Type_Key_SeqOf,Val_SEQOF},
-BoolOpt,{Type_Key_Choice,Val_Choice}}}}=
-'GUI':decode_Window_status_exclusive(list_to_binary(Window_Bytes)).
-{ok,{status,{'Status',35,
-        {'Status_buttonList',[<<48,6,128,1,3,129,1,255>>,
-                              <<48,6,128,1,4,129,1,0>>,
-                              <<48,6,128,1,5,129,1,255>>,
-                              <<48,6,128,1,6,129,1,255>>,
-                              <<48,6,128,1,7,129,1,0>>,
-                              <<48,6,128,1,8,129,1,255>>,
-                              <<48,6,128,1,9,129,1,255>>,
-                              <<48,6,128,1,10,129,1,0>>,
-                              <<48,6,128,1,11,129,1,255>>,
-                              <<48,6,128,1,12,129,1,255>>,
-                              <<48,6,128,1,13,129,1,0>>,
-                              <<48,6,128,1,14,129,1,255>>]},
-        false,
-        {'Status_actions',
-<<163,21,160,19,48,17,2,1,16,160,12,172,10,171,8,48,6,128,1,...>>}}}}
-10> 'GUI':decode_part(Type_Key_SeqOf,Val_SEQOF).
-{ok,[{'Button',3,true},
-     {'Button',4,false},
-     {'Button',5,true},
-     {'Button',6,true},
-     {'Button',7,false},
-     {'Button',8,true},
-     {'Button',9,true},
-     {'Button',10,false},
-     {'Button',11,true},
-     {'Button',12,true},
-     {'Button',13,false},
-     {'Button',14,true}]}
-11> 'GUI':decode_part(Type_Key_SeqOf,hd(Val_SEQOF)).
-{ok,{'Button',3,true}}
-12> 'GUI':decode_part(Type_Key_Choice,Val_Choice).  
-{ok,{possibleActions,[{'Action',16,{'Button',17,true}}]}}
-      
-
-
- -
- Selective Decode -

This specialized decode decodes one single subtype of a - constructed value. It is the fastest method to extract one sub - value. The typical use of this decode is when one want to - inspect, for instance a version number,to be able to decide what - to do with the entire value. The result is returned as - {ok,Value} or {error,Reason}. -

- -
- How To Make It Work -

The following steps are necessary: -

- - Write instructions in the configuration - file. Including the name of a user function, the name of the ASN.1 - specification and a notation that tells which part of the type - will be decoded. - Compile with the additional option - asn1config. The compiler searches for a configuration file - with the same name as the ASN.1 spec but with the extension - .asn1config. In the same file you can provide configuration specs - for exclusive decode as well. The generated Erlang module has the - usual functionality for encode/decode preserved and the - specialized decode functionality added. - -
- -
- User Interface -

The only new user interface function is the one provided by the - user in the configuration file. You can invoke that function by - the ModuleName:FunctionName notation. -

-

So, if you have the following spec - {selective_decode,{'ModuleName',[{selected_decode_Window,TypeList}]}} - in the con-fig file, you do the selective decode by - {ok,Result}='ModuleName':selected_decode_Window(EncodedBinary).

-
- -
- - Writing a Selective Decode Instruction -

It is possible to describe one or many selective decode - functions in a configuration file, you have to use the following - notation:

-
-Selective_Decode_Instruction = {selective_decode,{Module_Name,Decode_Instructions}}.
-
-Module_Name = atom()
-
-Decode_Instructions = [Decode_Instruction]+
-
-Decode_Instruction = {Selective_Decode_Function_Name,Type_List}
-
-Selective_Decode_Function_Name = atom()
-
-Type_List = [Top_Type|Element_List]
-
-Element_List = Name|List_Selector
-
-Name = atom()
-
-List_Selector = [integer()]      
-

Observe that the instruction must be a valid Erlang term ended - by a dot. -

-

The Module_Name is the same as the name of the ASN.1 - spec, but without the extension. A Decode_Instruction is - a tuple with your chosen function name and the components from - the top type that leads to the single type you want to - decode. Notice that you have to choose a name of your function - that will not be the same as any of the generated functions. The - first element of the Type_List is the top type of the - encoded message. In the Element_List it is followed by - each of the component names that leads to selected type. Each of - the names in the Element_List must be constructed types - except the last name, which can be any type. -

-

The List_Selector makes it possible to choose one of the - encoded components in a SEQUENCE OF/ SET OF. It is also possible - to go further in that component and pick a sub type of that to - decode. So in the Type_List: ['Window',status,buttonList,[1],number] the - component buttonList has to be a SEQUENCE OF or SET OF type. In - this example component number of the first of the encoded - elements in the SEQUENCE OF buttonList is selected. This apply on - the ASN.1 spec above. -

-
- -
- Another Example -

In this example we use the same ASN.1 spec as above. A valid selective decode - instruction is:

-
-{selective_decode,
-    {'GUI',
-        [{selected_decode_Window1,
-            ['Window',status,buttonList, 
-             [1],
-             number]},
- {selected_decode_Action,
-     ['Action',handle,number]},
- {selected_decode_Window2,
-     ['Window',
-      status,
-      actions,
-      possibleActions,
-      [1],
-      handle,number]}]}}.
-      
-

The first Decode_Instruction, - {selected_decode_Window1,['Window',status,buttonList,[1],number]} - is commented in the previous section. The instruction - {selected_decode_Action,['Action',handle,number]} picks - the component number in the handle component of the type - Action. If we have the value ValAction = {'Action',17,{'Button',4711,false}} the internal value 4711 - should be picked by selected_decode_Action. In an Erlang - terminal it looks like:

-
-ValAction = {'Action',17,{'Button',4711,false}}.
-{'Action',17,{'Button',4711,false}}
-7> {ok,Bytes}='GUI':encode('Action',ValAction).
-...
-8> BinBytes = list_to_binary(Bytes).
-<<48,18,2,1,17,160,13,172,11,171,9,48,7,128,2,18,103,129,1,0>>
-9> 'GUI':selected_decode_Action(BinBytes).
-{ok,4711}
-10>       
-

The third instruction, - ['Window',status,actions,possibleActions,[1],handle,number], - which is a little more complicated,

- - starts with type Window. - Picks component status of Window that is - of type Status. - Then takes component actions of type - Status. - Then possibleActions of the internal defined - CHOICE type. - Thereafter it goes into the first component of the - SEQUENCE OF by [1]. That component is of type - Action. - The instruction next picks component - handle. - And finally component number of the type - Button. - -

The following figures shows which components are in the - TypeList - ['Window',status,actions,possibleActions,[1],handle,number]. And - which part of a message that will be decoded by - selected_decode_Window2. -

-

- - The elements specified in the config file for selective decode of a sub-value in a Window message - -

- - Figure symbolizes the bytes of a Window:status message. Only the marked element is decoded when selected_decode_Window2 is called. - -

With the following example you can examine that both - selected_decode_Window2 and - selected_decode_Window1 decodes the intended sub-value - of the value Val

-
-1> Val = {'Window',{status,{'Status',12,
-                    [{'Button',13,true},
-                     {'Button',14,false},
-                     {'Button',15,true},
-                     {'Button',16,false}],
-                    true,
-                    {possibleActions,[{'Action',17,{'Button',18,false}},
-                                      {'Action',19,{'Button',20,true}},
-                                      {'Action',21,{'Button',22,false}}]}}}}
-2> {ok,Bytes}='GUI':encode('Window',Val).
-...
-3> Bin = list_to_binary(Bytes).
-<<161,101,128,1,12,161,32,48,6,128,1,13,129,1,255,48,6,128,1,14,129,1,0,48,6,128,1,15,129,...>>
-4> 'GUI':selected_decode_Window1(Bin).
-{ok,13}
-5> 'GUI':selected_decode_Window2(Bin).
-{ok,18}      
-

Observe that the value feed into the selective decode - functions must be a binary. -

-
-
- -
- Performance -

To give an indication on the possible performance gain using - the specialized decodes, some measures have been performed. The - relative figures in the outcome between selective, exclusive and - complete decode (the normal case) depends on the structure of - the type, the size of the message and on what level the - selective and exclusive decodes are specified. -

- -
- ASN.1 Specifications, Messages and Configuration -

The specs GUI and - MEDIA-GATEWAY-CONTROL - was used in the test. -

-

For the GUI spec the configuration looked like:

-
-{selective_decode,
-  {'GUI',
-    [{selected_decode_Window1,
-         ['Window',
-          status,buttonList,
-          [1],
-          number]},
-     {selected_decode_Window2,
-         ['Window',
-          status,
-          actions,
-          possibleActions,
-          [1],
-          handle,number]}]}}.
-     {exclusive_decode,
-         {'GUI',
-            [{decode_Window_status_exclusive,
-                ['Window',
-                 [{status,
-                     [{buttonList,parts},
-                      {actions,undecoded}]}]]}]}}.
-      
-

The MEDIA-GATEWAY-CONTROL configuration was:

-
-{exclusive_decode,
-  {'MEDIA-GATEWAY-CONTROL',
-    [{decode_MegacoMessage_exclusive,
-        ['MegacoMessage',
-         [{authHeader,undecoded},
-          {mess,
-             [{mId,undecoded},
-              {messageBody,undecoded}]}]]}]}}.
-{selective_decode,
-  {'MEDIA-GATEWAY-CONTROL',
-    [{decode_MegacoMessage_selective,
-         ['MegacoMessage',mess,version]}]}}.
-      
-

The corresponding values were:

-
-{'Window',{status,{'Status',12,
-              [{'Button',13,true},
-               {'Button',14,false},
-               {'Button',15,true},
-               {'Button',16,false},
-               {'Button',13,true},
-               {'Button',14,false},
-               {'Button',15,true},
-               {'Button',16,false},
-               {'Button',13,true},
-               {'Button',14,false},
-               {'Button',15,true},
-               {'Button',16,false}],
-              true,
-              {possibleActions,
-                 [{'Action',17,{'Button',18,false}},
-                  {'Action',19,{'Button',20,true}},
-                  {'Action',21,{'Button',22,false}},
-                  {'Action',17,{'Button',18,false}},
-                  {'Action',19,{'Button',20,true}},
-                  {'Action',21,{'Button',22,false}},
-                  {'Action',17,{'Button',18,false}},
-                  {'Action',19,{'Button',20,true}},
-                  {'Action',21,{'Button',22,false}},
-                  {'Action',17,{'Button',18,false}},
-                  {'Action',19,{'Button',20,true}},
-                  {'Action',21,{'Button',22,false}},
-                  {'Action',17,{'Button',18,false}},
-                  {'Action',19,{'Button',20,true}},
-                  {'Action',21,{'Button',22,false}},
-                  {'Action',17,{'Button',18,false}},
-                  {'Action',19,{'Button',20,true}},
-                  {'Action',21,{'Button',22,false}}]}}}}
-
-
-{'MegacoMessage',asn1_NOVALUE,
-  {'Message',1,
-    {ip4Address,
-      {'IP4Address',[125,125,125,111],55555}},
-  {transactions,
-    [{transactionReply,
-      {'TransactionReply',50007,asn1_NOVALUE,
-       {actionReplies,
-        [{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
-          [{auditValueReply,{auditResult,{'AuditResult',
-            {'TerminationID',[],[255,255,255]},
-             [{mediaDescriptor,
-               {'MediaDescriptor',asn1_NOVALUE,
-                {multiStream,
-                 [{'StreamDescriptor',1,
-                   {'StreamParms',
-                    {'LocalControlDescriptor',
-                     sendRecv,
-                     asn1_NOVALUE,
-                     asn1_NOVALUE,
-                     [{'PropertyParm',
-                       [0,11,0,7],
-                       [[52,48]],
-                       asn1_NOVALUE}]},
-                    {'LocalRemoteDescriptor',
-                     [[{'PropertyParm',
-                        [0,0,176,1],
-                        [[48]],
-                        asn1_NOVALUE},
-                       {'PropertyParm',
-                         [0,0,176,8],
-                         [[73,78,32,73,80,52,32,49,50,53,46,49,
-                           50,53,46,49,50,53,46,49,49,49]],
-                         asn1_NOVALUE},
-                       {'PropertyParm',
-                         [0,0,176,15],
-                         [[97,117,100,105,111,32,49,49,49,49,32,
-                           82,84,80,47,65,86,80,32,32,52]],
-                         asn1_NOVALUE},
-                       {'PropertyParm',
-                         [0,0,176,12],
-                         [[112,116,105,109,101,58,51,48]],
-                         asn1_NOVALUE}]]},
-                    {'LocalRemoteDescriptor',
-                     [[{'PropertyParm',
-                         [0,0,176,1],
-                         [[48]],
-                         asn1_NOVALUE},
-                       {'PropertyParm',
-                         [0,0,176,8],
-                         [[73,78,32,73,80,52,32,49,50,52,46,49,50,
-                           52,46,49,50,52,46,50,50,50]],
-                         asn1_NOVALUE},
-                       {'PropertyParm',
-                         [0,0,176,15],
-                         [[97,117,100,105,111,32,50,50,50,50,32,82,
-                           84,80,47,65,86,80,32,32,52]],
-                         asn1_NOVALUE},
-                       {'PropertyParm',
-                         [0,0,176,12],
-                         [[112,116,105,109,101,58,51,48]],
-                         asn1_NOVALUE}]]}}}]}}},
-              {packagesDescriptor,
-               [{'PackagesItem',[0,11],1},
-                {'PackagesItem',[0,11],1}]},
-              {statisticsDescriptor,
-               [{'StatisticsParameter',[0,12,0,4],[[49,50,48,48]]},
-                {'StatisticsParameter',[0,11,0,2],[[54,50,51,48,48]]},
-                {'StatisticsParameter',[0,12,0,5],[[55,48,48]]},
-                {'StatisticsParameter',[0,11,0,3],[[52,53,49,48,48]]},
-                {'StatisticsParameter',[0,12,0,6],[[48,46,50]]},
-                {'StatisticsParameter',[0,12,0,7],[[50,48]]},
-                {'StatisticsParameter',[0,12,0,8],[[52,48]]}]}]}}}]}]}}}]}}}      
-      
-

The size of the encoded values was 458 bytes for GUI and 464 - bytes for MEDIA-GATEWAY-CONTROL. -

-
- -
- Results -

The ASN.1 specs in the test are compiled with the options - ber_bin, optimize, driver and asn1config. If the - driver option had been omitted there should have been - higher values for decode and decode_part. -

-

The test program runs 10000 decodes on the value, resulting - in a printout with the elapsed time in microseconds for the - total number of decodes. -

- - - Function - Time(microseconds) - Kind of Decode - ASN.1 spec - % of time vs. complete decode - - - decode_MegacoMessage_selective/1 - 374045 - selective - MEDIA-GATEWAY-CONTROL - 8.3 - - - decode_MegacoMessage_exclusive/1 - 621107 - exclusive - MEDIA-GATEWAY-CONTROL - 13.8 - - - decode/2 - 4507457 - complete - MEDIA-GATEWAY-CONTROL - 100 - - - selected_decode_Window1/1 - 449585 - selective - GUI - 7.6 - - - selected_decode_Window2/1 - 890666 - selective - GUI - 15.1 - - - decode_Window_status_exclusive/1 - 1251878 - exclusive - GUI - 21.3 - - - decode/2 - 5889197 - complete - GUI - 100 - - Results of complete, exclusive and selective decode -
-

Another interesting question is what the relation is between - a complete decode, an exclusive decode followed by - decode_part of the excluded parts and a selective decode - followed by a complete decode. Some situations may be compared to - this simulation, e.g. inspect a sub-value and later on look at - the entire value. The following table shows figures from this - test. The number of loops and time unit is the same as in the - previous test. -

- - - Actions - Function     - Time(microseconds) - ASN.1 spec - % of time vs. complete decode - - - complete - decode/2 - 4507457 - MEDIA-GATEWAY-CONTROL - 100 - - - selective and complete - decode_­MegacoMessage_­selective/1 - 4881502 - MEDIA-GATEWAY-CONTROL - 108.3 - - - exclusive and decode_part - decode_­MegacoMessage_­exclusive/1 - 5481034 - MEDIA-GATEWAY-CONTROL - 112.3 - - - complete - decode/2 - 5889197 - GUI - 100 - - - selective and complete - selected_­decode_­Window1/1 - 6337636 - GUI - 107.6 - - - selective and complete - selected_­decode_­Window2/1 - 6795319 - GUI - 115.4 - - - exclusive and decode_part - decode_­Window_­status_­exclusive/1 - 6249200 - GUI - 106.1 - - Results of complete, exclusive + decode_part and selective + complete decodes -
-

Other ASN.1 types and values can differ much from these - figures. Therefore it is important that you, in every case where - you intend to use either of these decodes, perform some tests - that shows if you will benefit your purpose. -

-
- -
- Comments -

Generally speaking the gain of selective and exclusive decode - in advance of complete decode is greater the bigger value and the - less deep in the structure you have to decode. One should also - prefer selective decode instead of exclusive decode if you are - interested in just one single sub-value.

-

Another observation is that the exclusive decode followed by - decode_part decodes is very attractive if the parts will be sent - to different servers for decoding or if one in some cases not is - interested in all parts.

-

The fastest selective decode are when the decoded type is a - primitive type and not so deep in the structure of the top - type. The selected_decode_Window2 decodes a big constructed - value, which explains why this operation is relatively slow.

-

It may vary from case to case which combination of - selective/complete decode or exclusive/part decode is the fastest.

-
-
-
- diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/asn1_spec.xmlsrc erlang-13.b.3-dfsg/lib/asn1/doc/src/asn1_spec.xmlsrc --- erlang-13.b.1-dfsg/lib/asn1/doc/src/asn1_spec.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/asn1_spec.xmlsrc 2009-11-20 13:34:17.000000000 +0000 @@ -0,0 +1,824 @@ + + + + +
+ + 20032009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Specialized Decodes + EAB/UAB/UKH/KD Bertil Karlsson + + 2003-04-24 + D + asn1_spec.xml +
+ +

When performance is of highest priority and one is interested in + a limited part of the ASN.1 encoded message, before one decide what + to do with the rest of it, one may want to decode only this small + part. The situation may be a server that has to decide to which + addressee it will send a message. The addressee may be interested in + the entire message, but the server may be a bottleneck that one want + to spare any unnecessary load. Instead of making two complete decodes (the normal case of decode), one in the server and one + in the addressee, it is only necessary to make one specialized decode(in the server) and another complete decode(in the + addressee). The following specialized decodes exclusive decode and selected decode support to solve this and + similar problems. +

+

So far this functionality is only provided when using the + optimized BER_BIN version, that is when compiling with the + options ber_bin and optimize. It does also work + using the driver option. We have no intent to make this + available on the default BER version, but maybe in the PER_BIN + version (per_bin). +

+ +
+ Exclusive Decode +

The basic idea with exclusive + decode is that you specify which parts of the message you want to + exclude from being decoded. These parts remain encoded and are + returned in the value structure as binaries. They may be decoded + in turn by passing them to a certain decode_part/2 + function. The performance gain is high when the message is large + and you can do an exclusive decode and later on one or several + decodes of the parts or a second complete decode instead of two or + more complete decodes. +

+ +
+ How To Make It Work +

In order to make exclusive decode work you have to do the + following: +

+ + First,decide the name of the function for the exclusive + decode. + Second, write instructions that must consist of the name + of the exclusive decode function, the name of the ASN.1 + specification and a notation that tells which parts of the + message structure will be excluded from decode. These + instructions shall be included in a configuration + file. + Third, compile with the additional option + asn1config. The compiler searches for a configuration + file with the same name as the ASN.1 spec but with the + extension .asn1config. This configuration file is not the same + as used for compilation of a set of files. See section + Writing an Exclusive Decode Instruction. + +
+ +
+ User Interface +

The run-time user interface for exclusive decode consists of + two different functions. First, the function for an exclusive + decode, whose name the user decides in the configuration + file. Second, the compiler generates a decode_part/2 + function when exclusive decode is chosen. This function decodes + the parts that were left undecoded during the exclusive + decode. Both functions are described below. +

+

If the exclusive decode function has for example got the name + decode_exclusive and an ASN.1 encoded message + Bin shall be exclusive decoded, the call is:

+
+{ok,Excl_Message} = 'MyModule':decode_exclusive(Bin)      
+ +

The result Excl_Message has the same structure as an + complete decode would have, except for the parts of the top-type + that were not decoded. The undecoded parts will be on their place + in the structure on the format {Type_Key,Undecoded_Value}. +

+

Each undecoded part that shall be decoded must be fed into the decode_part/2 function,like:

+
+{ok,Part_Message} = 'MyModule':decode_part(Type_Key,Undecoded_Value)      
+
+ +
+ + Writing an Exclusive Decode Instruction +

This instruction is written in the configuration file on the + format:

+
+
+Exclusive_Decode_Instruction = {exclusive_decode,{Module_Name,Decode_Instructions}}.
+
+Module_Name = atom()
+
+Decode_Instructions = [Decode_Instruction]+
+
+Decode_Instruction = {Exclusive_Decode_Function_Name,Type_List}
+
+Exclusive_Decode_Function_Name = atom()
+
+Type_List = [Top_Type,Element_List]
+
+Element_List = [Element]+
+
+Element = {Name,parts} |
+          {Name,undecoded} |
+          {Name,Element_List}
+
+Top_Type = atom()
+
+Name = atom()
+      
+

Observe that the instruction must be a valid Erlang term ended + by a dot. +

+

In the Type_List the "path" from the top type to each + undecoded sub-components is described. The top type of the path is + an atom, the name of it. The action on each component/type that + follows will be described by one of {Name,parts}, {Name,undecoded}, {Name,Element_List}

+

The use and effect of the actions are: +

+ + {Name,undecoded} Tells that the element will be + left undecoded during the exclusive decode. The type of Name may + be any ASN.1 type. The value of element Name will be returned as a + tuple,as mentioned above, in the value structure of the top type. + {Name,parts} The type of Name may be one of + SEQUENCE OF or SET OF. The action implies that the different + components of Name will be left undecoded. The value of Name + will be returned as a tuple, as above , where the second element is a list of + binaries. That is because the representation of a SEQUENCE OF/ + SET OF in Erlang is a list of its internal type. Any of the + elements of this list or the entire list can be decoded by the + decode_part function. + {Name,Element_List}This action is used when one or + more of the sub-types of Name will be exclusive decoded. + +

Name in the actions above may be a component name of a + SEQUENCE or a SET or a name of an alternative in a CHOICE. +

+
+ +
+ Example +

In the examples below we use the definitions from the following ASN.1 spec:

+ + +

If Button is a top type and we want to exclude + component number from decode the Type_List in the + instruction in the configuration file will be + ['Button',[{number,undecoded}]]. If we call the decode + function decode_Button_exclusive the Decode_Instruction + will be + {decode_Button_exclusive,['Button',[{number,undecoded}]]}. +

+

We also have another top type Window whose sub + component actions in type Status and the parts of component + buttonList shall be left undecoded. For this type we name + the function decode__Window_exclusive. The whole + Exclusive_Decode_Instruction configuration is as follows:

+ +

+ + Figure symbolizes the bytes of a Window:status message. The components buttonList and actions are excluded from decode. Only state and enabled are decoded when decode__Window_exclusive is called. + +

+

Compiling GUI.asn including the configuration file is done like:

+
+unix> erlc -bber_bin +optimize +asn1config GUI.asn
+
+erlang> asn1ct:compile('GUI',[ber_bin,optimize,asn1config]).      
+

The module can be used like:

+
+
+1> Button_Msg = {'Button',123,true}.
+{'Button',123,true}
+2> {ok,Button_Bytes} = 'GUI':encode('Button',Button_Msg).
+{ok,[<<48>>,
+     [6],
+     [<<128>>,
+      [1],
+      123],
+     [<<129>>,
+      [1],
+      255]]}
+3> {ok,Exclusive_Msg_Button} = 'GUI':decode_Button_exclusive(list_to_binary(Button_Bytes)).
+{ok,{'Button',{'Button_number',<<28,1,123>>},
+         true}}
+4> 'GUI':decode_part('Button_number',<<128,1,123>>).
+{ok,123}
+5> Window_Msg = 
+{'Window',{status,{'Status',35,
+              [{'Button',3,true},
+               {'Button',4,false},
+               {'Button',5,true},
+               {'Button',6,true},
+               {'Button',7,false},
+               {'Button',8,true},
+               {'Button',9,true},
+               {'Button',10,false},
+               {'Button',11,true},
+               {'Button',12,true},
+               {'Button',13,false},
+               {'Button',14,true}],
+              false,
+              {possibleActions,[{'Action',16,{'Button',17,true}}]}}}}. 
+{'Window',{status,{'Status',35,
+              [{'Button',3,true},
+               {'Button',4,false},
+               {'Button',5,true},
+               {'Button',6,true},
+               {'Button',7,false},
+               {'Button',8,true},
+               {'Button',9,true},
+               {'Button',10,false},
+               {'Button',11,true},
+               {'Button',12,true},
+               {'Button',13,false},
+               {'Button',14,true}],
+              false,
+              {possibleActions,[{'Action',16,{'Button',17,true}}]}}}}
+6> {ok,Window_Bytes}='GUI':encode('Window',Window_Msg).
+{ok,[<<161>>,
+     [127],
+     [<<128>>, ...
+
+
+8> {ok,{status,{'Status',Int,{Type_Key_SeqOf,Val_SEQOF},
+BoolOpt,{Type_Key_Choice,Val_Choice}}}}=
+'GUI':decode_Window_status_exclusive(list_to_binary(Window_Bytes)).
+{ok,{status,{'Status',35,
+        {'Status_buttonList',[<<48,6,128,1,3,129,1,255>>,
+                              <<48,6,128,1,4,129,1,0>>,
+                              <<48,6,128,1,5,129,1,255>>,
+                              <<48,6,128,1,6,129,1,255>>,
+                              <<48,6,128,1,7,129,1,0>>,
+                              <<48,6,128,1,8,129,1,255>>,
+                              <<48,6,128,1,9,129,1,255>>,
+                              <<48,6,128,1,10,129,1,0>>,
+                              <<48,6,128,1,11,129,1,255>>,
+                              <<48,6,128,1,12,129,1,255>>,
+                              <<48,6,128,1,13,129,1,0>>,
+                              <<48,6,128,1,14,129,1,255>>]},
+        false,
+        {'Status_actions',
+<<163,21,160,19,48,17,2,1,16,160,12,172,10,171,8,48,6,128,1,...>>}}}}
+10> 'GUI':decode_part(Type_Key_SeqOf,Val_SEQOF).
+{ok,[{'Button',3,true},
+     {'Button',4,false},
+     {'Button',5,true},
+     {'Button',6,true},
+     {'Button',7,false},
+     {'Button',8,true},
+     {'Button',9,true},
+     {'Button',10,false},
+     {'Button',11,true},
+     {'Button',12,true},
+     {'Button',13,false},
+     {'Button',14,true}]}
+11> 'GUI':decode_part(Type_Key_SeqOf,hd(Val_SEQOF)).
+{ok,{'Button',3,true}}
+12> 'GUI':decode_part(Type_Key_Choice,Val_Choice).  
+{ok,{possibleActions,[{'Action',16,{'Button',17,true}}]}}
+      
+
+
+ +
+ Selective Decode +

This specialized decode decodes one single subtype of a + constructed value. It is the fastest method to extract one sub + value. The typical use of this decode is when one want to + inspect, for instance a version number,to be able to decide what + to do with the entire value. The result is returned as + {ok,Value} or {error,Reason}. +

+ +
+ How To Make It Work +

The following steps are necessary: +

+ + Write instructions in the configuration + file. Including the name of a user function, the name of the ASN.1 + specification and a notation that tells which part of the type + will be decoded. + Compile with the additional option + asn1config. The compiler searches for a configuration file + with the same name as the ASN.1 spec but with the extension + .asn1config. In the same file you can provide configuration specs + for exclusive decode as well. The generated Erlang module has the + usual functionality for encode/decode preserved and the + specialized decode functionality added. + +
+ +
+ User Interface +

The only new user interface function is the one provided by the + user in the configuration file. You can invoke that function by + the ModuleName:FunctionName notation. +

+

So, if you have the following spec + {selective_decode,{'ModuleName',[{selected_decode_Window,TypeList}]}} + in the con-fig file, you do the selective decode by + {ok,Result}='ModuleName':selected_decode_Window(EncodedBinary).

+
+ +
+ + Writing a Selective Decode Instruction +

It is possible to describe one or many selective decode + functions in a configuration file, you have to use the following + notation:

+
+Selective_Decode_Instruction = {selective_decode,{Module_Name,Decode_Instructions}}.
+
+Module_Name = atom()
+
+Decode_Instructions = [Decode_Instruction]+
+
+Decode_Instruction = {Selective_Decode_Function_Name,Type_List}
+
+Selective_Decode_Function_Name = atom()
+
+Type_List = [Top_Type|Element_List]
+
+Element_List = Name|List_Selector
+
+Name = atom()
+
+List_Selector = [integer()]      
+

Observe that the instruction must be a valid Erlang term ended + by a dot. +

+

The Module_Name is the same as the name of the ASN.1 + spec, but without the extension. A Decode_Instruction is + a tuple with your chosen function name and the components from + the top type that leads to the single type you want to + decode. Notice that you have to choose a name of your function + that will not be the same as any of the generated functions. The + first element of the Type_List is the top type of the + encoded message. In the Element_List it is followed by + each of the component names that leads to selected type. Each of + the names in the Element_List must be constructed types + except the last name, which can be any type. +

+

The List_Selector makes it possible to choose one of the + encoded components in a SEQUENCE OF/ SET OF. It is also possible + to go further in that component and pick a sub type of that to + decode. So in the Type_List: ['Window',status,buttonList,[1],number] the + component buttonList has to be a SEQUENCE OF or SET OF type. In + this example component number of the first of the encoded + elements in the SEQUENCE OF buttonList is selected. This apply on + the ASN.1 spec above. +

+
+ +
+ Another Example +

In this example we use the same ASN.1 spec as above. A valid selective decode + instruction is:

+
+{selective_decode,
+    {'GUI',
+        [{selected_decode_Window1,
+            ['Window',status,buttonList, 
+             [1],
+             number]},
+ {selected_decode_Action,
+     ['Action',handle,number]},
+ {selected_decode_Window2,
+     ['Window',
+      status,
+      actions,
+      possibleActions,
+      [1],
+      handle,number]}]}}.
+      
+

The first Decode_Instruction, + {selected_decode_Window1,['Window',status,buttonList,[1],number]} + is commented in the previous section. The instruction + {selected_decode_Action,['Action',handle,number]} picks + the component number in the handle component of the type + Action. If we have the value ValAction = {'Action',17,{'Button',4711,false}} the internal value 4711 + should be picked by selected_decode_Action. In an Erlang + terminal it looks like:

+
+ValAction = {'Action',17,{'Button',4711,false}}.
+{'Action',17,{'Button',4711,false}}
+7> {ok,Bytes}='GUI':encode('Action',ValAction).
+...
+8> BinBytes = list_to_binary(Bytes).
+<<48,18,2,1,17,160,13,172,11,171,9,48,7,128,2,18,103,129,1,0>>
+9> 'GUI':selected_decode_Action(BinBytes).
+{ok,4711}
+10>       
+

The third instruction, + ['Window',status,actions,possibleActions,[1],handle,number], + which is a little more complicated,

+ + starts with type Window. + Picks component status of Window that is + of type Status. + Then takes component actions of type + Status. + Then possibleActions of the internal defined + CHOICE type. + Thereafter it goes into the first component of the + SEQUENCE OF by [1]. That component is of type + Action. + The instruction next picks component + handle. + And finally component number of the type + Button. + +

The following figures shows which components are in the + TypeList + ['Window',status,actions,possibleActions,[1],handle,number]. And + which part of a message that will be decoded by + selected_decode_Window2. +

+

+ + The elements specified in the config file for selective decode of a sub-value in a Window message + +

+ + Figure symbolizes the bytes of a Window:status message. Only the marked element is decoded when selected_decode_Window2 is called. + +

With the following example you can examine that both + selected_decode_Window2 and + selected_decode_Window1 decodes the intended sub-value + of the value Val

+
+1> Val = {'Window',{status,{'Status',12,
+                    [{'Button',13,true},
+                     {'Button',14,false},
+                     {'Button',15,true},
+                     {'Button',16,false}],
+                    true,
+                    {possibleActions,[{'Action',17,{'Button',18,false}},
+                                      {'Action',19,{'Button',20,true}},
+                                      {'Action',21,{'Button',22,false}}]}}}}
+2> {ok,Bytes}='GUI':encode('Window',Val).
+...
+3> Bin = list_to_binary(Bytes).
+<<161,101,128,1,12,161,32,48,6,128,1,13,129,1,255,48,6,128,1,14,129,1,0,48,6,128,1,15,129,...>>
+4> 'GUI':selected_decode_Window1(Bin).
+{ok,13}
+5> 'GUI':selected_decode_Window2(Bin).
+{ok,18}      
+

Observe that the value feed into the selective decode + functions must be a binary. +

+
+
+ +
+ Performance +

To give an indication on the possible performance gain using + the specialized decodes, some measures have been performed. The + relative figures in the outcome between selective, exclusive and + complete decode (the normal case) depends on the structure of + the type, the size of the message and on what level the + selective and exclusive decodes are specified. +

+ +
+ ASN.1 Specifications, Messages and Configuration +

The specs GUI and + MEDIA-GATEWAY-CONTROL + was used in the test. +

+

For the GUI spec the configuration looked like:

+
+{selective_decode,
+  {'GUI',
+    [{selected_decode_Window1,
+         ['Window',
+          status,buttonList,
+          [1],
+          number]},
+     {selected_decode_Window2,
+         ['Window',
+          status,
+          actions,
+          possibleActions,
+          [1],
+          handle,number]}]}}.
+     {exclusive_decode,
+         {'GUI',
+            [{decode_Window_status_exclusive,
+                ['Window',
+                 [{status,
+                     [{buttonList,parts},
+                      {actions,undecoded}]}]]}]}}.
+      
+

The MEDIA-GATEWAY-CONTROL configuration was:

+
+{exclusive_decode,
+  {'MEDIA-GATEWAY-CONTROL',
+    [{decode_MegacoMessage_exclusive,
+        ['MegacoMessage',
+         [{authHeader,undecoded},
+          {mess,
+             [{mId,undecoded},
+              {messageBody,undecoded}]}]]}]}}.
+{selective_decode,
+  {'MEDIA-GATEWAY-CONTROL',
+    [{decode_MegacoMessage_selective,
+         ['MegacoMessage',mess,version]}]}}.
+      
+

The corresponding values were:

+
+{'Window',{status,{'Status',12,
+              [{'Button',13,true},
+               {'Button',14,false},
+               {'Button',15,true},
+               {'Button',16,false},
+               {'Button',13,true},
+               {'Button',14,false},
+               {'Button',15,true},
+               {'Button',16,false},
+               {'Button',13,true},
+               {'Button',14,false},
+               {'Button',15,true},
+               {'Button',16,false}],
+              true,
+              {possibleActions,
+                 [{'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}},
+                  {'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}},
+                  {'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}},
+                  {'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}},
+                  {'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}},
+                  {'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}}]}}}}
+
+
+{'MegacoMessage',asn1_NOVALUE,
+  {'Message',1,
+    {ip4Address,
+      {'IP4Address',[125,125,125,111],55555}},
+  {transactions,
+    [{transactionReply,
+      {'TransactionReply',50007,asn1_NOVALUE,
+       {actionReplies,
+        [{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
+          [{auditValueReply,{auditResult,{'AuditResult',
+            {'TerminationID',[],[255,255,255]},
+             [{mediaDescriptor,
+               {'MediaDescriptor',asn1_NOVALUE,
+                {multiStream,
+                 [{'StreamDescriptor',1,
+                   {'StreamParms',
+                    {'LocalControlDescriptor',
+                     sendRecv,
+                     asn1_NOVALUE,
+                     asn1_NOVALUE,
+                     [{'PropertyParm',
+                       [0,11,0,7],
+                       [[52,48]],
+                       asn1_NOVALUE}]},
+                    {'LocalRemoteDescriptor',
+                     [[{'PropertyParm',
+                        [0,0,176,1],
+                        [[48]],
+                        asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,8],
+                         [[73,78,32,73,80,52,32,49,50,53,46,49,
+                           50,53,46,49,50,53,46,49,49,49]],
+                         asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,15],
+                         [[97,117,100,105,111,32,49,49,49,49,32,
+                           82,84,80,47,65,86,80,32,32,52]],
+                         asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,12],
+                         [[112,116,105,109,101,58,51,48]],
+                         asn1_NOVALUE}]]},
+                    {'LocalRemoteDescriptor',
+                     [[{'PropertyParm',
+                         [0,0,176,1],
+                         [[48]],
+                         asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,8],
+                         [[73,78,32,73,80,52,32,49,50,52,46,49,50,
+                           52,46,49,50,52,46,50,50,50]],
+                         asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,15],
+                         [[97,117,100,105,111,32,50,50,50,50,32,82,
+                           84,80,47,65,86,80,32,32,52]],
+                         asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,12],
+                         [[112,116,105,109,101,58,51,48]],
+                         asn1_NOVALUE}]]}}}]}}},
+              {packagesDescriptor,
+               [{'PackagesItem',[0,11],1},
+                {'PackagesItem',[0,11],1}]},
+              {statisticsDescriptor,
+               [{'StatisticsParameter',[0,12,0,4],[[49,50,48,48]]},
+                {'StatisticsParameter',[0,11,0,2],[[54,50,51,48,48]]},
+                {'StatisticsParameter',[0,12,0,5],[[55,48,48]]},
+                {'StatisticsParameter',[0,11,0,3],[[52,53,49,48,48]]},
+                {'StatisticsParameter',[0,12,0,6],[[48,46,50]]},
+                {'StatisticsParameter',[0,12,0,7],[[50,48]]},
+                {'StatisticsParameter',[0,12,0,8],[[52,48]]}]}]}}}]}]}}}]}}}      
+      
+

The size of the encoded values was 458 bytes for GUI and 464 + bytes for MEDIA-GATEWAY-CONTROL. +

+
+ +
+ Results +

The ASN.1 specs in the test are compiled with the options + ber_bin, optimize, driver and asn1config. If the + driver option had been omitted there should have been + higher values for decode and decode_part. +

+

The test program runs 10000 decodes on the value, resulting + in a printout with the elapsed time in microseconds for the + total number of decodes. +

+ + + Function + Time(microseconds) + Kind of Decode + ASN.1 spec + % of time vs. complete decode + + + decode_MegacoMessage_selective/1 + 374045 + selective + MEDIA-GATEWAY-CONTROL + 8.3 + + + decode_MegacoMessage_exclusive/1 + 621107 + exclusive + MEDIA-GATEWAY-CONTROL + 13.8 + + + decode/2 + 4507457 + complete + MEDIA-GATEWAY-CONTROL + 100 + + + selected_decode_Window1/1 + 449585 + selective + GUI + 7.6 + + + selected_decode_Window2/1 + 890666 + selective + GUI + 15.1 + + + decode_Window_status_exclusive/1 + 1251878 + exclusive + GUI + 21.3 + + + decode/2 + 5889197 + complete + GUI + 100 + + Results of complete, exclusive and selective decode +
+

Another interesting question is what the relation is between + a complete decode, an exclusive decode followed by + decode_part of the excluded parts and a selective decode + followed by a complete decode. Some situations may be compared to + this simulation, e.g. inspect a sub-value and later on look at + the entire value. The following table shows figures from this + test. The number of loops and time unit is the same as in the + previous test. +

+ + + Actions + Function     + Time(microseconds) + ASN.1 spec + % of time vs. complete decode + + + complete + decode/2 + 4507457 + MEDIA-GATEWAY-CONTROL + 100 + + + selective and complete + decode_­MegacoMessage_­selective/1 + 4881502 + MEDIA-GATEWAY-CONTROL + 108.3 + + + exclusive and decode_part + decode_­MegacoMessage_­exclusive/1 + 5481034 + MEDIA-GATEWAY-CONTROL + 112.3 + + + complete + decode/2 + 5889197 + GUI + 100 + + + selective and complete + selected_­decode_­Window1/1 + 6337636 + GUI + 107.6 + + + selective and complete + selected_­decode_­Window2/1 + 6795319 + GUI + 115.4 + + + exclusive and decode_part + decode_­Window_­status_­exclusive/1 + 6249200 + GUI + 106.1 + + Results of complete, exclusive + decode_part and selective + complete decodes +
+

Other ASN.1 types and values can differ much from these + figures. Therefore it is important that you, in every case where + you intend to use either of these decodes, perform some tests + that shows if you will benefit your purpose. +

+
+ +
+ Comments +

Generally speaking the gain of selective and exclusive decode + in advance of complete decode is greater the bigger value and the + less deep in the structure you have to decode. One should also + prefer selective decode instead of exclusive decode if you are + interested in just one single sub-value.

+

Another observation is that the exclusive decode followed by + decode_part decodes is very attractive if the parts will be sent + to different servers for decoding or if one in some cases not is + interested in all parts.

+

The fastest selective decode are when the decoded type is a + primitive type and not so deep in the structure of the top + type. The selected_decode_Window2 decodes a big constructed + value, which explains why this operation is relatively slow.

+

It may vary from case to case which combination of + selective/complete decode or exclusive/part decode is the fastest.

+
+
+
+ diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/asn1_ug.xml erlang-13.b.3-dfsg/lib/asn1/doc/src/asn1_ug.xml --- erlang-13.b.1-dfsg/lib/asn1/doc/src/asn1_ug.xml 2009-03-12 12:23:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/asn1_ug.xml 2009-11-20 13:33:50.000000000 +0000 @@ -26,7 +26,7 @@ 1999-03-25 D - asn1_ug.sgml + asn1_ug.xml
@@ -43,7 +43,7 @@ Run-time functions used by the generated code. Encoding rules supported are BER, the specialized BER version DER and the basic form of - aligned and unalgned variants of PER. + aligned and unaligned variants of PER.
@@ -108,6 +108,44 @@ PDF format.

+ +
+ Capability +

This application covers all features of ASN.1 up to the 1997 + edition of the specification. In the 2002 edition some new + extensions came up of which there are support only for some of + them. ECN (Cncoding Control Notation) and XML notation are still + unsupported. Though, the other features of 2002 edition are + fully or partly supported as shown below:

+ + +

Decimal notation (e.g., "1.5e3") for REAL values. The + NR1, NR2 and NR3 formats as explained in ISO6093 are + supported.

+
+ +

The RELATIVE-OID type for relative object identifiers are + fully supported.

+
+ +

The subtype constraint (CONTAINING/ENCODED BY) to + constrain the content of an octet string or a bit string is + parsed when compiling, but no further action is taken. This + constraint is not a PER-visible constraint.

+
+ +

The subtype constraint by regular expressions (PATTERN) for character string types is parsed when compiling, but no further action is taken. This constraint is not a PER-visible constraint.

+
+ +

Multiple-line comments as in C, /* ... */, are + supported.

+
+
+

It should also be added here that the encoding formats + supported are BER, DER, PER aligned + basic variant and PER unaligned basic variant.

+
+
@@ -330,7 +368,7 @@ +undec_rest -

A buffer that holds a message, beeing decoded may +

A buffer that holds a message, being decoded may also have some following bytes. Now it is possible to get those following bytes returned together with the decoded value. If an asn1 spec is compiled with this option a tuple @@ -673,7 +711,7 @@ compiled with ber_bin, optimize and driver. In those cases the driver will be loaded automatically at the first call to encode/decode. If one doesn't want the performance - overhead of the driver beeing loaded at the first call it is possible + overhead of the driver being loaded at the first call it is possible to load the driver separately by asn1rt:load_driver().

By invoking the function info/0 in a generated module, one gets information about which compiler options were used.

@@ -1112,7 +1150,7 @@ {ok,[30,20,[0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103]]} 6> asn1rt:decode('PrimStrings','BMP',list_to_binary(Bytes3)). {ok,"BMP string"} -

The UTF8String is represented in Erlang as a list of integters, +

The UTF8String is represented in Erlang as a list of integers, where each integer represents the unicode value of one character. When a value shall be encoded one first has to transform it to a UTF8 encoded binary, then it can be encoded by @@ -1284,7 +1322,7 @@ [48,8,161,6,128,1,255,129,1,15] 6>

The result after command line 3, in the example above,shows that the - encoder omits the encoding of default values when they are specifid + encoder omits the encoding of default values when they are specific by asn1_DEFAULT. Line 5 shows that even primitive values that equals the default value are detected and not encoded. But the constructed value of component b in Seq1 is not recognized as the @@ -1372,7 +1410,7 @@ the compiler, see above.

Moreover, in DER the elements of a SET will be sorted. If a component is an untagged choice the sorting have to take place - in run-time. This fact emphasizes the following recomendation + in run-time. This fact emphasizes the following recommendation if DER encoding format is used.

The concept of SET is an unusual construct and one cannot think of one single application @@ -1508,7 +1546,7 @@ information object class, table constraints and parameterization. In particular the construct TYPE-IDENTIFIER.@Type accomplish the same as the - depricated ANY.

+ deprecated ANY.

See also Information object

@@ -1554,7 +1592,7 @@
Naming of Records in .hrl Files -

When an asn1 specifiction is compiled all defined types of +

When an asn1 specification is compiled all defined types of type SET or SEQUENCE will result in a corresponding record in the generated hrl file. This is because the values for SET/SEQUENCE as mentioned in sections above are represented as records.

@@ -1757,7 +1795,7 @@
 GENERAL-PROCEDURES GENERAL-PROCEDURE ::= {
     object1 | object2}    
-

One can not encode a class, object or object set, only refering to +

One can not encode a class, object or object set, only referring to it when defining other ASN.1 entities. Typically one refers to a class and to object sets by table constraints and component relation constraints [] in ASN.1 types, as in:

@@ -1899,7 +1937,7 @@

The DER (Distinguished Encoding Rule) encoding format was included in the standard in 1994. It is a specialized form of BER, which gives the encoder the option to encode some entities differently. For - istance, is the value for TRUE any octet with any bit set to one. But, + instance, is the value for TRUE any octet with any bit set to one. But, DER does not leave any such choices. The value for TRUE in the DER case is encoded as the octet 11111111. So, the same value encoded by two different DER encoders must result in the same bit @@ -1918,7 +1956,7 @@ alternative by its position in the notation.

-

The elemnts of a SEQUENCE is transmitted in textual +

The elements of a SEQUENCE are transmitted in textual order. OPTIONAL or DEFAULT elements are preceded by a bit map to identify which elements are present. After sorting the elements of a SET in the "canonical tag order" as defined in diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/book.xml erlang-13.b.3-dfsg/lib/asn1/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/asn1/doc/src/book.xml 2007-11-26 13:12:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/book.xml 2009-11-20 13:34:03.000000000 +0000 @@ -2,29 +2,27 @@ - +

- 1999 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - ASN.1 Application + ASN.1 Kenneth Lundin 1997-12-01 @@ -33,16 +31,19 @@
- ASN.1 Application + ASN.1 - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/Makefile erlang-13.b.3-dfsg/lib/asn1/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/asn1/doc/src/Makefile 2009-03-12 12:23:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/Makefile 2009-11-20 13:33:54.000000000 +0000 @@ -25,17 +25,21 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(ASN1_VSN) +APPLICATION=asn1 + # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- +ifndef DOCSUPPORT include make.dep +endif # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/asn1-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -44,6 +48,9 @@ XML_REF3_FILES = asn1ct.xml \ asn1rt.xml +GEN_XML = \ + asn1_spec.xml + XML_PART_FILES = \ part.xml \ part_notes.xml @@ -58,10 +65,10 @@ BOOK_FILES = book.xml +XML_FILES = $(BOOK_FILES) $(XML_APPLICATION_FILES) $(XML_REF3_FILES) \ + $(GEN_XML) $(XML_PART_FILES) $(XML_CHAPTER_FILES) + GIF_FILES = \ - min_head.gif \ - note.gif \ - warning.gif \ exclusive_Win_But.gif \ selective_Window2.gif \ selective_TypeList.gif @@ -72,10 +79,6 @@ Seq.asn \ Seq.asn1config -HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_HTML_FILE:%.xml=$(HTMLDIR)/%.html) - INFO_FILE = ../../info EXTRA_FILES = \ $(DEFAULT_HTML_FILES) \ @@ -85,6 +88,14 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) \ $(BOOK_FILES:%.xml=%.sgml) part.tex @@ -93,8 +104,8 @@ TEX_FILES_USERS_GUIDE = \ $(XML_CHAPTER_FILES:%.xml=%.tex) -TOP_PDF_FILE = asn1-$(VSN).pdf -TOP_PS_FILE = asn1-$(VSN).ps +TOP_PDF_FILE = $(APPLICATION)-$(VSN).pdf +TOP_PS_FILE = $(APPLICATION)-$(VSN).ps $(TOP_PDF_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ @@ -102,6 +113,8 @@ $(TOP_PS_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +endif + # ---------------------------------------------------- # FLAGS @@ -115,6 +128,24 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ +ifdef DOCSUPPORT + +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f $(GEN_XML) errs core *~ + +else + ifeq ($(DOCTYPE),pdf) docs: pdf else @@ -131,23 +162,39 @@ html: $(HTML_FILES) -man: $(MAN3_FILES) - -gifs: $(GIF_FILES:%=$(HTMLDIR)/%) - -debug opt: - clean clean_docs clean_tex: rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) rm -f $(HTML_FILES) $(MAN3_FILES) rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) rm -f errs core *~ $(LATEX_CLEAN) +endif + +man: $(MAN3_FILES) + +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) + +debug opt: + # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 + +else + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -168,6 +215,8 @@ endif endif +endif + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/notes_history.xml erlang-13.b.3-dfsg/lib/asn1/doc/src/notes_history.xml --- erlang-13.b.1-dfsg/lib/asn1/doc/src/notes_history.xml 2009-04-16 10:25:09.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/notes_history.xml 2009-11-20 13:34:24.000000000 +0000 @@ -34,7 +34,7 @@

This document describes the changes made to the asn1 system from version to version. The intention of this document is to list all incompatibilities as well as all enhancements and - bugfixes for every release of the asn1 application. Each release of asn1 + bug-fixes for every release of the asn1 application. Each release of asn1 thus constitutes one section in this document. The title of each section is the version number of asn1.

@@ -86,7 +86,7 @@

As a complement to the option "{inline,OutputFile}" it is - now possible to use the option "inline". Then asn1 creats + now possible to use the option "inline". Then asn1 creates an output file with the name of the source .set file.

Own Id: OTP-6314

@@ -101,13 +101,13 @@ Fixed Bugs and Malfunctions -

When copiling an asn1 source that reference a type in +

When compiling an asn1 source that reference a type in another source the compiler uses the asn1db file of the other source to resolve the reference. It also tests whether the other source has been updated since the asn1db file was generated. This last test was to brutal in that it exits compilation when no source was found, - even though a asn1db file existed. Changed behaviour from + even though a asn1db file existed. Changed behavior from a brutal exit to a warning.

Own Id: OTP-6143

@@ -149,7 +149,7 @@

Own Id: OTP-5783

-

ASN1-compiler faild to derive a value out of an external +

ASN1-compiler failed to derive a value out of an external reference in some certain cases, when compiling specs so that the spec with the reference was compiled before the spec with the defined value.

@@ -164,9 +164,9 @@

The compiler failed to give right name to record/function - of a parametrized type that was referenced through + of a parameterized type that was referenced through another instance of a parameterized type in another - module. The fault occured when modules were compiled in a + module. The fault occurred when modules were compiled in a certain order. Now the compiler resolves the name correctly.

Own Id: OTP-5832 Aux Id: seq10133

@@ -188,7 +188,7 @@

Own Id: OTP-5687

-

Bad code was generated for an INTEGER with valuerange. If +

Bad code was generated for an INTEGER with value-range. If the value that was encoded had a lower bound with negative value it caused a crash. This bug is now removed.

@@ -292,7 +292,7 @@

Due to an internal error the same code could have been generated more than one time. This happened for the - exclusive deocode functionality.

+ exclusive decode functionality.

Own Id: OTP-5378

@@ -346,7 +346,7 @@ Improvements and new features -

Optionally make it possible to get the undecoded rest along with +

Optionally make it possible to get the un-decoded rest along with the return value. Compile with option undec_rest.

Own Id: OTP-5104

@@ -363,7 +363,7 @@

An error due to unchecked referenced imported type resulted in missing tag in some table constraint cases. This error is - now corrected. Error occured during decode in + now corrected. Error occurred during decode in ber_bin optimized version.

Own Id: OTP-5022

@@ -380,7 +380,7 @@

When a referenced value in another module in turn referenced a defined value the compilation crashed. This is due to the new - rutines for compilation, that external referencies are resolved + routines for compilation, that external references are resolved during compilation, and not by the order in which modules are compiled. This error is now corrected.

Own Id: OTP-4970

@@ -407,13 +407,13 @@

Aux Id: OTP-4893

-

Object Identifier values with two components and teh first was a +

Object Identifier values with two components and the first was a value reference failed due to parsing conflicts. Now it is corrected.

Own Id: OTP-4895

-

The errorounus comparison of file name and asn1 module name could +

The erroneous comparison of file name and asn1 module name could cause compilation failure. The situation for this failure is rare, it requires that other processes modifies the compiled file during the compilation procedure. It is now fixed.

@@ -477,12 +477,12 @@

The {internal_error,...,{ unrecognized_type,...}} - error occuring for a SET type when compiling with options + error occurring for a SET type when compiling with options [ber_bin,optimize,der] is now corrected.

Own Id: OTP-4866

-

False encode of BIT STRING in PER (per_bin,optimize) is fixed. The error occured when there was a type like BIT STRING (SIZE(C)) and C > 16.

+

False encode of BIT STRING in PER (per_bin,optimize) is fixed. The error occurred when there was a type like BIT STRING (SIZE(C)) and C > 16.

Own Id: OTP-4869

@@ -500,7 +500,7 @@

Own Id: OTP-4832

-

Bug causing duplicated fuction definitions using exclusive decode is removed.

+

Bug causing duplicated function definitions using exclusive decode is removed.

Own Id: OTP-4833)

@@ -552,13 +552,14 @@

Own Id: OTP-4791)

-

Now the bug is fixed that caused the compiler crash on an untaged +

Now the bug is fixed that caused the compiler crash on an untagged optional open type.

Own Id: OTP-4792

-

The earlier exit caused by bad indata is now fixed so it will - rreturn an {error,Reason} tuple.

+

The earlier exit caused by bad in-data is now fixed so it will + return an {error,Reason} tuple.

+ return an {error,Reason} tuple.

Own Id: OTP-4797

@@ -612,7 +613,7 @@

Exclusive decode is enabled by a compiler option and a configuration file. It makes it possible to leave parts of an ASN.1 encoded message - undecoded.

+ un-decoded.

Own Id: OTP-4744

@@ -715,7 +716,7 @@

Earlier one couldn't multi file compile modules that had different - tagdefaul, which now is possible. Equal Type/Value names in different + tagdefault, which now is possible. Equal Type/Value names in different modules are resolved by renaming (concatenate type name and module name): If two types with the same name T exist in module A and module B they will get the new names TA and TB.

@@ -775,7 +776,7 @@ Fixed errors and malfunctions -

Now gives the compiler an apropriate error report when exported +

Now gives the compiler an appropriate error report when exported undefined types are detected.

(Own Id: OTP-4129)

@@ -787,13 +788,13 @@

(Aux Id: seq7165)

-

In case of per and compact_bit_string the rightmost byte were erronous +

In case of per and compact_bit_string the rightmost byte were erroneous truncated when the rightmost bits of that byte were zeros. This is now corrected.

(Own Id: OTP-4200)

-

Bad match of returnvalue from decode_length in skipvalue/3 has now been +

Bad match of return-value from decode_length in skipvalue/3 has now been fixed.

(Own Id: OTP-4232)

@@ -836,7 +837,7 @@

(Aux Id: seq 1188)

-

Now it is checked in run-time if a OBJECT IDENTIFIER value is unvalid

+

Now it is checked in run-time if a OBJECT IDENTIFIER value is invalid

(Own Id: OTP-4235)

@@ -1422,7 +1423,7 @@

A very limited part of ITU-T recommendation X.681 Abstract Syntax Notation One (ASN.1): Information object specification is now implemented. Specifically \011 - TYPE IDENTIFIER is reqognized by the compiler.

+ TYPE IDENTIFIER is recognized by the compiler.

Own Id: OTP-3325

@@ -1455,7 +1456,7 @@ version of the compiler. The BER runtime functions are also corrected. Note that this correction has already been delivered as a - bugfix for R4B (OTP-2951).

+ bug-fix for R4B (OTP-2951).

Own Id: OTP-3202

Aux Id: Seq3745

@@ -1523,7 +1524,7 @@

The handling of types with extension marker "..." is corrected. Earlier each SEQUENCE and SET with an extension marker got an extra field named asn1_EXT in the generated record. - This was a mistake and that field is now removed (conserns + This was a mistake and that field is now removed (concerns both BER and BER).

Own Id: OTP-2724

Aux Id: seq 1148, OTP-2719

diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/notes.xml erlang-13.b.3-dfsg/lib/asn1/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/asn1/doc/src/notes.xml 2009-04-16 10:25:08.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/notes.xml 2009-11-20 13:34:24.000000000 +0000 @@ -26,16 +26,92 @@ nil nil nil + notes.xml

This document describes the changes made to the asn1 application.

+ +
Asn1 1.6.12 + +
Improvements and New Features + + +

+ The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

+

+ Own Id: OTP-8256

+
+
+
+ +
+ + +
Asn1 1.6.11 + +
Improvements and New Features + + +

+ A new option {n2n,TypeName} can be used to + enable generation of conversion functions from name to number + and vice versa for selected ENUMERATION types. + The option can be repeated many times in order to specify several + types in the same file.
+ If the TypeName specified does not exists or is not an + ENUMERATION type, the compilation will be terminated with an + error code.
+ Below follows an example on how to use the option from the command line with erlc:
+ erlc -bper_bin +optimize +driver +"{n2n,'CauseMisc'}" +"{n2n,'CausePcl'}" MyModyle.asn +

+

+ Own Id: OTP-8136 Aux Id: seq11347

+
+ +

+ Range checks added for BIT STRING with fixed SIZE + constraint.

+

+ Own Id: OTP-7972 Aux Id: seq11280

+
+ +

+ Now support multiple-line comments in asn1-specs as + specified in ASN1 X.680 (07/2002), section 11.6.4

+

+ Own Id: OTP-8043

+
+ +

+ Now parses and adds abstract syntax for PATTERN subtype + constraint. No other action is taken on this type of + constraint.

+

+ Own Id: OTP-8046

+
+ +

+ The ASN1 subtype constraint CONTAINING Type, + CONTAINING Type ENCODED BY Value and ENCODED BY + Value now is parsed. Abstract syntax is added but no + further action in generated code is taken.

+

+ Own Id: OTP-8047

+
+
+
+ +
+
Asn1 1.6.10
Fixed Bugs and Malfunctions

- A faulty receive case that catched all messages in the + A faulty receive case that catch-ed all messages in the initialization of the driver has been removed, the initialization has been restructured.

@@ -66,7 +142,7 @@

Error that caused crash when drivers were loaded is now - corrected. Parallell driver for asn1 now enabled.

+ corrected. Parallel driver for asn1 now enabled.

Own Id: OTP-7904 Aux Id: seq11220

@@ -93,7 +169,7 @@

- Removed parallell-driver functionality due to failure + Removed parallel-driver functionality due to failure when loading the driver.

Own Id: OTP-7900 Aux Id: seq11220

@@ -125,7 +201,7 @@

A BIT STRING with a size constraint that has a single value and an extension as in BIT STRING (SIZE - (16,...)) was erronous encoded/decoded. This is now + (16,...)) was erroneous encoded/decoded. This is now corrected and follows X.691 Section 15.6.

Own Id: OTP-7876 Aux Id: seq11220

@@ -140,7 +216,7 @@

- Now asn1 starts multiple drivers to enable simultanous + Now asn1 starts multiple drivers to enable simultaneous encode/decode in different processes for the asn1-backends using linked-in driver.

@@ -202,7 +278,7 @@

A a SEQUENCE OF with a type that is a CHOICE with - ellipses occured falsely a compile error. The error + ellipses occurred falsely a compile error. The error causing that is now removed.

Own Id: OTP-7708 Aux Id: seq11136

@@ -218,7 +294,7 @@

- constrained number with a valuerange greater than 512 now + constrained number with a value-range greater than 512 now has the proper interpretation of the values that causes shift to the next number of units (bits), According to limit condition 2^m < "range" =< 2^(m + 1) then the @@ -275,9 +351,9 @@

- A bug, related to instatiation of a parameterized type - with a type definition in the parameterlist, has been - removed. The defininition of the parameter type was in + A bug, related to instantiation of a parameterized type + with a type definition in the parameter-list, has been + removed. The definition of the parameter type was in another module than the instance definition causing limited module info.

@@ -285,7 +361,7 @@

- Removed hardcoded name that may cause name collision.

+ Removed hard-coded name that may cause name collision.

Own Id: OTP-7322 Aux Id: seq10864

@@ -309,8 +385,8 @@

A corrupted encoding may cause a loop when a buffer of at least two bytes of zero matches tag and length of a SET - component. This behaviour occured only with decoder - generated with ber or ber_bin optionsNow a + component. This behavior occurred only with decoder + generated with ber or ber_bin options. Now a control breaks the loop.

Own Id: OTP-7533

@@ -338,7 +414,7 @@

By the asn1 compiler option {record_name_prefix - Name} a prefix is choosen to the name of the record + Name} a prefix is chosen to the name of the record generated in the .hrl and used in the generated .erl files.

@@ -353,7 +429,7 @@

Extended support for ObjectSetFromObjects. Production - occured as a part of the RootElementSetSpec of the + occurred as a part of the RootElementSetSpec of the ObjectSetSpec. Added also support for Exclusion of Element in ObjectSetSpec.

@@ -376,7 +452,7 @@

- Now is ordering, accordering to the canonical order, of + Now is ordering, according to the canonical order, of components in a SET added. Canonical order is described in X.691 9.2 and X.680 8.6

@@ -387,7 +463,7 @@ The precedence rules for extended constraints have been misinterpreted. The rule says for instance that if there are more than one constraint on a type that have - extensionmark, only the last of the extensionmarks would + extension-mark, only the last of the extension-marks would be kept. This affects the encoding of PER and is now corrected.

@@ -395,7 +471,7 @@

- A constrained number with a singlevalue constraint that + A constrained number with a single-value constraint that is extensible was falsely encoded/decoded in aligned/unaligned PER. This is now corrected.

@@ -489,7 +565,7 @@

A bug related to renaming of types has been fixed.This - occured using the .set.asn functionality.

+ occurred using the .set.asn functionality.

Own Id: OTP-7149 Aux Id: seq10853

@@ -583,7 +659,7 @@

- inline failed because tring to use a removed + inline failed because trying to use a removed module.

Own Id: OTP-6769

@@ -599,7 +675,7 @@

Handling of decode pattern for exclusive decode was false - in the case when an undecoded component had more than one + in the case when an un-decoded component had more than one following elements that should be decoded.

Own Id: OTP-6786

@@ -633,7 +709,7 @@

Merging modules by inline earlier disabled the driver (used in modules generated with - [ptimized]/[optimized,driver] options). Now this is + [optimized]/[optimized,driver] options). Now this is repaired.

Own Id: OTP-6601

@@ -666,7 +742,7 @@
-

There are also release notes for older versions.

+
diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/asn1/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/asn1/doc/src/part_notes.xml 2007-11-26 13:12:09.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/part_notes.xml 2009-11-20 13:34:23.000000000 +0000 @@ -1,26 +1,24 @@ - +
- 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Asn1 Release Notes @@ -36,6 +34,6 @@

There are also release notes for older versions.

- + diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/part.xml erlang-13.b.3-dfsg/lib/asn1/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/asn1/doc/src/part.xml 2007-11-26 13:11:51.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/part.xml 2009-11-20 13:34:02.000000000 +0000 @@ -1,26 +1,24 @@ - +
- 1999 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Asn1 User's Guide @@ -35,7 +33,7 @@ contains modules with compile-time and run-time support for ASN.1.

- - + + diff -Nru erlang-13.b.1-dfsg/lib/asn1/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/asn1/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/asn1/doc/src/ref_man.xml 2007-11-26 13:11:51.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/asn1/doc/src/ref_man.xml 2009-11-20 13:34:02.000000000 +0000 @@ -1,26 +1,24 @@ - +
- 1999 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Asn1 Reference Manual @@ -34,7 +32,7 @@

The Asn1 application contains modules with compile-time and run-time support for ASN.1.

- - + + diff -Nru erlang-13.b.1-dfsg/lib/asn1/src/asn1.appup.src erlang-13.b.3-dfsg/lib/asn1/src/asn1.appup.src --- erlang-13.b.1-dfsg/lib/asn1/src/asn1.appup.src 2009-04-16 10:25:03.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/src/asn1.appup.src 2009-09-18 15:10:40.000000000 +0100 @@ -38,6 +38,19 @@ {load_module, asn1rt_driver_handler, soft_purge, soft_purge, []}, {apply, {asn1rt_driver_handler,unload_driver,[]}} ] + }, + {"1.6.10", + [ + {load_module, asn1rt, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin_rt2ct, soft_purge, soft_purge, []}, + {load_module, asn1rt_uper_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin_v2, soft_purge, soft_purge, []}, + {load_module, asn1rt_check, soft_purge, soft_purge, []}, + {load_module, asn1rt_driver_handler, soft_purge, soft_purge, []}, + {apply, {asn1rt_driver_handler,unload_driver,[]}} + ] } ], [ @@ -79,6 +92,19 @@ {load_module, asn1rt_driver_handler, soft_purge, soft_purge, []}, {apply, {asn1rt_driver_handler,unload_driver,[]}} ] + }, + {"1.6.10", + [ + {load_module, asn1rt, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin_rt2ct, soft_purge, soft_purge, []}, + {load_module, asn1rt_uper_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin_v2, soft_purge, soft_purge, []}, + {load_module, asn1rt_check, soft_purge, soft_purge, []}, + {load_module, asn1rt_driver_handler, soft_purge, soft_purge, []}, + {apply, {asn1rt_driver_handler,unload_driver,[]}} + ] } ]}. diff -Nru erlang-13.b.1-dfsg/lib/asn1/src/asn1ct.erl erlang-13.b.3-dfsg/lib/asn1/src/asn1ct.erl --- erlang-13.b.1-dfsg/lib/asn1/src/asn1ct.erl 2009-04-16 10:24:59.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/src/asn1ct.erl 2009-09-18 15:10:30.000000000 +0100 @@ -831,18 +831,31 @@ _ -> ok end, - asn1ct_gen:pgen(OutFile,EncodingRule,M#module.name,GenTOrV), + Result = + case (catch asn1ct_gen:pgen(OutFile,EncodingRule, + M#module.name,GenTOrV)) of + {'EXIT',Reason2} -> + io:format("ERROR: ~p~n",[Reason2]), + {error,Reason2}; + _ -> + ok + end, debug_off(Options), put(compact_bit_string,false), erase(encoding_options), erase(tlv_format), % used in ber_bin, optimize erase(class_default_type),% used in ber_bin, optimize ets:delete(check_functions), - case lists:member(sg,Options) of - true -> % terminate here , with .erl file generated - {false,true}; - false -> - {true,true} + case Result of + {error,_} -> + {false,Result}; + ok -> + case lists:member(sg,Options) of + true -> % terminate here , with .erl file generated + {false,true}; + false -> + {true,true} + end end; generate({false,M},_,_,_) -> {false,M}. diff -Nru erlang-13.b.1-dfsg/lib/asn1/src/asn1ct_gen.erl erlang-13.b.3-dfsg/lib/asn1/src/asn1ct_gen.erl --- erlang-13.b.1-dfsg/lib/asn1/src/asn1ct_gen.erl 2009-04-16 10:25:03.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/src/asn1ct_gen.erl 2009-09-18 15:10:37.000000000 +0100 @@ -60,7 +60,17 @@ pgen_module(OutFile,Erules,Module,TypeOrVal,true). -pgen_module(OutFile,Erules,Module,TypeOrVal,Indent) -> +pgen_module(OutFile,Erules,Module, + TypeOrVal = {Types,_Values,_Ptypes,_Classes,_Objects,_ObjectSets}, + Indent) -> + N2nConvEnums = [CName|| {n2n,CName} <- get(encoding_options)], + case N2nConvEnums -- Types of + [] -> + ok; + UnmatchedTypes -> + exit({"Non existing ENUMERATION types used in n2n option", + UnmatchedTypes}) + end, put(outfile,OutFile), HrlGenerated = pgen_hrl(Erules,Module,TypeOrVal,Indent), asn1ct_name:start(), @@ -71,7 +81,7 @@ pgen_exports(Erules,Module,TypeOrVal), pgen_dispatcher(Erules,Module,TypeOrVal), pgen_info(), - pgen_typeorval(wrap_ber(Erules),Module,TypeOrVal), + pgen_typeorval(wrap_ber(Erules),Module,N2nConvEnums,TypeOrVal), pgen_partial_incomplete_decode(Erules), % gen_vars(asn1_db:mod_to_vars(Module)), % gen_tag_table(AllTypes), @@ -79,17 +89,19 @@ io:format("--~p--~n",[{generated,ErlFile}]). -pgen_typeorval(Erules,Module,{Types,Values,_Ptypes,_Classes,Objects,ObjectSets}) -> - pgen_types(Erules,Module,Types), +pgen_typeorval(Erules,Module,N2nConvEnums,{Types,Values,_Ptypes,_Classes,Objects,ObjectSets}) -> + Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules), + rt2ct_suffix(Erules)])), + pgen_types(Rtmod,Erules,N2nConvEnums,Module,Types), pgen_values(Erules,Module,Values), - pgen_objects(Erules,Module,Objects), - pgen_objectsets(Erules,Module,ObjectSets), + pgen_objects(Rtmod,Erules,Module,Objects), + pgen_objectsets(Rtmod,Erules,Module,ObjectSets), case catch lists:member(der,get(encoding_options)) of true -> pgen_check_defaultval(Erules,Module); _ -> ok end, - pgen_partial_decode(Erules,Module). + pgen_partial_decode(Rtmod,Erules,Module). pgen_values(_,_,[]) -> true; @@ -98,44 +110,67 @@ gen_value(Valuedef), pgen_values(Erules,Module,T). -pgen_types(_,Module,[]) -> +pgen_types(_,_,_,Module,[]) -> gen_value_match(Module), true; -pgen_types(Erules,Module,[H|T]) -> - Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules), - rt2ct_suffix(Erules)])), +pgen_types(Rtmod,Erules,N2nConvEnums,Module,[H|T]) -> asn1ct_name:clear(), Typedef = asn1_db:dbget(Module,H), Rtmod:gen_encode(Erules,Typedef), asn1ct_name:clear(), Rtmod:gen_decode(Erules,Typedef), - pgen_types(Erules,Module,T). + case lists:member(H,N2nConvEnums) of + true -> + pgen_n2nconversion(Erules,Typedef); + _ -> + true + end, + pgen_types(Rtmod,Erules,N2nConvEnums,Module,T). + +pgen_n2nconversion(_Erules,#typedef{name=TypeName,typespec=#type{def={'ENUMERATED',{NN1,NN2}}}}) -> + NN = NN1 ++ NN2, + pgen_name2numfunc(TypeName,NN), + pgen_num2namefunc(TypeName,NN); +pgen_n2nconversion(_Erules,_) -> + true. -pgen_objects(_,_,[]) -> +pgen_name2numfunc(_TypeName,[]) -> true; -pgen_objects(Erules,Module,[H|T]) -> - Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules), - rt2ct_suffix(Erules)])), +pgen_name2numfunc(TypeName,[{Atom,Number}]) -> + emit(["name2num_",TypeName,"(",{asis,Atom},") ->",Number,".",nl,nl]); +pgen_name2numfunc(TypeName,[{Atom,Number}|NNRest]) -> + emit(["name2num_",TypeName,"(",{asis,Atom},") ->",Number,";",nl]), + pgen_name2numfunc(TypeName,NNRest). + +pgen_num2namefunc(_TypeName,[]) -> + true; +pgen_num2namefunc(TypeName,[{Atom,Number}]) -> + emit(["num2name_",TypeName,"(",Number,") ->",{asis,Atom},".",nl,nl]); +pgen_num2namefunc(TypeName,[{Atom,Number}|NNRest]) -> + emit(["num2name_",TypeName,"(",Number,") ->",{asis,Atom},";",nl]), + pgen_num2namefunc(TypeName,NNRest). + +pgen_objects(_,_,_,[]) -> + true; +pgen_objects(Rtmod,Erules,Module,[H|T]) -> asn1ct_name:clear(), Typedef = asn1_db:dbget(Module,H), Rtmod:gen_obj_code(Erules,Module,Typedef), - pgen_objects(Erules,Module,T). + pgen_objects(Rtmod,Erules,Module,T). -pgen_objectsets(_,_,[]) -> +pgen_objectsets(_,_,_,[]) -> true; -pgen_objectsets(Erules,Module,[H|T]) -> - Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules), - rt2ct_suffix(Erules)])), +pgen_objectsets(Rtmod,Erules,Module,[H|T]) -> asn1ct_name:clear(), TypeDef = asn1_db:dbget(Module,H), Rtmod:gen_objectset_code(Erules,TypeDef), - pgen_objectsets(Erules,Module,T). + pgen_objectsets(Rtmod,Erules,Module,T). pgen_check_defaultval(Erules,Module) -> CheckObjects = ets:tab2list(check_functions), case get(asndebug) of true -> - FileName = lists:concat([Module,'.table']), + FileName = lists:concat([Module,".table"]), {ok,IoDevice} = file:open(FileName,[write]), Fun = fun(X)-> @@ -148,13 +183,13 @@ end, gen_check_defaultval(Erules,Module,CheckObjects). -pgen_partial_decode(Erule,Module) when Erule == ber_bin_v2 -> - pgen_partial_inc_dec(Erule,Module), - pgen_partial_dec(Erule,Module); -pgen_partial_decode(_,_) -> +pgen_partial_decode(Rtmod,Erule,Module) when Erule == ber_bin_v2 -> + pgen_partial_inc_dec(Rtmod,Erule,Module), + pgen_partial_dec(Rtmod,Erule,Module); +pgen_partial_decode(_,_,_) -> ok. -pgen_partial_inc_dec(Erules,Module) -> +pgen_partial_inc_dec(Rtmod,Erules,Module) -> % io:format("Start partial incomplete decode gen?~n"), case asn1ct:get_gen_state_field(inc_type_pattern) of undefined -> @@ -164,15 +199,13 @@ % ok; ConfList -> PatternLists=lists:map(fun({_,P}) -> P end,ConfList), - pgen_partial_inc_dec1(Erules,Module,PatternLists), - gen_partial_inc_dec_refed_funcs(Erules) + pgen_partial_inc_dec1(Rtmod,Erules,Module,PatternLists), + gen_partial_inc_dec_refed_funcs(Rtmod,Erules) end. %% pgen_partial_inc_dec1 generates a function of the toptype in each %% of the partial incomplete decoded types. -pgen_partial_inc_dec1(Erules,Module,[P|Ps]) -> - Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules), - rt2ct_suffix(Erules)])), +pgen_partial_inc_dec1(Rtmod,Erules,Module,[P|Ps]) -> TopTypeName = asn1ct:partial_inc_dec_toptype(P), TypeDef=asn1_db:dbget(Module,TopTypeName), asn1ct_name:clear(), @@ -189,14 +222,12 @@ ok end, Rtmod:gen_decode(Erules,TypeDef), - gen_dec_part_inner_constr(Erules,TypeDef,[TopTypeName]), - pgen_partial_inc_dec1(Erules,Module,Ps); -pgen_partial_inc_dec1(_,_,[]) -> + gen_dec_part_inner_constr(Rtmod,Erules,TypeDef,[TopTypeName]), + pgen_partial_inc_dec1(Rtmod,Erules,Module,Ps); +pgen_partial_inc_dec1(_,_,_,[]) -> ok. -gen_partial_inc_dec_refed_funcs(Erule) when Erule == ber_bin_v2 -> - Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erule), - rt2ct_suffix(Erule)])), +gen_partial_inc_dec_refed_funcs(Rtmod,Erule) when Erule == ber_bin_v2 -> case asn1ct:next_refed_func() of [] -> ok; @@ -205,20 +236,20 @@ asn1ct:update_gen_state(namelist,Pattern), asn1ct:set_current_sindex(Sindex), Rtmod:gen_inc_decode(Erule,TypeDef), - gen_dec_part_inner_constr(Erule,TypeDef,[Name]), - gen_partial_inc_dec_refed_funcs(Erule); + gen_dec_part_inner_constr(Rtmod,Erule,TypeDef,[Name]), + gen_partial_inc_dec_refed_funcs(Rtmod,Erule); {Name,Sindex,Pattern,Type} -> TypeDef=#typedef{name=asn1ct_gen:list2name(Name),typespec=Type}, asn1ct:update_gen_state(namelist,Pattern), asn1ct:set_current_sindex(Sindex), Rtmod:gen_inc_decode(Erule,TypeDef), - gen_dec_part_inner_constr(Erule,TypeDef,Name), - gen_partial_inc_dec_refed_funcs(Erule) + gen_dec_part_inner_constr(Rtmod,Erule,TypeDef,Name), + gen_partial_inc_dec_refed_funcs(Rtmod,Erule) end; -gen_partial_inc_dec_refed_funcs(_) -> +gen_partial_inc_dec_refed_funcs(_,_) -> ok. -pgen_partial_dec(Erules,_Module) -> +pgen_partial_dec(_Rtmod,Erules,_Module) -> Type_pattern = asn1ct:get_gen_state_field(type_pattern), % io:format("Type_pattern: ~w~n",[Type_pattern]), %% Get the typedef of the top type and follow into the choosen components until the last type/component. @@ -363,51 +394,45 @@ %% of the partial incomplete decode and are defined within the top %% type.Constructed subtypes deeper in the structure will be generated %% in turn after all top types have been generated. -gen_dec_part_inner_constr(Erules,TypeDef,TypeName) -> +gen_dec_part_inner_constr(Rtmod,Erules,TypeDef,TypeName) -> Def = TypeDef#typedef.typespec, InnerType = asn1ct_gen:get_inner(Def#type.def), case InnerType of 'SET' -> #'SET'{components=Components} = Def#type.def, - gen_dec_part_inner_types(Erules,Components,TypeName); + gen_dec_part_inner_types(Rtmod,Erules,Components,TypeName); %% Continue generate the inner of each component 'SEQUENCE' -> #'SEQUENCE'{components=Components} = Def#type.def, - gen_dec_part_inner_types(Erules,Components,TypeName); + gen_dec_part_inner_types(Rtmod,Erules,Components,TypeName); 'CHOICE' -> {_,Components} = Def#type.def, - gen_dec_part_inner_types(Erules,Components,TypeName); + gen_dec_part_inner_types(Rtmod,Erules,Components,TypeName); 'SEQUENCE OF' -> %% this and next case must be the last component in the %% partial decode chain here. Not likely that this occur. {_,Type} = Def#type.def, NameSuffix = constructed_suffix(InnerType,Type#type.def), - Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules), - rt2ct_suffix(Erules)])), asn1ct_name:clear(), Rtmod:gen_decode(Erules,[NameSuffix|TypeName],Type); %% gen_types(Erules,[NameSuffix|Typename],Type); 'SET OF' -> {_,Type} = Def#type.def, NameSuffix = constructed_suffix(InnerType,Type#type.def), - Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules), - rt2ct_suffix(Erules)])), asn1ct_name:clear(), Rtmod:gen_decode(Erules,[NameSuffix|TypeName],Type); _ -> ok end. -gen_dec_part_inner_types(Erules,[ComponentType|Rest],TypeName) -> - Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules), - rt2ct_suffix(Erules)])), +gen_dec_part_inner_types(Rtmod,Erules,[ComponentType|Rest],TypeName) -> asn1ct_name:clear(), Rtmod:gen_decode(Erules,TypeName,ComponentType), - gen_dec_part_inner_types(Erules,Rest,TypeName); -gen_dec_part_inner_types(Erules,{Comps1,Comps2},TypeName) + gen_dec_part_inner_types(Rtmod,Erules,Rest,TypeName); +gen_dec_part_inner_types(Rtmod,Erules,{Comps1,Comps2},TypeName) when is_list(Comps1),is_list(Comps2) -> - gen_dec_part_inner_types(Erules,Comps1 ++ Comps2,TypeName); -gen_dec_part_inner_types(_,[],_) -> + gen_dec_part_inner_types(Rtmod,Erules,Comps1 ++ Comps2,TypeName); +gen_dec_part_inner_types(_,_,[],_) -> ok. @@ -797,6 +822,14 @@ _ -> ok end end, + case [X || {n2n,X} <- get(encoding_options)] of + [] -> ok; + A2nNames -> + emit({"-export([",nl}), + gen_exports1(A2nNames,"name2num_",1), + emit({"-export([",nl}), + gen_exports1(A2nNames,"num2name_",1) + end, case Values of [] -> ok; _ -> diff -Nru erlang-13.b.1-dfsg/lib/asn1/src/asn1ct_gen_per_rt2ct.erl erlang-13.b.3-dfsg/lib/asn1/src/asn1ct_gen_per_rt2ct.erl --- erlang-13.b.1-dfsg/lib/asn1/src/asn1ct_gen_per_rt2ct.erl 2009-04-16 10:25:06.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/src/asn1ct_gen_per_rt2ct.erl 2009-09-18 15:10:42.000000000 +0100 @@ -601,7 +601,8 @@ emit_enc_enumerated_case(_Erule,C, {0,EnumName}, Count) -> %% ENUMERATED with extensionmark %% values within extension root - emit(["'",EnumName,"' -> [0,?RT_PER:encode_integer(",{asis,C},", ",Count,")]"]); +%% emit(["'",EnumName,"' -> [0,?RT_PER:encode_integer(",{asis,C},", ",Count,")]"]); + emit(["'",EnumName,"' -> ",{asis,[0|asn1rt_per_bin_rt2ct:encode_integer(C,Count)]}]); emit_enc_enumerated_case(_Erule, _C, 'EXT_MARK', _Count) -> true. %% %% This clause is invoked in case of an ENUMERATED without extension mark diff -Nru erlang-13.b.1-dfsg/lib/asn1/src/asn1ct_parser2.erl erlang-13.b.3-dfsg/lib/asn1/src/asn1ct_parser2.erl --- erlang-13.b.1-dfsg/lib/asn1/src/asn1ct_parser2.erl 2009-04-16 10:25:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/src/asn1ct_parser2.erl 2009-09-18 15:10:40.000000000 +0100 @@ -1859,16 +1859,16 @@ [got,get_token(hd(Tokens)),expected, [identifier,'identifier.']]}}). -parse_ContentsConstraint([{_,_,'CONTAINING'}|Rest]) -> +parse_ContentsConstraint([{'CONTAINING',_}|Rest]) -> {Type,Rest2} = parse_Type(Rest), case Rest2 of - [{_,_,'ENCODED'},{_,_,'BY'}|Rest3] -> + [{'ENCODED',_},{'BY',_}|Rest3] -> {Value,Rest4} = parse_Value(Rest3), {{contentsconstraint,Type,Value},Rest4}; _ -> {{contentsconstraint,Type,[]},Rest2} end; -parse_ContentsConstraint([{_,_,'ENCODED'},{_,_,'BY'}|Rest]) -> +parse_ContentsConstraint([{'ENCODED',_},{'BY',_}|Rest]) -> {Value,Rest2} = parse_Value(Rest), {{contentsconstraint,[],Value},Rest2}; parse_ContentsConstraint(Tokens) -> @@ -2798,6 +2798,9 @@ throw({asn1_error,{get_line(hd(Rest)),get(asn1_module), [got,get_token(hd(Rest)),expected,'}']}}) end; +parse_SubtypeElements([{'PATTERN',_}|Tokens]) -> + {Value,Rest} = parse_Value(Tokens), + {{pattern,Value},Rest}; %% SingleValue %% ContainedSubtype %% ValueRange diff -Nru erlang-13.b.1-dfsg/lib/asn1/src/asn1ct_tok.erl erlang-13.b.3-dfsg/lib/asn1/src/asn1ct_tok.erl --- erlang-13.b.1-dfsg/lib/asn1/src/asn1ct_tok.erl 2009-04-16 10:25:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/src/asn1ct_tok.erl 2009-09-18 15:10:32.000000000 +0100 @@ -49,11 +49,27 @@ {'ERR',Reason} -> io:format("Tokeniser error on line: ~w ~w~n",[Lno,Reason]), exit(0); + {multiline_comment,NestingLevel} -> + {RestL,Lno2} = process_skip_multiline_comment(Stream,Lno,NestingLevel), + process(RestL,Stream,Lno2,R); T -> %%io:format('toks:~w~n',[T]), process(Stream,Lno,[T|R]) end. +process_skip_multiline_comment(Stream,Lno,NestingLevel) -> + process_skip_multiline_comment(io:get_line(Stream, ''), + Stream, Lno + 1, NestingLevel). +process_skip_multiline_comment(eof,_Stream,Lno,_NestingLevel) -> + io:format("Tokeniser error on line: ~w, premature end of multiline comment~n",[Lno]), + exit(0); +process_skip_multiline_comment(Line,Stream,Lno,NestingLevel) -> + case catch skip_multiline_comment(Line,NestingLevel) of + {multiline_comment,NestingLevel2} -> + process_skip_multiline_comment(Stream,Lno,NestingLevel2); + T -> + {T,Lno} + end. tokenise([H|T],Lno) when $a =< H , H =< $z -> {X, T1} = get_name(T, [H]), @@ -91,6 +107,10 @@ tokenise([$-,$-|T],Lno) -> tokenise(skip_comment(T),Lno); + +tokenise([$/,$*|T],Lno) -> + tokenise(skip_multiline_comment(T,0),Lno); + tokenise([$:,$:,$=|T],Lno) -> [{'::=',Lno}|tokenise(T,Lno)]; @@ -231,6 +251,19 @@ skip_comment([_|T]) -> skip_comment(T). + +skip_multiline_comment([],L) -> + throw({multiline_comment,L}); +skip_multiline_comment([$*,$/|T],0) -> + T; +skip_multiline_comment([$*,$/|T],Level) -> + skip_multiline_comment(T,Level - 1); +skip_multiline_comment([$/,$*|T],Level) -> + skip_multiline_comment(T,Level + 1); +skip_multiline_comment([_|T],Level) -> + skip_multiline_comment(T,Level). + + collect_quoted([$',$B|T],Lno, L) -> case check_bin(L) of true -> @@ -292,10 +325,12 @@ reserved_word('COMPONENT') -> true; reserved_word('COMPONENTS') -> true; reserved_word('CONSTRAINED') -> true; +reserved_word('CONTAINING') -> true; reserved_word('DEFAULT') -> true; reserved_word('DEFINED') -> true; reserved_word('DEFINITIONS') -> true; reserved_word('EMBEDDED') -> true; +reserved_word('ENCODED') -> true; reserved_word('END') -> true; reserved_word('ENUMERATED') -> true; reserved_word('EXCEPT') -> true; @@ -327,6 +362,7 @@ reserved_word('OCTET') -> true; reserved_word('OF') -> true; reserved_word('OPTIONAL') -> true; +reserved_word('PATTERN') -> true; reserved_word('PDV') -> true; reserved_word('PLUS-INFINITY') -> true; reserved_word('PRESENT') -> true; diff -Nru erlang-13.b.1-dfsg/lib/asn1/src/asn1rt_driver_handler.erl erlang-13.b.3-dfsg/lib/asn1/src/asn1rt_driver_handler.erl --- erlang-13.b.1-dfsg/lib/asn1/src/asn1rt_driver_handler.erl 2009-04-16 10:25:08.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/src/asn1rt_driver_handler.erl 2009-09-18 15:10:43.000000000 +0100 @@ -78,15 +78,18 @@ Result = open_named_ports(), catch (FromPid ! {FromRef,Result}), loop(Result); - {error,_Err} -> % if erl_ddll:load_driver fails + {error,Err} -> % if erl_ddll:load_driver fails + ForErr = erl_ddll:format_error(Err), OSDir = filename:join(Dir,erlang:system_info(system_architecture)), case catch erl_ddll:load_driver(OSDir,asn1_erl_drv) of ok -> Result = open_named_ports(), catch (FromPid ! {FromRef,Result}), loop(Result); - Error -> - catch (FromPid ! {FromRef,Error}) + {error,Err2} -> +% catch (FromPid ! {FromRef,Error}) + ForErr2 = erl_ddll:format_error(Err2), + catch (FromPid ! {FromRef,{error,{{Dir,ForErr},{OSDir,ForErr2}}}}) end end. diff -Nru erlang-13.b.1-dfsg/lib/asn1/src/asn1rt_per_bin_rt2ct.erl erlang-13.b.3-dfsg/lib/asn1/src/asn1rt_per_bin_rt2ct.erl --- erlang-13.b.1-dfsg/lib/asn1/src/asn1rt_per_bin_rt2ct.erl 2009-04-16 10:25:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/src/asn1rt_per_bin_rt2ct.erl 2009-09-18 15:10:42.000000000 +0100 @@ -933,10 +933,12 @@ encode_bit_string(Int, BitListValue, _) when is_list(BitListValue),is_integer(Int),Int =< 16 -> %% The type is constrained by a single value size constraint + %% range_check(Int,length(BitListValue)), [40,Int,length(BitListValue),BitListValue]; encode_bit_string(Int, BitListValue, _) when is_list(BitListValue),is_integer(Int), Int =< 255 -> %% The type is constrained by a single value size constraint + %% range_check(Int,length(BitListValue)), [2,40,Int,length(BitListValue),BitListValue]; encode_bit_string(Int, BitListValue, _) when is_list(BitListValue),is_integer(Int), Int < ?'64K' -> @@ -1029,14 +1031,17 @@ %% encode_bin_bit_string/3, when value is a tuple of Unused and BinBits. %% Unused = integer(),i.e. number unused bits in least sign. byte of %% BinBits = binary(). -encode_bin_bit_string(C,{_,BinBits},_NamedBitList) +encode_bin_bit_string(C,{Unused,BinBits},_NamedBitList) when is_integer(C),C=<16 -> + range_check(C,bit_size(BinBits) - Unused), [45,C,size(BinBits),BinBits]; -encode_bin_bit_string(C,{_Unused,BinBits},_NamedBitList) +encode_bin_bit_string(C,{Unused,BinBits},_NamedBitList) when is_integer(C), C =< 255 -> + range_check(C,bit_size(BinBits) - Unused), [2,45,C,size(BinBits),BinBits]; -encode_bin_bit_string(C,{_Unused,BinBits},_NamedBitList) +encode_bin_bit_string(C,{Unused,BinBits},_NamedBitList) when is_integer(C), C =< 65535 -> + range_check(C,bit_size(BinBits) - Unused), case size(BinBits) of Size when Size =< 255 -> [2,46,<>,Size,BinBits]; @@ -1076,6 +1081,11 @@ 2,octets_unused_to_complete(Unused1,Size,Bin1)] end. +range_check(C,C) when is_integer(C) -> + ok; +range_check(C1,C2) when is_integer(C1) -> + exit({error,{asn1,{bit_string_out_of_range,{C1,C2}}}}). + remove_trailing_bin([], {Unused,Bin}) -> {Unused,Bin}; remove_trailing_bin(_NamedNumberList,{_Unused,<<>>}) -> diff -Nru erlang-13.b.1-dfsg/lib/asn1/vsn.mk erlang-13.b.3-dfsg/lib/asn1/vsn.mk --- erlang-13.b.1-dfsg/lib/asn1/vsn.mk 2009-04-16 10:25:02.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/asn1/vsn.mk 2009-11-20 13:33:54.000000000 +0000 @@ -1,7 +1,21 @@ -#next version number to use is 1.6.6 | 1.7 | 2.0 -ASN1_VSN = 1.6.10 +#next version number to use is 1.6.13 | 1.7 | 2.0 +ASN1_VSN = 1.6.12 -TICKETS = OTP-7953 OTP-7954 +TICKETS = OTP-8256 + +TICKETS_1.6.12 = \ + OTP-8256 + +TICKETS_1.6.11 = \ + OTP-8136 \ + OTP-8047 \ + OTP-8046 \ + OTP-8043 \ + OTP-7972 + +TICKETS_1.6.10 = \ + OTP-7954 \ + OTP-7953 TICKETS_1.6.10 = \ OTP-7954 \ diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/basics_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/basics_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/basics_chapter.xml 2009-03-16 18:35:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/basics_chapter.xml 2009-11-21 16:51:00.000000000 +0000 @@ -26,6 +26,7 @@ 2003-10-21 + basics_chapter.xml
@@ -44,7 +45,7 @@

- The SUT (system under test) may consist of one or several target + The SUT (System Under Test) may consist of one or several target nodes. CT contains a generic test server which together with other test utilities is used to perform test case execution. It is possible to start the tests from the CT GUI or from an OS- or @@ -64,17 +65,17 @@ specialized or used directly for controlling instruments, traffic generators etc.

-

For white-box testing of Erlang code, the test programs can of - course call Erlang API functions directly. Black-box testing of - Erlang code can use Erlang RPC as well as standard O&M interfaces - if desired. +

Common Test is also a very useful tool for white-box testing Erlang + code since the test programs can call Erlang API functions directly. + For black-box testing Erlang software, Erlang RPC as well as + standard O&M interfaces can be used.

A test case can handle several connections towards one or several target systems, instruments and traffic generators in parallel in order to perform the necessary actions for a test. The handling of many connections in parallel is one of - the major strengths of CT! + the major strengths of Common Test!

@@ -84,35 +85,55 @@ The test suites are organized in test directories and each test suite may have a separate data directory. Typically, these files and directories are version controlled similarly to other forms of source code (possibly by - means of some CVS-like tool). However, CT does not itself put any requirements - on (or has any form of awareness of) possible file and directory versions. + means of a version control system like GIT or Subversion). However, CT does + not itself put any requirements on (or has any form of awareness of) + possible file and directory versions.

Support Libraries

- Support libraries are functions that are useful for all test suites + Support libraries contain functions that are useful for all test suites, or for test suites in a specific functional area or subsystem. - So as well as the general support libraries provided by the - CT framework there might be a need for customized support libraries - on a subsystem level. + In addition to the general support libraries provided by the + CT framework, and the various libraries and applications provided by + Erlang/OTP, there might also be a need for customized (user specific) + support libraries.

- Scripting Suite and Test Cases + Suites and Test Cases

- Testing is performed by running test suites (a set of test cases) or + Testing is performed by running test suites (sets of test cases) or individual test cases. A test suite is implemented as an Erlang module named _SUITE.erl]]> which contains a number of test cases. A test case is an Erlang function which tests one or more things. The test case is the smallest unit that the CT test server deals with.

-

- The test suite file must conform to a certain interface which is specified - by the CT test server. See the section on writing test suites for more information. + Subsets of test cases, called test case groups, may also be defined. A test case + group can have execution properties associated with it. Execution properties + specify whether the test cases in the group should be executed in + random order, in parallel, in sequence, and if the execution of the group + should be repeated. Test case groups may also be nested (i.e. a group may, + besides test cases, contain sub-groups). +

+

+ Besides test cases and groups, the test suite may also contain configuration + functions. These functions are meant to be used for setting up (and verifying) + environment and state on the SUT (and/or the CT host node), required for + the tests to execute correctly. Examples of operations: Opening a connection + to the SUT, initializing a database, running an installation script, etc. + Configuration may be performed per suite, per test case group and per + individual test case. +

+

+ The test suite module must conform to a callback interface specified + by the CT test server. See the + Writing Test Suites chapter + for more information.

@@ -145,52 +166,58 @@ in the user console (only start and stop information, plus a note for each failed test case).

-

- The result from each test case is recorded in an HTML log file which is created - for the particular test run. Each test case is represented by a row in a table that shows - the total execution time, whether the case was successful or if it failed or was skipped, - plus a possible user comment. For a failed test case, the reason for termination is printed. - The HTML file has a link to the logfile for each test case (which may also be viewed - with an HTML browser). + The result from each test case is recorded in a dedicated HTML log file, created + for the particular test run. An overview page displays each test case represented + by row in a table showing total execution time, whether the case was successful, + failed or skipped, plus an optional user comment. (For a failed test case, the + reason for termination is also printed in the comment field). The overview page + has a link to each test case log file, providing simple navigation with any standard + HTML browser.

External Interfaces -

- The CT test server requires some default functions in a - test suite. Each suite module should define and export the - following functions (most are however optional): + The CT test server requires that the test suite defines and exports the + following mandatory or optional callback functions:

- all()Returns a list of all test cases in the suite. (Mandatory) - suite()Default suite configuration. (Optional) + all() + Returns a list of all test cases in the suite. (Mandatory) + suite() + Info function used to return properties for the suite. (Optional) groups() - For declaring test case groups. (Optional) + For declaring test case groups. (Optional) init_per_suite(Config) - Executed before the first test case in a suite. (Optional) + Suite level configuration function, executed before the first + test case. (Optional) end_per_suite(Config) - Executed after the last test case in a suite. (Optional) - init_per_group(Config) - Executed before the first test case in a group. (Optional) - end_per_group(Config) - Executed after the last test case in a group. (Optional) - init_per_testcase(TC, Config) - Executed before each test case. (Optional) - end_per_testcase(TC, Config) - Executed after each test case. (Optional) + Suite level configuration function, executed after the last + test case. (Optional) + init_per_group(GroupName, Config) + Configuration function for a group, executed before the first + test case. (Mandatory if groups are defined) + end_per_group(GroupName, Config) + Configuration function for a group, executed after the last + test case. (Mandatory if groups are defined) + init_per_testcase(TestCase, Config) + Configuration function for a testcase, executed before each + test case. (Optional) + end_per_testcase(TestCase, Config) + Configuration function for a testcase, executed after each + test case. (Optional)

- For each test case the CT test server needs these functions: + For each test case the CT test server expects these functions:

Testcasename() - Returns a key-value list of test case configuration/information. (Optional) + Info function that returns a list of test case properties. (Optional) Testcasename(Config) - The actual test case function. + The actual test case function.
diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/book.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/book.xml 2009-03-12 12:26:50.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/book.xml 2009-11-20 13:35:12.000000000 +0000 @@ -1,7 +1,7 @@ - +
20032009 @@ -34,12 +34,15 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/common_test_app.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/common_test_app.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/common_test_app.xml 2009-03-16 18:35:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/common_test_app.xml 2009-11-23 14:58:38.000000000 +0000 @@ -1,7 +1,7 @@ - + - +
20032009 @@ -31,8 +31,8 @@ PA1 common_test_app.sgml
- common_test - A framework for automated testing of arbitrary target nodes + common_test + A framework for automated testing of arbitrary target nodes @@ -240,7 +240,7 @@ -

OPTIONAL

+

MANDATORY (only if one or more groups are defined)

This function is called before execution of a test case group. It typically contains initialization which is common for @@ -271,7 +271,7 @@ -

OPTIONAL

+

MANDATORY (only if one or more groups are defined)

This function is called after the execution of a test case group is finished. It is meant to be used for cleaning up after init_per_group/2. @@ -284,7 +284,7 @@

For more information about test case groups, please see Test case groups chapter in the User's Guide.

-
+ @@ -312,13 +312,14 @@ - Module:end_per_testcase(TestCase, Config) -> void() | {save_config,SaveConfig} + Module:end_per_testcase(TestCase, Config) -> void() | {fail,Reason} | {save_config,SaveConfig} Test case finalization. TestCase = atom() Config = SaveConfig = [{Key,Value}] Key = atom() Value = term() + Reason = term() @@ -326,8 +327,10 @@

This function is called after each test case, and can be used to clean up after init_per_testcase/2 and the test case. - Any return value (besides {save_config,SaveConfig}) is ignored. - For information on save_config, please see + Any return value (besides {fail,Reason} and {save_config,SaveConfig}) + is ignored. By returning {fail,Reason}, TestCase will be marked as + failed (even though it was actually successful in the sense that it returned + a value instead of terminating). For information on save_config, please see Dependencies between Test Cases and Suites in the User's Guide

@@ -408,7 +411,7 @@

This is the implementation of a test case. Here you must call the functions you want to test, and do whatever you - need to check the result. If someting fails, make sure the + need to check the result. If something fails, make sure the function causes a runtime error, or call ct:fail/[0,1] (which also causes the test case process to crash).

@@ -440,6 +443,6 @@ -
+ diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/config_file_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/config_file_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/config_file_chapter.xml 2009-04-16 10:26:02.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/config_file_chapter.xml 2009-11-20 13:35:14.000000000 +0000 @@ -26,6 +26,7 @@ + config_file_chapter.xml
diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/cover_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/cover_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/cover_chapter.xml 2009-03-12 12:27:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/cover_chapter.xml 2009-11-20 13:35:19.000000000 +0000 @@ -26,6 +26,7 @@ + cover_chapter.xml
diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/ct_master_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/ct_master_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/ct_master_chapter.xml 2009-03-12 12:27:11.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/ct_master_chapter.xml 2009-11-20 13:35:19.000000000 +0000 @@ -26,6 +26,7 @@ + ct_master_chapter.xml
@@ -163,7 +164,7 @@ {skip_suites, t3, all, "Not implemented"}. -

This example specfies the same tests as the original example. But +

This example specifies the same tests as the original example. But now if started with a call to ct_master:run(TestSpecName), the t1 test will be executed on node ct_node@host_x (node1), the t2 test on ct_node@host_y (node2) and the t3 test on both diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/dependencies_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/dependencies_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/dependencies_chapter.xml 2009-03-16 18:35:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/dependencies_chapter.xml 2009-11-20 13:35:18.000000000 +0000 @@ -26,6 +26,7 @@ + dependencies_chapter.xml

diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/event_handler_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/event_handler_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/event_handler_chapter.xml 2009-06-05 17:40:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/event_handler_chapter.xml 2009-11-21 16:51:01.000000000 +0000 @@ -26,16 +26,17 @@ + event_handler_chapter.xml
General

It is possible for the operator of a Common Test system to receive - event notifications continously during a test session execution. It is - reported e.g. when a test case starts and stops, what the current - count of succeeded, failed and skipped cases is, etc. This information can - be used for different purposes such as logging progress and results on + event notifications continously during a test run. It is reported e.g. + when a test case starts and stops, what the current count of successful, + failed and skipped cases is, etc. This information can be used for + different purposes such as logging progress and results on other format than HTML, saving statistics to a database for report generation and test system supervision.

@@ -44,8 +45,8 @@ server starts, it spawns an event manager. During test execution the manager gets a notification from the server every time something of potential interest happens. Any event handler plugged into the - event manager can match on event notifications, take some action - or pass the information on. Event handlers are Erlang modules + event manager can match on events of interest, take action, or maybe + simply pass the information on. Event handlers are Erlang modules implemented by the Common Test user according to the gen_event behaviour (see the OTP User's Guide and Reference Manual for more information).

@@ -53,7 +54,7 @@

As already described, a Common Test server always starts an event manager. The server also plugs in a default event handler which has as its only purpose to relay notifications to a globally registered CT Master - event manager (if a CT Master server is actually running in the system). + event manager (if a CT Master server is running in the system). The CT Master also spawns an event manager at startup. Event handlers plugged into this manager will receive the events from all the test nodes as well as information from the CT Master server @@ -61,7 +62,40 @@

Usage -

Event handlers may be plugged in by means of +

Event handlers may be installed by means of an event_handler + start flag (run_test) or option (ct:run_test/1), where the + argument specifies the names of one or more event handler modules. + Example:

+

$ run_test -suite test/my_SUITE -event_handler handlers/my_evh1 + handlers/my_evh2 -pa $PWD/handlers

+

All event handler modules must have gen_event behaviour. Note also that + these modules must be precompiled, and that their locations must be + added explicitly to the Erlang code server search path (like in the + example).

+ +

It is not possible to specify start arguments to the event handlers when + using the run_test script. You may however pass along start arguments + if you use the ct:run_test/1 function. An event_handler tuple in the argument + Opts has the following definition (see also ct:run_test/1 in the + reference manual):

+ +
+    {event_handler,EventHandlers}
+
+    EventHandlers = EH | [EH]
+    EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs}
+    InitArgs = [term()] 
+    
+ +

Example:

+
+    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).
+    
+

This will install two event handlers for the my_SUITE test. Event handler + my_evh1 is started with [] as argument to the init function. Event handler + my_evh2 is started with the name of the current node in the init argument list.

+ +

Event handlers can also be plugged in by means of test specification terms:

@@ -70,11 +104,9 @@

{event_handler, NodeRefs, EventHandlers}, or

{event_handler, NodeRefs, EventHandlers, InitArgs}

-

EventHandlers is a list of modules (each having gen_event - behaviour). An event handler module must be precompiled and its - location must be specified in the Erlang runtime system code path. - Before a test session starts, the init function of each plugged in - event handler is called (with the InitArgs list as argument or [] if +

EventHandlers is a list of module names. Before a test + session starts, the init function of each plugged in event handler + is called (with the InitArgs list as argument or [] if no start arguments are given).

To plug a handler into the CT Master event manager, specify @@ -88,147 +120,188 @@

name is the label (type) of the event. node is the name of the node the event has originated from (only relevant for CT Master event handlers). - data is data specific for the particular event.

+ data is specific for the particular event.

-

Events:

-
-    %% Indication that the test run is starting.
-    #event.name = test_start
-    #event.data = {StartTime,LogDir}
-    StartTime = {date(),time()}
-    LogDir = string()
-  
-    %% Initial information about the test run; the number of
-    %% tests, suites and test cases. Note that if a test case
-    %% group with a repeat property exists, the total number
-    %% of test cases can not be calculated (unknown).
-    #event.name = start_info
-    #event.data = {Tests,Suites,Cases}
-    Tests = Suites = integer()
-    Cases = integer() | unknown
-
-    %% Indication that the test run is finished.
-    #event.name = test_done
-    #event.data = EndTime
-    EndTime = {date(),time()}
-  
-    %% Common Test is compiling files in specified directory.
-    #event.name = start_make
-    #event.data = Dir
-    Dir = string()
-  
-    %% Common Test is finished with compilation.
-    #event.name = finished_make
-    #event.data = Dir
-    Dir = string()
-  
-    %% A test case is starting. In case of a test case group
-    %% configuration function, the group name and properties
-    %% are also given.
-    #event.name = tc_start
-    #event.data = {Suite,CaseOrGroup}
-    Suite = atom()
-    CaseOrGroup = Case | {Conf,GroupName,GroupProperties}
-    Case = atom()
-    Conf = init_per_group | end_per_group
-    GroupName = atom()
-    GroupProperties = list()
-
-    %% A test case is finished and this event reports the
-    %% result. In case of a test case group configuration 
-    %% function, the group name and properties are also given.
-    #event.name = tc_done
-    #event.data = {Suite,CaseOrGroup,Result}
-    Suite = atom()
-    CaseOrGroup = Case | {Conf,GroupName,GroupProperties}
-    Case = atom()
-    Conf = init_per_group | end_per_group
-    GroupName = atom()
-    GroupProperties = list()
-    Result = ok | {skipped,Reason} | {failed,Reason}
-    Reason = term()
-  
-    %% A test case has been skipped by the user.
-    #event.name = tc_user_skip
-    #event.data = {Suite,Case,Comment}
-    Suite = atom()
-    Case = atom()
-    Comment = string()
-  
-    %% A test case has been automatically skipped by
-    %% Common Test (e.g. because of a failing configuration 
-    %% function or an unsuccessful require operation).
-    #event.name = tc_auto_skip
-    #event.data = {Suite,Case,Comment}
-    Suite = atom()
-    Case = atom()
-    Comment = string()
-  
-    %% A statistics event with the current count of 
-    %% successful, skipped and failed test cases so far.
-    %% This event gets sent after the end of each test case.
-    #event.name = test_stats
-    #event.data = {Ok,Failed,Skipped}
-    Ok = Failed = Skipped = integer()
-  
-    %% Indication that the logging process of Common Test
-    %% has been started successfully and is ready for IO.
-    #event.name = start_logging
-    #event.data = CtRunDir
-    CtRunDir = string()
-  
-    %% Indication that the logging process of Common Test
-    %% has been shut down at the end of the test run.
-    #event.name = stop_logging
-    #event.data = []
-  
-    %% Internal event used by the Common Test Master
-    %% process to synchronize particular file operations.
-    #event.name = start_write_file
-    #event.data = FullNameFile
-    FullNameFile = string()
-
-    %% Internal event used by the Common Test Master
-    %% process to synchronize particular file operations.  
-    #event.name = finished_write_file
-    #event.data = FullNameFile
-    FullNameFile = string()
-    
+

General events:

+ + + #event{name = start_logging, data = LogDir} +

LogDir = string(), top level log directory for the test run.

+

Indicates that the logging process of Common Test + has started successfully and is ready to receive IO + messages.

+ + #event{name = stop_logging, data = []} +

Indicates that the logging process of Common Test + has been shut down at the end of the test run. +

+ + #event{name = test_start, data = {StartTime,LogDir}} +

StartTime = {date(),time()}, test run start date and time.

+

LogDir = string(), top level log directory for the test run.

+

This event indicates that Common Test has finished initial preparations + and will begin executing test cases. +

+ + #event{name = test_done, data = EndTime} +

EndTime = {date(),time()}, date and time the test run finished.

+

This indicates that the last test case has been executed and + Common Test is shutting down. +

+ + #event{name = start_info, data = {Tests,Suites,Cases}} +

Tests = integer(), the number of tests.

+

Suites = integer(), the total number of suites.

+

Cases = integer() | unknown, the total number of test cases.

+

Initial test run information that can be interpreted as: "This test + run will execute Tests separate tests, in total containing + Cases number of test cases, in Suites number of suites". + Note that if a test case group with a repeat property exists in any test, + the total number of test cases can not be calculated (unknown). +

+ + #event{name = tc_start, data = {Suite,FuncOrGroup}} +

Suite = atom(), name of the test suite.

+

FuncOrGroup = Func | {Conf,GroupName,GroupProperties}

+

Func = atom(), name of test case or configuration function.

+

Conf = init_per_group | end_per_group, group configuration function.

+

GroupName = atom(), name of the group.

+

GroupProperties = list(), list of execution properties for the group.

+

This event informs about the start of a test case, or a group configuration + function. The event is sent also for init_per_suite and end_per_suite, + but not for init_per_testcase and end_per_testcase. If a group + configuration function is starting, the group name and execution properties + are also given. +

+ + #event{name = tc_done, data = {Suite,FuncOrGroup,Result}} +

Suite = atom(), name of the suite.

+

FuncOrGroup = Func | {Conf,GroupName,GroupProperties}

+

Func = atom(), name of test case or configuration function.

+

Conf = init_per_group | end_per_group, group configuration function.

+

GroupName = unknown | atom(), name of the group + (unknown if init- or end function times out).

+

GroupProperties = list(), list of execution properties for the group.

+

Result = ok | {skipped,SkipReason} | {failed,FailReason}, the result.

+

SkipReason = {require_failed,RequireInfo} | + {require_failed_in_suite0,RequireInfo} | + {failed,{Suite,init_per_testcase,FailInfo}} | + UserTerm, + the reason why the case has been skipped.

+

FailReason = {error,FailInfo} | + {error,{RunTimeError,StackTrace}} | + {timetrap_timeout,integer()} | + {failed,{Suite,end_per_testcase,FailInfo}}, reason for failure.

+

RequireInfo = {not_available,atom()}, why require has failed.

+

FailInfo = {timetrap_timeout,integer()} | + {RunTimeError,StackTrace} | + UserTerm, + detailed information about an error.

+

RunTimeError = term(), a run-time error, e.g. badmatch, undef, etc.

+

StackTrace = list(), list of function calls preceeding a run-time error.

+

UserTerm = term(), arbitrary data specified by user, or exit/1 info.

+

This event informs about the end of a test case or a configuration function (see the + tc_start event for details on the FuncOrGroup element). With this event comes the + final result of the function in question. It is possible to determine on the top level + of Result if the function was successful, skipped (by the user), or if it failed. + It is of course possible to dig deeper and also perform pattern matching on the various + reasons for skipped or failed. Note that {'EXIT',Reason} tuples have been translated into + {error,Reason}. Note also that if a {failed,{Suite,end_per_testcase,FailInfo} + result is received, it actually means the test case was successful, but that + end_per_testcase for the case failed. +

+ + #event{name = tc_auto_skip, data = {Suite,Func,Reason}} +

Suite = atom(), the name of the suite.

+

Func = atom(), the name of the test case or configuration function.

+

Reason = {failed,FailReason} | + {require_failed_in_suite0,RequireInfo}, + reason for auto skipping Func.

+

FailReason = {Suite,ConfigFunc,FailInfo}} | + {Suite,FailedCaseInSequence}, reason for failure.

+

RequireInfo = {not_available,atom()}, why require has failed.

+

ConfigFunc = init_per_suite | init_per_group

+

FailInfo = {timetrap_timeout,integer()} | + {RunTimeError,StackTrace} | + bad_return | UserTerm, + detailed information about an error.

+

FailedCaseInSequence = atom(), name of a case that has failed in a sequence.

+

RunTimeError = term(), a run-time error, e.g. badmatch, undef, etc.

+

StackTrace = list(), list of function calls preceeding a run-time error.

+

UserTerm = term(), arbitrary data specified by user, or exit/1 info.

+

This event gets sent for every test case or configuration function that Common Test + has skipped automatically because of either a failed init_per_suite or + init_per_group, a failed require in suite/0, or a failed test case + in a sequence. Note that this event is never received as a result of a test case getting + skipped because of init_per_testcase failing, since that information is carried with + the tc_done event. +

+ + #event{name = tc_user_skip, data = {Suite,TestCase,Comment}} +

Suite = atom(), name of the suite.

+

TestCase = atom(), name of the test case.

+

Comment = string(), reason for skipping the test case.

+

This event specifies that a test case has been skipped by the user. + It is only ever received if the skip was declared in a test specification. + Otherwise, user skip information is received as a {skipped,SkipReason} + result in the tc_done event for the test case. +

+ + #event{name = test_stats, data = {Ok,Failed,Skipped}} +

Ok = integer(), the current number of successful test cases.

+

Failed = integer(), the current number of failed test cases.

+

Skipped = {UserSkipped,AutoSkipped}

+

UserSkipped = integer(), the current number of user skipped test cases.

+

AutoSkipped = integer(), the current number of auto skipped test cases.

+

This is a statistics event with the current count of successful, skipped + and failed test cases so far. This event gets sent after the end of each test case, + immediately following the tc_done event. +

+
+ +

Internal events:

+ + + #event{name = start_make, data = Dir} +

Dir = string(), running make in this directory.

+

An internal event saying that Common Test will start compiling + modules in directory Dir. +

+ + #event{name = finished_make, data = Dir} +

Dir = string(), finished running make in this directory.

+

An internal event saying that Common Test is finished compiling + modules in directory Dir. +

+ + #event{name = start_write_file, data = FullNameFile} +

FullNameFile = string(), full name of the file.

+

An internal event used by the Common Test Master process to + synchronize particular file operations. +

+ + #event{name = finished_write_file, data = FullNameFile} +

FullNameFile = string(), full name of the file.

+

An internal event used by the Common Test Master process to + synchronize particular file operations. +

+ +

The events are also documented in ct_event.erl. This module may serve as an example of what an event handler for the CT event manager can look like.

- -

Besides the event_handler test specification terms, it is also possible - to install event handlers by means of the run_test flag -event_handler, - e.g:

- -
-    $ run_test -dir my_testobj -event_handler my_evh1 my_evh2
-    
- -

Note that it is not posible to specify start arguments to the event handlers when - using the run_test script. You may however pass along start arguments - if you use the ct:run_test/1 function. An event_handler tuple in the argument - Opts has the following definition (see also ct:run_test/1 in the - reference manual):

- -
-    {event_handler,EventHandlers}
-
-    EventHandlers = EH | [EH]
-    EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs}
-    InitArgs = [term()] 
-    
- -

Example:

-
-    1> ct:run_test([{dir,"my_testobj"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).
-    
-

This will install two event handlers for the my_testobj test. Event handler - my_evh1 is started with [] as argument to the init function. Event handler - my_evh2 is started with the name of the current node in the init argument list.

+

To ensure that printouts to standard out (or printouts made with + ct:log/2/3 or ct:pal/2/3) get written to the test case log + file, and not to the Common Test framework log, you can syncronize + with the Common Test server by matching on the tc_start and tc_done + events. In the period between these events, all IO gets directed to the + test case log file. These events are sent synchronously to avoid potential + timing problems (e.g. that the test case log file gets closed just before + an IO message from an external process gets through). Knowing this, you + need to be careful that your handle_event/2 callback function doesn't + stall the test execution, possibly causing unexpected behaviour as a result.

diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/example_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/example_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/example_chapter.xml 2009-03-12 12:26:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/example_chapter.xml 2009-11-21 16:51:01.000000000 +0000 @@ -21,130 +21,487 @@ - Examples - Siri Hansen + Examples and Templates + Peter Andersson + example_chapter.xml
- Test suite -

The example test suite shows some tests of an HTTP client that - uses a proxy. + Test suite example +

This example test suite shows some tests of a database server.

- --module(httpc_proxy_SUITE). + +-module(db_data_type_SUITE). + +-include("ct.hrl"). + +%% Test server callbacks +-export([suite/0, all/0, + init_per_suite/1, end_per_suite/1, + init_per_testcase/2, end_per_testcase/2]). + +%% Test cases +-export([string/1, integer/1]). + +-define(CONNECT_STR, "DSN=sqlserver;UID=alladin;PWD=sesame"). + +%%-------------------------------------------------------------------- +%% COMMON TEST CALLBACK FUNCTIONS +%%-------------------------------------------------------------------- + +%%-------------------------------------------------------------------- +%% Function: suite() -> Info +%% +%% Info = [tuple()] +%% List of key/value pairs. +%% +%% Description: Returns list of tuples to set default properties +%% for the suite. +%%-------------------------------------------------------------------- +suite() -> + [{timetrap,{minutes,1}}]. + +%%-------------------------------------------------------------------- +%% Function: init_per_suite(Config0) -> Config1 +%% +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% +%% Description: Initialization before the suite. +%%-------------------------------------------------------------------- +init_per_suite(Config) -> + {ok, Ref} = db:connect(?CONNECT_STR, []), + TableName = db_lib:unique_table_name(), + [{con_ref, Ref },{table_name, TableName}| Config]. + +%%-------------------------------------------------------------------- +%% Function: end_per_suite(Config) -> void() +%% +%% Config = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% +%% Description: Cleanup after the suite. +%%-------------------------------------------------------------------- +end_per_suite(Config) -> + Ref = ?config(con_ref, Config), + db:disconnect(Ref), + ok. + +%%-------------------------------------------------------------------- +%% Function: init_per_testcase(TestCase, Config0) -> Config1 +%% +%% TestCase = atom() +%% Name of the test case that is about to run. +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% +%% Description: Initialization before each test case. +%%-------------------------------------------------------------------- +init_per_testcase(Case, Config) -> + Ref = ?config(con_ref, Config), + TableName = ?config(table_name, Config), + ok = db:create_table(Ref, TableName, table_type(Case)), + Config. + +%%-------------------------------------------------------------------- +%% Function: end_per_testcase(TestCase, Config) -> void() +%% +%% TestCase = atom() +%% Name of the test case that is finished. +%% Config = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% +%% Description: Cleanup after each test case. +%%-------------------------------------------------------------------- +end_per_testcase(_Case, Config) -> + Ref = ?config(con_ref, Config), + TableName = ?config(table_name, Config), + ok = db:delete_table(Ref, TableName), + ok. + +%%-------------------------------------------------------------------- +%% Function: all() -> GroupsAndTestCases +%% +%% GroupsAndTestCases = [{group,GroupName} | TestCase] +%% GroupName = atom() +%% Name of a test case group. +%% TestCase = atom() +%% Name of a test case. +%% +%% Description: Returns the list of groups and test cases that +%% are to be executed. +%%-------------------------------------------------------------------- +all() -> + [string, integer]. + + +%%-------------------------------------------------------------------- +%% TEST CASES +%%-------------------------------------------------------------------- + +string(Config) -> + insert_and_lookup(dummy_key, "Dummy string", Config). + +integer(Config) -> + insert_and_lookup(dummy_key, 42, Config). + + +insert_and_lookup(Key, Value, Config) -> + Ref = ?config(con_ref, Config), + TableName = ?config(table_name, Config), + ok = db:insert(Ref, TableName, Key, Value), + [Value] = db:lookup(Ref, TableName, Key), + ok = db:delete(Ref, TableName, Key), + [] = db:lookup(Ref, TableName, Key), + ok. + + +
+ +
+ Test suite templates +

The Erlang mode for the Emacs editor includes two Common Test test suite + templates, one with extensive information in the function headers, and + one with minimal information. A test suite template provides a quick start + for implementing a suite from scratch and gives you a good overview + of the available callback functions. Here are the templates in question: +

+ +

Large Common Test suite

+ +%%%------------------------------------------------------------------- +%%% File : example_SUITE.erl +%%% Author : +%%% Description : +%%% +%%% Created : +%%%------------------------------------------------------------------- +-module(example_SUITE). %% Note: This directive should only be used in test suites. -compile(export_all). -include("ct.hrl"). --define(URL, "http://www.erlang.org"). --define(PROXY, "www-proxy.ericsson.se"). --define(PROXY_PORT, 8080). - %%-------------------------------------------------------------------- -%% Test server callback functions +%% COMMON TEST CALLBACK FUNCTIONS %%-------------------------------------------------------------------- %%-------------------------------------------------------------------- -%% Function: suite() -> DefaultData -%% DefaultData: [tuple()] -%% Description: Require variables and set default values for the suite +%% Function: suite() -> Info +%% +%% Info = [tuple()] +%% List of key/value pairs. +%% +%% Description: Returns list of tuples to set default properties +%% for the suite. +%% +%% Note: The suite/0 function is only meant to be used to return +%% default data values, not perform any other operations. %%-------------------------------------------------------------------- -suite() -> [{timetrap,{minutes,1}}]. +suite() -> + [{timetrap,{minutes,10}}]. %%-------------------------------------------------------------------- -%% Function: init_per_suite(Config) -> Config -%% Config: [tuple()] +%% Function: init_per_suite(Config0) -> +%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1} +%% +%% Config0 = Config1 = [tuple()] %% A list of key/value pairs, holding the test case configuration. -%% Description: Initiation before the whole suite +%% Reason = term() +%% The reason for skipping the suite. +%% +%% Description: Initialization before the suite. %% %% Note: This function is free to add any key/value pairs to the Config %% variable, but should NOT alter/remove any existing entries. %%-------------------------------------------------------------------- init_per_suite(Config) -> - application:start(inets), - http:set_options([{proxy, {{?PROXY, ?PROXY_PORT}, ["localhost"]}}]), Config. %%-------------------------------------------------------------------- -%% Function: end_per_suite(Config) -> _ -%% Config: [tuple()] +%% Function: end_per_suite(Config0) -> void() | {save_config,Config1} +%% +%% Config0 = Config1 = [tuple()] %% A list of key/value pairs, holding the test case configuration. -%% Description: Cleanup after the whole suite +%% +%% Description: Cleanup after the suite. %%-------------------------------------------------------------------- end_per_suite(_Config) -> - application:stop(inets), ok. + +%%-------------------------------------------------------------------- +%% Function: init_per_group(GroupName, Config0) -> +%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1} +%% +%% GroupName = atom() +%% Name of the test case group that is about to run. +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding configuration data for the group. +%% Reason = term() +%% The reason for skipping all test cases and subgroups in the group. +%% +%% Description: Initialization before each test case group. +%%-------------------------------------------------------------------- +init_per_group(_GroupName, Config) -> + Config. + +%%-------------------------------------------------------------------- +%% Function: end_per_group(GroupName, Config0) -> +%% void() | {save_config,Config1} +%% +%% GroupName = atom() +%% Name of the test case group that is finished. +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding configuration data for the group. +%% +%% Description: Cleanup after each test case group. +%%-------------------------------------------------------------------- +end_per_group(_GroupName, _Config) -> + ok. + %%-------------------------------------------------------------------- -%% Function: all() -> TestCases -%% TestCases: [Case] -%% Case: atom() +%% Function: init_per_testcase(TestCase, Config0) -> +%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1} +%% +%% TestCase = atom() +%% Name of the test case that is about to run. +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% Reason = term() +%% The reason for skipping the test case. +%% +%% Description: Initialization before each test case. +%% +%% Note: This function is free to add any key/value pairs to the Config +%% variable, but should NOT alter/remove any existing entries. +%%-------------------------------------------------------------------- +init_per_testcase(_TestCase, Config) -> + Config. + +%%-------------------------------------------------------------------- +%% Function: end_per_testcase(TestCase, Config0) -> +%% void() | {save_config,Config1} | {fail,Reason} +%% +%% TestCase = atom() +%% Name of the test case that is finished. +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% Reason = term() +%% The reason for failing the test case. +%% +%% Description: Cleanup after each test case. +%%-------------------------------------------------------------------- +end_per_testcase(_TestCase, _Config) -> + ok. + +%%-------------------------------------------------------------------- +%% Function: groups() -> [Group] +%% +%% Group = {GroupName,Properties,GroupsAndTestCases} +%% GroupName = atom() +%% The name of the group. +%% Properties = [parallel | sequence | Shuffle | {RepeatType,N}] +%% Group properties that may be combined. +%% GroupsAndTestCases = [Group | {group,GroupName} | TestCase] +%% TestCase = atom() +%% The name of a test case. +%% Shuffle = shuffle | {shuffle,Seed} +%% To get cases executed in random order. +%% Seed = {integer(),integer(),integer()} +%% RepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail | +%% repeat_until_any_ok | repeat_until_any_fail +%% To get execution of cases repeated. +%% N = integer() | forever +%% +%% Description: Returns a list of test case group definitions. +%%-------------------------------------------------------------------- +groups() -> + []. + +%%-------------------------------------------------------------------- +%% Function: all() -> GroupsAndTestCases | {skip,Reason} +%% +%% GroupsAndTestCases = [{group,GroupName} | TestCase] +%% GroupName = atom() +%% Name of a test case group. +%% TestCase = atom() %% Name of a test case. -%% Description: Returns a list of all test cases in this test suite -%%-------------------------------------------------------------------- +%% Reason = term() +%% The reason for skipping all groups and test cases. +%% +%% Description: Returns the list of groups and test cases that +%% are to be executed. +%%-------------------------------------------------------------------- all() -> - [options, head, get, trace]. + [my_test_case]. + + +%%-------------------------------------------------------------------- +%% TEST CASES +%%-------------------------------------------------------------------- + +%%-------------------------------------------------------------------- +%% Function: TestCase() -> Info +%% +%% Info = [tuple()] +%% List of key/value pairs. +%% +%% Description: Test case info function - returns list of tuples to set +%% properties for the test case. +%% +%% Note: This function is only meant to be used to return a list of +%% values, not perform any other operations. +%%-------------------------------------------------------------------- +my_test_case() -> + []. + +%%-------------------------------------------------------------------- +%% Function: TestCase(Config0) -> +%% ok | exit() | {skip,Reason} | {comment,Comment} | +%% {save_config,Config1} | {skip_and_save,Reason,Config1} +%% +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% Reason = term() +%% The reason for skipping the test case. +%% Comment = term() +%% A comment about the test case that will be printed in the html log. +%% +%% Description: Test case function. (The name of it must be specified in +%% the all/0 list or in a test case group for the test case +%% to be executed). +%%-------------------------------------------------------------------- +my_test_case(_Config) -> + ok. + +

+

Small Common Test suite

+ +%%%------------------------------------------------------------------- +%%% File : example_SUITE.erl +%%% Author : +%%% Description : +%%% +%%% Created : +%%%------------------------------------------------------------------- +-module(example_SUITE). + +-compile(export_all). + +-include("ct.hrl"). + +%%-------------------------------------------------------------------- +%% Function: suite() -> Info +%% Info = [tuple()] +%%-------------------------------------------------------------------- +suite() -> + [{timetrap,{seconds,30}}]. + +%%-------------------------------------------------------------------- +%% Function: init_per_suite(Config0) -> +%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1} +%% Config0 = Config1 = [tuple()] +%% Reason = term() +%%-------------------------------------------------------------------- +init_per_suite(Config) -> + Config. -%%------------------------------------------------------------------------- -%% Test cases starts here. -%%------------------------------------------------------------------------- - -options() -> - [{userdata,[{doc,"Perform an OPTIONS request that goes through a proxy."}]}]. - -options(_Config) -> - {ok, {{_,200,_}, Headers, _}} = - http:request(options, {?URL, []}, [], []), - case lists:keysearch("allow", 1, Headers) of - {value, {"allow", _}} -> - ok; - _ -> - ct:fail(http_options_request_failed) - end. - -head() -> - [{userdata,[{doc,"Perform a HEAD request that goes through a proxy."}]}]. - -head(_Config) -> - {ok, {{_,200, _}, [_ | _], []}} = - http:request(head, {?URL, []}, [], []). - -get() -> - [{userdata,[{doc, "Perform a GET request that goes through a proxy."}]}]. - -get(_Config) -> - {ok, {{_,200,_}, [_ | _], Body = [_ | _]}} = - http:request(get, {?URL, []}, [], []), - check_body(Body). - -trace() -> - [{userdata,[{doc, "Perform a TRACE request that goes through a proxy."}]}]. - -trace(_Config) -> - {ok, {{_,200,_}, [_ | _], "TRACE /" ++ _}} = - http:request(trace, {?URL, []}, [], []), +%%-------------------------------------------------------------------- +%% Function: end_per_suite(Config0) -> void() | {save_config,Config1} +%% Config0 = Config1 = [tuple()] +%%-------------------------------------------------------------------- +end_per_suite(_Config) -> ok. %%-------------------------------------------------------------------- -%% Internal functions -%%-------------------------------------------------------------------- - -check_body(Body) -> - case string:rstr(Body, "\html>") of - 0 -> - ct:fail(did_not_receive_whole_body); - _ -> - ok - end. - +%% Function: init_per_group(GroupName, Config0) -> +%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1} +%% GroupName = atom() +%% Config0 = Config1 = [tuple()] +%% Reason = term() +%%-------------------------------------------------------------------- +init_per_group(_GroupName, Config) -> + Config. + +%%-------------------------------------------------------------------- +%% Function: end_per_group(GroupName, Config0) -> +%% void() | {save_config,Config1} +%% GroupName = atom() +%% Config0 = Config1 = [tuple()] +%%-------------------------------------------------------------------- +end_per_group(_GroupName, _Config) -> + ok. + +%%-------------------------------------------------------------------- +%% Function: init_per_testcase(TestCase, Config0) -> +%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1} +%% TestCase = atom() +%% Config0 = Config1 = [tuple()] +%% Reason = term() +%%-------------------------------------------------------------------- +init_per_testcase(_TestCase, Config) -> + Config. + +%%-------------------------------------------------------------------- +%% Function: end_per_testcase(TestCase, Config0) -> +%% void() | {save_config,Config1} | {fail,Reason} +%% TestCase = atom() +%% Config0 = Config1 = [tuple()] +%% Reason = term() +%%-------------------------------------------------------------------- +end_per_testcase(_TestCase, _Config) -> + ok. + +%%-------------------------------------------------------------------- +%% Function: groups() -> [Group] +%% Group = {GroupName,Properties,GroupsAndTestCases} +%% GroupName = atom() +%% Properties = [parallel | sequence | Shuffle | {RepeatType,N}] +%% GroupsAndTestCases = [Group | {group,GroupName} | TestCase] +%% TestCase = atom() +%% Shuffle = shuffle | {shuffle,{integer(),integer(),integer()}} +%% RepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail | +%% repeat_until_any_ok | repeat_until_any_fail +%% N = integer() | forever +%%-------------------------------------------------------------------- +groups() -> + []. + +%%-------------------------------------------------------------------- +%% Function: all() -> GroupsAndTestCases | {skip,Reason} +%% GroupsAndTestCases = [{group,GroupName} | TestCase] +%% GroupName = atom() +%% TestCase = atom() +%% Reason = term() +%%-------------------------------------------------------------------- +all() -> + [my_test_case]. + +%%-------------------------------------------------------------------- +%% Function: TestCase() -> Info +%% Info = [tuple()] +%%-------------------------------------------------------------------- +my_test_case() -> + []. + +%%-------------------------------------------------------------------- +%% Function: TestCase(Config0) -> +%% ok | exit() | {skip,Reason} | {comment,Comment} | +%% {save_config,Config1} | {skip_and_save,Reason,Config1} +%% Config0 = Config1 = [tuple()] +%% Reason = term() +%% Comment = term() +%%-------------------------------------------------------------------- +my_test_case(_Config) -> + ok. -
+
diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/install_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/install_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/install_chapter.xml 2009-03-12 12:27:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/install_chapter.xml 2009-11-21 16:51:02.000000000 +0000 @@ -26,28 +26,52 @@ 2007-07-03 + install_chapter.xml
- Unix + + General information -

Copy the Common Test and Test Server application - directories, ]]> and - ]]>, to a location of your choice. They do - not have to be placed among the Erlang applications under the OTP - lib directory, nor do they need to have a particular path relative - to your test suite modules. In the Common Test directory you - find the shell script install.sh. Execute this script - to generate the Common Test start script run_test in the - sub directory /priv/bin]]>.

- -

install.sh takes one input parameter which specifies the - absolute path to the top directory of Common Test and Test - Server. (This path is inserted in the run_test script so - that when the script starts Erlang, the Erlang code server will be - able to load the Common Test and Test Server application - modules). Example (assuming Common Test and Test Server have been - placed in /usr/local/test_tools):

+

The two main interfaces for running tests with Common Test + are an executable Bourne shell script named run_test and an + erlang module named ct. The shell script will work on Unix/Linux + (and Linux-like environments such as Cygwin on Windows) and the + ct interface functions can be called from the Erlang shell + (or from any Erlang function) on any supported platform.

+ +

The Common Test application is installed with the Erlang/OTP + system and no explicit installation is required to start using + Common Test by means of the interface functions in the ct + module. If you wish to use run_test, however, this script + needs to be generated first, according to the instructions below.

+
+ +
+ Unix/Linux + +

Go to the ]]> directory, located + among the other OTP applications (under the OTP lib directory). Here you + execute the install.sh script with argument local:

+ +

+ $ ./install.sh local +

+ +

This generates the executable run_test script in the + /priv/bin]]> directory. The script + will include absolute paths to the Common Test and Test Server + application directories, so it's possible to copy or move the script to + a different location on the file system, if desired, without having to + update it. It's of course possible to leave the script under the + priv/bin directory and update the PATH variable accordingly (or + create a link or alias to it).

+ +

If you, for any reason, have copied Common Test and Test Server + to a different location than the default OTP lib directory, you can + generate a run_test script with a different top level directory, + simply by specifying the directory, instead of local, when running + install.sh. Example:

$ install.sh /usr/local/test_tools @@ -55,15 +79,17 @@

Note that the ]]> and ]]> directories must be located under the - same top directory for the installation to work properly. Note also - that the install script does not e.g. copy files or update environment - variables. It only generates the run_test script.

+ same top directory. Note also that the install script does not copy files + or update environment variables. It only generates the run_test + script.

-

If the directories are later moved, make sure to run install.sh - again or edit the run_test script (Bourne shell) manually.

+

Whenever you install a new version of Erlang/OTP, the run_test + script needs to be regenerated, or updated manually with new directory names + (new version numbers), for it to "see" the latest Common Test and Test Server + versions.

-

For more information on the run_test script, please see - the reference manual.

+

For more information on the run_test script and the ct + module, please see the reference manual.

@@ -72,26 +98,17 @@

On Windows it is very convenient to use Cygwin (www.cygwin.com) for running Common Test and Erlang, since it enables you to use the run_test script for starting Common Test. If you are a Cygwin - user, simply follow the instructions for installing Common Test - on Unix above.

+ user, simply follow the instructions above for generating the run_test + script.

If you do not use Cygwin, you have to rely on the API functions in the ct module (instead of run_test) for running - Common Test. In this case you do not need to install Common Test - (i.e. no need to generate the run_test script). Simply copy the - ]]> and ]]> - directories to a location of your choice. They do not have to be placed among - the Erlang applications under the OTP lib directory, nor do they - need to have a particular path relative to your test suite - modules.

- -

When you start the Erlang node on which you will be running - Common Test, make sure the Common Test and Test Server ebin - directories are included in the Erlang code server path (so the - application modules can be loaded). If you do copy the application - directories to the OTP lib directory, there is no need to - explicitly update the code server path as the code server will be - able to locate the modules automatically.

+ Common Test as described initially in this chapter.

+ +

If you, for any reason, have chosen to store Common Test and Test Server + in a different location than the default OTP lib directory, make + sure the ebin directories of these applications are included + in the Erlang code server path (so the application modules can be loaded).

diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/Makefile erlang-13.b.3-dfsg/lib/common_test/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/common_test/doc/src/Makefile 2009-03-12 12:26:48.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/Makefile 2009-11-20 13:35:11.000000000 +0000 @@ -25,11 +25,11 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(COMMON_TEST_VSN) - +APPLICATION=common_test # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/common_test-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -50,12 +50,13 @@ CT_XML_FILES = $(CT_MODULES:=.xml) XML_APPLICATION_FILES = ref_man.xml +XML_REF1_FILES = run_test.xml XML_REF3_FILES = $(CT_XML_FILES) XML_REF6_FILES = common_test_app.xml -XML_PART_FILES = part.xml \ - part_notes.xml \ - part_notes_history.xml +XML_PART_FILES = part.xml +# part_notes.xml \ +# part_notes_history.xml XML_CHAPTER_FILES = \ basics_chapter.xml \ @@ -73,8 +74,6 @@ notes.xml \ notes_history.xml -XML_REF_FILES = run_test.xml - MAKE_EDOC = make_edoc BOOK_FILES = book.xml @@ -83,42 +82,23 @@ INSTALL_NOTES = ../../notes.html +XML_FILES=$(XML_APPLICATION_FILES) $(XML_REF1_FILES) $(XML_REF3_FILES) $(XML_REF6_FILES) \ + $(XML_PART_FILES) $(XML_CHAPTER_FILES) $(XML_REF_FILES) $(BOOK_FILES) + # ---------------------------------------------------- HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) +MAN1_FILES = $(XML_REF1_FILES:%.xml=$(MAN1DIR)/%.1) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) \ - $(XML_PART_FILES:%.xml=%.tex) - -TOP_PDF_FILE = common_test-$(VSN).pdf -TOP_PS_FILE = common_test-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ - +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -134,81 +114,64 @@ EDOC_ARGS=[{preprocess,true},{includes,["$(XMERL_DIR)/include","../../../test_server/include","../../include","../../../../erts/lib/kernel/include","../../../../lib/kernel/include","../../../../erts/lib/snmp/include","../../../../lib/snmp/include"]}] -$(CT_XML_FILES): - erl -boot start_clean -noshell \ - -eval 'docb_gen:module("../../src/$(@:%.xml=%.erl)",$(EDOC_ARGS))' \ - -s erlang halt $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man + +$(CT_XML_FILES): + erl -boot start_clean -noshell \ + -eval 'docb_gen:module("../../src/$(@:%.xml=%.erl)",$(EDOC_ARGS))' \ + -s erlang halt -pdf: xml $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: xml $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: xml $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) gifs: $(GIF_FILES:%=$(HTMLDIR)/%) -xml: $(CT_XML_FILES) +man: $(MAN6_FILES) $(MAN3_FILES) $(MAN1_FILES) -man: $(MAN6_FILES) $(MAN3_FILES) debug opt: # # checkout make.dep before generating new dependecies # -make_doc_depend: xml - docdepend > make.dep +#make_doc_depend: xml +# docdepend > make.dep -clean clean_docs clean_tex: +clean clean_docs: rm -f $(CT_XML_FILES) - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) - rm -f $(MAN3_FILES) - rm -f $(MAN6_FILES) - rm -f $(GIF_FILES:%=$(HTMLDIR)/%) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) + rm -rf $(HTMLDIR)/* + rm -f $(MAN1DIR)/* + rm -f $(MAN3DIR)/* + rm -f $(MAN6DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else + release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man1 + $(INSTALL_DATA) $(MAN1DIR)/* $(RELEASE_PATH)/man/man1 $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 - $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6 -# $(INSTALL_DATA) $(INSTALL_NOTES) $(RELSYSDIR) -endif -endif + $(INSTALL_DATA) $(MAN6DIR)/* $(RELEASE_PATH)/man/man6 release_spec: diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/notes.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/notes.xml 2009-06-05 14:02:55.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/notes.xml 2009-11-20 13:35:17.000000000 +0000 @@ -32,6 +32,169 @@ notes.xml +
Common_Test 1.4.6 + +
Fixed Bugs and Malfunctions + + +

+ If the init_per_testcase/2 function fails, the test case + now gets marked and counted as auto skipped, not user + skipped (which would previously happen).

+

+ Own Id: OTP-8289

+
+
+
+ + +
Improvements and New Features + + +

+ The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

+

+ Own Id: OTP-8201

+
+ +

+ For a failed test case, the tc_done event is supposed to + report info on the form {failed,Error}. Only Error was + reported, however, which has now been fixed.

+

+ Own Id: OTP-8235 Aux Id: seq-11414

+
+ +

+ It is now possible to fail a test case from the + end_per_testcase/2 function, by returning {fail,Reason}.

+

+ Own Id: OTP-8284

+
+ +

+ It is now possible to fail a test case by having the + end_tc/3 framework function return {fail,Reason} for the + test case.

+

+ Own Id: OTP-8285

+
+ +

+ The test_server framework API (e.g. the end_tc/3 + function) has been modified. See the test_server_ctrl + documentation for details.

+

+ Own Id: OTP-8286 Aux Id: OTP-8285, OTP-8287

+
+ +

+ Various updates of the test events have been implemented. + The data field for some events, such as tc_done and + tc_auto_skip has been modified to make pattern matching + on the data easier and more consistent. Also the order in + which some events are received has been altered. E.g. the + tc_auto_skip event for a test case now comes after the + tc_done for the failed configuration function (not + before) which makes more sense. Note that no new events + have been added and that the event record remains + unchanged.

+

+ Own Id: OTP-8287 Aux Id: OTP-8235

+
+ +

+ The marquee used for test names on the all_runs.html page + has been removed on request. Note that the test name + field has the full text string in a title tag, which is + displayed when hovering the mouse pointer over it (i.e. + if the web browser supports title tags).

+

+ Own Id: OTP-8288

+
+ +

+ It is now possible to refresh the top level index files + in an arbitrary log directory by specifying a + {refresh_logs,LogDir} tuple in the ct:run_test/1 options + list. Also the -refresh_logs flag for the run_test script + has been extended to take an optional LogDir argument, + i.e. -refresh_logs [LogDir]. If no LogDir is specified, + current working directory is assumed, unless the log + directory is set with the -logdir flag.

+

+ Own Id: OTP-8290

+
+ +

+ It was previously required that test suites were located + under a test object (or OTP application) sub-directory + named "test" (or under a directory named + "<testobject>_test"). This has been changed so that + Common Test now looks for suites primarily in a test + sub-directory only if the directory exists. Otherwise it + will assume the suites are stored in the same directory + the user specifies with e.g. the 'dir' start flag/option.

+

+ Own Id: OTP-8294

+
+
+
+ +
+ +
Common_Test 1.4.5 + +
Fixed Bugs and Malfunctions + + +

+ The Common Test logger process crashed if a test case in + a sequence (declared with sequences/0) failed. This fault + has been corrected.

+

+ Own Id: OTP-8089 Aux Id: seq11334

+
+
+
+ + +
Improvements and New Features + + +

+ Various updates and fixes in Common Test and Test Server.

+

+ Own Id: OTP-8045 Aux Id: OTP-8089,OTP-8105,OTP-8163

+
+ +

+ Errors in coverage data collection and analysis were + difficult to detect. The logging has been improved so + that more information about e.g. imported and missing + modules is printed to the html log files.

+

+ Own Id: OTP-8163 Aux Id: seq11374

+
+ +

+ The Common Test HTML overview pages have been improved. + It is now possible to see if a test case has been skipped + explicitly or because a configuration function has + failed. Also, the history page (all_runs.html) now has + scrolling text displaying the test names. The old format + (showing names as a truncated string) can still be + generated by means of the flag/option 'basic_html'.

+

+ Own Id: OTP-8177

+
+
+
+ +
+
Common_Test 1.4.2
Improvements and New Features @@ -185,7 +348,7 @@ If the Erlang runtime system was started without access to an erlang shell (e.g. -noshell), compilation errors would cause a crash in the Common Test application. - Without access to a shell, Common Test can not promt the + Without access to a shell, Common Test can not prompt the user to choose to continue or abort the test session, but must assume that the session should proceed.

diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/part_notes.xml 2009-03-12 12:27:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/part_notes.xml 2009-11-20 13:35:18.000000000 +0000 @@ -1,7 +1,7 @@ - +

20042009 @@ -34,7 +34,7 @@ release notes history.

- + diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/part.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/part.xml 2009-03-12 12:26:48.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/part.xml 2009-11-20 13:35:10.000000000 +0000 @@ -1,7 +1,7 @@ - +
20032009 @@ -26,6 +26,7 @@ 2003-10-21 + part.xml
@@ -63,18 +64,18 @@ Server application.

- - - - - - - - - - - - + + + + + + + + + + + +
diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/ref_man.xml 2009-03-12 12:26:48.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/ref_man.xml 2009-11-20 13:35:11.000000000 +0000 @@ -1,7 +1,7 @@ - +
20032009 @@ -62,19 +62,19 @@

Common Test is implemented as a framework based on the OTP Test Server application.

- - + + - - - - - - - - - + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/run_test_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/run_test_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/run_test_chapter.xml 2009-03-16 18:35:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/run_test_chapter.xml 2009-11-21 16:51:01.000000000 +0000 @@ -26,6 +26,7 @@ + run_test_chapter.xml
@@ -39,8 +40,8 @@ Automatic compilation of test suites (and help modules). Creation of additional HTML pages for better overview. Single command interface for running all available tests. - Handling of configuration files specifying target nodes and - other variables. + Handling of configuration files specifying data related to + the System Under Test (and any other variable data). Mode for running multiple independent test sessions in parallel with central control and configuration. @@ -54,10 +55,12 @@ particular test object directory has been specified (meaning all suites in this directory should be part of the test), Common Test runs make:all/1 in the directory to compile the suites.

+

If compilation should fail for one or more suites, the compilation errors are printed to tty and the operator is asked if the test run should proceed without the missing suites, or be aborted. If the operator chooses to proceed, it is noted in the HTML log which tests have missing suites.

+

Any help module (i.e. regular Erlang module with name not ending with "_SUITE") that resides in the same test object directory as a suite which is part of the test, will also be automatically compiled. A help @@ -65,18 +68,30 @@ name of course). All help modules in a particular test object directory are compiled no matter if all or only particular suites in the directory are part of the test.

+

If test suites or help modules include header files stored in other locations than the test directory, you may specify these include directories by means of the flag with , or the option with . In addition to this, an include path may be specified with an OS environment variable; . Example (bash):

+

$ export CT_INCLUDE_PATH=~testuser/common_suite_files/include:~testuser/common_lib_files/include

+

Common Test will pass all include directories (specified either with the flag/option, or the variable, or both) to the compiler.

+

It is also possible to specify include directories in test specifications (see below).

+ +

If the user wants to run all test suites for a test object (or OTP application) + by specifying only the top directory (e.g. with the dir start flag/option), + Common Test will primarily look for test suite modules in a subdirectory named + test. If this subdirectory doesn't exist, the specified top directory + is assumed to be the actual test directory, and test suites will be read from + there instead.

+

It is possible to disable the automatic compilation feature by using the flag with , or the option with @@ -90,7 +105,7 @@ Running tests from the UNIX command line

The script run_test can be used for running tests from - the UNIX command line, e.g. + the Unix/Linux command line, e.g.

-dir ]]> @@ -131,8 +146,28 @@ encrypted configuration files. ]]>, points out a file containing a decryption key for encrypted configuration files. + , switches off html enhancements that might not be compatible with older browsers. + +

Directories passed to Common Test may have either relative or absolute paths.

+ +

Arbitrary start flags to the Erlang Runtime System may also be passed as + parameters to run_test. It is, for example, useful to be able to + pass directories that should be added to the Erlang code server search path + with the -pa or -pz flag. If you have common help- or library + modules for test suites (separately compiled), stored in other directories + than the test suite directories, these help/lib directories are preferrably + added to the code path this way. Example:

+

$ run_test -dir ./chat_server -logdir ./chat_server/testlogs -pa $PWD/chat_server/ebin

+

Note how in this example, the absolute path of the chat_server/ebin + directory is passed to the code server. This is essential since relative + paths are stored by the code server as relative, and Common Test changes + the current working directory of the Erlang Runtime System during the test run!

+
+

For details on how to generate the run_test script, see the + Installation chapter. +

@@ -161,28 +196,50 @@ the browser start command option:

]]>

Example:

-

+

Note that the browser must run as a separate OS process or VTS will hang!

If no specific browser start command is specified, netscape will - be the default browser on UNIX platforms and Internet Explorer on Windows. - For the VTS mode to work properly with netscape, make sure the - netscape program in your path starts version 7!

+ be the default browser on Unix platforms and Internet Explorer on Windows. + If Common Test fails to start a browser automatically, start your + favourite browser manually instead and type in the URL that Common Test + displays in the shell.

- Running tests from the Erlang shell - -

Common Test provides an Erlang API for running tests. For documentation, - please see the ct manual page.

+ Running tests from the Erlang shell or from an Erlang program +

Common Test provides an Erlang API for running tests. The main (and most + flexible) function for specifying and executing tests is called + ct:run_test/1. This function takes the same start parameters as + the run_test script described above, only the flags are instead + given as options in a list of key-value tuples. E.g. a test specified + with run_test like:

+

$ run_test -suite ./my_SUITE -logdir ./results

+

is with ct:run_test/1 specified as:

+

1> ct:run_test([{suite,"./my_SUITE"},{logdir,"./results"}]).

+

For detailed documentation, please see the ct manual page.

- Running interactive shell mode + Running the interactive shell mode -

You can start an Erlang shell with the necessary paths and - with Common Test running in an interactive mode with the run_test - script and the -shell option: +

You can start Common Test in an interactive shell mode where no + automatic testing is performed. Instead, in this mode, Common Test + starts its utility processes, installs configuration data (if any), + and waits for the user to call functions (typically test case support + functions) from the Erlang shell.

+ +

The shell mode is useful e.g. for debugging test suites, for analysing + and debugging the SUT during "simulated" test case execution, and + for trying out various operations during test suite development.

+ +

To invoke the interactive shell mode, you can start an Erlang shell + manually and call ct:install/1 to install any configuration + data you might need (use [] as argument otherwise), then + call ct:start_interactive/0 to start Common Test. If you use + the run_test script, you may start the Erlang shell and Common Test + in the same go by using the -shell and, optionally, the -config + flag:

run_test -shell @@ -195,13 +252,8 @@ again. If Common Test has not been run from this directory before, no config files will be available.

-

From the interactive mode all test case support functions can - be executed directly from the erlang shell. This is an - experimentation mode useful during test suite development and - debugging.

- -

If any functions using "required config data" (e.g. telnet or - ftp functions) are to be called from the erlang shell, config +

If any functions using "required config data" (e.g. ct_telnet or + ct_ftp functions) are to be called from the erlang shell, config data must first be required with ct:require/[1,2]. This is equivalent to a require statement in the Test Suite Info @@ -211,25 +263,29 @@

Example:

 
-      > ct:require(a,{unix,[telnet]}).
-      ok
-      > ct:cmd(a,"ls").
-      {ok,["ls","file1  ...",...]}
+ 1> ct:require(unix_telnet, unix). + ok + 2> ct_telnet:open(unix_telnet). + {ok,<0.105.0>} + 4> ct_telnet:cmd(unix_telnet, "ls ."). + {ok,["ls .","file1 ...",...]}

Everything that Common Test normally prints in the test case logs, will in the interactive mode be written to a log named ctlog.html in the ]]> directory. A link to this file will be available in the file named last_interactive.html in the directory from which - you executed run_test.

- -

If you for some reason want to exit the interactive mode, use - the function ct:stop_interactive/0. This shuts down the + you executed run_test. Currently, specifying a different + root directory for the logs than the current working directory, + is not supported.

+ +

If you wish to exit the interactive mode (e.g. to start an + automated test run with ct:run_test/1), call the function + ct:stop_interactive/0. This shuts down the running ct application. Associations between configuration names and data created with require are consequently deleted. ct:start_interactive/0 will get you - back into interactive mode, but previous state is not restored.

- + back into interactive mode, but the previous state is not restored.

@@ -268,7 +324,7 @@ Erlang terms. The terms may be declared in a text file or passed to the test server at runtime as a list (see run_testspec/1 in the manual page for ct). There are two general types - of terms; configuration terms and test specification terms.

+ of terms: configuration terms and test specification terms.

With configuration terms it is possible to import configuration data (similar to run_test -config), specify HTML log directories (similar to run_test -logdir), give aliases @@ -409,7 +465,7 @@

Log files -

As the execution of the test suites go on, events are logged in +

As the execution of the test suites proceed, events are logged in four different ways:

@@ -423,9 +479,9 @@

Typically the operator, who may run hundreds or thousands of - test cases, doesn't want to fill the screen with details - about/from the specific test cases. By default, the operator will - only see:

+ test cases, doesn't want to fill the console with details + about, or printouts from, the specific test cases. By default, the + operator will only see:

A confirmation that the test has started and information about how @@ -434,14 +490,14 @@ A summary of all the run test cases. A confirmation that the test run is complete. Some special information like error reports and progress - reports, printouts written with erlang:display/1 or io:format/3 - specifically addressed to somewhere other than - standard_io. + reports, printouts written with erlang:display/1, or io:format/3 + specifically addressed to a receiver other than standard_io + (e.g. the default group leader process 'user'). -

This is enough for the operator to know, and if he wants to dig - in deeper into a specific test case result, he can do so by - following the links in the HTML presentation to take a look in the +

If/when the operator wants to dig deeper into the general results, or + the result of a specific test case, he should do so by + following the links in the HTML presentation and take a look in the major or minor log files. The "all_runs.html" page is a practical starting point usually. It's located in logdir and contains a link to each test run including a quick overview (date and time, @@ -471,13 +527,13 @@ compile). Names of the missing suites can be found in the Common Test Framework log file.

-

A detailed report of the test run is stored in the major - logfile (textual log file). This includes test suite and test - case names, execution time, the exact reason for failure - etc. There is an HTML log file that corresponds to this textual file. - The HTML file is a summary which gives a better overview of the - test run. It also has links to each individual test case log file - for quick viewing with an HTML browser.

+

The major logfile shows a detailed report of the test run. It + includes test suite and test case names, execution time, the + exact reason for failures etc. The information is available in both + a file with textual and with HTML representation. The HTML file shows a + summary which gives a good overview of the test run. It also has links + to each individual test case log file for quick viewing with an HTML + browser.

The minor log file contain full details of every single test case, each one in a separate file. This way the files should @@ -661,6 +717,13 @@

           $ run_test -dir $TEST_ROOT/to1 $TEST_ROOT/to2 -repeat 5

Here the test run, including both the to1 and the to2 test, will be repeated 5 times.

+ +

This feature should not be confused with the repeat property of a test + case group. The options described here are used to repeat execution of entire test runs, + while the repeat property of a test case group makes it possible to repeat + execution of sets of test cases within a suite. For more information about the latter, + see the Writing Test Suites + chapter.

diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/run_test.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/run_test.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/run_test.xml 2009-03-16 18:35:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/run_test.xml 2009-11-20 13:35:25.000000000 +0000 @@ -1,7 +1,7 @@ - + - +
20072009 @@ -29,11 +29,12 @@ 2007-07-04 PA1 - run_test.sgml + run_test.xml
- run_test Shell script used for starting + run_test + Shell script used for starting Common Test from the Unix command line. - +

The run_test script is automatically generated as Common @@ -70,7 +71,8 @@ [-no_auto_compile] [-repeat N [-force_stop]] | [-duration HHMMSS [-force_stop]] | - [-until [YYMoMoDD]HHMMSS [-force_stop]] + [-until [YYMoMoDD]HHMMSS [-force_stop]] + [-basic_html]

Run tests using test specification @@ -88,7 +90,8 @@ [-no_auto_compile] [-repeat N [-force_stop]] | [-duration HHMMSS [-force_stop]] | - [-until [YYMoMoDD]HHMMSS [-force_stop]] + [-until [YYMoMoDD]HHMMSS [-force_stop]] + [-basic_html]
Run tests in web based GUI @@ -99,12 +102,13 @@ [-dir TestDir1 TestDir2 .. TestDirN] | [-suite Suite [[-group Group] [-case Case]]] [-include InclDir1 InclDir2 .. InclDirN] - [-no_auto_compile] + [-no_auto_compile] + [-basic_html]
Refresh the HTML index files
-	run_test -refresh_logs [-logdir LogDir]
+ run_test -refresh_logs [-logdir LogDir] [-basic_html]
Run CT in interactive mode @@ -131,6 +135,6 @@ different start flags.

- + diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/test_structure_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/test_structure_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/test_structure_chapter.xml 2009-03-12 12:27:11.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/test_structure_chapter.xml 2009-11-21 16:51:02.000000000 +0000 @@ -26,15 +26,17 @@ + test_structure_chapter.xml
Test structure -

A test consists of a set of test cases. Each test case is - implemented as an Erlang function. An Erlang module implementing - one or more test cases is called a test suite. One or more test - suites are stored in a test directory.

+

A test is performed by running one or more test suites. A test suite + consists of test cases (as well as configuration functions and info + functions). Test cases may be grouped in so called test case groups. + A test suite is an Erlang module and test cases are implemented as + Erlang functions. Test suites are stored in test directories.

@@ -66,7 +68,7 @@

The latter of course means that the execution clause is actually called, so the author must make sure that the test case - is not run.

+ does not run.

When a test case is skipped, it will be noted as SKIPPED in the HTML log.

@@ -77,22 +79,64 @@ Definition of terms - + + Auto skipped test case + + When a configuration function fails (i.e. terminates unexpectedly), + the test cases that depend on the configuration function will be + skipped automatically by Common Test. The status of the test cases + is then "auto skipped". Test cases are also auto skipped by + Common Test if required configuration data is not available at + runtime. + + + Configuration function + + A function in a test suite that is meant to be used for + setting up, cleaning up, and/or verifying the state and + environment on the SUT (System Under Test) and/or the Common Test + host node, so that a test case (or a set of test cases) can + execute correctly. + + + Configuration file + + A file that contains data related to a test and/or an SUT + (System Under Test), e.g. protocol server addresses, client + login details, hardware interface addresses, etc - any data + that should be handled as variable in the suite and not + be hardcoded. + + + Configuration variable + + A name (an Erlang atom) associated with a data value read from + a configuration file. + + data_dir Data directory for a test suite. This directory contains any files used by the test suite, e.g. additional Erlang modules, binaries or data files. + + Info function + + A function in a test suite that returns a list of properties + (read by the Common Test server) that describes the conditions + for executing the test cases in the suite. + - major log file + Major log file - An overview log file for one or more test suites. + An overview and summary log file for one or more test suites. - minor log file + Minor log file - A log file for one particular test case. + A log file for one particular test case. Also called the + test case log file. priv_dir @@ -100,23 +144,56 @@ be used when the test suite needs to write to files. - test case + run_test + + The name of an executable Bourne shell script that may be + used on Linux/Unix as an interface for specifying and running + tests with Common Test. + + + Test case A single test included in a test suite. A test case is implemented as a function in a test suite module. + + Test case group + + A set of test cases that share configuration functions and + execution properties. The execution properties specify whether + the test cases in the group should be executed in random order, + in parallel, in sequence, and if the execution of the group + should be repeated. Test case groups may also be nested (i.e. a + group may, besides test cases, contain sub-groups). + - test suite + Test suite An erlang module containing a collection of test cases for a specific functional area. - test directory + Test directory A directory that contains one or more test suite modules, i.e. a group of test suites. + + The Config argument + + A list of key-value tuples (i.e. a property list) containing + runtime configuration data passed from the configuration + functions to the test cases. + + + User skipped test case + + This is the status of a test case that has been explicitly + skipped in any of the ways described in the "Skipping test cases" + section above. + + +
diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/why_test_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/why_test_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/why_test_chapter.xml 2009-03-12 12:26:48.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/why_test_chapter.xml 2009-11-21 16:51:01.000000000 +0000 @@ -26,6 +26,7 @@ + why_test_chapter.xml @@ -58,7 +59,7 @@ simulate an application (typically consisting of a few modules of an application), some try to do tricky requests in general, some test suites even test internal functions with help of special - loadmodules on target.

+ load-modules on target.

Another interesting category of test suites are the ones that check that fixed bugs don't reoccur. When a bugfix is introduced, diff -Nru erlang-13.b.1-dfsg/lib/common_test/doc/src/write_test_chapter.xml erlang-13.b.3-dfsg/lib/common_test/doc/src/write_test_chapter.xml --- erlang-13.b.1-dfsg/lib/common_test/doc/src/write_test_chapter.xml 2009-04-16 10:26:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/common_test/doc/src/write_test_chapter.xml 2009-11-21 16:51:01.000000000 +0000 @@ -26,22 +26,22 @@ + write_test_chapter.xml

+ Support for test suite authors

The ct module provides the main interface for writing - test cases. This includes:

+ test cases. This includes e.g:

Functions for printing and logging Functions for reading configuration data Function for terminating a test case with error reason Function for adding comments to the HTML overview page - Tracing of line numbers in the test suite, i.e. if a test - case fails, the last 10 executed line numbers are displayed

Please see the reference manual for the ct @@ -49,8 +49,8 @@

The CT application also includes other modules named ]]> that - provide support for the use of communication mechanisms such as - rpc, snmp, ftp, telnet etc in test suites.

+ provide various support, mainly simplified use of communication + protocols such as rpc, snmp, ftp, telnet, etc.

@@ -59,11 +59,11 @@

A test suite is an ordinary Erlang module that contains test cases. It is recommended that the module has a name on the form - *_SUITE.erl. Otherwise, the directory function in CT will - not be able to locate the modules (per default). + *_SUITE.erl. Otherwise, the directory and auto compilation + function in CT will not be able to locate it (at least not per default).

-

ct.hrl shall be included in all test suite files. +

The ct.hrl header file must be included in all test suite files.

Each test suite module must export the function all/0 @@ -76,70 +76,102 @@

Init and end per suite -

Each test suite module may contain the functions - init_per_suite/1 and end_per_suite/1. +

Each test suite module may contain the optional configuration functions + init_per_suite/1 and end_per_suite/1. If the init function + is defined, so must the end function be.

-

If it exists, init_per_suite is called as the first - testcase of the suite. It typically contains initializations that are +

If it exists, init_per_suite is called initially before the + test cases are executed. It typically contains initializations that are common for all test cases in the suite, and that are only to be - performed once. + performed once. It is recommended to be used for setting up and + verifying state and environment on the SUT (System Under Test) and/or + the CT host node, so that the test cases in the suite will execute + correctly. Examples of initial configuration operations: Opening a connection + to the SUT, initializing a database, running an installation script, etc.

-

end_per_suite is called as the last test case of the - suite. This function should clean up after init_per_suite. +

end_per_suite is called as the final stage of the test suite execution + (after the last test case has finished). The function is meant to be used + for cleaning up after init_per_suite. +

+ +

init_per_suite and end_per_suite will execute on dedicated + Erlang processes, just like the test cases do. The result of these functions + is however not included in the test run statistics of successful, failed and + skipped cases.

The argument to init_per_suite is Config, the - same as the argument to all test cases. init_per_suite can - modify this parameter with information that the other test cases - need. + same key-value list of runtime configuration data that each test case takes + as input argument. init_per_suite can modify this parameter with + information that the test cases need. The possibly modified Config + list is the return value of the function.

If init_per_suite fails, all test cases in the test - suite will be skipped, including end_per_suite. + suite will be skipped automatically (so called auto skipped), + including end_per_suite.

Init and end per test case -

Each test suite module can contain the functions - init_per_testcase/2 and end_per_testcase/2.

+

Each test suite module can contain the optional configuration functions + init_per_testcase/2 and end_per_testcase/2. If the init function + is defined, so must the end function be.

If it exists, init_per_testcase is called before each - test case in the suite. It typically contains initiation which - must be done for each test case.

- -

end_per_testcase/2 is called after each test case is - completed, giving a possibility to clean up.

+ test case in the suite. It typically contains initialization which + must be done for each test case (analogue to init_per_suite for the + suite).

+ +

end_per_testcase/2 is called after each test case has + finished, giving the opportunity to perform clean-up after + init_per_testcase.

The first argument to these functions is the name of the test - case. This can be used to do individual initiation and cleanup for - each test cases.

- -

The second argument is called - Config. init_per_testcase/2 may modify this - parameter or just return it as is. Whatever is retuned by - init_per_testcase/2 is given as Config parameter to - the test case itself.

+ case. This value can be used with pattern matching in function clauses + or conditional expressions to choose different initialization and cleanup + routines for different test cases, or perform the same routine for a number of, + or all, test cases.

+ +

The second argument is the Config key-value list of runtime + configuration data, which has the same value as the list returned by + init_per_suite. init_per_testcase/2 may modify this + parameter or return it as is. The return value of init_per_testcase/2 + is passed as the Config parameter to the test case itself.

The return value of end_per_testcase/2 is ignored by the - test server (with exception of the - save_config - tuple).

+ test server, with exception of the + save_config + and fail tuple.

It is possible in end_per_testcase to check if the test case was successful or not (which consequently may determine how cleanup should be performed). This is done by reading the value tagged with tc_status from Config. The value is either - ok, {failed,Reason}, or {skipped,Reason}. -

- -

If init_per_testcase crashes, the test case itself is - skipped and end_per_testcase is never called. -

- + ok, {failed,Reason} (where Reason is timetrap_timeout, + info from exit/1, or details of a run-time error), or + {skipped,Reason} (where Reason is a user specific term). +

+ +

If init_per_testcase crashes, the test case itself is skipped + automatically (so called auto skipped). If init_per_testcase + returns a skip tuple, also then will the test case be skipped (so + called user skipped). In either event, the end_per_testcase is + never called. +

+ +

If it is determined during execution of end_per_testcase that + the status of a successful test case should be changed to failed, + end_per_testcase may return the tuple: {fail,Reason} + (where Reason describes why the test case fails).

+ +

init_per_testcase and end_per_testcase execute on the + same Erlang process as the test case and printouts from these + configuration functions can be found in the test case log file.

@@ -147,55 +179,69 @@ Test cases

The smallest unit that the test server is concerned with is a - test case. Each test case can in turn test many things, for + test case. Each test case can actually test many things, for example make several calls to the same interface function with different parameters.

-

It is possible to put many or few tests into each test - case. How many things each test case does is of course up to the +

It is possible to choose to put many or few tests into each test + case. What exactly each test case does is of course up to the author, but here are some things to keep in mind:

-

Using many small test cases tend to result in extra and often - duplicated code as well as slow test execution because of - large overhead for initializations and cleanups. Lots of duplicated - code results in high maintenance cost and bad readability. +

Having many small test cases tend to result in extra, and possibly + duplicated code, as well as slow test execution because of + large overhead for initializations and cleanups. Duplicated + code should be avoided, e.g. by means of common help functions, or + the resulting suite will be difficult to read and understand, and + expensive to maintain.

Larger test cases make it harder to tell what went wrong if it - fails, and large portions of test code will be skipped if a - specific part fails. Also, readability and maintainability suffers - when test cases become too extensive. + fails, and large portions of test code will potentially be skipped + when errors occur. Furthermore, readability and maintainability suffers + when test cases become too large and extensive. Also, the resulting log + files may not reflect very well the number of tests that have + actually been performed.

The test case function takes one argument, Config, which contains configuration information such as data_dir and - priv_dir. See Data and - Private Directories for more information about these. + priv_dir. (See Data and + Private Directories for more information about these). + The value of Config at the time of the call, is the same + as the return value from init_per_testcase, see above.

The test case function argument Config should not be confused with the information that can be retrieved from configuration files (using ct:get_config/[1,2]). The Config argument should be used for runtime configuration of the test suite and the - test cases. A configuration file should contain data related to the - SUT (system under test). These two types of config data are handled + test cases, while configuration files should typically contain data + related to the SUT. These two types of configuration data are handled differently!

-

All Config items can be extracted using the - ?config macro, e.g PrivDir = ?config(priv_dir,Config). -

- -

If the test case function crashes or exits, it is considered a - failure. If it returns a value (no matter what actual value) it is - considered a success. An exception to this rule is the return value - {skip,Reason}. If this is returned, the test case is considered - skipped and gets logged as such.

- -

If the test case returns the tuple {comment,Comment}, - Comment is printed out in the overview log (this is equal to - calling ct:comment(Comment)). +

Since the Config parameter is a list of key-value tuples, i.e. + a data type generally called a property list, it can be handled by means of the + proplists module in the OTP stdlib. A value can for example + be searched for and returned with the proplists:get_value/2 function. + Also, or alternatively, you might want to look in the general lists module, + also in stdlib, for useful functions. Normally, the only operations you + ever perform on Config is insert (adding a tuple to the head of the list) + and lookup. Common Test provides a simple macro named ?config, which returns + a value of an item in Config given the key (exactly like + proplists:get_value). Example: PrivDir = ?config(priv_dir, Config). +

+ +

If the test case function crashes or exits purposely, it is considered + failed. If it returns a value (no matter what actual value) it is + considered successful. An exception to this rule is the return value + {skip,Reason}. If this tuple is returned, the test case is considered + skipped and gets logged as such.

+ +

If the test case returns the tuple {comment,Comment}, the case + is considered successful and Comment is printed out in the overview + log file. This is by the way equal to calling ct:comment(Comment).

@@ -216,7 +262,7 @@ timetrap

- Set the maximum time the test case is allowed to take. If + Set the maximum time the test case is allowed to execute. If the timetrap time is exceeded, the test case fails with reason timetrap_timeout. Note that init_per_testcase and end_per_testcase are included in the timetrap time. @@ -257,14 +303,14 @@ testcase1() -> [{require, ftp}, {default_config, ftp, [{ftp, "my_ftp_host"}, - {username, "alladin"}, + {username, "aladdin"}, {password, "sesame"}]}}].

 	    testcase2() -> 
 	        [{require, unix_telnet, {unix, [telnet, username, password]}},
 	         {default_config, unix, [{telnet, "my_telnet_host"},
-	                                 {username, "alladin"},
+	                                 {username, "aladdin"},
 	                                 {password, "sesame"}]}}].
@@ -288,7 +334,7 @@

- Example: + Example of a test case info function:

 	reboot_node() ->
@@ -324,7 +370,7 @@
       
 
        

- Example: + Example of the suite info function:

 	suite() ->
@@ -395,7 +441,8 @@
     the cases skipped.

Before execution of a group begins, the configuration function - init_per_group(GroupName, Config) is called. The list of tuples + init_per_group(GroupName, Config) is called (the function is + mandatory if one or more test case groups are defined). The list of tuples returned from this function is passed to the test cases in the usual manner by means of the Config argument. init_per_group/2 is meant to be used for initializations common for the test cases in the @@ -586,7 +633,12 @@ of the data_dir is the the name of the test suite followed by "_data". For example, "some_path/foo_SUITE.beam" has the data directory - "some_path/foo_SUITE_data/". + "some_path/foo_SUITE_data/". Use this directory for portability, + i.e. to avoid hardcoding directory names in your suite. Since the data + directory is stored in the same directory as your test suite, you should + be able to rely on its existence at runtime, even if the path to your + test suite directory has changed between test suite implementation and + execution.

xmlsrc \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/doc/src/erl_docgen.txt erlang-13.b.3-dfsg/lib/erl_docgen/doc/src/erl_docgen.txt --- erlang-13.b.1-dfsg/lib/erl_docgen/doc/src/erl_docgen.txt 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/doc/src/erl_docgen.txt 2009-11-20 13:35:41.000000000 +0000 @@ -0,0 +1,6 @@ + + + +/home/otptest/bin/otp_wrap_ssh boddington /home/otptest/bin/otp_build_doc -rel r13b02 -view otptest_r13_daily_doc2 -csfile /usr/local/otp/config-specs/r13_dev.cs -insdir /ldisk/daily_build +_ + \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/doc/src/notes.xml erlang-13.b.3-dfsg/lib/erl_docgen/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/erl_docgen/doc/src/notes.xml 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/doc/src/notes.xml 2009-11-20 13:35:48.000000000 +0000 @@ -0,0 +1,45 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + erl_docgen Release Notes + otp_appnotes + nil + nil + nil + notes.xml +
+

This document describes the changes made to the erl_docgen application.

+ + +
erl_docgen 0.1 + +
+ Improvements and new features +

This is the first release of erl_docgen for internal use.

+
+ + +
+ +
+ diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/Makefile erlang-13.b.3-dfsg/lib/erl_docgen/Makefile --- erlang-13.b.1-dfsg/lib/erl_docgen/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/Makefile 2009-11-20 13:35:41.000000000 +0000 @@ -0,0 +1,36 @@ +# ``The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved via the world wide web at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# The Initial Developer of the Original Code is Ericsson Utvecklings AB. +# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings +# AB. All Rights Reserved.'' +# +# $Id$ +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# +# Macros +# + +SUB_DIRECTORIES = priv +#doc/src + + +SPECIAL_TARGETS = + +# +# Default Subdir Targets +# +include $(ERL_TOP)/make/otp_subdir.mk + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/bin/codeline_preprocessing.escript erlang-13.b.3-dfsg/lib/erl_docgen/priv/bin/codeline_preprocessing.escript --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/bin/codeline_preprocessing.escript 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/bin/codeline_preprocessing.escript 2009-11-20 13:35:37.000000000 +0000 @@ -0,0 +1,117 @@ +#!/usr/bin/env escript +%% -*- erlang -*- +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%%---------------------------------------------------------------------- +%% File : codeline_preprocessing.escript +%% +%% Created : 10 Sep 2008 by Lars Thorsen +%%---------------------------------------------------------------------- + +%%====================================================================== +%% External functions +%%====================================================================== +%%---------------------------------------------------------------------- +%% Function: main/1 +%% Description: +%%---------------------------------------------------------------------- +main([InFile, OutFile]) -> + InDev = + case file:open(InFile, [read]) of + {ok,ID} -> + ID; + _ -> + halt(5) + end, + CPath=filename:dirname(InFile), + OutDev = + case file:open(OutFile, [write]) of + {ok,OD} -> + OD; + _ -> + halt(5) + end, + case re:compile("|/codeinclude>)") of + {ok, Mp} -> + parse(InDev, OutDev, CPath, Mp); + _ -> + halt(2) + end; +main(_) -> + usage(). + + +%%---------------------------------------------------------------------- +%% Function: main/1 +%% Description: +%%---------------------------------------------------------------------- +usage() -> + io:format("usage: codeline_preprocessing \n"), + halt(1). + + +%%====================================================================== +%% Internal functions +%%====================================================================== + +parse(InDev, OutDev, CPath, Mp) -> + case io:get_line(InDev, "") of + eof -> + file:close(OutDev), + file:close(InDev); + String -> + case re:run(String, Mp,[{capture, [1,2], list}]) of + {match,[File, []]} -> + case file:read_file(filename:join(CPath, File))of + {ok, Bin} -> + file:write(OutDev, "\n"); + _ -> + halt(3) + end; + {match,[File, Tag]} -> + String2 = get_code(filename:join(CPath, File), Tag), + file:write(OutDev, "\n"); + _ -> + file:write(OutDev, String) + end, + parse(InDev, OutDev, CPath, Mp) + end. + +%%---------------------------------------------------------------------- +%% Function: get_code/2 +%% Description: +%%---------------------------------------------------------------------- +get_code(File, Tag) -> + case file:read_file(File) of + {ok, Bin} -> + case re:run(Bin,"^" ++ Tag ++ "\n((.|\n)*)\n" ++ + Tag ++ "\$",[global, multiline, {capture, [1], binary}]) of + {match,[[Match]]} -> + Match; + _ -> + halt(4) + end; + _ -> + halt(3) + end. + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/bin/Makefile erlang-13.b.3-dfsg/lib/erl_docgen/priv/bin/Makefile --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/bin/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/bin/Makefile 2009-11-20 13:35:39.000000000 +0000 @@ -0,0 +1,74 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../vsn.mk +VSN=$(ERL_DOCGEN_VSN) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/erl_docgen-$(VSN) + + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + + +ESCRIPT_FILES= \ + codeline_preprocessing.escript + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +debug opt: + +docs: + +clean: + $(RM) $(TARGET_FILES) + + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + + +release_spec: opt + $(INSTALL_DIR) $(RELSYSDIR)/priv/bin + $(INSTALL_SCRIPT) $(ESCRIPT_FILES) $(RELSYSDIR)/priv/bin + +release_docs_spec: + + +release_tests_spec: + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/css/Makefile erlang-13.b.3-dfsg/lib/erl_docgen/priv/css/Makefile --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/css/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/css/Makefile 2009-11-20 13:35:47.000000000 +0000 @@ -0,0 +1,77 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../vsn.mk +VSN=$(ERL_DOCGEN_VSN) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/erl_docgen-$(VSN) + + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + + +CSS_FILES = \ + otp_doc.css + + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +debug opt: + +docs: + +clean: + $(RM) $(TARGET_FILES) + + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + + +release_spec: opt + $(INSTALL_DIR) $(RELSYSDIR)/priv/css + $(INSTALL_DATA) $(CSS_FILES) $(RELSYSDIR)/priv/css + + +release_docs_spec: + $(INSTALL_DIR) $(RELEASE_PATH)/doc + $(INSTALL_DATA) $(CSS_FILES) ../nyi.html $(RELEASE_PATH)/doc + +release_tests_spec: + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/css/otp_doc.css erlang-13.b.3-dfsg/lib/erl_docgen/priv/css/otp_doc.css --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/css/otp_doc.css 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/css/otp_doc.css 2009-11-20 13:35:31.000000000 +0000 @@ -0,0 +1,117 @@ + + +body { + background: white; + font-family: Verdana, Arial, Helvetica, sans-serif; + margin: 0; + padding: 0; + border: 0; + overflow: scroll; + height: 100%; + max-height: 100%; +} + + +th { font-family: Verdana, Arial, Helvetica, sans-serif } +td { font-family: Verdana, Arial, Helvetica, sans-serif } +p { font-family: Verdana, Arial, Helvetica, sans-serif } + +.header { background: #222; color: #fff } +.top { background: #efe } +.otp { background: #efe } +.erlang { background: #ffe } +.otp2 { background: #efe } +.app { background: #ffe } + +a:link { color: blue; text-decoration: none } +a:active { color: blue; text-decoration: none } +a:visited { color: blue; text-decoration: none } + +#container { + width: 100%; + margin: 0; + background-color: #fff; +} + + +#leftnav { + position: fixed; + float: left; + top: 0; + bottom: 0; + left: 0; + width: 200px; + overflow:auto; + margin: 0; + padding: 1px; + border-right: 1px solid red; +} + + +#content { + margin-left: 240px; /* set left value to WidthOfFrameDiv */ +} + +.frontpage +{ + padding-top: 50px; /* Magins for inner DIV inside each DIV (to provide padding) */ +} + + +.innertube +{ + margin: 15px; /* Magins for inner DIV inside each DIV (to provide padding) */ +} + +.footer +{ + margin: 15px; /* Magins for inner DIV inside each DIV (to provide padding) */ + +} +span.bold_code { font-family: courier;font-weight: bold} +span.code { font-family: courier;font-weight: normal} + +.note, .warning { + border: solid black 1px; + margin: 1em 3em; +} + +.note .label { + background: #30d42a; + color: white; + font-weight: bold; + padding: 5px 10px; +} +.note .content { + background: #eafeea; + color: black; + line-height: 120%; + font-size: 90%; + padding: 5px 10px; +} +.warning .label { + background: #C00; + color: white; + font-weight: bold; + padding: 5px 10px; +} +.warning .content { + background: #FFF0F0; + color: black; + line-height: 120%; + font-size: 90%; + padding: 5px 10px; +} + +.example { + background-color:#eeeeff; + padding: 0px 10px; +} + +pre { font-family: courier; font-weight: normal } + +.REFBODY { margin-left: 13mm } + +.REFTYPES { margin-left: 8mm } + +footer { } diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/application.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/application.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/application.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/application.dtd 2009-11-20 13:35:32.000000000 +0000 @@ -0,0 +1,29 @@ + + + + +%common; + +%common.header; + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/appref.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/appref.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/appref.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/appref.dtd 2009-11-20 13:35:32.000000000 +0000 @@ -0,0 +1,33 @@ + + + + +%common.refs; + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/book.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/book.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/book.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/book.dtd 2009-11-20 13:35:32.000000000 +0000 @@ -0,0 +1,73 @@ + + + + +%common; + +%common.header; + +%common.table; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/bookinsidecover.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/bookinsidecover.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/bookinsidecover.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/bookinsidecover.dtd 2009-11-20 13:35:32.000000000 +0000 @@ -0,0 +1,36 @@ + + +%ISOlat1; + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/chapter.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/chapter.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/chapter.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/chapter.dtd 2009-11-20 13:35:32.000000000 +0000 @@ -0,0 +1,36 @@ + + + + +%common; + +%common.header; + +%common.table; + +%common.image; + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/cites.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/cites.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/cites.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/cites.dtd 2009-11-20 13:35:32.000000000 +0000 @@ -0,0 +1,35 @@ + + +%ISOlat1; + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.dtd 2009-11-20 13:35:32.000000000 +0000 @@ -0,0 +1,87 @@ + + + + +%common.entities; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.entities.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.entities.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.entities.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.entities.dtd 2009-11-20 13:35:33.000000000 +0000 @@ -0,0 +1,24 @@ + + +%ISOlat1; + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.header.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.header.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.header.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.header.dtd 2009-11-20 13:35:33.000000000 +0000 @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.image.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.image.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.image.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.image.dtd 2009-11-20 13:35:33.000000000 +0000 @@ -0,0 +1,21 @@ + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.refs.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.refs.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.refs.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.refs.dtd 2009-11-20 13:35:33.000000000 +0000 @@ -0,0 +1,40 @@ + + + + +%common; + +%common.header; + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.table.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.table.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.table.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/common.table.dtd 2009-11-20 13:35:33.000000000 +0000 @@ -0,0 +1,25 @@ + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/comref.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/comref.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/comref.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/comref.dtd 2009-11-20 13:35:34.000000000 +0000 @@ -0,0 +1,31 @@ + + + + +%common.refs; + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/cref.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/cref.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/cref.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/cref.dtd 2009-11-20 13:35:34.000000000 +0000 @@ -0,0 +1,34 @@ + + + + +%common.refs; + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/erlref.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/erlref.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/erlref.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/erlref.dtd 2009-11-20 13:35:34.000000000 +0000 @@ -0,0 +1,31 @@ + + + + +%common.refs; + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/fascicules.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/fascicules.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/fascicules.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/fascicules.dtd 2009-11-20 13:35:34.000000000 +0000 @@ -0,0 +1,35 @@ + + + + +%ISOlat1; + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/fileref.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/fileref.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/fileref.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/fileref.dtd 2009-11-20 13:35:34.000000000 +0000 @@ -0,0 +1,31 @@ + + + + +%common.refs; + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/Makefile erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/Makefile --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/Makefile 2009-11-20 13:35:39.000000000 +0000 @@ -0,0 +1,99 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../vsn.mk +VSN=$(ERL_DOCGEN_VSN) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/erl_docgen-$(VSN) + + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + + +DTD_FILES = \ + application.dtd \ + chapter.dtd \ + common.header.dtd \ + comref.dtd \ + fileref.dtd \ + xhtml1-frameset.dtd \ + appref.dtd \ + cites.dtd \ + common.image.dtd \ + cref.dtd \ + part.dtd \ + xhtml1-strict.dtd \ + book.dtd \ + common.dtd \ + common.refs.dtd \ + erlref.dtd \ + report.dtd \ + xhtml1-transitional.dtd \ + bookinsidecover.dtd \ + common.entities.dtd \ + common.table.dtd \ + fascicules.dtd \ + terms.dtd + + + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +debug opt: + +docs: + +clean: + $(RM) $(TARGET_FILES) + + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + + +release_spec: opt + $(INSTALL_DIR) $(RELSYSDIR)/priv/docbuilder_dtd + $(INSTALL_DATA) $(DTD_FILES) $(RELSYSDIR)/priv/docbuilder_dtd + + +release_docs_spec: + + +release_tests_spec: + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/part.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/part.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/part.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/part.dtd 2009-11-20 13:35:34.000000000 +0000 @@ -0,0 +1,29 @@ + + + + +%common; + +%common.header; + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/report.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/report.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/report.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/report.dtd 2009-11-20 13:35:35.000000000 +0000 @@ -0,0 +1,138 @@ + + + + +%ISOlat1; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/terms.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/terms.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/terms.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/terms.dtd 2009-11-20 13:35:35.000000000 +0000 @@ -0,0 +1,36 @@ + + +%ISOlat1; + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-frameset.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-frameset.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-frameset.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-frameset.dtd 2009-11-20 13:35:35.000000000 +0000 @@ -0,0 +1,1235 @@ + + + + + +%HTMLlat1; + + +%HTMLsymbol; + + +%HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-strict.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-strict.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-strict.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-strict.dtd 2009-11-20 13:35:35.000000000 +0000 @@ -0,0 +1,978 @@ + + + + + +%HTMLlat1; + + +%HTMLsymbol; + + +%HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-transitional.dtd erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-transitional.dtd --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-transitional.dtd 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/docbuilder_dtd/xhtml1-transitional.dtd 2009-11-20 13:35:35.000000000 +0000 @@ -0,0 +1,1201 @@ + + + + + +%HTMLlat1; + + +%HTMLsymbol; + + +%HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/dtd_html_entities/Makefile erlang-13.b.3-dfsg/lib/erl_docgen/priv/dtd_html_entities/Makefile --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/dtd_html_entities/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/dtd_html_entities/Makefile 2009-11-20 13:35:48.000000000 +0000 @@ -0,0 +1,75 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../vsn.mk +VSN=$(ERL_DOCGEN_VSN) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/erl_docgen-$(VSN) + + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + + +ENTITY_FILES = \ + xhtml-lat1.ent + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +debug opt: + +docs: + +clean: + $(RM) $(TARGET_FILES) + + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + + +release_spec: opt + $(INSTALL_DIR) $(RELSYSDIR)/priv/dtd_html_entities + $(INSTALL_DATA) $(ENTITY_FILES) $(RELSYSDIR)/priv/dtd_html_entities + + +release_docs_spec: + + +release_tests_spec: + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/dtd_html_entities/xhtml-lat1.ent erlang-13.b.3-dfsg/lib/erl_docgen/priv/dtd_html_entities/xhtml-lat1.ent --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/dtd_html_entities/xhtml-lat1.ent 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/dtd_html_entities/xhtml-lat1.ent 2009-11-20 13:35:44.000000000 +0000 @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/dtd_man_entities/Makefile erlang-13.b.3-dfsg/lib/erl_docgen/priv/dtd_man_entities/Makefile --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/dtd_man_entities/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/dtd_man_entities/Makefile 2009-11-20 13:35:48.000000000 +0000 @@ -0,0 +1,75 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../vsn.mk +VSN=$(ERL_DOCGEN_VSN) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/erl_docgen-$(VSN) + + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + + +ENTITY_FILES = \ + xhtml-lat1.ent + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +debug opt: + +docs: + +clean: + $(RM) $(TARGET_FILES) + + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + + +release_spec: opt + $(INSTALL_DIR) $(RELSYSDIR)/priv/dtd_man_entities + $(INSTALL_DATA) $(ENTITY_FILES) $(RELSYSDIR)/priv/dtd_man_entities + + +release_docs_spec: + + +release_tests_spec: + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/dtd_man_entities/xhtml-lat1.ent erlang-13.b.3-dfsg/lib/erl_docgen/priv/dtd_man_entities/xhtml-lat1.ent --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/dtd_man_entities/xhtml-lat1.ent 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/dtd_man_entities/xhtml-lat1.ent 2009-11-20 13:35:47.000000000 +0000 @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/erl_docgen/priv/images/erlang-logo.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/erl_docgen/priv/images/erlang-logo.gif differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/erl_docgen/priv/images/erlang-logo.png and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/erl_docgen/priv/images/erlang-logo.png differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/erl_docgen/priv/images/erlang-old.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/erl_docgen/priv/images/erlang-old.gif differ diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/images/Makefile erlang-13.b.3-dfsg/lib/erl_docgen/priv/images/Makefile --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/images/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/images/Makefile 2009-11-20 13:35:40.000000000 +0000 @@ -0,0 +1,79 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../vsn.mk +VSN=$(ERL_DOCGEN_VSN) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/erl_docgen-$(VSN) + + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + + +GIF_FILES = \ + erlang-logo.gif + +PNG_FILES = \ + erlang-logo.png + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +debug opt: + +docs: + +clean: + $(RM) $(TARGET_FILES) + + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + + +release_spec: opt + $(INSTALL_DIR) $(RELSYSDIR)/priv/images + $(INSTALL_DATA) $(GIF_FILES) $(PNG_FILES) $(RELSYSDIR)/priv/images + + +release_docs_spec: + $(INSTALL_DIR) $(RELEASE_PATH)/doc + $(INSTALL_DATA) $(PNG_FILES) $(RELEASE_PATH)/doc + +release_tests_spec: + + Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/erl_docgen/priv/js/flipmenu/flip_closed.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/erl_docgen/priv/js/flipmenu/flip_closed.gif differ diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/js/flipmenu/flipmenu.js erlang-13.b.3-dfsg/lib/erl_docgen/priv/js/flipmenu/flipmenu.js --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/js/flipmenu/flipmenu.js 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/js/flipmenu/flipmenu.js 2009-11-20 13:35:36.000000000 +0000 @@ -0,0 +1,352 @@ +// ###################################################################### + +// ## flipMenu 5.0.0 (c) J. Reijers +// ## Last modifications: 23 March 2007 + +// ###################################################################### + +// ## Degree of indentation from the left. + flipIndentation = "5px"; + +// ## Padding inbetween menu items. + flipVerticalPadding = "4px"; + +// ## Margin between the left of the browser and the menu. + flipLeftMargin = "16px"; + +// ## Margin between the top of the browser and the menu. + flipTopMargin = "10px"; + +// ## Allow multiple menus to fold out without closing all the other open ones. + flipOpenMultipleMenus = false; + +// ## Preserve the current state of the menu (requires cookies). + flipSaveMenuState = false; + +// ## Open entries where the attribute expanded is true + flipMarked = true; + +// ## Use custom images for bullets + flipImages = true; + +// ## Images to use (specify full path) + flipImg_open = "flip_open.gif"; + flipImg_closed = "flip_closed.gif"; + flipImg_static = "flip_static.gif"; + +// ## Initialise all flipMenus onload + flipInitOnLoad = true; + +// ## Message to display in status bar while loading + flipLoadingMessage = "Loading..."; + +// ###################################################################### + +function alterSize(someSize, alterAmount) { + someSize = String(someSize); + var tmpNr = parseFloat(someSize.replace(/\D/g, "")); + var tmpChar = someSize.replace(/\d/g, ""); + return isNaN(tmpNr) ? someSize : ((tmpNr + alterAmount) + tmpChar); +} + +isIE = (String(navigator.appVersion).indexOf("MSIE") > -1); +if (!isIE) flipIndentation = alterSize(flipIndentation, -16); +if (!isIE) flipLeftMargin = alterSize(flipLeftMargin, -16); + +document.write( + "" +); + + + +if (flipImages) { + aFlipPreloads = []; + aFlipPreloads[0] = new Image; + aFlipPreloads[0].src = document.getElementById("js").getAttribute("src").match( /.*\// ) + flipImg_open; + aFlipPreloads[1] = new Image; + aFlipPreloads[1].src = document.getElementById("js").getAttribute("src").match( /.*\// ) + flipImg_closed; + aFlipPreloads[2] = new Image; + aFlipPreloads[2].src = document.getElementById("js").getAttribute("src").match( /.*\// ) + flipImg_static; +} + +function addEvent(someObj, someEvent, someFunction) { + if (someObj.addEventListener) { someObj.addEventListener(someEvent, someFunction, true); return true; } else if (someObj.attachEvent) return someObj.attachEvent("on" + someEvent, someFunction); else return false; +} + +function openCloseFlip(theItem, newSetting, openParents) { + if (theItem.flipID) { + if (openParents) { + var tmpItem = theItem; + while (tmpItem.parentElement || tmpItem.parentNode) { + tmpItem = (tmpItem.parentElement) ? tmpItem.parentElement : tmpItem.parentNode; + openCloseFlip(tmpItem, newSetting); + } + } + if ((theItem.className == "flipFolderOpen" && newSetting == "closed") || (theItem.className == "flipFolderClosed" && newSetting == "open")) { + if (!theItem.childrenInitialised) { + for (var j = 0; j < theItem.childNodes.length; j++) if (theItem.childNodes[j].nodeName == "UL" && !theItem.childNodes[j].initialised) initFlip(theItem.childNodes[j]); + theItem.childrenInitialised = true; + } + theItem.getElementsByTagName("UL")[0].style.display = (newSetting == "open") ? "" : "none"; + theItem.className = newSetting == "open" ? "flipFolderOpen" : "flipFolderClosed"; + } + } +} + +function openFlip(theItem, openParents) { + openCloseFlip(theItem, "open", openParents); +} + +function closeFlip(theItem, closeParents) { + openCloseFlip(theItem, "closed", closeParents); +} + +function toggleFlip(theElement) { + if (theElement.flipID) { + var theItem = theElement; + var isContained = true; + } else { + if (theElement && theElement.button > 0) return false; + var theItem = (isIE) ? event.srcElement : theElement.target; + + var isContained = false; + if (theItem.className == "flipFolderOpen" || theItem.className == "flipFolderClosed") isContained = true; else while (theItem.parentElement || theItem.parentNode) { + if (theItem.className == "flipStatic" || theItem.className == "flipFolderOpen" || theItem.className == "flipFolderClosed") { + isContained = (theItem.className == "flipFolderOpen" || theItem.className == "flipFolderClosed"); + break; + } + theItem = (theItem.parentElement) ? theItem.parentElement : theItem.parentNode; + } + } + + var toOpenFlip = (isContained && theItem.className == "flipFolderClosed"); + + if (!flipOpenMultipleMenus && (toOpenFlip || theItem.className == "flipStatic")) { + if (theItem.parentElement || theItem.parentNode) { + var parentUL = (theItem.parentElement) ? theItem.parentElement : theItem.parentNode; + for (var i = 0; i < parentUL.childNodes.length; i++) closeFlip(parentUL.childNodes[i]); + } + } + + if (isContained) { + if (toOpenFlip) openFlip(theItem); else closeFlip(theItem); + } +} + +function setAllFlips(startElement, newSetting) { + if (typeof startElement == "undefined") var startElement = document; + if (typeof newSetting == "undefined") var newSetting = "closed"; + + var aUL = startElement.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var parentFlip = aUL[i].parentElement ? aUL[i].parentElement : aUL[i].parentNode; + openCloseFlip(parentFlip, newSetting); + } +} + +function openAllFlips(startElement) { + setAllFlips(startElement, "open"); +} + +function closeAllFlips(startElement) { + setAllFlips(startElement, "closed"); +} + +function initFlip(startElement) { + if (!document.createElement) return false; + + if (!startElement || !startElement.nodeName) { + var aUL = document.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + if (flipLoadingMessage != "") window.status = flipLoadingMessage + " " + parseInt((i / (aUL.length - 1)) * 100, 10) + "%"; + var curUL = aUL[i]; + if (curUL.className == "flipMenu") { + initFlip(curUL); + + // ## Fix text selecting problem in Mozilla + curUL.onselectstart = new Function("return false"); + curUL.onmousedown = new Function("return false"); + curUL.onclick = new Function("return true"); + } + } + + if (flipSaveMenuState) loadMenuState(); + + if (flipLoadingMessage != "") window.status = ""; + return true; + } + + if (startElement.className == "flipMenu") startElement.style.display = ""; + + if (!startElement.childNodes || startElement.childNodes.length == 0) return false; + + if (typeof flipIDCur == "undefined") flipIDCur = 0; + if (!startElement.initialised) { + var aUL = startElement.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) aUL[i].style.display = "none"; + } + + for (var i = 0; i < startElement.childNodes.length; i++) { + var curNode = startElement.childNodes[i]; + if (curNode.nodeName == "LI") { + flipIDCur++; + curNode.flipID = flipIDCur; + + var nodeHasChildren = curNode.getElementsByTagName("UL").length > 0; + if (nodeHasChildren) { + if (flipImages && curNode.flipClosed) curNode.style.listStyleImage = "url(" + curNode.flipClosed + ")"; + + if (curNode.className == null || curNode.className == "") curNode.className = "flipFolderClosed"; + } else { + curNode.className = "flipStatic"; + if (flipImages && !curNode.style.listStyleImage) { + if (!curNode.flipStatic) curNode.flipStatic = document.getElementById("js").getAttribute("src").match( /.*\// ) + flipImg_static; + curNode.style.listStyleImage = "url(" + curNode.flipStatic + ")"; + } + } + + + if (!curNode.flipOpen) curNode.flipOpen = document.getElementById("js").getAttribute("src").match( /.*\// ) + flipImg_open; + if (!curNode.flipClosed) curNode.flipClosed = document.getElementById("js").getAttribute("src").match( /.*\// ) + flipImg_closed; + + if (flipMarked) { + if (curNode.getAttribute("expanded") == "true") curNode.flipIsOpen=1; + } + + if (curNode.flipIsOpen) openFlip(curNode); + } + } + + startElement.initialised = true; +} + +function rootOfFlip(flipID, startElement) { + + function containsFlip(startElement, flipID) { + var flipFound = false; + var i = 0; + while (i < startElement.childNodes.length && !flipFound) { + var curNode = startElement.childNodes[i]; + flipFound = (curNode.flipID == flipID) ? true : containsFlip(curNode, flipID); + i++; + } + return flipFound; + } + + var rootFlip = null; + + if (!startElement || !startElement.nodeName) { + var aUL = document.getElementsByTagName("UL"); + var i = 0; + while (rootFlip == null && i < aUL.length) { + var curUL = aUL[i]; + if (curUL.nodeName == "UL" && curUL.className == "flipMenu") rootFlip = rootOfFlip(flipID, curUL); + i++; + } + return rootFlip; + } + + if (startElement.childNodes) for (var i = 0; i < startElement.childNodes.length; i++) { + var curNode = startElement.childNodes[i]; + if (curNode.flipID == flipID || containsFlip(curNode, flipID)) rootFlip = curNode; + } + + return rootFlip; +} + +function getCookie(cookieName) { + var allCookies = document.cookie; + var indexStr = allCookies.indexOf(cookieName + "="); + if (indexStr == -1) return ""; + indexStr = allCookies.indexOf("=", indexStr) + 1; + var endStr = allCookies.indexOf(";", indexStr); + if (endStr == -1) endStr = allCookies.length; + return unescape(allCookies.substring(indexStr, endStr)); +} + +function inArray(someID, someArray) { + for (var i = 0; i < someArray.length; i++) if (someArray[i] == someID) return true; + return false; +} + +function getMenuState(startElement) { + if (!startElement.childNodes || startElement.childNodes.length == 0) return ""; + + var openItems = ""; + var aUL = startElement.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curNode = aUL[i]; + var parentFlip = (curNode.parentElement) ? curNode.parentElement : curNode.parentNode; + if (curNode.style.display == "" && parentFlip.flipID) openItems += " " + parentFlip.flipID; + } + return openItems; +} + +function putMenuState(startElement) { + if (!startElement.childNodes || startElement.childNodes.length == 0) return false; + + var aUL = startElement.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curNode = aUL[i]; + var parentFlip = (curNode.parentElement) ? curNode.parentElement : curNode.parentNode; + if (inArray(parentFlip.flipID, aOpenItems)) { + openFlip(parentFlip); + if (typeof prevFlipRoot == "undefined") { + var testRoot = rootOfFlip(parentFlip.flipID); + if (testRoot.flipID == parentFlip.flipID) prevFlipRoot = testRoot; + } + } + } +} + +function saveMenuState() { + if (flipSaveMenuState) { + var aUL = document.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curUL = aUL[i]; + var curID = curUL.id ? curUL.id : i; + if (curUL.className == "flipMenu") document.cookie = cookiePrefix + curID + "=" + getMenuState(curUL) + ";"; + } + } +} + +function loadMenuState() { + var aUL = document.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curUL = aUL[i]; + var curID = curUL.id ? curUL.id : i; + if (curUL.className == "flipMenu") { + var savedState = String(getCookie(cookiePrefix + curID)); + if (savedState != "") { + aOpenItems = savedState.split(" "); + putMenuState(curUL); + } + } + } + + addEvent(window, "unload", saveMenuState); +} + +function clearMenuState(flipMenuID) { + if (typeof flipMenuID == "undefined") { + var aUL = document.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curUL = aUL[i]; + var curID = curUL.id ? curUL.id : i; + if (curUL.className == "flipMenu") document.cookie = cookiePrefix + curID + "=;"; + } + } else document.cookie = cookiePrefix + flipMenuID + "=;"; +} + +cookiePrefix = document.location.pathname + "_"; + +addEvent(document, "click", toggleFlip); +if (flipInitOnLoad) addEvent(window, "load", initFlip); Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/erl_docgen/priv/js/flipmenu/flip_open.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/erl_docgen/priv/js/flipmenu/flip_open.gif differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/erl_docgen/priv/js/flipmenu/flip_static.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/erl_docgen/priv/js/flipmenu/flip_static.gif differ diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/js/flipmenu/fm.js erlang-13.b.3-dfsg/lib/erl_docgen/priv/js/flipmenu/fm.js --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/js/flipmenu/fm.js 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/js/flipmenu/fm.js 2009-11-20 13:35:36.000000000 +0000 @@ -0,0 +1,376 @@ +// ###################################################################### + +// ## flipMenu 5.0.0 (c) J. Reijers +// ## Last modifications: 23 March 2007 + +// ###################################################################### + +// ## Degree of indentation from the left. + flipIndentation = "5px"; + +// ## Padding inbetween menu items. + flipVerticalPadding = "4px"; + +// ## Margin between the left of the browser and the menu. + flipLeftMargin = "16px"; + +// ## Margin between the top of the browser and the menu. + flipTopMargin = "10px"; + +// ## Allow multiple menus to fold out without closing all the other open ones. + flipOpenMultipleMenus = false; + +// ## Preserve the current state of the menu (requires cookies). + flipSaveMenuState = false; + +// ## Preserve the current state of the menu (requires cookies). + constantState = true; + +// ## Use custom images for bullets + flipImages = true; + +// ## Images to use (specify full path) + flipImg_open = "js/flipmenu/flip_open.gif"; + flipImg_closed = "js/flipmenu/flip_closed.gif"; + flipImg_static = "js/flipmenu/flip_static.gif"; + +// ## Initialise all flipMenus onload + flipInitOnLoad = true; + +// ## Message to display in status bar while loading + flipLoadingMessage = "Loading..."; + +// ###################################################################### + +function alterSize(someSize, alterAmount) { + someSize = String(someSize); + var tmpNr = parseFloat(someSize.replace(/\D/g, "")); + var tmpChar = someSize.replace(/\d/g, ""); + return isNaN(tmpNr) ? someSize : ((tmpNr + alterAmount) + tmpChar); +} + +isIE = (String(navigator.appVersion).indexOf("MSIE") > -1); +if (!isIE) flipIndentation = alterSize(flipIndentation, -16); +if (!isIE) flipLeftMargin = alterSize(flipLeftMargin, -16); + +document.write( + "" +); + +if (flipImages) { + aFlipPreloads = []; + aFlipPreloads[0] = new Image; + aFlipPreloads[0].src = flipImg_open; + aFlipPreloads[1] = new Image; + aFlipPreloads[1].src = flipImg_closed; + aFlipPreloads[2] = new Image; + aFlipPreloads[2].src = flipImg_static; +} + +function addEvent(someObj, someEvent, someFunction) { + if (someObj.addEventListener) { someObj.addEventListener(someEvent, someFunction, true); return true; } else if (someObj.attachEvent) return someObj.attachEvent("on" + someEvent, someFunction); else return false; +} + +function openCloseFlip(theItem, newSetting, openParents) { + if (theItem.flipID) { + if (openParents) { + var tmpItem = theItem; + while (tmpItem.parentElement || tmpItem.parentNode) { + tmpItem = (tmpItem.parentElement) ? tmpItem.parentElement : tmpItem.parentNode; + openCloseFlip(tmpItem, newSetting); + } + } + if ((theItem.className == "flipFolderOpen" && newSetting == "closed") || (theItem.className == "flipFolderClosed" && newSetting == "open")) { + if (!theItem.childrenInitialised) { + for (var j = 0; j < theItem.childNodes.length; j++) if (theItem.childNodes[j].nodeName == "UL" && !theItem.childNodes[j].initialised) initFlip(theItem.childNodes[j]); + theItem.childrenInitialised = true; + } + theItem.getElementsByTagName("UL")[0].style.display = (newSetting == "open") ? "" : "none"; + theItem.className = newSetting == "open" ? "flipFolderOpen" : "flipFolderClosed"; + } + } +} + +function openFlip(theItem, openParents) { + openCloseFlip(theItem, "open", openParents); +} + +function closeFlip(theItem, closeParents) { + + openCloseFlip(theItem, "closed", closeParents); +} + +function toggleFlip(theElement) { + if (theElement.flipID) { + var theItem = theElement; + var isContained = true; + } else { + if (theElement && theElement.button > 0) return false; + var theItem = (isIE) ? event.srcElement : theElement.target; + + var isContained = false; + if (theItem.className == "flipFolderOpen" || theItem.className == "flipFolderClosed") isContained = true; else while (theItem.parentElement || theItem.parentNode) { + if (theItem.className == "flipStatic" || theItem.className == "flipFolderOpen" || theItem.className == "flipFolderClosed") { + isContained = (theItem.className == "flipFolderOpen" || theItem.className == "flipFolderClosed"); + break; + } + theItem = (theItem.parentElement) ? theItem.parentElement : theItem.parentNode; + } + } + + var toOpenFlip = (isContained && theItem.className == "flipFolderClosed"); + + if (!flipOpenMultipleMenus && (toOpenFlip || theItem.className == "flipStatic")) { + if (theItem.parentElement || theItem.parentNode) { + var parentUL = (theItem.parentElement) ? theItem.parentElement : theItem.parentNode; + for (var i = 0; i < parentUL.childNodes.length; i++) closeFlip(parentUL.childNodes[i]); + } + } + + if (isContained) { + if (toOpenFlip) openFlip(theItem); else closeFlip(theItem); + } +} + +function setAllFlips(startElement, newSetting) { + if (typeof startElement == "undefined") var startElement = document; + if (typeof newSetting == "undefined") var newSetting = "closed"; + + var aUL = startElement.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var parentFlip = aUL[i].parentElement ? aUL[i].parentElement : aUL[i].parentNode; + openCloseFlip(parentFlip, newSetting); + } +} + +function openAllFlips(startElement) { + setAllFlips(startElement, "open"); +} + +function closeAllFlips(startElement) { + setAllFlips(startElement, "closed"); +} + +function initFlip(startElement) { + if (!document.createElement) return false; + + if (!startElement || !startElement.nodeName) { + var aUL = document.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + if (flipLoadingMessage != "") window.status = flipLoadingMessage + " " + parseInt((i / (aUL.length - 1)) * 100, 10) + "%"; + var curUL = aUL[i]; + if (curUL.className == "flipMenu") { + initFlip(curUL); + + // ## Fix text selecting problem in Mozilla + curUL.onselectstart = new Function("return false"); + curUL.onmousedown = new Function("return false"); + curUL.onclick = new Function("return true"); + } + } + + if (flipSaveMenuState) loadMenuState(); + + if (flipLoadingMessage != "") window.status = ""; + return true; + } + + if (startElement.className == "flipMenu") startElement.style.display = ""; + + if (!startElement.childNodes || startElement.childNodes.length == 0) return false; + + if (typeof flipIDCur == "undefined") flipIDCur = 0; + if (!startElement.initialised) { + var aUL = startElement.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) aUL[i].style.display = "none"; + } + + for (var i = 0; i < startElement.childNodes.length; i++) { + var curNode = startElement.childNodes[i]; + if (curNode.nodeName == "LI") { + flipIDCur++; + curNode.flipID = flipIDCur; + + var nodeHasChildren = curNode.getElementsByTagName("UL").length > 0; + if (nodeHasChildren) { + if (flipImages && curNode.flipClosed) curNode.style.listStyleImage = "url(" + curNode.flipClosed + ")"; + + if (curNode.className == null || curNode.className == "") curNode.className = "flipFolderClosed"; + } else { + curNode.className = "flipStatic"; + if (flipImages && !curNode.style.listStyleImage) { + if (!curNode.flipStatic) curNode.flipStatic = flipImg_static; + curNode.style.listStyleImage = "url(" + curNode.flipStatic + ")"; + } + } + + if (!curNode.flipOpen) curNode.flipOpen = flipImg_open; + if (!curNode.flipClosed) curNode.flipClosed = flipImg_closed; + + if (curNode.flipIsOpen) openFlip(curNode); + } + } + + startElement.initialised = true; +} + +function rootOfFlip(flipID, startElement) { + + function containsFlip(startElement, flipID) { + var flipFound = false; + var i = 0; + while (i < startElement.childNodes.length && !flipFound) { + var curNode = startElement.childNodes[i]; + flipFound = (curNode.flipID == flipID) ? true : containsFlip(curNode, flipID); + i++; + } + return flipFound; + } + + var rootFlip = null; + + if (!startElement || !startElement.nodeName) { + var aUL = document.getElementsByTagName("UL"); + var i = 0; + while (rootFlip == null && i < aUL.length) { + var curUL = aUL[i]; + if (curUL.nodeName == "UL" && curUL.className == "flipMenu") rootFlip = rootOfFlip(flipID, curUL); + i++; + } + return rootFlip; + } + + if (startElement.childNodes) for (var i = 0; i < startElement.childNodes.length; i++) { + var curNode = startElement.childNodes[i]; + if (curNode.flipID == flipID || containsFlip(curNode, flipID)) rootFlip = curNode; + } + + return rootFlip; +} + +function getCookie(cookieName) { + var allCookies = document.cookie; + var indexStr = allCookies.indexOf(cookieName + "="); + if (indexStr == -1) return ""; + indexStr = allCookies.indexOf("=", indexStr) + 1; + var endStr = allCookies.indexOf(";", indexStr); + if (endStr == -1) endStr = allCookies.length; + return unescape(allCookies.substring(indexStr, endStr)); +} + +function inArray(someID, someArray) { + for (var i = 0; i < someArray.length; i++) if (someArray[i] == someID) return true; + return false; +} + +function getMenuState(startElement) { + if (!startElement.childNodes || startElement.childNodes.length == 0) return ""; + + var openItems = ""; + var aUL = startElement.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curNode = aUL[i]; + var parentFlip = (curNode.parentElement) ? curNode.parentElement : curNode.parentNode; + if (curNode.style.display == "" && parentFlip.flipID) openItems += " " + parentFlip.flipID; + } + return openItems; +} + +function putMenuState(startElement) { + if (!startElement.childNodes || startElement.childNodes.length == 0) return false; + + var aUL = startElement.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curNode = aUL[i]; + var parentFlip = (curNode.parentElement) ? curNode.parentElement : curNode.parentNode; + if (inArray(parentFlip.flipID, aOpenItems)) { + openFlip(parentFlip); + if (typeof prevFlipRoot == "undefined") { + var testRoot = rootOfFlip(parentFlip.flipID); + if (testRoot.flipID == parentFlip.flipID) prevFlipRoot = testRoot; + } + } + } +} +function setMenuState(startElement) { + if (!startElement.childNodes || startElement.childNodes.length == 0) return false; + + var aTitle = document.title; + aTitleParts = aTitle.split(" "); + + var aUL = startElement.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curNode = aUL[i]; + var parentFlip = (curNode.parentElement) ? curNode.parentElement : curNode.parentNode; + if (aTitleParts[3] == curNode.content) { + openFlip(parentFlip); + if (typeof prevFlipRoot == "undefined") { + var testRoot = rootOfFlip(parentFlip.flipID); + if (testRoot.flipID == parentFlip.flipID) prevFlipRoot = testRoot; + } + } + } +} +function saveMenuState() { + if (flipSaveMenuState) { + var aUL = document.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curUL = aUL[i]; + var curID = curUL.id ? curUL.id : i; + if (curUL.className == "flipMenu") document.cookie = cookiePrefix + curID + "=" + getMenuState(curUL) + ";"; + } + } +} + +function loadMenuState() { + if(constantState) { + var aUL = document.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curUL = aUL[i]; + var curID = curUL.id ? curUL.id : i; + if (curUL.className == "flipMenu") { + setMenuState(curUL); + } + } + } else { + var aUL = document.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curUL = aUL[i]; + var curID = curUL.id ? curUL.id : i; + if (curUL.className == "flipMenu") { + var savedState = String(getCookie(cookiePrefix + curID)); + if (savedState != "") { + aOpenItems = savedState.split(" "); + putMenuState(curUL); + } + } + } + + addEvent(window, "unload", saveMenuState); + } +} + + +function clearMenuState(flipMenuID) { + if (typeof flipMenuID == "undefined") { + var aUL = document.getElementsByTagName("UL"); + for (var i = 0; i < aUL.length; i++) { + var curUL = aUL[i]; + var curID = curUL.id ? curUL.id : i; + if (curUL.className == "flipMenu") document.cookie = cookiePrefix + curID + "=;"; + } + } else document.cookie = cookiePrefix + flipMenuID + "=;"; +} + +cookiePrefix = document.location.pathname + "_"; + +addEvent(document, "click", toggleFlip); +if (flipInitOnLoad) addEvent(window, "load", initFlip); diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/js/flipmenu/Makefile erlang-13.b.3-dfsg/lib/erl_docgen/priv/js/flipmenu/Makefile --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/js/flipmenu/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/js/flipmenu/Makefile 2009-11-20 13:35:40.000000000 +0000 @@ -0,0 +1,81 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../../vsn.mk +VSN=$(ERL_DOCGEN_VSN) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/erl_docgen-$(VSN) + + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + + +GIF_FILES = \ + flip_closed.gif \ + flip_open.gif \ + flip_static.gif + +JS_FILES = \ + flipmenu.js + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +debug opt: + +docs: + +clean: + $(RM) $(TARGET_FILES) + + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + + +release_spec: opt + $(INSTALL_DIR) $(RELSYSDIR)/priv/js/flipmenu + $(INSTALL_DATA) $(JS_FILES) $(GIF_FILES) $(RELSYSDIR)/priv/js/flipmenu + + +release_docs_spec: + $(INSTALL_DIR) $(RELEASE_PATH)/doc/js/flipmenu + $(INSTALL_DATA) $(JS_FILES) $(GIF_FILES) $(RELEASE_PATH)/doc/js/flipmenu + +release_tests_spec: + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/Makefile erlang-13.b.3-dfsg/lib/erl_docgen/priv/Makefile --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/Makefile 2009-11-20 13:35:40.000000000 +0000 @@ -0,0 +1,34 @@ +# ``The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved via the world wide web at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# The Initial Developer of the Original Code is Ericsson Utvecklings AB. +# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings +# AB. All Rights Reserved.'' +# +# $Id$ +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# +# Macros +# + +SUB_DIRECTORIES = bin css docbuilder_dtd dtd_html_entities dtd_man_entities images js/flipmenu xsl + +SPECIAL_TARGETS = + +# +# Default Subdir Targets +# +include $(ERL_TOP)/make/otp_subdir.mk + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/nyi.html erlang-13.b.3-dfsg/lib/erl_docgen/priv/nyi.html --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/nyi.html 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/nyi.html 2009-11-20 13:35:31.000000000 +0000 @@ -0,0 +1,16 @@ + + + + Not Yet Implemented + + + +

Not Yet Implemented

+ +

This page is not yet generated.

+ + +
+ + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/db_html_params.xsl erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_html_params.xsl --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/db_html_params.xsl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_html_params.xsl 2009-11-20 13:35:37.000000000 +0000 @@ -0,0 +1,35 @@ + + + + + + + + + + + Copyright © + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/db_html.xsl erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_html.xsl --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/db_html.xsl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_html.xsl 2009-11-20 13:35:37.000000000 +0000 @@ -0,0 +1,1486 @@ + + + + + + + + + + + + + + + Erlang -- <xsl:value-of select="header/title"/> + + + +
+ + + + + + + +
+
+ + + + + +
+ + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + refpage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Erlang logo +
+ + +
User's Guide
+ + + Reference Manual
+
+ + Release Notes
+
+ PDF
+ Top +
+ + + + +
+ + Expand All
+ Contract All +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + .  + + +

+ + + + +
+ + + + + +

+ + +

+ + + +
+ + + + + + +

+ + + +

+
+ + + +
+
+ + + + + +

+ +

+
+ + + +
+
+ + + + + + +
    + + + +
+
+ + + +
  • + + + +
  • +
    + + + + +
    + + + +
    +
    + + + +
    + + + +
    +
    + + + + +
    + + + +
    +
    + + + + +
    +
    Note
    +
    +

    + + + +

    +
    +
    +
    + + + + +
    +
    Warning
    +
    +

    + + + +

    +
    +
    +
    + + + +

    + +

    +
    + + + + + + + + +
    +
    + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + Table + .: +   + + + + + + + + + + + + + IMAGE MISSING
    + + + + + + + +
    + + + + + + + Figure + .: +   + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    User's Guide

    + +

    Version

    +

    + + + + + + + + + +
    +
    + + + +

    +
    + User's Guide
    + Version +

    + + + +

    + + Chapters + +

    + +
      + + + + +
    +
    +
    +
    + + + + + + + + + + + + + true + false + + +
  • + + +
  • +
    +
    + + + + + + +
  • + + + +
  • +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +   +

    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    Reference Manual

    + +

    Version

    +

    + + + + + + + + +
    +
    + + + +

    +
    + Reference Manual
    + Version +

    + + + +

    + + Table of Contents + +

    + +
      + + + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + false + true + false + + + + + + true + false + + + + + + + + +
  • + + +
  • +
    + + + +
  • + + (App) + +
  • +
    + +
  • + + + +
  • +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + +
  • + + () + +
  • +
    + +
  • + + () + +
  • +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • + + / + +
  • +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + + + + + + + + + + + + + + + + + +

    +
    + + + + + +
    + + + + + +

    MODULE

    +
    + + + +
    +
    + + + + + +

    MODULE SUMMARY

    +
    + + + +
    +
    + + + + +

    C LIBRARY

    +
    + + + +
    +
    + + + + + +

    LIBRARY SUMMARY

    +
    + + + +
    +
    + + + + +

    COMMAND

    +
    + + + +
    +
    + + + + + +

    COMMAND SUMMARY

    +
    + + + +
    +
    + + + + +

    FILE

    +
    + + + +
    +
    + + + + + +

    FILE SUMMARY

    +
    + + + +
    +
    + + + + + +

    APPLICATION

    +
    + + + +
    +
    + + + + + +

    APPLICATION SUMMARY

    +
    + + + +
    +
    + + + + +

    DESCRIPTION

    +
    +

    + + + +

    +
    +
    + + + + +

    + EXPORTS +

    + + + + + +
    + + + + + +

    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    + + +
    + + + + + + +

    Types:

    + + + + +
    + +
    + + + + + +
    + + + + +
    +
    +
    + + + + +
    + + + +
    +
    + + + +
    +

    + + + +

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    Release Notes

    + +

    Version

    +

    + + + + + + + + + +
    +
    + + + +

    +
    + Release Notes
    + Version +

    + + + +

    + + Chapters + +

    + +
      + + + + +
    +
    +
    +
    + + + + + + + + + Erlang Documentation -- <xsl:value-of select="header/title"/> + + + +
    + + + + + +
    +
    +

    Glossary

    +
    + +
    + + + +
    +
    +
    +
    +
    + + + +
    +
    + + + + +
    +
    + + + + + + + + + + Erlang Documentation -- <xsl:value-of select="header/title"/> + + + +
    + + + + + +
    +
    +

    Bibliography

    +
    + + + + + + + + + + + +
    + + + +
    +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/db_man.xsl erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_man.xsl --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/db_man.xsl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_man.xsl 2009-11-20 13:35:38.000000000 +0000 @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + .RE + .SH "" + + + + + + .RE + .SS "" + + + + + + + + .RS 2 + + .RE + + + + .TP 2 + * + + + + + .br + .br + + + + .RS 2 + + .RE + + + + .TP 4 + .B + + + + + + + + + .br + .br + + + + + + + + + + + .TP 4 .B Note: + + + + + + .TP 4 .B Warning: + + + + + + + + + .LP + + + + + + .LP + + + + + + + + + \fB + + \fR\& + + + + .br + + + + \fI\fR\& + + + + \fI\fR\& + + + + \fB\fR\& + + + + + .nf + + .fi + + + + + .nf + + .fi + + + + + + + + + + + + + + + + + + + + + + + + + .TH 3 " " "Ericsson AB" "Erlang Module Definition" + .SH MODULE + \- + + + + + + .TH 1 " " "Ericsson AB" "User Commands" + .SH NAME + \- + + + + + + .TH 3 " " "Ericsson AB" "C Library Functions" + .SH NAME + \- + + + + + + .TH 4 " " "Ericsson AB" "Files" + .SH NAME + \- + + + + + + .TH 6 " " "Ericsson AB" "Erlang Application Definition" + .SH NAME + \- + + + + + + + + + + + + + + .SH DESCRIPTION + + + + + + .SH EXPORTS + + + + + + .LP + + + + + .B + + .br + + + + + + .RS + .TP + Types + + .RE + + + + + + + .br + + + + + + .br + + + + + .RS + + .RE + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/db_pdf_params.xsl erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_pdf_params.xsl --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/db_pdf_params.xsl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_pdf_params.xsl 2009-11-20 13:35:37.000000000 +0000 @@ -0,0 +1,406 @@ + + + + + + + + + + + Copyright © - + + + + + + + + 10pt + + + 297mm + 210mm + + + + + + + + sans-serif + 0.8em + bold + always + 2.5em + 0em + + + + monospace + 0.8em + auto + preserve + 0em + + -1em + false + preserve + no-wrap + + + + 0.9em + end + + + + 130mm + retain + end + + + + solid + 10pt + #960003 + 2.3em + 0.5em + end + + + + 0.9em + end + + + + solid + 1pt + #960003 + bold + 0.5em + 200mm + retain + + + + 0.9em + bold + + + + 0.9em + bold + 2em + + + + 2em + + + + always + + + + 0.5em + 0.5em + + + + 1.8em + 1em + 0.25em + 0.25em + + + + 0.25em + + + + 0.25em + 0.25em + + + + always + + + + 2em + + + + + solid + 1pt + #960003 + page + sans-serif + 1.83em + normal + 1em + 2em + retain + + + + sans-serif + 1.5em + normal + always + 0.3em + 1em + + + + sans-serif + 1.33em + normal + always + 0.3em + 0.8em + + + + sans-serif + 1.17em + normal + always + 0.3em + 0.6em + + + + sans-serif + 1em + bold + always + 0.2em + 0.4em + + + + sans-serif + 0.83em + bold + always + 0em + 0.4em + + + + 1em + + 0.5em + 0.5em + justify + + + + solid + 2pt + #960003 + sans-serif + 0.9em + bold + + + + sans-serif + 0.9em + bold + + + + #e0e0ff + monospace + 0.8em + auto + preserve + 0em + 1em + 1em + 2em + false + preserve + no-wrap + + + + + + 1em + + + + #d0fed0 + 1em + 2em + justify + 1em + 0.3em + 1em + 1em + always + + + + #ffd6d6 + 1em + 2em + justify + 1em + 0.3em + 1em + 1em + always + + + + + 1.33em + + + + always + 2em + 1em + + + + solid + 1pt + sans-serif + 1.5em + normal + always + 0.3em + 1em + + + + bold + monospace + + always + 0.3em + 1.5em + + + + 1.8em + 1em + 0.25em + 0.25em + + + + 0.25em + + + + + + separate + 1em + 1em + fixed + + 100% + + + + solid + 0.5pt + before + 0.5em + 0.5em + 0.3em + 0.3em + start + + + + solid + 1pt + before + bold + 0.5em + 0.5em + 0.3em + 0.3em + center + + + + + + + before + + + center + + + after + + + + + + + + start + + + center + + + end + + + + + + 0.5em + 0.5em + + + + sans-serif + 0.8em + bold + always + 2.5em + 0em + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/db_pdf.xsl erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_pdf.xsl --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/db_pdf.xsl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/db_pdf.xsl 2009-11-20 13:35:37.000000000 +0000 @@ -0,0 +1,1129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | + : + + + + + + + : + + | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + User's Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reference Manual + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + () + + + () + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + / + + + + + + + + + + + + + + + + + + + + + +     + User's Guide + + + + + + + + + + + + + + + + + + + .   + + .   + + + + + + + + + + + + + + + + ..  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Note: + + + + + + + + + + + + + Warning: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Code listing .:  + + + + + + + + + + + + + + + + + + + Code listing .:  + + + + + + + + + + + + + + + + + + + + +     + Reference Manual + + + + + + + + + + + + + + + + + + + + + + + + + + + Erlang module + + + + + + + + + + + + + + + + + + + + + Command + + + + + + + + + + + + + + + + + + + + + C Library + + + + + + + + + + + + + + + + + + + + + Name + + + + + + + + + + + + + + + + + + + + + Application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Exports + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Types: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Table + .: +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Figure + .: +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/Makefile erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/Makefile --- erlang-13.b.1-dfsg/lib/erl_docgen/priv/xsl/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/priv/xsl/Makefile 2009-11-20 13:35:39.000000000 +0000 @@ -0,0 +1,80 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../vsn.mk +VSN=$(ERL_DOCGEN_VSN) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/erl_docgen-$(VSN) + + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + + +XSL_FILES = \ + db_pdf.xsl \ + db_pdf_params.xsl \ + db_html.xsl \ + db_html_params.xsl \ + db_man.xsl + + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +debug opt: + +docs: + +clean: + $(RM) $(TARGET_FILES) + + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + + +release_spec: opt + $(INSTALL_DIR) $(RELSYSDIR)/priv/xsl + $(INSTALL_DATA) $(XSL_FILES) $(RELSYSDIR)/priv/xsl + + +release_docs_spec: + + +release_tests_spec: + + diff -Nru erlang-13.b.1-dfsg/lib/erl_docgen/vsn.mk erlang-13.b.3-dfsg/lib/erl_docgen/vsn.mk --- erlang-13.b.1-dfsg/lib/erl_docgen/vsn.mk 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_docgen/vsn.mk 2009-11-20 13:35:41.000000000 +0000 @@ -0,0 +1,22 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +ERL_DOCGEN_VSN = 0.1 + +TICKETS = diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/aclocal.m4 erlang-13.b.3-dfsg/lib/erl_interface/aclocal.m4 --- erlang-13.b.1-dfsg/lib/erl_interface/aclocal.m4 2009-04-16 10:23:54.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_interface/aclocal.m4 2009-09-18 15:07:59.000000000 +0100 @@ -647,9 +647,16 @@ AC_CHECK_FUNC(pthread_spin_lock, \ AC_DEFINE(ETHR_HAVE_PTHREAD_SPIN_LOCK, 1, \ [Define if you have the pthread_spin_lock function.])) - AC_CHECK_FUNC(pthread_rwlock_init, \ - AC_DEFINE(ETHR_HAVE_PTHREAD_RWLOCK_INIT, 1, \ -[Define if you have the pthread_rwlock_init function.])) + case $host_os in + linux*) # Writers may get starved + # TODO: write a test that tests the implementation + ;; + *) + AC_CHECK_FUNC(pthread_rwlock_init, \ + AC_DEFINE(ETHR_HAVE_PTHREAD_RWLOCK_INIT, 1, \ +[Define if you have a pthread_rwlock implementation that can be used.])) + ;; + esac AC_CHECK_FUNC(pthread_attr_setguardsize, \ AC_DEFINE(ETHR_HAVE_PTHREAD_ATTR_SETGUARDSIZE, 1, \ [Define if you have the pthread_attr_setguardsize function.])) diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/book.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/book.xml 2009-03-12 12:19:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/book.xml 2009-11-20 13:30:45.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19982009 @@ -35,13 +35,14 @@ - + - - - + + + + diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ei_connect.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ei_connect.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ei_connect.xml 2009-03-12 12:20:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ei_connect.xml 2009-11-20 13:31:28.000000000 +0000 @@ -84,7 +84,7 @@

    These function initializes the structure, to identify the node name and cookie of the server. One of them has to be called before other functions that works on the - type or a file descriptor accociated with a + type or a file descriptor associated with a connection to another node are used.

    is a structure containing information about the C-node. It is used in other functions for @@ -115,15 +115,15 @@

    If is or , then to]]> and from]]> contain the pids of the - sender and receipient of the link or unlink.

    + sender and recipient of the link or unlink.

    If is , then this indicates that - a link has been broken. In this case,\011to]]> and + a link has been broken. In this case, to]]> and from]]> contain the pids of the linked processes.

    The return value is the same as for , see above.

    @@ -346,7 +346,7 @@ intei_send_encoded(int fd, erlang_pid* to, char* buf, int len) Obsolete function to send a message -

    Works exactly as ei_send, the alternative name reained for +

    Works exactly as ei_send, the alternative name retained for backward compatibility. The function will not be removed without notice.

    @@ -401,18 +401,18 @@ examples in the same application.

    The function works as with one exception. Instead of taking the as a first - argument, it takes a secod argument, an + argument, it takes a second argument, an which should be the process identifier of the sending process (in the erlang distribution protocol).

    A suitable can be constructed from the structure by the following example code:

    num = fd; + ei_cnode ec; + erlang_pid *self; + int fd; /* the connection fd */ + ... + self = ei_self(&ec); + self->num = fd; ]]> @@ -485,7 +485,7 @@ ei_x_encode_empty_list(&args); if (ei_rpc(&ec, fd, "erlang", "is_process_alive", -\011 args.buff, args.index, &result) < 0) + args.buff, args.index, &result) < 0) handle_error(); if (ei_decode_version(result.buff, &index) < 0 @@ -616,7 +616,7 @@ struct hostent*ei_gethostbyaddr_r(const char *addr, int length, int type, struct hostent *hostp, char *buffer, int buflen, int *h_errnop) Name lookup functions -

    These are convinience functions for some common name lookup functions.

    +

    These are convenience functions for some common name lookup functions.

    diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ei_users_guide.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ei_users_guide.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ei_users_guide.xml 2009-03-12 12:20:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ei_users_guide.xml 2009-11-20 13:31:35.000000000 +0000 @@ -29,7 +29,7 @@ - ei_users_guide.sgml + ei_users_guide.xml

    The Erl_Interface library contains functions. which help you integrate programs written in C and Erlang. The functions in @@ -189,10 +189,8 @@ long allocated, freed; erl_eterm_statistics(&allocated,&freed); -printf("currently allocated blocks: %ld\ -",allocated); -printf("length of freelist: %ld\ -",freed); +printf("currently allocated blocks: %ld\n",allocated); +printf("length of freelist: %ld\n",freed); /* really free the freelist */ erl_eterm_release(); @@ -235,8 +233,7 @@ fprintf(stderr, "Yes, they matched: Age = "); ep = erl_var_content(pattern, "Age"); erl_print_term(stderr, ep); - fprintf(stderr,"\ -"); + fprintf(stderr,"\n"); erl_free_term(ep); } erl_free_term(pattern); @@ -371,7 +368,6 @@ erl_free_term(answer); erl_free_term(emsg.msg); erl_free_term(emsg.to); -} } ]]>

    In order to provide robustness, a distributed Erlang node occasionally polls all its connected neighbours in an attempt to @@ -405,13 +401,11 @@ ETERM *reply,*ep; ep = erl_format("[~a,[]]", modname); if (!(reply = erl_rpc(fd, "c", "c", ep))) - erl_err_msg(" when compiling file: %s.erl !\ -", modname); + erl_err_msg(" when compiling file: %s.erl !\n", modname); erl_free_term(ep); ep = erl_format("{ok,_}"); if (!erl_match(ep, reply)) - erl_err_msg(" compiler errors !\ -"); + erl_err_msg(" compiler errors !\n"); erl_free_term(ep); erl_free_term(reply); ]]>

    is called to compile the specified module on the @@ -443,8 +437,7 @@ if (names) for (i=0; i

    allocates and returns a buffer containing @@ -584,7 +577,7 @@

    Note that if you restore to a non-empty registry, objects in the table will overwrite objects in the registry with the same keys. Also, the entire contents of the registry is marked as unmodified - after the restore, including any modified obects that were not + after the restore, including any modified objects that were not overwritten by the restore operation. This may not be your intention.

    @@ -608,7 +601,7 @@ runtime error will occur that will likely cause the C-node to crash.

    You are free to modify the contents of an object retrieved this way. However when you do so, the registry will not be aware of the changes - you make, possibily causing it to be missed the next time you make a + you make, possibly causing it to be missed the next time you make a Mnesia backup of the registry contents. This can be avoided if you mark the object as dirty after any such changes with , or pass appropriate flags to diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ei.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ei.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ei.xml 2009-03-12 12:20:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ei.xml 2009-11-20 13:31:20.000000000 +0000 @@ -71,7 +71,7 @@ is the way in to "preflight" term encoding.

    There are also encode-functions that uses a dynamic buffer. It is often more convenient to use these to encode data. All encode - funcions comes in two versions: those starting with , + functions comes in two versions: those starting with , uses a dynamic buffer.

    All functions return if successful, and if not. (For instance, if a term is not of the expected type, or diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/erl_call.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/erl_call.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/erl_call.xml 2009-03-12 12:18:45.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/erl_call.xml 2009-11-20 13:29:52.000000000 +0000 @@ -114,7 +114,7 @@ is started with , which means that fully qualified long node names are used. If the option is given, an Erlang node will (if necessary) - be started with .\011

    + be started with .

    -q @@ -141,8 +141,8 @@ -sname Node

    (one of is required): is the name of the node to - be started or communicated with. It is assumed that is started with which means that short node names are used.\011 - If option is given, an Erlang node will be started (if necessary) with .\011

    + be started or communicated with. It is assumed that is started with which means that short node names are used. + If option is given, an Erlang node will be started (if necessary) with .

    -v @@ -177,7 +177,7 @@ -

    Evaluates a couple of expressions. The input ends with EOF (Control-D).

    +

    Evaluates a couple of expressions. The input ends with EOF (Control-D).

    -

    Compiles a module and runs it. Again, the input ends with EOF (Control-D). (In the example shown, the output has been formatted afterwards).

    +

    Compiles a module and runs it. Again, the input ends with EOF (Control-D). (In the example shown, the output has been formatted afterwards).

    when initializing !"); ]]>

    Example 2:

    @@ -258,7 +258,7 @@

    If contains one of or , then to]]> and from]]> - contain the pids of the sender and receipient of the link or unlink. + contain the pids of the sender and recipient of the link or unlink. msg]]> is not used in these cases.

    If contains , then this @@ -538,7 +538,7 @@ const char *name; const char *addr; - int lenght; + int length; int type; struct hostent *hostp; char *buffer; @@ -546,7 +546,7 @@ int *h_errnop; -

    These are convinience functions for some common name lookup functions.

    +

    These are convenience functions for some common name lookup functions.

    diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/erl_eterm.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/erl_eterm.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/erl_eterm.xml 2009-03-12 12:18:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/erl_eterm.xml 2009-11-20 13:29:52.000000000 +0000 @@ -233,11 +233,11 @@ iolist ::= [] | Binary | [iohead | iolist] -\011; + ; iohead ::= Binary | Byte (integer in the range [0..255]) -\011| iolist -\011; + | iolist + ; ]]> @@ -321,7 +321,7 @@

    This function produces an Erlang binary object from a buffer containing a sequence of bytes.

    -

    is a pointer to a buffer containg data to be converted.

    +

    is a pointer to a buffer containing data to be converted.

    indicates the length of .

    The function returns an Erlang binary object.

    retrieves a pointer to @@ -425,7 +425,7 @@

    The function returns an Erlang pid object.

    , , and - can be used to retrieve\011the four values used to create the pid.

    + can be used to retrieve the four values used to create the pid.

    @@ -442,7 +442,7 @@

    and are arbitrary numbers. Note though, that these are limited in precision, so only the low 18 and 2 bits of these numbers - are actually used.\011

    + are actually used.

    The function returns an Erlang port object.

    , and can be used to retrieve the three diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/erl_interface.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/erl_interface.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/erl_interface.xml 2009-03-12 12:18:45.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/erl_interface.xml 2009-11-20 13:29:52.000000000 +0000 @@ -590,7 +590,7 @@

    Note that if you restore to a non-empty registry, objects in the table will overwrite objects in the registry with the same keys. Also, the entire contents of the registry is marked as unmodified - after the restore, including any modified obects that were not + after the restore, including any modified objects that were not overwritten by the restore operation. This may not be your intention.

    @@ -614,7 +614,7 @@ runtime error will occur that will likely cause the C-node to crash.

    You are free to modify the contents of an object retrieved this way. However when you do so, the registry will not be aware of the changes - you make, possibily causing it to be missed the next time you make a + you make, possibly causing it to be missed the next time you make a Mnesia backup of the registry contents. This can be avoided if you mark the object as dirty after any such changes with , or pass appropriate flags to diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/Makefile erlang-13.b.3-dfsg/lib/erl_interface/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/Makefile 2009-03-12 12:19:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/Makefile 2009-11-20 13:30:46.000000000 +0000 @@ -24,17 +24,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(EI_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=erl_interface # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/erl_interface-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -53,55 +48,36 @@ registry.xml BOOK_FILES = book.xml -XML_APPLICATION_FILES = ref_man.xml ref_man_ei.xml ref_man_erl_interface.xml +XML_APPLICATION_FILES = ref_man.xml +#ref_man_ei.xml ref_man_erl_interface.xml XML_PART_FILES = \ - part_ei.xml \ + part.xml \ part_notes.xml \ part_notes_history.xml XML_CHAPTER_FILES = ei_users_guide.xml notes.xml notes_history.xml -GIF_FILES = \ - note.gif \ - warning.gif - +XML_FILES = $(XML_REF1_FILES) $(XML_REF3_FILES) $(BOOK_FILES) \ + $(XML_APPLICATION_FILES) $(XML_PART_FILES) $(XML_CHAPTER_FILES) # ---------------------------------------------------- HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF1_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) + +GIF_FILES = MAN1_FILES = $(XML_REF1_FILES:%.xml=$(MAN1DIR)/%.1) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF1_FILES:%.xml=%.tex) \ - $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PDF_FILE = erl_interface-$(VSN).pdf -TOP_PS_FILE = erl_interface-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets @@ -109,21 +85,13 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN1_FILES) $(MAN3_FILES) @@ -132,37 +100,30 @@ debug opt: clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN1_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) min_head.gif + rm -rf $(HTMLDIR)/* + rm -f $(MAN1DIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man1 $(INSTALL_DATA) $(MAN1_FILES) $(RELEASE_PATH)/man/man1 $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/notes_history.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/notes_history.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/notes_history.xml 2009-03-12 12:21:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/notes_history.xml 2009-11-20 13:32:22.000000000 +0000 @@ -184,7 +184,7 @@

    The TCB of VxWorks processes no longer grows when - is accessed. On Pthreads plattforms + is accessed. On Pthreads platforms the use of no longer crashes programs using multithreading.

    Own Id: OTP-3820

    diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/notes.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/notes.xml 2009-06-05 13:53:36.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/notes.xml 2009-11-20 13:31:57.000000000 +0000 @@ -26,9 +26,116 @@ nil nil nil + notes.xml

    This document describes the changes made to the Erl_interface application.

    +
    Erl_Interface 3.6.4 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    + +
    Erl_Interface 3.6.3 + +
    Fixed Bugs and Malfunctions + + +

    + The manual states that erl_receive() return the reason in + the ErlMessage struct. This was not the case and + the function is now corrected.

    +

    + *** POTENTIAL INCOMPATIBILITY ***

    +

    + Own Id: OTP-4969

    +
    + +

    + In send_exit.c an errorneous size of memory + allocation could occur when reallocating a buffer.

    +

    + In ei_decode_trace.c the index could be updated + when the decoding failed.

    +

    + In ei_printterm.c the index could be updated when + the decoding failed in lists and tuples.

    +

    + In ei_decode_term.c when decoding a double + (ERL_FLOAT_EXT) no check was done to ensure that the last + of the 31 bytes was null terminated.

    +

    + In ei_decode_term.c when decoding references, only + the first 3 bytes are read, but the index did not + increment by the total size.

    +

    + In ei_decode_fun.c no check of correct buffer + allocation or data length was done.

    +

    + In ei_decode_string.c the integer list string case + did not decode the NIL tail correctly.

    +

    + These errors has now been fixed. (Thanks to Romain + Lenglet, Paul Mineiro and Paul Guyot).

    +

    + Own Id: OTP-6117

    +
    + +

    + ei_decode_big could be decoded with a garbage + byte.

    +

    + ei_encode_big and ei_x_encode_big is now + available.

    +

    + Own Id: OTP-7554

    +
    + +

    + The function erl_init_resolve() did not conform to + C99 standard which caused a build error on some + platforms. This has now been fixed.

    +

    + Own Id: OTP-8093

    +
    + +

    + Makefile.in has been updated to use the LDFLAGS + environment variable (if set). (Thanks to Davide + Pesavento.)

    +

    + Own Id: OTP-8157

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + Added support for 64-bit integers in encoding/decoding.

    +

    + Added support for better printouts of binaries.

    +

    + Own Id: OTP-6091

    +
    +
    +
    + +
    +
    Erl_Interface 3.6.2
    Fixed Bugs and Malfunctions @@ -94,7 +201,7 @@

    - Nodes belonging to different independant clusters can now + Nodes belonging to different independent clusters can now co-exist on the same host with the help of a new environment variable setting ERL_EPMD_PORT.

    @@ -157,7 +264,7 @@

    - An errornous freeing of memory could occur when using + An erroneous freeing of memory could occur when using ei_x_format_wo_ver in erl_interface, resulting in a segmentation fault.

    @@ -261,7 +368,7 @@ Improvements and New Features -

    Portability enchancements.

    +

    Portability enhancements.

    Own Id: OTP-6132

    diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/part_ei.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/part_ei.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/part_ei.xml 2009-03-12 12:20:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/part_ei.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,33 +0,0 @@ - - - - -
    - - 20022009 - Ericsson AB. All Rights Reserved. - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - - - EI User's Guide - Gordon Beaton - - 1998-11-30 - 1.2 - part_ei.sgml -
    - -
    - diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/part_erl_interface.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/part_erl_interface.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/part_erl_interface.xml 2009-03-12 12:18:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/part_erl_interface.xml 2009-11-20 13:29:55.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19962009 @@ -28,6 +28,6 @@ 1.2 part_erl_interface.sgml
    - +
    diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/part_notes_history.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/part_notes_history.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/part_notes_history.xml 2009-03-12 12:21:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/part_notes_history.xml 2009-11-20 13:32:22.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20062009 @@ -31,6 +31,6 @@

    Erl_Interface is a C interface library for communication with Erlang.

    - + diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/part_notes.xml 2009-03-12 12:21:12.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/part_notes.xml 2009-11-20 13:31:59.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20042009 @@ -33,6 +33,6 @@

    For information about older versions, see Release Notes History.

    - + diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/part.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/part.xml 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/part.xml 2009-11-20 13:31:35.000000000 +0000 @@ -0,0 +1,33 @@ + + + + +
    + + 20022009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + EI User's Guide + Gordon Beaton + + 1998-11-30 + 1.2 + part.xml +
    + +
    + diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ref_man_ei.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ref_man_ei.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ref_man_ei.xml 2009-03-12 12:20:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ref_man_ei.xml 2009-11-20 13:31:35.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20022009 @@ -26,7 +26,7 @@ 1998-11-30 1.2 - application_ei.sgml + ref_man_ei.xml

    The library is a interface library for @@ -40,8 +40,8 @@ releases.

    - - - + + +
    diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ref_man_erl_interface.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ref_man_erl_interface.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ref_man_erl_interface.xml 2009-03-12 12:18:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ref_man_erl_interface.xml 2009-11-20 13:29:54.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19962009 @@ -26,27 +26,27 @@ 1998-11-30 1.2 - application_erl_interface.sgml + ref_man_erl_interface.xml
    -

    The library is a interface library - for communication with .

    +

    The erl_interface library is a C interface library + for communication with Erlang.

    -

    By default, the library is only guaranteed +

    By default, the erl_interface library is only guaranteed to be compatible with other Erlang/OTP components from the same - release as the library. See the documentation + release as the erl_interface library. See the documentation of the erl_set_compat_rel() function on how to communicate with Erlang/OTP components from earlier releases.

    - - - - - - - + + + + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/ref_man.xml 2009-03-12 12:19:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/ref_man.xml 2009-11-20 13:30:45.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19982009 @@ -20,16 +20,36 @@ under the License. - Erl_Interface Command Reference Gordon Beaton 1998-11.30 1.2 - application.sgml + ref_man.xml
    +

    The ei and erl_interface are C interface libraries for + communication with Erlang.

    + +

    By default, the ei and erl_interface libraries are only guaranteed + to be compatible with other Erlang/OTP components from the same + release as the libraries themself. See the documentation of the + ei_set_compat_rel() and + erl_set_compat_rel() + functions on how to communicate with Erlang/OTP components from earlier + releases.

    +
    - + + + + + + + + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/doc/src/registry.xml erlang-13.b.3-dfsg/lib/erl_interface/doc/src/registry.xml --- erlang-13.b.1-dfsg/lib/erl_interface/doc/src/registry.xml 2009-03-12 12:19:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/doc/src/registry.xml 2009-11-20 13:30:37.000000000 +0000 @@ -31,7 +31,7 @@ A registry.sgml
    - Registry + registry Store and backup key-value pairs

    This module provides support for storing key-value diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/include/ei.h erlang-13.b.3-dfsg/lib/erl_interface/include/ei.h --- erlang-13.b.1-dfsg/lib/erl_interface/include/ei.h 2009-03-12 12:19:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/include/ei.h 2009-09-18 15:07:52.000000000 +0100 @@ -238,10 +238,11 @@ char* free_vars; } erlang_fun; +/* a big */ typedef struct { - unsigned arity; - int is_neg; - void *digits; + unsigned int arity; + int is_neg; + void *digits; } erlang_big; typedef struct { @@ -766,11 +767,13 @@ /* FIXME: is this really the best way to handle bignums? */ +int ei_encode_big(char *buf, int *index, erlang_big* big); +int ei_x_encode_big(ei_x_buff* x, erlang_big* big); int ei_decode_big(const char *buf, int *index, erlang_big* p); int ei_big_comp(erlang_big *x, erlang_big *y); int ei_big_to_double(erlang_big *b, double *resp); int ei_small_to_big(int s, erlang_big *b); -erlang_big *ei_alloc_big(int arity); +erlang_big *ei_alloc_big(unsigned int arity); void ei_free_big(erlang_big *b); #endif /* USE_EI_UNDOCUMENTED */ diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/include/erl_interface.h erlang-13.b.3-dfsg/lib/erl_interface/include/erl_interface.h --- erlang-13.b.1-dfsg/lib/erl_interface/include/erl_interface.h 2009-06-05 13:52:59.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_interface/include/erl_interface.h 2009-09-18 15:07:11.000000000 +0100 @@ -53,25 +53,29 @@ #define ERL_U_SMALL_BIG 14 #define ERL_FUNCTION (15 | ERL_COMPOUND) #define ERL_BIG 16 +#define ERL_LONGLONG 17 +#define ERL_U_LONGLONG 18 #define ERL_TYPE(x) (ERL_HEADER(x)->type) /* FIXME some macros left in erl_eterm.h should probably be documented */ -#define ERL_IS_INTEGER(x) (ERL_TYPE(x) == ERL_INTEGER) +#define ERL_IS_INTEGER(x) (ERL_TYPE(x) == ERL_INTEGER) #define ERL_IS_UNSIGNED_INTEGER(x) (ERL_TYPE(x) == ERL_U_INTEGER) -#define ERL_IS_FLOAT(x) (ERL_TYPE(x) == ERL_FLOAT) -#define ERL_IS_ATOM(x) (ERL_TYPE(x) == ERL_ATOM) -#define ERL_IS_PID(x) (ERL_TYPE(x) == ERL_PID) -#define ERL_IS_PORT(x) (ERL_TYPE(x) == ERL_PORT) -#define ERL_IS_REF(x) (ERL_TYPE(x) == ERL_REF) -#define ERL_IS_TUPLE(x) (ERL_TYPE(x) == ERL_TUPLE) -#define ERL_IS_BINARY(x) (ERL_TYPE(x) == ERL_BINARY) -#define ERL_IS_NIL(x) (ERL_TYPE(x) == ERL_NIL) -#define ERL_IS_EMPTY_LIST(x) ERL_IS_NIL(x) -#define ERL_IS_CONS(x) (ERL_TYPE(x) == ERL_CONS) -#define ERL_IS_LIST(x) (ERL_IS_CONS(x) || ERL_IS_EMPTY_LIST(x)) +#define ERL_IS_LONGLONG(x) (ERL_TYPE(x) == ERL_LONGLONG) +#define ERL_IS_UNSIGNED_LONGLONG(x) (ERL_TYPE(x) == ERL_U_LONGLONG) +#define ERL_IS_FLOAT(x) (ERL_TYPE(x) == ERL_FLOAT) +#define ERL_IS_ATOM(x) (ERL_TYPE(x) == ERL_ATOM) +#define ERL_IS_PID(x) (ERL_TYPE(x) == ERL_PID) +#define ERL_IS_PORT(x) (ERL_TYPE(x) == ERL_PORT) +#define ERL_IS_REF(x) (ERL_TYPE(x) == ERL_REF) +#define ERL_IS_TUPLE(x) (ERL_TYPE(x) == ERL_TUPLE) +#define ERL_IS_BINARY(x) (ERL_TYPE(x) == ERL_BINARY) +#define ERL_IS_NIL(x) (ERL_TYPE(x) == ERL_NIL) +#define ERL_IS_EMPTY_LIST(x) ERL_IS_NIL(x) +#define ERL_IS_CONS(x) (ERL_TYPE(x) == ERL_CONS) +#define ERL_IS_LIST(x) (ERL_IS_CONS(x) || ERL_IS_EMPTY_LIST(x)) /* * Macros used for XXXX @@ -84,8 +88,10 @@ * Macros used for retrieving values from Erlang terms. */ -#define ERL_INT_VALUE(x) ((x)->uval.ival.i) +#define ERL_INT_VALUE(x) ((x)->uval.ival.i) #define ERL_INT_UVALUE(x) ((x)->uval.uival.u) +#define ERL_LL_VALUE(x) ((x)->uval.llval.i) +#define ERL_LL_UVALUE(x) ((x)->uval.ullval.u) #define ERL_FLOAT_VALUE(x) ((x)->uval.fval.f) @@ -163,6 +169,16 @@ typedef struct { Erl_Header h; + long long i; +} Erl_LLInteger; + +typedef struct { + Erl_Header h; + unsigned long long u; +} Erl_ULLInteger; + +typedef struct { + Erl_Header h; double f; } Erl_Float; @@ -253,20 +269,22 @@ typedef struct _eterm { union { - Erl_Integer ival; - Erl_Uinteger uival; - Erl_Float fval; - Erl_Atom aval; - Erl_Pid pidval; - Erl_Port portval; - Erl_Ref refval; - Erl_List lval; - Erl_EmptyList nval; - Erl_Tuple tval; - Erl_Binary bval; - Erl_Variable vval; - Erl_Function funcval; - Erl_Big bigval; + Erl_Integer ival; + Erl_Uinteger uival; + Erl_LLInteger llval; + Erl_ULLInteger ullval; + Erl_Float fval; + Erl_Atom aval; + Erl_Pid pidval; + Erl_Port portval; + Erl_Ref refval; + Erl_List lval; + Erl_EmptyList nval; + Erl_Tuple tval; + Erl_Binary bval; + Erl_Variable vval; + Erl_Function funcval; + Erl_Big bigval; } uval; } ETERM; @@ -345,6 +363,7 @@ ETERM *erl_mk_estring(const char*, int); ETERM *erl_mk_float(double); ETERM *erl_mk_int(int); +ETERM *erl_mk_longlong(long long); ETERM *erl_mk_list(ETERM**,int); ETERM *erl_mk_pid(const char*,unsigned int,unsigned int,unsigned char); ETERM *erl_mk_port(const char*,unsigned int,unsigned char); @@ -354,6 +373,7 @@ ETERM *erl_mk_string(const char*); ETERM *erl_mk_tuple(ETERM**,int); ETERM *erl_mk_uint(unsigned int); +ETERM *erl_mk_ulonglong(unsigned long long); ETERM *erl_mk_var(const char*); int erl_print_term(FILE*,const ETERM*); /* int erl_sprint_term(char*,const ETERM*); */ diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/connect/ei_connect.c erlang-13.b.3-dfsg/lib/erl_interface/src/connect/ei_connect.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/connect/ei_connect.c 2009-06-05 13:53:21.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/connect/ei_connect.c 2009-09-18 15:08:15.000000000 +0100 @@ -1156,7 +1156,7 @@ { MD5_CTX c; - char chbuf[20]; + char chbuf[21]; sprintf(chbuf,"%u", challenge); ei_MD5Init(&c); diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/connect/send_exit.c erlang-13.b.3-dfsg/lib/erl_interface/src/connect/send_exit.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/connect/send_exit.c 2009-03-12 12:19:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/connect/send_exit.c 2009-09-18 15:07:53.000000000 +0100 @@ -56,7 +56,7 @@ int len = strlen(reason) + 1080; /* see below */ if (len > EISMALLBUF) - if (!(dbuf = malloc(index))) + if (!(dbuf = malloc(len))) return -1; msgbuf = (dbuf ? dbuf : sbuf); diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/decode/decode_big.c erlang-13.b.3-dfsg/lib/erl_interface/src/decode/decode_big.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/decode/decode_big.c 2009-03-12 12:20:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/decode/decode_big.c 2009-09-18 15:08:34.000000000 +0100 @@ -23,62 +23,62 @@ #include "eiext.h" #include "putget.h" - -int ei_decode_big(const char *buf, int *index, erlang_big *b) -{ - long digit_bytes; - const char *s = buf + *index; - const char *s0 = s; - - switch ( get8(s) ) { - case ERL_SMALL_BIG_EXT: - digit_bytes = get8(s); - break; +int ei_decode_big(const char *buf, int *index, erlang_big *b) { + unsigned int digit_bytes; + const unsigned char *s = (unsigned char*) buf + *index; + const unsigned char *s0 = s; + + switch ( get8(s) ) { + case ERL_SMALL_BIG_EXT: + digit_bytes = get8(s); + break; case ERL_LARGE_BIG_EXT: - digit_bytes = get32be(s); - break; + digit_bytes = get32be(s); + break; default: - return -1; - } - if ( b ) { - unsigned short *dt = b->digits; - int i; - unsigned char *u; - - if ( ((digit_bytes+1)/2) != b->arity ) { - return -1; - } - b->is_neg = get8(s); - u = (unsigned char *) s; - for (i = 0; i < b->arity; ++i) { - dt[i] = u[i*2]; - dt[i] |= ((unsigned short) u[(i*2)+1]) << 8; - } - } else { - s++; /* skip sign byte */ - } + return -1; + } + if ( b ) { + unsigned short *dt = b->digits; + unsigned int n = (digit_bytes+1)/2; + int i; + + if ( digit_bytes != b->arity ) { + return -1; + } + + b->is_neg = get8(s); + + for (i = 0; i < n; ++i) { + dt[i] = s[i*2]; + if ((i*2 + 1) < digit_bytes) { + dt[i] |= ((unsigned short) s[(i*2)+1]) << 8; + } + } + } else { + s++; /* skip sign byte */ + } - s += digit_bytes; + s += digit_bytes; - *index += s-s0; + *index += s-s0; - return 0; + return 0; } - -erlang_big *ei_alloc_big(int arity) -{ +erlang_big *ei_alloc_big(unsigned int digit_bytes) { erlang_big *b; + unsigned int n = (digit_bytes+1)/2; if ( (b = malloc(sizeof(erlang_big))) == NULL) return NULL; memset(b,(char)0,sizeof(erlang_big)); - if ( (b->digits = malloc(arity*2)) == NULL) { + if ( (b->digits = malloc(2*n)) == NULL) { free(b); return 0; } - - b->arity = arity; - memset(b->digits,(char)0,arity*2); + + b->arity = digit_bytes; + memset(b->digits,(char)0, 2*n); return b; } @@ -120,7 +120,7 @@ int ei_big_comp(erlang_big *x, erlang_big *y) { if ( x->is_neg == y->is_neg ) { - int c = I_comp(x->digits,x->arity,y->digits,y->arity); + int c = I_comp(x->digits,(x->arity+1)/2,y->digits,(y->arity+1)/2); if ( x->is_neg ) return -c; else @@ -218,7 +218,7 @@ static int bblength(erlang_big *b) { - unsigned wholebytes = b->arity; + unsigned int wholebytes = (b->arity+1)/2; digit_t *dp = b->digits; while(wholebytes > 0 && dp[--wholebytes] == 0U) @@ -288,7 +288,7 @@ double d_base = 1.0; digit_t* s = (digit_t *)b->digits; - dsize_t xl = b->arity; + dsize_t xl = (b->arity + 1)/2; short xsgn = b->is_neg; ERTS_SAVE_FP_EXCEPTION(); @@ -318,8 +318,9 @@ int ei_small_to_big(int s, erlang_big *b) { digit_t *d; + unsigned int n = (b->arity+1)/2; - if ( b->arity < 2 ) return -1; + if ( n < 2 ) return -1; b->is_neg = ( s < 0 ); d = (digit_t *)b->digits; diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/decode/decode_fun.c erlang-13.b.3-dfsg/lib/erl_interface/src/decode/decode_fun.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/decode/decode_fun.c 2009-03-12 12:20:20.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/decode/decode_fun.c 2009-09-18 15:08:28.000000000 +0100 @@ -59,7 +59,8 @@ if (p != NULL) { p->n_free_vars = n; p->free_var_len = ix - ix0; - p->free_vars = ei_malloc(ix - ix0); /* FIXME check result */ + p->free_vars = ei_malloc(ix - ix0); + if (!(p->free_vars)) return -1; memcpy(p->free_vars, s + ix0, ix - ix0); } s += ix; @@ -97,13 +98,16 @@ /* finally the free vars */ s += ix; n = n - (s - s0) + 1; + if (n < 0) return -1; if (p != NULL) { p->free_var_len = n; if (n > 0) { - p->free_vars = malloc(n); /* FIXME check result */ + p->free_vars = malloc(n); + if (!(p->free_vars)) return -1; memcpy(p->free_vars, s, n); } } + s += n; *index += s-s0; return 0; break; diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/decode/decode_string.c erlang-13.b.3-dfsg/lib/erl_interface/src/decode/decode_string.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/decode/decode_string.c 2009-03-12 12:19:21.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/decode/decode_string.c 2009-09-18 15:07:51.000000000 +0100 @@ -66,6 +66,8 @@ s++; } } + /* Check NIL tail */ + if ((etype = get8(s)) != ERL_NIL_EXT) return -1; break; case ERL_NIL_EXT: diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/decode/decode_trace.c erlang-13.b.3-dfsg/lib/erl_interface/src/decode/decode_trace.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/decode/decode_trace.c 2009-03-12 12:19:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/decode/decode_trace.c 2009-09-18 15:07:53.000000000 +0100 @@ -22,17 +22,22 @@ int ei_decode_trace(const char *buf, int *index, erlang_trace *p) { int arity = 0; + int tindex = *index; + /* use a temporary index if any function should fail */ + /* { Flags, Label, Serial, FromPid, Prev } */ - if (ei_decode_tuple_header(buf,index,&arity) + if (ei_decode_tuple_header(buf, &tindex, &arity) || (arity != 5) - || ei_decode_long(buf,index,&p->flags) - || ei_decode_long(buf,index,&p->label) - || ei_decode_long(buf,index,&p->serial) - || ei_decode_pid(buf,index,&p->from) - || ei_decode_long(buf,index,&p->prev)) return -1; + || ei_decode_long(buf, &tindex, &p->flags) + || ei_decode_long(buf, &tindex, &p->label) + || ei_decode_long(buf, &tindex, &p->serial) + || ei_decode_pid( buf, &tindex, &p->from) + || ei_decode_long(buf, &tindex, &p->prev)) return -1; /* index is updated by the functions we called */ + *index = tindex; + return 0; } diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/encode/encode_big.c erlang-13.b.3-dfsg/lib/erl_interface/src/encode/encode_big.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/encode/encode_big.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/encode/encode_big.c 2009-09-18 15:10:18.000000000 +0100 @@ -0,0 +1,84 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +#include +#include "eidef.h" +#include "eiext.h" +#include "putget.h" +#include "ei_x_encode.h" + +int ei_encode_big(char *buf, int *index, erlang_big* big) { + unsigned char *s = (unsigned char *)buf + *index; + unsigned char *s0 = s; + unsigned int digit_bytes = big->arity; + unsigned int n = (digit_bytes+1)/2; + + if (digit_bytes < 256) { + if (buf) { + put8(s, ERL_SMALL_BIG_EXT); + put8(s, digit_bytes); + } else { + s += 2; + } + } else { + if (buf) { + put8(s, ERL_LARGE_BIG_EXT); + put32be(s, digit_bytes); + } else { + s += 5; + } + } + + if (buf) { + int i; + unsigned char hi, lo; + unsigned short *dt = big->digits; + put8(s, big->is_neg); + + for (i = 0; i < n; ++i) { + + hi = (unsigned char) (dt[i] >> 8); + lo = (unsigned char) (dt[i]); + + s[i*2] = lo; + if ((i*2 + 1) < digit_bytes) { + s[i*2 + 1] = hi; + } + } + + } else { + s ++; /* skip sign bit */ + } + + s += digit_bytes; + + *index += s-s0; + + return 0; +} + +int ei_x_encode_big(ei_x_buff* x, erlang_big* big) { + int i = x->index; + + ei_encode_big(NULL, &i, big); + if (!x_fix_buff(x, i)) + return -1; + return ei_encode_big(x->buff, &x->index, big); +} + diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/legacy/erl_connect.c erlang-13.b.3-dfsg/lib/erl_interface/src/legacy/erl_connect.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/legacy/erl_connect.c 2009-06-05 13:52:58.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/legacy/erl_connect.c 2009-09-18 15:07:09.000000000 +0100 @@ -281,6 +281,8 @@ switch (msg.msgtype) { case ERL_SEND: case ERL_REG_SEND: + case ERL_EXIT: + case ERL_EXIT2: if (ei_decode_term(x->buff, &index, &emsg->msg) < 0) r = ERL_ERROR; break; diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/legacy/erl_eterm.c erlang-13.b.3-dfsg/lib/erl_interface/src/legacy/erl_eterm.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/legacy/erl_eterm.c 2009-03-12 12:18:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/legacy/erl_eterm.c 2009-09-18 15:07:10.000000000 +0100 @@ -82,10 +82,21 @@ return ep; } +ETERM *erl_mk_longlong (long long i) +{ + ETERM *ep; + + ep = erl_alloc_eterm(ERL_LONGLONG); + ERL_COUNT(ep) = 1; + ERL_LL_VALUE(ep) = i; + return ep; +} + /* * Create an UNSIGNED INTEGER. Depending on its * value it may end up as a BigNum. */ + ETERM *erl_mk_uint (unsigned int u) { ETERM *ep; @@ -96,6 +107,16 @@ return ep; } +ETERM *erl_mk_ulonglong (unsigned long long i) +{ + ETERM *ep; + + ep = erl_alloc_eterm(ERL_U_LONGLONG); + ERL_COUNT(ep) = 1; + ERL_LL_UVALUE(ep) = i; + return ep; +} + /* * Create a FLOAT. */ @@ -589,8 +610,8 @@ n++; ep = TAIL(ep); } - if (!ERL_IS_EMPTY_LIST(ep)) - return -1; + + if (!ERL_IS_EMPTY_LIST(ep)) return -1; return n; } @@ -945,9 +966,17 @@ putc('}', fp); ch_written++; break; - case ERL_BINARY: - ch_written += fprintf(fp, "#Bin"); - break; + case ERL_BINARY: { + int sz = (ERL_BIN_SIZE(ep) > 20) ? 20 : ERL_BIN_SIZE(ep); + unsigned char *ptr = ERL_BIN_PTR(ep); + ch_written += fprintf(fp, "#Bin<"); + for (i = 0; i < sz; i++) { + putc(ptr[i], fp); ch_written++; + } + if (sz == 20) ch_written += fprintf(fp, "(%d)....>", ERL_BIN_SIZE(ep)-20); + else ch_written += fprintf(fp, ">"); + break; + } case ERL_INTEGER: case ERL_SMALL_BIG: ch_written += fprintf(fp, "%d", ERL_INT_VALUE(ep)); @@ -956,6 +985,10 @@ case ERL_U_SMALL_BIG: ch_written += fprintf(fp, "%d", ERL_INT_UVALUE(ep)); break; + case ERL_LONGLONG: + case ERL_U_LONGLONG: + ch_written += fprintf(fp, "%lld", ERL_LL_UVALUE(ep)); + break; case ERL_FLOAT: ch_written += fprintf(fp, "%f", ERL_FLOAT_VALUE(ep)); break; diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/legacy/erl_format.c erlang-13.b.3-dfsg/lib/erl_interface/src/legacy/erl_format.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/legacy/erl_format.c 2009-03-12 12:18:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/legacy/erl_format.c 2009-09-18 15:07:10.000000000 +0100 @@ -282,6 +282,7 @@ * The format letters are: * w - Any Erlang term * a - An Atom + * b - A Binary * s - A String * i - An Integer * f - A Float (double) @@ -313,6 +314,12 @@ case 'f': v[size] = erl_mk_float(va_arg(*pap, double)); break; + + case 'b': { + char *sarg = va_arg(*pap, char *); + v[size] = erl_mk_binary(sarg, strlen(sarg)); + break; + } default: rc = ERL_FORMAT_ERROR; diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/legacy/erl_marshal.c erlang-13.b.3-dfsg/lib/erl_interface/src/legacy/erl_marshal.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/legacy/erl_marshal.c 2009-06-05 13:52:59.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/legacy/erl_marshal.c 2009-09-18 15:07:11.000000000 +0100 @@ -130,6 +130,24 @@ } } +/* The encoder calls length, if erl_length() should return */ +/* -1 for dotted pairs (why !!!!) we can't use erl_length() */ +/* from the encoder in erl_marshal.c */ + +static int erl_length_x(const ETERM *ep) { + int n = 0; + + if (!ep) return -1; + + while (ERL_TYPE(ep) == ERL_LIST) { + n++; + ep = TAIL(ep); + } + + return n; +} + + /*============================================================== * Marshalling routines. *============================================================== @@ -143,6 +161,8 @@ { int i; unsigned int u; + long long l; + unsigned long long ul; switch(ERL_TYPE(ep)) { @@ -209,11 +229,74 @@ *(*ext)++ = (u >> 8) & 0xff; *(*ext)++ = u & 0xff; return 0; + case ERL_LONGLONG: + l = ep->uval.llval.i; + /* ERL_SMALL_BIG */ + if ((l > ((long long) ERL_MAX)) || + (l < ((long long) ERL_MIN))) { + *(*ext)++ = ERL_SMALL_BIG_EXT; + *(*ext)++ = 8; /* eight bytes */ + if ((*(*ext)++ = ((l>>63) & 0x01))) /* sign byte */ + l = -l; + *(*ext)++ = l & 0xff; /* LSB first */ + *(*ext)++ = (l >> 8) & 0xff; + *(*ext)++ = (l >> 16) & 0xff; + *(*ext)++ = (l >> 24) & 0xff; + *(*ext)++ = (l >> 32) & 0xff; + *(*ext)++ = (l >> 40) & 0xff; + *(*ext)++ = (l >> 48) & 0xff; + *(*ext)++ = (l >> 56) & 0x7f; /* Don't include the sign bit */ + return 0; + } + /* SMALL_INTEGER */ + if ((l < 256) && (l >= 0)) { + *(*ext)++ = ERL_SMALL_INTEGER_EXT; + *(*ext)++ = l & 0xff; + return 0; + } + /* INTEGER */ + *(*ext)++ = ERL_INTEGER_EXT; + *(*ext)++ = (l >> 24) & 0xff; + *(*ext)++ = (l >> 16) & 0xff; + *(*ext)++ = (l >> 8) & 0xff; + *(*ext)++ = l & 0xff; + return 0; + + case ERL_U_LONGLONG: + ul = ep->uval.ullval.u; + /* ERL_U_SMALL_BIG */ + if (ul > ((unsigned long long) ERL_MAX)) { + *(*ext)++ = ERL_SMALL_BIG_EXT; + *(*ext)++ = 8; /* eight bytes */ + *(*ext)++ = 0; /* sign byte */ + *(*ext)++ = ul & 0xff; /* LSB first */ + *(*ext)++ = (ul >> 8) & 0xff; + *(*ext)++ = (ul >> 16) & 0xff; + *(*ext)++ = (ul >> 24) & 0xff; + *(*ext)++ = (ul >> 32) & 0xff; + *(*ext)++ = (ul >> 40) & 0xff; + *(*ext)++ = (ul >> 48) & 0xff; + *(*ext)++ = (ul >> 56) & 0xff; + return 0; + } + /* SMALL_INTEGER */ + if ((ul < 256) && (ul >= 0)) { + *(*ext)++ = ERL_SMALL_INTEGER_EXT; + *(*ext)++ = ul & 0xff; + return 0; + } + /* INTEGER */ + *(*ext)++ = ERL_INTEGER_EXT; + *(*ext)++ = (ul >> 24) & 0xff; + *(*ext)++ = (ul >> 16) & 0xff; + *(*ext)++ = (ul >> 8) & 0xff; + *(*ext)++ = ul & 0xff; + return 0; case ERL_PID: *(*ext)++ = ERL_PID_EXT; /* First poke in node as an atom */ - i = strlen(ERL_PID_NODE(ep)); + i = strlen((char *)ERL_PID_NODE(ep)); *(*ext)++ = ERL_ATOM_EXT; *(*ext)++ = (i >>8) &0xff; *(*ext)++ = i &0xff; @@ -221,14 +304,14 @@ *ext += i; /* And then fill in the integer fields */ i = ERL_PID_NUMBER(ep); - *(*ext)++ = (i >>24) &0xff; - *(*ext)++ = (i >>16) &0xff; - *(*ext)++ = (i >>8) &0xff; + *(*ext)++ = (i >> 24) &0xff; + *(*ext)++ = (i >> 16) &0xff; + *(*ext)++ = (i >> 8) &0xff; *(*ext)++ = i &0xff; i = ERL_PID_SERIAL(ep); - *(*ext)++ = (i >>24) &0xff; - *(*ext)++ = (i >>16) &0xff; - *(*ext)++ = (i >>8) &0xff; + *(*ext)++ = (i >> 24) &0xff; + *(*ext)++ = (i >> 16) &0xff; + *(*ext)++ = (i >> 8) &0xff; *(*ext)++ = i &0xff; *(*ext)++ = ERL_PID_CREATION(ep); return 0; @@ -241,13 +324,13 @@ *(*ext)++ = ERL_NEW_REFERENCE_EXT; - i = strlen(ERL_REF_NODE(ep)); + i = strlen((char *)ERL_REF_NODE(ep)); len = ERL_REF_LEN(ep); - *(*ext)++ = (len >>8) &0xff; + *(*ext)++ = (len >> 8) &0xff; *(*ext)++ = len &0xff; *(*ext)++ = ERL_ATOM_EXT; - *(*ext)++ = (i >>8) &0xff; + *(*ext)++ = (i >> 8) &0xff; *(*ext)++ = i &0xff; memcpy(*ext, ERL_REF_NODE(ep), i); *ext += i; @@ -255,9 +338,9 @@ /* Then the integer fields */ for (j = 0; j < ERL_REF_LEN(ep); j++) { i = ERL_REF_NUMBERS(ep)[j]; - *(*ext)++ = (i >>24) &0xff; - *(*ext)++ = (i >>16) &0xff; - *(*ext)++ = (i >>8) &0xff; + *(*ext)++ = (i >> 24) &0xff; + *(*ext)++ = (i >> 16) &0xff; + *(*ext)++ = (i >> 8) &0xff; *(*ext)++ = i &0xff; } } @@ -265,7 +348,7 @@ case ERL_PORT: *(*ext)++ = ERL_PORT_EXT; /* First poke in node as an atom */ - i = strlen(ERL_PORT_NODE(ep)); + i = strlen((char *)ERL_PORT_NODE(ep)); *(*ext)++ = ERL_ATOM_EXT; *(*ext)++ = (i >>8) &0xff; *(*ext)++ = i &0xff; @@ -273,9 +356,9 @@ *ext += i; /* Then the integer fields */ i = ERL_PORT_NUMBER(ep); - *(*ext)++ = (i >>24) &0xff; - *(*ext)++ = (i >>16) &0xff; - *(*ext)++ = (i >>8) &0xff; + *(*ext)++ = (i >> 24) &0xff; + *(*ext)++ = (i >> 16) &0xff; + *(*ext)++ = (i >> 8) &0xff; *(*ext)++ = i &0xff; *(*ext)++ = ERL_PORT_CREATION(ep); return 0; @@ -294,11 +377,11 @@ } break; } else { /* List. */ - i = erl_length(ep); + i = erl_length_x(ep); *(*ext)++ = ERL_LIST_EXT; - *(*ext)++ = (i >>24) &0xff; - *(*ext)++ = (i >>16) &0xff; - *(*ext)++ = (i >>8) &0xff; + *(*ext)++ = (i >> 24) &0xff; + *(*ext)++ = (i >> 16) &0xff; + *(*ext)++ = (i >> 8) &0xff; *(*ext)++ = i &0xff; while (ERL_TYPE(ep) == ERL_LIST) { if (erl_encode_it(HEAD(ep), ext, dist)) @@ -317,8 +400,8 @@ else { *(*ext)++ = ERL_LARGE_TUPLE_EXT; *(*ext)++ = (i >> 24) & 0xff; - *(*ext)++ = (i >> 16 ) & 0xff; - *(*ext)++ = (i >> 8) & 0xff; + *(*ext)++ = (i >> 16) & 0xff; + *(*ext)++ = (i >> 8) & 0xff; *(*ext)++ = i & 0xff; } for (i=0; iuval.tval.size; i++) @@ -336,7 +419,7 @@ i = ep->uval.bval.size; *(*ext)++ = (i >> 24) & 0xff; *(*ext)++ = (i >> 16) & 0xff; - *(*ext)++ = (i >> 8) & 0xff; + *(*ext)++ = (i >> 8) & 0xff; *(*ext)++ = i & 0xff; memcpy((char *) *ext, (char*) ep->uval.bval.b, i); *ext += i; @@ -369,7 +452,7 @@ i = ERL_CLOSURE_SIZE(ep); *(*ext)++ = (i >> 24) & 0xff; *(*ext)++ = (i >> 16) & 0xff; - *(*ext)++ = (i >> 8) & 0xff; + *(*ext)++ = (i >> 8) & 0xff; *(*ext)++ = i & 0xff; erl_encode_it(ERL_FUN_CREATOR(ep), ext, dist); erl_encode_it(ERL_FUN_MODULE(ep), ext, dist); @@ -426,6 +509,8 @@ int len = 0; int i; unsigned int u; + long long l; + unsigned long long ul; if (ep) { switch (ERL_TYPE(ep)) { @@ -448,14 +533,29 @@ else len = 5; break; + case ERL_LONGLONG: + l = ep->uval.llval.i; + if ((l > ((long long) ERL_MAX)) || + (l < ((long long) ERL_MIN))) len = 11; + else if ((l < 256) && (l >= 0)) len = 2; + else len = 5; + break; + + case ERL_U_LONGLONG: + ul = ep->uval.ullval.u; + if (ul > ((unsigned long long) ERL_MAX)) len = 11; + else if (ul < 256) len = 2; + else len = 5; + break; + case ERL_PID: /* 1 + N + 4 + 4 + 1 where N = 3 + strlen */ - i = strlen(ERL_PID_NODE(ep)); + i = strlen((char *)ERL_PID_NODE(ep)); len = 13 + i; break; case ERL_REF: - i = strlen(ERL_REF_NODE(ep)); + i = strlen((char *)ERL_REF_NODE(ep)); if (dist >= 4 && ERL_REF_LEN(ep) > 1) { len = 1 + 2 + (i+3) + 1 + ERL_REF_LEN(ep) * 4; } else { @@ -466,7 +566,7 @@ case ERL_PORT: /* 1 + N + 4 + 1 where N = 3 + strlen */ - i = strlen(ERL_PORT_NODE(ep)); + i = strlen((char *)ERL_PORT_NODE(ep)); len = 9 + i; break; @@ -627,23 +727,23 @@ *ext += 4; big_cont: sign = *(*ext)++; - if (arity != 4) + if (arity > 8) goto big_truncate; - if ((*ext)[3] & 0x80) { + + if (arity == 8 && ((*ext)[7] & 0x80) && sign) { /* MSB already occupied ! */ - if (sign) - goto big_truncate; - else { - /* It will fit into an unsigned int !! */ - u = (((*ext)[3] << 24)|((*ext)[2])<< 16|((*ext)[1]) << 8 |(**ext)); - ERL_TYPE(ep) = ERL_U_INTEGER; - ep->uval.uival.u = u; - /* *ext += i; */ - *ext += arity; - return ep; - } + goto big_truncate; } - else { + + if (arity == 4 && ((*ext)[3] & 0x80) && !sign) { + /* It will fit into an unsigned int !! */ + u = (((*ext)[3] << 24)|((*ext)[2])<< 16|((*ext)[1]) << 8 |(**ext)); + ERL_TYPE(ep) = ERL_U_INTEGER; + ep->uval.uival.u = u; + /* *ext += i; */ + *ext += arity; + return ep; + } else if (arity == 4 && !((*ext)[3] & 0x80)) { /* It will fit into an int !! * Note: It comes in "one's-complement notation" */ @@ -653,15 +753,45 @@ else i = (int) (((*ext)[3] << 24) | ((*ext)[2])<< 16 | ((*ext)[1]) << 8 | (**ext)); + ERL_TYPE(ep) = ERL_INTEGER; ep->uval.ival.i = i; *ext += arity; return ep; + } else if (arity == 8 && ((*ext)[7] & 0x80) && !sign) { + /* Fits in an unsigned long long */ + int x; + unsigned long long ul = 0LL; + + for(x = 0 ; x < arity ; x++) { + ul |= ((unsigned long long)(*ext)[x]) << ((unsigned long long)(8*x)); + } + + ERL_TYPE(ep) = ERL_U_LONGLONG; + ep->uval.ullval.u = ul; + *ext += arity; + return ep; + } else { + /* Fits in a long long */ + int x; + long long l = 0LL; + + for(x = 0 ; x < arity ; x++) { + l |= ((long long)(*ext)[x]) << ((long long)(8*x)); + } + + if (sign) l = (long long) (~l | (unsigned long long) sign); + + ERL_TYPE(ep) = ERL_LONGLONG; + ep->uval.llval.i = l; + *ext += arity; + return ep; } big_truncate: /* truncate to: (+/-) 1 */ #ifdef DEBUG erl_err_msg(" erl_decode_it: Integer truncated..."); #endif + ERL_TYPE(ep) = ERL_INTEGER; ep->uval.ival.i = sign?-1:1; *ext += arity; return ep; diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/legacy/erl_resolve.c erlang-13.b.3-dfsg/lib/erl_interface/src/legacy/erl_resolve.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/legacy/erl_resolve.c 2009-03-12 12:20:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/legacy/erl_resolve.c 2009-09-18 15:08:44.000000000 +0100 @@ -39,7 +39,7 @@ void erl_init_resolve(void) { - return ei_init_resolve(); + ei_init_resolve(); } diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/Makefile.in erlang-13.b.3-dfsg/lib/erl_interface/src/Makefile.in --- erlang-13.b.1-dfsg/lib/erl_interface/src/Makefile.in 2009-03-12 12:18:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/Makefile.in 2009-09-18 15:07:36.000000000 +0100 @@ -366,6 +366,7 @@ ENCODESRC = \ encode/encode_atom.c \ + encode/encode_big.c \ encode/encode_bignum.c \ encode/encode_binary.c \ encode/encode_boolean.c \ @@ -715,11 +716,11 @@ else ifdef THR_DEFS $(ERL_CALL): $(ERLCALL) ../include/ei.h $(MT_EILIB) - $(PURIFY) $(CC) $(PROG_CFLAGS) $(THR_DEFS) -o $@ $(ERLCALL) \ + $(PURIFY) $(CC) $(PROG_CFLAGS) $(THR_DEFS) $(LDFLAGS) -o $@ $(ERLCALL) \ -L$(OBJDIR) -lei $(THR_LIBS) $(LIBS) else $(ERL_CALL): $(ERLCALL) ../include/ei.h $(ST_EILIB) - $(PURIFY) $(CC) $(PROG_CFLAGS) -o $@ $(ERLCALL) \ + $(PURIFY) $(CC) $(PROG_CFLAGS) $(LDFLAGS) -o $@ $(ERLCALL) \ -L$(OBJDIR) -lei $(LIBS) endif endif diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/misc/ei_decode_term.c erlang-13.b.3-dfsg/lib/erl_interface/src/misc/ei_decode_term.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/misc/ei_decode_term.c 2009-03-12 12:20:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/misc/ei_decode_term.c 2009-09-18 15:08:27.000000000 +0100 @@ -46,6 +46,7 @@ term->value.i_val = get32be(s); break; case ERL_FLOAT_EXT: + if (s[30]) return -1; if (sscanf(s, "%lf", &f) != 1) return -1; s += 31; term->value.d_val = f; @@ -83,6 +84,9 @@ for (i = 0; (ivalue.ref.len) && (i<3); i++) { term->value.ref.n[i] = get32be(s); } + if (term->value.ref.len > 3) { + s += 4 * (term->value.ref.len - 3); + } break; case ERL_PORT_EXT: if (get8(s) != ERL_ATOM_EXT) return -1; diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/misc/ei_printterm.c erlang-13.b.3-dfsg/lib/erl_interface/src/misc/ei_printterm.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/misc/ei_printterm.c 2009-03-12 12:20:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/misc/ei_printterm.c 2009-09-18 15:08:26.000000000 +0100 @@ -114,7 +114,7 @@ static int print_term(FILE* fp, ei_x_buff* x, const char* buf, int* index) { - int i, doquote, n, m, ty; + int i, doquote, n, m, ty, r; char a[MAXATOMLEN+1], *p; int ch_written = 0; /* counter of written chars */ erlang_pid pid; @@ -122,7 +122,10 @@ erlang_ref ref; double d; long l; - //unsigned long u; + + int tindex = *index; + + /* use temporary index for multiple (and failable) decodes */ if (fp == NULL && x == NULL) return -1; @@ -169,22 +172,27 @@ ch_written += xprintf(fp, x, "[]"); break; case ERL_LIST_EXT: - if (ei_decode_list_header(buf, index, &n) < 0) goto err; + if (ei_decode_list_header(buf, &tindex, &n) < 0) goto err; xputc('[', fp, x); ch_written++; for (i = 0; i < n; ++i) { - ch_written += print_term(fp, x, buf, index); + r = print_term(fp, x, buf, &tindex); + if (r < 0) goto err; + ch_written += r; if (i < n - 1) { xputs(", ", fp, x); ch_written += 2; } } - if (ei_get_type_internal(buf, index, &ty, &n) < 0) goto err; + if (ei_get_type_internal(buf, &tindex, &ty, &n) < 0) goto err; if (ty != ERL_NIL_EXT) { xputs(" | ", fp, x); ch_written += 3; - ch_written += print_term(fp, x, buf, index); + r = print_term(fp, x, buf, &tindex); + if (r < 0) goto err; + ch_written += r; } else { - if (ei_decode_list_header(buf, index, &n) < 0) goto err; + if (ei_decode_list_header(buf, &tindex, &n) < 0) goto err; } xputc(']', fp, x); ch_written++; + *index = tindex; break; case ERL_STRING_EXT: p = ei_malloc(n+1); @@ -198,14 +206,18 @@ break; case ERL_SMALL_TUPLE_EXT: case ERL_LARGE_TUPLE_EXT: - if (ei_decode_tuple_header(buf, index, &n) < 0) goto err; + if (ei_decode_tuple_header(buf, &tindex, &n) < 0) goto err; xputc('{', fp, x); ch_written++; + for (i = 0; i < n; ++i) { - ch_written += print_term(fp, x, buf, index); + r = print_term(fp, x, buf, &tindex); + if (r < 0) goto err; + ch_written += r; if (i < n-1) { xputs(", ", fp, x); ch_written += 2; } } + *index = tindex; xputc('}', fp, x); ch_written++; break; case ERL_BINARY_EXT: diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/src/misc/get_type.c erlang-13.b.3-dfsg/lib/erl_interface/src/misc/get_type.c --- erlang-13.b.1-dfsg/lib/erl_interface/src/misc/get_type.c 2009-03-12 12:19:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/erl_interface/src/misc/get_type.c 2009-09-18 15:07:52.000000000 +0100 @@ -130,11 +130,11 @@ break; case ERL_SMALL_BIG_EXT: - *len = (get8(s)+1)/2; /* big arity */ + *len = get8(s); /* #digit_bytes */ break; case ERL_LARGE_BIG_EXT: - *len = (get32be(s)+1)/2; /* big arity */ + *len = get32be(s); /* #digit_bytes */ break; default: diff -Nru erlang-13.b.1-dfsg/lib/erl_interface/vsn.mk erlang-13.b.3-dfsg/lib/erl_interface/vsn.mk --- erlang-13.b.1-dfsg/lib/erl_interface/vsn.mk 2009-06-05 13:53:15.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/erl_interface/vsn.mk 2009-11-20 13:30:48.000000000 +0000 @@ -1 +1 @@ -EI_VSN = 3.6.2 +EI_VSN = 3.6.4 diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/book.xml erlang-13.b.3-dfsg/lib/et/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/et/doc/src/book.xml 2009-03-13 11:11:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/book.xml 2009-11-20 13:37:21.000000000 +0000 @@ -1,7 +1,7 @@ - +

    20022009 @@ -34,11 +34,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/et_architecture.xml erlang-13.b.3-dfsg/lib/et/doc/src/et_architecture.xml --- erlang-13.b.1-dfsg/lib/et/doc/src/et_architecture.xml 2009-03-13 11:11:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/et_architecture.xml 2009-11-20 13:37:21.000000000 +0000 @@ -29,6 +29,7 @@ %VSN% + et_architecture.xml
    @@ -90,14 +91,14 @@ show how it looks like in the graphical interface of et_viewer:

    - + A simulated Mnesia transaction which writes one record

    In the sequence chart, the actors (which symbolically has performed the traced event) are shown as named vertical bars. The order of the actors may be altered by dragging (hold mouse button 1 pressed during the operation) the name tag of an actor and drop it elsewhere:

    - + Two actors has switched places

    An event may be an action performed by one single actor (blue @@ -106,7 +107,7 @@ an event can be shown by clicking (press and release the mouse button 1) on the event label text or on the arrow:

    - + Details of a write lock message
    @@ -180,7 +181,7 @@ got a new entry called mgr_actors. Select it, and a new viewer window will pop up:

    - + The same trace data in a different view

    In order to see the nitty gritty details of an event @@ -192,14 +193,14 @@ viewer window to pop up, showing the event in the mgr_actors view:

    - + The trace event in the mgr_actors view

    Select the collector entry in the Filters menu and a new contents viewer window will pop up showing the same trace event in the collectors view:

    - + The same trace event in the collectors view
    @@ -296,7 +297,7 @@ also available via shortcuts. Which key that has the same effect as selecting a menu entry is shown enclosed in parentheses. For example pressing the key r is - equivivalent to selecting the menu entry + equivalent to selecting the menu entry Viewer->Refresh.

    File menu:

    diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/et_examples.xml erlang-13.b.3-dfsg/lib/et/doc/src/et_examples.xml --- erlang-13.b.1-dfsg/lib/et/doc/src/et_examples.xml 2009-03-13 11:11:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/et_examples.xml 2009-11-20 13:37:20.000000000 +0000 @@ -29,6 +29,7 @@ %VSN% + et_examples.xml
    @@ -59,7 +60,7 @@ 2> ]]>

    - + A simulated Mnesia transaction which writes one record
    @@ -71,7 +72,7 @@ labels. If the information about who the caller was it will be displayed as an arrow directed from the caller to the callee. The [{message, {caller}}, {return_trace}] options to dbg:tpl/2 - function will imply the neccessary information in the Erlang traces. + function will imply the necessary information in the Erlang traces. Here follows the module_as_actor filter:

    @@ -116,7 +117,7 @@

    The et_demo:live_trans/0 function starts the a global controller, starts a viewer, starts Mnesia, creates a local table, - activates tracing (as described above) and registeres the shell + activates tracing (as described above) and registers the shell process is as 'my_shell' for clarity. Finally the a simple Mnesia transaction that writes a single record is run:

    @@ -133,7 +134,7 @@

    Please, explore the different filters in order to see how the traced transaction can be seen from different point of views:

    - + A real Mnesia transaction which writes one record
    @@ -169,7 +170,7 @@ {title, "Megaco tracer - Erlang/OTP"}], et_viewer:start(Options). -

    First we start an Erlang node with the a global collecor and +

    First we start an Erlang node with the a global collector and its viewer. The et_viewer: search for: [] ++ ["gateway_tt"] printout is caused by a click on the "gateway_tt" actor name in the viewer. It means that only events with that actor will be displayed @@ -221,7 +222,7 @@

    And finally we start an Erlang node for the Media Gateways and connect to the observer node. Each Media Gateway connects to the - controller and sends an inital Service Change message. The controller + controller and sends an initial Service Change message. The controller accepts the gateways and sends a reply to each one using the same transport mechanism and message encoding according to the preference of each gateway. That is all combinations of TCP/IP transport, UDP/IP @@ -291,18 +292,18 @@ on the "gateway_tt" actor name in order to only display the events regarding that actor:

    - + The viewer adopted for Megaco

    A pretty printed Megaco message looks like this:

    - + A textual Megaco message

    And the corresponding internal form for the same Megaco message looks like this:

    - + The internal form of a Megaco message
    diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/et_intro.xml erlang-13.b.3-dfsg/lib/et/doc/src/et_intro.xml --- erlang-13.b.1-dfsg/lib/et/doc/src/et_intro.xml 2009-03-13 11:11:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/et_intro.xml 2009-11-20 13:37:20.000000000 +0000 @@ -29,6 +29,7 @@ %VSN% + et_intro.xml

    The Event Tracer (ET) uses the built-in trace mechanism in Erlang and provides tools for collection and graphical viewing of trace @@ -38,7 +39,7 @@

    Scope and Purpose -

    This manual describes the Event Tracer (ET) appliacation, as a component +

    This manual describes the Event Tracer (ET) application, as a component of the Erlang/Open Telecom Platform development environment. It is assumed that the reader is familiar with the Erlang Development Environment, which is described in a separate User's @@ -79,7 +80,7 @@ Event Tracer (ET) and about the Erlang/OTP development system:

    -

    the Reference Manual of the Event Tracer (ET)/p>

    +

    the Reference Manual of the Event Tracer (ET).

    documentation of basic tracing in erlang:trace/4 and diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/et_selector.xml erlang-13.b.3-dfsg/lib/et/doc/src/et_selector.xml --- erlang-13.b.1-dfsg/lib/et/doc/src/et_selector.xml 2009-03-13 11:11:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/et_selector.xml 2009-11-20 13:37:19.000000000 +0000 @@ -69,7 +69,7 @@ phone_home/4,5 whose detail level argument is lesser than X.

    An empty match spec deactivates tracing of calls to phone_home/4,5

    Other match specs activates tracing of calls to phone_home/4,5 - accordlingly with erlang:trace_pattern/2.

    + accordingly with erlang:trace_pattern/2.

    diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/et_viewer.xml erlang-13.b.3-dfsg/lib/et/doc/src/et_viewer.xml --- erlang-13.b.1-dfsg/lib/et/doc/src/et_viewer.xml 2009-03-13 11:11:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/et_viewer.xml 2009-11-20 13:37:19.000000000 +0000 @@ -94,11 +94,11 @@

    A filter_fun() takes an event record as sole argument and returns false | true | {true, NewEvent}.

    If the collector_pid is undefined a new - et_collecor will be started with the following + et_collector will be started with the following parameter settings: parent_pid, event_order, trace_global, trace_pattern, trace_port, trace_max_queue, trace_client, dict_insert and dict_delete. - The new et_viewer will register itself as an et_collecor + The new et_viewer will register itself as an et_collector subscriber.

    Default values:

    diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/files.mk erlang-13.b.3-dfsg/lib/et/doc/src/files.mk --- erlang-13.b.1-dfsg/lib/et/doc/src/files.mk 2007-11-26 13:10:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/files.mk 2009-09-18 15:12:57.000000000 +0100 @@ -1,4 +1,20 @@ #-*-makefile-*- ; force emacs to enter makefile-mode +# %CopyrightBegin% +# +# Copyright Ericsson AB 2002-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% XML_APPLICATION_FILES = \ ref_man.xml diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/make.dep erlang-13.b.3-dfsg/lib/et/doc/src/make.dep --- erlang-13.b.1-dfsg/lib/et/doc/src/make.dep 2007-11-26 13:10:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/make.dep 2009-09-18 15:12:58.000000000 +0100 @@ -1,3 +1,20 @@ +#-*-makefile-*- ; force emacs to enter makefile-mode +# %CopyrightBegin% +# +# Copyright Ericsson AB 2002-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% # ---------------------------------------------------- # >>>> Do not edit this file <<<< # This file was automaticly generated by diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/Makefile erlang-13.b.3-dfsg/lib/et/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/et/doc/src/Makefile 2009-03-13 11:11:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/Makefile 2009-11-20 13:37:19.000000000 +0000 @@ -26,17 +26,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(ET_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=et # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/et-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -50,36 +45,17 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(filter-out ../html/note.gif, $(DEFAULT_GIF_FILES)) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = et-$(VSN).pdf +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PS_FILE = et-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets @@ -87,21 +63,19 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) pdf: $(TOP_PDF_FILE) -ps: $(TOP_PS_FILE) +html: gifs $(HTML_REF_MAN_FILE) -html: $(HTML_FILES) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ man: $(MAN3_FILES) @@ -109,36 +83,20 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) - # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 release_spec: diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/notes.xml erlang-13.b.3-dfsg/lib/et/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/et/doc/src/notes.xml 2009-03-13 11:11:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/notes.xml 2009-11-20 13:37:20.000000000 +0000 @@ -26,6 +26,7 @@ %VSN% + notes.xml

    This document describes the changes made to the Event Tracer (ET) system from version to version. The intention of this document is to @@ -34,6 +35,38 @@ thus constitutes one section in this document. The title of each section is the version number of Event Tracer (ET).

    +
    ET 1.3.3 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the HTML frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    + +
    ET 1.3.2 + +
    Improvements and New Features + + +

    + The start module in the app file has been corrected.

    +

    + Own Id: OTP-8078

    +
    +
    +
    + +
    +
    ET 1.3.1
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/et/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/et/doc/src/part_notes.xml 2009-03-13 11:11:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/part_notes.xml 2009-11-20 13:37:20.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20022009 @@ -31,6 +31,6 @@

    The Event Tracer (ET) uses the built-in trace mechanism in Erlang and provides tools for collection and graphical viewing of trace data.

    - + diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/part.xml erlang-13.b.3-dfsg/lib/et/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/et/doc/src/part.xml 2009-03-13 11:11:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/part.xml 2009-11-20 13:37:19.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20022009 @@ -31,8 +31,8 @@

    The Event Tracer (ET) uses the built-in trace mechanism in Erlang and provides tools for collection and graphical viewing of trace data.

    - - - + + + diff -Nru erlang-13.b.1-dfsg/lib/et/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/et/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/et/doc/src/ref_man.xml 2009-03-13 11:11:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/doc/src/ref_man.xml 2009-11-20 13:37:20.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20022009 @@ -31,9 +31,9 @@

    The Event Tracer (ET) uses the built-in trace mechanism in Erlang and provides tools for collection and graphical viewing of trace data.

    - - - - + + + + diff -Nru erlang-13.b.1-dfsg/lib/et/src/et.app.src erlang-13.b.3-dfsg/lib/et/src/et.app.src --- erlang-13.b.1-dfsg/lib/et/src/et.app.src 2009-03-13 11:11:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/src/et.app.src 2009-09-18 15:12:57.000000000 +0100 @@ -21,17 +21,14 @@ [{description, "Event Tracer"}, {vsn, "%VSN%"}, {modules, - [ - et, - et_collector, - et_contents_viewer, - et_selector, - et_viewer - ]}, + [ + et, + et_collector, + et_contents_viewer, + et_selector, + et_viewer + ]}, {registered, [et_collector]}, {applications, [stdlib, kernel]}, - {env, []}, - {mod, {et_sup, []}} + {env, []} ]}. - - diff -Nru erlang-13.b.1-dfsg/lib/et/src/modules.mk erlang-13.b.3-dfsg/lib/et/src/modules.mk --- erlang-13.b.1-dfsg/lib/et/src/modules.mk 2002-10-02 23:10:41.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/et/src/modules.mk 2009-09-18 15:12:49.000000000 +0100 @@ -1,4 +1,20 @@ #-*-makefile-*- ; force emacs to enter makefile-mode +# %CopyrightBegin% +# +# Copyright Ericsson AB 2001-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% MODULES = \ et \ diff -Nru erlang-13.b.1-dfsg/lib/et/subdirs.mk erlang-13.b.3-dfsg/lib/et/subdirs.mk --- erlang-13.b.1-dfsg/lib/et/subdirs.mk 2002-10-14 14:49:21.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/et/subdirs.mk 2009-09-18 15:12:56.000000000 +0100 @@ -1,4 +1,20 @@ #-*-makefile-*- ; force emacs to enter makefile-mode +# %CopyrightBegin% +# +# Copyright Ericsson AB 2002-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% SUB_DIRECTORIES = src examples doc/src diff -Nru erlang-13.b.1-dfsg/lib/et/vsn.mk erlang-13.b.3-dfsg/lib/et/vsn.mk --- erlang-13.b.1-dfsg/lib/et/vsn.mk 2009-03-13 11:11:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/et/vsn.mk 2009-11-20 13:37:18.000000000 +0000 @@ -16,6 +16,8 @@ # # %CopyrightEnd% -ET_VSN = 1.3.1 +ET_VSN = 1.3.3 -TICKETS = OTP-7830 +TICKETS = OTP-8201 +TICKETS_1_3_2 = OTP-8078 +TICKETS_1_3_1 = OTP-7830 diff -Nru erlang-13.b.1-dfsg/lib/eunit/doc/overview.edoc erlang-13.b.3-dfsg/lib/eunit/doc/overview.edoc --- erlang-13.b.1-dfsg/lib/eunit/doc/overview.edoc 2009-04-20 13:08:03.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/eunit/doc/overview.edoc 2009-11-20 13:32:48.000000000 +0000 @@ -401,7 +401,7 @@ == EUnit macros == -Although all the functionality of EUnit is avaliable even without the +Although all the functionality of EUnit is available even without the use of preprocessor macros, the EUnit header file defines a number of such macros in order to make it as easy as possible to write unit tests as compactly as possible and without getting too many details in the diff -Nru erlang-13.b.1-dfsg/lib/eunit/doc/src/book.xml erlang-13.b.3-dfsg/lib/eunit/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/eunit/doc/src/book.xml 2009-03-12 12:22:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/eunit/doc/src/book.xml 2009-11-20 13:32:51.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2008 @@ -23,7 +23,7 @@ The Initial Developer of the Original Code is Ericsson AB. - EUnit Application + EUnit Richard Carlsson, Mickaël Rémond 2008-10-29 @@ -37,11 +37,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/eunit/doc/src/Makefile erlang-13.b.3-dfsg/lib/eunit/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/eunit/doc/src/Makefile 2009-06-05 13:53:48.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/eunit/doc/src/Makefile 2009-11-20 13:32:51.000000000 +0000 @@ -25,11 +25,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(EUNIT_VSN) +APPLICATION=eunit # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/eunit-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Help application directory specification @@ -68,6 +69,11 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) $(XML_NOTES_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + + # ---------------------------------------------------- INFO_FILE = ../../info @@ -86,22 +92,9 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = eunit-$(VSN).pdf -TOP_PS_FILE = eunit-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- @@ -113,16 +106,21 @@ # ---------------------------------------------------- # Targets # ---------------------------------------------------- -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +$(HTMLDIR)/%.gif: %.gif + $(INSTALL_DATA) $< $@ + +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) +html: gifs $(HTML_REF_MAN_FILE) + + +man: $(MAN3_FILES) + +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) $(XML_REF3_FILES): docb_gen -def vsn $(EUNIT_VSN) -includes $(EUNIT_INC_DIR) $(EUNIT_DIR)/$(@:%.xml=%.erl) @@ -142,65 +140,35 @@ @echo "DEFAULT_HTML_FILES: $(DEFAULT_HTML_FILES)" @echo "EXTRA_FILES: $(EXTRA_FILES)" -pdf: xml $(TOP_PDF_FILE) - -ps: xml $(TOP_PS_FILE) - -html: xml $(HTML_FILES) - -man: $(MAN3_FILES) - -gifs: $(GIF_FILES:%=$(HTMLDIR)/%) - xml: $(XML_REF3_FILES) $(XML_CHAPTER_FILES) debug opt: - -clean clean_docs clean_tex: - rm -f $(XML_REF3_FILES) $(XML_CHAPTER_FILES) *.html - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(EXTRA_FILES:fascicules.xml= ) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ *sgmls_output *sgmls_errs $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(XML_CHAPTER_FILES) *.html + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- - - include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ - $(HTML_EXAMPLE_FILES) $(HTML_STYLESHEET_FILES) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 -endif -endif release_spec: -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- --include make.dep - - diff -Nru erlang-13.b.1-dfsg/lib/eunit/doc/src/notes.xml erlang-13.b.3-dfsg/lib/eunit/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/eunit/doc/src/notes.xml 2009-06-05 13:53:48.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/eunit/doc/src/notes.xml 2009-11-20 13:32:50.000000000 +0000 @@ -28,9 +28,42 @@ nil nil nil + notes.xml

    This document describes the changes made to the EUnit application.

    +
    Eunit 2.1.4 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    + +
    Eunit 2.1.3 + +
    Improvements and New Features + + +

    + Miscellaneous updates.

    +

    + Own Id: OTP-8190

    +
    +
    +
    + +
    +
    Eunit 2.1.2
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/eunit/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/eunit/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/eunit/doc/src/part_notes.xml 2009-03-12 12:22:09.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/eunit/doc/src/part_notes.xml 2009-11-20 13:32:50.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2008 @@ -28,11 +28,12 @@ 2008-10-29 +

    The EUnit application contains modules with support for unit testing

    - +
    diff -Nru erlang-13.b.1-dfsg/lib/eunit/doc/src/part.xml erlang-13.b.3-dfsg/lib/eunit/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/eunit/doc/src/part.xml 2009-03-12 12:22:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/eunit/doc/src/part.xml 2009-11-20 13:32:51.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2008 @@ -33,6 +33,6 @@

    The EUnit application contains modules with support for unit testing.

    - + diff -Nru erlang-13.b.1-dfsg/lib/eunit/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/eunit/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/eunit/doc/src/ref_man.xml 2009-06-05 13:53:48.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/eunit/doc/src/ref_man.xml 2009-11-20 13:32:51.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2008 @@ -34,7 +34,7 @@

    The EUnit application contains modules with support for unit testing.

    - - + + diff -Nru erlang-13.b.1-dfsg/lib/eunit/src/eunit_data.erl erlang-13.b.3-dfsg/lib/eunit/src/eunit_data.erl --- erlang-13.b.1-dfsg/lib/eunit/src/eunit_data.erl 2009-04-20 13:08:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/eunit/src/eunit_data.erl 2009-09-18 15:09:28.000000000 +0100 @@ -13,7 +13,7 @@ %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 %% USA %% -%% $Id: eunit_data.erl 339 2009-04-05 14:10:47Z rcarlsson $ +%% $Id$ %% %% @author Richard Carlsson %% @copyright 2006 Richard Carlsson @@ -146,10 +146,8 @@ iter_prev(#iter{prev = []}) -> none; -iter_prev(#iter{prev = [T | Ts]} = I) -> - {T, I#iter{prev = Ts, - next = [T | I#iter.next], - pos = I#iter.pos - 1}}. +iter_prev(#iter{prev = [T | Ts], next = Next, pos = Pos} = I) -> + {T, I#iter{prev = Ts, next = [T | Next], pos = Pos - 1}}. %% --------------------------------------------------------------------- @@ -387,10 +385,10 @@ end; parse({S, T1}) when is_binary(S) -> group(#group{tests = T1, desc = S}); -parse(T) when is_tuple(T), size(T) > 2, is_list(element(1, T)) -> +parse(T) when tuple_size(T) > 2, is_list(element(1, T)) -> [S | Es] = tuple_to_list(T), parse({S, list_to_tuple(Es)}); -parse(T) when is_tuple(T), size(T) > 2, is_binary(element(1, T)) -> +parse(T) when tuple_size(T) > 2, is_binary(element(1, T)) -> [S | Es] = tuple_to_list(T), parse({S, list_to_tuple(Es)}); parse(M) when is_atom(M) -> @@ -629,8 +627,7 @@ objfile_test(File) -> try - {value, {module, M}} = - lists:keysearch(module, 1, beam_lib:info(File)), + {module, M} = lists:keyfind(module, 1, beam_lib:info(File)), {setup, fun () -> %% TODO: better error/stacktrace for this internal fun diff -Nru erlang-13.b.1-dfsg/lib/eunit/src/eunit_serial.erl erlang-13.b.3-dfsg/lib/eunit/src/eunit_serial.erl --- erlang-13.b.1-dfsg/lib/eunit/src/eunit_serial.erl 2009-04-20 13:08:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/eunit/src/eunit_serial.erl 2009-09-18 15:09:29.000000000 +0100 @@ -13,7 +13,7 @@ %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 %% USA %% -%% $Id: eunit_serial.erl 332 2009-03-01 17:31:59Z rcarlsson $ +%% $Id$ %% %% @author Richard Carlsson %% @copyright 2006 Richard Carlsson @@ -58,9 +58,9 @@ %% future use, and/or cancel the current item and possibly one or more %% of its parent groups. --record(state, {listeners, - cancelled = eunit_lib:trie_new(), - messages = dict:new()}). +-record(state, {listeners :: set(), + cancelled = eunit_lib:trie_new() :: gb_tree(), + messages = dict:new() :: dict()}). start(Pids) -> spawn(fun () -> serializer(Pids) end). diff -Nru erlang-13.b.1-dfsg/lib/eunit/vsn.mk erlang-13.b.3-dfsg/lib/eunit/vsn.mk --- erlang-13.b.1-dfsg/lib/eunit/vsn.mk 2009-06-05 13:53:47.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/eunit/vsn.mk 2009-11-20 13:32:49.000000000 +0000 @@ -1 +1 @@ -EUNIT_VSN = 2.1.2 +EUNIT_VSN = 2.1.4 diff -Nru erlang-13.b.1-dfsg/lib/gs/contribs/Makefile erlang-13.b.3-dfsg/lib/gs/contribs/Makefile --- erlang-13.b.1-dfsg/lib/gs/contribs/Makefile 2009-03-12 12:23:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/contribs/Makefile 2009-11-20 13:33:48.000000000 +0000 @@ -21,8 +21,6 @@ include $(ERL_TOP)/make/target.mk include $(ERL_TOP)/make/$(TARGET)/otp.mk -# XXX gsb (debugger) missing - SUB_DIRECTORIES = bonk cols mandel othello SPECIAL_TARGETS = diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/book.xml erlang-13.b.3-dfsg/lib/gs/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/book.xml 2007-11-26 19:03:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/book.xml 2009-11-20 13:34:00.000000000 +0000 @@ -1,29 +1,27 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - Graphics System Application (GS) + Graphics System (GS) Klas Eriksson 1997-05-02 @@ -32,16 +30,19 @@
    - Graphics System Application (GS) + Graphics System (GS) - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter1.xml erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter1.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter1.xml 2007-11-26 19:03:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter1.xml 2009-11-20 13:34:06.000000000 +0000 @@ -4,23 +4,21 @@
    - 2000 - 2007 - Ericsson AB, All Rights Reserved + 20002009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + GS - The Graphics System @@ -28,6 +26,7 @@ + gs_chapter1.xml
    @@ -39,7 +38,7 @@

    Erlang has been implemented on a wide range of platforms and the graphics system works on all these platforms. Erlang applications can be written towards the same graphics API and the application can run on all supported platforms without modification.

    - + Graphics Interface for Erlang
    @@ -61,7 +60,7 @@ the owner-process and kill the appropriate graphics window if the owner process suddenly dies.

    - + Owner Process

    Events are messages which are sent from the graphical object to the owner-process. The events the owner-process is informed about may include:

    @@ -71,7 +70,7 @@ the user has taken some action on the object, like moving the window. - + Events Delivered to Owner Process
    diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter2.xml erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter2.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter2.xml 2007-11-26 19:03:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter2.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,165 +0,0 @@ - - - - -
    - - 2000 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Interface Functions - - - - -
    - -
    - Overview -

    The following interface functions are included with the graphics system:

    - - This function starts the graphics server and returns its object identifier. If the graphics server has already been started, it returns its original identifier. - This function stops the graphics server and closes all windows which has launched. This function is not the opposite of because causes all applications to lose the graphics server and the objects created with the system. - This function creates a new object of specified as a child to the specified . It configures the object with and returns the identifier for the object, or . - This function is identical to the previously listed function, except that a is specified to reference the object. is an atom. - This function destroys an object and all its children. - This function configures an object with . It returns , or . - This function reads the value of an object option. It returns the value, or . - -

    The above list contains all the function which are needed with the graphics system. For convenience, the following aliases also exist:

    - - - - - - - - - - - - - -

    These shorthands can be used as follows:

    - - - - - -

    The function is useful for creating a large hierarchy of objects. It has the following syntax:

    - | {error,Reason} - ]]> -

    is a list of , and is any of the following:

    - - - - - -

    The following example constructs a window which contains two objects, a button and a frame with a label:

    - -
    - -
    - A First Example -

    The first action required is to start up the graphics server. This operation returns an identifier for the server process, which registers itself under the name . If a graphics server was already started, its identifier is returned. We can now create objects and configure the behavior and appearance of these objects. When all objects are created and configured in a top level window, we map it on the screen to make it visible. The example below shows how to create a window with a button that says "Press Me".

    - -

    The following steps were completed in this code:

    - - start a graphics server - create a window of specified width and height - create a button with the text "Press Me" - map the window on the screen - enter the event loop. - -

    The event loop is where we receive events from . In this case, we want to receive a click event from the button. This event is delivered when the user presses the button.

    - - - -"Press Me" Button Example - -

    The Erlang system includes many examples. All examples in this document can be found in the directory. In addition, there is an example directory which contains examples of fractal trees, bouncing balls, a color editor, and a couple of other applications.

    -
    - -
    - Creating Objects -

    You create an object of a specified type with the or the function. The difference is that the function allows you to assign names to the objects. You can then refer to the object instead of using the object identifier. The two forms of the function look as follows:

    - -

    Examples of built-in object types are:

    - - window - frame - menu - button - radio button - list box. - -

    Objects are created in a hierarchical order. The top level object is the window object which is a container object for most other object types.

    - - - Hierarchy of Objects - -

    A frame object is like a sub-window but also a container object which can have children objects.

    -

    The or functions return an object identifier, or the tuple . The object identifier uniquely identifies the object within the system. The object identifier is used to:

    - - reconfigure an object - identify events from a particular object. - -
    - -
    - Ownership -

    The process which creates an object is said to own the object. When a process dies, all objects owned by the process are destroyed. The ownership also means that all events generated by a specific object are delivered to the owner process. The graphics server keeps track of all Erlang processes that create objects. It is therefore able to take appropriate actions if a process should die.

    -
    - -
    - Naming Objects -

    As shown previously, the function can be used to name objects. The name should be a unique atom which is used to reference the object. The advantage of naming objects is that we do not have to pass object identifiers as arguments to the event loop. Instead, we can use the object name in our code. To name objects in the following example, the code gives the name to the window, and to the button.

    - -

    The name is local for the process which creates the object. This means that the name have a meaning only for one process. Different processes can give different objects the same name. When passing references to objects between processes, the object identifier has to be used because names only has a meaning in a process context. If necessary, the object identifier can be retrieved by reading the option.

    -

    When using distributed Erlang, objects should be named carefully. A named object always refers to an object in the graphics system on the node where it was created. The syntax should be used when referring to a named object on another node.

    -

    The following example receives a canvas object from another node and creates a line named that will appear in the canvas. Also, this example demonstrates how to configure the line using the special syntax.

    - - receive - {gs_obj,Canvas,FromNode} -> ok - end, - gs:create(line,myline1,Canvas,[{coords,[{10,10},{20,20}]}]), - gs:config({myline1,FromNode},[{buttonpress,true}]). - ]]> -

    Unnamed objects are transparent. For example, a line object can be created from a canvas on another node and then configured as any other object.

    - - receive - {gs_obj,Canvas,_FromNode} -> ok - end, - L = gs:create(line,Canvas,[{coords,[{10,10},{20,20}]}]), - gs:config(L,[{buttonpress,true}]). - ]]> -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter2.xmlsrc erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter2.xmlsrc --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter2.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter2.xmlsrc 2009-11-20 13:34:06.000000000 +0000 @@ -0,0 +1,164 @@ + + + + +
    + + 20002009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Interface Functions + + + + + gs_chapter2.xml +
    + +
    + Overview +

    The following interface functions are included with the graphics system:

    + + This function starts the graphics server and returns its object identifier. If the graphics server has already been started, it returns its original identifier. + This function stops the graphics server and closes all windows which has launched. This function is not the opposite of because causes all applications to lose the graphics server and the objects created with the system. + This function creates a new object of specified as a child to the specified . It configures the object with and returns the identifier for the object, or . + This function is identical to the previously listed function, except that a is specified to reference the object. is an atom. + This function destroys an object and all its children. + This function configures an object with . It returns , or . + This function reads the value of an object option. It returns the value, or . + +

    The above list contains all the function which are needed with the graphics system. For convenience, the following aliases also exist:

    + + + + + + + + + + + + + +

    These shorthands can be used as follows:

    + + + + + +

    The function is useful for creating a large hierarchy of objects. It has the following syntax:

    + | {error,Reason} + ]]> +

    is a list of , and is any of the following:

    + + + + + +

    The following example constructs a window which contains two objects, a button and a frame with a label:

    + +
    + +
    + A First Example +

    The first action required is to start up the graphics server. This operation returns an identifier for the server process, which registers itself under the name . If a graphics server was already started, its identifier is returned. We can now create objects and configure the behavior and appearance of these objects. When all objects are created and configured in a top level window, we map it on the screen to make it visible. The example below shows how to create a window with a button that says "Press Me".

    + +

    The following steps were completed in this code:

    + + start a graphics server + create a window of specified width and height + create a button with the text "Press Me" + map the window on the screen + enter the event loop. + +

    The event loop is where we receive events from . In this case, we want to receive a click event from the button. This event is delivered when the user presses the button.

    + + + +"Press Me" Button Example + +

    The Erlang system includes many examples. All examples in this document can be found in the directory. In addition, there is an example directory which contains examples of fractal trees, bouncing balls, a color editor, and a couple of other applications.

    +
    + +
    + Creating Objects +

    You create an object of a specified type with the or the function. The difference is that the function allows you to assign names to the objects. You can then refer to the object instead of using the object identifier. The two forms of the function look as follows:

    + +

    Examples of built-in object types are:

    + + window + frame + menu + button + radio button + list box. + +

    Objects are created in a hierarchical order. The top level object is the window object which is a container object for most other object types.

    + + + Hierarchy of Objects + +

    A frame object is like a sub-window but also a container object which can have children objects.

    +

    The or functions return an object identifier, or the tuple . The object identifier uniquely identifies the object within the system. The object identifier is used to:

    + + reconfigure an object + identify events from a particular object. + +
    + +
    + Ownership +

    The process which creates an object is said to own the object. When a process dies, all objects owned by the process are destroyed. The ownership also means that all events generated by a specific object are delivered to the owner process. The graphics server keeps track of all Erlang processes that create objects. It is therefore able to take appropriate actions if a process should die.

    +
    + +
    + Naming Objects +

    As shown previously, the function can be used to name objects. The name should be a unique atom which is used to reference the object. The advantage of naming objects is that we do not have to pass object identifiers as arguments to the event loop. Instead, we can use the object name in our code. To name objects in the following example, the code gives the name to the window, and to the button.

    + +

    The name is local for the process which creates the object. This means that the name have a meaning only for one process. Different processes can give different objects the same name. When passing references to objects between processes, the object identifier has to be used because names only has a meaning in a process context. If necessary, the object identifier can be retrieved by reading the option.

    +

    When using distributed Erlang, objects should be named carefully. A named object always refers to an object in the graphics system on the node where it was created. The syntax should be used when referring to a named object on another node.

    +

    The following example receives a canvas object from another node and creates a line named that will appear in the canvas. Also, this example demonstrates how to configure the line using the special syntax.

    + + receive + {gs_obj,Canvas,FromNode} -> ok + end, + gs:create(line,myline1,Canvas,[{coords,[{10,10},{20,20}]}]), + gs:config({myline1,FromNode},[{buttonpress,true}]). + ]]> +

    Unnamed objects are transparent. For example, a line object can be created from a canvas on another node and then configured as any other object.

    + + receive + {gs_obj,Canvas,_FromNode} -> ok + end, + L = gs:create(line,Canvas,[{coords,[{10,10},{20,20}]}]), + gs:config(L,[{buttonpress,true}]). + ]]> +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter3.xml erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter3.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter3.xml 2007-11-26 19:03:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter3.xml 2009-11-20 13:34:06.000000000 +0000 @@ -4,23 +4,21 @@
    - 2000 - 2007 - Ericsson AB, All Rights Reserved + 20002009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Options @@ -28,6 +26,7 @@ + gs_chapter3.xml
    diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter4.xml erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter4.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter4.xml 2007-11-26 19:03:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter4.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,197 +0,0 @@ - - - - -
    - - 2000 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Events - - - - -
    - -
    - Event Messages -

    Events are messages which are sent to the owner process of the object when the user interacts with the object in some way. A simple case is the user pressing a button. An event is then delivered to the owner process of the button (the process that created the button). In the following example, the program creates a button object and enables the events click and enter. This example shows that events are enabled in the same way as objects are configured with options.

    -

    - -

    The process is now ready to receive click and enter events from the button. The events delivered are always five tuples and consist of:

    - - - is a tag which says it is an event from the graphics server. - contains the object identifier or the name of the object in which the event occurred. - contains the type of event which has occurred. In the example shown, it is either or . - is a field which the user can set to any Erlang term. It is very useful to have the object store arbitrary data which is delivered with the event. - is a list which contains event specific information. In a motion event, the Args argument would contain the x and y coordinates. - -

    There are two categories of events:

    - - generic events - object specific events. - -
    - -
    - Generic Events -

    Generic events are the same for all types of objects. The following table shows a list of generic event types which the graphics server can send to - a process. For generic events, the argument always contains the same data, independent of which object delivers it.

    -

    The following sub-sections explains the event types and what they are used for.

    - - - Event - Args - Description - - - buttonpress - [ButtonNo,X,Y|_] - A mouse button was pressed over the object. - - - buttonrelease - [ButtonNo,X,Y|_] - A mouse button was released over the object. - - - enter - [] - Delivered when the mouse pointer enters the objects area. - - - focus - [Int|_] - Keyboard focus has changed. 0 means lost focus. 1 means gained focus. - - - keypress - [KeySym,Keycode, Shift, Control|_] - A key has been pressed. - - - leave - [] - Mouse pointer leaves the object. - - - motion - [X,Y|_] - The mouse pointer is moving in the object. Used when tracking the mouse in a window. - - Generic Event Types -
    - -
    - The Buttonpress and Buttonrelease Events -

    These events are generated when a mouse button is pressed or released inside the object frame of a window, or frame object type. The button events are not object specific (compare to click). The format of the buttonpress event is:

    - -

    The mouse button number which was pressed is the first argument in the field list. This number is either 1, 2 or 3, if you have a three button mouse. The and coordinates are sent along to track in what position the user pressed down the button. These events are useful for programming things like "rubberbanding", which is to draw out an area with the mouse. In detail, this event can be described as pressing the mouse button at a specific coordinate and releasing it at another coordinate in order to define a rectangular area. This action is often used in combination with motion events.

    -
    - -
    - The Enter and Leave Events -

    These events are generated when the mouse pointer (cursor) enters or leaves an object.

    -
    - -
    - The Focus Event -

    The focus event tracks which object currently holds the keyboard focus. Only one object at a time can hold the keyboard focus. To have the keyboard focus means that all keypresses from the keyboard will be delivered to that object. The format of a focus event is:

    - -

    The FocusFlag argument is either 1, which means that the object has gained keyboard focus, or 0, which means that the object has lost keyboard focus.

    -
    - -
    - The Keypress Event -

    This event is generated by an object which receives text input from the user, like entry objects. It can also be generated by window objects. The format of a keypress event is:

    - -

    The argument is either the character key which was pressed, or a word which describes which key it was. Examples of are; ,,.., 1,2,3..., , , , , , . The argument is the keycode number for the key that was pressed. Either the or the argument can be used to find out which key was pressed. The argument contains either a 0 or a 1 to indicate if the Shift key was held down when the character key was pressed. The Control argument is similar to the Shift key argument, but applies to the Control key instead of the Shift key.

    -
    - -
    - The Motion Event -

    The motion event is used to track the mouse position in a window. When the user moves the mouse pointer (cursor) to a new position a motion event is generated. The format of a motion event is:

    - -

    The current x and y coordinates of the cursor are sent along in the field.

    -
    -
    - -
    - Object Specific Events -

    The click and doubleclick events are the object specific event types. Only some objects have these events and the field of the events vary for different type of objects. A click on a check button generates a click event where the data field contains the on/off value of the indicator. On the other hand, the click event for a list box contains information on which item was chosen.

    - - - Event - Args - Description - - - click - <object specific> - Pressing a button or operating on a object in some predefined way. - - - double-click - <object specific> - Pressing the mouse button twice quickly. Useful with list boxes. - - Object Specific Events -
    -
    - -
    - Matching Events Against Object Identifiers -

    Events can be matched against the object identifier in the receive statement. The disadvantage of matching against identifiers is that the program must pass the object identifiers as arguments to the event loop.

    - -
    - -
    - Matching Events Against Object Names -

    Another solution is to name the objects using the function. In this way, the program does not have to pass any parameters which contain object identifiers for each function call made.

    - -
    - -
    - Matching Events Against the Data Field -

    A third solution is to set the option to some value and then match against this value. All built-in objects have an option called which can be set to any Erlang term. For example, we could set the data field to a tuple and have the receiving function make an on the contents of the data field whenever certain events arrive.

    - -
    - -
    - Experimenting with Events -

    A good way of learning how events work is to write a short demo program like the one shown below and test how different events work.

    - -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter4.xmlsrc erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter4.xmlsrc --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter4.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter4.xmlsrc 2009-11-20 13:34:06.000000000 +0000 @@ -0,0 +1,196 @@ + + + + +
    + + 20002009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Events + + + + + gs_chapter4.xml +
    + +
    + Event Messages +

    Events are messages which are sent to the owner process of the object when the user interacts with the object in some way. A simple case is the user pressing a button. An event is then delivered to the owner process of the button (the process that created the button). In the following example, the program creates a button object and enables the events click and enter. This example shows that events are enabled in the same way as objects are configured with options.

    +

    + +

    The process is now ready to receive click and enter events from the button. The events delivered are always five tuples and consist of:

    + + + is a tag which says it is an event from the graphics server. + contains the object identifier or the name of the object in which the event occurred. + contains the type of event which has occurred. In the example shown, it is either or . + is a field which the user can set to any Erlang term. It is very useful to have the object store arbitrary data which is delivered with the event. + is a list which contains event specific information. In a motion event, the Args argument would contain the x and y coordinates. + +

    There are two categories of events:

    + + generic events + object specific events. + +
    + +
    + Generic Events +

    Generic events are the same for all types of objects. The following table shows a list of generic event types which the graphics server can send to + a process. For generic events, the argument always contains the same data, independent of which object delivers it.

    +

    The following sub-sections explains the event types and what they are used for.

    + + + Event + Args + Description + + + buttonpress + [ButtonNo,X,Y|_] + A mouse button was pressed over the object. + + + buttonrelease + [ButtonNo,X,Y|_] + A mouse button was released over the object. + + + enter + [] + Delivered when the mouse pointer enters the objects area. + + + focus + [Int|_] + Keyboard focus has changed. 0 means lost focus. 1 means gained focus. + + + keypress + [KeySym,Keycode, Shift, Control|_] + A key has been pressed. + + + leave + [] + Mouse pointer leaves the object. + + + motion + [X,Y|_] + The mouse pointer is moving in the object. Used when tracking the mouse in a window. + + Generic Event Types +
    + +
    + The Buttonpress and Buttonrelease Events +

    These events are generated when a mouse button is pressed or released inside the object frame of a window, or frame object type. The button events are not object specific (compare to click). The format of the buttonpress event is:

    + +

    The mouse button number which was pressed is the first argument in the field list. This number is either 1, 2 or 3, if you have a three button mouse. The and coordinates are sent along to track in what position the user pressed down the button. These events are useful for programming things like "rubberbanding", which is to draw out an area with the mouse. In detail, this event can be described as pressing the mouse button at a specific coordinate and releasing it at another coordinate in order to define a rectangular area. This action is often used in combination with motion events.

    +
    + +
    + The Enter and Leave Events +

    These events are generated when the mouse pointer (cursor) enters or leaves an object.

    +
    + +
    + The Focus Event +

    The focus event tracks which object currently holds the keyboard focus. Only one object at a time can hold the keyboard focus. To have the keyboard focus means that all keypresses from the keyboard will be delivered to that object. The format of a focus event is:

    + +

    The FocusFlag argument is either 1, which means that the object has gained keyboard focus, or 0, which means that the object has lost keyboard focus.

    +
    + +
    + The Keypress Event +

    This event is generated by an object which receives text input from the user, like entry objects. It can also be generated by window objects. The format of a keypress event is:

    + +

    The argument is either the character key which was pressed, or a word which describes which key it was. Examples of are; ,,.., 1,2,3..., , , , , , . The argument is the keycode number for the key that was pressed. Either the or the argument can be used to find out which key was pressed. The argument contains either a 0 or a 1 to indicate if the Shift key was held down when the character key was pressed. The Control argument is similar to the Shift key argument, but applies to the Control key instead of the Shift key.

    +
    + +
    + The Motion Event +

    The motion event is used to track the mouse position in a window. When the user moves the mouse pointer (cursor) to a new position a motion event is generated. The format of a motion event is:

    + +

    The current x and y coordinates of the cursor are sent along in the field.

    +
    +
    + +
    + Object Specific Events +

    The click and doubleclick events are the object specific event types. Only some objects have these events and the field of the events vary for different type of objects. A click on a check button generates a click event where the data field contains the on/off value of the indicator. On the other hand, the click event for a list box contains information on which item was chosen.

    + + + Event + Args + Description + + + click + <object specific> + Pressing a button or operating on a object in some predefined way. + + + double-click + <object specific> + Pressing the mouse button twice quickly. Useful with list boxes. + + Object Specific Events +
    +
    + +
    + Matching Events Against Object Identifiers +

    Events can be matched against the object identifier in the receive statement. The disadvantage of matching against identifiers is that the program must pass the object identifiers as arguments to the event loop.

    + +
    + +
    + Matching Events Against Object Names +

    Another solution is to name the objects using the function. In this way, the program does not have to pass any parameters which contain object identifiers for each function call made.

    + +
    + +
    + Matching Events Against the Data Field +

    A third solution is to set the option to some value and then match against this value. All built-in objects have an option called which can be set to any Erlang term. For example, we could set the data field to a tuple and have the receiving function make an on the contents of the data field whenever certain events arrive.

    + +
    + +
    + Experimenting with Events +

    A good way of learning how events work is to write a short demo program like the one shown below and test how different events work.

    + +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter5.xml erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter5.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter5.xml 2007-11-26 19:03:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter5.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,70 +0,0 @@ - - - - -
    - - 2000 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Fonts - - - - -
    - -
    - The Font Model -

    Text related objects can be handled with the font option . A is represented as a two or three tuple:

    - - - - -

    Examples of fonts are: , , , .

    -

    The most important requirement with the font model is to ensure that there is always a "best possible" font present. For example, if an application tries to use the font on a computer system which does not have this font available, the font model automatically substitutes .

    -

    Note that GS requires that the following fonts are available if using an X-server display:

    - - fixed - -*-courier-* - -*-times-* - -*-helvetica-* - -*-symbol-* - "-*-new century schoolbook-" - -*-screen-* - -

    To find out which font is actually chosen by the , use the option . For example, the following situation might occur:

    -
     G=gs:start().
    -{1,<0.20.0>}
    -2>gs:read(G,{choose_font,{times,38}}).
    -{times,[],38}
    -3> gs:read(G,{choose_font,{screen,italic,6}}). 
    -{courier,italic,6}
    -4> 
    -    ]]>
    -

    When programming with fonts, it is often necessary to find the size of a string which uses a specific font. returns the width and height of any string and any font. The following example illustrates its usage:

    - - - Font Examples - - -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter5.xmlsrc erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter5.xmlsrc --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter5.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter5.xmlsrc 2009-11-20 13:34:07.000000000 +0000 @@ -0,0 +1,69 @@ + + + + +
    + + 20002009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Fonts + + + + + gs_chapter5.xml +
    + +
    + The Font Model +

    Text related objects can be handled with the font option . A is represented as a two or three tuple:

    + + + + +

    Examples of fonts are: , , , .

    +

    The most important requirement with the font model is to ensure that there is always a "best possible" font present. For example, if an application tries to use the font on a computer system which does not have this font available, the font model automatically substitutes .

    +

    Note that GS requires that the following fonts are available if using an X-server display:

    + + fixed + -*-courier-* + -*-times-* + -*-helvetica-* + -*-symbol-* + "-*-new century schoolbook-" + -*-screen-* + +

    To find out which font is actually chosen by the , use the option . For example, the following situation might occur:

    +
     G=gs:start().
    +{1,<0.20.0>}
    +2>gs:read(G,{choose_font,{times,38}}).
    +{times,[],38}
    +3> gs:read(G,{choose_font,{screen,italic,6}}). 
    +{courier,italic,6}
    +4> 
    +    ]]>
    +

    When programming with fonts, it is often necessary to find the size of a string which uses a specific font. returns the width and height of any string and any font. The following example illustrates its usage:

    + + + Font Examples + + +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter6.xml erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter6.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter6.xml 2007-11-26 19:03:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter6.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,62 +0,0 @@ - - - - -
    - - 2000 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Default Values - - - - -
    - -
    - The Default Value Model -

    When a new object is created, a set of options is provided by the application. Options which are not explicitly given are taken care of by the parent (the container object).

    - -

    In the example shown above, the window provides default values for options like location and background color. If an application cannot use the default values provided by GS, new ones can be configured. For example, the following code creates a red button at location y=30.

    - -

    The syntax for the default option is , where is the name of any GS object. The special keywords or which denote button, radio button, and check button can be used.

    -

    The semantics for the default option can be expressed as follows: If an object of kind is created and no value for is given, then use as the value. Only options of syntax can be given a default values. Default values may be inherited in several steps. In the following example, the button will show the text "Cancel".

    - -

    Default values are inherited so that changed default values only affect new objects, not existing objects.

    -

    Default values only have meaning when creating child objects, since objects which cannot have children cannot have default options. An example is buttons.

    -

    The following example illustrates how default options can be used:

    - - - Example of Default Options - - -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter6.xmlsrc erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter6.xmlsrc --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter6.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter6.xmlsrc 2009-11-20 13:34:07.000000000 +0000 @@ -0,0 +1,61 @@ + + + + +
    + + 20002009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Default Values + + + + + gs_chapter6.xml +
    + +
    + The Default Value Model +

    When a new object is created, a set of options is provided by the application. Options which are not explicitly given are taken care of by the parent (the container object).

    + +

    In the example shown above, the window provides default values for options like location and background color. If an application cannot use the default values provided by GS, new ones can be configured. For example, the following code creates a red button at location y=30.

    + +

    The syntax for the default option is , where is the name of any GS object. The special keywords or which denote button, radio button, and check button can be used.

    +

    The semantics for the default option can be expressed as follows: If an object of kind is created and no value for is given, then use as the value. Only options of syntax can be given a default values. Default values may be inherited in several steps. In the following example, the button will show the text "Cancel".

    + +

    Default values are inherited so that changed default values only affect new objects, not existing objects.

    +

    Default values only have meaning when creating child objects, since objects which cannot have children cannot have default options. An example is buttons.

    +

    The following example illustrates how default options can be used:

    + + + Example of Default Options + + +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter7.xml erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter7.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter7.xml 2007-11-26 19:03:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter7.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,65 +0,0 @@ - - - - -
    - - 2000 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - The Packer - - - - -
    - -
    - The Packer -

    This section describes the geometry manager in GS.

    -

    When the user resizes a window, the application normally has to resize and move the graphical objects in the window to fit its new size. This can be handled by a so called packer or geometry manager. In GS, the packer functionality is a property of the object. A frame with the packer property may control the size and position of its children.

    -

    A packer frame organises its children according to a grid pattern of rows and columns. Each row or column has a stretching property associated to it. Some columns may expand more than others and some may have a fixed size. The grid pattern is in itself invisible, but the objects contained by it snap to fit the grid.

    -

    The packer controlled by the following options:

    -

    Frame options:

    where is list() of - , and

    where is list() of - .

    -

    is:

    where is integer() > 0, or





    -

    A is a relative number that specifies how much of the total space of the frame a row or column will get. If the frame has three columns with the weights 2, 1, 3 it tells the geometry manager that the first column should have 2/6, the second 1/6 and the third 3/6 of the space.

    -

    Note that giving a minimum or maximum width of one or more columns will change the relation and the way the space is divided.

    -

    Then the objects contained by the frame use the following options to position themselves in the grid:

    where is integer(), or

    -

    and

    where is integer(), or

    -

    or, the the following option is a convenient shorthand:

    -

    Consider the following example.

    - -

    It defines a frame with three columns where the second should be twice as wide as the other but no column should be smaller than 50 pixels wide. The frame has two rows where the first has a fixed height of 30 pixels and the last row is totally flexible. Three buttons are placed next to each other on the first row, and below them an editor. The editor covers all three columns.

    - - - -Frame with three columns - -

    The picture below illustrates what happens when the window is resized.

    - - - Resized Frame - -

    To repack the objects, the size of the packer frame has to be set explicitly. This is done by using the height and width options as usual. Since the packer frame controls the size of its children, using the standard x, y, width, height options, packer frames may be nested recursively.

    -

    The packer is very useful since it simplifies the programming. The programmer will not have to spend time fine tuning x, y, width, height of each object, since these options are handled by the frame.

    -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter7.xmlsrc erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter7.xmlsrc --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter7.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter7.xmlsrc 2009-11-20 13:34:07.000000000 +0000 @@ -0,0 +1,64 @@ + + + + +
    + + 20002009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + The Packer + + + + + gs_chapter7.xml +
    + +
    + The Packer +

    This section describes the geometry manager in GS.

    +

    When the user resizes a window, the application normally has to resize and move the graphical objects in the window to fit its new size. This can be handled by a so called packer or geometry manager. In GS, the packer functionality is a property of the object. A frame with the packer property may control the size and position of its children.

    +

    A packer frame organises its children according to a grid pattern of rows and columns. Each row or column has a stretching property associated to it. Some columns may expand more than others and some may have a fixed size. The grid pattern is in itself invisible, but the objects contained by it snap to fit the grid.

    +

    The packer controlled by the following options:

    +

    Frame options:

    where is list() of + , and

    where is list() of + .

    +

    is:

    where is integer() > 0, or





    +

    A is a relative number that specifies how much of the total space of the frame a row or column will get. If the frame has three columns with the weights 2, 1, 3 it tells the geometry manager that the first column should have 2/6, the second 1/6 and the third 3/6 of the space.

    +

    Note that giving a minimum or maximum width of one or more columns will change the relation and the way the space is divided.

    +

    Then the objects contained by the frame use the following options to position themselves in the grid:

    where is integer(), or

    +

    and

    where is integer(), or

    +

    or, the the following option is a convenient shorthand:

    +

    Consider the following example.

    + +

    It defines a frame with three columns where the second should be twice as wide as the other but no column should be smaller than 50 pixels wide. The frame has two rows where the first has a fixed height of 30 pixels and the last row is totally flexible. Three buttons are placed next to each other on the first row, and below them an editor. The editor covers all three columns.

    + + + +Frame with three columns + +

    The picture below illustrates what happens when the window is resized.

    + + + Resized Frame + +

    To repack the objects, the size of the packer frame has to be set explicitly. This is done by using the height and width options as usual. Since the packer frame controls the size of its children, using the standard x, y, width, height options, packer frames may be nested recursively.

    +

    The packer is very useful since it simplifies the programming. The programmer will not have to spend time fine tuning x, y, width, height of each object, since these options are handled by the frame.

    +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter8.xml erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter8.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter8.xml 2007-11-26 19:03:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter8.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,1691 +0,0 @@ - - - - -
    - - 2000 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Built-In Objects - - - - -
    - -
    - Overview -

    This section describes the built-in objects of the graphics interface. The following objects exist:

    - - Window - An ordinary window. - Button - A simple press button. - Checkbutton - A button with a check-mark indicator. - Radiobutton - A button with an indicator that has an only-one-selected-at-a-time property. - Label - Shows a text or bitmap. - Frame - A plain container object. It is used for logical and visual grouping of objects. - Entry - A one-line object for entering text. - Listbox - A list of text strings. - Canvas - A drawing area which contains light-weight objects such as rectangle, line, etc. - Menu - A collection of objects for constructing pull-down and pop-up menus. - Grid - An object for showing tables. A kind of multi-column listbox. - Editor - A multi-line text editor. - Scale - To select a value within a range. - -

    Some objects can act as container objects. The following table describes these relationships:

    - - - Objects - Valid Parents - - - window - window, gs - - - buttons, canvas, editor, entry, frame, grid, label, listbox, menubar, scale - frame, window - - - arc, image, line, oval, polygon, rectangle, text - canvas - - - menubutton - menubar, window, frame - - - gridline - grid - - - menuitem - menu - - - menu - menubutton, menuitem (with {itemtype, cascade}), window, frame (the last two are for pop-up menus) - - Relations Between Objects and Container Objects -
    -
    - -
    - Generic Options -

    Most objects have a common subset of options and will be referred to as generic options. They apply to most objects.

    - - - {Option,Value} - Default - Description - - - beep - <unspec> - A beep will sound. Applies to all objects. - - - {bg, Color} - <unspec> - Background color. Applies to objects which have a background color. - - - {data, Term} - [] - Always delivered with the event in the data field. Applies to all objects. - - - {default,Objecttype,{Key,Value}} - <unspec> - Applies to all container objects. Specifies the default value for an option for children of type Objecttype. - - - {enable, Bool} - true - Objects can be enabled or disabled. A disabled object cannot be clicked on, and text cannot be entered. Applies to buttons, menuitem, entry, editor, scale. - - - {font, Font} - <unspec> - Applies to all text related objects and the grid. - - - {fg, Color} - <unspec> - Foreground color. Applies to objects which have a foreground color. - - - flush - <unspec> - Ensures that front-end and back-end are synchronized. Applies to all objects. - - - {setfocus, Bool} - <unspec> - Set or remove keyboard focus to this object. Applies to objects which can receive keyboard events. - - Generic Options -
    -

    The following options apply to objects which can have a frame as parent. Coordinates are relative to the parent.

    - - - {Option,Value} - Default - Description - - - {cursor, Cursor} - parent - The appearance of the mouse cursor. - - - {height, Int} - <unspec> - The height in pixels. - - - {pack_x, Column|{StartColumn,EndColumn}} - <unspec> - Packing position. See The Packer section. - - - {pack_y, row|{Startrow,Endrow}} - <unspec> - Packing position. See The Packer section. - - - {pack_xy, {Column,row}} - <unspec> - Packing position. See The Packer section. - - - {width, Int} - <unspec> - The width in pixels. - - - {x, Int} - <unspec> - The x coordinate within the parent objects frame in pixels. 0 is to the left. - - - {y, Int} - <unspec> - The y coordinate in pixels. 0 is at the top. - - Generic Options (Frame as Parent) -
    - - - Config-Only - Description - - - lower - Lowers this object to the bottom in the visual hierarchy. - - - raise - Lowers this object in the visual hierarchy. - - Generic Config-Only Options -
    -

    The following table lists generic Read-Only options:

    - - - Read-Only - Return - Description - - - children - [ObjectId1, ..., ObjectIdN] - All children - - - {choose_font,Font} - Font - Return the font that is actually used if a particular font is given. - - - id - ObjectId - Return the object id for this object. Useful if the object is a named object. - - - {font_wh,{Font,Text}} - {Width,Height} - Return the size of a text in a specified font. It returns the size of the font that is actually chosen by the back-end. - - - type - Atom - The type of this object. - - - parent - ObjectId - The parent of this object. - - Generic Read-Only Options -
    - -
    - Generic Event Options -

    The table below lists all generic event options: -

    - - - {Option,Value} - Default - - - {buttonpress, Bool} - false - - - {buttonrelease, Bool} - false - - - {enter, Bool} - false - - - {leave, Bool} - false - - - {keypress, Bool} - false - - - {motion, Bool} - false - - Generic Event Options -
    -
    -
    - -
    - Window -

    The basic object is the window object. It is the most common container object. All graphical applications use at least one (top-level) window.

    - - - Empty Window titled "A Window". - -

    The following tables show all window specific options:

    - - - {Option,Value} - Default - Description - - - {bg, Color} - <unspec> - {R,G,B} or a color name - - - {configure,Bool} - false - Will generate a event when the window has been resized or moved. The field contains [Width,Height,X,Y|_] - - - {destroy,Bool} - true - Will generate a event when the window is destroyed from the window manager. All GS applications should handle this event. - - - {iconname, String} - <unspec> -   - - - {iconify, Bool} - false -   - - - {map, Bool} - false - Make it visible on the screen - - - {title, String} - <unspec> - The title of the window. The default is the internal widget name which is platform specific. - - Window Options -
    - - - Config-Only - Description - - - raise - Raise window on top of all other windows. - - - lower - Lower window to background. - - Window Config-Only Options -
    -

    The following example shows how to create a window and configure it to enable various events.

    - -
    - -
    - Button - - - Radio Buttons, Check Buttons, and Ordinary Button - -

    Buttons are the simplest and the most commonly used objects. You press them and get a click event. The following tables show the options for all button types.

    - - - {Option,Value} - Default - Description - - - {align, Align} - center - Text alignment within the frame. - - - {justify, left | center | right} - center - Justification is only valid when there are several lines of text. - - - {label, Label} - <unspec> - Text or image to show. - - - {select, Bool} - false - Check buttons and radio buttons. true means that the button is selected. - - - {underline, Int} - <unspec> - Underline character N to indicate a keyboard accelerator. - - - {group, Atom} - <unspec> - Radio button: only one per group is selected at one time. Check button: All in the same group are selected automatically. - - - {value, Atom} - <unspec> - Radio buttons only. Groups radio buttons together within a group. - - Options for all Button Types -
    - - - Config-Only - Description - - - flash - Flash button - - - invoke - Explicit button press. - - - toggle - Check buttons only. Toggles select value. - - Config-Only Options for all Button types -
    - - - Buttontype - Event - - - normal - {gs, itemId, click, Data, [Text| _]} - - - check - {gs, itemId, click, Data, [Text, Group, Bool | _]} - - - radio - {gs, itemId, click, Data, [Text, Group, Value | _]} - - >Events for all Button types -
    -

    Buttons and check buttons are simple to understand, radio buttons are more difficult. Each radio button has a group and a value option. The group option is used to group together two or more radio buttons. Normally, each radio button within a group has a unique value which means that only one radio button can be selected at a time. If two (or more) radio buttons share the same value and one of them is selected, then both will be selected and all others are de-selected. The following short example shows how to program radio button logic in a situation where two of them share the same value.

    - - - - Radio Button Group with Last Button Selected - -

    The example shown creates three radio buttons which are members of the same group. The default behavior is that all radio buttons created by the same process are members of the same group. Normally, only one in a group may be selected at the same time, but since we defined the value-option to have the same value for and , they will both be selected/de-selected simultaneously. The normal radio button group behavior is that all radio buttons within the same group have unique default values.

    -
    - -
    - Label - - - {Option,Value} - Default - Description - - - {align,Align} - center - How the text is aligned within the frame. - - - {justify,left|right|center} - left - How to justify several lines of text. - - - {label,Label} - <unspec> - Text or image to show. - - - {underline,Int} - <unspec> - Underline character N to indicate a keyboard accelerator. - - Label Options -
    -

    A label is a simple text field which is used to display text to the user. It is possible to have several lines of text by inserting newline '\ - ' characters between each line. The label object does not automatically adjust its size so that text will fit inside. This has to be done manually, or the text may be clipped at the edges.

    -
    - -
    - Frame -

    The frame object acts as a container for other objects. Its main use is to logically and visually group objects together. Grouped objects can then be moved, displayed, or hidden in one single operation.

    - - - {Option,Value} - Default - Description - - - {bw,Int} - <unspec> - Border width - - - {packer_x,PackList} - <unspec> - Makes the frame pack its children. See the packer section. - - - {packer_y,PackList} - <unspec> - Makes the frame pack its children. See the packer section. - - Frame Options -
    -

    It is possible to have frame objects within frame objects so that large hierarchical structures of objects can be created.

    -
    - -
    - Entry - - - Label and Entry Objects for User Input - - - - {Option,Value} - Default - Description - - - {justify, left|right|center} - left - Text justification in entry field. - - - {text, String} - <unspec> - Use this option to initially set some text, and to read the text. - - Entry Options -
    -

    Entrys are used to prompt the user for text input.

    - - - Config-Only - Description - - - {delete, {From, To}} - Deletes the characters within index {From,To}. - - - {delete, last} - Deletes the last character. - - - {delete, Index} - Deletes the character at position Index. - - - {insert, {Index, String}} - Inserts text at the specific character position. Index starts from 0. - - - {select, {From, To}} - Selects a range. - - - {select, clear} - De-selects selected text. - - Entry Config-Only Options -
    -

    A common usage of the entry object is to listen for the 'Return' key event and then read the text field. The following example shows a simple dialog which prompts the user for a name and returns the tuple when a name is entered, or if the cancel button is pressed.

    - -

    The program draws the dialog and waits for the user to either press the return key or click one of the buttons. It then reads the text option of the entry and returns the string to the client process.

    -
    - -
    - Listbox -

    A listbox is a list of labels with optional scroll bars attached. The user selects one or more predefined alternative entries. You can add and remove entries in the listbox. The first element in a listbox has index 0.

    - - - {Option,Value} - Default - Description - - - {hscroll, Bool | top | bottom} - true - Horizontal scroll bar. - - - {items, [String, String ... String]} - <unspec> - All items (entries) in the listbox. - - - {scrollbg, Color} - <unspec> - Foreground color of scroll bar. - - - {scrollfg, Color} - <unspec> - Background color of scroll bar. - - - {selectmode, single | multiple} - single - Controls if it is possible to have several items selected at the same time. - - - {vscroll, Bool | left | right} - true - Vertical scroll bar. - - Listbox Options -
    - - - Config-Only - Description - - - {add, {Index, String}} - Add an item at specified index. - - - {add, String} - Add an item last. - - - {change, {Index,String}} - Change one item. - - - clear - Delete all items. - - - {del, Index | {From, To}} - Delete an item at specified index, or all from index From to index To. - - - {see, Index} - Make the item at specified index visible. - - - {selection, Index | {From,To}| clear} - Select an item (highlight it). Clear erases the selection. - - Listbox Cinfig-only Options -
    - - - Read-Only - Return - Description - - - selection - ListOfStrings - Returns current selection. All selected item indices will be returned in a list. - - - size - Int - The number of items (entries) in the listbox. - - - {get, Index} - String - Returns item at specified index. - - Listbox Read-Only Options -
    - - - Event - - - {gs, ListBox, click, Data, [Index, Text,Bool | _]} - - - {gs, ListBox, doubleclick, Data, [Index, Text,Bool | _]} - - Listbox Events -
    -

    is true if object is selected, false if de-selected.

    -

    Note that and are two discrete events: if you have subscribed to both, you will receive both a event and a event when double-clicking on one item (since two rapid clickings are regarded as both a and a ). The subscription of events does result in the events being unsubscribed!

    -

    The following example shows a simple application which prompts the user for a text item. The user has the following options:

    - - browse the items and then double-click the required item - type the name into the entry field and then press the Return key - select the required item and then click the OK button. - - - - -Simple Browser Dialog - - -
    - -
    - Canvas -

    The canvas object is a simple drawing area. The user can draw graphical objects and move them around the drawing area. The canvas also has optional scroll bars which can be used to scroll the drawing area. The graphical objects that can be created on a canvas object are:

    - - arc - image - line - oval - polygon - rectangle - text. - -

    These objects must have a canvas object as a parent, but they are otherwise similar to all other basic objects. The following tables show the options which apply to canvas objects.

    - - - {Option,Value} - Default - Description - - - {bg, Color} - <unspec> - Color of the drawing area. - - - {hscroll, Bool | top | bottom} - false - Horizontal scroll bar. - - - {scrollbg, Color} - <unspec> - Foreground color of scroll bar. - - - {scrollfg, Color} - <unspec> - Background color of scroll bar. - - - {scrollregion, {X1,Y1,X2,Y2}} - <unspec> - The size of the drawing area to be scrolled. - - - {vscroll, Bool | left | right} - false - Vertical scroll bar. - - Canvas Options -
    - - - Read-Only - Return - Description - - - {hit, {X,Y}} - list of ObjectId - Returns the canvas objects at X,Y. - - - {hit, [{X1,Y1},{X2,Y2}]} - list of ObjectId - Returns the canvas objects which are hit by the rectangle. - - Canvas Read-Only Options -
    -

    Canvas objects have the same types of events as other objects. The following Config-Only options also apply to canvas objects:

    - - - Config-Only - Description - - - lower - Lowers the object. - - - {move, {Dx, Dy}} - Moves object relative to its current position. - - - raise - Raises the object above all other objects. - - Canvas Config-Only Options -
    -

    The following sections describe the graphical objects which can be drawn on a canvas object.

    - -
    - The Canvas Arc Object -

    The canvas arc object is defined within a rectangle and is drawn from a start angle to the extent angle. Origo is in the center of the rectangle.

    - - - Canvas Arc Object - - - - - {Option,Value} - Default - Description - - - {bw, Int} - 1 - Defines the width. - - - {coords, [{X1,Y1},{X2,Y2}]} -   - Defines a rectangle to draw the arc within. - - - {extent, Degrees} -   -   - - - {fg, Color} -   -   - - - {fill, Color|none} - none - Defines fill color of arc object. - - - {start, Degrees} -   -   - - - {style, arc} -   - No line segments. - - - {style, chord} -   - A single line segment connects the two end points of the perimeter section. - - - {style, pieslice} - This Style - Two lines are drawn between the center of the oval and each end of the perimeter section. - - Canvas Arc Options -
    -
    - -
    - The Canvas Image Object -

    The canvas image object displays images and moves them around in a simple way. The currently supported image formats are bitmap and gif.

    - - - Canvas Image Object - - - - - {Option,Value} - Default - Description - - - {anchor, Anchor} - nw - Anchor reference specified by {X,Y} . - - - {bg, Color} - <unspec> - Background color. Pixel value 0. - - - {bitmap, FileName} - <unspec> - A bitmap file which contains a bmp bitmap. - - - {coords, [{X,Y}]} - <unspec> - Position on the canvas. - - - {fg, Color} - <unspec> - Foreground color. Pixel value 1. - - - {load_gif, FileName} - <unspec> - Loads a gif image. - - Canvas Image Object Options -
    -
    - -
    - The Canvas Line Object - - - Line Object Drawn on a Canvas - - - - - {Option,Value} - Default - Description - - - {arrow, both | none | first | last} - none - Draws arrows at the end points of the line. - - - {coords, [{X1,Y1},{X2,Y2}, ... {Xn,Yn}]} - <unspec> - A list of coordinates. The line will be drawn between all pairs in the list. - - - {fg, Color} - <unspec> - The color of the line. - - - {smooth, Bool} - false - Smoothing with Bezier splines. - - - {splinesteps, Int} - <unspec> -   - - - {width, Int} - 1 - The width of the line. - - Canvas Line Object Options -
    -
    - -
    - The Canvas Oval Object - - - Oval Object Drawn on a Canvas - - - - - {Option,Value} - Default - Description - - - {bw, Int} - 1 - Width. - - - {coords, [{X1,Y1},{X2,Y2}]} - <unspec> - Bounding rectangle which defines shape of object. - - - {fg, Color} -   -   - - - {fill, Color|none} - none - Object fill color. - - Canvas Oval Object Options -
    -
    - -
    - The Canvas Polygon Object - - - Canvas Polygon Object - - - - - {Option,Value} - Default - Description - - - {bw, Int} - 1 - Width. - - - {coords, [{X1,Y1},{X2,Y2} | {Xn,Yn}]} - <unspec> - Defines all points in the polygon. There may be any number of points in the polygon. - - - {fg, Color} - black - The color of the polygon outline. - - - {fill, Color|none} - none -   - - - {smooth, Bool} - false - Smoothing with Bezier splines. - - - {splinesteps, Int} - <unspec> -   - - Canvas Polygon Object Options -
    -
    - -
    - The Canvas Rectangle Object - - - Rectangle Object Created on a Canvas - - - - - {Option,Value} - Default - Description - - - {bw, Int} - 1 - The width of the border line. - - - {coords, [{X1,Y1},{X2,Y2}]} - <unspec> - Defines rectangle coordinates. - - - {fg, Color} - <unspec> - The color of the border line. - - - {fill, Color|none} - none - Fill color of rectangle. - - Canvas Rectangle Object Options -
    -
    - -
    - The Canvas Text Object - - - Canvas Text Object - - - - - {Option,Value} - Default - Description - - - {anchor, Anchor} - nw - Anchor reference specified by {X,Y}. - - - {coords, [{X, Y}]} - <unspec> - Position in the canvas. - - - {fg, Color} - <unspec> - Text color (background color is the canvas color). - - - {justify, left | center | right} - <unspec> - Tex justification. Only valid with several lines of text. - - - {text, String} - <unspec> - The text string to display. - - - {width, Int} -   - The width in pixels. The text will be wrapped into several lines to fit inside the width. - - Canvas Text Object Options -
    -
    -
    - -
    - Menu -

    Menus consist of four object types:

    - - the menu bar - the menu button - the menu - the menu item. - - -
    - Menu Bar -

    The menu bar is a simple object. It is placed at the top of the window and contains menu items. {x,y} or width cannot be controlled since, by definition, the menu bar is placed at the top of the window.

    - - - {Option,Value} - Default - Description - - - <only generic options> -   -   - - Menu Bar Options -
    -
    - -
    - Menu Button -

    The menu button displays a menu when pressed. The width of the menu button is automatically determined by the size of the text.

    - - - {Option,Value} - Default - Description - - - {align, Align} - center - Text alignment within the frame. - - - {justify, left | center | right} - center - Justification is only valid when there are several lines of text. - - - {label,{text,Text}} - <unspec> -   - - - {side, left | right} - <unspec> - Placement on the menu bar. The menu button created first will have the left/right position. - - - {underline, Int} - <unspec> - Underline character N to indicate an keyboard accelerator. - - Menu Button Options -
    -
    - -
    - Menu -

    The menu contains menu items, which are displayed vertically. Its width is automatically determined by the width of the menu items it contains.

    - - - {Option,Value} - Default - Description - - - {selectcolor, Color} - <unspec> - The indicator color of radio buttons and check buttons. - - Menu Options -
    - - - Config-Only - Description - - - {post_at,{X,Y}} - Displays the menu as a pop-up menu at {X,Y} (coordinate system of the parent). - - Menu Config-Only Options -
    -
    - -
    - Menu Item -

    The menu item is an object of its own. It can send events when the user selects it.

    - - - {Option,Value} - Default - Description - - - {group, Atom} - <unspec> - For {type, radio|check}. - - - {itemtype, type} - normal - The type of this item. Cannot be reconfigured. - - - {label, {text,Text}} - <unspec> - The text of the item. - - - {underline, Int} - <unspec> - Underline character N to indicate an keyboard accelerator. - - - {value, Atom} - <unspec> -   - - Menu Item Options -
    -

    - - - itemtype - Event - - - normal - {gs, itemId, click, Data, [Text, Index | _]} - - - check - {gs, itemId, click, Data, [Text, Index, Group, Bool| _]} - - - radio - {gs, itemId, click, Data, [Text, Index, Group, Value| _]} - - Menu Item Events -
    - - - Read-Only - Return - Description - - - index - Int - Index in the menu. Starts counting from 0. - - Menu Item Read-Only Options -
    -
    - -
    - Menu Demo - - - Simple Menu - -

    The following example shows a short demo of the menus:

    - -
    -
    - -
    - Grid -

    The grid object is similar to the listbox object. The main difference is that the grid is a multi-column object which is used to display tables. If needed, the grid can send click events when a user presses the mouse button in a table cell. Although the grid has a behavior which is similar to the listbox, the programming is somewhat different. The data in a table cell is represented as a pure object and can be treated as such. This object is called a grid line. It is located at a row in the parent grid. If a grid line is clicked, it sends an event to its owner.

    - -
    - Grid Line - - - {Option,Value} - Default - Description - - - {{bg, Column},Color} - <unspec> - The background color of a cell. - - - {bg, {Column,Color}} - <unspec> - Equivalent to {{bg, Column},Color}. - - - {bg, Color} - <unspec> - The background color of all cells. - - - {click, Bool} - true - Turns click events on/off. - - - {doubleclick, Bool} - false - Turns double-click events on/off. - - - {{fg, Column},Color} - <unspec> - The foreground color of a cell. - - - {fg, {Column,Color}} - <unspec> - Equivalent to {{fg, Column},Color} - - - {fg,Color} - <unspec> - The foreground color of all cells. - - - {text, {Column,Text}} - <unspec> - The text in the cell. - - - {{text, Column},Text} - <unspec> - Equivalent to {text,{Column,Text}}. - - - {text,Text} - <unspec> - The text for all cells. - - - {row, {row}} - <unspec> - The grid row. Must not be occupied by another grid line. - - Grid Line Options -
    - - - Event - - - {gs, GridLineId, click, Data, [Col, row, Text | _]} - - - {gs, GridLineId, doubleclick, Data, [Col, row, Text | _]} - - Gride Line Events -
    -
    - -
    - Grid - - - {Option,Value} - Default - Description - - - {font,Font} - <unspec> - A "global" grid font. - - - {hscroll, Bool|top|bottom} - true - Horizontal scroll bar. - - - {vscoll, Bool|left|right} - true - Vertical scroll bar. - - - {rows, {Minrow,Maxrow}} - <unspec> - The rows which are currently displayed. - - - {columnwidths, [WidthCol1,WidthCol2, ..., WidthColN}} - <unspec> - Defines the number of columns and their widths in coordinates. The size of the columns can be reconfigured, but not the number of columns. - - - {fg, Color} - <unspec> - The color of the grid pattern and the text. - - - {bg, Color} - <unspec> - The background color. - - Grid Options -
    - - - Read-Only - Return - Description - - - {obj_at_row, row} - Object |undefined - The grid line at row. - - Grid Read-Only Options -
    -

    The rows and columns start counting at 1.

    -
    - -
    - Grid Demo - - - Simple Grid - -

    The following simple example shows how to use the grid.

    - -
    -
    - -
    - Editor -

    The editor object is a simple text editor.

    - - - {Option,Value} - Default - Description - - - {hscroll, Bool | top | bottom} - false - Horizontal scroll bar. - - - {insertpos,{row,Col}} - <unspec> - The position of the cursor. - - - {insertpos,'end'} - <unspec> - The position of the cursor. - - - {justify, left| right| center} - left - Text justification. - - - {scrollbg, Color} - <unspec> - Background color of scroll bar. - - - {scrollfg, Color} - <unspec> - Foreground color of scroll bar. - - - {selection, {FromIndex,ToIndex}} - <unspec> - The text range that is currently selected. - - - {vscroll, Bool | left | right} - false - Vertical scroll bar. - - - {vscrollpos, row} - <unspec> - The top most visible row in the editor. - - - {wrap, none|char | word} - none - How to wrap text when the line is full. - - Editor Options -
    - - - Config-Only - Description - - - clear - Clears the editor. - - - {del, {FromIndex, ToIndex}}} - Deletes text. - - - {fg, {{FromIndex,ToIndex},Color}} - Sets the foreground color of a range of text. - - - {load, FileName} - Read FileName into the editor. - - - {insert, {Index, Text}} - Inserts new text. - - - {overwrite, {Index, Text}} - Writes new text at index. - - - {save, FileName} - Writes editor contents to file. - - Editor Config-Only Options -
    - - - Read-Only - Return - Description - - - char_height - Int - The height of the editor window measured in characters. - - - char_width - Int - The width of the editor window measured in characters. - - - {fg,Index} - Int - The foreground color of the text at Index. - - - {get,{FromIndex, ToIndex}} - Text - The text between the indices. - - - size - Int - The number of rows in the editor. - - Editor Read-Only Options -
    - - -
    - Editor Demo - - - Simple Editor - - -
    -
    - -
    - Scale -

    A scale object is used to select a value within a specified range.

    - - - {Option,Value} - Default - Description - - - {orient, vertical | horizontal} - horizontal - The orientation of the scale. - - - {pos, Int} - <unspec> - The current value of the scale objects within the range. - - - {range, {Min, Max}} - <unspec> - The value range. - - - {showvalue, Bool} - true - Turns showing of scale value on/off. - - - {text, String} - <unspec> - If specified, a label will be attached to the scale. - - Scale Object Options -
    - - - Event - - - {gs, Scale, click, Data, [Value | _]} - - Scale Object Options -
    -

    The following example prompts a user to specify an RGB-value for the background color of a window.

    - - - Scale Objects for Selecting RGB Values for a Window - - -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter8.xmlsrc erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter8.xmlsrc --- erlang-13.b.1-dfsg/lib/gs/doc/src/gs_chapter8.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/gs_chapter8.xmlsrc 2009-11-20 13:34:07.000000000 +0000 @@ -0,0 +1,1690 @@ + + + + +
    + + 20002009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Built-In Objects + + + + + gs_chapter8.xml +
    + +
    + Overview +

    This section describes the built-in objects of the graphics interface. The following objects exist:

    + + Window + An ordinary window. + Button + A simple press button. + Checkbutton + A button with a check-mark indicator. + Radiobutton + A button with an indicator that has an only-one-selected-at-a-time property. + Label + Shows a text or bitmap. + Frame + A plain container object. It is used for logical and visual grouping of objects. + Entry + A one-line object for entering text. + Listbox + A list of text strings. + Canvas + A drawing area which contains light-weight objects such as rectangle, line, etc. + Menu + A collection of objects for constructing pull-down and pop-up menus. + Grid + An object for showing tables. A kind of multi-column listbox. + Editor + A multi-line text editor. + Scale + To select a value within a range. + +

    Some objects can act as container objects. The following table describes these relationships:

    + + + Objects + Valid Parents + + + window + window, gs + + + buttons, canvas, editor, entry, frame, grid, label, listbox, menubar, scale + frame, window + + + arc, image, line, oval, polygon, rectangle, text + canvas + + + menubutton + menubar, window, frame + + + gridline + grid + + + menuitem + menu + + + menu + menubutton, menuitem (with {itemtype, cascade}), window, frame (the last two are for pop-up menus) + + Relations Between Objects and Container Objects +
    +
    + +
    + Generic Options +

    Most objects have a common subset of options and will be referred to as generic options. They apply to most objects.

    + + + {Option,Value} + Default + Description + + + beep + <unspec> + A beep will sound. Applies to all objects. + + + {bg, Color} + <unspec> + Background color. Applies to objects which have a background color. + + + {data, Term} + [] + Always delivered with the event in the data field. Applies to all objects. + + + {default,Objecttype,{Key,Value}} + <unspec> + Applies to all container objects. Specifies the default value for an option for children of type Objecttype. + + + {enable, Bool} + true + Objects can be enabled or disabled. A disabled object cannot be clicked on, and text cannot be entered. Applies to buttons, menuitem, entry, editor, scale. + + + {font, Font} + <unspec> + Applies to all text related objects and the grid. + + + {fg, Color} + <unspec> + Foreground color. Applies to objects which have a foreground color. + + + flush + <unspec> + Ensures that front-end and back-end are synchronized. Applies to all objects. + + + {setfocus, Bool} + <unspec> + Set or remove keyboard focus to this object. Applies to objects which can receive keyboard events. + + Generic Options +
    +

    The following options apply to objects which can have a frame as parent. Coordinates are relative to the parent.

    + + + {Option,Value} + Default + Description + + + {cursor, Cursor} + parent + The appearance of the mouse cursor. + + + {height, Int} + <unspec> + The height in pixels. + + + {pack_x, Column|{StartColumn,EndColumn}} + <unspec> + Packing position. See The Packer section. + + + {pack_y, row|{Startrow,Endrow}} + <unspec> + Packing position. See The Packer section. + + + {pack_xy, {Column,row}} + <unspec> + Packing position. See The Packer section. + + + {width, Int} + <unspec> + The width in pixels. + + + {x, Int} + <unspec> + The x coordinate within the parent objects frame in pixels. 0 is to the left. + + + {y, Int} + <unspec> + The y coordinate in pixels. 0 is at the top. + + Generic Options (Frame as Parent) +
    + + + Config-Only + Description + + + lower + Lowers this object to the bottom in the visual hierarchy. + + + raise + Lowers this object in the visual hierarchy. + + Generic Config-Only Options +
    +

    The following table lists generic Read-Only options:

    + + + Read-Only + Return + Description + + + children + [ObjectId1, ..., ObjectIdN] + All children + + + {choose_font,Font} + Font + Return the font that is actually used if a particular font is given. + + + id + ObjectId + Return the object id for this object. Useful if the object is a named object. + + + {font_wh,{Font,Text}} + {Width,Height} + Return the size of a text in a specified font. It returns the size of the font that is actually chosen by the back-end. + + + type + Atom + The type of this object. + + + parent + ObjectId + The parent of this object. + + Generic Read-Only Options +
    + +
    + Generic Event Options +

    The table below lists all generic event options: +

    + + + {Option,Value} + Default + + + {buttonpress, Bool} + false + + + {buttonrelease, Bool} + false + + + {enter, Bool} + false + + + {leave, Bool} + false + + + {keypress, Bool} + false + + + {motion, Bool} + false + + Generic Event Options +
    +
    +
    + +
    + Window +

    The basic object is the window object. It is the most common container object. All graphical applications use at least one (top-level) window.

    + + + Empty Window titled "A Window". + +

    The following tables show all window specific options:

    + + + {Option,Value} + Default + Description + + + {bg, Color} + <unspec> + {R,G,B} or a color name + + + {configure,Bool} + false + Will generate a event when the window has been resized or moved. The field contains [Width,Height,X,Y|_] + + + {destroy,Bool} + true + Will generate a event when the window is destroyed from the window manager. All GS applications should handle this event. + + + {iconname, String} + <unspec> +   + + + {iconify, Bool} + false +   + + + {map, Bool} + false + Make it visible on the screen + + + {title, String} + <unspec> + The title of the window. The default is the internal widget name which is platform specific. + + Window Options +
    + + + Config-Only + Description + + + raise + Raise window on top of all other windows. + + + lower + Lower window to background. + + Window Config-Only Options +
    +

    The following example shows how to create a window and configure it to enable various events.

    + +
    + +
    + Button + + + Radio Buttons, Check Buttons, and Ordinary Button + +

    Buttons are the simplest and the most commonly used objects. You press them and get a click event. The following tables show the options for all button types.

    + + + {Option,Value} + Default + Description + + + {align, Align} + center + Text alignment within the frame. + + + {justify, left | center | right} + center + Justification is only valid when there are several lines of text. + + + {label, Label} + <unspec> + Text or image to show. + + + {select, Bool} + false + Check buttons and radio buttons. true means that the button is selected. + + + {underline, Int} + <unspec> + Underline character N to indicate a keyboard accelerator. + + + {group, Atom} + <unspec> + Radio button: only one per group is selected at one time. Check button: All in the same group are selected automatically. + + + {value, Atom} + <unspec> + Radio buttons only. Groups radio buttons together within a group. + + Options for all Button Types +
    + + + Config-Only + Description + + + flash + Flash button + + + invoke + Explicit button press. + + + toggle + Check buttons only. Toggles select value. + + Config-Only Options for all Button types +
    + + + Buttontype + Event + + + normal + {gs, itemId, click, Data, [Text| _]} + + + check + {gs, itemId, click, Data, [Text, Group, Bool | _]} + + + radio + {gs, itemId, click, Data, [Text, Group, Value | _]} + + >Events for all Button types +
    +

    Buttons and check buttons are simple to understand, radio buttons are more difficult. Each radio button has a group and a value option. The group option is used to group together two or more radio buttons. Normally, each radio button within a group has a unique value which means that only one radio button can be selected at a time. If two (or more) radio buttons share the same value and one of them is selected, then both will be selected and all others are de-selected. The following short example shows how to program radio button logic in a situation where two of them share the same value.

    + + + + Radio Button Group with Last Button Selected + +

    The example shown creates three radio buttons which are members of the same group. The default behavior is that all radio buttons created by the same process are members of the same group. Normally, only one in a group may be selected at the same time, but since we defined the value-option to have the same value for and , they will both be selected/de-selected simultaneously. The normal radio button group behavior is that all radio buttons within the same group have unique default values.

    +
    + +
    + Label + + + {Option,Value} + Default + Description + + + {align,Align} + center + How the text is aligned within the frame. + + + {justify,left|right|center} + left + How to justify several lines of text. + + + {label,Label} + <unspec> + Text or image to show. + + + {underline,Int} + <unspec> + Underline character N to indicate a keyboard accelerator. + + Label Options +
    +

    A label is a simple text field which is used to display text to the user. It is possible to have several lines of text by inserting newline '\ + ' characters between each line. The label object does not automatically adjust its size so that text will fit inside. This has to be done manually, or the text may be clipped at the edges.

    +
    + +
    + Frame +

    The frame object acts as a container for other objects. Its main use is to logically and visually group objects together. Grouped objects can then be moved, displayed, or hidden in one single operation.

    + + + {Option,Value} + Default + Description + + + {bw,Int} + <unspec> + Border width + + + {packer_x,PackList} + <unspec> + Makes the frame pack its children. See the packer section. + + + {packer_y,PackList} + <unspec> + Makes the frame pack its children. See the packer section. + + Frame Options +
    +

    It is possible to have frame objects within frame objects so that large hierarchical structures of objects can be created.

    +
    + +
    + Entry + + + Label and Entry Objects for User Input + + + + {Option,Value} + Default + Description + + + {justify, left|right|center} + left + Text justification in entry field. + + + {text, String} + <unspec> + Use this option to initially set some text, and to read the text. + + Entry Options +
    +

    Entrys are used to prompt the user for text input.

    + + + Config-Only + Description + + + {delete, {From, To}} + Deletes the characters within index {From,To}. + + + {delete, last} + Deletes the last character. + + + {delete, Index} + Deletes the character at position Index. + + + {insert, {Index, String}} + Inserts text at the specific character position. Index starts from 0. + + + {select, {From, To}} + Selects a range. + + + {select, clear} + De-selects selected text. + + Entry Config-Only Options +
    +

    A common usage of the entry object is to listen for the 'Return' key event and then read the text field. The following example shows a simple dialog which prompts the user for a name and returns the tuple when a name is entered, or if the cancel button is pressed.

    + +

    The program draws the dialog and waits for the user to either press the return key or click one of the buttons. It then reads the text option of the entry and returns the string to the client process.

    +
    + +
    + Listbox +

    A listbox is a list of labels with optional scroll bars attached. The user selects one or more predefined alternative entries. You can add and remove entries in the listbox. The first element in a listbox has index 0.

    + + + {Option,Value} + Default + Description + + + {hscroll, Bool | top | bottom} + true + Horizontal scroll bar. + + + {items, [String, String ... String]} + <unspec> + All items (entries) in the listbox. + + + {scrollbg, Color} + <unspec> + Foreground color of scroll bar. + + + {scrollfg, Color} + <unspec> + Background color of scroll bar. + + + {selectmode, single | multiple} + single + Controls if it is possible to have several items selected at the same time. + + + {vscroll, Bool | left | right} + true + Vertical scroll bar. + + Listbox Options +
    + + + Config-Only + Description + + + {add, {Index, String}} + Add an item at specified index. + + + {add, String} + Add an item last. + + + {change, {Index,String}} + Change one item. + + + clear + Delete all items. + + + {del, Index | {From, To}} + Delete an item at specified index, or all from index From to index To. + + + {see, Index} + Make the item at specified index visible. + + + {selection, Index | {From,To}| clear} + Select an item (highlight it). Clear erases the selection. + + Listbox Cinfig-only Options +
    + + + Read-Only + Return + Description + + + selection + ListOfStrings + Returns current selection. All selected item indices will be returned in a list. + + + size + Int + The number of items (entries) in the listbox. + + + {get, Index} + String + Returns item at specified index. + + Listbox Read-Only Options +
    + + + Event + + + {gs, ListBox, click, Data, [Index, Text,Bool | _]} + + + {gs, ListBox, doubleclick, Data, [Index, Text,Bool | _]} + + Listbox Events +
    +

    is true if object is selected, false if de-selected.

    +

    Note that and are two discrete events: if you have subscribed to both, you will receive both a event and a event when double-clicking on one item (since two rapid clickings are regarded as both a and a ). The subscription of events does result in the events being unsubscribed!

    +

    The following example shows a simple application which prompts the user for a text item. The user has the following options:

    + + browse the items and then double-click the required item + type the name into the entry field and then press the Return key + select the required item and then click the OK button. + + + + +Simple Browser Dialog + + +
    + +
    + Canvas +

    The canvas object is a simple drawing area. The user can draw graphical objects and move them around the drawing area. The canvas also has optional scroll bars which can be used to scroll the drawing area. The graphical objects that can be created on a canvas object are:

    + + arc + image + line + oval + polygon + rectangle + text. + +

    These objects must have a canvas object as a parent, but they are otherwise similar to all other basic objects. The following tables show the options which apply to canvas objects.

    + + + {Option,Value} + Default + Description + + + {bg, Color} + <unspec> + Color of the drawing area. + + + {hscroll, Bool | top | bottom} + false + Horizontal scroll bar. + + + {scrollbg, Color} + <unspec> + Foreground color of scroll bar. + + + {scrollfg, Color} + <unspec> + Background color of scroll bar. + + + {scrollregion, {X1,Y1,X2,Y2}} + <unspec> + The size of the drawing area to be scrolled. + + + {vscroll, Bool | left | right} + false + Vertical scroll bar. + + Canvas Options +
    + + + Read-Only + Return + Description + + + {hit, {X,Y}} + list of ObjectId + Returns the canvas objects at X,Y. + + + {hit, [{X1,Y1},{X2,Y2}]} + list of ObjectId + Returns the canvas objects which are hit by the rectangle. + + Canvas Read-Only Options +
    +

    Canvas objects have the same types of events as other objects. The following Config-Only options also apply to canvas objects:

    + + + Config-Only + Description + + + lower + Lowers the object. + + + {move, {Dx, Dy}} + Moves object relative to its current position. + + + raise + Raises the object above all other objects. + + Canvas Config-Only Options +
    +

    The following sections describe the graphical objects which can be drawn on a canvas object.

    + +
    + The Canvas Arc Object +

    The canvas arc object is defined within a rectangle and is drawn from a start angle to the extent angle. Origo is in the center of the rectangle.

    + + + Canvas Arc Object + + + + + {Option,Value} + Default + Description + + + {bw, Int} + 1 + Defines the width. + + + {coords, [{X1,Y1},{X2,Y2}]} +   + Defines a rectangle to draw the arc within. + + + {extent, Degrees} +   +   + + + {fg, Color} +   +   + + + {fill, Color|none} + none + Defines fill color of arc object. + + + {start, Degrees} +   +   + + + {style, arc} +   + No line segments. + + + {style, chord} +   + A single line segment connects the two end points of the perimeter section. + + + {style, pieslice} + This Style + Two lines are drawn between the center of the oval and each end of the perimeter section. + + Canvas Arc Options +
    +
    + +
    + The Canvas Image Object +

    The canvas image object displays images and moves them around in a simple way. The currently supported image formats are bitmap and gif.

    + + + Canvas Image Object + + + + + {Option,Value} + Default + Description + + + {anchor, Anchor} + nw + Anchor reference specified by {X,Y} . + + + {bg, Color} + <unspec> + Background color. Pixel value 0. + + + {bitmap, FileName} + <unspec> + A bitmap file which contains a bmp bitmap. + + + {coords, [{X,Y}]} + <unspec> + Position on the canvas. + + + {fg, Color} + <unspec> + Foreground color. Pixel value 1. + + + {load_gif, FileName} + <unspec> + Loads a gif image. + + Canvas Image Object Options +
    +
    + +
    + The Canvas Line Object + + + Line Object Drawn on a Canvas + + + + + {Option,Value} + Default + Description + + + {arrow, both | none | first | last} + none + Draws arrows at the end points of the line. + + + {coords, [{X1,Y1},{X2,Y2}, ... {Xn,Yn}]} + <unspec> + A list of coordinates. The line will be drawn between all pairs in the list. + + + {fg, Color} + <unspec> + The color of the line. + + + {smooth, Bool} + false + Smoothing with Bezier splines. + + + {splinesteps, Int} + <unspec> +   + + + {width, Int} + 1 + The width of the line. + + Canvas Line Object Options +
    +
    + +
    + The Canvas Oval Object + + + Oval Object Drawn on a Canvas + + + + + {Option,Value} + Default + Description + + + {bw, Int} + 1 + Width. + + + {coords, [{X1,Y1},{X2,Y2}]} + <unspec> + Bounding rectangle which defines shape of object. + + + {fg, Color} +   +   + + + {fill, Color|none} + none + Object fill color. + + Canvas Oval Object Options +
    +
    + +
    + The Canvas Polygon Object + + + Canvas Polygon Object + + + + + {Option,Value} + Default + Description + + + {bw, Int} + 1 + Width. + + + {coords, [{X1,Y1},{X2,Y2} | {Xn,Yn}]} + <unspec> + Defines all points in the polygon. There may be any number of points in the polygon. + + + {fg, Color} + black + The color of the polygon outline. + + + {fill, Color|none} + none +   + + + {smooth, Bool} + false + Smoothing with Bezier splines. + + + {splinesteps, Int} + <unspec> +   + + Canvas Polygon Object Options +
    +
    + +
    + The Canvas Rectangle Object + + + Rectangle Object Created on a Canvas + + + + + {Option,Value} + Default + Description + + + {bw, Int} + 1 + The width of the border line. + + + {coords, [{X1,Y1},{X2,Y2}]} + <unspec> + Defines rectangle coordinates. + + + {fg, Color} + <unspec> + The color of the border line. + + + {fill, Color|none} + none + Fill color of rectangle. + + Canvas Rectangle Object Options +
    +
    + +
    + The Canvas Text Object + + + Canvas Text Object + + + + + {Option,Value} + Default + Description + + + {anchor, Anchor} + nw + Anchor reference specified by {X,Y}. + + + {coords, [{X, Y}]} + <unspec> + Position in the canvas. + + + {fg, Color} + <unspec> + Text color (background color is the canvas color). + + + {justify, left | center | right} + <unspec> + Tex justification. Only valid with several lines of text. + + + {text, String} + <unspec> + The text string to display. + + + {width, Int} +   + The width in pixels. The text will be wrapped into several lines to fit inside the width. + + Canvas Text Object Options +
    +
    +
    + +
    + Menu +

    Menus consist of four object types:

    + + the menu bar + the menu button + the menu + the menu item. + + +
    + Menu Bar +

    The menu bar is a simple object. It is placed at the top of the window and contains menu items. {x,y} or width cannot be controlled since, by definition, the menu bar is placed at the top of the window.

    + + + {Option,Value} + Default + Description + + + <only generic options> +   +   + + Menu Bar Options +
    +
    + +
    + Menu Button +

    The menu button displays a menu when pressed. The width of the menu button is automatically determined by the size of the text.

    + + + {Option,Value} + Default + Description + + + {align, Align} + center + Text alignment within the frame. + + + {justify, left | center | right} + center + Justification is only valid when there are several lines of text. + + + {label,{text,Text}} + <unspec> +   + + + {side, left | right} + <unspec> + Placement on the menu bar. The menu button created first will have the left/right position. + + + {underline, Int} + <unspec> + Underline character N to indicate an keyboard accelerator. + + Menu Button Options +
    +
    + +
    + Menu +

    The menu contains menu items, which are displayed vertically. Its width is automatically determined by the width of the menu items it contains.

    + + + {Option,Value} + Default + Description + + + {selectcolor, Color} + <unspec> + The indicator color of radio buttons and check buttons. + + Menu Options +
    + + + Config-Only + Description + + + {post_at,{X,Y}} + Displays the menu as a pop-up menu at {X,Y} (coordinate system of the parent). + + Menu Config-Only Options +
    +
    + +
    + Menu Item +

    The menu item is an object of its own. It can send events when the user selects it.

    + + + {Option,Value} + Default + Description + + + {group, Atom} + <unspec> + For {type, radio|check}. + + + {itemtype, type} + normal + The type of this item. Cannot be reconfigured. + + + {label, {text,Text}} + <unspec> + The text of the item. + + + {underline, Int} + <unspec> + Underline character N to indicate an keyboard accelerator. + + + {value, Atom} + <unspec> +   + + Menu Item Options +
    +

    + + + itemtype + Event + + + normal + {gs, itemId, click, Data, [Text, Index | _]} + + + check + {gs, itemId, click, Data, [Text, Index, Group, Bool| _]} + + + radio + {gs, itemId, click, Data, [Text, Index, Group, Value| _]} + + Menu Item Events +
    + + + Read-Only + Return + Description + + + index + Int + Index in the menu. Starts counting from 0. + + Menu Item Read-Only Options +
    +
    + +
    + Menu Demo + + + Simple Menu + +

    The following example shows a short demo of the menus:

    + +
    +
    + +
    + Grid +

    The grid object is similar to the listbox object. The main difference is that the grid is a multi-column object which is used to display tables. If needed, the grid can send click events when a user presses the mouse button in a table cell. Although the grid has a behavior which is similar to the listbox, the programming is somewhat different. The data in a table cell is represented as a pure object and can be treated as such. This object is called a grid line. It is located at a row in the parent grid. If a grid line is clicked, it sends an event to its owner.

    + +
    + Grid Line + + + {Option,Value} + Default + Description + + + {{bg, Column},Color} + <unspec> + The background color of a cell. + + + {bg, {Column,Color}} + <unspec> + Equivalent to {{bg, Column},Color}. + + + {bg, Color} + <unspec> + The background color of all cells. + + + {click, Bool} + true + Turns click events on/off. + + + {doubleclick, Bool} + false + Turns double-click events on/off. + + + {{fg, Column},Color} + <unspec> + The foreground color of a cell. + + + {fg, {Column,Color}} + <unspec> + Equivalent to {{fg, Column},Color} + + + {fg,Color} + <unspec> + The foreground color of all cells. + + + {text, {Column,Text}} + <unspec> + The text in the cell. + + + {{text, Column},Text} + <unspec> + Equivalent to {text,{Column,Text}}. + + + {text,Text} + <unspec> + The text for all cells. + + + {row, {row}} + <unspec> + The grid row. Must not be occupied by another grid line. + + Grid Line Options +
    + + + Event + + + {gs, GridLineId, click, Data, [Col, row, Text | _]} + + + {gs, GridLineId, doubleclick, Data, [Col, row, Text | _]} + + Gride Line Events +
    +
    + +
    + Grid + + + {Option,Value} + Default + Description + + + {font,Font} + <unspec> + A "global" grid font. + + + {hscroll, Bool|top|bottom} + true + Horizontal scroll bar. + + + {vscoll, Bool|left|right} + true + Vertical scroll bar. + + + {rows, {Minrow,Maxrow}} + <unspec> + The rows which are currently displayed. + + + {columnwidths, [WidthCol1,WidthCol2, ..., WidthColN}} + <unspec> + Defines the number of columns and their widths in coordinates. The size of the columns can be reconfigured, but not the number of columns. + + + {fg, Color} + <unspec> + The color of the grid pattern and the text. + + + {bg, Color} + <unspec> + The background color. + + Grid Options +
    + + + Read-Only + Return + Description + + + {obj_at_row, row} + Object |undefined + The grid line at row. + + Grid Read-Only Options +
    +

    The rows and columns start counting at 1.

    +
    + +
    + Grid Demo + + + Simple Grid + +

    The following simple example shows how to use the grid.

    + +
    +
    + +
    + Editor +

    The editor object is a simple text editor.

    + + + {Option,Value} + Default + Description + + + {hscroll, Bool | top | bottom} + false + Horizontal scroll bar. + + + {insertpos,{row,Col}} + <unspec> + The position of the cursor. + + + {insertpos,'end'} + <unspec> + The position of the cursor. + + + {justify, left| right| center} + left + Text justification. + + + {scrollbg, Color} + <unspec> + Background color of scroll bar. + + + {scrollfg, Color} + <unspec> + Foreground color of scroll bar. + + + {selection, {FromIndex,ToIndex}} + <unspec> + The text range that is currently selected. + + + {vscroll, Bool | left | right} + false + Vertical scroll bar. + + + {vscrollpos, row} + <unspec> + The top most visible row in the editor. + + + {wrap, none|char | word} + none + How to wrap text when the line is full. + + Editor Options +
    + + + Config-Only + Description + + + clear + Clears the editor. + + + {del, {FromIndex, ToIndex}}} + Deletes text. + + + {fg, {{FromIndex,ToIndex},Color}} + Sets the foreground color of a range of text. + + + {load, FileName} + Read FileName into the editor. + + + {insert, {Index, Text}} + Inserts new text. + + + {overwrite, {Index, Text}} + Writes new text at index. + + + {save, FileName} + Writes editor contents to file. + + Editor Config-Only Options +
    + + + Read-Only + Return + Description + + + char_height + Int + The height of the editor window measured in characters. + + + char_width + Int + The width of the editor window measured in characters. + + + {fg,Index} + Int + The foreground color of the text at Index. + + + {get,{FromIndex, ToIndex}} + Text + The text between the indices. + + + size + Int + The number of rows in the editor. + + Editor Read-Only Options +
    + + +
    + Editor Demo + + + Simple Editor + + +
    +
    + +
    + Scale +

    A scale object is used to select a value within a specified range.

    + + + {Option,Value} + Default + Description + + + {orient, vertical | horizontal} + horizontal + The orientation of the scale. + + + {pos, Int} + <unspec> + The current value of the scale objects within the range. + + + {range, {Min, Max}} + <unspec> + The value range. + + + {showvalue, Bool} + true + Turns showing of scale value on/off. + + + {text, String} + <unspec> + If specified, a label will be attached to the scale. + + Scale Object Options +
    + + + Event + + + {gs, Scale, click, Data, [Value | _]} + + Scale Object Options +
    +

    The following example prompts a user to specify an RGB-value for the background color of a window.

    + + + Scale Objects for Selecting RGB Values for a Window + + +
    +
    + Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/arc.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/arc.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/arc.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/arc.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/arc.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/arc.ps 1996-11-23 12:58:20.000000000 +0000 @@ -0,0 +1,1385 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/arc.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 353 338 460 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 411 string def + +% define space for color conversions +/grays 137 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 353 translate + +% size of image (on paper, in 1/72inch coords) +137.01600 106.99200 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +137 107 8 % dimensions of data +[137 0 0 -107 0 107] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000000000 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffffffffffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000000000 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080000080ffffff000080000080ffffff000080000080ffffff +ffffff000080ffffffffffff000080000080000080000080000080000080000080000080 +ffffff000080000080ffffff000080000080ffffffffffff000080ffffffffffff000080 +ffffffffffffffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffffffffff000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffffffffffffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffffffffffffffffffffffffffff000080ffffffffffff000080000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080ffffffffffff +000080000080000080000080ffffffffffffffffffffffff000080000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080ffffffffffff +000080000080000080000080ffffffffffffffffffffffff000080000080000080ffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080ffffffffffff +000080000080000080000080ffffffffffffffffffffffff000080000080000080000080 +ffffffffffffffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000000000 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffff737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373000000 +ffffff737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373000000000080000080ffffff737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000080000080000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/buttons.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/buttons.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/buttons.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/buttons.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/buttons.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/buttons.ps 1996-11-23 12:58:27.000000000 +0000 @@ -0,0 +1,6003 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/buttons.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 232 511 459 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 930 string def + +% define space for color conversions +/grays 310 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 232 translate + +% size of image (on paper, in 1/72inch coords) +310.03200 227.01600 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +310 227 8 % dimensions of data +[310 0 0 -227 0 227] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080ffffffffffff000080000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 +000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080ffffffffffff000080000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 +000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffffffffffffffff000080 +ffffffffffffffffffffffff000080000080ffffffffffffffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080000080ffffffffffffffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080000080ffffffffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080000080000080ffffffffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080ffffffffffffffffff000080000080ffffffffffff000080ffffff +000080ffffffffffff000080ffffffffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080ffffffffffff000080ffffffffffff000080000080000080ffffffffffff000080 +000080000080ffffffffffff000080000080ffffffffffffffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffffffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 +000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffff737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373000000ffffff737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373000000000080000080ffffff +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000080000080000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +ffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff828282828282828282828282828282 +828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff828282828282828282828282828282828282 +828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282 +828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282 +828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +ffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +828282b03060b03060828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +b03060b03060b03060b03060828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9828282828282828282b03060 +b03060b03060b03060b03060b03060828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9ffffffffffffffffffb03060b03060 +b03060b03060b03060b03060b03060b03060ffffffffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9ffffffffffffffffffb03060 +b03060b03060b03060b03060b03060ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffff +b03060b03060b03060b03060ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +ffffffb03060b03060ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff828282828282828282828282828282 +828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff828282828282828282828282828282828282 +828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282 +828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282 +828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 +b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffff828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex10.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex10.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex10.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex10.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex10.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex10.ps 1996-11-23 12:58:41.000000000 +0000 @@ -0,0 +1,6635 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex10.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 163 461 460 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 780 string def + +% define space for color conversions +/grays 260 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 163 translate + +% size of image (on paper, in 1/72inch coords) +259.99200 297.00000 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +260 297 8 % dimensions of data +[260 0 0 -297 0 297] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff000000000080000080ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000 +000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000 +000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080ffffffffffff000080ffffffffffffffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffffffffffffffffffffffffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffffffffffffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +ffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffffffffff000080000080000080000080ffffffffffff000080000080ffffffffffff +000080ffffffffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080000080 +000080ffffffffffffffffff000080000080ffffffffffffffffffffffffffffffffffff +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080000080 +000080000080ffffffffffffffffff000080ffffffffffff000080000080000080000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080ffffffffffff000080000080ffffffffffff000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +ffffffffffff000080000080000080000080ffffffffffffffffffffffff000080000080 +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000 +000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373000000ffffff737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373000000000080000080ffffff737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000080000080000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282ffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282ffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffff828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3ffffffffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffff828282 +828282828282828282828282828282828282828282828282828282828282828282c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffff828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffc3c3c3000000000000000000c3c3c3c3c3c3c3c3c3000000c3c3c3 +000000000000c3c3c3c3c3c3c3c3c3c3c3c3000000000000000000c3c3c3c3c3c3c3c3c3 +000000c3c3c3000000000000c3c3c3c3c3c3c3c3c3c3c3c3000000000000c3c3c3000000 +c3c3c3c3c3c3c3c3c3000000000000000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffff000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000000000 +c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3 +000000000000c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3000000000000 +c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffff000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3 +000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000 +c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffff000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000000000000000000000c3c3c3c3c3c3 +000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000 +c3c3c3c3c3c3000000000000000000000000000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffff000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3 +000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000 +c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffff000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3 +000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3000000000000 +c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffc3c3c3000000000000000000c3c3c3c3c3c3c3c3c3000000c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000000000000000000000c3c3c3c3c3c3 +000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000000000c3c3c3000000 +c3c3c3c3c3c3c3c3c3000000000000000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000000000000000c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffff757575757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +757575757575757575757575757575757575757575757575757575757575757575757575 +757575757575757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffff828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffff828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffff828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3ffffffc3c3c3ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffc3c3c3ffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +ffffffffffff828282c3c3c3ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff828282c3c3c3ffffffffffffffffffffffffc3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +ffffff828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffffffffffffffffffffffffff +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffffffffff +d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9ffffffffffff +ffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffffffffffd9d9d9d9d9d9 +d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ffffffffffffffffffffffffc3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffc3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282828282828282c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282828282828282d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffff828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282828282828282 +d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9828282828282 +828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffff828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282 +828282828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffff828282828282828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +828282828282828282c3c3c3ffffffffffff828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282c3c3c3ffffffffffff828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3828282c3c3c3ffffff828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282c3c3c3ffffff828282c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex11.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex11.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex11.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex11.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex11.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex11.ps 1996-11-23 12:58:51.000000000 +0000 @@ -0,0 +1,5873 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex11.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 238 511 460 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 930 string def + +% define space for color conversions +/grays 310 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 238 translate + +% size of image (on paper, in 1/72inch coords) +310.03200 221.97600 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +310 222 8 % dimensions of data +[310 0 0 -222 0 222] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080ffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080ffffffffffffffffffffffffffffff000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 +000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 +000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080000080 +000080000080ffffffffffff000080000080000080ffffffffffff000080000080ffffff +ffffffffffffffffff000080000080ffffff000080ffffffffffffffffff000080ffffff +ffffffffffff000080000080000080ffffffffffffffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffffffffffffffffffffff000080000080000080 +000080000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffffffffff000080000080000080000080000080 +000080000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080000080000080000080000080 +000080000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff +ffffffffffffffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080000080000080000080000080 +000080000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080000080000080000080000080 +000080000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080000080000080ffffffffffffffffffffffff000080000080 +ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff +ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 +000080000080ffffffffffffffffffffffffffffff000080000080000080000080ffffff +ffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080000080ffffffffffffffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 +000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffff737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373000000ffffff737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373000000000080000080ffffff +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000080000080000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffff828282828282828282828282828282828282828282828282828282828282828282 +828282828282ffffff828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff828282828282828282828282828282 +828282828282828282828282828282828282828282828282ffffff828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7f +ffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7f +ffff7fffff7fffff7fffff7fffff7fc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7f +ffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7f +ffff7fffff7fffff7fffff7fffff7fc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4 +ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4 +ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4 +ffff00ff6eb4ff6eb4ff6eb4ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ffff00 +ffff00ffff00ff6eb4ffff00ffff00ffff00ff6eb4ff6eb4ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4 +ffff00ff6eb4ff6eb4ff6eb4ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4 +ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4 +ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4 +ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4 +ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +ffffff828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ff6eb4ffff00ffff00ffff00ffff00ffff00 +ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4ff6eb4ffff00 +ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4 +ff6eb4ffff00ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4 +ff6eb4ff6eb4ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 +ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 +ffff7fffff7f999900999900999900999900999900999900999900999900999900999900 +999900999900999900999900999900999900999900999900999900999900999900999900 +999900999900999900999900999900c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex12.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex12.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex12.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex12.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex12.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex12.ps 1996-11-23 12:59:00.000000000 +0000 @@ -0,0 +1,4187 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex12.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 232 411 459 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 630 string def + +% define space for color conversions +/grays 210 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 232 translate + +% size of image (on paper, in 1/72inch coords) +210.02400 227.01600 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +210 227 8 % dimensions of data +[210 0 0 -227 0 227] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080000080ffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +000080ffffffffffffffffffffffff000080000080ffffffffffff000080ffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080ffffffffffff000080ffffffffffffffffff000080ffffffffffff +ffffffffffffffffffffffffffffff000080ffffffffffff000080ffffffffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff +000080000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff +000080000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080ffffffffffffffffff000080ffffffffffff +000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffff737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +000000ffffff737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373000000000080000080ffffff737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000080000080000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebebebebe000000 +000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000000000 +bebebebebebebebebe000000000000bebebebebebe000000000000000000000000000000 +000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000000000000000000000bebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebebebebe000000000000000000 +000000bebebebebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000000000000000000000000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebebebebe000000 +000000bebebebebebebebebe000000000000000000bebebebebebebebebe000000000000 +bebebebebebebebebe000000000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000bebebe000000 +000000bebebebebebebebebe000000000000000000bebebebebebebebebe000000000000 +000000bebebe000000000000000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebe000000000000000000bebebe000000000000bebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000bebebe000000 +000000bebebebebebe000000000000bebebe000000000000bebebebebebe000000000000 +000000bebebe000000000000000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebe000000000000000000bebebe000000000000bebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000000000 +000000bebebebebebe000000000000bebebe000000000000bebebebebebe000000000000 +000000000000000000000000000000bebebebebebe000000000000000000000000000000 +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000000000000000000000bebebebebebebebebe +000000000000000000000000000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebe000000000000000000000000000000000000bebebebebebe +000000000000000000000000000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebe000000000000 +000000bebebe000000000000bebebebebebebebebe000000000000bebebe000000000000 +bebebe000000bebebe000000000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebe000000000000bebebe000000000000000000bebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebe000000000000 +000000bebebe000000000000000000000000000000000000000000bebebe000000000000 +bebebe000000bebebe000000000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebe000000000000bebebe000000000000000000bebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebebebebe000000 +000000bebebe000000000000bebebebebebebebebe000000000000bebebe000000000000 +bebebebebebebebebe000000000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebebebebe000000 +000000bebebe000000000000bebebebebebebebebe000000000000bebebe000000000000 +bebebebebebebebebe000000000000bebebebebebe000000000000000000000000000000 +000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000bebebebebebebebebe000000000000000000 +000000bebebebebebebebebe000000000000bebebebebebe000000000000bebebebebebe +000000000000000000000000000000000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +828282828282828282828282828282828282828282828282828282828282828282828282 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffff828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe +bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +000000000000000000bebebebebebebebebebebebe000000000000000000bebebebebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe +bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000000000bebebebebebebebebebebebe000000 +bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe +bebebebebebebebebebebebe000000000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebe000000bebebe000000bebebe +bebebebebebebebebe000000000000bebebe000000bebebebebebebebebe000000000000 +000000bebebebebebebebebe000000000000bebebe000000bebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000bebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebe000000bebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebe000000bebebe000000bebebe +bebebebebebe000000bebebebebebe000000000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebe000000bebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebe000000bebebe000000bebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebe000000bebebebebebebebebebebebebebebe000000000000bebebebebebe +bebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe000000000000 +000000000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe +bebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000000000 +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +000000bebebebebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe +bebebe000000000000000000000000000000000000bebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebe000000bebebebebebe000000000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 +bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebebebebe000000000000bebebe000000bebebebebebebebebe000000000000 +000000000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000000000000000000000bebebebebebe000000 +000000000000000000000000bebebebebebebebebe000000000000000000bebebebebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000bebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe +000000000000000000bebebebebebebebebebebebe000000000000000000bebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebe000000000000bebebebebebe000000 +bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe +bebebebebebe000000000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe +bebebebebebebebebe000000000000000000bebebebebebebebebebebebe000000000000 +000000bebebebebebebebebe000000000000000000000000000000bebebebebebebebebe +000000000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebe000000bebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe +bebebe000000bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000bebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebe000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebe000000000000000000000000000000bebebebebebebebebe000000000000 +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +000000000000000000000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebebebebe +bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000000000000000000000000000bebebebebebe +bebebebebebebebebe000000bebebebebebebebebe000000bebebebebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebe000000 +bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000bebebe +bebebebebebebebebe000000000000000000bebebebebebebebebebebebe000000000000 +000000000000bebebebebebebebebebebebebebebe000000000000bebebebebebebebebe +000000000000000000000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe +000000000000000000bebebebebebebebebe000000000000000000000000000000bebebe +bebebe000000000000000000000000000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +828282828282828282828282828282828282828282828282828282828282828282828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffff828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000000000 +bebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebe000000000000000000bebebebebebe +bebebebebebe000000000000000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe +bebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000000000bebebebebebebebebebebebebebebe +bebebebebebe000000000000bebebebebebe000000bebebebebebebebebe000000bebebe +bebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe +bebebebebebe000000bebebe000000000000bebebebebebebebebebebebe000000000000 +000000bebebebebebebebebe000000000000bebebe000000bebebebebebebebebebebebe +000000000000000000bebebebebebebebebebebebe000000000000000000bebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000bebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe +bebebebebebe000000000000bebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebe000000 +bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +000000bebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe +bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 +bebebebebebebebebe000000bebebebebebebebebebebebe000000000000bebebebebebe +bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe +000000000000000000000000bebebebebebebebebe000000000000000000bebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebe000000 +bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 +000000000000000000000000000000bebebebebebebebebebebebebebebe000000bebebe +bebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebe000000 +bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe +bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe000000000000 +000000bebebebebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe +000000000000000000000000bebebebebebebebebe000000000000000000bebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000000000000000000000bebebebebebebebebe +bebebebebebebebebe000000bebebebebebebebebe000000000000000000bebebebebebe +bebebe000000000000000000000000000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000bebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000000000bebebebebebebebebebebebe +bebebe000000000000bebebebebebebebebe000000000000000000000000000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe +000000bebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe +bebebebebebebebebe000000000000000000bebebebebebebebebe000000bebebe000000 +000000bebebebebebebebebebebebe000000000000bebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe +000000bebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000000000bebebe +bebebe000000bebebebebebe000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe +000000bebebebebebe000000bebebebebebebebebebebebebebebe000000bebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000bebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe +000000bebebebebebe000000bebebebebebebebebebebebebebebe000000bebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe +000000bebebebebebe000000bebebebebebebebebebebebebebebe000000bebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe +000000bebebebebebe000000bebebebebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe +000000bebebebebebe000000bebebebebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000bebebe +bebebebebebebebebe000000000000000000bebebebebebebebebe000000bebebebebebe +bebebe000000bebebebebebebebebe000000000000bebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000000000bebebebebebebebebebebebe +bebebe000000000000bebebebebebebebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebe000000000000000000bebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000000000bebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebe000000bebebebebebe +bebebebebebebebebe000000000000000000bebebebebebebebebe000000bebebe000000 +000000bebebebebebebebebebebebe000000000000bebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000bebebe000000bebebebebebebebebebebebe000000 +bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000000000bebebe +bebebe000000bebebebebebe000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebe000000bebebebebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebebebebe000000bebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebe +bebebe000000bebebebebebe000000bebebebebebe000000000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 +bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebe +bebebe000000bebebebebebebebebe000000000000bebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000000000000000000000bebebebebebe000000 +000000000000000000000000bebebebebebe000000000000000000000000000000bebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebe000000000000000000bebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000000000 +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebe000000000000000000bebebebebebe +bebebebebebe000000000000000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebe000000000000bebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebebebebebebebe000000bebebe +bebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe000000000000 +000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebe000000bebebe000000bebebebebebe000000 +bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000bebebe +bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebebebebe000000bebebebebebe +bebebebebebebebebe000000000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe +bebebebebebebebebe000000bebebe000000bebebebebebebebebebebebe000000000000 +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe +bebebebebebebebebe000000bebebe000000bebebebebebebebebe000000bebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebe000000000000000000000000000000000000bebebebebebe +bebebe000000bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebe +bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe +bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000bebebebebebe +bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe +bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe +bebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000000000 +bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe000000000000 +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebe000000 +000000000000000000000000bebebebebebe000000000000000000000000000000bebebe +bebebebebebe000000000000000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe +bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffc3c3c3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffc3c3c3ffffffffffffc3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff828282c3c3c3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff828282c3c3c3ffffffffffffffffffffffffc3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffffffff828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffffffffffffffffffff +ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3ffffffffffffffffffffffffd9d9d9828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9ffffff +ffffffffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff +ffffffffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffc3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3ffffffffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffc3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3828282828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3828282828282828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282828282828282c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282 +828282828282828282d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9828282828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3828282828282828282828282d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9828282 +828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3828282828282828282828282828282c3c3c3ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffff828282828282828282 +828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282828282c3c3c3ffffffffffff828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282c3c3c3ffffffffffff828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3ffffff828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282c3c3c3ffffff828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex13.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex13.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex13.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex13.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex13.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex13.ps 1996-11-23 12:59:07.000000000 +0000 @@ -0,0 +1,2369 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex13.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 334 411 460 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 630 string def + +% define space for color conversions +/grays 210 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 334 translate + +% size of image (on paper, in 1/72inch coords) +210.02400 126.00000 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +210 126 8 % dimensions of data +[210 0 0 -126 0 126] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080ffffff000080ffffffffffffffffff000080ffffffffffffffffff +000080000080000080ffffffffffffffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffffffffff +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffffffffffffffffffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080000080000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080ffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080000080ffffffffffffffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffff737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +000000ffffff737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373000000000080000080ffffff737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000080000080000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffff828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffff828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8ed9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8e8e8e8e +8e8e8ed9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8e8e8e8e +8e8e8e8e8e8ed9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8eececec +ececec8e8e8e8e8e8e8e8e8ed9d9d9ffffffffffffffffffecececececececececececec +ecececececececececececec828282828282ecececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8eececec +ececececececffffffffffffffffffffffffffffffffffffecececececececececececec +ececececececececec828282828282828282828282ececececececececececececececec +ececececececececec000000000000000000000000ececececececececececececececec +ececececececececececececececececececececececececececec000000ecececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8eececec +ecececffffffffffffffffffd9d9d9ffffffffffffffffffecececececececececececec +ecececececec828282828282828282828282828282828282ecececececececececececec +ececececececececec000000ececececececececec000000ecececececececececececec +ececececececececececececececececececececececececececec000000ecececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8effffff +ffffffffffffd9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec +ececec828282828282828282b03060b03060828282828282828282ececececececececec +ececececececececec000000ececececececececec000000ececececececececec000000 +000000000000ecececececececececececec000000000000ececec000000ecececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8effffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec +828282828282828282b03060b03060b03060b03060828282828282828282ecececececec +ececececececececec000000ececececececececec000000ecececececec000000ececec +ecececececec000000ecececececec000000ecececececec000000000000ecececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8effffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffececececececececec828282 +828282828282b03060b03060b03060b03060b03060b03060828282828282828282ececec +ececececececececec000000000000000000000000ececececececececec000000ececec +ecececececec000000ecececececec000000ececececececececec000000ecececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffececececececffffffffffff +ffffffb03060b03060b03060b03060b03060b03060b03060b03060ffffffffffffffffff +ececececececececec000000ecececececec000000ececececececececec000000000000 +000000000000000000ecececececec000000ececececececececec000000ecececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececffffff +ffffffffffffb03060b03060b03060b03060b03060b03060ffffffffffffffffffececec +ececececececececec000000ececececececececec000000ecececececec000000ececec +ececececececececececececececec000000ececececececececec000000ecececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec +ffffffffffffffffffb03060b03060b03060b03060ffffffffffffffffffecececececec +ececececececececec000000ececececececececec000000ecececececec000000ececec +ecececececec000000ecececececec000000ecececececec000000000000ecececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec +ecececffffffffffffffffffb03060b03060ffffffffffffffffffececececececececec +ececececececececec000000ececececececececec000000ececececececececec000000 +000000000000ecececececececececececec000000000000ececec000000ecececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffff828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282ffffffffffffffffffecececececececececececec +ececececececffffffffffffffffffffffffffffffffffffecececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffff828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282ffffffffffffffffffecececececececececececec +ecececececececececffffffffffffffffffffffffececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffffffffecececececececececececec +ececececececececececececffffffffffffecececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffffffffecececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ecececececececececececececececececececececececececececececececececececec +ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffffffff8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e +8e8e8e8e8e8e8e8e8e8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9ffffffffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffff +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9ffffffffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffff +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffffffffff828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ffffff828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex14.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex14.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex14.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex14.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex14.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex14.ps 1996-11-23 12:59:15.000000000 +0000 @@ -0,0 +1,11546 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex14.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 132 611 459 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 1230 string def + +% define space for color conversions +/grays 410 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 132 translate + +% size of image (on paper, in 1/72inch coords) +409.96800 327.02400 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +410 327 8 % dimensions of data +[410 0 0 -327 0 327] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000000080000080ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080ffffffffffff000080000080000080000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffff000080000080000080ffffff +ffffff000080ffffffffffff000080ffffffffffff000080ffffffffffffffffffffffff +000080000080ffffffffffffffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff +000080ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080000080ffffffffffff000080ffffffffffffffffffffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080000080ffffffffffff000080ffffffffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff +000080ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 +000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffff000080000080000080ffffff +ffffff000080ffffffffffff000080ffffffffffff000080000080000080ffffffffffff +000080000080ffffffffffffffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 +000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffff737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373000000ffffff737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +000000000080000080ffffff737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000080000080000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282828282828282828282828282828282828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282828282828282828282828282828282828282828282ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffff828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffff828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffff828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffff828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282ffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffff828282828282828282828282828282828282828282828282828282828282 +828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffff828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffff828282828282828282828282828282828282828282828282828282828282 +828282828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffff828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282828282c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000000000828282828282 +c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3 +c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000828282828282 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000828282ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex15.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex15.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex15.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex15.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex15.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex15.ps 1996-11-23 12:59:23.000000000 +0000 @@ -0,0 +1,9796 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex15.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 101 257 511 534 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 1230 string def + +% define space for color conversions +/grays 410 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +101 257 translate + +% size of image (on paper, in 1/72inch coords) +409.96800 276.98400 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +410 277 8 % dimensions of data +[410 0 0 -277 0 277] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000000080000080ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff +ffffffffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff +000080000080ffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffffffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffffffffffffffff000080000080000080000080000080000080ffffffffffff +000080000080000080ffffffffffff000080000080ffffffffffffffffffffffff000080 +000080ffffff000080ffffffffffffffffff000080ffffffffffffffffff000080000080 +000080ffffffffffffffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff +000080000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffff000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff +000080000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff +000080000080000080ffffffffffff000080ffffffffffffffffffffffffffffffffffff +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff +000080000080000080ffffffffffff000080ffffffffffff000080000080000080000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffff000080000080000080000080000080ffffffffffff +000080000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 +000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080ffffffffffff000080000080000080000080000080000080ffffffffffff +ffffffffffffffffff000080000080000080000080ffffffffffffffffffffffff000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffffffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 +000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffff737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373000000ffffff737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +000000000080000080ffffff737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000080000080000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000d9d9d9 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 +000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000000000000000000000 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000d9d9d9 +000000000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9000000 +000000000000000000d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9000000 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000 +000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 +000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 +000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9000000000000000000d9d9d9000000000000000000000000d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 +000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9000000000000000000000000000000000000000000000000000000 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 +000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9000000000000000000000000000000000000000000000000000000 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 +000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 +000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9000000000000000000d9d9d9000000000000000000000000d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9000000 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9000000 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000 +000000d9d9d9000000000000000000d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000d9d9d9000000000000000000000000000000000000 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9000000000000d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000 +d9d9d9000000000000000000000000d9d9d9000000000000d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000d9d9d9 +000000000000000000000000d9d9d9d9d9d9000000000000d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9000000000000000000000000d9d9d9000000000000000000 +d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9000000000000000000d9d9d9000000000000000000000000000000000000000000 +d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9000000000000000000 +d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9000000000000000000 +000000000000000000000000d9d9d9000000000000000000d9d9d9000000000000000000 +d9d9d9000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex16.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex16.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex16.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex16.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex16.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex16.ps 1996-11-23 12:59:32.000000000 +0000 @@ -0,0 +1,4187 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex16.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 101 307 311 534 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 630 string def + +% define space for color conversions +/grays 210 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +101 307 translate + +% size of image (on paper, in 1/72inch coords) +210.02400 227.01600 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +210 227 8 % dimensions of data +[210 0 0 -227 0 227] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080ffffffffffffffffffffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +000080ffffffffffffffffffffffff000080000080ffffffffffffffffffffffff000080 +000080ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080ffffffffffffffffffffffff000080000080000080 +000080000080000080ffffffffffff000080000080000080ffffffffffff000080000080 +ffffffffffffffffffffffff000080000080ffffff000080ffffffffffffffffff000080 +ffffffffffffffffff000080000080000080ffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080ffffffffffff000080000080000080ffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080ffffffffffff000080000080000080ffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffffffffffffffffffffffffffff000080000080ffffffffffff000080000080 +000080ffffffffffffffffffffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080ffffffffffff000080000080000080ffffffffffff000080ffffff +ffffffffffffffffffffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080000080000080000080000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080ffffffffffff000080000080000080ffffffffffff000080ffffff +ffffff000080000080000080000080000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080ffffff000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffff000080000080000080 +000080ffffffffffffffffffffffff000080000080000080ffffffffffff000080000080 +000080ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080ffffff +ffffff000080ffffffffffff000080000080000080ffffffffffff000080000080000080 +000080000080000080ffffffffffffffffffffffffffffff000080000080000080000080 +ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080000080ffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffff737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +000000ffffff737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373000000000080000080ffffff737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000080000080000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000000000 +000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000000000000000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +000000000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000000000ff0000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000ff0000000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff00000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff000000ff0000ff000000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff000000ff0000ff00ff00 +000000ff0000ff0000ff00000000ff0000ff0000ff0000ffff0000ff0000ff00000000ff +0000ff0000ff0000ffff0000ff0000ff00000000ff0000ff0000ff00000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff000000ff0000ff00ff00 +00ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffff00000000ff +0000ff0000ff0000ffff0000ff0000ff00000000ff0000ff00000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff00 +00ff000000ff0000ff0000ffff0000ff0000ff0000ff00000000ff0000ff0000ffff0000 +0000ff0000ffff0000ff00000000ff0000ffff00000000ff00000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff00 +00ff000000ff0000ff000000ff0000ff0000ff0000ff0000ff00000000ff0000ffff0000 +0000ff0000ffff00000000ff0000ff0000ffff00000000ff00000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff0000ff0000ff0000ff00 +00ff000000ff0000ff000000ff0000ff0000ff0000ff0000ff00000000ff0000ffff0000 +ff00000000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000000000ff0000ff0000ff00000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff0000ff0000ff0000ff00 +00ff000000ff0000ff00ff00000000ff0000ff0000ff0000ff00000000ff0000ffff0000 +ff00000000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff0000ff0000ff0000ff00 +00ff000000ff0000ff0000ff000000ff0000ff0000ff00000000ff0000ff0000ffff0000 +ff00000000ff0000ff0000ffff00000000ff0000ff00000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff00 +00ff0000ff000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000 +ff00000000ff0000ff0000ffff00000000ff0000ff00000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff000000ff0000ff0000ff0000ffff0000ff0000ff0000ff0000 +ff0000ff00000000ff0000ffff0000ff00000000ff00000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff000000ff0000ff00ff00000000ff0000ff00000000ff0000ffff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff000000ff0000ff00ff00000000ff0000ff00000000ff0000ffff0000 +ff0000ff0000ff0000ff00000000ff0000ff0000ff00000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d900000000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff000000ff0000ff00ff00000000ff0000ff00000000ff0000ffff0000 +ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff000000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000 +ff00000000ff0000ff0000ffff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000d9d9d900000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff000000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000ff0000 +ff00000000ff0000ffff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff000000ff0000ff00ff00000000ff0000ff0000ff0000ff0000ff0000 +ff00000000ff0000ffff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +d9d9d900000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff000000ff0000ff00ff00000000ff0000ff0000ff0000ff0000ff0000 +ff00000000ff0000ffff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff000000ff0000ff000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff00000000ff0000ff0000ffff0000ff0000ff0000ff00000000ff0000ff00000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff000000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000ff0000ff0000 +ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff000000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ffff0000ff0000ff0000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000000000000000000000000000000000000000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000000000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000000000ff0000ff0000ff0000ff00000000000000ff0000ff0000 +00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +000000ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000000000ff0000ff0000ff000000000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000000000ff0000ff000000000000000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000000000000000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000ff0000ff0000ff0000ff0000ff0000000000000000000000000000000000 +000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff000000000000000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000000000 +000000000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff00000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00000000 +000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff +0000ffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff +0000ffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d900000000000000000000000000000000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d900000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff +0000ffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff +0000ffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d900000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d900000000000000ff0000ff0000ff0000ff00000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d900000000000000ff0000ff00000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000000000000000000000000000000000000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff0000ff00000000000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000ff00000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000000000d9d9d900000000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +00000000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00000000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff +0000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff +0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000000000000000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff000000ff0000ff00ff0000ff0000ff0000ff000000ff0000ff00ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff000000ff0000ff00ff0000ff0000ff0000ff000000ff0000ff00ff0000ff0000ff00 +00ff0000ff000000ff0000ff0000ff0000ff00ff0000ff0000ff000000ff00000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d900000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff000000ff0000ff00ff0000ff0000ff0000ff000000ff0000ff00ff0000ff0000ff00 +0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff000000ff0000ff000000 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d900000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff000000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff000000ff +0000ff0000ff00ff0000ff0000ff0000ff000000ff0000ff0000ff00ff000000ff000000 +00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff000000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff000000ff +0000ff00ff0000ff0000ff0000ff0000ff0000ff000000ff0000ff00ff000000ff0000ff +00ff0000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +0000000000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff0000ff0000ff00 +00ff000000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff +0000ff00ff0000ff0000ff0000ff0000ff0000ff000000ff0000ff00ff0000ff000000ff +0000ff0000ff00000000000000ff0000ff0000ff0000ff0000ff0000ff00000000000000 +0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff00 +00ff000000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff +0000ff00ff0000ff0000ff0000ff0000ff0000ff000000ff0000ff00ff0000ff000000ff +0000ff0000ff0000ff0000ff00000000000000000000000000000000000000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff00 +00ff000000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff +0000ff0000ff00ff0000ff0000ff0000ff000000ff0000ff0000ff00ff0000ff000000ff +0000ff0000ff00ff000000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 +0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000000000ff +0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 +0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff000000ff +0000ff0000ff00ff000000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 +0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff +0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff000000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 +0000ff0000ff00ff0000ff000000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 +0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d900000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff00000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff +0000ffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000000000000000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff0000ff +0000ff0000ff0000ff0000ff0000ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff +0000ffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff00000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff0000ff +0000ff0000ff0000ff0000ff0000ff0000ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff +0000ffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d900000000000000000000000000000000000000ff0000ff0000ff0000ff00 +00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff +0000ffd9d9d9d9d9d9d9d9d9d9d9d90000ff0000ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff +0000ffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff +0000ffd9d9d9d9d9d9d9d9d9d9d9d90000ff0000ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +0000ff0000ff0000ff0000ffd9d9d9d9d9d9d9d9d90000ff0000ff0000ff0000ffd9d9d9 +d9d9d9d9d9d90000ff0000ff0000ff0000ffd9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff +0000ffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex1.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex1.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex1.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex1.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex1.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex1.ps 1996-11-23 12:58:33.000000000 +0000 @@ -0,0 +1,2387 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex1.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 332 411 459 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 630 string def + +% define space for color conversions +/grays 210 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 332 translate + +% size of image (on paper, in 1/72inch coords) +210.02400 127.00800 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +210 127 8 % dimensions of data +[210 0 0 -127 0 127] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffffffffffffffffffff000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080ffffffffffffffffffffffff000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffff737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +000000ffffff737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373000000000080000080ffffff737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000080000080000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 +d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffff828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffff828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex8.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex8.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex8.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex8.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex8.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex8.ps 1996-11-23 12:59:39.000000000 +0000 @@ -0,0 +1,6003 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex8.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 232 511 459 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 930 string def + +% define space for color conversions +/grays 310 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 232 translate + +% size of image (on paper, in 1/72inch coords) +310.03200 227.01600 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +310 227 8 % dimensions of data +[310 0 0 -227 0 227] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffffffffffffffffffff000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 +000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 +000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080ffffffffffffffffffffffff000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 +000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffff737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373000000ffffff737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373000000000080000080ffffff +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000080000080000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9828282828282828282b03060b03060828282828282828282d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +828282828282828282b03060b03060b03060b03060828282828282828282d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282828282b03060b03060b03060b03060b03060b03060828282828282828282d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff +ffffffb03060b03060b03060b03060b03060b03060b03060b03060ffffffffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +ffffffffffffb03060b03060b03060b03060b03060b03060ffffffffffffffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffffffffffffffb03060b03060b03060b03060ffffffffffffffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffffffffb03060b03060ffffffffffffffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex9.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex9.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex9.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex9.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/ex9.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/ex9.ps 1996-11-23 12:59:44.000000000 +0000 @@ -0,0 +1,1879 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex9.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 332 361 459 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 480 string def + +% define space for color conversions +/grays 160 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 332 translate + +% size of image (on paper, in 1/72inch coords) +159.98400 127.00800 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +160 127 8 % dimensions of data +[160 0 0 -127 0 127] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff000000000080000080ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffffffffffffffff000080ffffff +ffffff000080ffffffffffffffffffffffff000080000080000080ffffffffffff000080 +000080000080000080000080000080ffffffffffff000080000080000080ffffffffffff +000080000080ffffffffffffffffffffffff000080000080ffffff000080ffffffffffff +ffffff000080ffffffffffffffffff000080000080000080ffffffffffffffffffffffff +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffffffffffffffffffffffffffffffffff000080000080000080ffffffffffff000080 +000080000080000080000080000080ffffffffffff000080000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080000080 +000080000080000080000080000080ffffffffffff000080000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080ffffffffffff000080ffffffffffff000080000080 +000080000080000080000080000080ffffffffffff000080000080000080ffffffffffff +000080ffffffffffffffffffffffffffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080ffffffffffffffffff000080000080000080 +000080000080000080000080000080ffffffffffff000080000080000080ffffffffffff +000080ffffffffffff000080000080000080000080000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff +ffffff000080000080000080000080000080ffffffffffffffffff000080000080000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080000080000080ffffffffffff000080ffffff +ffffff000080000080000080000080000080000080ffffffffffff000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffffffffff000080000080 +000080000080ffffffffffffffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080000080ffffffffffffffffffffffff +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffff737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373000000ffffff +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373000000000080000080ffffff737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffffffff000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000080000080000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282ffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282828282ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000828282ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffffffff828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffffffffff828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffff828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ffffff828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282828282828282828282828282828282828282828282828282828282828282828282 +828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-1.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-1.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-1.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-1.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-1.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-1.ps 1996-11-24 09:51:47.000000000 +0000 @@ -0,0 +1,171 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: gs_fig1.fig +%%Creator: fig2dev Version 3.1 Patchlevel 2 +%%CreationDate: Wed Nov 20 21:06:25 1996 +%%For: hans@skeppet (Hans Nilsson,EUA/SU) +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 328 210 +%%Pages: 0 +%%BeginSetup +%%IncludeFeature: *PageSize A4 +%%EndSetup +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-88.0 308.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n 0 842 m 0 0 l 595 0 l 595 842 l cp clip + 0.06000 0.06000 sc +7.500 slw +% Ellipse +n 6000 2025 900 375 0 360 DrawEllipse gs col-1 s gr + +/Helvetica ff 210.00 scf sf +5400 2100 m +gs 1 -1 sc (GUI Builder) col-1 sh gr +% Ellipse +n 2550 2025 1050 375 0 360 DrawEllipse gs col-1 s gr + +/Helvetica ff 210.00 scf sf +1800 2100 m +gs 1 -1 sc (GUI Applications) col-1 sh gr +% Polyline +gs clippath +3484 2904 m 3576 2987 l 3456 2957 l 3599 3034 l 3627 2981 l cp clip +n 2475 2400 m 3600 3000 l gs col-1 s gr gr + +% arrowhead +n 3484 2904 m 3576 2987 l 3456 2957 l 3470 2931 l 3484 2904 l cp gs 0.00 setgray ef gr col-1 s +% Polyline +gs clippath +5239 2943 m 5122 2985 l 5206 2893 l 5071 2983 l 5104 3033 l cp clip +n 6000 2400 m 5100 3000 l gs col-1 s gr gr + +% arrowhead +n 5239 2943 m 5122 2985 l 5206 2893 l 5222 2918 l 5239 2943 l cp gs 0.00 setgray ef gr col-1 s +30.000 slw +% Polyline +n 1500 3750 m 6900 3750 l gs col-1 s gr +7.500 slw +% Polyline +n 6225 4500 m 6900 4500 l 6900 5100 l 6225 5100 l cp gs col-1 s gr +% Polyline +n 5100 4500 m 5775 4500 l 5775 5100 l 5100 5100 l cp gs col-1 s gr +% Polyline +n 3975 4500 m 4650 4500 l 4650 5100 l 3975 5100 l cp gs col-1 s gr +% Polyline +n 1575 4500 m 2250 4500 l 2250 5100 l 1575 5100 l cp gs col-1 s gr +% Polyline +n 2775 4500 m 3555 4500 l 3555 5115 l 2775 5115 l cp gs col-1 s gr +/Helvetica ff 210.00 scf sf +4350 3450 m +gs 1 -1 sc (General Graphics Interface \(API\)) dup sw pop 2 div neg 0 rm col-1 sh gr +/Helvetica ff 210.00 scf sf +4350 4125 m +gs 1 -1 sc (Possible backends to many systems and platforms) dup sw pop 2 div neg 0 rm col-1 sh gr +/Helvetica ff 210.00 scf sf +1680 4882 m +gs 1 -1 sc (Motif) col-1 sh gr +/Helvetica ff 210.00 scf sf +2820 4905 m +gs 1 -1 sc (Win3.2) col-1 sh gr +/Helvetica ff 210.00 scf sf +4095 4905 m +gs 1 -1 sc (OS/2) col-1 sh gr +/Helvetica ff 210.00 scf sf +5115 4890 m +gs 1 -1 sc (Tcl/Tk) col-1 sh gr +/Helvetica ff 210.00 scf sf +6330 4875 m +gs 1 -1 sc (PXW) col-1 sh gr +$F2psEnd +rs Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-2.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-2.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-2.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-2.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-2.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-2.ps 1997-05-22 23:38:01.000000000 +0100 @@ -0,0 +1,2832 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (Process_in_Erlang.eps) +%%CreationDate: (97-05-22) (12.55) +%%BoundingBox: 117 590 392 730 +%%HiResBoundingBox: 117.7663 590.1667 391.1347 729.3677 +%%DocumentProcessColors: Black +%%DocumentFonts: Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: -174 876 1 1058 826 58 1 1 2 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 0 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +0 O +1 g +0 R +0 G +186.2136 638 m +278.1654 638 l +B +3 w +329.9252 666 m +329.9252 609.5 l +B +0 To +1 0 0 1 336.4252 652.5 0 Tp +TP +0 Tr +0 g +1 w +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +0 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(Underlying\r) Tx +0 -12 Td +(Graphics\r) Tx +0 -12 Td +(System\r) Tx +0 -12 Td +(backend) Tx +(\r) TX +TO +0 To +1 0 0 1 224.9252 640.5 0 Tp +TP +0 Tr +(link) Tx +(\r) TX +TO +0 To +1 0 0 1 300.9252 634 0 Tp +TP +-7.2241 0 Td +0 Tr +1 Ta +(GS) Tx +(\r) TX +TO +0 To +1 0 0 1 164.4252 606 0 Tp +TP +-46.6589 0 Td +0 Tr +(Application Process) Tx +(\r) TX +TO +0 R +0 G +2 J [5 7 ]0 d +168.4252 660.0625 m +173.7289 670.9058 189.4252 678.5625 v +209.9252 688.5625 228.9252 691.5625 248.4252 695.0625 c +277.9615 700.3639 350.9252 709.0625 y +S +1 Ap +0 O +0.75 g +[]0 d +363.5118 702.4134 m +363.5118 716.5866 L +349.3386 716.5866 L +349.3386 702.4134 L +363.5118 702.4134 L +b +0 To +1 0 0 1 356.4252 720 0 Tp +TP +-34.7095 0 Td +0 Tr +0 g +0 J +(window object) Tx +(\r) TX +TO +0 To +1 0 0 1 239.9252 704 0 Tp +TP +-44.4373 0 Td +0 Tr +(owner relationship) Tx +(\r) TX +TO +0 To +1 0 0 1 301.9252 604.6667 0 Tp +TP +-20.2759 0 Td +0 Tr +(graphics\r) Tx +5.5481 -12 Td +(server) Tx +(\r) TX +TO +u +0 Ap +0 R +0 G +278.1654 638 m +278.1654 644.2129 280.5848 650.0538 284.9781 654.447 c +289.3713 658.8403 295.2123 661.2599 301.4252 661.2599 c +307.638 661.2599 313.4791 658.8403 317.8723 654.447 c +322.2656 650.0538 324.685 644.2129 324.685 638 c +324.685 625.1744 314.2507 614.7402 301.4252 614.7402 c +295.2123 614.7402 289.3713 617.1596 284.9781 621.5529 c +280.5848 625.9461 278.1654 631.7872 278.1654 638 c +s +1 Ap +301.4252 616.7402 m +313.1665 616.7402 322.685 626.2586 322.685 638 c +322.685 649.7413 313.1665 659.2599 301.4252 659.2599 c +289.6839 659.2599 280.1654 649.7413 280.1654 638 c +280.1654 626.2586 289.6839 616.7402 301.4252 616.7402 c +s +U +164.9538 616.7116 m +176.6951 616.7116 186.2136 626.2301 186.2136 637.9714 c +186.2136 649.7127 176.6951 659.2312 164.9538 659.2312 c +153.2125 659.2312 143.694 649.7127 143.694 637.9714 c +143.694 626.2301 153.2125 616.7116 164.9538 616.7116 c +s +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-3.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-3.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-3.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-3.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-3.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-3.ps 1997-05-24 22:29:02.000000000 +0100 @@ -0,0 +1,2830 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (All_events.eps) +%%CreationDate: (97-05-23) (14.00) +%%BoundingBox: 122 566 396 709 +%%HiResBoundingBox: 122.3411 566.1667 395.7095 708.3677 +%%DocumentProcessColors: Black +%%DocumentFonts: Geneva +%%+ Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: -126 900 1 1058 826 58 1 1 2 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Geneva +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Geneva Geneva +[/_Geneva/Geneva 0 0 0 TZ +%AI3_EndEncoding TrueType +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 0 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +0 O +1 g +0 R +0 G +3 w +334.5 645 m +334.5 588.5 l +B +0 To +1 0 0 1 169 583.3333 0 Tp +TP +-46.6589 0 Td +0 Tr +0 g +1 w +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +1 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(Application Process) Tx +(\r) TX +TO +1 Ap +0.75 g +0 R +0 G +2 J +368.0866 681.4134 m +368.0866 695.5866 L +353.9134 695.5866 L +353.9134 681.4134 L +368.0866 681.4134 L +b +0 To +1 0 0 1 361 699 0 Tp +TP +-34.7095 0 Td +0 Tr +0 g +0 J +(window object) Tx +(\r) TX +TO +0 To +1 0 0 1 306.5 580.6667 0 Tp +TP +-20.2759 0 Td +0 Tr +(graphics\r) Tx +5.5481 -12 Td +(server) Tx +(\r) TX +TO +u +u +0 Ap +0 R +0 G +361 679.5 m +360.5015 662.0213 359.5 647 v +359 639.5 356.5 630.5 y +348 614.5 332 617 306 617 c +291.9911 617 209.5 617 y +S +0 O +0 g +207.138 615.9751 m +208.7913 615.4759 209.8659 615.0159 211.1924 614.4835 c +211.1924 619.5278 l +210.7176 619.3026 208.7913 618.5353 207.138 618.0364 c +205.3686 617.5017 203.7641 617.1361 202.7234 617.0056 c +203.7641 616.8751 205.3686 616.5096 207.138 615.9751 c +f +U +U +0 To +1 0 0 1 357.5 593 0 Tp +TP +-19.7217 0 Td +0 Tr +(backend) Tx +(\r) TX +TO +0 To +1 0 0 1 196 623.3333 0 Tp +TP +0 Tr +/_Geneva 8 Tf +0 Ta +({event, ObjectId ...}) Tx +(\r) TX +TO +1 Ap +0 R +0 G +169.5286 595.7116 m +181.2699 595.7116 190.7884 605.2301 190.7884 616.9714 c +190.7884 628.7127 181.2699 638.2312 169.5286 638.2312 c +157.7873 638.2312 148.2688 628.7127 148.2688 616.9714 c +148.2688 605.2301 157.7873 595.7116 169.5286 595.7116 c +s +u +0 Ap +282.7402 617 m +282.7402 623.2129 285.1596 629.0538 289.5529 633.447 c +293.9461 637.8403 299.7871 640.2599 306 640.2599 c +312.2128 640.2599 318.0539 637.8403 322.4471 633.447 c +326.8404 629.0538 329.2598 623.2129 329.2598 617 c +329.2598 604.1744 318.8255 593.7402 306 593.7402 c +299.7871 593.7402 293.9461 596.1596 289.5529 600.5529 c +285.1596 604.9461 282.7402 610.7872 282.7402 617 c +s +1 Ap +306 595.7402 m +317.7413 595.7402 327.2598 605.2586 327.2598 617 c +327.2598 628.7413 317.7413 638.2599 306 638.2599 c +294.2587 638.2599 284.7402 628.7413 284.7402 617 c +284.7402 605.2586 294.2587 595.7402 306 595.7402 c +s +U +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-4.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-4.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-4.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-4.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/gs1-1-image-4.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/gs1-1-image-4.ps 1997-05-22 23:38:02.000000000 +0100 @@ -0,0 +1,2761 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (Object_hierarchy.eps) +%%CreationDate: (97-05-22) (12.54) +%%BoundingBox: 184 668 330 732 +%%HiResBoundingBox: 184.4556 668.5 329.7661 731.3677 +%%DocumentProcessColors: Black +%%DocumentFonts: Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: -62 780 1.5 1058 826 58 1 1 2 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 0 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +0 To +1 0 0 1 234 722 0 Tp +TP +-18.8794 0 Td +0 Tr +0 O +0 g +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +1 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(window) Tx +(\r) TX +TO +0 To +1 0 0 1 200 696.5 0 Tp +TP +-15.5444 0 Td +0 Tr +(button) Tx +(\r) TX +TO +0 To +1 0 0 1 268 696.5 0 Tp +TP +-13.8867 0 Td +0 Tr +(frame) Tx +(\r) TX +TO +0 To +1 0 0 1 234 671 0 Tp +TP +-27.7661 0 Td +0 Tr +(radiobutton) Tx +(\r) TX +TO +0 To +1 0 0 1 302 671 0 Tp +TP +-27.7661 0 Td +0 Tr +(radiobutton) Tx +(\r) TX +TO +0 R +0 G +200 705 m +234 719 l +268 705 l +S +234 679.5 m +268 693.5 l +302 679.5 l +S +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/image.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/image.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/image.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/image.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/image.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/image.ps 1996-11-23 13:00:30.000000000 +0000 @@ -0,0 +1,2103 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/image.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 317 357 460 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 468 string def + +% define space for color conversions +/grays 156 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 317 translate + +% size of image (on paper, in 1/72inch coords) +156.02400 142.99200 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +156 143 8 % dimensions of data +[156 0 0 -143 0 143] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 + +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 +000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000 +000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000 +000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080000080ffffff000080000080ffffff000080000080ffffff +ffffff000080ffffffffffff000080000080000080000080000080000080000080ffffff +ffffff000080ffffff000080ffffffffffffffffff000080ffffffffffffffffff000080 +000080000080ffffffffffffffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffffffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffffffffff000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080ffffff +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080000080000080000080000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffffffffffffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffffffffffffffffffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080ffffff +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffffffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000 +000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffffffff000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080ffffffffffff000080000080 +ffffffffffff000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffff737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373000000ffffff737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373000000000080 +000080ffffff737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffffffffffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000080 +000080000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99c8c6fa5906b9c8c6fa58c7baf9f94a08883a4a196a1988d948677 +a1988da08883a088839687879687879687879687879687878e7778a1988d948677a3908c +8e7778a4a196a08883a1988da3908cb19ca3b19ca3b19ca3b1a8a2a1988db7b5a0a4a196 +b1a8a2a3908c948677a1988daf9f94948677a4a196a4a196bfadb0a4a196bcb8aea1988d +a08883a0947f948677b9ada5a1988da0947fb1a488a08883a4a196a08883a4a196a4a196 +a4a196bda49ebfadb0968787b9ada5c7beb3cebdada4a196bcb8aed7d1c0bcb8aeb1a8a2 +b1a8a2a4a196948677a4a196a3908c968787a4a1968e7778b19ca3a1988da4a196a1988d +a4a196c7beb3c7beb3c7beb3a4a196b19ca3a4a196a4a196a1988da1988db1a8a2b7b5a0 +a3908ca4a196a3908cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b5947b9c7b63bd94848e6352cea594bd9c94a58c7ba08883b99c8c +a58c7bc6ad94a58c7bc6a594a58c7ba58c7ba0947fb19494a58c7b9c8c6faf9f94b19494 +a3908ca1988dc6b598b1a8a2bcb8aec7beb3bfadb0b1a8a2a4a196b1a8a2b2aa94b9ada5 +b1a8a2a0947faf9f94bd9c94a0947faf9f948c7f6ba4a196a0947fbda49ea4a196c6b598 +948677af9f94af9f94a4a196b1a488d0ba99ad9c84bda49ec6a5a0bda49ea08883a4a196 +a088838e7778bda49eb1a8a2d7d1c0d2c7afc6b598eddfc8d7d1c0d7d1c08c7f6bad948c +caab9ea58c7bceb59cccb1abaf9f94bda49eaf9f94d2c7afa0947fd7d1c0d7d1c0eddfc8 +b1a8a2b7b5a0bcb8aea3908ca4a196d7d1c0bfadb0a4a196a4a196c7beb3d2c7afb1a8a2 +b1a8a2eddfc8b1a8a2d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9bd8c73b57f6bbd8c73a7735dc08c7e9c675a8c634aa57f679c735e +bd8c739c7352ad7367996d478c634a9c7352ad7b63ad8c7bc6a58cb58c73a5846bb19494 +846b6e968787b19494a4a196a4a196b7b5a0b1a8a2d2c7afc7beb3d2c7afb9ada5c7beb3 +ccb1abd7d1c0e4bda2bdaa91c6ad94ad9484caab9ead9c84c6b598c6b598caab9ea58c7b +b59c84b99c8ca59473a0947fc6ad94bda58cc1a584a58c7bbda49e9c7b6d8c7f6b948677 +ceb59cb19494af9f94a4a196a4a196af9f947d584a9c8c63948463ceb594a5846b9c735e +ad9473a57f67ad946bad9c73ad9473c6ad8cad9473947b63b1a488b1a488bdb594a3908c +bcb8aeb9ada5bda49ebcb8aea3908cb1a8a2bcb8aea1988db9ada5b7b5a0a0947fbcb8ae +b7b5a0a1988dbda49ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9daa08caa7052daa08cda9c848d4938a7735d996040a7735d985e52 +9c7352da9c8490573d90573d8d4938996040bd9168b57f6be2b399ad7e4f9c7b63d6b9a9 +6750438e777880695eb1a8a2d7d1c0eddfc8d2c7afd2c7afad9c84c6b598b19ca391706d +9473637d584a7d584ac69c8c7d584a9c7b63a5846ba5906bcaab9ec6ad8cbda58c886b46 +a5846b9c7b63886b46948677bd9c7b9f7e5ab5947b8c634a9c7b6d67504383584dad947b +b99c8cbd9c942b181c4f362fd5c2bead947b8c634aa5845aad8c6bad8c6bb58c738c634a +906f4ee4bda2c69c73906f4ebd9c73ad946bad9473a5906bad9c7bd6b9a9b1a488af9f94 +a08883a0947fa0947fa1988da4a196cebdada08883c7beb3a0947fb1a8a2a4a196c6b598 +b2aa94b59c84b1a488d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99c7352e2b3999c7352a36150bd9168c69473a7735dad8463462113 +ad7b6b9c675ab57f6b844832b77b5dbd9168d69c7bd0927ba77047b58456b58c73cea594 +a088832d0f0b5e4542d7d1c0c7beb3ad9c84a59473b59c7b947b63846b6e5e4542675043 +7d584a462113986d5e9c7352906f4e906f4ec69c84a5906ba57f67bd9c7bad94738c634a +7e5b39947b569c7b6379483d886040906f469c7352906f4e986d5e9c776bad8c735e3e28 +ad947bc69c942d0f0b2b181cb7b5a0d6b9a9ad846b9f7e5a8c634ac69c84947b569c7b63 +cea58c76533e947b56cead8cb5947bcead8cbd9c84ad8c73bda58c9c8c6fa58c7bbda49e +a4a196ad948c948677a08883b2aa94ccb1ab94846ba4a196a08883af9f94af9f94a0947f +ad947ba0947fbda58cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b58c7390573d985e52996d47bd8c73b58c6bbd9473b58c739c735e +bd9484e2b399ad73679c675aad7b63a7735db57f6baa7052bd8c63bd8c63ce9c77c6a58c +5e4542250814180814d2c7afbdb5949c8c6fa5846ba5846b948677a57f679c7b6d9c7b6d +9c7b6d1b0500e2b399ad8c7bb58c6be4bda2996d47ad8c6bad846bb5947bad8c6b703d29 +7e5b398e63529c7b638e6352ad846bad8463ad7f5a844a4483584d8e63528c634aa58c63 +c69c8c99797b1000002b181cbfadb0eacba5ad7b63b58c73ad846ba5846ba57f679c7b6d +a59473a57f679c8463b58c73bd9c7b9c7b63b5947bad9484c6ad94d6b9a9caab9e9c9178 +ccb1abbdaa91a08883bdb594b19494ad9c84a08883948677a1988da0888380695e948677 +a5846b80695e947b63d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9bd947b996d47906f4ea7735dc08c7e985e52b58c73bd947b844a44 +ad8c739c675a9c73528d49389c675aad7b63b57f6bb57f6bda9c84e2b399b5946b947b63 +2b181c2b181c100008d6bd98b1a4889c735e9473639c776bbd9484a5846ba5847391706d +5e3e28986d5ebd9c84bd947bad846bceb5949c7b63947b56b5947bb58c73a5846b462113 +8e63527d584a844a447e5b399c7352996d47b58c6b703d2983584d9c7b639c7b6db5946b +947b56bd9c9418001425101cc7beb3b18a87ad846bad7b63a7735d9c7b63ad8c738e6352 +a5846bad9473b5947bad846b8e6352a59473734c2e947b63a58c7bc6ad8c948677ceb59c +a58c7ba59473ad9c7baf9f94ad9484af9f94947b63b9ada5a08883ad9484a088838c7360 +94846bad948c76533ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad846bad7b6bbd8c7379483d985e52ad7b638e63529c735e906f4e +a7735dcea084985e529c7352844832a56b4eb87158d6ad96bd9473a5845a9c7b635e3e28 +210810180014100000c1a584dab28ccea594bd94848e6352a97b779c735eb5947b3b1820 +260608947363a5846b734c2ecead8c8c634ab5947b947b569c735ec69c84ad847379483d +94685a9c735e8c634a8e635279483d9c7352a7735d76533e5526179c776b9c7b63b5946b +bd948c6a5055100008180814846b6eebcfb89c7352a7735db77b5dad7b639c7b63ad8c6b +c1a5848c634aad8c63bd9c84ad8c738c634aa5906b9c7b63c1a584c1a584c1a584b1a488 +bda58cb99c8cb99c8cc6b5988c7f6b91706da088839486779c7b6d8e7778947b63948677 +80695ea08883947b63d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9bd9473b58c73906f469c7352ad846b844a44a97b778a5a58ad7b63 +c6947fa36150a77047b87158c07c66b58456cead78c08c7e8d49389f7e5aa57f67250814 +1800141800141000088c6b5ad6b9a9ad9c848c6b5a80695e9473637e5c586d463c462113 +4f362f9c7b63947b569c7b63b58c737d584aad8c6b947b56bd9473bd9c7b947b63846b52 +8e635294685a846b528c634a734c2ead846bbd91689c7352b58c739f7e5ac69c849c7b63 +ad846b6d463c10000025101c80695ecaab9ebd8c63ad7b63bd947bad8c6b9c7b63947b56 +ad8c6b906f4e886b46947b569c7352bd94738e6352ad8c6bc6a58ca5906bad9c73c6ad8c +9c8c6fb99c8c948677a0947fa0947fa1988d9c91789c847b73575580695e7e5c589c847b +80695e9c7b6d947b63d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad7b63906f46ad7b63b58c6bc08c7ecea58c986d5e986d5ec08c7e +d69c7b844832b87158ca946fd0927bdaad84daad8476533e8c634aa7735d947363350c1a +382328100008080008947b63c6ad8c552617947b6380695e947b569c7b6db594847e5c58 +7e5c58b5947bb5947bbd9c7bc1a5849c7b63bd9484bd9168bd9473b5947bbd9c7b947b56 +9c7b639c735e9c7352cea084b5947b9c7352b58c6b9c73529c73529f7e5a9c7b63a7735d +b5947b986d5e180014080008382328c6ad94cea0847e5b398c634a886040bd947376533e +ad946bb5947bad946bad7f5a947b56bd8c73734c2ead8c73b58c73c6b584b5a57bb59c7b +ad9484bda58cbda49ea0947faf9f948e77788c7f6baf9f948c736080695e735755735755 +6750438c73609c7b6dd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9bd9473bd8c73ad846bbd8c73a7735dad8473986d5e8e6352ad7367 +985e52996040844832d0927bd0927bd0927bdaad84703d298c634a996d473c160a350c1a +180008180814180008886b46ceb59cc1a584b5947bc6a58cad8c7bb5947bad8c7ba97b77 +b59484bd9c849c7352996d47bd9c7bbd947b9c776bbd9168c69c739f7e5a9c73529c735e +9c73528c634aad7b63906f4ea7735dad8463b57f6bad7e4fad8463a7735dbd9473c39565 +b58c73a97b771b0500180920382328caab9ead7f5ab58c6bd0927bad846ba7735dc1a584 +ad846b947b56ad8c7b8c634a9f7e5abd947b9c7b63ad846bb5947bc1a584b59c73bd9c84 +9c8463b59484a58c7bb19494948677a58c7bbda49ea088838c736094846ba58c7b9c8c6f +9c7b6d94846b947b63d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad846bc6947fad7b63c08c7e76533ea7735d986d5ead7367da9c84 +8d4938906f4ecea084bd9484cea594703d29844a44b57f6bb57f6bad846b7d584a675043 +2a142b10000010000876533eceb594bd9c84b5947b996d47ad846b9c7b63d6ad9694685a +846b529c735ec1a584c69c7bad8c6bb58c73ad846bcea084ad8463bd9168985e528c634a +8c634aad8463886040b58c6be2b399b58456bd8c63ad8463a77047ad8463bd9473bd8c63 +ad8c63c69c8c18001425101c100810ceb59c9c735e996d47734c2ea07b4ead846bcea084 +8c634a9c735e9c7b63bd9473c69c84bd9473bd9c7b9c7b63a57f67bd9c7bad8c6b9c7b63 +b5947bd6b9a9a59473ad9484947b63a3908ca58c7baf9f949486779c7b6da1988d9c7b6d +a08883a58c7b948677d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9985e529c7352cea084cea58c945852cea084985e529c7b63b77b5d +90573db57f6bbd94845526175a2e2779483d5a2e27844832703d29996d477d584a846b6e +180014180014100810734c2eebcfb8bd9c7beacba5cead8ccea084cea084ad846b947b56 +8c634a9c735ecead8ccea084ad8c6bbd8c73c69c7bca946fd69c7bda9c84a07b4ec69c7b +9c7352a7735dad7e4fbd9473ad8463b77b5d996040a77047c395658448329c7352bd9168 +bd9473c69c8c100000100008100008d5c2bea7735dbd9473ad846bad8463bd9473985e52 +5e3e2883584dbd947bc08c7e9f7e5a9f7e5a9f7e5abd9473906f4eb5947b996d479c8463 +bd9c7bc6a58ccea594ad9484947b63846b6ead948c9486779c847b8e7778ad947b8c7f6b +a58c7bad948cb59c84d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99c73529c675aad7b6bc08c7e9c7352b5887ba7735d985e52c08c7e +844a449c675a55261784483279483dad7367985e5290573dad7b638c634a9c7b6d3b1820 +25101c100000100810846b52eacba5d6bd98bd9c7bcea084c69c7bcea0849c735eb58c73 +bd9473bd9473ad846ba07b4eb58c73c69c7bbd9168ca946faa7052ad8463cea084a7735d +9c7352a7735dad84639c7352ad84639c7352b77b5dc69c73cea084ad7f5ab58c73c39565 +b59c73b5887b100008100008180814d6b9a9985e52bd9168ad846b9f7e5a9c735e996d47 +703d297e5b39c69c8cad846bb58c73bd9c7bcead8ccead8ca5845ab58c73ad846bcead8c +ad94739c7b63b59c7bceb59ca088839c7b6da3908c5e454280695e94846bad948c91706d +947b63846b6e947b63d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99c675a9c7352844a449c735ea9695cad7367cead8ca7735db57f6b +703d298448328d4938a5635a844a445526179c735e844832ad7b639c735e7d584a44272e +21081018001418000880695eccb1abc1a584d7c69abd9168cead8c9c735ed6ad96ad7f5a +ad8c6bbd9168c69c7bd0927bbd9473b58c6bd0927bb77b5db77b5d985e52a7735d9c7352 +9c7352886040bd9473bd9473b58c73bd8c639f7e5aa7735dbd94739c7352b5947ba5845a +bd9c7bb594842b181c080008100000c6a5a0a7735dc69c7b76533eb58c73c69c84ad8c6b +7e5b39ad84738c634a9c7b63c69c7bb58c73b59c73886b46985e528c634aad7b63b59c7b +cead8cc1a584947b63d6b9a9af9f94a088835e4542948677bda49eaf9f94ad948494846b +947b638c7360a08883d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad846b9458529c735eb5736bb58473bd8c73da9c84ad7e4fb5887b +844832844a44a5635a8d4938844832a9695c7e5b39844a44ad846b8c634a46211344272e +180014180008100008735755ebcfb8ceb594cead8cbd9c73b58c73c69c7bad846b9c7352 +ad7f5abd91689f7e5aad846bbd8c63a7735dad7f5abd9473b57f6bb57f6bb58c739f7e5a +9c73529f7e5aad7e4f9c7b63ad846b996d47bd9473ce9c77cea084c69c7bbd947bbd9c7b +bd9c7b83584d180814180008180814cea594b87158bd9c84947b568e6352a57f67886040 +8e6352a5846bc69c847e5b39986d5ead7f5a947b56b5946bb5946bb58c73ad846bad8c6b +b59c7ba5906bb1a488ad947b7e5c588c7f6bbfadb0846b6ea58c7b8c7f6b80695e91706d +91706d8c7360a58c7bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99c73529c7352ad7b6b844a44bd9473b57f6b9c73529c675a844832 +985e52844832844832703d29a97b778e63525e3e2894685a986d5e76533e8448327e5c58 +2508141000080b0319735755decaa4d2c7afd7c69aad9c73a58c639c8c63ad8c6bb5947b +b59c739f7e5aa7735db5946bad7f5ac69c73c69c73a77047ad7f5ab58456ad8c63ad7e4f +b58c73ad7f5a9c7b63b29460ad7f5abd9c7bbd94739c7b639c7b63ad947b947b638c6b5a +ad8c7344272e180008180920100000a58c7bbd9473906f46ad846b9c7b63947b56a58c7b +ad846bb5947bb5947b9c8463ad8c6ba59473bd9c84b5947bad947ba59473bd9c94ad947b +9c7b6d9c7b6dad8c73ad9c84947b63846b6ea0947f8c7360948677af9f948c7f6ba0947f +a58c7b947b63a58c7bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c395659c7352c68c84a7735dda9c84ad7e4fd0927b9c7352945852 +a5635a844a44552617ad7367906f4e8e63528c634a8c634a9c7352985e52986d5e552617 +1000081800140b0319846b52d7d1c0b1a488ceb5949c8463947b63a58c63a5846b7d584a +b58c73a57f67c1a584ad8463bd9473b58c6ba7735dca986bc39565b58c6bc39565ad7b63 +b58c73b58c73b58c739c7352c69c7bbd9473b58c73cea084b5947b947b63ad8c73b59c7b +e4bda2a08883180014100008180014bd94849c7352b58c73996d478e63529c7b639c776b +a58473bd94847e5b39bda58cc6ad8c8c7360c6a58cc6ad8cb59484b59c84947b63a5846b +a58c7bb59c84ceb59cccb1aba59473a08883a0947f91706daf9f94a0947f91706d8c7360 +91706dad948cad948cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9daa08cc08c7e9c7352ad7b63daa08cbd9168ad7b63945852a36150 +844832a7735db77b5d8d49387e5b39bd846fad846bb58c6bc6947f9c73529c735e5e3e28 +2508141800080b0319735755ebcfb8caab9ead947bceb594ad8c73d6b9a9bd9c84ad8c6b +c6a58cb5947bbd9c7b996d47bd9473d0927bb58c6bb77b5dad8463b58c6bdaa08cc69c73 +b58c739f7e5a9f7e5abd8c73bd8c73c08c7ebd9473bd9473bd947bbd9c7bb59c7bb59c73 +bd9c7bc69c8c180014180008100008ad8c7bb77b5d906f4e9c776bb58c739c7b6d8c6b5a +83584dad8c739c7b6db59c7bbd9c84ceb594bda58c8c7360947b63947b63a59473bd9c84 +a5846bbda58ca59473ad9c7bad9484a58c7b9c847b8c73608e7778a58c7b9c847b8c7360 +947b63a0947f948677d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d98d4938b57f6b9c675ada9c84da9c84b58456a56b4ea5635aa56b4e +a36150985e52a361508c634aa7735da7735d9c7352bd8c63c69c73bd9473b584738a5a58 +1b05001800082a142b846b52caab9ead947bd6b9a9b59c7bad8c73c6a58ca57f67a5906b +a5846bb5947bad846b9c7352b58c6bc69c7ba770479c7352a770479c7352bd9473ad846b +ad846bad846bb58c73ad8463c08c7ead8c63a7735dbd9168bd9168ad8c6bc69c73cead78 +cead8cceb59c2d0f0b100000250814b5887b985e529c7b6394685a7d584aa58c7b5e3e28 +9c7b6da58473947363ceb59c9c8463b59c84947b5676533ea59473a5846bb5947ba5846b +a59473a59473a59473ad947ba5846baf9f947e5c589c847b7e5c58a58c7b947b639c7b6d +af9f94a0947fcaab9ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9cea084ad7b63985e52b58c6bda9c84a56b4e9c73525526178d4938 +b87158ad7b63844832703d29844832985e529c7352daad84c08c7ecea084b99c8c735755 +210810291021080010846b52decaa4d6b9a98c6b5ad6bd98cea594c1a584bd9c7bad9c7b +ad946bc1a584b59c73ad846bad8463bd8c63ad7e4fbd8c63ad8463bd8c63ce9c77ad8c6b +ad8c63bd9473ceb594bd9473bd9c7bc69c73cea084cea084cead78c1a584c6a577cead8c +c1a5849c7b6d382328100000180814b59484985e52a57f679c7b6d8e6352986d5e8a5a58 +ad847ba58c7bcea5949c84639c7b6da5906bad8c73a5846ba59473c6a58ca59473a58c7b +a5846bc6ad94a59473a59473b99c8cad9484947b636750436d463c99797b6750439c7b6d +ad9484a5846baf9f94d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad7b63ad7b6b844a44ad8463ca946fa7735dbd846fa9695cb57f6b +b57f6b844832703d29985e529c675a985e52daad849c735e947b565a2e275a2e272b181c +25101c2a142b18001476533eebcfb8947b635e3e28947b63ceb59c9c7b6dbda58cc6ad94 +bda58cbd9c84c6a58c886040a57f67ad8c6bc69c84cea084c69c7bbd9c7bc6a58ca57f67 +9c7b6da5846bb59c84b59c848c6b5aad8c7bc6a58ca57f67b5947bceb594ad9473846b52 +4f362f21080425101c100810180014b99c8ccea0847d584a4621135526174f362f8c6b5a +ad847bad8c7bad8c73947b63947b63a59473a5846ba59473a59473b5947b9c7b63c6ad94 +bd9c949c84639c7b6d9c7b6d9c7b6d9c847b7357557d584aad8484a088839c776bb99c8c +ad8c73ad9c7bad8c73d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99c735eb5887b8c634ac08c7ee2b399cea0849c73528a5a58985e52 +703d29552617844a445526175a2e278c634ab58c6b7d584a9c847b5e3e28250814180014 +1800080800102a142bad948c5e4542350c1a38232821081021081044272e462113210810 +350c1a3b182044272e2d0f0b4621133b18205e3e285e45425a2e273b18203c160a1b0500 +21080425081444272e2108043b18201b05001b05002d0f0b2108041b05003823282d0f0b +3823281000081000000800082b181cbd9c94ad946b5a2e2746211376533ecaab9e462113 +9c776bb58c73b5947b9486779c7b63b99c8c8e635276533e886b46a5846bd0ba99ad9484 +a57f677e5c5883584d7d584a8a5a585a2e2744272e9c7b6da58c7b5e3e28846b52947363 +9c7b63b5947bad8c6bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b58c73b58c73c69c84d0927bcead789c7352bd846f94685a90573d +8c634a985e525a2e2779483d844a44ad73678c634a2606082d0f0b210810180014382328 +1800142a142b0b0319a586869687872108102508141800142b181c210810180014250814 +21081025101c1b050025101c2b181c180c08250814260608210810210804350c1a180014 +210810180014180014180c0818081418001425081424061e180008100008180014180814 +2108101800080b03191809201008088c7360886b46734c2ea97b77cea594ad8473ad8c7b +83584d734c2ead94739c7b6d9c84637d584a948463ceb59cbd9c84c6ad949f7e5a7e5c58 +9473636d463c6d463c4621135a2e275a2e278a5a5880695e5a2e271000087e5b398e6352 +b59c7bad846bb5946bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9382328180c083823283823287e5c587d584a8a5a5876533e76533e +bd9473734c2e844832844a44b58c732606083c160a18001418081418001424061e100008 +1809201808141809205e454244272e44272e44272e1800141800080b0319180920100008 +100800180c08100008100000100008180c08180c0818000818000825101c180008180008 +24061e180014180c081000082508142b181c18001425101c180814100008080008180814 +18001410000825101c10000025101c3b18204f362f44272e7e5b397e5b3983584d947b63 +56363d3b1820b5946bad847b9c776bbd9484b5947bad84739c7b6d7d584a76533e675043 +3c160a4f362f4f362f7d584a2b181c56363d6750436a505521081010000844272e7d584a +7357557d584a94846bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d925101c1800141b0500100008210804210810350c1a260608210810 +10000821081025101c38232818001424061e080010291021250814250814180c08100008 +18001425081418081491706db1949499797b99797b846b6e56363d3823282a142b25101c +18001418000818001418081429102124061e24061e2b181c2b181c210810180014180014 +250814100000180c082b181c1800081800142a142b18001410000038232825101c180014 +3823281800142910212b181c1800144f362f100008350c1a21081044272e44272e210810 +25081425081444272e4f362f3b182044272e5526173823283c160a2108102108103c160a +44272e350c1a1b05002b181c2d0f0b1000082b181c250814250814350c1a2d0f0b350c1a +3c160a2d0f0b3b1820d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d925081425101c25101c2b181c25081425101c1800142108100b0319 +2a142b0b031924061e1000081809202a142b0b03192108101b05004f362f6a50558c7360 +735755846b6e8e7778bda49eccb1abbda49e9c847bb18a8799797bad848cad948c846b6e +56363d18001418001424061e24061e24061e24061e8e77787357553823283b18202b181c +3823281000082b181c38232856363d44272e2a142b25101c382328846b6e38232825101c +2a142b24061e2a142b44272e8e7778a3908c99797b5e3e285e45427e5b39735755675043 +6750437357559c8c6f56363d4f362f5e4542735755846b6e846b6e8e77788e77788e7778 +6a5055846b6e9687877357556a50556a50556a505556363d73575573575556363d350c1a +260608260608210810d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d918081425081425081438232825101c2a142b2508142b181c2b181c +350c1a1b05002606083b18201000082508142b181c6a50556a505591706d94846ba08883 +9c847ba0947f968787bda49e7357559c847b6a50559c7b6da08883ad948c99797ba08883 +8c73607357557e5c5899797b91706d846b6e7e5c58846b6e9c7b6d91706da3908c846b6e +846b6e5e45428e7778b19ca3bfadb0b19ca3b19ca3bfadb0b19ca3bfadb0bfadb0bfadb0 +b19ca3bfadb0bfadb0b19ca3d5c2bea3908ca4a196a3908cb19494a4a196a4a196bfadb0 +d5c2bebfadb0bfadb0bfadb0bfadb0c7beb3c7beb3b9ada5bcb8aebcb8aebfadb0bfadb0 +c7beb3c7beb3b19ca3b19ca3c7beb3b19ca3b19ca3968787b19ca3968787846b6e7e5c58 +735755846b6e91706dd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d944272e5e45428e7778a3908ca3908c80695e5e454256363d2b181c +3b18204f362f99797ba97b777e5c58a58c7ba58686a3908cb19ca3a08883846b6e80695e +a1988da4a196948677bcb8ae846b6eb1a8a2a3908cb19494bd9c94a1988dad948c948677 +9c8c6fa08883a58c7ba08883a58c7ba0888394846bad948ca0888373575599797bb19494 +c7beb3b19ca3c6a5a0a4a196a3908cbfadb0b19ca3bfadb0a4a196a3908cbda49ea0947f +a4a196b1a8a2d5c2bec7beb3a1988db1a8a2af9f94bda49ec7beb3d5c2bed5c2bec7beb3 +d5c2bed5c2bebfadb0b1a8a2c7beb3c7beb3b1a8a2b1a488b9ada5c7beb3c7beb3b1a488 +b1a8a2c6b598a1988db9ada5ceb59cb2aa94b1a488a1988dbda49ea4a196a3908ca3908c +968787a3908cbda49ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9a58c7baf9f94bda49ec6b598c6a5a0af9f94ad948ccaab9ea4a196 +bfadb0a3908ca08883a3908ca3908cbfadb0bfadb0b19494a3908ca3908ca4a196a0947f +b1a8a2b99c8ca4a196a0947fb1a8a29c847bc6a5a0af9f94bd9c94a0947fccb1abbda49e +bfadb0b9ada5b19494a3908ca3908ca3908ca4a196b5887ba08883948677bd9c94b19494 +af9f94ad948ccaab9ebda49ea0947fd2c7afc6b598bda49eceb59cceb59cbdaa91b99c8c +b99c8cb2aa94a1988d9486779c9178a4a196bdb594b59c73c6ad8cb99c8cbdb594ceb594 +a58c639c8c6fc6b598b99c8cd0ba99d0ba99bdb594b1a488c6ad8cd2c7afd0ba99c6b58c +9c8c63ad9c84ceb59cc6ad94bda58cc6b58cbd9c7ba0947fd0ba99af9f94b1a8a2a4a196 +948677a1988d9c9178d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b7b5a0bda49ebda49ecebdadcaab9ec6ad94b99c8cc6a594a4a196 +af9f94b19ca38c7360b194944f362f2d0f0b180c08350c1a2d0f0b5e3e28a59473b59c84 +ad94739c8c6fad948cb59c84ceb5948e6352bdb594d6b9a9d6b9a9ad9c849c8c6f9c7b6d +a58c7bad948cbda49ebd9c94bda49ebda49eccb1abbd9c94947b637e5c58b19494af9f94 +bda58cd6b9a9ceb594d6b9a99c8c6fcaab9eceb59cc6a58cb59484c6b584ceb594dab28c +cead8cc1a584a5906b76533eb59c84947b56ad8c7bad846b9473635e3e287e5c58cead94 +9c7b636750439c847bad8c6bbd9c7bc1a584dab28cceb184bd9c7bd0ba99c6b584b59c73 +cead8c8c6b5a947b56b5947bc1a584cead8ccead78b5947bbd9c849486779c847ba1988d +a3908cb1a8a2b1a488d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d7d1c0ccb1aba08883bda49eb59c84b99c8c94685a8e6352906f4e +ad8463d0927bcea084996040a7735da7735d8e63528e63528c634aad8c73c69c8cd6bd98 +cead8cd6bd98ceb594c69c73bd9473cead8ccea084b59c73cea084d0ba99c6ad8ccead8c +bd9c7bb5947bbd9168ad9473a57f67a57f67ad8c6b9c847b6d463c6a5055bdaa91c7beb3 +bda58cbda58ca5906bad846bc69c7bbd947ba7735dad846ba7735dad8463b58456bd8c63 +a77047985e5290573d8c634ab58c73cea58cdab28cd2a575daad84bd947bcea084cead78 +b29460d2a575b5947bbd8c73bd8c73ad8c63c69c7bbd9168a5845aad8c6bad846bad7f5a +9f7e5a7e5b39cea594c69c84bd9473c69c73ad7f5adaa08cb584736d463c6750438e7778 +8e7778a4a196bda49ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9caab9ebda58c9f7e5a886b46ad8c6bad7f5abd9168d2a575c6ad8c +dab28cb5a57bc6ad8cc6ad94a5846bb99c8cbda58cbd9c94b59c84c6b584bd9c7bceb594 +b59c7b846b52c6b584a59473ceb59cceb59cbdb594cea594d0ba99decaa4bda58cbda58c +c6ad8ca5846bad9c84bda58cad9c7bbd9c849c8c6fc1a5842b181c56363daf9f94c6ad94 +caab9eb5947ba07b4ead7f5ac6a577b5946bb5946b9c7b637e5b39947b56a5845a986d5e +703d29996d47996d47906f46c39565ca946fad7e4fa77047a07b4ead7e4f886040886040 +7e5b3976533e90573d886040ad7f5a996d479c7352985e52996d47a7735d7e5b398c634a +906f4ec69c7b9c7b638c634a9c7352734c2ead7e4fa07b4ea5846b3b1820180c08b19494 +947b63a08883b7b5a0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d98c6b5ab1a488bd9c7bb59c7bbd9c7bc1a584c6a577cead8cd0ba99 +ebcfb8ceb594decaa4d6b9a9d0ba99af9f94947b63a08883a59473d6bd98d7c69ad6b9a9 +d6b9a9decaa4d6bd98d2c7afc6ad94d2c7afeacba5d2c7afdecaa4b5a98cd2c7afeacba5 +c6b598bda58ca59473b59c84ceb59cd6b9a9c6ad94c6ad8c2b181c291021a3908caf9f94 +ceb59cd6b9a9b29460ad7f5abd9168b5947bad8c6bbd9c73bd9c7bb5947bc1a584c08c7e +7e5b39b58473bd94739f7e5abd8c63ad8463d0927bbd8c63b58456ad84639f7e5ab58c73 +9c7352985e52b58c73bd8c638c634a886040ad7f5ac69c7bad846b703d29b58c73a5845a +c69c7bbd947bad8473986d5ead7b639c7352ad7f5aad7f5a83584d2d0f0b100008a08883 +a08883af9f94a4a196d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9a59473caab9ead9c7bb59c73ad946bb5a57bc6ad8cceb594c6b584 +d6bd98b1a488decaa4d6b9a9ccb1abc6b598bda49e94846bceb59cd0ba99d0ba99d2c7af +d2c7afd6b9a9d0ba99d0ba99d0ba99ccb1abd2c7afd0ba99b5a98cbdb594d2c7afebcfb8 +bda58cb99c8cb59c84bdaa91d0ba99bdaa91d2c7afbd9c7b180814180014968787bd9c94 +d5c2becead94b29460bd9473c69c7bc69c7b9f7e5ab58c73c1a5849c7b63ad8c6bd6ad96 +8c634aad846b9c7b638c634ab58c73ad7e4fc69c73b58456ad7e4fad8c639c7352ad846b +886040886040ad846b9c735e8c634ab58c73a57f67ad846bb58c73734c2eb5946b9f7e5a +bd947be2b399a57f6783584db5947b9f7e5ac1a5849c73526d463c180c0810000844272e +968787ccb1abd7d1c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ceb59cebcfb8bda58cc6ad8cb5a98cd0ba99ceb59cceb59cdecaa4 +d6b9a9ceb594ccb1abebcfb8b5a98ccebdadd2c7afb19ca3d2c7afbdb594d2c7afceb59c +d2c7afbda58cd2c7afd2c7afebcfb8d0ba99d0ba99d2c7afebcfb8eddfc8ceb594ccb1ab +b1a488ad947bbdaa91ad9c84c6ad94a59473bd9c94a5846b1800142a142b735755b2aa94 +d5c2beb59484ad8c6bad8463d0927bbd9c7bb58c73bd9c7bc1a584ad8c7bc6a58cb5947b +947b56ad8c7bad8c6bad8c6bcead8cad846bad7f5ab58c5acea084e4bda2bd9473b5947b +9c7352986d5ebd94737d584a83584dad8c73c6a58ca5846bb5947bc6b584e4bda2b58c73 +ad8c6bb58c7394685a947b63cea594a5846ba5906b4621135e454225101c2a142b25101c +846b6ea1988da4a196d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ccb1abdecaa4d0ba99d0ba99ccb1abd2c7afd7d1c0eddfc8d2c7af +decaa4ceb59cc1a584d2c7afccb1abd0ba99af9f94caab9ea58c7bbda58cc6ad8cad9c84 +cebdadccb1abd7c69ac6b598b1a488bdb594bda58cbdaa91bdaa91ad9c7bc6b58cad9c84 +bda58cb59c849c8c6f948677b5947ba58c7b9c8c6f947b6338232824061e2b181ca1988d +ceb59cbd9c94bd9c73c69c7bdab28ccea084d0927bc1a584ad8c73ad8c73b5947bad8c6b +9c776ba57f67ad9473b5947bb5947bb5946bc69c73ad8463cea084cea084b59c739c7b63 +9c735e996d47c69c7b8c7360a57f67986d5ea5947394685a9c8463bd9c7b947b63b58c73 +cead8c8c634ab59c7bbd9c84a5846bad947b8c6b5aa57f67a58c7b1808140b0319180014 +56363da4a196d5c2bed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ceb59cceb59cc6ad94d2c7afd7c69ad0ba99d2c7afc7beb3b59c73 +bd9c84ad947bb59c84b59c7bbda58cad947bb59c84bda49e8c7f6bceb59494846bb1a488 +bd9c94bdaa91a0947fc6ad8cad9c7bbda58cbda58cad9c7b9c8c6f9c8c6fb59c84948677 +a5846bbda58c948677b5947b8c7360a5846b80695ea5906b6a50550b03191b0500ad948c +d6b9a9d6b9a9c69c73ad8463bd9168ad846bc69c73c1a584b5947bbd9c84b59c7bad846b +a5906b83584d76533e8c7360a5846bbd947bb59c73cea084bd9168a57f67bd947b947b56 +9c7b63906f4ec69c849c776ba97b779c776b8e63529c8463cea594b59c7ba58c63a5845a +cead8cb5947bceb594bd9c8494685aa5846ba5906bc1a584ad948c2b181c0b0319382328 +180008a1988dd7d1c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9bd9c94d6bd98cea594ebcfb8d2c7afdecaa4bda58ca5846bb59c7b +bd947bb5947bc1a584a59473a5846ba5846bc6ad94bda49eb1a488c6ad8cad9c7bceb59c +ad948ca59473ad947bc6ad8cc6ad94947b63a5906bb1a488b59c7bb59c84886b46947363 +7d584aa59473a58c7bad8c7b846b5276533ea5846ba58c7b6a5055180014210810947b63 +e4bda2c6a58cb58456d69c7bca946fc69c7bd0927bbd9c7bb5947bb5946b947b63a57f67 +ad8c6b94736383584da58c7bcea58cb5947ba7735ddaad84a57f67947b56b58c73947b56 +947b5694685ab5946bad8c7b8e635294685aa5846ba5846ba5906b886b46b59c84bd9c7b +b5946bc69c7bc1a584bd9c7bbd9c7b8c634aad8473a5845a80695e24061e180014291021 +2d0f0ba08883d0ba99d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9a58c7bd6b9a9b59c84ceb594947b63b5947bad9473a58c7bad846b +ad8c6bbd9c7ba5846bb5947bb5947bb59c7bc1a584ad948c947b63947b63decaa4ad947b +b59c84b59c84c1a584b59c7bb59484c6ad8cb5947bad947bbd9c84a59473ad8c738c7360 +7d584a947363ad84737d584a9473636d463cb59484b58c7325101c24061e2108044f362f +ebcfb8906f4ec39565bd8c63ad8463d69c7bc69c73ad846bb59c73ad8c6b9f7e5ab5947b +a5846bad8c73a58c7bbd9c94bd94849f7e5acea084c69c7ba5845ab5947bb5947b9c7b63 +a5846bb5947bbd9473ad846b8c634a9c7b63bd947b9c7b63b5947bc6ad8cc1a584c6b584 +bd9c7bcead8ccead8cb58c73ad846b8c634aad846bad8c6394736318081424061e250814 +8c7360c6b598bdaa91d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9948463decaa4eacba5c1a5849c7b63c1a584cead8cc1a584b59c73 +ad8c6b8e6352996d479c735eb5947ba58c63b59c73a5906bceb594ad947b9c8463ad9484 +8c7360ad947ba59473a08883b99c8cb2aa94bda58ca58c7b80695e947b63a08883bd9c7b +9c7b6dc69c8483584d947363a5846b76533ea59473b59c7376533e250814180008382328 +eacba5dab28cbd9168ad7e4fb77b5dc69c7bb58c6b985e52886040bd9c84a5846bbd947b +b59c7bcea5949c8463ad8c73b5947b9f7e5aa7735dad946bbd9c7b947b56bd9c7ba59473 +ceb59ca5906bbd9c94ad8c6b94736383584db594849c7b6dad947bbda58ca5906bbd9c7b +c6ad8cc6ad8cad947b846b52a5846b947b63ceb594b1a488ad9484180c0825101c100810 +b19ca3b1a8a2ceb59cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d98c7360eddfc8c1a584947b56ad8c73d6bd98bd9c84c1a584c6ad8c +bd9c84bd9c7bb5947bc69c84bd9c7bb5947bbd9c73a58c63c1a584ad9c7ba58c7bc6a594 +a5846bad947bad947bb1a488c6b598bd9c94ad9c84b59c84ad9484ad947b9c7b63846b52 +a57f67947b6376533e8c6b5a9c776bad8c73947b637e5b3980695e1800141800085a2e27 +decaa4daad84b29460bd9168d69c7bcea084daad84c69c7bad846bc69c84c6a58cb5947b +ad8c6bad9473a5846ba5906bad846bad846bad8c6bb59c739c7b637e5b39cead8ccead8c +9c7b636d463c947b63c1a584a5846bc6a58ca59473b99c8cb5947bad9c7bc1a584ad946b +bd9c7bb1a488eacba5947363b59c84bda58cb5947bc1a584948677382328180014180008 +b19ca3a4a196d7d1c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d96d463ceddfc8b5947b94685ab5947bb5947b846b52bd9c7bad9473 +a57f67bd9c7bbd9c84c1a584ad8c6bb59c73b59c73bd9c7bb5a57bc6ad8cbd9c94d6b9a9 +ad9c84a59473b59c84c6ad94b59c84948463a58c7bc1a584ad947ba5846b947363cea594 +ad9c7b5e3e28ad8c7bb59484ad8c739c7b639c8463b59484a08883210810100000a59473 +c6b584ce9c77bd9473ca946fad7e4fad8463daad84bd9473ad8c73b5947b9c7b63cead8c +cead8cc6ad94ad8c73947b5683584da57f67ad846bb58c73b5946ba57f67b5947bad8c73 +8e6352947b639c8463ad8c739c7b639c7b639c8463bd9c84c6a58ca5906bbda58ccead8c +b5a57bcea594948463a58c7bbda58ca57f67bda58cad8c6ba594733823281b0500180814 +a3908cccb1abc6b598d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d98c7360ebcfb88e63529c7b63c6a58cad846b846b52b5947b9f7e5a +9c8463ad8c73bd9c7bbd9c7bb5947bceb184c6b584c6ad8cc1a584bda58cc1a584bd9c94 +b59c84a5846bb59484ad8c73bd9c84b59c84cead8ca58c7b947b56a57f67c6ad94a5906b +8e6352947b6383584da57f679473639c7b638c6b5ac6a58c846b6e1000082d0f0bebcfb8 +decaa4cead8ccea084c69c73daad84c39565ce9c77d6bd98cead8c9c7b63bda58c9c7352 +a5846bb5947b8e6352846b528c6b5aceb594b58c73996d479c7b63b58c73ad8c6bbd9c7b +7d584aad8c6bad8473c6b584bd9c849f7e5abda58ccead8cc1a584bd9c84bd9c7bc1a584 +bd9c84947b63c1a584947b56b5947bb59c7bad8c73c1a584bd9c844f362f2b181c250814 +846b6eaf9f94decaa4d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9bda58ccea594846b52ad846ba57f679c776bb58c73bd9c84ad8c6b +b5947bad8c6bbd9c84ad9473c1a584ceb594cead8cc6b584b59c7bc6a58cb59c84bda58c +bd9c94ad9473b99c8cb59c7bbd9c849c7b63ad8c73b5947bcea594bd9c84ad8c73ad9c7b +846b52947363947363a57f67ad8c7b947b56a5846b9c7b6d4f362f2b181c100000a59473 +d6bd98eacba5cea084ca986bca986bc6a577daad84b5946bb5947bad8c73b59484b59c73 +bd947ba5846b948463947363a5846bbd9c7b7e5b39b58c73ad846b9c73528e6352ad8c6b +8c634ac1a584ad8c73b5947b9c8463b59c7bb5947bb59c73846b52b59c7ba5906bb5947b +76533ead9473a5906bb5947bbda58cbd9c84c6ad8c8c634a9c7b63a08883250814180014 +bda49ebda49eeddfc8d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b5947ba5846b8c6b5aa57f6779483d7e5b39b58c739c7b63b58c73 +bd94739c7b63b59c7bad8c73c1a584daad84c69c73c1a584bd9c7bbda58cc6a58cb59484 +c6a594a58c7bbd9c849c7b63b59484a5846bb5947b9c7b6da59473ad8c73b59c84b59c84 +846b528c73605e3e28ad84739c776bb58c735e3e28ad947b56363d180008180008100008 +d7c69ad6bd98cea084ce9c77cea084b58c5aad7b63c1a584c69c849c7b63bd9c84ad8c6b +ad846b8e6352bda58ca5846bb99c8ca5846b947363906f4e9c7b63bd947bb5947bc1a584 +ad846bb59c7b906f4ebd9c84947b63cea594b5a57bb5947ba57f67c1a584b5947ba58473 +bd9c84947b56bd9c84c6ad8ccead8cb5947bceb594947b56ad8c739c847b180014100008 +bfadb0ad9484ad947bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9bd9c848e6352846b529c73528c634a7d584a9f7e5a7e5b39bd9473 +bd947b9c735eb5947bc69c7bb5947bc69c7bbd9c7bc6b584b5947bad9473b99c8cad8c73 +a58473947b63a58473ad8c73b594849c7b6dbd9c84a59473a58c7ba58473ad9c84b59c84 +886b465e45429c7b63a97b777e5b39a57f67a5846bad947b210810180014180814180c08 +ceb59cebcfb8c69c73cea0848c634a8c634a996d47b58473b58c739c7b639c7b639f7e5a +9c7b639c7b63b5947b8c6b5aa5846b80695ead8473a5846b8c634a9c7b63c1a584bd9c7b +8c7360a57f67c6ad8cb59c84a59473b59c7bb5947bad8c6bb59c84ad8c73a58473b99c8c +947363ceb59ccead8cc1a584c1a584b5947b947b56ad846b80695e2d0f0b1000002a142b +a3908cccb1abd7d1c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9cea5949c7b639f7e5aad7b63ad7b638c634aa7735db5946bcea084 +bd947b906f4ead846bc1a584906f4eb58c6bc69c7bdab28cc1a584ad8c73cea594ad947b +a57f679c7b6db59c849c7b6dcea594ad9484a58c7b947363a58c7ba59473948677bda58c +9484638e63528c6b5a9c7b638a5a58bd947ba5846bb59c7b21081018001424061e100000 +c6a594eddfc8c69c73ad7367844832945852985e52ad846b9c73528c634ab58c73cea084 +b59c73c69c848c6b5a947b63947b639c776bad8c73a5846b947b639f7e5abd9c84ad9473 +c1a584b59c7bc1a5847e5c58947b63a594738e6352b5a57b947b56bd948cad8c7bbd9484 +bd9c84ad8c739c7b63a57f67bd9c7bad9473a57f67a5846bad94845e454224061e180814 +bfadb0bfadb0ceb59cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ceb594947b56986d5e76533e94685a8c634abd9473bd9168a58473 +8e63528c634a9c776ba57f67c6a58cbd947bbd9c7bbd9c7bc69c84b5947bad8c6bb5947b +a57f67b59c739f7e5ab59c73c1a584886b46a59473ad8c738c7360a57f67a5906b76533e +7e5c585e4542ad9c7b846b525e3e286d463ca584737d584a25081408000808001025101c +bda49ee4bda2b294607d584a985e52b5946b996d47ad84639f7e5a9f7e5a947b568c634a +7d584a9c7b63bd9c94b59c84b59484906f4e9c7b639c7b6d735755947b63ad9c7bc1a584 +948463ad9c7bceb59476533e947b56caab9ea584739c7b6db59484a58473c6a58c8c6b5a +a5906ba5846b7e5b39a5846bbd9c7bbd947b9c7b639c7b638e63522d0f0b2a142b180014 +af9f94c6b598d0ba99d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9eacba59c776b83584d9c776b83584db584739c7352b5947b9c7352 +8c634aa58c7bad846bb99c8cb5947bc69c84c1a584b58c73c1a584c69c7bc1a584b58c73 +bd9c7b9c7b63ad846b9c84638e635276533ead947ba5847376533e886b46ad94738c7360 +846b525e3e28846b5280695e8e6352a5947383584d7357551b05001000080b0319100000 +a3908cebcfb8996d479f7e5a9c7352c08c7e9c7352ad8463bd9473ad7f5abd9c7bad8c6b +ad8c73b5947bb59484ad947ba5846bad8c7bb58c73947b63a58c7ba59473bd9c84bd9c7b +7d584abd9c7bc1a584a5846bb59c84caab9eb59c84b5947b947363947b639c8463886b46 +a59473b5947bc6a58cc6a58c9c7b63947b56947b567d584a5e3e285e4542382328180814 +b19ca3b7b5a0bda58cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c69c84846b52985e527d584a945852734c2ebd9484bd9473b58c73 +a57f67bd9473cea594bd9c84c6a58cb5947bb5947bdab28cc6ad8cb58c73a57f678c634a +b5947b9c7b63bd9c84bd9c7bc1a5849c7b6d9c7b6376533ead8c739c7b63906f4e7d584a +b59c845e3e288c736076533eceb59c76533e8e63525e4542250814210810180014100008 +a08883d6bd987e5b39a7735dad846ba7735dbd8c63ad8463b58c6bb58c73bd9473b58c73 +9c7b63cea594a5906bb59484bd9c849c7b639c735e5e3e28947b56947363a5906bbd9c7b +9f7e5aeacba5d6bd98bda58cc6a58ca594738c6b5aa594738c6b5ac6a58cc6ad8c8c7360 +cea594c6ad8cb5947b947b568e6352b5946bc1a584cea0849486775e4542382328180008 +b19ca3c6b598c7beb3d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9e2b39994685a9c7b6383584d79483db5887bad846b9c7352ad846b +947b56ad846bc1a584bd947bceb59ccea594decaa4d6bd98c1a584bd9c7bb59c73bd9c84 +c6a58cad8c7bad8c7bc6a58ccea5945e3e28ad847b6d463c947363a5846b76533ebd9484 +76533e9c7b63a5846b9c7b6d8a5a586d463ca57f67382328350c1a1800081800142a142b +bd9c94caab9eb58c73b58c739f7e5ada9c84c69c73b58c6bcea084906f46b5947b9c7b63 +ad8c6b846b527e5b398c7360906f4ead8c739c7b63ad8c73ad8473b5947b9c735eb5947b +ad8c6bb5947ba5906bad9473c6a58c947363846b528c6b5a846b52ad94739c7b63a59473 +bd9c84a5906b8c6b5aa58c63bd9c7bd6bd98ad8c6bc6ad9480695e382328180014180014 +b1a8a2a3908cd2c7afd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c6a58cb5947bad8473a97b779c7b63ad7b6bb5887b7d584aad8c6b +a5845ac69c849c7b6d9c7b638c6b5ab59c7bd6bd98c1a584c6b584c69c7bcea594ceb594 +bd9c84bd9484a57f67ad847b7d584a6d463cad848476533e986d5e83584d9c7b63846b52 +9c776b8e63528c6b5aad847b94736344272e76533e3b182056363d1800141800142b181c +bfadb0ceb594c1a584b58c73c69c84bd9c7bce9c77d2a5759f7e5a9c7b639c735ea5846b +9c776bad8c73a5846ba57f67b99c8c9c776bbd9c84bd9c7bad8c6b9c7b639c7b63c69c84 +b5947ba5846b9c776bad8c6bb1a488a59473a58473a58473c1a584bd9c84bda58cad8c73 +a5846b9c8463ad946bceb594b5947bbda58cad8c73af9f943c160a250814100000100008 +8e777880695ea0947fd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ceb59cc6a58ccaab9ed6ad9683584d9c776b79483d9c7b63a5846b +9c7b6dad8473947b63947b56ad8c73c6ad8ce4bda2ceb594c6ad8cad9473c6ad8c9c7b63 +9c735eb5947b9c776b7e5c585e3e2891706d6d463c3b18204f362f79483d846b5283584d +9c7b6d76533e5a2e274f362f5e3e28846b6e2b181c3b182056363d291021180014180014 +ceb59cd6b9a9a5906bb59484a5846bdab28cad8c6bad8c63c08c7e9c735ebd9484a58c7b +b99c8c947b56bd9484c69c8cbd9484a59473a58c7b9c7b63ad8473734c2e9c7b6da97b77 +83584d83584d7d584aad9473ad846b9c7b63b5947ba5846bad947b947b56bd9c84b5947b +947b63b5947bc1a584c6ad94ad9473a08883a58c7b99797b250814180008180814180014 +382328a4a196846b6ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b59c84a59473ad8c73a5846bc69c8c9c7b6db59c84b99c8cbd9c94 +b594849c7b6d9c7b6d947363ceb59ccea594ceb594d0ba99ad9473bd9c84c6ad94a5846b +ad846bc6a58c9c7b63846b6e8a5a584f362f6a505544272e2d0f0b9c7b63947b637e5c58 +83584d5e454276533e91706d3b182044272e25081421081024061e18001418081456363d +c7beb3cebdada59473a08883b59c7bbd9c7bb59c73bd9473c69c84a58473a08883675043 +7d584a986d5ead8473bd9484a584735e3e286d463c83584d8e63523c160a6750435e4542 +5e3e2856363d7d584a76533e7d584a947b56bd9484bd9c84c6a58cad846bc6a58cb5947b +a5846ba5906bad9473ad947bcaab9e7e5c5844272e3823281000001000082a142b2b181c +4f362fc7beb394846bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad9c84c6ad94b59c84b99c8c9c7b639c7b6d5e3e287e5c588c6b5a +7357557e5c586d463c846b52ad8c73c6ad8cc6b584c6ad9476533ead9c7ba5846bb59c7b +bd9c84e4bda2b58c7373575544272e250814462113350c1a94736380695eb59484ad948c +7d584a5a2e273b18203b182044272e2b181c21081024061e25101c1800142a142b968787 +ccb1aba0947f9c8c6f947b63a58c7bb59c7bbd9c7ba57f67bd9c846750436d463c3b1820 +76533e99797b8e63527e5c585a2e274f362f735755a57f6780695e3c160a3b1820350c1a +3b18202d0f0b6d463c8c634a947b568e6352906f4e9c735ead846bad846bb5947bad8c73 +a5906bad8c73a5906b5e3e2880695e2b181c180014100008180014291021080010180920 +a3908ca1988db99c8cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9a08883bda49e8e77785e45421800142a142b2b181c180014180014 +2508141000080b031918001418081408001025101c25101c25101c180920180014080010 +180014100008180008080008100008180014180008180014180014180014100000080010 +18001418081425101c2508141800141800140b031918001425101c180c088c7f6bccb1ab +a4a196d5c2be44272e2108046d463c7d584a5e3e2876533e5a2e275e3e285a2e2776533e +5e3e284f362f7d584a5a2e274621135a2e275a2e275e3e28675043260608350c1a350c1a +83584d9c7b6398734e76533e886b46bd9c7bc1a584bd947b947b63a5906ba5846b947b63 +b5947b9c7b6d5e3e2844272e2b181c1808141000001000081809200b03191800142b181c +80695e8c7360735755d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99c9178a1988d9c847b846b6e44272e25101c180014250814180814 +24061e38232824061e18001418001425101c1000080800080800080800101800140b0319 +0800101000081800140b03190b03190800080b03190b0319100008080008180920100810 +1800141808141800141808141800141800141800141808141800085e4542ceb59cb7b5a0 +ad94849c7b6d5e45423b182044272e5e3e2899797ba088835e3e2899797b7e5c586a5055 +91706d56363d56363d350c1a350c1aa08883bd9c94ad948c9c7b6d382328250814382328 +5e45426d463c76533e7357557e5c588c73607e5c585e45425a2e275e45426a50556d463c +5e45424f362f56363d3823281000001800141809201809201809201000083823286a5055 +b19ca3b9ada5b7b5a0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ccb1abad9c84af9f94bd9c94bda49eb19494b19494c6b598b19ca3 +a08883a3908ca3908c968787b19494a4a1966a505529102124061e1800141800140b0319 +1800141000080800080b03190b03190b0319180920080008180920180014180920180014 +25101c08000818092010000810000818081425101c210810a08883948677b1a488cebdad +d2c7afceb59cc7beb3ccb1ab3b18203c160a1000001000081b05001800142b181c250814 +3823281800142b181c18001425081425081410000025101c100000180814180014250814 +2d0f0b3823282d0f0b2b181c210810210804210810350c1a2508142b181c210810180014 +1b05002508142508141000081800142a142b180814180c08100000180814735755a4a196 +c7beb3bcb8aeb1a8a2d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b1a488ad948cceb59cbda49ed6b9a9c7beb3c6b598a0947fa58c7b +a08883ad9484bd9c94a08883af9f94b19ca3a3908cbda49e99797b5e4542180014100008 +1b0500180c081000001000001808141000082b181c44272e948677a3908ca4a196b19494 +a4a196a4a196a4a196968787968787ccb1abd5c2becaab9ed5c2bed6b9a9d6b9a9eddfc8 +ccb1abdecaa4bdb594d5c2bed6b9a9b1949480695e210804210810100008100008180014 +100008100000180014100000180c0808000810080010000818000810000810000880695e +bfadb0b1a8a2d5c2bec7beb3d5c2bed5c2bea088834f362f21081044272e5e45424f362f +2a142b99797b56363d56363dbda49e91706da08883bd9c94bda49ec6b598ccb1abc7beb3 +cebdadceb59cceb59cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9947b56ad8c73ad948c947b6394846bbd9c84ceb59cc6ad94b5947b +bd9c84c6a594a594739c7b6d83584d80695e8c6b5a947363947b63a58c7ba58c7bc6a5a0 +bd9c94caab9ead947bcaab9ed6ada5c6a58cc1a584c6ad8ccea594ad8c737d584a6d463c +675043af9f94a1988da0947faf9f948e6352ad7b63bd9484bd9c84ebcfb8b59484a5846b +9c8c639c8463948463b5947bceb594ad9473947b639c7b6dd7d1c0a3908c968787a08883 +a4a1968e7778d5c2beeddfc8d7d1c0d7d1c0cebdadd7d1c0c7beb3eddfc8eddfc8d2c7af +eddfc8d7d1c0bda49ed2c7afd6b9a9bdb594ceb59ccaab9ed6b9a9d2c7afd2c7afc6b598 +d2c7afceb59cceb59cd6b9a9c6ad8cc6ad94c1a584b5947bcea58ccea594b59c7bad846b +a5906bad947bb1a488d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c69c84e4bda2ebcfb8e4bda2e4bda2decaa4decaa4bd9c848c634a +a57f67bd9484906f4ec69c84b58c73c6a58cb5947bd6bd98c69c84cea58cbd947bc69c84 +9c7b63ad8c6bc69c7be4bda2bd9473ad7f5aad7f5ac6a577c69c73b59c73b58c73b59c7b +ad8c6b76533e67504376533e7d584aad8c6bb57f6bad846bad846b79483d4621131b0500 +260608703d29eacba5d6bd98bd9c7bcead8c906f4ead84739c7b6d2508144f362f80695e +bda49ebcb8aed5c2bebcb8aec7beb3d0ba99d0ba99948677cea594d0ba99d0ba99bdb594 +ad9c7b9c8c6fd2c7afc6ad8cbdaf81c6b584d7c69ad6bd98decaa4d7c69ad0ba99d0ba99 +b5a57bdecaa4c1a584d6bd98d7c69aa58c63d7c69acea084cead8cd7c69ae2b399dab28c +ad946bad8c6bad8c6bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b57f6bc395658c634aa5846bad947bad8473ad8c7b906f4e844a44 +9c7352b5887bad7b639f7e5aad7b63ce9c77cead8ccea084b58c73ad846b9c7352ad7b6b +985e52b77b5db58c73bd8c739f7e5aa07b4ec69c73bd9c7bbd9c7bb58c73ad8c7ba5846b +9c7b6d4621134621135526175a2e27b77b5d9c73525e3e288d49385a2e277e5b395a2e27 +886040cea58cb77b5db59c73c69c73996d47906f4ead847b4f362f3823286a5055a08883 +b1a8a2d7d1c0d7d1c0d2c7afeddfc8b59c73b59c73bd9c7bb59c73c1a584bda58cb5a57b +a59473b5a57bceb594c6b58cc6ad8cb1a488c6ad8cad9473bda58cbdb594d0ba99d7c69a +c1a584decaa4c1a584bd9c7bd6bd98b59c7bd2c7afcead8cbd9c84c6ad8cc6b584ceb594 +c1a584cea594d6bd98d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b77b5dbd94738c634ab58c73ad8c73ad846bad8c7b8e6352b57f6b +a9695c945852c6947f886040bd9473c39565d0927bc69c7b9c7b639c73528448329c675a +ad7b63c69473a36150a57f67ad8c7bad846bd6ad96bd9c7bb99c8c99797b99797b83584d +79483d94685a844a44945852bd7b7bb87158c6947fd2a575cea084bd9484c68c84e2b399 +a9695caa7052c6947fbd9473ad7b63844a44844a449458526d463c1b050056363daf9f94 +d5c2bec7beb3d7d1c0d0ba99b1a488b58c73bd9473ad8c63bd9c7bc1a584a59473c6a594 +ad8c6bceb594cead8cc6b598bda58cad947bc6ad94bda58cd6b9a9c6ad94bdaa91d0ba99 +bd9c73cead8cceb594c6a58cc6ad94d6b9a9d7d1c0d2c7afc6b598bdaa91a59473b59c84 +b59c84d0ba99ccb1abd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99c7352a7735db77b5db57f6bc69c7bb57f6bbd8c739c675a7e5b39 +9458529c735ea7735dc08c7ebd9168bd9473ce9c77a7735dad7e4f9c7352985e52a56b4e +c69473a36150a36150985e52bd8c63906f4ec69c7bcea58cbd947bbd8c73bd9473886040 +9c7352945852a7735dbd8c63bd9168c39565daad84cead8cc69c73c39565c69c7bcea084 +bd8c63ad846bbd947bbd8c63ad8c63996040ad84638e63523b1820100000180920b7b5a0 +ebcfb8d2c7afd2c7af9c8463a57f67d0927bb58c73b59c73dab28ca5906bc6a58ca5906b +bd9c7bb5a57bc6b584c1a584bd9c7bad946bb59c73c6ad8cbd9c7bb5a57bd0ba99b5a57b +c6b58cd7c69aceb184bd9c7bc6b584cea594c6ad8ccaab9ea58c7ba59473a58c7bceb594 +b5a57bceb594ceb594d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ca946fb77b5dad7b63a77047bd846fc6947fad7b6b9c735e9c675a +ad7b63bd94739c7b63bd9168c69c84cead8cca946fa7735db57f6bb77b5d996040b77b5d +ad7367c69473b871589c7352886040a7735dbd9473bd9473886040a7735d9c735e886040 +703d29bd8c63985e52996040b58c6bb58c6bc69c7bbd9473b58c6bad8463b58456b58456 +ad7f5a9c73529c7b63ca946fa7735d8d4938ad7b638c634a3b1820180008080010c6b598 +c7beb3bdb594b59c7bb1a488bd9c7bbd9473bd9473cead8cceb594cea58cad9473bda58c +c1a584decaa4c1a584b5947bbd9c7bc1a584ad9473c1a584cead8cb5a57bd0ba99d2c7af +ceb594ceb594cead8cc6b584d0ba99c1a584bda58cbd9c84b59c84bda58cc6ad94bdb594 +ceb594d0ba99d2c7afd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b58c6ba7735dd0927bca946fda9c84c08c7e79483d552617734c2e +94685abd947bb58c73bd947bcea084ca946f996d47996040a7735d9c7352b57f6bda9c84 +b77b5dc08c7e985e52ad7e4fad7b63ad846bb58c6bc08c7e7e5b397e5b39bd846fa7735d +76533eb57f6b996d47b57f6bd69c7bdaad84d6ad96b58c6bb58c6bc69c7bbd8c63ce9c77 +daad84cea084c69c8cda9c849c7352ad7b63b57f6b83584d2d0f0b180014180920675043 +bdb594ebcfb8a59473bda58cbd9c7bbd947bcea084bd9c7bceb594b5947bad8c73947b63 +b59c7bc1a584b59c73b59c7bc6ad94ceb594ad8c73ad9473c6ad8cceb594ceb594c6b584 +eacba5a5906bc6b584cead8cc6b584ceb59cb1a488ceb594c6ad8cceb59cad9473bdaa91 +b5a98cd0ba99b7b5a0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b57f6ba77047b58456a7735db58c6bb5887b947b567e5c587d584a +8c634a9c7b639c7b63ad846bad7b63ad7b639458529c7352ca946fa56b4eb57f6bad7b63 +985e52a56b4e996040ad7b63d0927bbd9168c69473ad846bad7b639c7352d6ad96703d29 +cea084da9c84ad7b63da9c84ad7b6bcea084a7735dc08c7ec69c73da9c84c69c7bce9c77 +da9c84ad846bbd9473c08c7ead7b63da9c84a5635a8a5a5826060825081424061e462113 +bda49ed6b9a9ad8c73bda58cc1a584c1a584b5947bb5947bb5946bad8c73ad8c73a59473 +ad8c73bda58cd6bd98ad947bc6ad94b99c8ca5906ba5846bc1a584c6ad8cc1a584ad947b +ceb59cb59c73b5947bb5947bd0ba99b5a57bc6ad8cceb594c6ad8cb59c84a59473ceb59c +d7d1c0eddfc8b7b5a0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b57f6bca946fda9c84daad84da9c84ad7b6b83584d79483d906f4e +9c7b63bd947bad7b63ad846ba7735da7735d90573d844832a7735d9c73529c735290573d +a7735dad7b63b57f6bb57f6ba7735dbd9168c08c7e886040c08c7edaa08cc694738c634a +9c675a3c160a703d29ad7367a7735dd6ad96ad846bb58c6bad8463bd9168bd846fb57f6b +ad7e4f90573d9f7e5abd846fad7b6bad7367703d298a5a582d0f0b180014180920735755 +ceb59cc6a594b59c84a5846b9c7b63b5947bb59c73b5947bbd9c7b947b63c6ad8c9c7b63 +ceb594b5947bd0ba99c6ad94d6b9a9bda58cceb59cceb59cceb594decaa4bda58cb5947b +eacba5947b63c1a584c69c84ad9c73c6ad94b1a488a58c63ceb594c6a58cbdb594a58473 +c6b598af9f94a1988dd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9a7735dbd9473c69473cea084b57f6ba7735d94685a94685a8c634a +b58473bd947b9c7b63b58473ad846b9c675a90573d9c7352ad7b6bc08c7e76533e996040 +ad7b639c7352844832a56b4ea7735dbd9473a7735d9f7e5abd9473d6ad969c73529c675a +844a44886040b57f6b9c7352985e52b58c6bbd9473ad7b639c73529c675ab77b5dad8463 +a56b4e9c7352bd9473bd947bbd94849c675a703d29986d5e260608180014180814948677 +d6b9a9caab9ebd9c848e6352947b63b5947bb5947bbd9c7ba57f67ad8c738c7360bd9c84 +bda58cc1a5849c8c6fcea594bda58ca5846bb59c84b59c7ba5846bbda58cad8c6bceb594 +b59c7ba57f67c69c84c6a58cc6a58ca5906bceb594ceb594c1a584ad8c73947363947363 +91706d7357554f362fd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9bd9c84c69c84c68c84d0927ba7735d996d477e5b398c634a986d5e +b57f6b9c7b637d584aad7b63ad846bad7b639c735eb58473ad7b63ad846b8448329c7352 +c69473ad7367a56b4e996040daad84c08c7ea7735dcea58cbd9473bd8c73ad7b638e6352 +76533ec68c84a7735d996040dab28ceacba5c69c7bb57f6ba7735d8c634aa7735db57f6b +996d47ad7b63d0927bbd9c84c08c7e9c7352945852a97b771b0500180814180920ad9484 +bd9c94bd9c94a5846ba57f67cea58cad8c6b9c7b63ad8c6ba57f679c7b63a5846bb59484 +decaa4bda58cb59c7bceb5949c8c6f9c8c6fad8c73a5906ba5906bb5947bbd9c7bc6ad8c +b5a57ba5846bbda58cc6a58cad8c7bc1a584c6b584b5947bb99c8ccea5948e6352735755 +5a2e277e5c587e5c58d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b99c8cbd947bcea084c69c7ba7735db58473945852a7735dad7b63 +bd846f9c735e9c7352c69c8cb5887b9c735ead7b6b9c675a986d5ebd8c73d6ad96c68c84 +bd846fa56b4ec08c7ea7735de2b399bd9168c1a584c69c7bb5947bad846bad846b79483d +5526179c675a985e52bd9168ca946fc39565c39565ad7b63ad7367844832b87158c69473 +aa7052bd9473d0927bbd9c7b947b56734c2e986d5ebd94842108042b181c100008a0947f +a08883d6b9a9a57f67ad847bb58c738c634acea58cc6ad8cb5947ba5906bb99c8cb5947b +c6a58ca5906bb59c7ba594737d584aad9c73c1a584b59c7bcead8cb59c7bceb594b5a57b +c6ad8cceb59cbd9c84ad847bbd947bbd9c7bc1a584c6a594c1a58483584d9c7b6d6d463c +8a5a586d463c7d584ad9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99c7352daa08cad7b639c675aad73679c7b6394685a846b529c7352 +9c735e906f4e8e6352b5947bad846b7d584aa7735d9c8c6fc1a584ad8c73ad846b9c7352 +ad846b996d47cead8c90573d734c2ead846bad8c6bb5947bb5947b906f4eb5947b844a44 +844a44734c2ead8463ad8c63c39565c08c7ead7e4fb57f6bbd8c639f7e5aa7735dad846b +947b56ad8463b59c73b58c739f7e5a886040ad846bad7b6b21081024061e180920735755 +bda49ed0ba99bda58ca57f67986d5e734c2ebd9484bd9c7bad9473a58c7bbd9c7bb59484 +ceb59cb5947bbd9c7ba5846bad9c84c6a594846b52c6ad8cc6ad94b59c7bad94739c8463 +947b56b5947b9c7b6dad8c73ad8473b5947bb99c8cc6b584bd9c7b846b529c7b6d734c2e +6750437357557e5c58d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9552617d0927bad846b844a449c675a734c2e79483d8c6b5a9c7b63 +986d5ec69c8ca5846b947363ad8c7b886040bd9473a5846bb59c84ad8c739c7b63ad846b +bd947b9c7b63bd9473ad7b63bd9c7bcea58cbd9c84b5947bbd9473a5846b996d47552617 +844832ad7b63bd9473bd9473ce9c77daad849c7352b57f6ba7735dad7e4fbd8c73bd9473 +bd9473cea58cd6ad96bd9c7bad846b703d29c08c7ea57f672508141000080b0319af9f94 +b99c8cb1a488947b639c7b6da97b779c7b63bd8c73ad8c73bd9c84a5846b9c7b63947b56 +7d584aad8c6bc1a584948677cea594ad947ba59473c6a58cad947bad94739c8463c6ad94 +b59c7bb5947bad8c73ad8c7bc69c84bd9c84ceb59cd6bd98bda58c734c2e8c6b5a7e5c58 +76533e8c73605e4542d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9703d29bd8c739c675aad7b6b703d2976533e76533e7d584a844a44 +b58c73ad9473ad8c7bcea594c69c8c985e529f7e5abd9c84c6ad94b5947bad846b9c7b63 +cead8cb58473a57f67bd947bd6b9a9bd947ba5846b9c7b63ad846bbd9c848e635279483d +ad7367ad846bc69c7b7e5b39dab28ccea58cb58c6bb58c6ba7735d906f4ead846bad846b +9c7b63ad8c73ad8c6b9c7b63cead8cb58c73bd947383584d21080424061e180920af9f94 +bda58cd6bd98b5947b886040a57f67b5887bad846bb5947bad8c6bc6ad8ca58473bd9c84 +a594739c7b63bd9c7ba5846bc6ad94ad947bceb59cc6a58cc1a584bda58cd6b9a9c6ad8c +b59c7bad9473c6a58cbd9c84cea594b59c84cea594ad947b76533e947b638a5a58ad847b +9c847b8c6b5a8c6b5ad9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad7b6bad7367b584738e6352844a4483584d8a5a58703d29bd9c84 +a5846b8c6b5aa57f678a5a58ad846bbd8c739c675aa5906bb5947b9c7b63b58c73ad846b +d6b9a9c69c84b5947b9c7b63bd9c84a58c7bb99c8cc6a58cad8c7bc69c8c986d5e9c675a +9f7e5ac69c84ad846bad846bcea084a57f67906f4eb58c73b5887bad846bb58c73bd9c84 +b58c73a58c7bbd9c84e4bda2bd9c7b9c73529c735ead8c7b350c1a25101c0b0319846b6e +a59473decaa4ad8c6b9c7b639c7b63cea0848c634acead8cb5947bc6a58c947b56ad8c7b +caab9ead8c6bcea594bdb594c6a58cc6a58ccea594ad9c7bc6a594a5906bcea594ad9c84 +ad9c7bb5947bc6ad8cc6ad8cc6ad94b59c84ad9c84ceb59cad948cad847b947b6391706d +8a5a588c6b5a80695ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad7b63b5887bad7b639c675a79483da97b77703d298a5a58b58c73 +a5846ba97b778e635283584d9c776b734c2eb58473c69c84c69c8cb5947bbd9484b5947b +ad8c739c7b6d906f4e9c776ba58473b5947bc6a58cc6a594b5947bad7b6b94685a7d584a +9f7e5a9c735ecead8ccea084ebcfb89c7b63c6a58ca57f67c6a594a58c7bad8473cea594 +b5947ba58473cea594c6ad8cbd947bc69c84c08c7e9c7b631b050018000818092044272e +a58c7bbd9c7bb5946b8c634abd947bb5947bb5946b9f7e5acead8cbd9c84b99c8cbd947b +bda58cbda58cc1a584c6a58ca59473b5947bb59c84c6a58cd6b9a9c1a584bda58cceb59c +c6ad94c1a5849c8463ad8c73b59c7bceb59cc6b598a58c7bad847b947363ad84848a5a58 +947b634f362f5e3e28d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad73679c7352bd94848c634aad7b6bad847b9c675a986d5ead7b6b +7e5b399c776b9c7b637d584a83584db58c73b5887bbd9484b5887bcead8cad8473d6b9a9 +9c7b63b99c8cbd9484a5846bad8473ad948ca5846b947b63a58473947363906f4ec69c84 +b5947bcea084b5947be2b399b5947b8c6b5ac6ad949c7b6dd6b9a9c6a58cb59484ceb59c +b99c8cb5947bd6bd98ad947bbd947bb5947bc08c7e986d5e7357552108100b0319180c08 +ad948cc6b584c69c7b9c7b63bd9473ad8c6bc1a584ad8c6bcea084c1a584bd9c84a58473 +bda58cd6b9a9ceb59cbd9c7bbd9c84c1a584cea594c6ad8ca58c7bcea594a5846b947363 +ad947bc6ad8cbd9c7bceb594c6ad94c6a59494846ba088839c776b94736399797b76533e +a586865e3e2891706dd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad7b639c675abd8c73ad846b9c776bb584739c776b945852734c2e +9458528e6352a58c7bcea5949c7b6dc6a58c9c776bbd9473c69c8ce2b399ad947bd6b9a9 +947b56b5887bad948c9c735eb58c73cea594b59c84ad947bb5947ba5846b9c7b6da5906b +9c7b63b5947bc1a584cea58cbd9c84947b63b194948e6352bda58cb59c84a59473b59484 +bd9c7bbda58cc6ad94ceb59c9c7b639f7e5ab5887ba57f6799797b180014291021382328 +a58c7bd6b9a9ad846bdab28cad8c73ad8c73947b63ad8c6ba5845ac69c84c6ad94bd9c84 +c6ad94b99c8ca594739c735e9c7b63ad9473c6a58cb5947b9c7b63c6a594ad8c73a58473 +a58c7bad846ba57f67bd9c7bc1a584ad948c947b63947b63a58c7b7d584a7e5c5856363d +44272e44272e44272ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99c7352c6947fbd9473906f4eb5887b79483d844a44844832b57f6b +83584dad847ba97b77ad8c73a58c7bc69c8c947b56844a44bd8c73bd9c84cea594ceb59c +948677947363a5846ba57f67b58c73bd9c84b5947bad9473a59473bd9c84c6a594e4bda2 +c1a584ceb59ccead8ccea594b59484ad94849c7b6db1a488d6b9a9decaa4c6a594b59c84 +c1a584c6ad94bd9c7bc6ad94bd9c84cea58c9c735e844a44947b632108101800142b181c +c7beb3bd9484eacba5985e52ad8c737e5b39a59473cead8ccead8cb58c73c6ad94b59484 +8c7360ceb59ca5846bceb5949c7b63b5947bbd9c84ad8c73b5947ba584739c776bad8c73 +bd94849c7b63bd9c7bcead8cc6a58ca5846b675043bda58c9c776b76533e3b18206d463c +56363d5e4542735755d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ad7b63b77b5dad846ba7735dad846b8860409c675a9c7352ad7b63 +ad846bb58c6bad846bb58c73906f4e986d5ead7b6b9c7b639c7b63b58c73b58c73c69c7b +ad7b63c6ad8cad846bad8c6bc1a584c6ad8cc6a58cc6a58ccea594b59c7ba58c7bc6b584 +a57f67a58c63bda58cd7c69aad947bbda58cb59484bd9484b99c8ca58c7bbd9484bd9c84 +cead8cad9473a5846bad8c6bb99c8cb5887bcead8c9c8c6f382328180920180920100800 +ceb59cad947bc6ad8ca5906bad9c84b59c84cea084bd9c7bb59c73b59c7bb5947ba5846b +ad8c73c1a584c1a584a58c7ba58c7b986d5e947b63a58c7ba58c7ba58c7ba57f67ad9473 +bd9c7bbd9c7bb5947bcead8cbd9c848c6b5aa584739c84637e5c585e3e288a5a583b1820 +5a2e278e6352a5846bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d99960409c7352a7735d844a44985e52886040ad7b639c7352a7735d +9c7352ad846bcea58cbd9484b58473985e52bd9473b58c739c7352906f4ec08c7e9f7e5a +a7735d9c7b63ad8c73bd9c7bcead8cbd947bad8c739c7b63b5947bb5947bc69c84ad8c73 +ad9473bda58cceb59cc6ad949c7b6dad9484ad847bc6a594c6a58ccea594d6bd98bd9c84 +cea594ceb594ceb59cd6bd98c69c8ca58c7bb59c73bd947b44272e180920100000180c08 +af9f94a5906bcea594d0ba9994846ba59473b58c73947b56ad8c6bc6a58cbd9c84bda58c +b5947bbda58cbd9c7bad9484a58c7bd6b9a9b59484a5846b846b52cea594ad9473cea594 +c6b584ad8c73c6ad8cc6ad94c6a58cbda58cb99c8c947b568c73608c7360a08883a08883 +ad847b947b63ad8c7bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9985e52b87158ad7b6ba36150ad7367985e52ad7367985e52ad8463 +ad7b63c69473ad7b6b906f4ead7b6b79483d9c7352a36150985e52ad7b638c634a90573d +7e5b39ad846bc1a584bd947bad8c7bcea58c9c735ebd9473a57f67cea084bd9c7b8e6352 +a57f67c69c8cc6a594b59484947b63a58c7ba08883cea594b59c7bad9484cea594b59c84 +c6ad8cd6bd98ceb59cb59c73ad847bce9c8cc69c7bc1a5842108102508142a142b100800 +d6b9a9ceb59cc6ad94d7d1c0ad947bcea594a5906bbd947bc1a584d6bd98ad947bc6a594 +ad947bc6ad94bdb594ad8c73ad9473a5906b9c8463ad947bb5a57bd6bd98b59c7bbda58c +ad947bb1a488d6b9a9ceb594c6ad94b5947b8c7360a5846ba58c7b7d584a735755ad847b +8c7360ad847ba58c7bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c07c66aa705290573d8448328448328448328e6352a36150703d29 +90573dad846b9c675aa9695c986d5e8c634a8d4938ad7b6384483290573dd0927bc68c84 +d0927b947b56b58c73ad7b6bb58c73ad846bc08c7ead846bcea084b58c739f7e5a945852 +9c7b63c69c8cb99c8cbd9c84bd9c94c6a594b5887bd6b9a9b59c7bb5947bc1a584bda58c +cea594c6ad94bd9c84b59c73bd9484c68c84a7735dbd94733b1820291021100000180814 +ccb1abc6ad94ceb59cd7d1c0947b63b99c8cc1a584cea58ccead8cd6b9a9b5947bb99c8c +ad947bbda58ca59473ad948cd0ba99a58c7bad947bad9c7bbda58cad947ba59473b59c84 +bda58cceb59ca59473d6b9a9ebcfb8bdaa91ceb59ca58c7b9473639c847b8c6b5a8c7360 +a58473a59473b59484d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9c07c66ad6b63a5635aa5635ab5736ba5635aa5635aa56b4ead7367 +ad7b6b9c675a945852985e52844832985e52a56b4e996040b77b5dbd846fda9c84ad7b63 +ca946f9c73529c7b63ad7b63ad84739c7b63b58c73985e52b58c739f7e5aa7735d9c7352 +b57f6bc69c84bd9c7bb5947bcead8cc6ad8cbd947bc6ad8cc6a58cbd9c84bd9c84cea594 +c6a58cb5947bad8c73c1a584b5887bb5887bbd9168c69473350c1a25081425101c25101c +c6a5a0bd9c94ceb59cd7d1c0948677c6ad94cea594ceb594c1a584c6ad94c6a594ad9484 +ad948cc6ad8c9c8c6fad94849c847bbd9c94bdaa91ad948c948677ceb59cad9c84bd9c94 +8c7360d2c7afd6b9a9ad948c947b63bd9c9467504376533e947b63947b63ad847b9c7b6d +948677c69c8cb59c7bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b87158b87158985e528d4938985e52a36150a7735d90573d844a44 +a7735d844a449c735e8e63529c675ab57f6bad7367c07c66996040a361508d4938b87158 +985e529c7352bd8c73ad846b9c735ecea58c9c73529c7b63985e52c69c73ad846bad846b +b58c6bc1a584c69c7bad946bc1a584c1a584c69c7bbd947bad8c73b58c73b5947bd6ad96 +bd9484a5846b94685ab5947b844a445a2e278c634aa7735d2d0f0b180014180c08180008 +b9ada5caab9ec6ad94d2c7afd2c7afebcfb8ceb594d0ba99bda58cbda58cbd9c94a58c7b +b59c84ad9484a5846bad948ca08883a58c7bb19494ad9484948677a08883947b63b59c84 +bdaa91ad948cceb59cd6b9a9675043a088837e5c58948677ad847bbd948c948677ad8c73 +b99c8c947b56b59c84d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9a36150a77047a36150a56b4ea36150a36150a56b4e844832985e52 +ad846b83584d886040945852ad7367ad7b63a36150844832b57f6baa7052a56b4e90573d +b57f6bbd9168c69473ad846bbd8c73bd947bbd947b9c7352ad846bad84739c7b63cea084 +c69c84cead8ccead8cb59c7bd6ad96bd9c7bc69c84bd947b8c634a9c7b63c69c8ccea084 +a57f67a97b778c634a9c7b63ad847b94585290573d844a44350c1a291021180014180814 +9c7b6dad948cceb59cd7d1c0ccb1abdecaa4d7c69aad9c84bdaa91bd9c94ad9484ad9484 +8c6b5a7e5c58846b527e5c58a58c7b8c7360b59484a58c7bb99c8ca58473c6a594b59c84 +d0ba99bd9c94c6b598a088833823285e45423823283c160a5e3e2876533e83584db59c84 +bd9c84bda58cc6ad94d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9b77b5daa7052a36150a77047a7735da56b4eaa7052b8715894685a +8e635294685a9c776bc69c8cbd846fad7367a56b4eaa7052b57f6ba77047844832b77b5d +b87158c6947fa7735dc69c7bb5947bb58c73b58c73906f4e9c735e9c735e7d584aceb59c +bd9484b59c84bd9c94b59c84c6a58ca57f679c776bad7b635e3e28ad7b63cea5949c735e +79483d9c735e8e6352a58c7b6a50555a2e27945852ad7b6b3b182024061e100810180814 +a08883d6b9a9bda58cc6b598cebdaddecaa4b5a57bd0ba99d7d1c0c6b5988c7360a58c7b +6a50557d584abd9c84b99c8cad8c73a59473b59484b59c84c6a58cceb59ca5846bc6ad8c +ad9c84ad947b6a50552d0f0b3c160a3823283823287e5c585a2e27a584738c7360947b63 +a5846bb1a488b5947bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9a36150844a44996040b57f6b985e52985e528c634a90573d8c634a +b87158886040b57f6bbd8c73c08c7e9c73528c634a996d47ad7e4fb57f6b996040b77b5d +bd9168a7735dcea084734c2ead8c639f7e5aa57f679c776bb58c73947b56c69c73bdb594 +a59473a58c7ba58c7b947b637e5c587e5c584621133c160a5a2e27caab9ea58c7b9c7b6d +94685a6d463cad6b63ad847bce9c8ca9695ca57f679c847b3b1820180814100810180c08 +675043c6ad94a5906bb59c73c6b584ad947b94846ba08883947b637e5c589c7b6d675043 +846b52947b63ad947bbd9c84ad8c6bad8c6bcead8cb59c73c1a584bd9c84b99c8ccaab9e +ad847b7d584a4f362f2d0f0b38232844272e3b18205e3e285e45429c7b63a58c7bad8c73 +8c7360ad8c6ba59473d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d93c160a734c2e3c160a552617ad736779483d90573d9c7352ad7367 +c08c7e886040bd9484cea084cea58c906f4e9c675a8c634a886040a7735da7735d9c675a +9c675a76533e886040ad846b9c776b5e3e284f362f5526178c6b5aad846bcead8cc1a584 +a5906bd6bd989c7b63a57f67734c2ea7735dbd8c73b59c73cead8ca57f67bd9c7bbd947b +985e52c6947fa7735dc39565b58c6bb57f6bc6947394685a26060825081425101c180008 +8e7778ceb59ca5906ba57f67a59473b5947bad948ca5846b9486779c7b638c6b5ac6ad94 +ad947bad8c73a59473b99c8cc6a58cc1a584bd9c7bb59c7bc6ad8c947b6344272e2d0f0b +3c160a2b181c4f362f38232856363d56363d44272e5e454276533e948677b5947bb59c84 +ad947bad948cad9484d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d92d0f0b2108043b18203c160a4621135a2e277d584a94685a83584d +4621134621134621135a2e273b18207d584a7d584aad847b8a5a58986d5e7d584a5e3e28 +5a2e274621133b182044272e3c160a25081444272e3b18207d584a986d5ead8473b5947b +b5947bad846b8c634ab58c73e2b399ad7f5abd8c63dab28cce9c77a07b4ea5845aa07b4e +996040c39565a7735dd2a575ad7e4fb58456a7735d703d292d0f0b2508140b0319180814 +d5c2bebda49e80695e8c6b5a5e3e282108043b18204621136d463c76533e80695e846b52 +a58c7b9c847b9486779c7b6d8c73608c736094846b5e45423c160a1000082108041b0500 +1800081800081800141800142a142b2b181c25101c2d0f0b735755caab9eb19494947b63 +735755948677ad948cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d93823281800142b181c2108101b05003823282108043b1820250814 +3823282508142d0f0b3823281b05001b050044272e3823281b05003b1820210810250814 +2508142508141b0500210810250814180014180014100008350c1a3b18204621135a2e27 +7d584a7d584a7e5c5894685ad6ad969c735ead8463b584737d584a9c7b638e635276533e +8e6352906f4e9c735ebd9473a7735dad7b636d463c260608210810291021180920250814 +c7beb3c7beb3d6b9a9bd9c949486778a5a587357556d463c1000082d0f0b2108043c160a +1b05002b181c3b18202b181c250814180c081b05001b05002d0f0b2b181c18001425101c +1809201800140b031918000824061e2508142508142a142b2b181c25101c21081025101c +2b181c2b181c250814d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d90b0319291021180014382328180014291021350c1a2a142b2b181c +18001424061e44272e08001029102129102125081425081425101c25101c100008210810 +2b181c350c1a2a142b2108103823282108101800143823286750436a50558a5a58382328 +1800141000081b05002508142108042108043c160a2b181c2108102606082508141b0500 +24061e2b181c25101c2d0f0b2508143b18201800141b05002a142b1800140b0319180c08 +ccb1abbda49ebda49eccb1abad948ca4a196ccb1abbfadb0d7d1c0b194942d0f0b180008 +180c082b181c21081018001418001418001424061e180814180014180014382328080010 +1809201808142a142b2a142b2a142b18001418001408001018001424061e25101c180814 +1800141800142a142bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d92a142b18000829102118001424061e2b181c2a142b382328180014 +25101c2a142b18000825081429102129102138232829102144272e2508142b181c2d0f0b +6a50555e45427e5c5873575596878799797b80695e99797ba0888391706d9c847b99797b +5e454224061e2a142b18001424061e25101c10000024061e0b03191800142a142b180014 +24061e18081418001424061e24061e1800142910212a142b2a142b1800083823288e7778 +b9ada5b9ada5c6b598a3908c948677b19ca3a3908ca1988dbd9c94a08883bfadb0bfadb0 +b19ca36a505538232824061e25101c25101c10000029102125101c29102108001025101c +2b181c180c0818081418001425101c18081425101c24061e2a142b25101c2a142b2b181c +25101c0b031924061ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d97e5c5856363d4f362f382328b59484c7beb380695ebda49ec7beb3 +b19ca3a3908ca3908c56363da08883a3908cbfadb0b19494bd9c94b19ca3d5c2beaf9f94 +bda49ebda49ebd9c94c6ad94d6b9a9caab9eb99c8cb99c8cad9484ad9484bd9c94ad9484 +caab9eaf9f94846b6e18001425101c18000825101c100008180814382328382328250814 +25101c1800082b181c1808142508141808142b181c10000821080444272ead948cb19494 +ad948caf9f94b1a8a2d7d1c0d7d1c0bcb8aed5c2bec7beb3c6b598ccb1abc7beb3d5c2be +a1988dbda49e6a5055af9f94a08883a088839687878e77784f362f5e4542846b6e948677 +b2aa94b9ada5c7beb3a4a196846b6e2b181c1008006a50558e7778a3908cb1a8a2b19ca3 +8e777856363d180920d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9e4bda2cea084dab28cebcfb8caab9ecaab9ebd9c94af9f94c6b598 +bda49ed2c7afd6b9a9bda49ed6b9a9caab9ebd9c94c6a594947b63bd9c94ccb1abccb1ab +ad9c7bd6b9a9c6ad94ebcfb8cead8ccead8cd0ba99d0ba99c6b598d6b9a9d6b9a9d0ba99 +cead8cebcfb8ceb59cd5c2bed5c2bec7beb3d5c2bec7beb3d7d1c0d2c7afebcfb8ccb1ab +d0ba99c7beb3d7d1c0ebcfb8ceb59cbdaa91d6b9a9caab9ecaab9ecaab9ed6b9a9d6b9a9 +ad9c84ccb1abbcb8aed7d1c0bcb8aebcb8aed7d1c0bdb594d7d1c0ad9c84c7beb3decaa4 +d7d1c0d7d1c0bdaa91d2c7afdecaa4d2c7afcaab9eebcfb8d2c7afd2c7afd6b9a9eacba5 +ebcfb8c6b598c6a5a0b9ada5c7beb3ccb1abd7d1c0af9f94cebdadaf9f94b99c8cb1a8a2 +d5c2bec7beb3ccb1abd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 + +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373000000 + +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 + + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/line.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/line.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/line.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/line.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/line.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/line.ps 1996-11-23 13:00:37.000000000 +0000 @@ -0,0 +1,1613 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/line.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 334 337 460 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 408 string def + +% define space for color conversions +/grays 136 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 334 translate + +% size of image (on paper, in 1/72inch coords) +136.00800 126.00000 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +136 126 8 % dimensions of data +[136 0 0 -126 0 126] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff000000000080000080ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080000080ffffff000080000080ffffff000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080ffffffffffff000080ffffffffffff000080000080000080ffffffffffffffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffffffffffffffff +ffffffffffff000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffffffffffffffff +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffffffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080ffffff737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373000000ffffff +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373000000000080000080ffffff737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000080000080000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/oval.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/oval.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/oval.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/oval.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/oval.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/oval.ps 1996-11-23 13:00:42.000000000 +0000 @@ -0,0 +1,2321 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/oval.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 311 370 459 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 507 string def + +% define space for color conversions +/grays 169 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 311 translate + +% size of image (on paper, in 1/72inch coords) +168.98400 148.03200 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +169 148 8 % dimensions of data +[169 0 0 -148 0 148] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 +000080000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffffffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 +000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 +000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080000080ffffff000080000080ffffff000080000080ffffff +ffffff000080ffffffffffff000080000080000080000080000080000080000080ffffff +ffffff000080000080000080000080ffffffffffff000080ffffffffffff000080000080 +000080ffffffffffff000080000080ffffffffffffffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffffffffff000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080000080000080000080ffffffffffff000080ffffffffffff000080000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080000080000080000080000080ffffffffffff000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080000080ffffffffffffffffffffffffffffff000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080000080000080000080ffffffffffff000080000080000080ffffffffffff +ffffff000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 +ffffffffffff000080000080ffffffffffff000080000080000080000080ffffffffffff +ffffff000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000 +000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 +000080ffffffffffffffffffffffff000080000080000080000080000080000080ffffff +000080000080000080000080000080ffffffffffffffffff000080ffffffffffffffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000 +000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 +000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffff737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373000000ffffff737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373000000 +000080000080ffffff737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000080000080000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000ff0000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000 +000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000000000000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000000000000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000 +000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/packer1.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/packer1.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/packer1.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/packer1.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/packer1.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/packer1.ps 1997-05-20 23:00:48.000000000 +0100 @@ -0,0 +1,5987 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/ntmp/packer1.ps +%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley +%%BoundingBox: 201 232 411 559 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 630 string def + +% define space for color conversions +/grays 210 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 232 translate + +% size of image (on paper, in 1/72inch coords) +210.02400 327.02400 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +210 327 8 % dimensions of data +[210 0 0 -327 0 327] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffffffffffffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffff000080000080ffffffffffff000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080000080 +000080ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff +ffffffffffff000080000080ffffff000080ffffffffffffffffff000080ffffffffffff +ffffff000080000080000080ffffffffffffffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffffffffffffffffffffff000080000080000080000080 +000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080ffffffffffff000080ffffffffffff000080000080000080000080 +000080ffffffffffffffffffffffff000080000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffffffffff000080000080000080000080000080000080 +000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +ffffffffffffffffffffffffffffff000080ffffffffffff000080000080000080000080 +000080ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff +ffffffffffff000080ffffffffffff000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffffffffff +ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080ffffffffffff000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080000080000080000080000080000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +ffffffffffffffffff000080ffffffffffff000080ffffffffffffffffffffffff000080 +000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 +000080ffffffffffffffffffffffffffffff000080000080000080000080ffffffffffff +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffffffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 +000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffff737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +000000ffffff737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373000000000080000080ffffff737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000080000080000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 +000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0ffffffd9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +d9d9d9ffffffd9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffff +d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +d9d9d9ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0ffffffd9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9c0c0c0d9d9d9ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +000000c0c0c0ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9000000c0c0c0ffffffd9d9d9ffffffd9d9d9 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9 +000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 +ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0c0c0c0d9d9d9 +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +d9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffc0c0c0ffffff +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000c0c0c0ffffff +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9 +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 +000000d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9000000 +d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000d9d9d9 +000000c0c0c0ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000c0c0c0ffffffd9d9d9000000d9d9d9 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +d9d9d9c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9c0c0c0d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffc0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/packer2.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/packer2.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/packer2.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/packer2.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/packer2.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/packer2.ps 1997-05-20 23:00:49.000000000 +0100 @@ -0,0 +1,5176 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/ntmp/packer2.ps +%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley +%%BoundingBox: 201 384 540 559 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 1017 string def + +% define space for color conversions +/grays 339 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 384 translate + +% size of image (on paper, in 1/72inch coords) +338.97600 175.03200 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +339 175 8 % dimensions of data +[339 0 0 -175 0 175] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff000000000080000080ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffffffffffffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffff000080000080ffffffffffff000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080000080 +000080ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff +ffffffffffff000080000080ffffff000080ffffffffffffffffff000080ffffffffffff +ffffff000080000080000080ffffffffffffffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffffffffffffffffffffff000080000080000080000080 +000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000 +000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080ffffffffffff000080ffffffffffff000080000080000080000080 +000080ffffffffffffffffffffffff000080000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffffffffff000080000080000080000080000080000080 +000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +ffffffffffffffffffffffffffffff000080ffffffffffff000080000080000080000080 +000080ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff +ffffffffffff000080ffffffffffff000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffffffffff +ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000 +000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080ffffffffffff000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080000080000080000080000080000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000 +000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +ffffffffffffffffff000080ffffffffffff000080ffffffffffffffffffffffff000080 +000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 +000080ffffffffffffffffffffffffffffff000080000080000080000080ffffffffffff +ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080000080ffffffffffffffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000 +000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080ffffff737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373000000ffffff737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373000000000080000080ffffff737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000080000080000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 +d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0ffffffd9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +d9d9d9ffffffd9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffff +d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9000000d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0d9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 +ffffffd9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +d9d9d9ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0ffffffd9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff +d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9c0c0c0d9d9d9ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 +000000c0c0c0ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9000000c0c0c0ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9 +000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffd9d9d9 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff +d9d9d9ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +d9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffc0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000d9d9d9000000d9d9d9d9d9d9d9d9d9 +000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000 +d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9000000d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000d9d9d9 +000000c0c0c0ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 +000000d9d9d9000000c0c0c0ffffffd9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +d9d9d9c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 +d9d9d9000000d9d9d9c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 +ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff +d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/polygon.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/polygon.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/polygon.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/polygon.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/polygon.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/polygon.ps 1996-11-23 13:00:47.000000000 +0000 @@ -0,0 +1,1963 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/polygon.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 327 366 460 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 495 string def + +% define space for color conversions +/grays 165 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 327 translate + +% size of image (on paper, in 1/72inch coords) +165.02400 132.98400 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +165 133 8 % dimensions of data +[165 0 0 -133 0 133] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff000000000080000080ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000 +000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000 +000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080000080ffffff000080000080ffffff000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffffffffffffffff000080000080ffffffffffff000080ffffffffffff000080 +000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffffffffffffffff000080000080ffffffffffff000080ffffffffffff +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffffffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 +000080000080ffffffffffff000080ffffffffffff000080ffffffffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffffffffff000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080ffffff +ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080ffffffffffff000080000080000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080ffffff +ffffffffffff000080000080000080ffffffffffff000080ffffffffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +ffffffffffffffffffffffff000080000080ffffffffffff000080000080000080000080 +ffffffffffff000080000080000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000 +000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffff000080000080000080000080000080000080000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080ffffff +ffffff000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +ffffff737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373000000ffffff737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373000000000080000080ffffff737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffffffff +000080000080000080000080000080000080ffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000080000080000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 +000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/rectangle.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/rectangle.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/rectangle.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/rectangle.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/rectangle.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/rectangle.ps 1996-11-23 13:00:54.000000000 +0000 @@ -0,0 +1,2173 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/rectangle.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 311 364 459 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 489 string def + +% define space for color conversions +/grays 163 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 311 translate + +% size of image (on paper, in 1/72inch coords) +163.00800 148.03200 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +163 148 8 % dimensions of data +[163 0 0 -148 0 148] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080000080ffffff000080000080ffffff000080000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +000080ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff +000080000080ffffffffffffffffffffffff000080000080ffffffffffffffffffffffff +000080000080ffffffffffff000080ffffffffffff000080000080000080ffffffffffff +000080ffffffffffff000080ffffffffffff000080000080ffffffffffffffffffffffff +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080 +ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080000080 +000080000080000080ffffffffffff000080000080000080000080000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffffffffffffffffffffffffffff000080ffffffffffff000080000080000080 +000080000080000080ffffffffffff000080000080000080ffffffffffffffffffffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080ffffffffffffffffffffffffffffff +ffffff000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080000080000080000080ffffffffffff000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffffffffff000080000080ffffff +ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 +ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 +000080ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff +000080000080000080000080ffffffffffff000080000080ffffffffffffffffff000080 +ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080ffffffffffff000080000080ffffffffffffffffffffffff +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080ffffffffffff000080 +000080ffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffff737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373000000ffffff737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373000000000080000080ffffff737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffffffff +ffffffffffff000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000080000080000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff +00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/text.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/text.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/text.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/text.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/text.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/text.ps 1996-11-23 13:01:01.000000000 +0000 @@ -0,0 +1,1767 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/text.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 340 364 459 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 489 string def + +% define space for color conversions +/grays 163 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 340 translate + +% size of image (on paper, in 1/72inch coords) +163.00800 119.01600 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +163 119 8 % dimensions of data +[163 0 0 -119 0 119] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080ffffffffffffffffffffffffffffffffffffffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080ffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080ffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080000080ffffff000080000080ffffff000080000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080ffffffffffffffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080ffffff +ffffff000080000080ffffffffffff000080000080ffffffffffffffffffffffff000080 +000080000080ffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080ffffff +ffffffffffffffffffffffffffffff000080000080000080ffffffffffff000080000080 +000080000080ffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080000080000080ffffffffffff000080000080000080ffffff +ffffff000080000080000080000080000080000080ffffffffffffffffffffffff000080 +000080000080ffffffffffff000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080000080000080ffffffffffff000080000080000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080ffffff000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff +000080000080000080ffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 +000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080ffffff737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373000000ffffff737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373000000000080000080ffffff737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000080000080000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000 +d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9d9d9d9ff0000ff0000ff0000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000ff0000d9d9d9d9d9d9ff0000ff0000 +ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000 +ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000 +ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9 +ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000 +ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9ff0000ff0000 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000 +ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9 +ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9ff0000ff0000 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9d9d9d9ff0000 +ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000ff0000ff0000 +ff0000ff0000ff0000ff0000d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000 +d9d9d9ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000 +d9d9d9ff0000ff0000d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9ff0000d9d9d9 +d9d9d9ff0000ff0000d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9ff0000d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9 +d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000 +d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000 +ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000 +d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 +ff0000ff0000d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9ff0000ff0000ff0000 +ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 +d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000 +ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9 +d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000 +ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/images/window.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/images/window.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/images/window.ps erlang-13.b.3-dfsg/lib/gs/doc/src/images/window.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/images/window.ps 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/images/window.ps 1996-11-23 13:01:08.000000000 +0000 @@ -0,0 +1,3221 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/eklas/erlang/gs/doc/sgml/pics/window.ps +%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley +%%BoundingBox: 201 303 431 459 +%%Pages: 1 +%%DocumentFonts: +%%EndComments +%%EndProlog + +%%Page: 1 1 + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 690 string def + +% define space for color conversions +/grays 230 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +201 303 translate + +% size of image (on paper, in 1/72inch coords) +229.96800 156.02400 scale + +% define 'colorimage' if it isn't defined +% ('colortogray' and 'mergeprocs' come from xwd2ps +% via xgrab) +/colorimage where % do we know about 'colorimage'? + { pop } % yes: pop off the 'dict' returned + { % no: define one + /colortogray { % define an RGB->I function + /rgbdata exch store % call input 'rgbdata' + rgbdata length 3 idiv + /npixls exch store + /rgbindx 0 store + 0 1 npixls 1 sub { + grays exch + rgbdata rgbindx get 20 mul % Red + rgbdata rgbindx 1 add get 32 mul % Green + rgbdata rgbindx 2 add get 12 mul % Blue + add add 64 idiv % I = .5G + .31R + .18B + put + /rgbindx rgbindx 3 add store + } for + grays 0 npixls getinterval + } bind def + + % Utility procedure for colorimage operator. + % This procedure takes two procedures off the + % stack and merges them into a single procedure. + + /mergeprocs { % def + dup length + 3 -1 roll + dup + length + dup + 5 1 roll + 3 -1 roll + add + array cvx + dup + 3 -1 roll + 0 exch + putinterval + dup + 4 2 roll + putinterval + } bind def + + /colorimage { % def + pop pop % remove 'false 3' operands + {colortogray} mergeprocs + image + } bind def + } ifelse % end of 'false' case + + + +230 156 8 % dimensions of data +[230 0 0 -156 0 156] % mapping matrix +{currentfile pix readhexstring pop} +false 3 colorimage + +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0000000 +c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +000000000080000080ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 +ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 +000080000080000080000080000080000080ffffffffffff000080000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffffffffffffffff000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 +ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 +000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffff000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 +000080000080000080000080000080ffffff000080000080ffffff000080000080000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff +ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffffffffffffffff000080 +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080ffffff000080000080ffffffffffff000080000080ffffff +000080ffffffffffff000080ffffffffffffffffff000080ffffffffffff000080ffffff +ffffff000080ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff +000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 +000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 +000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 +000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 +000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 +000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080ffffff +ffffff000080ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff +000080000080000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 +000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 +c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 +000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 +000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 +000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 +000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 +ffffffffffff000080ffffffffffff000080000080ffffffffffffffffffffffff000080 +000080000080000080ffffffffffff000080000080ffffffffffff000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 +000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 +000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 +000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080ffffff737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373000000ffffff737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +000000000080000080ffffff737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000080000080000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080000080000080000080 +000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 +d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 +737373000000 +c0c0c0737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373737373737373737373737373737373737373737373737373737373737373737373 +737373000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000 + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/Makefile erlang-13.b.3-dfsg/lib/gs/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/gs/doc/src/Makefile 2009-03-12 12:23:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/Makefile 2009-11-20 13:34:00.000000000 +0000 @@ -26,17 +26,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(GS_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=gs # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/gs-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -59,33 +54,43 @@ BOOK_FILES = book.xml -GIF_FILES = +GEN_XML = \ + gs_chapter2.xml \ + gs_chapter4.xml \ + gs_chapter5.xml \ + gs_chapter6.xml \ + gs_chapter7.xml \ + gs_chapter8.xml \ -PICS_GIF_FILES = pics/arc.gif \ - pics/buttons.gif \ - pics/ex1.gif \ - pics/ex10.gif \ - pics/ex11.gif \ - pics/ex12.gif \ - pics/ex13.gif \ - pics/ex14.gif \ - pics/ex15.gif \ - pics/ex16.gif \ - pics/ex8.gif \ - pics/ex9.gif \ - pics/gs1-1-image-1.gif \ - pics/gs1-1-image-2.gif \ - pics/gs1-1-image-3.gif \ - pics/gs1-1-image-4.gif \ - pics/image.gif \ - pics/line.gif \ - pics/oval.gif \ - pics/packer1.gif \ - pics/packer2.gif \ - pics/polygon.gif \ - pics/rectangle.gif \ - pics/text.gif \ - pics/window.gif +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + +GIF_FILES = images/arc.gif \ + images/buttons.gif \ + images/ex1.gif \ + images/ex10.gif \ + images/ex11.gif \ + images/ex12.gif \ + images/ex13.gif \ + images/ex14.gif \ + images/ex15.gif \ + images/ex16.gif \ + images/ex8.gif \ + images/ex9.gif \ + images/gs1-1-image-1.gif \ + images/gs1-1-image-2.gif \ + images/gs1-1-image-3.gif \ + images/gs1-1-image-4.gif \ + images/image.gif \ + images/line.gif \ + images/oval.gif \ + images/packer1.gif \ + images/packer2.gif \ + images/polygon.gif \ + images/rectangle.gif \ + images/text.gif \ + images/window.gif # ---------------------------------------------------- @@ -93,29 +98,12 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = gs-$(VSN).pdf -TOP_PS_FILE = gs-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -127,62 +115,43 @@ # Targets # ---------------------------------------------------- $(HTMLDIR)/%.gif: %.gif + $(INSTALL_DIR) $(HTMLDIR)/images $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) pdf: $(TOP_PDF_FILE) -ps: $(TOP_PS_FILE) +html: gifs $(HTML_REF_MAN_FILE) -html: $(HTML_FILES) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ $(GEN_XML) man: $(MAN3_FILES) -gifs: $(GIF_FILES:%=$(HTMLDIR)/%) $(PICS_GIF_FILES:%=$(HTMLDIR)/%) +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) - rm -f ../pics/* - # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs - $(INSTALL_DIR) $(RELSYSDIR)/doc/html/pics - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ - $(RELSYSDIR)/doc/html + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + (/bin/cp -rf $(HTMLDIR) $(RELSYSDIR)/doc) $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) - $(INSTALL_DATA) $(PICS_GIF_FILES) $(RELSYSDIR)/doc/html/pics $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/notes.xml erlang-13.b.3-dfsg/lib/gs/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/notes.xml 2009-03-12 12:24:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/notes.xml 2009-11-20 13:34:23.000000000 +0000 @@ -26,6 +26,7 @@ + notes.xml

    This document describes the changes made to the GS application.

    @@ -46,7 +47,24 @@
    -
    GS 1.5.9 +
    GS 1.5.11 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    + +
    GS 1.5.9
    Fixed Bugs and Malfunctions diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/gs/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/part_notes.xml 2007-11-26 19:03:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/part_notes.xml 2009-11-20 13:34:23.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + GS Release Notes @@ -36,6 +34,6 @@ using GS work on all Erlang platforms and do not depend upon the underlying windowing system.

    - + diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/part.xml erlang-13.b.3-dfsg/lib/gs/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/part.xml 2007-11-26 19:03:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/part.xml 2009-11-20 13:33:47.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + GS User's Guide @@ -36,13 +34,13 @@ using GS work on all Erlang platforms and do not depend upon the underlying windowing system.

    - - - - - - - - + + + + + + + + Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/arc.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/arc.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/arc.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/arc.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/arc.ps 1996-11-23 12:58:20.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/arc.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,1385 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/arc.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 353 338 460 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 411 string def - -% define space for color conversions -/grays 137 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 353 translate - -% size of image (on paper, in 1/72inch coords) -137.01600 106.99200 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -137 107 8 % dimensions of data -[137 0 0 -107 0 107] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000000000 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffffffffffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000000000 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080000080ffffff000080000080ffffff000080000080ffffff -ffffff000080ffffffffffff000080000080000080000080000080000080000080000080 -ffffff000080000080ffffff000080000080ffffffffffff000080ffffffffffff000080 -ffffffffffffffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffffffffff000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffffffffffffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffffffffffffffffffffffffffff000080ffffffffffff000080000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080ffffffffffff -000080000080000080000080ffffffffffffffffffffffff000080000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080ffffffffffff -000080000080000080000080ffffffffffffffffffffffff000080000080000080ffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080ffffffffffff -000080000080000080000080ffffffffffffffffffffffff000080000080000080000080 -ffffffffffffffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000000000 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffff737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373000000 -ffffff737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373000000000080000080ffffff737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000080000080000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/buttons.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/buttons.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/buttons.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/buttons.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/buttons.ps 1996-11-23 12:58:27.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/buttons.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,6003 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/buttons.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 232 511 459 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 930 string def - -% define space for color conversions -/grays 310 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 232 translate - -% size of image (on paper, in 1/72inch coords) -310.03200 227.01600 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -310 227 8 % dimensions of data -[310 0 0 -227 0 227] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080ffffffffffff000080000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 -000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080ffffffffffff000080000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 -000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffffffffffffffff000080 -ffffffffffffffffffffffff000080000080ffffffffffffffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080000080ffffffffffffffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080000080ffffffffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080000080000080ffffffffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080ffffffffffffffffff000080000080ffffffffffff000080ffffff -000080ffffffffffff000080ffffffffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080ffffffffffff000080ffffffffffff000080000080000080ffffffffffff000080 -000080000080ffffffffffff000080000080ffffffffffffffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffffffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 -000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffff737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373000000ffffff737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373000000000080000080ffffff -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000080000080000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -ffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff828282828282828282828282828282 -828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff828282828282828282828282828282828282 -828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282 -828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282 -828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -ffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -828282b03060b03060828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -b03060b03060b03060b03060828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9828282828282828282b03060 -b03060b03060b03060b03060b03060828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9ffffffffffffffffffb03060b03060 -b03060b03060b03060b03060b03060b03060ffffffffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9ffffffffffffffffffb03060 -b03060b03060b03060b03060b03060ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffff -b03060b03060b03060b03060ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -ffffffb03060b03060ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff828282828282828282828282828282 -828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff828282828282828282828282828282828282 -828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282 -828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282 -828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282b03060b03060b03060b03060b03060 -b03060b03060ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffff828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex10.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex10.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex10.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex10.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex10.ps 1996-11-23 12:58:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex10.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,6635 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex10.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 163 461 460 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 780 string def - -% define space for color conversions -/grays 260 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 163 translate - -% size of image (on paper, in 1/72inch coords) -259.99200 297.00000 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -260 297 8 % dimensions of data -[260 0 0 -297 0 297] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff000000000080000080ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000 -000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000 -000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080ffffffffffff000080ffffffffffffffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffffffffffffffffffffffffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffffffffffffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -ffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffffffffff000080000080000080000080ffffffffffff000080000080ffffffffffff -000080ffffffffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080000080 -000080ffffffffffffffffff000080000080ffffffffffffffffffffffffffffffffffff -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080000080 -000080000080ffffffffffffffffff000080ffffffffffff000080000080000080000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080ffffffffffff000080000080ffffffffffff000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -ffffffffffff000080000080000080000080ffffffffffffffffffffffff000080000080 -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000 -000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373000000ffffff737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373000000000080000080ffffff737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000080000080000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282ffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282ffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffff828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3ffffffffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffff828282 -828282828282828282828282828282828282828282828282828282828282828282c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffff828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffc3c3c3000000000000000000c3c3c3c3c3c3c3c3c3000000c3c3c3 -000000000000c3c3c3c3c3c3c3c3c3c3c3c3000000000000000000c3c3c3c3c3c3c3c3c3 -000000c3c3c3000000000000c3c3c3c3c3c3c3c3c3c3c3c3000000000000c3c3c3000000 -c3c3c3c3c3c3c3c3c3000000000000000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffff000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000000000 -c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3 -000000000000c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3000000000000 -c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffff000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3 -000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000 -c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffff000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000000000000000000000c3c3c3c3c3c3 -000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000 -c3c3c3c3c3c3000000000000000000000000000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffff000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3 -000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000 -c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffff000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3 -000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3000000c3c3c3c3c3c3000000000000 -c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffc3c3c3000000000000000000c3c3c3c3c3c3c3c3c3000000c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000000000000000000000c3c3c3c3c3c3 -000000c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000000000c3c3c3000000 -c3c3c3c3c3c3c3c3c3000000000000000000c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000c3c3c3c3c3c3c3c3c3000000 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3000000000000000000c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffff757575757575757575757575757575757575757575757575757575 -757575757575757575757575757575757575757575757575757575757575757575757575 -757575757575757575757575757575757575757575757575757575757575757575757575 -757575757575757575757575757575757575757575757575757575757575757575757575 -757575757575757575757575757575757575757575757575757575757575757575757575 -757575757575757575757575757575757575757575757575757575757575757575757575 -757575757575757575757575757575757575757575757575757575757575757575757575 -757575757575757575757575757575757575757575757575757575757575757575757575 -757575757575757575757575757575757575757575757575757575757575757575757575 -757575757575757575757575757575757575757575757575757575757575757575757575 -757575757575757575757575757575757575757575757575757575757575757575757575 -757575757575757575ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffff828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffff828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffff828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3ffffffc3c3c3ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffc3c3c3ffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -ffffffffffff828282c3c3c3ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff828282c3c3c3ffffffffffffffffffffffffc3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -ffffff828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffffffffffffffffffffffffff -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffffffffff -d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9ffffffffffff -ffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffffffffffd9d9d9d9d9d9 -d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ffffffffffffffffffffffffc3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffc3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282828282828282c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282828282828282d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffff828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282828282828282 -d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9828282828282 -828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffff828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282 -828282828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffff828282828282828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -828282828282828282c3c3c3ffffffffffff828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282c3c3c3ffffffffffff828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3828282c3c3c3ffffff828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282c3c3c3ffffff828282c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex11.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex11.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex11.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex11.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex11.ps 1996-11-23 12:58:51.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex11.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,5873 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex11.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 238 511 460 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 930 string def - -% define space for color conversions -/grays 310 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 238 translate - -% size of image (on paper, in 1/72inch coords) -310.03200 221.97600 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -310 222 8 % dimensions of data -[310 0 0 -222 0 222] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080ffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080ffffffffffffffffffffffffffffff000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 -000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 -000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080000080 -000080000080ffffffffffff000080000080000080ffffffffffff000080000080ffffff -ffffffffffffffffff000080000080ffffff000080ffffffffffffffffff000080ffffff -ffffffffffff000080000080000080ffffffffffffffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffffffffffffffffffffff000080000080000080 -000080000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffffffffff000080000080000080000080000080 -000080000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080000080000080000080000080 -000080000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff -ffffffffffffffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080000080000080000080000080 -000080000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080000080000080000080000080 -000080000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080000080000080ffffffffffffffffffffffff000080000080 -ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff -ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 -000080000080ffffffffffffffffffffffffffffff000080000080000080000080ffffff -ffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080000080ffffffffffffffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 -000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffff737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373000000ffffff737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373000000000080000080ffffff -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000080000080000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffff828282828282828282828282828282828282828282828282828282828282828282 -828282828282ffffff828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff828282828282828282828282828282 -828282828282828282828282828282828282828282828282ffffff828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7f -ffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7f -ffff7fffff7fffff7fffff7fffff7fc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7f -ffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7fffff7f -ffff7fffff7fffff7fffff7fffff7fc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4 -ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4 -ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4 -ffff00ff6eb4ff6eb4ff6eb4ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ffff00 -ffff00ffff00ff6eb4ffff00ffff00ffff00ff6eb4ff6eb4ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4 -ffff00ff6eb4ff6eb4ff6eb4ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4 -ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4 -ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4 -ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4 -ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ff6eb4ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -ffffff828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ff6eb4ffff00ffff00ffff00ffff00ffff00 -ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4ff6eb4ffff00 -ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4 -ff6eb4ffff00ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4 -ff6eb4ff6eb4ffff00ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ff6eb4ff6eb4ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff6eb4ff6eb4ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7fffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00 -ffff00ffff00ffff00ffff00999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95d34f95 -ffff7fffff7f999900999900999900999900999900999900999900999900999900999900 -999900999900999900999900999900999900999900999900999900999900999900999900 -999900999900999900999900999900c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex12.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex12.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex12.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex12.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex12.ps 1996-11-23 12:59:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex12.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,4187 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex12.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 232 411 459 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 630 string def - -% define space for color conversions -/grays 210 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 232 translate - -% size of image (on paper, in 1/72inch coords) -210.02400 227.01600 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -210 227 8 % dimensions of data -[210 0 0 -227 0 227] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080000080ffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -000080ffffffffffffffffffffffff000080000080ffffffffffff000080ffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080ffffffffffff000080ffffffffffffffffff000080ffffffffffff -ffffffffffffffffffffffffffffff000080ffffffffffff000080ffffffffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff -000080000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff -000080000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080ffffffffffffffffff000080ffffffffffff -000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffff737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -000000ffffff737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373000000000080000080ffffff737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000080000080000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebebebebe000000 -000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000000000 -bebebebebebebebebe000000000000bebebebebebe000000000000000000000000000000 -000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000000000000000000000bebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebebebebe000000000000000000 -000000bebebebebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000000000000000000000000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebebebebe000000 -000000bebebebebebebebebe000000000000000000bebebebebebebebebe000000000000 -bebebebebebebebebe000000000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000bebebe000000 -000000bebebebebebebebebe000000000000000000bebebebebebebebebe000000000000 -000000bebebe000000000000000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebe000000000000000000bebebe000000000000bebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000bebebe000000 -000000bebebebebebe000000000000bebebe000000000000bebebebebebe000000000000 -000000bebebe000000000000000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebe000000000000000000bebebe000000000000bebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000000000 -000000bebebebebebe000000000000bebebe000000000000bebebebebebe000000000000 -000000000000000000000000000000bebebebebebe000000000000000000000000000000 -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000000000000000000000bebebebebebebebebe -000000000000000000000000000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebe000000000000000000000000000000000000bebebebebebe -000000000000000000000000000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebe000000000000 -000000bebebe000000000000bebebebebebebebebe000000000000bebebe000000000000 -bebebe000000bebebe000000000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebe000000000000bebebe000000000000000000bebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebe000000000000 -000000bebebe000000000000000000000000000000000000000000bebebe000000000000 -bebebe000000bebebe000000000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebe000000000000bebebe000000000000000000bebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebebebebe000000 -000000bebebe000000000000bebebebebebebebebe000000000000bebebe000000000000 -bebebebebebebebebe000000000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebebebebe000000 -000000bebebe000000000000bebebebebebebebebe000000000000bebebe000000000000 -bebebebebebebebebe000000000000bebebebebebe000000000000000000000000000000 -000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000bebebebebebebebebe000000000000000000 -000000bebebebebebebebebe000000000000bebebebebebe000000000000bebebebebebe -000000000000000000000000000000000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -828282828282828282828282828282828282828282828282828282828282828282828282 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffff828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe -bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -000000000000000000bebebebebebebebebebebebe000000000000000000bebebebebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe -bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000000000bebebebebebebebebebebebe000000 -bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe -bebebebebebebebebebebebe000000000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebe000000bebebe000000bebebe -bebebebebebebebebe000000000000bebebe000000bebebebebebebebebe000000000000 -000000bebebebebebebebebe000000000000bebebe000000bebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000bebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebe000000bebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebe000000bebebe000000bebebe -bebebebebebe000000bebebebebebe000000000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebe000000bebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebe000000bebebe000000bebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebe000000bebebebebebebebebebebebebebebe000000000000bebebebebebe -bebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe000000000000 -000000000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe -bebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000000000 -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -000000bebebebebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe -bebebe000000000000000000000000000000000000bebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebe000000bebebebebebe000000000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 -bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebebebebe000000000000bebebe000000bebebebebebebebebe000000000000 -000000000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000000000000000000000bebebebebebe000000 -000000000000000000000000bebebebebebebebebe000000000000000000bebebebebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000bebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe -000000000000000000bebebebebebebebebebebebe000000000000000000bebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebe000000000000bebebebebebe000000 -bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe -bebebebebebe000000000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe -bebebebebebebebebe000000000000000000bebebebebebebebebebebebe000000000000 -000000bebebebebebebebebe000000000000000000000000000000bebebebebebebebebe -000000000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebe000000bebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe -bebebe000000bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000bebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebe000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebe000000000000000000000000000000bebebebebebebebebe000000000000 -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -000000000000000000000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebebebebe -bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000000000000000000000000000bebebebebebe -bebebebebebebebebe000000bebebebebebebebebe000000bebebebebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebe000000 -bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000bebebe -bebebebebebebebebe000000000000000000bebebebebebebebebebebebe000000000000 -000000000000bebebebebebebebebebebebebebebe000000000000bebebebebebebebebe -000000000000000000000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe -000000000000000000bebebebebebebebebe000000000000000000000000000000bebebe -bebebe000000000000000000000000000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -828282828282828282828282828282828282828282828282828282828282828282828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffff828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000000000 -bebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebe000000000000000000bebebebebebe -bebebebebebe000000000000000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe -bebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000000000bebebebebebebebebebebebebebebe -bebebebebebe000000000000bebebebebebe000000bebebebebebebebebe000000bebebe -bebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe -bebebebebebe000000bebebe000000000000bebebebebebebebebebebebe000000000000 -000000bebebebebebebebebe000000000000bebebe000000bebebebebebebebebebebebe -000000000000000000bebebebebebebebebebebebe000000000000000000bebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000bebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe -bebebebebebe000000000000bebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebe000000 -bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -000000bebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe -bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 -bebebebebebebebebe000000bebebebebebebebebebebebe000000000000bebebebebebe -bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe -000000000000000000000000bebebebebebebebebe000000000000000000bebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebe000000 -bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000 -000000000000000000000000000000bebebebebebebebebebebebebebebe000000bebebe -bebebebebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebe000000bebebe000000bebebebebebe000000 -bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe -bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebe000000bebebebebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe000000000000 -000000bebebebebebebebebe000000bebebe000000bebebe000000bebebebebebebebebe -000000000000000000000000bebebebebebebebebe000000000000000000bebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000000000000000000000bebebebebebebebebe -bebebebebebebebebe000000bebebebebebebebebe000000000000000000bebebebebebe -bebebe000000000000000000000000000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000bebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000000000bebebebebebebebebebebebe -bebebe000000000000bebebebebebebebebe000000000000000000000000000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe -000000bebebebebebe000000bebebebebebe000000bebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe -bebebebebebebebebe000000000000000000bebebebebebebebebe000000bebebe000000 -000000bebebebebebebebebebebebe000000000000bebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe -000000bebebebebebe000000bebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000000000bebebe -bebebe000000bebebebebebe000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe -000000bebebebebebe000000bebebebebebebebebebebebebebebe000000bebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000bebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe -000000bebebebebebe000000bebebebebebebebebebebebebebebe000000bebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe -000000bebebebebebe000000bebebebebebebebebebebebebebebe000000bebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe -000000bebebebebebe000000bebebebebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe -000000bebebebebebe000000bebebebebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000bebebe -bebebebebebebebebe000000000000000000bebebebebebebebebe000000bebebebebebe -bebebe000000bebebebebebebebebe000000000000bebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000000000bebebebebebebebebebebebe -bebebe000000000000bebebebebebebebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebe000000000000000000bebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000000000bebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebe000000bebebebebebe -bebebebebebebebebe000000000000000000bebebebebebebebebe000000bebebe000000 -000000bebebebebebebebebebebebe000000000000bebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000bebebe000000bebebebebebebebebebebebe000000 -bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000000000bebebe -bebebe000000bebebebebebe000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebe000000bebebebebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebebebebe000000bebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebe000000bebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebe -bebebe000000bebebebebebe000000bebebebebebe000000000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebe000000 -bebebebebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebe -bebebe000000bebebebebebebebebe000000000000bebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000000000000000000000bebebebebebe000000 -000000000000000000000000bebebebebebe000000000000000000000000000000bebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebe000000000000000000bebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000000000 -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebe000000000000000000bebebebebebe -bebebebebebe000000000000000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebe000000000000bebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebebebebebebebe000000bebebe -bebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe000000000000 -000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebe000000bebebe000000bebebebebebe000000 -bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebe000000bebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebe000000bebebebebebe000000bebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebe000000bebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000bebebe -bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebebebebe000000bebebebebebe -bebebebebebebebebe000000000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe -bebebebebebebebebe000000bebebe000000bebebebebebebebebebebebe000000000000 -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000bebebebebebebebebe000000bebebebebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe -bebebebebebebebebe000000bebebe000000bebebebebebebebebe000000bebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebe000000000000000000000000000000000000bebebebebebe -bebebe000000bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebe -bebebebebebebebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000bebebebebebebebebebebebe -bebebebebebebebebebebebe000000bebebebebebebebebebebebe000000bebebebebebe -bebebe000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebebebebe -bebebe000000bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe -bebebe000000bebebebebebebebebe000000bebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebe000000000000000000000000000000 -bebebebebebebebebebebebe000000bebebebebebebebebebebebebebebe000000000000 -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebe000000bebebebebebe000000 -000000000000000000000000bebebebebebe000000000000000000000000000000bebebe -bebebebebebe000000000000000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000bebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -000000000000bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe -bebebe000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffc3c3c3ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffc3c3c3ffffffffffffc3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff828282c3c3c3ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff828282c3c3c3ffffffffffffffffffffffffc3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffffffff828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffffffffffffffffffff -ffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3ffffffffffffffffffffffffd9d9d9828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9ffffff -ffffffffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff -ffffffffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffffffffffffffc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffc3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3ffffffffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffc3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3828282828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282828282c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3828282828282828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282828282828282c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282 -828282828282828282d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9828282828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3828282828282828282828282d9d9d9828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffffd9d9d9d9d9d9828282 -828282828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3828282828282828282828282828282c3c3c3ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3ffffffffffff828282828282828282 -828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282828282c3c3c3ffffffffffff828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282c3c3c3ffffffffffff828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3ffffff828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282c3c3c3ffffff828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex13.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex13.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex13.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex13.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex13.ps 1996-11-23 12:59:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex13.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,2369 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex13.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 334 411 460 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 630 string def - -% define space for color conversions -/grays 210 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 334 translate - -% size of image (on paper, in 1/72inch coords) -210.02400 126.00000 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -210 126 8 % dimensions of data -[210 0 0 -126 0 126] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080ffffff000080ffffffffffffffffff000080ffffffffffffffffff -000080000080000080ffffffffffffffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffffffffff -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffffffffffffffffffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080000080000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080ffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080000080ffffffffffffffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffff737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -000000ffffff737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373000000000080000080ffffff737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000080000080000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffff828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffff828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffff828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8ed9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8e8e8e8e -8e8e8ed9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8e8e8e8e -8e8e8e8e8e8ed9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8eececec -ececec8e8e8e8e8e8e8e8e8ed9d9d9ffffffffffffffffffecececececececececececec -ecececececececececececec828282828282ecececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8eececec -ececececececffffffffffffffffffffffffffffffffffffecececececececececececec -ececececececececec828282828282828282828282ececececececececececececececec -ececececececececec000000000000000000000000ececececececececececececececec -ececececececececececececececececececececececececececec000000ecececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8eececec -ecececffffffffffffffffffd9d9d9ffffffffffffffffffecececececececececececec -ecececececec828282828282828282828282828282828282ecececececececececececec -ececececececececec000000ececececececececec000000ecececececececececececec -ececececececececececececececececececececececececececec000000ecececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8effffff -ffffffffffffd9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec -ececec828282828282828282b03060b03060828282828282828282ececececececececec -ececececececececec000000ececececececececec000000ececececececececec000000 -000000000000ecececececececececececec000000000000ececec000000ecececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8e8e8e8effffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec -828282828282828282b03060b03060b03060b03060828282828282828282ecececececec -ececececececececec000000ececececececececec000000ecececececec000000ececec -ecececececec000000ecececececec000000ecececececec000000000000ecececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98e8e8effffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffececececececececec828282 -828282828282b03060b03060b03060b03060b03060b03060828282828282828282ececec -ececececececececec000000000000000000000000ececececececececec000000ececec -ecececececec000000ecececececec000000ececececececececec000000ecececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffececececececffffffffffff -ffffffb03060b03060b03060b03060b03060b03060b03060b03060ffffffffffffffffff -ececececececececec000000ecececececec000000ececececececececec000000000000 -000000000000000000ecececececec000000ececececececececec000000ecececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececffffff -ffffffffffffb03060b03060b03060b03060b03060b03060ffffffffffffffffffececec -ececececececececec000000ececececececececec000000ecececececec000000ececec -ececececececececececececececec000000ececececececececec000000ecececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec -ffffffffffffffffffb03060b03060b03060b03060ffffffffffffffffffecececececec -ececececececececec000000ececececececececec000000ecececececec000000ececec -ecececececec000000ecececececec000000ecececececec000000000000ecececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffecececececececececececec -ecececffffffffffffffffffb03060b03060ffffffffffffffffffececececececececec -ececececececececec000000ececececececececec000000ececececececececec000000 -000000000000ecececececececececececec000000000000ececec000000ecececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffffffffff828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282ffffffffffffffffffecececececececececececec -ececececececffffffffffffffffffffffffffffffffffffecececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffffff828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282ffffffffffffffffffecececececececececececec -ecececececececececffffffffffffffffffffffffececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffffffffecececececececececececec -ececececececececececececffffffffffffecececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffffffffecececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ecececececececececececececececececececececececececececececececececececec -ececececececececec8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffffffff8e8e8e8e8e8e8e8e8e8e8e8e -8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e -8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e -8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e -8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e -8e8e8e8e8e8e8e8e8e8e8e8e828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9ffffffffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffff -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9ffffffffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffff -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffffffffff828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ffffff828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex14.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex14.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex14.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex14.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex14.ps 1996-11-23 12:59:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex14.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,11546 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex14.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 132 611 459 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 1230 string def - -% define space for color conversions -/grays 410 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 132 translate - -% size of image (on paper, in 1/72inch coords) -409.96800 327.02400 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -410 327 8 % dimensions of data -[410 0 0 -327 0 327] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000000080000080ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080ffffffffffff000080000080000080000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffff000080000080000080ffffff -ffffff000080ffffffffffff000080ffffffffffff000080ffffffffffffffffffffffff -000080000080ffffffffffffffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff -000080ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080000080ffffffffffff000080ffffffffffffffffffffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080000080ffffffffffff000080ffffffffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff -000080ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 -000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffff000080000080000080ffffff -ffffff000080ffffffffffff000080ffffffffffff000080000080000080ffffffffffff -000080000080ffffffffffffffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 -000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffff737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373000000ffffff737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -000000000080000080ffffff737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000080000080000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282828282828282828282828282828282828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282828282828282828282828282828282828282828282ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282b03060b03060b03060b03060b03060b03060b03060ffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffff828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffff828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffff828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffff828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282ffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffff828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffff828282828282828282828282828282828282828282828282828282828282 -828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffff828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffff828282828282828282828282828282828282828282828282828282828282 -828282828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffff828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff828282ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9828282828282 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9828282828282c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282828282c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ffffff828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282828282ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282828282c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000828282ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000000828282828282 -c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3828282c3c3c3c3c3c3c3c3c3c3c3c3 -c3c3c3c3c3c3c3c3c3ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000828282828282 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000828282ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex15.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex15.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex15.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex15.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex15.ps 1996-11-23 12:59:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex15.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,9796 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex15.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 101 257 511 534 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 1230 string def - -% define space for color conversions -/grays 410 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -101 257 translate - -% size of image (on paper, in 1/72inch coords) -409.96800 276.98400 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -410 277 8 % dimensions of data -[410 0 0 -277 0 277] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000000080000080ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff -ffffffffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff -000080000080ffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffffffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffffffffffffffff000080000080000080000080000080000080ffffffffffff -000080000080000080ffffffffffff000080000080ffffffffffffffffffffffff000080 -000080ffffff000080ffffffffffffffffff000080ffffffffffffffffff000080000080 -000080ffffffffffffffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff -000080000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffff000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff -000080000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff -000080000080000080ffffffffffff000080ffffffffffffffffffffffffffffffffffff -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080000080000080000080000080000080000080ffffffffffff -000080000080000080ffffffffffff000080ffffffffffff000080000080000080000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffff000080000080000080000080000080ffffffffffff -000080000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 -000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080ffffffffffff000080000080000080000080000080000080ffffffffffff -ffffffffffffffffff000080000080000080000080ffffffffffffffffffffffff000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffffffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 -000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffff737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373000000ffffff737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -000000000080000080ffffff737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000080000080000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000d9d9d9 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 -000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000000000000000000000 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000d9d9d9 -000000000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9000000 -000000000000000000d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9000000 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000 -000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 -000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 -000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9000000000000000000d9d9d9000000000000000000000000d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 -000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9000000000000000000000000000000000000000000000000000000 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 -000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9000000000000000000000000000000000000000000000000000000 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 -000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9000000 -000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9000000000000000000d9d9d9000000000000000000000000d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9000000 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9000000 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000 -000000d9d9d9000000000000000000d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000d9d9d9000000000000000000000000000000000000 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9000000000000d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000 -d9d9d9000000000000000000000000d9d9d9000000000000d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000d9d9d9 -000000000000000000000000d9d9d9d9d9d9000000000000d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9000000000000000000d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9000000000000000000000000d9d9d9000000000000000000 -d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000000000000000d9d9d9000000000000000000d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9000000000000000000d9d9d9000000000000000000000000000000000000000000 -d9d9d9000000000000000000000000000000000000d9d9d9d9d9d9000000000000000000 -d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9000000000000000000d9d9d9000000000000000000d9d9d9000000000000000000 -000000000000000000000000d9d9d9000000000000000000d9d9d9000000000000000000 -d9d9d9000000000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex16.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex16.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex16.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex16.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex16.ps 1996-11-23 12:59:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex16.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,4187 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex16.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 101 307 311 534 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 630 string def - -% define space for color conversions -/grays 210 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -101 307 translate - -% size of image (on paper, in 1/72inch coords) -210.02400 227.01600 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -210 227 8 % dimensions of data -[210 0 0 -227 0 227] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080ffffffffffffffffffffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -000080ffffffffffffffffffffffff000080000080ffffffffffffffffffffffff000080 -000080ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080ffffffffffffffffffffffff000080000080000080 -000080000080000080ffffffffffff000080000080000080ffffffffffff000080000080 -ffffffffffffffffffffffff000080000080ffffff000080ffffffffffffffffff000080 -ffffffffffffffffff000080000080000080ffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080ffffffffffff000080000080000080ffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080ffffffffffff000080000080000080ffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffffffffffffffffffffffffffff000080000080ffffffffffff000080000080 -000080ffffffffffffffffffffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080ffffffffffff000080000080000080ffffffffffff000080ffffff -ffffffffffffffffffffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080000080000080000080000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080ffffffffffff000080000080000080ffffffffffff000080ffffff -ffffff000080000080000080000080000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080ffffff000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffff000080000080000080 -000080ffffffffffffffffffffffff000080000080000080ffffffffffff000080000080 -000080ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080ffffff -ffffff000080ffffffffffff000080000080000080ffffffffffff000080000080000080 -000080000080000080ffffffffffffffffffffffffffffff000080000080000080000080 -ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080000080ffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffff737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -000000ffffff737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373000000000080000080ffffff737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000080000080000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000000000 -000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000000000000000ff0000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -000000000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000000000ff0000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000ff0000000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff00000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff000000ff0000ff000000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff000000ff0000ff00ff00 -000000ff0000ff0000ff00000000ff0000ff0000ff0000ffff0000ff0000ff00000000ff -0000ff0000ff0000ffff0000ff0000ff00000000ff0000ff0000ff00000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff000000ff0000ff00ff00 -00ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffff00000000ff -0000ff0000ff0000ffff0000ff0000ff00000000ff0000ff00000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff00 -00ff000000ff0000ff0000ffff0000ff0000ff0000ff00000000ff0000ff0000ffff0000 -0000ff0000ffff0000ff00000000ff0000ffff00000000ff00000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff00 -00ff000000ff0000ff000000ff0000ff0000ff0000ff0000ff00000000ff0000ffff0000 -0000ff0000ffff00000000ff0000ff0000ffff00000000ff00000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff0000ff0000ff0000ff00 -00ff000000ff0000ff000000ff0000ff0000ff0000ff0000ff00000000ff0000ffff0000 -ff00000000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000000000ff0000ff0000ff00000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff0000ff0000ff0000ff00 -00ff000000ff0000ff00ff00000000ff0000ff0000ff0000ff00000000ff0000ffff0000 -ff00000000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff00000000ff0000ffff0000ff000000000000ff0000ff0000ff0000ff00 -00ff000000ff0000ff0000ff000000ff0000ff0000ff00000000ff0000ff0000ffff0000 -ff00000000ff0000ff0000ffff00000000ff0000ff00000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff00 -00ff0000ff000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000 -ff00000000ff0000ff0000ffff00000000ff0000ff00000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff000000ff0000ff0000ff0000ffff0000ff0000ff0000ff0000 -ff0000ff00000000ff0000ffff0000ff00000000ff00000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff000000ff0000ff00ff00000000ff0000ff00000000ff0000ffff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff000000ff0000ff00ff00000000ff0000ff00000000ff0000ffff0000 -ff0000ff0000ff0000ff00000000ff0000ff0000ff00000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d900000000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff000000ff0000ff00ff00000000ff0000ff00000000ff0000ffff0000 -ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff000000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000 -ff00000000ff0000ff0000ffff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000d9d9d900000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff000000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000ff0000 -ff00000000ff0000ffff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff000000ff0000ff00ff00000000ff0000ff0000ff0000ff0000ff0000 -ff00000000ff0000ffff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -d9d9d900000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff000000ff0000ff00ff00000000ff0000ff0000ff0000ff0000ff0000 -ff00000000ff0000ffff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff000000ff0000ff000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff00000000ff0000ff0000ffff0000ff0000ff0000ff00000000ff0000ff00000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff000000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000ff0000ff0000 -ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff000000ff0000ff0000ff0000ff0000ff0000ff0000ffff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ffff0000ff0000ff0000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000000000000000000000000000000000000000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000000000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000000000ff0000ff0000ff0000ff00000000000000ff0000ff0000 -00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -000000ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000000000ff0000ff0000ff000000000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000000000ff0000ff000000000000000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000000000000000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000ff0000ff0000ff0000ff0000ff0000000000000000000000000000000000 -000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff000000000000000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000000000 -000000000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff00000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00000000 -000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff -0000ffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff -0000ffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d900000000000000000000000000000000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d900000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff -0000ffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff -0000ffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d900000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d900000000000000ff0000ff0000ff0000ff00000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d900000000000000ff0000ff00000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000000000000000000000000000000000000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff0000ff00000000000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000000000d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000ff0000ff00000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000ff00000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000000000d9d9d900000000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -00000000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -00000000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff -0000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff -0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000000000000000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff000000ff0000ff00ff0000ff0000ff0000ff000000ff0000ff00ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff000000ff0000ff00ff0000ff0000ff0000ff000000ff0000ff00ff0000ff0000ff00 -00ff0000ff000000ff0000ff0000ff0000ff00ff0000ff0000ff000000ff00000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d900000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff000000ff0000ff00ff0000ff0000ff0000ff000000ff0000ff00ff0000ff0000ff00 -0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff000000ff0000ff000000 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d900000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff000000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff000000ff -0000ff0000ff00ff0000ff0000ff0000ff000000ff0000ff0000ff00ff000000ff000000 -00000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d900000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff000000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff000000ff -0000ff00ff0000ff0000ff0000ff0000ff0000ff000000ff0000ff00ff000000ff0000ff -00ff0000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -0000000000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff0000ff0000ff00 -00ff000000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff -0000ff00ff0000ff0000ff0000ff0000ff0000ff000000ff0000ff00ff0000ff000000ff -0000ff0000ff00000000000000ff0000ff0000ff0000ff0000ff0000ff00000000000000 -0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff00 -00ff000000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff -0000ff00ff0000ff0000ff0000ff0000ff0000ff000000ff0000ff00ff0000ff000000ff -0000ff0000ff0000ff0000ff00000000000000000000000000000000000000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff00 -00ff000000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff000000ff -0000ff0000ff00ff0000ff0000ff0000ff000000ff0000ff0000ff00ff0000ff000000ff -0000ff0000ff00ff000000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 -0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000000000ff -0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 -0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff000000ff -0000ff0000ff00ff000000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 -0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff -0000ff0000ff0000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff000000ff0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 -0000ff0000ff00ff0000ff000000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff00 -0000ff0000ff0000ff00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d900000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff00000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff00000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff -0000ffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000000000000000000000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff0000ff -0000ff0000ff0000ff0000ff0000ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff -0000ffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff00000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff0000ff -0000ff0000ff0000ff0000ff0000ff0000ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff -0000ffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d900000000000000000000000000000000000000ff0000ff0000ff0000ff00 -00ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff00 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff -0000ffd9d9d9d9d9d9d9d9d9d9d9d90000ff0000ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff -0000ffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000ff -0000ffd9d9d9d9d9d9d9d9d9d9d9d90000ff0000ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -0000ff0000ff0000ff0000ffd9d9d9d9d9d9d9d9d90000ff0000ff0000ff0000ffd9d9d9 -d9d9d9d9d9d90000ff0000ff0000ff0000ffd9d9d9d9d9d9d9d9d9d9d9d90000ff0000ff -0000ffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex1.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex1.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex1.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex1.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex1.ps 1996-11-23 12:58:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex1.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,2387 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex1.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 332 411 459 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 630 string def - -% define space for color conversions -/grays 210 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 332 translate - -% size of image (on paper, in 1/72inch coords) -210.02400 127.00800 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -210 127 8 % dimensions of data -[210 0 0 -127 0 127] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffffffffffffffffffff000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080ffffffffffffffffffffffff000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffff737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -000000ffffff737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373000000000080000080ffffff737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000080000080000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 -d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffffffff828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffff828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex8.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex8.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex8.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex8.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex8.ps 1996-11-23 12:59:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex8.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,6003 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex8.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 232 511 459 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 930 string def - -% define space for color conversions -/grays 310 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 232 translate - -% size of image (on paper, in 1/72inch coords) -310.03200 227.01600 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -310 227 8 % dimensions of data -[310 0 0 -227 0 227] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffffffffffffffffffff000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 -000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 -000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080ffffffffffff000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080ffffffffffffffffffffffff000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000 -000000000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffff737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373000000ffffff737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373000000000080000080ffffff -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000080000080000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffffffffd9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282828282d9d9d9d9d9d9828282828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9828282828282828282b03060b03060828282828282828282d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -828282828282828282b03060b03060b03060b03060828282828282828282d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282828282b03060b03060b03060b03060b03060b03060828282828282828282d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff -ffffffb03060b03060b03060b03060b03060b03060b03060b03060ffffffffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -ffffffffffffb03060b03060b03060b03060b03060b03060ffffffffffffffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffffffffffffffb03060b03060b03060b03060ffffffffffffffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffffffffb03060b03060ffffffffffffffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex9.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex9.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex9.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex9.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/ex9.ps 1996-11-23 12:59:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/ex9.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,1879 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/ex9.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 332 361 459 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 480 string def - -% define space for color conversions -/grays 160 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 332 translate - -% size of image (on paper, in 1/72inch coords) -159.98400 127.00800 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -160 127 8 % dimensions of data -[160 0 0 -127 0 127] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff000000000080000080ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffffffffffffffff000080ffffff -ffffff000080ffffffffffffffffffffffff000080000080000080ffffffffffff000080 -000080000080000080000080000080ffffffffffff000080000080000080ffffffffffff -000080000080ffffffffffffffffffffffff000080000080ffffff000080ffffffffffff -ffffff000080ffffffffffffffffff000080000080000080ffffffffffffffffffffffff -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffffffffffffffffffffffffffffffffff000080000080000080ffffffffffff000080 -000080000080000080000080000080ffffffffffff000080000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080000080 -000080000080000080000080000080ffffffffffff000080000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080ffffffffffff000080ffffffffffff000080000080 -000080000080000080000080000080ffffffffffff000080000080000080ffffffffffff -000080ffffffffffffffffffffffffffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080ffffffffffffffffff000080000080000080 -000080000080000080000080000080ffffffffffff000080000080000080ffffffffffff -000080ffffffffffff000080000080000080000080000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff -ffffff000080000080000080000080000080ffffffffffffffffff000080000080000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080000080000080ffffffffffff000080ffffff -ffffff000080000080000080000080000080000080ffffffffffff000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffffffffff000080000080 -000080000080ffffffffffffffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080000080ffffffffffffffffffffffff -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffff737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373000000ffffff -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373000000000080000080ffffff737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffffffff000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000080000080000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282ffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282828282ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000828282ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffffffff828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffffffffff828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffff828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ffffff828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282828282828282828282828282828282828282828282828282828282828282828282 -828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-1.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-1.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-1.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-1.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-1.ps 1996-11-24 09:51:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-1.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,171 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: gs_fig1.fig -%%Creator: fig2dev Version 3.1 Patchlevel 2 -%%CreationDate: Wed Nov 20 21:06:25 1996 -%%For: hans@skeppet (Hans Nilsson,EUA/SU) -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 328 210 -%%Pages: 0 -%%BeginSetup -%%IncludeFeature: *PageSize A4 -%%EndSetup -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def - -end -save --88.0 308.0 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def - /DrawEllipse { - /endangle exch def - /startangle exch def - /yrad exch def - /xrad exch def - /y exch def - /x exch def - /savematrix mtrx currentmatrix def - x y tr xrad yrad sc 0 0 1 startangle endangle arc - closepath - savematrix setmatrix - } def - -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n 0 842 m 0 0 l 595 0 l 595 842 l cp clip - 0.06000 0.06000 sc -7.500 slw -% Ellipse -n 6000 2025 900 375 0 360 DrawEllipse gs col-1 s gr - -/Helvetica ff 210.00 scf sf -5400 2100 m -gs 1 -1 sc (GUI Builder) col-1 sh gr -% Ellipse -n 2550 2025 1050 375 0 360 DrawEllipse gs col-1 s gr - -/Helvetica ff 210.00 scf sf -1800 2100 m -gs 1 -1 sc (GUI Applications) col-1 sh gr -% Polyline -gs clippath -3484 2904 m 3576 2987 l 3456 2957 l 3599 3034 l 3627 2981 l cp clip -n 2475 2400 m 3600 3000 l gs col-1 s gr gr - -% arrowhead -n 3484 2904 m 3576 2987 l 3456 2957 l 3470 2931 l 3484 2904 l cp gs 0.00 setgray ef gr col-1 s -% Polyline -gs clippath -5239 2943 m 5122 2985 l 5206 2893 l 5071 2983 l 5104 3033 l cp clip -n 6000 2400 m 5100 3000 l gs col-1 s gr gr - -% arrowhead -n 5239 2943 m 5122 2985 l 5206 2893 l 5222 2918 l 5239 2943 l cp gs 0.00 setgray ef gr col-1 s -30.000 slw -% Polyline -n 1500 3750 m 6900 3750 l gs col-1 s gr -7.500 slw -% Polyline -n 6225 4500 m 6900 4500 l 6900 5100 l 6225 5100 l cp gs col-1 s gr -% Polyline -n 5100 4500 m 5775 4500 l 5775 5100 l 5100 5100 l cp gs col-1 s gr -% Polyline -n 3975 4500 m 4650 4500 l 4650 5100 l 3975 5100 l cp gs col-1 s gr -% Polyline -n 1575 4500 m 2250 4500 l 2250 5100 l 1575 5100 l cp gs col-1 s gr -% Polyline -n 2775 4500 m 3555 4500 l 3555 5115 l 2775 5115 l cp gs col-1 s gr -/Helvetica ff 210.00 scf sf -4350 3450 m -gs 1 -1 sc (General Graphics Interface \(API\)) dup sw pop 2 div neg 0 rm col-1 sh gr -/Helvetica ff 210.00 scf sf -4350 4125 m -gs 1 -1 sc (Possible backends to many systems and platforms) dup sw pop 2 div neg 0 rm col-1 sh gr -/Helvetica ff 210.00 scf sf -1680 4882 m -gs 1 -1 sc (Motif) col-1 sh gr -/Helvetica ff 210.00 scf sf -2820 4905 m -gs 1 -1 sc (Win3.2) col-1 sh gr -/Helvetica ff 210.00 scf sf -4095 4905 m -gs 1 -1 sc (OS/2) col-1 sh gr -/Helvetica ff 210.00 scf sf -5115 4890 m -gs 1 -1 sc (Tcl/Tk) col-1 sh gr -/Helvetica ff 210.00 scf sf -6330 4875 m -gs 1 -1 sc (PXW) col-1 sh gr -$F2psEnd -rs Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-2.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-2.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-2.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-2.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-2.ps 1997-05-22 23:38:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-2.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,2832 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: Adobe Illustrator(r) 6.0 -%%For: (Anna Fedoriw) (Ericsson Telecom) -%%Title: (Process_in_Erlang.eps) -%%CreationDate: (97-05-22) (12.55) -%%BoundingBox: 117 590 392 730 -%%HiResBoundingBox: 117.7663 590.1667 391.1347 729.3677 -%%DocumentProcessColors: Black -%%DocumentFonts: Univers -%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 -%%+ procset Adobe_typography_AI5 1.0 0 -%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 -%%+ procset Adobe_Illustrator_AI5 1.0 0 -%AI5_FileFormat 2.0 -%AI3_ColorUsage: Black&White -%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) -%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 -%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () -%AI3_TemplateBox: 306 396 306 396 -%AI3_TileBox: 21 -12 588 802 -%AI3_DocumentPreview: Macintosh_ColorPic -%AI5_ArtSize: 595.2756 841.8898 -%AI5_RulerUnits: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI5_OpenToView: -174 876 1 1058 826 58 1 1 2 40 -%AI5_OpenViewLayers: 7 -%%EndComments -%%BeginProlog -%%BeginResource: procset Adobe_level2_AI5 1.2 0 -%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) -%%Version: 1.2 -%%CreationDate: (04/10/93) () -%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) -userdict /Adobe_level2_AI5 23 dict dup begin - put - /packedarray where not - { - userdict begin - /packedarray - { - array astore readonly - } bind def - /setpacking /pop load def - /currentpacking false def - end - 0 - } if - pop - userdict /defaultpacking currentpacking put true setpacking - /initialize - { - Adobe_level2_AI5 begin - } bind def - /terminate - { - currentdict Adobe_level2_AI5 eq - { - end - } if - } bind def - mark - /setcustomcolor where not - { - /findcmykcustomcolor - { - 5 packedarray - } bind def - /setcustomcolor - { - exch aload pop pop - 4 - { - 4 index mul 4 1 roll - } repeat - 5 -1 roll pop - setcmykcolor - } - def - } if - - /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def - userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put - userdict /level2? - systemdict /languagelevel known dup - { - pop systemdict /languagelevel get 2 ge - } if - put -/level2ScreenFreq -{ - begin - 60 - HalftoneType 1 eq - { - pop Frequency - } if - HalftoneType 2 eq - { - pop GrayFrequency - } if - HalftoneType 5 eq - { - pop Default level2ScreenFreq - } if - end -} bind def -userdict /currentScreenFreq - level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put -level2? not - { - /setcmykcolor where not - { - /setcmykcolor - { - exch .11 mul add exch .59 mul add exch .3 mul add - 1 exch sub setgray - } def - } if - /currentcmykcolor where not - { - /currentcmykcolor - { - 0 0 0 1 currentgray sub - } def - } if - /setoverprint where not - { - /setoverprint /pop load def - } if - /selectfont where not - { - /selectfont - { - exch findfont exch - dup type /arraytype eq - { - makefont - } - { - scalefont - } ifelse - setfont - } bind def - } if - /cshow where not - { - /cshow - { - [ - 0 0 5 -1 roll aload pop - ] cvx bind forall - } bind def - } if - } if - cleartomark - /anyColor? - { - add add add 0 ne - } bind def - /testColor - { - gsave - setcmykcolor currentcmykcolor - grestore - } bind def - /testCMYKColorThrough - { - testColor anyColor? - } bind def - userdict /composite? - level2? - { - gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore - add add add 4 eq - } - { - 1 0 0 0 testCMYKColorThrough - 0 1 0 0 testCMYKColorThrough - 0 0 1 0 testCMYKColorThrough - 0 0 0 1 testCMYKColorThrough - and and and - } ifelse - put - composite? not - { - userdict begin - gsave - /cyan? 1 0 0 0 testCMYKColorThrough def - /magenta? 0 1 0 0 testCMYKColorThrough def - /yellow? 0 0 1 0 testCMYKColorThrough def - /black? 0 0 0 1 testCMYKColorThrough def - grestore - /isCMYKSep? cyan? magenta? yellow? black? or or or def - /customColor? isCMYKSep? not def - end - } if - end defaultpacking setpacking -%%EndResource -%%BeginResource: procset Adobe_typography_AI5 1.0 1 -%%Title: (Typography Operators) -%%Version: 1.0 -%%CreationDate:(03/26/93) () -%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) -currentpacking true setpacking -userdict /Adobe_typography_AI5 54 dict dup begin -put -/initialize -{ - begin - begin - Adobe_typography_AI5 begin - Adobe_typography_AI5 - { - dup xcheck - { - bind - } if - pop pop - } forall - end - end - end - Adobe_typography_AI5 begin -} def -/terminate -{ - currentdict Adobe_typography_AI5 eq - { - end - } if -} def -/modifyEncoding -{ - /_tempEncode exch ddef - /_pntr 0 ddef - { - counttomark -1 roll - dup type dup /marktype eq - { - pop pop exit - } - { - /nametype eq - { - _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll - put - } - { - /_pntr exch ddef - } ifelse - } ifelse - } loop - _tempEncode -} def -/TE -{ - StandardEncoding 256 array copy modifyEncoding - /_nativeEncoding exch def -} def -% -/TZ -{ - dup type /arraytype eq - { - /_wv exch def - } - { - /_wv 0 def - } ifelse - /_useNativeEncoding exch def - pop pop - findfont _wv type /arraytype eq - { - _wv makeblendedfont - } if - dup length 2 add dict - begin - mark exch - { - 1 index /FID ne - { - def - } if - cleartomark mark - } forall - pop - /FontName exch def - counttomark 0 eq - { - 1 _useNativeEncoding eq - { - /Encoding _nativeEncoding def - } if - cleartomark - } - { - /Encoding load 256 array copy - modifyEncoding /Encoding exch def - } ifelse - FontName currentdict - end - definefont pop -} def -/tr -{ - _ax _ay 3 2 roll -} def -/trj -{ - _cx _cy _sp _ax _ay 6 5 roll -} def -/a0 -{ - /Tx - { - dup - currentpoint 3 2 roll - tr _psf - newpath moveto - tr _ctm _pss - } ddef - /Tj - { - dup - currentpoint 3 2 roll - trj _pjsf - newpath moveto - trj _ctm _pjss - } ddef -} def -/a1 -{ - /Tx - { - dup currentpoint 4 2 roll gsave - dup currentpoint 3 2 roll - tr _psf - newpath moveto - tr _ctm _pss - grestore 3 1 roll moveto tr sp - } ddef - /Tj - { - dup currentpoint 4 2 roll gsave - dup currentpoint 3 2 roll - trj _pjsf - newpath moveto - trj _ctm _pjss - grestore 3 1 roll moveto tr jsp - } ddef -} def -/e0 -{ - /Tx - { - tr _psf - } ddef - /Tj - { - trj _pjsf - } ddef -} def -/e1 -{ - /Tx - { - dup currentpoint 4 2 roll gsave - tr _psf - grestore 3 1 roll moveto tr sp - } ddef - /Tj - { - dup currentpoint 4 2 roll gsave - trj _pjsf - grestore 3 1 roll moveto tr jsp - } ddef -} def -/i0 -{ - /Tx - { - tr sp - } ddef - /Tj - { - trj jsp - } ddef -} def -/i1 -{ - W N -} def -/o0 -{ - /Tx - { - tr sw rmoveto - } ddef - /Tj - { - trj swj rmoveto - } ddef -} def -/r0 -{ - /Tx - { - tr _ctm _pss - } ddef - /Tj - { - trj _ctm _pjss - } ddef -} def -/r1 -{ - /Tx - { - dup currentpoint 4 2 roll currentpoint gsave newpath moveto - tr _ctm _pss - grestore 3 1 roll moveto tr sp - } ddef - /Tj - { - dup currentpoint 4 2 roll currentpoint gsave newpath moveto - trj _ctm _pjss - grestore 3 1 roll moveto tr jsp - } ddef -} def -/To -{ - pop _ctm currentmatrix pop -} def -/TO -{ - iTe _ctm setmatrix newpath -} def -/Tp -{ - pop _tm astore pop _ctm setmatrix - _tDict begin - /W - { - } def - /h - { - } def -} def -/TP -{ - end - iTm 0 0 moveto -} def -/Tr -{ - _render 3 le - { - currentpoint newpath moveto - } if - dup 8 eq - { - pop 0 - } - { - dup 9 eq - { - pop 1 - } if - } ifelse - dup /_render exch ddef - _renderStart exch get load exec -} def -/iTm -{ - _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale -} def -/Tm -{ - _tm astore pop iTm 0 0 moveto -} def -/Td -{ - _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto -} def -/iTe -{ - _render -1 eq - { - } - { - _renderEnd _render get dup null ne - { - load exec - } - { - pop - } ifelse - } ifelse - /_render -1 ddef -} def -/Ta -{ - pop -} def -/Tf -{ - dup 1000 div /_fScl exch ddef -% - selectfont -} def -/Tl -{ - pop - 0 exch _leading astore pop -} def -/Tt -{ - pop -} def -/TW -{ - 3 npop -} def -/Tw -{ - /_cx exch ddef -} def -/TC -{ - 3 npop -} def -/Tc -{ - /_ax exch ddef -} def -/Ts -{ - /_rise exch ddef - currentpoint - iTm - moveto -} def -/Ti -{ - 3 npop -} def -/Tz -{ - 100 div /_hs exch ddef - iTm -} def -/TA -{ - pop -} def -/Tq -{ - pop -} def -/Th -{ - pop pop pop pop pop -} def -/TX -{ - pop -} def -/Tk -{ - exch pop _fScl mul neg 0 rmoveto -} def -/TK -{ - 2 npop -} def -/T* -{ - _leading aload pop neg Td -} def -/T*- -{ - _leading aload pop Td -} def -/T- -{ - _ax neg 0 rmoveto - _hyphen Tx -} def -/T+ -{ -} def -/TR -{ - _ctm currentmatrix pop - _tm astore pop - iTm 0 0 moveto -} def -/TS -{ - currentfont 3 1 roll - /_Symbol_ _fScl 1000 mul selectfont - - 0 eq - { - Tx - } - { - Tj - } ifelse - setfont -} def -/Xb -{ - pop pop -} def -/Tb /Xb load def -/Xe -{ - pop pop pop pop -} def -/Te /Xe load def -/XB -{ -} def -/TB /XB load def -currentdict readonly pop -end -setpacking -%%EndResource -%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 -userdict /Adobe_ColorImage_AI6 known not -{ - userdict /Adobe_ColorImage_AI6 17 dict put -} if -userdict /Adobe_ColorImage_AI6 get begin - - /initialize - { - Adobe_ColorImage_AI6 begin - Adobe_ColorImage_AI6 - { - dup type /arraytype eq - { - dup xcheck - { - bind - } if - } if - pop pop - } forall - } def - /terminate { end } def - - currentdict /Adobe_ColorImage_AI6_Vars known not - { - /Adobe_ColorImage_AI6_Vars 14 dict def - } if - - Adobe_ColorImage_AI6_Vars begin - /channelcount 0 def - /sourcecount 0 def - /sourcearray 4 array def - /plateindex -1 def - /XIMask 0 def - /XIBinary 0 def - /XIChannelCount 0 def - /XIBitsPerPixel 0 def - /XIImageHeight 0 def - /XIImageWidth 0 def - /XIImageMatrix null def - /XIBuffer null def - /XIDataProc null def - end - - /WalkRGBString null def - /WalkCMYKString null def - - /StuffRGBIntoGrayString null def - /RGBToGrayImageProc null def - /StuffCMYKIntoGrayString null def - /CMYKToGrayImageProc null def - /ColorImageCompositeEmulator null def - - /SeparateCMYKImageProc null def - - /FourEqual null def - /TestPlateIndex null def - - currentdict /_colorimage known not - { - /colorimage where - { - /colorimage get /_colorimage exch def - } - { - /_colorimage null def - } ifelse - } if - - /_currenttransfer systemdict /currenttransfer get def - - /colorimage null def - /XI null def - - - /WalkRGBString - { - 0 3 index - - dup length 1 sub 0 3 3 -1 roll - { - 3 getinterval { } forall - - 5 index exec - - 3 index - } for - - 5 { pop } repeat - - } def - - - /WalkCMYKString - { - 0 3 index - - dup length 1 sub 0 4 3 -1 roll - { - 4 getinterval { } forall - - 6 index exec - - 3 index - - } for - - 5 { pop } repeat - - } def - - - /StuffRGBIntoGrayString - { - .11 mul exch - - .59 mul add exch - - .3 mul add - - cvi 3 copy put - - pop 1 add - } def - - - /RGBToGrayImageProc - { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 get exec - dup length 3 idiv string - dup 3 1 roll - - /StuffRGBIntoGrayString load exch - WalkRGBString - end - } def - - - /StuffCMYKIntoGrayString - { - exch .11 mul add - - exch .59 mul add - - exch .3 mul add - - dup 255 gt { pop 255 } if - - 255 exch sub cvi 3 copy put - - pop 1 add - } def - - - /CMYKToGrayImageProc - { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 get exec - dup length 4 idiv string - dup 3 1 roll - - /StuffCMYKIntoGrayString load exch - WalkCMYKString - end - } def - - - /ColorImageCompositeEmulator - { - pop true eq - { - Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat - } - { - Adobe_ColorImage_AI6_Vars /channelcount get 1 ne - { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 3 -1 roll put - - channelcount 3 eq - { - /RGBToGrayImageProc - } - { - /CMYKToGrayImageProc - } ifelse - load - end - } if - image - } ifelse - } def - - - /SeparateCMYKImageProc - { - Adobe_ColorImage_AI6_Vars begin - - sourcecount 0 ne - { - sourcearray plateindex get exec - } - { - sourcearray 0 get exec - - dup length 4 idiv string - - 0 2 index - - plateindex 4 2 index length 1 sub - { - get 255 exch sub - - 3 copy put pop 1 add - - 2 index - } for - - pop pop exch pop - } ifelse - end - } def - - - /FourEqual - { - 4 index ne - { - pop pop pop false - } - { - 4 index ne - { - pop pop false - } - { - 4 index ne - { - pop false - } - { - 4 index eq - } ifelse - } ifelse - } ifelse - } def - - - /TestPlateIndex - { - Adobe_ColorImage_AI6_Vars begin - /plateindex -1 def - - /setcmykcolor where - { - pop - gsave - 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub - grestore - - 1 0 0 0 FourEqual - { - /plateindex 0 def - } - { - 0 1 0 0 FourEqual - { - /plateindex 1 def - } - { - 0 0 1 0 FourEqual - { - /plateindex 2 def - } - { - 0 0 0 1 FourEqual - { - /plateindex 3 def - } - { - 0 0 0 0 FourEqual - { - /plateindex 5 def - } if - } ifelse - } ifelse - } ifelse - } ifelse - pop pop pop pop - } if - plateindex - end - } def - - - /colorimage - { - Adobe_ColorImage_AI6_Vars begin - /channelcount 1 index def - /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def - - 4 sourcecount add index dup - 8 eq exch 1 eq or not - end - - { - /_colorimage load null ne - { - _colorimage - } - { - Adobe_ColorImage_AI6_Vars /sourcecount get - 7 add { pop } repeat - } ifelse - } - { - dup 3 eq - TestPlateIndex - dup -1 eq exch 5 eq or or - { - /_colorimage load null eq - { - ColorImageCompositeEmulator - } - { - dup 1 eq - { - pop pop image - } - { - Adobe_ColorImage_AI6_Vars /plateindex get 5 eq - { - gsave - - 0 _currenttransfer exec - 1 _currenttransfer exec - eq - { 0 _currenttransfer exec 0.5 lt } - { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse - - { { pop 0 } } { { pop 1 } } ifelse - systemdict /settransfer get exec - } if - - _colorimage - - Adobe_ColorImage_AI6_Vars /plateindex get 5 eq - { - grestore - } if - } ifelse - } ifelse - } - { - dup 1 eq - { - pop pop - image - } - { - pop pop - - Adobe_ColorImage_AI6_Vars begin - sourcecount -1 0 - { - exch sourcearray 3 1 roll put - } for - - /SeparateCMYKImageProc load - end - - systemdict /image get exec - } ifelse - } ifelse - } ifelse - } def - - /XI - { - Adobe_ColorImage_AI6_Vars begin - gsave - /XIMask exch 0 ne def - /XIBinary exch 0 ne def - pop - pop - /XIChannelCount exch def - /XIBitsPerPixel exch def - /XIImageHeight exch def - /XIImageWidth exch def - pop pop pop pop - /XIImageMatrix exch def - - XIBitsPerPixel 1 eq - { - XIImageWidth 8 div ceiling cvi - } - { - XIImageWidth XIChannelCount mul - } ifelse - /XIBuffer exch string def - - XIBinary - { - /XIDataProc { currentfile XIBuffer readstring pop } def - currentfile 128 string readline pop pop - } - { - /XIDataProc { currentfile XIBuffer readhexstring pop } def - } ifelse - - 0 0 moveto - XIImageMatrix concat - XIImageWidth XIImageHeight scale - - XIMask - { - XIImageWidth XIImageHeight - false - [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] - /XIDataProc load - - /_lp /null ddef - _fc - /_lp /imagemask ddef - - imagemask - } - { - XIImageWidth XIImageHeight - XIBitsPerPixel - [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] - /XIDataProc load - - XIChannelCount 1 eq - { - - gsave - 0 setgray - - image - - grestore - } - { - false - XIChannelCount - colorimage - } ifelse - } ifelse - grestore - end - } def - -end -%%EndProcSet -%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 -%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) -%%Version: 1.1 -%%CreationDate: (3/7/1994) () -%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) -currentpacking true setpacking -userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin -put -/_eo false def -/_lp /none def -/_pf -{ -} def -/_ps -{ -} def -/_psf -{ -} def -/_pss -{ -} def -/_pjsf -{ -} def -/_pjss -{ -} def -/_pola 0 def -/_doClip 0 def -/cf currentflat def -/_tm matrix def -/_renderStart -[ -/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 -] def -/_renderEnd -[ -null null null null /i1 /i1 /i1 /i1 -] def -/_render -1 def -/_rise 0 def -/_ax 0 def -/_ay 0 def -/_cx 0 def -/_cy 0 def -/_leading -[ -0 0 -] def -/_ctm matrix def -/_mtx matrix def -/_sp 16#020 def -/_hyphen (-) def -/_fScl 0 def -/_cnt 0 def -/_hs 1 def -/_nativeEncoding 0 def -/_useNativeEncoding 0 def -/_tempEncode 0 def -/_pntr 0 def -/_tDict 2 dict def -/_wv 0 def -/Tx -{ -} def -/Tj -{ -} def -/CRender -{ -} def -/_AI3_savepage -{ -} def -/_gf null def -/_cf 4 array def -/_if null def -/_of false def -/_fc -{ -} def -/_gs null def -/_cs 4 array def -/_is null def -/_os false def -/_sc -{ -} def -/_pd 1 dict def -/_ed 15 dict def -/_pm matrix def -/_fm null def -/_fd null def -/_fdd null def -/_sm null def -/_sd null def -/_sdd null def -/_i null def -/discardSave null def -/buffer 256 string def -/beginString null def -/endString null def -/endStringLength null def -/layerCnt 1 def -/layerCount 1 def -/perCent (%) 0 get def -/perCentSeen? false def -/newBuff null def -/newBuffButFirst null def -/newBuffLast null def -/clipForward? false def -end -userdict /Adobe_Illustrator_AI5 known not { - userdict /Adobe_Illustrator_AI5 91 dict put -} if -userdict /Adobe_Illustrator_AI5 get begin -/initialize -{ - Adobe_Illustrator_AI5 dup begin - Adobe_Illustrator_AI5_vars begin - discardDict - { - bind pop pop - } forall - dup /nc get begin - { - dup xcheck 1 index type /operatortype ne and - { - bind - } if - pop pop - } forall - end - newpath -} def -/terminate -{ - end - end -} def -/_ -null def -/ddef -{ - Adobe_Illustrator_AI5_vars 3 1 roll put -} def -/xput -{ - dup load dup length exch maxlength eq - { - dup dup load dup - length 2 mul dict copy def - } if - load begin - def - end -} def -/npop -{ - { - pop - } repeat -} def -/sw -{ - dup length exch stringwidth - exch 5 -1 roll 3 index mul add - 4 1 roll 3 1 roll mul add -} def -/swj -{ - dup 4 1 roll - dup length exch stringwidth - exch 5 -1 roll 3 index mul add - 4 1 roll 3 1 roll mul add - 6 2 roll /_cnt 0 ddef - { - 1 index eq - { - /_cnt _cnt 1 add ddef - } if - } forall - pop - exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop -} def -/ss -{ - 4 1 roll - { - 2 npop - (0) exch 2 copy 0 exch put pop - gsave - false charpath currentpoint - 4 index setmatrix - stroke - grestore - moveto - 2 copy rmoveto - } exch cshow - 3 npop -} def -/jss -{ - 4 1 roll - { - 2 npop - (0) exch 2 copy 0 exch put - gsave - _sp eq - { - exch 6 index 6 index 6 index 5 -1 roll widthshow - currentpoint - } - { - false charpath currentpoint - 4 index setmatrix stroke - } ifelse - grestore - moveto - 2 copy rmoveto - } exch cshow - 6 npop -} def -/sp -{ - { - 2 npop (0) exch - 2 copy 0 exch put pop - false charpath - 2 copy rmoveto - } exch cshow - 2 npop -} def -/jsp -{ - { - 2 npop - (0) exch 2 copy 0 exch put - _sp eq - { - exch 5 index 5 index 5 index 5 -1 roll widthshow - } - { - false charpath - } ifelse - 2 copy rmoveto - } exch cshow - 5 npop -} def -/pl -{ - transform - 0.25 sub round 0.25 add exch - 0.25 sub round 0.25 add exch - itransform -} def -/setstrokeadjust where -{ - pop true setstrokeadjust - /c - { - curveto - } def - /C - /c load def - /v - { - currentpoint 6 2 roll curveto - } def - /V - /v load def - /y - { - 2 copy curveto - } def - /Y - /y load def - /l - { - lineto - } def - /L - /l load def - /m - { - moveto - } def -} -{ - /c - { - pl curveto - } def - /C - /c load def - /v - { - currentpoint 6 2 roll pl curveto - } def - /V - /v load def - /y - { - pl 2 copy curveto - } def - /Y - /y load def - /l - { - pl lineto - } def - /L - /l load def - /m - { - pl moveto - } def -} ifelse -/d -{ - setdash -} def -/cf -{ -} def -/i -{ - dup 0 eq - { - pop cf - } if - setflat -} def -/j -{ - setlinejoin -} def -/J -{ - setlinecap -} def -/M -{ - setmiterlimit -} def -/w -{ - setlinewidth -} def -/XR -{ - 0 ne - /_eo exch ddef -} def -/H -{ -} def -/h -{ - closepath -} def -/N -{ - _pola 0 eq - { - _doClip 1 eq - { - _eo {eoclip} {clip} ifelse /_doClip 0 ddef - } if - newpath - } - { - /CRender - { - N - } ddef - } ifelse -} def -/n -{ - N -} def -/F -{ - _pola 0 eq - { - _doClip 1 eq - { - gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc - /_doClip 0 ddef - } - { - _pf - } ifelse - } - { - /CRender - { - F - } ddef - } ifelse -} def -/f -{ - closepath - F -} def -/S -{ - _pola 0 eq - { - _doClip 1 eq - { - gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc - /_doClip 0 ddef - } - { - _ps - } ifelse - } - { - /CRender - { - S - } ddef - } ifelse -} def -/s -{ - closepath - S -} def -/B -{ - _pola 0 eq - { - _doClip 1 eq - gsave F grestore - { - gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc - /_doClip 0 ddef - } - { - S - } ifelse - } - { - /CRender - { - B - } ddef - } ifelse -} def -/b -{ - closepath - B -} def -/W -{ - /_doClip 1 ddef -} def -/* -{ - count 0 ne - { - dup type /stringtype eq - { - pop - } if - } if - newpath -} def -/u -{ -} def -/U -{ -} def -/q -{ - _pola 0 eq - { - gsave - } if -} def -/Q -{ - _pola 0 eq - { - grestore - } if -} def -/*u -{ - _pola 1 add /_pola exch ddef -} def -/*U -{ - _pola 1 sub /_pola exch ddef - _pola 0 eq - { - CRender - } if -} def -/D -{ - pop -} def -/*w -{ -} def -/*W -{ -} def -/` -{ - /_i save ddef - clipForward? - { - nulldevice - } if - 6 1 roll 4 npop - concat pop - userdict begin - /showpage - { - } def - 0 setgray - 0 setlinecap - 1 setlinewidth - 0 setlinejoin - 10 setmiterlimit - [] 0 setdash - /setstrokeadjust where {pop false setstrokeadjust} if - newpath - 0 setgray - false setoverprint -} def -/~ -{ - end - _i restore -} def -/O -{ - 0 ne - /_of exch ddef - /_lp /none ddef -} def -/R -{ - 0 ne - /_os exch ddef - /_lp /none ddef -} def -/g -{ - /_gf exch ddef - /_fc - { - _lp /fill ne - { - _of setoverprint - _gf setgray - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - ashow - } ddef - /_pjsf - { - _fc - awidthshow - } ddef - /_lp /none ddef -} def -/G -{ - /_gs exch ddef - /_sc - { - _lp /stroke ne - { - _os setoverprint - _gs setgray - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/k -{ - _cf astore pop - /_fc - { - _lp /fill ne - { - _of setoverprint - _cf aload pop setcmykcolor - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - ashow - } ddef - /_pjsf - { - _fc - awidthshow - } ddef - /_lp /none ddef -} def -/K -{ - _cs astore pop - /_sc - { - _lp /stroke ne - { - _os setoverprint - _cs aload pop setcmykcolor - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/x -{ - /_gf exch ddef - findcmykcustomcolor - /_if exch ddef - /_fc - { - _lp /fill ne - { - _of setoverprint - _if _gf 1 exch sub setcustomcolor - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - ashow - } ddef - /_pjsf - { - _fc - awidthshow - } ddef - /_lp /none ddef -} def -/X -{ - /_gs exch ddef - findcmykcustomcolor - /_is exch ddef - /_sc - { - _lp /stroke ne - { - _os setoverprint - _is _gs 1 exch sub setcustomcolor - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/A -{ - pop -} def -/annotatepage -{ -userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse -} def -/XT { - pop pop -} def -/discard -{ - save /discardSave exch store - discardDict begin - /endString exch store - gt38? - { - 2 add - } if - load - stopped - pop - end - discardSave restore -} bind def -userdict /discardDict 7 dict dup begin -put -/pre38Initialize -{ - /endStringLength endString length store - /newBuff buffer 0 endStringLength getinterval store - /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store - /newBuffLast newBuff endStringLength 1 sub 1 getinterval store -} def -/shiftBuffer -{ - newBuff 0 newBuffButFirst putinterval - newBuffLast 0 - currentfile read not - { - stop - } if - put -} def -0 -{ - pre38Initialize - mark - currentfile newBuff readstring exch pop - { - { - newBuff endString eq - { - cleartomark stop - } if - shiftBuffer - } loop - } - { - stop - } ifelse -} def -1 -{ - pre38Initialize - /beginString exch store - mark - currentfile newBuff readstring exch pop - { - { - newBuff beginString eq - { - /layerCount dup load 1 add store - } - { - newBuff endString eq - { - /layerCount dup load 1 sub store - layerCount 0 eq - { - cleartomark stop - } if - } if - } ifelse - shiftBuffer - } loop - } if -} def -2 -{ - mark - { - currentfile buffer readline not - { - stop - } if - endString eq - { - cleartomark stop - } if - } loop -} def -3 -{ - /beginString exch store - /layerCnt 1 store - mark - { - currentfile buffer readline not - { - stop - } if - dup beginString eq - { - pop /layerCnt dup load 1 add store - } - { - endString eq - { - layerCnt 1 eq - { - cleartomark stop - } - { - /layerCnt dup load 1 sub store - } ifelse - } if - } ifelse - } loop -} def -end -userdict /clipRenderOff 15 dict dup begin -put -{ - /n /N /s /S /f /F /b /B -} -{ - { - _doClip 1 eq - { - /_doClip 0 ddef _eo {eoclip} {clip} ifelse - } if - newpath - } def -} forall -/Tr /pop load def -/Bb {} def -/BB /pop load def -/Bg {12 npop} def -/Bm {6 npop} def -/Bc /Bm load def -/Bh {4 npop} def -end -/Lb -{ - 4 npop - 6 1 roll - pop - 4 1 roll - pop pop pop - 0 eq - { - 0 eq - { - (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard - } - { - - /clipForward? true def - - /Tx /pop load def - /Tj /pop load def - - currentdict end clipRenderOff begin begin - } ifelse - } - { - 0 eq - { - save /discardSave exch store - } if - } ifelse -} bind def -/LB -{ - discardSave dup null ne - { - restore - } - { - pop - clipForward? - { - currentdict - end - end - begin - - /clipForward? false ddef - } if - } ifelse -} bind def -/Pb -{ - pop pop - 0 (%AI5_EndPalette) discard -} bind def -/Np -{ - 0 (%AI5_End_NonPrinting--) discard -} bind def -/Ln /pop load def -/Ap -/pop load def -/Ar -{ - 72 exch div - 0 dtransform dup mul exch dup mul add sqrt - dup 1 lt - { - pop 1 - } if - setflat -} def -/Mb -{ - q -} def -/Md -{ -} def -/MB -{ - Q -} def -/nc 3 dict def -nc begin -/setgray -{ - pop -} bind def -/setcmykcolor -{ - 4 npop -} bind def -/setcustomcolor -{ - 2 npop -} bind def -currentdict readonly pop -end -end -setpacking -%%EndResource -%%EndProlog -%%BeginSetup -%%IncludeFont: Univers -Adobe_level2_AI5 /initialize get exec -Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec -Adobe_ColorImage_AI6 /initialize get exec -Adobe_Illustrator_AI5 /initialize get exec -[ -39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis -/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute -/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde -/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex -/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls -/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash -/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef -/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash -/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef -/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe -/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide -/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright -/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand -/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex -/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex -/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla -/hungarumlaut/ogonek/caron -TE -%AI3_BeginEncoding: _Univers Univers -[/_Univers/Univers 0 0 1 TZ -%AI3_EndEncoding AdobeType -%AI5_Begin_NonPrinting -Np -8 Bn -%AI5_BeginGradient: (Black & White) -(Black & White) 0 2 Bd -[ -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 %_Br -[ -0 0 50 100 %_Bs -1 0 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Green & Blue) -(Green & Blue) 0 2 Bd -[ -< -99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 -A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 -B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 -C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 -D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 -E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 -F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF -> -< -000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D -1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B -3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 -5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 -78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 -96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 -B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF -> -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 -1 %_Br -[ -1 0.75 0 0 1 50 100 %_Bs -0.6 0 1 0 1 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Pink, Yellow, Green) -(Pink, Yellow, Green) 0 3 Bd -[ -< -00000000000000000000000000000000000000010101010101010101010101010101010101010101 -01010101010202020202020202020202020202020202020202020203030303030303030303030303 -03030303030303030404040404040404040404040404040404040404050505050505050505050505 -05050505050505060606060606060606060606060606060606060707070707070707070707070707 -07070707080808080808080808080808080808080809090909090909090909090909090909090A0A -0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C -0C0C0C0C0C0C0C0D0D0D0D0D -> -< -050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 -17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F -2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A -4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 -69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 -88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 -A9AAABACADADAEAFB0B1B2B2 -> -< -CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 -B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B -9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B -7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 -5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 -3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C -0B0A09080706050403020100 -> -0 -1 %_Br -< -737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E -4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D -2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 -1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 -020201010101010000000000 -> -< -00000000000000000000000001010101010101010101010101010101010101010101010102020202 -02020202020202020202020202020202020202020202030303030303030303030303030303030303 -03030303030303030303030303040404040404040404040404040404040404040404040404040404 -04040404040404040404050505050505050505050505050505050505050505050505050505050505 -050505050505050505050505 -> -< -BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 -C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 -C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA -CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC -CCCCCCCCCCCCCCCCCCCCCCCC -> -0 -1 %_Br -[ -0.05 0.7 0 0 1 50 100 %_Bs -0 0.02 0.8 0 1 57 36 %_Bs -0.45 0 0.75 0 1 37 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Purple, Red & Yellow) -(Purple, Red & Yellow) 0 3 Bd -[ -0 -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A -> -< -CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 -D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC -DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 -E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED -EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 -F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE -FEFEFEFFFFFF -> -0 -1 %_Br -< -E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE -BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 -9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E -6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 -4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E -1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 -> -< -E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA -EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE -EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 -F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 -F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC -FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF -> -< -00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 -242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 -4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A -6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E -8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 -B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC -> -0 -1 %_Br -[ -0 0.04 1 0 1 50 100 %_Bs -0 1 0.8 0 1 50 50 %_Bs -0.9 0.9 0 0 1 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Rainbow) -(Rainbow) 0 6 Bd -[ -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -1 -0 -0 -1 %_Br -1 -< -0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E -2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 -5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E -7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 -A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE -CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 -F7F8F9FAFBFCFDFEFF -> -0 -0 -1 %_Br -1 -< -00000000000000000000000000000000000001010101010101010101010101010101010101010101 -01010101010101010101010101010202020202020202020202020202020202020202020202020202 -02020202020202020202030303030303030303030303030303030303030303030303030303030303 -03030303030304040404040404040404040404040404040404040404040404040404040404040404 -04040505050505050505050505050505050505050505050505050505050505050505050505050606 -06060606060606060606060606060606060606060606060606060606060606060606070707070707 -07070707070707070707070707070707 -> -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 -1 %_Br -< -000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -> -0 -1 -0 -1 %_Br -0 -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -1 -0 -1 %_Br -[ -0 1 0 0 1 50 100 %_Bs -1 1 0 0 1 50 80 %_Bs -1 0.0279 0 0 1 50 60 %_Bs -1 0 1 0 1 50 40 %_Bs -0 0 1 0 1 50 20 %_Bs -0 1 1 0 1 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Steel Bar) -(Steel Bar) 0 3 Bd -[ -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 %_Br -< -000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -> -0 %_Br -[ -0 0 50 100 %_Bs -1 0 50 70 %_Bs -0 0 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Yellow & Orange Radial) -(Yellow & Orange Radial) 1 2 Bd -[ -0 -< -0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 -232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 -494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F -707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C -> -< -FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 -F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 -F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB -EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 -> -0 -1 %_Br -[ -0 0 1 0 1 52 19 %_Bs -0 0.55 0.9 0 1 50 100 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Yellow & Purple Radial) -(Yellow & Purple Radial) 1 2 Bd -[ -< -000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -> -< -1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 -393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D -5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 -83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 -A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB -CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 -F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF -> -< -ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 -908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 -7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B -5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 -403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 -25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B -0A090908070706050504030302010100 -> -0 -1 %_Br -[ -0 0.08 0.67 0 1 50 14 %_Bs -1 1 0 0 1 50 100 %_Bs -BD -%AI5_EndGradient -%AI5_End_NonPrinting-- -%AI5_BeginPalette -0 0 Pb -Pn -Pc -1 g -Pc -0 g -Pc -0 0 0 0 k -Pc -0.75 g -Pc -0.5 g -Pc -0.25 g -Pc -0 g -Pc -Bb -2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.25 0 0 0 k -Pc -0.5 0 0 0 k -Pc -0.75 0 0 0 k -Pc -1 0 0 0 k -Pc -0.25 0.25 0 0 k -Pc -0.5 0.5 0 0 k -Pc -0.75 0.75 0 0 k -Pc -1 1 0 0 k -Pc -Bb -2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0 0.25 0 0 k -Pc -0 0.5 0 0 k -Pc -0 0.75 0 0 k -Pc -0 1 0 0 k -Pc -0 0.25 0.25 0 k -Pc -0 0.5 0.5 0 k -Pc -0 0.75 0.75 0 k -Pc -0 1 1 0 k -Pc -Bb -0 0 0 0 Bh -2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0 0 0.25 0 k -Pc -0 0 0.5 0 k -Pc -0 0 0.75 0 k -Pc -0 0 1 0 k -Pc -0.25 0 0.25 0 k -Pc -0.5 0 0.5 0 k -Pc -0.75 0 0.75 0 k -Pc -1 0 1 0 k -Pc -Bb -2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.25 0.125 0 0 k -Pc -0.5 0.25 0 0 k -Pc -0.75 0.375 0 0 k -Pc -1 0.5 0 0 k -Pc -0.125 0.25 0 0 k -Pc -0.25 0.5 0 0 k -Pc -0.375 0.75 0 0 k -Pc -0.5 1 0 0 k -Pc -Bb -2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0 0.25 0.125 0 k -Pc -0 0.5 0.25 0 k -Pc -0 0.75 0.375 0 k -Pc -0 1 0.5 0 k -Pc -0 0.125 0.25 0 k -Pc -0 0.25 0.5 0 k -Pc -0 0.375 0.75 0 k -Pc -0 0.5 1 0 k -Pc -Bb -2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.125 0 0.25 0 k -Pc -0.25 0 0.5 0 k -Pc -0.375 0 0.75 0 k -Pc -0.5 0 1 0 k -Pc -0.25 0 0.125 0 k -Pc -0.5 0 0.25 0 k -Pc -0.75 0 0.375 0 k -Pc -1 0 0.5 0 k -Pc -Bb -2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.25 0.125 0.125 0 k -Pc -0.5 0.25 0.25 0 k -Pc -0.75 0.375 0.375 0 k -Pc -1 0.5 0.5 0 k -Pc -0.25 0.25 0.125 0 k -Pc -0.5 0.5 0.25 0 k -Pc -0.75 0.75 0.375 0 k -Pc -1 1 0.5 0 k -Pc -Bb -0 0 0 0 Bh -2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.125 0.25 0.125 0 k -Pc -0.25 0.5 0.25 0 k -Pc -0.375 0.75 0.375 0 k -Pc -0.5 1 0.5 0 k -Pc -0.125 0.25 0.25 0 k -Pc -0.25 0.5 0.5 0 k -Pc -0.375 0.75 0.75 0 k -Pc -0.5 1 1 0 k -Pc -0 0 0 0 k -Pc -0.125 0.125 0.25 0 k -Pc -0.25 0.25 0.5 0 k -Pc -0.375 0.375 0.75 0 k -Pc -0.5 0.5 1 0 k -Pc -0.25 0.125 0.25 0 k -Pc -0.5 0.25 0.5 0 k -Pc -0.75 0.375 0.75 0 k -Pc -1 0.5 1 0 k -Pc -PB -%AI5_EndPalette -%%EndSetup -%AI5_BeginLayer -1 1 1 1 0 0 0 79 128 255 Lb -(Layer 1) Ln -0 A -800 Ar -0 J 0 j 1 w 4 M []0 d -%AI3_Note: -0 D -0 XR --4014 283.5 m -4626 283.5 L -(N) * -453.5 4716 m -453.5 -3924 L -(N) * -85 4716 m -85 -3924 L -(N) * --4014 765.5 m -4626 765.5 L -(N) * -0 O -1 g -0 R -0 G -186.2136 638 m -278.1654 638 l -B -3 w -329.9252 666 m -329.9252 609.5 l -B -0 To -1 0 0 1 336.4252 652.5 0 Tp -TP -0 Tr -0 g -1 w -/_Univers 10 Tf -0 Ts -100 Tz -0 Tt -1 TA -%_ 0 XL -36 0 Xb -XB -0 0 5 TC -100 100 200 TW -0 0 0 Ti -0 Ta -0 0 2 2 3 Th -0 Tq -0 0 Tl -0 Tc -0 Tw -(Underlying\r) Tx -0 -12 Td -(Graphics\r) Tx -0 -12 Td -(System\r) Tx -0 -12 Td -(backend) Tx -(\r) TX -TO -0 To -1 0 0 1 224.9252 640.5 0 Tp -TP -0 Tr -(link) Tx -(\r) TX -TO -0 To -1 0 0 1 300.9252 634 0 Tp -TP --7.2241 0 Td -0 Tr -1 Ta -(GS) Tx -(\r) TX -TO -0 To -1 0 0 1 164.4252 606 0 Tp -TP --46.6589 0 Td -0 Tr -(Application Process) Tx -(\r) TX -TO -0 R -0 G -2 J [5 7 ]0 d -168.4252 660.0625 m -173.7289 670.9058 189.4252 678.5625 v -209.9252 688.5625 228.9252 691.5625 248.4252 695.0625 c -277.9615 700.3639 350.9252 709.0625 y -S -1 Ap -0 O -0.75 g -[]0 d -363.5118 702.4134 m -363.5118 716.5866 L -349.3386 716.5866 L -349.3386 702.4134 L -363.5118 702.4134 L -b -0 To -1 0 0 1 356.4252 720 0 Tp -TP --34.7095 0 Td -0 Tr -0 g -0 J -(window object) Tx -(\r) TX -TO -0 To -1 0 0 1 239.9252 704 0 Tp -TP --44.4373 0 Td -0 Tr -(owner relationship) Tx -(\r) TX -TO -0 To -1 0 0 1 301.9252 604.6667 0 Tp -TP --20.2759 0 Td -0 Tr -(graphics\r) Tx -5.5481 -12 Td -(server) Tx -(\r) TX -TO -u -0 Ap -0 R -0 G -278.1654 638 m -278.1654 644.2129 280.5848 650.0538 284.9781 654.447 c -289.3713 658.8403 295.2123 661.2599 301.4252 661.2599 c -307.638 661.2599 313.4791 658.8403 317.8723 654.447 c -322.2656 650.0538 324.685 644.2129 324.685 638 c -324.685 625.1744 314.2507 614.7402 301.4252 614.7402 c -295.2123 614.7402 289.3713 617.1596 284.9781 621.5529 c -280.5848 625.9461 278.1654 631.7872 278.1654 638 c -s -1 Ap -301.4252 616.7402 m -313.1665 616.7402 322.685 626.2586 322.685 638 c -322.685 649.7413 313.1665 659.2599 301.4252 659.2599 c -289.6839 659.2599 280.1654 649.7413 280.1654 638 c -280.1654 626.2586 289.6839 616.7402 301.4252 616.7402 c -s -U -164.9538 616.7116 m -176.6951 616.7116 186.2136 626.2301 186.2136 637.9714 c -186.2136 649.7127 176.6951 659.2312 164.9538 659.2312 c -153.2125 659.2312 143.694 649.7127 143.694 637.9714 c -143.694 626.2301 153.2125 616.7116 164.9538 616.7116 c -s -LB -%AI5_EndLayer-- -%%PageTrailer -gsave annotatepage grestore showpage -%%Trailer -Adobe_Illustrator_AI5 /terminate get exec -Adobe_ColorImage_AI6 /terminate get exec -Adobe_typography_AI5 /terminate get exec -Adobe_level2_AI5 /terminate get exec -%%EOF Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-3.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-3.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-3.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-3.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-3.ps 1997-05-24 22:29:02.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-3.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,2830 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: Adobe Illustrator(r) 6.0 -%%For: (Anna Fedoriw) (Ericsson Telecom) -%%Title: (All_events.eps) -%%CreationDate: (97-05-23) (14.00) -%%BoundingBox: 122 566 396 709 -%%HiResBoundingBox: 122.3411 566.1667 395.7095 708.3677 -%%DocumentProcessColors: Black -%%DocumentFonts: Geneva -%%+ Univers -%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 -%%+ procset Adobe_typography_AI5 1.0 0 -%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 -%%+ procset Adobe_Illustrator_AI5 1.0 0 -%AI5_FileFormat 2.0 -%AI3_ColorUsage: Black&White -%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) -%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 -%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () -%AI3_TemplateBox: 306 396 306 396 -%AI3_TileBox: 21 -12 588 802 -%AI3_DocumentPreview: Macintosh_ColorPic -%AI5_ArtSize: 595.2756 841.8898 -%AI5_RulerUnits: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI5_OpenToView: -126 900 1 1058 826 58 1 1 2 40 -%AI5_OpenViewLayers: 7 -%%EndComments -%%BeginProlog -%%BeginResource: procset Adobe_level2_AI5 1.2 0 -%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) -%%Version: 1.2 -%%CreationDate: (04/10/93) () -%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) -userdict /Adobe_level2_AI5 23 dict dup begin - put - /packedarray where not - { - userdict begin - /packedarray - { - array astore readonly - } bind def - /setpacking /pop load def - /currentpacking false def - end - 0 - } if - pop - userdict /defaultpacking currentpacking put true setpacking - /initialize - { - Adobe_level2_AI5 begin - } bind def - /terminate - { - currentdict Adobe_level2_AI5 eq - { - end - } if - } bind def - mark - /setcustomcolor where not - { - /findcmykcustomcolor - { - 5 packedarray - } bind def - /setcustomcolor - { - exch aload pop pop - 4 - { - 4 index mul 4 1 roll - } repeat - 5 -1 roll pop - setcmykcolor - } - def - } if - - /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def - userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put - userdict /level2? - systemdict /languagelevel known dup - { - pop systemdict /languagelevel get 2 ge - } if - put -/level2ScreenFreq -{ - begin - 60 - HalftoneType 1 eq - { - pop Frequency - } if - HalftoneType 2 eq - { - pop GrayFrequency - } if - HalftoneType 5 eq - { - pop Default level2ScreenFreq - } if - end -} bind def -userdict /currentScreenFreq - level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put -level2? not - { - /setcmykcolor where not - { - /setcmykcolor - { - exch .11 mul add exch .59 mul add exch .3 mul add - 1 exch sub setgray - } def - } if - /currentcmykcolor where not - { - /currentcmykcolor - { - 0 0 0 1 currentgray sub - } def - } if - /setoverprint where not - { - /setoverprint /pop load def - } if - /selectfont where not - { - /selectfont - { - exch findfont exch - dup type /arraytype eq - { - makefont - } - { - scalefont - } ifelse - setfont - } bind def - } if - /cshow where not - { - /cshow - { - [ - 0 0 5 -1 roll aload pop - ] cvx bind forall - } bind def - } if - } if - cleartomark - /anyColor? - { - add add add 0 ne - } bind def - /testColor - { - gsave - setcmykcolor currentcmykcolor - grestore - } bind def - /testCMYKColorThrough - { - testColor anyColor? - } bind def - userdict /composite? - level2? - { - gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore - add add add 4 eq - } - { - 1 0 0 0 testCMYKColorThrough - 0 1 0 0 testCMYKColorThrough - 0 0 1 0 testCMYKColorThrough - 0 0 0 1 testCMYKColorThrough - and and and - } ifelse - put - composite? not - { - userdict begin - gsave - /cyan? 1 0 0 0 testCMYKColorThrough def - /magenta? 0 1 0 0 testCMYKColorThrough def - /yellow? 0 0 1 0 testCMYKColorThrough def - /black? 0 0 0 1 testCMYKColorThrough def - grestore - /isCMYKSep? cyan? magenta? yellow? black? or or or def - /customColor? isCMYKSep? not def - end - } if - end defaultpacking setpacking -%%EndResource -%%BeginResource: procset Adobe_typography_AI5 1.0 1 -%%Title: (Typography Operators) -%%Version: 1.0 -%%CreationDate:(03/26/93) () -%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) -currentpacking true setpacking -userdict /Adobe_typography_AI5 54 dict dup begin -put -/initialize -{ - begin - begin - Adobe_typography_AI5 begin - Adobe_typography_AI5 - { - dup xcheck - { - bind - } if - pop pop - } forall - end - end - end - Adobe_typography_AI5 begin -} def -/terminate -{ - currentdict Adobe_typography_AI5 eq - { - end - } if -} def -/modifyEncoding -{ - /_tempEncode exch ddef - /_pntr 0 ddef - { - counttomark -1 roll - dup type dup /marktype eq - { - pop pop exit - } - { - /nametype eq - { - _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll - put - } - { - /_pntr exch ddef - } ifelse - } ifelse - } loop - _tempEncode -} def -/TE -{ - StandardEncoding 256 array copy modifyEncoding - /_nativeEncoding exch def -} def -% -/TZ -{ - dup type /arraytype eq - { - /_wv exch def - } - { - /_wv 0 def - } ifelse - /_useNativeEncoding exch def - pop pop - findfont _wv type /arraytype eq - { - _wv makeblendedfont - } if - dup length 2 add dict - begin - mark exch - { - 1 index /FID ne - { - def - } if - cleartomark mark - } forall - pop - /FontName exch def - counttomark 0 eq - { - 1 _useNativeEncoding eq - { - /Encoding _nativeEncoding def - } if - cleartomark - } - { - /Encoding load 256 array copy - modifyEncoding /Encoding exch def - } ifelse - FontName currentdict - end - definefont pop -} def -/tr -{ - _ax _ay 3 2 roll -} def -/trj -{ - _cx _cy _sp _ax _ay 6 5 roll -} def -/a0 -{ - /Tx - { - dup - currentpoint 3 2 roll - tr _psf - newpath moveto - tr _ctm _pss - } ddef - /Tj - { - dup - currentpoint 3 2 roll - trj _pjsf - newpath moveto - trj _ctm _pjss - } ddef -} def -/a1 -{ - /Tx - { - dup currentpoint 4 2 roll gsave - dup currentpoint 3 2 roll - tr _psf - newpath moveto - tr _ctm _pss - grestore 3 1 roll moveto tr sp - } ddef - /Tj - { - dup currentpoint 4 2 roll gsave - dup currentpoint 3 2 roll - trj _pjsf - newpath moveto - trj _ctm _pjss - grestore 3 1 roll moveto tr jsp - } ddef -} def -/e0 -{ - /Tx - { - tr _psf - } ddef - /Tj - { - trj _pjsf - } ddef -} def -/e1 -{ - /Tx - { - dup currentpoint 4 2 roll gsave - tr _psf - grestore 3 1 roll moveto tr sp - } ddef - /Tj - { - dup currentpoint 4 2 roll gsave - trj _pjsf - grestore 3 1 roll moveto tr jsp - } ddef -} def -/i0 -{ - /Tx - { - tr sp - } ddef - /Tj - { - trj jsp - } ddef -} def -/i1 -{ - W N -} def -/o0 -{ - /Tx - { - tr sw rmoveto - } ddef - /Tj - { - trj swj rmoveto - } ddef -} def -/r0 -{ - /Tx - { - tr _ctm _pss - } ddef - /Tj - { - trj _ctm _pjss - } ddef -} def -/r1 -{ - /Tx - { - dup currentpoint 4 2 roll currentpoint gsave newpath moveto - tr _ctm _pss - grestore 3 1 roll moveto tr sp - } ddef - /Tj - { - dup currentpoint 4 2 roll currentpoint gsave newpath moveto - trj _ctm _pjss - grestore 3 1 roll moveto tr jsp - } ddef -} def -/To -{ - pop _ctm currentmatrix pop -} def -/TO -{ - iTe _ctm setmatrix newpath -} def -/Tp -{ - pop _tm astore pop _ctm setmatrix - _tDict begin - /W - { - } def - /h - { - } def -} def -/TP -{ - end - iTm 0 0 moveto -} def -/Tr -{ - _render 3 le - { - currentpoint newpath moveto - } if - dup 8 eq - { - pop 0 - } - { - dup 9 eq - { - pop 1 - } if - } ifelse - dup /_render exch ddef - _renderStart exch get load exec -} def -/iTm -{ - _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale -} def -/Tm -{ - _tm astore pop iTm 0 0 moveto -} def -/Td -{ - _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto -} def -/iTe -{ - _render -1 eq - { - } - { - _renderEnd _render get dup null ne - { - load exec - } - { - pop - } ifelse - } ifelse - /_render -1 ddef -} def -/Ta -{ - pop -} def -/Tf -{ - dup 1000 div /_fScl exch ddef -% - selectfont -} def -/Tl -{ - pop - 0 exch _leading astore pop -} def -/Tt -{ - pop -} def -/TW -{ - 3 npop -} def -/Tw -{ - /_cx exch ddef -} def -/TC -{ - 3 npop -} def -/Tc -{ - /_ax exch ddef -} def -/Ts -{ - /_rise exch ddef - currentpoint - iTm - moveto -} def -/Ti -{ - 3 npop -} def -/Tz -{ - 100 div /_hs exch ddef - iTm -} def -/TA -{ - pop -} def -/Tq -{ - pop -} def -/Th -{ - pop pop pop pop pop -} def -/TX -{ - pop -} def -/Tk -{ - exch pop _fScl mul neg 0 rmoveto -} def -/TK -{ - 2 npop -} def -/T* -{ - _leading aload pop neg Td -} def -/T*- -{ - _leading aload pop Td -} def -/T- -{ - _ax neg 0 rmoveto - _hyphen Tx -} def -/T+ -{ -} def -/TR -{ - _ctm currentmatrix pop - _tm astore pop - iTm 0 0 moveto -} def -/TS -{ - currentfont 3 1 roll - /_Symbol_ _fScl 1000 mul selectfont - - 0 eq - { - Tx - } - { - Tj - } ifelse - setfont -} def -/Xb -{ - pop pop -} def -/Tb /Xb load def -/Xe -{ - pop pop pop pop -} def -/Te /Xe load def -/XB -{ -} def -/TB /XB load def -currentdict readonly pop -end -setpacking -%%EndResource -%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 -userdict /Adobe_ColorImage_AI6 known not -{ - userdict /Adobe_ColorImage_AI6 17 dict put -} if -userdict /Adobe_ColorImage_AI6 get begin - - /initialize - { - Adobe_ColorImage_AI6 begin - Adobe_ColorImage_AI6 - { - dup type /arraytype eq - { - dup xcheck - { - bind - } if - } if - pop pop - } forall - } def - /terminate { end } def - - currentdict /Adobe_ColorImage_AI6_Vars known not - { - /Adobe_ColorImage_AI6_Vars 14 dict def - } if - - Adobe_ColorImage_AI6_Vars begin - /channelcount 0 def - /sourcecount 0 def - /sourcearray 4 array def - /plateindex -1 def - /XIMask 0 def - /XIBinary 0 def - /XIChannelCount 0 def - /XIBitsPerPixel 0 def - /XIImageHeight 0 def - /XIImageWidth 0 def - /XIImageMatrix null def - /XIBuffer null def - /XIDataProc null def - end - - /WalkRGBString null def - /WalkCMYKString null def - - /StuffRGBIntoGrayString null def - /RGBToGrayImageProc null def - /StuffCMYKIntoGrayString null def - /CMYKToGrayImageProc null def - /ColorImageCompositeEmulator null def - - /SeparateCMYKImageProc null def - - /FourEqual null def - /TestPlateIndex null def - - currentdict /_colorimage known not - { - /colorimage where - { - /colorimage get /_colorimage exch def - } - { - /_colorimage null def - } ifelse - } if - - /_currenttransfer systemdict /currenttransfer get def - - /colorimage null def - /XI null def - - - /WalkRGBString - { - 0 3 index - - dup length 1 sub 0 3 3 -1 roll - { - 3 getinterval { } forall - - 5 index exec - - 3 index - } for - - 5 { pop } repeat - - } def - - - /WalkCMYKString - { - 0 3 index - - dup length 1 sub 0 4 3 -1 roll - { - 4 getinterval { } forall - - 6 index exec - - 3 index - - } for - - 5 { pop } repeat - - } def - - - /StuffRGBIntoGrayString - { - .11 mul exch - - .59 mul add exch - - .3 mul add - - cvi 3 copy put - - pop 1 add - } def - - - /RGBToGrayImageProc - { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 get exec - dup length 3 idiv string - dup 3 1 roll - - /StuffRGBIntoGrayString load exch - WalkRGBString - end - } def - - - /StuffCMYKIntoGrayString - { - exch .11 mul add - - exch .59 mul add - - exch .3 mul add - - dup 255 gt { pop 255 } if - - 255 exch sub cvi 3 copy put - - pop 1 add - } def - - - /CMYKToGrayImageProc - { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 get exec - dup length 4 idiv string - dup 3 1 roll - - /StuffCMYKIntoGrayString load exch - WalkCMYKString - end - } def - - - /ColorImageCompositeEmulator - { - pop true eq - { - Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat - } - { - Adobe_ColorImage_AI6_Vars /channelcount get 1 ne - { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 3 -1 roll put - - channelcount 3 eq - { - /RGBToGrayImageProc - } - { - /CMYKToGrayImageProc - } ifelse - load - end - } if - image - } ifelse - } def - - - /SeparateCMYKImageProc - { - Adobe_ColorImage_AI6_Vars begin - - sourcecount 0 ne - { - sourcearray plateindex get exec - } - { - sourcearray 0 get exec - - dup length 4 idiv string - - 0 2 index - - plateindex 4 2 index length 1 sub - { - get 255 exch sub - - 3 copy put pop 1 add - - 2 index - } for - - pop pop exch pop - } ifelse - end - } def - - - /FourEqual - { - 4 index ne - { - pop pop pop false - } - { - 4 index ne - { - pop pop false - } - { - 4 index ne - { - pop false - } - { - 4 index eq - } ifelse - } ifelse - } ifelse - } def - - - /TestPlateIndex - { - Adobe_ColorImage_AI6_Vars begin - /plateindex -1 def - - /setcmykcolor where - { - pop - gsave - 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub - grestore - - 1 0 0 0 FourEqual - { - /plateindex 0 def - } - { - 0 1 0 0 FourEqual - { - /plateindex 1 def - } - { - 0 0 1 0 FourEqual - { - /plateindex 2 def - } - { - 0 0 0 1 FourEqual - { - /plateindex 3 def - } - { - 0 0 0 0 FourEqual - { - /plateindex 5 def - } if - } ifelse - } ifelse - } ifelse - } ifelse - pop pop pop pop - } if - plateindex - end - } def - - - /colorimage - { - Adobe_ColorImage_AI6_Vars begin - /channelcount 1 index def - /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def - - 4 sourcecount add index dup - 8 eq exch 1 eq or not - end - - { - /_colorimage load null ne - { - _colorimage - } - { - Adobe_ColorImage_AI6_Vars /sourcecount get - 7 add { pop } repeat - } ifelse - } - { - dup 3 eq - TestPlateIndex - dup -1 eq exch 5 eq or or - { - /_colorimage load null eq - { - ColorImageCompositeEmulator - } - { - dup 1 eq - { - pop pop image - } - { - Adobe_ColorImage_AI6_Vars /plateindex get 5 eq - { - gsave - - 0 _currenttransfer exec - 1 _currenttransfer exec - eq - { 0 _currenttransfer exec 0.5 lt } - { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse - - { { pop 0 } } { { pop 1 } } ifelse - systemdict /settransfer get exec - } if - - _colorimage - - Adobe_ColorImage_AI6_Vars /plateindex get 5 eq - { - grestore - } if - } ifelse - } ifelse - } - { - dup 1 eq - { - pop pop - image - } - { - pop pop - - Adobe_ColorImage_AI6_Vars begin - sourcecount -1 0 - { - exch sourcearray 3 1 roll put - } for - - /SeparateCMYKImageProc load - end - - systemdict /image get exec - } ifelse - } ifelse - } ifelse - } def - - /XI - { - Adobe_ColorImage_AI6_Vars begin - gsave - /XIMask exch 0 ne def - /XIBinary exch 0 ne def - pop - pop - /XIChannelCount exch def - /XIBitsPerPixel exch def - /XIImageHeight exch def - /XIImageWidth exch def - pop pop pop pop - /XIImageMatrix exch def - - XIBitsPerPixel 1 eq - { - XIImageWidth 8 div ceiling cvi - } - { - XIImageWidth XIChannelCount mul - } ifelse - /XIBuffer exch string def - - XIBinary - { - /XIDataProc { currentfile XIBuffer readstring pop } def - currentfile 128 string readline pop pop - } - { - /XIDataProc { currentfile XIBuffer readhexstring pop } def - } ifelse - - 0 0 moveto - XIImageMatrix concat - XIImageWidth XIImageHeight scale - - XIMask - { - XIImageWidth XIImageHeight - false - [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] - /XIDataProc load - - /_lp /null ddef - _fc - /_lp /imagemask ddef - - imagemask - } - { - XIImageWidth XIImageHeight - XIBitsPerPixel - [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] - /XIDataProc load - - XIChannelCount 1 eq - { - - gsave - 0 setgray - - image - - grestore - } - { - false - XIChannelCount - colorimage - } ifelse - } ifelse - grestore - end - } def - -end -%%EndProcSet -%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 -%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) -%%Version: 1.1 -%%CreationDate: (3/7/1994) () -%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) -currentpacking true setpacking -userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin -put -/_eo false def -/_lp /none def -/_pf -{ -} def -/_ps -{ -} def -/_psf -{ -} def -/_pss -{ -} def -/_pjsf -{ -} def -/_pjss -{ -} def -/_pola 0 def -/_doClip 0 def -/cf currentflat def -/_tm matrix def -/_renderStart -[ -/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 -] def -/_renderEnd -[ -null null null null /i1 /i1 /i1 /i1 -] def -/_render -1 def -/_rise 0 def -/_ax 0 def -/_ay 0 def -/_cx 0 def -/_cy 0 def -/_leading -[ -0 0 -] def -/_ctm matrix def -/_mtx matrix def -/_sp 16#020 def -/_hyphen (-) def -/_fScl 0 def -/_cnt 0 def -/_hs 1 def -/_nativeEncoding 0 def -/_useNativeEncoding 0 def -/_tempEncode 0 def -/_pntr 0 def -/_tDict 2 dict def -/_wv 0 def -/Tx -{ -} def -/Tj -{ -} def -/CRender -{ -} def -/_AI3_savepage -{ -} def -/_gf null def -/_cf 4 array def -/_if null def -/_of false def -/_fc -{ -} def -/_gs null def -/_cs 4 array def -/_is null def -/_os false def -/_sc -{ -} def -/_pd 1 dict def -/_ed 15 dict def -/_pm matrix def -/_fm null def -/_fd null def -/_fdd null def -/_sm null def -/_sd null def -/_sdd null def -/_i null def -/discardSave null def -/buffer 256 string def -/beginString null def -/endString null def -/endStringLength null def -/layerCnt 1 def -/layerCount 1 def -/perCent (%) 0 get def -/perCentSeen? false def -/newBuff null def -/newBuffButFirst null def -/newBuffLast null def -/clipForward? false def -end -userdict /Adobe_Illustrator_AI5 known not { - userdict /Adobe_Illustrator_AI5 91 dict put -} if -userdict /Adobe_Illustrator_AI5 get begin -/initialize -{ - Adobe_Illustrator_AI5 dup begin - Adobe_Illustrator_AI5_vars begin - discardDict - { - bind pop pop - } forall - dup /nc get begin - { - dup xcheck 1 index type /operatortype ne and - { - bind - } if - pop pop - } forall - end - newpath -} def -/terminate -{ - end - end -} def -/_ -null def -/ddef -{ - Adobe_Illustrator_AI5_vars 3 1 roll put -} def -/xput -{ - dup load dup length exch maxlength eq - { - dup dup load dup - length 2 mul dict copy def - } if - load begin - def - end -} def -/npop -{ - { - pop - } repeat -} def -/sw -{ - dup length exch stringwidth - exch 5 -1 roll 3 index mul add - 4 1 roll 3 1 roll mul add -} def -/swj -{ - dup 4 1 roll - dup length exch stringwidth - exch 5 -1 roll 3 index mul add - 4 1 roll 3 1 roll mul add - 6 2 roll /_cnt 0 ddef - { - 1 index eq - { - /_cnt _cnt 1 add ddef - } if - } forall - pop - exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop -} def -/ss -{ - 4 1 roll - { - 2 npop - (0) exch 2 copy 0 exch put pop - gsave - false charpath currentpoint - 4 index setmatrix - stroke - grestore - moveto - 2 copy rmoveto - } exch cshow - 3 npop -} def -/jss -{ - 4 1 roll - { - 2 npop - (0) exch 2 copy 0 exch put - gsave - _sp eq - { - exch 6 index 6 index 6 index 5 -1 roll widthshow - currentpoint - } - { - false charpath currentpoint - 4 index setmatrix stroke - } ifelse - grestore - moveto - 2 copy rmoveto - } exch cshow - 6 npop -} def -/sp -{ - { - 2 npop (0) exch - 2 copy 0 exch put pop - false charpath - 2 copy rmoveto - } exch cshow - 2 npop -} def -/jsp -{ - { - 2 npop - (0) exch 2 copy 0 exch put - _sp eq - { - exch 5 index 5 index 5 index 5 -1 roll widthshow - } - { - false charpath - } ifelse - 2 copy rmoveto - } exch cshow - 5 npop -} def -/pl -{ - transform - 0.25 sub round 0.25 add exch - 0.25 sub round 0.25 add exch - itransform -} def -/setstrokeadjust where -{ - pop true setstrokeadjust - /c - { - curveto - } def - /C - /c load def - /v - { - currentpoint 6 2 roll curveto - } def - /V - /v load def - /y - { - 2 copy curveto - } def - /Y - /y load def - /l - { - lineto - } def - /L - /l load def - /m - { - moveto - } def -} -{ - /c - { - pl curveto - } def - /C - /c load def - /v - { - currentpoint 6 2 roll pl curveto - } def - /V - /v load def - /y - { - pl 2 copy curveto - } def - /Y - /y load def - /l - { - pl lineto - } def - /L - /l load def - /m - { - pl moveto - } def -} ifelse -/d -{ - setdash -} def -/cf -{ -} def -/i -{ - dup 0 eq - { - pop cf - } if - setflat -} def -/j -{ - setlinejoin -} def -/J -{ - setlinecap -} def -/M -{ - setmiterlimit -} def -/w -{ - setlinewidth -} def -/XR -{ - 0 ne - /_eo exch ddef -} def -/H -{ -} def -/h -{ - closepath -} def -/N -{ - _pola 0 eq - { - _doClip 1 eq - { - _eo {eoclip} {clip} ifelse /_doClip 0 ddef - } if - newpath - } - { - /CRender - { - N - } ddef - } ifelse -} def -/n -{ - N -} def -/F -{ - _pola 0 eq - { - _doClip 1 eq - { - gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc - /_doClip 0 ddef - } - { - _pf - } ifelse - } - { - /CRender - { - F - } ddef - } ifelse -} def -/f -{ - closepath - F -} def -/S -{ - _pola 0 eq - { - _doClip 1 eq - { - gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc - /_doClip 0 ddef - } - { - _ps - } ifelse - } - { - /CRender - { - S - } ddef - } ifelse -} def -/s -{ - closepath - S -} def -/B -{ - _pola 0 eq - { - _doClip 1 eq - gsave F grestore - { - gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc - /_doClip 0 ddef - } - { - S - } ifelse - } - { - /CRender - { - B - } ddef - } ifelse -} def -/b -{ - closepath - B -} def -/W -{ - /_doClip 1 ddef -} def -/* -{ - count 0 ne - { - dup type /stringtype eq - { - pop - } if - } if - newpath -} def -/u -{ -} def -/U -{ -} def -/q -{ - _pola 0 eq - { - gsave - } if -} def -/Q -{ - _pola 0 eq - { - grestore - } if -} def -/*u -{ - _pola 1 add /_pola exch ddef -} def -/*U -{ - _pola 1 sub /_pola exch ddef - _pola 0 eq - { - CRender - } if -} def -/D -{ - pop -} def -/*w -{ -} def -/*W -{ -} def -/` -{ - /_i save ddef - clipForward? - { - nulldevice - } if - 6 1 roll 4 npop - concat pop - userdict begin - /showpage - { - } def - 0 setgray - 0 setlinecap - 1 setlinewidth - 0 setlinejoin - 10 setmiterlimit - [] 0 setdash - /setstrokeadjust where {pop false setstrokeadjust} if - newpath - 0 setgray - false setoverprint -} def -/~ -{ - end - _i restore -} def -/O -{ - 0 ne - /_of exch ddef - /_lp /none ddef -} def -/R -{ - 0 ne - /_os exch ddef - /_lp /none ddef -} def -/g -{ - /_gf exch ddef - /_fc - { - _lp /fill ne - { - _of setoverprint - _gf setgray - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - ashow - } ddef - /_pjsf - { - _fc - awidthshow - } ddef - /_lp /none ddef -} def -/G -{ - /_gs exch ddef - /_sc - { - _lp /stroke ne - { - _os setoverprint - _gs setgray - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/k -{ - _cf astore pop - /_fc - { - _lp /fill ne - { - _of setoverprint - _cf aload pop setcmykcolor - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - ashow - } ddef - /_pjsf - { - _fc - awidthshow - } ddef - /_lp /none ddef -} def -/K -{ - _cs astore pop - /_sc - { - _lp /stroke ne - { - _os setoverprint - _cs aload pop setcmykcolor - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/x -{ - /_gf exch ddef - findcmykcustomcolor - /_if exch ddef - /_fc - { - _lp /fill ne - { - _of setoverprint - _if _gf 1 exch sub setcustomcolor - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - ashow - } ddef - /_pjsf - { - _fc - awidthshow - } ddef - /_lp /none ddef -} def -/X -{ - /_gs exch ddef - findcmykcustomcolor - /_is exch ddef - /_sc - { - _lp /stroke ne - { - _os setoverprint - _is _gs 1 exch sub setcustomcolor - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/A -{ - pop -} def -/annotatepage -{ -userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse -} def -/XT { - pop pop -} def -/discard -{ - save /discardSave exch store - discardDict begin - /endString exch store - gt38? - { - 2 add - } if - load - stopped - pop - end - discardSave restore -} bind def -userdict /discardDict 7 dict dup begin -put -/pre38Initialize -{ - /endStringLength endString length store - /newBuff buffer 0 endStringLength getinterval store - /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store - /newBuffLast newBuff endStringLength 1 sub 1 getinterval store -} def -/shiftBuffer -{ - newBuff 0 newBuffButFirst putinterval - newBuffLast 0 - currentfile read not - { - stop - } if - put -} def -0 -{ - pre38Initialize - mark - currentfile newBuff readstring exch pop - { - { - newBuff endString eq - { - cleartomark stop - } if - shiftBuffer - } loop - } - { - stop - } ifelse -} def -1 -{ - pre38Initialize - /beginString exch store - mark - currentfile newBuff readstring exch pop - { - { - newBuff beginString eq - { - /layerCount dup load 1 add store - } - { - newBuff endString eq - { - /layerCount dup load 1 sub store - layerCount 0 eq - { - cleartomark stop - } if - } if - } ifelse - shiftBuffer - } loop - } if -} def -2 -{ - mark - { - currentfile buffer readline not - { - stop - } if - endString eq - { - cleartomark stop - } if - } loop -} def -3 -{ - /beginString exch store - /layerCnt 1 store - mark - { - currentfile buffer readline not - { - stop - } if - dup beginString eq - { - pop /layerCnt dup load 1 add store - } - { - endString eq - { - layerCnt 1 eq - { - cleartomark stop - } - { - /layerCnt dup load 1 sub store - } ifelse - } if - } ifelse - } loop -} def -end -userdict /clipRenderOff 15 dict dup begin -put -{ - /n /N /s /S /f /F /b /B -} -{ - { - _doClip 1 eq - { - /_doClip 0 ddef _eo {eoclip} {clip} ifelse - } if - newpath - } def -} forall -/Tr /pop load def -/Bb {} def -/BB /pop load def -/Bg {12 npop} def -/Bm {6 npop} def -/Bc /Bm load def -/Bh {4 npop} def -end -/Lb -{ - 4 npop - 6 1 roll - pop - 4 1 roll - pop pop pop - 0 eq - { - 0 eq - { - (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard - } - { - - /clipForward? true def - - /Tx /pop load def - /Tj /pop load def - - currentdict end clipRenderOff begin begin - } ifelse - } - { - 0 eq - { - save /discardSave exch store - } if - } ifelse -} bind def -/LB -{ - discardSave dup null ne - { - restore - } - { - pop - clipForward? - { - currentdict - end - end - begin - - /clipForward? false ddef - } if - } ifelse -} bind def -/Pb -{ - pop pop - 0 (%AI5_EndPalette) discard -} bind def -/Np -{ - 0 (%AI5_End_NonPrinting--) discard -} bind def -/Ln /pop load def -/Ap -/pop load def -/Ar -{ - 72 exch div - 0 dtransform dup mul exch dup mul add sqrt - dup 1 lt - { - pop 1 - } if - setflat -} def -/Mb -{ - q -} def -/Md -{ -} def -/MB -{ - Q -} def -/nc 3 dict def -nc begin -/setgray -{ - pop -} bind def -/setcmykcolor -{ - 4 npop -} bind def -/setcustomcolor -{ - 2 npop -} bind def -currentdict readonly pop -end -end -setpacking -%%EndResource -%%EndProlog -%%BeginSetup -%%IncludeFont: Geneva -%%IncludeFont: Univers -Adobe_level2_AI5 /initialize get exec -Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec -Adobe_ColorImage_AI6 /initialize get exec -Adobe_Illustrator_AI5 /initialize get exec -[ -39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis -/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute -/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde -/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex -/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls -/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash -/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef -/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash -/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef -/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe -/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide -/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright -/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand -/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex -/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex -/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla -/hungarumlaut/ogonek/caron -TE -%AI3_BeginEncoding: _Geneva Geneva -[/_Geneva/Geneva 0 0 0 TZ -%AI3_EndEncoding TrueType -%AI3_BeginEncoding: _Univers Univers -[/_Univers/Univers 0 0 1 TZ -%AI3_EndEncoding AdobeType -%AI5_Begin_NonPrinting -Np -8 Bn -%AI5_BeginGradient: (Black & White) -(Black & White) 0 2 Bd -[ -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 %_Br -[ -0 0 50 100 %_Bs -1 0 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Green & Blue) -(Green & Blue) 0 2 Bd -[ -< -99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 -A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 -B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 -C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 -D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 -E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 -F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF -> -< -000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D -1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B -3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 -5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 -78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 -96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 -B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF -> -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 -1 %_Br -[ -1 0.75 0 0 1 50 100 %_Bs -0.6 0 1 0 1 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Pink, Yellow, Green) -(Pink, Yellow, Green) 0 3 Bd -[ -< -00000000000000000000000000000000000000010101010101010101010101010101010101010101 -01010101010202020202020202020202020202020202020202020203030303030303030303030303 -03030303030303030404040404040404040404040404040404040404050505050505050505050505 -05050505050505060606060606060606060606060606060606060707070707070707070707070707 -07070707080808080808080808080808080808080809090909090909090909090909090909090A0A -0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C -0C0C0C0C0C0C0C0D0D0D0D0D -> -< -050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 -17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F -2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A -4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 -69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 -88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 -A9AAABACADADAEAFB0B1B2B2 -> -< -CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 -B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B -9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B -7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 -5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 -3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C -0B0A09080706050403020100 -> -0 -1 %_Br -< -737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E -4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D -2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 -1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 -020201010101010000000000 -> -< -00000000000000000000000001010101010101010101010101010101010101010101010102020202 -02020202020202020202020202020202020202020202030303030303030303030303030303030303 -03030303030303030303030303040404040404040404040404040404040404040404040404040404 -04040404040404040404050505050505050505050505050505050505050505050505050505050505 -050505050505050505050505 -> -< -BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 -C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 -C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA -CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC -CCCCCCCCCCCCCCCCCCCCCCCC -> -0 -1 %_Br -[ -0.05 0.7 0 0 1 50 100 %_Bs -0 0.02 0.8 0 1 57 36 %_Bs -0.45 0 0.75 0 1 37 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Purple, Red & Yellow) -(Purple, Red & Yellow) 0 3 Bd -[ -0 -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A -> -< -CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 -D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC -DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 -E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED -EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 -F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE -FEFEFEFFFFFF -> -0 -1 %_Br -< -E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE -BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 -9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E -6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 -4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E -1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 -> -< -E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA -EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE -EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 -F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 -F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC -FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF -> -< -00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 -242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 -4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A -6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E -8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 -B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC -> -0 -1 %_Br -[ -0 0.04 1 0 1 50 100 %_Bs -0 1 0.8 0 1 50 50 %_Bs -0.9 0.9 0 0 1 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Rainbow) -(Rainbow) 0 6 Bd -[ -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -1 -0 -0 -1 %_Br -1 -< -0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E -2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 -5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E -7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 -A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE -CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 -F7F8F9FAFBFCFDFEFF -> -0 -0 -1 %_Br -1 -< -00000000000000000000000000000000000001010101010101010101010101010101010101010101 -01010101010101010101010101010202020202020202020202020202020202020202020202020202 -02020202020202020202030303030303030303030303030303030303030303030303030303030303 -03030303030304040404040404040404040404040404040404040404040404040404040404040404 -04040505050505050505050505050505050505050505050505050505050505050505050505050606 -06060606060606060606060606060606060606060606060606060606060606060606070707070707 -07070707070707070707070707070707 -> -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 -1 %_Br -< -000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -> -0 -1 -0 -1 %_Br -0 -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -1 -0 -1 %_Br -[ -0 1 0 0 1 50 100 %_Bs -1 1 0 0 1 50 80 %_Bs -1 0.0279 0 0 1 50 60 %_Bs -1 0 1 0 1 50 40 %_Bs -0 0 1 0 1 50 20 %_Bs -0 1 1 0 1 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Steel Bar) -(Steel Bar) 0 3 Bd -[ -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 %_Br -< -000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -> -0 %_Br -[ -0 0 50 100 %_Bs -1 0 50 70 %_Bs -0 0 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Yellow & Orange Radial) -(Yellow & Orange Radial) 1 2 Bd -[ -0 -< -0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 -232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 -494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F -707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C -> -< -FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 -F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 -F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB -EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 -> -0 -1 %_Br -[ -0 0 1 0 1 52 19 %_Bs -0 0.55 0.9 0 1 50 100 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Yellow & Purple Radial) -(Yellow & Purple Radial) 1 2 Bd -[ -< -000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -> -< -1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 -393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D -5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 -83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 -A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB -CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 -F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF -> -< -ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 -908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 -7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B -5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 -403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 -25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B -0A090908070706050504030302010100 -> -0 -1 %_Br -[ -0 0.08 0.67 0 1 50 14 %_Bs -1 1 0 0 1 50 100 %_Bs -BD -%AI5_EndGradient -%AI5_End_NonPrinting-- -%AI5_BeginPalette -0 0 Pb -Pn -Pc -1 g -Pc -0 g -Pc -0 0 0 0 k -Pc -0.75 g -Pc -0.5 g -Pc -0.25 g -Pc -0 g -Pc -Bb -2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.25 0 0 0 k -Pc -0.5 0 0 0 k -Pc -0.75 0 0 0 k -Pc -1 0 0 0 k -Pc -0.25 0.25 0 0 k -Pc -0.5 0.5 0 0 k -Pc -0.75 0.75 0 0 k -Pc -1 1 0 0 k -Pc -Bb -2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0 0.25 0 0 k -Pc -0 0.5 0 0 k -Pc -0 0.75 0 0 k -Pc -0 1 0 0 k -Pc -0 0.25 0.25 0 k -Pc -0 0.5 0.5 0 k -Pc -0 0.75 0.75 0 k -Pc -0 1 1 0 k -Pc -Bb -0 0 0 0 Bh -2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0 0 0.25 0 k -Pc -0 0 0.5 0 k -Pc -0 0 0.75 0 k -Pc -0 0 1 0 k -Pc -0.25 0 0.25 0 k -Pc -0.5 0 0.5 0 k -Pc -0.75 0 0.75 0 k -Pc -1 0 1 0 k -Pc -Bb -2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.25 0.125 0 0 k -Pc -0.5 0.25 0 0 k -Pc -0.75 0.375 0 0 k -Pc -1 0.5 0 0 k -Pc -0.125 0.25 0 0 k -Pc -0.25 0.5 0 0 k -Pc -0.375 0.75 0 0 k -Pc -0.5 1 0 0 k -Pc -Bb -2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0 0.25 0.125 0 k -Pc -0 0.5 0.25 0 k -Pc -0 0.75 0.375 0 k -Pc -0 1 0.5 0 k -Pc -0 0.125 0.25 0 k -Pc -0 0.25 0.5 0 k -Pc -0 0.375 0.75 0 k -Pc -0 0.5 1 0 k -Pc -Bb -2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.125 0 0.25 0 k -Pc -0.25 0 0.5 0 k -Pc -0.375 0 0.75 0 k -Pc -0.5 0 1 0 k -Pc -0.25 0 0.125 0 k -Pc -0.5 0 0.25 0 k -Pc -0.75 0 0.375 0 k -Pc -1 0 0.5 0 k -Pc -Bb -2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.25 0.125 0.125 0 k -Pc -0.5 0.25 0.25 0 k -Pc -0.75 0.375 0.375 0 k -Pc -1 0.5 0.5 0 k -Pc -0.25 0.25 0.125 0 k -Pc -0.5 0.5 0.25 0 k -Pc -0.75 0.75 0.375 0 k -Pc -1 1 0.5 0 k -Pc -Bb -0 0 0 0 Bh -2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.125 0.25 0.125 0 k -Pc -0.25 0.5 0.25 0 k -Pc -0.375 0.75 0.375 0 k -Pc -0.5 1 0.5 0 k -Pc -0.125 0.25 0.25 0 k -Pc -0.25 0.5 0.5 0 k -Pc -0.375 0.75 0.75 0 k -Pc -0.5 1 1 0 k -Pc -0 0 0 0 k -Pc -0.125 0.125 0.25 0 k -Pc -0.25 0.25 0.5 0 k -Pc -0.375 0.375 0.75 0 k -Pc -0.5 0.5 1 0 k -Pc -0.25 0.125 0.25 0 k -Pc -0.5 0.25 0.5 0 k -Pc -0.75 0.375 0.75 0 k -Pc -1 0.5 1 0 k -Pc -PB -%AI5_EndPalette -%%EndSetup -%AI5_BeginLayer -1 1 1 1 0 0 0 79 128 255 Lb -(Layer 1) Ln -0 A -800 Ar -0 J 0 j 1 w 4 M []0 d -%AI3_Note: -0 D -0 XR --4014 283.5 m -4626 283.5 L -(N) * -453.5 4716 m -453.5 -3924 L -(N) * -85 4716 m -85 -3924 L -(N) * --4014 765.5 m -4626 765.5 L -(N) * -0 O -1 g -0 R -0 G -3 w -334.5 645 m -334.5 588.5 l -B -0 To -1 0 0 1 169 583.3333 0 Tp -TP --46.6589 0 Td -0 Tr -0 g -1 w -/_Univers 10 Tf -0 Ts -100 Tz -0 Tt -1 TA -%_ 0 XL -36 0 Xb -XB -0 0 5 TC -100 100 200 TW -0 0 0 Ti -1 Ta -0 0 2 2 3 Th -0 Tq -0 0 Tl -0 Tc -0 Tw -(Application Process) Tx -(\r) TX -TO -1 Ap -0.75 g -0 R -0 G -2 J -368.0866 681.4134 m -368.0866 695.5866 L -353.9134 695.5866 L -353.9134 681.4134 L -368.0866 681.4134 L -b -0 To -1 0 0 1 361 699 0 Tp -TP --34.7095 0 Td -0 Tr -0 g -0 J -(window object) Tx -(\r) TX -TO -0 To -1 0 0 1 306.5 580.6667 0 Tp -TP --20.2759 0 Td -0 Tr -(graphics\r) Tx -5.5481 -12 Td -(server) Tx -(\r) TX -TO -u -u -0 Ap -0 R -0 G -361 679.5 m -360.5015 662.0213 359.5 647 v -359 639.5 356.5 630.5 y -348 614.5 332 617 306 617 c -291.9911 617 209.5 617 y -S -0 O -0 g -207.138 615.9751 m -208.7913 615.4759 209.8659 615.0159 211.1924 614.4835 c -211.1924 619.5278 l -210.7176 619.3026 208.7913 618.5353 207.138 618.0364 c -205.3686 617.5017 203.7641 617.1361 202.7234 617.0056 c -203.7641 616.8751 205.3686 616.5096 207.138 615.9751 c -f -U -U -0 To -1 0 0 1 357.5 593 0 Tp -TP --19.7217 0 Td -0 Tr -(backend) Tx -(\r) TX -TO -0 To -1 0 0 1 196 623.3333 0 Tp -TP -0 Tr -/_Geneva 8 Tf -0 Ta -({event, ObjectId ...}) Tx -(\r) TX -TO -1 Ap -0 R -0 G -169.5286 595.7116 m -181.2699 595.7116 190.7884 605.2301 190.7884 616.9714 c -190.7884 628.7127 181.2699 638.2312 169.5286 638.2312 c -157.7873 638.2312 148.2688 628.7127 148.2688 616.9714 c -148.2688 605.2301 157.7873 595.7116 169.5286 595.7116 c -s -u -0 Ap -282.7402 617 m -282.7402 623.2129 285.1596 629.0538 289.5529 633.447 c -293.9461 637.8403 299.7871 640.2599 306 640.2599 c -312.2128 640.2599 318.0539 637.8403 322.4471 633.447 c -326.8404 629.0538 329.2598 623.2129 329.2598 617 c -329.2598 604.1744 318.8255 593.7402 306 593.7402 c -299.7871 593.7402 293.9461 596.1596 289.5529 600.5529 c -285.1596 604.9461 282.7402 610.7872 282.7402 617 c -s -1 Ap -306 595.7402 m -317.7413 595.7402 327.2598 605.2586 327.2598 617 c -327.2598 628.7413 317.7413 638.2599 306 638.2599 c -294.2587 638.2599 284.7402 628.7413 284.7402 617 c -284.7402 605.2586 294.2587 595.7402 306 595.7402 c -s -U -LB -%AI5_EndLayer-- -%%PageTrailer -gsave annotatepage grestore showpage -%%Trailer -Adobe_Illustrator_AI5 /terminate get exec -Adobe_ColorImage_AI6 /terminate get exec -Adobe_typography_AI5 /terminate get exec -Adobe_level2_AI5 /terminate get exec -%%EOF Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-4.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-4.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-4.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-4.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/gs1-1-image-4.ps 1997-05-22 23:38:02.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/gs1-1-image-4.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,2761 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: Adobe Illustrator(r) 6.0 -%%For: (Anna Fedoriw) (Ericsson Telecom) -%%Title: (Object_hierarchy.eps) -%%CreationDate: (97-05-22) (12.54) -%%BoundingBox: 184 668 330 732 -%%HiResBoundingBox: 184.4556 668.5 329.7661 731.3677 -%%DocumentProcessColors: Black -%%DocumentFonts: Univers -%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 -%%+ procset Adobe_typography_AI5 1.0 0 -%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 -%%+ procset Adobe_Illustrator_AI5 1.0 0 -%AI5_FileFormat 2.0 -%AI3_ColorUsage: Black&White -%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) -%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 -%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () -%AI3_TemplateBox: 306 396 306 396 -%AI3_TileBox: 21 -12 588 802 -%AI3_DocumentPreview: Macintosh_ColorPic -%AI5_ArtSize: 595.2756 841.8898 -%AI5_RulerUnits: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI5_OpenToView: -62 780 1.5 1058 826 58 1 1 2 40 -%AI5_OpenViewLayers: 7 -%%EndComments -%%BeginProlog -%%BeginResource: procset Adobe_level2_AI5 1.2 0 -%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) -%%Version: 1.2 -%%CreationDate: (04/10/93) () -%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) -userdict /Adobe_level2_AI5 23 dict dup begin - put - /packedarray where not - { - userdict begin - /packedarray - { - array astore readonly - } bind def - /setpacking /pop load def - /currentpacking false def - end - 0 - } if - pop - userdict /defaultpacking currentpacking put true setpacking - /initialize - { - Adobe_level2_AI5 begin - } bind def - /terminate - { - currentdict Adobe_level2_AI5 eq - { - end - } if - } bind def - mark - /setcustomcolor where not - { - /findcmykcustomcolor - { - 5 packedarray - } bind def - /setcustomcolor - { - exch aload pop pop - 4 - { - 4 index mul 4 1 roll - } repeat - 5 -1 roll pop - setcmykcolor - } - def - } if - - /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def - userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put - userdict /level2? - systemdict /languagelevel known dup - { - pop systemdict /languagelevel get 2 ge - } if - put -/level2ScreenFreq -{ - begin - 60 - HalftoneType 1 eq - { - pop Frequency - } if - HalftoneType 2 eq - { - pop GrayFrequency - } if - HalftoneType 5 eq - { - pop Default level2ScreenFreq - } if - end -} bind def -userdict /currentScreenFreq - level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put -level2? not - { - /setcmykcolor where not - { - /setcmykcolor - { - exch .11 mul add exch .59 mul add exch .3 mul add - 1 exch sub setgray - } def - } if - /currentcmykcolor where not - { - /currentcmykcolor - { - 0 0 0 1 currentgray sub - } def - } if - /setoverprint where not - { - /setoverprint /pop load def - } if - /selectfont where not - { - /selectfont - { - exch findfont exch - dup type /arraytype eq - { - makefont - } - { - scalefont - } ifelse - setfont - } bind def - } if - /cshow where not - { - /cshow - { - [ - 0 0 5 -1 roll aload pop - ] cvx bind forall - } bind def - } if - } if - cleartomark - /anyColor? - { - add add add 0 ne - } bind def - /testColor - { - gsave - setcmykcolor currentcmykcolor - grestore - } bind def - /testCMYKColorThrough - { - testColor anyColor? - } bind def - userdict /composite? - level2? - { - gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore - add add add 4 eq - } - { - 1 0 0 0 testCMYKColorThrough - 0 1 0 0 testCMYKColorThrough - 0 0 1 0 testCMYKColorThrough - 0 0 0 1 testCMYKColorThrough - and and and - } ifelse - put - composite? not - { - userdict begin - gsave - /cyan? 1 0 0 0 testCMYKColorThrough def - /magenta? 0 1 0 0 testCMYKColorThrough def - /yellow? 0 0 1 0 testCMYKColorThrough def - /black? 0 0 0 1 testCMYKColorThrough def - grestore - /isCMYKSep? cyan? magenta? yellow? black? or or or def - /customColor? isCMYKSep? not def - end - } if - end defaultpacking setpacking -%%EndResource -%%BeginResource: procset Adobe_typography_AI5 1.0 1 -%%Title: (Typography Operators) -%%Version: 1.0 -%%CreationDate:(03/26/93) () -%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) -currentpacking true setpacking -userdict /Adobe_typography_AI5 54 dict dup begin -put -/initialize -{ - begin - begin - Adobe_typography_AI5 begin - Adobe_typography_AI5 - { - dup xcheck - { - bind - } if - pop pop - } forall - end - end - end - Adobe_typography_AI5 begin -} def -/terminate -{ - currentdict Adobe_typography_AI5 eq - { - end - } if -} def -/modifyEncoding -{ - /_tempEncode exch ddef - /_pntr 0 ddef - { - counttomark -1 roll - dup type dup /marktype eq - { - pop pop exit - } - { - /nametype eq - { - _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll - put - } - { - /_pntr exch ddef - } ifelse - } ifelse - } loop - _tempEncode -} def -/TE -{ - StandardEncoding 256 array copy modifyEncoding - /_nativeEncoding exch def -} def -% -/TZ -{ - dup type /arraytype eq - { - /_wv exch def - } - { - /_wv 0 def - } ifelse - /_useNativeEncoding exch def - pop pop - findfont _wv type /arraytype eq - { - _wv makeblendedfont - } if - dup length 2 add dict - begin - mark exch - { - 1 index /FID ne - { - def - } if - cleartomark mark - } forall - pop - /FontName exch def - counttomark 0 eq - { - 1 _useNativeEncoding eq - { - /Encoding _nativeEncoding def - } if - cleartomark - } - { - /Encoding load 256 array copy - modifyEncoding /Encoding exch def - } ifelse - FontName currentdict - end - definefont pop -} def -/tr -{ - _ax _ay 3 2 roll -} def -/trj -{ - _cx _cy _sp _ax _ay 6 5 roll -} def -/a0 -{ - /Tx - { - dup - currentpoint 3 2 roll - tr _psf - newpath moveto - tr _ctm _pss - } ddef - /Tj - { - dup - currentpoint 3 2 roll - trj _pjsf - newpath moveto - trj _ctm _pjss - } ddef -} def -/a1 -{ - /Tx - { - dup currentpoint 4 2 roll gsave - dup currentpoint 3 2 roll - tr _psf - newpath moveto - tr _ctm _pss - grestore 3 1 roll moveto tr sp - } ddef - /Tj - { - dup currentpoint 4 2 roll gsave - dup currentpoint 3 2 roll - trj _pjsf - newpath moveto - trj _ctm _pjss - grestore 3 1 roll moveto tr jsp - } ddef -} def -/e0 -{ - /Tx - { - tr _psf - } ddef - /Tj - { - trj _pjsf - } ddef -} def -/e1 -{ - /Tx - { - dup currentpoint 4 2 roll gsave - tr _psf - grestore 3 1 roll moveto tr sp - } ddef - /Tj - { - dup currentpoint 4 2 roll gsave - trj _pjsf - grestore 3 1 roll moveto tr jsp - } ddef -} def -/i0 -{ - /Tx - { - tr sp - } ddef - /Tj - { - trj jsp - } ddef -} def -/i1 -{ - W N -} def -/o0 -{ - /Tx - { - tr sw rmoveto - } ddef - /Tj - { - trj swj rmoveto - } ddef -} def -/r0 -{ - /Tx - { - tr _ctm _pss - } ddef - /Tj - { - trj _ctm _pjss - } ddef -} def -/r1 -{ - /Tx - { - dup currentpoint 4 2 roll currentpoint gsave newpath moveto - tr _ctm _pss - grestore 3 1 roll moveto tr sp - } ddef - /Tj - { - dup currentpoint 4 2 roll currentpoint gsave newpath moveto - trj _ctm _pjss - grestore 3 1 roll moveto tr jsp - } ddef -} def -/To -{ - pop _ctm currentmatrix pop -} def -/TO -{ - iTe _ctm setmatrix newpath -} def -/Tp -{ - pop _tm astore pop _ctm setmatrix - _tDict begin - /W - { - } def - /h - { - } def -} def -/TP -{ - end - iTm 0 0 moveto -} def -/Tr -{ - _render 3 le - { - currentpoint newpath moveto - } if - dup 8 eq - { - pop 0 - } - { - dup 9 eq - { - pop 1 - } if - } ifelse - dup /_render exch ddef - _renderStart exch get load exec -} def -/iTm -{ - _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale -} def -/Tm -{ - _tm astore pop iTm 0 0 moveto -} def -/Td -{ - _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto -} def -/iTe -{ - _render -1 eq - { - } - { - _renderEnd _render get dup null ne - { - load exec - } - { - pop - } ifelse - } ifelse - /_render -1 ddef -} def -/Ta -{ - pop -} def -/Tf -{ - dup 1000 div /_fScl exch ddef -% - selectfont -} def -/Tl -{ - pop - 0 exch _leading astore pop -} def -/Tt -{ - pop -} def -/TW -{ - 3 npop -} def -/Tw -{ - /_cx exch ddef -} def -/TC -{ - 3 npop -} def -/Tc -{ - /_ax exch ddef -} def -/Ts -{ - /_rise exch ddef - currentpoint - iTm - moveto -} def -/Ti -{ - 3 npop -} def -/Tz -{ - 100 div /_hs exch ddef - iTm -} def -/TA -{ - pop -} def -/Tq -{ - pop -} def -/Th -{ - pop pop pop pop pop -} def -/TX -{ - pop -} def -/Tk -{ - exch pop _fScl mul neg 0 rmoveto -} def -/TK -{ - 2 npop -} def -/T* -{ - _leading aload pop neg Td -} def -/T*- -{ - _leading aload pop Td -} def -/T- -{ - _ax neg 0 rmoveto - _hyphen Tx -} def -/T+ -{ -} def -/TR -{ - _ctm currentmatrix pop - _tm astore pop - iTm 0 0 moveto -} def -/TS -{ - currentfont 3 1 roll - /_Symbol_ _fScl 1000 mul selectfont - - 0 eq - { - Tx - } - { - Tj - } ifelse - setfont -} def -/Xb -{ - pop pop -} def -/Tb /Xb load def -/Xe -{ - pop pop pop pop -} def -/Te /Xe load def -/XB -{ -} def -/TB /XB load def -currentdict readonly pop -end -setpacking -%%EndResource -%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 -userdict /Adobe_ColorImage_AI6 known not -{ - userdict /Adobe_ColorImage_AI6 17 dict put -} if -userdict /Adobe_ColorImage_AI6 get begin - - /initialize - { - Adobe_ColorImage_AI6 begin - Adobe_ColorImage_AI6 - { - dup type /arraytype eq - { - dup xcheck - { - bind - } if - } if - pop pop - } forall - } def - /terminate { end } def - - currentdict /Adobe_ColorImage_AI6_Vars known not - { - /Adobe_ColorImage_AI6_Vars 14 dict def - } if - - Adobe_ColorImage_AI6_Vars begin - /channelcount 0 def - /sourcecount 0 def - /sourcearray 4 array def - /plateindex -1 def - /XIMask 0 def - /XIBinary 0 def - /XIChannelCount 0 def - /XIBitsPerPixel 0 def - /XIImageHeight 0 def - /XIImageWidth 0 def - /XIImageMatrix null def - /XIBuffer null def - /XIDataProc null def - end - - /WalkRGBString null def - /WalkCMYKString null def - - /StuffRGBIntoGrayString null def - /RGBToGrayImageProc null def - /StuffCMYKIntoGrayString null def - /CMYKToGrayImageProc null def - /ColorImageCompositeEmulator null def - - /SeparateCMYKImageProc null def - - /FourEqual null def - /TestPlateIndex null def - - currentdict /_colorimage known not - { - /colorimage where - { - /colorimage get /_colorimage exch def - } - { - /_colorimage null def - } ifelse - } if - - /_currenttransfer systemdict /currenttransfer get def - - /colorimage null def - /XI null def - - - /WalkRGBString - { - 0 3 index - - dup length 1 sub 0 3 3 -1 roll - { - 3 getinterval { } forall - - 5 index exec - - 3 index - } for - - 5 { pop } repeat - - } def - - - /WalkCMYKString - { - 0 3 index - - dup length 1 sub 0 4 3 -1 roll - { - 4 getinterval { } forall - - 6 index exec - - 3 index - - } for - - 5 { pop } repeat - - } def - - - /StuffRGBIntoGrayString - { - .11 mul exch - - .59 mul add exch - - .3 mul add - - cvi 3 copy put - - pop 1 add - } def - - - /RGBToGrayImageProc - { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 get exec - dup length 3 idiv string - dup 3 1 roll - - /StuffRGBIntoGrayString load exch - WalkRGBString - end - } def - - - /StuffCMYKIntoGrayString - { - exch .11 mul add - - exch .59 mul add - - exch .3 mul add - - dup 255 gt { pop 255 } if - - 255 exch sub cvi 3 copy put - - pop 1 add - } def - - - /CMYKToGrayImageProc - { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 get exec - dup length 4 idiv string - dup 3 1 roll - - /StuffCMYKIntoGrayString load exch - WalkCMYKString - end - } def - - - /ColorImageCompositeEmulator - { - pop true eq - { - Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat - } - { - Adobe_ColorImage_AI6_Vars /channelcount get 1 ne - { - Adobe_ColorImage_AI6_Vars begin - sourcearray 0 3 -1 roll put - - channelcount 3 eq - { - /RGBToGrayImageProc - } - { - /CMYKToGrayImageProc - } ifelse - load - end - } if - image - } ifelse - } def - - - /SeparateCMYKImageProc - { - Adobe_ColorImage_AI6_Vars begin - - sourcecount 0 ne - { - sourcearray plateindex get exec - } - { - sourcearray 0 get exec - - dup length 4 idiv string - - 0 2 index - - plateindex 4 2 index length 1 sub - { - get 255 exch sub - - 3 copy put pop 1 add - - 2 index - } for - - pop pop exch pop - } ifelse - end - } def - - - /FourEqual - { - 4 index ne - { - pop pop pop false - } - { - 4 index ne - { - pop pop false - } - { - 4 index ne - { - pop false - } - { - 4 index eq - } ifelse - } ifelse - } ifelse - } def - - - /TestPlateIndex - { - Adobe_ColorImage_AI6_Vars begin - /plateindex -1 def - - /setcmykcolor where - { - pop - gsave - 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub - 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub - grestore - - 1 0 0 0 FourEqual - { - /plateindex 0 def - } - { - 0 1 0 0 FourEqual - { - /plateindex 1 def - } - { - 0 0 1 0 FourEqual - { - /plateindex 2 def - } - { - 0 0 0 1 FourEqual - { - /plateindex 3 def - } - { - 0 0 0 0 FourEqual - { - /plateindex 5 def - } if - } ifelse - } ifelse - } ifelse - } ifelse - pop pop pop pop - } if - plateindex - end - } def - - - /colorimage - { - Adobe_ColorImage_AI6_Vars begin - /channelcount 1 index def - /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def - - 4 sourcecount add index dup - 8 eq exch 1 eq or not - end - - { - /_colorimage load null ne - { - _colorimage - } - { - Adobe_ColorImage_AI6_Vars /sourcecount get - 7 add { pop } repeat - } ifelse - } - { - dup 3 eq - TestPlateIndex - dup -1 eq exch 5 eq or or - { - /_colorimage load null eq - { - ColorImageCompositeEmulator - } - { - dup 1 eq - { - pop pop image - } - { - Adobe_ColorImage_AI6_Vars /plateindex get 5 eq - { - gsave - - 0 _currenttransfer exec - 1 _currenttransfer exec - eq - { 0 _currenttransfer exec 0.5 lt } - { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse - - { { pop 0 } } { { pop 1 } } ifelse - systemdict /settransfer get exec - } if - - _colorimage - - Adobe_ColorImage_AI6_Vars /plateindex get 5 eq - { - grestore - } if - } ifelse - } ifelse - } - { - dup 1 eq - { - pop pop - image - } - { - pop pop - - Adobe_ColorImage_AI6_Vars begin - sourcecount -1 0 - { - exch sourcearray 3 1 roll put - } for - - /SeparateCMYKImageProc load - end - - systemdict /image get exec - } ifelse - } ifelse - } ifelse - } def - - /XI - { - Adobe_ColorImage_AI6_Vars begin - gsave - /XIMask exch 0 ne def - /XIBinary exch 0 ne def - pop - pop - /XIChannelCount exch def - /XIBitsPerPixel exch def - /XIImageHeight exch def - /XIImageWidth exch def - pop pop pop pop - /XIImageMatrix exch def - - XIBitsPerPixel 1 eq - { - XIImageWidth 8 div ceiling cvi - } - { - XIImageWidth XIChannelCount mul - } ifelse - /XIBuffer exch string def - - XIBinary - { - /XIDataProc { currentfile XIBuffer readstring pop } def - currentfile 128 string readline pop pop - } - { - /XIDataProc { currentfile XIBuffer readhexstring pop } def - } ifelse - - 0 0 moveto - XIImageMatrix concat - XIImageWidth XIImageHeight scale - - XIMask - { - XIImageWidth XIImageHeight - false - [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] - /XIDataProc load - - /_lp /null ddef - _fc - /_lp /imagemask ddef - - imagemask - } - { - XIImageWidth XIImageHeight - XIBitsPerPixel - [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] - /XIDataProc load - - XIChannelCount 1 eq - { - - gsave - 0 setgray - - image - - grestore - } - { - false - XIChannelCount - colorimage - } ifelse - } ifelse - grestore - end - } def - -end -%%EndProcSet -%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 -%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) -%%Version: 1.1 -%%CreationDate: (3/7/1994) () -%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) -currentpacking true setpacking -userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin -put -/_eo false def -/_lp /none def -/_pf -{ -} def -/_ps -{ -} def -/_psf -{ -} def -/_pss -{ -} def -/_pjsf -{ -} def -/_pjss -{ -} def -/_pola 0 def -/_doClip 0 def -/cf currentflat def -/_tm matrix def -/_renderStart -[ -/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 -] def -/_renderEnd -[ -null null null null /i1 /i1 /i1 /i1 -] def -/_render -1 def -/_rise 0 def -/_ax 0 def -/_ay 0 def -/_cx 0 def -/_cy 0 def -/_leading -[ -0 0 -] def -/_ctm matrix def -/_mtx matrix def -/_sp 16#020 def -/_hyphen (-) def -/_fScl 0 def -/_cnt 0 def -/_hs 1 def -/_nativeEncoding 0 def -/_useNativeEncoding 0 def -/_tempEncode 0 def -/_pntr 0 def -/_tDict 2 dict def -/_wv 0 def -/Tx -{ -} def -/Tj -{ -} def -/CRender -{ -} def -/_AI3_savepage -{ -} def -/_gf null def -/_cf 4 array def -/_if null def -/_of false def -/_fc -{ -} def -/_gs null def -/_cs 4 array def -/_is null def -/_os false def -/_sc -{ -} def -/_pd 1 dict def -/_ed 15 dict def -/_pm matrix def -/_fm null def -/_fd null def -/_fdd null def -/_sm null def -/_sd null def -/_sdd null def -/_i null def -/discardSave null def -/buffer 256 string def -/beginString null def -/endString null def -/endStringLength null def -/layerCnt 1 def -/layerCount 1 def -/perCent (%) 0 get def -/perCentSeen? false def -/newBuff null def -/newBuffButFirst null def -/newBuffLast null def -/clipForward? false def -end -userdict /Adobe_Illustrator_AI5 known not { - userdict /Adobe_Illustrator_AI5 91 dict put -} if -userdict /Adobe_Illustrator_AI5 get begin -/initialize -{ - Adobe_Illustrator_AI5 dup begin - Adobe_Illustrator_AI5_vars begin - discardDict - { - bind pop pop - } forall - dup /nc get begin - { - dup xcheck 1 index type /operatortype ne and - { - bind - } if - pop pop - } forall - end - newpath -} def -/terminate -{ - end - end -} def -/_ -null def -/ddef -{ - Adobe_Illustrator_AI5_vars 3 1 roll put -} def -/xput -{ - dup load dup length exch maxlength eq - { - dup dup load dup - length 2 mul dict copy def - } if - load begin - def - end -} def -/npop -{ - { - pop - } repeat -} def -/sw -{ - dup length exch stringwidth - exch 5 -1 roll 3 index mul add - 4 1 roll 3 1 roll mul add -} def -/swj -{ - dup 4 1 roll - dup length exch stringwidth - exch 5 -1 roll 3 index mul add - 4 1 roll 3 1 roll mul add - 6 2 roll /_cnt 0 ddef - { - 1 index eq - { - /_cnt _cnt 1 add ddef - } if - } forall - pop - exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop -} def -/ss -{ - 4 1 roll - { - 2 npop - (0) exch 2 copy 0 exch put pop - gsave - false charpath currentpoint - 4 index setmatrix - stroke - grestore - moveto - 2 copy rmoveto - } exch cshow - 3 npop -} def -/jss -{ - 4 1 roll - { - 2 npop - (0) exch 2 copy 0 exch put - gsave - _sp eq - { - exch 6 index 6 index 6 index 5 -1 roll widthshow - currentpoint - } - { - false charpath currentpoint - 4 index setmatrix stroke - } ifelse - grestore - moveto - 2 copy rmoveto - } exch cshow - 6 npop -} def -/sp -{ - { - 2 npop (0) exch - 2 copy 0 exch put pop - false charpath - 2 copy rmoveto - } exch cshow - 2 npop -} def -/jsp -{ - { - 2 npop - (0) exch 2 copy 0 exch put - _sp eq - { - exch 5 index 5 index 5 index 5 -1 roll widthshow - } - { - false charpath - } ifelse - 2 copy rmoveto - } exch cshow - 5 npop -} def -/pl -{ - transform - 0.25 sub round 0.25 add exch - 0.25 sub round 0.25 add exch - itransform -} def -/setstrokeadjust where -{ - pop true setstrokeadjust - /c - { - curveto - } def - /C - /c load def - /v - { - currentpoint 6 2 roll curveto - } def - /V - /v load def - /y - { - 2 copy curveto - } def - /Y - /y load def - /l - { - lineto - } def - /L - /l load def - /m - { - moveto - } def -} -{ - /c - { - pl curveto - } def - /C - /c load def - /v - { - currentpoint 6 2 roll pl curveto - } def - /V - /v load def - /y - { - pl 2 copy curveto - } def - /Y - /y load def - /l - { - pl lineto - } def - /L - /l load def - /m - { - pl moveto - } def -} ifelse -/d -{ - setdash -} def -/cf -{ -} def -/i -{ - dup 0 eq - { - pop cf - } if - setflat -} def -/j -{ - setlinejoin -} def -/J -{ - setlinecap -} def -/M -{ - setmiterlimit -} def -/w -{ - setlinewidth -} def -/XR -{ - 0 ne - /_eo exch ddef -} def -/H -{ -} def -/h -{ - closepath -} def -/N -{ - _pola 0 eq - { - _doClip 1 eq - { - _eo {eoclip} {clip} ifelse /_doClip 0 ddef - } if - newpath - } - { - /CRender - { - N - } ddef - } ifelse -} def -/n -{ - N -} def -/F -{ - _pola 0 eq - { - _doClip 1 eq - { - gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc - /_doClip 0 ddef - } - { - _pf - } ifelse - } - { - /CRender - { - F - } ddef - } ifelse -} def -/f -{ - closepath - F -} def -/S -{ - _pola 0 eq - { - _doClip 1 eq - { - gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc - /_doClip 0 ddef - } - { - _ps - } ifelse - } - { - /CRender - { - S - } ddef - } ifelse -} def -/s -{ - closepath - S -} def -/B -{ - _pola 0 eq - { - _doClip 1 eq - gsave F grestore - { - gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc - /_doClip 0 ddef - } - { - S - } ifelse - } - { - /CRender - { - B - } ddef - } ifelse -} def -/b -{ - closepath - B -} def -/W -{ - /_doClip 1 ddef -} def -/* -{ - count 0 ne - { - dup type /stringtype eq - { - pop - } if - } if - newpath -} def -/u -{ -} def -/U -{ -} def -/q -{ - _pola 0 eq - { - gsave - } if -} def -/Q -{ - _pola 0 eq - { - grestore - } if -} def -/*u -{ - _pola 1 add /_pola exch ddef -} def -/*U -{ - _pola 1 sub /_pola exch ddef - _pola 0 eq - { - CRender - } if -} def -/D -{ - pop -} def -/*w -{ -} def -/*W -{ -} def -/` -{ - /_i save ddef - clipForward? - { - nulldevice - } if - 6 1 roll 4 npop - concat pop - userdict begin - /showpage - { - } def - 0 setgray - 0 setlinecap - 1 setlinewidth - 0 setlinejoin - 10 setmiterlimit - [] 0 setdash - /setstrokeadjust where {pop false setstrokeadjust} if - newpath - 0 setgray - false setoverprint -} def -/~ -{ - end - _i restore -} def -/O -{ - 0 ne - /_of exch ddef - /_lp /none ddef -} def -/R -{ - 0 ne - /_os exch ddef - /_lp /none ddef -} def -/g -{ - /_gf exch ddef - /_fc - { - _lp /fill ne - { - _of setoverprint - _gf setgray - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - ashow - } ddef - /_pjsf - { - _fc - awidthshow - } ddef - /_lp /none ddef -} def -/G -{ - /_gs exch ddef - /_sc - { - _lp /stroke ne - { - _os setoverprint - _gs setgray - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/k -{ - _cf astore pop - /_fc - { - _lp /fill ne - { - _of setoverprint - _cf aload pop setcmykcolor - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - ashow - } ddef - /_pjsf - { - _fc - awidthshow - } ddef - /_lp /none ddef -} def -/K -{ - _cs astore pop - /_sc - { - _lp /stroke ne - { - _os setoverprint - _cs aload pop setcmykcolor - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/x -{ - /_gf exch ddef - findcmykcustomcolor - /_if exch ddef - /_fc - { - _lp /fill ne - { - _of setoverprint - _if _gf 1 exch sub setcustomcolor - /_lp /fill ddef - } if - } ddef - /_pf - { - _fc - _eo {eofill} {fill} ifelse - } ddef - /_psf - { - _fc - ashow - } ddef - /_pjsf - { - _fc - awidthshow - } ddef - /_lp /none ddef -} def -/X -{ - /_gs exch ddef - findcmykcustomcolor - /_is exch ddef - /_sc - { - _lp /stroke ne - { - _os setoverprint - _is _gs 1 exch sub setcustomcolor - /_lp /stroke ddef - } if - } ddef - /_ps - { - _sc - stroke - } ddef - /_pss - { - _sc - ss - } ddef - /_pjss - { - _sc - jss - } ddef - /_lp /none ddef -} def -/A -{ - pop -} def -/annotatepage -{ -userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse -} def -/XT { - pop pop -} def -/discard -{ - save /discardSave exch store - discardDict begin - /endString exch store - gt38? - { - 2 add - } if - load - stopped - pop - end - discardSave restore -} bind def -userdict /discardDict 7 dict dup begin -put -/pre38Initialize -{ - /endStringLength endString length store - /newBuff buffer 0 endStringLength getinterval store - /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store - /newBuffLast newBuff endStringLength 1 sub 1 getinterval store -} def -/shiftBuffer -{ - newBuff 0 newBuffButFirst putinterval - newBuffLast 0 - currentfile read not - { - stop - } if - put -} def -0 -{ - pre38Initialize - mark - currentfile newBuff readstring exch pop - { - { - newBuff endString eq - { - cleartomark stop - } if - shiftBuffer - } loop - } - { - stop - } ifelse -} def -1 -{ - pre38Initialize - /beginString exch store - mark - currentfile newBuff readstring exch pop - { - { - newBuff beginString eq - { - /layerCount dup load 1 add store - } - { - newBuff endString eq - { - /layerCount dup load 1 sub store - layerCount 0 eq - { - cleartomark stop - } if - } if - } ifelse - shiftBuffer - } loop - } if -} def -2 -{ - mark - { - currentfile buffer readline not - { - stop - } if - endString eq - { - cleartomark stop - } if - } loop -} def -3 -{ - /beginString exch store - /layerCnt 1 store - mark - { - currentfile buffer readline not - { - stop - } if - dup beginString eq - { - pop /layerCnt dup load 1 add store - } - { - endString eq - { - layerCnt 1 eq - { - cleartomark stop - } - { - /layerCnt dup load 1 sub store - } ifelse - } if - } ifelse - } loop -} def -end -userdict /clipRenderOff 15 dict dup begin -put -{ - /n /N /s /S /f /F /b /B -} -{ - { - _doClip 1 eq - { - /_doClip 0 ddef _eo {eoclip} {clip} ifelse - } if - newpath - } def -} forall -/Tr /pop load def -/Bb {} def -/BB /pop load def -/Bg {12 npop} def -/Bm {6 npop} def -/Bc /Bm load def -/Bh {4 npop} def -end -/Lb -{ - 4 npop - 6 1 roll - pop - 4 1 roll - pop pop pop - 0 eq - { - 0 eq - { - (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard - } - { - - /clipForward? true def - - /Tx /pop load def - /Tj /pop load def - - currentdict end clipRenderOff begin begin - } ifelse - } - { - 0 eq - { - save /discardSave exch store - } if - } ifelse -} bind def -/LB -{ - discardSave dup null ne - { - restore - } - { - pop - clipForward? - { - currentdict - end - end - begin - - /clipForward? false ddef - } if - } ifelse -} bind def -/Pb -{ - pop pop - 0 (%AI5_EndPalette) discard -} bind def -/Np -{ - 0 (%AI5_End_NonPrinting--) discard -} bind def -/Ln /pop load def -/Ap -/pop load def -/Ar -{ - 72 exch div - 0 dtransform dup mul exch dup mul add sqrt - dup 1 lt - { - pop 1 - } if - setflat -} def -/Mb -{ - q -} def -/Md -{ -} def -/MB -{ - Q -} def -/nc 3 dict def -nc begin -/setgray -{ - pop -} bind def -/setcmykcolor -{ - 4 npop -} bind def -/setcustomcolor -{ - 2 npop -} bind def -currentdict readonly pop -end -end -setpacking -%%EndResource -%%EndProlog -%%BeginSetup -%%IncludeFont: Univers -Adobe_level2_AI5 /initialize get exec -Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec -Adobe_ColorImage_AI6 /initialize get exec -Adobe_Illustrator_AI5 /initialize get exec -[ -39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis -/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute -/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde -/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex -/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls -/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash -/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef -/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash -/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef -/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe -/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide -/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright -/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand -/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex -/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex -/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla -/hungarumlaut/ogonek/caron -TE -%AI3_BeginEncoding: _Univers Univers -[/_Univers/Univers 0 0 1 TZ -%AI3_EndEncoding AdobeType -%AI5_Begin_NonPrinting -Np -8 Bn -%AI5_BeginGradient: (Black & White) -(Black & White) 0 2 Bd -[ -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 %_Br -[ -0 0 50 100 %_Bs -1 0 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Green & Blue) -(Green & Blue) 0 2 Bd -[ -< -99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 -A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 -B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 -C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 -D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 -E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 -F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF -> -< -000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D -1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B -3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 -5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 -78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 -96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 -B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF -> -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 -1 %_Br -[ -1 0.75 0 0 1 50 100 %_Bs -0.6 0 1 0 1 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Pink, Yellow, Green) -(Pink, Yellow, Green) 0 3 Bd -[ -< -00000000000000000000000000000000000000010101010101010101010101010101010101010101 -01010101010202020202020202020202020202020202020202020203030303030303030303030303 -03030303030303030404040404040404040404040404040404040404050505050505050505050505 -05050505050505060606060606060606060606060606060606060707070707070707070707070707 -07070707080808080808080808080808080808080809090909090909090909090909090909090A0A -0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C -0C0C0C0C0C0C0C0D0D0D0D0D -> -< -050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 -17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F -2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A -4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 -69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 -88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 -A9AAABACADADAEAFB0B1B2B2 -> -< -CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 -B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B -9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B -7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 -5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 -3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C -0B0A09080706050403020100 -> -0 -1 %_Br -< -737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E -4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D -2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 -1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 -020201010101010000000000 -> -< -00000000000000000000000001010101010101010101010101010101010101010101010102020202 -02020202020202020202020202020202020202020202030303030303030303030303030303030303 -03030303030303030303030303040404040404040404040404040404040404040404040404040404 -04040404040404040404050505050505050505050505050505050505050505050505050505050505 -050505050505050505050505 -> -< -BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 -C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 -C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA -CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC -CCCCCCCCCCCCCCCCCCCCCCCC -> -0 -1 %_Br -[ -0.05 0.7 0 0 1 50 100 %_Bs -0 0.02 0.8 0 1 57 36 %_Bs -0.45 0 0.75 0 1 37 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Purple, Red & Yellow) -(Purple, Red & Yellow) 0 3 Bd -[ -0 -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A -> -< -CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 -D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC -DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 -E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED -EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 -F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE -FEFEFEFFFFFF -> -0 -1 %_Br -< -E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE -BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 -9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E -6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 -4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E -1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 -> -< -E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA -EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE -EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 -F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 -F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC -FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF -> -< -00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 -242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 -4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A -6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E -8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 -B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC -> -0 -1 %_Br -[ -0 0.04 1 0 1 50 100 %_Bs -0 1 0.8 0 1 50 50 %_Bs -0.9 0.9 0 0 1 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Rainbow) -(Rainbow) 0 6 Bd -[ -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -1 -0 -0 -1 %_Br -1 -< -0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E -2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 -5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E -7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 -A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE -CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 -F7F8F9FAFBFCFDFEFF -> -0 -0 -1 %_Br -1 -< -00000000000000000000000000000000000001010101010101010101010101010101010101010101 -01010101010101010101010101010202020202020202020202020202020202020202020202020202 -02020202020202020202030303030303030303030303030303030303030303030303030303030303 -03030303030304040404040404040404040404040404040404040404040404040404040404040404 -04040505050505050505050505050505050505050505050505050505050505050505050505050606 -06060606060606060606060606060606060606060606060606060606060606060606070707070707 -07070707070707070707070707070707 -> -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 -1 %_Br -< -000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -> -0 -1 -0 -1 %_Br -0 -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -1 -0 -1 %_Br -[ -0 1 0 0 1 50 100 %_Bs -1 1 0 0 1 50 80 %_Bs -1 0.0279 0 0 1 50 60 %_Bs -1 0 1 0 1 50 40 %_Bs -0 0 1 0 1 50 20 %_Bs -0 1 1 0 1 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Steel Bar) -(Steel Bar) 0 3 Bd -[ -< -FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 -D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 -AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 -87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 -5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 -37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 -0F0E0D0C0B0A09080706050403020100 -> -0 %_Br -< -000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -> -0 %_Br -[ -0 0 50 100 %_Bs -1 0 50 70 %_Bs -0 0 50 0 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Yellow & Orange Radial) -(Yellow & Orange Radial) 1 2 Bd -[ -0 -< -0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 -232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 -494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F -707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C -> -< -FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 -F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 -F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB -EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 -> -0 -1 %_Br -[ -0 0 1 0 1 52 19 %_Bs -0 0.55 0.9 0 1 50 100 %_Bs -BD -%AI5_EndGradient -%AI5_BeginGradient: (Yellow & Purple Radial) -(Yellow & Purple Radial) 1 2 Bd -[ -< -000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -> -< -1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 -393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D -5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 -83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 -A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB -CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 -F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF -> -< -ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 -908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 -7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B -5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 -403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 -25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B -0A090908070706050504030302010100 -> -0 -1 %_Br -[ -0 0.08 0.67 0 1 50 14 %_Bs -1 1 0 0 1 50 100 %_Bs -BD -%AI5_EndGradient -%AI5_End_NonPrinting-- -%AI5_BeginPalette -0 0 Pb -Pn -Pc -1 g -Pc -0 g -Pc -0 0 0 0 k -Pc -0.75 g -Pc -0.5 g -Pc -0.25 g -Pc -0 g -Pc -Bb -2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.25 0 0 0 k -Pc -0.5 0 0 0 k -Pc -0.75 0 0 0 k -Pc -1 0 0 0 k -Pc -0.25 0.25 0 0 k -Pc -0.5 0.5 0 0 k -Pc -0.75 0.75 0 0 k -Pc -1 1 0 0 k -Pc -Bb -2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0 0.25 0 0 k -Pc -0 0.5 0 0 k -Pc -0 0.75 0 0 k -Pc -0 1 0 0 k -Pc -0 0.25 0.25 0 k -Pc -0 0.5 0.5 0 k -Pc -0 0.75 0.75 0 k -Pc -0 1 1 0 k -Pc -Bb -0 0 0 0 Bh -2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0 0 0.25 0 k -Pc -0 0 0.5 0 k -Pc -0 0 0.75 0 k -Pc -0 0 1 0 k -Pc -0.25 0 0.25 0 k -Pc -0.5 0 0.5 0 k -Pc -0.75 0 0.75 0 k -Pc -1 0 1 0 k -Pc -Bb -2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.25 0.125 0 0 k -Pc -0.5 0.25 0 0 k -Pc -0.75 0.375 0 0 k -Pc -1 0.5 0 0 k -Pc -0.125 0.25 0 0 k -Pc -0.25 0.5 0 0 k -Pc -0.375 0.75 0 0 k -Pc -0.5 1 0 0 k -Pc -Bb -2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0 0.25 0.125 0 k -Pc -0 0.5 0.25 0 k -Pc -0 0.75 0.375 0 k -Pc -0 1 0.5 0 k -Pc -0 0.125 0.25 0 k -Pc -0 0.25 0.5 0 k -Pc -0 0.375 0.75 0 k -Pc -0 0.5 1 0 k -Pc -Bb -2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.125 0 0.25 0 k -Pc -0.25 0 0.5 0 k -Pc -0.375 0 0.75 0 k -Pc -0.5 0 1 0 k -Pc -0.25 0 0.125 0 k -Pc -0.5 0 0.25 0 k -Pc -0.75 0 0.375 0 k -Pc -1 0 0.5 0 k -Pc -Bb -2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.25 0.125 0.125 0 k -Pc -0.5 0.25 0.25 0 k -Pc -0.75 0.375 0.375 0 k -Pc -1 0.5 0.5 0 k -Pc -0.25 0.25 0.125 0 k -Pc -0.5 0.5 0.25 0 k -Pc -0.75 0.75 0.375 0 k -Pc -1 1 0.5 0 k -Pc -Bb -0 0 0 0 Bh -2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg -0 BB -Pc -0.125 0.25 0.125 0 k -Pc -0.25 0.5 0.25 0 k -Pc -0.375 0.75 0.375 0 k -Pc -0.5 1 0.5 0 k -Pc -0.125 0.25 0.25 0 k -Pc -0.25 0.5 0.5 0 k -Pc -0.375 0.75 0.75 0 k -Pc -0.5 1 1 0 k -Pc -0 0 0 0 k -Pc -0.125 0.125 0.25 0 k -Pc -0.25 0.25 0.5 0 k -Pc -0.375 0.375 0.75 0 k -Pc -0.5 0.5 1 0 k -Pc -0.25 0.125 0.25 0 k -Pc -0.5 0.25 0.5 0 k -Pc -0.75 0.375 0.75 0 k -Pc -1 0.5 1 0 k -Pc -PB -%AI5_EndPalette -%%EndSetup -%AI5_BeginLayer -1 1 1 1 0 0 0 79 128 255 Lb -(Layer 1) Ln -0 A -800 Ar -0 J 0 j 1 w 4 M []0 d -%AI3_Note: -0 D -0 XR --4014 283.5 m -4626 283.5 L -(N) * -453.5 4716 m -453.5 -3924 L -(N) * -85 4716 m -85 -3924 L -(N) * --4014 765.5 m -4626 765.5 L -(N) * -0 To -1 0 0 1 234 722 0 Tp -TP --18.8794 0 Td -0 Tr -0 O -0 g -/_Univers 10 Tf -0 Ts -100 Tz -0 Tt -1 TA -%_ 0 XL -36 0 Xb -XB -0 0 5 TC -100 100 200 TW -0 0 0 Ti -1 Ta -0 0 2 2 3 Th -0 Tq -0 0 Tl -0 Tc -0 Tw -(window) Tx -(\r) TX -TO -0 To -1 0 0 1 200 696.5 0 Tp -TP --15.5444 0 Td -0 Tr -(button) Tx -(\r) TX -TO -0 To -1 0 0 1 268 696.5 0 Tp -TP --13.8867 0 Td -0 Tr -(frame) Tx -(\r) TX -TO -0 To -1 0 0 1 234 671 0 Tp -TP --27.7661 0 Td -0 Tr -(radiobutton) Tx -(\r) TX -TO -0 To -1 0 0 1 302 671 0 Tp -TP --27.7661 0 Td -0 Tr -(radiobutton) Tx -(\r) TX -TO -0 R -0 G -200 705 m -234 719 l -268 705 l -S -234 679.5 m -268 693.5 l -302 679.5 l -S -LB -%AI5_EndLayer-- -%%PageTrailer -gsave annotatepage grestore showpage -%%Trailer -Adobe_Illustrator_AI5 /terminate get exec -Adobe_ColorImage_AI6 /terminate get exec -Adobe_typography_AI5 /terminate get exec -Adobe_level2_AI5 /terminate get exec -%%EOF Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/image.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/image.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/image.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/image.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/image.ps 1996-11-23 13:00:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/image.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,2103 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/image.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 317 357 460 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 468 string def - -% define space for color conversions -/grays 156 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 317 translate - -% size of image (on paper, in 1/72inch coords) -156.02400 142.99200 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -156 143 8 % dimensions of data -[156 0 0 -143 0 143] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 - -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 -000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000 -000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000 -000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080000080ffffff000080000080ffffff000080000080ffffff -ffffff000080ffffffffffff000080000080000080000080000080000080000080ffffff -ffffff000080ffffff000080ffffffffffffffffff000080ffffffffffffffffff000080 -000080000080ffffffffffffffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffffffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffffffffff000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080ffffff -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080000080000080000080000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffffffffffffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffffffffffffffffffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080ffffff -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffffffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000 -000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffffffff000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080ffffffffffff000080000080 -ffffffffffff000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffff737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373000000ffffff737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373000000000080 -000080ffffff737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffffffffffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000080 -000080000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99c8c6fa5906b9c8c6fa58c7baf9f94a08883a4a196a1988d948677 -a1988da08883a088839687879687879687879687879687878e7778a1988d948677a3908c -8e7778a4a196a08883a1988da3908cb19ca3b19ca3b19ca3b1a8a2a1988db7b5a0a4a196 -b1a8a2a3908c948677a1988daf9f94948677a4a196a4a196bfadb0a4a196bcb8aea1988d -a08883a0947f948677b9ada5a1988da0947fb1a488a08883a4a196a08883a4a196a4a196 -a4a196bda49ebfadb0968787b9ada5c7beb3cebdada4a196bcb8aed7d1c0bcb8aeb1a8a2 -b1a8a2a4a196948677a4a196a3908c968787a4a1968e7778b19ca3a1988da4a196a1988d -a4a196c7beb3c7beb3c7beb3a4a196b19ca3a4a196a4a196a1988da1988db1a8a2b7b5a0 -a3908ca4a196a3908cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b5947b9c7b63bd94848e6352cea594bd9c94a58c7ba08883b99c8c -a58c7bc6ad94a58c7bc6a594a58c7ba58c7ba0947fb19494a58c7b9c8c6faf9f94b19494 -a3908ca1988dc6b598b1a8a2bcb8aec7beb3bfadb0b1a8a2a4a196b1a8a2b2aa94b9ada5 -b1a8a2a0947faf9f94bd9c94a0947faf9f948c7f6ba4a196a0947fbda49ea4a196c6b598 -948677af9f94af9f94a4a196b1a488d0ba99ad9c84bda49ec6a5a0bda49ea08883a4a196 -a088838e7778bda49eb1a8a2d7d1c0d2c7afc6b598eddfc8d7d1c0d7d1c08c7f6bad948c -caab9ea58c7bceb59cccb1abaf9f94bda49eaf9f94d2c7afa0947fd7d1c0d7d1c0eddfc8 -b1a8a2b7b5a0bcb8aea3908ca4a196d7d1c0bfadb0a4a196a4a196c7beb3d2c7afb1a8a2 -b1a8a2eddfc8b1a8a2d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9bd8c73b57f6bbd8c73a7735dc08c7e9c675a8c634aa57f679c735e -bd8c739c7352ad7367996d478c634a9c7352ad7b63ad8c7bc6a58cb58c73a5846bb19494 -846b6e968787b19494a4a196a4a196b7b5a0b1a8a2d2c7afc7beb3d2c7afb9ada5c7beb3 -ccb1abd7d1c0e4bda2bdaa91c6ad94ad9484caab9ead9c84c6b598c6b598caab9ea58c7b -b59c84b99c8ca59473a0947fc6ad94bda58cc1a584a58c7bbda49e9c7b6d8c7f6b948677 -ceb59cb19494af9f94a4a196a4a196af9f947d584a9c8c63948463ceb594a5846b9c735e -ad9473a57f67ad946bad9c73ad9473c6ad8cad9473947b63b1a488b1a488bdb594a3908c -bcb8aeb9ada5bda49ebcb8aea3908cb1a8a2bcb8aea1988db9ada5b7b5a0a0947fbcb8ae -b7b5a0a1988dbda49ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9daa08caa7052daa08cda9c848d4938a7735d996040a7735d985e52 -9c7352da9c8490573d90573d8d4938996040bd9168b57f6be2b399ad7e4f9c7b63d6b9a9 -6750438e777880695eb1a8a2d7d1c0eddfc8d2c7afd2c7afad9c84c6b598b19ca391706d -9473637d584a7d584ac69c8c7d584a9c7b63a5846ba5906bcaab9ec6ad8cbda58c886b46 -a5846b9c7b63886b46948677bd9c7b9f7e5ab5947b8c634a9c7b6d67504383584dad947b -b99c8cbd9c942b181c4f362fd5c2bead947b8c634aa5845aad8c6bad8c6bb58c738c634a -906f4ee4bda2c69c73906f4ebd9c73ad946bad9473a5906bad9c7bd6b9a9b1a488af9f94 -a08883a0947fa0947fa1988da4a196cebdada08883c7beb3a0947fb1a8a2a4a196c6b598 -b2aa94b59c84b1a488d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99c7352e2b3999c7352a36150bd9168c69473a7735dad8463462113 -ad7b6b9c675ab57f6b844832b77b5dbd9168d69c7bd0927ba77047b58456b58c73cea594 -a088832d0f0b5e4542d7d1c0c7beb3ad9c84a59473b59c7b947b63846b6e5e4542675043 -7d584a462113986d5e9c7352906f4e906f4ec69c84a5906ba57f67bd9c7bad94738c634a -7e5b39947b569c7b6379483d886040906f469c7352906f4e986d5e9c776bad8c735e3e28 -ad947bc69c942d0f0b2b181cb7b5a0d6b9a9ad846b9f7e5a8c634ac69c84947b569c7b63 -cea58c76533e947b56cead8cb5947bcead8cbd9c84ad8c73bda58c9c8c6fa58c7bbda49e -a4a196ad948c948677a08883b2aa94ccb1ab94846ba4a196a08883af9f94af9f94a0947f -ad947ba0947fbda58cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b58c7390573d985e52996d47bd8c73b58c6bbd9473b58c739c735e -bd9484e2b399ad73679c675aad7b63a7735db57f6baa7052bd8c63bd8c63ce9c77c6a58c -5e4542250814180814d2c7afbdb5949c8c6fa5846ba5846b948677a57f679c7b6d9c7b6d -9c7b6d1b0500e2b399ad8c7bb58c6be4bda2996d47ad8c6bad846bb5947bad8c6b703d29 -7e5b398e63529c7b638e6352ad846bad8463ad7f5a844a4483584d8e63528c634aa58c63 -c69c8c99797b1000002b181cbfadb0eacba5ad7b63b58c73ad846ba5846ba57f679c7b6d -a59473a57f679c8463b58c73bd9c7b9c7b63b5947bad9484c6ad94d6b9a9caab9e9c9178 -ccb1abbdaa91a08883bdb594b19494ad9c84a08883948677a1988da0888380695e948677 -a5846b80695e947b63d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9bd947b996d47906f4ea7735dc08c7e985e52b58c73bd947b844a44 -ad8c739c675a9c73528d49389c675aad7b63b57f6bb57f6bda9c84e2b399b5946b947b63 -2b181c2b181c100008d6bd98b1a4889c735e9473639c776bbd9484a5846ba5847391706d -5e3e28986d5ebd9c84bd947bad846bceb5949c7b63947b56b5947bb58c73a5846b462113 -8e63527d584a844a447e5b399c7352996d47b58c6b703d2983584d9c7b639c7b6db5946b -947b56bd9c9418001425101cc7beb3b18a87ad846bad7b63a7735d9c7b63ad8c738e6352 -a5846bad9473b5947bad846b8e6352a59473734c2e947b63a58c7bc6ad8c948677ceb59c -a58c7ba59473ad9c7baf9f94ad9484af9f94947b63b9ada5a08883ad9484a088838c7360 -94846bad948c76533ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad846bad7b6bbd8c7379483d985e52ad7b638e63529c735e906f4e -a7735dcea084985e529c7352844832a56b4eb87158d6ad96bd9473a5845a9c7b635e3e28 -210810180014100000c1a584dab28ccea594bd94848e6352a97b779c735eb5947b3b1820 -260608947363a5846b734c2ecead8c8c634ab5947b947b569c735ec69c84ad847379483d -94685a9c735e8c634a8e635279483d9c7352a7735d76533e5526179c776b9c7b63b5946b -bd948c6a5055100008180814846b6eebcfb89c7352a7735db77b5dad7b639c7b63ad8c6b -c1a5848c634aad8c63bd9c84ad8c738c634aa5906b9c7b63c1a584c1a584c1a584b1a488 -bda58cb99c8cb99c8cc6b5988c7f6b91706da088839486779c7b6d8e7778947b63948677 -80695ea08883947b63d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9bd9473b58c73906f469c7352ad846b844a44a97b778a5a58ad7b63 -c6947fa36150a77047b87158c07c66b58456cead78c08c7e8d49389f7e5aa57f67250814 -1800141800141000088c6b5ad6b9a9ad9c848c6b5a80695e9473637e5c586d463c462113 -4f362f9c7b63947b569c7b63b58c737d584aad8c6b947b56bd9473bd9c7b947b63846b52 -8e635294685a846b528c634a734c2ead846bbd91689c7352b58c739f7e5ac69c849c7b63 -ad846b6d463c10000025101c80695ecaab9ebd8c63ad7b63bd947bad8c6b9c7b63947b56 -ad8c6b906f4e886b46947b569c7352bd94738e6352ad8c6bc6a58ca5906bad9c73c6ad8c -9c8c6fb99c8c948677a0947fa0947fa1988d9c91789c847b73575580695e7e5c589c847b -80695e9c7b6d947b63d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad7b63906f46ad7b63b58c6bc08c7ecea58c986d5e986d5ec08c7e -d69c7b844832b87158ca946fd0927bdaad84daad8476533e8c634aa7735d947363350c1a -382328100008080008947b63c6ad8c552617947b6380695e947b569c7b6db594847e5c58 -7e5c58b5947bb5947bbd9c7bc1a5849c7b63bd9484bd9168bd9473b5947bbd9c7b947b56 -9c7b639c735e9c7352cea084b5947b9c7352b58c6b9c73529c73529f7e5a9c7b63a7735d -b5947b986d5e180014080008382328c6ad94cea0847e5b398c634a886040bd947376533e -ad946bb5947bad946bad7f5a947b56bd8c73734c2ead8c73b58c73c6b584b5a57bb59c7b -ad9484bda58cbda49ea0947faf9f948e77788c7f6baf9f948c736080695e735755735755 -6750438c73609c7b6dd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9bd9473bd8c73ad846bbd8c73a7735dad8473986d5e8e6352ad7367 -985e52996040844832d0927bd0927bd0927bdaad84703d298c634a996d473c160a350c1a -180008180814180008886b46ceb59cc1a584b5947bc6a58cad8c7bb5947bad8c7ba97b77 -b59484bd9c849c7352996d47bd9c7bbd947b9c776bbd9168c69c739f7e5a9c73529c735e -9c73528c634aad7b63906f4ea7735dad8463b57f6bad7e4fad8463a7735dbd9473c39565 -b58c73a97b771b0500180920382328caab9ead7f5ab58c6bd0927bad846ba7735dc1a584 -ad846b947b56ad8c7b8c634a9f7e5abd947b9c7b63ad846bb5947bc1a584b59c73bd9c84 -9c8463b59484a58c7bb19494948677a58c7bbda49ea088838c736094846ba58c7b9c8c6f -9c7b6d94846b947b63d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad846bc6947fad7b63c08c7e76533ea7735d986d5ead7367da9c84 -8d4938906f4ecea084bd9484cea594703d29844a44b57f6bb57f6bad846b7d584a675043 -2a142b10000010000876533eceb594bd9c84b5947b996d47ad846b9c7b63d6ad9694685a -846b529c735ec1a584c69c7bad8c6bb58c73ad846bcea084ad8463bd9168985e528c634a -8c634aad8463886040b58c6be2b399b58456bd8c63ad8463a77047ad8463bd9473bd8c63 -ad8c63c69c8c18001425101c100810ceb59c9c735e996d47734c2ea07b4ead846bcea084 -8c634a9c735e9c7b63bd9473c69c84bd9473bd9c7b9c7b63a57f67bd9c7bad8c6b9c7b63 -b5947bd6b9a9a59473ad9484947b63a3908ca58c7baf9f949486779c7b6da1988d9c7b6d -a08883a58c7b948677d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9985e529c7352cea084cea58c945852cea084985e529c7b63b77b5d -90573db57f6bbd94845526175a2e2779483d5a2e27844832703d29996d477d584a846b6e -180014180014100810734c2eebcfb8bd9c7beacba5cead8ccea084cea084ad846b947b56 -8c634a9c735ecead8ccea084ad8c6bbd8c73c69c7bca946fd69c7bda9c84a07b4ec69c7b -9c7352a7735dad7e4fbd9473ad8463b77b5d996040a77047c395658448329c7352bd9168 -bd9473c69c8c100000100008100008d5c2bea7735dbd9473ad846bad8463bd9473985e52 -5e3e2883584dbd947bc08c7e9f7e5a9f7e5a9f7e5abd9473906f4eb5947b996d479c8463 -bd9c7bc6a58ccea594ad9484947b63846b6ead948c9486779c847b8e7778ad947b8c7f6b -a58c7bad948cb59c84d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99c73529c675aad7b6bc08c7e9c7352b5887ba7735d985e52c08c7e -844a449c675a55261784483279483dad7367985e5290573dad7b638c634a9c7b6d3b1820 -25101c100000100810846b52eacba5d6bd98bd9c7bcea084c69c7bcea0849c735eb58c73 -bd9473bd9473ad846ba07b4eb58c73c69c7bbd9168ca946faa7052ad8463cea084a7735d -9c7352a7735dad84639c7352ad84639c7352b77b5dc69c73cea084ad7f5ab58c73c39565 -b59c73b5887b100008100008180814d6b9a9985e52bd9168ad846b9f7e5a9c735e996d47 -703d297e5b39c69c8cad846bb58c73bd9c7bcead8ccead8ca5845ab58c73ad846bcead8c -ad94739c7b63b59c7bceb59ca088839c7b6da3908c5e454280695e94846bad948c91706d -947b63846b6e947b63d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99c675a9c7352844a449c735ea9695cad7367cead8ca7735db57f6b -703d298448328d4938a5635a844a445526179c735e844832ad7b639c735e7d584a44272e -21081018001418000880695eccb1abc1a584d7c69abd9168cead8c9c735ed6ad96ad7f5a -ad8c6bbd9168c69c7bd0927bbd9473b58c6bd0927bb77b5db77b5d985e52a7735d9c7352 -9c7352886040bd9473bd9473b58c73bd8c639f7e5aa7735dbd94739c7352b5947ba5845a -bd9c7bb594842b181c080008100000c6a5a0a7735dc69c7b76533eb58c73c69c84ad8c6b -7e5b39ad84738c634a9c7b63c69c7bb58c73b59c73886b46985e528c634aad7b63b59c7b -cead8cc1a584947b63d6b9a9af9f94a088835e4542948677bda49eaf9f94ad948494846b -947b638c7360a08883d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad846b9458529c735eb5736bb58473bd8c73da9c84ad7e4fb5887b -844832844a44a5635a8d4938844832a9695c7e5b39844a44ad846b8c634a46211344272e -180014180008100008735755ebcfb8ceb594cead8cbd9c73b58c73c69c7bad846b9c7352 -ad7f5abd91689f7e5aad846bbd8c63a7735dad7f5abd9473b57f6bb57f6bb58c739f7e5a -9c73529f7e5aad7e4f9c7b63ad846b996d47bd9473ce9c77cea084c69c7bbd947bbd9c7b -bd9c7b83584d180814180008180814cea594b87158bd9c84947b568e6352a57f67886040 -8e6352a5846bc69c847e5b39986d5ead7f5a947b56b5946bb5946bb58c73ad846bad8c6b -b59c7ba5906bb1a488ad947b7e5c588c7f6bbfadb0846b6ea58c7b8c7f6b80695e91706d -91706d8c7360a58c7bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99c73529c7352ad7b6b844a44bd9473b57f6b9c73529c675a844832 -985e52844832844832703d29a97b778e63525e3e2894685a986d5e76533e8448327e5c58 -2508141000080b0319735755decaa4d2c7afd7c69aad9c73a58c639c8c63ad8c6bb5947b -b59c739f7e5aa7735db5946bad7f5ac69c73c69c73a77047ad7f5ab58456ad8c63ad7e4f -b58c73ad7f5a9c7b63b29460ad7f5abd9c7bbd94739c7b639c7b63ad947b947b638c6b5a -ad8c7344272e180008180920100000a58c7bbd9473906f46ad846b9c7b63947b56a58c7b -ad846bb5947bb5947b9c8463ad8c6ba59473bd9c84b5947bad947ba59473bd9c94ad947b -9c7b6d9c7b6dad8c73ad9c84947b63846b6ea0947f8c7360948677af9f948c7f6ba0947f -a58c7b947b63a58c7bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c395659c7352c68c84a7735dda9c84ad7e4fd0927b9c7352945852 -a5635a844a44552617ad7367906f4e8e63528c634a8c634a9c7352985e52986d5e552617 -1000081800140b0319846b52d7d1c0b1a488ceb5949c8463947b63a58c63a5846b7d584a -b58c73a57f67c1a584ad8463bd9473b58c6ba7735dca986bc39565b58c6bc39565ad7b63 -b58c73b58c73b58c739c7352c69c7bbd9473b58c73cea084b5947b947b63ad8c73b59c7b -e4bda2a08883180014100008180014bd94849c7352b58c73996d478e63529c7b639c776b -a58473bd94847e5b39bda58cc6ad8c8c7360c6a58cc6ad8cb59484b59c84947b63a5846b -a58c7bb59c84ceb59cccb1aba59473a08883a0947f91706daf9f94a0947f91706d8c7360 -91706dad948cad948cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9daa08cc08c7e9c7352ad7b63daa08cbd9168ad7b63945852a36150 -844832a7735db77b5d8d49387e5b39bd846fad846bb58c6bc6947f9c73529c735e5e3e28 -2508141800080b0319735755ebcfb8caab9ead947bceb594ad8c73d6b9a9bd9c84ad8c6b -c6a58cb5947bbd9c7b996d47bd9473d0927bb58c6bb77b5dad8463b58c6bdaa08cc69c73 -b58c739f7e5a9f7e5abd8c73bd8c73c08c7ebd9473bd9473bd947bbd9c7bb59c7bb59c73 -bd9c7bc69c8c180014180008100008ad8c7bb77b5d906f4e9c776bb58c739c7b6d8c6b5a -83584dad8c739c7b6db59c7bbd9c84ceb594bda58c8c7360947b63947b63a59473bd9c84 -a5846bbda58ca59473ad9c7bad9484a58c7b9c847b8c73608e7778a58c7b9c847b8c7360 -947b63a0947f948677d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d98d4938b57f6b9c675ada9c84da9c84b58456a56b4ea5635aa56b4e -a36150985e52a361508c634aa7735da7735d9c7352bd8c63c69c73bd9473b584738a5a58 -1b05001800082a142b846b52caab9ead947bd6b9a9b59c7bad8c73c6a58ca57f67a5906b -a5846bb5947bad846b9c7352b58c6bc69c7ba770479c7352a770479c7352bd9473ad846b -ad846bad846bb58c73ad8463c08c7ead8c63a7735dbd9168bd9168ad8c6bc69c73cead78 -cead8cceb59c2d0f0b100000250814b5887b985e529c7b6394685a7d584aa58c7b5e3e28 -9c7b6da58473947363ceb59c9c8463b59c84947b5676533ea59473a5846bb5947ba5846b -a59473a59473a59473ad947ba5846baf9f947e5c589c847b7e5c58a58c7b947b639c7b6d -af9f94a0947fcaab9ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9cea084ad7b63985e52b58c6bda9c84a56b4e9c73525526178d4938 -b87158ad7b63844832703d29844832985e529c7352daad84c08c7ecea084b99c8c735755 -210810291021080010846b52decaa4d6b9a98c6b5ad6bd98cea594c1a584bd9c7bad9c7b -ad946bc1a584b59c73ad846bad8463bd8c63ad7e4fbd8c63ad8463bd8c63ce9c77ad8c6b -ad8c63bd9473ceb594bd9473bd9c7bc69c73cea084cea084cead78c1a584c6a577cead8c -c1a5849c7b6d382328100000180814b59484985e52a57f679c7b6d8e6352986d5e8a5a58 -ad847ba58c7bcea5949c84639c7b6da5906bad8c73a5846ba59473c6a58ca59473a58c7b -a5846bc6ad94a59473a59473b99c8cad9484947b636750436d463c99797b6750439c7b6d -ad9484a5846baf9f94d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad7b63ad7b6b844a44ad8463ca946fa7735dbd846fa9695cb57f6b -b57f6b844832703d29985e529c675a985e52daad849c735e947b565a2e275a2e272b181c -25101c2a142b18001476533eebcfb8947b635e3e28947b63ceb59c9c7b6dbda58cc6ad94 -bda58cbd9c84c6a58c886040a57f67ad8c6bc69c84cea084c69c7bbd9c7bc6a58ca57f67 -9c7b6da5846bb59c84b59c848c6b5aad8c7bc6a58ca57f67b5947bceb594ad9473846b52 -4f362f21080425101c100810180014b99c8ccea0847d584a4621135526174f362f8c6b5a -ad847bad8c7bad8c73947b63947b63a59473a5846ba59473a59473b5947b9c7b63c6ad94 -bd9c949c84639c7b6d9c7b6d9c7b6d9c847b7357557d584aad8484a088839c776bb99c8c -ad8c73ad9c7bad8c73d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99c735eb5887b8c634ac08c7ee2b399cea0849c73528a5a58985e52 -703d29552617844a445526175a2e278c634ab58c6b7d584a9c847b5e3e28250814180014 -1800080800102a142bad948c5e4542350c1a38232821081021081044272e462113210810 -350c1a3b182044272e2d0f0b4621133b18205e3e285e45425a2e273b18203c160a1b0500 -21080425081444272e2108043b18201b05001b05002d0f0b2108041b05003823282d0f0b -3823281000081000000800082b181cbd9c94ad946b5a2e2746211376533ecaab9e462113 -9c776bb58c73b5947b9486779c7b63b99c8c8e635276533e886b46a5846bd0ba99ad9484 -a57f677e5c5883584d7d584a8a5a585a2e2744272e9c7b6da58c7b5e3e28846b52947363 -9c7b63b5947bad8c6bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b58c73b58c73c69c84d0927bcead789c7352bd846f94685a90573d -8c634a985e525a2e2779483d844a44ad73678c634a2606082d0f0b210810180014382328 -1800142a142b0b0319a586869687872108102508141800142b181c210810180014250814 -21081025101c1b050025101c2b181c180c08250814260608210810210804350c1a180014 -210810180014180014180c0818081418001425081424061e180008100008180014180814 -2108101800080b03191809201008088c7360886b46734c2ea97b77cea594ad8473ad8c7b -83584d734c2ead94739c7b6d9c84637d584a948463ceb59cbd9c84c6ad949f7e5a7e5c58 -9473636d463c6d463c4621135a2e275a2e278a5a5880695e5a2e271000087e5b398e6352 -b59c7bad846bb5946bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9382328180c083823283823287e5c587d584a8a5a5876533e76533e -bd9473734c2e844832844a44b58c732606083c160a18001418081418001424061e100008 -1809201808141809205e454244272e44272e44272e1800141800080b0319180920100008 -100800180c08100008100000100008180c08180c0818000818000825101c180008180008 -24061e180014180c081000082508142b181c18001425101c180814100008080008180814 -18001410000825101c10000025101c3b18204f362f44272e7e5b397e5b3983584d947b63 -56363d3b1820b5946bad847b9c776bbd9484b5947bad84739c7b6d7d584a76533e675043 -3c160a4f362f4f362f7d584a2b181c56363d6750436a505521081010000844272e7d584a -7357557d584a94846bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d925101c1800141b0500100008210804210810350c1a260608210810 -10000821081025101c38232818001424061e080010291021250814250814180c08100008 -18001425081418081491706db1949499797b99797b846b6e56363d3823282a142b25101c -18001418000818001418081429102124061e24061e2b181c2b181c210810180014180014 -250814100000180c082b181c1800081800142a142b18001410000038232825101c180014 -3823281800142910212b181c1800144f362f100008350c1a21081044272e44272e210810 -25081425081444272e4f362f3b182044272e5526173823283c160a2108102108103c160a -44272e350c1a1b05002b181c2d0f0b1000082b181c250814250814350c1a2d0f0b350c1a -3c160a2d0f0b3b1820d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d925081425101c25101c2b181c25081425101c1800142108100b0319 -2a142b0b031924061e1000081809202a142b0b03192108101b05004f362f6a50558c7360 -735755846b6e8e7778bda49eccb1abbda49e9c847bb18a8799797bad848cad948c846b6e -56363d18001418001424061e24061e24061e24061e8e77787357553823283b18202b181c -3823281000082b181c38232856363d44272e2a142b25101c382328846b6e38232825101c -2a142b24061e2a142b44272e8e7778a3908c99797b5e3e285e45427e5b39735755675043 -6750437357559c8c6f56363d4f362f5e4542735755846b6e846b6e8e77788e77788e7778 -6a5055846b6e9687877357556a50556a50556a505556363d73575573575556363d350c1a -260608260608210810d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d918081425081425081438232825101c2a142b2508142b181c2b181c -350c1a1b05002606083b18201000082508142b181c6a50556a505591706d94846ba08883 -9c847ba0947f968787bda49e7357559c847b6a50559c7b6da08883ad948c99797ba08883 -8c73607357557e5c5899797b91706d846b6e7e5c58846b6e9c7b6d91706da3908c846b6e -846b6e5e45428e7778b19ca3bfadb0b19ca3b19ca3bfadb0b19ca3bfadb0bfadb0bfadb0 -b19ca3bfadb0bfadb0b19ca3d5c2bea3908ca4a196a3908cb19494a4a196a4a196bfadb0 -d5c2bebfadb0bfadb0bfadb0bfadb0c7beb3c7beb3b9ada5bcb8aebcb8aebfadb0bfadb0 -c7beb3c7beb3b19ca3b19ca3c7beb3b19ca3b19ca3968787b19ca3968787846b6e7e5c58 -735755846b6e91706dd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d944272e5e45428e7778a3908ca3908c80695e5e454256363d2b181c -3b18204f362f99797ba97b777e5c58a58c7ba58686a3908cb19ca3a08883846b6e80695e -a1988da4a196948677bcb8ae846b6eb1a8a2a3908cb19494bd9c94a1988dad948c948677 -9c8c6fa08883a58c7ba08883a58c7ba0888394846bad948ca0888373575599797bb19494 -c7beb3b19ca3c6a5a0a4a196a3908cbfadb0b19ca3bfadb0a4a196a3908cbda49ea0947f -a4a196b1a8a2d5c2bec7beb3a1988db1a8a2af9f94bda49ec7beb3d5c2bed5c2bec7beb3 -d5c2bed5c2bebfadb0b1a8a2c7beb3c7beb3b1a8a2b1a488b9ada5c7beb3c7beb3b1a488 -b1a8a2c6b598a1988db9ada5ceb59cb2aa94b1a488a1988dbda49ea4a196a3908ca3908c -968787a3908cbda49ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9a58c7baf9f94bda49ec6b598c6a5a0af9f94ad948ccaab9ea4a196 -bfadb0a3908ca08883a3908ca3908cbfadb0bfadb0b19494a3908ca3908ca4a196a0947f -b1a8a2b99c8ca4a196a0947fb1a8a29c847bc6a5a0af9f94bd9c94a0947fccb1abbda49e -bfadb0b9ada5b19494a3908ca3908ca3908ca4a196b5887ba08883948677bd9c94b19494 -af9f94ad948ccaab9ebda49ea0947fd2c7afc6b598bda49eceb59cceb59cbdaa91b99c8c -b99c8cb2aa94a1988d9486779c9178a4a196bdb594b59c73c6ad8cb99c8cbdb594ceb594 -a58c639c8c6fc6b598b99c8cd0ba99d0ba99bdb594b1a488c6ad8cd2c7afd0ba99c6b58c -9c8c63ad9c84ceb59cc6ad94bda58cc6b58cbd9c7ba0947fd0ba99af9f94b1a8a2a4a196 -948677a1988d9c9178d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b7b5a0bda49ebda49ecebdadcaab9ec6ad94b99c8cc6a594a4a196 -af9f94b19ca38c7360b194944f362f2d0f0b180c08350c1a2d0f0b5e3e28a59473b59c84 -ad94739c8c6fad948cb59c84ceb5948e6352bdb594d6b9a9d6b9a9ad9c849c8c6f9c7b6d -a58c7bad948cbda49ebd9c94bda49ebda49eccb1abbd9c94947b637e5c58b19494af9f94 -bda58cd6b9a9ceb594d6b9a99c8c6fcaab9eceb59cc6a58cb59484c6b584ceb594dab28c -cead8cc1a584a5906b76533eb59c84947b56ad8c7bad846b9473635e3e287e5c58cead94 -9c7b636750439c847bad8c6bbd9c7bc1a584dab28cceb184bd9c7bd0ba99c6b584b59c73 -cead8c8c6b5a947b56b5947bc1a584cead8ccead78b5947bbd9c849486779c847ba1988d -a3908cb1a8a2b1a488d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d7d1c0ccb1aba08883bda49eb59c84b99c8c94685a8e6352906f4e -ad8463d0927bcea084996040a7735da7735d8e63528e63528c634aad8c73c69c8cd6bd98 -cead8cd6bd98ceb594c69c73bd9473cead8ccea084b59c73cea084d0ba99c6ad8ccead8c -bd9c7bb5947bbd9168ad9473a57f67a57f67ad8c6b9c847b6d463c6a5055bdaa91c7beb3 -bda58cbda58ca5906bad846bc69c7bbd947ba7735dad846ba7735dad8463b58456bd8c63 -a77047985e5290573d8c634ab58c73cea58cdab28cd2a575daad84bd947bcea084cead78 -b29460d2a575b5947bbd8c73bd8c73ad8c63c69c7bbd9168a5845aad8c6bad846bad7f5a -9f7e5a7e5b39cea594c69c84bd9473c69c73ad7f5adaa08cb584736d463c6750438e7778 -8e7778a4a196bda49ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9caab9ebda58c9f7e5a886b46ad8c6bad7f5abd9168d2a575c6ad8c -dab28cb5a57bc6ad8cc6ad94a5846bb99c8cbda58cbd9c94b59c84c6b584bd9c7bceb594 -b59c7b846b52c6b584a59473ceb59cceb59cbdb594cea594d0ba99decaa4bda58cbda58c -c6ad8ca5846bad9c84bda58cad9c7bbd9c849c8c6fc1a5842b181c56363daf9f94c6ad94 -caab9eb5947ba07b4ead7f5ac6a577b5946bb5946b9c7b637e5b39947b56a5845a986d5e -703d29996d47996d47906f46c39565ca946fad7e4fa77047a07b4ead7e4f886040886040 -7e5b3976533e90573d886040ad7f5a996d479c7352985e52996d47a7735d7e5b398c634a -906f4ec69c7b9c7b638c634a9c7352734c2ead7e4fa07b4ea5846b3b1820180c08b19494 -947b63a08883b7b5a0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d98c6b5ab1a488bd9c7bb59c7bbd9c7bc1a584c6a577cead8cd0ba99 -ebcfb8ceb594decaa4d6b9a9d0ba99af9f94947b63a08883a59473d6bd98d7c69ad6b9a9 -d6b9a9decaa4d6bd98d2c7afc6ad94d2c7afeacba5d2c7afdecaa4b5a98cd2c7afeacba5 -c6b598bda58ca59473b59c84ceb59cd6b9a9c6ad94c6ad8c2b181c291021a3908caf9f94 -ceb59cd6b9a9b29460ad7f5abd9168b5947bad8c6bbd9c73bd9c7bb5947bc1a584c08c7e -7e5b39b58473bd94739f7e5abd8c63ad8463d0927bbd8c63b58456ad84639f7e5ab58c73 -9c7352985e52b58c73bd8c638c634a886040ad7f5ac69c7bad846b703d29b58c73a5845a -c69c7bbd947bad8473986d5ead7b639c7352ad7f5aad7f5a83584d2d0f0b100008a08883 -a08883af9f94a4a196d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9a59473caab9ead9c7bb59c73ad946bb5a57bc6ad8cceb594c6b584 -d6bd98b1a488decaa4d6b9a9ccb1abc6b598bda49e94846bceb59cd0ba99d0ba99d2c7af -d2c7afd6b9a9d0ba99d0ba99d0ba99ccb1abd2c7afd0ba99b5a98cbdb594d2c7afebcfb8 -bda58cb99c8cb59c84bdaa91d0ba99bdaa91d2c7afbd9c7b180814180014968787bd9c94 -d5c2becead94b29460bd9473c69c7bc69c7b9f7e5ab58c73c1a5849c7b63ad8c6bd6ad96 -8c634aad846b9c7b638c634ab58c73ad7e4fc69c73b58456ad7e4fad8c639c7352ad846b -886040886040ad846b9c735e8c634ab58c73a57f67ad846bb58c73734c2eb5946b9f7e5a -bd947be2b399a57f6783584db5947b9f7e5ac1a5849c73526d463c180c0810000844272e -968787ccb1abd7d1c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ceb59cebcfb8bda58cc6ad8cb5a98cd0ba99ceb59cceb59cdecaa4 -d6b9a9ceb594ccb1abebcfb8b5a98ccebdadd2c7afb19ca3d2c7afbdb594d2c7afceb59c -d2c7afbda58cd2c7afd2c7afebcfb8d0ba99d0ba99d2c7afebcfb8eddfc8ceb594ccb1ab -b1a488ad947bbdaa91ad9c84c6ad94a59473bd9c94a5846b1800142a142b735755b2aa94 -d5c2beb59484ad8c6bad8463d0927bbd9c7bb58c73bd9c7bc1a584ad8c7bc6a58cb5947b -947b56ad8c7bad8c6bad8c6bcead8cad846bad7f5ab58c5acea084e4bda2bd9473b5947b -9c7352986d5ebd94737d584a83584dad8c73c6a58ca5846bb5947bc6b584e4bda2b58c73 -ad8c6bb58c7394685a947b63cea594a5846ba5906b4621135e454225101c2a142b25101c -846b6ea1988da4a196d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ccb1abdecaa4d0ba99d0ba99ccb1abd2c7afd7d1c0eddfc8d2c7af -decaa4ceb59cc1a584d2c7afccb1abd0ba99af9f94caab9ea58c7bbda58cc6ad8cad9c84 -cebdadccb1abd7c69ac6b598b1a488bdb594bda58cbdaa91bdaa91ad9c7bc6b58cad9c84 -bda58cb59c849c8c6f948677b5947ba58c7b9c8c6f947b6338232824061e2b181ca1988d -ceb59cbd9c94bd9c73c69c7bdab28ccea084d0927bc1a584ad8c73ad8c73b5947bad8c6b -9c776ba57f67ad9473b5947bb5947bb5946bc69c73ad8463cea084cea084b59c739c7b63 -9c735e996d47c69c7b8c7360a57f67986d5ea5947394685a9c8463bd9c7b947b63b58c73 -cead8c8c634ab59c7bbd9c84a5846bad947b8c6b5aa57f67a58c7b1808140b0319180014 -56363da4a196d5c2bed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ceb59cceb59cc6ad94d2c7afd7c69ad0ba99d2c7afc7beb3b59c73 -bd9c84ad947bb59c84b59c7bbda58cad947bb59c84bda49e8c7f6bceb59494846bb1a488 -bd9c94bdaa91a0947fc6ad8cad9c7bbda58cbda58cad9c7b9c8c6f9c8c6fb59c84948677 -a5846bbda58c948677b5947b8c7360a5846b80695ea5906b6a50550b03191b0500ad948c -d6b9a9d6b9a9c69c73ad8463bd9168ad846bc69c73c1a584b5947bbd9c84b59c7bad846b -a5906b83584d76533e8c7360a5846bbd947bb59c73cea084bd9168a57f67bd947b947b56 -9c7b63906f4ec69c849c776ba97b779c776b8e63529c8463cea594b59c7ba58c63a5845a -cead8cb5947bceb594bd9c8494685aa5846ba5906bc1a584ad948c2b181c0b0319382328 -180008a1988dd7d1c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9bd9c94d6bd98cea594ebcfb8d2c7afdecaa4bda58ca5846bb59c7b -bd947bb5947bc1a584a59473a5846ba5846bc6ad94bda49eb1a488c6ad8cad9c7bceb59c -ad948ca59473ad947bc6ad8cc6ad94947b63a5906bb1a488b59c7bb59c84886b46947363 -7d584aa59473a58c7bad8c7b846b5276533ea5846ba58c7b6a5055180014210810947b63 -e4bda2c6a58cb58456d69c7bca946fc69c7bd0927bbd9c7bb5947bb5946b947b63a57f67 -ad8c6b94736383584da58c7bcea58cb5947ba7735ddaad84a57f67947b56b58c73947b56 -947b5694685ab5946bad8c7b8e635294685aa5846ba5846ba5906b886b46b59c84bd9c7b -b5946bc69c7bc1a584bd9c7bbd9c7b8c634aad8473a5845a80695e24061e180014291021 -2d0f0ba08883d0ba99d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9a58c7bd6b9a9b59c84ceb594947b63b5947bad9473a58c7bad846b -ad8c6bbd9c7ba5846bb5947bb5947bb59c7bc1a584ad948c947b63947b63decaa4ad947b -b59c84b59c84c1a584b59c7bb59484c6ad8cb5947bad947bbd9c84a59473ad8c738c7360 -7d584a947363ad84737d584a9473636d463cb59484b58c7325101c24061e2108044f362f -ebcfb8906f4ec39565bd8c63ad8463d69c7bc69c73ad846bb59c73ad8c6b9f7e5ab5947b -a5846bad8c73a58c7bbd9c94bd94849f7e5acea084c69c7ba5845ab5947bb5947b9c7b63 -a5846bb5947bbd9473ad846b8c634a9c7b63bd947b9c7b63b5947bc6ad8cc1a584c6b584 -bd9c7bcead8ccead8cb58c73ad846b8c634aad846bad8c6394736318081424061e250814 -8c7360c6b598bdaa91d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9948463decaa4eacba5c1a5849c7b63c1a584cead8cc1a584b59c73 -ad8c6b8e6352996d479c735eb5947ba58c63b59c73a5906bceb594ad947b9c8463ad9484 -8c7360ad947ba59473a08883b99c8cb2aa94bda58ca58c7b80695e947b63a08883bd9c7b -9c7b6dc69c8483584d947363a5846b76533ea59473b59c7376533e250814180008382328 -eacba5dab28cbd9168ad7e4fb77b5dc69c7bb58c6b985e52886040bd9c84a5846bbd947b -b59c7bcea5949c8463ad8c73b5947b9f7e5aa7735dad946bbd9c7b947b56bd9c7ba59473 -ceb59ca5906bbd9c94ad8c6b94736383584db594849c7b6dad947bbda58ca5906bbd9c7b -c6ad8cc6ad8cad947b846b52a5846b947b63ceb594b1a488ad9484180c0825101c100810 -b19ca3b1a8a2ceb59cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d98c7360eddfc8c1a584947b56ad8c73d6bd98bd9c84c1a584c6ad8c -bd9c84bd9c7bb5947bc69c84bd9c7bb5947bbd9c73a58c63c1a584ad9c7ba58c7bc6a594 -a5846bad947bad947bb1a488c6b598bd9c94ad9c84b59c84ad9484ad947b9c7b63846b52 -a57f67947b6376533e8c6b5a9c776bad8c73947b637e5b3980695e1800141800085a2e27 -decaa4daad84b29460bd9168d69c7bcea084daad84c69c7bad846bc69c84c6a58cb5947b -ad8c6bad9473a5846ba5906bad846bad846bad8c6bb59c739c7b637e5b39cead8ccead8c -9c7b636d463c947b63c1a584a5846bc6a58ca59473b99c8cb5947bad9c7bc1a584ad946b -bd9c7bb1a488eacba5947363b59c84bda58cb5947bc1a584948677382328180014180008 -b19ca3a4a196d7d1c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d96d463ceddfc8b5947b94685ab5947bb5947b846b52bd9c7bad9473 -a57f67bd9c7bbd9c84c1a584ad8c6bb59c73b59c73bd9c7bb5a57bc6ad8cbd9c94d6b9a9 -ad9c84a59473b59c84c6ad94b59c84948463a58c7bc1a584ad947ba5846b947363cea594 -ad9c7b5e3e28ad8c7bb59484ad8c739c7b639c8463b59484a08883210810100000a59473 -c6b584ce9c77bd9473ca946fad7e4fad8463daad84bd9473ad8c73b5947b9c7b63cead8c -cead8cc6ad94ad8c73947b5683584da57f67ad846bb58c73b5946ba57f67b5947bad8c73 -8e6352947b639c8463ad8c739c7b639c7b639c8463bd9c84c6a58ca5906bbda58ccead8c -b5a57bcea594948463a58c7bbda58ca57f67bda58cad8c6ba594733823281b0500180814 -a3908cccb1abc6b598d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d98c7360ebcfb88e63529c7b63c6a58cad846b846b52b5947b9f7e5a -9c8463ad8c73bd9c7bbd9c7bb5947bceb184c6b584c6ad8cc1a584bda58cc1a584bd9c94 -b59c84a5846bb59484ad8c73bd9c84b59c84cead8ca58c7b947b56a57f67c6ad94a5906b -8e6352947b6383584da57f679473639c7b638c6b5ac6a58c846b6e1000082d0f0bebcfb8 -decaa4cead8ccea084c69c73daad84c39565ce9c77d6bd98cead8c9c7b63bda58c9c7352 -a5846bb5947b8e6352846b528c6b5aceb594b58c73996d479c7b63b58c73ad8c6bbd9c7b -7d584aad8c6bad8473c6b584bd9c849f7e5abda58ccead8cc1a584bd9c84bd9c7bc1a584 -bd9c84947b63c1a584947b56b5947bb59c7bad8c73c1a584bd9c844f362f2b181c250814 -846b6eaf9f94decaa4d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9bda58ccea594846b52ad846ba57f679c776bb58c73bd9c84ad8c6b -b5947bad8c6bbd9c84ad9473c1a584ceb594cead8cc6b584b59c7bc6a58cb59c84bda58c -bd9c94ad9473b99c8cb59c7bbd9c849c7b63ad8c73b5947bcea594bd9c84ad8c73ad9c7b -846b52947363947363a57f67ad8c7b947b56a5846b9c7b6d4f362f2b181c100000a59473 -d6bd98eacba5cea084ca986bca986bc6a577daad84b5946bb5947bad8c73b59484b59c73 -bd947ba5846b948463947363a5846bbd9c7b7e5b39b58c73ad846b9c73528e6352ad8c6b -8c634ac1a584ad8c73b5947b9c8463b59c7bb5947bb59c73846b52b59c7ba5906bb5947b -76533ead9473a5906bb5947bbda58cbd9c84c6ad8c8c634a9c7b63a08883250814180014 -bda49ebda49eeddfc8d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b5947ba5846b8c6b5aa57f6779483d7e5b39b58c739c7b63b58c73 -bd94739c7b63b59c7bad8c73c1a584daad84c69c73c1a584bd9c7bbda58cc6a58cb59484 -c6a594a58c7bbd9c849c7b63b59484a5846bb5947b9c7b6da59473ad8c73b59c84b59c84 -846b528c73605e3e28ad84739c776bb58c735e3e28ad947b56363d180008180008100008 -d7c69ad6bd98cea084ce9c77cea084b58c5aad7b63c1a584c69c849c7b63bd9c84ad8c6b -ad846b8e6352bda58ca5846bb99c8ca5846b947363906f4e9c7b63bd947bb5947bc1a584 -ad846bb59c7b906f4ebd9c84947b63cea594b5a57bb5947ba57f67c1a584b5947ba58473 -bd9c84947b56bd9c84c6ad8ccead8cb5947bceb594947b56ad8c739c847b180014100008 -bfadb0ad9484ad947bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9bd9c848e6352846b529c73528c634a7d584a9f7e5a7e5b39bd9473 -bd947b9c735eb5947bc69c7bb5947bc69c7bbd9c7bc6b584b5947bad9473b99c8cad8c73 -a58473947b63a58473ad8c73b594849c7b6dbd9c84a59473a58c7ba58473ad9c84b59c84 -886b465e45429c7b63a97b777e5b39a57f67a5846bad947b210810180014180814180c08 -ceb59cebcfb8c69c73cea0848c634a8c634a996d47b58473b58c739c7b639c7b639f7e5a -9c7b639c7b63b5947b8c6b5aa5846b80695ead8473a5846b8c634a9c7b63c1a584bd9c7b -8c7360a57f67c6ad8cb59c84a59473b59c7bb5947bad8c6bb59c84ad8c73a58473b99c8c -947363ceb59ccead8cc1a584c1a584b5947b947b56ad846b80695e2d0f0b1000002a142b -a3908cccb1abd7d1c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9cea5949c7b639f7e5aad7b63ad7b638c634aa7735db5946bcea084 -bd947b906f4ead846bc1a584906f4eb58c6bc69c7bdab28cc1a584ad8c73cea594ad947b -a57f679c7b6db59c849c7b6dcea594ad9484a58c7b947363a58c7ba59473948677bda58c -9484638e63528c6b5a9c7b638a5a58bd947ba5846bb59c7b21081018001424061e100000 -c6a594eddfc8c69c73ad7367844832945852985e52ad846b9c73528c634ab58c73cea084 -b59c73c69c848c6b5a947b63947b639c776bad8c73a5846b947b639f7e5abd9c84ad9473 -c1a584b59c7bc1a5847e5c58947b63a594738e6352b5a57b947b56bd948cad8c7bbd9484 -bd9c84ad8c739c7b63a57f67bd9c7bad9473a57f67a5846bad94845e454224061e180814 -bfadb0bfadb0ceb59cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ceb594947b56986d5e76533e94685a8c634abd9473bd9168a58473 -8e63528c634a9c776ba57f67c6a58cbd947bbd9c7bbd9c7bc69c84b5947bad8c6bb5947b -a57f67b59c739f7e5ab59c73c1a584886b46a59473ad8c738c7360a57f67a5906b76533e -7e5c585e4542ad9c7b846b525e3e286d463ca584737d584a25081408000808001025101c -bda49ee4bda2b294607d584a985e52b5946b996d47ad84639f7e5a9f7e5a947b568c634a -7d584a9c7b63bd9c94b59c84b59484906f4e9c7b639c7b6d735755947b63ad9c7bc1a584 -948463ad9c7bceb59476533e947b56caab9ea584739c7b6db59484a58473c6a58c8c6b5a -a5906ba5846b7e5b39a5846bbd9c7bbd947b9c7b639c7b638e63522d0f0b2a142b180014 -af9f94c6b598d0ba99d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9eacba59c776b83584d9c776b83584db584739c7352b5947b9c7352 -8c634aa58c7bad846bb99c8cb5947bc69c84c1a584b58c73c1a584c69c7bc1a584b58c73 -bd9c7b9c7b63ad846b9c84638e635276533ead947ba5847376533e886b46ad94738c7360 -846b525e3e28846b5280695e8e6352a5947383584d7357551b05001000080b0319100000 -a3908cebcfb8996d479f7e5a9c7352c08c7e9c7352ad8463bd9473ad7f5abd9c7bad8c6b -ad8c73b5947bb59484ad947ba5846bad8c7bb58c73947b63a58c7ba59473bd9c84bd9c7b -7d584abd9c7bc1a584a5846bb59c84caab9eb59c84b5947b947363947b639c8463886b46 -a59473b5947bc6a58cc6a58c9c7b63947b56947b567d584a5e3e285e4542382328180814 -b19ca3b7b5a0bda58cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c69c84846b52985e527d584a945852734c2ebd9484bd9473b58c73 -a57f67bd9473cea594bd9c84c6a58cb5947bb5947bdab28cc6ad8cb58c73a57f678c634a -b5947b9c7b63bd9c84bd9c7bc1a5849c7b6d9c7b6376533ead8c739c7b63906f4e7d584a -b59c845e3e288c736076533eceb59c76533e8e63525e4542250814210810180014100008 -a08883d6bd987e5b39a7735dad846ba7735dbd8c63ad8463b58c6bb58c73bd9473b58c73 -9c7b63cea594a5906bb59484bd9c849c7b639c735e5e3e28947b56947363a5906bbd9c7b -9f7e5aeacba5d6bd98bda58cc6a58ca594738c6b5aa594738c6b5ac6a58cc6ad8c8c7360 -cea594c6ad8cb5947b947b568e6352b5946bc1a584cea0849486775e4542382328180008 -b19ca3c6b598c7beb3d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9e2b39994685a9c7b6383584d79483db5887bad846b9c7352ad846b -947b56ad846bc1a584bd947bceb59ccea594decaa4d6bd98c1a584bd9c7bb59c73bd9c84 -c6a58cad8c7bad8c7bc6a58ccea5945e3e28ad847b6d463c947363a5846b76533ebd9484 -76533e9c7b63a5846b9c7b6d8a5a586d463ca57f67382328350c1a1800081800142a142b -bd9c94caab9eb58c73b58c739f7e5ada9c84c69c73b58c6bcea084906f46b5947b9c7b63 -ad8c6b846b527e5b398c7360906f4ead8c739c7b63ad8c73ad8473b5947b9c735eb5947b -ad8c6bb5947ba5906bad9473c6a58c947363846b528c6b5a846b52ad94739c7b63a59473 -bd9c84a5906b8c6b5aa58c63bd9c7bd6bd98ad8c6bc6ad9480695e382328180014180014 -b1a8a2a3908cd2c7afd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c6a58cb5947bad8473a97b779c7b63ad7b6bb5887b7d584aad8c6b -a5845ac69c849c7b6d9c7b638c6b5ab59c7bd6bd98c1a584c6b584c69c7bcea594ceb594 -bd9c84bd9484a57f67ad847b7d584a6d463cad848476533e986d5e83584d9c7b63846b52 -9c776b8e63528c6b5aad847b94736344272e76533e3b182056363d1800141800142b181c -bfadb0ceb594c1a584b58c73c69c84bd9c7bce9c77d2a5759f7e5a9c7b639c735ea5846b -9c776bad8c73a5846ba57f67b99c8c9c776bbd9c84bd9c7bad8c6b9c7b639c7b63c69c84 -b5947ba5846b9c776bad8c6bb1a488a59473a58473a58473c1a584bd9c84bda58cad8c73 -a5846b9c8463ad946bceb594b5947bbda58cad8c73af9f943c160a250814100000100008 -8e777880695ea0947fd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ceb59cc6a58ccaab9ed6ad9683584d9c776b79483d9c7b63a5846b -9c7b6dad8473947b63947b56ad8c73c6ad8ce4bda2ceb594c6ad8cad9473c6ad8c9c7b63 -9c735eb5947b9c776b7e5c585e3e2891706d6d463c3b18204f362f79483d846b5283584d -9c7b6d76533e5a2e274f362f5e3e28846b6e2b181c3b182056363d291021180014180014 -ceb59cd6b9a9a5906bb59484a5846bdab28cad8c6bad8c63c08c7e9c735ebd9484a58c7b -b99c8c947b56bd9484c69c8cbd9484a59473a58c7b9c7b63ad8473734c2e9c7b6da97b77 -83584d83584d7d584aad9473ad846b9c7b63b5947ba5846bad947b947b56bd9c84b5947b -947b63b5947bc1a584c6ad94ad9473a08883a58c7b99797b250814180008180814180014 -382328a4a196846b6ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b59c84a59473ad8c73a5846bc69c8c9c7b6db59c84b99c8cbd9c94 -b594849c7b6d9c7b6d947363ceb59ccea594ceb594d0ba99ad9473bd9c84c6ad94a5846b -ad846bc6a58c9c7b63846b6e8a5a584f362f6a505544272e2d0f0b9c7b63947b637e5c58 -83584d5e454276533e91706d3b182044272e25081421081024061e18001418081456363d -c7beb3cebdada59473a08883b59c7bbd9c7bb59c73bd9473c69c84a58473a08883675043 -7d584a986d5ead8473bd9484a584735e3e286d463c83584d8e63523c160a6750435e4542 -5e3e2856363d7d584a76533e7d584a947b56bd9484bd9c84c6a58cad846bc6a58cb5947b -a5846ba5906bad9473ad947bcaab9e7e5c5844272e3823281000001000082a142b2b181c -4f362fc7beb394846bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad9c84c6ad94b59c84b99c8c9c7b639c7b6d5e3e287e5c588c6b5a -7357557e5c586d463c846b52ad8c73c6ad8cc6b584c6ad9476533ead9c7ba5846bb59c7b -bd9c84e4bda2b58c7373575544272e250814462113350c1a94736380695eb59484ad948c -7d584a5a2e273b18203b182044272e2b181c21081024061e25101c1800142a142b968787 -ccb1aba0947f9c8c6f947b63a58c7bb59c7bbd9c7ba57f67bd9c846750436d463c3b1820 -76533e99797b8e63527e5c585a2e274f362f735755a57f6780695e3c160a3b1820350c1a -3b18202d0f0b6d463c8c634a947b568e6352906f4e9c735ead846bad846bb5947bad8c73 -a5906bad8c73a5906b5e3e2880695e2b181c180014100008180014291021080010180920 -a3908ca1988db99c8cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9a08883bda49e8e77785e45421800142a142b2b181c180014180014 -2508141000080b031918001418081408001025101c25101c25101c180920180014080010 -180014100008180008080008100008180014180008180014180014180014100000080010 -18001418081425101c2508141800141800140b031918001425101c180c088c7f6bccb1ab -a4a196d5c2be44272e2108046d463c7d584a5e3e2876533e5a2e275e3e285a2e2776533e -5e3e284f362f7d584a5a2e274621135a2e275a2e275e3e28675043260608350c1a350c1a -83584d9c7b6398734e76533e886b46bd9c7bc1a584bd947b947b63a5906ba5846b947b63 -b5947b9c7b6d5e3e2844272e2b181c1808141000001000081809200b03191800142b181c -80695e8c7360735755d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99c9178a1988d9c847b846b6e44272e25101c180014250814180814 -24061e38232824061e18001418001425101c1000080800080800080800101800140b0319 -0800101000081800140b03190b03190800080b03190b0319100008080008180920100810 -1800141808141800141808141800141800141800141808141800085e4542ceb59cb7b5a0 -ad94849c7b6d5e45423b182044272e5e3e2899797ba088835e3e2899797b7e5c586a5055 -91706d56363d56363d350c1a350c1aa08883bd9c94ad948c9c7b6d382328250814382328 -5e45426d463c76533e7357557e5c588c73607e5c585e45425a2e275e45426a50556d463c -5e45424f362f56363d3823281000001800141809201809201809201000083823286a5055 -b19ca3b9ada5b7b5a0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ccb1abad9c84af9f94bd9c94bda49eb19494b19494c6b598b19ca3 -a08883a3908ca3908c968787b19494a4a1966a505529102124061e1800141800140b0319 -1800141000080800080b03190b03190b0319180920080008180920180014180920180014 -25101c08000818092010000810000818081425101c210810a08883948677b1a488cebdad -d2c7afceb59cc7beb3ccb1ab3b18203c160a1000001000081b05001800142b181c250814 -3823281800142b181c18001425081425081410000025101c100000180814180014250814 -2d0f0b3823282d0f0b2b181c210810210804210810350c1a2508142b181c210810180014 -1b05002508142508141000081800142a142b180814180c08100000180814735755a4a196 -c7beb3bcb8aeb1a8a2d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b1a488ad948cceb59cbda49ed6b9a9c7beb3c6b598a0947fa58c7b -a08883ad9484bd9c94a08883af9f94b19ca3a3908cbda49e99797b5e4542180014100008 -1b0500180c081000001000001808141000082b181c44272e948677a3908ca4a196b19494 -a4a196a4a196a4a196968787968787ccb1abd5c2becaab9ed5c2bed6b9a9d6b9a9eddfc8 -ccb1abdecaa4bdb594d5c2bed6b9a9b1949480695e210804210810100008100008180014 -100008100000180014100000180c0808000810080010000818000810000810000880695e -bfadb0b1a8a2d5c2bec7beb3d5c2bed5c2bea088834f362f21081044272e5e45424f362f -2a142b99797b56363d56363dbda49e91706da08883bd9c94bda49ec6b598ccb1abc7beb3 -cebdadceb59cceb59cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9947b56ad8c73ad948c947b6394846bbd9c84ceb59cc6ad94b5947b -bd9c84c6a594a594739c7b6d83584d80695e8c6b5a947363947b63a58c7ba58c7bc6a5a0 -bd9c94caab9ead947bcaab9ed6ada5c6a58cc1a584c6ad8ccea594ad8c737d584a6d463c -675043af9f94a1988da0947faf9f948e6352ad7b63bd9484bd9c84ebcfb8b59484a5846b -9c8c639c8463948463b5947bceb594ad9473947b639c7b6dd7d1c0a3908c968787a08883 -a4a1968e7778d5c2beeddfc8d7d1c0d7d1c0cebdadd7d1c0c7beb3eddfc8eddfc8d2c7af -eddfc8d7d1c0bda49ed2c7afd6b9a9bdb594ceb59ccaab9ed6b9a9d2c7afd2c7afc6b598 -d2c7afceb59cceb59cd6b9a9c6ad8cc6ad94c1a584b5947bcea58ccea594b59c7bad846b -a5906bad947bb1a488d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c69c84e4bda2ebcfb8e4bda2e4bda2decaa4decaa4bd9c848c634a -a57f67bd9484906f4ec69c84b58c73c6a58cb5947bd6bd98c69c84cea58cbd947bc69c84 -9c7b63ad8c6bc69c7be4bda2bd9473ad7f5aad7f5ac6a577c69c73b59c73b58c73b59c7b -ad8c6b76533e67504376533e7d584aad8c6bb57f6bad846bad846b79483d4621131b0500 -260608703d29eacba5d6bd98bd9c7bcead8c906f4ead84739c7b6d2508144f362f80695e -bda49ebcb8aed5c2bebcb8aec7beb3d0ba99d0ba99948677cea594d0ba99d0ba99bdb594 -ad9c7b9c8c6fd2c7afc6ad8cbdaf81c6b584d7c69ad6bd98decaa4d7c69ad0ba99d0ba99 -b5a57bdecaa4c1a584d6bd98d7c69aa58c63d7c69acea084cead8cd7c69ae2b399dab28c -ad946bad8c6bad8c6bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b57f6bc395658c634aa5846bad947bad8473ad8c7b906f4e844a44 -9c7352b5887bad7b639f7e5aad7b63ce9c77cead8ccea084b58c73ad846b9c7352ad7b6b -985e52b77b5db58c73bd8c739f7e5aa07b4ec69c73bd9c7bbd9c7bb58c73ad8c7ba5846b -9c7b6d4621134621135526175a2e27b77b5d9c73525e3e288d49385a2e277e5b395a2e27 -886040cea58cb77b5db59c73c69c73996d47906f4ead847b4f362f3823286a5055a08883 -b1a8a2d7d1c0d7d1c0d2c7afeddfc8b59c73b59c73bd9c7bb59c73c1a584bda58cb5a57b -a59473b5a57bceb594c6b58cc6ad8cb1a488c6ad8cad9473bda58cbdb594d0ba99d7c69a -c1a584decaa4c1a584bd9c7bd6bd98b59c7bd2c7afcead8cbd9c84c6ad8cc6b584ceb594 -c1a584cea594d6bd98d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b77b5dbd94738c634ab58c73ad8c73ad846bad8c7b8e6352b57f6b -a9695c945852c6947f886040bd9473c39565d0927bc69c7b9c7b639c73528448329c675a -ad7b63c69473a36150a57f67ad8c7bad846bd6ad96bd9c7bb99c8c99797b99797b83584d -79483d94685a844a44945852bd7b7bb87158c6947fd2a575cea084bd9484c68c84e2b399 -a9695caa7052c6947fbd9473ad7b63844a44844a449458526d463c1b050056363daf9f94 -d5c2bec7beb3d7d1c0d0ba99b1a488b58c73bd9473ad8c63bd9c7bc1a584a59473c6a594 -ad8c6bceb594cead8cc6b598bda58cad947bc6ad94bda58cd6b9a9c6ad94bdaa91d0ba99 -bd9c73cead8cceb594c6a58cc6ad94d6b9a9d7d1c0d2c7afc6b598bdaa91a59473b59c84 -b59c84d0ba99ccb1abd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99c7352a7735db77b5db57f6bc69c7bb57f6bbd8c739c675a7e5b39 -9458529c735ea7735dc08c7ebd9168bd9473ce9c77a7735dad7e4f9c7352985e52a56b4e -c69473a36150a36150985e52bd8c63906f4ec69c7bcea58cbd947bbd8c73bd9473886040 -9c7352945852a7735dbd8c63bd9168c39565daad84cead8cc69c73c39565c69c7bcea084 -bd8c63ad846bbd947bbd8c63ad8c63996040ad84638e63523b1820100000180920b7b5a0 -ebcfb8d2c7afd2c7af9c8463a57f67d0927bb58c73b59c73dab28ca5906bc6a58ca5906b -bd9c7bb5a57bc6b584c1a584bd9c7bad946bb59c73c6ad8cbd9c7bb5a57bd0ba99b5a57b -c6b58cd7c69aceb184bd9c7bc6b584cea594c6ad8ccaab9ea58c7ba59473a58c7bceb594 -b5a57bceb594ceb594d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ca946fb77b5dad7b63a77047bd846fc6947fad7b6b9c735e9c675a -ad7b63bd94739c7b63bd9168c69c84cead8cca946fa7735db57f6bb77b5d996040b77b5d -ad7367c69473b871589c7352886040a7735dbd9473bd9473886040a7735d9c735e886040 -703d29bd8c63985e52996040b58c6bb58c6bc69c7bbd9473b58c6bad8463b58456b58456 -ad7f5a9c73529c7b63ca946fa7735d8d4938ad7b638c634a3b1820180008080010c6b598 -c7beb3bdb594b59c7bb1a488bd9c7bbd9473bd9473cead8cceb594cea58cad9473bda58c -c1a584decaa4c1a584b5947bbd9c7bc1a584ad9473c1a584cead8cb5a57bd0ba99d2c7af -ceb594ceb594cead8cc6b584d0ba99c1a584bda58cbd9c84b59c84bda58cc6ad94bdb594 -ceb594d0ba99d2c7afd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b58c6ba7735dd0927bca946fda9c84c08c7e79483d552617734c2e -94685abd947bb58c73bd947bcea084ca946f996d47996040a7735d9c7352b57f6bda9c84 -b77b5dc08c7e985e52ad7e4fad7b63ad846bb58c6bc08c7e7e5b397e5b39bd846fa7735d -76533eb57f6b996d47b57f6bd69c7bdaad84d6ad96b58c6bb58c6bc69c7bbd8c63ce9c77 -daad84cea084c69c8cda9c849c7352ad7b63b57f6b83584d2d0f0b180014180920675043 -bdb594ebcfb8a59473bda58cbd9c7bbd947bcea084bd9c7bceb594b5947bad8c73947b63 -b59c7bc1a584b59c73b59c7bc6ad94ceb594ad8c73ad9473c6ad8cceb594ceb594c6b584 -eacba5a5906bc6b584cead8cc6b584ceb59cb1a488ceb594c6ad8cceb59cad9473bdaa91 -b5a98cd0ba99b7b5a0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b57f6ba77047b58456a7735db58c6bb5887b947b567e5c587d584a -8c634a9c7b639c7b63ad846bad7b63ad7b639458529c7352ca946fa56b4eb57f6bad7b63 -985e52a56b4e996040ad7b63d0927bbd9168c69473ad846bad7b639c7352d6ad96703d29 -cea084da9c84ad7b63da9c84ad7b6bcea084a7735dc08c7ec69c73da9c84c69c7bce9c77 -da9c84ad846bbd9473c08c7ead7b63da9c84a5635a8a5a5826060825081424061e462113 -bda49ed6b9a9ad8c73bda58cc1a584c1a584b5947bb5947bb5946bad8c73ad8c73a59473 -ad8c73bda58cd6bd98ad947bc6ad94b99c8ca5906ba5846bc1a584c6ad8cc1a584ad947b -ceb59cb59c73b5947bb5947bd0ba99b5a57bc6ad8cceb594c6ad8cb59c84a59473ceb59c -d7d1c0eddfc8b7b5a0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b57f6bca946fda9c84daad84da9c84ad7b6b83584d79483d906f4e -9c7b63bd947bad7b63ad846ba7735da7735d90573d844832a7735d9c73529c735290573d -a7735dad7b63b57f6bb57f6ba7735dbd9168c08c7e886040c08c7edaa08cc694738c634a -9c675a3c160a703d29ad7367a7735dd6ad96ad846bb58c6bad8463bd9168bd846fb57f6b -ad7e4f90573d9f7e5abd846fad7b6bad7367703d298a5a582d0f0b180014180920735755 -ceb59cc6a594b59c84a5846b9c7b63b5947bb59c73b5947bbd9c7b947b63c6ad8c9c7b63 -ceb594b5947bd0ba99c6ad94d6b9a9bda58cceb59cceb59cceb594decaa4bda58cb5947b -eacba5947b63c1a584c69c84ad9c73c6ad94b1a488a58c63ceb594c6a58cbdb594a58473 -c6b598af9f94a1988dd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9a7735dbd9473c69473cea084b57f6ba7735d94685a94685a8c634a -b58473bd947b9c7b63b58473ad846b9c675a90573d9c7352ad7b6bc08c7e76533e996040 -ad7b639c7352844832a56b4ea7735dbd9473a7735d9f7e5abd9473d6ad969c73529c675a -844a44886040b57f6b9c7352985e52b58c6bbd9473ad7b639c73529c675ab77b5dad8463 -a56b4e9c7352bd9473bd947bbd94849c675a703d29986d5e260608180014180814948677 -d6b9a9caab9ebd9c848e6352947b63b5947bb5947bbd9c7ba57f67ad8c738c7360bd9c84 -bda58cc1a5849c8c6fcea594bda58ca5846bb59c84b59c7ba5846bbda58cad8c6bceb594 -b59c7ba57f67c69c84c6a58cc6a58ca5906bceb594ceb594c1a584ad8c73947363947363 -91706d7357554f362fd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9bd9c84c69c84c68c84d0927ba7735d996d477e5b398c634a986d5e -b57f6b9c7b637d584aad7b63ad846bad7b639c735eb58473ad7b63ad846b8448329c7352 -c69473ad7367a56b4e996040daad84c08c7ea7735dcea58cbd9473bd8c73ad7b638e6352 -76533ec68c84a7735d996040dab28ceacba5c69c7bb57f6ba7735d8c634aa7735db57f6b -996d47ad7b63d0927bbd9c84c08c7e9c7352945852a97b771b0500180814180920ad9484 -bd9c94bd9c94a5846ba57f67cea58cad8c6b9c7b63ad8c6ba57f679c7b63a5846bb59484 -decaa4bda58cb59c7bceb5949c8c6f9c8c6fad8c73a5906ba5906bb5947bbd9c7bc6ad8c -b5a57ba5846bbda58cc6a58cad8c7bc1a584c6b584b5947bb99c8ccea5948e6352735755 -5a2e277e5c587e5c58d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b99c8cbd947bcea084c69c7ba7735db58473945852a7735dad7b63 -bd846f9c735e9c7352c69c8cb5887b9c735ead7b6b9c675a986d5ebd8c73d6ad96c68c84 -bd846fa56b4ec08c7ea7735de2b399bd9168c1a584c69c7bb5947bad846bad846b79483d -5526179c675a985e52bd9168ca946fc39565c39565ad7b63ad7367844832b87158c69473 -aa7052bd9473d0927bbd9c7b947b56734c2e986d5ebd94842108042b181c100008a0947f -a08883d6b9a9a57f67ad847bb58c738c634acea58cc6ad8cb5947ba5906bb99c8cb5947b -c6a58ca5906bb59c7ba594737d584aad9c73c1a584b59c7bcead8cb59c7bceb594b5a57b -c6ad8cceb59cbd9c84ad847bbd947bbd9c7bc1a584c6a594c1a58483584d9c7b6d6d463c -8a5a586d463c7d584ad9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99c7352daa08cad7b639c675aad73679c7b6394685a846b529c7352 -9c735e906f4e8e6352b5947bad846b7d584aa7735d9c8c6fc1a584ad8c73ad846b9c7352 -ad846b996d47cead8c90573d734c2ead846bad8c6bb5947bb5947b906f4eb5947b844a44 -844a44734c2ead8463ad8c63c39565c08c7ead7e4fb57f6bbd8c639f7e5aa7735dad846b -947b56ad8463b59c73b58c739f7e5a886040ad846bad7b6b21081024061e180920735755 -bda49ed0ba99bda58ca57f67986d5e734c2ebd9484bd9c7bad9473a58c7bbd9c7bb59484 -ceb59cb5947bbd9c7ba5846bad9c84c6a594846b52c6ad8cc6ad94b59c7bad94739c8463 -947b56b5947b9c7b6dad8c73ad8473b5947bb99c8cc6b584bd9c7b846b529c7b6d734c2e -6750437357557e5c58d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9552617d0927bad846b844a449c675a734c2e79483d8c6b5a9c7b63 -986d5ec69c8ca5846b947363ad8c7b886040bd9473a5846bb59c84ad8c739c7b63ad846b -bd947b9c7b63bd9473ad7b63bd9c7bcea58cbd9c84b5947bbd9473a5846b996d47552617 -844832ad7b63bd9473bd9473ce9c77daad849c7352b57f6ba7735dad7e4fbd8c73bd9473 -bd9473cea58cd6ad96bd9c7bad846b703d29c08c7ea57f672508141000080b0319af9f94 -b99c8cb1a488947b639c7b6da97b779c7b63bd8c73ad8c73bd9c84a5846b9c7b63947b56 -7d584aad8c6bc1a584948677cea594ad947ba59473c6a58cad947bad94739c8463c6ad94 -b59c7bb5947bad8c73ad8c7bc69c84bd9c84ceb59cd6bd98bda58c734c2e8c6b5a7e5c58 -76533e8c73605e4542d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9703d29bd8c739c675aad7b6b703d2976533e76533e7d584a844a44 -b58c73ad9473ad8c7bcea594c69c8c985e529f7e5abd9c84c6ad94b5947bad846b9c7b63 -cead8cb58473a57f67bd947bd6b9a9bd947ba5846b9c7b63ad846bbd9c848e635279483d -ad7367ad846bc69c7b7e5b39dab28ccea58cb58c6bb58c6ba7735d906f4ead846bad846b -9c7b63ad8c73ad8c6b9c7b63cead8cb58c73bd947383584d21080424061e180920af9f94 -bda58cd6bd98b5947b886040a57f67b5887bad846bb5947bad8c6bc6ad8ca58473bd9c84 -a594739c7b63bd9c7ba5846bc6ad94ad947bceb59cc6a58cc1a584bda58cd6b9a9c6ad8c -b59c7bad9473c6a58cbd9c84cea594b59c84cea594ad947b76533e947b638a5a58ad847b -9c847b8c6b5a8c6b5ad9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad7b6bad7367b584738e6352844a4483584d8a5a58703d29bd9c84 -a5846b8c6b5aa57f678a5a58ad846bbd8c739c675aa5906bb5947b9c7b63b58c73ad846b -d6b9a9c69c84b5947b9c7b63bd9c84a58c7bb99c8cc6a58cad8c7bc69c8c986d5e9c675a -9f7e5ac69c84ad846bad846bcea084a57f67906f4eb58c73b5887bad846bb58c73bd9c84 -b58c73a58c7bbd9c84e4bda2bd9c7b9c73529c735ead8c7b350c1a25101c0b0319846b6e -a59473decaa4ad8c6b9c7b639c7b63cea0848c634acead8cb5947bc6a58c947b56ad8c7b -caab9ead8c6bcea594bdb594c6a58cc6a58ccea594ad9c7bc6a594a5906bcea594ad9c84 -ad9c7bb5947bc6ad8cc6ad8cc6ad94b59c84ad9c84ceb59cad948cad847b947b6391706d -8a5a588c6b5a80695ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad7b63b5887bad7b639c675a79483da97b77703d298a5a58b58c73 -a5846ba97b778e635283584d9c776b734c2eb58473c69c84c69c8cb5947bbd9484b5947b -ad8c739c7b6d906f4e9c776ba58473b5947bc6a58cc6a594b5947bad7b6b94685a7d584a -9f7e5a9c735ecead8ccea084ebcfb89c7b63c6a58ca57f67c6a594a58c7bad8473cea594 -b5947ba58473cea594c6ad8cbd947bc69c84c08c7e9c7b631b050018000818092044272e -a58c7bbd9c7bb5946b8c634abd947bb5947bb5946b9f7e5acead8cbd9c84b99c8cbd947b -bda58cbda58cc1a584c6a58ca59473b5947bb59c84c6a58cd6b9a9c1a584bda58cceb59c -c6ad94c1a5849c8463ad8c73b59c7bceb59cc6b598a58c7bad847b947363ad84848a5a58 -947b634f362f5e3e28d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad73679c7352bd94848c634aad7b6bad847b9c675a986d5ead7b6b -7e5b399c776b9c7b637d584a83584db58c73b5887bbd9484b5887bcead8cad8473d6b9a9 -9c7b63b99c8cbd9484a5846bad8473ad948ca5846b947b63a58473947363906f4ec69c84 -b5947bcea084b5947be2b399b5947b8c6b5ac6ad949c7b6dd6b9a9c6a58cb59484ceb59c -b99c8cb5947bd6bd98ad947bbd947bb5947bc08c7e986d5e7357552108100b0319180c08 -ad948cc6b584c69c7b9c7b63bd9473ad8c6bc1a584ad8c6bcea084c1a584bd9c84a58473 -bda58cd6b9a9ceb59cbd9c7bbd9c84c1a584cea594c6ad8ca58c7bcea594a5846b947363 -ad947bc6ad8cbd9c7bceb594c6ad94c6a59494846ba088839c776b94736399797b76533e -a586865e3e2891706dd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad7b639c675abd8c73ad846b9c776bb584739c776b945852734c2e -9458528e6352a58c7bcea5949c7b6dc6a58c9c776bbd9473c69c8ce2b399ad947bd6b9a9 -947b56b5887bad948c9c735eb58c73cea594b59c84ad947bb5947ba5846b9c7b6da5906b -9c7b63b5947bc1a584cea58cbd9c84947b63b194948e6352bda58cb59c84a59473b59484 -bd9c7bbda58cc6ad94ceb59c9c7b639f7e5ab5887ba57f6799797b180014291021382328 -a58c7bd6b9a9ad846bdab28cad8c73ad8c73947b63ad8c6ba5845ac69c84c6ad94bd9c84 -c6ad94b99c8ca594739c735e9c7b63ad9473c6a58cb5947b9c7b63c6a594ad8c73a58473 -a58c7bad846ba57f67bd9c7bc1a584ad948c947b63947b63a58c7b7d584a7e5c5856363d -44272e44272e44272ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99c7352c6947fbd9473906f4eb5887b79483d844a44844832b57f6b -83584dad847ba97b77ad8c73a58c7bc69c8c947b56844a44bd8c73bd9c84cea594ceb59c -948677947363a5846ba57f67b58c73bd9c84b5947bad9473a59473bd9c84c6a594e4bda2 -c1a584ceb59ccead8ccea594b59484ad94849c7b6db1a488d6b9a9decaa4c6a594b59c84 -c1a584c6ad94bd9c7bc6ad94bd9c84cea58c9c735e844a44947b632108101800142b181c -c7beb3bd9484eacba5985e52ad8c737e5b39a59473cead8ccead8cb58c73c6ad94b59484 -8c7360ceb59ca5846bceb5949c7b63b5947bbd9c84ad8c73b5947ba584739c776bad8c73 -bd94849c7b63bd9c7bcead8cc6a58ca5846b675043bda58c9c776b76533e3b18206d463c -56363d5e4542735755d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ad7b63b77b5dad846ba7735dad846b8860409c675a9c7352ad7b63 -ad846bb58c6bad846bb58c73906f4e986d5ead7b6b9c7b639c7b63b58c73b58c73c69c7b -ad7b63c6ad8cad846bad8c6bc1a584c6ad8cc6a58cc6a58ccea594b59c7ba58c7bc6b584 -a57f67a58c63bda58cd7c69aad947bbda58cb59484bd9484b99c8ca58c7bbd9484bd9c84 -cead8cad9473a5846bad8c6bb99c8cb5887bcead8c9c8c6f382328180920180920100800 -ceb59cad947bc6ad8ca5906bad9c84b59c84cea084bd9c7bb59c73b59c7bb5947ba5846b -ad8c73c1a584c1a584a58c7ba58c7b986d5e947b63a58c7ba58c7ba58c7ba57f67ad9473 -bd9c7bbd9c7bb5947bcead8cbd9c848c6b5aa584739c84637e5c585e3e288a5a583b1820 -5a2e278e6352a5846bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d99960409c7352a7735d844a44985e52886040ad7b639c7352a7735d -9c7352ad846bcea58cbd9484b58473985e52bd9473b58c739c7352906f4ec08c7e9f7e5a -a7735d9c7b63ad8c73bd9c7bcead8cbd947bad8c739c7b63b5947bb5947bc69c84ad8c73 -ad9473bda58cceb59cc6ad949c7b6dad9484ad847bc6a594c6a58ccea594d6bd98bd9c84 -cea594ceb594ceb59cd6bd98c69c8ca58c7bb59c73bd947b44272e180920100000180c08 -af9f94a5906bcea594d0ba9994846ba59473b58c73947b56ad8c6bc6a58cbd9c84bda58c -b5947bbda58cbd9c7bad9484a58c7bd6b9a9b59484a5846b846b52cea594ad9473cea594 -c6b584ad8c73c6ad8cc6ad94c6a58cbda58cb99c8c947b568c73608c7360a08883a08883 -ad847b947b63ad8c7bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9985e52b87158ad7b6ba36150ad7367985e52ad7367985e52ad8463 -ad7b63c69473ad7b6b906f4ead7b6b79483d9c7352a36150985e52ad7b638c634a90573d -7e5b39ad846bc1a584bd947bad8c7bcea58c9c735ebd9473a57f67cea084bd9c7b8e6352 -a57f67c69c8cc6a594b59484947b63a58c7ba08883cea594b59c7bad9484cea594b59c84 -c6ad8cd6bd98ceb59cb59c73ad847bce9c8cc69c7bc1a5842108102508142a142b100800 -d6b9a9ceb59cc6ad94d7d1c0ad947bcea594a5906bbd947bc1a584d6bd98ad947bc6a594 -ad947bc6ad94bdb594ad8c73ad9473a5906b9c8463ad947bb5a57bd6bd98b59c7bbda58c -ad947bb1a488d6b9a9ceb594c6ad94b5947b8c7360a5846ba58c7b7d584a735755ad847b -8c7360ad847ba58c7bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c07c66aa705290573d8448328448328448328e6352a36150703d29 -90573dad846b9c675aa9695c986d5e8c634a8d4938ad7b6384483290573dd0927bc68c84 -d0927b947b56b58c73ad7b6bb58c73ad846bc08c7ead846bcea084b58c739f7e5a945852 -9c7b63c69c8cb99c8cbd9c84bd9c94c6a594b5887bd6b9a9b59c7bb5947bc1a584bda58c -cea594c6ad94bd9c84b59c73bd9484c68c84a7735dbd94733b1820291021100000180814 -ccb1abc6ad94ceb59cd7d1c0947b63b99c8cc1a584cea58ccead8cd6b9a9b5947bb99c8c -ad947bbda58ca59473ad948cd0ba99a58c7bad947bad9c7bbda58cad947ba59473b59c84 -bda58cceb59ca59473d6b9a9ebcfb8bdaa91ceb59ca58c7b9473639c847b8c6b5a8c7360 -a58473a59473b59484d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9c07c66ad6b63a5635aa5635ab5736ba5635aa5635aa56b4ead7367 -ad7b6b9c675a945852985e52844832985e52a56b4e996040b77b5dbd846fda9c84ad7b63 -ca946f9c73529c7b63ad7b63ad84739c7b63b58c73985e52b58c739f7e5aa7735d9c7352 -b57f6bc69c84bd9c7bb5947bcead8cc6ad8cbd947bc6ad8cc6a58cbd9c84bd9c84cea594 -c6a58cb5947bad8c73c1a584b5887bb5887bbd9168c69473350c1a25081425101c25101c -c6a5a0bd9c94ceb59cd7d1c0948677c6ad94cea594ceb594c1a584c6ad94c6a594ad9484 -ad948cc6ad8c9c8c6fad94849c847bbd9c94bdaa91ad948c948677ceb59cad9c84bd9c94 -8c7360d2c7afd6b9a9ad948c947b63bd9c9467504376533e947b63947b63ad847b9c7b6d -948677c69c8cb59c7bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b87158b87158985e528d4938985e52a36150a7735d90573d844a44 -a7735d844a449c735e8e63529c675ab57f6bad7367c07c66996040a361508d4938b87158 -985e529c7352bd8c73ad846b9c735ecea58c9c73529c7b63985e52c69c73ad846bad846b -b58c6bc1a584c69c7bad946bc1a584c1a584c69c7bbd947bad8c73b58c73b5947bd6ad96 -bd9484a5846b94685ab5947b844a445a2e278c634aa7735d2d0f0b180014180c08180008 -b9ada5caab9ec6ad94d2c7afd2c7afebcfb8ceb594d0ba99bda58cbda58cbd9c94a58c7b -b59c84ad9484a5846bad948ca08883a58c7bb19494ad9484948677a08883947b63b59c84 -bdaa91ad948cceb59cd6b9a9675043a088837e5c58948677ad847bbd948c948677ad8c73 -b99c8c947b56b59c84d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9a36150a77047a36150a56b4ea36150a36150a56b4e844832985e52 -ad846b83584d886040945852ad7367ad7b63a36150844832b57f6baa7052a56b4e90573d -b57f6bbd9168c69473ad846bbd8c73bd947bbd947b9c7352ad846bad84739c7b63cea084 -c69c84cead8ccead8cb59c7bd6ad96bd9c7bc69c84bd947b8c634a9c7b63c69c8ccea084 -a57f67a97b778c634a9c7b63ad847b94585290573d844a44350c1a291021180014180814 -9c7b6dad948cceb59cd7d1c0ccb1abdecaa4d7c69aad9c84bdaa91bd9c94ad9484ad9484 -8c6b5a7e5c58846b527e5c58a58c7b8c7360b59484a58c7bb99c8ca58473c6a594b59c84 -d0ba99bd9c94c6b598a088833823285e45423823283c160a5e3e2876533e83584db59c84 -bd9c84bda58cc6ad94d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9b77b5daa7052a36150a77047a7735da56b4eaa7052b8715894685a -8e635294685a9c776bc69c8cbd846fad7367a56b4eaa7052b57f6ba77047844832b77b5d -b87158c6947fa7735dc69c7bb5947bb58c73b58c73906f4e9c735e9c735e7d584aceb59c -bd9484b59c84bd9c94b59c84c6a58ca57f679c776bad7b635e3e28ad7b63cea5949c735e -79483d9c735e8e6352a58c7b6a50555a2e27945852ad7b6b3b182024061e100810180814 -a08883d6b9a9bda58cc6b598cebdaddecaa4b5a57bd0ba99d7d1c0c6b5988c7360a58c7b -6a50557d584abd9c84b99c8cad8c73a59473b59484b59c84c6a58cceb59ca5846bc6ad8c -ad9c84ad947b6a50552d0f0b3c160a3823283823287e5c585a2e27a584738c7360947b63 -a5846bb1a488b5947bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9a36150844a44996040b57f6b985e52985e528c634a90573d8c634a -b87158886040b57f6bbd8c73c08c7e9c73528c634a996d47ad7e4fb57f6b996040b77b5d -bd9168a7735dcea084734c2ead8c639f7e5aa57f679c776bb58c73947b56c69c73bdb594 -a59473a58c7ba58c7b947b637e5c587e5c584621133c160a5a2e27caab9ea58c7b9c7b6d -94685a6d463cad6b63ad847bce9c8ca9695ca57f679c847b3b1820180814100810180c08 -675043c6ad94a5906bb59c73c6b584ad947b94846ba08883947b637e5c589c7b6d675043 -846b52947b63ad947bbd9c84ad8c6bad8c6bcead8cb59c73c1a584bd9c84b99c8ccaab9e -ad847b7d584a4f362f2d0f0b38232844272e3b18205e3e285e45429c7b63a58c7bad8c73 -8c7360ad8c6ba59473d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d93c160a734c2e3c160a552617ad736779483d90573d9c7352ad7367 -c08c7e886040bd9484cea084cea58c906f4e9c675a8c634a886040a7735da7735d9c675a -9c675a76533e886040ad846b9c776b5e3e284f362f5526178c6b5aad846bcead8cc1a584 -a5906bd6bd989c7b63a57f67734c2ea7735dbd8c73b59c73cead8ca57f67bd9c7bbd947b -985e52c6947fa7735dc39565b58c6bb57f6bc6947394685a26060825081425101c180008 -8e7778ceb59ca5906ba57f67a59473b5947bad948ca5846b9486779c7b638c6b5ac6ad94 -ad947bad8c73a59473b99c8cc6a58cc1a584bd9c7bb59c7bc6ad8c947b6344272e2d0f0b -3c160a2b181c4f362f38232856363d56363d44272e5e454276533e948677b5947bb59c84 -ad947bad948cad9484d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d92d0f0b2108043b18203c160a4621135a2e277d584a94685a83584d -4621134621134621135a2e273b18207d584a7d584aad847b8a5a58986d5e7d584a5e3e28 -5a2e274621133b182044272e3c160a25081444272e3b18207d584a986d5ead8473b5947b -b5947bad846b8c634ab58c73e2b399ad7f5abd8c63dab28cce9c77a07b4ea5845aa07b4e -996040c39565a7735dd2a575ad7e4fb58456a7735d703d292d0f0b2508140b0319180814 -d5c2bebda49e80695e8c6b5a5e3e282108043b18204621136d463c76533e80695e846b52 -a58c7b9c847b9486779c7b6d8c73608c736094846b5e45423c160a1000082108041b0500 -1800081800081800141800142a142b2b181c25101c2d0f0b735755caab9eb19494947b63 -735755948677ad948cd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d93823281800142b181c2108101b05003823282108043b1820250814 -3823282508142d0f0b3823281b05001b050044272e3823281b05003b1820210810250814 -2508142508141b0500210810250814180014180014100008350c1a3b18204621135a2e27 -7d584a7d584a7e5c5894685ad6ad969c735ead8463b584737d584a9c7b638e635276533e -8e6352906f4e9c735ebd9473a7735dad7b636d463c260608210810291021180920250814 -c7beb3c7beb3d6b9a9bd9c949486778a5a587357556d463c1000082d0f0b2108043c160a -1b05002b181c3b18202b181c250814180c081b05001b05002d0f0b2b181c18001425101c -1809201800140b031918000824061e2508142508142a142b2b181c25101c21081025101c -2b181c2b181c250814d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d90b0319291021180014382328180014291021350c1a2a142b2b181c -18001424061e44272e08001029102129102125081425081425101c25101c100008210810 -2b181c350c1a2a142b2108103823282108101800143823286750436a50558a5a58382328 -1800141000081b05002508142108042108043c160a2b181c2108102606082508141b0500 -24061e2b181c25101c2d0f0b2508143b18201800141b05002a142b1800140b0319180c08 -ccb1abbda49ebda49eccb1abad948ca4a196ccb1abbfadb0d7d1c0b194942d0f0b180008 -180c082b181c21081018001418001418001424061e180814180014180014382328080010 -1809201808142a142b2a142b2a142b18001418001408001018001424061e25101c180814 -1800141800142a142bd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d92a142b18000829102118001424061e2b181c2a142b382328180014 -25101c2a142b18000825081429102129102138232829102144272e2508142b181c2d0f0b -6a50555e45427e5c5873575596878799797b80695e99797ba0888391706d9c847b99797b -5e454224061e2a142b18001424061e25101c10000024061e0b03191800142a142b180014 -24061e18081418001424061e24061e1800142910212a142b2a142b1800083823288e7778 -b9ada5b9ada5c6b598a3908c948677b19ca3a3908ca1988dbd9c94a08883bfadb0bfadb0 -b19ca36a505538232824061e25101c25101c10000029102125101c29102108001025101c -2b181c180c0818081418001425101c18081425101c24061e2a142b25101c2a142b2b181c -25101c0b031924061ed9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d97e5c5856363d4f362f382328b59484c7beb380695ebda49ec7beb3 -b19ca3a3908ca3908c56363da08883a3908cbfadb0b19494bd9c94b19ca3d5c2beaf9f94 -bda49ebda49ebd9c94c6ad94d6b9a9caab9eb99c8cb99c8cad9484ad9484bd9c94ad9484 -caab9eaf9f94846b6e18001425101c18000825101c100008180814382328382328250814 -25101c1800082b181c1808142508141808142b181c10000821080444272ead948cb19494 -ad948caf9f94b1a8a2d7d1c0d7d1c0bcb8aed5c2bec7beb3c6b598ccb1abc7beb3d5c2be -a1988dbda49e6a5055af9f94a08883a088839687878e77784f362f5e4542846b6e948677 -b2aa94b9ada5c7beb3a4a196846b6e2b181c1008006a50558e7778a3908cb1a8a2b19ca3 -8e777856363d180920d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9e4bda2cea084dab28cebcfb8caab9ecaab9ebd9c94af9f94c6b598 -bda49ed2c7afd6b9a9bda49ed6b9a9caab9ebd9c94c6a594947b63bd9c94ccb1abccb1ab -ad9c7bd6b9a9c6ad94ebcfb8cead8ccead8cd0ba99d0ba99c6b598d6b9a9d6b9a9d0ba99 -cead8cebcfb8ceb59cd5c2bed5c2bec7beb3d5c2bec7beb3d7d1c0d2c7afebcfb8ccb1ab -d0ba99c7beb3d7d1c0ebcfb8ceb59cbdaa91d6b9a9caab9ecaab9ecaab9ed6b9a9d6b9a9 -ad9c84ccb1abbcb8aed7d1c0bcb8aebcb8aed7d1c0bdb594d7d1c0ad9c84c7beb3decaa4 -d7d1c0d7d1c0bdaa91d2c7afdecaa4d2c7afcaab9eebcfb8d2c7afd2c7afd6b9a9eacba5 -ebcfb8c6b598c6a5a0b9ada5c7beb3ccb1abd7d1c0af9f94cebdadaf9f94b99c8cb1a8a2 -d5c2bec7beb3ccb1abd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 - -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373000000 - -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 - - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/line.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/line.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/line.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/line.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/line.ps 1996-11-23 13:00:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/line.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,1613 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/line.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 334 337 460 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 408 string def - -% define space for color conversions -/grays 136 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 334 translate - -% size of image (on paper, in 1/72inch coords) -136.00800 126.00000 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -136 126 8 % dimensions of data -[136 0 0 -126 0 126] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffff000000000080000080ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080000080ffffff000080000080ffffff000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080ffffffffffff000080ffffffffffff000080000080000080ffffffffffffffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffffffffffffffff -ffffffffffff000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080ffffffffffff000080000080000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffffffffffffffff -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffffffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffff -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080ffffff737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373000000ffffff -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373000000000080000080ffffff737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000080000080000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/oval.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/oval.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/oval.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/oval.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/oval.ps 1996-11-23 13:00:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/oval.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,2321 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/oval.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 311 370 459 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 507 string def - -% define space for color conversions -/grays 169 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 311 translate - -% size of image (on paper, in 1/72inch coords) -168.98400 148.03200 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -169 148 8 % dimensions of data -[169 0 0 -148 0 148] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000080000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffffffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 -000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffffffff000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 -000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080000080ffffff000080000080ffffff000080000080ffffff -ffffff000080ffffffffffff000080000080000080000080000080000080000080ffffff -ffffff000080000080000080000080ffffffffffff000080ffffffffffff000080000080 -000080ffffffffffff000080000080ffffffffffffffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffffffffff000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080000080000080000080ffffffffffff000080ffffffffffff000080000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080000080000080000080000080ffffffffffff000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080000080ffffffffffffffffffffffffffffff000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080000080000080000080ffffffffffff000080000080000080ffffffffffff -ffffff000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 -ffffffffffff000080000080ffffffffffff000080000080000080000080ffffffffffff -ffffff000080000080000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000 -000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 -000080ffffffffffffffffffffffff000080000080000080000080000080000080ffffff -000080000080000080000080000080ffffffffffffffffff000080ffffffffffffffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000 -000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000 -000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffff737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373000000ffffff737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373000000 -000080000080ffffff737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000080000080000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000ff0000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000 -000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000000000000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -000000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000000000000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000000000000000 -000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/packer1.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/packer1.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/packer1.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/packer1.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/packer1.ps 1997-05-20 23:00:48.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/packer1.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,5987 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/ntmp/packer1.ps -%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley -%%BoundingBox: 201 232 411 559 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 630 string def - -% define space for color conversions -/grays 210 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 232 translate - -% size of image (on paper, in 1/72inch coords) -210.02400 327.02400 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -210 327 8 % dimensions of data -[210 0 0 -327 0 327] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffffffffffffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffff000080000080ffffffffffff000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080000080 -000080ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff -ffffffffffff000080000080ffffff000080ffffffffffffffffff000080ffffffffffff -ffffff000080000080000080ffffffffffffffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffffffffffffffffffffff000080000080000080000080 -000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080ffffffffffff000080ffffffffffff000080000080000080000080 -000080ffffffffffffffffffffffff000080000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffffffffff000080000080000080000080000080000080 -000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -ffffffffffffffffffffffffffffff000080ffffffffffff000080000080000080000080 -000080ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff -ffffffffffff000080ffffffffffff000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffffffffff -ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080ffffffffffff000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080000080000080000080000080000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -ffffffffffffffffff000080ffffffffffff000080ffffffffffffffffffffffff000080 -000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 -000080ffffffffffffffffffffffffffffff000080000080000080000080ffffffffffff -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffffffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000000000 -000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffff737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -000000ffffff737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373000000000080000080ffffff737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000080000080000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9 -000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0ffffffd9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -d9d9d9ffffffd9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffff -d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -d9d9d9ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0ffffffd9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9c0c0c0d9d9d9ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -000000c0c0c0ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9000000c0c0c0ffffffd9d9d9ffffffd9d9d9 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9 -000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 -ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0c0c0c0d9d9d9 -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -d9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffc0c0c0ffffff -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000c0c0c0ffffff -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9 -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 -000000d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9000000 -d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000d9d9d9 -000000c0c0c0ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000c0c0c0ffffffd9d9d9000000d9d9d9 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -d9d9d9c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9c0c0c0d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffff -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffc0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/packer2.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/packer2.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/packer2.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/packer2.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/packer2.ps 1997-05-20 23:00:49.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/packer2.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,5176 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/ntmp/packer2.ps -%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley -%%BoundingBox: 201 384 540 559 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 1017 string def - -% define space for color conversions -/grays 339 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 384 translate - -% size of image (on paper, in 1/72inch coords) -338.97600 175.03200 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -339 175 8 % dimensions of data -[339 0 0 -175 0 175] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000080000080ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffffffffffffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffff000080000080ffffffffffff000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080000080 -000080ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff -ffffffffffff000080000080ffffff000080ffffffffffffffffff000080ffffffffffff -ffffff000080000080000080ffffffffffffffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffffffffffffffffffffff000080000080000080000080 -000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000 -000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080ffffffffffff000080ffffffffffff000080000080000080000080 -000080ffffffffffffffffffffffff000080000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffffffffff000080000080000080000080000080000080 -000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -ffffffffffffffffffffffffffffff000080ffffffffffff000080000080000080000080 -000080ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff -ffffffffffff000080ffffffffffff000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffffffffff -ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000 -000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080ffffffffffff000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffff000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080000080000080000080000080000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000 -000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -ffffffffffffffffff000080ffffffffffff000080ffffffffffffffffffffffff000080 -000080ffffffffffff000080000080000080ffffffffffff000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080000080000080000080000080000080000080 -000080ffffffffffffffffffffffffffffff000080000080000080000080ffffffffffff -ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080000080ffffffffffffffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000 -000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080ffffff737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373000000ffffff737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373000000000080000080ffffff737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000080000080000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9000000000000d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9 -d9d9d9000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9000000000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000d9d9d9000000d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0ffffffd9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0ffffffd9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -d9d9d9ffffffd9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffff -d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9000000d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0d9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9 -ffffffd9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -d9d9d9ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -ffffffd9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0ffffffd9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffff -d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000000d9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9c0c0c0d9d9d9ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9 -000000c0c0c0ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9000000c0c0c0ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9 -000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffd9d9d9 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffff -d9d9d9ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -d9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffffc0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9ffffffd9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0000000d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000d9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000d9d9d9d9d9d9d9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000d9d9d9000000d9d9d9d9d9d9d9d9d9 -000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000c0c0c0ffffffd9d9d9d9d9d9d9d9d9000000d9d9d9000000d9d9d9 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9000000d9d9d9000000 -d9d9d9c0c0c0d9d9d9ffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000d9d9d9c0c0c0d9d9d9ffffffd9d9d9000000d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000d9d9d9 -000000c0c0c0ffffffd9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9 -000000d9d9d9000000c0c0c0ffffffd9d9d9000000d9d9d9c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d9d9d9ffffffd9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -d9d9d9c0c0c0d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000d9d9d9000000 -d9d9d9000000d9d9d9c0c0c0d9d9d9000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0ffffffd9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9 -ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffff -d9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9ffffffd9d9d9d9d9d9c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/polygon.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/polygon.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/polygon.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/polygon.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/polygon.ps 1996-11-23 13:00:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/polygon.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,1963 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/polygon.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 327 366 460 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 495 string def - -% define space for color conversions -/grays 165 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 327 translate - -% size of image (on paper, in 1/72inch coords) -165.02400 132.98400 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -165 133 8 % dimensions of data -[165 0 0 -133 0 133] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff000000000080000080ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000 -000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000 -000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080000080ffffff000080000080ffffff000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffffffffffffffff000080000080ffffffffffff000080ffffffffffff000080 -000080000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffffffffffffffff000080000080ffffffffffff000080ffffffffffff -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffffffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080 -000080000080ffffffffffff000080ffffffffffff000080ffffffffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffffffffff000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080ffffff -ffffffffffff000080000080000080ffffffffffff000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080ffffffffffff000080000080000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080000080ffffff -ffffffffffff000080000080000080ffffffffffff000080ffffffffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -ffffffffffffffffffffffff000080000080ffffffffffff000080000080000080000080 -ffffffffffff000080000080000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000 -000000000000000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffff000080000080000080000080000080000080000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080ffffff -ffffff000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -ffffff737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373000000ffffff737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373000000000080000080ffffff737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffffffff -000080000080000080000080000080000080ffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000080000080000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000000000 -000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000000000000000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000000000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/rectangle.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/rectangle.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/rectangle.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/rectangle.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/rectangle.ps 1996-11-23 13:00:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/rectangle.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,2173 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/rectangle.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 311 364 459 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 489 string def - -% define space for color conversions -/grays 163 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 311 translate - -% size of image (on paper, in 1/72inch coords) -163.00800 148.03200 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -163 148 8 % dimensions of data -[163 0 0 -148 0 148] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080000080ffffff000080000080ffffff000080000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -000080ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff -000080000080ffffffffffffffffffffffff000080000080ffffffffffffffffffffffff -000080000080ffffffffffff000080ffffffffffff000080000080000080ffffffffffff -000080ffffffffffff000080ffffffffffff000080000080ffffffffffffffffffffffff -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080 -ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080000080 -000080000080000080ffffffffffff000080000080000080000080000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffffffffffffffffffffffffffff000080ffffffffffff000080000080000080 -000080000080000080ffffffffffff000080000080000080ffffffffffffffffffffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080ffffffffffffffffffffffffffffff -ffffff000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080000080000080000080ffffffffffff000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -ffffffffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffffffffff000080000080ffffff -ffffff000080ffffffffffff000080000080ffffffffffff000080ffffffffffff000080 -ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080ffffffffffff000080000080000080ffffffffffff000080 -000080ffffffffffffffffffffffff000080000080000080ffffffffffffffffffffffff -000080000080000080000080ffffffffffff000080000080ffffffffffffffffff000080 -ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080ffffffffffff000080000080ffffffffffffffffffffffff -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080ffffffffffff000080 -000080ffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffff737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373000000ffffff737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373000000000080000080ffffff737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffffffff -ffffffffffff000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000080000080000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff -00ffff00ffff000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/text.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/text.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/text.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/text.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/text.ps 1996-11-23 13:01:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/text.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,1767 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/text.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 340 364 459 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 489 string def - -% define space for color conversions -/grays 163 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 340 translate - -% size of image (on paper, in 1/72inch coords) -163.00800 119.01600 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -163 119 8 % dimensions of data -[163 0 0 -119 0 119] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff000000000080000080ffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080ffffffffffffffffffffffffffffffffffffffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080ffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080ffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080000080ffffff000080000080ffffff000080000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080ffffffffffffffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080ffffff -ffffff000080000080ffffffffffff000080000080ffffffffffffffffffffffff000080 -000080000080ffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080ffffff -ffffffffffffffffffffffffffffff000080000080000080ffffffffffff000080000080 -000080000080ffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080000080000080ffffffffffff000080000080000080ffffff -ffffff000080000080000080000080000080000080ffffffffffffffffffffffff000080 -000080000080ffffffffffff000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080000080000080ffffffffffff000080000080000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080ffffff000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -ffffffffffffffffffffffff000080000080ffffffffffff000080000080ffffffffffff -000080000080000080ffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0000000000000000000000000000000000000000000 -000000000000c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffffc0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080ffffffc0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080ffffff737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373000000ffffff737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373000000000080000080ffffff737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000080000080000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000 -d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9d9d9d9ff0000ff0000ff0000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000ff0000d9d9d9d9d9d9ff0000ff0000 -ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000 -ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000 -ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9 -ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000 -ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9ff0000ff0000 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000 -ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9 -ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9ff0000ff0000 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9d9d9d9ff0000 -ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000ff0000ff0000 -ff0000ff0000ff0000ff0000d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000 -d9d9d9ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000 -d9d9d9ff0000ff0000d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9ff0000d9d9d9 -d9d9d9ff0000ff0000d9d9d9ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9ff0000d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000d9d9d9 -d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000 -d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9ff0000 -ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000 -d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000 -ff0000ff0000d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9ff0000ff0000ff0000 -ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9 -d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff0000 -ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9 -d9d9d9ff0000ff0000ff0000ff0000d9d9d9d9d9d9d9d9d9ff0000ff0000ff0000ff0000 -ff0000ff0000d9d9d9d9d9d9ff0000ff0000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/gs/doc/src/pics/window.gif and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/gs/doc/src/pics/window.gif differ diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/pics/window.ps erlang-13.b.3-dfsg/lib/gs/doc/src/pics/window.ps --- erlang-13.b.1-dfsg/lib/gs/doc/src/pics/window.ps 1996-11-23 13:01:08.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/pics/window.ps 1970-01-01 01:00:00.000000000 +0100 @@ -1,3221 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: /home/eklas/erlang/gs/doc/sgml/pics/window.ps -%%Creator: XV Version 3.10 Rev: 12/16/94 - by John Bradley -%%BoundingBox: 201 303 431 459 -%%Pages: 1 -%%DocumentFonts: -%%EndComments -%%EndProlog - -%%Page: 1 1 - -% remember original state -/origstate save def - -% build a temporary dictionary -20 dict begin - -% define string to hold a scanline's worth of data -/pix 690 string def - -% define space for color conversions -/grays 230 string def % space for gray scale line -/npixls 0 def -/rgbindx 0 def - -% lower left corner -201 303 translate - -% size of image (on paper, in 1/72inch coords) -229.96800 156.02400 scale - -% define 'colorimage' if it isn't defined -% ('colortogray' and 'mergeprocs' come from xwd2ps -% via xgrab) -/colorimage where % do we know about 'colorimage'? - { pop } % yes: pop off the 'dict' returned - { % no: define one - /colortogray { % define an RGB->I function - /rgbdata exch store % call input 'rgbdata' - rgbdata length 3 idiv - /npixls exch store - /rgbindx 0 store - 0 1 npixls 1 sub { - grays exch - rgbdata rgbindx get 20 mul % Red - rgbdata rgbindx 1 add get 32 mul % Green - rgbdata rgbindx 2 add get 12 mul % Blue - add add 64 idiv % I = .5G + .31R + .18B - put - /rgbindx rgbindx 3 add store - } for - grays 0 npixls getinterval - } bind def - - % Utility procedure for colorimage operator. - % This procedure takes two procedures off the - % stack and merges them into a single procedure. - - /mergeprocs { % def - dup length - 3 -1 roll - dup - length - dup - 5 1 roll - 3 -1 roll - add - array cvx - dup - 3 -1 roll - 0 exch - putinterval - dup - 4 2 roll - putinterval - } bind def - - /colorimage { % def - pop pop % remove 'false 3' operands - {colortogray} mergeprocs - image - } bind def - } ifelse % end of 'false' case - - - -230 156 8 % dimensions of data -[230 0 0 -156 0 156] % mapping matrix -{currentfile pix readhexstring pop} -false 3 colorimage - -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0000000 -c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -000000000080000080ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffff000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080ff0000ff0000ff0000 -ff0000ff0000000080000080000080000080000080000080000080ff0000000080000080 -000080000080000080000080000080000080ffffffffffff000080000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffffffffffffffff000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000ff0000 -ff0000ff0000ff0000000080000080000080000080000080ff0000000080000080000080 -000080000080000080000080000080ffffffffffffffffffffffff000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffff000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -ff0000ff0000ff0000ff0000000080000080000080ff0000000080000080000080000080 -000080000080000080000080000080ffffff000080000080ffffff000080000080000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080ffffff -ffffffffffffffffff000080ffffffffffff000080ffffffffffff000080000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffffffffffffffff000080 -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000ff0000ff0000ff0000ff0000000080ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080ffffff000080000080ffffffffffff000080000080ffffff -000080ffffffffffff000080ffffffffffffffffff000080ffffffffffff000080ffffff -ffffff000080ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff -000080ffffffffffff000080000080ffffffffffff000080000080ffffffffffff000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000ff0000ff0000000080ff0000000080000080000080000080000080000080 -000080000080000080000080ffffffffffff000080000080ffffffffffff000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080ff0000000080ff0000ff0000ff0000000080000080000080000080000080 -000080000080000080000080ffffffffffffffffffffffffffffffffffff000080000080 -000080000080000080000080ffffffffffff000080ffffffffffff000080ffffffffffff -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000000000000000 -000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080ff0000000080ff0000ff0000ff0000ff0000ff0000000080000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080000080ffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080ffffffffffff000080ffffffffffff000080ffffffffffff000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0 -000000000000c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -ff0000000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080ffffff -ffffff000080ffffffffffffffffff000080ffffffffffff000080000080ffffffffffff -000080000080000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 -000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000c0c0c0c0c0c0c0c0c0 -c0c0c0000000000000c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080ff0000 -000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080000080 -000080000080000080ffffffffffff000080000080000080000080ffffffffffff000080 -000080000080000080000080000080ffffffffffff000080000080ffffffffffff000080 -000080ffffffffffff000080ffffffffffff000080000080ffffffffffff000080000080 -ffffffffffff000080ffffffffffff000080000080ffffffffffffffffffffffff000080 -000080000080000080ffffffffffff000080000080ffffffffffff000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0000000000000000000 -000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -000000000000000000000000000000000000000000000000000000c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080ff0000000080 -000080000080000080000080000080000080ff0000ff0000ff0000ff0000ff0000000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000ffffffc0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373 -000000000080000080ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080ffffff737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373000000ffffff737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -000000000080000080ffffff737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000080000080000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080000080000080000080 -000080000080000080000080000080000080000080000080000080c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9 -d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0ffffffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 -737373000000 -c0c0c0737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373737373737373737373737373737373737373737373737373737373737373737373 -737373000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000 - -showpage - -% stop using temporary dictionary -end - -% restore original state -origstate restore - -%%Trailer diff -Nru erlang-13.b.1-dfsg/lib/gs/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/gs/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/gs/doc/src/ref_man.xml 2007-11-26 19:03:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/doc/src/ref_man.xml 2009-11-20 13:34:00.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + GS Reference Manual @@ -36,6 +34,6 @@ using GS work on all Erlang platforms and do not depend upon the underlying windowing system.

    - + diff -Nru erlang-13.b.1-dfsg/lib/gs/tcl/README erlang-13.b.3-dfsg/lib/gs/tcl/README --- erlang-13.b.1-dfsg/lib/gs/tcl/README 2002-10-02 23:38:31.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/gs/tcl/README 2009-11-20 13:34:16.000000000 +0000 @@ -2,6 +2,11 @@ How to create prebuilt Tcl/Tk binaries ============================================================================== +Please look further down in this text for Windows instructions... + +Unixish OS +---------- + For commercial releases we use a prebuilt binary release of Tcl/Tk 8.X where X >= 2. This release is placed into "gs-VSN/priv/tcl" and the 'gstk_port_handler' module searches this directory first to find the @@ -85,3 +90,67 @@ /clearcase/otp/erts/lib/gs/tcl/binaries 8. We are done........ + + +Windows +------- + +These instructions are aimed at the 8.5.7 release of both tcl and tk, +but should work for 8.4 as well as 8.6 releases with appropriate +modifications. + +0. Download the source tar files for both tcl and tk and unpack the +tar files from the same root. + +1. Start with tcl. Open a command prompt with the appropriate Visual +C++ command environment (there is usually a shortcut under VC++ tools +or something in the start menu. With this command prompt, cd to the +tcl/win directory and issue the following commands: + +dos_prompt> nmake -f makefile.vc OPTS=static INSTALLDIR=\tcl +... +dos_prompt> nmake -f makefile.vc OPTS=static INSTALLDIR=\tcl install + +2. Move further to tk. Using the same command prompt, cd +..\..\tk\win and build there: + +dos_prompt> nmake -f makefile.vc OPTS=static TCLDIR=\tcl INSTALLDIR=\tcl +... +dos_prompt> nmake -f makefile.vc OPTS=static TCLDIR=\tcl INSTALLDIR=\tcl install + +3. Now you will need to strip the installation you put in \tcl. To do this, you will want a more appropriate command +shell. Start cygwin bash and cd to the cygwin equivalent of , i.e. where tcl/tk was installed. Now clean away what's not +needed (this is not optional, gs won't work with a full version...) + + % rm -fr tcl/include tcl/man + % rm -f tcl/bin/tclsh* + % rm -f tcl/lib/*.sh + % rm -fr tcl/lib/tcl*/http* + % rm -fr tcl/lib/tcl*/tcltest* + % rm -fr tcl/lib/tcl*/tzdata + % rm -fr tcl/lib/tcl*/msgs + % rm -fr tcl/lib/tk*/demos + % rm -fr tcl/lib/tk*/images + % rm -fr tcl/lib/tk*/tzdata + % rm -f tcl/lib/*/*.c + % rm -f tcl/lib/*.lib + % rm -fr tcl/lib/tcl8 + +(The last line is especially important, gs will crash otherwise...) + +4. Now copy license.terms from the sources, otherwise you may break the redistribution policy. + + % cp /license.terms tcl/ + +5. Pack the tar file: + + % tar zcf win32.tar.gz tcl + +6. Put it in $ERL_TOP/lib/gs/tcl/binaries (as described for Unixes) + +7. You are done! + + + diff -Nru erlang-13.b.1-dfsg/lib/gs/vsn.mk erlang-13.b.3-dfsg/lib/gs/vsn.mk --- erlang-13.b.1-dfsg/lib/gs/vsn.mk 2009-03-12 12:23:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/gs/vsn.mk 2009-11-20 13:33:52.000000000 +0000 @@ -1,2 +1,2 @@ -GS_VSN = 1.5.10 +GS_VSN = 1.5.11 diff -Nru erlang-13.b.1-dfsg/lib/hipe/amd64/hipe_amd64_ra_sse2_postconditions.erl erlang-13.b.3-dfsg/lib/hipe/amd64/hipe_amd64_ra_sse2_postconditions.erl --- erlang-13.b.1-dfsg/lib/hipe/amd64/hipe_amd64_ra_sse2_postconditions.erl 2009-03-12 12:21:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/amd64/hipe_amd64_ra_sse2_postconditions.erl 2009-09-18 15:08:49.000000000 +0100 @@ -19,7 +19,9 @@ %% -module(hipe_amd64_ra_sse2_postconditions). + -export([check_and_rewrite/2]). + -include("../x86/hipe_x86.hrl"). -define(HIPE_INSTRUMENT_COMPILER, true). -include("../main/hipe.hrl"). @@ -32,8 +34,7 @@ %%io:format("Rewriting\n"), #defun{code=Code0} = AMD64Defun, {Code1, DidSpill} = do_insns(Code0, TempMap, [], false), - {AMD64Defun#defun{code=Code1, - var_range={0, hipe_gensym:get_var(x86)}}, + {AMD64Defun#defun{code=Code1, var_range={0, hipe_gensym:get_var(x86)}}, DidSpill}. do_insns([I|Insns], TempMap, Accum, DidSpill0) -> @@ -107,8 +108,7 @@ case tuple_size(TempMap) > Reg of true -> case - hipe_temp_map:is_spilled(Reg, - TempMap) of + hipe_temp_map:is_spilled(Reg, TempMap) of true -> ?count_temp(Reg), true; @@ -120,7 +120,7 @@ end; _ -> false end, - %% io:format("Op ~w mem: ~w\n",[Opnd,R]), + %% io:format("Op ~w mem: ~w\n",[Opnd,R]), R. %%% Check if an operand is a spilled Temp. @@ -179,10 +179,10 @@ %%% Make a certain reg into a clone of Dst -% clone2(Dst, Reg) -> -% Type = -% case Dst of -% #x86_mem{} -> hipe_x86:mem_type(Dst); -% #x86_temp{} -> hipe_x86:temp_type(Dst) -% end, -% hipe_x86:mk_temp(Reg,Type). +%% clone2(Dst, Reg) -> +%% Type = +%% case Dst of +%% #x86_mem{} -> hipe_x86:mem_type(Dst); +%% #x86_temp{} -> hipe_x86:temp_type(Dst) +%% end, +%% hipe_x86:mk_temp(Reg,Type). diff -Nru erlang-13.b.1-dfsg/lib/hipe/amd64/hipe_amd64_registers.erl erlang-13.b.3-dfsg/lib/hipe/amd64/hipe_amd64_registers.erl --- erlang-13.b.1-dfsg/lib/hipe/amd64/hipe_amd64_registers.erl 2009-03-12 12:20:51.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/amd64/hipe_amd64_registers.erl 2009-09-18 15:08:45.000000000 +0100 @@ -51,7 +51,7 @@ tailcall_clobbered/0, temp0/0, temp1/0, -% %% fixed/0, + %% fixed/0, wordsize/0 ]). @@ -192,8 +192,8 @@ is_fixed(?HEAP_LIMIT) -> true; is_fixed(R) -> is_heap_pointer(R). -% %% fixed() -> -% %% [?ESP, ?PROC_POINTER, ?FCALLS, ?HEAP_LIMIT | ?LIST_HP_FIXED]. +%% fixed() -> +%% [?ESP, ?PROC_POINTER, ?FCALLS, ?HEAP_LIMIT | ?LIST_HP_FIXED]. allocatable() -> [?RDX, ?RCX, ?RBX, ?RAX, ?RSI, ?RDI, @@ -235,8 +235,7 @@ end. args(Arity) when is_integer(Arity), Arity >= 0 -> - Max = ?AMD64_NR_ARG_REGS, - N = if Arity > Max -> Max; true -> Arity end, + N = erlang:min(Arity, ?AMD64_NR_ARG_REGS), args(N-1, []). args(I, Rest) when I < 0 -> Rest; diff -Nru erlang-13.b.1-dfsg/lib/hipe/amd64/Makefile erlang-13.b.3-dfsg/lib/hipe/amd64/Makefile --- erlang-13.b.1-dfsg/lib/hipe/amd64/Makefile 2009-04-16 10:24:15.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/amd64/Makefile 2009-11-20 13:31:45.000000000 +0000 @@ -69,6 +69,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += -DHIPE_AMD64 +warn_exported_vars # ---------------------------------------------------- @@ -120,3 +123,5 @@ $(EBIN)/hipe_amd64_spill_restore.beam: ../main/hipe.hrl ../x86/hipe_x86.hrl ../flow/cfg.hrl ../x86/hipe_x86_spill_restore.erl $(EBIN)/hipe_amd64_x87.beam: ../x86/hipe_x86_x87.erl $(EBIN)/hipe_rtl_to_amd64.beam: ../x86/hipe_rtl_to_x86.erl ../rtl/hipe_rtl.hrl + +$(TARGET_FILES): ../x86/hipe_x86.hrl ../misc/hipe_consttab.hrl diff -Nru erlang-13.b.1-dfsg/lib/hipe/arm/hipe_arm_frame.erl erlang-13.b.3-dfsg/lib/hipe/arm/hipe_arm_frame.erl --- erlang-13.b.1-dfsg/lib/hipe/arm/hipe_arm_frame.erl 2009-06-05 13:53:38.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/arm/hipe_arm_frame.erl 2009-09-18 15:09:03.000000000 +0100 @@ -533,10 +533,7 @@ %%% Check if an operand is a pseudo-Temp. src_is_pseudo(Src) -> - case hipe_arm:is_temp(Src) of - true -> temp_is_pseudo(Src); - _ -> false - end. + hipe_arm:is_temp(Src) andalso temp_is_pseudo(Src). temp_is_pseudo(Temp) -> not(hipe_arm:temp_is_precoloured(Temp)). diff -Nru erlang-13.b.1-dfsg/lib/hipe/arm/hipe_arm.hrl erlang-13.b.3-dfsg/lib/hipe/arm/hipe_arm.hrl --- erlang-13.b.1-dfsg/lib/hipe/arm/hipe_arm.hrl 2009-04-16 10:24:22.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/arm/hipe_arm.hrl 2009-09-18 15:09:03.000000000 +0100 @@ -115,6 +115,10 @@ %%% Function definitions. --record(defun, {mfa :: mfa(), formals, code, data, - isclosure :: bool(), isleaf :: bool(), +-include("../misc/hipe_consttab.hrl"). + +-record(defun, {mfa :: mfa(), formals, code, + data :: hipe_consttab(), + isclosure :: boolean(), + isleaf :: boolean(), var_range, label_range}). diff -Nru erlang-13.b.1-dfsg/lib/hipe/arm/hipe_arm_ra_postconditions.erl erlang-13.b.3-dfsg/lib/hipe/arm/hipe_arm_ra_postconditions.erl --- erlang-13.b.1-dfsg/lib/hipe/arm/hipe_arm_ra_postconditions.erl 2009-03-12 12:21:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/arm/hipe_arm_ra_postconditions.erl 2009-09-18 15:09:04.000000000 +0100 @@ -19,8 +19,9 @@ %% -module(hipe_arm_ra_postconditions). --export([check_and_rewrite/3]). --export([check_and_rewrite2/3]). + +-export([check_and_rewrite/3, check_and_rewrite2/3]). + -include("hipe_arm.hrl"). check_and_rewrite(Defun, Coloring, Allocator) -> @@ -250,9 +251,7 @@ case temp_is_spilled(Dst, TempMap) of true -> NewDst = clone(Dst, RegOpt), - {[hipe_arm:mk_pseudo_move(Dst, NewDst)], - NewDst, - true}; + {[hipe_arm:mk_pseudo_move(Dst, NewDst)], NewDst, true}; _ -> {[], Dst, false} end. @@ -265,10 +264,7 @@ case hipe_arm:temp_is_allocatable(Temp) of true -> Reg = hipe_arm:temp_reg(Temp), - case tuple_size(TempMap) > Reg of - true -> hipe_temp_map:is_spilled(Reg, TempMap); - false -> false - end; + tuple_size(TempMap) > Reg andalso hipe_temp_map:is_spilled(Reg, TempMap); false -> true end. diff -Nru erlang-13.b.1-dfsg/lib/hipe/arm/hipe_arm_registers.erl erlang-13.b.3-dfsg/lib/hipe/arm/hipe_arm_registers.erl --- erlang-13.b.1-dfsg/lib/hipe/arm/hipe_arm_registers.erl 2009-03-12 12:21:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/arm/hipe_arm_registers.erl 2009-09-18 15:09:04.000000000 +0100 @@ -145,8 +145,7 @@ nr_args() -> ?ARM_NR_ARG_REGS. args(Arity) when is_integer(Arity) -> - Max = ?ARM_NR_ARG_REGS, - N = if Arity > Max -> Max; true -> Arity end, + N = erlang:min(Arity, ?ARM_NR_ARG_REGS), args(N-1, []). args(-1, Rest) -> Rest; diff -Nru erlang-13.b.1-dfsg/lib/hipe/arm/hipe_rtl_to_arm.erl erlang-13.b.3-dfsg/lib/hipe/arm/hipe_rtl_to_arm.erl --- erlang-13.b.1-dfsg/lib/hipe/arm/hipe_rtl_to_arm.erl 2009-03-12 12:21:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/arm/hipe_rtl_to_arm.erl 2009-11-20 13:32:11.000000000 +0000 @@ -227,7 +227,7 @@ {Src1, Map1} = conv_src(hipe_rtl:alub_src1(I), Map0), {Src2, Map2} = conv_src(hipe_rtl:alub_src2(I), Map1), RtlAluOp = hipe_rtl:alub_op(I), - Cond0 = conv_alub_cond(hipe_rtl:alub_cond(I)), + Cond0 = conv_alub_cond(RtlAluOp, hipe_rtl:alub_cond(I)), Cond = case {RtlAluOp,Cond0} of {'mul','vs'} -> 'ne'; % overflow becomes not-equal @@ -612,7 +612,23 @@ %%% Convert an RTL condition code. -conv_alub_cond(Cond) -> % only signed +conv_alub_cond(RtlAluOp, Cond) -> % may be unsigned, depends on aluop + %% Note: ARM has a non-standard definition of the Carry flag: + %% 'cmp', 'sub', and 'rsb' define Carry as the NEGATION of Borrow. + %% This means that the mapping between C/Z combinations and + %% conditions like "lower" and "higher" becomes non-standard. + %% (See conv_branch_cond/1 which maps ltu to lo/carry-clear, + %% while x86 maps ltu to b/carry-set.) + %% Here in conv_alub_cond/2 it means that the mapping of unsigned + %% conditions also has to consider the alu operator, since e.g. + %% 'add' and 'sub' behave differently with regard to Carry. + case {RtlAluOp, Cond} of % handle allowed alub unsigned conditions + {'add', 'ltu'} -> 'hs'; % add+ltu == unsigned overflow == carry set == hs + %% add more cases when needed + _ -> conv_cond(Cond) + end. + +conv_cond(Cond) -> % only signed case Cond of eq -> 'eq'; ne -> 'ne'; @@ -621,8 +637,7 @@ lt -> 'lt'; le -> 'le'; overflow -> 'vs'; - not_overflow -> 'vc'; - _ -> exit({?MODULE,conv_alub_cond,Cond}) + not_overflow -> 'vc' end. conv_branch_cond(Cond) -> % may be unsigned @@ -631,7 +646,7 @@ geu -> 'hs'; ltu -> 'lo'; leu -> 'ls'; - _ -> conv_alub_cond(Cond) + _ -> conv_cond(Cond) end. %%% Commute an ARM condition code. diff -Nru erlang-13.b.1-dfsg/lib/hipe/arm/Makefile erlang-13.b.3-dfsg/lib/hipe/arm/Makefile --- erlang-13.b.1-dfsg/lib/hipe/arm/Makefile 2009-04-16 10:24:22.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/arm/Makefile 2009-11-20 13:32:11.000000000 +0000 @@ -70,6 +70,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += +warn_exported_vars # ---------------------------------------------------- @@ -110,4 +113,4 @@ $(EBIN)/hipe_arm_registers.beam: ../rtl/hipe_literals.hrl $(EBIN)/hipe_rtl_to_arm.beam: ../rtl/hipe_rtl.hrl -$(TARGET_FILES): hipe_arm.hrl +$(TARGET_FILES): hipe_arm.hrl ../misc/hipe_consttab.hrl diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_cconv.erl erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_cconv.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_cconv.erl 2009-06-05 13:53:34.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_cconv.erl 2009-11-20 13:31:54.000000000 +0000 @@ -60,12 +60,14 @@ %% field is the name of the lifted function, and is thus unique over the %% whole module. --record(function, {name, free}). +-record(function, {name :: {atom(), arity()}, free}). %% A record for holding fun-information (if such information is attached %% as an annotation on a fun, it should preferably be preserved). --record(fun_info, {name, id = 0, hash = 0}). +-record(fun_info, {name :: atom(), + id = 0 :: integer(), + hash = 0 :: integer()}). %% @spec core_transform(Module::cerl_records(), Options::[term()]) -> %% cerl_records() @@ -78,6 +80,8 @@ %% %% @see transform/2 +-spec core_transform(cerl:cerl(), [term()]) -> cerl:cerl(). + core_transform(M, Opts) -> cerl:to_records(transform(cerl:from_records(M), Opts)). @@ -95,6 +99,8 @@ %% %%

    See the module {@link cerl_to_icode} for details.

    +-spec transform(cerl:c_module(), [term()]) -> cerl:c_module(). + transform(E, _Options) -> M = cerl:module_name(E), S0 = s__new(cerl:atom_val(M)), @@ -179,7 +185,7 @@ Ren, S0), expr(cerl:letrec_body(E), Env1, Ren1, S1); binary -> - {Segs, S1}=expr_list(cerl:binary_segments(E), Env, Ren, S0), + {Segs, S1} = expr_list(cerl:binary_segments(E), Env, Ren, S0), {cerl:update_c_binary(E, Segs),S1}; bitstr -> {E1,S1} = expr(cerl:bitstr_val(E), Env, Ren, S0), @@ -188,7 +194,6 @@ E4 = cerl:bitstr_type(E), E5 = cerl:bitstr_flags(E), {cerl:update_c_bitstr(E, E1, E2, E3, E4, E5), S2} - end. expr_list([E | Es], Env, Ren, S0) -> @@ -544,7 +549,7 @@ fun_info(E, Env, S) -> case lists:keyfind(id, 1, cerl:get_ann(E)) of {id, {Id, H, Name}} -> - % io:fwrite("Got fun-info: ~w: {~w,~w}.\n",[Name,Id,H]), + %% io:fwrite("Got fun-info: ~w: {~w,~w}.\n", [Name,Id,H]), {#fun_info{name = Name, id = Id, hash = H}, S}; _ -> io:fwrite("Warning - fun not annotated: " diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_closurean.erl erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_closurean.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_closurean.erl 2009-03-12 12:20:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_closurean.erl 2009-11-20 13:31:36.000000000 +0000 @@ -50,11 +50,18 @@ -import(cerl_trees, [get_label/1]). -%% ===================================================================== -%% annotate(Tree) -> {Tree1, OutList, Outputs, Dependencies, Escapes, -%% Parents} +%% =========================================================================== + +-type label() :: integer() | 'top' | 'external' | 'external_call'. +-type ordset(X) :: [X]. % XXX: TAKE ME OUT +-type labelset() :: ordset(label()). +-type outlist() :: [labelset()] | 'none'. +-type escapes() :: labelset(). + +%% =========================================================================== +%% annotate(Tree) -> {Tree1, OutList, Outputs, Escapes, Dependencies, Parents} %% -%% Tree = cerl() +%% Tree = cerl:cerl() %% %% Analyzes `Tree' (see `analyze') and appends terms `{callers, %% Labels}' and `{calls, Labels}' to the annotation list of each @@ -70,8 +77,11 @@ %% Note: `Tree' must be annotated with labels in order to use this %% function; see `analyze' for details. -annotate(T) -> - {Xs, Out, Esc, Deps, Par} = analyze(T), +-spec annotate(cerl:cerl()) -> + {cerl:cerl(), outlist(), dict(), escapes(), dict(), dict()}. + +annotate(Tree) -> + {Xs, Out, Esc, Deps, Par} = analyze(Tree), F = fun (T) -> case type(T) of 'fun' -> @@ -97,7 +107,7 @@ T end end, - {cerl_trees:map(F, T), Xs, Out, Esc, Deps, Par}. + {cerl_trees:map(F, Tree), Xs, Out, Esc, Deps, Par}. append_ann(Tag, Val, [X | Xs]) -> if tuple_size(X) >= 1, element(1, X) =:= Tag -> @@ -108,7 +118,6 @@ append_ann(Tag, Val, []) -> [{Tag, Val}]. - %% ===================================================================== %% analyze(Tree) -> {OutList, Outputs, Escapes, Dependencies, Parents} %% @@ -197,10 +206,12 @@ %% variable labeled `escape', which will hold the set of escaped labels. %% initially it contains `top' and `external'. -analyze(T) -> +-spec analyze(cerl:cerl()) -> {outlist(), dict(), escapes(), dict(), dict()}. + +analyze(Tree) -> %% Note that we use different name spaces for variable labels and %% function/call site labels, so we can reuse some names here. We - %% assume that the labeling of T only uses integers, not atoms. + %% assume that the labeling of Tree only uses integers, not atoms. External = ann_c_var([{label, external}], {external, 1}), Escape = ann_c_var([{label, escape}], 'Escape'), ExtBody = c_seq(ann_c_apply([{label, loop}], External, @@ -211,7 +222,7 @@ %%% io:fwrite("external fun:\n~s.\n", %%% [cerl_prettypr:format(ExtFun, [noann])]), Top = ann_c_var([{label, top}], {top, 0}), - TopFun = ann_c_fun([{label, top}], [], T), + TopFun = ann_c_fun([{label, top}], [], Tree), %% The "start fun" just makes the initialisation easier. It will not %% be marked as escaped, and thus cannot be called. @@ -221,8 +232,8 @@ %%% io:fwrite("start fun:\n~s.\n", %%% [cerl_prettypr:format(StartFun, [noann])]), - %% Gather a database of all fun-expressions in T and initialise all - %% their outputs and parameter variables. Bind all module- and + %% Gather a database of all fun-expressions in Tree and initialise + %% all their outputs and parameter variables. Bind all module- and %% letrec-defined variables to their corresponding labels. Funs0 = dict:new(), Vars0 = dict:new(), @@ -348,7 +359,7 @@ %% called functions Ls = set__to_list(X), Out = St2#state.out, - Xs1 = join_list([dict:fetch(L, Out) || L <- Ls]), + Xs1 = join_list([dict:fetch(Lx, Out) || Lx <- Ls]), St3 = call_site(Ls, L, As, St2), L1 = get_label(T), D = dict:store(L1, X, St3#state.dep), @@ -792,13 +803,15 @@ %% escapes (but throw/exit are). Zero-argument functions need not be %% listed. +-spec is_escape_op(atom(), arity()) -> boolean(). + is_escape_op(match_fail, 1) -> false; is_escape_op(F, A) when is_atom(F), is_integer(A) -> true. +-spec is_escape_op(module(), atom(), arity()) -> boolean(). + is_escape_op(erlang, error, 1) -> false; is_escape_op(erlang, error, 2) -> false; -is_escape_op(erlang, fault, 1) -> false; -is_escape_op(erlang, fault, 2) -> false; is_escape_op(M, F, A) when is_atom(M), is_atom(F), is_integer(A) -> true. %% "Literal" operators will never return functional values even when @@ -807,9 +820,13 @@ %% for better precision. Note that the result of `term_to_binary' still %% contains an encoding of the closure.) +-spec is_literal_op(atom(), arity()) -> boolean(). + is_literal_op(match_fail, 1) -> true; is_literal_op(F, A) when is_atom(F), is_integer(A) -> false. +-spec is_literal_op(module(), atom(), arity()) -> boolean(). + is_literal_op(erlang, '+', 2) -> true; is_literal_op(erlang, '-', 2) -> true; is_literal_op(erlang, '*', 2) -> true; @@ -832,8 +849,6 @@ is_literal_op(erlang, fun_to_list, 1) -> true; is_literal_op(erlang, throw, 1) -> true; is_literal_op(erlang, exit, 1) -> true; -is_literal_op(erlang, fault, 1) -> true; -is_literal_op(erlang, fault, 2) -> true; is_literal_op(erlang, error, 1) -> true; is_literal_op(erlang, error, 2) -> true; is_literal_op(M, F, A) when is_atom(M), is_atom(F), is_integer(A) -> false. diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_hipeify.erl erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_hipeify.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_hipeify.erl 2009-06-05 13:53:29.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_hipeify.erl 2009-11-20 13:31:37.000000000 +0000 @@ -66,6 +66,8 @@ %% @see cerl_to_icode %% @see cerl_cconv +-spec transform(cerl:c_module(), [term()]) -> cerl:c_module(). + transform(E, Opts) -> %% Start by closure converting the code module(cerl_cconv:transform(E, Opts), Opts). @@ -331,7 +333,7 @@ %% are supposed to be represented as primop calls on the Icode level. rewrite_call(E, M, F, As, S) -> - case cerl:is_c_atom(M) and cerl:is_c_atom(F) of + case cerl:is_c_atom(M) andalso cerl:is_c_atom(F) of true -> case call_to_primop(cerl:atom_val(M), cerl:atom_val(F), @@ -407,8 +409,6 @@ call_to_primop(erlang, throw, 1) -> {yes, ?PRIMOP_THROW}; call_to_primop(erlang, error, 1) -> {yes, ?PRIMOP_ERROR}; call_to_primop(erlang, error, 2) -> {yes, ?PRIMOP_ERROR}; -call_to_primop(erlang, fault, 1) -> {yes, ?PRIMOP_ERROR}; -call_to_primop(erlang, fault, 2) -> {yes, ?PRIMOP_ERROR}; call_to_primop(M, F, A) when is_atom(M), is_atom(F), is_integer(A) -> no. %% Also, some primops (introduced by Erlang to Core Erlang translation diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_hybrid_transform.erl erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_hybrid_transform.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_hybrid_transform.erl 2009-03-12 12:21:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_hybrid_transform.erl 2009-11-20 13:31:54.000000000 +0000 @@ -24,10 +24,13 @@ -export([transform/2, core_transform/2]). +-spec core_transform(cerl:cerl(), [term()]) -> cerl:cerl(). core_transform(Code, Opts) -> cerl:to_records(transform(cerl:from_records(Code), Opts)). +-spec transform(cerl:cerl(), [term()]) -> cerl:cerl(). + transform(Code, _Opts) -> Code0 = cerl_trees:map(fun unfold_literal/1, Code), {Code1, _} = cerl_trees:label(Code0), diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_lib.erl erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_lib.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_lib.erl 2009-03-12 12:21:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_lib.erl 2009-11-20 13:31:54.000000000 +0000 @@ -38,6 +38,8 @@ %% Test if a clause has a single pattern and an always-true guard. +-spec is_simple_clause(cerl:c_clause()) -> boolean(). + is_simple_clause(C) -> case cerl:clause_pats(C) of [_P] -> @@ -60,6 +62,9 @@ -endif. %% A boolean switch cannot have a catch-all; only true/false branches. + +-spec is_bool_switch([cerl:c_clause()]) -> boolean(). + is_bool_switch([C1, C2]) -> case is_simple_clause(C1) andalso is_simple_clause(C2) of true -> @@ -81,6 +86,9 @@ false. %% Returns the true-body and the false-body for boolean switch clauses. + +-spec bool_switch_cases([cerl:c_clause()]) -> {cerl:cerl(), cerl:cerl()}. + bool_switch_cases([C1, C2]) -> B1 = cerl:clause_body(C1), B2 = cerl:clause_body(C2), @@ -92,12 +100,17 @@ {B2, B1} end. +%% +%% The type of the check functions like the default check below - XXX: refine +%% +-type check_fun() :: fun((_, _) -> boolean()). + %% The default function property check always returns `false': default_check(_Property, _Function) -> false. -%% @spec (Expr::cerl()) -> bool() +%% @spec is_safe_expr(Expr::cerl()) -> boolean() %% %% @doc Returns `true' if `Expr' represents a "safe" Core Erlang %% expression, otherwise `false'. An expression is safe if it always @@ -116,6 +129,8 @@ -endif. %% @clear +-spec is_safe_expr(cerl:cerl(), check_fun()) -> boolean(). + is_safe_expr(E, Check) -> case cerl:type(E) of literal -> @@ -337,10 +352,14 @@ %% other similar cases, even for simple `case'-expressions like `case E %% of X -> X end', or simultaneous multiple-value bindings. +-spec reduce_expr(cerl:cerl()) -> cerl:cerl(). + reduce_expr(E) -> Check = fun default_check/2, reduce_expr(E, Check). +-spec reduce_expr(cerl:cerl(), check_fun()) -> cerl:cerl(). + reduce_expr(E, Check) -> case cerl:type(E) of values -> diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_messagean.erl erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_messagean.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_messagean.erl 2009-03-12 12:20:51.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_messagean.erl 2009-11-20 13:31:45.000000000 +0000 @@ -49,124 +49,124 @@ -define(DEF_LIMIT, 4). -%-export([test/1, test1/1, ttest/1]). +%% -export([test/1, test1/1, ttest/1]). -% ttest(F) -> -% {T, _} = cerl_trees:label(user_default:read(F)), -% {Time0, _} = erlang:statistics(runtime), -% analyze(T), -% {Time1, _} = erlang:statistics(runtime), -% Time1 - Time0. - -% test(F) -> -% {T, _} = cerl_trees:label(user_default:read(F)), -% {Time0, _} = erlang:statistics(runtime), -% {Esc, _Vars} = analyze(T), -% {Time1, _} = erlang:statistics(runtime), -% io:fwrite("messages: ~p.\n", [Esc]), -% Set = sets:from_list(Esc), -% H = fun (Node, Ctxt, Cont) -> -% Doc = case get_ann(Node) of -% [{label, L} | _] -> -% B = sets:is_element(L, Set), -% bf(Node, Ctxt, Cont, B); -% _ -> -% bf(Node, Ctxt, Cont, false) -% end, -% case type(Node) of -% cons -> color(Doc); -% tuple -> color(Doc); -% _ -> Doc -% end -% end, -% {ok, FD} = file:open("out.html",[write]), -% Txt = cerl_prettypr:format(T, [{hook, H},{user,false}]), -% io:put_chars(FD, "
    \n"),
    -%     io:put_chars(FD, html(Txt)),
    -%     io:put_chars(FD, "
    \n"), -% file:close(FD), -% {ok, Time1 - Time0}. - -% test1(F) -> -% {T, _} = cerl_trees:label(user_default:read(F)), -% {Time0, _} = erlang:statistics(runtime), -% {T1, Esc, Vars} = annotate(T), -% {Time1, _} = erlang:statistics(runtime), -% io:fwrite("messages: ~p.\n", [Esc]), -% %%% io:fwrite("vars: ~p.\n", [[X || X <- dict:to_list(Vars)]]), -% T2 = hhl_transform:transform(T1, Vars), -% Set = sets:from_list(Esc), -% H = fun (Node, Ctxt, Cont) -> -% case get_ann(Node) of -% [{label, L} | _] -> -% B = sets:is_element(L, Set), -% bf(Node, Ctxt, Cont, B); -% _ -> -% bf(Node, Ctxt, Cont, false) -% end -% end, -% {ok, FD} = file:open("out.html",[write]), -% Txt = cerl_prettypr:format(T2, [{hook, H},{user,false}]), -% io:put_chars(FD, "
    \n"),
    -%     io:put_chars(FD, html(Txt)),
    -%     io:put_chars(FD, "
    \n"), -% file:close(FD), -% {ok, Time1 - Time0}. - -% html(Cs) -> -% html(Cs, []). - -% html([$#, $< | Cs], As) -> -% html_1(Cs, [$< | As]); -% html([$< | Cs], As) -> -% html(Cs, ";tl&" ++ As); -% html([$> | Cs], As) -> -% html(Cs, ";tg&" ++ As); -% html([$& | Cs], As) -> -% html(Cs, ";pma&" ++ As); -% html([C | Cs], As) -> -% html(Cs, [C | As]); -% html([], As) -> -% lists:reverse(As). - -% html_1([$> | Cs], As) -> -% html(Cs, [$> | As]); -% html_1([C | Cs], As) -> -% html_1(Cs, [C | As]). - -% bf(Node, Ctxt, Cont, B) -> -% B0 = cerl_prettypr:get_ctxt_user(Ctxt), -% if B /= B0 -> -% Ctxt1 = cerl_prettypr:set_ctxt_user(Ctxt, B), -% Doc = Cont(Node, Ctxt1), -% case B of -% true -> -% Start = "", -% End = ""; -% false -> -% Start = "", -% End = "" -% end, -% markup(Doc, Start, End); -% true -> -% Cont(Node, Ctxt) -% end. - -% color(Doc) -> -% % Doc. -% markup(Doc, "", ""). - -% markup(Doc, Start, End) -> -% prettypr:beside( -% prettypr:null_text([$# | Start]), -% prettypr:beside(Doc, -% prettypr:null_text([$# | End]))). +%% ttest(F) -> +%% {T, _} = cerl_trees:label(user_default:read(F)), +%% {Time0, _} = erlang:statistics(runtime), +%% analyze(T), +%% {Time1, _} = erlang:statistics(runtime), +%% Time1 - Time0. + +%% test(F) -> +%% {T, _} = cerl_trees:label(user_default:read(F)), +%% {Time0, _} = erlang:statistics(runtime), +%% {Esc, _Vars} = analyze(T), +%% {Time1, _} = erlang:statistics(runtime), +%% io:fwrite("messages: ~p.\n", [Esc]), +%% Set = sets:from_list(Esc), +%% H = fun (Node, Ctxt, Cont) -> +%% Doc = case get_ann(Node) of +%% [{label, L} | _] -> +%% B = sets:is_element(L, Set), +%% bf(Node, Ctxt, Cont, B); +%% _ -> +%% bf(Node, Ctxt, Cont, false) +%% end, +%% case type(Node) of +%% cons -> color(Doc); +%% tuple -> color(Doc); +%% _ -> Doc +%% end +%% end, +%% {ok, FD} = file:open("out.html",[write]), +%% Txt = cerl_prettypr:format(T, [{hook, H},{user,false}]), +%% io:put_chars(FD, "
    \n"),
    +%%     io:put_chars(FD, html(Txt)),
    +%%     io:put_chars(FD, "
    \n"), +%% file:close(FD), +%% {ok, Time1 - Time0}. + +%% test1(F) -> +%% {T, _} = cerl_trees:label(user_default:read(F)), +%% {Time0, _} = erlang:statistics(runtime), +%% {T1, Esc, Vars} = annotate(T), +%% {Time1, _} = erlang:statistics(runtime), +%% io:fwrite("messages: ~p.\n", [Esc]), +%% %%% io:fwrite("vars: ~p.\n", [[X || X <- dict:to_list(Vars)]]), +%% T2 = hhl_transform:transform(T1, Vars), +%% Set = sets:from_list(Esc), +%% H = fun (Node, Ctxt, Cont) -> +%% case get_ann(Node) of +%% [{label, L} | _] -> +%% B = sets:is_element(L, Set), +%% bf(Node, Ctxt, Cont, B); +%% _ -> +%% bf(Node, Ctxt, Cont, false) +%% end +%% end, +%% {ok, FD} = file:open("out.html",[write]), +%% Txt = cerl_prettypr:format(T2, [{hook, H},{user,false}]), +%% io:put_chars(FD, "
    \n"),
    +%%     io:put_chars(FD, html(Txt)),
    +%%     io:put_chars(FD, "
    \n"), +%% file:close(FD), +%% {ok, Time1 - Time0}. + +%% html(Cs) -> +%% html(Cs, []). + +%% html([$#, $< | Cs], As) -> +%% html_1(Cs, [$< | As]); +%% html([$< | Cs], As) -> +%% html(Cs, ";tl&" ++ As); +%% html([$> | Cs], As) -> +%% html(Cs, ";tg&" ++ As); +%% html([$& | Cs], As) -> +%% html(Cs, ";pma&" ++ As); +%% html([C | Cs], As) -> +%% html(Cs, [C | As]); +%% html([], As) -> +%% lists:reverse(As). + +%% html_1([$> | Cs], As) -> +%% html(Cs, [$> | As]); +%% html_1([C | Cs], As) -> +%% html_1(Cs, [C | As]). + +%% bf(Node, Ctxt, Cont, B) -> +%% B0 = cerl_prettypr:get_ctxt_user(Ctxt), +%% if B /= B0 -> +%% Ctxt1 = cerl_prettypr:set_ctxt_user(Ctxt, B), +%% Doc = Cont(Node, Ctxt1), +%% case B of +%% true -> +%% Start = "", +%% End = ""; +%% false -> +%% Start = "
    ", +%% End = "" +%% end, +%% markup(Doc, Start, End); +%% true -> +%% Cont(Node, Ctxt) +%% end. + +%% color(Doc) -> +%% % Doc. +%% markup(Doc, "", ""). + +%% markup(Doc, Start, End) -> +%% prettypr:beside( +%% prettypr:null_text([$# | Start]), +%% prettypr:beside(Doc, +%% prettypr:null_text([$# | End]))). %% ===================================================================== -%% annotate(Tree) -> {Tree1, Escapes} +%% annotate(Tree) -> {Tree1, Escapes, Vars} %% -%% Tree = coreErlang() +%% Tree = cerl:cerl() %% %% Analyzes `Tree' (see `analyze') and appends a term 'escapes', to %% the annotation list of each constructor expression node and of @@ -179,8 +179,13 @@ %% Note: `Tree' must be annotated with labels in order to use this %% function; see `analyze' for details. -annotate(T) -> - {Esc0, Vars} = analyze(T), +-type label() :: integer() | 'external' | 'top'. +-type ordset(X) :: [X]. % XXX: TAKE ME OUT + +-spec annotate(cerl:cerl()) -> {cerl:cerl(), ordset(label()), dict()}. + +annotate(Tree) -> + {Esc0, Vars} = analyze(Tree), Esc = sets:from_list(Esc0), F = fun (T) -> case type(T) of @@ -195,7 +200,7 @@ ann_escape(T, L, Esc) end end, - {cerl_trees:map(F, T), Esc0, Vars}. + {cerl_trees:map(F, Tree), Esc0, Vars}. ann_escape(T, L, Esc) -> case sets:is_element(L, Esc) of @@ -218,7 +223,7 @@ %% ===================================================================== %% analyze(Tree) -> Escapes %% -%% Tree = coreErlang() +%% Tree = cerl:cerl() %% Escapes = ordset(Label) %% Label = integer() | external | top %% @@ -266,25 +271,25 @@ %% "'external'/1 = fun () -> Any", which will represent any and all %% functions outside T, and which returns the 'unsafe' value. -analyze(T) -> - analyze(T, ?DEF_LIMIT). +analyze(Tree) -> + analyze(Tree, ?DEF_LIMIT). -analyze(T, Limit) -> - {_, _, Esc, Dep, _Par} = cerl_closurean:analyze(T), +analyze(Tree, Limit) -> + {_, _, Esc, Dep, _Par} = cerl_closurean:analyze(Tree), %%% io:fwrite("dependencies: ~w.\n", [dict:to_list(Dep)]), - analyze(T, Limit, Dep, Esc). + analyze(Tree, Limit, Dep, Esc). -analyze(T, Limit, Dep0, Esc0) -> +analyze(Tree, Limit, Dep0, Esc0) -> %% Note that we use different name spaces for variable labels and %% function/call site labels, so we can reuse some names here. We - %% assume that the labeling of T only uses integers, not atoms. + %% assume that the labeling of Tree only uses integers, not atoms. Any = ann_c_var([{label, any}], 'Any'), External = ann_c_var([{label, external}], {external, 1}), ExtFun = ann_c_fun([{label, external}], [], Any), %%% io:fwrite("external fun:\n~s.\n", %%% [cerl_prettypr:format(ExtFun, [noann, {paper, 80}])]), Top = ann_c_var([{label, top}], {top, 0}), - TopFun = ann_c_fun([{label, top}], [], T), + TopFun = ann_c_fun([{label, top}], [], Tree), %% The "start fun" just makes the initialisation easier. It is not %% itself in the call graph. @@ -295,7 +300,7 @@ %%% [cerl_prettypr:format(StartFun, [{paper, 80}])]), %% Initialise the Any and Escape variables. Gather a database of all - %% fun-expressions in T and initialise their outputs and parameter + %% fun-expressions in Tree and initialise their outputs and parameter %% variables. All escaping functions can receive any values as %% inputs. Bind all module- and letrec-defined variables to their %% corresponding labels. @@ -326,8 +331,7 @@ S end end, - {Funs, Vars, Out} = cerl_trees:fold(F, {Funs0, Vars0, Out0}, - StartFun), + {Funs, Vars, Out} = cerl_trees:fold(F, {Funs0, Vars0, Out0}, StartFun), %% Add the dependency for the loop in 'external': Dep = add_dep(loop, external, Dep0), @@ -440,7 +444,7 @@ L1 = get_label(T), Ls = get_deps(L1, St#state.dep), Out = St2#state.out, - Xs1 = join_list([dict:fetch(L, Out) || L <- Ls]), + Xs1 = join_list([dict:fetch(X, Out) || X <- Ls]), {Xs1, call_site(Ls, As, St2)}; call -> M = call_module(T), @@ -531,8 +535,7 @@ {none, St}. bind_defs([{V, F} | Ds], Vars) -> - bind_defs(Ds, dict:store(get_label(V), singleton(get_label(F)), - Vars)); + bind_defs(Ds, dict:store(get_label(V), singleton(get_label(F)), Vars)); bind_defs([], Vars) -> Vars. @@ -696,8 +699,8 @@ bind_args([], [], Vars, _Limit, Ch) -> {Vars, Ch}. -% bind_arg(L, X, Vars, Limit) -> -% bind_arg(L, X, Vars, Limit, false). +%% bind_arg(L, X, Vars, Limit) -> +%% bind_arg(L, X, Vars, Limit, false). bind_arg(L, X, Vars, Limit, Ch) -> X0 = dict:fetch(L, Vars), @@ -933,10 +936,10 @@ collapse(V) -> {labels(V), none}. -% collapse_list([]) -> -% empty(); -% collapse_list(Vs) -> -% {labels_list(Vs), none}. +%% collapse_list([]) -> +%% empty(); +%% collapse_list(Vs) -> +%% {labels_list(Vs), none}. labels({S, none}) -> S; labels({S, []}) -> S; @@ -1040,6 +1043,8 @@ %% is_escape_op(_F, _A) -> []. +-spec is_escape_op(module(), atom(), arity()) -> [arity()]. + is_escape_op(erlang, '!', 2) -> [2]; is_escape_op(erlang, send, 2) -> [2]; is_escape_op(erlang, spawn, 1) -> [1]; @@ -1054,9 +1059,13 @@ %% that floats are always heap allocated objects, and that most integer %% arithmetic can return a bignum on the heap.) +-spec is_imm_op(atom(), arity()) -> boolean(). + is_imm_op(match_fail, 1) -> true; is_imm_op(_, _) -> false. +-spec is_imm_op(module(), atom(), arity()) -> boolean(). + is_imm_op(erlang, self, 0) -> true; is_imm_op(erlang, '=:=', 2) -> true; is_imm_op(erlang, '==', 2) -> true; @@ -1093,6 +1102,4 @@ is_imm_op(erlang, exit, 1) -> true; is_imm_op(erlang, error, 1) -> true; is_imm_op(erlang, error, 2) -> true; -is_imm_op(erlang, fault, 1) -> true; -is_imm_op(erlang, fault, 2) -> true; is_imm_op(_, _, _) -> false. diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_pmatch.erl erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_pmatch.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_pmatch.erl 2009-03-12 12:20:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_pmatch.erl 2009-11-20 13:31:37.000000000 +0000 @@ -109,6 +109,9 @@ %% @see expr/2 %% @see transform/2 +-spec clauses([cerl:cerl()], rec_env:environment()) -> + {cerl:cerl(), [cerl:cerl()]}. + clauses(Cs, Env) -> clauses(Cs, none, Env). @@ -136,8 +139,8 @@ cerl:c_case(cerl:c_values([]), Cs2) end; match([V | _] = Vs, Cs, Else, Env) -> - foldr(fun (Cs, Else) -> - match_var_con(Vs, Cs, Else, Env) + foldr(fun (CsF, ElseF) -> + match_var_con(Vs, CsF, ElseF, Env) end, Else, group([unalias(C, V) || C <- Cs], fun is_var_clause/1)). @@ -202,8 +205,8 @@ [{_, _, Gs}] -> %% Don't create a group type switch if there is only one %% such group - make_switch(V, [match_congroup(D, Vs, Cs, Else, Env) - || {D, _, Cs} <- Gs], + make_switch(V, [match_congroup(DG, Vs, CsG, Else, Env) + || {DG, _, CsG} <- Gs], Else, Env); Ts -> Cs1 = [match_typegroup(T, V, Vs, Gs, Else, Env) @@ -259,11 +262,11 @@ Css = group(keysort(1, Cs1), fun ({D,_,_}) -> D end), %% Sort each group "back" by line number, and move the descriptor %% and line number to the wrapper for the group. - Gs = [finalize_congroup(Cs) || Cs <- Css], + Gs = [finalize_congroup(C) || C <- Css], %% Group by type only (put e.g. different-arity tuples together). Gss = group(Gs, fun ({D,_,_}) -> con_desc_type(D) end), %% Sort and wrap the type groups. - Ts = [finalize_typegroup(Gs) || Gs <- Gss], + Ts = [finalize_typegroup(G) || G <- Gss], %% Sort type-groups by first clause order keysort(2, Ts). @@ -513,13 +516,12 @@ cerl:c_var(Name). add_vars(Vs, Env) -> - foldl(fun (V, Env) -> env__bind(cerl:var_name(V), [], Env) end, - Env, Vs). + foldl(fun (V, E) -> env__bind(cerl:var_name(V), [], E) end, Env, Vs). -ifndef(NO_UNUSED). add_defs(Ds, Env) -> - foldl(fun ({V, _F}, Env) -> - env__bind(cerl:var_name(V), [], Env) + foldl(fun ({V, _F}, E) -> + env__bind(cerl:var_name(V), [], E) end, Env, Ds). -endif. % NO_UNUSED diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_prettypr.erl erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_prettypr.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_prettypr.erl 2009-03-12 12:21:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_prettypr.erl 2009-11-20 13:31:54.000000000 +0000 @@ -69,15 +69,17 @@ -define(NOUSER, undefined). -define(NOHOOK, none). --record(ctxt, {line = 0, - body_indent = 4, - sub_indent = 2, - hook = ?NOHOOK, - noann = false, - paper = ?PAPER, - ribbon = ?RIBBON, - user = ?NOUSER}). +-type hook() :: 'none' | fun((cerl:cerl(), _, _) -> prettypr:document()). +-record(ctxt, {line = 0 :: integer(), + body_indent = 4 :: non_neg_integer(), + sub_indent = 2 :: non_neg_integer(), + hook = ?NOHOOK :: hook(), + noann = false :: boolean(), + paper = ?PAPER :: integer(), + ribbon = ?RIBBON :: integer(), + user = ?NOUSER :: term()}). +-type context() :: #ctxt{}. %% ===================================================================== %% The following functions examine and modify contexts: @@ -179,6 +181,8 @@ %% @spec format(Tree::cerl()) -> string() %% @equiv format(Tree, []) +-spec format(cerl:cerl()) -> string(). + format(Node) -> format(Node, []). @@ -205,7 +209,7 @@ %% is called for every node; see below for details. The default %% value is none. %% -%%
    {noann, bool()}
    +%%
    {noann, boolean()}
    %%
    If the value is true, annotations on the code %% are not printed. The default value is false.
    %% @@ -257,6 +261,8 @@ %% @see get_ctxt_user/1 %% @see set_ctxt_user/2 +-spec format(cerl:cerl(), [term()]) -> string(). + format(Node, Options) -> W = proplists:get_value(paper, Options, ?PAPER), L = proplists:get_value(ribbon, Options, ?RIBBON), @@ -319,6 +325,8 @@ %% %% @see format/2 +-spec annotate(prettypr:document(), [term()], context()) -> prettypr:document(). + annotate(Doc, As0, Ctxt) -> case strip_line(As0) of [] -> @@ -360,6 +368,8 @@ %% @see format/2 %% @see layout/1 +-spec layout(cerl:cerl(), [term()]) -> prettypr:document(). + layout(Node, Options) -> lay(Node, #ctxt{hook = proplists:get_value(hook, Options, ?NOHOOK), diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_to_icode.erl erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_to_icode.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_to_icode.erl 2009-06-05 13:53:29.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_to_icode.erl 2009-11-20 13:31:37.000000000 +0000 @@ -103,7 +103,7 @@ %% Record definitions --record(ctxt, {final = false :: bool(), +-record(ctxt, {final = false :: boolean(), effect = false, fail = [], % [] or fail-to label class = expr, % expr | guard @@ -150,6 +150,8 @@ %% @see function/4 %% @see cerl_hipeify:transform/1 +%% -spec module(cerl:c_module(), [term()]) -> [{mfa(), hipe_icode:icode()}]. + module(E, Options) -> module_1(cerl_hipeify:transform(E, Options), Options). @@ -505,11 +507,10 @@ %% Nonconstant cons cells expr_cons(E, _Ts, #ctxt{effect = true} = Ctxt, Env, S) -> - {_Vs, S1} =expr_list([cerl:cons_hd(E), cerl:cons_tl(E)], Ctxt, Env, S), + {_Vs, S1} = expr_list([cerl:cons_hd(E), cerl:cons_tl(E)], Ctxt, Env, S), S1; expr_cons(E, [_V] = Ts, Ctxt, Env, S) -> - {Vs, S1} = expr_list([cerl:cons_hd(E), cerl:cons_tl(E)], - Ctxt, Env, S), + {Vs, S1} = expr_list([cerl:cons_hd(E), cerl:cons_tl(E)], Ctxt, Env, S), add_code(make_op(?OP_CONS, Ts, Vs, Ctxt), S1); expr_cons(E, Ts, _Ctxt, _Env, _S) -> error_degree_mismatch(length(Ts), E), @@ -523,7 +524,7 @@ %% call properties. expr_let(E, Ts, Ctxt, Env, S) -> - F = fun (B, Ctxt, Env, S) -> expr(B, Ts, Ctxt, Env, S) end, + F = fun (BF, CtxtF, EnvF, SF) -> expr(BF, Ts, CtxtF, EnvF, SF) end, expr_let_1(E, F, Ctxt, Env, S). expr_let_1(E, F, Ctxt, Env, S) -> @@ -554,7 +555,7 @@ %% many ICode operations, even if the result is not used. expr_seq(E, Ts, Ctxt, Env, S) -> - F = fun (B, Ctxt, Env, S) -> expr(B, Ts, Ctxt, Env, S) end, + F = fun (BF, CtxtF, EnvF, SF) -> expr(BF, Ts, CtxtF, EnvF, SF) end, expr_seq_1(E, F, Ctxt, Env, S). expr_seq_1(E, F, Ctxt, Env, S) -> @@ -956,18 +957,7 @@ expr_primop_1(?PRIMOP_REDUCTION_TEST, 0, [], _, _Ts, Ctxt, _Env, S) -> primop_reduction_test(Ctxt, S); expr_primop_1(Name, Arity, As, E, Ts, Ctxt, Env, S) -> - Bool = case is_bool_op(Name, Arity) of - true -> - true; - false -> - case is_comp_op(Name, Arity) of - true -> - true; - false -> - is_type_test(Name, Arity) - end - end, - case Bool of + case is_pure_op_aux(Name, Arity) of true -> boolean_expr(E, Ts, Ctxt, Env, S); false -> @@ -1096,7 +1086,7 @@ %% unnecessary try-blocks. (The `let' might become further simplified.) expr_try(E, Ts, Ctxt, Env, S) -> - F = fun (B, Ctxt, Env, S) -> expr(B, Ts, Ctxt, Env, S) end, + F = fun (BF, CtxtF, EnvF, SF) -> expr(BF, Ts, CtxtF, EnvF, SF) end, expr_try_1(E, F, Ctxt, Env, S). expr_try_1(E, F, Ctxt, Env, S) -> @@ -1179,7 +1169,7 @@ %% `receive_select/0' or `receive_next/0'. expr_receive(E, Ts, Ctxt, Env, S) -> - F = fun (B, Ctxt, Env, S) -> expr(B, Ts, Ctxt, Env, S) end, + F = fun (BF, CtxtF, EnvF, SF) -> expr(BF, Ts, CtxtF, EnvF, SF) end, expr_receive_1(E, F, Ctxt, Env, S). expr_receive_1(E, F, Ctxt, Env, S) -> @@ -1380,7 +1370,7 @@ %% efficiency anyway, so we don't spend any extra effort here.) expr_case(E, Ts, Ctxt, Env, S) -> - F = fun (B, Ctxt, Env, S) -> expr(B, Ts, Ctxt, Env, S) end, + F = fun (BF, CtxtF, EnvF, SF) -> expr(BF, Ts, CtxtF, EnvF, SF) end, expr_case_1(E, F, Ctxt, Env, S). expr_case_1(E, F, Ctxt, Env, S) -> @@ -1446,12 +1436,8 @@ true -> is_binary_switch1(Cs, N + 1); false -> - if Cs =:= [], N > 0 -> - %% The final clause may be a catch-all. - cerl:type(P) =:= var; - true -> - false - end + %% The final clause may be a catch-all. + Cs =:= [] andalso N > 0 andalso cerl:type(P) =:= var end; _ -> false @@ -1477,12 +1463,8 @@ true -> is_switch(Cs, F, N + 1); false -> - if Cs =:= [], N > 1 -> - %% The final clause may be a catch-all. - cerl:type(P) =:= var; - true -> - false - end + %% The final clause may be a catch-all. + Cs =:= [] andalso N > 1 andalso cerl:type(P) =:= var end; false -> false end; @@ -1515,7 +1497,7 @@ switch_clauses(Cs, F, [V], Ctxt, Env, GetVal, Switch, Body, S0) -> Cs1 = [switch_clause(C, GetVal) || C <- Cs], - Cases = [{V, L} || {V, L, _} <- Cs1], + Cases = [{Val, L} || {Val, L, _} <- Cs1], Default = [C || {default, C} <- Cs1], Fail = new_label(), S1 = add_code([Switch(V, Fail, length(Cases), Cases)], S0), @@ -1937,9 +1919,9 @@ %% Propagate boolean handling into clause bodies. %% (Note that case switches assume fallthrough code in the %% clause bodies, so we must add a dummy label as needed.) - F = fun (B, Ctxt, Env, S) -> - S1 = boolean(B, True, False, Ctxt, Env, S), - add_new_continuation_label(Ctxt, S1) + F = fun (BF, CtxtF, EnvF, SF) -> + SF1 = boolean(BF, True, False, CtxtF, EnvF, SF), + add_new_continuation_label(CtxtF, SF1) end, S1 = expr_case_1(E, F, Ctxt, Env, S), %% Add a final goto if necessary, to compensate for the @@ -1948,15 +1930,15 @@ add_continuation_jump(False, Ctxt, S1); seq -> %% Propagate boolean handling into body. - F = fun (B, Ctxt, Env, S) -> - boolean(B, True, False, Ctxt, Env, S) + F = fun (BF, CtxtF, EnvF, SF) -> + boolean(BF, True, False, CtxtF, EnvF, SF) end, expr_seq_1(E, F, Ctxt, Env, S); 'let' -> %% Propagate boolean handling into body. Note that we have %% called 'cerl_lib:reduce_expr/1' above. - F = fun (B, Ctxt, Env, S) -> - boolean(B, True, False, Ctxt, Env, S) + F = fun (BF, CtxtF, EnvF, SF) -> + boolean(BF, True, False, CtxtF, EnvF, SF) end, expr_let_1(E, F, Ctxt, Env, S); 'try' -> @@ -1967,13 +1949,12 @@ %% (we could of course test if the handler body is %% the atom 'false', etc.). Ctxt1 = Ctxt#ctxt{fail = False}, - boolean(cerl:try_arg(E), True, False, Ctxt1, Env, - S); + boolean(cerl:try_arg(E), True, False, Ctxt1, Env, S); _ -> %% Propagate boolean handling into the handler and body %% (see propagation into case switches for comparison) - F = fun (B, Ctxt, Env, S) -> - boolean(B, True, False, Ctxt, Env, S) + F = fun (BF, CtxtF, EnvF, SF) -> + boolean(BF, True, False, CtxtF, EnvF, SF) end, S1 = expr_try_1(E, F, Ctxt, Env, S), add_continuation_jump(False, Ctxt, S1) @@ -2042,9 +2023,8 @@ comp_test(?PRIMOP_LE) -> ?TEST_LE; comp_test(?PRIMOP_GE) -> ?TEST_GE. -type_test(?PRIMOP_IS_RECORD, As, True, False, Ctxt, Env, S) - when length(As) =:= 3 -> - is_record_test(As, True, False, Ctxt, Env, S); +type_test(?PRIMOP_IS_RECORD, [T, A, N], True, False, Ctxt, Env, S) -> + is_record_test(T, A, N, True, False, Ctxt, Env, S); type_test(Name, [A], True, False, Ctxt, Env, S) -> V = make_var(), S1 = expr(A, [V], Ctxt#ctxt{final = false, effect = false}, Env, S), @@ -2052,7 +2032,7 @@ add_code([make_type([V], Test, True, False)], S1). %% It turned out to be easiest to generate Icode directly for this. -is_record_test([T, A, N] = As, True, False, Ctxt, Env, S) -> +is_record_test(T, A, N, True, False, Ctxt, Env, S) -> case cerl:is_c_atom(A) andalso cerl:is_c_int(N) andalso (cerl:concrete(N) > 0) of true -> @@ -2064,7 +2044,7 @@ add_code([make_type([V], ?TYPE_IS_RECORD(Atom, Size), True, False)], S1); false -> - error_primop_badargs(?PRIMOP_IS_RECORD, As), + error_primop_badargs(?PRIMOP_IS_RECORD, [T, A, N]), throw(error) end. @@ -2340,11 +2320,7 @@ %% safe versions, such as '+'/2 -> add_integer/2. is_safe_op(N, A) -> - case is_comp_op(N, A) of - true -> true; - false -> - is_type_test(N, A) - end. + is_comp_op(N, A) orelse is_type_test(N, A). is_pure_op(?PRIMOP_ELEMENT, 2) -> true; is_pure_op(?PRIMOP_MAKE_FUN, 6) -> true; @@ -2367,20 +2343,15 @@ is_pure_op(?PRIMOP_ERROR, 1) -> true; is_pure_op(?PRIMOP_ERROR, 2) -> true; is_pure_op(?PRIMOP_RETHROW, 2) -> true; -is_pure_op(N, A) -> - case is_bool_op(N, A) of - true -> true; - false -> - case is_comp_op(N, A) of - true -> true; - false -> is_type_test(N, A) - end - end. +is_pure_op(N, A) -> is_pure_op_aux(N, A). + +is_pure_op_aux(N, A) -> + is_bool_op(N, A) orelse is_comp_op(N, A) orelse is_type_test(N, A). translate_flags(Flags, Align) -> translate_flags1(cerl:concrete(Flags), Align). -translate_flags1([A|Rest],Align) -> +translate_flags1([A|Rest], Align) -> case A of signed -> 4 + translate_flags1(Rest, Align); diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_typean.erl erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_typean.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/cerl_typean.erl 2009-04-16 10:24:12.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/cerl_typean.erl 2009-11-20 13:31:37.000000000 +0000 @@ -85,6 +85,8 @@ %% %% @see module/2 +-spec core_transform(cerl:cerl(), [term()]) -> cerl:cerl(). + core_transform(Code, _Opts) -> {Code1, _} = cerl_trees:label(cerl:from_records(Code)), %% io:fwrite("Running type analysis..."), @@ -98,7 +100,7 @@ %% ===================================================================== %% annotate(Tree) -> {Tree1, Type, Vars} %% -%% Tree = coreErlang() +%% Tree = cerl:cerl() %% %% Analyzes `Tree' (see `analyze') and appends terms `{type, Type}' %% to the annotation list of each fun-expression node and @@ -113,15 +115,15 @@ %% Note: `Tree' must be annotated with labels in order to use this %% function; see `analyze' for details. -annotate(T) -> - annotate(T, ?DEF_LIMIT). +annotate(Tree) -> + annotate(Tree, ?DEF_LIMIT). -annotate(T, Limit) -> - {_, _, Esc, Dep, Par} = cerl_closurean:analyze(T), - annotate(T, Limit, Esc, Dep, Par). +annotate(Tree, Limit) -> + {_, _, Esc, Dep, Par} = cerl_closurean:analyze(Tree), + annotate(Tree, Limit, Esc, Dep, Par). -annotate(T, Limit, Esc, Dep, Par) -> - {Type, Out, Vars} = analyze(T, Limit, Esc, Dep, Par), +annotate(Tree, Limit, Esc, Dep, Par) -> + {Type, Out, Vars} = analyze(Tree, Limit, Esc, Dep, Par), DelAnn = fun (T) -> set_ann(T, delete_ann(type, get_ann(T))) end, SetType = fun (T, Dict) -> case dict:find(get_label(T), Dict) of @@ -154,7 +156,7 @@ DelAnn(T) end end, - {cerl_trees:map(F, T), Type, Vars}. + {cerl_trees:map(F, Tree), Type, Vars}. append_ann(Tag, Val, [X | Xs]) -> if tuple_size(X) >= 1, element(1, X) =:= Tag -> @@ -176,9 +178,9 @@ %% ===================================================================== -%% analyze(Tree) -> {OutList, Outputs, Dependencies, Escapes} +%% analyze(Tree) -> {OutList, Outputs, Dependencies} %% -%% Tree = coreErlang() +%% Tree = cerl:cerl() %% OutList = [LabelSet] | none %% Outputs = dict(integer(), OutList) %% Dependencies = dict(integer(), LabelSet) @@ -235,17 +237,24 @@ %% "External = fun () -> Any", which will represent any and all %% functions outside T, and whose return value has unknown type. -analyze(T) -> - analyze(T, ?DEF_LIMIT). +-type label() :: integer() | 'external' | 'top'. +-type ordset(X) :: [X]. % XXX: TAKE ME OUT +-type labelset() :: ordset(label()). +-type outlist() :: [labelset()] | 'none'. + +-spec analyze(cerl:cerl()) -> {outlist(), dict(), dict()}. -analyze(T, Limit) -> - {_, _, Esc, Dep, Par} = cerl_closurean:analyze(T), - analyze(T, Limit, Esc, Dep, Par). +analyze(Tree) -> + analyze(Tree, ?DEF_LIMIT). -analyze(T, Limit, Esc0, Dep0, Par) -> +analyze(Tree, Limit) -> + {_, _, Esc, Dep, Par} = cerl_closurean:analyze(Tree), + analyze(Tree, Limit, Esc, Dep, Par). + +analyze(Tree, Limit, Esc0, Dep0, Par) -> %% Note that we use different name spaces for variable labels and - %% function/call site labels. We assume that the labeling of T only - %% uses integers, not atoms. + %% function/call site labels. We assume that the labeling of Tree + %% only uses integers, not atoms. LabelExtL = [{label, external}], External = ann_c_var(LabelExtL, {external, 1}), ExtFun = ann_c_fun(LabelExtL, [], ann_c_var([{label, any}], 'Any')), @@ -253,7 +262,7 @@ %%% [cerl_prettypr:format(ExtFun, [noann, {paper, 80}])]), LabelTopL = [{label, top}], Top = ann_c_var(LabelTopL, {top, 0}), - TopFun = ann_c_fun(LabelTopL, [], T), + TopFun = ann_c_fun(LabelTopL, [], Tree), %% The "start fun" just makes the initialisation easier. It is not %% itself in the call graph. @@ -263,7 +272,7 @@ %%% io:fwrite("start fun:\n~s.\n", %%% [cerl_prettypr:format(StartFun, [{paper, 80}])]), - %% Gather a database of all fun-expressions in T and initialise + %% Gather a database of all fun-expressions in Tree and initialise %% their outputs and parameter variables. All escaping functions can %% receive any values as inputs. Also add an extra dependency edge %% from each fun-expression label to its parent fun-expression. @@ -447,7 +456,7 @@ {X, St1} = visit(case_arg(T), Env, St), Xs = case t_is_any(X) orelse t_is_none(X) of true -> - lists:duplicate(length(case_clauses(T)), X); + [X || _ <- cerl:case_clauses(T)]; false -> t_to_tlist(X) end, @@ -957,6 +966,8 @@ %% Callback hook for cerl_prettypr: +-spec pp_hook() -> fun((cerl:cerl(), _, fun((_,_) -> any())) -> any()). + pp_hook() -> fun pp_hook/3. diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/erl_bif_types.erl erlang-13.b.3-dfsg/lib/hipe/cerl/erl_bif_types.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/erl_bif_types.erl 2009-06-05 13:53:29.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/erl_bif_types.erl 2009-11-20 13:31:38.000000000 +0000 @@ -132,11 +132,7 @@ %%============================================================================= --type erl_type() :: 'any' | 'none' | 'unit' | {'c',atom(),_,_}. % XXX: temporarily - -%%============================================================================= - --spec type(atom(), atom(), arity()) -> erl_type(). +-spec type(atom(), atom(), arity()) -> erl_types:erl_type(). type(M, F, A) -> type(M, F, A, any_list(A)). @@ -144,7 +140,7 @@ %% Arguments should be checked for undefinedness, so we do not make %% unnecessary overapproximations. --spec type(atom(), atom(), arity(), [erl_type()]) -> erl_type(). +-spec type(atom(), atom(), arity(), [erl_types:erl_type()]) -> erl_types:erl_type(). %%-- code --------------------------------------------------------------------- type(code, add_path, 1, Xs) -> @@ -164,9 +160,7 @@ type(code, add_pathz, 1, Xs) -> type(code, add_path, 1, Xs); type(code, all_loaded, 0, _) -> - t_list(t_tuple([t_atom(), t_sup([t_string(), % filename - t_atom('preloaded'), - t_atom('cover_compiled')])])); + t_list(t_tuple([t_atom(), t_code_loaded_fname_or_status()])); type(code, compiler_dir, 0, _) -> t_string(); type(code, del_path, 1, Xs) -> @@ -193,9 +187,7 @@ type(code, is_loaded, 1, Xs) -> strict(arg_types(code, is_loaded, 1), Xs, fun (_) -> - t_sup([t_tuple([t_atom('file'), t_string()]), % filename - t_tuple([t_atom('file'), t_atom('preloaded')]), - t_tuple([t_atom('file'), t_atom('cover_compiled')]), + t_sup([t_tuple([t_atom('file'), t_code_loaded_fname_or_status()]), t_atom('false')]) end); type(code, is_sticky, 1, Xs) -> @@ -212,7 +204,8 @@ t_tuple([t_atom('error'), t_atom('bad_name')])) end); type(code, load_abs, 1, Xs) -> - type(code, load_file, 1, Xs); + strict(arg_types(code, load_abs, 1), Xs, + fun ([_File]) -> t_code_load_return(t_atom()) end); % XXX: cheating type(code, load_abs, 2, Xs) -> strict(arg_types(code, load_abs, 2), Xs, fun ([_File,Mod]) -> t_code_load_return(Mod) end); @@ -268,9 +261,7 @@ type(code, which, 1, Xs) -> strict(arg_types(code, which, 1), Xs, fun (_) -> - t_sup([t_string(), - t_atom('preloaded'), - t_atom('cover_compiled'), + t_sup([t_code_loaded_fname_or_status(), t_atom('non_existing')]) end); %%-- erl_ddll ----------------------------------------------------------------- @@ -314,8 +305,6 @@ type(erlang, exit, 1, _) -> t_none(); %% Note that exit/2 sends an exit signal to another process. type(erlang, exit, 2, _) -> t_atom('true'); -type(erlang, fault, 1, _) -> t_none(); -type(erlang, fault, 2, _) -> t_none(); type(erlang, error, 1, _) -> t_none(); type(erlang, error, 2, _) -> t_none(); type(erlang, throw, 1, _) -> t_none(); @@ -729,6 +718,12 @@ fun (_) -> t_boolean() end); type(erlang, concat_binary, 1, Xs) -> strict(arg_types(erlang, concat_binary, 1), Xs, fun (_) -> t_binary() end); +type(erlang, crc32, 1, Xs) -> + strict(arg_types(erlang, crc32, 1), Xs, fun (_) -> t_integer() end); +type(erlang, crc32, 2, Xs) -> + strict(arg_types(erlang, crc32, 2), Xs, fun (_) -> t_integer() end); +type(erlang, crc32_combine, 3, Xs) -> + strict(arg_types(erlang, crc32_combine, 3), Xs, fun (_) -> t_integer() end); type(erlang, date, 0, _) -> t_date(); type(erlang, decode_packet, 3, Xs) -> @@ -744,6 +739,9 @@ fun (_) -> t_sup(t_atom('true'), t_atom('undefined')) end); type(erlang, demonitor, 1, Xs) -> strict(arg_types(erlang, demonitor, 1), Xs, fun (_) -> t_atom('true') end); +%% TODO: overapproximation -- boolean only if 'info' is part of arg2 otherwise 'true' +type(erlang, demonitor, 2, Xs) -> + strict(arg_types(erlang, demonitor, 2), Xs, fun (_) -> t_boolean() end); type(erlang, disconnect_node, 1, Xs) -> strict(arg_types(erlang, disconnect_node, 1), Xs, fun (_) -> t_boolean() end); type(erlang, display, 1, _) -> t_atom('true'); @@ -1107,6 +1105,21 @@ type(erlang, md5_init, 0, _) -> t_binary(); type(erlang, md5_update, 2, Xs) -> strict(arg_types(erlang, md5_update, 2), Xs, fun (_) -> t_binary() end); +type(erlang, memory, 0, _) -> t_list(t_tuple([t_atom(), t_non_neg_fixnum()])); +type(erlang, memory, 1, Xs) -> + strict(arg_types(erlang, memory, 1), Xs, + fun ([Type]) -> + case t_is_atom(Type) of + true -> t_non_neg_fixnum(); + false -> + case t_is_list(Type) of + true -> t_list(t_tuple([t_atom(), t_non_neg_fixnum()])); + false -> + t_sup(t_non_neg_fixnum(), + t_list(t_tuple([t_atom(), t_non_neg_fixnum()]))) + end + end + end); type(erlang, module_loaded, 1, Xs) -> strict(arg_types(erlang, module_loaded, 1), Xs, fun (_) -> t_boolean() end); type(erlang, monitor, 2, Xs) -> @@ -1143,6 +1156,9 @@ type(erlang, port_command, 2, Xs) -> strict(arg_types(erlang, port_command, 2), Xs, fun (_) -> t_atom('true') end); +type(erlang, port_command, 3, Xs) -> + strict(arg_types(erlang, port_command, 3), Xs, + fun (_) -> t_boolean() end); type(erlang, port_connect, 2, Xs) -> strict(arg_types(erlang, port_connect, 2), Xs, fun (_) -> t_atom('true') end); @@ -1322,21 +1338,26 @@ type(erlang, send_after, 3, Xs) -> strict(arg_types(erlang, send_after, 3), Xs, fun (_) -> t_reference() end); type(erlang, seq_trace, 2, Xs) -> - strict(arg_types(erlang, seq_trace, 2), Xs, fun (_) -> t_tuple(5) end); + strict(arg_types(erlang, seq_trace, 2), Xs, + fun (_) -> t_sup(t_seq_trace_info_returns(), t_tuple(5)) end); type(erlang, seq_trace_info, 1, Xs) -> strict(arg_types(erlang, seq_trace_info, 1), Xs, fun ([Item]) -> case t_atom_vals(Item) of - ['label'] -> t_sup(t_tuple([Item, t_any()]), t_nil()); - ['serial'] -> t_sup(t_tuple([Item, t_tuple(2)]), t_nil()); + ['label'] -> + t_sup(t_tuple([Item, t_non_neg_integer()]), t_nil()); + ['serial'] -> + t_sup(t_tuple([Item, t_tuple([t_non_neg_integer(), + t_non_neg_integer()])]), + t_nil()); ['send'] -> t_tuple([Item, t_boolean()]); ['receive'] -> t_tuple([Item, t_boolean()]); ['print'] -> t_tuple([Item, t_boolean()]); ['timestamp'] -> t_tuple([Item, t_boolean()]); List when is_list(List) -> - t_sup(t_tuple([t_seq_trace_info(), t_any()]), t_nil()); + t_seq_trace_info_returns(); unknown -> - t_sup(t_tuple([t_seq_trace_info(), t_any()]), t_nil()) + t_seq_trace_info_returns() end end); type(erlang, seq_trace_print, 1, Xs) -> @@ -1363,12 +1384,12 @@ [N] when is_integer(N), N > Sz -> t_none(); Ns -> - Fun = fun (N, Xs) when is_integer(N), 1 =< N, N =< Sz -> - X = lists:nth(N, Xs), + Fun = fun (N, XL) when is_integer(N), 1 =< N, N =< Sz -> + X = lists:nth(N, XL), Y = t_sup(X, X3), - list_replace(N, Y, Xs); - (_, Xs) -> - Xs + list_replace(N, Y, XL); + (_, XL) -> + XL end, t_tuple(lists:foldl(Fun, As, Ns)) end; @@ -1467,8 +1488,9 @@ strict(arg_types(erlang, system_flag, 2), Xs, fun ([Flag,_Value]) -> %% this provides an overapproximation of all return values - T_system_flag_2 = t_sup([t_integer(), - t_boolean(), + T_system_flag_2 = t_sup([t_boolean(), + t_integer(), + t_sequential_tracer(), t_system_cpu_topology(), t_system_multi_scheduling()]), case t_is_atom(Flag) of @@ -1490,9 +1512,10 @@ t_system_multi_scheduling(); ['schedulers_online'] -> t_pos_fixnum(); - %% ['scheduler_bind_type'] -> + ['scheduler_bind_type'] -> + t_scheduler_bind_type_results(); ['sequential_tracer'] -> - t_atom('false'); % XXX: IS THIS CORRECT? + t_sequential_tracer(); ['trace_control_word'] -> t_integer(); List when is_list(List) -> @@ -1564,14 +1587,14 @@ t_atom('ultrasparc'), t_atom('x86')]); ['info'] -> t_binary(); + ['internal_cpu_topology'] -> %% Undocumented internal feature + t_internal_cpu_topology(); ['loaded'] -> t_binary(); ['logical_processors'] -> t_non_neg_fixnum(); ['machine'] -> t_string(); - ['memory'] -> - t_list(t_tuple([t_atom(), t_non_neg_fixnum()])); ['multi_scheduling'] -> t_system_multi_scheduling(); ['multi_scheduling_blockers'] -> @@ -1595,13 +1618,15 @@ t_binary(); ['scheduler_bindings'] -> t_tuple(); - %% ['scheduler_bind_type'] -> + ['scheduler_bind_type'] -> + t_scheduler_bind_type_results(); ['schedulers'] -> t_pos_fixnum(); ['schedulers_online'] -> t_pos_fixnum(); ['sequential_tracer'] -> - t_tuple([t_atom('sequential_tracer'), t_boolean()]); + t_tuple([t_atom('sequential_tracer'), + t_sequential_tracer()]); ['smp_support'] -> t_boolean(); ['system_architecture'] -> @@ -2760,23 +2785,11 @@ list_replace(1, E, [_X | Xs]) -> [E | Xs]. -any_is_none_or_unit([X | Xs]) -> - case t_is_none_or_unit(X) of - true -> - true; - false -> - any_is_none_or_unit(Xs) - end; -any_is_none_or_unit([]) -> false. +any_is_none_or_unit(Ts) -> + lists:any(fun erl_types:t_is_none_or_unit/1, Ts). -all_is_none([X | Xs]) -> - case t_is_none(X) of - true -> - all_is_none(Xs); - false -> - false - end; -all_is_none([]) -> true. +all_is_none(Ts) -> + lists:all(fun erl_types:t_is_none/1, Ts). check_guard([X], Test, Type) -> check_guard_single(X, Test, Type). @@ -3126,7 +3139,7 @@ %%============================================================================= --spec arg_types(atom(), atom(), arity()) -> [erl_type()] | 'unknown'. +-spec arg_types(atom(), atom(), arity()) -> [erl_types:erl_type()] | 'unknown'. %%------- code ---------------------------------------------------------------- arg_types(code, add_path, 1) -> @@ -3148,7 +3161,7 @@ arg_types(code, del_path, 1) -> [t_sup(t_string(), t_atom())]; % OBS: doc differs from add_path/1 - why? arg_types(code, delete, 1) -> - arg_types(code, load_file, 1); + [t_atom()]; arg_types(code, ensure_loaded, 1) -> arg_types(code, load_file, 1); arg_types(code, get_chunk, 2) -> @@ -3170,11 +3183,11 @@ arg_types(code, load_abs, 1) -> [t_string()]; arg_types(code, load_abs, 2) -> - [t_sup(t_string(), t_atom()), t_atom()]; + [t_code_loaded_fname_or_status(), t_atom()]; arg_types(code, load_binary, 3) -> - [t_atom(), t_sup(t_string(), t_atom()), t_binary()]; + [t_atom(), t_code_loaded_fname_or_status(), t_binary()]; arg_types(code, load_file, 1) -> - [t_sup(t_atom(), t_string())]; + [t_atom()]; arg_types(code, load_native_partial, 2) -> [t_atom(), t_binary()]; arg_types(code, load_native_sticky, 3) -> @@ -3351,6 +3364,12 @@ [t_pid(), t_atom()]; arg_types(erlang, concat_binary, 1) -> [t_list(t_binary())]; +arg_types(erlang, crc32, 1) -> + [t_iodata()]; +arg_types(erlang, crc32, 2) -> + [t_integer(), t_iodata()]; +arg_types(erlang, crc32_combine, 3) -> + [t_integer(), t_integer(), t_integer()]; arg_types(erlang, date, 0) -> []; arg_types(erlang, decode_packet, 3) -> @@ -3359,6 +3378,8 @@ [t_atom()]; arg_types(erlang, demonitor, 1) -> [t_reference()]; +arg_types(erlang, demonitor, 2) -> + [t_reference(), t_list(t_atoms(['flush', 'info']))]; arg_types(erlang, disconnect_node, 1) -> [t_node()]; arg_types(erlang, display, 1) -> @@ -3381,10 +3402,6 @@ [t_sup(t_pid(), t_port()), t_any()]; arg_types(erlang, external_size, 1) -> [t_any()]; % takes any term as input -arg_types(erlang, fault, 1) -> - arg_types(erlang, error, 1); % alias for compatibility -arg_types(erlang, fault, 2) -> - arg_types(erlang, error, 2); % alias for compatibility arg_types(erlang, float, 1) -> [t_number()]; arg_types(erlang, float_to_list, 1) -> @@ -3532,6 +3549,13 @@ []; arg_types(erlang, md5_update, 2) -> [t_binary(), t_sup(t_iolist(), t_binary())]; +arg_types(erlang, memory, 0) -> + []; +arg_types(erlang, memory, 1) -> + Arg = t_atoms(['total', 'processes', 'processes_used', 'system', + 'atom', 'atom_used', 'binary', 'code', 'ets', + 'maximum']), + [t_sup(Arg, t_list(Arg))]; arg_types(erlang, module_loaded, 1) -> [t_atom()]; arg_types(erlang, monitor, 2) -> @@ -3552,8 +3576,10 @@ arg_types(erlang, now, 0) -> []; arg_types(erlang, open_port, 2) -> - [t_sup(t_atom(), t_sup(t_tuple([t_atom('spawn'), t_sup(t_atom(), t_string())]), - t_tuple([t_atom('fd'), t_integer(), t_integer()]))), + [t_sup(t_atom(), t_sup([t_tuple([t_atom('spawn'), t_string()]), + t_tuple([t_atom('spawn_driver'), t_string()]), + t_tuple([t_atom('spawn_executable'), t_string()]), + t_tuple([t_atom('fd'), t_integer(), t_integer()])])), t_list(t_sup(t_sup([t_atom('stream'), t_atom('exit_status'), t_atom('use_stdio'), @@ -3562,11 +3588,14 @@ t_atom('in'), t_atom('out'), t_atom('binary'), - t_atom('eof')]), + t_atom('eof'), + t_atom('hide')]), t_sup([t_tuple([t_atom('packet'), t_integer()]), t_tuple([t_atom('line'), t_integer()]), t_tuple([t_atom('cd'), t_string()]), - t_tuple([t_atom('env'), t_list()])])))]; + t_tuple([t_atom('env'), t_list(t_tuple(2))]), % XXX: More + t_tuple([t_atom('args'), t_list(t_string())]), + t_tuple([t_atom('arg0'), t_string()])])))]; arg_types(erlang, phash, 2) -> [t_any(), t_pos_integer()]; arg_types(erlang, phash2, 1) -> @@ -3581,6 +3610,10 @@ [t_sup(t_port(), t_atom())]; arg_types(erlang, port_command, 2) -> [t_sup(t_port(), t_atom()), t_sup(t_iolist(), t_binary())]; +arg_types(erlang, port_command, 3) -> + [t_sup(t_port(), t_atom()), + t_sup(t_iolist(), t_binary()), + t_list(t_atoms(['force', 'nosuspend']))]; arg_types(erlang, port_connect, 2) -> [t_sup(t_port(), t_atom()), t_pid()]; arg_types(erlang, port_control, 3) -> @@ -3591,8 +3624,8 @@ [t_sup(t_port(), t_atom())]; arg_types(erlang, port_info, 2) -> [t_sup(t_port(), t_atom()), - t_sup([t_atom('registered_name'), t_atom('id'), t_atom('connected'), - t_atom('links'), t_atom('name'), t_atom('input'),t_atom('output')])]; + t_atoms(['registered_name', 'id', 'connected', + 'links', 'name', 'input', 'output'])]; arg_types(erlang, port_to_list, 1) -> [t_port()]; arg_types(erlang, ports, 0) -> @@ -3716,17 +3749,25 @@ %% Undocumented; used to implement (the documented) seq_trace module. t_atom('sequential_tracer'), t_atom('trace_control_word'), + %% 'internal_cpu_topology' is an undocumented internal feature. + t_atom('internal_cpu_topology'), t_integer()]), t_sup([t_integer(), + %% 'cpu_topology' + t_system_cpu_topology(), + %% 'scheduler_bind_type' + t_scheduler_bind_type_args(), %% Undocumented: the following is for 'debug_flags' that %% takes any erlang term as flags and currently ignores it. %% t_any(), % commented out since it destroys the type signature %% - %% Again undocumented; the following is for 'sequential_tracer' - t_atom('false'), + %% Again undocumented; the following are for 'sequential_tracer' + t_sequential_tracer(), %% The following two are for 'multi_scheduling' t_atom('block'), - t_atom('unblock')])]; + t_atom('unblock'), + %% The following is for 'internal_cpu_topology' + t_internal_cpu_topology()])]; arg_types(erlang, system_info, 1) -> [t_sup([t_atom(), % documented t_tuple([t_atom(), t_any()]), % documented @@ -4271,7 +4312,7 @@ unknown. % safe approximation for all functions. --spec is_known(atom(), atom(), arity()) -> bool(). +-spec is_known(atom(), atom(), arity()) -> boolean(). is_known(M, F, A) -> arg_types(M, F, A) =/= unknown. @@ -4423,6 +4464,11 @@ t_atom('native_code'), t_atom('sticky_directory')]). % only for the 'code' functions +t_code_loaded_fname_or_status() -> + t_sup([t_string(), % filename + t_atom('preloaded'), + t_atom('cover_compiled')]). + %% ===================================================================== %% These are used for the built-in functions of 'erlang' %% ===================================================================== @@ -4501,6 +4547,15 @@ t_atom('label'), t_atom('serial')]). +%% XXX: Better if we also maintain correspondencies between infos and values +t_seq_trace_info_returns() -> + Values = t_sup([t_non_neg_integer(), t_boolean(), + t_tuple([t_non_neg_integer(), t_non_neg_integer()])]), + t_sup(t_tuple([t_seq_trace_info(), Values]), t_nil()). + +t_sequential_tracer() -> + t_sup([t_atom('false'), t_pid(), t_port()]). + t_spawn_options() -> t_sup([t_atom('link'), t_atom('monitor'), @@ -4540,6 +4595,38 @@ t_system_cpu_topology_info_list() -> t_nil(). % it may be extended in the future +t_internal_cpu_topology() -> %% Internal undocumented type + t_sup(t_list(t_tuple([t_atom('cpu'), + t_non_neg_fixnum(), + t_non_neg_fixnum(), + t_non_neg_fixnum(), + t_non_neg_fixnum(), + t_non_neg_fixnum(), + t_non_neg_fixnum()])), + t_atom('undefined')). + +t_scheduler_bind_type_args() -> + t_sup([t_atom('default_bind'), + t_atom('no_node_processor_spread'), + t_atom('no_node_thread_spread'), + t_atom('no_spread'), + t_atom('processor_spread'), + t_atom('spread'), + t_atom('thread_spread'), + t_atom('thread_no_node_processor_spread'), + t_atom('unbound')]). + +t_scheduler_bind_type_results() -> + t_sup([t_atom('no_node_processor_spread'), + t_atom('no_node_thread_spread'), + t_atom('no_spread'), + t_atom('processor_spread'), + t_atom('spread'), + t_atom('thread_spread'), + t_atom('thread_no_node_processor_spread'), + t_atom('unbound')]). + + t_system_monitor_settings() -> t_sup([t_atom('undefined'), t_tuple([t_pid(), t_system_monitor_options()])]). @@ -4582,7 +4669,8 @@ %% From the 'ets' documentation %%----------------------------- %% Option = Type | Access | named_table | {keypos,Pos} -%% | {heir,pid(),HeirData} | {heir,none} | {write_concurrency,bool()} +%% | {heir,pid(),HeirData} | {heir,none} +%% | {write_concurrency,boolean()} %% Type = set | ordered_set | bag | duplicate_bag %% Access = public | protected | private %% Pos = integer() diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/erl_types.erl erlang-13.b.3-dfsg/lib/hipe/cerl/erl_types.erl --- erlang-13.b.1-dfsg/lib/hipe/cerl/erl_types.erl 2009-06-05 13:53:30.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/erl_types.erl 2009-11-20 13:31:38.000000000 +0000 @@ -69,6 +69,7 @@ t_cons_tl/1, t_constant/0, t_contains_opaque/1, + t_elements/1, t_find_opaque_mismatch/2, t_fixnum/0, t_map/2, @@ -132,6 +133,7 @@ t_is_port/1, t_is_maybe_improper_list/1, t_is_reference/1, + t_is_remote/1, t_is_string/1, t_is_subtype/2, t_is_tuple/1, @@ -171,8 +173,10 @@ %% t_maybe_improper_list/2, t_product/1, t_reference/0, + t_remote/3, t_string/0, t_struct_from_opaque/2, + t_solve_remote/2, t_subst/2, t_subtract/2, t_subtract_list/2, @@ -249,6 +253,7 @@ -define(number_tag, number). -define(opaque_tag, opaque). -define(product_tag, product). +-define(remote_tag, remote). -define(tuple_set_tag, tuple_set). -define(tuple_tag, tuple). -define(union_tag, union). @@ -277,10 +282,12 @@ -define(any, any). -define(none, none). -define(unit, unit). - %% Generic constructor. --record(c, {tag :: tag(), elements = [], qualifier = ?unknown_qual :: qual()}). +%% Generic constructor - elements can be many things depending on the tag. +-record(c, {tag :: tag(), + elements = [] :: term(), + qualifier = ?unknown_qual :: qual()}). --type erl_type() :: ?any | ?none | ?unit | #c{}. +-opaque erl_type() :: ?any | ?none | ?unit | #c{}. %%----------------------------------------------------------------------------- %% Auxiliary types and convenient macros @@ -292,7 +299,8 @@ -record(int_set, {set :: [integer()]}). -record(int_rng, {from :: rng_elem(), to :: rng_elem()}). -record(opaque, {mod :: module(), name :: atom(), - args = [], struct :: erl_type()}). + args = [] :: [erl_type()], struct :: erl_type()}). +-record(remote, {mod:: module(), name :: atom(), args = [] :: [erl_type()]}). -define(atom(Set), #c{tag=?atom_tag, elements=Set}). -define(bitstr(Unit, Base), #c{tag=?binary_tag, elements=[Unit,Base]}). @@ -311,6 +319,7 @@ qualifier=Qualifier}. -define(opaque(Optypes), #c{tag=?opaque_tag, elements=Optypes}). -define(product(Types), #c{tag=?product_tag, elements=Types}). +-define(remote(RemTypes), #c{tag=?remote_tag, elements=RemTypes}). -define(tuple(Types, Arity, Qual), #c{tag=?tuple_tag, elements=Types, qualifier={Arity, Qual}}). -define(tuple_set(Tuples), #c{tag=?tuple_set_tag, elements=Tuples}). @@ -329,17 +338,18 @@ %% Unions %% --define(union(List), #c{tag=?union_tag, elements=[_,_,_,_,_,_,_,_,_]=List}). +-define(union(List), #c{tag=?union_tag, elements=[_,_,_,_,_,_,_,_,_,_]=List}). --define(atom_union(T), ?union([T,?none,?none,?none,?none,?none,?none,?none,?none])). --define(bitstr_union(T), ?union([?none,T,?none,?none,?none,?none,?none,?none,?none])). --define(function_union(T), ?union([?none,?none,T,?none,?none,?none,?none,?none,?none])). --define(identifier_union(T), ?union([?none,?none,?none,T,?none,?none,?none,?none,?none])). --define(list_union(T), ?union([?none,?none,?none,?none,T,?none,?none,?none,?none])). --define(number_union(T), ?union([?none,?none,?none,?none,?none,T,?none,?none,?none])). --define(tuple_union(T), ?union([?none,?none,?none,?none,?none,?none,T,?none,?none])). --define(matchstate_union(T), ?union([?none,?none,?none,?none,?none,?none,?none,T,?none])). --define(opaque_union(T), ?union([?none,?none,?none,?none,?none,?none,?none,?none,T])). +-define(atom_union(T), ?union([T,?none,?none,?none,?none,?none,?none,?none,?none,?none])). +-define(bitstr_union(T), ?union([?none,T,?none,?none,?none,?none,?none,?none,?none,?none])). +-define(function_union(T), ?union([?none,?none,T,?none,?none,?none,?none,?none,?none,?none])). +-define(identifier_union(T), ?union([?none,?none,?none,T,?none,?none,?none,?none,?none,?none])). +-define(list_union(T), ?union([?none,?none,?none,?none,T,?none,?none,?none,?none,?none])). +-define(number_union(T), ?union([?none,?none,?none,?none,?none,T,?none,?none,?none,?none])). +-define(tuple_union(T), ?union([?none,?none,?none,?none,?none,?none,T,?none,?none,?none])). +-define(matchstate_union(T), ?union([?none,?none,?none,?none,?none,?none,?none,T,?none,?none])). +-define(opaque_union(T), ?union([?none,?none,?none,?none,?none,?none,?none,?none,T,?none])). +-define(remote_union(T), ?union([?none,?none,?none,?none,?none,?none,?none,?none,?none,T])). -define(integer_union(T), ?number_union(T)). -define(float_union(T), ?number_union(T)). -define(nil_union(T), ?list_union(T)). @@ -360,7 +370,7 @@ t_any() -> ?any. --spec t_is_any(erl_type()) -> bool(). +-spec t_is_any(erl_type()) -> boolean(). t_is_any(?any) -> true; t_is_any(_) -> false. @@ -370,7 +380,7 @@ t_none() -> ?none. --spec t_is_none(erl_type()) -> bool(). +-spec t_is_none(erl_type()) -> boolean(). t_is_none(?none) -> true; t_is_none(_) -> false. @@ -384,12 +394,12 @@ t_opaque(Mod, Name, Args, Struct) -> ?opaque(set_singleton(#opaque{mod=Mod, name=Name, args=Args, struct=Struct})). --spec t_is_opaque(erl_type()) -> bool(). +-spec t_is_opaque(erl_type()) -> boolean(). t_is_opaque(?opaque(_)) -> true; t_is_opaque(_) -> false. --spec t_has_opaque_subtype(erl_type()) -> bool(). +-spec t_has_opaque_subtype(erl_type()) -> boolean(). t_has_opaque_subtype(?union(Ts)) -> lists:any(fun t_is_opaque/1, Ts); @@ -443,7 +453,7 @@ [First|_] -> First end. --spec t_contains_opaque(erl_type()) -> bool(). +-spec t_contains_opaque(erl_type()) -> boolean(). t_contains_opaque(?any) -> false; t_contains_opaque(?none) -> false; @@ -470,7 +480,7 @@ t_contains_opaque(?union(List)) -> list_contains_opaque(List); t_contains_opaque(?var(_Id)) -> false. --spec list_contains_opaque([erl_type()]) -> bool(). +-spec list_contains_opaque([erl_type()]) -> boolean(). list_contains_opaque(List) -> lists:any(fun t_contains_opaque/1, List). @@ -531,10 +541,10 @@ end end, RecDict), OpaqueTypeDict = - dict:map(fun({opaque, Name}, {Type, ArgNames}) -> + dict:map(fun({opaque, Name}, {Module, Type, ArgNames}) -> case ArgNames of [] -> - t_opaque('UNKNOWN', Name, [], t_from_form(Type, RecDict)); + t_opaque(Module, Name, [], t_from_form(Type, RecDict)); _ -> throw({error,"Polymorphic opaque types not supported yet"}) end @@ -556,7 +566,7 @@ t_opaque_atom_vals(OpaqueStruct) -> case OpaqueStruct of ?atom(_) -> t_atom_vals(OpaqueStruct); - ?union([Atom,_,_,_,_,_,_,_,_]) -> t_atom_vals(Atom); + ?union([Atom,_,_,_,_,_,_,_,_,_]) -> t_atom_vals(Atom); _ -> unknown end. @@ -575,10 +585,11 @@ ?tuple_set(_) = TupleSet -> Tuples = t_tuple_subtypes(TupleSet), lists:flatten([t_opaque_tuple_tags(T) || T <- Tuples]); - ?union([_,_,_,_,_,_,Tuples,_,_]) -> t_opaque_tuple_tags(Tuples); + ?union([_,_,_,_,_,_,Tuples,_,_,_]) -> t_opaque_tuple_tags(Tuples); _ -> [] end. +%% Decompose opaque instances of type arg2 to structured types, in arg1 -spec t_struct_from_opaque(erl_type(), erl_type()) -> erl_type(). t_struct_from_opaque(?function(Domain, Range), Opaque) -> @@ -596,10 +607,13 @@ t_struct_from_opaque(?tuple(?any, _, _) = T, _Opaque) -> T; t_struct_from_opaque(?tuple(Types, Arity, Tag), Opaque) -> ?tuple(list_struct_from_opaque(Types, Opaque), Arity, Tag); -t_struct_from_opaque(?tuple_set(_Set) = T, Opaque) -> - t_tuple(list_struct_from_opaque(t_tuple_subtypes(T), Opaque)); -t_struct_from_opaque(?union(List), Opaque) -> - ?union(list_struct_from_opaque(List, Opaque)). +t_struct_from_opaque(?tuple_set(Set), Opaque) -> + NewSet = [{Sz, [t_struct_from_opaque(T, Opaque) || T <- Tuples]} + || {Sz, Tuples} <- Set], + ?tuple_set(NewSet); +t_struct_from_opaque(?union(List), Opaque) -> + t_sup(list_struct_from_opaque(List, Opaque)); +t_struct_from_opaque(Type, _Opaque) -> Type. list_struct_from_opaque(Types, Opaque) -> [t_struct_from_opaque(Type, Opaque) || Type <- Types]. @@ -610,6 +624,96 @@ [O || O <- all_opaque_builtins(), t_opaque_module(O) =:= Module]. %%----------------------------------------------------------------------------- +%% Remote types +%% These types are used for preprocessing they should never reach the analysis stage + +-spec t_remote(module(), atom(), [_]) -> erl_type(). + +t_remote(Mod, Name, Args) -> + ?remote(set_singleton(#remote{mod=Mod, name=Name, args=Args})). + +-spec t_is_remote(erl_type()) -> boolean(). + +t_is_remote(?remote(_)) -> true; +t_is_remote(_) -> false. + +-spec t_solve_remote(erl_type(), dict()) -> erl_type(). + +t_solve_remote(Type , Records) -> + t_solve_remote(Type, Records, ordsets:new()). + +t_solve_remote(?function(Domain, Range), R, C) -> + ?function(t_solve_remote(Domain, R, C), t_solve_remote(Range, R, C)); +t_solve_remote(?list(Types, Term, Size), R, C) -> + ?list(t_solve_remote(Types, R, C), Term, Size); +t_solve_remote(?product(Types), R, C) -> + ?product(list_solve_remote(Types, R, C)); +t_solve_remote(?opaque(Set), R, C) -> + List = ordsets:to_list(Set), + NewList = [Remote#opaque{struct = t_solve_remote(Struct, R, C)} + || Remote = #opaque{struct = Struct} <- List], + ?opaque(ordsets:from_list(NewList)); +t_solve_remote(?tuple(?any, _, _) = T, _R, _C) -> T; +t_solve_remote(?tuple(Types, Arity, Tag), R, C) -> + ?tuple(list_solve_remote(Types, R, C), Arity, Tag); +t_solve_remote(?tuple_set(Set), R, C) -> + NewSet = [{Sz, [t_solve_remote(T, R, C) || T <- Tuples]} || {Sz, Tuples} <- Set], + ?tuple_set(NewSet); +t_solve_remote(?remote(Set), R, C) -> + Cycle = ordsets:intersection(Set, C), + case ordsets:size(Cycle) of + 0 -> ok; + _ -> + CycleMsg = "Cycle detected while processing remote types: " ++ + t_to_string(?remote(C), dict:new()), + throw({error, CycleMsg}) + end, + NewCycle = ordsets:union(C, Set), + TypeFun = + fun(#remote{mod = RemoteModule, name = Name, args = Args}) -> + case dict:find(RemoteModule, R) of + error -> + Msg = io_lib:format("Cannot locate module ~w to " + "resolve the remote type: ~w:~w()~n", + [RemoteModule, RemoteModule, Name]), + throw({error, Msg}); + {ok, RemoteDict} -> + case lookup_type(Name, RemoteDict) of + {type, {_TypeMod, Type, ArgNames}} when length(Args) =:= length(ArgNames) -> + List = lists:zip(ArgNames, Args), + TmpVardict = dict:from_list(List), + NewType = t_from_form(Type, RemoteDict, TmpVardict), + t_solve_remote(NewType, R, NewCycle); + {opaque, {OpModule, Type, ArgNames}} when length(Args) =:= length(ArgNames) -> + List = lists:zip(ArgNames, Args), + TmpVardict = dict:from_list(List), + Rep = t_from_form(Type, RemoteDict, TmpVardict), + NewRep = t_solve_remote(Rep, R, NewCycle), + t_from_form({opaque, -1, Name, {OpModule, Args, NewRep}}, + RemoteDict, TmpVardict); + {type, _} -> + Msg = io_lib:format("Unknown remote type ~w\n", [Name]), + throw({error, Msg}); + {opaque, _} -> + Msg = io_lib:format("Unknown remote opaque type ~w\n", [Name]), + throw({error, Msg}); + error -> + Msg = io_lib:format("Unable to find remote type ~w:~w()\n", + [RemoteModule, Name]), + throw({error, Msg}) + end + end + end, + RemoteList = ordsets:to_list(Set), + t_sup([TypeFun(RemoteType) || RemoteType <- RemoteList]); +t_solve_remote(?union(List), R, C) -> + t_sup(list_solve_remote(List, R, C)); +t_solve_remote(T, _R, _C) -> T. + +list_solve_remote(Types, R, C) -> + [t_solve_remote(Type, R, C) || Type <- Types]. + +%%----------------------------------------------------------------------------- %% Unit type. Signals non termination. %% @@ -618,12 +722,12 @@ t_unit() -> ?unit. --spec t_is_unit(erl_type()) -> bool(). +-spec t_is_unit(erl_type()) -> boolean(). t_is_unit(?unit) -> true; t_is_unit(_) -> false. --spec t_is_none_or_unit(erl_type()) -> bool(). +-spec t_is_none_or_unit(erl_type()) -> boolean(). t_is_none_or_unit(?none) -> true; t_is_none_or_unit(?unit) -> true; @@ -656,12 +760,12 @@ ?atom(_) = Atm = t_inf(t_atom(), Other), t_atom_vals(Atm). --spec t_is_atom(erl_type()) -> bool(). +-spec t_is_atom(erl_type()) -> boolean(). t_is_atom(?atom(_)) -> true; t_is_atom(_) -> false. --spec t_is_atom(atom(), erl_type()) -> bool(). +-spec t_is_atom(atom(), erl_type()) -> boolean(). t_is_atom(Atom, ?atom(?any)) when is_atom(Atom) -> false; t_is_atom(Atom, ?atom(Set)) when is_atom(Atom) -> set_is_singleton(Atom, Set); @@ -674,7 +778,7 @@ t_boolean() -> ?atom(set_from_list([false, true])). --spec t_is_boolean(erl_type()) -> bool(). +-spec t_is_boolean(erl_type()) -> boolean(). t_is_boolean(?atom(?any)) -> false; t_is_boolean(?atom(Set)) -> @@ -694,7 +798,7 @@ t_binary() -> ?bitstr(8, 0). --spec t_is_binary(erl_type()) -> bool(). +-spec t_is_binary(erl_type()) -> boolean(). t_is_binary(?bitstr(U, B)) -> ((U rem 8) =:= 0) andalso ((B rem 8) =:= 0); @@ -754,7 +858,7 @@ T2p = t_inf(t_bitstr(), T2), bitstr_match(T1p, T2p). --spec t_is_bitstr(erl_type()) -> bool(). +-spec t_is_bitstr(erl_type()) -> boolean(). t_is_bitstr(?bitstr(_, _)) -> true; t_is_bitstr(_) -> false. @@ -776,7 +880,7 @@ Slots = [Init|[?none || _ <- lists:seq(1, Max)]], ?matchstate(Init, t_product(Slots)). --spec t_is_matchstate(erl_type()) -> bool(). +-spec t_is_matchstate(erl_type()) -> boolean(). t_is_matchstate(?matchstate(_, _)) -> true; t_is_matchstate(_) -> false. @@ -885,7 +989,7 @@ t_fun_range(?function(_, Range)) -> Range. --spec t_is_fun(erl_type()) -> bool(). +-spec t_is_fun(erl_type()) -> boolean(). t_is_fun(?function(_, _)) -> true; t_is_fun(_) -> false. @@ -913,7 +1017,7 @@ t_port() -> ?identifier(set_singleton(?port_qual)). --spec t_is_port(erl_type()) -> bool(). +-spec t_is_port(erl_type()) -> boolean(). t_is_port(?identifier(?any)) -> false; t_is_port(?identifier(Set)) -> set_is_singleton(?port_qual, Set); @@ -926,7 +1030,7 @@ t_pid() -> ?identifier(set_singleton(?pid_qual)). --spec t_is_pid(erl_type()) -> bool(). +-spec t_is_pid(erl_type()) -> boolean(). t_is_pid(?identifier(?any)) -> false; t_is_pid(?identifier(Set)) -> set_is_singleton(?pid_qual, Set); @@ -939,7 +1043,7 @@ t_reference() -> ?identifier(set_singleton(?reference_qual)). --spec t_is_reference(erl_type()) -> bool(). +-spec t_is_reference(erl_type()) -> boolean(). t_is_reference(?identifier(?any)) -> false; t_is_reference(?identifier(Set)) -> set_is_singleton(?reference_qual, Set); @@ -959,7 +1063,7 @@ t_number(X) when is_integer(X) -> t_integer(X). --spec t_is_number(erl_type()) -> bool(). +-spec t_is_number(erl_type()) -> boolean(). t_is_number(?number(_, _)) -> true; t_is_number(_) -> false. @@ -984,7 +1088,7 @@ t_float() -> ?float. --spec t_is_float(erl_type()) -> bool(). +-spec t_is_float(erl_type()) -> boolean(). t_is_float(?float) -> true; t_is_float(_) -> false. @@ -1006,7 +1110,7 @@ t_integers(List) when is_list(List) -> t_sup([t_integer(I) || I <- List]). --spec t_is_integer(erl_type()) -> bool(). +-spec t_is_integer(erl_type()) -> boolean(). t_is_integer(?integer(_)) -> true; t_is_integer(_) -> false. @@ -1019,7 +1123,7 @@ ?byte. -ifdef(DO_ERL_TYPES_TEST). --spec t_is_byte(erl_type()) -> bool(). +-spec t_is_byte(erl_type()) -> boolean(). t_is_byte(?int_range(neg_inf, _)) -> false; t_is_byte(?int_range(_, pos_inf)) -> false; @@ -1037,7 +1141,7 @@ t_char() -> ?char. --spec t_is_char(erl_type()) -> bool(). +-spec t_is_char(erl_type()) -> boolean(). t_is_char(?int_range(neg_inf, _)) -> false; t_is_char(?int_range(_, pos_inf)) -> false; @@ -1085,7 +1189,7 @@ ?unit -> ?none end. --spec t_is_cons(erl_type()) -> bool(). +-spec t_is_cons(erl_type()) -> boolean(). t_is_cons(?nonempty_list(_, _)) -> true; t_is_cons(_) -> false. @@ -1104,7 +1208,7 @@ t_nil() -> ?nil. --spec t_is_nil(erl_type()) -> bool(). +-spec t_is_nil(erl_type()) -> boolean(). t_is_nil(?nil) -> true; t_is_nil(_) -> false. @@ -1131,7 +1235,7 @@ t_list_termination(?nil) -> ?nil; t_list_termination(?list(_, Term, _)) -> Term. --spec t_is_list(erl_type()) -> bool(). +-spec t_is_list(erl_type()) -> boolean(). t_is_list(?list(_Contents, ?nil, _)) -> true; t_is_list(?nil) -> true; @@ -1157,7 +1261,7 @@ t_string() -> t_list(t_char()). --spec t_is_string(erl_type()) -> bool(). +-spec t_is_string(erl_type()) -> boolean(). t_is_string(X) -> t_is_list(X) andalso t_is_char(t_list_elements(X)). @@ -1177,7 +1281,7 @@ true = t_is_subtype(t_nil(), Termination), ?list(Content, Termination, ?unknown_qual). --spec t_is_maybe_improper_list(erl_type()) -> bool(). +-spec t_is_maybe_improper_list(erl_type()) -> boolean(). t_is_maybe_improper_list(?list(_, _, _)) -> true; t_is_maybe_improper_list(?nil) -> true; @@ -1259,7 +1363,7 @@ t_tuple_subtypes(?tuple_set(List)) -> lists:append([Tuples || {_Size, Tuples} <- List]). --spec t_is_tuple(erl_type()) -> bool(). +-spec t_is_tuple(erl_type()) -> boolean(). t_is_tuple(?tuple(_, _, _)) -> true; t_is_tuple(?tuple_set(_)) -> true; @@ -1274,7 +1378,7 @@ t_constant() -> t_sup([t_number(), t_identifier(), t_atom(), t_fun(), t_binary()]). --spec t_is_constant(erl_type()) -> bool(). +-spec t_is_constant(erl_type()) -> boolean(). t_is_constant(X) -> t_is_subtype(X, t_constant()). @@ -1294,7 +1398,7 @@ t_non_neg_integer() -> t_from_range(0, pos_inf). --spec t_is_non_neg_integer(erl_type()) -> bool(). +-spec t_is_non_neg_integer(erl_type()) -> boolean(). t_is_non_neg_integer(?integer(_) = T) -> t_is_subtype(T, t_non_neg_integer()); @@ -1426,7 +1530,7 @@ [t_array(), t_dict(), t_digraph(), t_gb_set(), t_gb_tree(), t_queue(), t_set(), t_tid()]. --spec is_opaque_builtin(atom(), atom()) -> bool(). +-spec is_opaque_builtin(atom(), atom()) -> boolean(). is_opaque_builtin(array, array) -> true; is_opaque_builtin(dict, dict) -> true; @@ -1463,7 +1567,7 @@ t_var(Atom) when is_atom(Atom) -> ?var(Atom); t_var(Int) when is_integer(Int) -> ?var(Int). --spec t_is_var(erl_type()) -> bool(). +-spec t_is_var(erl_type()) -> boolean(). t_is_var(?var(_)) -> true; t_is_var(_) -> false. @@ -1472,7 +1576,7 @@ t_var_name(?var(Id)) -> Id. --spec t_has_var(erl_type()) -> bool(). +-spec t_has_var(erl_type()) -> boolean(). t_has_var(?var(_)) -> true; t_has_var(?function(Domain, Range)) -> @@ -1489,7 +1593,7 @@ %% exit(lists:flatten(io_lib:format("Union happens in t_has_var/1 ~p\n",[U]))); t_has_var(_) -> false. --spec t_has_var_list([erl_type()]) -> bool(). +-spec t_has_var_list([erl_type()]) -> boolean(). t_has_var_list([T|Ts]) -> t_has_var(T) orelse t_has_var_list(Ts); @@ -1605,7 +1709,7 @@ t_from_range_unsafe(X, Y) when is_integer(X), is_integer(Y) -> t_none(); t_from_range_unsafe(pos_inf, neg_inf) -> t_none(). --spec t_is_fixnum(erl_type()) -> bool(). +-spec t_is_fixnum(erl_type()) -> boolean(). t_is_fixnum(?int_range(neg_inf, _)) -> false; t_is_fixnum(?int_range(_, pos_inf)) -> false; @@ -1615,7 +1719,7 @@ is_fixnum(set_min(Set)) andalso is_fixnum(set_max(Set)); t_is_fixnum(_) -> false. --spec is_fixnum(integer()) -> bool(). +-spec is_fixnum(integer()) -> boolean(). is_fixnum(N) when is_integer(N) -> Bits = ?BITS, @@ -1627,7 +1731,7 @@ infinity_geq(neg_inf, _) -> false; infinity_geq(A, B) -> A >= B. --spec t_is_bitwidth(erl_type()) -> bool(). +-spec t_is_bitwidth(erl_type()) -> boolean(). t_is_bitwidth(?int_range(neg_inf, _)) -> false; t_is_bitwidth(?int_range(_, pos_inf)) -> false; @@ -1735,6 +1839,8 @@ %% io:format("Debug: t_sup executed with args ~w and ~w~n",[T1, T2]), ?none; %%t_sup(T1, T2=?opaque(_,_,_)) -> %% io:format("Debug: t_sup executed with args ~w and ~w~n",[T1, T2]), ?none; +t_sup(?remote(Set1), ?remote(Set2)) -> + ?remote(set_union_no_limit(Set1, Set2)); t_sup(?matchstate(Pres1, Slots1), ?matchstate(Pres2, Slots2)) -> ?matchstate(t_sup(Pres1, Pres2), t_sup(Slots1, Slots2)); t_sup(?nil, ?nil) -> ?nil; @@ -1900,19 +2006,61 @@ end. force_union(T = ?atom(_)) -> ?atom_union(T); -force_union(T = ?bitstr(_,_)) -> ?bitstr_union(T); +force_union(T = ?bitstr(_, _)) -> ?bitstr_union(T); force_union(T = ?function(_, _)) -> ?function_union(T); force_union(T = ?identifier(_)) -> ?identifier_union(T); force_union(T = ?list(_, _, _)) -> ?list_union(T); force_union(T = ?nil) -> ?list_union(T); force_union(T = ?number(_,_)) -> ?number_union(T); force_union(T = ?opaque(_)) -> ?opaque_union(T); +force_union(T = ?remote(_)) -> ?remote_union(T); force_union(T = ?tuple(_, _, _)) -> ?tuple_union(T); force_union(T = ?tuple_set(_)) -> ?tuple_union(T); force_union(T = ?matchstate(_, _)) -> ?matchstate_union(T); force_union(T = ?union(_)) -> T. %%----------------------------------------------------------------------------- +%% An attempt to write the inverse operation of t_sup/1 -- XXX: INCOMPLETE !! +%% + +-spec t_elements(erl_type()) -> [erl_type()]. + +t_elements(?none) -> []; +t_elements(?unit) -> []; +t_elements(?any = T) -> [T]; +t_elements(?nil = T) -> [T]; +t_elements(?atom(?any) = T) -> [T]; +t_elements(?atom(Atoms)) -> + [t_atom(A) || A <- Atoms]; +t_elements(?bitstr(_, _) = T) -> [T]; +t_elements(?function(_, _) = T) -> [T]; +t_elements(?identifier(?any) = T) -> [T]; +t_elements(?identifier(IDs)) -> + [?identifier([T]) || T <- IDs]; +t_elements(?list(_, _, _) = T) -> [T]; +t_elements(?number(_, _) = T) -> + case T of + ?number(?any, ?unknown_qual) -> [T]; + ?float -> [T]; + ?integer(?any) -> [T]; + ?int_range(_, _) -> [T]; + ?int_set(Set) -> + [t_integer(I) || I <- Set] + end; +t_elements(?opaque(_) = T) -> [T]; +t_elements(?tuple(_, _, _) = T) -> [T]; +t_elements(?tuple_set(_) = TS) -> + case t_tuple_subtypes(TS) of + unknown -> []; + Elems -> Elems + end; +t_elements(?union(List)) -> + lists:append([t_elements(T) || T <- List]); +t_elements(?var(_)) -> [?any]. %% yes, vars exist -- what else to do here? +%% t_elements(T) -> +%% io:format("T_ELEMENTS => ~p\n", [T]). + +%%----------------------------------------------------------------------------- %% Infimum %% @@ -2169,8 +2317,27 @@ inf_tuples_in_sets([], _, Acc, _Mode) -> lists:reverse(Acc); inf_tuples_in_sets(_, [], Acc, _Mode) -> lists:reverse(Acc). -inf_union(U1, U2, Mode) -> - inf_union(U1, U2, 0, [], Mode). +inf_union(U1, U2, opaque) -> +%%--------------------------------------------------------------------- +%% Under Testing +%%---------------------------------------------------------------------- +%% OpaqueFun = +%% fun(Union1, Union2) -> +%% [_,_,_,_,_,_,_,_,Opaque,_] = Union1, +%% [A,B,F,I,L,N,T,M,_,_R] = Union2, +%% List = [A,B,F,I,L,N,T,M], +%% case [T || T <- List, t_inf(T, Opaque, opaque) =/= ?none] of +%% [] -> ?none; +%% _ -> Opaque +%% end +%% end, +%% O1 = OpaqueFun(U1, U2), +%% O2 = OpaqueFun(U2, U1), +%% Union = inf_union(U1, U2, 0, [], opaque), +%% t_sup([O1, O2, Union]); + inf_union(U1, U2, 0, [], opaque); +inf_union(U1, U2, OtherMode) -> + inf_union(U1, U2, 0, [], OtherMode). inf_union([?none|Left1], [?none|Left2], N, Acc, Mode) -> inf_union(Left1, Left2, N, [?none|Acc], Mode); @@ -2229,9 +2396,9 @@ false -> T end. -t_subst(?var(Id) = T, Dict, Fun) -> +t_subst(?var(Id) = V, Dict, Fun) -> case dict:find(Id, Dict) of - error -> Fun(T); + error -> Fun(V); {ok, Type} -> Type end; t_subst(?list(Contents, Termination, Size), Dict, Fun) -> @@ -2255,8 +2422,8 @@ T; t_subst(?tuple(Elements, _Arity, _Tag), Dict, Fun) -> t_tuple([t_subst(E, Dict, Fun) || E <- Elements]); -t_subst(?tuple_set(_) = T, Dict, Fun) -> - t_sup([t_subst(T, Dict, Fun) || T <- t_tuple_subtypes(T)]); +t_subst(?tuple_set(_) = TS, Dict, Fun) -> + t_sup([t_subst(T, Dict, Fun) || T <- t_tuple_subtypes(TS)]); t_subst(T, _Dict, _Fun) -> T. @@ -2397,7 +2564,7 @@ %%assign_vars(?tuple_set(_) = T, ?tuple_set(List2), Dict) -> %% %% All Rhs tuples must already be subtypes of Lhs, so we can take %% %% each one separatly. -%% assign_vars_lists(lists:duplicate(length(List2), T), List2, Dict); +%% assign_vars_lists([T || _ <- List2], List2, Dict); %%assign_vars(?tuple(?any, ?any, ?any), ?tuple_set(_), Dict) -> %% Dict; %%assign_vars(?tuple(_, Arity, _) = T1, ?tuple_set(List), Dict) -> @@ -2688,18 +2855,18 @@ %% Relations %% --spec t_is_equal(erl_type(), erl_type()) -> bool(). +-spec t_is_equal(erl_type(), erl_type()) -> boolean(). t_is_equal(T, T) -> true; t_is_equal(_, _) -> false. --spec t_is_subtype(erl_type(), erl_type()) -> bool(). +-spec t_is_subtype(erl_type(), erl_type()) -> boolean(). t_is_subtype(T1, T2) -> Inf = t_inf(T1, T2), t_is_equal(T1, Inf). --spec t_is_instance(erl_type(), erl_type()) -> bool(). +-spec t_is_instance(erl_type(), erl_type()) -> boolean(). t_is_instance(ConcreteType, Type) -> t_is_subtype(ConcreteType, t_unopaque(Type)). @@ -2726,14 +2893,14 @@ NewSet = [{Sz, [t_unopaque(T, Opaques) || T <- Tuples]} || {Sz, Tuples} <- Set], ?tuple_set(NewSet); -t_unopaque(?union([A,B,F,I,L,N,T,M,O]), Opaques) -> +t_unopaque(?union([A,B,F,I,L,N,T,M,O,R]), Opaques) -> UL = t_unopaque(L, Opaques), UT = t_unopaque(T, Opaques), UO = case O of ?none -> []; ?opaque(Os) -> [t_unopaque(S, Opaques) || #opaque{struct = S} <- Os] end, - t_sup([?union([A,B,F,I,UL,N,UT,M,?none])|UO]); + t_sup([?union([A,B,F,I,UL,N,UT,M,?none,R])|UO]); t_unopaque(T, _) -> T. @@ -2871,7 +3038,7 @@ case set_size(Set) of 2 -> case set_is_element(true, Set) andalso set_is_element(false, Set) of - true -> "bool()"; + true -> "boolean()"; false -> set_to_string(Set) end; _ -> @@ -2882,11 +3049,11 @@ t_to_string(?bitstr(0, 0), _RecDict) -> "<<>>"; t_to_string(?bitstr(0, B), _RecDict) -> - io_lib:format("<<_:~w>>",[B]); + io_lib:format("<<_:~w>>", [B]); t_to_string(?bitstr(U, 0), _RecDict) -> - io_lib:format("<<_:_*~w>>",[U]); + io_lib:format("<<_:_*~w>>", [U]); t_to_string(?bitstr(U, B), _RecDict) -> - io_lib:format("<<_:~w,_:_*~w>>",[B,U]); + io_lib:format("<<_:~w,_:_*~w>>", [B, U]); t_to_string(?function(?any, ?any), _RecDict) -> "fun()"; t_to_string(?function(?any, Range), RecDict) -> @@ -2900,11 +3067,11 @@ || T <- set_to_list(Set)], [], " | ") end; t_to_string(?opaque(Set), _RecDict) -> - sequence([case Mod =:= 'UNKNOWN' orelse is_opaque_builtin(Mod, Name) of + sequence([case is_opaque_builtin(Mod, Name) of true -> io_lib:format("~w()", [Name]); false -> io_lib:format("~w:~w()", [Mod, Name]) end - || #opaque{mod=Mod, name=Name} <- set_to_list(Set)], [], " | "); + || #opaque{mod = Mod, name = Name} <- set_to_list(Set)], [], " | "); t_to_string(?matchstate(Pres, Slots), RecDict) -> io_lib:format("ms(~s,~s)", [t_to_string(Pres, RecDict), t_to_string(Slots,RecDict)]); @@ -2977,6 +3144,15 @@ t_to_string(?number(?any, ?unknown_qual), _RecDict) -> "number()"; t_to_string(?product(List), RecDict) -> "<" ++ comma_sequence(List, RecDict) ++ ">"; +t_to_string(?remote(Set), RecDict) -> + sequence([case Args =:= [] of + true -> io_lib:format("~w:~w()", [Mod, Name]); + false -> + ArgString = comma_sequence(Args, RecDict), + io_lib:format("~w:~w(~s)", [Mod, Name, ArgString]) + end + || #remote{mod = Mod, name = Name, args = Args} <- set_to_list(Set)], + [], " | "); t_to_string(?tuple(?any, ?any, ?any), _RecDict) -> "tuple()"; t_to_string(?tuple(Elements, _Arity, ?any), RecDict) -> "{" ++ comma_sequence(Elements, RecDict) ++ "}"; @@ -3071,9 +3247,9 @@ t_from_form(Type, RecDict, VarDict); t_from_form({paren_type, _L, [Type]}, RecDict, VarDict) -> t_from_form(Type, RecDict, VarDict); -t_from_form({remote_type, _L, [_Mod, _Name, _Args]}, _RecDict, _VarDict) -> - %% TODO: Just for now - t_any(); +t_from_form({remote_type, _L, [{atom, _, Module}, {atom, _, Type}, Args]}, + RecDict, VarDict) -> + t_remote(Module, Type, [t_from_form(A, RecDict, VarDict) || A <- Args]); t_from_form({atom, _L, Atom}, _RecDict, _VarDict) -> t_atom(Atom); t_from_form({integer, _L, Int}, _RecDict, _VarDict) -> t_integer(Int); t_from_form({type, _L, any, []}, _RecDict, _VarDict) -> t_any(); @@ -3163,27 +3339,27 @@ t_tuple([t_from_form(A, RecDict, VarDict) || A <- Args]); t_from_form({type, _L, union, Args}, RecDict, VarDict) -> t_sup([t_from_form(A, RecDict, VarDict) || A <- Args]); -t_from_form({type, L, Name, Args}, RecDict, VarDict) -> +t_from_form({type, _L, Name, Args}, RecDict, VarDict) -> case lookup_type(Name, RecDict) of - {type, {Type, ArgNames}} when length(Args) =:= length(ArgNames) -> + {type, {_Module, Type, ArgNames}} when length(Args) =:= length(ArgNames) -> List = lists:zipwith(fun(ArgName, ArgType) -> {ArgName, t_from_form(ArgType, RecDict, VarDict)} end, ArgNames, Args), TmpVardict = dict:from_list(List), t_from_form(Type, RecDict, TmpVardict); - {opaque, {Type, ArgNames}} when length(Args) =:= length(ArgNames) -> + {opaque, {Module, Type, ArgNames}} when length(Args) =:= length(ArgNames) -> List = lists:zipwith(fun(ArgName, ArgType) -> {ArgName, t_from_form(ArgType, RecDict, VarDict)} end, ArgNames, Args), TmpVardict = dict:from_list(List), Rep = t_from_form(Type, RecDict, TmpVardict), - t_from_form({opaque, L, Name, {'UNKNOWN', Args, Rep}}, RecDict, VarDict); + t_from_form({opaque, -1, Name, {Module, Args, Rep}}, RecDict, VarDict); {type, _} -> throw({error, io_lib:format("Unknown type ~w\n", [Name])}); {opaque, _} -> throw({error, io_lib:format("Unknown opaque type ~w\n", [Name])}); error -> - throw({error, io_lib:format("Unknown type ~w\n", [Name])}) + throw({error, io_lib:format("Unable to find type ~w\n", [Name])}) end; t_from_form({opaque, _L, Name, {Mod, Args, Rep}}, _RecDict, _VarDict) -> case Args of @@ -3321,13 +3497,13 @@ %% %%============================================================================= --spec any_none([erl_type()]) -> bool(). +-spec any_none([erl_type()]) -> boolean(). any_none([?none|_Left]) -> true; any_none([_|Left]) -> any_none(Left); any_none([]) -> false. --spec any_none_or_unit([erl_type()]) -> bool(). +-spec any_none_or_unit([erl_type()]) -> boolean(). any_none_or_unit([?none|_]) -> true; any_none_or_unit([?unit|_]) -> true; @@ -3337,7 +3513,7 @@ -spec lookup_record(atom(), dict()) -> 'error' | {'ok', [{atom(), erl_type()}]}. lookup_record(Tag, RecDict) when is_atom(Tag) -> - case dict:find(Tag, RecDict) of + case dict:find({record, Tag}, RecDict) of {ok, [{_Arity, Fields}]} -> {ok, Fields}; {ok, List} when is_list(List) -> %% This will have to do, since we do not know which record we @@ -3350,7 +3526,7 @@ -spec lookup_record(atom(), arity(), dict()) -> 'error' | {'ok', [{atom(), erl_type()}]}. lookup_record(Tag, Arity, RecDict) when is_atom(Tag) -> - case dict:find(Tag, RecDict) of + case dict:find({record, Tag}, RecDict) of {ok, [{Arity, Fields}]} -> {ok, Fields}; {ok, OrdDict} -> orddict:find(Arity, OrdDict); error -> error @@ -3366,7 +3542,7 @@ {ok, Found} -> {type, Found} end. --spec type_is_defined('type' | 'opaque', atom(), dict()) -> bool(). +-spec type_is_defined('type' | 'opaque', atom(), dict()) -> boolean(). type_is_defined(TypeOrOpaque, Name, RecDict) -> dict:is_key({TypeOrOpaque, Name}, RecDict). diff -Nru erlang-13.b.1-dfsg/lib/hipe/cerl/Makefile erlang-13.b.3-dfsg/lib/hipe/cerl/Makefile --- erlang-13.b.1-dfsg/lib/hipe/cerl/Makefile 2009-04-16 10:24:14.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/cerl/Makefile 2009-11-20 13:31:41.000000000 +0000 @@ -62,13 +62,15 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- -ERL_COMPILE_FLAGS += +nowarn_shadow_vars +warn_exported_vars +warn_unused_import +warn_missing_spec +inline + +include ../native.mk + +ERL_COMPILE_FLAGS += +inline +warn_exported_vars +warn_unused_import +warn_missing_spec# +warn_untyped_record # ---------------------------------------------------- # Targets # ---------------------------------------------------- - debug opt: $(TARGET_FILES) docs: $(DOC_FILES) diff -Nru erlang-13.b.1-dfsg/lib/hipe/doc/src/book.xml erlang-13.b.3-dfsg/lib/hipe/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/hipe/doc/src/book.xml 2007-11-26 19:01:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/doc/src/book.xml 2009-11-20 13:32:25.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + HiPE @@ -33,5 +31,8 @@ HiPE + + + diff -Nru erlang-13.b.1-dfsg/lib/hipe/doc/src/Makefile erlang-13.b.3-dfsg/lib/hipe/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/hipe/doc/src/Makefile 2007-11-26 19:01:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/doc/src/Makefile 2009-11-20 13:32:25.000000000 +0000 @@ -23,17 +23,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(HIPE_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=hipe # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/hipe-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -46,6 +41,10 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + GIF_FILES = # ---------------------------------------------------- @@ -62,27 +61,14 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PDF_FILE = hipe-$(VSN).pdf -TOP_PS_FILE = hipe-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets @@ -90,21 +76,13 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) @@ -112,35 +90,24 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) -# $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 -# $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/hipe/doc/src/notes.xml erlang-13.b.3-dfsg/lib/hipe/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/hipe/doc/src/notes.xml 2009-06-05 13:53:41.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/doc/src/notes.xml 2009-11-20 13:32:25.000000000 +0000 @@ -26,9 +26,50 @@ nil nil nil + notes.xml

    This document describes the changes made to HiPE.

    +
    Hipe 3.7.4 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    + +

    + Misc updates.

    +

    + Own Id: OTP-8301

    +
    +
    +
    + +
    + +
    Hipe 3.7.3 + +
    Improvements and New Features + + +

    + Various small bugs (one involving the handling of large + binaries) were corrected and some additions to its + functionality and/or code cleanups were done.

    +

    + Own Id: OTP-8189

    +
    +
    +
    + +
    +
    Hipe 3.7.2
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/hipe/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/hipe/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/hipe/doc/src/part_notes.xml 2007-11-26 19:01:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/doc/src/part_notes.xml 2009-11-20 13:32:26.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + HiPE Release Notes @@ -32,6 +30,6 @@

    HiPE - High Performance Erlang.

    - + diff -Nru erlang-13.b.1-dfsg/lib/hipe/flow/cfg.hrl erlang-13.b.3-dfsg/lib/hipe/flow/cfg.hrl --- erlang-13.b.1-dfsg/lib/hipe/flow/cfg.hrl 2009-04-16 10:24:32.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/flow/cfg.hrl 2009-09-18 15:09:24.000000000 +0100 @@ -33,9 +33,9 @@ %% -record(cfg_info, {'fun' :: mfa(), start_label :: cfg_lbl(), - is_closure :: bool(), + is_closure :: boolean(), closure_arity :: arity(), - is_leaf :: bool(), + is_leaf :: boolean(), params, % :: list() info = []}). %% this field seems not needed; take out?? diff -Nru erlang-13.b.1-dfsg/lib/hipe/flow/cfg.inc erlang-13.b.3-dfsg/lib/hipe/flow/cfg.inc --- erlang-13.b.1-dfsg/lib/hipe/flow/cfg.inc 2009-04-16 10:24:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/flow/cfg.inc 2009-09-18 15:08:18.000000000 +0100 @@ -107,14 +107,14 @@ %% Interface functions that MUST be implemented in the including file: %% %% linear_to_cfg(LinearCode) -> CFG, constructs the cfg. -%% is_label(Instr) -> bool(), true if instruction is a label. +%% is_label(Instr) -> boolean(), true if instruction is a label. %% label_name(Instr) -> term(), the name of a label. %% branch_successors(Instr) -> [term()], the successors of a branch. %% fails_to(Instr) -> [term()], the fail-successors of an instruction. -%% is_branch(Instr) -> bool(), true if instruction is a branch. -%% is_comment(Instr) -> bool(), +%% is_branch(Instr) -> boolean(), true if instruction is a branch. +%% is_comment(Instr) -> boolean(), %% true if instruction is a comment, used by remove dead code. -%% is_goto(Instr) -> bool(), +%% is_goto(Instr) -> boolean(), %% true if instruction is a pure goto, used by remove dead code. %% redirect_jmp(Jmp, ToOld, ToNew) -> NewJmp, %% redirect_ops(Labels, CFG, Map) -> CFG. @@ -125,7 +125,7 @@ %% pp(CFG) -> ok, do some nifty output. %% cfg_to_linear(CFG) -> LinearCode, linearizes the code of CFG %% mk_goto(Label) -> instruction -%% is_phi(Instr) -> bool(), true if the instruction is a phi-instruction. +%% is_phi(Instr) -> boolean(), true if the instruction is a phi-instruction. %% phi_remove_pred(PhiInstr, Pred) -> NewPhi, %% Removes the predecessor Pred from the phi instruction. %% highest_var(Code) -> term(), @@ -150,10 +150,10 @@ -spec function(cfg()) -> mfa(). function(CFG) -> (CFG#cfg.info)#cfg_info.'fun'. --spec is_closure(cfg()) -> bool(). +-spec is_closure(cfg()) -> boolean(). is_closure(CFG) -> (CFG#cfg.info)#cfg_info.is_closure. --spec is_leaf(cfg()) -> bool(). +-spec is_leaf(cfg()) -> boolean(). is_leaf(CFG) -> (CFG#cfg.info)#cfg_info.is_leaf. mk_empty_cfg(Fun, StartLbl, Data, Closure, Leaf, Params) -> diff -Nru erlang-13.b.1-dfsg/lib/hipe/flow/hipe_bb.erl erlang-13.b.3-dfsg/lib/hipe/flow/hipe_bb.erl --- erlang-13.b.1-dfsg/lib/hipe/flow/hipe_bb.erl 2009-03-12 12:20:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/flow/hipe_bb.erl 2009-09-18 15:08:18.000000000 +0100 @@ -45,12 +45,12 @@ %% Returns a basic block: {bb, Code} %% * Code is a list of instructions --spec mk_bb/1 :: ([_]) -> bb(). +-spec mk_bb([_]) -> bb(). mk_bb(Code) -> #bb{code=Code}. --spec is_bb/1 :: (_) -> bool(). +-spec is_bb(_) -> boolean(). is_bb(#bb{}) -> true; is_bb(_) -> false. diff -Nru erlang-13.b.1-dfsg/lib/hipe/flow/hipe_dominators.erl erlang-13.b.3-dfsg/lib/hipe/flow/hipe_dominators.erl --- erlang-13.b.1-dfsg/lib/hipe/flow/hipe_dominators.erl 2009-03-12 12:20:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/flow/hipe_dominators.erl 2009-11-20 13:31:49.000000000 +0000 @@ -45,10 +45,6 @@ %% %%======================================================================== --record(domTree, {root :: cfg_lbl(), - size = 0 :: non_neg_integer(), - nodes = gb_trees:empty() :: gb_tree()}). - -record(workDataCell, {dfnum = 0 :: non_neg_integer(), dfparent = none :: 'none' | cfg_lbl(), semi = none :: 'none' | cfg_lbl(), @@ -57,6 +53,11 @@ samedom = none :: 'none' | cfg_lbl(), bucket = [] :: [cfg_lbl()]}). +-record(domTree, {root :: cfg_lbl(), + size = 0 :: non_neg_integer(), + nodes = gb_trees:empty() :: gb_tree()}). +-type domTree() :: #domTree{}. + %%>----------------------------------------------------------------------< %% Procedure : domTree_create/1 %% Purpose : Creates a complete dominator tree given a CFG. @@ -64,7 +65,7 @@ %% Returns : A dominator tree %%>----------------------------------------------------------------------< --spec domTree_create(cfg()) -> #domTree{}. +-spec domTree_create(cfg()) -> domTree(). domTree_create(CFG) -> {WorkData, DFS, N} = dfs(CFG), @@ -174,7 +175,7 @@ %% Returns : [children] %%>----------------------------------------------------------------------< --spec domTree_getChildren(cfg_lbl(), #domTree{}) -> [cfg_lbl()]. +-spec domTree_getChildren(cfg_lbl(), domTree()) -> [cfg_lbl()]. domTree_getChildren(Node, DomTree) -> case domTree_getNode(Node, DomTree) of @@ -409,15 +410,14 @@ %%>----------------------------------------------------------------------< getSemiDominator([Pred|Preds], DfNumChild, S, WorkData) -> - {Sp, WorkData3} = case lookup({dfnum, Pred}, WorkData) =< DfNumChild of - true -> - {Pred, WorkData}; - false -> - {AncLowSemi, WorkData2} = - getAncestorWithLowestSemi(Pred, WorkData), - {lookup({semi, AncLowSemi}, WorkData2), - WorkData2} - end, + {Sp, WorkData3} = + case lookup({dfnum, Pred}, WorkData) =< DfNumChild of + true -> + {Pred, WorkData}; + false -> + {AncLowSemi, WorkData2} = getAncestorWithLowestSemi(Pred, WorkData), + {lookup({semi, AncLowSemi}, WorkData2), WorkData2} + end, S2 = case lookup({dfnum, Sp}, WorkData3) < lookup({dfnum, S}, WorkData3) of true -> Sp; false -> S @@ -542,7 +542,7 @@ %% Notes : Relies on lists:any to return false when the a list is empty %%>----------------------------------------------------------------------< --spec domTree_dominates(cfg_lbl(), cfg_lbl(), #domTree{}) -> bool(). +-spec domTree_dominates(cfg_lbl(), cfg_lbl(), domTree()) -> boolean(). domTree_dominates(Node1, Node1, _DomTree) -> true; @@ -599,7 +599,7 @@ %% Notes : DomTree must actually be the dominance tree of the CFG. %%>----------------------------------------------------------------------< --spec domFrontier_create(cfg(), #domTree{}) -> domFrontier(). +-spec domFrontier_create(cfg(), domTree()) -> domFrontier(). domFrontier_create(SuccMap, DomTree) -> df_create(domTree_getRoot(DomTree), SuccMap, DomTree, df__empty()). diff -Nru erlang-13.b.1-dfsg/lib/hipe/flow/Makefile erlang-13.b.3-dfsg/lib/hipe/flow/Makefile --- erlang-13.b.1-dfsg/lib/hipe/flow/Makefile 2009-04-16 10:24:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/flow/Makefile 2009-11-20 13:31:20.000000000 +0000 @@ -62,6 +62,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += +warn_exported_vars +warn_missing_spec +warn_untyped_record # ---------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_beam_to_icode.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_beam_to_icode.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_beam_to_icode.erl 2009-06-05 13:53:21.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_beam_to_icode.erl 2009-11-20 13:31:21.000000000 +0000 @@ -128,7 +128,7 @@ mfa(BeamFuns, {M,F,A} = MFA, Options) when is_atom(M), is_atom(F), is_integer(A) -> - BeamCode0 = [beam_disasm:function__code(F) || F <- BeamFuns], + BeamCode0 = [beam_disasm:function__code(Fn) || Fn <- BeamFuns], {ModCode, ClosureInfo} = preprocess_code(BeamCode0), mfa_loop([MFA], [], sets:new(), ModCode, ClosureInfo, Options). @@ -1823,8 +1823,8 @@ %%----------------------------------------------------------------------- -split_params(1, [Closure|OrgArgs], Args) -> - {lists:reverse([Closure|Args]), Closure, [Closure|OrgArgs]}; +split_params(1, [Closure|_OrgArgs] = Params, Args) -> + {lists:reverse([Closure|Args]), Closure, Params}; split_params(1, [], Args) -> Closure = hipe_icode:mk_new_var(), {lists:reverse([Closure|Args]), Closure, []}; diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_callgraph.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_callgraph.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_callgraph.erl 2009-04-16 10:24:18.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_callgraph.erl 2009-11-20 13:31:55.000000000 +0000 @@ -43,7 +43,6 @@ -include("hipe_icode.hrl"). -include("hipe_icode_primops.hrl"). --include("../util/hipe_digraph.hrl"). %%------------------------------------------------------------------------ @@ -68,7 +67,7 @@ SCCs = hipe_digraph:reverse_preorder_sccs(DiGraph1), #icode_callgraph{codedict = dict:from_list(List), ordered_sccs = SCCs}. --spec construct_callgraph([mfa_icode()]) -> #hipe_digraph{}. +-spec construct_callgraph([mfa_icode()]) -> hipe_digraph:hdg(). construct_callgraph(List) -> Calls = get_local_calls2(List), @@ -85,16 +84,14 @@ -ifndef(NO_UNUSED). --spec is_empty(#icode_callgraph{}) -> bool(). +-spec is_empty(#icode_callgraph{}) -> boolean(). is_empty(#icode_callgraph{ordered_sccs = SCCs}) -> - length(SCCs) =:= 0. + SCCs =:= []. -spec take_first(#icode_callgraph{}) -> {[mfa_icode()], #icode_callgraph{}}. -take_first(#icode_callgraph{codedict = Dict, ordered_sccs = SCCs} = CG) - when length(SCCs) > 0 -> - [H|T] = SCCs, +take_first(#icode_callgraph{codedict = Dict, ordered_sccs = [H|T]} = CG) -> SCCCode = [{Mod, dict:fetch(Mod, Dict)} || Mod <- H], {SCCCode, CG#icode_callgraph{ordered_sccs = T}}. diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_cfg.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_cfg.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_cfg.erl 2009-03-12 12:20:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_cfg.erl 2009-09-18 15:08:19.000000000 +0100 @@ -47,10 +47,6 @@ -include("../flow/cfg.inc"). %%---------------------------------------------------------------------- - --type io_device() :: atom() | pid(). % XXX: DOES NOT BELONG HERE - -%%---------------------------------------------------------------------- %% Prototypes for exported functions which are Icode specific %%---------------------------------------------------------------------- @@ -58,7 +54,7 @@ -spec postorder(cfg()) -> [icode_lbl()]. -spec reverse_postorder(cfg()) -> [icode_lbl()]. --spec is_visited(icode_lbl(), gb_set()) -> bool(). +-spec is_visited(icode_lbl(), gb_set()) -> boolean(). -spec visit(icode_lbl(), gb_set()) -> gb_set(). -spec bb(cfg(), icode_lbl()) -> 'not_found' | bb(). @@ -103,7 +99,7 @@ %% remove_blocks(CFG, [Lbl|Lbls]) -> %% remove_blocks(bb_remove(CFG, Lbl), Lbls). --spec is_label(icode_instr()) -> bool(). +-spec is_label(icode_instr()) -> boolean(). is_label(Instr) -> hipe_icode:is_label(Instr). @@ -123,20 +119,20 @@ hipe_icode:fails_to(Instr). %% True if instr has no effect. --spec is_comment(icode_instr()) -> bool(). +-spec is_comment(icode_instr()) -> boolean(). is_comment(Instr) -> hipe_icode:is_comment(Instr). %% True if instr is just a jump (no side-effects). --spec is_goto(icode_instr()) -> bool(). +-spec is_goto(icode_instr()) -> boolean(). is_goto(Instr) -> hipe_icode:is_goto(Instr). --spec is_branch(icode_instr()) -> bool(). +-spec is_branch(icode_instr()) -> boolean(). is_branch(Instr) -> hipe_icode:is_branch(Instr). --spec is_pure_branch(icode_instr()) -> bool(). +-spec is_pure_branch(icode_instr()) -> boolean(). is_pure_branch(Instr) -> case Instr of #icode_if{} -> true; @@ -158,7 +154,7 @@ #icode_comment{} -> false end. --spec is_phi(icode_instr()) -> bool(). +-spec is_phi(icode_instr()) -> boolean(). is_phi(I) -> hipe_icode:is_phi(I). @@ -181,7 +177,7 @@ pp(CFG) -> hipe_icode_pp:pp(cfg_to_linear(CFG)). --spec pp(io_device(), cfg()) -> 'ok'. +-spec pp(io:device(), cfg()) -> 'ok'. pp(Dev, CFG) -> hipe_icode_pp:pp(Dev, cfg_to_linear(CFG)). diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_coordinator.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_coordinator.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_coordinator.erl 2009-04-16 10:24:30.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_coordinator.erl 2009-11-20 13:32:31.000000000 +0000 @@ -29,7 +29,6 @@ -export([coordinate/4]). -include("hipe_icode.hrl"). --include("../util/hipe_digraph.hrl"). %%--------------------------------------------------------------------- @@ -37,21 +36,22 @@ %%--------------------------------------------------------------------- --spec coordinate(#hipe_digraph{}, [{mfa(),bool()}], [mfa()], atom()) -> no_return(). +-spec coordinate(hipe_digraph:hdg(), [{mfa(),boolean()}], [mfa()], module()) -> + no_return(). coordinate(CG, Escaping, NonEscaping, Mod) -> ServerPid = initialize_server(Escaping, Mod), Clean = [MFA || {MFA, _} <- Escaping], All = NonEscaping ++ Clean, Restart = - fun(MFALists, PM) -> restart_funs(MFALists, PM, All, ServerPid) end, + fun (MFALists, PM) -> restart_funs(MFALists, PM, All, ServerPid) end, LastAction = - fun(PM) -> last_action(PM, ServerPid, Mod, All) end, + fun (PM) -> last_action(PM, ServerPid, Mod, All) end, coordinate({Clean,All}, CG, gb_trees:empty(), Restart, LastAction, ServerPid). coordinate(MFALists, CG, PM, Restart, LastAction, ServerPid) -> case MFALists of - {[], []} -> + {[], []} -> LastAction(PM), ServerPid ! stop, receive @@ -61,16 +61,16 @@ end; _ -> ok end, - receive + receive {stop, AnsPid} -> ServerPid ! stop, AnsPid ! {done, self()}, exit(normal); Message -> - {NewPM, NewMFALists} = + {NewPM, NewMFALists} = case Message of - {restart_call, MFA} -> - {PM,handle_restart_call(MFA, MFALists)}; + {restart_call, MFA} -> + {PM, handle_restart_call(MFA, MFALists)}; {ready, {MFA, Pid}} -> handle_ready(MFA, Pid, MFALists, PM); {restart_done, MFA} -> @@ -94,17 +94,18 @@ {gb_trees:insert(MFA, Pid, PM), {Queue, Busy -- [MFA]}}. handle_restart_done(MFA, {Queue, Busy}, CG) -> - Restarts = hipe_digraph:get_parents(MFA, CG), + Restarts = hipe_digraph:get_parents(MFA, CG), {ordsets:from_list(Restarts ++ Queue), Busy -- [MFA]}. handle_no_change_done(MFA, {Queue, Busy}) -> {Queue, Busy -- [MFA]}. last_action(PM, ServerPid, Mod, All) -> - lists:foreach(fun(MFA) -> gb_trees:get(MFA, PM) ! {done, final_funs(ServerPid, Mod)}, - receive - {done_rewrite, MFA} -> ok - end + lists:foreach(fun (MFA) -> + gb_trees:get(MFA, PM) ! {done, final_funs(ServerPid, Mod)}, + receive + {done_rewrite, MFA} -> ok + end end, All), ok. @@ -113,7 +114,7 @@ X when is_integer(X), X > 0 -> Possible = [Pos || Pos <- Queue, (not lists:member(Pos, Busy))], Restarts = lists:sublist(Possible, X), - lists:foreach(fun(MFA) -> + lists:foreach(fun (MFA) -> restart_fun(MFA, PM, All, ServerPid) end, Restarts), {Queue -- Restarts, Busy ++ Restarts}; @@ -123,9 +124,7 @@ initialize_server(Escaping, Mod) -> Pid = spawn_link(fun () -> info_server(Mod) end), - lists:foreach(fun ({MFA, _}) -> - Pid ! {set_escaping, MFA} - end, Escaping), + lists:foreach(fun ({MFA, _}) -> Pid ! {set_escaping, MFA} end, Escaping), Pid. safe_get_args(MFA, Cfg, Pid, Mod) -> @@ -191,7 +190,7 @@ end, FinalFun = fun (MFA, RetTypes) -> case update_return_type(MFA, RetTypes, Pid) of - do_restart -> + do_restart -> Self ! {restart_done, MFA}, ok; no_change -> @@ -207,7 +206,7 @@ [Ans] = safe_get_res(MFA, Pid, Mod), Ans end, - FinalFun = fun(_,_) -> ok end, + FinalFun = fun (_, _) -> ok end, {ArgsFun, GetResFun, FinalFun}. info_server(Mod) -> @@ -223,7 +222,7 @@ info_server_loop(NewCallInfo, ReturnInfo, Mod); {get_return, MFA, Pid, Ref} -> Ans = - case gb_trees:lookup(MFA,ReturnInfo) of + case gb_trees:lookup(MFA, ReturnInfo) of none -> Mod:return_none(); {value, TypesComp} -> @@ -239,19 +238,20 @@ {value, escaping} -> Mod:return_any_args(Cfg, MFA); {value, TypesComp} -> - Mod:return__info((TypesComp)) + Mod:return__info(TypesComp) end, Pid ! {Ref, Ans}, info_server_loop(CallInfo, ReturnInfo, Mod); {set_escaping, MFA} -> - info_server_loop(gb_trees:enter(MFA,escaping,CallInfo),ReturnInfo,Mod); + NewCallInfo = gb_trees:enter(MFA, escaping, CallInfo), + info_server_loop(NewCallInfo, ReturnInfo, Mod); stop -> ok end. handle_update(MFA, Tree, NewInfo, Pid, Ref, Mod) -> ResType = - case gb_trees:lookup(MFA,Tree) of + case gb_trees:lookup(MFA, Tree) of none -> %% io:format("First Type: ~w ~w~n", [NewType, MFA]), Pid ! {Ref, do_restart}, @@ -259,8 +259,7 @@ {value, escaping} -> Pid ! {Ref, no_change}, escaping; - {value, OldInfoComp} -> - OldInfo = (OldInfoComp), + {value, OldInfo} -> %% io:format("New Type: ~w ~w~n", [NewType, MFA]), %% io:format("Old Type: ~w ~w~n", [OldType, MFA]), case Mod:update__info(NewInfo, OldInfo) of diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode.erl 2009-06-05 13:53:22.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode.erl 2009-09-18 15:08:19.000000000 +0100 @@ -288,8 +288,8 @@ %% @type icode(Fun, Params, IsClosure, IsLeaf, Code, Data, VarRange,LabelRange) %% Fun = mfa() %% Params = [var()] -%% IsClosure = bool() -%% IsLeaf = bool() +%% IsClosure = boolean() +%% IsLeaf = boolean() %% Code = [icode_instr()] %% Data = data() %% VarRange = {integer(),integer()} @@ -344,7 +344,7 @@ %% Type = call_type() %% Continuation = [] | label_name() %% FailLabel = [] | label_name() -%% InGuard = bool() +%% InGuard = boolean() %% %% @type enter(Fun, Arg, Type) %% Fun = mfa() | primop() | closure() @@ -614,7 +614,7 @@ %% %%--------------------------------------------------------------------- --spec mk_icode(mfa(), [icode_var()], bool(), bool(), [icode_instr()], +-spec mk_icode(mfa(), [icode_var()], boolean(), boolean(), [icode_instr()], {non_neg_integer(),non_neg_integer()}, {icode_lbl(),icode_lbl()}) -> #icode{}. mk_icode(Fun, Params, IsClosure, IsLeaf, Code, VarRange, LabelRange) -> @@ -625,7 +625,7 @@ var_range=VarRange, label_range=LabelRange}. --spec mk_icode(mfa(), [icode_var()], bool(), bool(), [icode_instr()], +-spec mk_icode(mfa(), [icode_var()], boolean(), boolean(), [icode_instr()], hipe_consttab(), {non_neg_integer(),non_neg_integer()}, {icode_lbl(),icode_lbl()}) -> #icode{}. mk_icode(Fun, Params, IsClosure, IsLeaf, Code, Data, VarRange, LabelRange) -> @@ -634,29 +634,29 @@ var_range=VarRange, label_range=LabelRange}. -spec icode_fun(#icode{}) -> mfa(). -icode_fun(#icode{'fun'=MFA}) -> MFA. +icode_fun(#icode{'fun' = MFA}) -> MFA. -spec icode_params(#icode{}) -> [icode_var()]. -icode_params(#icode{params=Params}) -> Params. +icode_params(#icode{params = Params}) -> Params. -spec icode_params_update(#icode{}, [icode_var()]) -> #icode{}. icode_params_update(Icode, Params) -> - Icode#icode{params=Params}. + Icode#icode{params = Params}. --spec icode_is_closure(#icode{}) -> bool(). -icode_is_closure(#icode{is_closure=Closure}) -> Closure. +-spec icode_is_closure(#icode{}) -> boolean(). +icode_is_closure(#icode{is_closure = Closure}) -> Closure. --spec icode_is_leaf(#icode{}) -> bool(). -icode_is_leaf(#icode{is_leaf=Leaf}) -> Leaf. +-spec icode_is_leaf(#icode{}) -> boolean(). +icode_is_leaf(#icode{is_leaf = Leaf}) -> Leaf. -spec icode_code(#icode{}) -> icode_instrs(). -icode_code(#icode{code=Code}) -> Code. +icode_code(#icode{code = Code}) -> Code. -spec icode_code_update(#icode{}, icode_instrs()) -> #icode{}. icode_code_update(Icode, NewCode) -> Vmax = highest_var(NewCode), Lmax = highest_label(NewCode), - Icode#icode{code=NewCode, var_range={0,Vmax}, label_range={0,Lmax}}. + Icode#icode{code = NewCode, var_range = {0,Vmax}, label_range = {0,Lmax}}. -spec icode_data(#icode{}) -> hipe_consttab(). icode_data(#icode{data=Data}) -> Data. @@ -665,22 +665,22 @@ %% icode_data_update(Icode, NewData) -> Icode#icode{data=NewData}. -spec icode_var_range(#icode{}) -> {non_neg_integer(), non_neg_integer()}. -icode_var_range(#icode{var_range=VarRange}) -> VarRange. +icode_var_range(#icode{var_range = VarRange}) -> VarRange. -spec icode_label_range(#icode{}) -> {non_neg_integer(), non_neg_integer()}. -icode_label_range(#icode{label_range=LabelRange}) -> LabelRange. +icode_label_range(#icode{label_range = LabelRange}) -> LabelRange. --spec icode_info(#icode{}) -> [{arg_types, [erl_type()]}]. -icode_info(#icode{info=Info}) -> Info. +-spec icode_info(#icode{}) -> icode_info(). +icode_info(#icode{info = Info}) -> Info. --spec icode_info_update(#icode{}, [{arg_types, [erl_type()]}]) -> #icode{}. -icode_info_update(Icode, Info) -> Icode#icode{info=Info}. +-spec icode_info_update(#icode{}, icode_info()) -> #icode{}. +icode_info_update(Icode, Info) -> Icode#icode{info = Info}. -spec icode_closure_arity(#icode{}) -> arity(). -icode_closure_arity(#icode{closure_arity=Arity}) -> Arity. +icode_closure_arity(#icode{closure_arity = Arity}) -> Arity. -spec icode_closure_arity_update(#icode{}, arity()) -> #icode{}. -icode_closure_arity_update(Icode, Arity) -> Icode#icode{closure_arity=Arity}. +icode_closure_arity_update(Icode, Arity) -> Icode#icode{closure_arity = Arity}. %%---------------------------------------------------------------------------- @@ -819,7 +819,7 @@ -spec type_pred(#icode_type{}) -> float(). type_pred(#icode_type{p=P}) -> P. --spec is_type(icode_instr()) -> bool(). +-spec is_type(icode_instr()) -> boolean(). is_type(#icode_type{}) -> true; is_type(_) -> false. @@ -833,7 +833,7 @@ -spec goto_label(#icode_goto{}) -> icode_lbl(). goto_label(#icode_goto{label=Lbl}) -> Lbl. --spec is_goto(icode_instr()) -> bool(). +-spec is_goto(icode_instr()) -> boolean(). is_goto(#icode_goto{}) -> true; is_goto(_) -> false. @@ -847,7 +847,7 @@ -spec return_vars(#icode_return{}) -> [icode_var()]. return_vars(#icode_return{vars=Vars}) -> Vars. --spec is_return(icode_instr()) -> bool(). +-spec is_return(icode_instr()) -> boolean(). is_return(#icode_return{}) -> true; is_return(_) -> false. @@ -906,7 +906,7 @@ #icode_move{}. move_src_update(M, NewSrc) -> M#icode_move{src=NewSrc}. --spec is_move(icode_instr()) -> bool(). +-spec is_move(icode_instr()) -> boolean(). is_move(#icode_move{}) -> true; is_move(_) -> false. @@ -942,7 +942,7 @@ false -> exit({'No such predecessor to phi', {Pred, P}}) end. --spec is_phi(icode_instr()) -> bool(). +-spec is_phi(icode_instr()) -> boolean(). is_phi(#icode_phi{}) -> true; is_phi(_) -> false. @@ -1029,7 +1029,7 @@ %% mk_call(DstList, M, F, ArgList, Type, Continuation, Fail, false). -spec mk_call([#icode_variable{}], atom(), atom(), [icode_argument()], - 'local' | 'remote', [] | icode_lbl(), [] | icode_lbl(), bool()) -> + 'local' | 'remote', [] | icode_lbl(), [] | icode_lbl(), boolean()) -> #icode_call{}. mk_call(DstList, M, F, ArgList, Type, Continuation, Fail, InGuard) when is_atom(M), is_atom(F) -> @@ -1046,7 +1046,7 @@ %% we can simply jump to the Fail label (if it exists) without %% generating any additional exception information - it isn't needed. -spec make_call([#icode_variable{}], icode_funcall(), [icode_argument()], - icode_call_type(), [] | icode_lbl(), [] | icode_lbl(), bool()) -> + icode_call_type(), [] | icode_lbl(), [] | icode_lbl(), boolean()) -> #icode_call{}. make_call(DstList, Fun, ArgList, Type, Continuation, Fail, InGuard) -> #icode_call{dstlist=DstList, 'fun'=Fun, args=ArgList, type=Type, @@ -1102,11 +1102,11 @@ I#icode_call{fail_label=Fail} end. --spec is_call(icode_instr()) -> bool(). +-spec is_call(icode_instr()) -> boolean(). is_call(#icode_call{}) -> true; is_call(_) -> false. --spec call_in_guard(#icode_call{}) -> bool(). +-spec call_in_guard(#icode_call{}) -> boolean(). call_in_guard(#icode_call{in_guard=InGuard}) -> InGuard. %%------- @@ -1143,7 +1143,7 @@ -spec enter_type(#icode_enter{}) -> icode_call_type(). enter_type(#icode_enter{type=Type}) -> Type. --spec is_enter(icode_instr()) -> bool(). +-spec is_enter(icode_instr()) -> boolean(). is_enter(#icode_enter{}) -> true; is_enter(_) -> false. @@ -1188,7 +1188,7 @@ -spec begin_handler_dstlist(#icode_begin_handler{}) -> [icode_var()]. begin_handler_dstlist(#icode_begin_handler{dstlist=Dstlist}) -> Dstlist. -%% -spec is_begin_handler(icode_instr()) -> bool(). +%% -spec is_begin_handler(icode_instr()) -> boolean(). %% is_begin_handler(#icode_begin_handler{}) -> true; %% is_begin_handler(_) -> false. @@ -1202,7 +1202,7 @@ -spec label_name(#icode_label{}) -> icode_lbl(). label_name(#icode_label{name=Name}) -> Name. --spec is_label(icode_instr()) -> bool(). +-spec is_label(icode_instr()) -> boolean(). is_label(#icode_label{}) -> true; is_label(_) -> false. @@ -1218,7 +1218,7 @@ -spec comment_text(#icode_comment{}) -> icode_comment_text(). comment_text(#icode_comment{text=Txt}) -> Txt. --spec is_comment(icode_instr()) -> bool(). +-spec is_comment(icode_instr()) -> boolean(). is_comment(#icode_comment{}) -> true; is_comment(_) -> false. @@ -1237,7 +1237,7 @@ -spec const_value(#icode_const{}) -> simple_const() | structured_const() | binary(). const_value(#icode_const{value=#flat{value=X}}) -> X. --spec is_const(icode_argument()) -> bool(). +-spec is_const(icode_argument()) -> boolean(). is_const(#icode_const{}) -> true; is_const(_) -> false. @@ -1251,7 +1251,7 @@ -spec var_name(#icode_variable{kind::'var'}) -> non_neg_integer(). var_name(#icode_variable{name=Name, kind=var}) -> Name. --spec is_var(icode_argument()) -> bool(). +-spec is_var(icode_argument()) -> boolean(). is_var(#icode_variable{kind=var}) -> true; is_var(_) -> false. @@ -1264,7 +1264,7 @@ -spec reg_is_gcsafe(#icode_variable{kind::'reg'}) -> 'false'. reg_is_gcsafe(#icode_variable{kind=reg}) -> false. % for now --spec is_reg(icode_argument()) -> bool(). +-spec is_reg(icode_argument()) -> boolean(). is_reg(#icode_variable{kind=reg}) -> true; is_reg(_) -> false. @@ -1274,11 +1274,11 @@ -spec fvar_name(#icode_variable{kind::'fvar'}) -> non_neg_integer(). fvar_name(#icode_variable{name=Name, kind=fvar}) -> Name. --spec is_fvar(icode_argument()) -> bool(). +-spec is_fvar(icode_argument()) -> boolean(). is_fvar(#icode_variable{kind=fvar}) -> true; is_fvar(_) -> false. --spec is_variable(icode_argument()) -> bool(). +-spec is_variable(icode_argument()) -> boolean(). is_variable(#icode_variable{}) -> true; is_variable(_) -> false. @@ -1287,7 +1287,7 @@ annotate_variable(X, Anno) -> X#icode_variable{annotation = Anno}. --spec is_annotated_variable(icode_argument()) -> bool(). +-spec is_annotated_variable(icode_argument()) -> boolean(). is_annotated_variable(#icode_variable{annotation=[]}) -> false; is_annotated_variable(#icode_variable{}) -> @@ -1624,13 +1624,13 @@ %% _ -> false %% end. -%% @spec is_branch(icode_instr()) -> bool() +%% @spec is_branch(icode_instr()) -> boolean() %% %% @doc Succeeds if the Icode instruction is a branch. I.e. a %% (possibly conditional) discontinuation of linear control flow. %% @end --spec is_branch(icode_instr()) -> bool(). +-spec is_branch(icode_instr()) -> boolean(). is_branch(Instr) -> case Instr of #icode_if{} -> true; @@ -1733,7 +1733,7 @@ %% result is not used). Note that pure control flow instructions %% cannot be regarded as safe, as they are not defining anything. --spec is_safe(icode_instr()) -> bool(). +-spec is_safe(icode_instr()) -> boolean(). is_safe(Instr) -> case Instr of @@ -1794,11 +1794,7 @@ reg_name(V) end end, - if VName > Max -> - new_max(Vs, VName); - true -> - new_max(Vs, Max) - end; + new_max(Vs, erlang:max(VName, Max)); new_max([], Max) when is_integer(Max) -> Max. @@ -1813,7 +1809,7 @@ case is_label(I) of true -> L = label_name(I), - NewMax = if L > Max -> L; true -> Max end, + NewMax = erlang:max(L, Max), highest_label(Is, NewMax); false -> highest_label(Is, Max) diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_exceptions.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_exceptions.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_exceptions.erl 2009-03-12 12:20:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_exceptions.erl 2009-09-18 15:08:48.000000000 +0100 @@ -383,7 +383,7 @@ %% State abstraction -record(state, {cfg :: #cfg{}, - changed = false :: bool(), + changed = false :: boolean(), succ :: #cfg{}, pred :: #cfg{}, start_labels :: [icode_lbl(),...], diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_fp.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_fp.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_fp.erl 2009-06-05 13:53:31.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_fp.erl 2009-11-20 13:31:41.000000000 +0000 @@ -439,17 +439,17 @@ case lists:keyfind(Pred, 1, List) of {Pred, {assigned, _NewVar}} -> %% The variable is untagged, but it has been assigned. Keep it! - subst_phi_uses0(Left, Map, [{Pred, Var}|Acc]); - {Pred, NewVar} -> + subst_phi_uses0(Left, Map, [{Pred, Var} | Acc]); + {Pred, _NewVar} = PredNV -> %% The variable is untagged and it has never been assigned as tagged. - subst_phi_uses0(Left, Map, [{Pred, NewVar}|Acc]); + subst_phi_uses0(Left, Map, [PredNV | Acc]); false -> %% The variable is not untagged. - subst_phi_uses0(Left, Map, [{Pred, Var}|Acc]) + subst_phi_uses0(Left, Map, [{Pred, Var} | Acc]) end; none -> %% The variable is not untagged. - subst_phi_uses0(Left, Map, [{Pred, Var}|Acc]) + subst_phi_uses0(Left, Map, [{Pred, Var} | Acc]) end; subst_phi_uses0([], _Map, Acc) -> Acc. @@ -464,17 +464,17 @@ case lists:keyfind(Pred, 1, List) of {Pred, {assigned, NewVar}} -> %% The variable is untagged! - subst_phi_uses_uncond0(Left, Map, [{Pred, NewVar}|Acc]); - {Pred, NewVar} -> + subst_phi_uses_uncond0(Left, Map, [{Pred, NewVar} | Acc]); + {Pred, _NewVar} = PredNV -> %% The variable is untagged! - subst_phi_uses_uncond0(Left, Map, [{Pred, NewVar}|Acc]); + subst_phi_uses_uncond0(Left, Map, [PredNV | Acc]); false -> %% The variable is not untagged. - subst_phi_uses_uncond0(Left, Map, [{Pred, Var}|Acc]) + subst_phi_uses_uncond0(Left, Map, [{Pred, Var} | Acc]) end; none -> %% The variable is not untagged. - subst_phi_uses_uncond0(Left, Map, [{Pred, Var}|Acc]) + subst_phi_uses_uncond0(Left, Map, [{Pred, Var} | Acc]) end; subst_phi_uses_uncond0([], _Map, Acc) -> Acc. @@ -839,13 +839,8 @@ end end. -any_is_float([Var|Left]) -> - case erl_types:t_is_float(get_type(Var)) of - true -> true; - false -> any_is_float(Left) - end; -any_is_float([]) -> - false. +any_is_float(Vars) -> + lists:any(fun (V) -> erl_types:t_is_float(get_type(V)) end, Vars). remove_duplicates(List) -> remove_duplicates(List, []). diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode.hrl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode.hrl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode.hrl 2009-04-16 10:24:16.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode.hrl 2009-09-18 15:08:45.000000000 +0100 @@ -23,12 +23,10 @@ %%===================================================================== %%--------------------------------------------------------------------- -%% THESE DO NOT REALLY BELONG HERE -- PLEASE REMOVE ASAP! +%% THIS DOES NOT REALLY BELONG HERE -- PLEASE REMOVE ASAP! %%--------------------------------------------------------------------- -type ordset(T) :: [T]. -%%-type erl_type() :: any(). %% XXX: belongs to 'erl_types' --type erl_type() :: 'any' | 'none' | 'unit' | {'c',atom(),_,_}. %%--------------------------------------------------------------------- %% Include files needed for the compilation of this header file @@ -92,6 +90,8 @@ -type icode_comment_text() :: atom() | string() | {atom(), term()}. +-type icode_info() :: [{'arg_types', [erl_types:erl_type()]}]. + %%--------------------------------------------------------------------- %% Icode instructions %%--------------------------------------------------------------------- @@ -136,7 +136,7 @@ type :: icode_call_type(), continuation :: [] | icode_lbl(), fail_label = [] :: [] | icode_lbl(), - in_guard = false :: bool()}). + in_guard = false :: boolean()}). -record(icode_enter, {'fun' :: icode_funcall(), args :: [icode_term_arg()], @@ -151,9 +151,9 @@ -record(icode_begin_handler, {dstlist :: [icode_var()]}). %% TODO: Remove [] from fail_label --record(icode_fail, {class :: icode_exit_class(), - args :: [icode_term_arg()], - fail_label = [] :: [] | icode_lbl()}). +-record(icode_fail, {class :: icode_exit_class(), + args :: [icode_term_arg()], + fail_label = [] :: [] | icode_lbl()}). -record(icode_comment, {text :: icode_comment_text()}). @@ -176,13 +176,13 @@ -record(icode, {'fun' :: mfa(), params :: [icode_var()], - is_closure :: bool(), + is_closure :: boolean(), closure_arity :: arity(), - is_leaf :: bool(), + is_leaf :: boolean(), code = [] :: icode_instrs(), data :: hipe_consttab(), var_range :: {non_neg_integer(), non_neg_integer()}, label_range :: {icode_lbl(), icode_lbl()}, - info = [] :: [{arg_types, [erl_type()]}]}). + info = [] :: icode_info()}). %%--------------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_mulret.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_mulret.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_mulret.erl 2009-06-05 13:53:37.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_mulret.erl 2009-09-18 15:08:59.000000000 +0100 @@ -75,7 +75,8 @@ %% Return : %% Notes : %%>----------------------------------------------------------------------< -mkTable(List) -> mkTable(List, {[], []}). +mkTable(List) -> + mkTable(List, {[], []}). mkTable([{MFA, Icode} | List], Table) -> %% New Icode @@ -166,7 +167,8 @@ NewCode -> NewCode end. -skipToLabel2([#icode_label{name=L}|Code],L) -> Code; + +skipToLabel2([#icode_label{name = L}|Code],L) -> Code; skipToLabel2([_|Code], L) -> skipToLabel2(Code, L); skipToLabel2([], _) -> noLabel. @@ -435,7 +437,8 @@ end; filterTable([], _, _, _, Res) -> Res. -removeDuplicateCalls(Calls) -> removeDuplicateCalls(Calls, []). +removeDuplicateCalls(Calls) -> + removeDuplicateCalls(Calls, []). removeDuplicateCalls([Call|CallsToKeep], Res) -> case lists:member(Call, CallsToKeep) of @@ -463,12 +466,13 @@ %% Return : %% Notes : %%>----------------------------------------------------------------------< -checkCalls(CallLst, MFA, Rets) -> checkCalls(CallLst, MFA, Rets, [], []). +checkCalls(CallLst, MFA, Rets) -> + checkCalls(CallLst, MFA, Rets, [], []). -checkCalls([C = {callPair, _, {MFA, {matchSize,Rets,_}}}|CallLst], +checkCalls([C = {callPair, _, {MFA, {matchSize, Rets, _}}}|CallLst], MFA, Rets, Res, Opt) -> checkCalls(CallLst, MFA, Rets, [C|Res], [true|Opt]); -checkCalls([{callPair, _, {MFA, {matchSize,_,_}}}|CallLst], +checkCalls([{callPair, _, {MFA, {matchSize, _, _}}}|CallLst], MFA, Rets, Res, Opt) -> checkCalls(CallLst, MFA, Rets, Res, [false|Opt]); checkCalls([_|CallLst], MFA, Rets, Res, Opt) -> @@ -706,7 +710,7 @@ optimizeCall(List, MFA, Callee, DstLst, [{MFA, NewIcode}|Res]); optimizeCall([I|List], Caller, Callee, DstLst, Res) -> optimizeCall(List, Caller, Callee, DstLst, [I|Res]); -optimizeCall([],_,_,_,Res) -> lists:reverse(Res). +optimizeCall([], _, _, _, Res) -> lists:reverse(Res). %%>----------------------------------------------------------------------< %% Procedure : findAndUpdateCall/3 @@ -734,7 +738,7 @@ false -> findAndUpdateCalls(Cfg, Labels, Callee, DstLst, [L|Visited]) end; -findAndUpdateCalls(Cfg,[],_,_,_) -> Cfg. +findAndUpdateCalls(Cfg,[], _, _, _) -> Cfg. containCorrectCall(Cfg, Label, Callee, DstLst) -> Block = hipe_icode_cfg:bb(Cfg,Label), @@ -747,7 +751,7 @@ false end. -checkForUnElems([], _,_,_) -> false; +checkForUnElems([], _, _, _) -> false; checkForUnElems([Succ|Succs], OldVar, DstLst, Cfg) -> Block = hipe_icode_cfg:bb(Cfg,Succ), Code = hipe_bb:code(Block), @@ -1019,13 +1023,8 @@ isCallLocal(Instr, Fun) -> - case hipe_icode:is_call(Instr) of - true -> - ((hipe_icode:call_type(Instr) =:= local) andalso - (hipe_icode:call_fun(Instr) =:= Fun)); - false -> - false - end. + hipe_icode:is_call(Instr) andalso (hipe_icode:call_type(Instr) =:= local) + andalso (hipe_icode:call_fun(Instr) =:= Fun). isCallPrimop(Instr, Fun) -> case hipe_icode:is_call(Instr) of @@ -1153,7 +1152,6 @@ %% gotoLabel(L, [L|List]) -> List; %% gotoLabel(L, [_|List]) -> gotoLabel(L, List); %% gotoLabel(_, []) -> []. - %% %%>----------------------------------------------------------------------< diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_pp.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_pp.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_pp.erl 2009-03-12 12:20:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_pp.erl 2009-09-18 15:08:43.000000000 +0100 @@ -49,10 +49,6 @@ %%--------------------------------------------------------------------- --type io_device() :: atom() | pid(). %% XXX: DOES NOT BELONG HERE - -%%--------------------------------------------------------------------- - -spec pp(#icode{}) -> 'ok'. %% @doc Prettyprints linear Icode on stdout. %%

    Badly formed or unknown instructions are printed surrounded @@ -60,7 +56,7 @@ pp(Icode) -> pp(standard_io, Icode). --spec pp(io_device(), #icode{}) -> 'ok'. +-spec pp(io:device(), #icode{}) -> 'ok'. %% @doc Prettyprints linear Icode on IoDevice. %%

    Badly formed or unknown instructions are printed surrounded by %% three stars "***".

    @@ -88,7 +84,7 @@ pp_block(Code) -> pp_instrs(standard_io, Code). --spec pp_instrs(io_device(), icode_instrs()) -> 'ok'. +-spec pp_instrs(io:device(), icode_instrs()) -> 'ok'. %% @doc Prettyprints a list of Icode instructions. pp_instrs(Dev, Is) -> lists:foreach(fun (I) -> pp_instr(Dev, I) end, Is). diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_primops.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_primops.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_primops.erl 2009-04-16 10:24:07.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_primops.erl 2009-09-18 15:08:29.000000000 +0100 @@ -40,17 +40,13 @@ %%--------------------------------------------------------------------- --type io_device() :: atom() | pid(). %% XXX: DOES NOT BELONG HERE - -%%--------------------------------------------------------------------- - %% Note that 'unsafe_...' operations are generally "safe", i.e., it is %% typically unsafe to use them unless you have extra information about %% the call (e.g., if the types are known). However, if they have been %% correctly introduced in the code, most of them are also OK to remove %% if the result is not used. --spec is_safe(icode_primop()) -> bool(). +-spec is_safe(icode_primop()) -> boolean(). is_safe('+') -> false; is_safe('/') -> false; @@ -147,7 +143,7 @@ is_safe(#unsafe_update_element{}) -> true. --spec fails(icode_funcall()) -> bool(). +-spec fails(icode_funcall()) -> boolean(). fails('+') -> true; fails('-') -> true; @@ -255,7 +251,7 @@ %% Pretty printing %%===================================================================== --spec pp(io_device(), icode_primop()) -> 'ok'. +-spec pp(io:device(), icode_primop()) -> 'ok'. pp(Dev, Op) -> case Op of @@ -370,7 +366,7 @@ %% Type handling %%===================================================================== --spec type(icode_funcall(), [erl_type()]) -> erl_type(). +-spec type(icode_funcall(), [erl_types:erl_type()]) -> erl_types:erl_type(). type(Primop, Args) -> case Primop of @@ -733,7 +729,7 @@ end. --spec type(icode_funcall()) -> erl_type(). +-spec type(icode_funcall()) -> erl_types:erl_type(). type(Primop) -> case Primop of @@ -910,7 +906,7 @@ %% function arg_types returns a list of the demanded argument types for %% a bif to succeed. --spec arg_types(icode_funcall()) -> [erl_type()] | 'unknown'. +-spec arg_types(icode_funcall()) -> [erl_types:erl_type()] | 'unknown'. arg_types(Primop) -> case Primop of diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_range.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_range.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_range.erl 2009-06-05 13:53:45.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_range.erl 2009-11-20 13:32:31.000000000 +0000 @@ -52,15 +52,16 @@ -include("../flow/hipe_bb.hrl"). -include("hipe_icode_type.hrl"). --type range_rep() :: {'neg_inf' | integer(), 'pos_inf' | integer()} | 'empty'. --type fun_name() :: atom() | tuple(). +-type range_tuple() :: {'neg_inf' | integer(), 'pos_inf' | integer()}. +-type range_rep() :: range_tuple() | 'empty'. +-type fun_name() :: atom() | tuple(). -type inf_integer() :: 'neg_inf' | 'pos_inf' | integer(). -record(range, {range :: range_rep(), - other :: bool()}). + other :: boolean()}). -record(ann, {range :: #range{}, - type :: erl_type(), + type :: erl_types:erl_type(), count :: integer()}). -type range_anno() :: {range_anno, #ann{}, fun((#ann{}) -> string())}. @@ -214,7 +215,7 @@ analyse_blocks(NewState, NewWork2) end. --spec analyse_block(label(), info(), #state{}, bool()) -> {#state{}, [label()]}. +-spec analyse_block(label(), info(), #state{}, boolean()) -> {#state{}, [label()]}. analyse_block(Label, Info, State, Rewrite) -> BB = state__bb(State, Label), @@ -225,7 +226,7 @@ State2 = state__ret_type_update(State1, RetType), state__update_info(State2, InfoList, Rewrite). --spec analyse_BB([icode_instr()], info(), [icode_instr()], bool(), call_fun()) -> +-spec analyse_BB([icode_instr()], info(), [icode_instr()], boolean(), call_fun()) -> {[icode_instr()], [{label(),info()}], #range{}}. analyse_BB([Last], Info, Code, Rewrite, LookupFun) -> @@ -313,7 +314,7 @@ NewR -> Ann#ann{range = NewR, count = C+1} end. --spec type_to_ann(erl_type()) -> #ann{}. +-spec type_to_ann(erl_types:erl_type()) -> #ann{}. type_to_ann(Type) -> #ann{range = range_from_simple_type(Type), type = t_limit(Type,1), count=1}. @@ -403,7 +404,7 @@ Fun = hipe_icode:call_fun(Call), Type = hipe_icode:call_type(Call), DstRanges = analyse_call_or_enter_fun(Fun, Args, Type, LookupFun), - NewDefs = [update_info(Var, Type) || {Var,Type} <- lists:zip(Dsts, DstRanges)], + NewDefs = [update_info(Var, R) || {Var,R} <- lists:zip(Dsts, DstRanges)], hipe_icode:subst_defines(lists:zip(Dsts, NewDefs), Call) end. @@ -435,7 +436,7 @@ NewDst = update_info(Dst, DstRange, fun widen/3), hipe_icode:subst_defines([{Dst, NewDst}], Phi). --spec analyse_last_insn(icode_instr(), info(), bool(), call_fun()) -> +-spec analyse_last_insn(icode_instr(), info(), boolean(), call_fun()) -> last_instr_return(). analyse_last_insn(I, Info, Rewrite, LookupFun) -> @@ -472,7 +473,7 @@ [RetRange] = analyse_call_or_enter_fun(Fun, Args, CallType, LookupFun), {{Insn,[]}, RetRange}. --spec analyse_switch_val(#icode_switch_val{}, info(), bool()) -> instr_split_info(). +-spec analyse_switch_val(#icode_switch_val{}, info(), boolean()) -> instr_split_info(). analyse_switch_val(Switch, Info, Rewrite) -> Var = hipe_icode:switch_val_term(Switch), @@ -515,7 +516,7 @@ {PointTypes, _} = lists:unzip(Acc), {remove_point_types(SRange, PointTypes), Acc}. --spec update_switch(#icode_switch_val{}, [{#range{},label()}], bool()) -> +-spec update_switch(#icode_switch_val{}, [{#range{},label()}], boolean()) -> #icode_switch_val{}. update_switch(Switch, LabelRangeList, KeepFail) -> @@ -590,7 +591,7 @@ {NewI, [{Continuation,NewInfo}, {Fail,Info}]} end. --spec analyse_if(#icode_if{}, info(), bool()) -> +-spec analyse_if(#icode_if{}, info(), boolean()) -> {#icode_goto{} | #icode_if{}, [{label(),info()}]}. analyse_if(If, Info, Rewrite) -> @@ -604,7 +605,7 @@ end. -spec analyse_sane_if(#icode_if{}, info(), [argument(),...], - [#range{},...], bool()) -> + [#range{},...], boolean()) -> {#icode_goto{} | #icode_if{}, [{label(), info()}]}. analyse_sane_if(If, Info, [Arg1, Arg2], [Range1, Range2], Rewrite) -> @@ -766,7 +767,7 @@ range_init(R1_false_range, R1_other), range_init(R2_false_range, R2_other)}. --spec analyse_type(#icode_type{}, info(), bool()) -> +-spec analyse_type(#icode_type{}, info(), boolean()) -> {#icode_goto{} | #icode_type{}, [{label(),info()}]}. analyse_type(Type, Info, Rewrite) -> @@ -842,7 +843,7 @@ %%== Ranges ================================================================== --spec pp_ann(#ann{} | erl_type()) -> [string()]. +-spec pp_ann(#ann{} | erl_types:erl_type()) -> [string()]. pp_ann(#ann{range=#range{range=R, other=false}}) -> pp_range(R); @@ -866,12 +867,12 @@ val_to_string(neg_inf) -> "-inf"; val_to_string(X) when is_integer(X) -> integer_to_list(X). --spec range_from_type(erl_type()) -> [#range{}]. +-spec range_from_type(erl_types:erl_type()) -> [#range{}]. range_from_type(Type) -> [range_from_simple_type(T) || T <- t_to_tlist(Type)]. --spec range_from_simple_type(erl_type()) -> #range{}. +-spec range_from_simple_type(erl_types:erl_type()) -> #range{}. range_from_simple_type(Type) -> None = t_none(), @@ -886,7 +887,7 @@ #range{range = Range, other = true} end. --spec range_init(range_rep(), bool()) -> #range{}. +-spec range_init(range_rep(), boolean()) -> #range{}. range_init({Min, Max} = Range, Other) -> case inf_geq(Max, Min) of @@ -902,11 +903,11 @@ range(#range{range = R}) -> R. --spec other(#range{}) -> bool(). +-spec other(#range{}) -> boolean(). other(#range{other = O}) -> O. --spec set_other(#range{}, bool()) -> #range{}. +-spec set_other(#range{}, boolean()) -> #range{}. set_other(R, O) -> R#range{other = O}. @@ -920,12 +921,12 @@ range__max(#range{range=empty}) -> empty; range__max(#range{range={_,Max}}) -> Max. --spec range__is_none(#range{}) -> bool(). +-spec range__is_none(#range{}) -> boolean(). range__is_none(#range{range=empty, other=false}) -> true; range__is_none(#range{}) -> false. --spec range__is_empty(#range{}) -> bool(). +-spec range__is_empty(#range{}) -> boolean(). range__is_empty(#range{range=empty}) -> true; range__is_empty(#range{range={_,_}}) -> false. @@ -973,7 +974,7 @@ -spec any_r() -> {'neg_inf','pos_inf'}. -any_r() -> {neg_inf,pos_inf}. +any_r() -> {neg_inf, pos_inf}. -spec get_range_from_args([argument()]) -> [#range{}]. @@ -1030,7 +1031,7 @@ empty end. --spec other_inf(bool(), bool()) -> bool(). +-spec other_inf(boolean(), boolean()) -> boolean(). other_inf(O1, O2) -> O1 and O2. @@ -1055,7 +1056,7 @@ NewMax = inf_max([Max1,Max2]), {NewMin,NewMax}. --spec other_sup(bool(), bool()) -> bool(). +-spec other_sup(boolean(), boolean()) -> boolean(). other_sup(O1, O2) -> O1 or O2. @@ -1191,7 +1192,7 @@ basic_type(#unsafe_element{}) -> not_analysed; basic_type(#unsafe_update_element{}) -> not_analysed. --spec analyse_bs_get_integer(integer(), integer(), bool()) -> range_rep(). +-spec analyse_bs_get_integer(integer(), integer(), boolean()) -> range_tuple(). analyse_bs_get_integer(Size, Flags, true) -> Signed = Flags band 4, @@ -1254,26 +1255,26 @@ GreaterMax2 -> {inf_mult(Min2, Max1), inf_mult(Max2, Max1)}; true -> {inf_mult(Min2, Max1), inf_mult(Max2, Min1)} end; - %% Kolumn 1 eller 2 - GreaterMin2 -> % Kolumn 1 eller 2 rad 3 + %% Column 1 or 2 + GreaterMin2 -> % Column 1 or 2 row 3 range(range_mult(Range2, Range1)); - GreaterMax1 -> % Kolumn 2 Rad 1 eller 2 - if GreaterMax2 -> % Kolumn 2 Rad 2 + GreaterMax1 -> % Column 2 Row 1 or 2 + if GreaterMax2 -> % Column 2 Row 2 NewMin = inf_min([inf_mult(Min2, Max1), inf_mult(Max2, Min1)]), NewMax = inf_max([inf_mult(Min2, Min1), inf_mult(Max2, Max1)]), {NewMin, NewMax}; - true -> % Kolumn 2 Rad 1 + true -> % Column 2 Row 1 {inf_mult(Min2, Max1), inf_mult(Min2, Min1)} end; - GreaterMax2 -> % Kolumn 1 Rad 2 + GreaterMax2 -> % Column 1 Row 2 range(range_mult(Range2, Range1)); - true -> % Kolumn 1 Rad 1 + true -> % Column 1 Row 1 {inf_mult(Max1, Max2), inf_mult(Min2, Min1)} end, Other = other(Range1) orelse other(Range2), range_init(Range, Other). --spec extreme_divisors(#range{}) -> range_rep(). +-spec extreme_divisors(#range{}) -> range_tuple(). extreme_divisors(#range{range={0,0}}) -> {0,0}; extreme_divisors(#range{range={0,Max}}) -> {1,Max}; @@ -1348,7 +1349,7 @@ Max2 = range__max(Range2), Min1Geq0 = inf_geq(Min1, 0), Max1Less0 = not inf_geq(Max1, 0), - {Min, Max} = + MinMax = if Min1Geq0 -> {inf_bsl(Min1, Min2), inf_bsl(Max1, Max2)}; true -> @@ -1356,7 +1357,7 @@ true -> {inf_bsl(Min1, Max2), inf_bsl(Max1, Max2)} end end, - range_init({Min, Max}, false). + range_init(MinMax, false). -spec range_bnot(#range{}) -> #range{}. @@ -1391,10 +1392,10 @@ -spec range_band(#range{}, #range{}) -> #range{}. range_band(R1, R2) -> - {Min1, Max1} = range(R1), - {Min2, Max2} = range(R2), - Width1 = width({Min1, Max1}), - Width2 = width({Min2, Max2}), + {_Min1, Max1} = MM1 = range(R1), + {_Min2, Max2} = MM2 = range(R2), + Width1 = width(MM1), + Width2 = width(MM2), Range = case {classify_range(R1), classify_range(R2)} of {minus_minus, minus_minus} -> @@ -1410,7 +1411,7 @@ {inf_bsl(-1, Width), Max1}; {minus_plus, minus_plus} -> Width = inf_max([Width1, Width2]), - {inf_bsl(-1, Width), inf_max([Max1,Max2])}; + {inf_bsl(-1, Width), inf_max([Max1, Max2])}; {minus_plus, plus_plus} -> {0, Max2}; {plus_plus, minus_minus} -> @@ -1425,10 +1426,10 @@ -spec range_bor(#range{}, #range{}) -> #range{}. range_bor(R1, R2) -> - {Min1, Max1} = range(R1), - {Min2, Max2} = range(R2), - Width1 = width({Min1, Max1}), - Width2 = width({Min2, Max2}), + {Min1, _Max1} = MM1 = range(R1), + {Min2, _Max2} = MM2 = range(R2), + Width1 = width(MM1), + Width2 = width(MM2), Range = case {classify_range(R1), classify_range(R2)} of {minus_minus, minus_minus} -> @@ -1482,10 +1483,10 @@ -spec range_bxor(#range{}, #range{}) -> #range{}. range_bxor(R1, R2) -> - {Min1, Max1} = range(R1), - {Min2, Max2} = range(R2), - Width1 = width({Min1, Max1}), - Width2 = width({Min2, Max2}), + {Min1, Max1} = MM1 = range(R1), + {Min2, Max2} = MM2 = range(R2), + Width1 = width(MM1), + Width2 = width(MM2), Range = case {classify_range(R1), classify_range(R2)} of {minus_minus, minus_minus} -> @@ -1568,7 +1569,7 @@ inf_inv(neg_inf) -> pos_inf; inf_inv(Number) -> -Number. --spec inf_geq(inf_integer(), inf_integer()) -> bool(). +-spec inf_geq(inf_integer(), inf_integer()) -> boolean(). inf_geq(pos_inf, _) -> true; inf_geq(_, pos_inf) -> false; @@ -1576,7 +1577,7 @@ inf_geq(neg_inf, _) -> false; inf_geq(A, B) -> A >= B. --spec inf_greater_zero(inf_integer()) -> bool(). +-spec inf_greater_zero(inf_integer()) -> boolean(). inf_greater_zero(pos_inf) -> true; inf_greater_zero(neg_inf) -> false; @@ -1722,7 +1723,8 @@ {State, LabelAcc}. state__info_in_update(S=#state{info_map=IM,liveness=Liveness}, Label, Info) -> - case gb_trees:lookup({Label, in}, IM) of + LabelIn = {Label, in}, + case gb_trees:lookup(LabelIn, IM) of none -> LiveIn = hipe_icode_ssa:ssa_liveness__livein(Liveness, Label), NamesLiveIn = [hipe_icode:var_name(Var) || Var <- LiveIn, @@ -1730,9 +1732,9 @@ OldInfo = gb_trees:empty(), case join_info_in(NamesLiveIn, OldInfo, Info) of fixpoint -> - S#state{info_map=gb_trees:insert({Label, in}, OldInfo, IM)}; + S#state{info_map=gb_trees:insert(LabelIn, OldInfo, IM)}; NewInfo -> - S#state{info_map=gb_trees:enter({Label, in}, NewInfo, IM)} + S#state{info_map=gb_trees:enter(LabelIn, NewInfo, IM)} end; {value, OldInfo} -> OldVars = gb_trees:keys(OldInfo), @@ -1740,7 +1742,7 @@ fixpoint -> fixpoint; NewInfo -> - S#state{info_map=gb_trees:update({Label, in}, NewInfo, IM)} + S#state{info_map=gb_trees:update(LabelIn, NewInfo, IM)} end end. @@ -1903,7 +1905,7 @@ false -> Arg end. --spec update__info([#range{}], [#range{}]) -> {bool(), [#ann{}]}. +-spec update__info([#range{}], [#range{}]) -> {boolean(), [#ann{}]}. update__info(NewRanges, OldRanges) -> SupFun = fun (Ann, Range) -> join_info(Ann, Range, fun safe_widen/3) diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_split_arith.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_split_arith.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_split_arith.erl 2009-03-12 12:20:52.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_split_arith.erl 2009-11-20 13:31:45.000000000 +0000 @@ -354,15 +354,15 @@ case gb_sets:is_empty(Vars) of true -> make_worklist(Left, InfoMap, LabelMap, Cfg, Acc); false -> - %%io:format("make_worklist 1 ~w\n",[Vars]), + %% io:format("make_worklist 1 ~w\n", [Vars]), NewAcc0 = [{Lbl, Succ, gb_trees:get(Succ, LabelMap), gb_sets:intersection(infomap_get(Succ, InfoMap), Vars)} || Succ <- hipe_icode_cfg:succ(Cfg, Lbl)], - NewAcc = [{Lbl, Succ, FailLbl, gb_sets:to_list(PrunedVars)} - || {Lbl, Succ, FailLbl, PrunedVars} <- NewAcc0, + NewAcc = [{Label, Succ, FailLbl, gb_sets:to_list(PrunedVars)} + || {Label, Succ, FailLbl, PrunedVars} <- NewAcc0, gb_sets:is_empty(PrunedVars) =:= false] ++ Acc, - %%io:format("make_worklist 2\n",[]), + %% io:format("make_worklist 2\n", []), make_worklist(Left, InfoMap, LabelMap, Cfg, NewAcc) end; make_worklist([], _InfoMap, _LabelMap, _Cfg, Acc) -> diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_ssa_struct_reuse.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_ssa_struct_reuse.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_ssa_struct_reuse.erl 2009-06-05 13:53:45.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_ssa_struct_reuse.erl 2009-11-20 13:32:32.000000000 +0000 @@ -128,7 +128,7 @@ -record(expr, {id = none :: 'none' | non_neg_integer(), key = none :: 'none' | tuple(), % illegal_icode_instr() defs = none :: 'none' | [icode_var()], - direct_replace = false :: bool(), + direct_replace = false :: boolean(), inserts = ?SETS:new() :: ?SET(_), use = ?SETS:new() :: ?SET(_)}). @@ -170,13 +170,13 @@ %% the variable is defined by. -record(varinfo, {use = ?SETS:new() :: ?SET(_), - ref = none :: 'none' | {non_neg_integer(),non_neg_integer()}, + ref = none :: 'none' | {non_neg_integer(), non_neg_integer()}, elem = none :: 'none' | {icode_var(), non_neg_integer()}, exprid = none :: 'none' | non_neg_integer()}). varinfo_exprid(#varinfo{exprid = Out}) -> Out. -varinfo_use_add(I = #varinfo{use = UseSet}, Use) -> +varinfo_use_add(#varinfo{use = UseSet} = I, Use) -> I#varinfo{use = ?SETS:add_element(Use, UseSet)}. %%----------------------------------------------------------------------------- @@ -213,7 +213,7 @@ code = [] :: [tuple()], % [illegal_icode_instr()] phi = gb_trees:empty() :: gb_tree(), varmap = [] :: [{icode_var(), icode_var()}], - pre_loop = false :: bool(), + pre_loop = false :: boolean(), non_struct_defs = gb_sets:new() :: gb_set(), up_expr = none :: 'none' | ?SET(_), killed_expr = none :: 'none' | ?SET(_), @@ -313,7 +313,7 @@ %% tree - the tree of nodes, with labels as keys and node records as values -record(nodes, { - domtree = none :: any(), + domtree :: hipe_dominators:domTree(), labels = none :: 'none' | [icode_lbl()], postorder = none :: 'none' | [icode_lbl()], start_label = none :: 'none' | icode_lbl(), @@ -357,7 +357,7 @@ %% has been inserted is used to move the reduction test. -record(update, {inserted = gb_trees:empty() :: gb_tree(), - del_red_test = false :: bool()}). + del_red_test = false :: boolean()}). update_inserted_lookup(#update{inserted = Inserted}, ExprId) -> gb_trees:lookup(ExprId, Inserted). @@ -513,20 +513,21 @@ {node_struct_type_add(NodeAcc, {Type, Var, NumElems}), NFAcc, PLPAcc}; {tuple_arity, Var, Cases} -> NewNodeAcc = - lists:foldl(fun(Case, NodeAcc) -> - case Case of - {{const, {flat, Arity}}, _} -> - node_struct_type_add(NodeAcc, {?MKTUPLE, Var, Arity}); - _ -> NodeAcc - end end, NodeAcc, Cases), + lists:foldl(fun(Case, NAcc) -> + case Case of + {{const, {flat, Arity}}, _} -> + Tuple = {?MKTUPLE, Var, Arity}, + node_struct_type_add(NAcc, Tuple); + _ -> NAcc + end + end, NodeAcc, Cases), {NewNodeAcc, NFAcc, PLPAcc}; %% {atom_type, Atom, Var} -> %% {node_atom_type_add(NodeAcc, {Var, Atom}), NFAcc, PLPAcc}; phi -> Def = hipe_icode:phi_dst(Instr), - - Part = lists:foldl(fun(P = {Pred, PredVar}, {IsDef, NotDom}) -> - case hipe_dominators:domTree_dominates(Label, Pred, DomTree) of + Part = lists:foldl(fun(P = {Pr, PredVar}, {IsDef, NotDom}) -> + case hipe_dominators:domTree_dominates(Label, Pr, DomTree) of false -> {IsDef, [P | NotDom]}; true -> @@ -560,12 +561,12 @@ %% Set the pre loop flag of all nodes that are predecessor to this node %% and that are the first nodes prior to a loop. NewNodesAcc2 = - lists:foldl(fun(Label, NodesAcc) -> - PredNode = get_node(Label, NodesAcc), + lists:foldl(fun(Lbl, NsAcc) -> + PredNode = get_node(Lbl, NsAcc), NewPredNode = node_pre_loop_set(PredNode), - NewPredNode2 = node_varmap_set(NewPredNode, node_phi_get(NewNode, Label)), + NewPredNode2 = node_varmap_set(NewPredNode, node_phi_get(NewNode, Lbl)), - enter_node(NewPredNode2, NodesAcc) + enter_node(NewPredNode2, NsAcc) end, NewNodesAcc, PreLoopPreds), {NewNodesAcc2, NewNonFailAcc} @@ -579,9 +580,10 @@ %% debug_struct("Set :", gb_sets:to_list(LabelSet)), case gb_sets:is_member(Label, LabelSet) of false -> - lists:foldl(fun(Label, SetAcc) -> - get_back_trace_rec(CFG, Label, SetAcc) - end, gb_sets:add(Label, LabelSet), hipe_icode_cfg:pred(CFG, Label)); + Preds = hipe_icode_cfg:pred(CFG, Label), + lists:foldl(fun(Lbl, SetAcc) -> + get_back_trace_rec(CFG, Lbl, SetAcc) + end, gb_sets:add(Label, LabelSet), Preds); true -> LabelSet end. @@ -965,7 +967,7 @@ AnticOut = node_antic_out(Node), SubIns = node_sub_inserts(Node), - %%debug_struct("Label: ", Label), + %% debug_struct("Label: ", Label), {HasIns, NewMapsAcc} = ?SETS:fold(fun(ExprId, {HasInsAcc, MapsAcc2}) -> @@ -975,14 +977,11 @@ ExprSubIns = ?SETS:intersection(ExprIns, SubIns), %% There are three cases when to insert an expression - %% 1. - %% The expression is defined at least twice in the subtree of this - %% node, that is length(ExprSubIns) > 1. - %% 2. - %% It is defined in the node and is upwards exposed. - %% 3. - %% The node is a block just above a loop, so we should move - %% all anticipated expressions to the node. + %% 1. The expression is defined at least twice in the subtree of this + %% node, that is length(ExprSubIns) > 1. + %% 2. It is defined in the node and is upwards exposed. + %% 3. The node is a block just above a loop, so we should move + %% all anticipated expressions to the node. case length(ExprSubIns) > 1 orelse ?SETS:is_element(ExprId, UpExpr) orelse node_pre_loop(Node) of @@ -999,8 +998,8 @@ NewIns2 = ?SETS:add_element(Label, NewIns), %% update the node. - NewMaps = maps_expr_enter(expr_inserts_set(Expr, NewIns2), MapsAcc2), - + NewMaps = + maps_expr_enter(expr_inserts_set(Expr, NewIns2), MapsAcc2), {true, NewMaps}; false -> {HasInsAcc, MapsAcc2} @@ -1028,7 +1027,6 @@ end, {NodesIn, MapsIn}, nodes_postorder(NodesIn)). - %%----------------------------------------------------------------------------- %% Update the insert sets of each node in the node tree. %% That is, move the insert information from the expressions to @@ -1037,10 +1035,9 @@ update_nodes_inserts(Nodes, Maps) -> lists:foldl(fun(Expr, NodesAcc) -> ExprId = expr_id(Expr), - ?SETS:fold(fun(Label, NodesAcc) -> - Node = get_node(Label, NodesAcc), - enter_node(node_add_insert(Node, ExprId), - NodesAcc) + ?SETS:fold(fun(Label, NsAcc) -> + Nd = get_node(Label, NsAcc), + enter_node(node_add_insert(Nd, ExprId), NsAcc) end, NodesAcc, expr_inserts(Expr)) end, Nodes, maps_expr_values(Maps)). @@ -1285,32 +1282,34 @@ #icode_phi{} -> %%debug_count_case(?SR_INSTR_TYPE,#phi{}), phi; - #icode_enter{} -> + #icode_enter{} -> %%debug_count_case(?SR_INSTR_TYPE,#enter{}), return; - #icode_return{} -> + #icode_return{} -> %%debug_count_case(?SR_INSTR_TYPE,#return{}), return; #icode_call{type = primop, 'fun' = mktuple} -> %%debug_count_case(?SR_INSTR_TYPE, #call{type = primop, 'fun' = mktuple}), struct; - #icode_call{type = primop, 'fun' = cons} -> + #icode_call{type = primop, 'fun' = cons} -> %%debug_count_case(?SR_INSTR_TYPE, #call{type = primop, 'fun' = cons}), struct; - #icode_call{type = primop, 'fun' = redtest} -> + #icode_call{type = primop, 'fun' = redtest} -> %%debug_count_case(?SR_INSTR_TYPE, #call{type = primop, 'fun' = redtest}), redtest; - #icode_type{test = {tuple, Size}, args = [Var]} -> + #icode_type{test = {tuple, Size}, args = [Var]} -> %%debug_count_case(?SR_INSTR_TYPE, #type{type = {tuple, size}}), {struct_type, Size, Var, ?MKTUPLE}; - #icode_type{test = cons, args = [Var]} -> + #icode_type{test = cons, args = [Var]} -> %%debug_count_case(?SR_INSTR_TYPE,#type{type = cons}), {struct_type, 2, Var, ?CONS}; %#type{type = {atom, Atom}, args = [Var]} -> {atom_type, Atom, Var}; - #icode_call{type = primop, 'fun' = unsafe_hd, dstlist = [DstVar], args = [SrcVar]} -> + #icode_call{type = primop, 'fun' = unsafe_hd, + dstlist = [DstVar], args = [SrcVar]} -> %%debug_count_case(?SR_INSTR_TYPE,#call{type = primop, 'fun' = unsafe_hd}), {struct_elems, 1, DstVar, SrcVar}; - #icode_call{type = primop, 'fun' = unsafe_tl, dstlist = [DstVar], args = [SrcVar]} -> + #icode_call{type = primop, 'fun' = unsafe_tl, + dstlist = [DstVar], args = [SrcVar]} -> %%debug_count_case(?SR_INSTR_TYPE, #call{type = primop, 'fun' = unsafe_tl}), {struct_elems, 2, DstVar, SrcVar}; #icode_switch_tuple_arity{term = Var, cases = Cases} -> diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_type.erl erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_type.erl --- erlang-13.b.1-dfsg/lib/hipe/icode/hipe_icode_type.erl 2009-06-05 13:53:31.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/hipe_icode_type.erl 2009-11-20 13:31:42.000000000 +0000 @@ -47,8 +47,8 @@ -include("hipe_icode_type.hrl"). -include("../flow/cfg.hrl"). --type args_fun() :: fun((mfa(), cfg()) -> [erl_type()]). --type call_fun() :: fun((mfa(), [_]) -> erl_type()). +-type args_fun() :: fun((mfa(), cfg()) -> [erl_types:erl_type()]). +-type call_fun() :: fun((mfa(), [_]) -> erl_types:erl_type()). -type final_fun() :: fun((mfa(), [_]) -> 'ok'). -type data() :: {mfa(), args_fun(), call_fun(), final_fun()}. @@ -102,8 +102,8 @@ -record(state, {info_map = gb_trees:empty() :: gb_tree(), cfg :: cfg(), liveness = gb_trees:empty() :: gb_tree(), - arg_types :: [erl_type()], - ret_type = [t_none()] :: [erl_type()], + arg_types :: [erl_types:erl_type()], + ret_type = [t_none()] :: [erl_types:erl_type()], lookupfun :: call_fun(), resultaction :: final_fun()}). @@ -367,8 +367,6 @@ {erlang, exit, 1} -> false; {erlang, error, 1} -> false; {erlang, error, 2} -> false; - {erlang, fault, 1} -> false; - {erlang, fault, 2} -> false; {erlang, throw, 1} -> false; {erlang, hibernate, 3} -> false; Fun -> @@ -424,10 +422,11 @@ case hipe_icode:if_op(I) of '=:='-> case t_is_none(Inf) of - true -> [{FalseLab, Info}]; - false -> [{TrueLab, enter(Arg1, Inf, - enter(Arg2, Inf, Info))}, - {FalseLab, Info}] + true -> + [{FalseLab, Info}]; + false -> + [{TrueLab, enter(Arg1, Inf, enter(Arg2, Inf, Info))}, + {FalseLab, Info}] end; '=/=' -> case t_is_none(Inf) of @@ -1194,7 +1193,8 @@ NewI -> pos_transform_arith(NewI) end; - false -> I + false -> + I end end. @@ -1797,10 +1797,7 @@ compare(gb_trees:to_list(Info1), gb_trees:to_list(Info2)). compare([{Var, Type1}|Left1], [{Var, Type2}|Left2]) -> - case t_is_equal(Type1, Type2) of - true -> compare(Left1, Left2); - false -> false - end; + t_is_equal(Type1, Type2) andalso compare(Left1, Left2); compare([], []) -> true; compare(_, _) -> @@ -1843,7 +1840,7 @@ lists:zip(Defs, t_to_tlist(Type)) end end, - lists:foldl(fun({X, Type}, Inf) -> enter(X, Type, Inf) end, Info, Pairs) + lists:foldl(fun({X, T}, Inf) -> enter(X, T, Inf) end, Info, Pairs) end. defines(I) -> @@ -1863,15 +1860,10 @@ butlast([H|T]) -> [H|butlast(T)]. --spec any_is_none([erl_type()]) -> bool(). +-spec any_is_none([erl_types:erl_type()]) -> boolean(). -any_is_none([H|T]) -> - case t_is_none(H) of - true -> true; - false -> any_is_none(T) - end; -any_is_none([]) -> - false. +any_is_none(Types) -> + lists:any(fun (T) -> t_is_none(T) end, Types). is_var_or_reg(X) -> hipe_icode:is_var(X) orelse hipe_icode:is_reg(X). @@ -1938,7 +1930,7 @@ TotType = lists:zipwith(fun erl_types:t_sup/2, RT, NewType), State#state{ret_type = TotType}; state__ret_type_update(#state{ret_type = RT} = State, NewType) -> - state__ret_type_update(State, lists:duplicate(length(RT), NewType)). + state__ret_type_update(State, [NewType || _ <- RT]). state__info_in_update(S=#state{info_map=IM, liveness=Liveness}, Label, Info) -> LiveIn = hipe_icode_ssa:ssa_liveness__livein(Liveness, Label), @@ -2098,7 +2090,6 @@ true -> hipe_icode:subst(Subst, I) end. - %% _________________________________________________________________ %% %% Find the types of the arguments to a call @@ -2184,14 +2175,15 @@ %% Icode Coordinator Callbacks %%===================================================================== --spec replace_nones([erl_type()] | erl_type()) -> [erl_type()]. +-spec replace_nones([erl_types:erl_type()] | erl_types:erl_type()) -> + [erl_types:erl_type()]. replace_nones(Types) when is_list(Types) -> [replace_none(T) || T <- Types]; replace_nones(Type) -> [replace_none(Type)]. --spec replace_none(erl_type()) -> erl_type(). +-spec replace_none(erl_types:erl_type()) -> erl_types:erl_type(). replace_none(Type) -> case erl_types:t_is_none(Type) of @@ -2201,7 +2193,8 @@ Type end. --spec update__info([erl_type()], [erl_type()]) -> {bool(), [erl_type()]}. +-spec update__info([erl_types:erl_type()], [erl_types:erl_type()]) -> + {boolean(), [erl_types:erl_type()]}. update__info(NewTypes, OldTypes) -> SupFun = @@ -2211,22 +2204,22 @@ Change = lists:zipwith(EqFun, ResTypes, OldTypes), {lists:all(fun(X) -> X end, Change), ResTypes}. --spec new__info([erl_type()]) -> [erl_type()]. +-spec new__info([erl_types:erl_type()]) -> [erl_types:erl_type()]. new__info(NewTypes) -> [erl_types:t_limit(T, ?TYPE_DEPTH) || T <- NewTypes]. --spec return__info(erl_type()) -> erl_type(). +-spec return__info(erl_types:erl_type()) -> erl_types:erl_type(). return__info(Types) -> Types. --spec return_none() -> [erl_type(),...]. +-spec return_none() -> [erl_types:erl_type(),...]. return_none() -> [erl_types:t_none()]. --spec return_none_args(cfg(), mfa()) -> [erl_type()]. +-spec return_none_args(cfg(), mfa()) -> [erl_types:erl_type()]. return_none_args(Cfg, {_M,_F,A}) -> NoArgs = @@ -2236,7 +2229,7 @@ end, lists:duplicate(NoArgs, erl_types:t_none()). --spec return_any_args(cfg(), mfa()) -> [erl_type()]. +-spec return_any_args(cfg(), mfa()) -> [erl_types:erl_type()]. return_any_args(Cfg, {_M,_F,A}) -> NoArgs = diff -Nru erlang-13.b.1-dfsg/lib/hipe/icode/Makefile erlang-13.b.3-dfsg/lib/hipe/icode/Makefile --- erlang-13.b.1-dfsg/lib/hipe/icode/Makefile 2009-04-16 10:24:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/icode/Makefile 2009-11-20 13:31:20.000000000 +0000 @@ -80,13 +80,15 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- -ERL_COMPILE_FLAGS += +nowarn_shadow_vars +warn_unused_import +warn_missing_spec +warn_untyped_record + +include ../native.mk + +ERL_COMPILE_FLAGS += +warn_unused_import +warn_missing_spec +warn_untyped_record # ---------------------------------------------------- # Targets # ---------------------------------------------------- - debug opt: $(TARGET_FILES) docs: $(DOC_FILES) @@ -121,7 +123,6 @@ $(EBIN)/hipe_icode.beam: ../main/hipe.hrl $(EBIN)/hipe_icode_bincomp.beam: ../flow/cfg.hrl $(EBIN)/hipe_icode_callgraph.beam: hipe_icode_primops.hrl -$(EBIN)/hipe_icode_coordinator.beam: ../util/hipe_digraph.hrl $(EBIN)/hipe_icode_cfg.beam: ../flow/hipe_bb.hrl ../flow/cfg.hrl ../flow/cfg.inc ../main/hipe.hrl $(EBIN)/hipe_icode_ebb.beam: ../flow/cfg.hrl ../flow/ebb.inc $(EBIN)/hipe_icode_exceptions.beam: ../flow/cfg.hrl diff -Nru erlang-13.b.1-dfsg/lib/hipe/main/hipe.app.src erlang-13.b.3-dfsg/lib/hipe/main/hipe.app.src --- erlang-13.b.1-dfsg/lib/hipe/main/hipe.app.src 2009-03-12 12:20:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/main/hipe.app.src 2009-09-18 15:08:36.000000000 +0100 @@ -47,7 +47,12 @@ hipe_amd64_ra_ls, hipe_amd64_ra_naive, hipe_amd64_ra_postconditions, + hipe_amd64_ra_sse2_postconditions, + hipe_amd64_ra_x87_ls, hipe_amd64_registers, + hipe_amd64_specific, + hipe_amd64_specific_sse2, + hipe_amd64_specific_x87, hipe_amd64_spill_restore, hipe_amd64_x87, hipe_arm, @@ -92,6 +97,7 @@ hipe_icode_inline_bifs, hipe_icode_instruction_counter, hipe_icode_liveness, + hipe_icode_mulret, hipe_icode_pp, hipe_icode_primops, hipe_icode_range, @@ -99,6 +105,7 @@ hipe_icode_ssa_const_prop, hipe_icode_ssa_copy_prop, hipe_icode_ssa_struct_reuse, + hipe_icode_split_arith, hipe_icode_type, hipe_ig, hipe_ig_moves, @@ -141,6 +148,7 @@ hipe_rtl_binary_match, hipe_rtl_binary_construct, hipe_rtl_cfg, + hipe_rtl_cleanup_const, hipe_rtl_exceptions, hipe_rtl_lcm, hipe_rtl_liveness, @@ -165,6 +173,8 @@ hipe_sparc_encode, hipe_sparc_finalise, hipe_sparc_frame, + hipe_sparc_liveness_all, + hipe_sparc_liveness_fpr, hipe_sparc_liveness_gpr, hipe_sparc_main, hipe_sparc_pp, @@ -173,8 +183,10 @@ hipe_sparc_ra_ls, hipe_sparc_ra_naive, hipe_sparc_ra_postconditions, + hipe_sparc_ra_postconditions_fp, hipe_sparc_registers, hipe_sparc_specific, + hipe_sparc_specific_fp, hipe_spillcost, hipe_spillmin, hipe_spillmin_color, diff -Nru erlang-13.b.1-dfsg/lib/hipe/main/hipe.erl erlang-13.b.3-dfsg/lib/hipe/main/hipe.erl --- erlang-13.b.1-dfsg/lib/hipe/main/hipe.erl 2009-06-05 13:53:22.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/main/hipe.erl 2009-11-20 13:31:21.000000000 +0000 @@ -225,8 +225,8 @@ -type c_unit() :: mod() | mfa(). -type f_unit() :: mod() | binary(). -type ret_rtl() :: [_]. --type c_ret() :: {'ok',c_unit()} | {'error',_} | - {'ok',c_unit(),ret_rtl()}. %% The last for debugging only +-type c_ret() :: {'ok', c_unit()} | {'error', term()} | + {'ok', c_unit(), ret_rtl()}. %% The last for debugging only -type compile_file() :: atom() | string() | binary(). -type compile_ret() :: {hipe_architecture(), binary()} | list(). @@ -245,7 +245,7 @@ %% %% @see load/2 --spec load(Mod) -> {'module', Mod} | {'error', _} +-spec load(Mod) -> {'module', Mod} | {'error', term()} when is_subtype(Mod, mod()). load(Mod) -> @@ -267,7 +267,7 @@ %% %% @see load/1 --spec load(Mod, string()) -> {'module', Mod} | {'error', _} +-spec load(Mod, string()) -> {'module', Mod} | {'error', term()} when is_subtype(Mod, mod()). load(Mod, BeamFileName) when is_list(BeamFileName) -> @@ -349,7 +349,7 @@ %% %% @equiv f(File, []) --spec f(f_unit()) -> {'ok', mod()} | {'error', _}. +-spec f(f_unit()) -> {'ok', mod()} | {'error', term()}. f(File) -> f(File, []). @@ -365,7 +365,7 @@ %% %% @see c/3 --spec f(f_unit(), comp_options()) -> {'ok', mod()} | {'error', _}. +-spec f(f_unit(), comp_options()) -> {'ok', mod()} | {'error', term()}. f(File, Opts) -> case file(File, user_compile_opts(Opts)) of @@ -388,7 +388,7 @@ %% %% @equiv compile(Name, []) --spec compile(c_unit()) -> {'ok', compile_ret()} | {'error', _}. +-spec compile(c_unit()) -> {'ok', compile_ret()} | {'error', term()}. compile(Name) -> compile(Name, []). @@ -444,7 +444,7 @@ %% @see compile/2 -spec compile(c_unit(), compile_file(), comp_options()) -> - {'ok', compile_ret()} | {'error', _}. + {'ok', compile_ret()} | {'error', term()}. compile(Name, File, Opts0) -> Opts1 = expand_kt2(Opts0), @@ -507,7 +507,7 @@ end. -spec compile_core(mod(), _, compile_file(), comp_options()) -> - {'ok', compile_ret()} | {'error', _}. + {'ok', compile_ret()} | {'error', term()}. compile_core(Name, Core0, File, Opts) -> Core = cerl:from_records(Core0), @@ -536,7 +536,7 @@ %% @see compile/3 -spec compile(mod(), _, compile_file(), comp_options()) -> - {'ok', compile_ret()} | {'error', _}. + {'ok', compile_ret()} | {'error', term()}. compile(Name, [], File, Opts) -> compile(Name, File, Opts); @@ -555,7 +555,7 @@ %% %% @equiv file(File, []) --spec file(Mod) -> {'ok', Mod, compile_ret()} | {'error', _} +-spec file(Mod) -> {'ok', Mod, compile_ret()} | {'error', term()} when is_subtype(Mod, mod()). file(File) -> @@ -575,7 +575,7 @@ %% @see compile/2 -spec file(Mod, comp_options()) -> {'ok', Mod, compile_ret()} - | {'error', _} + | {'error', term()} when is_subtype(Mod, mod()). file(File, Options) when is_atom(File) -> case beam_lib:info(File) of @@ -602,14 +602,16 @@ disasm(File) -> case beam_disasm:file(File) of - #beam_file{exports=BeamExports, comp_info=CompInfo, code=BeamCode} -> + #beam_file{labeled_exports = LabeledExports, + compile_info = CompInfo, + code = BeamCode} -> {options, CompOpts} = lists:keyfind(options, 1, CompInfo), HCompOpts = case lists:keyfind(hipe, 1, CompOpts) of {hipe, L} when is_list(L) -> L; {hipe, X} -> [X]; _ -> [] end, - Exports = fix_beam_exports(BeamExports), + Exports = fix_beam_exports(LabeledExports), {{BeamCode, Exports}, HCompOpts}; {error, _Mod, Error} -> io:format("~s\n", [beam_lib:format_error(Error)]), @@ -640,8 +642,7 @@ ?option_time({ok, Icode} = (catch {ok, cerl_to_icode:module(Core, Options)}), "BEAM-to-Icode", Options), - NeedBeamCode = - not proplists:get_bool(load, Options), + NeedBeamCode = not proplists:get_bool(load, Options), BeamBin = case NeedBeamCode of true -> []; @@ -737,7 +738,7 @@ %% ------------------------------------------------------------------------- -%% finalize/4 +%% finalize/5 %% compiles, assembles, and optionally loads a list of `{MFA, Icode}' pairs, %% and returns `{ok, {TargetArch, Binary}}' or `{error, Reason, Stack}'. @@ -786,7 +787,7 @@ finalize_fun(MfaIcodeList, Exports, Opts) -> case proplists:get_value(concurrent_comp, Opts) of - FalseVal when (FalseVal =:= undefined) or (FalseVal =:= false) -> + FalseVal when (FalseVal =:= undefined) orelse (FalseVal =:= false) -> [finalize_fun_sequential(MFAIcode, Opts, #comp_servers{}) || {_MFA, _Icode} = MFAIcode <- MfaIcodeList]; TrueVal when (TrueVal =:= true) or (TrueVal =:= debug) -> @@ -798,12 +799,12 @@ case MfaIcodeList of [{{M,_,_},_}|_] -> CallGraph = hipe_icode_callgraph:construct_callgraph(MfaIcodeList), - Closures = [{MFA,true} || {MFA, Icode} <- MfaIcodeList, - hipe_icode:icode_is_closure(Icode)], - Exported = [{{M,F,A},false} || {F,A} <- Exports], - NonEscaping = [{M,F,A} || {{M,F,A}, Icode} <- MfaIcodeList, - not lists:member({F,A}, Exports), - not hipe_icode:icode_is_closure(Icode)], + Closures = [{MFA, true} || {MFA, Icode} <- MfaIcodeList, + hipe_icode:icode_is_closure(Icode)], + Exported = [{{M, F, A}, false} || {F, A} <- Exports], + NonEscaping = [MFA || {{_M, F, A} = MFA, Icode} <- MfaIcodeList, + not lists:member({F, A}, Exports), + not hipe_icode:icode_is_closure(Icode)], Escaping = Closures ++ Exported, TypeServerFun = fun() -> @@ -822,9 +823,9 @@ NonEscaping, hipe_icode_range) end, RangeServer = spawn_link(RangeServerFun), - Servers = #comp_servers{pp_server=PPServer, - range=RangeServer, - type=TypeServer}, + Servers = #comp_servers{pp_server = PPServer, + range = RangeServer, + type = TypeServer}, CompFuns = [fun() -> set_architecture(Opts), @@ -833,27 +834,27 @@ Self ! finalize_fun_sequential(IcodeFun, Opts, Servers) end || IcodeFun <- MfaIcodeList], lists:foreach(fun (F) -> spawn_link(F) end, CompFuns), - Final = [receive Res when element(1,Res) =:= MFA -> Res end || - {MFA,_} <- MfaIcodeList], + Final = [receive Res when element(1, Res) =:= MFA -> Res end + || {MFA, _} <- MfaIcodeList], lists:foreach(fun (Pid) -> stop_and_wait(Pid) end, - [PPServer, TypeServer,RangeServer]), + [PPServer, TypeServer, RangeServer]), Final; [] -> [] end. stop_and_wait(Pid) -> - Pid ! {stop,self()}, + Pid ! {stop, self()}, receive _ -> ok end. finalize_fun_sequential({MFA, Icode}, Opts, Servers) -> - {T1,_} = erlang:statistics(runtime), + {T1, _} = erlang:statistics(runtime), ?when_option(verbose, Opts, ?debug_msg("Compiling ~w~n", [MFA])), try hipe_main:compile_icode(MFA, Icode, Opts, Servers) of - {native, _Platform, {unprofiled,Code}} -> - {T2,_} = erlang:statistics(runtime), + {native, _Platform, {unprofiled, Code}} -> + {T2, _} = erlang:statistics(runtime), ?when_option(verbose, Opts, ?debug_msg("Compiled ~w in ~.2f s\n", [MFA,(T2-T1)/1000])), {MFA, Code}; @@ -874,10 +875,10 @@ pp_server() -> receive - {print,Fun} -> - Fun(),pp_server(); - {stop,Pid} -> - Pid ! {done,self()}; + {print, Fun} -> + Fun(), pp_server(); + {stop, Pid} -> + Pid ! {done, self()}; _ -> pp_server() end. @@ -893,7 +894,7 @@ maybe_load(Mod, Bin, WholeModule, Opts) -> case proplists:get_bool(load, Opts) of false -> - {module,Mod}; + {module, Mod}; true -> ?when_option(verbose, Opts, ?debug_msg("Loading/linking\n", [])), do_load(Mod, Bin, WholeModule) @@ -945,7 +946,7 @@ amd64 -> hipe_amd64_assemble:assemble(CompiledCode, Closures, Exports, Options); Arch -> - ?EXIT({executing_on_an_unsupported_architecture,Arch}) + ?EXIT({executing_on_an_unsupported_architecture, Arch}) end. %% -------------------------------------------------------------------- @@ -976,7 +977,7 @@ lists:foreach(fun (T) -> ?set_hipe_timer_val(T, 0) end, hipe_timers()), lists:foreach(fun (Counter) -> case Counter of - {CounterName,InitVal} -> put(CounterName, InitVal); + {CounterName, InitVal} -> put(CounterName, InitVal); CounterName -> put(CounterName, 0) end end, @@ -989,28 +990,28 @@ %% accessed globally. Options have been fully expanded at ths point. init(_Options) -> - put(callersavetime,0), - put(totalspill,{0,0}), - put(spilledtemps,0), - put(pre_ra_instrs,0), - put(post_ra_instrs,0), - put(pre_ra_temps,0), - put(post_ra_temps,0), - put(noregs,0), - put(bbs,0), + put(callersavetime, 0), + put(totalspill, {0,0}), + put(spilledtemps, 0), + put(pre_ra_instrs, 0), + put(post_ra_instrs, 0), + put(pre_ra_temps, 0), + put(post_ra_temps, 0), + put(noregs, 0), + put(bbs, 0), ok. %% -------------------------------------------------------------------- post(Res, Icode, Options) -> TimerVals = - case proplists:get_value(timers,Options) of + case proplists:get_value(timers, Options) of Timers when is_list(Timers) -> [{Timer, ?get_hipe_timer_val(Timer)} || Timer <- Timers]; _ -> [] end, CounterVals = - case proplists:get_value(counters,Options) of + case proplists:get_value(counters, Options) of Counters when is_list(Counters) -> [case Counter of {CounterName, _InitVal} -> {CounterName, get(CounterName)}; @@ -1048,16 +1049,17 @@ %% @doc Returns the current HiPE version as a string(). -spec version() -> string(). + version() -> ?VERSION_STRING(). -%% ____________________________________________________________________ -%% +%% -------------------------------------------------------------------- %% D O C U M E N T A T I O N - H E L P -%% +%% -------------------------------------------------------------------- %% @doc Prints on-line documentation to the standard output. -spec help() -> 'ok'. + help() -> M = "The HiPE Compiler (Version " ++ ?VERSION_STRING() ++ ")\n" ++ @@ -1088,6 +1090,7 @@ ok. -spec help_hiper() -> 'ok'. + help_hiper() -> M = " This interface is supposed to be used by HiPE-developers only!\n" ++ @@ -1122,6 +1125,7 @@ %% @doc Prints documentation about options to the standard output. -spec help_options() -> 'ok'. + help_options() -> set_architecture([]), %% needed for target-specific option expansion O1 = expand_options([o1]), @@ -1246,9 +1250,9 @@ option_text(Opt) when is_atom(Opt) -> "". -%% @doc Prints documentation about a specific option to the standard -%% output. +%% @doc Prints documentation about a specific option to the standard output. -spec help_option(comp_option()) -> 'ok'. + help_option(Opt) -> set_architecture([]), %% needed for target-specific option expansion case expand_options([Opt]) of @@ -1276,6 +1280,7 @@ %% @doc Prints documentation about debugging options to the standard %% output. -spec help_debug_options() -> 'ok'. + help_debug_options() -> io:format("HiPE compiler debug options:\n" ++ " Might require that some modules have been compiled " ++ @@ -1508,12 +1513,14 @@ %% in conflict with options found in the source code. -spec expand_basic_options(comp_options()) -> comp_options(). + expand_basic_options(Opts) -> proplists:normalize(Opts, [{negations, opt_negations()}, {aliases, opt_aliases()}, {expand, opt_basic_expansions()}]). -spec expand_kt2(comp_options()) -> comp_options(). + expand_kt2(Opts) -> proplists:normalize(Opts, [{expand, [{kt2_type, [{use_callgraph, fixpoint}, core, @@ -1525,6 +1532,7 @@ %% this function is called from the help functions. -spec expand_options(comp_options()) -> comp_options(). + expand_options(Opts) -> proplists:normalize(Opts, [{negations, opt_negations()}, {aliases, opt_aliases()}, @@ -1532,6 +1540,7 @@ {expand, opt_expansions()}]). -spec check_options(comp_options()) -> 'ok'. + check_options(Opts) -> Keys = ordsets:from_list(opt_keys()), Used = ordsets:from_list(proplists:get_keys(Opts)), diff -Nru erlang-13.b.1-dfsg/lib/hipe/main/hipe.hrl.src erlang-13.b.3-dfsg/lib/hipe/main/hipe.hrl.src --- erlang-13.b.1-dfsg/lib/hipe/main/hipe.hrl.src 2009-04-16 10:24:02.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/main/hipe.hrl.src 2009-11-20 13:31:22.000000000 +0000 @@ -140,8 +140,8 @@ -endif. -% Use this to display info, save stuff and so on. -% Vars cannot be exported from __Action +%% Use this to display info, save stuff and so on. +%% Vars cannot be exported from __Action -define(when_option(__Opt,__Opts,__Action), case proplists:get_bool(__Opt,__Opts) of true -> __Action; diff -Nru erlang-13.b.1-dfsg/lib/hipe/main/Makefile erlang-13.b.3-dfsg/lib/hipe/main/Makefile --- erlang-13.b.1-dfsg/lib/hipe/main/Makefile 2009-04-16 10:24:02.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/main/Makefile 2009-11-20 13:31:21.000000000 +0000 @@ -66,6 +66,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += +nowarn_shadow_vars +warn_missing_spec +warn_untyped_record # ---------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/hipe/misc/hipe_consttab.erl erlang-13.b.3-dfsg/lib/hipe/misc/hipe_consttab.erl --- erlang-13.b.1-dfsg/lib/hipe/misc/hipe_consttab.erl 2009-06-05 13:53:23.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/misc/hipe_consttab.erl 2009-09-18 15:08:20.000000000 +0100 @@ -292,30 +292,30 @@ -record(ctdata, {type :: ct_type(), alignment :: ct_alignment(), - exported :: bool(), - data :: any()}). + exported :: boolean(), + data :: term()}). -type ctdata() :: #ctdata{}. -spec mk_ctdata(Type::ct_type(), Alignment::ct_alignment(), - Exported::bool(), Data::any()) -> ctdata(). + Exported::boolean(), Data::term()) -> ctdata(). mk_ctdata(Type, Alignment, Exported, Data) -> - #ctdata{type=Type, alignment=Alignment, exported=Exported, data=Data}. + #ctdata{type = Type, alignment = Alignment, exported = Exported, data = Data}. -spec const_type(ctdata()) -> ct_type(). -const_type(#ctdata{type=Type}) -> Type. +const_type(#ctdata{type = Type}) -> Type. -spec const_align(ctdata()) -> ct_alignment(). -const_align(#ctdata{alignment=Alignment}) -> Alignment. +const_align(#ctdata{alignment = Alignment}) -> Alignment. --spec const_exported(ctdata()) -> bool(). -const_exported(#ctdata{exported=Exported}) -> Exported. +-spec const_exported(ctdata()) -> boolean(). +const_exported(#ctdata{exported = Exported}) -> Exported. -spec const_data(ctdata()) -> term(). -const_data(#ctdata{data=Data}) -> Data. +const_data(#ctdata{data = Data}) -> Data. -spec update_const_data(ctdata(), {_,[_]} | {_,[_],_}) -> ctdata(). update_const_data(CTData, Data) -> - CTData#ctdata{data=Data}. + CTData#ctdata{data = Data}. %% @doc Returns the size in bytes. -spec const_size(ctdata()) -> non_neg_integer(). diff -Nru erlang-13.b.1-dfsg/lib/hipe/misc/hipe_data_pp.erl erlang-13.b.3-dfsg/lib/hipe/misc/hipe_data_pp.erl --- erlang-13.b.1-dfsg/lib/hipe/misc/hipe_data_pp.erl 2009-04-16 10:24:03.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/misc/hipe_data_pp.erl 2009-09-18 15:08:20.000000000 +0100 @@ -37,14 +37,13 @@ -include("hipe_consttab.hrl"). --type io_device() :: atom() | pid(). % XXX: DOES NOT BELONG HERE -type hipe_code_type() :: 'icode' | 'rtl' | 'arm' | 'ppc' | 'sparc' | 'x86'. %%----------------------------------------------------------------------------- %% %% Pretty print --spec pp(io_device(), hipe_consttab(), hipe_code_type(), string()) -> 'ok'. +-spec pp(io:device(), hipe_consttab(), hipe_code_type(), string()) -> 'ok'. pp(Dev, Table, CodeType, Pre) -> Ls = hipe_consttab:labels(Table), diff -Nru erlang-13.b.1-dfsg/lib/hipe/misc/hipe_pack_constants.erl erlang-13.b.3-dfsg/lib/hipe/misc/hipe_pack_constants.erl --- erlang-13.b.1-dfsg/lib/hipe/misc/hipe_pack_constants.erl 2009-06-05 13:53:32.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/misc/hipe_pack_constants.erl 2009-09-18 15:08:43.000000000 +0100 @@ -72,10 +72,7 @@ pack_labels([Label|Labels],MFA,ConstTab,AccSize,OldAlign,ConstNo, Acc, Refs) -> Const = hipe_consttab:lookup(Label, ConstTab), Align = hipe_consttab:const_align(Const), - NewAlign = - if Align > OldAlign -> Align; - true -> OldAlign - end, + NewAlign = erlang:max(Align, OldAlign), Start = case AccSize rem Align of 0 -> AccSize; diff -Nru erlang-13.b.1-dfsg/lib/hipe/misc/hipe_sdi.erl erlang-13.b.3-dfsg/lib/hipe/misc/hipe_sdi.erl --- erlang-13.b.1-dfsg/lib/hipe/misc/hipe_sdi.erl 2009-03-12 12:21:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/misc/hipe_sdi.erl 2009-09-18 15:08:49.000000000 +0100 @@ -296,12 +296,12 @@ false -> [SdiNr|WKL] end. --spec sdiSpanIsShort(#sdi_data{}, integer()) -> bool(). -sdiSpanIsShort(#sdi_data{si=#sdi_info{lb=LB,ub=UB}}, SdiSpan) -> +-spec sdiSpanIsShort(#sdi_data{}, integer()) -> boolean(). +sdiSpanIsShort(#sdi_data{si = #sdi_info{lb = LB, ub = UB}}, SdiSpan) -> SdiSpan >= LB andalso SdiSpan =< UB. -spec sdiLongIncr(#sdi_data{}) -> byte(). -sdiLongIncr(#sdi_data{si=#sdi_info{incr=Incr}}) -> Incr. +sdiLongIncr(#sdi_data{si = #sdi_info{incr = Incr}}) -> Incr. %%% "Now construct a table INCREMENT[0:n] by defining %%% INCREMENT[0] = 0 and INCREMENT[i] = INCREMENT[i-1]+LONG[i] diff -Nru erlang-13.b.1-dfsg/lib/hipe/misc/Makefile erlang-13.b.3-dfsg/lib/hipe/misc/Makefile --- erlang-13.b.1-dfsg/lib/hipe/misc/Makefile 2009-04-16 10:24:03.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/misc/Makefile 2009-11-20 13:31:22.000000000 +0000 @@ -65,6 +65,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += +warn_exported_vars +warn_missing_spec +warn_untyped_record # ---------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/hipe/native.mk erlang-13.b.3-dfsg/lib/hipe/native.mk --- erlang-13.b.1-dfsg/lib/hipe/native.mk 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/native.mk 2009-11-20 13:33:10.000000000 +0000 @@ -0,0 +1,5 @@ +ifndef SECONDARY_BOOTSTRAP +ifeq ($(NATIVE_LIBS_ENABLED),yes) +ERL_COMPILE_FLAGS += +native +endif +endif diff -Nru erlang-13.b.1-dfsg/lib/hipe/opt/hipe_schedule.erl erlang-13.b.3-dfsg/lib/hipe/opt/hipe_schedule.erl --- erlang-13.b.1-dfsg/lib/hipe/opt/hipe_schedule.erl 2009-06-05 13:53:23.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/opt/hipe_schedule.erl 2009-11-20 13:31:23.000000000 +0000 @@ -151,13 +151,13 @@ zero_latency() -> 0. -lookup_instr([{N,I}|_],N) -> I; -lookup_instr([_|Xs],N) -> lookup_instr(Xs,N). +lookup_instr([{N,I}|_], N) -> I; +lookup_instr([_|Xs], N) -> lookup_instr(Xs, N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function : block -%% Argument : Instrs - [Instr] , list of all the instructions in a basic -%% block. +%% Argument : Instrs - [Instr], list of all the instructions in a basic +%% block. %% Returns : A new scheduled block %% Description : Schedule a basic block %% @@ -171,25 +171,23 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Don't fire up the scheduler if there's no work to do. -block(_,[]) -> +block(_, []) -> []; -block(_L,[I]) -> +block(_L, [I]) -> case hipe_sparc:is_any_branch(I) of true -> [hipe_sparc:nop_create(), I]; false -> [I] end; -block(_L,Blk) -> +block(_L, Blk) -> IxBlk = indexed_bb(Blk), - case length(IxBlk) =:= 1 of % have to check length again, because comments - true -> % and nops can have been removed. - {_N,I} = hd(IxBlk), + case IxBlk of + [{_N, I}] -> % comments and nops may have been removed. case hipe_sparc:is_any_branch(I) of true -> [hipe_sparc:nop_create(), I]; false -> [I] end; - false -> - {DAG, Preds} = deps(IxBlk), - Sch = bb(IxBlk,{DAG, Preds}), + _ -> + Sch = bb(IxBlk, {DAG, _Preds} = deps(IxBlk)), {NewSch, NewIxBlk} = fill_delays(Sch, IxBlk, DAG), X = finalize_block(NewSch, NewIxBlk), debug1_stuff(Blk, DAG, IxBlk, Sch, X), @@ -375,8 +373,8 @@ %% To - 1, and the nodes between From and To gets old_index - 1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% update_schedule(To, To, Sch) -> - {{cycle, C}, {node, N}} = hipe_vectors:get(Sch, To-1), - hipe_vectors:set(Sch, To-1, {{cycle, C+1},{node, N}}); + {{cycle, C}, {node, _N} = Node} = hipe_vectors:get(Sch, To-1), + hipe_vectors:set(Sch, To-1, {{cycle, C+1}, Node}); update_schedule(From, To, Sch) -> Temp = hipe_vectors:get(Sch, From-1), Sch1 = hipe_vectors:set(Sch, From-1, hipe_vectors:get(Sch, From)), @@ -401,7 +399,6 @@ single_depend(N, [{1, N}]) -> true; single_depend(_N, [{_Lat, _}|_]) -> false. - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function : get_index %% Argument : Sch - schedule @@ -410,7 +407,7 @@ %% Description : Returns the index of the node on position N in the schedule. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_index(Sch, N) -> - {{cycle, _C},{node,Index}} = hipe_vectors:get(Sch,N-1), + {{cycle, _C}, {node, Index}} = hipe_vectors:get(Sch,N-1), Index. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -729,8 +726,7 @@ % number of predeccessors... {_DepTab,DAG1} = dd(IxBB, DAG), DAG2 = md(IxBB, DAG1), - DAG3 = cd(IxBB, DAG2), - DAG3. + cd(IxBB, DAG2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function : empty_dag @@ -1199,14 +1195,15 @@ %% and State is the new state %% Description : Adds dependencies for overlapping stores. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -st_overlap(N, {sp,Off}, {St_Sp, St_Hp, Ld_Sp, Ld_Hp}) -> - {DepSt,IndepSt_Sp} = st_sp_dep(St_Sp,Off), - {DepLd,IndepLd_Sp} = ld_sp_dep(Ld_Sp,Off), - {DepSt, DepLd, {[{N,Off}|IndepSt_Sp], St_Hp, IndepLd_Sp, Ld_Hp}}; -st_overlap(N, {hp,Dst,Off}, { St_Sp, St_Hp, Ld_Sp, Ld_Hp}) -> - {DepSt,_IndepSt_Hp} = st_hp_dep(St_Hp, {Dst, Off}), - {DepLd,IndepLd_Hp} = ld_hp_dep(Ld_Hp, {Dst, Off}), - {DepSt, DepLd, {St_Sp, [{N,Dst,Off}|St_Hp], Ld_Sp, IndepLd_Hp}}. +st_overlap(N, {sp, Off}, {St_Sp, St_Hp, Ld_Sp, Ld_Hp}) -> + {DepSt, IndepSt_Sp} = st_sp_dep(St_Sp, Off), + {DepLd, IndepLd_Sp} = ld_sp_dep(Ld_Sp, Off), + {DepSt, DepLd, {[{N, Off}|IndepSt_Sp], St_Hp, IndepLd_Sp, Ld_Hp}}; +st_overlap(N, {hp, Dst, Off}, {St_Sp, St_Hp, Ld_Sp, Ld_Hp}) -> + DstOff = {Dst, Off}, + {DepSt,_IndepSt_Hp} = st_hp_dep(St_Hp, DstOff), + {DepLd, IndepLd_Hp} = ld_hp_dep(Ld_Hp, DstOff), + {DepSt, DepLd, {St_Sp, [{N, Dst, Off}|St_Hp], Ld_Sp, IndepLd_Hp}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function : ld_overlap @@ -1218,12 +1215,12 @@ %% Returns : { DepStrs, State } %% Description : Adds dependencies for overlapping laods %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ld_overlap(N, {sp,Off}, {St_Sp, St_Hp, Ld_Sp, Ld_Hp}) -> - DepSt = sp_dep_only(St_Sp,Off), - {DepSt, {St_Sp, St_Hp, [{N,Off}|Ld_Sp], Ld_Hp}}; -ld_overlap(N, {hp,Src,Off}, {St_Sp, St_Hp, Ld_Sp, Ld_Hp}) -> +ld_overlap(N, {sp, Off}, {St_Sp, St_Hp, Ld_Sp, Ld_Hp}) -> + DepSt = sp_dep_only(St_Sp, Off), + {DepSt, {St_Sp, St_Hp, [{N, Off}|Ld_Sp], Ld_Hp}}; +ld_overlap(N, {hp, Src, Off}, {St_Sp, St_Hp, Ld_Sp, Ld_Hp}) -> DepSt = hp_dep_only(St_Hp, Src, Off), - {DepSt, {St_Sp, St_Hp, Ld_Sp, [{N,Src,Off}|Ld_Hp]}}. + {DepSt, {St_Sp, St_Hp, Ld_Sp, [{N, Src, Off}|Ld_Hp]}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function : st_sp_dep @@ -1243,26 +1240,26 @@ %% Function : st_hp_dep %% Description : Adds dependencies that are depending on a heap store %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -st_hp_dep(Stores, {Reg, Off}) -> - hp_dep(Stores, {Reg, Off}, [], []). +st_hp_dep(Stores, {_Reg, _Off} = RegOff) -> + hp_dep(Stores, RegOff, [], []). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function : ld_hp_dep %% Description : Adds dependencies that are depending on a heap load %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ld_hp_dep(Loads, {Reg, Off}) -> - hp_dep(Loads, {Reg, Off}, [], []). +ld_hp_dep(Loads, {_Reg, _Off} = RegOff) -> + hp_dep(Loads, RegOff, [], []). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function : sp_dep %% Description : Returns {Dependent, Independent} which are lists of nodes %% that depends or not on a stack load/store %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -sp_dep([],_Off,Dep,Indep) -> {Dep,Indep}; -sp_dep([{N,Off}|Xs],Off,Dep,Indep) -> - sp_dep(Xs,Off,[N|Dep],Indep); -sp_dep([X|Xs],Off,Dep,Indep) -> - sp_dep(Xs,Off,Dep,[X|Indep]). +sp_dep([], _Off, Dep, Indep) -> {Dep, Indep}; +sp_dep([{N,Off}|Xs], Off, Dep, Indep) -> + sp_dep(Xs, Off, [N|Dep], Indep); +sp_dep([X|Xs], Off, Dep, Indep) -> + sp_dep(Xs, Off, Dep, [X|Indep]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function : hp_dep @@ -1296,11 +1293,11 @@ %% %% (As said before, it might be possible to lighten this restriction?) -hp_dep_only([],_Reg,_Off) -> []; -hp_dep_only([{_N,Reg,Off_1}|Xs],Reg,Off) when Off_1 =/= Off -> - hp_dep_only(Xs,Reg,Off); -hp_dep_only([{N,_,_}|Xs],Reg,Off) -> - [N|hp_dep_only(Xs,Reg,Off)]. +hp_dep_only([], _Reg, _Off) -> []; +hp_dep_only([{_N,Reg,Off_1}|Xs], Reg, Off) when Off_1 =/= Off -> + hp_dep_only(Xs, Reg, Off); +hp_dep_only([{N,_,_}|Xs], Reg, Off) -> + [N|hp_dep_only(Xs, Reg, Off)]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Control dependences: @@ -1338,9 +1335,9 @@ cd(Xs,NewDAG,{N,Ty},[],[]); {unsafe,Ty} -> NewDAG = cd_unsafe_deps(PrevBr,N,Ty,DAG), - cd(Xs,NewDAG,PrevBr,[{N,Ty}|PrevUnsafe],PrevOthers); + cd(Xs, NewDAG, PrevBr, [{N,Ty}|PrevUnsafe], PrevOthers); {other,_Ty} -> - cd(Xs,DAG,PrevBr,PrevUnsafe,[N|PrevOthers]) + cd(Xs, DAG, PrevBr, PrevUnsafe, [N|PrevOthers]) end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1403,26 +1400,26 @@ %% Description : Adds arcs between branches and calls deps_to_unsafe that adds %% arcs between branches and unsafe ops. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -cd_branch_deps(PrevBr,PrevUnsafe,N,Ty,DAG) -> +cd_branch_deps(PrevBr, PrevUnsafe, N, Ty, DAG) -> DAG1 = case PrevBr of none -> DAG; {Br,BrTy} -> dep_arc(Br, hipe_target_machine:br_br_latency(BrTy,Ty), - N,DAG) + N, DAG) end, - deps_to_unsafe(PrevUnsafe,N,Ty,DAG1). + deps_to_unsafe(PrevUnsafe, N, Ty, DAG1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function : deps_to_unsafe %% Description : Adds dependencies between unsafe's and branches %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -deps_to_unsafe([],_,_,DAG) -> DAG; -deps_to_unsafe([{M,UTy}|Us],N,Ty,DAG) -> +deps_to_unsafe([], _, _, DAG) -> DAG; +deps_to_unsafe([{M,UTy}|Us], N, Ty, DAG) -> deps_to_unsafe(Us,N,Ty, - dep_arc(M,hipe_target_machine:unsafe_to_br_latency(UTy,Ty), - N,DAG)). + dep_arc(M, hipe_target_machine:unsafe_to_br_latency(UTy,Ty), + N, DAG)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Function : cd_unsafe_deps diff -Nru erlang-13.b.1-dfsg/lib/hipe/opt/hipe_spillmin_color.erl erlang-13.b.3-dfsg/lib/hipe/opt/hipe_spillmin_color.erl --- erlang-13.b.1-dfsg/lib/hipe/opt/hipe_spillmin_color.erl 2009-04-16 10:24:21.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/opt/hipe_spillmin_color.erl 2009-11-20 13:32:09.000000000 +0000 @@ -345,10 +345,10 @@ decrement_each([], Low, IG, _Vis, _K) -> {Low, IG}; decrement_each([N|Ns], OldLow, IG, Vis, K) -> - {Low, CurrIG} = decrement_each(Ns, OldLow, IG, Vis, K), + {Low, CurrIG} = Res = decrement_each(Ns, OldLow, IG, Vis, K), case is_visited(N, Vis) of true -> - {Low, CurrIG}; + Res; false -> {D, NewIG} = decrement_degree(N, CurrIG), if diff -Nru erlang-13.b.1-dfsg/lib/hipe/opt/hipe_spillmin_scan.erl erlang-13.b.3-dfsg/lib/hipe/opt/hipe_spillmin_scan.erl --- erlang-13.b.1-dfsg/lib/hipe/opt/hipe_spillmin_scan.erl 2009-04-16 10:24:21.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/opt/hipe_spillmin_scan.erl 2009-11-20 13:32:09.000000000 +0000 @@ -272,26 +272,26 @@ %% list instead. %% %% --------------------------------------------------------------------- -expire_old_intervals([Active|Actives], CurrentPos, Free, Target) -> +expire_old_intervals([Act|Acts] = AllActives, CurrentPos, Free, Target) -> %% Does the live-range of the first active register end before %% the current position? %% We expand multimove before regalloc, ignore the next 2 lines. %% %% We don't free registers that end at the current position, %% %% since a multimove can decide to do the moves in another order... - case active_endpoint(Active) =< CurrentPos of + case active_endpoint(Act) =< CurrentPos of true -> %% Yes -> Then we can free that register. - Spillslot = active_spillslot(Active), + Spillslot = active_spillslot(Act), %% Add the spillslot to the free pool. NewFree = [Spillslot|Free], %% Here we could try appending the register to get a more %% widespread use of registers. - %% Free ++ [active_spillslot(Active)]); - expire_old_intervals(Actives, CurrentPos, NewFree, Target); + %% Free ++ [active_spillslot(Act)]); + expire_old_intervals(Acts, CurrentPos, NewFree, Target); false -> %% No -> Then we cannot free any more temporaries. %% (Since they are sorted on endpoints...) - {[Active|Actives], Free} + {AllActives, Free} end; expire_old_intervals([], _, Free, _) -> {[], Free}. @@ -434,31 +434,19 @@ extend_interval(Pos, {Beginning, End}) -> %% If this position occurs before the beginning of the interval, %% then extend the beginning to this position. - NewBeginning = - if Pos < Beginning -> Pos; - true -> Beginning - end, + NewBeginning = erlang:min(Pos, Beginning), %% If this position occurs after the end of the interval, then %% extend the end to this position. - NewEnd = - if Pos > End -> Pos; - true -> End - end, + NewEnd = erlang:max(Pos, End), {NewBeginning, NewEnd}. extend_def_interval(Pos, {Beginning, End}) -> %% If this position occurs before the beginning of the interval, %% then extend the beginning to this position. - NewBeginning = - if Pos < Beginning -> Pos; - true -> Beginning - end, + NewBeginning = erlang:min(Pos, Beginning), %% If this position occurs after the end of the interval, then %% extend the end to this position. - NewEnd = - if Pos > End -> Pos; - true -> End - end, + NewEnd = erlang:max(Pos, End), {NewBeginning, NewEnd}; extend_def_interval(Pos, [{Beginning, none}|More]) -> [{Pos,none}, {Beginning, none}|More]; @@ -524,7 +512,7 @@ end, %% Add or update the extended interval. Intervals2 = hipe_vectors:set(Intervals, Temp, NewInterval), - %% Add the rest of teh temporaries. + %% Add the rest of the temporaries. add_def_point(Temps, Pos, Intervals2); add_def_point([], _, I) -> %% No more to add return the interval. @@ -534,16 +522,10 @@ when is_integer(Beginning), is_integer(End) -> %% If this position occurs before the beginning of the interval, %% then extend the beginning to this position. - NewBeginning = - if Pos < Beginning -> Pos; - true -> Beginning - end, + NewBeginning = erlang:min(Pos, Beginning), %% If this position occurs after the end of the interval, then %% extend the end to this position. - NewEnd = - if Pos > End -> Pos; - true -> End - end, + NewEnd = erlang:max(Pos, End), {NewBeginning, NewEnd}. -endif. %% gb_intervals diff -Nru erlang-13.b.1-dfsg/lib/hipe/opt/Makefile erlang-13.b.3-dfsg/lib/hipe/opt/Makefile --- erlang-13.b.1-dfsg/lib/hipe/opt/Makefile 2009-04-16 10:24:03.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/opt/Makefile 2009-11-20 13:31:22.000000000 +0000 @@ -60,6 +60,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += +warn_exported_vars +warn_missing_spec +warn_untyped_record # ---------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_assemble.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_assemble.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_assemble.erl 2009-04-16 10:24:16.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_assemble.erl 2009-11-20 13:31:47.000000000 +0000 @@ -126,8 +126,8 @@ #label{} -> do_label(I); #load{} -> do_load(I); #loadx{} -> do_loadx(I); - #mcrxr{} -> do_mcrxr(I); #mfspr{} -> do_mfspr(I); + #mtcr{} -> do_mtcr(I); #mtspr{} -> do_mtspr(I); %% pseudo_bc: eliminated before assembly %% pseudo_call: eliminated before assembly @@ -225,15 +225,17 @@ NewBase2 = do_reg(Base2), [{LdxOp, {NewDst,NewBase1,NewBase2}, I}]. -do_mcrxr(I) -> - [{mcrxr, {{crf,7}}, I}]. - do_mfspr(I) -> #mfspr{dst=Dst,spr=SPR} = I, NewDst = do_reg(Dst), NewSPR = do_spr(SPR), [{mfspr, {NewDst,NewSPR}, I}]. +do_mtcr(I) -> + #mtcr{src=Src} = I, + NewSrc = do_reg(Src), + [{mtcrf, {{crm,16#80},NewSrc}, I}]. + do_mtspr(I) -> #mtspr{spr=SPR,src=Src} = I, NewSPR = do_spr(SPR), @@ -345,8 +347,9 @@ do_spr(SPR) -> SPR_NR = case SPR of - lr -> 8; - ctr -> 9 + 'xer' -> 1; + 'lr' -> 8; + 'ctr' -> 9 end, {spr,SPR_NR}. diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_defuse.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_defuse.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_defuse.erl 2009-03-12 12:20:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_defuse.erl 2009-11-20 13:31:47.000000000 +0000 @@ -69,6 +69,7 @@ #cmp{src1=Src1,src2=Src2} -> addsrc(Src2, [Src1]); #load{base=Base} -> [Base]; #loadx{base1=Base1,base2=Base2} -> addtemp(Base1, [Base2]); + #mtcr{src=Src} -> [Src]; #mtspr{src=Src} -> [Src]; #pseudo_call{sdesc=#ppc_sdesc{arity=Arity}} -> arity_use_gpr(Arity); #pseudo_move{src=Src} -> [Src]; diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_encode.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_encode.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_encode.erl 2009-06-05 13:53:33.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_encode.erl 2009-11-20 13:31:48.000000000 +0000 @@ -18,7 +18,7 @@ %%% %CopyrightEnd% %%% %%% Encode symbolic PowerPC instructions to binary form. -%%% Copyright (C) 2003-2005 Mikael Pettersson +%%% Copyright (C) 2003-2005, 2009 Mikael Pettersson %%% %%% Notes: %%% - PowerPC manuals use reversed bit numbering. In a 32-bit word, @@ -252,7 +252,7 @@ %%% cmp, cmpl %%% fcmpo, fcmpu %%% mcrfs -%%% mcrxr +%%% mcrxr (obsolete) %%% mtfsfi %%% tw %%% td (64-bit) @@ -447,8 +447,8 @@ mcrfs({{crf,CRFD}, {crf,CRFS}}) -> x_form(10#63, CRFD bsl 2, CRFS bsl 2, 0, 10#64, 0). -mcrxr({{crf,CRFD}}) -> - x_form(10#31, CRFD bsl 2, 0, 0, 10#512, 0). +%% mcrxr({{crf,CRFD}}) -> +%% x_form(10#31, CRFD bsl 2, 0, 0, 10#512, 0). mtfsfi_Rc({{crf,CRFD}, {crimm,IMM}}, Rc) -> x_form(10#63, CRFD bsl 2, 0, IMM bsl 1, 10#134, Rc). @@ -856,7 +856,7 @@ 'lwzux' -> lwzux(Opnds); 'lwzx' -> lwzx(Opnds); 'mcrfs' -> mcrfs(Opnds); - 'mcrxr' -> mcrxr(Opnds); + %% 'mcrxr' -> mcrxr(Opnds); 'mfcr' -> mfcr(Opnds); 'mffs' -> mffs_Rc(Opnds, 0); 'mffs.' -> mffs_Rc(Opnds, 1); @@ -1305,7 +1305,7 @@ t(OS,'lwzux',{R14,R10,R11}), t(OS,'lwzx',{R14,R10,R11}), t(OS,'mcrfs',{CR7,CR5}), - t(OS,'mcrxr',{CR7}), + %% t(OS,'mcrxr',{CR7}), t(OS,'mfcr',{R14}), t(OS,'mffs',{F2}), t(OS,'mffs.',{F2}), diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc.erl 2009-03-12 12:20:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc.erl 2009-11-20 13:31:47.000000000 +0000 @@ -74,10 +74,10 @@ mk_load/6, ldop_to_ldxop/1, - mk_mcrxr/0, - mk_mfspr/2, + mk_mtcr/1, + mk_mtspr/2, mk_pseudo_bc/4, @@ -290,10 +290,10 @@ 'new' -> mk_new_temp('untagged') end. -mk_mcrxr() -> #mcrxr{}. - mk_mfspr(Dst, Spr) -> #mfspr{dst=Dst, spr=Spr}. +mk_mtcr(Src) -> #mtcr{src=Src}. + mk_mtspr(Spr, Src) -> #mtspr{spr=Spr, src=Src}. mk_pseudo_bc(BCond, TrueLab, FalseLab, Pred) -> diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_frame.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_frame.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_frame.erl 2009-06-05 13:53:33.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_frame.erl 2009-09-18 15:08:47.000000000 +0100 @@ -561,10 +561,7 @@ %%% Check if an operand is a pseudo-Temp. src_is_pseudo(Src) -> - case hipe_ppc:is_temp(Src) of - true -> temp_is_pseudo(Src); - _ -> false - end. + hipe_ppc:is_temp(Src) andalso temp_is_pseudo(Src). temp_is_pseudo(Temp) -> not(hipe_ppc:temp_is_precoloured(Temp)). diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc.hrl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc.hrl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc.hrl 2009-04-16 10:24:16.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc.hrl 2009-11-20 13:31:47.000000000 +0000 @@ -69,7 +69,7 @@ %%% fun ::= mfa | prim %%% func ::= mfa | prim | 'ctr' %%% -%%% spr ::= ctr | lr +%%% spr ::= ctr | lr | xer %%% Instructions: @@ -86,9 +86,9 @@ -record(label, {label}). -record(load, {ldop, dst, disp, base}). % non-indexed, non-update form -record(loadx, {ldxop, dst, base1, base2}). % indexed, non-update form --record(mcrxr, {}). % for clearing OV and SO in XER --record(mfspr, {dst, spr}). % for reading LR --record(mtspr, {spr, src}). % for writing LR and CTR +-record(mfspr, {dst, spr}). % for reading LR and XER +-record(mtcr, {src}). % for copying XER[CA] to CR0[EQ] via a temp +-record(mtspr, {spr, src}). % for writing LR, CTR, and XER -record(pseudo_bc, {bcond, true_label, false_label, pred}). -record(pseudo_call, {func, sdesc, contlab, linkage}). -record(pseudo_call_prepare, {nrstkargs}). @@ -109,6 +109,10 @@ %%% Function definitions. --record(defun, {mfa :: mfa(), formals, code, data, - isclosure :: bool(), isleaf :: bool(), +-include("../misc/hipe_consttab.hrl"). + +-record(defun, {mfa :: mfa(), formals, code, + data :: hipe_consttab(), + isclosure :: boolean(), + isleaf :: boolean(), var_range, label_range}). diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_pp.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_pp.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_pp.erl 2009-03-12 12:20:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_pp.erl 2009-11-20 13:31:48.000000000 +0000 @@ -110,12 +110,14 @@ io:format(Dev, ", ", []), pp_temp(Dev, Base2), io:format(Dev, "\n", []); - #mcrxr{} -> - io:format(Dev, "\tmcrxr crf7\n", []); #mfspr{dst=Dst, spr=SPR} -> io:format(Dev, "\tmf~w ", [spr_name(SPR)]), pp_temp(Dev, Dst), io:format(Dev, "\n", []); + #mtcr{src=Src} -> + io:format(Dev, "\tmtcrf 0x80, ", []), + pp_temp(Dev, Src), + io:format(Dev, "\n", []); #mtspr{spr=SPR, src=Src} -> io:format(Dev, "\tmt~w ", [spr_name(SPR)]), pp_temp(Dev, Src), diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_ra_finalise.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_ra_finalise.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_ra_finalise.erl 2009-03-12 12:20:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_ra_finalise.erl 2009-11-20 13:31:48.000000000 +0000 @@ -42,6 +42,7 @@ #load{} -> ra_load(I, Map); #loadx{} -> ra_loadx(I, Map); #mfspr{} -> ra_mfspr(I, Map); + #mtcr{} -> ra_mtcr(I, Map); #mtspr{} -> ra_mtspr(I, Map); #pseudo_li{} -> ra_pseudo_li(I, Map); #pseudo_move{} -> ra_pseudo_move(I, Map); @@ -85,6 +86,10 @@ NewDst = ra_temp(Dst, Map), I#mfspr{dst=NewDst}. +ra_mtcr(I=#mtcr{src=Src}, Map) -> + NewSrc = ra_temp(Src, Map), + I#mtcr{src=NewSrc}. + ra_mtspr(I=#mtspr{src=Src}, Map) -> NewSrc = ra_temp(Src, Map), I#mtspr{src=NewSrc}. diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_ra_postconditions.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_ra_postconditions.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_ra_postconditions.erl 2009-03-12 12:21:08.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_ra_postconditions.erl 2009-11-20 13:31:55.000000000 +0000 @@ -19,7 +19,9 @@ %% -module(hipe_ppc_ra_postconditions). + -export([check_and_rewrite/3, check_and_rewrite2/3]). + -include("hipe_ppc.hrl"). check_and_rewrite(Defun, Coloring, Allocator) -> @@ -54,6 +56,7 @@ #load{} -> do_load(I, TempMap, Strategy); #loadx{} -> do_loadx(I, TempMap, Strategy); #mfspr{} -> do_mfspr(I, TempMap, Strategy); + #mtcr{} -> do_mtcr(I, TempMap, Strategy); #mtspr{} -> do_mtspr(I, TempMap, Strategy); #pseudo_li{} -> do_pseudo_li(I, TempMap, Strategy); #pseudo_move{} -> do_pseudo_move(I, TempMap, Strategy); @@ -100,6 +103,11 @@ NewI = I#mfspr{dst=NewDst}, {[NewI | FixDst], DidSpill}. +do_mtcr(I=#mtcr{src=Src}, TempMap, Strategy) -> + {FixSrc,NewSrc,DidSpill} = fix_src1(Src, TempMap, Strategy), + NewI = I#mtcr{src=NewSrc}, + {FixSrc ++ [NewI], DidSpill}. + do_mtspr(I=#mtspr{src=Src}, TempMap, Strategy) -> {FixSrc,NewSrc,DidSpill} = fix_src1(Src, TempMap, Strategy), NewI = I#mtspr{src=NewSrc}, @@ -221,10 +229,7 @@ case hipe_ppc:temp_is_allocatable(Temp) of true -> Reg = hipe_ppc:temp_reg(Temp), - case tuple_size(TempMap) > Reg of - true -> hipe_temp_map:is_spilled(Reg, TempMap); - false -> false - end; + tuple_size(TempMap) > Reg andalso hipe_temp_map:is_spilled(Reg, TempMap); false -> true end. diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_ra_postconditions_fp.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_ra_postconditions_fp.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_ra_postconditions_fp.erl 2009-03-12 12:21:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_ra_postconditions_fp.erl 2009-09-18 15:08:57.000000000 +0100 @@ -99,9 +99,7 @@ case temp_is_spilled(Src, TempMap) of true -> NewSrc = clone(Src), - {[hipe_ppc:mk_pseudo_fmove(NewSrc, Src)], - NewSrc, - true}; + {[hipe_ppc:mk_pseudo_fmove(NewSrc, Src)], NewSrc, true}; _ -> {[], Src, false} end. @@ -110,9 +108,7 @@ case temp_is_spilled(Dst, TempMap) of true -> NewDst = clone(Dst), - {[hipe_ppc:mk_pseudo_fmove(Dst, NewDst)], - NewDst, - true}; + {[hipe_ppc:mk_pseudo_fmove(Dst, NewDst)], NewDst, true}; _ -> {[], Dst, false} end. @@ -123,10 +119,7 @@ case hipe_ppc:temp_is_allocatable(Temp) of true -> Reg = hipe_ppc:temp_reg(Temp), - case tuple_size(TempMap) > Reg of - true -> hipe_temp_map:is_spilled(Reg, TempMap); - false -> false - end; + tuple_size(TempMap) > Reg andalso hipe_temp_map:is_spilled(Reg, TempMap); false -> true end. diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_registers.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_registers.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_ppc_registers.erl 2009-03-12 12:20:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_ppc_registers.erl 2009-09-18 15:08:47.000000000 +0100 @@ -166,8 +166,7 @@ nr_args() -> ?PPC_NR_ARG_REGS. args(Arity) when is_integer(Arity) -> - Max = ?PPC_NR_ARG_REGS, - N = if Arity > Max -> Max; true -> Arity end, + N = erlang:min(Arity, ?PPC_NR_ARG_REGS), args(N-1, []). args(I, Rest) when is_integer(I), I < 0 -> Rest; diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_rtl_to_ppc.erl erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_rtl_to_ppc.erl --- erlang-13.b.1-dfsg/lib/hipe/ppc/hipe_rtl_to_ppc.erl 2009-03-12 12:20:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/hipe_rtl_to_ppc.erl 2009-11-20 13:31:48.000000000 +0000 @@ -402,15 +402,61 @@ {Dst, Map0} = conv_dst(hipe_rtl:alub_dst(I), Map), {Src1, Map1} = conv_src(hipe_rtl:alub_src1(I), Map0), {Src2, Map2} = conv_src(hipe_rtl:alub_src2(I), Map1), - BCond = conv_alub_cond(hipe_rtl:alub_cond(I)), - I2 = mk_pseudo_bc(BCond, + {AluOp, BCond} = + case {hipe_rtl:alub_op(I), hipe_rtl:alub_cond(I)} of + {'add', 'ltu'} -> + {'addc', 'eq'}; + {RtlAlubOp, RtlAlubCond} -> + {conv_alub_op(RtlAlubOp), conv_alub_cond(RtlAlubCond)} + end, + BC = mk_pseudo_bc(BCond, hipe_rtl:alub_true_label(I), hipe_rtl:alub_false_label(I), hipe_rtl:alub_pred(I)), - RtlAluOp = hipe_rtl:alub_op(I), - I1 = mk_alub(Dst, Src1, RtlAluOp, Src2, BCond), + I2 = + case {AluOp, BCond} of + {'addc', 'eq'} -> % copy XER[CA] to CR0[EQ] before the BC + TmpR = new_untagged_temp(), + [hipe_ppc:mk_mfspr(TmpR, 'xer'), + hipe_ppc:mk_mtcr(TmpR) | + BC]; + _ -> BC + end, + {NewSrc1, NewSrc2} = + case AluOp of + 'subf' -> {Src2, Src1}; + _ -> {Src1, Src2} + end, + I1 = mk_alub(Dst, NewSrc1, AluOp, NewSrc2, BCond), {I1 ++ I2, Map2, Data}. +conv_alub_op(RtlAluOp) -> + case RtlAluOp of + 'add' -> 'add'; + 'sub' -> 'subf'; % XXX: must swap operands + 'mul' -> 'mullw'; + 'or' -> 'or'; + 'and' -> 'and'; + 'xor' -> 'xor'; + 'sll' -> 'slw'; + 'srl' -> 'srw'; + 'sra' -> 'sraw' + end. + +aluop_commutes(AluOp) -> + case AluOp of + 'add' -> true; + 'addc' -> true; + 'subf' -> false; + 'mullw' -> true; + 'or' -> true; + 'and' -> true; + 'xor' -> true; + 'slw' -> false; + 'srw' -> false; + 'sraw' -> false + end. + conv_alub_cond(Cond) -> % only signed case Cond of eq -> 'eq'; @@ -424,63 +470,65 @@ _ -> exit({?MODULE,conv_alub_cond,Cond}) end. -mk_alub(Dst, Src1, RtlAluOp, Src2, BCond) -> +mk_alub(Dst, Src1, AluOp, Src2, BCond) -> case hipe_ppc:is_temp(Src1) of true -> case hipe_ppc:is_temp(Src2) of true -> - mk_alub_rr(Dst, Src1, RtlAluOp, Src2, BCond); + mk_alub_rr(Dst, Src1, AluOp, Src2, BCond); _ -> - mk_alub_ri(Dst, Src1, RtlAluOp, Src2, BCond) + mk_alub_ri(Dst, Src1, AluOp, Src2, BCond) end; _ -> case hipe_ppc:is_temp(Src2) of true -> - mk_alub_ir(Dst, Src1, RtlAluOp, Src2, BCond); + mk_alub_ir(Dst, Src1, AluOp, Src2, BCond); _ -> - mk_alub_ii(Dst, Src1, RtlAluOp, Src2, BCond) + mk_alub_ii(Dst, Src1, AluOp, Src2, BCond) end end. -mk_alub_ii(Dst, Src1, RtlAluOp, Src2, BCond) -> +mk_alub_ii(Dst, Src1, AluOp, Src2, BCond) -> io:format("~w: RTL alub with two immediates\n", [?MODULE]), Tmp = new_untagged_temp(), mk_li(Tmp, Src1, - mk_alub_ri(Dst, Tmp, RtlAluOp, Src2, BCond)). + mk_alub_ri(Dst, Tmp, AluOp, Src2, BCond)). -mk_alub_ir(Dst, Src1, RtlAluOp, Src2, BCond) -> - case rtl_aluop_commutes(RtlAluOp) of +mk_alub_ir(Dst, Src1, AluOp, Src2, BCond) -> + case aluop_commutes(AluOp) of true -> - mk_alub_ri(Dst, Src2, RtlAluOp, Src1, BCond); + mk_alub_ri(Dst, Src2, AluOp, Src1, BCond); _ -> Tmp = new_untagged_temp(), mk_li(Tmp, Src1, - mk_alub_rr(Dst, Tmp, RtlAluOp, Src2, BCond)) + mk_alub_rr(Dst, Tmp, AluOp, Src2, BCond)) end. -mk_alub_ri(Dst, Src1, RtlAluOp, Src2, BCond) -> +mk_alub_ri(Dst, Src1, AluOp, Src2, BCond) -> true = is_integer(Src2), case BCond of - 'so' -> mk_alub_ri_OE(Dst, Src1, RtlAluOp, Src2); - 'ns' -> mk_alub_ri_OE(Dst, Src1, RtlAluOp, Src2); - _ -> mk_alub_ri_Rc(Dst, Src1, RtlAluOp, Src2) + 'so' -> mk_alub_ri_OE(Dst, Src1, AluOp, Src2); + 'ns' -> mk_alub_ri_OE(Dst, Src1, AluOp, Src2); + _ -> mk_alub_ri_Rc(Dst, Src1, AluOp, Src2) end. -mk_alub_ri_OE(Dst, Src1, RtlAluOp, Src2) -> - %% Only 'add', 'sub', and 'mul' apply here, and 'sub' becomes 'add'. - %% 'add' and 'mul' have no immediate+Rc+OE forms. +mk_alub_ri_OE(Dst, Src1, AluOp, Src2) -> + %% Only 'add', 'subf', and 'mullw' apply here, and 'subf' becomes 'add'. + %% 'add' and 'mullw' have no immediate+Rc+OE forms. %% Rewrite to reg/reg form. Sigh. Tmp = new_untagged_temp(), mk_li(Tmp, Src2, - mk_alub_rr_OE(Dst, Src1, RtlAluOp, Tmp)). + mk_alub_rr_OE(Dst, Src1, AluOp, Tmp)). -mk_alub_ri_Rc(Dst, Src1, RtlAluOp, Src2) -> - case RtlAluOp of - 'sub' -> % there is no 'subi.' - mk_alub_ri_Rc_addi(Dst, Src1, -Src2); +mk_alub_ri_Rc(Dst, Src1, AluOp, Src2) -> + case AluOp of + 'subf' -> % there is no 'subfi.', use 'addic.' or 'add.' + mk_alub_ri_Rc_addi(Dst, Src1, -Src2, 'addic.', 'add.'); 'add' -> % 'addic.' has a 16-bit simm operand - mk_alub_ri_Rc_addi(Dst, Src1, Src2); - 'mul' -> % there is no 'mulli.' + mk_alub_ri_Rc_addi(Dst, Src1, Src2, 'addic.', 'add.'); + 'addc' -> % 'addic' has a 16-bit simm operand + mk_alub_ri_Rc_addi(Dst, Src1, Src2, 'addic', 'addc'); + 'mullw' -> % there is no 'mulli.' mk_alub_ri_Rc_rr(Dst, Src1, 'mullw.', Src2); 'or' -> % there is no 'ori.' mk_alub_ri_Rc_rr(Dst, Src1, 'or.', Src2); @@ -494,15 +542,15 @@ mk_alub_ri_Rc_andi(Dst, Src1, Src2) end; _ -> % shift ops have 5-bit uimm operands - mk_alub_ri_Rc_shift(Dst, Src1, RtlAluOp, Src2) + mk_alub_ri_Rc_shift(Dst, Src1, AluOp, Src2) end. -mk_alub_ri_Rc_addi(Dst, Src1, Src2) -> +mk_alub_ri_Rc_addi(Dst, Src1, Src2, AddImmOp, AddRegOp) -> if is_integer(Src2), -32768 =< Src2, Src2 < 32768 -> - [hipe_ppc:mk_alu('addic.', Dst, Src1, + [hipe_ppc:mk_alu(AddImmOp, Dst, Src1, hipe_ppc:mk_simm16(Src2))]; true -> - mk_alub_ri_Rc_rr(Dst, Src1, 'add.', Src2) + mk_alub_ri_Rc_rr(Dst, Src1, AddRegOp, Src2) end. mk_alub_ri_Rc_andi(Dst, Src1, Src2) -> @@ -513,24 +561,24 @@ mk_alub_ri_Rc_rr(Dst, Src1, 'and.', Src2) end. -mk_alub_ri_Rc_shift(Dst, Src1, RtlAluOp, Src2) -> +mk_alub_ri_Rc_shift(Dst, Src1, AluOp, Src2) -> if Src2 < 32, Src2 >= 0 -> - AluOp = - case RtlAluOp of - 'sll' -> 'slwi.'; % alias for rlwinm. - 'srl' -> 'srwi.'; % alias for rlwinm. - 'sra' -> 'srawi.' + AluOpIDot = + case AluOp of + 'slw' -> 'slwi.'; % alias for rlwinm. + 'srw' -> 'srwi.'; % alias for rlwinm. + 'sraw' -> 'srawi.' end, - [hipe_ppc:mk_alu(AluOp, Dst, Src1, + [hipe_ppc:mk_alu(AluOpIDot, Dst, Src1, hipe_ppc:mk_uimm16(Src2))]; true -> - AluOp = - case RtlAluOp of - 'sll' -> 'slw.'; - 'srl' -> 'srw.'; - 'sra' -> 'sraw.' + AluOpDot = + case AluOp of + 'slw' -> 'slw.'; + 'srw' -> 'srw.'; + 'sraw' -> 'sraw.' end, - mk_alub_ri_Rc_rr(Dst, Src1, AluOp, Src2) + mk_alub_ri_Rc_rr(Dst, Src1, AluOpDot, Src2) end. mk_alub_ri_Rc_rr(Dst, Src1, AluOp, Src2) -> @@ -538,43 +586,38 @@ mk_li(Tmp, Src2, [hipe_ppc:mk_alu(AluOp, Dst, Src1, Tmp)]). -mk_alub_rr(Dst, Src1, RtlAluOp, Src2, BCond) -> +mk_alub_rr(Dst, Src1, AluOp, Src2, BCond) -> case BCond of - 'so' -> mk_alub_rr_OE(Dst, Src1, RtlAluOp, Src2); - 'ns' -> mk_alub_rr_OE(Dst, Src1, RtlAluOp, Src2); - _ -> mk_alub_rr_Rc(Dst, Src1, RtlAluOp, Src2) - end. - -mk_alub_rr_OE(Dst, Src1, RtlAluOp, Src2) -> - case RtlAluOp of - 'sub' -> % PPC weirdness - [hipe_ppc:mk_alu('subfo.', Dst, Src2, Src1)]; - 'add' -> - [hipe_ppc:mk_alu('addo.', Dst, Src1, Src2)]; - 'mul' -> - [hipe_ppc:mk_alu('mullwo.', Dst, Src1, Src2)] - %% fail for or, and, xor, sll, srl, sra - end. - -mk_alub_rr_Rc(Dst, Src1, RtlAluOp, Src2) -> - %% XXX: identical to mk_alu_rr/4, except for the '.' in the instruction names - case RtlAluOp of - 'sub' -> % PPC weirdness - [hipe_ppc:mk_alu('subf.', Dst, Src2, Src1)]; - _ -> - AluOp = - case RtlAluOp of - 'add' -> 'add.'; - 'mul' -> 'mullw.'; - 'or' -> 'or.'; - 'and' -> 'and.'; - 'xor' -> 'xor.'; - 'sll' -> 'slw.'; - 'srl' -> 'srw.'; - 'sra' -> 'sraw.' - end, - [hipe_ppc:mk_alu(AluOp, Dst, Src1, Src2)] - end. + 'so' -> mk_alub_rr_OE(Dst, Src1, AluOp, Src2); + 'ns' -> mk_alub_rr_OE(Dst, Src1, AluOp, Src2); + _ -> mk_alub_rr_Rc(Dst, Src1, AluOp, Src2) + end. + +mk_alub_rr_OE(Dst, Src1, AluOp, Src2) -> + AluOpODot = + case AluOp of + 'subf' -> 'subfo.'; + 'add' -> 'addo.'; + 'mullw' -> 'mullwo.' + %% fail for addc, or, and, xor, slw, srw, sraw + end, + [hipe_ppc:mk_alu(AluOpODot, Dst, Src1, Src2)]. + +mk_alub_rr_Rc(Dst, Src1, AluOp, Src2) -> + AluOpDot = + case AluOp of + 'subf' -> 'subf.'; + 'add' -> 'add.'; + 'addc' -> 'addc'; % only interested in CA, no Rc needed + 'mullw' -> 'mullw.'; + 'or' -> 'or.'; + 'and' -> 'and.'; + 'xor' -> 'xor.'; + 'slw' -> 'slw.'; + 'srw' -> 'srw.'; + 'sraw' -> 'sraw.' + end, + [hipe_ppc:mk_alu(AluOpDot, Dst, Src1, Src2)]. conv_branch(I, Map, Data) -> %% = src1 - src2; if COND goto label @@ -995,16 +1038,20 @@ case BCond of 'so' -> NewTrueLabel = hipe_gensym:get_next_label(ppc), + ZeroR = new_untagged_temp(), [hipe_ppc:mk_pseudo_bc(BCond, NewTrueLabel, FalseLabel, Pred), - hipe_ppc:mk_label(NewTrueLabel), - hipe_ppc:mk_mcrxr(), - hipe_ppc:mk_b_label(TrueLabel)]; + hipe_ppc:mk_label(NewTrueLabel) | + mk_li(ZeroR, 0, + [hipe_ppc:mk_mtspr('xer', ZeroR), + hipe_ppc:mk_b_label(TrueLabel)])]; 'ns' -> NewFalseLabel = hipe_gensym:get_next_label(ppc), + ZeroR = new_untagged_temp(), [hipe_ppc:mk_pseudo_bc(BCond, TrueLabel, NewFalseLabel, Pred), - hipe_ppc:mk_label(NewFalseLabel), - hipe_ppc:mk_mcrxr(), - hipe_ppc:mk_b_label(FalseLabel)]; + hipe_ppc:mk_label(NewFalseLabel) | + mk_li(ZeroR, 0, + [hipe_ppc:mk_mtspr('xer', ZeroR), + hipe_ppc:mk_b_label(FalseLabel)])]; _ -> [hipe_ppc:mk_pseudo_bc(BCond, TrueLabel, FalseLabel, Pred)] end. diff -Nru erlang-13.b.1-dfsg/lib/hipe/ppc/Makefile erlang-13.b.3-dfsg/lib/hipe/ppc/Makefile --- erlang-13.b.1-dfsg/lib/hipe/ppc/Makefile 2009-04-16 10:24:16.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/ppc/Makefile 2009-11-20 13:31:46.000000000 +0000 @@ -72,6 +72,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += +warn_exported_vars # ---------------------------------------------------- @@ -114,4 +117,4 @@ $(EBIN)/hipe_ppc_registers.beam: ../rtl/hipe_literals.hrl $(EBIN)/hipe_rtl_to_ppc.beam: ../rtl/hipe_rtl.hrl -$(TARGET_FILES): hipe_ppc.hrl +$(TARGET_FILES): hipe_ppc.hrl ../misc/hipe_consttab.hrl diff -Nru erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_amd64_specific_sse2.erl erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_amd64_specific_sse2.erl --- erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_amd64_specific_sse2.erl 2009-03-12 12:21:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_amd64_specific_sse2.erl 2009-09-18 15:08:49.000000000 +0100 @@ -162,19 +162,8 @@ true -> Src = hipe_x86:fmove_src(Instruction), Dst = hipe_x86:fmove_dst(Instruction), - case hipe_x86:is_temp(Src) of - true -> - case hipe_x86:temp_is_allocatable(Src) of - true -> - case hipe_x86:is_temp(Dst) of - true -> - hipe_x86:temp_is_allocatable(Dst); - false -> false - end; - false -> false - end; - false -> false - end; + hipe_x86:is_temp(Src) andalso hipe_x86:temp_is_allocatable(Src) + andalso hipe_x86:is_temp(Dst) andalso hipe_x86:temp_is_allocatable(Dst); false -> false end. @@ -183,4 +172,4 @@ -spec new_spill_index(non_neg_integer()) -> pos_integer(). new_spill_index(SpillIndex) when is_integer(SpillIndex) -> - SpillIndex+1. + SpillIndex + 1. diff -Nru erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_coalescing_regalloc.erl erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_coalescing_regalloc.erl --- erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_coalescing_regalloc.erl 2009-06-05 13:53:23.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_coalescing_regalloc.erl 2009-09-18 15:08:21.000000000 +0100 @@ -515,12 +515,12 @@ initAlias(NrNodes) -> {alias, hipe_bifs:array(NrNodes, [])}. -getAlias(Node, {alias,AliasMap}) -> +getAlias(Node, {alias, AliasMap} = Alias) -> case hipe_bifs:array_sub(AliasMap, Node) of [] -> Node; AliasNode -> - getAlias(AliasNode, {alias,AliasMap}) + getAlias(AliasNode, Alias) end. setAlias(Node, AliasNode, {alias, AliasMap} = Alias) -> diff -Nru erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_graph_coloring_regalloc.erl erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_graph_coloring_regalloc.erl --- erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_graph_coloring_regalloc.erl 2009-03-12 12:20:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_graph_coloring_regalloc.erl 2009-11-20 13:31:26.000000000 +0000 @@ -286,7 +286,6 @@ Vis = visit_all(PreC, none_visited(NumNodes)), Vis1 = visit_all(NotAllocatable, Vis), ActualNumNodes = (NumNodes-length(PreC))-length(NotAllocatable), - %% Make sure that the registers that must not be spilled %% get a degree less than K by spilling other regs. {Stk2, Ix2, Vis2, Low2} = @@ -297,24 +296,23 @@ handle_non_spill([], _IG, _Spill, _K, Ix, Stk, Vis, Low, _SpillLimit, _Target) -> {Stk, Ix, Vis, Low}; -handle_non_spill([X|Xs], IG, Spill, K, Ix, Stk, Vis, Low, SpillLimit, Target) -> +handle_non_spill([X|Xs] = L, IG, Spill, K, Ix, Stk, Vis, Low, SpillLimit, Target) -> Info = hipe_vectors:get(IG, X), Degree = degree(Info), - ?report("Can't Spill ~w with degree ~w\n",[X,Degree]), + ?report("Can't Spill ~w with degree ~w\n", [X,Degree]), if Degree > K -> - ?report(" *** spill required (N<~w)***~n",[SpillLimit]), + ?report(" *** spill required (N<~w)***~n", [SpillLimit]), {Y, NewLow, NewIG} = spill(IG, Vis, Spill, K, SpillLimit, Target), NewVis = visit(Y,Vis), {NewStk, NewIx} = push_spill_node(Y, Ix, Stk), ?report(" node ~w spilled~n", [Y]), - handle_non_spill([X|Xs], NewIG, Spill, K, NewIx, NewStk, NewVis, - Low ++ NewLow, - SpillLimit, Target); + handle_non_spill(L, NewIG, Spill, K, NewIx, NewStk, NewVis, + Low ++ NewLow, SpillLimit, Target); true -> {NewLow, NewIG} = decrement_neighbors(X, Low, IG, Vis, K), - ?report(" node ~w pushed\n(~w now ready)~n",[X,NewLow]), + ?report(" node ~w pushed\n(~w now ready)~n", [X,NewLow]), NewStk = push_colored(X, Stk), - handle_non_spill(Xs, NewIG, Spill, K, Ix, NewStk, visit(X,Vis), + handle_non_spill(Xs, NewIG, Spill, K, Ix, NewStk, visit(X,Vis), NewLow, SpillLimit, Target) end. @@ -359,10 +357,10 @@ decrement_each([], Low, IG, _Vis, _K) -> {Low, IG}; decrement_each([N|Ns], OldLow, IG, Vis, K) -> - {Low, CurrIG} = decrement_each(Ns, OldLow, IG, Vis, K), + {Low, CurrIG} = Res = decrement_each(Ns, OldLow, IG, Vis, K), case is_visited(N, Vis) of true -> - {Low, CurrIG}; + Res; false -> {D, NewIG} = decrement_degree(N, CurrIG), if @@ -793,9 +791,9 @@ precolor(Xs, Cols, Target) -> ?report("precoloring ~p~n", [Xs]), - {Cs,NewCol} = precolor0(Xs, Cols, Target), - ?report(" yielded ~p~n", [Cs]), - {Cs,NewCol}. + {_Cs, _NewCol} = Res = precolor0(Xs, Cols, Target), + ?report(" yielded ~p~n", [_Cs]), + Res. precolor0([], Cols, _Target) -> {[], Cols}; diff -Nru erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_ig.erl erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_ig.erl --- erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_ig.erl 2009-06-05 13:53:23.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_ig.erl 2009-09-18 15:08:22.000000000 +0100 @@ -291,7 +291,7 @@ %% Function: adj_set, adj_list, degree, spill_costs %% %% Description: Selector functions. Used to get one of the encapsulated -%% data-structure contained in the IG structure. +%% data-structure contained in the IG structure. %% Parameters: %% IG -- An interference graph %% @@ -314,7 +314,7 @@ %% Function: set_adj_set, set_adj_list, set_degree, set_spill_costs %% %% Description: Modifier functions. Used to set one of the encapsulated -%% data-structure contained in the IG structure. +%% data-structure contained in the IG structure. %% Parameters: %% Data-structure -- Data-structure you want to set. An adj_set %% data-structure for example. @@ -383,8 +383,8 @@ %% Function: analyze_bbs %% %% Description: Looks up the code that exists in all basic blocks and -%% analyse instructions use and def's to see what -%% temporaries that interfere with each other. +%% analyse instructions use and def's to see what +%% temporaries that interfere with each other. %% %% Parameters: %% L -- A label @@ -424,15 +424,15 @@ %% Function: analyze_bb_instructions %% %% Description: Analyzes all instructions that is contained in a basic -%% block in reverse order. +%% block in reverse order. %% %% Parameters: -%% Instruction -- An instruction -%% Instructions -- The remaining instructions -%% Live -- All temporaries that are live at the time. -%% Live is a set of temporary "numbers only". -%% IG -- The interference graph in it's current state -%% Target -- The mopdule containing the target-specific functions +%% Instruction -- An instruction +%% Instructions -- The remaining instructions +%% Live -- All temporaries that are live at the time. +%% Live is a set of temporary "numbers only". +%% IG -- The interference graph in it's current state +%% Target -- The mopdule containing the target-specific functions %% %% Returns: %% Live -- Temporaries that are live at entery of basic block @@ -489,9 +489,9 @@ %% Function: analyze_move %% %% Description: If a move instructions is discovered, this function is -%% called. It is used to remember what move instructions -%% a temporary is associated with and all moves that exists -%% in the CFG. +%% called. It is used to remember what move instructions +%% a temporary is associated with and all moves that exists +%% in the CFG. %% %% Parameters: %% Instruction -- An instruction @@ -525,13 +525,13 @@ %% Function: interfere %% %% Description: A number of temporaries that are defined interfere with -%% everything in the current live set. +%% everything in the current live set. %% %% Parameters: -%% Define -- A Define temporary -%% Defines -- Rest of temporaries. -%% Live -- Current live set -%% IG -- An interference graph +%% Define -- A Define temporary +%% Defines -- Rest of temporaries. +%% Live -- Current live set +%% IG -- An interference graph %% %% Returns: %% An updated interference graph. @@ -546,15 +546,14 @@ %% Function: interfere_with_living %% %% Description: Let one temporary that is in the define set interfere -%% with all live temporaries. +%% with all live temporaries. %% %% Parameters: -%% Define -- A Define temporary -%% Live -- Current live set -%% Lives -- Rest of living temporaries. -%% IG -- An interference graph -%% Target -- The module containing the target-specific -%% functions +%% Define -- A Define temporary +%% Live -- Current live set +%% Lives -- Rest of living temporaries. +%% IG -- An interference graph +%% Target -- The module containing the target-specific functions %% Returns: %% An updated interference graph %%---------------------------------------------------------------------- @@ -568,7 +567,7 @@ %% nodes_are_adjacent(U, V, IG) %% returns true if nodes U and V are adjacent in interference graph IG %% --spec nodes_are_adjacent(integer(), integer(), #igraph{}) -> bool(). +-spec nodes_are_adjacent(integer(), integer(), #igraph{}) -> boolean(). nodes_are_adjacent(U, V, IG) -> adjset_are_adjacent(U, V, adj_set(IG)). @@ -616,15 +615,14 @@ %% Function: add_edge %% %% Description: Adds an edge to the adj_set data structure if it is -%% not already a part of it and if U is not precoloured -%% we add V to its adj_list. If V is not precoloured -%% we add U to its adj_list. +%% not already a part of it and if U is not precoloured +%% we add V to its adj_list. If V is not precoloured +%% we add U to its adj_list. %% %% Parameters: -%% U -- A temporary number -%% V -- A temporary number -%% Target -- The module containing the target-specific -%% functions +%% U -- A temporary number +%% V -- A temporary number +%% Target -- The module containing the target-specific functions %% Returns: %% An updated interference graph. %%---------------------------------------------------------------------- @@ -635,7 +633,7 @@ true -> IG; false -> - adjset_add_edge(U, V, adj_set(IG)), + _ = adjset_add_edge(U, V, adj_set(IG)), Degree = degree(IG), AdjList0 = interfere_if_uncolored(U, V, adj_list(IG), Degree, Target), AdjList1 = interfere_if_uncolored(V, U, AdjList0, Degree, Target), @@ -646,15 +644,14 @@ %% Function: remove_edge %% %% Description: Removes an edge to the adj_set data-structure if it's -%% a part of it and if U is not precoloured -%% we remove V from it's adj_list. If V is not precoloured -%% we remove U from it's adj_list. +%% a part of it and if U is not precoloured +%% we remove V from it's adj_list. If V is not precoloured +%% we remove U from it's adj_list. %% %% Parameters: -%% U -- A temporary number -%% V -- A temporary number -%% Target -- The module containing the target-specific -%% functions +%% U -- A temporary number +%% V -- A temporary number +%% Target -- The module containing the target-specific functions %% Returns: %% An updated interference graph. %%---------------------------------------------------------------------- @@ -665,7 +662,7 @@ false -> IG; true -> - adjset_remove_edge(U, V, adj_set(IG)), + _ = adjset_remove_edge(U, V, adj_set(IG)), Degree = degree(IG), AdjList0 = remove_if_uncolored(U, V, adj_list(IG), Degree, Target), AdjList1 = remove_if_uncolored(V, U, AdjList0, Degree, Target), @@ -693,13 +690,11 @@ %% Degree -- An updated degree data structure (via side-effects) %%---------------------------------------------------------------------- -remove_if_uncolored(Temporary, Interfere_temporary, Adj_list, Degree, - Target) -> - case Target:is_precoloured(Temporary) of +remove_if_uncolored(Temp, InterfereTemp, Adj_list, Degree, Target) -> + case Target:is_precoloured(Temp) of false -> - New_adj_list = hipe_adj_list:remove_edge(Temporary, Interfere_temporary, - Adj_list), - degree_dec(Temporary, Degree), + New_adj_list = hipe_adj_list:remove_edge(Temp, InterfereTemp, Adj_list), + degree_dec(Temp, Degree), New_adj_list; true -> Adj_list @@ -726,13 +721,11 @@ %% Degree -- An updated degree data structure (via side-effects) %%---------------------------------------------------------------------- -interfere_if_uncolored(Temporary, Interfere_temporary, Adj_list, Degree, - Target) -> - case Target:is_precoloured(Temporary) of +interfere_if_uncolored(Temp, InterfereTemp, Adj_list, Degree, Target) -> + case Target:is_precoloured(Temp) of false -> - New_adj_list = hipe_adj_list:add_edge(Temporary, Interfere_temporary, - Adj_list), - degree_inc(Temporary, Degree), + New_adj_list = hipe_adj_list:add_edge(Temp, InterfereTemp, Adj_list), + degree_inc(Temp, Degree), New_adj_list; true -> Adj_list @@ -742,11 +735,11 @@ %% Function: reg_numbers %% %% Description: Converts a list of tuple with {something, reg_number} -%% to a list of register numbers. +%% to a list of register numbers. %% %% Parameters: -%% TRs -- A list of temporary registers -%% Target -- The module containing the target-specific functions +%% TRs -- A list of temporary registers +%% Target -- The module containing the target-specific functions %% Returns: %% A list of register numbers. %%---------------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_ls_regalloc.erl erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_ls_regalloc.erl --- erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_ls_regalloc.erl 2009-04-16 10:24:08.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_ls_regalloc.erl 2009-11-20 13:31:26.000000000 +0000 @@ -56,8 +56,10 @@ -module(hipe_ls_regalloc). -export([regalloc/7]). -%-define(DEBUG,1). + +%%-define(DEBUG,1). -define(HIPE_INSTRUMENT_COMPILER, true). + -include("../main/hipe.hrl"). @@ -92,25 +94,22 @@ %% %% @end %%- - - - - - - - - - - - - - - - - - - - - - - - -regalloc(CFG,PhysRegs,Entrypoints, SpillIndex, DontSpill, Options, Target) -> - ?debug_msg("LinearScan: ~w\n",[erlang:statistics(runtime)]), +regalloc(CFG, PhysRegs, Entrypoints, SpillIndex, DontSpill, Options, Target) -> + ?debug_msg("LinearScan: ~w\n", [erlang:statistics(runtime)]), %% Step 1: Calculate liveness (Call external implementation.) Liveness = liveness(CFG, Target), - ?debug_msg("liveness (done)~w\n",[erlang:statistics(runtime)]), + ?debug_msg("liveness (done)~w\n", [erlang:statistics(runtime)]), USIntervals = calculate_intervals(CFG, Liveness, - Entrypoints, Options, - Target), - ?debug_msg("intervals (done) ~w\n",[erlang:statistics(runtime)]), + Entrypoints, Options, Target), + ?debug_msg("intervals (done) ~w\n", [erlang:statistics(runtime)]), Intervals = sort_on_start(USIntervals), - ?debug_msg("sort intervals (done) ~w\n",[erlang:statistics(runtime)]), - %% ?debug_msg("Intervals ~w\n",[Intervals]), + ?debug_msg("sort intervals (done) ~w\n", [erlang:statistics(runtime)]), + %% ?debug_msg("Intervals ~w\n", [Intervals]), ?debug_msg("No intervals: ~w\n",[length(Intervals)]), - - ?debug_msg("count intervals (done) ~w\n",[erlang:statistics(runtime)]), - Allocation = allocate(Intervals,PhysRegs, SpillIndex, DontSpill, Target), - ?debug_msg("allocation (done) ~w\n",[erlang:statistics(runtime)]), + ?debug_msg("count intervals (done) ~w\n", [erlang:statistics(runtime)]), + Allocation = allocate(Intervals, PhysRegs, SpillIndex, DontSpill, Target), + ?debug_msg("allocation (done) ~w\n", [erlang:statistics(runtime)]), Allocation. -%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -129,9 +128,7 @@ %% Add start point for the argument registers. Args = arg_vars(CFG, Target), Interval = - add_def_point(Args, 0, - empty_interval(Target:number_of_temporaries(CFG))), - + add_def_point(Args, 0, empty_interval(Target:number_of_temporaries(CFG))), %% Interval = add_livepoint(Args, 0, empty_interval()), Worklist = case proplists:get_value(ls_order, Options) of @@ -154,7 +151,6 @@ _ -> Target:reverse_postorder(CFG) end, - %% ?inc_counter(bbs_counter, length(Worklist)), %% ?debug_msg("No BBs ~w\n",[length(Worklist)]), intervals(Worklist, Interval, 1, CFG, Liveness, Target). @@ -212,8 +208,6 @@ traverse_block([], InstrNo, Intervals, _) -> %% Return the new intervals and the number of the next instruction. {Intervals,InstrNo}. -%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -334,8 +328,6 @@ %% return the result. %%io:format("~nAlloc:~n~p", [Alloc]), {Alloc, SpillIndex}. -%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% @@ -345,52 +337,46 @@ %% list instead. %% %% --------------------------------------------------------------------- -expire_old_intervals([Active|Actives], CurrentPos, Free, Target) -> +expire_old_intervals([Act|Acts] = AllActives, CurrentPos, Free, Target) -> %% Does the live-range of the first active register end before %% the current position? %% We expand multimove before regalloc, ignore the next 2 lines. %% %% We don't free registers that end at the current position, %% %% since a multimove can decide to do the moves in another order... - case active_endpoint(Active) =< CurrentPos of + case active_endpoint(Act) =< CurrentPos of true -> %% Yes -> Then we can free that register. - Reg = active_reg(Active), + Reg = active_reg(Act), %% Add the register to the free pool. NewFree = case is_arg(Reg, Target) of true -> - [{Reg,CurrentPos}|Free]; + [{Reg, CurrentPos}|Free]; false -> - [{Reg,CurrentPos}|Free] - + [{Reg, CurrentPos}|Free] %% Here we could try appending the %% register to get a more widespread %% use of registers. - %% Free ++ [active_reg(Active)]); + %% Free ++ [active_reg(Act)]); %% At the moment this does not seem to %% improve performance at all, %% on the other hand, the cost is very low. end, - - expire_old_intervals(Actives, CurrentPos, NewFree, Target); - - + expire_old_intervals(Acts, CurrentPos, NewFree, Target); false -> %% No -> Then we cannot free any more registers. %% (Since they are sorted on endpoints...) - {[Active|Actives],Free} + {AllActives, Free} end; -expire_old_intervals([],_,Free,_) -> - {[],Free}. -%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +expire_old_intervals([], _, Free, _) -> + {[], Free}. deactivate(Reg, [Active|Actives]) -> case Reg =:= active_reg(Active) of true -> {Active, Actives}; false -> - {TheActive, NewActives} = - deactivate(Reg, Actives), + {TheActive, NewActives} = deactivate(Reg, Actives), {TheActive, [Active|NewActives]} end; deactivate(_,[]) -> {no,[]}. @@ -483,7 +469,6 @@ can_spill(Name, DontSpill, Target) -> (Name < DontSpill) and (not is_precoloured(Name, Target)). -%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -495,8 +480,6 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% The "allocation datastructure" @@ -523,8 +506,6 @@ [{Name2,Binding}|spillalloc(Name,N,Bindings)]; spillalloc(Name,N,Bindings) -> [{Name,{spill,N}}|Bindings]. -%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -537,7 +518,6 @@ {[X|L],Last}. - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% The active datastructure. @@ -557,7 +537,7 @@ EndPoint. active_startpoint({_,_,_,StartPoint}) -> StartPoint. -active_name({_,_,RegName,_})-> +active_name({_,_,RegName,_}) -> RegName. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -581,9 +561,8 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% The Intervals data structure. -sort_on_start(I)-> - lists:keysort(2,I). - +sort_on_start(I) -> + lists:keysort(2, I). -ifdef(gb_intervals). empty_interval(_) -> @@ -612,19 +591,15 @@ {value, Value} -> %% ... extend it. extend_interval(Pos, Value); - %% This is the first time we see this temp... none -> %% ... create a new interval {Pos, Pos} end, - %% Add or update the extended interval. Intervals2 = gb_trees:enter(Temp, NewInterval, Intervals), - %% Add the rest of teh temporaries. add_use_point(Temps, Pos, Intervals2); - add_use_point([], _, I) -> %% No more to add return the interval. I. @@ -643,13 +618,10 @@ %% ... create a new interval {Pos, Pos} end, - %% Add or update the extended interval. Intervals2 = gb_trees:enter(Temp, NewInterval, Intervals), - %% Add the rest of the temporaries. add_def_point(Temps, Pos, Intervals2); - add_def_point([], _, I) -> %% No more to add return the interval. I. @@ -658,50 +630,13 @@ %% If this position occures before the beginning %% of the interval, then extend the beginning to %% this position. - - NewBeginning = - if Pos < Beginning -> Pos; - true -> Beginning - end, + NewBeginning = erlang:min(Pos, Beginning), %% If this position occures after the end %% of the interval, then extend the end to %% this position. - NewEnd = - if Pos > End -> Pos; - true -> End - end, - + NewEnd = erlang:max(Pos, End), {NewBeginning, NewEnd}. -%extend_use_interval(Pos, [{none,End}|More]) -> -% {[{none,Pos},{none,End}|More]}; -%extend_use_interval(Pos, Intervals) -> -% {Beginning,none} = lists:last(Intervals), -% {Beginning, Pos}. - - -% extend_def_interval(Pos, {Beginning, End}) -> -% %% If this position occures before the beginning -% %% of the interval, then extend the beginning to -% %% this position. - -% NewBeginning = -% if Pos < Beginning -> Pos; -% true -> Beginning -% end, -% %% If this position occures after the end -% %% of the interval, then extend the end to -% %% this position. -% NewEnd = -% if Pos > End -> Pos; -% true -> End -% end, -% {NewBeginning, NewEnd}; -% extend_def_interval(Pos, [{Beginning,none}|More]) -> -% [{Pos,none}, {Beginning,none}|More]; -% extend_def_interval(Pos, Intervals) -> -% {Pos, Pos}. -%% ____________________________________________________________________ -else. %% isdef gb_intervals empty_interval(N) -> @@ -725,9 +660,6 @@ flatten([],N,More) -> add_indices(More,N+1). - - - add_use_point([Temp|Temps],Pos,Intervals) -> %% Extend the old interval... NewInterval = @@ -741,13 +673,10 @@ %% ... extend it. extend_interval(Pos, Value) end, - %% Add or update the extended interval. Intervals2 = hipe_vectors:set(Intervals, Temp, NewInterval), - %% Add the rest of the temporaries. add_use_point(Temps, Pos, Intervals2); - add_use_point([], _, I) -> %% No more to add return the interval. I. @@ -765,129 +694,28 @@ %% ... extend it. extend_interval(Pos, Value) end, - %% Add or update the extended interval. Intervals2 = hipe_vectors:set(Intervals, Temp, NewInterval), - %% Add the rest of teh temporaries. add_def_point(Temps, Pos, Intervals2); - add_def_point([], _, I) -> %% No more to add return the interval. I. extend_interval(Pos, {Beginning, End}) -> - %% If this position occures before the beginning - %% of the interval, then extend the beginning to - %% this position. - - NewBeginning = - if Pos < Beginning -> Pos; - true -> Beginning - end, - + %% If this position occurs before the beginning of the interval, + %% then extend the beginning to this position. + NewBeginning = erlang:min(Pos, Beginning), %% If this position occures after the end %% of the interval, then extend the end to %% this position. - NewEnd = - if Pos > End -> Pos; - true -> End - end, - + NewEnd = erlang:max(Pos, End), {NewBeginning, NewEnd}. -%extend_use_interval(Pos, [{none,End}|More]) -> -% {[{none,Pos},{none,End}|More]}; -%extend_use_interval(Pos, Intervals) -> -% {Beginning,none} = lists:last(Intervals), -% {Beginning, Pos}. - - -%extend_def_interval(Pos, {Beginning, End}) -> -% %% If this position occures before the beginning -% %% of the interval, then extend the beginning to -% %% this position. - -% NewBeginning = -% if Pos < Beginning -> Pos; -% true -> Beginning -% end, - -% {NewBeginning, End}; -%extend_def_interval(Pos, [{Beginning,none}|More]) -> -% [{Pos,none}, {Beginning,none}|More]; -%extend_def_interval(Pos, [{none,End}|Intervals]) -> -% {End, Pos}. -endif. %% gb_intervals - - - - - - - - - - -%%linarize(I) -> -%% linarize(I,[]). - -%%linarize({R,Beg,End,Lt,Rt},Acc) -> -%% linarize(Lt,[{R,Beg,End}|linarize(Rt,Acc)]); -%%linarize([],Acc) -> Acc. - -%add_livepoint([Temp|Temps],Pos,Intervals) -> - - -% %% Extend the old interval... -% NewInterval = -% case gb_trees:lookup(Temp, Intervals) of -% %% This temp has an old interval... -% {value, Value} -> -% %% ... extend it. -% extend_interval(Pos, Value); - -% %% This is the first time we see this temp... -% none -> -% %% ... create a new interval -% {Pos, Pos} -% end, - -% %% Add or update the extended interval. -% Intervals2 = gb_trees:enter(Temp, NewInterval, Intervals), - -% %% Add the rest of teh temporaries. -% add_livepoint(Temps, Pos, Intervals2); - -%add_livepoint([], _, I) -> -% %% No more to add return the interval. -% I. - -%extend_interval(Pos, {Beginning, End}) -> -% %% If this position occures after the end -% %% of the interval, then extend the end to -% %% this position. -% NewEnd = -% if Pos > End -> Pos; -% true -> End -% end, - -% %% If this position occures before the beginning -% %% of the interval, then extend the beginning to -% %% this position. - -% NewBeginning = -% if Pos < Beginning -> Pos; -% true -> Beginning -% end, - -% {NewBeginning, NewEnd}. - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% The Freel data structure. %% -%% %%- - - - - - - - - - - - - - - - - - - - - - - - is_free(R, Free) -> @@ -900,9 +728,6 @@ is_free(_, [], _) -> false. -%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - exists_free_register(Start, Regs) -> exists_free_register(Start, Regs, []). @@ -914,15 +739,12 @@ exists_free_register(_, [], _) -> false. -%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - create_freeregs([Phys|Rest]) -> [{Phys,-1}|create_freeregs(Rest)]; create_freeregs([]) -> []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Interface to external functions. %% XXX: Make this efficient somehow... @@ -938,10 +760,10 @@ livein(Liveness,L, Target) -> regnames(Target:livein(Liveness,L), Target). -liveout(Liveness,L, Target)-> +liveout(Liveness,L, Target) -> regnames(Target:liveout(Liveness,L), Target). -uses(I, Target)-> +uses(I, Target) -> regnames(Target:uses(I), Target). defines(I, Target) -> diff -Nru erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_temp_map.erl erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_temp_map.erl --- erlang-13.b.1-dfsg/lib/hipe/regalloc/hipe_temp_map.erl 2009-04-16 10:24:08.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/regalloc/hipe_temp_map.erl 2009-09-18 15:08:30.000000000 +0100 @@ -78,7 +78,7 @@ %% %% True if temp Temp is spilled. %% --spec is_spilled(non_neg_integer(), hipe_temp_map()) -> bool(). +-spec is_spilled(non_neg_integer(), hipe_temp_map()) -> boolean(). is_spilled(Temp, Map) -> case element(Temp+1, Map) of diff -Nru erlang-13.b.1-dfsg/lib/hipe/regalloc/Makefile erlang-13.b.3-dfsg/lib/hipe/regalloc/Makefile --- erlang-13.b.1-dfsg/lib/hipe/regalloc/Makefile 2009-04-16 10:24:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/regalloc/Makefile 2009-11-20 13:31:23.000000000 +0000 @@ -73,7 +73,10 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- -ERL_COMPILE_FLAGS += + +include ../native.mk + +ERL_COMPILE_FLAGS += +warn_exported_vars# +warn_missing_spec +warn_untyped_record # ---------------------------------------------------- # Targets @@ -109,9 +112,12 @@ $(EBIN)/hipe_amd64_specific.beam: hipe_x86_specific.erl $(EBIN)/hipe_amd64_specific_x87.beam: hipe_x86_specific_x87.erl -$(EBIN)/hipe_optimistic_regalloc.beam: ../main/hipe.hrl $(EBIN)/hipe_coalescing_regalloc.beam: ../main/hipe.hrl $(EBIN)/hipe_graph_coloring_regalloc.beam: ../main/hipe.hrl +$(EBIN)/hipe_ig.beam: ../main/hipe.hrl ../flow/cfg.hrl hipe_spillcost.hrl +$(EBIN)/hipe_ig_moves.beam: ../util/hipe_vectors.hrl $(EBIN)/hipe_ls_regalloc.beam: ../main/hipe.hrl -$(EBIN)/hipe_temp_map.beam: ../main/hipe.hrl +$(EBIN)/hipe_optimistic_regalloc.beam: ../main/hipe.hrl $(EBIN)/hipe_regalloc_loop.beam: ../main/hipe.hrl +$(EBIN)/hipe_spillcost.beam: hipe_spillcost.hrl +$(EBIN)/hipe_temp_map.beam: ../main/hipe.hrl diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_icode2rtl.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_icode2rtl.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_icode2rtl.erl 2009-03-12 12:20:09.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_icode2rtl.erl 2009-09-18 15:08:22.000000000 +0100 @@ -68,10 +68,7 @@ %% Translate Icode instructions to RTL instructions ?opt_start_timer("Icode to nested RTL"), {Code, _VarMap1, ConstTab1} = - translate_instrs(Icode, - VarMap, - ConstTab, - Options), + translate_instrs(Icode, VarMap, ConstTab, Options), ?opt_stop_timer("Icode to nested RTL"), %% We build the code as list of lists of... %% in order to avoid appends. diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_arch.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_arch.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_arch.erl 2009-04-16 10:24:07.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_arch.erl 2009-09-18 15:08:28.000000000 +0100 @@ -196,7 +196,7 @@ hipe_amd64_registers:reg_name(Reg) end. -%% @spec is_precoloured(rtl_arg()) -> bool() +%% @spec is_precoloured(rtl_arg()) -> boolean() %% %% @doc Succeeds if Arg is mapped to a precoloured register in the target. %% @@ -205,12 +205,8 @@ true -> is_precolored_regnum(hipe_rtl:reg_index(Arg)); false -> - case hipe_rtl:is_var(Arg) of - true -> - is_precolored_regnum(hipe_rtl:var_index(Arg)); - false -> - false - end + hipe_rtl:is_var(Arg) andalso + is_precolored_regnum(hipe_rtl:var_index(Arg)) end. is_precolored_regnum(RegNum) -> diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_arith.inc erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_arith.inc --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_arith.inc 2009-03-12 12:20:59.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_arith.inc 2009-09-18 15:08:48.000000000 +0100 @@ -119,7 +119,7 @@ %% there are cases where we can evaluate a subset of the bits, but can %% not do a full eval-alub call (eg. a + 0 gives no carry) %% --spec eval_cond_bits(atom(), bool(), bool(), bool(), bool()) -> bool(). +-spec eval_cond_bits(atom(), boolean(), boolean(), boolean(), boolean()) -> boolean(). eval_cond_bits(Cond, N, Z, V, C) -> case Cond of diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_binary_match.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_binary_match.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_binary_match.erl 2009-04-16 10:24:29.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_binary_match.erl 2009-11-20 13:32:30.000000000 +0000 @@ -197,7 +197,7 @@ gen_rtl({bs_test_tail, NumBits}, [NewMs], [Ms], TrueLblName, FalseLblName) -> {[Offset,BinSize], ExCode} = extract_matchstate_vars([offset,binsize], Ms), update_ms(NewMs, Ms) ++ ExCode ++ - [hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(NumBits)), + [add_to_offset(Offset, Offset, hipe_rtl:mk_imm(NumBits), FalseLblName), hipe_rtl:mk_branch(Offset, eq, BinSize, TrueLblName, FalseLblName)]; gen_rtl({bs_test_unit, Unit}, [], [Ms], TrueLblName, FalseLblName) -> {[Offset,BinSize], ExCode} = extract_matchstate_vars([offset,binsize], Ms), @@ -208,7 +208,7 @@ gen_rtl({bs_test_tail, NumBits}, [], [Ms], TrueLblName, FalseLblName) -> {[Offset,BinSize], ExCode} = extract_matchstate_vars([offset,binsize], Ms), ExCode ++ - [hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(NumBits)), + [add_to_offset(Offset, Offset, hipe_rtl:mk_imm(NumBits), FalseLblName), hipe_rtl:mk_branch(Offset, eq, BinSize, TrueLblName, FalseLblName)]; gen_rtl({bs_skip_bits_all, Unit, _Flags}, Dst, [Ms], TrueLblName, FalseLblName) -> @@ -375,7 +375,7 @@ create_loops(N-1, Unit, RestString, IntFun)]. update_and_test(Reg, Unit, Offset, Value, FalseLblName) -> - [hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(Unit*?BYTE_SIZE)), + [add_to_offset(Offset, Offset, hipe_rtl:mk_imm(Unit*?BYTE_SIZE), FalseLblName), just_test(Reg, Value, FalseLblName)]. just_test(Reg, Value, FalseLblName) -> @@ -631,17 +631,22 @@ skip_bits2(Ms, NoOfBits, TrueLblName, FalseLblName) -> [NewOffset] = create_gcsafe_regs(1), - [SuccessLbl,TempLbl] = create_lbls(2), + [TempLbl] = create_lbls(1), {[Offset,BinSize], ExCode} = extract_matchstate_vars([offset,binsize], Ms), ExCode ++ - [hipe_rtl:mk_alub(NewOffset, NoOfBits, add, Offset, overflow, - FalseLblName, hipe_rtl:label_name(SuccessLbl),0.01), - SuccessLbl, - hipe_rtl:mk_branch(BinSize, lt, NewOffset, FalseLblName, - hipe_rtl:label_name(TempLbl), 0.01), - TempLbl, - update_offset(NewOffset,Ms), - hipe_rtl:mk_goto(TrueLblName)]. + add_to_offset(NewOffset, NoOfBits, Offset, FalseLblName) ++ + [hipe_rtl:mk_branch(BinSize, 'ltu', NewOffset, FalseLblName, + hipe_rtl:label_name(TempLbl), 0.01), + TempLbl, + update_offset(NewOffset,Ms), + hipe_rtl:mk_goto(TrueLblName)]. + +add_to_offset(Result, Extra, Original, FalseLblName) -> + TrueLbl = hipe_rtl:mk_new_label(), + %% Note: 'ltu' means 'unsigned overflow'. + [hipe_rtl:mk_alub(Result, Extra, 'add', Original, 'ltu', + FalseLblName, hipe_rtl:label_name(TrueLbl)), + TrueLbl]. %%%%%%%%%%%%%%%%%%%%%%% Code for start match %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -707,7 +712,7 @@ lists:unzip([extract_matchstate_var(Name, Ms) || Name <- List]). check_size(Offset, Size, BinSize, Tmp1, ContLblName, FalseLblName) -> - [hipe_rtl:mk_alu(Tmp1, Offset, add, Size), + [add_to_offset(Tmp1, Offset, Size, FalseLblName), hipe_rtl:mk_branch(Tmp1, leu, BinSize, ContLblName, FalseLblName, 0.99)]. check_size(Offset, Size, _BinSize, Tmp1, true, ContLblName, _FalseLblName) -> @@ -1006,7 +1011,7 @@ hipe_rtl:mk_alu(Dst, Dst, 'or', Tmp1), hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(1))] end; -load_bytes(Dst, Base, Offset, {Signedness, Endianess},4) -> +load_bytes(Dst, Base, Offset, {Signedness, Endianess}, 4) -> case Endianess of big -> hipe_rtl_arch:load_big_4(Dst, Base, Offset, Signedness); diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_cfg.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_cfg.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_cfg.erl 2009-03-12 12:20:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_cfg.erl 2009-09-18 15:08:23.000000000 +0100 @@ -58,12 +58,12 @@ CFG = info_update(CFG0, hipe_rtl:rtl_info(Rtl)), take_bbs(Code, CFG). -%% @spec is_comment(hipe_rtl:rtl_instruction()) -> bool() +%% @spec is_comment(hipe_rtl:rtl_instruction()) -> boolean() %% @doc Succeeds if Instr has no effect. is_comment(Instr) -> hipe_rtl:is_comment(Instr). -%% @spec is_goto(hipe_rtl:rtl_instruction()) -> bool() +%% @spec is_goto(hipe_rtl:rtl_instruction()) -> boolean() %% @doc Succeeds if Instr is just a jump (no side-effects). is_goto(Instr) -> hipe_rtl:is_goto(Instr). diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl.erl 2009-06-05 13:53:23.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl.erl 2009-09-18 15:08:23.000000000 +0100 @@ -831,8 +831,8 @@ %% change_var_to_reg(Var) -> %% mk_reg(var_index(Var)). --record(rtl_reg, {index, % integer() - is_gc_safe}). % bool() +-record(rtl_reg, {index :: integer(), + is_gc_safe :: boolean()}). mk_reg(Num, IsGcSafe) when is_integer(Num), Num >= 0 -> #rtl_reg{index=Num,is_gc_safe=IsGcSafe}. @@ -1134,7 +1134,7 @@ subst1([{X,Y}|_], X) -> Y; subst1([_|Xs], X) -> subst1(Xs,X). -%% @spec is_safe(rtl_instruction()) -> bool() +%% @spec is_safe(rtl_instruction()) -> boolean() %% %% @doc Succeeds if an RTL instruction is safe and can be deleted if the %% result is not used. @@ -1185,7 +1185,7 @@ %% is_alu_op(sra) -> true; %% is_alu_op(_) -> false. -%% @spec is_shift_op(rtl_operator()) -> bool() +%% @spec is_shift_op(rtl_operator()) -> boolean() %% %% @doc Succeeds if its argument is an RTL operator. is_shift_op(sll) -> true; diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_lcm.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_lcm.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_lcm.erl 2009-04-16 10:24:19.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_lcm.erl 2009-11-20 13:32:03.000000000 +0000 @@ -231,29 +231,27 @@ insert_exprs(CFG, Pred, Succ, ExprMap, IdMap, BetweenMap, [ExprId|Exprs]) -> Expr = expr_id_map_get_expr(IdMap, ExprId), Instr = expr_map_get_instr(ExprMap, Expr), - Succs = hipe_rtl_cfg:succ(CFG, Pred), - case length(Succs) =:= 1 of - true -> + case hipe_rtl_cfg:succ(CFG, Pred) of + [_] -> pp_debug(" Inserted last: ", []), pp_debug_instr(Instr), NewCFG = insert_expr_last(CFG, Pred, Instr), insert_exprs(NewCFG, Pred, Succ, ExprMap, IdMap, BetweenMap, Exprs); - false -> - Preds = hipe_rtl_cfg:pred(CFG, Succ), - case length(Preds) =:= 1 of - true -> + _ -> + case hipe_rtl_cfg:pred(CFG, Succ) of + [_] -> pp_debug(" Inserted first: ", []), pp_debug_instr(Instr), NewCFG = insert_expr_first(CFG, Succ, Instr), insert_exprs(NewCFG, Pred, Succ, ExprMap, IdMap, BetweenMap, Exprs); - false -> + _ -> pp_debug(" Inserted between: ", []), pp_debug_instr(Instr), {NewCFG, NewBetweenMap} = insert_expr_between(CFG, BetweenMap, Pred, Succ, Instr), insert_exprs(NewCFG, Pred, Succ, ExprMap, IdMap, NewBetweenMap, Exprs) end - end. + end. %%============================================================================= %% Recursively goes through the code in a block and returns a new block @@ -419,10 +417,10 @@ %%============================================================================= %% Replaces destination of RTL expression with empty list. %% -expr_set_dst(I, [Dst|Dsts]) -> +expr_set_dst(I, [Dst|_Dsts] = DstList) -> case I of #alu{} -> hipe_rtl:alu_dst_update(I, Dst); - #call{} -> hipe_rtl:call_dstlist_update(I, [Dst|Dsts]); + #call{} -> hipe_rtl:call_dstlist_update(I, DstList); #fconv{} -> hipe_rtl:fconv_dst_update(I, Dst); #fixnumop{} -> hipe_rtl:fixnumop_dst_update(I, Dst); #fload{} -> hipe_rtl:fload_dst_update(I, Dst); @@ -1344,15 +1342,15 @@ case gb_trees:lookup(Expr, ExprMap) of {value, {ExprId, DefinesList, ReplRegs}} -> NewExprMap = gb_trees:update(Expr, {ExprId, - [{Label, Defines}|DefinesList], - ReplRegs}, ExprMap), + [{Label, Defines}|DefinesList], + ReplRegs}, ExprMap), mk_expr_map_bb(NewExprMap, IdMap, Label, Instrs); none -> NewExprId = new_expr_id(), NewReplRegs = mk_replacement_regs(Defines), NewExprMap = gb_trees:insert(Expr, {NewExprId, - [{Label, Defines}], - NewReplRegs}, ExprMap), + [{Label, Defines}], + NewReplRegs}, ExprMap), NewIdMap = gb_trees:insert(NewExprId, Expr, IdMap), mk_expr_map_bb(NewExprMap, NewIdMap, Label, Instrs) end; @@ -1425,12 +1423,12 @@ %% FIXME Check is_var() orelse is_reg() ? hipe_rtl:mk_move(Reg, Define) end; -mk_expr_move_instr([Reg|Regs], Defines) -> +mk_expr_move_instr([_Reg|_Regs] = RegList, Defines) -> %% FIXME Does this really work? What about floats... %% (Multiple defines does not seem to be used by any of the %% instructions considered by rtl_lcm at the moment so this is pretty much %% untested/unused.) - hipe_rtl:mk_multimove([Reg|Regs], Defines); + hipe_rtl:mk_multimove(RegList, Defines); mk_expr_move_instr(_, []) -> exit({?MODULE, mk_expr_move_instr, "bad match"}). diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_liveness.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_liveness.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_liveness.erl 2009-03-12 12:20:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_liveness.erl 2009-09-18 15:08:23.000000000 +0100 @@ -23,10 +23,10 @@ %% %% Exports: %% ~~~~~~~ -%% analyze(CFG) - returns a livenes analyzis of CFG. -%% liveout(Liveness, Label) - returns a set of variables that are alive at +%% analyze(CFG) - returns a liveness analysis of CFG. +%% liveout(Liveness, Label) - returns a set of variables that are live on %% exit from basic block named Label. -%% livein(Liveness, Label) - returns a set of variables that are alive at +%% livein(Liveness, Label) - returns a set of variables that are live on %% entry to the basic block named Label. %% list(Instructions, LiveOut) - Given a list of instructions and a liveout %% set, returns a set of variables live at the first instruction. @@ -35,7 +35,7 @@ -module(hipe_rtl_liveness). %% -define(LIVEOUT_NEEDED,true). % needed for liveness.inc below. --define(PRETTY_PRINT,true). +-define(PRETTY_PRINT,false). -include("hipe_rtl.hrl"). -include("../flow/liveness.inc"). diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_mk_switch.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_mk_switch.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_mk_switch.erl 2009-04-16 10:24:07.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_mk_switch.erl 2009-09-18 15:08:27.000000000 +0100 @@ -278,7 +278,6 @@ n_list(0,_) -> []; n_list(N,Init) -> [Init | n_list(N-1,Init)]. - %% Do the dirty work of minclusters i_loop(I,N,MinClusters,_Cases) when I > N -> MinClusters; @@ -334,27 +333,24 @@ %% The various calls to lists:reverse are just to ensure that the %% cases remain in the correct, sorted order. -cluster_split(Cases,Clust) -> +cluster_split(Cases, Clust) -> A = tl(tuple_to_list(Clust)), - Max = element(tuple_size(Clust),Clust), + Max = element(tuple_size(Clust), Clust), L1 = lists:reverse(Cases), L2 = lists:reverse(A), - cluster_split(Max,[],[],L1,L2). + cluster_split(Max, [], [], L1, L2). -cluster_split(0,[],Res,Cases,_Clust) -> +cluster_split(0, [], Res, Cases, _Clust) -> L = lists:reverse(Cases), {H,_} = hd(L), {T,_} = hd(Cases), [{dense,hipe_icode:const_value(H),hipe_icode:const_value(T),L}|Res]; - -cluster_split(N,[],Res,Cases,[N|Clust]) -> - cluster_split(N-1,[],Res,Cases,[N|Clust]); - +cluster_split(N, [], Res, Cases, [N|_] = Clust) -> + cluster_split(N-1, [], Res, Cases, Clust); cluster_split(N,Sofar,Res,Cases,[N|Clust]) -> {H,_} = hd(Sofar), {T,_} = lists:last(Sofar), cluster_split(N-1,[],[{dense,hipe_icode:const_value(H),hipe_icode:const_value(T),Sofar}|Res],Cases,[N|Clust]); - cluster_split(N,Sofar,Res,[C|Cases],[_|Clust]) -> cluster_split(N,[C|Sofar],Res,Cases,Clust). @@ -362,27 +358,21 @@ %% Merge adjacent small clusters into larger sparse clusters %% cluster_merge([C]) -> [C]; - cluster_merge([{dense,Min,Max,C}|T]) when length(C) >= ?MINFORJUMPTABLE -> C2 = cluster_merge(T), [{dense,Min,Max,C}|C2]; - cluster_merge([{sparse,Min,_,C},{sparse,_,Max,D}|T]) -> R = {sparse,Min,Max,C ++ D}, cluster_merge([R|T]); - cluster_merge([{sparse,Min,_,C},{dense,_,Max,D}|T]) when length(D) < ?MINFORJUMPTABLE -> R = {sparse,Min,Max,C ++ D}, cluster_merge([R|T]); - cluster_merge([{dense,Min,_,C},{dense,_,Max,D}|T]) when length(C) < ?MINFORJUMPTABLE, length(D) < ?MINFORJUMPTABLE -> R = {sparse,Min,Max,C ++ D}, cluster_merge([R|T]); - cluster_merge([{dense,Min,_,D},{sparse,_,Max,C}|T]) when length(D) < ?MINFORJUMPTABLE -> R = {sparse,Min,Max,C ++ D}, cluster_merge([R|T]); - cluster_merge([A,{dense,Min,Max,C}|T]) when length(C) >= ?MINFORJUMPTABLE -> R = cluster_merge([{dense,Min,Max,C}|T]), [A|R]. @@ -477,13 +467,10 @@ {Values, _Labels} = split_cases(Cases), {LabMap,VarMap1} = lbls_from_cases(Cases,VarMap), LMap = [{label,L} || L <- LabMap], - {NewConstTab,Id} = hipe_consttab:insert_sorted_block(ConstTab, Values), {NewConstTab2,LabId} = hipe_consttab:insert_sorted_block(NewConstTab, word, LMap, Values), - Code = inline_atom_search(0, length(Cases)-1, Id, LabId, Arg, Fail, LabMap), - {Code, VarMap1, NewConstTab2}. @@ -592,7 +579,7 @@ inline_atom_search(Start, End, Block, LBlock, KeyReg, Default, Labels) -> Reg = hipe_rtl:mk_new_reg_gcsafe(), - Length = (End - Start) +1, + Length = (End - Start) + 1, if Length >= 3 -> @@ -880,7 +867,7 @@ [ hipe_rtl:mk_move(IndexReg,hipe_rtl:mk_imm(0)), hipe_rtl:mk_load(Temp,TablePntrReg,hipe_rtl:mk_imm(Init)), - hipe_rtl:mk_branch(Temp, ge, KeyReg, + hipe_rtl:mk_branch(Temp, geu, KeyReg, hipe_rtl:label_name(Lab2), hipe_rtl:label_name(Lab1), 0.5), Lab1, @@ -911,7 +898,7 @@ Lab2 = hipe_rtl:mk_new_label(), [hipe_rtl:mk_alu(TempIndex, IndexReg, add, hipe_rtl:mk_imm(I)), hipe_rtl:mk_load(Temp,TablePntrReg,TempIndex), - hipe_rtl:mk_branch(Temp, gt, KeyReg, + hipe_rtl:mk_branch(Temp, gtu, KeyReg, hipe_rtl:label_name(Lab2), hipe_rtl:label_name(Lab1) , 0.5), Lab1] ++ diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_primops.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_primops.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_primops.erl 2009-04-16 10:24:07.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_primops.erl 2009-09-18 15:08:28.000000000 +0100 @@ -708,7 +708,7 @@ %% Tag the thing %% return make_fun(funp); %% -gen_mkfun([Dst], {Mod,FunId,Arity}, MagicNr, Index, FreeVars) -> +gen_mkfun([Dst], {_Mod, _FunId, _Arity} = MFidA, MagicNr, Index, FreeVars) -> {GetHPInsn, HP, PutHPInsn} = hipe_rtl_arch:heap_pointer(), NumFree = length(FreeVars), @@ -727,9 +727,7 @@ %% funp->native_code = fe->native_code; %% Increase refcount %% fe->refc++; - - SkeletonCode = gen_fun_thing_skeleton(HP, {Mod,FunId,Arity}, - NumFree, MagicNr, Index), + SkeletonCode = gen_fun_thing_skeleton(HP, MFidA, NumFree, MagicNr, Index), %% Link to the process off_heap.funs list %% funp->next = p->off_heap.funs; diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_ssapre.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_ssapre.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_rtl_ssapre.erl 2009-06-05 13:53:37.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_rtl_ssapre.erl 2009-09-18 15:09:00.000000000 +0100 @@ -376,12 +376,7 @@ true -> Src2E =:= Src2C; false -> - case Src1E =:= Src2C of - true -> - Src2E =:= Src1C; - false -> - false - end + Src1E =:= Src2C andalso Src2E =:= Src1C end end. diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_tagscheme.erl erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_tagscheme.erl --- erlang-13.b.1-dfsg/lib/hipe/rtl/hipe_tagscheme.erl 2009-04-16 10:24:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/hipe_tagscheme.erl 2009-09-18 15:08:24.000000000 +0100 @@ -137,7 +137,7 @@ %% mk_atom(X) -> (X bsl ?TAG_IMMED2_SIZE) + ?TAG_IMMED2_ATOM. mk_non_value() -> ?THE_NON_VALUE. --spec is_fixnum(integer()) -> bool(). +-spec is_fixnum(integer()) -> boolean(). is_fixnum(N) when is_integer(N) -> Bits = ?bytes_to_bits(hipe_rtl_arch:word_size()) - ?TAG_IMMED1_SIZE, (N =< ((1 bsl (Bits - 1)) - 1)) and (N >= -(1 bsl (Bits - 1))). diff -Nru erlang-13.b.1-dfsg/lib/hipe/rtl/Makefile erlang-13.b.3-dfsg/lib/hipe/rtl/Makefile --- erlang-13.b.1-dfsg/lib/hipe/rtl/Makefile 2009-04-16 10:24:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/rtl/Makefile 2009-11-20 13:31:23.000000000 +0000 @@ -72,6 +72,8 @@ # FLAGS: Please keep +inline below # ---------------------------------------------------- +include ../native.mk + ERL_COMPILE_FLAGS += +inline # ---------------------------------------------------- @@ -108,7 +110,7 @@ HIPE_MKLITERALS=$(ERL_TOP)/bin/$(TARGET)/hipe_mkliterals -hipe_literals.hrl: $(HIPE_MKLITERALS) +hipe_literals.hrl: $(HIPE_MKLITERALS) $(HIPE_MKLITERALS) -e > hipe_literals.hrl ../main/hipe.hrl: ../vsn.mk ../main/hipe.hrl.src diff -Nru erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_rtl_to_sparc.erl erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_rtl_to_sparc.erl --- erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_rtl_to_sparc.erl 2009-03-12 12:21:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_rtl_to_sparc.erl 2009-11-20 13:32:05.000000000 +0000 @@ -286,7 +286,7 @@ {Dst, Map0} = conv_dst(hipe_rtl:alub_dst(I), Map), {Src1, Map1} = conv_src(hipe_rtl:alub_src1(I), Map0), {Src2, Map2} = conv_src(hipe_rtl:alub_src2(I), Map1), - Cond = conv_alub_cond(hipe_rtl:alub_cond(I)), + Cond = conv_cond(hipe_rtl:alub_cond(I)), RtlAlubOp = hipe_rtl:alub_op(I), I2 = case RtlAlubOp of @@ -386,7 +386,7 @@ %% = src1 - src2; if COND goto label {Src1, Map0} = conv_src(hipe_rtl:branch_src1(I), Map), {Src2, Map1} = conv_src(hipe_rtl:branch_src2(I), Map0), - Cond = conv_branch_cond(hipe_rtl:branch_cond(I)), + Cond = conv_cond(hipe_rtl:branch_cond(I)), I2 = conv_branch2(Src1, Cond, Src2, I), {I2, Map1, Data}. @@ -774,31 +774,24 @@ _ -> XAluOp end. -%%% Convert an RTL ALUB condition code. +%%% Convert an RTL condition code. -conv_alub_cond(RtlAlubCond) -> % only signed - case RtlAlubCond of +conv_cond(RtlCond) -> + case RtlCond of eq -> 'e'; ne -> 'ne'; gt -> 'g'; + gtu -> 'gu'; % >u ge -> 'ge'; + geu -> 'geu'; % >=u lt -> 'l'; + ltu -> 'lu'; % 'le'; + leu -> 'leu'; % <=u overflow -> 'vs'; not_overflow -> 'vc' end. -%%% Convert an RTL BRANCH condition code. - -conv_branch_cond(RtlBCond) -> % may be unsigned - case RtlBCond of - gtu -> 'gu'; % >u - geu -> 'geu'; % >=u - ltu -> 'lu'; % 'leu'; % <=u - _ -> conv_alub_cond(RtlBCond) - end. - %%% Commute a SPARC condition code. commute_cond(Cond) -> % if x Cond y, then y commute_cond(Cond) x diff -Nru erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_sparc_frame.erl erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_sparc_frame.erl --- erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_sparc_frame.erl 2009-06-05 13:53:26.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_sparc_frame.erl 2009-09-18 15:08:32.000000000 +0100 @@ -540,10 +540,7 @@ %%% Check if an operand is a pseudo-Temp. src_is_pseudo(Src) -> - case hipe_sparc:is_temp(Src) of - true -> temp_is_pseudo(Src); - _ -> false - end. + hipe_sparc:is_temp(Src) andalso temp_is_pseudo(Src). temp_is_pseudo(Temp) -> not(hipe_sparc:temp_is_precoloured(Temp)). diff -Nru erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_sparc.hrl erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_sparc.hrl --- erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_sparc.hrl 2009-04-16 10:24:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_sparc.hrl 2009-09-18 15:08:24.000000000 +0100 @@ -107,6 +107,10 @@ %%% Function definitions. --record(defun, {mfa :: mfa(), formals, code, data, - isclosure :: bool(), isleaf :: bool(), +-include("../misc/hipe_consttab.hrl"). + +-record(defun, {mfa :: mfa(), formals, code, + data :: hipe_consttab(), + isclosure :: boolean(), + isleaf :: boolean(), var_range, label_range}). diff -Nru erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_sparc_ra_postconditions.erl erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_sparc_ra_postconditions.erl --- erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_sparc_ra_postconditions.erl 2009-03-12 12:20:29.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_sparc_ra_postconditions.erl 2009-09-18 15:08:32.000000000 +0100 @@ -19,8 +19,9 @@ %% -module(hipe_sparc_ra_postconditions). --export([check_and_rewrite/3]). --export([check_and_rewrite2/3]). + +-export([check_and_rewrite/3, check_and_rewrite2/3]). + -include("hipe_sparc.hrl"). check_and_rewrite(Defun, Coloring, Allocator) -> @@ -185,9 +186,7 @@ case temp_is_spilled(Src, TempMap) of true -> NewSrc = clone(Src, RegOpt), - {[hipe_sparc:mk_pseudo_move(Src, NewSrc)], - NewSrc, - true}; + {[hipe_sparc:mk_pseudo_move(Src, NewSrc)], NewSrc, true}; _ -> {[], Src, false} end. @@ -196,9 +195,7 @@ case temp_is_spilled(Dst, TempMap) of true -> NewDst = clone(Dst, temp1(Strategy)), - {[hipe_sparc:mk_pseudo_move(NewDst, Dst)], - NewDst, - true}; + {[hipe_sparc:mk_pseudo_move(NewDst, Dst)], NewDst, true}; _ -> {[], Dst, false} end. @@ -211,10 +208,7 @@ case hipe_sparc:temp_is_allocatable(Temp) of true -> Reg = hipe_sparc:temp_reg(Temp), - case tuple_size(TempMap) > Reg of - true -> hipe_temp_map:is_spilled(Reg, TempMap); - false -> false - end; + tuple_size(TempMap) > Reg andalso hipe_temp_map:is_spilled(Reg, TempMap); false -> true end. diff -Nru erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_sparc_ra_postconditions_fp.erl erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_sparc_ra_postconditions_fp.erl --- erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_sparc_ra_postconditions_fp.erl 2009-03-12 12:21:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_sparc_ra_postconditions_fp.erl 2009-09-18 15:09:24.000000000 +0100 @@ -19,7 +19,9 @@ %% -module(hipe_sparc_ra_postconditions_fp). + -export([check_and_rewrite/2]). + -include("hipe_sparc.hrl"). check_and_rewrite(Defun, Coloring) -> @@ -87,9 +89,7 @@ case temp_is_spilled(Src, TempMap) of true -> NewSrc = clone(Src), - {[hipe_sparc:mk_pseudo_fmove(Src, NewSrc)], - NewSrc, - true}; + {[hipe_sparc:mk_pseudo_fmove(Src, NewSrc)], NewSrc, true}; _ -> {[], Src, false} end. @@ -98,9 +98,7 @@ case temp_is_spilled(Dst, TempMap) of true -> NewDst = clone(Dst), - {[hipe_sparc:mk_pseudo_fmove(NewDst, Dst)], - NewDst, - true}; + {[hipe_sparc:mk_pseudo_fmove(NewDst, Dst)], NewDst, true}; _ -> {[], Dst, false} end. @@ -111,10 +109,7 @@ case hipe_sparc:temp_is_allocatable(Temp) of true -> Reg = hipe_sparc:temp_reg(Temp), - case tuple_size(TempMap) > Reg of - true -> hipe_temp_map:is_spilled(Reg, TempMap); - false -> false - end; + tuple_size(TempMap) > Reg andalso hipe_temp_map:is_spilled(Reg, TempMap); false -> true end. diff -Nru erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_sparc_registers.erl erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_sparc_registers.erl --- erlang-13.b.1-dfsg/lib/hipe/sparc/hipe_sparc_registers.erl 2009-03-12 12:20:11.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/sparc/hipe_sparc_registers.erl 2009-09-18 15:08:25.000000000 +0100 @@ -217,8 +217,7 @@ nr_args() -> ?SPARC_NR_ARG_REGS. args(Arity) when is_integer(Arity) -> - Max = ?SPARC_NR_ARG_REGS, - N = if Arity > Max -> Max; true -> Arity end, + N = erlang:min(Arity, ?SPARC_NR_ARG_REGS), args(N-1, []). args(I, Rest) when is_integer(I), I < 0 -> Rest; diff -Nru erlang-13.b.1-dfsg/lib/hipe/sparc/Makefile erlang-13.b.3-dfsg/lib/hipe/sparc/Makefile --- erlang-13.b.1-dfsg/lib/hipe/sparc/Makefile 2009-04-16 10:24:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/sparc/Makefile 2009-11-20 13:31:24.000000000 +0000 @@ -72,6 +72,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += +warn_exported_vars # ---------------------------------------------------- @@ -114,4 +117,4 @@ $(EBIN)/hipe_sparc_liveness_gpr.beam: ../flow/liveness.inc $(EBIN)/hipe_sparc_registers.beam: ../rtl/hipe_literals.hrl -$(TARGET_FILES): hipe_sparc.hrl +$(TARGET_FILES): hipe_sparc.hrl ../misc/hipe_consttab.hrl diff -Nru erlang-13.b.1-dfsg/lib/hipe/tools/hipe_tool.erl erlang-13.b.3-dfsg/lib/hipe/tools/hipe_tool.erl --- erlang-13.b.1-dfsg/lib/hipe/tools/hipe_tool.erl 2009-06-05 13:53:26.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/tools/hipe_tool.erl 2009-09-18 15:08:33.000000000 +0100 @@ -54,7 +54,7 @@ %%--------------------------------------------------------------------- --record(state, {win_created = false :: bool(), +-record(state, {win_created = false :: boolean(), mindex = 0 :: integer(), mod :: module(), funs = [] :: [fa()], @@ -387,7 +387,7 @@ mfas(Mod, Funs) -> [{Mod,F,A} || {F,A} <- Funs]. --spec fun_names(module(), [fa()], [fa_address()], bool()) -> string(). +-spec fun_names(module(), [fa()], [fa_address()], boolean()) -> string(). fun_names(M, Funs, NativeCode, Prof) -> [list_to_atom(atom_to_list(F) ++ "/" ++ integer_to_list(A) ++ @@ -402,7 +402,7 @@ end) || {F,A} <- Funs]. --spec in_native(atom(), arity(), [fa_address()]) -> bool(). +-spec in_native(atom(), arity(), [fa_address()]) -> boolean(). in_native(F, A, NativeCode) -> lists:any(fun({Fun,Arity,_}) -> @@ -461,7 +461,7 @@ false -> [] end. --spec is_profiled(module()) -> bool(). +-spec is_profiled(module()) -> boolean(). is_profiled(Mod) -> case hipe_bifs:call_count_get({Mod,module_info,0}) of diff -Nru erlang-13.b.1-dfsg/lib/hipe/tools/Makefile erlang-13.b.3-dfsg/lib/hipe/tools/Makefile --- erlang-13.b.1-dfsg/lib/hipe/tools/Makefile 2009-04-16 10:24:11.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/tools/Makefile 2009-11-20 13:31:30.000000000 +0000 @@ -61,6 +61,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += +warn_exported_vars +warn_missing_spec +warn_untyped_record # ---------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/hipe/util/hipe_digraph.erl erlang-13.b.3-dfsg/lib/hipe/util/hipe_digraph.erl --- erlang-13.b.1-dfsg/lib/hipe/util/hipe_digraph.erl 2009-04-16 10:24:20.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/util/hipe_digraph.erl 2009-11-20 13:32:06.000000000 +0000 @@ -34,25 +34,29 @@ -type ordset(T) :: [T]. % XXX: temporarily --include("hipe_digraph.hrl"). +-record(hipe_digraph, {edges = dict:new() :: dict(), + rev_edges = dict:new() :: dict(), + leaves = ordsets:new() :: ordset(_), % ??? + nodes = sets:new() :: set()}). + +-opaque hdg() :: #hipe_digraph{}. %%------------------------------------------------------------------------ --spec new() -> #hipe_digraph{}. +-spec new() -> hdg(). new() -> #hipe_digraph{edges = dict:new(), rev_edges = dict:new(), leaves = ordsets:new(), nodes = sets:new()}. --spec from_list([_]) -> #hipe_digraph{}. +-spec from_list([_]) -> hdg(). from_list(List) -> Edges = lists:foldl(fun({From, To}, Dict) -> Fun = fun(Set) -> ordsets:add_element(To, Set) end, dict:update(From, Fun, [To], Dict) end, - dict:new(), List), - + dict:new(), List), RevEdges = lists:foldl(fun({From, To}, Dict) -> Fun = fun(Set) -> ordsets:add_element(From, Set) @@ -66,7 +70,7 @@ #hipe_digraph{edges = Edges, rev_edges = RevEdges, leaves = [], nodes = Nodes}. --spec to_list(#hipe_digraph{}) -> [_]. +-spec to_list(hdg()) -> [_]. to_list(#hipe_digraph{edges = Edges}) -> List1 = dict:to_list(Edges), @@ -75,18 +79,18 @@ end, [], List1), lists:flatten(List2). --spec add_node(_, #hipe_digraph{}) -> #hipe_digraph{}. +-spec add_node(_, hdg()) -> hdg(). add_node(NewNode, DG = #hipe_digraph{nodes=Nodes}) -> DG#hipe_digraph{nodes = sets:add_element(NewNode, Nodes)}. --spec add_node_list([_], #hipe_digraph{}) -> #hipe_digraph{}. +-spec add_node_list([_], hdg()) -> hdg(). add_node_list(NewNodes, DG = #hipe_digraph{nodes=Nodes}) -> Set = sets:from_list(NewNodes), DG#hipe_digraph{nodes = sets:union(Set, Nodes)}. --spec add_edge(_, _, #hipe_digraph{}) -> #hipe_digraph{}. +-spec add_edge(_, _, hdg()) -> hdg(). add_edge(From, To, #hipe_digraph{edges = Edges, rev_edges = RevEdges, leaves = Leaves, nodes = Nodes}) -> @@ -102,7 +106,7 @@ %%------------------------------------------------------------------------- --spec take_indep_scc(#hipe_digraph{}) -> 'none' | {'ok', [_], #hipe_digraph{}}. +-spec take_indep_scc(hdg()) -> 'none' | {'ok', [_], hdg()}. take_indep_scc(DG = #hipe_digraph{edges = Edges, rev_edges = RevEdges, leaves = Leaves, nodes = Nodes}) -> @@ -176,7 +180,7 @@ %%--------------------------------------------------------------------- --spec reverse_preorder_sccs(#hipe_digraph{}) -> [[_]]. +-spec reverse_preorder_sccs(hdg()) -> [[_]]. reverse_preorder_sccs(DG) -> reverse_preorder_sccs(DG, []). @@ -189,7 +193,7 @@ %%--------------------------------------------------------------------- --spec get_parents(_, #hipe_digraph{}) -> [_]. +-spec get_parents(_, hdg()) -> [_]. get_parents(Node, #hipe_digraph{rev_edges = RevEdges}) -> case dict:is_key(Node, RevEdges) of @@ -197,7 +201,7 @@ false -> [] end. --spec get_children(_, #hipe_digraph{}) -> [_]. +-spec get_children(_, hdg()) -> [_]. get_children(Node, #hipe_digraph{edges = Edges}) -> case dict:is_key(Node, Edges) of diff -Nru erlang-13.b.1-dfsg/lib/hipe/util/hipe_digraph.hrl erlang-13.b.3-dfsg/lib/hipe/util/hipe_digraph.hrl --- erlang-13.b.1-dfsg/lib/hipe/util/hipe_digraph.hrl 2009-03-12 12:21:50.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/util/hipe_digraph.hrl 1970-01-01 01:00:00.000000000 +0100 @@ -1,33 +0,0 @@ -%% -*- erlang-indent-level: 2 -*- -%% -%% %CopyrightBegin% -%% -%% Copyright Ericsson AB 2008-2009. All Rights Reserved. -%% -%% The contents of this file are subject to the Erlang Public License, -%% Version 1.1, (the "License"); you may not use this file except in -%% compliance with the License. You should have received a copy of the -%% Erlang Public License along with this software. If not, it can be -%% retrieved online at http://www.erlang.org/. -%% -%% Software distributed under the License is distributed on an "AS IS" -%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See -%% the License for the specific language governing rights and limitations -%% under the License. -%% -%% %CopyrightEnd% -%% -%%----------------------------------------------------------------------- -%% File : hipe_digraph.hrl -%% Author : Kostis Sagonas -%% Description : Record for a simple implementation of a directed graph. -%% -%% Created : 22 Mar 2005 by Kostis Sagonas -%%----------------------------------------------------------------------- - --record(hipe_digraph, {edges = dict:new() :: dict(), - rev_edges = dict:new() :: dict(), - leaves = ordsets:new() :: ordset(_), % ??? - nodes = sets:new() :: set()}). - -%%----------------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/hipe/util/hipe_dot.erl erlang-13.b.3-dfsg/lib/hipe/util/hipe_dot.erl --- erlang-13.b.1-dfsg/lib/hipe/util/hipe_dot.erl 2009-03-12 12:21:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/util/hipe_dot.erl 2009-09-18 15:08:57.000000000 +0100 @@ -129,7 +129,7 @@ edge_format(Opt, Fun, V1, V2) -> OptText = - case lists:flatten(edgeoptions(Opt, Fun ,V1, V2)) of + case lists:flatten(edgeoptions(Opt, Fun ,V1, V2)) of [] -> []; [_|X] -> @@ -140,18 +140,14 @@ [String, " [", OptText, "];\n"]. calc_dim(String) -> - calc_dim(String, 1, 0 ,0). + calc_dim(String, 1, 0, 0). -calc_dim([$\\, $n|T], H, TmpW, MaxW) -> - if TmpW > MaxW -> calc_dim(T, H+1, 0, TmpW); - true -> calc_dim(T, H+1, 0, MaxW) - end; +calc_dim("\\n" ++ T, H, TmpW, MaxW) -> + calc_dim(T, H+1, 0, erlang:max(TmpW, MaxW)); calc_dim([_|T], H, TmpW, MaxW) -> calc_dim(T, H, TmpW+1, MaxW); calc_dim([], H, TmpW, MaxW) -> - if TmpW > MaxW -> {TmpW, H}; - true -> {MaxW, H} - end. + {erlang:max(TmpW, MaxW), H}. edgeoptions([{all_edges, {OptName, OptVal}}|T], Fun, V1, V2) -> case legal_edgeoption(OptName) of diff -Nru erlang-13.b.1-dfsg/lib/hipe/util/hipe_timing.erl erlang-13.b.3-dfsg/lib/hipe/util/hipe_timing.erl --- erlang-13.b.1-dfsg/lib/hipe/util/hipe_timing.erl 2009-03-12 12:20:12.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/util/hipe_timing.erl 2009-09-18 15:08:25.000000000 +0100 @@ -44,7 +44,7 @@ undefined -> []; Ts -> Ts end, - Space = lists:duplicate(length(Timers), $|), + Space = [$| || _ <- Timers], Total = start_timer(), put(hipe_timers, [Total|Timers]), ?msg("[@~7w]" ++ Space ++ "> ~s~n", [Total,Text]). @@ -55,10 +55,9 @@ {Total,_Last} = erlang:statistics(runtime), case get(hipe_timers) of [StartTime|Timers] -> - Space = lists:duplicate(length(Timers),$|), + Space = [$| || _ <- Timers], put(hipe_timers,Timers), - ?msg("[@~7w]" ++ Space ++ "< ~s: ~w~n", - [Total, Text, Total-StartTime]); + ?msg("[@~7w]" ++ Space ++ "< ~s: ~w~n", [Total, Text, Total-StartTime]); _ -> put(hipe_timers, []), ?msg("[@~7w]< ~s: ~w~n", [Total, Text, Total]) @@ -97,22 +96,22 @@ -spec start_timer() -> non_neg_integer(). start_timer() -> - {Total,_Last} = erlang:statistics(runtime), + {Total, _Last} = erlang:statistics(runtime), Total. %% stop_timer(T) -> -%% {Total,_Last} = erlang:statistics(runtime), +%% {Total, _Last} = erlang:statistics(runtime), %% Total - T. %% %% start_hipe_timer(Timer) -> %% Time = erlang:statistics(runtime), -%% put({hipe_timer,Timer},Time). +%% put({hipe_timer,Timer}, Time). %% %% stop_hipe_timer(Timer) -> -%% {T2,_ } = erlang:statistics(runtime), +%% {T2, _} = erlang:statistics(runtime), %% T1 = %% case get({hipe_timer,Timer}) of -%% {T0,_} -> T0; +%% {T0, _} -> T0; %% _ -> 0 %% end, %% AccT = @@ -128,5 +127,5 @@ %% _ -> 0 %% end. %% -%% set_hipe_timer_val(Timer, Val)-> +%% set_hipe_timer_val(Timer, Val) -> %% put(Timer, Val). diff -Nru erlang-13.b.1-dfsg/lib/hipe/util/Makefile erlang-13.b.3-dfsg/lib/hipe/util/Makefile --- erlang-13.b.1-dfsg/lib/hipe/util/Makefile 2009-04-16 10:24:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/util/Makefile 2009-11-20 13:31:24.000000000 +0000 @@ -65,6 +65,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += +warn_exported_vars +warn_missing_spec +warn_untyped_record # ---------------------------------------------------- @@ -102,6 +105,5 @@ release_docs_spec: -$(EBIN)/hipe_digraph.beam: hipe_digraph.hrl $(EBIN)/hipe_timing.beam: ../main/hipe.hrl $(EBIN)/hipe_vectors.beam: hipe_vectors.hrl diff -Nru erlang-13.b.1-dfsg/lib/hipe/vsn.mk erlang-13.b.3-dfsg/lib/hipe/vsn.mk --- erlang-13.b.1-dfsg/lib/hipe/vsn.mk 2009-06-05 13:53:21.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/vsn.mk 2009-11-20 13:31:20.000000000 +0000 @@ -1 +1 @@ -HIPE_VSN = 3.7.2 +HIPE_VSN = 3.7.4 diff -Nru erlang-13.b.1-dfsg/lib/hipe/x86/hipe_x86.hrl erlang-13.b.3-dfsg/lib/hipe/x86/hipe_x86.hrl --- erlang-13.b.1-dfsg/lib/hipe/x86/hipe_x86.hrl 2009-04-16 10:24:06.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/x86/hipe_x86.hrl 2009-09-18 15:08:26.000000000 +0100 @@ -107,6 +107,10 @@ %%% Function definitions. --record(defun, {mfa :: mfa(), formals, code, data, - isclosure :: bool(), isleaf :: bool(), +-include("../misc/hipe_consttab.hrl"). + +-record(defun, {mfa :: mfa(), formals, code, + data :: hipe_consttab(), + isclosure :: boolean(), + isleaf :: boolean(), var_range, label_range}). diff -Nru erlang-13.b.1-dfsg/lib/hipe/x86/hipe_x86_ra_postconditions.erl erlang-13.b.3-dfsg/lib/hipe/x86/hipe_x86_ra_postconditions.erl --- erlang-13.b.1-dfsg/lib/hipe/x86/hipe_x86_ra_postconditions.erl 2009-04-16 10:24:08.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/x86/hipe_x86_ra_postconditions.erl 2009-09-18 15:08:30.000000000 +0100 @@ -31,6 +31,7 @@ -endif. -module(?HIPE_X86_RA_POSTCONDITIONS). + -export([check_and_rewrite/3]). -include("../x86/hipe_x86.hrl"). diff -Nru erlang-13.b.1-dfsg/lib/hipe/x86/hipe_x86_registers.erl erlang-13.b.3-dfsg/lib/hipe/x86/hipe_x86_registers.erl --- erlang-13.b.1-dfsg/lib/hipe/x86/hipe_x86_registers.erl 2009-03-12 12:20:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/hipe/x86/hipe_x86_registers.erl 2009-09-18 15:08:26.000000000 +0100 @@ -201,8 +201,7 @@ end. args(Arity) when is_integer(Arity), Arity >= 0 -> - Max = ?X86_NR_ARG_REGS, - N = if Arity > Max -> Max; true -> Arity end, + N = erlang:min(Arity, ?X86_NR_ARG_REGS), args(N-1, []). args(I, Rest) when I < 0 -> Rest; diff -Nru erlang-13.b.1-dfsg/lib/hipe/x86/Makefile erlang-13.b.3-dfsg/lib/hipe/x86/Makefile --- erlang-13.b.1-dfsg/lib/hipe/x86/Makefile 2009-04-16 10:24:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/hipe/x86/Makefile 2009-11-20 13:31:24.000000000 +0000 @@ -80,6 +80,9 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- + +include ../native.mk + ERL_COMPILE_FLAGS += +warn_exported_vars # ---------------------------------------------------- @@ -128,4 +131,4 @@ $(EBIN)/hipe_x86_spill_restore.beam: ../main/hipe.hrl ../flow/cfg.hrl $(EBIN)/hipe_x86_x87.beam: ../main/hipe.hrl -$(TARGET_FILES): hipe_x86.hrl +$(TARGET_FILES): hipe_x86.hrl ../misc/hipe_consttab.hrl diff -Nru erlang-13.b.1-dfsg/lib/ic/c_src/Makefile.in erlang-13.b.3-dfsg/lib/ic/c_src/Makefile.in --- erlang-13.b.1-dfsg/lib/ic/c_src/Makefile.in 2009-03-12 12:28:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/c_src/Makefile.in 2009-09-18 15:12:29.000000000 +0100 @@ -68,7 +68,7 @@ endif else AR_OUT = rcv -CC_FLAGS = +CC_FLAGS = @DED_CFLAGS@ LIBRARY = $(LIBDIR)/libic.a SKIP_BUILDING_BINARIES := false endif diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/book.xml erlang-13.b.3-dfsg/lib/ic/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/book.xml 2009-03-12 12:28:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/book.xml 2009-11-20 13:36:18.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19982009 @@ -21,7 +21,7 @@ - IC Application + ic 1998-09-29 @@ -30,31 +30,19 @@
    - IC Application + ic - - - - - - - - - - - - - - - - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ch_basic_idl.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ch_basic_idl.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ch_basic_idl.xml 2009-03-12 12:31:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ch_basic_idl.xml 2009-11-20 13:37:18.000000000 +0000 @@ -26,6 +26,7 @@ 2002-07-15 + ch_basic_idl.xml
    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ch_c_client.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ch_c_client.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ch_c_client.xml 2009-03-12 12:28:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ch_c_client.xml 2009-11-20 13:36:21.000000000 +0000 @@ -26,6 +26,7 @@ 2004-01-14 C + ch_c_client.xml
    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ch_c_corba_env.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ch_c_corba_env.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ch_c_corba_env.xml 2009-03-12 12:28:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ch_c_corba_env.xml 2009-11-20 13:36:21.000000000 +0000 @@ -26,6 +26,7 @@ 2003-12-15 PC1 + ch_c_corba_env.xml

    This chapter describes the CORBA_Environment C structure.

    @@ -53,7 +54,7 @@ int _outbufsz; /* Pointer to always dynamically allocated buffer for output */ char *_outbuf; - /* Size of memory chunks in bytes, used for increasing the outpuy + /* Size of memory chunks in bytes, used for increasing the output buffer, set to >= 32, should be around >= 1024 for performance reasons */ int _memchunk; diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ch_c_mapping.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ch_c_mapping.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ch_c_mapping.xml 2009-03-12 12:28:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ch_c_mapping.xml 2009-11-20 13:36:19.000000000 +0000 @@ -26,6 +26,7 @@ 2002-08-06 PB1 + ch_c_mapping.xml
    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ch_c_server.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ch_c_server.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ch_c_server.xml 2009-03-12 12:28:46.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ch_c_server.xml 2009-11-20 13:36:21.000000000 +0000 @@ -26,6 +26,7 @@ 2004-01-14 C + ch_c_server.xml
    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ch_erl_genserv.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ch_erl_genserv.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ch_erl_genserv.xml 2009-03-12 12:28:46.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ch_erl_genserv.xml 2009-11-20 13:36:21.000000000 +0000 @@ -26,6 +26,7 @@ 98-08-06 B + ch_erl_genserver.xml
    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ch_erl_plain.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ch_erl_plain.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ch_erl_plain.xml 2009-03-12 12:28:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ch_erl_plain.xml 2009-11-20 13:36:20.000000000 +0000 @@ -26,6 +26,7 @@ 98-05-06 B + ch_erl_plain.xml
    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ch_ic_protocol.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ch_ic_protocol.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ch_ic_protocol.xml 2007-11-26 13:10:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ch_ic_protocol.xml 2009-11-20 13:37:28.000000000 +0000 @@ -4,23 +4,21 @@
    - 2003 - 2007 - Ericsson AB, All Rights Reserved + 20032009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + IC Protocol @@ -28,6 +26,7 @@ 2003-12-11 PA1 + ch_ic_protocol.xml

    The purpose of this chapter is to explain the bits and bytes of the IC protocol, which is a composition of the Erlang distribution protocol diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ch_introduction.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ch_introduction.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ch_introduction.xml 2009-03-12 12:28:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ch_introduction.xml 2009-11-20 13:36:20.000000000 +0000 @@ -26,6 +26,7 @@ 2002-08-02 PB1 + ch_introduction.xml

    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ch_java.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ch_java.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ch_java.xml 2009-03-12 12:29:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ch_java.xml 2009-11-20 13:36:31.000000000 +0000 @@ -26,6 +26,7 @@ 98-09-24 A + ch_java.xml
    @@ -233,7 +234,7 @@ Communication Toolbox

    The generated client and server stubs use the classes defined in the jinterface package to communicate - whith other nodes. + with other nodes. The most important classes are :

    @@ -447,7 +448,7 @@

    The big difference between Term and Any is the use of guard methods instead of TypeCode to determine the data included in the Term. This is especially true when the Term's value class cannot be - determinated at compilation time. The guard methods found in Term :

    + determined at compilation time. The guard methods found in Term :

    boolean isAtom() returns true if the Term is an OtpErlangAtom, false otherwise

    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/CORBA_Environment_alloc.xml erlang-13.b.3-dfsg/lib/ic/doc/src/CORBA_Environment_alloc.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/CORBA_Environment_alloc.xml 2009-03-12 12:28:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/CORBA_Environment_alloc.xml 2009-11-20 13:36:22.000000000 +0000 @@ -89,7 +89,7 @@ int _outbufsz; /* Pointer to always dynamically allocated buffer for output */ char *_outbuf; - /* Size of memory chunks in bytes, used for increasing the outpuy + /* Size of memory chunks in bytes, used for increasing the output buffer, set to >= 32, should be around >= 1024 for performance reasons */ int _memchunk; diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/Makefile erlang-13.b.3-dfsg/lib/ic/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/ic/doc/src/Makefile 2009-03-12 12:28:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/Makefile 2009-11-20 13:36:18.000000000 +0000 @@ -25,13 +25,14 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(IC_VSN) - +APPLICATION=ic # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- +ifndef DOCSUPPORT include make.dep - +endif # ---------------------------------------------------- # Java specific @@ -44,7 +45,7 @@ # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/ic-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -92,6 +93,14 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ @@ -99,8 +108,8 @@ TEX_FILES_USERS_GUIDE = \ $(XML_CHAPTER_FILES:%.xml=%.tex) -TOP_PDF_FILE = ic-$(VSN).pdf -TOP_PS_FILE = ic-$(VSN).ps +TOP_PDF_FILE = $(APPLICATION)-$(VSN).pdf +TOP_PS_FILE = $(APPLICATION)-$(VSN).ps $(TOP_PDF_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ @@ -108,6 +117,8 @@ $(TOP_PS_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +endif + JAVA_SOURCE_FILES = \ Holder.java \ BooleanHolder.java \ @@ -141,15 +152,20 @@ JD_INDEX_HTML_FILES = \ allclasses-frame.html \ + allclasses-noframe.html \ deprecated-list.html \ index-all.html \ overview-tree.html \ - packages.html \ stylesheet.css \ help-doc.html \ index.html \ package-list \ - serialized-form.html + serialized-form.html \ + constant-values.html + +JD_GIF_FILES = \ + ../html/java/resources/inherit.gif + PACK_DIR = com/ericsson/otp/ic JAVA_SOURCE_DIR = ../../java_src/$(PACK_DIR) @@ -189,6 +205,24 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ +ifdef DOCSUPPORT + +docs: pdf html man $(JAVADOC_GENERATED_FILES) + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + +else + ifeq ($(DOCTYPE),pdf) docs: pdf else @@ -205,6 +239,15 @@ html: $(HTML_FILES) +clean clean_docs clean_tex: + rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) + rm -f $(HTML_FILES) $(MAN3_FILES) + rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) + rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) + rm -rf ../html/java/* + +endif + $(JAVADOC_GENERATED_FILES): @(cd ../../java_src; $(JAVADOC) $(JAVADOCFLAGS) com.ericsson.otp.ic) @@ -217,18 +260,25 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) - rm -rf ../html/java/* # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + (/bin/cp -rf $(HTMLDIR) $(RELSYSDIR)/doc) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + +else + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -245,12 +295,15 @@ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELSYSDIR)/doc/html/java + $(INSTALL_DIR) $(RELSYSDIR)/doc/html/java/resources $(INSTALL_DIR) $(RELSYSDIR)/doc/html/java/com $(INSTALL_DIR) $(RELSYSDIR)/doc/html/java/com/ericsson $(INSTALL_DIR) $(RELSYSDIR)/doc/html/java/com/ericsson/otp $(INSTALL_DIR) $(RELSYSDIR)/doc/html/java/com/ericsson/otp/ic $(INSTALL_DATA) $(JAVADOC_INDEX_HTML_FILES) \ $(RELSYSDIR)/doc/html/java + $(INSTALL_DATA) $(JD_GIF_FILES) \ + $(RELSYSDIR)/doc/html/java/resources $(INSTALL_DATA) $(JAVADOC_PACK_HTML_FILES) \ $(RELSYSDIR)/doc/html/java/com/ericsson/otp/ic $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 @@ -259,6 +312,9 @@ endif endif +endif + + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/notes.xml erlang-13.b.3-dfsg/lib/ic/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/notes.xml 2009-06-05 13:55:15.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/notes.xml 2009-11-20 13:36:18.000000000 +0000 @@ -27,9 +27,41 @@ 2004-04-06 AC + notes.xml
    + IC 4.2.23 + +
    + Improvements and New Features + + +

    + The documentation is now built with open source tools (xsltproc and fop) + that exists on most platforms. One visible change is that the frames are removed.

    +

    + Own Id: OTP-8201 Aux Id:

    +
    +
    +
    +
    + +
    + IC 4.2.22 + +
    + Fixed Bugs and Malfunctions + + +

    The 64-bit version of libic was not compiled with the -fPIC flag.

    +

    Own id: OTP-8088

    +
    +
    +
    +
    + +
    IC 4.2.21
    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/old_notes.xml erlang-13.b.3-dfsg/lib/ic/doc/src/old_notes.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/old_notes.xml 2009-03-12 12:31:27.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/old_notes.xml 2009-11-20 13:37:28.000000000 +0000 @@ -210,7 +210,7 @@

    The typedef ___generic___ has been replaced by the typedef ___exec_function___, which has been made more strict; for backward compatibility the - ___genereric___ typedef is now an alias for + ___generic___ typedef is now an alias for ___exec_function___.

    @@ -401,7 +401,7 @@ Fixed Bugs and Malfunctions -

    A bug is fixed on noc backend which caused generation of errornous code.

    +

    A bug is fixed on noc backend which caused generation of erroneous code.

    Own Id: OTP-3812

    @@ -416,7 +416,7 @@

    The pragma code option is extended to point - specific functions on NOC backent, not only + specific functions on NOC backend, not only interfaces.

    @@ -646,7 +646,7 @@
    Fixed Bugs and Malfunctions

    A bug on comment type expansion is fixed.

    -

    The comment type expansion were errornous when +

    The comment type expansion were erroneous when inherited types (NOC backend). This is now fixed and the type naming agree with the scope of the inheritor interface.

    @@ -683,7 +683,7 @@ The constant export definitions were not generated well :

    -

    the declared C definition were errornous ( the name did not always agree +

    the declared C definition were erroneous ( the name did not always agree with the scope the constant were declared in ).

    @@ -731,7 +731,7 @@

    The implementation function no longer have to contain the - two (2) contructor functions (with super()). This is due + two (2) contractor functions (with super()). This is due to the fact that there is only one contractor function for each skeleton file :

    ImplBase()]]>

    @@ -781,7 +781,7 @@

    A bug is fixed when C backend is used.

    When C-union with enumerant discriminator, the size - calculation of the discriminator value were errornous. + calculation of the discriminator value were erroneous. This lead to the side effect that only the first case of the union were allowed. The error were fixed by fixing the size calculation of @@ -971,7 +971,7 @@

    The compiler ignores unknown/non supported pragma directives. A warning is raised while the generated code will then be the same as if the corresponding - (unkown) pragma directive were missing.

    + (unknown) pragma directive were missing.

    Own Id: OTP-3052

    @@ -1038,7 +1038,7 @@

    Type problems on floats and booleans fixed.

    Erroneous code for runtime checks on float was removed and the internal format of the data representing the boolean value - is uppgraded.

    + is upgraded.

    Own Id: OTP-2925

    @@ -1085,7 +1085,7 @@

    A bug is fixed when arrays that contained variable size data on C-backends

    -

    The compiler generated errornous code when IDL +

    The compiler generated erroneous code when IDL defined arrays that contained variable size data such as strings, variable size structs or sequences.

    Own Id: OTP-2900

    @@ -1094,7 +1094,7 @@

    A bug is fixed when sequences that contained variable size data on C_backends

    -

    The compiler generated errornous code when IDL +

    The compiler generated erroneous code when IDL defined arrays that contained variable size data such as strings, variable size structs or other sequences.

    Own Id: OTP-2901

    @@ -1102,7 +1102,7 @@

    A bug concerning bounded strings on C-backends is fixed.

    -

    The compiler generated errornous code for IDL +

    The compiler generated erroneous code for IDL defined bounded strings. Syntax errors were generated in special cases of typdedefined strings.

    Own Id: OTP-2898

    @@ -1293,7 +1293,7 @@

    A bug on oneway operations on c_genserv back-end that caused several - variables to be unidentifined is fixed.

    + variables to be unidentified is fixed.

    diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/ic/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/part_notes.xml 2007-11-26 13:08:26.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/part_notes.xml 2009-11-20 13:36:18.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1998 - 2007 - Ericsson AB, All Rights Reserved + 19982009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Idl Compiler Release Notes @@ -34,6 +32,6 @@ Compiler Application is an Erlang implementation of a compiler for the IDL language.

    - + diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/part.xml erlang-13.b.3-dfsg/lib/ic/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/part.xml 2007-11-26 13:08:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/part.xml 2009-11-20 13:36:19.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1998 - 2007 - Ericsson AB, All Rights Reserved + 19982009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + IC User's Guide @@ -33,15 +31,15 @@

    The IC application is an Erlang implementation of an IDL compiler.

    - - - - - - - - - - + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/ic/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/ic/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/ic/doc/src/ref_man.xml 2007-11-26 13:08:26.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ic/doc/src/ref_man.xml 2009-11-20 13:36:19.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1998 - 2007 - Ericsson AB, All Rights Reserved + 19982009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + IC Reference Manual @@ -33,8 +31,8 @@

    The IC application is an Erlang implementation of an IDL compiler.

    - - - + + + diff -Nru erlang-13.b.1-dfsg/lib/ic/vsn.mk erlang-13.b.3-dfsg/lib/ic/vsn.mk --- erlang-13.b.1-dfsg/lib/ic/vsn.mk 2009-06-05 13:55:14.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ic/vsn.mk 2009-11-20 13:36:17.000000000 +0000 @@ -1,6 +1,10 @@ -IC_VSN = 4.2.21 +IC_VSN = 4.2.23 -TICKETS = OTP-7982 +TICKETS = OTP-8201 + +TICKETS_4.2.22 = OTP-8088 + +TICKETS_4.2.21 = OTP-7982 TICKETS_4.2.20 = OTP-7837 diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/book.xml erlang-13.b.3-dfsg/lib/inets/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/book.xml 2009-03-12 12:28:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/book.xml 2009-11-20 13:35:58.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19972009 @@ -21,7 +21,7 @@ - Inets + inets Mattias Nilsson 1997-07-16 @@ -35,11 +35,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/ftp_client.xml erlang-13.b.3-dfsg/lib/inets/doc/src/ftp_client.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/ftp_client.xml 2009-03-12 12:32:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/ftp_client.xml 2009-11-20 13:37:37.000000000 +0000 @@ -29,7 +29,7 @@ - + ftp_client.xml
    diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/ftp.xml erlang-13.b.3-dfsg/lib/inets/doc/src/ftp.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/ftp.xml 2009-03-12 12:28:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/ftp.xml 2009-11-20 13:35:57.000000000 +0000 @@ -35,69 +35,130 @@

    The ftp module implements a client for file transfer according to a subset of the File Transfer Protocol (see 959). Starting from inets version 4.4.1 the ftp + id="RFC">959).

    + +

    Starting from inets version 4.4.1 the ftp client will always try to use passive ftp mode and only resort - to active ftp mode if this fails. There is a start option mode - where this default behavior may be changed.

    + to active ftp mode if this fails. There is a start option + mode where this default behavior + may be changed.

    + + + +

    There are two ways to start an ftp client. One is using the + Inets service framework + and the other is to start it directy as a standalone process + using the open function.

    -

    For a simple example of an ftp session see Inets User's Guide.

    +

    For a simple example of an ftp session see + Inets User's Guide.

    In addition to the ordinary functions for receiving and sending - files (see recv/2, recv/3, send/2 and - send/3) there are functions for receiving remote files as - binaries (see recv_bin/2) and for sending binaries to to be - stored as remote files (see send_bin/3).

    + files (see recv/2, recv/3, send/2 and + send/3) there are functions for receiving remote files as + binaries (see recv_bin/2) and for sending binaries to to be + stored as remote files (see send_bin/3).

    There is also a set of functions for sending and receiving - contiguous parts of a file to be stored in a remote file (for send - see send_chunk_start/2, send_chunk/2 and - send_chunk_end/1 and for receive see - recv_chunk_start/2 and recv_chunk/).

    + contiguous parts of a file to be stored in a remote file (for send + see send_chunk_start/2, send_chunk/2 and + send_chunk_end/1 and for receive see + recv_chunk_start/2 and recv_chunk/).

    The particular return values of the functions below depend very - much on the implementation of the FTP server at the remote - host. In particular the results from ls and nlist - varies. Often real errors are not reported as errors by ls, - even if for instance a file or directory does not - exist. nlist is usually more strict, but some - implementations have the peculiar behaviour of responding with an - error, if the request is a listing of the contents of directory - which exists but is empty.

    + much on the implementation of the FTP server at the remote + host. In particular the results from ls and nlist + varies. Often real errors are not reported as errors by ls, + even if for instance a file or directory does not + exist. nlist is usually more strict, but some + implementations have the peculiar behaviour of responding with an + error, if the request is a listing of the contents of directory + which exists but is empty.

    +
    FTP CLIENT SERVICE START/STOP

    The FTP client can be started and stopped dynamically in runtime by - calling the Inets application API inets:start(ftpc, ServiceConfig), + calling the Inets application API + inets:start(ftpc, ServiceConfig), or inets:start(ftpc, ServiceConfig, How), and - inets:stop(ftpc, Pid) - see inets(3) - Below follows a description of + inets:stop(ftpc, Pid). + See inets(3) for more info.

    +

    Below follows a description of the available configuration options.

    {host, Host} - Host = string() | ip_address() + + +

    Host = string() | ip_address()

    +
    + {port, Port} - Port = integer() - default is 21 + + +

    Port = integer() > 0

    +

    Default is 21.

    +
    + {mode, Mode} - Mode = active | passive - Passive is default. - {flags, Flags} - Flags = [Flag], Flag = verbose | debug | ip_v6_disabled, + + +

    Mode = active | passive

    > +

    Default is passive.

    +
    + + {verbose, Verbose} + + +

    Verbose = boolean()

    +

    This determines if the FTP communication should be + verbose or not.

    +

    Default is false.

    +
    + + {debug, Debug} + + +

    Debug = trace | debug | disable

    +

    Debugging using the dbg toolkit.

    +

    Default is disable.

    + + {ipfamily, IpFamily} + + +

    IpFamily = inet | inet6 | inet6fb4

    +

    With inet6fb4 the client behaves as before + (it tries to use IPv6 and only if that does not work, it + uses IPv4).

    +

    Default is inet (IPv4).

    +
    + {timeout, Timeout} - Timeout = integer() - default is 60000 milliseconds. - {progress, ProgressOption} - ProgressOption = ignore | {CBModule, CBFunction, InitProgress} - CallBackModule = atom(), CallBackFunction = atom(), - InitProgress = term() + + +

    Timeout = integer() >= 0

    +

    Connection timeout.

    +

    Default is 60000 (milliseconds).

    +
    + + {progress, Progress} + + +

    Progress = ignore | {CBModule, CBFunction, InitProgress}

    +

    CBModule = atom(), CBFunction = atom()

    +

    InitProgress = term()

    +

    Default is ignore.

    +
    +

    The progress option is intended to be used by applications that - want create some type of progress report such as a progress bar in + want to create some type of progress report such as a progress bar in a GUI. The default value for the progress option is ignore e.i. the option is not used. When the progress option is specified the following will happen when ftp:send/[3,4] or @@ -199,6 +260,8 @@

    common_reason() = econn | eclosed | term() - some kind of explanation of what went wrong.

    + +
    @@ -213,11 +276,16 @@

    If an account is needed for an operation set the account with this operation.

    + + + +
    + append(Pid, LocalFile) -> - append(Pid, LocalFile, RemoteFile) -> ok | {error, Reason} + append(Pid, LocalFile, RemoteFile) -> ok | {error, Reason} Transfer file to remote server, and append it to Remotefile. Pid = pid() @@ -230,8 +298,11 @@ file will be appended to is set to RemoteFile; otherwise the name is set to LocalFile If the file does not exists the file will be created.

    + +
    + append_bin(Pid, Bin, RemoteFile) -> ok | {error, Reason} Transfer a binary into a remote file. @@ -245,8 +316,11 @@

    Transfers the binary Bin to the remote server and append it to the file RemoteFile. If the file does not exists it will be created.

    + +
    + append_chunk(Pid, Bin) -> ok | {error, Reason} append a chunk to the remote file. @@ -260,10 +334,13 @@ append it into the file specified in the call to append_chunk_start/2.

    Note that for some errors, e.g. file system full, it is - neccessery to to call append_chunk_end to get the + necessary to to call append_chunk_end to get the proper reason.

    + +
    + append_chunk_start(Pid, File) -> ok | {error, Reason} Start transfer of file chunks for appending to File. @@ -276,8 +353,11 @@

    Start the transfer of chunks for appending to the file File at the remote server. If the file does not exists it will be created.

    + +
    + append_chunk_end(Pid) -> ok | {error, Reason} Stop transfer of chunks for appending. @@ -289,8 +369,11 @@

    Stops transfer of chunks for appending to the remote server. The file at the remote server, specified in the call to append_chunk_start/2 is closed by the server.

    + +
    + cd(Pid, Dir) -> ok | {error, Reason} Change remote working directory. @@ -300,11 +383,28 @@ Reason = restriction_reason() | common_reason() -

    Changes the working directory at the remote server to Dir.

    +

    Changes the working directory at the remote server to + Dir.

    + +
    + close(Pid) -> ok + End the ftp session. + + Pid = pid() + + +

    Ends an ftp session, created using the + open function.

    + + +
    +
    + + delete(Pid, File) -> ok | {error, Reason} Delete a file at the remote server.. @@ -314,8 +414,11 @@

    Deletes the file File at the remote server.

    + +
    + formaterror(Tag) -> string() Return error diagnostics. @@ -325,8 +428,11 @@

    Given an error return value {error, AtomReason}, this function returns a readable string describing the error.

    + +
    + lcd(Pid, Dir) -> ok | {error, Reason} Change local working directory. @@ -337,8 +443,11 @@

    Changes the working directory to Dir for the local client.

    + +
    + lpwd(Pid) -> {ok, Dir} Get local current working directory. @@ -347,25 +456,36 @@

    Returns the current working directory at the local client.

    + + + +
    + ls(Pid) -> - ls(Pid, Dir) -> {ok, Listing} | {error, Reason} - List contents of remote directory. + ls(Pid, Pathname) -> {ok, Listing} | {error, Reason} + List of files. Pid = pid() - Dir = string() + Pathname = string() Listing = string() Reason = restriction_reason() | common_reason() -

    Returns a listing of the contents of the remote current directory - (ls/1) or the specified directory (ls/2). The format - of Listing is operating system dependent (on UNIX it is - typically produced from the output of the ls -l shell command).

    +

    Returns a list of files in long format.

    +

    Pathname can be a directory, a group of files or + even a file. The Pathname string can contain wildcard(s).

    +

    ls/1 implies the user's current remote directory.

    +

    The format of Listing is operating system dependent + (on UNIX it is typically produced from the output of the + ls -l shell command).

    + +
    + mkdir(Pid, Dir) -> ok | {error, Reason} Create remote directory. @@ -376,26 +496,83 @@

    Creates the directory Dir at the remote server.

    + + + +
    + nlist(Pid) -> - nlist(Pid, Dir) -> {ok, Listing} | {error, Reason} - List contents of remote directory. + nlist(Pid, Pathname) -> {ok, Listing} | {error, Reason} + List of files. Pid = pid() - Dir = string() + Pathname = string() Listing = string() Reason = restriction_reason() | common_reason() -

    Returns a listing of the contents of the remote current directory - (nlist/1) or the specified directory - (nlist/2). The format of Listing is a stream of +

    Returns a list of files in short format.

    +

    Pathname can be a directory, a group of files or + even a file. The Pathname string can contain wildcard(s).

    +

    nlist/1 implies the user's current remote directory.

    +

    The format of Listing is a stream of file names, where each name is separated by <CRLF> or <NL>. Contrary to the ls function, the purpose of nlist is to make it possible for a program to automatically process file name information.

    + + +
    +
    + + + open(Host) -> {ok, Pid} | {error, Reason} + open(Host, Opts) -> {ok, Pid} | {error, Reason} + Start an standalone ftp client. + + Host = string() | ip_address() + Opts = start_options() | open_options() + start_options() = [start_option()] + start_option() = {verbose, verbose()} | {debug, debug()} + verbose() = boolean() (defaults to false) + debug() = disable | debug | trace (defaults to disable) + open_options() = [open_option()] + open_option() = {ipfamily, ipfamily()} | {port, port()} | {mode, mode()} | {timeout, timeout()} | {progress, progress()} + ipfamily() = inet | inet6 | inet6fb4 (defaults to inet) + port() = integer() > 0 (defaults to 21) + mode() = active | passive (defaults to passive) + timeout() = integer() >= 0 (defaults to 60000 milliseconds) + pogress() = ignore | {module(), function(), initial_data()} (defaults to ignore) + module() = atom() + function() = atom() + initial_data() = term() + Reason = ehost | term() + + + +

    This function is used to start a standalone ftp client process + (without the inets service framework) and + open a session with the FTP server at Host.

    + +

    A session opened in this way, is closed using the + close function.

    + + +
    +
    + + + pwd(Pid) -> {ok, Dir} | {error, Reason} + Get remote current working directory. + + Pid = pid() + Reason = restriction_reason() | common_reason() + + +

    Returns the current working directory at the remote server.

    @@ -408,8 +585,13 @@

    Returns the current working directory at the remote server.

    + + + +
    + recv(Pid, RemoteFile) -> recv(Pid, RemoteFile, LocalFile) -> ok | {error, Reason} @@ -426,11 +608,14 @@ LocalFile is specified, the local file will be LocalFile; otherwise it will be RemoteFile.

    -

    If the file write failes +

    If the file write fails (e.g. enospc), then the command is aborted and {error, file_write_error_reason()} is returned. The file is however not removed.

    + +
    + recv_bin(Pid, RemoteFile) -> {ok, Bin} | {error, Reason} Transfer file from remote server as a binary. @@ -443,8 +628,11 @@

    Transfers the file RemoteFile from the remote server and receives it as a binary.

    + +
    + recv_chunk_start(Pid, RemoteFile) -> ok | {error, Reason} Start chunk-reading of the remote file. @@ -456,8 +644,11 @@

    Start transfer of the file RemoteFile from the remote server.

    + +
    + recv_chunk(Pid) -> ok | {ok, Bin} | {error, Reason} Receive a chunk of the remote file. @@ -475,8 +666,11 @@ {ok, Bin} just another chunk of the file. {error, Reason} transfer failed. + + + rename(Pid, Old, New) -> ok | {error, Reason} Rename a file at the remote server.. @@ -487,8 +681,11 @@

    Renames Old to New at the remote server.

    + +
    + rmdir(Pid, Dir) -> ok | {error, Reason} Remove a remote directory. @@ -499,10 +696,15 @@

    Removes directory Dir at the remote server.

    + + + +
    + - send(Pid, LocalFile) -> + send(Pid, LocalFile) -> send(Pid, LocalFile, RemoteFile) -> ok | {error, Reason} Transfer file to remote server. @@ -514,8 +716,11 @@

    Transfers the file LocalFile to the remote server. If RemoteFile is specified, the name of the remote file is set to RemoteFile; otherwise the name is set to LocalFile.

    + +
    + send_bin(Pid, Bin, RemoteFile) -> ok | {error, Reason} Transfer a binary into a remote file. @@ -528,8 +733,11 @@

    Transfers the binary Bin into the file RemoteFile at the remote server.

    + +
    + send_chunk(Pid, Bin) -> ok | {error, Reason} Write a chunk to the remote file. @@ -543,10 +751,13 @@ writes it into the file specified in the call to send_chunk_start/2.

    Note that for some errors, e.g. file system full, it is - neccessery to to call send_chunk_end to get the + necessary to to call send_chunk_end to get the proper reason.

    + +
    + send_chunk_start(Pid, File) -> ok | {error, Reason} Start transfer of file chunks. @@ -558,8 +769,11 @@

    Start transfer of chunks into the file File at the remote server.

    + +
    + send_chunk_end(Pid) -> ok | {error, Reason} Stop transfer of chunks. @@ -571,8 +785,11 @@

    Stops transfer of chunks to the remote server. The file at the remote server, specified in the call to send_chunk_start/2 is closed by the server.

    + +
    + type(Pid, Type) -> ok | {error, Reason} Set transfer type to asciior binary. @@ -586,8 +803,11 @@ an ftp session is opened, the default transfer type of the server is used, most often ascii, which is the default according to RFC 959.

    + +
    + user(Pid, User, Password) -> ok | {error, Reason} User login. @@ -598,10 +818,13 @@

    Performs login of User with Password.

    + +
    + - user(Pid, User, Password,Account) -> ok | {error, Reason} + user(Pid, User, Password, Account) -> ok | {error, Reason} User login. Pid = pid() @@ -609,13 +832,16 @@ Reason = euser | common_reason() -

    Performs login of User with Passwordto the acccount - specified by Account .

    +

    Performs login of User with Password to the account + specified by Account.

    + +
    + quote(Pid, Command) -> [FTPLine] - Sends an arbitary FTP command. + Sends an arbitrary FTP command. Pid = pid() Command = string() diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/http_client.xml erlang-13.b.3-dfsg/lib/inets/doc/src/http_client.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/http_client.xml 2009-03-12 12:31:59.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/http_client.xml 2009-11-20 13:37:36.000000000 +0000 @@ -29,7 +29,7 @@ - + http_client.xml
    @@ -41,7 +41,7 @@ application startup, or profiles can be started and stopped dynamically in runtime. Each client profile will spawn a new process to handle each request unless there is a possibility to use - a persistent connection with or without pipeling. + a persistent connection with or without pipelining. The client will add a host header and an empty te header if there are no such headers present in the request.

    @@ -68,7 +68,7 @@

    The following calls uses the default client profile. Use the proxy "www-proxy.mycompany.com:8000", - but not for requsts to localhost. This will apply to all subsequent + but not for requests to localhost. This will apply to all subsequent requests

    2 > http:set_options([{proxy, {{"www-proxy.mycompany.com", 8000}, @@ -112,7 +112,7 @@ {ok, <0.45.0>} ]]> -

    The new profile has no proxy settings so the connetion will +

    The new profile has no proxy settings so the connection will be refused

    9 > http:request("http://www.erlang.org", foo). diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/httpd_util.xml erlang-13.b.3-dfsg/lib/inets/doc/src/httpd_util.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/httpd_util.xml 2009-03-12 12:28:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/httpd_util.xml 2009-11-20 13:36:15.000000000 +0000 @@ -33,7 +33,10 @@

    This module provides the Erlang Web Server API module programmer with miscellaneous utility functions.

    + +
    + convert_request_date(DateString) -> ErlDate|bad_date @@ -44,12 +47,14 @@ Year = Month = Date = Hour = Min = Sec = integer() - -

    convert_request_date/1 converts DateString to the Erlang - date format. DateString must be in one of the three date formats that is defined - in the RFC 2616.

    +

    convert_request_date/1 converts DateString to + the Erlang date format. DateString must be in one of the three + date formats that is defined in the RFC 2616.

    + +
    + create_etag(FileInfo) -> Etag Calculates the Etag for a file. @@ -58,11 +63,14 @@ Etag = string() - -

    create_etag/1 calculates the Etag for a file, from it's size and time for - last modification. fileinfo is a record defined in kernel/include/file.hrl

    +

    create_etag/1 calculates the Etag for a file, from it's + size and time for last modification. fileinfo is a record defined + in kernel/include/file.hrl

    + +
    + decode_hex(HexValue) -> DecValue Convert a hex value into its decimal equivalent. @@ -70,11 +78,13 @@ HexValue = DecValue = string() -

    Converts the hexadecimal value HexValue into it's decimal equivalent (DecValue).

    + +
    + day(NthDayOfWeek) -> DayOfWeek Convert the day of the week (integer [1-7]) to an abbreviated string. @@ -88,8 +98,11 @@ (NthDayOfWeek) as an integer (1-7) to an abbreviated string, that is:

    1 = "Mon", 2 = "Tue", ..., 7 = "Sat".

    + +
    + flatlength(NestedList) -> Size Compute the size of a possibly nested list. @@ -101,8 +114,12 @@

    flatlength/1 computes the size of the possibly nested list NestedList. Which may contain binaries.

    + +
    + + + hexlist_to_integer(HexString) -> Number Convert a hexadecimal string to an integer. @@ -137,10 +158,13 @@ HexString = string() - -

    hexlist_to_integer Convert the Hexadecimal value of HexString to an integer.

    +

    hexlist_to_integer Convert the Hexadecimal value of + HexString to an integer.

    + +
    + integer_to_hexlist(Number) -> HexString Convert an integer to a hexadecimal string. @@ -150,9 +174,13 @@ -

    integer_to_hexlist/1 Returns a string that represents the Number in a Hexadecimal form.

    +

    integer_to_hexlist/1 Returns a string that represents + the Number in a Hexadecimal form.

    + +
    + lookup(ETSTable,Key) -> Result lookup(ETSTable,Key,Undefined) -> Result @@ -164,7 +192,6 @@ Undefined = term() -

    lookup extracts {Key,Value} tuples from ETSTable and returns the Value associated with Key. If ETSTable is of type bag @@ -172,8 +199,11 @@ returned. lookup/2 returns undefined and lookup/3 returns Undefined if no Value is found.

    + +
    + lookup_mime(ConfigDB,Suffix) lookup_mime(ConfigDB,Suffix,Undefined) -> MimeType @@ -189,8 +219,11 @@

    lookup_mime returns the mime type associated with a specific file suffix as specified in the mime.types file (located in the config directory).

    + +
    + lookup_mime_default(ConfigDB,Suffix) lookup_mime_default(ConfigDB,Suffix,Undefined) -> MimeType @@ -206,11 +239,15 @@

    lookup_mime_default returns the mime type associated with a specific file suffix as specified in the mime.types file (located in the - config directory). If no appropriate association can be found + config directory). + If no appropriate association can be found the value of DefaultType is returned.

    + +
    + message(StatusCode,PhraseArgs,ConfigDB) -> Message Return an informative HTTP 1.1 status string in HTML. @@ -243,8 +280,11 @@ string(): A string describing why the service was unavailable. + + + month(NthMonth) -> Month Convert the month as an integer (1-12) to an abbreviated string. @@ -257,8 +297,11 @@

    month/1 converts the month NthMonth as an integer (1-12) to an abbreviated string, that is:

    1 = "Jan", 2 = "Feb", ..., 12 = "Dec".

    + +
    + multi_lookup(ETSTable,Key) -> Result Extract the values associated with a key in a ETS table. @@ -268,11 +311,13 @@ Result = [term()] -

    multi_lookup extracts all {Key,Value} tuples from an ETSTable and returns allValues associated with the Key in a list.

    + +
    + reason_phrase(StatusCode) -> Description Return the description of an HTTP 1.1 status code. @@ -281,12 +326,14 @@ Description = string() -

    reason_phrase returns the Description of an HTTP 1.1 StatusCode, for example 200 is "OK" and 201 is "Created". Read RFC 2616 for further information.

    + +
    + rfc1123_date() -> RFC1123Date rfc1123_date({{YYYY,MM,DD},{Hour,Min,Sec}}}) -> RFC1123Date @@ -300,8 +347,11 @@

    rfc1123_date/0 returns the current date in RFC 1123 format. rfc_date/1 converts the date in the Erlang format to the RFC 1123 date format.

    + +
    + split(String,RegExp,N) -> SplitRes Split a string in N chunks using a regular expression. @@ -318,8 +368,11 @@ regexp:split/2 with one exception, that is N defines the number of maximum number of fields in the FieldList.

    + +
    + split_script_path(RequestLine) -> Splitted Split a RequestLinein a file reference to an executable and aQueryStringor a PathInfostring. @@ -334,8 +387,11 @@ split_path/1 with one exception. If the longest possible path is not a regular, accessible and executable file not_a_script is returned.

    + +
    + split_path(RequestLine) -> {Path,QueryStringOrPathInfo} Split a RequestLinein a file reference and a QueryStringor aPathInfostring. @@ -358,8 +414,11 @@ Path, isolated with a /, is regarded as PathInfo. The resulting Path is decoded using decode_hex/1 before delivery.

    + +
    + strip(String) -> Stripped Returns String where the leading and trailing space and tabs has been removed. @@ -370,9 +429,12 @@

    strip/1 removes any leading or trailing linear white space from the string. Linear white space should be read as - horisontal tab or space.

    + horizontal tab or space.

    + +
    + suffix(FileName) -> Suffix Extract the file suffix from a given filename. @@ -395,5 +457,3 @@
    - - diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/httpd.xml erlang-13.b.3-dfsg/lib/inets/doc/src/httpd.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/httpd.xml 2009-03-12 12:28:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/httpd.xml 2009-11-20 13:35:57.000000000 +0000 @@ -28,8 +28,10 @@ 2.2 httpd.sgml
    - httpd An implementation of an HTTP - 1.1 compliant Web server, as defined in RFC 2616. + httpd + An implementation of an HTTP + 1.1 compliant Web server, as defined in RFC 2616. +

    Documents the HTTP server start options, some administrative functions and also specifies the Erlang Web server callback @@ -60,6 +62,7 @@ description of the available configuration options, also called properties.

    +

    File properties

    When the web server is started @@ -84,7 +87,7 @@ If this property is defined inets will expect to find all other properties defined in this file, that uses Apache like syntax. Note that the file must - include all properties listed under mandantory properties. The + include all properties listed under mandatory properties. The Apache like syntax is the property, written as one word where each new word begins with a capital, followed by a white-space followed by the value followed by a new line. Ex: @@ -110,18 +113,21 @@

    The properties proplist_file and file are mutually exclusive.

    + +

    Mandatory properties

    {port, integer()} The port that the HTTP server shall listen on. - If zero is specified as port, an arbitrary available port - will be picked and you can use the httpd:info/2 function to find - out which port was picked. + If zero is specified as port, an arbitrary available port + will be picked and you can use the httpd:info/2 function to find + out which port was picked. {server_name, string()} The name of your server, normally a fully qualified domain - name. + name. + {server_root, path()} Defines the servers home directory where log files etc can @@ -133,19 +139,30 @@ are available on the HTTP server. +

    Communication properties

    {bind_address, ip_address() | hostname() | any} - Defaults to any. Note any is denoted * - in the apache like configuration file. + Defaults to any. Note that any is denoted * + in the apache like configuration file. + {socket_type, ip_comm | ssl} - Defaults to ip_comm +

    Defaults to ip_comm.

    + + + {ipfamily, inet | inet6 | inet6fb4} + +

    Defaults to inet6fb4.

    +

    Note that this option is only used when the option + socket_type has the value ip_comm.

    +
    +
    -

    Erlang Web server API moudles

    +

    Erlang Web server API modules

    {modules, [atom()]} @@ -160,6 +177,7 @@ +

    Limit properties

    {disable_chunked_transfer_encoding_send, boolean()} @@ -174,7 +192,7 @@ connections when the client claims to be HTTP/1.1 compliant, default is true. - {keep_alive_timeoute, integer()} + {keep_alive_timeout, integer()} The number of seconds the server will wait for a subsequent request from the client before closing the @@ -209,6 +227,7 @@ request. Defaults to no limit. +

    Administrative properties

    {mime_types, [{MimeType, Extension}] | path()} @@ -303,6 +322,7 @@ +

    ssl properties

    {ssl_ca_certificate_file, path()} @@ -353,6 +373,7 @@ +

    URL aliasing properties - requires mod_alias

    {alias, {Alias, RealName}} @@ -386,6 +407,7 @@ +

    CGI properties - requires mod_cgi

    {script_alias, {Alias, RealName}} @@ -445,6 +467,7 @@ +

    ESI properties - requires mod_esi

    {erl_script_alias, {URLPath, [AllowedModule]}} @@ -490,6 +513,7 @@ for backwards compatibility. The eval scheme is deprecated. +

    Log properties - requires mod_log

    {error_log, path()} @@ -516,6 +540,7 @@ +

    Disk Log properties - requires mod_disk_log

    {disk_log_format, internal | external} @@ -580,11 +605,13 @@ used before the first file is truncated and reused. +

    Authentication properties - requires mod_auth

    {directory, {path(), [{property(), term()}]}}

    -

    Here follows the valid properties for directories

    + +

    Here follows the valid properties for directories

    {allow_from, all | [RegxpHostString]} @@ -696,7 +723,8 @@ -

    Htacess authenication properties - requires mod_htacess

    + +

    Htaccess authentication properties - requires mod_htaccess

    {access_files, [path()]} @@ -709,10 +737,12 @@ -

    Authentication properties - requires mod_security

    + +

    Security properties - requires mod_security

    {security_directory, {path(), [{property(), term()}]}

    +

    Here follows the valid properties for security directories

    {security_data_file, path()} @@ -876,7 +906,7 @@ method Type "GET" | "POST" | "HEAD" | "TRACE", that is the - HTTP metod. + HTTP method. absolute_uri If the request is a HTTP/1.1 @@ -957,7 +987,7 @@ to the client.

    If Body is returned and equal to {Fun,Arg}, the Web server will try apply/2 on Fun with - Arg as argument and excpect that the fun either + Arg as argument and expect that the fun either returns a list (Body) that is a HTTP-repsonse or the atom sent if the HTTP-response is sent back to the client. If close is returned from the fun something has gone diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/http_server.xml erlang-13.b.3-dfsg/lib/inets/doc/src/http_server.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/http_server.xml 2009-03-12 12:31:59.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/http_server.xml 2009-11-20 13:37:36.000000000 +0000 @@ -29,7 +29,7 @@ - + http_server.xml

    @@ -143,7 +143,7 @@

    Reload the configuration without restarting the server. Note port and bind_address can not be changed. Clients - trying to acessess the server during the reload will + trying to access the server during the reload will get a service temporary unavailable answer.

    @@ -171,7 +171,7 @@

    Note that bind_address has to be the ip address reported by the info function and can - not be the hostname that is allowed when inputing bind_address.

    + not be the hostname that is allowed when inputting bind_address.

    @@ -393,14 +393,15 @@ directive has been used

    The module (Module) referred to must be found in the code path, and it must define a function (Function) with an arity - of two or three. It is preferable to implement a funtion - with arity three as it permitts you to send chunks of the + of two or three. It is preferable to implement a funtion + with arity three as it permits you to send chunks of the webpage beeing generated to the client during the generation phase instead of first generating the whole web page and then sending it to the client. The option to implement a - function with arity two is only keept for - backwardcompatibilty reasons. See mod_esi(3) for implementation details of the esi - callback function.

    + function with arity two is only kept for + backwardcompatibilty reasons. + See mod_esi(3) for + implementation details of the esi callback function.

    @@ -636,24 +637,24 @@ Seting up connections, sending and receiving data. URI to filename translation - Authenication/access cheks. + Authenication/access checks. Retriving/generating the response. Logging

    To provide customization and extensibility of the HTTP servers request handling most of these steps are handled by one or more - modules that may be replaced or removed at runtime, and ofcourse + modules that may be replaced or removed at runtime, and of course new ones can be added. For each request all modules will be traversed in the order specified by the modules directive in the server configuration file. Some parts mainly the communication - related steps are considered server core functionallity and are + related steps are considered server core functionality and are not implemented using the Erlang Web Server API. A description of functionality implemented by the Erlang Webserver API is described in the section Inets Webserver Modules.

    A module can use data generated by previous modules in the Erlang Webserver API module sequence or generate data to be used by consecutive Erlang Web Server API modules. This is made - possible due to an internal list of key-value tuples, also refered to + possible due to an internal list of key-value tuples, also referred to as interaction data.

    Interaction data enforces module dependencies and @@ -681,10 +682,10 @@

    Inets Web Server Modules

    The convention is that - all modules implementing some webserver functionallity has the + all modules implementing some webserver functionality has the name mod_*. When configuring the web server an appropriate selection of these modules should be present in the Module - directve. Please note that there are some interaction dependencies + directive. Please note that there are some interaction dependencies to take into account so the order of the modules can not be totally random.

    @@ -875,7 +876,7 @@
    - mod_htacess - User Configurable Access + mod_htaccess - User Configurable Access

    This module provides per-directory user configurable access control.

    Uses the following Erlang Web Server API interaction data: @@ -941,7 +942,7 @@

    mod_response_control - Requests with If* Headers

    This module controls that the conditions in the requests is - fullfilled. For example a request may specify that the answer + fulfilled. For example a request may specify that the answer only is of interest if the content is unchanged since last retrieval. Or if the content is changed the range-request shall be converted to a request for the whole file instead.

    If @@ -969,7 +970,7 @@

    {if_range, send_file} - The conditions for the range request was not fullfilled. + The conditions for the range request was not fulfilled. The response must not be treated as a range request, instead it must be treated as a ordinary get request. diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/http.xml erlang-13.b.3-dfsg/lib/inets/doc/src/http.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/http.xml 2009-06-05 13:55:59.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/http.xml 2009-11-20 13:37:34.000000000 +0000 @@ -36,7 +36,7 @@

    When starting the Inets application a manager process for the default profile will be started. The functions in this API - that does not explicitly use a profile will acesses the + that does not explicitly use a profile will accesses the default profile. A profile keeps track of proxy options, cookies and other options that can be applied to more than one request.

    @@ -44,9 +44,9 @@

    If the scheme https is used the ssl application needs to be started.

    -

    Also note that pipeling will only be used if the pipeline +

    Also note that pipelining will only be used if the pipeline timeout is set, otherwise persistent connections without - pipeling will be used e.i. the client always waits for + pipelining will be used e.i. the client always waits for the previous response before sending the next request.

    There are some usage examples in the {profile, profile()} Name of the profile, see - common data types below, this option is mandantory. + common data types below, this option is mandatory. {data_dir, path()} Directory where the profile may save persistent data, if omitted all cookies will be treated @@ -174,64 +174,162 @@ Sends a HTTP-request Method = method() - Request - request() - HTTPOptions - [HttpOption] - HTTPOption - {timeout, integer()} | {ssl, ssl_options()} | {autoredirect, boolean()} | {proxy_auth, {userstring(), passwordstring()}} | {version, http_version()} | {relaxed, boolean()} - autoredirect - This option is true by default i.e. the client will automatically retrive the information from the new URI and return that as the result instead of a 30X-result code. Note that for some 30X-result codes automatic redirect is not allowed in these cases the 30X-result will always be returned. - proxy_auth - A proxy-authorization header using the provided user name and password will be added to the request. - version - Can be used to make the client act as an HTTP/1.0 or - HTTP/0.9 client. - By default this is an HTTP/1.1 client. When - using HTTP/1.0 persistent connections will not be used. - relaxed - If set to true workarounds for known server deviations from - the HTTP-standard are enabled, defaults to false. - Options - [option()] - Option - {sync, boolean()} | {stream, StreamTo} | {body_format, body_format()} | {full_result, boolean()} | {headers_as_is, boolean()} - The request function will be synchronous and return a full http response by default. - StreamTo = self | {self, once} | filename() - - Streams the body of a 200 or 206 response to the calling process - or to a file. When streaming to the calling process using - the option self the the following stream messages - will be sent to that process: {http, {RequestId, - stream_start, Headers}, {http, {RequestId, stream, - BinBodyPart}, {http, {RequestId, stream_end, Headers}. When - streaming to to the calling processes using the option - {self once} the first message will have an additional - element e.i. {http, {RequestId, stream_start, Headers, Pid}, - this is the process id that should be used as an argument to - http:stream_next/1 to trigger the next message to be sent to - the calling process. - Note that it is possible that chunked encoding will add - headers so that there are more headers in the stream_end - message than in the stream_start. - When streaming to a file and the request is asynchronous the - message {http, {RequestId, saved_to_file}} will be sent. - + Request = request() + HTTPOptions = http_options() + http_options() = [http_option()] + http_option() = {timeout, timeout()} | + {connect_timeout, timeout()} | + {ssl, ssl_options()} | + {autoredirect, boolean()} | + {proxy_auth, {userstring(), passwordstring()}} | + {version, http_version()} | + {relaxed, boolean()} + timeout() = integer() >= 0 | infinity + Options = options() + options() = [option()] + option() = {sync, boolean()} | + {stream, stream_to()} | + {body_format, body_format()} | + {full_result, boolean()} | + {headers_as_is, boolean()} + stream_to() = self | {self, once} | filename() body_format() = string() | binary() - - The body_format option is only valid for the synchronous request and the default is string. When making an asynchronous request the body will always be received as a binary. - headers_as_is - The headers_as_is option is by default false, if set to true the headers provided by the user will be regarded as case sensitive. Note that the http standard requires them to be case insenstive. This feature should only be used if there is no other way to communicate with the server or for testing purpose. Also note that when this option is used no headers will be - automatically added, all necessary headers has to be provided by the user. - Result = {status_line(), headers(), body()} | {status_code(), body()} | request_id() - Profile = profile() + Result = {status_line(), headers(), body()} | + {status_code(), body()} | request_id() + Profile = profile() Reason = term() +

    Sends a HTTP-request. The function can be both synchronous - and asynchronous in the later case the function will return - {ok, RequestId} and later on message/messages will be sent to the - calling process on the format {http, {RequestId, Result}} - {http, {RequestId, {error, Reason}}}, - {http, {RequestId, stream_start, Headers}, - {http, {RequestId, stream, BinBodyPart}, - {http, {RequestId, stream_end, Headers} or - {http, {RequestId, saved_to_file}}.

    + and asynchronous. In the later case the function will return + {ok, RequestId} and later on message(s) will be sent to the + calling process on the format:

    +
    +          {http, {RequestId, Result}}
    +          {http, {RequestId, {error, Reason}}}
    +          {http, {RequestId, stream_start, Headers}
    +          {http, {RequestId, stream, BinBodyPart}
    +          {http, {RequestId, stream_end, Headers}
    +          {http, {RequestId, saved_to_file}}.
    +
    + +

    Http option (http_option()) details:

    + + + +

    Timeout time for the request.

    +

    Defaults to infinity.

    +
    + + + +

    Connection timeout time, used during the initial request, + when the client is connecting to the server.

    +

    Defaults to the value of the timeout option.

    +
    + + + +

    If using SSL, these SSL-specific options are used.

    +

    Defaults to [].

    +
    + + + +

    Should the client automatically retreive the information + from the new URI and return that as the result instead + of a 30X-result code.

    +

    Note that for some 30X-result codes automatic redirect + is not allowed in these cases the 30X-result will always + be returned.

    +

    Defaults to true.

    +
    + + + +

    A proxy-authorization header using the provided user name and + password will be added to the request.

    +
    + + + +

    Can be used to make the client act as an HTTP/1.0 or + HTTP/0.9 client. By default this is an HTTP/1.1 + client. When using HTTP/1.0 persistent connections will + not be used.

    +

    Defaults to the trsing "HTTP/1.1".

    +
    + + + +

    If set to true workarounds for known server deviations from + the HTTP-standard are enabled.

    +

    Defaults to false.

    +
    + +
    + +

    Option (option()) details:

    + + + +

    Shall the request be synchronous or asynchronous.

    +

    Defaults to true.

    +
    + + + +

    Streams the body of a 200 or 206 response to the calling + process or to a file. When streaming to the calling process + using the option self the the following stream messages + will be sent to that process: {http, {RequestId, + stream_start, Headers}, {http, {RequestId, stream, + BinBodyPart}, {http, {RequestId, stream_end, Headers}. When + streaming to to the calling processes using the option + {self once} the first message will have an additional + element e.i. {http, {RequestId, stream_start, Headers, Pid}, + this is the process id that should be used as an argument to + http:stream_next/1 to trigger the next message to be sent to + the calling process.

    +

    Note that it is possible that chunked encoding will add + headers so that there are more headers in the stream_end + message than in the stream_start. + When streaming to a file and the request is asynchronous the + message {http, {RequestId, saved_to_file}} will be sent.

    +

    Defaults to none.

    +
    + + + +

    Defines if the body shall be delivered as a string or as a + binary. This option is only valid for the synchronous + request.

    +

    Defaults to string.

    +
    + + + +

    Should a "full result" be returned to the caller (that is, + the body, the headers and the entire status-line) or not + (the body and the status code).

    +

    Defaults to true.

    +
    + + + +

    Shall the headers provided by the user be made + lower case or be regarded as case sensitive.

    +

    Note that the http standard requires them to be + case insenstive. This feature should only be used if there is + no other way to communicate with the server or for testing + purpose. Also note that when this option is used no headers + will be automatically added, all necessary headers has to be + provided by the user.

    +

    Defaults to false.

    +
    + +
    @@ -259,7 +357,7 @@ DomainDesc = "*.Domain" ex: "*.ericsson.se" IpDesc = string() - ex: "134.138" or "[FEDC:BA98" (all IP-adresses starting with 134.138 or FEDC:BA98), "66.35.250.150" or "[2010:836B:4179::836B:4179]" (a complete IP-address). + ex: "134.138" or "[FEDC:BA98" (all IP-addresses starting with 134.138 or FEDC:BA98), "66.35.250.150" or "[2010:836B:4179::836B:4179]" (a complete IP-address). MaxSessions = integer() Default is 2. Maximum number of persistent connections to a host. @@ -275,10 +373,10 @@ not count on it! MaxPipeline = integer() Default is 2. - Maximum number of outstanding requests on a piplined connection to a host. + Maximum number of outstanding requests on a pipelined connection to a host. PipelineTimeout = integer() Default is 0, - which will result in pipeling not being used. + which will result in pipelining not being used. If a persistent connection is idle longer than the pipeline_timeout the client will close the connection. CookieMode = enabled | disabled | verify @@ -357,7 +455,7 @@

    Saves the cookies defined in SetCookieHeaders in the client profile's cookie database. You need to call this function if you set the option cookies to verify. - If no profile is specifed the default profile will be used. + If no profile is specified the default profile will be used.

    @@ -376,7 +474,7 @@

    Returns the cookie header that would be sent when making a request to Url using the profile Profile. - If no profile is specifed the default profile will be used. + If no profile is specified the default profile will be used.

    diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/inets_services.xml erlang-13.b.3-dfsg/lib/inets/doc/src/inets_services.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/inets_services.xml 2009-03-12 12:28:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/inets_services.xml 2009-11-20 13:35:57.000000000 +0000 @@ -29,7 +29,7 @@ 2004-09-28 A - inets.sgml + inets_services.xml
    @@ -52,7 +52,7 @@ The Service Concept

    Each client and server in inets is viewed as service. Services may be configured to be started at application startup or - started dynamically in runtime. If you want to run intes as an + started dynamically in runtime. If you want to run inets as an distributed application that should handle application failover and takeover, services should be configured to be started at application startup. When starting the inets application diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/inets.xml erlang-13.b.3-dfsg/lib/inets/doc/src/inets.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/inets.xml 2009-03-12 12:32:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/inets.xml 2009-11-20 13:37:45.000000000 +0000 @@ -114,7 +114,7 @@ - start(Service, ServiceConfig) -> + start(Service, ServiceConfig) -> {ok, Pid} | {error, Reason} start(Service, ServiceConfig, How) -> {ok, Pid} | {error, Reason} Dynamically starts an inets @@ -134,7 +134,7 @@

    Dynamically started services will not be handled by application takeover and failover behavior when inets is run as a distributed application. Nor will they be - automaticly restarted when the inets application is + automatically restarted when the inets application is restarted, but as long as the inets application is up and running they will be supervised and may be soft code upgraded. Services started as stand_alone, @@ -142,20 +142,20 @@ application, will lose all OTP application benefits such as soft upgrade. The "stand_alone-service" will be linked to the process that started it. In most cases some of the - supervison functionallity will still be in place and in + supervision functionality will still be in place and in some sense the calling process has now become the top supervisor.

    - stop(Service, Reference) -> + stop(Service, Reference) -> ok | {error, Reason} Stops a started service of the inets application or takes down a "stand_alone-service" gracefully. Service = service() | stand_alone - Reference = pid() | term() - service specified reference - + Reference = pid() | term() - service specified reference + Reason = term()

    Stops a started service of the inets application or takes diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/Makefile erlang-13.b.3-dfsg/lib/inets/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/inets/doc/src/Makefile 2009-03-12 12:28:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/Makefile 2009-11-20 13:35:58.000000000 +0000 @@ -25,17 +25,20 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(INETS_VSN) +APPLICATION=inets # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- +ifndef DOCSUPPORT include make.dep +endif # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/inets-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -105,6 +108,14 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) TEX_FILES_REF_MAN = \ @@ -115,8 +126,8 @@ TEX_FILES_USERS_GUIDE = \ $(XML_CHAPTER_FILES:%.xml=%.tex) -TOP_PDF_FILE = inets-$(VSN).pdf -TOP_PS_FILE = inets-$(VSN).ps +TOP_PDF_FILE = $(APPLICATION)-$(VSN).pdf +TOP_PS_FILE = $(APPLICATION)-$(VSN).ps $(TOP_PDF_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ @@ -126,6 +137,8 @@ TOP_HTML_FILES = +endif + # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- @@ -138,6 +151,23 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ +ifdef DOCSUPPORT + +docs: pdf html man + +ldocs: local_docs + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: clean_html clean_man clean_pdf + rm -f errs core *~ + +else + ifeq ($(DOCTYPE),pdf) docs: pdf else @@ -154,31 +184,48 @@ html: $(HTML_FILES) $(TOP_HTML_FILES) gifs +clean_tex: + rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) + +clean: clean_tex clean_html clean_man + rm -f *.xmls_output *.xmls_errs + rm -f $(TOP_PDF_FILE) + rm -f errs core *~ +endif + man: $(MAN3_FILES) gifs: $(GIF_FILES:%=$(HTMLDIR)/%) debug opt: -clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) +clean_pdf: + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) clean_html: - rm -f $(TOP_HTML_FILES) ../html/* + rm -rf $(TOP_HTML_FILES) $(HTMLDIR)/* clean_man: rm -f $(MAN3_FILES) -clean: clean_tex clean_html clean_man - rm -f *.xmls_output *.xmls_errs - rm -f $(TOP_PDF_FILE) - rm -f errs core *~ - # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 +else + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -200,6 +247,8 @@ endif endif +endif + release_spec: info: diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/mod_alias.xml erlang-13.b.3-dfsg/lib/inets/doc/src/mod_alias.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/mod_alias.xml 2009-03-12 12:28:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/mod_alias.xml 2009-11-20 13:36:15.000000000 +0000 @@ -29,7 +29,7 @@ mod_alias.sgml mod_alias - URL ailasing. + URL aliasing.

    Erlang Webserver Server internal API for handling of things such as interaction data exported by the mod_alias module.

    diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/mod_auth.xml erlang-13.b.3-dfsg/lib/inets/doc/src/mod_auth.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/mod_auth.xml 2009-03-12 12:28:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/mod_auth.xml 2009-11-20 13:36:15.000000000 +0000 @@ -56,7 +56,7 @@

    add_user/2, add_user/5 and add_user/6 adds a user to the user - database. If the operation is succesful, this function returns + database. If the operation is successful, this function returns true. If an error occurs, {error,Reason} is returned. When add_user/2 is called the Password, UserData Port and Dir options is mandatory.

    @@ -78,8 +78,9 @@ -

    delete_user/2, delete_user/3 and delete_user/4 deletes a user - from the user database. If the operation is succesful, this +

    delete_user/2, delete_user/3 and delete_user/4 + deletes a user + from the user database. If the operation is succesfull, this function returns true. If an error occurs, {error,Reason} is returned. When delete_user/2 is called the Port and Dir options are mandatory.

    diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/mod_esi.xml erlang-13.b.3-dfsg/lib/inets/doc/src/mod_esi.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/mod_esi.xml 2009-03-12 12:28:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/mod_esi.xml 2009-11-20 13:36:16.000000000 +0000 @@ -88,18 +88,20 @@

    SessionID is a identifier the server use when deliver/2 is called, do not assume any-thing about the datatype.

    -

    Use this callback function to dynamicly generate dynamic web +

    Use this callback function to dynamically generate dynamic web content. when a part of the page is generated send the data back to the client through deliver/2. Note that the first chunk of data sent to the client must at least contain all HTTP header fields that the response - will generate. If the first chunk not contains End of HTTP header that is "\\r\ \\r\ " the server will + will generate. If the first chunk not contains + End of HTTP header that is "\\r\ \\r\ " + the server will assume that no HTTP header fields will be generated.

    Module:Function(Env, Input)-> Response - Creates a dynamic web page and return it as a list. This functions is deprecated and only keept for backwards compability. + Creates a dynamic web page and return it as a list. This functions is deprecated and only kept for backwards compatibility. Env = [EnvironmentDirectives] ++ ParsedHeader EnvironmentDirectives = {Key,Value} @@ -109,8 +111,9 @@

    This callback format consumes quite much memory since the whole response must be generated before it is sent to the - user.This functions is deprecated and only keept for backwards - compability. For new development Module:Function/3 should be used.

    + user. This functions is deprecated and only keept for backwards + compatibility. + For new development Module:Function/3 should be used.

    diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/notes_history.xml erlang-13.b.3-dfsg/lib/inets/doc/src/notes_history.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/notes_history.xml 2009-03-12 12:32:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/notes_history.xml 2009-11-20 13:37:37.000000000 +0000 @@ -99,7 +99,7 @@ very common case) the return of the asynchronous HTTP request was delayed for "timeout" seconds. This happened due to the fact that when spawning a gen_server process - the spawn will wait for the init function to compleat. + the spawn will wait for the init function to complete. This is now avoided using proc_lib and gen_server:enter_loop/3, hence the asynchronous HTTP request return will not be delayed. Also the request @@ -123,7 +123,7 @@ re-receive of acknowledgments. If multiple copies of the same acknowledgments is received the spurious ones are silently ignored. This fix was intended for inets-4.7.14 - but accidently it was not included in that release.

    + but accidentaly it was not included in that release.

    Own Id: OTP-6706 Aux Id: OTP-6691

    @@ -307,7 +307,7 @@ Fixed Bugs and Malfunctions -

    [httpd] - The http server could throw away piplined +

    [httpd] - The http server could throw away pipelined requests leaving the client hanging.

    Own Id: OTP-6310

    @@ -325,7 +325,7 @@

    [httpc] - Some 30X codes, as for instance 302, should not - always be automaticly redirected but in inets-4.7.6 some + always be automatically redirected but in inets-4.7.6 some restrictions where made too hard, never allowing an automatic redirection. (Automatic redirect should be allowed for get and head.)

    @@ -430,7 +430,7 @@

    [httpc] - Added feature to send header values as they where typed by the user of the client. Note that the http - standard requires them to be case insensative. This + standard requires them to be case insensitive. This feature should only be used if there is no other way to communicate with the server or for testing purpose.

    Own Id: OTP-5527

    @@ -487,7 +487,7 @@

    [httpd] HTTPD request handler does not handle unexpected info - properly, which causes an unneccessarily obscure error + properly, which causes an unnecessarily obscure error message.

    Own Id: OTP-6189

    Aux Id: seq10395

    @@ -573,7 +573,7 @@

    Own Id: OTP-5943 Aux Id: seq10198

    -

    [http,server] The process handling a request now ignors +

    [http,server] The process handling a request now ignores garbage messages.

    Own Id: OTP-5961 Aux Id: seq10198

    @@ -594,7 +594,7 @@

    [http,server] It was possible to read arbitrary files on - server by prepending ././ and ../../ in fornt of the file + server by prepending ././ and ../../ in front of the file name.

    Own Id: OTP-5938

    @@ -700,7 +700,7 @@

    [ftp, client] - Error when parsing a multiple FTP response line. The last line in a multiple response must be the response code followed by a space. A server may - have intermidate lines that start with the response code + have intermediate lines that start with the response code even if this is not recommended. The parsing missed to make sure that that space was present in what it considered to be the last line.

    @@ -727,11 +727,11 @@

    FTP: a data connection setup to the ftp server that failed caused a crash of the client. Now it is handled - smothely.

    + smoothly.

    Own Id: OTP-5738

    -

    [ftp] If host name is a ipv4 tuple ftp erronous tries to +

    [ftp] If host name is a ipv4 tuple ftp erroneous tries to connect as a ipv6 address with the ipv4 address.

    Own Id: OTP-5764

    @@ -793,7 +793,7 @@

    [http, server, esi] - The dispatching of the post body to - the esi callback fuction was broken.

    + the esi callback function was broken.

    Own Id: OTP-5706

    @@ -964,7 +964,7 @@ the client got the wrong answer or no answer at all. The errors where many times very timing dependent and mainly effected the chunk-related functions, so if you where - lucky you proably would not have noticed. The internal + lucky you probably would not have noticed. The internal design was changed to use gen_tcp active once semantics. The API is not effected except for the function ftp:quote/2 which now returns a list of strings (ftp @@ -1061,7 +1061,7 @@ "GET / \\r\ \\r\ ". According to the RFC the whitespace is - not nedded.

    + not needed.

    Own Id: OTP-5552 Aux Id: seq8426

    @@ -1108,7 +1108,7 @@

    That a third party closes the http servers accept socket - is recoverable for Inets, hence intes will only produce + is recoverable for inets, hence inets will only produce an info report as there was no error in Inets but measures where taken to avoid failure due to errors elsewhere.

    @@ -1179,7 +1179,7 @@

    Tunneling of SSL through a proxy has now been implemented. However due to lack of test sites this has only partially been verified, it is likely that there will - have to be future improvments in this area.

    + have to be future improvements in this area.

    Own Id: OTP-5443

    @@ -1198,7 +1198,7 @@

    Altered the way spawn_link is used in mod_esi to avoid - getting, in this senario unwanted error reports, from + getting, in this scenario unwanted error reports, from spawn_link. (The behavior of spawn_link was altered in a not backwards compatible way.)

    Own Id: OTP-5444

    @@ -1407,7 +1407,7 @@ input, uncovered a logical error in mod_security.erl An already decoded string was sent as input to decode. In this case, as it so happened, the two errors worked - together creating the elution that everthing was right. + together creating the illusion that everything was right. This has now been corrected.

    Own Id: OTP-5083

    @@ -1598,7 +1598,7 @@

    Web server does not handle econnaborted accept result.

    -

    This results in an anneccessary acceptor process restart.

    +

    This results in an unnecessary acceptor process restart.

    (Own Id: OTP-4732)

    @@ -1613,7 +1613,7 @@

    ESI callback generates broken HTTP.

    -

    This was a problem for (atleast) Netscape 4.75. It worked for +

    This was a problem for (at least) Netscape 4.75. It worked for Mozilla 1.4a (on Solaris 8) and rumor has it that it also worked for IE.



    @@ -1811,7 +1811,7 @@ (Own Id: OTP-4281)

    (Aux Id: Seq 7312) - Changing of disk log format failes. Restart of webserver after + Changing of disk log format fails. Restart of webserver after change of disk log format (DiskLogFormat) fails with arg_mismatch.

    diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/notes.xml erlang-13.b.3-dfsg/lib/inets/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/notes.xml 2009-06-05 13:55:48.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/notes.xml 2009-11-20 13:37:17.000000000 +0000 @@ -22,16 +22,288 @@ Inets Release Notes - UAB/F/P Micael Karlberg - UAB/F/P Micael Karlberg + + 2002-02-28 A - notes.sgml + notes.xml +

    Inets 5.2 + +
    Improvements and New Features + + + +

    [ftpc] - Start of the FTP client has been changed in + the following way:

    + + +

    It is now also possible to start a standalone FTP client + process using the re-introduced + ftp:open + function.

    +

    This is an alternative to starting the client using the + inets service framework.

    +

    The old ftp:open/1, undocumented, function, + caused the client to be hooken into the inets service + supervision framework. This is no longer the + case.

    +

    *** POTENTIAL INCOMPATIBILITY ***

    +
    + +

    Previously, the FTP client attempted to use IPv6, + unless otherwise instructed (the ip_v6_disabled + flag), and only used IPv4 if this did not work. + This has now been changed.

    +

    A new option, + ipfamily, + has been introduced, with the default value + inet (IPv4).

    +

    See ftp:open + for more info.

    +

    *** POTENTIAL INCOMPATIBILITY ***

    +
    +
    +

    Own Id: OTP-8258

    + +
    + + +

    The documentation is now built with open source tools + (xsltproc and fop) that exists on most + platforms. One visible change is that the frames are removed.

    +

    Own Id: OTP-8249

    +
    + +
    +
    + +
    Fixed Bugs and Malfunctions + + + + + +

    [httpc] - Streaming to file did not work.

    +

    dizzyd@gmail.com

    +

    Own Id: OTP-8204

    +
    + + +

    [ftpc] - The + ls/2 function (LIST command) + and the + nlist/2 function + (NLST command) + with wildcards did + not work properly.

    +

    These functions is documented as working on directories, but + this is actually not according the standard. The LIST and NLST + commands are specified to operate on a directory or other + group of files, or a file.

    +

    Previously, an attempt was made to check if the listing + returned by the server was actually an error message. This + was done by changing remote directory (cd) into the + (assumed) "directory". This may work if Pathname was actually + a directory, but as this is not always the case, this test + does not work. Instead, we now return the actual server + result and leave the interpretation to the caller.

    +

    *** POTENTIAL INCOMPATIBILITY ***

    +

    Own Id: OTP-8247

    +

    Aux Id: seq11407

    +
    + + +

    [httpc] - Fixes various bugs in timeout and keep-alive queue + handling.

    + + +

    When a queued request times, out the error mssage is sent + the owner of the active request.

    +
    + + +

    Requests in the keep-alive queue is forgotten when + handler terminates.

    +
    + + +

    Timeout out requests are retried.

    +
    +
    +

    Jean-Sébastien Pédron

    +

    Own Id: OTP-8248

    +
    + + +

    [httpd] - Unnecessarily strict matching when handling closing sockets.

    +

    Own Id: OTP-8280

    +
    + +
    +
    + +
    + + +
    Inets 5.1.3 + +
    Improvements and New Features +

    -

    + +
    + +
    Fixed Bugs and Malfunctions + + + + + +

    [httpc] - Raise condition. + When http:request is called and httpc_manager selects a session + where there's already a pending request, then the connection + handler for that session effectively resets its parser, readying + it for the response to the second request. But if there are still + some inbound packets for the response to the first request, things + get confused.

    +

    tomas.abrahamsson@gmail.com

    +

    Own Id: OTP-8154

    +
    + +
    +
    + +
    + + +
    Inets 5.1.2 + + +
    Improvements and New Features + + + + +

    [httpc] - Added http option connect_timeout for http + client request. + The connect_timeout option is used for the initial + request, when the client connects to the server. Default + value is that of the timeout option.

    +

    See the + request/4,5 + function for more info.

    +

    Own Id: OTP-7298

    + +
    + +
    +
    + + +
    Fixed Bugs and Malfunctions + + + + +

    [httpd] - Failed to create listen socket with invalid + option combo. The http-server failed to create its listen + socket when the bind-address was an IPv4-address (a tuple of + size 4) and the ipfamily option was inet6fb4.

    +

    Own Id: OTP-8118

    +

    Aux Id: seq11321

    +
    + + +

    [httpd] - Removed documentation for non-existing function + (httpd_util:header/2,3,4).

    +

    Own Id: OTP-8101

    + +
    + +
    +
    + +
    + + +
    Inets 5.1.1 + + +
    Improvements and New Features + + +

    [httpd] - When starting inets (the web-server) and supplying + a descriptor on the command line + (example: erl -httpd_8888 <descriptor>) + it is now possible to specify which ip-family to use: + inet | inet6 | inet6fb4.

    +

    Example: erl -httpd_8888 10|inet6

    +

    When starting the web-server either using a file with + property list (the proplist_file) or a an property list, + using the ipfamily option: + {ipfamily, inet | inet6 | inet6fb4}.

    +

    Finally, when starting the web-server using the classical + apache-style config file, the BindAddress directive + has been augmented to allow the specification of the + IpFamily: BindAddress blirk.ericsson.se|inet

    +

    Default is inet6fb4 which emulates the + behaviour of the previous version.

    +

    See the + Communication properties + section for more info.

    +

    Own Id: OTP-8069

    +

    Aux Id: seq11086

    +
    + +
    +
    + + +
    Fixed Bugs and Malfunctions + + + + +

    [httpc] - Reception of unexpected data causes handler crash.

    +

    Own Id: OTP-8052

    +
    + +
    +
    + +
    + +
    Inets 5.1
    Improvements and New Features @@ -119,7 +391,7 @@ -

    [httpc] - Unneccessary error report when client +

    [httpc] - Unnecessary error report when client terminating as a result of the server closed the socket unexpectedly.

    Own Id: OTP-7883

    @@ -327,7 +599,7 @@

    [httpd] -The option auth_type for mod_auth is no longer - mandantory, for backward-compatibility reasons.

    + mandatory, for backward-compatibility reasons.

    Own Id: OTP-7341

    @@ -649,8 +921,8 @@
    -

    For information about older versions see - release notes history.

    +
    diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/inets/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/part_notes.xml 2009-03-12 12:31:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/part_notes.xml 2009-11-20 13:37:17.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20022009 @@ -33,7 +33,7 @@

    For information about older versions see release notes history.

    - + diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/part.xml erlang-13.b.3-dfsg/lib/inets/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/part.xml 2009-03-12 12:32:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/part.xml 2009-11-20 13:37:37.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20042009 @@ -33,10 +33,10 @@ related services. Currently supported are a HTTP client, a HTTP server a FTP client and a TFTP client and server.

    - - - - + + + + diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/inets/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/ref_man.xml 2009-03-12 12:28:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/ref_man.xml 2009-11-20 13:35:56.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19972009 @@ -33,18 +33,18 @@ servers. Currently a FTP client, a HTTP client and server, and a tftp client and server has been incorporated in Inets.

    - - - - - - - - - - - - + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/inets/doc/src/tftp.xml erlang-13.b.3-dfsg/lib/inets/doc/src/tftp.xml --- erlang-13.b.1-dfsg/lib/inets/doc/src/tftp.xml 2009-03-12 12:32:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/doc/src/tftp.xml 2009-11-20 13:37:41.000000000 +0000 @@ -123,7 +123,7 @@ setuid_socket_wrap. Then the command line argument "-tftpd_69 22" will trigger the prebound file descriptor 22 to be used instead of opening port 69. - The UDP option {udp, [{fd, 22}]} autmatically be added. + The UDP option {udp, [{fd, 22}]} automatically be added. See init:get_argument/ about command line arguments and gen_udp:open/2 about UDP options.

    @@ -401,7 +401,7 @@ open/5 with the registered initial callback state. open/5 is expected to open the (virtual) file. Then either the read/1 or write/2 functions are invoked - repeatedly, once per transfererred block. At each function call + repeatedly, once per transferred block. At each function call the state returned from the previous call is obtained. When the last block has been encountered the read/1 or write/2 functions is expected to close the (virtual) file @@ -503,9 +503,9 @@

    Opens a file for read or write access.

    On the client side where the open/5 call has been - preceeded by a call to prepare/5, all options must be + preceded by a call to prepare/5, all options must be accepted or rejected.

    -

    On the server side, where there is no preceeding +

    On the server side, where there is no preceding prepare/5 call, no new options may be added, but the ones that are present in SuggestedOptions may be omitted or replaced with new values in AcceptedOptions.

    diff -Nru erlang-13.b.1-dfsg/lib/inets/examples/server_root/conf/httpd.conf erlang-13.b.3-dfsg/lib/inets/examples/server_root/conf/httpd.conf --- erlang-13.b.1-dfsg/lib/inets/examples/server_root/conf/httpd.conf 2004-09-14 13:00:07.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/examples/server_root/conf/httpd.conf 2009-09-18 13:47:35.000000000 +0100 @@ -1,3 +1,23 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# + # Port: The port the standalone listens to. For ports < 1023, you will # need httpd to be run as root initially. @@ -6,8 +26,21 @@ # BindAddress: This directive is used to tell the server which IP address # to listen to. It can either contain "*", an IP address, or a fully # qualified Internet domain name. +# +# It is also possible to specify the ip-family with the directive. +# There ar three possible value: inet, inet6 and inet6fb4 +# inet: Use IpFamily inet when retreiving the address and +# fail if that does not work. +# inet6: Use IpFamily inet6 when retreiving the address and +# fail if that does not work. +# inet6fb4: First IpFamily inet6 is tried and if that does not work, +# inet is used as fallback. +# Default value for ip-family is inet6fb4 +# +# The syntax is:
    [|] # #BindAddress * +#BindAddress *|inet # ServerName allows you to set a host name which is sent back to clients for diff -Nru erlang-13.b.1-dfsg/lib/inets/src/ftp/ftp.erl erlang-13.b.3-dfsg/lib/inets/src/ftp/ftp.erl --- erlang-13.b.1-dfsg/lib/inets/src/ftp/ftp.erl 2009-06-05 13:55:03.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/ftp/ftp.erl 2009-11-20 13:35:56.000000000 +0000 @@ -25,10 +25,7 @@ -behaviour(gen_server). -behaviour(inets_service). --deprecated({open, 1, next_major_release}). --deprecated({open, 2, next_major_release}). -deprecated({open, 3, next_major_release}). --deprecated({close, 1, next_major_release}). -deprecated({force_active, 1, next_major_release}). %% API - Client interface @@ -51,7 +48,7 @@ handle_info/2, terminate/2, code_change/3]). %% supervisor callbacks --export([start_link/1]). +-export([start_link/1, start_link/2]). %% Behavior callbacks -export([start_standalone/1, start_service/1, @@ -61,7 +58,8 @@ %% Constante used in internal state definition -define(CONNECTION_TIMEOUT, 60*1000). --define(DEFAULT_MODE, passive). +-define(DEFAULT_MODE, passive). +-define(PROGRESS_DEFAULT, ignore). %% Internal Constants -define(FTP_PORT, 21). @@ -69,16 +67,16 @@ %% Internal state -record(state, { - csock = undefined, % socket() - Control connection socket - dsock = undefined, % socket() - Data connection socket + csock = undefined, % socket() - Control connection socket + dsock = undefined, % socket() - Data connection socket verbose = false, % boolean() - ldir = undefined, % string() - Current local directory - type = ftp_server_default, % atom() - binary | ascii - chunk = false, % boolean() - Receiving data chunks - mode = ?DEFAULT_MODE, % passive | active + ldir = undefined, % string() - Current local directory + type = ftp_server_default, % atom() - binary | ascii + chunk = false, % boolean() - Receiving data chunks + mode = ?DEFAULT_MODE, % passive | active timeout = ?CONNECTION_TIMEOUT, % integer() %% Data received so far on the data connection - data = <<>>, % binary() + data = <<>>, % binary() %% Data received so far on the control connection %% {BinStream, AccLines}. If a binary sequence %% ends with ?CR then keep it in the binary to @@ -91,13 +89,15 @@ %% Function that activated a connection and maybe some %% data needed further on. caller = undefined, % term() - ip_v6_disabled, % boolean() + ipfamily, % inet | inet6 | inet6fb4 progress = ignore % ignore | pid() }). + %%%========================================================================= %%% API - CLIENT FUNCTIONS %%%========================================================================= + %%-------------------------------------------------------------------------- %% open(HostOrOtpList, , ) -> {ok, Pid} | {error, ehost} %% HostOrOtpList = string() | [{option_list, Options}] @@ -107,29 +107,84 @@ %% %% Description: Start an ftp client and connect to a host. %%-------------------------------------------------------------------------- -open({option_list, Options})-> - Flags = key_search(flags, Options, []), - {ok, Pid} = ftp_sup:start_child([[[{client, self()}, Flags], []]]), - call(Pid, {open, ip_comm, Options}, pid); - -%% The only option was the tuple form of the ip-number -open(Host) when is_tuple(Host) -> - open(Host, ?FTP_PORT, []); - -%% Host is the string form of the hostname -open(Host)-> - open(Host, ?FTP_PORT, []). +%% +open({option_list, Options}) when is_list(Options) -> + try + {ok, StartOptions} = start_options(Options), + {ok, OpenOptions} = open_options(Options), + case ftp_sup:start_child([[[{client, self()} | StartOptions], []]]) of + {ok, Pid} -> + call(Pid, {open, ip_comm, OpenOptions}, plain); + Error1 -> + Error1 + end + catch + throw:Error2 -> + Error2 + end; +%% + +open(Host) -> + open(Host, []). + +%% open(Host, Port) when is_integer(Port) -> - open(Host, Port, []); + open(Host, [{port, Port}]); +%% + +%% +open(Host, [H|_] = Flags) when is_atom(H) -> + open(Host, ?FTP_PORT, Flags); +%% + +open(Host, Opts) when is_list(Opts) -> + ?fcrt("open", [{host, Host}, {opts, Opts}]), + try + {ok, StartOptions} = start_options(Opts), + ?fcrt("open", [{start_options, StartOptions}]), + {ok, OpenOptions} = open_options([{host, Host}|Opts]), + ?fcrt("open", [{open_options, OpenOptions}]), + case start_link(StartOptions, []) of + {ok, Pid} -> + ?fcrt("open - ok", [{pid, Pid}]), + call(Pid, {open, ip_comm, OpenOptions}, plain); + Error1 -> + ?fcrt("open - error", [{error1, Error1}]), + Error1 + end + catch + throw:Error2 -> + ?fcrt("open - error", [{error2, Error2}]), + Error2 + end. -open(Host, Flags) when is_list(Flags) -> - open(Host, ?FTP_PORT, Flags). +%% open(Host, Port, Flags) when is_integer(Port) andalso is_list(Flags) -> - {ok, Pid} = ftp_sup:start_child([[[{client, self()}, Flags], []]]), - Opts = [{host, Host}, {port, Port}| Flags], - call(Pid, {open, ip_comm, Opts}, pid). + ?fcrt("open", [{host, Host}, {port, Port}, {flags, Flags}]), + try + {ok, StartOptions} = start_options([{flags, Flags}]), + ?fcrt("open", [{start_options, StartOptions}]), + {ok, OpenOptions} = open_options([{host, Host}, {port, Port}|Flags]), + ?fcrt("open", [{open_options, OpenOptions}]), + case ftp_sup:start_child([[{client, self()} | StartOptions], []]) of + {ok, Pid} -> + ?fcrt("open - ok", [{pid, Pid}]), + call(Pid, {open, ip_comm, OpenOptions}, plain); + Error1 -> + ?fcrt("open - error", [{error1, Error1}]), + Error1 + end + catch + throw:Error2 -> + Error2 + end. +%% + + + + %%-------------------------------------------------------------------------- %% user(Pid, User, Pass, ) -> ok | {error, euser} | {error, econn} @@ -196,14 +251,16 @@ call(Pid, {lcd, Dir}, string). %%-------------------------------------------------------------------------- -%% ls(Pid, ) -> {ok, Listing} | {error, epath} | {error, elogin} | -%% {error, econn} +%% ls(Pid) -> Result +%% ls(Pid, ) -> Result +%% %% Pid = pid() %% Dir = string() +%% Result = {ok, Listing} | {error, Reason} %% Listing = string() +%% Reason = epath | elogin | econn %% -%% Description: List the contents of current directory (ls/1) or -%% directory Dir (ls/2) at remote server. +%% Description: Returns a list of files in long format. %%-------------------------------------------------------------------------- ls(Pid) -> ls(Pid, ""). @@ -211,14 +268,16 @@ call(Pid, {dir, long, Dir}, string). %%-------------------------------------------------------------------------- -%% nlist(Pid, ) -> {ok, Listing} | {error, epath} | {error, elogin} | -%% {error, econn} +%% nlist(Pid) -> Result +%% nlist(Pid, Pathname) -> Result +%% %% Pid = pid() -%% Dir = string() +%% Pathname = string() +%% Result = {ok, Listing} | {error, Reason} +%% Listing = string() +%% Reason = epath | elogin | econn %% -%% Description: List the contents of current directory (ls/1) or directory -%% Dir (ls/2) at remote server. The returned list is a stream -%% of file names. +%% Description: Returns a list of files in short format %%-------------------------------------------------------------------------- nlist(Pid) -> nlist(Pid, ""). @@ -491,18 +550,40 @@ info(Pid) -> call(Pid, info, list). + + %%%======================================================================== %%% Behavior callbacks %%%======================================================================== start_standalone(Options) -> - Flags = key_search(flags, Options, []), - {ok, Pid} = start_link([[{client, self()}, Flags], []]), - call(Pid, {open, ip_comm, Options}, pid). + try + {ok, StartOptions} = start_options(Options), + {ok, OpenOptions} = open_options(Options), + case start_link(StartOptions, []) of + {ok, Pid} -> + call(Pid, {open, ip_comm, OpenOptions}, plain); + Error1 -> + Error1 + end + catch + throw:Error2 -> + Error2 + end. start_service(Options) -> - Flags = key_search(flags, Options, []), - {ok, Pid} = ftp_sup:start_child([[[{client, self()}, Flags], []]]), - call(Pid, {open, ip_comm, Options}, pid). + try + {ok, StartOptions} = start_options(Options), + {ok, OpenOptions} = open_options(Options), + case ftp_sup:start_child([[[{client, self()} | StartOptions], []]]) of + {ok, Pid} -> + call(Pid, {open, ip_comm, OpenOptions}, plain); + Error1 -> + Error1 + end + catch + throw:Error2 -> + Error2 + end. stop_service(Pid) -> close(Pid). @@ -517,6 +598,155 @@ proplists:lookup(peer, Info), proplists:lookup(peer_port, Info)]}. + +%% This function extracts the start options from the +%% Valid options: +%% debug, +%% verbose +%% ipfamily +%% priority +%% flags (for backward compatibillity) +start_options(Options) -> + ?fcrt("start_options", [{options, Options}]), + case lists:keysearch(flags, 1, Options) of + {value, {flags, Flags}} -> + Verbose = lists:member(verbose, Flags), + IsTrace = lists:member(trace, Flags), + IsDebug = lists:member(debug, Flags), + DebugLevel = + if + (IsTrace =:= true) -> + trace; + IsDebug =:= true -> + debug; + true -> + disable + end, + {ok, [{verbose, Verbose}, + {debug, DebugLevel}, + {priority, low}]}; + false -> + ValidateVerbose = + fun(true) -> true; + (false) -> true; + (_) -> false + end, + ValidateDebug = + fun(trace) -> true; + (debug) -> true; + (disable) -> true; + (_) -> false + end, + ValidatePriority = + fun(low) -> true; + (normal) -> true; + (high) -> true; + (_) -> false + end, + ValidOptions = + [{verbose, ValidateVerbose, false, false}, + {debug, ValidateDebug, false, disable}, + {priority, ValidatePriority, false, low}], + validate_options(Options, ValidOptions, []) + end. + + +%% This function extracts and validates the open options from the +%% Valid options: +%% mode +%% host +%% port +%% timeout +%% progress +open_options(Options) -> + ?fcrt("open_options", [{options, Options}]), + ValidateMode = + fun(active) -> true; + (passive) -> true; + (_) -> false + end, + ValidateHost = + fun(Host) when is_list(Host) -> + true; + (Host) when is_tuple(Host) andalso + ((size(Host) =:= 4) orelse (size(Host) =:= 8)) -> + true; + (_) -> + false + end, + ValidatePort = + fun(Port) when is_integer(Port) andalso (Port > 0) -> true; + (_) -> false + end, + ValidateIpFamily = + fun(inet) -> true; + (inet6) -> true; + (inet6fb4) -> true; + (_) -> false + end, + ValidateTimeout = + fun(Timeout) when is_integer(Timeout) andalso (Timeout > 0) -> true; + (_) -> false + end, + ValidateProgress = + fun(ignore) -> + true; + ({Mod, Func, _InitProgress}) when is_atom(Mod) andalso + is_atom(Func) -> + true; + (_) -> + false + end, + ValidOptions = + [{mode, ValidateMode, false, ?DEFAULT_MODE}, + {host, ValidateHost, true, ehost}, + {port, ValidatePort, false, ?FTP_PORT}, + {ipfamily, ValidateIpFamily, false, inet}, + {timeout, ValidateTimeout, false, ?CONNECTION_TIMEOUT}, + {progress, ValidateProgress, false, ?PROGRESS_DEFAULT}], + validate_options(Options, ValidOptions, []). + +validate_options([], [], Acc) -> + ?fcrt("validate_options -> done", [{acc, Acc}]), + {ok, lists:reverse(Acc)}; +validate_options([], ValidOptions, Acc) -> + ?fcrt("validate_options -> done", + [{valid_options, ValidOptions}, {acc, Acc}]), + %% Check if any mandatory options are missing! + case [{Key, Reason} || {Key, _, true, Reason} <- ValidOptions] of + [] -> + Defaults = + [{Key, Default} || {Key, _, _, Default} <- ValidOptions], + {ok, lists:reverse(Defaults ++ Acc)}; + [{_, Reason}|_Missing] -> + throw({error, Reason}) + end; +validate_options([{Key, Value}|Options], ValidOptions, Acc) -> + ?fcrt("validate_options -> check", + [{key, Key}, {value, Value}, {acc, Acc}]), + case lists:keysearch(Key, 1, ValidOptions) of + {value, {Key, Validate, _, Default}} -> + case (catch Validate(Value)) of + true -> + ?fcrt("validate_options -> check - accept", []), + NewValidOptions = lists:keydelete(Key, 1, ValidOptions), + validate_options(Options, NewValidOptions, + [{Key, Value} | Acc]); + _ -> + ?fcrt("validate_options -> check - reject", + [{default, Default}]), + NewValidOptions = lists:keydelete(Key, 1, ValidOptions), + validate_options(Options, NewValidOptions, + [{Key, Default} | Acc]) + end; + false -> + validate_options(Options, ValidOptions, Acc) + end; +validate_options([_|Options], ValidOptions, Acc) -> + validate_options(Options, ValidOptions, Acc). + + + %%%======================================================================== %%% gen_server callback functions %%%======================================================================== @@ -525,41 +755,55 @@ %% init(Args) -> {ok, State} | {ok, State, Timeout} | {stop, Reason} %% Description: Initiates the erlang process that manages a ftp connection. %%------------------------------------------------------------------------- -init([{client, ClientPid}, Flags]) -> +init(Options) -> process_flag(trap_exit, true), - erlang:monitor(process, ClientPid), + + %% Keep track of the client + {value, {client, Client}} = lists:keysearch(client, 1, Options), + erlang:monitor(process, Client), + + %% Make sure inet is started inet_db:start(), - {ok, LDir} = file:get_cwd(), - State = case is_debug(Flags) or is_trace(Flags) of - true -> - dbg:tracer(), - dbg:p(all, [call]), - case is_debug(Flags) of - true -> - dbg:tp(ftp, [{'_', [], [{return_trace}]}]), - dbg:tp(ftp_response, [{'_', [], - [{return_trace}]}]), - dbg:tp(ftp_progress, [{'_', [], - [{return_trace}]}]); - false -> %trace - dbg:tpl(ftp, [{'_', [], [{return_trace}]}]), - dbg:tpl(ftp_response, [{'_', [], - [{return_trace}]}]), - dbg:tpl(ftp_progress, [{'_', [], - [{return_trace}]}]) - end, - #state{ldir = LDir}; - false -> - case is_verbose(Flags) of - true -> - #state{verbose = true, ldir = LDir}; - false -> - #state{ldir = LDir} - end - end, - process_flag(priority, low), - {ok, State#state{owner = ClientPid, - ip_v6_disabled = is_ipv6_disabled(Flags)}}. + + %% Where are we + {ok, Dir} = file:get_cwd(), + + %% Maybe activate dbg + case key_search(debug, Options, disable) of + trace -> + dbg:tracer(), + dbg:p(all, [call]), + dbg:tpl(ftp, [{'_', [], [{return_trace}]}]), + dbg:tpl(ftp_response, [{'_', [], [{return_trace}]}]), + dbg:tpl(ftp_progress, [{'_', [], [{return_trace}]}]); + debug -> + dbg:tracer(), + dbg:p(all, [call]), + dbg:tp(ftp, [{'_', [], [{return_trace}]}]), + dbg:tp(ftp_response, [{'_', [], [{return_trace}]}]), + dbg:tp(ftp_progress, [{'_', [], [{return_trace}]}]); + _ -> + %% Keep silent + ok + end, + + %% Verbose? + Verbose = key_search(verbose, Options, false), + + %% IpFamily? + IpFamily = key_search(ipfamily, Options, inet), + + State = #state{owner = Client, + verbose = Verbose, + ipfamily = IpFamily, + ldir = Dir}, + + %% Set process prio + Priority = key_search(priority, Options, low), + process_flag(priority, Priority), + + %% And we are done + {ok, State}. %%-------------------------------------------------------------------------- @@ -570,65 +814,87 @@ %% {stop, Reason, Reply, State} | %% Description: Handle incoming requests. %%------------------------------------------------------------------------- -handle_call({_, info}, _, #state{verbose = Verbose, - mode = Mode, - timeout = Timeout, - ip_v6_disabled = IPv6Disabled, - csock = Socket, - progress = Progress} = State) -> - {ok, {_, LocalPort}} = inet:sockname(Socket), + +%% Anyone can ask this question +handle_call({_, info}, _, #state{verbose = Verbose, + mode = Mode, + timeout = Timeout, + ipfamily = IpFamily, + csock = Socket, + progress = Progress} = State) -> + {ok, {_, LocalPort}} = inet:sockname(Socket), {ok, {Address, Port}} = inet:peername(Socket), - Options = [{flags, [{verbose, Verbose}, {ip_v6_disabled, IPv6Disabled}]}, - {mode, Mode}, {peer, Address}, {local_port, LocalPort}, - {peer_port, Port}, - {timeout, Timeout}, {progress, Progress}], + Options = [{verbose, Verbose}, + {ipfamily, IpFamily}, + {mode, Mode}, + {peer, Address}, + {peer_port, Port}, + {local_port, LocalPort}, + {timeout, Timeout}, + {progress, Progress}], {reply, {ok, Options}, State}; +%% But everything else must come from the owner handle_call({Pid, _}, _, #state{owner = Owner} = State) when Owner =/= Pid -> {reply, {error, not_connection_owner}, State}; handle_call({_, {open, ip_comm, Opts}}, From, State) -> + ?fcrd("handle_call(open)", [{opts, Opts}]), case key_search(host, Opts, undefined) of undefined -> {stop, normal, {error, ehost}, State}; Host -> - IsPosInt = fun(Int) when is_integer(Int) andalso (Int > 0) -> - true; - (_) -> - false - end, + Mode = key_search(mode, Opts, ?DEFAULT_MODE), + Port = key_search(port, Opts, ?FTP_PORT), + Timeout = key_search(timeout, Opts, ?CONNECTION_TIMEOUT), + Progress = key_search(progress, Opts, ignore), - IsModeAtom = fun(active) -> - true; - (passive) -> - true; - (_) -> - false - end, - - Mode = check_option(IsModeAtom, - key_search(mode, Opts, ?DEFAULT_MODE), - ?DEFAULT_MODE), - Port = check_option(IsPosInt, key_search(port, Opts, ?FTP_PORT), - ?FTP_PORT), - Timeout = check_option(IsPosInt, key_search(timeout, Opts, - ?CONNECTION_TIMEOUT), - ?CONNECTION_TIMEOUT), - ProgressOptions = key_search(progress, Opts, ignore), - - setup_ctrl_connection(Host, Port, Timeout, - State#state{client = From, mode = Mode, - progress = - progress(ProgressOptions)}) + State2 = State#state{client = From, + mode = Mode, + progress = progress(Progress)}, + + ?fcrd("handle_call(open) -> setup ctrl connection with", + [{host, Host}, {port, Port}, {timeout, Timeout}]), + case setup_ctrl_connection(Host, Port, Timeout, State2) of + {ok, State3, WaitTimeout} -> + ?fcrd("handle_call(open) -> ctrl connection setup done", + [{waittimeout, WaitTimeout}]), + {noreply, State3, WaitTimeout}; + {error, Reason} -> + ?fcrd("handle_call(open) -> ctrl connection setup failed", + [{reason, Reason}]), + gen_server:reply(From, {error, ehost}), + {stop, normal, State2#state{client = undefined}} + end + end; + +handle_call({_, {open, ip_comm, Host, Opts}}, From, State) -> + Mode = key_search(mode, Opts, ?DEFAULT_MODE), + Port = key_search(port, Opts, ?FTP_PORT), + Timeout = key_search(timeout, Opts, ?CONNECTION_TIMEOUT), + Progress = key_search(progress, Opts, ignore), + + State2 = State#state{client = From, + mode = Mode, + progress = progress(Progress)}, + + case setup_ctrl_connection(Host, Port, Timeout, State2) of + {ok, State3, WaitTimeout} -> + {noreply, State3, WaitTimeout}; + {error, _Reason} -> + gen_server:reply(From, {error, ehost}), + {stop, normal, State2#state{client = undefined}} end; handle_call({_, force_active}, _, State) -> {reply, ok, State#state{mode = active}}; -handle_call({_, {user, User, Password}}, From, State) -> +handle_call({_, {user, User, Password}}, From, + #state{csock = CSock} = State) when (CSock =/= undefined) -> handle_user(User, Password, "", State#state{client = From}); -handle_call({_, {user, User, Password, Acc}}, From, State) -> +handle_call({_, {user, User, Password, Acc}}, From, + #state{csock = CSock} = State) when (CSock =/= undefined) -> handle_user(User, Password, Acc, State#state{client = From}); handle_call({_, {account, Acc}}, From, State)-> @@ -642,8 +908,7 @@ handle_call({_, lpwd}, From, #state{ldir = LDir} = State) -> {reply, {ok, LDir}, State#state{client = From}}; -handle_call({_, {cd, Dir}}, From, #state{chunk = false} - = State) -> +handle_call({_, {cd, Dir}}, From, #state{chunk = false} = State) -> send_ctrl_message(State, mk_cmd("CWD ~s", [Dir])), activate_ctrl_connection(State), {noreply, State#state{client = From, caller = cd}}; @@ -782,6 +1047,10 @@ activate_ctrl_connection(State), {noreply, State#state{client = From, caller = quote}}; +handle_call({_, _Req}, _From, #state{csock = CSock} = State) + when (CSock =:= undefined) -> + {reply, {error, not_connected}, State}; + handle_call(_, _, #state{chunk = true} = State) -> {reply, {error, echunk}, State}; @@ -812,7 +1081,7 @@ %% Catch all - This can oly happen if the application programmer writes %% really bad code that violates the API. handle_cast(Msg, State) -> - {stop, {'API_violation_connection_colsed', Msg}, State}. + {stop, {'API_violation_connection_closed', Msg}, State}. %%-------------------------------------------------------------------------- %% handle_info(Msg, State) -> {noreply, State} | {noreply, State, Timeout} | @@ -983,21 +1252,88 @@ end, ok. -code_change(_, State, _) -> +code_change(_Vsn, State1, upgrade_from_pre_5_12) -> + {state, CSock, DSock, Verbose, LDir, Type, Chunk, Mode, Timeout, + Data, CtrlData, Owner, Client, Caller, IPv6Disable, Progress} = State1, + IpFamily = + if + (IPv6Disable =:= true) -> + inet; + true -> + inet6fb4 + end, + State2 = #state{csock = CSock, + dsock = DSock, + verbose = Verbose, + ldir = LDir, + type = Type, + chunk = Chunk, + mode = Mode, + timeout = Timeout, + data = Data, + ctrl_data = CtrlData, + owner = Owner, + client = Client, + caller = Caller, + ipfamily = IpFamily, + progress = Progress}, + {ok, State2}; + +code_change(_Vsn, State1, downgrade_to_pre_5_12) -> + #state{csock = CSock, + dsock = DSock, + verbose = Verbose, + ldir = LDir, + type = Type, + chunk = Chunk, + mode = Mode, + timeout = Timeout, + data = Data, + ctrl_data = CtrlData, + owner = Owner, + client = Client, + caller = Caller, + ipfamily = IpFamily, + progress = Progress} = State1, + IPv6Disable = + if + (IpFamily =:= inet) -> + true; + true -> + false + end, + State2 = + {state, CSock, DSock, Verbose, LDir, Type, Chunk, Mode, Timeout, + Data, CtrlData, Owner, Client, Caller, IPv6Disable, Progress}, + {ok, State2}; + +code_change(_Vsn, State, _Extra) -> {ok, State}. + %%%========================================================================= %% Start/stop %%%========================================================================= %%-------------------------------------------------------------------------- -%% start_link([Args, Options]) -> {ok, Pid} | {error, Reason} +%% start_link([Opts, GenServerOptions]) -> {ok, Pid} | {error, Reason} %% %% Description: Callback function for the ftp supervisor. It is called %% : when start_service/1 calls ftp_sup:start_child/1 to start an %% : instance of the ftp process. Also called by start_standalone/1 %%-------------------------------------------------------------------------- -start_link([Args, Options]) -> - gen_server:start_link(?MODULE, Args, Options). +start_link([Opts, GenServerOptions]) -> + start_link(Opts, GenServerOptions). + +start_link(Opts, GenServerOptions) -> + case lists:keysearch(client, 1, Opts) of + {value, _} -> + %% Via the supervisor + gen_server:start_link(?MODULE, Opts, GenServerOptions); + false -> + Opts2 = [{client, self()} | Opts], + gen_server:start_link(?MODULE, Opts2, GenServerOptions) + end. + %%% Stop functionality is handled by close/1 @@ -1024,6 +1360,7 @@ activate_ctrl_connection(State), {noreply, State#state{caller = handle_user_account}}. + %%-------------------------------------------------------------------------- %% handle_ctrl_result %%-------------------------------------------------------------------------- @@ -1053,64 +1390,68 @@ ctrl_result_response(Status, State, {error, Lines}); %% Data connection setup passive mode -handle_ctrl_result({pos_compl, Lines}, #state{mode = passive, - ip_v6_disabled = false, - client=From, - caller = - {setup_data_connection, - Caller}, - csock = CSock, - timeout = Timeout} +handle_ctrl_result({pos_compl, Lines}, + #state{mode = passive, + ipfamily = inet6, + client = From, + caller = {setup_data_connection, Caller}, + csock = CSock, + timeout = Timeout} = State) -> [_, PortStr | _] = lists:reverse(string:tokens(Lines, "|")), {ok, {IP, _}} = inet:peername(CSock), case connect(IP, list_to_integer(PortStr), Timeout, State) of - {_,{ok, Socket}} -> + {ok, _, Socket} -> handle_caller(State#state{caller = Caller, dsock = Socket}); - {_,{error,Reason}} -> - gen_server:reply(From,{error,Reason}), - {noreply,State#state{client = undefined, caller = undefined}} + {error, _Reason} = Error -> + gen_server:reply(From, Error), + {noreply, State#state{client = undefined, caller = undefined}} end; handle_ctrl_result({pos_compl, Lines}, - #state{mode = passive, ip_v6_disabled = true, - client=From, - caller = {setup_data_connection, Caller}, - timeout = Timeout} = State) -> + #state{mode = passive, + ipfamily = inet, + client = From, + caller = {setup_data_connection, Caller}, + timeout = Timeout} = State) -> {_, [?LEFT_PAREN | Rest]} = lists:splitwith(fun(?LEFT_PAREN) -> false; (_) -> true end, Lines), {NewPortAddr, _} = lists:splitwith(fun(?RIGHT_PAREN) -> false; (_) -> true end, Rest), - [A1, A2, A3, A4, P1, P2] = lists:map(fun(X) -> list_to_integer(X) end, - string:tokens(NewPortAddr, [$,])), - case connect({A1, A2, A3, A4}, (P1 * 256) + P2, Timeout, State) of - {_,{ok,Socket}} -> + [A1, A2, A3, A4, P1, P2] = + lists:map(fun(X) -> list_to_integer(X) end, + string:tokens(NewPortAddr, [$,])), + IP = {A1, A2, A3, A4}, + Port = (P1 * 256) + P2, + case connect(IP, Port, Timeout, State) of + {ok, _, Socket} -> handle_caller(State#state{caller = Caller, dsock = Socket}); - {_,{error,Reason}} -> - gen_server:reply(From,{error,Reason}), + {error, _Reason} = Error -> + gen_server:reply(From, Error), {noreply,State#state{client = undefined, caller = undefined}} end; -%% FTP server does not support passive mode try to fallback on active mode -handle_ctrl_result(_, #state{mode = passive, caller = {setup_data_connection, - Caller}} = State) -> +%% FTP server does not support passive mode: try to fallback on active mode +handle_ctrl_result(_, + #state{mode = passive, + caller = {setup_data_connection, Caller}} = State) -> setup_data_connection(State#state{mode = active, caller = Caller}); + %%-------------------------------------------------------------------------- %% User handling -handle_ctrl_result({pos_interm, _}, #state{caller = - {handle_user, PassWord, Acc}} - = State) -> +handle_ctrl_result({pos_interm, _}, + #state{caller = {handle_user, PassWord, Acc}} = State) -> handle_user_passwd(PassWord, Acc, State); handle_ctrl_result({Status, _}, #state{caller = {handle_user, _, _}} = State) -> ctrl_result_response(Status, State, {error, euser}); %% Accounts -handle_ctrl_result({pos_interm_acct, _}, #state{caller = - {handle_user_passwd, Acc}} = - State) when Acc =/= "" -> +handle_ctrl_result({pos_interm_acct, _}, + #state{caller = {handle_user_passwd, Acc}} = State) + when Acc =/= "" -> handle_user_account(Acc, State); handle_ctrl_result({Status, _}, #state{caller = {handle_user_passwd, _}} = State) -> @@ -1118,8 +1459,8 @@ %%-------------------------------------------------------------------------- %% Print current working directory -handle_ctrl_result({pos_compl, Lines}, #state{caller = pwd, - client = From} = State) -> +handle_ctrl_result({pos_compl, Lines}, + #state{caller = pwd, client = From} = State) -> Dir = pwd_result(Lines), gen_server:reply(From, {ok, Dir}), {noreply, State#state{client = undefined, caller = undefined}}; @@ -1140,24 +1481,33 @@ {noreply, State#state{client = undefined, caller = undefined}}; _ -> - %% If there is only one line it might be a directory with on - %% file but it might be an error message that the directory - %% was not found. So in this case we have to endure a little - %% overhead to be able to give a good return value. Alas not - %% all ftp implementations behave the same and returning - %% an error string is allowed by the FTP RFC. - case lists:dropwhile(fun(?CR) -> false;(_) -> true end, - binary_to_list(Data)) of - L when (L =:= [?CR, ?LF]) orelse ( L =:= []) -> - send_ctrl_message(State, mk_cmd("PWD", [])), - activate_ctrl_connection(State), - {noreply, - State#state{caller = {handle_dir_data, Dir, Data}}}; - _ -> - gen_server:reply(From, {ok, Data}), - {noreply, State#state{client = undefined, - caller = undefined}} - end + %% + %% Dir cannot be assumed to be a dir. It is a string that + %% could be a dir, but could also be a file or even a string + %% containing wildcards (*). + %% + %% %% If there is only one line it might be a directory with one + %% %% file but it might be an error message that the directory + %% %% was not found. So in this case we have to endure a little + %% %% overhead to be able to give a good return value. Alas not + %% %% all ftp implementations behave the same and returning + %% %% an error string is allowed by the FTP RFC. + %% case lists:dropwhile(fun(?CR) -> false;(_) -> true end, + %% binary_to_list(Data)) of + %% L when (L =:= [?CR, ?LF]) orelse (L =:= []) -> + %% send_ctrl_message(State, mk_cmd("PWD", [])), + %% activate_ctrl_connection(State), + %% {noreply, + %% State#state{caller = {handle_dir_data, Dir, Data}}}; + %% _ -> + %% gen_server:reply(From, {ok, Data}), + %% {noreply, State#state{client = undefined, + %% caller = undefined}} + %% end + %% + gen_server:reply(From, {ok, Data}), + {noreply, State#state{client = undefined, + caller = undefined}} end; handle_ctrl_result({pos_compl, Lines}, @@ -1353,29 +1703,21 @@ %% Connect to FTP server at Host (default is TCP port 21) %% in order to establish a control connection. -setup_ctrl_connection(Host, Port, Timeout, State)-> +setup_ctrl_connection(Host, Port, Timeout, State) -> MsTime = millisec_time(), case connect(Host, Port, Timeout, State) of - {Ipv, {ok, CSock}} -> - NewState = - case Ipv of - ipv4 -> - State#state{csock = CSock, ip_v6_disabled = true}; - ipv6 -> - State#state{csock = CSock} - end, + {ok, IpFam, CSock} -> + NewState = State#state{csock = CSock, ipfamily = IpFam}, activate_ctrl_connection(NewState), case Timeout - (millisec_time() - MsTime) of Timeout2 when (Timeout2 >= 0) -> - {noreply, NewState#state{caller = open}, Timeout2}; + {ok, NewState#state{caller = open}, Timeout2}; _ -> %% Oups: Simulate timeout - self() ! timeout, - {noreply, NewState#state{caller = open}} + {ok, NewState#state{caller = open}, 0} end; - {_,{error, _}} -> - gen_server:reply(State#state.client, {error, ehost}), - {stop, normal, State#state{client = undefined}} + Error -> + Error end. setup_data_connection(#state{mode = active, @@ -1410,50 +1752,75 @@ {LSock, Caller}}}} end; -setup_data_connection(#state{mode = passive, ip_v6_disabled = false, +setup_data_connection(#state{mode = passive, ipfamily = inet6, caller = Caller} = State) -> send_ctrl_message(State, mk_cmd("EPSV", [])), activate_ctrl_connection(State), {noreply, State#state{caller = {setup_data_connection, Caller}}}; -setup_data_connection(#state{mode = passive, ip_v6_disabled = true, +setup_data_connection(#state{mode = passive, ipfamily = inet, caller = Caller} = State) -> send_ctrl_message(State, mk_cmd("PASV", [])), activate_ctrl_connection(State), {noreply, State#state{caller = {setup_data_connection, Caller}}}. -connect(Host = {_,_,_,_}, Port, TimeOut, _) -> - {ipv4, gen_tcp:connect(Host, Port,[binary, {packet, 0}, {active, false}] , - TimeOut)}; -connect(Host = {_,_,_,_,_,_,_,_}, Port, TimeOut, - #state{ip_v6_disabled = false}) -> - {ipv6, gen_tcp:connect(Host, Port, - [binary, {packet, 0}, {active, false}, inet6], - TimeOut)}; -connect(Host, Port, TimeOut, #state{ip_v6_disabled = false}) -> - {Opts, NewHost, Ipv} = - case (inet:getaddr(Host, inet6)) of - %% If an ipv4-mapped ipv6 address is returned - %% use ipv4 directly as some ftp-servers does not - %% handle "ip4-ipv6-compatiblity" mode well! - {ok, IP = {0, 0, 0, 0, 0, 16#ffff, _, _}} -> - case inet:getaddr(Host, inet) of - {ok,NewIP} -> - {[binary, {packet, 0}, {active, false}], NewIP, ipv4}; - _Error -> - {[binary, {packet, 0}, {active, false}, inet6], - IP,ipv6} - end; - {ok, IP} -> - {[binary, {packet, 0}, {active, false}, inet6], IP, ipv6}; - {error, _} -> - {[binary, {packet, 0}, {active, false}], Host, ipv4} - end, - {Ipv, gen_tcp:connect(NewHost, Port, Opts, TimeOut)}; -connect(Host, Port, TimeOut, #state{ip_v6_disabled = true}) -> - Opts = [binary, {packet, 0}, {active, false}], - {ipv4, gen_tcp:connect(Host, Port, Opts, TimeOut)}. +%% setup_data_connection(#state{mode = passive, ip_v6_disabled = false, +%% caller = Caller} = State) -> +%% send_ctrl_message(State, mk_cmd("EPSV", [])), +%% activate_ctrl_connection(State), +%% {noreply, State#state{caller = {setup_data_connection, Caller}}}; + +%% setup_data_connection(#state{mode = passive, ip_v6_disabled = true, +%% caller = Caller} = State) -> +%% send_ctrl_message(State, mk_cmd("PASV", [])), +%% activate_ctrl_connection(State), +%% {noreply, State#state{caller = {setup_data_connection, Caller}}}. + + +connect(Host, Port, Timeout, #state{ipfamily = inet = IpFam}) -> + connect2(Host, Port, IpFam, Timeout); + +connect(Host, Port, Timeout, #state{ipfamily = inet6 = IpFam}) -> + connect2(Host, Port, IpFam, Timeout); + +connect(Host, Port, Timeout, #state{ipfamily = inet6fb4}) -> + case inet:getaddr(Host, inet6) of + {ok, {0, 0, 0, 0, 0, 16#ffff, _, _} = IPv6} -> + case inet:getaddr(Host, inet) of + {ok, IPv4} -> + IpFam = inet, + connect2(IPv4, Port, IpFam, Timeout); + + _ -> + IpFam = inet6, + connect2(IPv6, Port, IpFam, Timeout) + end; + + {ok, IPv6} -> + IpFam = inet6, + connect2(IPv6, Port, IpFam, Timeout); + + _ -> + case inet:getaddr(Host, inet) of + {ok, IPv4} -> + IpFam = inet, + connect2(IPv4, Port, IpFam, Timeout); + Error -> + Error + end + end. + +connect2(Host, Port, IpFam, Timeout) -> + Opts = [IpFam, binary, {packet, 0}, {active, false}], + case gen_tcp:connect(Host, Port, Opts, Timeout) of + {ok, Sock} -> + {ok, IpFam, Sock}; + Error -> + Error + end. + + accept_data_connection(#state{mode = active, dsock = {lsock, LSock}} = State) -> @@ -1464,8 +1831,8 @@ accept_data_connection(#state{mode = passive} = State) -> State. -send_ctrl_message(#state{csock = Socket,verbose=Verbose}, Message) -> -% io:format("Sending: ~p~n",[Message]), +send_ctrl_message(#state{csock = Socket, verbose = Verbose}, Message) -> + %% io:format("send control message: ~n~p~n", [lists:flatten(Message)]), verbose(lists:flatten(Message),Verbose,send), send_message(Socket, Message). @@ -1557,10 +1924,8 @@ call(GenServer, Msg, Format) -> call(GenServer, Msg, Format, infinity). call(GenServer, Msg, Format, Timeout) -> - - Result = (catch gen_server:call(GenServer, {self(), Msg}, Timeout)), - - case Result of + Req = {self(), Msg}, + case (catch gen_server:call(GenServer, Req, Timeout)) of {ok, Bin} when is_binary(Bin) andalso (Format =:= string) -> {ok, binary_to_list(Bin)}; {'EXIT', _} -> @@ -1582,22 +1947,22 @@ lists:splitwith(fun(?DOUBLE_QUOTE) -> false; (_) -> true end, Rest), Dir. -is_verbose(Params) -> - check_param(verbose, Params). +%% is_verbose(Params) -> +%% check_param(verbose, Params). -is_debug(Flags) -> - check_param(debug, Flags). +%% is_debug(Flags) -> +%% check_param(debug, Flags). -is_trace(Flags) -> - check_param(trace, Flags). +%% is_trace(Flags) -> +%% check_param(trace, Flags). -is_ipv6_disabled(Flags) -> - check_param(ip_v6_disabled, Flags). +%% is_ipv6_disabled(Flags) -> +%% check_param(ip_v6_disabled, Flags). -check_param(Param, Params) -> - lists:member(Param, Params). +%% check_param(Param, Params) -> +%% lists:member(Param, Params). -key_search(Key, List, Default)-> +key_search(Key, List, Default) -> case lists:keysearch(Key, 1, List) of {value, {_,Val}} -> Val; @@ -1605,13 +1970,13 @@ Default end. -check_option(Pred, Value, Default) -> - case Pred(Value) of - true -> - Value; - false -> - Default - end. +%% check_option(Pred, Value, Default) -> +%% case Pred(Value) of +%% true -> +%% Value; +%% false -> +%% Default +%% end. verbose(Lines, true, Direction) -> DirStr = diff -Nru erlang-13.b.1-dfsg/lib/inets/src/ftp/ftp_internal.hrl erlang-13.b.3-dfsg/lib/inets/src/ftp/ftp_internal.hrl --- erlang-13.b.1-dfsg/lib/inets/src/ftp/ftp_internal.hrl 2009-03-12 12:32:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/src/ftp/ftp_internal.hrl 2009-11-20 13:37:38.000000000 +0000 @@ -18,4 +18,14 @@ %% %% +-ifndef(ftp_internal_hrl). +-define(ftp_internal_hrl, true). + -include("inets_internal.hrl"). +-define(SERVICE, ftpc). +-define(fcri(Label, Content), ?report_important(Label, ?SERVICE, Content)). +-define(fcrv(Label, Content), ?report_verbose(Label, ?SERVICE, Content)). +-define(fcrd(Label, Content), ?report_debug(Label, ?SERVICE, Content)). +-define(fcrt(Label, Content), ?report_trace(Label, ?SERVICE, Content)). + +-endif. % -ifdef(ftp_internal_hrl). diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_client/httpc_handler.erl erlang-13.b.3-dfsg/lib/inets/src/http_client/httpc_handler.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_client/httpc_handler.erl 2009-06-05 13:55:50.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_client/httpc_handler.erl 2009-11-20 13:37:22.000000000 +0000 @@ -25,6 +25,7 @@ -include("httpc_internal.hrl"). -include("http_internal.hrl"). + %%-------------------------------------------------------------------- %% Internal Application API -export([start_link/3, send/2, cancel/2, stream/3, stream_next/1]). @@ -137,28 +138,34 @@ %%-------------------------------------------------------------------- %% Request should not be streamed stream(BodyPart, Request = #request{stream = none}, _) -> + ?hcrt("stream - none", [{body_part, BodyPart}]), {BodyPart, Request}; %% Stream to caller stream(BodyPart, Request = #request{stream = Self}, Code) when ((Code =:= 200) orelse (Code =:= 206)) andalso ((Self =:= self) orelse (Self =:= {self, once})) -> - + ?hcrt("stream - self", [{stream, Self}, {code, Code}, {body_part, BodyPart}]), httpc_response:send(Request#request.from, {Request#request.id, stream, BodyPart}), {<<>>, Request}; stream(BodyPart, Request = #request{stream = Self}, 404) when (Self =:= self) orelse (Self =:= {self, once}) -> + ?hcrt("stream - self with 404", [{stream, Self}, {body_part, BodyPart}]), httpc_response:send(Request#request.from, {Request#request.id, stream, BodyPart}), {<<>>, Request}; %% Stream to file +%% This has been moved to start_stream/3 +%% We keep this for backward compatibillity... stream(BodyPart, Request = #request{stream = Filename}, Code) when ((Code =:= 200) orelse (Code =:= 206)) andalso is_list(Filename) -> + ?hcrt("stream - filename", [{stream, Filename}, {code, Code}, {body_part, BodyPart}]), case file:open(Filename, [write, raw, append, delayed_write]) of {ok, Fd} -> + ?hcrt("stream - file open ok", [{fd, Fd}]), stream(BodyPart, Request#request{stream = Fd}, 200); {error, Reason} -> exit({stream_to_file_failed, Reason}) @@ -167,6 +174,7 @@ %% Stream to file stream(BodyPart, Request = #request{stream = Fd}, Code) when ((Code =:= 200) orelse (Code =:= 206)) -> + ?hcrt("stream to file", [{stream, Fd}, {code, Code}, {body_part, BodyPart}]), case file:write(Fd, BodyPart) of ok -> {<<>>, Request}; @@ -175,6 +183,7 @@ end; stream(BodyPart, Request,_) -> % only 200 and 206 responses can be streamed + ?hcrt("stream - ignore", [{request, Request}, {body_part, BodyPart}]), {BodyPart, Request}. @@ -283,12 +292,13 @@ undefined}}} end; {error, Reason} -> - {reply, {pipline_failed, Reason}, State} + {reply, {pipeline_failed, Reason}, State} end; handle_call(Request, _, #state{session = Session = #tcp_session{type = keep_alive, socket = Socket}, + timers = Timers, options = Options, profile_name = ProfileName} = State) -> @@ -301,18 +311,39 @@ NewState = activate_request_timeout(State#state{request = Request}), - NewSession = - Session#tcp_session{queue_length = 1, - client_close = ClientClose}, - httpc_manager:insert_session(NewSession, ProfileName), - Relaxed = - (Request#request.settings)#http_options.relaxed, - {reply, ok, - NewState#state{request = Request, - session = NewSession, - mfa = {httpc_response, parse, - [State#state.max_header_size, - Relaxed]}}}; + + case State#state.request of + #request{} -> %% Old request not yet finished + %% Make sure to use the new value of timers in state + NewTimers = NewState#state.timers, + NewKeepAlive = queue:in(Request, State#state.keep_alive), + NewSession = + Session#tcp_session{queue_length = + %% Queue + current + queue:len(NewKeepAlive) + 1, + client_close = ClientClose}, + httpc_manager:insert_session(NewSession, ProfileName), + {reply, ok, State#state{keep_alive = NewKeepAlive, + session = NewSession, + timers = NewTimers}}; + undefined -> + %% Note: tcp-message reciving has already been + %% activated by handle_pipeline/2. + cancel_timer(Timers#timers.queue_timer, + timeout_queue), + NewSession = + Session#tcp_session{queue_length = 1, + client_close = ClientClose}, + httpc_manager:insert_session(NewSession, ProfileName), + Relaxed = + (Request#request.settings)#http_options.relaxed, + {reply, ok, + NewState#state{request = Request, + session = NewSession, + mfa = {httpc_response, parse, + [State#state.max_header_size, + Relaxed]}}} + end; {error, Reason} -> {reply, {request_failed, Reason}, State} end. @@ -351,63 +382,100 @@ Session#tcp_session.socket, [{active, once}]), {noreply, State#state{once = once}}. + %%-------------------------------------------------------------------- %% Function: handle_info(Info, State) -> {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} (terminate/2 is called) %% Description: Handling all non call/cast messages %%-------------------------------------------------------------------- -handle_info({Proto, _Socket, Data}, State = - #state{mfa = {Module, Function, Args}, +handle_info({Proto, _Socket, Data}, + #state{mfa = {Module, Function, Args} = MFA, request = #request{method = Method, stream = Stream} = Request, - session = Session, status_line = StatusLine}) + session = Session, + status_line = StatusLine} = State) when (Proto =:= tcp) orelse (Proto =:= ssl) orelse (Proto =:= httpc_handler) -> - try Module:Function([Data | Args]) of - {ok, Result} -> - handle_http_msg(Result, State); - {_, whole_body, _} when Method =:= head -> - handle_response(State#state{body = <<>>}); - {Module, whole_body, [Body, Length]} -> - {_, Code, _} = StatusLine, - {NewBody, NewRequest} = stream(Body, Request, Code), - %% When we stream we will not keep the already - %% streamed data, that would be a waste of memory. - NewLength = case Stream of - none -> - Length; - _ -> - Length - size(Body) - end, - - NewState = next_body_chunk(State), - - {noreply, NewState#state{mfa = {Module, whole_body, - [NewBody, NewLength]}, - request = NewRequest}}; - NewMFA -> - http_transport:setopts(socket_type(Session#tcp_session.scheme), - Session#tcp_session.socket, - [{active, once}]), - {noreply, State#state{mfa = NewMFA}} - catch - exit:_ -> - ClientErrMsg = httpc_response:error(Request, - {could_not_parse_as_http, - Data}), - NewState = answer_request(Request, ClientErrMsg, State), - {stop, normal, NewState}; - error:_ -> - ClientErrMsg = httpc_response:error(Request, - {could_not_parse_as_http, - Data}), - NewState = answer_request(Request, ClientErrMsg, State), - {stop, normal, NewState} - - end; + ?hcri("received data", [{proto, Proto}, {data, Data}, {mfa, MFA}, {method, Method}, {stream, Stream}, {session, Session}, {status_line, StatusLine}]), + + FinalResult = + try Module:Function([Data | Args]) of + {ok, Result} -> + ?hcrd("data processed - ok", [{result, Result}]), + handle_http_msg(Result, State); + {_, whole_body, _} when Method =:= head -> + ?hcrd("data processed - whole body", []), + handle_response(State#state{body = <<>>}); + {Module, whole_body, [Body, Length]} -> + ?hcrd("data processed - whole body", [{module, Module}, {body, Body}, {length, Length}]), + {_, Code, _} = StatusLine, + {NewBody, NewRequest} = stream(Body, Request, Code), + %% When we stream we will not keep the already + %% streamed data, that would be a waste of memory. + NewLength = case Stream of + none -> + Length; + _ -> + Length - size(Body) + end, + + NewState = next_body_chunk(State), + + {noreply, NewState#state{mfa = {Module, whole_body, + [NewBody, NewLength]}, + request = NewRequest}}; + NewMFA -> + ?hcrd("data processed", [{new_mfa, NewMFA}]), + http_transport:setopts(socket_type(Session#tcp_session.scheme), + Session#tcp_session.socket, + [{active, once}]), + {noreply, State#state{mfa = NewMFA}} + catch + exit:_ -> + ClientErrMsg = httpc_response:error(Request, + {could_not_parse_as_http, + Data}), + NewState = answer_request(Request, ClientErrMsg, State), + {stop, normal, NewState}; + error:_ -> + ClientErrMsg = httpc_response:error(Request, + {could_not_parse_as_http, + Data}), + NewState = answer_request(Request, ClientErrMsg, State), + {stop, normal, NewState} + + end, + ?hcri("data processed", [{result, FinalResult}]), + FinalResult; + + +handle_info({Proto, Socket, Data}, + #state{mfa = MFA, + request = Request, + session = Session, + status = Status, + status_line = StatusLine, + profile_name = Profile} = State) + when (Proto =:= tcp) orelse + (Proto =:= ssl) orelse + (Proto =:= httpc_handler) -> + + error_logger:warning_msg("Received unexpected ~p data on ~p" + "~n Data: ~p" + "~n MFA: ~p" + "~n Request: ~p" + "~n Session: ~p" + "~n Status: ~p" + "~n StatusLine: ~p" + "~n Profile: ~p" + "~n", + [Proto, Socket, Data, MFA, + Request, Session, Status, StatusLine, Profile]), + {noreply, State}; + %% The Server may close the connection to indicate that the %% whole body is now sent instead of sending an length @@ -439,25 +507,43 @@ handle_info({ssl_error, _, _} = Reason, State) -> {stop, Reason, State}; -%%% Timeouts -%% Internaly, to a request handling process, a request time out is -%% seen as a canceld request. -handle_info({timeout, RequestId}, State = - #state{request = Request = #request{id = RequestId}}) -> +%% Timeouts +%% Internally, to a request handling process, a request timeout is +%% seen as a canceled request. +handle_info({timeout, RequestId}, + #state{request = #request{id = RequestId} = Request, + canceled = Canceled} = State) -> httpc_response:send(Request#request.from, httpc_response:error(Request,timeout)), {stop, normal, - State#state{canceled = [RequestId | State#state.canceled], - request = Request#request{from = answer_sent}}}; -handle_info({timeout, RequestId}, State = #state{request = Request}) -> - httpc_response:send(Request#request.from, - httpc_response:error(Request,timeout)), - {noreply, State#state{canceled = [RequestId | State#state.canceled]}}; + State#state{request = Request#request{from = answer_sent}, + canceled = [RequestId | Canceled]}}; + +handle_info({timeout, RequestId}, #state{canceled = Canceled} = State) -> + Filter = + fun(#request{id = Id, from = From} = Request) when Id =:= RequestId -> + %% Notify the owner + Response = httpc_response:error(Request, timeout), + httpc_response:send(From, Response), + [Request#request{from = answer_sent}]; + (_) -> + true + end, + case State#state.status of + pipeline -> + Pipeline = queue:filter(Filter, State#state.pipeline), + {noreply, State#state{canceled = [RequestId | Canceled], + pipeline = Pipeline}}; + keep_alive -> + KeepAlive = queue:filter(Filter, State#state.keep_alive), + {noreply, State#state{canceled = [RequestId | Canceled], + keep_alive = KeepAlive}} + end; handle_info(timeout_queue, State = #state{request = undefined}) -> {stop, normal, State}; -%% Timing was such as the pipline_timout was not canceled! +%% Timing was such as the pipeline_timout was not canceled! handle_info(timeout_queue, #state{timers = Timers} = State) -> {noreply, State#state{timers = Timers#timers{queue_timer = undefined}}}; @@ -468,6 +554,7 @@ NewState = answer_request(Request, ClientErrMsg, State), {stop, normal, NewState}; + %%% httpc_manager process dies. handle_info({'EXIT', _, _}, State = #state{request = undefined}) -> {stop, normal, State}; @@ -521,16 +608,15 @@ terminate(_, State = #state{session = Session, request = undefined, profile_name = ProfileName, - timers = Timers}) -> + timers = Timers, + pipeline = Pipeline, + keep_alive = KeepAlive}) -> catch httpc_manager:delete_session(Session#tcp_session.id, ProfileName), - - case queue:is_empty(State#state.pipeline) of - false -> - retry_pipline(queue:to_list(State#state.pipeline), State); - true -> - ok - end, + + maybe_retry_queue(Pipeline, State), + maybe_retry_queue(KeepAlive, State), + cancel_timer(Timers#timers.queue_timer, timeout_queue), Socket = Session#tcp_session.socket, http_transport:close(socket_type(Session#tcp_session.scheme), Socket); @@ -541,6 +627,14 @@ State), terminate(Reason, NewState#state{request = undefined}). +maybe_retry_queue(Q, State) -> + case queue:is_empty(Q) of + false -> + retry_pipeline(queue:to_list(Q), State); + true -> + ok + end. + maybe_send_answer(#request{from = answer_sent}, _Reason, State) -> State; maybe_send_answer(Request, Answer, State) -> @@ -636,13 +730,16 @@ send_first_request(Address, Request, #state{options = Options} = State) -> - - SocketType = socket_type(Request), - Timeout = (Request#request.settings)#http_options.timeout, - case connect(SocketType, Address, Options, Timeout) of + SocketType = socket_type(Request), + ConnTimeout = (Request#request.settings)#http_options.connect_timeout, + ?hcri("connect", + [{address, Address}, {request, Request}, {options, Options}]), + case connect(SocketType, Address, Options, ConnTimeout) of {ok, Socket} -> + ?hcri("connected - now send first request", [{socket, Socket}]), case httpc_request:send(Address, Request, Socket) of ok -> + ?hcri("first request sent", []), ClientClose = httpc_request:is_client_closing( Request#request.headers), @@ -706,63 +803,73 @@ handle_http_msg({Version, StatusCode, ReasonPharse, Headers, Body}, State = #state{request = Request}) -> - + ?hcrt("handle_http_msg", [{body, Body}]), case Headers#http_response_h.'content-type' of "multipart/byteranges" ++ _Param -> exit(not_yet_implemented); _ -> - start_stream({{Version, StatusCode, ReasonPharse}, Headers}, - Request), + StatusLine = {Version, StatusCode, ReasonPharse}, + {ok, NewRequest} = start_stream(StatusLine, Headers, Request), handle_http_body(Body, - State#state{status_line = {Version, - StatusCode, - ReasonPharse}, - headers = Headers}) + State#state{request = NewRequest, + status_line = StatusLine, + headers = Headers}) end; handle_http_msg({ChunkedHeaders, Body}, State = #state{headers = Headers}) -> + ?hcrt("handle_http_msg", [{chunked_headers, ChunkedHeaders}, {body, Body}]), NewHeaders = http_chunk:handle_headers(Headers, ChunkedHeaders), handle_response(State#state{headers = NewHeaders, body = Body}); handle_http_msg(Body, State = #state{status_line = {_,Code, _}}) -> + ?hcrt("handle_http_msg", [{body, Body}, {code, Code}]), {NewBody, NewRequest}= stream(Body, State#state.request, Code), handle_response(State#state{body = NewBody, request = NewRequest}). handle_http_body(<<>>, State = #state{status_line = {_,304, _}}) -> + ?hcrt("handle_http_body - 304", []), handle_response(State#state{body = <<>>}); handle_http_body(<<>>, State = #state{status_line = {_,204, _}}) -> + ?hcrt("handle_http_body - 204", []), handle_response(State#state{body = <<>>}); handle_http_body(<<>>, State = #state{request = #request{method = head}}) -> + ?hcrt("handle_http_body - head", []), handle_response(State#state{body = <<>>}); handle_http_body(Body, State = #state{headers = Headers, max_body_size = MaxBodySize, status_line = {_,Code, _}, request = Request}) -> + ?hcrt("handle_http_body", [{body, Body}, {max_body_size, MaxBodySize}, {code, Code}]), TransferEnc = Headers#http_response_h.'transfer-encoding', case case_insensitive_header(TransferEnc) of "chunked" -> + ?hcrt("handle_http_body - chunked", []), case http_chunk:decode(Body, State#state.max_body_size, State#state.max_header_size, {Code, Request}) of {Module, Function, Args} -> + ?hcrt("handle_http_body - new mfa", [{module, Module}, {function, Function}, {args, Args}]), NewState = next_body_chunk(State), {noreply, NewState#state{mfa = {Module, Function, Args}}}; {ok, {ChunkedHeaders, NewBody}} -> + ?hcrt("handle_http_body - nyew body", [{chunked_headers, ChunkedHeaders}, {new_body, NewBody}]), NewHeaders = http_chunk:handle_headers(Headers, ChunkedHeaders), handle_response(State#state{headers = NewHeaders, - body = NewBody}) + body = NewBody}) end; Encoding when is_list(Encoding) -> + ?hcrt("handle_http_body - encoding", [{encoding, Encoding}]), NewState = answer_request(Request, httpc_response:error(Request, unknown_encoding), State), {stop, normal, NewState}; _ -> + ?hcrt("handle_http_body - other", []), Length = list_to_integer(Headers#http_response_h.'content-length'), case ((Length =< MaxBodySize) or (MaxBodySize == nolimit)) of @@ -806,18 +913,18 @@ %% {stop, normal, NewState}; handle_response(State = #state{status = new}) -> - handle_response(try_to_enable_pipline_or_keep_alive(State)); + handle_response(try_to_enable_pipeline_or_keep_alive(State)); handle_response(State = - #state{request = Request, - status = Status, - session = Session, - status_line = StatusLine, - headers = Headers, - body = Body, - options = Options, + #state{request = Request, + status = Status, + session = Session, + status_line = StatusLine, + headers = Headers, + body = Body, + options = Options, profile_name = ProfileName}) when Status =/= new -> - + ?hcrt("handle response", [{status, Status}, {session, Session}, {status_line, StatusLine}, {profile_name, ProfileName}]), handle_cookies(Headers, Request, Options, ProfileName), case httpc_response:result({StatusLine, Headers, Body}, Request) of %% 100-continue @@ -855,17 +962,21 @@ %% On a redirect or retry the current request becomes %% obsolete and the manager will create a new request %% with the same id as the current. - {redirect, NewRequest, Data}-> + {redirect, NewRequest, Data} -> + ?hcrt("handle response - redirect", [{new_request, NewRequest}, {data, Data}]), ok = httpc_manager:redirect_request(NewRequest, ProfileName), handle_queue(State#state{request = undefined}, Data); - {retry, TimeNewRequest, Data}-> + {retry, TimeNewRequest, Data} -> + ?hcrt("handle response - retry", [{time_new_request, TimeNewRequest}, {data, Data}]), ok = httpc_manager:retry_request(TimeNewRequest, ProfileName), handle_queue(State#state{request = undefined}, Data); {ok, Msg, Data} -> + ?hcrt("handle response - result ok", [{msg, Msg}, {data, Data}]), end_stream(StatusLine, Request), NewState = answer_request(Request, Msg, State), handle_queue(NewState, Data); {stop, Msg} -> + ?hcrt("handle response - result stop", [{msg, Msg}]), end_stream(StatusLine, Request), NewState = answer_request(Request, Msg, State), {stop, normal, NewState} @@ -904,7 +1015,7 @@ {empty, _} -> %% The server may choose too teminate an idle pipeline %% in this case we want to receive the close message - %% at once and not when trying to pipline the next + %% at once and not when trying to pipeline the next %% request. http_transport:setopts(socket_type(Session#tcp_session.scheme), Session#tcp_session.socket, @@ -1003,13 +1114,29 @@ handle_keep_alive_queue(State#state{keep_alive = KeepAlive}, Data); false -> - {reply, ok, NewState} = - handle_call(NextRequest, - dummy, State#state{request = undefined}), - http_transport:setopts( - socket_type(Session#tcp_session.scheme), - Session#tcp_session.socket, [{active, once}]), - {noreply, NewState} + Relaxed = + (NextRequest#request.settings)#http_options.relaxed, + NewState = + State#state{request = NextRequest, + keep_alive = KeepAlive, + mfa = {httpc_response, parse, + [State#state.max_header_size, + Relaxed]}, + status_line = undefined, + headers = undefined, + body = undefined}, + case Data of + <<>> -> + http_transport:setopts( + socket_type(Session#tcp_session.scheme), + Session#tcp_session.socket, [{active, once}]), + {noreply, NewState}; + _ -> + %% If we already received some bytes of + %% the next response + handle_info({httpc_handler, dummy, Data}, + NewState) + end end end. @@ -1064,7 +1191,7 @@ (not ((Session#tcp_session.client_close) or httpc_response:is_server_closing(Headers))). -try_to_enable_pipline_or_keep_alive(State = +try_to_enable_pipeline_or_keep_alive(State = #state{session = Session, request = #request{method = Method}, status_line = {Version, _, _}, @@ -1112,11 +1239,16 @@ ok end. -retry_pipline([], _) -> +retry_pipeline([], _) -> ok; -retry_pipline([Request |PipeLine], State = - #state{timers = Timers, profile_name = ProfileName}) -> +%% Skip requests when the answer has already been sent +retry_pipeline([#request{from = answer_sent}|PipeLine], State) -> + retry_pipeline(PipeLine, State); + +retry_pipeline([Request | PipeLine], + #state{timers = Timers, + profile_name = ProfileName} = State) -> NewState = case (catch httpc_manager:retry_request(Request, ProfileName)) of ok -> @@ -1133,7 +1265,7 @@ answer_request(Request#request.from, httpc_response:error(Request, Error), State) end, - retry_pipline(PipeLine, NewState). + retry_pipeline(PipeLine, NewState). %%% Check to see if the given {Host,Port} tuple is in the NoProxyList %%% Returns an eventually updated {Host,Port} tuple, with the proxy address @@ -1215,29 +1347,50 @@ socket_type(https) -> {ssl, []}. %% Dummy value ok for ex setops that does not use this value -start_stream(_, #request{stream = none}) -> - ok; -start_stream({{_, Code, _}, Headers}, Request = #request{stream = self}) +start_stream({_Version, _Code, _ReasonPhrase}, _Headers, #request{stream = none} = Request) -> + ?hcrt("start stream - none", []), + {ok, Request}; +start_stream({_Version, Code, _ReasonPhrase}, Headers, #request{stream = self} = Request) when (Code =:= 200) orelse (Code =:= 206) -> + ?hcrt("start stream - self", [{code, Code}]), Msg = httpc_response:stream_start(Headers, Request, ignore), - httpc_response:send(Request#request.from, Msg); -start_stream({{_, Code, _}, Headers}, Request = #request{stream = - {self, once}}) + httpc_response:send(Request#request.from, Msg), + {ok, Request}; +start_stream({_Version, Code, _ReasonPhrase}, Headers, + #request{stream = {self, once}} = Request) when (Code =:= 200) orelse (Code =:= 206) -> + ?hcrt("start stream - self:once", [{code, Code}]), Msg = httpc_response:stream_start(Headers, Request, self()), - httpc_response:send(Request#request.from, Msg); -start_stream(_, _) -> - ok. + httpc_response:send(Request#request.from, Msg), + {ok, Request}; +start_stream({_Version, Code, _ReasonPhrase}, _Headers, #request{stream = Filename} = Request) + when ((Code =:= 200) orelse (Code =:= 206)) andalso is_list(Filename) -> + ?hcrt("start stream", [{code, Code}, {filename, Filename}]), + case file:open(Filename, [write, raw, append, delayed_write]) of + {ok, Fd} -> + ?hcri("start stream - file open ok", [{fd, Fd}]), + {ok, Request#request{stream = Fd}}; + {error, Reason} -> + exit({stream_to_file_failed, Reason}) + end; +start_stream(_StatusLine, _Headers, Request) -> + ?hcrt("start stream - no op", []), + {ok, Request}. + %% Note the end stream message is handled by httpc_response and will %% be sent by answer_request end_stream(_, #request{stream = none}) -> + ?hcrt("end stream - none", []), ok; end_stream(_, #request{stream = self}) -> + ?hcrt("end stream - self", []), ok; end_stream(_, #request{stream = {self, once}}) -> + ?hcrt("end stream - self:once", []), ok; end_stream({_,200,_}, #request{stream = Fd}) -> + ?hcrt("end stream - 200", [{stream, Fd}]), case file:close(Fd) of ok -> ok; @@ -1245,13 +1398,15 @@ file:close(Fd) end; end_stream({_,206,_}, #request{stream = Fd}) -> + ?hcrt("end stream - 206", [{stream, Fd}]), case file:close(Fd) of ok -> ok; {error, enospc} -> % Could be due to delayed_write file:close(Fd) end; -end_stream(_, _) -> +end_stream(SL, R) -> + ?hcrt("end stream", [{status_line, SL}, {request, R}]), ok. diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_client/httpc_internal.hrl erlang-13.b.3-dfsg/lib/inets/src/http_client/httpc_internal.hrl --- erlang-13.b.1-dfsg/lib/inets/src/http_client/httpc_internal.hrl 2009-06-05 13:56:02.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_client/httpc_internal.hrl 2009-09-18 13:47:51.000000000 +0100 @@ -18,7 +18,15 @@ %% %% +-include("inets_internal.hrl"). +-define(SERVICE, httpc). +-define(hcri(Label, Data), ?report_important(Label, ?SERVICE, Data)). +-define(hcrv(Label, Data), ?report_verbose(Label, ?SERVICE, Data)). +-define(hcrd(Label, Data), ?report_debug(Label, ?SERVICE, Data)). +-define(hcrt(Label, Data), ?report_trace(Label, ?SERVICE, Data)). + -define(HTTP_REQUEST_TIMEOUT, infinity). +-define(HTTP_REQUEST_CTIMEOUT, ?HTTP_REQUEST_TIMEOUT). -define(HTTP_PIPELINE_TIMEOUT, 0). -define(HTTP_PIPELINE_LENGTH, 2). -define(HTTP_MAX_TCP_SESSIONS, 2). @@ -29,13 +37,26 @@ %%% HTTP Client per request settings -record(http_options, { - version, % string() - "HTTP/1.1" | "HTTP/1.0" | "HTTP/0.9" - %% Milliseconds before a request times out + %% string() - "HTTP/1.1" | "HTTP/1.0" | "HTTP/0.9" + version, + + %% integer() | infinity - ms before a request times out timeout = ?HTTP_REQUEST_TIMEOUT, - autoredirect = true, % bool() - true if auto redirect on 30x response - ssl = [], % Ssl socket options - proxy_auth, % {User, Password} = {strring(), string()} - relaxed = false % bool() - true if not strictly std compliant + + %% bool() - true if auto redirect on 30x response + autoredirect = true, + + %% Ssl socket options + ssl = [], + + %% {User, Password} = {string(), string()} + proxy_auth, + + %% bool() - true if not strictly std compliant + relaxed = false, + + %% integer() - ms before a connect times out + connect_timeout = ?HTTP_REQUEST_CTIMEOUT } ). @@ -79,7 +100,8 @@ } ). --record(tcp_session,{ +-record(tcp_session, + { id, % {{Host, Port}, HandlerPid} client_close, % true | false scheme, % http (HTTP/TCP) | https (HTTP/SSL/TCP) @@ -88,7 +110,8 @@ type % pipeline | keep_alive (wait for response before sending new request) }). --record(http_cookie,{ +-record(http_cookie, + { domain, domain_default = false, name, @@ -101,3 +124,13 @@ version = "0" }). + +%% -record(parsed_uri, +%% { +%% scheme, % http | https +%% uinfo, % string() +%% host, % string() +%% port, % integer() +%% path, % string() +%% q % query: string() +%% }). diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_client/httpc_manager.erl erlang-13.b.3-dfsg/lib/inets/src/http_client/httpc_manager.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_client/httpc_manager.erl 2009-06-05 13:55:51.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_client/httpc_manager.erl 2009-09-18 13:47:45.000000000 +0100 @@ -221,6 +221,7 @@ SessionDb = list_to_atom(atom_to_list(ProfileName) ++ "_session_db"), ets:new(SessionDb, [public, set, named_table, {keypos, #tcp_session.id}]), + ?hcri("starting", [{profile, ProfileName}]), {ok, #state{handler_db = ets:new(handler_db, [protected, set]), cookie_db = http_cookie:open_cookie_db({CookiesConf, @@ -239,6 +240,7 @@ %% Description: Handling call messages %%-------------------------------------------------------------------- handle_call({request, Request}, _, State) -> + ?hcri("request", [{request, Request}]), case (catch handle_request(Request, State)) of {reply, Msg, NewState} -> {reply, Msg, NewState}; @@ -247,6 +249,7 @@ end; handle_call({cancel_request, RequestId}, From, State) -> + ?hcri("cancel_request", [{request_id, RequestId}]), case ets:lookup(State#state.handler_db, RequestId) of [] -> ok, %% Nothing to cancel diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_client/http.erl erlang-13.b.3-dfsg/lib/inets/src/http_client/http.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_client/http.erl 2009-06-05 13:55:50.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_client/http.erl 2009-09-18 13:47:45.000000000 +0100 @@ -73,8 +73,8 @@ %% Request - {Url, Headers} | {Url, Headers, ContentType, Body} %% Url - string() %% HTTPOptions - [HttpOption] -%% HTTPOption - {timeout, Time} | {ssl, SSLOptions} | -%% {proxy_auth, {User, Password}} +%% HTTPOption - {timeout, Time} | {connect_timeout, Time} | +%% {ssl, SSLOptions} | {proxy_auth, {User, Password}} %% Ssloptions = [SSLOption] %% SSLOption = {verify, code()} | {depth, depth()} | {certfile, path()} | %% {keyfile, path()} | {password, string()} | {cacertfile, path()} | @@ -113,7 +113,7 @@ {error, Reason} -> {error, Reason}; ParsedUrl -> - handle_request(Method, Url, {ParsedUrl, Headers, [], []}, + handle_request(Method, Url, ParsedUrl, Headers, [], [], HTTPOptions, Options, Profile) end; @@ -124,7 +124,7 @@ {error, Reason}; ParsedUrl -> handle_request(Method, Url, - {ParsedUrl, Headers, ContentType, Body}, + ParsedUrl, Headers, ContentType, Body, HTTPOptions, Options, Profile) end. @@ -279,36 +279,36 @@ %%% Internal functions %%%======================================================================== handle_request(Method, Url, - {{Scheme, UserInfo, Host, Port, Path, Query}, Headers, ContentType, Body}, - HTTPOptions, Options, Profile) -> - - HTTPRecordOptions = http_options(HTTPOptions, #http_options{}), - Sync = proplists:get_value(sync, Options, true), - NewHeaders = lists:map(fun({Key, Val}) -> - {http_util:to_lower(Key), Val} end, - Headers), + {Scheme, UserInfo, Host, Port, Path, Query}, + Headers, ContentType, Body, + HTTPOptions0, Options, Profile) -> + + HTTPOptions = http_options(HTTPOptions0), + Sync = proplists:get_value(sync, Options, true), + NewHeaders = lists:map(fun({Key, Val}) -> + {http_util:to_lower(Key), Val} end, + Headers), Stream = proplists:get_value(stream, Options, none), - Version = http_util:to_upper(proplists:get_value(version, - HTTPOptions, "HTTP/1.1")), case {Sync, Stream} of {true, self} -> {error, streaming_error}; _ -> - RecordHeaders = header_record(NewHeaders, #http_request_h{}, - Host, Version), - Request = #request{from = self(), - scheme = Scheme, - address = {Host,Port}, - path = Path, - pquery = Query, - method = Method, - headers = RecordHeaders, - content = {ContentType,Body}, - settings = - HTTPRecordOptions#http_options{version = Version}, - abs_uri = Url, + RecordHeaders = header_record(NewHeaders, + #http_request_h{}, + Host, + HTTPOptions#http_options.version), + Request = #request{from = self(), + scheme = Scheme, + address = {Host,Port}, + path = Path, + pquery = Query, + method = Method, + headers = RecordHeaders, + content = {ContentType,Body}, + settings = HTTPOptions, + abs_uri = Url, userinfo = UserInfo, - stream = Stream, + stream = Stream, headers_as_is = headers_as_is(Headers, Options)}, try httpc_manager:request(Request, profile_name(Profile)) of {ok, RequestId} -> @@ -370,35 +370,105 @@ Headers end. -http_options([], Acc) -> - Acc; -http_options([{timeout, Val} | Settings], Acc) - when is_integer(Val) andalso (Val >= 0) -> - http_options(Settings, Acc#http_options{timeout = Val}); -http_options([{timeout, infinity} | Settings], Acc) -> - http_options(Settings, Acc#http_options{timeout = infinity}); -http_options([{autoredirect, Val} | Settings], Acc) - when (Val =:= true) orelse (Val =:= false) -> - http_options(Settings, Acc#http_options{autoredirect = Val}); -http_options([{ssl, Val} | Settings], Acc) -> - http_options(Settings, Acc#http_options{ssl = Val}); -http_options([{relaxed, Val} | Settings], Acc) - when (Val =:= true) orelse (Val =:= false) -> - http_options(Settings, Acc#http_options{relaxed = Val}); -http_options([{proxy_auth, Val = {User, Passwd}} | Settings], Acc) - when is_list(User) andalso is_list(Passwd) -> - http_options(Settings, Acc#http_options{proxy_auth = Val}); -http_options([{version, Val} | Settings], Acc) - when is_atom(Val) -> - http_options(Settings, Acc#http_options{version = atom_to_list(Val)}); -http_options([{version, Val} | Settings], Acc) - when is_list(Val) -> - http_options(Settings, Acc#http_options{version = Val}); -http_options([Option | Settings], Acc) -> - Report = io_lib:format("Invalid option ~p ignored ~n", [Option]), - error_logger:info_report(Report), - http_options(Settings, Acc). +http_options(HttpOptions) -> + HttpOptionsDefault = http_options_default(), + http_options(HttpOptionsDefault, HttpOptions, #http_options{}). + +http_options([], [], Acc) -> + Acc; +http_options([], HttpOptions, Acc) -> + Fun = fun(BadOption) -> + Report = io_lib:format("Invalid option ~p ignored ~n", + [BadOption]), + error_logger:info_report(Report) + end, + lists:foreach(Fun, HttpOptions), + Acc; +http_options([{Tag, Default, Idx, Post} | Defaults], HttpOptions, Acc) -> + case lists:keysearch(Tag, 1, HttpOptions) of + {value, {Tag, Val0}} -> + case Post(Val0) of + {ok, Val} -> + Acc2 = setelement(Idx, Acc, Val), + HttpOptions2 = lists:keydelete(Tag, 1, HttpOptions), + http_options(Defaults, HttpOptions2, Acc2); + error -> + Report = io_lib:format("Invalid option ~p:~p ignored ~n", + [Tag, Val0]), + error_logger:info_report(Report), + HttpOptions2 = lists:keydelete(Tag, 1, HttpOptions), + http_options(Defaults, HttpOptions2, Acc) + end; + false -> + DefaultVal = + case Default of + {value, Val} -> + Val; + {field, DefaultIdx} -> + element(DefaultIdx, Acc) + end, + Acc2 = setelement(Idx, Acc, DefaultVal), + http_options(Defaults, HttpOptions, Acc2) + end. + +http_options_default() -> + VersionPost = + fun(Value) when is_atom(Value) -> + {ok, http_util:to_upper(atom_to_list(Value))}; + (Value) when is_list(Value) -> + {ok, http_util:to_upper(Value)}; + (_) -> + error + end, + TimeoutPost = fun(Value) when is_integer(Value) andalso (Value >= 0) -> + {ok, Value}; + (infinity = Value) -> + {ok, Value}; + (_) -> + error + end, + AutoRedirectPost = fun(Value) when (Value =:= true) orelse + (Value =:= false) -> + {ok, Value}; + (_) -> + error + end, + SslPost = fun(Value) when is_list(Value) -> + {ok, Value}; + (_) -> + error + end, + ProxyAuthPost = fun({User, Passwd} = Value) when is_list(User) andalso + is_list(Passwd) -> + {ok, Value}; + (_) -> + error + end, + RelaxedPost = fun(Value) when (Value =:= true) orelse + (Value =:= false) -> + {ok, Value}; + (_) -> + error + end, + ConnTimeoutPost = + fun(Value) when is_integer(Value) andalso (Value >= 0) -> + {ok, Value}; + (infinity = Value) -> + {ok, Value}; + (_) -> + error + end, + [ + {version, {value, "HTTP/1.1"}, #http_options.version, VersionPost}, + {timeout, {value, ?HTTP_REQUEST_TIMEOUT}, #http_options.timeout, TimeoutPost}, + {autoredirect, {value, true}, #http_options.autoredirect, AutoRedirectPost}, + {ssl, {value, []}, #http_options.ssl, SslPost}, + {proxy_auth, {value, undefined}, #http_options.proxy_auth, ProxyAuthPost}, + {relaxed, {value, false}, #http_options.relaxed, RelaxedPost}, + %% this field has to be *after* the timeout field (as that field is used for the default value) + {connect_timeout, {field, #http_options.timeout}, #http_options.connect_timeout, ConnTimeoutPost} + ]. validate_options(Options) -> (catch validate_options(Options, [])). diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_lib/http_transport.erl erlang-13.b.3-dfsg/lib/inets/src/http_lib/http_transport.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_lib/http_transport.erl 2009-06-05 13:55:59.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_lib/http_transport.erl 2009-09-18 13:47:49.000000000 +0100 @@ -27,6 +27,7 @@ -export([negotiate/3]). + %%%========================================================================= %%% Internal application API %%%========================================================================= @@ -104,24 +105,11 @@ listen(SocketType, undefined, Port). listen(ip_comm, Addr, Port) -> - FdName = list_to_atom("httpd_" ++ integer_to_list(Port)), - {NewPort, Opt} = - case init:get_argument(FdName) of - {ok, [[FdStr]]} -> - Fd = list_to_integer(FdStr), - {0, - sock_opt(ip_comm, Addr, [{backlog, 128}, - {reuseaddr,true}, {fd,Fd}])}; - error -> - {Port, - sock_opt(ip_comm, Addr, - [{backlog, 128}, {reuseaddr, true}])} - end, - case gen_tcp:listen(NewPort, Opt) of - {error,eafnosupport} -> - gen_tcp:listen(NewPort, lists:delete(inet6, Opt)); - Other -> - Other + case (catch listen_ip_comm(Addr, Port)) of + {'EXIT', Reason} -> + {error, {exit, Reason}}; + Else -> + Else end; listen({ssl, SSLConfig} = Ssl, Addr, Port) -> @@ -133,6 +121,76 @@ ssl:listen(Port, [{ssl_imp, new} | Opt]). +listen_ip_comm(Addr, Port) -> + {NewPort, Opts, IpFamily} = get_socket_info(Addr, Port), + case IpFamily of + inet6fb4 -> + Opts2 = [inet6 | Opts], + case (catch gen_tcp:listen(NewPort, Opts2)) of + {error, Reason} when ((Reason =:= nxdomain) orelse + (Reason =:= eafnosupport)) -> + Opts3 = [inet | Opts], + gen_tcp:listen(NewPort, Opts3); + + %% This is when a given hostname has resolved to a + %% IPv4-address. The inet6-option together with a + %% {ip, IPv4} option results in badarg + {'EXIT', _} -> + Opts3 = [inet | Opts], + gen_tcp:listen(NewPort, Opts3); + + Other -> + Other + end; + _ -> + Opts2 = [IpFamily | Opts], + gen_tcp:listen(NewPort, Opts2) + end. + +ipfamily_default(Addr, Port) -> + httpd_conf:lookup(Addr, Port, ipfamily, inet6fb4). + +get_socket_info(Addr, Port) -> + Key = list_to_atom("httpd_" ++ integer_to_list(Port)), + BaseOpts = [{backlog, 128}, {reuseaddr, true}], + IpFamilyDefault = ipfamily_default(Addr, Port), + case init:get_argument(Key) of + {ok, [[Value]]} -> + {Fd, IpFamily} = + case string:tokens(Value, [$|]) of + [FdStr, IpFamilyStr] -> + Fd0 = fd_of(FdStr), + IpFamily0 = ip_family_of(IpFamilyStr), + {Fd0, IpFamily0}; + [FdStr] -> + {fd_of(FdStr), IpFamilyDefault}; + _ -> + throw({error, {bad_descriptor, Value}}) + end, + {0, sock_opt(ip_comm, Addr, [{fd, Fd} | BaseOpts]), IpFamily}; + error -> + {Port, sock_opt(ip_comm, Addr, BaseOpts), IpFamilyDefault} + end. + + +fd_of(FdStr) -> + case (catch list_to_integer(FdStr)) of + Fd when is_integer(Fd) -> + Fd; + _ -> + throw({error, {bad_descriptor, FdStr}}) + end. + +ip_family_of(IpFamilyStr) -> + IpFamily = list_to_atom(IpFamilyStr), + case lists:member(IpFamily, [inet, inet6, inet6fb4]) of + true -> + IpFamily; + false -> + throw({error, {bad_ipfamily, IpFamilyStr}}) + end. + + %%------------------------------------------------------------------------- %% accept(SocketType, ListenSocket) -> {ok, Socket} | {error, Reason} %% accept(SocketType, ListenSocket, Timeout) -> ok | {error, Reason} @@ -255,26 +313,23 @@ %%%======================================================================== %% Address any comes from directive: BindAddress "*" -sock_opt(ip_comm, any = Addr, Opt) -> - sock_opt1([{ip, Addr} | Opt]); -sock_opt(ip_comm, undefined, Opt) -> - sock_opt1(Opt); -sock_opt(_, any = Addr, Opt) -> - sock_opt2([{ip, Addr} | Opt]); -sock_opt(_, undefined, Opt) -> - sock_opt2(Opt); -sock_opt(_, {_,_,_,_} = Addr, Opt) -> - sock_opt2([{ip, Addr} | Opt]); -sock_opt(ip_comm, Addr, Opt) -> - sock_opt2([inet6, {ip, Addr} | Opt]); -sock_opt(_, Addr, Opt) -> - sock_opt2([{ip, Addr} | Opt]). - -sock_opt1(Opt) -> - sock_opt2([inet6 | Opt]). +sock_opt(ip_comm, any = Addr, Opts) -> + sock_opt2([{ip, Addr} | Opts]); +sock_opt(ip_comm, undefined, Opts) -> + sock_opt2(Opts); +sock_opt(_, any = _Addr, Opts) -> + sock_opt2(Opts); +sock_opt(_, undefined = _Addr, Opts) -> + sock_opt2(Opts); +sock_opt(_, {_,_,_,_} = Addr, Opts) -> + sock_opt2([{ip, Addr} | Opts]); +sock_opt(ip_comm, Addr, Opts) -> + sock_opt2([{ip, Addr} | Opts]); +sock_opt(_, Addr, Opts) -> + sock_opt2([{ip, Addr} | Opts]). -sock_opt2(Opt) -> - [{packet, 0}, {active, false} | Opt]. +sock_opt2(Opts) -> + [{packet, 0}, {active, false} | Opts]. negotiate(ip_comm,_,_) -> ok; @@ -284,7 +339,7 @@ negotiate(Socket, Timeout). negotiate(Socket, Timeout) -> - case ssl:ssl_accept(Socket,Timeout) of + case ssl:ssl_accept(Socket, Timeout) of ok -> ok; {error, Error} -> diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_acceptor.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_acceptor.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_acceptor.erl 2009-03-12 12:30:19.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_acceptor.erl 2009-09-18 13:47:41.000000000 +0100 @@ -20,6 +20,7 @@ -module(httpd_acceptor). -include("httpd.hrl"). +-include("httpd_internal.hrl"). %% Internal application API -export([start_link/5, start_link/6]). @@ -34,22 +35,47 @@ %% start_link start_link(Manager, SocketType, Addr, Port, ConfigDb, AcceptTimeout) -> + ?hdrd("start link", + [{manager, Manager}, + {socket_type, SocketType}, + {address, Addr}, + {port, Port}, + {timeout, AcceptTimeout}]), Args = [self(), Manager, SocketType, Addr, Port, ConfigDb, AcceptTimeout], proc_lib:start_link(?MODULE, acceptor_init, Args). start_link(Manager, SocketType, ListenSocket, ConfigDb, AcceptTimeout) -> + ?hdrd("start link", + [{manager, Manager}, + {socket_type, SocketType}, + {listen_socket, ListenSocket}, + {timeout, AcceptTimeout}]), Args = [self(), Manager, SocketType, ListenSocket, ConfigDb, AcceptTimeout], proc_lib:start_link(?MODULE, acceptor_init, Args). acceptor_init(Parent, Manager, SocketType, {ListenOwner, ListenSocket}, ConfigDb, AcceptTimeout) -> + ?hdrd("acceptor init", + [{parent, Parent}, + {manager, Manager}, + {socket_type, SocketType}, + {listen_owner, ListenOwner}, + {listen_socket, ListenSocket}, + {timeout, AcceptTimeout}]), link(ListenOwner), proc_lib:init_ack(Parent, {ok, self()}), acceptor_loop(Manager, SocketType, ListenSocket, ConfigDb, AcceptTimeout). acceptor_init(Parent, Manager, SocketType, Addr, Port, ConfigDb, AcceptTimeout) -> + ?hdrd("acceptor init", + [{parent, Parent}, + {manager, Manager}, + {socket_type, SocketType}, + {address, Addr}, + {port, Port}, + {timeout, AcceptTimeout}]), case (catch do_init(SocketType, Addr, Port)) of {ok, ListenSocket} -> proc_lib:init_ack(Parent, {ok, self()}), @@ -61,25 +87,33 @@ end. do_init(SocketType, Addr, Port) -> + ?hdrt("do init", []), do_socket_start(SocketType), ListenSocket = do_socket_listen(SocketType, Addr, Port), {ok, ListenSocket}. do_socket_start(SocketType) -> + ?hdrt("do socket start", []), case http_transport:start(SocketType) of ok -> ok; {error, Reason} -> + ?hdrv("failed starting transport", [{reason, Reason}]), throw({error, {socket_start_failed, Reason}}) end. do_socket_listen(SocketType, Addr, Port) -> + ?hdrt("do socket listen", []), case http_transport:listen(SocketType, Addr, Port) of {ok, ListenSocket} -> ListenSocket; {error, Reason} -> + ?hdrv("listen failed", [{reason, Reason}, + {socket_type, SocketType}, + {addr, Addr}, + {port, Port}]), throw({error, {listen, Reason}}) end. @@ -87,17 +121,25 @@ %% acceptor acceptor_loop(Manager, SocketType, ListenSocket, ConfigDb, AcceptTimeout) -> + ?hdrd("awaiting accept", + [{manager, Manager}, + {socket_type, SocketType}, + {listen_socket, ListenSocket}, + {timeout, AcceptTimeout}]), case (catch http_transport:accept(SocketType, ListenSocket, 50000)) of {ok, Socket} -> + ?hdrv("accepted", [{socket, Socket}]), handle_connection(Manager, ConfigDb, AcceptTimeout, SocketType, Socket), ?MODULE:acceptor_loop(Manager, SocketType, ListenSocket, ConfigDb,AcceptTimeout); {error, Reason} -> + ?hdri("accept failed", [{reason, Reason}]), handle_error(Reason, ConfigDb), ?MODULE:acceptor_loop(Manager, SocketType, ListenSocket, ConfigDb, AcceptTimeout); {'EXIT', Reason} -> + ?hdri("accept exited", [{reason, Reason}]), handle_error({'EXIT', Reason}, ConfigDb), ?MODULE:acceptor_loop(Manager, SocketType, ListenSocket, ConfigDb, AcceptTimeout) diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_conf.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_conf.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_conf.erl 2009-06-05 13:55:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_conf.erl 2009-09-18 13:47:33.000000000 +0100 @@ -25,10 +25,14 @@ %% Application internal API -export([load/1, load/2, load_mime_types/1, store/1, store/2, - remove/1, remove_all/1, config/1, get_config/2, get_config/3]). + remove/1, remove_all/1, config/1, get_config/2, get_config/3, + lookup/2, lookup/3, lookup/4, + validate_properties/1]). -define(VMODULE,"CONF"). -include("httpd.hrl"). +-include("httpd_internal.hrl"). + %%%========================================================================= %%% EWSAPI @@ -58,6 +62,8 @@ {ok,Directory}; is_directory(_Type,_Access,FileInfo,_Directory) -> {error,FileInfo}. + + %%------------------------------------------------------------------------- %% is_file(FilePath) -> Result %% FilePath = string() @@ -83,6 +89,8 @@ {ok,File}; is_file(_Type,_Access,FileInfo,_File) -> {error,FileInfo}. + + %%------------------------------------------------------------------------- %% make_integer(String) -> Result %% String = string() @@ -97,6 +105,8 @@ nomatch -> {error, nomatch} end. + + %%------------------------------------------------------------------------- %% clean(String) -> Stripped %% String = Stripped = string() @@ -108,6 +118,8 @@ {ok,CleanedString,_} = inets_regexp:gsub(String, "^[ \t\n\r\f]*|[ \t\n\r\f]*\$",""), CleanedString. + + %%------------------------------------------------------------------------- %% custom_clean(String,Before,After) -> Stripped %% Before = After = regexp() @@ -120,6 +132,8 @@ {ok,CleanedString,_} = inets_regexp:gsub(String,"^[ \t\n\r\f"++MoreBefore++ "]*|[ \t\n\r\f"++MoreAfter++"]*\$",""), CleanedString. + + %%------------------------------------------------------------------------- %% check_enum(EnumString,ValidEnumStrings) -> Result %% EnumString = string() @@ -137,20 +151,7 @@ check_enum(Enum, [_NotValid|Rest]) -> check_enum(Enum, Rest). -get_config(Address, Port) -> - Tab = httpd_util:make_name("httpd_conf", Address, Port), - Properties = ets:tab2list(Tab), - MimeTab = proplists:get_value(mime_types, Properties), - NewProperties = proplists:delete(mime_types, Properties), - [{mime_types, ets:tab2list(MimeTab)} | NewProperties]. - -get_config(Address, Port, Properties) -> - Tab = httpd_util:make_name("httpd_conf", Address, Port), - Config = - lists:map(fun(Prop) -> {Prop, httpd_util:lookup(Tab, Prop)} end, - Properties), - [{Proporty, Value} || {Proporty, Value} <- Config, Value =/= undefined]. - + %%%========================================================================= %%% Application internal API %%%========================================================================= @@ -164,20 +165,26 @@ %% Phase 1: Load load(ConfigFile) -> + ?hdrv("load config", [{config_file, ConfigFile}]), case read_config_file(ConfigFile) of {ok, Config} -> + ?hdrt("config read", []), case bootstrap(Config) of {error, Reason} -> + ?hdri("bootstrap failed", [{reason, Reason}]), {error, Reason}; {ok, Modules} -> + ?hdrd("config bootstrapped", [{modules, Modules}]), load_config(Config, lists:append(Modules, [?MODULE])) end; {error, Reason} -> + ?hdri("failed reading config file", [{reason, Reason}]), {error, ?NICE("Error while reading config file: "++Reason)} end. load(eof, []) -> eof; + load("MaxHeaderSize " ++ MaxHeaderSize, []) -> case make_integer(MaxHeaderSize) of {ok, Integer} -> @@ -207,6 +214,7 @@ load("ServerName " ++ ServerName, []) -> {ok,[],{server_name,clean(ServerName)}}; + load("SocketType " ++ SocketType, []) -> case check_enum(clean(SocketType),["ssl","ip_comm"]) of {ok, ValidSocketType} -> @@ -214,6 +222,7 @@ {error,_} -> {error, ?NICE(clean(SocketType) ++ " is an invalid SocketType")} end; + load("Port " ++ Port, []) -> case make_integer(Port) of {ok, Integer} -> @@ -221,24 +230,59 @@ {error, _} -> {error, ?NICE(clean(Port)++" is an invalid Port")} end; -load("BindAddress " ++ Address, []) -> + +load("BindAddress " ++ Address0, []) -> %% If an ipv6 address is provided in URL-syntax strip the %% url specific part e.i. "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]" %% -> "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210" - NewAddress = string:strip(string:strip(clean(Address), - left, $[), - right, $]), - case NewAddress of - "*" -> - {ok, [], {bind_address,any}}; - CAddress -> - case httpd_util:ip_address(CAddress) of - {ok, IPAddr} -> - {ok, [], {bind_address,IPAddr}}; - {error, _} -> - {error, ?NICE(CAddress++" is an invalid address")} + + try + begin + ?hdrv("load BindAddress", [{address0, Address0}]), + {Address, IpFamily} = + case string:tokens(Address0, [$|]) of + [Address1] -> + ?hdrv("load BindAddress", [{address1, Address1}]), + {clean_address(Address1), inet6fb4}; + [Address1, IpFamilyStr] -> + ?hdrv("load BindAddress", + [{address1, Address1}, + {ipfamily_str, IpFamilyStr}]), + {clean_address(Address1), make_ipfamily(IpFamilyStr)}; + _Bad -> + ?hdrv("load BindAddress - bad address", + [{bad_address, _Bad}]), + throw({error, {bad_bind_address, Address0}}) + end, + + ?hdrv("load BindAddress - address and ipfamily separated", + [{address, Address}, {ipfamily, IpFamily}]), + + case Address of + "*" -> + {ok, [], [{bind_address, any}, {ipfamily, IpFamily}]}; + _ -> + case httpd_util:ip_address(Address, IpFamily) of + {ok, IPAddr} -> + ?hdrv("load BindAddress - checked", + [{ip_address, IPAddr}]), + Entries = [{bind_address, IPAddr}, + {ipfamily, IpFamily}], + {ok, [], Entries}; + {error, _} -> + {error, ?NICE(Address ++ " is an invalid address")} + end end + end + catch + throw:{error, {bad_bind_address, _}} -> + ?hdrv("load BindAddress - bad bind address", []), + {error, ?NICE(Address0 ++ " is an invalid address")}; + throw:{error, {bad_ipfamily, _}} -> + ?hdrv("load BindAddress - bad ipfamily", []), + {error, ?NICE(Address0 ++ " has an invalid ipfamily")} end; + load("KeepAlive " ++ OnorOff, []) -> case list_to_atom(clean(OnorOff)) of off -> @@ -246,6 +290,7 @@ _ -> {ok, [], {keep_alive, true}} end; + load("MaxKeepAliveRequests " ++ MaxRequests, []) -> case make_integer(MaxRequests) of {ok, Integer} -> @@ -254,6 +299,7 @@ {error, ?NICE(clean(MaxRequests) ++ " is an invalid MaxKeepAliveRequests")} end; + %% This clause is keept for backwards compability load("MaxKeepAliveRequest " ++ MaxRequests, []) -> case make_integer(MaxRequests) of @@ -263,6 +309,7 @@ {error, ?NICE(clean(MaxRequests) ++ " is an invalid MaxKeepAliveRequest")} end; + load("KeepAliveTimeout " ++ Timeout, []) -> case make_integer(Timeout) of {ok, Integer} -> @@ -270,11 +317,14 @@ {error, _} -> {error, ?NICE(clean(Timeout)++" is an invalid KeepAliveTimeout")} end; + load("Modules " ++ Modules, []) -> {ok, ModuleList} = inets_regexp:split(Modules," "), {ok, [], {modules,[list_to_atom(X) || X <- ModuleList]}}; + load("ServerAdmin " ++ ServerAdmin, []) -> {ok, [], {server_admin,clean(ServerAdmin)}}; + load("ServerRoot " ++ ServerRoot, []) -> case is_directory(clean(ServerRoot)) of {ok, Directory} -> @@ -377,6 +427,21 @@ load("ErrorLogFormat " ++ LogFormat, []) -> {ok,[],{error_log_format, list_to_atom(httpd_conf:clean(LogFormat))}}. + +clean_address(Addr) -> + string:strip(string:strip(clean(Addr), left, $[), right, $]). + + +make_ipfamily(IpFamilyStr) -> + IpFamily = list_to_atom(IpFamilyStr), + case lists:member(IpFamily, [inet, inet6, inet6fb4]) of + true -> + IpFamily; + false -> + throw({error, {bad_ipfamily, IpFamilyStr}}) + end. + + %% %% load_mime_types/1 -> {ok, MimeTypes} | {error, Reason} %% @@ -388,6 +453,66 @@ {error, ?NICE("Can't open " ++ MimeTypesFile)} end. + +validate_properties(Properties) -> + %% First, check that all mandatory properties are present + case mandatory_properties(Properties) of + ok -> + %% Second, check that property dependency are ok + {ok, validate_properties2(Properties)}; + Error -> + throw(Error) + end. + +%% This function is used to validate inter-property dependencies. +%% That is, if property A depends on property B. +%% The only sunch preperty at this time is bind_address that depends +%% on ipfamily. +validate_properties2(Properties) -> + case proplists:get_value(bind_address, Properties) of + undefined -> + case proplists:get_value(sock_type, Properties, ip_comm) of + ip_comm -> + case proplists:get_value(ipfamily, Properties) of + undefined -> + [{bind_address, any}, + {ipfamily, inet6fb4} | Properties]; + _ -> + [{bind_address, any} | Properties] + end; + _ -> + [{bind_address, any} | Properties] + end; + any -> + Properties; + Address0 -> + IpFamily = proplists:get_value(ipfamily, Properties, inet6fb4), + case httpd_util:ip_address(Address0, IpFamily) of + {ok, Address} -> + Properties1 = proplists:delete(bind_address, Properties), + [{bind_address, Address} | Properties1]; + {error, Reason} -> + Error = {error, + {failed_determine_ip_address, + Address0, IpFamily, Reason}}, + throw(Error) + end + end. + +mandatory_properties(ConfigList) -> + a_must(ConfigList, [server_name, port, server_root, document_root]). + +a_must(_ConfigList, []) -> + ok; +a_must(ConfigList, [Prop | Rest]) -> + case proplists:get_value(Prop, ConfigList) of + undefined -> + {error, {missing_property, Prop}}; + _ -> + a_must(ConfigList, Rest) + end. + + validate_config_params([]) -> ok; validate_config_params([{max_header_size, Value} | Rest]) @@ -428,6 +553,14 @@ throw({bind_address, Value}) end; +validate_config_params([{ipfamily, Value} | Rest]) + when ((Value =:= inet) orelse + (Value =:= inet6) orelse + (Value =:= inet6fb4)) -> + validate_config_params(Rest); +validate_config_params([{ipfamily, Value} | _]) -> + throw({ipfamily, Value}); + validate_config_params([{keep_alive, Value} | Rest]) when (Value =:= true) orelse (Value =:= false) -> validate_config_params(Rest); @@ -533,10 +666,12 @@ validate_config_params([_| Rest]) -> validate_config_params(Rest). +%% It is actually pointless to check bind_address in this way since +%% we need ipfamily to do it properly... is_bind_address(any) -> true; is_bind_address(Value) -> - case httpd_util:ip_address(Value) of + case httpd_util:ip_address(Value, inet6fb4) of {ok, _} -> true; _ -> @@ -544,17 +679,20 @@ end. store(ConfigList0) -> + ?hdrd("store", []), try validate_config_params(ConfigList0) of ok -> Modules = proplists:get_value(modules, ConfigList0, ?DEFAULT_MODS), + ?hdrt("store", [{modules, Modules}]), Port = proplists:get_value(port, ConfigList0), Addr = proplists:get_value(bind_address, ConfigList0, any), ConfigList = fix_mime_types(ConfigList0), - Name = httpd_util:make_name("httpd_conf",Addr,Port), + Name = httpd_util:make_name("httpd_conf", Addr, Port), ConfigDB = ets:new(Name, [named_table, bag, protected]), store(ConfigDB, ConfigList, - lists:append(Modules,[?MODULE]), ConfigList) + lists:append(Modules, [?MODULE]), + ConfigList) catch throw:Error -> {error, {invalid_option, Error}} @@ -625,6 +763,40 @@ ip_comm end. + +get_config(Address, Port) -> + Tab = httpd_util:make_name("httpd_conf", Address, Port), + Properties = ets:tab2list(Tab), + MimeTab = proplists:get_value(mime_types, Properties), + NewProperties = proplists:delete(mime_types, Properties), + [{mime_types, ets:tab2list(MimeTab)} | NewProperties]. + +get_config(Address, Port, Properties) -> + Tab = httpd_util:make_name("httpd_conf", Address, Port), + Config = + lists:map(fun(Prop) -> {Prop, httpd_util:lookup(Tab, Prop)} end, + Properties), + [{Proporty, Value} || {Proporty, Value} <- Config, Value =/= undefined]. + + +lookup(Tab, Key) -> + httpd_util:lookup(Tab, Key). + +lookup(Tab, Key, Default) when is_atom(Key) -> + httpd_util:lookup(Tab, Key, Default); + +lookup(Address, Port, Key) when is_integer(Port) -> + Tab = table(Address, Port), + lookup(Tab, Key). + +lookup(Address, Port, Key, Default) when is_integer(Port) -> + Tab = table(Address, Port), + lookup(Tab, Key, Default). + +table(Address, Port) -> + httpd_util:make_name("httpd_conf", Address, Port). + + %%%======================================================================== %%% Internal functions %%%======================================================================== @@ -650,10 +822,13 @@ %% Create default contexts for all modules Contexts = lists:duplicate(length(Modules), []), load_config(Config, Modules, Contexts, []). + load_config([], _Modules, _Contexts, ConfigList) -> + ?hdrv("config loaded", []), {ok, ConfigList}; load_config([Line|Config], Modules, Contexts, ConfigList) -> + ?hdrt("load config", [{config_line, Line}]), case load_traverse(Line, Contexts, Modules, [], ConfigList, no) of {ok, NewContexts, NewConfigList} -> load_config(Config, Modules, NewContexts, NewConfigList); @@ -677,28 +852,45 @@ {ok, lists:reverse(NewContexts), ConfigList}; load_traverse(Line, [Context|Contexts], [Module|Modules], NewContexts, ConfigList, State) -> + ?hdrt("load config traverse", + [{context, Context}, {httpd_module, Module}, {state, State}]), case catch apply(Module, load, [Line, Context]) of - {'EXIT', {function_clause, _}} -> + {'EXIT', {function_clause, _FC}} -> + ?hdrt("does not handle load config", + [{config_line, Line}, {fc, _FC}]), load_traverse(Line, Contexts, Modules, [Context|NewContexts], ConfigList, State); - {'EXIT',{undef, _}} -> + + {'EXIT', {undef, _}} -> + ?hdrt("does not implement load", []), load_traverse(Line, Contexts, Modules, [Context|NewContexts], ConfigList,yes); + {'EXIT', Reason} -> error_logger:error_report({'EXIT', Reason}), load_traverse(Line, Contexts, Modules, [Context|NewContexts], ConfigList, State); + {ok, NewContext} -> + ?hdrt("line processed", [{new_context, NewContext}]), load_traverse(Line, Contexts, Modules, [NewContext|NewContexts], ConfigList,yes); + {ok, NewContext, ConfigEntry} when is_tuple(ConfigEntry) -> - load_traverse(Line, Contexts, - Modules, [NewContext|NewContexts], + ?hdrt("line processed", + [{new_context, NewContext}, {config_entry, ConfigEntry}]), + load_traverse(Line, Contexts, + Modules, [NewContext|NewContexts], [ConfigEntry|ConfigList], yes); + {ok, NewContext, ConfigEntry} when is_list(ConfigEntry) -> + ?hdrt("line processed", + [{new_context, NewContext}, {config_entry, ConfigEntry}]), load_traverse(Line, Contexts, Modules, [NewContext|NewContexts], lists:append(ConfigEntry, ConfigList), yes); + {error, Reason} -> + ?hdrv("line processing failed", [{reason, Reason}]), {error, Reason} end. @@ -776,35 +968,41 @@ [{Suffix,MimeType}|suffixes(MimeType,Rest)]. -%% Pahse 2: store -store(ConfigDB, _ConfigList, _Modules,[]) -> +%% Phase 2: store +store(ConfigDB, _ConfigList, _Modules, []) -> {ok, ConfigDB}; store(ConfigDB, ConfigList, Modules, [ConfigListEntry|Rest]) -> - case store_traverse(ConfigListEntry,ConfigList,Modules) of + ?hdrt("store", [{entry, ConfigListEntry}]), + case store_traverse(ConfigListEntry, ConfigList, Modules) of {ok, ConfigDBEntry} when is_tuple(ConfigDBEntry) -> - ets:insert(ConfigDB,ConfigDBEntry), - store(ConfigDB,ConfigList,Modules,Rest); + ets:insert(ConfigDB, ConfigDBEntry), + store(ConfigDB, ConfigList, Modules, Rest); {ok, ConfigDBEntry} when is_list(ConfigDBEntry) -> lists:foreach(fun(Entry) -> ets:insert(ConfigDB,Entry) end,ConfigDBEntry), - store(ConfigDB,ConfigList,Modules,Rest); + store(ConfigDB, ConfigList, Modules, Rest); {error, Reason} -> {error,Reason} end. store_traverse(_ConfigListEntry, _ConfigList,[]) -> - {error,?NICE("Unable to store configuration...")}; + {error, ?NICE("Unable to store configuration...")}; store_traverse(ConfigListEntry, ConfigList, [Module|Rest]) -> - case catch apply(Module,store,[ConfigListEntry, ConfigList]) of + ?hdrt("store traverse", + [{httpd_module, Module}, {entry, ConfigListEntry}]), + case catch apply(Module, store, [ConfigListEntry, ConfigList]) of {'EXIT',{function_clause,_}} -> + ?hdrt("does not handle store config", []), store_traverse(ConfigListEntry,ConfigList,Rest); {'EXIT',{undef, _}} -> + ?hdrt("does not implement store", []), store_traverse(ConfigListEntry,ConfigList,Rest); {'EXIT', Reason} -> error_logger:error_report({'EXIT',Reason}), store_traverse(ConfigListEntry,ConfigList,Rest); Result -> + ?hdrt("config entry processed", [{result, Result}]), Result end. diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd.erl 2009-06-05 13:55:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd.erl 2009-09-18 13:47:33.000000000 +0100 @@ -357,24 +357,22 @@ get_addr_and_port(ConfigFile) -> case httpd_conf:load(ConfigFile) of - {ok,ConfigList} -> - Port = proplists:get_value(port,ConfigList,80), - Address = - case proplists:get_value(bind_address, ConfigList) of - any -> - any; - Host -> - {ok, Addr} = httpd_util:ip_address(Host), - Addr - end, - {ok,Address,Port}; + {ok, ConfigList} -> + case httpd_conf:validate_properties(ConfigList) of + {ok, Config} -> + Address = proplists:get_value(bind_address, Config, any), + Port = proplists:get_value(port, Config, 80), + {ok, Address, Port}; + Error -> + Error + end; Error -> Error end. -make_name(Addr,Port) -> - httpd_util:make_name("httpd",Addr,Port). +make_name(Addr, Port) -> + httpd_util:make_name("httpd", Addr, Port). %%%-------------------------------------------------------------- @@ -508,19 +506,17 @@ end. do_reload_config(ConfigList, Mode) -> - Port = proplists:get_value(port,ConfigList,80), - Address = - case proplists:get_value(bind_address, ConfigList) of - any -> - any; - Host -> - {ok, Addr} = httpd_util:ip_address(Host), - Addr - end, - NewConfig = proplists:delete(bind_address, ConfigList), - block(Address, Port, Mode), - reload([{bind_address, Address} | NewConfig], Address, Port), - unblock(Address, Port). + case httpd_conf:validate_properties(ConfigList) of + {ok, Config} -> + Address = proplists:get_value(bind_address, Config, any), + Port = proplists:get_value(port, Config, 80), + block(Address, Port, Mode), + reload(Config, Address, Port), + unblock(Address, Port); + Error -> + Error + end. + %%%-------------------------------------------------------------- %%% Deprecated diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_instance_sup.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_instance_sup.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_instance_sup.erl 2009-03-12 12:30:19.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_instance_sup.erl 2009-09-18 13:47:41.000000000 +0100 @@ -37,13 +37,19 @@ %%% Internal Application API %%%========================================================================= start_link([{_, _}| _] = Config, AcceptTimeout, Debug) -> - Address = proplists:get_value(bind_address, Config), - Port = proplists:get_value(port, Config), - Name = make_name(Address, Port), - SupName = {local, Name}, - supervisor:start_link(SupName, ?MODULE, - [undefined, Config, AcceptTimeout, - Debug, Address, Port]); + case httpd_conf:validate_properties(Config) of + {ok, Config2} -> + Address = proplists:get_value(bind_address, Config2), + Port = proplists:get_value(port, Config2), + Name = make_name(Address, Port), + SupName = {local, Name}, + supervisor:start_link(SupName, ?MODULE, + [undefined, Config2, AcceptTimeout, + Debug, Address, Port]); + {error, Reason} -> + error_logger:error_report(Reason), + {stop, Reason} + end; start_link(ConfigFile, AcceptTimeout, Debug) -> case file_2_config(ConfigFile) of @@ -57,14 +63,22 @@ error_logger:error_report(Reason), {stop, Reason} end. + + start_link([{_, _}| _] = Config, AcceptTimeout, ListenInfo, Debug) -> - Address = proplists:get_value(bind_address, Config), - Port = proplists:get_value(port, Config), - Name = make_name(Address, Port), - SupName = {local, Name}, - supervisor:start_link(SupName, ?MODULE, - [undefined, Config, AcceptTimeout, - Debug, Address, Port, ListenInfo]); + case httpd_conf:validate_properties(Config) of + {ok, Config2} -> + Address = proplists:get_value(bind_address, Config2), + Port = proplists:get_value(port, Config2), + Name = make_name(Address, Port), + SupName = {local, Name}, + supervisor:start_link(SupName, ?MODULE, + [undefined, Config2, AcceptTimeout, + Debug, Address, Port, ListenInfo]); + {error, Reason} -> + error_logger:error_report(Reason), + {stop, Reason} + end; start_link(ConfigFile, AcceptTimeout, ListenInfo, Debug) -> case file_2_config(ConfigFile) of @@ -79,6 +93,7 @@ {stop, Reason} end. + %%%========================================================================= %%% Supervisor callback %%%========================================================================= @@ -139,9 +154,14 @@ file_2_config(ConfigFile) -> case httpd_conf:load(ConfigFile) of {ok, ConfigList} -> - Address = proplists:get_value(bind_address, ConfigList), - Port = proplists:get_value(port, ConfigList), - {ok, ConfigList, Address, Port}; + case httpd_conf:validate_properties(ConfigList) of + {ok, Config} -> + Address = proplists:get_value(bind_address, ConfigList), + Port = proplists:get_value(port, ConfigList), + {ok, Config, Address, Port}; + Error -> + Error + end; Error -> Error end. diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_internal.hrl erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_internal.hrl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_internal.hrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_internal.hrl 2009-09-18 13:47:59.000000000 +0100 @@ -0,0 +1,31 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% + +-ifndef(httpd_internal_hrl). +-define(httpd_internal_hrl, true). + +-include("inets_internal.hrl"). +-define(SERVICE, httpd). +-define(hdri(Label, Content), ?report_important(Label, ?SERVICE, Content)). +-define(hdrv(Label, Content), ?report_verbose(Label, ?SERVICE, Content)). +-define(hdrd(Label, Content), ?report_debug(Label, ?SERVICE, Content)). +-define(hdrt(Label, Content), ?report_trace(Label, ?SERVICE, Content)). + +-endif. % -ifdef(httpd_internal_hrl). diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_manager.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_manager.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_manager.erl 2009-06-05 13:55:35.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_manager.erl 2009-09-18 13:47:40.000000000 +0100 @@ -716,11 +716,24 @@ handle_reload(undefined, #state{config_file = undefined} = State) -> {continue, {error, undefined_config_file}, State}; handle_reload(undefined, #state{config_file = ConfigFile} = State) -> - {ok, Config} = httpd_conf:load(ConfigFile), - do_reload(Config, State); + case load_config(ConfigFile) of + {ok, Config} -> + do_reload(Config, State); + {error, Reason} -> + error_logger:error_msg("Bad config file: ~p~n", [Reason]), + {continue, {error, Reason}, State} + end; handle_reload(Config, State) -> do_reload(Config, State). +load_config(ConfigFile) -> + case httpd_conf:load(ConfigFile) of + {ok, Config} -> + httpd_conf:validate_properties(Config); + Error -> + Error + end. + do_reload(Config, #state{config_db = Db} = State) -> case (catch check_constant_values(Db, Config)) of ok -> diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_request_handler.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_request_handler.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_request_handler.erl 2009-06-05 13:55:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_request_handler.erl 2009-09-18 13:47:34.000000000 +0100 @@ -33,6 +33,7 @@ -include("httpd.hrl"). -include("http_internal.hrl"). +-include("httpd_internal.hrl"). -record(state, {mod, %% #mod{} manager, %% pid() @@ -59,6 +60,7 @@ start(Manager, ConfigDB, AcceptTimeout) -> proc_lib:start(?MODULE, init, [[Manager, ConfigDB,AcceptTimeout]]). + %%-------------------------------------------------------------------- %% socket_ownership_transfered(Pid, SocketType, Socket) -> void() %% @@ -82,7 +84,9 @@ %% gen_server callback init, as a more complex init than the %% gen_server provides is needed. %%-------------------------------------------------------------------- -init([Manager, ConfigDB,AcceptTimeout]) -> +init([Manager, ConfigDB, AcceptTimeout]) -> + ?hdrd("initiate", + [{manager, Manager}, {cdb, ConfigDB}, {timeout, AcceptTimeout}]), %% Make sure this process terminates if the httpd manager process %% should die! link(Manager), @@ -90,20 +94,24 @@ proc_lib:init_ack({ok, self()}), {SocketType, Socket} = await_socket_ownership_transfer(AcceptTimeout), - + ?hdrd("socket ownership transfered", + [{socket_type, SocketType}, {socket, Socket}]), + TimeOut = httpd_util:lookup(ConfigDB, keep_alive_timeout, 150000), Then = erlang:now(), - case http_transport:negotiate(SocketType,Socket,TimeOut) of + case http_transport:negotiate(SocketType, Socket, TimeOut) of {error, Error} -> exit(Error); %% Can be 'normal'. ok -> + ?hdrt("negotiated", []), NewTimeout = TimeOut - timer:now_diff(now(),Then) div 1000, - continue_init(Manager, ConfigDB, SocketType,Socket,NewTimeout) + continue_init(Manager, ConfigDB, SocketType, Socket, NewTimeout) end. continue_init(Manager, ConfigDB, SocketType, Socket, TimeOut) -> + ?hdrt("continue init", [{timeout, TimeOut}]), Resolve = http_transport:resolve(), Peername = httpd_socket:peername(SocketType, Socket), @@ -122,17 +130,25 @@ {_, Status} = httpd_manager:new_connection(Manager), - State = #state{mod = Mod, manager = Manager, status = Status, - timeout = TimeOut, max_keep_alive_request = NrOfRequest, - mfa = {httpd_request, parse, [{MaxURISize, - MaxHeaderSize}]}}, + MFA = {httpd_request, parse, [{MaxURISize, MaxHeaderSize}]}, + + State = #state{mod = Mod, + manager = Manager, + status = Status, + timeout = TimeOut, + max_keep_alive_request = NrOfRequest, + mfa = MFA}, + ?hdrt("activate request timeout", []), NewState = activate_request_timeout(State), + ?hdrt("update socket options", []), http_transport:setopts(SocketType, Socket, [binary,{packet, 0}, {active, once}]), + ?hdrt("init done", []), gen_server:enter_loop(?MODULE, [], NewState). + %%==================================================================== %% gen_server callbacks %%==================================================================== @@ -165,15 +181,22 @@ %% Description: Handling all non call/cast messages %%-------------------------------------------------------------------- handle_info({Proto, Socket, Data}, State = - #state{mfa = {Module, Function, Args}, + #state{mfa = {Module, Function, Args} = MFA, mod = #mod{socket_type = SockType, socket = Socket} = ModData} = State) - when (Proto =:= tcp) orelse (Proto =:= ssl) orelse (Proto =:= dummy) -> + when (((Proto =:= tcp) orelse + (Proto =:= ssl) orelse + (Proto =:= dummy)) andalso is_binary(Data)) -> + ?hdrd("received data", + [{data, Data}, {proto, Proto}, + {socket, Socket}, {socket_type, SockType}, {mfa, MFA}]), case Module:Function([Data | Args]) of {ok, Result} -> + ?hdrd("data processed", [{result, Result}]), NewState = cancel_request_timeout(State), handle_http_msg(Result, NewState); {error, {uri_too_long, MaxSize}, Version} -> + ?hdrv("uri too long", [{max_size, MaxSize}, {version, Version}]), NewModData = ModData#mod{http_version = Version}, httpd_response:send_status(NewModData, 414, "URI too long"), Reason = io_lib:format("Uri too long, max size is ~p~n", @@ -182,6 +205,7 @@ {stop, normal, State#state{response_sent = true, mod = NewModData}}; {error, {header_too_long, MaxSize}, Version} -> + ?hdrv("header too long", [{max_size, MaxSize}, {version, Version}]), NewModData = ModData#mod{http_version = Version}, httpd_response:send_status(NewModData, 413, "Header too long"), Reason = io_lib:format("Header too long, max size is ~p~n", @@ -190,6 +214,7 @@ {stop, normal, State#state{response_sent = true, mod = NewModData}}; NewMFA -> + ?hdrd("data processed - reactivate socket", [{new_mfa, NewMFA}]), http_transport:setopts(SockType, Socket, [{active, once}]), {noreply, State#state{mfa = NewMFA}} end; @@ -223,6 +248,7 @@ error_log(Error, ModData), {noreply, State}. + %%-------------------------------------------------------------------- %% terminate(Reason, State) -> void() %% @@ -264,26 +290,32 @@ exit(accept_socket_timeout) end. -handle_http_msg({_, _, Version, {_, _}, _}, #state{status = busy, - mod = ModData} = State) -> +handle_http_msg({_, _, Version, {_, _}, _}, + #state{status = busy, mod = ModData} = State) -> + ?hdrt("handle http msg when manager busy", [{mod, ModData}]), handle_manager_busy(State#state{mod = ModData#mod{http_version = Version}}), {stop, normal, State}; handle_http_msg({_, _, Version, {_, _}, _}, #state{status = blocked, mod = ModData} = State) -> + ?hdrt("handle http msg when manager blocket", [{mod, ModData}]), handle_manager_blocked(State#state{mod = ModData#mod{http_version = Version}}), {stop, normal, State}; handle_http_msg({Method, Uri, Version, {RecordHeaders, Headers}, Body}, #state{status = accept, mod = ModData} = State) -> + ?hdrt("handle http msg when manager accepting", + [{method, Method}, {mod, ModData}]), case httpd_request:validate(Method, Uri, Version) of ok -> + ?hdrt("request validated", []), {ok, NewModData} = httpd_request:update_mod_data(ModData, Method, Uri, Version, Headers), + ?hdrt("new mod data", [{mod, NewModData}]), case is_host_specified_if_required(NewModData#mod.absolute_uri, RecordHeaders, Version) of true -> @@ -297,18 +329,23 @@ {stop, normal, State#state{response_sent = true}} end; {error, {not_supported, What}} -> + ?hdrd("validation failed: not supported", [{what, What}]), httpd_response:send_status(ModData#mod{http_version = Version}, 501, {Method, Uri, Version}), Reason = io_lib:format("Not supported: ~p~n", [What]), error_log(Reason, ModData), {stop, normal, State#state{response_sent = true}}; {error, {bad_request, {forbidden, URI}}} -> + ?hdrd("validation failed: bad request - forbidden", + [{uri, URI}]), httpd_response:send_status(ModData#mod{http_version = Version}, 403, URI), Reason = io_lib:format("Forbidden URI: ~p~n", [URI]), error_log(Reason, ModData), {stop, normal, State#state{response_sent = true}}; {error,{bad_request, {malformed_syntax, URI}}} -> + ?hdrd("validation failed: bad request - malformed syntax", + [{uri, URI}]), httpd_response:send_status(ModData#mod{http_version = Version}, 400, URI), Reason = io_lib:format("Malformed syntax in URI: ~p~n", [URI]), @@ -317,9 +354,12 @@ end; handle_http_msg({ChunkedHeaders, Body}, State = #state{headers = Headers}) -> + ?hdrt("handle http msg", + [{chunked_headers, ChunkedHeaders}, {body, Body}]), NewHeaders = http_chunk:handle_headers(Headers, ChunkedHeaders), handle_response(State#state{headers = NewHeaders, body = Body}); handle_http_msg(Body, State) -> + ?hdrt("handle http msg", [{body, Body}]), handle_response(State#state{body = Body}). handle_manager_busy(#state{mod = #mod{config_db = ConfigDB}} = State) -> @@ -342,7 +382,7 @@ true. handle_body(#state{mod = #mod{config_db = ConfigDB}} = State) -> - + ?hdrt("handle body", []), MaxHeaderSize = httpd_util:lookup(ConfigDB, max_header_size, ?HTTP_MAX_HEADER_SIZE), MaxBodySize = httpd_util:lookup(ConfigDB, max_body_size, nolimit), @@ -357,22 +397,34 @@ handle_body(#state{headers = Headers, body = Body, mod = ModData} = State, MaxHeaderSize, MaxBodySize) -> + ?hdrt("handle body", [{headers, Headers}, {body, Body}]), case Headers#http_request_h.'transfer-encoding' of "chunked" -> + ?hdrt("chunked - attempt decode", []), case http_chunk:decode(Body, MaxBodySize, MaxHeaderSize) of {Module, Function, Args} -> + ?hdrt("chunk decoded", + [{module, Module}, + {function, Function}, + {args, Args}]), http_transport:setopts(ModData#mod.socket_type, ModData#mod.socket, [{active, once}]), {noreply, State#state{mfa = {Module, Function, Args}}}; {ok, {ChunkedHeaders, NewBody}} -> + ?hdrt("chunk decoded", + [{chunked_headers, ChunkedHeaders}, + {new_body, NewBody}]), NewHeaders = http_chunk:handle_headers(Headers, ChunkedHeaders), + ?hdrt("chunked - headers handled", + [{new_headers, NewHeaders}]), handle_response(State#state{headers = NewHeaders, body = NewBody}) end; Encoding when is_list(Encoding) -> + ?hdrt("not chunked - encoding", [{encoding, Encoding}]), httpd_response:send_status(ModData, 501, "Unknown Transfer-Encoding"), Reason = io_lib:format("Unknown Transfer-Encoding: ~p~n", @@ -380,12 +432,17 @@ error_log(Reason, ModData), {stop, normal, State#state{response_sent = true}}; _ -> + ?hdrt("not chunked", []), Length = list_to_integer(Headers#http_request_h.'content-length'), case ((Length =< MaxBodySize) or (MaxBodySize == nolimit)) of true -> case httpd_request:whole_body(Body, Length) of {Module, Function, Args} -> + ?hdrt("whole body", + [{module, Module}, + {function, Function}, + {args, Args}]), http_transport:setopts(ModData#mod.socket_type, ModData#mod.socket, [{active, once}]), @@ -393,11 +450,15 @@ {Module, Function, Args}}}; {ok, NewBody} -> + ?hdrt("whole body", + [{new_body, NewBody}]), handle_response( State#state{headers = Headers, body = NewBody}) end; false -> + ?hdrd("body too long", + [{length, Length}, {max_body_size, MaxBodySize}]), httpd_response:send_status(ModData, 413, "Body too long"), error_log("Body too long", ModData), {stop, normal, State#state{response_sent = true}} @@ -455,15 +516,22 @@ end end. -handle_response(#state{body = Body, mod = ModData, headers = Headers, +handle_response(#state{body = Body, + mod = ModData, + headers = Headers, max_keep_alive_request = Max} = State) when Max > 0 -> + ?hdrt("handle response", + [{body, Body}, {mod, ModData}, {headers, Headers}, {max, Max}]), {NewBody, Data} = httpd_request:body_data(Headers, Body), ok = httpd_response:generate_and_send_response( ModData#mod{entity_body = NewBody}), handle_next_request(State#state{response_sent = true}, Data); -handle_response(#state{body = Body, headers = Headers, - mod = ModData} = State) -> +handle_response(#state{body = Body, + headers = Headers, + mod = ModData} = State) -> + ?hdrt("handle response", + [{body, Body}, {mod, ModData}, {headers, Headers}]), {NewBody, _} = httpd_request:body_data(Headers, Body), ok = httpd_response:generate_and_send_response( ModData#mod{entity_body = NewBody}), @@ -471,6 +539,7 @@ handle_next_request(#state{mod = #mod{connection = true} = ModData, max_keep_alive_request = Max} = State, Data) -> + ?hdrt("handle next request", [{max, Max}]), NewModData = #mod{socket_type = ModData#mod.socket_type, socket = ModData#mod.socket, config_db = ModData#mod.config_db, @@ -483,8 +552,9 @@ TmpState = State#state{mod = NewModData, mfa = {httpd_request, parse, [{MaxURISize, MaxHeaderSize}]}, - max_keep_alive_request = decrease(Max), - headers = undefined, body = undefined, + max_keep_alive_request = decrease(Max), + headers = undefined, + body = undefined, response_sent = false}, NewState = activate_request_timeout(TmpState), @@ -499,9 +569,11 @@ end; handle_next_request(State, _) -> + ?hdrt("handle next request - stop", []), {stop, normal, State}. activate_request_timeout(#state{timeout = Time} = State) -> + ?hdrt("activate request timeout", [{time, Time}]), Ref = erlang:send_after(Time, self(), timeout), State#state{timer = Ref}. diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_response.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_response.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_response.erl 2009-06-05 13:55:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_response.erl 2009-11-20 13:35:55.000000000 +0000 @@ -25,6 +25,7 @@ -include("httpd.hrl"). -include("http_internal.hrl"). +-include("httpd_internal.hrl"). -define(VMODULE,"RESPONSE"). @@ -67,8 +68,10 @@ traverse_modules(ModData,[]) -> {proceed,ModData#mod.data}; traverse_modules(ModData,[Module|Rest]) -> - case (catch apply(Module,do,[ModData])) of + ?hdrd("traverse modules", [{callback_module, Module}]), + case (catch apply(Module, do, [ModData])) of {'EXIT', Reason} -> + ?hdrd("traverse modules - exit", [{reason, Reason}]), String = lists:flatten( io_lib:format("traverse exit from apply: ~p:do => ~n~p", @@ -77,11 +80,14 @@ report_error(mod_disk_log, ModData#mod.config_db, String), done; done -> + ?hdrt("traverse modules - done", []), done; - {break,NewData} -> - {proceed,NewData}; - {proceed,NewData} -> - traverse_modules(ModData#mod{data=NewData},Rest) + {break, NewData} -> + ?hdrt("traverse modules - break", [{new_data, NewData}]), + {proceed, NewData}; + {proceed, NewData} -> + ?hdrt("traverse modules - proceed", [{new_data, NewData}]), + traverse_modules(ModData#mod{data = NewData}, Rest) end. %% send_status %% @@ -179,7 +185,12 @@ send_body(#mod{socket_type = Type, socket = Sock}, _StatusCode, Body) when is_list(Body) -> - ok = httpd_socket:deliver(Type, Sock, Body); + case httpd_socket:deliver(Type, Sock, Body) of + socket_closed -> + done; + Else -> + Else + end; send_body(#mod{socket_type = Type, socket = Sock} = ModData, StatusCode, {Fun, Args}) -> diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_sup.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_sup.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_sup.erl 2009-03-12 12:32:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_sup.erl 2009-09-18 13:47:50.000000000 +0100 @@ -36,6 +36,8 @@ -export([listen_init/4]). -define(TIMEOUT, 15000). +-include("httpd_internal.hrl"). + %%%========================================================================= %%% API @@ -47,24 +49,20 @@ supervisor:start_link(?MODULE, [HttpdServices]). start_child(Config) -> - Spec = - try httpd_config(Config) of - NewConfig -> - httpd_child_spec(NewConfig, ?TIMEOUT, []) - catch - %% When httpd is started at another time than - %% the inets application start it is allowed - %% to start from a property list. - {error, mandatory_config_file_missing} -> - httpd_child_spec(Config, ?TIMEOUT, []) - end, - - case supervisor:start_child(?MODULE, Spec) of - {error,{invalid_child_spec, Error}} -> - Error; - Other -> - Other + try httpd_config(Config) of + {ok, NewConfig} -> + Spec = httpd_child_spec(NewConfig, ?TIMEOUT, []), + case supervisor:start_child(?MODULE, Spec) of + {error, {invalid_child_spec, Error}} -> + Error; + Other -> + Other + end + catch + throw:Error -> + Error end. + restart_child(Address, Port) -> Name = id(Address, Port), @@ -87,16 +85,19 @@ id(Address, Port) -> {httpd_instance_sup, Address, Port}. + %%%========================================================================= %%% Supervisor callback %%%========================================================================= init([HttpdServices]) -> + ?hdrd("starting", []), RestartStrategy = one_for_one, MaxR = 10, MaxT = 3600, Children = child_specs(HttpdServices, []), {ok, {{RestartStrategy, MaxR, MaxT}, Children}}. + %%%========================================================================= %%% Internal functions %%%========================================================================= @@ -117,39 +118,38 @@ child_specs([], Acc) -> Acc; child_specs([{httpd, HttpdService} | Rest], Acc) -> - NewHttpdService = mk_tuple_list(HttpdService), + ?hdrd("child specs", [{httpd, HttpdService}]), + NewHttpdService = (catch mk_tuple_list(HttpdService)), + ?hdrd("child specs", [{new_httpd, NewHttpdService}]), case catch child_spec(NewHttpdService) of {error, Reason} -> + ?hdri("failed generating child spec", [{reason, Reason}]), error_msg("Failed to start service: ~n~p ~n due to: ~p~n", [HttpdService, Reason]), child_specs(Rest, Acc); Spec -> + ?hdrt("child spec", [{child_spec, Spec}]), child_specs(Rest, [Spec | Acc]) end. child_spec(HttpdService) -> - Debug = proplists:get_value(debug, HttpdService, []), - AcceptTimeout = proplists:get_value(accept_timeout, HttpdService, 15000), - Config = httpd_config(HttpdService), + {ok, Config} = httpd_config(HttpdService), + ?hdrt("child spec", [{config, Config}]), + Debug = proplists:get_value(debug, Config, []), + AcceptTimeout = proplists:get_value(accept_timeout, Config, 15000), httpd_util:valid_options(Debug, AcceptTimeout, Config), httpd_child_spec(Config, AcceptTimeout, Debug). -httpd_config([Value| _] = HttpdService) when is_tuple(Value) -> - case proplists:get_value(file, HttpdService) of +httpd_config([Value| _] = Config) when is_tuple(Value) -> + case proplists:get_value(file, Config) of undefined -> - case proplists:get_value(proplist_file, HttpdService) of + case proplists:get_value(proplist_file, Config) of undefined -> - case mandatory_properties(HttpdService) of - ok -> % stand alone start - HttpdService; - _ -> - throw({error, - mandatory_config_file_missing}) - end; + httpd_conf:validate_properties(Config); File -> try file:consult(File) of {ok, [PropList]} -> - PropList + httpd_conf:validate_properties(PropList) catch exit:_ -> throw({error, @@ -157,37 +157,24 @@ end end; File -> - File + {ok, File} end. httpd_child_spec([Value| _] = Config, AcceptTimeout, Debug) when is_tuple(Value) -> - case mandatory_properties(Config) of - ok -> - case address(Config) of - {ok, Address, NewConfig} -> - Port = - proplists:get_value(port, NewConfig, 80), - httpd_child_spec(NewConfig, AcceptTimeout, - Debug, Address, Port); - Error -> - Error - end; - Error -> - Error - end; + Address = proplists:get_value(bind_address, Config, any), + Port = proplists:get_value(port, Config, 80), + httpd_child_spec(Config, AcceptTimeout, Debug, Address, Port); httpd_child_spec(ConfigFile, AcceptTimeout, Debug) -> case httpd_conf:load(ConfigFile) of {ok, ConfigList} -> - case mandatory_properties(ConfigList) of - ok -> - Port = proplists:get_value(port, ConfigList, 80), - Address = proplists:get_value(bind_address, ConfigList, - any), - httpd_child_spec([{file, ConfigFile} | ConfigList], - AcceptTimeout, - Debug, Address, Port); + case httpd_conf:validate_properties(ConfigList) of + {ok, Config} -> + Address = proplists:get_value(bind_address, Config, any), + Port = proplists:get_value(port, Config, 80), + httpd_child_spec([{file, ConfigFile} | Config], + AcceptTimeout, Debug, Address, Port); Error -> Error end; @@ -228,7 +215,7 @@ mk_tuple_list([H={_,_}|T]) -> [H|mk_tuple_list(T)]; mk_tuple_list(F) -> - [{file,F}]. + [{file, F}]. error_msg(F, A) -> error_logger:error_msg(F ++ "~n", A). @@ -249,20 +236,6 @@ {error, {socket_start_failed, Reason}} end. -address(Config) -> - case proplists:get_value(bind_address, Config, any) of - any -> - {ok, any, Config}; - Host -> - case httpd_util:ip_address(Host) of - {ok, Address} -> - NewConfig = proplists:delete(bind_address, Config), - {ok, Address, [{bind_address, Address} | NewConfig]}; - {error, Reason} -> - {error, Reason} - end - end. - start_listen(Address, Port, Config) -> Pid = listen_owner(Address, Port, Config), receive @@ -285,19 +258,6 @@ ok end. -mandatory_properties(ConfigList) -> - a_must(ConfigList, [server_name,port,server_root,document_root]). - -a_must(_ConfigList, []) -> - ok; -a_must(ConfigList, [Prop | Rest]) -> - case proplists:get_value(Prop, ConfigList) of - undefined -> - {error, {missing_property, Prop}}; - _ -> - a_must(ConfigList, Rest) - end. - diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_util.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_util.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/httpd_util.erl 2009-06-05 13:55:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/httpd_util.erl 2009-09-18 13:47:33.000000000 +0100 @@ -18,7 +18,7 @@ %% %% -module(httpd_util). --export([ip_address/1, lookup/2, lookup/3, multi_lookup/2, +-export([ip_address/2, lookup/2, lookup/3, multi_lookup/2, lookup_mime/2, lookup_mime/3, lookup_mime_default/2, lookup_mime_default/3, reason_phrase/1, message/3, rfc1123_date/0, rfc1123_date/1, day/1, month/1, decode_hex/1, @@ -35,11 +35,14 @@ -export([encode_hex/1]). -include_lib("kernel/include/file.hrl"). -ip_address({_,_,_,_} = Address) -> +ip_address({_,_,_,_} = Address, _IpFamily) -> {ok, Address}; -ip_address({_,_,_,_,_,_,_,_} = Address) -> +ip_address({_,_,_,_,_,_,_,_} = Address, _IpFamily) -> {ok, Address}; -ip_address(Host) -> +ip_address(Host, IpFamily) + when ((IpFamily =:= inet) orelse (IpFamily =:= inet6)) -> + inet:getaddr(Host, IpFamily); +ip_address(Host, inet6fb4 = _IpFamily) -> Inet = case gen_tcp:listen(0, [inet6]) of {ok, Dummyport} -> gen_tcp:close(Dummyport), @@ -49,6 +52,7 @@ end, inet:getaddr(Host, Inet). + %% lookup lookup(Table,Key) -> @@ -689,10 +693,12 @@ mime_types_validate(MimeFile) -> mime_type_validate(MimeFile). -valid_options(Debug,AcceptTimeout,ConfigFile) -> + +valid_options(Debug, AcceptTimeout, Config) -> valid_debug(Debug), valid_accept_timeout(AcceptTimeout), - valid_config_file(ConfigFile). + valid_config(Config). + valid_debug([]) -> ok; valid_debug(disable) -> @@ -700,7 +706,8 @@ valid_debug(L) when is_list(L) -> valid_debug2(L); valid_debug(D) -> - throw({error,{bad_debug_option,D}}). + throw({error, {bad_debug_option,D}}). + valid_debug2([{all_functions,L}|Rest]) when is_list(L) -> try modules_validate(L) of ok -> @@ -719,13 +726,16 @@ throw({error,{bad_debug_option,H}}); valid_debug2([]) -> ok. + valid_accept_timeout(I) when is_integer(I) -> ok; valid_accept_timeout(A) -> throw({error,{bad_debug_option,A}}). -valid_config_file(_) -> + +valid_config(_) -> ok. + %%---------------------------------------------------------------------- %% Enable debugging, %%---------------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/Makefile erlang-13.b.3-dfsg/lib/inets/src/http_server/Makefile --- erlang-13.b.1-dfsg/lib/inets/src/http_server/Makefile 2009-06-05 13:26:45.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/Makefile 2009-09-18 13:47:51.000000000 +0100 @@ -21,6 +21,7 @@ EBIN = ../../ebin include $(ERL_TOP)/make/$(TARGET)/otp.mk + # ---------------------------------------------------- # Application version # ---------------------------------------------------- @@ -28,11 +29,13 @@ VSN = $(INETS_VSN) + # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- RELSYSDIR = $(RELEASE_PATH)/lib/inets-$(VSN) + # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- @@ -79,12 +82,13 @@ mod_security \ mod_security_server -HRL_FILES = httpd.hrl mod_auth.hrl +HRL_FILES = httpd.hrl httpd_internal.hrl mod_auth.hrl ERL_FILES = $(MODULES:%=%.erl) TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) + # ---------------------------------------------------- # INETS FLAGS # ---------------------------------------------------- @@ -100,6 +104,8 @@ $(INETS_FLAGS) \ +'{parse_transform,sys_pre_attributes}' \ +'{attribute,insert,app_vsn,$(APP_VSN)}' + + # ---------------------------------------------------- # Targets # ---------------------------------------------------- @@ -111,6 +117,8 @@ rm -f core docs: + + # ---------------------------------------------------- # Release Target # ---------------------------------------------------- @@ -129,11 +137,3 @@ @echo "INETS_FLAGS = $(INETS_FLAGS)" @echo "ERL_COMPILE_FLAGS = $(ERL_COMPILE_FLAGS)" - - - - - - - - diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/mod_auth.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/mod_auth.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/mod_auth.erl 2009-06-05 13:55:02.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/mod_auth.erl 2009-09-18 13:47:34.000000000 +0100 @@ -37,6 +37,7 @@ -include("httpd.hrl"). -include("mod_auth.hrl"). +-include("httpd_internal.hrl"). -define(VMODULE,"AUTH"). @@ -44,6 +45,7 @@ %% do do(Info) -> + ?hdrt("do", [{info, Info}]), case proplists:get_value(status,Info#mod.data) of %% A status code has been generated! {_StatusCode, _PhraseArgs, _Reason} -> @@ -58,19 +60,24 @@ %% Is it a secret area? case secretp(Path,Info#mod.config_db) of {yes, {Directory, DirectoryData}} -> + ?hdrt("secret area", + [{directory, Directory}, + {directory_data, DirectoryData}]), + %% Authenticate (allow) case allow((Info#mod.init_data)#init_data.peername, Info#mod.socket_type,Info#mod.socket, DirectoryData) of allowed -> + ?hdrt("allowed", []), case deny((Info#mod.init_data)#init_data.peername, Info#mod.socket_type, Info#mod.socket, DirectoryData) of not_denied -> + ?hdrt("not denied", []), case proplists:get_value(auth_type, - DirectoryData - ) of + DirectoryData) of undefined -> {proceed, Info#mod.data}; none -> @@ -82,6 +89,7 @@ AuthType) end; {denied, Reason} -> + ?hdrt("denied", [{reason, Reason}]), {proceed, [{status, {403, Info#mod.request_uri, @@ -89,6 +97,7 @@ Info#mod.data]} end; {not_allowed, Reason} -> + ?hdrt("not allowed", [{reason, Reason}]), {proceed,[{status,{403, Info#mod.request_uri, Reason}} | @@ -104,14 +113,18 @@ end. -do_auth(Info, Directory, DirectoryData, _AuthType) -> +do_auth(Info, Directory, DirectoryData, AuthType) -> %% Authenticate (require) + ?hdrt("authenticate", [{auth_type, AuthType}]), case require(Info, Directory, DirectoryData) of authorized -> + ?hdrt("authorized", []), {proceed,Info#mod.data}; {authorized, User} -> + ?hdrt("authorized", [{user, User}]), {proceed, [{remote_user,User}|Info#mod.data]}; {authorization_required, Realm} -> + ?hdrt("authorization required", [{realm, Realm}]), ReasonPhrase = httpd_util:reason_phrase(401), Message = httpd_util:message(401,none,Info#mod.config_db), {proceed, @@ -134,7 +147,6 @@ ParsedHeader = Info#mod.parsed_header, ValidUsers = proplists:get_value(require_user, DirectoryData), ValidGroups = proplists:get_value(require_group, DirectoryData), - %% Any user or group restrictions? case ValidGroups of undefined when ValidUsers =:= undefined -> @@ -143,7 +155,7 @@ case proplists:get_value("authorization", ParsedHeader) of undefined -> authorization_required(DirectoryData); - %% Chec kcredentials! + %% Check credentials! "Basic" ++ EncodedString = Credentials -> case (catch base64:decode_to_string(EncodedString)) of {'EXIT',{function_clause, _}} -> @@ -185,7 +197,7 @@ a_valid_user(Info,DecodedString,ValidUsers,ValidGroups,Dir,DirData) -> case httpd_util:split(DecodedString,":",2) of - {ok,[SupposedUser, Password]} -> + {ok, [SupposedUser, Password]} -> case user_accepted(SupposedUser, ValidUsers) of true -> check_password(SupposedUser, Password, Dir, DirData); @@ -198,7 +210,7 @@ {no,?NICE("No such user exists")} end end; - {ok,BadCredentials} -> + {ok, BadCredentials} -> {status,{401,none,?NICE("Bad credentials "++BadCredentials)}} end. @@ -236,7 +248,7 @@ _ -> {no, "No such user"} % Don't say 'Bad Password' !!! end; - _ -> + _Other -> {no, "No such user"} end. @@ -252,9 +264,9 @@ auth_mod_name(DirData) -> case proplists:get_value(auth_type, DirData, plain) of - plain -> mod_auth_plain; - mnesia -> mod_auth_mnesia; - dets -> mod_auth_dets + plain -> mod_auth_plain; + mnesia -> mod_auth_mnesia; + dets -> mod_auth_dets end. @@ -374,13 +386,13 @@ load("AuthUserFile " ++ AuthUserFile0, [{directory, {Directory, DirData}}|Rest]) -> AuthUserFile = httpd_conf:clean(AuthUserFile0), - {ok,[{directory, {Directory, + {ok, [{directory, {Directory, [{auth_user_file, AuthUserFile}|DirData]}} | Rest ]}; load("AuthGroupFile " ++ AuthGroupFile0, [{directory, {Directory, DirData}}|Rest]) -> AuthGroupFile = httpd_conf:clean(AuthGroupFile0), {ok,[{directory, {Directory, - [ {auth_group_file, AuthGroupFile}|DirData]}} | Rest]}; + [{auth_group_file, AuthGroupFile}|DirData]}} | Rest]}; %AuthAccessPassword load("AuthAccessPassword " ++ AuthAccessPassword0, @@ -473,6 +485,8 @@ store({directory, {Directory, DirData}}, ConfigList) when is_list(Directory) andalso is_list(DirData) -> + ?hdrt("store", + [{directory, Directory}, {dir_data, DirData}]), try directory_config_check(Directory, DirData) of ok -> store_directory(Directory, DirData, ConfigList) @@ -484,6 +498,8 @@ {error, {wrong_type, {directory, {Directory, DirData}}}}. store_directory(Directory0, DirData0, ConfigList) -> + ?hdrt("store directory - entry", + [{directory, Directory0}, {dir_data, DirData0}]), Port = proplists:get_value(port, ConfigList), DirData = case proplists:get_value(bind_address, ConfigList) of undefined -> @@ -491,14 +507,14 @@ Addr -> [{port, Port},{bind_address,Addr}|DirData0] end, - Directory = - case filename:pathtype(Directory0) of - relative -> - SR = proplists:get_value(server_root, ConfigList), - filename:join(SR, Directory0); - _ -> - Directory0 - end, + Directory = + case filename:pathtype(Directory0) of + relative -> + SR = proplists:get_value(server_root, ConfigList), + filename:join(SR, Directory0); + _ -> + Directory0 + end, AuthMod = case proplists:get_value(auth_type, DirData0) of mnesia -> mod_auth_mnesia; @@ -506,27 +522,32 @@ plain -> mod_auth_plain; _ -> no_module_at_all end, + ?hdrt("store directory", + [{directory, Directory}, {dir_data, DirData}, {auth_mod, AuthMod}]), case AuthMod of no_module_at_all -> {ok, {directory, {Directory, DirData}}}; _ -> - %% Control that there are a password or add a standard password: + %% Check that there are a password or add a standard password: %% "NoPassword" %% In this way a user must select to use a noPassword - Pwd = case proplists:get_value(auth_access_password, DirData)of - undefined-> - ?NOPASSWORD; - PassW-> - PassW - end, + Passwd = + case proplists:get_value(auth_access_password, DirData) of + undefined -> + ?NOPASSWORD; + PassW -> + PassW + end, DirDataLast = lists:keydelete(auth_access_password,1,DirData), Server_root = proplists:get_value(server_root, ConfigList), - case catch AuthMod:store_directory_data(Directory, DirDataLast, Server_root) of + case catch AuthMod:store_directory_data(Directory, + DirDataLast, + Server_root) of ok -> - add_auth_password(Directory,Pwd,ConfigList), + add_auth_password(Directory, Passwd, ConfigList), {ok, {directory, {Directory, DirDataLast}}}; {ok, NewDirData} -> - add_auth_password(Directory,Pwd,ConfigList), + add_auth_password(Directory, Passwd, ConfigList), {ok, {directory, {Directory, NewDirData}}}; {error, Reason} -> {error, Reason}; @@ -691,7 +712,7 @@ delete_group(GroupName, Opt) -> case get_options(Opt, mandatory) of - {Addr, Port, Dir, AuthPwd}-> + {Addr, Port, Dir, AuthPwd} -> mod_auth_server:delete_group(Addr, Port, Dir, GroupName, AuthPwd); {error, Reason} -> {error, Reason} @@ -707,7 +728,7 @@ list_groups(Opt) -> case get_options(Opt, mandatory) of - {Addr, Port, Dir, AuthPwd}-> + {Addr, Port, Dir, AuthPwd} -> mod_auth_server:list_groups(Addr, Port, Dir, AuthPwd); {error, Reason} -> {error, Reason} @@ -721,7 +742,7 @@ %% list_group_members -list_group_members(GroupName,Opt) -> +list_group_members(GroupName, Opt) -> case get_options(Opt, mandatory) of {Addr, Port, Dir, AuthPwd} -> mod_auth_server:list_group_members(Addr, Port, Dir, GroupName, @@ -746,7 +767,7 @@ case proplists:get_value(dir, Opt, undefined) of Dir when is_list(Dir) -> Addr = proplists:get_value(addr, Opt, - undefined), + undefined), AuthPwd = proplists:get_value(authPassword, Opt, ?NOPASSWORD), {Addr, Port, Dir, AuthPwd}; diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/mod_auth_plain.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/mod_auth_plain.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/mod_auth_plain.erl 2009-06-05 13:55:17.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/mod_auth_plain.erl 2009-09-18 13:47:37.000000000 +0100 @@ -21,6 +21,7 @@ -include("httpd.hrl"). -include("mod_auth.hrl"). +-include("httpd_internal.hrl"). -define(VMODULE,"AUTH_PLAIN"). @@ -49,6 +50,7 @@ %% add_user(DirData, #httpd_user{username = User} = UStruct) -> + ?hdrt("add user", [{user, UStruct}]), PWDB = proplists:get_value(auth_user_file, DirData), Record = {User, UStruct#httpd_user.password, @@ -62,11 +64,14 @@ end. get_user(DirData, User) -> + ?hdrt("get user", [{dir_data, DirData}, {user, User}]), PWDB = proplists:get_value(auth_user_file, DirData), case ets:lookup(PWDB, User) of [{User, PassWd, Data}] -> - {ok, #httpd_user{username=User, password=PassWd, user_data=Data}}; - _ -> + {ok, #httpd_user{username = User, + password = PassWd, + user_data = Data}}; + _Other -> {error, no_such_user} end. @@ -77,6 +82,7 @@ [], lists:flatten(Records))}. delete_user(DirData, UserName) -> + ?hdrt("delete user", [{dir_data, DirData}, {user, UserName}]), PWDB = proplists:get_value(auth_user_file, DirData), case ets:lookup(PWDB, UserName) of [{UserName, _SomePassword, _SomeData}] -> @@ -155,12 +161,17 @@ end. store_directory_data(_Directory, DirData, Server_root) -> + ?hdrt("store directory data", + [{dir_data, DirData}, {server_root, Server_root}]), PWFile = absolute_file_name(auth_user_file, DirData, Server_root), GroupFile = absolute_file_name(auth_group_file, DirData, Server_root), case load_passwd(PWFile) of {ok, PWDB} -> + ?hdrt("password file loaded", [{file, PWFile}, {pwdb, PWDB}]), case load_group(GroupFile) of {ok, GRDB} -> + ?hdrt("group file loaded", + [{file, GroupFile}, {grdb, GRDB}]), %% Address and port is included in the file names... Addr = proplists:get_value(bind_address, DirData), Port = proplists:get_value(port, DirData), @@ -187,10 +198,10 @@ {ok,Stream} -> parse_passwd(Stream, []); {error, _} -> - {error, ?NICE("Can't open "++AuthUserFile)} + {error, ?NICE("Can't open " ++ AuthUserFile)} end. -parse_passwd(Stream,PasswdList) -> +parse_passwd(Stream, PasswdList) -> Line = case io:get_line(Stream, '') of eof -> @@ -222,11 +233,11 @@ {ok, Stream} -> parse_group(Stream,[]); {error, _} -> - {error, ?NICE("Can't open "++AuthGroupFile)} + {error, ?NICE("Can't open " ++ AuthGroupFile)} end. parse_group(Stream, GroupList) -> - Line= + Line = case io:get_line(Stream,'') of eof -> eof; @@ -275,7 +286,7 @@ store_group(GroupDB,[]) -> {ok, GroupDB}; -store_group(GroupDB,[User|Rest]) -> +store_group(GroupDB, [User|Rest]) -> ets:insert(GroupDB, User), store_group(GroupDB, Rest). diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/mod_auth_server.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/mod_auth_server.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/mod_auth_server.erl 2009-06-05 13:55:41.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/mod_auth_server.erl 2009-09-18 13:47:40.000000000 +0100 @@ -21,6 +21,7 @@ -module(mod_auth_server). -include("httpd.hrl"). +-include("httpd_internal.hrl"). -behaviour(gen_server). @@ -37,7 +38,7 @@ handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). --record(state,{tab}). +-record(state, {tab}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -50,14 +51,16 @@ %% %% NOTE: This is called by httpd_misc_sup when the process is started %% -start_link(Addr, Port)-> +start_link(Addr, Port) -> + ?hdrt("start_link", [{address, Addr}, {port, Port}]), Name = make_name(Addr, Port), gen_server:start_link({local, Name}, ?MODULE, [], [{timeout, infinity}]). %% start/2 -start(Addr, Port)-> +start(Addr, Port) -> + ?hdrd("start", [{address, Addr}, {port, Port}]), Name = make_name(Addr, Port), case whereis(Name) of undefined -> @@ -69,7 +72,8 @@ %% stop/2 -stop(Addr, Port)-> +stop(Addr, Port) -> + ?hdrd("stop", [{address, Addr}, {port, Port}]), Name = make_name(Addr, Port), case whereis(Name) of undefined -> %% Already stopped @@ -80,7 +84,8 @@ %% add_password/4 -add_password(Addr, Port, Dir, Password)-> +add_password(Addr, Port, Dir, Password) -> + ?hdrt("add password", [{address, Addr}, {port, Port}]), Name = make_name(Addr, Port), Req = {add_password, Dir, Password}, call(Name, Req). @@ -89,6 +94,8 @@ %% update_password/6 update_password(Addr, Port, Dir, Old, New) when is_list(New) -> + ?hdrt("update password", + [{address, Addr}, {port, Port}, {dir, Dir}, {old, Old}, {new, New}]), Name = make_name(Addr, Port), Req = {update_password, Dir, Old, New}, call(Name, Req). @@ -97,6 +104,9 @@ %% add_user/5 add_user(Addr, Port, Dir, User, Password) -> + ?hdrt("add user", + [{address, Addr}, {port, Port}, + {dir, Dir}, {user, User}, {passwd, Password}]), Name = make_name(Addr, Port), Req = {add_user, Addr, Port, Dir, User, Password}, call(Name, Req). @@ -105,6 +115,9 @@ %% delete_user/5 delete_user(Addr, Port, Dir, UserName, Password) -> + ?hdrt("delete user", + [{address, Addr}, {port, Port}, + {dir, Dir}, {user, UserName}, {passwd, Password}]), Name = make_name(Addr, Port), Req = {delete_user, Addr, Port, Dir, UserName, Password}, call(Name, Req). @@ -113,6 +126,9 @@ %% get_user/5 get_user(Addr, Port, Dir, UserName, Password) -> + ?hdrt("get user", + [{address, Addr}, {port, Port}, + {dir, Dir}, {user, UserName}, {passwd, Password}]), Name = make_name(Addr, Port), Req = {get_user, Addr, Port, Dir, UserName, Password}, call(Name, Req). @@ -121,6 +137,8 @@ %% list_users/4 list_users(Addr, Port, Dir, Password) -> + ?hdrt("list users", + [{address, Addr}, {port, Port}, {dir, Dir}, {passwd, Password}]), Name = make_name(Addr,Port), Req = {list_users, Addr, Port, Dir, Password}, call(Name, Req). @@ -129,6 +147,9 @@ %% add_group_member/6 add_group_member(Addr, Port, Dir, GroupName, UserName, Password) -> + ?hdrt("add group member", + [{address, Addr}, {port, Port}, {dir, Dir}, + {group, GroupName}, {user, UserName}, {passwd, Password}]), Name = make_name(Addr,Port), Req = {add_group_member, Addr, Port, Dir, GroupName, UserName, Password}, call(Name, Req). @@ -137,6 +158,9 @@ %% delete_group_member/6 delete_group_member(Addr, Port, Dir, GroupName, UserName, Password) -> + ?hdrt("delete group member", + [{address, Addr}, {port, Port}, {dir, Dir}, + {group, GroupName}, {user, UserName}, {passwd, Password}]), Name = make_name(Addr,Port), Req = {delete_group_member, Addr, Port, Dir, GroupName, UserName, Password}, call(Name, Req). @@ -145,6 +169,9 @@ %% list_group_members/4 list_group_members(Addr, Port, Dir, Group, Password) -> + ?hdrt("list group members", + [{address, Addr}, {port, Port}, {dir, Dir}, + {group, Group}, {passwd, Password}]), Name = make_name(Addr, Port), Req = {list_group_members, Addr, Port, Dir, Group, Password}, call(Name, Req). @@ -153,6 +180,9 @@ %% delete_group/5 delete_group(Addr, Port, Dir, GroupName, Password) -> + ?hdrt("delete group", + [{address, Addr}, {port, Port}, {dir, Dir}, + {group, GroupName}, {passwd, Password}]), Name = make_name(Addr, Port), Req = {delete_group, Addr, Port, Dir, GroupName, Password}, call(Name, Req). @@ -161,6 +191,8 @@ %% list_groups/4 list_groups(Addr, Port, Dir, Password) -> + ?hdrt("list groups", + [{address, Addr}, {port, Port}, {dir, Dir}, {passwd, Password}]), Name = make_name(Addr, Port), Req = {list_groups, Addr, Port, Dir, Password}, call(Name, Req). @@ -175,6 +207,7 @@ %% init init(_) -> + ?hdrv("initiating", []), {ok,#state{tab = ets:new(auth_pwd,[set,protected])}}. %% handle_call @@ -182,6 +215,7 @@ %% Add a user handle_call({add_user, Addr, Port, Dir, User, AuthPwd}, _From, State) -> Reply = api_call(Addr, Port, Dir, add_user, User, AuthPwd, State), + ?hdrt("add user", [{reply, Reply}]), {reply, Reply, State}; %% Get data about a user @@ -198,48 +232,48 @@ %% delete a group handle_call({delete_group_member, Addr, Port, Dir, Group, User, AuthPwd}, - _From, State)-> + _From, State) -> Reply = api_call(Addr, Port, Dir, delete_group_member, [Group, User], AuthPwd, State), {reply, Reply, State}; %% List all users thats standalone users -handle_call({list_users, Addr, Port, Dir, AuthPwd}, _From, State)-> +handle_call({list_users, Addr, Port, Dir, AuthPwd}, _From, State) -> Reply = api_call(Addr, Port, Dir, list_users, [], AuthPwd, State), {reply, Reply, State}; %% Delete a user -handle_call({delete_user, Addr, Port, Dir, User, AuthPwd}, _From, State)-> +handle_call({delete_user, Addr, Port, Dir, User, AuthPwd}, _From, State) -> Reply = api_call(Addr, Port, Dir, delete_user, [User], AuthPwd, State), {reply, Reply, State}; %% Delete a group -handle_call({delete_group, Addr, Port, Dir, Group, AuthPwd}, _From, State)-> +handle_call({delete_group, Addr, Port, Dir, Group, AuthPwd}, _From, State) -> Reply = api_call(Addr, Port, Dir, delete_group, [Group], AuthPwd, State), {reply, Reply, State}; %% List the current groups -handle_call({list_groups, Addr, Port, Dir, AuthPwd}, _From, State)-> +handle_call({list_groups, Addr, Port, Dir, AuthPwd}, _From, State) -> Reply = api_call(Addr, Port, Dir, list_groups, [], AuthPwd, State), {reply, Reply, State}; %% List the members of the given group handle_call({list_group_members, Addr, Port, Dir, Group, AuthPwd}, - _From, State)-> + _From, State) -> Reply = api_call(Addr, Port, Dir, list_group_members, [Group], AuthPwd, State), {reply, Reply, State}; %% Add password for a directory -handle_call({add_password, Dir, Password}, _From, State)-> +handle_call({add_password, Dir, Password}, _From, State) -> Reply = do_add_password(Dir, Password, State), {reply, Reply, State}; %% Update the password for a directory -handle_call({update_password, Dir, Old, New},_From,State)-> +handle_call({update_password, Dir, Old, New},_From,State) -> Reply = case getPassword(State, Dir) of OldPwd when is_binary(OldPwd) -> @@ -257,13 +291,13 @@ end, {reply, Reply, State}; -handle_call(stop, _From, State)-> +handle_call(stop, _From, State) -> {stop, normal, State}. -handle_info(_Info, State)-> +handle_info(_Info, State) -> {noreply, State}. -handle_cast(_Request, State)-> +handle_cast(_Request, State) -> {noreply, State}. @@ -272,16 +306,10 @@ ok. -%% code_change({down, ToVsn}, State, Extra) -%% -code_change({down, _}, #state{tab = Tab}, downgrade_to_2_6_0) -> - {ok, {state, Tab, undefined}}; - - -%% code_change(FromVsn, State, Extra) +%% code_change(Vsn, State, Extra) %% -code_change(_, {state, Tab, _}, upgrade_from_2_6_0) -> - {ok, #state{tab = Tab}}. +code_change(_Vsn, State, _Extra) -> + {ok, State}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -294,9 +322,9 @@ %% API gateway api_call(Addr, Port, Dir, Func, Args,Password,State) -> - case controlPassword(Password,State,Dir) of + case controlPassword(Password, State, Dir) of ok-> - ConfigName = httpd_util:make_name("httpd_conf",Addr,Port), + ConfigName = httpd_util:make_name("httpd_conf", Addr, Port), case ets:match_object(ConfigName, {directory, {Dir, '$1'}}) of [{directory, {Dir, DirData}}] -> AuthMod = auth_mod_name(DirData), @@ -311,7 +339,7 @@ controlPassword(Password, _State, _Dir) when Password =:= "DummyPassword" -> bad_password; -controlPassword(Password,State,Dir)-> +controlPassword(Password,State,Dir) -> case getPassword(State,Dir) of Pwd when is_binary(Pwd) -> case erlang:md5(Password) of @@ -325,7 +353,7 @@ end. -getPassword(State,Dir)-> +getPassword(State, Dir) -> case lookup(State#state.tab, Dir) of [{_,Pwd}]-> Pwd; diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/mod_security.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/mod_security.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/mod_security.erl 2009-06-05 13:55:17.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/mod_security.erl 2009-09-18 13:47:38.000000000 +0100 @@ -31,12 +31,14 @@ -export([do/1, load/2, store/2, remove/1]). -include("httpd.hrl"). +-include("httpd_internal.hrl"). -define(VMODULE,"SEC"). %% do/1 do(Info) -> + ?hdrt("do", [{info, Info}]), %% Check and see if any user has been authorized. case proplists:get_value(remote_user, Info#mod.data,not_defined_user) of not_defined_user -> @@ -106,6 +108,7 @@ mod_log:security_log(Info, String). take_failed_action(Info, Auth) -> + ?hdrd("take failed action", [{auth, Auth}]), Path = mod_alias:path(Info#mod.data, Info#mod.config_db, Info#mod.request_uri), {_Dir, SDirData} = secretp(Path, Info#mod.config_db), @@ -118,6 +121,7 @@ Directories = ets:match(ConfigDB,{directory,{'$1','_'}}), case secret_path(Path, Directories) of {yes, Directory} -> + ?hdrd("secretp - yes", [{dir, Directory}]), SDirs0 = httpd_util:multi_lookup(ConfigDB, security_directory), [SDir] = lists:filter(fun({Directory0, _}) when Directory0 == Directory -> @@ -135,57 +139,74 @@ secret_path(_Path, [], to_be_found) -> no; -secret_path(_Path, [], Directory) -> - {yes, Directory}; -secret_path(Path, [[NewDirectory]|Rest], Directory) -> - case inets_regexp:match(Path, NewDirectory) of - {match, _, _} when Directory == to_be_found -> - secret_path(Path, Rest, NewDirectory); - {match, _, Length} when Length > length(Directory)-> - secret_path(Path, Rest, NewDirectory); +secret_path(_Path, [], Dir) -> + {yes, Dir}; +secret_path(Path, [[NewDir]|Rest], Dir) -> + case inets_regexp:match(Path, NewDir) of + {match, _, _} when Dir =:= to_be_found -> + secret_path(Path, Rest, NewDir); + {match, _, Length} when Length > length(Dir) -> + secret_path(Path, Rest, NewDir); {match, _, _} -> - secret_path(Path, Rest, Directory); + secret_path(Path, Rest, Dir); nomatch -> - secret_path(Path, Rest, Directory) + secret_path(Path, Rest, Dir) end. -load(" +load(" + ?hdrt("load security directory - begin", [{directory, Directory}]), Dir = httpd_conf:custom_clean(Directory,"",">"), {ok, [{security_directory, {Dir, [{path, Dir}]}}]}; load(eof,[{security_directory, {Directory, _DirData}}|_]) -> {error, ?NICE("Premature end-of-file in "++Directory)}; -load("SecurityDataFile " ++ FileName, +load("SecurityDataFile " ++ FileName, [{security_directory, {Dir, DirData}}]) -> + ?hdrt("load security directory", + [{file, FileName}, {dir, Dir}, {dir_data, DirData}]), File = httpd_conf:clean(FileName), {ok, [{security_directory, {Dir, [{data_file, File}|DirData]}}]}; load("SecurityCallbackModule " ++ ModuleName, [{security_directory, {Dir, DirData}}]) -> + ?hdrt("load security directory", + [{module, ModuleName}, {dir, Dir}, {dir_data, DirData}]), Mod = list_to_atom(httpd_conf:clean(ModuleName)), {ok, [{security_directory, {Dir, [{callback_module, Mod}|DirData]}}]}; load("SecurityMaxRetries " ++ Retries, [{security_directory, {Dir, DirData}}]) -> + ?hdrt("load security directory", + [{max_retries, Retries}, {dir, Dir}, {dir_data, DirData}]), load_return_int_tag("SecurityMaxRetries", max_retries, httpd_conf:clean(Retries), Dir, DirData); load("SecurityBlockTime " ++ Time, [{security_directory, {Dir, DirData}}]) -> - load_return_int_tag("SecurityBlockTime", block_time, - httpd_conf:clean(Time), Dir, DirData); + ?hdrt("load security directory", + [{block_time, Time}, {dir, Dir}, {dir_data, DirData}]), + load_return_int_tag("SecurityBlockTime", block_time, + httpd_conf:clean(Time), Dir, DirData); load("SecurityFailExpireTime " ++ Time, [{security_directory, {Dir, DirData}}]) -> + ?hdrt("load security directory", + [{expire_time, Time}, {dir, Dir}, {dir_data, DirData}]), load_return_int_tag("SecurityFailExpireTime", fail_expire_time, httpd_conf:clean(Time), Dir, DirData); load("SecurityAuthTimeout " ++ Time0, [{security_directory, {Dir, DirData}}]) -> + ?hdrt("load security directory", + [{auth_timeout, Time0}, {dir, Dir}, {dir_data, DirData}]), Time = httpd_conf:clean(Time0), load_return_int_tag("SecurityAuthTimeout", auth_timeout, httpd_conf:clean(Time), Dir, DirData); load("AuthName " ++ Name0, [{security_directory, {Dir, DirData}}]) -> + ?hdrt("load security directory", + [{name, Name0}, {dir, Dir}, {dir_data, DirData}]), Name = httpd_conf:clean(Name0), {ok, [{security_directory, {Dir, [{auth_name, Name}|DirData]}}]}; -load("",[{security_directory, {Directory, DirData}}]) -> - {ok, [], {security_directory, {Directory, DirData}}}. +load("",[{security_directory, {Dir, DirData}}]) -> + ?hdrt("load security directory - end", + [{dir, Dir}, {dir_data, DirData}]), + {ok, [], {security_directory, {Dir, DirData}}}. load_return_int_tag(Name, Atom, Time, Dir, DirData) -> case Time of @@ -201,13 +222,13 @@ end end. -store({security_directory, {Dir, DirData}}, ConfigList) when is_list(Dir), - is_list(DirData) -> +store({security_directory, {Dir, DirData}}, ConfigList) + when is_list(Dir) andalso is_list(DirData) -> + ?hdrt("store security directory", [{dir, Dir}, {dir_data, DirData}]), Addr = proplists:get_value(bind_address, ConfigList), Port = proplists:get_value(port, ConfigList), mod_security_server:start(Addr, Port), SR = proplists:get_value(server_root, ConfigList), - case proplists:get_value(data_file, DirData, no_data_file) of no_data_file -> {error, {missing_security_data_file, {security_directory, {Dir, DirData}}}}; @@ -230,7 +251,7 @@ [{port,Port},{bind_address,Addr}| NewDirData0] end, - {ok, {security_directory, {Dir, NewDirData1}}}; + {ok, {security_directory, {Dir, NewDirData1}}}; {error, Err} -> {error, {{open_data_file, DataFile}, Err}} end diff -Nru erlang-13.b.1-dfsg/lib/inets/src/http_server/mod_security_server.erl erlang-13.b.3-dfsg/lib/inets/src/http_server/mod_security_server.erl --- erlang-13.b.1-dfsg/lib/inets/src/http_server/mod_security_server.erl 2009-03-12 12:30:19.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/src/http_server/mod_security_server.erl 2009-09-18 13:47:41.000000000 +0100 @@ -44,6 +44,7 @@ -module(mod_security_server). -include("httpd.hrl"). +-include("httpd_internal.hrl"). -behaviour(gen_server). @@ -79,6 +80,7 @@ %% start_link(Addr, Port) -> + ?hdrt("start_link", [{address, Addr}, {port, Port}]), Name = make_name(Addr, Port), gen_server:start_link({local, Name}, ?MODULE, [], [{timeout, infinity}]). @@ -87,6 +89,7 @@ %% Called by the mod_security module. start(Addr, Port) -> + ?hdrt("start", [{address, Addr}, {port, Port}]), Name = make_name(Addr, Port), case whereis(Name) of undefined -> @@ -101,6 +104,7 @@ stop(Port) -> stop(undefined, Port). stop(Addr, Port) -> + ?hdrt("stop", [{address, Addr}, {port, Port}]), Name = make_name(Addr, Port), case whereis(Name) of undefined -> @@ -110,16 +114,22 @@ end. +addr(undefined) -> + any; +addr(Addr) -> + Addr. + + %% list_blocked_users list_blocked_users(Addr, Port) -> - Name = make_name(Addr,Port), - Req = {list_blocked_users, Addr, Port, '_'}, + Name = make_name(Addr, Port), + Req = {list_blocked_users, addr(Addr), Port, '_'}, call(Name, Req). list_blocked_users(Addr, Port, Dir) -> Name = make_name(Addr, Port), - Req = {list_blocked_users, Addr, Port, Dir}, + Req = {list_blocked_users, addr(Addr), Port, Dir}, call(Name, Req). @@ -127,7 +137,7 @@ block_user(User, Addr, Port, Dir, Time) -> Name = make_name(Addr, Port), - Req = {block_user, User, Addr, Port, Dir, Time}, + Req = {block_user, User, addr(Addr), Port, Dir, Time}, call(Name, Req). @@ -135,12 +145,12 @@ unblock_user(User, Addr, Port) -> Name = make_name(Addr, Port), - Req = {unblock_user, User, Addr, Port, '_'}, + Req = {unblock_user, User, addr(Addr), Port, '_'}, call(Name, Req). unblock_user(User, Addr, Port, Dir) -> Name = make_name(Addr, Port), - Req = {unblock_user, User, Addr, Port, Dir}, + Req = {unblock_user, User, addr(Addr), Port, Dir}, call(Name, Req). @@ -148,12 +158,12 @@ list_auth_users(Addr, Port) -> Name = make_name(Addr, Port), - Req = {list_auth_users, Addr, Port, '_'}, + Req = {list_auth_users, addr(Addr), Port, '_'}, call(Name, Req). list_auth_users(Addr, Port, Dir) -> Name = make_name(Addr,Port), - Req = {list_auth_users, Addr, Port, Dir}, + Req = {list_auth_users, addr(Addr), Port, Dir}, call(Name, Req). @@ -161,7 +171,7 @@ new_table(Addr, Port, TabName) -> Name = make_name(Addr,Port), - Req = {new_table, Addr, Port, TabName}, + Req = {new_table, addr(Addr), Port, TabName}, call(Name, Req). @@ -180,6 +190,9 @@ %% store_failed_auth store_failed_auth(Info, Addr, Port, DecodedString, SDirData) -> + ?hdrv("store failed auth", + [{addr, Addr}, {port, Port}, + {decoded_string, DecodedString}, {sdir_data, SDirData}]), Name = make_name(Addr,Port), Msg = {store_failed_auth,[Info,DecodedString,SDirData]}, cast(Name, Msg). @@ -208,6 +221,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(_) -> + ?hdrv("initiating", []), process_flag(trap_exit, true), {ok, []}. @@ -215,18 +229,27 @@ {stop, normal, ok, []}; handle_call({block_user, User, Addr, Port, Dir, Time}, _From, Tables) -> - Ret = block_user_int({User, Addr, Port, Dir, Time}), + ?hdrv("block user", + [{user, User}, {addr, Addr}, {port, Port}, {dir, Dir}, + {time, Time}]), + Ret = block_user_int(User, Addr, Port, Dir, Time), {reply, Ret, Tables}; handle_call({list_blocked_users, Addr, Port, Dir}, _From, Tables) -> + ?hdrv("list blocked users", + [{addr, Addr}, {port, Port}, {dir, Dir}]), Blocked = list_blocked(Tables, Addr, Port, Dir, []), {reply, Blocked, Tables}; handle_call({unblock_user, User, Addr, Port, Dir}, _From, Tables) -> - Ret = unblock_user_int({User, Addr, Port, Dir}), + ?hdrv("block user", + [{user, User}, {addr, Addr}, {port, Port}, {dir, Dir}]), + Ret = unblock_user_int(User, Addr, Port, Dir), {reply, Ret, Tables}; handle_call({list_auth_users, Addr, Port, Dir}, _From, Tables) -> + ?hdrv("list auth users", + [{addr, Addr}, {port, Port}, {dir, Dir}]), Auth = list_auth(Tables, Addr, Port, Dir, []), {reply, Auth, Tables}; @@ -396,8 +419,8 @@ code_change(_, State, _Extra) -> {ok, State}. -%% block_user_int/2 -block_user_int({User, Addr, Port, Dir, Time}) -> +%% block_user_int/5 +block_user_int(User, Addr, Port, Dir, Time) -> Dirs = httpd_manager:config_match(Addr, Port, {security_directory, {'_', '_'}}), case find_dirdata(Dirs, Dir) of @@ -436,11 +459,10 @@ find_dirdata(SDirs, Dir) end. -%% unblock_user_int/2 - -unblock_user_int({User, Addr, Port, Dir}) -> - Dirs = httpd_manager:config_match(Addr, Port, {security_directory, {'_', - '_'}}), +%% unblock_user_int/4 +unblock_user_int(User, Addr, Port, Dir) -> + Dirs = httpd_manager:config_match(Addr, Port, + {security_directory, {'_', '_'}}), case find_dirdata(Dirs, Dir) of {ok, DirData, {ETS, DETS}} -> case ets:match_object(ETS, @@ -494,6 +516,7 @@ %% list_blocked/2 list_blocked([], _Addr, _Port, _Dir, Acc) -> + ?hdrv("list blocked", [{acc, Acc}]), TN = universal_time(), lists:foldl(fun({U,Ad,P,D,T}, Ac) -> if @@ -505,6 +528,7 @@ end, [], Acc); list_blocked([{_Name, {ETS, _DETS}}|Tables], Addr, Port, Dir, Acc) -> + ?hdrv("list blocked", [{ets, ETS}, {tab2list, ets:tab2list(ETS)}]), List = ets:match_object(ETS, {blocked_user, {'_',Addr,Port,Dir,'_'}}), @@ -597,9 +621,18 @@ user_unblock_event(Mod,Addr,Port,Dir,User) -> event(user_unblock,Mod,Addr,Port,Dir,[{user,User}]). -event(Event,Mod,undefined,Port,Dir,Info) -> +event(Event, Mod, undefined, Port, Dir, Info) -> + ?hdrt("event", + [{event, Event}, {mod, Mod}, {port, Port}, {dir, Dir}]), + (catch Mod:event(Event,Port,Dir,Info)); +event(Event, Mod, any, Port, Dir, Info) -> + ?hdrt("event", + [{event, Event}, {mod, Mod}, {port, Port}, {dir, Dir}]), (catch Mod:event(Event,Port,Dir,Info)); -event(Event,Mod,Addr,Port,Dir,Info) -> +event(Event, Mod, Addr, Port, Dir, Info) -> + ?hdrt("event", + [{event, Event}, {mod, Mod}, + {addr, Addr}, {port, Port}, {dir, Dir}]), (catch Mod:event(Event,Addr,Port,Dir,Info)). universal_time() -> diff -Nru erlang-13.b.1-dfsg/lib/inets/src/inets_app/inets.appup.src erlang-13.b.3-dfsg/lib/inets/src/inets_app/inets.appup.src --- erlang-13.b.1-dfsg/lib/inets/src/inets_app/inets.appup.src 2009-06-05 13:55:29.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/src/inets_app/inets.appup.src 2009-11-20 13:36:41.000000000 +0000 @@ -18,24 +18,30 @@ {"%VSN%", [ - {"5.0.14", + {"5.1.3", [ - {restart_application, inets} + {load_module, httpd_response, soft_purge, soft_purge, []}, + {update, ftp, {advanced, upgrade_from_pre_5_12}, + soft_purge, soft_purge, []}, + {update, httpc_handler, soft, soft_purge, soft_purge, []} ] - }, - {"5.0.13", + }, + {"5.1.2", [ {restart_application, inets} ] } ], [ - {"5.0.14", + {"5.1.3", [ - {restart_application, inets} + {load_module, httpd_response, soft_purge, soft_purge, []}, + {update, ftp, {advanced, downgrade_to_pre_5_12}, + soft_purge, soft_purge, []}, + {update, httpc_handler, soft, soft_purge, soft_purge, []} ] - } , - {"5.0.13", + }, + {"5.1.2", [ {restart_application, inets} ] diff -Nru erlang-13.b.1-dfsg/lib/inets/src/inets_app/inets.erl erlang-13.b.3-dfsg/lib/inets/src/inets_app/inets.erl --- erlang-13.b.1-dfsg/lib/inets/src/inets_app/inets.erl 2009-03-12 12:32:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/src/inets_app/inets.erl 2009-11-20 13:37:42.000000000 +0000 @@ -28,6 +28,11 @@ stop/0, stop/2, services/0, services_info/0, service_names/0]). +-export([enable_trace/2, enable_trace/3, disable_trace/0, set_trace/1, + report_event/4]). +-export([versions/0, + print_version_info/0, print_version_info/1]). + %%==================================================================== %% API @@ -47,6 +52,7 @@ start(Type) -> application:start(inets, Type). + %%-------------------------------------------------------------------- %% Function: start(Service, ServiceConfig [, How]) -> {ok, Pid} | %% {error, Reason} @@ -89,6 +95,7 @@ stop() -> application:stop(inets). + %%-------------------------------------------------------------------- %% Function: stop(Service, Pid) -> ok %% @@ -105,6 +112,7 @@ Module = service_module(Service), call_service(Module, stop_service, Pid). + %%-------------------------------------------------------------------- %% Function: services() -> [{Service, Pid}] %% @@ -124,6 +132,7 @@ {error, inets_not_started} end. + %%-------------------------------------------------------------------- %% Function: services_info() -> [{Service, Pid, Info}] %% @@ -148,6 +157,222 @@ end, lists:flatten(lists:map(Fun, Services)) end. + + + +%%-------------------------------------------------------------------- +%% Function: print_version_info() +%% +%% Description: Simple utility function to print information +%% about versions (system, OS and modules). +%%-------------------------------------------------------------------- + +print_version_info() -> + {ok, Versions} = inets:versions(), + print_version_info(Versions). + +print_version_info(Versions) when is_list(Versions) -> + print_sys_info(Versions), + print_os_info(Versions), + print_mods_info(Versions). + +print_sys_info(Versions) -> + case key1search(sys_info, Versions) of + {value, SysInfo} when is_list(SysInfo) -> + {value, Arch} = key1search(arch, SysInfo, "Not found"), + {value, Ver} = key1search(ver, SysInfo, "Not found"), + io:format("System info: " + "~n Arch: ~s" + "~n Ver: ~s" + "~n", [Arch, Ver]), + ok; + _ -> + io:format("System info: Not found~n", []), + not_found + end. + +print_os_info(Versions) -> + case key1search(os_info, Versions) of + {value, OsInfo} when is_list(OsInfo) -> + Fam = + case key1search(fam, OsInfo, "Not found") of + {value, F} when is_atom(F) -> + atom_to_list(F); + {value, LF} when is_list(LF) -> + LF; + {value, XF} -> + lists:flatten(io_lib:format("~p", [XF])) + end, + Name = + case key1search(name, OsInfo) of + {value, N} when is_atom(N) -> + "[" ++ atom_to_list(N) ++ "]"; + {value, LN} when is_list(LN) -> + "[" ++ LN ++ "]"; + not_found -> + "" + end, + Ver = + case key1search(ver, OsInfo, "Not found") of + {value, T} when is_tuple(T) -> + tversion(T); + {value, LV} when is_list(LV) -> + LV; + {value, XV} -> + lists:flatten(io_lib:format("~p", [XV])) + end, + io:format("OS info: " + "~n Family: ~s ~s" + "~n Ver: ~s" + "~n", [Fam, Name, Ver]), + ok; + _ -> + io:format("OS info: Not found~n", []), + not_found + end. + +versions() -> + App = inets, + LibDir = code:lib_dir(App), + File = filename:join([LibDir, "ebin", atom_to_list(App) ++ ".app"]), + case file:consult(File) of + {ok, [{application, App, AppFile}]} -> + case lists:keysearch(modules, 1, AppFile) of + {value, {modules, Mods}} -> + {ok, version_info(Mods)}; + _ -> + {error, {invalid_format, modules}} + end; + Error -> + {error, {invalid_format, Error}} + end. + +version_info(Mods) -> + SysInfo = sys_info(), + OsInfo = os_info(), + ModInfo = [mod_version_info(Mod) || Mod <- Mods], + [{sys_info, SysInfo}, {os_info, OsInfo}, {mod_info, ModInfo}]. + +mod_version_info(Mod) -> + Info = Mod:module_info(), + {value, {attributes, Attr}} = lists:keysearch(attributes, 1, Info), + {value, {vsn, [Vsn]}} = lists:keysearch(vsn, 1, Attr), + {value, {app_vsn, AppVsn}} = lists:keysearch(app_vsn, 1, Attr), + {value, {compile, Comp}} = lists:keysearch(compile, 1, Info), + {value, {version, Ver}} = lists:keysearch(version, 1, Comp), + {value, {time, Time}} = lists:keysearch(time, 1, Comp), + {Mod, [{vsn, Vsn}, + {app_vsn, AppVsn}, + {compiler_version, Ver}, + {compile_time, Time}]}. + +sys_info() -> + SysArch = string:strip(erlang:system_info(system_architecture),right,$\n), + SysVer = string:strip(erlang:system_info(system_version),right,$\n), + [{arch, SysArch}, {ver, SysVer}]. + +os_info() -> + V = os:version(), + case os:type() of + {OsFam, OsName} -> + [{fam, OsFam}, {name, OsName}, {ver, V}]; + OsFam -> + [{fam, OsFam}, {ver, V}] + end. + + +print_mods_info(Versions) -> + case key1search(mod_info, Versions) of + {value, ModsInfo} when is_list(ModsInfo) -> + io:format("Module info: ~n", []), + lists:foreach(fun print_mod_info/1, ModsInfo); + _ -> + io:format("Module info: Not found~n", []), + not_found + end. + +tversion(T) -> + L = tuple_to_list(T), + lversion(L). + +lversion([]) -> + ""; +lversion([A]) -> + integer_to_list(A); +lversion([A|R]) -> + integer_to_list(A) ++ "." ++ lversion(R). + +print_mod_info({Module, Info}) -> + % Maybe a asn1 generated module + Asn1Vsn = + case (catch Module:info()) of + AI when is_list(AI) -> + case (catch key1search(vsn, AI)) of + {value, V} when is_atom(V) -> + atom_to_list(V); + _ -> + "-" + end; + _ -> + "-" + end, + Vsn = + case key1search(vsn, Info) of + {value, I} when is_integer(I) -> + integer_to_list(I); + _ -> + "Not found" + end, + AppVsn = + case key1search(app_vsn, Info) of + {value, S1} when is_list(S1) -> + S1; + _ -> + "Not found" + end, + CompVer = + case key1search(compiler_version, Info) of + {value, S2} when is_list(S2) -> + S2; + _ -> + "Not found" + end, + CompDate = + case key1search(compile_time, Info) of + {value, {Year, Month, Day, Hour, Min, Sec}} -> + lists:flatten( + io_lib:format("~w-~2..0w-~2..0w ~2..0w:~2..0w:~2..0w", + [Year, Month, Day, Hour, Min, Sec])); + _ -> + "Not found" + end, + io:format(" ~w:~n" + " Vsn: ~s~n" + " App vsn: ~s~n" + " ASN.1 vsn: ~s~n" + " Compiler ver: ~s~n" + " Compile time: ~s~n", + [Module, Vsn, AppVsn, Asn1Vsn, CompVer, CompDate]), + ok. + + +key1search(Key, Vals) -> + case lists:keysearch(Key, 1, Vals) of + {value, {Key, Val}} -> + {value, Val}; + false -> + not_found + end. + +key1search(Key, Vals, Def) -> + case key1search(Key, Vals) of + not_found -> + {value, Def}; + Value -> + Value + end. + + %%-------------------------------------------------------------------- %% Function: service_names() -> [ServiceName] %% @@ -158,6 +383,330 @@ service_names() -> [ftpc, tftpd, httpc, httpd]. + +%%----------------------------------------------------------------- +%% enable_trace(Level, Destination) -> void() +%% enable_trace(Level, Destination, Service) -> void() +%% +%% Parameters: +%% Level -> max | min | integer() +%% Destination -> File | Port | io | HandlerSpec +%% Service -> httpc | httpd | ftpc | tftp | all +%% File -> string() +%% Port -> integer() +%% Verbosity -> true | false +%% HandlerSpec = {function(), Data} +%% Data = term() +%% +%% Description: +%% This function is used to start tracing at level Level and send +%% the result either to the file File, the port Port or to a +%% trace handler. +%% Note that it starts a tracer server. +%% When Destination is the atom io (or the tuple {io, Verbosity}), +%% all (printable) inets trace events (trace_ts events which has +%% Severity withing Limit) will be written to stdout using io:format. +%% +%%----------------------------------------------------------------- +enable_trace(Level, Dest) -> + enable_trace(Level, Dest, all). + +enable_trace(Level, Dest, Service) -> + case valid_trace_service(Service) of + true -> + enable_trace2(Level, Dest, Service); + false -> + {error, {invalid_service, Service}} + end. + +enable_trace2(Level, File, Service) + when is_list(File) -> + case file:open(File, [write]) of + {ok, Fd} -> + HandleSpec = {fun handle_trace/2, {Service, Fd}}, + do_enable_trace(Level, process, HandleSpec); + Err -> + Err + end; +enable_trace2(Level, Port, _) when is_integer(Port) -> + do_enable_trace(Level, port, dbg:trace_port(ip, Port)); +enable_trace2(Level, io, Service) -> + HandleSpec = {fun handle_trace/2, {Service, standard_io}}, + do_enable_trace(Level, process, HandleSpec); +enable_trace2(Level, {Fun, _Data} = HandleSpec, _) when is_function(Fun) -> + do_enable_trace(Level, process, HandleSpec). + +do_enable_trace(Level, Type, HandleSpec) -> + case dbg:tracer(Type, HandleSpec) of + {ok, _} -> + set_trace(Level), + ok; + Error -> + Error + end. + +valid_trace_service(all) -> + true; +valid_trace_service(Service) -> + lists:member(Service, [httpc, httpd, ftpc, tftp]). + + +%%----------------------------------------------------------------- +%% disable_trace() -> void() +%% +%% Description: +%% This function is used to stop tracing. +%%----------------------------------------------------------------- +disable_trace() -> + %% This is to make handle_trace/2 close the output file (if the + %% event gets there before dbg closes) + inets:report_event(100, "stop trace", stop_trace, [stop_trace]), + dbg:stop(). + + + +%%----------------------------------------------------------------- +%% set_trace(Level) -> void() +%% +%% Parameters: +%% Level -> max | min | integer() +%% +%% Description: +%% This function is used to change the trace level when tracing has +%% already been started. +%%----------------------------------------------------------------- +set_trace(Level) -> + set_trace(Level, all). + +set_trace(Level, Service) -> + Pat = make_pattern(?MODULE, Service, Level), + change_pattern(Pat). + +make_pattern(Mod, Service, Level) + when is_atom(Mod) andalso is_atom(Service) -> + case Level of + min -> + {Mod, Service, []}; + max -> + Head = ['$1', '_', '_', '_'], + Body = [], + Cond = [], + {Mod, Service, [{Head, Cond, Body}]}; + DetailLevel when is_integer(DetailLevel) -> + Head = ['$1', '_', '_', '_'], + Body = [], + Cond = [{ '=<', '$1', DetailLevel}], + {Mod, Service, [{Head, Cond, Body}]}; + _ -> + exit({bad_level, Level}) + end. + +change_pattern({Mod, Service, Pattern}) + when is_atom(Mod) andalso is_atom(Service) -> + MFA = {Mod, report_event, 4}, + case Pattern of + [] -> + try + error_to_exit(ctp, dbg:ctp(MFA)), + error_to_exit(p, dbg:p(all, clear)) + catch + exit:{Where, Reason} -> + {error, {Where, Reason}} + end; + List when is_list(List) -> + try + error_to_exit(ctp, dbg:ctp(MFA)), + error_to_exit(tp, dbg:tp(MFA, Pattern)), + error_to_exit(p, dbg:p(all, [call, timestamp])) + catch + exit:{Where, Reason} -> + {error, {Where, Reason}} + end; + _ -> + exit({bad_pattern, Pattern}) + end, + ok. + +error_to_exit(_Where, {ok, _} = OK) -> + OK; +error_to_exit(Where, {error, Reason}) -> + exit({Where, Reason}). + + +%%----------------------------------------------------------------- +%% report_event(Serverity, Label, Service, Content) +%% +%% Parameters: +%% Severity -> 0 =< integer() =< 100 +%% Label -> string() +%% Service -> httpd | httpc | ftp | tftp +%% Content -> [{tag, term()}] +%% +%% Description: +%% This function is used to generate trace events, that is, +%% put trace on this function. +%%----------------------------------------------------------------- + +report_event(Severity, Label, Service, Content) + when (is_integer(Severity) andalso + (Severity >= 0) andalso (100 >= Severity)) andalso + is_list(Label) andalso + is_atom(Service) andalso + is_list(Content) -> + hopefully_traced. + + +%% ---------------------------------------------------------------------- +%% handle_trace(Event, Fd) -> Verbosity +%% +%% Parameters: +%% Event -> The trace event (only megaco 'trace_ts' events are printed) +%% Fd -> standard_io | file_descriptor() | trace_port() +%% +%% Description: +%% This function is used to "receive" and print the trace events. +%% Events are printed if: +%% - Verbosity is max +%% - Severity is =< Verbosity (e.g. Severity = 30, and Verbosity = 40) +%% Events are not printed if: +%% - Verbosity is min +%% - Severity is > Verbosity +%%----------------------------------------------------------------- + +handle_trace(_, closed_file = Fd) -> + Fd; +handle_trace({trace_ts, _Who, call, + {?MODULE, report_event, + [_Sev, "stop trace", stop_trace, [stop_trace]]}, + Timestamp}, + {standard_io, _} = Fd) -> + (catch io:format(Fd, "stop trace at ~s~n", [format_timestamp(Timestamp)])), + Fd; +handle_trace({trace_ts, _Who, call, + {?MODULE, report_event, + [_Sev, "stop trace", stop_trace, [stop_trace]]}, + Timestamp}, + standard_io = Fd) -> + (catch io:format(Fd, "stop trace at ~s~n", [format_timestamp(Timestamp)])), + Fd; +handle_trace({trace_ts, _Who, call, + {?MODULE, report_event, + [_Sev, "stop trace", stop_trace, [stop_trace]]}, + Timestamp}, + {_Service, Fd}) -> + (catch io:format(Fd, "stop trace at ~s~n", [format_timestamp(Timestamp)])), + (catch file:close(Fd)), + closed_file; +handle_trace({trace_ts, _Who, call, + {?MODULE, report_event, + [_Sev, "stop trace", stop_trace, [stop_trace]]}, + Timestamp}, + Fd) -> + (catch io:format(Fd, "stop trace at ~s~n", [format_timestamp(Timestamp)])), + (catch file:close(Fd)), + closed_file; +handle_trace({trace_ts, Who, call, + {?MODULE, report_event, + [Sev, Label, Service, Content]}, Timestamp}, + Fd) -> + (catch print_inets_trace(Fd, Sev, Timestamp, Who, + Label, Service, Content)), + Fd; +handle_trace(Event, Fd) -> + (catch print_trace(Fd, Event)), + Fd. + + +print_inets_trace({Service, Fd}, + Sev, Timestamp, Who, Label, Service, Content) -> + do_print_inets_trace(Fd, Sev, Timestamp, Who, Label, Service, Content); +print_inets_trace({ServiceA, Fd}, + Sev, Timestamp, Who, Label, ServiceB, Content) + when (ServiceA =:= all) -> + do_print_inets_trace(Fd, Sev, Timestamp, Who, Label, ServiceB, Content); +print_inets_trace({ServiceA, _Fd}, + _Sev, _Timestamp, _Who, _Label, ServiceB, _Content) + when ServiceA =/= ServiceB -> + ok; +print_inets_trace(Fd, Sev, Timestamp, Who, Label, Service, Content) -> + do_print_inets_trace(Fd, Sev, Timestamp, Who, Label, Service, Content). + +do_print_inets_trace(Fd, Sev, Timestamp, Who, Label, Service, Content) -> + Ts = format_timestamp(Timestamp), + io:format(Fd, "[inets ~w trace ~w ~w ~s] ~s " + "~n Content: ~p" + "~n", + [Service, Sev, Who, Ts, Label, Content]). + +print_trace({_, Fd}, Event) -> + do_print_trace(Fd, Event); +print_trace(Fd, Event) -> + do_print_trace(Fd, Event). + +do_print_trace(Fd, {trace, Who, What, Where}) -> + io:format(Fd, "[trace]" + "~n Who: ~p" + "~n What: ~p" + "~n Where: ~p" + "~n", [Who, What, Where]); + +do_print_trace(Fd, {trace, Who, What, Where, Extra}) -> + io:format(Fd, "[trace]" + "~n Who: ~p" + "~n What: ~p" + "~n Where: ~p" + "~n Extra: ~p" + "~n", [Who, What, Where, Extra]); + +do_print_trace(Fd, {trace_ts, Who, What, Where, When}) -> + Ts = format_timestamp(When), + io:format(Fd, "[trace ~s]" + "~n Who: ~p" + "~n What: ~p" + "~n Where: ~p" + "~n", [Ts, Who, What, Where]); + +do_print_trace(Fd, {trace_ts, Who, What, Where, Extra, When}) -> + Ts = format_timestamp(When), + io:format(Fd, "[trace ~s]" + "~n Who: ~p" + "~n What: ~p" + "~n Where: ~p" + "~n Extra: ~p" + "~n", [Ts, Who, What, Where, Extra]); + +do_print_trace(Fd, {seq_trace, What, Where}) -> + io:format(Fd, "[seq trace]" + "~n What: ~p" + "~n Where: ~p" + "~n", [What, Where]); + +do_print_trace(Fd, {seq_trace, What, Where, When}) -> + Ts = format_timestamp(When), + io:format(Fd, "[seq trace ~s]" + "~n What: ~p" + "~n Where: ~p" + "~n", [Ts, What, Where]); + +do_print_trace(Fd, {drop, Num}) -> + io:format(Fd, "[drop trace] ~p~n", [Num]); + +do_print_trace(Fd, Trace) -> + io:format(Fd, "[trace] " + "~n ~p" + "~n", [Trace]). + + +format_timestamp({_N1, _N2, N3} = Now) -> + {Date, Time} = calendar:now_to_datetime(Now), + {YYYY,MM,DD} = Date, + {Hour,Min,Sec} = Time, + FormatDate = + io_lib:format("~.4w:~.2.0w:~.2.0w ~.2.0w:~.2.0w:~.2.0w 4~w", + [YYYY,MM,DD,Hour,Min,Sec,round(N3/1000)]), + lists:flatten(FormatDate). + + %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/inets/src/inets_app/inets_internal.hrl erlang-13.b.3-dfsg/lib/inets/src/inets_app/inets_internal.hrl --- erlang-13.b.1-dfsg/lib/inets/src/inets_app/inets_internal.hrl 2009-03-12 12:32:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inets/src/inets_app/inets_internal.hrl 2009-09-18 13:47:52.000000000 +0100 @@ -18,6 +18,24 @@ %% %% +-ifndef(inets_internal_hrl). +-define(inets_internal_hrl, true). + +%% Various trace macros + +-define(report(Severity, Label, Service, Content), + inets:report_event(Severity, Label, Service, + [{module, ?MODULE}, {line, ?LINE} | Content])). +-define(report_important(Label, Service, Content), + ?report(20, Label, Service, Content)). +-define(report_verbose(Label, Service, Content), + ?report(40, Label, Service, Content)). +-define(report_debug(Label, Service, Content), + ?report(60, Label, Service, Content)). +-define(report_trace(Label, Service, Content), + ?report(80, Label, Service, Content)). + + -define(CR, $\r). -define(LF, $\n). -define(CRLF, [$\r,$\n]). @@ -27,3 +45,5 @@ -define(RIGHT_PAREN, $)). -define(WHITE_SPACE, $ ). -define(DOUBLE_QUOTE, $"). + +-endif. % -ifdef(inets_internal_hrl). diff -Nru erlang-13.b.1-dfsg/lib/inets/vsn.mk erlang-13.b.3-dfsg/lib/inets/vsn.mk --- erlang-13.b.1-dfsg/lib/inets/vsn.mk 2009-06-05 13:54:56.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/inets/vsn.mk 2009-11-20 13:35:53.000000000 +0000 @@ -17,13 +17,19 @@ # # %CopyrightEnd% -INETS_VSN = 5.1 +INETS_VSN = 5.2 PRE_VSN = APP_VSN = "inets-$(INETS_VSN)$(PRE_VSN)" -TICKETS = OTP-7994 OTP-7998 OTP-8001 OTP-8004 OTP-8005 +TICKETS = OTP-8204 OTP-8206 OTP-8247 OTP-8248 OTP-8249 OTP-8258 OTP-8280 -# TICKETS_5_0_15 = OTP-7994 OTP-7998 OTP-8001 OTP-8005 +TICKETS_5_1_3 = OTP-8154 + +TICKETS_5_1_2 = OTP-7298 OTP-8101 OTP-8118 + +TICKETS_5_1_1 = OTP-8052 OTP-8069 + +TICKETS_5_1 = OTP-7994 OTP-7998 OTP-8001 OTP-8004 OTP-8005 TICKETS_5_0_14 = OTP-7882 OTP-7883 OTP-7888 OTP-7950 OTP-7976 diff -Nru erlang-13.b.1-dfsg/lib/inviso/doc/src/book.xml erlang-13.b.3-dfsg/lib/inviso/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/inviso/doc/src/book.xml 2007-11-28 16:56:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inviso/doc/src/book.xml 2009-11-20 13:34:25.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Inviso @@ -31,16 +29,19 @@
    - Inviso Application + Inviso - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/inviso/doc/src/inviso_chapter.xml erlang-13.b.3-dfsg/lib/inviso/doc/src/inviso_chapter.xml --- erlang-13.b.1-dfsg/lib/inviso/doc/src/inviso_chapter.xml 2007-11-28 16:56:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inviso/doc/src/inviso_chapter.xml 2009-11-20 13:34:26.000000000 +0000 @@ -4,23 +4,21 @@
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Inviso @@ -28,13 +26,14 @@ + inviso_chapter.xml
    Introduction

    inviso: (Latin) to go to see, visit, inspect, look at.

    The Inviso trace system consists of one or several runtime components supposed to run on each Erlang node doing tracing and one control component which can run on any node with available processor power. Inviso may also be part of a higher layer trace tool. See the inviso-tool as an example. The implementation is spread out over the Runtime_tools and the Inviso Erlang/OTP applications. Erlang modules necessary to run the runtime component are located in Runtime_tools and therefore assumed to be available on any node. Even though Inviso is introduced with Erlang/OTP R11B the runtime component implementation is done with backward compatibility in mind. Meaning that it is possible to compile and run it on older Erlang/OTP releases.

    - + Inviso Trace System Architecture Overview.

    This document describes the control and runtime components of the Inviso trace system.

    @@ -60,8 +59,8 @@ Merge and format the log files. (Prompt 12 in the example below). Stop the runtime components. This is important if the Erlang nodes are real "live" systems, and will not necessarily be stopped just because the tracing is completed. (Prompt 14 in the example below). -

    This "recepie" is valid also when tracing in a non-distributed environment. The only difference is that function calls not taking a node-name as argument are used. The runtime component will then of course run on the same node as the control component.

    -

    Simple example illustrating the above listed recipe. It traces on two nodes, node1 where the control component also runs. And node2 which is a remote node from the control components perspective. The example uses a mixture of API-calls specifying what nodes to trace on and API functions working on all added nodes. This is in this example interchangable since all to the control component known nodes are participating in the same way.

    +

    This "recipe" is valid also when tracing in a non-distributed environment. The only difference is that function calls not taking a node-name as argument are used. The runtime component will then of course run on the same node as the control component.

    +

    Simple example illustrating the above listed recipe. It traces on two nodes, node1 where the control component also runs. And node2 which is a remote node from the control components perspective. The example uses a mixture of API-calls specifying what nodes to trace on and API functions working on all added nodes. This is in this example interchangeable since all to the control component known nodes are participating in the same way.

     Eshell V5.5  (abort with ^G)
     (node1@hurin)1>application:start(runtime_tools).
    @@ -123,7 +122,7 @@
       
    The Runtime Meta Tracer

    Meta tracing is a trace mechanism separate from the regular tracing. It is normally used by a trace-tool to learn about function calls made anywhere in an Erlang node. A typical example is that there is a possibility in Inviso to get pids translated to registered name in the final formatted trace-log (for processes having registered names). This is done by meta-tracing on the BIF register/2 to learn about all name/pid associations made.

    -

    Meta tracing in Inviso is done by the inviso_rt_meta process, which is part of the runtime component if trace-information, ti, is initiated. See inviso:init_tracing/1 for details. The runtime meta tracer opens and controls the so called trace information file. Translations can then be done off-line using the associations logged in the trace information file. Currently the only type of trace information file available is a straight binary file. A wrap-file makes no sence since pid-to-name associations made in the beginning will most likely be lost.

    +

    Meta tracing in Inviso is done by the inviso_rt_meta process, which is part of the runtime component if trace-information, ti, is initiated. See inviso:init_tracing/1 for details. The runtime meta tracer opens and controls the so called trace information file. Translations can then be done off-line using the associations logged in the trace information file. Currently the only type of trace information file available is a straight binary file. A wrap-file makes no sense since pid-to-name associations made in the beginning will most likely be lost.

    The runtime meta tracer can also be used to translate pids to own identifiers. The only thing needed is one or several association points in the form of function calls which will only be made if an association is done in the system. The pid and own-identifier must be arguments and/or return values from the same function call.

    The runtime meta tracer can further more be used to achieve side-effects during tracing, like turning tracing on or off.

    @@ -131,7 +130,7 @@ Matching function calls with return values

    It may sometimes be necessary to wait for a meta traced function to return before it can be decided what to do. This may be due to that one piece of information to make the decision is in the arguments to the function, the other in the return value. This kind of logic can be programmed to be executed by the inviso meta tracer. In order for the inviso meta tracer to "remember" function-call arguments until the function return trace message arrives, a public loop data structure is implemented. The public loop data structure is first created when tracing is initiated (of course only when trace information is specified in the init_tracing call). The public loop data can then later be further initiated each time meta tracing (tpm and tpm_ms) is activated for a certain function.

    The default public loop data structure is a tuple of size two. The first element in that tuple is used by the predefined meta tracing for capturing locally registered names. The second element is free to use for any other purpose. The elements of the tuple must in the default implementation be lists of tuples. Where each sub-tuple shall represent one waiting call. The last element of that tuple must be a now-stamp (as returned by the BIF now/0). See below for an explanation of the now-stamp. The size of the outer most tuple may be increased as long as the term residing in the first element is left unchanged, and all other elements follow the above described rules.

    -

    The inviso meta tracer "cleans" the public loop data structure approximately once every minute. The reason for this is that entries in the public loop data structure may become abandoned. If for instance a process crashes while executing the body of a meta traced function, no return value will be generated. Or in other words, receiving the call meta trace-message can have caused information to have been written into the public loop data structure. That entry will be used and removed when the return_trace meta trace-message arrives. But if the meta traced function causes an exception, no return_trace message will come. The function which normally removes the entry is then therfore never called.

    +

    The inviso meta tracer "cleans" the public loop data structure approximately once every minute. The reason for this is that entries in the public loop data structure may become abandoned. If for instance a process crashes while executing the body of a meta traced function, no return value will be generated. Or in other words, receiving the call meta trace-message can have caused information to have been written into the public loop data structure. That entry will be used and removed when the return_trace meta trace-message arrives. But if the meta traced function causes an exception, no return_trace message will come. The function which normally removes the entry is then therefore never called.

    The default clean-function assumes that every item in the public loop data tuple is a list. Where each list contains tuples where the last element of those tuples are "now-stamps". The default clean-function considers an entry older than 30 seconds to be abandoned.

    @@ -294,9 +293,9 @@
     inviso:add_node(my_rt_tag,
                     [{overload,{{my_ovl,check},
    -\011\011            15000,
    -\011\011\011    {my_ovl,start,[my_port_pgm]},
    -\011\011\011    {my_ovl,stop,[my_port_pgm]}}}]).
    +                            15000,
    +                            {my_ovl,start,[my_port_pgm]},
    +                            {my_ovl,stop,[my_port_pgm]}}}]).
         

    Immediately when the runtime component is started, it will initiate overload protection by calling my_ovl:start(my_port_pgm). When tracing (not when in state idle or new), the runtime component will every 15000 milliseconds call my_ovl:check/1. Depending on its return value, the runtime component will either do nothing or suspend tracing. When the runtime component is stopped, my_ovl:stop(my_port_pgm) will be called.

    diff -Nru erlang-13.b.1-dfsg/lib/inviso/doc/src/inviso_rt_meta.xml erlang-13.b.3-dfsg/lib/inviso/doc/src/inviso_rt_meta.xml --- erlang-13.b.1-dfsg/lib/inviso/doc/src/inviso_rt_meta.xml 2007-11-28 16:56:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inviso/doc/src/inviso_rt_meta.xml 2009-11-20 13:34:27.000000000 +0000 @@ -4,23 +4,21 @@
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + inviso_rt_meta @@ -34,7 +32,7 @@

    This module provides a direct API to the inviso meta tracer. These functions are only meant to be used in meta tracing CallFunc and RemoveFunc.

    It can sometimes be necessary to manipulate meta match-patterns from CallFuncs and RemoveFuncs. The problem then is that call-funcs and remove-funcs are meta trace call-backs executed inside the inviso meta tracer's context. Hence making calls to the regular API's manipulating meta trace-patterns will hang the inviso meta tracer!.

    -

    To remedy this problem, a number of useful tpm-functions are available in this API. It must e understood that theire actions are local to the Erlang node where they are called.

    +

    To remedy this problem, a number of useful tpm-functions are available in this API. It must be understood that their actions are local to the Erlang node where they are called.

    diff -Nru erlang-13.b.1-dfsg/lib/inviso/doc/src/inviso.xml erlang-13.b.3-dfsg/lib/inviso/doc/src/inviso.xml --- erlang-13.b.1-dfsg/lib/inviso/doc/src/inviso.xml 2007-11-28 16:56:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inviso/doc/src/inviso.xml 2009-11-20 13:34:27.000000000 +0000 @@ -4,23 +4,21 @@
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + inviso @@ -203,7 +201,7 @@

    The trace information can be configured to either write trace information to a plain trace information file or to relay it to another inviso meta tracer on another node. The inviso meta tracer is capable of matching function calls with their function returns (only if return_trace is activated in the meta trace match specification for the function in question). This is necessary since it may not be possible to decide what to do, if anything shall be done at all, until the return value of the function call is examined.

    -

    To be able to match calls with returns a state can be saved when detecting a function call in a public loop data structure kept by the inviso meta tracer. The public loop data structure is given as argument to a handler-function called whenever a meta trace message arrives to the inviso meta tracer (both function calls and function returns). The public loop data structure is first initiated by the Mi:Fi function which takes the items in Argsi as arguments. Fi shall return the initial public loop data structure. When meta tracing is stopped, either because tracing is stopped or because tracing is suspended, the Mr:Fr(PublicLoopData) is called to offer a possibility to clean-up. Note that for every function meta-tracing is activated, a public loop data modification function can be speficied. That function will prepare the current loop data structure for this particular function. +

    To be able to match calls with returns a state can be saved when detecting a function call in a public loop data structure kept by the inviso meta tracer. The public loop data structure is given as argument to a handler-function called whenever a meta trace message arrives to the inviso meta tracer (both function calls and function returns). The public loop data structure is first initiated by the Mi:Fi function which takes the items in Argsi as arguments. Fi shall return the initial public loop data structure. When meta tracing is stopped, either because tracing is stopped or because tracing is suspended, the Mr:Fr(PublicLoopData) is called to offer a possibility to clean-up. Note that for every function meta-tracing is activated, a public loop data modification function can be specified. That function will prepare the current loop data structure for this particular function.

    Further there is a risk that function call states becomes abandoned inside the public loop data structure. This will happen if a function call is entered into the public loop data structure, but no function return occurs. To prevent the public loop data structure from growing infinitely the clean function Fc will periodically be called with the public loop data structure as argument. Elements entered into the public loop data structure as a result of a function call must contain a timestamp for the Fc to be able to conclude if it is abandoned or not. Fc shall return a new public loop data structure.

    @@ -410,7 +408,7 @@ Activate meta tracing and at the same time append a {tracer,Tracer} process trace flag to the enable list in a match specification traceaction term

    See tpm/X for details on arguments and return values.

    -

    Same as tpm/X but all match specs in MS containing a trace action term will have a {tracer,Tracer} appended to its enable-list. Tracer will be the current output for regular trace messages as specified when tracing was initiated. This function is useful when setting a meta trace pattern on a function with the intent that its execution shall turn tracing on for the process executing the match-spec in the meta trace pattern. The reason the tracer process trace flag can not be explicitly written in the action term by the user is that it may be difficult to learn its exact value for a remote node. Further more inviso functions are made to work on several nodes at the same time, requiering different match specs to be set for different nodes.

    +

    Same as tpm/X but all match specs in MS containing a trace action term will have a {tracer,Tracer} appended to its enable-list. Tracer will be the current output for regular trace messages as specified when tracing was initiated. This function is useful when setting a meta trace pattern on a function with the intent that its execution shall turn tracing on for the process executing the match-spec in the meta trace pattern. The reason the tracer process trace flag can not be explicitly written in the action term by the user is that it may be difficult to learn its exact value for a remote node. Further more inviso functions are made to work on several nodes at the same time, requiring different match specs to be set for different nodes.

    Simple example: We want any process executing the function mymod:init(1234) (with the argument, exactly the integer 1234) to begin function-call tracing. In the example, if the process is found to be one that shall start call tracing, we also first disable all process trace flags to ensure that we have full control over what the process traces. void in the example specifies that the meta-tracer (inviso_rt_meta) will not call any function when meta trace messages for mymod:init/1 arrives. There is no need for a CallFunc since the side-effect (start call-tracing) is achieved immediately with the match-spec.

    inviso:tpm_tracer(mymod,init,1,[{[1234],[],[{trace,[all],[call]}]}],void). @@ -429,7 +427,7 @@ Nodes = [Node]<v> <v>Mod = Func = atom()<v> <v>Arity = int()<v> <v>MSname = term()<v> <v>MS = [match_spec()]<v> <v>NodeResults = [{Node,NodeResult}]<v> <v>NodeResult = {ok,1} | {ok,0} | {error,Reason}<v> -

    This function adds a list of match-specs to the already existing ones. It uses an internal database to keep track of existing match-specs. This set of match specs can hereafter be referred to with the name MSname. If the match-spec does not result in any meta traced functions (for whatever reason), the MS is not saved in the database. The previously known match-specs are not removed. If MSname is already in use as a name refering to a set of match-specs for this particular meta-traced function, the previous set of match-specs are replaced with MS.

    +

    This function adds a list of match-specs to the already existing ones. It uses an internal database to keep track of existing match-specs. This set of match specs can hereafter be referred to with the name MSname. If the match-spec does not result in any meta traced functions (for whatever reason), the MS is not saved in the database. The previously known match-specs are not removed. If MSname is already in use as a name referring to a set of match-specs for this particular meta-traced function, the previous set of match-specs are replaced with MS.

    Mod:Func/Arity must previously have been initiated in order for this function to add a match-spec.

    When calling several nodes, the nodes are called in parallel. {ok,1} indicates success.

    diff -Nru erlang-13.b.1-dfsg/lib/inviso/doc/src/Makefile erlang-13.b.3-dfsg/lib/inviso/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/inviso/doc/src/Makefile 2007-11-28 16:56:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inviso/doc/src/Makefile 2009-11-20 13:34:25.000000000 +0000 @@ -23,17 +23,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(INVISO_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=inviso # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/inviso-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -52,6 +47,10 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + GIF_FILES = \ inviso_users_guide_pic1.gif @@ -61,29 +60,12 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PDF_FILE = inviso-$(VSN).pdf -TOP_PS_FILE = inviso-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -97,21 +79,13 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) @@ -119,36 +93,27 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core min_head.gif *~ *sgmls_output *sgmls_errs *.kwc *.tex $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 release_spec: diff -Nru erlang-13.b.1-dfsg/lib/inviso/doc/src/notes.xml erlang-13.b.3-dfsg/lib/inviso/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/inviso/doc/src/notes.xml 2007-11-28 16:56:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inviso/doc/src/notes.xml 2009-11-20 13:34:26.000000000 +0000 @@ -4,23 +4,21 @@
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Inviso Release Notes @@ -28,11 +26,29 @@ + notes.xml

    This document describes the changes made to the Inviso application.

    -
    Inviso 0.6 +
    Inviso 0.6.1 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    + +
    Inviso 0.6
    Fixed Bugs and Malfunctions @@ -182,11 +198,11 @@

    This ticket includes several improvements and bugfixes to both runtime_tools and inviso. The overload mechanism can - now also react to incomming messages. This is useful if + now also react to incoming messages. This is useful if an external overload watch-dog is used. Some improvements of variable bindings has been done to the default autostart mechanism - inviso_autostart_server. Autostart - "jobs" can now be done in paralell, allowing for some + "jobs" can now be done in parallel, allowing for some jobs to hang waiting for some parts of the traced system to become ready before proceeding. Previously when using named meta-match-specs (tpm_ms) ending up with zero diff -Nru erlang-13.b.1-dfsg/lib/inviso/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/inviso/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/inviso/doc/src/part_notes.xml 2007-11-28 16:56:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inviso/doc/src/part_notes.xml 2009-11-20 13:34:27.000000000 +0000 @@ -1,26 +1,24 @@ - +

    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Inviso Release Notes @@ -32,6 +30,6 @@

    Inviso, an Erlang trace tool.

    - + diff -Nru erlang-13.b.1-dfsg/lib/inviso/doc/src/part.xml erlang-13.b.3-dfsg/lib/inviso/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/inviso/doc/src/part.xml 2007-11-28 16:56:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inviso/doc/src/part.xml 2009-11-20 13:34:26.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Inviso User's Guide @@ -32,6 +30,6 @@

    Inviso, an Erlang trace tool.

    - + diff -Nru erlang-13.b.1-dfsg/lib/inviso/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/inviso/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/inviso/doc/src/ref_man.xml 2007-11-28 16:56:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inviso/doc/src/ref_man.xml 2009-11-20 13:34:25.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Inviso Reference Manual @@ -32,11 +30,11 @@

    Inviso, an Erlang trace tool.

    - - - - - - + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/inviso/vsn.mk erlang-13.b.3-dfsg/lib/inviso/vsn.mk --- erlang-13.b.1-dfsg/lib/inviso/vsn.mk 2007-11-26 19:03:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/inviso/vsn.mk 2009-11-20 13:34:24.000000000 +0000 @@ -1 +1 @@ -INVISO_VSN = 0.6 +INVISO_VSN = 0.6.1 diff -Nru erlang-13.b.1-dfsg/lib/jinterface/doc/src/book.xml erlang-13.b.3-dfsg/lib/jinterface/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/jinterface/doc/src/book.xml 2009-03-12 12:30:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/jinterface/doc/src/book.xml 2009-11-20 13:37:00.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20002009 @@ -21,7 +21,7 @@ - Jinterface Application + jinterface Gordon Beaton, Babbis Xagorarakis 2000-08-25 @@ -30,16 +30,19 @@
    - Jinterface Application + jinterface - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/jinterface/doc/src/jinterface_users_guide.xml erlang-13.b.3-dfsg/lib/jinterface/doc/src/jinterface_users_guide.xml --- erlang-13.b.1-dfsg/lib/jinterface/doc/src/jinterface_users_guide.xml 2009-03-12 12:30:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/jinterface/doc/src/jinterface_users_guide.xml 2009-11-20 13:36:56.000000000 +0000 @@ -29,7 +29,7 @@ 000822 A - jinterface.sgml + jinterface_users_guide.xml

    The Jinterface package provides a set of tools for communication with Erlang processes. It can also be used for communication with @@ -207,7 +207,7 @@ before communicating with them, but by using ping you can determine if the remote exists before attempting to communicate with it.

    Connections are only permitted by nodes using the same security - cookie. The cookie is a short string privided either as an argument + cookie. The cookie is a short string provided either as an argument when creating OtpNode objects, or found in the user's home directory in the file .erlang.cookie. When a connection attempt is made, the string is used as part of the authentication process. If you are @@ -279,7 +279,7 @@ methods all use Java representations of Erlang data types.

    However it is possible to use the package to communicate with remote processes written in Java as well, and in these cases it may be - desireable to send other data types.

    + desirable to send other data types.

    The simplest way to do this is to encapsulate arbitrary data in messages of type OtpErlangBinary. @@ -336,7 +336,7 @@ instead goes out of scope, the objects finalize() method will call close(). However since Java provides no guarantees about when or even if finalize() will be called, it is important that your application - explicitely closes mailboxes when they are no longer needed if you + explicitly closes mailboxes when they are no longer needed if you want links to work in a timely manner.

    diff -Nru erlang-13.b.1-dfsg/lib/jinterface/doc/src/Makefile erlang-13.b.3-dfsg/lib/jinterface/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/jinterface/doc/src/Makefile 2009-03-12 12:29:48.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/jinterface/doc/src/Makefile 2009-11-20 13:36:42.000000000 +0000 @@ -26,18 +26,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(JINTERFACE_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep - +APPLICATION=jinterface # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/jinterface-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -67,22 +61,9 @@ #------------------------------------------------------ -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APP_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - part.tex $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html - -TOP_PDF_FILE = jinterface-$(VSN).pdf -TOP_PS_FILE = jinterface-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf JAVADOC = javadoc @@ -90,7 +71,7 @@ JAVA_PKG_PATH = com/ericsson/otp/erlang JAVADOC_TITLE = 'Java-Erlang Interface Library' JAVADOC_DEST = ../doc/html/java -JAVA_SRC_PATH = $(ERL_TOP)/lib/jinterface/java_src/$(JAVA_PKG_PATH) +JAVA_SRC_PATH = $(ERL_TOP)/lib/$(APPLICATION)/java_src/$(JAVA_PKG_PATH) # don't add filenames to the Makefile! # all java sourcefiles listed in common include file @@ -125,15 +106,6 @@ HTML_FILES = \ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) - -EXTRA_FILES = \ - summary.html.src \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) - - - TOP_HTML_FILES = $(INDEX_TARGET) INDEX_FILE = index.html @@ -152,21 +124,19 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs $(TOP_HTML_FILES) jdoc man -endif -endif +docs: pdf html jdoc man + +$(TOP_PDF_FILE): $(XML_FILES) pdf: $(TOP_PDF_FILE) -ps: $(TOP_PS_FILE) +html: gifs $(HTML_REF_MAN_FILE) -html:$(HTML_FILES) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ jdoc:$(JAVA_SRC_FILES) (cd ../../java_src;$(JAVADOC) -sourcepath . -d $(JAVADOC_DEST) \ @@ -176,44 +146,28 @@ gifs: $(GIF_FILES:%=$(HTMLDIR)/%) -$(INDEX_TARGET): $(INDEX_SRC) ../../vsn.mk - sed -e 's;%VSN%;$(VSN);' $< > $@ +#$(INDEX_TARGET): $(INDEX_SRC) ../../vsn.mk +# sed -e 's;%VSN%;$(VSN);' $< > $@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_HTML_FILES) $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ *dump min_head.gif $(LATEX_CLEAN) - rm -f $(JAVA_GEN_FILES) - - # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ - $(RELSYSDIR)/doc/html $(INSTALL_DIR) $(RELSYSDIR)/doc/html/java/$(JAVA_PKG_PATH) - $(INSTALL_DATA) $(JAVA_EXTRA_FILES) $(RELSYSDIR)/doc/html/java - (/bin/cp -rf ../../doc/html $(RELSYSDIR)/doc) - $(INSTALL_DATA) $(TOP_HTML_FILES) $(RELSYSDIR)/doc -endif -endif + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + (/bin/cp -rf ../html $(RELSYSDIR)/doc) + +# $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ +# $(RELSYSDIR)/doc/html +# $(INSTALL_DATA) $(JAVA_EXTRA_FILES) $(RELSYSDIR)/doc/html/java +# $(INSTALL_DATA) $(TOP_HTML_FILES) $(RELSYSDIR)/doc + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/jinterface/doc/src/notes.xml erlang-13.b.3-dfsg/lib/jinterface/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/jinterface/doc/src/notes.xml 2009-04-16 10:26:11.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/jinterface/doc/src/notes.xml 2009-11-20 13:36:43.000000000 +0000 @@ -26,9 +26,27 @@ nil nil nil + notes.xml

    This document describes the changes made to the Jinterface application.

    +
    Jinterface 1.5.2 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    +
    Jinterface 1.5.1
    Fixed Bugs and Malfunctions @@ -124,7 +142,7 @@ does not agree on the other node's name. This has been a problem in that a connection was set up, but not used on a following send, which caused a second erroneous - connection attemt to fail since the other (Erlang) node + connection attempt to fail since the other (Erlang) node rejects a connection due to name disagreement.

    Problem reported and dissected by Alexander Lamb

    diff -Nru erlang-13.b.1-dfsg/lib/jinterface/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/jinterface/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/jinterface/doc/src/part_notes.xml 2009-03-12 12:29:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/jinterface/doc/src/part_notes.xml 2009-11-20 13:36:43.000000000 +0000 @@ -1,7 +1,7 @@ - +

    20002009 @@ -33,6 +33,6 @@

    For information about older versions, see Release Notes History.

    - + diff -Nru erlang-13.b.1-dfsg/lib/jinterface/doc/src/part.xml erlang-13.b.3-dfsg/lib/jinterface/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/jinterface/doc/src/part.xml 2009-03-12 12:29:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/jinterface/doc/src/part.xml 2009-11-20 13:36:44.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20002009 @@ -30,6 +30,6 @@

    The Jinterface Application is a java communication tool package to erlang.

    - + diff -Nru erlang-13.b.1-dfsg/lib/jinterface/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/jinterface/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/jinterface/doc/src/ref_man.xml 2009-03-12 12:30:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/jinterface/doc/src/ref_man.xml 2009-11-20 13:37:00.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20002009 @@ -31,6 +31,6 @@

    Jinterface is a Java communication tool package to Erlang.

    - + diff -Nru erlang-13.b.1-dfsg/lib/jinterface/vsn.mk erlang-13.b.3-dfsg/lib/jinterface/vsn.mk --- erlang-13.b.1-dfsg/lib/jinterface/vsn.mk 2009-04-16 10:26:11.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/jinterface/vsn.mk 2009-11-20 13:36:44.000000000 +0000 @@ -16,4 +16,4 @@ ## ## %CopyrightEnd% -JINTERFACE_VSN = 1.5.1 +JINTERFACE_VSN = 1.5.2 diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/application.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/application.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/application.xml 2009-03-12 12:18:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/application.xml 2009-11-20 13:29:41.000000000 +0000 @@ -467,7 +467,7 @@

    Returns a list with information about the applications which are currently running. Application is the application name. Description and Vsn are the values of its - description and vsn application specfication + description and vsn application specification keys, respectively.

    which_applications/0 uses the standard gen_server timeout value (5000 ms). A Timeout @@ -547,7 +547,7 @@ applications, the set of phases must be a subset of the set of phases defined for the including application.

    The function is called for each start phase (as defined for - the primary appliction) for the primary application and all + the primary application) for the primary application and all included applications, for which the start phase is defined.

    See Module:start/2 for a description of StartType.

    diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/book.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/book.xml 2007-11-26 18:57:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/book.xml 2009-11-20 13:30:17.000000000 +0000 @@ -1,29 +1,27 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - Kernel Application (KERNEL) + Kernel @@ -31,13 +29,16 @@
    - Kernel Application (KERNEL) + Kernel - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/code.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/code.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/code.xml 2009-03-12 12:18:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/code.xml 2009-11-20 13:29:42.000000000 +0000 @@ -54,7 +54,7 @@ for and tries to load the module.

    -

    To prevent accidently reloading modules affecting the Erlang +

    To prevent accidentaly reloading modules affecting the Erlang runtime system itself, the kernel, stdlib and compiler directories are considered sticky. This means that the system issues a warning and rejects the request if @@ -135,7 +135,7 @@

    In the current implementation, Erlang archives are ZIP files with .ez extension. Erlang archives may also be - enclosed in escript files whose file extension is arbitary.

    + enclosed in escript files whose file extension is arbitrary.

    Erlang archive files may contain entire Erlang applications or parts of applications. The structure in an archive file is the @@ -165,7 +165,7 @@

    Normally the top directory of an application is located either in the library directory $OTPROOT/lib or in a directory referred to by the environment variable ERL_LIBS. At - startup when the inititial code path is computed, the code server + startup when the initial code path is computed, the code server will also look for archive files in these directories and possibly add ebin directories in archives to the code path. The code path will then contain paths to directories that looks like @@ -193,7 +193,7 @@

    At the time point when a directory is added to the code path as well as when the entire code path is (re)set, the code server - will decide which subdirecories in an application that shall be + will decide which subdirectories in an application that shall be read from the archive and which that shall be read as regular files. If directories are added or removed afterwards, the file access may fail if the code path is not updated (possibly to the @@ -217,8 +217,8 @@ directories in the embedded archive are added to the code path. See escript(1)

    -

    By default the choice of directories in the code path is - strict. The directory that ends up in the code path will +

    When the choice of directories in the code path is + strict, the directory that ends up in the code path will be exactly the stated one. This means that if for example the directory $OTPROOT/lib/mnesia-4.4.7/ebin is explicitly added to the code path, the code server will not load files from @@ -227,7 +227,7 @@

    This behavior can be controlled via the command line flag -code_path_choice Choice. If the flag is set to relaxed, - the code server will instead choose a suiteable directory + the code server will instead choose a suitable directory depending on the actual file structure. If there exists a regular application ebin directory,situation it will be choosen. But if it does not exist, the ebin directory in the archive is choosen if it @@ -237,10 +237,10 @@

    The command line flag -code_path_choice Choice does also affect how init interprets the boot script. The interpretation of the explicit code paths in the boot - script may be strict or relaxed. it is + script may be strict or relaxed. It is particular useful to set the flag to relaxed when you want to elaborate with code loading from archives without editing the - boot script. See boot script. The default is relaxed. See init(3)

    @@ -620,7 +620,7 @@ module Module on a node Node is done as follows:

    -...\011 +... {_Module, Binary, Filename} = code:get_object_code(Module), rpc:call(Node, code, load_binary, [Module, Filename, Binary]), ... diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/file.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/file.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/file.xml 2009-03-13 14:15:52.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/file.xml 2009-11-20 13:29:47.000000000 +0000 @@ -51,7 +51,7 @@ DeepList = [char() | atom() | DeepList] posix() - an atom which is named from the Posix error codes used in + an atom which is named from the POSIX error codes used in Unix, and in the runtime libraries of most C compilers ext_posix() = posix() | badarg @@ -607,8 +607,10 @@ The functions in the io module cannot be used, because they can only talk to an Erlang process. - Instead, use the read/2 and write/2 + Instead, use the read/2, read_line/1 and + write/2 functions. + Especially if read_line/1 is to be used on a raw file, it is recommended to combine this option with the {read_ahead, Size} option as line oriented I/O is inefficient without buffering. Only the Erlang process which opened the file can use it. A remote Erlang file server cannot be used; @@ -663,6 +665,10 @@ bytes. The extra data is buffered and returned in subsequent read/2 calls, giving a performance gain since the number of operating system calls is reduced.

    +

    The read_ahead buffer is also highly utilized + by the read_line/1 function in raw mode, + why this option is recommended (for performance reasons) + when accessing raw files using that function.

    If read/2 calls are for sizes not significantly less than, or even greater than Size bytes, no performance gain can be expected.

    @@ -675,7 +681,7 @@ compressed

    Makes it possible to read or write gzip compressed - files. The compressesed option must be combined + files. The compressed option must be combined with either read or write, but not both. Note that the file size obtained with read_file_info/1 will most probably not match the @@ -1147,9 +1153,10 @@

    Reads Number bytes/characters from the file referenced by - IoDevice. This function is the only way to read from a - file opened in raw mode (although it works for normally - opened files, too).

    + IoDevice. The functions read/2, pread/3 + and read_line/1 are the only ways to read from a file + opened in raw mode (although they work for normally opened + files, too).

    For files where encoding is set to something else than latin1, one character might be represented by more than one byte on the file. The parameter Number always denotes the number of characters read from the file, why the position in the file might be moved a lot more than this number when reading a Unicode file.

    Also if encoding is set to something else than latin1, the read/3 call will fail if the data contains characters larger than 255, why the io(3) module is to be preferred when reading such a file.

    The function returns:

    @@ -1352,6 +1359,50 @@ + read_line(IoDevice) -> {ok, Data} | eof | {error, Reason} + Read a line from a file + + IoDevice = io_device() + Data = [char()] | binary() + Reason = ext_posix() | terminated + + +

    Reads a line of bytes/characters from the file referenced by + IoDevice. Lines are defined to be delimited by the linefeed (LF, \\n) character, but any carriage return (CR, \\r) followed by a newline is also treated as a single LF character (the carriage return is silently ignored). The line is returned including the LF, but excluding any CR immediately followed by a LF. This behaviour is consistent with the behaviour of io:get_line/2. If end of file is reached without any LF ending the last line, a line with no trailing LF is returned.

    +

    The function can be used on files opened in raw mode. It is however inefficient to use it on raw files if the file is not opened with the option {read_ahead, Size} specified, why combining raw and {read_ahead, Size} is highly recommended when opening a text file for raw line oriented reading.

    +

    If encoding is set to something else than latin1, the read_line/1 call will fail if the data contains characters larger than 255, why the io(3) module is to be preferred when reading such a file.

    +

    The function returns:

    + + {ok, Data} + +

    One line from the file is returned, including the trailing LF, but with CRLF sequences replaced by a single LF (see above).

    +

    If the file was opened in binary mode, the read bytes are + returned in a binary, otherwise in a list.

    +
    + eof + +

    Returned if end of file was reached + before anything at all could be read.

    +
    + {error, Reason} + +

    An error occurred.

    +
    +
    +

    Typical error reasons:

    + + ebadf + +

    The file is not opened for reading.

    +
    + {no_translation, unicode, latin1} + +

    The file is was opened with another encoding than latin1 and the data on the file can not be translated to the byte-oriented data that this function returns.

    +
    +
    +
    +
    + read_link(Name) -> {ok, Filename} | {error, Reason} See what a link is pointing to @@ -1897,7 +1948,7 @@ faster, but consume more memory and cause more memory fragmentation. How much this affects your application is something that this simple benchmark can not predict.

    -

    If the\011size of each binary is increased to 64 bytes, it will +

    If the size of each binary is increased to 64 bytes, it will also run slightly faster, but the code will be twice as clumsy. In the current implementation are binaries larger than 64 bytes stored in memory common to all processes and not copied when diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/gen_tcp.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/gen_tcp.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/gen_tcp.xml 2009-03-12 12:19:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/gen_tcp.xml 2009-11-20 13:30:26.000000000 +0000 @@ -47,7 +47,7 @@ server() -> {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0}, -\011\011\011\011\011{active, false}]), + {active, false}]), {ok, Sock} = gen_tcp:accept(LSock), {ok, Bin} = do_recv(Sock, []), ok = gen_tcp:close(Sock), @@ -55,10 +55,10 @@ do_recv(Sock, Bs) -> case gen_tcp:recv(Sock, 0) of -\011{ok, B} -> -\011 do_recv(Sock, [Bs, B]); -\011{error, closed} -> -\011 {ok, list_to_binary(Bs)} + {ok, B} -> + do_recv(Sock, [Bs, B]); + {error, closed} -> + {ok, list_to_binary(Bs)} end.

    For more examples, see the examples section.

    @@ -133,7 +133,7 @@

    Packets can be sent to the returned socket Socket - using\011send/2. Packets sent from the peer are delivered + using send/2. Packets sent from the peer are delivered as messages:

    {tcp, Socket, Data} @@ -363,12 +363,12 @@ start(Num,LPort) -> case gen_tcp:listen(LPort,[{active, false},{packet,2}]) of -\011{ok, ListenSock} -> -\011 start_servers(Num,ListenSock), -\011 {ok, Port} = inet:port(ListenSock), -\011 Port; -\011{error,Reason} -> -\011 {error,Reason} + {ok, ListenSock} -> + start_servers(Num,ListenSock), + {ok, Port} = inet:port(ListenSock), + Port; + {error,Reason} -> + {error,Reason} end. start_servers(0,_) -> @@ -376,33 +376,33 @@ start_servers(Num,LS) -> spawn(?MODULE,server,[LS]), start_servers(Num-1,LS). -\011\011 + server(LS) -> case gen_tcp:accept(LS) of -\011{ok,S} -> -\011 loop(S), -\011 server(LS); -\011Other -> -\011 io:format("accept returned ~w - goodbye!~n",[Other]), -\011 ok + {ok,S} -> + loop(S), + server(LS); + Other -> + io:format("accept returned ~w - goodbye!~n",[Other]), + ok end. loop(S) -> inet:setopts(S,[{active,once}]), receive -\011{tcp,S,Data} -> -\011 Answer = process(Data), % Not implemented in this example -\011 gen_tcp:send(S,Answer), -\011 loop(S); -\011{tcp_closed,S} -> -\011 io:format("Socket ~w closed [~w]~n",[S,self()]), -\011 ok + {tcp,S,Data} -> + Answer = process(Data), % Not implemented in this example + gen_tcp:send(S,Answer), + loop(S); + {tcp_closed,S} -> + io:format("Socket ~w closed [~w]~n",[S,self()]), + ok end.

    A simple client could look like this:

    client(PortNo,Message) -> {ok,Sock} = gen_tcp:connect("localhost",PortNo,[{active,false}, -\011\011\011\011\011\011 {packet,2}]), + {packet,2}]), gen_tcp:send(Sock,Message), A = gen_tcp:recv(Sock,0), gen_tcp:close(Sock), @@ -424,36 +424,36 @@ ... {ok,Sock} = gen_tcp:connect(HostAddress, Port, -\011\011\011\011[{active,false}, -\011\011\011\011 {send_timeout, 5000}, -\011\011\011\011 {packet,2}]), -\011\011 loop(Sock), % See below + [{active,false}, + {send_timeout, 5000}, + {packet,2}]), + loop(Sock), % See below ...

    In the loop where requests are handled, we can now detect send timeouts:

    loop(Sock) -> receive -\011{Client, send_data, Binary} -> -\011 case gen_tcp:send(Sock,[Binary]) of -\011\011{error, timeout} -> -\011\011 io:format("Send timeout, closing!~n", -\011\011\011 []), -\011\011 handle_send_timeout(), % Not implemented here -\011\011 Client ! {self(),{error_sending, timeout}}, -\011\011 %% Usually, it's a good idea to give up in case of a -\011\011 %% send timeout, as you never know how much actually -\011\011 %% reached the server, maybe only a packet header?! -\011\011 gen_tcp:close(Sock); -\011\011{error, OtherSendError} -> -\011\011 io:format("Some other error on socket (~p), closing", -\011\011\011 [OtherSendError]), -\011\011 Client ! {self(),{error_sending, OtherSendError}}, -\011\011 gen_tcp:close(Sock); -\011\011ok -> -\011\011 Client ! {self(), data_sent}, -\011\011 loop(Sock) -\011 end + {Client, send_data, Binary} -> + case gen_tcp:send(Sock,[Binary]) of + {error, timeout} -> + io:format("Send timeout, closing!~n", + []), + handle_send_timeout(), % Not implemented here + Client ! {self(),{error_sending, timeout}}, + %% Usually, it's a good idea to give up in case of a + %% send timeout, as you never know how much actually + %% reached the server, maybe only a packet header?! + gen_tcp:close(Sock); + {error, OtherSendError} -> + io:format("Some other error on socket (~p), closing", + [OtherSendError]), + Client ! {self(),{error_sending, OtherSendError}}, + gen_tcp:close(Sock); + ok -> + Client ! {self(), data_sent}, + loop(Sock) + end end.

    Usually it would suffice to detect timeouts on receive, as most protocols include some sort of acknowledgment from the server, diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/global_group.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/global_group.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/global_group.xml 2009-03-12 12:19:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/global_group.xml 2009-11-20 13:30:36.000000000 +0000 @@ -63,7 +63,7 @@ group are hidden nodes, regardless if they are started with the -hidden command line flag or not.

    For the processes and nodes to run smoothly using the global - group functiontionality, the following criteria must be met:

    + group functionality, the following criteria must be met:

    An instance of the global group server, global_group, diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/inet_res.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/inet_res.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/inet_res.xml 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/inet_res.xml 2009-09-18 15:10:21.000000000 +0100 @@ -0,0 +1,482 @@ + + + + +

    + + 20092009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + inet_res + raimo@erix.ericsson.se + + 2009-09-11 + A +
    + inet_res + A Rudimentary DNS Client + +

    Performs DNS name resolving towards recursive name servers

    +

    See also + + ERTS User's Guide: Inet configuration + for more + information on how to configure an Erlang runtime system for IP + communication and how to enable this DNS client by defining + as a lookup method. It then acts + as a backend for the resolving functions in + inet.

    +

    This DNS client can resolve DNS records even if it + is not used for normal name resolving in the node.

    +

    This is not a full-fledged resolver. It is just a + DNS client that relies on asking trusted recursive nameservers.

    +
    + +
    + Name Resolving +

    UDP queries are used unless resolver option + usevc is true, which forces TCP queries. + If the query is to large for UDP, TCP is used instead. + For regular DNS queries 512 bytes is the size limit. + When EDNS is enabled (resolver option + edns is set to the EDNS version i.e 0 + instead of false), resolver option + udp_payload_size sets the limit. If a nameserver + replies with the TC bit set (truncation), indicating + the answer is incomplete, the query is retried + to that nameserver using TCP. The resolver option + udp_payload_size also sets the advertised + size for the max allowed reply size, if EDNS is + enabled, otherwise the nameserver uses the limit + 512 byte. If the reply is larger it gets truncated, + forcing a TCP re-query.

    +

    For UDP queries, the resolver options timeout + and retry control retransmission. + Each nameserver in the nameservers list is + tried with a timeout of timeout / retry. + Then all nameservers are tried again doubling the + timeout, for a total of retry times.

    +

    For queries that not use the search list, + if the query to all nameservers results in + {error,nxdomain}or an empty answer, the same + query is tried for the alt_nameservers.

    +
    + + + + +
    + DATA TYPES +

    As defined in the module + inet:

    + +hostent() = #hostent{} +posix() = some atom()s +ip_address() = tuple of integers of arity 4 or 8 + +

    Resolver types:

    + These correspond to resolver options: + +res_option() = + [ {alt_nameservers, [ nameserver() ]} + | {edns, 0 | false} % Use EDNS + | {inet6, bool()} % Return IPv6 addresses + | {nameservers, [ nameserver() ]} % List of nameservers + | {recurse, bool()} % Request server recursion + | {retry, integer()} % UDP retries + | {timeout, integer()} % UDP query timeout + | {udp_payload_size, integer()} % EDNS payload size + | {usevc, bool()} ] % Use TCP (Virtual Circuit) + +nameserver() = {ip_address(),Port} + Port = integer(1..65535) + +res_error() = + formerr | + qfmterror | + servfail | + nxdomain | + notimp | + refused | + badvers | + timeout + + +

    DNS types:

    + + dns_name() = string() with no adjacent dots + +rr_type() = a | aaaa | cname | gid | hinfo | ns | mb | md | mg | mf + | minfo | mx | naptr | null | ptr | soa | spf | srv | txt + | uid | uinfo | unspec | wks + +query_type() = axfr | mailb | maila | any | rr_type() + +dns_class() = in | chaos | hs | any + +dns_msg() = DnsMsg + This is the start of a hiearchy of opaque data structures + that can be examined with access functions in inet_dns + that return lists of {Field,Value} tuples. The arity 2 + functions just return the value for a given field. + + inet_dns:msg(DnsMsg) -> + [ {header, dns_header()} + | {qdlist, dns_query()} + | {anlist, dns_rr()} + | {nslist, dns_rr()} + | {arlist, dns_rr()} ] + inet_dns:msg(DnsMsg, header) -> dns_header() % for example + inet_dns:msg(DnsMsg, Field) -> Value + +dhs_header() = DnsHeader + inet_dns:header(DnsHeader) -> + [ {id, integer()} + | {qr, bool()} + | {opcode, 'query' | iquery | status | integer()} + | {aa, bool()} + | {tc, bool()} + | {rd, bool()} + | {ra, bool()} + | {pr, bool()} + | {rcode, integer(0..16)} ] + inet_dns:header(DnsHeader, Field) -> Value + +dns_query() = DnsQuery + inet_dns:dns_query(DnsQuery) -> + [ {domain, dns_name()} + | {type, query_type()} + | {class, dns_class()} ] + inet_dns:dns_query(DnsQuery, Field) -> Value + +dns_rr() = DnsRr + inet_dns:rr(DnsRr) -> DnsRrFields | DnsRrOptFields + DnsRrFields = [ {domain, dns_name()} + | {type, rr_type()} + | {class, dns_class()} + | {ttl, integer()} + | {data, dns_data()} ] + DnsRrOptFields = [ {domain, dns_name()} + | {type, opt} + | {udp_payload_size, integer()} + | {ext_rcode, integer()} + | {version, integer()} + | {z, integer()} + | {data, dns_data()} ] + inet_dns:rr(DnsRr, Field) -> Value + +dns_data() = % for dns_type() + [ dns_name() % ns, md, mf, cname, mb, mg, mr, ptr + | ip_address(v4) % a + | ip_address(v6) % aaaa + | {MName,RName,Serial,Refresh,Retry,Expiry,Minimum} % soa + | {ip_address(v4),Proto,BitMap} % wks + | {CpuString,OsString} % hinfo + | {RM,EM} % minfo + | {Prio,dns_name()} % mx + | {Prio,Weight,Port,dns_name()} % srv + | {Order,Preference,Flags,Services,Regexp,dns_name()} % naptr + | [ string() ] % txt, spf + | binary() ] % null, integer() +MName, RName = dns_name() +Serial, Refresh, Retry, Expiry, Minimum = integer(), +Proto = integer() +BitMap = binary() +CpuString, OsString = string() +RM = EM = dns_name() +Prio, Weight, Port = integer() +Order, Preference = integer() +Flags, Services = string(), +Regexp = string(utf8) + + + +There is an info function for the types above: + +inet_dns:record_type(dns_msg()) -> msg; +inet_dns:record_type(dns_header()) -> header; +inet_dns:record_type(dns_query()) -> dns_query; +inet_dns:record_type(dns_rr()) -> rr; +inet_dns:record_type(_) -> undefined. + +So; inet_dns:(inet_dns:record_type(X))(X) will convert +any of these data structures into a {Field,Value} list. +
    + + + + + + + getbyname(Name, Type) -> {ok,hostent()} | {error,Reason} + getbyname(Name, Type, Timeout) -> + {ok,hostent()} | {error,Reason} + + Resolve a DNS record of the given type for the given host + + + Name = dns_name() + Type = rr_type() + Timeout = integer() >= 0 | infinity + Reason = posix() | res_error() + + +

    Resolve a DNS record of the given type for the given host, + of class in. On success returns a hostent() record with + dns_data() elements in the address list field. +

    + This function uses the resolver option search that + is a list of domain names. If the name to resolve contains + no dots, it is prepended to each domain name in the + search list, and they are tried in order. If the name + contains dots, it is first tried as an absolute name + and if that fails the search list is used. If the name + has a trailing dot it is simply supposed to be + an absolute name and the search list is not used. +

    +
    +
    + + + gethostbyaddr(Address) -> {ok,hostent()} | {error,Reason} + gethostbyaddr(Address, Timeout) -> + {ok,hostent()} | {error,Reason} + + Return a hostent record for the host with the given address + + + Address = ip_address() + Timeout = integer() >= 0 | infinity + Reason = posix() | res_error() + + +

    Backend functions used by + + inet:gethostbyaddr/1 + . +

    +
    +
    + + + gethostbyname(Name) -> {ok,hostent()} | Reason} + gethostbyname(Name, Family) -> + {ok,hostent()} | {error,Reason}} + + gethostbyname(Name, Family, Timeout) -> + {ok,hostent()} | {error,Reason} + + Return a hostent record for the host with the given name + + + Name = dns_name() + Timeout = integer() >= 0 | infinity + Reason = posix() | res_error() + + +

    Backend functions used by + + inet:gethostbyname/1,2 + . +

    + This function uses the resolver option search just like + getbyname/2,3. +

    + If the resolver option inet6 is true, + an IPv6 address is looked up, and if that fails + the IPv4 address is looked up and returned on + IPv6 mapped IPv4 format. +

    +
    +
    + + + lookup(Name, Class, Type) -> [ dns_data() ] + + lookup(Name, Class, Type, Opts) -> [ dns_data() ] + + lookup(Name, Class, Type, Opts, Timeout) -> [ dns_data() ] + + Resolve the DNS data for the record of the given type and class + for the given name + + + Name = dns_name() | ip_address() + Type = rr_type() + Opts = res_option() | verbose + Timeout = integer() >= 0 | infinity + Reason = posix() | res_error() + + +

    Resolve the DNS data for the record of the given type and class + for the given name. On success filters out the answer records + with the correct Class and Type and returns + a list of their data fields. So a lookup for type any + will give an empty answer since the answer records have + specific types that are not any. An empty answer + as well as a failed lookup returns an empty list. +

    + Calls resolve/2..4 + with the same arguments and filters the result, so + Opts is explained there. +

    +
    +
    + + + resolve(Name, Class, Type) -> {ok,dns_msg()} | Error + + resolve(Name, Class, Type, Opts) -> {ok,dns_msg()} | Error + + resolve(Name, Class, Type, Opts, Timeout) -> {ok,dns_msg()} | Error + + Resolve a DNS record of the given type and class + for the given name + + + Name = dns_name() | ip_address() + Type = rr_type() + Opts = res_option() | verbose | atom() + Timeout = integer() >= 0 | infinity + Error = {error,Reason} | {error,{Reason,dns_msg()}} + Reason = posix() | res_error() + + +

    Resolve a DNS record of the given type and class for the given name. + The returned dns_msg() can be examined using + access functions in inet_db as described + in DNS types. +

    + If Name is an ip_address(), the domain name + to query for is generated as the standard reverse + ".IN-ADDR.ARPA." name for an IPv4 address, or the + ".IP6.ARPA." name for an IPv6 address. + In this case you most probably want to use + Class = in and Type = ptr but it + is not done automatically. +

    + Opts override the corresponding resolver options. + If the option nameservers is given, it is + also assumed that it is the complete list of nameserves, + so the resolver option alt_nameserves is ignored. + Of course, if that option is also given to this function, + it is used. +

    + The verbose option (or rather {verbose,true}), + causes diagnostics printout through + io:format/2 + of queries, replies retransmissions, etc, similar + to from utilities like dig, nslookup et.al. +

    + If Opt is an arbitrary atom it is interpreted + as {Opt,true} unless the atom string starts with + "no" making the interpretation {Opt,false}. + For example: usevc is an alias for {usevc,true}, + and nousevc an alias for {usevc,false}. +

    + The inet6 option currently has no effect on this function. + You probably want to use Type = a | aaaa instead. +

    +
    +
    + +
    + + + +
    + Examples +

    Access functions example: how + lookup/3 + could have been implemented using + resolve/3 + from outside the module. +

    + example_lookup(Name, Class, Type) -> + case inet_res:resolve(Name, Class, Type) of + {ok,Msg} -> + [inet_dns:rr(RR, data) + || RR <- inet_dns:msg(Msg, anlist), + inet_dns:rr(RR, type) =:= Type, + inet_dns:rr(RR, class) =:= Class]; + {error,_} -> + [] + end. +
    + + + +
    + Legacy Functions +

    These have been deprecated due to the annoying double + meaning of the nameservers/timeout argument, and + because they had no decent place for a resolver options list.

    +
    + + + + + nslookup(Name, Class, Type) -> {ok,dns_msg()} | {error,Reason} + + nslookup(Name, Class, Type, Timeout) -> + {ok,dns_msg()} | {error,Reason} + + nslookup(Name, Class, Type, Nameservers) -> + {ok,dns_msg()} | {error,Reason} + + Resolve a DNS record of the given type and class + for the given name + + + Name = dns_name() | ip_address() + Type = rr_type() + Nameservers = [ nameserver() ] + Timeout = integer() >= 0 | infinity + Reason = posix() | res_error() + + +

    Resolve a DNS record of the given type and class for the given name. +

    +
    +
    + + + nnslookup(Name, Class, Type, Nameservers) -> + {ok,dns_msg()} | {error,posix()} + + nnslookup(Name, Class, Type, Nameservers, Timeout) -> + {ok,dns_msg()} | {error,posix()} + + Resolve a DNS record of the given type and class + for the given name + + + Name = dns_name() | ip_address() + Type = rr_type() + Nameservers = [ nameserver() ] + Timeout = integer() >= 0 | infinity + Reason = posix() | res_error() + + +

    Resolve a DNS record of the given type and class for the given name. +

    +
    +
    + +
    + + diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/inet.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/inet.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/inet.xml 2009-03-12 12:18:59.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/inet.xml 2009-11-20 13:30:13.000000000 +0000 @@ -148,7 +148,7 @@ getaddr(Host, Family) -> {ok, Address} | {error, posix()} - Return the IP-adress for a host + Return the IP-address for a host Host = ip_address() | string() | atom() Family = inet | inet6 @@ -163,7 +163,7 @@ getaddrs(Host, Family) -> {ok, Addresses} | {error, posix()} - Return the IP-adresses for a host + Return the IP-addresses for a host Host = ip_address() | string() | atom() Addresses = [ip_address()] @@ -171,7 +171,7 @@

    Returns a list of all IP-addresses for Host. - Host can be an IP-adress, a single hostname or a fully + Host can be an IP-address, a single hostname or a fully qualified hostname.

    @@ -284,9 +284,9 @@ value to be a 32 bit integer. We could use the following code to retrieve the value:

    -\011 {ok,[{raw,_,_,Info}]} = inet:getopts(Sock,[{raw,6,11,92}]), -\011 <<_:28/binary,TcpiSacked:32/native,_/binary>> = Info, + get_tcpi_sacked(Sock) -> + {ok,[{raw,_,_,Info}]} = inet:getopts(Sock,[{raw,6,11,92}]), + <<_:28/binary,TcpiSacked:32/native,_/binary>> = Info, TcpiSacked.]]>

    Preferably, you would check the machine type, the OS and the kernel version prior to executing anything similar to the @@ -324,7 +324,7 @@ recv_max -

    The size of the largerst packet in bytes received to the socket.

    +

    The size of the largest packet in bytes received to the socket.

    recv_oct @@ -345,7 +345,7 @@ send_max -

    The size of the largerst packet in bytes sent from the socket.

    +

    The size of the largest packet in bytes sent from the socket.

    send_oct @@ -519,9 +519,10 @@

    Packets consist of a header specifying the number of bytes in the packet, followed by that number of bytes. The length of header can be one, two, or four bytes; - the order of the bytes is big-endian. Each send - operation will generate the header, and the header + containing an unsigned integer in big-endian byte order. + Each send operation will generate the header, and the header will be stripped off on each receive operation.

    +

    In current implementation the 4-byte header is limited to 2Gb.

    asn1 | cdr | sunrm | fcgi | tpkt | line @@ -600,7 +601,7 @@ exceeded, the send operation will return {error,timeout}. How much of a packet that actually got sent is unknown, why the socket should be closed - whenever a timeout has occured (see send_timeout_close). + whenever a timeout has occurred (see send_timeout_close). Default is infinity.

    {send_timeout_close, Boolean} @@ -629,7 +630,7 @@

    Sets IP_TOS IP level options on platforms where this is implemented. The behaviour and allowed range varies on different systems. The option is ignored on platforms where the option is - not implemented. Use with caution.\011

    + not implemented. Use with caution.

    In addition to the options mentioned above, raw @@ -656,13 +657,13 @@ this line of code to set the option for the socket named Sock:

    >}]),]]> + inet:setopts(Sock,[{raw,6,8,<<30:32/native>>}]),]]>

    As many options are silently discarded by the stack if they are given out of range, it could be a good idea to check that a raw option really got accepted. This code places the value in the variable TcpLinger2:

    >}]}=inet:getopts(Sock,[{raw,6,8,4}]),]]> + {ok,[{raw,6,8,<>}]}=inet:getopts(Sock,[{raw,6,8,4}]),]]>

    Code such as the examples above is inherently non portable, even different versions of the same OS on the same platform may respond differently to this kind of option @@ -763,7 +764,7 @@ enomsg - no message of desired type enonet - machine is not on the network enopkg - package not installed - enoprotoopt - bad proocol option + enoprotoopt - bad protocol option enospc - no space left on device enosr - out of stream resources or not a stream device diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/make.dep erlang-13.b.3-dfsg/lib/kernel/doc/src/make.dep --- erlang-13.b.1-dfsg/lib/kernel/doc/src/make.dep 2009-03-12 12:19:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/make.dep 2009-09-18 15:08:01.000000000 +0100 @@ -14,8 +14,8 @@ erl_ddll.tex erl_prim_loader_stub.tex erlang_stub.tex \ error_handler.tex error_logger.tex file.tex \ gen_sctp.tex gen_tcp.tex gen_udp.tex global.tex \ - global_group.tex heart.tex inet.tex init_stub.tex \ - kernel_app.tex net_adm.tex net_kernel.tex \ + global_group.tex heart.tex inet.tex inet_res.tex \ + init_stub.tex kernel_app.tex net_adm.tex net_kernel.tex \ os.tex packages.tex pg2.tex ref_man.tex rpc.tex \ seq_trace.tex user.tex wrap_log_reader.tex \ zlib_stub.tex diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/Makefile erlang-13.b.3-dfsg/lib/kernel/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/kernel/doc/src/Makefile 2009-03-12 12:19:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/Makefile 2009-11-20 13:30:17.000000000 +0000 @@ -23,17 +23,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(KERNEL_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=kernel # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/kernel-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -57,6 +52,7 @@ global_group.xml \ heart.xml \ inet.xml \ + inet_res.xml \ init_stub.xml \ net_adm.xml \ net_kernel.xml \ @@ -78,47 +74,31 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_REF4_FILES) \ + $(XML_REF6_FILES) $(XML_APPLICATION_FILES) + # ---------------------------------------------------- HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF4_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN4_FILES = $(XML_REF4_FILES:%.xml=$(MAN4DIR)/%.4) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF4_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = kernel-$(VSN).pdf -TOP_PS_FILE = kernel-$(VSN).ps +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets @@ -126,60 +106,45 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) $(MAN4_FILES) $(MAN6_FILES) +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) $(MAN4_FILES) $(MAN6_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ min_head.gif $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(MAN4DIR)/* + rm -f $(MAN6DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 $(INSTALL_DIR) $(RELEASE_PATH)/man/man4 $(INSTALL_DATA) $(MAN4_FILES) $(RELEASE_PATH)/man/man4 $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6 -endif -endif release_spec: diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/net_kernel.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/net_kernel.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/net_kernel.xml 2009-03-12 12:18:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/net_kernel.xml 2009-11-20 13:29:47.000000000 +0000 @@ -100,7 +100,7 @@ Error = error | {error, term()} -

    The calling process subscribes or unsubcscribes to node +

    The calling process subscribes or unsubscribes to node status change messages. A nodeup message is delivered to all subscribing process when a new node is connected, and a nodedown message is delivered when a node is @@ -122,7 +122,7 @@

    Note, that this is not guaranteed for kernel versions before 2.11.4.

    -

    As of kernel version 2.11.4 subscribtions can also be +

    As of kernel version 2.11.4 subscriptions can also be made before the net_kernel server has been started, i.e., net_kernel:monitor_nodes/[1,2] does not return ignored.

    diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/notes_history.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/notes_history.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/notes_history.xml 2007-11-26 19:00:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/notes_history.xml 2009-11-20 13:32:22.000000000 +0000 @@ -4,23 +4,21 @@
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Kernel Release Notes History @@ -86,7 +84,7 @@

    It is now possible to compile files with erlc without - getting a lot of (for compilation) unneccessary code + getting a lot of (for compilation) unnecessary code loaded and executed (like distribution, inet config, etc). erlc now also calls erl with -boot start_clean (so that SASL is not started even if start_sasl is default boot script).

    diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/notes.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/notes.xml 2009-06-05 13:53:34.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/notes.xml 2009-11-20 13:31:55.000000000 +0000 @@ -26,9 +26,167 @@ + notes.xml

    This document describes the changes made to the Kernel application.

    +
    Kernel 2.13.4 + +
    Fixed Bugs and Malfunctions + + +

    A link in pg2(3) has been fixed. (Thanks to + Christophe Romain.)

    +

    + Own Id: OTP-8198

    +
    + +

    + A ticker process could potentially be blocked + indefinitely trying to send a tick to a node not + responding. If this happened, the connection would not be + brought down as it should.

    +

    + Own Id: OTP-8218

    +
    + +

    A bug in pg2 when members who died did not + leave process groups has been fixed. (Thanks to Matthew + Dempsky.)

    +

    + Own Id: OTP-8259

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    + +

    + The top directory in archive files does not need to have + a -vsn suffix anymore. For example if the archive + file has the name like mnesia-4.4.7.ez the top + directory in the archive can either be named + mnesia or mnesia-4.4.7. If the archive file + has a name like mnesia.ez the top directory in the + archive must be named mnesia as earlier.

    +

    + Own Id: OTP-8266

    +
    + +

    The -on_load() directive can be used to run a function + when a module is loaded. It is documented in the section + about code loading in the Reference Manual.

    +

    + Own Id: OTP-8295

    +
    +
    +
    + +
    + +
    Kernel 2.13.3 + +
    Improvements and New Features + + +

    The DNS resolver client inet_res has been rewritten, + documented and released. See inet_res(3) and Erts User's + Guide: Inet configuration.

    It can formally not be + incompatible with respect to earlier versions since there + was no earlier official version. However it was used + before and some details have changed.

    + Configuration now initializes from /etc/resolv.conf and + /etc/hosts on all unix platforms regardless of which + distribution mode the node is started in. The directory + (/etc) these files are supposed to reside in can be + changed via an environment variable. These configuration + file locations can also be changed in the inet + configuration. The files are monitored for change and + re-read, which makes a few resolver configuration + variables out of application control. The /etc/hosts + entries have now their own cache table that is shadowed + (with lookup method 'file' is used) by the application + configured host entries. This problem (that inet_res + configuration only worked for distribution mode long + names) was among other reported by Matthew O'Gorman many + moons ago.

    The lookup methods are still 'native' + only per default. Resolver configuration is done on all + Unix platforms just to get a usable configuration for + direct calls to inet_res.

    The functions + inet_res:nslookup/3..5 and + inet_res:nnslookup/4..4 are no longer recommended + to use, instead use inet_res:lookup/3..5 and + inet_res:resolve/3..5 which provide clearer + argument types and the possibility to override options in + the call.

    Users of previous unsupported versions + of inet_res have included internal header files to get to + the internal record definitions in order to examine DNS + replies. This is still unsupported and there are access + functions in inet_dns to use instead. These are + documented in inet_res(3).

    Bug fix: a compression + reference loop would make DNS message decoding loop + forever. Problem reported by Florian Weimer.

    Bug + fix and patch suggestion by Sergei Golovan: configuring + IPv6 nameservers did not work. His patch (as he warned) + created many UDP sockets; one per nameserver. This has + been fixed in the released version.

    Improvement: + inet_res is now EDNS0 capable. The current + implementation is simple and does not probe and cache + EDNS info for nameservers, which a fully capable + implementation probably should do. EDNS has to be enabled + via resolver configuration, and if a nameserver replies + that it does not support EDNS, inet_res falls back + to a regular DNS query.

    Improvement: now + inet_res automatically falls back to TCP if it + gets a truncated answer from a nameserver.

    + Warning: some of the ancient and exotic record types + handled by inet_res and inet_dns are not + supported by current versions of BIND, so they could not + be tested after the rewrite, with reasonable effort, e.g + MD, MF, NULL, and SPF. The risk for bugs in these + particular records is still low since their code is + mostly shared with other tested record types.

    +

    + *** POTENTIAL INCOMPATIBILITY ***

    +

    + Own Id: OTP-7955 Aux Id: OTP-7107 OTP-6852

    +
    + +

    + A TCP socket with option {packet,4} could crash + the emulator if it received a packet header with a very + large size value (>2Gb). The same bug caused + erlang:decode_packet/3 to return faulty values. + (Thanks to Georgos Seganos.)

    +

    + Own Id: OTP-8102

    +
    + +

    + The file module has now a read_line/1 function similar to + the io:get_line/2, but with byte oriented semantics. The + function file:read_line/1 works for raw files as well, + but for good performance it is recommended to use it + together with the 'read_ahead' option for raw file + access.

    +

    + Own Id: OTP-8108

    +
    +
    +
    + +
    +
    Kernel 2.13.2
    Fixed Bugs and Malfunctions @@ -494,7 +652,7 @@

    - crypto and zlib drivers improved to allow concurent smp + crypto and zlib drivers improved to allow concurrent smp access.

    Own Id: OTP-7262

    @@ -883,7 +1041,7 @@

    The kernel parameter dist_auto_connect once could fail to - block a node if massive parallell sends were issued + block a node if massive parallel sends were issued during a transient failure of network communication

    Own Id: OTP-6893 Aux Id: seq10753

    @@ -963,7 +1121,7 @@

    Own Id: OTP-6615

    -

    Corrected cancelation of timers in three places in the +

    Corrected cancellation of timers in three places in the inet_res module. (Problem found by Dialyzer.)

    Own Id: OTP-6676

    @@ -1230,7 +1388,7 @@

    Behavior in case of disappeared nodes when using he dist_auto_connect once got changed in R11B-1. The - timeouts regarding normal distributed operationes is now + timeouts regarding normal distributed operations is now reverted to the old (pre R11B-1).

    Own Id: OTP-6258 Aux Id: OTP-6200, seq10449

    @@ -1380,17 +1538,17 @@ to fail which previously did not. For example, the following code might hang:

    -\011 Mon = erlang:monitor(process, Pid), -\011 %% ... -\011 exit(Pid, bang), -\011 erlang:demonitor(Mon), -\011 receive -\011 {'DOWN', Mon, process, Pid, _} -> ok -\011 %% We were previously guaranteed to get a down message -\011 %% (since we exited the process ourself), so we could -\011 %% in this case leave out: -\011 %% after 0 -> ok -\011 end, + Mon = erlang:monitor(process, Pid), + %% ... + exit(Pid, bang), + erlang:demonitor(Mon), + receive + {'DOWN', Mon, process, Pid, _} -> ok + %% We were previously guaranteed to get a down message + %% (since we exited the process ourself), so we could + %% in this case leave out: + %% after 0 -> ok + end,

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-5772

    @@ -1859,7 +2017,7 @@ badarg if a process is already registered. As it turns out there is no check in global if a process is registered under more than one name. If some process is - accidently or by design given several names, it is + accidentaly or by design given several names, it is possible that the name registry becomes inconsistent due to the way the resolve function is called when name clashes are discovered (see register_name/3 in @@ -1963,7 +2121,7 @@ compatibility in STDLIB 1.13.1. The flag to be used for this is now called async_shell_start and has been documented. New shells started from the JCL menu are - not syncronized with init anymore. This makes it + not synchronized with init anymore. This makes it possible to start a new shell (e.g. for debugging purposes) even if the initial shell has not come up.

    Own Id: OTP-5406 Aux Id: OTP-5218

    @@ -2085,7 +2243,7 @@ gives you a remote initial shell instead of a local one. Example:

    -\011    erl -sname this_node -rsh other_node@other_host
    +            erl -sname this_node -rsh other_node@other_host
               

    Own Id: OTP-5210

    diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/os.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/os.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/os.xml 2009-06-05 13:53:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/os.xml 2009-11-20 13:30:04.000000000 +0000 @@ -84,7 +84,7 @@ getenv() -> [string()] List all environment variables -

    Returns a list of all environement variables. +

    Returns a list of all environment variables. Each environment variable is given as a single string on the format "VarName=Value", where VarName is the name of the variable and Value its value.

    @@ -140,9 +140,9 @@ MegaSecs = Secs = MicroSecs = int() -

    Returns a tuple in the same format as erlang:now/0. The difference is that this function returns what the operating system thinks (a.k.a. the wall clock time) without any attemts at time correction. The result of two different calls to this function is not guaranteed to be different.

    +

    Returns a tuple in the same format as erlang:now/0. The difference is that this function returns what the operating system thinks (a.k.a. the wall clock time) without any attempts at time correction. The result of two different calls to this function is not guaranteed to be different.

    The most obvious use for this function is logging. The tuple can be used together with the function calendar:now_to_universal_time/1 -or calendar:now_to_local_time/1 to get calendar time. Using the calendar time together with the MicroSecs part of the return tuple from this function allows you to log timestams in high resolution and consistent with the time in the rest of the operating system.

    +or calendar:now_to_local_time/1 to get calendar time. Using the calendar time together with the MicroSecs part of the return tuple from this function allows you to log timestamps in high resolution and consistent with the time in the rest of the operating system.

    Example of code formatting a string in the format "DD Mon YYYY HH:MM:SS.mmmmmm", where DD is the day of month, Mon is the textual month name, YYYY is the year, HH:MM:SS is the time and mmmmmm is the microseconds in six positions:

    -module(print_time). diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/part_notes.xml 2007-11-26 19:00:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/part_notes.xml 2009-11-20 13:31:58.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Kernel Release Notes @@ -36,6 +34,6 @@

    For information about older versions, see Release Notes History.

    - + diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/pg2.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/pg2.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/pg2.xml 2009-03-12 12:19:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/pg2.xml 2009-11-20 13:30:16.000000000 +0000 @@ -43,7 +43,7 @@

    A group of processes can be accessed by a common name. For example, if there is a group named foobar, there can be a set of processes (which can be located on different nodes) which - are all members of the group foobar. There is no special + are all members of the group foobar. There are no special functions for sending a message to the group. Instead, client functions should be written with the functions get_members/1 and get_local_members/1 to find out @@ -193,7 +193,7 @@

    See Also

    kernel(6), - pg(3)

    + pg(3)

    diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/ref_man.xml 2009-03-12 12:18:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/ref_man.xml 2009-11-20 13:29:48.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19962009 @@ -32,37 +32,38 @@ the Erlang runtime system itself: file servers and code servers and so on.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/rpc.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/rpc.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/rpc.xml 2009-03-12 12:18:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/rpc.xml 2009-11-20 13:29:48.000000000 +0000 @@ -118,7 +118,7 @@ async_call(Node, Module, Function, Args) -> Key - Evaluate a function call on a node, asynchrous version + Evaluate a function call on a node, asynchronous version Node = node() Module = Function = atom() @@ -465,7 +465,7 @@

    Evaluates apply(Module, Function, [Elem|ExtraArgs]), - for every element Elem in List1, in parallell. + for every element Elem in List1, in parallel. Returns the list of return values, in the same order as in List1.

    diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/seq_trace.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/seq_trace.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/seq_trace.xml 2009-03-12 12:19:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/seq_trace.xml 2009-11-20 13:30:36.000000000 +0000 @@ -430,9 +430,9 @@ seq_trace:set_token('receive',true), seq_trace:set_token(print,true), seq_trace:print(17,"**** Trace Started ****"), -\011 call_server ! {self(),the_message}; -\011{ack,Ack} -> -\011 ok + call_server ! {self(),the_message}; + {ack,Ack} -> + ok end, loop(Port).

    And a registered process call_server with @@ -441,9 +441,9 @@ loop() -> receive {PortController,Message} -> -\011 Ack = {received, Message}, -\011 seq_trace:print(17,"We are here now"), -\011 PortController ! {ack,Ack} + Ack = {received, Message}, + seq_trace:print(17,"We are here now"), + PortController ! {ack,Ack} end, loop().

    A possible output from the system's sequential_tracer (inspired diff -Nru erlang-13.b.1-dfsg/lib/kernel/doc/src/wrap_log_reader.xml erlang-13.b.3-dfsg/lib/kernel/doc/src/wrap_log_reader.xml --- erlang-13.b.1-dfsg/lib/kernel/doc/src/wrap_log_reader.xml 2007-11-26 18:57:46.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/doc/src/wrap_log_reader.xml 2009-11-20 13:30:43.000000000 +0000 @@ -4,23 +4,21 @@

    - 1998 - 2007 - Ericsson AB, All Rights Reserved + 19982009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + wrap_log_reader @@ -129,7 +127,7 @@

    Filename specifies the name of the file which is to be read.

    N specifies the index of the file which is to be read. If N is omitted the whole wrap log file will be read; if it - is specified only the specified index file will be read.\011 + is specified only the specified index file will be read.

    The open function returns {ok, Continuation} if the log/index file was successfully opened. The Continuation diff -Nru erlang-13.b.1-dfsg/lib/kernel/include/file.hrl erlang-13.b.3-dfsg/lib/kernel/include/file.hrl --- erlang-13.b.1-dfsg/lib/kernel/include/file.hrl 2009-03-12 12:18:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/include/file.hrl 2009-09-18 15:07:36.000000000 +0100 @@ -61,8 +61,8 @@ -record(file_descriptor, - {module :: atom(), % Module that handles this kind of file - data :: any()}). % Module dependent data + {module :: module(), % Module that handles this kind of file + data :: term()}). % Module dependent data -type fd() :: pid() | #file_descriptor{}. diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/application_controller.erl erlang-13.b.3-dfsg/lib/kernel/src/application_controller.erl --- erlang-13.b.1-dfsg/lib/kernel/src/application_controller.erl 2009-03-12 12:17:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/application_controller.erl 2009-11-20 13:29:29.000000000 +0000 @@ -622,8 +622,8 @@ end; handle_call({unload_application, AppName}, _From, S) -> - case keysearch(AppName, 1, S#state.running) of - {value, _} -> {reply, {error, {running, AppName}}, S}; + case lists:keymember(AppName, 1, S#state.running) of + true -> {reply, {error, {running, AppName}}, S}; false -> case get_loaded(AppName) of {true, _} -> @@ -635,8 +635,6 @@ end end; - - handle_call({start_application, AppName, RestartType}, From, S) -> #state{running = Running, starting = Starting, start_p_false = SPF, started = Started, start_req = Start_req} = S, @@ -682,7 +680,6 @@ end; - handle_call({permit_application, AppName, Bool}, From, S) -> Control = S#state.control, Starting = S#state.starting, @@ -696,11 +693,11 @@ IsStarted = lists:keysearch(AppName, 1, Started), IsRunning = lists:keysearch(AppName, 1, Running), - case keysearch(AppName, 1, Control) of + case lists:keymember(AppName, 1, Control) of %%======================== %% distributed application %%======================== - {value, _} -> + true -> case {IsLoaded, IsStarting, IsStarted} of %% not loaded {false, _, _} -> @@ -786,10 +783,6 @@ end end; - - - - handle_call({stop_application, AppName}, _From, S) -> #state{running = Running, started = Started} = S, case keysearch(AppName, 1, Running) of @@ -801,8 +794,8 @@ cntrl(AppName, S, {ac_application_stopped, AppName}), {reply, ok, S#state{running = NRunning, started = NStarted}}; false -> - case keysearch(AppName, 1, Started) of - {value, _} -> + case lists:keymember(AppName, 1, Started) of + true -> NStarted = keydelete(AppName, 1, Started), cntrl(AppName, S, {ac_application_stopped, AppName}), {reply, ok, S#state{started = NStarted}}; @@ -832,19 +825,15 @@ {reply, ok, S#state{conf_data = Config}} end; - handle_call(prep_config_change, _From, S) -> RunningApps = S#state.running, EnvBefore = lists:reverse(do_prep_config_change(RunningApps)), {reply, EnvBefore, S}; - handle_call({config_change, EnvBefore}, _From, S) -> RunningApps = S#state.running, R = do_config_change(RunningApps, EnvBefore), {reply, R, S}; - - handle_call(which_applications, _From, S) -> Reply = zf(fun({Name, Id}) -> @@ -869,11 +858,11 @@ handle_call({control_application, AppName}, {Pid, _Tag}, S) -> Control = S#state.control, - case keysearch(AppName, 1, Control) of + case lists:keymember(AppName, 1, Control) of false -> link(Pid), {reply, true, S#state{control = [{AppName, Pid} | Control]}}; - {value, _} -> + true -> {reply, false, S} end; @@ -1268,22 +1257,22 @@ end end, S, IncApps). - check_start_cond(AppName, RestartType, Started, Running) -> validRestartType(RestartType), case get_loaded(AppName) of {true, Appl} -> %% Check Running; not Started. An exited app is not running, %% but started. It must be possible to start an exited app! - case keysearch(AppName, 1, Running) of - {value, _} -> + case lists:keymember(AppName, 1, Running) of + true -> {error, {already_started, AppName}}; - _ -> + false -> foreach( fun(AppName2) -> - case keysearch(AppName2, 1, Started) of - {value, _} -> ok; - _ -> throw({error, {not_started, AppName2}}) + case lists:keymember(AppName2, 1, Started) of + true -> ok; + false -> + throw({error, {not_started, AppName2}}) end end, Appl#appl.apps), {ok, Appl} @@ -1292,7 +1281,6 @@ {error, {not_loaded, AppName}} end. - do_start(AppName, RT, Type, From, S) -> RestartType = case keysearch(AppName, 1, S#state.started) of {value, {_AppName2, OldRT}} -> @@ -1302,7 +1290,7 @@ end, %% UW 990913: We check start_req instead of starting, because starting %% has already been checked. - case keysearch(AppName, 1, S#state.start_req) of + case lists:keymember(AppName, 1, S#state.start_req) of false -> {true, Appl} = get_loaded(AppName), Start_req = S#state.start_req, @@ -1317,7 +1305,7 @@ end, S#state{starting = Starting, start_req = [{AppName, From} | Start_req]}; - {value, _} -> % otherwise we're already starting the app... + true -> % otherwise we're already starting the app... S end. @@ -1344,10 +1332,10 @@ Running = S#state.running, foreach( fun(AppName) -> - case keysearch(AppName, 1, Running) of - {value, _} -> + case lists:keymember(AppName, 1, Running) of + true -> ok; - _ -> + false -> throw({info, {not_running, AppName}}) end end, Appl#appl.apps), @@ -1387,9 +1375,9 @@ keyreplaceadd(Key, Pos, List, New) -> %% Maintains the order! - case keysearch(Key, Pos, List) of - {value, _} -> keyreplace(Key, Pos, List, New); - _ -> [New | List] + case lists:keymember(Key, Pos, List) of + true -> keyreplace(Key, Pos, List, New); + false -> [New | List] end. validRestartType(permanent) -> true; diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/application.erl erlang-13.b.3-dfsg/lib/kernel/src/application.erl --- erlang-13.b.1-dfsg/lib/kernel/src/application.erl 2009-03-12 12:18:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/application.erl 2009-11-20 13:29:41.000000000 +0000 @@ -62,13 +62,13 @@ %%%----------------------------------------------------------------- -spec load(Application :: atom() | application_spec()) -> - 'ok' | {'error', any()}. + 'ok' | {'error', term()}. load(Application) -> load(Application, []). -spec load(Application :: atom() | application_spec(), - Distributed :: any()) -> 'ok' | {'error', any()}. + Distributed :: any()) -> 'ok' | {'error', term()}. load(Application, DistNodes) -> case application_controller:load_application(Application) of @@ -85,12 +85,12 @@ Else end. --spec unload(Application :: atom()) -> 'ok' | {'error', any()}. +-spec unload(Application :: atom()) -> 'ok' | {'error', term()}. unload(Application) -> application_controller:unload_application(Application). --spec start(Application :: atom()) -> 'ok' | {'error', any()}. +-spec start(Application :: atom()) -> 'ok' | {'error', term()}. start(Application) -> start(Application, temporary). @@ -109,13 +109,13 @@ Error end. --spec start_boot(Application :: atom()) -> 'ok' | {'error', any()}. +-spec start_boot(Application :: atom()) -> 'ok' | {'error', term()}. start_boot(Application) -> start_boot(Application, temporary). -spec start_boot(Application :: atom(), RestartType :: restart_type()) -> - 'ok' | {'error', any()}. + 'ok' | {'error', term()}. start_boot(Application, RestartType) -> application_controller:start_boot_application(Application, RestartType). @@ -125,7 +125,7 @@ takeover(Application, RestartType) -> dist_ac:takeover_application(Application, RestartType). --spec permit(Application :: atom(), Bool :: bool()) -> 'ok' | {'error', any()}. +-spec permit(Application :: atom(), Bool :: boolean()) -> 'ok' | {'error', term()}. permit(Application, Bool) -> case Bool of @@ -142,7 +142,7 @@ LocalResult end. --spec stop(Application :: atom()) -> 'ok' | {'error', any()}. +-spec stop(Application :: atom()) -> 'ok' | {'error', term()}. stop(Application) -> application_controller:stop_application(Application). @@ -194,12 +194,12 @@ unset_env(Application, Key, Timeout) when is_integer(Timeout), Timeout>=0 -> application_controller:unset_env(Application, Key, Timeout). --spec get_env(atom()) -> 'undefined' | {'ok', any()}. +-spec get_env(atom()) -> 'undefined' | {'ok', term()}. get_env(Key) -> application_controller:get_pid_env(group_leader(), Key). --spec get_env(atom(), atom()) -> 'undefined' | {'ok', any()}. +-spec get_env(atom(), atom()) -> 'undefined' | {'ok', term()}. get_env(Application, Key) -> application_controller:get_env(Application, Key). @@ -209,17 +209,17 @@ get_all_env() -> application_controller:get_pid_all_env(group_leader()). --spec get_all_env(atom()) -> [] | [{atom(),any()}]. +-spec get_all_env(atom()) -> [] | [{atom(), any()}]. get_all_env(Application) -> application_controller:get_all_env(Application). --spec get_key(atom()) -> 'undefined' | {'ok', any()}. +-spec get_key(atom()) -> 'undefined' | {'ok', term()}. get_key(Key) -> application_controller:get_pid_key(group_leader(), Key). --spec get_key(atom(), atom()) -> 'undefined' | {'ok', any()}. +-spec get_key(atom(), atom()) -> 'undefined' | {'ok', term()}. get_key(Application, Key) -> application_controller:get_key(Application, Key). @@ -229,7 +229,7 @@ get_all_key() -> application_controller:get_pid_all_key(group_leader()). --spec get_all_key(atom()) -> 'undefined' | [] | {'ok', [{atom(),any()}]}. +-spec get_all_key(atom()) -> 'undefined' | {'ok', [{atom(),any()},...]}. get_all_key(Application) -> application_controller:get_all_key(Application). diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/code.erl erlang-13.b.3-dfsg/lib/kernel/src/code.erl --- erlang-13.b.1-dfsg/lib/kernel/src/code.erl 2009-03-12 12:17:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/code.erl 2009-09-18 15:06:56.000000000 +0100 @@ -112,13 +112,13 @@ | 'sticky_directory'. % for some functions only -type load_ret() :: {'error', load_error_rsn()} | {'module', atom()}. -type loaded_ret_atoms() :: 'cover_compiled' | 'preloaded'. --type loaded_filename() :: string() | loaded_ret_atoms(). +-type loaded_filename() :: file:filename() | loaded_ret_atoms(). %%---------------------------------------------------------------------------- %% User interface %%---------------------------------------------------------------------------- --spec objfile_extension() -> string(). +-spec objfile_extension() -> file:filename(). objfile_extension() -> init:objfile_extension(). @@ -131,7 +131,7 @@ call({ensure_loaded,Mod}). %% XXX File as an atom is allowed only for backwards compatibility. --spec load_abs(Filename :: string()) -> load_ret(). +-spec load_abs(Filename :: file:filename()) -> load_ret(). load_abs(File) when is_list(File); is_atom(File) -> call({load_abs,File,[]}). %% XXX Filename is also an atom(), e.g. 'cover_compiled' @@ -155,51 +155,51 @@ (is_binary(WholeModule) orelse WholeModule =:= false) -> call({load_native_sticky,Mod,Bin,WholeModule}). --spec delete(Module :: atom()) -> bool(). +-spec delete(Module :: atom()) -> boolean(). delete(Mod) when is_atom(Mod) -> call({delete,Mod}). --spec purge/1 :: (Module :: atom()) -> bool(). +-spec purge/1 :: (Module :: atom()) -> boolean(). purge(Mod) when is_atom(Mod) -> call({purge,Mod}). --spec soft_purge(Module :: atom()) -> bool(). +-spec soft_purge(Module :: atom()) -> boolean(). soft_purge(Mod) when is_atom(Mod) -> call({soft_purge,Mod}). --spec is_loaded(Module :: atom()) -> {'file', string() | loaded_ret_atoms()} | 'false'. +-spec is_loaded(Module :: atom()) -> {'file', loaded_filename()} | 'false'. is_loaded(Mod) when is_atom(Mod) -> call({is_loaded,Mod}). --spec get_object_code(Module :: atom()) -> {atom(), binary(), string()} | 'error'. +-spec get_object_code(Module :: atom()) -> {atom(), binary(), file:filename()} | 'error'. get_object_code(Mod) when is_atom(Mod) -> call({get_object_code, Mod}). --spec all_loaded() -> [{atom(), string() | loaded_ret_atoms()}]. +-spec all_loaded() -> [{atom(), loaded_filename()}]. all_loaded() -> call(all_loaded). -spec stop() -> no_return(). stop() -> call(stop). --spec root_dir() -> string(). +-spec root_dir() -> file:filename(). root_dir() -> call({dir,root_dir}). --spec lib_dir() -> string(). +-spec lib_dir() -> file:filename(). lib_dir() -> call({dir,lib_dir}). %% XXX is_list() is for backwards compatibility -- take out in future version --spec lib_dir(App :: atom()) -> string() | {'error', 'bad_name'}. +-spec lib_dir(App :: atom()) -> file:filename() | {'error', 'bad_name'}. lib_dir(App) when is_atom(App) ; is_list(App) -> call({dir,{lib_dir,App}}). --spec lib_dir(App :: atom(), SubDir :: atom()) -> string() | {'error', 'bad_name'}. +-spec lib_dir(App :: atom(), SubDir :: atom()) -> file:filename() | {'error', 'bad_name'}. lib_dir(App, SubDir) when is_atom(App), is_atom(SubDir) -> call({dir,{lib_dir,App,SubDir}}). --spec compiler_dir() -> string(). +-spec compiler_dir() -> file:filename(). compiler_dir() -> call({dir,compiler_dir}). %% XXX is_list() is for backwards compatibility -- take out in future version --spec priv_dir(Appl :: atom()) -> string() | {'error', 'bad_name'}. +-spec priv_dir(Appl :: atom()) -> file:filename() | {'error', 'bad_name'}. priv_dir(App) when is_atom(App) ; is_list(App) -> call({dir,{priv_dir,App}}). --spec stick_dir(Directory :: string()) -> 'ok' | 'error'. +-spec stick_dir(Directory :: file:filename()) -> 'ok' | 'error'. stick_dir(Dir) when is_list(Dir) -> call({stick_dir,Dir}). --spec unstick_dir(Directory :: string()) -> 'ok' | 'error'. +-spec unstick_dir(Directory :: file:filename()) -> 'ok' | 'error'. unstick_dir(Dir) when is_list(Dir) -> call({unstick_dir,Dir}). -spec stick_mod(Module :: atom()) -> 'true'. @@ -208,39 +208,39 @@ -spec unstick_mod(Module :: atom()) -> 'true'. unstick_mod(Mod) when is_atom(Mod) -> call({unstick_mod,Mod}). --spec is_sticky(Module :: atom()) -> bool(). +-spec is_sticky(Module :: atom()) -> boolean(). is_sticky(Mod) when is_atom(Mod) -> call({is_sticky,Mod}). --spec set_path(Directories :: [string()]) -> 'true' | {'error', any()}. +-spec set_path(Directories :: [file:filename()]) -> 'true' | {'error', term()}. set_path(PathList) when is_list(PathList) -> call({set_path,PathList}). --spec get_path() -> [string()]. +-spec get_path() -> [file:filename()]. get_path() -> call(get_path). --spec add_path(Directory :: string()) -> 'true' | {'error', any()}. +-spec add_path(Directory :: file:filename()) -> 'true' | {'error', term()}. add_path(Dir) when is_list(Dir) -> call({add_path,last,Dir}). --spec add_pathz(Directory :: string()) -> 'true' | {'error', any()}. +-spec add_pathz(Directory :: file:filename()) -> 'true' | {'error', term()}. add_pathz(Dir) when is_list(Dir) -> call({add_path,last,Dir}). --spec add_patha(Directory :: string()) -> 'true' | {'error', any()}. +-spec add_patha(Directory :: file:filename()) -> 'true' | {'error', term()}. add_patha(Dir) when is_list(Dir) -> call({add_path,first,Dir}). --spec add_paths(Directories :: [string()]) -> 'ok'. +-spec add_paths(Directories :: [file:filename()]) -> 'ok'. add_paths(Dirs) when is_list(Dirs) -> call({add_paths,last,Dirs}). --spec add_pathsz(Directories :: [string()]) -> 'ok'. +-spec add_pathsz(Directories :: [file:filename()]) -> 'ok'. add_pathsz(Dirs) when is_list(Dirs) -> call({add_paths,last,Dirs}). --spec add_pathsa(Directories :: [string()]) -> 'ok'. +-spec add_pathsa(Directories :: [file:filename()]) -> 'ok'. add_pathsa(Dirs) when is_list(Dirs) -> call({add_paths,first,Dirs}). %% XXX Contract's input argument differs from add_path/1 -- why? --spec del_path(Name :: string() | atom()) -> bool() | {'error', 'bad_name'}. +-spec del_path(Name :: file:filename() | atom()) -> boolean() | {'error', 'bad_name'}. del_path(Name) when is_list(Name) ; is_atom(Name) -> call({del_path,Name}). -type replace_path_error() :: {'error', 'bad_directory' | 'bad_name' | {'badarg',_}}. --spec replace_path(Name:: atom(), Dir :: string()) -> 'true' | replace_path_error(). +-spec replace_path(Name:: atom(), Dir :: file:filename()) -> 'true' | replace_path_error(). replace_path(Name, Dir) when (is_atom(Name) or is_list(Name)) and (is_atom(Dir) or is_list(Dir)) -> call({replace_path,Name,Dir}). @@ -292,17 +292,17 @@ {ok,[[Root0]]} -> Root = filename:join([Root0]), % Normalize. Use filename case code_server:start_link([Root,Mode]) of - {ok,Pid} -> + {ok,_Pid} = Ok2 -> if Mode =:= interactive -> - case lists:member(stick,Flags) of + case lists:member(stick, Flags) of true -> do_stick_dirs(); _ -> ok end; true -> ok end, - {ok,Pid}; + Ok2; Other -> Other end; @@ -350,7 +350,7 @@ -type which_ret_atoms() :: loaded_ret_atoms() | 'non_existing'. --spec which(Module :: atom()) -> string() | which_ret_atoms(). +-spec which(Module :: atom()) -> file:filename() | which_ret_atoms(). which(Module) when is_atom(Module) -> case is_loaded(Module) of @@ -366,7 +366,8 @@ Path = get_path(), which(File, filename:dirname(Base), Path). --spec which(string(), string(), [string()]) -> 'non_existing' | string(). +-spec which(file:filename(), file:filename(), [file:filename()]) -> + 'non_existing' | file:filename(). which(_, _, []) -> non_existing; @@ -390,7 +391,8 @@ %% Search the code path for a specific file. Try to locate %% it in the code path cache if possible. --spec where_is_file(Filename :: string()) -> 'non_existing' | string(). +-spec where_is_file(Filename :: file:filename()) -> + 'non_existing' | file:filename(). where_is_file(File) when is_list(File) -> case call({is_cached,File}) of @@ -401,7 +403,8 @@ filename:join(Dir, File) end. --spec where_is_file(Path :: string(), Filename :: string()) -> string() | atom(). +-spec where_is_file(Path :: file:filename(), Filename :: file:filename()) -> + file:filename() | 'non_existing'. where_is_file(Path, File) when is_list(Path), is_list(File) -> CodePath = get_path(), @@ -417,7 +420,7 @@ which(File, ".", Path) end. --spec set_primary_archive(ArchiveFile :: string(), ArchiveBin :: binary()) -> 'ok' | {'error', atom()}. +-spec set_primary_archive(ArchiveFile :: file:filename(), ArchiveBin :: binary()) -> 'ok' | {'error', atom()}. set_primary_archive(ArchiveFile0, ArchiveBin) when is_list(ArchiveFile0), is_binary(ArchiveBin) -> ArchiveFile = filename:absname(ArchiveFile0), @@ -428,8 +431,8 @@ %% Prepend the code path with the ebins found in the archive Ebins2 = [filename:join([ArchiveFile, E]) || E <- Ebins], add_pathsa(Ebins2); % Returns ok - {error, Reason} -> - {error, Reason} + {error, _Reason} = Error -> + Error end. %% Search the entire path system looking for name clashes @@ -445,14 +448,14 @@ %% Internal for clash/0 search([]) -> []; -search([{Dir,File} | Tail]) -> - case lists:keysearch(File,2,Tail) of +search([{Dir, File} | Tail]) -> + case lists:keyfind(File, 2, Tail) of false -> search(Tail); - {value,{Dir2,File}} -> + {Dir2, File} -> io:format("** ~s hides ~s~n", - [filename:join(Dir,File), - filename:join(Dir2,File)]), + [filename:join(Dir, File), + filename:join(Dir2, File)]), [clash | search(Tail)] end. diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/code_server.erl erlang-13.b.3-dfsg/lib/kernel/src/code_server.erl --- erlang-13.b.1-dfsg/lib/kernel/src/code_server.erl 2009-03-12 12:19:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/code_server.erl 2009-11-20 13:30:32.000000000 +0000 @@ -38,7 +38,8 @@ moddb, namedb, cache = no_cache, - mode=interactive}). + mode=interactive, + on_load = []}). start_link(Args) -> Ref = make_ref(), @@ -158,10 +159,13 @@ system_terminate(Reason, Supervisor, [], State0); {system, From, Msg} -> handle_system_msg(running,Msg, From, Supervisor, State0); + {'DOWN',Ref,process,_,Res} -> + State = finish_on_load(Ref, Res, State0), + loop(State); _Msg -> loop(State0) end. - + %%%%%%%%%%%%%%%%%%%%%%%%%%% %% System upgrade @@ -241,13 +245,12 @@ Resp = do_dir(Root,Dir,S#state.namedb), {reply,Resp,S}; -handle_call({load_file,Mod},{_From,_Tag}, S) -> +handle_call({load_file,Mod}, Caller, St) -> case modp(Mod) of false -> - {reply,{error, badarg},S}; + {reply,{error,badarg},St}; true -> - {St,Status} = load_file(Mod, S), - {reply,Status,St} + load_file(Mod, Caller, St) end; handle_call({add_path,Where,Dir0}, {_From,_Tag}, S=#state{cache=Cache0}) -> @@ -296,18 +299,16 @@ {reply,S#state.path,S}; %% Messages to load, delete and purge modules/files. -handle_call({load_abs,File,Mod}, {_From,_Tag}, S) -> +handle_call({load_abs,File,Mod}, Caller, S) -> case modp(File) of false -> {reply,{error,badarg},S}; true -> - Status = load_abs(File,Mod,S#state.moddb), - {reply,Status,S} + load_abs(File, Mod, Caller, S) end; -handle_call({load_binary,Mod,File,Bin}, {_From,_Tag}, S) -> - Status = do_load_binary(Mod,File,Bin,S#state.moddb), - {reply,Status,S}; +handle_call({load_binary,Mod,File,Bin}, Caller, S) -> + do_load_binary(Mod, File, Bin, Caller, S); handle_call({load_native_partial,Mod,Bin}, {_From,_Tag}, S) -> Result = (catch hipe_unified_loader:load(Mod,Bin)), @@ -319,15 +320,15 @@ Status = hipe_result_to_status(Result), {reply,Status,S}; -handle_call({ensure_loaded,Mod0}, {_From,_Tag}, St0) -> +handle_call({ensure_loaded,Mod0}, Caller, St0) -> Fun = fun (M, St) -> case erlang:module_loaded(M) of true -> - {St, {module,M}}; + {reply,{module,M},St}; false when St#state.mode =:= interactive -> - load_file(M, St); + load_file(M, Caller, St); false -> - {St, {error,embedded}} + {reply,{error,embedded},St} end end, do_mod_call(Fun, Mod0, {error,badarg}, St0); @@ -337,21 +338,27 @@ case catch erlang:delete_module(M) of true -> ets:delete(St#state.moddb, M), - {St, true}; + {reply,true,St}; _ -> - {St, false} + {reply,false,St} end end, do_mod_call(Fun, Mod0, false, S); handle_call({purge,Mod0}, {_From,_Tag}, St0) -> - do_mod_call(fun (M, St) -> {St, do_purge(M)} end, Mod0, false, St0); - -handle_call({soft_purge,Mod0},{_From,_Tag}, St0) -> - do_mod_call(fun (M, St) -> {St,do_soft_purge(M)} end, Mod0, true, St0); - -handle_call({is_loaded,Mod0},{_From,_Tag}, St0) -> - do_mod_call(fun (M, St) -> {St, is_loaded(M, St#state.moddb)} end, Mod0, false, St0); + do_mod_call(fun (M, St) -> + {reply,do_purge(M),St} + end, Mod0, false, St0); + +handle_call({soft_purge,Mod0}, {_From,_Tag}, St0) -> + do_mod_call(fun (M, St) -> + {reply,do_soft_purge(M),St} + end, Mod0, true, St0); + +handle_call({is_loaded,Mod0}, {_From,_Tag}, St0) -> + do_mod_call(fun (M, St) -> + {reply,is_loaded(M, St#state.moddb),St} + end, Mod0, false, St0); handle_call(all_loaded, {_From,_Tag}, S) -> Db = S#state.moddb, @@ -361,8 +368,8 @@ Fun = fun(M, St) -> Path = St#state.path, case mod_to_bin(Path, atom_to_list(M)) of - {_,Bin,FName} -> {St,{M,Bin,FName}}; - Error -> {St,Error} + {_,Bin,FName} -> {reply,{M,Bin,FName},St}; + Error -> {reply,Error,St} end end, do_mod_call(Fun, Mod0, error, St0); @@ -409,21 +416,15 @@ error_msg(" ** Codeserver*** ignoring ~w~n ",[Other]), {noreply,S}. -% handle_cast(_,S) -> -% {noreply,S}. -% handle_info(_,S) -> -% {noreply,S}. - -do_mod_call(Action, Module, _Error, St0) when is_atom(Module) -> - {St, Res} = Action(Module, St0), - {reply,Res,St}; -do_mod_call(Action, Module, Error, St0) -> - case catch list_to_atom(Module) of - {'EXIT',_} -> - {reply,Error,St0}; +do_mod_call(Action, Module, _Error, St) when is_atom(Module) -> + Action(Module, St); +do_mod_call(Action, Module, Error, St) -> + try list_to_atom(Module) of Atom when is_atom(Atom) -> - {St, Res} = Action(Atom, St0), - {reply,Res,St} + Action(Atom, St) + catch + error:badarg -> + {reply,Error,St} end. %% -------------------------------------------------------------- @@ -596,27 +597,32 @@ make_path(BundleDir,Tail,[Ebin|Res],[Bundle|Bs]); _ -> %% Second try with archive - case {filename:extension(Dir), archive_extension()} of - {Ext, Ext} -> - Base = filename:basename(Dir, Ext), - Ebin2 = filename:join([Dir, Base, "ebin"]), - %% Add the dir in archive if it exists - case erl_prim_loader:read_file_info(Ebin2) of - {ok,#file_info{type=directory}} -> - make_path(BundleDir,Tail,[Ebin2|Res],[Bundle|Bs]); - _ -> - make_path(BundleDir,Tail,Res,Bs) - end; - _ -> - case erl_prim_loader:read_file_info(Dir) of - {ok,#file_info{type=directory}} -> - make_path(BundleDir,Tail,[Dir|Res],[Bundle|Bs]); - _ -> - make_path(BundleDir,Tail,Res,Bs) - end - end + Ext = archive_extension(), + Base = filename:basename(Dir, Ext), + Ebin2 = filename:join([filename:dirname(Dir), Base ++ Ext, Base, "ebin"]), + Ebins = + case split(Base, "-") of + Toks when length(Toks) > 1 -> + AppName = join(lists:sublist(Toks,length(Toks)-1),"-"), + Ebin3 = filename:join([filename:dirname(Dir), Base ++ Ext, AppName, "ebin"]), + [Ebin3, Ebin2, Dir]; + _ -> + [Ebin2, Dir] + end, + try_ebin_dirs(Ebins,BundleDir,Tail,Res,Bundle, Bs) end. +try_ebin_dirs([Ebin | Ebins],BundleDir,Tail,Res,Bundle,Bs) -> + case erl_prim_loader:read_file_info(Ebin) of + {ok,#file_info{type=directory}} -> + make_path(BundleDir,Tail,[Ebin|Res],[Bundle|Bs]); + _ -> + try_ebin_dirs(Ebins,BundleDir,Tail,Res,Bundle,Bs) + end; +try_ebin_dirs([],BundleDir,Tail,Res,_Bundle,Bs) -> + make_path(BundleDir,Tail,Res,Bs). + + %% %% Add the erl_prim_loader path. %% @@ -752,48 +758,52 @@ do_check_path([], _PathChoice, _ArchiveExt, Acc) -> {ok, lists:reverse(Acc)}; -do_check_path([Dir | Tail], PathChoice = strict, ArchiveExt, Acc) -> - %% Be strict. Use dir as explicitly as stated +do_check_path([Dir | Tail], PathChoice, ArchiveExt, Acc) -> case catch erl_prim_loader:read_file_info(Dir) of {ok, #file_info{type=directory}} -> do_check_path(Tail, PathChoice, ArchiveExt, [Dir | Acc]); - _ -> - {error, bad_directory} - end; -do_check_path([Orig | Tail], PathChoice = relaxed, ArchiveExt, Acc) -> - %% Be relaxed - case catch lists:reverse(filename:split(Orig)) of - {'EXIT', _} -> + _ when PathChoice =:= strict -> + %% Be strict. Only use dir as explicitly stated {error, bad_directory}; - ["ebin", App, OptArchive | RevTop] -> - Ext = filename:extension(OptArchive), - Base = filename:basename(OptArchive, Ext), - if - Ext =:= ArchiveExt, Base =:= App -> - %% Orig archive - Archive = Orig, - Top = lists:reverse(RevTop), - Dir = filename:join(Top ++ [App, "ebin"]); - true -> - %% Orig directory - Dir = Orig, - Top = lists:reverse([OptArchive | RevTop]), - Archive = filename:join(Top ++ [App ++ Ext, App, "ebin"]) - end, - %% First try dir, second try archive and at last use orig if both fails. - case erl_prim_loader:read_file_info(Dir) of - {ok, #file_info{type = directory}} -> - do_check_path(Tail, PathChoice, ArchiveExt, [Dir | Acc]); - _ -> - case erl_prim_loader:read_file_info(Archive) of + _ when PathChoice =:= relaxed -> + %% Be relaxed + case catch lists:reverse(filename:split(Dir)) of + {'EXIT', _} -> + {error, bad_directory}; + ["ebin", App] -> + Dir2 = filename:join([App ++ ArchiveExt, App, "ebin"]), + case erl_prim_loader:read_file_info(Dir2) of {ok, #file_info{type = directory}} -> - do_check_path(Tail, PathChoice, ArchiveExt, [Archive | Acc]); + do_check_path(Tail, PathChoice, ArchiveExt, [Dir2 | Acc]); _ -> - do_check_path(Tail, PathChoice, ArchiveExt, [Orig | Acc]) - end - end; - _ -> - do_check_path(Tail, PathChoice, ArchiveExt, [Orig | Acc]) + {error, bad_directory} + end; + ["ebin", App, OptArchive | RevTop] -> + Ext = filename:extension(OptArchive), + Base = filename:basename(OptArchive, Ext), + Dir2 = + if + Ext =:= ArchiveExt, Base =:= App -> + %% .../app-vsn.ez/app-vsn/ebin + Top = lists:reverse(RevTop), + filename:join(Top ++ [App, "ebin"]); + Ext =:= ArchiveExt -> + %% .../app-vsn.ez/xxx/ebin + {error, bad_directory}; + true -> + %% .../app-vsn/ebin + Top = lists:reverse([OptArchive | RevTop]), + filename:join(Top ++ [App ++ ArchiveExt, App, "ebin"]) + end, + case erl_prim_loader:read_file_info(Dir2) of + {ok, #file_info{type = directory}} -> + do_check_path(Tail, PathChoice, ArchiveExt, [Dir2 | Acc]); + _ -> + {error, bad_directory} + end; + _ -> + {error, bad_directory} + end end. %% @@ -913,8 +923,8 @@ insert_name(Name, Dir, Db) -> AppDir = del_ebin(Dir), - SubDirs = archive_subdirs(AppDir), - ets:insert(Db, {Name, AppDir, SubDirs}), + {Base, SubDirs} = archive_subdirs(AppDir), + ets:insert(Db, {Name, AppDir, Base, SubDirs}), true. archive_subdirs(AppDir) -> @@ -928,13 +938,24 @@ true end end, - ArchiveDirs = all_archive_subdirs(AppDir), - lists:filter(IsDir, ArchiveDirs). + {Base, ArchiveDirs} = all_archive_subdirs(AppDir), + {Base, lists:filter(IsDir, ArchiveDirs)}. all_archive_subdirs(AppDir) -> Ext = archive_extension(), - ArchiveDir = filename:join([AppDir ++ Ext, - filename:basename(AppDir)]), + Base = filename:basename(AppDir), + Dirs = + case split(Base, "-") of + Toks when length(Toks) > 1 -> + Base2 = join(lists:sublist(Toks,length(Toks)-1),"-"), + [Base2, Base]; + _ -> + [Base] + end, + try_archive_subdirs(AppDir ++ Ext, Base, Dirs). + +try_archive_subdirs(Archive, Base, [Dir | Dirs]) -> + ArchiveDir = filename:join([Archive, Dir]), case erl_prim_loader:list_dir(ArchiveDir) of {ok, Files} -> IsDir = @@ -947,10 +968,12 @@ false end end, - lists:filter(IsDir, Files); + {Dir, lists:filter(IsDir, Files)}; _ -> - [] - end. + try_archive_subdirs(Archive, Base, Dirs) + end; +try_archive_subdirs(_Archive, Base, []) -> + {Base, []}. %% %% Delete a directory from Path. @@ -1076,7 +1099,7 @@ Name -> Dir0 = del_ebin(Dir), case lookup_name(Name, Db) of - {ok, Dir0, _SubDirs} -> + {ok, Dir0, _Base, _SubDirs} -> ets:delete(Db, Name), true; _ -> false @@ -1085,7 +1108,7 @@ lookup_name(Name, Db) -> case ets:lookup(Db, Name) of - [{Name, Dir, SubDirs}] -> {ok, Dir, SubDirs}; + [{Name, Dir, Base, SubDirs}] -> {ok, Dir, Base, SubDirs}; _ -> false end. @@ -1099,23 +1122,23 @@ Root; do_dir(_Root,compiler_dir,NameDb) -> case lookup_name("compiler", NameDb) of - {ok, Dir,_SubDirs} -> Dir; + {ok, Dir, _Base, _SubDirs} -> Dir; _ -> "" end; do_dir(_Root,{lib_dir,Name},NameDb) -> case catch lookup_name(to_list(Name), NameDb) of - {ok, Dir, _SubDirs} -> Dir; + {ok, Dir, _Base, _SubDirs} -> Dir; _ -> {error, bad_name} end; do_dir(_Root,{lib_dir,Name,SubDir0},NameDb) -> SubDir = atom_to_list(SubDir0), case catch lookup_name(to_list(Name), NameDb) of - {ok, Dir, SubDirs} -> + {ok, Dir, Base, SubDirs} -> case lists:member(SubDir, SubDirs) of true -> %% Subdir is in archive filename:join([Dir ++ archive_extension(), - filename:basename(Dir), + Base, SubDir]); false -> %% Subdir is regular directory @@ -1181,18 +1204,16 @@ {ok,Path}. -do_load_binary(Module,File,Binary,Db) -> - case {modp(Module),modp(File)} of - {true, true} when is_binary(Binary) -> +do_load_binary(Module, File, Binary, Caller, St) -> + case modp(Module) andalso modp(File) andalso is_binary(Binary) of + true -> case erlang:module_loaded(to_atom(Module)) of - true -> - do_purge(Module); - false -> - ok + true -> do_purge(Module); + false -> ok end, - try_load_module(File, Module, Binary, Db); - _ -> - {error, badarg} + try_load_module(File, Module, Binary, Caller, St); + false -> + {reply,{error,badarg},St} end. modp(Atom) when is_atom(Atom) -> true; @@ -1200,7 +1221,7 @@ modp(_) -> false. -load_abs(File, Mod0, Db) -> +load_abs(File, Mod0, Caller, St) -> Ext = objfile_extension(), FileName0 = lists:concat([File, Ext]), FileName = absname(FileName0), @@ -1211,53 +1232,56 @@ end, case erl_prim_loader:get_file(FileName) of {ok,Bin,_} -> - try_load_module(FileName, Mod, Bin, Db); + try_load_module(FileName, Mod, Bin, Caller, St); error -> - {error,nofile} + {reply,{error,nofile},St} end. -try_load_module(Mod, Dir, Db) -> +try_load_module(Mod, Dir, Caller, St) -> File = filename:append(Dir, to_path(Mod) ++ objfile_extension()), case erl_prim_loader:get_file(File) of error -> - %% No cache case tries with erl_prim_loader here - %% Should the caching code do it?? -% File2 = to_path(Mod) ++ objfile_extension(), -% case erl_prim_loader:get_file(File2) of -% error -> - error; % No more alternatives ! -% {ok,Bin,FName} -> -% try_load_module(absname(FName), Mod, Binary, Db) -% end; + {reply,error,St}; {ok,Binary,FName} -> - try_load_module(absname(FName), Mod, Binary, Db) + try_load_module(absname(FName), Mod, Binary, Caller, St) end. -try_load_module(File, Mod, Bin, Db) -> +try_load_module(File, Mod, Bin, {From,_}=Caller, St0) -> M = to_atom(Mod), + case pending_on_load(M, From, St0) of + no -> + try_load_module_1(File, M, Bin, Caller, St0); + {yes,St} -> + {noreply,St} + end. - case is_sticky(M, Db) of +try_load_module_1(File, Mod, Bin, Caller, #state{moddb=Db}=St) -> + case is_sticky(Mod, Db) of true -> %% Sticky file reject the load error_msg("Can't load module that resides in sticky dir\n",[]), - {error, sticky_directory}; + {reply,{error,sticky_directory},St}; false -> case catch load_native_code(Mod, Bin) of - {module,M} -> - ets:insert(Db, {M,File}), - {module,Mod}; + {module,Mod} -> + ets:insert(Db, {Mod,File}), + {reply,{module,Mod},St}; no_native -> - case erlang:load_module(M, Bin) of - {module,M} -> - ets:insert(Db, {M,File}), + case erlang:load_module(Mod, Bin) of + {module,Mod} -> + ets:insert(Db, {Mod,File}), post_beam_load(Mod), - {module,Mod}; + {reply,{module,Mod},St}; + {error,on_load} -> + handle_on_load(Mod, File, Caller, St); {error,What} -> error_msg("Loading of ~s failed: ~p\n", [File, What]), - {error,What} + {reply,{error,What},St} end; Error -> - error_msg("Native loading of ~s failed: ~p\n", [File, Error]) + error_msg("Native loading of ~s failed: ~p\n", + [File,Error]), + {reply,ok,St} end end. @@ -1288,24 +1312,26 @@ int_list([]) -> true. -load_file(Mod, St=#state{path=Path,moddb=Db,cache=no_cache}) -> +load_file(Mod, Caller, #state{path=Path,cache=no_cache}=St) -> case mod_to_bin(Path, Mod) of - error -> {St, {error,nofile}}; - {Mod,Binary,File} -> {St,try_load_module(File, Mod, Binary, Db)} + error -> + {reply,{error,nofile},St}; + {Mod,Binary,File} -> + try_load_module(File, Mod, Binary, Caller, St) end; -load_file(Mod, St0=#state{moddb=Db,cache=Cache}) -> +load_file(Mod, Caller, #state{cache=Cache}=St0) -> Key = {obj,Mod}, case ets:lookup(Cache, Key) of [] -> St = rehash_cache(St0), case ets:lookup(St#state.cache, Key) of [] -> - {St, {error,nofile}}; + {reply,{error,nofile},St}; [{Key,Dir}] -> - {St, try_load_module(Mod, Dir, Db)} + try_load_module(Mod, Dir, Caller, St) end; [{Key,Dir}] -> - {St0, try_load_module(Mod, Dir, Db)} + try_load_module(Mod, Dir, Caller, St0) end. mod_to_bin([Dir|Tail], Mod) -> @@ -1409,6 +1435,65 @@ end. %% ------------------------------------------------------- +%% The on_load functionality. +%% ------------------------------------------------------- + +handle_on_load(Mod, File, {From,_}, #state{on_load=OnLoad0}=St0) -> + Fun = fun() -> + Res = erlang:call_on_load_function(Mod), + exit(Res) + end, + {_,Ref} = spawn_monitor(Fun), + OnLoad = [{Ref,Mod,File,[From]}|OnLoad0], + St = St0#state{on_load=OnLoad}, + {noreply,St}. + +pending_on_load(_, _, #state{on_load=[]}) -> + no; +pending_on_load(Mod, From, #state{on_load=OnLoad0}=St) -> + case lists:keymember(Mod, 2, OnLoad0) of + false -> + no; + true -> + OnLoad = pending_on_load_1(Mod, From, OnLoad0), + {yes,St#state{on_load=OnLoad}} + end. + +pending_on_load_1(Mod, From, [{Ref,Mod,File,Pids}|T]) -> + [{Ref,Mod,File,[From|Pids]}|T]; +pending_on_load_1(Mod, From, [H|T]) -> + [H|pending_on_load_1(Mod, From, T)]; +pending_on_load_1(_, _, []) -> []. + +finish_on_load(Ref, OnLoadRes, #state{on_load=OnLoad0,moddb=Db}=State) -> + case lists:keyfind(Ref, 1, OnLoad0) of + false -> + %% Since this process in general silently ignores messages + %% it doesn't understand, it should also ignore a 'DOWN' + %% message with an unknown reference. + State; + {Ref,Mod,File,WaitingPids} -> + finish_on_load_1(Mod, File, OnLoadRes, WaitingPids, Db), + OnLoad = [E || {R,_,_,_}=E <- OnLoad0, R =/= Ref], + State#state{on_load=OnLoad} + end. + +finish_on_load_1(Mod, File, OnLoadRes, WaitingPids, Db) -> + Keep = if + is_boolean(OnLoadRes) -> OnLoadRes; + true -> false + end, + erlang:finish_after_on_load(Mod, Keep), + Res = case Keep of + false -> {error,on_load_failure}; + true -> + ets:insert(Db, {Mod,File}), + {module,Mod} + end, + [reply(Pid, Res) || Pid <- WaitingPids], + ok. + +%% ------------------------------------------------------- %% Internal functions. %% ------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/disk_log_1.erl erlang-13.b.3-dfsg/lib/kernel/src/disk_log_1.erl --- erlang-13.b.1-dfsg/lib/kernel/src/disk_log_1.erl 2009-03-12 12:19:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/disk_log_1.erl 2009-09-18 15:07:40.000000000 +0100 @@ -600,7 +600,7 @@ %%----------------------------------------------------------------- %% Func: mf_int_open/7, mf_ext_open/7 -%% Args: FName = string() +%% Args: FName = file:filename() %% MaxB = integer() %% MaxF = integer() %% Repair = truncate | true | false @@ -619,7 +619,7 @@ %% Reports can be browsed with Report Browser Tool (rb), or %% read with disk_log. %%----------------------------------------------------------------- --spec mf_int_open(FName :: string(), +-spec mf_int_open(FName :: file:filename(), MaxB :: integer(), MaxF :: integer(), Repair :: dlog_repair(), @@ -1529,7 +1529,7 @@ Error -> {catch file_error(FileName, Error), #cache{fd = Fd}} end. --spec write_cache_close(fd(), string(), iodata()) -> #cache{}. % | throw(Error) +-spec write_cache_close(fd(), file:filename(), iodata()) -> #cache{}. % | throw(Error) write_cache_close(Fd, _FileName, []) -> #cache{fd = Fd}; @@ -1539,12 +1539,12 @@ Error -> file_error_close(Fd, FileName, Error) end. --spec file_error(string(), {'error',atom()}) -> no_return(). +-spec file_error(file:filename(), {'error', atom()}) -> no_return(). file_error(FileName, {error, Error}) -> throw({error, {file_error, FileName, Error}}). --spec file_error_close(fd(), string(), {'error',atom()}) -> no_return(). +-spec file_error_close(fd(), file:filename(), {'error', atom()}) -> no_return(). file_error_close(Fd, FileName, {error, Error}) -> file:close(Fd), diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/disk_log.erl erlang-13.b.3-dfsg/lib/kernel/src/disk_log.erl --- erlang-13.b.1-dfsg/lib/kernel/src/disk_log.erl 2009-03-12 12:19:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/disk_log.erl 2009-09-18 15:07:39.000000000 +0100 @@ -44,7 +44,7 @@ %% To be used for debugging only: -export([pid2name/1]). --type dlog_state_error() :: 'ok' | {'error', _}. +-type dlog_state_error() :: 'ok' | {'error', term()}. -record(state, {queue = [], messages = [], @@ -74,7 +74,6 @@ -type log() :: term(). % XXX: refine -type file_error() :: term(). % XXX: refine --type filename() :: string(). -type invalid_header() :: term(). % XXX: refine %%%---------------------------------------------------------------------- @@ -97,7 +96,7 @@ | {'not_a_log_file', string()} | {'invalid_index_file', string()} | {'invalid_header', invalid_header()} - | {'file_error', filename(), file_error()} + | {'file_error', file:filename(), file_error()} | {'node_already_open', log()}. -type dist_error_rsn() :: 'nodedown' | open_error_rsn(). -type ret() :: {'ok', log()} @@ -115,61 +114,61 @@ -type log_error_rsn() :: 'no_such_log' | 'nonode' | {'read_only_mode', log()} | {'format_external', log()} | {'blocked_log', log()} | {'full', log()} | {'invalid_header', invalid_header()} - | {'file_error', filename(), file_error()}. + | {'file_error', file:filename(), file_error()}. --spec log(Log :: any(), Term :: term()) -> 'ok' | {'error', log_error_rsn()}. +-spec log(Log :: log(), Term :: term()) -> 'ok' | {'error', log_error_rsn()}. log(Log, Term) -> req(Log, {log, term_to_binary(Term)}). --spec blog(Log :: any(), Bytes :: bytes()) -> 'ok' | {'error', log_error_rsn()}. +-spec blog(Log :: log(), Bytes :: bytes()) -> 'ok' | {'error', log_error_rsn()}. blog(Log, Bytes) -> req(Log, {blog, check_bytes(Bytes)}). --spec log_terms(Log :: any(), Terms :: [any()]) -> 'ok' | {'error', any()}. +-spec log_terms(Log :: log(), Terms :: [term()]) -> 'ok' | {'error', term()}. log_terms(Log, Terms) -> Bs = terms2bins(Terms), req(Log, {log, Bs}). --spec blog_terms(Log :: any(), Bytes :: [bytes()]) -> 'ok' | {'error', any()}. +-spec blog_terms(Log :: log(), Bytes :: [bytes()]) -> 'ok' | {'error', term()}. blog_terms(Log, Bytess) -> Bs = check_bytes_list(Bytess, Bytess), req(Log, {blog, Bs}). -type notify_ret() :: 'ok' | {'error', 'no_such_log'}. --spec alog(Log :: any(), Term :: term()) -> notify_ret(). +-spec alog(Log :: log(), Term :: term()) -> notify_ret(). alog(Log, Term) -> notify(Log, {alog, term_to_binary(Term)}). --spec alog_terms(Log :: any(), Terms :: [term()]) -> notify_ret(). +-spec alog_terms(Log :: log(), Terms :: [term()]) -> notify_ret(). alog_terms(Log, Terms) -> Bs = terms2bins(Terms), notify(Log, {alog, Bs}). --spec balog(Log :: any(), Bytes :: bytes()) -> notify_ret(). +-spec balog(Log :: log(), Bytes :: bytes()) -> notify_ret(). balog(Log, Bytes) -> notify(Log, {balog, check_bytes(Bytes)}). --spec balog_terms(Log :: any(), Bytes :: [bytes()]) -> notify_ret(). +-spec balog_terms(Log :: log(), Bytes :: [bytes()]) -> notify_ret(). balog_terms(Log, Bytess) -> Bs = check_bytes_list(Bytess, Bytess), notify(Log, {balog, Bs}). -type close_error_rsn() ::'no_such_log' | 'nonode' - | {'file_error', filename(), file_error()}. + | {'file_error', file:filename(), file_error()}. --spec close(Log :: any()) -> 'ok' | {'error', close_error_rsn()}. +-spec close(Log :: log()) -> 'ok' | {'error', close_error_rsn()}. close(Log) -> req(Log, close). -type lclose_error_rsn() :: 'no_such_log' - | {'file_error', filename(), file_error()}. + | {'file_error', file:filename(), file_error()}. --spec lclose(Log :: any()) -> 'ok' | {'error', lclose_error_rsn()}. +-spec lclose(Log :: log()) -> 'ok' | {'error', lclose_error_rsn()}. lclose(Log) -> lclose(Log, node()). --spec lclose(Log :: any(), Node :: node()) -> 'ok' | {'error', lclose_error_rsn()}. +-spec lclose(Log :: log(), Node :: node()) -> 'ok' | {'error', lclose_error_rsn()}. lclose(Log, Node) -> lreq(Log, close, Node). @@ -177,31 +176,31 @@ | {'read_only_mode', log()} | {'blocked_log', log()} | {'invalid_header', invalid_header()} - | {'file_error', filename(), file_error()}. + | {'file_error', file:filename(), file_error()}. --spec truncate(Log :: any()) -> 'ok' | {'error', trunc_error_rsn()}. +-spec truncate(Log :: log()) -> 'ok' | {'error', trunc_error_rsn()}. truncate(Log) -> req(Log, {truncate, none, truncate, 1}). --spec truncate(Log :: any(), Head :: any()) -> 'ok' | {'error', trunc_error_rsn()}. +-spec truncate(Log :: log(), Head :: term()) -> 'ok' | {'error', trunc_error_rsn()}. truncate(Log, Head) -> req(Log, {truncate, {ok, term_to_binary(Head)}, truncate, 2}). --spec btruncate(Log :: any(), Head :: bytes()) -> 'ok' | {'error', trunc_error_rsn()}. +-spec btruncate(Log :: log(), Head :: bytes()) -> 'ok' | {'error', trunc_error_rsn()}. btruncate(Log, Head) -> req(Log, {truncate, {ok, check_bytes(Head)}, btruncate, 2}). --spec reopen(Log :: any(), Filename :: string()) -> 'ok' | {'error', any()}. +-spec reopen(Log :: log(), Filename :: file:filename()) -> 'ok' | {'error', term()}. reopen(Log, NewFile) -> req(Log, {reopen, NewFile, none, reopen, 2}). --spec reopen(Log :: any(), Filename :: string(), Head :: any()) -> - 'ok' | {'error', any()}. +-spec reopen(Log :: log(), Filename :: file:filename(), Head :: term()) -> + 'ok' | {'error', term()}. reopen(Log, NewFile, NewHead) -> req(Log, {reopen, NewFile, {ok, term_to_binary(NewHead)}, reopen, 3}). --spec breopen(Log :: any(), Filename :: string(), Head :: bytes()) -> - 'ok' | {'error', any()}. +-spec breopen(Log :: log(), Filename :: file:filename(), Head :: bytes()) -> + 'ok' | {'error', term()}. breopen(Log, NewFile, NewHead) -> req(Log, {reopen, NewFile, {ok, check_bytes(NewHead)}, breopen, 3}). @@ -209,41 +208,41 @@ | {'read_only_mode', log()} | {'blocked_log', log()} | {'halt_log', log()} | {'invalid_header', invalid_header()} - | {'file_error', filename(), file_error()}. + | {'file_error', file:filename(), file_error()}. --spec inc_wrap_file(Log :: any()) -> 'ok' | {'error', inc_wrap_error_rsn()}. +-spec inc_wrap_file(Log :: log()) -> 'ok' | {'error', inc_wrap_error_rsn()}. inc_wrap_file(Log) -> req(Log, inc_wrap_file). --spec change_size(Log :: any(), Size :: dlog_size()) -> 'ok' | {'error', any()}. +-spec change_size(Log :: log(), Size :: dlog_size()) -> 'ok' | {'error', term()}. change_size(Log, NewSize) -> req(Log, {change_size, NewSize}). --spec change_notify(Log :: any(), Pid :: pid(), Notify :: bool()) -> - 'ok' | {'error', any()}. +-spec change_notify(Log :: log(), Pid :: pid(), Notify :: boolean()) -> + 'ok' | {'error', term()}. change_notify(Log, Pid, NewNotify) -> req(Log, {change_notify, Pid, NewNotify}). --spec change_header(Log :: any(), Head :: {atom(), any()}) -> - 'ok' | {'error', any()}. +-spec change_header(Log :: log(), Head :: {atom(), term()}) -> + 'ok' | {'error', term()}. change_header(Log, NewHead) -> req(Log, {change_header, NewHead}). -type sync_error_rsn() :: 'no_such_log' | 'nonode' | {'read_only_mode', log()} | {'blocked_log', log()} - | {'file_error', filename(), file_error()}. + | {'file_error', file:filename(), file_error()}. --spec sync(Log :: any()) -> 'ok' | {'error', sync_error_rsn()}. +-spec sync(Log :: log()) -> 'ok' | {'error', sync_error_rsn()}. sync(Log) -> req(Log, sync). -type block_error_rsn() :: 'no_such_log' | 'nonode' | {'blocked_log', log()}. --spec block(Log :: any()) -> 'ok' | {'error', block_error_rsn()}. +-spec block(Log :: log()) -> 'ok' | {'error', block_error_rsn()}. block(Log) -> block(Log, true). --spec block(Log :: any(), QueueLogRecords :: bool()) -> 'ok' | {'error', any()}. +-spec block(Log :: log(), QueueLogRecords :: boolean()) -> 'ok' | {'error', term()}. block(Log, QueueLogRecords) -> req(Log, {block, QueueLogRecords}). @@ -251,15 +250,15 @@ | {'not_blocked', log()} | {'not_blocked_by_pid', log()}. --spec unblock(Log :: any()) -> 'ok' | {'error', unblock_error_rsn()}. +-spec unblock(Log :: log()) -> 'ok' | {'error', unblock_error_rsn()}. unblock(Log) -> req(Log, unblock). --spec format_error(Error :: any()) -> string(). +-spec format_error(Error :: term()) -> string(). format_error(Error) -> do_format_error(Error). --spec info(Log :: any()) -> [{atom(), any()}] | {'error', any()}. +-spec info(Log :: log()) -> [{atom(), any()}] | {'error', term()}. info(Log) -> sreq(Log, info). @@ -275,13 +274,13 @@ %% It retuns a {Cont2, ObjList} | eof | {error, Reason} %% The initial continuation is the atom 'start' --spec chunk(Log :: any(), Cont :: any()) -> - {'error', any()} | 'eof' | {any(), [any()]} | {any(), [any()], integer()}. +-spec chunk(Log :: log(), Cont :: any()) -> + {'error', term()} | 'eof' | {any(), [any()]} | {any(), [any()], integer()}. chunk(Log, Cont) -> chunk(Log, Cont, infinity). --spec chunk(Log :: any(), Cont :: any(), N :: pos_integer() | 'infinity') -> - {'error', any()} | 'eof' | {any(), [any()]} | {any(), [any()], integer()}. +-spec chunk(Log :: log(), Cont :: any(), N :: pos_integer() | 'infinity') -> + {'error', term()} | 'eof' | {any(), [any()]} | {any(), [any()], integer()}. chunk(Log, Cont, infinity) -> %% There cannot be more than ?MAX_CHUNK_SIZE terms in a chunk. ichunk(Log, Cont, ?MAX_CHUNK_SIZE); @@ -347,12 +346,12 @@ ichunk_bad_end(Bs, Mode, Log, C, Bad, [T | A]) end. --spec bchunk(Log :: any(), Cont :: any()) -> +-spec bchunk(Log :: log(), Cont :: any()) -> {'error', any()} | 'eof' | {any(), [binary()]} | {any(), [binary()], integer()}. bchunk(Log, Cont) -> bchunk(Log, Cont, infinity). --spec bchunk(Log :: any(), Cont :: any(), N :: 'infinity' | pos_integer()) -> +-spec bchunk(Log :: log(), Cont :: any(), N :: 'infinity' | pos_integer()) -> {'error', any()} | 'eof' | {any(), [binary()]} | {any(), [binary()], integer()}. bchunk(Log, Cont, infinity) -> %% There cannot be more than ?MAX_CHUNK_SIZE terms in a chunk. @@ -376,8 +375,8 @@ bichunk_end(R) -> R. --spec chunk_step(Log :: any(), Cont :: any(), N :: integer()) -> - {'ok', any()} | {'error', any()}. +-spec chunk_step(Log :: log(), Cont :: any(), N :: integer()) -> + {'ok', any()} | {'error', term()}. chunk_step(Log, Cont, N) when is_integer(N) -> ichunk_step(Log, Cont, N). diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/disk_log.hrl erlang-13.b.3-dfsg/lib/kernel/src/disk_log.hrl --- erlang-13.b.1-dfsg/lib/kernel/src/disk_log.hrl 2009-03-12 12:19:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/disk_log.hrl 2009-09-18 15:07:40.000000000 +0100 @@ -68,7 +68,7 @@ | 'format' | 'size' | 'distributed' | 'notify' | 'head' | 'head_func' | 'mode'. -type dlog_options() :: [{dlog_optattr(), any()}]. --type dlog_repair() :: 'truncate' | bool(). +-type dlog_repair() :: 'truncate' | boolean(). -type dlog_size() :: 'infinity' | pos_integer() | {pos_integer(), pos_integer()}. -type dlog_status() :: 'ok' | {'blocked', 'false' | [_]}. %QueueLogRecords @@ -90,7 +90,7 @@ linkto = self() :: 'none' | pid(), head = none, mode = read_write :: dlog_mode(), - notify = false :: bool(), + notify = false :: boolean(), options = [] :: dlog_options()}). -record(cache, %% Cache for logged terms (per file descriptor). @@ -106,7 +106,7 @@ ). -record(handle, %% For a wrap log. - {filename :: string(), %% Same as log.filename + {filename :: file:filename(), %% Same as log.filename maxB :: pos_integer(), %% Max size of the files. maxF :: pos_integer() | {pos_integer(),pos_integer()}, %% When pos_integer(), maximum number of files. @@ -119,7 +119,7 @@ curB :: non_neg_integer(), %% Number of bytes on current file. curF :: integer(), %% Current file number. cur_fdc :: #cache{}, %% Current file descriptor. - cur_name :: string(), %% Current file name for error reports. + cur_name :: file:filename(), %% Current file name for error reports. cur_cnt :: non_neg_integer(), %% Number of items on current file, %% header inclusive. acc_cnt :: non_neg_integer(), %% acc_cnt+cur_cnt is number of items @@ -139,8 +139,8 @@ name :: dlog_name(), %% the key leading to this structure blocked_by = none :: 'none' | pid(), %% pid of blocker users = 0 :: non_neg_integer(), %% non-linked users - filename :: string(), %% real name of the file - owners = [] :: [{pid(), bool()}], %% [{pid, notify}] + filename :: file:filename(), %% real name of the file + owners = [] :: [{pid(), boolean()}],%% [{pid, notify}] type = halt :: dlog_type(), format = internal :: dlog_format(), format_type :: dlog_format_type(), diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/dist_ac.erl erlang-13.b.3-dfsg/lib/kernel/src/dist_ac.erl --- erlang-13.b.1-dfsg/lib/kernel/src/dist_ac.erl 2009-03-12 12:19:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/dist_ac.erl 2009-11-20 13:30:27.000000000 +0000 @@ -334,7 +334,7 @@ end; handle_call({permit_application, AppName, Bool, LockId, StartInfo}, From, S) -> - case lists:keysearch(AppName, #appl.name, S#state.appls) of + case lists:keymember(AppName, #appl.name, S#state.appls) of false -> %% This one covers the case with permit for non-distributed %% applications. This shouldn't be handled like this, and not @@ -349,7 +349,7 @@ false -> {reply, {error, {not_loaded, AppName}}, S} end; - {value, _} -> + true -> NAppls = dist_update_run(S#state.appls, AppName, node(), Bool), NewS = S#state{appls = NAppls}, %% Check if the application is running @@ -748,9 +748,9 @@ ensure_take_control(AppName, Appls) -> %% Check if this is a new application that we don't control yet - case keysearch(AppName, #appl.name, Appls) of - {value, _} -> % we have control - ok; + case lists:keymember(AppName, #appl.name, Appls) of + true -> % we have control + ok; false -> % take control! %% Note: this works because this is executed within a %% synchronous call. I.e. we get the control *before* @@ -1176,9 +1176,9 @@ end. keyreplaceadd(Key, Pos, List, New) -> - case keysearch(Key, Pos, List) of - {value, _} -> keyreplace(Key, Pos, List, New); - _ -> [New | List] + case lists:keymember(Key, Pos, List) of + true -> lists:keyreplace(Key, Pos, List, New); + false -> [New | List] end. keydelete_all(Key, N, [H|T]) when element(N, H) =:= Key -> diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/error_logger.erl erlang-13.b.3-dfsg/lib/kernel/src/error_logger.erl --- erlang-13.b.1-dfsg/lib/kernel/src/error_logger.erl 2009-03-12 12:18:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/error_logger.erl 2009-11-20 13:29:31.000000000 +0000 @@ -40,6 +40,8 @@ | 'info' | 'info_msg' | 'info_report' | 'warning_msg' | 'warning_report'. +-type state() :: {non_neg_integer(), non_neg_integer(), [term()]}. + %%----------------------------------------------------------------- -spec start() -> {'ok', pid()} | {'error', any()}. @@ -278,7 +280,7 @@ %% Possibly turn off all tty printouts, maybe we only want the errors %% to go to a file --spec tty(Flag :: bool()) -> 'ok'. +-spec tty(Flag :: boolean()) -> 'ok'. tty(true) -> Hs = gen_event:which_handlers(error_logger), @@ -298,6 +300,8 @@ %%% This is the default error_logger handler. %%% --------------------------------------------------- +-spec init(term()) -> {'ok', state() | []}. + init(Max) when is_integer(Max) -> {ok, {Max, 0, []}}; %% This one is called if someone took over from us, and now wants to @@ -306,7 +310,9 @@ {ok, {?buffer_size, 0, []}}; init(_) -> %% Start and just relay to other {ok, []}. %% node if node(GLeader) =/= node(). - + +-spec handle_event(term(), state()) -> {'ok', state()}. + handle_event({Type, GL, Msg}, State) when node(GL) =/= node() -> gen_event:notify({error_logger, node(GL)},{Type, GL, Msg}), %% handle_event2({Type, GL, Msg}, State); %% Shall we do something @@ -316,6 +322,8 @@ handle_event(Event, State) -> handle_event2(Event, State). +-spec handle_info(term(), state()) -> {'ok', state()}. + handle_info({emulator, GL, Chars}, State) when node(GL) =/= node() -> {error_logger, node(GL)} ! {emulator, GL, add_node(Chars,self())}, {ok, State}; @@ -324,8 +332,12 @@ handle_info(_, State) -> {ok, State}. +-spec handle_call(term(), state()) -> {'ok', {'error', 'bad_query'}, state()}. + handle_call(_Query, State) -> {ok, {error, bad_query}, State}. +-spec terminate(term(), state()) -> {'error_logger', [term()]}. + terminate(swap, {_, 0, Buff}) -> {error_logger, Buff}; terminate(swap, {_, Lost, Buff}) -> diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/erts_debug.erl erlang-13.b.3-dfsg/lib/kernel/src/erts_debug.erl --- erlang-13.b.1-dfsg/lib/kernel/src/erts_debug.erl 2009-04-16 10:23:57.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/src/erts_debug.erl 2009-09-18 15:08:08.000000000 +0100 @@ -79,7 +79,7 @@ end end. --spec is_term_seen(term(), [term()]) -> bool(). +-spec is_term_seen(term(), [term()]) -> boolean(). is_term_seen(Term, [H|T]) -> case erts_debug:same(Term, H) of diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/file.erl erlang-13.b.3-dfsg/lib/kernel/src/file.erl --- erlang-13.b.1-dfsg/lib/kernel/src/file.erl 2009-03-12 12:18:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/file.erl 2009-11-20 13:29:32.000000000 +0000 @@ -39,6 +39,7 @@ -export([open/2, close/1, read/2, write/2, pread/2, pread/3, pwrite/2, pwrite/3, + read_line/1, position/2, truncate/1, sync/1, copy/2, copy/3]). %% High level operations @@ -71,14 +72,15 @@ -define(RAM_FILE, ram_file). % Module %% data types +-type filename() :: string(). -type io_device() :: pid() | #file_descriptor{}. --type location() :: integer() | {bof, integer()} | {cur, integer()} | - {eof, integer()} | bof | cur | eof. --type filemodes() :: [read | write | append | raw | binary | - {delayed_write, non_neg_integer(), non_neg_integer()} | - delayed_write | {read_ahead, pos_integer()} | - read_ahead | compressed]. --type bindings() :: any(). +-type location() :: integer() | {'bof', integer()} | {'cur', integer()} + | {'eof', integer()} | 'bof' | 'cur' | 'eof'. +-type mode() :: 'read' | 'write' | 'append' | 'raw' | 'binary' | + {'delayed_write', non_neg_integer(), non_neg_integer()} | + 'delayed_write' | {'read_ahead', pos_integer()} | + 'read_ahead' | 'compressed'. +-type bindings() :: any(). %%%----------------------------------------------------------------- %%% General functions @@ -105,7 +107,7 @@ format_error(ErrorId) -> erl_posix_msg:message(ErrorId). --spec pid2name(Pid :: pid()) -> {'ok', string()} | 'undefined'. +-spec pid2name(Pid :: pid()) -> {'ok', filename()} | 'undefined'. pid2name(Pid) when is_pid(Pid) -> case whereis(?FILE_SERVER) of @@ -124,15 +126,15 @@ %%% File server functions. %%% Functions that do not operate on a single open file. %%% Stateless. --spec get_cwd() -> {'ok', string()} | {'error', posix()}. +-spec get_cwd() -> {'ok', filename()} | {'error', posix()}. -get_cwd() -> +get_cwd() -> call(get_cwd, []). --spec get_cwd(Dirname :: string()) -> {'ok', string()} | {'error', posix()}. +-spec get_cwd(Drive :: string()) -> {'ok', filename()} | {'error', posix()}. -get_cwd(Dirname) -> - check_and_call(get_cwd, [file_name(Dirname)]). +get_cwd(Drive) -> + check_and_call(get_cwd, [file_name(Drive)]). -spec set_cwd(Dirname :: name()) -> 'ok' | {'error', posix()}. @@ -159,7 +161,7 @@ del_dir(Name) -> check_and_call(del_dir, [file_name(Name)]). --spec read_file_info(Name :: name()) -> {'ok', any()} | {'error', posix()}. +-spec read_file_info(Name :: name()) -> {'ok', #file_info{}} | {'error', posix()}. read_file_info(Name) -> check_and_call(read_file_info, [file_name(Name)]). @@ -169,12 +171,12 @@ altname(Name) -> check_and_call(altname, [file_name(Name)]). --spec read_link_info(Name :: name()) -> {'ok', any()} | {'error', posix()}. +-spec read_link_info(Name :: name()) -> {'ok', #file_info{}} | {'error', posix()}. read_link_info(Name) -> check_and_call(read_link_info, [file_name(Name)]). --spec read_link(Name :: name()) -> {'ok', string()} | {'error', posix()}. +-spec read_link(Name :: name()) -> {'ok', filename()} | {'error', posix()}. read_link(Name) -> check_and_call(read_link, [file_name(Name)]). @@ -185,7 +187,7 @@ write_file_info(Name, Info = #file_info{}) -> check_and_call(write_file_info, [file_name(Name), Info]). --spec list_dir(Name :: name()) -> {'ok', [string()]} | {'error', posix()}. +-spec list_dir(Name :: name()) -> {'ok', [filename()]} | {'error', posix()}. list_dir(Name) -> check_and_call(list_dir, [file_name(Name)]). @@ -215,7 +217,7 @@ %% Meanwhile, it is implemented here, slihtly less efficient. %% --spec write_file(Name :: name(), Bin :: binary(), Modes :: filemodes()) -> +-spec write_file(Name :: name(), Bin :: binary(), Modes :: [mode()]) -> 'ok' | {'error', posix()}. write_file(Name, Bin, ModeList) when is_list(ModeList) -> @@ -270,8 +272,8 @@ %% Contemporary mode specification - list of options --spec open(Name :: name(), Modes :: filemodes()) -> - {'ok',io_device()} | {'error', posix()}. +-spec open(Name :: name(), Modes :: [mode()]) -> + {'ok', io_device()} | {'error', posix()}. open(Item, ModeList) when is_list(ModeList) -> case lists:member(raw, ModeList) of @@ -358,6 +360,21 @@ read(_, _) -> {error, badarg}. +-spec read_line(File :: io_device()) -> + 'eof' | {'ok', [char()] | binary()} | {'error', posix()}. + +read_line(File) when is_pid(File) -> + case io:request(File, {get_line, ''}) of + Data when is_list(Data); is_binary(Data) -> + {ok, Data}; + Other -> + Other + end; +read_line(#file_descriptor{module = Module} = Handle) -> + Module:read_line(Handle); +read_line(_) -> + {error, badarg}. + -spec pread(File :: io_device(), LocationNumbers :: [{location(), non_neg_integer()}]) -> {'ok', [string() | binary() | 'eof']} | {'error', posix()}. @@ -478,15 +495,15 @@ truncate(_) -> {error, badarg}. --spec copy(Source :: io_device() | name() | {name(), filemodes()}, - Destination :: io_device() | name() | {name(), filemodes()}) -> +-spec copy(Source :: io_device() | name() | {name(), [mode()]}, + Destination :: io_device() | name() | {name(), [mode()]}) -> {'ok', non_neg_integer()} | {'error', posix()}. copy(Source, Dest) -> copy_int(Source, Dest, infinity). --spec copy(Source :: io_device() | name() | {name(), filemodes()}, - Destination :: io_device() | name() | {name(), filemodes()}, +-spec copy(Source :: io_device() | name() | {name(), [mode()]}, + Destination :: io_device() | name() | {name(), [mode()]}, Length :: non_neg_integer() | 'infinity') -> {'ok', non_neg_integer()} | {'error', posix()}. @@ -724,7 +741,7 @@ end. -spec path_consult(Paths :: [name()], File :: name()) -> - {'ok', list(), string()} | {'error', posix() | {integer(), atom(), any()}}. + {'ok', list(), filename()} | {'error', posix() | {integer(), atom(), any()}}. path_consult(Path, File) -> case path_open(Path, File, [read]) of @@ -760,13 +777,13 @@ end. -spec path_eval(Paths :: [name()], File :: name()) -> - {'ok', string()} | {'error', posix() | {integer(), atom(), any()}}. + {'ok', filename()} | {'error', posix() | {integer(), atom(), any()}}. path_eval(Path, File) -> path_eval(Path, File, erl_eval:new_bindings()). -spec path_eval(Paths :: [name()], File :: name(), Bindings :: bindings()) -> - {'ok', string()} | {'error', posix() | {integer(), atom(), any()}}. + {'ok', filename()} | {'error', posix() | {integer(), atom(), any()}}. path_eval(Path, File, Bs) -> case path_open(Path, File, [read]) of @@ -803,7 +820,7 @@ end. -spec path_script/2 :: (Paths :: [name()], File :: name()) -> - {'ok', _, string()} | {'error', posix() | {integer(), atom(), _}}. + {'ok', term(), filename()} | {'error', posix() | {integer(), atom(), _}}. path_script(Path, File) -> path_script(Path, File, erl_eval:new_bindings()). @@ -811,7 +828,7 @@ -spec path_script(Paths :: [name()], File :: name(), Bindings :: bindings()) -> - {'ok', _, string()} | {'error', posix() | {integer(), atom(), _}}. + {'ok', term(), filename()} | {'error', posix() | {integer(), atom(), _}}. path_script(Path, File, Bs) -> case path_open(Path, File, [read]) of @@ -836,10 +853,8 @@ %% Searches the Paths for file Filename which can be opened with Mode. %% The path list is ignored if Filename contains an absolute path. --spec path_open(Paths :: [name()], - Filename :: name(), - Modes :: filemodes()) -> - {'ok', io_device(), string()} | {'error', posix()}. +-spec path_open(Paths :: [name()], Name :: name(), Modes :: [mode()]) -> + {'ok', io_device(), filename()} | {'error', posix()}. path_open(PathList, Name, Mode) -> case file_name(Name) of @@ -851,9 +866,9 @@ path_open_first(PathList, FileName, Mode, enoent); _ -> case open(Name, Mode) of - {ok, Fd} -> + {ok, Fd} -> {ok, Fd, Name}; - Error -> + Error -> Error end end diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/file_io_server.erl erlang-13.b.3-dfsg/lib/kernel/src/file_io_server.erl --- erlang-13.b.1-dfsg/lib/kernel/src/file_io_server.erl 2009-06-05 13:53:20.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/src/file_io_server.erl 2009-09-18 15:08:14.000000000 +0100 @@ -283,6 +283,15 @@ io_request({get_chars,Enc,_Prompt,N}, #state{}=State) -> get_chars(N, Enc, State); + +%% +%% This optimization gives almost nothing - needs more working... +%% Disabled for now. /PaN +%% +%% io_request({get_line,Enc,_Prompt}, +%% #state{unic=latin1}=State) -> +%% get_line(Enc,State); + io_request({get_line,Enc,_Prompt}, #state{}=State) -> get_chars(io_lib, collect_line, [], Enc, State); @@ -356,7 +365,57 @@ {stop,normal,{error,{no_translation, InEncoding, OutEncoding}},State} end. - +%% +%% Process the I/O request get_line for latin1 encoding of file specially +%% Unfortunately this function gives almost nothing, it needs more work +%% I disable it for now /PaN +%% +%% srch(<<>>,_,_) -> +%% nomatch; +%% srch(<>,X,N) -> +%% {match,N}; +%% srch(<<_:8,T/binary>>,X,N) -> +%% srch(T,X,N+1). +%% get_line(OutEnc, #state{handle=Handle,buf = <<>>,unic=latin1}=State) -> +%% case ?PRIM_FILE:read(Handle,?READ_SIZE_BINARY) of +%% {ok, B} -> +%% get_line(OutEnc, State#state{buf = B}); +%% eof -> +%% {reply,eof,State}; +%% {error,Reason}=Error -> +%% {stop,Reason,Error,State} +%% end; +%% get_line(OutEnc, #state{handle=Handle,buf=Buf,read_mode=ReadMode,unic=latin1}=State) -> +%% case srch(Buf,$\n,0) of +%% nomatch -> +%% case ?PRIM_FILE:read(Handle,?READ_SIZE_BINARY) of +%% {ok, B} -> +%% get_line(OutEnc,State#state{buf = <>}); +%% eof -> +%% std_reply(cast(Buf, ReadMode,latin1,OutEnc), State); +%% {error,Reason}=Error -> +%% {stop,Reason,Error,State#state{buf= <<>>}} +%% end; +%% {match,Pos} when Pos >= 1-> +%% PosP1 = Pos + 1, +%% <> = Buf, +%% PosM1 = Pos - 1, +%% Res = case Res0 of +%% <> -> +%% cat(Chomped, <<"\n">>, ReadMode,latin1,OutEnc); +%% _Other -> +%% cast(Res0, ReadMode,latin1,OutEnc) +%% end, +%% {reply,Res,State#state{buf=NewBuf}}; +%% {match,Pos} -> +%% PosP1 = Pos + 1, +%% <> = Buf, +%% {reply,Res,State#state{buf=NewBuf}} +%% end; +%% get_line(_, #state{}=State) -> +%% {error,{error,get_line},State}. + +%% %% Process the I/O request get_chars %% get_chars(0, Enc, #state{read_mode=ReadMode,unic=InEncoding}=State) -> diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/global.erl erlang-13.b.3-dfsg/lib/kernel/src/global.erl --- erlang-13.b.1-dfsg/lib/kernel/src/global.erl 2009-03-12 12:18:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/global.erl 2009-09-18 15:07:02.000000000 +0100 @@ -82,8 +82,8 @@ -define(vsn, 5). %%----------------------------------------------------------------- -%% connect_all = bool() - true if we are supposed to set up a -%% fully connected net +%% connect_all = boolean() - true if we are supposed to set up a +%% fully connected net %% known = [Node] - all nodes known to us %% synced = [Node] - all nodes that have the same names as us %% resolvers = [{Node, MyTag, Resolver}] - @@ -106,8 +106,12 @@ %% {sync_tag_his, Node} = The Node's tag, used at synchronization %% {lock_id, Node} = The resource locking the partitions %%----------------------------------------------------------------- --record(state, {connect_all, known = [], synced = [], - resolvers = [], syncers = [], node_name = node(), +-record(state, {connect_all :: boolean(), + known = [] :: [node()], + synced = [] :: [node()], + resolvers = [], + syncers = [] :: [pid()], + node_name = node() :: node(), the_locker, the_deleter, the_registrar, trace, global_lock_down = false }). @@ -159,22 +163,25 @@ stop() -> gen_server:call(global_name_server, stop, infinity). +-spec sync() -> 'ok' | {'error', term()}. sync() -> case check_sync_nodes() of - {error, Error} -> - {error, Error}; + {error, _} = Error -> + Error; SyncNodes -> gen_server:call(global_name_server, {sync, SyncNodes}, infinity) end. +-spec sync([node()]) -> 'ok' | {'error', term()}. sync(Nodes) -> case check_sync_nodes(Nodes) of - {error, Error} -> - {error, Error}; + {error, _} = Error -> + Error; SyncNodes -> gen_server:call(global_name_server, {sync, SyncNodes}, infinity) end. +-spec send(term(), term()) -> pid(). send(Name, Msg) -> case whereis_name(Name) of Pid when is_pid(Pid) -> @@ -185,9 +192,11 @@ end. %% See OTP-3737. +-spec whereis_name(term()) -> pid() | 'undefined'. whereis_name(Name) -> where(Name). +-spec safe_whereis_name(term()) -> pid() | 'undefined'. safe_whereis_name(Name) -> gen_server:call(global_name_server, {whereis, Name}, infinity). @@ -207,9 +216,13 @@ %% undefined which one of them is used. %% Method blocks the name registration, but does not affect global locking. %%----------------------------------------------------------------- +-spec register_name(term(), pid()) -> 'yes' | 'no'. register_name(Name, Pid) when is_pid(Pid) -> - register_name(Name, Pid, {?MODULE, random_exit_name}). + register_name(Name, Pid, fun random_exit_name/3). +-type method() :: fun((term(), pid(), pid()) -> pid() | 'none'). + +-spec register_name(term(), pid(), method()) -> 'yes' | 'no'. register_name(Name, Pid, Method) when is_pid(Pid) -> Fun = fun(Nodes) -> case (where(Name) =:= undefined) andalso check_dupname(Name, Pid) of @@ -241,6 +254,7 @@ end end. +-spec unregister_name(term()) -> _. unregister_name(Name) -> case where(Name) of undefined -> @@ -256,9 +270,11 @@ gen_server:call(global_name_server, {registrar, Fun}, infinity) end. +-spec re_register_name(term(), pid()) -> _. re_register_name(Name, Pid) when is_pid(Pid) -> - re_register_name(Name, Pid, {?MODULE, random_exit_name}). + re_register_name(Name, Pid, fun random_exit_name/3). +-spec re_register_name(term(), pid(), method()) -> _. re_register_name(Name, Pid, Method) when is_pid(Pid) -> Fun = fun(Nodes) -> gen_server:multi_call(Nodes, @@ -269,6 +285,7 @@ ?trace({re_register_name, self(), Name, Pid, Method}), gen_server:call(global_name_server, {registrar, Fun}, infinity). +-spec registered_names() -> [term()]. registered_names() -> MS = ets:fun2ms(fun({Name,_Pid,_M,_RP,_R}) -> Name end), ets:select(global_names, MS). @@ -289,7 +306,7 @@ %% the fact that monitors do the job now.] %%----------------------------------------------------------------- register_name_external(Name, Pid) when is_pid(Pid) -> - register_name_external(Name, Pid, {?MODULE, random_exit_name}). + register_name_external(Name, Pid, fun random_exit_name/3). register_name_external(Name, Pid, Method) when is_pid(Pid) -> Fun = fun(Nodes) -> @@ -309,12 +326,19 @@ unregister_name_external(Name) -> unregister_name(Name). +-type id() :: {term(), term()}. + +-spec set_lock(id()) -> boolean(). set_lock(Id) -> set_lock(Id, [node() | nodes()], infinity, 1). +-type retries() :: non_neg_integer() | 'infinity'. + +-spec set_lock(id(), [node()]) -> boolean(). set_lock(Id, Nodes) -> set_lock(Id, Nodes, infinity, 1). +-spec set_lock(id(), [node()], retries()) -> boolean(). set_lock(Id, Nodes, Retries) when is_integer(Retries), Retries >= 0 -> set_lock(Id, Nodes, Retries, 1); set_lock(Id, Nodes, infinity) -> @@ -336,20 +360,25 @@ set_lock(Id, Nodes, dec(Retries), Times+1) end. +-spec del_lock(id()) -> 'true'. del_lock(Id) -> del_lock(Id, [node() | nodes()]). -del_lock({ResourceId, LockRequesterId}, Nodes) -> - Id = {ResourceId, LockRequesterId}, - ?trace({del_lock, {me,self()}, {ResourceId,LockRequesterId}, - {nodes,Nodes}}), +-spec del_lock(id(), [node()]) -> 'true'. +del_lock({_ResourceId, _LockRequesterId} = Id, Nodes) -> + ?trace({del_lock, {me,self()}, Id, {nodes,Nodes}}), gen_server:multi_call(Nodes, global_name_server, {del_lock, Id}), true. +-type trans_fun() :: function() | {module(), atom()}. + +-spec trans(id(), trans_fun()) -> term(). trans(Id, Fun) -> trans(Id, Fun, [node() | nodes()], infinity). +-spec trans(id(), trans_fun(), [node()]) -> term(). trans(Id, Fun, Nodes) -> trans(Id, Fun, Nodes, infinity). +-spec trans(id(), trans_fun(), [node()], retries()) -> term(). trans(Id, Fun, Nodes, Retries) -> case set_lock(Id, Nodes, Retries) of true -> @@ -975,16 +1004,14 @@ %% older versions of the protocol. put({prot_vsn, Node}, Vsn), put({sync_tag_his, Node}, HisTag), - case lists:keysearch(Node, 1, Resolvers) of - {value, {Node, MyTag, _Resolver}} -> + case lists:keyfind(Node, 1, Resolvers) of + {Node, MyTag, _Resolver} -> MyTag = get({sync_tag_my, Node}), % assertion - case InitMsg of - {locker, _NoLongerAPid, _HisKnown0, HisTheLocker} -> - ?trace({init_connect,{histhelocker,HisTheLocker}}), - HisKnown = [], - S#state.the_locker ! {his_the_locker, HisTheLocker, - {Vsn,HisKnown}, S#state.known} - end; + {locker, _NoLongerAPid, _HisKnown0, HisTheLocker} = InitMsg, + ?trace({init_connect,{histhelocker,HisTheLocker}}), + HisKnown = [], + S#state.the_locker ! {his_the_locker, HisTheLocker, + {Vsn,HisKnown}, S#state.known}; false -> ?trace({init_connect,{pre_connect,Node},{histag,HisTag}}), put({pre_connect, Node}, {Vsn, InitMsg, HisTag}) @@ -1023,8 +1050,7 @@ {resolvers, Resolvers}}), case erase({wait_lock, Node}) of lock_is_set -> - {value, {Node, _Tag, Resolver}} = - lists:keysearch(Node, 1, Resolvers), + {Node, _Tag, Resolver} = lists:keyfind(Node, 1, Resolvers), Resolver ! {resolve, NameList, Node}; undefined -> put({wait_lock, Node}, {exchange, NameList}) @@ -1212,8 +1238,8 @@ [{ResourceId, LockRequesterId}, Pid]); remove_lock(ResourceId, LockRequesterId, Pid, PidRefs0, _Down, S) -> ?trace({remove_lock_2, {id,ResourceId},{pid,Pid}}), - PidRefs = case lists:keysearch(Pid, 1, PidRefs0) of - {value, {Pid, RPid, Ref}} -> + PidRefs = case lists:keyfind(Pid, 1, PidRefs0) of + {Pid, RPid, Ref} -> true = erlang:demonitor(Ref, [flush]), kill_monitor_proc(RPid, Pid), true = ets:delete_object(global_pid_ids, @@ -1348,8 +1374,8 @@ extra_info(Tag, ExtraInfo) -> %% ExtraInfo used to be a list of nodes (vsn 2). - case catch lists:keysearch(Tag, 1, ExtraInfo) of - {value, {Tag, Info}} -> + case catch lists:keyfind(Tag, 1, ExtraInfo) of + {Tag, Info} -> Info; _ -> undefined @@ -1839,8 +1865,8 @@ Resolvers = S#state.resolvers, ?trace({cancel_locker, {node,Node},{tag,Tag}, {sync_tag_my, get({sync_tag_my, Node})},{resolvers,Resolvers}}), - case lists:keysearch(Node, 1, Resolvers) of - {value, {_, Tag, Resolver}} -> + case lists:keyfind(Node, 1, Resolvers) of + {_, Tag, Resolver} -> ?trace({{resolver, Resolver}}), exit(Resolver, kill), S1 = trace_message(S, {kill_resolver, Node}, [Tag, Resolver]), @@ -1850,7 +1876,7 @@ end. reset_node_state(Node) -> - ?trace({{node,Node}, reset_node_state,get()}), + ?trace({{node,Node}, reset_node_state, get()}), erase({wait_lock, Node}), erase({save_ops, Node}), erase({pre_connect, Node}), @@ -1913,6 +1939,7 @@ minmax(P1,P2) -> if node(P1) < node(P2) -> {P1, P2}; true -> {P2, P1} end. +-spec random_exit_name(term(), pid(), pid()) -> pid(). random_exit_name(Name, Pid, Pid2) -> {Min, Max} = minmax(Pid, Pid2), error_logger:info_msg("global: Name conflict terminating ~w\n", @@ -1925,6 +1952,7 @@ Max ! {global_name_conflict, Name}, Min. +-spec notify_all_name(term(), pid(), pid()) -> 'none'. notify_all_name(Name, Pid, Pid2) -> Pid ! {global_name_conflict, Name, Pid2}, Pid2 ! {global_name_conflict, Name, Pid}, @@ -1954,14 +1982,13 @@ end. pid_is_locking(Pid, PidRefs) -> - lists:keysearch(Pid, 1, PidRefs) =/= false. + lists:keyfind(Pid, 1, PidRefs) =/= false. delete_lock(Ref, S0) -> Locks = pid_locks(Ref), del_locks(Locks, Ref, S0#state.known), F = fun({ResourceId, LockRequesterId, PidRefs}, S) -> - {value, {Pid, _RPid, Ref}} = - lists:keysearch(Ref, 3, PidRefs), + {Pid, _RPid, Ref} = lists:keyfind(Ref, 3, PidRefs), remove_lock(ResourceId, LockRequesterId, Pid, PidRefs, true,S) end, lists:foldl(F, S0, Locks). @@ -1974,11 +2001,11 @@ rpid_is_locking(Ref, PidRefs)]. rpid_is_locking(Ref, PidRefs) -> - lists:keysearch(Ref, 3, PidRefs) =/= false. + lists:keyfind(Ref, 3, PidRefs) =/= false. %% Send {async_del_lock, ...} to old nodes (pre R11B-3). del_locks([{ResourceId, _LockReqId, PidRefs} | Tail], Ref, KnownNodes) -> - {value, {Pid, _RPid, Ref}} = lists:keysearch(Ref, 3, PidRefs), + {Pid, _RPid, Ref} = lists:keyfind(Ref, 3, PidRefs), case node(Pid) =:= node() of true -> gen_server:abcast(KnownNodes, global_name_server, @@ -2090,8 +2117,8 @@ %% global_groups parameter is defined, we are not allowed to sync %% with nodes not in our own global group. intersection(nodes(), NodesNG); - {error, Error} -> - {error, Error} + {error, _} = Error -> + Error end. check_sync_nodes(SyncNodes) -> @@ -2108,8 +2135,8 @@ _ -> {error, {"Trying to sync nodes not defined in " "the own global group", IllegalSyncNodes}} end; - {error, Error} -> - {error, Error} + {error, _} = Error -> + Error end. get_own_nodes() -> diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/global_group.erl erlang-13.b.3-dfsg/lib/kernel/src/global_group.erl --- erlang-13.b.1-dfsg/lib/kernel/src/global_group.erl 2009-03-12 12:19:20.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/global_group.erl 2009-09-18 15:07:51.000000000 +0100 @@ -48,10 +48,8 @@ -export([get_own_nodes/0, get_own_nodes_with_errors/0]). -export([publish_on_nodes/0]). - -export([config_scan/1, config_scan/2]). - %% Internal exports -export([sync_init/4]). @@ -59,6 +57,16 @@ -define(cc_vsn, 2). %%%==================================================================================== + +-type publish_type() :: 'hidden' | 'normal'. +-type sync_state() :: 'no_conf' | 'synced'. + +-type group_name() :: atom(). +-type group_tuple() :: {group_name(), [node()]} + | {group_name(), publish_type(), [node()]}. + + +%%%==================================================================================== %%% The state of the global_group process %%% %%% sync_state = no_conf (global_groups not defined, inital state) | @@ -71,19 +79,29 @@ %%% node_name = Own node %%% monitor = List of Pids requesting nodeup/nodedown %%%==================================================================================== --record(state, {sync_state = no_conf, connect_all, group_name = [], - nodes = [], no_contact = [], sync_error = [], other_grps = [], - node_name = node(), monitor = [], - publish_type = normal, group_publish_type = normal}). +-record(state, {sync_state = no_conf :: sync_state(), + connect_all :: boolean(), + group_name = [] :: group_name() | [], + nodes = [] :: [node()], + no_contact = [] :: [node()], + sync_error = [], + other_grps = [], + node_name = node() :: node(), + monitor = [], + publish_type = normal :: publish_type(), + group_publish_type = normal :: publish_type()}). %%%==================================================================================== %%% External exported %%%==================================================================================== + +-spec global_groups() -> {group_name(), [group_name()]} | 'undefined'. global_groups() -> request(global_groups). +-spec monitor_nodes(boolean()) -> 'ok'. monitor_nodes(Flag) -> case Flag of true -> request({monitor_nodes, Flag}); @@ -91,21 +109,30 @@ _ -> {error, not_boolean} end. +-spec own_nodes() -> [node()]. own_nodes() -> request(own_nodes). +-type name() :: atom(). +-type where() :: {'node', node()} | {'group', group_name()}. + +-spec registered_names(where()) -> [name()]. registered_names(Arg) -> request({registered_names, Arg}). +-spec send(name(), term()) -> pid() | {'badarg', {name(), term()}}. send(Name, Msg) -> request({send, Name, Msg}). +-spec send(where(), name(), term()) -> pid() | {'badarg', {name(), term()}}. send(Group, Name, Msg) -> request({send, Group, Name, Msg}). +-spec whereis_name(name()) -> pid() | 'undefined'. whereis_name(Name) -> request({whereis_name, Name}). +-spec whereis_name(where(), name()) -> pid() | 'undefined'. whereis_name(Group, Name) -> request({whereis_name, Group, Name}). @@ -118,6 +145,7 @@ global_groups_removed(NewPara) -> request({global_groups_removed, NewPara}). +-spec sync() -> 'ok'. sync() -> request(sync). @@ -127,8 +155,16 @@ ng_add_check(Node, PubType, OthersNG) -> request({ng_add_check, Node, PubType, OthersNG}). +-type info_item() :: {'state', sync_state()} + | {'own_group_name', group_name()} + | {'own_group_nodes', [node()]} + | {'synched_nodes', [node()]} + | {'sync_error', [node()]} + | {'no_contact', [node()]} + | {'other_groups', [group_tuple()]} + | {'monitoring', [pid()]}. - +-spec info() -> [info_item()]. info() -> request(info, 3000). @@ -346,7 +382,6 @@ - %%%==================================================================================== %%% send(Name, Msg) -> Pid | {badarg, {Name, Msg}} %%% send({node, Node}, Name, Msg) -> Pid | {badarg, {Name, Msg}} @@ -488,7 +523,6 @@ {reply, ok, NewS}; - %%%==================================================================================== %%% global_groups parameter added %%% The node is not resynced automatically because it would cause this node to diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/heart.erl erlang-13.b.3-dfsg/lib/kernel/src/heart.erl --- erlang-13.b.1-dfsg/lib/kernel/src/heart.erl 2009-03-12 12:18:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/heart.erl 2009-09-18 15:07:08.000000000 +0100 @@ -85,18 +85,20 @@ Starter ! {start_error, self()} end. --spec set_cmd(Cmd) -> 'ok' | {'error', {'bad_cmd', Cmd}} - when is_subtype(Cmd, string()). +-spec set_cmd(string()) -> 'ok' | {'error', {'bad_cmd', string()}}. + set_cmd(Cmd) -> heart ! {self(), set_cmd, Cmd}, wait(). -spec get_cmd() -> 'ok'. + get_cmd() -> heart ! {self(), get_cmd}, wait(). -spec clear_cmd() -> {'ok', string()}. + clear_cmd() -> heart ! {self(), clear_cmd}, wait(). @@ -104,6 +106,7 @@ %%% Should be used solely by the release handler!!!!!!! -spec cycle() -> 'ok' | {'error', term()}. + cycle() -> heart ! {self(), cycle}, wait(). @@ -208,6 +211,7 @@ end. -spec no_reboot_shutdown(port()) -> no_return(). + no_reboot_shutdown(Port) -> send_shutdown(Port), receive diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/hipe_unified_loader.erl erlang-13.b.3-dfsg/lib/kernel/src/hipe_unified_loader.erl --- erlang-13.b.1-dfsg/lib/kernel/src/hipe_unified_loader.erl 2009-04-17 11:04:51.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/src/hipe_unified_loader.erl 2009-09-18 15:08:29.000000000 +0100 @@ -303,8 +303,8 @@ -record(fundef, {address :: integer(), mfa :: mfa(), - is_closure :: bool(), - is_exported :: bool()}). + is_closure :: boolean(), + is_exported :: boolean()}). exports(ExportMap, BaseAddress) -> exports(ExportMap, BaseAddress, [], []). @@ -760,7 +760,7 @@ emu_make_stubs(ReferencesToPatch), redirect(ReferencesToPatch). --spec is_loaded(Module::atom()) -> bool(). +-spec is_loaded(Module::atom()) -> boolean(). %% @doc Checks whether a module is loaded or not. is_loaded(M) when is_atom(M) -> try hipe_bifs:fun_to_address({M,module_info,0}) of diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/inet6_tcp_dist.erl erlang-13.b.3-dfsg/lib/kernel/src/inet6_tcp_dist.erl --- erlang-13.b.1-dfsg/lib/kernel/src/inet6_tcp_dist.erl 2009-03-12 12:19:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/inet6_tcp_dist.erl 2009-11-20 13:30:28.000000000 +0000 @@ -33,8 +33,8 @@ --define(to_port(Socket, Data), - case inet6_tcp:send(Socket, Data) of +-define(to_port(Socket, Data, Opts), + case inet6_tcp:send(Socket, Data, Opts) of {error, closed} -> self() ! {tcp_closed, Socket}, {error, closed}; @@ -397,7 +397,7 @@ is_node_name(_Node) -> false. tick(Sock) -> - ?to_port(Sock,[]). + ?to_port(Sock,[],[force]). getstat(Socket) -> case inet:getstat(Socket, [recv_cnt, send_cnt, send_pend]) of {ok, Stat} -> diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/inet6_tcp.erl erlang-13.b.3-dfsg/lib/kernel/src/inet6_tcp.erl --- erlang-13.b.1-dfsg/lib/kernel/src/inet6_tcp.erl 2009-04-16 10:23:52.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/src/inet6_tcp.erl 2009-11-20 13:30:23.000000000 +0000 @@ -19,7 +19,7 @@ -module(inet6_tcp). -export([connect/3, connect/4, listen/2, accept/1, accept/2, close/1]). --export([send/2, recv/2, recv/3, unrecv/2]). +-export([send/2, send/3, recv/2, recv/3, unrecv/2]). -export([shutdown/2]). -export([controlling_process/2]). -export([fdopen/2]). @@ -43,7 +43,8 @@ %% %% Send data on a socket %% -send(Socket, Packet) -> prim_inet:send(Socket, Packet). +send(Socket, Packet, Opts) -> prim_inet:send(Socket, Packet, Opts). +send(Socket, Packet) -> prim_inet:send(Socket, Packet, []). %% %% Receive data from a socket (inactive only) diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/inet_config.erl erlang-13.b.3-dfsg/lib/kernel/src/inet_config.erl --- erlang-13.b.1-dfsg/lib/kernel/src/inet_config.erl 2009-03-12 12:19:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/inet_config.erl 2009-09-18 15:07:45.000000000 +0100 @@ -40,6 +40,7 @@ %% 5. Home (user inetrc) %% %% +-spec init() -> 'ok'. init() -> OsType = os:type(), case OsType of @@ -50,7 +51,7 @@ ok; _Other -> %% Setup reserved port for ose_inet driver (only OSE) - case catch erlang:open_port({spawn,ose_inet}, [binary]) of + case catch erlang:open_port({spawn,"ose_inet"}, [binary]) of {'EXIT',Why} -> error("can't open port for ose_inet: ~p", [Why]); OseInetPort -> @@ -123,8 +124,33 @@ _ -> error("syntax error in ~s~n", [RcFile]) end, - %% Now test if we can lookup our own hostname. - standalone_host(). + %% Set up a resolver configuration file for inet_res, + %% unless that already has been done + case OsType of + {unix,_} -> + %% The Etc variable enables us to run tests with other + %% configuration files than the normal ones + Etc = case os:getenv("ERL_INET_ETC_DIR") of + false -> ?DEFAULT_ETC; + _EtcDir -> + _EtcDir + end, + case inet_db:res_option(resolv_conf) of + undefined -> + inet_db:set_resolv_conf(filename:join(Etc, + ?DEFAULT_RESOLV)); + _ -> ok + end, + case inet_db:res_option(hosts_file) of + undefined -> + inet_db:set_hosts_file(filename:join(Etc, + ?DEFAULT_HOSTS)); + _ -> ok + end; + _ -> ok + end. + + erl_dist_mode() -> case init:get_argument(sname) of @@ -144,7 +170,7 @@ _EtcDir -> _EtcDir end, - load_resolv(filename:join(Etc,"resolv.conf"), resolv), + load_resolv(filename:join(Etc, ?DEFAULT_RESOLV), resolv), case Type of freebsd -> %% we may have to check version (2.2.2) load_resolv(filename:join(Etc,"host.conf"), host_conf_freebsd); @@ -226,41 +252,6 @@ do_load_resolv(_, _) -> inet_db:set_lookup([native]). -%% This host seems to be standalone. Add a shortcut to enable us to -%% lookup our own hostname. -standalone_host() -> - Name = inet_db:gethostname(), - case inet:gethostbyname(Name) of - {ok, #hostent{}} -> - ok; - _ -> - case inet_db:res_option(domain) of - "" -> - inet_db:add_host({127,0,0,1}, [Name]); - Domain -> - FQName = lists:append([inet_db:gethostname(), - ".", Domain]), - case inet:gethostbyname(FQName) of - {ok, #hostent{ - h_name = N, - h_addr_list = [IP|_], - h_aliases = As}} -> - inet_db:add_host(IP, [N | As] ++ [Name]); - _ -> - inet_db:add_host({127,0,0,1}, [Name]) - end - end, - Lookup = inet_db:res_option(lookup), - case lists:member(file, Lookup) of - true -> - ok; - false -> - inet_db:set_lookup(Lookup++[file]), - ok - end - end. - - add_dns_lookup(L) -> case lists:member(dns,L) of true -> ok; diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/inet_db.erl erlang-13.b.3-dfsg/lib/kernel/src/inet_db.erl --- erlang-13.b.1-dfsg/lib/kernel/src/inet_db.erl 2009-03-12 12:18:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/kernel/src/inet_db.erl 2009-09-18 15:07:37.000000000 +0100 @@ -33,9 +33,10 @@ %% External exports -export([start/0, start_link/0, stop/0, reset/0, clear_cache/0]). -export([add_rr/1,add_rr/5,del_rr/4]). --export([add_ns/1,add_ns/2, ins_ns/1, ins_ns/2, del_ns/1, del_ns/0]). +-export([add_ns/1,add_ns/2, ins_ns/1, ins_ns/2, + del_ns/2, del_ns/1, del_ns/0]). -export([add_alt_ns/1,add_alt_ns/2, ins_alt_ns/1, ins_alt_ns/2, - del_alt_ns/1, del_alt_ns/0]). + del_alt_ns/2, del_alt_ns/1, del_alt_ns/0]). -export([add_search/1,ins_search/1,del_search/1, del_search/0]). -export([set_lookup/1, set_recurse/1]). -export([set_socks_server/1, set_socks_port/1, add_socks_methods/1, @@ -43,6 +44,8 @@ add_socks_noproxy/1, del_socks_noproxy/1]). -export([set_cache_size/1, set_cache_refresh/1]). -export([set_timeout/1, set_retry/1, set_inet6/1, set_usevc/1]). +-export([set_edns/1, set_udp_payload_size/1]). +-export([set_resolv_conf/1, set_hosts_file/1, get_hosts_file/0]). -export([tcp_module/0, set_tcp_module/1]). -export([udp_module/0, set_udp_module/1]). -export([sctp_module/0,set_sctp_module/1]). @@ -57,11 +60,12 @@ -export([add_resolv/1]). -export([add_rc/1, add_rc_bin/1, add_rc_list/1, get_rc/0]). --export([res_option/1]). +-export([res_option/1, res_option/2, res_check_option/2]). -export([socks_option/1]). -export([getbyname/2, get_searchlist/0]). -export([gethostbyaddr/1]). -export([res_gethostbyaddr/2,res_hostent_by_domain/3]). +-export([res_update_conf/0, res_update_hosts/0]). %% inet help functions -export([tolower/1]). -ifdef(DEBUG). @@ -70,17 +74,19 @@ -define(dbg(Fmd, Args), ok). -endif. --import(lists, [member/2, foreach/2, reverse/1, keydelete/3]). +-include_lib("kernel/include/file.hrl"). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2]). -record(state, - { - db, %% resolver data - cache, %% bag of resource records - hosts, %% hosts table - cache_timer %% timer reference for refresh + {db, %% resolver data + cache, %% bag of resource records + hosts_byname, %% hosts table + hosts_byaddr, %% hosts table + hosts_file_byname, %% hosts table from system file + hosts_file_byaddr, %% hosts table from system file + cache_timer %% timer reference for refresh }). -include("inet.hrl"). @@ -89,7 +95,6 @@ -include("inet_dns.hrl"). -include("inet_config.hrl"). - %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- @@ -128,7 +133,7 @@ add_hosts(File) -> case inet_parse:hosts(File) of {ok, Res} -> - foreach( + lists:foreach( fun({IP, Name, Aliases}) -> add_host(IP, [Name|Aliases]) end, Res); Error -> Error @@ -145,53 +150,57 @@ add_ns(IP) -> add_ns(IP,?NAMESERVER_PORT). add_ns(IP,Port) -> - call({add_ns, IP, Port}). + call({listop, nameservers, add, {IP,Port}}). %% insert at head of name server list ins_ns(IP) -> - call({ins_ns, IP, ?NAMESERVER_PORT}). + ins_ns(IP, ?NAMESERVER_PORT). ins_ns(IP,Port) -> - call({ins_ns, IP,Port}). + call({listop, nameservers, ins, {IP,Port}}). %% delete this name server entry (delete all ns having this ip) del_ns(IP) -> - call({del_ns, IP}). + del_ns(IP, ?NAMESERVER_PORT). +del_ns(IP, Port) -> + call({listop, nameservers, del, {IP,Port}}). del_ns() -> - call(del_ns). + call({listdel, nameservers}). %% ALTERNATIVE NAME SERVER %% add to the end of name server list add_alt_ns(IP) -> add_alt_ns(IP, ?NAMESERVER_PORT). add_alt_ns(IP,Port) -> - call({add_alt_ns, IP,Port}). + call({listop, alt_nameservers, add, {IP,Port}}). %% insert at head of name server list ins_alt_ns(IP) -> ins_alt_ns(IP, ?NAMESERVER_PORT). ins_alt_ns(IP,Port) -> - call({ins_alt_ns, IP,Port}). + call({listop, alt_nameservers, ins, {IP,Port}}). %% delete this name server entry del_alt_ns(IP) -> - call({del_alt_ns, IP}). + del_alt_ns(IP, ?NAMESERVER_PORT). +del_alt_ns(IP, Port) -> + call({listop, alt_nameservers, del, {IP,Port}}). del_alt_ns() -> - call(del_alt_ns). + call({listdel, alt_nameservers}). %% add this domain to the search list add_search(Domain) when is_list(Domain) -> - call({add_search, Domain}). + call({listop, search, add, Domain}). ins_search(Domain) when is_list(Domain) -> - call({ins_search, Domain}). + call({listop, search, ins, Domain}). del_search(Domain) -> - call({del_search, Domain}). + call({listop, search, del, Domain}). del_search() -> - call(del_search). + call({listdel, search}). %% set host name used by inet %% Should only be used by inet_config at startup! @@ -199,23 +208,32 @@ call({set_hostname, Name}). %% set default domain -set_domain(Domain) -> - call({set_domain, Domain}). +set_domain(Domain) -> res_option(domain, Domain). %% set lookup methods -set_lookup(Methods) -> - call({set_lookup, Methods}). +set_lookup(Methods) -> res_option(lookup, Methods). %% resolver -set_recurse(Flag) -> call({set_recurse, Flag}). +set_recurse(Flag) -> res_option(recurse, Flag). + +set_timeout(Time) -> res_option(timeout, Time). + +set_retry(N) -> res_option(retry, N). + +set_inet6(Bool) -> res_option(inet6, Bool). -set_timeout(Time) -> call({set_timeout, Time}). +set_usevc(Bool) -> res_option(usevc, Bool). -set_retry(N) -> call({set_retry, N}). +set_edns(Version) -> res_option(edns, Version). -set_inet6(Bool) -> call({set_inet6,Bool}). +set_udp_payload_size(Size) -> res_option(udp_payload_size, Size). -set_usevc(Bool) -> call({set_usevc,Bool}). +set_resolv_conf(Fname) -> res_option(resolv_conf, Fname). + +set_hosts_file(Fname) -> res_option(hosts_file, Fname). + +get_hosts_file() -> + get_rc_hosts([], [], inet_hosts_file_byname). %% set socks options set_socks_server(Server) -> call({set_socks_server, Server}). @@ -252,7 +270,6 @@ sctp_module()-> db_get(sctp_module). - %% Add an inetrc file add_rc(File) -> case file:consult(File) of @@ -269,69 +286,9 @@ {error, badarg} end. -add_rc_list(List) -> - case catch add_rc_list_int(List) of - {'EXIT', Reason} -> {error, Reason}; - Value -> Value - end. - -add_rc_list_int(List) -> - foreach( - fun({domain, Name}) -> - set_domain(Name); - ({nameserver,Ns}) -> - add_ns(Ns); - ({nameserver,Ns,Port}) -> - add_ns(Ns,Port); - ({alt_nameserver,Ns}) -> - add_alt_ns(Ns); - ({alt_nameserver,Ns,Port}) -> - add_alt_ns(Ns,Port); - ({socks5_server,Server}) -> - set_socks_server(Server); - ({socks5_port,Port}) -> - set_socks_port(Port); - ({socks5_methods, Ms}) -> - add_socks_methods(Ms); - ({socks5_noproxy, IP, Mask}) -> - add_socks_noproxy({IP,Mask}); - ({search, Ds}) -> - foreach(fun(Domain) -> add_search(Domain) end, Ds); - ({host, IP, Aliases}) -> - add_host(IP, Aliases); - ({cache_refresh, Time}) -> - set_cache_refresh(Time); - ({cache_size, Size}) -> - set_cache_size(Size); - ({timeout, Time}) -> - set_timeout(Time); - ({retry, N}) -> - set_retry(N); - ({inet6, Bool}) -> - set_inet6(Bool); - ({udp, Module}) -> - set_udp_module(Module); - ({sctp,Module}) -> - set_sctp_module(Module); - ({tcp, Module}) -> - set_tcp_module(Module); - (reset) -> - reset(); %% reset before loading new defs - (clear_cache) -> - clear_cache(); - (clear_hosts) -> - clear_hosts(); - (clear_ns) -> - del_ns(), - del_alt_ns(); - (clear_search) -> - del_search(); - ({lookup, Ls}) -> - set_lookup(translate_lookup(Ls)); - (Opt) -> - throw({error, {badopt, Opt}}) - end, List), - ok. +add_rc_list(List) -> call({add_rc_list, List}). + + %% All kind of flavors ! translate_lookup(["bind" | Ls]) -> [dns | translate_lookup(Ls)]; @@ -347,24 +304,33 @@ translate_lookup([_ | Ls]) -> translate_lookup(Ls); translate_lookup([]) -> []. +valid_lookup() -> [dns, file, yp, nis, nisplus, native]. + + %% Reconstruct an inetrc sturcture from inet_db get_rc() -> - get_rc([hosts, domain, nameserver, search, alt_nameserver, + get_rc([hosts, domain, nameservers, search, alt_nameservers, timeout, retry, inet6, usevc, + edns, udp_payload_size, resolv_conf, hosts_file, socks5_server, socks5_port, socks5_methods, socks5_noproxy, udp, sctp, tcp, host, cache_size, cache_refresh, lookup], []). get_rc([K | Ks], Ls) -> case K of - hosts -> get_rc_hosts(Ks, Ls); + hosts -> get_rc_hosts(Ks, Ls, inet_hosts_byname); domain -> get_rc(domain, res_domain, "", Ks, Ls); - nameserver -> get_rc_ns(db_get(res_ns),nameserver,Ks,Ls); - alt_nameserver -> get_rc_ns(db_get(res_alt_ns),alt_nameserver,Ks,Ls); + nameservers -> get_rc_ns(db_get(res_ns),nameservers,Ks,Ls); + alt_nameservers -> get_rc_ns(db_get(res_alt_ns),alt_nameservers,Ks,Ls); search -> get_rc(search, res_search, [], Ks, Ls); timeout -> get_rc(timeout,res_timeout,?RES_TIMEOUT, Ks,Ls); retry -> get_rc(retry, res_retry, ?RES_RETRY, Ks, Ls); inet6 -> get_rc(inet6, res_inet6, false, Ks, Ls); usevc -> get_rc(usevc, res_usevc, false, Ks, Ls); + edns -> get_rc(edns, res_edns, false, Ks, Ls); + udp_payload_size -> get_rc(udp_payload_size, res_udp_payload_size, + ?DNS_UDP_PAYLOAD_SIZE, Ks, Ls); + resolv_conf -> get_rc(resolv_conf, res_resolv_conf, undefined, Ks, Ls); + hosts_file -> get_rc(hosts_file, res_hosts_file, undefined, Ks, Ls); tcp -> get_rc(tcp, tcp_module, ?DEFAULT_TCP_MODULE, Ks, Ls); udp -> get_rc(udp, udp_module, ?DEFAULT_UDP_MODULE, Ks, Ls); sctp -> get_rc(sctp, sctp_module, ?DEFAULT_SCTP_MODULE, Ks, Ls); @@ -384,14 +350,14 @@ get_rc(Ks, Ls) end; get_rc([], Ls) -> - reverse(Ls). + lists:reverse(Ls). get_rc(Name, Key, Default, Ks, Ls) -> case db_get(Key) of Default -> get_rc(Ks, Ls); Value -> get_rc(Ks, [{Name, Value} | Ls]) end. - + get_rc_noproxy([{Net,Mask} | Ms], Ks, Ls) -> get_rc_noproxy(Ms, Ks, [{socks5_noproxy, Net, Mask} | Ls]); get_rc_noproxy([], Ks, Ls) -> get_rc(Ks, Ls). @@ -403,24 +369,22 @@ get_rc_ns([], _Tag, Ks, Ls) -> get_rc(Ks, Ls). -get_rc_hosts(Ks, Ls) -> - Hosts = lists:map(fun({IP,_Ver,Aliases}) -> - {host,IP,Aliases} - end, ets:tab2list(inet_hosts)), - get_rc(Ks, Hosts++Ls). +get_rc_hosts(Ks, Ls, Tab) -> + case lists:keysort(3, ets:tab2list(Tab)) of + [] -> get_rc(Ks, Ls); + [{N,_,IP}|Hosts] -> get_rc_hosts(Ks, Ls, IP, Hosts, [N]) + end. + +get_rc_hosts(Ks, Ls, IP, [], Ns) -> + get_rc(Ks, [{host,IP,lists:reverse(Ns)}|Ls]); +get_rc_hosts(Ks, Ls, IP, [{N,_,IP}|Hosts], Ns) -> + get_rc_hosts(Ks, Ls, IP, Hosts, [N|Ns]); +get_rc_hosts(Ks, Ls, IP, [{N,_,NewIP}|Hosts], Ns) -> + [{host,IP,lists:reverse(Ns)}|get_rc_hosts(Ks, Ls, NewIP, Hosts, [N])]. %% %% Resolver options %% -res_option(nameserver) -> db_get(res_ns); -res_option(alt_nameserver) -> db_get(res_alt_ns); -res_option(domain) -> db_get(res_domain); -res_option(lookup) -> db_get(res_lookup); -res_option(recurse) -> db_get(res_recurse); -res_option(search) -> db_get(res_search); -res_option(retry) -> db_get(res_retry); -res_option(timeout) -> db_get(res_timeout); -res_option(inet6) -> db_get(res_inet6); res_option(next_id) -> Cnt = ets:update_counter(inet_db, res_id, 1), case Cnt band 16#ffff of @@ -430,7 +394,99 @@ Id -> Id end; -res_option(usevc) -> db_get(res_usevc). +res_option(Option) -> + case res_optname(Option) of + undefined -> + erlang:error(badarg, [Option]); + ResOptname -> + db_get(ResOptname) + end. + +res_option(Option, Value) -> + case res_optname(Option) of + undefined -> + erlang:error(badarg, [Option,Value]); + _ -> + call({res_set,Option,Value}) + end. + +res_optname(nameserver) -> res_ns; %% Legacy +res_optname(alt_nameserver) -> res_alt_ns; %% Legacy +res_optname(nameservers) -> res_ns; +res_optname(alt_nameservers) -> res_alt_ns; +res_optname(domain) -> res_domain; +res_optname(lookup) -> res_lookup; +res_optname(recurse) -> res_recurse; +res_optname(search) -> res_search; +res_optname(retry) -> res_retry; +res_optname(timeout) -> res_timeout; +res_optname(inet6) -> res_inet6; +res_optname(usevc) -> res_usevc; +res_optname(edns) -> res_edns; +res_optname(udp_payload_size) -> res_udp_payload_size; +res_optname(resolv_conf) -> res_resolv_conf; +res_optname(hosts_file) -> res_hosts_file; +res_optname(_) -> undefined. + +res_check_option(nameserver, NSs) -> %% Legacy + res_check_list(NSs, fun res_check_ns/1); +res_check_option(alt_nameserver, NSs) -> %% Legacy + res_check_list(NSs, fun res_check_ns/1); +res_check_option(nameservers, NSs) -> + res_check_list(NSs, fun res_check_ns/1); +res_check_option(alt_nameservers, NSs) -> + res_check_list(NSs, fun res_check_ns/1); +res_check_option(domain, Dom) -> + inet_parse:visible_string(Dom); +res_check_option(lookup, Methods) -> + try lists_subtract(Methods, valid_lookup()) of + [] -> true; + _ -> false + catch + error:_ -> false + end; +res_check_option(recurse, R) when R =:= 0; R =:= 1 -> true; %% Legacy +res_check_option(recurse, R) when is_boolean(R) -> true; +res_check_option(search, SearchList) -> + res_check_list(SearchList, fun res_check_search/1); +res_check_option(retry, N) when is_integer(N), N > 0 -> true; +res_check_option(timeout, T) when is_integer(T), T > 0 -> true; +res_check_option(inet6, Bool) when is_boolean(Bool) -> true; +res_check_option(usevc, Bool) when is_boolean(Bool) -> true; +res_check_option(edns, V) when V =:= false; V =:= 0 -> true; +res_check_option(udp_payload_size, S) when is_integer(S), S >= 512 -> true; +res_check_option(resolv_conf, "") -> true; +res_check_option(resolv_conf, F) -> + res_check_option_absfile(F); +res_check_option(hosts_file, "") -> true; +res_check_option(hosts_file, F) -> + res_check_option_absfile(F); +res_check_option(_, _) -> false. + +res_check_option_absfile(F) -> + try filename:pathtype(F) of + absolute -> true; + _ -> false + catch + _:_ -> false + end. + +res_check_list([], _Fun) -> true; +res_check_list([H|T], Fun) -> + case Fun(H) of + true -> res_check_list(T, Fun); + false -> false + end; +res_check_list(_, _Fun) -> false. + +res_check_ns({{A,B,C,D,E,F,G,H}, Port}) + when ?ip6(A,B,C,D,E,F,G,H), Port band 65535 =:= Port -> true; +res_check_ns({{A,B,C,D}, Port}) + when ?ip(A,B,C,D), Port band 65535 =:= Port -> true; +res_check_ns(_) -> false. + +res_check_search("") -> true; +res_check_search(Dom) -> inet_parse:visible_string(Dom). socks_option(server) -> db_get(socks5_server); socks_option(port) -> db_get(socks5_port); @@ -439,6 +495,45 @@ gethostname() -> db_get(hostname). +res_update_conf() -> + res_update(res_resolv_conf, res_resolv_conf_tm, res_resolv_conf_info, + set_resolv_conf_tm, fun set_resolv_conf/1). + +res_update_hosts() -> + res_update(res_hosts_file, res_hosts_file_tm, res_hosts_file_info, + set_hosts_file_tm, fun set_hosts_file/1). + +res_update(Tag, TagTm, TagInfo, CallTag, SetFun) -> + case db_get(TagTm) of + undefined -> ok; + TM -> + case times() of + Now when Now >= TM + ?RES_FILE_UPDATE_TM -> + case db_get(Tag) of + undefined -> + SetFun(""); + "" -> + SetFun(""); + File -> + case erl_prim_loader:read_file_info(File) of + {ok, Finfo0} -> + Finfo = + Finfo0#file_info{access = undefined, + atime = undefined}, + case db_get(TagInfo) of + Finfo -> + call({CallTag, Now}); + _ -> + SetFun(File) + end; + _ -> + call({CallTag, Now}), + error + end + end; + _ -> ok + end + end. db_get(Name) -> case ets:lookup(inet_db, Name) of @@ -459,7 +554,9 @@ bm = '_', func = '_', data = Data}}). res_cache_answer(Rec) -> - foreach( fun(RR) -> add_rr(RR) end, Rec#dns_rec.anlist). + lists:foreach( fun(RR) -> add_rr(RR) end, Rec#dns_rec.anlist). + + %% @@ -711,6 +808,13 @@ %% res_id Integer - NS query identifier %% res_retry Integer - Retry count for UDP query %% res_timeout Integer - UDP query timeout before retry +%% res_inet6 Bool - address family inet6 for gethostbyname/1 +%% res_usevc Bool - use Virtual Circuit (TCP) +%% res_edns false|Integer - false or EDNS version +%% res_udp_payload_size Integer - size for EDNS, both query and reply +%% res_resolv_conf Filename - file to watch for resolver config i.e +%% {res_ns, res_search} +%% res_hosts_file Filename - file to watch for hosts config %% %% Socks5 options %% -------------- @@ -737,11 +841,18 @@ Db = ets:new(inet_db, [public, named_table]), reset_db(Db), Cache = ets:new(inet_cache, [public, bag, {keypos,2}, named_table]), - Hosts = ets:new(inet_hosts, [public, named_table]), - {ok, #state{ - db = Db, + BynameOpts = [protected, bag, named_table, {keypos,1}], + ByaddrOpts = [protected, bag, named_table, {keypos,3}], + HostsByname = ets:new(inet_hosts_byname, BynameOpts), + HostsByaddr = ets:new(inet_hosts_byaddr, ByaddrOpts), + HostsFileByname = ets:new(inet_hosts_file_byname, BynameOpts), + HostsFileByaddr = ets:new(inet_hosts_file_byaddr, ByaddrOpts), + {ok, #state{db = Db, cache = Cache, - hosts = Hosts, + hosts_byname = HostsByname, + hosts_byaddr = HostsByaddr, + hosts_file_byname = HostsFileByname, + hosts_file_byaddr = HostsFileByaddr, cache_timer = init_timer() }}. reset_db(Db) -> @@ -751,12 +862,14 @@ ets:insert(Db, {res_search, []}), ets:insert(Db, {res_domain, ""}), ets:insert(Db, {res_lookup, []}), - ets:insert(Db, {res_recurse, 1}), + ets:insert(Db, {res_recurse, true}), ets:insert(Db, {res_usevc, false}), ets:insert(Db, {res_id, 0}), ets:insert(Db, {res_retry, ?RES_RETRY}), ets:insert(Db, {res_timeout, ?RES_TIMEOUT}), ets:insert(Db, {res_inet6, false}), + ets:insert(Db, {res_edns, false}), + ets:insert(Db, {res_udp_payload_size, ?DNS_UDP_PAYLOAD_SIZE}), ets:insert(Db, {cache_size, ?CACHE_LIMIT}), ets:insert(Db, {cache_refresh_interval,?CACHE_REFRESH}), ets:insert(Db, {socks5_server, ""}), @@ -776,60 +889,45 @@ %% {stop, Reason, Reply, State} | (terminate/2 is called) %% {stop, Reason, Reply, State} (terminate/2 is called) %%---------------------------------------------------------------------- -handle_call(Request, _From, State) -> - Db = State#state.db, +handle_call(Request, From, #state{db=Db}=State) -> case Request of - %% temporary special case used only by inet_config to - %% add the own hostname as an alias for localhost if the real - %% IP adress is not specified anywhere - %% This code will be changed when the hosts-table is reorganized - %% to use names as keys - {add_host,{127,0,0,1},[TName|TAs]} when is_list(TName), is_list(TAs) -> - [Name|As] = [tolower(N) || N <- [TName|TAs]], - NameList = case ets:lookup(State#state.hosts,{127,0,0,1}) of - [{_IP,_,NList}] -> NList; - _ -> [] - end, - Ns = [N || N <- [Name|As], not member(N, NameList)], - ets:insert(State#state.hosts, {{127,0,0,1},inet,NameList ++ Ns}), - {reply, ok, State}; - - {add_host,IP,[TName|TAs]} when is_tuple(IP), is_list(TName), is_list(TAs) -> - As = [tolower(N) || N <- [TName|TAs]], - As1 = - case ets:lookup(State#state.hosts, IP) of - [{IP,_,PrevAs}] -> - lists:foldl(fun(A,L) -> - lists:delete(A,L) - end, PrevAs, As) ++ As; - [] -> - As - end, - if tuple_size(IP) =:= 4 -> - %% temporary special as above - case ets:lookup(State#state.hosts,{127,0,0,1}) of - [{IP,_,AList}] -> - ets:insert(State#state.hosts, - {{127,0,0,1},inet, - lists:foldl(fun(A,L) -> - lists:delete(A,L) - end, AList, As1)}); - _ -> true - end, - %% end temporary special - ets:insert(State#state.hosts, {IP,inet,As1}), - {reply, ok, State}; - tuple_size(IP) =:= 8 -> - ets:insert(State#state.hosts, {IP,inet6,As1}), - {reply, ok, State}; - true -> - {reply, error, State} - end; - - {del_host, IP} when is_tuple(IP) -> - ets:delete(State#state.hosts, IP), + {load_hosts_file,IPNmAs} when is_list(IPNmAs) -> + NIPs = lists:flatten([ [{N,if tuple_size(IP) =:= 4 -> inet; + tuple_size(IP) =:= 8 -> inet6 + end,IP} || N <- [Nm|As]] + || {IP,Nm,As} <- IPNmAs]), + Byname = State#state.hosts_file_byname, + Byaddr = State#state.hosts_file_byaddr, + ets:delete_all_objects(Byname), + ets:delete_all_objects(Byaddr), + ets:insert(Byname, NIPs), + ets:insert(Byaddr, NIPs), + {reply, ok, State}; + + {add_host,{A,B,C,D}=IP,[N|As]=Names} + when ?ip(A,B,C,D), is_list(N), is_list(As) -> + do_add_host(State#state.hosts_byname, + State#state.hosts_byaddr, + Names, inet, IP), + {reply, ok, State}; + {add_host,{A,B,C,D,E,F,G,H}=IP,[N|As]=Names} + when ?ip6(A,B,C,D,E,F,G,H), is_list(N), is_list(As) -> + do_add_host(State#state.hosts_byname, + State#state.hosts_byaddr, + Names, inet6, IP), + {reply, ok, State}; + + {del_host,{A,B,C,D}=IP} when ?ip(A,B,C,D) -> + do_del_host(State#state.hosts_byname, + State#state.hosts_byaddr, + IP), + {reply, ok, State}; + {del_host,{A,B,C,D,E,F,G,H}=IP} when ?ip6(A,B,C,D,E,F,G,H) -> + do_del_host(State#state.hosts_byname, + State#state.hosts_byaddr, + IP), {reply, ok, State}; - + {add_rr, RR} when is_record(RR, dns_rr) -> RR1 = lower_rr(RR), ?dbg("add_rr: ~p~n", [RR1]), @@ -846,85 +944,26 @@ {lookup_rr, Domain, Class, Type} -> {reply, do_lookup_rr(Domain, Class, Type), State}; - %% XXX Fix IPv6 nameservers - {ins_ns, {A,B,C,D},Port} when ?ip(A,B,C,D), is_integer(Port) -> - [{_,Ns}] = ets:lookup(Db, res_ns), - ets:insert(Db, {res_ns, [{{A,B,C,D},Port} | Ns]}), - {reply, ok, State}; - - {add_ns, {A,B,C,D}, Port} when ?ip(A,B,C,D), is_integer(Port) -> - [{_,Ns}] = ets:lookup(Db, res_ns), - ets:insert(Db, {res_ns, Ns ++ [{{A,B,C,D},Port}]}), - {reply, ok, State}; - - {del_ns, {A,B,C,D}} when ?ip(A,B,C,D) -> - [{_,Ns}] = ets:lookup(Db, res_ns), - ets:insert(Db, {res_ns, keydelete({A,B,C,D}, 1, Ns)}), - {reply, ok, State}; - - del_ns -> - ets:insert(Db, {res_ns, []}), - {reply, ok, State}; - - %% Fix IPv6 nameservers - {ins_alt_ns, {A,B,C,D}, Port} when ?ip(A,B,C,D), is_integer(Port) -> - [{_,Ns}] = ets:lookup(Db, res_alt_ns), - ets:insert(Db, {res_alt_ns, [{{A,B,C,D},Port} | Ns]}), - {reply, ok, State}; - - {add_alt_ns, {A,B,C,D}, Port} when ?ip(A,B,C,D), is_integer(Port) -> - [{_,Ns}] = ets:lookup(Db, res_alt_ns), - ets:insert(Db, {res_alt_ns, Ns ++ [{{A,B,C,D},Port}]}), - {reply, ok, State}; - - {del_alt_ns, {A,B,C,D}} when ?ip(A,B,C,D) -> - [{_,Ns}] = ets:lookup(Db, res_alt_ns), - ets:insert(Db, {res_alt_ns, keydelete({A,B,C,D}, 1, Ns)}), - {reply, ok, State}; - - del_alt_ns -> - ets:insert(Db, {res_alt_ns, []}), - {reply, ok, State}; - - {ins_search, Dom} -> - case inet_parse:visible_string(Dom) of - false when Dom =/= [] -> %% Allow "" for root domain - {reply, error, State}; - _ -> - [{_,Ds}] = ets:lookup(Db, res_search), - Ds1 = lists:delete(Dom, Ds), - ets:insert(Db, {res_search, [Dom | Ds1]}), - {reply, ok, State} - end; - - {add_search, Dom} -> - case inet_parse:visible_string(Dom) of - false when Dom =/= [] -> %% Allow "" for root domain - {reply, error, State}; - _ -> - [{_,Ds}] = ets:lookup(Db, res_search), - case member(Dom, Ds) of - true -> - {reply, ok, State}; - false -> - ets:insert(Db, {res_search, Ds ++ [Dom]}), - {reply, ok, State} - end + {listop, Opt, Op, E} -> + El = [E], + case res_check_option(Opt, El) of + true -> + Optname = res_optname(Opt), + [{_,Es}] = ets:lookup(Db, Optname), + NewEs = case Op of + ins -> [E | lists_delete(E, Es)]; + add -> lists_delete(E, Es) ++ El; + del -> lists_delete(E, Es) + end, + ets:insert(Db, {Optname, NewEs}), + {reply,ok,State}; + false -> + {reply,error,State} end; - {del_search, Dom} -> - case inet_parse:visible_string(Dom) of - false when Dom =/= [] -> %% Allow "" for root domain - {reply, error, State}; - _ -> - [{_,Ds}] = ets:lookup(Db, res_search), - ets:insert(Db, {res_search, Ds -- [Dom]}), - {reply, ok, State} - end; - - del_search -> - ets:insert(Db, {res_search, []}), - {reply, ok, State}; + {listdel, Opt} -> + ets:insert(Db, {res_optname(Opt), []}), + {reply, ok, State}; {set_hostname, Name} -> case inet_parse:visible_string(Name) of @@ -935,49 +974,58 @@ {reply, error, State} end; - {set_domain, Dom} -> - case inet_parse:visible_string(Dom) of - true -> - ets:insert(Db, {res_domain, Dom}), - {reply, ok, State}; - false -> - {reply, error, State} + {res_set, hosts_file=Option, Fname} -> + handle_set_file(Option, Fname, + res_hosts_file_tm, res_hosts_file_info, + fun (Bin) -> + case inet_parse:hosts(Fname, + {chars,Bin}) of + {ok,Opts} -> + [{load_hosts_file,Opts}]; + _ -> error + end + end, + From, State); + %% + {res_set, resolv_conf=Option, Fname} -> + handle_set_file(Option, Fname, + res_resolv_conf_tm, res_resolv_conf_info, + fun (Bin) -> + case inet_parse:resolv(Fname, + {chars,Bin}) of + {ok,Opts} -> + [del_ns, + clear_search, + clear_cache + |[Opt || + {T,_}=Opt <- Opts, + (T =:= nameserver orelse + T =:= search)]]; + _ -> error + end + end, + From, State); + %% + {res_set, Opt, Value} -> + case res_optname(Opt) of + undefined -> + {reply, error, State}; + Optname -> + case res_check_option(Opt, Value) of + true -> + ets:insert(Db, {Optname, Value}), + {reply, ok, State}; + false -> + {reply, error, State} + end end; - {set_lookup, Methods} -> - ets:insert(Db, {res_lookup, Methods}), - {reply, ok, State}; - - {set_recurse, 1} -> - ets:insert(Db, {res_recurse, 1}), - {reply, ok, State}; - - {set_recurse, 0} -> - ets:insert(Db, {res_recurse, 0}), - {reply, ok, State}; - - {set_timeout, Time} when is_integer(Time), Time > 0 -> - ets:insert(Db, {res_timeout, Time}), - {reply, ok, State}; - - {set_retry, N} when is_integer(N), N > 0 -> - ets:insert(Db, {res_retry, N}), - {reply, ok, State}; - - {set_inet6, true} -> - ets:insert(Db, {res_inet6, true}), - {reply, ok, State}; - - {set_inet6, false} -> - ets:insert(Db, {res_inet6, false}), - {reply, ok, State}; - - {set_usevc, true} -> - ets:insert(Db, {res_usevc, true}), + {set_resolv_conf_tm, TM} -> + ets:insert(Db, {res_resolv_conf_tm, TM}), {reply, ok, State}; - {set_usevc, false} -> - ets:insert(Db, {res_usevc, false}), + {set_hosts_file_tm, TM} -> + ets:insert(Db, {res_hosts_file_tm, TM}), {reply, ok, State}; {set_socks_server, {A,B,C,D}} when ?ip(A,B,C,D) -> @@ -990,14 +1038,14 @@ {add_socks_methods, Ls} -> [{_,As}] = ets:lookup(Db, socks5_methods), - As1 = As -- Ls, + As1 = lists_subtract(As, Ls), ets:insert(Db, {socks5_methods, As1 ++ Ls}), {reply, ok, State}; {del_socks_methods, Ls} -> [{_,As}] = ets:lookup(Db, socks5_methods), - As1 = As -- Ls, - case member(none, As1) of + As1 = lists_subtract(As, Ls), + case lists:member(none, As1) of false -> ets:insert(Db, {socks5_methods, As1 ++ [none]}); true -> ets:insert(Db, {socks5_methods, As1}) end, @@ -1013,9 +1061,9 @@ ets:insert(Db, {socks5_noproxy, As++[{{A,B,C,D},{MA,MB,MC,MD}}]}), {reply, ok, State}; - {del_socks_noproxy, {A,B,C,D}} when ?ip(A,B,C,D) -> + {del_socks_noproxy, {A,B,C,D}=IP} when ?ip(A,B,C,D) -> [{_,As}] = ets:lookup(Db, socks5_noproxy), - ets:insert(Db, {socks5_noproxy, keydelete({A,B,C,D},1,As)}), + ets:insert(Db, {socks5_noproxy, lists_keydelete(IP, 1, As)}), {reply, ok, State}; {set_tcp_module, Mod} when is_atom(Mod) -> @@ -1027,7 +1075,7 @@ {reply, ok, State}; {set_sctp_module, Fam} when is_atom(Fam) -> - ets:insert(Db, {sctp_module, Fam}), + ets:insert(Db, {sctp_module, Fam}), %% check/load module ? {reply, ok, State}; {set_cache_size, Size} when is_integer(Size), Size >= 0 -> @@ -1041,7 +1089,8 @@ {reply, ok, State#state{cache_timer = init_timer()}}; clear_hosts -> - ets:match_delete(State#state.hosts, '_'), + ets:delete_all_objects(State#state.hosts_byname), + ets:delete_all_objects(State#state.hosts_byaddr), {reply, ok, State}; clear_cache -> @@ -1053,6 +1102,9 @@ stop_timer(State#state.cache_timer), {reply, ok, State#state{cache_timer = init_timer()}}; + {add_rc_list, List} -> + handle_rc_list(List, From, State); + stop -> {stop, normal, ok, State}; @@ -1096,6 +1148,157 @@ %%% Internal functions %%%---------------------------------------------------------------------- +handle_set_file(Option, Fname, TagTm, TagInfo, ParseFun, From, + #state{db=Db}=State) -> + case res_check_option(Option, Fname) of + true when Fname =:= "" -> + ets:insert(Db, {res_optname(Option), Fname}), + ets:delete(Db, TagInfo), + ets:delete(Db, TagTm), + handle_set_file(ParseFun, <<>>, From, State); + true -> + File = filename:flatten(Fname), + ets:insert(Db, {res_optname(Option), File}), + Bin = + case erl_prim_loader:read_file_info(File) of + {ok, Finfo0} -> + Finfo = Finfo0#file_info{access = undefined, + atime = undefined}, + ets:insert(Db, {TagInfo, Finfo}), + ets:insert(Db, {TagTm, times()}), + case erl_prim_loader:get_file(File) of + {ok, B, _} -> B; + _ -> <<>> + end; + _ -> <<>> + end, + handle_set_file(ParseFun, Bin, From, State); + false -> {reply,error,State} + end. + +handle_set_file(ParseFun, Bin, From, State) -> + case ParseFun(Bin) of + error -> {reply,error,State}; + Opts -> + handle_rc_list(Opts, From, State) + end. + +do_add_host(Byname, Byaddr, Names, Type, IP) -> + do_del_host(Byname, Byaddr, IP), + NIPs = [{tolower(N),Type,IP} || N <- Names], + ets:insert(Byname, NIPs), + ets:insert(Byaddr, NIPs), + ok. + +do_del_host(Byname, Byaddr, IP) -> + [ets:delete_object(Byname, NIP) || NIP <- ets:lookup(Byaddr, IP)], + ets:delete(Byaddr, IP), + ok. + +%% Loop over .inetrc option list and call handle_call/3 for each +%% +handle_rc_list([], _From, State) -> + {reply, ok, State}; +handle_rc_list([Opt|Opts], From, State) -> + case rc_opt_req(Opt) of + undefined -> + {reply, {error,{badopt,Opt}}, State}; + Req -> + case handle_calls(Req, From, State) of + {reply, ok, NewState} -> + handle_rc_list(Opts, From, NewState); + Result -> Result + end + end; +handle_rc_list(_, _From, State) -> + {reply, error, State}. + +handle_calls([], _From, State) -> + {reply, ok, State}; +handle_calls([Req|Reqs], From, State) -> + case handle_call(Req, From, State) of + {reply, ok, NewState} -> + handle_calls(Reqs, From, NewState); + {reply, _, NewState} -> + {reply, error, NewState} + %% {noreply,_} is currently not returned by handle_call/3 + end; +handle_calls(Req, From, State) -> + handle_call(Req, From, State). + +%% Translate .inetrc option into gen_server request +%% +rc_opt_req({nameserver, Ns}) -> + {listop,nameservers,add,{Ns,?NAMESERVER_PORT}}; +rc_opt_req({nameserver, Ns, Port}) -> + {listop,nameservers,add,{Ns,Port}}; +rc_opt_req({alt_nameserver, Ns}) -> + {listop,alt_nameservers,add,{Ns,?NAMESERVER_PORT}}; +rc_opt_req({alt_nameserver, Ns, Port}) -> + {listop,alt_nameservers,add,{Ns,Port}}; +rc_opt_req({socks5_noproxy, IP, Mask}) -> + {add_socks_noproxy, {IP, Mask}}; +rc_opt_req({search, Ds}) when is_list(Ds) -> + try [{listop,search,add,D} || D <- Ds] + catch error:_ -> undefined + end; +rc_opt_req({host, IP, Aliases}) -> {add_host, IP, Aliases}; +rc_opt_req({load_hosts_file, _}=Req) -> Req; +rc_opt_req({lookup, Ls}) -> + try {res_set, lookup, translate_lookup(Ls)} + catch error:_ -> undefined + end; +rc_opt_req({Name,Arg}) -> + case rc_reqname(Name) of + undefined -> + case is_res_set(Name) of + true -> {res_set,Name,Arg}; + false -> undefined + end; + Req -> {Req, Arg} + end; +rc_opt_req(del_ns) -> + {listdel,nameservers}; +rc_opt_req(del_alt_ns) -> + {listdel,alt_nameservers}; +rc_opt_req(clear_ns) -> + [{listdel,nameservers},{listdel,alt_nameservers}]; +rc_opt_req(clear_search) -> + {listdel,search}; +rc_opt_req(Opt) when is_atom(Opt) -> + case is_reqname(Opt) of + true -> Opt; + false -> undefined + end; +rc_opt_req(_) -> undefined. +%% +rc_reqname(socks5_server) -> set_socks_server; +rc_reqname(socks5_port) -> set_socks_port; +rc_reqname(socks5_methods) -> set_socks_methods; +rc_reqname(cache_refresh) -> set_cache_refresh; +rc_reqname(cache_size) -> set_cache_size; +rc_reqname(udp) -> set_udp_module; +rc_reqname(sctp) -> set_sctp_module; +rc_reqname(tcp) -> set_tcp_module; +rc_reqname(_) -> undefined. +%% +is_res_set(domain) -> true; +is_res_set(lookup) -> true; +is_res_set(timeout) -> true; +is_res_set(retry) -> true; +is_res_set(inet6) -> true; +is_res_set(usevc) -> true; +is_res_set(edns) -> true; +is_res_set(udp_payload_size) -> true; +is_res_set(resolv_conf) -> true; +is_res_set(hosts_file) -> true; +is_res_set(_) -> false. +%% +is_reqname(reset) -> true; +is_reqname(clear_cache) -> true; +is_reqname(clear_hosts) -> true; +is_reqname(_) -> false. + %% Add a resource record to the cache if there are space left. %% If the cache is full this function first deletes old entries, %% i.e. entries with oldest latest access time. @@ -1159,13 +1362,13 @@ end. %% -%% Map upper-case to lower-case +%% Map upper-case to lower-case %% NOTE: this code is in kernel and we don't want to relay %% to much on stdlib %% -tolower([C|Cs]) when C >= $A, C =< $Z -> [(C-$A)+$a | tolower(Cs)]; -tolower([C|Cs]) -> [C | tolower(Cs)]; -tolower([]) -> []. +tolower([]) -> []; +tolower([C|Cs]) when C >= $A, C =< $Z -> [(C-$A)+$a|tolower(Cs)]; +tolower([C|Cs]) -> [C|tolower(Cs)]. dn_ip6_int(A,B,C,D,E,F,G,H) -> dnib(H) ++ dnib(G) ++ dnib(F) ++ dnib(E) ++ @@ -1300,3 +1503,23 @@ end, M1 = lists:foldl(Fun, M, ets:lookup(CacheDb, Domain)), delete_older(Next, CacheDb, TM, N, M1). + + +%% as lists:delete/2, but delete all exact matches +%% +lists_delete(_, []) -> []; +lists_delete(E, [E|Es]) -> + lists_delete(E, Es); +lists_delete(E, [X|Es]) -> + [X|lists_delete(E, Es)]. + +%% as '--'/2 aka lists:subtract/2 but delete all exact matches +lists_subtract(As0, Bs) -> + lists:foldl(fun (E, As) -> lists_delete(E, As) end, As0, Bs). + +%% as lists:keydelete/3, but delete all _exact_ key matches +lists_keydelete(_, _, []) -> []; +lists_keydelete(K, N, [T|Ts]) when element(N, T) =:= K -> + lists_keydelete(K, N, Ts); +lists_keydelete(K, N, [X|Ts]) -> + [X|lists_keydelete(K, N, Ts)]. diff -Nru erlang-13.b.1-dfsg/lib/kernel/src/inet_dns.erl erlang-13.b.3-dfsg/lib/kernel/src/inet_dns.erl --- erlang-13.b.1-dfsg/lib/kernel/src/inet_dns.erl 2009-04-16 10:23:49.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/src/inet_dns.erl 2009-09-18 15:07:37.000000000 +0100 @@ -18,236 +18,276 @@ %% -module(inet_dns). -%% Dns record enocde/decode +%% Dns record encode/decode +%% +%% RFC 1035: Domain Names - Implementation and Specification +%% RFC 2181: Clarifications to the DNS Specification +%% RFC 2671: Extension Mechanisms for DNS (EDNS0) +%% RFC 2782: A DNS RR for specifying the location of services (DNS SRV) +%% RFC 2915: The Naming Authority Pointer (NAPTR) DNS Resource Rec -export([decode/1, encode/1]). --export([decode_header/1, encode_header/1]). --export([number_of_queries/1, number_of_answers/1, - number_of_authority/1, number_of_resources/1]). -import(lists, [reverse/1, reverse/2, nthtail/2]). -include("inet_int.hrl"). -include("inet_dns.hrl"). -%% get N bits from X starting at bit B --define(bitf(X, N, B), (((X) bsr (B)) band ((1 bsl (N))-1))). +-export([record_type/1, rr/1, rr/2]). +-export([make_rr/0, make_rr/1, make_rr/2, make_rr/3]). +%% ADTs exports. The make_* functions are undocumented. +-export([msg/1, msg/2, + make_msg/0, make_msg/1, make_msg/2, make_msg/3]). +-export([header/1, header/2, + make_header/0, make_header/1, make_header/2, make_header/3]). +-export([dns_query/1, dns_query/2, + make_dns_query/0, make_dns_query/1, + make_dns_query/2, make_dns_query/3]). +-include("inet_dns_record_adts.hrl"). + +%% Function merge of #dns_rr{} and #dns_rr_opt{} +%% + +record_type(#dns_rr{}) -> rr; +record_type(#dns_rr_opt{}) -> rr; +record_type(Rec) -> + record_adts(Rec). + +rr(#dns_rr{}=RR) -> dns_rr(RR); +rr(#dns_rr_opt{}=RR) -> dns_rr_opt(RR). + +rr(#dns_rr{}=RR, L) -> dns_rr(RR, L); +rr(#dns_rr_opt{}=RR, L) -> dns_rr_opt(RR, L). + +make_rr() -> make_dns_rr(). + +make_rr(L) when is_list(L) -> + case rr_type(L, any) of + opt -> make_dns_rr_opt(L); + _ -> make_dns_rr(L) + end. + +make_rr(type, opt) -> make_dns_rr_opt(); +make_rr(F, V) when is_atom(F) -> make_dns_rr(F, V); +make_rr(#dns_rr{}=RR, L) when is_list(L) -> + case rr_type(L, RR#dns_rr.type) of + opt -> + Ts = common_fields__rr__rr_opt(), + make_dns_rr_opt([Opt || {T,_}=Opt <- dns_rr(RR), + lists_member(T, Ts)] ++ L); + _ -> make_dns_rr(RR, L) + end; +make_rr(#dns_rr_opt{}=RR, L) when is_list(L) -> + case rr_type(L, RR#dns_rr_opt.type) of + opt -> + make_dns_rr_opt(RR, L); + _ -> + Ts = common_fields__rr__rr_opt(), + make_dns_rr([Opt || {T,_}=Opt <- dns_rr_opt(RR), + lists_member(T, Ts)] ++ L) + end. + +make_rr(#dns_rr{}=RR, type, opt) -> make_rr(RR, [{type,opt}]); +make_rr(#dns_rr{}=RR, F, V) -> make_dns_rr(RR, F, V); +make_rr(#dns_rr_opt{}=RR, type, opt) -> RR; +make_rr(#dns_rr_opt{}=RR, type, T) -> make_rr(RR, [{type,T}]); +make_rr(#dns_rr_opt{}=RR, F, V) -> make_dns_rr_opt(RR, F, V). + +-compile({inline, [rr_type/2]}). +rr_type([], T) -> T; +rr_type([{type,T}|Opts], _) -> rr_type(Opts, T); +rr_type([_|Opts], T) -> rr_type(Opts, T). + +common_fields__rr__rr_opt() -> + [T || T <- record_info(fields, dns_rr_opt), + lists_member(T, record_info(fields, dns_rr))]. + +-compile({inline, [lists_member/2]}). +lists_member(_, []) -> false; +lists_member(H, [H|_]) -> true; +lists_member(H, [_|T]) -> lists_member(H, T). + --define(tolower(C), - if (C) >= $A, (C) =< $Z -> ((C)-$A)+$a; - true -> C - end). + +-define(DECODE_ERROR, fmt). % must match a clause in inet_res:query_nss_e?dns %% %% Decode a dns buffer. %% -decode(Buffer) -> - case decode_header(Buffer) of - {ok, H, [QD1,QD0,AN1,AN0,NS1,NS0,AR1,AR0 | Ptr0]} -> - Qd = ?u16(QD1, QD0), - An = ?u16(AN1, AN0), - Ns = ?u16(NS1, NS0), - Ar = ?u16(AR1, AR0), - case decode_sections(Qd, An, Ns, Ar, Buffer, Ptr0) of - {ok, {QdList,AnList,NsList,ArList}} -> - {ok, #dns_rec { - header = H, - qdlist = QdList, - anlist = AnList, - nslist = NsList, - arlist = ArList }}; - Error -> Error - end; - Error -> Error - end. - - -decode_header([ID1,ID0,F1,F0 | Rest]) -> - H = #dns_header { - id = ?u16(ID1,ID0), - %% Flag byte 0 - qr = ?bitf(F1, 1, 7), - opcode = ?bitf(F1, 4, 3), - aa = ?bitf(F1, 1, 2), - tc = ?bitf(F1, 1, 1), - rd = ?bitf(F1, 1, 0), - %% Flag byte 1 - ra = ?bitf(F0, 1, 7), - pr = ?bitf(F0, 1, 6), - rcode = ?bitf(F0, 4, 0) - }, - {ok, H, Rest}; -decode_header(_) -> {error, fmt}. - -number_of_queries(Packet) when length(Packet) >= 12 -> - [_,_,_,_, - QD0,QD1 | _] = Packet, - ?u16(QD0, QD1). - -number_of_answers(Packet) when length(Packet) >= 12 -> - [_,_,_,_, - _,_,AN0,AN1 | _] = Packet, - ?u16(AN0, AN1). - -number_of_authority(Packet) when length(Packet) >= 12 -> - [_,_,_,_, - _,_,_,_,NS0,NS1 | _] = Packet, - ?u16(NS0, NS1). - -number_of_resources(Packet) when length(Packet) >= 12 -> - [_,_,_,_, - _,_,_,_,_,_,AR0,AR1 | _] = Packet, - ?u16(AR0, AR1). - -decode_sections(Qd, An, Ns, Ar, Buffer, Ptr0) -> - case decode_query_section(Qd, Buffer, Ptr0) of - {ok, {QdList, Ptr1}} -> - case decode_res_section(An, Buffer, Ptr1) of - {ok, {AnList, Ptr2}} -> - case decode_res_section(Ns, Buffer, Ptr2) of - {ok, {NsList, Ptr3}} -> - case decode_res_section(Ar, Buffer, Ptr3) of - {ok, {ArList,_Ptr4}} -> - {ok, {QdList,AnList,NsList,ArList}}; - Error -> Error - end; - Error -> Error - end; - Error -> Error - end; - Error -> Error - end. - -%% -%% Decode queries -%% -decode_query_section(0, _, Ptr0) -> - { ok, {[], Ptr0}}; -decode_query_section(N, Buffer, Ptr0) when N >= 0 -> - decode_query_section(N, Buffer, Ptr0, []); -decode_query_section(_, _, _) -> - {error, fmt}. - -decode_query_section(0, _, Ptr, Ls) -> - { ok, {reverse(Ls), Ptr}}; -decode_query_section(Count, Buffer, Ptr0, Ls) -> - case dn_expand(Ptr0, Buffer) of - error -> - {error, fmt}; - {Name,_} -> - case dn_skip(Ptr0) of - [T0,T1,C0,C1 | Ptr1] -> - decode_query_section( - Count-1, Buffer, Ptr1, - [ #dns_query { - domain = Name, - type = decode_type(?i16(T0,T1)), - class = decode_class(?i16(C0,C1))} | Ls]); - _ -> {error, fmt} - end - end. -%% -%% Decode resources -%% -decode_res_section(0, _, Ptr0) -> - { ok, {[], Ptr0}}; -decode_res_section(N, Buffer, Ptr0) when N >= 0 -> - decode_res_section(N, Buffer, Ptr0, []); -decode_res_section(_, _, _) -> - {error, fmt}. - -decode_res_section(0, _, Ptr, Ls) -> - {ok, {reverse(Ls), Ptr}}; -decode_res_section(Count, Buffer, Ptr0, Ls) -> - case dn_expand(Ptr0, Buffer) of - error -> - {error, fmt}; - {Name,_} -> - case dn_skip(Ptr0) of - [T1,T0,C1,C0,TTL3,TTL2,TTL1,TTL0,L1,L0 | Ptr1] -> - Len = ?i16(L1,L0), - case get_data(Len, Ptr1) of - error -> {error, fmt}; - {Data, Ptr2} -> - Type = decode_type(?i16(T1,T0)), - Class = decode_class(?i16(C1,C0)), - NData = decode_data(Type, Class, Data, Buffer), - decode_res_section( - Count-1, Buffer, Ptr2, - [ - #dns_rr - { - domain = Name, - type = Type, - class = Class, - ttl = ?i32(TTL3,TTL2,TTL1,TTL0), - data = NData - } | Ls]) - end; - _ -> {error, fmt} - end +decode(Buffer) when is_binary(Buffer) -> + try do_decode(Buffer) of + DnsRec -> + {ok,DnsRec} + catch + Reason -> + {error,Reason} + end. + +do_decode(<>=Buffer) -> + {AnBuf,QdList} = decode_query_section(QdBuf,QdCount,Buffer), + {NsBuf,AnList} = decode_rr_section(AnBuf,AnCount,Buffer), + {ArBuf,NsList} = decode_rr_section(NsBuf,NsCount,Buffer), + {Rest,ArList} = decode_rr_section(ArBuf,ArCount,Buffer), + case Rest of + <<>> -> + DnsHdr = + #dns_header{id=Id, + qr=decode_boolean(QR), + opcode=decode_opcode(Opcode), + aa=decode_boolean(AA), + tc=decode_boolean(TC), + rd=decode_boolean(RD), + ra=decode_boolean(RA), + pr=decode_boolean(PR), + rcode=Rcode}, + #dns_rec{header=DnsHdr, + qdlist=QdList, + anlist=AnList, + nslist=NsList, + arlist=ArList}; + _ -> + %% Garbage data after DNS message + throw(?DECODE_ERROR) + end; +do_decode(_) -> + %% DNS message does not even match header + throw(?DECODE_ERROR). + +decode_query_section(Bin, N, Buffer) -> + decode_query_section(Bin, N, Buffer, []). + +decode_query_section(Rest, 0, _Buffer, Qs) -> + {Rest,reverse(Qs)}; +decode_query_section(Bin, N, Buffer, Qs) -> + case decode_name(Bin, Buffer) of + {<>,Name} -> + DnsQuery = + #dns_query{domain=Name, + type=decode_type(Type), + class=decode_class(Class)}, + decode_query_section(Rest, N-1, Buffer, [DnsQuery|Qs]); + _ -> + %% Broken question + throw(?DECODE_ERROR) + end. + +decode_rr_section(Bin, N, Buffer) -> + decode_rr_section(Bin, N, Buffer, []). + +decode_rr_section(Rest, 0, _Buffer, RRs) -> + {Rest,reverse(RRs)}; +decode_rr_section(Bin, N, Buffer, RRs) -> + case decode_name(Bin, Buffer) of + {<>, + Name} -> + Type = decode_type(T), + Class = decode_class(C), + Data = decode_data(D, Class, Type, Buffer), + RR = + case Type of + opt -> + <> = TTL, + #dns_rr_opt{domain=Name, + type=Type, + udp_payload_size=C, + ext_rcode=ExtRcode, + version=Version, + z=Z, + data=Data}; + _ -> + <> = TTL, + #dns_rr{domain=Name, + type=Type, + class=Class, + ttl=if TimeToLive < 0 -> 0; + true -> TimeToLive end, + data=Data} + end, + decode_rr_section(Rest, N-1, Buffer, [RR|RRs]); + _ -> + %% Broken RR + throw(?DECODE_ERROR) end. - - %% %% Encode a user query %% encode(Q) -> - H = encode_header(Q#dns_rec.header), - Qd = length(Q#dns_rec.qdlist), - An = length(Q#dns_rec.anlist), - Ns = length(Q#dns_rec.nslist), - Ar = length(Q#dns_rec.arlist), - B0 = H ++ ?int16(Qd) ++ ?int16(An) ++ ?int16(Ns) ++ ?int16(Ar), - {B1,Ptrs0} = encode_query_section(Q#dns_rec.qdlist, [], B0), - {B2,Ptrs1} = encode_res_section(Q#dns_rec.anlist, Ptrs0, B1), - {B3,Ptrs2} = encode_res_section(Q#dns_rec.nslist, Ptrs1, B2), - {B4,_Ptrs3} = encode_res_section(Q#dns_rec.arlist, Ptrs2, B3), - {ok, B4}. - -encode_header(H) -> - F1 = - (H#dns_header.qr bsl 7) bor - (H#dns_header.opcode bsl 3) bor - (H#dns_header.aa bsl 2) bor - (H#dns_header.tc bsl 1) bor - H#dns_header.rd, - F0 = - (H#dns_header.ra bsl 7) bor - (H#dns_header.pr bsl 6) bor - H#dns_header.rcode, - ?int16(H#dns_header.id) ++ [F1, F0]. - + QdCount = length(Q#dns_rec.qdlist), + AnCount = length(Q#dns_rec.anlist), + NsCount = length(Q#dns_rec.nslist), + ArCount = length(Q#dns_rec.arlist), + B0 = encode_header(Q#dns_rec.header, QdCount, AnCount, NsCount, ArCount), + C0 = gb_trees:empty(), + {B1,C1} = encode_query_section(B0, C0, Q#dns_rec.qdlist), + {B2,C2} = encode_res_section(B1, C1, Q#dns_rec.anlist), + {B3,C3} = encode_res_section(B2, C2, Q#dns_rec.nslist), + {B,_} = encode_res_section(B3, C3, Q#dns_rec.arlist), + B. + + +%% RFC 1035: 4.1.1. Header section format +%% +encode_header(#dns_header{id=Id}=H, QdCount, AnCount, NsCount, ArCount) -> + QR = encode_boolean(H#dns_header.qr), + Opcode = encode_opcode(H#dns_header.opcode), + AA = encode_boolean(H#dns_header.aa), + TC = encode_boolean(H#dns_header.tc), + RD = encode_boolean(H#dns_header.rd), + RA = encode_boolean(H#dns_header.ra), + PR = encode_boolean(H#dns_header.pr), + Rcode = H#dns_header.rcode, + <>. -encode_query_section([Q | Qs], Ptrs, Buffer) -> - DName = Q#dns_query.domain, +%% RFC 1035: 4.1.2. Question section format +%% +encode_query_section(Bin, Comp, []) -> {Bin,Comp}; +encode_query_section(Bin0, Comp0, [#dns_query{domain=DName}=Q | Qs]) -> Type = encode_type(Q#dns_query.type), Class = encode_class(Q#dns_query.class), - {NBuffer, NPtrs} = dn_compress(DName, Ptrs, Buffer), - encode_query_section(Qs, NPtrs, NBuffer ++ ?int16(Type) ++ ?int16(Class)); -encode_query_section([], Ptrs,Buffer) -> {Buffer, Ptrs}. - - -encode_res_section([R | Rs], Ptrs, Buffer) -> - DName = R#dns_rr.domain, - Type = encode_type(R#dns_rr.type), - Class = encode_class(R#dns_rr.class), - {NBuffer, NPtrs} = dn_compress(DName, Ptrs, Buffer), - DataPtr = length(NBuffer) + 10, % length(i16, i16, i32, i16) = 10 - {Data,_Ptrs1} = encode_data(R#dns_rr.type, - R#dns_rr.class, - R#dns_rr.data, - NPtrs, - DataPtr), - N = length(Data), - encode_res_section(Rs, NPtrs, NBuffer ++ - ?int16(Type) ++ ?int16(Class) ++ - ?int32(R#dns_rr.ttl) ++ - ?int16(N) ++ Data); -encode_res_section([], Ptrs, Buffer) -> {Buffer, Ptrs}. + {Bin,Comp} = encode_name(Bin0, Comp0, byte_size(Bin0), DName), + encode_query_section(<>, Comp, Qs). + +%% RFC 1035: 4.1.3. Resource record format +%% RFC 2671: 4.3, 4.4, 4.6 OPT RR format +%% +encode_res_section(Bin, Comp, []) -> {Bin,Comp}; +encode_res_section(Bin, Comp, [#dns_rr {domain = DName, + type = Type, + class = Class, + ttl = TTL, + data = Data} | Rs]) -> + encode_res_section_rr(Bin, Comp, Rs, + DName, Type, Class, <>, Data); +encode_res_section(Bin, Comp, [#dns_rr_opt {domain = DName, + udp_payload_size = UdpPayloadSize, + ext_rcode = ExtRCode, + version = Version, + z = Z, + data = Data} | Rs]) -> + encode_res_section_rr(Bin, Comp, Rs, + DName, ?S_OPT, UdpPayloadSize, + <>, Data). + +encode_res_section_rr(Bin0, Comp0, Rs, DName, Type, Class, TTL, Data) -> + T = encode_type(Type), + C = encode_class(Class), + {Bin,Comp1} = encode_name(Bin0, Comp0, byte_size(Bin0), DName), + {DataBin,Comp} = encode_data(Comp1, byte_size(Bin)+2+2+byte_size(TTL)+2, + Type, Class, Data), + DataSize = byte_size(DataBin), + encode_res_section(<>, Comp, Rs). %% %% Resource types @@ -273,6 +313,7 @@ ?T_AAAA -> ?S_AAAA; ?T_SRV -> ?S_SRV; ?T_NAPTR -> ?S_NAPTR; + ?T_OPT -> ?S_OPT; ?T_SPF -> ?S_SPF; %% non standard ?T_UINFO -> ?S_UINFO; @@ -311,6 +352,7 @@ ?S_AAAA -> ?T_AAAA; ?S_SRV -> ?T_SRV; ?S_NAPTR -> ?T_NAPTR; + ?S_OPT -> ?T_OPT; ?S_SPF -> ?T_SPF; %% non standard ?S_UINFO -> ?T_UINFO; @@ -338,7 +380,6 @@ _ -> Class %% raw unknown class end. - encode_class(Class) -> case Class of in -> ?C_IN; @@ -348,321 +389,313 @@ Class when is_integer(Class) -> Class %% raw unknown class end. -%% -%% Decode data field -%% -decode_data(?S_A, in, [A,B,C,D], _) -> {A,B,C,D}; -decode_data(?S_AAAA,in, As, _) when length(As) =:= 16 -> - [X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16] = As, - { ?u16(X1,X2),?u16(X3,X4),?u16(X5,X6),?u16(X7,X8), - ?u16(X9,X10),?u16(X11,X12),?u16(X13,X14),?u16(X15,X16)}; -decode_data(?S_NS, _, Dom, Buffer) -> decode_domain(Dom, Buffer); -decode_data(?S_MD, _, Dom, Buffer) -> decode_domain(Dom, Buffer); -decode_data(?S_MF, _, Dom, Buffer) -> decode_domain(Dom, Buffer); -decode_data(?S_CNAME, _, Dom, Buffer) -> decode_domain(Dom, Buffer); -decode_data(?S_SOA, _, Data, Buffer) -> - case dn_expand(Data, Buffer) of - error -> error; - {MNAME, Data1} -> - case dn_expand(Data1, Buffer) of - error -> error; - {RNAME, Data2} -> - case Data2 of - [S3,S2,S1,S0, - R3,R2,R1,R0, - Y3,Y2,Y1,Y0, - X3,X2,X1,X0, - M3,M2,M1,M0 | _] -> - {MNAME, RNAME, - ?u32(S3,S2,S1,S0), ?i32(R3,R2,R1,R0), - ?i32(Y3,Y2,Y1,Y0), ?i32(X3,X2,X1,X0), - ?u32(M3,M2,M1,M0) }; - _ -> error - end - end - end; -decode_data(?S_MB, _, Dom, Buffer) -> decode_domain(Dom, Buffer); -decode_data(?S_MG, _, Dom, Buffer) -> decode_domain(Dom, Buffer); -decode_data(?S_MR, _, Dom, Buffer) -> decode_domain(Dom, Buffer); -decode_data(?S_NULL, _, Data, _Buffer) -> Data; -decode_data(?S_WKS, in, [A,B,C,D, P | BitMap], _Buffer) -> - { {A,B,C,D}, P, BitMap}; -decode_data(?S_PTR, _, Dom, Buffer) -> decode_domain(Dom, Buffer); -decode_data(?S_HINFO, _, Data, _Buffer) -> - {CPU, RData} = get_data(hd(Data), tl(Data)), - {OS, _} = get_data(hd(RData), tl(RData)), - {CPU, OS}; -decode_data(?S_MINFO, _, Data, Buffer) -> - case dn_expand(Data, Buffer) of - error -> error; - {RM, Data1} -> - case dn_expand(Data1, Buffer) of - error -> error; - {EM, _} -> {RM, EM} - end - end; -decode_data(?S_MX, _, [P1,P0 | Dom], Buffer) -> - case decode_domain(Dom, Buffer) of - error -> error; - Domain -> - {?i16(P1,P0), Domain} +decode_opcode(Opcode) -> + case Opcode of + ?QUERY -> 'query'; + ?IQUERY -> iquery; + ?STATUS -> status; + _ when is_integer(Opcode) -> Opcode %% non-standard opcode + end. + +encode_opcode(Opcode) -> + case Opcode of + 'query' -> ?QUERY; + iquery -> ?IQUERY; + status -> ?STATUS; + _ when is_integer(Opcode) -> Opcode %% non-standard opcode + end. + + +encode_boolean(true) -> 1; +encode_boolean(false) -> 0; +encode_boolean(B) when is_integer(B) -> B. + +decode_boolean(0) -> false; +decode_boolean(I) when is_integer(I) -> true. + +%% +%% Data field -> term() content representation +%% +decode_data(<>, in, ?S_A, _) -> {A,B,C,D}; +decode_data(<>, in, ?S_AAAA, _) -> + {A,B,C,D,E,F,G,H}; +decode_data(Dom, _, ?S_NS, Buffer) -> decode_domain(Dom, Buffer); +decode_data(Dom, _, ?S_MD, Buffer) -> decode_domain(Dom, Buffer); +decode_data(Dom, _, ?S_MF, Buffer) -> decode_domain(Dom, Buffer); +decode_data(Dom, _, ?S_CNAME, Buffer) -> decode_domain(Dom, Buffer); +decode_data(Data0, _, ?S_SOA, Buffer) -> + {Data1,MName} = decode_name(Data0, Buffer), + {Data,RName} = decode_name(Data1, Buffer), + case Data of + <> -> + {MName,RName,Serial,Refresh,Retry,Expiry,Minimum}; + _ -> + %% Broken SOA RR data + throw(?DECODE_ERROR) end; -decode_data(?S_SRV, _, [P1,P0, W1,W0, Po1,Po0 | Dom], Buffer) -> - case decode_domain(Dom, Buffer) of - error -> error; - Domain -> - {?i16(P1,P0), ?i16(W1,W0), ?i16(Po1,Po0), Domain} +decode_data(Dom, _, ?S_MB, Buffer) -> decode_domain(Dom, Buffer); +decode_data(Dom, _, ?S_MG, Buffer) -> decode_domain(Dom, Buffer); +decode_data(Dom, _, ?S_MR, Buffer) -> decode_domain(Dom, Buffer); +decode_data(Data, _, ?S_NULL, _) -> Data; +decode_data(<>, in, ?S_WKS, _Buffer) -> + {{A,B,C,D},Proto,BitMap}; +decode_data(Dom, _, ?S_PTR, Buffer) -> decode_domain(Dom, Buffer); +decode_data(<>, _, ?S_HINFO, _) -> + {binary_to_list(CPU),binary_to_list(OS)}; +decode_data(Data0, _, ?S_MINFO, Buffer) -> + {Data1,RM} = decode_name(Data0, Buffer), + {Data,EM} = decode_name(Data1, Buffer), + case Data of + <<>> -> {RM,EM}; + _ -> + %% Broken MINFO data + throw(?DECODE_ERROR) end; -decode_data(?S_NAPTR, _, [O0,O1, P0,P1 | S0], Buffer) -> - Order = ?u16(O0, O1), - Preference = ?u16(P0, P1), - case decode_string(S0) of - error -> error; - {Flags,S1} -> - case decode_string(S1) of - error -> error; - {Services,S2} -> - case decode_string(S2) of - error -> error; - {Re,Dom} -> - case utf8_to_unicode(Re) of - error -> error; - Regexp -> - case decode_domain(Dom, Buffer) of - error -> error; - Replacement -> - {Order, - Preference, - string:to_lower(Flags), - string:to_lower(Services), - Regexp, - Replacement} - end - end - end - end - end; -decode_data(?S_TXT, _, Data, _Buffer) -> +decode_data(<>, _, ?S_MX, Buffer) -> + {Prio,decode_domain(Dom, Buffer)}; +decode_data(<>, _, ?S_SRV, Buffer) -> + {Prio,Weight,Port,decode_domain(Dom, Buffer)}; +decode_data(<>, _, ?S_NAPTR, Buffer) -> + {Data1,Flags} = decode_string(Data0), + {Data2,Services} = decode_string(Data1), + {Data,Regexp} = decode_characters(Data2, utf8), + Replacement = decode_domain(Data, Buffer), + {Order,Preference,string:to_lower(Flags),string:to_lower(Services), + Regexp,Replacement}; +%% ?S_OPT falls through to default +decode_data(Data, _, ?S_TXT, _) -> decode_txt(Data); -decode_data(?S_SPF, _, Data, _Buffer) -> +decode_data(Data, _, ?S_SPF, _) -> decode_txt(Data); %% sofar unknown or non standard -decode_data(_, _, Data, _Buffer) -> +decode_data(Data, _, _, _) -> Data. -decode_domain(Data, Buffer) -> - case dn_expand(Data, Buffer) of - error -> error; - {Dn, _} -> Dn - end. - -decode_txt(Data) -> decode_txt(Data, []). - -decode_txt([], Acc) -> reverse(Acc); -decode_txt(Data, Acc) -> - case decode_string(Data) of - error -> error; - {Str, Rest} -> - decode_txt(Rest, [Str | Acc]) - end. - -decode_string([]) -> error; -decode_string([Len | Data]) -> - get_data(Len, Data). - -%% -%% Get N bytes from Ptr -%% -get_data(0, Ptr) -> {[], Ptr}; -get_data(N, Ptr) when N > 0 -> get_data(N, Ptr, []); -get_data(_, _) -> error. - -get_data(0, Ptr, Data) -> {reverse(Data), Ptr}; -get_data(N, [H|T], Data) -> get_data(N-1, T, [H|Data]); -get_data(_, [], _) -> error. - -%% -%% Expand compressed domain names -%% Return expanded name and the tail of Dn or error -%% -dn_expand(Dn, Buffer) -> - dn_exp(Dn, Buffer, []). - -dn_exp([0 | T], _, []) -> % Root domain - {".", T}; -dn_exp([0 | T], _, Name) -> - {reverse(Name), T}; -dn_exp([N | T], Buffer, Name) when N band ?INDIR_MASK =:= 0 -> - if Name =:= [] -> - dn_exp_label(N, T, Name, Buffer); - true -> - dn_exp_label(N, T, [$. | Name], Buffer) - end; -dn_exp(_, Buffer, Name) when length(Name) > length(Buffer) -> - error; -dn_exp([N1,N2 | T], Buffer, Name) when N1 band ?INDIR_MASK =:= ?INDIR_MASK -> - Offset = ((N1 band 16#3f) bsl 8) bor N2, - case catch nthtail(Offset, Buffer) of - {'EXIT', _} -> error; - NDn -> - %% We have to keep the Tail of original Dn in order to - %% prohibit ending up with the tail from an offset. - case dn_exp(NDn, Buffer, Name) of - {ExpName, _} -> {ExpName, T}; - Res -> Res - end - end; -dn_exp([], _, _) -> - error. - -dn_exp_label(0, T, Name, Buffer) -> - dn_exp(T, Buffer, Name); -dn_exp_label(N, [H|T], Name, Buffer) -> - dn_exp_label(N-1, T, [H|Name], Buffer). - -%% -%% Encode data field -%% -encode_data(?S_A, in, {A,B,C,D}, Ptrs, _) -> {[A,B,C,D], Ptrs}; -encode_data(?S_AAAA, in, As, Ptrs, _) when tuple_size(As) =:= 8 -> - {X1,X2,X3,X4,X5,X6,X7,X8} = As, - A = ?int16(X1) ++ ?int16(X2) ++ ?int16(X3) ++ ?int16(X4) ++ - ?int16(X5) ++ ?int16(X6) ++ ?int16(X7) ++ ?int16(X8), - {A, Ptrs}; -encode_data(?S_NS, in, Domain, Ptrs, L) -> dn_compress(Domain, Ptrs, [], L); -encode_data(?S_MD, in, Domain, Ptrs, L) -> dn_compress(Domain, Ptrs, [], L); -encode_data(?S_MF, in, Domain, Ptrs, L) -> dn_compress(Domain, Ptrs, [], L); -encode_data(?S_CNAME, in, Domain, Ptrs, L) -> dn_compress(Domain, Ptrs, [], L); -encode_data(?S_SOA, in, {MN, RN, S, Ref, Ret, E, M}, Ptrs, L) -> - {B0, P0} = dn_compress(MN, Ptrs, [], L), - {B1, P1} = dn_compress(RN, P0, B0, length(B0) + L), - Data = B1 ++ ?int32(S) ++ ?int32(Ref) ++ ?int32(Ret) ++ - ?int32(E) ++ ?int32(M), - {Data, P1}; -encode_data(?S_MB, in, Domain, Ptrs, L) -> dn_compress(Domain, Ptrs, [], L); -encode_data(?S_MG, in, Domain, Ptrs, L) -> dn_compress(Domain, Ptrs, [], L); -encode_data(?S_MR, in, Domain, Ptrs, L) -> dn_compress(Domain, Ptrs, [], L); -encode_data(?S_NULL, in, Data, Ptrs, _) -> {Data, Ptrs}; -encode_data(?S_WKS, in, {{A,B,C,D},P,BitMap}, Ptrs, _) -> - {[A,B,C,D,P|BitMap], Ptrs}; -encode_data(?S_PTR, in, Domain, Ptrs, L) -> dn_compress(Domain, Ptrs, [], L); -encode_data(?S_HINFO, in, {CPU, OS}, Ptrs, _) -> - {[length(CPU)|CPU] ++ [length(OS)|OS], Ptrs}; -encode_data(?S_MINFO, in, {RM, EM}, Ptrs, L) -> - {B0, P0} = dn_compress(RM, Ptrs, [], L), - dn_compress(EM, P0, B0, length(B0) + L); -encode_data(?S_MX, in, {Pref, Exch}, Ptrs, L) -> - {EDom, NPtrs} = dn_compress(Exch, Ptrs, [], L), - {?int16(Pref) ++ EDom, NPtrs}; -encode_data(?S_SRV, in, {Prio, Weight, Port, Target}, Ptrs, L) -> - {EDom, NPtrs} = dn_compress(Target, Ptrs, [], L), - {?int16(Prio) ++ ?int16(Weight) ++ ?int16(Port) ++ EDom, NPtrs}; -encode_data(?S_NAPTR, in, - {Order, Preference, Flags, Services, Regexp, Replacement}, - Ptrs, _) -> - {?int16(Order) ++ ?int16(Preference) ++ - encode_txt([Flags,Services,unicode_to_utf8(Regexp)]) ++ - dn_labels(Replacement), - Ptrs}; -encode_data(?S_TXT, in, Data, Ptrs, _) -> - {encode_txt(Data), Ptrs}; -encode_data(?S_SPF, in, Data, Ptrs, _) -> - {encode_txt(Data), Ptrs}; -encode_data(_, _, Data, Ptrs, _) -> {Data, Ptrs}. - -encode_txt(Data) -> - lists:flatten([[Length|Str] || Str <- Data, - (Length = length(Str)) =< 255]). - -%% -%% Compress a name given list names already compressed -%% The format of compressed names are -%% {Offset, Name} -%% -%% Return {NewBuffer, NewNames} -%% or Error -%% -dn_compress("", Ns, Buffer) -> %% Root domain - dn_compress(".", Ns, Buffer); -dn_compress(Name, Ns, Buffer) -> - {Buf, NNs} = dn_comp(Name, Ns, [], length(Buffer)), - {Buffer ++ Buf, NNs}. - -dn_compress(Name, Ns, Buffer, FullLength) -> - {Buf, NNs} = dn_comp(Name, Ns, [], FullLength), - {Buffer ++ Buf, NNs}. - -dn_comp([], Ns0, Buf, _Offset) -> - { Buf, Ns0}; -dn_comp(Name, Ns0, Buf, Offset) -> - case dn_find(Name, Ns0) of - {true, Offs} -> - Ptr = [(Offs bsr 8) bor ?INDIR_MASK, Offs band 16#ff], - { Buf ++ Ptr, Ns0 }; - false -> - { Buf ++ dn_labels(Name), [{Name, Offset} | Ns0] } - end. - -dn_labels(Name) -> - dn_labels(Name, []). - -dn_labels([$\\, 0 | _Garbage], Cn) -> - dn_labels([], Cn); -dn_labels([$.], Cn) -> - dn_labels([], Cn); -dn_labels([$. | Name], Cn) -> - [length(Cn) | reverse(Cn, dn_labels(Name))]; -dn_labels([$\\, C | Name], Cn) -> - dn_labels(Name, [C, $\\ | Cn]); -dn_labels([C | Name], Cn) -> - dn_labels(Name, [C | Cn]); -dn_labels([], Cn) -> - [length(Cn) | reverse(Cn, [0])]. - -%% -%% Skip over a compressed domain name -%% -dn_skip([0|Dn]) -> - Dn; -dn_skip([N|Dn]) when N band ?INDIR_MASK =:= 0 -> - case catch nthtail(N, Dn) of - {'EXIT', _} -> error; - NDn -> dn_skip(NDn) - end; -dn_skip([N1,_N2|Dn]) when N1 band ?INDIR_MASK =:= ?INDIR_MASK -> - Dn; -dn_skip(_) -> error. - -%% -%% Lookup a compressed name (not stored as compressed !!!) +%% Array of strings %% - -dn_find(Name, [{Nm, Offset} | Ns]) -> - case cmp_name(Name, Nm) of - true -> {true, Offset}; - false -> dn_find(Name, Ns) +decode_txt(<<>>) -> []; +decode_txt(Bin) -> + {Rest,String} = decode_string(Bin), + [String|decode_txt(Rest)]. + +decode_string(<>) -> + {Rest,binary_to_list(Bin)}; +decode_string(_) -> + %% Broken string + throw(?DECODE_ERROR). + +decode_characters(<>, Encoding) -> + {Rest,unicode:characters_to_list(Bin, Encoding)}; +decode_characters(_, _) -> + %% Broken encoded string + throw(?DECODE_ERROR). + +%% One domain name only, there must be nothing after +%% +decode_domain(Bin, Buffer) -> + case decode_name(Bin, Buffer) of + {<<>>,Name} -> Name; + _ -> + %% Garbage after domain name + throw(?DECODE_ERROR) + end. + +%% Domain name -> {RestBin,Name} +%% +decode_name(Bin, Buffer) -> + decode_name(Bin, Buffer, [], Bin, 0). + +%% Tail advances with Rest until the first indirection is followed +%% then it stays put at that Rest. +decode_name(_, Buffer, _Labels, _Tail, Cnt) when Cnt > byte_size(Buffer) -> + throw(?DECODE_ERROR); %% Insantiy bailout - this must be a decode loop +decode_name(<<0,Rest/binary>>, _Buffer, Labels, Tail, Cnt) -> + %% Root domain, we have all labels for the domain name + {if Cnt =/= 0 -> Tail; true -> Rest end, + decode_name_labels(Labels)}; +decode_name(<<0:2,Len:6,Label:Len/binary,Rest/binary>>, + Buffer, Labels, Tail, Cnt) -> + %% One plain label here + decode_name(Rest, Buffer, [Label|Labels], + if Cnt =/= 0 -> Tail; true -> Rest end, + Cnt); +decode_name(<<3:2,Ptr:14,Rest/binary>>, Buffer, Labels, Tail, Cnt) -> + %% Indirection - reposition in buffer and recurse + case Buffer of + <<_:Ptr/binary,Bin/binary>> -> + decode_name(Bin, Buffer, Labels, + if Cnt =/= 0 -> Tail; true -> Rest end, + Cnt+2); % size of indirection pointer + _ -> + %% Indirection pointer outside buffer + throw(?DECODE_ERROR) end; -dn_find(_, []) -> false. - +decode_name(_, _, _, _, _) -> throw(?DECODE_ERROR). -cmp_name(Name, Nm) when length(Name) =:= length(Nm) -> - cmp_lower(Name, Nm); -cmp_name(_, _) -> false. - -cmp_lower([H0|T0], [H1|T1]) -> - HH0 = ?tolower(H0), - HH1 = ?tolower(H1), - if HH0 =:= HH1 -> cmp_lower(T0, T1); - true -> false - end; -cmp_lower([], []) -> true. - -utf8_to_unicode(Utf8) -> - case unicode:characters_to_list(list_to_binary(Utf8), utf8) of - Unicode when is_list(Unicode) -> - Unicode; - _ -> error +%% Reverse list of labels (binaries) -> domain name (string) +decode_name_labels([]) -> "."; +decode_name_labels(Labels) -> + decode_name_labels(Labels, ""). + +decode_name_labels([Label], Name) -> + decode_name_label(Label, Name); +decode_name_labels([Label|Labels], Name) -> + decode_name_labels(Labels, "."++decode_name_label(Label, Name)). + +decode_name_label(<<>>, _Name) -> + %% Empty label is only allowed for the root domain, + %% and that is handled above. + throw(?DECODE_ERROR); +decode_name_label(Label, Name) -> + decode_name_label(Label, Name, byte_size(Label)). + +%% Decode $. and $\\ to become $\\ escaped characters +%% in the string representation. +-compile({inline, [decode_name_label/3]}). +decode_name_label(_, Name, 0) -> Name; +decode_name_label(Label, Name, N) -> + M = N-1, + case Label of + <<_:M/binary,($\\),_/binary>> -> + decode_name_label(Label, "\\\\"++Name, M); + <<_:M/binary,($.),_/binary>> -> + decode_name_label(Label, "\\."++Name, M); + <<_:M/binary,C,_/binary>> -> + decode_name_label(Label, [C|Name], M); + _ -> + %% This should not happen but makes surrounding + %% programming errors easier to locate. + erlang:error(badarg, [Label,Name,N]) + end. + +%% +%% Data field -> {binary(),NewCompressionTable} +%% +encode_data(Comp, _, ?S_A, in, {A,B,C,D}) -> {<>,Comp}; +encode_data(Comp, _, ?S_AAAA, in, {A,B,C,D,E,F,G,H}) -> + {<>,Comp}; +encode_data(Comp, Pos, ?S_NS, in, Domain) -> encode_name(Comp, Pos, Domain); +encode_data(Comp, Pos, ?S_MD, in, Domain) -> encode_name(Comp, Pos, Domain); +encode_data(Comp, Pos, ?S_MF, in, Domain) -> encode_name(Comp, Pos, Domain); +encode_data(Comp, Pos, ?S_CNAME, in, Domain) -> encode_name(Comp, Pos, Domain); +encode_data(Comp0, Pos, ?S_SOA, in, + {MName,RName,Serial,Refresh,Retry,Expiry,Minimum}) -> + {B1,Comp1} = encode_name(Comp0, Pos, MName), + {B,Comp} = encode_name(B1, Comp1, Pos+byte_size(B1), RName), + {<>, + Comp}; +encode_data(Comp, Pos, ?S_MB, in, Domain) -> encode_name(Comp, Pos, Domain); +encode_data(Comp, Pos, ?S_MG, in, Domain) -> encode_name(Comp, Pos, Domain); +encode_data(Comp, Pos, ?S_MR, in, Domain) -> encode_name(Comp, Pos, Domain); +encode_data(Comp, _, ?S_NULL, in, Data) -> + {iolist_to_binary(Data),Comp}; +encode_data(Comp, _, ?S_WKS, in, {{A,B,C,D},Proto,BitMap}) -> + BitMapBin = iolist_to_binary(BitMap), + {<>,Comp}; +encode_data(Comp, Pos, ?S_PTR, in, Domain) -> encode_name(Comp, Pos, Domain); +encode_data(Comp, _, ?S_HINFO, in, {CPU,OS}) -> + Bin = encode_string(iolist_to_binary(CPU)), + {encode_string(Bin, iolist_to_binary(OS)),Comp}; +encode_data(Comp0, Pos, ?S_MINFO, in, {RM,EM}) -> + {Bin,Comp} = encode_name(Comp0, Pos, RM), + encode_name(Bin, Comp, Pos+byte_size(Bin), EM); +encode_data(Comp, Pos, ?S_MX, in, {Pref,Exch}) -> + encode_name(<>, Comp, Pos+2, Exch); +encode_data(Comp, Pos, ?S_SRV, in, {Prio,Weight,Port,Target}) -> + encode_name(<>, Comp, Pos+2+2+2, Target); +encode_data(Comp, Pos, ?S_NAPTR, in, + {Order,Preference,Flags,Services,Regexp,Replacement}) -> + B0 = <>, + B1 = encode_string(B0, iolist_to_binary(Flags)), + B2 = encode_string(B1, iolist_to_binary(Services)), + B3 = encode_string(B2, unicode:characters_to_binary(Regexp, + unicode, utf8)), + %% Bypass name compression (RFC 2915: section 2) + {B,_} = encode_name(B3, gb_trees:empty(), Pos+byte_size(B3), Replacement), + {B,Comp}; +%% ?S_OPT falls through to default +encode_data(Comp, _, ?S_TXT, in, Data) -> {encode_txt(Data),Comp}; +encode_data(Comp, _, ?S_SPF, in, Data) -> {encode_txt(Data),Comp}; +encode_data(Comp, _Pos, _Type, _Class, Data) -> {iolist_to_binary(Data),Comp}. + +%% Array of strings +%% +encode_txt(Strings) -> + encode_txt(<<>>, Strings). +%% +encode_txt(Bin, []) -> Bin; +encode_txt(Bin, [S|Ss]) -> + encode_txt(encode_string(Bin, iolist_to_binary(S)), Ss). + +%% Singular string +%% +encode_string(StringBin) -> + encode_string(<<>>, StringBin). +%% +encode_string(Bin, StringBin) -> + Size = byte_size(StringBin), + if Size =< 255 -> + <> + end. + +%% Domain name +%% +encode_name(Comp, Pos, Name) -> + encode_name(<<>>, Comp, Pos, Name). +%% +%% Bin = target binary +%% Comp = compression lookup table; label list -> buffer position +%% Pos = position in DNS message +%% Name = domain name to encode +%% +%% The name compression does not make the case conversions +%% it could. This means case will be preserved at the cost +%% of missed compression opportunities. But if the encoded +%% message use the same case for different instances of +%% the same domain name there is no problem, and if not it is +%% only compression that suffers. Furthermore encode+decode +%% this way becomes an identity operation for any decoded +%% DNS message which is nice for testing encode. +%% +encode_name(Bin0, Comp0, Pos, Name) -> + case encode_labels(Bin0, Comp0, Pos, name2labels(Name)) of + {Bin,_}=Result when byte_size(Bin) - byte_size(Bin0) =< 255 -> Result; + _ -> + %% Fail on too long name + erlang:error(badarg, [Bin0,Comp0,Pos,Name]) + end. + +name2labels("") -> []; +name2labels(".") -> []; +name2labels(Cs) -> name2labels(<<>>, Cs). +%% +-compile({inline, [name2labels/2]}). +name2labels(Label, "") -> [Label]; +name2labels(Label, ".") -> [Label]; +name2labels(Label, "."++Cs) -> [Label|name2labels(<<>>, Cs)]; +name2labels(Label, "\\"++[C|Cs]) -> name2labels(<

    Real Programmers Don't Use PASCAL

    + +

    Ed Post
    +Graphic Software Systems
    + +P.O. Box 673
    +25117 S.W. Parkway
    +Wilsonville, OR 97070
    +Copyright (c) 1982
    +

    + + +

    (decvax | ucbvax | cbosg | pur-ee | lbl-unix)!teklabs!ogcvax!gss1144!evp

    + + +Back in the good old days -- the "Golden Era" of computers, it was +easy to separate the men from the boys (sometimes called "Real Men" +and "Quiche Eaters" in the literature). During this period, the Real +Men were the ones that understood computer programming, and the Quiche +Eaters were the ones that didn't. A real computer programmer said +things like "DO 10 I=1,10" and "ABEND" (they +actually talked in capital letters, you understand), and the rest of +the world said things like "computers are too complicated for +me" and "I can't relate to computers -- they're so +impersonal". (A previous work [1] points out that Real Men don't +"relate" to anything, and aren't afraid of being impersonal.)

    + +But, as usual, times change. We are faced today with a world in which +little old ladies can get computerized microwave ovens, 12 year old +kids can blow Real Men out of the water playing Asteroids and Pac-Man, +and anyone can buy and even understand their very own Personal +Computer. The Real Programmer is in danger of becoming extinct, of +being replaced by high-school students with TRASH-80s!

    + +There is a clear need to point out the differences between the typical +high-school junior Pac-Man player and a Real Programmer. Understanding +these differences will give these kids something to aspire to -- a +role model, a Father Figure. It will also help employers of Real +Programmers to realize why it would be a mistake to replace the Real +Programmers on their staff with 12 year old Pac-Man players (at a +considerable salary savings).

    + + +

    LANGUAGES

    + +The easiest way to tell a Real Programmer from the crowd is by the +programming language he (or she) uses. Real Programmers use FORTRAN. +Quiche Eaters use PASCAL. Nicklaus Wirth, the designer of PASCAL, was +once asked, "How do you pronounce your name?". He replied +"You can either call me by name, pronouncing it 'Veert', or call +me by value, 'Worth'." One can tell immediately from this comment +that Nicklaus Wirth is a Quiche Eater. The only parameter passing +mechanism endorsed by Real Programmers is call-by-value-return, as +implemented in the IBM/370 FORTRAN G and H compilers. Real +programmers don't need abstract concepts to get their jobs done: they +are perfectly happy with a keypunch, a FORTRAN IV compiler, and a +beer.

    + +

      +
    • Real Programmers do List Processing in FORTRAN. + +
    • Real Programmers do String Manipulation in FORTRAN. + +
    • Real Programmers do Accounting (if they do it at all) in FORTRAN. + +
    • Real Programmers do Artificial Intelligence programs in FORTRAN. +

    + +If you can't do it in FORTRAN, do it in assembly language. If you can't do +it in assembly language, it isn't worth doing.

    + + +

    STRUCTURED PROGRAMMING

    + +Computer science academicians have gotten into the "structured pro- +gramming" rut over the past several years. They claim that programs +are more easily understood if the programmer uses some special +language constructs and techniques. They don't all agree on exactly +which constructs, of course, and the examples they use to show their +particular point of view invariably fit on a single page of some +obscure journal or another -- clearly not enough of an example to +convince anyone. When I got out of school, I thought I was the best +programmer in the world. I could write an unbeatable tic-tac-toe +program, use five different computer languages, and create 1000 line +programs that WORKED. (Really!) Then I got out into the Real +World. My first task in the Real World was to read and understand a +200,000 line FORTRAN program, then speed it up by a factor of two. Any +Real Programmer will tell you that all the Structured Coding in the +world won't help you solve a problem like that -- it takes actual +talent. Some quick observations on Real Programmers and Structured +Programming:

    + +

      +
    • Real Programmers aren't afraid to use GOTOs. + +
    • Real Programmers can write five page long DO loops without +getting confused. + +
    • Real Programmers enjoy Arithmetic IF statements because they make +the code more interesting. + +
    • Real Programmers write self-modifying code, especially if it +saves them 20 nanoseconds in the middle of a tight loop. + +
    • Programmers don't need comments: the code is obvious. + +
    • Since FORTRAN doesn't have a structured IF, REPEAT +... UNTIL, or CASE statement, Real Programmers don't +have to worry about not using them. Besides, they can be simulated +when necessary using assigned GOTOs. + +

    + +Data structures have also gotten a lot of press lately. Abstract Data +Types, Structures, Pointers, Lists, and Strings have become popular in +certain circles. Wirth (the above-mentioned Quiche Eater) actually +wrote an entire book [2] contending that you could write a program +based on data structures, instead of the other way around. As all Real +Programmers know, the only useful data structure is the +array. Strings, lists, structures, sets -- these are all special cases +of arrays and and can be treated that way just as easily without +messing up your programing language with all sorts of +complications. The worst thing about fancy data types is that you have +to declare them, and Real Programming Languages, as we all know, have +implicit typing based on the first letter of the (six character) +variable name.

    + + +

    OPERATING SYSTEMS

    + +What kind of operating system is used by a Real Programmer? CP/M? God +forbid -- CP/M, after all, is basically a toy operating system. Even +little old ladies and grade school students can understand and use +CP/M.

    + +Unix is a lot more complicated of course -- the typical Unix hacker +never can remember what the PRINT command is called this +week -- but when it gets right down to it, Unix is a glorified video +game. People don't do Serious Work on Unix systems: they send jokes +around the world on USENET and write adventure games and research +papers.

    + +No, your Real Programmer uses OS/370. A good programmer can find and +understand the description of the IJK305I error he just got in his JCL +manual. A great programmer can write JCL without referring to the +manual at all. A truly outstanding programmer can find bugs buried in +a 6 megabyte core dump without using a hex calculator. (I have +actually seen this done.)

    + +OS/370 is a truly remarkable operating system. It's possible to des- +troy days of work with a single misplaced space, so alertness in the +programming staff is encouraged. The best way to approach the system +is through a keypunch. Some people claim there is a Time Sharing +system that runs on OS/370, but after careful study I have come to the +conclusion that they are mistaken.

    + + +

    PROGRAMMING TOOLS

    + +What kind of tools does a Real Programmer use? In theory, a Real +Programmer could run his programs by keying them into the front panel +of the computer. Back in the days when computers had front panels, +this was actually done occasionally. Your typical Real Programmer +knew the entire bootstrap loader by memory in hex, and toggled it in +whenever it got destroyed by his program. (Back then, memory was +memory -- it didn't go away when the power went off. Today, memory +either forgets things when you don't want it to, or remembers things +long after they're better forgotten.) Legend has it that Seymour +Cray, inventor of the Cray I supercomputer and most of Control Data's +computers, actually toggled the first operating system for the CDC7600 +in on the front panel from memory when it was first powered +on. Seymour, needless to say, is a Real Programmer.

    + +One of my favorite Real Programmers was a systems programmer for Texas +Instruments. One day, he got a long distance call from a user whose +system had crashed in the middle of some important work. Jim was able +to repair the damage over the phone, getting the user to toggle in +disk I/O instructions at the front panel, repairing system tables in +hex, reading register contents back over the phone. The moral of this +story: while a Real Programmer usually includes a keypunch and +lineprinter in his toolkit, he can get along with just a front panel +and a telephone in emergencies.

    + +In some companies, text editing no longer consists of ten engineers +standing in line to use an 029 keypunch. In fact, the building I work +in doesn't contain a single keypunch. The Real Programmer in this +situation has to do his work with a text editor program. Most systems +supply several text editors to select from, and the Real Programmer +must be careful to pick one that reflects his personal style. Many +people believe that the best text editors in the world were written at +Xerox Palo Alto Research Center for use on their Alto and Dorado +computers [3]. Unfortunately, no Real Programmer would ever use a +computer whose operating system is called SmallTalk, and would +certainly not talk to the computer with a mouse.

    + +Some of the concepts in these Xerox editors have been incorporated +into editors running on more reasonably named operating systems. EMACS +and VI are probably the most well known of this class of editors. The +problem with these editors is that Real Programmers consider "what you +see is what you get" to be just as bad a concept in text editors as it +is in women. No, the Real Programmer wants a "you asked for it, you +got it" text editor -- complicated, cryptic, powerful, unforgiving, +dangerous. TECO, to be precise.

    + +It has been observed that a TECO command sequence more closely resem- +bles transmission line noise than readable text [4]. One of the more +entertaining games to play with TECO is to type your name in as a +command line and try to guess what it does. Just about any possible +typing error while talking with TECO will probably destroy your +program, or even worse -- introduce subtle and mysterious bugs in a +once working subroutine.

    + +For this reason, Real Programmers are reluctant to actually edit a +program that is close to working. They find it much easier to just +patch the binary object code directly, using a wonderful program +called SUPERZAP (or its equivalent on non-IBM machines). This works so +well that many working programs on IBM systems bear no relation to +the original FORTRAN code. In many cases, the original source code is +no longer available. When it comes time to fix a program like this, no +manager would even think of sending anything less than a Real +Programmer to do the job -- no Quiche Eating structured programmer +would even know where to start. This is called "job security".

    + +Some programming tools NOT used by Real Programmers:

    +

      + +
    • FORTRAN preprocessors like MORTRAN and RATFOR. The Cuisinarts of +programming -- great for making Quiche. See comments above on +structured programming. + +
    • Source language debuggers. Real Programmers can read core dumps. + +
    • Compilers with array bounds checking. They stifle creativity, +destroy most of the interesting uses for EQUIVALENCE, and make it +impossible to modify the operating system code with negative +subscripts. Worst of all, bounds checking is inefficient. + +
    • Source code maintainance systems. A Real Programmer keeps his +code locked up in a card file, because it implies that its owner +cannot leave his important programs unguarded [5]. + +

    + + +

    THE REAL PROGRAMMER AT WORK

    + +Where does the typical Real Programmer work? What kind of programs are +worthy of the efforts of so talented an individual? You can be sure +that no real Programmer would be caught dead writing +accounts-receivable programs in COBOL, or sorting mailing lists for +People magazine. A Real Programmer wants tasks of earth-shaking +importance (literally!):

    + +

      + +
    • Real Programmers work for Los Alamos National Laboratory, writing +atomic bomb simulations to run on Cray I supercomputers. + +
    • Real Programmers work for the National Security Agency, decoding +Russian transmissions. + +
    • It was largely due to the efforts of thousands of Real +Programmers working for NASA that our boys got to the moon and back +before the cosmonauts. + +
    • The computers in the Space Shuttle were programmed by Real +Programmers. + +
    • Programmers are at work for Boeing designing the operating +systems for cruise missiles. + +

    + +Some of the most awesome Real Programmers of all work at the Jet Pro- +pulsion Laboratory in California. Many of them know the entire +operating system of the Pioneer and Voyager spacecraft by heart. With +a combination of large ground-based FORTRAN programs and small +spacecraft-based assembly language programs, they can to do incredible +feats of navigation and improvisation, such as hitting ten-kilometer +wide windows at Saturn after six years in space, and repairing or +bypassing damaged sensor platforms, radios, and batteries. Allegedly, +one Real Programmer managed to tuck a pattern-matching program into a +few hundred bytes of unused memory in a Voyager spacecraft that +searched for, located, and photographed a new moon of Jupiter.

    + +One plan for the upcoming Galileo spacecraft mission is to use a grav- +ity assist trajectory past Mars on the way to Jupiter. This trajectory +passes within 80 +/- 3 kilometers of the surface of Mars. Nobody is +going to trust a PASCAL program (or PASCAL programmer) for navigation +to these tolerances.

    + +As you can tell, many of the world's Real Programmers work for the +U.S. Government, mainly the Defense Department. This is as it should +be. Recently, however, a black cloud has formed on the Real +Programmer horizon.

    + +It seems that some highly placed Quiche Eaters at the Defense +Department decided that all Defense programs should be written in some +grand unified language called "ADA" (registered trademark, DoD). For +a while, it seemed that ADA was destined to become a language that +went against all the precepts of Real Programming -- a language with +structure, a language with data types, strong typing, and +semicolons. In short, a language designed to cripple the creativity of +the typical Real Programmer. Fortunately, the language adopted by DoD +has enough interesting features to make it approachable: it's +incredibly complex, includes methods for messing with the operating +system and rearranging memory, and Edsgar Dijkstra doesn't like it +[6]. (Dijkstra, as I'm sure you know, was the author of "GoTos +Considered Harmful" -- a landmark work in programming +methodology, applauded by Pascal Programmers and Quiche Eaters alike.) +Besides, the determined Real Programmer can write FORTRAN programs in +any language.

    + +The real programmer might compromise his principles and work on some- +thing slightly more trivial than the destruction of life as we know +it, providing there's enough money in it. There are several Real +Programmers building video games at Atari, for example. (But not +playing them. A Real Programmer knows how to beat the machine every +time: no challange in that.) Everyone working at LucasFilm is a Real +Programmer. (It would be crazy to turn down the money of 50 million +Star Wars fans.) The proportion of Real Programmers in Computer +Graphics is somewhat lower than the norm, mostly because nobody has +found a use for Computer Graphics yet. On the other hand, all +Computer Graphics is done in FORTRAN, so there are a fair number +people doing Graphics in order to avoid having to write COBOL +programs.

    + + +

    THE REAL PROGRAMMER AT PLAY

    + +Generally, the Real Programmer plays the same way he works -- with +computers. He is constantly amazed that his employer actually pays +him to do what he would be doing for fun anyway, although he is +careful not to express this opinion out loud. Occasionally, the Real +Programmer does step out of the office for a breath of fresh air and a +beer or two. Some tips on recognizing real programmers away from the +computer room:

    +

      + +
    • At a party, the Real Programmers are the ones in the corner +talking about operating system security and how to get around it. + +
    • At a football game, the Real Programmer is the one comparing the +plays against his simulations printed on 11 by 14 fanfold paper. + +
    • At the beach, the Real Programmer is the one drawing flowcharts +in the sand. + +
    • A Real Programmer goes to a disco to watch the light show. + +
    • At a funeral, the Real Programmer is the one saying "Poor +George. And he almost had the sort routine working before the +coronary." + +
    • In a grocery store, the Real Programmer is the one who insists on +running the cans past the laser checkout scanner himself, because he +never could trust keypunch operators to get it right the first time. + +

    + + +

    THE REAL PROGRAMMER'S NATURAL HABITAT

    + +What sort of environment does the Real Programmer function best in? +This is an important question for the managers of Real +Programmers. Considering the amount of money it costs to keep one on +the staff, it's best to put him (or her) in an environment where he +can get his work done.

    + +The typical Real Programmer lives in front of a computer terminal. +Surrounding this terminal are:

    +

      + +
    • Listings of all programs the Real Programmer has ever worked on, +piled in roughly chronological order on every flat surface in the office. + +
    • Some half-dozen or so partly filled cups of cold +coffee. Occasionally, there will be cigarette butts floating in the +coffee. In some cases, the cups will contain Orange Crush. + +
    • Unless he is very good, there will be copies of the OS JCL manual +and the Principles of Operation open to some particularly interesting +pages. + +
    • Taped to the wall is a line-printer Snoopy calender for the year +1969. + +
    • Strewn about the floor are several wrappers for peanut butter +filled cheese bars (the type that are made stale at the bakery so they +can't get any worse while waiting in the vending machine). + +
    • Hiding in the top left-hand drawer of the desk is a stash of +double stuff Oreos for special occasions. + +
    • Underneath the Oreos is a flow-charting template, left there by +the previous occupant of the office. (Real Programmers write programs, +not documentation. Leave that to the maintainence people.) + +

    + +The Real Programmer is capable of working 30, 40, even 50 hours at a +stretch, under intense pressure. In fact, he prefers it that way. Bad +response time doesn't bother the Real Programmer -- it gives him a +chance to catch a little sleep between compiles. If there is not +enough schedule pressure on the Real Programmer, he tends to make +things more challenging by working on some small but interesting part +of the problem for the first nine weeks, then finishing the rest in +the last week, in two or three 50-hour marathons. This not only +inpresses his manager, who was despairing of ever getting the project +done on time, but creates a convenient excuse for not doing the +documentation. In general:

    + +

      + +
    • No Real Programmer works 9 to 5. (Unless it's 9 in the evening to +5 in the morning.) + +
    • Real Programmers don't wear neckties. + +
    • Real Programmers don't wear high heeled shoes. + +
    • Real Programmers arrive at work in time for lunch. [9] + +
    • A Real Programmer might or might not know his wife's name. He +does, however, know the entire ASCII (or EBCDIC) code table. + +
    • Real Programmers don't know how to cook. Grocery stores aren't +often open at 3 a.m., so they survive on Twinkies and coffee. + +

    + +

    THE FUTURE

    + +What of the future? It is a matter of some concern to Real Programmers +that the latest generation of computer programmers are not being +brought up with the same outlook on life as their elders. Many of them +have never seen a computer with a front panel. Hardly anyone +graduating from school these days can do hex arithmetic without a +calculator. College graduates these days are soft -- protected from +the realities of programming by source level debuggers, text editors +that count parentheses, and user friendly operating systems. Worst of +all, some of these alleged computer scientists manage to get degrees +without ever learning FORTRAN! Are we destined to become an industry +of Unix hackers and Pascal programmers?

    + +On the contrary. From my experience, I can only report that the +future is bright for Real Programmers everywhere. Neither OS/370 nor +FORTRAN show any signs of dying out, despite all the efforts of +Pascal programmers the world over. Even more subtle tricks, like +adding structured coding constructs to FORTRAN have failed. Oh sure, +some computer vendors have come out with FORTRAN 77 compilers, but +every one of them has a way of converting itself back into a FORTRAN +66 compiler at the drop of an option card -- to compile DO loops like +God meant them to be.

    + +Even Unix might not be as bad on Real Programmers as it once was. The +latest release of Unix has the potential of an operating system worthy +of any Real Programmer. It has two different and subtly incompatible +user interfaces, an arcane and complicated terminal driver, virtual +memory. If you ignore the fact that it's structured, even C +programming can be appreciated by the Real Programmer: after all, +there's no type checking, variable names are seven (ten? eight?) +characters long, and the added bonus of the Pointer data type is +thrown in. It's like having the best parts of FORTRAN and assembly +language in one place. (Not to mention some of the more creative uses +for #define.)

    + +No, the future isn't all that bad. Why, in the past few years, the +popular press has even commented on the bright new crop of computer +nerds and hackers ([7] and [8]) leaving places like Stanford and +M.I.T. for the Real World. From all evidence, the spirit of Real +Programming lives on in these young men and women. As long as there +are ill-defined goals, bizarre bugs, and unrealistic schedules, there +will be Real Programmers willing to jump in and Solve The Problem, +saving the documentation for later. Long live FORTRAN!

    + +

    ACKNOWLEGEMENT

    + +I would like to thank Jan E., Dave S., Rich G., Rich E. for their help +in characterizing the Real Programmer, Heather B. for the +illustration, Kathy E. for putting up with it, and atd!avsdS:mark for +the initial inspriration.

    + +

    REFERENCES

    + +[1] Feirstein, B., Real Men Don't Eat Quiche, New York, + Pocket Books, 1982.

    + +[2] Wirth, N., Algorithms + Datastructures = Programs, + Prentice Hall, 1976.

    + +[3] Xerox PARC editors . . .

    + +[4] Finseth, C., Theory and Practice of Text Editors - + or - a Cookbook for an EMACS, B.S. Thesis, + MIT/LCS/TM-165, Massachusetts Institute of Technology, + May 1980.

    + +[5] Weinberg, G., The Psychology of Computer Programming, + New York, Van Nostrabd Reinhold, 1971, page 110.

    + +[6] Dijkstra, E., On the GREEN Language Submitted to the DoD, + Sigplan notices, Volume 3, Number 10, October 1978.

    + +[7] Rose, Frank, Joy of Hacking, Science 82, Volume 3, Number 9, + November 1982, pages 58 - 66.

    + +[8] The Hacker Papers, Psychology Today, August 1980.

    + +[9] Datamation, July, 1983, pp. 263-265.

    + +


    + +
    Hacker's Wisdom/ Real Programmers +Don't Use PASCAL
    + + +Last modified: Wed Mar 27 17:48:50 EST 1996 Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/kernel/test/file_SUITE_data/realmen.html.gz and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/kernel/test/file_SUITE_data/realmen.html.gz differ diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/file_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/file_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/file_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/file_SUITE.erl 2009-11-20 13:30:00.000000000 +0000 @@ -0,0 +1,3716 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% This is a developement feature when developing a new file module, +%% ugly but practical. +-ifndef(FILE_MODULE). +-define(FILE_MODULE, file). +-endif. +-ifndef(FILE_SUITE). +-define(FILE_SUITE, file_SUITE). +-endif. +-ifndef(FILE_INIT). +-define(FILE_INIT(Config), Config). +-endif. +-ifndef(FILE_FINI). +-define(FILE_FINI(Config), Config). +-endif. +-ifndef(FILE_INIT_PER_TESTCASE). +-define(FILE_INIT_PER_TESTCASE(Config), Config). +-endif. +-ifndef(FILE_FIN_PER_TESTCASE). +-define(FILE_FIN_PER_TESTCASE(Config), Config). +-endif. + +-module(?FILE_SUITE). + +-export([all/1, + init/1, fini/1, + init_per_testcase/2, fin_per_testcase/2, + read_write_file/1, dirs/1, files/1, names/1]). +-export([cur_dir_0/1, cur_dir_1/1, make_del_dir/1, + pos/1, pos1/1, pos2/1]). +-export([close/1, consult/1, consult1/1, path_consult/1, delete/1]). +-export([eval/1, eval1/1, path_eval/1, script/1, script1/1, path_script/1, + open/1, open1/1, + old_modes/1, new_modes/1, path_open/1, open_errors/1]). +-export([file_info/1, file_info_basic_file/1, file_info_basic_directory/1, + file_info_bad/1, file_info_times/1, file_write_file_info/1]). +-export([rename/1, access/1, truncate/1, sync/1, + read_write/1, pread_write/1, append/1]). +-export([errors/1, e_delete/1, e_rename/1, e_make_dir/1, e_del_dir/1]). +-export([otp_5814/1]). + +-export([compression/1, read_not_really_compressed/1, + read_compressed_cooked/1, read_compressed_cooked_binary/1, + read_cooked_tar_problem/1, + write_compressed/1, compress_errors/1, catenated_gzips/1]). + +-export([links/1, make_link/1, read_link_info_for_non_link/1, symlinks/1]). + +-export([copy/1]). + +-export([new_slave/2, old_slave/2, run_test/2]). + +-export([delayed_write/1, read_ahead/1, segment_read/1, segment_write/1]). + +-export([ipread/1]). + +-export([pid2name/1]). + +-export([interleaved_read_write/1]). + +-export([altname/1]). + +-export([large_file/1]). + +-export([read_line_1/1, read_line_2/1, read_line_3/1,read_line_4/1]). + +%% Debug exports +-export([create_file_slow/2, create_file/2, create_bin/2]). +-export([verify_file/2, verify_bin/3]). +-export([bytes/2, iterate/3]). + + + +-include("test_server.hrl"). +-include_lib("kernel/include/file.hrl"). + + + +all(suite) -> + {conf, init, + [altname, read_write_file, dirs, files, + delete, rename, names, errors, + compression, links, copy, + delayed_write, read_ahead, segment_read, segment_write, + ipread, pid2name, interleaved_read_write, + otp_5814, large_file, read_line_1, read_line_2, read_line_3, read_line_4], + fini}. + +init(Config) when is_list(Config) -> + case os:type() of + {win32, _} -> + Priv = ?config(priv_dir, Config), + HasAccessTime = + case ?FILE_MODULE:read_file_info(Priv) of + {ok, #file_info{atime={_, {0, 0, 0}}}} -> + %% This is a unfortunately a FAT file system. + [no_access_time]; + {ok, _} -> + [] + end, + ?FILE_INIT(HasAccessTime++Config); + _ -> + ?FILE_INIT(Config) + end. + +fini(Config) when is_list(Config) -> + case os:type() of + {win32, _} -> + os:cmd("subst z: /d"); + _ -> + ok + end, + ?FILE_FINI(Config). + +init_per_testcase(_Func, Config) -> + %%error_logger:info_msg("~p:~p *****~n", [?MODULE, _Func]), + ?FILE_INIT_PER_TESTCASE(Config). + +fin_per_testcase(_Func, Config) -> + %% error_logger:info_msg("~p:~p END *****~n", [?MODULE, _Func]), + ?FILE_FIN_PER_TESTCASE(Config). + +%% Matches a term (the last) against alternatives +expect(X, _, X) -> + X; +expect(_, X, X) -> + X. + +expect(X, _, _, X) -> + X; +expect(_, X, _, X) -> + X; +expect(_, _, X, X) -> + X. + +expect(X, _, _, _, X) -> + X; +expect(_, X, _, _, X) -> + X; +expect(_, _, X, _, X) -> + X; +expect(_, _, _, X, X) -> + X. + +%% Calculate the time difference +time_dist({YY, MM, DD, H, M, S}, DT) -> + time_dist({{YY, MM, DD}, {H, M, S}}, DT); +time_dist(DT, {YY, MM, DD, H, M, S}) -> + time_dist(DT, {{YY, MM, DD}, {H, M, S}}); +time_dist({_D1, _T1} = DT1, {_D2, _T2} = DT2) -> + calendar:datetime_to_gregorian_seconds(DT2) + - calendar:datetime_to_gregorian_seconds(DT1). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +read_write_file(suite) -> []; +read_write_file(doc) -> []; +read_write_file(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_read_write_file"), + + %% Try writing and reading back some term + ?line SomeTerm = {"This term",{will,be},[written,$t,$o],1,file,[]}, + ?line ok = ?FILE_MODULE:write_file(Name,term_to_binary(SomeTerm)), + ?line {ok,Bin1} = ?FILE_MODULE:read_file(Name), + ?line SomeTerm = binary_to_term(Bin1), + + %% Try a "null" term + ?line NullTerm = [], + ?line ok = ?FILE_MODULE:write_file(Name,term_to_binary(NullTerm)), + ?line {ok,Bin2} = ?FILE_MODULE:read_file(Name), + ?line NullTerm = binary_to_term(Bin2), + + %% Try some "complicated" types + ?line BigNum = 123456789012345678901234567890, + ?line ComplTerm = {self(),make_ref(),BigNum,3.14159}, + ?line ok = ?FILE_MODULE:write_file(Name,term_to_binary(ComplTerm)), + ?line {ok,Bin3} = ?FILE_MODULE:read_file(Name), + ?line ComplTerm = binary_to_term(Bin3), + + %% Try reading a nonexistent file + ?line Name2 = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_nonexistent_file"), + ?line {error, enoent} = ?FILE_MODULE:read_file(Name2), + ?line {error, enoent} = ?FILE_MODULE:read_file(""), + ?line {error, enoent} = ?FILE_MODULE:read_file(''), + + % Try writing to a bad filename + ?line {error, enoent} = + ?FILE_MODULE:write_file("",term_to_binary(NullTerm)), + + % Try writing something else than a binary + ?line {error, badarg} = ?FILE_MODULE:write_file(Name,{1,2,3}), + ?line {error, badarg} = ?FILE_MODULE:write_file(Name,self()), + + %% Some non-term binaries + ?line ok = ?FILE_MODULE:write_file(Name,[]), + ?line {ok,Bin4} = ?FILE_MODULE:read_file(Name), + ?line 0 = byte_size(Bin4), + + ?line ok = ?FILE_MODULE:write_file(Name,[Bin1,[],[[Bin2]]]), + ?line {ok,Bin5} = ?FILE_MODULE:read_file(Name), + ?line {Bin1,Bin2} = split_binary(Bin5,byte_size(Bin1)), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +dirs(suite) -> [make_del_dir, cur_dir_0, cur_dir_1]. + +make_del_dir(suite) -> []; +make_del_dir(doc) -> []; +make_del_dir(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_mk-dir"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + ?line {error, eexist} = ?FILE_MODULE:make_dir(NewDir), + ?line ok = ?FILE_MODULE:del_dir(NewDir), + ?line {error, enoent} = ?FILE_MODULE:del_dir(NewDir), + + %% Check that we get an error when trying to create... + %% a deep directory + ?line NewDir2 = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_mk-dir/foo"), + ?line {error, enoent} = ?FILE_MODULE:make_dir(NewDir2), + %% a nameless directory + ?line {error, enoent} = ?FILE_MODULE:make_dir(""), + %% a directory with illegal name + ?line {error, badarg} = ?FILE_MODULE:make_dir({1,2,3}), + + %% a directory with illegal name, even if it's a (bad) list + ?line {error, badarg} = ?FILE_MODULE:make_dir([1,2,3,{}]), + + %% Maybe this isn't an error, exactly, but worth mentioning anyway: + %% ok = ?FILE_MODULE:make_dir([$f,$o,$o,0,$b,$a,$r])), + %% The above line works, and created a directory "./foo" + %% More elegant would maybe have been to fail, or to really create + %% a directory, but with a name that incorporates the "bar" part of + %% the list, so that [$f,$o,$o,0,$f,$o,$o] wouldn't refer to the same + %% dir. But this would slow it down. + + %% Try deleting some bad directories + %% Deleting the parent directory to the current, sounds dangerous, huh? + %% Don't worry ;-) the parent directory should never be empty, right? + ?line {error, eexist} = ?FILE_MODULE:del_dir('..'), + ?line {error, enoent} = ?FILE_MODULE:del_dir(""), + ?line {error, badarg} = ?FILE_MODULE:del_dir([3,2,1,{}]), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +cur_dir_0(suite) -> []; +cur_dir_0(doc) -> []; +cur_dir_0(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + %% Find out the current dir, and cd to it ;-) + ?line {ok,BaseDir} = ?FILE_MODULE:get_cwd(), + ?line Dir1 = BaseDir ++ "", %% Check that it's a string + ?line ok = ?FILE_MODULE:set_cwd(Dir1), + + %% Make a new dir, and cd to that + ?line RootDir = ?config(priv_dir,Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_curdir"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + ?line io:format("cd to ~s",[NewDir]), + ?line ok = ?FILE_MODULE:set_cwd(NewDir), + + %% Create a file in the new current directory, and check that it + %% really is created there + ?line UncommonName = "uncommon.fil", + ?line {ok,Fd} = ?FILE_MODULE:open(UncommonName,read_write), + ?line ok = ?FILE_MODULE:close(Fd), + ?line {ok,NewDirFiles} = ?FILE_MODULE:list_dir("."), + ?line true = lists:member(UncommonName,NewDirFiles), + + %% Delete the directory and return to the old current directory + %% and check that the created file isn't there (too!) + ?line expect({error, einval}, {error, eacces}, + ?FILE_MODULE:del_dir(NewDir)), + ?line ?FILE_MODULE:delete(UncommonName), + ?line {ok,[]} = ?FILE_MODULE:list_dir("."), + ?line ok = ?FILE_MODULE:set_cwd(Dir1), + ?line io:format("cd back to ~s",[Dir1]), + ?line ok = ?FILE_MODULE:del_dir(NewDir), + ?line {error, enoent} = ?FILE_MODULE:set_cwd(NewDir), + ?line ok = ?FILE_MODULE:set_cwd(Dir1), + ?line io:format("cd back to ~s",[Dir1]), + ?line {ok,OldDirFiles} = ?FILE_MODULE:list_dir("."), + ?line false = lists:member(UncommonName,OldDirFiles), + + %% Try doing some bad things + ?line {error, badarg} = ?FILE_MODULE:set_cwd({foo,bar}), + ?line {error, enoent} = ?FILE_MODULE:set_cwd(""), + ?line {error, enoent} = ?FILE_MODULE:set_cwd(".......a......"), + ?line {ok,BaseDir} = ?FILE_MODULE:get_cwd(), %% Still there? + + %% On Windows, there should only be slashes, no backslashes, + %% in the return value of get_cwd(). + %% (The test is harmless on Unix, because filenames usually + %% don't contain backslashes.) + + ?line {ok, BaseDir} = ?FILE_MODULE:get_cwd(), + ?line false = lists:member($\\, BaseDir), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests ?FILE_MODULE:get_cwd/1. + +cur_dir_1(suite) -> []; +cur_dir_1(doc) -> []; +cur_dir_1(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + + ?line case os:type() of + {unix, _} -> + ?line {error, enotsup} = ?FILE_MODULE:get_cwd("d:"); + vxworks -> + ?line {error, enotsup} = ?FILE_MODULE:get_cwd("d:"); + {win32, _} -> + win_cur_dir_1(Config) + end, + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +win_cur_dir_1(_Config) -> + ?line {ok,BaseDir} = ?FILE_MODULE:get_cwd(), + + %% Get the drive letter from the current directory, + %% and try to get current directory for that drive. + + ?line [Drive,$:|_] = BaseDir, + ?line {ok,BaseDir} = ?FILE_MODULE:get_cwd([Drive,$:]), + io:format("BaseDir = ~s\n", [BaseDir]), + + %% Unfortunately, there is no way to move away from the + %% current drive as we can't use the "subst" command from + %% a SSH connection. We can't test any more. + + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +files(suite) -> [open,pos,file_info,consult,eval,script,truncate,sync]. + +open(suite) -> [open1,old_modes,new_modes,path_open,close,access,read_write, + pread_write,append,open_errors]. + +open1(suite) -> []; +open1(doc) -> []; +open1(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_files"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + ?line Name = filename:join(NewDir, "foo1.fil"), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,read_write), + ?line {ok,Fd2} = ?FILE_MODULE:open(Name,read), + ?line Str = "{a,tuple}.\n", + ?line io:format(Fd1,Str,[]), + ?line {ok,0} = ?FILE_MODULE:position(Fd1,bof), + ?line Str = io:get_line(Fd1,''), + ?line Str = io:get_line(Fd2,''), + ?line ok = ?FILE_MODULE:close(Fd2), + ?line {ok,0} = ?FILE_MODULE:position(Fd1,bof), + ?line ok = ?FILE_MODULE:truncate(Fd1), + ?line eof = io:get_line(Fd1,''), + ?line ok = ?FILE_MODULE:close(Fd1), + ?line {ok,Fd3} = ?FILE_MODULE:open(Name,read), + ?line eof = io:get_line(Fd3,''), + ?line ok = ?FILE_MODULE:close(Fd3), + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests all open modes. + +old_modes(suite) -> []; +old_modes(doc) -> []; +old_modes(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_old_open_modes"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + ?line Name1 = filename:join(NewDir, "foo1.fil"), + ?line Marker = "hello, world", + + %% write + ?line {ok, Fd1} = ?FILE_MODULE:open(Name1, write), + ?line ok = io:write(Fd1, Marker), + ?line ok = io:put_chars(Fd1, ".\n"), + ?line ok = ?FILE_MODULE:close(Fd1), + + %% read + ?line {ok, Fd2} = ?FILE_MODULE:open(Name1, read), + ?line {ok, Marker} = io:read(Fd2, prompt), + ?line ok = ?FILE_MODULE:close(Fd2), + + %% read_write + ?line {ok, Fd3} = ?FILE_MODULE:open(Name1, read_write), + ?line {ok, Marker} = io:read(Fd3, prompt), + ?line ok = io:write(Fd3, Marker), + ?line ok = ?FILE_MODULE:close(Fd3), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + + +new_modes(suite) -> []; +new_modes(doc) -> []; +new_modes(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_new_open_modes"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + ?line Name1 = filename:join(NewDir, "foo1.fil"), + ?line Marker = "hello, world", + + %% write + ?line {ok, Fd1} = ?FILE_MODULE:open(Name1, [write]), + ?line ok = io:write(Fd1, Marker), + ?line ok = io:put_chars(Fd1, ".\n"), + ?line ok = ?FILE_MODULE:close(Fd1), + + %% read + ?line {ok, Fd2} = ?FILE_MODULE:open(Name1, [read]), + ?line {ok, Marker} = io:read(Fd2, prompt), + ?line ok = ?FILE_MODULE:close(Fd2), + + %% read and write + ?line {ok, Fd3} = ?FILE_MODULE:open(Name1, [read, write]), + ?line {ok, Marker} = io:read(Fd3, prompt), + ?line ok = io:write(Fd3, Marker), + ?line ok = ?FILE_MODULE:close(Fd3), + + %% read by default + ?line {ok, Fd4} = ?FILE_MODULE:open(Name1, []), + ?line {ok, Marker} = io:read(Fd4, prompt), + ?line ok = ?FILE_MODULE:close(Fd4), + + %% read and binary + ?line {ok, Fd5} = ?FILE_MODULE:open(Name1, [read, binary]), + ?line {ok, Marker} = io:read(Fd5, prompt), + ?line ok = ?FILE_MODULE:close(Fd5), + + %% read, raw + ?line {ok, Fd6} = ?FILE_MODULE:open(Name1, [read, raw]), + ?line {ok, [$\[]} = ?FILE_MODULE:read(Fd6, 1), + ?line ok = ?FILE_MODULE:close(Fd6), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +path_open(suite) -> []; +path_open(doc) -> []; +path_open(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_path_open"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + ?line FileName = "path_open.fil", + ?line Name = filename:join(RootDir, FileName), + ?line {ok,Fd1,_FullName1} = + ?FILE_MODULE:path_open( + [RootDir, + "nosuch1", + NewDir],FileName,write), + ?line io:format(Fd1,"ABCDEFGH",[]), + ?line ok = ?FILE_MODULE:close(Fd1), + + %% locate it in the last dir + ?line {ok,Fd2,_FullName2} = + ?FILE_MODULE:path_open( + ["nosuch1", + NewDir, + RootDir],FileName,read), + ?line {ok,2} = + ?FILE_MODULE:position(Fd2,2), "C" = io:get_chars(Fd2,'',1), + ?line ok = ?FILE_MODULE:close(Fd2), + %% Try a failing path + ?line {error, enoent} = ?FILE_MODULE:path_open( + ["nosuch1", + NewDir],FileName,read), + %% Check that it's found regardless of path, if an absolute name given + ?line {ok,Fd3,_FullPath3} = + ?FILE_MODULE:path_open( + ["nosuch1", + NewDir],Name,read), + ?line {ok,2} = + ?FILE_MODULE:position(Fd3,2), "C" = io:get_chars(Fd3,'',1), + ?line ok = ?FILE_MODULE:close(Fd3), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +close(suite) -> []; +close(doc) -> []; +close(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_close.fil"), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,read_write), + %% Just closing it is no fun, we did that a million times already + %% This is a common error, for code written before Erlang 4.3 + %% bacause then ?FILE_MODULE:open just returned a Pid, and not everyone + %% really checked what they got. + ?line {'EXIT',_Msg} = (catch ok = ?FILE_MODULE:close({ok,Fd1})), + ?line ok = ?FILE_MODULE:close(Fd1), + + %% Try closing one more time + ?line Val = ?FILE_MODULE:close(Fd1), + ?line io:format("Second close gave: ~p",[Val]), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +access(suite) -> []; +access(doc) -> []; +access(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_access.fil"), + ?line Str = "ABCDEFGH", + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,write), + ?line io:format(Fd1,Str,[]), + ?line ok = ?FILE_MODULE:close(Fd1), + %% Check that we can't write when in read only mode + ?line {ok,Fd2} = ?FILE_MODULE:open(Name,read), + ?line case catch io:format(Fd2,"XXXX",[]) of + ok -> + test_server:fail({format,write}); + _ -> + ok + end, + ?line ok = ?FILE_MODULE:close(Fd2), + ?line {ok,Fd3} = ?FILE_MODULE:open(Name,read), + ?line Str = io:get_line(Fd3,''), + ?line ok = ?FILE_MODULE:close(Fd3), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests ?FILE_MODULE:read/2 and ?FILE_MODULE:write/2. + +read_write(suite) -> []; +read_write(doc) -> []; +read_write(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_read_write"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + ?line Marker = "hello, world", + ?line MarkerB = list_to_binary(Marker), + + %% Plain file. + ?line Name1 = filename:join(NewDir, "plain.fil"), + ?line {ok, Fd1} = ?FILE_MODULE:open(Name1, [read, write]), + ?line read_write_test(Fd1, Marker, []), + + %% Raw file. + ?line Name2 = filename:join(NewDir, "raw.fil"), + ?line {ok, Fd2} = ?FILE_MODULE:open(Name2, [read, write, raw]), + ?line read_write_test(Fd2, Marker, []), + + %% Plain binary file. + ?line Name3 = filename:join(NewDir, "plain-b.fil"), + ?line {ok, Fd3} = ?FILE_MODULE:open(Name3, [read, write, binary]), + ?line read_write_test(Fd3, MarkerB, <<>>), + + %% Raw binary file. + ?line Name4 = filename:join(NewDir, "raw-b.fil"), + ?line {ok, Fd4} = ?FILE_MODULE:open(Name4, [read, write, raw, binary]), + ?line read_write_test(Fd4, MarkerB, <<>>), + + ?line test_server:timetrap_cancel(Dog), + ok. + +read_write_test(File, Marker, Empty) -> + ?line ok = ?FILE_MODULE:write(File, Marker), + ?line {ok, 0} = ?FILE_MODULE:position(File, 0), + ?line {ok, Empty} = ?FILE_MODULE:read(File, 0), + ?line {ok, Marker} = ?FILE_MODULE:read(File, 100), + ?line eof = ?FILE_MODULE:read(File, 100), + ?line {ok, Empty} = ?FILE_MODULE:read(File, 0), + ?line ok = ?FILE_MODULE:close(File), + ?line [] = flush(), + ok. + + +%% Tests ?FILE_MODULE:pread/2 and ?FILE_MODULE:pwrite/2. + +pread_write(suite) -> []; +pread_write(doc) -> []; +pread_write(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_pread_write"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + ?line List = "hello, world", + ?line Bin = list_to_binary(List), + + %% Plain file. + ?line Name1 = filename:join(NewDir, "plain.fil"), + ?line {ok, Fd1} = ?FILE_MODULE:open(Name1, [read, write]), + ?line pread_write_test(Fd1, List), + + %% Raw file. + ?line Name2 = filename:join(NewDir, "raw.fil"), + ?line {ok, Fd2} = ?FILE_MODULE:open(Name2, [read, write, raw]), + ?line pread_write_test(Fd2, List), + + %% Plain file. Binary mode. + ?line Name3 = filename:join(NewDir, "plain-binary.fil"), + ?line {ok, Fd3} = ?FILE_MODULE:open(Name3, [binary, read, write]), + ?line pread_write_test(Fd3, Bin), + + %% Raw file. Binary mode. + ?line Name4 = filename:join(NewDir, "raw-binary.fil"), + ?line {ok, Fd4} = ?FILE_MODULE:open(Name4, [binary, read, write, raw]), + ?line pread_write_test(Fd4, Bin), + + ?line test_server:timetrap_cancel(Dog), + ok. + +pread_write_test(File, Data) -> + ?line io:format("~p:pread_write_test(~p,~p)~n", [?MODULE, File, Data]), + ?line Size = if is_binary(Data) -> byte_size(Data); + is_list(Data) -> length(Data) + end, + ?line I = Size + 17, + ?line ok = ?FILE_MODULE:pwrite(File, 0, Data), + Res = ?FILE_MODULE:pread(File, 0, I), + ?line {ok, Data} = Res, + ?line eof = ?FILE_MODULE:pread(File, I, 1), + ?line ok = ?FILE_MODULE:pwrite(File, [{0, Data}, {I, Data}]), + ?line {ok, [Data, eof, Data]} = + ?FILE_MODULE:pread(File, [{0, Size}, {2*I, 1}, {I, Size}]), + ?line Plist = lists:seq(21*I, 0, -I), + ?line Pwrite = lists:map(fun(P)->{P,Data}end, Plist), + ?line Pread = [{22*I,Size} | lists:map(fun(P)->{P,Size}end, Plist)], + ?line Presult = [eof | lists:map(fun(_)->Data end, Plist)], + ?line ok = ?FILE_MODULE:pwrite(File, Pwrite), + ?line {ok, Presult} = ?FILE_MODULE:pread(File, Pread), + ?line ok = ?FILE_MODULE:close(File), + ?line [] = flush(), + ok. + +append(doc) -> "Test appending to a file."; +append(suite) -> []; +append(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_append"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + + ?line First = "First line\n", + ?line Second = "Seond lines comes here\n", + ?line Third = "And here is the third line\n", + + %% Write a small text file. + ?line Name1 = filename:join(NewDir, "a_file.txt"), + ?line {ok, Fd1} = ?FILE_MODULE:open(Name1, [write]), + ?line ok = io:format(Fd1, First, []), + ?line ok = io:format(Fd1, Second, []), + ?line ok = ?FILE_MODULE:close(Fd1), + + %% Open it a again and a append a line to it. + ?line {ok, Fd2} = ?FILE_MODULE:open(Name1, [append]), + ?line ok = io:format(Fd2, Third, []), + ?line ok = ?FILE_MODULE:close(Fd2), + + %% Read it back and verify. + ?line Expected = list_to_binary([First, Second, Third]), + ?line {ok, Expected} = ?FILE_MODULE:read_file(Name1), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +open_errors(suite) -> []; +open_errors(doc) -> []; +open_errors(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line DataDir = + filename:dirname( + filename:join(?config(data_dir, Config), "x")), + ?line DataDirSlash = DataDir++"/", + ?line {error, E1} = ?FILE_MODULE:open(DataDir, [read]), + ?line {error, E2} = ?FILE_MODULE:open(DataDirSlash, [read]), + ?line {error, E3} = ?FILE_MODULE:open(DataDir, [write]), + ?line {error, E4} = ?FILE_MODULE:open(DataDirSlash, [write]), + ?line {eisdir,eisdir,eisdir,eisdir} = {E1,E2,E3,E4}, + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +pos(suite) -> [pos1,pos2]. + +pos1(suite) -> []; +pos1(doc) -> []; +pos1(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_pos1.fil"), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,write), + ?line io:format(Fd1,"ABCDEFGH",[]), + ?line ok = ?FILE_MODULE:close(Fd1), + ?line {ok,Fd2} = ?FILE_MODULE:open(Name,read), + + %% Start pos is first char + ?line io:format("Relative positions"), + ?line "A" = io:get_chars(Fd2,'',1), + ?line {ok,2} = ?FILE_MODULE:position(Fd2,{cur,1}), + ?line "C" = io:get_chars(Fd2,'',1), + ?line {ok,0} = ?FILE_MODULE:position(Fd2,{cur,-3}), + ?line "A" = io:get_chars(Fd2,'',1), + %% Backwards from first char should be an error + ?line {ok,0} = ?FILE_MODULE:position(Fd2,{cur,-1}), + ?line {error, einval} = ?FILE_MODULE:position(Fd2,{cur,-1}), + %% Reset position and move again + ?line {ok,0} = ?FILE_MODULE:position(Fd2,0), + ?line {ok,2} = ?FILE_MODULE:position(Fd2,{cur,2}), + ?line "C" = io:get_chars(Fd2,'',1), + %% Go a lot forwards + ?line {ok,13} = ?FILE_MODULE:position(Fd2,{cur,10}), + ?line eof = io:get_chars(Fd2,'',1), + + %% Try some fixed positions + ?line io:format("Fixed positions"), + ?line {ok,8} = + ?FILE_MODULE:position(Fd2,8), eof = io:get_chars(Fd2,'',1), + ?line {ok,8} = + ?FILE_MODULE:position(Fd2,cur), eof = io:get_chars(Fd2,'',1), + ?line {ok,7} = + ?FILE_MODULE:position(Fd2,7), "H" = io:get_chars(Fd2,'',1), + ?line {ok,0} = + ?FILE_MODULE:position(Fd2,0), "A" = io:get_chars(Fd2,'',1), + ?line {ok,3} = + ?FILE_MODULE:position(Fd2,3), "D" = io:get_chars(Fd2,'',1), + ?line {ok,12} = + ?FILE_MODULE:position(Fd2,12), eof = io:get_chars(Fd2,'',1), + ?line {ok,3} = + ?FILE_MODULE:position(Fd2,3), "D" = io:get_chars(Fd2,'',1), + %% Try the {bof,X} notation + ?line {ok,3} = ?FILE_MODULE:position(Fd2,{bof,3}), + ?line "D" = io:get_chars(Fd2,'',1), + + %% Try eof positions + ?line io:format("EOF positions"), + ?line {ok,8} = + ?FILE_MODULE:position(Fd2,{eof,0}), eof=io:get_chars(Fd2,'',1), + ?line {ok,7} = + ?FILE_MODULE:position(Fd2,{eof,-1}), + ?line "H" = io:get_chars(Fd2,'',1), + ?line {ok,0} = + ?FILE_MODULE:position(Fd2,{eof,-8}), "A"=io:get_chars(Fd2,'',1), + ?line {error, einval} = ?FILE_MODULE:position(Fd2,{eof,-9}), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +pos2(suite) -> []; +pos2(doc) -> []; +pos2(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_pos2.fil"), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,write), + ?line io:format(Fd1,"ABCDEFGH",[]), + ?line ok = ?FILE_MODULE:close(Fd1), + ?line {ok,Fd2} = ?FILE_MODULE:open(Name,read), + ?line {error, einval} = ?FILE_MODULE:position(Fd2,-1), + + %% Make sure that we still can search after an error. + ?line {ok,0} = ?FILE_MODULE:position(Fd2, 0), + ?line {ok,3} = ?FILE_MODULE:position(Fd2, {bof,3}), + ?line "D" = io:get_chars(Fd2,'',1), + + ?line [] = flush(), + ?line io:format("DONE"), + ?line test_server:timetrap_cancel(Dog), + ok. + +file_info(suite) -> [file_info_basic_file, file_info_basic_directory, + file_info_bad, file_info_times, file_write_file_info]. + +file_info_basic_file(suite) -> []; +file_info_basic_file(doc) -> []; +file_info_basic_file(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir, Config), + + %% Create a short file. + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_basic_test.fil"), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name, write), + ?line io:put_chars(Fd1, "foo bar"), + ?line ok = ?FILE_MODULE:close(Fd1), + + %% Test that the file has the expected attributes. + %% The times are tricky, so we will save them to a separate test case. + ?line {ok,#file_info{size=Size,type=Type,access=Access, + atime=AccessTime,mtime=ModifyTime}} = + ?FILE_MODULE:read_file_info(Name), + ?line io:format("Access ~p, Modify ~p", [AccessTime, ModifyTime]), + ?line Size = 7, + ?line Type = regular, + ?line read_write = Access, + ?line true = abs(time_dist(filter_atime(AccessTime, Config), + filter_atime(ModifyTime, + Config))) < 2, + ?line all_integers(tuple_to_list(AccessTime) ++ tuple_to_list(ModifyTime)), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +file_info_basic_directory(suite) -> []; +file_info_basic_directory(doc) -> []; +file_info_basic_directory(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + + %% Note: filename:join/1 removes any trailing slash, + %% which is essential for ?FILE_MODULE:file_info/1 to work on + %% platforms such as Windows95. + ?line RootDir = filename:join([?config(priv_dir, Config)]), + + %% Test that the RootDir directory has the expected attributes. + ?line test_directory(RootDir, read_write), + + %% Note that on Windows file systems, + %% "/" or "c:/" are *NOT* directories. + %% Therefore, test that ?FILE_MODULE:file_info/1 behaves as if they were + %% directories. + ?line case os:type() of + {win32, _} -> + ?line test_directory("/", read_write), + ?line test_directory("c:/", read_write), + ?line test_directory("c:\\", read_write); + {unix, _} -> + ?line test_directory("/", read); + vxworks -> + %% Check is just done for owner + ?line test_directory("/", read_write) + end, + ?line test_server:timetrap_cancel(Dog). + +test_directory(Name, ExpectedAccess) -> + ?line {ok,#file_info{size=Size,type=Type,access=Access, + atime=AccessTime,mtime=ModifyTime}} = + ?FILE_MODULE:read_file_info(Name), + ?line io:format("Testing directory ~s", [Name]), + ?line io:format("Directory size is ~p", [Size]), + ?line io:format("Access ~p", [Access]), + ?line io:format("Access time ~p; Modify time~p", + [AccessTime, ModifyTime]), + ?line Type = directory, + ?line Access = ExpectedAccess, + ?line all_integers(tuple_to_list(AccessTime) ++ tuple_to_list(ModifyTime)), + ?line [] = flush(), + ok. + +all_integers([{A,B,C}|T]) -> + all_integers([A,B,C|T]); +all_integers([Int|Rest]) when is_integer(Int) -> + ?line all_integers(Rest); +all_integers([]) -> ok. + +%% Try something nonexistent. + +file_info_bad(suite) -> []; +file_info_bad(doc) -> []; +file_info_bad(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = filename:join([?config(priv_dir, Config)]), + ?line {error, enoent} = + ?FILE_MODULE:read_file_info( + filename:join(RootDir, + atom_to_list(?MODULE)++ "_nonexistent")), + ?line {error, enoent} = ?FILE_MODULE:read_file_info(""), + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Test that the file times behave as they should. + +file_info_times(suite) -> []; +file_info_times(doc) -> []; +file_info_times(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(60)), + %% We have to try this twice, since if the test runs across the change + %% of a month the time diff calculations will fail. But it won't happen + %% if you run it twice in succession. + ?line test_server:m_out_of_n( + 1,2, + fun() -> ?line file_info_int(Config) end), + ?line test_server:timetrap_cancel(Dog), + ok. + +file_info_int(Config) -> + %% Note: filename:join/1 removes any trailing slash, + %% which is essential for ?FILE_MODULE:file_info/1 to work on + %% platforms such as Windows95. + + ?line RootDir = filename:join([?config(priv_dir, Config)]), + ?line test_server:format("RootDir = ~p", [RootDir]), + + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_file_info.fil"), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,write), + ?line io:put_chars(Fd1,"foo"), + + %% check that the file got a modify date max a few seconds away from now + ?line {ok,#file_info{type=regular,atime=AccTime1,mtime=ModTime1}} = + ?FILE_MODULE:read_file_info(Name), + ?line Now = erlang:localtime(), %??? + ?line io:format("Now ~p",[Now]), + ?line io:format("Open file Acc ~p Mod ~p",[AccTime1,ModTime1]), + ?line true = abs(time_dist(filter_atime(Now, Config), + filter_atime(AccTime1, + Config))) < 8, + ?line true = abs(time_dist(Now,ModTime1)) < 8, + + %% Sleep until we can be sure the seconds value has changed. + %% Note: FAT-based filesystem (like on Windows 95) have + %% a resolution of 2 seconds. + ?line test_server:sleep(test_server:seconds(2.2)), + + %% close the file, and watch the modify date change + ?line ok = ?FILE_MODULE:close(Fd1), + ?line {ok,#file_info{size=Size,type=regular,access=Access, + atime=AccTime2,mtime=ModTime2}} = + ?FILE_MODULE:read_file_info(Name), + ?line io:format("Closed file Acc ~p Mod ~p",[AccTime2,ModTime2]), + ?line true = time_dist(ModTime1,ModTime2) >= 0, + + %% this file is supposed to be binary, so it'd better keep it's size + ?line Size = 3, + ?line Access = read_write, + + %% Do some directory checking + ?line {ok,#file_info{size=DSize,type=directory,access=DAccess, + atime=AccTime3,mtime=ModTime3}} = + ?FILE_MODULE:read_file_info(RootDir), + %% this dir was modified only a few secs ago + ?line io:format("Dir Acc ~p; Mod ~p; Now ~p", [AccTime3, ModTime3, Now]), + ?line true = abs(time_dist(Now,ModTime3)) < 5, + ?line DAccess = read_write, + ?line io:format("Dir size is ~p",[DSize]), + + ?line [] = flush(), + ok. + +%% Filter access times, to copy with a deficiency of FAT file systems +%% (on Windows): The access time is actually only a date. + +filter_atime(Atime, Config) -> + case lists:member(no_access_time, Config) of + true -> + case Atime of + {Date, _} -> + {Date, {0, 0, 0}}; + {Y, M, D, _, _, _} -> + {Y, M, D, 0, 0, 0} + end; + false -> + Atime + end. + +%% Test the write_file_info/2 function. + +file_write_file_info(suite) -> []; +file_write_file_info(doc) -> []; +file_write_file_info(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = get_good_directory(Config), + ?line test_server:format("RootDir = ~p", [RootDir]), + + %% Set the file to read only AND update the file times at the same time. + %% (This used to fail on Windows NT/95 for a local filesystem.) + %% Note: Seconds must be even; see note in file_info_times/1. + + ?line Name1 = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_write_file_info_ro"), + ?line ok = ?FILE_MODULE:write_file(Name1, "hello"), + ?line Time = {{1997, 01, 02}, {12, 35, 42}}, + ?line Info = #file_info{mode=8#400, atime=Time, mtime=Time, ctime=Time}, + ?line ok = ?FILE_MODULE:write_file_info(Name1, Info), + + %% Read back the times. + + ?line {ok, ActualInfo} = ?FILE_MODULE:read_file_info(Name1), + ?line #file_info{mode=_Mode, atime=ActAtime, mtime=Time, + ctime=ActCtime} = ActualInfo, + ?line FilteredAtime = filter_atime(Time, Config), + ?line FilteredAtime = filter_atime(ActAtime, Config), + ?line case os:type() of + {win32, _} -> + %% On Windows, "ctime" means creation time and it can + %% be set. + ActCtime = Time; + _ -> + ok + end, + ?line {error, eacces} = ?FILE_MODULE:write_file(Name1, "hello again"), + + %% Make the file writable again. + + ?line ?FILE_MODULE:write_file_info(Name1, #file_info{mode=8#600}), + ?line ok = ?FILE_MODULE:write_file(Name1, "hello again"), + + %% And unwritable. + ?line ?FILE_MODULE:write_file_info(Name1, #file_info{mode=8#400}), + ?line {error, eacces} = ?FILE_MODULE:write_file(Name1, "hello again"), + + %% Write the times again. + %% Note: Seconds must be even; see note in file_info_times/1. + + ?line NewTime = {{1997, 02, 15}, {13, 18, 20}}, + ?line NewInfo = #file_info{atime=NewTime, mtime=NewTime, ctime=NewTime}, + ?line ok = ?FILE_MODULE:write_file_info(Name1, NewInfo), + ?line {ok, ActualInfo2} = ?FILE_MODULE:read_file_info(Name1), + ?line #file_info{atime=NewActAtime, mtime=NewTime, + ctime=NewActCtime} = ActualInfo2, + ?line NewFilteredAtime = filter_atime(NewTime, Config), + ?line NewFilteredAtime = filter_atime(NewActAtime, Config), + ?line case os:type() of + {win32, _} -> NewActCtime = NewTime; + _ -> ok + end, + + %% The file should still be unwritable. + ?line {error, eacces} = ?FILE_MODULE:write_file(Name1, "hello again"), + + %% Make the file writeable again, so that we can remove the + %% test suites ... :-) + ?line ?FILE_MODULE:write_file_info(Name1, #file_info{mode=8#600}), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Returns a directory on a file system that has correct file times. + +get_good_directory(Config) -> + ?line ?config(priv_dir, Config). + +consult(suite) -> [consult1, path_consult]. + +consult1(suite) -> []; +consult1(doc) -> []; +consult1(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_consult.fil"), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,write), + %% note that there is no final \n (only a space) + ?line io:format(Fd1, + "{this,[is,1.0],'journey'}.\n\"into\". (sound). ", + []), + ?line ok = ?FILE_MODULE:close(Fd1), + ?line {ok,[{this,[is,1.0],journey},"into",sound]} = + ?FILE_MODULE:consult(Name), + + ?line {ok,Fd2} = ?FILE_MODULE:open(Name,write), + %% note the missing double quote + ?line io:format( + Fd2,"{this,[is,1.0],'journey'}.\n \"into. (sound). ",[]), + ?line ok = ?FILE_MODULE:close(Fd2), + ?line {error, {_, _, _} = Msg} = ?FILE_MODULE:consult(Name), + ?line io:format("Errmsg: ~p",[Msg]), + + ?line {error, enoent} = ?FILE_MODULE:consult(Name ++ ".nonexistent"), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +path_consult(suite) -> []; +path_consult(doc) -> []; +path_consult(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line FileName = atom_to_list(?MODULE)++"_path_consult.fil", + ?line Name = filename:join(RootDir, FileName), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,write), + ?line io:format(Fd1,"{this,is,a,journey,into,sound}.\n",[]), + ?line ok = ?FILE_MODULE:close(Fd1), + %% File last in path + ?line {ok,[{this,is,a,journey,into,sound}],Dir} = + ?FILE_MODULE:path_consult( + [filename:join(RootDir, "dir1"), + filename:join(RootDir, ".."), + filename:join(RootDir, "dir2"), + RootDir], FileName), + ?line true = lists:prefix(RootDir,Dir), + + %% While maybe not an error, it may be worth noting that + %% when the full path to a file is given, it's always found + %% regardless of the contents of the path + ?line {ok,_,_} = ?FILE_MODULE:path_consult(["nosuch1","nosuch2"],Name), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +eval(suite) -> [eval1,path_eval]. + +eval1(suite) -> []; +eval1(doc) -> []; +eval1(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE)++"_eval.fil"), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,write), + %% note that there is no final \n (only a space) + ?line io:format(Fd1,"put(evaluated_ok,\ntrue). ",[]), + ?line ok = ?FILE_MODULE:close(Fd1), + ?line ok = ?FILE_MODULE:eval(Name), + ?line true = get(evaluated_ok), + + ?line {ok,Fd2} = ?FILE_MODULE:open(Name,write), + %% note that there is no final \n (only a space) + ?line io:format(Fd2,"put(evaluated_ok,\nR). ",[]), + ?line ok = ?FILE_MODULE:close(Fd2), + ?line ok = ?FILE_MODULE:eval( + Name, + erl_eval:add_binding('R', true, erl_eval:new_bindings())), + ?line true = get(evaluated_ok), + + ?line {ok,Fd3} = ?FILE_MODULE:open(Name,write), + %% garbled + ?line io:format(Fd3,"puGARBLED-GARBLED\ntrue). ",[]), + ?line ok = ?FILE_MODULE:close(Fd3), + ?line {error, {_, _, _} = Msg} = ?FILE_MODULE:eval(Name), + ?line io:format("Errmsg1: ~p",[Msg]), + + ?line {error, enoent} = ?FILE_MODULE:eval(Name ++ ".nonexistent"), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +path_eval(suite) -> []; +path_eval(doc) -> []; +path_eval(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line FileName = atom_to_list(?MODULE)++"_path_eval.fil", + ?line Name = filename:join(RootDir, FileName), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,write), + ?line io:format(Fd1,"put(evaluated_ok,true).\n",[]), + ?line ok = ?FILE_MODULE:close(Fd1), + %% File last in path + ?line {ok,Dir} = + ?FILE_MODULE:path_eval( + [filename:join(RootDir, "dir1"), + filename:join(RootDir, ".."), + filename:join(RootDir, "dir2"), + RootDir],FileName), + ?line true = get(evaluated_ok), + ?line true = lists:prefix(RootDir,Dir), + + %% While maybe not an error, it may be worth noting that + %% when the full path to a file is given, it's always found + %% regardless of the contents of the path + ?line {ok,Fd2} = ?FILE_MODULE:open(Name,write), + ?line io:format(Fd2,"put(evaluated_ok,R).\n",[]), + ?line ok = ?FILE_MODULE:close(Fd2), + ?line {ok,_} = ?FILE_MODULE:path_eval( + ["nosuch1","nosuch2"], + Name, + erl_eval:add_binding('R', true, erl_eval:new_bindings())), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +script(suite) -> [script1,path_script]. + +script1(suite) -> []; +script1(doc) -> ""; +script1(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE)++"_script.fil"), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,write), + %% note that there is no final \n (only a space) + ?line io:format(Fd1,"A = 11,\nB = 6,\nA+B. ",[]), + ?line ok = ?FILE_MODULE:close(Fd1), + ?line {ok,17} = ?FILE_MODULE:script(Name), + + ?line {ok,Fd2} = ?FILE_MODULE:open(Name,write), + %% note that there is no final \n (only a space) + ?line io:format(Fd2,"A = 11,\nA+B. ",[]), + ?line ok = ?FILE_MODULE:close(Fd2), + ?line {ok,17} = ?FILE_MODULE:script( + Name, + erl_eval:add_binding('B', 6, erl_eval:new_bindings())), + + ?line {ok,Fd3} = ?FILE_MODULE:open(Name,write), + ?line io:format(Fd3,"A = 11,\nB = six,\nA+B. ",[]), + ?line ok = ?FILE_MODULE:close(Fd3), + ?line {error, {_, _, _} = Msg} = ?FILE_MODULE:script(Name), + ?line io:format("Errmsg1: ~p",[Msg]), + + ?line {error, enoent} = ?FILE_MODULE:script(Name ++ ".nonexistent"), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +path_script(suite) -> []; +path_script(doc) -> []; +path_script(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line FileName = atom_to_list(?MODULE)++"_path_script.fil", + ?line Name = filename:join(RootDir, FileName), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name,write), + ?line io:format(Fd1,"A = 11,\nB = 6,\nA+B.\n",[]), + ?line ok = ?FILE_MODULE:close(Fd1), + %% File last in path + ?line {ok, 17, Dir} = + ?FILE_MODULE:path_script( + [filename:join(RootDir, "dir1"), + filename:join(RootDir, ".."), + filename:join(RootDir, "dir2"), + RootDir],FileName), + ?line true = lists:prefix(RootDir,Dir), + + %% While maybe not an error, it may be worth noting that + %% when the full path to a file is given, it's always found + %% regardless of the contents of the path + ?line {ok,Fd2} = ?FILE_MODULE:open(Name,write), + ?line io:format(Fd2,"A = 11,\nA+B.",[]), + ?line ok = ?FILE_MODULE:close(Fd2), + ?line {ok, 17, Dir} = + ?FILE_MODULE:path_script( + ["nosuch1","nosuch2"], + Name, + erl_eval:add_binding('B', 6, erl_eval:new_bindings())), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + + + +truncate(suite) -> []; +truncate(doc) -> []; +truncate(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_truncate.fil"), + + %% Create a file with some data. + ?line MyData = "0123456789abcdefghijklmnopqrstuvxyz", + ?line ok = ?FILE_MODULE:write_file(Name, MyData), + + %% Truncate the file to 10 characters. + ?line {ok, Fd} = ?FILE_MODULE:open(Name, read_write), + ?line {ok, 10} = ?FILE_MODULE:position(Fd, 10), + ?line ok = ?FILE_MODULE:truncate(Fd), + ?line ok = ?FILE_MODULE:close(Fd), + + %% Read back the file and check that it has been truncated. + ?line Expected = list_to_binary("0123456789"), + ?line {ok, Expected} = ?FILE_MODULE:read_file(Name), + + %% Open the file read only and verify that it is not possible to + %% truncate it, OTP-1960 + ?line {ok, Fd2} = ?FILE_MODULE:open(Name, read), + ?line {ok, 5} = ?FILE_MODULE:position(Fd2, 5), + ?line {error, _} = ?FILE_MODULE:truncate(Fd2), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + + +sync(suite) -> []; +sync(doc) -> "Tests that ?FILE_MODULE:sync/1 at least doesn't crash."; +sync(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line PrivDir = ?config(priv_dir, Config), + ?line Sync = filename:join(PrivDir, + atom_to_list(?MODULE) + ++"_sync.fil"), + + %% Raw open. + ?line {ok, Fd} = ?FILE_MODULE:open(Sync, [write, raw]), + ?line ok = ?FILE_MODULE:sync(Fd), + ?line ok = ?FILE_MODULE:close(Fd), + + %% Ordinary open. + ?line {ok, Fd2} = ?FILE_MODULE:open(Sync, [write]), + ?line ok = ?FILE_MODULE:sync(Fd2), + ?line ok = ?FILE_MODULE:close(Fd2), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +delete(suite) -> []; +delete(doc) -> []; +delete(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_delete.fil"), + ?line {ok, Fd1} = ?FILE_MODULE:open(Name, write), + ?line io:format(Fd1,"ok.\n",[]), + ?line ok = ?FILE_MODULE:close(Fd1), + %% Check that the file is readable + ?line {ok, Fd2} = ?FILE_MODULE:open(Name, read), + ?line ok = ?FILE_MODULE:close(Fd2), + ?line ok = ?FILE_MODULE:delete(Name), + %% Check that the file is not readable anymore + ?line {error, _} = ?FILE_MODULE:open(Name, read), + %% Try deleting a nonexistent file + ?line {error, enoent} = ?FILE_MODULE:delete(Name), + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +rename(suite) ->[]; +rename(doc) ->[]; +rename(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line FileName1 = atom_to_list(?MODULE)++"_rename.fil", + ?line FileName2 = atom_to_list(?MODULE)++"_rename.ful", + ?line Name1 = filename:join(RootDir, FileName1), + ?line Name2 = filename:join(RootDir, FileName2), + ?line {ok,Fd1} = ?FILE_MODULE:open(Name1,write), + ?line ok = ?FILE_MODULE:close(Fd1), + %% Rename, and check that id really changed name + ?line ok = ?FILE_MODULE:rename(Name1,Name2), + ?line {error, _} = ?FILE_MODULE:open(Name1,read), + ?line {ok,Fd2} = ?FILE_MODULE:open(Name2,read), + ?line ok = ?FILE_MODULE:close(Fd2), + %% Try renaming something to itself + ?line ok = ?FILE_MODULE:rename(Name2,Name2), + %% Try renaming something that doesn't exist + ?line {error, enoent} = ?FILE_MODULE:rename(Name1,Name2), + %% Try renaming to something else than a string + ?line {error, badarg} = ?FILE_MODULE:rename(Name1,{foo,bar}), + + %% Move between directories + ?line DirName1 = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_rename_dir"), + ?line DirName2 = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_second_rename_dir"), + ?line Name1foo = filename:join(DirName1, "foo.fil"), + ?line Name2foo = filename:join(DirName2, "foo.fil"), + ?line Name2bar = filename:join(DirName2, "bar.dir"), + ?line ok = ?FILE_MODULE:make_dir(DirName1), + %% The name has to include the full file name, path in not enough + ?line expect({error, eisdir}, {error, eexist}, + ?FILE_MODULE:rename(Name2,DirName1)), + ?line ok = ?FILE_MODULE:rename(Name2, Name1foo), + %% Now rename the directory + ?line ok = ?FILE_MODULE:rename(DirName1,DirName2), + %% And check that the file is there now + ?line {ok,Fd3} = ?FILE_MODULE:open(Name2foo, read), + ?line ok = ?FILE_MODULE:close(Fd3), + %% Try some dirty things now: move the directory into itself + ?line {error, Msg1} = ?FILE_MODULE:rename(DirName2, Name2bar), + ?line io:format("Errmsg1: ~p",[Msg1]), + %% move dir into a file in itself + ?line {error, Msg2} = ?FILE_MODULE:rename(DirName2, Name2foo), + ?line io:format("Errmsg2: ~p",[Msg2]), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +names(suite) -> []; +names(doc) -> []; +names(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line FileName = "foo1.fil", + ?line Name1 = filename:join(RootDir, FileName), + ?line Name2 = [RootDir,"/","foo1",".","fil"], + ?line Name3 = [RootDir,"/",foo,$1,[[[],[],'.']],"f",il], + ?line Name4 = list_to_atom(Name1), + ?line {ok,Fd0} = ?FILE_MODULE:open(Name1,write), + ?line ok = ?FILE_MODULE:close(Fd0), + + %% Try some file names + ?line {ok,Fd1} = ?FILE_MODULE:open(Name1,read), + ?line ok = ?FILE_MODULE:close(Fd1), + ?line {ok,Fd2f} = ?FILE_MODULE:open(lists:flatten(Name2),read), + ?line ok = ?FILE_MODULE:close(Fd2f), + ?line {ok,Fd2} = ?FILE_MODULE:open(Name2,read), + ?line ok = ?FILE_MODULE:close(Fd2), + ?line {ok,Fd3} = ?FILE_MODULE:open(Name3,read), + ?line ok = ?FILE_MODULE:close(Fd3), + ?line {ok,Fd4} = ?FILE_MODULE:open(Name4,read), + ?line ok = ?FILE_MODULE:close(Fd4), + + %% Try some path names + ?line Path1 = RootDir, + ?line Path2 = [RootDir], + ?line Path3 = ['',[],[RootDir,[[]]]], + ?line Path4 = list_to_atom(Path1), + ?line {ok,Fd11,_} = ?FILE_MODULE:path_open([Path1],FileName,read), + ?line ok = ?FILE_MODULE:close(Fd11), + ?line {ok,Fd12,_} = ?FILE_MODULE:path_open([Path2],FileName,read), + ?line ok = ?FILE_MODULE:close(Fd12), + ?line {ok,Fd13,_} = ?FILE_MODULE:path_open([Path3],FileName,read), + ?line ok = ?FILE_MODULE:close(Fd13), + ?line {ok,Fd14,_} = ?FILE_MODULE:path_open([Path4],FileName,read), + ?line ok = ?FILE_MODULE:close(Fd14), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +errors(suite) -> [e_delete, e_rename, e_make_dir, e_del_dir]. + +e_delete(suite) -> []; +e_delete(doc) -> []; +e_delete(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line Base = filename:join(RootDir, + atom_to_list(?MODULE)++"_e_delete"), + ?line ok = ?FILE_MODULE:make_dir(Base), + + %% Delete a non-existing file. + ?line {error, enoent} = + ?FILE_MODULE:delete(filename:join(Base, "non_existing")), + + %% Delete a directory. + ?line {error, eperm} = ?FILE_MODULE:delete(Base), + + %% Use a path-name with a non-directory component. + ?line Afile = filename:join(Base, "a_file"), + ?line ok = ?FILE_MODULE:write_file(Afile, "hello\n"), + ?line {error, E} = + expect({error, enotdir}, {error, enoent}, + ?FILE_MODULE:delete(filename:join(Afile, "another_file"))), + ?line io:format("Result: ~p~n", [E]), + + %% No permission. + ?line case os:type() of + {unix, _} -> + ?line ?FILE_MODULE:write_file_info( + Base, #file_info {mode=0}), + ?line {error, eacces} = ?FILE_MODULE:delete(Afile), + ?line ?FILE_MODULE:write_file_info( + Base, #file_info {mode=8#600}); + {win32, _} -> + %% Remove a character device. + ?line {error, eacces} = ?FILE_MODULE:delete("nul"); + vxworks -> + ok + end, + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%%% FreeBSD gives EEXIST when renaming a file to an empty dir, although the +%%% manual page can be interpreted as saying that EISDIR should be given. +%%% (What about FreeBSD? We store our nightly build results on a FreeBSD +%%% file system, that's what.) + +e_rename(suite) -> []; +e_rename(doc) -> []; +e_rename(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {comment, "Windriver: dosFs must be fixed first!"}; + _ -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line Base = filename:join(RootDir, + atom_to_list(?MODULE)++"_e_rename"), + ?line ok = ?FILE_MODULE:make_dir(Base), + + %% Create an empty directory. + ?line EmptyDir = filename:join(Base, "empty_dir"), + ?line ok = ?FILE_MODULE:make_dir(EmptyDir), + + %% Create a non-empty directory. + ?line NonEmptyDir = filename:join(Base, "non_empty_dir"), + ?line ok = ?FILE_MODULE:make_dir(NonEmptyDir), + ?line ok = ?FILE_MODULE:write_file( + filename:join(NonEmptyDir, "a_file"), + "hello\n"), + + %% Create another non-empty directory. + ?line ADirectory = filename:join(Base, "a_directory"), + ?line ok = ?FILE_MODULE:make_dir(ADirectory), + ?line ok = ?FILE_MODULE:write_file( + filename:join(ADirectory, "a_file"), + "howdy\n\n"), + + %% Create a data file. + ?line File = filename:join(Base, "just_a_file"), + ?line ok = ?FILE_MODULE:write_file(File, "anything goes\n\n"), + + %% Move an existing directory to a non-empty directory. + ?line {error, eexist} = + ?FILE_MODULE:rename(ADirectory, NonEmptyDir), + + %% Move a root directory. + ?line {error, einval} = ?FILE_MODULE:rename("/", "arne"), + + %% Move Base into Base/new_name. + ?line {error, einval} = + ?FILE_MODULE:rename(Base, filename:join(Base, "new_name")), + + %% Overwrite a directory with a file. + ?line expect({error, eexist}, %FreeBSD (?) + {error, eisdir}, + ?FILE_MODULE:rename(File, EmptyDir)), + ?line expect({error, eexist}, %FreeBSD (?) + {error, eisdir}, + ?FILE_MODULE:rename(File, NonEmptyDir)), + + %% Move a non-existing file. + ?line NonExistingFile = + filename:join(Base, "non_existing_file"), + ?line {error, enoent} = + ?FILE_MODULE:rename(NonExistingFile, NonEmptyDir), + + %% Overwrite a file with a directory. + ?line expect({error, eexist}, %FreeBSD (?) + {error, enotdir}, + ?FILE_MODULE:rename(ADirectory, File)), + + %% Move a file to another filesystem. + %% XXX - This test case is bogus. We cannot be guaranteed that + %% the source and destination are on + %% different filesystems. + %% + %% XXX - Gross hack! + ?line Comment = + case os:type() of + {unix, _} -> + OtherFs = "/tmp", + ?line NameOnOtherFs = + filename:join(OtherFs, filename:basename(File)), + ?line {ok, Com} = + case ?FILE_MODULE:rename(File, NameOnOtherFs) of + {error, exdev} -> + %% The file could be in + %% the same filesystem! + {ok, ok}; + ok -> + {ok, {comment, + "Moving between filesystems " + "suceeded, files are probably " + "in the same filesystem!"}}; + {error, eperm} -> + {ok, {comment, "SBS! You don't " + "have the permission to do " + "this test!"}}; + Else -> + Else + end, + Com; + {win32, _} -> + %% At least Windows NT can + %% successfully move a file to + %% another drive. + ok + end, + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + Comment + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +e_make_dir(suite) -> []; +e_make_dir(doc) -> []; +e_make_dir(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line Base = filename:join(RootDir, + atom_to_list(?MODULE)++"_e_make_dir"), + ?line ok = ?FILE_MODULE:make_dir(Base), + + %% A component of the path does not exist. + ?line {error, enoent} = + ?FILE_MODULE:make_dir(filename:join([Base, "a", "b"])), + + %% Use a path-name with a non-directory component. + ?line Afile = filename:join(Base, "a_directory"), + ?line ok = ?FILE_MODULE:write_file(Afile, "hello\n"), + ?line case ?FILE_MODULE:make_dir( + filename:join(Afile, "another_directory")) of + {error, enotdir} -> io:format("Result: enotdir"); + {error, enoent} -> io:format("Result: enoent") + end, + + %% No permission (on Unix only). + case os:type() of + {unix, _} -> + ?line ?FILE_MODULE:write_file_info(Base, #file_info {mode=0}), + ?line {error, eacces} = + ?FILE_MODULE:make_dir(filename:join(Base, "xxxx")), + ?line ?FILE_MODULE:write_file_info( + Base, #file_info {mode=8#600}); + {win32, _} -> + ok; + vxworks -> + ok + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +e_del_dir(suite) -> []; +e_del_dir(doc) -> []; +e_del_dir(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line Base = test_server:temp_name(filename:join(RootDir, "e_del_dir")), + ?line io:format("Base: ~p", [Base]), + ?line ok = ?FILE_MODULE:make_dir(Base), + + %% Delete a non-existent directory. + ?line {error, enoent} = + ?FILE_MODULE:del_dir(filename:join(Base, "non_existing")), + + %% Use a path-name with a non-directory component. + ?line Afile = filename:join(Base, "a_directory"), + ?line ok = ?FILE_MODULE:write_file(Afile, "hello\n"), + ?line {error, E1} = + expect({error, enotdir}, {error, enoent}, + ?FILE_MODULE:del_dir( + filename:join(Afile, "another_directory"))), + ?line io:format("Result: ~p", [E1]), + + %% Delete a non-empty directory. + ?line {error, E2} = + expect({error, enotempty}, {error, eexist}, {error, eacces}, + ?FILE_MODULE:del_dir(Base)), + ?line io:format("Result: ~p", [E2]), + + %% Remove the current directory. + ?line {error, E3} = + expect({error, einval}, + {error, eperm}, % Linux and DUX + {error, eacces}, + {error, ebusy}, + ?FILE_MODULE:del_dir(".")), + ?line io:format("Result: ~p", [E3]), + + %% No permission. + case os:type() of + {unix, _} -> + ?line ADirectory = filename:join(Base, "no_perm"), + ?line ok = ?FILE_MODULE:make_dir(ADirectory), + ?line ?FILE_MODULE:write_file_info( + Base, #file_info {mode=0}), + ?line {error, eacces} = ?FILE_MODULE:del_dir(ADirectory), + ?line ?FILE_MODULE:write_file_info( + Base, #file_info {mode=8#600}); + {win32, _} -> + ok; + vxworks -> + ok + end, + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +compression(suite) -> + [read_compressed_cooked, read_compressed_cooked_binary, + read_cooked_tar_problem, + read_not_really_compressed, + write_compressed, compress_errors, + catenated_gzips]. + +%% Trying reading and positioning from a compressed file. + +read_compressed_cooked(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line Real = filename:join(Data, "realmen.html.gz"), + ?line {ok, Fd} = ?FILE_MODULE:open(Real, [read,compressed]), + ?line try_read_file_list(Fd). + +read_compressed_cooked_binary(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line Real = filename:join(Data, "realmen.html.gz"), + ?line {ok, Fd} = ?FILE_MODULE:open(Real, [read,compressed,binary]), + ?line try_read_file_binary(Fd). + +%% Trying reading and positioning from an uncompressed file, +%% but with the compressed flag given. + +read_not_really_compressed(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line Priv = ?config(priv_dir, Config), + + %% The file realmen.html might have got CRs added (by WinZip). + %% Remove them, or the file positions will not be correct. + + ?line Real = filename:join(Data, "realmen.html"), + ?line RealPriv = filename:join(Priv, + atom_to_list(?MODULE)++"_realmen.html"), + ?line {ok, RealDataBin} = ?FILE_MODULE:read_file(Real), + ?line RealData = remove_crs(binary_to_list(RealDataBin), []), + ?line ok = ?FILE_MODULE:write_file(RealPriv, RealData), + ?line {ok, Fd} = ?FILE_MODULE:open(RealPriv, [read, compressed]), + ?line try_read_file_list(Fd). + +remove_crs([$\r|Rest], Result) -> + remove_crs(Rest, Result); +remove_crs([C|Rest], Result) -> + remove_crs(Rest, [C|Result]); +remove_crs([], Result) -> + lists:reverse(Result). + +try_read_file_list(Fd) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + + %% Seek to the current position (nothing should happen). + + ?line {ok, 0} = ?FILE_MODULE:position(Fd, 0), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, {cur, 0}), + + %% Read a few lines from a compressed file. + + ?line ShouldBe = "Real Programmers Don't Use PASCAL\n", + ?line ShouldBe = io:get_line(Fd, ''), + + %% Now seek forward. + + ?line {ok, 381} = ?FILE_MODULE:position(Fd, 381), + ?line Back = "Back in the good old days -- the \"Golden Era\" " ++ + "of computers, it was\n", + ?line Back = io:get_line(Fd, ''), + + %% Try to search forward relative to the current position. + + ?line {ok, CurPos} = ?FILE_MODULE:position(Fd, {cur, 0}), + ?line RealPos = 4273, + ?line {ok, RealPos} = ?FILE_MODULE:position(Fd, {cur, RealPos-CurPos}), + ?line RealProg = "
  • Real Programmers aren't afraid to use GOTOs.\n", + ?line RealProg = io:get_line(Fd, ''), + + %% Seek backward. + + ?line AfterTitle = length(""), + ?line {ok, AfterTitle} = ?FILE_MODULE:position(Fd, AfterTitle), + ?line Title = "Real Programmers Don't Use PASCAL\n", + ?line Title = io:get_line(Fd, ''), + + %% Done. + + ?line ?FILE_MODULE:close(Fd), + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +try_read_file_binary(Fd) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + + %% Seek to the current position (nothing should happen). + + ?line {ok, 0} = ?FILE_MODULE:position(Fd, 0), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, {cur, 0}), + + %% Read a few lines from a compressed file. + + ?line ShouldBe = <<"Real Programmers Don't Use PASCAL\n">>, + ?line ShouldBe = io:get_line(Fd, ''), + + %% Now seek forward. + + ?line {ok, 381} = ?FILE_MODULE:position(Fd, 381), + ?line Back = <<"Back in the good old days -- the \"Golden Era\" " + "of computers, it was\n">>, + ?line Back = io:get_line(Fd, ''), + + %% Try to search forward relative to the current position. + + ?line {ok, CurPos} = ?FILE_MODULE:position(Fd, {cur, 0}), + ?line RealPos = 4273, + ?line {ok, RealPos} = ?FILE_MODULE:position(Fd, {cur, RealPos-CurPos}), + ?line RealProg = <<"
  • Real Programmers aren't afraid to use GOTOs.\n">>, + ?line RealProg = io:get_line(Fd, ''), + + %% Seek backward. + + ?line AfterTitle = length(""), + ?line {ok, AfterTitle} = ?FILE_MODULE:position(Fd, AfterTitle), + ?line Title = <<"Real Programmers Don't Use PASCAL\n">>, + ?line Title = io:get_line(Fd, ''), + + %% Done. + + ?line ?FILE_MODULE:close(Fd), + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +read_cooked_tar_problem(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + + ?line Data = ?config(data_dir, Config), + ?line ProblemFile = filename:join(Data, "cooked_tar_problem.tar.gz"), + ?line {ok,Fd} = ?FILE_MODULE:open(ProblemFile, [read,compressed,binary]), + + ?line {ok,34304} = file:position(Fd, 34304), + ?line {ok,Bin} = file:read(Fd, 512), + ?line 512 = byte_size(Bin), + + ?line {ok,34304+512+1024} = file:position(Fd, {cur,1024}), + + ?line ok = file:close(Fd), + + ?line test_server:timetrap_cancel(Dog), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +write_compressed(suite) -> []; +write_compressed(doc) -> []; +write_compressed(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Priv = ?config(priv_dir, Config), + ?line MyFile = filename:join(Priv, + atom_to_list(?MODULE)++"_test.gz"), + + %% Write a file. + + ?line {ok, Fd} = ?FILE_MODULE:open(MyFile, [write, compressed]), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, 0), + ?line Prefix = "hello\n", + ?line End = "end\n", + ?line ok = io:put_chars(Fd, Prefix), + ?line {ok, 143} = ?FILE_MODULE:position(Fd, 143), + ?line ok = io:put_chars(Fd, End), + ?line ok = ?FILE_MODULE:close(Fd), + + %% Read the file and verify the contents. + + ?line {ok, Fd1} = ?FILE_MODULE:open(MyFile, [read, compressed]), + ?line Prefix = io:get_line(Fd1, ''), + ?line Second = lists:duplicate(143-length(Prefix), 0) ++ End, + ?line Second = io:get_line(Fd1, ''), + ?line ok = ?FILE_MODULE:close(Fd1), + + %% Verify succesful compression by uncompressing the file + %% using zlib:gunzip/1. + + ?line {ok,Contents} = file:read_file(MyFile), + ?line <<"hello\n",0:137/unit:8,"end\n">> = zlib:gunzip(Contents), + + %% Ensure that the file is compressed. + + TotalSize = 143 + length(End), + case ?FILE_MODULE:read_file_info(MyFile) of + {ok, #file_info{size=Size}} when Size < TotalSize -> + ok; + {ok, #file_info{size=Size}} when Size == TotalSize -> + test_server:fail(file_not_compressed) + end, + + %% Write again to ensure that the file is truncated. + + ?line {ok, Fd2} = ?FILE_MODULE:open(MyFile, [write, compressed]), + ?line NewString = "aaaaaaaaaaa", + ?line ok = io:put_chars(Fd2, NewString), + ?line ok = ?FILE_MODULE:close(Fd2), + ?line {ok, Fd3} = ?FILE_MODULE:open(MyFile, [read, compressed]), + ?line {ok, NewString} = ?FILE_MODULE:read(Fd3, 1024), + ?line ok = ?FILE_MODULE:close(Fd3), + + %% Done. + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +catenated_gzips(Config) when is_list(Config) -> + ?line Priv = ?config(priv_dir, Config), + ?line MyFile = filename:join(Priv, ?MODULE_STRING++"_test.gz"), + + First = "Hello, all good men going to search parties. ", + Second = "Now I really need your help.", + All = iolist_to_binary([First|Second]), + ?line Cat = [zlib:gzip(First),zlib:gzip(Second)], + + ?line ok = file:write_file(MyFile, Cat), + + ?line {ok,Fd} = file:open(MyFile, [read,compressed,binary]), + ?line {ok,All} = file:read(Fd, 100000), + ?line ok = file:close(Fd), + + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +compress_errors(suite) -> []; +compress_errors(doc) -> []; +compress_errors(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line DataDir = + filename:dirname( + filename:join(?config(data_dir, Config), "x")), + ?line DataDirSlash = DataDir++"/", + ?line {error, enoent} = ?FILE_MODULE:open("non_existing__", + [compressed, read]), + ?line {error, einval} = ?FILE_MODULE:open("non_existing__", + [compressed, read, write]), + ?line {error, einval} = ?FILE_MODULE:open("non_existing__", + [compressed, read, append]), + ?line {error, einval} = ?FILE_MODULE:open("non_existing__", + [compressed, write, append]), + ?line {error, E1} = ?FILE_MODULE:open(DataDir, [compressed, read]), + ?line {error, E2} = ?FILE_MODULE:open(DataDirSlash, [compressed, read]), + ?line {error, E3} = ?FILE_MODULE:open(DataDir, [compressed, write]), + ?line {error, E4} = ?FILE_MODULE:open(DataDirSlash, [compressed, write]), + ?line {eisdir,eisdir,eisdir,eisdir} = {E1,E2,E3,E4}, + + %% Read a corrupted .gz file. + + ?line Corrupted = filename:join(DataDir, "corrupted.gz"), + ?line {ok, Fd} = ?FILE_MODULE:open(Corrupted, [read, compressed]), + ?line {error, eio} = ?FILE_MODULE:read(Fd, 100), + ?line ?FILE_MODULE:close(Fd), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +altname(doc) -> + "Test the file:altname/1 function"; +altname(suite) -> + []; +altname(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + "long alternative path name with spaces"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + ?line Name = filename:join(NewDir, "a_file_with_long_name"), + ?line ShortName = filename:join(NewDir, "short"), + ?line NonexName = filename:join(NewDir, "nonexistent"), + ?line ok = ?FILE_MODULE:write_file(Name, "some contents\n"), + ?line ok = ?FILE_MODULE:write_file(ShortName, "some contents\n"), + ?line Result = + case ?FILE_MODULE:altname(NewDir) of + {error, enotsup} -> + {skipped, "Altname not supported on this platform"}; + {ok, "LONGAL~1"} -> + ?line {ok, "A_FILE~1"} = ?FILE_MODULE:altname(Name), + ?line {ok, "C:/"} = ?FILE_MODULE:altname("C:/"), + ?line {ok, "C:\\"} = ?FILE_MODULE:altname("C:\\"), + ?line {error,enoent} = ?FILE_MODULE:altname(NonexName), + ?line {ok, "short"} = ?FILE_MODULE:altname(ShortName), + ok + end, + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + Result. + +links(doc) -> "Test the link functions."; +links(suite) -> [make_link, read_link_info_for_non_link, symlinks]. + +make_link(doc) -> "Test creating a hard link."; +make_link(suite) -> []; +make_link(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_make_link"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + + ?line Name = filename:join(NewDir, "a_file"), + ?line ok = ?FILE_MODULE:write_file(Name, "some contents\n"), + + ?line Alias = filename:join(NewDir, "an_alias"), + ?line Result = + case ?FILE_MODULE:make_link(Name, Alias) of + {error, enotsup} -> + {skipped, "Links not supported on this platform"}; + ok -> + %% Note: We take the opportunity to test + %% ?FILE_MODULE:read_link_info/1, + %% which should in behave exactly as + %% ?FILE_MODULE:read_file_info/1 + %% since they are not used on symbolic links. + + ?line {ok, Info} = ?FILE_MODULE:read_link_info(Name), + ?line {ok, Info} = ?FILE_MODULE:read_link_info(Alias), + ?line #file_info{links = 2, type = regular} = Info, + ?line {error, eexist} = + ?FILE_MODULE:make_link(Name, Alias), + ok + end, + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + Result. + +read_link_info_for_non_link(doc) -> + "Test that reading link info for an ordinary file or directory works " + "(on all platforms)."; +read_link_info_for_non_link(suite) -> []; +read_link_info_for_non_link(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + + ?line {ok, #file_info{type=directory}} = + ?FILE_MODULE:read_link_info("."), + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + +symlinks(doc) -> "Test operations on symbolic links (for Unix)."; +symlinks(suite) -> []; +symlinks(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_symlinks"), + ?line ok = ?FILE_MODULE:make_dir(NewDir), + + ?line Name = filename:join(NewDir, "a_plain_file"), + ?line ok = ?FILE_MODULE:write_file(Name, "some stupid content\n"), + + ?line Alias = filename:join(NewDir, "a_symlink_alias"), + ?line Result = + case ?FILE_MODULE:make_symlink(Name, Alias) of + {error, enotsup} -> + {skipped, "Links not supported on this platform"}; + ok -> + ?line {ok, Info1} = ?FILE_MODULE:read_file_info(Name), + ?line {ok, Info1} = ?FILE_MODULE:read_file_info(Alias), + ?line {ok, Info1} = ?FILE_MODULE:read_link_info(Name), + ?line #file_info{links = 1, type = regular} = Info1, + + ?line {ok, Info2} = ?FILE_MODULE:read_link_info(Alias), + ?line #file_info{links=1, type=symlink} = Info2, + ?line {ok, Name} = ?FILE_MODULE:read_link(Alias), + ok + end, + + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + Result. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +copy(doc) -> []; +copy(suite) -> []; +copy(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + %% Create a text file. + ?line Name1 = filename:join(RootDir, atom_to_list(?MODULE)++"_copy_1.txt"), + ?line Line = "The quick brown fox jumps over a lazy dog. 0123456789\n", + ?line Len = length(Line), + ?line {ok, Handle1} = ?FILE_MODULE:open(Name1, [write]), + ?line {_, Size1} = + iterate({0, 0}, + done, + fun({_, S}) when S >= 128*1024 -> + done; + ({N, S}) -> + H = integer_to_list(N), + ok = ?FILE_MODULE:write(Handle1, [H, " ", Line]), + {N + 1, S + length(H) + 1 + Len} + end), + ?line ?FILE_MODULE:close(Handle1), + %% Make a copy + ?line Name2 = filename:join(RootDir, atom_to_list(?MODULE)++"_copy_2.txt"), + ?line {ok, Size1} = ?FILE_MODULE:copy(Name1, Name2), + %% Concatenate 1 + ?line Name3 = filename:join(RootDir, atom_to_list(?MODULE)++"_copy_3.txt"), + ?line {ok, Handle3} = ?FILE_MODULE:open(Name3, [raw, write, binary]), + ?line {ok, Size1} = ?FILE_MODULE:copy(Name1, Handle3), + ?line {ok, Handle2} = ?FILE_MODULE:open(Name2, [read, binary]), + ?line {ok, Size1} = ?FILE_MODULE:copy(Handle2, Handle3), + ?line ok = ?FILE_MODULE:close(Handle3), + ?line ok = ?FILE_MODULE:close(Handle2), + %% Concatenate 2 + ?line Name4 = filename:join(RootDir, atom_to_list(?MODULE)++"_copy_4.txt"), + ?line {ok, Handle4} = ?FILE_MODULE:open(Name4, [write, binary]), + ?line {ok, Size1} = ?FILE_MODULE:copy(Name1, Handle4), + ?line {ok, Handle5} = ?FILE_MODULE:open(Name2, [raw, read, binary]), + ?line {ok, Size1} = ?FILE_MODULE:copy(Handle5, Handle4), + ?line ok = ?FILE_MODULE:close(Handle5), + ?line ok = ?FILE_MODULE:close(Handle4), + %% %% Just for test of the test + %% ?line {ok, Handle2q} = ?FILE_MODULE:open(Name2, [write, append]), + %% ?line ok = ?FILE_MODULE:write(Handle2q, "q"), + %% ?line ok = ?FILE_MODULE:close(Handle2q), + %% Compare the files + ?line {ok, Handle1a} = ?FILE_MODULE:open(Name1, [raw, read]), + ?line {ok, Handle2a} = ?FILE_MODULE:open(Name2, [raw, read]), + ?line true = stream_cmp(fd_stream_factory([Handle1a]), + fd_stream_factory([Handle2a])), + ?line {ok, 0} = ?FILE_MODULE:position(Handle1a, 0), + ?line {ok, 0} = ?FILE_MODULE:position(Handle2a, 0), + ?line {ok, Handle3a} = ?FILE_MODULE:open(Name3, [raw, read]), + ?line true = stream_cmp(fd_stream_factory([Handle1a, Handle2a]), + fd_stream_factory([Handle2a])), + ?line ok = ?FILE_MODULE:close(Handle1a), + ?line ok = ?FILE_MODULE:close(Handle2a), + ?line ok = ?FILE_MODULE:close(Handle3a), + ?line [] = flush(), + ?line test_server:timetrap_cancel(Dog), + ok. + + + +fd_stream_factory([]) -> + []; +fd_stream_factory([Fd | T] = L) -> + fun() -> + case ?FILE_MODULE:read(Fd, 8192) of + {ok, Data} when is_binary(Data) -> + binary_to_list(Data) ++ fd_stream_factory(L); + {ok, Data} when is_list(Data) -> + Data ++ fd_stream_factory(L); + eof -> + fd_stream_factory(T); + {error, _} = Error -> + Error + end + end. + + + +stream_cmp(F1, F2) when is_function(F1), is_function(F2) -> + stream_cmp(F1(), F2()); +stream_cmp(F, X) when is_function(F) -> + stream_cmp(F(), X); +stream_cmp(X, F) when is_function(F) -> + stream_cmp(X, F()); +stream_cmp({error, _} = Error, _) -> + Error; +stream_cmp(_, {error, _} = Error) -> + Error; +stream_cmp([], []) -> + true; +stream_cmp([], [_|_]) -> + false; +stream_cmp([_|_], []) -> + false; +stream_cmp([H | T1], [H | T2]) -> + stream_cmp(T1, T2). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Test the get_cwd(), open(), and copy() file server calls. +new_slave(_RootDir, Cwd) -> + ?line L = "qwertyuiopasdfghjklzxcvbnm", + ?line N = length(L), + ?line {ok, Cwd} = ?FILE_MODULE:get_cwd(), + ?line {error, enotsup} = ?FILE_MODULE:get_cwd("C:"), % Unix only testcase + ?line {ok, FD1} = ?FILE_MODULE:open("file1.txt", write), + ?line ok = ?FILE_MODULE:close(FD1), + ?line {ok, FD2} = ?FILE_MODULE:open("file1.txt", + [write, append, + binary, compressed, + delayed_write, + {delayed_write, 0, 0}, + read_ahead, + {read_ahead, 0}]), + ?line ok = ?FILE_MODULE:write(FD2, L), + ?line ok = ?FILE_MODULE:close(FD2), + ?line {ok, N2} = ?FILE_MODULE:copy("file1.txt", "file2.txt"), + ?line io:format("Size ~p, compressed ~p.~n", [N, N2]), + ?line {ok, FD3} = ?FILE_MODULE:open("file2.txt", + [binary, compressed]), + %% The file_io_server will translate the binary into a list + ?line {ok, L} = ?FILE_MODULE:read(FD3, N+1), + ?line ok = ?FILE_MODULE:close(FD3), + %% + ?line ok = ?FILE_MODULE:delete("file1.txt"), + ?line ok = ?FILE_MODULE:delete("file2.txt"), + ?line [] = flush(), + ok. + + +%% Test the get_cwd() and open() file server calls. +old_slave(_RootDir, Cwd) -> + ?line L = "qwertyuiopasdfghjklzxcvbnm", + ?line N = length(L), + ?line {ok, Cwd} = ?FILE_MODULE:get_cwd(), + ?line {error, enotsup} = ?FILE_MODULE:get_cwd("C:"), % Unix only testcase + ?line {ok, FD1} = ?FILE_MODULE:open("file1.txt", write), + ?line ok = ?FILE_MODULE:close(FD1), + ?line {ok, FD2} = ?FILE_MODULE:open("file1.txt", + [write, binary, compressed]), + ?line ok = ?FILE_MODULE:write(FD2, L), + ?line ok = ?FILE_MODULE:close(FD2), + ?line {ok, FD3} = ?FILE_MODULE:open("file1.txt", [write, append]), + ?line ok = ?FILE_MODULE:close(FD3), + ?line {ok, FD4} = ?FILE_MODULE:open("file1.txt", + [binary, compressed]), + %% The file_io_server will translate the binary into a list + ?line {ok, L} = ?FILE_MODULE:read(FD4, N+1), + ?line ok = ?FILE_MODULE:close(FD4), + %% + ?line ok = ?FILE_MODULE:delete("file1.txt"), + ?line [] = flush(), + ok. + +run_test(Test, Args) -> + ?line case (catch apply(?MODULE, Test, Args)) of + {'EXIT', _} = Exit -> + {done, Exit, get(test_server_loc)}; + Result -> + {done, Result} + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +delayed_write(suite) -> + []; +delayed_write(doc) -> + ["Tests the file open option {delayed_write, Size, Delay}"]; + +delayed_write(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(20)), + %% + ?line RootDir = ?config(priv_dir, Config), + ?line File = filename:join(RootDir, + atom_to_list(?MODULE)++"_delayed_write.txt"), + ?line Data1 = "asdfghjkl", + ?line Data2 = "qwertyuio", + ?line Data3 = "zxcvbnm,.", + ?line Size = length(Data1), + ?line Size = length(Data2), + ?line Size = length(Data3), + ?line Data1Data1 = Data1++Data1, + ?line Data1Data1Data1 = Data1Data1++Data1, + ?line Data1Data1Data1Data1 = Data1Data1++Data1Data1, + %% + %% Test caching and normal close of non-raw file + ?line {ok, Fd1} = + ?FILE_MODULE:open(File, [write, {delayed_write, Size+1, 2000}]), + ?line ok = ?FILE_MODULE:write(Fd1, Data1), + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Fd2} = ?FILE_MODULE:open(File, [read]), + ?line case os:type() of + vxworks -> + io:format("Line ~p skipped on vxworks", [?LINE]); + _ -> + ?line eof = ?FILE_MODULE:read(Fd2, 1) + end, + ?line ok = ?FILE_MODULE:write(Fd1, Data1), % Data flush on size + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Data1Data1} = ?FILE_MODULE:pread(Fd2, bof, 2*Size+1), + ?line ok = ?FILE_MODULE:write(Fd1, Data1), + ?line ?t:sleep(3000), % Wait until data flush on timeout + ?line {ok, Data1Data1Data1} = ?FILE_MODULE:pread(Fd2, bof, 3*Size+1), + ?line ok = ?FILE_MODULE:write(Fd1, Data1), + ?line ok = ?FILE_MODULE:close(Fd1), % Data flush on close + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Data1Data1Data1Data1} = ?FILE_MODULE:pread(Fd2, bof, 4*Size+1), + ?line ok = ?FILE_MODULE:close(Fd2), + %% + %% Test implicit close through exit by file owning process, + %% raw file, default parameters. + ?line Parent = self(), + ?line Fun = + fun () -> + Child = self(), + Test = + fun () -> + ?line {ok, Fd} = + ?FILE_MODULE:open(File, + [raw, write, + delayed_write]), + ?line ok = ?FILE_MODULE:write(Fd, Data1), + ?line Parent ! {Child, wrote}, + ?line receive + {Parent, continue, Reason} -> + {ok, Reason} + end + end, + case (catch Test()) of + {ok, Reason} -> + exit(Reason); + Unknown -> + exit({Unknown, get(test_server_loc)}) + end + end, + ?line Child1 = spawn(Fun), + ?line Mref1 = erlang:monitor(process, Child1), + ?line receive + {Child1, wrote} -> + ok; + {'DOWN', Mref1, _, _, _} = Down1a -> + ?t:fail(Down1a) + end, + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Fd3} = ?FILE_MODULE:open(File, [read]), + ?line case os:type() of + vxworks -> + io:format("Line ~p skipped on vxworks", [?LINE]); + _ -> + ?line eof = ?FILE_MODULE:read(Fd3, 1) + end, + ?line Child1 ! {Parent, continue, normal}, + ?line receive + {'DOWN', Mref1, process, Child1, normal} -> + ok; + {'DOWN', Mref1, _, _, _} = Down1b -> + ?t:fail(Down1b) + end, + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Data1} = ?FILE_MODULE:pread(Fd3, bof, Size+1), + ?line ok = ?FILE_MODULE:close(Fd3), + %% + %% The same again, but this time with reason 'kill'. + ?line Child2 = spawn(Fun), + ?line Mref2 = erlang:monitor(process, Child2), + ?line receive + {Child2, wrote} -> + ok; + {'DOWN', Mref2, _, _, _} = Down2a -> + ?t:fail(Down2a) + end, + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Fd4} = ?FILE_MODULE:open(File, [read]), + ?line case os:type() of + vxworks -> + io:format("Line ~p skipped on vxworks", [?LINE]); + _ -> + ?line eof = ?FILE_MODULE:read(Fd4, 1) + end, + ?line Child2 ! {Parent, continue, kill}, + ?line receive + {'DOWN', Mref2, process, Child2, kill} -> + ok; + {'DOWN', Mref2, _, _, _} = Down2b -> + ?t:fail(Down2b) + end, + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line eof = ?FILE_MODULE:pread(Fd4, bof, 1), + ?line ok = ?FILE_MODULE:close(Fd4), + %% + %% Test if file position works with delayed_write + ?line {ok, Fd5} = ?FILE_MODULE:open(File, [raw, read, write, + delayed_write]), + ?line ok = ?FILE_MODULE:truncate(Fd5), + ?line ok = ?FILE_MODULE:write(Fd5, [Data1|Data2]), + ?line {ok, 0} = ?FILE_MODULE:position(Fd5, bof), + ?line ok = ?FILE_MODULE:write(Fd5, [Data3]), + ?line {ok, Data2} = ?FILE_MODULE:read(Fd5, Size+1), + ?line {ok, 0} = ?FILE_MODULE:position(Fd5, bof), + ?line Data3Data2 = Data3++Data2, + ?line {ok, Data3Data2} = ?FILE_MODULE:read(Fd5, 2*Size+1), + ?line ok = ?FILE_MODULE:close(Fd5), + %% + ?line [] = flush(), + ?line ?t:timetrap_cancel(Dog), + ?line case os:type() of + vxworks -> + {comment, "Some lines skipped on vxworks"}; + _ -> + ok + end. + + +pid2name(doc) -> "Tests file:pid2name/1."; +pid2name(suite) -> []; +pid2name(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line Base = test_server:temp_name( + filename:join(RootDir, "pid2name_")), + ?line Name1 = [Base, '.txt'], + ?line Name2 = Base ++ ".txt", + %% + ?line {ok, Pid} = file:open(Name1, [write]), + ?line {ok, Name2} = file:pid2name(Pid), + ?line undefined = file:pid2name(self()), + ?line ok = file:close(Pid), + ?line test_server:sleep(1000), + ?line false = is_process_alive(Pid), + ?line undefined = file:pid2name(Pid), + %% + ?line test_server:timetrap_cancel(Dog), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +read_ahead(suite) -> + []; +read_ahead(doc) -> + ["Tests the file open option {read_ahead, Size}"]; + +read_ahead(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(20)), + %% + ?line RootDir = ?config(priv_dir, Config), + ?line File = filename:join(RootDir, + atom_to_list(?MODULE)++"_read_ahead.txt"), + ?line Data1 = "asdfghjkl", % Must be + ?line Data2 = "qwertyuio", % same + ?line Data3 = "zxcvbnm,.", % length + ?line Size = length(Data1), + ?line Size = length(Data2), + ?line Size = length(Data3), + %% + %% Test caching of normal non-raw file + ?line {ok, Fd1} = ?FILE_MODULE:open(File, [write]), + ?line ok = ?FILE_MODULE:write(Fd1, [Data1|Data1]), + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Fd2} = ?FILE_MODULE:open(File, [read, {read_ahead, 2*Size}]), + ?line {ok, Data1} = ?FILE_MODULE:read(Fd2, Size), + ?line ok = ?FILE_MODULE:pwrite(Fd1, Size, Data2), + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Data1} = ?FILE_MODULE:read(Fd2, Size), % Will read cached data + ?line Data2Data2Data2 = Data2++Data2++Data2, + ?line ok = ?FILE_MODULE:pwrite(Fd1, eof, Data2Data2Data2), + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Data2Data2Data2} = + ?FILE_MODULE:read(Fd2, 3*Size), % Read more than cache buffer + ?line ok = ?FILE_MODULE:close(Fd1), + ?line ok = ?FILE_MODULE:close(Fd2), + %% Test caching of raw file and default parameters + ?line {ok, Fd3} = ?FILE_MODULE:open(File, [raw, write]), + ?line ok = ?FILE_MODULE:write(Fd3, [Data1|Data1]), + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Fd4} = ?FILE_MODULE:open(File, [raw, read, read_ahead]), + ?line {ok, Data1} = ?FILE_MODULE:read(Fd4, Size), + ?line ok = ?FILE_MODULE:pwrite(Fd3, Size, Data2), + ?line ?t:sleep(1000), % Just in case the file system is slow + ?line {ok, Data1} = ?FILE_MODULE:read(Fd4, Size), % Will read cached data + ?line ok = ?FILE_MODULE:close(Fd3), + ?line ok = ?FILE_MODULE:close(Fd4), + %% Test if the file position works in combination with read_ahead + ?line {ok, Fd5} = ?FILE_MODULE:open(File, [raw, read, write, read_ahead]), + ?line ok = ?FILE_MODULE:truncate(Fd5), + ?line ok = ?FILE_MODULE:write(Fd5, [Data1,Data1|Data3]), + ?line {ok, 0} = ?FILE_MODULE:position(Fd5, bof), + ?line {ok, Data1} = ?FILE_MODULE:read(Fd5, Size), + ?line ok = ?FILE_MODULE:write(Fd5, Data2), + ?line {ok, 0} = ?FILE_MODULE:position(Fd5, bof), + ?line Data1Data2Data3 = Data1++Data2++Data3, + ?line {ok, Data1Data2Data3} = ?FILE_MODULE:read(Fd5, 3*Size+1), + ?line ok = ?FILE_MODULE:close(Fd5), + %% + ?line [] = flush(), + ?line ?t:timetrap_cancel(Dog), + ok. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +segment_read(suite) -> + []; +segment_read(doc) -> + ["Tests the segmenting of large reads"]; +segment_read(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(60)), + %% + ?line Name = filename:join(?config(priv_dir, Config), + ?MODULE_STRING ++ "_segment_read"), + ?line SegSize = 256*1024, + ?line SegCnt = SegSize div 4, + ?line Cnt = 4 * SegCnt, + ?line ok = create_file(Name, Cnt), + %% + %% read_file/1 + %% + ?line {ok, Bin} = ?FILE_MODULE:read_file(Name), + ?line true = verify_bin(Bin, 0, Cnt), + %% + %% read/2 + %% + %% Not segmented + ?line {ok, FD1} = ?FILE_MODULE:open(Name, [read, raw, binary]), + ?line {ok, B1a} = ?FILE_MODULE:read(FD1, SegSize), + ?line {ok, B1b} = ?FILE_MODULE:read(FD1, SegSize), + ?line {ok, B1c} = ?FILE_MODULE:read(FD1, SegSize), + ?line {ok, B1d} = ?FILE_MODULE:read(FD1, SegSize), + ?line ok = ?FILE_MODULE:close(FD1), + ?line true = verify_bin(B1a, 0*SegCnt, SegCnt), + ?line true = verify_bin(B1b, 1*SegCnt, SegCnt), + ?line true = verify_bin(B1c, 2*SegCnt, SegCnt), + ?line true = verify_bin(B1d, 3*SegCnt, SegCnt), + %% + %% Segmented + ?line {ok, FD2} = ?FILE_MODULE:open(Name, [read, raw, binary]), + ?line {ok, B2a} = ?FILE_MODULE:read(FD2, 1*SegSize), + ?line {ok, B2b} = ?FILE_MODULE:read(FD2, 2*SegSize), + ?line {ok, B2c} = ?FILE_MODULE:read(FD2, 2*SegSize), + ?line ok = ?FILE_MODULE:close(FD2), + ?line true = verify_bin(B2a, 0*SegCnt, 1*SegCnt), + ?line true = verify_bin(B2b, 1*SegCnt, 2*SegCnt), + ?line true = verify_bin(B2c, 3*SegCnt, 1*SegCnt), + %% + %% pread/3 + %% + ?line {ok, FD3} = ?FILE_MODULE:open(Name, [read, raw, binary]), + %% + %% Not segmented + ?line {ok, B3d} = ?FILE_MODULE:pread(FD3, 3*SegSize, SegSize), + ?line {ok, B3c} = ?FILE_MODULE:pread(FD3, 2*SegSize, SegSize), + ?line {ok, B3b} = ?FILE_MODULE:pread(FD3, 1*SegSize, SegSize), + ?line {ok, B3a} = ?FILE_MODULE:pread(FD3, 0*SegSize, SegSize), + ?line true = verify_bin(B3a, 0*SegCnt, SegCnt), + ?line true = verify_bin(B3b, 1*SegCnt, SegCnt), + ?line true = verify_bin(B3c, 2*SegCnt, SegCnt), + ?line true = verify_bin(B3d, 3*SegCnt, SegCnt), + %% + %% Segmented + ?line {ok, B3g} = ?FILE_MODULE:pread(FD3, 3*SegSize, 2*SegSize), + ?line {ok, B3f} = ?FILE_MODULE:pread(FD3, 1*SegSize, 2*SegSize), + ?line {ok, B3e} = ?FILE_MODULE:pread(FD3, 0*SegSize, 1*SegSize), + ?line true = verify_bin(B3e, 0*SegCnt, 1*SegCnt), + ?line true = verify_bin(B3f, 1*SegCnt, 2*SegCnt), + ?line true = verify_bin(B3g, 3*SegCnt, 1*SegCnt), + %% + ?line ok = ?FILE_MODULE:close(FD3), + %% + %% pread/2 + %% + ?line {ok, FD5} = ?FILE_MODULE:open(Name, [read, raw, binary]), + %% + %% +---+---+---+---+ + %% | 4 | 3 | 2 | 1 | + %% +---+---+---+---+ + %% < ^ > + ?line {ok, [B5d, B5c, B5b, B5a]} = + ?FILE_MODULE:pread(FD5, [{3*SegSize, SegSize}, + {2*SegSize, SegSize}, + {1*SegSize, SegSize}, + {0*SegSize, SegSize}]), + ?line true = verify_bin(B5a, 0*SegCnt, SegCnt), + ?line true = verify_bin(B5b, 1*SegCnt, SegCnt), + ?line true = verify_bin(B5c, 2*SegCnt, SegCnt), + ?line true = verify_bin(B5d, 3*SegCnt, SegCnt), + %% + %% +---+-------+-------+ + %% | 3 | 2 | 1 | + %% +---+-------+-------+ + %% < ^ ^ > + ?line {ok, [B5g, B5f, B5e]} = + ?FILE_MODULE:pread(FD5, [{3*SegSize, 2*SegSize}, + {1*SegSize, 2*SegSize}, + {0*SegSize, 1*SegSize}]), + ?line true = verify_bin(B5e, 0*SegCnt, 1*SegCnt), + ?line true = verify_bin(B5f, 1*SegCnt, 2*SegCnt), + ?line true = verify_bin(B5g, 3*SegCnt, 1*SegCnt), + %% + %% + %% +-------+-----------+ + %% | 2 | 1 | + %% +-------+-----------+ + %% < ^ ^ > + ?line {ok, [B5i, B5h]} = + ?FILE_MODULE:pread(FD5, [{2*SegSize, 3*SegSize}, + {0*SegSize, 2*SegSize}]), + ?line true = verify_bin(B5h, 0*SegCnt, 2*SegCnt), + ?line true = verify_bin(B5i, 2*SegCnt, 2*SegCnt), + %% + %% +-------+---+---+ + %% | 3 | 2 | 1 | + %% +-------+---+---+ + %% < ^ ^ > + ?line {ok, [B5l, B5k, B5j]} = + ?FILE_MODULE:pread(FD5, [{3*SegSize, 1*SegSize}, + {2*SegSize, 1*SegSize}, + {0*SegSize, 2*SegSize}]), + ?line true = verify_bin(B5j, 0*SegCnt, 2*SegCnt), + ?line true = verify_bin(B5k, 2*SegCnt, 1*SegCnt), + ?line true = verify_bin(B5l, 3*SegCnt, 1*SegCnt), + %% + %% Real time response time test. + %% + Req = lists:flatten(lists:duplicate(17, + [{2*SegSize, 2*SegSize}, + {0*SegSize, 2*SegSize}])), + ?line {{ok, _}, Comment} = + response_analysis(?FILE_MODULE, pread, [FD5, Req]), + ?line ok = ?FILE_MODULE:close(FD5), + %% + ?line [] = flush(), + ?line ?t:timetrap_cancel(Dog), + {comment, Comment}. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +segment_write(suite) -> + []; +segment_write(doc) -> + ["Tests the segmenting of large writes"]; +segment_write(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(60)), + %% + ?line Name = filename:join(?config(priv_dir, Config), + ?MODULE_STRING ++ "_segment_write"), + ?line SegSize = 256*1024, + ?line SegCnt = SegSize div 4, + ?line Cnt = 4 * SegCnt, + ?line Bin = create_bin(0, Cnt), + %% + %% write/2 + %% + %% Not segmented + ?line {ok, FD1} = ?FILE_MODULE:open(Name, [write, raw, binary]), + ?line ok = ?FILE_MODULE:write(FD1, subbin(Bin, 0*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:write(FD1, subbin(Bin, 1*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:write(FD1, subbin(Bin, 2*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:write(FD1, subbin(Bin, 3*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:close(FD1), + ?line true = verify_file(Name, Cnt), + %% + %% Segmented + ?line {ok, FD2} = ?FILE_MODULE:open(Name, [write, raw, binary]), + ?line ok = ?FILE_MODULE:write(FD2, subbin(Bin, 0*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:write(FD2, subbin(Bin, 1*SegSize, 2*SegSize)), + ?line ok = ?FILE_MODULE:write(FD2, subbin(Bin, 3*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:close(FD2), + ?line true = verify_file(Name, Cnt), + %% + %% +---+---+---+---+ + %% | | | | | + %% +---+---+---+---+ + %% < ^ > + ?line ok = write_file(Name, [subbin(Bin, 0*SegSize, 1*SegSize), + subbin(Bin, 1*SegSize, 1*SegSize), + subbin(Bin, 2*SegSize, 1*SegSize), + subbin(Bin, 3*SegSize, 1*SegSize)]), + ?line true = verify_file(Name, Cnt), + %% + %% +---+-------+---+ + %% | | | | + %% +---+-------+---+ + %% < ^ ^ > + ?line ok = write_file(Name, [subbin(Bin, 0*SegSize, 1*SegSize), + subbin(Bin, 1*SegSize, 2*SegSize), + subbin(Bin, 3*SegSize, 1*SegSize)]), + ?line true = verify_file(Name, Cnt), + %% + %% +-------+-------+ + %% | | | + %% +-------+-------+ + %% < ^ ^ > + ?line ok = write_file(Name, [subbin(Bin, 0*SegSize, 2*SegSize), + subbin(Bin, 2*SegSize, 2*SegSize)]), + ?line true = verify_file(Name, Cnt), + %% + %% +-------+---+---+ + %% | | | | + %% +-------+---+---+ + %% < ^ ^ > + ?line ok = write_file(Name, [subbin(Bin, 0*SegSize, 2*SegSize), + subbin(Bin, 2*SegSize, 1*SegSize), + subbin(Bin, 3*SegSize, 1*SegSize)]), + ?line true = verify_file(Name, Cnt), + %% + %% pwrite/3 + %% + %% Not segmented + ?line {ok, FD3} = ?FILE_MODULE:open(Name, [write, raw, binary]), + ?line ok = ?FILE_MODULE:pwrite(FD3, 3*SegSize, + subbin(Bin, 3*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:pwrite(FD3, 2*SegSize, + subbin(Bin, 2*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:pwrite(FD3, 1*SegSize, + subbin(Bin, 1*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:pwrite(FD3, 0*SegSize, + subbin(Bin, 0*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:close(FD3), + ?line true = verify_file(Name, Cnt), + %% + %% Segmented + ?line {ok, FD4} = ?FILE_MODULE:open(Name, [write, raw, binary]), + ?line ok = ?FILE_MODULE:pwrite(FD4, 3*SegSize, + subbin(Bin, 3*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:pwrite(FD4, 1*SegSize, + subbin(Bin, 1*SegSize, 2*SegSize)), + ?line ok = ?FILE_MODULE:pwrite(FD4, 0*SegSize, + subbin(Bin, 0*SegSize, 1*SegSize)), + ?line ok = ?FILE_MODULE:close(FD4), + ?line true = verify_file(Name, Cnt), + + + + %% + %% pwrite/2 + %% + %% Not segmented + ?line {ok, FD5} = ?FILE_MODULE:open(Name, [write, raw, binary]), + ?line ok = ?FILE_MODULE:pwrite(FD5, [{3*SegSize, + subbin(Bin, 3*SegSize, 1*SegSize)}]), + ?line ok = ?FILE_MODULE:pwrite(FD5, [{2*SegSize, + subbin(Bin, 2*SegSize, 1*SegSize)}]), + ?line ok = ?FILE_MODULE:pwrite(FD5, [{1*SegSize, + subbin(Bin, 1*SegSize, 1*SegSize)}]), + ?line ok = ?FILE_MODULE:pwrite(FD5, [{0*SegSize, + subbin(Bin, 0*SegSize, 1*SegSize)}]), + ?line ok = ?FILE_MODULE:close(FD5), + ?line true = verify_file(Name, Cnt), + %% + %% Segmented + ?line {ok, FD6} = ?FILE_MODULE:open(Name, [write, raw, binary]), + ?line ok = ?FILE_MODULE:pwrite(FD6, [{3*SegSize, + subbin(Bin, 3*SegSize, 1*SegSize)}]), + ?line ok = ?FILE_MODULE:pwrite(FD6, [{1*SegSize, + subbin(Bin, 1*SegSize, 2*SegSize)}]), + ?line ok = ?FILE_MODULE:pwrite(FD6, [{0*SegSize, + subbin(Bin, 0*SegSize, 1*SegSize)}]), + ?line ok = ?FILE_MODULE:close(FD6), + ?line true = verify_file(Name, Cnt), + %% + %% +---+---+---+---+ + %% | 4 | 3 | 2 | 1 | + %% +---+---+---+---+ + %% < ^ > + ?line ok = pwrite_file(Name, [{3*SegSize, + subbin(Bin, 3*SegSize, 1*SegSize)}, + {2*SegSize, + subbin(Bin, 2*SegSize, 1*SegSize)}, + {1*SegSize, + subbin(Bin, 1*SegSize, 1*SegSize)}, + {0*SegSize, + subbin(Bin, 0*SegSize, 1*SegSize)}]), + ?line true = verify_file(Name, Cnt), + %% + %% +---+-------+---+ + %% | 3 | 2 | 1 | + %% +---+-------+---+ + %% < ^ ^ > + ?line ok = pwrite_file(Name, [{3*SegSize, + subbin(Bin, 3*SegSize, 1*SegSize)}, + {1*SegSize, + subbin(Bin, 1*SegSize, 2*SegSize)}, + {0*SegSize, + subbin(Bin, 0*SegSize, 1*SegSize)}]), + ?line true = verify_file(Name, Cnt), + %% + %% +-------+-------+ + %% | 2 | 1 | + %% +-------+-------+ + %% < ^ ^ > + ?line ok = pwrite_file(Name, [{2*SegSize, + subbin(Bin, 2*SegSize, 2*SegSize)}, + {0*SegSize, + subbin(Bin, 0*SegSize, 2*SegSize)}]), + ?line true = verify_file(Name, Cnt), + %% + %% +-------+---+---+ + %% | 3 | 2 | 1 | + %% +-------+---+---+ + %% < ^ ^ > + ?line ok = pwrite_file(Name, [{3*SegSize, + subbin(Bin, 3*SegSize, 1*SegSize)}, + {2*SegSize, + subbin(Bin, 2*SegSize, 1*SegSize)}, + {0*SegSize, + subbin(Bin, 0*SegSize, 2*SegSize)}]), + ?line true = verify_file(Name, Cnt), + %% + %% Real time response time test. + %% + ?line {ok, FD7} = ?FILE_MODULE:open(Name, [write, raw, binary]), + Req = lists:flatten(lists:duplicate(17, + [{2*SegSize, + subbin(Bin, 2*SegSize, 2*SegSize)}, + {0*SegSize, + subbin(Bin, 0*SegSize, 2*SegSize)}])), + ?line {ok, Comment} = + response_analysis(?FILE_MODULE, pwrite, [FD7, Req]), + ?line ok = ?FILE_MODULE:close(FD7), + %% + ?line [] = flush(), + ?line ?t:timetrap_cancel(Dog), + {comment, Comment}. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +ipread(suite) -> + []; +ipread(doc) -> + ["Test Dets special indirect pread"]; +ipread(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(30)), + %% + ?line Dir = ?config(priv_dir, Config), + ?line ok = ipread_int(Dir, [raw, binary]), + ?line ok = ipread_int(Dir, [raw]), + ?line ok = ipread_int(Dir, [binary]), + ?line ok = ipread_int(Dir, []), + ?line ok = ipread_int(Dir, [ram, binary]), + ?line ok = ipread_int(Dir, [ram]), + %% + ?line [] = flush(), + ?line ?t:timetrap_cancel(Dog), + ok. + +ipread_int(Dir, ModeList) -> + ?line Name = + filename:join(Dir, + lists:flatten([?MODULE_STRING, "_ipread", + lists:map(fun (X) -> + ["_", atom_to_list(X)] + end, + ModeList)])), + ?line io:format("ipread_int<~p, ~p>~n", [Name, ModeList]), + ?line {Conv, Sizeof} = + case lists:member(binary, ModeList) of + true -> + {fun (Bin) when is_binary(Bin) -> Bin; + (List) when is_list(List) -> list_to_binary(List) + end, + {erlang, size}}; + false -> + {fun (Bin) when is_binary(Bin) -> binary_to_list(Bin); + (List) when is_list(List) -> List + end, + {erlang, length}} + end, + ?line Pos = 4711, + ?line Data = Conv("THE QUICK BROWN FOX JUMPS OVER A LAZY DOG"), + ?line Size = Sizeof(Data), + ?line Init = Conv(" "), + ?line SizeInit = Sizeof(Init), + ?line Head = Conv(<>), + ?line Filler = Conv(bytes($ , Pos-SizeInit-Sizeof(Head))), + ?line Size1 = Size+1, + ?line SizePos = Size+Pos, + %% + ?line {ok, FD} = ?FILE_MODULE:open(Name, [write, read | ModeList]), + ?line ok = ?FILE_MODULE:truncate(FD), + ?line ok = ?FILE_MODULE:write(FD, Init), + ?line ok = ?FILE_MODULE:write(FD, Head), + ?line ok = ?FILE_MODULE:write(FD, Filler), + ?line ok = ?FILE_MODULE:write(FD, Data), + %% Correct read + ?line {ok, {Size, Pos, Data}} = + ?FILE_MODULE:ipread_s32bu_p32bu(FD, SizeInit, infinity), + %% Invalid header - size > max + ?line eof = + ?FILE_MODULE:ipread_s32bu_p32bu(FD, SizeInit, Size-1), + %% Data block protudes over eof + ?line ok = + ?FILE_MODULE:pwrite(FD, SizeInit, + <>), + ?line {ok, {Size1, Pos, Data}} = + ?FILE_MODULE:ipread_s32bu_p32bu(FD, SizeInit, Size1), + %% Data block outside file + ?line ok = + ?FILE_MODULE:pwrite(FD, SizeInit, + <>), + ?line {ok, {Size, SizePos, eof}} = + ?FILE_MODULE:ipread_s32bu_p32bu(FD, SizeInit, Size), + %% Zero size + ?line ok = + ?FILE_MODULE:pwrite(FD, SizeInit, + <<0:32/big-unsigned, + Pos:32/big-unsigned>>), + ?line {ok, {0, Pos, eof}} = + ?FILE_MODULE:ipread_s32bu_p32bu(FD, SizeInit, Size), + %% Invalid header - protudes over eof + ?line eof = + ?FILE_MODULE:ipread_s32bu_p32bu(FD, + Pos+Size-(Sizeof(Head)-1), + infinity), + %% Header not even in file + ?line eof = + ?FILE_MODULE:ipread_s32bu_p32bu(FD, Pos+Size, infinity), + %% + ?line ok = ?FILE_MODULE:close(FD), + ok. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +interleaved_read_write(suite) -> + []; +interleaved_read_write(doc) -> + ["Tests interleaved read and writes"]; +interleaved_read_write(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(30)), + %% + ?line Dir = ?config(priv_dir, Config), + ?line File = + filename:join(Dir, ?MODULE_STRING++"interleaved_read_write.txt"), + ?line {ok,F1} = ?FILE_MODULE:open(File, [write]), + ?line ok = ?FILE_MODULE:write(F1, "data---r1."), % 10 chars each + ?line ok = ?FILE_MODULE:write(F1, "data---r2."), + ?line ok = ?FILE_MODULE:write(F1, "data---r3."), + ?line ok = ?FILE_MODULE:close(F1), + ?line {ok,F2} = ?FILE_MODULE:open(File, [read, write]), + ?line {ok, "data---r1."} = ?FILE_MODULE:read(F2, 10), + ?line ok = ?FILE_MODULE:write(F2, "data---w2."), + ?line ok = ?FILE_MODULE:close(F2), + ?line {ok,F3} = ?FILE_MODULE:open(File, [read]), + ?line {ok, "data---r1."} = ?FILE_MODULE:read(F3, 10), + ?line {ok, "data---w2."} = ?FILE_MODULE:read(F3, 10), + ?line {ok, "data---r3."} = ?FILE_MODULE:read(F3, 10), + ?line eof = ?FILE_MODULE:read(F3, 1), + ?line ok = ?FILE_MODULE:close(F2), + %% + ?line [] = flush(), + ?line ?t:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +otp_5814(suite) -> + []; +otp_5814(doc) -> + ["OTP-5814. eval/consult/script return correct line numbers"]; +otp_5814(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(10)), + PrivDir = ?config(priv_dir, Config), + File = filename:join(PrivDir, "otp_5814"), + Path = [PrivDir], + ?line ok = file:write_file(File, <<"{a,b,c}. + a. + b. + c. + {d,e, + [}.">>), + ?line {error, {6,erl_parse,_}} = file:eval(File), + ?line {error, {6,erl_parse,_}} = file:consult(File), + ?line {error, {6,erl_parse,_}} = file:path_consult(Path, File), + ?line {error, {6,erl_parse,_}} = file:path_eval(Path, File), + ?line {error, {6,erl_parse,_}} = file:script(File), + ?line {error, {6,erl_parse,_}} = file:path_script(Path, File), + + ?line ok = file:write_file(File, <<>>), + ?line {error, {1,file,undefined_script}} = file:path_script(Path, File), + + %% The error is not propagated... + ?line ok = file:write_file(File, <<"a. + b. + 1/0.">>), + ?line {error, {3, file, {error, badarith, _}}} = file:eval(File), + + ?line ok = file:write_file(File, <<"erlang:raise(throw, apa, []).">>), + ?line {error, {1, file, {throw, apa, _}}} = file:eval(File), + + file:delete(File), + ?line ?t:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +large_file(suite) -> + []; +large_file(doc) -> + ["Tests positioning in large files (> 4G)"]; +large_file(Config) when is_list(Config) -> + case {os:type(),os:version()} of + {{win32,nt},_} -> + do_large_file(Config); + {{unix,sunos},{A,B,C}} + when A == 5, B == 5, C >= 1; A == 5, B >= 6; A >= 6 -> + do_large_file(Config); + {{unix,Unix},_} when Unix =:= linux; Unix =:= darwin -> + N = unix_free(Config), + io:format("Free: ~w KByte~n", [N]), + if N < 5 * (1 bsl 20) -> + %% Less than 5 GByte free + {skipped,"Less than 5 GByte free"}; + true -> + do_large_file(Config) + end; + _ -> + {skipped,"Only supported on Win32, Linux, or SunOS >= 5.5.1"} + end. + +unix_free(Config) -> + Cmd = ["df -k '",?config(priv_dir, Config),"'"], + DF0 = os:cmd(Cmd), + io:format("$ ~s~n~s", [Cmd,DF0]), + [$\n|DF1] = lists:dropwhile(fun ($\n) -> false; (_) -> true end, DF0), + {ok,[N],_} = io_lib:fread(" ~*s ~d", DF1), + N. + +do_large_file(Config) -> + ?line Watchdog = ?t:timetrap(?t:minutes(4)), + %% + ?line Name = filename:join(?config(priv_dir, Config), + ?MODULE_STRING ++ "_large_file"), + ?line Tester = self(), + Deleter = + spawn( + fun() -> + Mref = erlang:monitor(process, Tester), + receive + {'DOWN',Mref,_,_,_} -> ok; + {Tester,done} -> ok + end, + ?FILE_MODULE:delete(Name) + end), + %% + ?line S = "1234567890", + L = length(S), + R = lists:reverse(S), + P = 1 bsl 32, + Ss = lists:sort(S), + Rs = lists:reverse(Ss), + ?line {ok,F} = ?FILE_MODULE:open(Name, [raw,read,write]), + ?line ok = ?FILE_MODULE:write(F, S), + ?line {ok,P} = ?FILE_MODULE:position(F, P), + ?line ok = ?FILE_MODULE:write(F, R), + ?line {ok,0} = ?FILE_MODULE:position(F, bof), + ?line {ok,S} = ?FILE_MODULE:read(F, L), + ?line {ok,P} = ?FILE_MODULE:position(F, {eof,-L}), + ?line {ok,R} = ?FILE_MODULE:read(F, L+1), + ?line {ok,S} = ?FILE_MODULE:pread(F, 0, L), + ?line {ok,R} = ?FILE_MODULE:pread(F, P, L+1), + ?line ok = ?FILE_MODULE:pwrite(F, 0, Ss), + ?line ok = ?FILE_MODULE:pwrite(F, P, Rs), + ?line {ok,0} = ?FILE_MODULE:position(F, bof), + ?line {ok,Ss} = ?FILE_MODULE:read(F, L), + ?line {ok,P} = ?FILE_MODULE:position(F, {eof,-L}), + ?line {ok,Rs} = ?FILE_MODULE:read(F, L+1), + ?line ok = ?FILE_MODULE:close(F), + %% + ?line Mref = erlang:monitor(process, Deleter), + ?line Deleter ! {Tester,done}, + ?line receive {'DOWN',Mref,_,_,_} -> ok end, + %% + ?line ?t:timetrap_cancel(Watchdog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +response_analysis(Module, Function, Arguments) -> + Parent = self(), + ?line erlang:yield(), % Schedule out before test + ?line Child = + spawn_link( + fun () -> + receive {Parent, start, Ts} -> ok end, + Stat = + iterate(response_stat(response_stat(init, Ts), + erlang:now()), + done, + fun (S) -> + erlang:yield(), + receive + {Parent, stop} -> + done + after 0 -> + response_stat(S, erlang:now()) + end + end), + Parent ! {self(), stopped, response_stat(Stat, erlang:now())} + end), + ?line Child ! {Parent, start, erlang:now()}, + ?line Result = apply(Module, Function, Arguments), + ?line Child ! {Parent, stop}, + ?line {N, Sum, _, M, Max} = receive {Child, stopped, X} -> X end, + ?line Mean_ms = (0.001*Sum) / (N-1), + ?line Max_ms = 0.001 * Max, + ?line Comment = + lists:flatten( + io_lib:format( + "Scheduling interval: Mean = ~.3f ms, " + ++"Max = ~.3f ms for no ~p of ~p.~n", + [Mean_ms, Max_ms, M, (N-1)])), + ?line {Result, Comment}. + + + +response_stat(init, Ts) -> + {0, 0, Ts, 0, 0}; +response_stat({N, Sum, {A1, B1, C1}, M, Max}, {A2, B2, C2} = Ts) -> + D = C2-C1 + 1000000*((B2-B1) + 1000000*(A2-A1)), + if D > Max -> + {N+1, Sum+D, Ts, N, D}; + true -> + {N+1, Sum+D, Ts, M, Max} + end. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +%% This function is kept just for benchmarking reasons. +%% create_file/2 below is some 44 times faster. + +create_file_slow(Name, N) when is_integer(N), N >= 0 -> + ?line {ok, FD} = + ?FILE_MODULE:open(Name, [raw, write, delayed_write, binary]), + ?line ok = create_file_slow(FD, 0, N), + ?line ok = ?FILE_MODULE:close(FD), + ok. + +create_file_slow(_FD, M, M) -> + ok; +create_file_slow(FD, M, N) -> + ok = ?FILE_MODULE:write(FD, <>), + create_file_slow(FD, M+1, N). + + + +%% Creates a file 'Name' containing 'N' unsigned 32 bit integers +%% from 0 to N-1. + +create_file(Name, N) when is_integer(N), N >= 0 -> + ?line {ok, FD} = + ?FILE_MODULE:open(Name, [raw, write, delayed_write, binary]), + ?line ok = create_file(FD, 0, N), + ?line ok = ?FILE_MODULE:close(FD), + ok. + +create_file(_FD, M, M) -> + ok; +create_file(FD, M, N) when M + 1024 =< N -> + create_file(FD, M, M + 1024, []), + create_file(FD, M + 1024, N); +create_file(FD, M, N) -> + create_file(FD, M, N, []). + +create_file(FD, M, M, R) -> + ok = ?FILE_MODULE:write(FD, R); +create_file(FD, M, N0, R) when M + 8 =< N0 -> + N1 = N0-1, N2 = N0-2, N3 = N0-3, N4 = N0-4, + N5 = N0-5, N6 = N0-6, N7 = N0-7, N8 = N0-8, + create_file(FD, M, N8, + [<> | R]); +create_file(FD, M, N0, R) -> + N1 = N0-1, + create_file(FD, M, N1, [<> | R]). + + + +create_bin(M, N) when is_integer(M), is_integer(N), N >= 0, M >= 0 -> + create_bin(M, M+N, []). + +create_bin(N, N, R) -> + list_to_binary(R); +create_bin(M, N0, R) when M+8 =< N0 -> + N1 = N0-1, N2 = N0-2, N3 = N0-3, N4 = N0-4, + N5 = N0-5, N6 = N0-6, N7 = N0-7, N8 = N0-8, + create_bin(M, N8, + [<> | R]); +create_bin(M, N0, R) -> + N1 = N0-1, + create_bin(M, N1, [<> | R]). + + + + +verify_bin(<<>>, _, 0) -> + true; +verify_bin(<<>>, _, _) -> + false; +verify_bin(Bin, N, Cnt) -> + N0 = N + 0, N1 = N + 1, N2 = N + 2, N3 = N + 3, + N4 = N + 4, N5 = N + 5, N6 = N + 6, N7 = N + 7, + case Bin of + <> -> + verify_bin(B, N+8, Cnt-8); + <> -> + verify_bin(B, N+1, Cnt-1); + _ -> + false + end. + + + +verify_file(Name, N) when is_integer(N), N >= 0 -> + case ?FILE_MODULE:open(Name, [raw, read, binary]) of + {ok, FD} -> + Result = verify_file(FD, 0, 64*1024, N), + ok = ?FILE_MODULE:close(FD), + Result; + Error -> + Error + end. + +verify_file(FD, N, _, N) -> + case ?FILE_MODULE:read(FD, 1) of + eof -> + true; + {ok, _} -> + false + end; +verify_file(FD, M, Cnt, N) when M+Cnt =< N -> + case ?FILE_MODULE:read(FD, 4*Cnt) of + {ok, Bin} -> + case verify_bin(Bin, M, Cnt) of + true -> + verify_file(FD, M+Cnt, Cnt, N); + false -> + false + end; + _ -> + false + end; +verify_file(FD, M, _Cnt, N) -> + verify_file(FD, M, N-M, N). + + + +subbin(Bin, M, N) -> + <<_:M/binary, B:N/binary, _/binary>> = Bin, + B. + + + +write_file(Name, Data) -> + case ?FILE_MODULE:open(Name, [raw, write, binary]) of + {ok, FD} -> + Result = ?FILE_MODULE:write(FD, Data), + case {Result, ?FILE_MODULE:close(FD)} of + {ok, R} -> R; + _ -> Result + end; + Error -> + Error + end. + +pwrite_file(Name, Data) -> + case ?FILE_MODULE:open(Name, [raw, write, binary]) of + {ok, FD} -> + Result = ?FILE_MODULE:pwrite(FD, Data), + case {Result, ?FILE_MODULE:close(FD)} of + {ok, R} -> R; + _ -> Result + end; + Error -> + Error + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Read_line tests +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +read_line_testdata(PrivDir) -> + All0 = [{fun read_line_create0/1,"Testdata1.txt",5,10}, + {fun read_line_create1/1,"Testdata2.txt",401,802}, + {fun read_line_create2/1,"Testdata3.txt",1,2}, + {fun read_line_create3/1,"Testdata4.txt",601,fail}, + {fun read_line_create4/1,"Testdata5.txt",601,1002}, + {fun read_line_create5/1,"Testdata6.txt",601,1202}, + {fun read_line_create6/1,"Testdata7.txt",601,1202}, + {fun read_line_create7/1,"Testdata8.txt",4001,8002}], + [ {A,filename:join([PrivDir,B]),C,D} || {A,B,C,D} <- All0 ]. + +read_line_create_files(TestData) -> + [ Function(File) || {Function,File,_,_} <- TestData ]. + +read_line_remove_files(TestData) -> + [ file:delete(File) || {Function,File,_,_} <- TestData ]. + +read_line_1(suite) -> + []; +read_line_1(doc) -> + ["read_line with prim_file"]; +read_line_1(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line All = read_line_testdata(PrivDir), + ?line read_line_create_files(All), + ?line [ begin + io:format("read_line_all: ~s~n",[File]), + {X,_} = read_line_all(File), + true + end || {_,File,X,_} <- All ], + ?line [ begin + io:format("read_line_all_alternating: ~s~n",[File]), + {Y,_} = read_line_all_alternating(File), + true + end || {_,File,_,Y} <- All , Y =/= fail], + ?line [ begin + io:format("read_line_all_alternating (failing as should): ~s~n",[File]), + {'EXIT',_} = (catch read_line_all_alternating(File)), + true + end || {_,File,_,Y} <- All , Y =:= fail], + ?line read_line_remove_files(All), + ok. +read_line_2(suite) -> + []; +read_line_2(doc) -> + ["read_line with file"]; +read_line_2(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line All = read_line_testdata(PrivDir), + ?line read_line_create_files(All), + ?line [ begin + io:format("read_line_all: ~s~n",[File]), + {X,_} = read_line_all2(File), + true + end || {_,File,X,_} <- All ], + ?line [ begin + io:format("read_line_all_alternating: ~s~n",[File]), + {Y,_} = read_line_all_alternating2(File), + true + end || {_,File,_,Y} <- All , Y =/= fail], + ?line [ begin + io:format("read_line_all_alternating (failing as should): ~s~n",[File]), + {'EXIT',_} = (catch read_line_all_alternating2(File)), + true + end || {_,File,_,Y} <- All , Y =:= fail], + ?line read_line_remove_files(All), + ok. +read_line_3(suite) -> + []; +read_line_3(doc) -> + ["read_line with raw file"]; +read_line_3(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line All = read_line_testdata(PrivDir), + ?line read_line_create_files(All), + ?line [ begin + io:format("read_line_all: ~s~n",[File]), + {X,_} = read_line_all3(File), + true + end || {_,File,X,_} <- All ], + ?line [ begin + io:format("read_line_all_alternating: ~s~n",[File]), + {Y,_} = read_line_all_alternating3(File), + true + end || {_,File,_,Y} <- All , Y =/= fail], + ?line [ begin + io:format("read_line_all_alternating (failing as should): ~s~n",[File]), + {'EXIT',_} = (catch read_line_all_alternating3(File)), + true + end || {_,File,_,Y} <- All , Y =:= fail], + ?line read_line_remove_files(All), + ok. +read_line_4(suite) -> + []; +read_line_4(doc) -> + ["read_line with raw buffered file"]; +read_line_4(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line All = read_line_testdata(PrivDir), + ?line read_line_create_files(All), + ?line [ begin + io:format("read_line_all: ~s~n",[File]), + {X,_} = read_line_all4(File), + true + end || {_,File,X,_} <- All ], + ?line [ begin + io:format("read_line_all_alternating: ~s~n",[File]), + {Y,_} = read_line_all_alternating4(File), + true + end || {_,File,_,Y} <- All , Y =/= fail], + ?line [ begin + io:format("read_line_all_alternating (failing as should): ~s~n",[File]), + {'EXIT',_} = (catch read_line_all_alternating4(File)), + true + end || {_,File,_,Y} <- All , Y =:= fail], + ?line read_line_remove_files(All), + ok. + +rl_lines() -> + [ <<"hej">>,<<"hopp">>,<<"i">>,<<"lingon\rskogen">>]. + +read_line_create0(Filename) -> + {ok,F} = file:open(Filename,[write]), + L = rl_lines(), + [ file:write(F,[R,<<"\r\n">>]) || R <- L ], + file:write(F,<<"Inget radslut\r">>), + file:close(F). +read_line_create1(Filename) -> + {ok,F} = file:open(Filename,[write]), + L = rl_lines(), + [ begin + [ file:write(F,[R,<<"\r\n">>]) || R <- L ], + file:write(F,<<"Inget radslut\r">>) + end || _ <- lists:seq(1,100)], + file:close(F). +read_line_create2(Filename) -> + {ok,F} = file:open(Filename,[write]), + L = rl_lines(), + [ begin + [ file:write(F,[R]) || R <- L ], + file:write(F,<<"Inget radslut\r">>) + end || _ <- lists:seq(1,200)], + file:write(F,<<"\r\n">>), + file:close(F). + +read_line_create3(Filename) -> + {ok,F} = file:open(Filename,[write]), + L = rl_lines(), + [ begin + file:write(F,<<"\r\n">>), + file:write(F,<<"\r\n">>), + [ file:write(F,[R,<<"\r\n">>]) || R <- L ], + file:write(F,<<"Inget radslut\r">>) + end || _ <- lists:seq(1,100)], + file:close(F). + +read_line_create4(Filename) -> + {ok,F} = file:open(Filename,[write]), + L = rl_lines(), + [ begin + file:write(F,<<"\n">>), + file:write(F,<<"\n">>), + [ file:write(F,[R,<<"\r\n">>]) || R <- L ], + file:write(F,<<"Inget radslut\r">>) + end || _ <- lists:seq(1,100)], + file:close(F). + +read_line_create5(Filename) -> + {ok,F} = file:open(Filename,[write]), + L = rl_lines(), + [ begin + file:write(F,<<"i\n">>), + file:write(F,<<"i\n">>), + [ file:write(F,[R,<<"\r\n">>]) || R <- L ], + file:write(F,<<"Inget radslut\r">>) + end || _ <- lists:seq(1,100)], + file:close(F). + +read_line_create6(Filename) -> + {ok,F} = file:open(Filename,[write]), + L = rl_lines(), + [ begin + file:write(F,<<"i\r\n">>), + file:write(F,<<"i\r\n">>), + [ file:write(F,[R,<<"\r\n">>]) || R <- L ], + file:write(F,<<"Inget radslut\r">>) + end || _ <- lists:seq(1,100)], + file:close(F). +read_line_create7(Filename) -> + {ok,F} = file:open(Filename,[write]), + L = rl_lines(), + [ begin + [ file:write(F,[R,<<"\r\n">>]) || R <- L ], + file:write(F,<<"Inget radslut\r">>) + end || _ <- lists:seq(1,1000)], + file:close(F). + +read_line_all(Filename) -> + {ok,F} = prim_file:open(Filename,[read,binary]), + X=read_rl_lines(F), + prim_file:close(F), + Bin = list_to_binary([B || {ok,B} <- X]), + Bin = re:replace(list_to_binary([element(2,file:read_file(Filename))]), + "\r\n","\n",[global,{return,binary}]), + {length(X),Bin}. + +read_line_all2(Filename) -> + {ok,F} = file:open(Filename,[read,binary]), + X=read_rl_lines2(F), + file:close(F), + Bin = list_to_binary([B || {ok,B} <- X]), + Bin = re:replace(list_to_binary([element(2,file:read_file(Filename))]), + "\r\n","\n",[global,{return,binary}]), + {length(X),Bin}. + +read_line_all3(Filename) -> + {ok,F} = file:open(Filename,[read,binary,raw]), + X=read_rl_lines2(F), + file:close(F), + Bin = list_to_binary([B || {ok,B} <- X]), + Bin = re:replace(list_to_binary([element(2,file:read_file(Filename))]), + "\r\n","\n",[global,{return,binary}]), + {length(X),Bin}. +read_line_all4(Filename) -> + {ok,F} = file:open(Filename,[read,binary,raw,{read_ahead,8192}]), + X=read_rl_lines2(F), + file:close(F), + Bin = list_to_binary([B || {ok,B} <- X]), + Bin = re:replace(list_to_binary([element(2,file:read_file(Filename))]), + "\r\n","\n",[global,{return,binary}]), + {length(X),Bin}. + +read_rl_lines(F) -> + case prim_file:read_line(F) of + eof -> + []; + {error,X} -> + {error,X}; + List -> + [List | read_rl_lines(F)] + end. + +read_rl_lines2(F) -> + case file:read_line(F) of + eof -> + []; + {error,X} -> + {error,X}; + List -> + [List | read_rl_lines2(F)] + end. + +read_line_all_alternating(Filename) -> + {ok,F} = prim_file:open(Filename,[read,binary]), + X=read_rl_lines(F,true), + prim_file:close(F), + Bin = list_to_binary([B || {ok,B} <- X]), + Bin = re:replace(list_to_binary([element(2,file:read_file(Filename))]), + "\r\n","\n",[global,{return,binary}]), + {length(X),Bin}. + +read_line_all_alternating2(Filename) -> + {ok,F} = file:open(Filename,[read,binary]), + X=read_rl_lines2(F,true), + file:close(F), + Bin = list_to_binary([B || {ok,B} <- X]), + Bin = re:replace(list_to_binary([element(2,file:read_file(Filename))]), + "\r\n","\n",[global,{return,binary}]), + {length(X),Bin}. +read_line_all_alternating3(Filename) -> + {ok,F} = file:open(Filename,[read,binary,raw]), + X=read_rl_lines2(F,true), + file:close(F), + Bin = list_to_binary([B || {ok,B} <- X]), + Bin = re:replace(list_to_binary([element(2,file:read_file(Filename))]), + "\r\n","\n",[global,{return,binary}]), + {length(X),Bin}. +read_line_all_alternating4(Filename) -> + {ok,F} = file:open(Filename,[read,binary,raw,{read_ahead,8192}]), + X=read_rl_lines2(F,true), + file:close(F), + Bin = list_to_binary([B || {ok,B} <- X]), + Bin = re:replace(list_to_binary([element(2,file:read_file(Filename))]), + "\r\n","\n",[global,{return,binary}]), + {length(X),Bin}. + +read_rl_lines(F,Alternate) -> + case begin + case Alternate of + true -> prim_file:read(F,1); + false -> prim_file:read_line(F) + end + end of + eof -> + []; + {error,X} -> + {error,X}; + List -> + [List | read_rl_lines(F,not Alternate)] + end. +read_rl_lines2(F,Alternate) -> + case begin + case Alternate of + true -> file:read(F,1); + false -> file:read_line(F) + end + end of + eof -> + []; + {error,X} -> + {error,X}; + List -> + [List | read_rl_lines2(F,not Alternate)] + end. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +bytes(B, N) + when is_integer(B), 0 =< B, B =< 255, is_integer(N), N > 2, N band 1 == 0 -> + [bytes(B, N bsr 1), bytes(B, N bsr 1)]; +bytes(B, 0) + when is_integer(B), 0 =< B, B =< 255 -> + []; +bytes(B, 2) + when is_integer(B), 0 =< B, B =< 255 -> + [B, B]; +bytes(B, N) + when is_integer(B), 0 =< B, B =< 255, is_integer(N), N > 0 -> + [B, bytes(B, N-1)]. + + +%% A simple loop construct. +%% +%% Calls 'Fun' with argument 'Start' first and then repeatedly with +%% its returned value (state) until 'Fun' returns 'Stop'. Then +%% the last state value that was not 'Stop' is returned. + +iterate(Start, Done, Fun) when is_function(Fun) -> + iterate(Start, Done, Fun, Start). + +iterate(Done, Done, _Fun, I) -> + I; +iterate(I, Done, Fun, _) -> + iterate(Fun(I), Done, Fun, I). + + + +flush() -> + flush([]). + +flush(Msgs) -> + receive + Msg -> + flush([Msg | Msgs]) + after 0 -> + lists:reverse(Msgs) + end. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/gen_sctp_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/gen_sctp_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/gen_sctp_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/gen_sctp_SUITE.erl 2009-03-12 12:21:40.000000000 +0000 @@ -0,0 +1,338 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(gen_sctp_SUITE). + +-include("test_server.hrl"). +-include_lib("kernel/include/inet_sctp.hrl"). + +%%-compile(export_all). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + basic/1,xfer_min/1,xfer_active/1,api_open_close/1,api_listen/1]). + +all(suite) -> + [basic,xfer_min,xfer_active,api_open_close,api_listen]. + +init_per_testcase(_Func, Config) -> + Dog = test_server:timetrap(test_server:seconds(15)), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog). + + + +basic(doc) -> + "Hello world"; +basic(suite) -> + []; +basic(Config) when is_list(Config) -> + ?line {ok,S} = gen_sctp:open(), + ?line ok = gen_sctp:close(S), + ok. + +xfer_min(doc) -> + "Minimal data transfer"; +xfer_min(suite) -> + []; +xfer_min(Config) when is_list(Config) -> + ?line Stream = 0, + ?line Data = <<"The quick brown fox jumps over a lazy dog 0123456789">>, + ?line Loopback = {127,0,0,1}, + ?line {ok,Sb} = gen_sctp:open(), + ?line {ok,Pb} = inet:port(Sb), + ?line ok = gen_sctp:listen(Sb, true), + + ?line {ok,Sa} = gen_sctp:open(), + ?line {ok,Pa} = inet:port(Sa), + ?line {ok,#sctp_assoc_change{state=comm_up, + error=0, + outbound_streams=SaOutboundStreams, + inbound_streams=SaInboundStreams, + assoc_id=SaAssocId}=SaAssocChange} = + gen_sctp:connect(Sa, Loopback, Pb, []), + ?line {ok,{Loopback, + Pa,[], + #sctp_assoc_change{state=comm_up, + error=0, + outbound_streams=SbOutboundStreams, + inbound_streams=SbInboundStreams, + assoc_id=SbAssocId}}} = + gen_sctp:recv(Sb, infinity), + ?line SaOutboundStreams = SbInboundStreams, + ?line SbOutboundStreams = SaInboundStreams, + ?line ok = gen_sctp:send(Sa, SaAssocId, 0, Data), + ?line case gen_sctp:recv(Sb, infinity) of + {ok,{Loopback, + Pa, + [#sctp_sndrcvinfo{stream=Stream, + assoc_id=SbAssocId}], + Data}} -> ok; + {ok,{Loopback, + Pa,[], + #sctp_paddr_change{addr = {Loopback,_}, + state = addr_available, + error = 0, + assoc_id = SbAssocId}}} -> + {ok,{Loopback, + Pa, + [#sctp_sndrcvinfo{stream=Stream, + assoc_id=SbAssocId}], + Data}} = gen_sctp:recv(Sb, infinity) + end, + ?line ok = gen_sctp:send(Sb, SbAssocId, 0, Data), + ?line {ok,{Loopback, + Pb, + [#sctp_sndrcvinfo{stream=Stream, + assoc_id=SaAssocId}], + Data}} = + gen_sctp:recv(Sa, infinity), + %% + ?line ok = gen_sctp:eof(Sa, SaAssocChange), + ?line {ok,{Loopback, + Pa,[], + #sctp_shutdown_event{assoc_id=SbAssocId}}} = + gen_sctp:recv(Sb, infinity), + ?line {ok,{Loopback, + Pb,[], + #sctp_assoc_change{state=shutdown_comp, + error=0, + assoc_id=SaAssocId}}} = + gen_sctp:recv(Sa, infinity), + ?line {ok,{Loopback, + Pa,[], + #sctp_assoc_change{state=shutdown_comp, + error=0, + assoc_id=SbAssocId}}} = + gen_sctp:recv(Sb, infinity), + ?line ok = gen_sctp:close(Sa), + ?line ok = gen_sctp:close(Sb), + + ?line receive + Msg -> test_server:fail({received,Msg}) + after 17 -> ok + end, + ok. + +xfer_active(doc) -> + "Minimal data transfer in active mode"; +xfer_active(suite) -> + []; +xfer_active(Config) when is_list(Config) -> + ?line Timeout = 2000, + ?line Stream = 0, + ?line Data = <<"The quick brown fox jumps over a lazy dog 0123456789">>, + ?line Loopback = {127,0,0,1}, + ?line {ok,Sb} = gen_sctp:open([{active,true}]), + ?line {ok,Pb} = inet:port(Sb), + ?line ok = gen_sctp:listen(Sb, true), + + ?line {ok,Sa} = gen_sctp:open([{active,true}]), + ?line {ok,Pa} = inet:port(Sa), + ?line {ok,#sctp_assoc_change{state=comm_up, + error=0, + outbound_streams=SaOutboundStreams, + inbound_streams=SaInboundStreams, + assoc_id=SaAssocId}=SaAssocChange} = + gen_sctp:connect(Sa, Loopback, Pb, []), + ?line io:format("Sa=~p, Pa=~p, Sb=~p, Pb=~p, SaAssocId=~p, " + "SaOutboundStreams=~p, SaInboundStreams=~p~n", + [Sa,Pa,Sb,Pb,SaAssocId, + SaOutboundStreams,SaInboundStreams]), + ?line SbAssocId = + receive + {sctp,Sb,Loopback,Pa, + {[], + #sctp_assoc_change{state=comm_up, + error=0, + outbound_streams=SbOutboundStreams, + inbound_streams=SbInboundStreams, + assoc_id=SBAI}}} -> + ?line SaOutboundStreams = SbInboundStreams, + ?line SaInboundStreams = SbOutboundStreams, + SBAI + after Timeout -> + ?line test_server:fail({unexpected,flush()}) + end, + ?line io:format("SbAssocId=~p~n", [SbAssocId]), + ?line ok = gen_sctp:send(Sa, SaAssocId, 0, Data), + ?line receive + {sctp,Sb,Loopback,Pa, + {[#sctp_sndrcvinfo{stream=Stream, + assoc_id=SbAssocId}], + Data}} -> ok; + {sctp,Sb,Loopback,Pa, + {[], + #sctp_paddr_change{addr = {Loopback,_}, + state = addr_available, + error = 0, + assoc_id = SbAssocId}}} -> + ?line receive + {sctp,Sb,Loopback,Pa, + {[#sctp_sndrcvinfo{stream=Stream, + assoc_id=SbAssocId}], + Data}} -> ok + end + after Timeout -> + ?line test_server:fail({unexpected,flush()}) + end, + ?line ok = gen_sctp:send(Sb, SbAssocId, 0, Data), + ?line receive + {sctp,Sa,Loopback,Pb, + {[#sctp_sndrcvinfo{stream=Stream, + assoc_id=SaAssocId}], + Data}} -> ok + after Timeout -> + ?line test_server:fail({unexpected,flush()}) + end, + %% + ?line ok = gen_sctp:abort(Sa, SaAssocChange), + ?line receive + {sctp,Sb,Loopback,Pa, + {[], + #sctp_assoc_change{state=comm_lost, + assoc_id=SbAssocId}}} -> ok + after Timeout -> + ?line test_server:fail({unexpected,flush()}) + end, + ?line ok = gen_sctp:close(Sb), + ?line receive + {sctp,Sa,Loopback,Pb, + {[], + #sctp_assoc_change{state=comm_lost, + assoc_id=SaAssocId}}} -> ok + after 17 -> ok %% On Solaris this does not arrive + end, + ?line ok = gen_sctp:close(Sa), + %% + ?line receive + Msg -> test_server:fail({unexpected,[Msg]++flush()}) + after 17 -> ok + end, + ok. + +flush() -> + receive + Msg -> + [Msg|flush()] + after 17 -> + [] + end. + +api_open_close(doc) -> + "Test the API function open/1,2 and close/1"; +api_open_close(suite) -> + []; +api_open_close(Config) when is_list(Config) -> + ?line {ok,S1} = gen_sctp:open(0), + ?line {ok,P} = inet:port(S1), + ?line ok = gen_sctp:close(S1), + + ?line {ok,S2} = gen_sctp:open(P), + ?line {ok,P} = inet:port(S2), + ?line ok = gen_sctp:close(S2), + + ?line {ok,S3} = gen_sctp:open([{port,P}]), + ?line {ok,P} = inet:port(S3), + ?line ok = gen_sctp:close(S3), + + ?line {ok,S4} = gen_sctp:open(P, []), + ?line {ok,P} = inet:port(S4), + ?line ok = gen_sctp:close(S4), + + ?line {ok,S5} = gen_sctp:open(P, [{ifaddr,any}]), + ?line {ok,P} = inet:port(S5), + ?line ok = gen_sctp:close(S5), + + ?line ok = gen_sctp:close(S5), + + ?line try gen_sctp:close(0) + catch error:badarg -> ok + end, + + ?line try gen_sctp:open({}) + catch error:badarg -> ok + end, + + ?line try gen_sctp:open(-1) + catch error:badarg -> ok + end, + + ?line try gen_sctp:open(65536) + catch error:badarg -> ok + end, + + ?line try gen_sctp:open(make_ref(), []) + catch error:badarg -> ok + end, + + ?line try gen_sctp:open(0, {}) + catch error:badarg -> ok + end, + + ?line try gen_sctp:open(0, [make_ref()]) + catch error:badarg -> ok + end, + + ?line try gen_sctp:open([{invalid_option,0}]) + catch error:badarg -> ok + end, + + ?line try gen_sctp:open(0, [{mode,invalid_mode}]) + catch error:badarg -> ok + end, + ok. + +api_listen(doc) -> + "Test the API function listen/2"; +api_listen(suite) -> + []; +api_listen(Config) when is_list(Config) -> + ?line Localhost = {127,0,0,1}, + + ?line try gen_sctp:listen(0, true) + catch error:badarg -> ok + end, + + ?line {ok,S} = gen_sctp:open(), + ?line {ok,Pb} = inet:port(S), + ?line try gen_sctp:listen(S, not_allowed_for_listen) + catch error:badarg -> ok + end, + ?line ok = gen_sctp:close(S), + ?line {error,closed} = gen_sctp:listen(S, true), + + ?line {ok,Sb} = gen_sctp:open(Pb), + ?line {ok,Sa} = gen_sctp:open(), + ?line case gen_sctp:connect(Sa, localhost, Pb, []) of + {error,econnrefused} -> + ?line {ok,{Localhost, + Pb,[], + #sctp_assoc_change{ + state = comm_lost}}} = + gen_sctp:recv(Sa, infinity); + {error,#sctp_assoc_change{state=cant_assoc}} -> ok + end, + ?line ok = gen_sctp:listen(Sb, true), + ?line {ok,#sctp_assoc_change{state=comm_up, + error=0}} = + gen_sctp:connect(Sa, localhost, Pb, []), + ?line ok = gen_sctp:close(Sa), + ?line ok = gen_sctp:close(Sb), + ok. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/gen_tcp_api_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/gen_tcp_api_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/gen_tcp_api_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/gen_tcp_api_SUITE.erl 2009-11-20 13:30:31.000000000 +0000 @@ -0,0 +1,219 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(gen_tcp_api_SUITE). + +%% Tests the documented API for the gen_tcp functions. The "normal" cases +%% are not tested here, because they are tested indirectly in this and +%% and other test suites. + +-include("test_server.hrl"). +-include_lib("kernel/include/inet.hrl"). + +-export([all/1, init_per_testcase/2, fin_per_testcase/2, + t_accept/1, t_connect_timeout/1, t_accept_timeout/1, + t_connect/1, t_connect_bad/1, + t_recv/1, t_recv_timeout/1, t_recv_eof/1, + t_shutdown_write/1, t_shutdown_both/1, t_shutdown_error/1, + t_fdopen/1]). + +all(suite) -> [t_accept, t_connect, t_recv, t_shutdown_write, + t_shutdown_both, t_shutdown_error, t_fdopen]. + +init_per_testcase(_Func, Config) -> + Dog = test_server:timetrap(test_server:seconds(60)), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog). + +%%% gen_tcp:accept/1,2 + +t_accept(suite) -> [t_accept_timeout]. + +t_accept_timeout(doc) -> "Test that gen_tcp:accept/2 (with timeout) works."; +t_accept_timeout(suite) -> []; +t_accept_timeout(Config) when is_list(Config) -> + ?line {ok, L} = gen_tcp:listen(0, []), + ?line timeout({gen_tcp, accept, [L, 200]}, 0.2, 1.0). + +%%% gen_tcp:connect/X + +t_connect(suite) -> [t_connect_timeout, t_connect_bad]. + +t_connect_timeout(doc) -> "Test that gen_tcp:connect/4 (with timeout) works."; +t_connect_timeout(Config) when is_list(Config) -> + %%?line BadAddr = {134,138,177,16}, + %%?line TcpPort = 80, + ?line {ok, BadAddr} = unused_ip(), + ?line TcpPort = 45638, + ?line ok = io:format("Connecting to ~p, port ~p", [BadAddr, TcpPort]), + ?line connect_timeout({gen_tcp,connect,[BadAddr,TcpPort,[],200]}, 0.2, 5.0). + +t_connect_bad(doc) -> + ["Test that gen_tcp:connect/3 handles non-existings hosts, and other ", + "invalid things."]; +t_connect_bad(suite) -> []; +t_connect_bad(Config) when is_list(Config) -> + ?line NonExistingPort = 45638, % Not in use, I hope. + ?line {error, Reason1} = gen_tcp:connect(localhost, NonExistingPort, []), + ?line io:format("Error for connection attempt to port not in use: ~p", + [Reason1]), + + ?line {error, Reason2} = gen_tcp:connect("non-existing-host-xxx", 7, []), + ?line io:format("Error for connection attempt to non-existing host: ~p", + [Reason2]), + ok. + + +%%% gen_tcp:recv/X + +t_recv(suite) -> [t_recv_timeout, t_recv_eof]. + +t_recv_timeout(doc) -> "Test that gen_tcp:recv/3 (with timeout works)."; +t_recv_timeout(suite) -> []; +t_recv_timeout(Config) when is_list(Config) -> + ?line {ok, L} = gen_tcp:listen(0, []), + ?line {ok, Port} = inet:port(L), + ?line {ok, Client} = gen_tcp:connect(localhost, Port, [{active, false}]), + ?line {ok, _A} = gen_tcp:accept(L), + ?line timeout({gen_tcp, recv, [Client, 0, 200]}, 0.2, 5.0). + +t_recv_eof(doc) -> "Test that end of file on a socket is reported correctly."; +t_recv_eof(suite) -> []; +t_recv_eof(Config) when is_list(Config) -> + ?line {ok, L} = gen_tcp:listen(0, []), + ?line {ok, Port} = inet:port(L), + ?line {ok, Client} = gen_tcp:connect(localhost, Port, [{active, false}]), + ?line {ok, A} = gen_tcp:accept(L), + ?line ok = gen_tcp:close(A), + ?line {error, closed} = gen_tcp:recv(Client, 0), + ok. + +%%% gen_tcp:shutdown/2 + +t_shutdown_write(Config) when is_list(Config) -> + ?line {ok, L} = gen_tcp:listen(0, []), + ?line {ok, Port} = inet:port(L), + ?line {ok, Client} = gen_tcp:connect(localhost, Port, [{active, false}]), + ?line {ok, A} = gen_tcp:accept(L), + ?line ok = gen_tcp:shutdown(A, write), + ?line {error, closed} = gen_tcp:recv(Client, 0), + ok. + +t_shutdown_both(Config) when is_list(Config) -> + ?line {ok, L} = gen_tcp:listen(0, []), + ?line {ok, Port} = inet:port(L), + ?line {ok, Client} = gen_tcp:connect(localhost, Port, [{active, false}]), + ?line {ok, A} = gen_tcp:accept(L), + ?line ok = gen_tcp:shutdown(A, read_write), + ?line {error, closed} = gen_tcp:recv(Client, 0), + ok. + +t_shutdown_error(Config) when is_list(Config) -> + ?line {ok, L} = gen_tcp:listen(0, []), + ?line {error, enotconn} = gen_tcp:shutdown(L, read_write), + ?line ok = gen_tcp:close(L), + ?line {error, closed} = gen_tcp:shutdown(L, read_write), + ok. + + +%%% gen_tcp:fdopen/2 + +t_fdopen(Config) when is_list(Config) -> + ?line Question = "Aaaa... Long time ago in a small town in Germany,", + ?line Answer = "there was a shoemaker, Schumacher was his name.", + ?line {ok, L} = gen_tcp:listen(0, [{active, false}]), + ?line {ok, Port} = inet:port(L), + ?line {ok, Client} = gen_tcp:connect(localhost, Port, [{active, false}]), + ?line {ok, A} = gen_tcp:accept(L), + ?line {ok, FD} = prim_inet:getfd(A), + ?line {ok, Server} = gen_tcp:fdopen(FD, []), + ?line ok = gen_tcp:send(Client, Question), + ?line {ok, Question} = gen_tcp:recv(Server, length(Question), 2000), + ?line ok = gen_tcp:send(Server, Answer), + ?line {ok, Answer} = gen_tcp:recv(Client, length(Answer), 2000), + ?line ok = gen_tcp:close(Client), + ?line {error,closed} = gen_tcp:recv(A, 1, 2000), + ?line ok = gen_tcp:close(Server), + ?line ok = gen_tcp:close(A), + ?line ok = gen_tcp:close(L), + ok. + + + +%%% Utilities + +%% Calls M:F/length(A), which should return a timeout error, and complete +%% within the given time. + +timeout({M,F,A}, Lower, Upper) -> + case test_server:timecall(M, F, A) of + {Time, Result} when Time < Lower -> + test_server:fail({too_short_time, Time, Result}); + {Time, Result} when Time > Upper -> + test_server:fail({too_long_time, Time, Result}); + {_, {error, timeout}} -> + ok; + {_, Result} -> + test_server:fail({unexpected_result, Result}) + end. + +connect_timeout({M,F,A}, Lower, Upper) -> + case test_server:timecall(M, F, A) of + {Time, Result} when Time < Lower -> + case Result of + {error,econnrefused=E} -> + {comment,"Not tested -- got error "++atom_to_list(E)}; + {error,enetunreach=E} -> + {comment,"Not tested -- got error "++atom_to_list(E)}; + {ok,Socket} -> % What the... + Pinfo = erlang:port_info(Socket), + Db = inet_db:lookup_socket(Socket), + Peer = inet:peername(Socket), + test_server:fail({too_short_time, Time, + [Result,Pinfo,Db,Peer]}); + _ -> + test_server:fail({too_short_time, Time, Result}) + end; + {Time, Result} when Time > Upper -> + test_server:fail({too_long_time, Time, Result}); + {_, {error, timeout}} -> + ok; + {_, Result} -> + test_server:fail({unexpected_result, Result}) + end. + +%% Try to obtain an unused IP address in the local network. + +unused_ip() -> + ?line {ok, Host} = inet:gethostname(), + ?line {ok, Hent} = inet:gethostbyname(Host), + ?line #hostent{h_addr_list=[{A, B, C, _D}|_]} = Hent, + %% Note: In our net, addresses below 16 are reserved for routers and + %% other strange creatures. + ?line IP = unused_ip(A, B, C, 16), + io:format("we = ~p, unused_ip = ~p~n", [Hent, IP]), + IP. + +unused_ip(_, _, _, 255) -> error; +unused_ip(A, B, C, D) -> + case inet:gethostbyaddr({A, B, C, D}) of + {ok, _} -> unused_ip(A, B, C, D+1); + {error, _} -> {ok, {A, B, C, D}} + end. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/gen_tcp_echo_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/gen_tcp_echo_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/gen_tcp_echo_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/gen_tcp_echo_SUITE.erl 2009-11-20 13:30:27.000000000 +0000 @@ -0,0 +1,585 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(gen_tcp_echo_SUITE). + +-include("test_server.hrl"). + +%%-compile(export_all). + +-export([all/1, init_per_testcase/2, fin_per_testcase/2, + active_echo/1, passive_echo/1, active_once_echo/1, + slow_active_echo/1, slow_passive_echo/1, + limit_active_echo/1, limit_passive_echo/1, + large_limit_active_echo/1, large_limit_passive_echo/1]). + +-define(TPKT_VRSN, 3). +-define(LINE_LENGTH, 1023). % (default value of gen_tcp option 'recbuf') - 1 + +all(suite) -> + [active_echo, passive_echo, active_once_echo, + slow_active_echo, slow_passive_echo, + limit_active_echo, limit_passive_echo, + large_limit_active_echo, large_limit_passive_echo]. + +init_per_testcase(_Func, Config) -> + Dog = test_server:timetrap(test_server:minutes(5)), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog). + +active_echo(doc) -> + ["Test sending packets of various sizes and various packet types ", + "to the echo port and receiving them again (socket in active mode)."]; +active_echo(suite) -> []; +active_echo(Config) when is_list(Config) -> + ?line echo_test([], fun active_echo/4, [{echo, fun echo_server/0}]). + +passive_echo(doc) -> + ["Test sending packets of various sizes and various packet types ", + "to the echo port and receiving them again (socket in passive mode)."]; +passive_echo(suite) -> []; +passive_echo(Config) when is_list(Config) -> + ?line echo_test([{active, false}], fun passive_echo/4, + [{echo, fun echo_server/0}]). + +active_once_echo(doc) -> + ["Test sending packets of various sizes and various packet types ", + "to the echo port and receiving them again (socket in active once mode)."]; +active_once_echo(suite) -> []; +active_once_echo(Config) when is_list(Config) -> + ?line echo_test([{active, once}], fun active_once_echo/4, + [{echo, fun echo_server/0}]). + +slow_active_echo(doc) -> + ["Test sending packets of various sizes and various packet types ", + "to the echo port and receiving them again (socket in active mode). ", + "The echo server is a special one that delays between every character."]; +slow_active_echo(suite) -> []; +slow_active_echo(Config) when is_list(Config) -> + ?line echo_test([], fun active_echo/4, + [slow_echo, {echo, fun slow_echo_server/0}]). + +slow_passive_echo(doc) -> + ["Test sending packets of various sizes and various packet types ", + "to an echo server and receiving them again (socket in passive mode).", + "The echo server is a special one that delays between every character."]; +slow_passive_echo(suite) -> []; +slow_passive_echo(Config) when is_list(Config) -> + ?line echo_test([{active, false}], fun passive_echo/4, + [slow_echo, {echo, fun slow_echo_server/0}]). + +limit_active_echo(doc) -> + ["Test sending packets of various sizes and various packet types ", + "to the echo port and receiving them again (socket in active mode) " + "with packet_size limitation."]; +limit_active_echo(suite) -> []; +limit_active_echo(Config) when is_list(Config) -> + ?line echo_test([{packet_size, 10}], + fun active_echo/4, + [{packet_size, 10}, {echo, fun echo_server/0}]). + +limit_passive_echo(doc) -> + ["Test sending packets of various sizes and various packet types ", + "to the echo port and receiving them again (socket in passive mode) ", + "with packet_size limitation."]; +limit_passive_echo(suite) -> []; +limit_passive_echo(Config) when is_list(Config) -> + ?line echo_test([{packet_size, 10},{active, false}], + fun passive_echo/4, + [{packet_size, 10}, {echo, fun echo_server/0}]). + +large_limit_active_echo(doc) -> + ["Test sending packets of various sizes and various packet types ", + "to the echo port and receiving them again (socket in active mode) " + "with large packet_size limitation."]; +large_limit_active_echo(suite) -> []; +large_limit_active_echo(Config) when is_list(Config) -> + ?line echo_test([{packet_size, 10}], + fun active_echo/4, + [{packet_size, (1 bsl 32)-1}, + {echo, fun echo_server/0}]). + +large_limit_passive_echo(doc) -> + ["Test sending packets of various sizes and various packet types ", + "to the echo port and receiving them again (socket in passive mode) ", + "with large packet_size limitation."]; +large_limit_passive_echo(suite) -> []; +large_limit_passive_echo(Config) when is_list(Config) -> + ?line echo_test([{packet_size, 10},{active, false}], + fun passive_echo/4, + [{packet_size, (1 bsl 32) -1}, + {echo, fun echo_server/0}]). + +echo_test(SockOpts, EchoFun, Config0) -> + echo_test_1(SockOpts, EchoFun, Config0), + io:format("\nrepeating test with {delay_send,true}"), + echo_test_1([{delay_send,true}|SockOpts], EchoFun, Config0). + +echo_test_1(SockOpts, EchoFun, Config0) -> + ?line EchoSrvFun = ?config(echo, Config0), + ?line {ok, EchoPort} = EchoSrvFun(), + ?line Config = [{echo_port, EchoPort}|Config0], + + ?line echo_packet([{packet, 1}|SockOpts], EchoFun, Config), + ?line echo_packet([{packet, 2}|SockOpts], EchoFun, Config), + ?line echo_packet([{packet, 4}|SockOpts], EchoFun, Config), + ?line echo_packet([{packet, sunrm}|SockOpts], EchoFun, Config), + ?line echo_packet([{packet, cdr}|SockOpts], EchoFun, + [{type, {cdr, big}}|Config]), + ?line echo_packet([{packet, cdr}|SockOpts], EchoFun, + [{type, {cdr, little}}|Config]), + ?line case lists:keymember(packet_size, 1, SockOpts) of + false -> + ?line echo_packet([{packet, line}|SockOpts], + EchoFun, Config); + true -> ok + end, + ?line echo_packet([{packet, tpkt}|SockOpts], EchoFun, Config), + + ?line ShortTag = [16#E0], + ?line LongTag = [16#1F, 16#83, 16#27], + ?line echo_packet([{packet, asn1}|SockOpts], EchoFun, + [{type, {asn1, short, ShortTag}}|Config]), + ?line echo_packet([{packet, asn1}|SockOpts], EchoFun, + [{type, {asn1, long, ShortTag}}|Config]), + ?line echo_packet([{packet, asn1}|SockOpts], EchoFun, + [{type, {asn1, short, LongTag}}|Config]), + ?line echo_packet([{packet, asn1}|SockOpts], EchoFun, + [{type, {asn1, long, LongTag}}|Config]), + + ?line echo_packet([{packet, http}|SockOpts], EchoFun, Config), + ?line echo_packet([{packet, http_bin}|SockOpts], EchoFun, Config), + ok. + +echo_packet(SockOpts, EchoFun, Opts) -> + ?line Type = + case lists:keysearch(type, 1, Opts) of + {value, {type, T}} -> + T; + _ -> + {value, {packet, T}} = lists:keysearch(packet, 1, SockOpts), + T + end, + + %% Connect to the echo server. + ?line EchoPort = ?config(echo_port, Opts), + ?line {ok, Echo} = gen_tcp:connect(localhost, EchoPort, SockOpts), + + ?line SlowEcho = + case os:type() of + vxworks -> true; + _ -> lists:member(slow_echo, Opts) + end, + + case Type of + http -> + echo_packet_http(Echo, Type, EchoFun); + http_bin -> + echo_packet_http(Echo, Type, EchoFun); + _ -> + echo_packet0(Echo, Type, EchoFun, SlowEcho, Opts) + end. + +echo_packet_http(Echo, Type, EchoFun) -> + lists:foreach(fun(Uri)-> P1 = http_request(Uri), + EchoFun(Echo, Type, P1, http_reply(P1, Type)) + end, + http_uri_variants()), + P2 = http_response(), + EchoFun(Echo, Type, P2, http_reply(P2, Type)). + +echo_packet0(Echo, Type, EchoFun, SlowEcho, Opts) -> + ?line PacketSize = + case lists:keysearch(packet_size, 1, Opts) of + {value,{packet_size,Sz}} when Sz < 10 -> Sz; + {value,{packet_size,_}} -> 10; + false -> 0 + end, + %% Echo small packets first. + ?line echo_packet1(Echo, Type, EchoFun, 0), + ?line echo_packet1(Echo, Type, EchoFun, 1), + ?line echo_packet1(Echo, Type, EchoFun, 2), + ?line echo_packet1(Echo, Type, EchoFun, 3), + ?line echo_packet1(Echo, Type, EchoFun, 4), + ?line echo_packet1(Echo, Type, EchoFun, 7), + if PacketSize =/= 0 -> + ?line echo_packet1(Echo, Type, EchoFun, + {PacketSize-1, PacketSize}), + ?line echo_packet1(Echo, Type, EchoFun, + {PacketSize, PacketSize}), + ?line echo_packet1(Echo, Type, EchoFun, + {PacketSize+1, PacketSize}); + not SlowEcho -> % Go on with bigger packets if not slow echo server. + ?line echo_packet1(Echo, Type, EchoFun, 10), + ?line echo_packet1(Echo, Type, EchoFun, 13), + ?line echo_packet1(Echo, Type, EchoFun, 126), + ?line echo_packet1(Echo, Type, EchoFun, 127), + ?line echo_packet1(Echo, Type, EchoFun, 128), + ?line echo_packet1(Echo, Type, EchoFun, 255), + ?line echo_packet1(Echo, Type, EchoFun, 256), + ?line echo_packet1(Echo, Type, EchoFun, 1023), + ?line echo_packet1(Echo, Type, EchoFun, 3747), + ?line echo_packet1(Echo, Type, EchoFun, 32767), + ?line echo_packet1(Echo, Type, EchoFun, 32768), + ?line echo_packet1(Echo, Type, EchoFun, 65531), + ?line echo_packet1(Echo, Type, EchoFun, 65535), + ?line echo_packet1(Echo, Type, EchoFun, 65536), + ?line echo_packet1(Echo, Type, EchoFun, 70000), + ?line echo_packet1(Echo, Type, EchoFun, infinite); + true -> ok + end, + ?line gen_tcp:close(Echo), + ok. + +echo_packet1(EchoSock, Type, EchoFun, Size) -> + ?line case packet(Size, Type) of + false -> + ok; + Packet -> + ?line io:format("Type ~p, size ~p, time ~p", + [Type, Size, time()]), + ?line + case EchoFun(EchoSock, Type, Packet, [Packet]) of + ok -> + ?line + case Size of + {N, Max} when N > Max -> + ?line + test_server:fail( + {packet_through, {N, Max}}); + _ -> ok + end; + {error, emsgsize} -> + ?line + case Size of + {N, Max} when N > Max -> + io:format(" Blocked!"); + _ -> + ?line + test_server:fail( + {packet_blocked, Size}) + end; + Error -> + ?line test_server:fail(Error) + end + end. + +active_echo(Sock, Type, Packet, PacketEchos) -> + ?line ok = gen_tcp:send(Sock, Packet), + active_recv(Sock, Type, PacketEchos). + +active_recv(_, _, []) -> + ok; +active_recv(Sock, Type, [PacketEcho|Tail]) -> + Tag = case Type of + http -> http; + http_bin -> http; + _ -> tcp + end, + ?line receive Recv->Recv end, + %%io:format("Active received: ~p\n",[Recv]), + ?line case Recv of + {Tag, Sock, PacketEcho} -> + active_recv(Sock, Type, Tail); + {Tag, Sock, Bad} -> + ?line test_server:fail({wrong_data, Bad, expected, PacketEcho}); + {tcp_error, Sock, Reason} -> + {error, Reason}; + Other -> + ?line test_server:fail({unexpected_message, Other, Tag}) + end. + +passive_echo(Sock, _Type, Packet, PacketEchos) -> + ?line ok = gen_tcp:send(Sock, Packet), + passive_recv(Sock, PacketEchos). + +passive_recv(_, []) -> + ok; +passive_recv(Sock, [PacketEcho | Tail]) -> + Recv = gen_tcp:recv(Sock, 0), + %%io:format("Passive received: ~p\n",[Recv]), + ?line case Recv of + {ok, PacketEcho} -> + passive_recv(Sock, Tail); + {ok, Bad} -> + io:format("Expected: ~p\nGot: ~p\n",[PacketEcho,Bad]), + ?line test_server:fail({wrong_data, Bad}); + {error,PacketEcho} -> + passive_recv(Sock, Tail); % expected error + {error, _}=Error -> + Error; + Other -> + ?line test_server:fail({unexpected_message, Other}) + end. + +active_once_echo(Sock, Type, Packet, PacketEchos) -> + ?line ok = gen_tcp:send(Sock, Packet), + active_once_recv(Sock, Type, PacketEchos). + +active_once_recv(_, _, []) -> + ok; +active_once_recv(Sock, Type, [PacketEcho | Tail]) -> + Tag = case Type of + http -> http; + http_bin -> http; + _ -> tcp + end, + ?line receive + {Tag, Sock, PacketEcho} -> + inet:setopts(Sock, [{active, once}]), + active_once_recv(Sock, Type, Tail); + {Tag, Sock, Bad} -> + ?line test_server:fail({wrong_data, Bad}); + {tcp_error, Sock, Reason} -> + {error, Reason}; + Other -> + ?line test_server:fail({unexpected_message, Other, expected, {Tag, Sock, PacketEcho}}) + end. + +%%% Building of random packets. + +packet(infinite, {asn1, _, Tag}) -> + Tag++[16#80]; +packet(infinite, _) -> + false; +packet({Size, _RecvLimit}, Type) -> + packet(Size, Type); +packet(Size, 1) when Size > 255 -> + false; +packet(Size, 2) when Size > 65535 -> + false; +packet(Size, {asn1, _, Tag}) when Size < 128 -> + Tag++[Size|random_packet(Size)]; +packet(Size, {asn1, short, Tag}) when Size < 256 -> + Tag++[16#81, Size|random_packet(Size)]; +packet(Size, {asn1, short, Tag}) when Size < 65536 -> + Tag++[16#82|put_int16(Size, big, random_packet(Size))]; +packet(Size, {asn1, _, Tag}) -> + Tag++[16#84|put_int32(Size, big, random_packet(Size))]; +packet(Size, {cdr, Endian}) -> + [$G, $I, $O, $P, % magic + 1, 0, % major minor + if Endian == big -> 0; true -> 1 end, % flags: byte order + 0 | % message type + put_int32(Size, Endian, random_packet(Size))]; +packet(Size, sunrm) -> + put_int32(Size, big, random_packet(Size)); +packet(Size, line) when Size > ?LINE_LENGTH -> + false; +packet(Size, line) -> + random_packet(Size, "\n"); +packet(Size, tpkt) -> + HeaderSize = 4, + PacketSize = HeaderSize + Size, + if PacketSize < 65536 -> + Header = [?TPKT_VRSN, 0 | put_int16(PacketSize, big)], + HeaderSize = length(Header), % Just to assert cirkular dependency + Header ++ random_packet(Size); + true -> + false + end; +packet(Size, _Type) -> + random_packet(Size). + + + +random_packet(Size) -> + random_packet(Size, "", random_char()). + +random_packet(Size, Tail) -> + random_packet(Size, Tail, random_char()). + +random_packet(0, Result, _NextChar) -> + Result; +random_packet(Left, Result, NextChar0) -> + NextChar = + if + NextChar0 >= 126 -> + 33; + true -> + NextChar0+1 + end, + random_packet(Left-1, [NextChar0|Result], NextChar). + +random_char() -> + random_char("abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789"). + +random_char(Chars) -> + lists:nth(uniform(length(Chars)), Chars). + +uniform(N) -> + case get(random_seed) of + undefined -> + {X, Y, Z} = time(), + random:seed(X, Y, Z); + _ -> + ok + end, + random:uniform(N). + +put_int32(X, big, List) -> + [ (X bsr 24) band 16#ff, + (X bsr 16) band 16#ff, + (X bsr 8) band 16#ff, + (X) band 16#ff | List ]; +put_int32(X, little, List) -> + [ (X) band 16#ff, + (X bsr 8) band 16#ff, + (X bsr 16) band 16#ff, + (X bsr 24) band 16#ff | List]. + +put_int16(X, ByteOrder) -> + put_int16(X, ByteOrder, []). + +put_int16(X, big, List) -> + [ (X bsr 8) band 16#ff, + (X) band 16#ff | List ]; +put_int16(X, little, List) -> + [ (X) band 16#ff, + (X bsr 8) band 16#ff | List ]. + +%%% A normal echo server, for systems that don't have one. + +echo_server() -> + Self = self(), + ?line spawn_link(fun() -> echo_server(Self) end), + ?line receive + {echo_port, Port} -> + {ok, Port} + end. + +echo_server(ReplyTo) -> + {ok, S} = gen_tcp:listen(0, [{active, false}, binary]), + {ok, {_, Port}} = inet:sockname(S), + ReplyTo ! {echo_port, Port}, + echo_server_loop(S). + +echo_server_loop(Sock) -> + {ok, E} = gen_tcp:accept(Sock), + Self = self(), + spawn_link(fun() -> echoer(E, Self) end), + echo_server_loop(Sock). + +echoer(Sock, Parent) -> + unlink(Parent), + echoer_loop(Sock). + +echoer_loop(Sock) -> + case gen_tcp:recv(Sock, 0) of + {ok, Data} -> + ok = gen_tcp:send(Sock, Data), + echoer_loop(Sock); + {error, closed} -> + ok + end. + +%%% A "slow" echo server, which will echo data with a short delay +%%% between each character. + +slow_echo_server() -> + Self = self(), + ?line spawn_link(fun() -> slow_echo_server(Self) end), + ?line receive + {echo_port, Port} -> + {ok, Port} + end. + +slow_echo_server(ReplyTo) -> + {ok, S} = gen_tcp:listen(0, [{active, false}, {nodelay, true}]), + {ok, {_, Port}} = inet:sockname(S), + ReplyTo ! {echo_port, Port}, + slow_echo_server_loop(S). + +slow_echo_server_loop(Sock) -> + {ok, E} = gen_tcp:accept(Sock), + spawn_link(fun() -> slow_echoer(E, self()) end), + slow_echo_server_loop(Sock). + +slow_echoer(Sock, Parent) -> + unlink(Parent), + slow_echoer_loop(Sock). + +slow_echoer_loop(Sock) -> + case gen_tcp:recv(Sock, 0) of + {ok, Data} -> + slow_send(Sock, Data), + slow_echoer_loop(Sock); + {error, closed} -> + ok + end. + +slow_send(Sock, [C|Rest]) -> + ok = gen_tcp:send(Sock, [C]), + receive after 1 -> + slow_send(Sock, Rest) + end; +slow_send(_, []) -> + ok. + +http_request(Uri) -> + list_to_binary(["POST ", Uri, <<" HTTP/1.1\r\n" + "Connection: close\r\n" + "Host: localhost:8000\r\n" + "User-Agent: perl post\r\n" + "Content-Length: 4\r\n" + "Content-Type: text/xml; charset=utf-8\r\n" + "Other-Field: with some text\r\n" + "Multi-Line: Once upon a time in a land far far away,\r\n" + " there lived a princess imprisoned in the highest tower\r\n" + " of the most haunted castle.\r\n" + "Invalid line without a colon\r\n" + "\r\n">>]). + +http_uri_variants() -> + ["*", + "http://tools.ietf.org/html/rfcX3986", + "http://otp.ericsson.se:8000/product/internal/", + "https://example.com:8042/over/there?name=ferret#nose", + "ftp://cnn.example.com&story=breaking_news@10.0.0.1/top_story.htm", + "/some/absolute/path", + "something_else", "something_else"]. + +http_response() -> + <<"HTTP/1.0 404 Object Not Found\r\n" + "Server: inets/4.7.16\r\n" + "Date: Fri, 04 Jul 2008 17:16:22 GMT\r\n" + "Content-Type: text/html\r\n" + "Content-Length: 207\r\n" + "\r\n">>. + +http_reply(Bin, Type) -> + {ok, Line, Rest} = erlang:decode_packet(Type,Bin,[]), + HType = case Type of + http -> httph; + http_bin -> httph_bin + end, + Ret = lists:reverse(http_reply(Rest,[Line],HType)), + io:format("HTTP: ~p\n",[Ret]), + Ret. + +http_reply(<<>>, Acc, _) -> + Acc; +http_reply(Bin, Acc, HType) -> + {ok, Line, Rest} = erlang:decode_packet(HType,Bin,[]), + http_reply(Rest, [Line | Acc], HType). + + + + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/gen_tcp_misc_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/gen_tcp_misc_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/gen_tcp_misc_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/gen_tcp_misc_SUITE.erl 2009-11-20 13:30:30.000000000 +0000 @@ -0,0 +1,2362 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(gen_tcp_misc_SUITE). + +-include("test_server.hrl"). + +%-compile(export_all). + +-export([all/1, controlling_process/1, no_accept/1, close_with_pending_output/1, + data_before_close/1, iter_max_socks/1, get_status/1, + passive_sockets/1, accept_closed_by_other_process/1, + init_per_testcase/2, fin_per_testcase/2, + otp_3924/1, otp_3924_sender/4, closed_socket/1, + shutdown_active/1, shutdown_passive/1, shutdown_pending/1, + default_options/1, http_bad_packet/1, + busy_send/1, busy_disconnect_passive/1, busy_disconnect_active/1, + fill_sendq/1, partial_recv_and_close/1, + partial_recv_and_close_2/1,partial_recv_and_close_3/1,so_priority/1, + % Accept tests + primitive_accept/1,multi_accept_close_listen/1,accept_timeout/1, + accept_timeouts_in_order/1,accept_timeouts_in_order2/1,accept_timeouts_in_order3/1, + accept_timeouts_mixed/1, + killing_acceptor/1,killing_multi_acceptors/1,killing_multi_acceptors2/1, + several_accepts_in_one_go/1,active_once_closed/1, send_timeout/1, otp_7731/1, + zombie_sockets/1, otp_7816/1, otp_8102/1]). + +%% Internal exports. +-export([sender/3, not_owner/1, passive_sockets_server/2, priority_server/1, otp_7731_server/1, zombie_server/2]). + +init_per_testcase(_Func, Config) when is_list(Config) -> + Dog = test_server:timetrap(test_server:seconds(240)), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog). + +all(suite) -> + [controlling_process, no_accept, + close_with_pending_output, + data_before_close, iter_max_socks, passive_sockets, + accept_closed_by_other_process, otp_3924, closed_socket, + shutdown_active, shutdown_passive, shutdown_pending, + default_options, http_bad_packet, + busy_send, busy_disconnect_passive, busy_disconnect_active, + fill_sendq, partial_recv_and_close, + partial_recv_and_close_2, partial_recv_and_close_3, so_priority, + primitive_accept,multi_accept_close_listen,accept_timeout, + accept_timeouts_in_order,accept_timeouts_in_order2,accept_timeouts_in_order3, + accept_timeouts_mixed, + killing_acceptor,killing_multi_acceptors,killing_multi_acceptors2, + several_accepts_in_one_go, active_once_closed, send_timeout, otp_7731, + zombie_sockets, otp_7816, otp_8102]. + + +default_options(doc) -> + ["Tests kernel application variables inet_default_listen_options and " + "inet_default_connect_options"]; +default_options(suite) -> + []; +default_options(Config) when is_list(Config) -> + %% First check the delay_send option + ?line {true,true,true}=do_delay_send_1(), + ?line {false,false,false}=do_delay_send_2(), + ?line {true,false,false}=do_delay_send_3(), + ?line {false,false,false}=do_delay_send_4(), + ?line {false,false,false}=do_delay_send_5(), + ?line {false,true,true}=do_delay_send_6(), + %% Now lets start some nodes with different combinations of options: + ?line {true,true,true} = do_delay_on_other_node("", + fun do_delay_send_1/0), + ?line {true,false,false} = + do_delay_on_other_node("-kernel inet_default_connect_options " + "\"[{delay_send,true}]\"", + fun do_delay_send_2/0), + + ?line {false,true,true} = + do_delay_on_other_node("-kernel inet_default_listen_options " + "\"[{delay_send,true}]\"", + fun do_delay_send_2/0), + + ?line {true,true,true} = + do_delay_on_other_node("-kernel inet_default_listen_options " + "\"[{delay_send,true}]\"", + fun do_delay_send_3/0), + ?line {true,true,true} = + do_delay_on_other_node("-kernel inet_default_connect_options " + "\"[{delay_send,true}]\"", + fun do_delay_send_6/0), + ?line {false,false,false} = + do_delay_on_other_node("-kernel inet_default_connect_options " + "\"[{delay_send,true}]\"", + fun do_delay_send_5/0), + ?line {false,true,true} = + do_delay_on_other_node("-kernel inet_default_connect_options " + "\"[{delay_send,true}]\" " + "-kernel inet_default_listen_options " + "\"[{delay_send,true}]\"", + fun do_delay_send_5/0), + ?line {true,false,false} = + do_delay_on_other_node("-kernel inet_default_connect_options " + "\"[{delay_send,true}]\" " + "-kernel inet_default_listen_options " + "\"[{delay_send,true}]\"", + fun do_delay_send_4/0), + ?line {true,true,true} = + do_delay_on_other_node("-kernel inet_default_connect_options " + "\"{delay_send,true}\" " + "-kernel inet_default_listen_options " + "\"{delay_send,true}\"", + fun do_delay_send_2/0), + %% Active is to dangerous and is supressed + ?line {true,true,true} = + do_delay_on_other_node("-kernel inet_default_connect_options " + "\"{active,false}\" " + "-kernel inet_default_listen_options " + "\"{active,false}\"", + fun do_delay_send_7/0), + ?line {true,true,true} = + do_delay_on_other_node("-kernel inet_default_connect_options " + "\"[{active,false},{delay_send,true}]\" " + "-kernel inet_default_listen_options " + "\"[{active,false},{delay_send,true}]\"", + fun do_delay_send_7/0), + ?line {true,true,true} = + do_delay_on_other_node("-kernel inet_default_connect_options " + "\"[{active,false},{delay_send,true}]\" " + "-kernel inet_default_listen_options " + "\"[{active,false},{delay_send,true}]\"", + fun do_delay_send_2/0), + ok. + + +do_delay_on_other_node(XArgs, Function) -> + Dir = filename:dirname(code:which(?MODULE)), + {ok,Node} = test_server:start_node(test_default_options_slave,slave, + [{args,"-pa " ++ Dir ++ " " ++ + XArgs}]), + Res = rpc:call(Node,erlang,apply,[Function,[]]), + test_server:stop_node(Node), + Res. + + +do_delay_send_1() -> + {ok,LS}=gen_tcp:listen(0,[{delay_send,true}]), + {ok,{{0,0,0,0},PortNum}}=inet:sockname(LS), + {ok,S}=gen_tcp:connect("localhost",PortNum,[{delay_send,true}]), + {ok,S2}= gen_tcp:accept(LS), + {ok,[{delay_send,B1}]}=inet:getopts(S,[delay_send]), + {ok,[{delay_send,B2}]}=inet:getopts(LS,[delay_send]), + {ok,[{delay_send,B3}]}=inet:getopts(S2,[delay_send]), + gen_tcp:close(S2), + gen_tcp:close(S), + gen_tcp:close(LS), + {B1,B2,B3}. + +do_delay_send_2() -> + {ok,LS}=gen_tcp:listen(0,[]), + {ok,{{0,0,0,0},PortNum}}=inet:sockname(LS), + {ok,S}=gen_tcp:connect("localhost",PortNum,[]), + {ok,S2}= gen_tcp:accept(LS), + {ok,[{delay_send,B1}]}=inet:getopts(S,[delay_send]), + {ok,[{delay_send,B2}]}=inet:getopts(LS,[delay_send]), + {ok,[{delay_send,B3}]}=inet:getopts(S2,[delay_send]), + gen_tcp:close(S2), + gen_tcp:close(S), + gen_tcp:close(LS), + {B1,B2,B3}. + +do_delay_send_3() -> + {ok,LS}=gen_tcp:listen(0,[]), + {ok,{{0,0,0,0},PortNum}}=inet:sockname(LS), + {ok,S}=gen_tcp:connect("localhost",PortNum,[{delay_send,true}]), + {ok,S2}= gen_tcp:accept(LS), + {ok,[{delay_send,B1}]}=inet:getopts(S,[delay_send]), + {ok,[{delay_send,B2}]}=inet:getopts(LS,[delay_send]), + {ok,[{delay_send,B3}]}=inet:getopts(S2,[delay_send]), + gen_tcp:close(S2), + gen_tcp:close(S), + gen_tcp:close(LS), + {B1,B2,B3}. + +do_delay_send_4() -> + {ok,LS}=gen_tcp:listen(0,[{delay_send,false}]), + {ok,{{0,0,0,0},PortNum}}=inet:sockname(LS), + {ok,S}=gen_tcp:connect("localhost",PortNum,[]), + {ok,S2}= gen_tcp:accept(LS), + {ok,[{delay_send,B1}]}=inet:getopts(S,[delay_send]), + {ok,[{delay_send,B2}]}=inet:getopts(LS,[delay_send]), + {ok,[{delay_send,B3}]}=inet:getopts(S2,[delay_send]), + gen_tcp:close(S2), + gen_tcp:close(S), + gen_tcp:close(LS), + {B1,B2,B3}. + +do_delay_send_5() -> + {ok,LS}=gen_tcp:listen(0,[]), + {ok,{{0,0,0,0},PortNum}}=inet:sockname(LS), + {ok,S}=gen_tcp:connect("localhost",PortNum,[{delay_send,false}]), + {ok,S2}= gen_tcp:accept(LS), + {ok,[{delay_send,B1}]}=inet:getopts(S,[delay_send]), + {ok,[{delay_send,B2}]}=inet:getopts(LS,[delay_send]), + {ok,[{delay_send,B3}]}=inet:getopts(S2,[delay_send]), + gen_tcp:close(S2), + gen_tcp:close(S), + gen_tcp:close(LS), + {B1,B2,B3}. + +do_delay_send_6() -> + {ok,LS}=gen_tcp:listen(0,[{delay_send,true}]), + {ok,{{0,0,0,0},PortNum}}=inet:sockname(LS), + {ok,S}=gen_tcp:connect("localhost",PortNum,[]), + {ok,S2}= gen_tcp:accept(LS), + {ok,[{delay_send,B1}]}=inet:getopts(S,[delay_send]), + {ok,[{delay_send,B2}]}=inet:getopts(LS,[delay_send]), + {ok,[{delay_send,B3}]}=inet:getopts(S2,[delay_send]), + gen_tcp:close(S2), + gen_tcp:close(S), + gen_tcp:close(LS), + {B1,B2,B3}. + +do_delay_send_7() -> + {ok,LS}=gen_tcp:listen(0,[]), + {ok,{{0,0,0,0},PortNum}}=inet:sockname(LS), + {ok,S}=gen_tcp:connect("localhost",PortNum,[]), + {ok,S2}= gen_tcp:accept(LS), + {ok,[{active,B1}]}=inet:getopts(S,[active]), + {ok,[{active,B2}]}=inet:getopts(LS,[active]), + {ok,[{active,B3}]}=inet:getopts(S2,[active]), + gen_tcp:close(S2), + gen_tcp:close(S), + gen_tcp:close(LS), + {B1,B2,B3}. + + + +controlling_process(doc) -> + ["Open a listen port and change controlling_process for it", + "The result should be ok of done by the owner process," + "Otherwise is should return {error,not_owner} or similar"]; +controlling_process(suite) -> []; +controlling_process(Config) when is_list(Config) -> + {ok,S} = gen_tcp:listen(0,[]), + Pid2 = spawn(?MODULE,not_owner,[S]), + Pid2 ! {self(),2,control}, + ?line {error, E} = receive {2,_E} -> + _E + after 10000 -> timeout + end, + io:format("received ~p~n",[E]), + Pid = spawn(?MODULE,not_owner,[S]), + ?line ok = gen_tcp:controlling_process(S,Pid), + Pid ! {self(),1,control}, + ?line ok = receive {1,ok} -> + ok + after 1000 -> timeout + end, + Pid ! close. + +not_owner(S) -> + receive + {From,Tag,control} -> + From ! {Tag,gen_tcp:controlling_process(S,self())}; + close -> + gen_tcp:close(S) + after 1000 -> + ok + end. + +no_accept(doc) -> + ["Open a listen port and connect to it, then close the listen port ", + "without doing any accept. The connected socket should receive ", + "a tcp_closed message."]; +no_accept(suite) -> []; +no_accept(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {skip,"Too tough for vxworks"}; + _ -> + no_accept2() + end. + +no_accept2() -> + ?line {ok, L} = gen_tcp:listen(0, []), + ?line {ok, {_, Port}} = inet:sockname(L), + ?line {ok, Client} = gen_tcp:connect(localhost, Port, []), + ?line ok = gen_tcp:close(L), + ?line receive + {tcp_closed, Client} -> + ok + after 5000 -> + ?line test_server:fail(never_closed) + + end. + +close_with_pending_output(doc) -> + ["Send several packets to a socket and close it. All packets should arrive ", + "to the other end."]; +close_with_pending_output(suite) -> []; +close_with_pending_output(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {skipped,"Too tough for vxworks"}; + _ -> + close_with_pending_output2() + end. + +close_with_pending_output2() -> + ?line {ok, L} = gen_tcp:listen(0, [binary, {active, false}]), + ?line {ok, {_, Port}} = inet:sockname(L), + ?line Packets = 16, + ?line Total = 2048*Packets, + case start_remote(close_pending) of + {ok, Node} -> + ?line {ok, Host} = inet:gethostname(), + ?line spawn_link(Node, ?MODULE, sender, [Port, Packets, Host]), + ?line {ok, A} = gen_tcp:accept(L), + ?line case gen_tcp:recv(A, Total) of + {ok, Bin} when byte_size(Bin) == Total -> + gen_tcp:close(A), + gen_tcp:close(L); + {ok, Bin} -> + ?line test_server:fail({small_packet, + byte_size(Bin)}); + Error -> + ?line test_server:fail({unexpected, Error}) + end, + ok; + {error, no_remote_hosts} -> + {skipped,"No remote hosts"}; + {error, Other} -> + ?line ?t:fail({failed_to_start_slave_node, Other}) + end. + +sender(Port, Packets, Host) -> + X256 = lists:seq(0, 255), + X512 = [X256|X256], + X1K = [X512|X512], + Bin = list_to_binary([X1K|X1K]), + {ok, Sock} = gen_tcp:connect(Host, Port, []), + send_loop(Sock, Bin, Packets), + ok = gen_tcp:close(Sock). + +send_loop(_Sock, _Data, 0) -> ok; +send_loop(Sock, Data, Left) -> + ok = gen_tcp:send(Sock, Data), + send_loop(Sock, Data, Left-1). + +-define(OTP_3924_MAX_DELAY, 100). +%% Taken out of the blue, but on intra host connections +%% I expect propagation of a close to be quite fast +%% so 100 ms seems reasonable. + +otp_3924(doc) -> + ["Tests that a socket can be closed fast enough."]; +otp_3924(suite) -> []; +otp_3924(Config) when is_list(Config) -> + MaxDelay = (case has_superfluous_schedulers() of + true -> 4; + false -> 1 + end + * case {erlang:system_info(debug_compiled), + erlang:system_info(lock_checking)} of + {true, _} -> 6; + {_, true} -> 2; + _ -> 1 + end * ?OTP_3924_MAX_DELAY), + case os:type() of + vxworks -> +%% {skip,"Too tough for vxworks"}; + otp_3924_1(MaxDelay); + _ -> + otp_3924_1(MaxDelay) + end. + +otp_3924_1(MaxDelay) -> + Dog = test_server:timetrap(test_server:seconds(240)), + ?line {ok, Node} = start_node(otp_3924), + ?line DataLen = 100*1024, + ?line Data = otp_3924_data(DataLen), + % Repeat the test a couple of times to prevent the test from passing + % by chance. + repeat(10, + fun (N) -> + ?line ok = otp_3924(MaxDelay, Node, Data, DataLen, N) + end), + ?line test_server:stop_node(Node), + test_server:timetrap_cancel(Dog), + ok. + +otp_3924(MaxDelay, Node, Data, DataLen, N) -> + ?line {ok, L} = gen_tcp:listen(0, [list, {active, false}]), + ?line {ok, {_, Port}} = inet:sockname(L), + ?line {ok, Host} = inet:gethostname(), + ?line Sender = spawn_link(Node, + ?MODULE, + otp_3924_sender, + [self(), Host, Port, Data]), + ?line Data = otp_3924_receive_data(L, Sender, MaxDelay, DataLen, N), + ?line ok = gen_tcp:close(L). + +otp_3924_receive_data(LSock, Sender, MaxDelay, Len, N) -> + ?line OP = process_flag(priority, max), + ?line OTE = process_flag(trap_exit, true), + ?line TimeoutRef = make_ref(), + ?line Data = (catch begin + ?line Sender ! start, + ?line {ok, Sock} = gen_tcp:accept(LSock), + ?line D = otp_3924_receive_data(Sock, + TimeoutRef, + MaxDelay, + Len, + [], + 0), + ?line ok = gen_tcp:close(Sock), + D + end), + ?line unlink(Sender), + ?line process_flag(trap_exit, OTE), + ?line process_flag(priority, OP), + receive + {'EXIT', _, TimeoutRef} -> + ?line test_server:fail({close_not_fast_enough,MaxDelay,N}); + {'EXIT', Sender, Reason} -> + ?line test_server:fail({sender_exited, Reason}); + {'EXIT', _Other, Reason} -> + ?line test_server:fail({linked_process_exited, Reason}) + after 0 -> + case Data of + {'EXIT', {A,B}} -> + ?line test_server:fail({A,B,N}); + {'EXIT', Failure} -> + ?line test_server:fail(Failure); + _ -> + ?line Data + end + end. + + +otp_3924_receive_data(Sock, TimeoutRef, MaxDelay, Len, Acc, AccLen) -> + case gen_tcp:recv(Sock, 0) of + {ok, Data} -> + NewAccLen = AccLen + length(Data), + if + NewAccLen == Len -> + ?line {ok, TRef} = timer:exit_after(MaxDelay, + self(), + TimeoutRef), + ?line {error, closed} = gen_tcp:recv(Sock, 0), + ?line timer:cancel(TRef), + ?line lists:flatten([Acc, Data]); + NewAccLen > Len -> + exit({received_too_much, NewAccLen}); + true -> + otp_3924_receive_data(Sock, + TimeoutRef, + MaxDelay, + Len, + [Acc, Data], + NewAccLen) + end; + {error, closed} -> + exit({premature_close, AccLen}); + Error -> + exit({unexpected_error, Error}) + end. + +otp_3924_data(Size) -> + Block = + "This is a sequence of characters that will be repeated " + "again and again and again and again and again and ... ", + L = length(Block), + otp_3924_data(Block, [], Size div L, Size rem L). + +otp_3924_data(_, Acc, 0, 0) -> + lists:flatten(Acc); +otp_3924_data(_, Acc, 0, SingleLeft) -> + otp_3924_data(false, ["."|Acc], 0, SingleLeft-1); +otp_3924_data(Block, Acc, BlockLeft, SingleLeft) -> + otp_3924_data(Block, [Block|Acc], BlockLeft-1, SingleLeft). + +otp_3924_sender(Receiver, Host, Port, Data) -> + receive + start -> + {ok, Sock} = gen_tcp:connect(Host, Port, [list]), + gen_tcp:send(Sock, Data), + ok = gen_tcp:close(Sock), + unlink(Receiver) + end. + + +data_before_close(doc) -> + ["Tests that a huge amount of data can be received before a close."]; +data_before_close(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {skip,"Too tough for vxworks"}; + _ -> + data_before_close2() + end. + +data_before_close2() -> + ?line {ok, L} = gen_tcp:listen(0, [binary]), + ?line {ok, {_, TcpPort}} = inet:sockname(L), + ?line Bytes = 256*1024, + ?line spawn_link(fun() -> huge_sender(TcpPort, Bytes) end), + ?line {ok, A} = gen_tcp:accept(L), + ?line case count_bytes_recv(A, 0) of + {Bytes, Result} -> + io:format("Result: ~p", [Result]); + {Wrong, Result} -> + io:format("Result: ~p", [Result]), + test_server:fail({wrong_count, Wrong}) + end, + ok. + +count_bytes_recv(Sock, Total) -> + receive + {tcp, Sock, Bin} -> + count_bytes_recv(Sock, Total+byte_size(Bin)); + Other -> + {Total, Other} + end. + +huge_sender(TcpPort, Bytes) -> + {ok, Client} = gen_tcp:connect(localhost, TcpPort, []), + receive after 500 -> ok end, + gen_tcp:send(Client, make_zero_packet(Bytes)), + gen_tcp:close(Client). + +make_zero_packet(0) -> []; +make_zero_packet(N) when N rem 2 == 0 -> + P = make_zero_packet(N div 2), + [P|P]; +make_zero_packet(N) -> + P = make_zero_packet(N div 2), + [0, P|P]. +get_status(doc) -> + ["OTP-2924", + "test that the socket process does not crash when sys:get_status(Pid)", + "is called."]; +get_status(suite) -> []; +get_status(Config) when is_list(Config) -> + ?line {ok,{socket,Pid,_,_}} = gen_tcp:listen(5678,[]), + ?line {status,Pid,_,_} = sys:get_status(Pid). + +iter_max_socks(doc) -> + ["Open as many sockets as possible. Do this several times and check ", + "that we get the same number of sockets every time."]; +iter_max_socks(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {skip,"Too tough for vxworks"}; + _ -> + iter_max_socks2() + end. + +-define(RECOVER_SLEEP, 60000). +-define(RETRY_SLEEP, 15000). + +iter_max_socks2() -> + ?line N = + case os:type() of + vxworks -> + 10; + _ -> + 20 + end, + L = do_iter_max_socks(N, initalize), + ?line io:format("Result: ~p",[L]), + ?line all_equal(L), + ?line {comment, "Max sockets: " ++ integer_to_list(hd(L))}. + +do_iter_max_socks(0, _) -> + []; +do_iter_max_socks(N, initalize) -> + MS = max_socks(), + [MS|do_iter_max_socks(N-1, MS)]; +do_iter_max_socks(N, failed) -> + MS = max_socks(), + [MS|do_iter_max_socks(N-1, failed)]; +do_iter_max_socks(N, First) when is_integer(First) -> + ?line MS = max_socks(), + if MS == First -> + ?line [MS|do_iter_max_socks(N-1, First)]; + true -> + ?line io:format("Sleeping for ~p seconds...~n", + [?RETRY_SLEEP/1000]), + ?line ?t:sleep(?RETRY_SLEEP), + ?line io:format("Trying again...~n", []), + ?line RetryMS = max_socks(), + ?line if RetryMS == First -> + ?line [RetryMS|do_iter_max_socks(N-1, First)]; + true -> + ?line [RetryMS|do_iter_max_socks(N-1, failed)] + end + end. + +all_equal([]) -> + ok; +all_equal([Rule | T]) -> + all_equal(Rule, T). + +all_equal(Rule, [Rule | T]) -> + all_equal(Rule, T); +all_equal(_, [_ | _]) -> + ?line ?t:sleep(?RECOVER_SLEEP), % Wait a while and *hope* that we'll + % recover so other tests won't be + % affected. + ?t:fail(max_socket_mismatch); +all_equal(_Rule, []) -> + ok. + +max_socks() -> + ?line Socks = open_socks(), + ?line N = length(Socks), + ?line lists:foreach(fun(S) -> ok = gen_tcp:close(S) end, Socks), + io:format("Got ~p sockets", [N]), + N. + +open_socks() -> + case gen_tcp:listen(0, []) of + {ok, L} -> + {ok, {_, Port}} = inet:sockname(L), + [L| connect_accept(L, Port)]; + _ -> + [] + end. + +connect_accept(L, Port) -> + case gen_tcp:connect(localhost, Port, []) of + {ok, C} -> + [C| do_accept(L, Port)]; + _ -> + [] + end. + +do_accept(L, Port) -> + case gen_tcp:accept(L) of + {ok, A} -> [A| connect_accept(L, Port)]; + _ -> [] + end. + +start_node(Name) -> + Pa = filename:dirname(code:which(?MODULE)), + test_server:start_node(Name, slave, [{args, "-pa " ++ Pa}]). + +start_remote(Name) -> + Pa = filename:dirname(code:which(?MODULE)), + test_server:start_node(Name, slave, [{remote, true}, {args, "-pa " ++ Pa}]). + +passive_sockets(doc) -> + ["Tests that when 'the other side' on a passive socket closes, the connecting", + "side still can read until the end of data."]; +passive_sockets(Config) when is_list(Config) -> + ?line spawn_link(?MODULE, passive_sockets_server, + [[{active,false}],self()]), + ?line receive + {socket,Port} -> ok + end, + ?t:sleep(500), + ?line case gen_tcp:connect("localhost", Port, [{active, false}]) of + {ok, Sock} -> + passive_sockets_read(Sock); + Error -> + ?t:fail({"Could not connect to server", Error}) + end. + +%% +%% Read until we get an {error, closed}. If we get another error, this test case +%% should fail. +%% +passive_sockets_read(Sock) -> + case gen_tcp:recv(Sock, 0, 2000) of + {ok, Data} -> + io:format("Received ~p bytes~n", [length(Data)]), + passive_sockets_read(Sock); + {error, closed} -> + gen_tcp:close(Sock); + Error -> + gen_tcp:close(Sock), + ?t:fail({"Did not get {error, closed} before other error", Error}) + end. + +passive_sockets_server(Opts, Parent) -> + ?line case gen_tcp:listen(0, Opts) of + {ok, LSock} -> + {ok,{_,Port}} = inet:sockname(LSock), + Parent ! {socket,Port}, + passive_sockets_server_accept(LSock); + Error -> + ?t:fail({"Could not create listen socket", Error}) + end. + +passive_sockets_server_accept(Sock) -> + ?line case gen_tcp:accept(Sock) of + {ok, Socket} -> + ?t:sleep(500), % Simulate latency + passive_sockets_server_send(Socket, 5), + passive_sockets_server_accept(Sock); + Error -> + ?t:fail({"Could not accept connection", Error}) + end. + +passive_sockets_server_send(Socket, 0) -> + io:format("Closing other end..~n", []), + gen_tcp:close(Socket); +passive_sockets_server_send(Socket, X) -> + ?line Data = lists:duplicate(1024*X, $a), + ?line case gen_tcp:send(Socket, Data) of + ok -> + ?t:sleep(50), % Simulate some processing. + passive_sockets_server_send(Socket, X-1); + {error, _Reason} -> + ?t:fail("Failed to send data") + end. + + +accept_closed_by_other_process(doc) -> + ["Tests the return value from gen_tcp:accept when ", + "the socket is closed from an other process. (OTP-3817)"]; +accept_closed_by_other_process(Config) when is_list(Config) -> + ?line Parent = self(), + ?line {ok, ListenSocket} = gen_tcp:listen(0, []), + ?line Child = + spawn_link( + fun() -> + Parent ! {self(), gen_tcp:accept(ListenSocket)} + end), + ?line receive after 1000 -> ok end, + ?line ok = gen_tcp:close(ListenSocket), + ?line receive + {Child, {error, closed}} -> + ok; + {Child, Other} -> + ?t:fail({"Wrong result of gen_tcp:accept", Other}) + end. + +repeat(N, Fun) -> + repeat(N, N, Fun). + +repeat(N, T, Fun) when is_integer(N), N > 0 -> + Fun(T-N), + repeat(N-1, T, Fun); +repeat(_, _, _) -> + ok. + + +closed_socket(suite) -> + []; +closed_socket(doc) -> + ["Tests the response when using a closed socket as argument"]; +closed_socket(Config) when is_list(Config) -> + ?line {ok, LS1} = gen_tcp:listen(0, []), + ?line erlang:yield(), + ?line ok = gen_tcp:close(LS1), + %% If the following delay is uncommented, the result error values + %% below will change from {error, einval} to {error, closed} since + %% inet_db then will have noticed that the socket is closed. + %% This is a scheduling issue, i.e when the gen_server in + %% in inet_db processes the 'EXIT' message from the port, + %% the socket is unregistered. + %% + %% ?line test_server:sleep(test_server:seconds(2)), + %% + ?line {error, R_send} = gen_tcp:send(LS1, "data"), + ?line {error, R_recv} = gen_tcp:recv(LS1, 17), + ?line {error, R_accept} = gen_tcp:accept(LS1), + ?line {error, R_controlling_process} = + gen_tcp:controlling_process(LS1, self()), + %% + ?line ok = io:format("R_send = ~p~n", [R_send]), + ?line ok = io:format("R_recv = ~p~n", [R_recv]), + ?line ok = io:format("R_accept = ~p~n", [R_accept]), + ?line ok = io:format("R_controlling_process = ~p~n", + [R_controlling_process]), + ok. + +%%% +%%% Test using the gen_tcp:shutdown/2 function using a sort server. +%%% + +shutdown_active(Config) when is_list(Config) -> + ?line shutdown_common(true). + +shutdown_passive(Config) when is_list(Config) -> + ?line shutdown_common(false). + +shutdown_common(Active) -> + ?line P = sort_server(Active), + io:format("Sort server port: ~p\n", [P]), + + ?line do_sort(P, []), + ?line do_sort(P, ["glurf"]), + ?line do_sort(P, ["abc","nisse","dum"]), + + ?line do_sort(P, [lists:reverse(integer_to_list(I)) || I <- lists:seq(25, 255)]), + ?line do_sort(P, [lists:reverse(integer_to_list(I)) || I <- lists:seq(77, 999)]), + ?line do_sort(P, [lists:reverse(integer_to_list(I)) || I <- lists:seq(25, 55)]), + ?line do_sort(P, []), + ?line do_sort(P, ["apa"]), + ?line do_sort(P, ["kluns","gorilla"]), + ?line do_sort(P, [lists:reverse(integer_to_list(I)) || I <- lists:seq(25, 1233)]), + ?line do_sort(P, []), + + receive + Any -> + ?t:fail({unexpected_message,Any}) + after 0 -> ok + end. + +do_sort(P, List0) -> + List = [El++"\n" || El <- List0], + {ok,S} = gen_tcp:connect(localhost, P, [{packet,line}]), + send_lines(S, List), + gen_tcp:shutdown(S, write), + Lines = collect_lines(S, true), + io:format("~p\n", [Lines]), + Lines = lists:sort(List), + ok = gen_tcp:close(S). + +sort_server(Active) -> + Opts = [{exit_on_close,false},{packet,line},{active,Active}], + ?line {ok,L} = gen_tcp:listen(0, Opts), + Go = make_ref(), + ?line Pid = spawn_link(fun() -> + receive Go -> sort_server_1(L, Active) end + end), + ?line ok = gen_tcp:controlling_process(L, Pid), + ?line Pid ! Go, + ?line {ok,Port} = inet:port(L), + Port. + +sort_server_1(L, Active) -> + {ok,S} = gen_tcp:accept(L), + Go = make_ref(), + Sorter = spawn(fun() -> receive Go -> sorter(S, Active) end end), + ok = gen_tcp:controlling_process(S, Sorter), + Sorter ! Go, + sort_server_1(L, Active). + +sorter(S, Active) -> + Lines = collect_lines(S, Active), + send_lines(S, lists:sort(Lines)), + gen_tcp:shutdown(S, write), + gen_tcp:close(S). + +collect_lines(S, true) -> + collect_lines_1(S, []); +collect_lines(S, false) -> + passive_collect_lines_1(S, []). + +collect_lines_1(S, Acc) -> + receive + {tcp,S,Line} -> collect_lines_1(S, [Line|Acc]); + {tcp_closed,S} -> lists:reverse(Acc) + end. + +passive_collect_lines_1(S, Acc) -> + case gen_tcp:recv(S, 0) of + {ok,Line} -> passive_collect_lines_1(S, [Line|Acc]); + {error,closed} -> lists:reverse(Acc) + end. + + +send_lines(S, Lines) -> + lists:foreach(fun(Line) -> + gen_tcp:send(S, Line) + end, Lines). + +%%% +%%% Shutdown pending. +%%% + +shutdown_pending(Config) when is_list(Config) -> + N = 512*1024+17, + io:format("~p\n", [N]), + Data = [<>,ones(N),42], + P = a_server(), + io:format("Server port: ~p\n", [P]), + ?line {ok,S} = gen_tcp:connect(localhost, P, []), + ?line gen_tcp:send(S, Data), + ?line gen_tcp:shutdown(S, write), + ?line receive + {tcp,S,Msg} -> + io:format("~p\n", [Msg]), + ?line N = list_to_integer(Msg) - 5; + Other -> + ?t:fail({unexpected,Other}) + end, + ok. + + ones(0) -> []; + ones(1) -> [1]; + ones(N) -> + Half = N div 2, + Ones = ones(Half), + case 2*Half of + N -> [Ones|Ones]; + _ -> [1,Ones|Ones] + end. + + a_server() -> + ?line {ok,L} = gen_tcp:listen(0, [{exit_on_close,false},{active,false}]), + ?line Pid = spawn_link(fun() -> a_server(L) end), + ?line ok = gen_tcp:controlling_process(L, Pid), + ?line {ok,Port} = inet:port(L), + Port. + + a_server(L) -> + {ok,S} = gen_tcp:accept(L), + do_recv(S, []). + + do_recv(S, Bs0) -> + case gen_tcp:recv(S, 0) of + {ok,B} -> + do_recv(S, [Bs0,B]); + {error,closed} -> + Bs = list_to_binary(Bs0), + gen_tcp:send(S, integer_to_list(byte_size(Bs))), + gen_tcp:close(S) + end. + + +%% Thanks to Luke Gorrie. Tests for a very specific problem with +%% corrupt data. The testcase will be killed by the timetrap timeout +%% if the bug is present. +http_bad_packet(Config) when is_list(Config) -> + ?line {ok,L} = gen_tcp:listen(0, + [{active, false}, + binary, + {reuseaddr, true}, + {packet, http}]), + ?line {ok,Port} = inet:port(L), + ?line spawn_link(fun() -> erlang:yield(), http_bad_client(Port) end), + ?line case gen_tcp:accept(L) of + {ok,S} -> + http_worker(S); + Err -> + exit({accept,Err}) + end. + +http_worker(S) -> + case gen_tcp:recv(S, 0, 30000) of + {ok,Data} -> + io:format("Data: ~p\n", [Data]), + http_worker(S); + {error,Rsn} -> + io:format("Error: ~p\n", [Rsn]), + ok + end. + +http_bad_client(Port) -> + {ok,S} = gen_tcp:connect("localhost", Port, [{active,false}, binary]), + ok = gen_tcp:send(S, "\r\n"), + ok = gen_tcp:close(S). + + +%% Fill send queue and then start receiving. +%% +busy_send(Config) when is_list(Config) -> + ?line Master = self(), + ?line Msg = <<"the quick brown fox jumps over a lazy dog~n">>, + ?line Server = + spawn_link(fun () -> + {ok,L} = gen_tcp:listen + (0, [{active,false},binary, + {reuseaddr,true},{packet,0}]), + {ok,Port} = inet:port(L), + Master ! {self(),client, + busy_send_client(Port, Master, Msg)}, + busy_send_srv(L, Master, Msg) + end), + ?line io:format("~p Server~n", [Server]), + ?line receive + {Server,client,Client} -> + ?line io:format("~p Client~n", [Client]), + ?line busy_send_loop(Server, Client, 0) + end. + +busy_send_loop(Server, Client, N) -> + %% Master + %% + ?line receive {Server,send} -> + busy_send_loop(Server, Client, N+1) + after 2000 -> + %% Send queue full, sender blocked + %% -> stop sender and release client + ?line io:format("Send timeout, time to receive...~n", []), + ?line Server ! {self(),close}, + ?line Client ! {self(),recv,N+1}, + ?line receive + {Server,send} -> + ?line busy_send_2(Server, Client, N+1) + after 10000 -> + ?t:fail({timeout,{server,not_send,flush([])}}) + end + end. + +busy_send_2(Server, Client, _N) -> + %% Master + %% + ?line receive + {Server,[closed]} -> + ?line receive + {Client,[0,{error,closed}]} -> + ok + end + after 10000 -> + ?t:fail({timeout,{server,not_closed,flush([])}}) + end. + +busy_send_srv(L, Master, Msg) -> + %% Server + %% + {ok,Socket} = gen_tcp:accept(L), + busy_send_srv_loop(Socket, Master, Msg). + +busy_send_srv_loop(Socket, Master, Msg) -> + %% Server + %% + receive + {Master,close} -> + ok = gen_tcp:close(Socket), + Master ! {self(),flush([closed])} + after 0 -> + ok = gen_tcp:send(Socket, Msg), + Master ! {self(),send}, + busy_send_srv_loop(Socket, Master, Msg) + end. + +busy_send_client(Port, Master, Msg) -> + %% Client + %% + spawn_link( + fun () -> + {ok,Socket} = gen_tcp:connect( + "localhost", Port, + [{active,false},binary,{packet,0}]), + receive + {Master,recv, N} -> + busy_send_client_loop(Socket, Master, Msg, N) + end + end). + +busy_send_client_loop(Socket, Master, Msg, N) -> + %% Client + %% + Size = byte_size(Msg), + case gen_tcp:recv(Socket, Size) of + {ok,Msg} -> + busy_send_client_loop(Socket, Master, Msg, N-1); + Other -> + Master ! {self(),flush([Other,N])} + end. + +%%% +%%% Send to a socket whose other end does not read until the port gets busy. +%%% Then close the other end. The writer should get an {error,closed} error. +%%% (Passive mode.) +%%% + +busy_disconnect_passive(Config) when is_list(Config) -> + MuchoData = list_to_binary(ones(64*1024)), + ?line [do_busy_disconnect_passive(MuchoData) || _ <- lists:seq(1, 10)], + ok. + +do_busy_disconnect_passive(MuchoData) -> + S = busy_disconnect_prepare_server([{active,false}]), + busy_disconnect_passive_send(S, MuchoData). + +busy_disconnect_passive_send(S, Data) -> + ?line case gen_tcp:send(S, Data) of + ok -> ?line busy_disconnect_passive_send(S, Data); + {error,closed} -> ok + end. + +%%% +%%% Send to a socket whose other end does not read until the port gets busy. +%%% Then close the other end. The writer should get an {error,closed} error and +%%% a {tcp_closed,Socket} message. (Active mode.) +%%% +busy_disconnect_active(Config) when is_list(Config) -> + MuchoData = list_to_binary(ones(64*1024)), + ?line [do_busy_disconnect_active(MuchoData) || _ <- lists:seq(1, 10)], + ok. + +do_busy_disconnect_active(MuchoData) -> + S = busy_disconnect_prepare_server([{active,true}]), + busy_disconnect_active_send(S, MuchoData). + +busy_disconnect_active_send(S, Data) -> + ?line case gen_tcp:send(S, Data) of + ok -> ?line busy_disconnect_active_send(S, Data); + {error,closed} -> + receive + {tcp_closed,S} -> ok; + _Other -> ?line ?t:fail() + end + end. + + +busy_disconnect_prepare_server(ConnectOpts) -> + ?line Sender = self(), + ?line Server = spawn_link(fun() -> busy_disconnect_server(Sender) end), + receive {port,Server,Port} -> ok end, + ?line {ok,S} = gen_tcp:connect(localhost, Port, ConnectOpts), + Server ! {Sender,sending}, + S. + +busy_disconnect_server(Sender) -> + {ok,L} = gen_tcp:listen(0, [{active,false},binary,{reuseaddr,true},{packet,0}]), + {ok,Port} = inet:port(L), + Sender ! {port,self(),Port}, + {ok,S} = gen_tcp:accept(L), + receive + {Sender,sending} -> + busy_disconnect_server_wait_for_busy(Sender, S) + end. + +%% Close the socket as soon as the Sender process can't send because of +%% a busy port. +busy_disconnect_server_wait_for_busy(Sender, S) -> + case process_info(Sender, status) of + {status,waiting} -> + %% We KNOW that the sender will be in state 'waiting' only + %% if the port has become busy. (Fallback solution if the + %% implementation changes: Watch Sender's reduction count; + %% when it stops changing, wait 2 seconds and then close.) + gen_tcp:close(S); + _Other -> + io:format("~p\n", [_Other]), + timer:sleep(100), + busy_disconnect_server_wait_for_busy(Sender, S) + end. + +%%% +%%% Fill send queue +%%% +fill_sendq(Config) when is_list(Config) -> + ?line Master = self(), + ?line Server = + spawn_link(fun () -> + {ok,L} = gen_tcp:listen + (0, [{active,false},binary, + {reuseaddr,true},{packet,0}]), + {ok,Port} = inet:port(L), + Master ! {self(),client, + fill_sendq_client(Port, Master)}, + fill_sendq_srv(L, Master) + end), + ?line io:format("~p Server~n", [Server]), + ?line receive {Server,client,Client} -> + ?line io:format("~p Client~n", [Client]), + ?line receive {Server,reader,Reader} -> + ?line io:format("~p Reader~n", [Reader]), + ?line fill_sendq_loop(Server, Client, Reader) + end + end. + +fill_sendq_loop(Server, Client, Reader) -> + %% Master + %% + receive {Server,send} -> + fill_sendq_loop(Server, Client, Reader) + after 2000 -> + %% Send queue full, sender blocked -> close client. + ?line io:format("Send timeout, closing Client...~n", []), + ?line Client ! {self(),close}, + ?line receive {Server,[{error,closed}]} -> + ?line io:format("Got server closed.~n"), + ?line receive {Reader,[{error,closed}]} -> + ?line io:format + ("Got reader closed.~n"), + ok + after 3000 -> + ?t:fail({timeout,{closed,reader}}) + end; + {Reader,[{error,closed}]} -> + ?line io:format("Got reader closed.~n"), + ?line receive {Server,[{error,closed}]} -> + ?line io:format("Got server closed~n"), + ok + after 3000 -> + ?t:fail({timeout,{closed,server}}) + end + after 3000 -> + ?t:fail({timeout,{closed,[server,reader]}}) + end + end. + +fill_sendq_srv(L, Master) -> + %% Server + %% + case gen_tcp:accept(L) of + {ok,S} -> + Master ! {self(),reader, + spawn_link(fun () -> fill_sendq_read(S, Master) end)}, + Msg = "the quick brown fox jumps over a lazy dog~n", + fill_sendq_write(S, Master, [Msg,Msg,Msg,Msg,Msg,Msg,Msg,Msg]); + Error -> + io:format("~p error: ~p.~n", [self(),Error]), + Master ! {self(),flush([Error])} + end. + +fill_sendq_write(S, Master, Msg) -> + %% Server + %% + %%io:format("~p sending...~n", [self()]), + Master ! {self(),send}, + case gen_tcp:send(S, Msg) of + ok -> + %%io:format("~p ok.~n", [self()]), + fill_sendq_write(S, Master, Msg); + E -> + Error = flush([E]), + io:format("~p error: ~p.~n", [self(),Error]), + Master ! {self(),Error} + end. + +fill_sendq_read(S, Master) -> + %% Reader + %% + io:format("~p read infinity...~n", [self()]), + case gen_tcp:recv(S, 0, infinity) of + {ok,Data} -> + io:format("~p got: ~p.~n", [self(),Data]), + fill_sendq_read(S, Master); + E -> + Error = flush([E]), + io:format("~p error: ~p.~n", [self(),Error]), + Master ! {self(),Error} + end. + +fill_sendq_client(Port, Master) -> + %% Client + %% + spawn_link(fun () -> + %% Just close on order + {ok,S} = gen_tcp:connect( + "localhost", Port, + [{active,false},binary,{packet,0}]), + receive + {Master,close} -> + ok = gen_tcp:close(S) + end + end). + +%%% Try to receive more than available number of bytes from +%%% a closed socket. +%%% +partial_recv_and_close(Config) when is_list(Config) -> + ?line Msg = "the quick brown fox jumps over a lazy dog 0123456789\n", + ?line Len = length(Msg), + ?line {ok,L} = gen_tcp:listen(0, [{active,false}]), + ?line {ok,P} = inet:port(L), + ?line {ok,S} = gen_tcp:connect("localhost", P, [{active,false}]), + ?line {ok,A} = gen_tcp:accept(L), + ?line ok = gen_tcp:send(S, Msg), + ?line ok = gen_tcp:close(S), + ?line {error,closed} = gen_tcp:recv(A, Len+1), + ok. + +%%% Try to receive more than available number of bytes from +%%% a closed socket, this time waiting in the recv before closing. +%%% +partial_recv_and_close_2(Config) when is_list(Config) -> + ?line Msg = "the quick brown fox jumps over a lazy dog 0123456789\n", + ?line Len = length(Msg), + ?line {ok,L} = gen_tcp:listen(0, [{active,false}]), + ?line {ok,P} = inet:port(L), + ?line Server = self(), + ?line Client = + spawn_link( + fun () -> + receive after 2000 -> ok end, + {ok,S} = gen_tcp:connect("localhost", P, [{active,false}]), + ?line ok = gen_tcp:send(S, Msg), + receive {Server,close} -> ok end, + receive after 2000 -> ok end, + ?line ok = gen_tcp:close(S) + end), + ?line {ok,A} = gen_tcp:accept(L), + ?line Client ! {Server,close}, + ?line {error,closed} = gen_tcp:recv(A, Len+1), + ok. + +%%% Here we tests that gen_tcp:recv/2 will return {error,closed} following +%%% a send operation of a huge amount data when the other end closed the socket. +%%% +partial_recv_and_close_3(Config) when is_list(Config) -> + [do_partial_recv_and_close_3() || _ <- lists:seq(0, 20)], + ok. + +do_partial_recv_and_close_3() -> + Parent = self(), + spawn_link(fun() -> + {ok,L} = gen_tcp:listen(0, [{active,false}]), + {ok,{_,Port}} = inet:sockname(L), + Parent ! {port,Port}, + {ok,S} = gen_tcp:accept(L), + gen_tcp:recv(S, 1), + gen_tcp:close(S) + end), + receive + {port,Port} -> ok + end, + ?line Much = ones(8*64*1024), + ?line {ok,S} = gen_tcp:connect(localhost, Port, [{active,false}]), + + %% Send a lot of data (most of it will be queued). The receiver will read one byte + %% and close the connection. The write operation will fail. + ?line gen_tcp:send(S, Much), + + %% We should always get {error,closed} here. + ?line {error,closed} = gen_tcp:recv(S, 0). + + +test_prio_put_get() -> + Tos = 3 bsl 5, + ?line {ok,L1} = gen_tcp:listen(0, [{active,false}]), + ?line ok = inet:setopts(L1,[{priority,3}]), + ?line ok = inet:setopts(L1,[{tos,Tos}]), + ?line {ok,[{priority,3},{tos,Tos}]} = inet:getopts(L1,[priority,tos]), + ?line ok = inet:setopts(L1,[{priority,3}]), % Dont destroy each other + ?line {ok,[{priority,3},{tos,Tos}]} = inet:getopts(L1,[priority,tos]), + ?line ok = inet:setopts(L1,[{reuseaddr,true}]), % Dont let others destroy + ?line {ok,[{priority,3},{tos,Tos}]} = inet:getopts(L1,[priority,tos]), + ?line gen_tcp:close(L1), + ok. +test_prio_accept() -> + ?line {ok,Sock}=gen_tcp:listen(0,[binary,{packet,0},{active,false}, + {reuseaddr,true},{priority,4}]), + ?line {ok,Port} = inet:port(Sock), + ?line {ok,Sock2}=gen_tcp:connect("localhost",Port,[binary,{packet,0}, + {active,false}, + {reuseaddr,true}, + {priority,4}]), + ?line {ok,Sock3}=gen_tcp:accept(Sock), + ?line {ok,[{priority,4}]} = inet:getopts(Sock,[priority]), + ?line {ok,[{priority,4}]} = inet:getopts(Sock2,[priority]), + ?line {ok,[{priority,4}]} = inet:getopts(Sock3,[priority]), + ?line gen_tcp:close(Sock), + ?line gen_tcp:close(Sock2), + ?line gen_tcp:close(Sock3), + ok. + +test_prio_accept2() -> + Tos1 = 4 bsl 5, + Tos2 = 3 bsl 5, + ?line {ok,Sock}=gen_tcp:listen(0,[binary,{packet,0},{active,false}, + {reuseaddr,true},{priority,4}, + {tos,Tos1}]), + ?line {ok,Port} = inet:port(Sock), + ?line {ok,Sock2}=gen_tcp:connect("localhost",Port,[binary,{packet,0}, + {active,false}, + {reuseaddr,true}, + {priority,4}, + {tos,Tos2}]), + ?line {ok,Sock3}=gen_tcp:accept(Sock), + ?line {ok,[{priority,4},{tos,Tos1}]} = inet:getopts(Sock,[priority,tos]), + ?line {ok,[{priority,4},{tos,Tos2}]} = inet:getopts(Sock2,[priority,tos]), + ?line {ok,[{priority,4},{tos,Tos1}]} = inet:getopts(Sock3,[priority,tos]), + ?line gen_tcp:close(Sock), + ?line gen_tcp:close(Sock2), + ?line gen_tcp:close(Sock3), + ok. + +test_prio_accept3() -> + Tos1 = 4 bsl 5, + Tos2 = 3 bsl 5, + ?line {ok,Sock}=gen_tcp:listen(0,[binary,{packet,0},{active,false}, + {reuseaddr,true}, + {tos,Tos1}]), + ?line {ok,Port} = inet:port(Sock), + ?line {ok,Sock2}=gen_tcp:connect("localhost",Port,[binary,{packet,0}, + {active,false}, + {reuseaddr,true}, + {tos,Tos2}]), + ?line {ok,Sock3}=gen_tcp:accept(Sock), + ?line {ok,[{priority,0},{tos,Tos1}]} = inet:getopts(Sock,[priority,tos]), + ?line {ok,[{priority,0},{tos,Tos2}]} = inet:getopts(Sock2,[priority,tos]), + ?line {ok,[{priority,0},{tos,Tos1}]} = inet:getopts(Sock3,[priority,tos]), + ?line gen_tcp:close(Sock), + ?line gen_tcp:close(Sock2), + ?line gen_tcp:close(Sock3), + ok. + +test_prio_accept_async() -> + Tos1 = 4 bsl 5, + Tos2 = 3 bsl 5, + Ref = make_ref(), + ?line spawn(?MODULE,priority_server,[{self(),Ref}]), + ?line Port = receive + {Ref,P} -> P + after 5000 -> ?t:fail({error,"helper process timeout"}) + end, + ?line receive + after 3000 -> ok + end, + ?line {ok,Sock2}=gen_tcp:connect("localhost",Port,[binary,{packet,0}, + {active,false}, + {reuseaddr,true}, + {priority,4}, + {tos,Tos2}]), + ?line receive + {Ref,{ok,[{priority,4},{tos,Tos1}]}} -> + ok ; + {Ref,Error} -> + ?t:fail({missmatch,Error}) + after 5000 -> ?t:fail({error,"helper process timeout"}) + end, + ?line receive + {Ref,{ok,[{priority,4},{tos,Tos1}]}} -> + ok ; + {Ref,Error2} -> + ?t:fail({missmatch,Error2}) + after 5000 -> ?t:fail({error,"helper process timeout"}) + end, + + ?line {ok,[{priority,4},{tos,Tos2}]} = inet:getopts(Sock2,[priority,tos]), + ?line catch gen_tcp:close(Sock2), + ok. + +priority_server({Parent,Ref}) -> + Tos1 = 4 bsl 5, + ?line {ok,Sock}=gen_tcp:listen(0,[binary,{packet,0},{active,false}, + {reuseaddr,true},{priority,4}, + {tos,Tos1}]), + ?line {ok,Port} = inet:port(Sock), + Parent ! {Ref,Port}, + ?line {ok,Sock3}=gen_tcp:accept(Sock), + Parent ! {Ref, inet:getopts(Sock,[priority,tos])}, + Parent ! {Ref, inet:getopts(Sock3,[priority,tos])}, + ok. + +test_prio_fail() -> + ?line {ok,L} = gen_tcp:listen(0, [{active,false}]), + ?line {error,_} = inet:setopts(L,[{priority,1000}]), +% This error could only happen in linux kernels earlier than 2.6.24.4 +% Privilege check is now disabled and IP_TOS can never fail (only silently +% be masked). +% ?line {error,_} = inet:setopts(L,[{tos,6 bsl 5}]), + ?line gen_tcp:close(L), + ok. + +test_prio_udp() -> + Tos = 3 bsl 5, + ?line {ok,S} = gen_udp:open(0,[{active,false},binary,{tos, Tos}, + {priority,3}]), + ?line {ok,[{priority,3},{tos,Tos}]} = inet:getopts(S,[priority,tos]), + ?line gen_udp:close(S), + ok. + +so_priority(doc) -> + ["Tests the so_priority and ip_tos options on sockets when applicable."]; +so_priority(suite) -> + []; +so_priority(Config) when is_list(Config) -> + ?line {ok,L} = gen_tcp:listen(0, [{active,false}]), + ?line ok = inet:setopts(L,[{priority,1}]), + ?line case inet:getopts(L,[priority]) of + {ok,[{priority,1}]} -> + gen_tcp:close(L), + test_prio_put_get(), + test_prio_accept(), + test_prio_accept2(), + test_prio_accept3(), + test_prio_accept_async(), + test_prio_fail(), + test_prio_udp(), + ok; + _ -> + case os:type() of + {unix,linux} -> + case os:version() of + {X,Y,_} when (X > 2) or ((X =:= 2) and (Y >= 4)) -> + ?line ?t:fail({error, + "so_priority should work on this " + "OS, but does not"}); + _ -> + {skip, "SO_PRIORITY not suppoorted"} + end; + _ -> + {skip, "SO_PRIORITY not suppoorted"} + end + end. + +%% Accept test utilities (suites are below) + +millis() -> + {A,B,C}=erlang:now(), + (A*1000000*1000)+(B*1000)+(C div 1000). + +collect_accepts(Tmo) -> + A = millis(), + receive + {accepted,P,Msg} -> + [{P,Msg}] ++ collect_accepts(Tmo-(millis() - A)) + after Tmo -> + [] + end. + +-define(EXPECT_ACCEPTS(Pattern,Timeout), + (fun() -> + case collect_accepts(Timeout) of + Pattern -> + ok; + Other -> + {error,{unexpected,{Other,process_info(self(),messages)}}} + end + end)()). + +collect_connects(Tmo) -> + A = millis(), + receive + {connected,P,Msg} -> + [{P,Msg}] ++ collect_connects(Tmo-(millis() - A)) + after Tmo -> + [] + end. + +-define(EXPECT_CONNECTS(Pattern,Timeout), + (fun() -> + case collect_connects(Timeout) of + Pattern -> + ok; + Other -> + {error,{unexpected,Other}} + end + end)()). + +mktmofun(Tmo,Parent,LS) -> + fun() -> Parent ! {accepted,self(), catch gen_tcp:accept(LS,Tmo)} end. + +%% Accept tests +primitive_accept(suite) -> + []; +primitive_accept(doc) -> + ["Test singular accept"]; +primitive_accept(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line {ok,PortNo}=inet:port(LS), + ?line Parent = self(), + ?line F = fun() -> Parent ! {accepted,self(),gen_tcp:accept(LS)} end, + ?line P = spawn(F), + ?line gen_tcp:connect("localhost",PortNo,[]), + ?line receive + {accepted,P,{ok,P0}} when is_port(P0) -> + ok; + {accepted,P,Other0} -> + {error,Other0} + after 500 -> + {error,timeout} + end. + + +multi_accept_close_listen(suite) -> + []; +multi_accept_close_listen(doc) -> + ["Closing listen socket when multi-accepting"]; +multi_accept_close_listen(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line Parent = self(), + ?line F = fun() -> Parent ! {accepted,self(),gen_tcp:accept(LS)} end, + ?line spawn(F), + ?line spawn(F), + ?line spawn(F), + ?line spawn(F), + ?line gen_tcp:close(LS), + ?line ?EXPECT_ACCEPTS([{_,{error,closed}},{_,{error,closed}}, + {_,{error,closed}},{_,{error,closed}}], 500). + +accept_timeout(suite) -> + []; +accept_timeout(doc) -> + ["Single accept with timeout"]; +accept_timeout(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line Parent = self(), + ?line F = fun() -> Parent ! {accepted,self(),gen_tcp:accept(LS,1000)} end, + ?line P = spawn(F), + ?line ?EXPECT_ACCEPTS([{P,{error,timeout}}],2000). + +accept_timeouts_in_order(suite) -> + []; +accept_timeouts_in_order(doc) -> + ["Check that multi-accept timeouts happen in the correct order"]; +accept_timeouts_in_order(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line Parent = self(), + ?line P1 = spawn(mktmofun(1000,Parent,LS)), + ?line P2 = spawn(mktmofun(1200,Parent,LS)), + ?line P3 = spawn(mktmofun(1300,Parent,LS)), + ?line P4 = spawn(mktmofun(1400,Parent,LS)), + ?line ?EXPECT_ACCEPTS([{P1,{error,timeout}},{P2,{error,timeout}}, + {P3,{error,timeout}},{P4,{error,timeout}}], 2000). + +accept_timeouts_in_order2(suite) -> + []; +accept_timeouts_in_order2(doc) -> + ["Check that multi-accept timeouts happen in the correct order (more)"]; +accept_timeouts_in_order2(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line Parent = self(), + ?line P1 = spawn(mktmofun(1400,Parent,LS)), + ?line P2 = spawn(mktmofun(1300,Parent,LS)), + ?line P3 = spawn(mktmofun(1200,Parent,LS)), + ?line P4 = spawn(mktmofun(1000,Parent,LS)), + ?line ?EXPECT_ACCEPTS([{P4,{error,timeout}},{P3,{error,timeout}}, + {P2,{error,timeout}},{P1,{error,timeout}}], 2000). + +accept_timeouts_in_order3(suite) -> + []; +accept_timeouts_in_order3(doc) -> + ["Check that multi-accept timeouts happen in the correct order (even more)"]; +accept_timeouts_in_order3(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line Parent = self(), + ?line P1 = spawn(mktmofun(1200,Parent,LS)), + ?line P2 = spawn(mktmofun(1400,Parent,LS)), + ?line P3 = spawn(mktmofun(1300,Parent,LS)), + ?line P4 = spawn(mktmofun(1000,Parent,LS)), + ?line ?EXPECT_ACCEPTS([{P4,{error,timeout}},{P1,{error,timeout}}, + {P3,{error,timeout}},{P2,{error,timeout}}], 2000). + +accept_timeouts_mixed(suite) -> + []; +accept_timeouts_mixed(doc) -> + ["Check that multi-accept timeouts behave correctly when mixed with successful timeouts"]; +accept_timeouts_mixed(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line Parent = self(), + ?line {ok,PortNo}=inet:port(LS), + ?line P1 = spawn(mktmofun(1000,Parent,LS)), + ?line wait_until_accepting(P1,500), + ?line P2 = spawn(mktmofun(2000,Parent,LS)), + ?line wait_until_accepting(P2,500), + ?line P3 = spawn(mktmofun(3000,Parent,LS)), + ?line wait_until_accepting(P3,500), + ?line P4 = spawn(mktmofun(4000,Parent,LS)), + ?line wait_until_accepting(P4,500), + ?line ok = ?EXPECT_ACCEPTS([{P1,{error,timeout}}],1500), + ?line {ok,_}=gen_tcp:connect("localhost",PortNo,[]), + ?line ok = ?EXPECT_ACCEPTS([{P2,{ok,Port0}}] when is_port(Port0),100), + ?line ok = ?EXPECT_ACCEPTS([{P3,{error,timeout}}],2000), + ?line gen_tcp:connect("localhost",PortNo,[]), + ?line ?EXPECT_ACCEPTS([{P4,{ok,Port1}}] when is_port(Port1),100). + +killing_acceptor(suite) -> + []; +killing_acceptor(doc) -> + ["Check that single acceptor behaves as expected when killed"]; +killing_acceptor(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line Pid = spawn(fun() -> erlang:display({accepted,self(),gen_tcp:accept(LS)}) end), + ?line receive after 100 -> + ok + end, + ?line {ok,L1} = prim_inet:getstatus(LS), + ?line true = lists:member(accepting, L1), + ?line exit(Pid,kill), + ?line receive after 100 -> + ok + end, + ?line {ok,L2} = prim_inet:getstatus(LS), + ?line false = lists:member(accepting, L2), + ok. + +killing_multi_acceptors(suite) -> + []; +killing_multi_acceptors(doc) -> + ["Check that multi acceptors behaves as expected when killed"]; +killing_multi_acceptors(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line Parent = self(), + ?line F = fun() -> Parent ! {accepted,self(),gen_tcp:accept(LS)} end, + ?line F2 = mktmofun(1000,Parent,LS), + ?line Pid = spawn(F), + ?line Pid2 = spawn(F2), + ?line receive after 100 -> + ok + end, + ?line {ok,L1} = prim_inet:getstatus(LS), + ?line true = lists:member(accepting, L1), + ?line exit(Pid,kill), + ?line receive after 100 -> + ok + end, + ?line {ok,L2} = prim_inet:getstatus(LS), + ?line true = lists:member(accepting, L2), + ?line ok = ?EXPECT_ACCEPTS([{Pid2,{error,timeout}}],1000), + ?line {ok,L3} = prim_inet:getstatus(LS), + ?line false = lists:member(accepting, L3), + ok. + +killing_multi_acceptors2(suite) -> + []; +killing_multi_acceptors2(doc) -> + ["Check that multi acceptors behaves as expected when killed (more)"]; +killing_multi_acceptors2(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line Parent = self(), + ?line {ok,PortNo}=inet:port(LS), + ?line F = fun() -> Parent ! {accepted,self(),gen_tcp:accept(LS)} end, + ?line F2 = mktmofun(1000,Parent,LS), + ?line Pid = spawn(F), + ?line Pid2 = spawn(F), + ?line receive after 100 -> + ok + end, + ?line {ok,L1} = prim_inet:getstatus(LS), + ?line true = lists:member(accepting, L1), + ?line exit(Pid,kill), + ?line receive after 100 -> + ok + end, + ?line {ok,L2} = prim_inet:getstatus(LS), + ?line true = lists:member(accepting, L2), + ?line exit(Pid2,kill), + ?line receive after 100 -> + ok + end, + ?line {ok,L3} = prim_inet:getstatus(LS), + ?line false = lists:member(accepting, L3), + ?line Pid3 = spawn(F2), + ?line receive after 100 -> + ok + end, + ?line {ok,L4} = prim_inet:getstatus(LS), + ?line true = lists:member(accepting, L4), + ?line gen_tcp:connect("localhost",PortNo,[]), + ?line ok = ?EXPECT_ACCEPTS([{Pid3,{ok,Port}}] when is_port(Port),100), + ?line {ok,L5} = prim_inet:getstatus(LS), + ?line false = lists:member(accepting, L5), + ok. + +several_accepts_in_one_go(suite) -> + []; +several_accepts_in_one_go(doc) -> + ["checks that multi-accept works when more than one accept can be " + "done at once (wb test of inet_driver)"]; +several_accepts_in_one_go(Config) when is_list(Config) -> + ?line {ok,LS}=gen_tcp:listen(0,[]), + ?line Parent = self(), + ?line {ok,PortNo}=inet:port(LS), + ?line F1 = fun() -> Parent ! {accepted,self(),gen_tcp:accept(LS)} end, + ?line F2 = fun() -> Parent ! {connected,self(),gen_tcp:connect("localhost",PortNo,[])} end, + ?line spawn(F1), + ?line spawn(F1), + ?line spawn(F1), + ?line spawn(F1), + ?line spawn(F1), + ?line spawn(F1), + ?line spawn(F1), + ?line spawn(F1), + ?line ok = ?EXPECT_ACCEPTS([],500), + ?line spawn(F2), + ?line spawn(F2), + ?line spawn(F2), + ?line spawn(F2), + ?line spawn(F2), + ?line spawn(F2), + ?line spawn(F2), + ?line spawn(F2), + ?line ok = ?EXPECT_ACCEPTS([{_,{ok,_}},{_,{ok,_}},{_,{ok,_}},{_,{ok,_}},{_,{ok,_}},{_,{ok,_}},{_,{ok,_}},{_,{ok,_}}],15000), + ?line ok = ?EXPECT_CONNECTS([{_,{ok,_}},{_,{ok,_}},{_,{ok,_}},{_,{ok,_}},{_,{ok,_}},{_,{ok,_}},{_,{ok,_}},{_,{ok,_}}],1000), + ok. + + +flush(Msgs) -> + erlang:yield(), + receive Msg -> flush([Msg|Msgs]) + after 0 -> lists:reverse(Msgs) + end. + +wait_until_accepting(Proc,0) -> + exit({timeout_waiting_for_accepting,Proc}); +wait_until_accepting(Proc,N) -> + case process_info(Proc,current_function) of + {current_function,{prim_inet,accept0,2}} -> + case process_info(Proc,status) of + {status,waiting} -> + ok; + _O1 -> + receive + after 5 -> + wait_until_accepting(Proc,N-1) + end + end; + _O2 -> + receive + after 5 -> + wait_until_accepting(Proc,N-1) + end + end. + + + +active_once_closed(suite) -> + []; +active_once_closed(doc) -> + ["Check that active once and tcp_close messages behave as expected"]; +active_once_closed(Config) when is_list(Config) -> + (fun() -> + ?line {Loop,A} = setup_closed_ao(), + ?line Loop({{error,closed},{error,econnaborted}}, + fun() -> gen_tcp:send(A,"Hello") end), + ?line ok = inet:setopts(A,[{active,once}]), + ?line ok = receive {tcp_closed, A} -> ok after 1000 -> error end, + ?line {error,einval} = inet:setopts(A,[{active,once}]), + ?line ok = receive {tcp_closed, A} -> error after 1000 -> ok end + end)(), + (fun() -> + ?line {Loop,A} = setup_closed_ao(), + ?line Loop({{error,closed},{error,econnaborted}}, + fun() -> gen_tcp:send(A,"Hello") end), + ?line ok = inet:setopts(A,[{active,true}]), + ?line ok = receive {tcp_closed, A} -> ok after 1000 -> error end, + ?line {error,einval} = inet:setopts(A,[{active,true}]), + ?line ok = receive {tcp_closed, A} -> error after 1000 -> ok end + end)(), + (fun() -> + ?line {Loop,A} = setup_closed_ao(), + ?line Loop({{error,closed},{error,econnaborted}}, + fun() -> gen_tcp:send(A,"Hello") end), + ?line ok = inet:setopts(A,[{active,true}]), + ?line ok = receive {tcp_closed, A} -> ok after 1000 -> error end, + ?line {error,einval} = inet:setopts(A,[{active,once}]), + ?line ok = receive {tcp_closed, A} -> error after 1000 -> ok end + end)(), + (fun() -> + ?line {Loop,A} = setup_closed_ao(), + ?line Loop({{error,closed},{error,econnaborted}}, + fun() -> gen_tcp:send(A,"Hello") end), + ?line ok = inet:setopts(A,[{active,once}]), + ?line ok = receive {tcp_closed, A} -> ok after 1000 -> error end, + ?line {error,einval} = inet:setopts(A,[{active,true}]), + ?line ok = receive {tcp_closed, A} -> error after 1000 -> ok end + end)(), + (fun() -> + ?line {Loop,A} = setup_closed_ao(), + ?line Loop({{error,closed},{error,econnaborted}}, + fun() -> gen_tcp:send(A,"Hello") end), + ?line ok = inet:setopts(A,[{active,false}]), + ?line ok = receive {tcp_closed, A} -> error after 1000 -> ok end, + ?line ok = inet:setopts(A,[{active,once}]), + ?line ok = receive {tcp_closed, A} -> ok after 1000 -> error end + end)(). + +send_timeout(suite) -> + []; +send_timeout(doc) -> + ["Test the send_timeout socket option"]; +send_timeout(Config) when is_list(Config) -> + %% Basic + BasicFun = + fun(AutoClose) -> + ?line {Loop,A,RNode} = setup_timeout_sink(1000, AutoClose), + ?line {error,timeout} = + Loop(fun() -> + Res = gen_tcp:send(A,<<1:10000>>), + %%erlang:display(Res), + Res + end), + %% Check that the socket is not busy/closed... + Error = after_send_timeout(AutoClose), + ?line {error,Error} = gen_tcp:send(A,<<"Hej">>), + ?line test_server:stop_node(RNode) + end, + BasicFun(false), + BasicFun(true), + %% Check timeout length + ?line Self = self(), + ?line Pid = + spawn(fun() -> + {Loop,A,RNode} = setup_timeout_sink(1000, true), + {error,timeout} = + Loop(fun() -> + Res = gen_tcp:send(A,<<1:10000>>), + %%erlang:display(Res), + Self ! Res, + Res + end), + test_server:stop_node(RNode) + end), + ?line Diff = get_max_diff(), + ?line io:format("Max time for send: ~p~n",[Diff]), + ?line true = (Diff > 500) and (Diff < 1500), + %% Let test_server slave die... + ?line Mon = erlang:monitor(process, Pid), + ?line receive {'DOWN',Mon,process,Pid,_} -> ok end, + %% Check that parallell writers do not hang forever + ParaFun = + fun(AutoClose) -> + ?line {Loop,A,RNode} = setup_timeout_sink(1000, AutoClose), + SenderFun = fun() -> + {error,Error} = + Loop(fun() -> + gen_tcp:send(A, <<1:10000>>) + end), + Self ! {error,Error} + end, + ?line spawn_link(SenderFun), + ?line spawn_link(SenderFun), + ?line receive + {error,timeout} -> ok + after 10000 -> + ?line exit(timeout) + end, + NextErr = after_send_timeout(AutoClose), + ?line receive + {error,NextErr} -> ok + after 10000 -> + ?line exit(timeout) + end, + ?line {error,NextErr} = gen_tcp:send(A,<<"Hej">>), + ?line test_server:stop_node(RNode) + end, + ParaFun(false), + ParaFun(true), + ok. + +after_send_timeout(AutoClose) -> + case AutoClose of + true -> enotconn; + false -> timeout + end. + +get_max_diff() -> + receive + ok -> + get_max_diff(0) + after 10000 -> + exit(timeout) + end. + +get_max_diff(Max) -> + T1 = millistamp(), + receive + ok -> + Diff = millistamp() - T1, + if + Diff > Max -> + get_max_diff(Diff); + true -> + get_max_diff(Max) + end; + {error,timeout} -> + Diff = millistamp() - T1, + if + Diff > Max -> + Diff; + true -> + Max + end + after 10000 -> + exit(timeout) + end. + +setup_closed_ao() -> + Dir = filename:dirname(code:which(?MODULE)), + {ok,R} = test_server:start_node(test_default_options_slave,slave, + [{args,"-pa " ++ Dir}]), + Host = list_to_atom(lists:nth(2,string:tokens(atom_to_list(node()),"@"))), + {ok, L} = gen_tcp:listen(0, [{active,false},{packet,2}]), + Fun = fun(F) -> + receive + {From,X} when is_function(X) -> + From ! {self(),X()}, F(F); + die -> ok + end + end, + Pid = rpc:call(R,erlang,spawn,[fun() -> Fun(Fun) end]), + {ok, Port} = inet:port(L), + Remote = fun(Fu) -> + Pid ! {self(), Fu}, + receive {Pid,X} -> X + end + end, + {ok, C} = Remote(fun() -> + gen_tcp:connect(Host,Port, + [{active,false},{packet,2}]) + end), + {ok,A} = gen_tcp:accept(L), + gen_tcp:send(A,"Hello"), + {ok, "Hello"} = Remote(fun() -> gen_tcp:recv(C,0) end), + ok = Remote(fun() -> gen_tcp:close(C) end), + Loop2 = fun(_,_,_,0) -> + {failure, timeout}; + (L2,{MA,MB},F2,N) -> + case F2() of + MA -> MA; + MB -> MB; + Other -> io:format("~p~n",[Other]), + receive after 1000 -> ok end, + L2(L2,{MA,MB},F2,N-1) + end + end, + Loop = fun(Match2,F3) -> Loop2(Loop2,Match2,F3,10) end, + test_server:stop_node(R), + {Loop,A}. + +setup_timeout_sink(Timeout, AutoClose) -> + Dir = filename:dirname(code:which(?MODULE)), + {ok,R} = test_server:start_node(test_default_options_slave,slave, + [{args,"-pa " ++ Dir}]), + Host = list_to_atom(lists:nth(2,string:tokens(atom_to_list(node()),"@"))), + {ok, L} = gen_tcp:listen(0, [{active,false},{packet,2}, + {send_timeout,Timeout}, + {send_timeout_close,AutoClose}]), + Fun = fun(F) -> + receive + {From,X} when is_function(X) -> + From ! {self(),X()}, F(F); + die -> ok + end + end, + Pid = rpc:call(R,erlang,spawn,[fun() -> Fun(Fun) end]), + {ok, Port} = inet:port(L), + Remote = fun(Fu) -> + Pid ! {self(), Fu}, + receive {Pid,X} -> X + end + end, + {ok, C} = Remote(fun() -> + gen_tcp:connect(Host,Port, + [{active,false},{packet,2}]) + end), + {ok,A} = gen_tcp:accept(L), + gen_tcp:send(A,"Hello"), + {ok, "Hello"} = Remote(fun() -> gen_tcp:recv(C,0) end), + Loop2 = fun(_,_,0) -> + {failure, timeout}; + (L2,F2,N) -> + Ret = F2(), + io:format("~p~n",[Ret]), + case Ret of + ok -> receive after 1 -> ok end, + L2(L2,F2,N-1); + Other -> Other + end + end, + Loop = fun(F3) -> Loop2(Loop2,F3,1000) end, + {Loop,A,R}. + +millistamp() -> + {Mega, Secs, Micros} = erlang:now(), + (Micros div 1000) + Secs * 1000 + Mega * 1000000000. + +has_superfluous_schedulers() -> + case {erlang:system_info(schedulers), + erlang:system_info(logical_processors)} of + {S, unknown} when S > 1 -> true; + {S, P} when S > P -> true; + _ -> false + end. + + +otp_7731(suite) -> []; +otp_7731(doc) -> + "Leaking message from inet_drv {inet_reply,P,ok} " + "when a socket sending resumes working after a send_timeout"; +otp_7731(Config) when is_list(Config) -> + ?line ServerPid = spawn_link(?MODULE, otp_7731_server, [self()]), + ?line receive {ServerPid, ready, PortNum} -> ok end, + + ?line {ok, Socket} = gen_tcp:connect("localhost", PortNum, + [binary, {active, false}, {packet, raw}, + {send_timeout, 1000}]), + otp_7731_send(Socket), + io:format("Sending complete...\n",[]), + ServerPid ! {self(), recv}, + receive {ServerPid, ok} -> ok end, + + io:format("Client waiting for leaking messages...\n",[]), + + %% Now make sure inet_drv does not leak any internal messages. + receive Msg -> + ?line test_server:fail({unexpected, Msg}) + after 1000 -> + ok + end, + io:format("No leaking messages. Done.\n",[]), + gen_tcp:close(Socket). + +otp_7731_send(Socket) -> + Bin = <<1:10000>>, + io:format("Client sending ~p bytes...\n",[size(Bin)]), + ?line case gen_tcp:send(Socket, Bin) of + ok -> otp_7731_send(Socket); + {error,timeout} -> ok + end. + +otp_7731_server(ClientPid) -> + ?line {ok, LSocket} = gen_tcp:listen(0, [binary, {packet, raw}, + {active, false}]), + ?line {ok, {_, PortNum}} = inet:sockname(LSocket), + io:format("Listening on ~w with port number ~p\n", [LSocket, PortNum]), + ClientPid ! {self(), ready, PortNum}, + + {ok, CSocket} = gen_tcp:accept(LSocket), + gen_tcp:close(LSocket), + + io:format("Server got connection, wait for recv order...\n",[]), + + receive {ClientPid, recv} -> ok end, + + io:format("Server start receiving...\n",[]), + + otp_7731_recv(CSocket), + + ClientPid ! {self(), ok}, + + io:format("Server finished, closing...\n",[]), + gen_tcp:close(CSocket). + + +otp_7731_recv(Socket) -> + ?line case gen_tcp:recv(Socket, 0, 1000) of + {ok, Bin} -> + io:format("Server received ~p bytes\n",[size(Bin)]), + otp_7731_recv(Socket); + {error,timeout} -> + io:format("Server got receive timeout\n",[]), + ok + end. + + +%% OTP-7615: TCP-ports hanging in CLOSING state when sending large +%% buffer followed by a recv() that returns error due to closed +%% connection. +zombie_sockets(suite) -> []; +zombie_sockets(doc) -> ["OTP-7615 Leaking closed ports."]; +zombie_sockets(Config) when is_list(Config) -> + register(zombie_collector,self()), + Calls = 10, + Server = spawn_link(?MODULE, zombie_server,[self(), Calls]), + ?line {Server, ready, PortNum} = receive Msg -> Msg end, + io:format("Ports before = ~p\n",[lists:sort(erlang:ports())]), + zombie_client_loop(Calls, PortNum), + Ports = lists:sort(zombie_collector(Calls,[])), + Server ! terminate, + io:format("Collected ports = ~p\n",[Ports]), + ?line [] = zombies_alive(Ports, 10), + timer:sleep(1000), + ok. + +zombie_client_loop(0, _) -> ok; +zombie_client_loop(N, PortNum) when is_integer(PortNum) -> + ?line {ok, Socket} = gen_tcp:connect("localhost", PortNum, + [binary, {active, false}, {packet, raw}]), + ?line gen_tcp:close(Socket), % to make server recv fail + zombie_client_loop(N-1, PortNum). + + +zombie_collector(0,Acc) -> + Acc; +zombie_collector(N,Acc) -> + receive + {closed, Socket} -> + zombie_collector(N-1,[Socket|Acc]); + E -> + {unexpected, E, Acc} + end. + +zombies_alive(Ports, WaitSec) -> + Alive = lists:sort(erlang:ports()), + io:format("Alive = ~p\n",[Alive]), + Zombies = lists:filter(fun(P) -> lists:member(P, Alive) end, Ports), + case Zombies of + [] -> []; + _ -> + case WaitSec of + 0 -> Zombies; + _ -> timer:sleep(1000), % Wait some more for zombies to die + zombies_alive(Zombies, WaitSec-1) + end + end. + +zombie_server(Pid, Calls) -> + ?line {ok, LSocket} = gen_tcp:listen(0, [binary, {packet, raw}, + {active, false}, {backlog, Calls}]), + ?line {ok, {_, PortNum}} = inet:sockname(LSocket), + io:format("Listening on ~w with port number ~p\n", [LSocket, PortNum]), + BigBin = list_to_binary(lists:duplicate(100*1024, 77)), + Pid ! {self(), ready, PortNum}, + zombie_accept_loop(LSocket, BigBin, Calls), + ?line terminate = receive Msg -> Msg end. + +zombie_accept_loop(_, _, 0) -> + ok; +zombie_accept_loop(Socket, BigBin, Calls) -> + ?line case gen_tcp:accept(Socket) of + {ok, NewSocket} -> + spawn_link(fun() -> zombie_serve_client(NewSocket, BigBin) end), + zombie_accept_loop(Socket, BigBin, Calls-1); + E -> + E + end. + +zombie_serve_client(Socket, Bin) -> + %%io:format("Got connection on ~p\n",[Socket]), + ?line gen_tcp:send(Socket, Bin), + %%io:format("Sent data, waiting for reply on ~p\n",[Socket]), + ?line case gen_tcp:recv(Socket, 4) of + {error,closed} -> ok; + {error,econnaborted} -> ok % may be returned on Windows + end, + %%io:format("Closing ~p\n",[Socket]), + ?line gen_tcp:close(Socket), + zombie_collector ! {closed, Socket}. + + + +otp_7816(suite) -> []; +otp_7816(doc) -> + "Hanging send on windows when sending iolist with more than 16 binaries."; +otp_7816(Config) when is_list(Config) -> + Client = self(), + ?line Server = spawn_link(fun()-> otp_7816_server(Client) end), + ?line receive {Server, ready, PortNum} -> ok end, + + ?line {ok, Socket} = gen_tcp:connect("localhost", PortNum, + [binary, {active, false}, {packet, 4}, + {send_timeout, 10}]), + %% We use the undocumented feature that sending can be resumed after + %% a send_timeout without any data loss if the peer starts to receive data. + %% Unless of course the 7816-bug is in affect, in which case the write event + %% for the socket is lost on windows and not all data is sent. + + [otp_7816_send(Socket,18,BinSize,Server) || BinSize <- lists:seq(1000, 2000, 123)], + + io:format("Sending complete...\n",[]), + + ?line ok = gen_tcp:close(Socket), + Server ! {self(), closed}, + ?line {Server, closed} = receive M -> M end. + + +otp_7816_send(Socket, BinNr, BinSize, Server) -> + Data = lists:duplicate(BinNr, <<1:(BinSize*8)>>), + SentBytes = otp_7816_send_data(Socket, Data, 0) * BinNr * BinSize, + io:format("Client sent ~p bytes...\n",[SentBytes]), + Server ! {self(),recv,SentBytes}, + ?line {Server, ok} = receive M -> M end. + + + +otp_7816_send_data(Socket, Data, Loops) -> + io:format("Client sending data...\n",[]), + case gen_tcp:send(Socket, Data) of + ok -> + otp_7816_send_data(Socket,Data, Loops+1); + {error,timeout} -> + Loops+1 + end. + + +otp_7816_server(Client) -> + ?line {ok, LSocket} = gen_tcp:listen(0, [binary, {packet, 4}, + {active, false}]), + ?line {ok, {_, PortNum}} = inet:sockname(LSocket), + io:format("Listening on ~w with port number ~p\n", [LSocket, PortNum]), + Client ! {self(), ready, PortNum}, + + ?line {ok, CSocket} = gen_tcp:accept(LSocket), + io:format("Server got connection...\n",[]), + ?line gen_tcp:close(LSocket), + + otp_7816_server_loop(CSocket), + + io:format("Server terminating.\n",[]). + + +otp_7816_server_loop(CSocket) -> + io:format("Server waiting for order...\n",[]), + + receive + {Client, recv, RecvBytes} -> + io:format("Server start receiving...\n",[]), + + ?line ok = otp_7816_recv(CSocket, RecvBytes), + + Client ! {self(), ok}, + otp_7816_server_loop(CSocket); + + {Client, closed} -> + ?line {error, closed} = gen_tcp:recv(CSocket, 0, 1000), + Client ! {self(), closed} + end. + + +otp_7816_recv(_, 0) -> + io:format("Server got all.\n",[]), + ok; +otp_7816_recv(CSocket, BytesLeft) -> + ?line case gen_tcp:recv(CSocket, 0, 1000) of + {ok, Bin} when byte_size(Bin) =< BytesLeft -> + io:format("Server received ~p of ~p bytes.\n",[size(Bin), BytesLeft]), + otp_7816_recv(CSocket, BytesLeft - byte_size(Bin)); + {error,timeout} -> + io:format("Server got receive timeout when expecting more data\n",[]), + error + end. + +otp_8102(doc) -> ["Receive a packet with a faulty packet header"]; +otp_8102(suite) -> []; +otp_8102(Config) when is_list(Config) -> + ?line {ok, LSocket} = gen_tcp:listen(0, []), + ?line {ok, {_, PortNum}} = inet:sockname(LSocket), + io:format("Listening on ~w with port number ~p\n", [LSocket, PortNum]), + + [otp_8102_do(LSocket, PortNum, otp_8102_packet(Type,Size)) + || Size <- lists:seq(-10,-1), + Type <- [4, {cdr,big}, {cdr,little}]], + + gen_tcp:close(LSocket), + ok. + +otp_8102_packet(4, Size) -> + {<>, 4}; +otp_8102_packet({cdr,big}, Size) -> + {<<"GIOP",0,0,0,0,Size:32/big>>, cdr}; +otp_8102_packet({cdr,little}, Size) -> + {<<"GIOP",0,0,1,0,Size:32/little>>, cdr}. + +otp_8102_do(LSocket, PortNum, {Bin,PType}) -> + + io:format("Connect with packet option ~p ...\n",[PType]), + ?line {ok, RSocket} = gen_tcp:connect("localhost", PortNum, [binary, + {packet,PType}, + {active,true}]), + ?line {ok, SSocket} = gen_tcp:accept(LSocket), + + io:format("Got connection, sending ~p...\n",[Bin]), + + ?line ok = gen_tcp:send(SSocket, Bin), + + io:format("Sending complete...\n",[]), + + ?line {tcp_error,RSocket,emsgsize} = receive M -> M end, + + io:format("Got error msg, ok.\n",[]), + gen_tcp:close(SSocket), + gen_tcp:close(RSocket). + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/gen_udp_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/gen_udp_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/gen_udp_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/gen_udp_SUITE.erl 2009-11-20 13:30:41.000000000 +0000 @@ -0,0 +1,410 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +% +% test the behavior of gen_udp. Testing udp is really a very unfunny task, +% because udp is not deterministic. +% +-module(gen_udp_SUITE). +-include("test_server.hrl"). + + +-define(default_timeout, ?t:minutes(1)). + +% XXX - we should pick a port that we _know_ is closed. That's pretty hard. +-define(CLOSED_PORT, 6666). + +-export([all/1]). +-export([init_per_testcase/2, fin_per_testcase/2]). + +-export([send_to_closed/1, + buffer_size/1, binary_passive_recv/1, bad_address/1, + read_packets/1, open_fd/1]). + +all(suite) -> + [send_to_closed, + buffer_size, binary_passive_recv, bad_address, read_packets, + open_fd]. + +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +%%------------------------------------------------------------- +%% Send two packets to a closed port (on some systems this causes the socket +%% to be closed). + +send_to_closed(doc) -> + ["Tests core functionality."]; +send_to_closed(suite) -> + []; +send_to_closed(Config) when is_list(Config) -> + ?line {ok, Sock} = gen_udp:open(0), + ?line ok = gen_udp:send(Sock, {127,0,0,1}, ?CLOSED_PORT, "foo"), + timer:sleep(2), + ?line ok = gen_udp:send(Sock, {127,0,0,1}, ?CLOSED_PORT, "foo"), + ?line ok = gen_udp:close(Sock), + ok. + + + +%%------------------------------------------------------------- +%% Test that the UDP socket buffer sizes are settable + +buffer_size(suite) -> + []; +buffer_size(doc) -> + ["Test UDP buffer size setting."]; +buffer_size(Config) when is_list(Config) -> + ?line Len = 256, + ?line Bin = list_to_binary(lists:seq(0, Len-1)), + ?line M = 8192 div Len, + ?line Spec0 = + [{opt,M},{safe,M-1},{long,M+1}, + {opt,2*M},{safe,2*M-1},{long,2*M+1}, + {opt,4*M},{safe,4*M-1},{long,4*M+1}], + ?line Spec = + [case Tag of + opt -> + [{recbuf,Val*Len},{sndbuf,(Val + 2)*Len}]; + safe -> + {list_to_binary(lists:duplicate(Val, Bin)), + [correct]}; + long -> + {list_to_binary(lists:duplicate(Val, Bin)), + [truncated,emsgsize,timeout]} + end || {Tag,Val} <- Spec0], + %% + ?line {ok, ClientSocket} = gen_udp:open(0, [binary]), + ?line {ok, ClientPort} = inet:port(ClientSocket), + ?line Client = self(), + ?line ClientIP = {127,0,0,1}, + ?line ServerIP = {127,0,0,1}, + ?line Server = + spawn_link( + fun () -> + {ok, ServerSocket} = gen_udp:open(0, [binary]), + {ok, ServerPort} = inet:port(ServerSocket), + Client ! {self(),port,ServerPort}, + buffer_size_server(Client, ClientIP, ClientPort, + ServerSocket, 1, Spec), + ok = gen_udp:close(ServerSocket) + end), + ?line Mref = erlang:monitor(process, Server), + ?line receive + {Server,port,ServerPort} -> + ?line buffer_size_client(Server, ServerIP, ServerPort, + ClientSocket, 1, Spec) + end, + ?line ok = gen_udp:close(ClientSocket), + ?line receive + {'DOWN',Mref,_,_,normal} -> + ?line ok + end. + +buffer_size_client(_, _, _, _, _, []) -> + ?line ok; +buffer_size_client(Server, IP, Port, + Socket, Cnt, [Opts|T]) when is_list(Opts) -> + ?line ok = inet:setopts(Socket, Opts), + ?line Server ! {self(),setopts,Cnt}, + ?line receive {Server,setopts,Cnt} -> ok end, + ?line buffer_size_client(Server, IP, Port, Socket, Cnt+1, T); +buffer_size_client(Server, IP, Port, + Socket, Cnt, [{B,Replies}|T]) when is_binary(B) -> + ?line ok = gen_udp:send(Socket, IP, Port, B), + ?line receive + {Server,Cnt,Reply} -> + ?line case lists:member(Reply, Replies) of + true -> ok; + false -> + ?line + ?t:fail({reply_mismatch,Cnt,Reply,Replies, + byte_size(B), + inet:getopts(Socket, + [sndbuf,recbuf])}) + end + end, + ?line buffer_size_client(Server, IP, Port, Socket, Cnt+1, T). + +buffer_size_server(_, _, _, _, _, []) -> + ok; +buffer_size_server(Client, IP, Port, + Socket, Cnt, [Opts|T]) when is_list(Opts) -> + receive {Client,setopts,Cnt} -> ok end, + ok = inet:setopts(Socket, Opts), + Client ! {self(),setopts,Cnt}, + buffer_size_server(Client, IP, Port, Socket, Cnt+1, T); +buffer_size_server(Client, IP, Port, + Socket, Cnt, [{B,_}|T]) when is_binary(B) -> + Client ! + {self(),Cnt, + receive + {udp,Socket,IP,Port,D} when is_binary(D) -> + SizeD = byte_size(D), + case B of + D -> correct; + <> -> truncated + end; + {udp_error,Socket,Error} -> Error + after 5000 -> timeout + end}, + buffer_size_server(Client, IP, Port, Socket, Cnt+1, T). + + + +%%------------------------------------------------------------- +%% OTP-3823 gen_udp:recv does not return address in binary mode +%% + +binary_passive_recv(suite) -> + []; +binary_passive_recv(doc) -> + ["OTP-3823 gen_udp:recv does not return address in binary mode"]; +binary_passive_recv(Config) when is_list(Config) -> + ?line D = "The quick brown fox jumps over a lazy dog", + ?line B = list_to_binary(D), + ?line {ok, R} = gen_udp:open(0, [binary, {active, false}]), + ?line {ok, RP} = inet:port(R), + ?line {ok, S} = gen_udp:open(0), + ?line {ok, SP} = inet:port(S), + ?line ok = gen_udp:send(S, localhost, RP, D), + ?line {ok, {{127, 0, 0, 1}, SP, B}} = gen_udp:recv(R, byte_size(B)+1), + ?line ok = gen_udp:close(S), + ?line ok = gen_udp:close(R), + ok. + + +%%------------------------------------------------------------- +%% OTP-3836 inet_udp crashes when IP-address is larger than 255. + +bad_address(suite) -> + []; +bad_address(doc) -> + ["OTP-3836 inet_udp crashes when IP-address is larger than 255."]; +bad_address(Config) when is_list(Config) -> + ?line {ok, R} = gen_udp:open(0), + ?line {ok, RP} = inet:port(R), + ?line {ok, S} = gen_udp:open(0), + ?line {ok, _SP} = inet:port(S), + ?line {'EXIT', badarg} = + (catch gen_udp:send(S, {127,0,0,1,0}, RP, "void")), + ?line {'EXIT', badarg} = + (catch gen_udp:send(S, {127,0,0,256}, RP, "void")), + ?line ok = gen_udp:close(S), + ?line ok = gen_udp:close(R), + ok. + + +%%------------------------------------------------------------- +%% OTP-6249 UDP option for number of packet reads +%% +%% Starts a slave node that on command sends a bunch of messages +%% to our UDP port. The receiving process just receives and +%% ignores the incoming messages, but counts them. +%% A tracing process traces the receiving process for +%% 'receive' and scheduling events. From the trace, +%% message contents is verified; and, how many messages +%% are received per in/out scheduling, which should be +%% the same as the read_packets parameter. +%% +%% What happens on the SMP emulator remains to be seen... +%% + +read_packets(doc) -> + ["OTP-6249 UDP option for number of packet reads."]; +read_packets(Config) when is_list(Config) -> + case erlang:system_info(smp_support) of + false -> + read_packets_1(); + true -> + %% We would need some new sort of tracing to test this + %% option reliably in an SMP emulator. + {skip,"SMP emulator"} + end. + +read_packets_1() -> + ?line N1 = 5, + ?line N2 = 7, + ?line {ok,R} = gen_udp:open(0, [{read_packets,N1}]), + ?line {ok,RP} = inet:port(R), + ?line {ok,Node} = start_node(gen_udp_SUITE_read_packets), + ?line Die = make_ref(), + ?line Loop = erlang:spawn_link(fun () -> infinite_loop(Die) end), + %% + ?line Msgs1 = [erlang:integer_to_list(M) || M <- lists:seq(1, N1*3)], + ?line [V1|_] = read_packets_test(R, RP, Msgs1, Node), + ?line {ok,[{read_packets,N1}]} = inet:getopts(R, [read_packets]), + %% + ?line ok = inet:setopts(R, [{read_packets,N2}]), + ?line Msgs2 = [erlang:integer_to_list(M) || M <- lists:seq(1, N2*3)], + ?line [V2|_] = read_packets_test(R, RP, Msgs2, Node), + ?line {ok,[{read_packets,N2}]} = inet:getopts(R, [read_packets]), + %% + ?line stop_node(Node), + ?line Mref = erlang:monitor(process, Loop), + ?line Loop ! Die, + ?line receive + {'DOWN',Mref,_,_, normal} -> + case {V1,V2} of + {N1,N2} -> + ok; + _ when V1 =/= N1, V2 =/= N2 -> + ok + end + end. + +infinite_loop(Die) -> + receive + Die -> + ok + after + 0 -> + infinite_loop(Die) + end. + +read_packets_test(R, RP, Msgs, Node) -> + Len = length(Msgs), + Receiver = self(), + Tracer = + spawn_link( + fun () -> + receive + {Receiver,get_trace} -> + Receiver ! {self(),{trace,flush()}} + end + end), + Sender = + spawn_opt( + Node, + fun () -> + {ok,S} = gen_udp:open(0), + {ok,SP} = inet:port(S), + Receiver ! {self(),{port,SP}}, + receive + {Receiver,go} -> + read_packets_send(S, RP, Msgs) + end + end, + [link,{priority,high}]), + receive + {Sender,{port,SP}} -> + erlang:trace(self(), true, + [running,'receive',{tracer,Tracer}]), + erlang:yield(), + Sender ! {Receiver,go}, + read_packets_recv(Len), + erlang:trace(self(), false, [all]), + Tracer ! {Receiver,get_trace}, + receive + {Tracer,{trace,Trace}} -> + read_packets_verify(R, SP, Msgs, Trace) + end + end. + +read_packets_send(S, RP, [Msg|Msgs]) -> + ok = gen_udp:send(S, localhost, RP, Msg), + read_packets_send(S, RP, Msgs); +read_packets_send(_S, _RP, []) -> + ok. + +read_packets_recv(0) -> + ok; +read_packets_recv(N) -> + receive + _ -> + read_packets_recv(N - 1) + after 5000 -> + timeout + end. + +read_packets_verify(R, SP, Msg, Trace) -> + lists:reverse( + lists:sort(read_packets_verify(R, SP, Msg, Trace, 0))). + +read_packets_verify(R, SP, Msgs, [{trace,Self,OutIn,_}|Trace], M) + when Self =:= self(), OutIn =:= out; + Self =:= self(), OutIn =:= in -> + push(M, read_packets_verify(R, SP, Msgs, Trace, 0)); +read_packets_verify(R, SP, [Msg|Msgs], + [{trace,Self,'receive',{udp,R,{127,0,0,1},SP,Msg}} + |Trace], M) + when Self =:= self() -> + read_packets_verify(R, SP, Msgs, Trace, M+1); +read_packets_verify(_R, _SP, [], [], M) -> + push(M, []); +read_packets_verify(_R, _SP, Msgs, Trace, M) -> + ?t:fail({read_packets_verify,mismatch,Msgs,Trace,M}). + +push(0, Vs) -> + Vs; +push(V, Vs) -> + [V|Vs]. + +flush() -> + receive + X -> + [X|flush()] + after 200 -> + [] + end. + + + +open_fd(suite) -> + []; +open_fd(doc) -> + ["Test that the 'fd' option works"]; +open_fd(Config) when is_list(Config) -> + Msg = "Det gör ont när knoppar brista. Varför skulle annars våren tveka?", + Addr = {127,0,0,1}, + {ok,S1} = gen_udp:open(0), + {ok,P2} = inet:port(S1), + {ok,FD} = prim_inet:getfd(S1), + {ok,S2} = gen_udp:open(P2, [{fd,FD}]), + {ok,S3} = gen_udp:open(0), + {ok,P3} = inet:port(S3), + ok = gen_udp:send(S3, Addr, P2, Msg), + receive + {udp,S2,Addr,P3,Msg} -> + ok = gen_udp:send(S2,Addr,P3,Msg), + receive + {udp,S3,Addr,P2,Msg} -> + ok + after 1000 -> + ?t:fail(io_lib:format("~w", [flush()])) + end + after 1000 -> + ?t:fail(io_lib:format("~w", [flush()])) + end. + + +% +% Utils +% +start_node(Name) -> + Pa = filename:dirname(code:which(?MODULE)), + ?t:start_node(Name, slave, [{args, "-pa " ++ Pa}]). + +stop_node(Node) -> + ?t:stop_node(Node). diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/global_group_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/global_group_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/global_group_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/global_group_SUITE.erl 2009-11-20 13:30:35.000000000 +0000 @@ -0,0 +1,1415 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(global_group_SUITE). + +-export([all/1]). +-export([start_gg_proc/1, no_gg_proc/1, no_gg_proc_sync/1, compatible/1, + one_grp/1, one_grp_x/1, two_grp/1, hidden_groups/1, test_exit/1]). +-export([init/1, init/2, init2/2, start_proc/1, start_proc_rereg/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +%-compile(export_all). + +-include("test_server.hrl"). + +-define(NODES, [node()|nodes()]). + +-define(UNTIL(Seq), loop_until_true(fun() -> Seq end)). + +all(suite) -> + [start_gg_proc, no_gg_proc, no_gg_proc_sync, + compatible, one_grp, one_grp_x, two_grp, test_exit, + hidden_groups]. + +-define(TESTCASE, testcase_name). +-define(testcase, ?config(?TESTCASE, Config)). + +init_per_testcase(Case, Config) when atom(Case), list(Config) -> + Dog=?t:timetrap(?t:minutes(5)), + [{?TESTCASE, Case}, {watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +%%----------------------------------------------------------------- +%% Test suites for global groups. +%% Should be started in a CC view with: +%% erl -sname XXX -rsh ctrsh where XXX not in [cp1 .. cpN] +%%----------------------------------------------------------------- + + +start_gg_proc(suite) -> []; +start_gg_proc(doc) -> ["Check that the global_group processes are started automatically. "]; +start_gg_proc(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(120)), + + ?line Dir = ?config(priv_dir, Config), + ?line File = filename:join(Dir, "global_group.config"), + ?line {ok, Fd}=file:open(File, write), + [Ncp1,Ncp2,Ncp3] = node_names([cp1, cp2, cp3], Config), + ?line config(Fd, Ncp1, Ncp2, Ncp3, "cpx", "cpy", "cpz", "cpq"), + + ?line Cp1nn = node_at(Ncp1), + ?line Cp2nn = node_at(Ncp2), + ?line Cp3nn = node_at(Ncp3), + + ?line {ok, Cp1} = start_node(Ncp1, Config), + ?line {ok, Cp2} = start_node(Ncp2, Config), + ?line {ok, Cp3} = start_node(Ncp3, Config), + + ?line [] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}]), + ?line [] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}]), + ?line [] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}]), + + % stop the nodes, and make sure names are released. + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + + ?line ?UNTIL(undefined =:= global:whereis_name(test)), + ?line test_server:timetrap_cancel(Dog), + ok. + + + +no_gg_proc(suite) -> []; +no_gg_proc(doc) -> ["Start a system without global groups. Nodes are not " + "synced at start (sync_nodes_optional is not defined)"]; +no_gg_proc(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(200)), + + ?line Dir = ?config(priv_dir, Config), + ?line File = filename:join(Dir, "no_global_group.config"), + ?line {ok, Fd} = file:open(File, write), + ?line config_no(Fd), + + ?line NN = node_name(atom_to_list(node())), + ?line Cp1nn = list_to_atom("cp1@" ++ NN), + ?line Cp2nn = list_to_atom("cp2@" ++ NN), + ?line Cp3nn = list_to_atom("cp3@" ++ NN), + ?line Cpxnn = list_to_atom("cpx@" ++ NN), + ?line Cpynn = list_to_atom("cpy@" ++ NN), + ?line Cpznn = list_to_atom("cpz@" ++ NN), + + ?line {ok, Cp1} = start_node_no(cp1, Config), + ?line {ok, Cp2} = start_node_no(cp2, Config), + ?line {ok, Cp3} = start_node_no(cp3, Config), + ?line {ok, Cpx} = start_node_no(cpx, Config), + ?line {ok, Cpy} = start_node_no(cpy, Config), + ?line {ok, Cpz} = start_node_no(cpz, Config), + + %% let the nodes know of each other + ?line pong = rpc:call(Cp1, net_adm, ping, [Cp2nn]), + ?line pong = rpc:call(Cp2, net_adm, ping, [Cp3nn]), + ?line pong = rpc:call(Cp3, net_adm, ping, [Cpxnn]), + ?line pong = rpc:call(Cpx, net_adm, ping, [Cpynn]), + ?line pong = rpc:call(Cpy, net_adm, ping, [Cpznn]), + + ?line wait_for_ready_net(), + + ?line [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}]), + ?line [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}]), + ?line [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}]), + ?line [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}]), + ?line [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}]), + ?line [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}]), + + + % start a proc and register it + ?line {Pid2, yes} = rpc:call(Cp2, ?MODULE, start_proc, [test2]), + + ?line RegNames = lists:sort([test2,test_server]), + + ?line RegNames = + lists:sort( + rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}])), + + + ?line undefined = rpc:call(Cp3, global_group, global_groups, []), + + ?line Own_nodes_should = [node(), Cp1nn, Cp2nn, Cp3nn, + Cpxnn, Cpynn, Cpznn], + ?line Own_nodes = rpc:call(Cp3, global_group, own_nodes, []), + ?line true = (Own_nodes -- Own_nodes_should) =:= [], + ?line true = (Own_nodes_should -- Own_nodes) =:= [], + + ?line Pid2 = rpc:call(Cp1, global_group, send, [test2, {ping, self()}]), + ?line receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line Pid2 = rpc:call(Cp2, global_group, send, [test2, {ping, self()}]), + ?line receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout3) + end, + ?line Pid2 = rpc:call(Cpz, global_group, send, [test2, {ping, self()}]), + ?line receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout4) + end, + + + % start a proc and register it + ?line {PidX, yes} = rpc:call(Cpx, ?MODULE, start_proc, [test]), + + + %%------------------------------------ + %% Test monitor nodes + %%------------------------------------ + ?line Pid2 = rpc:call(Cp1, global_group, send, [{node, Cp2nn}, test2, monitor]), + ?line PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, monitor]), + + + % Kill node Cp1 + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cp1}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cp1}]), + ?line test_server:sleep(100), + ?line stop_node(Cp1), + ?line test_server:sleep(1000), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % Kill node Cpz + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cpz}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cpz}]), + ?line test_server:sleep(100), + ?line stop_node(Cpz), + ?line test_server:sleep(1000), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % Restart node Cp1 + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cp1}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cp1}]), + ?line {ok, Cp1} = start_node_no(cp1, Config), + ?line pong = rpc:call(Cp2, net_adm, ping, [Cp1nn]), + ?line pong = rpc:call(Cpx, net_adm, ping, [Cp1nn]), + ?line wait_for_ready_net(), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % Restart node Cpz + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cpz}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cpz}]), + ?line {ok, Cpz} = start_node_no(cpz, Config), + ?line pong = rpc:call(Cp2, net_adm, ping, [Cpznn]), + ?line pong = rpc:call(Cpx, net_adm, ping, [Cpznn]), + ?line wait_for_ready_net(), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % stop the nodes, and make sure names are released. + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(Cpx), + stop_node(Cpy), + stop_node(Cpz), + + ?line ?UNTIL(undefined =:= global:whereis_name(test)), + ?line test_server:timetrap_cancel(Dog), + ok. + + + + +no_gg_proc_sync(suite) -> []; +no_gg_proc_sync(doc) -> + ["Start a system without global groups, but syncing the nodes by using " + "sync_nodes_optional."]; +no_gg_proc_sync(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(200)), + + ?line Dir = ?config(priv_dir, Config), + ?line File = filename:join(Dir, "no_global_group_sync.config"), + ?line {ok, Fd} = file:open(File, write), + + [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz] = + node_names([cp1,cp2,cp3,cpx,cpy,cpz], Config), + ?line config_sync(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz), + + ?line Cp1nn = node_at(Ncp1), + ?line Cp2nn = node_at(Ncp2), + ?line Cp3nn = node_at(Ncp3), + ?line Cpxnn = node_at(Ncpx), + ?line Cpynn = node_at(Ncpy), + ?line Cpznn = node_at(Ncpz), + + ?line {ok, Cp1} = start_node_no2(Ncp1, Config), + ?line {ok, Cp2} = start_node_no2(Ncp2, Config), + ?line {ok, Cp3} = start_node_no2(Ncp3, Config), + ?line {ok, Cpx} = start_node_no2(Ncpx, Config), + ?line {ok, Cpy} = start_node_no2(Ncpy, Config), + ?line {ok, Cpz} = start_node_no2(Ncpz, Config), + + %% let the nodes know of each other + ?line pong = rpc:call(Cp1, net_adm, ping, [Cp2nn]), + ?line pong = rpc:call(Cp2, net_adm, ping, [Cp3nn]), + ?line pong = rpc:call(Cp3, net_adm, ping, [Cpxnn]), + ?line pong = rpc:call(Cpx, net_adm, ping, [Cpynn]), + ?line pong = rpc:call(Cpy, net_adm, ping, [Cpznn]), + + ?line wait_for_ready_net(), + + ?line [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}]), + ?line [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}]), + ?line [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}]), + ?line [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}]), + ?line [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}]), + ?line [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}]), + + + % start a proc and register it + ?line {Pid2, yes} = rpc:call(Cp2, ?MODULE, start_proc, [test2]), + + ?line RegNames = lists:sort([test2,test_server]), + + ?line RegNames = + lists:sort( + rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}])), + + + ?line undefined = rpc:call(Cp3, global_group, global_groups, []), + + ?line Own_nodes_should = [node(), Cp1nn, Cp2nn, Cp3nn, + Cpxnn, Cpynn, Cpznn], + ?line Own_nodes = rpc:call(Cp3, global_group, own_nodes, []), + ?line true = (Own_nodes -- Own_nodes_should) =:= [], + ?line true = (Own_nodes_should -- Own_nodes) =:= [], + + ?line Pid2 = rpc:call(Cp1, global_group, send, [test2, {ping, self()}]), + ?line receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line Pid2 = rpc:call(Cp2, global_group, send, [test2, {ping, self()}]), + ?line receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout3) + end, + ?line Pid2 = rpc:call(Cpz, global_group, send, [test2, {ping, self()}]), + ?line receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout4) + end, + + + % start a proc and register it + ?line {PidX, yes} = rpc:call(Cpx, ?MODULE, start_proc, [test]), + + + %%------------------------------------ + %% Test monitor nodes + %%------------------------------------ + ?line Pid2 = rpc:call(Cp1, global_group, send, [{node, Cp2nn}, test2, monitor]), + ?line PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, monitor]), + + + % Kill node Cp1 + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cp1}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cp1}]), + ?line test_server:sleep(100), + ?line stop_node(Cp1), + ?line test_server:sleep(1000), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % Kill node Cpz + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cpz}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cpz}]), + ?line test_server:sleep(100), + ?line stop_node(Cpz), + ?line test_server:sleep(1000), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % Restart node Cp1 + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cp1}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cp1}]), + ?line {ok, Cp1} = start_node_no2(Ncp1, Config), + ?line pong = rpc:call(Cp2, net_adm, ping, [Cp1nn]), + ?line pong = rpc:call(Cpx, net_adm, ping, [Cp1nn]), + ?line wait_for_ready_net(), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % Restart node Cpz + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cpz}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cpz}]), + ?line {ok, Cpz} = start_node_no2(Ncpz, Config), + ?line pong = rpc:call(Cp2, net_adm, ping, [Cpznn]), + ?line pong = rpc:call(Cpx, net_adm, ping, [Cpznn]), + ?line wait_for_ready_net(), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % stop the nodes, and make sure names are released. + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(Cpx), + stop_node(Cpy), + stop_node(Cpz), + + ?line ?UNTIL(undefined =:= global:whereis_name(test)), + ?line test_server:timetrap_cancel(Dog), + ok. + + + + +compatible(suite) -> []; +compatible(doc) -> + ["Check that a system without global groups is compatible with the old R4 system."]; +compatible(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(200)), + + ?line Dir = ?config(priv_dir, Config), + ?line File = filename:join(Dir, "global_group_comp.config"), + ?line {ok, Fd} = file:open(File, write), + + [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz] = + node_names([cp1,cp2,cp3,cpx,cpy,cpz], Config), + ?line config_comp(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz), + + ?line Cp1nn = node_at(Ncp1), + ?line Cp2nn = node_at(Ncp2), + ?line Cp3nn = node_at(Ncp3), + ?line Cpxnn = node_at(Ncpx), + ?line Cpynn = node_at(Ncpy), + ?line Cpznn = node_at(Ncpz), + + ?line {ok, Cp1} = start_node_comp(Ncp1, Config), + ?line {ok, Cp2} = start_node_comp(Ncp2, Config), + ?line {ok, Cp3} = start_node_comp(Ncp3, Config), + ?line {ok, Cpx} = start_node_comp(Ncpx, Config), + ?line {ok, Cpy} = start_node_comp(Ncpy, Config), + ?line {ok, Cpz} = start_node_comp(Ncpz, Config), + + %% let the nodes know of each other + ?line pong = rpc:call(Cp1, net_adm, ping, [Cp2nn]), + ?line pong = rpc:call(Cp2, net_adm, ping, [Cp3nn]), + ?line pong = rpc:call(Cp3, net_adm, ping, [Cpxnn]), + ?line pong = rpc:call(Cpx, net_adm, ping, [Cpynn]), + ?line pong = rpc:call(Cpy, net_adm, ping, [Cpznn]), + + ?line wait_for_ready_net(), + + ?line [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}]), + ?line [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}]), + ?line [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}]), + ?line [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}]), + ?line [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}]), + ?line [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}]), + + + % start a proc and register it + ?line {Pid2, yes} = rpc:call(Cp2, ?MODULE, start_proc, [test2]), + + ?line RegNames = lists:sort([test2,test_server]), + + ?line RegNames = + lists:sort( + rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}])), + ?line RegNames = + lists:sort( + rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}])), + + + ?line undefined = rpc:call(Cp3, global_group, global_groups, []), + + ?line Own_nodes_should = [node(), Cp1nn, Cp2nn, Cp3nn, + Cpxnn, Cpynn, Cpznn], + ?line Own_nodes = rpc:call(Cp3, global_group, own_nodes, []), + ?line true = (Own_nodes -- Own_nodes_should) =:= [], + ?line true = (Own_nodes_should -- Own_nodes) =:= [], + + ?line Pid2 = rpc:call(Cp1, global_group, send, [test2, {ping, self()}]), + ?line receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line Pid2 = rpc:call(Cp2, global_group, send, [test2, {ping, self()}]), + ?line receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout3) + end, + ?line Pid2 = rpc:call(Cpz, global_group, send, [test2, {ping, self()}]), + ?line receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout4) + end, + + + % start a proc and register it + ?line {PidX, yes} = rpc:call(Cpx, ?MODULE, start_proc, [test]), + + + %%------------------------------------ + %% Test monitor nodes + %%------------------------------------ + ?line Pid2 = rpc:call(Cp1, global_group, send, [{node, Cp2nn}, test2, monitor]), + ?line PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, monitor]), + + + % Kill node Cp1 + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cp1}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cp1}]), + ?line test_server:sleep(100), + ?line stop_node(Cp1), + ?line test_server:sleep(1000), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % Kill node Cpz + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cpz}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cpz}]), + ?line test_server:sleep(100), + ?line stop_node(Cpz), + ?line test_server:sleep(1000), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % Restart node Cp1 + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cp1}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cp1}]), + ?line {ok, Cp1} = start_node_comp(Ncp1, Config), + ?line pong = rpc:call(Cp2, net_adm, ping, [Cp1nn]), + ?line pong = rpc:call(Cpx, net_adm, ping, [Cp1nn]), + ?line wait_for_ready_net(), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % Restart node Cpz + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cpz}]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cpz}]), + ?line {ok, Cpz} = start_node_comp(Ncpz, Config), + ?line pong = rpc:call(Cp2, net_adm, ping, [Cpznn]), + ?line pong = rpc:call(Cpx, net_adm, ping, [Cpznn]), + ?line wait_for_ready_net(), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + + % stop the nodes, and make sure names are released. + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(Cpx), + stop_node(Cpy), + stop_node(Cpz), + + ?line ?UNTIL(undefined =:= global:whereis_name(test)), + ?line test_server:timetrap_cancel(Dog), + ok. + + + + +one_grp(suite) -> []; +one_grp(doc) -> ["Test a system with only one global group. "]; +one_grp(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(120)), + + ?line Dir = ?config(priv_dir, Config), + ?line File = filename:join(Dir, "global_group.config"), + ?line {ok, Fd} = file:open(File, write), + [Ncp1,Ncp2,Ncp3] = node_names([cp1, cp2, cp3], Config), + ?line config(Fd, Ncp1, Ncp2, Ncp3, "cpx", "cpy", "cpz", "cpq"), + + ?line {ok, Cp1} = start_node(Ncp1, Config), + ?line {ok, Cp2} = start_node(Ncp2, Config), + ?line {ok, Cp3} = start_node(Ncp3, Config), + + % sleep a while to make the global_group to sync... + test_server:sleep(1000), + + % start a proc and register it + ?line {Pid, yes} = rpc:call(Cp1, ?MODULE, start_proc, [test]), + + % test that it is registered at all nodes + ?line Pid = rpc:call(Cp1, global, whereis_name, [test]), + ?line Pid = rpc:call(Cp2, global, whereis_name, [test]), + ?line Pid = rpc:call(Cp3, global, whereis_name, [test]), + + % try to register the same name + ?line no = rpc:call(Cp1, global, register_name, [test, self()]), + + % let process exit, check that it is unregistered automatically + Pid ! die, + ?line + ?UNTIL(begin + (undefined =:= rpc:call(Cp1, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp2, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp3, global, whereis_name, [test])) + end), + + % test re_register + ?line {Pid2, yes} = rpc:call(Cp1, ?MODULE, start_proc, [test]), + ?line Pid2 = rpc:call(Cp3, global, whereis_name, [test]), + Pid3 = rpc:call(Cp3, ?MODULE, start_proc_rereg, [test]), + ?line Pid3 = rpc:call(Cp3, global, whereis_name, [test]), + + % test sending + rpc:call(Cp1, global, send, [test, {ping, self()}]), + receive + {pong, Cp3} -> ok + after + 2000 -> test_server:fail(timeout1) + end, + + rpc:call(Cp3, global, send, [test, {ping, self()}]), + receive + {pong, Cp3} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + + ?line rpc:call(Cp3, global, unregister_name, [test]), + ?line undefined = rpc:call(Cp1, global, whereis_name, [test]), + ?line undefined = rpc:call(Cp2, global, whereis_name, [test]), + ?line undefined = rpc:call(Cp3, global, whereis_name, [test]), + + Pid3 ! die, + ?line ?UNTIL(undefined =:= rpc:call(Cp3, global, whereis_name, [test])), + + % register a proc + ?line {_, yes} = rpc:call(Cp3, ?MODULE, start_proc, [test]), + + % stop the nodes, and make sure names are released. + stop_node(Cp3), + + ?line ?UNTIL(undefined =:= rpc:call(Cp1, global, whereis_name, [test])), + Pid2 ! die, + + stop_node(Cp1), + stop_node(Cp2), + + ?line test_server:timetrap_cancel(Dog), + ok. + + + + + +one_grp_x(suite) -> []; +one_grp_x(doc) -> ["Check a system with only one global group. " + "Start the nodes with different time intervals. "]; +one_grp_x(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(120)), + + ?line Dir = ?config(priv_dir, Config), + ?line File = filename:join(Dir, "global_group.config"), + ?line {ok, Fd} = file:open(File, write), + [Ncp1,Ncp2,Ncp3] = node_names([cp1, cp2, cp3], Config), + ?line config(Fd, Ncp1, Ncp2, Ncp3, "cpx", "cpy", "cpz", "cpq"), + + ?line {ok, Cp1} = start_node(Ncp1, Config), + % sleep a while to make the global_group to sync... + test_server:sleep(1000), + + % start a proc and register it + ?line {Pid, yes} = rpc:call(Cp1, ?MODULE, start_proc, [test]), + + ?line {ok, Cp2} = start_node(Ncp2, Config), + % sleep a while to make the global_group to sync... + test_server:sleep(1000), + + % test that it is registered at all nodes + ?line Pid = rpc:call(Cp1, global, whereis_name, [test]), + ?line Pid = rpc:call(Cp2, global, whereis_name, [test]), + + ?line {ok, Cp3} = start_node(Ncp3, Config), + % sleep a while to make the global_group to sync... + test_server:sleep(1000), + + ?line Pid = rpc:call(Cp3, global, whereis_name, [test]), + + % try to register the same name + ?line no = rpc:call(Cp1, global, register_name, [test, self()]), + + % let process exit, check that it is unregistered automatically + Pid ! die, + ?line + ?UNTIL(begin + (undefined =:= rpc:call(Cp1, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp2, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp3, global, whereis_name, [test])) + end), + + % test re_register + ?line {Pid2, yes} = rpc:call(Cp1, ?MODULE, start_proc, [test]), + ?line Pid2 = rpc:call(Cp3, global, whereis_name, [test]), + + Pid2 ! die, + + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + + ?line test_server:timetrap_cancel(Dog), + ok. + + + + + + +two_grp(suite) -> []; +two_grp(doc) -> ["Test a two global group system. "]; +two_grp(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(200)), + + ?line Dir = ?config(priv_dir, Config), + ?line File = filename:join(Dir, "global_group.config"), + ?line {ok, Fd} = file:open(File, write), + + [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz,Ncpq] = + node_names([cp1,cp2,cp3,cpx,cpy,cpz,cpq], Config), + ?line config(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz, Ncpq), + + ?line Cp1nn = node_at(Ncp1), + ?line Cp2nn = node_at(Ncp2), + ?line Cp3nn = node_at(Ncp3), + ?line Cpxnn = node_at(Ncpx), + ?line Cpynn = node_at(Ncpy), + ?line Cpznn = node_at(Ncpz), + + ?line {ok, Cp1} = start_node(Ncp1, Config), + ?line {ok, Cp2} = start_node(Ncp2, Config), + ?line {ok, Cp3} = start_node(Ncp3, Config), + ?line {ok, Cpx} = start_node(Ncpx, Config), + ?line {ok, Cpy} = start_node(Ncpy, Config), + ?line {ok, Cpz} = start_node(Ncpz, Config), + + %% The groups (cpq not started): + %% [{nc1, [cp1,cp2,cp3]}, {nc2, [cpx,cpy,cpz]}, {nc3, [cpq]}] + + % sleep a while to make the global_groups to sync... + test_server:sleep(1000), + + % check the global group names + ?line {nc1, [nc2, nc3]} = rpc:call(Cp1, global_group, global_groups, []), + ?line {nc1, [nc2, nc3]} = rpc:call(Cp2, global_group, global_groups, []), + ?line {nc1, [nc2, nc3]} = rpc:call(Cp3, global_group, global_groups, []), + ?line {nc2, [nc1, nc3]} = rpc:call(Cpx, global_group, global_groups, []), + ?line {nc2, [nc1, nc3]} = rpc:call(Cpy, global_group, global_groups, []), + ?line {nc2, [nc1, nc3]} = rpc:call(Cpz, global_group, global_groups, []), + + % check the global group nodes + ?line [Cp1nn, Cp2nn, Cp3nn] = rpc:call(Cp1, global_group, own_nodes, []), + ?line [Cp1nn, Cp2nn, Cp3nn] = rpc:call(Cp2, global_group, own_nodes, []), + ?line [Cp1nn, Cp2nn, Cp3nn] = rpc:call(Cp3, global_group, own_nodes, []), + ?line [Cpxnn, Cpynn, Cpznn] = rpc:call(Cpx, global_group, own_nodes, []), + ?line [Cpxnn, Cpynn, Cpznn] = rpc:call(Cpy, global_group, own_nodes, []), + ?line [Cpxnn, Cpynn, Cpznn] = rpc:call(Cpz, global_group, own_nodes, []), + + + % start a proc and register it + ?line {Pid1, yes} = rpc:call(Cp1, ?MODULE, start_proc, [test]), + + ?line Pid1 = rpc:call(Cp1, global_group, send, [test, {io, from_cp1}]), + ?line Pid1 = rpc:call(Cpx, global_group, send, [test, {io, from_cpx}]), + ?line Pid1 = rpc:call(Cp1, global_group, send, [{group,nc1}, test, + {io, from_cp1}]), + ?line [test] = + rpc:call(Cpx, global_group, registered_names, [{node, Cp1nn}]), + ?line [test] = + rpc:call(Cpx, global_group, registered_names, [{group, nc1}]), + ?line [] = rpc:call(Cpx, global_group, registered_names, [{node, Cpxnn}]), + ?line [] = rpc:call(Cpx, global_group, registered_names, [{group, nc2}]), + ?line Pid1 = rpc:call(Cpx, global_group, send, [{group,nc1}, test, + {io, from_cp1}]), + ?line {badarg,{test,{io,from_cpx}}} = + rpc:call(Cp1, global_group, send, [{group,nc2}, test, {io, from_cpx}]), + ?line {badarg,{test,{io,from_cpx}}} = + rpc:call(Cpx, global_group, send, [{group,nc2}, test, {io, from_cpx}]), + + + + % test that it is registered at all nodes + ?line Pid1 = rpc:call(Cp1, global, whereis_name, [test]), + ?line Pid1 = rpc:call(Cp2, global, whereis_name, [test]), + ?line Pid1 = rpc:call(Cp3, global, whereis_name, [test]), + ?line undefined = rpc:call(Cpx, global, whereis_name, [test]), + ?line undefined = rpc:call(Cpy, global, whereis_name, [test]), + ?line undefined = rpc:call(Cpz, global, whereis_name, [test]), + + % start a proc and register it + ?line {PidX, yes} = rpc:call(Cpx, ?MODULE, start_proc, [test]), + + % test that it is registered at all nodes + ?line Pid1 = rpc:call(Cp1, global, whereis_name, [test]), + ?line Pid1 = rpc:call(Cp2, global, whereis_name, [test]), + ?line Pid1 = rpc:call(Cp3, global, whereis_name, [test]), + ?line PidX = rpc:call(Cpx, global, whereis_name, [test]), + ?line PidX = rpc:call(Cpy, global, whereis_name, [test]), + ?line PidX = rpc:call(Cpz, global, whereis_name, [test]), + + Pid1 ! die, + %% If we don't wait for global on other nodes to have updated its + %% tables, 'test' may still be defined at the point when it is + %% tested a few lines below. + ?line + ?UNTIL(begin + Pid = rpc:call(Cp2, global, whereis_name, [test]), + undefined =:= Pid + end), + + % start a proc and register it + ?line {Pid2, yes} = rpc:call(Cp2, ?MODULE, start_proc, [test2]), + + % test that it is registered at all nodes + ?line Pid2 = rpc:call(Cp1, global, whereis_name, [test2]), + ?line Pid2 = rpc:call(Cp2, global, whereis_name, [test2]), + ?line Pid2 = rpc:call(Cp3, global, whereis_name, [test2]), + ?line PidX = rpc:call(Cpx, global, whereis_name, [test]), + ?line PidX = rpc:call(Cpy, global, whereis_name, [test]), + ?line PidX = rpc:call(Cpz, global, whereis_name, [test]), + + ?line undefined = rpc:call(Cp1, global, whereis_name, [test]), + ?line undefined = rpc:call(Cp2, global, whereis_name, [test]), + ?line undefined = rpc:call(Cp3, global, whereis_name, [test]), + ?line undefined = rpc:call(Cpx, global, whereis_name, [test2]), + ?line undefined = rpc:call(Cpy, global, whereis_name, [test2]), + ?line undefined = rpc:call(Cpz, global, whereis_name, [test2]), + + + ?line Pid2 = rpc:call(Cp1, global_group, send, [test2, {ping, self()}]), + receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line Pid2 = rpc:call(Cp2, global_group, send, [test2, {ping, self()}]), + receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line Pid2 = rpc:call(Cp3, global_group, send, [test2, {ping, self()}]), + receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + + ?line PidX = rpc:call(Cpx, global_group, send, [test, {ping, self()}]), + receive + {pong, Cpx} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line PidX = rpc:call(Cpy, global_group, send, [test, {ping, self()}]), + receive + {pong, Cpx} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line PidX = rpc:call(Cpz, global_group, send, [test, {ping, self()}]), + receive + {pong, Cpx} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + + ?line Pid2 = rpc:call(Cpx, global_group, send, [{node, Cp1nn}, test2, + {ping, self()}]), + receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line Pid2 = rpc:call(Cpy, global_group, send, [{node, Cp2nn}, test2, + {ping, self()}]), + receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line Pid2 = rpc:call(Cpz, global_group, send, [{node, Cp3nn}, test2, + {ping, self()}]), + receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + + ?line PidX = rpc:call(Cpx, global_group, send, [{node, Cpznn}, test, + {ping, self()}]), + receive + {pong, Cpx} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line PidX = rpc:call(Cpy, global_group, send, [{node, Cpxnn}, test, + {ping, self()}]), + receive + {pong, Cpx} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line PidX = rpc:call(Cpz, global_group, send, [{node, Cpynn}, test, + {ping, self()}]), + receive + {pong, Cpx} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + + ?line Pid2 = rpc:call(Cpx, global_group, send, [{group, nc1}, test2, + {ping, self()}]), + receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + ?line PidX = rpc:call(Cpy, global_group, send, [{group, nc2}, test, + {ping, self()}]), + receive + {pong, Cpx} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + + %%------------------------------------ + %% Test monitor nodes + %%------------------------------------ + ?line Pid2 = + rpc:call(Cp1, global_group, send, [{node, Cp2nn}, test2, monitor]), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, monitor]), + + + % Kill node Cp1 + ?line Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, + {wait_nodedown, Cp1}]), + ?line PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, + {wait_nodedown, Cp1}]), + ?line test_server:sleep(100), + ?line stop_node(Cp1), + ?line test_server:sleep(1000), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop_nodedown), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, to_loop]), + + % Kill node Cpz + ?line Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, + {wait_nodedown, Cpz}]), + ?line PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, + {wait_nodedown, Cpz}]), + ?line test_server:sleep(100), + ?line stop_node(Cpz), + ?line test_server:sleep(1000), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop_nodedown), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, to_loop]), + + % Restart node Cp1 + ?line [Cp1nn, Cp2nn, Cp3nn] = rpc:call(Cp2, global_group, own_nodes, []), + ?line Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, + {wait_nodeup, Cp1}]), + ?line PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, + {wait_nodeup, Cp1}]), + ?line test_server:sleep(100), + ?line {ok, Cp1} = start_node(Ncp1, Config), + ?line test_server:sleep(5000), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop_nodeup), + ?line PidX = + rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, to_loop]), + + + % Restart node Cpz + ?line Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, + {wait_nodeup, Cpz}]), + ?line PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, + {wait_nodeup, Cpz}]), + ?line test_server:sleep(100), + ?line {ok, Cpz} = start_node(Ncpz, Config), + ?line test_server:sleep(5000), + + ?line ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop_nodeup), + ?line ok = assert_loop(Cpx, Cpxnn, test, PidX, loop), + ?line Pid2 = + rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, to_loop]), + + + Pid2 ! die, + PidX ! die, + + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(Cpx), + stop_node(Cpy), + stop_node(Cpz), + + ?line test_server:timetrap_cancel(Dog), + ok. + + + +hidden_groups(suite) -> []; +hidden_groups(doc) -> ["Test hidden global groups."]; +hidden_groups(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(200)), + + ?line Dir = ?config(priv_dir, Config), + ?line File = filename:join(Dir, "global_group.config"), + ?line {ok, Fd} = file:open(File, write), + + [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz,Ncpq] = + node_names([cp1,cp2,cp3,cpx,cpy,cpz,cpq], Config), + ?line config_hidden(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz, Ncpq), + + ?line {ok, Cp1} = start_node(Ncp1, Config), + ?line {ok, Cp2} = start_node(Ncp2, Config), + ?line {ok, Cp3} = start_node(Ncp3, Config), + ?line {ok, Cpx} = start_node(Ncpx, Config), + ?line {ok, Cpy} = start_node(Ncpy, Config), + ?line {ok, Cpz} = start_node(Ncpz, Config), + ?line {ok, Cpq} = start_node(Ncpq, Config), + + % sleep a while to make the global_groups to sync... + test_server:sleep(1000), + + % check the global group names + ?line {nc1, [nc2, nc3]} = rpc:call(Cp1, global_group, global_groups, []), + ?line {nc1, [nc2, nc3]} = rpc:call(Cp2, global_group, global_groups, []), + ?line {nc1, [nc2, nc3]} = rpc:call(Cp3, global_group, global_groups, []), + ?line {nc2, [nc1, nc3]} = rpc:call(Cpx, global_group, global_groups, []), + ?line {nc2, [nc1, nc3]} = rpc:call(Cpy, global_group, global_groups, []), + ?line {nc2, [nc1, nc3]} = rpc:call(Cpz, global_group, global_groups, []), + + % check the global group nodes + ?line [Cp1, Cp2, Cp3] = rpc:call(Cp1, global_group, own_nodes, []), + ?line [Cp1, Cp2, Cp3] = rpc:call(Cp2, global_group, own_nodes, []), + ?line [Cp1, Cp2, Cp3] = rpc:call(Cp3, global_group, own_nodes, []), + ?line [Cpx, Cpy, Cpz] = rpc:call(Cpx, global_group, own_nodes, []), + ?line [Cpx, Cpy, Cpz] = rpc:call(Cpy, global_group, own_nodes, []), + ?line [Cpx, Cpy, Cpz] = rpc:call(Cpz, global_group, own_nodes, []), + ?line [Cpq] = rpc:call(Cpq, global_group, own_nodes, []), + + % Make some inter group connections + ?line pong = rpc:call(Cp1, net_adm, ping, [Cpx]), + ?line pong = rpc:call(Cpy, net_adm, ping, [Cp2]), + ?line pong = rpc:call(Cp3, net_adm, ping, [Cpx]), + ?line pong = rpc:call(Cpz, net_adm, ping, [Cp3]), + ?line pong = rpc:call(Cpq, net_adm, ping, [Cp1]), + ?line pong = rpc:call(Cpz, net_adm, ping, [Cpq]), + + % Check that no inter group connections are visible + NC1Nodes = lists:sort([Cp1, Cp2, Cp3]), + NC2Nodes = lists:sort([Cpx, Cpy, Cpz]), + ?line NC1Nodes = lists:sort([Cp1|rpc:call(Cp1, erlang, nodes, [])]), + ?line NC1Nodes = lists:sort([Cp2|rpc:call(Cp2, erlang, nodes, [])]), + ?line NC1Nodes = lists:sort([Cp3|rpc:call(Cp3, erlang, nodes, [])]), + ?line NC2Nodes = lists:sort([Cpx|rpc:call(Cpx, erlang, nodes, [])]), + ?line NC2Nodes = lists:sort([Cpy|rpc:call(Cpy, erlang, nodes, [])]), + ?line NC2Nodes = lists:sort([Cpz|rpc:call(Cpz, erlang, nodes, [])]), + NC12Nodes = lists:append(NC1Nodes, NC2Nodes), + ?line false = lists:any(fun(N) -> lists:member(N, NC12Nodes) end, + rpc:call(Cpq, erlang, nodes, [])), + + + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(Cpx), + stop_node(Cpy), + stop_node(Cpz), + stop_node(Cpq), + + ?line test_server:timetrap_cancel(Dog), + ok. + + +test_exit(suite) -> []; +test_exit(doc) -> ["Checks when the search process exits. "]; +test_exit(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(120)), + + ?line NN = node_name(atom_to_list(node())), + ?line Cp1nn = list_to_atom("cp1@" ++ NN), + + ?line {ok, Cp1} = start_node(cp1, Config), + ?line {ok, Cp2} = start_node(cp2, Config), + ?line {ok, Cp3} = start_node(cp3, Config), + + test_server:sleep(1000), + + ?line {error, illegal_function_call} = + rpc:call(Cp1, global_group, registered_names_test, [{node, Cp1nn}]), + ?line {badarg,_} = + rpc:call(Cp1, global_group, send, [king, "The message"]), + ?line undefined = rpc:call(Cp1, global_group, whereis_name, [king]), + + % stop the nodes, and make sure names are released. + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + + % sleep to let the nodes die + test_server:sleep(1000), + + ?line test_server:timetrap_cancel(Dog), + ok. + + +start_node(Name, Config) -> + Pa=filename:dirname(code:which(?MODULE)), + Dir=?config(priv_dir, Config), + ConfFile = " -config " ++ filename:join(Dir, "global_group"), + test_server:start_node(Name, slave, [{args, "-pa " ++ Pa ++ ConfFile}]). + +start_node_no(Name, Config) -> + Pa=filename:dirname(code:which(?MODULE)), + Dir=?config(priv_dir, Config), + ConfFile = " -config " ++ filename:join(Dir, "no_global_group"), + test_server:start_node(Name, slave, [{args, "-pa " ++ Pa ++ ConfFile}]). + +start_node_no2(Name, Config) -> + Pa=filename:dirname(code:which(?MODULE)), + Dir=?config(priv_dir, Config), + ConfFile = " -config " ++ filename:join(Dir, "no_global_group_sync"), + test_server:start_node(Name, slave, [{args, "-pa " ++ Pa ++ ConfFile}]). + +start_node_comp(Name, Config) -> + Pa=filename:dirname(code:which(?MODULE)), + Dir=?config(priv_dir, Config), + ConfFile = " -config " ++ filename:join(Dir, "global_group_comp"), + test_server:start_node(Name, slave, [{args, "-pa " ++ Pa ++ ConfFile}]). + +node_names(Names, Config) -> + [node_name(Name, Config) || Name <- Names]. + +node_name(Name, Config) -> + U = "_", + Pid = os:getpid(), + {{Y,M,D}, {H,Min,S}} = calendar:now_to_local_time(now()), + Date = io_lib:format("~4w_~2..0w_~2..0w__~2..0w_~2..0w_~2..0w", + [Y,M,D, H,Min,S]), + L = lists:flatten(Date), + lists:concat([Name,U,?testcase,U,Pid,U,U,L]). + +stop_node(Node) -> + ?t:stop_node(Node). + + +wait_for_ready_net() -> + Nodes = lists:sort(?NODES), + ?UNTIL(begin + lists:all(fun(N) -> Nodes =:= get_known(N) end, Nodes) and + lists:all(fun(N) -> + LNs = rpc:call(N, erlang, nodes, []), + Nodes =:= lists:sort([N | LNs]) + end, Nodes) + end). + +get_known(Node) -> + Known = gen_server:call({global_name_server,Node}, get_known), + lists:sort([Node | Known]). + +config_hidden(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz, Ncpq) -> + M = from($@, atom_to_list(node())), + io:format(Fd, "[{kernel, [{sync_nodes_optional, ['~s@~s','~s@~s','~s@~s', " + " '~s@~s','~s@~s','~s@~s']}," + "{sync_nodes_timeout, 1000}," + "{global_groups, [{nc1, hidden, ['~s@~s','~s@~s','~s@~s']}, " + "{nc2, hidden, ['~s@~s','~s@~s','~s@~s']}, " + "{nc3, normal, ['~s@~s']}]} ] }]. ~n", + [Ncp1, M, Ncp2, M, Ncp3, M, + Ncpx, M, Ncpy, M, Ncpz, M, + Ncp1, M, Ncp2, M, Ncp3, M, + Ncpx, M, Ncpy, M, Ncpz, M, + Ncpq, M]). + +config(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz, Ncpq) -> + M = from($@, atom_to_list(node())), + io:format(Fd, "[{kernel, [{sync_nodes_optional, ['~s@~s','~s@~s','~s@~s', " + " '~s@~s','~s@~s','~s@~s']}," + "{sync_nodes_timeout, 1000}," + "{global_groups, [{nc1, ['~s@~s','~s@~s','~s@~s']}, " + " {nc2, ['~s@~s','~s@~s','~s@~s']}, " + "{nc3, ['~s@~s']}]} ] }]. ~n", + [Ncp1, M, Ncp2, M, Ncp3, M, + Ncpx, M, Ncpy, M, Ncpz, M, + Ncp1, M, Ncp2, M, Ncp3, M, + Ncpx, M, Ncpy, M, Ncpz, M, + Ncpq, M]). + +config_no(Fd) -> + io:format(Fd, "[{kernel, [{global_groups, []}]}]. ~n",[]). + +config_sync(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz) -> + M = from($@, atom_to_list(node())), + io:format(Fd, "[{kernel, [{sync_nodes_optional, ['~s@~s','~s@~s','~s@~s', " + " '~s@~s','~s@~s','~s@~s']}," + "{sync_nodes_timeout, 1000}," + "{global_groups, []} ] }] .~n", + [Ncp1, M, Ncp2, M, Ncp3, M, + Ncpx, M, Ncpy, M, Ncpz, M]). + + +config_comp(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz) -> + M = from($@, atom_to_list(node())), + io:format(Fd, "[{kernel, [{sync_nodes_optional, ['~s@~s','~s@~s','~s@~s', " + " '~s@~s','~s@~s','~s@~s']}," + "{sync_nodes_timeout, 1000} ] }] .~n", + [Ncp1, M, Ncp2, M, Ncp3, M, + Ncpx, M, Ncpy, M, Ncpz, M]). + +node_at(N) -> + NN = node_name(atom_to_list(node())), + list_to_atom(lists:concat([N, "@", NN])). + +node_name(L) -> + from($@, L). + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(_, []) -> []. + + +start_proc(Name) -> + Pid = spawn(?MODULE, init, [self(), Name]), + receive + {Pid, Res} -> {Pid, Res} + end. + +start_proc_rereg(Name) -> + Pid = spawn(?MODULE, init2, [self(), Name]), + receive + Pid -> Pid + end. + + + + + + + +init(Parent) -> + Parent ! self(), + loop(). + +init(Parent, Name) -> + X = global:register_name(Name, self()), + Parent ! {self(),X}, + loop(). + +init2(Parent, Name) -> + global:re_register_name(Name, self()), + Parent ! self(), + loop(). + +loop() -> + receive + monitor -> + global_group:monitor_nodes(true), + loop(); + stop_monitor -> + global_group:monitor_nodes(false), + loop(); + {wait_nodeup, Node} -> + loop_nodeup(Node); + {wait_nodedown, Node} -> + loop_nodedown(Node); + {io, _Msg} -> + loop(); + {ping, From} -> + From ! {pong, node()}, + loop(); + {del_lock, Id} -> + global:del_lock({Id, self()}), + loop(); + {del_lock, Id, Nodes} -> + global:del_lock({Id, self()}, Nodes), + loop(); + {set_lock, Id, From} -> + Res = global:set_lock({Id, self()}, ?NODES, 1), + From ! Res, + loop(); + {set_lock, Id, From, Nodes} -> + Res = global:set_lock({Id, self()}, Nodes, 1), + From ! Res, + loop(); + {set_lock_loop, Id, From} -> + global:set_lock({Id, self()}, ?NODES), + From ! {got_lock, self()}, + loop(); + {{got_notify, From}, Ref} -> + receive + X when element(1, X) == global_name_conflict -> + From ! {Ref, yes} + after + 0 -> From ! {Ref, no} + end, + loop(); + {which_loop, From} -> + From ! loop, + loop(); + die -> + exit(normal) + end. + + +loop_nodeup(Node) -> + receive + {nodeup, Node} -> + loop(); + to_loop -> + loop(); + {which_loop, From} -> + From ! loop_nodeup, + loop_nodeup(Node); + die -> + exit(normal) + end. + + +loop_nodedown(Node) -> + receive + {nodedown, Node} -> + loop(); + to_loop -> + loop(); + {which_loop, From} -> + From ! loop_nodedown, + loop_nodedown(Node); + die -> + exit(normal) + end. + +assert_loop(Cp, CpName, Name, NamePid, Loop) -> + M = {which_loop, self()}, + NamePid = rpc:call(Cp, global_group, send, [{node, CpName}, Name, M]), + receive + Loop -> + ok; + Other1 -> + test_server:fail(Other1) + after 5000 -> + test_server:fail(timeout) + end. + +loop_until_true(Fun) -> + case Fun() of + true -> + ok; + _ -> + loop_until_true(Fun) + end. + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/global_SUITE_data/global_trace.erl erlang-13.b.3-dfsg/lib/kernel/test/global_SUITE_data/global_trace.erl --- erlang-13.b.1-dfsg/lib/kernel/test/global_SUITE_data/global_trace.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/global_SUITE_data/global_trace.erl 2009-03-12 12:21:40.000000000 +0000 @@ -0,0 +1,1023 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(global_trace). + +%%% +%%% Inspection of High Level Trace created by global.erl. +%%% + +%%% A few handy functions when running the test_server +%%% + +d() -> + lists:foreach(fun(F) -> dd(F, []) end, last()). + +d(Testcase) -> + d(Testcase, []). + +%% Skip "global_" from T. +d(Testcase, Options) -> + [Filename] = tmp_files(Testcase), + dd(Filename, Options). + +dd(Filename, Options) -> + io:format("\n======= ~s \n", [Filename]), + t(Filename, Options). + +last() -> + tmp_files("*"). + +%% global_groups_change: one node is restarted +%% global_mass_death: nodes are stopped +%% global_lock_die: two spurious (trying to remove locks taken by other pid) +%% global_otp_5640: 4 spurious (names registered again &c) +tmp_files(A) when is_atom(A) -> + tmp_files(atom_to_list(A)); +tmp_files(T) when is_list(T) -> + Logs = logdir(), + Dir = lists:last(filelib:wildcard(filename:join(Logs, "*"))), + filelib:wildcard(filename:join([Dir, log_private, "global_" ++ T])). + +%logdir() -> +% "/net/yoshi/ldisk/daily_build/otp_norel_linux_r11b.2007-02-18_19/" +% "test/test_server/global_SUITE.logs"; +%logdir() -> +% "/ldisk/daily_build/otp_norel_linux_suse_r11b.2007-02-07_19/test/" +% "test_server/global_SUITE.logs"; +logdir() -> + "/tmp/tests/test_server/global_SUITE.logs". + + + +%%% The contents of this file is by no means fixed; the printouts are +%%% updated depending on the problems at hand. Not everything has been +%%% designed very carefully :) +%%% +%%% For one thing, the trace from all nodes are written onto the file +%%% as one single term. One term per node would be better. &c. + +-compile(export_all). + +-record(state, {connect_all, known = [], synced = [], + resolvers = [], syncers = [], node_name = node(), + the_locker, the_deleter, the_registrar, trace = [], + global_lock_down + }). + +%% Compatible with different versions. +state(#state{}=S) -> + S; +state({state, ConnectAll, Known, Synced, LockersResolvers, Syncers, + NodeName, TheLocker, TheDeleter}) -> + %% r10b: Lockers, r10b_patched, r11b: Resolvers + #state{connect_all = ConnectAll, known = Known, synced = Synced, + resolvers = LockersResolvers, syncers = Syncers, + node_name = NodeName, the_locker = TheLocker, + the_deleter = TheDeleter, the_registrar = undefined, trace = []}; +state({state, ConnectAll, Known, Synced, Resolvers, Syncers, + NodeName, TheLocker, TheDeleter, Trace}) -> + %% r11b, some time before r11b-3 + #state{connect_all = ConnectAll, known = Known, synced = Synced, + resolvers = Resolvers, syncers = Syncers, + node_name = NodeName, the_locker = TheLocker, + the_deleter = TheDeleter, the_registrar = undefined, + trace = Trace}; +state({state, ConnectAll, Known, Synced, Resolvers, Syncers, + NodeName, TheLocker, TheDeleter, TheRegistrar, Trace}) -> + %% r11b, some time after r11b-3 + #state{connect_all = ConnectAll, known = Known, synced = Synced, + resolvers = Resolvers, syncers = Syncers, + node_name = NodeName, the_locker = TheLocker, + the_deleter = TheDeleter, the_registrar = TheRegistrar, + trace = Trace, global_lock_down = false}; +state(Else) -> + Else. + +%%% Trace tuples look like {Node, Now, Message, Nodes, Extra}. +%%% Nodes is the list as returned by nodes(). +%%% Extra is [] most of the time. +%%% +%%% init +%%% {nodedown,DownNode} +%%% {extra_nodedown,DownNode} +%%% {nodeup, UpNode} +%%% {added,AddedNodes}, Extra = [{new_nodes, NewNodes}, +%%% {abcast, Known}, +%%% {ops,Ops}] +%%% NewKnown = Known ++ AddedNodes +%%% AddedNodes = NewNodes -- Known +%%% NewNodes är här den man förhandlat med plus de noder den känner till. +%%% {added, AddedNodes}, Extra = [{ops,Ops}] +%%% NewKnown = Known ++ AddedNodes +%%% Den (passiva) noden får Nodes som är NewNodes +%%% hos den förhandlande. Sedan: AddedNodes = (Nodes -- Known) -- [node()]. +%%% Det är som hos förhandlaren. +%%% {nodes_changed, {New,Old}} +%%% Every now and then the list [node() | nodes()] is checked for updates. +%%% New are the nodes that global does not know of (yet). +%%% {new_node_name, NewNode} +%%% Ignored. Someone changes the nodename dynamically. +%%% {ins_name, Node}, Extra = [Name, Pid] +%%% Node = node(Pid) +%%% {ins_name_ext, Node}, Extra = [Name, Pid] +%%% Node = node(Pid) +%%% {del_name, Node}, Extra = [Name, Pid] +%%% Node = node(Pid) +%%% {ins_lock, Node}, Extra = [Id, Pid] +%%% Node = node(Pid) +%%% {rem_lock, Node}, Extra = [Id, Pid] +%%% Node = node(Pid) +%%% {locker_succeeded, node()}, Extra = {First, Known} +%%% {locker_failed, node()}, Extra = {Tried, SoFar} +%%% The nodes in SoFar have been locked, could not lock Tried. +%%% +%%% Also trace of the creation and deletion of resolvers +%%% (this kind of resolvers are created when nodeup arrives from +%%% unknown nodes (there are also name resolvers...)). +%%% {new_resolver, Node}, Extra = [Tag, ResolverPid] +%%% {kill_resolver, Node}, Extra = [Tag, ResolverPid] +%%% {exit_resolver, Node}, Extra = [Tag] + +-record(node, { + node, + known = [], % #state.known (derived) + nodes = [], % nodes() + locks = [], % [{Id, [Pid, node(Pid)]}] (derived) + names = [], % [{Name, Pid, node(Pid)}] (derived) + resolvers = [], % [{Node, Tag, ResolverPid}] + n_locks = {0, % OK + 0, % Tried to lock the boss + 0, % Tried to lock other boss + 0}, % Tried to lock known + rejected = 0 % Lock OK, but later rejected + }). + +-record(w, {nodes = [], % [#node{}] + n = []}). + +t(File) -> + t(File, []). + +%%% What to search for in the output of t/2? +%%% - 'NEGOTIATIONS': this is a list of the name negotiations +%%% (the big picture); +%%% - '###' signals a possibly strange event; +%%% - 'spurious' is used for "tagging" such events; +%%% - 'resol ' could mean that some resolver process has not been removed; +%%% ... + +%% Options: +%% {show_state, From, To} +%% From = To = integer() | {integer(), integer()} +%% Examples: {7, 8} (show states between seconds 7.0 and 8.0); +%% {{1,431234},{2,432}} (between 1.431234 and 2.000432) +%% The state of a node includes locks, names, nodes, known, ... +%% Default is {{0,0}, {0,0}}, that is, do not show state. +%% show_state +%% same as {show_state, 0, 1 bsl 28}, that is, show every state +%% {show_trace, bool() +%% Show the complete trace as one list and per node pair. +%% Default is true. +t(File, Options) -> + {StateFun, ShowTrace} = + case options(Options, [show_state, show_trace]) of + [{From,To}, ST] -> + {fun(T, S) -> + Time = element(2, T), + if + Time >= From, Time =< To -> + io:format("===> ~p~n", [T]), + display_nodes("After", Time, S#w.nodes, T); + true -> + ok + end + end, ST}; + _ -> + erlang:error(badarg, [File, Options]) + end, + D1 = try + %% All nodes' trace is put on the file as one binary. + %% This could (and should?) be improved upon. + {ok, Bin} = file:read_file(File), + io:format("Size of trace file is ~p bytes~n", [size(Bin)]), + binary_to_term(Bin) + catch _:_ -> + {ok, [D0]} = file:consult(File), + D0 + end, + {D2, End} = case D1 of + {high_level_trace, ET, D3} -> + {D3, ET}; + _ -> + {D1, now()} + end, + D = adjust_nodes(D2), + {NodeNodeTrace, _NodeTrace, Trace, Base} = get_trace(D, End), + messages(D, Base, End), + + %io:format("NET~n ~p~n", [net_kernel_nodes(NodeTrace)]), + + io:format("NEGOTIATIONS:~n ~p~n", [negotiations(Trace)]), + + io:format("*** Complete trace ***~n"), + if + ShowTrace -> + show_trace(Trace), + io:format("--- End of complete trace ---~n"), + lists:map(fun({{Node,ActionNode},Ts}) -> + io:format("*** Trace for ~p on node ~p ***~n", + [ActionNode, Node]), + show_trace(lists:keysort(2, Ts)), + io:format("--- End of trace for ~p on node ~p ---~n", + [ActionNode, Node]) + end, NodeNodeTrace); + true -> ok + end, + io:format("*** Evaluation ***~n"), + {Fini, Spurious} = eval(Trace, StateFun), + io:format("*** End of evaluation ***~n"), + show_spurious(NodeNodeTrace, Spurious), + display_nodes("FINI", '', Fini), + ok. + +% show_trace(Trace) -> +% lists:foreach(fun({Node, {S,Mu}, Message, Nodes, Extra}) -> +% io:format("~2w.~6..0w ~w~n", [S, Mu, Node]), +% io:format(" ~p~n", [Message]), +% io:format(" Nodes: ~p~n", [Nodes]), +% case Extra of +% [] -> ok; +% _ -> io:format(" Extra: ~p~n", [Extra]) +% end +% end, Trace); +show_trace(Trace) -> + lists:map(fun(T) -> io:format("~p~n", [T]) end, Trace). + +get_trace(D, EndTime0) -> + NodeTrace0 = [{Node,lists:keysort(2, (state(State))#state.trace)} || + {Node,{info,State}} <- D, + case state(State) of + #state{trace = no_trace} -> + io:format("No trace for ~p~n", [Node]), + false; + #state{} -> + true; + Else -> + io:format("Bad state for ~p: ~p~n", + [Node, Else]), + false + end], + Trace0 = lists:keysort(2, lists:append([T || {_Node, T} <- NodeTrace0])), + Trace1 = sort_nodes(Trace0), + {Base, Trace2} = adjust_times(Trace1), + EndTime = adjust_time(EndTime0, Base), + io:format("The trace was generated at ~p~n", [EndTime]), + Trace = [T || T <- Trace2, element(2, T) < EndTime], + NodeTrace = [{Node, adjust_times(Ts, Base)} || + {Node, Ts} <- NodeTrace0], + NodeNodeTrace = + [{{Node,ActionNode}, T} || {Node, Ts} <- NodeTrace, + T <- Ts, + ActionNode <- action_nodes(T)], + {family(NodeNodeTrace), NodeTrace, Trace, Base}. + +adjust_nodes([E | Es]) -> + [adjust_nodes(E) | adjust_nodes(Es)]; +adjust_nodes(T) when is_tuple(T) -> + list_to_tuple(adjust_nodes(tuple_to_list(T))); +adjust_nodes(A) when is_atom(A) -> + adjust_node(A); +adjust_nodes(E) -> + E. + +sort_nodes(Ts) -> + [setelement(4, T, lists:sort(element(4, T))) || T <- Ts]. + +adjust_times([]) -> + {0, []}; +adjust_times([T1 | _]=Ts) -> + Base = element(2, T1), + {Base, adjust_times(Ts, Base)}. + +adjust_times(Ts, Base) -> + [setelement(2, adj_tag(T, Base), adjust_time(element(2, T), Base)) || + T <- Ts]. + +adj_tag({Node, Time, {M, Node2}, Nodes, Extra}=T, Base) -> + if + M =:= new_resolver; + M =:= kill_resolver; + M =:= exit_resolver -> + {Node, Time, {M, Node2}, Nodes, + [adjust_time(hd(Extra), Base) | tl(Extra)]}; + true -> + T + end. + +adjust_time(Time, Base) -> + musec2sec(timer:now_diff(Time, Base)). + +action_nodes({_Node, _Time, {_, Nodes}, _, _}) when is_list(Nodes) -> + Nodes; +action_nodes({_Node, _Time, {_, Node}, _, _}) -> + [Node]. + +%% Some of the names in global_SUITE.erl are recognized. +adjust_node(Node) -> + case atom_to_list(Node) of + "cp" ++ L -> + list_to_atom([$c, $p | lists:takewhile(fun is_digit/1, L)]); + "test_server" ++ _ -> + test_server; + "a_2" ++ _ -> + a_2; + "n_1" ++ _ -> + n_1; + "n_2" ++ _ -> + n_2; + "z_2" ++ _ -> + z_2; + "z_" ++ _ -> + z; + "b_" ++ _ -> + b; + "c_external_nodes" ++ _ -> + c_external_nodes; + _ -> + Node + end. + +is_digit(C) -> + (C >= $0) and (C =< $9). + +eval(Trace, Fun) -> + eval(Trace, {0, 0}, #w{}, Fun). + +eval([T | Ts], Time0, S0, Fun) -> + Time1 = element(2, T), + case is_fresh(S0#w.nodes) of + true -> + io:format("~p ***************** FRESH *****************~n", + [Time1]); + false -> + ok + end, + case time_diff(Time1, Time0) > 0 of + true -> + display_nodes("PAUS", Time1, S0#w.nodes, T); + false -> + ok + end, + S = eval_trace(T, S0), + Fun(T, S), + eval(Ts, Time1, S, Fun); +eval([], _, S, _Fun) -> + {S#w.nodes, lists:usort(S#w.n)}. + +%% Old. +eval_trace({Node, Time, {added,Added}, _Nodes, [_NewNodes,_Abc]}, S0) -> + added(Node, Added, Time, S0); +eval_trace({Node, Time, {added,Added}, _Nodes, []}, S0) -> + added(Node, Added, Time, S0); + + +eval_trace({Node, Time, {init, Node}, Nodes, []}, S0) -> + init(Node, Nodes, Time, S0); +eval_trace({Node, Time, {nodedown, DownNode}, Nodes, []}, S0) -> + node_down(Node, DownNode, Nodes, Time, S0); +eval_trace({Node, Time, {extra_nodedown, DownNode}, Nodes, []}, S0) -> + node_down(Node, DownNode, Nodes, Time, S0); +eval_trace({Node, Time, {nodeup, UpNode}, Nodes, []}, S0) -> + node_up(Node, UpNode, Nodes, Time, S0); +eval_trace({Node, Time, {added,Added}, _Nodes, [_NewNodes,_Abc,_Ops]}, S0) -> + added(Node, Added, Time, S0); +eval_trace({Node, Time, {added,Added}, _Nodes, [_Ops]}, S0) -> + added(Node, Added, Time, S0); +eval_trace({Node, Time, {nodes_changed, {New,Old}}, _Nodes, []}, S0) -> + nodes_changed(Node, New, Old, Time, S0); +eval_trace({Node, Time, {ins_name, PNode}, _Nodes, [Name, Pid]}, S0) -> + insert_name(Node, PNode, Time, Name, Pid, S0); +eval_trace({Node, Time, {del_name, PNode}, _Nodes, [Name, Pid]}, S0) -> + delete_name(Node, PNode, Time, Name, Pid, S0); +eval_trace({Node, Time, {ins_name_ext, PNode}, _Nodes, [Name, Pid]}, S0) -> + insert_external_name(Node, PNode, Time, Name, Pid, S0); +eval_trace({Node, Time, {ins_lock, PNode}, _Nodes, [Id, Pid]}, S0) -> + insert_lock(Node, PNode, Time, Id, Pid, S0); +eval_trace({Node, Time, {rem_lock, PNode}, _Nodes, [Id, Pid]}, S0) -> + remove_lock(Node, PNode, Time, Id, Pid, S0); +eval_trace({Node, Time, {locker_succeeded, _}, _Nodes,{_First,_Known}}, S0) -> + locker_succeeded(Node, Time, S0); +eval_trace({Node, Time, {lock_rejected, _}, _Nodes, Known}, S0) -> + lock_rejected(Node, Time, Known, S0); +eval_trace({Node, Time, {locker_failed, _}, _Nodes, {Tried,SoFar}}, S0) -> + locker_failed(Node, Time, Tried, SoFar, S0); +eval_trace({Node, Time, {new_resolver, RNode}, _Nodes, [Tag, ResPid]}, S0) -> + new_resolver(Node, Time, RNode, Tag, ResPid, S0); +eval_trace({Node, Time, {kill_resolver, RNode}, _Nodes, [Tag,_ResPid]}, S0) -> + stop_resolver(Node, Time, RNode, Tag, kill, S0); +eval_trace({Node, Time, {exit_resolver, RNode}, _Nodes, [Tag]}, S0) -> + stop_resolver(Node, Time, RNode, Tag, exit, S0); +eval_trace(_Ignored, S) -> +io:format("ignored ~p~n", [_Ignored]), + S. + +init(_Node, [], _Time, S) -> + S; +init(Node, NodesList, Time, S) -> + io:format("### ~p ~p: already in nodes(): ~p~n", [Node, Time, NodesList]), + S. + +node_down(Node, DownNode, NodesList, Time, S0) -> + case get_node(Node, S0) of + {ok, #node{known = Known, nodes = Nodes}=N} -> + case lists:member(DownNode, Nodes) of + true -> + S1 = case lists:member(DownNode, Known) of + true -> + S0; + false -> + io:format("### ~p ~p:~n " + "nodedown but unknown ~p~n", + [Node, Time, DownNode]), + case lists:member(DownNode, Nodes) of + true -> + io:format("(but note that ~p" + " is member of nodes())~n", + [DownNode]); + false -> + ok + end, + add_spurious(Node, DownNode, S0, Time) + end, + NewKnown = lists:delete(DownNode, Known), + NewNodes = lists:delete(DownNode, Nodes), + put_node(N#node{known = NewKnown, nodes = NewNodes}, S1); + false -> + io:format("### ~p ~p:~n spurious nodedown from ~p~n " + "~p~n", [Node, Time, DownNode, NodesList]), + NewKnown = lists:delete(DownNode, Known), + S1 = put_node(N#node{known = NewKnown,nodes = Nodes}, S0), + add_spurious(Node, DownNode, S1, Time) + end; + not_ok -> + io:format("### ~p ~p:~n unknown node got nodedown from ~p~n", + [Node, Time, DownNode]), + add_spurious(Node, DownNode, S0, Time) + end. + +node_up(Node, UpNode, NodesList, Time, S) -> + case get_node(Node, S) of + {ok, #node{nodes = Nodes}=N} -> + case lists:member(UpNode, Nodes) of + true -> + io:format("### ~p ~p:~n spurious nodeup from ~p~n " + "~p~n", [Node, Time, UpNode, NodesList]), + add_spurious(Node, UpNode, S, Time); + false -> + put_node(N#node{nodes = lists:sort([UpNode | Nodes])}, S) + end; + not_ok -> + S#w{nodes = [#node{node = Node, nodes = [UpNode]} | S#w.nodes]} + end. + +added(Node, Added, Time, S0) -> + case get_node(Node, S0) of + {ok, #node{known = Known, nodes = Nodes}=N} -> + case Known -- (Known -- Added) of + [] -> + S1 = put_node(N#node{known = lists:sort(Added ++ Known), + nodes = Nodes}, S0), + case lists:member(Node, Added) of + true -> + io:format("### ~p ~p:~n adding node()" + " to known (~p)~n", [Node, Time,Added]), + add_spurious(Node, Added, S1, Time); + false -> + S1 + end; + AK -> + io:format("### ~p ~p:~n added already known ~p~n", + [Node, Time, AK]), + S1 = put_node(N#node{known = lists:usort(Added ++ Known), + nodes = Nodes}, S0), + add_spurious(Node, AK, S1, Time) + end; + not_ok -> + io:format("### ~p ~p:~n unknown node got added ~p~n", + [Node, Time, Added]), + S1 = S0#w{nodes = [#node{node = Node, known = Added} | + S0#w.nodes]}, + add_spurious(Node, Added, S1, Time) + end. + +nodes_changed(Node, New, Old, Time, S) -> + io:format("### ~p ~p:~n nodes changed, new are ~p, old are ~p~n", + [Node, Time, New, Old]), + S. + +insert_external_name(Node, PNode, Time, Name, Pid, S) -> + insert_name(Node, PNode, Time, Name, Pid, S). + +insert_name(Node, PNode, Time, Name, Pid, S0) -> + RegName = {Name, Pid, PNode}, + case get_node(Node, S0) of + {ok, #node{names = Names}=N} -> + case lists:keysearch(Name, 1, Names) of + {value, {Name, OldPid, OldPNode}} -> + io:format("### ~p ~p:~n name ~p already registered " + "for ~p on ~p~n", + [Node, Time, Name, OldPid, OldPNode]), + add_spurious(Node, [PNode], S0, Time); + false -> + case lists:keysearch(Pid, 2, Names) of + {value, {OldName, Pid, OldPNode}} -> + io:format("### ~p ~p:~n pid ~p already " + "registered as ~p on ~p~n", + [Node, Time, Pid, OldName, OldPNode]), + add_spurious(Node, [PNode], S0, Time); + false -> + put_node(N#node{names = [RegName | Names]}, S0) + end + end; + not_ok -> + io:format("### ~p ~p:~n unknown node registered ~p for ~p " + "on ~p~n", [Node, Time, Name, Pid, PNode]), + Known = add_to_known(Node, PNode, []), + N = #node{node = Node, known = Known, names = [RegName]}, + S1 = S0#w{nodes = [N | S0#w.nodes]}, + add_spurious(Node, [PNode], S1, Time) + end. + +delete_name(Node, PNode, Time, Name, Pid, S0) -> + case get_node(Node, S0) of + {ok, #node{names = Names}=N} -> + case lists:keysearch(Name, 1, Names) of + {value, {Name, Pid, PNode}} -> + NewNames = lists:keydelete(Name, 1, Names), + put_node(N#node{names = NewNames}, S0); + {value, {Name, Pid2, PNode2}} -> % bad log + io:format("### ~p ~p:~n name ~p not registered " + "for ~p on ~p but for ~p on ~p~n", + [Node, Time, Name, Pid, PNode, Pid2, PNode2]), + add_spurious(Node, [PNode], S0, Time); + false -> + io:format("### ~p ~p:~n name ~p not registered " + "for ~p on ~p~n", + [Node, Time, Name, Pid, PNode]), + add_spurious(Node, [PNode], S0, Time) + end; + not_ok -> + io:format("### ~p ~p:~n unknown node deleted ~p for ~p on ~p~n", + [Node, Time, Name, Pid, PNode]), + Known = add_to_known(Node, PNode, []), + N = #node{node = Node, known = Known}, + S1 = S0#w{nodes = [N | S0#w.nodes]}, + add_spurious(Node, [PNode], S1, Time) + end. + +insert_lock(Node, PNode, Time, Id, Pid, S0) -> + Lock = {Pid, PNode}, + case get_node(Node, S0) of + {ok, #node{locks = NLocks}=N} -> + case lists:keysearch(Id, 1, NLocks) of + {value, {Id, OldLocks}} -> + case lists:member(Lock, OldLocks) of + true -> + io:format("### ~p ~p:~n lock ~p already set " + "for ~p on ~p~n", + [Node, Time, Id, Pid, PNode]), + %% This is not so strange, actually. + add_spurious(Node, [PNode], S0, Time); + false -> + NewLocks = {Id, [Lock | OldLocks]}, + Ls = lists:keyreplace(Id, 1, NLocks, NewLocks), + put_node(N#node{locks = Ls}, S0) + end; + false -> + put_node(N#node{locks = [{Id,[Lock]}|N#node.locks]}, S0) + end; + not_ok -> + Known = add_to_known(Node, PNode, []), + N = #node{node = Node, known = Known, locks = [{Id, [Lock]}]}, + S1 = S0#w{nodes = [N | S0#w.nodes]}, + if + Node =/= PNode -> + io:format("### ~p ~p:~n unknown pid ~p locked ~p on " + "~p~n", [Node, Time, Pid, Id, PNode]), + add_spurious(Node, [PNode], S1, Time); + true -> + S1 + end + end. + +remove_lock(Node, PNode, Time, Id, Pid, S0) -> + Lock = {Pid, PNode}, + case get_node(Node, S0) of + {ok, #node{locks = NLocks}=N} -> + case lists:keysearch(Id, 1, NLocks) of + {value, {Id, OldLocks}} -> + case lists:member(Lock, OldLocks) of + true -> + NewLocks = lists:delete(Lock, OldLocks), + Ls = case NewLocks of + [] -> + lists:keydelete(Id, 1, NLocks); + _ -> + lists:keyreplace(Id, 1, NLocks, + {Id, NewLocks}) + end, + put_node(N#node{locks = Ls}, S0); + false -> + io:format("### ~p ~p:~n lock ~p not set " + "by ~p on ~p~n", + [Node, Time, Id, Pid, PNode]), + add_spurious(Node, [PNode], S0, Time) + end; + false -> + io:format("### ~p ~p:~n lock ~p not set " + "by ~p on ~p~n", + [Node, Time, Id, Pid, PNode]), + add_spurious(Node, [PNode], S0, Time) + end; + not_ok -> + io:format("### ~p ~p:~n ~p unlocked ~p on unknown node ~p~n", + [Node, Time, Pid, Id, PNode]), + Known = add_to_known(Node, PNode, []), + N = #node{node = Node, known = Known}, + S1 = S0#w{nodes = [N | S0#w.nodes]}, + add_spurious(Node, [PNode], S1, Time) + end. + +%% This is just statistics... +locker_succeeded(Node, Time, S0) -> + case get_node(Node, S0) of + {ok, #node{n_locks = {Ok,Boss,NodeX,Bad}}=N} -> + put_node(N#node{n_locks = {Ok+1,Boss,NodeX,Bad}}, S0); + not_ok -> + io:format("### ~p ~p:~n unknown node's locker succeeded~n", + [Node, Time]), + add_spurious(Node, [Node], S0, Time) + end. + +lock_rejected(Node, Time, _Known, S0) -> + case get_node(Node, S0) of + {ok, #node{rejected = Rej}=N} -> + put_node(N#node{rejected = Rej+1}, S0); + not_ok -> + io:format("### ~p ~p:~n unknown node's lock rejected~n", + [Node, Time]), + add_spurious(Node, [Node], S0, Time) + end. + +locker_failed(Node, Time, Tried, SoFar, S0) -> + case get_node(Node, S0) of + {ok, #node{known = Known, n_locks = {Ok,Boss,NodeX,Bad}}=N} -> + TheBoss = lists:max([Node | Known]), + Cheap = (Tried =:= [TheBoss]), + RatherCheap = ((SoFar -- [Node, TheBoss]) =:= []) and + ((Tried -- [Node, TheBoss]) =/= []), + if + Cheap -> + put_node(N#node{n_locks = {Ok,Boss+1,NodeX,Bad}}, S0); + RatherCheap -> + put_node(N#node{n_locks = {Ok,Boss,NodeX+1,Bad}}, S0); + true -> + put_node(N#node{n_locks = {Ok,Boss,NodeX,Bad+1}}, S0) + end; + not_ok -> + io:format("### ~p ~p:~n unknown node's locker failed~n", + [Node, Time]), + add_spurious(Node, [Node], S0, Time) + end. + +new_resolver(Node, Time, ResNode, Tag, ResPid, S0) -> + case get_node(Node, S0) of + {ok, #node{resolvers = Rs}=N} -> + put_node(N#node{resolvers = [{ResNode, Tag, ResPid} | Rs]}, S0); + not_ok -> + io:format("### ~p ~p:~n resolver created for unknown node~n", + [Node, Time]), + add_spurious(Node, [Node], S0, Time) + end. + +stop_resolver(Node, Time, ResNode, Tag, How, S0) -> + case get_node(Node, S0) of + {ok, #node{resolvers = Rs}=N} -> + case lists:keysearch(Tag, 2, Rs) of + {value, {ResNode, Tag, _ResPid}} -> + NewRs = lists:keydelete(Tag, 2, Rs), + put_node(N#node{resolvers = NewRs}, S0); + false -> + case lists:keysearch(ResNode, 1, Rs) of + {value, {ResNode, _Tag2, _ResPid2}} -> + NewRs = lists:keydelete(ResNode, 1, Rs), + put_node(N#node{resolvers = NewRs}, S0); + false when How =:= exit -> + io:format("### ~p ~p:~n there is no resolver " + "with tag ~p on node ~p~n", + [Node, Time, Tag, ResNode]), + add_spurious(Node, [ResNode], S0, Time); + false when How =:= kill -> + S0 + end + end; + not_ok -> + io:format("### ~p ~p:~n resolver stopped for unknown node~n", + [Node, Time]), + add_spurious(Node, [Node], S0, Time) + end. + +add_to_known(Node, NodeToAdd, Known) -> + if + Node =:= NodeToAdd -> + Known; + true -> + lists:sort([NodeToAdd | Known]) + end. + +get_node(Node, S) -> + case lists:keysearch(Node, #node.node, S#w.nodes) of + {value, N} -> + {ok, N}; + false -> + not_ok + end. + +put_node(#node{node = Node, known = [], nodes = [], locks = [], names = [], + n_locks = {0,0,0,0}}, + S) -> + S#w{nodes = lists:keydelete(Node, #node.node, S#w.nodes)}; +put_node(N, S) -> + S#w{nodes = lists:keyreplace(N#node.node, #node.node, S#w.nodes, N)}. + +is_fresh(#node{known = [], nodes = [], locks = [], names = []}) -> + true; +is_fresh(#node{}) -> + false; +is_fresh([]) -> + true; +is_fresh([N | Ns]) -> + is_fresh(N) andalso is_fresh(Ns). + +add_spurious(Node, ActionNodes, S, Time) when is_list(ActionNodes) -> + S#w{n = [{{Node,N},Time}|| N <- ActionNodes] ++ S#w.n}; +add_spurious(Node, ActionNode, S, Time) -> + add_spurious(Node, [ActionNode], S, Time). + +messages(D, Base, End) -> + messages1(no_info(D), no_info), + messages1(resolvers(D, Base, End), resolvers), + messages1(syncers(D), syncers). + +messages1(M, ST) -> + [foo || {Node, T} <- M, + ok =:= io:format(ms(ST), [Node, T])]. + +ms(no_info) -> + "~p: ~p~n"; +ms(resolvers) -> + "~p: resolvers ~p~n"; +ms(syncers) -> + "~p: syncers ~p~n". + +no_info(D) -> + [{Node,no_info} || {Node, no_info} <- D]. + +resolvers(D, Base, End) -> + [{Node, + [{N,adjust_time(T, Base),P} || {N, T, P} <- Rs, T < End]} || + {Node, {info,State}} <- D, + is_record(State, state), + [] =/= (Rs = (state(State))#state.resolvers)]. + +syncers(D) -> + [{Node,Ss} || {Node, {info,State}} <- D, + is_record(State, state), + [] =/= (Ss = (state(State))#state.syncers)]. + +net_kernel_nodes(NodeTrace) -> + [{Node, nkn(Trace, [])} || {Node, Trace} <- NodeTrace]. + +nkn([], _Nodes) -> + []; +nkn([{Node, Time, _Message, Ns, _X} | Ts], Nodes) -> + {NewS, _, OldS} = sofs:symmetric_partition(sofs:set(Ns), sofs:set(Nodes)), + New = sofs:to_external(NewS), + Old = sofs:to_external(OldS), + [{Node, Time, {newnode, N}, []} || N <- New] ++ + [{Node, Time, {oldnode, N}, []} || N <- Old] ++ + nkn(Ts, (Nodes -- Old) ++ New). + +negotiations(Trace) -> + Ns = [{Node,T,Added,X} || + {Node,T,{added,Added},_Nodes,X} <- Trace], + Pass = [{passive,Node,T,Added} || + {Node,T,Added,[_Ops]} <- Ns], + Act = [{active,Node,T,Other,Added,NewNodes} || + {Node,T,Added,[{new_nodes,[Other|_]=NewNodes},_Abcast,_Ops]} <- Ns], + Act ++ Pass. + +show_spurious(NodeTrace, Spurious) -> + Pairs = [{Node,ActionNode} || {{Node,ActionNode}, _Time} <- Spurious], + S = sofs:restriction(sofs:relation(NodeTrace), sofs:set(Pairs)), + [foo || + {{{Node,ANode},Times}, + {{Node,ANode},Ts}} <- lists:zip(family(Spurious), + sofs:to_external(S)), + show_spurious(Node, ANode, Times, lists:keysort(2, Ts))]. + +show_spurious(Node, ActionNode, Times, Ts) -> + io:format("** Actions for ~p on node ~p **~n", [ActionNode, Node]), + lists:map(fun(T) -> spurious(Node, T, Times) end, Ts), + io:format("-- End of actions for ~p on node ~p --~n", [ActionNode, Node]), + true. + +spurious(Node, Trace, Times) -> + As = case Trace of + {Node, _T0, {init, Node}, _Nodes, _} -> + init; % should not happen, I guess + {Node, _T0, {nodedown, _ActionNode}, _Nodes, _} -> + nodedown; + {Node, _T0, {extra_nodedown, _ActionNode}, _Nodes, _} -> + extra_nodedown; + {Node, _T0, {nodeup, _ActionNode}, _Nodes, _} -> + nodeup; + {Node, _T0, {added, Added}, _Nodes, [_Ops]} -> + {passive, Added}; + {Node, _T0, {added, Added}, _Nodes, [_NewNodes,_AbCast,_Ops]} -> + {negotiator, Added}; + {Node, _T0, {ins_lock, PNode}, _Nodes, [Id, Pid]} -> + {insert_lock, [Id, Pid, PNode]}; + {Node, _T0, {rem_lock, PNode}, _Nodes, [Id, Pid]} -> + {remove_lock, [Id, Pid, PNode]}; + {Node, _T0, {ins_name, PNode}, _Nodes, [Name, Pid]} -> + {insert_name, [Name, Pid, PNode]}; + {Node, _T0, {del_name, PNode}, _Nodes, [Name, Pid]} -> + {insert_name, [Name, Pid, PNode]}; + {Node, _T0, {nodes_changed, CNode}, _Nodes, []} -> + {nodes_changed, [CNode]}; + {Node, _T0, {Any, Some}, _Nodes, X} -> + {Any, [Some | X]} + end, + T = element(2, Trace), + _Nodes2 = element(4, Trace), + TS = ["(spurious)" || lists:member(T, Times)], + io:format("~p: ~p ~s~n", [T, As, TS]), +% io:format(" ~w~n", [_Nodes2]), + ok. + +display_nodes(Why, Time, Nodes) -> + display_nodes(Why, Time, Nodes, none). + +display_nodes(Why, Time, Nodes, LastTrace) -> + io:format("~p **** ~s ****~n", [Time, Why]), + {OkL, BossL, NodeXL, BadL} = unzip4([L || #node{n_locks = L} <- Nodes]), + [NOk, NBoss, NNodeX, NBad] = + [lists:sum(L) || L <- [OkL, BossL, NodeXL, BadL]], + Rejected = lists:sum([Rej || #node{rejected = Rej} <- Nodes]), + io:format("Locks: (~w+~w+~w=~w)/~w, ~w of ~w rejected~n", + [NOk, NBoss, NNodeX, NOk+NBoss+NNodeX, NOk+NBoss+NNodeX+NBad, + Rejected, NOk]), + lists:foreach(fun(#node{node = Node, known = Known, nodes = Ns, + locks = Locks, names = Names, + n_locks = {Ok, Boss, NodeX, Bad}, + resolvers = Resolvers0, + rejected = Rej}) -> + NodeL = io_lib:format("~p: ",[Node]), + io:format("~sknown ~p~n", [NodeL, Known]), + Sp = spaces(NodeL), + case Ns =:= Known of + true -> ok; + false -> display_list(Sp, nodes, Ns) + end, + display_list(Sp, locks, Locks), + display_list(Sp, names, lists:sort(Names)), + Resolvers = lists:sort(Resolvers0), + _ResNs = [R || {R,_,_} <- Resolvers], + %% Should check trace on this node (Node) only: + New = [N || {_,_,{nodeup,N},_,_} <- [LastTrace]], + _ResAllowed = (Ns -- New) -- Known, +%% Displays too much junk. +% case ResAllowed =:= ResNs of +% true -> ok; +% false -> display_list(Sp, resol, Resolvers) +% end, + %% This is less bulky: + case Known =:= Ns of + true -> display_list(Sp, resol, Resolvers); + false -> ok + end, + case {Ok, Boss, NodeX, Bad} of + {0, 0, 0, 0} -> ok; + _ -> io:format("~slocks (~w+~w+~w=~w)/~w, " + "~w of ~w rejected~n", + [Sp, Ok, Boss, NodeX, + Ok+Boss+NodeX,Ok+Boss+NodeX+Bad, + Rej, Ok]) + end + end, lists:keysort(#node.node, Nodes)), + io:format("\n"). + +display_list(_S, _What, []) -> + ok; +display_list(S, What, L) -> + io:format("~s~p ~p~n", [S, What, L]). + +spaces(Iolist) -> + lists:duplicate(iolist_size(Iolist), $\s). + +family(R) -> + sofs:to_external(sofs:relation_to_family(sofs:relation(R))). + +time_diff({S1,MyS1}, {S0,MyS0}) -> + ((S1*1000000+MyS1) - (S0*1000000+MyS0)) div 1000000. + +musec2sec(T) -> + S = T div 1000000, + M = (T - S * 1000000), + {S, M}. + +%%% Options + +options(Options, Keys) when is_list(Options) -> + options(Options, Keys, []); +options(Option, Keys) -> + options([Option], Keys, []). + +options(Options0, [Key | Keys], L) when is_list(Options0) -> + Options = case lists:member(Key, Options0) of + true -> + [atom_option(Key) | lists:delete(Key, Options0)]; + false -> + Options0 + end, + V = case lists:keysearch(Key, 1, Options) of + {value, {show_state, From, To}} when is_integer(From), From >= 0, + is_integer(To), To >= From -> + {ok, {{From,0}, {To,0}}}; + {value, {show_state, {From, FromMusec}, + {To, ToMusec}}} when is_integer(From), + From >= 0, + is_integer(To), + To >= From, + FromMusec >= 0, + FromMusec =< 999999, + ToMusec >= 0, + ToMusec =< 999999 -> + {ok, {{From,FromMusec}, {To,ToMusec}}}; + {value, {show_state, false}} -> + {value, default_option(show_state)}; + {value, {show_trace, Bool}} when Bool; not Bool -> + {ok, Bool}; + {value, {Key, _}} -> + badarg; + false -> + Default = default_option(Key), + {ok, Default} + end, + case V of + badarg -> + badarg; + {ok, Value} -> + NewOptions = lists:keydelete(Key, 1, Options), + options(NewOptions, Keys, [Value | L]) + end; +options([], [], L) -> + lists:reverse(L); +options(_Options, _, _L) -> + badarg. + +default_option(show_state) -> {{0,0}, {0,0}}; +default_option(show_trace) -> true. + +atom_option(show_state) -> + {show_state, 0, 1 bsl 28}; +atom_option(show_trace) -> + {show_trace, true}; +atom_option(_) -> + erlang:error(program_error, []). + +unzip4(Ts) -> unzip4(Ts, [], [], [], []). + +unzip4([{X, Y, Z, W} | Ts], Xs, Ys, Zs, Ws) -> + unzip4(Ts, [X | Xs], [Y | Ys], [Z | Zs], [W | Ws]); +unzip4([], Xs, Ys, Zs, Ws) -> + {lists:reverse(Xs), lists:reverse(Ys), + lists:reverse(Zs), lists:reverse(Ws)}. + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/global_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/global_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/global_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/global_SUITE.erl 2009-03-12 12:19:05.000000000 +0000 @@ -0,0 +1,4395 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(global_SUITE). + +-compile(r11). % some code is run from r11-nodes + +%-define(line_trace, 1). + +-export([all/1, + names/1, names_hidden/1, locks/1, locks_hidden/1, + bad_input/1, names_and_locks/1, lock_die/1, name_die/1, + basic_partition/1, basic_name_partition/1, + advanced_partition/1, stress_partition/1, + ring/1, simple_ring/1, line/1, simple_line/1, + global_lost_nodes/1, otp_1849/1, + otp_3162/1, otp_5640/1, otp_5737/1, + otp_6931/1, + simple_disconnect/1, + simple_resolve/1, simple_resolve2/1, simple_resolve3/1, + leftover_name/1, re_register_name/1, name_exit/1, external_nodes/1, + many_nodes/1, sync_0/1, + global_groups_change/1, + register_1/1, + both_known_1/1, + lost_unregister/1, + mass_death/1, + garbage_messages/1]). + +-export([global_load/3, lock_global/2, lock_global2/2]). + +-export([ttt/1]). +-export([mass_spawn/1]). + +-export([start_tracer/0, stop_tracer/0, get_trace/0]). + +-compile(export_all). + +-include("test_server.hrl"). + +-define(NODES, [node()|nodes()]). + +-define(UNTIL(Seq), loop_until_true(fun() -> Seq end, Config)). + +%% The resource used by the global module. +-define(GLOBAL_LOCK, global). + +ttt(suite) -> + [ +%% 5&6: succeeds +%% 4&5&6: succeeds +%% 3&4&5&6: succeeds +%% 1&2&3&6: fails +%% 1&2&6: succeeds +%% 3&6: succeeds + names, names_hidden, locks, locks_hidden, + bad_input, + names_and_locks, lock_die, name_die, basic_partition, +% advanced_partition, basic_name_partition, +% stress_partition, simple_ring, simple_line, + ring]. + +all(suite) -> + case init:get_argument(ring_line) of + {ok, _} -> + [ring_line]; + _ -> + [names, names_hidden, locks, locks_hidden, + bad_input, + names_and_locks, lock_die, name_die, basic_partition, + advanced_partition, basic_name_partition, + stress_partition, simple_ring, simple_line, + ring, line, global_lost_nodes, otp_1849, + otp_3162, otp_5640, otp_5737, otp_6931, + simple_disconnect, simple_resolve, simple_resolve2, + simple_resolve3, + leftover_name, re_register_name, name_exit, + external_nodes, many_nodes, sync_0, global_groups_change, + register_1, both_known_1, lost_unregister, + mass_death, garbage_messages] + end. + +-define(TESTCASE, testcase_name). +-define(testcase, ?config(?TESTCASE, Config)). +-define(nodes_tag, '$global_nodes'). +-define(registered, ?config(registered, Config)). + +init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) -> + ok = gen_server:call(global_name_server, high_level_trace_start,infinity), + [{?TESTCASE, Case}, {registered, registered()} | Config]. + +fin_per_testcase(_Case, Config) -> + ?line write_high_level_trace(Config), + ?line _ = + gen_server:call(global_name_server, high_level_trace_stop, infinity), + ?line[global:unregister_name(N) || N <- global:registered_names(), + N =/= test_server], + ?line InitRegistered = ?registered, + ?line Registered = registered(), + ?line [io:format("~s local names: ~p~n", [What, N]) || + {What, N} <- [{"Added", Registered -- InitRegistered}, + {"Removed", InitRegistered -- Registered}], + N =/= []], + ok. + +%%% General comments: +%%% One source of problems with failing tests can be that the nodes from the +%%% previous test haven't died yet. +%%% So, when stressing a particular test by running it in a loop, it may +%%% fail already when starting the help nodes, even if the nodes have been +%%% monitored and the nodedowns picked up at the previous round. Waiting +%%% a few seconds between rounds seems to solve the problem. Possibly the +%%% timeout of 7 seconds for connections can also be a problem. This problem +%%% is the same with old (vsn 3) and new global (vsn 4). + + +%%% Test that register_name/2 registers the name on all nodes, even if +%%% a new node appears in the middle of the operation (OTP-3552). +%%% +%%% Test scenario: process p2 is spawned, locks global, starts a slave node, +%%% and tells the parent to do register_name. Then p2 sleeps for five seconds +%%% and releases the lock. Now the name should exist on both our own node +%%% and on the slave node (we wait until that is true; it seems that we +%%% can do rpc calls to another node before the connection is really up). +register_1(suite) -> []; +register_1(Config) when is_list(Config) -> + Timeout = 15, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + P = spawn_link(?MODULE, lock_global, [self(), Config]), + receive + {P, ok} -> + io:format("p1: received ok~n"), + ok + end, + P ! step2, + io:format("p1: sent step2~n"), + ?line yes = global:register_name(foo, self()), + io:format("p1: registered~n"), + P ! step3, + receive + {P, I, I2} -> + ok + end, + if + I =:= I2 -> + ok; + true -> + test_server:fail({notsync, I, I2}) + end, + ?line _ = global:unregister_name(foo), + write_high_level_trace(Config), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +lock_global(Parent, Config) -> + Id = {global, self()}, + io:format("p2: setting lock~n"), + global:set_lock(Id, [node()]), + Parent ! {self(), ok}, + io:format("p2: sent ok~n"), + receive + step2 -> + io:format("p2: received step2"), + ok + end, + io:format("p2: starting slave~n"), + {ok, Host} = inet:gethostname(), + {ok, N1} = slave:start(Host, node1), + io:format("p2: deleting lock~n"), + global:del_lock(Id, [node()]), + io:format("p2: deleted lock~n"), + receive + step3 -> + ok + end, + io:format("p2: received step3~n"), + I = global:whereis_name(foo), + io:format("p2: name ~p~n", [I]), + ?line ?UNTIL(I =:= rpc:call(N1, global, whereis_name, [foo])), + I2 = I, + slave:stop(N1), + io:format("p2: name2 ~p~n", [I2]), + Parent ! {self(), I, I2}, + ok. + +%%% Test for the OTP-3576 problem: if nodes 1 and 2 are separated and +%%% brought together again, while keeping connection with 3, it could +%%% happen that if someone temporarily held the 'global' lock, +%%% 'try_again_locker' would be called, and this time cause both 1 and 2 +%%% to obtain a lock for 'global' on node 3, which would keep the +%%% name registry from ever becoming consistent again. +both_known_1(suite) -> []; +both_known_1(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + + ?line OrigNames = global:registered_names(), + + ?line [Cp1, Cp2, Cp3] = start_nodes([cp1, cp2, cp3], slave, Config), + + ?line wait_for_ready_net(Config), + + ?line rpc_disconnect_node(Cp1, Cp2, Config), + + ?line {_Pid1, yes} = rpc:call(Cp1, ?MODULE, start_proc, [p1]), + ?line {_Pid2, yes} = rpc:call(Cp2, ?MODULE, start_proc, [p2]), + + ?line Names10 = rpc:call(Cp1, global, registered_names, []), + ?line Names20 = rpc:call(Cp2, global, registered_names, []), + ?line Names30 = rpc:call(Cp3, global, registered_names, []), + + Names1 = Names10 -- OrigNames, + Names2 = Names20 -- OrigNames, + Names3 = Names30 -- OrigNames, + + ?line [p1] = lists:sort(Names1), + ?line [p2] = lists:sort(Names2), + ?line [p1, p2] = lists:sort(Names3), + + ?line Locker = spawn(Cp3, ?MODULE, lock_global2, [{global, l3}, + self()]), + + ?line receive + {locked, S} -> + true = S + end, + + ?line pong = rpc:call(Cp1, net_adm, ping, [Cp2]), + + %% Bring cp1 and cp2 together, while someone has locked global. + %% They will now loop in 'loop_locker'. + + ?line Names10_2 = rpc:call(Cp1, global, registered_names, []), + ?line Names20_2 = rpc:call(Cp2, global, registered_names, []), + ?line Names30_2 = rpc:call(Cp3, global, registered_names, []), + + Names1_2 = Names10_2 -- OrigNames, + Names2_2 = Names20_2 -- OrigNames, + Names3_2 = Names30_2 -- OrigNames, + + ?line [p1] = lists:sort(Names1_2), + ?line [p2] = lists:sort(Names2_2), + ?line [p1, p2] = lists:sort(Names3_2), + + %% Let go of the lock, and expect the lockers to resolve the name + %% registry. + Locker ! {ok, self()}, + + ?line + ?UNTIL(begin + ?line Names10_3 = rpc:call(Cp1, global, registered_names, []), + ?line Names20_3 = rpc:call(Cp2, global, registered_names, []), + ?line Names30_3 = rpc:call(Cp3, global, registered_names, []), + + Names1_3 = Names10_3 -- OrigNames, + Names2_3 = Names20_3 -- OrigNames, + Names3_3 = Names30_3 -- OrigNames, + + N1 = lists:sort(Names1_3), + N2 = lists:sort(Names2_3), + N3 = lists:sort(Names3_3), + (N1 =:= [p1, p2]) and (N2 =:= [p1, p2]) and (N3 =:= [p1, p2]) + end), + + write_high_level_trace(Config), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +lost_unregister(suite) -> []; +lost_unregister(doc) -> + ["OTP-6428. An unregistered name reappears."]; +lost_unregister(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + + ?line {ok, B} = start_node(b, Config), + ?line {ok, C} = start_node(c, Config), + Nodes = [node(), B, C], + + ?line wait_for_ready_net(Config), + + % start a proc and register it + ?line {Pid, yes} = start_proc(test), + + ?line ?UNTIL(Pid =:= global:whereis_name(test)), + ?line check_everywhere(Nodes, test, Config), + + ?line rpc_disconnect_node(B, C, Config), + ?line check_everywhere(Nodes, test, Config), + ?line _ = rpc:call(B, global, unregister_name, [test]), + ?line ?UNTIL(undefined =:= global:whereis_name(test)), + ?line Pid = rpc:call(C, global, whereis_name, [test]), + ?line check_everywhere(Nodes--[C], test, Config), + ?line pong = rpc:call(B, net_adm, ping, [C]), + + %% Now the name has reappeared on node B. + ?line ?UNTIL(Pid =:= global:whereis_name(test)), + ?line check_everywhere(Nodes, test, Config), + + exit_p(Pid), + + ?line ?UNTIL(undefined =:= global:whereis_name(test)), + ?line check_everywhere(Nodes, test, Config), + + write_high_level_trace(Config), + stop_node(B), + stop_node(C), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +-define(UNTIL_LOOP, 300). + +-define(end_tag, 'end at'). + +init_high_level_trace(Time) -> + Mul = try + test_server:timetrap_scale_factor() + catch _:_ -> 1 + end, + put(?end_tag, msec() + Time * Mul * 1000), + %% Assures that started nodes start the high level trace automatically. + ok = gen_server:call(global_name_server, high_level_trace_start,infinity), + os:putenv("GLOBAL_HIGH_LEVEL_TRACE", "TRUE"), + put(?nodes_tag, []). + +loop_until_true(Fun, Config) -> + case Fun() of + true -> + true; + _ -> + case get(?end_tag) of + undefined -> + timer:sleep(?UNTIL_LOOP), + loop_until_true(Fun, Config); + EndAt -> + Left = EndAt - msec(), + case Left < 6000 of + true -> + write_high_level_trace(Config), + Ref = make_ref(), + receive Ref -> ok end; + false -> + timer:sleep(?UNTIL_LOOP), + loop_until_true(Fun, Config) + end + end + end. + +write_high_level_trace(Config) -> + case erase(?nodes_tag) of + undefined -> + ok; + Nodes0 -> + Nodes = lists:usort([node() | Nodes0]), + write_high_level_trace(Nodes, Config) + end. + +write_high_level_trace(Nodes, Config) -> + When = now(), + %% 'info' returns more than the trace, which is nice. + Data = [{Node, {info, rpc:call(Node, global, info, [])}} || + Node <- Nodes], + Dir = ?config(priv_dir, Config), + DataFile = filename:join([Dir, lists:concat(["global_", ?testcase])]), + file:write_file(DataFile, term_to_binary({high_level_trace, When, Data})). + +lock_global2(Id, Parent) -> + S = global:set_lock(Id), + Parent ! {locked, S}, + receive + {ok, Parent} -> + ok + end. + +%%----------------------------------------------------------------- +%% Test suite for global names and locks. +%% Should be started in a CC view with: +%% erl -sname XXX -rsh ctrsh where XX not in [cp1, cp2, cp3] +%%----------------------------------------------------------------- + +%cp1 - cp3 are started, and the name 'test' registered for a process on +%test_server. Then it is checked that the name is registered on all +%nodes, using whereis_name and safe_whereis_name. Check that the same +%name can't be registered with another value. Exit the registered +%process and check that the name disappears. Register a new process +%(Pid2) under the name 'test'. Let another new process (Pid3) +%reregister itself under the same name. Test global:send/2. Test +%unregister. Kill Pid3. Start a process (Pid6) on cp3, +%register it as 'test', stop cp1 - cp3 and check that 'test' disappeared. +%Kill Pid2 and check that 'test' isn't registered. + +names(suite) -> []; +names(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line {ok, Cp1} = start_node(cp1, Config), + ?line {ok, Cp2} = start_node(cp2, Config), + ?line {ok, Cp3} = start_node(cp3, Config), + + ?line wait_for_ready_net(Config), + + % start a proc and register it + ?line {Pid, yes} = start_proc(test), + + % test that it is registered at all nodes + ?line + ?UNTIL(begin + (Pid =:= global:safe_whereis_name(test)) and + (Pid =:= rpc:call(Cp1, global, safe_whereis_name, [test])) and + (Pid =:= rpc:call(Cp2, global, safe_whereis_name, [test])) and + (Pid =:= rpc:call(Cp3, global, safe_whereis_name, [test])) and + (Pid =:= global:whereis_name(test)) and + (Pid =:= rpc:call(Cp1, global, whereis_name, [test])) and + (Pid =:= rpc:call(Cp2, global, whereis_name, [test])) and + (Pid =:= rpc:call(Cp3, global, whereis_name, [test])) and + ([test] =:= global:registered_names() -- OrigNames) + end), + + % try to register the same name + ?line no = global:register_name(test, self()), + ?line no = rpc:call(Cp1, global, register_name, [test, self()]), + + % let process exit, check that it is unregistered automatically + exit_p(Pid), + + ?line + ?UNTIL((undefined =:= global:whereis_name(test)) and + (undefined =:= rpc:call(Cp1, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp2, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp3, global, whereis_name, [test]))), + + % test re_register + ?line {Pid2, yes} = start_proc(test), + ?line ?UNTIL(Pid2 =:= rpc:call(Cp3, global, whereis_name, [test])), + Pid3 = rpc:call(Cp3, ?MODULE, start_proc2, [test]), + ?line ?UNTIL(Pid3 =:= rpc:call(Cp3, global, whereis_name, [test])), + Pid3 = global:whereis_name(test), + + % test sending + global:send(test, {ping, self()}), + receive + {pong, Cp3} -> ok + after + 2000 -> test_server:fail(timeout1) + end, + + rpc:call(Cp1, global, send, [test, {ping, self()}]), + receive + {pong, Cp3} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + + ?line _ = global:unregister_name(test), + ?line + ?UNTIL((undefined =:= global:whereis_name(test)) and + (undefined =:= rpc:call(Cp1, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp2, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp3, global, whereis_name, [test]))), + + exit_p(Pid3), + + ?line ?UNTIL(undefined =:= global:whereis_name(test)), + + % register a proc + ?line {_Pid6, yes} = rpc:call(Cp3, ?MODULE, start_proc, [test]), + + write_high_level_trace(Config), + % stop the nodes, and make sure names are released. + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + + ?line ?UNTIL(undefined =:= global:whereis_name(test)), + exit_p(Pid2), + + ?line ?UNTIL(undefined =:= global:whereis_name(test)), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +names_hidden(suite) -> []; +names_hidden(doc) -> + ["Tests that names on a hidden node doesn't interfere with names on " + "visible nodes."]; +names_hidden(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + ?line OrigNodes = nodes(), + + ?line {ok, Cp1} = start_node(cp1, Config), + ?line {ok, Cp2} = start_node(cp2, Config), + ?line {ok, Cp3} = start_hidden_node(cp3, Config), + ?line pong = rpc:call(Cp1, net_adm, ping, [Cp3]), + ?line pong = rpc:call(Cp3, net_adm, ping, [Cp2]), + ?line pong = rpc:call(Cp3, net_adm, ping, [node()]), + + ?line [] = [Cp1, Cp2 | OrigNodes] -- nodes(), + + % start a proc on hidden node and register it + ?line {HPid, yes} = rpc:call(Cp3, ?MODULE, start_proc, [test]), + ?line Cp3 = node(HPid), + + % Check that it didn't get registered on visible nodes + ?line + ?UNTIL((undefined =:= global:safe_whereis_name(test)) and + (undefined =:= rpc:call(Cp1, global, safe_whereis_name, [test])) and + (undefined =:= rpc:call(Cp2, global, safe_whereis_name, [test])) and + (undefined =:= global:whereis_name(test)) and + (undefined =:= rpc:call(Cp1, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp2, global, whereis_name, [test]))), + + % start a proc on visible node and register it + ?line {Pid, yes} = start_proc(test), + ?line true = (Pid =/= HPid), + + % test that it is registered at all nodes + ?line + ?UNTIL((Pid =:= global:safe_whereis_name(test)) and + (Pid =:= rpc:call(Cp1, global, safe_whereis_name, [test])) and + (Pid =:= rpc:call(Cp2, global, safe_whereis_name, [test])) and + (HPid =:= rpc:call(Cp3, global, safe_whereis_name, [test])) and + (Pid =:= global:whereis_name(test)) and + (Pid =:= rpc:call(Cp1, global, whereis_name, [test])) and + (Pid =:= rpc:call(Cp2, global, whereis_name, [test])) and + (HPid =:= rpc:call(Cp3, global, whereis_name, [test])) and + ([test] =:= global:registered_names() -- OrigNames)), + + % try to register the same name + ?line no = global:register_name(test, self()), + ?line no = rpc:call(Cp1, global, register_name, [test, self()]), + + % let process exit, check that it is unregistered automatically + exit_p(Pid), + + ?line + ?UNTIL((undefined =:= global:whereis_name(test)) and + (undefined =:= rpc:call(Cp1, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp2, global, whereis_name, [test])) and + (HPid =:= rpc:call(Cp3, global, whereis_name, [test]))), + + % test re_register + ?line {Pid2, yes} = start_proc(test), + ?line ?UNTIL(Pid2 =:= rpc:call(Cp2, global, whereis_name, [test])), + Pid3 = rpc:call(Cp2, ?MODULE, start_proc2, [test]), + ?line ?UNTIL(Pid3 =:= rpc:call(Cp2, global, whereis_name, [test])), + ?line Pid3 = global:whereis_name(test), + + % test sending + ?line Pid3 = global:send(test, {ping, self()}), + receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout1) + end, + + rpc:call(Cp1, global, send, [test, {ping, self()}]), + receive + {pong, Cp2} -> ok + after + 2000 -> test_server:fail(timeout2) + end, + + ?line _ = rpc:call(Cp3, global, unregister_name, [test]), + ?line + ?UNTIL((Pid3 =:= global:whereis_name(test)) and + (Pid3 =:= rpc:call(Cp1, global, whereis_name, [test])) and + (Pid3 =:= rpc:call(Cp2, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp3, global, whereis_name, [test]))), + + ?line _ = global:unregister_name(test), + ?line + ?UNTIL((undefined =:= global:whereis_name(test)) and + (undefined =:= rpc:call(Cp1, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp2, global, whereis_name, [test])) and + (undefined =:= rpc:call(Cp3, global, whereis_name, [test]))), + + exit_p(Pid3), + exit_p(HPid), + + ?line ?UNTIL(undefined =:= global:whereis_name(test)), + + write_high_level_trace(Config), + % stop the nodes, and make sure names are released. + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +locks(suite) -> []; +locks(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line {ok, Cp1} = start_node(cp1, Config), + ?line {ok, Cp2} = start_node(cp2, Config), + ?line {ok, Cp3} = start_node(cp3, Config), + + ?line wait_for_ready_net(Config), + + % start two procs + ?line Pid = start_proc(), + ?line Pid2 = rpc:call(Cp1, ?MODULE, start_proc, []), + % set a lock, and make sure noone else can set the same lock + ?line true = global:set_lock({test_lock, self()}, ?NODES, 1), + ?line false = req(Pid, {set_lock, test_lock, self()}), + ?line false = req(Pid2, {set_lock, test_lock, self()}), + % delete, and let another proc set the lock + global:del_lock({test_lock, self()}), + ?line true = req(Pid, {set_lock, test_lock, self()}), + ?line false = req(Pid2, {set_lock, test_lock, self()}), + ?line false = global:set_lock({test_lock, self()}, ?NODES,1), + % kill lock-holding proc, make sure the lock is released + exit_p(Pid), + ?UNTIL(true =:= global:set_lock({test_lock, self()}, ?NODES,1)), + Pid2 ! {set_lock_loop, test_lock, self()}, + % make sure we don't have the msg + receive + {got_lock, Pid2} -> test_server:fail(got_lock) + after + 1000 -> ok + end, + global:del_lock({test_lock, self()}), + % make sure pid2 got the lock + receive + {got_lock, Pid2} -> ok + after + % 12000 >> 5000, which is the max time before a new retry for + % set_lock + 12000 -> test_server:fail(got_lock2) + end, + + % let proc set the same lock + ?line true = req(Pid2, {set_lock, test_lock, self()}), + % let proc set new lock + ?line true = req(Pid2, {set_lock, test_lock2, self()}), + ?line false = global:set_lock({test_lock, self()},?NODES,1), + ?line false = global:set_lock({test_lock2, self()}, ?NODES,1), + exit_p(Pid2), +% erlang:display({locks1, ets:tab2list(global_locks)}), + ?UNTIL(true =:= global:set_lock({test_lock, self()}, ?NODES, 1)), + ?UNTIL(true =:= global:set_lock({test_lock2, self()}, ?NODES, 1)), + ?line global:del_lock({test_lock, self()}), + ?line global:del_lock({test_lock2, self()}), + + % let proc set two locks + ?line Pid3 = rpc:call(Cp1, ?MODULE, start_proc, []), + ?line true = req(Pid3, {set_lock, test_lock, self()}), + ?line true = req(Pid3, {set_lock, test_lock2, self()}), + % del one lock + ?line Pid3 ! {del_lock, test_lock2}, + ?line test_server:sleep(100), + % check that one lock is still set, but not the other + ?line false = global:set_lock({test_lock, self()}, ?NODES, 1), + ?line true = global:set_lock({test_lock2, self()}, ?NODES, 1), + ?line global:del_lock({test_lock2, self()}), + % kill lock-holder + exit_p(Pid3), +% erlang:display({locks2, ets:tab2list(global_locks)}), + ?UNTIL(true =:= global:set_lock({test_lock, self()}, ?NODES, 1)), + ?line global:del_lock({test_lock, self()}), + ?UNTIL(true =:= global:set_lock({test_lock2, self()}, ?NODES, 1)), + ?line global:del_lock({test_lock2, self()}), + + % start one proc on each node + ?line Pid4 = start_proc(), + ?line Pid5 = rpc:call(Cp1, ?MODULE, start_proc, []), + ?line Pid6 = rpc:call(Cp2, ?MODULE, start_proc, []), + ?line Pid7 = rpc:call(Cp3, ?MODULE, start_proc, []), + % set lock on two nodes + ?line true = req(Pid4, {set_lock, test_lock, self(), [node(), Cp1]}), + ?line false = req(Pid5, {set_lock, test_lock, self(), [node(), Cp1]}), + % set same lock on other two nodes + ?line true = req(Pid6, {set_lock, test_lock, self(), [Cp2, Cp3]}), + ?line false = req(Pid7, {set_lock, test_lock, self(), [Cp2, Cp3]}), + % release lock + Pid6 ! {del_lock, test_lock, [Cp2, Cp3]}, + % try to set lock on a node that already has the lock + ?line false = req(Pid6, {set_lock, test_lock, self(), [Cp1, Cp2, Cp3]}), + + % set lock on a node + exit_p(Pid4), + ?UNTIL(true =:= req(Pid5, {set_lock, test_lock, self(), [node(), Cp1]})), + ?line Pid8 = start_proc(), + ?line false = req(Pid8, {set_lock, test_lock, self()}), + write_high_level_trace(Config), + % stop the nodes, and make sure locks are released. + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + ?line test_server:sleep(100), + ?line true = req(Pid8, {set_lock, test_lock, self()}), + exit_p(Pid8), + ?line test_server:sleep(10), + + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + + +locks_hidden(suite) -> []; +locks_hidden(doc) -> + ["Tests that locks on a hidden node doesn't interere with locks on " + "visible nodes."]; +locks_hidden(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNodes = nodes(), + ?line {ok, Cp1} = start_node(cp1, Config), + ?line {ok, Cp2} = start_node(cp2, Config), + ?line {ok, Cp3} = start_hidden_node(cp3, Config), + ?line pong = rpc:call(Cp1, net_adm, ping, [Cp3]), + ?line pong = rpc:call(Cp3, net_adm, ping, [Cp2]), + ?line pong = rpc:call(Cp3, net_adm, ping, [node()]), + + ?line [] = [Cp1, Cp2 | OrigNodes] -- nodes(), + + % start two procs + ?line Pid = start_proc(), + ?line Pid2 = rpc:call(Cp1, ?MODULE, start_proc, []), + ?line HPid = rpc:call(Cp3, ?MODULE, start_proc, []), + % Make sure hidden node doesn't interfere with visible nodes lock + ?line true = req(HPid, {set_lock, test_lock, self()}), + ?line true = global:set_lock({test_lock, self()}, ?NODES, 1), + ?line false = req(Pid, {set_lock, test_lock, self()}), + ?line true = req(HPid, {del_lock_sync, test_lock, self()}), + ?line false = req(Pid2, {set_lock, test_lock, self()}), + % delete, and let another proc set the lock + global:del_lock({test_lock, self()}), + ?line true = req(Pid, {set_lock, test_lock, self()}), + ?line false = req(Pid2, {set_lock, test_lock, self()}), + ?line false = global:set_lock({test_lock, self()}, ?NODES,1), + % kill lock-holding proc, make sure the lock is released + exit_p(Pid), + ?UNTIL(true =:= global:set_lock({test_lock, self()}, ?NODES, 1)), + ?UNTIL(true =:= req(HPid, {set_lock, test_lock, self()})), + Pid2 ! {set_lock_loop, test_lock, self()}, + % make sure we don't have the msg + receive + {got_lock, Pid2} -> test_server:fail(got_lock) + after + 1000 -> ok + end, + global:del_lock({test_lock, self()}), + % make sure pid2 got the lock + receive + {got_lock, Pid2} -> ok + after + % 12000 >> 5000, which is the max time before a new retry for + % set_lock + 12000 -> test_server:fail(got_lock2) + end, + ?line true = req(HPid, {del_lock_sync, test_lock, self()}), + + % let proc set the same lock + ?line true = req(Pid2, {set_lock, test_lock, self()}), + % let proc set new lock + ?line true = req(Pid2, {set_lock, test_lock2, self()}), + ?line true = req(HPid, {set_lock, test_lock, self()}), + ?line true = req(HPid, {set_lock, test_lock2, self()}), + exit_p(HPid), + ?line false = global:set_lock({test_lock, self()},?NODES,1), + ?line false = global:set_lock({test_lock2, self()}, ?NODES,1), + exit_p(Pid2), +% erlang:display({locks1, ets:tab2list(global_locks)}), + ?UNTIL(true =:= global:set_lock({test_lock, self()}, ?NODES, 1)), + ?UNTIL(true =:= global:set_lock({test_lock2, self()}, ?NODES, 1)), + ?line global:del_lock({test_lock, self()}), + ?line global:del_lock({test_lock2, self()}), + + write_high_level_trace(Config), + % stop the nodes, and make sure locks are released. + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + + +bad_input(suite) -> []; +bad_input(Config) when is_list(Config) -> + Timeout = 15, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + Pid = whereis(global_name_server), + ?line {'EXIT', _} = (catch global:set_lock(bad_id)), + ?line {'EXIT', _} = (catch global:set_lock({id, self()}, bad_nodes)), + ?line {'EXIT', _} = (catch global:del_lock(bad_id)), + ?line {'EXIT', _} = (catch global:del_lock({id, self()}, bad_nodes)), + ?line {'EXIT', _} = (catch global:register_name(name, bad_pid)), + ?line {'EXIT', _} = (catch global:reregister_name(name, bad_pid)), + ?line {'EXIT', _} = (catch global:trans(bad_id, {m,f})), + ?line {'EXIT', _} = (catch global:trans({id, self()}, {m,f}, [node()], -1)), + ?line Pid = whereis(global_name_server), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +names_and_locks(suite) -> []; +names_and_locks(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line {ok, Cp1} = start_node(cp1, Config), + ?line {ok, Cp2} = start_node(cp2, Config), + ?line {ok, Cp3} = start_node(cp3, Config), + + % start one proc on each node + ?line PidTS = start_proc(), + ?line Pid1 = rpc:call(Cp1, ?MODULE, start_proc, []), + ?line Pid2 = rpc:call(Cp2, ?MODULE, start_proc, []), + ?line Pid3 = rpc:call(Cp3, ?MODULE, start_proc, []), + % register some of them + ?line yes = global:register_name(test1, Pid1), + ?line yes = global:register_name(test2, Pid2), + ?line yes = global:register_name(test3, Pid3), + ?line no = global:register_name(test3, PidTS), + ?line yes = global:register_name(test4, PidTS), + + % set lock on two nodes + ?line true = req(PidTS, {set_lock, test_lock, self(), [node(), Cp1]}), + ?line false = req(Pid1, {set_lock, test_lock, self(), [node(), Cp1]}), + % set same lock on other two nodes + ?line true = req(Pid2, {set_lock, test_lock, self(), [Cp2, Cp3]}), + ?line false = req(Pid3, {set_lock, test_lock, self(), [Cp2, Cp3]}), + % release lock + Pid2 ! {del_lock, test_lock, [Cp2, Cp3]}, + ?line test_server:sleep(100), + % try to set lock on a node that already has the lock + ?line false = req(Pid2, {set_lock, test_lock, self(), [Cp1, Cp2, Cp3]}), + % set two locks + ?line true = req(Pid2, {set_lock, test_lock, self(), [Cp2, Cp3]}), + ?line true = req(Pid2, {set_lock, test_lock2, self(), [Cp2, Cp3]}), + + % kill some processes, make sure all locks/names are released + exit_p(PidTS), + ?line ?UNTIL(undefined =:= global:whereis_name(test4)), + ?line true = global:set_lock({test_lock, self()}, [node(), Cp1], 1), + global:del_lock({test_lock, self()}, [node(), Cp1]), + + exit_p(Pid2), + ?line + ?UNTIL((undefined =:= global:whereis_name(test2)) and + (true =:= global:set_lock({test_lock, self()}, [Cp2, Cp3], 1)) and + (true =:= global:set_lock({test_lock2, self()}, [Cp2, Cp3], 1))), + + global:del_lock({test_lock, self()}, [Cp2, Cp3]), + global:del_lock({test_lock2, self()}, [Cp2, Cp3]), + + exit_p(Pid1), + exit_p(Pid3), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + + write_high_level_trace(Config), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +lock_die(suite) -> []; +lock_die(doc) -> + ["OTP-6341. Remove locks using monitors."]; +lock_die(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line {ok, Cp1} = start_node(cp1, Config), + ?line {ok, Cp2} = start_node(cp2, Config), + + %% First test. + LockId = {id, self()}, + ?line Pid2 = start_proc(), + ?line true = req(Pid2, {set_lock2, LockId, self()}), + + ?line true = global:set_lock(LockId, [Cp1]), + %% Id is locked on Cp1 and Cp2 (by Pid2) but not by self(): + %% (there is no mon. ref) + ?line _ = global:del_lock(LockId, [node(), Cp1, Cp2]), + + ?line exit_p(Pid2), + + %% Second test. + ?line Pid3 = start_proc(), + ?line true = req(Pid3, {set_lock, id, self(), [Cp1]}), + %% The lock is removed from Cp1 thanks to monitors. + ?line exit_p(Pid3), + + ?line true = global:set_lock(LockId, [node(), Cp1]), + ?line _ = global:del_lock(LockId, [node(), Cp1]), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + write_high_level_trace(Config), + stop_node(Cp1), + stop_node(Cp2), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +name_die(suite) -> []; +name_die(doc) -> + ["OTP-6341. Remove names using monitors."]; +name_die(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + ?line [Cp1] = Cps = start_nodes([z], peer, Config), % z > test_server + Nodes = lists:sort([node() | Cps]), + ?line wait_for_ready_net(Config), + + Name = name_die, + ?line Pid = rpc:call(Cp1, ?MODULE, start_proc, []), + + %% Test 1. No resolver is called if the same pid is registered on + %% both partitions. + T1 = node(), + Part1 = [T1], + Part2 = [Cp1], + ?line rpc_cast(Cp1, + ?MODULE, part_2_2, [Config, + Part1, + Part2, + []]), + ?line ?UNTIL(is_ready_partition(Config)), + ?line ?UNTIL(undefined =:= global:whereis_name(Name)), + ?line yes = global:register_name(Name, Pid), + + ?line pong = net_adm:ping(Cp1), + ?line wait_for_ready_net(Nodes, Config), + ?line assert_pid(global:whereis_name(Name)), + exit_p(Pid), + ?line ?UNTIL(OrigNames =:= global:registered_names()), + + %% Test 2. Register a name running outside the current partition. + %% Killing the pid will not remove the name from the current + %% partition, unless monitors are used. + ?line Pid2 = rpc:call(Cp1, ?MODULE, start_proc, []), + Dir = ?config(priv_dir, Config), + KillFile = filename:join([Dir, "kill.txt"]), + file:delete(KillFile), + ?line erlang:spawn(Cp1, fun() -> kill_pid(Pid2, KillFile, Config) end), + ?line rpc_cast(Cp1, + ?MODULE, part_2_2, [Config, + Part1, + Part2, + []]), + ?line ?UNTIL(is_ready_partition(Config)), + ?line ?UNTIL(undefined =:= global:whereis_name(Name)), + ?line yes = global:register_name(Name, Pid2), + ?line touch(KillFile, "kill"), + ?line file_contents(KillFile, "done", Config), + file:delete(KillFile), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + write_high_level_trace(Config), + stop_nodes(Cps), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +kill_pid(Pid, File, Config) -> + file_contents(File, "kill", Config), + exit_p(Pid), + touch(File, "done"). + +basic_partition(suite) -> []; +basic_partition(doc) -> + ["Tests that two partitioned networks exchange correct info."]; +basic_partition(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [Cp1, Cp2, Cp3] = start_nodes([cp1, cp2, cp3], peer, Config), + ?line [Cp1, Cp2, Cp3] = lists:sort(nodes()), + + ?line wait_for_ready_net(Config), + + % make cp2 and cp3 connected, partitioned from us and cp1 + ?line rpc_cast(Cp2, ?MODULE, part1, [Config, node(), Cp1, Cp3]), + ?line ?UNTIL(is_ready_partition(Config)), + + % start different processes in both partitions + ?line {Pid, yes} = start_proc(test), + + % connect to other partition + ?line pong = net_adm:ping(Cp2), + ?line pong = net_adm:ping(Cp3), + ?line [Cp1, Cp2, Cp3] = lists:sort(nodes()), + + % check names + ?line ?UNTIL(Pid =:= rpc:call(Cp2, global, whereis_name, [test])), + ?line ?UNTIL(undefined =/= global:whereis_name(test2)), + ?line Pid2 = global:whereis_name(test2), + ?line Pid2 = rpc:call(Cp2, global, whereis_name, [test2]), + ?line assert_pid(Pid2), + ?line Pid3 = global:whereis_name(test4), + ?line ?UNTIL(Pid3 =:= rpc:call(Cp1, global, whereis_name, [test4])), + ?line assert_pid(Pid3), + + % kill all procs + ?line Pid3 = global:send(test4, die), + % sleep to let the proc die + wait_for_exit(Pid3), + ?line ?UNTIL(undefined =:= global:whereis_name(test4)), + + exit_p(Pid), + exit_p(Pid2), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + + write_high_level_trace(Config), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +basic_name_partition(suite) -> + []; +basic_name_partition(doc) -> + ["Creates two partitions with two nodes in each partition.", + "Tests that names are exchanged correctly, and that EXITs", + "during connect phase are handled correctly."]; +basic_name_partition(Config) when is_list(Config) -> + Timeout = 60, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [Cp1, Cp2, Cp3] = start_nodes([cp1, cp2, cp3], peer, Config), + ?line [Cp1, Cp2, Cp3] = lists:sort(nodes()), + Nodes = ?NODES, + + ?line wait_for_ready_net(Config), + + % There used to be more than one name registered for some + % processes. That was a mistake; there is no support for more than + % one name per process, and the manual is quite clear about that + % ("equivalent to the register/2 and whereis/1 BIFs"). The + % resolver procedure did not take care of such "duplicated" names, + % which caused this testcase to fail every now and then. + + % make cp2 and cp3 connected, partitioned from us and cp1 + % us: register name03 + % cp1: register name12 + % cp2: register name12 + % cp3: register name03 + + ?line rpc_cast(Cp2, ?MODULE, part1_5, [Config, node(), Cp1, Cp3]), + ?line ?UNTIL(is_ready_partition(Config)), + + % start different processes in both partitions + ?line {_, yes} = start_proc_basic(name03), + ?line {_, yes} = rpc:call(Cp1, ?MODULE, start_proc_basic, [name12]), + test_server:sleep(1000), + + % connect to other partition + ?line pong = net_adm:ping(Cp3), + + ?line ?UNTIL([Cp1, Cp2, Cp3] =:= lists:sort(nodes())), + ?line wait_for_ready_net(Config), + % check names + ?line Pid03 = global:whereis_name(name03), + ?line assert_pid(Pid03), + ?line true = lists:member(node(Pid03), [node(), Cp3]), + ?line check_everywhere(Nodes, name03, Config), + + ?line Pid12 = global:whereis_name(name12), + ?line assert_pid(Pid12), + ?line true = lists:member(node(Pid12), [Cp1, Cp2]), + ?line check_everywhere(Nodes, name12, Config), + + % kill all procs + ?line Pid12 = global:send(name12, die), + ?line Pid03 = global:send(name03, die), + % sleep to let the procs die + wait_for_exit(Pid12), + wait_for_exit(Pid03), + ?line + ?UNTIL(begin + Names = [name03, name12], + lists:duplicate(length(Names), undefined) + =:= [global:whereis_name(Name) || Name <- Names] + end), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + + write_high_level_trace(Config), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +%Peer nodes cp0 - cp6 are started. Break apart the connections from +%cp3-cp6 to cp0-cp2 and test_server so we get two partitions. +%In the cp3-cp6 partition, start one process on each node and register +%using both erlang:register, and global:register (test1 on cp3, test2 on +%cp4, test3 on cp5, test4 on cp6), using different resolution functions: +%default for test1, notify_all_name for test2, random_notify_name for test3 +%and one for test4 that sends a message to test_server and keeps the +%process which is greater in the standard ordering. In the other partition, +%do the same (test1 on test_server, test2 on cp0, test3 on cp1, test4 on cp2). +%Sleep a little, then from test_server, connect to cp3-cp6 in order. +%Check that the values for the registered names are the expected ones, and +%that the messages from test4 arrive. + +advanced_partition(suite) -> + []; +advanced_partition(doc) -> + ["Test that names are resolved correctly when two", + "partitioned networks connect."]; +advanced_partition(Config) when is_list(Config) -> + Timeout = 60, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [Cp0, Cp1, Cp2, Cp3, Cp4, Cp5, Cp6] + = start_nodes([cp0, cp1, cp2, cp3, cp4, cp5, cp6], peer, Config), + Nodes = lists:sort([node(), Cp0, Cp1, Cp2, Cp3, Cp4, Cp5, Cp6]), + ?line wait_for_ready_net(Config), + + % make cp3-cp6 connected, partitioned from us and cp0-cp2 + ?line rpc_cast(Cp3, ?MODULE, part2, + [Config, self(), node(), Cp0, Cp1, Cp2, Cp3, Cp4, Cp5,Cp6]), + ?line ?UNTIL(is_ready_partition(Config)), + + % start different processes in this partition + ?line start_procs(self(), Cp0, Cp1, Cp2, Config), + + % connect to other partition + ?line pong = net_adm:ping(Cp3), + ?line pong = net_adm:ping(Cp4), + ?line pong = net_adm:ping(Cp5), + ?line pong = net_adm:ping(Cp6), + + ?line wait_for_ready_net(Config), + + ?line + ?UNTIL(lists:member(undefined, + [rpc:call(Cp3, erlang, whereis, [test1]), + rpc:call(node(), erlang, whereis, [test1])])), + + Nt1 = rpc:call(Cp3, erlang, whereis, [test1]), + Nt2 = rpc:call(Cp4, erlang, whereis, [test2]), + Nt3 = rpc:call(Cp5, erlang, whereis, [test3]), + Nt4 = rpc:call(Cp6, erlang, whereis, [test4]), + + Mt1 = rpc:call(node(), erlang, whereis, [test1]), + Mt2 = rpc:call(Cp0, erlang, whereis, [test2]), + Mt3 = rpc:call(Cp1, erlang, whereis, [test3]), + _Mt4 = rpc:call(Cp2, erlang, whereis, [test4]), + + % check names + ?line Pid1 = global:whereis_name(test1), + ?line Pid1 = rpc:call(Cp3, global, whereis_name, [test1]), + ?line assert_pid(Pid1), + ?line true = lists:member(Pid1, [Nt1, Mt1]), + ?line true = lists:member(undefined, [Nt1, Mt1]), + ?line check_everywhere(Nodes, test1, Config), + + ?line undefined = global:whereis_name(test2), + ?line undefined = rpc:call(Cp3, global, whereis_name, [test2]), + ?line yes = sreq(Nt2, {got_notify, self()}), + ?line yes = sreq(Mt2, {got_notify, self()}), + ?line check_everywhere(Nodes, test2, Config), + + ?line Pid3 = global:whereis_name(test3), + ?line Pid3 = rpc:call(Cp3, global, whereis_name, [test3]), + ?line assert_pid(Pid3), + ?line true = lists:member(Pid3, [Nt3, Mt3]), + ?line no = sreq(Pid3, {got_notify, self()}), + ?line yes = sreq(other(Pid3, [Nt2, Nt3]), {got_notify, self()}), + ?line check_everywhere(Nodes, test3, Config), + + ?line Pid4 = global:whereis_name(test4), + ?line Pid4 = rpc:call(Cp3, global, whereis_name, [test4]), + ?line assert_pid(Pid4), +% ?line true = lists:member(Pid4, [Nt4, Mt4]), + ?line Pid4 = Nt4, + ?line check_everywhere(Nodes, test4, Config), + + ?line 1 = collect_resolves(), + + ?line Pid1 = global:send(test1, die), + exit_p(Pid3), + exit_p(Pid4), + wait_for_exit(Pid1), + wait_for_exit(Pid3), + ?line ?UNTIL(OrigNames =:= global:registered_names()), + + write_high_level_trace(Config), + stop_node(Cp0), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(Cp4), + stop_node(Cp5), + stop_node(Cp6), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +%Peer nodes cp0 - cp6 are started, and partitioned just like in +%advanced_partition. Start cp8, only connected to test_server. Let cp6 +%break apart from the rest, and 12 s later, ping cp0 and cp3, and +%register the name test5. After the same 12 s, let cp5 halt. +%Wait for the death of cp5. Ping cp3 (at the same time as cp6 does). +%Take down cp2. Start cp7, restart cp2. Ping cp4, cp6 and cp8. +%Now, expect all nodes to be connected and have the same picture of all +%registered names. + +stress_partition(suite) -> + []; +stress_partition(doc) -> + ["Stress global, make a partitioned net, make some nodes", + "go up/down a bit."]; +stress_partition(Config) when is_list(Config) -> + Timeout = 90, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [Cp0, Cp1, Cp2, Cp3, Cp4, Cp5, Cp6] + = start_nodes([cp0, cp1, cp2, cp3, cp4, cp5, cp6], peer, Config), + + ?line wait_for_ready_net(Config), + + % make cp3-cp5 connected, partitioned from us and cp0-cp2 + % cp6 is alone (single node). cp6 pings cp0 and cp3 in 12 secs... + ?line rpc_cast(Cp3, ?MODULE, part3, + [Config, self(), node(), Cp0, Cp1, Cp2, Cp3, Cp4, Cp5,Cp6]), + ?line ?UNTIL(is_ready_partition(Config)), + + % start different processes in this partition + ?line start_procs(self(), Cp0, Cp1, Cp2, Config), + + ?line {ok, Cp8} = start_peer_node(cp8, Config), + + monitor_node(Cp5, true), + receive + {nodedown, Cp5} -> ok + after + 20000 -> test_server:fail({no_nodedown, Cp5}) + end, + monitor_node(Cp5, false), + + % Ok, now cp6 pings us, and cp5 will go down. + + % connect to other partition + ?line pong = net_adm:ping(Cp3), + ?line rpc_cast(Cp2, ?MODULE, crash, [0]), + + % Start new nodes + ?line {ok, Cp7} = start_peer_node(cp7, Config), + ?line {ok, Cp2_2} = start_peer_node(cp2, Config), + Nodes = lists:sort([node(), Cp0, Cp1, Cp2_2, Cp3, Cp4, Cp6, Cp7, Cp8]), + put(?nodes_tag, Nodes), + + ?line pong = net_adm:ping(Cp4), + ?line pong = net_adm:ping(Cp6), + ?line pong = net_adm:ping(Cp8), + + ?line wait_for_ready_net(Nodes, Config), + + % Make sure that all nodes have the same picture of all names + ?line check_everywhere(Nodes, test1, Config), + ?line assert_pid(global:whereis_name(test1)), + + ?line check_everywhere(Nodes, test2, Config), + ?line undefined = global:whereis_name(test2), + + ?line check_everywhere(Nodes, test3, Config), + ?line assert_pid(global:whereis_name(test3)), + + ?line check_everywhere(Nodes, test4, Config), + ?line assert_pid(global:whereis_name(test4)), + + ?line check_everywhere(Nodes, test5, Config), + ?line ?UNTIL(undefined =:= global:whereis_name(test5)), + + ?line assert_pid(global:send(test1, die)), + ?line assert_pid(global:send(test3, die)), + ?line assert_pid(global:send(test4, die)), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + + write_high_level_trace(Config), + stop_node(Cp0), + stop_node(Cp1), + stop_node(Cp2_2), + stop_node(Cp3), + stop_node(Cp4), + stop_node(Cp5), + stop_node(Cp6), + stop_node(Cp7), + stop_node(Cp8), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + + +%% Use this one to test alot of connection tests +%% erl -sname ts -rsh ctrsh -pa /clearcase/otp/internal_tools/test_server/ebin/ -ring_line 10000 -s test_server run_test global_SUITE + +ring_line(suite) -> []; +ring_line(doc) -> [""]; +ring_line(Config) when is_list(Config) -> + {ok, [[N]]} = init:get_argument(ring_line), + loop_it(list_to_integer(N), Config). + +loop_it(N, Config) -> loop_it(N,N, Config). + +loop_it(0,_, _Config) -> ok; +loop_it(N,M, Config) -> + test_server:format(1, "Round: ~w", [M-N]), + ring(Config), + line(Config), + loop_it(N-1,M, Config). + + +ring(suite) -> + []; +ring(doc) -> + ["Make 10 single nodes, all having the same name.", + "Make all ping its predecessor, pinging in a ring.", + "Make sure that there's just one winner."]; +ring(Config) when is_list(Config) -> + Timeout = 60, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [Cp0, Cp1, Cp2, Cp3, Cp4, Cp5, Cp6, Cp7, Cp8] + = start_nodes([cp0, cp1, cp2, cp3, cp4, cp5, cp6, cp7, cp8], + peer, Config), + Nodes = lists:sort([node(), Cp0, Cp1, Cp2, Cp3, Cp4, Cp5, Cp6, Cp7, Cp8]), + + ?line wait_for_ready_net(Config), + + Time = msec() + 7000, + + ?line rpc_cast(Cp0, ?MODULE, single_node, [Time, Cp8, Config]), + ?line rpc_cast(Cp1, ?MODULE, single_node, [Time, Cp0, Config]), + ?line rpc_cast(Cp2, ?MODULE, single_node, [Time, Cp1, Config]), + ?line rpc_cast(Cp3, ?MODULE, single_node, [Time, Cp2, Config]), + ?line rpc_cast(Cp4, ?MODULE, single_node, [Time, Cp3, Config]), + ?line rpc_cast(Cp5, ?MODULE, single_node, [Time, Cp4, Config]), + ?line rpc_cast(Cp6, ?MODULE, single_node, [Time, Cp5, Config]), + ?line rpc_cast(Cp7, ?MODULE, single_node, [Time, Cp6, Config]), + ?line rpc_cast(Cp8, ?MODULE, single_node, [Time, Cp7, Config]), + + % sleep to make the partitioned net ready + test_server:sleep(Time - msec()), + + ?line pong = net_adm:ping(Cp0), + ?line pong = net_adm:ping(Cp1), + ?line pong = net_adm:ping(Cp2), + ?line pong = net_adm:ping(Cp3), + ?line pong = net_adm:ping(Cp4), + ?line pong = net_adm:ping(Cp5), + ?line pong = net_adm:ping(Cp6), + ?line pong = net_adm:ping(Cp7), + ?line pong = net_adm:ping(Cp8), + + ?line pong = net_adm:ping(Cp0), + ?line pong = net_adm:ping(Cp1), + ?line pong = net_adm:ping(Cp2), + ?line pong = net_adm:ping(Cp3), + ?line pong = net_adm:ping(Cp4), + ?line pong = net_adm:ping(Cp5), + ?line pong = net_adm:ping(Cp6), + ?line pong = net_adm:ping(Cp7), + ?line pong = net_adm:ping(Cp8), + + ?line wait_for_ready_net(Nodes, Config), + + % Just make sure that all nodes have the same picture of all names + ?line check_everywhere(Nodes, single_name, Config), + ?line assert_pid(global:whereis_name(single_name)), + + ?line + ?UNTIL(begin + {Ns2, []} = rpc:multicall(Nodes, erlang, whereis, + [single_name]), + 9 =:= lists:foldl(fun(undefined, N) -> N + 1; + (_, N) -> N + end, + 0, Ns2) + end), + + ?line assert_pid(global:send(single_name, die)), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + + write_high_level_trace(Config), + stop_node(Cp0), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(Cp4), + stop_node(Cp5), + stop_node(Cp6), + stop_node(Cp7), + stop_node(Cp8), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +simple_ring(suite) -> + []; +simple_ring(doc) -> + ["Simpler version of the ring case. Used because there are some", + "distribution problems with many nodes.", + "Make 6 single nodes, all having the same name.", + "Make all ping its predecessor, pinging in a ring.", + "Make sure that there's just one winner."]; +simple_ring(Config) when is_list(Config) -> + Timeout = 60, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + Names = [cp0, cp1, cp2, cp3, cp4, cp5], + ?line [Cp0, Cp1, Cp2, Cp3, Cp4, Cp5] + = start_nodes(Names, peer, Config), + Nodes = lists:sort([node(), Cp0, Cp1, Cp2, Cp3, Cp4, Cp5]), + + ?line wait_for_ready_net(Config), + + Time = msec() + 5000, + + ?line rpc_cast(Cp0, ?MODULE, single_node, [Time, Cp5, Config]), + ?line rpc_cast(Cp1, ?MODULE, single_node, [Time, Cp0, Config]), + ?line rpc_cast(Cp2, ?MODULE, single_node, [Time, Cp1, Config]), + ?line rpc_cast(Cp3, ?MODULE, single_node, [Time, Cp2, Config]), + ?line rpc_cast(Cp4, ?MODULE, single_node, [Time, Cp3, Config]), + ?line rpc_cast(Cp5, ?MODULE, single_node, [Time, Cp4, Config]), + + % sleep to make the partitioned net ready + test_server:sleep(Time - msec()), + + ?line pong = net_adm:ping(Cp0), + ?line pong = net_adm:ping(Cp1), + ?line pong = net_adm:ping(Cp2), + ?line pong = net_adm:ping(Cp3), + ?line pong = net_adm:ping(Cp4), + ?line pong = net_adm:ping(Cp5), + + ?line pong = net_adm:ping(Cp0), + ?line pong = net_adm:ping(Cp1), + ?line pong = net_adm:ping(Cp2), + ?line pong = net_adm:ping(Cp3), + ?line pong = net_adm:ping(Cp4), + ?line pong = net_adm:ping(Cp5), + + ?line wait_for_ready_net(Nodes, Config), + + % Just make sure that all nodes have the same picture of all names + ?line check_everywhere(Nodes, single_name, Config), + ?line assert_pid(global:whereis_name(single_name)), + + ?line + ?UNTIL(begin + {Ns2, []} = rpc:multicall(Nodes, erlang, whereis, + [single_name]), + 6 =:= lists:foldl(fun(undefined, N) -> N + 1; + (_, N) -> N + end, + 0, Ns2) + end), + + ?line assert_pid(global:send(single_name, die)), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + + write_high_level_trace(Config), + stop_node(Cp0), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(Cp4), + stop_node(Cp5), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +line(suite) -> + []; +line(doc) -> + ["Make 6 single nodes, all having the same name.", + "Make all ping its predecessor, pinging in a line.", + "Make sure that there's just one winner."]; +line(Config) when is_list(Config) -> + Timeout = 60, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [Cp0, Cp1, Cp2, Cp3, Cp4, Cp5, Cp6, Cp7, Cp8] + = start_nodes([cp0, cp1, cp2, cp3, cp4, cp5, cp6, cp7, cp8], + peer, Config), + Nodes = lists:sort([node(), Cp0, Cp1, Cp2, Cp3, Cp4, Cp5, Cp6, Cp7, Cp8]), + + ?line wait_for_ready_net(Config), + + Time = msec() + 7000, + + ?line rpc_cast(Cp0, ?MODULE, single_node, + [Time, Cp0, Config]), % ping ourself! + ?line rpc_cast(Cp1, ?MODULE, single_node, [Time, Cp0, Config]), + ?line rpc_cast(Cp2, ?MODULE, single_node, [Time, Cp1, Config]), + ?line rpc_cast(Cp3, ?MODULE, single_node, [Time, Cp2, Config]), + ?line rpc_cast(Cp4, ?MODULE, single_node, [Time, Cp3, Config]), + ?line rpc_cast(Cp5, ?MODULE, single_node, [Time, Cp4, Config]), + ?line rpc_cast(Cp6, ?MODULE, single_node, [Time, Cp5, Config]), + ?line rpc_cast(Cp7, ?MODULE, single_node, [Time, Cp6, Config]), + ?line rpc_cast(Cp8, ?MODULE, single_node, [Time, Cp7, Config]), + + % sleep to make the partitioned net ready + test_server:sleep(Time - msec()), + + ?line pong = net_adm:ping(Cp0), + ?line pong = net_adm:ping(Cp1), + ?line pong = net_adm:ping(Cp2), + ?line pong = net_adm:ping(Cp3), + ?line pong = net_adm:ping(Cp4), + ?line pong = net_adm:ping(Cp5), + ?line pong = net_adm:ping(Cp6), + ?line pong = net_adm:ping(Cp7), + ?line pong = net_adm:ping(Cp8), + + ?line pong = net_adm:ping(Cp0), + ?line pong = net_adm:ping(Cp1), + ?line pong = net_adm:ping(Cp2), + ?line pong = net_adm:ping(Cp3), + ?line pong = net_adm:ping(Cp4), + ?line pong = net_adm:ping(Cp5), + ?line pong = net_adm:ping(Cp6), + ?line pong = net_adm:ping(Cp7), + ?line pong = net_adm:ping(Cp8), + + ?line wait_for_ready_net(Nodes, Config), + + % Just make sure that all nodes have the same picture of all names + ?line check_everywhere(Nodes, single_name, Config), + ?line assert_pid(global:whereis_name(single_name)), + + ?line + ?UNTIL(begin + {Ns2, []} = rpc:multicall(Nodes, erlang, whereis, + [single_name]), + 9 =:= lists:foldl(fun(undefined, N) -> N + 1; + (_, N) -> N + end, + 0, Ns2) + end), + + ?line assert_pid(global:send(single_name, die)), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + + write_high_level_trace(Config), + stop_node(Cp0), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(Cp4), + stop_node(Cp5), + stop_node(Cp6), + stop_node(Cp7), + stop_node(Cp8), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + + +simple_line(suite) -> + []; +simple_line(doc) -> + ["Simpler version of the line case. Used because there are some", + "distribution problems with many nodes.", + "Make 6 single nodes, all having the same name.", + "Make all ping its predecessor, pinging in a line.", + "Make sure that there's just one winner."]; +simple_line(Config) when is_list(Config) -> + Timeout = 60, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [Cp0, Cp1, Cp2, Cp3, Cp4, Cp5] + = start_nodes([cp0, cp1, cp2, cp3, cp4, cp5], peer, Config), + Nodes = lists:sort([node(), Cp0, Cp1, Cp2, Cp3, Cp4, Cp5]), + + ?line wait_for_ready_net(Config), + + Time = msec() + 5000, + + ?line rpc_cast(Cp0, ?MODULE, single_node, + [Time, Cp0, Config]), % ping ourself! + ?line rpc_cast(Cp1, ?MODULE, single_node, [Time, Cp0, Config]), + ?line rpc_cast(Cp2, ?MODULE, single_node, [Time, Cp1, Config]), + ?line rpc_cast(Cp3, ?MODULE, single_node, [Time, Cp2, Config]), + ?line rpc_cast(Cp4, ?MODULE, single_node, [Time, Cp3, Config]), + ?line rpc_cast(Cp5, ?MODULE, single_node, [Time, Cp4, Config]), + + % sleep to make the partitioned net ready + test_server:sleep(Time - msec()), + + ?line pong = net_adm:ping(Cp0), + ?line pong = net_adm:ping(Cp1), + ?line pong = net_adm:ping(Cp2), + ?line pong = net_adm:ping(Cp3), + ?line pong = net_adm:ping(Cp4), + ?line pong = net_adm:ping(Cp5), + + ?line pong = net_adm:ping(Cp0), + ?line pong = net_adm:ping(Cp1), + ?line pong = net_adm:ping(Cp2), + ?line pong = net_adm:ping(Cp3), + ?line pong = net_adm:ping(Cp4), + ?line pong = net_adm:ping(Cp5), + + ?line wait_for_ready_net(Nodes, Config), + + % Just make sure that all nodes have the same picture of all names + ?line check_everywhere(Nodes, single_name, Config), + ?line assert_pid(global:whereis_name(single_name)), + + ?line + ?UNTIL(begin + {Ns2, []} = rpc:multicall(Nodes, erlang, whereis, + [single_name]), + 6 =:= lists:foldl(fun(undefined, N) -> N + 1; + (_, N) -> N + end, + 0, Ns2) + end), + + ?line assert_pid(global:send(single_name, die)), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + + write_high_level_trace(Config), + stop_node(Cp0), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(Cp4), + stop_node(Cp5), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +otp_1849(suite) -> []; +otp_1849(doc) -> + ["Test ticket: Global should keep track of all pids that set the same lock."]; +otp_1849(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line {ok, Cp1} = start_node(cp1, Config), + ?line {ok, Cp2} = start_node(cp2, Config), + ?line {ok, Cp3} = start_node(cp3, Config), + + ?line wait_for_ready_net(Config), + + % start procs on each node + ?line Pid1 = rpc:call(Cp1, ?MODULE, start_proc, []), + ?line assert_pid(Pid1), + ?line Pid2 = rpc:call(Cp2, ?MODULE, start_proc, []), + ?line assert_pid(Pid2), + ?line Pid3 = rpc:call(Cp3, ?MODULE, start_proc, []), + ?line assert_pid(Pid3), + + % set a lock on every node + ?line true = req(Pid1, {set_lock2, {test_lock, ?MODULE}, self()}), + ?line true = req(Pid2, {set_lock2, {test_lock, ?MODULE}, self()}), + ?line true = req(Pid3, {set_lock2, {test_lock, ?MODULE}, self()}), + + ?line + ?UNTIL(begin + [{test_lock, ?MODULE, Lock1}] = + rpc:call(Cp1, ets, tab2list, [global_locks]), + 3 =:= length(Lock1) + end), + + ?line true = req(Pid3, {del_lock2, {test_lock, ?MODULE}, self()}), + ?line + ?UNTIL(begin + [{test_lock, ?MODULE, Lock2}] = + rpc:call(Cp1, ets, tab2list, [global_locks]), + 2 =:= length(Lock2) + end), + + ?line true = req(Pid2, {del_lock2, {test_lock, ?MODULE}, self()}), + ?line + ?UNTIL(begin + [{test_lock, ?MODULE, Lock3}] = + rpc:call(Cp1, ets, tab2list, [global_locks]), + 1 =:= length(Lock3) + end), + + ?line true = req(Pid1, {del_lock2, {test_lock, ?MODULE}, self()}), + ?line ?UNTIL([] =:= rpc:call(Cp1, ets, tab2list, [global_locks])), + + + ?line true = req(Pid1, {set_lock2, {test_lock, ?MODULE}, self()}), + ?line true = req(Pid2, {set_lock2, {test_lock, ?MODULE}, self()}), + ?line true = req(Pid3, {set_lock2, {test_lock, ?MODULE}, self()}), + ?line false = req(Pid2, {set_lock2, {test_lock, not_valid}, self()}), + + exit_p(Pid1), + ?line + ?UNTIL(begin + [{test_lock, ?MODULE, Lock10}] = + rpc:call(Cp1, ets, tab2list, [global_locks]), + 2 =:= length(Lock10) + end), + ?line + ?UNTIL(begin + [{test_lock, ?MODULE, Lock11}] = + rpc:call(Cp2, ets, tab2list, [global_locks]), + 2 =:= length(Lock11) + end), + ?line + ?UNTIL(begin + [{test_lock, ?MODULE, Lock12}] = + rpc:call(Cp3, ets, tab2list, [global_locks]), + 2 =:= length(Lock12) + end), + + write_high_level_trace(Config), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + + +otp_3162(suite) -> []; +otp_3162(doc) -> + ["Test ticket: Deadlock in global"]; +otp_3162(Config) when is_list(Config) -> + StartFun = fun() -> + {ok, Cp1} = start_node(cp1, Config), + {ok, Cp2} = start_node(cp2, Config), + {ok, Cp3} = start_node(cp3, Config), + [Cp1, Cp2, Cp3] + end, + do_otp_3162(StartFun, Config). + +do_otp_3162(StartFun, Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line [Cp1, Cp2, Cp3] = StartFun(), + + ?line wait_for_ready_net(Config), + + % start procs on each node + ?line Pid1 = rpc:call(Cp1, ?MODULE, start_proc4, [kalle]), + ?line assert_pid(Pid1), + ?line Pid2 = rpc:call(Cp2, ?MODULE, start_proc4, [stina]), + ?line assert_pid(Pid2), + ?line Pid3 = rpc:call(Cp3, ?MODULE, start_proc4, [vera]), + ?line assert_pid(Pid3), + + ?line rpc_disconnect_node(Cp1, Cp2, Config), + + ?line ?UNTIL + ([Cp3] =:= lists:sort(rpc:call(Cp1, erlang, nodes, [])) -- [node()]), + + ?line ?UNTIL([kalle, test_server, vera] =:= + lists:sort(rpc:call(Cp1, global, registered_names, []))), + ?line ?UNTIL + ([Cp3] =:= lists:sort(rpc:call(Cp2, erlang, nodes, [])) -- [node()]), + ?line ?UNTIL([stina, test_server, vera] =:= + lists:sort(rpc:call(Cp2, global, registered_names, []))), + ?line ?UNTIL + ([Cp1, Cp2] =:= + lists:sort(rpc:call(Cp3, erlang, nodes, [])) -- [node()]), + ?line ?UNTIL([kalle, stina, test_server, vera] =:= + lists:sort(rpc:call(Cp3, global, registered_names, []))), + + ?line pong = rpc:call(Cp2, net_adm, ping, [Cp1]), + + ?line ?UNTIL + ([Cp2, Cp3] =:= + lists:sort(rpc:call(Cp1, erlang, nodes, [])) -- [node()]), + ?line + ?UNTIL(begin + NN = lists:sort(rpc:call(Cp1, global, registered_names, [])), + [kalle, stina, test_server, vera] =:= NN + end), + ?line ?UNTIL + ([Cp1, Cp3] =:= + lists:sort(rpc:call(Cp2, erlang, nodes, [])) -- [node()]), + ?line ?UNTIL([kalle, stina, test_server, vera] =:= + lists:sort(rpc:call(Cp2, global, registered_names, []))), + ?line ?UNTIL + ([Cp1, Cp2] =:= + lists:sort(rpc:call(Cp3, erlang, nodes, [])) -- [node()]), + ?line ?UNTIL([kalle, stina, test_server, vera] =:= + lists:sort(rpc:call(Cp3, global, registered_names, []))), + + write_high_level_trace(Config), + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + + +otp_5640(suite) -> []; +otp_5640(doc) -> + ["OTP-5640. 'allow' multiple names for registered processes."]; +otp_5640(Config) when is_list(Config) -> + Timeout = 25, + ?line Dog = test_server:timetrap(test_server:seconds(Timeout)), + init_high_level_trace(Timeout), + init_condition(Config), + ?line {ok, B} = start_node(b, Config), + + ?line Nodes = lists:sort([node(), B]), + ?line wait_for_ready_net(Nodes, Config), + + Server = whereis(global_name_server), + ServerB = rpc:call(B, erlang, whereis, [global_name_server]), + + Me = self(), + Proc = spawn(fun() -> otp_5640_proc(Me) end), + + ?line yes = global:register_name(name1, Proc), + ?line no = global:register_name(name2, Proc), + + ?line ok = application:set_env(kernel, global_multi_name_action, allow), + ?line yes = global:register_name(name2, Proc), + + test_server:sleep(100), + ?line Proc = global:whereis_name(name1), + ?line Proc = global:whereis_name(name2), + ?line check_everywhere(Nodes, name1, Config), + ?line check_everywhere(Nodes, name2, Config), + + ?line {monitors_2levels, MonBy1} = mon_by_servers(Proc), + ?line [] = ([Server,Server,ServerB,ServerB] -- MonBy1), + ?line {links,[]} = process_info(Proc, links), + ?line _ = global:unregister_name(name1), + + test_server:sleep(100), + ?line undefined = global:whereis_name(name1), + ?line Proc = global:whereis_name(name2), + ?line check_everywhere(Nodes, name1, Config), + ?line check_everywhere(Nodes, name2, Config), + + ?line {monitors_2levels, MonBy2} = mon_by_servers(Proc), + ?line [] = ([Server,ServerB] -- MonBy2), + TmpMonBy2 = MonBy2 -- [Server,ServerB], + ?line TmpMonBy2 = TmpMonBy2 -- [Server,ServerB], + ?line {links,[]} = process_info(Proc, links), + + ?line yes = global:register_name(name1, Proc), + + Proc ! die, + + test_server:sleep(100), + ?line undefined = global:whereis_name(name1), + ?line undefined = global:whereis_name(name2), + ?line check_everywhere(Nodes, name1, Config), + ?line check_everywhere(Nodes, name2, Config), + ?line {monitors, GMonitors} = process_info(Server, monitors), + ?line false = lists:member({process, Proc}, GMonitors), + + write_high_level_trace(Config), + stop_node(B), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +otp_5640_proc(_Parent) -> + receive + die -> + exit(normal) + end. + +otp_5737(suite) -> []; +otp_5737(doc) -> + ["OTP-5737. set_lock/3 and trans/4 accept Retries = 0."]; +otp_5737(Config) when is_list(Config) -> + Timeout = 25, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + + LockId = {?MODULE,self()}, + Nodes = [node()], + ?line {'EXIT', _} = (catch global:set_lock(LockId, Nodes, -1)), + ?line {'EXIT', _} = (catch global:set_lock(LockId, Nodes, a)), + ?line true = global:set_lock(LockId, Nodes, 0), + Time1 = now(), + ?line false = global:set_lock({?MODULE,not_me}, Nodes, 0), + ?line true = timer:now_diff(now(), Time1) < 5000, + ?line _ = global:del_lock(LockId, Nodes), + + Fun = fun() -> ok end, + ?line {'EXIT', _} = (catch global:trans(LockId, Fun, Nodes, -1)), + ?line {'EXIT', _} = (catch global:trans(LockId, Fun, Nodes, a)), + ?line ok = global:trans(LockId, Fun, Nodes, 0), + + write_high_level_trace(Config), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +otp_6931(suite) -> []; +otp_6931(doc) -> ["OTP-6931. Ignore nodeup when connect_all=false."]; +otp_6931(Config) when is_list(Config) -> + Me = self(), + ?line {ok, CAf} = start_non_connecting_node(ca_false, Config), + ?line ok = rpc:call(CAf, error_logger, add_report_handler, [?MODULE, Me]), + ?line info = rpc:call(CAf, error_logger, warning_map, []), + ?line {global_name_server,CAf} ! {nodeup, fake_node}, + timer:sleep(100), + stop_node(CAf), + receive {nodeup,fake_node} -> test_server:fail({info_report, was, sent}) + after 1000 -> ok + end, + ok. + +%%%----------------------------------------------------------------- +%%% Testing a disconnected node. Not two partitions. +%%%----------------------------------------------------------------- +simple_disconnect(suite) -> []; +simple_disconnect(doc) -> ["OTP-5563. Disconnected nodes (not partitions)"]; +simple_disconnect(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + %% Three nodes (test_server, n_1, n_2). + ?line [Cp1, Cp2] = Cps = start_nodes([n_1, n_2], peer, Config), + ?line wait_for_ready_net(Config), + + Nodes = lists:sort([node() | Cps]), + + lists:foreach(fun(N) -> rpc:call(N, ?MODULE, start_tracer, []) end,Nodes), + + Name = name, + Resolver = {no_module, resolve_none}, % will never be called + PingNode = Cp2, + + ?line {_Pid1, yes} = + rpc:call(Cp1, ?MODULE, start_resolver, [Name, Resolver]), + test_server:sleep(100), + + %% Disconnect test_server and Cp2. + ?line true = erlang:disconnect_node(Cp2), + test_server:sleep(500), + + %% _Pid is registered on Cp1. The exchange of names between Cp2 and + %% test_server sees two identical pids. + ?line pong = net_adm:ping(PingNode), + ?line ?UNTIL(Cps =:= lists:sort(nodes())), + + ?line {_, Trace0} = collect_tracers(Nodes), + ?line Resolvers = [P || {_Node,new_resolver,{pid,P}} <- Trace0], + ?line lists:foreach(fun(P) -> P ! die end, Resolvers), + ?line lists:foreach(fun(P) -> wait_for_exit(P) end, Resolvers), + ?line check_everywhere(Nodes, Name, Config), + ?line undefined = global:whereis_name(Name), + + ?line {_, Trace1} = collect_tracers(Nodes), + Trace = Trace0 ++ Trace1, + ?line [] = [foo || {_, resolve_none, _, _} <- Trace], + + ?line Gs = name_servers(Nodes), + ?line [_, _, _] = monitored_by_node(Trace, Gs), + + lists:foreach(fun(N) -> rpc:call(N, ?MODULE, stop_tracer, []) end, Nodes), + + ?line OrigNames = global:registered_names(), + write_high_level_trace(Config), + stop_nodes(Cps), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Not used right now. +simple_dis(Nodes0, Name, Resolver, Config) -> + Nodes = [node() | Nodes0], + NN = lists:zip(Nodes, lists:seq(1, length(Nodes))), + [{_Node,Other} | Dis] = + [{N,[N1 || {N1,I1} <- NN, I1 > I + 1]} || {N,I} <- NN], + lists:foreach( + fun({Node, DisNodes}) -> + Args = [Node, DisNodes, Name, Resolver], + ok = rpc:call(Node, ?MODULE, simple_dis_node, Args) + end, Dis), + ok = simple_dis_node(node(), Other, Name, Resolver, Config). + +simple_dis_node(_Node, DisNodes, _Name, _Resolver, Config) -> + lists:foreach( + fun(OtherNode) -> _ = erlang:disconnect_node(OtherNode) end, DisNodes), + ?line ?UNTIL(DisNodes -- nodes() =:= DisNodes), + ok. + + + +%%%----------------------------------------------------------------- +%%% Testing resolve of name. Many combinations with four nodes. +%%%----------------------------------------------------------------- +-record(cf, { + link, % node expected to have registered process running + ping, % node in partition 2 to be pinged + n1, % node starting registered process in partition 1 + n2, % node starting registered process in partition 2 + nodes, % nodes expected to exist after ping + n_res, % expected number of resolvers after ping + config + }). + +-define(RES(F), {F, fun ?MODULE:F/3}). + +simple_resolve(suite) -> []; +simple_resolve(doc) -> ["OTP-5563. Partitions and names."]; +simple_resolve(Config) when is_list(Config) -> + Timeout = 360, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [N1, A2, Z2] = Cps = start_nodes([n_1, a_2, z_2], peer, Config), + Nodes = lists:sort([node() | Cps]), + ?line wait_for_ready_net(Config), + + lists:foreach(fun(N) -> + rpc:call(N, ?MODULE, start_tracer, []) + end, Nodes), + + %% There used to be a link between global_name_server and the + %% registered name. Now there are only monitors, but the field + %% name 'link' remains... + + Cf = #cf{link = none, ping = A2, n1 = node(), n2 = A2, + nodes = [node(), N1, A2, Z2], n_res = 2, config = Config}, + + %% There is no test with a resolver that deletes a pid (like + %% global_exit_name does). The resulting DOWN signal just clears + %% out the pid from the tables, which should be harmless. So all + %% tests are done with resolvers that keep both processes. This + %% should catch all cases which used to result in bogus process + %% links (now: only monitors are used). + + %% Two partitions are created in each case below: [node(), n_1] + %% and [a_2, z_2]. A name ('name') is registered in both + %% partitions whereafter node() or n_1 pings a_2 or z_2. Note that + %% node() = test_server, which means that node() < z_2 and node() + %% > a_2. The lesser node calls the resolver. + + %% [The following comment does not apply now that monitors are used.] + %% The resolver is run on a_2 with the process on node() + %% as first argument. The process registered as 'name' on a_2 is + %% removed from the tables. It is unlinked from a_2, and the new + %% process (on node()) is inserted without trying to link to it + %% (it it known to run on some other node, in the other + %% partition). The new process is not sent to the other partition + %% for update since it already exists there. + res(?RES(resolve_first), Cps, Cf#cf{link = node(), n2 = A2}), + %% The same, but the z_2 takes the place of a_2. + res(?RES(resolve_first), Cps, Cf#cf{link = node(), n2 = Z2}), + %% The resolver is run on test_server. + res(?RES(resolve_first), Cps, Cf#cf{link = A2, n2 = A2, ping = Z2}), + res(?RES(resolve_first), Cps, Cf#cf{link = Z2, n2 = Z2, ping = Z2}), + %% Now the same tests but with n_1 taking the place of test_server. + res(?RES(resolve_first), Cps, Cf#cf{link = N1, n1 = N1, n2 = A2}), + res(?RES(resolve_first), Cps, Cf#cf{link = N1, n1 = N1, n2 = Z2}), + res(?RES(resolve_first), Cps, Cf#cf{link = A2, n1 = N1, n2 = A2, ping = Z2}), + res(?RES(resolve_first), Cps, Cf#cf{link = Z2, n1 = N1, n2 = Z2, ping = Z2}), + + %% [Maybe this set of tests is the same as (ismorphic to?) the last one.] + %% The resolver is run on a_2 with the process on node() + %% as first argument. The process registered as 'name' on a_2 is + %% the one kept. The old process is unlinked on node(), and the + %% new process (on a_2) is inserted without trying to link to it + %% (it it known to run on some other node). + res(?RES(resolve_second), Cps, Cf#cf{link = A2, n2 = A2}), + %% The same, but the z_2 takes the place of a_2. + res(?RES(resolve_second), Cps, Cf#cf{link = Z2, n2 = Z2}), + %% The resolver is run on test_server. + res(?RES(resolve_second), Cps, Cf#cf{link = node(), n2 = A2, ping = Z2}), + res(?RES(resolve_second), Cps, Cf#cf{link = node(), n2 = Z2, ping = Z2}), + %% Now the same tests but with n_1 taking the place of test_server. + res(?RES(resolve_second), Cps, Cf#cf{link = A2, n1 = N1, n2 = A2}), + res(?RES(resolve_second), Cps, Cf#cf{link = Z2, n1 = N1, n2 = Z2}), + res(?RES(resolve_second), Cps, Cf#cf{link = N1, n1 = N1, n2 = A2, ping = Z2}), + res(?RES(resolve_second), Cps, Cf#cf{link = N1, n1 = N1, n2 = Z2, ping = Z2}), + + %% A resolver that does not return one of the pids. + res(?RES(bad_resolver), Cps, Cf#cf{n2 = A2}), + res(?RES(bad_resolver), Cps, Cf#cf{n2 = Z2}), + %% The resolver is run on test_server. + res(?RES(bad_resolver), Cps, Cf#cf{n2 = A2, ping = Z2}), + res(?RES(bad_resolver), Cps, Cf#cf{n2 = Z2, ping = Z2}), + %% Now the same tests but with n_1 taking the place of test_server. + res(?RES(bad_resolver), Cps, Cf#cf{n1 = N1, n2 = A2}), + res(?RES(bad_resolver), Cps, Cf#cf{n1 = N1, n2 = Z2}), + res(?RES(bad_resolver), Cps, Cf#cf{n1 = N1, n2 = A2, ping = Z2}), + res(?RES(bad_resolver), Cps, Cf#cf{n1 = N1, n2 = Z2, ping = Z2}), + + %% Both processes are unlinked (demonitored). + res(?RES(resolve_none), Cps, Cf#cf{n2 = A2}), + res(?RES(resolve_none), Cps, Cf#cf{n2 = Z2}), + res(?RES(resolve_none), Cps, Cf#cf{n2 = A2, ping = Z2}), + res(?RES(resolve_none), Cps, Cf#cf{n2 = Z2, ping = Z2}), + res(?RES(resolve_none), Cps, Cf#cf{n1 = N1, n2 = A2}), + res(?RES(resolve_none), Cps, Cf#cf{n1 = N1, n2 = Z2}), + res(?RES(resolve_none), Cps, Cf#cf{n1 = N1, n2 = A2, ping = Z2}), + res(?RES(resolve_none), Cps, Cf#cf{n1 = N1, n2 = Z2, ping = Z2}), + + %% A resolver faking badrpc. The resolver is run on a_2, and the + %% process on node() is kept. + res(?RES(badrpc_resolver), Cps, Cf#cf{link = node(), n2 = A2}), + + %% An exiting resolver. A kind of badrpc. + res(?RES(exit_resolver), Cps, Cf#cf{link = node(), n2 = A2}), + res(?RES(exit_resolver), Cps, Cf#cf{link = node(), n2 = Z2}), + res(?RES(exit_resolver), Cps, Cf#cf{link = A2, n2 = A2, ping = Z2}), + res(?RES(exit_resolver), Cps, Cf#cf{link = Z2, n2 = Z2, ping = Z2}), + res(?RES(exit_resolver), Cps, Cf#cf{link = N1, n1 = N1, n2 = A2}), + res(?RES(exit_resolver), Cps, Cf#cf{link = N1, n1 = N1, n2 = Z2}), + res(?RES(exit_resolver), Cps, Cf#cf{link = A2, n1 = N1, n2 = A2, ping = Z2}), + res(?RES(exit_resolver), Cps, Cf#cf{link = Z2, n1 = N1, n2 = Z2, ping = Z2}), + + %% A locker that takes a lock. It used to be that the + %% global_name_server was busy exchanging names, which caused a + %% deadlock. + res(?RES(lock_resolver), Cps, Cf#cf{link = node()}), + + %% A resolver that disconnects from the node of the first pid + %% once. The nodedown message is processed (the resolver killed), + %% then a new attempt (nodeup etc.) is made. This time the + %% resolver does not disconnect any node. + res(?RES(disconnect_first), Cps, Cf#cf{link = Z2, n2 = Z2, + nodes = [node(), N1, A2, Z2]}), + + ?line lists:foreach(fun(N) -> + rpc:call(N, ?MODULE, stop_tracer, []) + end, Nodes), + + ?line OrigNames = global:registered_names(), + write_high_level_trace(Config), + stop_nodes(Cps), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +simple_resolve2(suite) -> []; +simple_resolve2(doc) -> ["OTP-5563. Partitions and names."]; +simple_resolve2(Config) when is_list(Config) -> + %% Continuation of simple_resolve. Of some reason it did not + %% always work to re-start z_2. "Cannot be a global bug." + + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [N1, A2, Z2] = Cps = start_nodes([n_1, a_2, z_2], peer, Config), + ?line wait_for_ready_net(Config), + Nodes = lists:sort([node() | Cps]), + + lists:foreach(fun(N) -> + rpc:call(N, ?MODULE, start_tracer, []) + end, Nodes), + + Cf = #cf{link = none, ping = A2, n1 = node(), n2 = A2, + nodes = [node(), N1, A2, Z2], n_res = 2, config = Config}, + + %% Halt z_2. + res(?RES(halt_second), Cps, Cf#cf{link = N1, n1 = N1, n2 = Z2, ping = A2, + nodes = [node(), N1, A2], n_res = 1}), + + ?line lists:foreach(fun(N) -> + rpc:call(N, ?MODULE, stop_tracer, []) + end, Nodes), + + ?line OrigNames = global:registered_names(), + write_high_level_trace(Config), + stop_nodes(Cps), % Not all nodes may be present, but it works anyway. + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +simple_resolve3(suite) -> []; +simple_resolve3(doc) -> ["OTP-5563. Partitions and names."]; +simple_resolve3(Config) when is_list(Config) -> + %% Continuation of simple_resolve. + + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [N1, A2, Z2] = Cps = start_nodes([n_1, a_2, z_2], peer, Config), + ?line wait_for_ready_net(Config), + Nodes = lists:sort([node() | Cps]), + + lists:foreach(fun(N) -> + rpc:call(N, ?MODULE, start_tracer, []) + end, Nodes), + + Cf = #cf{link = none, ping = A2, n1 = node(), n2 = A2, + nodes = [node(), N1, A2, Z2], n_res = 2, config = Config}, + + %% Halt a_2. + res(?RES(halt_second), Cps, Cf#cf{link = node(), n2 = A2, + nodes = [node(), N1], n_res = 1}), + + ?line lists:foreach(fun(N) -> + rpc:call(N, ?MODULE, stop_tracer, []) + end, Nodes), + + ?line OrigNames = global:registered_names(), + write_high_level_trace(Config), + stop_nodes(Cps), % Not all nodes may be present, but it works anyway. + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +res({Res,Resolver}, [N1, A2, Z2], Cf) -> + %% Note: there are no links anymore, but monitors. + #cf{link = LinkedNode, ping = PingNode, n1 = Res1, n2 = OtherNode, + nodes = Nodes0, n_res = NRes, config = Config} = Cf, + ?t:format("~n~nResolver: ~p", [Res]), + ?t:format(" Registered on partition 1: ~p", [Res1]), + ?t:format(" Registered on partition 2: ~p", [OtherNode]), + ?t:format(" Pinged node: ~p", [PingNode]), + ?t:format(" Linked node: ~p", [LinkedNode]), + ?t:format(" Expected # resolvers: ~p", [NRes]), + Nodes = lists:sort(Nodes0), + T1 = node(), + Part1 = [T1, N1], + Part2 = [A2, Z2], + Name = name, + + %% A registered name is resolved in different scenarios with just + %% four nodes. In each scenario it is checked that exactly the + %% expected monitors remain between registered processes and the + %% global_name_server. + + ?line rpc_cast(OtherNode, + ?MODULE, + part_2_2, + [Config, Part1, Part2, [{Name, Resolver}]]), + ?line ?UNTIL(is_ready_partition(Config)), + ?line {_Pid1, yes} = + rpc:call(Res1, ?MODULE, start_resolver, [Name, Resolver]), + + ?line pong = net_adm:ping(PingNode), + ?line wait_for_ready_net(Nodes, Config), + + ?line check_everywhere(Nodes, Name, Config), + ?line case global:whereis_name(Name) of + undefined when LinkedNode =:= none -> ok; + Pid -> assert_pid(Pid) + end, + + ?line {_, Trace0} = collect_tracers(Nodes), + ?line Resolvers = [P || {_Node,new_resolver,{pid,P}} <- Trace0], + + ?line NRes = length(Resolvers), + + %% Wait for extra monitor processes to be created. + %% This applies as long as global:do_monitor/1 spawns processes. + %% (Some day monitor() will be truly synchronous.) + test_server:sleep(100), + + ?line lists:foreach(fun(P) -> P ! die end, Resolvers), + ?line lists:foreach(fun(P) -> wait_for_exit(P) end, Resolvers), + + ?line check_everywhere(Nodes, Name, Config), + ?line undefined = global:whereis_name(Name), + + %% Wait for monitors to remove names. + test_server:sleep(100), + + ?line {_, Trace1} = collect_tracers(Nodes), + Trace = Trace0 ++ Trace1, + + ?line Gs = name_servers([T1, N1, A2, Z2]), + ?line MonitoredByNode = monitored_by_node(Trace, Gs), + ?line MonitoredBy = [M || {_N,M} <- MonitoredByNode], + + X = MonitoredBy -- Gs, + LengthGs = length(Gs), + ?line case MonitoredBy of + [] when LinkedNode =:= none -> ok; + Gs -> ok; + _ when LengthGs < 4, X =:= [] -> ok; + _ -> ?t:format("ERROR:~nMonitoredBy ~p~n" + "global_name_servers ~p~n", + [MonitoredByNode, Gs]), + ?t:fail(monitor_mismatch) + end, + ok. + +name_servers(Nodes) -> + lists:sort([rpc:call(N, erlang, whereis, [global_name_server]) || + N <- Nodes, + pong =:= net_adm:ping(N)]). + +monitored_by_node(Trace, Servers) -> + lists:sort([{node(M),M} || + {_Node,_P,died,{monitors_2levels,ML}} <- Trace, + M <- ML, + lists:member(M, Servers)]). + +%% Runs on a node in Part2 +part_2_2(Config, Part1, Part2, NameResolvers) -> + make_partition(Config, Part1, Part2), + lists:foreach + (fun({Name, Resolver}) -> + ?line {Pid2, yes} = start_resolver(Name, Resolver), + trace_message({node(), part_2_2, nodes(), {pid2,Pid2}}) + end, NameResolvers). + +resolve_first(name, Pid1, _Pid2) -> + Pid1. + +resolve_second(name, _Pid1, Pid2) -> + Pid2. + +resolve_none(name, _Pid1, _Pid2) -> + none. + +bad_resolver(name, _Pid1, _Pid2) -> + bad_answer. + +badrpc_resolver(name, _Pid1, _Pid2) -> + {badrpc, badrpc}. + +exit_resolver(name, _Pid1, _Pid2) -> + erlang:error(bad_resolver). + +lock_resolver(name, Pid1, _Pid2) -> + Id = {?MODULE, self()}, + Nodes = [node()], + ?line true = global:set_lock(Id, Nodes), + _ = global:del_lock(Id, Nodes), + Pid1. + +disconnect_first(name, Pid1, Pid2) -> + Name = disconnect_first_name, + case whereis(Name) of + undefined -> + spawn(fun() -> disconnect_first_name(Name) end), + true = erlang:disconnect_node(node(Pid1)); + Pid when is_pid(Pid) -> + Pid ! die + end, + Pid2. + +disconnect_first_name(Name) -> + register(Name, self()), + receive die -> ok end. + +halt_second(name, _Pid1, Pid2) -> + rpc:call(node(Pid2), erlang, halt, []), + Pid2. + +start_resolver(Name, Resolver) -> + Self = self(), + Pid = spawn(fun() -> init_resolver(Self, Name, Resolver) end), + trace_message({node(), new_resolver, {pid, Pid}}), + receive + {Pid, Res} -> {Pid, Res} + end. + +init_resolver(Parent, Name, Resolver) -> + X = global:register_name(Name, self(), Resolver), + Parent ! {self(), X}, + loop_resolver(). + +loop_resolver() -> + receive + die -> + trace_message({node(), self(), died, mon_by_servers(self())}), + exit(normal) + end. + +%% The server sometimes uses an extra process for monitoring. +%% The server monitors that extra process. +mon_by_servers(Proc) -> + {monitored_by, ML} = process_info(Proc, monitored_by), + {monitors_2levels, + lists:append([ML | + [begin + {monitored_by, MML} = rpc:call(node(M), + erlang, + process_info, + [M, monitored_by]), + MML + end || M <- ML]])}. + +-define(REGNAME, contact_a_2). + +leftover_name(suite) -> []; +leftover_name(doc) -> ["OTP-5563. Bug: nodedown while synching."]; +leftover_name(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + ?line [N1, A2, Z2] = Cps = start_nodes([n_1, a_2, z_2], peer, Config), + Nodes = lists:sort([node() | Cps]), + ?line wait_for_ready_net(Config), + + lists:foreach(fun(N) -> + rpc:call(N, ?MODULE, start_tracer, []) + end, Nodes), + + Name = name, % registered on a_2 + ResName = resolved_name, % registered on n_1 and a_2 + %% + ?line _Pid = ping_a_2_fun(?REGNAME, N1, A2), + + T1 = node(), + Part1 = [T1, N1], + Part2 = [A2, Z2], + NoResolver = {no_module, resolve_none}, + Resolver = fun contact_a_2/3, + ?line rpc_cast(A2, + ?MODULE, part_2_2, [Config, + Part1, + Part2, + [{Name, NoResolver}, + {ResName, Resolver}]]), + ?line ?UNTIL(is_ready_partition(Config)), + + %% resolved_name is resolved to run on a_2, an insert operation is + %% sent to n_1. The resolver function halts a_2, but the nodedown + %% message is handled by n_1 _before_ the insert operation is run + %% (at least every now and then; sometimes it seems to be + %% delayed). Unless "artificial" nodedown messages are sent the + %% name would linger on indefinitely. [There is no test case for + %% the situation that no nodedown message at all is sent.] + ?line {_Pid1, yes} = + rpc:call(N1, ?MODULE, start_resolver, + [ResName, fun contact_a_2/3]), + test_server:sleep(1000), + + ?line trace_message({node(), pinging, z_2}), + ?line pong = net_adm:ping(Z2), + ?line ?UNTIL((Nodes -- [A2]) =:= lists:sort(?NODES)), + ?t:sleep(1000), + + ?line {_,Trace0} = collect_tracers(Nodes), + + ?line Resolvers = [P || {_Node,new_resolver,{pid,P}} <- Trace0], + ?line lists:foreach(fun(P) -> P ! die end, Resolvers), + ?line lists:foreach(fun(P) -> wait_for_exit(P) end, Resolvers), + + ?line lists:foreach(fun(N) -> + rpc:call(N, ?MODULE, stop_tracer, []) + end, Nodes), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + write_high_level_trace(Config), + stop_nodes(Cps), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Runs on n_1 +contact_a_2(resolved_name, Pid1, Pid2) -> + trace_message({node(), ?REGNAME, {pid1,Pid1}, {pid2,Pid2}, + {node1,node(Pid1)}, {node2,node(Pid2)}}), + ?REGNAME ! doit, + Pid2. + +ping_a_2_fun(RegName, N1, A2) -> + spawn(N1, fun() -> ping_a_2(RegName, N1, A2) end). + +ping_a_2(RegName, N1, A2) -> + register(RegName, self()), + receive doit -> + trace_message({node(), ping_a_2, {a2, A2}}), + monitor_node(A2, true), + %% Establish contact with a_2, then take it down. + rpc:call(N1, ?MODULE, halt_node, [A2]), + receive + {nodedown, A2} -> ok + end + end. + +halt_node(Node) -> + rpc:call(Node, erlang, halt, []). + +%%%----------------------------------------------------------------- +%%% Testing re-registration of a name. +%%%----------------------------------------------------------------- +re_register_name(suite) -> []; +re_register_name(doc) -> ["OTP-5563. Name is re-registered."]; +re_register_name(Config) when is_list(Config) -> + %% When re-registering a name the link to the old pid used to + %% linger on. Don't think is was a serious bug though--some memory + %% occupied by links, that's all. + %% Later: now monitors are checked. + Timeout = 15, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + Me = self(), + Pid1 = spawn(fun() -> proc(Me) end), + ?line yes = global:register_name(name, Pid1), + Pid2 = spawn(fun() -> proc(Me) end), + ?line _ = global:re_register_name(name, Pid2), + Pid2 ! die, + Pid1 ! die, + receive {Pid1, MonitoredBy1} -> [] = MonitoredBy1 end, + receive {Pid2, MonitoredBy2} -> [_] = MonitoredBy2 end, + ?line _ = global:unregister_name(name), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +proc(Parent) -> + receive die -> ok end, + {monitored_by, MonitoredBy} = process_info(self(), monitored_by), + Parent ! {self(), MonitoredBy}. + + +%%%----------------------------------------------------------------- +%%% +%%%----------------------------------------------------------------- +name_exit(suite) -> []; +name_exit(doc) -> ["OTP-5563. Registered process dies."]; +name_exit(Config) when is_list(Config) -> + case ?t:is_release_available("r11b") of + true -> + StartOldFun = + fun() -> + {ok, N1} = start_node_rel(n_1, r11b, Config), + {ok, N2} = start_node_rel(n_2, this, Config), + [N1, N2] + end, + ?t:format("Test of r11~n"), + do_name_exit(StartOldFun, old, Config); + false -> + ok + end, + StartFun = fun() -> + {ok, N1} = start_node_rel(n_1, this, Config), + {ok, N2} = start_node_rel(n_2, this, Config), + [N1, N2] + end, + ?t:format("Test of current release~n"), + do_name_exit(StartFun, current, Config). + +do_name_exit(StartFun, Version, Config) -> + %% When a registered process dies, the node where it is registered + %% removes the name from the table immediately, and then removes + %% it from other nodes using a lock. + %% This is perhaps not how it should work, but it is not easy to + %% change. + %% See also OTP-3737. + %% + %% The current release uses monitors so this test is not so relevant. + + Timeout = 60, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + %% Three nodes (test_server, n_1, n_2). + ?line Cps = StartFun(), + Nodes = lists:sort([node() | Cps]), + ?line wait_for_ready_net(Config), + lists:foreach(fun(N) -> rpc:call(N, ?MODULE, start_tracer, []) end,Nodes), + + Name = name, + ?line {Pid, yes} = start_proc(Name), + + Me = self(), + LL = spawn(fun() -> long_lock(Me) end), + receive + long_lock_taken -> ok + end, + + Pid ! die, + wait_for_exit_fast(Pid), + + ?t:sleep(100), + %% Name has been removed from node()'s table, but nowhere else + %% since there is a lock on 'global'. + {R1,[]} = rpc:multicall(Nodes, global, whereis_name, [Name]), + ?line case Version of + old -> [_,_] = lists:usort(R1); + current -> [undefined, undefined, undefined] = R1 + end, + ?t:sleep(3000), + ?line check_everywhere(Nodes, Name, Config), + + lists:foreach(fun(N) -> rpc:call(N, ?MODULE, stop_tracer, []) end, Nodes), + ?line OrigNames = global:registered_names(), + exit(LL, kill), + write_high_level_trace(Config), + stop_nodes(Cps), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +long_lock(Parent) -> + global:trans({?GLOBAL_LOCK,self()}, + fun() -> + Parent ! long_lock_taken, + timer:sleep(3000) + end). + +%%%----------------------------------------------------------------- +%%% Testing the support for external nodes (cnodes) +%%%----------------------------------------------------------------- +external_nodes(suite) -> []; +external_nodes(doc) -> ["OTP-5563. External nodes (cnodes)."]; +external_nodes(Config) when is_list(Config) -> + Timeout = 30, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + ?line [NodeB, NodeC] = start_nodes([b, c], peer, Config), + ?line wait_for_ready_net(Config), + + %% Nodes = ?NODES, + %% lists:foreach(fun(N) -> rpc:call(N, ?MODULE, start_tracer, []) end, + %% Nodes), + Name = name, + + %% Two partitions: [test_server] and [b, c]. + %% c registers an external name on b + ?line rpc_cast(NodeB, ?MODULE, part_ext, + [Config, node(), NodeC, Name]), + ?line ?UNTIL(is_ready_partition(Config)), + + ?line pong = net_adm:ping(NodeB), + ?line ?UNTIL([NodeB, NodeC] =:= lists:sort(nodes())), + ?line wait_for_ready_net(Config), + + ?line Cpid = rpc:call(NodeC, erlang, whereis, [Name]), + ExternalName = [{name,Cpid,NodeB}], + ?line ExternalName = get_ext_names(), + ?line ExternalName = rpc:call(NodeB, gen_server, call, + [global_name_server, get_names_ext]), + ?line ExternalName = rpc:call(NodeC, gen_server, call, + [global_name_server, get_names_ext]), + + ?line [_] = cnode_links(Cpid), + ?line [_,_,_] = cnode_monitored_by(Cpid), + ?line no = global:register_name(Name, self()), + ?line yes = global:re_register_name(Name, self()), + ?line ?UNTIL([] =:= cnode_monitored_by(Cpid)), + ?line ?UNTIL([] =:= cnode_links(Cpid)), + ?line [] = gen_server:call(global_name_server, get_names_ext, infinity), + + ?line Cpid ! {register, self(), Name}, + ?line receive {Cpid, Reply1} -> no = Reply1 end, + ?line _ = global:unregister_name(Name), + test_server:sleep(1000), + ?line Cpid ! {register, self(), Name}, + ?line ?UNTIL(length(get_ext_names()) =:= 1), + ?line receive {Cpid, Reply2} -> yes = Reply2 end, + + ?line Cpid ! {unregister, self(), Name}, + ?line ?UNTIL(length(get_ext_names()) =:= 0), + ?line receive {Cpid, Reply3} -> ok = Reply3 end, + + Cpid ! die, + ?line ?UNTIL(OrigNames =:= global:registered_names()), + ?line [] = get_ext_names(), + ?line [] = rpc:call(NodeB, gen_server, call, + [global_name_server, get_names_ext]), + ?line [] = rpc:call(NodeC, gen_server, call, + [global_name_server, get_names_ext]), + + ?line Cpid2 = erlang:spawn(NodeC, fun() -> cnode_proc(NodeB) end), + ?line Cpid2 ! {register, self(), Name}, + ?line receive {Cpid2, Reply4} -> yes = Reply4 end, + + %% It could be a bug that Cpid2 is linked to 'global_name_server' + %% at node 'b'. The effect: Cpid2 dies when node 'b' crashes. + stop_node(NodeB), + ?line ?UNTIL(OrigNames =:= global:registered_names()), + ?line [] = get_ext_names(), + ?line [] = rpc:call(NodeC, gen_server, call, + [global_name_server, get_names_ext]), + + %% ?line {_, Trace} = collect_tracers(Nodes), + %% lists:foreach(fun(M) -> erlang:display(M) end, Trace), + + ThisNode = node(), + ?line Cpid3 = erlang:spawn(NodeC, fun() -> cnode_proc(ThisNode) end), + ?line Cpid3 ! {register, self(), Name}, + ?line receive {Cpid3, Reply5} -> yes = Reply5 end, + + ?line ?UNTIL(length(get_ext_names()) =:= 1), + stop_node(NodeC), + ?line ?UNTIL(length(get_ext_names()) =:= 0), + + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +get_ext_names() -> + gen_server:call(global_name_server, get_names_ext, infinity). + +%% Runs at B +part_ext(Config, Main, C, Name) -> + make_partition(Config, [Main], [node(), C]), + ThisNode = node(), + Pid = erlang:spawn(C, fun() -> cnode_proc(ThisNode) end), + Pid ! {register, self(), Name}, + receive {Pid, Reply} -> yes = Reply end, + rpc:call(C, erlang, register, [Name, Pid]). + +cnode_links(Pid) -> + Pid ! {links, self()}, + receive + {links, Links} -> + Links + end. + +cnode_monitored_by(Pid) -> + Pid ! {monitored_by, self()}, + receive + {monitored_by, MonitoredBy} -> + MonitoredBy + end. + +cnode_proc(E) -> + receive + {register, From, Name} -> + Rep = rpc:call(E, global, register_name_external, [Name, self()]), + From ! {self(), Rep}; + {unregister, From, Name} -> + _ = rpc:call(E, global, unregister_name_external, [Name]), + From ! {self(), ok}; + {links, From} -> + From ! process_info(self(), links); + {monitored_by, From} -> + From ! process_info(self(), monitored_by); + die -> + exit(normal) + end, + cnode_proc(E). + + +many_nodes(suite) -> + []; +many_nodes(doc) -> + ["OTP-5770. Start many nodes. Make them connect at the same time."]; +many_nodes(Config) when is_list(Config) -> + Timeout = 180, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + + {Rels, N_cps} = + case ?t:os_type() of + {unix, Osname} when Osname =:= linux; + Osname =:= openbsd; + Osname =:= darwin -> + N_nodes = quite_a_few_nodes(32), + {node_rel(1, N_nodes, this), N_nodes}; + {unix, _} -> + case ?t:is_release_available("r11b") of + true -> + This = node_rel(1, 16, this), + R11B = node_rel(17, 32, r11b), + {This ++ R11B, 32}; + false -> + {node_rel(1, 32, this), 32} + end; + _ -> + {node_rel(1, 32, this), 32} + end, + ?line Cps = [begin {ok, Cp} = start_node_rel(Name, Rel, Config), Cp end || + {Name,Rel} <- Rels], + Nodes = lists:sort(?NODES), + ?line wait_for_ready_net(Nodes, Config), + + ?line Dir = ?config(priv_dir, Config), + GoFile = filename:join([Dir, "go.txt"]), + file:delete(GoFile), + + CpsFiles = [{N, filename:join([Dir, atom_to_list(N)++".node"])} || + N <- Cps], + IsoFun = + fun({N, File}) -> + file:delete(File), + rpc_cast(N, ?MODULE, isolated_node, [File, GoFile, Cps, Config]) + end, + ?line lists:foreach(IsoFun, CpsFiles), + + ?line all_nodes_files(CpsFiles, "isolated", Config), + ?line Time = msec(), + ?line sync_until(), + erlang:display(ready_to_go), + ?line touch(GoFile, "go"), + ?line all_nodes_files(CpsFiles, "done", Config), + ?line Time2 = msec(), + + ?line lists:foreach(fun(N) -> pong = net_adm:ping(N) end, Cps), + + ?line wait_for_ready_net(Config), + + write_high_level_trace(Config), % The test succeeded, but was it slow? + + ?line lists:foreach(fun({_N, File}) -> file:delete(File) end, CpsFiles), + ?line file:delete(GoFile), + + ?line ?UNTIL(OrigNames =:= global:registered_names()), + write_high_level_trace(Config), + ?line stop_nodes(Cps), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + Diff = Time2 - Time, + Return = lists:flatten(io_lib:format("~w nodes took ~w ms", + [N_cps, Diff])), + erlang:display({{nodes,N_cps},{time,Diff}}), + ?t:format("~s~n", [Return]), + {comment, Return}. + +node_rel(From, To, Rel) -> + [{lists:concat([cp, N]), Rel} || N <- lists:seq(From, To)]. + +isolated_node(File, GoFile, Nodes, Config) -> + Ns = lists:sort(Nodes), + exit(erlang:whereis(user), kill), + touch(File, "start_isolated"), + NodesList = nodes(), + append_to_file(File, [{nodes,Nodes},{nodes_list,NodesList}]), + Replies = + lists:map(fun(N) -> _ = erlang:disconnect_node(N) end, NodesList), + append_to_file(File, {replies,Replies}), + ?UNTIL(begin + Known = get_known(node()), + append_to_file(File, {known,Known}), + Known =:= [node()] + end), + touch(File, "isolated"), + sync_until(File), + file_contents(GoFile, "go", Config, File), + touch(File, "got_go"), + lists:foreach(fun(N) -> _ = net_adm:ping(N) end, shuffle(Nodes)), + touch(File, "pinged"), + ?line ?UNTIL((Ns -- get_known(node())) =:= []), + touch(File, "done"). + +touch(File, List) -> + ok = file:write_file(File, list_to_binary(List)). + +append_to_file(File, Term) -> + {ok, Fd} = file:open(File, [raw,binary,append]), + ok = file:write(Fd, io_lib:format("~p.~n", [Term])), + ok = file:close(Fd). + +all_nodes_files(CpsFiles, ContentsList, Config) -> + lists:all(fun({_N,File}) -> + file_contents(File, ContentsList, Config) + end, CpsFiles). + +file_contents(File, ContentsList, Config) -> + file_contents(File, ContentsList, Config, no_log_file). + +file_contents(File, ContentsList, Config, LogFile) -> + Contents = list_to_binary(ContentsList), + Sz = size(Contents), + ?UNTIL(begin + case file:read_file(File) of + {ok, FileContents}=Reply -> + case catch split_binary(FileContents, Sz) of + {Contents,_} -> + true; + _ -> + catch append_to_file(LogFile, + {File,Contents,Reply}), + false + end; + Reply -> + catch append_to_file(LogFile, {File, Contents, Reply}), + false + end + end). + +sync_until() -> + sync_until(no_log_file). + +sync_until(LogFile) -> + Time = ?UNTIL_LOOP - (msec(now()) rem ?UNTIL_LOOP), + catch append_to_file(LogFile, {sync_until, Time}), + timer:sleep(Time). + +shuffle(L) -> + [E || {_, E} <- lists:keysort(1, [{random:uniform(), E} || E <- L])]. + +sync_0(suite) -> []; +sync_0(doc) -> + ["OTP-5770. sync/0."]; +sync_0(Config) when is_list(Config) -> + Timeout = 180, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + + N_cps = + case ?t:os_type() of + {unix, Osname} when Osname =:= linux; + Osname =:= openbsd; + Osname =:= darwin -> + quite_a_few_nodes(30); + {unix, sunos} -> + 30; + {unix, _} -> + 16; + _ -> + 30 + end, + + Names = [lists:concat([cp,N]) || N <- lists:seq(1, N_cps)], + Cps = start_and_sync(Names), + ?line wait_for_ready_net(Config), + write_high_level_trace(Config), + stop_nodes(Cps), + + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +start_and_sync([]) -> + []; +start_and_sync([Name | Names]) -> + ?line {ok, N} = start_node(Name, slave, []), + ?line {Time, _Void} = rpc:call(N, timer, tc, [global, sync, []]), + ?t:format("~p: ~p~n", [Name, Time]), + [N | start_and_sync(Names)]. + +%%%----------------------------------------------------------------- +%%% Testing of change of global_groups parameter. +%%%----------------------------------------------------------------- +global_groups_change(suite) -> []; +global_groups_change(doc) -> ["Test change of global_groups parameter."]; +global_groups_change(Config) -> + Timeout = 90, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line M = from($@, atom_to_list(node())), + + % Create the .app files and the boot script + ?line {KernelVer, StdlibVer} = create_script_dc("dc"), + ?line case is_real_system(KernelVer, StdlibVer) of + true -> + Options = []; + false -> + Options = [local] + end, + + ?line ok = systools:make_script("dc", Options), + + [Ncp1,Ncp2,Ncp3,Ncp4,Ncp5,NcpA,NcpB,NcpC,NcpD,NcpE] = + node_names([cp1,cp2,cp3,cp4,cp5,cpA,cpB,cpC,cpD,cpE], Config), + + % Write config files + ?line Dir = ?config(priv_dir,Config), + ?line {ok, Fd_dc} = file:open(filename:join(Dir, "sys.config"), [write]), + ?line config_dc1(Fd_dc, Ncp1, Ncp2, Ncp3, NcpA, NcpB, NcpC, NcpD, NcpE), + ?line file:close(Fd_dc), + ?line Config1 = filename:join(Dir, "sys"), + + % Test [cp1, cp2, cp3] + ?line {ok, Cp1} = start_node_boot(Ncp1, Config1, dc), + ?line {ok, Cp2} = start_node_boot(Ncp2, Config1, dc), + ?line {ok, Cp3} = start_node_boot(Ncp3, Config1, dc), + ?line {ok, CpA} = start_node_boot(NcpA, Config1, dc), + ?line {ok, CpB} = start_node_boot(NcpB, Config1, dc), + ?line {ok, CpC} = start_node_boot(NcpC, Config1, dc), + ?line {ok, CpD} = start_node_boot(NcpD, Config1, dc), + ?line {ok, CpE} = start_node_boot(NcpE, Config1, dc), + + ?line pong = rpc:call(Cp1, net_adm, ping, [Cp2]), + ?line pong = rpc:call(Cp1, net_adm, ping, [Cp3]), + ?line pang = rpc:call(Cp1, net_adm, ping, + [list_to_atom(lists:concat(["cp5@", M]))]), + ?line pong = rpc:call(Cp2, net_adm, ping, [Cp3]), + ?line pang = rpc:call(Cp2, net_adm, ping, + [list_to_atom(lists:concat(["cp5@", M]))]), + + ?line {TestGG4, yes} = rpc:call(CpB, ?MODULE, start_proc, [test]), + ?line {TestGG5, yes} = rpc:call(CpE, ?MODULE, start_proc, [test]), + + + ?line pong = rpc:call(CpA, net_adm, ping, [CpC]), + ?line pong = rpc:call(CpC, net_adm, ping, [CpB]), + ?line pong = rpc:call(CpD, net_adm, ping, [CpC]), + ?line pong = rpc:call(CpE, net_adm, ping, [CpD]), + + ?line + ?UNTIL(begin + TestGG4_1 = rpc:call(CpA, global, whereis_name, [test]), + TestGG4_2 = rpc:call(CpB, global, whereis_name, [test]), + TestGG4_3 = rpc:call(CpC, global, whereis_name, [test]), + + TestGG5_1 = rpc:call(CpD, global, whereis_name, [test]), + TestGG5_2 = rpc:call(CpE, global, whereis_name, [test]), + io:format("~p~n", [[TestGG4, TestGG4_1, TestGG4_2,TestGG4_3]]), + io:format("~p~n", [[TestGG5, TestGG5_1, TestGG5_2]]), + (TestGG4_1 =:= TestGG4) and + (TestGG4_2 =:= TestGG4) and + (TestGG4_3 =:= TestGG4) and + (TestGG5_1 =:= TestGG5) and + (TestGG5_2 =:= TestGG5) + end), + + ?line ?t:format( "#### nodes() ~p~n",[nodes()]), + + ?line XDcWa1 = rpc:call(Cp1, global_group, info, []), + ?line XDcWa2 = rpc:call(Cp2, global_group, info, []), + ?line XDcWa3 = rpc:call(Cp3, global_group, info, []), + ?line ?t:format( "#### XDcWa1 ~p~n",[XDcWa1]), + ?line ?t:format( "#### XDcWa2 ~p~n",[XDcWa2]), + ?line ?t:format( "#### XDcWa3 ~p~n",[XDcWa3]), + + ?line stop_node(CpC), + + %% Read the current configuration parameters, and change them + ?line OldEnv = + rpc:call(Cp1, application_controller, prep_config_change, []), + ?line {value, {kernel, OldKernel}} = lists:keysearch(kernel, 1, OldEnv), + + ?line GG1 = + lists:sort([mk_node(Ncp1, M), mk_node(Ncp2, M), mk_node(Ncp5, M)]), + ?line GG2 = lists:sort([mk_node(Ncp3, M)]), + ?line GG3 = lists:sort([mk_node(Ncp4, M)]), + ?line GG4 = lists:sort([mk_node(NcpA, M), mk_node(NcpB, M)]), + ?line GG5 = + lists:sort([mk_node(NcpC, M), mk_node(NcpD, M), mk_node(NcpE, M)]), + + ?line NewNG = {global_groups,[{gg1, normal, GG1}, + {gg2, normal, GG2}, + {gg3, normal, GG3}, + {gg4, normal, GG4}, + {gg5, hidden, GG5}]}, + + ?line NewKernel = + [{kernel, lists:keyreplace(global_groups, 1, OldKernel, NewNG)}], + ?line ok = rpc:call(Cp1, application_controller, test_change_apps, + [[kernel], [NewKernel]]), + ?line ok = rpc:call(Cp2, application_controller, test_change_apps, + [[kernel], [NewKernel]]), + ?line ok = rpc:call(Cp3, application_controller, test_change_apps, + [[kernel], [NewKernel]]), + ?line ok = rpc:call(CpA, application_controller, test_change_apps, + [[kernel], [NewKernel]]), + ?line ok = rpc:call(CpB, application_controller, test_change_apps, + [[kernel], [NewKernel]]), + ?line ok = rpc:call(CpD, application_controller, test_change_apps, + [[kernel], [NewKernel]]), + ?line ok = rpc:call(CpE, application_controller, test_change_apps, + [[kernel], [NewKernel]]), + + ?line ?t:format("#### ~p~n",[multicall]), + ?line ?t:format( "#### ~p~n",[multicall]), + %% no idea to check the result from the rpc because the other + %% nodes will disconnect test server, and thus the result will + %% always be {badrpc, nodedown} + ?line rpc:multicall([Cp1, Cp2, Cp3, CpA, CpB, CpD, CpE], + application_controller, config_change, [OldEnv]), + + ?line {ok, Fd_dc2} = file:open(filename:join(Dir, "sys2.config"), [write]), + ?line config_dc2(Fd_dc2, NewNG, Ncp1, Ncp2, Ncp3), + ?line file:close(Fd_dc2), + ?line Config2 = filename:join(Dir, "sys2"), + ?line {ok, CpC} = start_node_boot(NcpC, Config2, dc), + + ?line sync_and_wait(CpA), + ?line sync_and_wait(CpD), + + ?line pong = rpc:call(CpA, net_adm, ping, [CpC]), + ?line pong = rpc:call(CpC, net_adm, ping, [CpB]), + ?line pong = rpc:call(CpD, net_adm, ping, [CpC]), + ?line pong = rpc:call(CpE, net_adm, ping, [CpD]), + + ?line GG5 = + lists:sort([mk_node(NcpC, M)|rpc:call(CpC, erlang, nodes, [])]), + ?line GG5 = + lists:sort([mk_node(NcpD, M)|rpc:call(CpD, erlang, nodes, [])]), + ?line GG5 = + lists:sort([mk_node(NcpE, M)|rpc:call(CpE, erlang, nodes, [])]), + + ?line false = + lists:member(mk_node(NcpC, M), rpc:call(CpA, erlang, nodes, [])), + ?line false = + lists:member(mk_node(NcpC, M), rpc:call(CpB, erlang, nodes, [])), + + ?line + ?UNTIL(begin + TestGG4a = rpc:call(CpA, global, whereis_name, [test]), + TestGG4b = rpc:call(CpB, global, whereis_name, [test]), + + TestGG5c = rpc:call(CpC, global, whereis_name, [test]), + TestGG5d = rpc:call(CpD, global, whereis_name, [test]), + TestGG5e = rpc:call(CpE, global, whereis_name, [test]), + io:format("~p~n", [[TestGG4, TestGG4a, TestGG4b]]), + io:format("~p~n", [[TestGG5, TestGG5c, TestGG5d, TestGG5e]]), + (TestGG4 =:= TestGG4a) and + (TestGG4 =:= TestGG4b) and + (TestGG5 =:= TestGG5c) and + (TestGG5 =:= TestGG5d) and + (TestGG5 =:= TestGG5e) + end), + + ?line Info1 = rpc:call(Cp1, global_group, info, []), + ?line Info2 = rpc:call(Cp2, global_group, info, []), + ?line Info3 = rpc:call(Cp3, global_group, info, []), + ?line InfoA = rpc:call(CpA, global_group, info, []), + ?line InfoB = rpc:call(CpB, global_group, info, []), + ?line InfoC = rpc:call(CpC, global_group, info, []), + ?line InfoD = rpc:call(CpD, global_group, info, []), + ?line InfoE = rpc:call(CpE, global_group, info, []), + ?line ?t:format( "#### Info1 ~p~n",[Info1]), + ?line ?t:format( "#### Info2 ~p~n",[Info2]), + ?line ?t:format( "#### Info3 ~p~n",[Info3]), + ?line ?t:format( "#### InfoA ~p~n",[InfoA]), + ?line ?t:format( "#### InfoB ~p~n",[InfoB]), + ?line ?t:format( "#### InfoC ~p~n",[InfoC]), + ?line ?t:format( "#### InfoD ~p~n",[InfoD]), + ?line ?t:format( "#### InfoE ~p~n",[InfoE]), + + ?line {global_groups, GGNodes} = NewNG, + + ?line Info1ok = [{state, synced}, + {own_group_name, gg1}, + {own_group_nodes, GG1}, + {synced_nodes, [mk_node(Ncp2, M)]}, + {sync_error, []}, + {no_contact, [mk_node(Ncp5, M)]}, + {other_groups, remove_gg_pub_type(lists:keydelete + (gg1, 1, GGNodes))}, + {monitoring, []}], + + + ?line Info2ok = [{state, synced}, + {own_group_name, gg1}, + {own_group_nodes, GG1}, + {synced_nodes, [mk_node(Ncp1, M)]}, + {sync_error, []}, + {no_contact, [mk_node(Ncp5, M)]}, + {other_groups, remove_gg_pub_type(lists:keydelete + (gg1, 1, GGNodes))}, + {monitoring, []}], + + ?line Info3ok = [{state, synced}, + {own_group_name, gg2}, + {own_group_nodes, GG2}, + {synced_nodes, []}, + {sync_error, []}, + {no_contact, []}, + {other_groups, remove_gg_pub_type(lists:keydelete + (gg2, 1, GGNodes))}, + {monitoring, []}], + + ?line InfoAok = [{state, synced}, + {own_group_name, gg4}, + {own_group_nodes, GG4}, + {synced_nodes, lists:delete(mk_node(NcpA, M), GG4)}, + {sync_error, []}, + {no_contact, []}, + {other_groups, remove_gg_pub_type(lists:keydelete + (gg4, 1, GGNodes))}, + {monitoring, []}], + + ?line InfoBok = [{state, synced}, + {own_group_name, gg4}, + {own_group_nodes, GG4}, + {synced_nodes, lists:delete(mk_node(NcpB, M), GG4)}, + {sync_error, []}, + {no_contact, []}, + {other_groups, remove_gg_pub_type(lists:keydelete + (gg4, 1, GGNodes))}, + {monitoring, []}], + + ?line InfoCok = [{state, synced}, + {own_group_name, gg5}, + {own_group_nodes, GG5}, + {synced_nodes, lists:delete(mk_node(NcpC, M), GG5)}, + {sync_error, []}, + {no_contact, []}, + {other_groups, remove_gg_pub_type(lists:keydelete + (gg5, 1, GGNodes))}, + {monitoring, []}], + + ?line InfoDok = [{state, synced}, + {own_group_name, gg5}, + {own_group_nodes, GG5}, + {synced_nodes, lists:delete(mk_node(NcpD, M), GG5)}, + {sync_error, []}, + {no_contact, []}, + {other_groups, remove_gg_pub_type(lists:keydelete + (gg5, 1, GGNodes))}, + {monitoring, []}], + + ?line InfoEok = [{state, synced}, + {own_group_name, gg5}, + {own_group_nodes, GG5}, + {synced_nodes, lists:delete(mk_node(NcpE, M), GG5)}, + {sync_error, []}, + {no_contact, []}, + {other_groups, remove_gg_pub_type(lists:keydelete + (gg5, 1, GGNodes))}, + {monitoring, []}], + + + ?line case Info1 of + Info1ok -> + ok; + _ -> + test_server:fail({{"could not change the global groups" + " in node", Cp1}, {Info1, Info1ok}}) + end, + + ?line case Info2 of + Info2ok -> + ok; + _ -> + test_server:fail({{"could not change the global groups" + " in node", Cp2}, {Info2, Info2ok}}) + end, + + ?line case Info3 of + Info3ok -> + ok; + _ -> + test_server:fail({{"could not change the global groups" + " in node", Cp3}, {Info3, Info3ok}}) + end, + + ?line case InfoA of + InfoAok -> + ok; + _ -> + test_server:fail({{"could not change the global groups" + " in node", CpA}, {InfoA, InfoAok}}) + end, + + ?line case InfoB of + InfoBok -> + ok; + _ -> + test_server:fail({{"could not change the global groups" + " in node", CpB}, {InfoB, InfoBok}}) + end, + + + ?line case InfoC of + InfoCok -> + ok; + _ -> + test_server:fail({{"could not change the global groups" + " in node", CpC}, {InfoC, InfoCok}}) + end, + + ?line case InfoD of + InfoDok -> + ok; + _ -> + test_server:fail({{"could not change the global groups" + " in node", CpD}, {InfoD, InfoDok}}) + end, + + ?line case InfoE of + InfoEok -> + ok; + _ -> + test_server:fail({{"could not change the global groups" + " in node", CpE}, {InfoE, InfoEok}}) + end, + + write_high_level_trace(Config), % no good since CpC was restarted + stop_node(Cp1), + stop_node(Cp2), + stop_node(Cp3), + stop_node(CpA), + stop_node(CpB), + stop_node(CpC), + stop_node(CpD), + stop_node(CpE), + + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +sync_and_wait(Node) -> + Ref = make_ref(), + Self = self(), + spawn(Node, fun () -> + global_group:sync(), + case whereis(global_group_check) of + P when is_pid(P) -> + Self ! {Ref, P}; + _ -> + Self ! {Ref, done} + end + end), + receive + {Ref, P} when is_pid(P) -> + MonRef = erlang:monitor(process, P), + receive + {'DOWN',MonRef,process,P,_} -> + ok + end; + {Ref, _} -> + ok + end. + +%%% Copied from init_SUITE.erl. +is_real_system(KernelVsn, StdlibVsn) -> + LibDir = code:lib_dir(), + filelib:is_dir(filename:join(LibDir, "kernel-" ++ KernelVsn)) + andalso + filelib:is_dir(filename:join(LibDir, "stdlib-" ++ StdlibVsn)). + +create_script_dc(ScriptName) -> + ?line Name = filename:join(".", ScriptName), + ?line Apps = application_controller:which_applications(), + ?line {value,{_,_,KernelVer}} = lists:keysearch(kernel,1,Apps), + ?line {value,{_,_,StdlibVer}} = lists:keysearch(stdlib,1,Apps), + ?line {ok,Fd} = file:open(Name ++ ".rel", [write]), + ?line {_, Version} = init:script_id(), + ?line io:format(Fd, + "{release, {\"Test release 3\", \"~s\"}, \n" + " {erts, \"4.4\"}, \n" + " [{kernel, \"~s\"}, {stdlib, \"~s\"}]}.\n", + [Version, KernelVer, StdlibVer]), + ?line file:close(Fd), + {KernelVer, StdlibVer}. + +%% Not used? +config_dc(Fd, Ncp1, Ncp2, Ncp3) -> + M = from($@, atom_to_list(node())), + io:format(Fd, "[{kernel, [{sync_nodes_optional, ['~s@~s','~s@~s','~s@~s']}," + "{sync_nodes_timeout, 1000}," + "{global_groups, [{gg1, ['~s@~s', '~s@~s']}," + " {gg2, ['~s@~s']}]}" + " ]}].~n", + [Ncp1, M, Ncp2, M, Ncp3, M, Ncp1, M, Ncp2, M, Ncp3, M]). + + +config_dc1(Fd, Ncp1, Ncp2, Ncp3, NcpA, NcpB, NcpC, NcpD, NcpE) -> + M = from($@, atom_to_list(node())), + io:format(Fd, "[{kernel, [{sync_nodes_optional, ['~s@~s','~s@~s','~s@~s','~s@~s','~s@~s','~s@~s','~s@~s','~s@~s']}," + "{sync_nodes_timeout, 1000}," + "{global_groups, [{gg1, ['~s@~s', '~s@~s']}," + " {gg2, ['~s@~s']}," + " {gg4, normal, ['~s@~s','~s@~s','~s@~s']}," + " {gg5, hidden, ['~s@~s','~s@~s']}]}]}].~n", + [Ncp1, M, Ncp2, M, Ncp3, M, + NcpA, M, NcpB, M, NcpC, M, NcpD, M, NcpE, M, + Ncp1, M, Ncp2, M, + Ncp3, M, + NcpA, M, NcpB, M, NcpC, M, + NcpD, M, NcpE, M]). + +config_dc2(Fd, NewGG, Ncp1, Ncp2, Ncp3) -> + M = from($@, atom_to_list(node())), + io:format(Fd, "[{kernel, [{sync_nodes_optional, ['~s@~s','~s@~s','~s@~s']}," + "{sync_nodes_timeout, 1000}," + "~p]}].~n", + [Ncp1, M, Ncp2, M, Ncp3, M, NewGG]). + + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(_H, []) -> []. + + + +other(A, [A, _B]) -> A; +other(_, [_A, B]) -> B. + + +%% this one runs at cp2 +part1(Config, Main, Cp1, Cp3) -> + case catch begin + make_partition(Config, [Main, Cp1], [node(), Cp3]), + ?line {_Pid, yes} = start_proc(test2), + ?line {_Pid2, yes} = start_proc(test4) + end of + {_, yes} -> ok; % w("ok", []); + {'EXIT', _R} -> + ok + % w("global_SUITE line:~w: ~p", [?LINE, _R]) + end. + +%% Runs at Cp2 +part1_5(Config, Main, Cp1, Cp3) -> + case catch begin + make_partition(Config, [Main, Cp1], [node(), Cp3]), + ?line {_Pid1, yes} = start_proc_basic(name12), + ?line {_Pid2, yes} = + rpc:call(Cp3, ?MODULE, start_proc_basic, [name03]) + end of + {_, yes} -> ok; % w("ok", []); + {'EXIT', _R} -> + ok + % w("global_SUITE line:~w: ~p", [?LINE, _R]) + end. + +w(X,Y) -> + {ok, F} = file:open("cp2.log", [write]), + io:format(F, X, Y), + file:close(F). + +%% this one runs on one node in Part2 +%% The partition is ready when is_ready_partition(Config) returns (true). +make_partition(Config, Part1, Part2) -> + Dir = ?config(priv_dir, Config), + Ns = [begin + Name = lists:concat([atom_to_list(N),"_",msec(),".part"]), + File = filename:join([Dir, Name]), + file:delete(File), + rpc_cast(N, ?MODULE, mk_part_node, [File, Part, Config], File), + {N, File} + end || Part <- [Part1, Part2], N <- Part], + all_nodes_files(Ns, "done", Config), + lists:foreach(fun({_N,File}) -> file:delete(File) end, Ns), + PartFile = make_partition_file(Config), + touch(PartFile, "done"). + +%% The node signals its success by touching a file. +mk_part_node(File, MyPart0, Config) -> + touch(File, "start"), % debug + MyPart = lists:sort(MyPart0), + ?UNTIL(is_node_in_part(File, MyPart)), + touch(File, "done"). + +%% The calls to append_to_file are for debugging. +is_node_in_part(File, MyPart) -> + lists:foreach(fun(N) -> + _ = erlang:disconnect_node(N) + end, nodes() -- MyPart), + case {(Known = get_known(node())) =:= MyPart, + (Nodes = lists:sort([node() | nodes()])) =:= MyPart} of + {true, true} -> + %% Make sure the resolvers have been terminated, + %% otherwise they may pop up and send some message. + %% (This check is probably unnecessary.) + case element(5, global:info()) of + [] -> + true; + Rs -> + erlang:display({is_node_in_part, resolvers, Rs}), + trace_message({node(), is_node_in_part, Rs}), + append_to_file(File, {now(), Known, Nodes, Rs}), + false + end; + _ -> + append_to_file(File, {now(), Known, Nodes}), + false + end. + +is_ready_partition(Config) -> + File = make_partition_file(Config), + file_contents(File, "done", Config), + file:delete(File), + true. + +make_partition_file(Config) -> + Dir = ?config(priv_dir, Config), + filename:join([Dir, atom_to_list(make_partition_done)]). + +%% this one runs at cp3 +part2(Config, Parent, Main, Cp0, Cp1, Cp2, Cp3, Cp4, Cp5, Cp6) -> + make_partition(Config, [Main, Cp0, Cp1, Cp2], [Cp3, Cp4, Cp5, Cp6]), + start_procs(Parent, Cp4, Cp5, Cp6, Config). + +part3(Config, Parent, Main, Cp0, Cp1, Cp2, Cp3, Cp4, Cp5, Cp6) -> + make_partition(Config, [Main, Cp0, Cp1, Cp2], [Cp3, Cp4, Cp5, Cp6]), + start_procs(Parent, Cp4, Cp5, Cp6, Config), + % Make Cp6 alone + ?line rpc_cast(Cp5, ?MODULE, crash, [12000]), + ?line rpc_cast(Cp6, ?MODULE, alone, [Cp0, Cp3]). + +start_procs(Parent, N1, N2, N3, Config) -> + S1 = lists:sort([N1, N2, N3]), + ?line + ?UNTIL(begin + NN = lists:sort(nodes()), + S1 =:= NN + end), + ?line Pid3 = start_proc3(test1), + ?line Pid4 = rpc:call(N1, ?MODULE, start_proc3, [test2]), + ?line assert_pid(Pid4), + ?line Pid5 = rpc:call(N2, ?MODULE, start_proc3, [test3]), + ?line assert_pid(Pid5), + ?line Pid6 = rpc:call(N3, ?MODULE, start_proc3, [test4]), + ?line assert_pid(Pid6), + ?line yes = global:register_name(test1, Pid3), + ?line yes = global:register_name(test2, Pid4, {global, notify_all_name}), + ?line yes = global:register_name(test3, Pid5, {global, random_notify_name}), + Resolve = fun(Name, Pid1, Pid2) -> + Parent ! {resolve_called, Name, node()}, + {Min, Max} = minmax(Pid1, Pid2), + exit(Min, kill), + Max + end, + ?line yes = global:register_name(test4, Pid6, Resolve). + + + +collect_resolves() -> cr(0). +cr(Res) -> + receive + {resolve_called, Name, Node} -> + io:format("resolve called: ~w ~w~n", [Name, Node]), + cr(Res+1) + after + 0 -> Res + end. + +minmax(P1,P2) -> + if node(P1) < node(P2) -> {P1, P2}; true -> {P2, P1} end. + +fix_basic_name(name03, Pid1, Pid2) -> + case atom_to_list(node(Pid1)) of + [$c, $p, $3|_] -> exit(Pid2, kill), Pid1; + _ -> exit(Pid1, kill), Pid2 + end; +fix_basic_name(name12, Pid1, Pid2) -> + case atom_to_list(node(Pid1)) of + [$c, $p, $2|_] -> exit(Pid2, kill), Pid1; + _ -> exit(Pid1, kill), Pid2 + end. + +start_proc() -> + Pid = spawn(?MODULE, p_init, [self()]), + receive + Pid -> Pid + end. + + +start_proc(Name) -> + Pid = spawn(?MODULE, p_init, [self(), Name]), + receive + {Pid, Res} -> {Pid, Res} + end. + +start_proc2(Name) -> + Pid = spawn(?MODULE, p_init2, [self(), Name]), + receive + Pid -> Pid + end. + +start_proc3(Name) -> + Pid = spawn(?MODULE, p_init, [self()]), + register(Name, Pid), + receive + Pid -> Pid + end. + +start_proc4(Name) -> + Pid = spawn(?MODULE, p_init, [self()]), + yes = global:register_name(Name, Pid), + receive + Pid -> Pid + end. + +start_proc_basic(Name) -> + Pid = spawn(?MODULE, init_proc_basic, [self(), Name]), + receive + {Pid, Res} -> {Pid, Res} + end. + +init_proc_basic(Parent, Name) -> + X = global:register_name(Name, self(), {?MODULE, fix_basic_name}), + Parent ! {self(),X}, + loop(). + +single_node(Time, Node, Config) -> + exit(erlang:whereis(user), kill), + lists:foreach(fun(N) -> _ = erlang:disconnect_node(N) end, nodes()), + ?UNTIL(get_known(node()) =:= [node()]), + spawn(?MODULE, init_2, []), + test_server:sleep(Time - msec()), + net_adm:ping(Node). + +init_2() -> + register(single_name, self()), + yes = global:register_name(single_name, self()), + loop_2(). + +loop_2() -> + receive + die -> ok + end. + +msec() -> + msec(now()). + +msec(T) -> + element(1,T)*1000000000 + element(2,T)*1000 + element(3,T) div 1000. + +assert_pid(Pid) -> + if + is_pid(Pid) -> true; + true -> exit({not_a_pid, Pid}) + end. + +check_same([H|T]) -> check_same(T, H). + +check_same([H|T], H) -> check_same(T, H); +check_same([], _H) -> ok. + +check_same_p([H|T]) -> check_same_p(T, H). + +check_same_p([H|T], H) -> check_same_p(T, H); +check_same_p([], _H) -> true; +check_same_p(_, _) -> false. + +p_init(Parent) -> + Parent ! self(), + loop(). + +p_init(Parent, Name) -> + X = global:register_name(Name, self()), + Parent ! {self(),X}, + loop(). + +p_init2(Parent, Name) -> + _ = global:re_register_name(Name, self()), + Parent ! self(), + loop(). + +req(Pid, Msg) -> + Pid ! Msg, + receive X -> X end. + +sreq(Pid, Msg) -> + Ref = make_ref(), + Pid ! {Msg, Ref}, + receive {Ref, X} -> X end. + +alone(N1, N2) -> + lists:foreach(fun(Node) -> true = erlang:disconnect_node(Node) end, + nodes()), + test_server:sleep(12000), + net_adm:ping(N1), + net_adm:ping(N2), + yes = global:register_name(test5, self()). + +crash(Time) -> + test_server:sleep(Time), + erlang:halt(). + +loop() -> + receive + {ping, From} -> + From ! {pong, node()}, + loop(); + {del_lock, Id} -> + global:del_lock({Id, self()}), + loop(); + {del_lock_sync, Id, From} -> + global:del_lock({Id, self()}), + From ! true, + loop(); + {del_lock, Id, Nodes} -> + global:del_lock({Id, self()}, Nodes), + loop(); + {del_lock2, Id, From} -> + global:del_lock(Id), + From ! true, + loop(); + {del_lock2, Id, From, Nodes} -> + global:del_lock(Id, Nodes), + From ! true, + loop(); + {set_lock, Id, From} -> + Res = global:set_lock({Id, self()}, ?NODES, 1), + From ! Res, + loop(); + {set_lock, Id, From, Nodes} -> + Res = global:set_lock({Id, self()}, Nodes, 1), + From ! Res, + loop(); + {set_lock_loop, Id, From} -> + true = global:set_lock({Id, self()}, ?NODES), + From ! {got_lock, self()}, + loop(); + {set_lock2, Id, From} -> + Res = global:set_lock(Id, ?NODES, 1), + From ! Res, + loop(); + {{got_notify, From}, Ref} -> + receive + X when element(1, X) =:= global_name_conflict -> + From ! {Ref, yes} + after + 0 -> From ! {Ref, no} + end, + loop(); + die -> + exit(normal); + drop_dead -> + exit(drop_dead) + end. + +-ifdef(unused). +pr_diff(Str, T0, T1) -> + Diff = begin + {_, {H,M,S}} = calendar:time_difference(T0, T1), + ((H*60+M)*60)+S + end, + test_server:format(1,"~13s: ~w (diff: ~w)",[Str, T1, Diff]), + if + Diff > 100 -> + test_server:format(1,"~s: ** LARGE DIFF ~w~n", [Str, Diff]); + true -> + ok + end. +-endif. + +now_diff({A1,B1,C1},{A2,B2,C2}) -> + C1-C2 + 1000000*((B1-B2) + 1000000*(A1-A2)). + +start_node_boot(Name, Config, Boot) -> + Pa = filename:dirname(code:which(?MODULE)), + Res = test_server:start_node(Name, peer, [{args, " -pa " ++ Pa ++ + " -config " ++ Config ++ + " -boot " ++ atom_to_list(Boot)}]), + record_started_node(Res). + +%% Increase the timeout for when an upcoming connection is teared down +%% again (default is 7 seconds, and can be exceeded by some tests). +%% The default remains in effect for the test_server node itself, though. +start_node(Name, Config) -> + start_node(Name, slave, Config). + +start_hidden_node(Name, Config) -> + start_node(Name, slave, "-hidden", Config). + +start_non_connecting_node(Name, Config) -> + start_node(Name, slave, "-connect_all false +W i", Config). + +start_peer_node(Name, Config) -> + start_node(Name, peer, Config). + +start_node(Name, How, Config) -> + start_node(Name, How, "", Config). + +start_node(Name0, How, Args, Config) -> + Name = node_name(Name0, Config), + Pa = filename:dirname(code:which(?MODULE)), + R = test_server:start_node(Name, How, [{args, + Args ++ " " ++ + "-kernel net_setuptime 100 " +% "-noshell " + "-pa " ++ Pa}, + {linked, false} +]), + %% {linked,false} only seems to work for slave nodes. +% test_server:sleep(1000), + record_started_node(R). + +start_node_rel(Name0, Rel, Config) -> + Name = node_name(Name0, Config), + {Release, Compat} = case Rel of + this -> + {[this], "+R8"}; + Rel when is_atom(Rel) -> + {[{release, atom_to_list(Rel)}], ""}; + RelList -> + {RelList, ""} + end, + Env = case Rel of + r11b -> + [{env, [{"ERL_R11B_FLAGS", []}]}]; + _ -> + [] + end, + Pa = filename:dirname(code:which(?MODULE)), + Res = test_server:start_node(Name, peer, + [{args, + Compat ++ + " -kernel net_setuptime 100 " + " -pa " ++ Pa}, + {erl, Release}] ++ Env), + record_started_node(Res). + +record_started_node({ok, Node}) -> + case erase(?nodes_tag) of + undefined -> ok; + Nodes -> put(?nodes_tag, [Node | Nodes]) + end, + {ok, Node}; +record_started_node(R) -> + R. + +node_names(Names, Config) -> + [node_name(Name, Config) || Name <- Names]. + +%% simple_resolve assumes that the node name comes first. +node_name(Name, Config) -> + U = "_", + {{Y,M,D}, {H,Min,S}} = calendar:now_to_local_time(now()), + Date = io_lib:format("~4w_~2..0w_~2..0w__~2..0w_~2..0w_~2..0w", + [Y,M,D, H,Min,S]), + L = lists:flatten(Date), + lists:concat([Name,U,?testcase,U,U,L]). + +stop_nodes(Nodes) -> + lists:foreach(fun(Node) -> stop_node(Node) end, Nodes). + +stop_node(Node) -> + ?line ?t:stop_node(Node). + + +stop() -> + lists:foreach(fun(Node) -> + ?t:stop_node(Node) + end, nodes()). + +dbg_logs(Name) -> dbg_logs(Name, ?NODES). + +dbg_logs(Name, Nodes) -> + lists:foreach(fun(N) -> + F = lists:concat([Name, ".log.", N, ".txt"]), + ?line ok = sys:log_to_file({global_name_server, N}, F) + end, Nodes). + + +global_lost_nodes(suite) -> + []; +global_lost_nodes(doc) -> + ["Tests that locally loaded nodes do not loose contact with other nodes."]; +global_lost_nodes(Config) when is_list(Config) -> + Timeout = 60, + Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + + ?line {ok, Node1} = start_node(node1, Config), + ?line {ok, Node2} = start_node(node2, Config), + + ?line wait_for_ready_net(Config), + + ?line io:format("Nodes: ~p", [nodes()]), + ?line io:format("Nodes at node1: ~p", + [rpc:call(Node1, erlang, nodes, [])]), + ?line io:format("Nodes at node2: ~p", + [rpc:call(Node2, erlang, nodes, [])]), + + ?line rpc_cast(Node1, ?MODULE, global_load, [node_1,Node2,node_2]), + ?line rpc_cast(Node2, ?MODULE, global_load, [node_2,Node1,node_1]), + + lost_nodes_waiter(Node1, Node2), + + write_high_level_trace(Config), + ?line stop_node(Node1), + ?line stop_node(Node2), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +global_load(MyName, OtherNode, OtherName) -> + ?line yes = global:register_name(MyName, self()), + io:format("Registered ~p",[MyName]), + global_load1(OtherNode, OtherName, 0). + +global_load1(_OtherNode, _OtherName, 2) -> + io:format("*** ~p giving up. No use.", [node()]), + init:stop(); +global_load1(OtherNode, OtherName, Fails) -> + test_server:sleep(1000), + ?line case catch global:whereis_name(OtherName) of + Pid when is_pid(Pid) -> + io:format("~p says: ~p is still there.", + [node(),OtherName]), + global_load1(OtherNode, OtherName, Fails); + Other -> + io:format("~p says: ~p is lost (~p) Pinging.", + [ node(), OtherName, Other]), + case net_adm:ping(OtherNode) of + pong -> + io:format("Re-established contact to ~p", + [OtherName]); + pang -> + io:format("PANIC! Other node is DEAD.", []), + init:stop() + end, + global_load1(OtherNode, OtherName, Fails+1) + end. + +lost_nodes_waiter(N1, N2) -> + ?line net_kernel:monitor_nodes(true), + receive + {nodedown, Node} when Node =:= N1 ; Node =:= N2 -> + io:format("~p went down!",[Node]), + ?line ?t:fail("Node went down.") + after 10000 -> + ok + end, + ok. + + + +mass_death(suite) -> + []; +mass_death(doc) -> + ["Tests the simultaneous death of many processes with registered names"]; +mass_death(Config) when is_list(Config) -> + Timeout = 90, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line OrigNames = global:registered_names(), + %% Start nodes + ?line Cps = [cp1,cp2,cp3,cp4,cp5], + ?line Nodes = [begin {ok, Node} = start_node(Cp, Config), Node end || + Cp <- Cps], + ?line io:format("Nodes: ~p~n", [Nodes]), + ?line Ns = lists:seq(1, 40), + %% Start processes with globally registered names on the nodes + ?line {Pids,[]} = rpc:multicall(Nodes, ?MODULE, mass_spawn, [Ns]), + ?line io:format("Pids: ~p~n", [Pids]), + %% Wait... + ?line test_server:sleep(10000), + %% Check the globally registered names + ?line NewNames = global:registered_names(), + ?line io:format("NewNames: ~p~n", [NewNames]), + ?line Ndiff = lists:sort(NewNames--OrigNames), + ?line io:format("Ndiff: ~p~n", [Ndiff]), + ?line Ndiff = lists:sort(mass_names(Nodes, Ns)), + %% + %% Kill the root pids + ?line lists:foreach(fun (Pid) -> Pid ! drop_dead end, Pids), + %% Start probing and wait for all registered names to disappear + {YYYY,MM,DD} = date(), + {H,M,S} = time(), + io:format("Started probing: ~.4.0w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w~n", + [YYYY,MM,DD,H,M,S]), + wait_mass_death(Dog, Nodes, OrigNames, erlang:now(), Config). + +wait_mass_death(Dog, Nodes, OrigNames, Then, Config) -> + ?line Names = global:registered_names(), + ?line + case Names--OrigNames of + [] -> + ?line T = now_diff(erlang:now(), Then) div 1000, + ?line lists:foreach( + fun (Node) -> + stop_node(Node) + end, Nodes), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + {comment,lists:flatten(io_lib:format("~.3f s~n", [T/1000.0]))}; + Ndiff -> + ?line io:format("Ndiff: ~p~n", [Ndiff]), + ?line test_server:sleep(1000), + ?line wait_mass_death(Dog, Nodes, OrigNames, Then, Config) + end. + +mass_spawn([]) -> + ok; +mass_spawn([N|T]) -> + Parent = self(), + Pid = + spawn_link( + fun () -> + Name = mass_name(node(), N), + yes = global:register_name(Name, self()), + mass_spawn(T), + Parent ! self(), + loop() + end), + receive Pid -> Pid end. + +mass_names([], _) -> + []; +mass_names([Node|T],Ns) -> + [mass_name(Node, N) || N <- Ns] ++ mass_names(T, Ns). + +mass_name(Node, N) -> + list_to_atom(atom_to_list(Node)++"_"++integer_to_list(N)). + + + +start_nodes(L, How, Config) -> + start_nodes2(L, How, 0, Config), + Nodes = collect_nodes(0, length(L)), + ?line ?UNTIL([] =:= Nodes -- nodes()), + put(?nodes_tag, Nodes), + %% Pinging doesn't help, we have to wait too, for nodes() to become + %% correct on the other node. + lists:foreach(fun(E) -> + net_adm:ping(E) + end, + Nodes), + verify_nodes(Nodes, Config), + Nodes. + +%% Not used? +start_nodes_serially([], _, _Config) -> + []; +start_nodes_serially([Name | Rest], How, Config) -> + {ok, R} = start_node(Name, How, Config), + [R | start_nodes_serially(Rest, How, Config)]. + +verify_nodes(Nodes, Config) -> + verify_nodes(Nodes, lists:sort([node() | Nodes]), Config). + +verify_nodes([], _N, _Config) -> + []; +verify_nodes([Node | Rest], N, Config) -> + ?line ?UNTIL( + case rpc:call(Node, erlang, nodes, []) of + Nodes when is_list(Nodes) -> + case N =:= lists:sort([Node | Nodes]) of + true -> + true; + false -> + lists:foreach(fun(Nd) -> + rpc:call(Nd, net_adm, ping, + [Node]) + end, + nodes()), + false + end; + _ -> + false + end + ), + verify_nodes(Rest, N, Config). + + +start_nodes2([], _How, _, _Config) -> + []; +start_nodes2([Name | Rest], How, N, Config) -> + Self = self(), + spawn(fun() -> + erlang:display({starting, Name}), + {ok, R} = start_node(Name, How, Config), + erlang:display({started, Name, R}), + Self ! {N, R}, + %% sleeping is necessary, or with peer nodes, they will + %% go down again, despite {linked, false}. + test_server:sleep(100000) + end), + start_nodes2(Rest, How, N+1, Config). + +collect_nodes(N, N) -> + []; +collect_nodes(N, Max) -> + receive + {N, Node} -> + [Node | collect_nodes(N+1, Max)] + end. + +only_element(_E, []) -> + true; +only_element(E, [E|R]) -> + only_element(E, R); +only_element(_E, _) -> + false. + +exit_p(Pid) -> + Ref = erlang:monitor(process, Pid), + Pid ! die, + receive + {'DOWN', Ref, process, Pid, _Reason} -> + ok + end. + +wait_for_exit(Pid) -> + Ref = erlang:monitor(process, Pid), + receive + {'DOWN', Ref, process, Pid, _Reason} -> + ok + end. + +wait_for_exit_fast(Pid) -> + Ref = erlang:monitor(process, Pid), + receive + {'DOWN', Ref, process, Pid, _Reason} -> + ok + end. + +check_everywhere(Nodes, Name, Config) -> + ?UNTIL(begin + case rpc:multicall(Nodes, global, whereis_name, [Name]) of + {Ns1, []} -> + check_same_p(Ns1); + _R -> + false + end + end). + +init_condition(Config) -> + io:format("globally registered names: ~p~n", [global:registered_names()]), + io:format("nodes: ~p~n", [nodes()]), + io:format("known: ~p~n", [get_known(node()) -- [node()]]), + io:format("Info ~p~n", [setelement(11, global:info(), trace)]), + _ = [io:format("~s: ~p~n", [TN, ets:tab2list(T)]) || + {TN, T} <- [{"Global Names (ETS)", global_names}, + {"Global Names Ext (ETS)", global_names_ext}, + {"Global Locks (ETS)", global_locks}, + {"Global Pid Names (ETS)", global_pid_names}, + {"Global Pid Ids (ETS)", global_pid_ids}]], + ?UNTIL([test_server] =:= global:registered_names()), + ?UNTIL([] =:= nodes()), + ?UNTIL([node()] =:= get_known(node())), + ok. + +mk_node(N, H) when is_list(N), is_list(H) -> + list_to_atom(N ++ "@" ++ H). + +remove_gg_pub_type([]) -> + []; +remove_gg_pub_type([{GG, Nodes}|Rest]) -> + [{GG, Nodes}|remove_gg_pub_type(Rest)]; +remove_gg_pub_type([{GG, _, Nodes}|Rest]) -> + [{GG, Nodes}|remove_gg_pub_type(Rest)]. + +%% Send garbage message to all processes that are linked to global. +%% Better do this in a slave node. +%% (The transition from links to monitors does not affect this case.) + +garbage_messages(suite) -> + []; +garbage_messages(Config) when is_list(Config) -> + Timeout = 25, + ?line Dog = test_server:timetrap({seconds,Timeout}), + init_high_level_trace(Timeout), + ?line init_condition(Config), + ?line [Slave] = start_nodes([garbage_messages], slave, Config), + Fun = fun() -> + {links,L} = process_info(whereis(global_name_server), links), + lists:foreach(fun(Pid) -> Pid ! {garbage,to,you} end, L), + receive + _Any -> ok + end + end, + ?line Pid = spawn_link(Slave, erlang, apply, [Fun,[]]), + ?t:sleep(2000), + ?line Global = rpc:call(Slave, erlang, whereis, [global_name_server]), + ?line {registered_name,global_name_server} = + rpc:call(Slave, erlang, process_info, [Global,registered_name]), + ?line true = unlink(Pid), + write_high_level_trace(Config), + ?line stop_node(Slave), + ?line init_condition(Config), + ?line test_server:timetrap_cancel(Dog), + ok. + +wait_for_ready_net(Config) -> + wait_for_ready_net(?NODES, Config). + +wait_for_ready_net(Nodes0, Config) -> + Nodes = lists:sort(Nodes0), + ?t:format("wait_for_ready_net ~p~n", [Nodes]), + ?UNTIL(begin + lists:all(fun(N) -> Nodes =:= get_known(N) end, Nodes) and + lists:all(fun(N) -> + LNs = rpc:call(N, erlang, nodes, []), + Nodes =:= lists:sort([N | LNs]) + end, Nodes) + end). + +get_known(Node) -> + case catch gen_server:call({global_name_server,Node},get_known,infinity) of + {'EXIT', _} -> + [list, without, nodenames]; + Known when is_list(Known) -> + lists:sort([Node | Known]) + end. + +quite_a_few_nodes(Max) -> + N = try + ulimit("ulimit -u") + catch _:_ -> + ulimit("ulimit -p") % can fail... + end, + lists:min([(N - 40) div 3, Max]). + +ulimit(Cmd) -> + N0 = os:cmd(Cmd), + N1 = lists:reverse(N0), + N2 = lists:dropwhile(fun($\r) -> true; + ($\n) -> true; + (_) -> false + end, N1), + case lists:reverse(N2) of + "unlimited" -> 10000; + N -> list_to_integer(N) + end. + +%% To make it less probable that some low-level problem causes +%% problems, the receiving node is ping:ed. +rpc_cast(Node, Module, Function, Args) -> + {_,pong,Node}= {node(),net_adm:ping(Node),Node}, + rpc:cast(Node, Module, Function, Args). + +rpc_cast(Node, Module, Function, Args, File) -> + case net_adm:ping(Node) of + pong -> + rpc:cast(Node, Module, Function, Args); + Else -> + append_to_file(File, {now(), {rpc_cast, Node, Module, Function, + Args, Else}}) + %% Maybe we should crash, but it probably doesn't matter. + end. + +%% The emulator now ensures that the node has been removed from +%% nodes(). +rpc_disconnect_node(Node, DisconnectedNode, _Config) -> + True = rpc:call(Node, erlang, disconnect_node, [DisconnectedNode]), + False = lists:member(DisconnectedNode, rpc:call(Node, erlang, nodes, [])), + {true, false} = {True, False}. + +%%% +%%% Utility +%%% + +%% It is a bit awkward to collect data from different nodes. One way +%% of doing is to use a named tracer process on each node. Interesting +%% data is banged to the tracer and when the test is finished data is +%% collected on some node by sending messages to the tracers. One +%% cannot do this if the net has been set up to be less than fully +%% connected. One can also prepare other modules, such as 'global', by +%% inserting lines like +%% trace_message({node(), {at,?LINE}, {tag, message}) +%% where appropriate. + +start_tracer() -> + Pid = spawn(fun() -> tracer([]) end), + case catch register(my_tracer, Pid) of + {'EXIT', _} -> + ?t:fail(re_register_my_tracer); + _ -> + ok + end. + +tracer(L) -> + receive + % {save, Term} -> + % tracer([{now(),Term} | L]); + {get, From} -> + From ! {trace, lists:reverse(L)}, + tracer([]); + stop -> + exit(normal); + Term -> + tracer([{now(),Term} | L]) + end. + +stop_tracer() -> + trace_message(stop). + +get_trace() -> + trace_message({get, self()}), + receive {trace, L} -> + L + end. + +collect_tracers(Nodes) -> + Traces0 = [rpc:call(N, ?MODULE, get_trace, []) || N <- Nodes], + Traces = [L || L <- Traces0, is_list(L)], + try begin + Stamped = lists:keysort(1, lists:append(Traces)), + NotStamped = [T || {_, T} <- Stamped], + {Stamped, NotStamped} + end + catch _:_ -> {[], []} + end. + +trace_message(M) -> + case catch my_tracer ! M of + {'EXIT', _} -> + ?t:fail(my_tracer_not_registered); + _ -> + ok + end. + +%%----------------------------------------------------------------- +%% The error_logger handler used for OTP-6931. +%%----------------------------------------------------------------- +init(Tester) -> + {ok, Tester}. + +handle_event({_, _GL, {_Pid,_String,[{nodeup,fake_node}=Msg]}}, Tester) -> + Tester ! Msg, + {ok, Tester}; +handle_event(_Event, State) -> + {ok, State}. + +handle_info(_Info, State) -> + {ok, State}. + +handle_call(_Query, State) -> {ok, {error, bad_query}, State}. + +terminate(_Reason, State) -> + State. + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/heart_SUITE_data/Makefile.src erlang-13.b.3-dfsg/lib/kernel/test/heart_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/lib/kernel/test/heart_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/heart_SUITE_data/Makefile.src 1999-02-23 08:47:14.000000000 +0000 @@ -0,0 +1,14 @@ +CC = @CC@ +LD = @LD@ +CFLAGS = @CFLAGS@ -I@erl_include@ @DEFS@ +CROSSLDFLAGS = @CROSSLDFLAGS@ + +PROGS = simple_echo@exe@ + +all: $(PROGS) + +simple_echo@exe@: simple_echo@obj@ + $(LD) $(CROSSLDFLAGS) -o simple_echo simple_echo@obj@ @LIBS@ + +simple_echo@obj@: simple_echo.c + $(CC) -c -o simple_echo@obj@ $(CFLAGS) simple_echo.c diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/heart_SUITE_data/simple_echo.c erlang-13.b.3-dfsg/lib/kernel/test/heart_SUITE_data/simple_echo.c --- erlang-13.b.1-dfsg/lib/kernel/test/heart_SUITE_data/simple_echo.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/heart_SUITE_data/simple_echo.c 1999-02-23 08:47:16.000000000 +0000 @@ -0,0 +1,17 @@ +#include +#include +#include + +#ifdef VXWORKS +int simple_echo(void){ +#else +int main(void){ +#endif + int x; + while((x = getchar()) != EOF){ + putchar(x); + fflush(stdout); + } + return 0; +} + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/heart_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/heart_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/heart_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/heart_SUITE.erl 2009-11-20 13:30:00.000000000 +0000 @@ -0,0 +1,460 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(heart_SUITE). + +-include("test_server.hrl"). + +-export([all/1, ostype/1, start/1, restart/1, reboot/1, set_cmd/1, clear_cmd/1, + dont_drop/1, kill_pid/1, fini/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-export([start_heart_stress/1, mangle/1, suicide_by_heart/0]). + +-define(DEFAULT_TIMEOUT_SECS, 120). + +init_per_testcase(_Func, Config) -> + Dog=test_server:timetrap(test_server:seconds(?DEFAULT_TIMEOUT_SECS)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Nodes = nodes(), + lists:foreach(fun(X) -> + NNam = list_to_atom(hd(string:tokens(atom_to_list(X),"@"))), + case NNam of + heart_test -> + ?t:format(1, "WARNING: Killed ~p~n", [X]), + rpc:cast(X, erlang, halt, []); + _ -> + ok + end + end, Nodes), + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog). + +%%----------------------------------------------------------------- +%% Test suite for heart. +%% Should be started in a CC view with: +%% erl -sname master -rsh ctrsh +%%----------------------------------------------------------------- +all(suite) -> + [{conf, ostype, [start, restart, reboot, + set_cmd, clear_cmd, kill_pid], fini}]. + +ostype(Config) when is_list(Config) -> + case os:type() of + {win32, windows} -> + {skipped, "No use to run on Windows 95/98"}; + _ -> + Config + end. +fini(Config) when is_list(Config) -> + Config. + +start_check(Type, Name) -> + Args = case ?t:os_type() of + {win32,_} -> "-heart -env HEART_COMMAND no_reboot"; + _ -> "-heart" + end, + {ok, Node} = case Type of + loose -> + loose_node:start(Name, Args, ?DEFAULT_TIMEOUT_SECS); + _ -> + ?t:start_node(Name, Type, [{args, Args}]) + end, + erlang:monitor_node(Node, true), + case rpc:call(Node, erlang, whereis, [heart]) of + Pid when pid(Pid) -> + ok; + _ -> + test_server:fail(heart_not_started) + end, + {ok, Node}. + +start(doc) -> []; +start(suite) -> {req, [{time, 10}]}; +start(Config) when is_list(Config) -> + ?line {ok, Node} = start_check(slave, heart_test), + ?line rpc:call(Node, init, reboot, []), + receive + {nodedown, Node} -> + ok + after 2000 -> + test_server:fail(node_not_closed) + end, + test_server:sleep(5000), + ?line case net_adm:ping(Node) of + pang -> + ok; + _ -> + test_server:fail(node_rebooted) + end, + test_server:stop_node(Node). + +%% Also test fixed bug in R1B (it was not possible to +%% do init:stop/0 on a restarted system before) +%% Slave executes erlang:halt() on master nodedown. +%% Therefore the slave process has to be killed +%% before restart. +restart(doc) -> []; +restart(suite) -> + case ?t:os_type() of + {Fam, _} when Fam == unix; Fam == win32 -> + {req, [{time,10}]}; + _ -> + {skip, "Only run on unix and win32"} + end; +restart(Config) when is_list(Config) -> + ?line {ok, Node} = start_check(loose, heart_test), + ?line rpc:call(Node, init, restart, []), + receive + {nodedown, Node} -> + ok + after 2000 -> + test_server:fail(node_not_closed) + end, + test_server:sleep(5000), + + ?line case net_adm:ping(Node) of + pong -> + erlang:monitor_node(Node, true), + ?line rpc:call(Node, init, stop, []), + receive + {nodedown, Node} -> + ok + after 2000 -> + test_server:fail(node_not_closed2) + end, + ok; + _ -> + test_server:fail(node_not_restarted) + end, + loose_node:stop(Node). + +reboot(doc) -> []; +reboot(suite) -> {req, [{time, 10}]}; +reboot(Config) when is_list(Config) -> + {ok, Node} = start_check(slave, heart_test), + + ?line ok = rpc:call(Node, heart, set_cmd, + [atom_to_list(lib:progname()) ++ + " -noshell -heart " ++ name(Node) ++ "&"]), + ?line rpc:call(Node, init, reboot, []), + receive + {nodedown, Node} -> + ok + after 2000 -> + test_server:fail(node_not_closed) + end, + test_server:sleep(5000), + ?line case net_adm:ping(Node) of + pong -> + erlang:monitor_node(Node, true), + ?line rpc:call(Node, init, reboot, []), + receive + {nodedown, Node} -> + ok + after 2000 -> + test_server:fail(node_not_closed2) + end, + ok; + _ -> + test_server:fail(node_not_rebooted) + end, + ok. + +%% Only tests bad command, correct behaviour is tested in reboot/1. +set_cmd(suite) -> []; +set_cmd(Config) when is_list(Config) -> + ?line {ok, Node} = start_check(slave, heart_test), + Cmd = wrong_atom, + ?line {error, {bad_cmd, Cmd}} = rpc:call(Node, heart, set_cmd, [Cmd]), + Cmd1 = lists:duplicate(2047, $a), + ?line {error, {bad_cmd, Cmd1}} = rpc:call(Node, heart, set_cmd, [Cmd1]), + Cmd2 = lists:duplicate(28, $a), + ?line ok = rpc:call(Node, heart, set_cmd, [Cmd2]), + Cmd3 = lists:duplicate(2000, $a), + ?line ok = rpc:call(Node, heart, set_cmd, [Cmd3]), + stop_node(Node), + ok. + +clear_cmd(suite) -> {req,[{time,15}]}; +clear_cmd(Config) when is_list(Config) -> + ?line {ok, Node} = start_check(slave, heart_test), + ?line ok = rpc:call(Node, heart, set_cmd, + [atom_to_list(lib:progname()) ++ + " -noshell -heart " ++ name(Node) ++ "&"]), + ?line rpc:call(Node, init, reboot, []), + receive + {nodedown, Node} -> + ok + after 2000 -> + test_server:fail(node_not_closed) + end, + test_server:sleep(5000), + ?line case net_adm:ping(Node) of + pong -> + erlang:monitor_node(Node, true); + _ -> + test_server:fail(node_not_rebooted) + end, + ?line ok = rpc:call(Node, heart, set_cmd, + ["erl -noshell -heart " ++ name(Node) ++ "&"]), + ?line ok = rpc:call(Node, heart, clear_cmd, []), + ?line rpc:call(Node, init, reboot, []), + receive + {nodedown, Node} -> + ok + after 2000 -> + test_server:fail(node_not_closed) + end, + test_server:sleep(5000), + ?line case net_adm:ping(Node) of + pang -> + ok; + _ -> + test_server:fail(node_rebooted) + end, + ok. + +dont_drop(suite) -> +%%% Removed as it may crash epmd/distribution in colourful +%%% ways. While we ARE finding out WHY, it would +%%% be nice for others to be able to run the kernel test suite +%%% without "exploding machines", so thats why I removed it for now. + []; +dont_drop(doc) -> + ["Tests that the heart command does not get dropped when ", + "set just before halt on very high I/O load."]; +dont_drop(Config) when is_list(Config) -> + %%% Have to do it some times to make it happen... + case os:type() of + vxworks -> + {comment, "No use to run with slaves on other nodes..."}; + _ -> + [ok,ok,ok,ok,ok,ok,ok,ok,ok,ok] = do_dont_drop(Config,10), + ok + end. + +do_dont_drop(_,0) -> + []; +do_dont_drop(Config,N) -> + %% Name of first slave node + ?line NN1 = atom_to_list(?MODULE) ++ "slave_1", + %% Name of node started by heart on failure + ?line NN2 = atom_to_list(?MODULE) ++ "slave_2", + %% Name of node started by heart on success + ?line NN3 = atom_to_list(?MODULE) ++ "slave_3", + ?line Host = hd(tl(string:tokens(atom_to_list(node()),"@"))), + %% The initial heart command + ?line FirstCmd = erl() ++ name(NN2 ++ "@" ++ Host), + %% Separated the parameters to start_node_run for clarity... + ?line Name = list_to_atom(NN1), + ?line Env = [{"HEART_COMMAND", FirstCmd}], + ?line Func = "start_heart_stress", + ?line Arg = NN3 ++ "@" ++ Host ++ " " ++ + filename:join(?config(data_dir, Config), "simple_echo"), + ?line start_node_run(Name,Env,Func,Arg), + ?line case wait_for_any_of(list_to_atom(NN2 ++ "@" ++ Host), + list_to_atom(NN3 ++ "@" ++ Host)) of + 2 -> + ?line [ok | do_dont_drop(Config,N-1)]; + _ -> + ?line false + end. + +wait_for_any_of(N1,N2) -> + ?line wait_for_any_of(N1,N2,45). + +wait_for_any_of(_N1,_N2,0) -> + ?line false; + +wait_for_any_of(N1,N2,Times) -> + ?line receive + after 1000 -> + ?line ok + end, + ?line case net_adm:ping(N1) of + pang -> + ?line case net_adm:ping(N2) of + pang -> + ?line wait_for_any_of(N1,N2,Times - 1); + pong -> + ?line rpc:call(N2,init,stop,[]), + ?line 2 + end; + pong -> + ?line rpc:call(N1,init,stop,[]), + ?line 1 + end. + + +kill_pid(suite) -> + []; +kill_pid(doc) -> + ["Tests that heart kills the old erlang node before executing ", + "heart command."]; +kill_pid(Config) when is_list(Config) -> + %%% Have to do it some times to make it happen... + case os:type() of + vxworks -> + {comment, "No use to run with slaves on other nodes..."}; + _ -> + ok = do_kill_pid(Config) + end. + +do_kill_pid(_Config) -> + Name = heart_test, + Env = [{"HEART_COMMAND", "nickeNyfikenFarEttJobb"}], + {ok,Node} = start_node_run(Name,Env,suicide_by_heart,[]), + ok = wait_for_node(Node,15), + erlang:monitor_node(Node, true), + receive + {nodedown,Node} -> + ok + after 30000 -> + false + end. + +wait_for_node(_,0) -> + false; +wait_for_node(Node,N) -> + receive + after 1000 -> + ok + end, + case net_adm:ping(Node) of + pong -> + ok; + pang -> + wait_for_node(Node,N-1) + end. + +erl() -> + case os:type() of + {win32,_} -> + "werl "; + _ -> + "erl " + end. + +name(Node) when is_list(Node) -> name(Node,[]); +name(Node) when atom(Node) -> name(atom_to_list(Node),[]). + +name([$@|Node], Name) -> + case lists:member($., Node) of + true -> + "-name " ++ lists:reverse(Name); + _ -> + "-sname " ++ lists:reverse(Name) + end; +name([H|T], Name) -> + name(T, [H|Name]). + + +atom_conv(A) when atom(A) -> + atom_to_list(A); +atom_conv(A) when is_list(A) -> + A. + +env_conv([]) -> + []; +env_conv([{X,Y}|T]) -> + atom_conv(X) ++ " \"" ++ atom_conv(Y) ++ "\" " ++ env_conv(T). + +%%% +%%% Starts a node and runs a function in this +%%% module. +%%% Name is the node name as either atom or string, +%%% Env is a list of Tuples containing name-value pairs. +%%% Function is the function to run in this module +%%% Argument is the argument(s) to send through erl -s +%%% +start_node_run(Name, Env, Function, Argument) -> + ?line PA = filename:dirname(code:which(?MODULE)), + ?line Params = "-heart -env " ++ env_conv(Env) ++ " -pa " ++ PA ++ + " -s " ++ + atom_conv(?MODULE) ++ " " ++ atom_conv(Function) ++ " " ++ + atom_conv(Argument), + ?line start_node(Name, Params). + +start_node(Name, Param) -> + test_server:start_node(Name, slave, [{args, Param}]). + +stop_node(Node) -> + test_server:stop_node(Node). + + +%%% This code is run in a slave node to ensure that +%%% A heart command really gets set syncronously +%%% and cannot get "dropped". + +send_to(_,_,0) -> + ok; +send_to(Port,D,N) -> + Port ! {self(),{command,D}}, + send_to(Port,D,N-1). + +receive_from(_,_,0) -> + ok; + +receive_from(Port,D,N) -> + receive + {Port, {data,{eol,_Data}}} -> + receive_from(Port,D,N-1); + X -> + io:format("Got garbage ~p~n",[X]) + end. + +mangle(PP) when is_list(PP) -> + Port = open_port({spawn,PP},[{line,100}]), + mangle(Port); + +mangle(Port) -> + send_to(Port, "ABCDEFGHIJ" ++ io_lib:nl(),1), + receive_from(Port,"ABCDEFGHIJ",1), + mangle(Port). + + + +explode(0,_) -> + ok; +explode(N,PP) -> + spawn(?MODULE,mangle,[PP]), + explode(N-1,PP). + +start_heart_stress([NewName,PortProgram]) -> + explode(10,atom_to_list(PortProgram)), + NewCmd = erl() ++ name(NewName), + %%io:format("~p~n",[NewCmd]), + receive + after 10000 -> + heart:set_cmd(NewCmd), + halt() + end. + +suicide_by_heart() -> + %%io:format("Suicide starting...~n"), + open_port({spawn,"heart -ht 11 -pid "++os:getpid()},[{packet,2}]), + receive X -> X end, + %% Just hang and wait for heart to timeout + receive + {makaronipudding} -> + sallad + end. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone --- erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone 2009-09-18 15:10:21.000000000 +0100 @@ -0,0 +1,12 @@ +$TTL 3600 +@ IN SOA ns.otptest. lsa.otptest. ( + 1 ; serial + 60 ; refresh + 10 ; retry + 300 ; expiry + 30 ) ; minimum + + IN NS ns.otptest. + IN MX 10 mx.otptest. + +c.1 IN PTR resolve.otptest. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.127.in-addr.arpa.zone erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.127.in-addr.arpa.zone --- erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.127.in-addr.arpa.zone 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.127.in-addr.arpa.zone 2009-09-18 15:10:20.000000000 +0100 @@ -0,0 +1,27 @@ +$TTL 3600 +@ IN SOA ns.otptest. lsa.otptest. ( + 1 ; serial + 60 ; refresh + 10 ; retry + 300 ; expiry + 30 ) ; minimum + + IN NS ns.otptest. + IN MX 10 mx.otptest. + +1 IN PTR test1-78901234567890123456789012345678.otptest. +2 IN PTR test2-78901234567890123456789012345678.otptest. +10 IN PTR mx.otptest. +11 IN PTR ns1-5678901234567890123456789012345678.otptest. +12 IN PTR ns2-5678901234567890123456789012345678.otptest. +21 IN PTR mx1-5678901234567890123456789012345678.otptest. +22 IN PTR mx2-5678901234567890123456789012345678.otptest. +23 IN PTR mx3-5678901234567890123456789012345678.otptest. +24 IN PTR mx4-5678901234567890123456789012345678.otptest. +25 IN PTR mx5-5678901234567890123456789012345678.otptest. +26 IN PTR mx6-5678901234567890123456789012345678.otptest. +27 IN PTR mx7-5678901234567890123456789012345678.otptest. + +28 IN PTR resolve.otptest. + +254 IN PTR ns.otptest. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf --- erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf 2009-09-18 15:10:20.000000000 +0100 @@ -0,0 +1,12 @@ +zone "." in { + type master; + file "root.zone"; +}; +zone "0.0.127.in-addr.arpa" in { + type master; + file "0.0.127.in-addr.arpa.zone"; +}; +zone "0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" in { + type master; + file "0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone"; +}; \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone --- erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone 2009-09-18 15:10:19.000000000 +0100 @@ -0,0 +1,50 @@ +$TTL 3600 +@ IN SOA ns.otptest lsa.otptest ( + 1 ; serial + 60 ; refresh + 10 ; retry + 300 ; expiry + 30 ) ; minimum + + IN NS ns.otptest + IN NS ns1-5678901234567890123456789012345678.otptest + IN NS ns2-5678901234567890123456789012345678.otptest +otptest IN MX 10 mx.otptest +otptest IN MX 20 mx1-5678901234567890123456789012345678.otptest +otptest IN MX 20 mx2-5678901234567890123456789012345678.otptest +otptest IN MX 20 mx3-5678901234567890123456789012345678.otptest +otptest IN MX 20 mx4-5678901234567890123456789012345678.otptest +otptest IN MX 20 mx5-5678901234567890123456789012345678.otptest +otptest IN MX 20 mx6-5678901234567890123456789012345678.otptest +otptest IN MX 20 mx7-5678901234567890123456789012345678.otptest + +test1-78901234567890123456789012345678.otptest IN A 127.0.0.1 +test2-78901234567890123456789012345678.otptest IN A 127.0.0.2 +ns1-5678901234567890123456789012345678.otptest IN A 127.0.0.11 +ns2-5678901234567890123456789012345678.otptest IN A 127.0.0.12 +mx.otptest IN A 127.0.0.10 +mx1-5678901234567890123456789012345678.otptest IN A 127.0.0.21 +mx2-5678901234567890123456789012345678.otptest IN A 127.0.0.22 +mx3-5678901234567890123456789012345678.otptest IN A 127.0.0.23 +mx4-5678901234567890123456789012345678.otptest IN A 127.0.0.24 +mx5-5678901234567890123456789012345678.otptest IN A 127.0.0.25 +mx6-5678901234567890123456789012345678.otptest IN A 127.0.0.26 +mx7-5678901234567890123456789012345678.otptest IN A 127.0.0.27 + +resolve.otptest IN A 127.0.0.28 +resolve.otptest IN AAAA ::127.0.0.28 +cname.resolve.otptest IN CNAME resolve.otptest +wks.resolve.otptest IN WKS 127.0.0.28 TCP ( telnet smtp ) +resolve.otptest IN HINFO "BEAM" "Erlang/OTP" +ns.resolve.otptest IN NS resolve.otptest +mx.resolve.otptest IN MX 10 resolve.otptest +_srv._tcp.resolve.otptest IN SRV 10 3 4711 resolve.otptest +naptr.resolve.otptest IN NAPTR 10 5 "S" "HTTP" "" _srv._tcp.resolve.otptest +txt.resolve.otptest IN TXT "Hej " "du " "glade " +txt.resolve.otptest IN TXT "ta " "en " "spade!" +mb.resolve.otptest IN MB mx.resolve.otptest +mg.resolve.otptest IN MG lsa.otptest +mr.resolve.otptest IN MR lsa.otptest +minfo.resolve.otptest IN MINFO minfo-owner.resolve.otptest minfo-bounce.resolve.otptest + +ns.otptest IN A 127.0.0.254 diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE_data/run-named erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE_data/run-named --- erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE_data/run-named 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE_data/run-named 2009-09-18 15:10:19.000000000 +0100 @@ -0,0 +1,163 @@ +#! /bin/sh +## +## %CopyrightBegin% +## +## Copyright Ericsson AB 2009. All Rights Reserved. +## +## The contents of this file are subject to the Erlang Public License, +## Version 1.1, (the "License"); you may not use this file except in +## compliance with the License. You should have received a copy of the +## Erlang Public License along with this software. If not, it can be +## retrieved online at http://www.erlang.org/. +## +## Software distributed under the License is distributed on an "AS IS" +## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +## the License for the specific language governing rights and limitations +## under the License. +## +## %CopyrightEnd% +## +# + +# +## run-named +## +## $0 IPAddress PortNum SubDir +## +## * Create a work directory ./SubDir, create a named.conf there. +## * Locate named and check its version. +## * Zopy zone files from `dirname $0`/SubDir to ./SubDir. +## * Start named in ./SubDir with logging to named.log there. +## * Wait for "quit" on stdin. +## * Terminate named and wait for it. +## +## Prints status lines starting with tag and colon (think mail header): +## Error: have given up, no name server started +## Running: name server is running, waiting for "quit" +## Other tags: diagnostics info +# + +unset LDPATH CDPATH ENV BASH_ENV +IFS=' ' +PATH=/usr/sbin:/sbin:/usr/bin:/bin +SHELL=/bin/sh +export PATH SHELL + +CONF_FILE=named.conf +INC_FILE=named_inc.conf +PID_FILE=named.pid +LOG_FILE=named.log + +error () { + r=$? + echo "Error: $*" + exit $r +} + +# Check argument: IP address +test :"$1" != : || \ + error "Empty argument 1: IP address !" + +# Check argument: Port number +expr "0$2" + 0 '>' 0 '&' "0$2" + 0 '<' 65536 >/dev/null 2>&1 || \ + error "Invalid argument 2: port number !" + +# Check argument: Work/Zone subdir +test :"$3" != : || \ + error "Empty argument 3: Work/Zone subdir!" +SRCDIR="`dirname "$0"`/$3" +test -d "$SRCDIR" || \ + error "Missing zone directory $SRCDIR !" +test -f "$SRCDIR/$INC_FILE" || \ + error "Missing file: $SRCDIR/$INC_FILE !" + +# Locate named and check version +NAMED=named +for n in /usr/sbin/named /usr/sbin/in.named; do + test -x "$n" && NAMED="$n" +done +NAMED_VER="`"$NAMED" -v 2>&1`" || \ + error "Name server not found!" +NAMED_VER=`echo "$NAMED_VER" | ( read V1 V2 V3 IGNORED && \ + if test :"$V1" = :'in.named'; then + echo "$V2 $V3" + else + echo "$V1 $V2" + fi +)` +case :"$NAMED_VER" in + :'BIND '8.*) NAMED_FG='-f';; + :'BIND '9.*) NAMED_FG='-g';; + :*) error "Name server version is unknown: $NAMED_VER";; +esac + +# Create working directory and cd to it +mkdir "$3" >/dev/null 2>&1 +cd "$3" >/dev/null 2>&1 || \ + error "Can not cd: $3 !" + +# Create $CONF_FILE +cat >"$CONF_FILE" <<-CONF_FILE + # + # $CONF_FILE for $NAMED_VER + # Generated by $0. + # + # Copyright: see $0. + # + logging { + category default { + default_stderr; + }; + }; + CONF_FILE +case :"$NAMED_VER" in + :'BIND '8.*|:'BIND '9.[012]|:'BIND '9.[012].*) + cat >>"$CONF_FILE" <<-CONF_FILE + controls { + inet 127.0.0.1 port 0 allow { !0/32; }; + }; + options { + pid-file "$PID_FILE"; + listen-on port $2 { $1; }; + recursion no; + allow-query { $1; }; + }; + CONF_FILE + ;; + :*) + cat >>"$CONF_FILE" <<-CONF_FILE + controls { + }; + options { + pid-file none; + listen-on port $2 { $1; }; + recursion no; + allow-query { $1; }; + }; + CONF_FILE + ;; +esac +cat >>"$CONF_FILE" <<-CONF_FILE + include "$INC_FILE"; + CONF_FILE + +# Copy all subdir files +( cd "$SRCDIR" && ls -1 ) | while read f; do + cp -fp "$SRCDIR/$f" . +done + +# Start nameserver +echo "Cwd: `pwd`" +echo "Nameserver: $NAMED_VER" +echo "Port: $2" +echo "ZoneDir: $3" +$NAMED $NAMED_FG -c "$CONF_FILE" >"$LOG_FILE" 2>&1 /dev/null 2>&1; wait $NAMED >/dev/null 2>&1" \ + 0 1 2 3 15 +sleep 1 # Give name server time to load its zone files +echo "Running: Enter \`\`quit'' to terminate nameserver[$NAMED]..." +while read LINE; do + test :"$LINE" = :'quit' && break +done +echo "Closing: Terminating nameserver..." diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/inet_res_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_res_SUITE.erl 2009-09-18 15:10:20.000000000 +0100 @@ -0,0 +1,418 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(inet_res_SUITE). + +-include("test_server.hrl"). +-include("test_server_line.hrl"). + +-include_lib("kernel/include/inet.hrl"). +-include_lib("kernel/src/inet_dns.hrl"). + +-export([all/1, init_per_testcase/2, end_per_testcase/2]). +-export([basic/1, resolve/1, edns0/1, txt_record/1, files_monitor/1]). +-export([gethostbyaddr/1, gethostbyaddr_v6/1, + gethostbyname/1, gethostbyname_v6/1, + getaddr/1, getaddr_v6/1, ipv4_to_ipv6/1, host_and_addr/1]). + +-define(RUN_NAMED, "run-named"). + +all(suite) -> + [basic, resolve, edns0, txt_record, files_monitor, + gethostbyaddr, gethostbyaddr_v6, gethostbyname, gethostbyname_v6, + getaddr, getaddr_v6, ipv4_to_ipv6, host_and_addr]. + +zone_dir(basic) -> + otptest; +zone_dir(resolve) -> + otptest; +zone_dir(edns0) -> + otptest; +zone_dir(files_monitor) -> + otptest; +zone_dir(_) -> + undefined. + +init_per_testcase(Func, Config) -> + PrivDir = ?config(priv_dir, Config), + DataDir = ?config(data_dir, Config), + try ns_init(zone_dir(Func), PrivDir, DataDir) of + NsSpec -> + Lookup = inet_db:res_option(lookup), + inet_db:set_lookup([file,dns]), + case NsSpec of + {_,{IP,Port},_} -> + inet_db:ins_alt_ns(IP, Port); + _ -> ok + end, + Dog = test_server:timetrap(test_server:seconds(10)), + [{nameserver,NsSpec},{res_lookup,Lookup},{watchdog,Dog}|Config] + catch + SkipReason -> + {skip,SkipReason} + end. + +end_per_testcase(_Func, Config) -> + test_server:timetrap_cancel(?config(watchdog, Config)), + inet_db:set_lookup(?config(res_lookup, Config)), + NsSpec = ?config(nameserver, Config), + case NsSpec of + {_,{IP,Port},_} -> + inet_db:del_alt_ns(IP, Port); + _ -> ok + end, + ns_end(NsSpec, ?config(priv_dir, Config)). + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Nameserver control + +ns(Config) -> + {_ZoneDir,NS,_P} = ?config(nameserver, Config), + NS. + +ns_init(ZoneDir, PrivDir, DataDir) -> + case os:type() of + {unix,_} when ZoneDir =:= undefined -> undefined; + {unix,_} -> + {ok,S} = gen_udp:open(0, [{reuseaddr,true}]), + {ok,PortNum} = inet:port(S), + gen_udp:close(S), + RunNamed = filename:join(DataDir, ?RUN_NAMED), + NS = {{127,0,0,1},PortNum}, + P = erlang:open_port({spawn_executable,RunNamed}, + [{cd,PrivDir}, + {line,80}, + {args,["127.0.0.1", + integer_to_list(PortNum), + atom_to_list(ZoneDir)]}, + stderr_to_stdout, + eof]), + ns_start(ZoneDir, NS, P); + _ -> + throw("Only run on Unix") + end. + +ns_start(ZoneDir, NS, P) -> + case ns_collect(P) of + eof -> + erlang:error(eof); + "Running: "++_ -> + {ZoneDir,NS,P}; + "Error: "++Error -> + throw(Error); + _ -> + ns_start(ZoneDir, NS, P) + end. + +ns_end(undefined, _PrivDir) -> undefined; +ns_end({ZoneDir,_NS,P}, PrivDir) -> + port_command(P, ["quit",io_lib:nl()]), + ns_stop(P), + ns_printlog(filename:join([PrivDir,ZoneDir,"named.log"])), + ok. + +ns_stop(P) -> + case ns_collect(P) of + eof -> + erlang:port_close(P); + _ -> + ns_stop(P) + end. + +ns_collect(P) -> + ns_collect(P, []). +ns_collect(P, Buf) -> + receive + {P,{data,{eol,L}}} -> + Line = lists:flatten(lists:reverse(Buf, [L])), + io:format("~s", [Line]), + Line; + {P,{data,{noeol,L}}} -> + ns_collect(P, [L|Buf]); + {P,eof} -> + eof + end. + +ns_printlog(Fname) -> + io:format("Name server log file contents:~n", []), + case file:read_file(Fname) of + {ok,Bin} -> + io:format("~s~n", [Bin]); + _ -> + ok + end. + +%% +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +basic(doc) -> + ["Lookup an A record with different API functions"]; +basic(Config) when is_list(Config) -> + NS = ns(Config), + Name = "ns.otptest", + IP = {127,0,0,254}, + %% + %% nslookup + {ok,Msg1} = inet_res:nslookup(Name, in, a, [NS]), + io:format("~p~n", [Msg1]), + [RR1] = inet_dns:msg(Msg1, anlist), + IP = inet_dns:rr(RR1, data), + Bin1 = inet_dns:encode(Msg1), + %%io:format("Bin1 = ~w~n", [Bin1]), + {ok,Msg1} = inet_dns:decode(Bin1), + %% + %% resolve + {ok,Msg2} = inet_res:resolve(Name, in, a, [{nameservers,[NS]}]), + io:format("~p~n", [Msg2]), + [RR2] = inet_dns:msg(Msg2, anlist), + IP = inet_dns:rr(RR2, data), + Bin2 = inet_dns:encode(Msg2), + %%io:format("Bin2 = ~w~n", [Bin2]), + {ok,Msg2} = inet_dns:decode(Bin2), + %% + %% lookup + [IP] = inet_res:lookup(Name, in, a, [{nameservers,[NS]}]), + %% + %% gethostbyname + {ok,#hostent{h_addr_list=[IP]}} = inet_res:gethostbyname(Name), + %% + %% getbyname + {ok,#hostent{h_addr_list=[IP]}} = inet_res:getbyname(Name, a), + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +resolve(doc) -> + ["Lookup different records using resolve/2..4"]; +resolve(Config) when is_list(Config) -> + NS = ns(Config), + Domain = "otptest", + RDomain4 = "0.0.127.in-addr.arpa", + RDomain6 = "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa", + Name = "resolve."++Domain, + L = [{in,a,Name,[{127,0,0,28}],undefined}, + {in,aaaa,Name,[{0,0,0,0,0,0,32512,28}],undefined}, + {in,cname,"cname."++Name,[Name],undefined}, + {in,a,"cname."++Name,[Name,{127,0,0,28}],undefined}, + {in,ns,"ns."++Name,[],[Name]}, + {in,soa,Domain,[],[{"ns.otptest","lsa.otptest",1,60,10,300,30}]}, + %% WKS: protocol TCP (6), services (bits) TELNET (23) and SMTP (25) + {in,wks,"wks."++Name,[{{127,0,0,28},6,<<0,0,1,64>>}],undefined}, + {in,ptr,"28."++RDomain4,[Name],undefined}, + {in,ptr,"c.1.0.0.0.0.f.7."++RDomain6,[Name],undefined}, + {in,hinfo,Name,[{"BEAM","Erlang/OTP"}],undefined}, + {in,mx,RDomain4,[{10,"mx."++Domain}],undefined}, + {in,srv,"_srv._tcp."++Name,[{10,3,4711,Name}],undefined}, + {in,naptr,"naptr."++Name, + [{10,5,"s","http","","_srv._tcp."++Name}],undefined}, + {in,txt,"txt."++Name, + [["Hej ","du ","glade "],["ta ","en ","spade!"]],undefined}, + {in,mb,"mb."++Name,["mx."++Name],undefined}, + {in,mg,"mg."++Name,["lsa."++Domain],undefined}, + {in,mr,"mr."++Name,["lsa."++Domain],undefined}, + {in,minfo,"minfo."++Name, + [{"minfo-owner."++Name,"minfo-bounce."++Name}],undefined}, + {in,any,"cname."++Name,[Name],undefined}, + {in,any,Name,[{127,0,0,28}, + {0,0,0,0,0,0,32512,28}, + {"BEAM","Erlang/OTP"}],undefined} + ], + resolve([{edns,false},{nameservers,[NS]}], L), + resolve([{edns,0},{nameservers,[NS]}], L). + +resolve(_Opts, []) -> ok; +resolve(Opts, [{Class,Type,Name,Answers,Authority}=Q|Qs]) -> + io:format("Query: ~p~nOptions: ~p~n", [Q,Opts]), + {ok,Msg} = inet_res:resolve(Name, Class, Type, Opts), + if Answers =/= undefined -> + AnList = lists:sort(Answers), + AnList = lists:sort([inet_dns:rr(RR, data) || + RR <- inet_dns:msg(Msg, anlist)]); + true -> ok end, + if Authority =/= undefined -> + NsList = lists:sort(Authority), + NsList = lists:sort([inet_dns:rr(RR, data) || + RR <- inet_dns:msg(Msg, nslist)]); + true -> ok end, + Buf = inet_dns:encode(Msg), + {ok,Msg} = inet_dns:decode(Buf), + resolve(Opts, Qs). + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +edns0(doc) -> + ["Test EDNS and truncation"]; +edns0(Config) when is_list(Config) -> + NS = ns(Config), + Domain = "otptest", + Filler = "-5678901234567890123456789012345678.", + MXs = lists:sort([{10,"mx."++Domain}, + {20,"mx1"++Filler++Domain}, + {20,"mx2"++Filler++Domain}, + {20,"mx3"++Filler++Domain}, + {20,"mx4"++Filler++Domain}, + {20,"mx5"++Filler++Domain}, + {20,"mx6"++Filler++Domain}, + {20,"mx7"++Filler++Domain}]), + false = inet_db:res_option(edns), % ASSERT + true = inet_db:res_option(udp_payload_size) >= 1280, % ASSERT + %% These will fall back to TCP + MXs = lists:sort(inet_res:lookup(Domain, in, mx, [{nameservers,[NS]}])), + %% + {ok,#hostent{h_addr_list=As}} = inet_res:getbyname(Domain++".", mx), + MXs = lists:sort(As), + %% + {ok,Msg1} = inet_res:resolve(Domain, in, mx), + MXs = lists:sort(inet_res_filter(inet_dns:msg(Msg1, anlist), in, mx)), + %% There should be no OPT record in the answer + [] = [RR || RR <- inet_dns:msg(Msg1, arlist), + inet_dns:rr(RR, type) =:= opt], + Buf1 = inet_dns:encode(Msg1), + {ok,Msg1} = inet_dns:decode(Buf1), + %% + %% Use EDNS - should not need to fall back to TCP + %% there is no way to tell from the outside. + %% + {ok,Msg2} = inet_res:resolve(Domain, in, mx, [{edns,0}]), + MXs = lists:sort(inet_res_filter(inet_dns:msg(Msg2, anlist), in, mx)), + Buf2 = inet_dns:encode(Msg2), + {ok,Msg2} = inet_dns:decode(Buf2), + [OptRR] = [RR || RR <- inet_dns:msg(Msg2, arlist), + inet_dns:rr(RR, type) =:= opt], + io:format("~p~n", [inet_dns:rr(OptRR)]), + ok. + +inet_res_filter(Anlist, Class, Type) -> + [inet_dns:rr(RR, data) || RR <- Anlist, + inet_dns:rr(RR, type) =:= Type, + inet_dns:rr(RR, class) =:= Class]. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +txt_record(suite) -> + []; +txt_record(doc) -> + ["Tests TXT records"]; +txt_record(Config) when is_list(Config) -> + D1 = "cslab.ericsson.net", + D2 = "mail1.cslab.ericsson.net", + {ok,#dns_rec{anlist=[RR1]}} = + inet_res:nslookup(D1, in, txt), + io:format("~p~n", [RR1]), + {ok,#dns_rec{anlist=[RR2]}} = + inet_res:nslookup(D2, in, txt), + io:format("~p~n", [RR2]), + #dns_rr{domain=D1, class=in, type=txt, data=A1} = RR1, + #dns_rr{domain=D2, class=in, type=txt, data=A2} = RR2, + case [lists:flatten(A2)] of + A1 = [[_|_]] -> ok + end, + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +files_monitor(suite) -> + []; +files_monitor(doc) -> + ["Tests monitoring of /etc/hosts and /etc/resolv.conf, but not them"]; +files_monitor(Config) when is_list(Config) -> + HostsFile = inet_db:res_option(hosts_file), + ResolvConf = inet_db:res_option(resolv_conf), + Inet6 = inet_db:res_option(inet6), + try do_files_monitor(Config) + after + inet_db:res_option(resolv_conf, ResolvConf), + inet_db:res_option(hosts_file, HostsFile), + inet_db:res_option(inet6, Inet6) + end. + +do_files_monitor(Config) -> + Dir = ?config(priv_dir, Config), + {ok,Hostname} = inet:gethostname(), + FQDN = Hostname++"."++inet_db:res_option(domain), + HostsFile = filename:join(Dir, "files_monitor_hosts"), + ResolvConf = filename:join(Dir, "files_monitor_resolv.conf"), + ok = inet_db:res_option(resolv_conf, ResolvConf), + ok = inet_db:res_option(hosts_file, HostsFile), + [] = inet_db:res_option(search), + {ok,#hostent{h_name = Hostname, + h_addrtype = inet, + h_length = 4, + h_addr_list = [{127,0,0,1}]}} = inet:gethostbyname(Hostname), + {ok,#hostent{h_name = FQDN, + h_addrtype = inet, + h_length = 4, + h_addr_list = [{127,0,0,1}]}} = inet:gethostbyname(FQDN), + {error,nxdomain} = inet_res:gethostbyname(Hostname), + {error,nxdomain} = inet_res:gethostbyname(FQDN), + {ok,{127,0,0,10}} = inet:getaddr("mx.otptest", inet), + {ok,{0,0,0,0,0,0,32512,28}} = inet:getaddr("resolve.otptest", inet6), + ok = inet_db:res_option(inet6, true), + {ok,#hostent{h_name = Hostname, + h_addrtype = inet6, + h_length = 16, + h_addr_list = [{0,0,0,0,0,0,0,1}]}} = + inet:gethostbyname(Hostname), + {ok,#hostent{h_name = FQDN, + h_addrtype = inet6, + h_length = 16, + h_addr_list = [{0,0,0,0,0,0,0,1}]}} = + inet:gethostbyname(FQDN), + {error,nxdomain} = inet_res:gethostbyname("resolve"), + %% XXX inet does not honour res_option inet6, might be a problem? + %% therefore inet_res is called here + {ok,#hostent{h_name = "resolve.otptest", + h_addrtype = inet6, + h_length = 16, + h_addr_list = [{0,0,0,0,0,0,32512,28}]}} = + inet_res:gethostbyname("resolve.otptest"), + {error,nxdomain} = inet_hosts:gethostbyname("files_monitor"), + ok = file:write_file(ResolvConf, "search otptest\n"), + ok = file:write_file(HostsFile, "::100 files_monitor\n"), + receive after 7000 -> ok end, % RES_FILE_UPDATE_TM in inet_res.hrl is 5 s + {ok,#hostent{h_name = "resolve.otptest", + h_addrtype = inet6, + h_length = 16, + h_addr_list = [{0,0,0,0,0,0,32512,28}]}} = + inet_res:gethostbyname("resolve.otptest"), + ["otptest"] = inet_db:res_option(search), + {ok,#hostent{h_name = "files_monitor", + h_addrtype = inet6, + h_length = 16, + h_addr_list = [{0,0,0,0,0,0,0,256}]}} = + inet_hosts:gethostbyname("files_monitor"), + ok = inet_db:res_option(inet6, false), + {ok,#hostent{h_name = "resolve.otptest", + h_addrtype = inet, + h_length = 4, + h_addr_list = [{127,0,0,28}]}} = + inet:gethostbyname("resolve.otptest"), + ok. + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Compatibility tests. Call the inet_SUITE tests, but with +%% lookup = [file,dns] instead of [native] + +gethostbyaddr(Config) -> inet_SUITE:t_gethostbyaddr(Config). +gethostbyaddr_v6(Config) -> inet_SUITE:t_gethostbyaddr_v6(Config). +gethostbyname(Config) -> inet_SUITE:t_gethostbyname(Config). +gethostbyname_v6(Config) -> inet_SUITE:t_gethostbyname_v6(Config). +getaddr(Config) -> inet_SUITE:t_getaddr(Config). +getaddr_v6(Config) -> inet_SUITE:t_getaddr_v6(Config). +ipv4_to_ipv6(Config) -> inet_SUITE:ipv4_to_ipv6(Config). +host_and_addr(Config) -> inet_SUITE:host_and_addr(Config). diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_sockopt_SUITE_data/Makefile.src erlang-13.b.3-dfsg/lib/kernel/test/inet_sockopt_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/lib/kernel/test/inet_sockopt_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_sockopt_SUITE_data/Makefile.src 2007-11-26 19:01:37.000000000 +0000 @@ -0,0 +1,14 @@ +CC = @CC@ +LD = @LD@ +CFLAGS = @CFLAGS@ -I@erl_include@ @DEFS@ +CROSSLDFLAGS = @CROSSLDFLAGS@ + +PROGS = sockopt_helper@exe@ + +all: $(PROGS) + +sockopt_helper@exe@: sockopt_helper@obj@ + $(LD) $(CROSSLDFLAGS) -o sockopt_helper sockopt_helper@obj@ @LIBS@ + +sockopt_helper@obj@: sockopt_helper.c + $(CC) -c -o sockopt_helper@obj@ $(CFLAGS) sockopt_helper.c diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_sockopt_SUITE_data/sockopt_helper.c erlang-13.b.3-dfsg/lib/kernel/test/inet_sockopt_SUITE_data/sockopt_helper.c --- erlang-13.b.1-dfsg/lib/kernel/test/inet_sockopt_SUITE_data/sockopt_helper.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_sockopt_SUITE_data/sockopt_helper.c 2007-11-30 18:02:31.000000000 +0000 @@ -0,0 +1,219 @@ +#if defined(VXWORKS) || defined(__OSE__) +#include +#include +#include +int sockopt_helper(void){ + return 0; +} +#else + +#if defined(__WIN32__) +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include + +#else /* Unix */ + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LINUX_TCP_H +#ifdef HAVE_SANE_LINUX_TCP_H +#include +#endif +#endif +#include +#include +#include +#include +#include + +#endif + +#define C_GET_IPPROTO_TCP 1 +#define C_GET_IPPROTO_IP 2 +#define C_GET_SOL_SOCKET 3 +#define C_GET_SOL_IP 4 + +#define C_GET_TCP_KEEPIDLE 11 +#define C_GET_TCP_LINGER2 12 +#define C_GET_TCP_INFO 13 +#define C_GET_SO_REUSEADDR 14 +#define C_GET_SO_KEEPALIVE 15 +#define C_GET_SO_LINGER 16 + +#define C_GET_LINGER_SIZE 21 +#define C_GET_TCP_INFO_SIZE 22 + +#define C_GET_OFF_LINGER_L_ONOFF 31 +#define C_GET_OFF_LINGER_L_LINGER 32 +#define C_GET_OFF_TCPI_SACKED 33 +#define C_GET_OFF_TCPI_OPTIONS 34 + +#define C_GET_SIZ_LINGER_L_ONOFF 41 +#define C_GET_SIZ_LINGER_L_LINGER 42 +#define C_GET_SIZ_TCPI_SACKED 43 +#define C_GET_SIZ_TCPI_OPTIONS 44 + +#define C_QUIT 99 + +int get_command(void) +{ + char buff[256]; + int res; + if (fgets(buff,256,stdin) == NULL) + exit(1); + sscanf(buff,"%d",&res); + return res; +} + +void put_answer(int x) +{ + printf("%d\n",x); +} + +int main(void){ + int x; + int res; + setbuf(stdin,NULL); + setbuf(stdout,NULL); + do { + x = get_command(); + + switch(x) { +#ifdef IPPROTO_TCP + case C_GET_IPPROTO_TCP: + res = IPPROTO_TCP; + break; +#endif +#ifdef IPPROTO_IP + case C_GET_IPPROTO_IP: + res = IPPROTO_IP; + break; +#endif +#ifdef SOL_SOCKET + case C_GET_SOL_SOCKET: + res = SOL_SOCKET; + break; +#endif +#ifdef SOL_IP + case C_GET_SOL_IP : + res = SOL_IP; + break; +#endif +#ifdef TCP_KEEPIDLE + case C_GET_TCP_KEEPIDLE: + res = TCP_KEEPIDLE; + break; +#endif +#ifdef TCP_LINGER2 + case C_GET_TCP_LINGER2: + res = TCP_LINGER2; + break; +#endif +#ifdef TCP_INFO + case C_GET_TCP_INFO: + res = TCP_INFO; + break; +#endif +#ifdef SO_REUSEADDR + case C_GET_SO_REUSEADDR: + res = SO_REUSEADDR; + break; +#endif +#ifdef SO_KEEPALIVE + case C_GET_SO_KEEPALIVE: + res = SO_KEEPALIVE; + break; +#endif +#ifdef SO_LINGER + case C_GET_SO_LINGER: + res = SO_LINGER; + break; +#endif +#ifdef SO_LINGER + case C_GET_LINGER_SIZE: + res = sizeof(struct linger); + break; +#endif +#if defined(TCP_INFO) && defined(HAVE_LINUX_TCP_H) + case C_GET_TCP_INFO_SIZE: + res = sizeof(struct tcp_info); + break; +#endif +#ifdef SO_LINGER + case C_GET_OFF_LINGER_L_ONOFF: + { + struct linger l; + res = ((char *) &(l.l_onoff)) - ((char *) &l); + } + break; + case C_GET_OFF_LINGER_L_LINGER: + { + struct linger l; + res = ((char *) &(l.l_linger)) - ((char *) &l); + } + break; +#endif +#if defined(TCP_INFO) && defined(HAVE_LINUX_TCP_H) + case C_GET_OFF_TCPI_SACKED: + { + struct tcp_info ti; + res = ((char *) &(ti.tcpi_sacked)) - ((char *) &(ti)); + } + break; + case C_GET_OFF_TCPI_OPTIONS: + { + struct tcp_info ti; + res = ((char *) &(ti.tcpi_options)) - ((char *) &(ti)); + } + break; +#endif +#ifdef SO_LINGER + case C_GET_SIZ_LINGER_L_ONOFF: + { + struct linger l; + res = sizeof(l.l_onoff); + } + break; + case C_GET_SIZ_LINGER_L_LINGER: + { + struct linger l; + res = sizeof(l.l_linger); + } + break; +#endif +#if defined(TCP_INFO) && defined(HAVE_LINUX_TCP_H) + case C_GET_SIZ_TCPI_SACKED: + { + struct tcp_info ti; + res = sizeof(ti.tcpi_sacked); + } + break; + case C_GET_SIZ_TCPI_OPTIONS: + { + struct tcp_info ti; + res = sizeof(ti.tcpi_options); + } + break; +#endif + case C_QUIT: + res = 0; + break; + default: + res = -1; + } + put_answer(res); + } while (x != C_QUIT); + return 0; +} +#endif + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_sockopt_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/inet_sockopt_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/inet_sockopt_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_sockopt_SUITE.erl 2009-11-20 13:32:30.000000000 +0000 @@ -0,0 +1,681 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(inet_sockopt_SUITE). + +-include("test_server.hrl"). + + +-define(C_GET_IPPROTO_TCP,1). +-define(C_GET_IPPROTO_IP,2). +-define(C_GET_SOL_SOCKET,3). +-define(C_GET_SOL_IP,4). + +-define(C_GET_TCP_KEEPIDLE,11). +-define(C_GET_TCP_LINGER2,12). +-define(C_GET_TCP_INFO,13). +-define(C_GET_SO_REUSEADDR,14). +-define(C_GET_SO_KEEPALIVE,15). +-define(C_GET_SO_LINGER,16). + +-define(C_GET_LINGER_SIZE,21). +-define(C_GET_TCP_INFO_SIZE,22). + +-define(C_GET_OFF_LINGER_L_ONOFF,31). +-define(C_GET_OFF_LINGER_L_LINGER,32). +-define(C_GET_OFF_TCPI_SACKED,33). +-define(C_GET_OFF_TCPI_OPTIONS,34). + +-define(C_GET_SIZ_LINGER_L_ONOFF,41). +-define(C_GET_SIZ_LINGER_L_LINGER,42). +-define(C_GET_SIZ_TCPI_SACKED,43). +-define(C_GET_SIZ_TCPI_OPTIONS,44). + +-define(C_QUIT,99). + +-export([all/1, simple/1, loop_all/1, simple_raw/1, simple_raw_getbin/1, + doc_examples_raw/1,doc_examples_raw_getbin/1, + large_raw/1,large_raw_getbin/1,combined/1,combined_getbin/1, + type_errors/1]). + +-export([init_per_testcase/2, end_per_testcase/2]). + + +all(suite) -> + [simple,loop_all,simple_raw,simple_raw_getbin, + doc_examples_raw, doc_examples_raw_getbin, + large_raw,large_raw_getbin,combined,combined_getbin,type_errors]. + +init_per_testcase(_Func, Config) -> + Dog = test_server:timetrap(test_server:seconds(60)), + [{watchdog,Dog}|Config]. + +end_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog). + +simple(suite) -> []; +simple(doc) -> "Test inet:setopt/getopt simple functionality."; +simple(Config) when is_list(Config) -> + ?line XOpt = case os:type() of + {unix,_} -> [{reuseaddr,true}]; + _ -> [] + end, + ?line Opt = [{nodelay,true}, + {keepalive,true},{packet,4}, + {active,false}|XOpt], + ?line OptTags = [X || {X,_} <- Opt], + ?line {S1,S2} = create_socketpair(Opt, Opt), + ?line {ok,Opt} = inet:getopts(S1,OptTags), + ?line {ok,Opt} = inet:getopts(S2,OptTags), + ?line COpt = [{X,case X of nodelay -> false;_ -> Y end} || {X,Y} <- Opt], + ?line inet:setopts(S1,COpt), + ?line {ok,COpt} = inet:getopts(S1,OptTags), + ?line {ok,Opt} = inet:getopts(S2,OptTags), + ?line gen_tcp:close(S1), + ?line gen_tcp:close(S2), + ok. + +loop_all(suite) -> []; +loop_all(doc) -> "Loop through all socket options and check that they work"; +loop_all(Config) when is_list(Config) -> + ?line ListenFailures = + lists:foldr(make_check_fun(listen,1),[],all_listen_options()), + ?line ConnectFailures = + lists:foldr(make_check_fun(connect,2),[],all_connect_options()), + ?line case ListenFailures++ConnectFailures of + [] -> + ?line ok; + Failed -> + ?line {comment,lists:flatten( + io_lib:format("Non mandatory failed:~w", + [Failed]))} + end. + + + +simple_raw(suite) -> []; +simple_raw(doc) -> "Test simple setopt/getopt of raw options."; +simple_raw(Config) when is_list(Config) -> + do_simple_raw(Config,false). +simple_raw_getbin(suite) -> []; +simple_raw_getbin(doc) -> "Test simple setopt/getopt of raw options, " + "with binaries in getopt."; +simple_raw_getbin(Config) when is_list(Config) -> + do_simple_raw(Config,true). + +do_simple_raw(Config,Binary) when is_list(Config) -> + ?line Port = start_helper(Config), + ?line SolSocket = ask_helper(Port,?C_GET_SOL_SOCKET), + ?line SoKeepAlive = ask_helper(Port,?C_GET_SO_KEEPALIVE), + ?line OptionTrue = {raw,SolSocket,SoKeepAlive,<<1:32/native>>}, + ?line OptionFalse = {raw,SolSocket,SoKeepAlive,<<0:32/native>>}, + ?line {S1,S2} = create_socketpair([OptionTrue],[{keepalive,true}]), + ?line {ok,[{keepalive,true}]} = inet:getopts(S1,[keepalive]), + ?line {ok,[{keepalive,true}]} = inet:getopts(S2,[keepalive]), + ?line {ok,[{raw,SolSocket,SoKeepAlive,X1B}]} = + inet:getopts(S1,[{raw,SolSocket,SoKeepAlive,binarify(4,Binary)}]), + ?line X1 = nintbin2int(X1B), + ?line {ok,[{raw,SolSocket,SoKeepAlive,X2B}]} = + inet:getopts(S2,[{raw,SolSocket,SoKeepAlive,binarify(4,Binary)}]), + ?line X2 = nintbin2int(X2B), + ?line true = X1 > 0, + ?line true = X2 > 0, + ?line inet:setopts(S1,[{keepalive,false}]), + ?line inet:setopts(S2,[OptionFalse]), + ?line {ok,[{keepalive,false}]} = inet:getopts(S1,[keepalive]), + ?line {ok,[{keepalive,false}]} = inet:getopts(S2,[keepalive]), + ?line {ok,[{raw,SolSocket,SoKeepAlive,Y1B}]} = + inet:getopts(S1,[{raw,SolSocket,SoKeepAlive,binarify(4,Binary)}]), + ?line Y1 = nintbin2int(Y1B), + ?line {ok,[{raw,SolSocket,SoKeepAlive,Y2B}]} = + inet:getopts(S2,[{raw,SolSocket,SoKeepAlive,binarify(4,Binary)}]), + ?line Y2 = nintbin2int(Y2B), + ?line true = Y1 == 0, + ?line true = Y2 == 0, + ?line gen_tcp:close(S1), + ?line gen_tcp:close(S2), + ?line stop_helper(Port), + ok. + +nintbin2int(<>) -> Int; +nintbin2int(<>) -> Int; +nintbin2int(<>) -> Int; +nintbin2int(<>) -> Int; +nintbin2int(<<>>) -> 0. + +doc_examples_raw(suite) -> []; +doc_examples_raw(doc) -> "Test that the example code from the documentation " + "works"; +doc_examples_raw(Config) when is_list(Config) -> + do_doc_examples_raw(Config,false). +doc_examples_raw_getbin(suite) -> []; +doc_examples_raw_getbin(doc) -> "Test that the example code from the " + "documentation works when getopt uses " + "binaries"; +doc_examples_raw_getbin(Config) when is_list(Config) -> + do_doc_examples_raw(Config,true). +do_doc_examples_raw(Config,Binary) when is_list(Config) -> + ?line Port = start_helper(Config), + ?line Proto = ask_helper(Port,?C_GET_IPPROTO_TCP), + ?line TcpInfo = ask_helper(Port,?C_GET_TCP_INFO), + ?line TcpInfoSize = ask_helper(Port,?C_GET_TCP_INFO_SIZE), + ?line TcpiSackedOffset = ask_helper(Port,?C_GET_OFF_TCPI_SACKED), + ?line TcpiOptionsOffset = ask_helper(Port,?C_GET_OFF_TCPI_OPTIONS), + ?line TcpiSackedSize = ask_helper(Port,?C_GET_SIZ_TCPI_SACKED), + ?line TcpiOptionsSize = ask_helper(Port,?C_GET_SIZ_TCPI_OPTIONS), + ?line TcpLinger2 = ask_helper(Port,?C_GET_TCP_LINGER2), + ?line stop_helper(Port), + case all_ok([Proto,TcpInfo,TcpInfoSize,TcpiSackedOffset, + TcpiOptionsOffset,TcpiSackedSize,TcpiOptionsSize, + TcpLinger2]) of + false -> + {skipped,"Does not run on this OS."}; + true -> + ?line {Sock,I} = create_socketpair([],[]), + ?line {ok,[{raw,Proto,TcpLinger2,<>}]} = + inet:getopts(Sock,[{raw,Proto,TcpLinger2,binarify(4,Binary)}]), + ?line NewLinger = OrigLinger div 2, + ?line ok = inet:setopts(Sock,[{raw,Proto,TcpLinger2, + <>}]), + ?line {ok,[{raw,Proto,TcpLinger2,<>}]} = + inet:getopts(Sock,[{raw,Proto,TcpLinger2,binarify(4,Binary)}]), + ?line ok = inet:setopts(Sock,[{raw,Proto,TcpLinger2, + <>}]), + ?line {ok,[{raw,Proto,TcpLinger2,<>}]} = + inet:getopts(Sock,[{raw,Proto,TcpLinger2,binarify(4,Binary)}]), + ?line {ok,[{raw,_,_,Info}]} = + inet:getopts(Sock,[{raw,Proto,TcpInfo, + binarify(TcpInfoSize,Binary)}]), + ?line Bit1 = TcpiSackedSize * 8, + ?line <<_:TcpiSackedOffset/binary, + TcpiSacked:Bit1/native,_/binary>> = + Info, + ?line 0 = TcpiSacked, + ?line Bit2 = TcpiOptionsSize * 8, + ?line <<_:TcpiOptionsOffset/binary, + TcpiOptions:Bit2/native,_/binary>> = + Info, + ?line true = TcpiOptions =/= 0, + ?line gen_tcp:close(Sock), + ?line gen_tcp:close(I), + ok + end. + +large_raw(suite) -> []; +large_raw(doc) -> "Test structs and large/too large buffers when raw"; +large_raw(Config) when is_list(Config) -> + do_large_raw(Config,false). +large_raw_getbin(suite) -> []; +large_raw_getbin(doc) -> "Test structs and large/too large buffers when raw" + "using binaries to getopts"; +large_raw_getbin(Config) when is_list(Config) -> + do_large_raw(Config,true). +do_large_raw(Config,Binary) when is_list(Config) -> + ?line Port = start_helper(Config), + ?line Proto = ask_helper(Port,?C_GET_SOL_SOCKET), + ?line Linger = ask_helper(Port,?C_GET_SO_LINGER), + ?line LingerSize = ask_helper(Port,?C_GET_LINGER_SIZE), + ?line LingerOnOffOffset = ask_helper(Port,?C_GET_OFF_LINGER_L_ONOFF), + ?line LingerLingerOffset = ask_helper(Port,?C_GET_OFF_LINGER_L_LINGER), + ?line LingerOnOffSize = ask_helper(Port,?C_GET_SIZ_LINGER_L_ONOFF), + ?line LingerLingerSize = ask_helper(Port,?C_GET_SIZ_LINGER_L_LINGER), + ?line stop_helper(Port), + case all_ok([Proto,Linger,LingerSize,LingerOnOffOffset, + LingerLingerOffset,LingerOnOffSize,LingerLingerSize]) of + false -> + {skipped,"Does not run on this OS."}; + true -> + ?line {Sock1,Sock2} = create_socketpair([{linger,{true,10}}], + [{linger,{false,0}}]), + ?line LargeSize = 1024, % Solaris can take up to 1024*9, + % linux 1024*63... + ?line TooLargeSize = 1024*64, + ?line {ok,[{raw,Proto,Linger,Linger1}]} = + inet:getopts(Sock1,[{raw,Proto,Linger, + binarify(LargeSize,Binary)}]), + ?line {ok,[{raw,Proto,Linger,Linger2}]} = + inet:getopts(Sock2,[{raw,Proto,Linger, + binarify(LingerSize,Binary)}]), + ?line true = byte_size(Linger1) =:= LingerSize, + ?line LingerLingerBits = LingerLingerSize * 8, + ?line LingerOnOffBits = LingerOnOffSize * 8, + ?line <<_:LingerLingerOffset/binary, + Ling1:LingerLingerBits/native,_/binary>> = Linger1, + ?line <<_:LingerOnOffOffset/binary, + Off1:LingerOnOffBits/native,_/binary>> = Linger1, + ?line <<_:LingerOnOffOffset/binary, + Off2:LingerOnOffBits/native,_/binary>> = Linger2, + ?line true = Off1 =/= 0, + ?line true = Off2 == 0, + ?line true = Ling1 == 10, + ?line {error,einval} = + inet:getopts(Sock1,[{raw,Proto,Linger,TooLargeSize}]), + ?line gen_tcp:close(Sock1), + ?line gen_tcp:close(Sock2), + ok + end. + +combined(suite) -> []; +combined(doc) -> "Test raw structs combined w/ other options "; +combined(Config) when is_list(Config) -> + do_combined(Config,false). +combined_getbin(suite) -> []; +combined_getbin(doc) -> "Test raw structs combined w/ other options and " + "binarise in getopts"; +combined_getbin(Config) when is_list(Config) -> + do_combined(Config,true). +do_combined(Config,Binary) when is_list(Config) -> + ?line Port = start_helper(Config), + ?line Proto = ask_helper(Port,?C_GET_SOL_SOCKET), + ?line Linger = ask_helper(Port,?C_GET_SO_LINGER), + ?line LingerSize = ask_helper(Port,?C_GET_LINGER_SIZE), + ?line LingerOnOffOffset = ask_helper(Port,?C_GET_OFF_LINGER_L_ONOFF), + ?line LingerLingerOffset = ask_helper(Port,?C_GET_OFF_LINGER_L_LINGER), + ?line LingerOnOffSize = ask_helper(Port,?C_GET_SIZ_LINGER_L_ONOFF), + ?line LingerLingerSize = ask_helper(Port,?C_GET_SIZ_LINGER_L_LINGER), + ?line stop_helper(Port), + case all_ok([Proto,Linger,LingerSize,LingerOnOffOffset, + LingerLingerOffset,LingerOnOffSize,LingerLingerSize]) of + false -> + {skipped,"Does not run on this OS."}; + true -> + ?line LingerLingerBits = LingerLingerSize * 8, + ?line LingerOnOffBits = LingerOnOffSize * 8, + ?line {LingerOn,LingerOff} = + case LingerOnOffOffset < LingerLingerOffset of + true -> + Pad1 = + list_to_binary( + lists:duplicate(LingerOnOffOffset, + 0)), + Pad2Siz = + LingerLingerOffset - LingerOnOffSize - + LingerOnOffOffset, + Pad2 = + list_to_binary( + lists:duplicate(Pad2Siz, + 0)), + Pad3Siz = LingerSize - LingerLingerSize - + LingerLingerOffset, + Pad3 = list_to_binary( + lists:duplicate(Pad3Siz, + 0)), + {<>, + <>}; + false -> + Pad1 = + list_to_binary( + lists:duplicate(LingerLingerOffset, + 0)), + Pad2Siz = + LingerOnOffOffset - LingerLingerSize - + LingerLingerOffset, + Pad2 = + list_to_binary( + lists:duplicate(Pad2Siz, + 0)), + Pad3Siz = LingerSize - LingerOnOffSize - + LingerOnOffOffset, + Pad3 = list_to_binary( + lists:duplicate(Pad3Siz, + 0)), + {<>, + <>} + end, + ?line RawLingerOn = {raw,Proto,Linger,LingerOn}, + ?line RawLingerOff = {raw,Proto,Linger,LingerOff}, + ?line {Sock1,Sock2} = + create_socketpair([{keepalive,true}, + RawLingerOn], + [{keepalive,false}, + RawLingerOff]), + ?line {ok,[{raw,Proto,Linger,Linger1},{keepalive,Keep1}]} = + inet:getopts(Sock1,[{raw,Proto,Linger, + binarify(LingerSize,Binary)},keepalive]), + ?line {ok,[{raw,Proto,Linger,Linger2},{keepalive,Keep2}]} = + inet:getopts(Sock2,[{raw,Proto,Linger, + binarify(LingerSize,Binary)},keepalive]), + ?line true = byte_size(Linger1) =:= LingerSize, + ?line <<_:LingerLingerOffset/binary, + Ling1:LingerLingerBits/native,_/binary>> = Linger1, + ?line <<_:LingerOnOffOffset/binary, + Off1:LingerOnOffBits/native,_/binary>> = Linger1, + ?line <<_:LingerOnOffOffset/binary, + Off2:LingerOnOffBits/native,_/binary>> = Linger2, + ?line true = Off1 =/= 0, + ?line true = Off2 == 0, + ?line true = Ling1 == 10, + ?line true = Keep1 =:= true, + ?line true = Keep2 =:= false, + ?line {Sock3,Sock4} = + create_socketpair([RawLingerOn,{keepalive,true}], + [RawLingerOff,{keepalive,false}]), + ?line {ok,[{raw,Proto,Linger,Linger3},{keepalive,Keep3}]} = + inet:getopts(Sock3,[{raw,Proto,Linger, + binarify(LingerSize,Binary)},keepalive]), + ?line {ok,[{raw,Proto,Linger,Linger4},{keepalive,Keep4}]} = + inet:getopts(Sock4,[{raw,Proto,Linger, + binarify(LingerSize,Binary)},keepalive]), + ?line true = byte_size(Linger3) =:= LingerSize, + ?line <<_:LingerLingerOffset/binary, + Ling3:LingerLingerBits/native,_/binary>> = Linger3, + ?line <<_:LingerOnOffOffset/binary, + Off3:LingerOnOffBits/native,_/binary>> = Linger3, + ?line <<_:LingerOnOffOffset/binary, + Off4:LingerOnOffBits/native,_/binary>> = Linger4, + ?line true = Off3 =/= 0, + ?line true = Off4 == 0, + ?line true = Ling3 == 10, + ?line true = Keep3 =:= true, + ?line true = Keep4 =:= false, + ?line {Sock5,Sock6} = + create_socketpair([{packet,4},RawLingerOn,{keepalive,true}], + [{packet,2},RawLingerOff,{keepalive,false}]), + ?line {ok,[{packet,Pack5},{raw,Proto,Linger,Linger5}, + {keepalive,Keep5}]} = + inet:getopts(Sock5,[packet,{raw,Proto,Linger, + binarify(LingerSize,Binary)}, + keepalive]), + ?line {ok,[{packet,Pack6},{raw,Proto,Linger,Linger6}, + {keepalive,Keep6}]} = + inet:getopts(Sock6,[packet,{raw,Proto,Linger, + binarify(LingerSize,Binary)}, + keepalive]), + ?line true = byte_size(Linger5) =:= LingerSize, + ?line <<_:LingerLingerOffset/binary, + Ling5:LingerLingerBits/native,_/binary>> = Linger5, + ?line <<_:LingerOnOffOffset/binary, + Off5:LingerOnOffBits/native,_/binary>> = Linger5, + ?line <<_:LingerOnOffOffset/binary, + Off6:LingerOnOffBits/native,_/binary>> = Linger6, + ?line true = Off5 =/= 0, + ?line true = Off6 == 0, + ?line true = Ling5 == 10, + ?line true = Keep5 =:= true, + ?line true = Keep6 =:= false, + ?line true = Pack5 =:= 4, + ?line true = Pack6 =:= 2, + ?line inet:setopts(Sock6,[{packet,4},RawLingerOn, + {keepalive,true}]), + ?line {ok,[{packet,Pack7},{raw,Proto,Linger,Linger7}, + {keepalive,Keep7}]} = + inet:getopts(Sock6,[packet,{raw,Proto,Linger, + binarify(LingerSize,Binary)}, + keepalive]), + ?line <<_:LingerOnOffOffset/binary, + Off7:LingerOnOffBits/native,_/binary>> = Linger7, + ?line true = Off7 =/= 0, + ?line true = Keep7 =:= true, + ?line true = Pack7 =:= 4, + ?line gen_tcp:close(Sock1), + ?line gen_tcp:close(Sock2), + ?line gen_tcp:close(Sock3), + ?line gen_tcp:close(Sock4), + ?line gen_tcp:close(Sock5), + ?line gen_tcp:close(Sock6), + ok + end. + +type_errors(suite) -> + []; +type_errors(doc) -> + "Test that raw data requests are not executed for bad types"; +type_errors(Config) when is_list(Config) -> + ?line BadSetOptions = + [ + {raw,x,3,<<1:32>>}, + {raw,1,tre,<<1:32>>}, + {raw,1,3,ko}, + {raw,1,3,5}, + {raw,1,3}, + {raw,1}, + {raw}, + {raw,ett}, + {raw,ett,tre}, + {raw,{true,10}}, + {raw,{ett,tre,<<1:32>>}}, + {rav,1,3,<<1:32>>}, + raw, + rav, + {linger,banan} + ], + ?line BadGetOptions = + [ + {raw,x,3,<<1:32>>}, + {raw,1,tre,<<1:32>>}, + {raw,1,3,ko}, + {raw,1,3,5.1}, + {raw,1,3,-3}, + {raw,1,3}, + {raw,1}, + {raw}, + {raw,ett}, + {raw,ett,tre}, + {raw,{true,10}}, + {raw,{ett,tre,<<1:32>>}}, + {rav,1,3,<<1:32>>}, + raw, + rav, + {linger,banan} + ], + ?line lists:foreach(fun(Option) -> + ?line case + catch create_socketpair([Option],[]) of + {'EXIT',badarg} -> + ?line ok; + Unexpected1 -> + ?line exit({unexpected, + Unexpected1}) + end, + ?line case + catch create_socketpair([],[Option]) of + {'EXIT',badarg} -> + ?line ok; + Unexpected2 -> + ?line exit({unexpected, + Unexpected2}) + end, + ?line {Sock1,Sock2} = create_socketpair([],[]), + ?line case inet:setopts(Sock1, [Option]) of + {error,einval} -> + ?line ok; + Unexpected3 -> + ?line exit({unexpected, + Unexpected3}) + end, + ?line gen_tcp:close(Sock1), + ?line gen_tcp:close(Sock2) + end,BadSetOptions), + ?line {Sock1,Sock2} = create_socketpair([],[]), + ?line lists:foreach(fun(Option) -> + ?line case inet:getopts(Sock1, [Option]) of + {error,einval} -> + ?line ok; + Unexpected -> + ?line exit({unexpected, + Unexpected}) + end + end,BadGetOptions), + ?line gen_tcp:close(Sock1), + ?line gen_tcp:close(Sock2), + ok. + +all_ok([]) -> + true; +all_ok([H|T]) when H >= 0 -> + all_ok(T); +all_ok(_) -> + false. + + +make_check_fun(Type,Element) -> + fun({Name,V1,V2,Mand,Chang},Acc) -> + ?line {LO1,CO1} = setelement(Element,{[],[]}, [{Name,V1}]), + ?line {LO2,CO2} = setelement(Element,{[],[]}, [{Name,V2}]), + ?line {X1,Y1} = create_socketpair(LO1,CO1), + ?line {X2,Y2} = create_socketpair(LO2,CO2), + ?line S1 = element(Element,{X1,Y1}), + ?line S2 = element(Element,{X2,Y2}), + ?line {ok,[{Name,R1}]} = inet:getopts(S1,[Name]), + ?line {ok,[{Name,R2}]} = inet:getopts(S2,[Name]), + NewAcc = + case R1 =/= R2 of + true -> + case Chang of + true -> + ?line inet:setopts(S1,[{Name,V2}]), + ?line {ok,[{Name,R3}]} = + inet:getopts(S1,[Name]), + case {R3 =/= R1, R3 =:= R2} of + {true,true} -> + ?line Acc; + _ -> + case Mand of + true -> + ?line exit + ({failed_sockopt, + {change, + Name}}); + false -> + ?line [{change,Name}|Acc] + end + end; + false -> + ?line Acc + end; + false -> + case Mand of + true -> + ?line exit({failed_sockopt, + {Type,Name}}); + false -> + ?line [{Type,Name}|Acc] + end + end, + ?line gen_tcp:close(X1), + ?line gen_tcp:close(Y1), + ?line gen_tcp:close(X2), + ?line gen_tcp:close(Y2), + NewAcc + end. + +% {OptionName,Value1,Value2,Mandatory,Changeable} +all_listen_options() -> + [{tos,0,1,false,true}, + {priority,0,1,false,true}, + {reuseaddr,false,true,false,true}, + {keepalive,false,true,true,true}, + {linger, {false,10}, {true,10},true,true}, + {sndbuf,2048,4096,false,true}, + {recbuf,2048,4096,false,true}, + {nodelay,false,true,true,true}, + {header,2,4,true,true}, + {active,false,true,true,false}, + {packet,2,4,true,true}, + {buffer,1000,2000,true,true}, + {mode,list,binary,true,true}, + {deliver,term,port,true,true}, + {exit_on_close, true, false, true, true}, + %{high_watermark,4096,8192,true,true}, + %{low_watermark,2048,4096,true,true}, + {bit8,on,off,true,true}, + {send_timeout,infinity,1000,true,true}, + {send_timeout_close,false,true,true,true}, + {delay_send,false,true,true,true}, + {packet_size,0,4,true,true} + ]. +all_connect_options() -> + [{tos,0,1,false,true}, + {priority,0,1,false,true}, + {reuseaddr,false,true,false,true}, + {keepalive,false,true,true,true}, + {linger, {false,10}, {true,10},true,true}, + {sndbuf,2048,4096,false,true}, + {recbuf,2048,4096,false,true}, + {nodelay,false,true,true,true}, + {header,2,4,true,true}, + {active,false,true,true,false}, + {packet,2,4,true,true}, + {buffer,1000,2000,true,true}, + {mode,list,binary,true,true}, + {deliver,term,port,true,true}, + {exit_on_close, true, false, true, true}, + {high_watermark,4096,8192,false,true}, + {low_watermark,2048,4096,false,true}, + {bit8,on,off,true,true}, + {send_timeout,infinity,1000,true,true}, + {send_timeout_close,false,true,true,true}, + {delay_send,false,true,true,true}, + {packet_size,0,4,true,true} + ]. + + +create_socketpair(ListenOptions,ConnectOptions) -> + ?line {ok,LS}=gen_tcp:listen(0,ListenOptions), + ?line {ok,Port}=inet:port(LS), + ?line {ok,CS}=gen_tcp:connect(localhost,Port,ConnectOptions), + ?line {ok,AS}=gen_tcp:accept(LS), + ?line gen_tcp:close(LS), + {AS,CS}. + + +start_helper(Config) -> + Progname = filename:join(?config(data_dir, Config), "sockopt_helper"), + Port = open_port({spawn,Progname},[eof,line]), + Port. + +ask_helper(Port,Code) -> + Com = integer_to_list(Code)++"\n", + Port ! {self(),{command,Com}}, + receive + {Port,{data,{eol,Text}}} -> + list_to_integer(Text); + Other -> + exit({error,{unexpected_data_from_helper,Other}}) + after 3000 -> + exit({error,helper_timeout}) + end. + +stop_helper(Port) -> + catch ask_helper(Port,?C_QUIT), + receive + {Port,eof} -> + Port ! {self(), close}, + receive + {Port,closed} -> + ok + after 1000 -> + timeout + end + after 1000 -> + timeout + end. + +binarify(Size,Binary) when Binary =:= true -> + <<0:Size/unit:8>>; +binarify(Size,Binary) when Binary =:= false -> + Size. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_SUITE_data/hosts erlang-13.b.3-dfsg/lib/kernel/test/inet_SUITE_data/hosts --- erlang-13.b.1-dfsg/lib/kernel/test/inet_SUITE_data/hosts 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_SUITE_data/hosts 1999-02-23 08:43:01.000000000 +0000 @@ -0,0 +1,22 @@ +150.236.20.66 fingolfin +150.236.20.65 bingo +150.236.20.32 lw5 lw5d +150.236.14.81 jarzebiak +150.236.14.71 grolsch +150.236.14.68 napoleon +127.0.0.1 localhost +150.236.20.74 strider +150.236.20.72 elrond +150.236.20.78 aule +150.236.14.36 lw4 lw4d +150.236.14.16 super super-14 www-cslab ftp-cslab mail smtp pop loghost +150.236.14.251 router-14 +150.236.20.67 sam +150.236.20.86 mallor +150.236.20.251 router-20 +150.236.20.192 merry +150.236.14.247 nenya +150.236.20.193 beamish +150.236.20.16 gandalf-20 +150.236.14.18 news nntp +150.236.14.77 gordons diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_SUITE_data/hosts_err1 erlang-13.b.3-dfsg/lib/kernel/test/inet_SUITE_data/hosts_err1 --- erlang-13.b.1-dfsg/lib/kernel/test/inet_SUITE_data/hosts_err1 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_SUITE_data/hosts_err1 1998-01-28 13:39:28.000000000 +0000 @@ -0,0 +1,170 @@ +150.236.14.243 msvw +150.236.14.224 peps +150.236.14.217 150.236.14.217 +150.236.14.213 euasb05 +150.236.14.206 nubbe +rappakalja +150.236.14.164 legolas2 +150.236.14.200 apx_ether146 +150.236.14.135 jb +150.236.14.131 ruddles +150.236.14.106 guinness +150.236.20.66 fingolfin +150.236.20.65 bingo +150.236.20.32 lw5 lw5d +150.236.14.90 ballantines +150.236.14.81 jarzebiak +150.236.14.80 calvados +150.236.14.72 explorer +150.236.14.71 grolsch +150.236.14.68 napoleon +127.0.0.1 localhost +150.236.14.211 cp2 +150.236.14.199 booze +150.236.14.198 macscot +150.236.14.165 vb +150.236.14.111 randy +150.236.14.94 bacardi +150.236.14.85 platins +150.236.14.76 scotch +150.236.14.69 martell +150.236.21.242 lme-pc12 +150.236.21.240 lme-pc10 +150.236.21.234 lme-pc04 +150.236.14.248 vilya +150.236.14.219 four-roses +150.236.14.218 wasted +150.236.14.196 mac1 su-mac +150.236.14.195 besk +150.236.14.163 tall +150.236.14.157 nijmegen +150.236.14.151 skalman +150.236.20.79 balin +150.236.20.75 bifur +150.236.20.74 strider +150.236.20.72 elrond +150.236.14.98 katt +150.236.14.89 fbsd-install +150.236.14.32 pm1 +150.236.14.19 styx +150.236.20.196 sauron +150.236.14.246 narya +150.236.14.245 mspc +150.236.14.216 ester-clop +150.236.14.212 dp1 +150.236.14.210 cp1 +150.236.14.169 natasja +150.236.14.168 helga +150.236.14.167 sjuan +150.236.14.138 rioja +150.236.14.137 pluto +150.236.20.78 aule +150.236.20.18 super-20 +150.236.14.64 renat +150.236.14.36 lw4 lw4d +150.236.14.35 lwt +150.236.14.33 lw lwd lp-seb +150.236.14.16 super super-14 www-cslab ftp-cslab mail smtp pop loghost +150.236.21.241 lme-pc11 +150.236.21.235 lme-pc05 +150.236.14.251 router-14 +150.236.14.244 mslab +150.236.14.240 msepu +150.236.14.223 kosken +150.236.14.197 mac2 su-mac2 +150.236.14.162 merkurius +150.236.14.152 luthagen +150.236.14.148 baidarka +150.236.14.142 kurt +150.236.14.136 russell +150.236.14.132 elbereth +150.236.14.130 plato +150.236.20.71 faenor +150.236.20.69 tom +150.236.14.93 turkey +150.236.14.84 absolut +150.236.14.75 chivas +150.236.14.21 proxy +150.236.21.239 lme-pc09 +150.236.21.238 lme-pc08 +150.236.15.251 router-15 +150.236.14.221 rent +150.236.14.215 ester-spwb +150.236.14.207 mackinlays +150.236.14.203 egri +150.236.14.201 tinto +150.236.14.200 raki +150.236.14.156 force +150.236.14.144 halvan +150.236.14.140 spex +150.236.14.109 anna +150.236.14.103 catrin +150.236.20.77 orome +150.236.20.67 sam +150.236.14.99 heering +150.236.14.91 bourbon +150.236.14.82 tequila +150.236.14.73 strega +150.236.14.67 aalborg +150.236.14.34 lwc +150.236.21.251 router-21 +150.236.21.237 lme-pc07 +150.236.21.233 lme-pc03 +150.236.21.231 lme-pc01 +150.236.20.251 router-20 +150.236.20.192 merry +150.236.14.247 nenya +150.236.14.241 ms40 +150.236.14.161 marisa +150.236.14.154 al +150.236.14.150 bill +150.236.14.149 sundsvall +150.236.14.139 dans +150.236.14.133 campari +150.236.20.76 gimli +150.236.20.70 bilbo +150.236.20.68 gwaihir +150.236.14.92 vodka +150.236.14.83 punsch # unused +150.236.14.74 pernod +150.236.14.22 gandalf gandalf-14 +150.236.14.20 www-sarc +150.236.20.193 beamish +150.236.14.209 seagram +150.236.14.166 hine +150.236.14.160 plutt +150.236.14.158 granbom +150.236.14.147 findus +150.236.14.146 ture +150.236.14.129 ariadne +150.236.14.128 op-andersson helan +150.236.14.104 steinlager +150.236.14.102 morgan +150.236.20.73 legolas +150.236.20.16 gandalf-20 +150.236.14.18 news nntp +150.236.14.17 otp +150.236.20.195 thorin +150.236.14.220 jackd +150.236.14.214 ester-asm +150.236.14.202 hutt +150.236.14.145 fedra +150.236.14.141 jura +150.236.20.64 falco +150.236.14.96 bushmill +150.236.14.87 loranga +150.236.14.78 cointreau +150.236.14.70 dickel +150.236.14.66 gin +150.236.21.236 lme-pc06 +150.236.21.232 lme-pc02 +150.236.20.194 frodo +150.236.14.242 mssol +150.236.14.153 bubak +150.236.14.134 wyborowa +150.236.14.97 finlandia +150.236.14.95 finkel +150.236.14.88 macallan +150.236.14.86 unicum +150.236.14.79 skeppet +150.236.14.77 gordons diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_SUITE_data/resolv.conf erlang-13.b.3-dfsg/lib/kernel/test/inet_SUITE_data/resolv.conf --- erlang-13.b.1-dfsg/lib/kernel/test/inet_SUITE_data/resolv.conf 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_SUITE_data/resolv.conf 1997-11-26 23:36:01.000000000 +0000 @@ -0,0 +1,7 @@ +domain du.etx.ericsson.se +nameserver 150.236.14.16 +garbage x +nameserver 150.236.16.2 +nameserver 130.100.128.25 +search du.etx.ericsson.se etx.ericsson.se ericsson.se +lookup yp bind file diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_SUITE_data/resolv.conf.err1 erlang-13.b.3-dfsg/lib/kernel/test/inet_SUITE_data/resolv.conf.err1 --- erlang-13.b.1-dfsg/lib/kernel/test/inet_SUITE_data/resolv.conf.err1 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_SUITE_data/resolv.conf.err1 1997-11-26 23:36:02.000000000 +0000 @@ -0,0 +1,7 @@ +domain du.etx.ericsson.se +nameserver 150.236.14.16 +nameserver kalle +nameserver 150.236.16.2 +nameserver 130.100.128.25 +search du.etx.ericsson.se etx.ericsson.se ericsson.se +lookup yp bind file diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/inet_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/inet_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/inet_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/inet_SUITE.erl 2009-09-18 15:07:47.000000000 +0100 @@ -0,0 +1,735 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(inet_SUITE). + +-include("test_server.hrl"). +-include_lib("kernel/include/inet.hrl"). +-include_lib("kernel/src/inet_dns.hrl"). + +-export([all/1, t_gethostbyaddr/1, t_getaddr/1, t_gethostbyname/1, + t_gethostbyaddr_v6/1, t_getaddr_v6/1, t_gethostbyname_v6/1, + ipv4_to_ipv6/1, host_and_addr/1, parse/1, t_gethostnative/1, + gethostnative_parallell/1, cname_loop/1, + gethostnative_soft_restart/1,gethostnative_debug_level/1,getif/1]). + +-export([get_hosts/1, get_ipv6_hosts/1, parse_hosts/1, + kill_gethost/0, parallell_gethost/0]). +-export([init_per_testcase/2, end_per_testcase/2]). + + +all(suite) -> + [t_gethostbyaddr, t_gethostbyname, t_getaddr, + t_gethostbyaddr_v6, t_gethostbyname_v6, t_getaddr_v6, + ipv4_to_ipv6, host_and_addr, parse,t_gethostnative, + gethostnative_parallell, cname_loop, + gethostnative_debug_level,gethostnative_soft_restart, + getif]. + +init_per_testcase(_Func, Config) -> + Dog = test_server:timetrap(test_server:seconds(60)), + [{watchdog,Dog}|Config]. + +end_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog). + + +t_gethostbyaddr(doc) -> "Test the inet:gethostbyaddr/1 function."; +t_gethostbyaddr(Config) when is_list(Config) -> + ?line {Name,FullName,IPStr,IP,Aliases,_,_} = ?config(test_host_ipv4_only, Config), + ?line {ok,HEnt} = inet:gethostbyaddr(IPStr), + ?line {ok,HEnt} = inet:gethostbyaddr(IP), + ?line {error,Error} = inet:gethostbyaddr(Name), + ?line ok = io:format("Failure reason: ~p: ~s", + [error,inet:format_error(Error)]), + ?line HEnt_ = HEnt#hostent{h_addrtype = inet, + h_length = 4, + h_addr_list = [IP]}, + ?line HEnt_ = HEnt, + case {os:type(),os:version()} of + {{unix,freebsd},{5,0,0}} -> + %% The alias list seems to be buggy in FreeBSD 5.0.0. + ?line check_elems([{HEnt#hostent.h_name,[Name,FullName]}]), + io:format("Buggy alias list: ~p", [HEnt#hostent.h_aliases]), + ok; + _ -> + ?line check_elems([{HEnt#hostent.h_name,[Name,FullName]}, + {HEnt#hostent.h_aliases,[[],Aliases]}]) + end, + + ?line {_DName, _DFullName, DIPStr, DIP, _, _, _} = + ?config(test_dummy_host, Config), + ?line {error,nxdomain} = inet:gethostbyaddr(DIPStr), + ?line {error,nxdomain} = inet:gethostbyaddr(DIP), + ok. + +t_gethostbyaddr_v6(doc) -> "Test the inet:gethostbyaddr/1 inet6 function."; +t_gethostbyaddr_v6(Config) when is_list(Config) -> + ?line {Name6, FullName6, IPStr6, IP6, Aliases6} = + ?config(test_host_ipv6_only, Config), + + ?line case inet:gethostbyaddr(IPStr6) of + %% Even if IPv6 is not supported, the native resolver may succeed + %% looking up the host. DNS lookup will probably fail. + {error,nxdomain} -> + {skip, "IPv6 test fails! IPv6 not supported on this host!?"}; + {ok,HEnt6} -> + ?line {ok,HEnt6} = inet:gethostbyaddr(IP6), + ?line {error,Error6} = inet:gethostbyaddr(Name6), + ?line ok = io:format("Failure reason: ~p: ~s", + [Error6, inet:format_error(Error6)]), + ?line HEnt6_ = HEnt6#hostent{h_addrtype = inet6, + h_length = 16, + h_addr_list = [IP6]}, + ?line HEnt6_ = HEnt6, + ?line check_elems([{HEnt6#hostent.h_name,[Name6,FullName6]}, + {HEnt6#hostent.h_aliases,[[],Aliases6]}]), + + ?line {_DName6, _DFullName6, DIPStr6, DIP6, _} = + ?config(test_dummy_ipv6_host, Config), + ?line {error,nxdomain} = inet:gethostbyaddr(DIPStr6), + ?line {error,nxdomain} = inet:gethostbyaddr(DIP6), + ok + end. + +t_gethostbyname(doc) -> "Test the inet:gethostbyname/1 function."; +t_gethostbyname(suite) -> []; +t_gethostbyname(Config) when is_list(Config) -> + ?line {Name,FullName,IPStr,IP,Aliases,IP_46_Str,_} = + ?config(test_host_ipv4_only, Config), + ?line {ok,_} = inet:gethostbyname(IPStr), + ?line {ok,HEnt} = inet:gethostbyname(Name), + ?line {ok,HEnt} = inet:gethostbyname(list_to_atom(Name)), + ?line HEnt_ = HEnt#hostent{h_addrtype = inet, + h_length = 4, + h_addr_list = [IP]}, + ?line HEnt_ = HEnt, + ?line check_elems([{HEnt#hostent.h_name,[Name,FullName]}, + {HEnt#hostent.h_aliases,[[],Aliases]}]), + + ?line {ok,HEntF} = inet:gethostbyname(FullName), + ?line HEntF_ = HEntF#hostent{h_name = FullName, + h_addrtype = inet, + h_length = 4, + h_addr_list = [IP]}, + ?line HEntF_ = HEntF, + ?line check_elems([{HEnt#hostent.h_aliases,[[],Aliases]}]), + + ?line {DName, _DFullName, _DIPStr, _DIP, _, _, _} = + ?config(test_dummy_host, Config), + ?line {error,nxdomain} = inet:gethostbyname(DName), + ?line {error,nxdomain} = inet:gethostbyname(IP_46_Str). + +t_gethostbyname_v6(doc) -> "Test the inet:gethostbyname/1 inet6 function."; +t_gethostbyname_v6(suite) -> []; +t_gethostbyname_v6(Config) when is_list(Config) -> + ?line {Name, _, _, _,Aliases,IP_46_Str,IP_46} = + ?config(test_host_ipv4_only, Config), + + case {inet:gethostbyname(IP_46_Str, inet6), + inet:gethostbyname(Name, inet6)} of + {{ok,HEnt46},{ok,_}} -> + ?line HEnt46_ = HEnt46#hostent{h_name = IP_46_Str, + h_addrtype = inet6, + h_length = 16, + h_addr_list = [IP_46]}, + ?line HEnt46_ = HEnt46, + ?line check_elems([{HEnt46#hostent.h_aliases,[[],Aliases]}]), + + ?line {Name6, FullName6, IPStr6, IP6, Aliases6} = + ?config(test_host_ipv6_only, Config), + ?line {ok,_} = inet:gethostbyname(IPStr6, inet6), + ?line {ok,HEnt6} = inet:gethostbyname(Name6, inet6), + ?line {ok,HEnt6} = inet:gethostbyname(list_to_atom(Name6), inet6), + ?line case HEnt6#hostent.h_addr_list of + [IP6] -> % ipv6 ok + ?line HEnt6_ = HEnt6#hostent{h_addrtype = inet6, + h_length = 16, + h_addr_list = [IP6]}, + ?line HEnt6_ = HEnt6, + ?line check_elems([{HEnt6#hostent.h_name,[Name6,FullName6]}, + {HEnt6#hostent.h_aliases,[[],Aliases6]}]); + _ -> % ipv4 compatible addr + ?line {ok,HEnt4} = inet:gethostbyname(Name6, inet), + ?line [IP4] = HEnt4#hostent.h_addr_list, + ?line {ok,IP46_2} = + inet_parse:ipv6_address("::ffff:"++inet_parse:ntoa(IP4)), + ?line HEnt6_ = HEnt6#hostent{h_addrtype = inet6, + h_length = 16, + h_addr_list = [IP46_2]}, + ?line HEnt6_ = HEnt6, + ?line check_elems([{HEnt6#hostent.h_name,[Name6,FullName6]}]) + end, + + ?line {ok,HEntF6} = inet:gethostbyname(FullName6, inet6), + ?line case HEntF6#hostent.h_addr_list of + [IP6] -> % ipv6 ok + ?line HEntF6_ = HEntF6#hostent{h_name = FullName6, + h_addrtype = inet6, + h_length = 16, + h_addr_list = [IP6]}, + ?line HEntF6_ = HEntF6, + ?line check_elems([{HEntF6#hostent.h_aliases,[[],Aliases6]}]); + _ -> % ipv4 compatible addr + ?line {ok,HEntF4} = inet:gethostbyname(FullName6, inet), + ?line [IPF4] = HEntF4#hostent.h_addr_list, + ?line {ok,IPF46_2} = + inet_parse:ipv6_address("::ffff:"++inet_parse:ntoa(IPF4)), + ?line HEntF6_ = HEntF6#hostent{h_addrtype = inet6, + h_length = 16, + h_addr_list = [IPF46_2]}, + ?line HEntF6_ = HEntF6, + ?line check_elems([{HEntF6#hostent.h_name,[Name6,FullName6]}]) + end, + + ?line {DName6, _DFullName6, _DIPStr6, _DIP6, _} = + ?config(test_dummy_ipv6_host, Config), + ?line {error,nxdomain} = inet:gethostbyname(DName6, inet6), + ok; + {_,_} -> + {skip, "IPv6 is not supported on this host"} + end. + +check_elems([{Val,Tests} | Elems]) -> + check_elem(Val, Tests, Tests), + check_elems(Elems); +check_elems([]) -> ok. + +check_elem(Val, [Val|_], _) -> ok; +check_elem(Val, [_|Tests], Tests0) -> + check_elem(Val, Tests, Tests0); +check_elem(Val, [], Tests0) -> + ?t:fail({no_match,Val,Tests0}). + + +t_getaddr(doc) -> "Test the inet:getaddr/2 function."; +t_getaddr(suite) -> []; +t_getaddr(Config) when is_list(Config) -> + ?line {Name,FullName,IPStr,IP,_,IP_46_Str,IP46} = + ?config(test_host_ipv4_only, Config), + ?line {ok,IP} = inet:getaddr(list_to_atom(Name), inet), + ?line {ok,IP} = inet:getaddr(Name, inet), + ?line {ok,IP} = inet:getaddr(FullName, inet), + ?line {ok,IP} = inet:getaddr(IP, inet), + ?line {ok,IP} = inet:getaddr(IPStr, inet), + ?line {error,nxdomain} = inet:getaddr(IP_46_Str, inet), + ?line {error,eafnosupport} = inet:getaddr(IP46, inet), + + ?line {DName, DFullName, DIPStr, DIP, _, _, _} = ?config(test_dummy_host, Config), + ?line {error,nxdomain} = inet:getaddr(DName, inet), + ?line {error,nxdomain} = inet:getaddr(DFullName, inet), + ?line {ok,DIP} = inet:getaddr(DIPStr, inet), + ?line {ok,DIP} = inet:getaddr(DIP, inet). + +t_getaddr_v6(doc) -> "Test the inet:getaddr/2 function."; +t_getaddr_v6(suite) -> []; +t_getaddr_v6(Config) when is_list(Config) -> + ?line {Name,FullName,IPStr,_IP,_,IP_46_Str,IP46} = + ?config(test_host_ipv4_only, Config), + case {inet:getaddr(IP_46_Str, inet6),inet:getaddr(Name, inet6)} of + {{ok,IP46},{ok,_}} -> + %% Since we suceeded in parsing an IPv6 address string and + %% look up the name, this computer fully supports IPv6. + ?line {ok,IP46} = inet:getaddr(IP46, inet6), + ?line {ok,IP46} = inet:getaddr(Name, inet6), + ?line {ok,IP46} = inet:getaddr(FullName, inet6), + ?line IP4toIP6 = inet:getaddr(IPStr, inet6), + ?line case IP4toIP6 of + {ok,IP46} -> % only native can do this + ?line true = lists:member(native, + inet_db:res_option(lookup)); + {error,nxdomain} -> + ok + end, + ?line {Name6, FullName6, IPStr6, IP6, _} = + ?config(test_host_ipv6_only, Config), + ?line {ok,_} = inet:getaddr(list_to_atom(Name6), inet6), + ?line {ok,_} = inet:getaddr(Name6, inet6), + ?line {ok,_} = inet:getaddr(FullName6, inet6), + ?line {ok,IP6} = inet:getaddr(IP6, inet6), + ?line {ok,IP6} = inet:getaddr(IPStr6, inet6), + + ?line {DName6, DFullName6, DIPStr6, DIP6, _} = + ?config(test_dummy_ipv6_host, Config), + ?line {error,nxdomain} = inet:getaddr(DName6, inet6), + ?line {error,nxdomain} = inet:getaddr(DFullName6, inet6), + ?line {ok,DIP6} = inet:getaddr(DIPStr6, inet6), + ?line {ok,DIP6} = inet:getaddr(DIP6, inet6), + ok; + {_,_} -> + {skip, "IPv6 is not supported on this host"} + end. + +ipv4_to_ipv6(doc) -> "Test if IPv4 address is converted to IPv6 address."; +ipv4_to_ipv6(suite) -> []; +ipv4_to_ipv6(Config) when is_list(Config) -> + %% Test what happens if an IPv4 address is looked up in an IPv6 context. + %% If the native resolver succeeds to look it up, an IPv4 compatible + %% address should be returned. If no IPv6 support on this host, an + %% error should beturned. + ?line {_Name,_FullName,IPStr,_IP,Aliases,IP_46_Str,IP_46} = + ?config(test_host_ipv4_only, Config), + ?line IP4to6Res = + case inet:getaddr(IPStr, inet6) of + {ok,IP_46} -> + io:format("IPv4->IPv6: success~n"), + true; + E = {error,nxdomain} -> + io:format("IPv4->IPv6: nxdomain~n"), + E; + E = {error,eafnosupport} -> + io:format("IPv6->IPv4: eafnosupport~n"), + E; + Other -> + ?line ?t:fail({ipv4_to_ipv6_lookup_failed,Other}) + end, + ?line case {IP4to6Res,inet:gethostbyname(IPStr, inet6)} of + {true,{ok,HEnt}} -> + ?line true = lists:member(native, inet_db:res_option(lookup)), + ?line HEnt_ = HEnt#hostent{h_addrtype = inet6, + h_length = 16, + h_addr_list = [IP_46]}, + ?line HEnt_ = HEnt, + ?line check_elems([{HEnt#hostent.h_name,[IP_46_Str,IPStr]}, + {HEnt#hostent.h_aliases,[[],Aliases]}]); + {_,IP4to6Res} -> ok + end, + ok. + +host_and_addr(doc) -> ["Test looking up hosts and addresses. Use 'ypcat hosts' ", + "or the local eqivalent to find all hosts."]; +host_and_addr(suite) -> []; +host_and_addr(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(5)), + + ?line lists:foreach(fun try_host/1, get_hosts(Config)), + ?line test_server:timetrap_cancel(Dog), + ok. + +try_host({Ip0, Host}) -> + ?line {ok,Ip} = inet:getaddr(Ip0, inet), + ?line {ok,{hostent, _, _, inet, _, Ips1}} = inet:gethostbyaddr(Ip), + ?line {ok,{hostent, _, _, inet, _, _Ips2}} = inet:gethostbyname(Host), + ?line true = lists:member(Ip, Ips1), + ok. + +%% Get all hosts from the system using 'ypcat hosts' or the local +%% equvivalent. + +get_hosts(Config) -> + case os:type() of + {unix, _} -> + List = lists:map(fun(X) -> + atom_to_list(X)++" " + end, ?config(test_hosts, Config)), + Cmd = "ypmatch "++List++" hosts.byname", + HostFile = os:cmd(Cmd), + get_hosts(HostFile, [], [], []); + _ -> + ?config(hardcoded_hosts, Config) + end. + +get_ipv6_hosts(Config) -> + case os:type() of + {unix, _} -> + List = lists:map(fun(X) -> + atom_to_list(X)++" " + end, ?config(test_hosts, Config)), + Cmd = "ypmatch "++List++" ipnodes.byname", + HostFile = os:cmd(Cmd), + get_hosts(HostFile, [], [], []); + _ -> + ?config(hardcoded_ipv6_hosts, Config) + end. + +get_hosts([$\t|Rest], Cur, Ip, Result) when Ip /= [] -> + get_hosts(Rest, Cur, Ip, Result); +get_hosts([$\t|Rest], Cur, _Ip, Result) -> + get_hosts(Rest, [], lists:reverse(Cur), Result); +get_hosts([$\r|Rest], Cur, Ip, Result) -> + get_hosts(Rest, Cur, Ip, Result); +get_hosts([$\n|Rest], Cur, Ip, Result) -> + [First|_] = string:tokens(lists:reverse(Cur), " "), + Ips = string:tokens(Ip, ","), + Hosts = [{I, First} || I <- Ips], + get_hosts(Rest, [], [], Hosts++Result); +get_hosts([C|Rest], Cur, Ip, Result) -> + get_hosts(Rest, [C|Cur], Ip, Result); +get_hosts([], _, _, Result) -> + Result. + +parse(suite) -> [parse_hosts]; +parse(doc) -> ["Test that parsing of the hosts file or equivalent works,", + "and that erroneous lines are skipped"]. +parse_hosts(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir,Config), + ?line HostFile = filename:join(DataDir, "hosts"), + ?line inet_parse:hosts(HostFile), + ?line HostFileErr1 = filename:join(DataDir, "hosts_err1"), + ?line inet_parse:hosts(HostFileErr1), + ?line Resolv = filename:join(DataDir,"resolv.conf"), + ?line inet_parse:resolv(Resolv), + ?line ResolvErr1 = filename:join(DataDir,"resolv.conf.err1"), + ?line inet_parse:resolv(ResolvErr1). + +t_gethostnative(suite) ->[]; +t_gethostnative(doc) ->[]; +t_gethostnative(Config) when is_list(Config) -> +%% this will result in 26 bytes sent which causes problem in Windows +%% if the port-program has not assured stdin to be read in BINARY mode +%% OTP-2555 + case os:type() of + vxworks -> + {skipped, "VxWorks has no native gethostbyname()"}; + _ -> + ?line case inet_gethost_native:gethostbyname( + "a23456789012345678901234") of + {error,notfound} -> + ?line ok; + {error,no_data} -> + ?line ok + end + end. + +gethostnative_parallell(suite) -> + []; +gethostnative_parallell(doc) -> + ["Check that the emulator survives crashes in gethost_native"]; +gethostnative_parallell(Config) when is_list(Config) -> + ?line {ok,Hostname} = inet:gethostname(), + ?line {ok,_} = inet:gethostbyname(Hostname), + case whereis(inet_gethost_native) of + Pid when is_pid(Pid) -> + ?line do_gethostnative_parallell(); + _ -> + ?line {skipped, "Not running native gethostbyname"} + end. + +do_gethostnative_parallell() -> + ?line PA = filename:dirname(code:which(?MODULE)), + ?line {ok,Node} = ?t:start_node(gethost_parallell, slave, + [{args, "-pa " ++ PA}]), + ?line ok = rpc:call(Node, ?MODULE, parallell_gethost, []), + ?line receive after 10000 -> ok end, + ?line pong = net_adm:ping(Node), + ?line ?t:stop_node(Node), + ok. + +parallell_gethost() -> + {ok,Hostname} = inet:gethostname(), + process_flag(trap_exit,true), + parallell_gethost_loop(10, Hostname). + +parallell_gethost_loop(0, _) -> ok; +parallell_gethost_loop(N, Hostname) -> + case whereis(inet_gethost_native) of + Pid when is_pid(Pid) -> + true = exit(Pid,kill); + _ -> + ok + end, + + L = spawn_gethosters(Hostname, 10), + release_gethosters(L), + collect_gethosters(10), + parallell_gethost_loop(N-1, Hostname). + +spawn_gethosters(_, 0) -> + []; +spawn_gethosters(Hostname, N) -> + Collector = self(), + [spawn(fun() -> + receive + go -> + case (catch inet:gethostbyname(Hostname)) of + {ok,_} -> + Collector ! ok; + Else -> + Collector ! {error,Else} + end + end + end) | + spawn_gethosters(Hostname, N-1)]. + +release_gethosters([]) -> + ok; +release_gethosters([H|T]) -> + H ! go, + release_gethosters(T). + +collect_gethosters(0) -> + ok; +collect_gethosters(N) -> + receive + ok -> + collect_gethosters(N-1); + Else -> + {failed, {unexpected, Else}} + after 2000 -> + {failed, {missing, N}} + end. + +kill_gethost() -> + kill_gethost(20). + +kill_gethost(0) -> + ok; +kill_gethost(N) -> + put(kill_gethost_n,N), + Pid = wait_for_gethost(10), + true = exit(Pid,kill), + wait_for_dead_gethost(10), + kill_gethost(N-1). + +wait_for_dead_gethost(0) -> + exit({not_dead,inet_gethost_native}); +wait_for_dead_gethost(N) -> + case whereis(inet_gethost_native) of + Pid when is_pid(Pid) -> + receive after 1000 -> + ok + end, + wait_for_dead_gethost(N-1); + undefined -> + ok + end. + +wait_for_gethost(0) -> + exit(gethost_not_found); +wait_for_gethost(N) -> + {ok,Hostname} = inet:gethostname(), + case (catch inet:gethostbyname(Hostname)) of + {ok,_} -> + ok; + Otherwise -> + %% This is what I call an exit tuple :) + exit({inet,gethostbyname, returned, Otherwise, 'when', + 'N','=',N,'and','hostname','=',Hostname,'and', + kill_gethost_n,'=',get(kill_gethost_n)}) + end, + case whereis(inet_gethost_native) of + Pid when is_pid(Pid) -> + Pid; + _ -> + receive + after 1000 -> + ok + end, + wait_for_gethost(N-1) + end. + +cname_loop(suite) -> + []; +cname_loop(doc) -> + ["Check that the resolver handles a CNAME loop"]; +cname_loop(Config) when is_list(Config) -> + %% getbyname (hostent_by_domain) + ?line ok = inet_db:add_rr("mydomain.com", in, ?S_CNAME, ttl, "mydomain.com"), + ?line {error,nxdomain} = inet_db:getbyname("mydomain.com", ?S_A), + ?line ok = inet_db:del_rr("mydomain.com", in, ?S_CNAME, "mydomain.com"), + %% res_hostent_by_domain + RR = #dns_rr{domain = "mydomain.com", + class = in, + type = ?S_CNAME, + data = "mydomain.com"}, + Rec = #dns_rec{anlist = [RR]}, + ?line {error,nxdomain} = inet_db:res_hostent_by_domain("mydomain.com", ?S_A, Rec), + ok. + + + +%% These must be run in the whole suite since they need +%% the host list and require inet_gethost_native to be started. +%% +-record(gethostnative_control, {control_seq, + control_interval=100, + lookup_delay=10, + lookup_count=300, + lookup_processes=20}). + +gethostnative_soft_restart(suite) -> + []; +gethostnative_soft_restart(doc) -> + ["Check that no name lookups fails during soft restart " + "of inet_gethost_native"]; +gethostnative_soft_restart(Config) when is_list(Config) -> + ?line gethostnative_control(Config, + #gethostnative_control{ + control_seq=[soft_restart]}). + +gethostnative_debug_level(suite) -> + []; +gethostnative_debug_level(doc) -> + ["Check that no name lookups fails during debug level change " + "of inet_gethost_native"]; +gethostnative_debug_level(Config) when is_list(Config) -> + ?line gethostnative_control(Config, + #gethostnative_control{ + control_seq=[{debug_level,1}, + {debug_level,0}]}). + +gethostnative_control(Config, Optrec) -> + ?line case inet_db:res_option(lookup) of + [native] -> + case whereis(inet_gethost_native) of + Pid when is_pid(Pid) -> + ?line gethostnative_control_1(Config, Optrec); + _ -> + ?line {skipped, "Not running native gethostbyname"} + end; + _ -> + ?line {skipped, "Native not only lookup metod"} + end. + +gethostnative_control_1(Config, + #gethostnative_control{ + control_seq=Seq, + control_interval=Interval, + lookup_delay=Delay, + lookup_count=Cnt, + lookup_processes=N}) -> + ?line {ok, Hostname} = inet:gethostname(), + ?line {ok, _} = inet:gethostbyname(Hostname), + ?line Hosts = + [Hostname|[H || {_,H} <- get_hosts(Config)] + ++[H++D || H <- ["www.","www1.","www2.",""], + D <- ["erlang.org","erlang.se"]] + ++[H++"cslab.ericsson.net" || H <- ["morgoth.","hades.","styx."]]], + %% Spawn some processes to do parallel lookups while + %% I repeatedly do inet_gethost_native:control/1. + ?line TrapExit = process_flag(trap_exit, true), + ?line gethostnative_control_2([undefined], Interval, Delay, Cnt, N, Hosts), + ?line test_server:format( + "First intermission: now starting control sequence ~w\n", + [Seq]), + ?line erlang:display(first_intermission), + ?line gethostnative_control_2(Seq, Interval, Delay, Cnt, N, Hosts), + ?line erlang:display(second_intermission), + ?line test_server:format( + "Second intermission: now stopping control sequence ~w\n", + [Seq]), + ?line gethostnative_control_2([undefined], Interval, Delay, Cnt, N, Hosts), + ?line true = process_flag(trap_exit, TrapExit), + ?line ok. + +gethostnative_control_2(Seq, Interval, Delay, Cnt, N, Hosts) -> + ?line Tag = make_ref(), + ?line Parent = self(), + ?line Lookupers = + [spawn_link( + fun () -> + random:seed(), + lookup_loop(Hosts, Delay, Tag, Parent, Cnt, Hosts) + end) + || _ <- lists:seq(1, N)], + control_loop(Seq, Interval, Tag, Lookupers, Seq), + gethostnative_control_3(Tag, ok). + +gethostnative_control_3(Tag, Reason) -> + receive + {Tag,Error} -> + ?line gethostnative_control_3(Tag, Error) + after 0 -> + Reason + end. + +control_loop([], _Interval, _Tag, [], _Seq) -> + ok; +control_loop([], Interval, Tag, Lookupers, Seq) -> + control_loop(Seq, Interval, Tag, Lookupers, Seq); +control_loop([Op|Ops], Interval, Tag, Lookupers, Seq) -> + control_loop(Ops, Interval, Tag, + control_loop_1(Op, Interval, Tag, Lookupers), + Seq). + +control_loop_1(Op, Interval, Tag, Lookupers) -> + ?line + receive + {'EXIT',Pid,Reason} -> + ?line case Reason of + Tag -> % Done + ?line control_loop_1 + (Op, Interval, Tag, + lists:delete(Pid, Lookupers)); + _ -> + ?line io:format("Lookuper ~p died: ~p", + [Pid,Reason]), + ?line test_server:fail("Lookuper died") + end + after Interval -> + ?line if Op =/= undefined -> + ?line ok = inet_gethost_native:control(Op); + true -> + ?line ok + end, + ?line Lookupers + end. + +lookup_loop(_, _Delay, Tag, _Parent, 0, _Hosts) -> + exit(Tag); +lookup_loop([], Delay, Tag, Parent, Cnt, Hosts) -> + lookup_loop(Hosts, Delay, Tag, Parent, Cnt, Hosts); +lookup_loop([H|Hs], Delay, Tag, Parent, Cnt, Hosts) -> + case inet:gethostbyname(H) of + {ok,_Hent} -> ok; + {error,nxdomain} -> ok; + Error -> + ?line io:format("Name lookup error for ~p for ~p: ~p", + [self(),H,Error]), + Parent ! {Tag,Error} + end, + receive + after random:uniform(Delay) -> + lookup_loop(Hs, Delay, Tag, Parent, Cnt-1, Hosts) + end. + + + +getif(suite) -> + []; +getif(doc) -> + ["Tests basic functionality of getiflist, getif, and ifget"]; +getif(Config) when is_list(Config) -> + ?line {ok,Hostname} = inet:gethostname(), + ?line {ok,Address} = inet:getaddr(Hostname, inet), + ?line {ok,Loopback} = inet:getaddr("localhost", inet), + ?line {ok,Interfaces} = inet:getiflist(), + ?line Addresses = + lists:sort( + lists:foldl( + fun (I, Acc) -> + case inet:ifget(I, [addr]) of + {ok,[{addr,A}]} -> [A|Acc]; + {ok,[]} -> Acc + end + end, [], Interfaces)), + ?line {ok,Getif} = inet:getif(), + ?line Addresses = lists:sort([A || {A,_,_} <- Getif]), + ?line true = ip_member(Address, Addresses), + ?line true = ip_member(Loopback, Addresses), + ?line ok. + +%% Works just like lists:member/2, except that any {127,_,_,_} tuple +%% matches any other {127,_,_,_}. We do this to handle Linux systems +%% that use (for instance) 127.0.1.1 as the IP address for the hostname. + +ip_member({127,_,_,_}, [{127,_,_,_}|_]) -> true; +ip_member(K, [K|_]) -> true; +ip_member(K, [_|T]) -> ip_member(K, T); +ip_member(_, []) -> false. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/init_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/init_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/init_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/init_SUITE.erl 2009-11-20 13:30:02.000000000 +0000 @@ -0,0 +1,582 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(init_SUITE). + +-include("test_server.hrl"). + +-export([all/1]). + +-export([get_arguments/1, get_argument/1, boot_var/1, restart/1, + get_plain_arguments/1, + reboot/1, stop/1, get_status/1, script_id/1, boot/1]). +-export([boot1/1, boot2/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-export([init/1, fini/1]). + +-define(DEFAULT_TIMEOUT_SEC, 100). + +%%----------------------------------------------------------------- +%% Test suite for init. (Most code is run during system start/stop. +%% Should be started in a CC view with: +%% erl -sname master -rsh ctrsh +%%----------------------------------------------------------------- +all(suite) -> + [get_arguments, get_argument, boot_var, + get_plain_arguments, + restart, + get_status, script_id, boot]. + +init_per_testcase(Func, Config) when atom(Func), list(Config) -> + Dog=?t:timetrap(?t:seconds(?DEFAULT_TIMEOUT_SEC)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +init(doc) -> []; +init(suite) -> []; +init(Config) when is_list(Config) -> + Config. + +fini(doc) -> []; +fini(suite) -> []; +fini(Config) when is_list(Config) -> + Host = list_to_atom(from($@, atom_to_list(node()))), + Node = list_to_atom(lists:concat([init_test, "@", Host])), + stop_node(Node), + Config. + +get_arguments(doc) ->[]; +get_arguments(suite) -> {req, [distribution, {local_slave_nodes, 1}]}; +get_arguments(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(10)), + + Args = args(), + ?line {ok, Node} = start_node(init_test, Args), + ?line case rpc:call(Node, init, get_arguments, []) of + Arguments when is_list(Arguments) -> + stop_node(Node), + check_a(Arguments), + check_b(Arguments), + check_c(Arguments), + check_d(Arguments); + _ -> + stop_node(Node), + ?t:fail(get_arguments) + end, + ?line ?t:timetrap_cancel(Dog), + ok. + +check_a(Args) -> + case lists:keysearch(a,1,Args) of + {value, {a,["kalle"]}} -> + Args1 = lists:keydelete(a,1,Args), + case lists:keysearch(a,1,Args1) of + false -> + ok; + _ -> + ?t:fail(check_a1) + end; + _ -> + ?t:fail(check_a2) + end. + +check_b(Args) -> + case lists:keysearch(b,1,Args) of + {value, {b,["hej", "hopp"]}} -> + Args1 = lists:keydelete(b,1,Args), + case lists:keysearch(b,1,Args1) of + {value, {b,["san", "sa"]}} -> + Args2 = lists:keydelete(b,1,Args1), + case lists:keysearch(b,1,Args2) of + false -> + ok; + _ -> + ?t:fail(check_b1) + end; + _ -> + ?t:fail(check_b2) + end; + _ -> + ?t:fail(check_b3) + end. + +check_c(Args) -> + case lists:keysearch(c,1,Args) of + {value, {c,["4", "5", "6"]}} -> + Args1 = lists:keydelete(c,1,Args), + case lists:keysearch(c,1,Args1) of + {value, {c,["7", "8", "9"]}} -> + Args2 = lists:keydelete(c,1,Args1), + case lists:keysearch(c,1,Args2) of + false -> + ok; + _ -> + ?t:fail(check_c1) + end; + _ -> + ?t:fail(check_c2) + end; + _ -> + ?t:fail(check_c3) + end. + +check_d(Args) -> + case lists:keysearch(d,1,Args) of + {value, {d,[]}} -> + Args1 = lists:keydelete(d,1,Args), + case lists:keysearch(d,1,Args1) of + false -> + ok; + _ -> + ?t:fail(check_d1) + end; + _ -> + ?t:fail(check_d2) + end. + +get_argument(doc) ->[]; +get_argument(suite) -> {req, [distribution, {local_slave_nodes, 1}]}; +get_argument(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(10)), + + Args = args(), + ?line {ok, Node} = start_node(init_test, Args), + ?line case rpc:call(Node, init, get_argument, [b]) of + {ok, [["hej", "hopp"],["san", "sa"]]} -> + ok; + _ -> + stop_node(Node), + ?t:fail({get_argument, b}) + end, + ?line case rpc:call(Node, init, get_argument, [a]) of + {ok, [["kalle"]]} -> + ok; + _ -> + stop_node(Node), + ?t:fail({get_argument, a}) + end, + ?line case rpc:call(Node, init, get_argument, [c]) of + {ok, [["4", "5", "6"], ["7", "8", "9"]]} -> + ok; + _ -> + stop_node(Node), + ?t:fail({get_argument, c}) + end, + ?line case rpc:call(Node, init, get_argument, [d]) of + {ok, [[]]} -> + ok; + _ -> + stop_node(Node), + ?t:fail({get_argument, d}) + end, + ?line case rpc:call(Node, init, get_argument, [e]) of + error -> + ok; + _ -> + stop_node(Node), + ?t:fail({get_argument, e}) + end, + stop_node(Node), + ?line ?t:timetrap_cancel(Dog), + ok. + +get_plain_arguments(doc) ->[]; +get_plain_arguments(suite) -> {req, [distribution, {local_slave_nodes, 1}]}; +get_plain_arguments(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(10)), + Longstring = + "fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2" + "fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2" + "fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2" + "fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2" + "fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2" + "fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2" + "fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2" + "fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2" + "fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2", + ?line true = (length(Longstring) > 255), + Args = long_args(Longstring), + ?line {ok, Node} = start_node(init_test, Args), + ?line case rpc:call(Node, init, get_plain_arguments, []) of + ["a", "b", "c", Longstring] -> + ok; + As -> + stop_node(Node), + ?t:fail({get_argument, As}) + end, + stop_node(Node), + ?line ?t:timetrap_cancel(Dog), + + ok. + + +%% ------------------------------------------------ +%% Use -boot_var flag to set $TEST_VAR in boot script. +%% ------------------------------------------------ +boot_var(doc) -> []; +boot_var(suite) -> {req, [distribution, {local_slave_nodes, 1}]}; +boot_var(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {comment, "Not run on VxWorks"}; + _ -> + ?line Dog = ?t:timetrap(?t:seconds(100)), + + {BootScript, TEST_VAR, KernelVsn, StdlibVsn} = create_boot(Config), + + %% Should fail as we have not given -boot_var TEST_VAR + ?line {error, timeout} = + start_node(init_test, "-boot " ++ BootScript), + + case is_real_system(KernelVsn, StdlibVsn) of + true -> + %% Now it should work !! + ?line {ok, Node} = + start_node(init_test, + "-boot " ++ BootScript ++ + " -boot_var TEST_VAR " ++ TEST_VAR), + stop_node(Node), + Res = ok; + _ -> +%% What we need is not so much version numbers on the directories, but +%% for the boot var TEST_VAR to appear in the boot script, and it doesn't +%% if we give the 'local' option to systools:make_script. + ?t:format( + "Test case not complete as we are not~n" + "running in a real system!~n" + "Probably this test is performed in a " + "clearcase view or source tree.~n" + "Need version numbers on the kernel and " + "stdlib directories!~n", + []), + Res = {skip, + "Test case only partially run since it is run " + "in a clearcase view or in a source tree. " + "Need an installed system to complete this test."} + end, + ?line ?t:timetrap_cancel(Dog), + Res + end. + +create_boot(Config) -> + ?line {ok, OldDir} = file:get_cwd(), + ?line {LatestDir, LatestName, KernelVsn, StdlibVsn} = + create_script(Config), + LibDir = code:lib_dir(), + ?line ok = file:set_cwd(LatestDir), + ?line ok = systools:make_script(LatestName, + [{variables, [{"TEST_VAR", LibDir}]}]), + ?line ok = file:set_cwd(OldDir), + {LatestDir ++ "/" ++ LatestName, LibDir, KernelVsn, StdlibVsn}. + +is_real_system(KernelVsn, StdlibVsn) -> + LibDir = code:lib_dir(), + filelib:is_dir(filename:join(LibDir, "kernel"++KernelVsn)) andalso + filelib:is_dir(filename:join(LibDir, "stdlib"++StdlibVsn)). + +%% ------------------------------------------------ +%% Slave executes erlang:halt() on master nodedown. +%% Therefore the slave process must be killed +%% before restart. +%% ------------------------------------------------ +restart(doc) -> []; +restart(suite) -> + case ?t:os_type() of + {Fam, _} when Fam == unix; Fam == win32 -> + {req, [distribution, {local_slave_nodes, 1}, {time, 5}]}; + _ -> + {skip, "Only run on unix and win32"} + end; +restart(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(40)), + ?line Args = args(), + + %% Currently test_server:start_node cannot be used. The restarted + %% node immediately halts due to the implementation of + %% test_server:start_node. + ?line {ok, Node} = loose_node:start(init_test, Args, ?DEFAULT_TIMEOUT_SEC), + %% Ok, the node is up, now the real test test begins. + ?line erlang:monitor_node(Node, true), + ?line InitPid = rpc:call(Node, erlang, whereis, [init]), + ?line Procs = rpc:call(Node, erlang, processes, []), + ?line MaxPid = lists:last(Procs), + ?line ok = rpc:call(Node, init, restart, []), + ?line receive + {nodedown, Node} -> + ok + after 10000 -> + loose_node:stop(Node), + ?t:fail(not_stopping) + end, + ?line ok = wait_restart(30, Node), + + %% Still the same init process! + ?line InitPid1 = rpc:call(Node, erlang, whereis, [init]), + InitP = pid_to_list(InitPid), + ?line InitP = pid_to_list(InitPid1), + + ?line NewProcs0 = rpc:call(Node, erlang, processes, []), + NewProcs = lists:delete(InitPid1, NewProcs0), + ?line case check_processes(NewProcs, MaxPid) of + true -> + ok; + _ -> + loose_node:stop(Node), + ?t:fail(processes_not_greater) + end, + + %% Test that, for instance, the same argument still exists. + ?line case rpc:call(Node, init, get_argument, [c]) of + {ok, [["4", "5", "6"], ["7", "8", "9"]]} -> + ok; + _ -> + loose_node:stop(Node), + ?t:fail({get_argument, restart_fail}) + end, + loose_node:stop(Node), + ?line ?t:timetrap_cancel(Dog), + ok. + +wait_restart(0, _Node) -> + ?t:fail(not_restarted); +wait_restart(N, Node) -> + case net_adm:ping(Node) of + pong -> ok; + _ -> + ?t:sleep(1000), + wait_restart(N - 1, Node) + end. + +check_processes(NewProcs, MaxPid) -> + [N,P,I] = apid(MaxPid), + case lists:filter(fun(Pid) -> + case apid(Pid) of + [N,P1,_I1] when P1 > P -> false; + [N,_P1,I1] when I1 > I -> false; + _ -> true + end + end, NewProcs) of + [] -> + true; + _ -> + false + end. + +apid(Pid) -> + [N,P,I] = string:tokens(pid_to_list(Pid),"<>."), + [list_to_integer(N),list_to_integer(P),list_to_integer(I)]. + +%% ------------------------------------------------ +%% Just test that the system is halted here. +%% The reboot facility using heart is tested +%% in the heart_SUITE. +%% ------------------------------------------------ +reboot(doc) -> []; +reboot(suite) -> {req, [distribution, {local_slave_nodes, 1}]}; +reboot(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(40)), + + Args = args(), + ?line {ok, Node} = start_node(init_test, Args), + erlang:monitor_node(Node, true), + ?line ok = rpc:call(Node, init, reboot, []), + ?line receive + {nodedown, Node} -> + ok + after 10000 -> + stop_node(Node), + ?t:fail(not_stopping) + end, + ?t:sleep(5000), + ?line case net_adm:ping(Node) of + pang -> + ok; + _ -> + stop_node(Node), + ?t:fail(system_rebooted) + end, + ?line ?t:timetrap_cancel(Dog), + ok. + +%% ------------------------------------------------ +%% +%% ------------------------------------------------ +stop(doc) -> []; +stop(suite) -> []; +stop(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(20)), + Args = args(), + ?line {ok, Node} = start_node(init_test, Args), + erlang:monitor_node(Node, true), + ?line ok = rpc:call(Node, init, reboot, []), + ?line receive + {nodedown, Node} -> + ok + after 10000 -> + stop_node(Node), + ?t:fail(not_stopping) + end, + ?t:sleep(5000), + ?line case net_adm:ping(Node) of + pang -> + ok; + _ -> + stop_node(Node), + ?t:fail(system_rebooted) + end, + ?line ?t:timetrap_cancel(Dog), + ok. + +%% ------------------------------------------------ +%% +%% ------------------------------------------------ +get_status(doc) -> []; +get_status(suite) -> []; +get_status(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(10)), + ?line ?t:timetrap_cancel(Dog), + + ?line {Start, _} = init:get_status(), + %% Depending on how the test_server is started Start has + %% different values. staring if test_server started with + %% -s flag. + ?line case lists:member(Start, [started, starting]) of + true -> + ok; + _ -> + ?t:fail(get_status) + end. + +%% ------------------------------------------------ +%% +%% ------------------------------------------------ +script_id(doc) -> []; +script_id(suite) -> []; +script_id(Config) when is_list(Config) -> + ?line Dog = ?t:timetrap(?t:seconds(10)), + + ?line {Name, Vsn} = init:script_id(), + ?line if + list(Name), list(Vsn) -> + ok; + true -> + ?t:fail(not_standard_script) + end, + ?line ?t:timetrap_cancel(Dog), + ok. + +%% ------------------------------------------------ +%% Start the slave system with -boot flag. +%% ------------------------------------------------ +boot(suite) -> [boot1, boot2]. + +boot1(doc) -> []; +boot1(suite) -> {req, [distribution, {local_slave_nodes, 1}, {time, 35}]}; +boot1(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {comment, "Not run on VxWorks"}; + _ -> + ?line Dog = ?t:timetrap(?t:seconds(80)), + Args = args() ++ " -boot start_sasl", + ?line {ok, Node} = start_node(init_test, Args), + ?line stop_node(Node), + + %% Try to start with non existing boot file. + Args1 = args() ++ " -boot dummy_script", + ?line {error, timeout} = start_node(init_test, Args1), + + ?line ?t:timetrap_cancel(Dog), + ok + end. + +boot2(doc) -> []; +boot2(suite) -> {req, [distribution, {local_slave_nodes, 1}, {time, 35}]}; +boot2(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {comment, "Not run on VxWorks"}; + _ -> + ?line Dog = ?t:timetrap(?t:seconds(80)), + + %% Absolute boot file name + Boot = filename:join([code:root_dir(), "bin", "start_sasl"]), + + Args = args() ++ " -boot " ++ Boot, + ?line {ok, Node} = start_node(init_test, Args), + ?line stop_node(Node), + + case os:type() of + {win32, _} -> + %% Absolute boot file name for Windows -- all slashes are + %% converted to backslashes. + Win_boot = lists:map(fun($/) -> $\\; (C) -> C end, + Boot), + Args2 = args() ++ " -boot " ++ Win_boot, + ?line {ok, Node2} = start_node(init_test, Args2), + ?line stop_node(Node2); + _ -> + ok + end, + + ?line ?t:timetrap_cancel(Dog), + ok + end. + +%% Misc. functions + +start_node(Name, Param) -> + ?t:start_node(Name, slave, [{args, Param}]). + +stop_node(Node) -> + ?t:stop_node(Node). + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(_, []) -> []. + +args() -> + "-a kalle -- a b -d -b hej hopp -- c d -b san sa -c 4 5 6 -c 7 8 9". + +long_args(A) -> + lists:flatten( + io_lib:format("-a kalle -- a b -d -b hej hopp -- c " + "~s -b san sa -c 4 5 6 -c 7 8 9", + [A])). + +create_script(Config) -> + ?line PrivDir = ?config(priv_dir,Config), + ?line Name = PrivDir ++ "boot_var_test", + ?line Apps = application_controller:which_applications(), + ?line {value,{_,_,KernelVer}} = lists:keysearch(kernel,1,Apps), + ?line {value,{_,_,StdlibVer}} = lists:keysearch(stdlib,1,Apps), + ?line {ok,Fd} = file:open(Name ++ ".rel", write), + ?line io:format(Fd, + "{release, {\"Test release 3\", \"P2A\"}, \n" + " {erts, \"4.4\"}, \n" + " [{kernel, \"~s\"}, {stdlib, \"~s\"}]}.\n", + [KernelVer,StdlibVer]), + ?line file:close(Fd), + {filename:dirname(Name), filename:basename(Name), + KernelVer, StdlibVer}. + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/interactive_shell_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/interactive_shell_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/interactive_shell_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/interactive_shell_SUITE.erl 2009-11-20 13:32:33.000000000 +0000 @@ -0,0 +1,616 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(interactive_shell_SUITE). +-include("test_server.hrl"). +-export([all/1, get_columns_and_rows/1, exit_initial/1, job_control_local/1, + job_control_remote/1, + job_control_remote_noshell/1]). + +-export([init_per_testcase/2, end_per_testcase/2]). +%% For spawn +-export([toerl_server/3]). + +init_per_testcase(_Func, Config) -> + Dog = test_server:timetrap(test_server:seconds(60)), + Term = case os:getenv("TERM") of + List when is_list(List) -> + List; + _ -> + "dumb" + end, + os:putenv("TERM","vt100"), + [{watchdog,Dog},{term,Term}|Config]. + +end_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + Term = ?config(term,Config), + os:putenv("TERM",Term), + test_server:timetrap_cancel(Dog). + + +all(suite) -> + [get_columns_and_rows, exit_initial, job_control_local, + job_control_remote, job_control_remote_noshell]. + +%-define(DEBUG,1). +-ifdef(DEBUG). +-define(dbg(Data),erlang:display(Data)). +-else. +-define(dbg(Data),noop). +-endif. + +get_columns_and_rows(suite) -> []; +get_columns_and_rows(doc) -> ["Test that the shell can access columns and rows"]; +get_columns_and_rows(Config) when is_list(Config) -> + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline, "2"}, + {putline,"io:columns()."}, +%% Behaviour change in R12B-5, returns 80 +%% {getline,"{error,enotsup}"}, + {getline,"{ok,80}"}, + {putline,"io:rows()."}, +%% Behaviour change in R12B-5, returns 24 +%% {getline,"{error,enotsup}"} + {getline,"{ok,24}"} + ],[]), + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline, "2"}, + {putline,"io:columns()."}, + {getline,"{ok,90}"}, + {putline,"io:rows()."}, + {getline,"{ok,40}"}], + [], + "stty rows 40; stty columns 90; "). + + + +exit_initial(suite) -> []; +exit_initial(doc) -> ["Tests that exit of initial shell restarts shell"]; +exit_initial(Config) when is_list(Config) -> + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline, "2"}, + {putline,"exit()."}, + {getline,""}, + {getline,"Eshell"}, + {putline,""}, + {putline,"35."}, + {getline,"35"}],[]). + +job_control_local(suite) -> []; +job_control_local(doc) -> [ "Tests that local shell can be " + "started by means of job control" ]; +job_control_local(Config) when is_list(Config) -> + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline, "2"}, + {putline,[7]}, + {sleep,timeout(short)}, + {putline,""}, + {getline," -->"}, + {putline,"s"}, + {putline,"c"}, + {putline_raw,""}, + {getline,"Eshell"}, + {putline_raw,""}, + {getline,"1>"}, + {putline,"35."}, + {getline,"35"}],[]). + +job_control_remote(suite) -> []; +job_control_remote(doc) -> [ "Tests that remote shell can be " + "started by means of job control" ]; +job_control_remote(Config) when is_list(Config) -> + case node() of + nonode@nohost -> + ?line exit(not_distributed); + _ -> + ?line RNode = create_nodename(), + ?line MyNode = atom_to_list(node()), + ?line Pid = spawn_link(fun() -> + receive die -> + ok + end + end), + ?line PidStr = pid_to_list(Pid), + ?line register(kalaskula,Pid), + ?line CookieString = lists:flatten( + io_lib:format("~w", + [erlang:get_cookie()])), + ?line Res = rtnode([{putline,""}, + {putline, "erlang:get_cookie()."}, + {getline, CookieString}, + {putline,[7]}, + {sleep,timeout(short)}, + {putline,""}, + {getline," -->"}, + {putline,"r "++MyNode}, + {putline,"c"}, + {putline_raw,""}, + {getline,"Eshell"}, + {sleep,timeout(short)}, + {putline_raw,""}, + {getline,"("++MyNode++")1>"}, + {putline,"whereis(kalaskula)."}, + {getline,PidStr}, + {sleep,timeout(short)}, % Race, known bug. + {putline_raw,"exit()."}, + {getline,"***"}, + {putline,[7]}, + {putline,""}, + {getline," -->"}, + {putline,"c 1"}, + {putline,""}, + {sleep,timeout(short)}, + {putline_raw,""}, + {getline,"("++RNode++")"}],RNode), + ?line Pid ! die, + ?line Res + end. +job_control_remote_noshell(suite) -> []; +job_control_remote_noshell(doc) -> + [ "Tests that remote shell can be " + "started by means of job control to -noshell node" ]; +job_control_remote_noshell(Config) when is_list(Config) -> + case node() of + nonode@nohost -> + ?line exit(not_distributed); + _ -> + ?line RNode = create_nodename(), + ?line NSNode = start_noshell_node(interactive_shell_noshell), + ?line Pid = spawn_link(NSNode, fun() -> + receive die -> + ok + end + end), + ?line PidStr = rpc:call(NSNode,erlang,pid_to_list,[Pid]), + ?line true = rpc:call(NSNode,erlang,register,[kalaskula,Pid]), + ?line NSNodeStr = atom_to_list(NSNode), + ?line CookieString = lists:flatten( + io_lib:format("~w", + [erlang:get_cookie()])), + ?line Res = rtnode([{putline,""}, + {putline, "erlang:get_cookie()."}, + {getline, CookieString}, + {putline,[7]}, + {sleep,timeout(short)}, + {putline,""}, + {getline," -->"}, + {putline,"r "++NSNodeStr}, + {putline,"c"}, + {putline_raw,""}, + {getline,"Eshell"}, + {sleep,timeout(short)}, + {putline_raw,""}, + {getline,"("++NSNodeStr++")1>"}, + {putline,"whereis(kalaskula)."}, + {getline,PidStr}, + {sleep,timeout(short)}, % Race, known bug. + {putline_raw,"exit()."}, + {getline,"***"}, + {putline,[7]}, + {putline,""}, + {getline," -->"}, + {putline,"c 1"}, + {putline,""}, + {sleep,timeout(short)}, + {putline_raw,""}, + {getline,"("++RNode++")"}],RNode), + ?line Pid ! die, + ?line stop_noshell_node(NSNode), + ?line Res + end. + +rtnode(C,N) -> + rtnode(C,N,[]). +rtnode(Commands,Nodename,ErlPrefix) -> + ?line case get_progs() of + {error,_Reason} -> + ?line {skip,"No runerl present"}; + {RunErl,ToErl,Erl} -> + ?line case create_tempdir() of + {error, Reason2} -> + ?line {skip, Reason2}; + Tempdir -> + ?line SPid = + start_runerl_node(RunErl,ErlPrefix++Erl, + Tempdir,Nodename), + ?line CPid = start_toerl_server(ToErl,Tempdir), + ?line erase(getline_skipped), + ?line Res = + (catch get_and_put(CPid, Commands,1)), + ?line case stop_runerl_node(CPid) of + {error,_} -> + ?line CPid2 = + start_toerl_server + (ToErl,Tempdir), + ?line erase(getline_skipped), + ?line ok = get_and_put + (CPid2, + [{putline,[7]}, + {sleep, + timeout(short)}, + {putline,""}, + {getline," -->"}, + {putline,"s"}, + {putline,"c"}, + {putline,""}],1), + ?line stop_runerl_node(CPid2); + _ -> + ?line ok + end, + ?line wait_for_runerl_server(SPid), + ?line ok = rm_rf(Tempdir), + ?line ok = Res + end + end. + +timeout(long) -> + 2 * timeout(normal); +timeout(short) -> + timeout(normal) div 10; +timeout(normal) -> + 10000 * test_server:timetrap_scale_factor(). + + +start_noshell_node(Name) -> + PADir = filename:dirname(code:which(?MODULE)), + {ok, Node} = test_server:start_node(Name,slave,[{args," -noshell -pa "++ + PADir++" "}]), + Node. +stop_noshell_node(Node) -> + test_server:stop_node(Node). + + +rm_rf(Dir) -> + try + {ok,List} = file:list_dir(Dir), + Files = [filename:join([Dir,X]) || X <- List], + [case file:list_dir(Y) of + {error, enotdir} -> + ok = file:delete(Y); + _ -> + ok = rm_rf(Y) + end || Y <- Files], + ok = file:del_dir(Dir), + ok + catch + _:Exception -> {error, {Exception,Dir}} + end. + + +get_and_put(_CPid,[],_) -> + ok; +get_and_put(CPid, [{sleep, X}|T],N) -> + ?dbg({sleep, X}), + receive + after X -> + get_and_put(CPid,T,N+1) + end; +get_and_put(CPid, [{getline, Match}|T],N) -> + ?dbg({getline, Match}), + CPid ! {self(), {get_line, timeout(normal)}}, + receive + {get_line, timeout} -> + error_logger:error_msg("~p: getline timeout waiting for \"~s\" " + "(command number ~p, skipped: ~p)~n", + [?MODULE, Match,N,get(getline_skipped)]), + {error, timeout}; + {get_line, Data} -> + ?dbg({data,Data}), + case lists:prefix(Match, Data) of + true -> + erase(getline_skipped), + get_and_put(CPid, T,N+1); + false -> + case get(getline_skipped) of + undefined -> + put(getline_skipped,[Data]); + List -> + put(getline_skipped,List ++ [Data]) + end, + get_and_put(CPid, [{getline, Match}|T],N) + end + end; + +get_and_put(CPid, [{putline_raw, Line}|T],N) -> + ?dbg({putline_raw, Line}), + CPid ! {self(), {send_line, Line}}, + Timeout = timeout(normal), + receive + {send_line, ok} -> + get_and_put(CPid, T,N+1) + after Timeout -> + error_logger:error_msg("~p: putline_raw timeout (~p) sending " + "\"~s\" (command number ~p)~n", + [?MODULE, Timeout, Line, N]), + {error, timeout} + end; + +get_and_put(CPid, [{putline, Line}|T],N) -> + ?dbg({putline, Line}), + CPid ! {self(), {send_line, Line}}, + Timeout = timeout(normal), + receive + {send_line, ok} -> + get_and_put(CPid, [{getline, []}|T],N) + after Timeout -> + error_logger:error_msg("~p: putline timeout (~p) sending " + "\"~s\" (command number ~p)~n[~p]~n", + [?MODULE, Timeout, Line, N,get()]), + {error, timeout} + end. + +wait_for_runerl_server(SPid) -> + Ref = erlang:monitor(process, SPid), + Timeout = timeout(long), + receive + {'DOWN', Ref, process, SPid, _} -> + ok + after Timeout -> + {error, timeout} + end. + + + +stop_runerl_node(CPid) -> + Ref = erlang:monitor(process, CPid), + CPid ! {self(), kill_emulator}, + Timeout = timeout(long), + receive + {'DOWN', Ref, process, CPid, noproc} -> + ok; + {'DOWN', Ref, process, CPid, normal} -> + ok; + {'DOWN', Ref, process, CPid, {error, Reason}} -> + {error, Reason} + after Timeout -> + {error, timeout} + end. + +get_progs() -> + case os:type() of + {unix,freebsd} -> + {error,"cant use run_erl on freebsd"}; + {unix,openbsd} -> + {error,"cant use run_erl on openbsd"}; + {unix,_} -> + case os:find_executable("run_erl") of + RE when is_list(RE) -> + case os:find_executable("to_erl") of + TE when is_list(TE) -> + case os:find_executable("erl") of + E when is_list(E) -> + {RE,TE,E}; + _ -> + {error, "Could not find erl command"} + end; + _ -> + {error, "Could not find to_erl command"} + end; + _ -> + {error, "Could not find run_erl command"} + end; + _ -> + {error, "Not a unix OS"} + end. + +create_tempdir() -> + create_tempdir(filename:join(["/tmp","rtnode"++os:getpid()]),$A). + +create_tempdir(Dir,X) when X > $Z, X < $a -> + create_tempdir(Dir,$a); +create_tempdir(Dir,X) when X > $z -> + Estr = lists:flatten( + io_lib:format("Unable to create ~s, reason eexist", + [Dir++[$z]])), + {error, Estr}; +create_tempdir(Dir0, Ch) -> + % Expect fairly standard unix. + Dir = Dir0++[Ch], + case file:make_dir(Dir) of + {error, eexist} -> + create_tempdir(Dir0, Ch+1); + {error, Reason} -> + Estr = lists:flatten( + io_lib:format("Unable to create ~s, reason ~p", + [Dir,Reason])), + {error,Estr}; + ok -> + Dir + end. + +create_nodename() -> + create_nodename($A). + +create_nodename(X) when X > $Z, X < $a -> + create_nodename($a); +create_nodename(X) when X > $z -> + {error,out_of_nodenames}; +create_nodename(X) -> + NN = "rtnode"++os:getpid()++[X], + case file:read_file_info(filename:join(["/tmp",NN])) of + {error,enoent} -> + Host = lists:nth(2,string:tokens(atom_to_list(node()),"@")), + NN++"@"++Host; + _ -> + create_nodename(X+1) + end. + + +start_runerl_node(RunErl,Erl,Tempdir,Nodename) -> + XArg = case Nodename of + [] -> + []; + _ -> + " -sname "++(if is_atom(Nodename) -> atom_to_list(Nodename); + true -> Nodename + end)++ + " -setcookie "++atom_to_list(erlang:get_cookie()) + end, + spawn(fun() -> + os:cmd(RunErl++" "++Tempdir++"/ "++Tempdir++" \""++ + Erl++XArg++"\"") + end). + +start_toerl_server(ToErl,Tempdir) -> + Pid = spawn(?MODULE,toerl_server,[self(),ToErl,Tempdir]), + receive + {Pid,started} -> + Pid; + {Pid,error,Reason} -> + {error,Reason} + end. + +try_to_erl(_Command, 0) -> + {error, cannot_to_erl}; +try_to_erl(Command, N) -> + ?dbg({?LINE,N}), + Port = open_port({spawn, Command},[eof,{line,1000}]), + Timeout = timeout(normal) div 2, + receive + {Port, eof} -> + receive after Timeout -> + ok + end, + try_to_erl(Command, N-1) + after Timeout -> + ?dbg(Port), + Port + end. + +toerl_server(Parent,ToErl,Tempdir) -> + Port = try_to_erl(ToErl++" "++Tempdir++"/ 2>/dev/null",8), + case Port of + P when is_port(P) -> + Parent ! {self(),started}; + {error,Other} -> + Parent ! {self(),error,Other}, + exit(Other) + end, + case toerl_loop(Port,[]) of + normal -> + ok; + {error, Reason} -> + error_logger:error_msg("toerl_server exit with reason ~p~n", + [Reason]), + exit(Reason) + end. + +toerl_loop(Port,Acc) -> + ?dbg({toerl_loop, Port, Acc}), + receive + {Port,{data,{Tag0,Data}}} when is_port(Port) -> + ?dbg({?LINE,Port,{data,{Tag0,Data}}}), + case Acc of + [{noeol,Data0}|T0] -> + toerl_loop(Port,[{Tag0, Data0++Data}|T0]); + _ -> + toerl_loop(Port,[{Tag0,Data}|Acc]) + end; + {Pid,{get_line,Timeout}} -> + case Acc of + [] -> + case get_data_within(Port,Timeout,[]) of + timeout -> + Pid ! {get_line, timeout}, + toerl_loop(Port,[]); + {noeol,Data1} -> + Pid ! {get_line, timeout}, + toerl_loop(Port,[{noeol,Data1}]); + {eol,Data2} -> + Pid ! {get_line, Data2}, + toerl_loop(Port,[]) + end; + [{noeol,Data3}] -> + case get_data_within(Port,Timeout,Data3) of + timeout -> + Pid ! {get_line, timeout}, + toerl_loop(Port,Acc); + {noeol,Data4} -> + Pid ! {get_line, timeout}, + toerl_loop(Port,[{noeol,Data4}]); + {eol,Data5} -> + Pid ! {get_line, Data5}, + toerl_loop(Port,[]) + end; + List -> + {NewAcc,[{eol,Data6}]} = lists:split(length(List)-1,List), + Pid ! {get_line,Data6}, + toerl_loop(Port,NewAcc) + end; + {Pid, {send_line, Data7}} -> + Port ! {self(),{command, Data7++"\n"}}, + Pid ! {send_line, ok}, + toerl_loop(Port,Acc); + {_Pid, kill_emulator} -> + Port ! {self(),{command, "init:stop().\n"}}, + Timeout1 = timeout(long), + receive + {Port,eof} -> + normal + after Timeout1 -> + {error, kill_timeout} + end; + {Port, eof} -> + {error, unexpected_eof}; + Other -> + {error, {unexpected, Other}} + end. + +millistamp() -> + {Mega, Secs, Micros} = erlang:now(), + (Micros div 1000) + Secs * 1000 + Mega * 1000000000. + +get_data_within(Port, X, Acc) when X =< 0 -> + ?dbg({get_data_within, X, Acc, ?LINE}), + receive + {Port,{data,{Tag0,Data}}} -> + ?dbg({?LINE,Port,{data,{Tag0,Data}}}), + {Tag0, Acc++Data} + after 0 -> + case Acc of + [] -> + timeout; + Noeol -> + {noeol,Noeol} + end + end; + + +get_data_within(Port, Timeout, Acc) -> + ?dbg({get_data_within, Timeout, Acc, ?LINE}), + T1 = millistamp(), + receive + {Port,{data,{noeol,Data}}} -> + ?dbg({?LINE,Port,{data,{noeol,Data}}}), + Elapsed = millistamp() - T1 + 1, + get_data_within(Port, Timeout - Elapsed, Acc ++ Data); + {Port,{data,{eol,Data1}}} -> + ?dbg({?LINE,Port,{data,{eol,Data1}}}), + {eol, Acc ++ Data1} + after Timeout -> + timeout + end. + + + + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/kernel_config_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/kernel_config_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/kernel_config_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/kernel_config_SUITE.erl 2009-11-20 13:30:00.000000000 +0000 @@ -0,0 +1,107 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(kernel_config_SUITE). + +-include("test_server.hrl"). + +-export([all/1, sync/1]). + +-export([init/1, fini/1]). + +all(suite) -> + [{conf, init, [sync], fini}]. + +init(doc) -> []; +init(suite) -> []; +init(Config) when is_list(Config) -> + Config. + +fini(doc) -> []; +fini(suite) -> []; +fini(Config) when is_list(Config) -> + stop_node(init_test), + Config. + +config(Fd) -> + M = from($@, atom_to_list(node())), + io:format(Fd, "[{kernel, [{sync_nodes_optional, ['cp1@~s','cp2@~s']}," + "{sync_nodes_timeout, 15000}]}].~n", + [M, M]). + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(_, []) -> []. + +%%----------------------------------------------------------------- +%% Test suite for sync_nodes. This is quite tricky. +%% +%% Should be started in a CC view with: +%% erl -sname XXX where XX not in [cp1, cp2] +%%----------------------------------------------------------------- +sync(doc) -> []; +sync(suite) -> []; +sync(Conf) when list(Conf) -> + ?line Dog = ?t:timetrap(?t:seconds(120)), + % Write a config file + Dir = ?config(priv_dir,Conf), + {ok, Fd} = file:open(Dir ++ "sys.config", [write]), + config(Fd), + file:close(Fd), + Config = Dir ++ "sys", + + %% Reset wall_clock + {T1,_} = erlang:statistics(wall_clock), + io:format("~p~n", [{t1, T1}]), + ?line Command = lists:concat([lib:progname(), + " -detached -sname cp1 ", + "-config ", Config, + " -env ERL_CRASH_DUMP erl_crash_dump.cp1"]), + io:format("Command: ~s", [Command]), + ?line open_port({spawn, Command}, [stream]), + io:format("started~n"), + ?line ?t:sleep(12000), + io:format("waited12~n"), + ?line Host = from($@, atom_to_list(node())), + ?line Cp1 = list_to_atom("cp1@"++Host), + ?line wait_for_node(Cp1), + io:format("waitednode~n"), + %% Check time since last call + ?line {TT, T} = erlang:statistics(wall_clock), + io:format("~p~n", [{t2, {TT, T}}]), + ?line stop_node(cp1), + if + TT-T1 < 15000 -> ?line ?t:fail({too_short_time, TT-T1}); + true -> ok + end, + ?line ?t:timetrap_cancel(Dog), + ok. + +wait_for_node(Node) -> + case rpc:call(Node, init, get_status, []) of + {started,_} -> ok; + {badrpc, R} -> ?line ?t:fail({rpc_failed, R}); + _Other -> wait_for_node(Node) + end. + + +stop_node(Node) -> + M = list_to_atom(lists:concat([Node, + [$@], + from($@,atom_to_list(node()))])), + rpc:cast(M, erlang, halt, []). diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/kernel.cover erlang-13.b.3-dfsg/lib/kernel/test/kernel.cover --- erlang-13.b.1-dfsg/lib/kernel/test/kernel.cover 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/kernel.cover 2009-09-18 15:08:41.000000000 +0100 @@ -0,0 +1,4 @@ +%% -*- erlang -*- +{exclude,all}. +{include,[gen_udp,inet6_udp,inet_res,inet_dns]}. + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/kernel.dynspec erlang-13.b.3-dfsg/lib/kernel/test/kernel.dynspec --- erlang-13.b.1-dfsg/lib/kernel/test/kernel.dynspec 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/kernel.dynspec 2007-11-26 19:01:42.000000000 +0000 @@ -0,0 +1,57 @@ +%% -*- erlang -*- +%% You can test this file using this command. +%% file:script("kernel.dynspec", [{'Os',"Unix"}]). + +case Os of + "VxWorks" -> + FsCantHandle = "VxWorks filesystem can't handle this", + FsOverload = "VxWorks filesystem would overload", + CantHandle = "VxWorks can't handle this", + SlaveMisadaption = "Test not adopted to slaves on different machine", + [{skip,{application_SUITE, + "VxWorks: requires manual testing "++ + "(requires multiple nodes (OTP-1774))"}}, + {skip,{bif_SUITE, spawn_link_race1, "Known bug."}}, + {skip,{erl_distribution_SUITE, "VxWorks: More vx nodes needed"}}, + {skip,{file_SUITE,read_write_file,FsCantHandle}}, + {skip,{file_SUITE,cur_dir_0,FsCantHandle}}, + {skip,{file_SUITE,open1,FsCantHandle}}, + {skip,{file_SUITE,file_info_times,FsCantHandle}}, + {skip,{file_SUITE,file_write_file_info,FsCantHandle}}, + {skip,{file_SUITE,truncate,FsCantHandle}}, + {skip,{file_SUITE,rename,FsCantHandle}}, + {skip,{file_SUITE,e_delete,FsCantHandle}}, + {skip,{file_SUITE,e_rename,FsCantHandle}}, + {skip,{file_SUITE,delayed_write,FsCantHandle}}, + {skip,{file_SUITE,read_ahead,FsCantHandle}}, + {skip,{file_SUITE,segment_write,FsOverload}}, + {skip,{file_SUITE,segment_read,FsOverload}}, + {skip,{file_SUITE,compress_errors,FsCantHandle}}, + {skip,{global_SUITE, + "To heavy on slavenodes for VxWorks (and more)."}}, + {skip,{global_group_SUITE, "To heavy on slavenodes for VxWorks."}}, + {skip,{heart_SUITE, "Not for VxWorks heart, it's special"}}, + {skip,{init_SUITE,restart,"Uses peer nodes"}}, + {skip,{kernel_config_SUITE, "VxWorks does not support slave nodes"}}, + {skip,{os_SUITE,space_in_cwd,CantHandle}}, + {skip,{os_SUITE,space_in_name,CantHandle}}, + {skip,{os_SUITE,quoting,CantHandle}}, + {skip,{prim_file_SUITE,open1,FsCantHandle}}, + {skip,{prim_file_SUITE,compress_errors,FsCantHandle}}, + {skip,{seq_trace_SUITE,distributed_recv,SlaveMisadaption}}, + {skip,{seq_trace_SUITE,distributed_exit,SlaveMisadaption}}]; + _ -> + [] +end ++ +try gen_sctp:open() of + {ok,Socket} -> + gen_sctp:close(Socket), + []; + _ -> + [] +catch + error:badarg -> + [{skip,{gen_sctp_SUITE,"SCTP not supported on this machine"}}]; + _:_ -> + [] +end. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/kernel_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/kernel_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/kernel_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/kernel_SUITE.erl 2009-11-20 13:30:28.000000000 +0000 @@ -0,0 +1,61 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%%---------------------------------------------------------------- +%%% Kernel application test suite. +%%%----------------------------------------------------------------- +-module(kernel_SUITE). +-include("test_server.hrl"). + + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +% Test server specific exports +-export([all/1]). +-export([init_per_testcase/2, fin_per_testcase/2]). + +% Test cases must be exported. +-export([app_test/1]). + +%% +%% all/1 +%% +all(doc) -> + []; +all(suite) -> + [app_test]. + +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +% +% Test cases starts here. +% +app_test(doc) -> + ["Tests the applications consistency."]; +app_test(suite) -> + []; +app_test(Config) when list(Config) -> + ?line ok=?t:app_test(kernel), + ok. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/loose_node.erl erlang-13.b.3-dfsg/lib/kernel/test/loose_node.erl --- erlang-13.b.1-dfsg/lib/kernel/test/loose_node.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/loose_node.erl 2009-11-20 13:32:01.000000000 +0000 @@ -0,0 +1,193 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : loose_node.erl +%%% Author : Rickard Green +%%% Description : Creation of nodes which are not supervised by +%%% the test_server. Currently needed by init_SUITE +%%% and heart_SUITE (until the test_server can +%%% handle node restart). +%%% +%%% Created : 22 Sep 2004 by Rickard Green +%%%------------------------------------------------------------------- +-module(loose_node). +-author('rickard.s.green@ericsson.com'). + +%% +%% Exports +%% +-export([start/3, start/2, stop/1]). + +%% +%% Internal exports +%% +-export([loose_node_started/1]). + +%% +%% Exported functions for internal use. +%% + +%% +%% Defines +%% +-define(L2A, list_to_atom). +-define(A2L, atom_to_list). +-define(I2L, integer_to_list). + +%% +%% Exported functions. +%% + +stop(Node) when atom(Node) -> + rpc:cast(Node, erlang, halt, []), + io:format("Stopped loose node ~p~n", [Node]), + ok. + +start(Name, Args) -> + start(Name, Args, -1). + +start(Name, Args, TimeOut) when atom(Name) -> + start(atom_to_list(Name), Args, TimeOut); +start(Name, Args, TimeOut) when list(Name), list(Args), integer(TimeOut) -> + Parent = self(), + Ref = make_ref(), + Starter + = fun () -> + Erl = case init:get_argument(progname) of + {ok,[[Prog]]} -> + Prog; + _ -> + "erl" + end, + RegName = until_success(fun () -> + {A, B, C} = now(), + Reg = + ?L2A(?A2L(?MODULE) + ++ "-" ++ ?I2L(A) + ++ "-" ++ ?I2L(B) + ++ "-" ++ ?I2L(C)), + true = register(Reg, self()), + Reg + end), + NameCmd = case net_kernel:longnames() of + true -> " -name " ++ Name; + false -> " -sname " ++ Name + end, + Cookie = " -setcookie " ++ atom_to_list(auth:get_cookie()), + Pa = " -pa " ++ filename:dirname(code:which(?MODULE)), + ThisNode = node(), + NodeStarted + = " -run " + ++ atom_to_list(?MODULE) + ++ " loose_node_started " + ++ atom_to_list(RegName) + ++ " " + ++ atom_to_list(ThisNode) + ++ " " + ++ integer_to_list(TimeOut), + CrashDump = + " -env ERL_CRASH_DUMP" + ++ " erl_crash.dump.loose_node." + ++ Name, + Cmd = + Erl + ++ " -detached" + ++ NameCmd + ++ Cookie + ++ Pa + ++ NodeStarted + ++ CrashDump + ++ " " + ++ Args, + io:format("Trying to start loose node...~n" + " --> ~p~n", [Cmd]), + Res = case open_port({spawn, Cmd}, []) of + P when port(P) -> + receive + {loose_node_started, + Node, + {RegName, ThisNode}} -> + io:format("Loose node ~p started.~n", + [Node]), + {ok, Node} + after 10000 -> + io:format("Start of loose node ~p " + "timed out.", [Name]), + {error, timeout} + end; + _ -> + io:format("Start of loose node ~p failed.", + [Name]), + {error, open_port_failed} + end, + Parent ! {Ref, Res} + end, + spawn_opt(Starter, [link, {priority, max}]), + receive + {Ref, Result} -> + Result + end. + + +%% +%% Exported functions for internal use. +%% + +loose_node_started([Name, Node, TimeOutSecs]) when list(Name), + list(Node), + list(TimeOutSecs) -> + spawn_opt(fun () -> + process_flag(trap_exit, true), + Proc = {list_to_atom(Name), list_to_atom(Node)}, + Timeout = case catch list_to_integer(TimeOutSecs) of + I when integer(I), I >= 0 -> I*1000; + _ -> infinity + end, + wait_until(fun () -> is_alive() end), + Proc ! {loose_node_started, node(), Proc}, + receive + after Timeout -> + timeout + end, + erlang:halt("Loose node timeout") + end, + [{priority, max}]), + ok. + +%% +%% Internal functions. +%% + +until_success(Fun) -> + case catch Fun() of + {'EXIT', _} -> until_success(Fun); + Res -> Res + end. + +wait_until(Fun) -> + case Fun() of + true -> true; + _ -> + receive + after 100 -> + wait_until(Fun) + end + end. + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/Makefile erlang-13.b.3-dfsg/lib/kernel/test/Makefile --- erlang-13.b.1-dfsg/lib/kernel/test/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/Makefile 2009-09-18 15:07:29.000000000 +0100 @@ -0,0 +1,149 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + +MODULES= \ + rpc_SUITE \ + pdict_SUITE \ + bif_SUITE \ + kernel_SUITE \ + application_SUITE \ + myApp \ + topApp \ + topApp2 \ + topApp3 \ + ch \ + ch_sup \ + appinc1 \ + appinc1x \ + appinc2 \ + appinc2top \ + appinc2A \ + appinc2B \ + code_SUITE \ + code_b_test \ + disk_log_SUITE \ + erl_boot_server_SUITE \ + erl_distribution_SUITE \ + erl_distribution_wb_SUITE \ + erl_prim_loader_SUITE \ + error_logger_SUITE \ + error_logger_warn_SUITE \ + file_SUITE \ + prim_file_SUITE \ + ram_file_SUITE \ + gen_tcp_api_SUITE \ + gen_tcp_echo_SUITE \ + gen_tcp_misc_SUITE \ + gen_udp_SUITE \ + gen_sctp_SUITE \ + global_SUITE \ + global_group_SUITE \ + heart_SUITE \ + inet_SUITE \ + inet_sockopt_SUITE \ + inet_res_SUITE \ + interactive_shell_SUITE \ + init_SUITE \ + kernel_config_SUITE \ + os_SUITE \ + pg2_SUITE \ + seq_trace_SUITE \ + wrap_log_reader_SUITE \ + cleanup \ + zlib_SUITE \ + loose_node + +APP_FILES = \ + appinc.app \ + appinc1.app \ + appinc1x.app \ + appinc2.app \ + appinc2top.app \ + appinc2A.app \ + appinc2B.app \ + myApp.app \ + topApp.app \ + topApp2.app \ + topApp3.app + +ERL_FILES= $(MODULES:%=%.erl) code_a_test.erl + +TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) +INSTALL_PROGS= $(TARGET_FILES) + +EMAKEFILE=Emakefile +COVERFILE=kernel.cover + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/kernel_test + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + +ERL_MAKE_FLAGS += +ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/test_server/include + +EBIN = . + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- + +make_emakefile: + $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) '*_SUITE_make' \ + >> $(EMAKEFILE) + $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES) \ + >> $(EMAKEFILE) + +tests debug opt: make_emakefile + erl $(ERL_MAKE_FLAGS) -make + +clean: + rm -f $(EMAKEFILE) + rm -f $(TARGET_FILES) $(GEN_FILES) + rm -f core + +docs: + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + +release_spec: opt + +release_tests_spec: make_emakefile + $(INSTALL_DIR) $(RELSYSDIR) + $(INSTALL_DATA) $(ERL_FILES) $(RELSYSDIR) + $(INSTALL_DATA) $(APP_FILES) $(RELSYSDIR) + $(INSTALL_DATA) kernel.dynspec $(EMAKEFILE)\ + $(COVERFILE) $(RELSYSDIR) + chmod -f -R u+w $(RELSYSDIR) + @tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -) + +release_docs_spec: diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/myApp.app erlang-13.b.3-dfsg/lib/kernel/test/myApp.app --- erlang-13.b.1-dfsg/lib/kernel/test/myApp.app 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/myApp.app 1998-05-07 23:01:27.000000000 +0100 @@ -0,0 +1,7 @@ + {application, myApp, + [{description, "Test of start phase"}, + {id, "CXC 138 38"}, + {applications, [kernel]}, + {included_applications, []}, + {start_phases, [{init, [initArgs]}, {go, [goArgs]}]}, + {mod, {myApp, {myApp, 1, 3}} }]}. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/myApp.erl erlang-13.b.3-dfsg/lib/kernel/test/myApp.erl --- erlang-13.b.1-dfsg/lib/kernel/test/myApp.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/myApp.erl 2009-11-20 13:30:40.000000000 +0000 @@ -0,0 +1,48 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(myApp). +-behaviour(supervisor). + +%% External exports +-export([start/2, stop/1, start_phase/3]). + +%% Internal exports +-export([init/1]). + +start(_Type, {_AppN, Low, High}) -> + Name = list_to_atom(lists:concat([ch_sup, Low])), + {ok,P} = supervisor:start_link({local, Name}, ch_sup, + lists:seq(Low, High)), + {ok, P, []}. + +stop(_) -> ok. + +init(Nos) -> + SupFlags = {one_for_one, 12, 60}, + Chs = lists:map(fun(No) -> + {list_to_atom(lists:concat([ch,No])), + {ch, start_link, [{ch, No}]}, + permanent, 2000, worker, [ch]} + end, + Nos), + {ok, {SupFlags, Chs}}. + +start_phase(Phase, _Type, _Args) -> + (catch global:send(start_phase,{sp, Phase})), + ok. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/Makefile.src erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/Makefile.src 1998-08-03 11:04:13.000000000 +0100 @@ -0,0 +1,14 @@ +CC = @CC@ +LD = @LD@ +CFLAGS = @CFLAGS@ -I@erl_include@ @DEFS@ +CROSSLDFLAGS = @CROSSLDFLAGS@ + +PROGS = my_echo@exe@ + +all: $(PROGS) + +my_echo@exe@: my_echo@obj@ + $(LD) $(CROSSLDFLAGS) -o my_echo my_echo@obj@ @LIBS@ + +my_echo@obj@: my_echo.c + $(CC) -c -o my_echo@obj@ $(CFLAGS) my_echo.c diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/my_echo.c erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/my_echo.c --- erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/my_echo.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/my_echo.c 1998-08-03 11:04:14.000000000 +0100 @@ -0,0 +1,19 @@ +#include + +int +main(int argc, char** argv) +{ + char* sep = ""; + + /* + * Echo all arguments separated with '::', so that we can check that + * quotes are interpreted correctly. + */ + + while (argc-- > 1) { + printf("%s%s", sep, argv++[1]); + sep = "::"; + } + putchar('\n'); + return 0; +} Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/hello.exe and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/hello.exe differ diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/my_adb.bat erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/my_adb.bat --- erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/my_adb.bat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/my_adb.bat 1997-08-19 12:54:12.000000000 +0100 @@ -0,0 +1,2 @@ +@echo off +echo A real batch file. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/my_ar.exe erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/my_ar.exe --- erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/my_ar.exe 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/my_ar.exe 1997-08-19 12:54:14.000000000 +0100 @@ -0,0 +1 @@ +Not really an EXE file. Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/my_ascii.com and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/abin/my_ascii.com differ diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_batch.bat erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_batch.bat --- erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_batch.bat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_batch.bat 1997-08-19 12:54:15.000000000 +0100 @@ -0,0 +1,2 @@ +@echo off +echo A real batch file. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_command.com erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_command.com --- erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_command.com 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_command.com 1997-08-19 12:54:16.000000000 +0100 @@ -0,0 +1 @@ +Not a real COM file. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_program.exe erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_program.exe --- erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_program.exe 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE_data/win32/current/my_program.exe 1997-08-19 12:54:17.000000000 +0100 @@ -0,0 +1 @@ +Not a real EXE file. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/os_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/os_SUITE.erl 2009-11-20 13:30:10.000000000 +0000 @@ -0,0 +1,212 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(os_SUITE). + +-export([all/1]). +-export([space_in_cwd/1, quoting/1, space_in_name/1, bad_command/1, + find_executable/1, unix_comment_in_command/1]). + +-include("test_server.hrl"). + +all(suite) -> + [space_in_cwd, quoting, space_in_name, bad_command, find_executable, + unix_comment_in_command]. + +space_in_cwd(doc) -> + "Test that executing a command in a current working directory " + "with space in its name works."; +space_in_cwd(suite) -> []; +space_in_cwd(Config) when list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line Dirname = filename:join(PrivDir, "cwd with space"), + ?line ok = file:make_dir(Dirname), + ?line ok = file:set_cwd(Dirname), + + %% Using `more' gives the almost the same result on both Unix and Windows. + + Cmd = case os:type() of + {win32, _} -> + "more"; + {unix, _} -> + "more ok; % Unix. + "\r\n" -> ok; % Windows. + Other -> + ?line test_server:fail({unexpected, Other}) + end, + + ?t:sleep(5), + ?line [] = receive_all(), + ok. + +quoting(doc) -> "Test that various ways of quoting arguments work."; +quoting(suite) -> []; +quoting(Config) when list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line Echo = filename:join(DataDir, "my_echo"), + + ?line comp("one", os:cmd(Echo ++ " one")), + ?line comp("one::two", os:cmd(Echo ++ " one two")), + ?line comp("one two", os:cmd(Echo ++ " \"one two\"")), + ?line comp("x::one two::y", os:cmd(Echo ++ " x \"one two\" y")), + ?line comp("x::one two", os:cmd(Echo ++ " x \"one two\"")), + ?line comp("one two::y", os:cmd(Echo ++ " \"one two\" y")), + ?line comp("x::::y", os:cmd(Echo ++ " x \"\" y")), + ?t:sleep(5), + ?line [] = receive_all(), + ok. + +space_in_name(doc) -> + "Test that program with a space in its name can be executed."; +space_in_name(suite) -> []; +space_in_name(Config) when list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line DataDir = ?config(data_dir, Config), + ?line Spacedir = filename:join(PrivDir, "program files"), + Ext = case os:type() of + {win32,_} -> ".exe"; + _ -> "" + end, + ?line OrigEcho = filename:join(DataDir, "my_echo" ++ Ext), + ?line Echo0 = filename:join(Spacedir, "my_echo" ++ Ext), + + %% Copy the `my_echo' program to a directory whose name contains a space. + + ?line ok = file:make_dir(Spacedir), + ?line {ok, Bin} = file:read_file(OrigEcho), + ?line ok = file:write_file(Echo0, Bin), + ?line Echo = filename:nativename(Echo0), + ?line ok = file:change_mode(Echo, 8#777), % Make it executable on Unix. + + %% Run the echo program. + + ?line comp("", os:cmd("\"" ++ Echo ++ "\"")), + ?line comp("a::b::c", os:cmd("\"" ++ Echo ++ "\" a b c")), + ?t:sleep(5), + ?line [] = receive_all(), + ok. + +bad_command(doc) -> + "Check that a bad command doesn't crasch the server or the emulator (it used to)."; +bad_command(suite) -> []; +bad_command(Config) when list(Config) -> + ?line catch os:cmd([a|b]), + ?line catch os:cmd({bad, thing}), + + %% This should at least not crash (on Unix it typically returns + %% a message from the shell). + ?line os:cmd("xxxxx"), + + ok. + +find_executable(suite) -> []; +find_executable(doc) -> []; +find_executable(Config) when list(Config) -> + case os:type() of + {win32, _} -> + ?line DataDir = filename:join(?config(data_dir, Config), "win32"), + ?line ok = file:set_cwd(filename:join([DataDir, "current"])), + ?line Bin = filename:join(DataDir, "bin"), + ?line Abin = filename:join(DataDir, "abin"), + ?line UsrBin = filename:join([DataDir, "usr", "bin"]), + ?line {ok, Current} = file:get_cwd(), + + ?line Path = lists:concat([Bin, ";", Abin, ";", UsrBin]), + ?line io:format("Path = ~s", [Path]), + + %% Search for programs in Bin (second element in PATH). + ?line find_exe(Abin, "my_ar", ".exe", Path), + ?line find_exe(Abin, "my_ascii", ".com", Path), + ?line find_exe(Abin, "my_adb", ".bat", Path), + + %% Search for programs in Abin (second element in PATH). + ?line find_exe(Abin, "my_ar", ".exe", Path), + ?line find_exe(Abin, "my_ascii", ".com", Path), + ?line find_exe(Abin, "my_adb", ".bat", Path), + + %% Search for programs in the current working directory. + ?line find_exe(Current, "my_program", ".exe", Path), + ?line find_exe(Current, "my_command", ".com", Path), + ?line find_exe(Current, "my_batch", ".bat", Path), + ok; + {unix, _} -> + ok; + vxworks -> + ok + end. + +find_exe(Where, Name, Ext, Path) -> + Expected = filename:join(Where, Name++Ext), + case os:find_executable(Name, Path) of + Expected -> + ok; + Name when list(Name) -> + case filename:absname(Name) of + Expected -> + ok; + Other -> + io:format("Expected ~p; got (converted to absolute) ~p", + [Expected, Other]), + test_server:fail() + end; + Other -> + io:format("Expected ~p; got ~p", [Expected, Other]), + test_server:fail() + end. + +unix_comment_in_command(doc) -> + "OTP-1805: Test that os:cmd(\"ls #\") works correctly (used to hang)."; +unix_comment_in_command(suite) -> []; +unix_comment_in_command(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(20)), + ?line Priv = ?config(priv_dir, Config), + ?line ok = file:set_cwd(Priv), + ?line _ = os:cmd("ls #"), % Any result is ok. + ?t:sleep(5), + ?line [] = receive_all(), + ?line test_server:timetrap_cancel(Dog), + ok. + + +comp(Expected, Got) -> + case strip_nl(Got) of + Expected -> + ok; + Other -> + ok = io:format("Expected: ~s\n", [Expected]), + ok = io:format("Got: ~s\n", [Other]), + test_server:fail() + end. + +%% Like lib:nonl/1, but strips \r as well as \n. + +strip_nl([$\r, $\n]) -> []; +strip_nl([$\n]) -> []; +strip_nl([H|T]) -> [H|strip_nl(T)]; +strip_nl([]) -> []. + +receive_all() -> + receive + X -> [X|receive_all()] + after 0 -> [] + end. + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/pdict_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/pdict_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/pdict_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/pdict_SUITE.erl 2009-11-20 13:30:52.000000000 +0000 @@ -0,0 +1,323 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(pdict_SUITE). +%% NB: The ?line macro cannot be used when testing the dictionary. + + +-include("test_server.hrl"). + +-define(M(A,B),m(A,B,?MODULE,?LINE)). +-ifdef(DEBUG). +-define(DEBUGF(A,B), io:format(A,B)). +-else. +-define(DEBUGF(A,B), noop). +-endif. + +-export([all/1, + simple/1, complicated/1, heavy/1, info/1]). +-export([init_per_testcase/2, fin_per_testcase/2]). +-export([other_process/2]). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(test_server:minutes(10)), + [{watchdog, Dog} | Config]. +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + [simple, complicated, heavy, info]. + +simple(doc) -> + ["Tests simple functionality in process dictionary."]; +simple(suite) -> + []; +simple(Config) when list(Config) -> + XX = get(), + erase(), + L = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p, + q,r,s,t,u,v,x,y,z,'A','B','C','D'], + ins_list_0(L), + ins_list_1(L), + L2 = lists:keysort(1, lists:map(fun(X) -> + {X, atom_to_list(X)} + end, + L)), + ?DEBUGF("~p~n",[L2]), + ?M(L2,lists:keysort(1, get())), + ins_list_2(L), + L3 = lists:keysort(1, lists:map(fun(X) -> + {hd(atom_to_list(X)) - $a, + atom_to_list(X)} + end, + L) ++ L2), + ?DEBUGF("~p~n",[L3]), + ?M(L3, lists:keysort(1, get())), + L4 = lists:map(fun(X) -> + lists:sort(get_keys(atom_to_list(X))) + end, + L), + ?DEBUGF("~p~n",[L4]), + ?M(L4,lists:map(fun(X) -> + lists:sort([X, hd(atom_to_list(X)) - $a]) + end, + L)), + erase(), + ?M([],get()), + [put(Key, Value) || {Key,Value} <- XX], + ok. + +complicated(Config) when is_list(Config) -> + Previous = get(), + Previous = erase(), + N = case ?t:is_debug() of + false -> 500000; + true -> 5000 + end, + comp_1(N), + comp_2(N), + N = comp_3(lists:sort(get()), 1), + comp_4(get()), + [] = get(), + [put(Key, Value) || {Key,Value} <- Previous], + ok. + +comp_1(0) -> ok; +comp_1(N) -> + undefined = put({key,N}, {value,N}), + comp_1(N-1). + +comp_2(0) -> ok; +comp_2(N) -> + {value,N} = put({key,N}, {value,N*N}), + comp_2(N-1). + +comp_3([{{key,K},{value,V}}], K) when V =:= K*K -> + K; +comp_3([{{key,K},{value,V}}|T], K) when V =:= K*K -> + comp_3(T, K+1). + +comp_4([{{key,_}=K,{value,_}=Val}|T]) -> + Val = erase(K), + comp_4(T); +comp_4([]) -> ok. + +heavy(doc) -> + ["Tests heavy usage of the process dictionary"]; +heavy(suite) -> + []; +heavy(Config) when is_list(Config) -> + XX = get(), + erase(), + time(50), + ?M([],get()), + time(500), + ?M([],get()), + time(5000), + ?M([],get()), + case {os:type(),?t:is_debug()} of + {vxworks,_} -> ok; + {_,true} -> ok; + _ -> + time(50000), + ?M([], get()) + end, + [put(Key, Value) || {Key,Value} <- XX], + ok. + +info(doc) -> + ["Tests process_info(Pid, dictionary)"]; +info(suite) -> + []; +info(Config) when list(Config) -> + L = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p, + q,r,s,t,u,v,x,y,z,'A','B','C','D'], + process_flag(trap_exit,true), + Pid = spawn_link(?MODULE, other_process, [L,self()]), + Dict = receive + {Pid, D} -> + D + end, + ?M({dictionary, Dict}, process_info(Pid, dictionary)), + Pid ! bye, + receive + {'EXIT', Pid, _} -> + ok + end, + ok. + +other_process(List,From) -> + erase(), + ins_list_1(List), + From ! {self(), get()}, + receive + bye -> + ok + end. + +ins_list_2([]) -> + done; +ins_list_2([H|T]) -> + X = {hd(atom_to_list(H)) - $a, atom_to_list(H)}, + _Y = put(element(1,X), element(2,X)), + ?DEBUGF("Inserting ~w: ~w~n",[X,_Y]), + ins_list_2(T). + +ins_list_1([]) -> + done; +ins_list_1([H|T]) -> + X = {H, atom_to_list(H)}, + _Y = put(element(1,X), element(2,X)), + ?DEBUGF("Inserting ~w: ~w~n",[X,_Y]), + ins_list_1(T). + +ins_list_0([]) -> + done; +ins_list_0([H|T]) -> + X = {H, H}, + _Y = put(element(1,X), element(2,X)), + ?DEBUGF("Inserting ~w: ~w~n",[X,_Y]), + ins_list_0(T). + +time(N) -> + ?DEBUGF("~p~n",[erlang:process_info(self())]), + TT1 = erlang:now(), + T1 = insert_testloop(N,N,0), + TT2 = erlang:now(), + T2 = lookup_testloop(N,N,0), + TT3 = erlang:now(), + T5 = delete_testloop(N,N,0), + TT6 = erlang:now(), + io:format("~p inserts took ~.2f(~.2f) seconds~n", + [N, nowdiff3(TT1,TT2), T1 / 100]), + io:format("~p lookups took ~.2f(~.2f) seconds~n", + [N, nowdiff3(TT2,TT3), T2 / 100]), + io:format("~p deletes took ~.2f(~.2f) seconds~n", + [N, nowdiff3(TT3,TT6), T5 / 100]), + io:format("Total time for ~p elements is ~.2f(~.2f) seconds~n", + [N, nowdiff3(TT1,TT6), (T1+T2+T5) / 100]), + ok. + +key_to_object(Key) -> + {Key, Key,[Key, Key, {Key, banan}]}. + +time_call(Fun,Acc) -> + T1 = erlang:now(), + Ret = Fun(), + T2 = erlang:now(), + {nowdiff2(T1,T2)+Acc,Ret}. + +delete_testloop(0, _X, Acc) -> + ?DEBUGF("all ~p deleted~n",[_X]), + Acc; + +delete_testloop(N, X, Acc) -> + Key = gen_key(N), + Obj = key_to_object(Key), + case get(Key) of + Obj -> + ok; + Y -> + io:format("Error - Object ~p does not exist when we are " + "gonna delete!(N=~p, result=~p)~n",[Obj,N,Y]), + exit({inconsistent_1, delete_testloop, Obj, N, Y}) + end, + + {T, Obj2} = time_call(fun() -> erase(Key) end, Acc), + ?M(Obj,Obj2), + case {(X-N) rem 10000,(X-N)} of + {_,0} -> + ok; + {0,_} -> + ?DEBUGF("~p~n",[X-N]); + _ -> + ok + end, + case get(Key) of + undefined -> + ok; + Else -> + io:format("Error - Object ~p does still exist after " + "delete!(N=~p, result=~p)~n",[Obj,N,Else]), + exit({inconsistent_2, delete_testloop, Obj, N, Else}) + end, + delete_testloop(N-1,X,T). + +lookup_testloop(0, X, Acc) -> + io:format("all ~p looked up~n",[X]), + Acc; +lookup_testloop(N, X, Acc) -> + Key = gen_key(N), + D = key_to_object(Key), + {T, D2} = time_call(fun() -> get(Key) end, Acc), + ?M(D,D2), + case {(X-N) rem 10000,(X-N)} of + {_,0} -> + ok; + {0,_} -> + ?DEBUGF("~p~n",[X-N]); + _ -> + ok + end, + lookup_testloop(N-1,X,T). + +insert_testloop(0,X,Acc) -> + io:format("all ~p inserted~n",[X]), + Acc; +insert_testloop(N,X,Acc) -> + Key = gen_key(N), + D = key_to_object(Key), + {T,_} = time_call(fun() -> put(Key,D) end, Acc), + case {(X-N) rem 10000,(X-N)} of + {_,0} -> + ok; + {0,_} -> + ?DEBUGF("~p~n",[X-N]); + _ -> + ok + end, + insert_testloop(N-1,X,T). + + +gen_key(0,A)-> + A; +gen_key(N,A) -> + X = ((N-1) rem 26) + $a, + gen_key((N-1) div 26, [X|A]). +gen_key(N) -> + gen_key(N+1,[]). + +nowtonumber({Mega, Secs, Milli}) -> + Milli div 10000 + Secs * 100 + Mega * 100000000. + +nowdiff2(T1,T2) -> + nowtonumber(T2) - nowtonumber(T1). +nowdiff3(T1,T2) -> + (nowtonumber(T2) - nowtonumber(T1)) / 100. + +m(A,B,Module,Line) -> + case A == B of + true -> + ok; + _ -> + io:format("~p does not match ~p in module ~p, line ~p, exit.~n", + [A,B,Module,Line]), + exit({no_match,{A,B},Module,Line}) + end. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/pg2_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/pg2_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/pg2_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/pg2_SUITE.erl 2009-11-20 13:32:38.000000000 +0000 @@ -0,0 +1,718 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%%---------------------------------------------------------------- +%% Purpose:Test Suite for the 'pg2' module. +%%----------------------------------------------------------------- +-module(pg2_SUITE). + +-include("test_server.hrl"). +-define(datadir, ?config(data_dir, Config)). +-define(privdir, ?config(priv_dir, Config)). + +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([tickets/1, + otp_7277/1, otp_8259/1, + compat/1, basic/1]). + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +-define(TESTCASE, testcase_name). +-define(testcase, ?config(?TESTCASE, Config)). + +%% Internal export. +-export([mk_part_node/3, part1/5, p_init/3, start_proc/1, sane/0]). + +init_per_testcase(Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{?TESTCASE, Case}, {watchdog, Dog} | Config]. + +fin_per_testcase(_Case, _Config) -> + Dog = ?config(watchdog, _Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + [tickets]. + +tickets(suite) -> + [otp_7277, otp_8259, compat, basic]. + +otp_7277(doc) -> + "OTP-7277. Bugfix leave()."; +otp_7277(suite) -> []; +otp_7277(Config) when is_list(Config) -> + ?line ok = pg2:create(a), + ?line ok = pg2:create(b), + P = spawn(forever()), + ?line ok = pg2:join(a, P), + ?line ok = pg2:leave(b, P), + ?line true = exit(P, kill), + case {pg2:get_members(a), pg2:get_local_members(a)} of + {[], []} -> + ok; + _ -> + timer:sleep(100), + ?line [] = pg2:get_members(a), + ?line [] = pg2:get_local_members(a) + end, + ?line _ = pg2:delete(a), + ?line _ = pg2:delete(b), + ok. + +-define(UNTIL(Seq), loop_until_true(fun() -> Seq end, Config)). +-define(UNTIL_LOOP, 300). + +otp_8259(suite) -> []; +otp_8259(doc) -> + ["OTP-8259. Member was not removed after being killed."]; +otp_8259(Config) when is_list(Config) -> + Timeout = 15, + ?line Dog = test_server:timetrap({seconds,Timeout}), + + ?line [A, B, C] = start_nodes([a, b, c], peer, Config), + + ?line wait_for_ready_net(Config), + + G = pg2_otp_8259, + Name = otp_8259_a_global_name, + + % start different processes in both partitions + ?line {Pid, yes} = rpc:call(A, ?MODULE, start_proc, [Name]), + + ?line ok = pg2:create(G), + ?line ok = pg2:join(G, Pid), + + % make b and c connected, partitioned from node() and a + ?line rpc_cast(B, ?MODULE, part1, [Config, node(), A, C, Name]), + ?line ?UNTIL(is_ready_partition(Config)), + + % Connect to the other partition. + % The resolver on node b will be called. + ?line pong = net_adm:ping(B), + timer:sleep(100), + ?line pong = net_adm:ping(C), + ?line _ = global:sync(), + ?line [A, B, C] = lists:sort(nodes()), + + %% Pid has been killed by the resolver. + %% Pid has been removed from pg2 on all nodes, in particular node B. + ?line ?UNTIL([] =:= rpc:call(B, pg2, get_members, [G])), + ?line ?UNTIL([] =:= pg2:get_members(G)), + ?line ?UNTIL([] =:= rpc:call(A, pg2, get_members, [G])), + ?line ?UNTIL([] =:= rpc:call(C, pg2, get_members, [G])), + + ?line ok = pg2:delete(G), + ?line stop_nodes([A,B,C]), + ?line test_server:timetrap_cancel(Dog), + ok. + +part1(Config, Main, A, C, Name) -> + case catch begin + make_partition(Config, [Main, A], [node(), C]), + ?line {_Pid, yes} = start_proc(Name) + end of + {_, yes} -> ok + end. + +start_proc(Name) -> + Pid = spawn(?MODULE, p_init, [self(), Name, node()]), + receive + {Pid, Res} -> {Pid, Res} + end. + +p_init(Parent, Name, TestServer) -> + Resolve = fun(_Name, Pid1, Pid2) -> + %% The pid on node a will be chosen. + [{_,Min}, {_,Max}] = + lists:sort([{node(Pid1),Pid1}, {node(Pid2),Pid2}]), + %% b is connected to test_server. + %% exit(Min, kill), % would ping a + rpc:cast(TestServer, erlang, exit, [Min, kill]), + Max + end, + X = global:register_name(Name, self(), Resolve), + Parent ! {self(),X}, + loop(). + +loop() -> + receive + die -> + exit(normal) + end. + +compat(suite) -> []; +compat(doc) -> + ["OTP-8259. Check that 'exchange' and 'del_member' work."]; +compat(Config) when is_list(Config) -> + case ?t:is_release_available("r13b") of + true -> + Timeout = 15, + ?line Dog = test_server:timetrap({seconds,Timeout}), + Pid = spawn(forever()), + G = a, + ?line ok = pg2:create(G), + ?line ok = pg2:join(G, Pid), + ?line ok = pg2:join(G, Pid), + ?line {ok, A} = start_node_rel(r13, r13b, slave), + ?line pong = net_adm:ping(A), + ?line wait_for_ready_net(Config), + ?line {ok, _} = rpc:call(A, pg2, start, []), + ?line ?UNTIL([Pid,Pid] =:= rpc:call(A, pg2, get_members, [a])), + ?line true = exit(Pid, kill), + ?line ?UNTIL([] =:= pg2:get_members(a)), + ?line ?UNTIL([] =:= rpc:call(A, pg2, get_members, [a])), + ?t:stop_node(A), + ?line test_server:timetrap_cancel(Dog); + false -> + {skipped, "No support for old node"} + end. + +basic(suite) -> []; +basic(doc) -> + ["OTP-8259. Some basic tests."]; +basic(Config) when is_list(Config) -> + _ = [pg2:delete(G) || G <- pg2:which_groups()], + ?line _ = [do(Cs, T, Config) || {T,Cs} <- ts()], + ok. + +ts() -> + [ + {t1, + [{create,[a],ignore}, + {which_groups,[],[a]}, + {get_closest_pid,[a],{error, {no_process, a}}}, + {delete,[a],ignore}]}, + {t2, + [{create,[a],ignore}, + {join,[a,self()],ok}, + {get_closest_pid,[a],self()}, + {delete,[a],ignore}]}, + {t3, + [{create,[a],ignore}, + {new,p1}, + {leave,[a,p1],ok}, + {join,[b,p1],{error,{no_such_group,b}}}, + {leave,[b,p1],{error,{no_such_group,b}}}, + {get_members,[c],{error,{no_such_group,c}}}, + {get_local_members,[c],{error,{no_such_group,c}}}, + {join,[a,p1],ok}, + {leave,[a,p1],ok}, + {join,[a,p1],ok}, + {join,[a,p1],ok}, + {create,[a],ignore}, + {get_closest_pid,[a],p1}, + {leave,[a,p1],ok}, + {get_closest_pid,[a],p1}, + {leave,[a,p1],ok}, + {get_closest_pid,[a],{error,{no_process, a}}}, + {kill,p1}, + {delete,[a],ignore}]}, + {t4, + [{create,[a],ignore}, + {new,p1}, + {join,[a,p1],ok}, + {get_members,[a],[p1]}, + {get_local_members,[a],[p1]}, + {kill,p1}, + {get_members,[a],[]}, + {get_local_members,[a],[]}, + {delete,[a],ignore}]}, + {t5, + [{create,[a],ignore}, + {nodeup,n1}, + {create,[a],ignore}, + {join,[a,self()],ok}, + {new,n1,p1}, + {n1,{create,[b],ignore}}, + {join,[a,p1],ok}, + {join,[b,p1],ok}, + {n1,{which_groups,[],[a,b]}}, + {n1,{join,[a,p1],ok}}, + {n1,{join,[b,p1],ok}}, + {leave,[a,self()],ok}, + {n1,{leave,[a,self()],ok}}, % noop + {n1,{leave,[b,p1],ok}}, + {leave,[b,p1],ok}, + {kill,n1,p1}, + {nodedown,n1}, + {delete,[b],ignore}, + {delete,[a],ignore}]}, + {t6, + [{create,[a],ignore}, % otp_7277 + {create,[b],ignore}, + {new,p}, + {join,[a,p],ok}, + {leave,[b,p],ok}, + {kill,p}, + {get_members,[a],[]}, + {get_local_members,[a],[]}, + {delete,[a],ignore}, + {delete,[b],ignore}]}, + {t7, % p1 joins twice, the new node gets informed about that + [{create,[a],ignore}, + {new,p1}, + {join,[a,p1],ok}, + {join,[a,p1],ok}, + {get_members,[a],[p1,p1]}, + {get_local_members,[a],[p1,p1]}, + {nodeup,n1}, + {leave,[a,p1],ok}, + {get_members,[a],[p1]}, + {get_local_members,[a],[p1]}, + {n1,{get_members,[a],[p1]}}, + {leave,[a,p1],ok}, + {get_members,[a],[]}, + {n1,{get_members,[a],[]}}, + {nodedown,n1}, + {delete,[a],ignore}, + {kill,p1}]}, + {t8, + [{create,[a],ignore}, + {new,p1}, + {join,[a,p1],ok}, + {join,[a,p1],ok}, + {delete,[a],ignore}, + {get_members,[a],{error,{no_such_group,a}}}, + {kill,p1}]} + ]. + +do(Cs, T, Config) -> + ?t:format("*** Test ~p ***~n", [T]), + {ok,T} = (catch {do(Cs, [], [], Config),T}). + +do([{nodeup,N} | Cs], Ps, Ns, Config) -> + [TestNode] = start_nodes([N], peer, Config), + pr(node(), {nodeup,N,TestNode}), + global:sync(), + timer:sleep(100), + {ok,_} = rpc:call(TestNode, pg2, start, []), + NNs = [{N,TestNode} | Ns], + sane(NNs), + do(Cs, Ps, NNs, Config); +do([{nodedown,N}=C | Cs], Ps, Ns, Config) -> + {N, TestNode} = lists:keyfind(N, 1, Ns), + stop_node(TestNode), + timer:sleep(100), + pr(node(), C), + do(Cs, Ps, lists:keydelete(N, 1, Ns), Config); +do([{new,P} | Cs], Ps, Ns, Config) -> + NPs = new_proc(node(), P, Ps, Ns), + do(Cs, NPs, Ns, Config); +do([{new,N,P} | Cs], Ps, Ns, Config) -> + NPs = new_proc(N, P, Ps, Ns), + do(Cs, NPs, Ns, Config); +do([{kill,P} | Cs], Ps, Ns, Config) -> + NPs = killit(node(), P, Ps, Ns), + do(Cs, NPs, Ns, Config); +do([{kill,N,P} | Cs], Ps, Ns, Config) -> + NPs = killit(N, P, Ps, Ns), + do(Cs, NPs, Ns, Config); +do([{Node,{_,_,_}=C} | Cs], Ps, Ns, Config) -> + doit(Node, C, Ps, Ns), + do(Cs, Ps, Ns, Config); +do([C | Cs], Ps, Ns, Config) -> + doit(node(), C, Ps, Ns), + do(Cs, Ps, Ns, Config); +do([], Ps, Ns, _Config) -> + [] = Ns, + [] = Ps, + [] = pg2:which_groups(), + [] = ets:tab2list(pg2_table), + [] = nodes(), + ok. + +doit(N, C, Ps, Ns) -> + Node = get_node(N, Ns), + pr(Node, C), + {F,As,R} = replace_pids(C, Ps), + case rpc:call(Node, erlang, apply, [pg2, F, As]) of + Result when Result =:= R orelse R =:= ignore -> + sane(Ns); + Else -> + ?t:format("~p and ~p: expected ~p, but got ~p~n", + [F, As, R, Else]), + throw({error,{F, As, R, Else}}) + end. + +new_proc(N, P, Ps, Ns) -> + Node = get_node(N, Ns), + Pid = rpc:call(Node, erlang, spawn, [forever()]), + pr(Node, {new,P,Pid}), + [{P,Pid}|Ps]. + +killit(N, P, Ps, Ns) -> + {P, Pid} = lists:keyfind(P, 1, Ps), + Node = get_node(N, Ns), + pr(Node, {kill,P,Pid}), + rpc:call(Node, erlang, exit, [Pid, kill]), + timer:sleep(100), + sane(Ns), + lists:keydelete(P, 1, Ps). + +pr(Node, C) -> + _ = [?t:format("~p: ", [Node]) || Node =/= node()], + ?t:format("do ~p~n", [C]). + +get_node(N, Ns) -> + if + N =:= node() -> + node(); + true -> + {N, TestNode} = lists:keyfind(N, 1, Ns), + TestNode + end. + +forever() -> + fun() -> receive after infinity -> ok end end. + +replace_pids(T, Ps) when is_tuple(T) -> + list_to_tuple(replace_pids(tuple_to_list(T), Ps)); +replace_pids([E | Es], Ps) -> + [replace_pids(E, Ps) | replace_pids(Es, Ps)]; +replace_pids(A, Ps) -> + case lists:keyfind(A, 1, Ps) of + {A, Pid} -> + Pid; + _ -> + A + end. + +sane(Ns) -> + Nodes = [node()] ++ [NN || {_,NN} <- Ns], + _ = [?t:format("~p, pg2_table:~n ~p~n", % debug + [N, rpc:call(N, ets, tab2list, [pg2_table])]) || + N <- Nodes], + R = [case rpc:call(Node, ?MODULE, sane, []) of + {'EXIT',Error} -> + {error, Node, Error}; + _ -> + ok + end || Node <- Nodes], + case lists:usort(R) of + [ok] -> wsane(Nodes); + _ -> throw(R) + end. + +wsane(Ns) -> + %% Same members on all nodes: + {[_],gs} = + {lists:usort([rpc:call(N, pg2, which_groups, []) || N <- Ns]),gs}, + _ = [{[_],ms,G} = {lists:usort([rpc:call(N, pg2, get_members, [G]) || + N <- Ns]),ms,G} || + G <- pg2:which_groups()], + %% The local members are a partitioning of the members: + [begin + LocalMembers = + lists:sort(lists:append( + [rpc:call(N, pg2, get_local_members, [G]) || + N <- Ns])), + {part, LocalMembers} = {part, lists:sort(pg2:get_members(G))} + end || G <- pg2:which_groups()], + %% The closest pid should run on the local node, if possible. + [[case rpc:call(N, pg2, get_closest_pid, [G]) of + Pid when is_pid(Pid), node(Pid) =:= N -> + true = + lists:member(Pid, rpc:call(N, pg2, get_local_members, [G])); +%% FIXME. Om annan nod: member, local = []. + _ -> [] = rpc:call(N, pg2, get_local_members, [G]) + end || N <- Ns] + || G <- pg2:which_groups()]. + +%% Look inside the pg2_table. +sane() -> + L = ets:tab2list(pg2_table), + Gs = lists:sort([G || {{group,G}} <- L]), + MGs = lists:usort([G || {{member,G,_},_} <- L]), + MPs = lists:usort([P || {{member,_,P},_} <- L]), + {[],mg,MGs,Gs} = {MGs -- Gs,mg,MGs,Gs}, + RPs = [P || {{ref,P},_RPid,_Ref,_C} <- L], + {MPs,rp} = {RPs,rp}, + RPs2 = [P || {{ref,_Ref},P} <- L], + {MPs,rp2} = {RPs2,rp2}, + _ = [true = C >= 1 || {{ref,_P},_RPid,_Ref,C} <- L], + LGs = lists:usort([G || {{local_member,G,_}} <- L]), + LPs = lists:usort([P || {{local_member,_,P}} <- L]), + {[],lg} = {LGs -- Gs,lg}, + {[],lp} = {LPs -- MPs,lp}, + PGs = lists:usort([G || {{pid,_,G}} <- L]), + PPs = lists:usort([P || {{pid,P,_}} <- L]), + {[],pg} = {PGs -- Gs,pg}, + {MPs,pp} = {PPs,pp}, + _ = [true = C >= 1 || {{member,_,_},C} <- L], + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Mostly copied from global_SUITE.erl +%% (Setting up a partition is quite tricky.) + +loop_until_true(Fun, Config) -> + case Fun() of + true -> + true; + _ -> + timer:sleep(?UNTIL_LOOP), + loop_until_true(Fun, Config) + end. + +start_node_rel(Name, Rel, How) -> + {Release, Compat} = case Rel of + this -> + {[this], "+R8"}; + Rel when is_atom(Rel) -> + {[{release, atom_to_list(Rel)}], ""}; + RelList -> + {RelList, ""} + end, + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line Res = test_server:start_node(Name, How, + [{args, + Compat ++ + " -kernel net_setuptime 100 " + " -pa " ++ Pa}, + {erl, Release}]), + Res. + +start_nodes(L, How, Config) -> + start_nodes2(L, How, 0, Config), + Nodes = collect_nodes(0, length(L)), + ?line ?UNTIL([] =:= Nodes -- nodes()), + %% Pinging doesn't help, we have to wait too, for nodes() to become + %% correct on the other node. + lists:foreach(fun(E) -> + net_adm:ping(E) + end, + Nodes), + verify_nodes(Nodes, Config), + Nodes. + +verify_nodes(Nodes, Config) -> + verify_nodes(Nodes, lists:sort([node() | Nodes]), Config). + +verify_nodes([], _N, _Config) -> + []; +verify_nodes([Node | Rest], N, Config) -> + ?line ?UNTIL( + case rpc:call(Node, erlang, nodes, []) of + Nodes when is_list(Nodes) -> + case N =:= lists:sort([Node | Nodes]) of + true -> + true; + false -> + lists:foreach(fun(Nd) -> + rpc:call(Nd, net_adm, ping, + [Node]) + end, + nodes()), + false + end; + _ -> + false + end + ), + verify_nodes(Rest, N, Config). + + +start_nodes2([], _How, _, _Config) -> + []; +start_nodes2([Name | Rest], How, N, Config) -> + Self = self(), + spawn(fun() -> + erlang:display({starting, Name}), + {ok, R} = start_node(Name, How, Config), + erlang:display({started, Name, R}), + Self ! {N, R}, + %% sleeping is necessary, or with peer nodes, they will + %% go down again, despite {linked, false}. + test_server:sleep(100000) + end), + start_nodes2(Rest, How, N+1, Config). + +collect_nodes(N, N) -> + []; +collect_nodes(N, Max) -> + receive + {N, Node} -> + [Node | collect_nodes(N+1, Max)] + end. + +start_node(Name, How, Config) -> + start_node(Name, How, "", Config). + +start_node(Name0, How, Args, Config) -> + Name = node_name(Name0, Config), + Pa = filename:dirname(code:which(?MODULE)), + test_server:start_node(Name, How, [{args, + Args ++ " " ++ + "-kernel net_setuptime 100 " + "-noshell " + "-pa " ++ Pa}, + {linked, false}]). +stop_nodes(Nodes) -> + lists:foreach(fun(Node) -> stop_node(Node) end, Nodes). + +stop_node(Node) -> + ?t:stop_node(Node). + +get_known(Node) -> + case catch gen_server:call({global_name_server,Node},get_known,infinity) of + {'EXIT', _} -> + [list, without, nodenames]; + Known when is_list(Known) -> + lists:sort([Node | Known]) + end. + +node_name(Name, Config) -> + U = "_", + {{Y,M,D}, {H,Min,S}} = calendar:now_to_local_time(now()), + Date = io_lib:format("~4w_~2..0w_~2..0w__~2..0w_~2..0w_~2..0w", + [Y,M,D, H,Min,S]), + L = lists:flatten(Date), + lists:concat([Name,U,?testcase,U,U,L]). + +%% this one runs on one node in Part2 +%% The partition is ready when is_ready_partition(Config) returns (true). +%% this one runs on one node in Part2 +%% The partition is ready when is_ready_partition(Config) returns (true). +make_partition(Config, Part1, Part2) -> + Dir = ?config(priv_dir, Config), + Ns = [begin + Name = lists:concat([atom_to_list(N),"_",msec(),".part"]), + File = filename:join([Dir, Name]), + file:delete(File), + rpc_cast(N, ?MODULE, mk_part_node, [File, Part, Config], File), + {N, File} + end || Part <- [Part1, Part2], N <- Part], + all_nodes_files(Ns, "done", Config), + lists:foreach(fun({_N,File}) -> file:delete(File) end, Ns), + PartFile = make_partition_file(Config), + touch(PartFile, "done"). + +%% The node signals its success by touching a file. +mk_part_node(File, MyPart0, Config) -> + touch(File, "start"), % debug + MyPart = lists:sort(MyPart0), + ?UNTIL(is_node_in_part(File, MyPart)), + touch(File, "done"). + +%% The calls to append_to_file are for debugging. +is_node_in_part(File, MyPart) -> + lists:foreach(fun(N) -> + _ = erlang:disconnect_node(N) + end, nodes() -- MyPart), + case {(Known = get_known(node())) =:= MyPart, + (Nodes = lists:sort([node() | nodes()])) =:= MyPart} of + {true, true} -> + %% Make sure the resolvers have been terminated, + %% otherwise they may pop up and send some message. + %% (This check is probably unnecessary.) + case element(5, global:info()) of + [] -> + true; + Rs -> + append_to_file(File, {now(), Known, Nodes, Rs}), + false + end; + _ -> + append_to_file(File, {now(), Known, Nodes}), + false + end. + +is_ready_partition(Config) -> + File = make_partition_file(Config), + file_contents(File, "done", Config), + file:delete(File), + true. + +wait_for_ready_net(Config) -> + wait_for_ready_net([node()|nodes()], Config). + +wait_for_ready_net(Nodes0, Config) -> + Nodes = lists:sort(Nodes0), + ?t:format("wait_for_ready_net ~p~n", [Nodes]), + ?UNTIL(begin + lists:all(fun(N) -> Nodes =:= get_known(N) end, Nodes) and + lists:all(fun(N) -> + LNs = rpc:call(N, erlang, nodes, []), + Nodes =:= lists:sort([N | LNs]) + end, Nodes) + end). + +%% To make it less probable that some low-level problem causes +%% problems, the receiving node is ping:ed. +rpc_cast(Node, Module, Function, Args) -> + {_,pong,Node}= {node(),net_adm:ping(Node),Node}, + rpc:cast(Node, Module, Function, Args). + +rpc_cast(Node, Module, Function, Args, File) -> + case net_adm:ping(Node) of + pong -> + rpc:cast(Node, Module, Function, Args); + Else -> + append_to_file(File, {now(), {rpc_cast, Node, Module, Function, + Args, Else}}) + %% Maybe we should crash, but it probably doesn't matter. + end. + +touch(File, List) -> + ok = file:write_file(File, list_to_binary(List)). + +append_to_file(File, Term) -> + {ok, Fd} = file:open(File, [raw,binary,append]), + ok = file:write(Fd, io_lib:format("~p.~n", [Term])), + ok = file:close(Fd). + +all_nodes_files(Files, ContentsList, Config) -> + lists:all(fun({_N,File}) -> + file_contents(File, ContentsList, Config) + end, Files). + +file_contents(File, ContentsList, Config) -> + file_contents(File, ContentsList, Config, no_log_file). + +file_contents(File, ContentsList, Config, LogFile) -> + Contents = list_to_binary(ContentsList), + Sz = size(Contents), + ?UNTIL(begin + case file:read_file(File) of + {ok, FileContents}=Reply -> + case catch split_binary(FileContents, Sz) of + {Contents,_} -> + true; + _ -> + catch append_to_file(LogFile, + {File,Contents,Reply}), + false + end; + Reply -> + catch append_to_file(LogFile, {File, Contents, Reply}), + false + end + end). + +make_partition_file(Config) -> + Dir = ?config(priv_dir, Config), + filename:join([Dir, atom_to_list(make_partition_done)]). + +msec() -> + msec(now()). + +msec(T) -> + element(1,T)*1000000000 + element(2,T)*1000 + element(3,T) div 1000. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/prim_file_SUITE_data/corrupted.gz erlang-13.b.3-dfsg/lib/kernel/test/prim_file_SUITE_data/corrupted.gz --- erlang-13.b.1-dfsg/lib/kernel/test/prim_file_SUITE_data/corrupted.gz 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/prim_file_SUITE_data/corrupted.gz 2001-10-08 09:52:45.000000000 +0100 @@ -0,0 +1,5 @@ +‹ +========================================== +This file has a correct GZIP magic ID, but the rest of the +header is corrupt. Reading this file should result in an +error. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/prim_file_SUITE_data/realmen.html erlang-13.b.3-dfsg/lib/kernel/test/prim_file_SUITE_data/realmen.html --- erlang-13.b.1-dfsg/lib/kernel/test/prim_file_SUITE_data/realmen.html 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/prim_file_SUITE_data/realmen.html 2001-10-08 09:52:47.000000000 +0100 @@ -0,0 +1,520 @@ +Real Programmers Don't Use PASCAL + +

    Real Programmers Don't Use PASCAL

    + +

    Ed Post
    +Graphic Software Systems
    + +P.O. Box 673
    +25117 S.W. Parkway
    +Wilsonville, OR 97070
    +Copyright (c) 1982
    +

    + + +

    (decvax | ucbvax | cbosg | pur-ee | lbl-unix)!teklabs!ogcvax!gss1144!evp

    + + +Back in the good old days -- the "Golden Era" of computers, it was +easy to separate the men from the boys (sometimes called "Real Men" +and "Quiche Eaters" in the literature). During this period, the Real +Men were the ones that understood computer programming, and the Quiche +Eaters were the ones that didn't. A real computer programmer said +things like "DO 10 I=1,10" and "ABEND" (they +actually talked in capital letters, you understand), and the rest of +the world said things like "computers are too complicated for +me" and "I can't relate to computers -- they're so +impersonal". (A previous work [1] points out that Real Men don't +"relate" to anything, and aren't afraid of being impersonal.)

    + +But, as usual, times change. We are faced today with a world in which +little old ladies can get computerized microwave ovens, 12 year old +kids can blow Real Men out of the water playing Asteroids and Pac-Man, +and anyone can buy and even understand their very own Personal +Computer. The Real Programmer is in danger of becoming extinct, of +being replaced by high-school students with TRASH-80s!

    + +There is a clear need to point out the differences between the typical +high-school junior Pac-Man player and a Real Programmer. Understanding +these differences will give these kids something to aspire to -- a +role model, a Father Figure. It will also help employers of Real +Programmers to realize why it would be a mistake to replace the Real +Programmers on their staff with 12 year old Pac-Man players (at a +considerable salary savings).

    + + +

    LANGUAGES

    + +The easiest way to tell a Real Programmer from the crowd is by the +programming language he (or she) uses. Real Programmers use FORTRAN. +Quiche Eaters use PASCAL. Nicklaus Wirth, the designer of PASCAL, was +once asked, "How do you pronounce your name?". He replied +"You can either call me by name, pronouncing it 'Veert', or call +me by value, 'Worth'." One can tell immediately from this comment +that Nicklaus Wirth is a Quiche Eater. The only parameter passing +mechanism endorsed by Real Programmers is call-by-value-return, as +implemented in the IBM/370 FORTRAN G and H compilers. Real +programmers don't need abstract concepts to get their jobs done: they +are perfectly happy with a keypunch, a FORTRAN IV compiler, and a +beer.

    + +

      +
    • Real Programmers do List Processing in FORTRAN. + +
    • Real Programmers do String Manipulation in FORTRAN. + +
    • Real Programmers do Accounting (if they do it at all) in FORTRAN. + +
    • Real Programmers do Artificial Intelligence programs in FORTRAN. +

    + +If you can't do it in FORTRAN, do it in assembly language. If you can't do +it in assembly language, it isn't worth doing.

    + + +

    STRUCTURED PROGRAMMING

    + +Computer science academicians have gotten into the "structured pro- +gramming" rut over the past several years. They claim that programs +are more easily understood if the programmer uses some special +language constructs and techniques. They don't all agree on exactly +which constructs, of course, and the examples they use to show their +particular point of view invariably fit on a single page of some +obscure journal or another -- clearly not enough of an example to +convince anyone. When I got out of school, I thought I was the best +programmer in the world. I could write an unbeatable tic-tac-toe +program, use five different computer languages, and create 1000 line +programs that WORKED. (Really!) Then I got out into the Real +World. My first task in the Real World was to read and understand a +200,000 line FORTRAN program, then speed it up by a factor of two. Any +Real Programmer will tell you that all the Structured Coding in the +world won't help you solve a problem like that -- it takes actual +talent. Some quick observations on Real Programmers and Structured +Programming:

    + +

      +
    • Real Programmers aren't afraid to use GOTOs. + +
    • Real Programmers can write five page long DO loops without +getting confused. + +
    • Real Programmers enjoy Arithmetic IF statements because they make +the code more interesting. + +
    • Real Programmers write self-modifying code, especially if it +saves them 20 nanoseconds in the middle of a tight loop. + +
    • Programmers don't need comments: the code is obvious. + +
    • Since FORTRAN doesn't have a structured IF, REPEAT +... UNTIL, or CASE statement, Real Programmers don't +have to worry about not using them. Besides, they can be simulated +when necessary using assigned GOTOs. + +

    + +Data structures have also gotten a lot of press lately. Abstract Data +Types, Structures, Pointers, Lists, and Strings have become popular in +certain circles. Wirth (the above-mentioned Quiche Eater) actually +wrote an entire book [2] contending that you could write a program +based on data structures, instead of the other way around. As all Real +Programmers know, the only useful data structure is the +array. Strings, lists, structures, sets -- these are all special cases +of arrays and and can be treated that way just as easily without +messing up your programing language with all sorts of +complications. The worst thing about fancy data types is that you have +to declare them, and Real Programming Languages, as we all know, have +implicit typing based on the first letter of the (six character) +variable name.

    + + +

    OPERATING SYSTEMS

    + +What kind of operating system is used by a Real Programmer? CP/M? God +forbid -- CP/M, after all, is basically a toy operating system. Even +little old ladies and grade school students can understand and use +CP/M.

    + +Unix is a lot more complicated of course -- the typical Unix hacker +never can remember what the PRINT command is called this +week -- but when it gets right down to it, Unix is a glorified video +game. People don't do Serious Work on Unix systems: they send jokes +around the world on USENET and write adventure games and research +papers.

    + +No, your Real Programmer uses OS/370. A good programmer can find and +understand the description of the IJK305I error he just got in his JCL +manual. A great programmer can write JCL without referring to the +manual at all. A truly outstanding programmer can find bugs buried in +a 6 megabyte core dump without using a hex calculator. (I have +actually seen this done.)

    + +OS/370 is a truly remarkable operating system. It's possible to des- +troy days of work with a single misplaced space, so alertness in the +programming staff is encouraged. The best way to approach the system +is through a keypunch. Some people claim there is a Time Sharing +system that runs on OS/370, but after careful study I have come to the +conclusion that they are mistaken.

    + + +

    PROGRAMMING TOOLS

    + +What kind of tools does a Real Programmer use? In theory, a Real +Programmer could run his programs by keying them into the front panel +of the computer. Back in the days when computers had front panels, +this was actually done occasionally. Your typical Real Programmer +knew the entire bootstrap loader by memory in hex, and toggled it in +whenever it got destroyed by his program. (Back then, memory was +memory -- it didn't go away when the power went off. Today, memory +either forgets things when you don't want it to, or remembers things +long after they're better forgotten.) Legend has it that Seymour +Cray, inventor of the Cray I supercomputer and most of Control Data's +computers, actually toggled the first operating system for the CDC7600 +in on the front panel from memory when it was first powered +on. Seymour, needless to say, is a Real Programmer.

    + +One of my favorite Real Programmers was a systems programmer for Texas +Instruments. One day, he got a long distance call from a user whose +system had crashed in the middle of some important work. Jim was able +to repair the damage over the phone, getting the user to toggle in +disk I/O instructions at the front panel, repairing system tables in +hex, reading register contents back over the phone. The moral of this +story: while a Real Programmer usually includes a keypunch and +lineprinter in his toolkit, he can get along with just a front panel +and a telephone in emergencies.

    + +In some companies, text editing no longer consists of ten engineers +standing in line to use an 029 keypunch. In fact, the building I work +in doesn't contain a single keypunch. The Real Programmer in this +situation has to do his work with a text editor program. Most systems +supply several text editors to select from, and the Real Programmer +must be careful to pick one that reflects his personal style. Many +people believe that the best text editors in the world were written at +Xerox Palo Alto Research Center for use on their Alto and Dorado +computers [3]. Unfortunately, no Real Programmer would ever use a +computer whose operating system is called SmallTalk, and would +certainly not talk to the computer with a mouse.

    + +Some of the concepts in these Xerox editors have been incorporated +into editors running on more reasonably named operating systems. EMACS +and VI are probably the most well known of this class of editors. The +problem with these editors is that Real Programmers consider "what you +see is what you get" to be just as bad a concept in text editors as it +is in women. No, the Real Programmer wants a "you asked for it, you +got it" text editor -- complicated, cryptic, powerful, unforgiving, +dangerous. TECO, to be precise.

    + +It has been observed that a TECO command sequence more closely resem- +bles transmission line noise than readable text [4]. One of the more +entertaining games to play with TECO is to type your name in as a +command line and try to guess what it does. Just about any possible +typing error while talking with TECO will probably destroy your +program, or even worse -- introduce subtle and mysterious bugs in a +once working subroutine.

    + +For this reason, Real Programmers are reluctant to actually edit a +program that is close to working. They find it much easier to just +patch the binary object code directly, using a wonderful program +called SUPERZAP (or its equivalent on non-IBM machines). This works so +well that many working programs on IBM systems bear no relation to +the original FORTRAN code. In many cases, the original source code is +no longer available. When it comes time to fix a program like this, no +manager would even think of sending anything less than a Real +Programmer to do the job -- no Quiche Eating structured programmer +would even know where to start. This is called "job security".

    + +Some programming tools NOT used by Real Programmers:

    +

      + +
    • FORTRAN preprocessors like MORTRAN and RATFOR. The Cuisinarts of +programming -- great for making Quiche. See comments above on +structured programming. + +
    • Source language debuggers. Real Programmers can read core dumps. + +
    • Compilers with array bounds checking. They stifle creativity, +destroy most of the interesting uses for EQUIVALENCE, and make it +impossible to modify the operating system code with negative +subscripts. Worst of all, bounds checking is inefficient. + +
    • Source code maintainance systems. A Real Programmer keeps his +code locked up in a card file, because it implies that its owner +cannot leave his important programs unguarded [5]. + +

    + + +

    THE REAL PROGRAMMER AT WORK

    + +Where does the typical Real Programmer work? What kind of programs are +worthy of the efforts of so talented an individual? You can be sure +that no real Programmer would be caught dead writing +accounts-receivable programs in COBOL, or sorting mailing lists for +People magazine. A Real Programmer wants tasks of earth-shaking +importance (literally!):

    + +

      + +
    • Real Programmers work for Los Alamos National Laboratory, writing +atomic bomb simulations to run on Cray I supercomputers. + +
    • Real Programmers work for the National Security Agency, decoding +Russian transmissions. + +
    • It was largely due to the efforts of thousands of Real +Programmers working for NASA that our boys got to the moon and back +before the cosmonauts. + +
    • The computers in the Space Shuttle were programmed by Real +Programmers. + +
    • Programmers are at work for Boeing designing the operating +systems for cruise missiles. + +

    + +Some of the most awesome Real Programmers of all work at the Jet Pro- +pulsion Laboratory in California. Many of them know the entire +operating system of the Pioneer and Voyager spacecraft by heart. With +a combination of large ground-based FORTRAN programs and small +spacecraft-based assembly language programs, they can to do incredible +feats of navigation and improvisation, such as hitting ten-kilometer +wide windows at Saturn after six years in space, and repairing or +bypassing damaged sensor platforms, radios, and batteries. Allegedly, +one Real Programmer managed to tuck a pattern-matching program into a +few hundred bytes of unused memory in a Voyager spacecraft that +searched for, located, and photographed a new moon of Jupiter.

    + +One plan for the upcoming Galileo spacecraft mission is to use a grav- +ity assist trajectory past Mars on the way to Jupiter. This trajectory +passes within 80 +/- 3 kilometers of the surface of Mars. Nobody is +going to trust a PASCAL program (or PASCAL programmer) for navigation +to these tolerances.

    + +As you can tell, many of the world's Real Programmers work for the +U.S. Government, mainly the Defense Department. This is as it should +be. Recently, however, a black cloud has formed on the Real +Programmer horizon.

    + +It seems that some highly placed Quiche Eaters at the Defense +Department decided that all Defense programs should be written in some +grand unified language called "ADA" (registered trademark, DoD). For +a while, it seemed that ADA was destined to become a language that +went against all the precepts of Real Programming -- a language with +structure, a language with data types, strong typing, and +semicolons. In short, a language designed to cripple the creativity of +the typical Real Programmer. Fortunately, the language adopted by DoD +has enough interesting features to make it approachable: it's +incredibly complex, includes methods for messing with the operating +system and rearranging memory, and Edsgar Dijkstra doesn't like it +[6]. (Dijkstra, as I'm sure you know, was the author of "GoTos +Considered Harmful" -- a landmark work in programming +methodology, applauded by Pascal Programmers and Quiche Eaters alike.) +Besides, the determined Real Programmer can write FORTRAN programs in +any language.

    + +The real programmer might compromise his principles and work on some- +thing slightly more trivial than the destruction of life as we know +it, providing there's enough money in it. There are several Real +Programmers building video games at Atari, for example. (But not +playing them. A Real Programmer knows how to beat the machine every +time: no challange in that.) Everyone working at LucasFilm is a Real +Programmer. (It would be crazy to turn down the money of 50 million +Star Wars fans.) The proportion of Real Programmers in Computer +Graphics is somewhat lower than the norm, mostly because nobody has +found a use for Computer Graphics yet. On the other hand, all +Computer Graphics is done in FORTRAN, so there are a fair number +people doing Graphics in order to avoid having to write COBOL +programs.

    + + +

    THE REAL PROGRAMMER AT PLAY

    + +Generally, the Real Programmer plays the same way he works -- with +computers. He is constantly amazed that his employer actually pays +him to do what he would be doing for fun anyway, although he is +careful not to express this opinion out loud. Occasionally, the Real +Programmer does step out of the office for a breath of fresh air and a +beer or two. Some tips on recognizing real programmers away from the +computer room:

    +

      + +
    • At a party, the Real Programmers are the ones in the corner +talking about operating system security and how to get around it. + +
    • At a football game, the Real Programmer is the one comparing the +plays against his simulations printed on 11 by 14 fanfold paper. + +
    • At the beach, the Real Programmer is the one drawing flowcharts +in the sand. + +
    • A Real Programmer goes to a disco to watch the light show. + +
    • At a funeral, the Real Programmer is the one saying "Poor +George. And he almost had the sort routine working before the +coronary." + +
    • In a grocery store, the Real Programmer is the one who insists on +running the cans past the laser checkout scanner himself, because he +never could trust keypunch operators to get it right the first time. + +

    + + +

    THE REAL PROGRAMMER'S NATURAL HABITAT

    + +What sort of environment does the Real Programmer function best in? +This is an important question for the managers of Real +Programmers. Considering the amount of money it costs to keep one on +the staff, it's best to put him (or her) in an environment where he +can get his work done.

    + +The typical Real Programmer lives in front of a computer terminal. +Surrounding this terminal are:

    +

      + +
    • Listings of all programs the Real Programmer has ever worked on, +piled in roughly chronological order on every flat surface in the office. + +
    • Some half-dozen or so partly filled cups of cold +coffee. Occasionally, there will be cigarette butts floating in the +coffee. In some cases, the cups will contain Orange Crush. + +
    • Unless he is very good, there will be copies of the OS JCL manual +and the Principles of Operation open to some particularly interesting +pages. + +
    • Taped to the wall is a line-printer Snoopy calender for the year +1969. + +
    • Strewn about the floor are several wrappers for peanut butter +filled cheese bars (the type that are made stale at the bakery so they +can't get any worse while waiting in the vending machine). + +
    • Hiding in the top left-hand drawer of the desk is a stash of +double stuff Oreos for special occasions. + +
    • Underneath the Oreos is a flow-charting template, left there by +the previous occupant of the office. (Real Programmers write programs, +not documentation. Leave that to the maintainence people.) + +

    + +The Real Programmer is capable of working 30, 40, even 50 hours at a +stretch, under intense pressure. In fact, he prefers it that way. Bad +response time doesn't bother the Real Programmer -- it gives him a +chance to catch a little sleep between compiles. If there is not +enough schedule pressure on the Real Programmer, he tends to make +things more challenging by working on some small but interesting part +of the problem for the first nine weeks, then finishing the rest in +the last week, in two or three 50-hour marathons. This not only +inpresses his manager, who was despairing of ever getting the project +done on time, but creates a convenient excuse for not doing the +documentation. In general:

    + +

      + +
    • No Real Programmer works 9 to 5. (Unless it's 9 in the evening to +5 in the morning.) + +
    • Real Programmers don't wear neckties. + +
    • Real Programmers don't wear high heeled shoes. + +
    • Real Programmers arrive at work in time for lunch. [9] + +
    • A Real Programmer might or might not know his wife's name. He +does, however, know the entire ASCII (or EBCDIC) code table. + +
    • Real Programmers don't know how to cook. Grocery stores aren't +often open at 3 a.m., so they survive on Twinkies and coffee. + +

    + +

    THE FUTURE

    + +What of the future? It is a matter of some concern to Real Programmers +that the latest generation of computer programmers are not being +brought up with the same outlook on life as their elders. Many of them +have never seen a computer with a front panel. Hardly anyone +graduating from school these days can do hex arithmetic without a +calculator. College graduates these days are soft -- protected from +the realities of programming by source level debuggers, text editors +that count parentheses, and user friendly operating systems. Worst of +all, some of these alleged computer scientists manage to get degrees +without ever learning FORTRAN! Are we destined to become an industry +of Unix hackers and Pascal programmers?

    + +On the contrary. From my experience, I can only report that the +future is bright for Real Programmers everywhere. Neither OS/370 nor +FORTRAN show any signs of dying out, despite all the efforts of +Pascal programmers the world over. Even more subtle tricks, like +adding structured coding constructs to FORTRAN have failed. Oh sure, +some computer vendors have come out with FORTRAN 77 compilers, but +every one of them has a way of converting itself back into a FORTRAN +66 compiler at the drop of an option card -- to compile DO loops like +God meant them to be.

    + +Even Unix might not be as bad on Real Programmers as it once was. The +latest release of Unix has the potential of an operating system worthy +of any Real Programmer. It has two different and subtly incompatible +user interfaces, an arcane and complicated terminal driver, virtual +memory. If you ignore the fact that it's structured, even C +programming can be appreciated by the Real Programmer: after all, +there's no type checking, variable names are seven (ten? eight?) +characters long, and the added bonus of the Pointer data type is +thrown in. It's like having the best parts of FORTRAN and assembly +language in one place. (Not to mention some of the more creative uses +for #define.)

    + +No, the future isn't all that bad. Why, in the past few years, the +popular press has even commented on the bright new crop of computer +nerds and hackers ([7] and [8]) leaving places like Stanford and +M.I.T. for the Real World. From all evidence, the spirit of Real +Programming lives on in these young men and women. As long as there +are ill-defined goals, bizarre bugs, and unrealistic schedules, there +will be Real Programmers willing to jump in and Solve The Problem, +saving the documentation for later. Long live FORTRAN!

    + +

    ACKNOWLEGEMENT

    + +I would like to thank Jan E., Dave S., Rich G., Rich E. for their help +in characterizing the Real Programmer, Heather B. for the +illustration, Kathy E. for putting up with it, and atd!avsdS:mark for +the initial inspriration.

    + +

    REFERENCES

    + +[1] Feirstein, B., Real Men Don't Eat Quiche, New York, + Pocket Books, 1982.

    + +[2] Wirth, N., Algorithms + Datastructures = Programs, + Prentice Hall, 1976.

    + +[3] Xerox PARC editors . . .

    + +[4] Finseth, C., Theory and Practice of Text Editors - + or - a Cookbook for an EMACS, B.S. Thesis, + MIT/LCS/TM-165, Massachusetts Institute of Technology, + May 1980.

    + +[5] Weinberg, G., The Psychology of Computer Programming, + New York, Van Nostrabd Reinhold, 1971, page 110.

    + +[6] Dijkstra, E., On the GREEN Language Submitted to the DoD, + Sigplan notices, Volume 3, Number 10, October 1978.

    + +[7] Rose, Frank, Joy of Hacking, Science 82, Volume 3, Number 9, + November 1982, pages 58 - 66.

    + +[8] The Hacker Papers, Psychology Today, August 1980.

    + +[9] Datamation, July, 1983, pp. 263-265.

    + +


    + +
    Hacker's Wisdom/ Real Programmers +Don't Use PASCAL
    + + +Last modified: Wed Mar 27 17:48:50 EST 1996 Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/kernel/test/prim_file_SUITE_data/realmen.html.gz and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/kernel/test/prim_file_SUITE_data/realmen.html.gz differ diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/prim_file_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/prim_file_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/prim_file_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/prim_file_SUITE.erl 2009-11-20 13:31:15.000000000 +0000 @@ -0,0 +1,1810 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(prim_file_SUITE). +-export([all/1, + init/1, fini/1, + read_write_file/1, dirs/1, files/1]). +-export([cur_dir_0a/1, cur_dir_0b/1, + cur_dir_1a/1, cur_dir_1b/1, + make_del_dir_a/1, make_del_dir_b/1, + pos/1, pos1/1, pos2/1]). +-export([close/1, + delete_a/1, delete_b/1]). +-export([open/1, open1/1, modes/1]). +-export([file_info/1, + file_info_basic_file_a/1, file_info_basic_file_b/1, + file_info_basic_directory_a/1, file_info_basic_directory_b/1, + file_info_bad_a/1, file_info_bad_b/1, + file_info_times_a/1, file_info_times_b/1, + file_write_file_info_a/1, file_write_file_info_b/1]). +-export([rename_a/1, rename_b/1, + access/1, truncate/1, sync/1, + read_write/1, pread_write/1, append/1]). +-export([errors/1, e_delete/1, e_rename/1, e_make_dir/1, e_del_dir/1]). + +-export([compression/1, read_not_really_compressed/1, + read_compressed/1, write_compressed/1, + compress_errors/1]). + +-export([links/1, + make_link_a/1, make_link_b/1, + read_link_info_for_non_link/1, + symlinks_a/1, symlinks_b/1, + list_dir_limit/1]). + +-include("test_server.hrl"). +-include_lib("kernel/include/file.hrl"). + +-define(PRIM_FILE, prim_file). + +%% Calls ?PRIM_FILE:F with arguments A and an optional handle H +%% as first argument, unless the handle is [], i.e no handle. +%% This is a macro to give the compiler and thereby +%% the cross reference tool the possibility to interprete +%% the call, since M, F, A (or [H | A]) can all be known at +%% compile time. +-define(PRIM_FILE_call(F, H, A), + case H of + [] -> apply(?PRIM_FILE, F, A); + _ -> apply(?PRIM_FILE, F, [H | A]) + end). + +all(suite) -> {req, [kernel], + {conf, init, + [read_write_file, dirs, files, + delete_a, delete_b, rename_a, rename_b, errors, + compression, links, list_dir_limit], + fini}}. + +init(Config) when is_list(Config) -> + case os:type() of + {win32, _} -> + Priv = ?config(priv_dir, Config), + HasAccessTime = + case file:read_file_info(Priv) of + {ok, #file_info{atime={_, {0, 0, 0}}}} -> + %% This is a unfortunately a FAT file system. + [no_access_time]; + {ok, _} -> + [] + end, + HasAccessTime++Config; + _ -> + Config + end. + +fini(Config) when is_list(Config) -> + case os:type() of + {win32, _} -> + os:cmd("subst z: /d"); + _ -> + ok + end, + Config. + +%% Matches a term (the last) against alternatives +expect(X, _, X) -> + X; +expect(_, X, X) -> + X. + +expect(X, _, _, X) -> + X; +expect(_, X, _, X) -> + X; +expect(_, _, X, X) -> + X. + +expect(X, _, _, _, X) -> + X; +expect(_, X, _, _, X) -> + X; +expect(_, _, X, _, X) -> + X; +expect(_, _, _, X, X) -> + X. + +%% Calculate the time difference +time_dist({YY, MM, DD, H, M, S}, DT) -> + time_dist({{YY, MM, DD}, {H, M, S}}, DT); +time_dist(DT, {YY, MM, DD, H, M, S}) -> + time_dist(DT, {{YY, MM, DD}, {H, M, S}}); +time_dist({_D1, _T1} = DT1, {_D2, _T2} = DT2) -> + calendar:datetime_to_gregorian_seconds(DT2) + - calendar:datetime_to_gregorian_seconds(DT1). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +read_write_file(suite) -> []; +read_write_file(doc) -> []; +read_write_file(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_read_write_file"), + + %% Try writing and reading back some term + ?line SomeTerm = {"This term",{will,be},[written,$t,$o],1,file,[]}, + ?line ok = ?PRIM_FILE:write_file(Name,term_to_binary(SomeTerm)), + ?line {ok,Bin1} = ?PRIM_FILE:read_file(Name), + ?line SomeTerm = binary_to_term(Bin1), + + %% Try a "null" term + ?line NullTerm = [], + ?line ok = ?PRIM_FILE:write_file(Name,term_to_binary(NullTerm)), + ?line {ok,Bin2} = ?PRIM_FILE:read_file(Name), + ?line NullTerm = binary_to_term(Bin2), + + %% Try some "complicated" types + ?line BigNum = 123456789012345678901234567890, + ?line ComplTerm = {self(),make_ref(),BigNum,3.14159}, + ?line ok = ?PRIM_FILE:write_file(Name,term_to_binary(ComplTerm)), + ?line {ok,Bin3} = ?PRIM_FILE:read_file(Name), + ?line ComplTerm = binary_to_term(Bin3), + + %% Try reading a nonexistent file + ?line Name2 = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_nonexistent_file"), + ?line {error, enoent} = ?PRIM_FILE:read_file(Name2), + ?line {error, enoent} = ?PRIM_FILE:read_file(""), + + % Try writing to a bad filename + ?line {error, enoent} = + ?PRIM_FILE:write_file("",term_to_binary(NullTerm)), + + % Try writing something else than a binary + ?line {error, badarg} = ?PRIM_FILE:write_file(Name,{1,2,3}), + ?line {error, badarg} = ?PRIM_FILE:write_file(Name,self()), + + %% Some non-term binaries + ?line ok = ?PRIM_FILE:write_file(Name,[]), + ?line {ok,Bin4} = ?PRIM_FILE:read_file(Name), + ?line 0 = byte_size(Bin4), + + ?line ok = ?PRIM_FILE:write_file(Name,[Bin1,[],[[Bin2]]]), + ?line {ok,Bin5} = ?PRIM_FILE:read_file(Name), + ?line {Bin1,Bin2} = split_binary(Bin5,byte_size(Bin1)), + + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +dirs(suite) -> [make_del_dir_a, make_del_dir_b, + cur_dir_0a, cur_dir_0b, + cur_dir_1a, cur_dir_1b]. + +make_del_dir_a(suite) -> []; +make_del_dir_a(doc) -> []; +make_del_dir_a(Config) when is_list(Config) -> + make_del_dir(Config, [], "_a"). + +make_del_dir_b(suite) -> []; +make_del_dir_b(doc) -> []; +make_del_dir_b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = make_del_dir(Config, Handle, "_b"), + ?line ok = ?PRIM_FILE:stop(Handle), + %% Just to make sure the state of the server makes a difference + ?line {error, einval} = ?PRIM_FILE_call(get_cwd, Handle, []), + Result. + +make_del_dir(Config, Handle, Suffix) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_mk-dir"++Suffix), + ?line ok = ?PRIM_FILE_call(make_dir, Handle, [NewDir]), + ?line {error, eexist} = ?PRIM_FILE_call(make_dir, Handle, [NewDir]), + ?line ok = ?PRIM_FILE_call(del_dir, Handle, [NewDir]), + ?line {error, enoent} = ?PRIM_FILE_call(del_dir, Handle, [NewDir]), + + %% Check that we get an error when trying to create... + %% a deep directory + ?line NewDir2 = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_mk-dir/foo"), + ?line {error, enoent} = ?PRIM_FILE_call(make_dir, Handle, [NewDir2]), + %% a nameless directory + ?line {error, enoent} = ?PRIM_FILE_call(make_dir, Handle, [""]), + %% a directory with illegal name + ?line {error, badarg} = ?PRIM_FILE_call(make_dir, Handle, ['mk-dir']), + + %% a directory with illegal name, even if it's a (bad) list + ?line {error, badarg} = ?PRIM_FILE_call(make_dir, Handle, [[1,2,3,{}]]), + + %% Maybe this isn't an error, exactly, but worth mentioning anyway: + %% ok = ?PRIM_FILE:make_dir([$f,$o,$o,0,$b,$a,$r])), + %% The above line works, and created a directory "./foo" + %% More elegant would maybe have been to fail, or to really create + %% a directory, but with a name that incorporates the "bar" part of + %% the list, so that [$f,$o,$o,0,$f,$o,$o] wouldn't refer to the same + %% dir. But this would slow it down. + + %% Try deleting some bad directories + %% Deleting the parent directory to the current, sounds dangerous, huh? + %% Don't worry ;-) the parent directory should never be empty, right? + ?line {error, eexist} = ?PRIM_FILE_call(del_dir, Handle, [".."]), + ?line {error, enoent} = ?PRIM_FILE_call(del_dir, Handle, [""]), + ?line {error, badarg} = ?PRIM_FILE_call(del_dir, Handle, [[3,2,1,{}]]), + + ?line test_server:timetrap_cancel(Dog), + ok. + +cur_dir_0a(suite) -> []; +cur_dir_0a(doc) -> []; +cur_dir_0a(Config) when is_list(Config) -> + cur_dir_0(Config, []). + +cur_dir_0b(suite) -> []; +cur_dir_0b(doc) -> []; +cur_dir_0b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = cur_dir_0(Config, Handle), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +cur_dir_0(Config, Handle) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + %% Find out the current dir, and cd to it ;-) + ?line {ok,BaseDir} = ?PRIM_FILE_call(get_cwd, Handle, []), + ?line Dir1 = BaseDir ++ "", %% Check that it's a string + ?line ok = ?PRIM_FILE_call(set_cwd, Handle, [Dir1]), + ?line DirName = atom_to_list(?MODULE) ++ + case Handle of + [] -> + "_curdir"; + _ -> + "_curdir_h" + end, + + %% Make a new dir, and cd to that + ?line RootDir = ?config(priv_dir,Config), + ?line NewDir = filename:join(RootDir, DirName), + ?line ok = ?PRIM_FILE_call(make_dir, Handle, [NewDir]), + ?line io:format("cd to ~s",[NewDir]), + ?line ok = ?PRIM_FILE_call(set_cwd, Handle, [NewDir]), + + %% Create a file in the new current directory, and check that it + %% really is created there + ?line UncommonName = "uncommon.fil", + ?line {ok,Fd} = ?PRIM_FILE:open(UncommonName, [read, write]), + ?line ok = ?PRIM_FILE:close(Fd), + ?line {ok,NewDirFiles} = ?PRIM_FILE_call(list_dir, Handle, ["."]), + ?line true = lists:member(UncommonName,NewDirFiles), + + %% Delete the directory and return to the old current directory + %% and check that the created file isn't there (too!) + ?line expect({error, einval}, {error, eacces}, {error, eexist}, + ?PRIM_FILE_call(del_dir, Handle, [NewDir])), + ?line ?PRIM_FILE_call(delete, Handle, [UncommonName]), + ?line {ok,[]} = ?PRIM_FILE_call(list_dir, Handle, ["."]), + ?line ok = ?PRIM_FILE_call(set_cwd, Handle, [Dir1]), + ?line io:format("cd back to ~s",[Dir1]), + ?line ok = ?PRIM_FILE_call(del_dir, Handle, [NewDir]), + ?line {error, enoent} = ?PRIM_FILE_call(set_cwd, Handle, [NewDir]), + ?line ok = ?PRIM_FILE_call(set_cwd, Handle, [Dir1]), + ?line io:format("cd back to ~s",[Dir1]), + ?line {ok,OldDirFiles} = ?PRIM_FILE_call(list_dir, Handle, ["."]), + ?line false = lists:member(UncommonName,OldDirFiles), + + %% Try doing some bad things + ?line {error, badarg} = + ?PRIM_FILE_call(set_cwd, Handle, [{foo,bar}]), + ?line {error, enoent} = + ?PRIM_FILE_call(set_cwd, Handle, [""]), + ?line {error, enoent} = + ?PRIM_FILE_call(set_cwd, Handle, [".......a......"]), + ?line {ok,BaseDir} = + ?PRIM_FILE_call(get_cwd, Handle, []), %% Still there? + + %% On Windows, there should only be slashes, no backslashes, + %% in the return value of get_cwd(). + %% (The test is harmless on Unix, because filenames usually + %% don't contain backslashes.) + + ?line {ok, BaseDir} = ?PRIM_FILE_call(get_cwd, Handle, []), + ?line false = lists:member($\\, BaseDir), + + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests ?PRIM_FILE:get_cwd/1. + +cur_dir_1a(suite) -> []; +cur_dir_1a(doc) -> []; +cur_dir_1a(Config) when is_list(Config) -> + cur_dir_1(Config, []). + +cur_dir_1b(suite) -> []; +cur_dir_1b(doc) -> []; +cur_dir_1b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = cur_dir_1(Config, Handle), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +cur_dir_1(Config, Handle) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + + ?line case os:type() of + {unix, _} -> + ?line {error, enotsup} = + ?PRIM_FILE_call(get_cwd, Handle, ["d:"]); + vxworks -> + ?line {error, enotsup} = + ?PRIM_FILE_call(get_cwd, Handle, ["d:"]); + {win32, _} -> + win_cur_dir_1(Config, Handle) + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +win_cur_dir_1(_Config, Handle) -> + ?line {ok, BaseDir} = ?PRIM_FILE_call(get_cwd, Handle, []), + + %% Get the drive letter from the current directory, + %% and try to get current directory for that drive. + + ?line [Drive, $:|_] = BaseDir, + ?line {ok, BaseDir} = ?PRIM_FILE_call(get_cwd, Handle, [[Drive, $:]]), + io:format("BaseDir = ~s\n", [BaseDir]), + + %% Unfortunately, there is no way to move away from the + %% current drive as we can't use the "subst" command from + %% a SSH connection. We can't test any more. Too bad. + + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +files(suite) -> [open,pos,file_info,truncate,sync]. + +open(suite) -> [open1,modes,close,access,read_write, + pread_write,append]. + +open1(suite) -> []; +open1(doc) -> []; +open1(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_files"), + ?line ok = ?PRIM_FILE:make_dir(NewDir), + ?line Name = filename:join(NewDir, "foo1.fil"), + ?line {ok,Fd1} = ?PRIM_FILE:open(Name, [read, write]), + ?line {ok,Fd2} = ?PRIM_FILE:open(Name, [read]), + ?line Str = "{a,tuple}.\n", + ?line Length = length(Str), + ?line ?PRIM_FILE:write(Fd1,Str), + ?line {ok,0} = ?PRIM_FILE:position(Fd1,bof), + ?line {ok, Str} = ?PRIM_FILE:read(Fd1,Length), + ?line {ok, Str} = ?PRIM_FILE:read(Fd2,Length), + ?line ok = ?PRIM_FILE:close(Fd2), + ?line {ok,0} = ?PRIM_FILE:position(Fd1,bof), + ?line ok = ?PRIM_FILE:truncate(Fd1), + ?line eof = ?PRIM_FILE:read(Fd1,Length), + ?line ok = ?PRIM_FILE:close(Fd1), + ?line {ok,Fd3} = ?PRIM_FILE:open(Name, [read]), + ?line eof = ?PRIM_FILE:read(Fd3,Length), + ?line ok = ?PRIM_FILE:close(Fd3), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests all open modes. + +modes(suite) -> []; +modes(doc) -> []; +modes(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_open_modes"), + ?line ok = ?PRIM_FILE:make_dir(NewDir), + ?line Name1 = filename:join(NewDir, "foo1.fil"), + ?line Marker = "hello, world", + ?line Length = length(Marker), + + %% write + ?line {ok, Fd1} = ?PRIM_FILE:open(Name1, [write]), + ?line ok = ?PRIM_FILE:write(Fd1, Marker), + ?line ok = ?PRIM_FILE:write(Fd1, ".\n"), + ?line ok = ?PRIM_FILE:close(Fd1), + + %% read + ?line {ok, Fd2} = ?PRIM_FILE:open(Name1, [read]), + ?line {ok, Marker} = ?PRIM_FILE:read(Fd2, Length), + ?line ok = ?PRIM_FILE:close(Fd2), + + %% read and write + ?line {ok, Fd3} = ?PRIM_FILE:open(Name1, [read, write]), + ?line {ok, Marker} = ?PRIM_FILE:read(Fd3, Length), + ?line ok = ?PRIM_FILE:write(Fd3, Marker), + ?line ok = ?PRIM_FILE:close(Fd3), + + %% read by default + ?line {ok, Fd4} = ?PRIM_FILE:open(Name1, []), + ?line {ok, Marker} = ?PRIM_FILE:read(Fd4, Length), + ?line ok = ?PRIM_FILE:close(Fd4), + + %% read and binary + ?line BinaryMarker = list_to_binary(Marker), + ?line {ok, Fd5} = ?PRIM_FILE:open(Name1, [read, binary]), + ?line {ok, BinaryMarker} = ?PRIM_FILE:read(Fd5, Length), + ?line ok = ?PRIM_FILE:close(Fd5), + + ?line test_server:timetrap_cancel(Dog), + ok. + +close(suite) -> []; +close(doc) -> []; +close(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_close.fil"), + ?line {ok,Fd1} = ?PRIM_FILE:open(Name, [read, write]), + %% Just closing it is no fun, we did that a million times already + %% This is a common error, for code written before Erlang 4.3 + %% bacause then ?PRIM_FILE:open just returned a Pid, and not everyone + %% really checked what they got. + ?line {'EXIT',_Msg} = (catch ok = ?PRIM_FILE:close({ok,Fd1})), + ?line ok = ?PRIM_FILE:close(Fd1), + + %% Try closing one more time + ?line Val = ?PRIM_FILE:close(Fd1), + ?line io:format("Second close gave: ~p", [Val]), + + ?line test_server:timetrap_cancel(Dog), + ok. + +access(suite) -> []; +access(doc) -> []; +access(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_access.fil"), + ?line Str = "ABCDEFGH", + ?line {ok,Fd1} = ?PRIM_FILE:open(Name, [write]), + ?line ?PRIM_FILE:write(Fd1,Str), + ?line ok = ?PRIM_FILE:close(Fd1), + %% Check that we can't write when in read only mode + ?line {ok,Fd2} = ?PRIM_FILE:open(Name, [read]), + ?line case catch ?PRIM_FILE:write(Fd2,"XXXX") of + ok -> + test_server:fail({access,write}); + _ -> + ok + end, + ?line ok = ?PRIM_FILE:close(Fd2), + ?line {ok, Fd3} = ?PRIM_FILE:open(Name, [read]), + ?line {ok, Str} = ?PRIM_FILE:read(Fd3,length(Str)), + ?line ok = ?PRIM_FILE:close(Fd3), + + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Tests ?PRIM_FILE:read/2 and ?PRIM_FILE:write/2. + +read_write(suite) -> []; +read_write(doc) -> []; +read_write(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_read_write"), + ?line ok = ?PRIM_FILE:make_dir(NewDir), + + %% Raw file. + ?line Name = filename:join(NewDir, "raw.fil"), + ?line {ok, Fd} = ?PRIM_FILE:open(Name, [read, write]), + ?line read_write_test(Fd), + + ?line test_server:timetrap_cancel(Dog), + ok. + +read_write_test(File) -> + ?line Marker = "hello, world", + ?line ok = ?PRIM_FILE:write(File, Marker), + ?line {ok, 0} = ?PRIM_FILE:position(File, 0), + ?line {ok, Marker} = ?PRIM_FILE:read(File, 100), + ?line eof = ?PRIM_FILE:read(File, 100), + ?line ok = ?PRIM_FILE:close(File), + ok. + + +%% Tests ?PRIM_FILE:pread/2 and ?PRIM_FILE:pwrite/2. + +pread_write(suite) -> []; +pread_write(doc) -> []; +pread_write(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_pread_write"), + ?line ok = ?PRIM_FILE:make_dir(NewDir), + + %% Raw file. + ?line Name = filename:join(NewDir, "raw.fil"), + ?line {ok, Fd} = ?PRIM_FILE:open(Name, [read, write]), + ?line pread_write_test(Fd), + + ?line test_server:timetrap_cancel(Dog), + ok. + +pread_write_test(File) -> + ?line Marker = "hello, world", + ?line Len = length(Marker), + ?line ok = ?PRIM_FILE:write(File, Marker), + ?line {ok, Marker} = ?PRIM_FILE:pread(File, 0, 100), + ?line eof = ?PRIM_FILE:pread(File, 100, 1), + ?line ok = ?PRIM_FILE:pwrite(File, Len, Marker), + ?line {ok, Marker} = ?PRIM_FILE:pread(File, Len, 100), + ?line eof = ?PRIM_FILE:pread(File, 100, 1), + ?line MM = Marker ++ Marker, + ?line {ok, MM} = ?PRIM_FILE:pread(File, 0, 100), + ?line ok = ?PRIM_FILE:close(File), + ok. + +append(doc) -> "Test appending to a file."; +append(suite) -> []; +append(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_append"), + ?line ok = ?PRIM_FILE:make_dir(NewDir), + + ?line First = "First line\n", + ?line Second = "Seond lines comes here\n", + ?line Third = "And here is the third line\n", + + %% Write a small text file. + ?line Name1 = filename:join(NewDir, "a_file.txt"), + ?line {ok, Fd1} = ?PRIM_FILE:open(Name1, [write]), + ?line ok = ?PRIM_FILE:write(Fd1, First), + ?line ok = ?PRIM_FILE:write(Fd1, Second), + ?line ok = ?PRIM_FILE:close(Fd1), + + %% Open it a again and a append a line to it. + ?line {ok, Fd2} = ?PRIM_FILE:open(Name1, [append]), + ?line ok = ?PRIM_FILE:write(Fd2, Third), + ?line ok = ?PRIM_FILE:close(Fd2), + + %% Read it back and verify. + ?line Expected = list_to_binary([First, Second, Third]), + ?line {ok, Expected} = ?PRIM_FILE:read_file(Name1), + + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +pos(suite) -> [pos1,pos2]. + +pos1(suite) -> []; +pos1(doc) -> []; +pos1(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_pos1.fil"), + ?line {ok, Fd1} = ?PRIM_FILE:open(Name, [write]), + ?line ?PRIM_FILE:write(Fd1,"ABCDEFGH"), + ?line ok = ?PRIM_FILE:close(Fd1), + ?line {ok, Fd2} = ?PRIM_FILE:open(Name, [read]), + + %% Start pos is first char + ?line io:format("Relative positions"), + ?line {ok, "A"} = ?PRIM_FILE:read(Fd2,1), + ?line {ok, 2} = ?PRIM_FILE:position(Fd2,{cur,1}), + ?line {ok, "C"} = ?PRIM_FILE:read(Fd2,1), + ?line {ok, 0} = ?PRIM_FILE:position(Fd2,{cur,-3}), + ?line {ok, "A"} = ?PRIM_FILE:read(Fd2,1), + %% Backwards from first char should be an error + ?line {ok,0} = ?PRIM_FILE:position(Fd2,{cur,-1}), + ?line {error, einval} = ?PRIM_FILE:position(Fd2,{cur,-1}), + %% Reset position and move again + ?line {ok, 0} = ?PRIM_FILE:position(Fd2,0), + ?line {ok, 2} = ?PRIM_FILE:position(Fd2,{cur,2}), + ?line {ok, "C"} = ?PRIM_FILE:read(Fd2,1), + %% Go a lot forwards + ?line {ok, 13} = ?PRIM_FILE:position(Fd2,{cur,10}), + ?line eof = ?PRIM_FILE:read(Fd2,1), + + %% Try some fixed positions + ?line io:format("Fixed positions"), + ?line {ok, 8} = ?PRIM_FILE:position(Fd2,8), + ?line eof = ?PRIM_FILE:read(Fd2,1), + ?line {ok, 8} = ?PRIM_FILE:position(Fd2,cur), + ?line eof = ?PRIM_FILE:read(Fd2,1), + ?line {ok, 7} = ?PRIM_FILE:position(Fd2,7), + ?line {ok, "H"} = ?PRIM_FILE:read(Fd2,1), + ?line {ok, 0} = ?PRIM_FILE:position(Fd2,0), + ?line {ok, "A"} = ?PRIM_FILE:read(Fd2,1), + ?line {ok, 3} = ?PRIM_FILE:position(Fd2,3), + ?line {ok, "D"} = ?PRIM_FILE:read(Fd2,1), + ?line {ok, 12} = ?PRIM_FILE:position(Fd2,12), + ?line eof = ?PRIM_FILE:read(Fd2,1), + ?line {ok, 3} = ?PRIM_FILE:position(Fd2,3), + ?line {ok, "D"} = ?PRIM_FILE:read(Fd2,1), + %% Try the {bof,X} notation + ?line {ok, 3} = ?PRIM_FILE:position(Fd2,{bof,3}), + ?line {ok, "D"} = ?PRIM_FILE:read(Fd2,1), + + %% Try eof positions + ?line io:format("EOF positions"), + ?line {ok, 8} = ?PRIM_FILE:position(Fd2,{eof,0}), + ?line eof = ?PRIM_FILE:read(Fd2,1), + ?line {ok, 7} = ?PRIM_FILE:position(Fd2,{eof,-1}), + ?line {ok, "H"} = ?PRIM_FILE:read(Fd2,1), + ?line {ok, 0} = ?PRIM_FILE:position(Fd2,{eof,-8}), + ?line {ok, "A"} = ?PRIM_FILE:read(Fd2,1), + ?line {error, einval} = ?PRIM_FILE:position(Fd2,{eof,-9}), + ?line test_server:timetrap_cancel(Dog), + ok. + +pos2(suite) -> []; +pos2(doc) -> []; +pos2(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_pos2.fil"), + ?line {ok,Fd1} = ?PRIM_FILE:open(Name, [write]), + ?line ?PRIM_FILE:write(Fd1,"ABCDEFGH"), + ?line ok = ?PRIM_FILE:close(Fd1), + ?line {ok, Fd2} = ?PRIM_FILE:open(Name, [read]), + ?line {error, einval} = ?PRIM_FILE:position(Fd2,-1), + + %% Make sure that we still can search after an error. + ?line {ok, 0} = ?PRIM_FILE:position(Fd2, 0), + ?line {ok, 3} = ?PRIM_FILE:position(Fd2, {bof,3}), + ?line {ok, "D"} = ?PRIM_FILE:read(Fd2,1), + + ?line io:format("DONE"), + ?line test_server:timetrap_cancel(Dog), + ok. + +file_info(suite) -> [file_info_basic_file_a, file_info_basic_file_b, + file_info_basic_directory_a, + file_info_basic_directory_b, + file_info_bad_a, file_info_bad_b, + file_info_times_a, file_info_times_b, + file_write_file_info_a, file_write_file_info_b]. + +file_info_basic_file_a(suite) -> []; +file_info_basic_file_a(doc) -> []; +file_info_basic_file_a(Config) when is_list(Config) -> + file_info_basic_file(Config, [], "_a"). + +file_info_basic_file_b(suite) -> []; +file_info_basic_file_b(doc) -> []; +file_info_basic_file_b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = file_info_basic_file(Config, Handle, "_b"), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +file_info_basic_file(Config, Handle, Suffix) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir, Config), + + %% Create a short file. + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_basic_test"++Suffix++".fil"), + ?line {ok,Fd1} = ?PRIM_FILE:open(Name, [write]), + ?line ?PRIM_FILE:write(Fd1, "foo bar"), + ?line ok = ?PRIM_FILE:close(Fd1), + + %% Test that the file has the expected attributes. + %% The times are tricky, so we will save them to a separate test case. + ?line {ok, FileInfo} = ?PRIM_FILE_call(read_file_info, Handle, [Name]), + ?line #file_info{size = Size, type = Type, access = Access, + atime = AccessTime, mtime = ModifyTime} = + FileInfo, + ?line io:format("Access ~p, Modify ~p", [AccessTime, ModifyTime]), + ?line Size = 7, + ?line Type = regular, + ?line Access = read_write, + ?line true = abs(time_dist(filter_atime(AccessTime, Config), + filter_atime(ModifyTime, + Config))) < 2, + ?line {AD, AT} = AccessTime, + ?line all_integers(tuple_to_list(AD) ++ tuple_to_list(AT)), + ?line {MD, MT} = ModifyTime, + ?line all_integers(tuple_to_list(MD) ++ tuple_to_list(MT)), + + ?line test_server:timetrap_cancel(Dog), + ok. + +file_info_basic_directory_a(suite) -> []; +file_info_basic_directory_a(doc) -> []; +file_info_basic_directory_a(Config) when is_list(Config) -> + file_info_basic_directory(Config, []). + +file_info_basic_directory_b(suite) -> []; +file_info_basic_directory_b(doc) -> []; +file_info_basic_directory_b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = file_info_basic_directory(Config, Handle), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +file_info_basic_directory(Config, Handle) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + + %% Note: filename:join/1 removes any trailing slash, + %% which is essential for ?PRIM_FILE:read_file_info/1 to work on + %% platforms such as Windows95. + ?line RootDir = filename:join([?config(priv_dir, Config)]), + + %% Test that the RootDir directory has the expected attributes. + ?line test_directory(RootDir, read_write, Handle), + + %% Note that on Windows file systems, "/" or "c:/" are *NOT* directories. + %% Therefore, test that ?PRIM_FILE:read_file_info/1 behaves + %% as if they were directories. + ?line case os:type() of + {win32, _} -> + ?line test_directory("/", read_write, Handle), + ?line test_directory("c:/", read_write, Handle), + ?line test_directory("c:\\", read_write, Handle); + {unix, _} -> + ?line test_directory("/", read, Handle); + vxworks -> + %% Check is just done for owner + ?line test_directory("/", read_write, Handle) + end, + ?line test_server:timetrap_cancel(Dog). + +test_directory(Name, ExpectedAccess, Handle) -> + ?line {ok, FileInfo} = ?PRIM_FILE_call(read_file_info, Handle, [Name]), + ?line #file_info{size = Size, type = Type, access = Access, + atime = AccessTime, mtime = ModifyTime} = + FileInfo, + ?line io:format("Testing directory ~s", [Name]), + ?line io:format("Directory size is ~p", [Size]), + ?line io:format("Access ~p", [Access]), + ?line io:format("Access time ~p; Modify time~p", + [AccessTime, ModifyTime]), + ?line Type = directory, + ?line Access = ExpectedAccess, + ?line {AD, AT} = AccessTime, + ?line all_integers(tuple_to_list(AD) ++ tuple_to_list(AT)), + ?line {MD, MT} = ModifyTime, + ?line all_integers(tuple_to_list(MD) ++ tuple_to_list(MT)), + ok. + +all_integers([Int|Rest]) when is_integer(Int) -> + ?line all_integers(Rest); +all_integers([]) -> + ok. + +%% Try something nonexistent. + +file_info_bad_a(suite) -> []; +file_info_bad_a(doc) -> []; +file_info_bad_a(Config) when is_list(Config) -> + file_info_bad(Config, []). + +file_info_bad_b(suite) -> []; +file_info_bad_b(doc) -> []; +file_info_bad_b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = file_info_bad(Config, Handle), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +file_info_bad(Config, Handle) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = filename:join([?config(priv_dir, Config)]), + ?line {error, enoent} = + ?PRIM_FILE_call( + read_file_info, Handle, + [filename:join(RootDir, + atom_to_list(?MODULE)++"_nonexistent")]), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Test that the file times behave as they should. + +file_info_times_a(suite) -> []; +file_info_times_a(doc) -> []; +file_info_times_a(Config) when is_list(Config) -> + file_info_times(Config, [], "_a"). + +file_info_times_b(suite) -> []; +file_info_times_b(doc) -> []; +file_info_times_b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = file_info_times(Config, Handle, "_b"), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +file_info_times(Config, Handle, Suffix) -> + ?line Dog = test_server:timetrap(test_server:seconds(60)), + %% We have to try this twice, since if the test runs across the change + %% of a month the time diff calculations will fail. But it won't happen + %% if you run it twice in succession. + ?line test_server:m_out_of_n( + 1,2, + fun() -> ?line file_info_int(Config, Handle, Suffix) end), + ?line test_server:timetrap_cancel(Dog), + ok. + +file_info_int(Config, Handle, Suffix) -> + %% Note: filename:join/1 removes any trailing slash, + %% which is essential for ?PRIM_FILE:read_file_info/1 to work on + %% platforms such as Windows95. + + ?line RootDir = filename:join([?config(priv_dir, Config)]), + ?line test_server:format("RootDir = ~p", [RootDir]), + + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_file_info"++Suffix++".fil"), + ?line {ok,Fd1} = ?PRIM_FILE:open(Name, [write]), + ?line ?PRIM_FILE:write(Fd1,"foo"), + + %% check that the file got a modify date max a few seconds away from now + ?line {ok, #file_info{type = regular, + atime = AccTime1, mtime = ModTime1}} = + ?PRIM_FILE_call(read_file_info, Handle, [Name]), + ?line Now = erlang:localtime(), + ?line io:format("Now ~p",[Now]), + ?line io:format("Open file Acc ~p Mod ~p",[AccTime1,ModTime1]), + ?line true = abs(time_dist(filter_atime(Now, Config), + filter_atime(AccTime1, + Config))) < 8, + ?line true = abs(time_dist(Now, ModTime1)) < 8, + + %% Sleep until we can be sure the seconds value has changed. + %% Note: FAT-based filesystem (like on Windows 95) have + %% a resolution of 2 seconds. + ?line test_server:sleep(test_server:seconds(2.2)), + + %% close the file, and watch the modify date change + ?line ok = ?PRIM_FILE:close(Fd1), + ?line {ok, #file_info{size = Size, type = regular, access = Access, + atime = AccTime2, mtime = ModTime2}} = + ?PRIM_FILE_call(read_file_info, Handle, [Name]), + ?line io:format("Closed file Acc ~p Mod ~p",[AccTime2,ModTime2]), + ?line true = time_dist(ModTime1, ModTime2) >= 0, + + %% this file is supposed to be binary, so it'd better keep it's size + ?line Size = 3, + ?line Access = read_write, + + %% Do some directory checking + ?line {ok, #file_info{size = DSize, type = directory, + access = DAccess, + atime = AccTime3, mtime = ModTime3}} = + ?PRIM_FILE_call(read_file_info, Handle, [RootDir]), + %% this dir was modified only a few secs ago + ?line io:format("Dir Acc ~p; Mod ~p; Now ~p", + [AccTime3, ModTime3, Now]), + ?line true = abs(time_dist(Now, ModTime3)) < 5, + ?line DAccess = read_write, + ?line io:format("Dir size is ~p",[DSize]), + ok. + +%% Filter access times, to cope with a deficiency of FAT file systems +%% (on Windows): The access time is actually only a date. + +filter_atime(Atime, Config) -> + case lists:member(no_access_time, Config) of + true -> + case Atime of + {Date, _} -> + {Date, {0, 0, 0}}; + {Y, M, D, _, _, _} -> + {Y, M, D, 0, 0, 0} + end; + false -> + Atime + end. + +%% Test the write_file_info/2 function. + +file_write_file_info_a(suite) -> []; +file_write_file_info_a(doc) -> []; +file_write_file_info_a(Config) when is_list(Config) -> + file_write_file_info(Config, [], "_a"). + +file_write_file_info_b(suite) -> []; +file_write_file_info_b(doc) -> []; +file_write_file_info_b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = file_write_file_info(Config, Handle, "_b"), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +file_write_file_info(Config, Handle, Suffix) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = get_good_directory(Config), + ?line test_server:format("RootDir = ~p", [RootDir]), + + %% Set the file to read only AND update the file times at the same time. + %% (This used to fail on Windows NT/95 for a local filesystem.) + %% Note: Seconds must be even; see note in file_info_times/1. + + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_write_file_info_ro"++Suffix), + ?line ok = ?PRIM_FILE:write_file(Name, "hello"), + ?line Time = {{1997, 01, 02}, {12, 35, 42}}, + ?line Info = #file_info{mode=8#400, atime=Time, mtime=Time, ctime=Time}, + ?line ok = ?PRIM_FILE_call(write_file_info, Handle, [Name, Info]), + + %% Read back the times. + + ?line {ok, ActualInfo} = + ?PRIM_FILE_call(read_file_info, Handle, [Name]), + ?line #file_info{mode=_Mode, atime=ActAtime, mtime=Time, + ctime=ActCtime} = ActualInfo, + ?line FilteredAtime = filter_atime(Time, Config), + ?line FilteredAtime = filter_atime(ActAtime, Config), + ?line case os:type() of + {win32, _} -> + %% On Windows, "ctime" means creation time and it can + %% be set. + ActCtime = Time; + _ -> + ok + end, + ?line {error, eacces} = ?PRIM_FILE:write_file(Name, "hello again"), + + %% Make the file writable again. + + ?line ?PRIM_FILE_call(write_file_info, Handle, + [Name, #file_info{mode=8#600}]), + ?line ok = ?PRIM_FILE:write_file(Name, "hello again"), + + %% And unwritable. + ?line ?PRIM_FILE_call(write_file_info, Handle, + [Name, #file_info{mode=8#400}]), + ?line {error, eacces} = ?PRIM_FILE:write_file(Name, "hello again"), + + %% Write the times again. + %% Note: Seconds must be even; see note in file_info_times/1. + + ?line NewTime = {{1997, 02, 15}, {13, 18, 20}}, + ?line NewInfo = #file_info{atime=NewTime, mtime=NewTime, ctime=NewTime}, + ?line ok = ?PRIM_FILE_call(write_file_info, Handle, [Name, NewInfo]), + ?line {ok, ActualInfo2} = + ?PRIM_FILE_call(read_file_info, Handle, [Name]), + ?line #file_info{atime=NewActAtime, mtime=NewTime, + ctime=NewActCtime} = ActualInfo2, + ?line NewFilteredAtime = filter_atime(NewTime, Config), + ?line NewFilteredAtime = filter_atime(NewActAtime, Config), + ?line case os:type() of + {win32, _} -> NewActCtime = NewTime; + _ -> ok + end, + + %% The file should still be unwritable. + ?line {error, eacces} = ?PRIM_FILE:write_file(Name, "hello again"), + + %% Make the file writeable again, so that we can remove the + %% test suites ... :-) + ?line ?PRIM_FILE_call(write_file_info, Handle, + [Name, #file_info{mode=8#600}]), + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Returns a directory on a file system that has correct file times. + +get_good_directory(Config) -> + ?line ?config(priv_dir, Config). + +truncate(suite) -> []; +truncate(doc) -> []; +truncate(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_truncate.fil"), + + %% Create a file with some data. + ?line MyData = "0123456789abcdefghijklmnopqrstuvxyz", + ?line ok = ?PRIM_FILE:write_file(Name, MyData), + + %% Truncate the file to 10 characters. + ?line {ok, Fd} = ?PRIM_FILE:open(Name, [read, write]), + ?line {ok, 10} = ?PRIM_FILE:position(Fd, 10), + ?line ok = ?PRIM_FILE:truncate(Fd), + ?line ok = ?PRIM_FILE:close(Fd), + + %% Read back the file and check that it has been truncated. + ?line Expected = list_to_binary("0123456789"), + ?line {ok, Expected} = ?PRIM_FILE:read_file(Name), + + %% Open the file read only and verify that it is not possible to + %% truncate it, OTP-1960 + ?line {ok, Fd2} = ?PRIM_FILE:open(Name, [read]), + ?line {ok, 5} = ?PRIM_FILE:position(Fd2, 5), + ?line {error, _} = ?PRIM_FILE:truncate(Fd2), + + ?line test_server:timetrap_cancel(Dog), + ok. + + +sync(suite) -> []; +sync(doc) -> "Tests that ?PRIM_FILE:sync/1 at least doesn't crash."; +sync(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line PrivDir = ?config(priv_dir, Config), + ?line Sync = filename:join(PrivDir, + atom_to_list(?MODULE) + ++"_sync.fil"), + + %% Raw open. + ?line {ok, Fd} = ?PRIM_FILE:open(Sync, [write]), + ?line ok = ?PRIM_FILE:sync(Fd), + ?line ok = ?PRIM_FILE:close(Fd), + + ?line test_server:timetrap_cancel(Dog), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +delete_a(suite) -> []; +delete_a(doc) -> []; +delete_a(Config) when is_list(Config) -> + delete(Config, [], "_a"). + +delete_b(suite) -> []; +delete_b(doc) -> []; +delete_b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = delete(Config, Handle, "_b"), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +delete(Config, Handle, Suffix) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line Name = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_delete"++Suffix++".fil"), + ?line {ok, Fd1} = ?PRIM_FILE:open(Name, [write]), + ?line ?PRIM_FILE:write(Fd1,"ok.\n"), + ?line ok = ?PRIM_FILE:close(Fd1), + %% Check that the file is readable + ?line {ok, Fd2} = ?PRIM_FILE:open(Name, [read]), + ?line ok = ?PRIM_FILE:close(Fd2), + ?line ok = ?PRIM_FILE_call(delete, Handle, [Name]), + %% Check that the file is not readable anymore + ?line {error, _} = ?PRIM_FILE:open(Name, [read]), + %% Try deleting a nonexistent file + ?line {error, enoent} = ?PRIM_FILE_call(delete, Handle, [Name]), + ?line test_server:timetrap_cancel(Dog), + ok. + +rename_a(suite) ->[]; +rename_a(doc) ->[]; +rename_a(Config) when is_list(Config) -> + rename(Config, [], "_a"). + +rename_b(suite) ->[]; +rename_b(doc) ->[]; +rename_b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = rename(Config, Handle, "_b"), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +rename(Config, Handle, Suffix) -> + ?line Dog = test_server:timetrap(test_server:seconds(5)), + ?line RootDir = ?config(priv_dir,Config), + ?line FileName1 = atom_to_list(?MODULE)++"_rename"++Suffix++".fil", + ?line FileName2 = atom_to_list(?MODULE)++"_rename"++Suffix++".ful", + ?line Name1 = filename:join(RootDir, FileName1), + ?line Name2 = filename:join(RootDir, FileName2), + ?line {ok,Fd1} = ?PRIM_FILE:open(Name1, [write]), + ?line ok = ?PRIM_FILE:close(Fd1), + %% Rename, and check that it really changed name + ?line ok = ?PRIM_FILE_call(rename, Handle, [Name1, Name2]), + ?line {error, _} = ?PRIM_FILE:open(Name1, [read]), + ?line {ok, Fd2} = ?PRIM_FILE:open(Name2, [read]), + ?line ok = ?PRIM_FILE:close(Fd2), + %% Try renaming something to itself + ?line ok = ?PRIM_FILE_call(rename, Handle, [Name2, Name2]), + %% Try renaming something that doesn't exist + ?line {error, enoent} = + ?PRIM_FILE_call(rename, Handle, [Name1, Name2]), + %% Try renaming to something else than a string + ?line {error, badarg} = + ?PRIM_FILE_call(rename, Handle, [Name1, foobar]), + + %% Move between directories + ?line DirName1 = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_rename_dir"++Suffix), + ?line DirName2 = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_second_rename_dir"++Suffix), + ?line Name1foo = filename:join(DirName1, "foo.fil"), + ?line Name2foo = filename:join(DirName2, "foo.fil"), + ?line Name2bar = filename:join(DirName2, "bar.dir"), + ?line ok = ?PRIM_FILE:make_dir(DirName1), + %% The name has to include the full file name, path is not enough + ?line expect( + {error, eexist}, {error, eisdir}, + ?PRIM_FILE_call(rename, Handle, [Name2, DirName1])), + ?line ok = + ?PRIM_FILE_call(rename, Handle, [Name2, Name1foo]), + %% Now rename the directory + ?line ok = ?PRIM_FILE_call(rename, Handle, [DirName1, DirName2]), + %% And check that the file is there now + ?line {ok,Fd3} = ?PRIM_FILE:open(Name2foo, [read]), + ?line ok = ?PRIM_FILE:close(Fd3), + %% Try some dirty things now: move the directory into itself + ?line {error, Msg1} = + ?PRIM_FILE_call(rename, Handle, [DirName2, Name2bar]), + ?line io:format("Errmsg1: ~p",[Msg1]), + %% move dir into a file in itself + ?line {error, Msg2} = + ?PRIM_FILE_call(rename, Handle, [DirName2, Name2foo]), + ?line io:format("Errmsg2: ~p",[Msg2]), + + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +errors(suite) -> [e_delete, e_rename, e_make_dir, e_del_dir]. + +e_delete(suite) -> []; +e_delete(doc) -> []; +e_delete(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line Base = filename:join(RootDir, + atom_to_list(?MODULE)++"_e_delete"), + ?line ok = ?PRIM_FILE:make_dir(Base), + + %% Delete a non-existing file. + ?line {error, enoent} = + ?PRIM_FILE:delete(filename:join(Base, "non_existing")), + + %% Delete a directory. + ?line {error, eperm} = ?PRIM_FILE:delete(Base), + + %% Use a path-name with a non-directory component. + ?line Afile = filename:join(Base, "a_file"), + ?line ok = ?PRIM_FILE:write_file(Afile, "hello\n"), + ?line {error, E} = + expect( + {error, enotdir}, {error, enoent}, + ?PRIM_FILE:delete(filename:join(Afile, "another_file"))), + ?line io:format("Result: ~p~n", [E]), + + %% No permission. + ?line case os:type() of + {unix, _} -> + ?line ?PRIM_FILE:write_file_info( + Base, #file_info {mode=0}), + ?line {error, eacces} = ?PRIM_FILE:delete(Afile), + ?line ?PRIM_FILE:write_file_info( + Base, #file_info {mode=8#600}); + {win32, _} -> + %% Remove a character device. + ?line {error, eacces} = ?PRIM_FILE:delete("nul"); + vxworks -> + ok + end, + + ?line test_server:timetrap_cancel(Dog), + ok. + +%%% FreeBSD gives EEXIST when renaming a file to an empty dir, although the +%%% manual page can be interpreted as saying that EISDIR should be given. +%%% (What about FreeBSD? We store our nightly build results on a FreeBSD +%%% file system, that's what.) + +e_rename(suite) -> []; +e_rename(doc) -> []; +e_rename(Config) when is_list(Config) -> + case os:type() of + vxworks -> + {comment, "Windriver: dosFs must be fixed first!"}; + _ -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line Base = filename:join(RootDir, + atom_to_list(?MODULE)++"_e_rename"), + ?line ok = ?PRIM_FILE:make_dir(Base), + + %% Create an empty directory. + ?line EmptyDir = filename:join(Base, "empty_dir"), + ?line ok = ?PRIM_FILE:make_dir(EmptyDir), + + %% Create a non-empty directory. + ?line NonEmptyDir = filename:join(Base, "non_empty_dir"), + ?line ok = ?PRIM_FILE:make_dir(NonEmptyDir), + ?line ok = ?PRIM_FILE:write_file( + filename:join(NonEmptyDir, "a_file"), + "hello\n"), + + %% Create another non-empty directory. + ?line ADirectory = filename:join(Base, "a_directory"), + ?line ok = ?PRIM_FILE:make_dir(ADirectory), + ?line ok = ?PRIM_FILE:write_file( + filename:join(ADirectory, "a_file"), + "howdy\n\n"), + + %% Create a data file. + ?line File = filename:join(Base, "just_a_file"), + ?line ok = ?PRIM_FILE:write_file(File, "anything goes\n\n"), + + %% Move an existing directory to a non-empty directory. + ?line {error, eexist} = + ?PRIM_FILE:rename(ADirectory, NonEmptyDir), + + %% Move a root directory. + ?line {error, einval} = ?PRIM_FILE:rename("/", "arne"), + + %% Move Base into Base/new_name. + ?line {error, einval} = + ?PRIM_FILE:rename(Base, filename:join(Base, "new_name")), + + %% Overwrite a directory with a file. + ?line expect({error, eexist}, % FreeBSD (?) + {error, eisdir}, + ?PRIM_FILE:rename(File, EmptyDir)), + ?line expect({error, eexist}, % FreeBSD (?) + {error, eisdir}, + ?PRIM_FILE:rename(File, NonEmptyDir)), + + %% Move a non-existing file. + ?line NonExistingFile = filename:join( + Base, "non_existing_file"), + ?line {error, enoent} = + ?PRIM_FILE:rename(NonExistingFile, NonEmptyDir), + + %% Overwrite a file with a directory. + ?line expect({error, eexist}, % FreeBSD (?) + {error, enotdir}, + ?PRIM_FILE:rename(ADirectory, File)), + + %% Move a file to another filesystem. + %% XXX - This test case is bogus. We cannot be guaranteed that + %% the source and destination are on + %% different filesystems. + %% + %% XXX - Gross hack! + ?line Comment = + case os:type() of + {unix, _} -> + OtherFs = "/tmp", + ?line NameOnOtherFs = + filename:join(OtherFs, + filename:basename(File)), + ?line {ok, Com} = + case ?PRIM_FILE:rename( + File, NameOnOtherFs) of + {error, exdev} -> + %% The file could be in + %% the same filesystem! + {ok, ok}; + ok -> + {ok, {comment, + "Moving between filesystems " + "suceeded, files are probably " + "in the same filesystem!"}}; + {error, eperm} -> + {ok, {comment, "SBS! You don't " + "have the permission to do " + "this test!"}}; + Else -> + Else + end, + Com; + {win32, _} -> + %% At least Windows NT can + %% successfully move a file to + %% another drive. + ok + end, + ?line test_server:timetrap_cancel(Dog), + Comment + end. + +e_make_dir(suite) -> []; +e_make_dir(doc) -> []; +e_make_dir(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line Base = filename:join(RootDir, + atom_to_list(?MODULE)++"_e_make_dir"), + ?line ok = ?PRIM_FILE:make_dir(Base), + + %% A component of the path does not exist. + ?line {error, enoent} = + ?PRIM_FILE:make_dir(filename:join([Base, "a", "b"])), + + %% Use a path-name with a non-directory component. + ?line Afile = filename:join(Base, "a_directory"), + ?line ok = ?PRIM_FILE:write_file(Afile, "hello\n"), + ?line case ?PRIM_FILE:make_dir( + filename:join(Afile, "another_directory")) of + {error, enotdir} -> io:format("Result: enotdir"); + {error, enoent} -> io:format("Result: enoent") + end, + + %% No permission (on Unix only). + case os:type() of + {unix, _} -> + ?line ?PRIM_FILE:write_file_info(Base, #file_info {mode=0}), + ?line {error, eacces} = + ?PRIM_FILE:make_dir(filename:join(Base, "xxxx")), + ?line + ?PRIM_FILE:write_file_info(Base, #file_info {mode=8#600}); + {win32, _} -> + ok; + vxworks -> + ok + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +e_del_dir(suite) -> []; +e_del_dir(doc) -> []; +e_del_dir(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line Base = filename:join(RootDir, + atom_to_list(?MODULE)++"_e_del_dir"), + ?line io:format("Base: ~p", [Base]), + ?line ok = ?PRIM_FILE:make_dir(Base), + + %% Delete a non-existent directory. + ?line {error, enoent} = + ?PRIM_FILE:del_dir(filename:join(Base, "non_existing")), + + %% Use a path-name with a non-directory component. + ?line Afile = filename:join(Base, "a_directory"), + ?line ok = ?PRIM_FILE:write_file(Afile, "hello\n"), + ?line {error, E1} = + expect({error, enotdir}, {error, enoent}, + ?PRIM_FILE:del_dir( + filename:join(Afile, "another_directory"))), + ?line io:format("Result: ~p", [E1]), + + %% Delete a non-empty directory. + %% Delete a non-empty directory. + ?line {error, E2} = + expect({error, enotempty}, {error, eexist}, {error, eacces}, + ?PRIM_FILE:del_dir(Base)), + ?line io:format("Result: ~p", [E2]), + + %% Remove the current directory. + ?line {error, E3} = + expect({error, einval}, + {error, eperm}, % Linux and DUX + {error, eacces}, + {error, ebusy}, + ?PRIM_FILE:del_dir(".")), + ?line io:format("Result: ~p", [E3]), + + %% No permission. + case os:type() of + {unix, _} -> + ?line ADirectory = filename:join(Base, "no_perm"), + ?line ok = ?PRIM_FILE:make_dir(ADirectory), + ?line ?PRIM_FILE:write_file_info(Base, #file_info {mode=0}), + ?line {error, eacces} = ?PRIM_FILE:del_dir(ADirectory), + ?line ?PRIM_FILE:write_file_info( + Base, #file_info {mode=8#600}); + {win32, _} -> + ok; + vxworks -> + ok + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +compression(suite) -> [read_compressed, read_not_really_compressed, + write_compressed, compress_errors]. + +%% Trying reading and positioning from a compressed file. + +read_compressed(suite) -> []; +read_compressed(doc) -> []; +read_compressed(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line Real = filename:join(Data, "realmen.html.gz"), + ?line {ok, Fd} = ?PRIM_FILE:open(Real, [read, compressed]), + ?line try_read_file(Fd). + +%% Trying reading and positioning from an uncompressed file, +%% but with the compressed flag given. + +read_not_really_compressed(suite) -> []; +read_not_really_compressed(doc) -> []; +read_not_really_compressed(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line Priv = ?config(priv_dir, Config), + + %% The file realmen.html might have got CRs added (by WinZip). + %% Remove them, or the file positions will not be correct. + + ?line Real = filename:join(Data, "realmen.html"), + ?line RealPriv = filename:join(Priv, + atom_to_list(?MODULE)++"_realmen.html"), + ?line {ok, RealDataBin} = ?PRIM_FILE:read_file(Real), + ?line RealData = remove_crs(binary_to_list(RealDataBin), []), + ?line ok = ?PRIM_FILE:write_file(RealPriv, RealData), + ?line {ok, Fd} = ?PRIM_FILE:open(RealPriv, [read, compressed]), + ?line try_read_file(Fd). + +remove_crs([$\r|Rest], Result) -> + remove_crs(Rest, Result); +remove_crs([C|Rest], Result) -> + remove_crs(Rest, [C|Result]); +remove_crs([], Result) -> + lists:reverse(Result). + +try_read_file(Fd) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + + %% Seek to the current position (nothing should happen). + + ?line {ok, 0} = ?PRIM_FILE:position(Fd, 0), + ?line {ok, 0} = ?PRIM_FILE:position(Fd, {cur, 0}), + + %% Read a few lines from a compressed file. + + ?line ShouldBe = "Real Programmers Don't Use PASCAL\n", + ?line {ok, ShouldBe} = ?PRIM_FILE:read(Fd, length(ShouldBe)), + + %% Now seek forward. + + ?line {ok, 381} = ?PRIM_FILE:position(Fd, 381), + ?line Back = "Back in the good old days -- the \"Golden Era\" " ++ + "of computers, it was\n", + ?line {ok, Back} = ?PRIM_FILE:read(Fd, length(Back)), + + %% Try to search forward relative to the current position. + + ?line {ok, CurPos} = ?PRIM_FILE:position(Fd, {cur, 0}), + ?line RealPos = 4273, + ?line {ok, RealPos} = ?PRIM_FILE:position(Fd, {cur, RealPos-CurPos}), + ?line RealProg = "
  • Real Programmers aren't afraid to use GOTOs.\n", + ?line {ok, RealProg} = ?PRIM_FILE:read(Fd, length(RealProg)), + + %% Seek backward. + + ?line AfterTitle = length(""), + ?line {ok, AfterTitle} = ?PRIM_FILE:position(Fd, AfterTitle), + ?line Title = "Real Programmers Don't Use PASCAL\n", + ?line {ok, Title} = ?PRIM_FILE:read(Fd, length(Title)), + + %% Done. + + ?line ?PRIM_FILE:close(Fd), + ?line test_server:timetrap_cancel(Dog), + ok. + +write_compressed(suite) -> []; +write_compressed(doc) -> []; +write_compressed(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Priv = ?config(priv_dir, Config), + ?line MyFile = filename:join(Priv, + atom_to_list(?MODULE)++"_test.gz"), + + %% Write a file. + + ?line {ok, Fd} = ?PRIM_FILE:open(MyFile, [write, compressed]), + ?line {ok, 0} = ?PRIM_FILE:position(Fd, 0), + ?line Prefix = "hello\n", + ?line End = "end\n", + ?line ok = ?PRIM_FILE:write(Fd, Prefix), + ?line {ok, 143} = ?PRIM_FILE:position(Fd, 143), + ?line ok = ?PRIM_FILE:write(Fd, End), + ?line ok = ?PRIM_FILE:close(Fd), + + %% Read the file and verify the contents. + + ?line {ok, Fd1} = ?PRIM_FILE:open(MyFile, [read, compressed]), + ?line {ok, Prefix} = ?PRIM_FILE:read(Fd1, length(Prefix)), + ?line Second = lists:duplicate(143-length(Prefix), 0) ++ End, + ?line {ok, Second} = ?PRIM_FILE:read(Fd1, length(Second)), + ?line ok = ?PRIM_FILE:close(Fd1), + + %% Ensure that the file is compressed. + + TotalSize = 143 + length(End), + case ?PRIM_FILE:read_file_info(MyFile) of + {ok, #file_info{size=Size}} when Size < TotalSize -> + ok; + {ok, #file_info{size=Size}} when Size == TotalSize -> + test_server:fail(file_not_compressed) + end, + + %% Write again to ensure that the file is truncated. + + ?line {ok, Fd2} = ?PRIM_FILE:open(MyFile, [write, compressed]), + ?line NewString = "aaaaaaaaaaa", + ?line ok = ?PRIM_FILE:write(Fd2, NewString), + ?line ok = ?PRIM_FILE:close(Fd2), + ?line {ok, Fd3} = ?PRIM_FILE:open(MyFile, [read, compressed]), + ?line {ok, NewString} = ?PRIM_FILE:read(Fd3, 1024), + ?line ok = ?PRIM_FILE:close(Fd3), + + %% Done. + + ?line test_server:timetrap_cancel(Dog), + ok. + +compress_errors(suite) -> []; +compress_errors(doc) -> []; +compress_errors(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line Data = ?config(data_dir, Config), + ?line {error, enoent} = ?PRIM_FILE:open("non_existing__", + [compressed, read]), + ?line {error, einval} = ?PRIM_FILE:open("non_existing__", + [compressed, read, write]), + + %% Read a corrupted .gz file. + + ?line Corrupted = filename:join(Data, "corrupted.gz"), + ?line {ok, Fd} = ?PRIM_FILE:open(Corrupted, [read, compressed]), + ?line {error, eio} = ?PRIM_FILE:read(Fd, 100), + ?line ?PRIM_FILE:close(Fd), + + ?line test_server:timetrap_cancel(Dog), + ok. + +links(doc) -> "Test the link functions."; +links(suite) -> + [make_link_a, make_link_b, + read_link_info_for_non_link, + symlinks_a, symlinks_b]. + +make_link_a(doc) -> "Test creating a hard link."; +make_link_a(suite) -> []; +make_link_a(Config) when is_list(Config) -> + make_link(Config, [], "_a"). + +make_link_b(doc) -> "Test creating a hard link."; +make_link_b(suite) -> []; +make_link_b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = make_link(Config, Handle, "_b"), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +make_link(Config, Handle, Suffix) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_make_link"++Suffix), + ?line ok = ?PRIM_FILE_call(make_dir, Handle, [NewDir]), + + ?line Name = filename:join(NewDir, "a_file"), + ?line ok = ?PRIM_FILE:write_file(Name, "some contents\n"), + + ?line Alias = filename:join(NewDir, "an_alias"), + ?line Result = + case ?PRIM_FILE_call(make_link, Handle, [Name, Alias]) of + {error, enotsup} -> + {skipped, "Links not supported on this platform"}; + ok -> + %% Note: We take the opportunity to test + %% ?PRIM_FILE:read_link_info/1, + %% which should in behave exactly as + %% ?PRIM_FILE:read_file_info/1 + %% since they are not used on symbolic links. + + ?line {ok, Info} = + ?PRIM_FILE_call(read_link_info, Handle, [Name]), + ?line {ok, Info} = + ?PRIM_FILE_call(read_link_info, Handle, [Alias]), + ?line #file_info{links = 2, type = regular} = Info, + ?line {error, eexist} = + ?PRIM_FILE_call(make_link, Handle, [Name, Alias]), + ok + end, + + ?line test_server:timetrap_cancel(Dog), + Result. + +read_link_info_for_non_link(doc) -> + "Test that reading link info for an ordinary file or directory works " + "(on all platforms)."; +read_link_info_for_non_link(suite) -> []; +read_link_info_for_non_link(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + + ?line {ok, #file_info{type=directory}} = ?PRIM_FILE:read_link_info("."), + + ?line test_server:timetrap_cancel(Dog), + ok. + +symlinks_a(doc) -> "Test operations on symbolic links (for Unix)."; +symlinks_a(suite) -> []; +symlinks_a(Config) when is_list(Config) -> + symlinks(Config, [], "_a"). + +symlinks_b(doc) -> "Test operations on symbolic links (for Unix)."; +symlinks_b(suite) -> []; +symlinks_b(Config) when is_list(Config) -> + ?line {ok, Handle} = ?PRIM_FILE:start(), + Result = symlinks(Config, Handle, "_b"), + ?line ok = ?PRIM_FILE:stop(Handle), + Result. + +symlinks(Config, Handle, Suffix) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE) + ++"_make_symlink"++Suffix), + ?line ok = ?PRIM_FILE_call(make_dir, Handle, [NewDir]), + + ?line Name = filename:join(NewDir, "a_plain_file"), + ?line ok = ?PRIM_FILE:write_file(Name, "some stupid content\n"), + + ?line Alias = filename:join(NewDir, "a_symlink_alias"), + ?line Result = + case ?PRIM_FILE_call(make_symlink, Handle, [Name, Alias]) of + {error, enotsup} -> + {skipped, "Links not supported on this platform"}; + ok -> + ?line {ok, Info1} = + ?PRIM_FILE_call(read_file_info, Handle, [Name]), + ?line {ok, Info1} = + ?PRIM_FILE_call(read_file_info, Handle, [Alias]), + ?line {ok, Info1} = + ?PRIM_FILE_call(read_link_info, Handle, [Name]), + ?line #file_info{links = 1, type = regular} = Info1, + + ?line {ok, Info2} = + ?PRIM_FILE_call(read_link_info, Handle, [Alias]), + ?line #file_info{links=1, type=symlink} = Info2, + ?line {ok, Name} = + ?PRIM_FILE_call(read_link, Handle, [Alias]), + ok + end, + + ?line test_server:timetrap_cancel(Dog), + Result. + +%% Creates as many files as possible during a certain time, +%% periodically calls list_dir/2 to check if it works, +%% then deletes all files. + +list_dir_limit(doc) -> + "Tests if large directories can be read"; +list_dir_limit(suite) -> + []; +list_dir_limit(Config) when is_list(Config) -> + ?line MaxTime = 120, + ?line MaxNumber = 20000, + ?line Dog = test_server:timetrap( + test_server:seconds(2*MaxTime + MaxTime)), + ?line RootDir = ?config(priv_dir, Config), + ?line NewDir = filename:join(RootDir, + atom_to_list(?MODULE)++"_list_dir_limit"), + ?line {ok, Handle1} = ?PRIM_FILE:start(), + ?line ok = ?PRIM_FILE_call(make_dir, Handle1, [NewDir]), + Ref = erlang:start_timer(MaxTime*1000, self(), []), + ?line Result = list_dir_limit_loop(NewDir, Handle1, Ref, MaxNumber, 0), + ?line Time = case erlang:cancel_timer(Ref) of + false -> MaxTime; + T -> MaxTime - (T div 1000) + end, + ?line Number = case Result of + {ok, N} -> N; + {error, _Reason, N} -> N; + _ -> 0 + end, + ?line {ok, Handle2} = ?PRIM_FILE:start(), + ?line list_dir_limit_cleanup(NewDir, Handle2, Number, 0), + ?line ok = ?PRIM_FILE:stop(Handle1), + ?line ok = ?PRIM_FILE:stop(Handle2), + ?line {ok, Number} = Result, + ?line test_server:timetrap_cancel(Dog), + {comment, + "Created " ++ integer_to_list(Number) ++ " files in " + ++ integer_to_list(Time) ++ " seconds."}. + +list_dir_limit_loop(Dir, Handle, _Ref, N, Cnt) when Cnt >= N -> + list_dir_check(Dir, Handle, Cnt); +list_dir_limit_loop(Dir, Handle, Ref, N, Cnt) -> + receive + {timeout, Ref, []} -> + list_dir_check(Dir, Handle, Cnt) + after 0 -> + Name = integer_to_list(Cnt), + case ?PRIM_FILE:write_file(filename:join(Dir, Name), Name) of + ok -> + Next = Cnt + 1, + case Cnt rem 100 of + 0 -> + case list_dir_check(Dir, Handle, Next) of + {ok, Next} -> + list_dir_limit_loop( + Dir, Handle, Ref, N, Next); + Other -> + Other + end; + _ -> + list_dir_limit_loop(Dir, Handle, Ref, N, Next) + end; + {error, Reason} -> + {error, Reason, Cnt} + end + end. + +list_dir_check(Dir, Handle, Cnt) -> + case ?PRIM_FILE:list_dir(Handle, Dir) of + {ok, ListDir} -> + case length(ListDir) of + Cnt -> + {ok, Cnt}; + X -> + {error, + {wrong_nof_files, X, ?LINE}, + Cnt} + end; + {error, Reason} -> + {error, Reason, Cnt} + end. + +%% Deletes N files while ignoring errors, then continues deleting +%% as long as they exist. + +list_dir_limit_cleanup(Dir, Handle, N, Cnt) when Cnt >= N -> + Name = integer_to_list(Cnt), + case ?PRIM_FILE:delete(Handle, filename:join(Dir, Name)) of + ok -> + list_dir_limit_cleanup(Dir, Handle, N, Cnt+1); + _ -> + ok + end; +list_dir_limit_cleanup(Dir, Handle, N, Cnt) -> + Name = integer_to_list(Cnt), + ?PRIM_FILE:delete(Handle, filename:join(Dir, Name)), + list_dir_limit_cleanup(Dir, Handle, N, Cnt+1). + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/ram_file_SUITE_data/corrupted.gz erlang-13.b.3-dfsg/lib/kernel/test/ram_file_SUITE_data/corrupted.gz --- erlang-13.b.1-dfsg/lib/kernel/test/ram_file_SUITE_data/corrupted.gz 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/ram_file_SUITE_data/corrupted.gz 2001-10-08 09:53:41.000000000 +0100 @@ -0,0 +1,5 @@ +‹ +========================================== +This file has a correct GZIP magic ID, but the rest of the +header is corrupt. Reading this file should result in an +error. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/ram_file_SUITE_data/corrupted.uu erlang-13.b.3-dfsg/lib/kernel/test/ram_file_SUITE_data/corrupted.uu --- erlang-13.b.1-dfsg/lib/kernel/test/ram_file_SUITE_data/corrupted.uu 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/ram_file_SUITE_data/corrupted.uu 2001-10-08 09:53:43.000000000 +0100 @@ -0,0 +1,528 @@ +M/%1)5$Q%/E)E86P@4')O9W)A;6UE" V +M-S,\8G(^"C(U,3$W(%,N5RX@4&%R:W=A>3QB"%G6]U('5N9&5RF5D(&UI8W)O=V%V92!O=F5N65A65RF4@=VAY(&ET('=O=6QD(&)E(&$@;6ES=&%K92!T +M;R!R97!L86-E('1H92!296%L"E!R;V=R86UM97)S(&]N('1H96ER('-T869F +M('=I=&@@,3(@>65A6]U('!R;VYO=6YC92!Y;W5R(&YA;64_(CPO14T^+B!( +M92!R97!L:65D"CQ%33XB66]U(&-A;B!E:71H97(@8V%L;"!M92!B>2!N86UE +M+"!P2!296%L(%!R;V=R86UM97)S(&ES(&-A;&PM8GDM=F%L +M=64M2!H87!P>2!W:71H(&$@:V5Y<'5N8V@L +M(&$@1D]25%)!3B!)5B!C;VUP:6QE&%C=&QY"G=H:6-H(&-O;G-T&%M<&QE2!N;W0@96YO=6=H(&]F(&%N(&5X86UP;&4@=&\* +M8V]N=FEN8V4@86YY;VYE+B @5VAE;B!)(&=O="!O=70@;V8@2!F:7)S="!T87-K(&EN('1H92!296%L(%=O2!A(&9A8W1O0I2 +M96%L(%!R;V=R86UM97(@=VEL;"!T96QL('EO=2!T:&%T(&%L;"!T:&4@4W1R +M=6-T=7)E9"!#;V1I;F<@:6X@=&AE"G=O6]U('-O +M;'9E(&$@<')O8FQE;2!L:6ME('1H870@+2T@:70@=&%K97,@86-T=6%L"G1A +M;&5N="X@4V]M92!Q=6EC:R!O8G-E2!U +M2X@4W1R:6YG2!A('1O>2!O<&5R871I;F<@7!I8V%L(%5N +M:7@@:&%C:V5R"FYE=F5R(&-A;B!R96UE;6)E2!O=71S=&%N9&EN9R!P"!C86QC=6QA=&]R+B H22!H +M879E"F%C='5A;&QY('-E96X@=&AI2!R96UA7-T96TN($ET)W,@<&]S +M7,@;V8@=V]R:R!W:71H(&$@7-T96T@ +M=&AA="!R=6YS(&]N($]3+S,W,"P@8G5T(&%F=&5R(&-A7!I8V%L(%)E86P@4')O9W)A;6UE<@IK +M;F5W('1H92!E;G1I2!M96UO65D(&)Y(&AI2 M+2!I="!D:61N)W0@9V\@87=A>2!W:&5N('1H92!P;W=E0IE:71H97(@9F]R9V5T2!)('-U<&5R8V]M<'5T97(@86YD(&UO2!T;V=G;&5D('1H92!F:7)S="!O<&5R871I +M;F<@7-T96US('!R;V=R86UM97(@9F]R(%1E>&%S"DEN2P@:&4@9V]T(&$@;&]N9R!D:7-T86YC92!C86QL(&9R;VT@ +M82!U"!0 +M86QO($%L=&\@4F5S96%R8V@@0V5N=&5R(&9O7-T96T@:7,@8V%L;&5D(%-M86QL5&%L:RP@86YD +M('=O=6QD"F-E2!N;W0@=&%L:R!T;R!T:&4@8V]M<'5T97(@=VET +M:"!A(&UO=7-E+B \4#X*"E-O;64@;V8@=&AE(&-O;F-E<'1S(&EN('1H97-E +M(%AE7!E('EO=7(@;F%M92!I;B!A2!S=&EF;&4@8W)E871I=FET>2P*9&5S=')O>2!M;W-T(&]F +M('1H92!I;G1E7-T +M96T@8V]D92!W:71H(&YE9V%T:79E"G-U8G-C7!I8V%L(%)E86P@4')O9W)A;6UE2!O9B!T:&4@969F +M;W)T2P@9&5C;V1I;F<*4G5S2!I;B!#86QI9F]R;FEA+B!-86YY(&]F +M('1H96T@:VYO=R!T:&4@96YT:7)E"F]P97)A=&EN9R!S>7-T96T@;V8@=&AE +M(%!I;VYE97(@86YD(%9O>6%G97(@2!H96%R="X@5VET +M: IA(&-O;6)I;F%T:6]N(&]F(&QA2!P;&%C960@475I8VAE($5A=&5R7!E"P@:6YC;'5D97,@;65T:&]D +M2!L86YG=6%G92X@/% ^"@I4:&4@0IT:6UE.B!N;R!C:&%L;&%N9V4@:6X@=&AA="XI("!%=F5R>6]N92!W;W)K +M:6YG(&%T($QU8V%S1FEL;2!I65T+B @3VX@ +M=&AE(&]T:&5R(&AA;F0L(&%L; I#;VUP=71E7,@=&AE('-A;64@=V%Y(&AE('=O2!A;6%Z960@=&AA="!H:7,@ +M96UP;&]Y97(@86-T=6%L;'D@<&%Y7=A>2P@86QT:&]U9V@@:&4@:7,*8V%R +M969U;"!N;W0@=&\@97AP2P@=&AE(%)E86P*4')O9W)A;6UE2!F7-T96T@6EN9R \14T^(E!O;W(*1V5O2!S=&]R92P@=&AE(%)E86P@4')O9W)A;6UE7!U;F-H(&]P97)A=&]R7!I8V%L(%)E86P@4')O9W)A;6UE2P@=&AE0IC86XG="!G +M970@86YY('=O&-U2!S=&]R97,@87)E +M;B=T"F]F=&5N(&]P96X@870@,R!A+FTN+"!S;R!T:&5Y('-U6]N90IG7,@8V%N +M(&1O(&AE>"!A'0@961I=&]R2!O<&5R871I;F<@0IO9B!5;FEX(&AA8VME"!M:6=H="!N;W0@8F4@87,@8F%D(&]N(%)E86P@4')O9W)A;6UE +M7-T96T@=V]R +M=&AY"F]F(&%N>2!296%L(%!R;V=R86UM97(N($ET(&AA7!E(&-H96-K:6YG+"!V87)I86)L92!N86UE6]U;F<@;65N(&%N9"!W;VUE;BX@($%S(&QO;F<@87,@=&AE +M2!O9B!(86-K:6YG/"]E;3XL(%-C:65N8V4@.#(L(%9O;'5M92 S +M+"!.=6UB97(@.2P*(" @(" @($YO=F5M8F5R(#$Y.#(L('!A9V5S(#4X("T@ +M-C8N(#Q0/@H*6SA=(" @(%1H92!(86-K97(@4&%P97)S+" \96T^4'-Y8VAO +M;&]G>2!4;V1A>3PO96T^+"!!=6=U2P@,3DX,RP@<' N(#(V,RTR-C4N(#Q0 +M/@H*/&AR/@H*/$%$1%)%4U,^(#QA(&AR968](FEN9&5X+FAT;6PB/DAA8VME +MReal Programmers Don't Use PASCAL + +

    Real Programmers Don't Use PASCAL

    + +

    Ed Post
    +Graphic Software Systems
    + +P.O. Box 673
    +25117 S.W. Parkway
    +Wilsonville, OR 97070
    +Copyright (c) 1982
    +

    + + +

    (decvax | ucbvax | cbosg | pur-ee | lbl-unix)!teklabs!ogcvax!gss1144!evp

    + + +Back in the good old days -- the "Golden Era" of computers, it was +easy to separate the men from the boys (sometimes called "Real Men" +and "Quiche Eaters" in the literature). During this period, the Real +Men were the ones that understood computer programming, and the Quiche +Eaters were the ones that didn't. A real computer programmer said +things like "DO 10 I=1,10" and "ABEND" (they +actually talked in capital letters, you understand), and the rest of +the world said things like "computers are too complicated for +me" and "I can't relate to computers -- they're so +impersonal". (A previous work [1] points out that Real Men don't +"relate" to anything, and aren't afraid of being impersonal.)

    + +But, as usual, times change. We are faced today with a world in which +little old ladies can get computerized microwave ovens, 12 year old +kids can blow Real Men out of the water playing Asteroids and Pac-Man, +and anyone can buy and even understand their very own Personal +Computer. The Real Programmer is in danger of becoming extinct, of +being replaced by high-school students with TRASH-80s!

    + +There is a clear need to point out the differences between the typical +high-school junior Pac-Man player and a Real Programmer. Understanding +these differences will give these kids something to aspire to -- a +role model, a Father Figure. It will also help employers of Real +Programmers to realize why it would be a mistake to replace the Real +Programmers on their staff with 12 year old Pac-Man players (at a +considerable salary savings).

    + + +

    LANGUAGES

    + +The easiest way to tell a Real Programmer from the crowd is by the +programming language he (or she) uses. Real Programmers use FORTRAN. +Quiche Eaters use PASCAL. Nicklaus Wirth, the designer of PASCAL, was +once asked, "How do you pronounce your name?". He replied +"You can either call me by name, pronouncing it 'Veert', or call +me by value, 'Worth'." One can tell immediately from this comment +that Nicklaus Wirth is a Quiche Eater. The only parameter passing +mechanism endorsed by Real Programmers is call-by-value-return, as +implemented in the IBM/370 FORTRAN G and H compilers. Real +programmers don't need abstract concepts to get their jobs done: they +are perfectly happy with a keypunch, a FORTRAN IV compiler, and a +beer.

    + +

      +
    • Real Programmers do List Processing in FORTRAN. + +
    • Real Programmers do String Manipulation in FORTRAN. + +
    • Real Programmers do Accounting (if they do it at all) in FORTRAN. + +
    • Real Programmers do Artificial Intelligence programs in FORTRAN. +

    + +If you can't do it in FORTRAN, do it in assembly language. If you can't do +it in assembly language, it isn't worth doing.

    + + +

    STRUCTURED PROGRAMMING

    + +Computer science academicians have gotten into the "structured pro- +gramming" rut over the past several years. They claim that programs +are more easily understood if the programmer uses some special +language constructs and techniques. They don't all agree on exactly +which constructs, of course, and the examples they use to show their +particular point of view invariably fit on a single page of some +obscure journal or another -- clearly not enough of an example to +convince anyone. When I got out of school, I thought I was the best +programmer in the world. I could write an unbeatable tic-tac-toe +program, use five different computer languages, and create 1000 line +programs that WORKED. (Really!) Then I got out into the Real +World. My first task in the Real World was to read and understand a +200,000 line FORTRAN program, then speed it up by a factor of two. Any +Real Programmer will tell you that all the Structured Coding in the +world won't help you solve a problem like that -- it takes actual +talent. Some quick observations on Real Programmers and Structured +Programming:

    + +

      +
    • Real Programmers aren't afraid to use GOTOs. + +
    • Real Programmers can write five page long DO loops without +getting confused. + +
    • Real Programmers enjoy Arithmetic IF statements because they make +the code more interesting. + +
    • Real Programmers write self-modifying code, especially if it +saves them 20 nanoseconds in the middle of a tight loop. + +
    • Programmers don't need comments: the code is obvious. + +
    • Since FORTRAN doesn't have a structured IF, REPEAT +... UNTIL, or CASE statement, Real Programmers don't +have to worry about not using them. Besides, they can be simulated +when necessary using assigned GOTOs. + +

    + +Data structures have also gotten a lot of press lately. Abstract Data +Types, Structures, Pointers, Lists, and Strings have become popular in +certain circles. Wirth (the above-mentioned Quiche Eater) actually +wrote an entire book [2] contending that you could write a program +based on data structures, instead of the other way around. As all Real +Programmers know, the only useful data structure is the +array. Strings, lists, structures, sets -- these are all special cases +of arrays and and can be treated that way just as easily without +messing up your programing language with all sorts of +complications. The worst thing about fancy data types is that you have +to declare them, and Real Programming Languages, as we all know, have +implicit typing based on the first letter of the (six character) +variable name.

    + + +

    OPERATING SYSTEMS

    + +What kind of operating system is used by a Real Programmer? CP/M? God +forbid -- CP/M, after all, is basically a toy operating system. Even +little old ladies and grade school students can understand and use +CP/M.

    + +Unix is a lot more complicated of course -- the typical Unix hacker +never can remember what the PRINT command is called this +week -- but when it gets right down to it, Unix is a glorified video +game. People don't do Serious Work on Unix systems: they send jokes +around the world on USENET and write adventure games and research +papers.

    + +No, your Real Programmer uses OS/370. A good programmer can find and +understand the description of the IJK305I error he just got in his JCL +manual. A great programmer can write JCL without referring to the +manual at all. A truly outstanding programmer can find bugs buried in +a 6 megabyte core dump without using a hex calculator. (I have +actually seen this done.)

    + +OS/370 is a truly remarkable operating system. It's possible to des- +troy days of work with a single misplaced space, so alertness in the +programming staff is encouraged. The best way to approach the system +is through a keypunch. Some people claim there is a Time Sharing +system that runs on OS/370, but after careful study I have come to the +conclusion that they are mistaken.

    + + +

    PROGRAMMING TOOLS

    + +What kind of tools does a Real Programmer use? In theory, a Real +Programmer could run his programs by keying them into the front panel +of the computer. Back in the days when computers had front panels, +this was actually done occasionally. Your typical Real Programmer +knew the entire bootstrap loader by memory in hex, and toggled it in +whenever it got destroyed by his program. (Back then, memory was +memory -- it didn't go away when the power went off. Today, memory +either forgets things when you don't want it to, or remembers things +long after they're better forgotten.) Legend has it that Seymour +Cray, inventor of the Cray I supercomputer and most of Control Data's +computers, actually toggled the first operating system for the CDC7600 +in on the front panel from memory when it was first powered +on. Seymour, needless to say, is a Real Programmer.

    + +One of my favorite Real Programmers was a systems programmer for Texas +Instruments. One day, he got a long distance call from a user whose +system had crashed in the middle of some important work. Jim was able +to repair the damage over the phone, getting the user to toggle in +disk I/O instructions at the front panel, repairing system tables in +hex, reading register contents back over the phone. The moral of this +story: while a Real Programmer usually includes a keypunch and +lineprinter in his toolkit, he can get along with just a front panel +and a telephone in emergencies.

    + +In some companies, text editing no longer consists of ten engineers +standing in line to use an 029 keypunch. In fact, the building I work +in doesn't contain a single keypunch. The Real Programmer in this +situation has to do his work with a text editor program. Most systems +supply several text editors to select from, and the Real Programmer +must be careful to pick one that reflects his personal style. Many +people believe that the best text editors in the world were written at +Xerox Palo Alto Research Center for use on their Alto and Dorado +computers [3]. Unfortunately, no Real Programmer would ever use a +computer whose operating system is called SmallTalk, and would +certainly not talk to the computer with a mouse.

    + +Some of the concepts in these Xerox editors have been incorporated +into editors running on more reasonably named operating systems. EMACS +and VI are probably the most well known of this class of editors. The +problem with these editors is that Real Programmers consider "what you +see is what you get" to be just as bad a concept in text editors as it +is in women. No, the Real Programmer wants a "you asked for it, you +got it" text editor -- complicated, cryptic, powerful, unforgiving, +dangerous. TECO, to be precise.

    + +It has been observed that a TECO command sequence more closely resem- +bles transmission line noise than readable text [4]. One of the more +entertaining games to play with TECO is to type your name in as a +command line and try to guess what it does. Just about any possible +typing error while talking with TECO will probably destroy your +program, or even worse -- introduce subtle and mysterious bugs in a +once working subroutine.

    + +For this reason, Real Programmers are reluctant to actually edit a +program that is close to working. They find it much easier to just +patch the binary object code directly, using a wonderful program +called SUPERZAP (or its equivalent on non-IBM machines). This works so +well that many working programs on IBM systems bear no relation to +the original FORTRAN code. In many cases, the original source code is +no longer available. When it comes time to fix a program like this, no +manager would even think of sending anything less than a Real +Programmer to do the job -- no Quiche Eating structured programmer +would even know where to start. This is called "job security".

    + +Some programming tools NOT used by Real Programmers:

    +

      + +
    • FORTRAN preprocessors like MORTRAN and RATFOR. The Cuisinarts of +programming -- great for making Quiche. See comments above on +structured programming. + +
    • Source language debuggers. Real Programmers can read core dumps. + +
    • Compilers with array bounds checking. They stifle creativity, +destroy most of the interesting uses for EQUIVALENCE, and make it +impossible to modify the operating system code with negative +subscripts. Worst of all, bounds checking is inefficient. + +
    • Source code maintainance systems. A Real Programmer keeps his +code locked up in a card file, because it implies that its owner +cannot leave his important programs unguarded [5]. + +

    + + +

    THE REAL PROGRAMMER AT WORK

    + +Where does the typical Real Programmer work? What kind of programs are +worthy of the efforts of so talented an individual? You can be sure +that no real Programmer would be caught dead writing +accounts-receivable programs in COBOL, or sorting mailing lists for +People magazine. A Real Programmer wants tasks of earth-shaking +importance (literally!):

    + +

      + +
    • Real Programmers work for Los Alamos National Laboratory, writing +atomic bomb simulations to run on Cray I supercomputers. + +
    • Real Programmers work for the National Security Agency, decoding +Russian transmissions. + +
    • It was largely due to the efforts of thousands of Real +Programmers working for NASA that our boys got to the moon and back +before the cosmonauts. + +
    • The computers in the Space Shuttle were programmed by Real +Programmers. + +
    • Programmers are at work for Boeing designing the operating +systems for cruise missiles. + +

    + +Some of the most awesome Real Programmers of all work at the Jet Pro- +pulsion Laboratory in California. Many of them know the entire +operating system of the Pioneer and Voyager spacecraft by heart. With +a combination of large ground-based FORTRAN programs and small +spacecraft-based assembly language programs, they can to do incredible +feats of navigation and improvisation, such as hitting ten-kilometer +wide windows at Saturn after six years in space, and repairing or +bypassing damaged sensor platforms, radios, and batteries. Allegedly, +one Real Programmer managed to tuck a pattern-matching program into a +few hundred bytes of unused memory in a Voyager spacecraft that +searched for, located, and photographed a new moon of Jupiter.

    + +One plan for the upcoming Galileo spacecraft mission is to use a grav- +ity assist trajectory past Mars on the way to Jupiter. This trajectory +passes within 80 +/- 3 kilometers of the surface of Mars. Nobody is +going to trust a PASCAL program (or PASCAL programmer) for navigation +to these tolerances.

    + +As you can tell, many of the world's Real Programmers work for the +U.S. Government, mainly the Defense Department. This is as it should +be. Recently, however, a black cloud has formed on the Real +Programmer horizon.

    + +It seems that some highly placed Quiche Eaters at the Defense +Department decided that all Defense programs should be written in some +grand unified language called "ADA" (registered trademark, DoD). For +a while, it seemed that ADA was destined to become a language that +went against all the precepts of Real Programming -- a language with +structure, a language with data types, strong typing, and +semicolons. In short, a language designed to cripple the creativity of +the typical Real Programmer. Fortunately, the language adopted by DoD +has enough interesting features to make it approachable: it's +incredibly complex, includes methods for messing with the operating +system and rearranging memory, and Edsgar Dijkstra doesn't like it +[6]. (Dijkstra, as I'm sure you know, was the author of "GoTos +Considered Harmful" -- a landmark work in programming +methodology, applauded by Pascal Programmers and Quiche Eaters alike.) +Besides, the determined Real Programmer can write FORTRAN programs in +any language.

    + +The real programmer might compromise his principles and work on some- +thing slightly more trivial than the destruction of life as we know +it, providing there's enough money in it. There are several Real +Programmers building video games at Atari, for example. (But not +playing them. A Real Programmer knows how to beat the machine every +time: no challange in that.) Everyone working at LucasFilm is a Real +Programmer. (It would be crazy to turn down the money of 50 million +Star Wars fans.) The proportion of Real Programmers in Computer +Graphics is somewhat lower than the norm, mostly because nobody has +found a use for Computer Graphics yet. On the other hand, all +Computer Graphics is done in FORTRAN, so there are a fair number +people doing Graphics in order to avoid having to write COBOL +programs.

    + + +

    THE REAL PROGRAMMER AT PLAY

    + +Generally, the Real Programmer plays the same way he works -- with +computers. He is constantly amazed that his employer actually pays +him to do what he would be doing for fun anyway, although he is +careful not to express this opinion out loud. Occasionally, the Real +Programmer does step out of the office for a breath of fresh air and a +beer or two. Some tips on recognizing real programmers away from the +computer room:

    +

      + +
    • At a party, the Real Programmers are the ones in the corner +talking about operating system security and how to get around it. + +
    • At a football game, the Real Programmer is the one comparing the +plays against his simulations printed on 11 by 14 fanfold paper. + +
    • At the beach, the Real Programmer is the one drawing flowcharts +in the sand. + +
    • A Real Programmer goes to a disco to watch the light show. + +
    • At a funeral, the Real Programmer is the one saying "Poor +George. And he almost had the sort routine working before the +coronary." + +
    • In a grocery store, the Real Programmer is the one who insists on +running the cans past the laser checkout scanner himself, because he +never could trust keypunch operators to get it right the first time. + +

    + + +

    THE REAL PROGRAMMER'S NATURAL HABITAT

    + +What sort of environment does the Real Programmer function best in? +This is an important question for the managers of Real +Programmers. Considering the amount of money it costs to keep one on +the staff, it's best to put him (or her) in an environment where he +can get his work done.

    + +The typical Real Programmer lives in front of a computer terminal. +Surrounding this terminal are:

    +

      + +
    • Listings of all programs the Real Programmer has ever worked on, +piled in roughly chronological order on every flat surface in the office. + +
    • Some half-dozen or so partly filled cups of cold +coffee. Occasionally, there will be cigarette butts floating in the +coffee. In some cases, the cups will contain Orange Crush. + +
    • Unless he is very good, there will be copies of the OS JCL manual +and the Principles of Operation open to some particularly interesting +pages. + +
    • Taped to the wall is a line-printer Snoopy calender for the year +1969. + +
    • Strewn about the floor are several wrappers for peanut butter +filled cheese bars (the type that are made stale at the bakery so they +can't get any worse while waiting in the vending machine). + +
    • Hiding in the top left-hand drawer of the desk is a stash of +double stuff Oreos for special occasions. + +
    • Underneath the Oreos is a flow-charting template, left there by +the previous occupant of the office. (Real Programmers write programs, +not documentation. Leave that to the maintainence people.) + +

    + +The Real Programmer is capable of working 30, 40, even 50 hours at a +stretch, under intense pressure. In fact, he prefers it that way. Bad +response time doesn't bother the Real Programmer -- it gives him a +chance to catch a little sleep between compiles. If there is not +enough schedule pressure on the Real Programmer, he tends to make +things more challenging by working on some small but interesting part +of the problem for the first nine weeks, then finishing the rest in +the last week, in two or three 50-hour marathons. This not only +inpresses his manager, who was despairing of ever getting the project +done on time, but creates a convenient excuse for not doing the +documentation. In general:

    + +

      + +
    • No Real Programmer works 9 to 5. (Unless it's 9 in the evening to +5 in the morning.) + +
    • Real Programmers don't wear neckties. + +
    • Real Programmers don't wear high heeled shoes. + +
    • Real Programmers arrive at work in time for lunch. [9] + +
    • A Real Programmer might or might not know his wife's name. He +does, however, know the entire ASCII (or EBCDIC) code table. + +
    • Real Programmers don't know how to cook. Grocery stores aren't +often open at 3 a.m., so they survive on Twinkies and coffee. + +

    + +

    THE FUTURE

    + +What of the future? It is a matter of some concern to Real Programmers +that the latest generation of computer programmers are not being +brought up with the same outlook on life as their elders. Many of them +have never seen a computer with a front panel. Hardly anyone +graduating from school these days can do hex arithmetic without a +calculator. College graduates these days are soft -- protected from +the realities of programming by source level debuggers, text editors +that count parentheses, and user friendly operating systems. Worst of +all, some of these alleged computer scientists manage to get degrees +without ever learning FORTRAN! Are we destined to become an industry +of Unix hackers and Pascal programmers?

    + +On the contrary. From my experience, I can only report that the +future is bright for Real Programmers everywhere. Neither OS/370 nor +FORTRAN show any signs of dying out, despite all the efforts of +Pascal programmers the world over. Even more subtle tricks, like +adding structured coding constructs to FORTRAN have failed. Oh sure, +some computer vendors have come out with FORTRAN 77 compilers, but +every one of them has a way of converting itself back into a FORTRAN +66 compiler at the drop of an option card -- to compile DO loops like +God meant them to be.

    + +Even Unix might not be as bad on Real Programmers as it once was. The +latest release of Unix has the potential of an operating system worthy +of any Real Programmer. It has two different and subtly incompatible +user interfaces, an arcane and complicated terminal driver, virtual +memory. If you ignore the fact that it's structured, even C +programming can be appreciated by the Real Programmer: after all, +there's no type checking, variable names are seven (ten? eight?) +characters long, and the added bonus of the Pointer data type is +thrown in. It's like having the best parts of FORTRAN and assembly +language in one place. (Not to mention some of the more creative uses +for #define.)

    + +No, the future isn't all that bad. Why, in the past few years, the +popular press has even commented on the bright new crop of computer +nerds and hackers ([7] and [8]) leaving places like Stanford and +M.I.T. for the Real World. From all evidence, the spirit of Real +Programming lives on in these young men and women. As long as there +are ill-defined goals, bizarre bugs, and unrealistic schedules, there +will be Real Programmers willing to jump in and Solve The Problem, +saving the documentation for later. Long live FORTRAN!

    + +

    ACKNOWLEGEMENT

    + +I would like to thank Jan E., Dave S., Rich G., Rich E. for their help +in characterizing the Real Programmer, Heather B. for the +illustration, Kathy E. for putting up with it, and atd!avsdS:mark for +the initial inspriration.

    + +

    REFERENCES

    + +[1] Feirstein, B., Real Men Don't Eat Quiche, New York, + Pocket Books, 1982.

    + +[2] Wirth, N., Algorithms + Datastructures = Programs, + Prentice Hall, 1976.

    + +[3] Xerox PARC editors . . .

    + +[4] Finseth, C., Theory and Practice of Text Editors - + or - a Cookbook for an EMACS, B.S. Thesis, + MIT/LCS/TM-165, Massachusetts Institute of Technology, + May 1980.

    + +[5] Weinberg, G., The Psychology of Computer Programming, + New York, Van Nostrabd Reinhold, 1971, page 110.

    + +[6] Dijkstra, E., On the GREEN Language Submitted to the DoD, + Sigplan notices, Volume 3, Number 10, October 1978.

    + +[7] Rose, Frank, Joy of Hacking, Science 82, Volume 3, Number 9, + November 1982, pages 58 - 66.

    + +[8] The Hacker Papers, Psychology Today, August 1980.

    + +[9] Datamation, July, 1983, pp. 263-265.

    + +


    + +
    Hacker's Wisdom/ Real Programmers +Don't Use PASCAL
    + + +Last modified: Wed Mar 27 17:48:50 EST 1996 Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/kernel/test/ram_file_SUITE_data/realmen.html.gz and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/kernel/test/ram_file_SUITE_data/realmen.html.gz differ diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/ram_file_SUITE_data/realmen.html.uu erlang-13.b.3-dfsg/lib/kernel/test/ram_file_SUITE_data/realmen.html.uu --- erlang-13.b.1-dfsg/lib/kernel/test/ram_file_SUITE_data/realmen.html.uu 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/ram_file_SUITE_data/realmen.html.uu 2001-10-08 09:53:50.000000000 +0100 @@ -0,0 +1,529 @@ +M/%1)5$Q%/E)E86P@4')O9W)A;6UE" V +M-S,\8G(^"C(U,3$W(%,N5RX@4&%R:W=A>3QB"%G6]U('5N9&5RF5D(&UI8W)O=V%V92!O=F5N65A65RF4@=VAY(&ET('=O=6QD(&)E(&$@;6ES=&%K92!T +M;R!R97!L86-E('1H92!296%L"E!R;V=R86UM97)S(&]N('1H96ER('-T869F +M('=I=&@@,3(@>65A6]U('!R;VYO=6YC92!Y;W5R(&YA;64_(CPO14T^+B!( +M92!R97!L:65D"CQ%33XB66]U(&-A;B!E:71H97(@8V%L;"!M92!B>2!N86UE +M+"!P2!296%L(%!R;V=R86UM97)S(&ES(&-A;&PM8GDM=F%L +M=64M2!H87!P>2!W:71H(&$@:V5Y<'5N8V@L +M(&$@1D]25%)!3B!)5B!C;VUP:6QE&%C=&QY"G=H:6-H(&-O;G-T&%M<&QE2!N;W0@96YO=6=H(&]F(&%N(&5X86UP;&4@=&\* +M8V]N=FEN8V4@86YY;VYE+B @5VAE;B!)(&=O="!O=70@;V8@2!F:7)S="!T87-K(&EN('1H92!296%L(%=O2!A(&9A8W1O0I2 +M96%L(%!R;V=R86UM97(@=VEL;"!T96QL('EO=2!T:&%T(&%L;"!T:&4@4W1R +M=6-T=7)E9"!#;V1I;F<@:6X@=&AE"G=O6]U('-O +M;'9E(&$@<')O8FQE;2!L:6ME('1H870@+2T@:70@=&%K97,@86-T=6%L"G1A +M;&5N="X@4V]M92!Q=6EC:R!O8G-E2!U +M2X@4W1R:6YG2!A('1O>2!O<&5R871I;F<@7!I8V%L(%5N +M:7@@:&%C:V5R"FYE=F5R(&-A;B!R96UE;6)E2!O=71S=&%N9&EN9R!P"!C86QC=6QA=&]R+B H22!H +M879E"F%C='5A;&QY('-E96X@=&AI2!R96UA7-T96TN($ET)W,@<&]S +M7,@;V8@=V]R:R!W:71H(&$@7-T96T@ +M=&AA="!R=6YS(&]N($]3+S,W,"P@8G5T(&%F=&5R(&-A7!I8V%L(%)E86P@4')O9W)A;6UE<@IK +M;F5W('1H92!E;G1I2!M96UO65D(&)Y(&AI2 M+2!I="!D:61N)W0@9V\@87=A>2!W:&5N('1H92!P;W=E0IE:71H97(@9F]R9V5T2!)('-U<&5R8V]M<'5T97(@86YD(&UO2!T;V=G;&5D('1H92!F:7)S="!O<&5R871I +M;F<@7-T96US('!R;V=R86UM97(@9F]R(%1E>&%S"DEN2P@:&4@9V]T(&$@;&]N9R!D:7-T86YC92!C86QL(&9R;VT@ +M82!U"!0 +M86QO($%L=&\@4F5S96%R8V@@0V5N=&5R(&9O7-T96T@:7,@8V%L;&5D(%-M86QL5&%L:RP@86YD +M('=O=6QD"F-E2!N;W0@=&%L:R!T;R!T:&4@8V]M<'5T97(@=VET +M:"!A(&UO=7-E+B \4#X*"E-O;64@;V8@=&AE(&-O;F-E<'1S(&EN('1H97-E +M(%AE7!E('EO=7(@;F%M92!I;B!A2!S=&EF;&4@8W)E871I=FET>2P*9&5S=')O>2!M;W-T(&]F +M('1H92!I;G1E7-T +M96T@8V]D92!W:71H(&YE9V%T:79E"G-U8G-C7!I8V%L(%)E86P@4')O9W)A;6UE2!O9B!T:&4@969F +M;W)T2P@9&5C;V1I;F<*4G5S2!I;B!#86QI9F]R;FEA+B!-86YY(&]F +M('1H96T@:VYO=R!T:&4@96YT:7)E"F]P97)A=&EN9R!S>7-T96T@;V8@=&AE +M(%!I;VYE97(@86YD(%9O>6%G97(@2!H96%R="X@5VET +M: IA(&-O;6)I;F%T:6]N(&]F(&QA2!P;&%C960@475I8VAE($5A=&5R7!E"P@:6YC;'5D97,@;65T:&]D +M2!L86YG=6%G92X@/% ^"@I4:&4@0IT:6UE.B!N;R!C:&%L;&%N9V4@:6X@=&AA="XI("!%=F5R>6]N92!W;W)K +M:6YG(&%T($QU8V%S1FEL;2!I65T+B @3VX@ +M=&AE(&]T:&5R(&AA;F0L(&%L; I#;VUP=71E7,@=&AE('-A;64@=V%Y(&AE('=O2!A;6%Z960@=&AA="!H:7,@ +M96UP;&]Y97(@86-T=6%L;'D@<&%Y7=A>2P@86QT:&]U9V@@:&4@:7,*8V%R +M969U;"!N;W0@=&\@97AP2P@=&AE(%)E86P*4')O9W)A;6UE2!F7-T96T@6EN9R \14T^(E!O;W(*1V5O2!S=&]R92P@=&AE(%)E86P@4')O9W)A;6UE7!U;F-H(&]P97)A=&]R7!I8V%L(%)E86P@4')O9W)A;6UE2P@=&AE0IC86XG="!G +M970@86YY('=O&-U2!S=&]R97,@87)E +M;B=T"F]F=&5N(&]P96X@870@,R!A+FTN+"!S;R!T:&5Y('-U6]N90IG7,@8V%N +M(&1O(&AE>"!A'0@961I=&]R2!O<&5R871I;F<@0IO9B!5;FEX(&AA8VME"!M:6=H="!N;W0@8F4@87,@8F%D(&]N(%)E86P@4')O9W)A;6UE +M7-T96T@=V]R +M=&AY"F]F(&%N>2!296%L(%!R;V=R86UM97(N($ET(&AA7!E(&-H96-K:6YG+"!V87)I86)L92!N86UE6]U;F<@;65N(&%N9"!W;VUE;BX@($%S(&QO;F<@87,@=&AE +M2!O9B!(86-K:6YG/"]E;3XL(%-C:65N8V4@.#(L(%9O;'5M92 S +M+"!.=6UB97(@.2P*(" @(" @($YO=F5M8F5R(#$Y.#(L('!A9V5S(#4X("T@ +M-C8N(#Q0/@H*6SA=(" @(%1H92!(86-K97(@4&%P97)S+" \96T^4'-Y8VAO +M;&]G>2!4;V1A>3PO96T^+"!!=6=U2P@,3DX,RP@<' N(#(V,RTR-C4N(#Q0 +M/@H*/&AR/@H*/$%$1%)%4U,^(#QA(&AR968](FEN9&5X+FAT;6PB/DAA8VME +M + [open_modes, open_old_modes, pread_pwrite, position, + truncate, sync, get_set_file, compress, uuencode, + large_file_errors, large_file_light, large_file_heavy]. + +init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> + Time = + case Func of + large_file_heavy -> + ?t:minutes(5); + _ -> + ?t:seconds(10) + end, + Dog = ?t:timetrap(Time), + %% error_logger:info_msg("~p:~p *****~n", [?MODULE, Func]), + [{watchdog, Dog} | Config]. + +fin_per_testcase(_Func, Config) -> + %% error_logger:info_msg("~p:~p END *****~n", [?MODULE, Func]), + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +%%-------------------------------------------------------------------------- +%% Test suites + +open_modes(suite) -> + []; +open_modes(doc) -> + ["Test that the basic read, write and binary options works for open/2."]; +open_modes(Config) when is_list(Config) -> + ?line Str1 = "The quick brown fox ", + ?line Str2 = "jumps over a lazy dog ", + ?line Str = Str1 ++ Str2, + ?line Bin1 = list_to_binary(Str1), + ?line Bin2 = list_to_binary(Str2), + ?line Bin = list_to_binary(Str), + %% + open_read_write(?FILE_MODULE, Str1, [ram, read, write], Str2), + open_read(?FILE_MODULE, Str, [ram]), + open_read_write(?FILE_MODULE, Bin1, [ram, binary, read, write], Bin2), + open_read(?FILE_MODULE, Bin, [ram, binary, read]), + %% + ok. + +open_old_modes(suite) -> + []; +open_old_modes(doc) -> + ["Test that the old style read, write and binary options ", + "works for open/2."]; +open_old_modes(Config) when is_list(Config) -> + ?line Str1 = "The quick brown fox ", + ?line Str2 = "jumps over a lazy dog ", + ?line Str = Str1 ++ Str2, + ?line Bin1 = list_to_binary(Str1), + ?line Bin2 = list_to_binary(Str2), + ?line Bin = list_to_binary(Str), + %% + open_read_write(?RAM_FILE_MODULE, Str1, read_write, Str2), + open_read(?RAM_FILE_MODULE, Str, read), + open_read_write(?RAM_FILE_MODULE, Bin1, {binary, read_write}, Bin2), + open_read(?RAM_FILE_MODULE, Bin, {binary, read}), + %% + ok. + +open_read_write(Module, Data1, Options, Data2) -> + ?line io:format("~p:open_read_write(~p, ~p, ~p, ~p)~n", + [?MODULE, Module, Data1, Options, Data2]), + %% + ?line Size1 = sizeof(Data1), + ?line Size2 = sizeof(Data2), + ?line Data = append(Data1, Data2), + ?line Size = Size1 + Size2, + %% + ?line {ok, Fd} = Module:open(Data1, Options), + ?line {ok, Data1} = Module:read(Fd, Size1), + ?line eof = Module:read(Fd, 1), + ?line {ok, Zero} = Module:read(Fd, 0), + ?line 0 = sizeof(Zero), + ?line ok = Module:write(Fd, Data2), + ?line {ok, 0} = Module:position(Fd, bof), + ?line {ok, Data} = Module:read(Fd, Size), + ?line eof = Module:read(Fd, 1), + ?line {ok, Zero} = Module:read(Fd, 0), + ?line ok = Module:close(Fd), + %% + ?line ok. + +open_read(Module, Data, Options) -> + ?line io:format("~p:open_read(~p, ~p, ~p)~n", + [?MODULE, Module, Data, Options]), + %% + ?line Size = sizeof(Data), + %% + ?line {ok, Fd} = Module:open(Data, Options), + ?line {ok, Data} = Module:read(Fd, Size), + ?line eof = Module:read(Fd, 1), + ?line {ok, Zero} = Module:read(Fd, 0), + ?line 0 = sizeof(Zero), + ?line {error, ebadf} = Module:write(Fd, Data), + ?line {ok, 0} = Module:position(Fd, bof), + ?line {ok, Data} = Module:read(Fd, Size), + ?line eof = Module:read(Fd, 1), + ?line {ok, Zero} = Module:read(Fd, 0), + ?line ok = Module:close(Fd), + %% + ?line ok. + + + +pread_pwrite(suite) -> + []; +pread_pwrite(doc) -> + ["Test that pread/2,3 and pwrite/2,3 works."]; +pread_pwrite(Config) when is_list(Config) -> + ?line Str = "Flygande bäckaziner söka hwila på mjuqa tuvor x", + ?line Bin = list_to_binary(Str), + %% + pread_pwrite_test(?FILE_MODULE, Str, [ram, read, write]), + pread_pwrite_test(?FILE_MODULE, Bin, [ram, binary, read, write]), + pread_pwrite_test(?RAM_FILE_MODULE, Str, [read, write]), + pread_pwrite_test(?RAM_FILE_MODULE, Bin, {binary, read_write}), + %% + ok. + +pread_pwrite_test(Module, Data, Options) -> + ?line io:format("~p:pread_pwrite_test(~p, ~p, ~p)~n", + [?MODULE, Module, Data, Options]), + %% + ?line Size = sizeof(Data), + %% + ?line {ok, Fd} = Module:open([], Options), + ?line ok = Module:pwrite(Fd, 0, Data), + ?line {ok, Data} = Module:pread(Fd, 0, Size+1), + ?line eof = Module:pread(Fd, Size+1, 1), + ?line {ok, Zero} = Module:pread(Fd, Size+1, 0), + ?line 0 = sizeof(Zero), + ?line ok = Module:pwrite(Fd, [{0, Data}, {Size+17, Data}]), + ?line {ok, [Data, + eof, + Data, + Zero]} = Module:pread(Fd, [{Size+17, Size+1}, + {2*Size+17+1, 1}, + {0, Size}, + {2*Size+17+1, 0}]), + ?line ok = Module:close(Fd), + %% + ?line ok. + +position(suite) -> + []; +position(doc) -> + ["Test that position/2 works."]; +position(Config) when is_list(Config) -> + ?line Str = "Att vara eller icke vara, det är frågan. ", + ?line Bin = list_to_binary(Str), + %% + position_test(?FILE_MODULE, Str, [ram, read]), + position_test(?FILE_MODULE, Bin, [ram, binary]), + position_test(?RAM_FILE_MODULE, Str, [read]), + position_test(?RAM_FILE_MODULE, Bin, {binary, read}), + %% + ok. + +position_test(Module, Data, Options) -> + ?line io:format("~p:position_test(~p, ~p, ~p)~n", + [?MODULE, Module, Data, Options]), + %% + ?line Size = sizeof(Data), + ?line Size_7 = Size+7, + %% + ?line Slice_0_2 = slice(Data, 0, 2), + ?line Slice_0_3 = slice(Data, 0, 3), + ?line Slice_2_5 = slice(Data, 2, 5), + ?line Slice_3_4 = slice(Data, 3, 4), + ?line Slice_5 = slice(Data, 5, Size), + %% + ?line {ok, Fd} = Module:open(Data, Options), + %% + ?line io:format("CUR positions"), + ?line {ok, Slice_0_2} = Module:read(Fd, 2), + ?line {ok, 2} = Module:position(Fd, cur), + ?line {ok, Slice_2_5} = Module:read(Fd, 5), + ?line {ok, 3} = Module:position(Fd, {cur, -4}), + ?line {ok, Slice_3_4} = Module:read(Fd, 4), + ?line {ok, 0} = Module:position(Fd, {cur, -7}), + ?line {ok, Slice_0_3} = Module:read(Fd, 3), + ?line {ok, 0} = Module:position(Fd, {cur, -3}), + ?line {error, einval} = Module:position(Fd, {cur, -1}), + ?line {ok, 0} = Module:position(Fd, 0), + ?line {ok, 2} = Module:position(Fd, {cur, 2}), + ?line {ok, Slice_2_5} = Module:read(Fd, 5), + ?line {ok, Size_7} = Module:position(Fd, {cur, Size}), + ?line {ok, Zero} = Module:read(Fd, 0), + ?line 0 = sizeof(Zero), + ?line eof = Module:read(Fd, 1), + %% + ?line io:format("Absolute and BOF positions"), + ?line {ok, Size} = Module:position(Fd, Size), + ?line eof = Module:read(Fd, 1), + ?line {ok, 5} = Module:position(Fd, 5), + ?line {ok, Slice_5} = Module:read(Fd, Size), + ?line {ok, 2} = Module:position(Fd, {bof, 2}), + ?line {ok, Slice_2_5} = Module:read(Fd, 5), + ?line {ok, 3} = Module:position(Fd, 3), + ?line {ok, Slice_3_4} = Module:read(Fd, 4), + ?line {ok, 0} = Module:position(Fd, bof), + ?line {ok, Slice_0_2} = Module:read(Fd, 2), + ?line {ok, Size_7} = Module:position(Fd, {bof, Size_7}), + ?line {ok, Zero} = Module:read(Fd, 0), + %% + ?line io:format("EOF positions"), + ?line {ok, Size} = Module:position(Fd, eof), + ?line eof = Module:read(Fd, 1), + ?line {ok, 5} = Module:position(Fd, {eof, -Size+5}), + ?line {ok, Slice_5} = Module:read(Fd, Size), + ?line {ok, 2} = Module:position(Fd, {eof, -Size+2}), + ?line {ok, Slice_2_5} = Module:read(Fd, 5), + ?line {ok, 3} = Module:position(Fd, {eof, -Size+3}), + ?line {ok, Slice_3_4} = Module:read(Fd, 4), + ?line {ok, 0} = Module:position(Fd, {eof, -Size}), + ?line {ok, Slice_0_2} = Module:read(Fd, 2), + ?line {ok, Size_7} = Module:position(Fd, {eof, 7}), + ?line {ok, Zero} = Module:read(Fd, 0), + ?line eof = Module:read(Fd, 1), + %% + ?line ok. + + + +truncate(suite) -> + []; +truncate(doc) -> + ["Test that truncate/1 works."]; +truncate(Config) when is_list(Config) -> + ?line Str = "Mån ädlare att lida och fördraga " + ++ "ett bittert ödes stygn av pilar, ", + ?line Bin = list_to_binary(Str), + %% + ok = truncate_test(?FILE_MODULE, Str, [ram, read, write]), + ok = truncate_test(?FILE_MODULE, Bin, [ram, binary, read, write]), + ok = truncate_test(?RAM_FILE_MODULE, Str, read_write), + ok = truncate_test(?RAM_FILE_MODULE, Bin, [binary, read, write]), + %% + {error, eacces} = truncate_test(?FILE_MODULE, Str, [ram]), + {error, eacces} = truncate_test(?FILE_MODULE, Bin, [ram, binary, read]), + {error, eacces} = truncate_test(?RAM_FILE_MODULE, Str, read), + {error, eacces} = truncate_test(?RAM_FILE_MODULE, Bin, {binary, read}), + %% + ok. + +truncate_test(Module, Data, Options) -> + ?line io:format("~p:truncate_test(~p, ~p, ~p)~n", + [?MODULE, Module, Data, Options]), + %% + ?line Size = sizeof(Data), + ?line Size1 = Size-2, + ?line Data1 = slice(Data, 0, Size1), + %% + ?line {ok, Fd} = Module:open(Data, Options), + ?line {ok, Size1} = Module:position(Fd, Size1), + ?line case Module:truncate(Fd) of + ok -> + ?line {ok, 0} = Module:position(Fd, 0), + ?line {ok, Data1} = Module:read(Fd, Size), + ?line ok = Module:close(Fd), + ?line ok; + Error -> + ?line ok = Module:close(Fd), + ?line Error + end. + + + +sync(suite) -> + []; +sync(doc) -> + ["Test that sync/1 at least does not crash."]; +sync(Config) when is_list(Config) -> + ?line Str = "än att ta till vapen mot ett hav av kval. ", + ?line Bin = list_to_binary(Str), + %% + sync_test(?FILE_MODULE, Str, [ram, read, write]), + sync_test(?FILE_MODULE, Bin, [ram, binary, read, write]), + sync_test(?RAM_FILE_MODULE, Str, read_write), + sync_test(?RAM_FILE_MODULE, Bin, [binary, read, write]), + %% + sync_test(?FILE_MODULE, Str, [ram]), + sync_test(?FILE_MODULE, Bin, [ram, binary, read]), + sync_test(?RAM_FILE_MODULE, Str, read), + sync_test(?RAM_FILE_MODULE, Bin, {binary, read}), + %% + ok. + +sync_test(Module, Data, Options) -> + ?line io:format("~p:sync_test(~p, ~p, ~p)~n", + [?MODULE, Module, Data, Options]), + %% + ?line Size = sizeof(Data), + %% + ?line {ok, Fd} = Module:open(Data, Options), + ?line ok = Module:sync(Fd), + ?line {ok, Data} = Module:read(Fd, Size+1), + ?line ok. + + + +get_set_file(suite) -> + []; +get_set_file(doc) -> + ["Tests get_file/1, set_file/2, get_file_close/1 and get_size/1."]; +get_set_file(Config) when is_list(Config) -> + %% These two strings should not be of equal length. + ?line Str = "När högan nord blir snöbetäckt, ", + ?line Str2 = "får alla harar byta dräkt. ", + ?line Bin = list_to_binary(Str), + ?line Bin2 = list_to_binary(Str2), + %% + ok = get_set_file_test(Str, read_write, Str2), + ok = get_set_file_test(Bin, [binary, read, write], Bin2), + ok = get_set_file_test(Str, read, Str2), + ok = get_set_file_test(Bin, [binary, read], Bin2), + %% + ok. + +get_set_file_test(Data, Options, Data2) -> + ?line io:format("~p:get_set_file_test(~p, ~p, ~p)~n", + [?MODULE, Data, Options, Data2]), + %% + ?line Size = sizeof(Data), + ?line Size2 = sizeof(Data2), + %% + ?line {ok, Fd} = ?RAM_FILE_MODULE:open(Data, Options), + ?line {ok, Size} = ?RAM_FILE_MODULE:get_size(Fd), + ?line {ok, Data} = ?RAM_FILE_MODULE:get_file(Fd), + ?line {ok, Data} = ?RAM_FILE_MODULE:get_file_close(Fd), + ?line {error, einval} = ?RAM_FILE_MODULE:get_size(Fd), + ?line {ok, Fd2} = ?RAM_FILE_MODULE:open(Data, Options), + ?line case ?RAM_FILE_MODULE:set_file(Fd2, Data2) of + {ok, Size2} -> + ?line {ok, Size2} = ?RAM_FILE_MODULE:get_size(Fd2), + ?line {ok, Data2} = ?RAM_FILE_MODULE:get_file(Fd2), + ?line {ok, Data2} = ?RAM_FILE_MODULE:get_file_close(Fd2), + ?line ok; + {error, _} = Error -> + ?line {ok, Data} = ?RAM_FILE_MODULE:get_file_close(Fd2), + ?line Error + end. + + + +compress(suite) -> + []; +compress(doc) -> + ["Test that compress/1 and uncompress/1 works."]; +compress(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line Real = filename:join(Data, "realmen.html"), + ?line RealGz = filename:join(Data, "realmen.html.gz"), + %% + %% Uncompress test + %% + ?line {ok, FdReal} = ?FILE_MODULE:open(Real, []), + ?line {ok, Fd} = ?FILE_MODULE:open([], [ram, read, write]), + ?line {ok, FdRealGz} = ?FILE_MODULE:open(RealGz, []), + %% + ?line {ok, SzGz} = ?FILE_MODULE:copy(FdRealGz, Fd), + ?line {ok, Sz} = ?RAM_FILE_MODULE:uncompress(Fd), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, bof), + ?line true = compare(FdReal, Fd), + %% + ?line true = (SzGz =< Sz), + %% + %% Compress and uncompress test + %% + ?line {ok, 0} = ?FILE_MODULE:position(FdReal, bof), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, bof), + ?line ok = ?FILE_MODULE:truncate(Fd), + ?line {ok, Sz} = ?FILE_MODULE:copy(FdReal, Fd), + ?line {ok, SzGz} = ?RAM_FILE_MODULE:compress(Fd), + ?line {ok, Sz} = ?RAM_FILE_MODULE:uncompress(Fd), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, bof), + ?line {ok, 0} = ?FILE_MODULE:position(FdReal, bof), + ?line true = compare(FdReal, Fd), + %% + ?line ok = ?FILE_MODULE:close(FdReal), + ?line ok = ?FILE_MODULE:close(Fd), + ?line ok = ?FILE_MODULE:close(FdRealGz), + + + %% Test uncompressing data that will be expanded many times. + ?line Huge = iolist_to_binary(mk_42(18)), + ?line HugeSize = byte_size(Huge), + ?line HugeGz = zlib:gzip(Huge), + + ?line {ok,HugeFd} = ?FILE_MODULE:open([], [ram,read,write,binary]), + ?line ok = ?FILE_MODULE:write(HugeFd, HugeGz), + ?line {ok,HugeSize} = ?RAM_FILE_MODULE:uncompress(HugeFd), + ?line {ok,0} = ?FILE_MODULE:position(HugeFd, bof), + ?line {ok,Huge} = ?FILE_MODULE:read(HugeFd, HugeSize), + + %% Uncompressing again should do nothing. + ?line {ok,HugeSize} = ?RAM_FILE_MODULE:uncompress(HugeFd), + ?line {ok,0} = ?FILE_MODULE:position(HugeFd, bof), + ?line {ok,Huge} = ?FILE_MODULE:read(HugeFd, HugeSize), + + ?line ok = ?FILE_MODULE:close(HugeFd), + + ok. + +mk_42(0) -> + [42]; +mk_42(N) -> + B = mk_42(N-1), + [B|B]. + +uuencode(suite) -> + []; +uuencode(doc) -> + ["Test that uuencode/1 and uudecode/1 works."]; +uuencode(Config) when is_list(Config) -> + ?line Data = ?config(data_dir, Config), + ?line Real = filename:join(Data, "realmen.html"), + ?line RealUu = filename:join(Data, "realmen.html.uu"), + %% + %% Uudecode test + %% + ?line {ok, FdReal} = ?FILE_MODULE:open(Real, []), + ?line {ok, Fd} = ?FILE_MODULE:open([], [ram, read, write]), + ?line {ok, FdRealUu} = ?FILE_MODULE:open(RealUu, []), + %% + ?line {ok, SzUu} = ?FILE_MODULE:copy(FdRealUu, Fd), + ?line {ok, Sz} = ?RAM_FILE_MODULE:uudecode(Fd), + ?line true = (Sz =< SzUu), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, bof), + ?line true = compare(FdReal, Fd), + %% + %% Uuencode and decode test + %% + ?line {ok, 0} = ?FILE_MODULE:position(FdReal, bof), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, bof), + ?line ok = ?FILE_MODULE:truncate(Fd), + ?line {ok, Sz} = ?FILE_MODULE:copy(FdReal, Fd), + ?line {ok, SzUu} = ?RAM_FILE_MODULE:uuencode(Fd), + ?line true = (Sz =< SzUu), + ?line {ok, Sz } = ?RAM_FILE_MODULE:uudecode(Fd), + ?line {ok, 0} = ?FILE_MODULE:position(FdReal, bof), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, bof), + ?line true = compare(FdReal, Fd), + %% + ?line ok = ?FILE_MODULE:close(FdReal), + ?line ok = ?FILE_MODULE:close(Fd), + ?line ok = ?FILE_MODULE:close(FdRealUu), + ok. + + + +large_file_errors(suite) -> + []; +large_file_errors(doc) -> + ["Test error checking of large file offsets."]; +large_file_errors(Config) when is_list(Config) -> + ?line TwoGig = 1 bsl 31, + ?line {ok,Fd} = ?RAM_FILE_MODULE:open("1234567890", [read,write]), + ?line {error, einval} = ?FILE_MODULE:read(Fd, TwoGig), + ?line {error, badarg} = ?FILE_MODULE:read(Fd, -1), + ?line {error, einval} = ?FILE_MODULE:position(Fd, {bof,TwoGig}), + ?line {error, einval} = ?FILE_MODULE:position(Fd, {bof,-TwoGig-1}), + ?line {error, einval} = ?FILE_MODULE:position(Fd, {bof,-1}), + ?line {error, einval} = ?FILE_MODULE:position(Fd, {cur,TwoGig}), + ?line {error, einval} = ?FILE_MODULE:position(Fd, {cur,-TwoGig-1}), + ?line {error, einval} = ?FILE_MODULE:position(Fd, {eof,TwoGig}), + ?line {error, einval} = ?FILE_MODULE:position(Fd, {eof,-TwoGig-1}), + ?line {error, einval} = ?FILE_MODULE:pread(Fd, TwoGig, 1), + ?line {error, einval} = ?FILE_MODULE:pread(Fd, -TwoGig-1, 1), + ?line {error, einval} = ?FILE_MODULE:pread(Fd, -1, 1), + ?line {error, einval} = ?FILE_MODULE:pwrite(Fd, TwoGig, "@"), + ?line {error, einval} = ?FILE_MODULE:pwrite(Fd, -TwoGig-1, "@"), + ?line {error, einval} = ?FILE_MODULE:pwrite(Fd, -1, "@"), + ?line {error, einval} = ?FILE_MODULE:pread(Fd, TwoGig, 0), + ?line {error, einval} = ?FILE_MODULE:pread(Fd, -TwoGig-1, 0), + ?line {error, einval} = ?FILE_MODULE:pread(Fd, -1, 0), + ?line ok = ?FILE_MODULE:close(Fd), + ok. + + + +large_file_light(suite) -> + []; +large_file_light(doc) -> + ["Test light operations on a \"large\" ram_file."]; +large_file_light(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + %% Marker for next test case that is to heavy to run in a suite. + ?line ok = ?FILE_MODULE:write_file( + filename:join(PrivDir, large_file_light), + <<"TAG">>), + %% + ?line Data = "abcdefghijklmnopqrstuvwzyz", + ?line Size = sizeof(Data), + ?line Max = (1 bsl 31) - 1, + ?line Max__1 = Max - 1, + ?line {ok, Fd} = ?RAM_FILE_MODULE:open(Data, [read]), + ?line {ok, Data} = ?FILE_MODULE:read(Fd, Size+1), + ?line {ok, Max__1} = ?FILE_MODULE:position(Fd, {eof, Max-Size-1}), + ?line eof = ?FILE_MODULE:read(Fd, 1), + ?line {ok, Max} = ?FILE_MODULE:position(Fd, {bof, Max}), + ?line {ok, Zero} = ?FILE_MODULE:read(Fd, 0), + ?line 0 = sizeof(Zero), + ?line eof = ?FILE_MODULE:read(Fd, 1), + ?line eof = ?FILE_MODULE:pread(Fd, Max__1, 1), + ?line {ok, Zero} = ?FILE_MODULE:pread(Fd, Max, 0), + ?line eof = ?FILE_MODULE:pread(Fd, Max, 1), + ok. + + + +large_file_heavy(suite) -> + []; +large_file_heavy(doc) -> + ["Test operations on a maximum size (2 GByte - 1) ram_file."]; +large_file_heavy(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + %% Check previous test case marker. + case ?FILE_MODULE:read_file_info( + filename:join(PrivDir, large_file_light)) of + {ok,_} -> + {skipped,"Too heavy for casual testing!"}; + _ -> + do_large_file_heavy(Config) + end. + +do_large_file_heavy(_Config) -> + ?line Data = "qwertyuiopasdfghjklzxcvbnm", + ?line Size = sizeof(Data), + ?line Max = (1 bsl 31) - 1, + ?line Max__1 = Max - 1, + ?line Max__3 = Max - 3, + ?line {ok, Fd} = ?RAM_FILE_MODULE:open(Data, [read,write]), + ?line {ok, Data} = ?FILE_MODULE:read(Fd, Size+1), + ?line {ok, Max} = ?FILE_MODULE:position(Fd, {eof, Max-Size}), + ?line eof = ?FILE_MODULE:read(Fd, 1), + ?line erlang:display({allocating,2,'GByte',please,be,patient,'...'}), + ?line ok = ?FILE_MODULE:write(Fd, ""), + ?line erlang:display({allocating,2,'GByte',succeeded}), + ?line {ok, Max__1} = ?FILE_MODULE:position(Fd, {eof, -1}), + ?line {ok, [0]} = ?FILE_MODULE:read(Fd, 1), + ?line {ok, []} = ?FILE_MODULE:read(Fd, 0), + ?line eof = ?FILE_MODULE:read(Fd, 1), + ?line ok = ?FILE_MODULE:pwrite(Fd, Max-3, "TAG"), + ?line {ok, Max} = ?FILE_MODULE:position(Fd, cur), + ?line {ok, Max__3} = ?FILE_MODULE:position(Fd, {eof, -3}), + ?line {ok, "TAG"} = ?FILE_MODULE:read(Fd, 3+1), + ?line {ok, Max__3} = ?FILE_MODULE:position(Fd, {cur, -3}), + ?line ok = ?FILE_MODULE:write(Fd, "tag"), + ?line {ok, Max} = ?FILE_MODULE:position(Fd, cur), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, bof), + ?line {ok, "tag"} = ?FILE_MODULE:pread(Fd, Max__3, 3+1), + ?line {ok, 0} = ?FILE_MODULE:position(Fd, cur), + ?line ok = ?FILE_MODULE:close(Fd), + ok. + +%%-------------------------------------------------------------------------- +%% Utility functions + +compare(FdA, FdB) -> + Size = 65536, + case {?FILE_MODULE:read(FdA, Size), ?FILE_MODULE:read(FdB, Size)} of + {{error, _} = Error, _} -> + Error; + {_, {error, _} = Error} -> + Error; + {{ok, A}, {ok, B}} -> + case compare_data(A, B) of + true -> + compare(FdA, FdB); + false -> + false + end; + {eof, eof} -> + true; + _ -> + false + end. + +compare_data(A, B) when is_list(A), is_list(B) -> + list_to_binary(A) == list_to_binary(B); +compare_data(A, B) when is_list(A), is_binary(B) -> + list_to_binary(A) == B; +compare_data(A, B) when is_binary(A), is_list(B) -> + A == list_to_binary(B); +compare_data(A, B) when is_binary(A), is_binary(B) -> + A == B. + +sizeof(Data) when is_list(Data) -> + length(Data); +sizeof(Data) when is_binary(Data) -> + byte_size(Data). + +append(Data1, Data2) when is_list(Data1), is_list(Data2) -> + Data1 ++ Data2; +append(Data1, Data2) when is_binary(Data1), is_binary(Data2) -> + list_to_binary([Data1 | Data2]). + +slice(Data, Start, Length) when is_list(Data) -> + lists:sublist(Data, Start+1, Length); +slice(Data, Start, Length) when is_binary(Data) -> + {_, Bin} = split_binary(Data, Start), + if + Length >= byte_size(Bin) -> + Bin; + true -> + {B, _} = split_binary(Bin, Length), + B + end. + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/rpc_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/rpc_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/rpc_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/rpc_SUITE.erl 2009-11-20 13:31:14.000000000 +0000 @@ -0,0 +1,518 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(rpc_SUITE). + +-export([all/1]). +-export([call/1, block_call/1, multicall/1, multicall_timeout/1, + multicall_dies/1, multicall_node_dies/1, + called_dies/1, called_node_dies/1, + called_throws/1, call_benchmark/1, async_call/1]). + +-export([suicide/2, suicide/3, f/0, f2/0]). + +-include("test_server.hrl"). + +all(suite) -> + [call, block_call, multicall, multicall_timeout, + multicall_dies, multicall_node_dies, + called_dies, called_node_dies, + called_throws, call_benchmark, async_call]. + + +call(doc) -> "Test different rpc calls"; +call(Config) when is_list(Config) -> + Timetrap = ?t:timetrap(?t:seconds(30)), + ?line PA = filename:dirname(code:which(?MODULE)), + %% Note. First part of nodename sets response delay in seconds + ?line {ok, N1} = ?t:start_node('3_rpc_SUITE_call', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N2} = ?t:start_node('1_rcp_SUITE_call', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N3} = ?t:start_node('4_rcp_SUITE_call', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N4} = ?t:start_node('8_rcp_SUITE_call', slave, + [{args, "-pa " ++ PA}]), + ?line ok = io:format("~p~n", [[N1, N2, N3]]), + ?line {hej,_,N1} = rpc:call(N1, ?MODULE, f, []), + ?line {hej,_,N2} = rpc:call(N2, ?MODULE, f, [], 2000), + ?line {badrpc,timeout} = rpc:call(N3, ?MODULE, f, [], 2000), + ?line receive after 6000 -> ok end, + ?line [] = flush([]), + ?line {hej,_,N4} = rpc:call(N4, ?MODULE, f, []), + ?line ?t:stop_node(N1), + ?line ?t:stop_node(N2), + ?line ?t:stop_node(N3), + ?line ?t:stop_node(N4), + ?t:timetrap_cancel(Timetrap), + ok. + +block_call(doc) -> "Test different rpc calls"; +block_call(Config) when is_list(Config) -> + Timetrap = ?t:timetrap(?t:seconds(30)), + ?line PA = filename:dirname(code:which(?MODULE)), + %% Note. First part of nodename sets response delay in seconds + ?line {ok, N1} = ?t:start_node('3_rpc_SUITE_block_call', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N2} = ?t:start_node('1_rcp_SUITE_block_call', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N3} = ?t:start_node('4_rcp_SUITE_block_call', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N4} = ?t:start_node('8_rcp_SUITE_block_call', slave, + [{args, "-pa " ++ PA}]), + ?line ok = io:format("~p~n", [[N1, N2, N3]]), + ?line {hej,_,N1} = rpc:block_call(N1, ?MODULE, f, []), + ?line {hej,_,N2} = rpc:block_call(N2, ?MODULE, f, [], 2000), + ?line {badrpc,timeout} = rpc:block_call(N3, ?MODULE, f, [], 2000), + ?line receive after 6000 -> ok end, + ?line [] = flush([]), + ?line {hej,_,N4} = rpc:block_call(N4, ?MODULE, f, []), + ?line ?t:stop_node(N1), + ?line ?t:stop_node(N2), + ?line ?t:stop_node(N3), + ?line ?t:stop_node(N4), + ?t:timetrap_cancel(Timetrap), + ok. + + +multicall(doc) -> + "OTP-3449"; +multicall(Config) when is_list(Config) -> + Timetrap = ?t:timetrap(?t:seconds(20)), + ?line PA = filename:dirname(code:which(?MODULE)), + %% Note. First part of nodename sets response delay in seconds + ?line {ok, N1} = ?t:start_node('3_rpc_SUITE_multicall', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N2} = ?t:start_node('1_rcp_SUITE_multicall', slave, + [{args, "-pa " ++ PA}]), + ?line ok = io:format("~p~n", [[N1, N2]]), + ?line {[{hej,_,N1},{hej,_,N2}],[]} = + rpc:multicall([N1, N2], ?MODULE, f, []), + ?line Msgs = flush([]), + ?line [] = Msgs, + ?line ?t:stop_node(N1), + ?line ?t:stop_node(N2), + ?t:timetrap_cancel(Timetrap), + ok. + +multicall_timeout(Config) when is_list(Config) -> + Timetrap = ?t:timetrap(?t:seconds(30)), + ?line PA = filename:dirname(code:which(?MODULE)), + %% Note. First part of nodename sets response delay in seconds + ?line {ok, N1} = ?t:start_node('11_rpc_SUITE_multicall', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N2} = ?t:start_node('8_rpc_SUITE_multicall', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N3} = ?t:start_node('5_rpc_SUITE_multicall', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N4} = ?t:start_node('2_rcp_SUITE_multicall', slave, + [{args, "-pa " ++ PA}]), + ?line ok = io:format("~p~n", [[N1, N2]]), + ?line {[{hej,_,N3},{hej,_,N4}],[N1, N2]} = + rpc:multicall([N3, N1, N2, N4], ?MODULE, f, [], ?t:seconds(6)), + ?t:sleep(?t:seconds(8)), %% Wait for late answers + ?line Msgs = flush([]), + ?line [] = Msgs, + ?line ?t:stop_node(N1), + ?line ?t:stop_node(N2), + ?line ?t:stop_node(N3), + ?line ?t:stop_node(N4), + ?t:timetrap_cancel(Timetrap), + ok. + +multicall_dies(Config) when is_list(Config) -> + Timetrap = ?t:timetrap(?t:seconds(30)), + ?line PA = filename:dirname(code:which(?MODULE)), + ?line {ok, N1} = ?t:start_node('rpc_SUITE_multicall_dies_1', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N2} = ?t:start_node('rcp_SUITE_multicall_dies_2', slave, + [{args, "-pa " ++ PA}]), + ?line Nodes = [N1, N2], + %% + ?line {[{badrpc, {'EXIT', normal}}, {badrpc, {'EXIT', normal}}], []} = + do_multicall(Nodes, erlang, exit, [normal]), + ?line {[{badrpc, {'EXIT', abnormal}}, {badrpc, {'EXIT', abnormal}}], []} = + do_multicall(Nodes, erlang, exit, [abnormal]), + ?line {[{badrpc, {'EXIT', {badarith, _}}}, + {badrpc, {'EXIT', {badarith, _}}}], + []} = + do_multicall(Nodes, erlang, 'div', [1, 0]), + ?line {[{badrpc, {'EXIT', {badarg, _}}}, + {badrpc, {'EXIT', {badarg, _}}}], + []} = + do_multicall(Nodes, erlang, atom_to_list, [1]), + ?line {[{badrpc, {'EXIT', {undef, _}}}, + {badrpc, {'EXIT', {undef, _}}}], + []} = + do_multicall(Nodes, ?MODULE, suicide, []), + ?line {[timeout, timeout], []} = + do_multicall(Nodes, ?MODULE, suicide, [link, normal]), + ?line {[{badrpc, {'EXIT', abnormal}}, {badrpc, {'EXIT', abnormal}}], []} = + do_multicall(Nodes, ?MODULE, suicide, [link, abnormal]), + ?line {[timeout, timeout], []} = + do_multicall(Nodes, ?MODULE, suicide, [exit, normal]), + ?line {[{badrpc, {'EXIT', abnormal}}, {badrpc, {'EXIT', abnormal}}], []} = + do_multicall(Nodes, ?MODULE, suicide, [exit, abnormal]), + ?line {[{badrpc, {'EXIT', killed}}, {badrpc, {'EXIT', killed}}], []} = + do_multicall(Nodes, ?MODULE, suicide, [exit, kill]), + %% + ?line ?t:stop_node(N1), + ?line ?t:stop_node(N2), + ?t:timetrap_cancel(Timetrap), + ok. + +do_multicall(Nodes, Mod, Func, Args) -> + ?line ok = io:format("~p:~p~p~n", [Mod, Func, Args]), + ?line Result = rpc:multicall(Nodes, Mod, Func, Args), + ?line Msgs = flush([]), + ?line [] = Msgs, + Result. + + + +multicall_node_dies(doc) -> + ""; +multicall_node_dies(Config) when is_list(Config) -> + Timetrap = ?t:timetrap(?t:seconds(60)), + %% + do_multicall_2_nodes_dies(?MODULE, suicide, [erlang, halt, []]), + do_multicall_2_nodes_dies(?MODULE, suicide, [init, stop, []]), + do_multicall_2_nodes_dies(?MODULE, suicide, [rpc, stop, []]), + %% + ?t:timetrap_cancel(Timetrap), + ok. + +do_multicall_2_nodes_dies(Mod, Func, Args) -> + ?line ok = io:format("~p:~p~p~n", [Mod, Func, Args]), + ?line PA = filename:dirname(code:which(?MODULE)), + ?line {ok, N1} = ?t:start_node('rpc_SUITE_multicall_node_dies_1', slave, + [{args, "-pa " ++ PA}]), + ?line {ok, N2} = ?t:start_node('rcp_SUITE_multicall_node_dies_2', slave, + [{args, "-pa " ++ PA}]), + ?line Nodes = [N1, N2], + ?line {[], Nodes} = rpc:multicall(Nodes, Mod, Func, Args), + ?line Msgs = flush([]), + ?line [] = Msgs, + ok. + + + +called_dies(doc) -> + "OTP-3766"; +called_dies(Config) when is_list(Config) -> + Timetrap = ?t:timetrap(?t:seconds(210)), + ?line PA = filename:dirname(code:which(?MODULE)), + ?line {ok, N} = ?t:start_node(rpc_SUITE_called_dies, slave, + [{args, "-pa " ++ PA}]), + %% + ?line rep(fun (Tag, Call, Args) -> + {Tag,{badrpc,{'EXIT',normal}}} = + {Tag,apply(rpc, Call, Args)} + end, N, erlang, exit, [normal]), + ?line rep(fun (Tag, Call, Args) -> + {Tag,{badrpc,{'EXIT',abnormal}}} = + {Tag,apply(rpc, Call, Args)} + end, N, erlang, exit, [abnormal]), + ?line rep(fun (Tag, Call, Args) -> + {Tag,{badrpc,{'EXIT',{badarith,_}}}} = + {Tag,apply(rpc, Call, Args)} + end, N, erlang, 'div', [1,0]), + ?line rep(fun (Tag, Call, Args) -> + {Tag,{badrpc,{'EXIT',{badarg,_}}}} = + {Tag,apply(rpc, Call, Args)} + end, N, erlang, atom_to_list, [1]), + ?line rep(fun (Tag, Call, Args) -> + {Tag,{badrpc,{'EXIT',{undef,_}}}} = + {Tag,apply(rpc, Call, Args)} + end, N, ?MODULE, suicide, []), + %% + TrapExit = process_flag(trap_exit, true), + %% + ?line rep(fun (Tag, Call, Args=[Node|_]) when Node == node() -> + {Tag,timeout} = + {Tag,apply(rpc, Call, Args)}, + {Tag,flush,[{'EXIT',_,normal}]} = + {Tag,flush,flush([])}; + (Tag, Call, Args) -> + {Tag,timeout} = + {Tag,apply(rpc, Call, Args)} + end, N, ?MODULE, suicide, [link,normal]), + ?line rep(fun (Tag, Call, Args=[Node|_]) when Node == node() -> + {Tag,timeout} = + {Tag,apply(rpc, Call, Args)}, + {Tag,flush,[{'EXIT',_,abnormal}]} = + {Tag,flush,flush([])}; + (Tag, block_call, Args) -> + {Tag,timeout} = + {Tag,apply(rpc, block_call, Args)}; + (Tag, Call, Args) -> + {Tag,{badrpc,{'EXIT',abnormal}}} = + {Tag,apply(rpc, Call, Args)} + end, N, ?MODULE, suicide, [link,abnormal]), + ?line rep(fun (Tag, Call, Args=[Node|_]) when Node == node() -> + {Tag,timeout} = + {Tag,apply(rpc, Call, Args)}, + {Tag,flush,[{'EXIT',_,normal}]} = + {Tag,flush,flush([])}; + (Tag, Call, Args) -> + {Tag,timeout} = + {Tag,apply(rpc, Call, Args)} + end, N, ?MODULE, suicide, [exit,normal]), + ?line rep(fun (Tag, Call, Args=[Node|_]) when Node == node() -> + {Tag,timeout} = + {Tag,apply(rpc, Call, Args)}, + {Tag,flush,[{'EXIT',_,abnormal}]} = + {Tag,flush,flush([])}; + (Tag, block_call, Args) -> + {Tag,timeout} = + {Tag,apply(rpc, block_call, Args)}; + (Tag, Call, Args) -> + {Tag,{badrpc,{'EXIT',abnormal}}} = + {Tag,apply(rpc, Call, Args)} + end, N, ?MODULE, suicide, [exit,abnormal]), + %% + process_flag(trap_exit, TrapExit), + %% + ?line rep(fun %% A local [exit,kill] would kill the test case process + (_Tag, _Call, [Node|_]) when Node == node() -> + ok; + %% A block_call [exit,kill] would kill the rpc server + (_Tag, block_call, _Args) -> ok; + (Tag, Call, Args) -> + {Tag,{badrpc,{'EXIT',killed}}} = + {Tag,apply(rpc, Call, Args)} + end, N, ?MODULE, suicide, [exit,kill]), + %% + ?line [] = flush([]), + ?line ?t:stop_node(N), + ?t:timetrap_cancel(Timetrap), + ok. + +rep(Fun, N, M, F, A) -> + Fun(1, call, [node(), M, F, A]), + Fun(2, call, [node(), M, F, A, infinity]), + Fun(3, call, [N, M, F, A]), + Fun(4, call, [N, M, F, A, infinity]), + Fun(5, call, [N, M, F, A, 3000]), + Fun(6, block_call, [node(), M, F, A]), + Fun(7, block_call, [node(), M, F, A, infinity]), + Fun(8, block_call, [N, M, F, A]), + Fun(9, block_call, [N, M, F, A, infinity]), + Fun(10, block_call, [N, M, F, A, 3000]), + ok. + + +suicide(link, Reason) -> + spawn_link( + fun() -> + exit(Reason) + end), + receive after 2000 -> timeout end; +suicide(exit, Reason) -> + Self = self(), + spawn( + fun() -> + exit(Self, Reason) + end), + receive after 2000 -> timeout end. + +suicide(erlang, exit, [Name, Reason]) when is_atom(Name) -> + case whereis(Name) of + Pid when pid(Pid) -> suicide(erlang, exit, [Pid, Reason]) + end; +suicide(Mod, Func, Args) -> + spawn_link( + fun() -> + apply(Mod, Func, Args) + end), + receive after 10000 -> timeout end. + + + +called_node_dies(doc) -> + ""; +called_node_dies(suite) -> []; +called_node_dies(Config) when is_list(Config) -> + Timetrap = ?t:timetrap(?t:minutes(2)), + ?line PA = filename:dirname(code:which(?MODULE)), + %% + ?line node_rep( + fun (Tag, Call, Args) -> + {Tag,{badrpc,nodedown}} = + {Tag,apply(rpc, Call, Args)} + end, "rpc_SUITE_called_node_dies_1", + PA, ?MODULE, suicide, [erlang,halt,[]]), + ?line node_rep( + fun (Tag, Call, Args) -> + {Tag,{badrpc,nodedown}} = + {Tag,apply(rpc, Call, Args)} + end, "rpc_SUITE_called_node_dies_2", + PA, ?MODULE, suicide, [init,stop,[]]), + ?line node_rep( + fun (Tag, Call, Args=[_|_]) -> + {Tag,{'EXIT',{killed,_}}} = + {Tag,catch {noexit,apply(rpc, Call, Args)}} + end, "rpc_SUITE_called_node_dies_3", + PA, ?MODULE, suicide, [erlang,exit,[rex,kill]]), + ?line node_rep( + fun %% Cannot block call rpc - will hang + (_Tag, block_call, _Args) -> ok; + (Tag, Call, Args=[_|_]) -> + {Tag,{'EXIT',{normal,_}}} = + {Tag,catch {noexit,apply(rpc, Call, Args)}} + end, "rpc_SUITE_called_node_dies_4", + PA, ?MODULE, suicide, [rpc,stop,[]]), + %% + ?t:timetrap_cancel(Timetrap), + ok. + +node_rep(Fun, Name, PA, M, F, A) -> + {ok, Na} = ?t:start_node(list_to_atom(Name++"_a"), slave, + [{args, "-pa " ++ PA}]), + Fun(a, call, [Na, M, F, A]), + catch ?t:stop_node(Na), + {ok, Nb} = ?t:start_node(list_to_atom(Name++"_b"), slave, + [{args, "-pa " ++ PA}]), + Fun(b, call, [Nb, M, F, A, infinity]), + catch ?t:stop_node(Nb), + {ok, Nc} = ?t:start_node(list_to_atom(Name++"_c"), slave, + [{args, "-pa " ++ PA}]), + Fun(c, call, [Nc, M, F, A, infinity]), + catch ?t:stop_node(Nc), + %% + {ok, Nd} = ?t:start_node(list_to_atom(Name++"_d"), slave, + [{args, "-pa " ++ PA}]), + Fun(d, block_call, [Nd, M, F, A]), + catch ?t:stop_node(Nd), + {ok, Ne} = ?t:start_node(list_to_atom(Name++"_e"), slave, + [{args, "-pa " ++ PA}]), + Fun(e, block_call, [Ne, M, F, A, infinity]), + catch ?t:stop_node(Ne), + {ok, Nf} = ?t:start_node(list_to_atom(Name++"_f"), slave, + [{args, "-pa " ++ PA}]), + Fun(f, block_call, [Nf, M, F, A, infinity]), + catch ?t:stop_node(Nf), + ok. + + + +called_throws(doc) -> + "OTP-3766"; +called_throws(Config) when is_list(Config) -> + Timetrap = ?t:timetrap(?t:seconds(10)), + ?line PA = filename:dirname(code:which(?MODULE)), + %% + ?line {ok, N} = ?t:start_node(rpc_SUITE_called_throws, slave, + [{args, "-pa " ++ PA}]), + %% + ?line rep(fun (Tag, Call, Args) -> + {Tag,up} = + {Tag,apply(rpc, Call, Args)} + end, N, erlang, throw, [up]), + ?line rep(fun (Tag, Call, Args) -> + {Tag,{badrpc,{'EXIT',reason}}} = + {Tag,apply(rpc, Call, Args)} + end, N, erlang, throw, [{'EXIT',reason}]), + %% + ?line ?t:stop_node(N), + ?t:timetrap_cancel(Timetrap), + ok. + + + +call_benchmark(Config) when is_list(Config) -> + Timetrap = ?t:timetrap(?t:seconds(120)), + ?line PA = filename:dirname(code:which(?MODULE)), + ?line {ok, Node} = ?t:start_node(rpc_SUITE_call_benchmark, slave, + [{args, "-pa " ++ PA}]), + Iter = case erlang:system_info(modified_timing_level) of + undefined -> 10000; + _ -> 500 %Moified timing - spawn is slower + end, + ?line do_call_benchmark(Node, Iter), + ?t:timetrap_cancel(Timetrap), + ok. + +do_call_benchmark(Node, M) when integer(M), M > 0 -> + do_call_benchmark(Node, erlang:now(), 0, M). + +do_call_benchmark(Node, {A,B,C}, M, M) -> + ?line {D,E,F} = erlang:now(), + ?line T = float(D-A)*1000000.0 + float(E-B) + float(F-C)*0.000001, + ?line Q = 3.0 * float(M) / T, + ?line ?t:stop_node(Node), + {comment, + lists:flatten([float_to_list(Q)," RPC calls per second"])}; +do_call_benchmark(Node, Then, I, M) -> + ?line Node = rpc:call(Node, erlang, node, []), + ?line _ = rpc:call(Node, erlang, whereis, [rex]), + ?line 3 = rpc:call(Node, erlang, '+', [1,2]), + ?line do_call_benchmark(Node, Then, I+1, M). + +async_call(Config) when is_list(Config) -> + Dog = ?t:timetrap(?t:seconds(120)), + + %% Note: First part of nodename sets response delay in seconds. + ?line PA = filename:dirname(code:which(?MODULE)), + ?line NodeArgs = [{args,"-pa "++ PA}], + ?line {ok,Node1} = ?t:start_node('1_rpc_SUITE_call', slave, NodeArgs), + ?line {ok,Node2} = ?t:start_node('10_rpc_SUITE_call', slave, NodeArgs), + ?line {ok,Node3} = ?t:start_node('20_rpc_SUITE_call', slave, NodeArgs), + ?line Promise1 = rpc:async_call(Node1, ?MODULE, f, []), + ?line Promise2 = rpc:async_call(Node2, ?MODULE, f, []), + ?line Promise3 = rpc:async_call(Node3, ?MODULE, f, []), + + %% Test fast timeouts. + ?line timeout = rpc:nb_yield(Promise2), + ?line timeout = rpc:nb_yield(Promise2, 10), + + %% Let Node1 finish its work before yielding. + ?t:sleep(?t:seconds(2)), + ?line {hej,_,Node1} = rpc:yield(Promise1), + + %% Wait for the Node2 and Node3. + ?line {value,{hej,_,Node2}} = rpc:nb_yield(Promise2, infinity), + ?line {hej,_,Node3} = rpc:yield(Promise3), + + ?t:timetrap_cancel(Dog), + ok. + +%%% +%%% Utility functions. +%%% + +flush(L) -> + receive + M -> + flush([M|L]) + after 0 -> + L + end. + +t() -> + [N | _] = string:tokens(atom_to_list(node()), "_"), + 1000*list_to_integer(N). + +f() -> + timer:sleep(T=t()), + spawn(?MODULE, f2, []), + {hej,T,node()}. + +f2() -> + timer:sleep(500), + halt(). diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/seq_trace_SUITE_data/echo_drv.c erlang-13.b.3-dfsg/lib/kernel/test/seq_trace_SUITE_data/echo_drv.c --- erlang-13.b.1-dfsg/lib/kernel/test/seq_trace_SUITE_data/echo_drv.c 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/seq_trace_SUITE_data/echo_drv.c 2001-10-08 09:48:15.000000000 +0100 @@ -0,0 +1,43 @@ +#include +#include "erl_driver.h" + +static ErlDrvPort erlang_port; +static ErlDrvData echo_start(ErlDrvPort, char *); +static void echo_stop(ErlDrvData), echo_read(ErlDrvData, char*, int); + +static ErlDrvEntry echo_driver_entry = { + NULL, + echo_start, + echo_stop, + echo_read, + NULL, + NULL, + "echo_drv", + NULL +}; + +DRIVER_INIT(echo_drv) +{ + erlang_port = (ErlDrvPort)-1; + return &echo_driver_entry; +} + +static ErlDrvData echo_start(ErlDrvPort port,char *buf) +{ + if (erlang_port != (ErlDrvPort)-1) { + return ERL_DRV_ERROR_GENERAL; + } + erlang_port = port; + return (ErlDrvData)port; +} + +static void echo_read(ErlDrvData data, char *buf, int count) +{ + driver_output(erlang_port, buf, count); +} + +static void echo_stop(ErlDrvData data) +{ + erlang_port = (ErlDrvPort)-1; +} + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/seq_trace_SUITE_data/Makefile.src erlang-13.b.3-dfsg/lib/kernel/test/seq_trace_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/lib/kernel/test/seq_trace_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/seq_trace_SUITE_data/Makefile.src 1999-06-14 12:09:41.000000000 +0100 @@ -0,0 +1,3 @@ +all: echo_drv@dll@ + +@SHLIB_RULES@ diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/seq_trace_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/seq_trace_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/seq_trace_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/seq_trace_SUITE.erl 2009-11-20 13:30:36.000000000 +0000 @@ -0,0 +1,760 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(seq_trace_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2]). +-export([token_set_get/1, tracer_set_get/1, print/1, + send/1, distributed_send/1, recv/1, distributed_recv/1, + trace_exit/1, distributed_exit/1, call/1, port/1, + match_set_seq_token/1, gc_seq_token/1]). + +% internal exports +-export([simple_tracer/2, one_time_receiver/0, one_time_receiver/1, + start_tracer/0, stop_tracer/1, + do_match_set_seq_token/1, do_gc_seq_token/1, countdown_start/2]). + +%-define(line_trace, 1). +-include("test_server.hrl"). + +-define(default_timeout, ?t:minutes(1)). + +all(suite) -> [token_set_get, tracer_set_get, print, + send, distributed_send, recv, distributed_recv, + trace_exit, distributed_exit, call, port, + match_set_seq_token, gc_seq_token]. + +init_per_testcase(_Case, Config) -> + ?line Dog = test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +%% Verifies that the set_token and get_token functions work as expected + +token_set_get(doc) -> []; +token_set_get(suite) -> []; +token_set_get(Config) when is_list(Config) -> + ?line Self = self(), + ?line seq_trace:reset_trace(), + %% Test that initial seq_trace is disabled + ?line [] = seq_trace:get_token(), + %% Test setting and reading the different fields + ?line 0 = seq_trace:set_token(label,17), + ?line {label,17} = seq_trace:get_token(label), + ?line false = seq_trace:set_token(print,true), + ?line {print,true} = seq_trace:get_token(print), + ?line false = seq_trace:set_token(send,true), + ?line {send,true} = seq_trace:get_token(send), + ?line false = seq_trace:set_token('receive',true), + ?line {'receive',true} = seq_trace:get_token('receive'), + ?line false = seq_trace:set_token(timestamp,true), + ?line {timestamp,true} = seq_trace:get_token(timestamp), + %% Check the whole token + ?line {15,17,0,Self,0} = seq_trace:get_token(), % all flags are set + %% Test setting and reading the 'serial' field + ?line {0,0} = seq_trace:set_token(serial,{3,5}), + ?line {serial,{3,5}} = seq_trace:get_token(serial), + %% Check the whole token, test that a whole token can be set and get + ?line {15,17,5,Self,3} = seq_trace:get_token(), + ?line seq_trace:set_token({15,19,7,Self,5}), + ?line {15,19,7,Self,5} = seq_trace:get_token(), + %% Check that receive timeout does not reset token + ?line receive after 0 -> ok end, + ?line {15,19,7,Self,5} = seq_trace:get_token(), + %% Check that token can be unset + ?line {15,19,7,Self,5} = seq_trace:set_token([]), + ?line [] = seq_trace:get_token(), + %% Check that Previous serial counter survived unset token + ?line 0 = seq_trace:set_token(label, 17), + ?line {0,17,0,Self,5} = seq_trace:get_token(), + %% Check that reset_trace resets the token and clears + %% the Previous serial counter + ?line seq_trace:reset_trace(), + ?line [] = seq_trace:get_token(), + ?line 0 = seq_trace:set_token(label, 19), + ?line {0,19,0,Self,0} = seq_trace:get_token(), + %% Cleanup + ?line seq_trace:reset_trace(), + ok. + +tracer_set_get(doc) -> []; +tracer_set_get(suite) -> []; +tracer_set_get(Config) when is_list(Config) -> + ?line Self = self(), + ?line seq_trace:set_system_tracer(self()), + ?line Self = seq_trace:get_system_tracer(), + ?line Self = seq_trace:set_system_tracer(false), + ?line false = seq_trace:get_system_tracer(), + + %% Set the system tracer to a port. + + ?line Port = load_tracer(Config), + ?line seq_trace:set_system_tracer(Port), + ?line Port = seq_trace:get_system_tracer(), + ?line Port = seq_trace:set_system_tracer(false), + ?line false = seq_trace:get_system_tracer(), + ok. + +print(doc) -> []; +print(suite) -> []; +print(Config) when is_list(Config) -> + ?line start_tracer(), + ?line seq_trace:set_token(print,true), + ?line seq_trace:print(0,print1), + ?line seq_trace:print(1,print2), + ?line seq_trace:print(print3), + ?line seq_trace:reset_trace(), + ?line [{0,{print,_,_,[],print1}}, + {0,{print,_,_,[],print3}}] = stop_tracer(2). + +send(doc) -> []; +send(suite) -> []; +send(Config) when is_list(Config) -> + ?line seq_trace:reset_trace(), + ?line start_tracer(), + ?line Receiver = spawn(?MODULE,one_time_receiver,[]), + ?line seq_trace:set_token(send,true), + ?line Receiver ! send, + ?line Self = self(), + ?line seq_trace:reset_trace(), + ?line [{0,{send,_,Self,Receiver,send}}] = stop_tracer(1). + +distributed_send(doc) -> []; +distributed_send(suite) -> []; +distributed_send(Config) when is_list(Config) -> + ?line {ok,Node} = start_node(seq_trace_other,[]), + ?line {_,Dir} = code:is_loaded(?MODULE), + ?line Mdir = filename:dirname(Dir), + ?line true = rpc:call(Node,code,add_patha,[Mdir]), + ?line seq_trace:reset_trace(), + ?line start_tracer(), + ?line Receiver = spawn(Node,?MODULE,one_time_receiver,[]), + ?line seq_trace:set_token(send,true), + ?line Receiver ! send, + ?line Self = self(), + ?line seq_trace:reset_trace(), + ?line stop_node(Node), + ?line [{0,{send,_,Self,Receiver,send}}] = stop_tracer(1). + +recv(doc) -> []; +recv(suite) -> []; +recv(Config) when is_list(Config) -> + ?line seq_trace:reset_trace(), + ?line start_tracer(), + ?line Receiver = spawn(?MODULE,one_time_receiver,[]), + ?line seq_trace:set_token('receive',true), + ?line Receiver ! 'receive', + %% let the other process receive the message: + ?line receive after 1 -> ok end, + ?line Self = self(), + ?line seq_trace:reset_trace(), + ?line [{0,{'receive',_,Self,Receiver,'receive'}}] = stop_tracer(1). + +distributed_recv(doc) -> []; +distributed_recv(suite) -> []; +distributed_recv(Config) when is_list(Config) -> + ?line {ok,Node} = start_node(seq_trace_other,[]), + ?line {_,Dir} = code:is_loaded(?MODULE), + ?line Mdir = filename:dirname(Dir), + ?line true = rpc:call(Node,code,add_patha,[Mdir]), + ?line seq_trace:reset_trace(), + ?line rpc:call(Node,?MODULE,start_tracer,[]), + ?line Receiver = spawn(Node,?MODULE,one_time_receiver,[]), + ?line seq_trace:set_token('receive',true), + ?line Receiver ! 'receive', + %% let the other process receive the message: + ?line receive after 1 -> ok end, + ?line Self = self(), + ?line seq_trace:reset_trace(), + ?line Result = rpc:call(Node,?MODULE,stop_tracer,[1]), + ?line stop_node(Node), + ?line ok = io:format("~p~n",[Result]), + ?line [{0,{'receive',_,Self,Receiver,'receive'}}] = Result. + +trace_exit(doc) -> []; +trace_exit(suite) -> []; +trace_exit(Config) when is_list(Config) -> + ?line seq_trace:reset_trace(), + ?line start_tracer(), + ?line Receiver = spawn_link(?MODULE, one_time_receiver, [exit]), + ?line process_flag(trap_exit, true), + ?line seq_trace:set_token(send,true), + ?line Receiver ! {before, exit}, + %% let the other process receive the message: + ?line receive + {'EXIT', Receiver, {exit, {before, exit}}} -> + seq_trace:set_token([]); + Other -> + seq_trace:set_token([]), + ?t:fail({received, Other}) + end, + ?line Self = self(), + ?line Result = stop_tracer(2), + ?line seq_trace:reset_trace(), + ?line ok = io:format("~p~n", [Result]), + ?line [{0, {send, {0,1}, Self, Receiver, {before, exit}}}, + {0, {send, {1,2}, Receiver, Self, + {'EXIT', Receiver, {exit, {before, exit}}}}}] = Result. + +distributed_exit(doc) -> []; +distributed_exit(suite) -> []; +distributed_exit(Config) when is_list(Config) -> + ?line {ok, Node} = start_node(seq_trace_other, []), + ?line {_, Dir} = code:is_loaded(?MODULE), + ?line Mdir = filename:dirname(Dir), + ?line true = rpc:call(Node, code, add_patha, [Mdir]), + ?line seq_trace:reset_trace(), + ?line rpc:call(Node, ?MODULE, start_tracer,[]), + ?line Receiver = spawn_link(Node, ?MODULE, one_time_receiver, [exit]), + ?line process_flag(trap_exit, true), + ?line seq_trace:set_token(send, true), + ?line Receiver ! {before, exit}, + %% let the other process receive the message: + ?line receive + {'EXIT', Receiver, {exit, {before, exit}}} -> + seq_trace:set_token([]); + Other -> + seq_trace:set_token([]), + ?t:fail({received, Other}) + end, + ?line Self = self(), + ?line Result = rpc:call(Node, ?MODULE, stop_tracer, [1]), + ?line seq_trace:reset_trace(), + ?line stop_node(Node), + ?line ok = io:format("~p~n", [Result]), + ?line [{0, {send, {1, 2}, Receiver, Self, + {'EXIT', Receiver, {exit, {before, exit}}}}}] = Result. + +call(doc) -> + "Tests special forms {is_seq_trace} and {get_seq_token} " + "in trace match specs."; +call(suite) -> + []; +call(Config) when is_list(Config) -> + ?line Self = self(), + ?line seq_trace:reset_trace(), + ?line TrA = transparent_tracer(), + ?line 1 = + erlang:trace(Self, true, + [call, set_on_spawn, {tracer, TrA(pid)}]), + ?line 1 = + erlang:trace_pattern({?MODULE, call_tracee_1, 1}, + [{'_', + [], + [{message, {{{self}, {get_seq_token}}}}]}], + [local]), + ?line 1 = + erlang:trace_pattern({?MODULE, call_tracee_2, 1}, + [{'_', + [{is_seq_trace}], + [{message, {{{self}, {get_seq_token}}}}]}], + [local]), + ?line RefA = make_ref(), + ?line Pid2A = spawn_link( + fun() -> + receive {_, msg, RefA} -> ok end, + RefA = call_tracee_2(RefA), + Self ! {self(), msg, RefA} + end), + ?line Pid1A = spawn_link( + fun() -> + receive {_, msg, RefA} -> ok end, + RefA = call_tracee_1(RefA), + Pid2A ! {self(), msg, RefA} + end), + ?line Pid1A ! {Self, msg, RefA}, + %% The message is passed Self -> Pid1B -> Pid2B -> Self. + %% Traced functions are called in Pid1B and Pid2B. + ?line receive {Pid2A, msg, RefA} -> ok end, + %% Only call_tracee1 will be traced since the guard for + %% call_tracee2 requires a sequential trace. The trace + %% token is undefined. + ?line Token2A = [], + ?line {ok, [{trace, Pid1A, call, + {?MODULE, call_tracee_1, [RefA]}, + {Pid1A, Token2A}}]} = + TrA({stop, 1}), + + ?line seq_trace:reset_trace(), + + ?line TrB = transparent_tracer(), + ?line 1 = + erlang:trace(Self, true, + [call, set_on_spawn, {tracer, TrB(pid)}]), + ?line Label = 17, + ?line seq_trace:set_token(label, Label), % Token enters here!! + ?line RefB = make_ref(), + ?line Pid2B = spawn_link( + fun() -> + receive {_, msg, RefB} -> ok end, + RefB = call_tracee_2(RefB), + Self ! {self(), msg, RefB} + end), + ?line Pid1B = spawn_link( + fun() -> + receive {_, msg, RefB} -> ok end, + RefB = call_tracee_1(RefB), + Pid2B ! {self(), msg, RefB} + end), + ?line Pid1B ! {Self, msg, RefB}, + %% The message is passed Self -> Pid1B -> Pid2B -> Self, and the + %% seq_trace token follows invisibly. Traced functions are + %% called in Pid1B and Pid2B. Seq_trace flags == 0 so no + %% seq_trace messages are generated. + ?line receive {Pid2B, msg, RefB} -> ok end, + %% The values of these counters {.., 1, _, 0}, {.., 2, _, 1} + %% depend on that seq_trace has been reset just before this test. + ?line Token1B = {0, Label, 1, Self, 0}, + ?line Token2B = {0, Label, 2, Pid1B, 1}, + ?line {ok, [{trace, Pid1B, call, + {?MODULE, call_tracee_1, [RefB]}, + {Pid1B, Token1B}}, + {trace, Pid2B, call, + {?MODULE, call_tracee_2, [RefB]}, + {Pid2B, Token2B}}]} = + TrB({stop,2}), + ?line seq_trace:reset_trace(), + ok. + +port(doc) -> + "Send trace messages to a port."; +port(suite) -> []; +port(Config) when is_list(Config) -> + ?line Port = load_tracer(Config), + ?line seq_trace:set_system_tracer(Port), + + ?line seq_trace:set_token(print, true), + ?line Small = [small,term], + ?line seq_trace:print(0, Small), + ?line case get_port_message(Port) of + {seq_trace,0,{print,_,_,[],Small}} -> + ok; + Other -> + ?line seq_trace:reset_trace(), + ?line ?t:fail({unexpected,Other}) + end, + %% OTP-4218 Messages from ports should not affect seq trace token. + %% + %% Check if trace token still is active on this process after + %% the get_port_message/1 above that receives from a port. + ?line OtherSmall = [other | Small], + ?line seq_trace:print(0, OtherSmall), + ?line seq_trace:reset_trace(), + ?line case get_port_message(Port) of + {seq_trace,0,{print,_,_,[],OtherSmall}} -> + ok; + Other1 -> + ?line ?t:fail({unexpected,Other1}) + end, + + + ?line seq_trace:set_token(print, true), + ?line Huge = huge_data(), + ?line seq_trace:print(0, Huge), + ?line seq_trace:reset_trace(), + ?line case get_port_message(Port) of + {seq_trace,0,{print,_,_,[],Huge}} -> + ok; + Other2 -> + ?line ?t:fail({unexpected,Other2}) + end, + ok. + +get_port_message(Port) -> + receive + {Port,{data,Bin}} when binary(Bin) -> + binary_to_term(Bin); + Other -> + ?t:fail({unexpected,Other}) + after 5000 -> + ?t:fail(timeout) + end. + + + +match_set_seq_token(suite) -> + []; +match_set_seq_token(doc) -> + ["Tests that match spec function set_seq_token does not " + "corrupt the heap"]; +match_set_seq_token(Config) when is_list(Config) -> + ?line Parent = self(), + ?line Timetrap = test_server:timetrap(test_server:seconds(20)), + %% OTP-4222 Match spec 'set_seq_token' corrupts heap + %% + %% This test crashes the emulator if the bug in question is present, + %% it is therefore done in a slave node. + %% + %% All the timeout stuff is here to get decent accuracy of the error + %% return value, instead of just 'timeout'. + % + ?line {ok, Sandbox} = start_node(seq_trace_other, []), + ?line true = rpc:call(Sandbox, code, add_patha, + [filename:dirname(code:which(?MODULE))]), + ?line Lbl = 4711, + %% Do the possibly crashing test + ?line P1 = + spawn( + fun () -> + Parent ! {self(), + rpc:call(Sandbox, + ?MODULE, do_match_set_seq_token, [Lbl])} + end), + %% Probe the node with a simple rpc request, to see if it is alive. + ?line P2 = + spawn( + fun () -> + receive after 4000 -> ok end, + Parent ! {self(), rpc:call(Sandbox, erlang, abs, [-1])} + end), + %% If the test node hangs completely, this timer expires. + ?line R3 = erlang:start_timer(8000, self(), void), + %% + ?line {ok, Log} = + receive + {P1, Result} -> + exit(P2, done), + erlang:cancel_timer(R3), + Result; + {P2, 1} -> + exit(P1, timeout), + erlang:cancel_timer(R3), + {error, "Test process hung"}; + {timeout, R3, _} -> + exit(P1, timeout), + exit(P2, timeout), + {error, "Test node hung"} + end, + ?line ok = check_match_set_seq_token_log(Lbl, Log), + %% + ?line stop_node(Sandbox), + ?line test_server:timetrap_cancel(Timetrap), + ok. + +%% OTP-4222 Match spec 'set_seq_token' corrupts heap +%% +%% The crashing test goes as follows: +%% +%% One trigger function calls match spec function {set_seq_token, _, _}, +%% which when faulty corrupts the heap. It is assured that the process +%% in question has a big heap and recently garbage collected so there +%% will be room on the heap, which is necessary for the crash to happen. +%% +%% Then two processes bounces a few messages between each other, and if +%% the heap is crashed the emulator crashes, or the triggering process's +%% loop data gets corrupted so the loop never ends. +do_match_set_seq_token(Label) -> + seq_trace:reset_trace(), + Tr = transparent_tracer(), + TrPid = Tr(pid), + erlang:trace_pattern({?MODULE, '_', '_'}, + [{'_', + [{is_seq_trace}], + [{message, {get_seq_token}}]}], + [local]), + erlang:trace_pattern({?MODULE, countdown, 2}, + [{'_', + [], + [{set_seq_token, label, Label}, + {message, {get_seq_token}}]}], + [local]), + erlang:trace(new, true, [call, {tracer, TrPid}]), + Ref = make_ref(), + Bounce = spawn(fun () -> bounce(Ref) end), + Mref = erlang:monitor(process, Bounce), + _Countdown = erlang:spawn_opt(?MODULE, countdown_start, [Bounce, Ref], + [{min_heap_size, 4192}]), + receive + {'DOWN', Mref, _, _, normal} -> + Result = Tr({stop, 0}), + seq_trace:reset_trace(), + erlang:trace(new, false, [call]), + Result; + {'DOWN', Mref, _, _, Reason} -> + Tr({stop, 0}), + seq_trace:reset_trace(), + erlang:trace(new, false, [call]), + {error, Reason} + end. + +check_match_set_seq_token_log( + Label, + [{trace,C,call,{?MODULE,countdown,[B,Ref]}, {0,Label,0,C,0}}, + {trace,C,call,{?MODULE,countdown,[B,Ref,3]},{0,Label,0,C,0}}, + {trace,B,call,{?MODULE,bounce, [Ref]}, {0,Label,2,B,1}}, + {trace,C,call,{?MODULE,countdown,[B,Ref,2]},{0,Label,2,B,1}}, + {trace,B,call,{?MODULE,bounce, [Ref]}, {0,Label,4,B,3}}, + {trace,C,call,{?MODULE,countdown,[B,Ref,1]},{0,Label,4,B,3}}, + {trace,B,call,{?MODULE,bounce, [Ref]}, {0,Label,6,B,5}}, + {trace,C,call,{?MODULE,countdown,[B,Ref,0]},{0,Label,6,B,5}} + ]) -> + ok; +check_match_set_seq_token_log(_Label, Log) -> + {error, Log}. + +countdown_start(Bounce, Ref) -> + %% This gc and the increased heap size of this process ensures that + %% the match spec executed for countdown/2 has got heap space for + %% the trace token, so the heap gets trashed according to OTP-4222. + erlang:garbage_collect(), + countdown(Bounce, Ref). + +countdown(Bounce, Ref) -> + countdown(Bounce, Ref, 3). + +countdown(Bounce, Ref, 0) -> + Bounce ! Ref; +countdown(Bounce, Ref, Cnt) -> + Tag = make_ref(), + Bounce ! {Ref, self(), {Tag, Cnt}}, + receive {Tag, Cnt} -> countdown(Bounce, Ref, Cnt-1) end. + +bounce(Ref) -> + receive + Ref -> + ok; + {Ref, Dest, Msg} -> + Dest ! Msg, + bounce(Ref) + end. + + + +gc_seq_token(suite) -> + []; +gc_seq_token(doc) -> + ["Tests that a seq_trace token on a message in the inqueue ", + "can be garbage collected."]; +gc_seq_token(Config) when is_list(Config) -> + ?line Parent = self(), + ?line Timetrap = test_server:timetrap(test_server:seconds(20)), + %% OTP-4555 Seq trace token causes free mem read in gc + %% + %% This test crashes the emulator if the bug in question is present, + %% it is therefore done in a slave node. + %% + %% All the timeout stuff is here to get decent accuracy of the error + %% return value, instead of just 'timeout'. + % + ?line {ok, Sandbox} = start_node(seq_trace_other, []), + ?line true = rpc:call(Sandbox, code, add_patha, + [filename:dirname(code:which(?MODULE))]), + ?line Label = 4711, + %% Do the possibly crashing test + ?line P1 = + spawn( + fun () -> + Parent ! {self(), + rpc:call(Sandbox, + ?MODULE, do_gc_seq_token, [Label])} + end), + %% Probe the node with a simple rpc request, to see if it is alive. + ?line P2 = + spawn( + fun () -> + receive after 4000 -> ok end, + Parent ! {self(), rpc:call(Sandbox, erlang, abs, [-1])} + end), + %% If the test node hangs completely, this timer expires. + ?line R3 = erlang:start_timer(8000, self(), void), + %% + ?line ok = + receive + {P1, Result} -> + exit(P2, done), + erlang:cancel_timer(R3), + Result; + {P2, 1} -> + exit(P1, timeout), + erlang:cancel_timer(R3), + {error, "Test process hung"}; + {timeout, R3, _} -> + exit(P1, timeout), + exit(P2, timeout), + {error, "Test node hung"} + end, + %% + ?line stop_node(Sandbox), + ?line test_server:timetrap_cancel(Timetrap), + ok. + +do_gc_seq_token(Label) -> + Parent = self(), + Comment = + {"OTP-4555 Seq trace token causes free mem read in gc\n" + "\n" + "The crashing test goes as follows:\n" + "\n" + "Put a message with seq_trace token in the inqueue,\n" + "Grow the process heap big enough to become mmap'ed\n" + "and force a garbage collection using large terms\n" + "to get a test_heap instruction with a big size value.\n" + "Then try to trick the heap into shrinking.\n" + "\n" + "All this to make the GC move the heap between memory blocks.\n"}, + seq_trace:reset_trace(), + Child = spawn_link( + fun() -> + receive {Parent, no_seq_trace_token} -> ok end, + do_grow(Comment, 256*1024, []), + do_shrink(10), + receive {Parent, seq_trace_token} -> ok end, + Parent ! {self(), {token, seq_trace:get_token(label)}} + end), + seq_trace:set_token(label, Label), + Child ! {Parent, seq_trace_token}, + seq_trace:set_token([]), + Child ! {Parent, no_seq_trace_token}, + receive + {Child, {token, {label, Label}}} -> + ok; + {Child, {token, Other}} -> + {error, Other} + end. + +do_grow(_, 0, Acc) -> + Acc; +do_grow(E, N, Acc) -> + do_grow(E, N-1, [E | Acc]). + +do_shrink(0) -> + ok; +do_shrink(N) -> + erlang:garbage_collect(), + do_shrink(N-1). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Internal help functions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Call trace targets + +call_tracee_1(X) -> + X. + +call_tracee_2(X) -> + X. + + +transparent_tracer() -> + Ref = make_ref(), + Loop = + fun(Fun, Log, LN) -> + receive + {stop, MinLN, Ref, From} when LN >= MinLN -> + From ! {log, Ref, lists:reverse(Log)}; + Entry when is_tuple(Entry) == false; element(1, Entry) /= stop -> + Fun(Fun, [Entry | Log], LN+1) + end + end, + Self = self(), + Pid = + spawn(fun() -> + seq_trace:set_system_tracer(self()), + Self ! {started, Ref}, + Loop(Loop, [], 0) + end), + receive {started, Ref} -> ok end, + fun(pid) -> + Pid; + ({stop, N}) when integer(N), N >= 0 -> + Mref = erlang:monitor(process, Pid), + receive + {'DOWN', Mref, _, _, _} -> + {error, not_started} + after 0 -> + DeliverRef = erlang:trace_delivered(all), + receive + {trace_delivered,_,DeliverRef} -> ok + end, + Pid ! {stop, N, Ref, self()}, + receive {'DOWN', Mref, _, _, _} -> ok end, + receive {log, Ref, Log} -> + {ok, Log} + end + end + end. + + + +one_time_receiver() -> + receive _Term -> ok + end. + +one_time_receiver(exit) -> + receive Term -> + exit({exit, Term}) + end. + +simple_tracer(Data, DN) -> + receive + {seq_trace,Label,Info,Ts} -> + simple_tracer([{Label,Info,Ts}|Data], DN+1); + {seq_trace,Label,Info} -> + simple_tracer([{Label,Info}|Data], DN+1); + {stop,N,From} when DN >= N -> + From ! {tracerlog,lists:reverse(Data)} + end. + +stop_tracer(N) when integer(N) -> + case catch (seq_trace_SUITE_tracer ! {stop,N,self()}) of + {'EXIT', _} -> + {error, not_started}; + _ -> + receive + {tracerlog,Data} -> + Data + after 1000 -> + {error,timeout} + end + end. + +start_tracer() -> + stop_tracer(0), + Pid = spawn(?MODULE,simple_tracer,[[], 0]), + register(seq_trace_SUITE_tracer,Pid), + seq_trace:set_system_tracer(Pid), + Pid. + + + +start_node(Name, Param) -> + test_server:start_node(Name, slave, [{args, Param}]). + +stop_node(Node) -> + test_server:stop_node(Node). + +load_tracer(Config) -> + Path = ?config(data_dir, Config), + ok = erl_ddll:load_driver(Path, echo_drv), + open_port({spawn,echo_drv}, [eof,binary]). + +huge_data() -> huge_data(16384). +huge_data(0) -> []; +huge_data(N) when N rem 2 == 0 -> + P = huge_data(N div 2), + [P|P]; +huge_data(N) -> + P = huge_data(N div 2), + [16#1234566,P|P]. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/topApp2.app erlang-13.b.3-dfsg/lib/kernel/test/topApp2.app --- erlang-13.b.1-dfsg/lib/kernel/test/topApp2.app 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/topApp2.app 1998-05-07 23:01:30.000000000 +0100 @@ -0,0 +1,11 @@ + {application, topApp2, + [{description, "Test of start phase"}, + {id, "CXC 138 38"}, + {vsn, "2.0"}, + {applications, [kernel]}, + {modules, []}, + {registered, []}, + {env, [{own_env1, value1}, {own2, val2}]}, + {included_applications, [appinc1, appinc2]}, + {start_phases, [{init, [initArgs]}, {go, [goArgs]}]}, + {mod, {application_starter, [topApp2, {topApp2, 4, 6}]} }]}. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/topApp2.erl erlang-13.b.3-dfsg/lib/kernel/test/topApp2.erl --- erlang-13.b.1-dfsg/lib/kernel/test/topApp2.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/topApp2.erl 2009-11-20 13:30:39.000000000 +0000 @@ -0,0 +1,48 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(topApp2). +-behaviour(supervisor). + +%% External exports +-export([start/2, stop/1, start_phase/3]). + +%% Internal exports +-export([init/1]). + +start(_Type, {_AppN, Low, High}) -> + Name = list_to_atom(lists:concat([ch_sup, Low])), + {ok, P} = supervisor:start_link({local, Name}, ch_sup, + lists:seq(Low, High)), + {ok, P, []}. + +stop(_) -> ok. + +init(Nos) -> + SupFlags = {one_for_one, 12, 60}, + Chs = lists:map(fun(No) -> + {list_to_atom(lists:concat([ch,No])), + {ch, start_link, [{ch, No}]}, + permanent, 2000, worker, [ch]} + end, + Nos), + {ok, {SupFlags, Chs}}. + +start_phase(Phase, _Type, _Args) -> + (catch global:send(start_phase,{sp, Phase})), + ok. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/topApp3.app erlang-13.b.3-dfsg/lib/kernel/test/topApp3.app --- erlang-13.b.1-dfsg/lib/kernel/test/topApp3.app 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/topApp3.app 1998-05-07 23:01:32.000000000 +0100 @@ -0,0 +1,12 @@ + {application, topApp3, + [{description, "Test of start phase"}, + {id, "CXC 138 38"}, + {vsn, "2.0"}, + {applications, [kernel]}, + {modules, []}, + {registered, []}, + {env, [{own_env1, value1}, {own2, val2}]}, + {included_applications, [appinc1x, appinc2top]}, + {start_phases, [{top, [topArgs]}, {init, [initArgs]}, {some, [someArgs]}, + {spec, [specArgs]}, {go, [goArgs]}]}, + {mod, {application_starter, [topApp3, {topApp3, 4, 6}]} }]}. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/topApp3.erl erlang-13.b.3-dfsg/lib/kernel/test/topApp3.erl --- erlang-13.b.1-dfsg/lib/kernel/test/topApp3.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/topApp3.erl 2009-11-20 13:30:39.000000000 +0000 @@ -0,0 +1,48 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(topApp3). +-behaviour(supervisor). + +%% External exports +-export([start/2, stop/1, start_phase/3]). + +%% Internal exports +-export([init/1]). + +start(_Type, {_AppN, Low, High}) -> + Name = list_to_atom(lists:concat([ch_sup, Low])), + {ok, P} = supervisor:start_link({local, Name}, ch_sup, + lists:seq(Low, High)), + {ok, P, []}. + +stop(_) -> ok. + +init(Nos) -> + SupFlags = {one_for_one, 12, 60}, + Chs = lists:map(fun(No) -> + {list_to_atom(lists:concat([ch,No])), + {ch, start_link, [{ch, No}]}, + permanent, 2000, worker, [ch]} + end, + Nos), + {ok, {SupFlags, Chs}}. + +start_phase(Phase, _Type, _Args) -> + (catch global:send(start_phase,{sp, Phase})), + ok. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/topApp.app erlang-13.b.3-dfsg/lib/kernel/test/topApp.app --- erlang-13.b.1-dfsg/lib/kernel/test/topApp.app 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/topApp.app 1998-05-07 23:01:29.000000000 +0100 @@ -0,0 +1,11 @@ + {application, topApp, + [{description, "Test of start phase"}, + {id, "CXC 138 38"}, + {vsn, "2.0"}, + {applications, [kernel]}, + {modules, []}, + {registered, []}, + {env, [{own_env1, value1}, {own2, val2}]}, + {included_applications, [appinc1, appinc2]}, + {start_phases, [{init, [initArgs]}, {go, [goArgs]}]}, + {mod, {topApp, {topApp, 4, 6}} }]}. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/topApp.erl erlang-13.b.3-dfsg/lib/kernel/test/topApp.erl --- erlang-13.b.1-dfsg/lib/kernel/test/topApp.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/topApp.erl 2009-11-20 13:30:38.000000000 +0000 @@ -0,0 +1,48 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(topApp). +-behaviour(supervisor). + +%% External exports +-export([start/2, stop/1, start_phase/3]). + +%% Internal exports +-export([init/1]). + +start(_Type, {_AppN, Low, High}) -> + Name = list_to_atom(lists:concat([ch_sup, Low])), + {ok, P} = supervisor:start_link({local, Name}, ch_sup, + lists:seq(Low, High)), + {ok, P, []}. + +stop(_) -> ok. + +init(Nos) -> + SupFlags = {one_for_one, 12, 60}, + Chs = lists:map(fun(No) -> + {list_to_atom(lists:concat([ch,No])), + {ch, start_link, [{ch, No}]}, + permanent, 2000, worker, [ch]} + end, + Nos), + {ok, {SupFlags, Chs}}. + +start_phase(Phase, _Type, _Args) -> + (catch global:send(start_phase, {sp, Phase})), + ok. diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/wrap_log_reader_SUITE_data/Makefile.src erlang-13.b.3-dfsg/lib/kernel/test/wrap_log_reader_SUITE_data/Makefile.src --- erlang-13.b.1-dfsg/lib/kernel/test/wrap_log_reader_SUITE_data/Makefile.src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/wrap_log_reader_SUITE_data/Makefile.src 2003-07-07 13:20:20.000000000 +0100 @@ -0,0 +1,7 @@ +EFLAGS=+debug_info + +all: wrap_log_test.@EMULATOR@ + +wrap_log_test.@EMULATOR@: wrap_log_test.erl + erlc $(EFLAGS) wrap_log_test.erl + diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/wrap_log_reader_SUITE_data/wrap_log_test.erl erlang-13.b.3-dfsg/lib/kernel/test/wrap_log_reader_SUITE_data/wrap_log_test.erl --- erlang-13.b.1-dfsg/lib/kernel/test/wrap_log_reader_SUITE_data/wrap_log_test.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/wrap_log_reader_SUITE_data/wrap_log_test.erl 2009-11-20 13:30:43.000000000 +0000 @@ -0,0 +1,184 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%%---------------------------------------------------------------------- +%%% Purpose : Test wrap_log_reader.erl +%%%---------------------------------------------------------------------- + +-module(wrap_log_test). + +-export([init/0, stop/0]). +-define(fsize, 80). +-define(fno, 4). + +%-define(debug, true). + +-ifdef(debug). +-define(format(S, A), io:format(S, A)). +-else. +-define(format(S, A), ok). +-endif. + +init() -> + spawn(fun() -> start(logger) end), + spawn(fun() -> start2(wlt) end), + wait_registered(logger), + wait_registered(wlt), + ok. + +wait_registered(Name) -> + case whereis(Name) of + undefined -> + timer:sleep(100), + wait_registered(Name); + _Pid -> + ok + end. + +stop() -> + catch logger ! exit, + catch wlt ! exit, + wait_unregistered(logger), + wait_unregistered(wlt), + ok. + +wait_unregistered(Name) -> + case whereis(Name) of + undefined -> + ok; + _Pid -> + timer:sleep(100), + wait_unregistered(Name) + end. + +start(Name) -> + ?format("Starting ~p~n", [Name]), + register(Name, self()), + loop(). + +start2(Name) -> + ?format("Starting ~p~n", [Name]), + register(Name, self()), + loop2(eof, Name). + +loop() -> + receive + {open, Pid, Name, File} -> + R = disk_log:open([{name, Name}, {type, wrap}, {file, File}, + {size, {?fsize, ?fno}}]), + ?format("logger: open ~p -> ~p~n", [Name, R]), + Pid ! R, + loop(); + + {open_ext, Pid, Name, File} -> + R = disk_log:open([{name, Name}, {type, wrap}, {file, File}, + {format, external}, {size, {?fsize, ?fno}}]), + ?format("logger: open ~p -> ~p~n", [Name, R]), + Pid ! R, + loop(); + + {close, Pid, Name} -> + R = disk_log:close(Name), + ?format("logger: close ~p -> ~p~n", [Name, R]), + Pid ! R, + loop(); + + {sync, Pid, Name} -> + R = disk_log:sync(Name), + ?format("logger: sync ~p -> ~p~n", [Name, R]), + Pid ! R, + loop(); + + {log_terms, Pid, Name, Terms} -> + R = disk_log:log_terms(Name, Terms), + ?format("logger: log_terms ~p -> ~p~n", [Name, R]), + Pid ! R, + loop(); + + {blog_terms, Pid, Name, Terms} -> + R = disk_log:blog_terms(Name, Terms), + ?format("logger: blog_terms ~p -> ~p~n", [Name, R]), + Pid ! R, + loop(); + + exit -> + ?format("Stopping logger~n", []), + exit(normal); + + _Else -> + ?format("logger: ignored: ~p~n", [_Else]), + loop() + end. + +loop2(C, Wlt) -> + receive + {open, Pid, Name} -> + case wrap_log_reader:open(Name) of + {ok, R} -> + ?format("~p: open ~p -> ~p~n", [Wlt, Name, {ok, R}]), + Pid ! {ok, R}, + loop2(R, Wlt); + E -> + ?format("~p: open ~p -> ~p~n", [Wlt, Name, E]), + Pid ! E, + loop2(C, Wlt) + end; + + {open, Pid, Name, No} -> + case wrap_log_reader:open(Name, No) of + {ok, R} -> + ?format("~p: open ~p, file ~p -> ~p~n", + [Wlt, Name, No, {ok, R}]), + Pid ! {ok, R}, + loop2(R, Wlt); + E -> + ?format("~p: open ~p, file ~p -> ~p~n", + [Wlt, Name, No, E]), + Pid ! E, + loop2(C, Wlt) + end; + + {close, Pid, WR} -> + R = wrap_log_reader:close(WR), + ?format("~p: close -> ~p~n", [Wlt, R]), + Pid ! R, + loop2(eof, Wlt); + + {chunk, Pid, WR} -> + did_chunk(wrap_log_reader:chunk(WR), Pid, Wlt); + + {chunk, Pid, WR, N} -> + did_chunk(wrap_log_reader:chunk(WR, N), Pid, Wlt); + + exit -> + ?format("Stopping ~p~n", [Wlt]), + exit(normal); + + _Else -> + ?format("~p: ignored: ~p~n", [Wlt, _Else]), + loop2(C, Wlt) + end. + +did_chunk({C1, L}, Pid, Wlt) -> + ?format("~p: chunk -> ~p~n", [Wlt, {C1, L}]), + Pid ! {C1, L}, + loop2(C1, Wlt); +did_chunk({C1, L, _Bad}, Pid, Wlt) -> + ?format("~p: chunk -> ~p (bad)~n", [Wlt, {C1, L, _Bad}]), + Pid ! {C1, L}, + loop2(C1, Wlt). diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/wrap_log_reader_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/wrap_log_reader_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/wrap_log_reader_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/wrap_log_reader_SUITE.erl 2009-11-20 13:30:42.000000000 +0000 @@ -0,0 +1,550 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(wrap_log_reader_SUITE). + +%-define(debug, true). + +-ifdef(debug). +-define(format(S, A), io:format(S, A)). +-define(line, put(line, ?LINE), ). +-define(privdir(_), "./disk_log_SUITE_priv"). +-define(config(X,Y), foo). +-define(t,test_server). +-else. +-include("test_server.hrl"). +-define(format(S, A), ok). +-define(privdir(Conf), ?config(priv_dir, Conf)). +-endif. + +-export([all/1, + no_file/1, + one/1, one_empty/1, one_filled/1, + two/1, two_filled/1, + four/1, four_filled/1, + wrap/1, wrap_filled/1, + wrapping/1, + external/1, + error/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +all(suite) -> + [no_file, one, two, four, wrap, wrapping, external, error]. + +init_per_testcase(Func, Config) when atom(Func), list(Config) -> + Dog=?t:timetrap(?t:seconds(60)), + [{watchdog, Dog} | Config]. + +fin_per_testcase(_Func, _Config) -> + Dog=?config(watchdog, _Config), + ?t:timetrap_cancel(Dog). + +no_file(suite) -> []; +no_file(doc) -> ["No log file exists"]; +no_file(Conf) when list(Conf) -> + ?line code:add_path(?config(data_dir,Conf)), + Dir = ?privdir(Conf), + File = join(Dir, "sune.LOG"), + delete_files(File), + start(), + + wlt ! {open, self(), File}, + ?line rec({error, {index_file_not_found, File}}, ?LINE), + wlt ! {open, self(), File, 1}, + ?line rec({error, {index_file_not_found, File}}, ?LINE), + wlt ! {open, self(), File, 4}, + ?line rec({error, {index_file_not_found, File}}, ?LINE), + + stop(), + delete_files(File), + ok. + +one(suite) -> [one_empty, one_filled]; +one(doc) -> ["One index file"]. + +one_empty(suite) -> []; +one_empty(doc) -> ["One empty index file"]; +one_empty(Conf) when list(Conf) -> + Dir = ?privdir(Conf), + File = join(Dir, "sune.LOG"), + delete_files(File), + start(), + + ?line open(sune, File, ?LINE), + %% open + ?line do_chunk([{open,File}, eof], wlt, ?LINE), + ?line do_chunk([{open,File,1}, eof], wlt, ?LINE), + wlt ! {open, self(), File, 2}, + ?line rec({error, {file_not_found, add_ext(File, 2)}}, ?LINE), + ?line close(sune), + + %% closed + ?line do_chunk([{open,File}, eof], wlt, ?LINE), + ?line do_chunk([{open,File,1}, eof], wlt, ?LINE), + wlt ! {open, self(), File, 2}, + ?line rec({error, {file_not_found, add_ext(File, 2)}}, ?LINE), + + stop(), + delete_files(File), + ok. + +one_filled(suite) -> []; +one_filled(doc) -> ["One filled index file"]; +one_filled(Conf) when list(Conf) -> + Dir = ?privdir(Conf), + File = join(Dir, "sune.LOG"), + delete_files(File), + start(), + + ?line open(sune, File, ?LINE), + ?line log_terms(sune, ["first round, one", "first round, two"]), + ?line sync(sune), + %% open + test_one(File), + ?line close(sune), + %% closed + test_one(File), + + stop(), + delete_files(File), + ok. + +test_one(File) -> + ?line do_chunk([{open,File}, + {chunk, ["first round, one", "first round, two"]}, + eof], wlt, ?LINE), + ?line do_chunk([{open,File,1}, + {chunk, ["first round, one", "first round, two"]}, + eof], wlt, ?LINE), + wlt ! {open, self(), File, 2}, + ?line rec({error, {file_not_found, add_ext(File, 2)}}, ?LINE), + ?line do_chunk([{open,File,1}, {chunk, 1, ["first round, one"]}, + {chunk, 1, ["first round, two"]}, eof], wlt, ?LINE), + ok. + +two(suite) -> [two_filled]; +two(doc) -> ["Two index files"]. + +two_filled(suite) -> []; +two_filled(doc) -> ["Two filled index files"]; +two_filled(Conf) when list(Conf) -> + Dir = ?privdir(Conf), + File = list_to_atom(join(Dir, "sune.LOG")), + delete_files(File), + start(), + + ?line open(sune, File, ?LINE), + ?line log_terms(sune, ["first round, 11", "first round, 12"]), + ?line log_terms(sune, ["first round, 21", "first round, 22"]), + ?line sync(sune), + %% open + test_two(File), + ?line close(sune), + %% closed + test_two(File), + + stop(), + delete_files(File), + ok. + +test_two(File) -> + ?line do_chunk([{open,File}, + {chunk, infinity, ["first round, 11", "first round, 12"]}, + {chunk, ["first round, 21", "first round, 22"]}, + eof], wlt, ?LINE), + ?line do_chunk([{open,File,1}, + {chunk, ["first round, 11", "first round, 12"]}, + eof], wlt, ?LINE), + ?line do_chunk([{open,File,2}, + {chunk, ["first round, 21", "first round, 22"]}, + eof], wlt, ?LINE), + wlt ! {open, self(), File, 3}, + ?line rec({error, {file_not_found, add_ext(File, 3)}}, ?LINE), + ?line do_chunk([{open,File,1}, {chunk, 1, ["first round, 11"]}, + {chunk, 2, ["first round, 12"]}, eof], wlt, ?LINE), + ok. + +four(suite) -> [four_filled]; +four(doc) -> ["Four index files"]. + +four_filled(suite) -> []; +four_filled(doc) -> ["Four filled index files"]; +four_filled(Conf) when list(Conf) -> + Dir = ?privdir(Conf), + File = join(Dir, "sune.LOG"), + delete_files(File), + start(), + + ?line open(sune, File, ?LINE), + ?line init_files(0), + ?line sync(sune), + %% open + test_four(File), + ?line close(sune), + %% closed + test_four(File), + + stop(), + delete_files(File), + ok. + +test_four(File) -> + ?line do_chunk([{open,File}, + {chunk, ["first round, 11", "first round, 12"]}, + {chunk, ["first round, 21", "first round, 22"]}, + {chunk, ["first round, 31", "first round, 32"]}, + {chunk, ["first round, 41", "first round, 42"]}, + eof], wlt, ?LINE), + ?line do_chunk([{open,File,1}, + {chunk, ["first round, 11", "first round, 12"]}, + eof], wlt, ?LINE), + ?line do_chunk([{open,File,4}, + {chunk, ["first round, 41", "first round, 42"]}, + eof], wlt, ?LINE), + wlt ! {open, self(), File, 5}, + ?line rec({error, {file_not_found, add_ext(File, 5)}}, ?LINE), + ?line do_chunk([{open,File,1}, {chunk, 1, ["first round, 11"]}, + {chunk, 2, ["first round, 12"]}, eof], wlt, ?LINE), + ?line do_chunk([{open,File,4}, {chunk, 1, ["first round, 41"]}, + {chunk, 2, ["first round, 42"]}, eof], wlt, ?LINE), + ok. + +wrap(suite) -> [wrap_filled]; +wrap(doc) -> ["Wrap index file, first wrapping"]. + +wrap_filled(suite) -> []; +wrap_filled(doc) -> ["First wrap, open, filled index file"]; +wrap_filled(Conf) when list(Conf) -> + Dir = ?privdir(Conf), + File = join(Dir, "sune.LOG"), + delete_files(File), + start(), + + ?line open(sune, File, ?LINE), + ?line init_files(0), + ?line log_terms(sune, ["second round, 11", "second round, 12"]), + ?line sync(sune), + %% open + test_wrap(File), + ?line close(sune), + %% closed + test_wrap(File), + + stop(), + delete_files(File), + ok. + +test_wrap(File) -> + ?line do_chunk([{open,File}, + {chunk, ["first round, 21", "first round, 22"]}, + {chunk, ["first round, 31", "first round, 32"]}, + {chunk, ["first round, 41", "first round, 42"]}, + {chunk, ["second round, 11", "second round, 12"]}, + eof], wlt, ?LINE), + ?line do_chunk([{open,File,1}, + {chunk, ["second round, 11", "second round, 12"]}, + eof], wlt, ?LINE), + ?line do_chunk([{open,File,2}, + {chunk, ["first round, 21", "first round, 22"]}, + eof], wlt, ?LINE), + wlt ! {open, self(), File, 5}, + ?line rec({error, {file_not_found, add_ext(File, 5)}}, ?LINE), + ?line do_chunk([{open,File,1}, {chunk, 1, ["second round, 11"]}, + {chunk, 2, ["second round, 12"]}, eof], wlt, ?LINE), + ?line do_chunk([{open,File,4}, {chunk, 1, ["first round, 41"]}, + {chunk, 2, ["first round, 42"]}, eof], wlt, ?LINE), + ok. + +wrapping(suite) -> []; +wrapping(doc) -> ["Wrapping at the same time as reading"]; +wrapping(Conf) when list(Conf) -> + Dir = ?privdir(Conf), + File = join(Dir, "sune.LOG"), + delete_files(File), + start(), + + ?line open(sune, File, ?LINE), + ?line init_files(1100), + ?line sync(sune), + ?line C1 = + do_chunk([{open,File}, {chunk, 1, ["first round, 11"]}], wlt, ?LINE), + ?line log_terms(sune, ["second round, 11", "second round, 12"]), + ?line sync(sune), + ?line do_chunk([{chunk, 1, ["first round, 12"]}, + %% Here two bad bytes are found. + {chunk, ["first round, 21", "first round, 22"]}, + {chunk, ["first round, 31", "first round, 32"]}, + {chunk, ["first round, 41", "first round, 42"]}, eof], + wlt, ?LINE, C1), + start(), + delete_files(File), + ?line open(sune, File, ?LINE), + ?line init_files(1100), + ?line sync(sune), + ?line C2 = + do_chunk([{open,File}, {chunk, 1, ["first round, 11"]}], wlt, ?LINE), + ?line log_terms(sune, ["second round, 11", "second round, 12"]), + ?line close(sune), + ?line do_chunk([{chunk, 1, ["first round, 12"]}, + %% Here two bad bytes are found. + {chunk, ["first round, 21", "first round, 22"]}, + {chunk, ["first round, 31", "first round, 32"]}, + {chunk, ["first round, 41", "first round, 42"]}, eof], + wlt, ?LINE, C2), + start(), + delete_files(File), + ?line open(sune, File, ?LINE), + ?line init_files(1100), + ?line sync(sune), + ?line C3 = do_chunk([{open,File}], wlt, ?LINE), + ?line log_terms(sune, ["second round, 11"]), + ?line sync(sune), + ?line do_chunk([{chunk, 1, ["second round, 11"]}, + {chunk, 1, ["first round, 21"]}, + {chunk, 1, ["first round, 22"]}, + {chunk, ["first round, 31", "first round, 32"]}, + {chunk, ["first round, 41", "first round, 42"]}, eof], + wlt, ?LINE, C3), + + stop(), + delete_files(File), + ok. + +external(suite) -> []; +external(doc) -> ["External format"]; +external(Conf) when list(Conf) -> + Dir = ?privdir(Conf), + File = join(Dir, "sune.LOG"), + delete_files(File), + start(), + + ?line open_ext(sune, File, ?FILE), + ?line init_files_ext(0), + ?line close(sune), + P0 = pps(), + wlt ! {open, self(), File}, + ?line rec({error, {not_a_log_file, add_ext(File, 1)}}, ?LINE), + ?line true = (P0 == pps()), + + stop(), + delete_files(File), + ok. + +error(suite) -> []; +error(doc) -> ["Error situations"]; +error(Conf) when list(Conf) -> + Dir = ?privdir(Conf), + File = join(Dir, "sune.LOG"), + delete_files(File), + start(), + + P0 = pps(), + wlt ! {open, self(), File, 1}, + ?line rec({error, {index_file_not_found, File}}, ?LINE), + wlt ! {open, self(), File}, + ?line rec({error, {index_file_not_found, File}}, ?LINE), + ?line true = (P0 == pps()), + + ?line open(sune, File, ?LINE), + ?line close(sune), + P1 = pps(), + ?line First = add_ext(File, 1), + ?line ok = file:delete(First), + wlt ! {open, self(), File}, + ?line rec({error, {not_a_log_file, First}}, ?LINE), + ?line true = (P1 == pps()), + + delete_files(File), + ?line open(sune, File, ?LINE), + ?line init_files(0), + ?line close(sune), + P2 = pps(), + ?line C = do_chunk([{open,File}, + {chunk, ["first round, 11", "first round, 12"]}], + wlt, ?LINE), + ?line Second = add_ext(File, 2), + ?line ok = file:delete(Second), + wlt ! {chunk, self(), C}, + ?line rec({error, {file_error, Second, {error, enoent}}}, ?LINE), + ?line ok = file:write_file(Second, <<17:(3*8)>>), % three bytes + wlt ! {chunk, self(), C}, + ?line rec({error, {not_a_log_file, Second}}, ?LINE), + ?line do_chunk([close], wlt, ?LINE, C), + ?line true = (P2 == pps()), + + delete_files(File), + ?line open(sune, File, ?LINE), + ?line init_files(0), + ?line close(sune), + P3 = pps(), + timer:sleep(1100), + Now = calendar:local_time(), + ?line ok = file:change_time(First, Now), + ?line C2 = do_chunk([{open,File}, + {chunk, ["first round, 11", "first round, 12"]}], + wlt, ?LINE), + wlt ! {chunk, self(), C2}, + ?line rec({error,{is_wrapped,First}}, ?LINE), + ?line do_chunk([close], wlt, ?LINE, C2), + IndexFile = add_ext(File, idx), + ?line ok = file:write_file(IndexFile, <<17:(3*8)>>), + wlt ! {open, self(), File, 1}, + ?line rec({error, {index_file_not_found, File}}, ?LINE), + ?line true = (P3 == pps()), + + stop(), + delete_files(File), + ok. + +start() -> + ?line ok = wrap_log_test:stop(), + dl_wait(), + ?line ok = wrap_log_test:init(). + +stop() -> + ?line ok = wrap_log_test:stop(), + dl_wait(). + +%% Give disk logs opened by 'logger' and 'wlt' time to close after +%% receiving EXIT signals. +dl_wait() -> + case disk_log:accessible_logs() of + {[], []} -> + ok; + _ -> + timer:sleep(100), + dl_wait() + end. + +delete_files(File) -> + file:delete(add_ext(File, idx)), + file:delete(add_ext(File, siz)), + file:delete(add_ext(File, 1)), + file:delete(add_ext(File, 2)), + file:delete(add_ext(File, 3)), + file:delete(add_ext(File, 4)), + ok. + +init_files(Delay) -> + ?line log_terms(sune, ["first round, 11", "first round, 12"]), + timer:sleep(Delay), + ?line log_terms(sune, ["first round, 21", "first round, 22"]), + timer:sleep(Delay), + ?line log_terms(sune, ["first round, 31", "first round, 32"]), + timer:sleep(Delay), + ?line log_terms(sune, ["first round, 41", "first round, 42"]), + timer:sleep(Delay), + ok. + +init_files_ext(Delay) -> + ?line blog_terms(sune, ["first round, 11", "first round, 12"]), + timer:sleep(Delay), + ?line blog_terms(sune, ["first round, 21", "first round, 22"]), + timer:sleep(Delay), + ?line blog_terms(sune, ["first round, 31", "first round, 32"]), + timer:sleep(Delay), + ?line blog_terms(sune, ["first round, 41", "first round, 42"]), + timer:sleep(Delay), + ok. + +join(A, B) -> + filename:nativename(filename:join(A, B)). + +do_chunk(Commands, Server, Where) -> + do_chunk(Commands, Server, Where, foo). + +do_chunk([{open, File, One} | Cs], S, W, _C) -> + S ! {open, self(), File, One}, + ?line NC = rec1(ok, {W,?LINE}), + do_chunk(Cs, S, W, NC); +do_chunk([{open, File} | Cs], S, W, _C) -> + S ! {open, self(), File}, + ?line NC = rec1(ok, {W,?LINE}), + do_chunk(Cs, S, W, NC); +do_chunk([{chunk, Terms} | Cs], S, W, C) -> + S ! {chunk, self(), C}, + ?line NC = rec2(Terms, {W,?LINE}), + do_chunk(Cs, S, W, NC); +do_chunk([{chunk, N, Terms} | Cs], S, W, C) -> + S ! {chunk, self(), C, N}, + ?line NC = rec2(Terms, {W,?LINE}), + do_chunk(Cs, S, W, NC); +do_chunk([eof], S, W, C) -> + S ! {chunk, self(), C}, + ?line C1 = rec2(eof, {W,?LINE}), + do_chunk([close], S, W, C1); +do_chunk([close], S, W, C) -> + S ! {close, self(), C}, + ?line rec(ok, {W,?LINE}); +do_chunk([], _S, _W, C) -> + C. + +add_ext(Name, Ext) -> + lists:concat([Name, ".", Ext]). + +%% disk_log. +open(Log, File, Where) -> + logger ! {open, self(), Log, File}, + rec1(ok, Where). + +open_ext(Log, File, Where) -> + logger ! {open_ext, self(), Log, File}, + rec1(ok, Where). + +close(Log) -> + logger ! {close, self(), Log}, + rec(ok, ?LINE). + +sync(Log) -> + logger ! {sync, self(), Log}, + rec(ok, ?LINE). + +log_terms(File, Terms) -> + logger ! {log_terms, self(), File, Terms}, + rec(ok, ?LINE). + +blog_terms(File, Terms) -> + logger ! {blog_terms, self(), File, Terms}, + rec(ok, ?LINE). + +rec1(M, Where) -> + receive + {M, C} -> C; + Else -> test_server:fail({error, {Where, Else}}) + after 1000 -> test_server:fail({error, {Where, time_out}}) + end. + +rec2(M, Where) -> + receive + {C, M} -> C; + Else -> test_server:fail({error, {Where, Else}}) + after 1000 -> test_server:fail({error, {Where, time_out}}) + end. + +rec(M, Where) -> + receive + M -> + ok; + Else -> ?t:fail({error, {Where, Else}}) + after 1000 -> ?t:fail({error, {Where, time_out}}) + end. + +pps() -> + {erlang:ports(), lists:filter({erlang, is_process_alive}, processes())}. Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/kernel/test/zlib_SUITE_data/png-compressed.zlib and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/kernel/test/zlib_SUITE_data/png-compressed.zlib differ diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/zlib_SUITE_data/zipdoc erlang-13.b.3-dfsg/lib/kernel/test/zlib_SUITE_data/zipdoc --- erlang-13.b.1-dfsg/lib/kernel/test/zlib_SUITE_data/zipdoc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/zlib_SUITE_data/zipdoc 2006-05-03 09:12:02.000000000 +0100 @@ -0,0 +1,1924 @@ +[Info-ZIP note, 981119: this file is based on PKWARE's appnote.txt of + 15 February 1996, taking into account PKWARE's revised appnote.txt version + of 01 September 1998. It has been unofficially corrected and extended by + Info-ZIP without explicit permission by PKWARE. Although Info-ZIP + believes the information to be accurate and complete, it is provided + under a disclaimer similar to the PKWARE disclaimer below, differing + only in the substitution of "Info-ZIP" for "PKWARE". In other words, + use this information at your own risk, but we think it's correct. + + Specification info from PKWARE that was obviously wrong has been corrected + silently (e.g. missing structure fields, wrong numbers + As of PKZIPW 2.50, two new incompatibilities have been introduced by PKWARE; + they are noted below. Note that the "NTFS tag" conflict is currently not + real; PKZIPW 2.50 actually tags NTFS files as having come from a FAT + file system, too.] + + +Disclaimer +---------- + +Although PKWARE will attempt to supply current and accurate +information relating to its file formats, algorithms, and the +subject programs, the possibility of error can not be eliminated. +PKWARE therefore expressly disclaims any warranty that the +information contained in the associated materials relating to the +subject programs and/or the format of the files created or +accessed by the subject programs and/or the algorithms used by +the subject programs, or any other matter, is current, correct or +accurate as delivered. Any risk of damage due to any possible +inaccurate information is assumed by the user of the information. +Furthermore, the information relating to the subject programs +and/or the file formats created or accessed by the subject +programs and/or the algorithms used by the subject programs is +subject to change without notice. + + +General Format of a ZIP file +---------------------------- + + Files stored in arbitrary order. Large zipfiles can span multiple + diskette media. + + Overall zipfile format: + + [local file header + file data + data_descriptor] . . . + [central directory] end of central directory record + + + A. Local file header: + + local file header signature 4 bytes (0x04034b50) + version needed to extract 2 bytes + general purpose bit flag 2 bytes + compression method 2 bytes + last mod file time 2 bytes + last mod file date 2 bytes + crc-32 4 bytes + compressed size 4 bytes + uncompressed size 4 bytes + filename length 2 bytes + extra field length 2 bytes + + filename (variable size) + extra field (variable size) + + + B. Data descriptor: + + data descriptor signature 4 bytes (0x08074b50) + crc-32 4 bytes + compressed size 4 bytes + uncompressed size 4 bytes + + This descriptor exists only if bit 3 of the general + purpose bit flag is set (see below). It is byte aligned + and immediately follows the last byte of compressed data. + This descriptor is used only when it was not possible to + seek in the output zip file, e.g., when the output zip file + was standard output or a non seekable device. + + C. Central directory structure: + + [file header] . . . end of central dir record + + File header: + + central file header signature 4 bytes (0x02014b50) + version made by 2 bytes + version needed to extract 2 bytes + general purpose bit flag 2 bytes + compression method 2 bytes + last mod file time 2 bytes + last mod file date 2 bytes + crc-32 4 bytes + compressed size 4 bytes + uncompressed size 4 bytes + filename length 2 bytes + extra field length 2 bytes + file comment length 2 bytes + disk number start 2 bytes + internal file attributes 2 bytes + external file attributes 4 bytes + relative offset of local header 4 bytes + + filename (variable size) + extra field (variable size) + file comment (variable size) + + End of central dir record: + + end of central dir signature 4 bytes (0x06054b50) + number of this disk 2 bytes + number of the disk with the + start of the central directory 2 bytes + total number of entries in + the central dir on this disk 2 bytes + total number of entries in + the central dir 2 bytes + size of the central directory 4 bytes + offset of start of central + directory with respect to + the starting disk number 4 bytes + zipfile comment length 2 bytes + zipfile comment (variable size) + + + D. Explanation of fields: + + version made by (2 bytes) + + The upper byte indicates the host system (OS) for the + file. Software can use this information to determine + the line record format for text files etc. The current + mappings are: + + 0 - FAT file system (DOS, OS/2, NT) + PKZIPW 2.50 VFAT, NTFS + 1 - Amiga + 2 - VMS (VAX or Alpha AXP) + 3 - Unix + 4 - VM/CMS + 5 - Atari + 6 - HPFS file system (OS/2, NT 3.x) + 7 - Macintosh + 8 - Z-System + 9 - CP/M + 10 - TOPS-20 [supposedly PKZIPW 2.50 NTFS] + 11 - NTFS file system (NT) [used by Info-ZIP, only] + 12 - SMS/QDOS + 13 - Acorn RISC OS + 14 - VFAT file system (Win95, NT) [Info-ZIP reservation, unused] + 15 - MVS + 16 - BeOS (BeBox or PowerMac) + 17 - Tandem + 18 thru 255 - unused + + The lower byte indicates the version number of the + software used to encode the file. The value/10 + indicates the major version number, and the value + mod 10 is the minor version number. + + version needed to extract (2 bytes) + + The minimum software version needed to extract the + file, mapped as above. + + general purpose bit flag: (2 bytes) + + Bit 0: If set, indicates that the file is encrypted. + + (For Method 6 - Imploding) + Bit 1: If the compression method used was type 6, + Imploding, then this bit, if set, indicates + an 8K sliding dictionary was used. If clear, + then a 4K sliding dictionary was used. + Bit 2: If the compression method used was type 6, + Imploding, then this bit, if set, indicates + an 3 Shannon-Fano trees were used to encode the + sliding dictionary output. If clear, then 2 + Shannon-Fano trees were used. + + (For Method 8 - Deflating) + Bit 2 Bit 1 + 0 0 Normal (-en) compression option was used. + 0 1 Maximum (-ex) compression option was used. + 1 0 Fast (-ef) compression option was used. + 1 1 Super Fast (-es) compression option was used. + + Note: Bits 1 and 2 are undefined if the compression + method is any other. + + Bit 3: If this bit is set, the fields crc-32, compressed size + and uncompressed size are set to zero in the local + header. The correct values are put in the data descriptor + immediately following the compressed data. (Note: PKZIP + version 2.04g for DOS only recognizes this bit for method 8 + compression, newer versions of PKZIP recognize this bit + for any compression method.) + [Info-ZIP note: This bit was introduced by PKZIP 2.04 for + DOS. In general, this feature can only be reliably used + together with compression methods that allow intrinsic + detection of the "end-of-compressed-data" condition. From + the set of compression methods described in this Zip archive + specification, only "deflate" meets this requirement. + Especially, the method STORED does not work! + The Info-ZIP tools recognize this bit regardless of the + compression method; but, they rely on correctly set + "compressed size" information in the central directory entry.] + + Bit 5: If this bit is set, this indicates that the file is compressed + patched data. (Note: Requires PKZIP version 2.70 or greater) + + The upper three bits are reserved and used internally + by the software when processing the zipfile. The + remaining bits are unused. + + compression method: (2 bytes) + + (see accompanying documentation for algorithm + descriptions) + + 0 - The file is stored (no compression) + 1 - The file is Shrunk + 2 - The file is Reduced with compression factor 1 + 3 - The file is Reduced with compression factor 2 + 4 - The file is Reduced with compression factor 3 + 5 - The file is Reduced with compression factor 4 + 6 - The file is Imploded + 7 - Reserved for Tokenizing compression algorithm + 8 - The file is Deflated + 9 - Reserved for enhanced Deflating + 10 - PKWARE Data Compression Library Imploding + + date and time fields: (2 bytes each) + + The date and time are encoded in standard MS-DOS format. + If input came from standard input, the date and time are + those at which compression was started for this data. + + CRC-32: (4 bytes) + + The CRC-32 algorithm was generously contributed by + David Schwaderer and can be found in his excellent + book "C Programmers Guide to NetBIOS" published by + Howard W. Sams & Co. Inc. The 'magic number' for + the CRC is 0xdebb20e3. The proper CRC pre and post + conditioning is used, meaning that the CRC register + is pre-conditioned with all ones (a starting value + of 0xffffffff) and the value is post-conditioned by + taking the one's complement of the CRC residual. + If bit 3 of the general purpose flag is set, this + field is set to zero in the local header and the correct + value is put in the data descriptor and in the central + directory. + + compressed size: (4 bytes) + uncompressed size: (4 bytes) + + The size of the file compressed and uncompressed, + respectively. If bit 3 of the general purpose bit flag + is set, these fields are set to zero in the local header + and the correct values are put in the data descriptor and + in the central directory. + + filename length: (2 bytes) + extra field length: (2 bytes) + file comment length: (2 bytes) + + The length of the filename, extra field, and comment + fields respectively. The combined length of any + directory record and these three fields should not + generally exceed 65,535 bytes. If input came from standard + input, the filename length is set to zero. + + [Info-ZIP note: + This feature is not yet supported by any PKWARE version of ZIP + (at least not in PKZIP for DOS and PKZIP for Windows/WinNT). + The Info-ZIP programs handle standard input differently: + If input came from standard input, the filename is set to "-" + (length one).] + + + disk number start: (2 bytes) + + The number of the disk on which this file begins. + + internal file attributes: (2 bytes) + + The lowest bit of this field indicates, if set, that + the file is apparently an ASCII or text file. If not + set, that the file apparently contains binary data. + The remaining bits are unused in version 1.0. + + external file attributes: (4 bytes) + + The mapping of the external attributes is + host-system dependent (see 'version made by'). For + MS-DOS, the low order byte is the MS-DOS directory + attribute byte. If input came from standard input, this + field is set to zero. + + relative offset of local header: (4 bytes) + + This is the offset from the start of the first disk on + which this file appears, to where the local header should + be found. + + filename: (Variable) + + The name of the file, with optional relative path. + The path stored should not contain a drive or + device letter, or a leading slash. All slashes + should be forward slashes '/' as opposed to + backwards slashes '\' for compatibility with Amiga + and Unix file systems etc. If input came from standard + input, there is no filename field. + [Info-ZIP discrepancy: + If input came from standard input, the file name is set + to "-" (without the quotes). + As far as we know, the PKWARE specification for "input from + stdin" is not supported by PKZIP/PKUNZIP for DOS, OS/2, Windows + Windows NT.] + + extra field: (Variable) + + This is for future expansion. If additional information + needs to be stored in the future, it should be stored + here. Earlier versions of the software can then safely + skip this file, and find the next file or header. This + field will be 0 length in version 1.0. + + In order to allow different programs and different types + of information to be stored in the 'extra' field in .ZIP + files, the following structure should be used for all + programs storing data in this field: + + header1+data1 + header2+data2 . . . + + Each header should consist of: + + Header ID - 2 bytes + Data Size - 2 bytes + + Note: all fields stored in Intel low-byte/high-byte order. + + The Header ID field indicates the type of data that is in + the following data block. + + Header ID's of 0 thru 31 are reserved for use by PKWARE. + The remaining ID's can be used by third party vendors for + proprietary usage. + + The current Header ID mappings defined by PKWARE are: + + 0x0007 AV Info + 0x0009 OS/2 extended attributes (also Info-ZIP) + 0x000a PKWARE Win95/WinNT FileTimes [undocumented!] + 0x000c PKWARE VAX/VMS (also Info-ZIP) + 0x000d PKWARE Unix + 0x000f Patch Descriptor + + The Header ID mappings defined by Info-ZIP and third parties are: + + 0x07c8 Info-ZIP Macintosh (old, J. Lee) + 0x2605 ZipIt Macintosh (first version) + 0x2705 ZipIt Macintosh v 1.3.5 and newer (w/o full filename) + 0x334d Info-ZIP Macintosh (new, D. Haase's 'Mac3' field ) + 0x4341 Acorn/SparkFS (David Pilling) + 0x4453 Windows NT security descriptor (binary ACL) + 0x4704 VM/CMS + 0x470f MVS + 0x4b46 FWKCS MD5 (third party, see below) + 0x4c41 OS/2 access control list (text ACL) + 0x4d49 Info-ZIP VMS (VAX or Alpha) + 0x5356 AOS/VS (binary ACL) + 0x5455 extended timestamp + 0x5855 Info-ZIP Unix (original; also OS/2, NT, etc.) + 0x6542 BeOS (BeBox, PowerMac, etc.) + 0x756e ASi Unix + 0x7855 Info-ZIP Unix (new) + 0xfb4a SMS/QDOS + + The Data Size field indicates the size of the following + data block. Programs can use this value to skip to the + next header block, passing over any data blocks that are + not of interest. + + Note: As stated above, the size of the entire .ZIP file + header, including the filename, comment, and extra + field should not exceed 64K in size. + + In case two different programs should appropriate the same + Header ID value, it is strongly recommended that each + program place a unique signature of at least two bytes in + size (and preferably 4 bytes or bigger) at the start of + each data area. Every program should verify that its + unique signature is present, in addition to the Header ID + value being correct, before assuming that it is a block of + known type. + + In the following descriptions, note that "Short" means two bytes, + "Long" means four bytes, and "Long-Long" means eight bytes, + regardless of their native sizes. Unless specifically noted, all + integer fields should be interpreted as unsigned (non-negative) + numbers. + + + -OS/2 Extended Attributes Extra Field: + ==================================== + + The following is the layout of the OS/2 extended attributes "extra" + block. (Last Revision 19960922) + + Note: all fields stored in Intel low-byte/high-byte order. + + Local-header version: + + Value Size Description + ----- ---- ----------- + (OS/2) 0x0009 Short tag for this extra block type + TSize Short total data size for this block + BSize Long uncompressed EA data size + CType Short compression type + EACRC Long CRC value for uncompressed EA data + (var.) variable compressed EA data + + Central-header version: + + Value Size Description + ----- ---- ----------- + (OS/2) 0x0009 Short tag for this extra block type + TSize Short total data size for this block + BSize Long size of uncompressed local EA data + + The value of CType is interpreted according to the "compression + method" section above; i.e., 0 for stored, 8 for deflated, etc. + + The OS/2 extended attribute structure (FEA2LIST) is compressed and + then stored in its entirety within this structure. There will only + ever be one block of data in the variable-length field. + + + -OS/2 Access Control List Extra Field: + ==================================== + + The following is the layout of the OS/2 ACL extra block. + (Last Revision 19960922) + + Local-header version: + + Value Size Description + ----- ---- ----------- + (ACL) 0x4c41 Short tag for this extra block type + TSize Short total data size for this block + BSize Long uncompressed ACL data size + CType Short compression type + EACRC Long CRC value for uncompressed ACL data + (var.) variable compressed ACL data + + Central-header version: + + Value Size Description + ----- ---- ----------- + (ACL) 0x4c41 Short tag for this extra block type + TSize Short total data size for this block + BSize Long size of uncompressed local ACL data + + The value of CType is interpreted according to the "compression + method" section above; i.e., 0 for stored, 8 for deflated, etc. + + The uncompressed ACL data consist of a text header of the form + "ACL1:%hX,%hd\n", where the first field is the OS/2 ACCINFO acc_attr + member and the second is acc_count, followed by acc_count strings + of the form "%s,%hx\n", where the first field is acl_ugname (user + group name) and the second acl_access. This block type will be + extended for other operating systems as needed. + + + -Windows NT Security Descriptor Extra Field: + ========================================== + + The following is the layout of the NT Security Descriptor (another + type of ACL) extra block. (Last Revision 19960922) + + Local-header version: + + Value Size Description + ----- ---- ----------- + (SD) 0x4453 Short tag for this extra block type + TSize Short total data size for this block + BSize Long uncompressed SD data size + Version Byte version of uncompressed SD data format + CType Short compression type + EACRC Long CRC value for uncompressed SD data + (var.) variable compressed SD data + + Central-header version: + + Value Size Description + ----- ---- ----------- + (SD) 0x4453 Short tag for this extra block type + TSize Short total data size for this block + BSize Long size of uncompressed local SD data + + The value of CType is interpreted according to the "compression + method" section above; i.e., 0 for stored, 8 for deflated, etc. + Version specifies how the compressed data are to be interpreted + and allows for future expansion of this extra field type. Currently + only version 0 is defined. + + For version 0, the compressed data are to be interpreted as a single + valid Windows NT SECURITY_DESCRIPTOR data structure, in self-relative + format. + + + -PKWARE Win95/WinNT Extra Field: + ============================== + + The following description covers PKWARE's undocumented + Windows 95 & Windows NT extra field, introduced with the + release of PKZIP for Windows 2.50. (Last Revision 19980425) + + This field has a fixed data size of 32 bytes and is only stored + as local extra field. + + Value Size Description + ----- ---- ----------- + (WinNT) 0x000a Short Tag for this "extra" block type + TSize Short Total Data Size for this block + Unknwn1 Long ???? (all 0 ?) + Unknwn2 Long ???? + ModTime Long-Long 64-bit NTFS last-modified filetime + AccTime Long-Long 64-bit NTFS last-access filetime + CreTime Long-Long 64-bit NTFS creation filetime + + The NTFS filetimes are 64-bit unsigned integers, stored in Intel + (least significant byte first) byte order. They determine the + number of 1.0E-07 seconds (1/10th microseconds!) past WinNT "epoch", + which is "01-Jan-1601 00:00:00 UTC". + + + -PKWARE VAX/VMS Extra Field: + ========================== + + The following is the layout of PKWARE's VAX/VMS attributes "extra" + block. (Last Revision 12/17/91) + + Note: all fields stored in Intel low-byte/high-byte order. + + Value Size Description + ----- ---- ----------- + (VMS) 0x000c Short Tag for this "extra" block type + TSize Short Total Data Size for this block + CRC Long 32-bit CRC for remainder of the block + Tag1 Short VMS attribute tag value #1 + Size1 Short Size of attribute #1, in bytes + (var.) Size1 Attribute #1 data + . + . + . + TagN Short VMS attribute tage value #N + SizeN Short Size of attribute #N, in bytes + (var.) SizeN Attribute #N data + + Rules: + + 1. There will be one or more of attributes present, which will + each be preceded by the above TagX & SizeX values. These + values are identical to the ATR$C_XXXX and ATR$S_XXXX constants + which are defined in ATR.H under VMS C. Neither of these values + will ever be zero. + + 2. No word alignment or padding is performed. + + 3. A well-behaved PKZIP/VMS program should never produce more than + one sub-block with the same TagX value. Also, there will never + be more than one "extra" block of type 0x000c in a particular + directory record. + + + -Info-ZIP VMS Extra Field: + ======================== + + The following is the layout of Info-ZIP's VMS attributes extra + block for VAX or Alpha AXP. The local-header and central-header + versions are identical. (Last Revision 19960922) + + Value Size Description + ----- ---- ----------- + (VMS2) 0x4d49 Short tag for this extra block type + TSize Short total data size for this block + ID Long block ID + Flags Short info bytes + BSize Short uncompressed block size + Reserved Long (reserved) + (var.) variable compressed VMS file-attributes block + + The block ID is one of the following unterminated strings: + + "VFAB" struct FAB + "VALL" struct XABALL + "VFHC" struct XABFHC + "VDAT" struct XABDAT + "VRDT" struct XABRDT + "VPRO" struct XABPRO + "VKEY" struct XABKEY + "VMSV" version (e.g., "V6.1"; truncated at hyphen) + "VNAM" reserved + + The lower three bits of Flags indicate the compression method. The + currently defined methods are: + + 0 stored (not compressed) + 1 simple "RLE" + 2 deflated + + The "RLE" method simply replaces zero-valued bytes with zero-valued + bits and non-zero-valued bytes with a "1" bit followed by the byte + value. + + The variable-length compressed data contains only the data corre- + sponding to the indicated structure or string. Typically multiple + VMS2 extra fields are present (each with a unique block type). + + + -Info-ZIP Macintosh Extra Field: + ============================== + + The following is the layout of the (old) Info-ZIP resource-fork extra + block for Macintosh. The local-header and central-header versions + are identical. (Last Revision 19960922) + + Value Size Description + ----- ---- ----------- + (Mac) 0x07c8 Short tag for this extra block type + TSize Short total data size for this block + "JLEE" beLong extra-field signature + FInfo 16 bytes Macintosh FInfo structure + CrDat beLong HParamBlockRec fileParam.ioFlCrDat + MdDat beLong HParamBlockRec fileParam.ioFlMdDat + Flags beLong info bits + DirID beLong HParamBlockRec fileParam.ioDirID + VolName 28 bytes volume name (optional) + + All fields but the first two are in native Macintosh format + (big-endian Motorola order, not little-endian Intel). The least + significant bit of Flags is 1 if the file is a data fork, 0 other- + wise. In addition, if this extra field is present, the filename + has an extra 'd' or 'r' appended to indicate data fork or resource + fork. The 28-byte VolName field may be omitted. + + + -ZipIt Macintosh Extra Field (long): + ================================== + + The following is the layout of the ZipIt extra block for Macintosh. + The local-header and central-header versions are identical. + (Last Revision 19970130) + + Value Size Description + ----- ---- ----------- + (Mac2) 0x2605 Short tag for this extra block type + TSize Short total data size for this block + "ZPIT" beLong extra-field signature + FnLen Byte length of FileName + FileName variable full Macintosh filename + FileType Byte[4] four-byte Mac file type string + Creator Byte[4] four-byte Mac creator string + + + -ZipIt Macintosh Extra Field (short): + =================================== + + The following is the layout of a shortened variant of the + ZipIt extra block for Macintosh (without "full name" entry). + This variant is used by ZipIt 1.3.5 and newer for entries that + do not need a "full Mac filename" record. + The local-header and central-header versions are identical. + (Last Revision 19980903) + + Value Size Description + ----- ---- ----------- + (Mac2b) 0x2705 Short tag for this extra block type + TSize Short total data size for this block + "ZPIT" beLong extra-field signature + FileType Byte[4] four-byte Mac file type string + Creator Byte[4] four-byte Mac creator string + + + -Info-ZIP Macintosh Extra Field (new): + ==================================== + + The following is the layout of the (new) Info-ZIP extra + block for Macintosh, designed by Dirk Haase. + All values are in little-endian. + (Last Revision 19981005) + + Local-header version: + + Value Size Description + ----- ---- ----------- + (Mac3) 0x334d Short tag for this extra block type ("M3") + TSize Short total data size for this block + BSize Long uncompressed finder attribute data size + Flags Short info bits + fdType Byte[4] Type of the File (4-byte string) + fdCreator Byte[4] Creator of the File (4-byte string) + (CType) Short compression type + (CRC) Long CRC value for uncompressed MacOS data + Attribs variable finder attribute data (see below) + + + Central-header version: + + Value Size Description + ----- ---- ----------- + (Mac3) 0x334d Short tag for this extra block type ("M3") + TSize Short total data size for this block + BSize Long uncompressed finder attribute data size + Flags Short info bits + fdType Byte[4] Type of the File (4-byte string) + fdCreator Byte[4] Creator of the File (4-byte string) + + The third bit of Flags in both headers indicates whether + the LOCAL extra field is uncompressed (and therefore whether CType + and CRC are omitted): + + Bits of the Flags: + bit 0 if set, file is a data fork; otherwise unset + bit 1 if set, filename will be not changed + bit 2 if set, Attribs is uncompressed (no CType, CRC) + bit 3 if set, date and times are in 64 bit + if zero date and times are in 32 bit. + bit 4 if set, timezone offsets fields for the native + Mac times are omitted (UTC support deactivated) + bits 5-15 reserved; + + + Attributes: + + Attribs is a Mac-specific block of data in little-endian format with + the following structure (if compressed, uncompress it first): + + Value Size Description + ----- ---- ----------- + fdFlags Short Finder Flags + fdLocation.v Short Finder Icon Location + fdLocation.h Short Finder Icon Location + fdFldr Short Folder containing file + + FXInfo 16 bytes Macintosh FXInfo structure + FXInfo-Structure: + fdIconID Short + fdUnused[3] Short unused but reserved 6 bytes + fdScript Byte Script flag and number + fdXFlags Byte More flag bits + fdComment Short Comment ID + fdPutAway Long Home Dir ID + + FVersNum Byte file version number + may be not used by MacOS + ACUser Byte directory access rights + + FlCrDat ULong date and time of creation + FlMdDat ULong date and time of last modification + FlBkDat ULong date and time of last backup + These time numbers are original Mac FileTime values (local time!). + Currently, date-time width is 32-bit, but future version may + support be 64-bit times (see flags) + + CrGMTOffs Long(signed!) difference "local Creat. time - UTC" + MdGMTOffs Long(signed!) difference "local Modif. time - UTC" + BkGMTOffs Long(signed!) difference "local Backup time - UTC" + These "local time - UTC" differences (stored in seconds) may be + used to support timestamp adjustment after inter-timezone transfer. + These fields are optional; bit 4 of the flags word controls their + presence. + + Charset Short TextEncodingBase (Charset) + valid for the following two fields + + FullPath variable Path of the current file. + Zero terminated string (C-String) + Currently coded in the native Charset. + + Comment variable Finder Comment of the current file. + Zero terminated string (C-String) + Currently coded in the native Charset. + + + -Acorn SparkFS Extra Field: + ========================= + + The following is the layout of David Pilling's SparkFS extra block + for Acorn RISC OS. The local-header and central-header versions are + identical. (Last Revision 19960922) + + Value Size Description + ----- ---- ----------- + (Acorn) 0x4341 Short tag for this extra block type + TSize Short total data size for this block + "ARC0" Long extra-field signature + LoadAddr Long load address or file type + ExecAddr Long exec address + Attr Long file permissions + Zero Long reserved; always zero + + The following bits of Attr are associated with the given file + permissions: + + bit 0 user-writable ('W') + bit 1 user-readable ('R') + bit 2 reserved + bit 3 locked ('L') + bit 4 publicly writable ('w') + bit 5 publicly readable ('r') + bit 6 reserved + bit 7 reserved + + + -VM/CMS Extra Field: + ================== + + The following is the layout of the file-attributes extra block for + VM/CMS. The local-header and central-header versions are + identical. (Last Revision 19960922) + + Value Size Description + ----- ---- ----------- + (VM/CMS) 0x4704 Short tag for this extra block type + TSize Short total data size for this block + flData variable file attributes data + + flData is an uncompressed fldata_t struct. + + + -MVS Extra Field: + =============== + + The following is the layout of the file-attributes extra block for + MVS. The local-header and central-header versions are identical. + (Last Revision 19960922) + + Value Size Description + ----- ---- ----------- + (MVS) 0x470f Short tag for this extra block type + TSize Short total data size for this block + flData variable file attributes data + + flData is an uncompressed fldata_t struct. + + + -PKWARE Unix Extra Field: + ======================== + + The following is the layout of PKWARE's Unix "extra" block. + It was introduced with the release of PKZIP for Unix 2.50. + Note: all fields are stored in Intel low-byte/high-byte order. + (Last Revision 19980901) + + This field has a minimum data size of 12 bytes and is only stored + as local extra field. + + Value Size Description + ----- ---- ----------- + (Unix0) 0x000d Short Tag for this "extra" block type + TSize Short Total Data Size for this block + AcTime Long time of last access (UTC/GMT) + ModTime Long time of last modification (UTC/GMT) + UID Short Unix user ID + GID Short Unix group ID + (var) variable Variable length data field + + The variable length data field will contain file type + specific data. Currently the only values allowed are + the original "linked to" file names for hard or symbolic links. + + The fixed part of this field has the same layout as Info-ZIP's + abandoned "Unix1 timestamps & owner ID info" extra field; + only the two tag bytes are different. + + + -PATCH Descriptor Extra Field: + ============================ + + The following is the layout of the Patch Descriptor "extra" + block. + + Note: all fields stored in Intel low-byte/high-byte order. + + Value Size Description + ----- ---- ----------- + (Patch) 0x000f Short Tag for this "extra" block type + TSize Short Size of the total "extra" block + Version Short Version of the descriptor + Flags Long Actions and reactions (see below) + OldSize Long Size of the file about to be patched + OldCRC Long 32-bit CRC of the file about to be patched + NewSize Long Size of the resulting file + NewCRC Long 32-bit CRC of the resulting file + + + Actions and reactions + + Bits Description + ---- ---------------- + 0 Use for autodetection + 1 Treat as selfpatch + 2-3 RESERVED + 4-5 Action (see below) + 6-7 RESERVED + 8-9 Reaction (see below) to absent file + 10-11 Reaction (see below) to newer file + 12-13 Reaction (see below) to unknown file + 14-15 RESERVED + 16-31 RESERVED + + Actions + + Action Value + ------ ----- + none 0 + add 1 + delete 2 + patch 3 + + Reactions + + Reaction Value + -------- ----- + ask 0 + skip 1 + ignore 2 + fail 3 + + + -Extended Timestamp Extra Field: + ============================== + + The following is the layout of the extended-timestamp extra block. + (Last Revision 19970118) + + Local-header version: + + Value Size Description + ----- ---- ----------- + (time) 0x5455 Short tag for this extra block type + TSize Short total data size for this block + Flags Byte info bits + (ModTime) Long time of last modification (UTC/GMT) + (AcTime) Long time of last access (UTC/GMT) + (CrTime) Long time of original creation (UTC/GMT) + + Central-header version: + + Value Size Description + ----- ---- ----------- + (time) 0x5455 Short tag for this extra block type + TSize Short total data size for this block + Flags Byte info bits (refers to local header!) + (ModTime) Long time of last modification (UTC/GMT) + + The central-header extra field contains the modification time only, + or no timestamp at all. TSize is used to flag its presence or + absence. But note: + + If "Flags" indicates that Modtime is present in the local header + field, it MUST be present in the central header field, too! + This correspondence is required because the modification time + value may be used to support trans-timezone freshening and + updating operations with zip archives. + + The time values are in standard Unix signed-long format, indicating + the number of seconds since 1 January 1970 00:00:00. The times + are relative to Coordinated Universal Time (UTC), also sometimes + referred to as Greenwich Mean Time (GMT). To convert to local time, + the software must know the local timezone offset from UTC/GMT. + + The lower three bits of Flags in both headers indicate which time- + stamps are present in the LOCAL extra field: + + bit 0 if set, modification time is present + bit 1 if set, access time is present + bit 2 if set, creation time is present + bits 3-7 reserved for additional timestamps; not set + + Those times that are present will appear in the order indicated, but + any combination of times may be omitted. (Creation time may be + present without access time, for example.) TSize should equal + (1 + 4*(number of set bits in Flags)), as the block is currently + defined. Other timestamps may be added in the future. + + + -Info-ZIP Unix Extra Field (type 1): + ================================== + + The following is the layout of the old Info-ZIP extra block for + Unix. It has been replaced by the extended-timestamp extra block + (0x5455) and the Unix type 2 extra block (0x7855). + (Last Revision 19970118) + + Local-header version: + + Value Size Description + ----- ---- ----------- + (Unix1) 0x5855 Short tag for this extra block type + TSize Short total data size for this block + AcTime Long time of last access (UTC/GMT) + ModTime Long time of last modification (UTC/GMT) + UID Short Unix user ID + GID Short Unix group ID + + Central-header version: + + Value Size Description + ----- ---- ----------- + (Unix1) 0x5855 Short tag for this extra block type + TSize Short total data size for this block + AcTime Long time of last access (GMT/UTC) + ModTime Long time of last modification (GMT/UTC) + + The file access and modification times are in standard Unix signed- + long format, indicating the number of seconds since 1 January 1970 + 00:00:00. The times are relative to Coordinated Universal Time + (UTC), also sometimes referred to as Greenwich Mean Time (GMT). To + convert to local time, the software must know the local timezone + offset from UTC/GMT. The modification time may be used by non-Unix + systems to support inter-timezone freshening and updating of zip + archives. + + The local-header extra block may optionally contain UID and GID + info for the file. The local-header TSize value is the only + indication of this. Note that Unix UIDs and GIDs are usually + specific to a particular machine, and they generally require root + access to restore. + + This extra field type is obsolete, but it has been in use since + mid-1994. Therefore future archiving software should continue to + support it. Some guidelines: + + An archive member should either contain the old "Unix1" + extra field block or the new extra field types "time" and/or + "Unix2". + + If both the old "Unix1" block type and one or both of the new + block types "time" and "Unix2" are found, the "Unix1" block + should be considered invalid and ignored. + + Unarchiving software should recognize both old and new extra + field block types, but the info from new types overrides the + old "Unix1" field. + + Archiving software should recognize "Unix1" extra fields for + timestamp comparison but never create it for updated, freshened + or new archive members. When copying existing members to a new + archive, any "Unix1" extra field blocks should be converted to + the new "time" and/or "Unix2" types. + + + -Info-ZIP Unix Extra Field (type 2): + ================================== + + The following is the layout of the new Info-ZIP extra block for + Unix. (Last Revision 19960922) + + Local-header version: + + Value Size Description + ----- ---- ----------- + (Unix2) 0x7855 Short tag for this extra block type + TSize Short total data size for this block + UID Short Unix user ID + GID Short Unix group ID + + Central-header version: + + Value Size Description + ----- ---- ----------- + (Unix2) 0x7855 Short tag for this extra block type + TSize Short total data size for this block + + The data size of the central-header version is zero; it is used + solely as a flag that UID/GID info is present in the local-header + extra field. If additional fields are ever added to the local + version, the central version may be extended to indicate this. + + Note that Unix UIDs and GIDs are usually specific to a particular + machine, and they generally require root access to restore. + + + -ASi Unix Extra Field: + ==================== + + The following is the layout of the ASi extra block for Unix. The + local-header and central-header versions are identical. + (Last Revision 19960916) + + Value Size Description + ----- ---- ----------- + (Unix3) 0x756e Short tag for this extra block type + TSize Short total data size for this block + CRC Long CRC-32 of the remaining data + Mode Short file permissions + SizDev Long symlink'd size OR major/minor dev num + UID Short user ID + GID Short group ID + (var.) variable symbolic link filename + + Mode is the standard Unix st_mode field from struct stat, containing + user/group/other permissions, setuid/setgid and symlink info, etc. + + If Mode indicates that this file is a symbolic link, SizDev is the + size of the file to which the link points. Otherwise, if the file + is a device, SizDev contains the standard Unix st_rdev field from + struct stat (includes the major and minor numbers of the device). + SizDev is undefined in other cases. + + If Mode indicates that the file is a symbolic link, the final field + will be the name of the file to which the link points. The file- + name length can be inferred from TSize. + + [Note that TSize may incorrectly refer to the data size not counting + the CRC; i.e., it may be four bytes too small.] + + + -BeOS Extra Field: + ================ + + The following is the layout of the file-attributes extra block for + BeOS. (Last Revision 19970531) + + Local-header version: + + Value Size Description + ----- ---- ----------- + (BeOS) 0x6542 Short tag for this extra block type + TSize Short total data size for this block + BSize Long uncompressed file attribute data size + Flags Byte info bits + (CType) Short compression type + (CRC) Long CRC value for uncompressed file attribs + Attribs variable file attribute data + + Central-header version: + + Value Size Description + ----- ---- ----------- + (BeOS) 0x6542 Short tag for this extra block type + TSize Short total data size for this block + BSize Long size of uncompressed local EF block data + Flags Byte info bits + + The least significant bit of Flags in both headers indicates whether + the LOCAL extra field is uncompressed (and therefore whether CType + and CRC are omitted): + + bit 0 if set, Attribs is uncompressed (no CType, CRC) + bits 1-7 reserved; if set, assume error or unknown data + + Currently the only supported compression types are deflated (type 8) + and stored (type 0); the latter is not used by Info-ZIP's Zip but is + supported by UnZip. + + Attribs is a BeOS-specific block of data in big-endian format with + the following structure (if compressed, uncompress it first): + + Value Size Description + ----- ---- ----------- + Name variable attribute name (null-terminated string) + Type Long attribute type (32-bit unsigned integer) + Size Long Long data size for this sub-block (64 bits) + Data variable attribute data + + The attribute structure is repeated for every attribute. The Data + field may contain anything--text, flags, bitmaps, etc. + + + -SMS/QDOS Extra Field: + ==================== + + The following is the layout of the file-attributes extra block for + SMS/QDOS. The local-header and central-header versions are identical. + (Last Revision 19960929) + + Value Size Description + ----- ---- ----------- + (QDOS) 0xfb4a Short tag for this extra block type + TSize Short total data size for this block + LongID Long extra-field signature + (ExtraID) Long additional signature/flag bytes + QDirect 64 bytes qdirect structure + + LongID may be "QZHD" or "QDOS". In the latter case, ExtraID will + be present. Its first three bytes are "02\0"; the last byte is + currently undefined. + + QDirect contains the file's uncompressed directory info (qdirect + struct). Its elements are in native (big-endian) format: + + d_length beLong file length + d_access byte file access type + d_type byte file type + d_datalen beLong data length + d_reserved beLong unused + d_szname beShort size of filename + d_name 36 bytes filename + d_update beLong time of last update + d_refdate beLong file version number + d_backup beLong time of last backup (archive date) + + + -AOS/VS Extra Field: + ================== + + The following is the layout of the extra block for Data General + AOS/VS. The local-header and central-header versions are identical. + (Last Revision 19961125) + + Value Size Description + ----- ---- ----------- + (AOSVS) 0x5356 Short tag for this extra block type + TSize Short total data size for this block + "FCI\0" Long extra-field signature + Version Byte version of AOS/VS extra block (10 = 1.0) + Fstat variable fstat packet + AclBuf variable raw ACL data ($MXACL bytes) + + Fstat contains the file's uncompressed fstat packet, which is one of + the following: + + normal fstat packet (P_FSTAT struct) + DIR/CPD fstat packet (P_FSTAT_DIR struct) + unit (device) fstat packet (P_FSTAT_UNIT struct) + IPC file fstat packet (P_FSTAT_IPC struct) + + AclBuf contains the raw ACL data; its length is $MXACL. + + + -FWKCS MD5 Extra Field: + ===================== + + The following is the layout of the optional extra block used by the + FWKCS utility. There is no local-header version; the following + applies only to the central header. (Last Revision 19961207) + + Central-header version: + + Value Size Description + ----- ---- ----------- + (MD5) 0x4b46 Short tag for this extra block type + TSize Short total data size for this block (19) + "MD5" 3 bytes extra-field signature + MD5hash 16 bytes 128-bit MD5 hash of uncompressed data + + The MD5 hash in this extra block is used to automatically identify + files independent of their filenames; it is an an enhanced contents- + signature. + + FWKCS provides an option to strip this extra field, if + present, from a zipfile central directory. In adding + this extra field, FWKCS preserves Zipfile Authenticity + Verification; if stripping this extra field, FWKCS + preserves all versions of AV through PKZIP version 2.04g. + + ``The MD5 algorithm is being placed in the public domain for review + and possible adoption as a standard.'' (Ron Rivest, MIT Laboratory + for Computer Science and RSA Data Security, Inc., April 1992, RFC + 1321, 11.76-77). FWKCS, and FWKCS Contents_Signature System, are + trademarks of Frederick W. Kantor. + + + + file comment: (Variable) + + The comment for this file. + + number of this disk: (2 bytes) + + The number of this disk, which contains central + directory end record. + + number of the disk with the start of the central directory: (2 bytes) + + The number of the disk on which the central + directory starts. + + total number of entries in the central dir on this disk: (2 bytes) + + The number of central directory entries on this disk. + + total number of entries in the central dir: (2 bytes) + + The total number of files in the zipfile. + + + size of the central directory: (4 bytes) + + The size (in bytes) of the entire central directory. + + offset of start of central directory with respect to + the starting disk number: (4 bytes) + + Offset of the start of the central directory on the + disk on which the central directory starts. + + zipfile comment length: (2 bytes) + + The length of the comment for this zipfile. + + zipfile comment: (Variable) + + The comment for this zipfile. + + + D. General notes: + + 1) All fields unless otherwise noted are unsigned and stored + in Intel low-byte:high-byte, low-word:high-word order. + + 2) String fields are not null terminated, since the + length is given explicitly. + + 3) Local headers should not span disk boundaries. Also, even + though the central directory can span disk boundaries, no + single record in the central directory should be split + across disks. + + 4) The entries in the central directory may not necessarily + be in the same order that files appear in the zipfile. + +UnShrinking - Method 1 +---------------------- + +Shrinking is a Dynamic Ziv-Lempel-Welch compression algorithm +with partial clearing. The initial code size is 9 bits, and +the maximum code size is 13 bits. Shrinking differs from +conventional Dynamic Ziv-Lempel-Welch implementations in several +respects: + +1) The code size is controlled by the compressor, and is not + automatically increased when codes larger than the current + code size are created (but not necessarily used). When + the decompressor encounters the code sequence 256 + (decimal) followed by 1, it should increase the code size + read from the input stream to the next bit size. No + blocking of the codes is performed, so the next code at + the increased size should be read from the input stream + immediately after where the previous code at the smaller + bit size was read. Again, the decompressor should not + increase the code size used until the sequence 256,1 is + encountered. + +2) When the table becomes full, total clearing is not + performed. Rather, when the compressor emits the code + sequence 256,2 (decimal), the decompressor should clear + all leaf nodes from the Ziv-Lempel tree, and continue to + use the current code size. The nodes that are cleared + from the Ziv-Lempel tree are then re-used, with the lowest + code value re-used first, and the highest code value + re-used last. The compressor can emit the sequence 256,2 + at any time. + + + +Expanding - Methods 2-5 +----------------------- + +The Reducing algorithm is actually a combination of two +distinct algorithms. The first algorithm compresses repeated +byte sequences, and the second algorithm takes the compressed +stream from the first algorithm and applies a probabilistic +compression method. + +The probabilistic compression stores an array of 'follower +sets' S(j), for j=0 to 255, corresponding to each possible +ASCII character. Each set contains between 0 and 32 +characters, to be denoted as S(j)[0],...,S(j)[m], where m<32. +The sets are stored at the beginning of the data area for a +Reduced file, in reverse order, with S(255) first, and S(0) +last. + +The sets are encoded as { N(j), S(j)[0],...,S(j)[N(j)-1] }, +where N(j) is the size of set S(j). N(j) can be 0, in which +case the follower set for S(j) is empty. Each N(j) value is +encoded in 6 bits, followed by N(j) eight bit character values +corresponding to S(j)[0] to S(j)[N(j)-1] respectively. If +N(j) is 0, then no values for S(j) are stored, and the value +for N(j-1) immediately follows. + +Immediately after the follower sets, is the compressed data +stream. The compressed data stream can be interpreted for the +probabilistic decompression as follows: + + +let Last-Character <- 0. +loop until done + if the follower set S(Last-Character) is empty then + read 8 bits from the input stream, and copy this + value to the output stream. + otherwise if the follower set S(Last-Character) is non-empty then + read 1 bit from the input stream. + if this bit is not zero then + read 8 bits from the input stream, and copy this + value to the output stream. + otherwise if this bit is zero then + read B(N(Last-Character)) bits from the input + stream, and assign this value to I. + Copy the value of S(Last-Character)[I] to the + output stream. + + assign the last value placed on the output stream to + Last-Character. +end loop + + +B(N(j)) is defined as the minimal number of bits required to +encode the value N(j)-1. + + +The decompressed stream from above can then be expanded to +re-create the original file as follows: + + +let State <- 0. + +loop until done + read 8 bits from the input stream into C. + case State of + 0: if C is not equal to DLE (144 decimal) then + copy C to the output stream. + otherwise if C is equal to DLE then + let State <- 1. + + 1: if C is non-zero then + let V <- C. + let Len <- L(V) + let State <- F(Len). + otherwise if C is zero then + copy the value 144 (decimal) to the output stream. + let State <- 0 + + 2: let Len <- Len + C + let State <- 3. + + 3: move backwards D(V,C) bytes in the output stream + (if this position is before the start of the output + stream, then assume that all the data before the + start of the output stream is filled with zeros). + copy Len+3 bytes from this position to the output stream. + let State <- 0. + end case +end loop + + +The functions F,L, and D are dependent on the 'compression +factor', 1 through 4, and are defined as follows: + +For compression factor 1: + L(X) equals the lower 7 bits of X. + F(X) equals 2 if X equals 127 otherwise F(X) equals 3. + D(X,Y) equals the (upper 1 bit of X) * 256 + Y + 1. +For compression factor 2: + L(X) equals the lower 6 bits of X. + F(X) equals 2 if X equals 63 otherwise F(X) equals 3. + D(X,Y) equals the (upper 2 bits of X) * 256 + Y + 1. +For compression factor 3: + L(X) equals the lower 5 bits of X. + F(X) equals 2 if X equals 31 otherwise F(X) equals 3. + D(X,Y) equals the (upper 3 bits of X) * 256 + Y + 1. +For compression factor 4: + L(X) equals the lower 4 bits of X. + F(X) equals 2 if X equals 15 otherwise F(X) equals 3. + D(X,Y) equals the (upper 4 bits of X) * 256 + Y + 1. + + +Imploding - Method 6 +-------------------- + +The Imploding algorithm is actually a combination of two distinct +algorithms. The first algorithm compresses repeated byte +sequences using a sliding dictionary. The second algorithm is +used to compress the encoding of the sliding dictionary output, +using multiple Shannon-Fano trees. + +The Imploding algorithm can use a 4K or 8K sliding dictionary +size. The dictionary size used can be determined by bit 1 in the +general purpose flag word; a 0 bit indicates a 4K dictionary +while a 1 bit indicates an 8K dictionary. + +The Shannon-Fano trees are stored at the start of the compressed +file. The number of trees stored is defined by bit 2 in the +general purpose flag word; a 0 bit indicates two trees stored, a +1 bit indicates three trees are stored. If 3 trees are stored, +the first Shannon-Fano tree represents the encoding of the +Literal characters, the second tree represents the encoding of +the Length information, the third represents the encoding of the +Distance information. When 2 Shannon-Fano trees are stored, the +Length tree is stored first, followed by the Distance tree. + +The Literal Shannon-Fano tree, if present is used to represent +the entire ASCII character set, and contains 256 values. This +tree is used to compress any data not compressed by the sliding +dictionary algorithm. When this tree is present, the Minimum +Match Length for the sliding dictionary is 3. If this tree is +not present, the Minimum Match Length is 2. + +The Length Shannon-Fano tree is used to compress the Length part +of the (length,distance) pairs from the sliding dictionary +output. The Length tree contains 64 values, ranging from the +Minimum Match Length, to 63 plus the Minimum Match Length. + +The Distance Shannon-Fano tree is used to compress the Distance +part of the (length,distance) pairs from the sliding dictionary +output. The Distance tree contains 64 values, ranging from 0 to +63, representing the upper 6 bits of the distance value. The +distance values themselves will be between 0 and the sliding +dictionary size, either 4K or 8K. + +The Shannon-Fano trees themselves are stored in a compressed +format. The first byte of the tree data represents the number of +bytes of data representing the (compressed) Shannon-Fano tree +minus 1. The remaining bytes represent the Shannon-Fano tree +data encoded as: + + High 4 bits: Number of values at this bit length + 1. (1 - 16) + Low 4 bits: Bit Length needed to represent value + 1. (1 - 16) + +The Shannon-Fano codes can be constructed from the bit lengths +using the following algorithm: + +1) Sort the Bit Lengths in ascending order, while retaining the + order of the original lengths stored in the file. + +2) Generate the Shannon-Fano trees: + + Code <- 0 + CodeIncrement <- 0 + LastBitLength <- 0 + i <- number of Shannon-Fano codes - 1 (either 255 or 63) + + loop while i >= 0 + Code = Code + CodeIncrement + if BitLength(i) <> LastBitLength then + LastBitLength=BitLength(i) + CodeIncrement = 1 shifted left (16 - LastBitLength) + ShannonCode(i) = Code + i <- i - 1 + end loop + + +3) Reverse the order of all the bits in the above ShannonCode() + vector, so that the most significant bit becomes the least + significant bit. For example, the value 0x1234 (hex) would + become 0x2C48 (hex). + +4) Restore the order of Shannon-Fano codes as originally stored + within the file. + +Example: + + This example will show the encoding of a Shannon-Fano tree + of size 8. Notice that the actual Shannon-Fano trees used + for Imploding are either 64 or 256 entries in size. + +Example: 0x02, 0x42, 0x01, 0x13 + + The first byte indicates 3 values in this table. Decoding the + bytes: + 0x42 = 5 codes of 3 bits long + 0x01 = 1 code of 2 bits long + 0x13 = 2 codes of 4 bits long + + This would generate the original bit length array of: + (3, 3, 3, 3, 3, 2, 4, 4) + + There are 8 codes in this table for the values 0 thru 7. Using the + algorithm to obtain the Shannon-Fano codes produces: + + Reversed Order Original +Val Sorted Constructed Code Value Restored Length +--- ------ ----------------- -------- -------- ------ +0: 2 1100000000000000 11 101 3 +1: 3 1010000000000000 101 001 3 +2: 3 1000000000000000 001 110 3 +3: 3 0110000000000000 110 010 3 +4: 3 0100000000000000 010 100 3 +5: 3 0010000000000000 100 11 2 +6: 4 0001000000000000 1000 1000 4 +7: 4 0000000000000000 0000 0000 4 + + +The values in the Val, Order Restored and Original Length columns +now represent the Shannon-Fano encoding tree that can be used for +decoding the Shannon-Fano encoded data. How to parse the +variable length Shannon-Fano values from the data stream is beyond the +scope of this document. (See the references listed at the end of +this document for more information.) However, traditional decoding +schemes used for Huffman variable length decoding, such as the +Greenlaw algorithm, can be successfully applied. + +The compressed data stream begins immediately after the +compressed Shannon-Fano data. The compressed data stream can be +interpreted as follows: + +loop until done + read 1 bit from input stream. + + if this bit is non-zero then (encoded data is literal data) + if Literal Shannon-Fano tree is present + read and decode character using Literal Shannon-Fano tree. + otherwise + read 8 bits from input stream. + copy character to the output stream. + otherwise (encoded data is sliding dictionary match) + if 8K dictionary size + read 7 bits for offset Distance (lower 7 bits of offset). + otherwise + read 6 bits for offset Distance (lower 6 bits of offset). + + using the Distance Shannon-Fano tree, read and decode the + upper 6 bits of the Distance value. + + using the Length Shannon-Fano tree, read and decode + the Length value. + + Length <- Length + Minimum Match Length + + if Length = 63 + Minimum Match Length + read 8 bits from the input stream, + add this value to Length. + + move backwards Distance+1 bytes in the output stream, and + copy Length characters from this position to the output + stream. (if this position is before the start of the output + stream, then assume that all the data before the start of + the output stream is filled with zeros). +end loop + +Tokenizing - Method 7 +-------------------- + +This method is not used by PKZIP. + +Deflating - Method 8 +----------------- + +The Deflate algorithm is similar to the Implode algorithm using +a sliding dictionary of up to 32K with secondary compression +from Huffman/Shannon-Fano codes. + +The compressed data is stored in blocks with a header describing +the block and the Huffman codes used in the data block. The header +format is as follows: + + Bit 0: Last Block bit This bit is set to 1 if this is the last + compressed block in the data. + Bits 1-2: Block type + 00 (0) - Block is stored - All stored data is byte aligned. + Skip bits until next byte, then next word = block length, + followed by the ones compliment of the block length word. + Remaining data in block is the stored data. + + 01 (1) - Use fixed Huffman codes for literal and distance codes. + Lit Code Bits Dist Code Bits + --------- ---- --------- ---- + 0 - 143 8 0 - 31 5 + 144 - 255 9 + 256 - 279 7 + 280 - 287 8 + + Literal codes 286-287 and distance codes 30-31 are never + used but participate in the huffman construction. + + 10 (2) - Dynamic Huffman codes. (See expanding Huffman codes) + + 11 (3) - Reserved - Flag a "Error in compressed data" if seen. + +Expanding Huffman Codes +----------------------- +If the data block is stored with dynamic Huffman codes, the Huffman +codes are sent in the following compressed format: + + 5 Bits: # of Literal codes sent - 257 (257 - 286) + All other codes are never sent. + 5 Bits: # of Dist codes - 1 (1 - 32) + 4 Bits: # of Bit Length codes - 4 (4 - 19) + +The Huffman codes are sent as bit lengths and the codes are built as +described in the implode algorithm. The bit lengths themselves are +compressed with Huffman codes. There are 19 bit length codes: + + 0 - 15: Represent bit lengths of 0 - 15 + 16: Copy the previous bit length 3 - 6 times. + The next 2 bits indicate repeat length (0 = 3, ... ,3 = 6) + Example: Codes 8, 16 (+2 bits 11), 16 (+2 bits 10) will + expand to 12 bit lengths of 8 (1 + 6 + 5) + 17: Repeat a bit length of 0 for 3 - 10 times. (3 bits of length) + 18: Repeat a bit length of 0 for 11 - 138 times (7 bits of length) + +The lengths of the bit length codes are sent packed 3 bits per value +(0 - 7) in the following order: + + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 + +The Huffman codes should be built as described in the Implode algorithm +except codes are assigned starting at the shortest bit length, i.e. the +shortest code should be all 0's rather than all 1's. Also, codes with +a bit length of zero do not participate in the tree construction. The +codes are then used to decode the bit lengths for the literal and distance +tables. + +The bit lengths for the literal tables are sent first with the number +of entries sent described by the 5 bits sent earlier. There are up +to 286 literal characters; the first 256 represent the respective 8 +bit character, code 256 represents the End-Of-Block code, the remaining +29 codes represent copy lengths of 3 thru 258. There are up to 30 +distance codes representing distances from 1 thru 32k as described +below. + + Length Codes + ------------ + Extra Extra Extra Extra + Code Bits Length Code Bits Lengths Code Bits Lengths Code Bits Length(s) + ---- ---- ------ ---- ---- ------- ---- ---- ------- ---- ---- --------- + 257 0 3 265 1 11,12 273 3 35-42 281 5 131-162 + 258 0 4 266 1 13,14 274 3 43-50 282 5 163-194 + 259 0 5 267 1 15,16 275 3 51-58 283 5 195-226 + 260 0 6 268 1 17,18 276 3 59-66 284 5 227-257 + 261 0 7 269 2 19-22 277 4 67-82 285 0 258 + 262 0 8 270 2 23-26 278 4 83-98 + 263 0 9 271 2 27-30 279 4 99-114 + 264 0 10 272 2 31-34 280 4 115-130 + + Distance Codes + -------------- + Extra Extra Extra Extra + Code Bits Dist Code Bits Dist Code Bits Distance Code Bits Distance + ---- ---- ---- ---- ---- ------ ---- ---- -------- ---- ---- -------- + 0 0 1 8 3 17-24 16 7 257-384 24 11 4097-6144 + 1 0 2 9 3 25-32 17 7 385-512 25 11 6145-8192 + 2 0 3 10 4 33-48 18 8 513-768 26 12 8193-12288 + 3 0 4 11 4 49-64 19 8 769-1024 27 12 12289-16384 + 4 1 5,6 12 5 65-96 20 9 1025-1536 28 13 16385-24576 + 5 1 7,8 13 5 97-128 21 9 1537-2048 29 13 24577-32768 + 6 2 9-12 14 6 129-192 22 10 2049-3072 + 7 2 13-16 15 6 193-256 23 10 3073-4096 + +The compressed data stream begins immediately after the +compressed header data. The compressed data stream can be +interpreted as follows: + +do + read header from input stream. + + if stored block + skip bits until byte aligned + read count and 1's compliment of count + copy count bytes data block + otherwise + loop until end of block code sent + decode literal character from input stream + if literal < 256 + copy character to the output stream + otherwise + if literal = end of block + break from loop + otherwise + decode distance from input stream + + move backwards distance bytes in the output stream, and + copy length characters from this position to the output + stream. + end loop +while not last block + +if data descriptor exists + skip bits until byte aligned + check data descriptor signature + read crc and sizes +endif + +Decryption +---------- + +The encryption used in PKZIP was generously supplied by Roger +Schlafly. PKWARE is grateful to Mr. Schlafly for his expert +help and advice in the field of data encryption. + +PKZIP encrypts the compressed data stream. Encrypted files must +be decrypted before they can be extracted. + +Each encrypted file has an extra 12 bytes stored at the start of +the data area defining the encryption header for that file. The +encryption header is originally set to random values, and then +itself encrypted, using three, 32-bit keys. The key values are +initialized using the supplied encryption password. After each byte +is encrypted, the keys are then updated using pseudo-random number +generation techniques in combination with the same CRC-32 algorithm +used in PKZIP and described elsewhere in this document. + +The following is the basic steps required to decrypt a file: + +1) Initialize the three 32-bit keys with the password. +2) Read and decrypt the 12-byte encryption header, further + initializing the encryption keys. +3) Read and decrypt the compressed data stream using the + encryption keys. + + +Step 1 - Initializing the encryption keys +----------------------------------------- + +Key(0) <- 305419896 +Key(1) <- 591751049 +Key(2) <- 878082192 + +loop for i <- 0 to length(password)-1 + update_keys(password(i)) +end loop + + +Where update_keys() is defined as: + + +update_keys(char): + Key(0) <- crc32(key(0),char) + Key(1) <- Key(1) + (Key(0) & 000000ffH) + Key(1) <- Key(1) * 134775813 + 1 + Key(2) <- crc32(key(2),key(1) >> 24) +end update_keys + + +Where crc32(old_crc,char) is a routine that given a CRC value and a +character, returns an updated CRC value after applying the CRC-32 +algorithm described elsewhere in this document. + + +Step 2 - Decrypting the encryption header +----------------------------------------- + +The purpose of this step is to further initialize the encryption +keys, based on random data, to render a plaintext attack on the +data ineffective. + + +Read the 12-byte encryption header into Buffer, in locations +Buffer(0) thru Buffer(11). + +loop for i <- 0 to 11 + C <- buffer(i) ^ decrypt_byte() + update_keys(C) + buffer(i) <- C +end loop + + +Where decrypt_byte() is defined as: + + +unsigned char decrypt_byte() + local unsigned short temp + temp <- Key(2) | 2 + decrypt_byte <- (temp * (temp ^ 1)) >> 8 +end decrypt_byte + + +After the header is decrypted, the last 1 or 2 bytes in Buffer +should be the high-order word/byte of the CRC for the file being +decrypted, stored in Intel low-byte/high-byte order, or the high-order +byte of the file time if bit 3 of the general purpose bit flag is set. +Versions of PKZIP prior to 2.0 used a 2 byte CRC check; a 1 byte CRC check is +used on versions after 2.0. This can be used to test if the password +supplied is correct or not. + + +Step 3 - Decrypting the compressed data stream +---------------------------------------------- + +The compressed data stream can be decrypted as follows: + + +loop until done + read a character into C + Temp <- C ^ decrypt_byte() + update_keys(temp) + output Temp +end loop + + +In addition to the above mentioned contributors to PKZIP and PKUNZIP, +I would like to extend special thanks to Robert Mahoney for suggesting +the extension .ZIP for this software. + + +References: + + Fiala, Edward R., and Greene, Daniel H., "Data compression with + finite windows", Communications of the ACM, Volume 32, Number 4, + April 1989, pages 490-505. + + Held, Gilbert, "Data Compression, Techniques and Applications, + Hardware and Software Considerations", + John Wiley & Sons, 1987. + + Huffman, D.A., "A method for the construction of minimum-redundancy + codes", Proceedings of the IRE, Volume 40, Number 9, September 1952, + pages 1098-1101. + + Nelson, Mark, "LZW Data Compression", Dr. Dobbs Journal, Volume 14, + Number 10, October 1989, pages 29-37. + + Nelson, Mark, "The Data Compression Book", M&T Books, 1991. + + Storer, James A., "Data Compression, Methods and Theory", + Computer Science Press, 1988 + + Welch, Terry, "A Technique for High-Performance Data Compression", + IEEE Computer, Volume 17, Number 6, June 1984, pages 8-19. + + Ziv, J. and Lempel, A., "A universal algorithm for sequential data + compression", Communications of the ACM, Volume 30, Number 6, + June 1987, pages 520-540. + + Ziv, J. and Lempel, A., "Compression of individual sequences via + variable-rate coding", IEEE Transactions on Information Theory, + Volume 24, Number 5, September 1978, pages 530-536. Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/kernel/test/zlib_SUITE_data/zipdoc.1.gz and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/kernel/test/zlib_SUITE_data/zipdoc.1.gz differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/kernel/test/zlib_SUITE_data/zipdoc.txt.gz and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/kernel/test/zlib_SUITE_data/zipdoc.txt.gz differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/kernel/test/zlib_SUITE_data/zipdoc.zip and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/kernel/test/zlib_SUITE_data/zipdoc.zip differ diff -Nru erlang-13.b.1-dfsg/lib/kernel/test/zlib_SUITE.erl erlang-13.b.3-dfsg/lib/kernel/test/zlib_SUITE.erl --- erlang-13.b.1-dfsg/lib/kernel/test/zlib_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/test/zlib_SUITE.erl 2009-11-20 13:32:10.000000000 +0000 @@ -0,0 +1,1004 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(zlib_SUITE). + +-include("test_server.hrl"). + +-compile(export_all). + +-define(error(Format,Args), + put(test_server_loc,{?MODULE,?LINE}), + error(Format,Args,?MODULE,?LINE)). + +%% Learn erts team how to really write tests ;-) +-define(m(ExpectedRes,Expr), + fun() -> + ACtual1 = (catch (Expr)), + try case ACtual1 of + ExpectedRes -> ACtual1 + end + catch + error:{case_clause,ACtuAl} -> + ?error("Not Matching Actual result was:~n ~p ~n", + [ACtuAl]), + ACtuAl + end + end()). + +-define(BARG, {'EXIT',{badarg,[{zlib,_,_}|_]}}). +-define(DATA_ERROR, {'EXIT',{data_error,[{zlib,_,_}|_]}}). + +init_per_testcase(_Func, Config) -> + Dog = test_server:timetrap(test_server:seconds(60)), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Func, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog). + +error(Format, Args, File, Line) -> + io:format("~p:~p: ERROR: " ++ Format, [File,Line|Args]), + group_leader() ! {failed, File, Line}. + +%% Hopefully I don't need this to get it to work with the testserver.. +%% Fail = #'REASON'{file = filename:basename(File), +%% line = Line, +%% desc = Args}, +%% case global:whereis_name(mnesia_test_case_sup) of +%% undefined -> +%% ignore; +%% Pid -> +%% Pid ! Fail +%% %% global:send(mnesia_test_case_sup, Fail), +%% end, +%% log("<>ERROR<>~n" ++ Format, Args, File, Line). + +all(suite) -> + [api, examples, func, smp, otp_7359]. + +api(doc) -> "Basic the api tests"; +api(suite) -> + [api_open_close, + api_deflateInit, + api_deflateSetDictionary, + api_deflateReset, + api_deflateParams, + api_deflate, + api_deflateEnd, + api_inflateInit, + api_inflateSetDictionary, + api_inflateSync, + api_inflateReset, + api_inflate, + api_inflateEnd, + api_setBufsz, + api_getBufsz, + api_crc32, + api_adler32, + api_getQSize, + api_un_compress, + api_un_zip, +% api_g_un_zip_file, + api_g_un_zip]. + +api_open_close(doc) -> "Test open/0 and close/1"; +api_open_close(suite) -> []; +api_open_close(Config) when is_list(Config) -> + ?line Fd1 = zlib:open(), + ?line Fd2 = zlib:open(), + ?m(false,Fd1 == Fd2), + ?m(ok,zlib:close(Fd1)), + ?m(?BARG, zlib:close(Fd1)), + ?m(ok,zlib:close(Fd2)), + + %% Make sure that we don't get any EXIT messages if trap_exit is enabled. + ?line process_flag(trap_exit, true), + ?line Fd3 = zlib:open(), + ?m(ok,zlib:close(Fd3)), + receive + Any -> ?line ?t:fail({unexpected_message,Any}) + after 10 -> ok + end. + +api_deflateInit(doc) -> "Test deflateInit/2 and /6"; +api_deflateInit(suite) -> []; +api_deflateInit(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(?BARG, zlib:deflateInit(gurka, none)), + ?m(?BARG, zlib:deflateInit(gurka, gurka)), + ?m(?BARG, zlib:deflateInit(Z1, gurka)), + Levels = [none, default, best_speed, best_compression] ++ lists:seq(0,9), + lists:foreach(fun(Level) -> + ?line Z = zlib:open(), + ?m(ok, zlib:deflateInit(Z, Level)), + ?m(ok,zlib:close(Z)) + end, Levels), + %% /6 + ?m(?BARG, zlib:deflateInit(Z1,gurka,deflated,-15,8,default)), + + ?m(?BARG, zlib:deflateInit(Z1,default,undefined,-15,8,default)), + + ?m(?BARG, zlib:deflateInit(Z1,default,deflated,48,8,default)), + ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-20,8,default)), + ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-7,8,default)), + ?m(?BARG, zlib:deflateInit(Z1,default,deflated,7,8,default)), + ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-8,8,default)), + ?m(?BARG, zlib:deflateInit(Z1,default,deflated,8,8,default)), + + ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-15,0,default)), + ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-15,10,default)), + + ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-15,8,0)), + ?m(?BARG, zlib:deflateInit(Z1,default,deflated,-15,8,undefined)), + + lists:foreach(fun(Level) -> + ?line Z = zlib:open(), + ?m(ok, zlib:deflateInit(Z, Level, deflated, -15, 8, default)), + ?m(ok,zlib:close(Z)) + end, Levels), + + lists:foreach(fun(Wbits) -> + ?line Z11 = zlib:open(), + ?m(ok, zlib:deflateInit(Z11,best_compression,deflated, + Wbits,8,default)), + ?line Z12 = zlib:open(), + ?m(ok, zlib:deflateInit(Z12,default,deflated,-Wbits,8,default)), + ?m(ok,zlib:close(Z11)), + ?m(ok,zlib:close(Z12)) + end, lists:seq(9, 15)), + + lists:foreach(fun(MemLevel) -> + ?line Z = zlib:open(), + ?m(ok, zlib:deflateInit(Z,default,deflated,-15, + MemLevel,default)), + ?m(ok,zlib:close(Z)) + end, lists:seq(1,8)), + + Strategies = [filtered,huffman_only,default], + lists:foreach(fun(Strategy) -> + ?line Z = zlib:open(), + ?m(ok, zlib:deflateInit(Z,best_speed,deflated,-15,8,Strategy)), + ?m(ok,zlib:close(Z)) + end, Strategies), + ?m(ok, zlib:deflateInit(Z1,default,deflated,-15,8,default)), + ?m({'EXIT',_}, zlib:deflateInit(Z1,none,deflated,-15,8,default)), %% ?? + ?m(ok, zlib:close(Z1)). + +api_deflateSetDictionary(doc) -> "Test deflateSetDictionary"; +api_deflateSetDictionary(suite) -> []; +api_deflateSetDictionary(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(ok, zlib:deflateInit(Z1, default)), + ?m(Id when is_integer(Id), zlib:deflateSetDictionary(Z1, <<1,1,2,3,4,5,1>>)), + ?m(Id when is_integer(Id), zlib:deflateSetDictionary(Z1, [1,1,2,3,4,5,1])), + ?m(?BARG, zlib:deflateSetDictionary(Z1, gurka)), + ?m(?BARG, zlib:deflateSetDictionary(Z1, 128)), + ?m(_, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, none)), + ?m({'EXIT',{stream_error,_}},zlib:deflateSetDictionary(Z1,<<1,1,2,3,4,5,1>>)), + ?m(ok, zlib:close(Z1)). + +api_deflateReset(doc) -> "Test deflateReset"; +api_deflateReset(suite) -> []; +api_deflateReset(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(ok, zlib:deflateInit(Z1, default)), + ?m(_, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, none)), + ?m(ok, zlib:deflateReset(Z1)), + ?m(ok, zlib:deflateReset(Z1)), + %% FIXME how do I make this go wrong?? + ?m(ok, zlib:close(Z1)). + +api_deflateParams(doc) -> "Test deflateParams"; +api_deflateParams(suite) -> []; +api_deflateParams(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(ok, zlib:deflateInit(Z1, default)), + ?m(_, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, none)), + ?m(ok, zlib:deflateParams(Z1, best_compression, huffman_only)), + ?m(_, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, sync)), + ?m({'EXIT',_}, zlib:deflateParams(Z1,best_speed, filtered)), + ?m(ok, zlib:close(Z1)). + +api_deflate(doc) -> "Test deflate"; +api_deflate(suite) -> []; +api_deflate(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(ok, zlib:deflateInit(Z1, default)), + ?m([B] when is_binary(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, finish)), + ?m(ok, zlib:deflateReset(Z1)), + ?m([B] when is_binary(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, finish)), + ?m(ok, zlib:deflateReset(Z1)), + ?m(B when is_list(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>)), + ?m(B when is_list(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, none)), + ?m(B when is_list(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, sync)), + ?m(B when is_list(B), zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, full)), + ?m(B when is_list(B), zlib:deflate(Z1, <<>>, finish)), + + ?m(?BARG, zlib:deflate(gurka, <<1,1,1,1,1,1,1,1,1>>, full)), + ?m(?BARG, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, asdj)), + ?m(?BARG, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, 198)), + %% Causes problems ERROR REPORT + ?m(?BARG, zlib:deflate(Z1, [asdj,asd], none)), + + ?m(ok, zlib:close(Z1)). + +api_deflateEnd(doc) -> "Test deflateEnd"; +api_deflateEnd(suite) -> []; +api_deflateEnd(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(ok, zlib:deflateInit(Z1, default)), + ?m(ok, zlib:deflateEnd(Z1)), + ?m({'EXIT', {einval,_}}, zlib:deflateEnd(Z1)), %% ?? + ?m(?BARG, zlib:deflateEnd(gurka)), + ?m(ok, zlib:deflateInit(Z1, default)), + ?m(B when is_list(B), zlib:deflate(Z1, <<"Kilroy was here">>)), + ?m({'EXIT', {data_error,_}}, zlib:deflateEnd(Z1)), + ?m(ok, zlib:deflateInit(Z1, default)), + ?m(B when is_list(B), zlib:deflate(Z1, <<"Kilroy was here">>)), + ?m(B when is_list(B), zlib:deflate(Z1, <<"Kilroy was here">>, finish)), + ?m(ok, zlib:deflateEnd(Z1)), + + ?m(ok, zlib:close(Z1)). + +api_inflateInit(doc) -> "Test inflateInit /1 and /2"; +api_inflateInit(suite) -> []; +api_inflateInit(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(?BARG, zlib:inflateInit(gurka)), + ?m(ok, zlib:inflateInit(Z1)), + ?m({'EXIT',{einval,_}}, zlib:inflateInit(Z1, 15)), %% ?? + lists:foreach(fun(Wbits) -> + ?line Z11 = zlib:open(), + ?m(ok, zlib:inflateInit(Z11,Wbits)), + ?line Z12 = zlib:open(), + ?m(ok, zlib:inflateInit(Z12,-Wbits)), + ?m(ok,zlib:close(Z11)), + ?m(ok,zlib:close(Z12)) + end, lists:seq(9,15)), + ?m(?BARG, zlib:inflateInit(gurka, -15)), + ?m(?BARG, zlib:inflateInit(Z1, 7)), + ?m(?BARG, zlib:inflateInit(Z1, -7)), + ?m(?BARG, zlib:inflateInit(Z1, 48)), + ?m(?BARG, zlib:inflateInit(Z1, -16)), + ?m(ok, zlib:close(Z1)). + +api_inflateSetDictionary(doc) -> "Test inflateSetDictionary"; +api_inflateSetDictionary(suite) -> []; +api_inflateSetDictionary(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(ok, zlib:inflateInit(Z1)), + ?m(?BARG, zlib:inflateSetDictionary(gurka,<<1,1,1,1,1>>)), + ?m(?BARG, zlib:inflateSetDictionary(Z1,102)), + ?m(?BARG, zlib:inflateSetDictionary(Z1,gurka)), + Dict = <<1,1,1,1,1>>, + ?m({'EXIT',{stream_error,_}}, zlib:inflateSetDictionary(Z1,Dict)), + ?m(ok, zlib:close(Z1)). + +api_inflateSync(doc) -> "Test inflateSync"; +api_inflateSync(suite) -> []; +api_inflateSync(Config) when is_list(Config) -> + {skip,"inflateSync/1 sucks"}. +%% ?line Z1 = zlib:open(), +%% ?m(ok, zlib:deflateInit(Z1)), +%% ?line B1list0 = zlib:deflate(Z1, "gurkan gurra ger galna tunnor", full), +%% ?line B2 = zlib:deflate(Z1, "grodan boll", finish), +%% io:format("~p\n", [B1list0]), +%% io:format("~p\n", [B2]), +%% ?m(ok, zlib:deflateEnd(Z1)), +%% ?line B1 = clobber(14, list_to_binary(B1list0)), +%% ?line Compressed = list_to_binary([B1,B2]), +%% ?line io:format("~p\n", [Compressed]), + +%% ?m(ok, zlib:inflateInit(Z1)), +%% ?m(?BARG, zlib:inflateSync(gurka)), +%% ?m({'EXIT',{data_error,_}}, zlib:inflate(Z1, Compressed)), +%% ?m(ok, zlib:inflateSync(Z1)), +%% ?line Ubs = zlib:inflate(Z1, []), +%% ?line <<"grodan boll">> = list_to_binary(Ubs), +%% ?m(ok, zlib:close(Z1)). + +clobber(N, Bin) when is_binary(Bin) -> + T = list_to_tuple(binary_to_list(Bin)), + Byte = case element(N, T) of + 255 -> 254; + B -> B+1 + end, + list_to_binary(tuple_to_list(setelement(N, T, Byte))). + +api_inflateReset(doc) -> "Test inflateReset"; +api_inflateReset(suite) -> []; +api_inflateReset(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(ok, zlib:inflateInit(Z1)), + ?m(?BARG, zlib:inflateReset(gurka)), + ?m(ok, zlib:inflateReset(Z1)), + ?m(ok, zlib:close(Z1)). + +api_inflate(doc) -> "Test inflate"; +api_inflate(suite) -> []; +api_inflate(Config) when is_list(Config) -> + Data = [<<1,2,2,3,3,3,4,4,4,4>>], + ?line Compressed = zlib:compress(Data), + ?line Z1 = zlib:open(), + ?m(ok, zlib:inflateInit(Z1)), + ?m([], zlib:inflate(Z1, <<>>)), + ?m(Data, zlib:inflate(Z1, Compressed)), + ?m(ok, zlib:inflateEnd(Z1)), + ?m(ok, zlib:inflateInit(Z1)), + ?m(Data, zlib:inflate(Z1, Compressed)), + ?m(?BARG, zlib:inflate(gurka, Compressed)), + ?m(?BARG, zlib:inflate(Z1, 4384)), + ?m(?BARG, zlib:inflate(Z1, [atom_list])), + ?m(ok, zlib:inflateEnd(Z1)), + ?m(ok, zlib:inflateInit(Z1)), + ?m({'EXIT',{data_error,_}}, zlib:inflate(Z1, <<2,1,2,1,2>>)), + ?m(ok, zlib:close(Z1)). + +api_inflateEnd(doc) -> "Test inflateEnd"; +api_inflateEnd(suite) -> []; +api_inflateEnd(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m({'EXIT',{einval,_}}, zlib:inflateEnd(Z1)), + ?m(ok, zlib:inflateInit(Z1)), + ?m(?BARG, zlib:inflateEnd(gurka)), + ?m({'EXIT',{data_error,_}}, zlib:inflateEnd(Z1)), + ?m({'EXIT',{einval,_}}, zlib:inflateEnd(Z1)), + ?m(ok, zlib:inflateInit(Z1)), + ?m(B when is_list(B), zlib:inflate(Z1, zlib:compress("abc"))), + ?m(ok, zlib:inflateEnd(Z1)), + ?m(ok, zlib:close(Z1)). + +api_getBufsz(doc) -> "Test getBufsz"; +api_getBufsz(suite) -> []; +api_getBufsz(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(Val when is_integer(Val), zlib:getBufSize(Z1)), + ?m(?BARG, zlib:getBufSize(gurka)), + ?m(ok, zlib:close(Z1)). + +api_setBufsz(doc) -> "Test setBufsz"; +api_setBufsz(suite) -> []; +api_setBufsz(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(?BARG, zlib:setBufSize(Z1, gurka)), + ?m(?BARG, zlib:setBufSize(gurka, 1232330)), + Sz = ?m( Val when is_integer(Val), zlib:getBufSize(Z1)), + ?m(ok, zlib:setBufSize(Z1, Sz*2)), + DSz = Sz*2, + ?m(DSz, zlib:getBufSize(Z1)), + ?m(ok, zlib:close(Z1)). + +%%% Debug function ?? +api_getQSize(doc) -> "Test getQSize"; +api_getQSize(suite) -> []; +api_getQSize(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + Q = ?m(Val when is_integer(Val), zlib:getQSize(Z1)), + io:format("QSize ~p ~n", [Q]), + ?m(?BARG, zlib:getQSize(gurka)), + ?m(ok, zlib:close(Z1)). + +api_crc32(doc) -> "Test crc32"; +api_crc32(suite) -> []; +api_crc32(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(ok, zlib:deflateInit(Z1,best_speed,deflated,-15,8,default)), + Bin = <<1,1,1,1,1,1,1,1,1>>, + Compressed1 = ?m(_, zlib:deflate(Z1, Bin, none)), + Compressed2 = ?m(_, zlib:deflate(Z1, <<>>, finish)), + Compressed = list_to_binary(Compressed1 ++ Compressed2), + CRC1 = ?m( CRC1 when is_integer(CRC1), zlib:crc32(Z1)), + ?m(CRC1 when is_integer(CRC1), zlib:crc32(Z1,Bin)), + ?m(CRC2 when is_integer(CRC2), zlib:crc32(Z1,Compressed)), + CRC2 = ?m(CRC2 when is_integer(CRC2), zlib:crc32(Z1,0,Compressed)), + ?m(CRC3 when CRC2 /= CRC3, zlib:crc32(Z1,234,Compressed)), + ?m(?BARG, zlib:crc32(gurka)), + ?m(?BARG, zlib:crc32(Z1, not_a_binary)), + ?m(?BARG, zlib:crc32(gurka, <<1,1,2,4,4>>)), + ?m(?BARG, zlib:crc32(Z1, 2298929, not_a_binary)), + ?m(?BARG, zlib:crc32(Z1, not_an_int, <<123,123,123,35,231>>)), + ?m(?BARG, zlib:crc32_combine(Z1, not_an_int, 123123, 123)), + ?m(?BARG, zlib:crc32_combine(Z1, noint, 123123, 123)), + ?m(?BARG, zlib:crc32_combine(Z1, 123123, noint, 123)), + ?m(?BARG, zlib:crc32_combine(Z1, 123123, 123, noint)), + ?m(ok, zlib:deflateEnd(Z1)), + ?m(ok, zlib:close(Z1)). + +api_adler32(doc) -> "Test adler32"; +api_adler32(suite) -> []; +api_adler32(Config) when is_list(Config) -> + ?line Z1 = zlib:open(), + ?m(ok, zlib:deflateInit(Z1,best_speed,deflated,-15,8,default)), + Bin = <<1,1,1,1,1,1,1,1,1>>, + Compressed1 = ?m(_, zlib:deflate(Z1, Bin, none)), + Compressed2 = ?m(_, zlib:deflate(Z1, <<>>, finish)), + Compressed = list_to_binary(Compressed1 ++ Compressed2), + ?m(ADLER1 when is_integer(ADLER1), zlib:adler32(Z1,Bin)), + ADLER2 = ?m(ADLER2 when is_integer(ADLER2), zlib:adler32(Z1,Compressed)), + ?m(ADLER2 when is_integer(ADLER2), zlib:adler32(Z1,1,Compressed)), + ?m(ADLER3 when ADLER2 /= ADLER3, zlib:adler32(Z1,234,Compressed)), + ?m(?BARG, zlib:adler32(Z1, not_a_binary)), + ?m(?BARG, zlib:adler32(gurka, <<1,1,2,4,4>>)), + ?m(?BARG, zlib:adler32(Z1, 2298929, not_a_binary)), + ?m(?BARG, zlib:adler32(Z1, not_an_int, <<123,123,123,35,231>>)), + ?m(?BARG, zlib:adler32_combine(Z1, noint, 123123, 123)), + ?m(?BARG, zlib:adler32_combine(Z1, 123123, noint, 123)), + ?m(?BARG, zlib:adler32_combine(Z1, 123123, 123, noint)), + ?m(ok, zlib:deflateEnd(Z1)), + ?m(ok, zlib:close(Z1)). + +api_un_compress(doc) -> "Test compress"; +api_un_compress(suite) -> []; +api_un_compress(Config) when is_list(Config) -> + ?m(?BARG,zlib:compress(not_a_binary)), + Bin = <<1,11,1,23,45>>, + ?line Comp = zlib:compress(Bin), + ?m(?BARG,zlib:uncompress(not_a_binary)), + ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<171,171,171,171,171>>)), + ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<>>)), + ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<120>>)), + ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<120,156>>)), + ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<120,156,3>>)), + ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<120,156,3,0>>)), + ?m({'EXIT',{data_error,_}}, zlib:uncompress(<<0,156,3,0,0,0,0,1>>)), + ?m(Bin, zlib:uncompress(Comp)). + +api_un_zip(doc) -> "Test zip"; +api_un_zip(suite) -> []; +api_un_zip(Config) when is_list(Config) -> + ?m(?BARG,zlib:zip(not_a_binary)), + Bin = <<1,11,1,23,45>>, + ?line Comp = zlib:zip(Bin), + ?m(?BARG,zlib:unzip(not_a_binary)), + ?m({'EXIT',{data_error,_}}, zlib:unzip(<<171,171,171,171,171>>)), + ?m({'EXIT',{data_error,_}}, zlib:unzip(<<>>)), + ?m(Bin, zlib:unzip(Comp)), + + %% OTP-6396 + B = <<131,104,19,100,0,13,99,95,99,105,100,95,99,115,103,115,110,95,50,97,1,107,0,4,208,161,246,29,107,0,3,237,166,224,107,0,6,66,240,153,0,2,10,1,0,8,97,116,116,97,99,104,101,100,104,2,100,0,22,117,112,100,97,116,101,95,112,100,112,95,99,111,110,116,101,120,116,95,114,101,113,107,0,114,69,3,12,1,11,97,31,113,150,64,104,132,61,64,104,12,3,197,31,113,150,64,104,132,61,64,104,12,1,11,97,31,115,150,64,104,116,73,64,104,0,0,0,0,0,0,65,149,16,61,65,149,16,61,1,241,33,4,5,0,33,4,4,10,6,10,181,4,10,6,10,181,38,15,99,111,109,109,97,110,100,1,114,45,97,112,110,45,49,3,99,111,109,5,109,110,99,57,57,6,109,99,99,50,52,48,4,103,112,114,115,8,0,104,2,104,2,100,0,8,97,99,116,105,118,97,116,101,104,23,100,0,11,112,100,112,95,99,111,110,116,1,120,116,100,0,7,112,114,105,109,97,114,121,97,1,100,0,9,117,110,100,101,102,105,110,101,100,97,1,97,4,97,4,97,7,100,0,9,117,110,100,101,102,105,110,101,100,100,0,9,117,110,100,101,102,105,110,10100,100,0,9,117,110,100,101,102,105,110,101,100,100,0,5,102,97,108,115,101,100,0,9,117,110,100,101,102,105,110,101,100,100,0,9,117,110,100,101,102,105,110,101,100,100,0,9,117,110,100,101,102,105,1,101,100,97,0,100,0,9,117,110,100,101,102,105,110,101,100,107,0,4,16,0,1,144,107,0,4,61,139,186,181,107,0,4,10,8,201,49,100,0,9,117,110,100,101,102,105,110,101,100,100,0,9,117,110,100,101,102,105,0,101,100,100,0,9,117,110,100,101,102,105,110,101,100,104,2,104,3,98,0,0,7,214,97,11,97,20,104,3,97,17,97,16,97,21,106,108,0,0,0,3,104,2,97,1,104,2,104,3,98,0,0,7,214,97,11,97,20,104,3,97,17,97,167,20,104,2,97,4,104,2,104,3,98,0,0,7,214,97,11,97,20,104,3,97,17,97,16,97,21,104,2,97,10,104,2,104,3,98,0,0,7,214,97,11,97,20,104,3,97,17,97,16,97,26,106,100,0,5,118,101,114,57,57,100,0,9,117,110,0,101,102,105,110,101,100,107,0,2,0,244,107,0,4,10,6,102,195,107,0,4,10,6,102,195,100,0,9,117,110,100,101,102,105,110,101,100,100,0,9,117,110,100,101,102,105,110,101,100,107,0,125,248,143,0,203,25115,157,116,65,185,65,172,55,87,164,88,225,50,203,251,115,157,116,65,185,65,172,55,87,164,88,225,50,0,0,82,153,50,0,200,98,87,148,237,193,185,65,149,167,69,144,14,16,153,50,3,81,70,94,13,109,193,1,120,5,181,113,198,118,50,3,81,70,94,13,109,193,185,120,5,181,113,198,118,153,3,81,70,94,13,109,193,185,120,5,181,113,198,118,153,50,16,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,113,92,2,119,128,0,0,108,0,0,1,107,0,114,69,3,12,1,11,97,31,113,150,64,104,132,61,64,104,12,3,11,97,31,113,150,64,104,132,61,64,104,12,1,11,97,31,115,150,64,104,116,73,64,104,0,0,0,0,0,0,65,149,16,61,65,149,16,61,1,241,33,4,0,33,4,4,10,6,10,181,4,10,6,10,181,38,15,99,111,109,109,97,110,100,101,114,45,97,112,110,45,49,3,99,111,109,5,109,110,99,57,57,6,109,99,99,50,52,48,4,103,112,114,115,8,0,106>>, + Z = zlib:zip(B), + ?m(B, zlib:unzip(Z)). + +%% api_g_un_zip_file(doc) -> "Test gunzip_file"; +%% api_g_un_zip_file(suite) -> []; +%% api_g_un_zip_file(Config) when is_list(Config) -> +%% ?line Out = conf(data_dir,Config), +%% io:format("Using OutDir ~p ~n", [Out]), +%% F = filename:join(Out,"testing1"), +%% Data = <<1,1,255,255,255,1,1>>, +%% ?m(ok, file:write_file(F,Data)), +%% ?line Compressed = zlib:gzip_file(F), +%% ?m(ok, file:write_file(F++".gz",Compressed)), +%% ?m(Data, zlib:gunzip_file(F++".gz")), +%% ?m({error,enoent}, zlib:gunzip_file(gurka)), +%% ?m({error,enoent}, zlib:gzip_file(gurka)), +%% ?m({error,what}, zlib:gunzip_file(F)), +%% ?line ok. + +api_g_un_zip(doc) -> "Test gunzip"; +api_g_un_zip(suite) -> []; +api_g_un_zip(Config) when is_list(Config) -> + ?m(?BARG,zlib:gzip(not_a_binary)), + Bin = <<1,11,1,23,45>>, + ?line Comp = zlib:gzip(Bin), + ?m(?BARG, zlib:gunzip(not_a_binary)), + ?m(?DATA_ERROR, zlib:gunzip(<<171,171,171,171,171>>)), + ?m(?DATA_ERROR, zlib:gunzip(<<>>)), + ?m(Bin, zlib:gunzip(Comp)), + + %% Bad CRC; bad length. + BadCrc = bad_crc_data(), + ?line ?m({'EXIT',{data_error,_}},(catch zlib:gunzip(BadCrc))), + BadLen = bad_len_data(), + ?line ?m({'EXIT',{data_error,_}},(catch zlib:gunzip(BadLen))), + ok. + +bad_crc_data() -> + %% zlib:zip(<<42>>), one byte changed. + <<31,139,8,0,0,0,0,0,0,3,211,2,0,91,39,185,9,1,0,0,0>>. + +bad_len_data() -> + %% zlib:zip(<<42>>), one byte changed. + <<31,139,8,0,0,0,0,0,0,3,211,2,0,91,38,185,9,2,0,0,0>>. + +examples(doc) -> "Test the doc examples"; +examples(suite) -> + [ + intro + ]. + +intro(suite) -> []; +intro(doc) -> ""; +intro(Config) when is_list(Config) -> + D = <<"This is a binary">>, + [put({ex, N}, <<"This is a binary">>) || N <- [0,1,2,3,4]], + put({ex, 5}, end_of_data), + put(ex,0), + ?line Read = fun() -> + N = get(ex), + put(ex,N+1), + get({ex,N}) + end, + + ?line Z = zlib:open(), + ?line ok = zlib:deflateInit(Z,default), + + ?line Compress = fun(end_of_data, _Cont) -> []; + (Data, Cont) -> + [zlib:deflate(Z, Data)|Cont(Read(),Cont)] + end, + ?line Compressed = Compress(Read(),Compress), + ?line Last = zlib:deflate(Z, [], finish), + ?line ok = zlib:deflateEnd(Z), + ?line zlib:close(Z), + ?line Res = list_to_binary([Compressed|Last]), + Orig = list_to_binary(lists:duplicate(5, D)), + ?m(Orig, zlib:uncompress(Res)). + +func(doc) -> "Test the functionality"; +func(suite) -> + [zip_usage, gz_usage, gz_usage2, compress_usage, + dictionary_usage, + large_deflate, + %% inflateSync, + crc, + adler + ]. + +large_deflate(doc) -> "Test deflate large file, which had a bug reported on erlang-bugs"; +large_deflate(suite) -> []; +large_deflate(Config) when is_list(Config) -> + large_deflate(). +large_deflate() -> + ?line Z = zlib:open(), + ?line Plain = rand_bytes(zlib:getBufSize(Z)*5), + ?line ok = zlib:deflateInit(Z), + ?line _ZlibHeader = zlib:deflate(Z, [], full), + ?line Deflated = zlib:deflate(Z, Plain, full), + ?m(ok, zlib:close(Z)), + ?m(Plain, zlib:unzip(list_to_binary([Deflated, 3, 0]))). + +rand_bytes(Sz) -> + L = <<8,2,3,6,1,2,3,2,3,4,8,7,3,7,2,3,4,7,5,8,9,3>>, + rand_bytes(erlang:md5(L),Sz). + +rand_bytes(Bin, Sz) when byte_size(Bin) >= Sz -> + <> = Bin, + Res; +rand_bytes(Bin, Sz) -> + rand_bytes(<<(erlang:md5(Bin))/binary, Bin/binary>>, Sz). + + +zip_usage(doc) -> "Test a standard compressed zip file"; +zip_usage(suite) -> []; +zip_usage(Config) when is_list(Config) -> + zip_usage(zip_usage({get_arg,Config})); +zip_usage({get_arg,Config}) -> + ?line Out = conf(data_dir,Config), + ?line {ok,ZIP} = file:read_file(filename:join(Out,"zipdoc.zip")), + ?line {ok,ORIG} = file:read_file(filename:join(Out,"zipdoc")), + {run,ZIP,ORIG}; +zip_usage({run,ZIP,ORIG}) -> + ?line <<_:14/binary, CRC:32/little, + CompSz:32/little, UnCompSz:32/little,_:31/binary, + Compressed:CompSz/binary, _/binary>> = ZIP, + + %%io:format("CRC ~p CSz ~p UnCSz ~p ~n", [CRC,CompSz,UnCompSz]), + ?line Split = split_bin(Compressed,[]), + ?line Z = zlib:open(), + + ?m(ok, zlib:inflateInit(Z, -15)), + Bs = [zlib:inflate(Z, Part) || Part <- Split], + UC0 = list_to_binary(Bs), + ?m(UnCompSz, byte_size(UC0)), + ?m(CRC, zlib:crc32(Z)), + ?m(true, zlib:crc32(Z,UC0) == zlib:crc32(Z,ORIG)), + ?m(ok, zlib:inflateEnd(Z)), + + ?line UC1 = zlib:unzip(Compressed), + ?m(UnCompSz, byte_size(UC1)), + ?m(true, zlib:crc32(Z,UC1) == zlib:crc32(Z,ORIG)), + + ?m(ok, zlib:inflateInit(Z, -15)), + ?line UC2 = zlib:inflate(Z, Compressed), + ?m(UnCompSz, byte_size(list_to_binary(UC2))), + ?m(CRC, zlib:crc32(Z)), + ?m(true, zlib:crc32(Z,UC2) == zlib:crc32(Z,ORIG)), + ?m(ok, zlib:inflateEnd(Z)), + + ?m(ok, zlib:inflateInit(Z, -15)), + ?line UC3 = zlib:inflate(Z, Split), % Test multivec. + ?m(UnCompSz, byte_size(list_to_binary(UC3))), + ?m(true, zlib:crc32(Z,UC3) == zlib:crc32(Z,ORIG)), + ?m(CRC, zlib:crc32(Z)), + ?m(ok, zlib:inflateEnd(Z)), + + ?m(ok, zlib:inflateInit(Z, -15)), + ?m(ok, zlib:setBufSize(Z, UnCompSz *2)), + ?line UC4 = zlib:inflate(Z, Compressed), + ?m(UnCompSz, byte_size(list_to_binary(UC4))), + ?m(CRC, zlib:crc32(Z)), + ?m(CRC, zlib:crc32(Z,UC4)), + ?m(true, zlib:crc32(Z,UC4) == zlib:crc32(Z,ORIG)), + ?m(ok, zlib:inflateEnd(Z)), + + ?line C1 = zlib:zip(ORIG), + ?line UC5 = zlib:unzip(C1), + ?m(CRC, zlib:crc32(Z,UC5)), + ?m(true,zlib:crc32(Z,UC5) == zlib:crc32(Z,ORIG)), + + ?m(ok, zlib:deflateInit(Z, default, deflated, -15, 8, default)), + ?line C2 = zlib:deflate(Z, ORIG, finish), + ?m(true, C1 == list_to_binary(C2)), + ?m(ok, zlib:deflateEnd(Z)), + + ?m(ok, zlib:deflateInit(Z, none, deflated, -15, 8, filtered)), + ?m(ok, zlib:deflateParams(Z, default, default)), + ?line C3 = zlib:deflate(Z, ORIG, finish), + ?m(true, C1 == list_to_binary(C3)), + ?m(ok, zlib:deflateEnd(Z)), + + ?line ok = zlib:close(Z), + ?line ok. + +gz_usage(doc) -> "Test a standard compressed gzipped file"; +gz_usage(suite) -> []; +gz_usage(Config) when is_list(Config) -> + gz_usage(gz_usage({get_arg,Config})); +gz_usage({get_arg,Config}) -> + ?line Out = conf(data_dir,Config), + ?line {ok,GZIP} = file:read_file(filename:join(Out,"zipdoc.1.gz")), + ?line {ok,ORIG} = file:read_file(filename:join(Out,"zipdoc")), + ?line {ok,GZIP2} = file:read_file(filename:join(Out,"zipdoc.txt.gz")), + {run,GZIP,ORIG,GZIP2}; +gz_usage({run,GZIP,ORIG,GZIP2}) -> + ?line Z = zlib:open(), + ?line UC1 = zlib:gunzip(GZIP), + ?m(true,zlib:crc32(Z,UC1) == zlib:crc32(Z,ORIG)), + ?line UC3 = zlib:gunzip(GZIP2), + ?m(true,zlib:crc32(Z,UC3) == zlib:crc32(Z,ORIG)), + ?line Compressed = zlib:gzip(ORIG), + ?line UC5 = zlib:gunzip(Compressed), + ?m(true,zlib:crc32(Z,UC5) == zlib:crc32(Z,ORIG)), + ?line ok = zlib:close(Z). + +gz_usage2(doc) -> "Test more of a standard compressed gzipped file"; +gz_usage2(suite) -> []; +gz_usage2(Config) -> + case os:find_executable("gzip") of + Name when is_list(Name) -> + ?line Z = zlib:open(), + ?line Out = conf(data_dir,Config), + ?line {ok,ORIG} = file:read_file(filename:join(Out,"zipdoc")), + ?line Compressed = zlib:gzip(ORIG), + GzOutFile = filename:join(Out,"out.gz"), + OutFile = filename:join(Out,"out.txt"), + ?m(ok, file:write_file(GzOutFile,Compressed)), + ?line os:cmd("gzip -c -d " ++ GzOutFile ++ " > " ++ OutFile), + case file:read_file(OutFile) of + {ok,ExtDecompressed} -> + ?m(true, + zlib:crc32(Z,ExtDecompressed) == zlib:crc32(Z,ORIG)); + Error -> + io:format("Couldn't test external decompressor ~p\n", + [Error]) + end, + ?line ok = zlib:close(Z), + ok; + false -> + {skipped,"No gzip in path"} + end. + + + +compress_usage(doc) -> + "Test that (de)compress funcs work with" + " standard tools, for example a chunk from a png file"; +compress_usage(suite) -> []; +compress_usage(Config) when is_list(Config) -> + compress_usage(compress_usage({get_arg,Config})); +compress_usage({get_arg,Config}) -> + ?line Out = conf(data_dir,Config), + ?line {ok,C1} = file:read_file(filename:join(Out,"png-compressed.zlib")), + {run,C1}; +compress_usage({run,C1}) -> + ?line Z = zlib:open(), + %% See that we can uncompress a file generated with external prog. + ?line UC1 = zlib:uncompress(C1), + %% Check that the crc are correct. + ?m(4125865008,zlib:crc32(Z,UC1)), + ?line C2 = zlib:compress(UC1), + ?line UC2 = zlib:uncompress(C2), + %% Check that the crc are correct. + ?m(4125865008,zlib:crc32(Z,UC2)), + + ?line ok = zlib:close(Z), + + D = [<<"We tests some partial">>, + <<"data, sent over">>, + <<"the stream">>, + <<"we check that we can unpack">>, + <<"every message we get">>], + + ?line ZC = zlib:open(), + ?line ZU = zlib:open(), + Test = fun(finish, {_,Tot}) -> + ?line Compressed = zlib:deflate(ZC, <<>>, finish), + Data = zlib:inflate(ZU, Compressed), + [Tot|Data]; + (Data, {Op,Tot}) -> + ?line Compressed = zlib:deflate(ZC, Data, Op), + Res1 = ?m([Data],zlib:inflate(ZU, Compressed)), + {Op, [Tot|Res1]} + end, + ?line zlib:deflateInit(ZC), + ?line zlib:inflateInit(ZU), + ?line T1 = lists:foldl(Test,{sync,[]},D++[finish]), + ?m(true, list_to_binary(D) == list_to_binary(T1)), + ?line zlib:deflateEnd(ZC), + ?line zlib:inflateEnd(ZU), + + ?line zlib:deflateInit(ZC), + ?line zlib:inflateInit(ZU), + ?line T2 = lists:foldl(Test,{full,[]},D++[finish]), + ?m(true, list_to_binary(D) == list_to_binary(T2)), + ?line zlib:deflateEnd(ZC), + ?line zlib:inflateEnd(ZU), + + ?line ok = zlib:close(ZC), + ?line ok = zlib:close(ZU). + + +crc(doc) -> "Check that crc works as expected"; +crc(suite) -> []; +crc(Config) when is_list(Config) -> + crc(crc({get_arg,Config})); +crc({get_arg,Config}) -> + ?line Out = conf(data_dir,Config), + ?line {ok,C1} = file:read_file(filename:join(Out,"zipdoc")), + {run,C1}; +crc({run,C1}) -> + ?line Z = zlib:open(), + ?line Crc = zlib:crc32(Z, C1), + Bins = split_bin(C1,[]), + %%io:format("Length ~p ~p ~n", [length(Bins), [size(Bin) || Bin <- Bins]]), + Last = lists:last(Bins), + SCrc = lists:foldl(fun(Bin,Crc0) -> + Crc1 = zlib:crc32(Z, Crc0, Bin), + ?m(false, Crc == Crc1 andalso Bin /= Last), + Crc1 + end, 0, Bins), + ?m(Crc,SCrc), + ?line [First|Rest] = Bins, + Combine = fun(Bin, CS1) -> + CS2 = zlib:crc32(Z, Bin), + S2 = byte_size(Bin), + zlib:crc32_combine(Z,CS1,CS2,S2) + end, + ?line Comb = lists:foldl(Combine, zlib:crc32(Z, First), Rest), + ?m(Crc,Comb), + ?line ok = zlib:close(Z). + +adler(doc) -> "Check that adler works as expected"; +adler(suite) -> []; +adler(Config) when is_list(Config) -> + adler(adler({get_arg,Config})); +adler({get_arg,Config}) -> + ?line Out = conf(data_dir,Config), + File1 = filename:join(Out,"zipdoc"), + ?line {ok,C1} = file:read_file(File1), + {run,C1}; +adler({run,C1}) -> + ?line Z = zlib:open(), + ?m(1, zlib:adler32(Z,<<>>)), + ?line Crc = zlib:adler32(Z, C1), + Bins = split_bin(C1,[]), + Last = lists:last(Bins), + SCrc = lists:foldl(fun(Bin,Crc0) -> + Crc1 = zlib:adler32(Z, Crc0, Bin), + ?m(false, Crc == Crc1 andalso Bin /= Last), + Crc1 + end, zlib:adler32(Z,<<>>), Bins), + ?m(Crc,SCrc), + ?line [First|Rest] = Bins, + Combine = fun(Bin, CS1) -> + CS2 = zlib:adler32(Z, Bin), + S2 = byte_size(Bin), + zlib:adler32_combine(Z,CS1,CS2,S2) + end, + ?line Comb = lists:foldl(Combine, zlib:adler32(Z, First), Rest), + ?m(Crc,Comb), + ?line ok = zlib:close(Z). + +dictionary_usage(doc) -> "Test dictionary usage"; +dictionary_usage(suite) -> []; +dictionary_usage(Config) when is_list(Config) -> + dictionary_usage(dictionary_usage({get_arg,Config})); +dictionary_usage({get_arg,_Config}) -> + {run}; % no args +dictionary_usage({run}) -> + ?line Z1 = zlib:open(), + Dict = <<"Anka">>, + Data = <<"Kalle Anka">>, + ?m(ok, zlib:deflateInit(Z1)), + ?line DictID = zlib:deflateSetDictionary(Z1, Dict), + %% ?line io:format("DictID = ~p\n", [DictID]), + ?line B1 = zlib:deflate(Z1, Data), + ?line B2 = zlib:deflate(Z1, <<>>, finish), + ?m(ok, zlib:deflateEnd(Z1)), + ?m(ok, zlib:close(Z1)), + Compressed = list_to_binary([B1,B2]), + %% io:format("~p\n", [Compressed]), + + %% Now uncompress. + ?line Z2 = zlib:open(), + ?m(ok, zlib:inflateInit(Z2)), + ?line {'EXIT',{{need_dictionary,DictID},_}} = (catch zlib:inflate(Z2, Compressed)), + ?m(ok, zlib:inflateSetDictionary(Z2, Dict)), + ?line Uncompressed = ?m(B when is_list(B), zlib:inflate(Z2, [])), + ?m(ok, zlib:inflateEnd(Z2)), + ?m(ok, zlib:close(Z2)), + ?m(Data, list_to_binary(Uncompressed)). + +split_bin(<>, Acc) -> + split_bin(Rest, [Part|Acc]); +split_bin(Last,Acc) -> + lists:reverse([Last|Acc]). + + +smp(doc) -> "Check concurrent access to zlib driver"; +smp(suite) -> []; +smp(Config) -> + case erlang:system_info(smp_support) of + true -> + NumOfProcs = lists:min([8,erlang:system_info(schedulers)]), + io:format("smp starting ~p workers\n",[NumOfProcs]), + + %% Tests to run in parallel. + Funcs = [zip_usage, gz_usage, compress_usage, dictionary_usage, + crc, adler], + + %% We get all function arguments here to avoid repeated parallel + %% file read access. + FnAList = lists:map(fun(F) -> {F,?MODULE:F({get_arg,Config})} + end, Funcs), + + Pids = [spawn_link(?MODULE, worker, [random:uniform(9999), + list_to_tuple(FnAList), + self()]) + || _ <- lists:seq(1,NumOfProcs)], + wait_pids(Pids); + + false -> + {skipped,"No smp support"} + end. + + +worker(Seed, FnATpl, Parent) -> + io:format("smp worker ~p, seed=~p~n",[self(),Seed]), + random:seed(Seed,Seed,Seed), + worker_loop(100, FnATpl), + Parent ! self(). + +worker_loop(0, _FnATpl) -> + large_deflate(), % the time consuming one as finale + ok; +worker_loop(N, FnATpl) -> + {F,A} = element(random:uniform(size(FnATpl)),FnATpl), + ?MODULE:F(A), + worker_loop(N-1, FnATpl). + +wait_pids([]) -> + ok; +wait_pids(Pids) -> + receive + Pid -> + ?line true = lists:member(Pid,Pids), + Others = lists:delete(Pid,Pids), + io:format("wait_pid got ~p, still waiting for ~p\n",[Pid,Others]), + wait_pids(Others) + end. + + +otp_7359(doc) -> "Deflate/inflate data with size close to multiple of internal buffer size"; +otp_7359(suite) -> []; +otp_7359(_Config) -> + %% Find compressed size + ZTry = zlib:open(), + ok = zlib:deflateInit(ZTry), + ISize = zlib:getBufSize(ZTry), + IData = list_to_binary([Byte band 255 || Byte <- lists:seq(1,ISize)]), + ?line ISize = byte_size(IData), + + ?line DSize = iolist_size(zlib:deflate(ZTry, IData, sync)), + zlib:close(ZTry), + + io:format("Deflated try ~p -> ~p bytes~n", [ISize, DSize]), + + %% Try deflate and inflate with different internal buffer sizes + ISpan = 1, + DSpan = 10, % use larger span around deflated size as it may vary depending on buf size + + Cases = [{DS,IS} || DMul<-[1,2], + DS <- lists:seq((DSize div DMul)-DSpan, + (DSize div DMul)+DSpan), + IMul<-[1,2], + IS <- lists:seq((ISize div IMul)-ISpan, + (ISize div IMul)+ISpan)], + + lists:foreach(fun(Case) -> otp_7359_def_inf(IData,Case) end, + Cases). + + +otp_7359_def_inf(Data,{DefSize,InfSize}) -> + %%io:format("Try: DefSize=~p InfSize=~p~n", [DefSize,InfSize]), + ?line ZDef = zlib:open(), + ?line ok = zlib:deflateInit(ZDef), + ?line ok = zlib:setBufSize(ZDef,DefSize), + ?line DefData = iolist_to_binary(zlib:deflate(ZDef, Data, sync)), + %%io:format("Deflated ~p(~p) -> ~p(~p) bytes~n", + %% [byte_size(Data), InfSize, byte_size(DefData), DefSize]), + ?line ok = zlib:close(ZDef), + + ?line ZInf = zlib:open(), + ?line ok = zlib:inflateInit(ZInf), + ?line ok = zlib:setBufSize(ZInf,InfSize), + ?line Data = iolist_to_binary(zlib:inflate(ZInf, DefData)), + ?line ok = zlib:close(ZInf), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Helps with testing directly %%%%%%%%%%%%% + +conf(What,Config) -> + try ?config(What,Config) of + undefined -> + "./zlib_SUITE_data"; + Dir -> + Dir + catch + _:_ -> "./zlib_SUITE_data" + end. + +t() -> t([all]). + +t(What) when not is_list(What) -> + t([What]); +t(What) -> + lists:foreach(fun(T) -> + try ?MODULE:T([]) + catch _E:_R -> + Line = get(test_server_loc), + io:format("Failed ~p:~p ~p ~p ~p~n", + [T,Line,_E,_R, erlang:get_stacktrace()]) + end + end, expand(What)). + +expand(All) -> + lists:reverse(expand(All,[])). +expand([H|T], Acc) -> + case ?MODULE:H(suite) of + [] -> expand(T,[H|Acc]); + Cs -> + R = expand(Cs, Acc), + expand(T, R) + end; +expand([], Acc) -> Acc. + diff -Nru erlang-13.b.1-dfsg/lib/kernel/vsn.mk erlang-13.b.3-dfsg/lib/kernel/vsn.mk --- erlang-13.b.1-dfsg/lib/kernel/vsn.mk 2009-06-05 13:53:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/kernel/vsn.mk 2009-11-20 13:30:05.000000000 +0000 @@ -1 +1 @@ -KERNEL_VSN = 2.13.2 +KERNEL_VSN = 2.13.4 diff -Nru erlang-13.b.1-dfsg/lib/Makefile erlang-13.b.3-dfsg/lib/Makefile --- erlang-13.b.1-dfsg/lib/Makefile 2009-03-12 12:18:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/Makefile 2009-11-20 13:29:37.000000000 +0000 @@ -60,17 +60,17 @@ public_key ssl toolbar tv observer debugger reltool odbc runtime_tools \ cosTransactions cosEvent cosTime cosNotification cosProperty \ cosFileTransfer cosEventDomain et megaco webtool \ - xmerl edoc eunit ssh inviso typer docbuilder test_server common_test percept + xmerl edoc eunit ssh inviso typer docbuilder erl_docgen test_server common_test percept # dialyzer OTHER_SUB_DIRECTORIES += hipe else # BUILD_ALL on unix OTHER_SUB_DIRECTORIES += \ snmp otp_mibs appmon erl_interface asn1 jinterface wx debugger reltool gs inets \ - ic mnesia crypto orber os_mon parsetools syntax_tools \ + ic mnesia crypto orber os_mon parsetools syntax_tools \ pman public_key ssl toolbar tv observer odbc \ runtime_tools cosTransactions cosEvent cosTime cosNotification \ cosProperty cosFileTransfer cosEventDomain et megaco webtool \ - xmerl edoc eunit ssh inviso typer docbuilder test_server common_test percept + xmerl edoc eunit ssh inviso typer docbuilder erl_docgen test_server common_test percept # dialyzer OTHER_SUB_DIRECTORIES += hipe $(TSP_APP) endif @@ -83,7 +83,7 @@ kernel stdlib compiler orber/include else ifdef SECONDARY_BOOTSTRAP - SUB_DIRECTORIES = parsetools asn1/src hipe + SUB_DIRECTORIES = hipe parsetools asn1/src else ifdef TERTIARY_BOOTSTRAP SUB_DIRECTORIES = snmp diff -Nru erlang-13.b.1-dfsg/lib/megaco/configure erlang-13.b.3-dfsg/lib/megaco/configure --- erlang-13.b.1-dfsg/lib/megaco/configure 2009-06-07 19:02:08.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/configure 2009-11-24 10:12:48.000000000 +0000 @@ -803,8 +803,8 @@ Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-megaco-reentrant-flex-scanner enable reentrans megaco flex scanner - --disable-megaco-reentrant-flex-scanner disable reentrans megaco flex scanner + --enable-megaco-reentrant-flex-scanner enable reentrant megaco flex scanner + --disable-megaco-reentrant-flex-scanner disable reentrant megaco flex scanner --enable-megaco-flex-scanner-lineno enable megaco flex scanner lineno --disable-megaco-flex-scanner-lineno disable megaco flex scanner lineno @@ -3528,7 +3528,7 @@ -CFLAGS="$CFLAGS -I${ERL_TOP}/erts/$host $OTP_EXTRA_FLAGS" +CFLAGS="$CFLAGS -I${ERL_TOP}/erts/$host -I${ERL_TOP}/erts/include/$host $OTP_EXTRA_FLAGS" if test "X$host" = "Xwin32"; then DED_CFLAGS="$CFLAGS" @@ -3546,6 +3546,12 @@ fi fi +DED_INCLUDE="-I${ERL_TOP}/erts/emulator/beam -I${ERL_TOP}/erts/include -I${ERL_TOP}/erts/include/$host" + +DED_CFLAGS="$DED_INCLUDE $DED_CFLAGS" + + + @@ -3624,6 +3630,7 @@ DED_LDFLAGS="-shared" ;; esac +DED_LDFLAGS="$LDFLAGS $DED_LDFLAGS" echo "$as_me:$LINENO: result: $DED_LDFLAGS" >&5 echo "${ECHO_T}$DED_LDFLAGS" >&6 diff -Nru erlang-13.b.1-dfsg/lib/megaco/configure.in erlang-13.b.3-dfsg/lib/megaco/configure.in --- erlang-13.b.1-dfsg/lib/megaco/configure.in 2009-06-05 13:55:42.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/configure.in 2009-11-20 13:37:06.000000000 +0000 @@ -99,8 +99,8 @@ dnl Shall we attempt to use reentrant flex scanner or not dnl AC_ARG_ENABLE(megaco_reentrant_flex_scanner, -[ --enable-megaco-reentrant-flex-scanner enable reentrans megaco flex scanner - --disable-megaco-reentrant-flex-scanner disable reentrans megaco flex scanner], +[ --enable-megaco-reentrant-flex-scanner enable reentrant megaco flex scanner + --disable-megaco-reentrant-flex-scanner disable reentrant megaco flex scanner], if test x${enable_megaco_reentrant_flex_scanner} = xno ; then ENABLE_REENTRANT_MEGACO_FLEX_SCANNER=false else @@ -177,7 +177,7 @@ dnl Flags to the C compiler dnl dnl make sure we find config.h -CFLAGS="$CFLAGS -I${ERL_TOP}/erts/$host $OTP_EXTRA_FLAGS" +CFLAGS="$CFLAGS -I${ERL_TOP}/erts/$host -I${ERL_TOP}/erts/include/$host $OTP_EXTRA_FLAGS" if test "X$host" = "Xwin32"; then DED_CFLAGS="$CFLAGS" @@ -195,6 +195,13 @@ fi fi +dnl emulator includes needed +DED_INCLUDE="-I${ERL_TOP}/erts/emulator/beam -I${ERL_TOP}/erts/include -I${ERL_TOP}/erts/include/$host" + +DED_CFLAGS="$DED_INCLUDE $DED_CFLAGS" + + + AC_SUBST(DED_CFLAGS) @@ -230,6 +237,7 @@ DED_LDFLAGS="-shared" ;; esac +DED_LDFLAGS="$LDFLAGS $DED_LDFLAGS" AC_MSG_RESULT([$DED_LDFLAGS]) AC_SUBST(DED_LDFLAGS) diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/book.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/book.xml 2009-03-12 12:30:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/book.xml 2009-11-20 13:37:09.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20002009 @@ -35,11 +35,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/index.html.src erlang-13.b.3-dfsg/lib/megaco/doc/src/index.html.src --- erlang-13.b.1-dfsg/lib/megaco/doc/src/index.html.src 2007-11-26 13:09:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/index.html.src 2009-11-20 13:37:13.000000000 +0000 @@ -56,22 +56,22 @@ @@ -79,12 +79,12 @@ diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/Makefile erlang-13.b.3-dfsg/lib/megaco/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/megaco/doc/src/Makefile 2009-03-12 12:30:29.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/Makefile 2009-11-20 13:37:08.000000000 +0000 @@ -24,18 +24,20 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(MEGACO_VSN) +APPLICATION=megaco # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- +ifndef DOCSUPPORT include make.dep - +endif # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/megaco-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- @@ -68,6 +70,14 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ @@ -75,8 +85,8 @@ TEX_FILES_USERS_GUIDE = \ $(XML_CHAPTER_FILES:%.xml=%.tex) -TOP_PDF_FILE = megaco-$(VSN).pdf -TOP_PS_FILE = megaco-$(VSN).ps +TOP_PDF_FILE = $(APPLICATION)-$(VSN).pdf +TOP_PS_FILE = $(APPLICATION)-$(VSN).ps $(TOP_PDF_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ @@ -84,8 +94,11 @@ $(TOP_PS_FILE): book.dvi $(APP_FILE) $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ + TOP_HTML_FILES = $(INDEX_TARGET) +endif + INDEX_FILE = index.html INDEX_SRC = $(INDEX_FILE).src INDEX_TARGET = $(DOCDIR)/$(INDEX_FILE) @@ -94,7 +107,6 @@ STANDARDS = $(STANDARD_DIR)/rfc3015.txt \ $(STANDARD_DIR)/implementors_guide_v6.pdf - # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- @@ -108,6 +120,24 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ +ifdef DOCSUPPORT + +docs: pdf html man + +ldocs: local_docs $(INDEX_TARGET) + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: clean_html clean_man + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + +else + ifeq ($(DOCTYPE),pdf) docs: pdf else @@ -122,22 +152,10 @@ ps: $(TOP_PS_FILE) -gifs: $(GIF_FILES:%=$(HTMLDIR)/%) - html: gifs $(HTML_FILES) $(TOP_HTML_FILES) mhtml: html $(HTML_REF3_FILES) $(HTML_CHAPTER_FILES) -man: $(MAN3_FILES) - -$(INDEX_TARGET): $(INDEX_SRC) $(APP_FILE) - sed -e 's/%VSN%/$(VSN)/; \ - s/%ERLANG_SITE%/www\.erlang\.se\//; \ - s/%UP_ONE_LEVEL%/..\/..\/..\/doc\/index.html/; \ - s/%OFF_PRINT%/..\/..\/..\/doc\/print.html/' $< > $@ - -debug opt: - clean: clean_html clean_man clean_pdf rm -f core *~ rm -f *.aux *.cites *.citeshd *.dvi *.idx *.ilg *.ind @@ -145,25 +163,41 @@ rm -f *.otpuse *.terms *.termshd *.toc *.makeindexlog *.dvipslog rm -f *.bib *.bbl *.blg *.bibhd -clean_man: - rm -f $(MAN3_FILES) - clean_pdf: rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) rm -f $(TEX_FILES_USERS_GUIDE) rm -f $(TEX_FILES_REF_MAN) rm -f $(TEX_FILES_BOOK) +endif + +clean_man: + rm -f $(MAN3DIR)/* + clean_html: - rm -f $(HTML_FILES) - rm -f $(TOP_HTML_FILES) - rm -f $(HTML_REF3_FILES) - rm -f $(HTML_CHAPTER_FILES) - rm -f $(DEFAULT_HTML_FILES) + rm -rf $(HTMLDIR)/* + +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) + +man: $(MAN3_FILES) + +$(INDEX_TARGET): $(INDEX_SRC) $(APP_FILE) + sed -e 's/%VSN%/$(VSN)/; \ + s/%ERLANG_SITE%/www\.erlang\.se\//; \ + s/%UP_ONE_LEVEL%/..\/..\/..\/doc\/index.html/; \ + s/%OFF_PRINT%/pdf\/megaco-$(VSN).pdf/' $< > $@ + +debug opt: info: @echo "->Makefile<-" @echo "" + @echo "DOCSUPPORT = $(DOCSUPPORT)" + @echo "" + @echo "INDEX_FILE = $(INDEX_FILE)" + @echo "INDEX_SRC = $(INDEX_SRC)" + @echo "INDEX_TARGET = $(INDEX_TARGET)" + @echo "" @echo "XML_APPLICATION_FILES = $(XML_APPLICATION_FILES)" @echo "XML_PART_FILES = $(XML_PART_FILES)" @echo "XML_REF3_FILES = $(XML_REF3_FILES)" @@ -191,6 +225,22 @@ # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 + $(INSTALL_DIR) $(RELSYSDIR)/doc/standard + $(INSTALL_DATA) $(STANDARDS) $(RELSYSDIR)/doc/standard + +else + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -214,6 +264,8 @@ endif endif +endif + release_spec: $(HTMLDIR)/megaco_architecture.html: megaco_architecture.xml diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_architecture.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_architecture.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_architecture.xml 2009-03-12 12:30:48.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_architecture.xml 2009-11-20 13:37:14.000000000 +0000 @@ -46,8 +46,8 @@ for some of the protocols within H.323), or more generally multi-media session protocols. They both operate at a different level (call control) from Megaco in a decomposed network, and are therefor not aware of - wether or not Megaco is being used underneath.

    - + whether or not Megaco is being used underneath.

    + Network architecture

    Megaco and peer protocols are complementary in nature and entirely @@ -114,7 +114,7 @@

    Each connection may have its own configuration of callback modules, re-send timers, transaction id ranges etc. and they may be re-configured on-the-fly.

    -

    In the API of Megaco, a user may explicitely send action +

    In the API of Megaco, a user may explicitly send action requests, but generation of transaction identifiers, the encoding and actual transport of the message to the remote user is handled automatically by the protocol engine according to the @@ -142,7 +142,7 @@ Single node config

    Here a system configuration with an MG and MGC residing in one Erlang node each is outlined:

    - + Single node config @@ -160,11 +160,11 @@ decoded form to the originating node (1) while the other types of transactions will be handled locally on node (2).

    Timers and re-send of messages will be handled on locally on - one node, that is node(1), in order to avoid unneccessary + one node, that is node(1), in order to avoid unnecessary transfer of data between the Erlang nodes.

    - + Distributes node config @@ -174,12 +174,12 @@

    The typical round-trip of a message can be viewed as follows. Firstly we view the call flow on the originating side:

    - + Message Call Flow (originating side)

    Then we continue with the call flow on the destination side:

    - + Message Call Flow (destination side) diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_debug.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_debug.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_debug.xml 2009-06-05 13:55:46.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_debug.xml 2009-11-20 13:37:15.000000000 +0000 @@ -36,7 +36,7 @@ Tracing

    We have instrumented our code in order to enable tracing. Running the application with tracing deactivated, - causes a neglectible performance overhead (an external call to a + causes a negligible performance overhead (an external call to a function which returns an atom). Activation of tracing does not require any recompilation of the code, since we rely on Erlang/OTP's built in support for dynamic trace activation. In @@ -157,7 +157,7 @@ -s megaco_codec_meas -s init stop ]]>

    When run as above (this will take some time), the measurement - process is done as followes:

    + process is done as follows:

     \011  For each codec:
     \011      For each message:
    @@ -244,7 +244,7 @@
               performs some of the decode/encode, decode for ber and encode for per 
               (the 'driver' encoding config).

    Therefor in the tests, binary codecs are tested with four - different encoding configs to determine exacly how the + different encoding configs to determine exactly how the different options effect the performance: with transformation and without driver ([]), without transformation and without driver ([native]), with transformation and with driver ([driver]) and diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_encoder.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_encoder.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_encoder.xml 2009-03-12 12:31:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_encoder.xml 2009-11-20 13:37:27.000000000 +0000 @@ -117,8 +117,8 @@

    The purpose of this function is to do a minimal decode of Megaco message. A successfull result is a in which only version and mid has been initiated. This function - is used by the megaco_messeger module when the - function failes to figure out the mid + is used by the megaco_messenger module when the + function fails to figure out the mid (the actual sender) of the message.

    Note again that a successfull decode only returns a partially initiated message.

    @@ -145,7 +145,7 @@ is not supported, the function should return the error reason not_implemented.

    -

    This functionallity is used both when the transaction sender is +

    This functionality is used both when the transaction sender is used and for segmentation. So, for either of those to work, this function must be fully supported!

    diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_encode.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_encode.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_encode.xml 2009-06-05 13:55:46.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_encode.xml 2009-11-20 13:37:15.000000000 +0000 @@ -438,7 +438,7 @@ Either using dynamic version detection (only valid for for incoming messages) or by explicit version setting in the connection info.

    -

    For incomming messages:

    +

    For incoming messages:

    Dynamic version detection

    diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_flex_scanner.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_flex_scanner.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_flex_scanner.xml 2009-06-05 13:55:47.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_flex_scanner.xml 2009-11-20 13:37:15.000000000 +0000 @@ -86,7 +86,7 @@ scanner, several ports will be created (one for each scheduler).

    Note that the process that calls this function must - be permament. If it dies, the port(s) will exit and the driver unload.

    + be permanent. If it dies, the port(s) will exit and the driver unload.

    diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_intro.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_intro.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_intro.xml 2009-03-12 12:30:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_intro.xml 2009-11-20 13:37:14.000000000 +0000 @@ -79,7 +79,7 @@
    Scope and Purpose -

    This manual describes the Megaco appliacation, as a component +

    This manual describes the Megaco application, as a component of the Erlang/Open Telecom Platform development environment. It is assumed that the reader is familiar with the Erlang Development Environment, which is described in a separate User's @@ -147,16 +147,16 @@

    version 2, draft-ietf-megaco-h248v2-04

    -

    TD-33 (Draft H.248.1 version 3)

    +

    TD-33 (Draft H.248.1 version 3)

    -

    H.248.1 version 3

    +

    H.248.1 version 3

    -

    the ASN.1 User's Guide

    +

    the ASN.1 application User's Guide

    -

    the Reference Manual

    +

    the Megaco application Reference Manual

    Concurrent Programming in Erlang, 2nd Edition (1996), diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_mib.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_mib.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_mib.xml 2009-03-12 12:31:09.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_mib.xml 2009-11-20 13:37:22.000000000 +0000 @@ -48,7 +48,7 @@ Statistics counters

    The implementation of the statistic counters is lightweight. I.e. the statistic counters are handled - separatelly by different entities of the application. For + separately by different entities of the application. For instance our two transport module(s) (see megaco_tcp and megaco_udp) maintain their own counters and the application engine (see megaco) maintain it's own counters.

    @@ -59,7 +59,7 @@
    Distribution

    Each megaco application maintains it's own set of counters. So - in a large (distributed) MG/MGC it could be neccessary to + in a large (distributed) MG/MGC it could be necessary to collect the statistics from several nodes (each) running the megaco application (only one of them with the transport).

    diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_performance.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_performance.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_performance.xml 2009-06-05 13:55:47.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_performance.xml 2009-11-20 13:37:16.000000000 +0000 @@ -29,7 +29,7 @@ 2007-06-15 %VSN% - megaco_performance.sgml + megaco_performance.xml
    @@ -190,18 +190,18 @@
    - System performance caracteristics -

    This is primarilly a way to show the effects of using the + System performance characteristics +

    This is primarily a way to show the effects of using the reentrant flex scanner instead of the non-reentrant.

    As can be seen from the figures above there is no real difference between a non-reentrant and an reentrant flex scanner when it comes to the decode times of an individual message.

    -

    The real difference is instead in system caracteristics, which +

    The real difference is instead in system characteristics, which is best shown with the mstone1 test.

    When running SMP erlang on a multi-core machine the "throughput" is significantly higher. The mstone1 test is an extreme test, but it shows what is gained by using the reentrant flex-scanner.

    - + MStone1 with mstone1.sh -d flex -s 8
    diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_run.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_run.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_run.xml 2009-06-05 13:55:46.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_run.xml 2009-11-20 13:37:15.000000000 +0000 @@ -143,7 +143,7 @@ sets up the connection and invokes UserMod:handle_connect/2 before it invokes UserMod:handle_trans_request/3 with the Service Change Request like this:

    - + MGC Startup Call Flow
    @@ -176,13 +176,13 @@

    If the MG has been provisioned with the MID of the MGC it can be given as the RemoteMid parameter to megaco:connect/4 and the call flow will look like this:

    - + MG Startup Call Flow

    If the MG cannot be provisioned with the MID of the MGC, the MG can use the atom 'preliminary_mid' as the RemoteMid parameter to megaco:connect/4 and the call flow will look like this:

    - + MG Startup Call Flow (no MID) @@ -240,7 +240,7 @@

    will result in the start of the flex scanner with the specified options. Opts is two-tuple list where the only allowed option is - {smp, boolean()}, with default value beeing false and the value of + {smp, boolean()}, with default value being false and the value of true resulting in a start of an smp-optimized scanner.

    --> diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_tcp.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_tcp.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_tcp.xml 2009-03-12 12:30:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_tcp.xml 2009-11-20 13:37:09.000000000 +0000 @@ -125,7 +125,7 @@ Handle = socket_handle() -

    Stop receiving incomming messages on the socket.

    +

    Stop receiving incoming messages on the socket.

    @@ -135,7 +135,7 @@ Handle = socket_handle() -

    Starting to receive incomming messages from the socket again.

    +

    Starting to receive incoming messages from the socket again.

    diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_transport.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_transport.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_transport.xml 2009-03-12 12:31:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_transport.xml 2009-11-20 13:37:27.000000000 +0000 @@ -32,7 +32,7 @@ megaco_transport.xml megaco_transport - Megaco transport begaviour. + Megaco transport behaviour.

    The following functions should be exported from a callback module:

    @@ -75,7 +75,7 @@

    In the case of requests, megaco will cancel the message in much the same way as if had been called (after a successfull send). The information will be propagated - back to the user differently dependning on how the request(s) where + back to the user differently depending on how the request(s) where issued: For requests issued using megaco:call, the info will be delivered in the return value. For requests issued @@ -110,7 +110,7 @@

    Re-send a megaco message.

    Note that this function will only be called if the user has set the resend_indication - config option to and it is infact a message + config option to and it is in fact a message resend. If not both of these condition's are meet, will be called.

    If the function returns , this means the @@ -122,7 +122,7 @@

    In the case of requests, megaco will cancel the message in much the same way as if had been called (after a successfull send). The information will be propagated - back to the user differently dependning on how the request(s) where + back to the user differently depending on how the request(s) where issued: For requests issued using megaco:call, the info will be delivered in the return value. For requests issued diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_udp.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_udp.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_udp.xml 2009-03-12 12:30:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_udp.xml 2009-11-20 13:37:09.000000000 +0000 @@ -120,7 +120,7 @@ megaco_udp:create_send_handle/3. Increments the NumOutMessages and NumOutOctets counters if message successfully sent. In case of a failure to send, the NumErrors counter is not - inremented. This is done elsewhere in the megaco app.

    + incremented. This is done elsewhere in the megaco app.

    diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_user.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_user.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco_user.xml 2009-03-12 12:30:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco_user.xml 2009-11-20 13:37:14.000000000 +0000 @@ -135,7 +135,7 @@

    Is the actual protocol version. In most cases the protocol - version is retreived from the processed message, but there + version is retrieved from the processed message, but there are exceptions:

    @@ -175,7 +175,7 @@

    Invoked when a new connection is established

    Connections may either be established by an explicit call to - megaco:connect/4 or implicitely at the first invokaction of + megaco:connect/4 or implicitly at the first invocation of megaco:receive_message/3.

    Normally a Media Gateway (MG) connects explicitly while a Media Gateway Controller (MGC) connects implicitly.

    @@ -210,8 +210,8 @@

    Invoked when a connection is teared down

    -

    The disconnect may either be made explicitely by a call to - megaco:disconnect/2 or implicitely when the control process +

    The disconnect may either be made explicitly by a call to + megaco:disconnect/2 or implicitly when the control process of the connection dies.

    @@ -386,7 +386,7 @@

    This has the same effect as the above, - if and only if megaco has sent atleast one + if and only if megaco has sent at least one pending message for this request (during the processing of the request). If no pending message has been sent, then immediate acknowledgement will not be @@ -439,7 +439,7 @@

    Optionally invoked for a time consuming transaction request

    If this function gets invoked or not is controlled by the - reply from the preceeding call to handle_trans_request/3. + reply from the preceding call to handle_trans_request/3. The handle_trans_request/3 function may decide to process the action requests itself or to delegate the processing to this function.

    @@ -517,7 +517,7 @@ the segment number, the and finally a list of 'ActionReply' records possibly containing error - indications. This is ofcourse only possible if the + indications. This is of course only possible if the reply was segmented.

    @@ -531,7 +531,7 @@

    A , indicates that the remote user has replied with an explicit transactionError for this - segment. This is ofcourse only possible if the reply was + segment. This is of course only possible if the reply was segmented.

    @@ -555,7 +555,7 @@ function.

    -

    - an error occured while attempting to +

    - an error occurred while attempting to send the message.

    @@ -613,7 +613,7 @@

    Optionally invoked for a transaction acknowledgement

    If this function gets invoked or not, is controlled by the - reply from the preceeding call to handle_trans_request/3. + reply from the preceding call to handle_trans_request/3. The handle_trans_request/3 function may decide to return {handle_ack, ack_data()} or {handle_sloppy_ack, ack_data()} meaning that you need an immediate acknowledgement of the @@ -635,7 +635,7 @@ reply send failure -

    When megaco failes to send the reply (see +

    When megaco fails to send the reply (see handle_trans_reply), for whatever reason.

    diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/megaco.xml 2009-03-12 12:30:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/megaco.xml 2009-11-20 13:37:13.000000000 +0000 @@ -43,6 +43,7 @@ action_request() = #'ActionRequest'{} action_reply() = #'ActionReply'{} error_desc() = #'ErrorDescriptor'{} +transaction_reply() = #'TransactionReply'{} segment_no() = integer() resend_indication() = flag | boolean() @@ -56,7 +57,7 @@ sdp_a() | sdp_a_rtpmap() | sdp_a_ptime() | sdp_t() | sdp_r() | sdp_m() sdp_v() = #megaco_sdp_v{} (Protocol version) -sdp_o() = #megaco_sdp_o{} (Owner/creator and session indentifier) +sdp_o() = #megaco_sdp_o{} (Owner/creator and session identifier) sdp_s() = #megaco_sdp_s{} (Session name) sdp_i() = #megaco_sdp_i{} (Session information) sdp_u() = #megaco_sdp_u{} (URI of description) @@ -216,6 +217,7 @@

    Construct a megaco_receive_handle record from user config

    +
    @@ -224,6 +226,7 @@

    Current transaction id.

    A positive integer or the atom (in case no messages has been sent).

    + @@ -231,6 +234,7 @@

    First trans id.

    A positive integer, defaults to 1.

    +
    @@ -239,6 +243,7 @@

    Last trans id.

    A positive integer or , defaults to .

    + @@ -260,6 +265,7 @@ was used).

    A Megaco Timer (see explanation above), defaults to .

    + @@ -270,11 +276,12 @@ is restarted.

    When a pending message is received, and the - is not "on it's final leg", the timer will be + is not "on its final leg", the timer will be restarted, and, if , the request will be re-sent.

    A Megaco Timer (see explanation above), defaults to .

    + @@ -287,12 +294,13 @@ the request is not resent (since a pending message is an indication that the request has been received). But since the reply (to the - request) can be lost, this behaviour has it's values.

    -

    It is ofcourse pointless to set this value to true + request) can be lost, this behaviour has its values.

    +

    It is of course pointless to set this value to true unless the (see above) is also set to an incremental timer ().

    A , defaults to .

    + @@ -311,6 +319,51 @@ (this is valid until the ack is received or the timer expires).

    A Megaco Timer (see explanation above), defaults to 30000.

    + + + + + + +

    Specifies the timeout time for the request-keep-alive timer.

    +

    This timer is started when the first reply to an asynchroneous + request (issued using the + megaco:cast/3 function) + arrives. As long as this timer is running, replies will + be delivered via the + handle_trans_reply/4,5 + callback function, with their "arrival number" + (see of the + handle_trans_reply/4,5 + callback function).

    +

    Replies arriving after the timer has expired, will be + delivered using the + handle_unexpected_trans/3,4 + callback function.

    +

    The timeout time can have the values: + = 0]]>.

    +

    Defaults to .

    + + +
    + + + +

    Timeout time for the call proxy.

    +

    When a request is sent using the + call/3 function, + a proxy process is started to handle + all replies. When the reply has been received and delivered + to the user, the proxy process continue to exist for as long + as this option specifies. Any received messages, is passed on + to the user via the + handle_unexpected_trans + callback function.

    +

    The timeout time is in milliseconds. A value of 0 (zero) means + that the proxy process will exit directly after the reply has + been delivered.

    +

    An integer >= 0, defaults to 5000 (= 5 seconds).

    +
    @@ -320,6 +373,7 @@ reply has been received (see below).

    This is used for three-way-handshake.

    A , defaults to .

    + @@ -328,7 +382,7 @@

    Shall ack's be accumulated or not.

    This property is only valid if is true.

    If is true, then if is - , ack's will be sent immediatelly. + , ack's will be sent immediately. If is , then ack's will instead be sent to the transaction sender process for accumulation and later sending @@ -337,6 +391,7 @@ ).

    See also transaction sender for more info.

    An , defaults to .

    + @@ -347,6 +402,7 @@ configured to accumulate ack's).

    See also transaction sender for more info.

    An , defaults to 10.

    + @@ -354,7 +410,7 @@

    Shall requests be accumulated or not.

    If is , then request(s) - will be sent immediatelly (in it's own message).

    + will be sent immediately (in its own message).

    If is true, then request(s) will instead be sent to the transaction sender process for accumulation and later sending @@ -363,6 +419,7 @@ ).

    See also transaction sender for more info.

    An , defaults to .

    +
    @@ -382,6 +439,7 @@ (if started and configured to accumulate requests).

    See also transaction sender for more info.

    An , defaults to 2048.

    + @@ -399,6 +457,7 @@ for later sending.

    See also transaction sender for more info.

    An , defaults to 0.

    + @@ -408,6 +467,7 @@ transaction reply has been sent. This timer is also called provisional response timer.

    A Megaco Timer (see explanation above), defaults to 30000.

    + @@ -423,10 +483,11 @@

    Note that this has no effect on the actual sending of pending transactions. This is either implicit (e.g. when receiving a re-sent transaction request for a request which - is beeing processed) or controlled by the pending_timer, + is being processed) or controlled by the pending_timer, see above.

    A positive integer or , defaults to .

    + @@ -441,6 +502,7 @@ function handle_trans_reply).

    A positive integer or , defaults to .

    + @@ -451,6 +513,7 @@ invoked when the bytes needs to be transmitted to the remote user.

    An , defaults to .

    + @@ -465,6 +528,7 @@ Binary) is invoked whenever an Erlang binary needs to be translated into a 'MegacoMessage' record.

    An , defaults to .

    + @@ -472,6 +536,7 @@

    Encoding module config.

    A , defaults to .

    +
    @@ -479,6 +544,7 @@

    Actual protocol version.

    An , default is 1.

    +
    @@ -487,6 +553,7 @@

    Strict version control, i.e. when a message is received, verify that the version is that which was negotiated.

    An , default is true.

    + @@ -494,6 +561,7 @@

    Default reply data.

    Any term, defaults to the atom .

    +
    @@ -501,6 +569,7 @@

    Name of the user callback module. See the the reference manual for megaco_user for more info.

    +
    @@ -509,6 +578,7 @@

    List of extra arguments to the user callback functions. See the the reference manual for megaco_user for more info.

    + @@ -516,10 +586,11 @@

    If a received message contains several transaction requests, this option indicates whether the requests should be handled - sequencially in the same process (), or if each - request should be handled by it's own process ( + sequentially in the same process (), or if each + request should be handled by its own process ( i.e. a separate process is spawned for each request).

    An , defaults to .

    +
    @@ -541,6 +612,7 @@ shall be used.

    A resend_indication(), defaults to .

    + @@ -553,6 +625,7 @@ callback function for more information.

    A , defaults to .

    + @@ -569,6 +642,7 @@ call function.

    A Megaco Timer (see explanation above), defaults to .

    + @@ -581,7 +655,7 @@

    Do not segment outgoing reply messages. This is usefull when either it is known that messages are never to large or that the transport protocol can handle such things - on it's own (e.g. TCP or SCTP).

    + on its own (e.g. TCP or SCTP).

    0]]> @@ -599,6 +673,7 @@

    Defaults to .

    + @@ -653,7 +728,7 @@

    The process identifier of the controlling process for a - connenction.

    + connection.

    @@ -740,12 +815,36 @@ restarted.

    When a pending message is received, and the - is not "on it's final leg", the timer will be + is not "on its final leg", the timer will be restarted, and, if , the request will be re-sent.

    A Megaco Timer (see explanation above), defaults to .

    + + + + + +

    Specifies the timeout time for the request-keep-alive timer.

    +

    This timer is started when the first reply to an asynchroneous + request (issued using the + megaco:cast/3 function) + arrives. As long as this timer is running, replies will + be delivered via the + handle_trans_reply/4,5 + callback function, with their "arrival number" + (see of the + handle_trans_reply/4,5 + callback function).

    +

    Replies arriving after the timer has expired, will be + delivered using the + handle_unexpected_trans/3,4 + callback function.

    +

    The timeout time can have the values: + = 0]]>.

    +

    Defaults to .

    +
    @@ -759,8 +858,8 @@ (since a pending message is an indication that the request has been received). But since the reply (to the request) can be - lost, this behaviour has it's values.

    -

    It is ofcourse pointless to set this value to true + lost, this behaviour has its values.

    +

    It is of course pointless to set this value to true unless the (see above) is also set to an incremental timer ().

    A , @@ -785,6 +884,25 @@ the timer expires).

    A Megaco Timer (see explanation above), defaults to 30000.

    + + + + + +

    Timeout time for the call proxy.

    +

    When a request is sent using the + call/3 function, + a proxy process is started to handle + all replies. When the reply has been received and delivered + to the user, the proxy process continue to exist for as long + as this option specifies. Any received messages, is passed on + to the user via the + handle_unexpected_trans + callback function.

    +

    The timeout time is in milliseconds. A value of 0 (zero) means + that the proxy process will exit directly after the reply has + been delivered.

    +

    An integer >= 0, defaults to 5000 (= 5 seconds).

    @@ -803,7 +921,7 @@

    Shall ack's be accumulated or not.

    This property is only valid if is true.

    If is true, then if is - , ack's will be sent immediatelly. + , ack's will be sent immediately. If is , then ack's will instead be sent to the transaction sender process for accumulation and later sending @@ -831,7 +949,7 @@

    Shall requests be accumulated or not.

    If is , then request(s) - will be sent immediatelly (in it's own message).

    + will be sent immediately (in its own message).

    If is true, then request(s) will instead be sent to the transaction sender process for accumulation and later sending @@ -905,7 +1023,7 @@

    Note that this has no effect on the actual sending of pending transactions. This is either implicit (e.g. when receiving a re-sent transaction request for a request which - is beeing processed) or controlled by the pending_timer, + is being processed) or controlled by the pending_timer, see above.

    A positive integer or , defaults to .

    @@ -988,8 +1106,8 @@

    If a received message contains several transaction requests, this option indicates whether the requests should be handled - sequencially in the same process (), or if each - request should be handled by it's own process ( + sequentially in the same process (), or if each + request should be handled by its own process ( i.e. a separate process is spawned for each request).

    An , defaults to .

    @@ -1057,7 +1175,7 @@

    Do not segment outgoing reply messages. This is usefull when either it is known that messages are never to large or that the transport protocol can handle such things - on it's own (e.g. TCP or SCTP).

    + on its own (e.g. TCP or SCTP).

    0]]> @@ -1219,8 +1337,8 @@ encoded on the originating Erlang node, and then be forwarded to the node with the physical connection. When the reply arrives, it will be forwarded back to the originator. - The distributed connection may explicitely be deactivated by - a local call to megaco:disconnect/2 or implicitely when + The distributed connection may explicitly be deactivated by + a local call to megaco:disconnect/2 or implicitly when the physical connection is deactivated (with megaco:disconnect/2, killing the controlling process, halting the other node, ...).

    The call of this function will trigger the callback @@ -1231,12 +1349,12 @@ -

    The MG may explicitely invoke megaco:connect/4 and use +

    The MG may explicitly invoke megaco:connect/4 and use a provisioned MID of the MGC as the RemoteMid.

    -

    The MG may explicitely invoke megaco:connect/4 with the +

    The MG may explicitly invoke megaco:connect/4 with the atom 'preliminary_mid' as a temporary MID of the MGC, send an intial message, the Service Change Request, to the MGC and then wait for an initial message, the @@ -1332,7 +1450,7 @@ Actions = action_reqs() | [action_reqs()] action_reqs() = binary() | [action_request()] Options = [send_option()] - send_option() = {request_timer, megaco_timer()} | {long_request_timer, megaco_timer()} | {send_handle, term()} | {protocol_version, integer()} + send_option() = {request_timer, megaco_timer()} | {long_request_timer, megaco_timer()} | {send_handle, term()} | {protocol_version, integer()} | {call_proxy_gc_timeout, call_proxy_gc_timeout()} ProtocolVersion = integer() UserReply = user_reply() | [user_reply()] user_reply() = success() | failure() @@ -1356,8 +1474,12 @@ reason_for_send_cancel() = term() send_failed_reason() = {send_message_failed, reason_for_send_failure()} reason_for_send_failure() = term() - other_reason() = term() + other_reason() = {wrong_mid, WrongMid, RightMid, TR} | term() + WrongMid = mid() + RightMid = mid() + TR = transaction_reply() action_reps() = [action_reply()] + call_proxy_gc_timeout() = integer() >= 0 extra() = term() @@ -1400,7 +1522,7 @@

    An , indicates some other error such as timeout.

    -

    For more info abount the extra() part of the +

    For more info about the extra() part of the result, see the note in the user callback module documentation.

    @@ -1419,7 +1541,8 @@ Actions = action_reqs() | [action_reqs()] action_reqs() = binary() | [action_request()] Options = [send_option()] - send_option() = {request_timer, megaco_timer()} | {long_request_timer, megaco_timer()} | {send_handle, term()} | {reply_data, reply_data()} | {protocol_version, integer()} + send_option() = {request_keep_alive_timeout, request_keep_alive_timeout()} | {request_timer, megaco_timer()} | {long_request_timer, megaco_timer()} | {send_handle, term()} | {reply_data, reply_data()} | {protocol_version, integer()} + request_keep_alive_timeout() = plain | integer() >= 0 Reason = term() @@ -1861,7 +1984,7 @@ Reason = term() -

    Utility functions used to retreive some system and +

    Utility functions used to retrieve some system and application info.

    The difference between the two functions is in how they get the modules to check. uses the diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/notes_history.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/notes_history.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/notes_history.xml 2009-03-12 12:32:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/notes_history.xml 2009-11-20 13:37:41.000000000 +0000 @@ -32,6 +32,749 @@ notes_history.xml +

    + Megaco 3.8.2 + +

    Version 3.8.2 supports code replacement in runtime from/to + version 3.8.1 and 3.8 except + when using any of the drivers (flex for text or asn1 for binary).

    + +
    + Improvements and new features +

    -

    + + + +
    + +
    + Fixed bugs and malfunctions + + + + +

    [text] Messages with property parm values "containing" keywords + confused the parser when using the flex scanner.

    +

    Own Id: OTP-7534

    +

    Aux Id: Seq 11039

    +
    + +
    + +
    + +
    + Incompatibilities +

    -

    + + + +
    +
    + + +
    + Megaco 3.8.1 + +

    Version 3.8.1 supports code replacement in runtime from/to + version 3.8 except + when using any of the drivers (flex for text or asn1 for binary).

    + +
    + Improvements and new features + + + + +

    Some minor documentation cleanup of the + transaction sender + chapter of the User's Guide.

    +

    Own Id: OTP-7417

    +

    Aux Id: Seq 10989

    +
    + +
    + +
    + +
    + Fixed bugs and malfunctions + + + + +

    The event parameter value for completion event ce + of the dd package was incorrectly encoded as type + Value instead of as a quoted string.

    +

    Own Id: OTP-7444

    +
    + + +

    DigitMap ([0-9ef]) incorrectly interpreted as ([0-9]ef).

    +

    Own Id: OTP-7449

    +
    + + +

    Receiving an unexpected segment reply could case + an case clause crash. Now a warning message will + be issued instead.

    +

    Own Id: OTP-7455

    +
    + + +

    The flex scanner had problems parsing wildcarded + service-change request, ammRequest (with add) and + notifyRequest.

    +

    Own Id: OTP-7457

    +

    Aux Id: Seq 11014

    +
    + + +

    Processing requests when "autoconnecting" + caused function cause after reboot.

    +

    Own Id: OTP-7459

    +

    Aux Id: Seq 11017

    +
    + +
    + +
    + +
    + Incompatibilities +

    -

    + + + +
    +
    + + +
    + Megaco 3.8 + +

    Version 3.8 supports code replacement in runtime from/to + version 3.7.5, 3.7.4 and 3.7.3 except + when using any of the drivers (flex for text or asn1 for binary).

    + +
    + Improvements and new features + + + + +

    Miscellaneous text codec(s) improvements. Both + regarding code size and decode performance.

    +

    See the + performance + chapter of the Users Guide for details.

    +

    Own Id: OTP-7228

    +
    + + +

    Added the value flag to the resend_indication config + option. See + resend_indication for more info.

    +

    Own Id: OTP-7259

    +

    Aux Id: Seq 10901

    +
    + +
    +
    + +
    + Fixed bugs and malfunctions + + + + +

    If a TransactionRequest arrives while a user is + connecting (is in the callback function + handle_connect as a result of a megaco:connect call), + megaco responds with a pending message and then drops + the request.

    +

    These messages will now be silently dropped, forcing the + other side to resend.

    +

    Own Id: OTP-7192

    +

    Aux Id: Seq 10884

    +
    + +
    + +
    + +
    + Incompatibilities +

    -

    + + + +
    +
    + + +
    + Megaco 3.7.5 + +

    Version 3.7.5 supports code replacement in runtime from/to + version 3.7.4, 3.7.3, 3.7.2, 3.7.1 and 3.7 except + when using any of the drivers (flex for text or asn1 for binary).

    + +
    + Improvements and new features + + + + +

    Documentation of function + megaco:conn_info/2 + has been updated to include known exit reasons.

    +

    Own Id: OTP-7286

    +

    Aux Id: Seq 10933

    +
    + +
    +
    + +
    + Fixed bugs and malfunctions + + + + +

    The transaction id counter could be incorrectly + updated at wrap-around. The risk was expecially high + at high load.

    +

    Own Id: OTP-7303

    +

    Aux Id: Seq 10939

    +
    + +
    + +
    + +
    + Incompatibilities +

    -

    + + + +
    +
    + + +
    + Megaco 3.7.4 + +

    Version 3.7.4 supports code replacement in runtime from/to + version 3.7.3, 3.7.2, 3.7.1 and 3.7 except + when using any of the drivers (flex for text or asn1 for binary).

    + +
    + Improvements and new features + + + + +

    In order to better deal with codec's not implementing + the entire + megaco_encoder + behaviour, translations of undefined (not implemented) functions + to the {error, not_implemented} return value has been + added for the functions + encode_transaction/3, + encode_action_requests/3 and + encode_action_reply/3.

    +

    Own Id: OTP-7251

    +

    Aux Id: Seq 10879

    +
    + +
    +
    + +
    + Fixed bugs and malfunctions + + + + +

    The (plain) text scanner could incorrectly identify + character strings (any 17 char long string with the + char t in the middle) as a TimeStampToken.

    +

    Own Id: OTP-7249

    +

    Aux Id: Seq 10917

    +
    + +
    + +
    + +
    + Incompatibilities +

    -

    + + + +
    +
    + + +
    + Megaco 3.7.3 + +

    Version 3.7.3 supports code replacement in runtime from/to + version 3.7.2, 3.7.1 and 3.7 except + when using any of the drivers (flex for text or asn1 for binary).

    + +
    + Improvements and new features + + + + +

    Updated the graphs of the performace chapter with + to reflect this version of megaco. Also included + results with HiPE-compiled codec's..

    +

    Own Id: OTP-7180

    +
    + +
    +
    + +
    + Fixed bugs and malfunctions + + + + +

    The behaviour megaco_encoder was lacking three functions + which was made mandatory as of version 3.7.

    +

    See + encode_transaction/3, + encode_action_requests/3 and + encode_action_reply/3 + for more info

    +

    Own Id: OTP-7168

    +

    Aux Id: Seq 10867

    +
    + + +

    It was possible to create permenant pending counter + data for a somewhat misbehaving (request) receiver. + If a megaco entity ("sender") sends a request and the + "receiver" (of the request) responds with a pending + message but never actually sends the reply (or if + it is lost), the created pending counter data would + never be deleted if the + long_request_timer + was set to infinity (old default) and the + recv_pending_limit + was set to an integer value (default is infinity).

    +

    Own Id: OTP-7189

    +

    Aux Id: Seq 10879

    +
    + + +

    If a counter whas reset (wrap-around) as a result of + increment larger than 1, then it was actually always + set to the min_trans_id-value.

    +

    Own Id: OTP-7216

    +
    + +
    + +
    + +
    + Incompatibilities + + + + +

    For those implementing their own codec's, the new megaco_encoder + behaviour will require three more functions. See above for more + info.

    +

    Own Id: OTP-7168

    +

    Aux Id: Seq 10867

    +
    + + +

    The default value of the + long_request_timer + has been changed from infinity to 60 seconds.

    +

    Own Id: OTP-7189

    +

    Aux Id: Seq 10879

    +
    +
    + +
    +
    + + +
    + Megaco 3.7.2 + +

    Version 3.7.2 supports code replacement in runtime from/to + version 3.7.1 and 3.7 except + when using any of the drivers (flex for text or asn1 for binary).

    + +
    + Improvements and new features +

    -

    + + +
    + +
    + Fixed bugs and malfunctions + + + + +

    There is a race condition when cancelling requests + during a high load situations which could lead to + spurious (megaco internal) messages beeing sent to + user processes. When a request is issued using + megaco:call, + which returns only after a "reply" can + be delivered, the request timer might expire + during the cancelling of the request, which will cause + megaco to attempt to deliver the timeout info, which + will result in the spurious message. + This problem has now been eliminated by introducing + a proxy process, which simply dies when the "real" + response has been delivered. The spurious reply will + then be sent to a non-existing process.

    +

    Own Id: OTP-6972

    +

    Aux Id: Seq 10450

    +
    + + +

    [text] Decoding a version 2 message with an observedEventParameter + where the value of the parmValue was CT, failes. + CT is defined as the context attribute token in version 3, + and this incorrectly caused the scanner (which is version + agnostic) to create an ContextAttrToken, which caused the + version 2 parser to crash.

    +

    Own Id: OTP-7138

    +

    Aux Id: Seq 10854

    +
    +
    + +
    + +
    + Incompatibilities +

    -

    + + + +
    +
    + + +
    + Megaco 3.7.1 + +

    Version 3.7.1 supports code replacement in runtime from/to + version 3.7 except + when using any of the drivers (flex for text or asn1 for binary).

    + +
    + Improvements and new features + + + + +

    Reporting of error(s) detected during loading of the + flex driver has been improved, by calling the + erlang:format_error function.

    +

    Own Id: OTP-7005

    +
    + + +

    Updated documentation for function megaco:connect/4.

    +

    Own Id: OTP-7000

    +

    Aux Id: Seq 10815

    +
    + + +

    Use of depricated function erlang:fault replaced with + erlang:error.

    +

    Own Id: OTP-6919

    +
    + +
    +
    + +
    + Fixed bugs and malfunctions + + + + +

    Corrected usage of function file:open/2 (the Modes + argument is a list).

    +

    Dialyzer

    +

    Own Id: OTP-7124

    + +
    + + +

    Fixed a reply timer race condition problem resulting + in (case clause) error message.

    +

    Own Id: OTP-6999

    +

    Aux Id: Seq 10815

    +
    + + +

    Failure to parse SDP attribute FMTP rows.

    +

    Own Id: OTP-6992

    +

    Aux Id: Seq 10813

    +
    + + +

    When the megaco application receives two instances of + the same transaction requests (re-send) within too + small a time, there is a small possibility that both + are passed on to the user via a call to the callback + function (handle_trans_request).

    +

    Own Id: OTP-6971

    +

    Aux Id: Seq 10802

    +
    +
    + +
    + +
    + Incompatibilities +

    -

    + + + +
    +
    + + +
    + Megaco 3.7 + + +
    + Improvements and new features + + +

    Added support for the full v3-standard + (including segmentation).

    +

    See + segmentation of transaction replies + and + handling megaco versions + for more info.

    +

    Note that segmentation is currently not supported by the + binary codec(s).

    +

    Own Id: OTP-5979

    +
    + + +

    The megaco documentation source has been converted + from SGML to XML.

    +

    Own Id: OTP-6753

    +
    + + +

    SDP support updated according to RFC 4566.

    +

    Own Id: OTP-6804

    +

    Aux Id: Seq 10710

    +
    + + +

    Added a way for the transport module to transfer + extra information to the user callback functions + callback functions + upon receipt of a message. This is done by adding an extra + argument when calling the (new) message delivery function(s) + process_received_message/5 + or + receive_message/5.

    +

    Similarly, the UserReply part of the return value for the + call function can + now also include such extra information.

    +

    Own Id: OTP-6865

    +

    Aux Id: Seq 10559

    +
    + + + + +

    Improve the utility functions for information retrieval: + megaco:info, + megaco:system_info, + megaco:conn_info and + megaco:user_info.

    +

    Own Id: OTP-6976

    +

    Aux Id: Seq 10804

    +
    + +
    +
    + +
    + Fixed bugs and malfunctions +

    -

    +
    + +
    + Incompatibilities + + + +

    Implementing (SDP-) support for RFC 4566 also means that some of + the existing sdp-record definitions have been changed.

    +

    Own Id: OTP-6804

    +

    Aux Id: Seq 10710

    +
    +
    +
    +
    + +
    Megaco 3.6.3

    Version 3.6.3 supports code replacement in runtime from/to @@ -78,7 +821,7 @@

    There is a race condition when cancelling requests during a high load situations which could lead to - spurious (megaco internal) messages beeing sent to + spurious (megaco internal) messages being sent to user processes. When a request is issued using megaco:call, which returns only after a "reply" can @@ -159,7 +902,7 @@

    When timers expire while a connection cancel (megaco:cancel) is in progress, there is a raise - condition possibillity. This has been eliminated.

    + condition possibility. This has been eliminated.

    Own Id: OTP-6921

    Aux Id: Seq 10450

    @@ -204,7 +947,7 @@ Fixed bugs and malfunctions -

    An empty time-zone adjustement was incorrectly allowed +

    An empty time-zone adjustment was incorrectly allowed when decoding SDP using decode_sdp.

    Also the parsing of attributes was to restrictive.

    @@ -279,7 +1022,7 @@

    Aux Id: Seq 10393

    -

    Add abillity to decrement the timeout time for +

    Add ability to decrement the timeout time for incremental timers, see reference manual for more info.

    @@ -423,7 +1166,7 @@

    When replies arrive during a call to megaco:cancel - there is a raise condition possibillity. This has been + there is a raise condition possibility. This has been eliminated.

    Own Id: OTP-6276

    Aux Id: Seq 10450

    @@ -675,7 +1418,7 @@

    Own Id: OTP-6055

    -

    Add possibillity to override send options when sending +

    Add possibility to override send options when sending reply messages. This is done by adding another return alternative to the handle_trans_request @@ -711,8 +1454,8 @@

    Aux Id: Seq 10284

    -

    Added the possibillity to conditionally request - immediate acknowledgement of a reply (when atleast one +

    Added the possibility to conditionally request + immediate acknowledgement of a reply (when at least one pending message has been sent).

    This is done by adding another return value for the handle_trans_request @@ -743,8 +1486,8 @@

    Removed unnecessary error report. In a special case two (error_logger) error reports could be sent: When receiving a transaction request for which an - reply, with immediade-ack-requested, has already been - send, the reply is resent. But if the sending failes, + reply, with immediate-ack-requested, has already been + send, the reply is resent. But if the sending fails, two (error_logger) error reports is sent. This has been corrected (so that only one is sent).

    Own Id: OTP-6090

    @@ -980,7 +1723,7 @@ Improvements and new features -

    Improve error mesage format on (reply) decode error.

    +

    Improve error message format on (reply) decode error.

    Own Id: OTP-5918

    Aux Id: Seq 10199

    @@ -1027,7 +1770,7 @@

    Aligned the user_info and conn_info functions - regarding trans_id retreival.

    + regarding trans_id retrieval.

    Own Id: OTP-5887

    Aux Id: Seq 10184

    @@ -1092,7 +1835,7 @@

    Own Id: OTP-5885

    -

    Timer recalculation failes when receiving pending +

    Timer recalculation fails when receiving pending message if the timer is of the type and the field has the value .

    @@ -1106,7 +1849,7 @@ Incompatibilities -

    list of now atleast +

    list of now at least has to be of length 1.

    Own Id: OTP-5882

    @@ -1249,7 +1992,7 @@

    The ok return value from test_digit_event and eval_digit_map - has been changed to accomodate for this problem.

    + has been changed to accommodate for this problem.

    Own Id: OTP-5799

    Aux Id: Seq 10085

    @@ -1604,7 +2347,7 @@ and cancel functions where called, those records would never be removed. This means that if eventually a transaction was received which had the same - transaction-id as the aborted reply, this whould + transaction-id as the aborted reply, this would just be ignored!

    Own Id: OTP-5310

    Aux Id: Seq 9668

    @@ -1728,7 +2471,7 @@ connection is terminated between the calls gen_tcp:accept/1 and gen_tcp:controlling_process/2 we did not clean up the message queue. - Also, if controlling_process failes, a cleanup must + Also, if controlling_process fails, a cleanup must be done.

    Own Id: OTP-5130

    @@ -1876,7 +2619,7 @@ Improvements and new features -

    Allow separatelly encode action requests. Handle sending +

    Allow separately encode action requests. Handle sending of those previously encoded action requests as binaries (as well as lists of action requests).

    See @@ -1923,7 +2666,7 @@

    Own Id: OTP-4950

    -

    Missing [text] servChgReplyParm constistency check.

    +

    Missing [text] servChgReplyParm consistency check.

    Own Id: OTP-4949

    @@ -1931,7 +2674,7 @@

    Own Id: OTP-4946

    -

    Missing [text] serviceChangeParm constistency check.

    +

    Missing [text] serviceChangeParm consistency check.

    Own Id: OTP-4945

    @@ -2090,7 +2833,7 @@

    Megaco re-transmission loop, when setting the long request timer - to an inremental timer. Megaco changes to the long request timer + to an incremental timer. Megaco changes to the long request timer when receiving an pending message (after having sent a request). Each time the (long) timer expire, it will incorrectly result in an re-send of the request. This is meaningless since we know from @@ -2210,7 +2953,7 @@

    Two new parameters for user and connection info has been added: and . These are used together with the flag and control - whether the acks should be sent immediatly or accumulated (and sent + whether the acks should be sent immediately or accumulated (and sent later). Note that this has nothing to do with the -flag in reply transactions. See user_info @@ -2250,7 +2993,7 @@

    Neither the TCP nor the UDP transport mechanisms are - part of the megaco supervsion tree. This makes code up-/downgrade + part of the megaco supervision tree. This makes code up-/downgrade difficult when either of them are used as transport.

    This will be fixed in a future release of megaco.

    @@ -2327,8 +3070,8 @@
    Megaco 1.1.0 -

    Version 1.1.0 does not suppurt code replacement in runtime from - pervious versions.

    +

    Version 1.1.0 does not support code replacement in runtime from + previous versions.

    Improvements and new features @@ -2431,7 +3174,7 @@

    A message containing a transaction request without the transaction id value is incorrectly reported back to the sender with a just an ErrorDescriptor. - The correct behaviour is describen in chapter 8.1.1 of RFC 3015. + The correct behaviour is described in chapter 8.1.1 of RFC 3015. Now the result will be a transactioReply with transaction id = 0 and an ErrorDescriptor.

    Own Id: OTP-4359

    @@ -2529,7 +3272,7 @@

    -

    Fixed Makefile.in for the flex scanner. Removed unneccessary +

    Fixed Makefile.in for the flex scanner. Removed unnecessary '-lfl' link option.

    Own Id: OTP-4224

    diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/notes.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/notes.xml 2009-06-05 13:55:45.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/notes.xml 2009-11-20 13:37:12.000000000 +0000 @@ -36,12 +36,10 @@ section is the version number of Megaco.

    - Megaco 3.11 + Megaco 3.13 - +

    Version 3.13 supports code replacement in runtime from/to + version 3.12 and 3.11.3.

    Improvements and new features @@ -51,336 +49,37 @@ -

    In order to better utilize multi-core procs, the - flex (text) scanner has been improved.

    -

    The flex (text) scanner has been made reentrant, - if the flex utility supports this. Note that the version - of flex supplied with some OS/distros (Solaris 10, - FreeBSD and OpenBSD to mention a few) may not support this, in which - case the flex scanner will be non-reentrant, just as before.

    -

    Own Id: OTP-7302

    +

    A minor optimization by using ets:update_element + instead of ets:insert for some table updates.

    +

    Own Id: OTP-8239

    +
    -
    -
    - -
    - Fixed bugs and malfunctions -

    -

    - - - -
    - -
    - Incompatibilities -

    -

    - - - -
    -
    - - -
    - Megaco 3.10.1 - -

    Version 3.10.1 supports code replacement in runtime from/to - version 3.10.0.1, 3.10 and 3.9.4.

    - -
    - Improvements and new features -

    -

    - - -
    - -
    - Fixed bugs and malfunctions - - - - -

    Unexpected handle_unexpected_reply callbacks.

    -

    The megaco_user callback function - handle_unexpected_reply - could during high load be called with unexpected values for the Trans - argument, such as an TransactionReply where transactionResult - had the value {error, timeout}. This was a result of a raise condition - and has now been fixed.

    -

    Own Id: OTP-7926

    -

    Aux Id: Seq 11255

    -
    - - -

    [text] PropertyParm values cannot be quoted.

    -

    It was not possible to encode a PropertyParm value as a quoted string - (unless it *had* to (has at least one RestChar)). The megaco text codec's - now also accepts quoted strings as PropertyParm values.

    -

    Own Id: OTP-7936

    -

    Aux Id: Seq 11258

    -
    - -
    - -
    - -
    - Incompatibilities -

    -

    - - - -
    -
    - - -
    - Megaco 3.10.0.1 - -

    Version 3.10.0.1 supports code replacement in runtime from/to - version 3.10 and 3.9.4 except - when using any of the drivers (flex for text or asn1 for binary).

    - -
    - Improvements and new features - - - - -

    Updated file headers.

    -

    Own Id: OTP-7851

    - -
    - -
    -
    - -
    - Fixed bugs and malfunctions -

    -

    - - - -
    - -
    - Incompatibilities -

    -

    - - - -
    -
    - - -
    - Megaco 3.10 - -

    Version 3.10 supports code replacement in runtime from/to - version 3.9.4, 3.9.3, 3.9.2, 3.9.1.1, 3.9.1, 3.9, 3.8.2, 3.8.1 and 3.8 except - when using any of the drivers (flex for text or asn1 for binary).

    - -
    - Improvements and new features - - - - -

    Added new API function - megaco:connect/5 and - the corresponding new megaco_user callback function - handle_connect/3. - The purpose of this is to be able to pass information to the - handle_connect/3 - function by calling the - megaco:connect/5 - function.

    -

    Own Id: OTP-7713

    -

    Aux Id: Seq 11140

    -
    - - -

    Update file headers with new copyright notice.

    -

    Own Id: OTP-7743

    -
    - -
    -
    - -
    - Fixed bugs and malfunctions -

    -

    - - - -
    - -
    - Incompatibilities - - - - -

    If the transport module calls the - process_received_message/5 - or - receive_message/5 - function(s) for the initial message, then the - handle_connect/3 - function will now be called and not the - handle_connect/2 - function.

    -

    Own Id: OTP-7713

    -

    Aux Id: Seq 11140

    -
    - -
    - -
    -
    - - -
    - Megaco 3.9.4 - -

    Version 3.9.4 supports code replacement in runtime from/to - version 3.9.3, 3.9.2, 3.9.1.1, 3.9.1, 3.9, 3.8.2, 3.8.1 and 3.8 except - when using any of the drivers (flex for text or asn1 for binary).

    - -
    - Improvements and new features -

    -

    - - -
    - -
    - Fixed bugs and malfunctions - - - - -

    Segmenting a reply failed (with a badmatch) if the message - did not actually need to be segmented (e.g. was within the - size limit, - max_pdu_size).

    -

    Own Id: OTP-7733

    -

    Aux Id: Seq 11168

    -
    +
    + +
    + Fixed bugs and malfunctions +

    -

    + +
    @@ -402,44 +101,81 @@ -->
    -
    +
    - Megaco 3.9.3 - -

    Version 3.9.3 supports code replacement in runtime from/to - version 3.9.2, 3.9.1.1, 3.9.1, 3.9, 3.8.2, 3.8.1 and 3.8 except - when using any of the drivers (flex for text or asn1 for binary).

    - -
    - Improvements and new features -

    -

    + Megaco 3.12 -
    - Fixed bugs and malfunctions + Improvements and new features -

    Memory leak in the flex scanner. There was a memory - leak in the flex scanner function handling - Property Parameters.

    -

    Own Id: OTP-7700

    -

    Aux Id: Seq 11126

    +

    Improve handling of async transaction reply.

    +

    For asynchronous requests, issued using + megaco:cast/3, + the reply will be delivered using the + handle_trans_reply/4,5 + callback function.

    +

    If a receiver of a request, issued using + megaco:cast/3, + does not reply in time, megaco re-sends the request. + If the receiver of the request sends the reply at the same + time as megaco re-sends, it may also send a reply to the + resent request (thinking the first reply got lost). These + two replies may arrive more or less at the same time, + causing confusion.

    +

    In order to improve this situation, a number of + improvements have been done:

    + + +

    When the first reply arrives, a timer, request-keep-alive, + is started. This timer is used to decide when to stop + accepting replies as legitimate.

    +

    The timeout time for the timer is specified by the + config option request_keep_alive_timout, + which can be set per + user + or per + connection.

    +
    + +

    We also keep track of how many replies has been received + (we do this as long as the request-keep-alive timer is + running).

    +
    + +

    Each reply that arrives while the request-keep-alive timer + is running (including the first) will be delivered using the + handle_trans_reply/4,5 + callback function, but with the UserReply augmented to + include a serial number indicating which reply number this + is. + The first reply to arrive, + will be numbered one (1).

    +
    + +

    Replies arriving after the timer has expired will be delivered + in the same way as before, using the + handle_unexpected_trans/3,4 + callback function.

    +
    + +

    Note that if the timer was not configured, + megaco will act exactly as before!

    +
    +
    +

    Own Id: OTP-8183

    +

    Aux Id: Seq 11393

    @@ -447,70 +183,95 @@
    - Incompatibilities + Fixed bugs and malfunctions + -
    -
    + +
    - Megaco 3.9.2 + Megaco 3.11.3 -

    Version 3.9.2 supports code replacement in runtime from/to - version 3.9.1.1, 3.9.1, 3.9, 3.8.2, 3.8.1 and 3.8 except - when using any of the drivers (flex for text or asn1 for binary).

    +
    Improvements and new features + - + + + +

    Added the config option + call_proxy_gc_timeout + to be able to control the way unexpected replies (when requests issued + via calls to call/3) + are handled.

    +

    See + user_info/2, + conn_info/2 and + call/3 for more info.

    +

    Own Id: OTP-8167

    +

    Aux Id: Seq 11393

    +
    + + +

    Make flex scanner c89 compiler compliant.

    +

    Akira Kitada

    +

    Own Id: OTP-8191

    +
    ---> +
    Fixed bugs and malfunctions - +
    @@ -532,15 +293,14 @@ -->
    - +
    - Megaco 3.9.1.1 + Megaco 3.11.2 -

    Version 3.9.1.1 supports code replacement in runtime from/to - version 3.9.1, 3.9, 3.8.2, 3.8.1 and 3.8 except - when using any of the drivers (flex for text or asn1 for binary).

    +

    Version 3.11.2 supports code replacement in runtime from/to + version 3.11.1 and 3.11.

    Improvements and new features @@ -550,11 +310,18 @@ -

    Miscellaneous dialyzer related and test case cleanup.

    -

    Own Id: OTP-7614

    +

    Megaco was unnecessarily strict when parsing the SDP + attribute maxptime (leading or trailing spaces + cased the value parse to fail).

    +

    This has been improved so that leading and trailing + spaces are stripped before parsing the value. + The same has been done for the attribute ptime.

    +

    Own Id: OTP-8123

    +

    Aux Id: Seq 11364

    +
    @@ -564,17 +331,19 @@
    -
    +
    - Megaco 3.9.1 + Megaco 3.11.1 -

    Version 3.9.1 supports code replacement in runtime from/to - version 3.9, 3.8.2, 3.8.1 and 3.8 except - when using any of the drivers (flex for text or asn1 for binary).

    +

    Version 3.11.1 supports code replacement in runtime from/to + version 3.11.

    Improvements and new features @@ -617,16 +385,19 @@ +
    @@ -637,17 +408,19 @@ -

    [text] The flex scanner did not allow an empty quotedString - in propertyParm.

    -

    Own Id: OTP-7573

    -

    Aux Id: Seq 11062

    +

    [text] The unquoted string BOTH was interpreted as the + 'BothToken' token. This was a version 3 (prev3a, prev3b, + prev3c and v3) only.

    +

    Own Id: OTP-8114

    +

    Aux Id: Seq 11353

    -

    [text] Unable to decode a version 2 message with a - topologyTriple containing an (optional) eventStream.

    -

    Own Id: OTP-7576

    -

    Aux Id: Seq 11066

    +

    The reply proxy could crash if the timeout time calculation + results in a negative number. This will result in a function + clause with resulting error report.

    +

    Own Id: OTP-8081

    +

    Aux Id: Seq 11332

    @@ -672,15 +445,16 @@ -->
    -
    +
    - Megaco 3.9 + Megaco 3.11 -

    Version 3.9 supports code replacement in runtime from/to - version 3.8.2, 3.8.1 and 3.8 except - when using any of the drivers (flex for text or asn1 for binary).

    +
    Improvements and new features @@ -690,12 +464,14 @@ -

    [text] The text codec(s) has been optimized. The parsing of - "property parameters" has been moved to the scanner(s). Which means - that when decoding messages containing property parameters, using - the flex scanner, decode time(s) will be reduced. The reduction - depends on the message, but can be as large as 25%.

    -

    Own Id: OTP-7431

    +

    In order to better utilize multi-core procs, the + flex (text) scanner has been improved.

    +

    The flex (text) scanner has been made reentrant, + if the flex utility supports this. Note that the version + of flex supplied with some OS/distros (Solaris 10, + FreeBSD and OpenBSD to mention a few) may not support this, in which + case the flex scanner will be non-reentrant, just as before.

    +

    Own Id: OTP-7302

    @@ -708,15 +484,11 @@
    -
    +
    - Megaco 3.8.2 + Megaco 3.10.1 -

    Version 3.8.2 supports code replacement in runtime from/to - version 3.8.1 and 3.8 except - when using any of the drivers (flex for text or asn1 for binary).

    +

    Version 3.10.1 supports code replacement in runtime from/to + version 3.10.0.1, 3.10 and 3.9.4.

    Improvements and new features @@ -759,16 +530,13 @@ -
    @@ -779,10 +547,24 @@ -

    [text] Messages with property parm values "containing" keywords - confused the parser when using the flex scanner.

    -

    Own Id: OTP-7534

    -

    Aux Id: Seq 11039

    +

    Unexpected handle_unexpected_reply callbacks.

    +

    The megaco_user callback function + handle_unexpected_reply + could during high load be called with unexpected values for the Trans + argument, such as an TransactionReply where transactionResult + had the value {error, timeout}. This was a result of a raise condition + and has now been fixed.

    +

    Own Id: OTP-7926

    +

    Aux Id: Seq 11255

    +
    + + +

    [text] PropertyParm values cannot be quoted.

    +

    It was not possible to encode a PropertyParm value as a quoted string + (unless it *had* to (has at least one RestChar)). The megaco text codec's + now also accepts quoted strings as PropertyParm values.

    +

    Own Id: OTP-7936

    +

    Aux Id: Seq 11258

    @@ -796,25 +578,31 @@
    -
    +
    - Megaco 3.8.1 + Megaco 3.10.0.1 -

    Version 3.8.1 supports code replacement in runtime from/to - version 3.8 except +

    Version 3.10.0.1 supports code replacement in runtime from/to + version 3.10 and 3.9.4 except when using any of the drivers (flex for text or asn1 for binary).

    @@ -825,59 +613,30 @@ -

    Some minor documentation cleanup of the - transaction sender - chapter of the User's Guide.

    -

    Own Id: OTP-7417

    -

    Aux Id: Seq 10989

    +

    Updated file headers.

    +

    Own Id: OTP-7851

    +
    -
    Fixed bugs and malfunctions - +
    @@ -888,25 +647,31 @@
    - +
    - Megaco 3.8 + Megaco 3.10 -

    Version 3.8 supports code replacement in runtime from/to - version 3.7.5, 3.7.4 and 3.7.3 except +

    Version 3.10 supports code replacement in runtime from/to + version 3.9.4, 3.9.3, 3.9.2, 3.9.1.1, 3.9.1, 3.9, 3.8.2, 3.8.1 and 3.8 except when using any of the drivers (flex for text or asn1 for binary).

    @@ -917,20 +682,22 @@ -

    Miscellaneous text codec(s) improvements. Both - regarding code size and decode performance.

    -

    See the - performance - chapter of the Users Guide for details.

    -

    Own Id: OTP-7228

    +

    Added new API function + megaco:connect/5 and + the corresponding new megaco_user callback function + handle_connect/3. + The purpose of this is to be able to pass information to the + handle_connect/3 + function by calling the + megaco:connect/5 + function.

    +

    Own Id: OTP-7713

    +

    Aux Id: Seq 11140

    -

    Added the value flag to the resend_indication config - option. See - resend_indication for more info.

    -

    Own Id: OTP-7259

    -

    Aux Id: Seq 10901

    +

    Update file headers with new copyright notice.

    +

    Own Id: OTP-7743

    @@ -938,71 +705,70 @@
    Fixed bugs and malfunctions - +
    Incompatibilities + -
    -
    +
    - Megaco 3.7.5 + Megaco 3.9.4 -

    Version 3.7.5 supports code replacement in runtime from/to - version 3.7.4, 3.7.3, 3.7.2, 3.7.1 and 3.7 except +

    Version 3.9.4 supports code replacement in runtime from/to + version 3.9.3, 3.9.2, 3.9.1.1, 3.9.1, 3.9, 3.8.2, 3.8.1 and 3.8 except when using any of the drivers (flex for text or asn1 for binary).

    Improvements and new features - +
    @@ -1013,11 +779,18 @@ -

    The transaction id counter could be incorrectly - updated at wrap-around. The risk was expecially high - at high load.

    -

    Own Id: OTP-7303

    -

    Aux Id: Seq 10939

    +

    Segmenting a reply failed (with a badmatch) if the message + did not actually need to be segmented (e.g. was within the + size limit, + max_pdu_size).

    +

    Own Id: OTP-7733

    +

    Aux Id: Seq 11168

    +
    + + +

    Improve the error handling of megaco_tcp for received + messages.

    +

    Own Id: OTP-7728

    @@ -1042,38 +815,29 @@ -->
    -
    +
    - Megaco 3.7.4 + Megaco 3.9.3 -

    Version 3.7.4 supports code replacement in runtime from/to - version 3.7.3, 3.7.2, 3.7.1 and 3.7 except +

    Version 3.9.3 supports code replacement in runtime from/to + version 3.9.2, 3.9.1.1, 3.9.1, 3.9, 3.8.2, 3.8.1 and 3.8 except when using any of the drivers (flex for text or asn1 for binary).

    Improvements and new features - +
    @@ -1084,11 +848,11 @@ -

    The (plain) text scanner could incorrectly identify - character strings (any 17 char long string with the - char t in the middle) as a TimeStampToken.

    -

    Own Id: OTP-7249

    -

    Aux Id: Seq 10917

    +

    Memory leak in the flex scanner. There was a memory + leak in the flex scanner function handling + Property Parameters.

    +

    Own Id: OTP-7700

    +

    Aux Id: Seq 11126

    @@ -1113,31 +877,29 @@ -->
    -
    +
    - Megaco 3.7.3 + Megaco 3.9.2 -

    Version 3.7.3 supports code replacement in runtime from/to - version 3.7.2, 3.7.1 and 3.7 except +

    Version 3.9.2 supports code replacement in runtime from/to + version 3.9.1.1, 3.9.1, 3.9, 3.8.2, 3.8.1 and 3.8 except when using any of the drivers (flex for text or asn1 for binary).

    Improvements and new features - +
    @@ -1148,38 +910,17 @@ -

    The behaviour megaco_encoder was lacking three functions - which was made mandatory as of version 3.7.

    -

    See - encode_transaction/3, - encode_action_requests/3 and - encode_action_reply/3 - for more info

    -

    Own Id: OTP-7168

    -

    Aux Id: Seq 10867

    -
    - - -

    It was possible to create permenant pending counter - data for a somewhat misbehaving (request) receiver. - If a megaco entity ("sender") sends a request and the - "receiver" (of the request) responds with a pending - message but never actually sends the reply (or if - it is lost), the created pending counter data would - never be deleted if the - long_request_timer - was set to infinity (old default) and the - recv_pending_limit - was set to an integer value (default is infinity).

    -

    Own Id: OTP-7189

    -

    Aux Id: Seq 10879

    +

    The text encoders (v1, v2, v3, ...) all failed to + properly encode the DigitMapDescriptor.

    +

    Own Id: OTP-7671

    +

    Aux Id: Seq 11113

    -

    If a counter whas reset (wrap-around) as a result of - increment larger than 1, then it was actually always - set to the min_trans_id-value.

    -

    Own Id: OTP-7216

    +

    The mini decoder some time incorrectly identifies + plain text as tokens.

    +

    Own Id: OTP-7672

    +

    Aux Id: Seq 11103

    @@ -1188,10 +929,9 @@
    Incompatibilities - +
    -
    +
    - Megaco 3.7.2 + Megaco 3.9.1.1 -

    Version 3.7.2 supports code replacement in runtime from/to - version 3.7.1 and 3.7 except +

    Version 3.9.1.1 supports code replacement in runtime from/to + version 3.9.1, 3.9, 3.8.2, 3.8.1 and 3.8 except when using any of the drivers (flex for text or asn1 for binary).

    Improvements and new features + -
    Fixed bugs and malfunctions - +
    @@ -1285,52 +1002,44 @@
    - +
    - Megaco 3.7.1 + Megaco 3.9.1 -

    Version 3.7.1 supports code replacement in runtime from/to - version 3.7 except +

    Version 3.9.1 supports code replacement in runtime from/to + version 3.9, 3.8.2, 3.8.1 and 3.8 except when using any of the drivers (flex for text or asn1 for binary).

    Improvements and new features - +
    @@ -1341,35 +1050,19 @@ -

    Corrected usage of function file:open/2 (the Modes - argument is a list).

    -

    Dialyzer

    -

    Own Id: OTP-7124

    - -
    - - -

    Fixed a reply timer race condition problem resulting - in (case clause) error message.

    -

    Own Id: OTP-6999

    -

    Aux Id: Seq 10815

    +

    [text] The flex scanner did not allow an empty quotedString + in propertyParm.

    +

    Own Id: OTP-7573

    +

    Aux Id: Seq 11062

    -

    Failure to parse SDP attribute FMTP rows.

    -

    Own Id: OTP-6992

    -

    Aux Id: Seq 10813

    +

    [text] Unable to decode a version 2 message with a + topologyTriple containing an (optional) eventStream.

    +

    Own Id: OTP-7576

    +

    Aux Id: Seq 11066

    - -

    When the megaco application receives two instances of - the same transaction requests (re-send) within too - small a time, there is a small possibility that both - are passed on to the user via a call to the callback - function (handle_trans_request).

    -

    Own Id: OTP-6971

    -

    Aux Id: Seq 10802

    -
    @@ -1381,86 +1074,41 @@
    - +
    - Megaco 3.7 -
    Improvements and new features - - -

    Added support for the full v3-standard - (including segmentation).

    -

    See - segmentation of transaction replies - and - handling megaco versions - for more info.

    -

    Note that segmentation is currently not supported by the - binary codec(s).

    -

    Own Id: OTP-5979

    -
    - - -

    The megaco documentation source has been converted - from SGML to XML.

    -

    Own Id: OTP-6753

    -
    - - -

    SDP support updated according to RFC 4566.

    -

    Own Id: OTP-6804

    -

    Aux Id: Seq 10710

    -
    - - -

    Added a way for the transport module to transfer - extra information to the user callback functions - callback functions - upon receipt of a message. This is done by adding an extra - argument when calling the (new) message delivery function(s) - process_received_message/5 - or - receive_message/5.

    -

    Similarly, the UserReply part of the return value for the - call function can - now also include such extra information.

    -

    Own Id: OTP-6865

    -

    Aux Id: Seq 10559

    -
    - + -

    Improve the utility functions for information retrieval: - megaco:info, - megaco:system_info, - megaco:conn_info and - megaco:user_info.

    -

    Own Id: OTP-6976

    -

    Aux Id: Seq 10804

    +

    [text] The text codec(s) has been optimized. The parsing of + "property parameters" has been moved to the scanner(s). Which means + that when decoding messages containing property parameters, using + the flex scanner, decode time(s) will be reduced. The reduction + depends on the message, but can be as large as 25%.

    +

    Own Id: OTP-7431

    @@ -1469,29 +1117,51 @@
    Fixed bugs and malfunctions

    -

    + + +
    Incompatibilities - + + +
    -
    +
    -
    + diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/part_notes.xml 2009-03-12 12:30:46.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/part_notes.xml 2009-11-20 13:37:12.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20002009 @@ -21,7 +21,7 @@ - Megaco Release Notes + Megaco/H.248 Release Notes Lars Thorsén, Håkan Mattsson, Micael Karlberg 2007-06-15 @@ -34,6 +34,6 @@

    For information about older versions see release notes history.

    - + diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/part.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/part.xml 2009-03-12 12:30:46.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/part.xml 2009-11-20 13:37:12.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20002009 @@ -21,7 +21,7 @@ - Megaco Users Guide + Megaco/H.248 Users Guide Lars Thorsén, Håkan Mattsson, Micael Karlberg 2007-06-15 @@ -32,14 +32,14 @@

    The Megaco application is a framework for building applications on top of the Megaco/H.248 protocol.

    - - - - - - - - - + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/megaco/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/megaco/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/megaco/doc/src/ref_man.xml 2009-06-05 13:55:46.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/doc/src/ref_man.xml 2009-11-20 13:37:13.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20002009 @@ -21,7 +21,7 @@ - Megaco Reference Manual + Megaco/H.248 Reference Manual Lars Thorsén, Håkan Mattsson, Micael Karlberg 2007-06-15 @@ -32,17 +32,17 @@

    The Megaco application is a framework for building applications on top of the Megaco/H.248 protocol.

    - - - - - - - - - - - - + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/megaco/examples/simple/megaco_simple_mgc.erl erlang-13.b.3-dfsg/lib/megaco/examples/simple/megaco_simple_mgc.erl --- erlang-13.b.1-dfsg/lib/megaco/examples/simple/megaco_simple_mgc.erl 2009-03-12 12:30:50.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/examples/simple/megaco_simple_mgc.erl 2009-09-18 15:12:55.000000000 +0100 @@ -289,7 +289,7 @@ [AR] -> ContextId = AR#'ActionRequest'.contextId, case AR#'ActionRequest'.commandRequests of - [CR] when ContextId == ?megaco_null_context_id -> + [CR] when ContextId =:= ?megaco_null_context_id -> case CR#'CommandRequest'.command of {serviceChangeReq, Req} -> Rep = service_change(ConnHandle, ProtocolVersion, Req), @@ -414,7 +414,7 @@ parse_args([], Acc) -> Acc; -parse_args([Arg|Args], Acc) when atom(Arg) -> +parse_args([Arg|Args], Acc) when is_atom(Arg) -> case string:tokens(atom_to_list(Arg),"{},") of ["trace",Trace] -> parse_args(Args, parse_args(trace, list_to_atom(Trace), Acc)); diff -Nru erlang-13.b.1-dfsg/lib/megaco/examples/simple/megaco_simple_mg.erl erlang-13.b.3-dfsg/lib/megaco/examples/simple/megaco_simple_mg.erl --- erlang-13.b.1-dfsg/lib/megaco/examples/simple/megaco_simple_mg.erl 2009-03-12 12:30:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/examples/simple/megaco_simple_mg.erl 2009-09-18 15:12:54.000000000 +0100 @@ -66,7 +66,7 @@ start_batch() -> start_batch([]). -start_batch(Args0) when list(Args0) -> +start_batch(Args0) when is_list(Args0) -> {ok, LocalHost} = inet:gethostname(), Defs = [{mgc_host, LocalHost}, {trace,false}, {debug, false}], Args = parse_args(Args0, Defs), @@ -82,9 +82,9 @@ parse_args([], Acc) -> Acc; -parse_args([Arg|Args], Acc) when atom(Arg) -> +parse_args([Arg|Args], Acc) when is_atom(Arg) -> case string:tokens(atom_to_list(Arg),"{},") of - ["mgc_host", Host] when list(Host) -> + ["mgc_host", Host] when is_list(Host) -> parse_args(Args, parse_args(mgc_host, Host, Acc)); ["trace",Trace] -> parse_args(Args, parse_args(trace, list_to_atom(Trace), Acc)); @@ -135,10 +135,12 @@ start(LocalHost, false, false). %% Used when calling from the erlang shell: -start(MgcHost, Trace, Debug) when atom(MgcHost), atom(Trace), atom(Debug) -> +start(MgcHost, Trace, Debug) + when is_atom(MgcHost) andalso is_atom(Trace) andalso is_atom(Debug) -> start(atom_to_list(MgcHost), Trace, Debug); -start(MgcHost, Trace, Debug) when list(MgcHost), atom(Trace), atom(Debug) -> +start(MgcHost, Trace, Debug) + when is_list(MgcHost) andalso is_atom(Trace) andalso is_atom(Debug) -> put(debug, Debug), d("start -> entry with" "~n MgcHost: ~s" diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/app/megaco.appup.src erlang-13.b.3-dfsg/lib/megaco/src/app/megaco.appup.src --- erlang-13.b.1-dfsg/lib/megaco/src/app/megaco.appup.src 2009-06-05 13:55:44.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/src/app/megaco.appup.src 2009-11-20 13:37:11.000000000 +0000 @@ -105,20 +105,59 @@ %% | %% v %% 3.11 +%% | +%% v +%% 3.11.1 +%% | +%% v +%% 3.11.2 +%% | +%% v +%% 3.11.3 +%% | +%% v +%% 3.12 +%% | +%% v +%% 3.13 %% %% {"%VSN%", [ - {"3.10.1", + {"3.12", [ - {restart_application, megaco} + {load_module, megaco_udp, soft_purge, soft_purge, []}, + {load_module, megaco_messenger, soft_purge, soft_purge, [megaco_monitor]}, + {update, megaco_monitor, soft, soft_purge, soft_purge, []} + ] + }, + {"3.11.3", + [ + {load_module, megaco_udp, soft_purge, soft_purge, []}, + {load_module, megaco_messenger, soft_purge, soft_purge, + [megaco_config, megaco_monitor]}, + {update, megaco_monitor, soft, soft_purge, soft_purge, []}, + {update, megaco_config, {advanced, upgrade_from_pre_3_12}, + soft_purge, soft_purge, []} ] } ], [ - {"3.10.1", + {"3.12", + [ + {load_module, megaco_udp, soft_purge, soft_purge, []}, + {load_module, megaco_messenger, soft_purge, soft_purge, [megaco_monitor]}, + {update, megaco_monitor, soft, soft_purge, soft_purge, []} + ] + }, + {"3.11.3", [ - {restart_application, megaco} + {load_module, megaco_udp, soft_purge, soft_purge, []}, + {load_module, megaco_messenger, soft_purge, soft_purge, + [megaco_config, megaco_monitor]}, + {update, megaco_monitor, soft, soft_purge, soft_purge, []}, + {update, megaco_config, {advanced, downgrade_to_pre_3_12}, + soft_purge, soft_purge, []} ] } ] diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/app/megaco.erl erlang-13.b.3-dfsg/lib/megaco/src/app/megaco.erl --- erlang-13.b.1-dfsg/lib/megaco/src/app/megaco.erl 2009-03-12 12:30:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/app/megaco.erl 2009-09-18 15:12:40.000000000 +0100 @@ -494,7 +494,7 @@ print_sys_info(Versions) -> case key1search(sys_info, Versions) of - {value, SysInfo} when list(SysInfo) -> + {value, SysInfo} when is_list(SysInfo) -> {value, Arch} = key1search(arch, SysInfo, "Not found"), {value, Ver} = key1search(ver, SysInfo, "Not found"), io:format("System info: " @@ -509,30 +509,30 @@ print_os_info(Versions) -> case key1search(os_info, Versions) of - {value, OsInfo} when list(OsInfo) -> + {value, OsInfo} when is_list(OsInfo) -> Fam = case key1search(fam, OsInfo, "Not found") of - {value, F} when atom(F) -> + {value, F} when is_atom(F) -> atom_to_list(F); - {value, LF} when list(LF) -> + {value, LF} when is_list(LF) -> LF; {value, XF} -> lists:flatten(io_lib:format("~p", [XF])) end, Name = case key1search(name, OsInfo) of - {value, N} when atom(N) -> + {value, N} when is_atom(N) -> "[" ++ atom_to_list(N) ++ "]"; - {value, LN} when list(LN) -> + {value, LN} when is_list(LN) -> "[" ++ LN ++ "]"; not_found -> "" end, Ver = case key1search(ver, OsInfo, "Not found") of - {value, T} when tuple(T) -> + {value, T} when is_tuple(T) -> tversion(T); - {value, LV} when list(LV) -> + {value, LV} when is_list(LV) -> LV; {value, XV} -> lists:flatten(io_lib:format("~p", [XV])) @@ -562,7 +562,7 @@ print_mods_info(Versions) -> case key1search(mod_info, Versions) of - {value, ModsInfo} when list(ModsInfo) -> + {value, ModsInfo} when is_list(ModsInfo) -> io:format("Module info: ~n", []), lists:foreach(fun print_mod_info/1, ModsInfo); _ -> @@ -586,21 +586,21 @@ end, Vsn = case key1search(vsn, Info) of - {value, I} when integer(I) -> + {value, I} when is_integer(I) -> integer_to_list(I); _ -> "Not found" end, AppVsn = case key1search(app_vsn, Info) of - {value, S1} when list(S1) -> + {value, S1} when is_list(S1) -> S1; _ -> "Not found" end, CompVer = case key1search(compiler_version, Info) of - {value, S2} when list(S2) -> + {value, S2} when is_list(S2) -> S2; _ -> "Not found" @@ -728,7 +728,7 @@ _ -> {error, not_found} end; -nc(Mods) when list(Mods) -> +nc(Mods) when is_list(Mods) -> [Mod || Mod <- Mods, ok /= load(Mod, compile)]. ni() -> @@ -748,10 +748,10 @@ _ -> {error, not_found} end; -ni(Mods) when list(Mods) -> +ni(Mods) when is_list(Mods) -> [Mod || Mod <- Mods, ok /= load(Mod, interpret)]. -load(Mod, How) when atom(Mod) -> +load(Mod, How) when is_atom(Mod) -> case try_load(Mod, How) of ok -> ok; @@ -841,7 +841,7 @@ %% Severity withing Limit) will be written to stdout using io:format. %% %%----------------------------------------------------------------- -enable_trace(Level, File) when list(File) -> +enable_trace(Level, File) when is_list(File) -> case file:open(File, [write]) of {ok, Fd} -> HandleSpec = {fun handle_trace/2, Fd}, @@ -850,14 +850,14 @@ Err -> Err end; -enable_trace(Level, Port) when integer(Port) -> +enable_trace(Level, Port) when is_integer(Port) -> dbg:tracer(port, dbg:trace_port(ip, Port)), set_trace(Level); enable_trace(Level, io) -> HandleSpec = {fun handle_trace/2, standard_io}, dbg:tracer(process, HandleSpec), set_trace(Level); -enable_trace(Level, {Fun, _Data} = HandleSpec) when function(Fun) -> +enable_trace(Level, {Fun, _Data} = HandleSpec) when is_function(Fun) -> dbg:tracer(process, HandleSpec), set_trace(Level). diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/app/megaco_internal.hrl erlang-13.b.3-dfsg/lib/megaco/src/app/megaco_internal.hrl --- erlang-13.b.1-dfsg/lib/megaco/src/app/megaco_internal.hrl 2009-03-12 12:30:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/app/megaco_internal.hrl 2009-11-20 08:48:30.000000000 +0000 @@ -88,11 +88,12 @@ auth_data, user_mod, user_args, - reply_action, % call | cast - reply_data, % term() - threaded, % boolean(), false - strict_version, % boolean(), true - long_request_resend, % boolean(), false + reply_action, % call | cast + reply_data, % term() + threaded, % boolean(), false + strict_version, % boolean(), true + long_request_resend, % boolean(), false + call_proxy_gc_timeout, % integer() > 0 %% This flag is used when a connection is being cancelled. %% The purpuse is to avoid raise conditions with replies @@ -108,7 +109,9 @@ segment_recv_timer, % megaco_timer() | integer() > 0 | infinity segment_send, % none | infinity | integer() > 0 segment_send_timer, % megaco_timer() | integer() > 0 | infinity - max_pdu_size % infinity | integer() > 0 + max_pdu_size, % infinity | integer() > 0 + + request_keep_alive_timeout % plain | integer() >= 0 }). diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_encoder.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_encoder.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_encoder.erl 2009-03-12 12:30:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_encoder.erl 2009-09-18 15:12:50.000000000 +0100 @@ -141,44 +141,44 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_requests([{version3,_}|EC], 1, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> AsnMod = megaco_ber_media_gateway_control_v1, TransMod = megaco_binary_transformer_v1, ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list); -encode_action_requests(EC, 1, ActReqs) when list(ActReqs) -> +encode_action_requests(EC, 1, ActReqs) when is_list(ActReqs) -> AsnMod = megaco_ber_media_gateway_control_v1, TransMod = megaco_binary_transformer_v1, ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list); encode_action_requests([{version3,_}|EC], 2, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> AsnMod = megaco_ber_media_gateway_control_v2, TransMod = megaco_binary_transformer_v2, ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list); -encode_action_requests(EC, 2, ActReqs) when list(ActReqs) -> +encode_action_requests(EC, 2, ActReqs) when is_list(ActReqs) -> AsnMod = megaco_ber_media_gateway_control_v2, TransMod = megaco_binary_transformer_v2, ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list); encode_action_requests([{version3,v3}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> AsnMod = megaco_ber_media_gateway_control_v3, TransMod = megaco_binary_transformer_v3, ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list); encode_action_requests([{version3,prev3c}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> AsnMod = megaco_ber_media_gateway_control_prev3c, TransMod = megaco_binary_transformer_prev3c, ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list); encode_action_requests([{version3,prev3b}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> AsnMod = megaco_ber_media_gateway_control_prev3b, TransMod = megaco_binary_transformer_prev3b, ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list); encode_action_requests([{version3,prev3a}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> AsnMod = megaco_ber_media_gateway_control_prev3a, TransMod = megaco_binary_transformer_prev3a, ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list); -encode_action_requests(EC, 3, ActReqs) when list(ActReqs) -> +encode_action_requests(EC, 3, ActReqs) when is_list(ActReqs) -> AsnMod = megaco_ber_media_gateway_control_v3, TransMod = megaco_binary_transformer_v3, ?BIN_LIB:encode_action_requests(EC, ActReqs, AsnMod, TransMod, io_list). diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3a.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3a.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3a.erl 2009-03-12 12:32:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3a.erl 2009-09-18 15:13:17.000000000 +0100 @@ -459,7 +459,7 @@ decode_profile(Package); decode(dialplan, Dialplan) -> decode_dialplan(Dialplan); -decode(Scope, [A, B | Item]) when atom(Scope) -> +decode(Scope, [A, B | Item]) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -472,7 +472,7 @@ ?d("decode -> Package: ~p", [Package]), Package ++ "/" ++ decode_item(Scope, [A, B], Item) end; -decode({Scope, [A, B | Item]}, SubItem) when atom(Scope) -> +decode({Scope, [A, B | Item]}, SubItem) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -507,7 +507,7 @@ end; 16#ff -> case B of - 16#ff when Item == [16#ff, 16#ff] -> "*" + 16#ff when Item =:= [16#ff, 16#ff] -> "*" end end. @@ -585,7 +585,7 @@ encode_profile(Profile); encode(dialplan, Dialplan) -> encode_dialplan(Dialplan); -encode(Scope, PackageItem) when atom(Scope) -> +encode(Scope, PackageItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p", [Scope, PackageItem]), case string:tokens(PackageItem, [$/]) of @@ -598,7 +598,7 @@ ?d("encode -> Item: ~p", [Item]), [16#00, 16#00 | encode_native(Scope, Item)] end; -encode({Scope, PackageItem}, SubItem) when atom(Scope) -> +encode({Scope, PackageItem}, SubItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p" "~n SubItem: ~p", [Scope, PackageItem, SubItem]), diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3b.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3b.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3b.erl 2009-03-12 12:32:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3b.erl 2009-09-18 15:13:23.000000000 +0100 @@ -459,7 +459,7 @@ decode_profile(Package); decode(dialplan, Dialplan) -> decode_dialplan(Dialplan); -decode(Scope, [A, B | Item]) when atom(Scope) -> +decode(Scope, [A, B | Item]) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -472,7 +472,7 @@ ?d("decode -> Package: ~p", [Package]), Package ++ "/" ++ decode_item(Scope, [A, B], Item) end; -decode({Scope, [A, B | Item]}, SubItem) when atom(Scope) -> +decode({Scope, [A, B | Item]}, SubItem) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -507,7 +507,7 @@ end; 16#ff -> case B of - 16#ff when Item == [16#ff, 16#ff] -> "*" + 16#ff when Item =:= [16#ff, 16#ff] -> "*" end end. @@ -585,7 +585,7 @@ encode_profile(Profile); encode(dialplan, Dialplan) -> encode_dialplan(Dialplan); -encode(Scope, PackageItem) when atom(Scope) -> +encode(Scope, PackageItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p", [Scope, PackageItem]), case string:tokens(PackageItem, [$/]) of @@ -598,7 +598,7 @@ ?d("encode -> Item: ~p", [Item]), [16#00, 16#00 | encode_native(Scope, Item)] end; -encode({Scope, PackageItem}, SubItem) when atom(Scope) -> +encode({Scope, PackageItem}, SubItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p" "~n SubItem: ~p", [Scope, PackageItem, SubItem]), diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3c.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3c.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3c.erl 2009-03-12 12:32:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_prev3c.erl 2009-09-18 15:13:26.000000000 +0100 @@ -459,7 +459,7 @@ decode_profile(Package); decode(dialplan, Dialplan) -> decode_dialplan(Dialplan); -decode(Scope, [A, B | Item]) when atom(Scope) -> +decode(Scope, [A, B | Item]) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -472,7 +472,7 @@ ?d("decode -> Package: ~p", [Package]), Package ++ "/" ++ decode_item(Scope, [A, B], Item) end; -decode({Scope, [A, B | Item]}, SubItem) when atom(Scope) -> +decode({Scope, [A, B | Item]}, SubItem) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -507,7 +507,7 @@ end; 16#ff -> case B of - 16#ff when Item == [16#ff, 16#ff] -> "*" + 16#ff when Item =:= [16#ff, 16#ff] -> "*" end end. @@ -585,7 +585,7 @@ encode_profile(Profile); encode(dialplan, Dialplan) -> encode_dialplan(Dialplan); -encode(Scope, PackageItem) when atom(Scope) -> +encode(Scope, PackageItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p", [Scope, PackageItem]), case string:tokens(PackageItem, [$/]) of @@ -598,7 +598,7 @@ ?d("encode -> Item: ~p", [Item]), [16#00, 16#00 | encode_native(Scope, Item)] end; -encode({Scope, PackageItem}, SubItem) when atom(Scope) -> +encode({Scope, PackageItem}, SubItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p" "~n SubItem: ~p", [Scope, PackageItem, SubItem]), diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v1.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v1.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v1.erl 2009-03-12 12:30:26.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v1.erl 2009-09-18 15:12:42.000000000 +0100 @@ -385,7 +385,7 @@ decode_profile(Package); decode(dialplan, Dialplan) -> decode_dialplan(Dialplan); -decode(Scope, [A, B | Item]) when atom(Scope) -> +decode(Scope, [A, B | Item]) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -398,7 +398,7 @@ ?d("decode -> Package: ~p", [Package]), Package ++ "/" ++ decode_item(Scope, [A, B], Item) end; -decode({Scope, [A, B | Item]}, SubItem) when atom(Scope) -> +decode({Scope, [A, B | Item]}, SubItem) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -433,7 +433,7 @@ end; 16#ff -> case B of - 16#ff when Item == [16#ff, 16#ff] -> "*" + 16#ff when Item =:= [16#ff, 16#ff] -> "*" end end. @@ -511,7 +511,7 @@ encode_profile(Profile); encode(dialplan, Dialplan) -> encode_dialplan(Dialplan); -encode(Scope, PackageItem) when atom(Scope) -> +encode(Scope, PackageItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p", [Scope, PackageItem]), case string:tokens(PackageItem, [$/]) of @@ -524,7 +524,7 @@ ?d("encode -> Item: ~p", [Item]), [16#00, 16#00 | encode_native(Scope, Item)] end; -encode({Scope, PackageItem}, SubItem) when atom(Scope) -> +encode({Scope, PackageItem}, SubItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p" "~n SubItem: ~p", [Scope, PackageItem, SubItem]), diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v2.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v2.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v2.erl 2009-03-12 12:31:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v2.erl 2009-09-18 15:13:08.000000000 +0100 @@ -400,7 +400,7 @@ decode_profile(Package); decode(dialplan, Dialplan) -> decode_dialplan(Dialplan); -decode(Scope, [A, B | Item]) when atom(Scope) -> +decode(Scope, [A, B | Item]) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -413,7 +413,7 @@ ?d("decode -> Package: ~p", [Package]), Package ++ "/" ++ decode_item(Scope, [A, B], Item) end; -decode({Scope, [A, B | Item]}, SubItem) when atom(Scope) -> +decode({Scope, [A, B | Item]}, SubItem) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -448,7 +448,7 @@ end; 16#ff -> case B of - 16#ff when Item == [16#ff, 16#ff] -> "*" + 16#ff when Item =:= [16#ff, 16#ff] -> "*" end end. @@ -526,7 +526,7 @@ encode_profile(Profile); encode(dialplan, Dialplan) -> encode_dialplan(Dialplan); -encode(Scope, PackageItem) when atom(Scope) -> +encode(Scope, PackageItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p", [Scope, PackageItem]), case string:tokens(PackageItem, [$/]) of @@ -539,7 +539,7 @@ ?d("encode -> Item: ~p", [Item]), [16#00, 16#00 | encode_native(Scope, Item)] end; -encode({Scope, PackageItem}, SubItem) when atom(Scope) -> +encode({Scope, PackageItem}, SubItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p" "~n SubItem: ~p", [Scope, PackageItem, SubItem]), diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v3.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v3.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v3.erl 2009-03-12 12:32:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_name_resolver_v3.erl 2009-09-18 15:13:21.000000000 +0100 @@ -459,7 +459,7 @@ decode_profile(Package); decode(dialplan, Dialplan) -> decode_dialplan(Dialplan); -decode(Scope, [A, B | Item]) when atom(Scope) -> +decode(Scope, [A, B | Item]) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -472,7 +472,7 @@ ?d("decode -> Package: ~p", [Package]), Package ++ "/" ++ decode_item(Scope, [A, B], Item) end; -decode({Scope, [A, B | Item]}, SubItem) when atom(Scope) -> +decode({Scope, [A, B | Item]}, SubItem) when is_atom(Scope) -> ?d("decode(~p) -> entry with" "~n A: ~p" "~n B: ~p" @@ -507,7 +507,7 @@ end; 16#ff -> case B of - 16#ff when Item == [16#ff, 16#ff] -> "*" + 16#ff when Item =:= [16#ff, 16#ff] -> "*" end end. @@ -585,7 +585,7 @@ encode_profile(Profile); encode(dialplan, Dialplan) -> encode_dialplan(Dialplan); -encode(Scope, PackageItem) when atom(Scope) -> +encode(Scope, PackageItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p", [Scope, PackageItem]), case string:tokens(PackageItem, [$/]) of @@ -598,7 +598,7 @@ ?d("encode -> Item: ~p", [Item]), [16#00, 16#00 | encode_native(Scope, Item)] end; -encode({Scope, PackageItem}, SubItem) when atom(Scope) -> +encode({Scope, PackageItem}, SubItem) when is_atom(Scope) -> ?d("encode(~p) -> entry with" "~n PackageItem: ~p" "~n SubItem: ~p", [Scope, PackageItem, SubItem]), diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_term_id.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_term_id.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_term_id.erl 2009-03-12 12:30:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_term_id.erl 2009-09-18 15:12:51.000000000 +0100 @@ -69,13 +69,13 @@ %% Return {ok, TermId} | {error, Reason} %%---------------------------------------------------------------------- -encode(_Config, TermId) when TermId == ?megaco_root_termination_id -> +encode(_Config, TermId) when TermId =:= ?megaco_root_termination_id -> {ok, ?asn_root_termination_id}; -encode(Config, TermId) when TermId == ?megaco_all_wildcard_termination_id, - Config == ?default_config -> +encode(Config, TermId) when (TermId =:= ?megaco_all_wildcard_termination_id) andalso + (Config =:= ?default_config) -> {ok, asn_all_tid()}; -encode(Config, TermId) when TermId == ?megaco_choose_wildcard_termination_id, - Config == ?default_config -> +encode(Config, TermId) when (TermId =:= ?megaco_choose_wildcard_termination_id) andalso + (Config =:= ?default_config) -> {ok, asn_choose_tid()}; encode(Config, #megaco_term_id{contains_wildcards = false, id = IDs}) -> case (catch encode1(IDs,Config)) of @@ -108,13 +108,13 @@ %%---------------------------------------------------------------------- %% Encode without wildcards %%---------------------------------------------------------------------- -encode1(IDs,LevelConfig) when list(LevelConfig) -> +encode1(IDs,LevelConfig) when is_list(LevelConfig) -> megaco_binary_term_id_gen:encode_without_wildcards(IDs, LevelConfig); %% This is only temporary. Eventually a proper encoder for this case %% should be implemented -encode1(IDs,LevelConfig) when integer(LevelConfig) -> +encode1(IDs,LevelConfig) when is_integer(LevelConfig) -> %% megaco_binary_term_id_8lev:encode_without_wildcards(IDs, LevelConfig). encode1(IDs,lists:duplicate(LevelConfig,8)). @@ -122,13 +122,13 @@ %%---------------------------------------------------------------------- %% Encode with wildcards %%---------------------------------------------------------------------- -encode2(IDs,LevelConfig) when list(LevelConfig) -> +encode2(IDs,LevelConfig) when is_list(LevelConfig) -> megaco_binary_term_id_gen:encode_with_wildcards(IDs, LevelConfig); %% This is only temporary. Eventually a proper encoder for this case %% should be implemented -encode2(IDs,LevelConfig) when integer(LevelConfig) -> +encode2(IDs,LevelConfig) when is_integer(LevelConfig) -> %% megaco_binary_term_id_8lev:encode_with_wildcards(IDs, LevelConfig). encode2(IDs,lists:duplicate(LevelConfig,8)). @@ -138,7 +138,7 @@ %% Return {ok, TerminationId} | {error, Reason} %%---------------------------------------------------------------------- -decode(_Config, TermId) when TermId == ?asn_root_termination_id -> +decode(_Config, TermId) when (TermId =:= ?asn_root_termination_id) -> {ok, ?megaco_root_termination_id}; decode(Config, #'TerminationID'{wildcard = [], id = IDs}) -> case (catch decode1(IDs,Config)) of @@ -161,12 +161,12 @@ %%---------------------------------------------------------------------- %% Decode without wildcards %%---------------------------------------------------------------------- -decode1(IDs, Lc) when list(Lc) -> +decode1(IDs, Lc) when is_list(Lc) -> megaco_binary_term_id_gen:decode_without_wildcards(IDs, Lc); %% This is only temporary. Eventually a proper encoder for this case %% should be implemented -decode1(IDs, Lc) when integer(Lc) -> +decode1(IDs, Lc) when is_integer(Lc) -> %% megaco_binary_term_id_8lev:decode_without_wildcards(IDs, Lc). decode1(IDs,lists:duplicate(Lc,8)). @@ -174,12 +174,12 @@ %%---------------------------------------------------------------------- %% Decode with wildcards %%---------------------------------------------------------------------- -decode2(Wildcards, IDs, Lc) when list(Lc) -> +decode2(Wildcards, IDs, Lc) when is_list(Lc) -> megaco_binary_term_id_gen:decode_with_wildcards(Wildcards, IDs, Lc); %% This is only temporary. Eventually a proper encoder for this case %% should be implemented -decode2(Wildcards, IDs, Lc) when integer(Lc) -> +decode2(Wildcards, IDs, Lc) when is_integer(Lc) -> %% megaco_binary_term_id_8lev:decode_with_wildcards(Wildcards, IDs, Lc); decode2(Wildcards, IDs, lists:duplicate(Lc,8)). diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_term_id_gen.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_term_id_gen.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_term_id_gen.erl 2009-03-12 12:30:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_term_id_gen.erl 2009-09-18 15:12:51.000000000 +0100 @@ -57,14 +57,14 @@ %%---------------------------------------------------------------------- %% Encode without wildcards %%---------------------------------------------------------------------- -encode_without_wildcards(IDs,LevelConfig) when list(LevelConfig) -> +encode_without_wildcards(IDs,LevelConfig) when is_list(LevelConfig) -> EncodedIDs = encode_ids(false,IDs,LevelConfig), #'TerminationID'{wildcard = [], id = EncodedIDs}. %%---------------------------------------------------------------------- %% Encode with wildcards %%---------------------------------------------------------------------- -encode_with_wildcards(IDs,LevelConfig) when list(LevelConfig) -> +encode_with_wildcards(IDs,LevelConfig) when is_list(LevelConfig) -> Wildcards = encode_wildcards(IDs,LevelConfig), EncodedIDs = encode_ids(true,IDs,LevelConfig), #'TerminationID'{wildcard = Wildcards, id = EncodedIDs}. @@ -212,11 +212,11 @@ case (catch encode_id_level(W,L,C,R,E)) of {'EXIT',Reason} -> exit(Reason); - {true,R1,E1} when length(Ls) == 0 -> + {true,R1,E1} when (length(Ls) =:= 0) -> encode_ids2(Cs,encode_ids1(R1,E1)); {WildcardFound1,R1,E1} -> encode_ids(W,Ls,Cs,R1,E1,WildcardFound1); - {true,E2} when length(Ls) == 0 -> + {true,E2} when (length(Ls) =:= 0) -> encode_ids2(Cs,E2); {WildcardFound2,E2} -> encode_ids(W,Ls,Cs,8,[0|E2],WildcardFound2) @@ -288,7 +288,7 @@ %%---------------------------------------------------------------------- %% Decode ID with wildcards -decode_ids(Ws,IDs,Config) when list(Config) -> +decode_ids(Ws,IDs,Config) when is_list(Config) -> IDs1 = decode_ids(IDs,Config), Ws1 = decode_wildcards(Ws,(length(IDs)*8) - 1), decode_ids1(Ws1,IDs1); @@ -297,19 +297,19 @@ %% should be implemented. %% This is the case when each level is 8 bits = 1 byte and the config %% simply indicates the number of (1 byte) levels -decode_ids(Ws,IDs,Config) when integer(Config) -> +decode_ids(Ws,IDs,Config) when is_integer(Config) -> decode_ids(Ws,IDs,lists:duplicate(Config,8)). %% Decode ID without wildcards -decode_ids(E,Config) when list(Config) -> +decode_ids(E,Config) when is_list(Config) -> decode_ids(0,E,Config,[]); %% This is only temporary. Eventually a proper encoder for this case %% should be implemented. %% This is the case when each level is 8 bits = 1 byte and the config %% simply indicates the number of (1 byte) levels -decode_ids(E,Config) when integer(Config) -> +decode_ids(E,Config) when is_integer(Config) -> decode_ids(E,lists:duplicate(Config,8)). diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3a.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3a.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3a.erl 2009-03-12 12:32:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3a.erl 2009-09-18 15:13:17.000000000 +0100 @@ -59,7 +59,7 @@ verify_constraint(Item, valid) -> Item; -verify_constraint(Item, Constraint) when function(Constraint) -> +verify_constraint(Item, Constraint) when is_function(Constraint) -> Constraint(Item). tr_message(MegaMsg, Mode, Config) -> @@ -74,7 +74,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_MegacoMessage(MegaMsg, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -93,7 +93,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_Transaction(Trans, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -144,7 +144,7 @@ Val2 = case Tag of messageError -> tr_ErrorDescriptor(Val, State); - transactions when list(Val) -> [tr_Transaction(T, State) || T <- Val] + transactions when is_list(Val) -> [tr_Transaction(T, State) || T <- Val] end, {Tag, Val2}. @@ -217,7 +217,7 @@ tr_TransactionRequest(#'TransactionRequest'{transactionId = Id, actions = Actions}, - State) when list(Actions) -> + State) when is_list(Actions) -> #'TransactionRequest'{transactionId = tr_TransactionId(Id, State), actions = [tr_ActionRequest(ActReq, State) || ActReq <- Actions]}. @@ -253,7 +253,7 @@ case Tag of transactionError -> tr_ErrorDescriptor(Val, State); - actionReplies when list(Val), Val /= [] -> + actionReplies when is_list(Val) andalso (Val =/= []) -> [tr_ActionReply(ActRep, State) || ActRep <- Val] end, {Tag, Val2}. @@ -282,7 +282,7 @@ ?megaco_all_context_id -> ?megaco_all_context_id; ?megaco_null_context_id -> ?megaco_null_context_id; ?megaco_choose_context_id -> ?megaco_choose_context_id; - Int when integer(Int) -> tr_UINT32(Int, State) + Int when is_integer(Int) -> tr_UINT32(Int, State) end. tr_ActionRequest(#'ActionRequest'{contextId = CtxId, @@ -440,9 +440,9 @@ lists:reverse(Acc); tr_ammDescriptors([Desc|Descs], Acc, State) -> case tr_ammDescriptor(Desc, State) of - {_, deprecated} when State#state.mode == encode -> + {_, deprecated} when State#state.mode =:= encode -> error({deprecated, Desc}); - {_, deprecated} when State#state.mode == decode -> + {_, deprecated} when State#state.mode =:= decode -> %% SKIP tr_ammDescriptors(Descs, Acc, State); {_, deprecated} -> @@ -609,7 +609,7 @@ streams = S2}. tr_indAudTerminationStateDescriptor(Val, State) - when record(Val, 'IndAudTerminationStateDescriptor') -> + when is_record(Val, 'IndAudTerminationStateDescriptor') -> #'IndAudTerminationStateDescriptor'{propertyParms = Parms, eventBufferControl = EBC, serviceState = SS} = Val, @@ -660,7 +660,7 @@ statisticsDescriptor = SD2}. tr_indAudLocalControlDescriptor(Val, State) - when record(Val, 'IndAudLocalControlDescriptor') -> + when is_record(Val, 'IndAudLocalControlDescriptor') -> #'IndAudLocalControlDescriptor'{streamMode = M, reserveValue = V, reserveGroup = G, @@ -675,7 +675,7 @@ propertyParms = P2}. tr_indAudLocalControlDescriptor_propertyParms(Parms, State) - when list(Parms), length(Parms) > 0 -> + when is_list(Parms) andalso (length(Parms) > 0) -> [tr_indAudPropertyParm(Parm, State) || Parm <- Parms]; tr_indAudLocalControlDescriptor_propertyParms(asn1_NOVALUE, _State) -> asn1_NOVALUE. @@ -687,7 +687,7 @@ propGrps = tr_indAudPropertyGroup(Grps, State)}. -tr_indAudPropertyGroup(Grps, State) when list(Grps) -> +tr_indAudPropertyGroup(Grps, State) when is_list(Grps) -> [tr_indAudPropertyParm(Parm, State) || Parm <- Grps]. tr_indAudPropertyParm(#'IndAudPropertyParm'{name = Name0}, State) -> @@ -796,16 +796,16 @@ %% -- v2 end -- -tr_TerminationAudit(ParmList, State) when list(ParmList) -> +tr_TerminationAudit(ParmList, State) when is_list(ParmList) -> do_tr_TerminationAudit(ParmList, [], State). do_tr_TerminationAudit([], Acc, _State) -> lists:reverse(Acc); do_tr_TerminationAudit([Parm|ParmList], Acc, State) -> case tr_AuditReturnParameter(Parm, State) of - {_, deprecated} when State#state.mode == encode -> + {_, deprecated} when State#state.mode =:= encode -> error({deprecated, Parm}); - {_, deprecated} when State#state.mode == decode -> + {_, deprecated} when State#state.mode =:= decode -> %% SKIP do_tr_TerminationAudit(ParmList, Acc, State); {_, deprecated} -> @@ -871,7 +871,7 @@ tr_ObservedEventsDescriptor(#'ObservedEventsDescriptor'{requestId = Id, observedEventLst = Events}, - State) when list (Events) -> + State) when is_list(Events) -> #'ObservedEventsDescriptor'{requestId = tr_RequestID(Id, State), observedEventLst = [tr_ObservedEvent(E, State) || E <- Events]}. @@ -943,7 +943,7 @@ %% pathNAME = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) %% ["@" pathDomainName ] -tr_TerminationID(TermId, State) when State#state.mode /= verify -> +tr_TerminationID(TermId, State) when State#state.mode =/= verify -> resolve(term_id, TermId, State, valid); tr_TerminationID(#'TerminationID'{wildcard = Wild, id = Id}, @@ -966,7 +966,7 @@ case Sub of all -> all; choose -> choose; - Char when integer(Char) -> Char + Char when is_integer(Char) -> Char end. %% mediaDescriptor = MediaToken LBRKT mediaParm *(COMMA mediaParm) RBRKT @@ -1247,7 +1247,7 @@ tr_opt_SignalsDescriptor(SigDesc, State) -> tr_SignalsDescriptor(SigDesc, State). -tr_SignalsDescriptor(SigDesc, State) when list(SigDesc) -> +tr_SignalsDescriptor(SigDesc, State) when is_list(SigDesc) -> [tr_SignalRequest(SigReq, State) || SigReq <- SigDesc]. tr_SignalRequest({Tag, Val}, State) -> @@ -1261,7 +1261,7 @@ tr_SeqSigList(#'SeqSigList'{id = Id, signalList = SigList}, - State) when list(SigList) -> + State) when is_list(SigList) -> #'SeqSigList'{id = tr_UINT16(Id, State), signalList = [tr_Signal(Sig, State) || Sig <- SigList]}. @@ -1301,7 +1301,7 @@ tr_opt_NotifyCompletion(asn1_NOVALUE, _State) -> asn1_NOVALUE; -tr_opt_NotifyCompletion(Items, State) when list(Items) -> +tr_opt_NotifyCompletion(Items, State) when is_list(Items) -> [tr_notifyCompletionItem(I, State) || I <- Items]. tr_notifyCompletionItem(Item, _State) -> @@ -1350,7 +1350,7 @@ tr_opt_RequestID(Id, State) -> tr_RequestID(Id, State). -tr_RequestID(Id, _State) when Id == ?megaco_all_request_id -> +tr_RequestID(Id, _State) when Id =:= ?megaco_all_request_id -> ?megaco_all_request_id; tr_RequestID(Id, State) -> tr_UINT32(Id, State). @@ -1493,7 +1493,7 @@ tr_opt_portNumber(Port, State) -> tr_portNumber(Port, State). -tr_portNumber(Port, State) when integer(Port), Port >= 0 -> +tr_portNumber(Port, State) when is_integer(Port) andalso (Port >= 0) -> tr_UINT16(Port, State). tr_ServiceChangeResParm(#'ServiceChangeResParm'{serviceChangeMgcId = MgcId, @@ -1508,7 +1508,7 @@ serviceChangeProfile = tr_opt_ServiceChangeProfile(Profile, State), timeStamp = tr_opt_TimeNotation(Time, State)}. -tr_PackagesDescriptor(Items, State) when list(Items) -> +tr_PackagesDescriptor(Items, State) when is_list(Items) -> [tr_PackagesItem(I, State) || I <- Items]. tr_PackagesItem(#'PackagesItem'{packageName = Name, @@ -1523,7 +1523,7 @@ tr_opt_StatisticsDescriptor(Parms, State) -> tr_StatisticsDescriptor(Parms, State). -tr_StatisticsDescriptor(Parms, State) when list(Parms) -> +tr_StatisticsDescriptor(Parms, State) when is_list(Parms) -> [tr_StatisticsParameter(P, State) || P <- Parms]. tr_StatisticsParameter(#'StatisticsParameter'{statName = Name, @@ -1550,34 +1550,34 @@ tr_opt_Value(Value, State) -> tr_Value(Value, State). -tr_Value(Strings, _State) when list(Strings) -> +tr_Value(Strings, _State) when is_list(Strings) -> [[Char || Char <- String] || String <- Strings]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Encode an octet string, escape } by \ if necessary -tr_OCTET_STRING(String, _State, Min, Max) when list(String) -> +tr_OCTET_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. -tr_QUOTED_STRING(String, _State) when list(String) -> +tr_QUOTED_STRING(String, _State) when is_list(String) -> verify_count(length(String), 1, infinity), String. %% The internal format of hex digits is a list of octets %% Min and Max means #hexDigits %% Leading zeros are prepended in order to fulfill Min -tr_HEXDIG(Octets, _State, Min, Max) when list(Octets) -> +tr_HEXDIG(Octets, _State, Min, Max) when is_list(Octets) -> verify_count(length(Octets), Min, Max), Octets. tr_DIGIT(Val, State, Min, Max) -> tr_integer(Val, State, Min, Max). -tr_STRING(String, _State) when list(String) -> +tr_STRING(String, _State) when is_list(String) -> String. -tr_STRING(String, _State, Min, Max) when list(String) -> +tr_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. @@ -1602,13 +1602,13 @@ %% Verify that Count is within the range of Min and Max verify_count(Count, Min, Max) -> if - integer(Count) -> + is_integer(Count) -> if - integer(Min), Count >= Min -> + is_integer(Min) andalso (Count >= Min) -> if - integer(Max), Count =< Max -> + is_integer(Max) andalso (Count =< Max) -> Count; - Max == infinity -> + Max =:= infinity -> Count; true -> error({count_too_large, Count, Max}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3b.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3b.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3b.erl 2009-03-12 12:32:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3b.erl 2009-09-18 15:13:23.000000000 +0100 @@ -59,7 +59,7 @@ verify_constraint(Item, valid) -> Item; -verify_constraint(Item, Constraint) when function(Constraint) -> +verify_constraint(Item, Constraint) when is_function(Constraint) -> Constraint(Item). tr_message(MegaMsg, Mode, Config) -> @@ -74,7 +74,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_MegacoMessage(MegaMsg, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -93,7 +93,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_Transaction(Trans, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -144,7 +144,7 @@ Val2 = case Tag of messageError -> tr_ErrorDescriptor(Val, State); - transactions when list(Val) -> [tr_Transaction(T, State) || T <- Val] + transactions when is_list(Val) -> [tr_Transaction(T, State) || T <- Val] end, {Tag, Val2}. @@ -217,7 +217,7 @@ tr_TransactionRequest(#'TransactionRequest'{transactionId = Id, actions = Actions}, - State) when list(Actions) -> + State) when is_list(Actions) -> #'TransactionRequest'{transactionId = tr_TransactionId(Id, State), actions = [tr_ActionRequest(ActReq, State) || ActReq <- Actions]}. @@ -253,7 +253,7 @@ case Tag of transactionError -> tr_ErrorDescriptor(Val, State); - actionReplies when list(Val), Val /= [] -> + actionReplies when is_list(Val) andalso (Val =/= []) -> [tr_ActionReply(ActRep, State) || ActRep <- Val] end, {Tag, Val2}. @@ -282,7 +282,7 @@ ?megaco_all_context_id -> ?megaco_all_context_id; ?megaco_null_context_id -> ?megaco_null_context_id; ?megaco_choose_context_id -> ?megaco_choose_context_id; - Int when integer(Int) -> tr_UINT32(Int, State) + Int when is_integer(Int) -> tr_UINT32(Int, State) end. tr_ActionRequest(#'ActionRequest'{contextId = CtxId, @@ -440,9 +440,9 @@ lists:reverse(Acc); tr_ammDescriptors([Desc|Descs], Acc, State) -> case tr_ammDescriptor(Desc, State) of - {_, deprecated} when State#state.mode == encode -> + {_, deprecated} when State#state.mode =:= encode -> error({deprecated, Desc}); - {_, deprecated} when State#state.mode == decode -> + {_, deprecated} when State#state.mode =:= decode -> %% SKIP tr_ammDescriptors(Descs, Acc, State); {_, deprecated} -> @@ -609,7 +609,7 @@ streams = S2}. tr_indAudTerminationStateDescriptor(Val, State) - when record(Val, 'IndAudTerminationStateDescriptor') -> + when is_record(Val, 'IndAudTerminationStateDescriptor') -> #'IndAudTerminationStateDescriptor'{propertyParms = Parms, eventBufferControl = EBC, serviceState = SS} = Val, @@ -660,7 +660,7 @@ statisticsDescriptor = SD2}. tr_indAudLocalControlDescriptor(Val, State) - when record(Val, 'IndAudLocalControlDescriptor') -> + when is_record(Val, 'IndAudLocalControlDescriptor') -> #'IndAudLocalControlDescriptor'{streamMode = M, reserveValue = V, reserveGroup = G, @@ -675,7 +675,7 @@ propertyParms = P2}. tr_indAudLocalControlDescriptor_propertyParms(Parms, State) - when list(Parms), length(Parms) > 0 -> + when is_list(Parms) andalso (length(Parms) > 0) -> [tr_indAudPropertyParm(Parm, State) || Parm <- Parms]; tr_indAudLocalControlDescriptor_propertyParms(asn1_NOVALUE, _State) -> asn1_NOVALUE. @@ -687,7 +687,7 @@ propGrps = tr_indAudPropertyGroup(Grps, State)}. -tr_indAudPropertyGroup(Grps, State) when list(Grps) -> +tr_indAudPropertyGroup(Grps, State) when is_list(Grps) -> [tr_indAudPropertyParm(Parm, State) || Parm <- Grps]. tr_indAudPropertyParm(#'IndAudPropertyParm'{name = Name0}, State) -> @@ -796,16 +796,16 @@ %% -- v2 end -- -tr_TerminationAudit(ParmList, State) when list(ParmList) -> +tr_TerminationAudit(ParmList, State) when is_list(ParmList) -> do_tr_TerminationAudit(ParmList, [], State). do_tr_TerminationAudit([], Acc, _State) -> lists:reverse(Acc); do_tr_TerminationAudit([Parm|ParmList], Acc, State) -> case tr_AuditReturnParameter(Parm, State) of - {_, deprecated} when State#state.mode == encode -> + {_, deprecated} when State#state.mode =:= encode -> error({deprecated, Parm}); - {_, deprecated} when State#state.mode == decode -> + {_, deprecated} when State#state.mode =:= decode -> %% SKIP do_tr_TerminationAudit(ParmList, Acc, State); {_, deprecated} -> @@ -871,7 +871,7 @@ tr_ObservedEventsDescriptor(#'ObservedEventsDescriptor'{requestId = Id, observedEventLst = Events}, - State) when list (Events) -> + State) when is_list(Events) -> #'ObservedEventsDescriptor'{requestId = tr_RequestID(Id, State), observedEventLst = [tr_ObservedEvent(E, State) || E <- Events]}. @@ -943,7 +943,7 @@ %% pathNAME = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) %% ["@" pathDomainName ] -tr_TerminationID(TermId, State) when State#state.mode /= verify -> +tr_TerminationID(TermId, State) when State#state.mode =/= verify -> resolve(term_id, TermId, State, valid); tr_TerminationID(#'TerminationID'{wildcard = Wild, id = Id}, @@ -966,7 +966,7 @@ case Sub of all -> all; choose -> choose; - Char when integer(Char) -> Char + Char when is_integer(Char) -> Char end. %% mediaDescriptor = MediaToken LBRKT mediaParm *(COMMA mediaParm) RBRKT @@ -1247,7 +1247,7 @@ tr_opt_SignalsDescriptor(SigDesc, State) -> tr_SignalsDescriptor(SigDesc, State). -tr_SignalsDescriptor(SigDesc, State) when list(SigDesc) -> +tr_SignalsDescriptor(SigDesc, State) when is_list(SigDesc) -> [tr_SignalRequest(SigReq, State) || SigReq <- SigDesc]. tr_SignalRequest({Tag, Val}, State) -> @@ -1261,7 +1261,7 @@ tr_SeqSigList(#'SeqSigList'{id = Id, signalList = SigList}, - State) when list(SigList) -> + State) when is_list(SigList) -> #'SeqSigList'{id = tr_UINT16(Id, State), signalList = [tr_Signal(Sig, State) || Sig <- SigList]}. @@ -1301,7 +1301,7 @@ tr_opt_NotifyCompletion(asn1_NOVALUE, _State) -> asn1_NOVALUE; -tr_opt_NotifyCompletion(Items, State) when list(Items) -> +tr_opt_NotifyCompletion(Items, State) when is_list(Items) -> [tr_notifyCompletionItem(I, State) || I <- Items]. tr_notifyCompletionItem(Item, _State) -> @@ -1350,7 +1350,7 @@ tr_opt_RequestID(Id, State) -> tr_RequestID(Id, State). -tr_RequestID(Id, _State) when Id == ?megaco_all_request_id -> +tr_RequestID(Id, _State) when Id =:= ?megaco_all_request_id -> ?megaco_all_request_id; tr_RequestID(Id, State) -> tr_UINT32(Id, State). @@ -1493,7 +1493,7 @@ tr_opt_portNumber(Port, State) -> tr_portNumber(Port, State). -tr_portNumber(Port, State) when integer(Port), Port >= 0 -> +tr_portNumber(Port, State) when is_integer(Port) andalso (Port >= 0) -> tr_UINT16(Port, State). tr_ServiceChangeResParm(#'ServiceChangeResParm'{serviceChangeMgcId = MgcId, @@ -1508,7 +1508,7 @@ serviceChangeProfile = tr_opt_ServiceChangeProfile(Profile, State), timeStamp = tr_opt_TimeNotation(Time, State)}. -tr_PackagesDescriptor(Items, State) when list(Items) -> +tr_PackagesDescriptor(Items, State) when is_list(Items) -> [tr_PackagesItem(I, State) || I <- Items]. tr_PackagesItem(#'PackagesItem'{packageName = Name, @@ -1523,7 +1523,7 @@ tr_opt_StatisticsDescriptor(Parms, State) -> tr_StatisticsDescriptor(Parms, State). -tr_StatisticsDescriptor(Parms, State) when list(Parms) -> +tr_StatisticsDescriptor(Parms, State) when is_list(Parms) -> [tr_StatisticsParameter(P, State) || P <- Parms]. tr_StatisticsParameter(#'StatisticsParameter'{statName = Name, @@ -1550,34 +1550,34 @@ tr_opt_Value(Value, State) -> tr_Value(Value, State). -tr_Value(Strings, _State) when list(Strings) -> +tr_Value(Strings, _State) when is_list(Strings) -> [[Char || Char <- String] || String <- Strings]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Encode an octet string, escape } by \ if necessary -tr_OCTET_STRING(String, _State, Min, Max) when list(String) -> +tr_OCTET_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. -tr_QUOTED_STRING(String, _State) when list(String) -> +tr_QUOTED_STRING(String, _State) when is_list(String) -> verify_count(length(String), 1, infinity), String. %% The internal format of hex digits is a list of octets %% Min and Max means #hexDigits %% Leading zeros are prepended in order to fulfill Min -tr_HEXDIG(Octets, _State, Min, Max) when list(Octets) -> +tr_HEXDIG(Octets, _State, Min, Max) when is_list(Octets) -> verify_count(length(Octets), Min, Max), Octets. tr_DIGIT(Val, State, Min, Max) -> tr_integer(Val, State, Min, Max). -tr_STRING(String, _State) when list(String) -> +tr_STRING(String, _State) when is_list(String) -> String. -tr_STRING(String, _State, Min, Max) when list(String) -> +tr_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. @@ -1602,13 +1602,13 @@ %% Verify that Count is within the range of Min and Max verify_count(Count, Min, Max) -> if - integer(Count) -> + is_integer(Count) -> if - integer(Min), Count >= Min -> + is_integer(Min) andalso (Count >= Min) -> if - integer(Max), Count =< Max -> + is_integer(Max) andalso (Count =< Max) -> Count; - Max == infinity -> + Max =:= infinity -> Count; true -> error({count_too_large, Count, Max}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3c.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3c.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3c.erl 2009-03-12 12:32:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_prev3c.erl 2009-09-18 15:13:26.000000000 +0100 @@ -59,7 +59,7 @@ verify_constraint(Item, valid) -> Item; -verify_constraint(Item, Constraint) when function(Constraint) -> +verify_constraint(Item, Constraint) when is_function(Constraint) -> Constraint(Item). tr_message(MegaMsg, Mode, Config) -> @@ -74,7 +74,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_MegacoMessage(MegaMsg, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -93,7 +93,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_Transaction(Trans, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -144,7 +144,7 @@ Val2 = case Tag of messageError -> tr_ErrorDescriptor(Val, State); - transactions when list(Val) -> [tr_Transaction(T, State) || T <- Val] + transactions when is_list(Val) -> [tr_Transaction(T, State) || T <- Val] end, {Tag, Val2}. @@ -217,7 +217,7 @@ tr_TransactionRequest(#'TransactionRequest'{transactionId = Id, actions = Actions}, - State) when list(Actions) -> + State) when is_list(Actions) -> #'TransactionRequest'{transactionId = tr_TransactionId(Id, State), actions = [tr_ActionRequest(ActReq, State) || ActReq <- Actions]}. @@ -253,7 +253,7 @@ case Tag of transactionError -> tr_ErrorDescriptor(Val, State); - actionReplies when list(Val), Val /= [] -> + actionReplies when is_list(Val) andalso (Val =/= []) -> [tr_ActionReply(ActRep, State) || ActRep <- Val] end, {Tag, Val2}. @@ -282,7 +282,7 @@ ?megaco_all_context_id -> ?megaco_all_context_id; ?megaco_null_context_id -> ?megaco_null_context_id; ?megaco_choose_context_id -> ?megaco_choose_context_id; - Int when integer(Int) -> tr_UINT32(Int, State) + Int when is_integer(Int) -> tr_UINT32(Int, State) end. tr_ActionRequest(#'ActionRequest'{contextId = CtxId, @@ -492,9 +492,9 @@ lists:reverse(Acc); tr_ammDescriptors([Desc|Descs], Acc, State) -> case tr_ammDescriptor(Desc, State) of - {_, deprecated} when State#state.mode == encode -> + {_, deprecated} when State#state.mode =:= encode -> error({deprecated, Desc}); - {_, deprecated} when State#state.mode == decode -> + {_, deprecated} when State#state.mode =:= decode -> %% SKIP tr_ammDescriptors(Descs, Acc, State); {_, deprecated} -> @@ -680,7 +680,7 @@ streams = S2}. tr_indAudTerminationStateDescriptor(Val, State) - when record(Val, 'IndAudTerminationStateDescriptor') -> + when is_record(Val, 'IndAudTerminationStateDescriptor') -> #'IndAudTerminationStateDescriptor'{propertyParms = Parms, eventBufferControl = EBC, serviceState = SS, @@ -734,7 +734,7 @@ statisticsDescriptor = SD2}. tr_indAudLocalControlDescriptor(Val, State) - when record(Val, 'IndAudLocalControlDescriptor') -> + when is_record(Val, 'IndAudLocalControlDescriptor') -> #'IndAudLocalControlDescriptor'{streamMode = M, reserveValue = V, reserveGroup = G, @@ -752,7 +752,7 @@ streamModeSel = SMS2}. tr_indAudLocalControlDescriptor_propertyParms(Parms, State) - when list(Parms), length(Parms) > 0 -> + when is_list(Parms) andalso (length(Parms) > 0) -> [tr_indAudPropertyParm(Parm, State) || Parm <- Parms]; tr_indAudLocalControlDescriptor_propertyParms(asn1_NOVALUE, _State) -> asn1_NOVALUE. @@ -764,7 +764,7 @@ propGrps = tr_indAudPropertyGroup(Grps, State)}. -tr_indAudPropertyGroup(Grps, State) when list(Grps) -> +tr_indAudPropertyGroup(Grps, State) when is_list(Grps) -> [tr_indAudPropertyParm(Parm, State) || Parm <- Grps]. tr_indAudPropertyParm(#'IndAudPropertyParm'{name = Name0, @@ -882,16 +882,16 @@ %% -- v2 end -- -tr_TerminationAudit(ParmList, State) when list(ParmList) -> +tr_TerminationAudit(ParmList, State) when is_list(ParmList) -> do_tr_TerminationAudit(ParmList, [], State). do_tr_TerminationAudit([], Acc, _State) -> lists:reverse(Acc); do_tr_TerminationAudit([Parm|ParmList], Acc, State) -> case tr_AuditReturnParameter(Parm, State) of - {_, deprecated} when State#state.mode == encode -> + {_, deprecated} when State#state.mode =:= encode -> error({deprecated, Parm}); - {_, deprecated} when State#state.mode == decode -> + {_, deprecated} when State#state.mode =:= decode -> %% SKIP do_tr_TerminationAudit(ParmList, Acc, State); {_, deprecated} -> @@ -959,7 +959,7 @@ tr_ObservedEventsDescriptor(#'ObservedEventsDescriptor'{requestId = Id, observedEventLst = Events}, - State) when list (Events) -> + State) when is_list(Events) -> #'ObservedEventsDescriptor'{requestId = tr_RequestID(Id, State), observedEventLst = [tr_ObservedEvent(E, State) || E <- Events]}. @@ -1031,7 +1031,7 @@ %% pathNAME = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) %% ["@" pathDomainName ] -tr_TerminationID(TermId, State) when State#state.mode /= verify -> +tr_TerminationID(TermId, State) when State#state.mode =/= verify -> resolve(term_id, TermId, State, valid); tr_TerminationID(#'TerminationID'{wildcard = Wild, id = Id}, @@ -1054,7 +1054,7 @@ case Sub of all -> all; choose -> choose; - Char when integer(Char) -> Char + Char when is_integer(Char) -> Char end. %% mediaDescriptor = MediaToken LBRKT mediaParm *(COMMA mediaParm) RBRKT @@ -1375,7 +1375,7 @@ tr_opt_SignalsDescriptor(SigDesc, State) -> tr_SignalsDescriptor(SigDesc, State). -tr_SignalsDescriptor(SigDesc, State) when list(SigDesc) -> +tr_SignalsDescriptor(SigDesc, State) when is_list(SigDesc) -> [tr_SignalRequest(SigReq, State) || SigReq <- SigDesc]. tr_SignalRequest({Tag, Val}, State) -> @@ -1389,7 +1389,7 @@ tr_SeqSigList(#'SeqSigList'{id = Id, signalList = SigList}, - State) when list(SigList) -> + State) when is_list(SigList) -> #'SeqSigList'{id = tr_UINT16(Id, State), signalList = [tr_Signal(Sig, State) || Sig <- SigList]}. @@ -1427,7 +1427,7 @@ tr_opt_NotifyCompletion(asn1_NOVALUE, _State) -> asn1_NOVALUE; -tr_opt_NotifyCompletion(Items, State) when list(Items) -> +tr_opt_NotifyCompletion(Items, State) when is_list(Items) -> [tr_notifyCompletionItem(I, State) || I <- Items]. tr_notifyCompletionItem(Item, _State) -> @@ -1477,7 +1477,7 @@ tr_opt_RequestID(Id, State) -> tr_RequestID(Id, State). -tr_RequestID(Id, _State) when Id == ?megaco_all_request_id -> +tr_RequestID(Id, _State) when Id =:= ?megaco_all_request_id -> ?megaco_all_request_id; tr_RequestID(Id, State) -> tr_UINT32(Id, State). @@ -1620,7 +1620,7 @@ tr_opt_portNumber(Port, State) -> tr_portNumber(Port, State). -tr_portNumber(Port, State) when integer(Port), Port >= 0 -> +tr_portNumber(Port, State) when is_integer(Port) andalso (Port >= 0) -> tr_UINT16(Port, State). tr_ServiceChangeResParm(#'ServiceChangeResParm'{serviceChangeMgcId = MgcId, @@ -1635,7 +1635,7 @@ serviceChangeProfile = tr_opt_ServiceChangeProfile(Profile, State), timeStamp = tr_opt_TimeNotation(Time, State)}. -tr_PackagesDescriptor(Items, State) when list(Items) -> +tr_PackagesDescriptor(Items, State) when is_list(Items) -> [tr_PackagesItem(I, State) || I <- Items]. tr_PackagesItem(#'PackagesItem'{packageName = Name, @@ -1650,7 +1650,7 @@ tr_opt_StatisticsDescriptor(Parms, State) -> tr_StatisticsDescriptor(Parms, State). -tr_StatisticsDescriptor(Parms, State) when list(Parms) -> +tr_StatisticsDescriptor(Parms, State) when is_list(Parms) -> [tr_StatisticsParameter(P, State) || P <- Parms]. tr_StatisticsParameter(#'StatisticsParameter'{statName = Name, @@ -1677,34 +1677,34 @@ tr_opt_Value(Value, State) -> tr_Value(Value, State). -tr_Value(Strings, _State) when list(Strings) -> +tr_Value(Strings, _State) when is_list(Strings) -> [[Char || Char <- String] || String <- Strings]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Encode an octet string, escape } by \ if necessary -tr_OCTET_STRING(String, _State, Min, Max) when list(String) -> +tr_OCTET_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. -tr_QUOTED_STRING(String, _State) when list(String) -> +tr_QUOTED_STRING(String, _State) when is_list(String) -> verify_count(length(String), 1, infinity), String. %% The internal format of hex digits is a list of octets %% Min and Max means #hexDigits %% Leading zeros are prepended in order to fulfill Min -tr_HEXDIG(Octets, _State, Min, Max) when list(Octets) -> +tr_HEXDIG(Octets, _State, Min, Max) when is_list(Octets) -> verify_count(length(Octets), Min, Max), Octets. tr_DIGIT(Val, State, Min, Max) -> tr_integer(Val, State, Min, Max). -tr_STRING(String, _State) when list(String) -> +tr_STRING(String, _State) when is_list(String) -> String. -tr_STRING(String, _State, Min, Max) when list(String) -> +tr_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. @@ -1729,13 +1729,13 @@ %% Verify that Count is within the range of Min and Max verify_count(Count, Min, Max) -> if - integer(Count) -> + is_integer(Count) -> if - integer(Min), Count >= Min -> + is_integer(Min) andalso (Count >= Min) -> if - integer(Max), Count =< Max -> + is_integer(Max) andalso (Count =< Max) -> Count; - Max == infinity -> + Max =:= infinity -> Count; true -> error({count_too_large, Count, Max}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v1.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v1.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v1.erl 2009-03-12 12:30:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v1.erl 2009-09-18 15:12:50.000000000 +0100 @@ -58,7 +58,7 @@ verify_constraint(Item, valid) -> Item; -verify_constraint(Item, Constraint) when function(Constraint) -> +verify_constraint(Item, Constraint) when is_function(Constraint) -> Constraint(Item). tr_message(MegaMsg, Mode, Config) -> @@ -73,7 +73,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_MegacoMessage(MegaMsg, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -92,7 +92,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_Transaction(Trans, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -139,7 +139,7 @@ Val2 = case Tag of messageError -> tr_ErrorDescriptor(Val, State); - transactions when list(Val) -> [tr_Transaction(T, State) || T <- Val] + transactions when is_list(Val) -> [tr_Transaction(T, State) || T <- Val] end, {Tag, Val2}. @@ -212,7 +212,7 @@ tr_TransactionRequest(#'TransactionRequest'{transactionId = Id, actions = Actions}, - State) when list(Actions) -> + State) when is_list(Actions) -> #'TransactionRequest'{transactionId = tr_TransactionId(Id, State), actions = [tr_ActionRequest(ActReq, State) || ActReq <- Actions]}. @@ -237,7 +237,7 @@ case Tag of transactionError -> tr_ErrorDescriptor(Val, State); - actionReplies when list(Val), Val /= [] -> + actionReplies when is_list(Val) andalso (Val =/= []) -> [tr_ActionReply(ActRep, State) || ActRep <- Val] end, {Tag, Val2}. @@ -266,7 +266,7 @@ ?megaco_all_context_id -> ?megaco_all_context_id; ?megaco_null_context_id -> ?megaco_null_context_id; ?megaco_choose_context_id -> ?megaco_choose_context_id; - Int when integer(Int) -> tr_UINT32(Int, State) + Int when is_integer(Int) -> tr_UINT32(Int, State) end. tr_ActionRequest(#'ActionRequest'{contextId = CtxId, @@ -479,7 +479,7 @@ eventBufferToken -> eventBufferToken end. -tr_TerminationAudit(ParmList, State) when list(ParmList) -> +tr_TerminationAudit(ParmList, State) when is_list(ParmList) -> [tr_AuditReturnParameter(Parm, State) || Parm <- ParmList]. tr_AuditReturnParameter({Tag, Val}, State) -> @@ -538,7 +538,7 @@ tr_ObservedEventsDescriptor(#'ObservedEventsDescriptor'{requestId = Id, observedEventLst = Events}, - State) when list (Events) -> + State) when is_list(Events) -> #'ObservedEventsDescriptor'{requestId = tr_RequestID(Id, State), observedEventLst = [tr_ObservedEvent(E, State) || E <- Events]}. @@ -610,7 +610,7 @@ %% pathNAME = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) %% ["@" pathDomainName ] -tr_TerminationID(TermId, State) when State#state.mode /= verify -> +tr_TerminationID(TermId, State) when State#state.mode =/= verify -> resolve(term_id, TermId, State, valid); tr_TerminationID(#'TerminationID'{wildcard = Wild, id = Id}, @@ -633,7 +633,7 @@ case Sub of all -> all; choose -> choose; - Char when integer(Char) -> Char + Char when is_integer(Char) -> Char end. %% mediaDescriptor = MediaToken LBRKT mediaParm *(COMMA mediaParm) RBRKT @@ -908,7 +908,7 @@ tr_opt_SignalsDescriptor(SigDesc, State) -> tr_SignalsDescriptor(SigDesc, State). -tr_SignalsDescriptor(SigDesc, State) when list(SigDesc) -> +tr_SignalsDescriptor(SigDesc, State) when is_list(SigDesc) -> [tr_SignalRequest(SigReq, State) || SigReq <- SigDesc]. tr_SignalRequest({Tag, Val}, State) -> @@ -922,7 +922,7 @@ tr_SeqSigList(#'SeqSigList'{id = Id, signalList = SigList}, - State) when list(SigList) -> + State) when is_list(SigList) -> #'SeqSigList'{id = tr_UINT16(Id, State), signalList = [tr_Signal(Sig, State) || Sig <- SigList]}. @@ -949,7 +949,7 @@ tr_opt_NotifyCompletion(asn1_NOVALUE, _State) -> asn1_NOVALUE; -tr_opt_NotifyCompletion(Items, State) when list(Items) -> +tr_opt_NotifyCompletion(Items, State) when is_list(Items) -> [tr_notifyCompletionItem(I, State) || I <- Items]. tr_notifyCompletionItem(Item, _State) -> @@ -988,14 +988,14 @@ tr_opt_RequestID(Id, State) -> tr_RequestID(Id, State). -tr_RequestID(Id, _State) when Id == ?megaco_all_request_id -> +tr_RequestID(Id, _State) when Id =:= ?megaco_all_request_id -> ?megaco_all_request_id; tr_RequestID(Id, State) -> tr_UINT32(Id, State). tr_ModemDescriptor(#'ModemDescriptor'{mtl = Types, mpl = Props}, - State) when list(Types), list(Props) -> + State) when is_list(Types) andalso is_list(Props) -> %% BUGBUG: Does not handle extensionParameter #'ModemDescriptor'{mtl = [tr_ModemType(T, State) || T <- Types], mpl = [tr_PropertyParm(P, State) || P <- Props]}. @@ -1134,7 +1134,7 @@ tr_opt_portNumber(Port, State) -> tr_portNumber(Port, State). -tr_portNumber(Port, State) when integer(Port), Port >= 0 -> +tr_portNumber(Port, State) when is_integer(Port) andalso (Port >= 0) -> tr_UINT16(Port, State). tr_ServiceChangeResParm(#'ServiceChangeResParm'{serviceChangeMgcId = MgcId, @@ -1149,7 +1149,7 @@ serviceChangeProfile = tr_opt_ServiceChangeProfile(Profile, State), timeStamp = tr_opt_TimeNotation(Time, State)}. -tr_PackagesDescriptor(Items, State) when list(Items) -> +tr_PackagesDescriptor(Items, State) when is_list(Items) -> [tr_PackagesItem(I, State) || I <- Items]. tr_PackagesItem(#'PackagesItem'{packageName = Name, @@ -1159,7 +1159,7 @@ #'PackagesItem'{packageName = resolve(package, Name, State, Constraint), packageVersion = tr_UINT16(Version, State)}. -tr_StatisticsDescriptor(Parms, State) when list(Parms) -> +tr_StatisticsDescriptor(Parms, State) when is_list(Parms) -> [tr_StatisticsParameter(P, State) || P <- Parms]. tr_StatisticsParameter(#'StatisticsParameter'{statName = Name, @@ -1186,34 +1186,34 @@ tr_opt_Value(Value, State) -> tr_Value(Value, State). -tr_Value(Strings, _State) when list(Strings) -> +tr_Value(Strings, _State) when is_list(Strings) -> [[Char || Char <- String] || String <- Strings]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Encode an octet string, escape } by \ if necessary -tr_OCTET_STRING(String, _State, Min, Max) when list(String) -> +tr_OCTET_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. -tr_QUOTED_STRING(String, _State) when list(String) -> +tr_QUOTED_STRING(String, _State) when is_list(String) -> verify_count(length(String), 1, infinity), String. %% The internal format of hex digits is a list of octets %% Min and Max means #hexDigits %% Leading zeros are prepended in order to fulfill Min -tr_HEXDIG(Octets, _State, Min, Max) when list(Octets) -> +tr_HEXDIG(Octets, _State, Min, Max) when is_list(Octets) -> verify_count(length(Octets), Min, Max), Octets. tr_DIGIT(Val, State, Min, Max) -> tr_integer(Val, State, Min, Max). -tr_STRING(String, _State) when list(String) -> +tr_STRING(String, _State) when is_list(String) -> String. -tr_STRING(String, _State, Min, Max) when list(String) -> +tr_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. @@ -1230,13 +1230,13 @@ %% Verify that Count is within the range of Min and Max verify_count(Count, Min, Max) -> if - integer(Count) -> + is_integer(Count) -> if - integer(Min), Count >= Min -> + is_integer(Min) andalso (Count >= Min) -> if - integer(Max), Count =< Max -> + is_integer(Max) andalso (Count =< Max) -> Count; - Max == infinity -> + Max =:= infinity -> Count; true -> ?error({count_too_large, Count, Max}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v2.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v2.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v2.erl 2009-03-12 12:31:20.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v2.erl 2009-09-18 15:13:07.000000000 +0100 @@ -59,7 +59,7 @@ verify_constraint(Item, valid) -> Item; -verify_constraint(Item, Constraint) when function(Constraint) -> +verify_constraint(Item, Constraint) when is_function(Constraint) -> Constraint(Item). tr_message(MegaMsg, Mode, Config) -> @@ -74,7 +74,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_MegacoMessage(MegaMsg, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -93,7 +93,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_Transaction(Trans, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -144,7 +144,7 @@ Val2 = case Tag of messageError -> tr_ErrorDescriptor(Val, State); - transactions when list(Val) -> [tr_Transaction(T, State) || T <- Val] + transactions when is_list(Val) -> [tr_Transaction(T, State) || T <- Val] end, {Tag, Val2}. @@ -217,7 +217,7 @@ tr_TransactionRequest(#'TransactionRequest'{transactionId = Id, actions = Actions}, - State) when list(Actions) -> + State) when is_list(Actions) -> #'TransactionRequest'{transactionId = tr_TransactionId(Id, State), actions = [tr_ActionRequest(ActReq, State) || ActReq <- Actions]}. @@ -242,7 +242,7 @@ case Tag of transactionError -> tr_ErrorDescriptor(Val, State); - actionReplies when list(Val), Val /= [] -> + actionReplies when is_list(Val) andalso (Val =/= []) -> [tr_ActionReply(ActRep, State) || ActRep <- Val] end, {Tag, Val2}. @@ -271,7 +271,7 @@ ?megaco_all_context_id -> ?megaco_all_context_id; ?megaco_null_context_id -> ?megaco_null_context_id; ?megaco_choose_context_id -> ?megaco_choose_context_id; - Int when integer(Int) -> tr_UINT32(Int, State) + Int when is_integer(Int) -> tr_UINT32(Int, State) end. tr_ActionRequest(#'ActionRequest'{contextId = CtxId, @@ -393,9 +393,9 @@ lists:reverse(Acc); tr_ammDescriptors([Desc|Descs], Acc, State) -> case tr_ammDescriptor(Desc, State) of - {_, deprecated} when State#state.mode == encode -> + {_, deprecated} when State#state.mode =:= encode -> ?error({deprecated, Desc}); - {_, deprecated} when State#state.mode == decode -> + {_, deprecated} when State#state.mode =:= decode -> %% SKIP tr_ammDescriptors(Descs, Acc, State); {_, deprecated} -> @@ -561,7 +561,7 @@ streams = S2}. tr_indAudTerminationStateDescriptor(Val, State) - when record(Val, 'IndAudTerminationStateDescriptor') -> + when is_record(Val, 'IndAudTerminationStateDescriptor') -> #'IndAudTerminationStateDescriptor'{propertyParms = Parms, eventBufferControl = EBC, serviceState = SS} = Val, @@ -603,7 +603,7 @@ remoteDescriptor = RD2}. tr_indAudLocalControlDescriptor(Val, State) - when record(Val, 'IndAudLocalControlDescriptor') -> + when is_record(Val, 'IndAudLocalControlDescriptor') -> #'IndAudLocalControlDescriptor'{streamMode = M, reserveValue = V, reserveGroup = G, @@ -618,7 +618,7 @@ propertyParms = P2}. tr_indAudLocalControlDescriptor_propertyParms(Parms, State) - when list(Parms), length(Parms) > 0 -> + when is_list(Parms) andalso (length(Parms) > 0) -> [tr_indAudPropertyParm(Parm, State) || Parm <- Parms]; tr_indAudLocalControlDescriptor_propertyParms(asn1_NOVALUE, _State) -> asn1_NOVALUE. @@ -630,7 +630,7 @@ propGrps = tr_indAudPropertyGroup(Grps, State)}. -tr_indAudPropertyGroup(Grps, State) when list(Grps) -> +tr_indAudPropertyGroup(Grps, State) when is_list(Grps) -> [tr_indAudPropertyParm(Parm, State) || Parm <- Grps]. tr_indAudPropertyParm(#'IndAudPropertyParm'{name = Name0}, State) -> @@ -740,16 +740,16 @@ %% -- v2 end -- -tr_TerminationAudit(ParmList, State) when list(ParmList) -> +tr_TerminationAudit(ParmList, State) when is_list(ParmList) -> do_tr_TerminationAudit(ParmList, [], State). do_tr_TerminationAudit([], Acc, _State) -> lists:reverse(Acc); do_tr_TerminationAudit([Parm|ParmList], Acc, State) -> case tr_AuditReturnParameter(Parm, State) of - {_, deprecated} when State#state.mode == encode -> + {_, deprecated} when State#state.mode =:= encode -> ?error({deprecated, Parm}); - {_, deprecated} when State#state.mode == decode -> + {_, deprecated} when State#state.mode =:= decode -> %% SKIP do_tr_TerminationAudit(ParmList, Acc, State); {_, deprecated} -> @@ -815,7 +815,7 @@ tr_ObservedEventsDescriptor(#'ObservedEventsDescriptor'{requestId = Id, observedEventLst = Events}, - State) when list (Events) -> + State) when is_list(Events) -> #'ObservedEventsDescriptor'{requestId = tr_RequestID(Id, State), observedEventLst = [tr_ObservedEvent(E, State) || E <- Events]}. @@ -887,7 +887,7 @@ %% pathNAME = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) %% ["@" pathDomainName ] -tr_TerminationID(TermId, State) when State#state.mode /= verify -> +tr_TerminationID(TermId, State) when State#state.mode =/= verify -> resolve(term_id, TermId, State, valid); tr_TerminationID(#'TerminationID'{wildcard = Wild, id = Id}, @@ -910,7 +910,7 @@ case Sub of all -> all; choose -> choose; - Char when integer(Char) -> Char + Char when is_integer(Char) -> Char end. %% mediaDescriptor = MediaToken LBRKT mediaParm *(COMMA mediaParm) RBRKT @@ -1185,7 +1185,7 @@ tr_opt_SignalsDescriptor(SigDesc, State) -> tr_SignalsDescriptor(SigDesc, State). -tr_SignalsDescriptor(SigDesc, State) when list(SigDesc) -> +tr_SignalsDescriptor(SigDesc, State) when is_list(SigDesc) -> [tr_SignalRequest(SigReq, State) || SigReq <- SigDesc]. tr_SignalRequest({Tag, Val}, State) -> @@ -1199,7 +1199,7 @@ tr_SeqSigList(#'SeqSigList'{id = Id, signalList = SigList}, - State) when list(SigList) -> + State) when is_list(SigList) -> #'SeqSigList'{id = tr_UINT16(Id, State), signalList = [tr_Signal(Sig, State) || Sig <- SigList]}. @@ -1226,7 +1226,7 @@ tr_opt_NotifyCompletion(asn1_NOVALUE, _State) -> asn1_NOVALUE; -tr_opt_NotifyCompletion(Items, State) when list(Items) -> +tr_opt_NotifyCompletion(Items, State) when is_list(Items) -> [tr_notifyCompletionItem(I, State) || I <- Items]. tr_notifyCompletionItem(Item, _State) -> @@ -1265,7 +1265,7 @@ tr_opt_RequestID(Id, State) -> tr_RequestID(Id, State). -tr_RequestID(Id, _State) when Id == ?megaco_all_request_id -> +tr_RequestID(Id, _State) when Id =:= ?megaco_all_request_id -> ?megaco_all_request_id; tr_RequestID(Id, State) -> tr_UINT32(Id, State). @@ -1415,7 +1415,7 @@ tr_opt_portNumber(Port, State) -> tr_portNumber(Port, State). -tr_portNumber(Port, State) when integer(Port), Port >= 0 -> +tr_portNumber(Port, State) when is_integer(Port) andalso (Port >= 0) -> tr_UINT16(Port, State). tr_ServiceChangeResParm(#'ServiceChangeResParm'{serviceChangeMgcId = MgcId, @@ -1430,7 +1430,7 @@ serviceChangeProfile = tr_opt_ServiceChangeProfile(Profile, State), timeStamp = tr_opt_TimeNotation(Time, State)}. -tr_PackagesDescriptor(Items, State) when list(Items) -> +tr_PackagesDescriptor(Items, State) when is_list(Items) -> [tr_PackagesItem(I, State) || I <- Items]. tr_PackagesItem(#'PackagesItem'{packageName = Name, @@ -1440,7 +1440,7 @@ #'PackagesItem'{packageName = resolve(package, Name, State, Constraint), packageVersion = tr_UINT16(Version, State)}. -tr_StatisticsDescriptor(Parms, State) when list(Parms) -> +tr_StatisticsDescriptor(Parms, State) when is_list(Parms) -> [tr_StatisticsParameter(P, State) || P <- Parms]. tr_StatisticsParameter(#'StatisticsParameter'{statName = Name, @@ -1467,34 +1467,34 @@ tr_opt_Value(Value, State) -> tr_Value(Value, State). -tr_Value(Strings, _State) when list(Strings) -> +tr_Value(Strings, _State) when is_list(Strings) -> [[Char || Char <- String] || String <- Strings]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Encode an octet string, escape } by \ if necessary -tr_OCTET_STRING(String, _State, Min, Max) when list(String) -> +tr_OCTET_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. -tr_QUOTED_STRING(String, _State) when list(String) -> +tr_QUOTED_STRING(String, _State) when is_list(String) -> verify_count(length(String), 1, infinity), String. %% The internal format of hex digits is a list of octets %% Min and Max means #hexDigits %% Leading zeros are prepended in order to fulfill Min -tr_HEXDIG(Octets, _State, Min, Max) when list(Octets) -> +tr_HEXDIG(Octets, _State, Min, Max) when is_list(Octets) -> verify_count(length(Octets), Min, Max), Octets. tr_DIGIT(Val, State, Min, Max) -> tr_integer(Val, State, Min, Max). -tr_STRING(String, _State) when list(String) -> +tr_STRING(String, _State) when is_list(String) -> String. -tr_STRING(String, _State, Min, Max) when list(String) -> +tr_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. @@ -1519,13 +1519,13 @@ %% Verify that Count is within the range of Min and Max verify_count(Count, Min, Max) -> if - integer(Count) -> + is_integer(Count) -> if - integer(Min), Count >= Min -> + is_integer(Min) andalso (Count >= Min) -> if - integer(Max), Count =< Max -> + is_integer(Max) andalso (Count =< Max) -> Count; - Max == infinity -> + Max =:= infinity -> Count; true -> ?error({count_too_large, Count, Max}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v3.erl erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v3.erl --- erlang-13.b.1-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v3.erl 2009-03-12 12:32:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/binary/megaco_binary_transformer_v3.erl 2009-09-18 15:13:22.000000000 +0100 @@ -59,7 +59,7 @@ verify_constraint(Item, valid) -> Item; -verify_constraint(Item, Constraint) when function(Constraint) -> +verify_constraint(Item, Constraint) when is_function(Constraint) -> Constraint(Item). tr_message(MegaMsg, Mode, Config) -> @@ -74,7 +74,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_MegacoMessage(MegaMsg, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -93,7 +93,7 @@ resolver_module = ?DEFAULT_NAME_RESOLVER, resolver_options = [8, 8, 8]}, tr_Transaction(Trans, State); - [{binary_name_resolver, {Module, Options}}] when atom(Module) -> + [{binary_name_resolver, {Module, Options}}] when is_atom(Module) -> State = #state{mode = Mode, resolver_module = Module, resolver_options = Options}, @@ -144,7 +144,7 @@ Val2 = case Tag of messageError -> tr_ErrorDescriptor(Val, State); - transactions when list(Val) -> [tr_Transaction(T, State) || T <- Val] + transactions when is_list(Val) -> [tr_Transaction(T, State) || T <- Val] end, {Tag, Val2}. @@ -218,7 +218,7 @@ tr_TransactionRequest(#'TransactionRequest'{transactionId = Id, actions = Actions}, - State) when list(Actions) -> + State) when is_list(Actions) -> #'TransactionRequest'{transactionId = tr_TransactionId(Id, State), actions = [tr_ActionRequest(ActReq, State) || ActReq <- Actions]}. @@ -260,7 +260,7 @@ case Tag of transactionError -> tr_ErrorDescriptor(Val, State); - actionReplies when list(Val), Val /= [] -> + actionReplies when is_list(Val) andalso (Val =/= []) -> [tr_ActionReply(ActRep, State) || ActRep <- Val] end, {Tag, Val2}. @@ -289,7 +289,7 @@ ?megaco_all_context_id -> ?megaco_all_context_id; ?megaco_null_context_id -> ?megaco_null_context_id; ?megaco_choose_context_id -> ?megaco_choose_context_id; - Int when integer(Int) -> tr_UINT32(Int, State) + Int when is_integer(Int) -> tr_UINT32(Int, State) end. tr_ActionRequest(#'ActionRequest'{contextId = CtxId, @@ -499,9 +499,9 @@ lists:reverse(Acc); tr_ammDescriptors([Desc|Descs], Acc, State) -> case tr_ammDescriptor(Desc, State) of - {_, deprecated} when State#state.mode == encode -> + {_, deprecated} when State#state.mode =:= encode -> error({deprecated, Desc}); - {_, deprecated} when State#state.mode == decode -> + {_, deprecated} when State#state.mode =:= decode -> %% SKIP tr_ammDescriptors(Descs, Acc, State); {_, deprecated} -> @@ -687,7 +687,7 @@ streams = S2}. tr_indAudTerminationStateDescriptor(Val, State) - when record(Val, 'IndAudTerminationStateDescriptor') -> + when is_record(Val, 'IndAudTerminationStateDescriptor') -> #'IndAudTerminationStateDescriptor'{propertyParms = Parms, eventBufferControl = EBC, serviceState = SS, @@ -741,7 +741,7 @@ statisticsDescriptor = SD2}. tr_indAudLocalControlDescriptor(Val, State) - when record(Val, 'IndAudLocalControlDescriptor') -> + when is_record(Val, 'IndAudLocalControlDescriptor') -> #'IndAudLocalControlDescriptor'{streamMode = M, reserveValue = V, reserveGroup = G, @@ -759,7 +759,7 @@ streamModeSel = SMS2}. tr_indAudLocalControlDescriptor_propertyParms(Parms, State) - when list(Parms), length(Parms) > 0 -> + when is_list(Parms) andalso (length(Parms) > 0) -> [tr_indAudPropertyParm(Parm, State) || Parm <- Parms]; tr_indAudLocalControlDescriptor_propertyParms(asn1_NOVALUE, _State) -> asn1_NOVALUE. @@ -771,7 +771,7 @@ propGrps = tr_indAudPropertyGroup(Grps, State)}. -tr_indAudPropertyGroup(Grps, State) when list(Grps) -> +tr_indAudPropertyGroup(Grps, State) when is_list(Grps) -> [tr_indAudPropertyParm(Parm, State) || Parm <- Grps]. tr_indAudPropertyParm(#'IndAudPropertyParm'{name = Name0, @@ -889,16 +889,16 @@ %% -- v2 end -- -tr_TerminationAudit(ParmList, State) when list(ParmList) -> +tr_TerminationAudit(ParmList, State) when is_list(ParmList) -> do_tr_TerminationAudit(ParmList, [], State). do_tr_TerminationAudit([], Acc, _State) -> lists:reverse(Acc); do_tr_TerminationAudit([Parm|ParmList], Acc, State) -> case tr_AuditReturnParameter(Parm, State) of - {_, deprecated} when State#state.mode == encode -> + {_, deprecated} when State#state.mode =:= encode -> error({deprecated, Parm}); - {_, deprecated} when State#state.mode == decode -> + {_, deprecated} when State#state.mode =:= decode -> %% SKIP do_tr_TerminationAudit(ParmList, Acc, State); {_, deprecated} -> @@ -966,7 +966,7 @@ tr_ObservedEventsDescriptor(#'ObservedEventsDescriptor'{requestId = Id, observedEventLst = Events}, - State) when list (Events) -> + State) when is_list (Events) -> #'ObservedEventsDescriptor'{requestId = tr_RequestID(Id, State), observedEventLst = [tr_ObservedEvent(E, State) || E <- Events]}. @@ -1038,7 +1038,7 @@ %% pathNAME = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) %% ["@" pathDomainName ] -tr_TerminationID(TermId, State) when State#state.mode /= verify -> +tr_TerminationID(TermId, State) when State#state.mode =/= verify -> resolve(term_id, TermId, State, valid); tr_TerminationID(#'TerminationID'{wildcard = Wild, id = Id}, @@ -1061,7 +1061,7 @@ case Sub of all -> all; choose -> choose; - Char when integer(Char) -> Char + Char when is_integer(Char) -> Char end. %% mediaDescriptor = MediaToken LBRKT mediaParm *(COMMA mediaParm) RBRKT @@ -1382,7 +1382,7 @@ tr_opt_SignalsDescriptor(SigDesc, State) -> tr_SignalsDescriptor(SigDesc, State). -tr_SignalsDescriptor(SigDesc, State) when list(SigDesc) -> +tr_SignalsDescriptor(SigDesc, State) when is_list(SigDesc) -> [tr_SignalRequest(SigReq, State) || SigReq <- SigDesc]. tr_SignalRequest({Tag, Val}, State) -> @@ -1396,7 +1396,7 @@ tr_SeqSigList(#'SeqSigList'{id = Id, signalList = SigList}, - State) when list(SigList) -> + State) when is_list(SigList) -> #'SeqSigList'{id = tr_UINT16(Id, State), signalList = [tr_Signal(Sig, State) || Sig <- SigList]}. @@ -1434,7 +1434,7 @@ tr_opt_NotifyCompletion(asn1_NOVALUE, _State) -> asn1_NOVALUE; -tr_opt_NotifyCompletion(Items, State) when list(Items) -> +tr_opt_NotifyCompletion(Items, State) when is_list(Items) -> [tr_notifyCompletionItem(I, State) || I <- Items]. tr_notifyCompletionItem(Item, _State) -> @@ -1484,7 +1484,7 @@ tr_opt_RequestID(Id, State) -> tr_RequestID(Id, State). -tr_RequestID(Id, _State) when Id == ?megaco_all_request_id -> +tr_RequestID(Id, _State) when Id =:= ?megaco_all_request_id -> ?megaco_all_request_id; tr_RequestID(Id, State) -> tr_UINT32(Id, State). @@ -1627,7 +1627,7 @@ tr_opt_portNumber(Port, State) -> tr_portNumber(Port, State). -tr_portNumber(Port, State) when integer(Port), Port >= 0 -> +tr_portNumber(Port, State) when is_integer(Port) andalso (Port >= 0) -> tr_UINT16(Port, State). tr_ServiceChangeResParm(#'ServiceChangeResParm'{serviceChangeMgcId = MgcId, @@ -1642,7 +1642,7 @@ serviceChangeProfile = tr_opt_ServiceChangeProfile(Profile, State), timeStamp = tr_opt_TimeNotation(Time, State)}. -tr_PackagesDescriptor(Items, State) when list(Items) -> +tr_PackagesDescriptor(Items, State) when is_list(Items) -> [tr_PackagesItem(I, State) || I <- Items]. tr_PackagesItem(#'PackagesItem'{packageName = Name, @@ -1657,7 +1657,7 @@ tr_opt_StatisticsDescriptor(Parms, State) -> tr_StatisticsDescriptor(Parms, State). -tr_StatisticsDescriptor(Parms, State) when list(Parms) -> +tr_StatisticsDescriptor(Parms, State) when is_list(Parms) -> [tr_StatisticsParameter(P, State) || P <- Parms]. tr_StatisticsParameter(#'StatisticsParameter'{statName = Name, @@ -1684,34 +1684,34 @@ tr_opt_Value(Value, State) -> tr_Value(Value, State). -tr_Value(Strings, _State) when list(Strings) -> +tr_Value(Strings, _State) when is_list(Strings) -> [[Char || Char <- String] || String <- Strings]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Encode an octet string, escape } by \ if necessary -tr_OCTET_STRING(String, _State, Min, Max) when list(String) -> +tr_OCTET_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. -tr_QUOTED_STRING(String, _State) when list(String) -> +tr_QUOTED_STRING(String, _State) when is_list(String) -> verify_count(length(String), 1, infinity), String. %% The internal format of hex digits is a list of octets %% Min and Max means #hexDigits %% Leading zeros are prepended in order to fulfill Min -tr_HEXDIG(Octets, _State, Min, Max) when list(Octets) -> +tr_HEXDIG(Octets, _State, Min, Max) when is_list(Octets) -> verify_count(length(Octets), Min, Max), Octets. tr_DIGIT(Val, State, Min, Max) -> tr_integer(Val, State, Min, Max). -tr_STRING(String, _State) when list(String) -> +tr_STRING(String, _State) when is_list(String) -> String. -tr_STRING(String, _State, Min, Max) when list(String) -> +tr_STRING(String, _State, Min, Max) when is_list(String) -> verify_count(length(String), Min, Max), String. @@ -1736,13 +1736,13 @@ %% Verify that Count is within the range of Min and Max verify_count(Count, Min, Max) -> if - integer(Count) -> + is_integer(Count) -> if - integer(Min), Count >= Min -> + is_integer(Min) andalso (Count >= Min) -> if - integer(Max), Count =< Max -> + is_integer(Max) andalso (Count =< Max) -> Count; - Max == infinity -> + Max =:= infinity -> Count; true -> error({count_too_large, Count, Max}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_config.erl erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_config.erl --- erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_config.erl 2009-06-05 13:55:43.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_config.erl 2009-11-20 08:48:31.000000000 +0000 @@ -52,6 +52,12 @@ verify_int/1, verify_int/2, + %% Reply limit counter + cre_reply_counter/2, + get_reply_counter/2, + incr_reply_counter/2, + del_reply_counter/2, + %% Pending limit counter cre_pending_counter/3, get_pending_counter/2, @@ -173,6 +179,7 @@ threaded = '_', strict_version = '_', long_request_resend = '_', + call_proxy_gc_timeout = '_', cancel = '_', resend_indication = '_', segment_reply_ind = '_', @@ -180,7 +187,9 @@ segment_recv_timer = '_', segment_send = '_', segment_send_timer = '_', - max_pdu_size = '_'}, + max_pdu_size = '_', + request_keep_alive_timeout = '_' + }, %% ok = io:format("PATTERN: ~p~n", [Pat]), ets:match_object(megaco_local_conn, Pat); user_info(UserMid, connections) -> @@ -274,13 +283,13 @@ [{_, Serial}] -> Max = CD#conn_data.max_serial, if - Max == infinity, - integer(Serial), - Serial < 4294967295 -> + ((Max =:= infinity) andalso + is_integer(Serial) andalso + (Serial < 4294967295)) -> Serial + 1; - Max == infinity, - integer(Serial), - Serial == 4294967295 -> + (Max =:= infinity) andalso + is_integer(Serial) andalso + (Serial =:= 4294967295) -> user_info(LocalMid, min_trans_id); Serial < Max -> @@ -330,6 +339,7 @@ threaded -> CD#conn_data.threaded; strict_version -> CD#conn_data.strict_version; long_request_resend -> CD#conn_data.long_request_resend; + call_proxy_gc_timeout -> CD#conn_data.call_proxy_gc_timeout; cancel -> CD#conn_data.cancel; resend_indication -> CD#conn_data.resend_indication; segment_reply_ind -> CD#conn_data.segment_reply_ind; @@ -338,6 +348,7 @@ segment_send -> CD#conn_data.segment_send; segment_send_timer -> CD#conn_data.segment_send_timer; max_pdu_size -> CD#conn_data.max_pdu_size; + request_keep_alive_timeout -> CD#conn_data.request_keep_alive_timeout; receive_handle -> LocalMid = (CD#conn_data.conn_handle)#megaco_conn_handle.local_mid, #megaco_receive_handle{local_mid = LocalMid, @@ -372,6 +383,16 @@ call({update_conn_data, CH, Item, Val}). +system_info(all) -> + AllItems = [n_active_requests, + n_active_replies, + n_active_connections, + users, + connections, + text_config, + reply_counters, + pending_counters], + [{Item, system_info(Item)} || Item <- AllItems]; system_info(Item) -> case Item of n_active_requests -> @@ -393,6 +414,9 @@ [Conf] end; + reply_counters -> + reply_counters(); + pending_counters -> pending_counters(); @@ -469,23 +493,87 @@ incr_counter(Item, Incr) -> - case (catch ets:update_counter(megaco_config, Item, Incr)) of - {'EXIT', _} -> - cre_counter(Item, Incr); - NewVal -> - NewVal + try + begin + ets:update_counter(megaco_config, Item, Incr) + end + catch + error:_ -> + try + begin + cre_counter(Item, Incr) + end + catch + exit:_ -> + %% Ok, some other process got there before us, + %% so try again + ets:update_counter(megaco_config, Item, Incr) + end end. +%% incr_counter(Item, Incr) -> +%% case (catch ets:update_counter(megaco_config, Item, Incr)) of +%% {'EXIT', _} -> +%% case (catch cre_counter(Item, Incr)) of +%% {'EXIT', _} -> +%% %% Ok, some other process got there before us, +%% %% so try again +%% ets:update_counter(megaco_config, Item, Incr); +%% NewVal -> +%% NewVal +%% end; +%% NewVal -> +%% NewVal +%% end. cre_counter(Item, Initial) -> - case whereis(?SERVER) == self() of + case whereis(?SERVER) =:= self() of false -> - call({cre_counter, Item, Initial}); + case call({cre_counter, Item, Initial}) of + {ok, Value} -> + Value; + Error -> + exit(Error) + end; true -> - ets:insert(megaco_config, {Item, Initial}), - Initial + %% Check that the counter does not already exists + %% so we don't overwrite an already existing counter + case ets:lookup(megaco_config, Item) of + [] -> + ets:insert(megaco_config, {Item, Initial}), + {ok, Initial}; + [_] -> + %% Ouch, now what? + {error, already_exists} + + end end. +cre_reply_counter(ConnHandle, TransId) -> + Counter = {reply_counter, ConnHandle, TransId}, + Initial = 1, + cre_counter(Counter, Initial). + +incr_reply_counter(ConnHandle, TransId) -> + Counter = {reply_counter, ConnHandle, TransId}, + incr_counter(Counter, 1). + +get_reply_counter(ConnHandle, TransId) -> + Counter = {reply_counter, ConnHandle, TransId}, + [{Counter, Val}] = ets:lookup(megaco_config, Counter), + Val. + +del_reply_counter(ConnHandle, TransId) -> + Counter = {reply_counter, ConnHandle, TransId}, + ets:delete(megaco_config, Counter). + +reply_counters() -> + Pattern = {{reply_counter, '_', '_'}, '_'}, + Counters1 = ets:match_object(megaco_config, Pattern), + [{ConnHandle, TransId, CounterVal} || + {{reply_counter, ConnHandle, TransId}, CounterVal} <- Counters1]. + + cre_pending_counter(TransId) -> cre_pending_counter(sent, TransId, 0). @@ -515,6 +603,7 @@ Counter = {pending_counter, Direction, TransId}, ets:delete(megaco_config, Counter). + pending_counters() -> Pattern = {{pending_counter, '_', '_'}, '_'}, Counters1 = ets:match_object(megaco_config, Pattern), @@ -764,6 +853,7 @@ init_user_default(threaded, false), init_user_default(strict_version, true), init_user_default(long_request_resend, false), + init_user_default(call_proxy_gc_timeout, timer:seconds(5)), init_user_default(cancel, false), init_user_default(resend_indication, false), init_user_default(segment_reply_ind, false), @@ -771,7 +861,8 @@ init_user_default(segment_recv_timer, timer:seconds(10)), init_user_default(segment_send, none), init_user_default(segment_send_timer, timer:seconds(5)), - init_user_default(max_pdu_size, infinity). + init_user_default(max_pdu_size, infinity), + init_user_default(request_keep_alive_timeout, plain). init_user_default(Item, Default) when Item /= mid -> Val = get_env(Item, Default), @@ -954,14 +1045,14 @@ %% Returns: {ok, NewState} %%---------------------------------------------------------------------- -code_change(_Vsn, S, upgrade_from_pre_3_7) -> - upgrade_user_info_from_pre_3_7(), - upgrade_conn_data_from_pre_3_7(), +code_change(_Vsn, S, upgrade_from_pre_3_12) -> + upgrade_user_info_from_pre_3_12(), + upgrade_conn_data_from_pre_3_12(), {ok, S}; -code_change(_Vsn, S, downgrade_to_pre_3_7) -> - downgrade_user_info_to_pre_3_7(), - downgrade_conn_data_to_pre_3_7(), +code_change(_Vsn, S, downgrade_to_pre_3_12) -> + downgrade_user_info_to_pre_3_12(), + downgrade_conn_data_to_pre_3_12(), {ok, S}; code_change(_Vsn, S, _Extra) -> @@ -970,15 +1061,19 @@ %% -- Upgrade user info -- -upgrade_user_info_from_pre_3_7() -> - NewValues = [{segment_reply_ind, false}, - {segment_recv_acc, false}, - {segment_recv_timer, #megaco_incr_timer{}}, - {segment_send, none}, - {segment_send_timer, infinity}, - {max_pdu_size, infinity}], +upgrade_user_info_from_pre_3_12() -> + NewValues = [{request_keep_alive_timeout, plain}], upgrade_user_info(NewValues). +%% upgrade_user_info_from_pre_3_7() -> +%% NewValues = [{segment_reply_ind, false}, +%% {segment_recv_acc, false}, +%% {segment_recv_timer, #megaco_incr_timer{}}, +%% {segment_send, none}, +%% {segment_send_timer, infinity}, +%% {max_pdu_size, infinity}], +%% upgrade_user_info(NewValues). + upgrade_user_info(NewValues) -> Users = [default|system_info(users)], F = fun({Item, Val}) -> @@ -993,19 +1088,25 @@ ok. -%% -- Downgrade user info -- +%% %% -- Downgrade user info -- -downgrade_user_info_to_pre_3_7() -> +downgrade_user_info_to_pre_3_12() -> NewItems = [ - segment_reply_ind, - segment_recv_acc, - segment_recv_timer, - segment_send, - segment_send_timer, - max_pdu_size + request_keep_alive_timeout ], downgrade_user_info(NewItems). +%% downgrade_user_info_to_pre_3_7() -> +%% NewItems = [ +%% segment_reply_ind, +%% segment_recv_acc, +%% segment_recv_timer, +%% segment_send, +%% segment_send_timer, +%% max_pdu_size +%% ], +%% downgrade_user_info(NewItems). + downgrade_user_info(NewItems) -> Users = [default|system_info(users)], F = fun(Item) -> @@ -1023,18 +1124,23 @@ ets:delete(megaco_config, {User, Item}). -%% -- Upgrade conn data -- +%% %% -- Upgrade conn data -- -upgrade_conn_data_from_pre_3_7() -> +upgrade_conn_data_from_pre_3_12() -> Conns = system_info(connections), - Defaults = [{segment_reply_ind, false}, - {segment_recv_acc, false}, - {segment_recv_timer, #megaco_incr_timer{}}, - {segment_send, false}, - {segment_send_timer, #megaco_incr_timer{}}, - {max_pdu_size, infinity}], + Defaults = [{request_keep_alive_timeout, plain}], upgrade_conn_data(Conns, Defaults). +%% upgrade_conn_data_from_pre_3_7() -> +%% Conns = system_info(connections), +%% Defaults = [{segment_reply_ind, false}, +%% {segment_recv_acc, false}, +%% {segment_recv_timer, #megaco_incr_timer{}}, +%% {segment_send, false}, +%% {segment_send_timer, #megaco_incr_timer{}}, +%% {max_pdu_size, infinity}], +%% upgrade_conn_data(Conns, Defaults). + upgrade_conn_data(Conns, Defaults) -> F = fun(CH) -> case lookup_local_conn(CH) of @@ -1051,7 +1157,7 @@ NewStyleCD = new_conn_data(OldStyleCD, Defaults), ets:insert(megaco_local_conn, NewStyleCD). -%% Pre 3.7 +%% Pre 3.12 new_conn_data({conn_data, CH, Serial, MaxSerial, ReqTmr, LongReqTmr, AutoAck, TransAck, TransAckMaxCnt, @@ -1070,13 +1176,14 @@ StrictVersion, LongReqResend, Cancel, - ResendIndication - %% SegmentReplyIndDefault - New values - %% SegmentRecvAccDefault - New values - %% SegmentRecvTimerDefault - New values - %% SegmentSendDefault - New values - %% SegmentSendTimerDefault - New values - %% MaxPDUSizeDefault - New values + ResendIndication, + SegmentReplyInd, + SegmentRecvAcc, + SegmentRecvTimer, + SegmentSend, + SegmentSendTimer, + MaxPDUSize + %% RequestKeepAliveTimerDefault - New values }, Defaults) -> #conn_data{conn_handle = CH, @@ -1119,12 +1226,13 @@ long_request_resend = LongReqResend, cancel = Cancel, resend_indication = ResendIndication, - segment_reply_ind = get_default(segment_reply_ind, Defaults), - segment_recv_acc = get_default(segment_recv_acc, Defaults), - segment_recv_timer = get_default(segment_recv_timer, Defaults), - segment_send = get_default(segment_send, Defaults), - segment_send_timer = get_default(segment_send_timer, Defaults), - max_pdu_size = get_default(max_pdu_size, Defaults) + segment_reply_ind = SegmentReplyInd, + segment_recv_acc = SegmentRecvAcc, + segment_recv_timer = SegmentRecvTimer, + segment_send = SegmentSend, + segment_send_timer = SegmentSendTimer, + max_pdu_size = MaxPDUSize, + request_keep_alive_timeout = get_default(request_keep_alive_timeout, Defaults) }. @@ -1133,11 +1241,11 @@ Default. -%% -- Downgrade conn data -- +%% %% -- Downgrade conn data -- -downgrade_conn_data_to_pre_3_7() -> +downgrade_conn_data_to_pre_3_12() -> Conns = system_info(connections), - Downgrade = fun(NewCD) -> old_conn_data_to_pre_3_7(NewCD) end, + Downgrade = fun(NewCD) -> old_conn_data_to_pre_3_12(NewCD) end, downgrade_conn_data(Downgrade, Conns). downgrade_conn_data(Downgrade, Conns) -> @@ -1155,7 +1263,7 @@ OldStyleCD = Downgrade(NewStyleCD), ets:insert(megaco_local_conn, OldStyleCD). -old_conn_data_to_pre_3_7( +old_conn_data_to_pre_3_12( #conn_data{conn_handle = CH, serial = Serial, max_serial = MaxSerial, @@ -1195,13 +1303,14 @@ strict_version = StrictVersion, long_request_resend = LongReqResend, cancel = Cancel, - resend_indication = ResendIndication - %% segment_reply_ind = SegmentRecvAcc, - %% segment_recv_acc = SegmentRecvAcc, - %% segment_recv_timer = SegmentRecvTimer, - %% segment_send = SegmentSend, - %% segment_send_timer = SegmentSendTimer, - %% max_pdu_size = MaxPDUSize + resend_indication = ResendIndication, + segment_reply_ind = SegmentRecvAcc, + segment_recv_acc = SegmentRecvAcc, + segment_recv_timer = SegmentRecvTimer, + segment_send = SegmentSend, + segment_send_timer = SegmentSendTimer, + max_pdu_size = MaxPDUSize + %% request_keep_alive_timeout = RequestKeepAliveTimeout }) -> {conn_data, CH, Serial, MaxSerial, ReqTmr, LongReqTmr, AutoAck, @@ -1220,7 +1329,13 @@ StrictVersion, LongReqResend, Cancel, - ResendIndication}. + ResendIndication, + SegmentRecvAcc, + SegmentRecvAcc, + SegmentRecvTimer, + SegmentSend, + SegmentSendTimer, + MaxPDUSize}. @@ -1306,6 +1421,7 @@ threaded -> verify_bool(Val); strict_version -> verify_bool(Val); long_request_resend -> verify_bool(Val); + call_proxy_gc_timeout -> verify_strict_uint(Val); cancel -> verify_bool(Val); resend_indication -> verify_resend_indication(Val); @@ -1314,7 +1430,9 @@ segment_recv_timer -> verify_timer(Val); segment_send -> verify_segmentation_window(Val); segment_send_timer -> verify_timer(Val); - max_pdu_size -> verify_int(Val) and (Val > 0); + max_pdu_size -> verify_int(Val) andalso (Val > 0); + request_keep_alive_timeout -> + (verify_int(Val) andalso (Val >= 0)) orelse (Val =:= plain); _ -> false end. @@ -1328,38 +1446,38 @@ verify_resend_indication(flag) -> true; verify_resend_indication(Val) -> verify_bool(Val). --spec verify_strict_int(Int :: integer()) -> bool(). +-spec verify_strict_int(Int :: integer()) -> boolean(). verify_strict_int(Int) when is_integer(Int) -> true; verify_strict_int(_) -> false. -spec verify_strict_int(Int :: integer(), - Max :: integer() | 'infinity') -> bool(). + Max :: integer() | 'infinity') -> boolean(). verify_strict_int(Int, infinity) -> verify_strict_int(Int); verify_strict_int(Int, Max) -> verify_strict_int(Int) andalso verify_strict_int(Max) andalso (Int =< Max). --spec verify_strict_uint(Int :: non_neg_integer()) -> bool(). -verify_strict_uint(Int) when is_integer(Int) and (Int >= 0) -> true; -verify_strict_uint(_) -> false. +-spec verify_strict_uint(Int :: non_neg_integer()) -> boolean(). +verify_strict_uint(Int) when is_integer(Int) andalso (Int >= 0) -> true; +verify_strict_uint(_) -> false. -spec verify_strict_uint(Int :: non_neg_integer(), - Max :: non_neg_integer() | 'infinity') -> bool(). + Max :: non_neg_integer() | 'infinity') -> boolean(). verify_strict_uint(Int, infinity) -> verify_strict_uint(Int); verify_strict_uint(Int, Max) -> verify_strict_int(Int, 0, Max). --spec verify_uint(Val :: non_neg_integer() | 'infinity') -> bool(). +-spec verify_uint(Val :: non_neg_integer() | 'infinity') -> boolean(). verify_uint(infinity) -> true; verify_uint(Val) -> verify_strict_uint(Val). --spec verify_int(Val :: integer() | 'infinity') -> bool(). +-spec verify_int(Val :: integer() | 'infinity') -> boolean(). verify_int(infinity) -> true; verify_int(Val) -> verify_strict_int(Val). -spec verify_int(Int :: integer() | 'infinity', - Max :: integer() | 'infinity') -> bool(). + Max :: integer() | 'infinity') -> boolean(). verify_int(Int, infinity) -> verify_int(Int); verify_int(infinity, _Max) -> @@ -1368,7 +1486,7 @@ verify_strict_int(Int) andalso verify_strict_int(Max) andalso (Int =< Max). -spec verify_uint(Int :: non_neg_integer() | 'infinity', - Max :: non_neg_integer() | 'infinity') -> bool(). + Max :: non_neg_integer() | 'infinity') -> boolean(). verify_uint(Int, infinity) -> verify_uint(Int); verify_uint(infinity, _Max) -> @@ -1378,7 +1496,7 @@ -spec verify_strict_int(Int :: integer(), Min :: integer(), - Max :: integer()) -> bool(). + Max :: integer()) -> boolean(). verify_strict_int(Val, Min, Max) when (is_integer(Val) andalso is_integer(Min) andalso @@ -1391,7 +1509,7 @@ -spec verify_int(Val :: integer() | 'infinity', Min :: integer(), - Max :: integer() | 'infinity') -> bool(). + Max :: integer() | 'infinity') -> boolean(). verify_int(infinity, Min, infinity) -> verify_strict_int(Min); verify_int(Val, Min, infinity) -> @@ -1494,6 +1612,7 @@ threaded -> CD#conn_data{threaded = Val}; strict_version -> CD#conn_data{strict_version = Val}; long_request_resend -> CD#conn_data{long_request_resend = Val}; + call_proxy_gc_timeout -> CD#conn_data{call_proxy_gc_timeout = Val}; cancel -> CD#conn_data{cancel = Val}; resend_indication -> CD#conn_data{resend_indication = Val}; segment_reply_ind -> CD#conn_data{segment_reply_ind = Val}; @@ -1501,7 +1620,8 @@ segment_recv_timer -> CD#conn_data{segment_recv_timer = Val}; segment_send -> CD#conn_data{segment_send = Val}; segment_send_timer -> CD#conn_data{segment_send_timer = Val}; - max_pdu_size -> CD#conn_data{max_pdu_size = Val} + max_pdu_size -> CD#conn_data{max_pdu_size = Val}; + request_keep_alive_timeout -> CD#conn_data{request_keep_alive_timeout = Val} end. %% update auto_ack @@ -1892,6 +2012,7 @@ threaded = user_info(Mid, threaded), strict_version = user_info(Mid, strict_version), long_request_resend = user_info(Mid, long_request_resend), + call_proxy_gc_timeout = user_info(Mid, call_proxy_gc_timeout), cancel = false, resend_indication = user_info(Mid, resend_indication), segment_reply_ind = user_info(Mid, segment_reply_ind), @@ -1899,7 +2020,9 @@ segment_recv_timer = user_info(Mid, segment_recv_timer), segment_send = user_info(Mid, segment_send), segment_send_timer = user_info(Mid, segment_send_timer), - max_pdu_size = user_info(Mid, max_pdu_size)}. + max_pdu_size = user_info(Mid, max_pdu_size), + request_keep_alive_timeout = user_info(Mid, request_keep_alive_timeout) + }. handle_disconnect(ConnHandle) when is_record(ConnHandle, megaco_conn_handle) -> case ets:lookup(megaco_local_conn, ConnHandle) of diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_erl_dist_encoder.erl erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_erl_dist_encoder.erl --- erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_erl_dist_encoder.erl 2009-03-12 12:30:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_erl_dist_encoder.erl 2009-09-18 15:12:43.000000000 +0100 @@ -133,10 +133,10 @@ when is_tuple(CmdReq) -> {ok, erlang:term_to_binary(?MC_MOD:encode(CmdReq, Vsn), Config)}; encode_command_request([{megaco_compressed, Mod}|Config], Vsn, CmdReq) - when tuple(CmdReq) -> + when is_tuple(CmdReq) -> {ok, erlang:term_to_binary(Mod:encode(CmdReq, Vsn), Config)}; encode_command_request(Config, _Vsn, CmdReq) - when tuple(CmdReq) -> + when is_tuple(CmdReq) -> {ok, erlang:term_to_binary(CmdReq, Config)}. @@ -162,7 +162,7 @@ %% Return {ok, Version} | {error, Reason} %%---------------------------------------------------------------------- -version_of(Config, Bin) when binary(Bin) -> +version_of(Config, Bin) when is_binary(Bin) -> case decode_message(Config, 1, Bin) of {ok, M} -> V = (M#'MegacoMessage'.mess)#'Message'.version, diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_erl_dist_encoder_mc.erl erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_erl_dist_encoder_mc.erl --- erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_erl_dist_encoder_mc.erl 2009-03-12 12:32:45.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_erl_dist_encoder_mc.erl 2009-09-18 15:13:32.000000000 +0100 @@ -327,13 +327,13 @@ e({'AuditDescriptor', asn1_NOVALUE, asn1_NOVALUE}, V) when V >= 2 -> {192}; e({'AuditDescriptor', AT, APT}, V) - when is_list(AT) and is_list(APT) and (V >= 2) -> + when is_list(AT) andalso is_list(APT) andalso (V >= 2) -> {193, el(AT, V), el(APT, V)}; e({'AuditDescriptor', AT, APT}, V) - when is_list(APT) and (V >= 2) -> + when is_list(APT) andalso (V >= 2) -> {194, e(AT, V), el(APT, V)}; e({'AuditDescriptor', AT, APT}, V) - when is_list(AT) and (V >= 2) -> + when is_list(AT) andalso (V >= 2) -> {195, el(AT, V), e(APT, V)}; e({'AuditDescriptor', AT, APT}, V) when (V >= 2) -> {196, e(AT, V), e(APT, V)}; @@ -955,16 +955,16 @@ e({'IndAudLocalControlDescriptor', SM, RV, RG, asn1_NOVALUE}, 2 = V) -> {1020, e(SM, V), e(RV, V), e(RG, V)}; -e({'IndAudLocalControlDescriptor', SM, RV, RG, PP}, 2 = V) when list(PP) -> +e({'IndAudLocalControlDescriptor', SM, RV, RG, PP}, 2 = V) when is_list(PP) -> {1021, e(SM, V), e(RV, V), e(RG, V), el(PP, V)}; e({'IndAudLocalControlDescriptor', SM, RV, RG, asn1_NOVALUE, asn1_NOVALUE}, V) when V >= 3 -> {1022, e(SM, V), e(RV, V), e(RG, V)}; e({'IndAudLocalControlDescriptor', SM, RV, RG, PP, asn1_NOVALUE}, V) - when is_list(PP) and (V >= 3) -> + when is_list(PP) andalso (V >= 3) -> {1023, e(SM, V), e(RV, V), e(RG, V), el(PP, V)}; e({'IndAudLocalControlDescriptor', SM, RV, RG, PP, SMS}, V) - when is_list(PP) and (V >= 3) -> + when is_list(PP) andalso (V >= 3) -> {1024, e(SM, V), e(RV, V), e(RG, V), el(PP, V), e(SMS, V)}; e({'IndAudPropertyParm', N}, 2 = _V) -> @@ -1227,11 +1227,11 @@ {'AuditDescriptor', dl(AT, V)}; d({192}, V) when (V >= 2) -> {'AuditDescriptor', asn1_NOVALUE, asn1_NOVALUE}; -d({193, AT, APT}, V) when is_list(AT) and is_list(APT) and (V >= 2) -> +d({193, AT, APT}, V) when is_list(AT) andalso is_list(APT) andalso (V >= 2) -> {'AuditDescriptor', dl(AT, V), dl(APT, V)}; -d({194, AT, APT}, V) when is_list(APT) and (V >= 2) -> +d({194, AT, APT}, V) when is_list(APT) andalso (V >= 2) -> {'AuditDescriptor', d(AT, V), dl(APT, V)}; -d({195, AT, APT}, V) when is_list(AT) and (V >= 2) -> +d({195, AT, APT}, V) when is_list(AT) andalso (V >= 2) -> {'AuditDescriptor', dl(AT, V), d(APT, V)}; d({196, AT, APT}, V) when (V >= 2) -> {'AuditDescriptor', d(AT, V), d(APT, V)}; @@ -1846,17 +1846,17 @@ {'IndAudLocalControlDescriptor', d(SM, V), d(RV, V), d(RG, V), asn1_NOVALUE}; d({1021, SM, RV, RG, PP}, 2 = V) - when list(PP) -> + when is_list(PP) -> {'IndAudLocalControlDescriptor', d(SM, V), d(RV, V), d(RG, V), dl(PP, V)}; d({1022, SM, RV, RG}, V) when (V >= 3) -> {'IndAudLocalControlDescriptor', d(SM, V), d(RV, V), d(RG, V), asn1_NOVALUE, asn1_NOVALUE}; d({1023, SM, RV, RG, PP}, V) - when is_list(PP) and (V >= 3) -> + when is_list(PP) andalso (V >= 3) -> {'IndAudLocalControlDescriptor', d(SM, V), d(RV, V), d(RG, V), dl(PP, V), asn1_NOVALUE}; d({1024, SM, RV, RG, PP, SMS}, V) - when is_list(PP) and (V >= 3) -> + when is_list(PP) andalso (V >= 3) -> {'IndAudLocalControlDescriptor', d(SM, V), d(RV, V), d(RG, V), dl(PP, V), d(SMS, V)}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_filter.erl erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_filter.erl --- erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_filter.erl 2009-03-12 12:30:27.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_filter.erl 2009-09-18 15:12:43.000000000 +0100 @@ -47,15 +47,15 @@ {title, "Megaco tracer - Erlang/OTP"} | ExtraOptions], et_viewer:start(Options). -filter(E) when record(E, event) -> +filter(E) when is_record(E, event) -> From = filter_actor(E#event.from), To = filter_actor(E#event.to), E2 = E#event{from = From, to = To}, E3 = filter_contents(E#event.contents, E2, []), {true, E3}. -filter_actors(From, To, E) when E#event.from == ?APPLICATION, - E#event.to == ?APPLICATION -> +filter_actors(From, To, E) + when (E#event.from =:= ?APPLICATION) andalso (E#event.to =:= ?APPLICATION) -> Label = E#event.label, case lists:prefix("callback:", Label) of true -> @@ -98,7 +98,7 @@ String end. -do_filter_actor(CH) when record(CH, megaco_conn_handle) -> +do_filter_actor(CH) when is_record(CH, megaco_conn_handle) -> Mid = CH#megaco_conn_handle.local_mid, do_filter_actor(Mid); do_filter_actor(Actor) -> @@ -136,7 +136,7 @@ case H of {line, _Mod, _Line} -> filter_contents(T, E, Contents); - CD when record(CD, conn_data) -> + CD when is_record(CD, conn_data) -> CH = CD#conn_data.conn_handle, From = CH#megaco_conn_handle.local_mid, To = CH#megaco_conn_handle.remote_mid, @@ -144,18 +144,18 @@ Serial = CD#conn_data.serial, E3 = append_serial(Serial, E2), filter_contents(T, E3, Contents); - CH when record(CH, megaco_conn_handle) -> + CH when is_record(CH, megaco_conn_handle) -> From = CH#megaco_conn_handle.local_mid, To = CH#megaco_conn_handle.remote_mid, E2 = filter_actors(From, To, E), filter_contents(T, E2, Contents); {orig_conn_handle, _CH} -> filter_contents(T, E, Contents); - RH when record(RH, megaco_receive_handle) -> + RH when is_record(RH, megaco_receive_handle) -> Actor = RH#megaco_receive_handle.local_mid, E2 = filter_actors(Actor, Actor, E), filter_contents(T, E2, Contents); - {pid, Pid} when pid(Pid) -> + {pid, Pid} when is_pid(Pid) -> filter_contents(T, E, Contents); pending -> filter_contents(T, E, Contents); @@ -169,20 +169,20 @@ Pretty = pretty_error({'EXIT', Reason}), E2 = prepend_error(E), filter_contents(T, E2, [[Pretty, "\n"], Contents]); - ED when record(ED, 'ErrorDescriptor') -> + ED when is_record(ED, 'ErrorDescriptor') -> Pretty = pretty_error(ED), E2 = prepend_error(E), filter_contents(T, E2, [[Pretty, "\n"], Contents]); - Trans when record(Trans, 'TransactionRequest') -> + Trans when is_record(Trans, 'TransactionRequest') -> Pretty = pretty({trans, {transactionRequest, Trans}}), filter_contents([], E, [[Pretty, "\n"], Contents]); - Trans when record(Trans, 'TransactionReply') -> + Trans when is_record(Trans, 'TransactionReply') -> Pretty = pretty({trans, {transactionReply, Trans}}), filter_contents([], E, [[Pretty, "\n"], Contents]); - Trans when record(Trans, 'TransactionPending') -> + Trans when is_record(Trans, 'TransactionPending') -> Pretty = pretty({trans, {transactionPending, Trans}}), filter_contents([], E, [[Pretty, "\n"], Contents]); - Trans when record(Trans, 'TransactionAck') -> + Trans when is_record(Trans, 'TransactionAck') -> Pretty = pretty({trans, {transactionResponseAck, [Trans]}}), case Trans#'TransactionAck'.lastAck of asn1_NOVALUE -> @@ -207,10 +207,10 @@ {actionReplies, ARS} -> Pretty = [[pretty(AR), "\n"] || AR <- ARS], filter_contents(T, E, [["REPLY: \n", Pretty, "\n"], Contents]); - MegaMsg when record(MegaMsg, 'MegacoMessage') -> + MegaMsg when is_record(MegaMsg, 'MegacoMessage') -> Pretty = pretty(MegaMsg), filter_contents(T, E, [["MESSAGE: \n", Pretty, "\n"], Contents]); - {bytes, Bin} when binary(Bin) -> + {bytes, Bin} when is_binary(Bin) -> E2 = case E#event.label of [$s, $e, $n, $d, $ , $b, $y, $t, $e, $s | Tail] -> @@ -233,7 +233,7 @@ filter_contents(T, E, [[Pretty, "\n"], Contents]) end. -append_serial(Serial, E) when integer(Serial) -> +append_serial(Serial, E) when is_integer(Serial) -> Label = term_to_string(E#event.label), E#event{label = Label ++ " #" ++ integer_to_list(Serial)}; append_serial(_Serial, E) -> @@ -245,23 +245,23 @@ pretty({context_id, ContextId}) -> if - ContextId == ?megaco_null_context_id -> + ContextId =:= ?megaco_null_context_id -> ["CONTEXT ID: -\n"]; - ContextId == ?megaco_choose_context_id -> + ContextId =:= ?megaco_choose_context_id -> ["CONTEXT ID: $\n"]; - ContextId == ?megaco_all_context_id -> + ContextId =:= ?megaco_all_context_id -> ["CONTEXT ID: *\n"]; - integer(ContextId) -> + is_integer(ContextId) -> ["CONTEXT ID: ",integer_to_list(ContextId), "\n"] end; -pretty(MegaMsg) when record(MegaMsg, 'MegacoMessage') -> +pretty(MegaMsg) when is_record(MegaMsg, 'MegacoMessage') -> case catch megaco_pretty_text_encoder:encode_message([], MegaMsg) of {ok, Bin} -> term_to_string(Bin); _Bad -> term_to_string(MegaMsg) end; -pretty(CmdReq) when record(CmdReq, 'CommandRequest') -> +pretty(CmdReq) when is_record(CmdReq, 'CommandRequest') -> case catch megaco_pretty_text_encoder:encode_command_request(CmdReq) of {ok, IoList} -> IoList2 = lists:flatten(IoList), @@ -279,7 +279,7 @@ _Bad -> term_to_string(Res) end; -pretty(AR) when record(AR, 'ActionReply') -> +pretty(AR) when is_record(AR, 'ActionReply') -> case catch megaco_pretty_text_encoder:encode_action_reply(AR) of {ok, IoList} -> IoList2 = lists:flatten(IoList), @@ -299,7 +299,7 @@ end; pretty({trans, Trans}) -> case catch megaco_pretty_text_encoder:encode_transaction(Trans) of - {ok, Bin} when binary(Bin) -> + {ok, Bin} when is_binary(Bin) -> IoList2 = lists:flatten(binary_to_list(Bin)), term_to_string(IoList2); {ok, IoList} -> @@ -341,7 +341,7 @@ {error, Other} end. -term_to_string(Bin) when binary(Bin) -> +term_to_string(Bin) when is_binary(Bin) -> binary_to_list(Bin); term_to_string(Term) -> case catch io_lib:format("~s", [Term]) of diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_messenger.erl erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_messenger.erl --- erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_messenger.erl 2009-06-05 13:55:42.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_messenger.erl 2009-11-20 13:37:07.000000000 +0000 @@ -35,6 +35,7 @@ cast/3, cancel/2, request_timeout/2, + request_keep_alive_timeout/2, pending_timeout/3, reply_timeout/3, segment_timeout/3, @@ -89,7 +90,9 @@ reply_data, seg_recv = [], % [integer()] (received segments) init_seg_timer, - seg_timer_ref + seg_timer_ref, + keep_alive_timer, % plain | integer() >= 0 + keep_alive_ref % undefined | ref() }). @@ -1324,9 +1327,11 @@ %% What if the user never replies? %% In that case we will have a record %% (and counters) that is never cleaned up... - Rep2 = Rep#reply{state = aborted, - pending_timer_ref = undefined}, - megaco_monitor:insert_reply(Rep2), + NewFields = + [{#reply.state, aborted}, + {#reply.pending_timer_ref, undefined}], + megaco_monitor:update_reply_fields(TransId, + NewFields), handle_request_abort_callback(ConnData, TransId, Pid, Extra); true -> @@ -1435,36 +1440,65 @@ end. +increment_request_keep_alive_counter(#conn_data{conn_handle = CH}, TransId) -> + ?rt1(CH, "increment request keep alive counter", [TransId]), + megaco_config:incr_reply_counter(CH, TransId). + +create_or_maybe_increment_request_keep_alive_counter( + #conn_data{conn_handle = CH}, TransId) -> + ?rt1(CH, "create or maybe increment request keep alive counter", + [TransId]), + try + begin + megaco_config:cre_reply_counter(CH, TransId) + end + catch + _:_ -> + megaco_config:incr_reply_counter(CH, TransId) + end. + + check_and_maybe_create_pending_limit(infinity, _, _) -> ok; check_and_maybe_create_pending_limit(Limit, Direction, TransId) -> - case (catch megaco_config:get_pending_counter(Direction, TransId)) of - {'EXIT', _} -> - %% Has not been created yet (connect). - megaco_config:cre_pending_counter(Direction, TransId, 0), - ok; + ?rt2("check and maybe create pending limit counter", + [Limit, Direction, TransId]), + try megaco_config:get_pending_counter(Direction, TransId) of Val when Val =< Limit -> %% Since we have no intention to increment here, it %% is ok to be _at_ the limit ok; _ -> aborted + catch + _:_ -> + %% Has not been created yet (connect). + megaco_config:cre_pending_counter(Direction, TransId, 0), + ok end. +%% check_and_maybe_create_pending_limit(infinity, _, _) -> +%% ok; +%% check_and_maybe_create_pending_limit(Limit, Direction, TransId) -> +%% case (catch megaco_config:get_pending_counter(Direction, TransId)) of +%% {'EXIT', _} -> +%% %% Has not been created yet (connect). +%% megaco_config:cre_pending_counter(Direction, TransId, 0), +%% ok; +%% Val when Val =< Limit -> +%% %% Since we have no intention to increment here, it +%% %% is ok to be _at_ the limit +%% ok; +%% _ -> +%% aborted +%% end. + + check_pending_limit(infinity, _, _) -> {ok, 0}; check_pending_limit(Limit, Direction, TransId) -> ?rt2("check pending limit", [Direction, Limit, TransId]), - case (catch megaco_config:get_pending_counter(Direction, TransId)) of - {'EXIT', _} -> - %% This function is only called when we "know" the - %% counter to exist. So, the only reason that this - %% would happen is of the counter has been removed. - %% This only happen if the pending limit has been - %% reached. In any case, this is basically the same - %% as aborted! - ?rt2("check pending limit - exit", []), - aborted; + try megaco_config:get_pending_counter(Direction, TransId) of Val when Val =< Limit -> %% Since we have no intention to increment here, it %% is ok to be _at_ the limit @@ -1473,8 +1507,42 @@ _Val -> ?rt2("check pending limit - aborted", [_Val]), aborted + catch + _:_ -> + %% This function is only called when we "know" the + %% counter to exist. So, the only reason that this + %% would happen is of the counter has been removed. + %% This only happen if the pending limit has been + %% reached. In any case, this is basically the same + %% as aborted! + ?rt2("check pending limit - exit", []), + aborted end. +%% check_pending_limit(infinity, _, _) -> +%% {ok, 0}; +%% check_pending_limit(Limit, Direction, TransId) -> +%% ?rt2("check pending limit", [Direction, Limit, TransId]), +%% case (catch megaco_config:get_pending_counter(Direction, TransId)) of +%% {'EXIT', _} -> +%% %% This function is only called when we "know" the +%% %% counter to exist. So, the only reason that this +%% %% would happen is of the counter has been removed. +%% %% This only happen if the pending limit has been +%% %% reached. In any case, this is basically the same +%% %% as aborted! +%% ?rt2("check pending limit - exit", []), +%% aborted; +%% Val when Val =< Limit -> +%% %% Since we have no intention to increment here, it +%% %% is ok to be _at_ the limit +%% ?rt2("check pending limit - ok", [Val]), +%% {ok, Val}; +%% _Val -> +%% ?rt2("check pending limit - aborted", [_Val]), +%% aborted +%% end. + check_and_maybe_incr_pending_limit(infinity, _, _) -> ok; @@ -1483,11 +1551,7 @@ %% We need this kind of test to detect when we _pass_ the limit %% ?rt2("check and maybe incr pending limit", [Direction, Limit, TransId]), - case (catch megaco_config:get_pending_counter(Direction, TransId)) of - {'EXIT', _} -> - %% Has not been created yet (connect). - megaco_config:cre_pending_counter(Direction, TransId, 1), - ok; + try megaco_config:get_pending_counter(Direction, TransId) of Val when Val > Limit -> ?rt2("check and maybe incr - aborted", [Direction, Val, Limit]), aborted; % Already passed the limit @@ -1502,9 +1566,43 @@ [Direction, Val, Limit]), error % Passed the limit end + catch + _:_ -> + %% Has not been created yet (connect). + megaco_config:cre_pending_counter(Direction, TransId, 1), + ok end. +%% check_and_maybe_incr_pending_limit(infinity, _, _) -> +%% ok; +%% check_and_maybe_incr_pending_limit(Limit, Direction, TransId) -> +%% %% +%% %% We need this kind of test to detect when we _pass_ the limit +%% %% +%% ?rt2("check and maybe incr pending limit", [Direction, Limit, TransId]), +%% case (catch megaco_config:get_pending_counter(Direction, TransId)) of +%% {'EXIT', _} -> +%% %% Has not been created yet (connect). +%% megaco_config:cre_pending_counter(Direction, TransId, 1), +%% ok; +%% Val when Val > Limit -> +%% ?rt2("check and maybe incr - aborted", [Direction, Val, Limit]), +%% aborted; % Already passed the limit +%% Val -> +%% ?rt2("check and maybe incr - incr", [Direction, Val, Limit]), +%% megaco_config:incr_pending_counter(Direction, TransId), +%% if +%% Val < Limit -> +%% ok; % Still within the limit +%% true -> +%% ?rt2("check and maybe incr - error", +%% [Direction, Val, Limit]), +%% error % Passed the limit +%% end +%% end. + + %% BUGBUG BUGBUG BUGBUG %% %% Do we know that the Rep is still valid? A previous transaction @@ -1531,14 +1629,14 @@ case check_and_maybe_create_pending_limit(Limit, sent, TransId) of ok -> %% Ok so far, now update state - case megaco_monitor:lookup_reply(TransId) of - [Rep] when is_record(Rep, reply) -> - Rep2 = Rep#reply{state = eval_request}, - megaco_monitor:insert_reply(Rep2), - + case megaco_monitor:update_reply_field(TransId, + #reply.state, + eval_request) of + true -> Actions = T#'TransactionRequest'.actions, {AckAction, SendReply} = - handle_request_callback(ConnData, TransId, Actions, T, Extra), + handle_request_callback(ConnData, TransId, Actions, + T, Extra), %% Next step, while we where in the callback function, %% the pending limit could have been exceeded, so check @@ -1546,7 +1644,7 @@ do_handle_request(AckAction, SendReply, ConnData, TransId); - _ -> + false -> %% Ugh? ignore end; @@ -1620,7 +1718,6 @@ timer_ref = Ref, ack_action = AckAction}, megaco_monitor:insert_reply(Rep2), % Timing problem? - ignore; _ -> @@ -1744,22 +1841,23 @@ ?report_trace(ConnData, "callback: trans long request", [TransId, {request_data, RequestData}]), - case megaco_monitor:lookup_reply(TransId) of - [Rep] when is_record(Rep, reply) -> - %% Update (possibly) new handler - megaco_monitor:insert_reply(Rep#reply{handler = self()}), + %% Attempt to update the handler field for this reply record + %% (if there is one). + case megaco_monitor:update_reply_field(TransId, #reply.handler, self()) of + true -> {AckAction, Res} = - handle_long_request_callback(ConnData, TransId, RequestData, Extra), + handle_long_request_callback(ConnData, TransId, + RequestData, Extra), do_handle_long_request(AckAction, Res, ConnData, TransId); - _ -> + false -> %% Been removed already? ignore end. do_handle_long_request(AckAction, {ok, Bin}, ConnData, TransId) -> - case megaco_monitor:lookup_reply(TransId) of - [Rep] when is_record(Rep, reply) -> + case megaco_monitor:lookup_reply_field(TransId, #reply.trans_id) of + {ok, _} -> Method = timer_method(AckAction), InitTimer = ConnData#conn_data.reply_timer, {WaitFor, CurrTimer} = megaco_timer:init(InitTimer), @@ -1767,15 +1865,14 @@ ConnHandle = ConnData#conn_data.conn_handle, M = ?MODULE, F = reply_timeout, - A = [ConnHandle, Rep#reply.trans_id, CurrTimer], - Ref = megaco_monitor:apply_after(Method, - M, F, A, - WaitFor), - Rep2 = Rep#reply{bytes = OptBin, - state = waiting_for_ack, - timer_ref = Ref, - ack_action = AckAction}, - megaco_monitor:insert_reply(Rep2); % Timing problem? + A = [ConnHandle, TransId, CurrTimer], + Ref = megaco_monitor:apply_after(Method, M, F, A, WaitFor), + NewFields = + [{#reply.bytes, OptBin}, + {#reply.state, waiting_for_ack}, + {#reply.timer_ref, Ref}, + {#reply.ack_action, AckAction}], + megaco_monitor:update_reply_fields(TransId, NewFields); % Timing problem? _ -> %% Been removed already? ignore @@ -2084,7 +2181,7 @@ conn_handle = ConnHandle} = ConnData, TransId, #request{timer_ref = {short, Ref}, - init_long_timer = InitTimer} = Req, T) -> + init_long_timer = InitTimer}, T) -> ?rt2("handle pending - long request", [LRR, InitTimer]), @@ -2106,18 +2203,18 @@ F = request_timeout, A = [ConnHandle, TransId], Ref2 = megaco_monitor:apply_after(M, F, A, WaitFor), - Req2 = + NewFields = case LRR of true -> - Req#request{timer_ref = {long, Ref2}, - curr_timer = CurrTimer}; + [{#request.timer_ref, {long, Ref2}}, + {#request.curr_timer, CurrTimer}]; false -> - Req#request{bytes = {no_send, garb_binary}, - timer_ref = {long, Ref2}, - curr_timer = CurrTimer} + [{#request.bytes, {no_send, garb_binary}}, + {#request.timer_ref, {long, Ref2}}, + {#request.curr_timer, CurrTimer}] end, ?report_trace(ConnData, "trans pending (timer restarted)", [T]), - megaco_monitor:insert_request(Req2); % Timing problem? + megaco_monitor:update_request_fields(TransId, NewFields); % Timing problem? handle_recv_pending(_ConnData, _TransId, #request{timer_ref = {long, _Ref}, @@ -2141,7 +2238,7 @@ handle_recv_pending(#conn_data{conn_handle = ConnHandle} = ConnData, TransId, #request{timer_ref = {long, Ref}, - curr_timer = CurrTimer} = Req, T) -> + curr_timer = CurrTimer}, T) -> ?rt2("handle pending - still waiting", [CurrTimer]), @@ -2162,13 +2259,14 @@ F = request_timeout, A = [ConnHandle, TransId], Ref2 = megaco_monitor:apply_after(M, F, A, WaitFor), - Req2 = Req#request{timer_ref = {long, Ref2}, - curr_timer = Timer2}, + NewFields = + [{#request.timer_ref, {long, Ref2}}, + {#request.curr_timer, Timer2}], ?report_trace(ConnData, "long trans pending" " (timer restarted)", [T]), %% Timing problem? - megaco_monitor:insert_request(Req2). + megaco_monitor:update_request_fields(TransId, NewFields). handle_recv_pending_error(ConnData, TransId, Req, T, Extra) -> @@ -2206,7 +2304,7 @@ %% This _is_ a segmented message. %% %% Since this is not the last segment, we shall not send any ack. -%% (regardless of if three-way-handshake has been configured). +%% (even if three-way-handshake has been configured). %% handle_reply( ConnData, @@ -2236,9 +2334,10 @@ send_segment_reply(ConnData, SN), %% First segment for this reply - Req2 = Req#request{timer_ref = undefined, - seg_recv = [SN]}, - megaco_monitor:insert_request(Req2), + NewFields = + [{#request.timer_ref, undefined}, + {#request.seg_recv, [SN]}], + megaco_monitor:update_request_fields(TransId, NewFields), %% Handle the reply UserMod = Req#request.user_mod, @@ -2282,8 +2381,9 @@ ok; false -> %% First time for this segment - Req2 = Req#request{seg_recv = [ SN | Segs ]}, - megaco_monitor:insert_request(Req2), + megaco_monitor:update_request_field(TransId, + #request.seg_recv, + [ SN | Segs ]), %% Handle the reply UserMod = Req#request.user_mod, @@ -2336,8 +2436,9 @@ send_ack(ConnData), true; {false, Sorted} -> - Req2 = Req#request{seg_recv = Sorted}, - megaco_monitor:insert_request(Req2), + megaco_monitor:update_request_field(TransId, + #request.seg_recv, + Sorted), false end, @@ -2416,10 +2517,11 @@ A = [ConnHandle, TransId, CurrTimer], SegRef = megaco_monitor:apply_after(M, F, A, WaitFor), - Req2 = Req#request{timer_ref = undefined, - seg_recv = [SN], - seg_timer_ref = SegRef}, - megaco_monitor:insert_request(Req2), + NewFields = + [{#request.timer_ref, undefined}, + {#request.seg_recv, [SN]}, + {#request.seg_timer_ref, SegRef}], + megaco_monitor:update_request_fields(TransId, NewFields), false; true -> %% Just one segment! @@ -2484,9 +2586,10 @@ SegRef = megaco_monitor:apply_after(M, F, A, WaitFor), - Req2 = Req#request{seg_recv = Sorted, - seg_timer_ref = SegRef}, - megaco_monitor:insert_request(Req2), + NewFields = + [{#request.seg_recv, Sorted}, + {#request.seg_timer_ref, SegRef}], + megaco_monitor:update_request_fields(TransId, NewFields), false end, @@ -2520,16 +2623,17 @@ %% This is _not_ a segmented message, %% i.e. it's an ordinary transaction reply %% -handle_reply(CD, T, Extra) -> +handle_reply(#conn_data{conn_handle = CH} = CD, T, Extra) -> TransId = to_local_trans_id(CD), ?rt2("handle reply", [T, TransId]), case megaco_monitor:lookup_request(TransId) of [Req] when (is_record(Req, request) andalso - (CD#conn_data.cancel == true)) -> + (CD#conn_data.cancel =:= true)) -> ?TC_AWAIT_REPLY_EVENT(true), do_handle_reply_cancel(CD, Req, T); - [Req] -> + [#request{remote_mid = RMid} = Req] when ((RMid =:= preliminary_mid) orelse + (RMid =:= CH#megaco_conn_handle.remote_mid)) -> ?TC_AWAIT_REPLY_EVENT(false), %% Just in case conn_data got update after our lookup %% but before we looked up the request record, we @@ -2540,6 +2644,25 @@ false -> do_handle_reply(CD, Req, TransId, T, Extra) end; + + [#request{user_mod = UserMod, + user_args = UserArgs, + reply_action = Action, + reply_data = UserData, + remote_mid = RMid}] -> + ?report_trace(CD, + "received trans reply with invalid remote mid", + [T, RMid]), + WrongMid = CH#megaco_conn_handle.remote_mid, + T2 = transform_transaction_reply_enc(CD#conn_data.protocol_version, + T), + UserReply = {error, {wrong_mid, WrongMid, RMid, T2}}, + CD2 = CD#conn_data{user_mod = UserMod, + user_args = UserArgs, + reply_action = Action, + reply_data = UserData}, + return_reply(CD2, TransId, UserReply, Extra); + [] -> ?TC_AWAIT_REPLY_EVENT(undefined), ?report_trace(CD, "trans reply (no receiver)", [T]), @@ -2556,13 +2679,20 @@ reply_data = UserData}, return_unexpected_trans(CD2, T). -do_handle_reply(CD, #request{timer_ref = {_Type, Ref}, % OTP-4843 - user_mod = UserMod, - user_args = UserArgs, - reply_action = Action, - reply_data = UserData}, TransId, T, Extra) -> +%% Plain old handling of incomming replies +do_handle_reply(CD, + #request{timer_ref = {_Type, Ref}, % OTP-4843 + user_mod = UserMod, + user_args = UserArgs, + reply_action = Action, + reply_data = UserData, + keep_alive_timer = RKAT}, + TransId, T, Extra) + when ((RKAT =:= plain) orelse (Action =:= call)) -> %% Don't care about Req and Rep version diff ?report_trace(CD, "trans reply", [T]), + + %% This is the first reply (maybe of many) megaco_monitor:delete_request(TransId), megaco_monitor:cancel_apply_after(Ref), % OTP-4843 megaco_config:del_pending_counter(recv, TransId), % OTP-7189 @@ -2581,6 +2711,90 @@ user_args = UserArgs, reply_action = Action, reply_data = UserData}, + return_reply(CD2, TransId, UserReply, Extra); + +%% This may be the first reply (of maybe many) +do_handle_reply(CD, + #request{user_mod = UserMod, + user_args = UserArgs, + reply_action = Action, + reply_data = UserData, + keep_alive_ref = undefined} = Req, + TransId, T, Extra) -> + %% Don't care about Req and Rep version diff + ?report_trace(CD, "trans reply", [T]), + + %% Could be the first reply, in which case we shall start the + %% Request Keep Alive timer... + %% This could happen for more than one (1) reply though, so + %% we need to check if the counter value actually equals one (1)! + + ReplyNo = + create_or_maybe_increment_request_keep_alive_counter(CD, TransId), + if + (ReplyNo =:= 1) -> + %% This *is* the first reply!! + %% 1) Stop resend timer + {_Type, Ref} = Req#request.timer_ref, % OTP-4843 + megaco_monitor:cancel_apply_after(Ref), % OTP-4843 + + %% 2) Delete pending counter + megaco_config:del_pending_counter(recv, TransId), % OTP-7189 + + %% 3) Start request keep alive timer + ConnHandle = CD#conn_data.conn_handle, + RKATimer = Req#request.keep_alive_timer, + {RKAWaitFor, _} = megaco_timer:init(RKATimer), + RKARef = megaco_monitor:apply_after(?MODULE, + request_keep_alive_timeout, + [ConnHandle, TransId], + RKAWaitFor), + + %% 4) Maybe send acknowledgement (three-way-handshake) + maybe_send_ack(T#megaco_transaction_reply.immAckRequired, CD), + + %% 5) And finally store the updated request record + Req2 = Req#request{keep_alive_ref = RKARef}, + megaco_monitor:insert_request(Req2); + + true -> + ok + end, + + UserReply = + case T#megaco_transaction_reply.transactionResult of + {transactionError, Reason} -> + {error, ReplyNo, Reason}; + {actionReplies, Replies} -> + {ok, ReplyNo, Replies} + end, + CD2 = CD#conn_data{user_mod = UserMod, + user_args = UserArgs, + reply_action = Action, + reply_data = UserData}, + return_reply(CD2, TransId, UserReply, Extra); + +%% This is *not* the first reply (of many) +do_handle_reply(CD, #request{user_mod = UserMod, + user_args = UserArgs, + reply_action = Action, + reply_data = UserData}, TransId, T, Extra) -> + %% Don't care about Req and Rep version diff + ?report_trace(CD, "trans reply (first reply already delivered)", [T]), + + ReplyNo = increment_request_keep_alive_counter(CD, TransId), + + UserReply = + case T#megaco_transaction_reply.transactionResult of + {transactionError, Reason} -> + {error, ReplyNo, Reason}; + {actionReplies, Replies} -> + {ok, ReplyNo, Replies} + end, + CD2 = CD#conn_data{user_mod = UserMod, + user_args = UserArgs, + reply_action = Action, + reply_data = UserData}, return_reply(CD2, TransId, UserReply, Extra). is_all_segments(Segs) -> @@ -2617,12 +2831,14 @@ [] -> %% We are done Ref = Rep#reply.timer_ref, megaco_monitor:cancel_apply_after(Ref), - Rep2 = Rep#reply{bytes = []}, - megaco_monitor:insert_reply(Rep2), + megaco_monitor:update_reply_field(TransId2, + #reply.bytes, + []), ok; NewSent -> - Rep2 = Rep#reply{bytes = NewSent}, - megaco_monitor:insert_reply(Rep2), + megaco_monitor:update_reply_field(TransId2, + #reply.bytes, + NewSent), ok end; _ -> @@ -2630,8 +2846,8 @@ end; [#reply{bytes = Sent, - segments = NotSent} = Rep] when is_list(Sent) andalso - is_list(NotSent) -> + segments = NotSent}] when is_list(Sent) andalso + is_list(NotSent) -> ?rt2("unsent segments", [Sent, NotSent]), handle_segment_reply_callback(CD, TransId, SN, SC, Extra), case lists:keysearch(SN, 1, Sent) of @@ -2644,9 +2860,11 @@ {ok, Bin3} -> ?rt2("another segment sent", [Bin3]), NewSent2 = [{SN2, Bin3, undefined}|NewSent], - Rep2 = Rep#reply{bytes = NewSent2, - segments = NewNotSent}, - megaco_monitor:insert_reply(Rep2), + NewFields = + [{#reply.bytes, NewSent2}, + {#reply.segments, NewNotSent}], + megaco_monitor:update_reply_fields(TransId2, + NewFields), ok; Error -> incNumErrors(CD#conn_data.conn_handle), @@ -2656,8 +2874,9 @@ error_msg("failed sending transaction reply [~w] " "segment [~w]: ~w", [TransId, SN2, Error]), - Rep2 = Rep#reply{bytes = NewSent}, - megaco_monitor:insert_reply(Rep2), + megaco_monitor:update_reply_field(TransId2, + #reply.bytes, + NewSent), ok end; _ -> @@ -2992,7 +3211,7 @@ prepare_req_send_options(CH, Opts) -> case megaco_config:lookup_local_conn(CH) of [CD] -> - override_req_send_options(CD, Opts); + override_req_send_options(any, CD, Opts); [] -> {error, {not_found, conn_data}} end. @@ -3051,7 +3270,8 @@ call_or_cast(CallOrCast, ConnHandle, ActionsList, Options, ProxyMon) when is_record(ConnHandle, megaco_conn_handle) -> - case prepare_req_send_options(ConnHandle, Options, ActionsList) of + case prepare_req_send_options(CallOrCast, + ConnHandle, Options, ActionsList) of {ok, ConnData} -> ?report_trace(ConnData, "call_or_cast - options prepared", []), case encode_requests(ConnData, ActionsList) of @@ -3143,7 +3363,7 @@ call_proxy(Parent, CD, TransIds) -> Reply = proxy_wait_for_reply(CD, TransIds, []), Parent ! {reply, self(), Reply}, - call_proxy_gc(CD, 5000). + call_proxy_gc(CD, CD#conn_data.call_proxy_gc_timeout). call_proxy_gc(CD, Timeout) when (Timeout > 0) -> T = t(), @@ -3161,7 +3381,9 @@ after Timeout -> exit(normal) - end. + end; +call_proxy_gc(_CD, _Timeout) -> + exit(normal). proxy_wait_for_reply(_CD, [], Replies0) -> % Make sure they come in the same order as the requests where sent @@ -3485,31 +3707,33 @@ insert_request(ConnData, ConnHandle, TransId, Action, Data, InitTimer, LongTimer) -> #megaco_conn_handle{remote_mid = RemoteMid} = ConnHandle, - #conn_data{protocol_version = Version, - user_mod = UserMod, - user_args = UserArgs, - send_handle = SendHandle, - reply_data = ReplyData, - segment_recv_timer = InitSegTimer} = ConnData, + #conn_data{protocol_version = Version, + user_mod = UserMod, + user_args = UserArgs, + send_handle = SendHandle, + reply_data = ReplyData, + segment_recv_timer = InitSegTimer, + request_keep_alive_timeout = RKATimer} = ConnData, {WaitFor, CurrTimer} = megaco_timer:init(InitTimer), M = ?MODULE, F = request_timeout, A = [ConnHandle, TransId], Ref = megaco_monitor:apply_after(M, F, A, WaitFor), - Req = #request{trans_id = TransId, - remote_mid = RemoteMid, - timer_ref = ?SIM({short, Ref}, init_request_timer), - init_timer = InitTimer, - init_long_timer = LongTimer, - curr_timer = CurrTimer, - version = Version, - bytes = {send, Data}, - send_handle = SendHandle, - user_mod = UserMod, - user_args = UserArgs, - reply_action = Action, - reply_data = ReplyData, - init_seg_timer = InitSegTimer}, + Req = #request{trans_id = TransId, + remote_mid = RemoteMid, + timer_ref = ?SIM({short, Ref}, init_request_timer), + init_timer = InitTimer, + init_long_timer = LongTimer, + curr_timer = CurrTimer, + version = Version, + bytes = {send, Data}, + send_handle = SendHandle, + user_mod = UserMod, + user_args = UserArgs, + reply_action = Action, + reply_data = ReplyData, + init_seg_timer = InitSegTimer, + keep_alive_timer = RKATimer}, megaco_monitor:insert_request(Req). % Timing problem? @@ -3519,13 +3743,13 @@ ConnData2 = ConnData#conn_data{reply_data = ReplyNode}, send_request(ConnData2, ConnHandle, TransInfo, Action, Bin). -prepare_req_send_options(ConnHandle, Options, Actions) -> +prepare_req_send_options(CallOrCast, ConnHandle, Options, Actions) -> %% Ensures that two processes cannot get same transaction id. %% Bad send options may cause spurious transaction id to be consumed. Incr = number_of_transactions(Actions), case megaco_config:incr_trans_id_counter(ConnHandle, Incr) of {ok, ConnData} -> - override_req_send_options(ConnData, Options); + override_req_send_options(CallOrCast, ConnData, Options); {error, Reason} -> {error, Reason} end. @@ -3535,19 +3759,19 @@ number_of_transactions(ActionsList) -> length(ActionsList). -override_req_send_options(ConnData, [{Key, Val} | Tail]) -> +override_req_send_options(ReplyAction, ConnData, [{Key, Val} | Tail]) -> case Key of protocol_version -> ConnData2 = ConnData#conn_data{protocol_version = Val}, - override_req_send_options(ConnData2, Tail); + override_req_send_options(ReplyAction, ConnData2, Tail); send_handle -> ConnData2 = ConnData#conn_data{send_handle = Val}, - override_req_send_options(ConnData2, Tail); + override_req_send_options(ReplyAction, ConnData2, Tail); request_timer -> case megaco_config:verify_val(Key, Val) of true -> ConnData2 = ConnData#conn_data{request_timer = Val}, - override_req_send_options(ConnData2, Tail); + override_req_send_options(ReplyAction, ConnData2, Tail); false -> {error, {bad_send_option, {Key, Val}}} end; @@ -3555,31 +3779,51 @@ case megaco_config:verify_val(Key, Val) of true -> ConnData2 = ConnData#conn_data{long_request_timer = Val}, - override_req_send_options(ConnData2, Tail); + override_req_send_options(ReplyAction, ConnData2, Tail); + false -> + {error, {bad_send_option, {Key, Val}}} + end; + call_proxy_gc_timeout when (ReplyAction =:= call) orelse + (ReplyAction =:= any) -> + case megaco_config:verify_val(Key, Val) of + true -> + ConnData2 = + ConnData#conn_data{call_proxy_gc_timeout = Val}, + override_req_send_options(ReplyAction, ConnData2, Tail); + false -> + {error, {bad_send_option, {Key, Val}}} + end; + request_keep_alive_timeout when (ReplyAction =:= cast) orelse + (ReplyAction =:= any) -> + case megaco_config:verify_val(Key, Val) of + true -> + ConnData2 = + ConnData#conn_data{request_keep_alive_timeout = Val}, + override_req_send_options(ReplyAction, ConnData2, Tail); false -> {error, {bad_send_option, {Key, Val}}} end; reply_data -> ConnData2 = ConnData#conn_data{reply_data = Val}, - override_req_send_options(ConnData2, Tail); + override_req_send_options(ReplyAction, ConnData2, Tail); user_mod when is_atom(Val) -> ConnData2 = ConnData#conn_data{user_mod = Val}, - override_req_send_options(ConnData2, Tail); + override_req_send_options(ReplyAction, ConnData2, Tail); user_args when is_list(Val) -> ConnData2 = ConnData#conn_data{user_args = Val}, - override_req_send_options(ConnData2, Tail); - trans_req when Val == false -> + override_req_send_options(ReplyAction, ConnData2, Tail); + trans_req when Val =:= false -> %% We only allow turning the transaction-sender off, since %% the opposite (turning it on) would causing to much headake... %% This will allow not using the transaction sender for %% occasional messages - ConnData2 = ConnData#conn_data{trans_req = Val, + ConnData2 = ConnData#conn_data{trans_req = Val, trans_sender = undefined}, - override_req_send_options(ConnData2, Tail); + override_req_send_options(ReplyAction, ConnData2, Tail); _Bad -> {error, {bad_send_option, {Key, Val}}} end; -override_req_send_options(ConnData, []) -> +override_req_send_options(_ReplyAction, ConnData, []) -> {ok, ConnData}. override_rep_send_options(ConnData, [{Key, Val} | Tail]) -> @@ -3598,12 +3842,12 @@ false -> {error, {bad_send_option, {Key, Val}}} end; - trans_req when Val == false -> + trans_req when Val =:= false -> %% We only allow turning the transaction-sender off, since %% the opposite (turning it on) would causing to much headake... %% This will allow not using the transaction sender for %% occasional messages - ConnData2 = ConnData#conn_data{trans_req = Val, + ConnData2 = ConnData#conn_data{trans_req = Val, trans_sender = undefined}, override_rep_send_options(ConnData2, Tail); _Bad -> @@ -4161,6 +4405,12 @@ ok. +request_keep_alive_timeout(ConnHandle, TransId) -> + megaco_config:del_pending_counter(ConnHandle, TransId), + megaco_monitor:lookup_request(TransId), + ok. + + request_timeout(ConnHandle, TransId) -> ?rt1(ConnHandle, "request timeout", [TransId]), case megaco_monitor:lookup_request(TransId) of @@ -4168,12 +4418,12 @@ request_not_found_ignore; [Req] when is_record(Req, request) -> case megaco_config:lookup_local_conn(ConnHandle) of - [CD] when (CD#conn_data.cancel == true) -> + [CD] when (CD#conn_data.cancel =:= true) -> cancel_in_progress_ignore; [CD] -> incNumTimerRecovery(ConnHandle), do_request_timeout(ConnHandle, TransId, CD, Req); - [] when ConnHandle#megaco_conn_handle.remote_mid == preliminary_mid -> + [] when ConnHandle#megaco_conn_handle.remote_mid =:= preliminary_mid -> %% There are two possibillities: %% 1) The connection has just been upgraded from a %% preliminary to a real connection. So this timeout @@ -4257,10 +4507,11 @@ F = request_timeout, A = [ConnHandle, TransId], Ref2 = megaco_monitor:apply_after(M, F, A, WaitFor), - Req2 = Req#request{bytes = {SendOrNoSend, OptBin}, - timer_ref = {Type, Ref2}, - curr_timer = Timer2}, - megaco_monitor:insert_request(Req2), % Timing problem + NewFields = + [{#request.bytes, {SendOrNoSend, OptBin}}, + {#request.timer_ref, {Type, Ref2}}, + {#request.curr_timer, Timer2}], + megaco_monitor:update_request_fields(TransId, NewFields), % Timing problem {restarted, WaitFor, Timer2} end. @@ -4314,7 +4565,7 @@ [#reply{state = waiting_for_ack, ack_action = {handle_ack, _}} = Rep] -> case megaco_config:lookup_local_conn(ConnHandle) of - [CD] when (CD#conn_data.cancel == true) -> + [CD] when (CD#conn_data.cancel =:= true) -> cancel_in_progress_ignore; [CD] -> incNumTimerRecovery(ConnHandle), @@ -4411,7 +4662,7 @@ lists:foreach(ReSend, Sent), do_reply_timeout(ConnHandle, TransId, Timer, Rep). -do_reply_timeout(ConnHandle, TransId, Timer, #reply{bytes = Bytes} = Rep) -> +do_reply_timeout(ConnHandle, TransId, Timer, #reply{bytes = Bytes}) -> {WaitFor, Timer2} = megaco_timer:restart(Timer), OptBin = case Bytes of Bin when is_binary(Bin) -> @@ -4424,9 +4675,10 @@ F = reply_timeout, A = [ConnHandle, TransId, Timer2], Ref2 = megaco_monitor:apply_after(M, F, A, WaitFor), - Rep2 = Rep#reply{bytes = OptBin, - timer_ref = Ref2}, - megaco_monitor:insert_reply(Rep2), % Timing problem? + NewFields = + [{#reply.bytes, OptBin}, + {#reply.timer_ref, Ref2}], + megaco_monitor:update_reply_fields(TransId, NewFields), % Timing problem? {restarted, WaitFor, Timer2}. @@ -4553,8 +4805,8 @@ ?report_trace(CD, "handle pending timeout", []), case megaco_monitor:lookup_reply(TransId) of [#reply{state = State, - handler = Pid} = Rep] when State == prepare; - State == eval_request -> + handler = Pid} = Rep] when (State =:= prepare) orelse + (State =:= eval_request) -> #conn_data{sent_pending_limit = Limit, conn_handle = ConnHandle} = CD, @@ -4592,9 +4844,10 @@ A = [ConnHandle, TransId, Timer2], PendingRef = megaco_monitor:apply_after(M, F, A, WaitFor), - Rep2 = Rep#reply{pending_timer_ref = PendingRef}, %% Timing problem? - megaco_monitor:insert_reply(Rep2), + megaco_monitor:update_reply_field(TransId, + #reply.pending_timer_ref, + PendingRef), {restarted, WaitFor, Timer2} end; @@ -4613,7 +4866,6 @@ handle_request_abort_callback(CD, TransId, Pid), %% Timing problem? Rep2 = Rep#reply{state = aborted}, - %% megaco_monitor:insert_reply(Rep2); cancel_reply(CD, Rep2, aborted), pending_limit_error; @@ -4651,7 +4903,7 @@ incNumTimerRecovery(ConnHandle), case megaco_monitor:lookup_request(TransId) of [] -> - ignore; + timeout_not_found_ignore; [#request{seg_recv = Segs} = Req] -> ConnData = @@ -4685,26 +4937,25 @@ reply_data = UserData}, return_reply(ConnData2, TransId, UserReply) end - end, - ok; + end; segment_timeout(ConnHandle, TransId, Timer) -> ?report_trace(ConnHandle, "segment timeout", [TransId, Timer]), - case megaco_monitor:lookup_request(TransId) of - [] -> - ignore; - - [Req] when is_record(Req, request) -> + case megaco_monitor:lookup_request_field(TransId, #request.trans_id) of + {ok, _} -> {WaitFor, Timer2} = megaco_timer:restart(Timer), M = ?MODULE, F = segment_timeout, A = [ConnHandle, TransId, Timer2], Ref = megaco_monitor:apply_after(M, F, A, WaitFor), - Req2 = Req#request{seg_timer_ref = Ref}, %% Timing problem? - megaco_monitor:insert_request(Req2) - end, - ok. + megaco_monitor:update_request_field(TransId, + #request.seg_timer_ref, + Ref), + {restarted, WaitFor, Timer2}; + _ -> + not_found_ignore + end. %% segment_reply_timeout() -> %% ok. diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_messenger_misc.erl erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_messenger_misc.erl --- erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_messenger_misc.erl 2009-03-12 12:31:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_messenger_misc.erl 2009-09-18 15:13:04.000000000 +0100 @@ -245,7 +245,7 @@ EM = ConnData#conn_data.encoding_mod, EC = ConnData#conn_data.encoding_config, case (catch EM:encode_message(EC, V, MegaMsg)) of - {ok, Bin} when binary(Bin) -> + {ok, Bin} when is_binary(Bin) -> ?SIM({ok, Bin}, encode_body); {error, Reason} -> incNumErrors(ConnData#conn_data.conn_handle), diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_monitor.erl erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_monitor.erl --- erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_monitor.erl 2009-03-12 12:30:29.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_monitor.erl 2009-11-20 13:37:08.000000000 +0000 @@ -44,15 +44,19 @@ cancel_apply_after/1, lookup_request/1, + lookup_request_field/2, match_requests/1, which_requests/1, insert_request/1, + update_request_field/3, update_request_fields/2, delete_request/1, lookup_reply/1, + lookup_reply_field/2, match_replies/1, which_replies/1, insert_reply/1, insert_reply_new/1, + update_reply_field/3, update_reply_fields/2, delete_reply/1, apply_at_exit/4, @@ -82,6 +86,16 @@ lookup_request(Key) -> ets:lookup(megaco_requests, Key). +lookup_request_field(Key, Field) -> + try + begin + {ok, ets:lookup_element(megaco_requests, Key, Field)} + end + catch + error:badarg -> + {error, not_found} + end. + match_requests(Pat) -> ets:match_object(megaco_requests, Pat). @@ -92,12 +106,28 @@ insert_request(Rec) -> ets:insert(megaco_requests, Rec). +update_request_field(Key, Field, NewValue) -> + ets:update_element(megaco_requests, Key, {Field, NewValue}). + +update_request_fields(Key, NewFields) when is_list(NewFields) -> + ets:update_element(megaco_requests, Key, NewFields). + delete_request(Key) -> ets:delete(megaco_requests, Key). lookup_reply(Key) -> ets:lookup(megaco_replies, Key). +lookup_reply_field(Key, Field) -> + try + begin + {ok, ets:lookup_element(megaco_replies, Key, Field)} + end + catch + error:badarg -> + {error, not_found} + end. + match_replies(Pat) -> ets:match_object(megaco_replies, Pat). @@ -111,17 +141,24 @@ insert_reply_new(Rec) -> ets:insert_new(megaco_replies, Rec). +update_reply_field(Key, Field, NewValue) -> + ets:update_element(megaco_replies, Key, {Field, NewValue}). + +update_reply_fields(Key, NewFields) when is_list(NewFields) -> + ets:update_element(megaco_replies, Key, NewFields). + delete_reply(Key) -> ets:delete(megaco_replies, Key). apply_after(M, F, A, Time) -> apply_after(spawn_method, M, F, A, Time). -apply_after(Method, M, F, A, Time) when atom(M), atom(F), list(A) -> +apply_after(Method, M, F, A, Time) + when is_atom(M) andalso is_atom(F) andalso is_list(A) -> if - Time == infinity -> + Time =:= infinity -> apply_after_infinity; - integer(Time) -> + is_integer(Time) -> Msg = {apply_after, Method, M, F, A}, Ref = erlang:send_after(Time, whereis(?SERVER), Msg), {apply_after, Ref} @@ -129,7 +166,7 @@ cancel_apply_after({apply_after, Ref}) -> case erlang:cancel_timer(Ref) of - TimeLeft when integer(TimeLeft) -> + TimeLeft when is_integer(TimeLeft) -> {ok, TimeLeft}; _ -> {ok, 0} @@ -141,7 +178,7 @@ %% Performs apply(M, F, [Reason | A]) when process Pid dies apply_at_exit(M, F, A, Pid) - when atom(M), atom(F), list(A), pid(Pid) -> + when is_atom(M) andalso is_atom(F) andalso is_list(A) andalso is_pid(Pid) -> Ref = call({apply_at_exit, M, F, A, Pid}), {apply_at_exit, Ref}. diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_sdp.erl erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_sdp.erl --- erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_sdp.erl 2009-03-12 12:30:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_sdp.erl 2009-09-18 13:47:43.000000000 +0100 @@ -19,7 +19,7 @@ %% %%---------------------------------------------------------------------- -%% Purpose: +%% Purpose: RFC 4566 %%---------------------------------------------------------------------- -module(megaco_sdp). @@ -465,24 +465,24 @@ F = fun(R) -> not is_pg_record(Type, R) end, lists:filter(F, PG). -is_pg_record(v, R) when record(R, megaco_sdp_v) -> true; -is_pg_record(c, R) when record(R, megaco_sdp_c) -> true; -is_pg_record(m, R) when record(R, megaco_sdp_m) -> true; -is_pg_record(o, R) when record(R, megaco_sdp_o) -> true; -is_pg_record(a, R) when record(R, megaco_sdp_a) -> true; -is_pg_record(a, R) when record(R, megaco_sdp_a_ptime) -> true; -is_pg_record(a, R) when record(R, megaco_sdp_a_rtpmap) -> true; -is_pg_record(b, R) when record(R, megaco_sdp_b) -> true; -is_pg_record(t, R) when record(R, megaco_sdp_t) -> true; -is_pg_record(r, R) when record(R, megaco_sdp_r) -> true; -is_pg_record(z, R) when record(R, megaco_sdp_z) -> true; -is_pg_record(k, R) when record(R, megaco_sdp_k) -> true; -is_pg_record(s, R) when record(R, megaco_sdp_s) -> true; -is_pg_record(i, R) when record(R, megaco_sdp_i) -> true; -is_pg_record(u, R) when record(R, megaco_sdp_u) -> true; -is_pg_record(e, R) when record(R, megaco_sdp_e) -> true; -is_pg_record(p, R) when record(R, megaco_sdp_p) -> true; -is_pg_record(_, _) -> false. +is_pg_record(v, R) when is_record(R, megaco_sdp_v) -> true; +is_pg_record(c, R) when is_record(R, megaco_sdp_c) -> true; +is_pg_record(m, R) when is_record(R, megaco_sdp_m) -> true; +is_pg_record(o, R) when is_record(R, megaco_sdp_o) -> true; +is_pg_record(a, R) when is_record(R, megaco_sdp_a) -> true; +is_pg_record(a, R) when is_record(R, megaco_sdp_a_ptime) -> true; +is_pg_record(a, R) when is_record(R, megaco_sdp_a_rtpmap) -> true; +is_pg_record(b, R) when is_record(R, megaco_sdp_b) -> true; +is_pg_record(t, R) when is_record(R, megaco_sdp_t) -> true; +is_pg_record(r, R) when is_record(R, megaco_sdp_r) -> true; +is_pg_record(z, R) when is_record(R, megaco_sdp_z) -> true; +is_pg_record(k, R) when is_record(R, megaco_sdp_k) -> true; +is_pg_record(s, R) when is_record(R, megaco_sdp_s) -> true; +is_pg_record(i, R) when is_record(R, megaco_sdp_i) -> true; +is_pg_record(u, R) when is_record(R, megaco_sdp_u) -> true; +is_pg_record(e, R) when is_record(R, megaco_sdp_e) -> true; +is_pg_record(p, R) when is_record(R, megaco_sdp_p) -> true; +is_pg_record(_, _) -> false. %%====================================================================== @@ -1154,7 +1154,7 @@ decode_pp_attribute_value("ptime", AttrValue) -> ?d("decode_pp_attribute -> ptime", []), - PacketTimeStr = AttrValue, + PacketTimeStr = string:strip(AttrValue, both, $ ), PacketTime = s2i(PacketTimeStr, invalid_ptime_packet_time), ?d("decode_pp_attribute -> PacketTime: ~w", [PacketTime]), @@ -1163,7 +1163,7 @@ decode_pp_attribute_value("maxptime", AttrValue) -> ?d("decode_pp_attribute -> maxptime", []), - MaxPacketTimeStr = AttrValue, + MaxPacketTimeStr = string:strip(AttrValue, both, $ ), MaxPacketTime = s2i(MaxPacketTimeStr, invalid_maxptime_maximum_packet_time), ?d("decode_pp_attribute -> MaxPacketTime: ~w", [MaxPacketTime]), diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_trans_sender.erl erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_trans_sender.erl --- erlang-13.b.1-dfsg/lib/megaco/src/engine/megaco_trans_sender.erl 2009-03-12 12:31:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/engine/megaco_trans_sender.erl 2009-09-18 15:13:04.000000000 +0100 @@ -73,51 +73,54 @@ Args = [self(), CH, To, MaxSzReqs, MaxNoReqs, MaxNoAcks], proc_lib:start_link(?MODULE, init, Args). -stop(Pid) when pid(Pid) -> +stop(Pid) when is_pid(Pid) -> Pid ! stop, ok. -upgrade(Pid, CH) when pid(Pid) -> +upgrade(Pid, CH) when is_pid(Pid) -> Pid ! {upgrade, CH}, ok. -send_req(Pid, Tid, Req) when pid(Pid), binary(Req) -> +send_req(Pid, Tid, Req) when is_pid(Pid) andalso is_binary(Req) -> Pid ! {send_req, Tid, Req}, ok. send_reqs(Pid, Tids, Reqs) - when pid(Pid), list(Tids), list(Reqs), length(Tids) == length(Reqs) -> + when is_pid(Pid) andalso + is_list(Tids) andalso + is_list(Reqs) andalso + (length(Tids) =:= length(Reqs)) -> Pid ! {send_reqs, Tids, Reqs}, ok. -send_ack(Pid, Serial) when pid(Pid), integer(Serial) -> +send_ack(Pid, Serial) when is_pid(Pid) andalso is_integer(Serial) -> Pid ! {send_ack, Serial}, ok. -send_ack_now(Pid, Serial) when pid(Pid), integer(Serial) -> +send_ack_now(Pid, Serial) when is_pid(Pid) andalso is_integer(Serial) -> Pid ! {send_ack_now, Serial}, ok. -send_pending(Pid, Serial) when pid(Pid), integer(Serial) -> +send_pending(Pid, Serial) when is_pid(Pid) andalso is_integer(Serial) -> Pid ! {send_pending, Serial}, ok. -send_reply(Pid, Reply) when pid(Pid), binary(Reply) -> +send_reply(Pid, Reply) when is_pid(Pid) andalso is_binary(Reply) -> Pid ! {send_reply, Reply}. -ack_maxcount(Pid, Max) when pid(Pid), integer(Max) -> +ack_maxcount(Pid, Max) when is_pid(Pid) andalso is_integer(Max) -> Pid ! {ack_maxcount, Max}, ok. -req_maxcount(Pid, Max) when pid(Pid), integer(Max) -> +req_maxcount(Pid, Max) when is_pid(Pid) andalso is_integer(Max) -> Pid ! {req_maxcount, Max}, ok. -req_maxsize(Pid, Max) when pid(Pid), integer(Max) -> +req_maxsize(Pid, Max) when is_pid(Pid) andalso is_integer(Max) -> Pid ! {req_maxsize, Max}, ok. -timeout(Pid, Timeout) when pid(Pid) -> +timeout(Pid, Timeout) when is_pid(Pid) -> Pid ! {timeout, Timeout}, ok. diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/flex/megaco_flex_scanner_drv.flex.src erlang-13.b.3-dfsg/lib/megaco/src/flex/megaco_flex_scanner_drv.flex.src --- erlang-13.b.1-dfsg/lib/megaco/src/flex/megaco_flex_scanner_drv.flex.src 2009-06-05 13:55:44.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/src/flex/megaco_flex_scanner_drv.flex.src 2009-09-18 15:12:52.000000000 +0100 @@ -1021,8 +1021,6 @@ // MfsErlDrvData* dataP = &mfs_drv_data; #endif - DBG( ("mfs_load_property_groups -> entry\n") ); - /* * Process the property groups string * v= is a property group delimiter @@ -1044,6 +1042,8 @@ int valueStart = 0; // Start position of the property parm name int valueLen = 0; // Length of the value part + DBG( ("mfs_load_property_groups -> entry\n") ); + mfs_ensure_term_spec(dataP, 10); /* Just in case... */ while (i <= yyleng) { @@ -1498,14 +1498,14 @@ static ErlDrvData mfs_start(ErlDrvPort port, char *buf) { - DBG( ("mfs_start -> entry\n") ); - #if defined(MEGACO_REENTRANT_FLEX_SCANNER) MfsErlDrvData* dataP = ALLOC(sizeof(MfsErlDrvData)); #else MfsErlDrvData* dataP = &mfs_drv_data; #endif + DBG( ("mfs_start -> entry\n") ); + dataP->port = port; dataP->digit_map_name_ptr = NULL; dataP->digit_map_name_len = 0; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder.erl 2009-03-12 12:30:26.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder.erl 2009-09-18 15:12:41.000000000 +0100 @@ -97,7 +97,6 @@ {error, {decode_failed, Reason, Line}} end. - decode_message(EC, Bin) -> %% d("decode_message -> entry with" %% "~n EC: ~p", [EC]), @@ -119,10 +118,10 @@ {error, {unsupported_version, V}}; {error, Reason, Tokens, Line} -> - parse_error(Reason, Line, Tokens, Bin); + scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,v3}], _, Bin) when is_binary(Bin) -> %% d("decode_message(v3) -> entry"), @@ -140,10 +139,10 @@ {error, {unsupported_version, V}}; {error, Reason, Tokens, Line} -> - parse_error(Reason, Line, Tokens, Bin); + scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,prev3c}], _, Bin) when is_binary(Bin) -> %% d("decode_message(prev3c) -> entry"), @@ -161,10 +160,10 @@ {error, {unsupported_version, V}}; {error, Reason, Tokens, Line} -> - parse_error(Reason, Line, Tokens, Bin); + scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,prev3b}], _, Bin) when is_binary(Bin) -> %% d("decode_message(prev3b) -> entry"), @@ -182,10 +181,10 @@ {error, {unsupported_version, V}}; {error, Reason, Tokens, Line} -> - parse_error(Reason, Line, Tokens, Bin); + scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,prev3a}], _, Bin) when is_binary(Bin) -> %% d("decode_message(prev3a) -> entry"), @@ -203,10 +202,10 @@ {error, {unsupported_version, V}}; {error, Reason, Tokens, Line} -> - parse_error(Reason, Line, Tokens, Bin); + scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{flex, Port}], _, Bin) when is_binary(Bin) -> %% d("decode_message(flex) -> entry"), @@ -224,10 +223,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,v3},{flex, Port}], _, Bin) when is_binary(Bin) -> %% d("decode_message(v3,flex) -> entry"), @@ -245,10 +244,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,prev3c},{flex, Port}], _, Bin) when is_binary(Bin) -> %% d("decode_message(prev3c,flex) -> entry"), @@ -266,10 +265,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> - parse_error(Reason, Line, [], Bin) + scan_error(Reason, Line, Bin) end; decode_message([{version3,prev3b},{flex, Port}], _, Bin) when is_binary(Bin) -> %% d("decode_message(prev3b,flex) -> entry"), @@ -287,10 +286,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,prev3a},{flex, Port}], _, Bin) when is_binary(Bin) -> %% d("decode_message(prev3a,flex) -> entry"), @@ -308,10 +307,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message(EC, _, Bin) when is_binary(Bin) -> {error, {bad_encoding_config, EC}}; @@ -341,29 +340,45 @@ megaco_text_mini_decoder:decode_message(EC, Bin). +scan_error(Reason, Line, Bin) -> + scan_error(Reason, Line, [], Bin). + +scan_error("bad_property_parm: " ++ Reason, _Line, _Tokens, _Bin) -> + {error, {bad_property_parm, Reason}}; +scan_error(Reason, Line, Tokens, Bin) -> + %% io:format("scanner error: " + %% "~n Reason: ~p" + %% "~n Line: ~p" + %% "~n Tokens: ~p" + %% "~n Bin: ~p" + %% "~n", [Reason, Line, Tokens, Bin]), + {error, [{reason, Reason, Line}, {token, Tokens}, {chars, Bin}]}. + parse_error(Reason, Tokens, Chars) -> - %% io:format("parse_error -> entry with" + %% io:format("parser error -> entry with" %% "~n Reason: ~p" - %% "~n Tokens: ~p" - %% "~n", [Reason, Tokens]), + %% "~n Tokens: ~p" + %% "~n", [Reason, Tokens]), case Reason of - "bad_property_parm: " ++ NewReason -> - {error, {bad_property_parm, NewReason}}; + {Line, Mod, [Prefix, [$[, TokenStringRaw, $]]]} when + is_integer(Line) andalso + is_atom(Mod) andalso + is_list(Prefix) andalso + is_list(TokenStringRaw) -> + TokenString = [l2i(X) || X <- TokenStringRaw, is_list(X)], + ReasonStr = Prefix ++ TokenString, + {error, [{reason, ReasonStr, Line}, {tokens, Tokens}, {chars, Chars}, {module, Mod}]}; _ -> {error, [{reason, Reason}, {token, Tokens}, {chars, Chars}]} end. -parse_error(Reason, Line, Tokens, Chars) -> - %% io:format("parse_error -> entry with" - %% "~n Reason: ~p" - %% "~n Line: ~p" - %% "~n Tokens: ~p" - %% "~n", [Reason, Line, Tokens]), - case Reason of - "bad_property_parm: " ++ NewReason -> - {error, {bad_property_parm, NewReason}}; - _ -> - {error, [{reason, Reason, Line}, {token, Tokens}, {chars, Chars}]} + +l2i(L) when is_list(L) -> + case (catch list_to_integer(L)) of + I when is_integer(I) -> + I; + _ -> + L end. @@ -398,28 +413,28 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_requests([{version3,_}|EC], 1, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> megaco_compact_text_encoder_v1:encode_action_requests(EC, ActReqs); -encode_action_requests(EC, 1, ActReqs) when list(ActReqs) -> +encode_action_requests(EC, 1, ActReqs) when is_list(ActReqs) -> megaco_compact_text_encoder_v1:encode_action_requests(EC, ActReqs); encode_action_requests([{version3,_}|EC], 2, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> megaco_compact_text_encoder_v2:encode_action_requests(EC, ActReqs); -encode_action_requests(EC, 2, ActReqs) when list(ActReqs) -> +encode_action_requests(EC, 2, ActReqs) when is_list(ActReqs) -> megaco_compact_text_encoder_v2:encode_action_requests(EC, ActReqs); encode_action_requests([{version3,prev3c}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> megaco_compact_text_encoder_prev3c:encode_action_requests(EC, ActReqs); encode_action_requests([{version3,prev3b}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> megaco_compact_text_encoder_prev3b:encode_action_requests(EC, ActReqs); encode_action_requests([{version3,prev3a}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> megaco_compact_text_encoder_prev3a:encode_action_requests(EC, ActReqs); encode_action_requests([{version3,v3}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> megaco_compact_text_encoder_v3:encode_action_requests(EC, ActReqs); -encode_action_requests(EC, 3, ActReqs) when list(ActReqs) -> +encode_action_requests(EC, 3, ActReqs) when is_list(ActReqs) -> megaco_compact_text_encoder_v3:encode_action_requests(EC, ActReqs); encode_action_requests(_EC, V, _ActReqs) -> {error, {bad_version, V}}. diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3a.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3a.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3a.erl 2009-03-12 12:32:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3a.erl 2009-09-18 15:13:18.000000000 +0100 @@ -97,7 +97,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_request(_EC, ActReq) - when record(ActReq, 'ActionRequest') -> + when is_record(ActReq, 'ActionRequest') -> case (catch enc_ActionRequest(ActReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -114,7 +114,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_command_request(_EC, CmdReq) - when record(CmdReq, 'CommandRequest') -> + when is_record(CmdReq, 'CommandRequest') -> case (catch enc_CommandRequest(CmdReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -131,7 +131,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_reply(_EC, ActRep) - when record(ActRep, 'ActionReply') -> + when is_record(ActRep, 'ActionReply') -> case (catch enc_ActionReply(ActRep)) of {'EXIT', Reason} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3b.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3b.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3b.erl 2009-03-12 12:32:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3b.erl 2009-09-18 15:13:24.000000000 +0100 @@ -100,7 +100,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_request(_EC, ActReq) - when record(ActReq, 'ActionRequest') -> + when is_record(ActReq, 'ActionRequest') -> case (catch enc_ActionRequest(ActReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -116,7 +116,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_command_request(_EC, CmdReq) - when record(CmdReq, 'CommandRequest') -> + when is_record(CmdReq, 'CommandRequest') -> case (catch enc_CommandRequest(CmdReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -132,7 +132,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_reply(_EC, ActRep) - when record(ActRep, 'ActionReply') -> + when is_record(ActRep, 'ActionReply') -> case (catch enc_ActionReply(ActRep)) of {'EXIT', Reason} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3c.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3c.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3c.erl 2009-03-12 12:32:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_prev3c.erl 2009-09-18 15:13:27.000000000 +0100 @@ -83,7 +83,7 @@ %% Convert a list of ActionRequest record's into a binary %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- -encode_action_requests(_EC, ActReqs) when list(ActReqs) -> +encode_action_requests(_EC, ActReqs) when is_list(ActReqs) -> case (catch enc_ActionRequests(ActReqs)) of {'EXIT', Reason} -> {error, Reason}; @@ -99,7 +99,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_request(_EC, ActReq) - when record(ActReq, 'ActionRequest') -> + when is_record(ActReq, 'ActionRequest') -> case (catch enc_ActionRequest(ActReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -115,7 +115,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_command_request(_EC, CmdReq) - when record(CmdReq, 'CommandRequest') -> + when is_record(CmdReq, 'CommandRequest') -> case (catch enc_CommandRequest(CmdReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -131,7 +131,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_reply(_EC, ActRep) - when record(ActRep, 'ActionReply') -> + when is_record(ActRep, 'ActionReply') -> case (catch enc_ActionReply(ActRep)) of {'EXIT', Reason} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_v1.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_v1.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_v1.erl 2009-03-12 12:31:20.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_v1.erl 2009-09-18 15:13:06.000000000 +0100 @@ -98,7 +98,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_request(_EC, ActReq) - when record(ActReq, 'ActionRequest') -> + when is_record(ActReq, 'ActionRequest') -> case (catch enc_ActionRequest(ActReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -114,7 +114,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_command_request(_EC, CmdReq) - when record(CmdReq, 'CommandRequest') -> + when is_record(CmdReq, 'CommandRequest') -> case (catch enc_CommandRequest(CmdReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -130,7 +130,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_reply(_EC, ActRep) - when record(ActRep, 'ActionReply') -> + when is_record(ActRep, 'ActionReply') -> case (catch enc_ActionReply(ActRep)) of {'EXIT', Reason} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_v2.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_v2.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_v2.erl 2009-03-12 12:31:20.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_compact_text_encoder_v2.erl 2009-09-18 15:13:06.000000000 +0100 @@ -100,7 +100,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_request(_EC, ActReq) - when record(ActReq, 'ActionRequest') -> + when is_record(ActReq, 'ActionRequest') -> case (catch enc_ActionRequest(ActReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -116,7 +116,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_command_request(_EC, CmdReq) - when record(CmdReq, 'CommandRequest') -> + when is_record(CmdReq, 'CommandRequest') -> case (catch enc_CommandRequest(CmdReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -132,7 +132,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_reply(_EC, ActRep) - when record(ActRep, 'ActionReply') -> + when is_record(ActRep, 'ActionReply') -> case (catch enc_ActionReply(ActRep)) of {'EXIT', Reason} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder.erl 2009-03-12 12:30:26.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder.erl 2009-09-18 15:12:41.000000000 +0100 @@ -127,10 +127,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,v3}], _, Bin) when is_binary(Bin) -> case megaco_text_scanner:scan(Bin) of @@ -147,10 +147,10 @@ {error, {unsupported_version, V}}; {error, Reason, Tokens, Line} -> - parse_error(Reason, Line, Tokens, Bin); + scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,prev3c}], _, Bin) when is_binary(Bin) -> case megaco_text_scanner:scan(Bin) of @@ -167,10 +167,10 @@ {error, {unsupported_version, V}}; {error, Reason, Tokens, Line} -> - parse_error(Reason, Line, Tokens, Bin); + scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> - parse_error(Reason, Line, [], Bin) + scan_error(Reason, Line, Bin) end; decode_message([{version3,prev3b}], _, Bin) when is_binary(Bin) -> case megaco_text_scanner:scan(Bin) of @@ -187,10 +187,10 @@ {error, {unsupported_version, V}}; {error, Reason, Tokens, Line} -> - parse_error(Reason, Line, Tokens, Bin); + scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,prev3a}], _, Bin) when is_binary(Bin) -> case megaco_text_scanner:scan(Bin) of @@ -207,10 +207,10 @@ {error, {unsupported_version, V}}; {error, Reason, Tokens, Line} -> - parse_error(Reason, Line, Tokens, Bin); + scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{flex, Port}], _, Bin) when is_binary(Bin) -> case megaco_flex_scanner:scan(Bin, Port) of @@ -227,10 +227,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,v3},{flex, Port}], _, Bin) when is_binary(Bin) -> case megaco_flex_scanner:scan(Bin, Port) of @@ -247,10 +247,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,prev3c},{flex, Port}], _, Bin) when is_binary(Bin) -> case megaco_flex_scanner:scan(Bin, Port) of @@ -267,10 +267,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,prev3b},{flex, Port}], _, Bin) when is_binary(Bin) -> case megaco_flex_scanner:scan(Bin, Port) of @@ -287,10 +287,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message([{version3,prev3a},{flex, Port}], _, Bin) when is_binary(Bin) -> case megaco_flex_scanner:scan(Bin, Port) of @@ -307,10 +307,10 @@ {error, {unsupported_version, V}}; %% {error, Reason, Tokens, Line} -> - %% parse_error(Reason, Line, Tokens, Bin); + %% scan_error(Reason, Line, Tokens, Bin); {error, Reason, Line} -> %% OTP-4007 - parse_error(Reason, Line, [], Bin) %% OTP-4007 + scan_error(Reason, Line, Bin) %% OTP-4007 end; decode_message(EC, _, Bin) when is_binary(Bin) -> {error, {bad_encoding_config, EC}}; @@ -335,29 +335,46 @@ megaco_text_mini_decoder:decode_message(EC, Bin). +scan_error(Reason, Line, Bin) -> + scan_error(Reason, Line, [], Bin). + +scan_error("bad_property_parm: " ++ Reason, _Line, _Tokens, _Bin) -> + {error, {bad_property_parm, Reason}}; +scan_error(Reason, Line, Tokens, Bin) -> + %% io:format("scanner error: " + %% "~n Reason: ~p" + %% "~n Line: ~p" + %% "~n Tokens: ~p" + %% "~n Bin: ~p" + %% "~n", [Reason, Line, Tokens, Bin]), + {error, [{reason, Reason, Line}, {token, Tokens}, {chars, Bin}]}. + parse_error(Reason, Tokens, Chars) -> %% io:format("parse_error -> entry with" %% "~n Reason: ~p" %% "~n Tokens: ~p" -%% "~n", [Reason, Tokens]), +%% "~n Chars: ~p" +%% "~n", [Reason, Tokens, Chars]), case Reason of - "bad_property_parm: " ++ NewReason -> - {error, {bad_property_parm, NewReason}}; + {Line, Mod, [Prefix, [$[, TokenStringRaw, $]]]} when + is_integer(Line) andalso + is_atom(Mod) andalso + is_list(Prefix) andalso + is_list(TokenStringRaw) -> + TokenString = [l2i(X) || X <- TokenStringRaw, is_list(X)], + ReasonStr = Prefix ++ TokenString, + {error, [{reason, ReasonStr, Line}, {tokens, Tokens}, {chars, Chars}, {module, Mod}]}; _ -> {error, [{reason, Reason}, {token, Tokens}, {chars, Chars}]} end. -parse_error(Reason, Line, Tokens, Chars) -> -%% io:format("parse_error -> entry with" -%% "~n Reason: ~p" -%% "~n Line: ~p" -%% "~n Tokens: ~p" -%% "~n", [Reason, Line, Tokens]), - case Reason of - "bad_property_parm: " ++ NewReason -> - {error, {bad_property_parm, NewReason}}; + +l2i(L) when is_list(L) -> + case (catch list_to_integer(L)) of + I when is_integer(I) -> + I; _ -> - {error, [{reason, Reason, Line}, {token, Tokens}, {chars, Chars}]} + L end. @@ -394,27 +411,27 @@ %% Convert a list of ActionRequest record's into a binary %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- -encode_action_requests([{version3,_}|EC], 1, ActReqs) when list(ActReqs) -> +encode_action_requests([{version3,_}|EC], 1, ActReqs) when is_list(ActReqs) -> megaco_pretty_text_encoder_v1:encode_action_requests(EC, ActReqs); -encode_action_requests(EC, 1, ActReqs) when list(ActReqs) -> +encode_action_requests(EC, 1, ActReqs) when is_list(ActReqs) -> megaco_pretty_text_encoder_v1:encode_action_requests(EC, ActReqs); -encode_action_requests([{version3,_}|EC], 2, ActReqs) when list(ActReqs) -> +encode_action_requests([{version3,_}|EC], 2, ActReqs) when is_list(ActReqs) -> megaco_pretty_text_encoder_v2:encode_action_requests(EC, ActReqs); -encode_action_requests(EC, 2, ActReqs) when list(ActReqs) -> +encode_action_requests(EC, 2, ActReqs) when is_list(ActReqs) -> megaco_pretty_text_encoder_v2:encode_action_requests(EC, ActReqs); encode_action_requests([{version3,v3}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> megaco_pretty_text_encoder_v3:encode_action_requests(EC, ActReqs); encode_action_requests([{version3,prev3c}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> megaco_pretty_text_encoder_prev3c:encode_action_requests(EC, ActReqs); encode_action_requests([{version3,prev3b}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> megaco_pretty_text_encoder_prev3b:encode_action_requests(EC, ActReqs); encode_action_requests([{version3,prev3a}|EC], 3, ActReqs) - when list(ActReqs) -> + when is_list(ActReqs) -> megaco_pretty_text_encoder_prev3a:encode_action_requests(EC, ActReqs); -encode_action_requests(EC, 3, ActReqs) when list(ActReqs) -> +encode_action_requests(EC, 3, ActReqs) when is_list(ActReqs) -> megaco_pretty_text_encoder_v3:encode_action_requests(EC, ActReqs); encode_action_requests(_EC, V, _ActReqs) -> {error, {bad_version, V}}. diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3a.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3a.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3a.erl 2009-03-12 12:32:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3a.erl 2009-09-18 15:13:18.000000000 +0100 @@ -89,7 +89,7 @@ %% Convert a list of ActionRequest record's into a binary %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- -encode_action_requests(_EC, ActReqs) when list(ActReqs) -> +encode_action_requests(_EC, ActReqs) when is_list(ActReqs) -> case (catch enc_ActionRequests(ActReqs)) of {'EXIT', Reason} -> {error, Reason}; @@ -105,7 +105,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_request(_EC, ActReq) - when record(ActReq, 'ActionRequest') -> + when is_record(ActReq, 'ActionRequest') -> case (catch enc_ActionRequest(ActReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -121,7 +121,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_command_request(_EC, CmdReq) - when record(CmdReq, 'CommandRequest') -> + when is_record(CmdReq, 'CommandRequest') -> case (catch enc_CommandRequest(CmdReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -137,7 +137,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_reply(_EC, ActRep) - when record(ActRep, 'ActionReply') -> + when is_record(ActRep, 'ActionReply') -> case (catch enc_ActionReply(ActRep)) of {'EXIT', Reason} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3b.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3b.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3b.erl 2009-03-12 12:32:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3b.erl 2009-09-18 15:13:24.000000000 +0100 @@ -90,7 +90,7 @@ %% Convert a list of ActionRequest record's into a binary %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- -encode_action_requests(_EC, ActReqs) when list(ActReqs) -> +encode_action_requests(_EC, ActReqs) when is_list(ActReqs) -> case (catch enc_ActionRequests(ActReqs)) of {'EXIT', Reason} -> {error, Reason}; @@ -106,7 +106,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_request(_EC, ActReq) - when record(ActReq, 'ActionRequest') -> + when is_record(ActReq, 'ActionRequest') -> case (catch enc_ActionRequest(ActReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -122,7 +122,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_command_request(_EC, CmdReq) - when record(CmdReq, 'CommandRequest') -> + when is_record(CmdReq, 'CommandRequest') -> case (catch enc_CommandRequest(CmdReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -138,7 +138,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_reply(_EC, ActRep) - when record(ActRep, 'ActionReply') -> + when is_record(ActRep, 'ActionReply') -> case (catch enc_ActionReply(ActRep)) of {'EXIT', Reason} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3c.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3c.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3c.erl 2009-04-16 10:26:20.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_prev3c.erl 2009-09-18 15:13:27.000000000 +0100 @@ -92,7 +92,7 @@ %% Convert a list of ActionRequest record's into a binary %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- -encode_action_requests(_EC, ActReqs) when list(ActReqs) -> +encode_action_requests(_EC, ActReqs) when is_list(ActReqs) -> case (catch enc_ActionRequests(ActReqs)) of {'EXIT', Reason} -> {error, Reason}; @@ -108,7 +108,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_request(_EC, ActReq) - when record(ActReq, 'ActionRequest') -> + when is_record(ActReq, 'ActionRequest') -> case (catch enc_ActionRequest(ActReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -124,7 +124,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_command_request(_EC, CmdReq) - when record(CmdReq, 'CommandRequest') -> + when is_record(CmdReq, 'CommandRequest') -> case (catch enc_CommandRequest(CmdReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -140,7 +140,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_reply(_EC, ActRep) - when record(ActRep, 'ActionReply') -> + when is_record(ActRep, 'ActionReply') -> case (catch enc_ActionReply(ActRep)) of {'EXIT', Reason} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_v1.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_v1.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_v1.erl 2009-03-12 12:31:19.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_v1.erl 2009-09-18 15:13:05.000000000 +0100 @@ -82,7 +82,7 @@ %% Convert a list of ActionRequest record's into a binary %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- -encode_action_requests(_EC, ActReqs) when list(ActReqs) -> +encode_action_requests(_EC, ActReqs) when is_list(ActReqs) -> case (catch enc_ActionRequests(ActReqs)) of {'EXIT', Reason} -> {error, Reason}; @@ -98,7 +98,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_request(_EC, ActReq) - when record(ActReq, 'ActionRequest') -> + when is_record(ActReq, 'ActionRequest') -> case (catch enc_ActionRequest(ActReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -114,7 +114,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_command_request(_EC, CmdReq) - when record(CmdReq, 'CommandRequest') -> + when is_record(CmdReq, 'CommandRequest') -> case (catch enc_CommandRequest(CmdReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -130,7 +130,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_reply(_EC, ActRep) - when record(ActRep, 'ActionReply') -> + when is_record(ActRep, 'ActionReply') -> case (catch enc_ActionReply(ActRep)) of {'EXIT', Reason} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_v2.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_v2.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_v2.erl 2009-04-16 10:26:15.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_pretty_text_encoder_v2.erl 2009-09-18 15:13:06.000000000 +0100 @@ -92,7 +92,7 @@ %% Convert a list of ActionRequest record's into a binary %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- -encode_action_requests(_EC, ActReqs) when list(ActReqs) -> +encode_action_requests(_EC, ActReqs) when is_list(ActReqs) -> case (catch enc_ActionRequests(ActReqs)) of {'EXIT', Reason} -> {error, Reason}; @@ -108,7 +108,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_request(_EC, ActReq) - when record(ActReq, 'ActionRequest') -> + when is_record(ActReq, 'ActionRequest') -> case (catch enc_ActionRequest(ActReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -124,7 +124,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_command_request(_EC, CmdReq) - when record(CmdReq, 'CommandRequest') -> + when is_record(CmdReq, 'CommandRequest') -> case (catch enc_CommandRequest(CmdReq)) of {'EXIT', Reason} -> {error, Reason}; @@ -140,7 +140,7 @@ %% Return {ok, DeepIoList} | {error, Reason} %%---------------------------------------------------------------------- encode_action_reply(_EC, ActRep) - when record(ActRep, 'ActionReply') -> + when is_record(ActRep, 'ActionReply') -> case (catch enc_ActionReply(ActRep)) of {'EXIT', Reason} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_mini_decoder.erl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_mini_decoder.erl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_mini_decoder.erl 2009-03-12 12:32:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_mini_decoder.erl 2009-09-18 15:13:19.000000000 +0100 @@ -35,7 +35,7 @@ %% Return {ok, MegacoMessageRecord} | {error, Reason} %%---------------------------------------------------------------------- -decode_message(_, Bin) when binary(Bin) -> +decode_message(_, Bin) when is_binary(Bin) -> case megaco_text_scanner:scan(Bin) of {ok, Tokens, _Vsn, _LastLine} -> decode_message(Tokens); diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_mini_parser.hrl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_mini_parser.hrl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_mini_parser.hrl 2009-03-12 12:32:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_mini_parser.hrl 2009-09-18 15:13:19.000000000 +0100 @@ -159,9 +159,9 @@ end. ensure_hex4({_TokenTag, Line, Hex4}) - when length(Hex4) =< 4, length(Hex4) > 0 -> + when (length(Hex4) =< 4) andalso (length(Hex4) > 0) -> case (catch do_ensure_hex4(Hex4)) of - IL when list(IL), length(IL) == 2 -> + IL when is_list(IL) andalso (length(IL) =:= 2) -> IL; Error -> return_error(Line, {bad_hex4, Hex4, Error}) @@ -1166,13 +1166,13 @@ % #'PropertyParm'{name = lists:reverse(Name), % value = [lists:reverse(Value)]}. -ensure_uint({_TokenTag, Line, Val}, Min, Max) when integer(Val) -> +ensure_uint({_TokenTag, Line, Val}, Min, Max) when is_integer(Val) -> if - integer(Min), Val >= Min -> + is_integer(Min) andalso (Val >= Min) -> if - integer(Max), Val =< Max -> + is_integer(Max) andalso (Val =< Max) -> Val; - Max == infinity -> + Max =:= infinity -> Val; true -> return_error(Line, {too_large_integer, Val, Max}) @@ -1184,7 +1184,7 @@ case catch list_to_integer(Text) of {'EXIT', _} -> return_error(Line, {not_an_integer, Text}); - Val when integer(Val) -> + Val when is_integer(Val) -> ensure_uint({TokenTag, Line, Val}, Min, Max) end; ensure_uint(Val, Min, Max) -> diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3a.hrl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3a.hrl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3a.hrl 2009-03-12 12:32:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3a.hrl 2009-09-18 15:13:18.000000000 +0100 @@ -218,7 +218,7 @@ ensure_hex4({_TokenTag, Line, Hex4}) when length(Hex4) =< 4, length(Hex4) > 0 -> case (catch do_ensure_hex4(Hex4)) of - IL when list(IL), length(IL) == 2 -> + IL when is_list(IL) andalso (length(IL) =:= 2) -> IL; Error -> return_error(Line, {bad_hex4, Hex4, Error}) @@ -433,20 +433,20 @@ do_merge_indAudLocalControlDescriptor([Parm | Parms], Desc) -> case Parm of - modeToken when Desc#'IndAudLocalControlDescriptor'.streamMode == asn1_NOVALUE -> + modeToken when Desc#'IndAudLocalControlDescriptor'.streamMode =:= asn1_NOVALUE -> Desc2 = Desc#'IndAudLocalControlDescriptor'{streamMode = 'NULL'}, do_merge_indAudLocalControlDescriptor(Parms, Desc2); - reservedGroupToken when Desc#'IndAudLocalControlDescriptor'.reserveGroup == asn1_NOVALUE -> + reservedGroupToken when Desc#'IndAudLocalControlDescriptor'.reserveGroup =:= asn1_NOVALUE -> Desc2 = Desc#'IndAudLocalControlDescriptor'{reserveGroup = 'NULL'}, do_merge_indAudLocalControlDescriptor(Parms, Desc2); - reservedValueToken when Desc#'IndAudLocalControlDescriptor'.reserveValue == asn1_NOVALUE -> + reservedValueToken when Desc#'IndAudLocalControlDescriptor'.reserveValue =:= asn1_NOVALUE -> Desc2 = Desc#'IndAudLocalControlDescriptor'{reserveValue = 'NULL'}, do_merge_indAudLocalControlDescriptor(Parms, Desc2); - {pkgdName, Val} when Desc#'IndAudLocalControlDescriptor'.propertyParms == asn1_NOVALUE -> + {pkgdName, Val} when Desc#'IndAudLocalControlDescriptor'.propertyParms =:= asn1_NOVALUE -> PropParms = [#'IndAudPropertyParm'{name = Val}], Desc2 = Desc#'IndAudLocalControlDescriptor'{propertyParms = PropParms}, do_merge_indAudLocalControlDescriptor(Parms, Desc2); - {pkgdName, Val} when list(Desc#'IndAudLocalControlDescriptor'.propertyParms) -> + {pkgdName, Val} when is_list(Desc#'IndAudLocalControlDescriptor'.propertyParms) -> PropParms = Desc#'IndAudLocalControlDescriptor'.propertyParms, PropParms2 = [#'IndAudPropertyParm'{name = Val} | PropParms], Desc2 = Desc#'IndAudLocalControlDescriptor'{propertyParms = PropParms2}, @@ -547,7 +547,7 @@ merge_auditDescriptor([]) -> #'AuditDescriptor'{}; -merge_auditDescriptor(Tokens) when list(Tokens) -> +merge_auditDescriptor(Tokens) when is_list(Tokens) -> case lists:keysearch(terminationAudit, 1, Tokens) of {value, {terminationAudit, TA}} -> case lists:keydelete(terminationAudit, 1, Tokens) of @@ -1019,23 +1019,23 @@ do_merge_secondEventParameters([H | T], StreamId, EPL, SRA, HasA) -> case H of - keepActive when SRA#'SecondRequestedActions'.keepActive == asn1_NOVALUE -> + keepActive when SRA#'SecondRequestedActions'.keepActive =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{keepActive = true}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); - {second_embed, SD} when SRA#'SecondRequestedActions'.signalsDescriptor == asn1_NOVALUE -> + {second_embed, SD} when SRA#'SecondRequestedActions'.signalsDescriptor =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{signalsDescriptor = SD}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); - {eventDM, DM} when SRA#'SecondRequestedActions'.eventDM == asn1_NOVALUE -> + {eventDM, DM} when SRA#'SecondRequestedActions'.eventDM =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{eventDM = DM}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); - {stream, NewStreamId} when StreamId == asn1_NOVALUE -> + {stream, NewStreamId} when StreamId =:= asn1_NOVALUE -> do_merge_secondEventParameters(T, NewStreamId, EPL, SRA, HasA); {other, PP} when is_record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_secondEventParameters(T, StreamId, [EP | EPL], SRA, HasA); - {other, EP} when record(EP, 'EventParameter') -> + {other, EP} when is_record(EP, 'EventParameter') -> do_merge_secondEventParameters(T, StreamId, [EP | EPL], SRA, HasA); _ -> return_error(0, {bad_secondEventParameter, H}) @@ -1594,7 +1594,7 @@ if is_integer(Max) andalso (Val =< Max) -> Val; - Max == infinity -> + Max =:= infinity -> Val; true -> return_error(Line, {too_large_integer, Val, Max}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3a.yrl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3a.yrl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3a.yrl 2009-03-12 12:32:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3a.yrl 2009-09-18 13:47:50.000000000 +0100 @@ -65,7 +65,7 @@ %% This is ugly but... %%---------------------------------------------------------------------- -Expect 117. +Expect 118. %%---------------------------------------------------------------------- @@ -1454,7 +1454,7 @@ safeToken2 -> 'AuditCapToken' : '$1' . safeToken2 -> 'AuditValueToken' : '$1' . safeToken2 -> 'AuthToken' : '$1' . -%% v3-safeToken2 -> 'BothToken' : '$1' . % v3 +safeToken2 -> 'BothToken' : '$1' . % v3 safeToken2 -> 'BothwayToken' : '$1' . safeToken2 -> 'BriefToken' : '$1' . safeToken2 -> 'BufferToken' : '$1' . diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3b.hrl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3b.hrl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3b.hrl 2009-03-12 12:32:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3b.hrl 2009-09-18 15:13:24.000000000 +0100 @@ -218,7 +218,7 @@ ensure_hex4({_TokenTag, Line, Hex4}) when length(Hex4) =< 4, length(Hex4) > 0 -> case (catch do_ensure_hex4(Hex4)) of - IL when list(IL), length(IL) == 2 -> + IL when is_list(IL) andalso (length(IL) =:= 2) -> IL; Error -> return_error(Line, {bad_hex4, Hex4, Error}) @@ -459,20 +459,20 @@ do_merge_indAudLocalControlDescriptor([Parm | Parms], Desc) -> case Parm of - modeToken when Desc#'IndAudLocalControlDescriptor'.streamMode == asn1_NOVALUE -> + modeToken when Desc#'IndAudLocalControlDescriptor'.streamMode =:= asn1_NOVALUE -> Desc2 = Desc#'IndAudLocalControlDescriptor'{streamMode = 'NULL'}, do_merge_indAudLocalControlDescriptor(Parms, Desc2); - reservedGroupToken when Desc#'IndAudLocalControlDescriptor'.reserveGroup == asn1_NOVALUE -> + reservedGroupToken when Desc#'IndAudLocalControlDescriptor'.reserveGroup =:= asn1_NOVALUE -> Desc2 = Desc#'IndAudLocalControlDescriptor'{reserveGroup = 'NULL'}, do_merge_indAudLocalControlDescriptor(Parms, Desc2); - reservedValueToken when Desc#'IndAudLocalControlDescriptor'.reserveValue == asn1_NOVALUE -> + reservedValueToken when Desc#'IndAudLocalControlDescriptor'.reserveValue =:= asn1_NOVALUE -> Desc2 = Desc#'IndAudLocalControlDescriptor'{reserveValue = 'NULL'}, do_merge_indAudLocalControlDescriptor(Parms, Desc2); - {pkgdName, Val} when Desc#'IndAudLocalControlDescriptor'.propertyParms == asn1_NOVALUE -> + {pkgdName, Val} when Desc#'IndAudLocalControlDescriptor'.propertyParms =:= asn1_NOVALUE -> PropParms = [#'IndAudPropertyParm'{name = Val}], Desc2 = Desc#'IndAudLocalControlDescriptor'{propertyParms = PropParms}, do_merge_indAudLocalControlDescriptor(Parms, Desc2); - {pkgdName, Val} when list(Desc#'IndAudLocalControlDescriptor'.propertyParms) -> + {pkgdName, Val} when is_list(Desc#'IndAudLocalControlDescriptor'.propertyParms) -> PropParms = Desc#'IndAudLocalControlDescriptor'.propertyParms, PropParms2 = [#'IndAudPropertyParm'{name = Val} | PropParms], Desc2 = Desc#'IndAudLocalControlDescriptor'{propertyParms = PropParms2}, @@ -573,7 +573,7 @@ merge_auditDescriptor([]) -> #'AuditDescriptor'{}; -merge_auditDescriptor(Tokens) when list(Tokens) -> +merge_auditDescriptor(Tokens) when is_list(Tokens) -> case lists:keysearch(terminationAudit, 1, Tokens) of {value, {terminationAudit, TA}} -> case lists:keydelete(terminationAudit, 1, Tokens) of @@ -1007,24 +1007,24 @@ do_merge_eventParameters([H | T], StreamId, EPL, RA, HasA) -> case H of - keepActive when RA#'RequestedActions'.keepActive == asn1_NOVALUE -> + keepActive when RA#'RequestedActions'.keepActive =:= asn1_NOVALUE -> RA2 = RA#'RequestedActions'{keepActive = true}, do_merge_eventParameters(T, StreamId, EPL, RA2, yes); - {embed, SD, SED} when RA#'RequestedActions'.signalsDescriptor == asn1_NOVALUE -> + {embed, SD, SED} when RA#'RequestedActions'.signalsDescriptor =:= asn1_NOVALUE -> RA2 = RA#'RequestedActions'{signalsDescriptor = SD, secondEvent = SED}, do_merge_eventParameters(T, StreamId, EPL, RA2, yes); - {eventDM, DM} when RA#'RequestedActions'.eventDM == asn1_NOVALUE -> + {eventDM, DM} when RA#'RequestedActions'.eventDM =:= asn1_NOVALUE -> RA2 = RA#'RequestedActions'{eventDM = DM}, do_merge_eventParameters(T, StreamId, EPL, RA2, yes); - {stream, NewStreamId} when StreamId == asn1_NOVALUE -> + {stream, NewStreamId} when StreamId =:= asn1_NOVALUE -> do_merge_eventParameters(T, NewStreamId, EPL, RA, HasA); {other, PP} when is_record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_eventParameters(T, StreamId, [EP | EPL], RA, HasA); - {other, EP} when record(EP, 'EventParameter') -> + {other, EP} when is_record(EP, 'EventParameter') -> do_merge_eventParameters(T, StreamId, [EP | EPL], RA, HasA); _ -> return_error(0, {bad_eventParameter, H}) @@ -1050,23 +1050,23 @@ do_merge_secondEventParameters([H | T], StreamId, EPL, SRA, HasA) -> case H of - keepActive when SRA#'SecondRequestedActions'.keepActive == asn1_NOVALUE -> + keepActive when SRA#'SecondRequestedActions'.keepActive =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{keepActive = true}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); - {second_embed, SD} when SRA#'SecondRequestedActions'.signalsDescriptor == asn1_NOVALUE -> + {second_embed, SD} when SRA#'SecondRequestedActions'.signalsDescriptor =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{signalsDescriptor = SD}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); - {eventDM, DM} when SRA#'SecondRequestedActions'.eventDM == asn1_NOVALUE -> + {eventDM, DM} when SRA#'SecondRequestedActions'.eventDM =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{eventDM = DM}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); - {stream, NewStreamId} when StreamId == asn1_NOVALUE -> + {stream, NewStreamId} when StreamId =:= asn1_NOVALUE -> do_merge_secondEventParameters(T, NewStreamId, EPL, SRA, HasA); - {other, PP} when record(PP, 'PropertyParm') -> + {other, PP} when is_record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_secondEventParameters(T, StreamId, [EP | EPL], SRA, HasA); - {other, EP} when record(EP, 'EventParameter') -> + {other, EP} when is_record(EP, 'EventParameter') -> do_merge_secondEventParameters(T, StreamId, [EP | EPL], SRA, HasA); _ -> return_error(0, {bad_secondEventParameter, H}) @@ -1640,7 +1640,7 @@ if is_integer(Max) andalso (Val =< Max) -> Val; - Max == infinity -> + Max =:= infinity -> Val; true -> return_error(Line, {too_large_integer, Val, Max}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3b.yrl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3b.yrl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3b.yrl 2009-03-12 12:32:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3b.yrl 2009-09-18 13:47:53.000000000 +0100 @@ -65,7 +65,7 @@ %% This is ugly but... %%---------------------------------------------------------------------- -Expect 116. +Expect 117. %%---------------------------------------------------------------------- @@ -1465,7 +1465,7 @@ safeToken2 -> 'AuditCapToken' : '$1' . safeToken2 -> 'AuditValueToken' : '$1' . safeToken2 -> 'AuthToken' : '$1' . -%% v3-safeToken2 -> 'BothToken' : '$1' . % v3 +safeToken2 -> 'BothToken' : '$1' . % v3 safeToken2 -> 'BothwayToken' : '$1' . safeToken2 -> 'BriefToken' : '$1' . safeToken2 -> 'BufferToken' : '$1' . diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3c.hrl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3c.hrl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3c.hrl 2009-03-12 12:32:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3c.hrl 2009-09-18 13:47:54.000000000 +0100 @@ -215,7 +215,7 @@ ensure_hex4({_TokenTag, Line, Hex4}) when length(Hex4) =< 4, length(Hex4) > 0 -> case (catch do_ensure_hex4(Hex4)) of - IL when list(IL), length(IL) == 2 -> + IL when is_list(IL) andalso (length(IL) =:= 2) -> IL; Error -> return_error(Line, {bad_hex4, Hex4, Error}) @@ -676,7 +676,7 @@ merge_auditDescriptor([]) -> #'AuditDescriptor'{}; -merge_auditDescriptor(Tokens) when list(Tokens) -> +merge_auditDescriptor(Tokens) when is_list(Tokens) -> case lists:keysearch(terminationAudit, 1, Tokens) of {value, {terminationAudit, TA}} -> case lists:keydelete(terminationAudit, 1, Tokens) of @@ -1036,6 +1036,10 @@ -compile({inline,[{select_stream_or_other,2}]}). -endif. select_stream_or_other(EventParameterName, ParmValue) -> +%% io:format("select_stream_or_other -> entry with" +%% "~n EventParameterName: ~p" +%% "~n ParmValue: ~p" +%% "~n", [EventParameterName, ParmValue]), if (EventParameterName =:= "st") orelse (EventParameterName =:= "stream") -> @@ -1159,6 +1163,8 @@ -compile({inline,[{merge_eventParameters,1}]}). -endif. merge_eventParameters(Params) -> +%% io:format("merge_eventParameters -> entry" +%% "~n", []), SID = asn1_NOVALUE, EPL = [], RA = #'RequestedActions'{}, @@ -1166,40 +1172,56 @@ do_merge_eventParameters(Params, SID, EPL, RA, HasA) . do_merge_eventParameters([H | T], SID, EPL, RA, HasA) -> +%% io:format("do_merge_eventParameters -> entry with" +%% "~n H: ~p" +%% "~n SID: ~p" +%% "~n EPL: ~p" +%% "~n RA: ~p" +%% "~n HasA: ~p" +%% "~n", [H, SID, EPL, RA, HasA]), case H of - keepActive when RA#'RequestedActions'.keepActive == asn1_NOVALUE -> + keepActive when RA#'RequestedActions'.keepActive =:= asn1_NOVALUE -> RA2 = RA#'RequestedActions'{keepActive = true}, do_merge_eventParameters(T, SID, EPL, RA2, yes); - resetEventsDescriptor when RA#'RequestedActions'.resetEventsDescriptor == asn1_NOVALUE -> + resetEventsDescriptor when RA#'RequestedActions'.resetEventsDescriptor =:= asn1_NOVALUE -> RA2 = RA#'RequestedActions'{resetEventsDescriptor = 'NULL'}, do_merge_eventParameters(T, SID, EPL, RA2, yes); - {embed, SD, SED} when RA#'RequestedActions'.signalsDescriptor == asn1_NOVALUE -> + {embed, SD, SED} when RA#'RequestedActions'.signalsDescriptor =:= asn1_NOVALUE -> RA2 = RA#'RequestedActions'{signalsDescriptor = SD, secondEvent = SED}, do_merge_eventParameters(T, SID, EPL, RA2, yes); - {eventDM, DM} when RA#'RequestedActions'.eventDM == asn1_NOVALUE -> + {eventDM, DM} when RA#'RequestedActions'.eventDM =:= asn1_NOVALUE -> RA2 = RA#'RequestedActions'{eventDM = DM}, do_merge_eventParameters(T, SID, EPL, RA2, yes); - {stream, NewSID} when SID == asn1_NOVALUE -> + {stream, NewSID} when SID =:= asn1_NOVALUE -> do_merge_eventParameters(T, NewSID, EPL, RA, HasA); - {other, PP} when record(PP, 'PropertyParm') -> + {other, PP} when is_record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_eventParameters(T, SID, [EP | EPL], RA, HasA); - {other, EP} when record(EP, 'EventParameter') -> + {other, EP} when is_record(EP, 'EventParameter') -> do_merge_eventParameters(T, SID, [EP | EPL], RA, HasA); - {notifyBehaviour, NB} when RA#'RequestedActions'.notifyBehaviour == asn1_NOVALUE -> + {notifyBehaviour, NB} when RA#'RequestedActions'.notifyBehaviour =:= asn1_NOVALUE -> RA2 = RA#'RequestedActions'{notifyBehaviour = NB}, do_merge_eventParameters(T, SID, EPL, RA2, yes); _ -> return_error(0, {bad_eventParameter, H}) end; do_merge_eventParameters([], SID, EPL, RA, yes) -> +%% io:format("do_merge_eventParameters(yes) -> entry with" +%% "~n SID: ~p" +%% "~n EPL: ~p" +%% "~n RA: ~p" +%% "~n", [SID, EPL, RA]), #'RequestedEvent'{streamID = SID, eventAction = RA, evParList = lists:reverse(EPL)}; do_merge_eventParameters([], SID, EPL, _RA, no) -> +%% io:format("do_merge_eventParameters(no) -> entry with" +%% "~n SID: ~p" +%% "~n EPL: ~p" +%% "~n", [SID, EPL]), #'RequestedEvent'{streamID = SID, eventAction = asn1_NOVALUE, evParList = lists:reverse(EPL)}. @@ -1216,30 +1238,38 @@ do_merge_secondEventParameters([H | T], SID, EPL, SRA, HasA) -> case H of - keepActive when SRA#'SecondRequestedActions'.keepActive == asn1_NOVALUE -> + keepActive when SRA#'SecondRequestedActions'.keepActive =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{keepActive = true}, do_merge_secondEventParameters(T, SID, EPL, SRA2, yes); - resetEventsDescriptor when SRA#'SecondRequestedActions'.resetEventsDescriptor == asn1_NOVALUE -> + + resetEventsDescriptor when SRA#'SecondRequestedActions'.resetEventsDescriptor =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{resetEventsDescriptor = 'NULL'}, do_merge_secondEventParameters(T, SID, EPL, SRA2, yes); - {second_embed, SD} when SRA#'SecondRequestedActions'.signalsDescriptor == asn1_NOVALUE -> + + {second_embed, SD} when SRA#'SecondRequestedActions'.signalsDescriptor =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{signalsDescriptor = SD}, do_merge_secondEventParameters(T, SID, EPL, SRA2, yes); - {eventDM, DM} when SRA#'SecondRequestedActions'.eventDM == asn1_NOVALUE -> + + {eventDM, DM} when SRA#'SecondRequestedActions'.eventDM =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{eventDM = DM}, do_merge_secondEventParameters(T, SID, EPL, SRA2, yes); - {stream, NewSID} when SID == asn1_NOVALUE -> + + {stream, NewSID} when SID =:= asn1_NOVALUE -> do_merge_secondEventParameters(T, NewSID, EPL, SRA, HasA); - {other, PP} when record(PP, 'PropertyParm') -> + + {other, PP} when is_record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_secondEventParameters(T, SID, [EP | EPL], SRA, HasA); - {other, EP} when record(EP, 'EventParameter') -> + + {other, EP} when is_record(EP, 'EventParameter') -> do_merge_secondEventParameters(T, SID, [EP | EPL], SRA, HasA); - {notifyBehaviour, NB} when SRA#'SecondRequestedActions'.notifyBehaviour == asn1_NOVALUE -> + + {notifyBehaviour, NB} when SRA#'SecondRequestedActions'.notifyBehaviour =:= asn1_NOVALUE -> SRA2 = SRA#'SecondRequestedActions'{notifyBehaviour = NB}, do_merge_secondEventParameters(T, SID, EPL, SRA2, yes); + _ -> return_error(0, {bad_secondEventParameter, H}) end; diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3c.yrl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3c.yrl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_prev3c.yrl 2009-03-12 12:32:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_prev3c.yrl 2009-09-18 13:47:54.000000000 +0100 @@ -65,7 +65,7 @@ %% This is ugly but... %%---------------------------------------------------------------------- -Expect 92. +Expect 93. %%---------------------------------------------------------------------- @@ -1126,17 +1126,17 @@ %% LSBRKT VALUE *(COMMA VALUE) RSBRKT / %% LSBRKT VALUE COLON VALUE RSBRKT ) / %% LBRKT VALUE *(COMMA VALUE) RBRKT -alternativeValue -> 'LBRKT' value valueList 'RBRKT' - : #'PropertyParm'{value = ['$2' | '$3'], - extraInfo = {sublist, false}}. % OR - -alternativeValue -> 'LSBRKT' value 'COLON' value 'RSBRKT' - : #'PropertyParm'{value = ['$2', '$4'], - extraInfo = {range, true}}. - -alternativeValue -> 'LSBRKT' value valueList 'RSBRKT' - : #'PropertyParm'{value = ['$2' | '$3'], - extraInfo = {sublist, true}}. % AND +alternativeValue -> 'LBRKT' value valueList 'RBRKT' : + #'PropertyParm'{value = ['$2' | '$3'], + extraInfo = {sublist, false}}. % OR + +alternativeValue -> 'LSBRKT' value 'COLON' value 'RSBRKT' : + #'PropertyParm'{value = ['$2', '$4'], + extraInfo = {range, true}}. + +alternativeValue -> 'LSBRKT' value valueList 'RSBRKT' : + #'PropertyParm'{value = ['$2' | '$3'], + extraInfo = {sublist, true}}. % AND alternativeValue -> value : #'PropertyParm'{value = ['$1']} . @@ -1546,7 +1546,7 @@ safeToken2 -> 'AuditCapToken' : '$1' . safeToken2 -> 'AuditValueToken' : '$1' . safeToken2 -> 'AuthToken' : '$1' . -%% v3-safeToken2 -> 'BothToken' : '$1' . % v3 +safeToken2 -> 'BothToken' : '$1' . % v3 %% v3-safeToken2 -> 'BothwayToken' : '$1' . safeToken2 -> 'BriefToken' : '$1' . %% v3-safeToken2 -> 'BufferToken' : '$1' . diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_v1.hrl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_v1.hrl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_v1.hrl 2009-03-12 12:30:40.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_v1.hrl 2009-09-18 15:12:49.000000000 +0100 @@ -215,7 +215,7 @@ ensure_hex4({_TokenTag, Line, Hex4}) when length(Hex4) =< 4, length(Hex4) > 0 -> case (catch do_ensure_hex4(Hex4)) of - IL when list(IL), length(IL) == 2 -> + IL when is_list(IL) andalso (length(IL) =:= 2) -> IL; Error -> return_error(Line, {bad_hex4, Hex4, Error}) @@ -421,56 +421,57 @@ exit({missing_required_serviceChangeParm, Required}); merge_ServiceChangeParm([{address, Val}|Parms], SCP0, Req) - when SCP0#'ServiceChangeParm'.serviceChangeAddress == asn1_NOVALUE, - SCP0#'ServiceChangeParm'.serviceChangeMgcId == asn1_NOVALUE -> + when ((SCP0#'ServiceChangeParm'.serviceChangeAddress =:= asn1_NOVALUE) + andalso + (SCP0#'ServiceChangeParm'.serviceChangeMgcId =:= asn1_NOVALUE)) -> SCP = SCP0#'ServiceChangeParm'{serviceChangeAddress = Val}, merge_ServiceChangeParm(Parms, SCP, Req); merge_ServiceChangeParm([{address, Val}|_Parms], SCP0, _Req) - when SCP0#'ServiceChangeParm'.serviceChangeAddress == asn1_NOVALUE -> + when (SCP0#'ServiceChangeParm'.serviceChangeAddress =:= asn1_NOVALUE) -> MgcId = SCP0#'ServiceChangeParm'.serviceChangeMgcId, exit({not_both_address_mgcid_serviceChangeParm, Val, MgcId}); merge_ServiceChangeParm([{mgc_id, Val}|Parms], SCP0, Req) - when SCP0#'ServiceChangeParm'.serviceChangeMgcId == asn1_NOVALUE, - SCP0#'ServiceChangeParm'.serviceChangeAddress == asn1_NOVALUE -> + when ((SCP0#'ServiceChangeParm'.serviceChangeMgcId =:= asn1_NOVALUE) andalso + (SCP0#'ServiceChangeParm'.serviceChangeAddress =:= asn1_NOVALUE)) -> SCP = SCP0#'ServiceChangeParm'{serviceChangeMgcId = Val}, merge_ServiceChangeParm(Parms, SCP, Req); merge_ServiceChangeParm([{mgc_id, Val}|_Parms], SCP0, _Req) - when SCP0#'ServiceChangeParm'.serviceChangeMgcId == asn1_NOVALUE -> + when (SCP0#'ServiceChangeParm'.serviceChangeMgcId =:= asn1_NOVALUE) -> Addr = SCP0#'ServiceChangeParm'.serviceChangeAddress, exit({not_both_address_mgcid_serviceChangeParm, Val, Addr}); merge_ServiceChangeParm([{profile, Val}|Parms], SCP0, Req) - when SCP0#'ServiceChangeParm'.serviceChangeProfile == asn1_NOVALUE -> + when (SCP0#'ServiceChangeParm'.serviceChangeProfile =:= asn1_NOVALUE) -> SCP = SCP0#'ServiceChangeParm'{serviceChangeProfile = Val}, merge_ServiceChangeParm(Parms, SCP, Req); merge_ServiceChangeParm([{version, Val}|Parms], SCP0, Req) - when SCP0#'ServiceChangeParm'.serviceChangeVersion == asn1_NOVALUE -> + when (SCP0#'ServiceChangeParm'.serviceChangeVersion =:= asn1_NOVALUE) -> SCP = SCP0#'ServiceChangeParm'{serviceChangeVersion = Val}, merge_ServiceChangeParm(Parms, SCP, Req); %% REQUIRED (i.e. no default value) merge_ServiceChangeParm([{reason, Val}|Parms], SCP0, Req0) - when SCP0#'ServiceChangeParm'.serviceChangeReason == undefined -> + when (SCP0#'ServiceChangeParm'.serviceChangeReason =:= undefined) -> SCP = SCP0#'ServiceChangeParm'{serviceChangeReason = Val}, Req = lists:delete(serviceChangeReason, Req0), merge_ServiceChangeParm(Parms, SCP, Req); merge_ServiceChangeParm([{delay, Val}|Parms], SCP0, Req) - when SCP0#'ServiceChangeParm'.serviceChangeDelay == asn1_NOVALUE -> + when (SCP0#'ServiceChangeParm'.serviceChangeDelay =:= asn1_NOVALUE) -> SCP = SCP0#'ServiceChangeParm'{serviceChangeDelay = Val}, merge_ServiceChangeParm(Parms, SCP, Req); %% REQUIRED (i.e. no default value) merge_ServiceChangeParm([{method, Val}|Parms], SCP0, Req0) - when SCP0#'ServiceChangeParm'.serviceChangeMethod == undefined -> + when (SCP0#'ServiceChangeParm'.serviceChangeMethod =:= undefined) -> SCP = SCP0#'ServiceChangeParm'{serviceChangeMethod = Val}, Req = lists:delete(serviceChangeMethod, Req0), merge_ServiceChangeParm(Parms, SCP, Req); merge_ServiceChangeParm([{time_stamp, Val}|Parms], SCP0, Req) - when SCP0#'ServiceChangeParm'.timeStamp == asn1_NOVALUE -> + when (SCP0#'ServiceChangeParm'.timeStamp =:= asn1_NOVALUE) -> SCP = SCP0#'ServiceChangeParm'{timeStamp = Val}, merge_ServiceChangeParm(Parms, SCP, Req); @@ -789,12 +790,12 @@ do_merge_eventParameters(T, StreamId, EPL, RA2, yes); {stream, NewStreamId} when StreamId == asn1_NOVALUE -> do_merge_eventParameters(T, NewStreamId, EPL, RA, HasA); - {other, PP} when record(PP, 'PropertyParm') -> + {other, PP} when is_record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_eventParameters(T, StreamId, [EP | EPL], RA, HasA); - {other, EP} when record(EP, 'EventParameter') -> + {other, EP} when is_record(EP, 'EventParameter') -> do_merge_eventParameters(T, StreamId, [EP | EPL], RA, HasA); _ -> return_error(0, {bad_eventParameter, H}) @@ -820,23 +821,23 @@ do_merge_secondEventParameters([H | T], StreamId, EPL, SRA, HasA) -> case H of - keepActive when SRA#'SecondRequestedActions'.keepActive == asn1_NOVALUE -> + keepActive when (SRA#'SecondRequestedActions'.keepActive =:= asn1_NOVALUE) -> SRA2 = SRA#'SecondRequestedActions'{keepActive = true}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); - {second_embed, SD} when SRA#'SecondRequestedActions'.signalsDescriptor == asn1_NOVALUE -> + {second_embed, SD} when (SRA#'SecondRequestedActions'.signalsDescriptor =:= asn1_NOVALUE) -> SRA2 = SRA#'SecondRequestedActions'{signalsDescriptor = SD}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); - {eventDM, DM} when SRA#'SecondRequestedActions'.eventDM == asn1_NOVALUE -> + {eventDM, DM} when (SRA#'SecondRequestedActions'.eventDM =:= asn1_NOVALUE) -> SRA2 = SRA#'SecondRequestedActions'{eventDM = DM}, do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); - {stream, NewStreamId} when StreamId == asn1_NOVALUE -> + {stream, NewStreamId} when (StreamId =:= asn1_NOVALUE) -> do_merge_secondEventParameters(T, NewStreamId, EPL, SRA, HasA); - {other, PP} when record(PP, 'PropertyParm') -> + {other, PP} when is_record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_secondEventParameters(T, StreamId, [EP | EPL], SRA, HasA); - {other, EP} when record(EP, 'EventParameter') -> + {other, EP} when is_record(EP, 'EventParameter') -> do_merge_secondEventParameters(T, StreamId, [EP | EPL], SRA, HasA); _ -> return_error(0, {bad_secondEventParameter, H}) @@ -1341,7 +1342,7 @@ if is_integer(Max) andalso (Val =< Max) -> Val; - Max == infinity -> + Max =:= infinity -> Val; true -> return_error(Line, {too_large_integer, Val, Max}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_v2.hrl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_v2.hrl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_v2.hrl 2009-03-12 12:31:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_v2.hrl 2009-09-18 15:13:05.000000000 +0100 @@ -150,7 +150,7 @@ ensure_ip6addr([colon,colon|T]) -> [H1|T1] = lists:reverse(T), case do_ensure_ip6addr(T1, true, [ensure_hex4_or_ip4addr(H1)], 1) of - {true, A} when length(A) == 16 -> + {true, A} when (length(A) =:= 16) -> A; {true, B} when length(B) < 16 -> lists:duplicate(16 - length(B), 0) ++ B; @@ -161,7 +161,7 @@ case lists:reverse(L) of [colon, colon| T] -> case do_ensure_ip6addr(T, true, [], 1) of - {true, A} when length(A) == 16 -> + {true, A} when (length(A) =:= 16) -> A; {true, B} when length(B) < 16 -> B ++ lists:duplicate(16 - length(B), 0); @@ -170,7 +170,7 @@ end; [H|L1] -> % A (last element) could be an ip4 address case do_ensure_ip6addr(L1,false,[ensure_hex4_or_ip4addr(H)],1) of - {false, A} when length(A) == 16 -> + {false, A} when (length(A) =:= 16) -> A; %% allow a pad even if the address is full (i.e. 16) {true, B} when length(B) =< 17 -> @@ -218,7 +218,7 @@ ensure_hex4({_TokenTag, Line, Hex4}) when length(Hex4) =< 4, length(Hex4) > 0 -> case (catch do_ensure_hex4(Hex4)) of - IL when list(IL), length(IL) == 2 -> + IL when is_list(IL) andalso (length(IL) =:= 2) -> IL; Error -> return_error(Line, {bad_hex4, Hex4, Error}) @@ -446,7 +446,7 @@ PropParms = [#'IndAudPropertyParm'{name = Val}], Desc2 = Desc#'IndAudLocalControlDescriptor'{propertyParms = PropParms}, do_merge_indAudLocalControlDescriptor(Parms, Desc2); - {pkgdName, Val} when list(Desc#'IndAudLocalControlDescriptor'.propertyParms) -> + {pkgdName, Val} when is_list(Desc#'IndAudLocalControlDescriptor'.propertyParms) -> PropParms = Desc#'IndAudLocalControlDescriptor'.propertyParms, PropParms2 = [#'IndAudPropertyParm'{name = Val} | PropParms], Desc2 = Desc#'IndAudLocalControlDescriptor'{propertyParms = PropParms2}, @@ -547,7 +547,7 @@ merge_auditDescriptor([]) -> #'AuditDescriptor'{}; -merge_auditDescriptor(Tokens) when list(Tokens) -> +merge_auditDescriptor(Tokens) when is_list(Tokens) -> case lists:keysearch(terminationAudit, 1, Tokens) of {value, {terminationAudit, TA}} -> case lists:keydelete(terminationAudit, 1, Tokens) of @@ -582,8 +582,9 @@ exit({missing_required_serviceChangeParm, Required}); merge_ServiceChangeParm([{address, Val}|Parms], SCP0, Req) - when SCP0#'ServiceChangeParm'.serviceChangeAddress == asn1_NOVALUE, - SCP0#'ServiceChangeParm'.serviceChangeMgcId == asn1_NOVALUE -> + when ((SCP0#'ServiceChangeParm'.serviceChangeAddress =:= asn1_NOVALUE) + andalso + (SCP0#'ServiceChangeParm'.serviceChangeMgcId =:= asn1_NOVALUE)) -> SCP = SCP0#'ServiceChangeParm'{serviceChangeAddress = Val}, merge_ServiceChangeParm(Parms, SCP, Req); merge_ServiceChangeParm([{address, Val}|_Parms], SCP0, _Req) @@ -592,8 +593,8 @@ exit({not_both_address_mgcid_serviceChangeParm, Val, MgcId}); merge_ServiceChangeParm([{mgc_id, Val}|Parms], SCP0, Req) - when SCP0#'ServiceChangeParm'.serviceChangeMgcId == asn1_NOVALUE, - SCP0#'ServiceChangeParm'.serviceChangeAddress == asn1_NOVALUE -> + when ((SCP0#'ServiceChangeParm'.serviceChangeMgcId =:= asn1_NOVALUE) andalso + (SCP0#'ServiceChangeParm'.serviceChangeAddress =:= asn1_NOVALUE)) -> SCP = SCP0#'ServiceChangeParm'{serviceChangeMgcId = Val}, merge_ServiceChangeParm(Parms, SCP, Req); merge_ServiceChangeParm([{mgc_id, Val}|_Parms], SCP0, _Req) @@ -640,26 +641,28 @@ %% OTP-5353. merge_ServiceChangeParm([{audit_item, Val}|Parms], SCP0, Req) - when SCP0#'ServiceChangeParm'.serviceChangeInfo == asn1_NOVALUE, atom(Val) -> + when ((SCP0#'ServiceChangeParm'.serviceChangeInfo =:= asn1_NOVALUE) + andalso is_atom(Val)) -> SCI = #'AuditDescriptor'{auditToken = [Val]}, SCP = SCP0#'ServiceChangeParm'{serviceChangeInfo = SCI}, merge_ServiceChangeParm(Parms, SCP, Req); merge_ServiceChangeParm([{audit_item, Val}|Parms], SCP0, Req) - when SCP0#'ServiceChangeParm'.serviceChangeInfo == asn1_NOVALUE,tuple(Val) -> + when ((SCP0#'ServiceChangeParm'.serviceChangeInfo =:= asn1_NOVALUE) + andalso is_tuple(Val)) -> SCI = #'AuditDescriptor'{auditPropertyToken = [Val]}, SCP = SCP0#'ServiceChangeParm'{serviceChangeInfo = SCI}, merge_ServiceChangeParm(Parms, SCP, Req); merge_ServiceChangeParm([{audit_item, Val}|Parms], SCP0, Req) - when record(SCP0#'ServiceChangeParm'.serviceChangeInfo, 'AuditDescriptor'), - atom(Val) -> + when (is_record(SCP0#'ServiceChangeParm'.serviceChangeInfo, 'AuditDescriptor') + andalso is_atom(Val)) -> SCI0 = SCP0#'ServiceChangeParm'.serviceChangeInfo, L = SCI0#'AuditDescriptor'.auditToken, SCI = SCI0#'AuditDescriptor'{auditToken = [Val|L]}, SCP = SCP0#'ServiceChangeParm'{serviceChangeInfo = SCI}, merge_ServiceChangeParm(Parms, SCP, Req); merge_ServiceChangeParm([{audit_item, Val}|Parms], SCP0, Req) - when record(SCP0#'ServiceChangeParm'.serviceChangeInfo, 'AuditDescriptor'), - tuple(Val) -> + when (is_record(SCP0#'ServiceChangeParm'.serviceChangeInfo, 'AuditDescriptor') + andalso is_tuple(Val)) -> SCI0 = SCP0#'ServiceChangeParm'.serviceChangeInfo, L = SCI0#'AuditDescriptor'.auditPropertyToken, SCI = SCI0#'AuditDescriptor'{auditPropertyToken = [Val|L]}, @@ -974,12 +977,12 @@ do_merge_eventParameters(T, StreamId, EPL, RA2, yes); {stream, NewStreamId} when StreamId == asn1_NOVALUE -> do_merge_eventParameters(T, NewStreamId, EPL, RA, HasA); - {other, PP} when record(PP, 'PropertyParm') -> + {other, PP} when is_record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_eventParameters(T, StreamId, [EP | EPL], RA, HasA); - {other, EP} when record(EP, 'EventParameter') -> + {other, EP} when is_record(EP, 'EventParameter') -> do_merge_eventParameters(T, StreamId, [EP | EPL], RA, HasA); _ -> return_error(0, {bad_eventParameter, H}) @@ -1016,12 +1019,12 @@ do_merge_secondEventParameters(T, StreamId, EPL, SRA2, yes); {stream, NewStreamId} when StreamId == asn1_NOVALUE -> do_merge_secondEventParameters(T, NewStreamId, EPL, SRA, HasA); - {other, PP} when record(PP, 'PropertyParm') -> + {other, PP} when is_record(PP, 'PropertyParm') -> EP = #'EventParameter'{eventParameterName = PP#'PropertyParm'.name, value = PP#'PropertyParm'.value, extraInfo = PP#'PropertyParm'.extraInfo}, do_merge_secondEventParameters(T, StreamId, [EP | EPL], SRA, HasA); - {other, EP} when record(EP, 'EventParameter') -> + {other, EP} when is_record(EP, 'EventParameter') -> do_merge_secondEventParameters(T, StreamId, [EP | EPL], SRA, HasA); _ -> return_error(0, {bad_secondEventParameter, H}) @@ -1121,7 +1124,7 @@ do_merge_action_requests(CtxId, CtxReq, CtxAuditReq, CmdReq, TopReq, [H | T]) -> case H of - _ when record(H, 'CommandRequest') -> + _ when is_record(H, 'CommandRequest') -> do_merge_action_requests(CtxId, CtxReq, CtxAuditReq, [H | CmdReq], TopReq, T); {priority, Int} when CtxReq#'ContextRequest'.priority == asn1_NOVALUE -> @@ -1223,9 +1226,9 @@ commandReply = lists:reverse(CmdList)}. strip_contextRequest(R, TopReq) - when R#'ContextRequest'.priority == asn1_NOVALUE, - R#'ContextRequest'.emergency == asn1_NOVALUE, - TopReq == [] -> + when ((R#'ContextRequest'.priority =:= asn1_NOVALUE) andalso + (R#'ContextRequest'.emergency =:= asn1_NOVALUE) andalso + (TopReq =:= [])) -> asn1_NOVALUE; strip_contextRequest(R, []) -> R#'ContextRequest'{topologyReq = asn1_NOVALUE}; @@ -1234,9 +1237,9 @@ strip_contextAttrAuditRequest(R) - when R#'ContextAttrAuditRequest'.priority == asn1_NOVALUE, - R#'ContextAttrAuditRequest'.emergency == asn1_NOVALUE, - R#'ContextAttrAuditRequest'.topology == asn1_NOVALUE -> + when ((R#'ContextAttrAuditRequest'.priority =:= asn1_NOVALUE) andalso + (R#'ContextAttrAuditRequest'.emergency =:= asn1_NOVALUE) andalso + (R#'ContextAttrAuditRequest'.topology =:= asn1_NOVALUE)) -> asn1_NOVALUE; strip_contextAttrAuditRequest(R) -> R. @@ -1565,7 +1568,7 @@ if is_integer(Max) andalso (Val =< Max) -> Val; - Max == infinity -> + Max =:= infinity -> Val; true -> return_error(Line, {too_large_integer, Val, Max}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_v3.yrl erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_v3.yrl --- erlang-13.b.1-dfsg/lib/megaco/src/text/megaco_text_parser_v3.yrl 2009-03-12 12:32:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/text/megaco_text_parser_v3.yrl 2009-09-18 13:47:52.000000000 +0100 @@ -65,7 +65,7 @@ %% This is ugly but... %%---------------------------------------------------------------------- -Expect 90. +Expect 91. %%---------------------------------------------------------------------- @@ -1557,7 +1557,7 @@ safeToken2 -> 'AuditCapToken' : '$1' . safeToken2 -> 'AuditValueToken' : '$1' . safeToken2 -> 'AuthToken' : '$1' . -%% v3-safeToken2 -> 'BothToken' : '$1' . % v3 +safeToken2 -> 'BothToken' : '$1' . % v3 %% v3-safeToken2 -> 'BothwayToken' : '$1' . safeToken2 -> 'BriefToken' : '$1' . %% v3-safeToken2 -> 'BufferToken' : '$1' . diff -Nru erlang-13.b.1-dfsg/lib/megaco/src/udp/megaco_udp.erl erlang-13.b.3-dfsg/lib/megaco/src/udp/megaco_udp.erl --- erlang-13.b.1-dfsg/lib/megaco/src/udp/megaco_udp.erl 2009-03-12 12:30:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/src/udp/megaco_udp.erl 2009-11-20 13:37:07.000000000 +0000 @@ -64,7 +64,8 @@ get_stats(SH) when is_record(SH, send_handle) -> megaco_stats:get_stats(megaco_udp_stats, SH). -get_stats(SH, Counter) when is_record(SH, send_handle), atom(Counter) -> +get_stats(SH, Counter) + when is_record(SH, send_handle) andalso is_atom(Counter) -> megaco_stats:get_stats(megaco_udp_stats, SH, Counter). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_actions_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_actions_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_actions_test.erl 2009-03-12 12:31:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_actions_test.erl 2009-09-18 15:13:11.000000000 +0100 @@ -101,7 +101,7 @@ []; pretty_text(doc) -> []; -pretty_text(Config) when list(Config) -> +pretty_text(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), i("pretty_text -> starting"), @@ -116,7 +116,7 @@ []; flex_pretty_text(doc) -> []; -flex_pretty_text(Config) when list(Config) -> +flex_pretty_text(Config) when is_list(Config) -> ?SKIP(not_implemented_yet). @@ -124,7 +124,7 @@ []; compact_text(doc) -> []; -compact_text(Config) when list(Config) -> +compact_text(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), i("compact_text -> starting"), @@ -139,7 +139,7 @@ []; flex_compact_text(doc) -> []; -flex_compact_text(Config) when list(Config) -> +flex_compact_text(Config) when is_list(Config) -> ?SKIP(not_implemented_yet). @@ -147,7 +147,7 @@ []; erl_dist(doc) -> []; -erl_dist(Config) when list(Config) -> +erl_dist(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), i("erl_dist -> starting"), @@ -162,7 +162,7 @@ []; erl_dist_mc(doc) -> []; -erl_dist_mc(Config) when list(Config) -> +erl_dist_mc(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), i("erl_dist_mc -> starting"), @@ -177,7 +177,7 @@ []; ber_bin(doc) -> []; -ber_bin(Config) when list(Config) -> +ber_bin(Config) when is_list(Config) -> ?SKIP(currently_not_supported_by_asn1). @@ -185,7 +185,7 @@ []; ber_bin_drv(doc) -> []; -ber_bin_drv(Config) when list(Config) -> +ber_bin_drv(Config) when is_list(Config) -> ?SKIP(currently_not_supported_by_asn1). @@ -193,7 +193,7 @@ []; ber_bin_native(doc) -> []; -ber_bin_native(Config) when list(Config) -> +ber_bin_native(Config) when is_list(Config) -> ?SKIP(currently_not_supported_by_asn1). @@ -201,14 +201,14 @@ []; ber_bin_drv_native(doc) -> []; -ber_bin_drv_native(Config) when list(Config) -> +ber_bin_drv_native(Config) when is_list(Config) -> ?SKIP(currently_not_supported_by_asn1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -req_and_rep(Config, Codec, _Version, EC) when list(Config) -> +req_and_rep(Config, Codec, _Version, EC) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), i("req_and_rep -> starting"), diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_app_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_app_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_app_test.erl 2009-06-05 13:55:47.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_app_test.erl 2009-11-20 13:37:17.000000000 +0000 @@ -33,6 +33,9 @@ %% Test server callbacks +init_per_testcase(undef_funcs = Case, Config) -> + NewConfig = [{tc_timeout, ?MINUTES(10)} | Config], + megaco_test_lib:init_per_testcase(Case, NewConfig); init_per_testcase(Case, Config) -> megaco_test_lib:init_per_testcase(Case, Config). @@ -47,15 +50,17 @@ fields, modules, exportall, - app_depend + app_depend, + undef_funcs ], {req, [], {conf, app_init, Cases, app_fin}}. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% app_init(suite) -> []; app_init(doc) -> []; -app_init(Config) when list(Config) -> +app_init(Config) when is_list(Config) -> case is_app(megaco) of {ok, AppFile} -> io:format("AppFile: ~n~p~n", [AppFile]), @@ -89,7 +94,7 @@ app_fin(suite) -> []; app_fin(doc) -> []; -app_fin(Config) when list(Config) -> +app_fin(Config) when is_list(Config) -> Config. @@ -99,7 +104,7 @@ []; fields(doc) -> []; -fields(Config) when list(Config) -> +fields(Config) when is_list(Config) -> AppFile = key1search(app_file, Config), Fields = [vsn, description, modules, registered, applications], case check_fields(Fields, AppFile, []) of @@ -130,7 +135,7 @@ []; modules(doc) -> []; -modules(Config) when list(Config) -> +modules(Config) when is_list(Config) -> AppFile = key1search(app_file, Config), Mods = key1search(modules, AppFile), EbinList = get_ebin_mods(megaco), @@ -187,7 +192,7 @@ []; exportall(doc) -> []; -exportall(Config) when list(Config) -> +exportall(Config) when is_list(Config) -> AppFile = key1search(app_file, Config), Mods = key1search(modules, AppFile), check_export_all(Mods). @@ -220,7 +225,7 @@ []; app_depend(doc) -> []; -app_depend(Config) when list(Config) -> +app_depend(Config) when is_list(Config) -> AppFile = key1search(app_file, Config), Apps = key1search(applications, AppFile), check_apps(Apps). @@ -239,6 +244,57 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +undef_funcs(suite) -> + []; +undef_funcs(doc) -> + []; +undef_funcs(Config) when is_list(Config) -> + App = megaco, + AppFile = key1search(app_file, Config), + Mods = key1search(modules, AppFile), + Root = code:root_dir(), + LibDir = code:lib_dir(App), + EbinDir = filename:join([LibDir,"ebin"]), + XRefTestName = undef_funcs_make_name(App, xref_test_name), + {ok, XRef} = xref:start(XRefTestName), + ok = xref:set_default(XRef, + [{verbose,false},{warnings,false}]), + XRefName = undef_funcs_make_name(App, xref_name), + {ok, XRefName} = xref:add_release(XRef, Root, {name,XRefName}), + {ok, App} = xref:replace_application(XRef, App, EbinDir), + {ok, Undefs} = xref:analyze(XRef, undefined_function_calls), + xref:stop(XRef), + analyze_undefined_function_calls(Undefs, Mods, []). + +analyze_undefined_function_calls([], _, []) -> + ok; +analyze_undefined_function_calls([], _, AppUndefs) -> + exit({suite_failed, {undefined_function_calls, AppUndefs}}); +analyze_undefined_function_calls([{{Mod, _F, _A}, _C} = AppUndef|Undefs], + AppModules, AppUndefs) -> + %% Check that this module is our's + case lists:member(Mod,AppModules) of + true -> + {Calling,Called} = AppUndef, + {Mod1,Func1,Ar1} = Calling, + {Mod2,Func2,Ar2} = Called, + io:format("undefined function call: " + "~n ~w:~w/~w calls ~w:~w/~w~n", + [Mod1,Func1,Ar1,Mod2,Func2,Ar2]), + analyze_undefined_function_calls(Undefs, AppModules, + [AppUndef|AppUndefs]); + false -> + io:format("dropping ~p~n", [Mod]), + analyze_undefined_function_calls(Undefs, AppModules, AppUndefs) + end. + +%% This function is used simply to avoid cut-and-paste errors later... +undef_funcs_make_name(App, PostFix) -> + list_to_atom(atom_to_list(App) ++ "_" ++ atom_to_list(PostFix)). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + fail(Reason) -> exit({suite_failed, Reason}). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_appup_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_appup_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_appup_test.erl 2009-06-05 13:55:49.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_appup_test.erl 2009-09-18 15:12:56.000000000 +0100 @@ -55,7 +55,7 @@ appup_init(suite) -> []; appup_init(doc) -> []; -appup_init(Config) when list(Config) -> +appup_init(Config) when is_list(Config) -> AppFile = file_name(?APPLICATION, ".app"), AppupFile = file_name(?APPLICATION, ".appup"), [{app_file, AppFile}, {appup_file, AppupFile}|Config]. @@ -68,7 +68,7 @@ appup_fin(suite) -> []; appup_fin(doc) -> []; -appup_fin(Config) when list(Config) -> +appup_fin(Config) when is_list(Config) -> Config. @@ -78,7 +78,7 @@ []; appup(doc) -> "perform a simple check of the appup file"; -appup(Config) when list(Config) -> +appup(Config) when is_list(Config) -> AppupFile = key1search(appup_file, Config), AppFile = key1search(app_file, Config), Modules = modules(AppFile), @@ -166,14 +166,14 @@ %% A new module is added check_instruction(up, {add_module, Module}, _, Modules) - when atom(Module) -> + when is_atom(Module) -> d("check_instruction -> entry when up-add_module instruction with" "~n Module: ~p", [Module]), check_module(Module, Modules); %% An old module is re-added check_instruction(down, {add_module, Module}, _, Modules) - when atom(Module) -> + when is_atom(Module) -> d("check_instruction -> entry when down-add_module instruction with" "~n Module: ~p", [Module]), case (catch check_module(Module, Modules)) of @@ -187,7 +187,7 @@ %% - the module has been removed from the app-file. %% - check that no module depends on this (removed) module check_instruction(up, {remove, {Module, Pre, Post}}, _, Modules) - when atom(Module), atom(Pre), atom(Post) -> + when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) -> d("check_instruction -> entry when up-remove instruction with" "~n Module: ~p" "~n Pre: ~p" @@ -203,7 +203,7 @@ %% Removing a module on downgrade: the module exist %% in the app-file. check_instruction(down, {remove, {Module, Pre, Post}}, AllInstr, Modules) - when atom(Module), atom(Pre), atom(Post) -> + when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) -> d("check_instruction -> entry when down-remove instruction with" "~n Module: ~p" "~n Pre: ~p" @@ -219,7 +219,7 @@ check_instruction(_, {load_module, Module, Pre, Post, Depend}, AllInstr, Modules) - when atom(Module), atom(Pre), atom(Post), list(Depend) -> + when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) andalso is_list(Depend) -> d("check_instruction -> entry when load_module instruction with" "~n Module: ~p" "~n Pre: ~p" @@ -233,7 +233,7 @@ check_instruction(_, {update, Module, Change, Pre, Post, Depend}, AllInstr, Modules) - when atom(Module), atom(Pre), atom(Post), list(Depend) -> + when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) andalso is_list(Depend) -> d("check_instruction -> entry when update instruction with" "~n Module: ~p" "~n Change: ~p" @@ -252,7 +252,7 @@ check_module(Module, Modules); check_instruction(_, {apply, {Module, Function, Args}}, _, Modules) - when atom(Module), atom(Function), list(Args) -> + when is_atom(Module) andalso is_atom(Function) andalso is_list(Args) -> d("check_instruction -> entry when down-apply instruction with" "~n Module: ~p" "~n Function: ~p" @@ -370,7 +370,7 @@ %% The version is a string consting of numbers separated by dots: "." %% Example: "3.3.3" %% -check_version(V) when list(V) -> +check_version(V) when is_list(V) -> case do_check_version(string:tokens(V, [$.])) of ok -> ok; @@ -390,7 +390,7 @@ {error, H} end. -check_module(M, Modules) when atom(M) -> +check_module(M, Modules) when is_atom(M) -> case lists:member(M,Modules) of true -> ok; @@ -401,11 +401,11 @@ error({bad_module, M}). -check_module_depend(M, [], _) when atom(M) -> +check_module_depend(M, [], _) when is_atom(M) -> d("check_module_depend -> entry with" "~n M: ~p", [M]), ok; -check_module_depend(M, Deps, Modules) when atom(M), list(Deps) -> +check_module_depend(M, Deps, Modules) when is_atom(M) andalso is_list(Deps) -> d("check_module_depend -> entry with" "~n M: ~p" "~n Deps: ~p" @@ -464,7 +464,7 @@ check_apply(Module, Function, Args) -> case (catch Module:module_info()) of - Info when list(Info) -> + Info when is_list(Info) -> check_exported(Function, Args, Info); {'EXIT', {undef, _}} -> error({not_existing_module, Module}) diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_binary_term_id_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_binary_term_id_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_binary_term_id_test.erl 2009-03-12 12:30:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_binary_term_id_test.erl 2009-09-18 15:12:48.000000000 +0100 @@ -206,16 +206,16 @@ [D,Reason]), error. -check_ok_result(R,R) when record(R,megaco_term_id) -> +check_ok_result(R,R) when is_record(R,megaco_term_id) -> ok; % Same record type and same record content -check_ok_result(S,E) when record(S,megaco_term_id), - record(E,megaco_term_id) -> +check_ok_result(S,E) when is_record(S,megaco_term_id) andalso + is_record(E,megaco_term_id) -> Reason = check_megaco_term_id_record(S,E), {error,Reason}; % Same record type but different record content -check_ok_result(R,R) when record(R,'TerminationID') -> +check_ok_result(R,R) when is_record(R,'TerminationID') -> ok; -check_ok_result(S,E) when record(S,'TerminationID'), - record(E,'TerminationID') -> +check_ok_result(S,E) when is_record(S,'TerminationID') andalso + is_record(E,'TerminationID') -> Reason = check_TerminationID_record(S,E), {error,Reason}; % Same record type but different record content check_ok_result(_S,_E) -> @@ -302,7 +302,7 @@ te01(suite) -> []; -te01(Config) when list(Config) -> +te01(Config) when is_list(Config) -> {Exp,Res} = te01(), ok = check(te01(doc),Exp,Res). @@ -325,7 +325,7 @@ te02(suite) -> []; -te02(Config) when list(Config) -> +te02(Config) when is_list(Config) -> {Exp,Res} = te02(), ok = check(te02(doc),Exp,Res). @@ -347,7 +347,7 @@ te03(suite) -> []; -te03(Config) when list(Config) -> +te03(Config) when is_list(Config) -> {Exp,Res} = te03(), ok = check(te03(doc),Exp,Res). @@ -369,7 +369,7 @@ te04(suite) -> []; -te04(Config) when list(Config) -> +te04(Config) when is_list(Config) -> {Exp,Res} = te04(), ok = check(te04(doc),Exp,Res). @@ -391,7 +391,7 @@ te05(suite) -> []; -te05(Config) when list(Config) -> +te05(Config) when is_list(Config) -> {Exp,Res} = te05(), ok = check(te05(doc),Exp,Res). @@ -413,7 +413,7 @@ te06(suite) -> []; -te06(Config) when list(Config) -> +te06(Config) when is_list(Config) -> {Exp,Res} = te06(), ok = check(te06(doc),Exp,Res). @@ -435,7 +435,7 @@ te07(suite) -> []; -te07(Config) when list(Config) -> +te07(Config) when is_list(Config) -> {Exp,Res} = te07(), ok = check(te07(doc),Exp,Res). @@ -457,7 +457,7 @@ te08(suite) -> []; -te08(Config) when list(Config) -> +te08(Config) when is_list(Config) -> {Exp,Res} = te08(), ok = check(te08(doc),Exp,Res). @@ -479,7 +479,7 @@ te09(suite) -> []; -te09(Config) when list(Config) -> +te09(Config) when is_list(Config) -> {Exp,Res} = te09(), ok = check(te09(doc),Exp,Res). @@ -501,7 +501,7 @@ te10(suite) -> []; -te10(Config) when list(Config) -> +te10(Config) when is_list(Config) -> {Exp,Res} = te10(), ok = check(te10(doc),Exp,Res). @@ -523,7 +523,7 @@ te11(suite) -> []; -te11(Config) when list(Config) -> +te11(Config) when is_list(Config) -> {Exp,Res} = te11(), ok = check(te11(doc),Exp,Res). @@ -545,7 +545,7 @@ te12(suite) -> []; -te12(Config) when list(Config) -> +te12(Config) when is_list(Config) -> {Exp,Res} = te12(), ok = check(te12(doc),Exp,Res). @@ -567,7 +567,7 @@ te13(suite) -> []; -te13(Config) when list(Config) -> +te13(Config) when is_list(Config) -> {Exp,Res} = te13(), ok = check(te13(doc),Exp,Res). @@ -589,7 +589,7 @@ te14(suite) -> []; -te14(Config) when list(Config) -> +te14(Config) when is_list(Config) -> {Exp,Res} = te14(), ok = check(te14(doc),Exp,Res). @@ -611,7 +611,7 @@ te15(suite) -> []; -te15(Config) when list(Config) -> +te15(Config) when is_list(Config) -> {Exp,Res} = te15(), ok = check(te15(doc),Exp,Res). @@ -633,7 +633,7 @@ te16(suite) -> []; -te16(Config) when list(Config) -> +te16(Config) when is_list(Config) -> {Exp,Res} = te16(), ok = check(te16(doc),Exp,Res). @@ -655,7 +655,7 @@ te17(suite) -> []; -te17(Config) when list(Config) -> +te17(Config) when is_list(Config) -> {Exp,Res} = te17(), ok = check(te17(doc),Exp,Res). @@ -677,7 +677,7 @@ te18(suite) -> []; -te18(Config) when list(Config) -> +te18(Config) when is_list(Config) -> {Exp,Res} = te18(), ok = check(te18(doc),Exp,Res). @@ -699,7 +699,7 @@ te19(suite) -> []; -te19(Config) when list(Config) -> +te19(Config) when is_list(Config) -> {Exp,Res} = te19(), ok = check(te19(doc),Exp,Res). @@ -721,7 +721,7 @@ td01(suite) -> []; -td01(Config) when list(Config) -> +td01(Config) when is_list(Config) -> {Exp,Res} = td01(), ok = check(td01(doc),Exp,Res). @@ -744,7 +744,7 @@ td02(suite) -> []; -td02(Config) when list(Config) -> +td02(Config) when is_list(Config) -> {Exp,Res} = td02(), ok = check(td02(doc),Exp,Res). @@ -766,7 +766,7 @@ td03(suite) -> []; -td03(Config) when list(Config) -> +td03(Config) when is_list(Config) -> {Exp,Res} = td03(), ok = check(td03(doc),Exp,Res). @@ -788,7 +788,7 @@ td04(suite) -> []; -td04(Config) when list(Config) -> +td04(Config) when is_list(Config) -> {Exp,Res} = td04(), ok = check(td04(doc),Exp,Res). @@ -810,7 +810,7 @@ td05(suite) -> []; -td05(Config) when list(Config) -> +td05(Config) when is_list(Config) -> {Exp,Res} = td05(), ok = check(td05(doc),Exp,Res). @@ -832,7 +832,7 @@ td06(suite) -> []; -td06(Config) when list(Config) -> +td06(Config) when is_list(Config) -> {Exp,Res} = td06(), ok = check(td06(doc),Exp,Res). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_call_flow_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_call_flow_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_call_flow_test.erl 2009-03-12 12:30:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_call_flow_test.erl 2009-09-18 15:12:46.000000000 +0100 @@ -84,61 +84,61 @@ pretty(suite) -> []; -pretty(Config) when list(Config) -> +pretty(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), pretty_text(). compact(suite) -> []; -compact(Config) when list(Config) -> +compact(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), compact_text(). pretty_flex(suite) -> []; -pretty_flex(Config) when list(Config) -> +pretty_flex(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), pretty_flex(). compact_flex(suite) -> []; -compact_flex(Config) when list(Config) -> +compact_flex(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), compact_flex(). bin(suite) -> []; -bin(Config) when list(Config) -> +bin(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), bin(). ber(suite) -> []; -ber(Config) when list(Config) -> +ber(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), asn1_ber(). ber_bin(suite) -> []; -ber_bin(Config) when list(Config) -> +ber_bin(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), asn1_ber_bin(). per(suite) -> []; -per(Config) when list(Config) -> +per(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), asn1_per(). standard_erl(suite) -> []; -standard_erl(Config) when list(Config) -> +standard_erl(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), standard_erl(). compressed_erl(suite) -> []; -compressed_erl(Config) when list(Config) -> +compressed_erl(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), compressed_erl(). @@ -179,7 +179,7 @@ %% -define(A5555, ["11110000"]). %% -define(A5556, ["11111111"]). -request(Mid, TransId, ContextId, CmdReq) when list(CmdReq) -> +request(Mid, TransId, ContextId, CmdReq) when is_list(CmdReq) -> Actions = [#'ActionRequest'{contextId = ContextId, commandRequests = CmdReq}], Req = {transactions, @@ -190,7 +190,7 @@ mId = Mid, messageBody = Req}}. -reply(Mid, TransId, ContextId, CmdReply) when list(CmdReply) -> +reply(Mid, TransId, ContextId, CmdReply) when is_list(CmdReply) -> Actions = [#'ActionReply'{contextId = ContextId, commandReply = CmdReply}], Req = {transactions, @@ -1305,7 +1305,7 @@ Main = "==================================================", Sub = "--------------------------------------------------", case catch Mod:encode_message(Opt, DecodedMsg) of - {ok, EncodedMsg} when binary(EncodedMsg) -> + {ok, EncodedMsg} when is_binary(EncodedMsg) -> Sz = size(EncodedMsg), ok = io:format("~w ~s ~w bytes~n", [Slogan, Main, Sz]), @@ -1313,7 +1313,7 @@ case catch Mod:decode_message(Opt, EncodedMsg) of {ok, ReDecodedMsg} -> fmt(Slogan, DecodedMsg, ReDecodedMsg); - {error, {Line, _, Reason}} when integer(Line)-> + {error, {Line, _, Reason}} when is_integer(Line)-> ?ERROR([{Slogan, Line, decode_failed}, {error, Reason}, {encoded, EncodedMsg}, DecodedMsg]), io:format("~n~w #~w: ~w~n", [Slogan, Line, Reason]); @@ -1352,7 +1352,7 @@ compute_res(All) -> compute_res(All, [], 0). -compute_res([H | T], Bad, Sum) when integer(H) -> +compute_res([H | T], Bad, Sum) when is_integer(H) -> compute_res(T, Bad, Sum + H); compute_res([H | T], Bad, Sum) -> compute_res(T, [H | Bad], Sum); @@ -1380,7 +1380,7 @@ abs_msg_size(DecodedMsg, {Mod, Opt, _Opt2} = Encoder) -> case catch Mod:encode_message(Opt, DecodedMsg) of - {ok, EncodedMsg} when binary(EncodedMsg) -> + {ok, EncodedMsg} when is_binary(EncodedMsg) -> {Encoder, size(EncodedMsg)}; Error -> {Encoder, {bad_encoder, Error}} @@ -1714,7 +1714,7 @@ case catch lists:sum(List) of {'EXIT', _} -> {E, bad, List}; - Sum when integer(Sum) -> + Sum when is_integer(Sum) -> N = length(List), {E, [{min, Min}, {avg, Sum div N}, {max, Max}]} end @@ -1739,7 +1739,7 @@ {value, {_, Sz}} = lists:keysearch(E, 1, List), ActualSz = if - integer(Sz) -> + is_integer(Sz) -> Sz; true -> ok = io:format(" ~p(~p) -> ~p~n", diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_mini_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_mini_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_mini_test.erl 2009-03-12 12:34:21.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_mini_test.erl 2009-09-18 15:13:36.000000000 +0100 @@ -83,7 +83,7 @@ case (catch apply(?MODULE,Case,[suite])) of [] -> expand(Cases, [Case|Acc]); - C when list(C) -> + C when is_list(C) -> expand(Cases, [expand(C, [])|Acc]); _ -> expand(Cases, [Case|Acc]) @@ -137,7 +137,7 @@ otp7672_msg01(suite) -> []; -otp7672_msg01(Config) when list(Config) -> +otp7672_msg01(Config) when is_list(Config) -> %% ?SET_DBG(trc, true), d("otp7672_msg01 -> entry", []), ok = otp7672( otp7672_msg01() ), @@ -146,7 +146,7 @@ otp7672_msg02(suite) -> []; -otp7672_msg02(Config) when list(Config) -> +otp7672_msg02(Config) when is_list(Config) -> %% ?SET_DBG(trc, true), d("otp7672_msg02 -> entry", []), ok = otp7672( otp7672_msg02() ), diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_prev3a_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_prev3a_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_prev3a_test.erl 2009-03-12 12:32:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_prev3a_test.erl 2009-09-18 13:47:50.000000000 +0100 @@ -184,6 +184,7 @@ pretty_otp7671_msg03/1, pretty_otp7671_msg04/1, pretty_otp7671_msg05/1, + pretty_otp8114_msg01/1, flex_pretty_tickets/1, flex_pretty_otp5042_msg1/1, @@ -256,7 +257,7 @@ case (catch apply(?MODULE,Case,[suite])) of [] -> expand(Cases, [Case|Acc]); - C when list(C) -> + C when is_list(C) -> expand(Cases, [expand(C, [])|Acc]); _ -> expand(Cases, [Case|Acc]) @@ -535,7 +536,8 @@ pretty_otp7671_msg02, pretty_otp7671_msg03, pretty_otp7671_msg04, - pretty_otp7671_msg05 + pretty_otp7671_msg05, + pretty_otp8114_msg01 ]. flex_pretty_tickets(suite) -> @@ -572,7 +574,7 @@ pretty_test_msgs(suite) -> []; -pretty_test_msgs(Config) when list(Config) -> +pretty_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(text) ++ msgs2(text) ++ msgs3(text) ++ msgs4(text) ++ msgs5(text) ++ msgs6(text), @@ -593,7 +595,7 @@ flex_pretty_test_msgs(suite) -> []; -flex_pretty_test_msgs(Config) when list(Config) -> +flex_pretty_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), %% Msgs = msgs5(text), Msgs = msgs1(text) ++ msgs2(text) ++ msgs3(text) ++ msgs4(text) ++ @@ -605,7 +607,7 @@ flex_pretty_otp5042_msg1(suite) -> []; -flex_pretty_otp5042_msg1(Config) when list(Config) -> +flex_pretty_otp5042_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5042_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp5042_msg1(), @@ -630,7 +632,7 @@ flex_pretty_otp5085_msg1(suite) -> []; -flex_pretty_otp5085_msg1(Config) when list(Config) -> +flex_pretty_otp5085_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -638,7 +640,7 @@ flex_pretty_otp5085_msg2(suite) -> []; -flex_pretty_otp5085_msg2(Config) when list(Config) -> +flex_pretty_otp5085_msg2(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -646,7 +648,7 @@ flex_pretty_otp5085_msg3(suite) -> []; -flex_pretty_otp5085_msg3(Config) when list(Config) -> +flex_pretty_otp5085_msg3(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -654,7 +656,7 @@ flex_pretty_otp5085_msg4(suite) -> []; -flex_pretty_otp5085_msg4(Config) when list(Config) -> +flex_pretty_otp5085_msg4(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -662,7 +664,7 @@ flex_pretty_otp5085_msg5(suite) -> []; -flex_pretty_otp5085_msg5(Config) when list(Config) -> +flex_pretty_otp5085_msg5(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -670,7 +672,7 @@ flex_pretty_otp5085_msg6(suite) -> []; -flex_pretty_otp5085_msg6(Config) when list(Config) -> +flex_pretty_otp5085_msg6(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -678,7 +680,7 @@ flex_pretty_otp5085_msg7(suite) -> []; -flex_pretty_otp5085_msg7(Config) when list(Config) -> +flex_pretty_otp5085_msg7(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg7 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -686,7 +688,7 @@ flex_pretty_otp5085_msg8(suite) -> []; -flex_pretty_otp5085_msg8(Config) when list(Config) -> +flex_pretty_otp5085_msg8(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg8 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -694,7 +696,7 @@ flex_pretty_otp5600_msg1(suite) -> []; -flex_pretty_otp5600_msg1(Config) when list(Config) -> +flex_pretty_otp5600_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5600_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -702,7 +704,7 @@ flex_pretty_otp5600_msg2(suite) -> []; -flex_pretty_otp5600_msg2(Config) when list(Config) -> +flex_pretty_otp5600_msg2(Config) when is_list(Config) -> d("flex_pretty_otp5600_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -710,7 +712,7 @@ flex_pretty_otp5601_msg1(suite) -> []; -flex_pretty_otp5601_msg1(Config) when list(Config) -> +flex_pretty_otp5601_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5601_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -718,7 +720,7 @@ flex_pretty_otp5793_msg01(suite) -> []; -flex_pretty_otp5793_msg01(Config) when list(Config) -> +flex_pretty_otp5793_msg01(Config) when is_list(Config) -> d("flex_pretty_otp5793_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -727,7 +729,7 @@ flex_pretty_otp7431_msg01(suite) -> []; -flex_pretty_otp7431_msg01(Config) when list(Config) -> +flex_pretty_otp7431_msg01(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -735,7 +737,7 @@ flex_pretty_otp7431_msg02(suite) -> []; -flex_pretty_otp7431_msg02(Config) when list(Config) -> +flex_pretty_otp7431_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp7431_msg02 -> entry", []), @@ -745,7 +747,7 @@ flex_pretty_otp7431_msg03(suite) -> []; -flex_pretty_otp7431_msg03(Config) when list(Config) -> +flex_pretty_otp7431_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp7431_msg03 -> entry", []), @@ -755,7 +757,7 @@ flex_pretty_otp7431_msg04(suite) -> []; -flex_pretty_otp7431_msg04(Config) when list(Config) -> +flex_pretty_otp7431_msg04(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg04 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -763,7 +765,7 @@ flex_pretty_otp7431_msg05(suite) -> []; -flex_pretty_otp7431_msg05(Config) when list(Config) -> +flex_pretty_otp7431_msg05(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg05 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -771,7 +773,7 @@ flex_pretty_otp7431_msg06(suite) -> []; -flex_pretty_otp7431_msg06(Config) when list(Config) -> +flex_pretty_otp7431_msg06(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg06 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -779,7 +781,7 @@ flex_pretty_otp7431_msg07(suite) -> []; -flex_pretty_otp7431_msg07(Config) when list(Config) -> +flex_pretty_otp7431_msg07(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg07 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -943,7 +945,7 @@ compact_test_msgs(suite) -> []; -compact_test_msgs(Config) when list(Config) -> +compact_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(text) ++ msgs2(text) ++ msgs3(text) ++ msgs4(text) ++ msgs5(text) ++ msgs6(text), @@ -963,7 +965,7 @@ flex_compact_test_msgs(suite) -> []; -flex_compact_test_msgs(Config) when list(Config) -> +flex_compact_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(text) ++ msgs2(text) ++ msgs3(text) ++ msgs4(text) ++ msgs5(text) ++ msgs6(text), @@ -974,14 +976,14 @@ flex_compact_dm_timers1(suite) -> []; -flex_compact_dm_timers1(Config) when list(Config) -> +flex_compact_dm_timers1(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("1", "2", "3"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers1 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -993,14 +995,14 @@ flex_compact_dm_timers2(suite) -> []; -flex_compact_dm_timers2(Config) when list(Config) -> +flex_compact_dm_timers2(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("02", "03", "04"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers2 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1012,14 +1014,14 @@ flex_compact_dm_timers3(suite) -> []; -flex_compact_dm_timers3(Config) when list(Config) -> +flex_compact_dm_timers3(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("1", "02", "31"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers3 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1031,14 +1033,14 @@ flex_compact_dm_timers4(suite) -> []; -flex_compact_dm_timers4(Config) when list(Config) -> +flex_compact_dm_timers4(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("10", "21", "99"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers4 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1050,14 +1052,14 @@ flex_compact_dm_timers5(suite) -> []; -flex_compact_dm_timers5(Config) when list(Config) -> +flex_compact_dm_timers5(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("99", "23", "11"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers5 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1069,14 +1071,14 @@ flex_compact_dm_timers6(suite) -> []; -flex_compact_dm_timers6(Config) when list(Config) -> +flex_compact_dm_timers6(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("77", "09", "1"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers6 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1088,14 +1090,14 @@ flex_compact_dm_timers7(suite) -> []; -flex_compact_dm_timers7(Config) when list(Config) -> +flex_compact_dm_timers7(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("77", "09", "1", "99"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers7 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1107,14 +1109,14 @@ flex_compact_dm_timers8(suite) -> []; -flex_compact_dm_timers8(Config) when list(Config) -> +flex_compact_dm_timers8(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("01", "09", "01", "02"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers8 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1148,13 +1150,13 @@ exit({invalid_timer_values, {TMRs, TMRs1}}) end. -get_dm_timers({transactions, T}) when list(T) -> +get_dm_timers({transactions, T}) when is_list(T) -> get_dm_timers1(T); get_dm_timers(Other) -> {error, {invalid_transactions, Other}}. get_dm_timers1([{transactionRequest,T}|Ts]) - when record(T,'TransactionRequest') -> + when is_record(T,'TransactionRequest') -> case get_dm_timers2(T) of {ok, Timers} -> Timers; @@ -1167,11 +1169,11 @@ {error, {no_timers, 'TransactionRequest'}}. -get_dm_timers2(#'TransactionRequest'{actions = Actions}) when list(Actions) -> +get_dm_timers2(#'TransactionRequest'{actions = Actions}) when is_list(Actions) -> get_dm_timers3(Actions). -get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when list(Cmds) -> +get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when is_list(Cmds) -> case get_dm_timers4(Cmds) of {ok, Timers} -> {ok, Timers}; @@ -1227,7 +1229,7 @@ bin_test_msgs(suite) -> []; -bin_test_msgs(Config) when list(Config) -> +bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(binary) ++ msgs4(binary) ++ msgs5(binary) ++ msgs6(binary), %% Msgs = msgs5(binary), @@ -1239,7 +1241,7 @@ ber_test_msgs(suite) -> []; -ber_test_msgs(Config) when list(Config) -> +ber_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(binary) ++ msgs4(binary) ++ msgs5(binary) ++ msgs6(binary), %% Msgs = msgs6(binary), @@ -1251,7 +1253,7 @@ ber_bin_test_msgs(suite) -> []; -ber_bin_test_msgs(Config) when list(Config) -> +ber_bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(binary) ++ msgs4(binary) ++ msgs5(binary) ++ msgs6(binary), DynamicDecode = true, @@ -1262,7 +1264,7 @@ per_test_msgs(suite) -> []; -per_test_msgs(Config) when list(Config) -> +per_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(binary) ++ msgs4(binary) ++ msgs5(binary) ++ msgs6(binary), DynamicDecode = false, @@ -1273,7 +1275,7 @@ per_bin_test_msgs(suite) -> []; -per_bin_test_msgs(Config) when list(Config) -> +per_bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(binary) ++ msgs4(binary) ++ msgs5(binary) ++ msgs6(binary), DynamicDecode = false, @@ -1284,7 +1286,7 @@ erl_dist_m_test_msgs(suite) -> []; -erl_dist_m_test_msgs(Config) when list(Config) -> +erl_dist_m_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(erlang) ++ msgs2(erlang) ++ @@ -1307,7 +1309,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg1(suite) -> []; -compact_otp4011_msg1(Config) when list(Config) -> +compact_otp4011_msg1(Config) when is_list(Config) -> % put(severity,trc), % put(dbg,true), d("compact_otp4011_msg1 -> entry", []), @@ -1323,7 +1325,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg2(suite) -> []; -compact_otp4011_msg2(Config) when list(Config) -> +compact_otp4011_msg2(Config) when is_list(Config) -> d("compact_otp4011_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), M = "!/" ?VERSION_STR " ML T=233350{C=${A=stedevice/01{M{O{MO=SO,RV=OFF,RG=OFF,tdmc/ec=OFF,MO=SR}}}}}", @@ -1336,7 +1338,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg3(suite) -> []; -compact_otp4011_msg3(Config) when list(Config) -> +compact_otp4011_msg3(Config) when is_list(Config) -> d("compact_otp4011_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), M = "!/" ?VERSION_STR " ML T=233350{C=${A=stedevice/01{M{O{MO=SR,RV=OFF,RG=OFF,tdmc/ec=OFF,MO=SO}}}}}", @@ -1352,7 +1354,7 @@ case decode_message(megaco_compact_text_encoder, false, ?EC, Bin) of {ok, _} -> exit({decoded_erroneous_message,M}); - {error, Error} when list(Error) -> % Expected result + {error, Error} when is_list(Error) -> % Expected result d("compact_otp4011 -> expected error result (so far)", []), case lists:keysearch(reason,1,Error) of {value, {reason,Reason}} -> @@ -1361,10 +1363,10 @@ case Reason of {0, megaco_text_parser_prev3a, {do_merge_control_streamParms, [A,B]}} - when list(A), record(B, 'LocalControlDescriptor') -> + when is_list(A) andalso is_record(B, 'LocalControlDescriptor') -> case lists:keysearch(mode,1,A) of {value, {mode, _Mode}} - when B#'LocalControlDescriptor'.streamMode /= asn1_NOVALUE -> + when B#'LocalControlDescriptor'.streamMode =/= asn1_NOVALUE -> d("compact_otp4011 -> expected error",[]), ok; Other -> @@ -1389,7 +1391,7 @@ %% MEGCAO instead of the correct MEGACO. compact_otp4013_msg1(suite) -> []; -compact_otp4013_msg1(Config) when list(Config) -> +compact_otp4013_msg1(Config) when is_list(Config) -> d("compact_otp4013_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), M = "MEGCAO/3 MG1 T=12345678{C=-{SC=root{SV{MT=RS,RE=901}}}}", @@ -1414,7 +1416,7 @@ %% compact_otp4085_msg1(suite) -> []; -compact_otp4085_msg1(Config) when list(Config) -> +compact_otp4085_msg1(Config) when is_list(Config) -> d("compact_otp4085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), M = compact_otp4085_erroneous_msg(), @@ -1422,7 +1424,7 @@ case decode_message(megaco_compact_text_encoder, false, ?EC, Bin) of {ok, M} -> exit({decoded_erroneous_message,M}); - {error, Error} when list(Error) -> % Expected result + {error, Error} when is_list(Error) -> % Expected result t("compact_otp4085_msg1 -> decode failed", []), case lists:keysearch(reason, 1, Error) of {value, {reason,{999999, Module, Crap}}} -> @@ -1451,7 +1453,7 @@ %% compact_otp4085_msg1 is actually ok when you add '}' at the end. compact_otp4085_msg2(suite) -> []; -compact_otp4085_msg2(Config) when list(Config) -> +compact_otp4085_msg2(Config) when is_list(Config) -> d("compact_otp4085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), M1 = compact_otp4085_erroneous_msg() ++ "}", @@ -1484,14 +1486,14 @@ %% compact_otp4280_msg1(suite) -> []; -compact_otp4280_msg1(Config) when list(Config) -> +compact_otp4280_msg1(Config) when is_list(Config) -> d("compact_otp4280_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Bin = list_to_binary(compact_otp4280_msg()), case decode_message(megaco_compact_text_encoder, false, ?EC, Bin) of {ok, _Msg} -> ok; - {error, Error} when list(Error) -> + {error, Error} when is_list(Error) -> t("compact_otp4280_msg1 -> decode failed", []), case lists:keysearch(reason, 1, Error) of {value, {reason,{Line, Module, Reason} = R}} -> @@ -1521,7 +1523,7 @@ %% This ticket is about comments in a message compact_otp4299_msg1(suite) -> []; -compact_otp4299_msg1(Config) when list(Config) -> +compact_otp4299_msg1(Config) when is_list(Config) -> d("compact_otp4299_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Bin = list_to_binary(compact_otp4299_msg()), @@ -1540,7 +1542,7 @@ %% Same message, but this time decoded using the flex scanner compact_otp4299_msg2(suite) -> []; -compact_otp4299_msg2(Config) when list(Config) -> +compact_otp4299_msg2(Config) when is_list(Config) -> d("compact_otp4299_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), @@ -1603,7 +1605,7 @@ %% compact_otp4359_msg1(suite) -> []; -compact_otp4359_msg1(Config) when list(Config) -> +compact_otp4359_msg1(Config) when is_list(Config) -> d("compact_otp4359_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Bin = list_to_binary(compact_otp4359_msg()), @@ -1632,7 +1634,7 @@ %% compact_otp4920_msg0(suite) -> []; -compact_otp4920_msg0(Config) when list(Config) -> +compact_otp4920_msg0(Config) when is_list(Config) -> d("compact_otp4920_msg0 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1640,7 +1642,7 @@ compact_otp4920_msg1(suite) -> []; -compact_otp4920_msg1(Config) when list(Config) -> +compact_otp4920_msg1(Config) when is_list(Config) -> d("compact_otp4920_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1648,42 +1650,42 @@ compact_otp4920_msg2(suite) -> []; -compact_otp4920_msg2(Config) when list(Config) -> +compact_otp4920_msg2(Config) when is_list(Config) -> d("compact_otp4920_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg2(), false). compact_otp4920_msg3(suite) -> []; -compact_otp4920_msg3(Config) when list(Config) -> +compact_otp4920_msg3(Config) when is_list(Config) -> d("compact_otp4920_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg3(), true). compact_otp4920_msg4(suite) -> []; -compact_otp4920_msg4(Config) when list(Config) -> +compact_otp4920_msg4(Config) when is_list(Config) -> d("compact_otp4920_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg4(), true). compact_otp4920_msg5(suite) -> []; -compact_otp4920_msg5(Config) when list(Config) -> +compact_otp4920_msg5(Config) when is_list(Config) -> d("compact_otp4920_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg5(), true). compact_otp4920_msg6(suite) -> []; -compact_otp4920_msg6(Config) when list(Config) -> +compact_otp4920_msg6(Config) when is_list(Config) -> d("compact_otp4920_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg6(), true). compact_otp4920_msg7(suite) -> []; -compact_otp4920_msg7(Config) when list(Config) -> +compact_otp4920_msg7(Config) when is_list(Config) -> d("compact_otp4920_msg7 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1691,7 +1693,7 @@ compact_otp4920_msg8(suite) -> []; -compact_otp4920_msg8(Config) when list(Config) -> +compact_otp4920_msg8(Config) when is_list(Config) -> d("compact_otp4920_msg8 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1699,28 +1701,28 @@ compact_otp4920_msg9(suite) -> []; -compact_otp4920_msg9(Config) when list(Config) -> +compact_otp4920_msg9(Config) when is_list(Config) -> d("compact_otp4920_msg9 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg9(), false). compact_otp4920_msg10(suite) -> []; -compact_otp4920_msg10(Config) when list(Config) -> +compact_otp4920_msg10(Config) when is_list(Config) -> d("compact_otp4920_msg10 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg10(), false). compact_otp4920_msg11(suite) -> []; -compact_otp4920_msg11(Config) when list(Config) -> +compact_otp4920_msg11(Config) when is_list(Config) -> d("compact_otp4920_msg11 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg11(), false). compact_otp4920_msg12(suite) -> []; -compact_otp4920_msg12(Config) when list(Config) -> +compact_otp4920_msg12(Config) when is_list(Config) -> d("compact_otp4920_msg12 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg12(), true). @@ -1728,7 +1730,7 @@ %% Duplicate padding compact_otp4920_msg20(suite) -> []; -compact_otp4920_msg20(Config) when list(Config) -> +compact_otp4920_msg20(Config) when is_list(Config) -> d("compact_otp4920_msg20 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg20(), bad_mid_duplicate_padding). @@ -1736,7 +1738,7 @@ %% Length compact_otp4920_msg21(suite) -> []; -compact_otp4920_msg21(Config) when list(Config) -> +compact_otp4920_msg21(Config) when is_list(Config) -> d("compact_otp4920_msg21 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg21(), bad_mid_ip6addr_length). @@ -1744,7 +1746,7 @@ %% Length compact_otp4920_msg22(suite) -> []; -compact_otp4920_msg22(Config) when list(Config) -> +compact_otp4920_msg22(Config) when is_list(Config) -> d("compact_otp4920_msg22 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg22(), bad_mid_ip6addr_length). @@ -1752,7 +1754,7 @@ %% Length compact_otp4920_msg23(suite) -> []; -compact_otp4920_msg23(Config) when list(Config) -> +compact_otp4920_msg23(Config) when is_list(Config) -> d("compact_otp4920_msg23 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg23(), bad_mid_ip6addr_length). @@ -1760,7 +1762,7 @@ %% Length compact_otp4920_msg24(suite) -> []; -compact_otp4920_msg24(Config) when list(Config) -> +compact_otp4920_msg24(Config) when is_list(Config) -> d("compact_otp4920_msg24 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg24(), bad_mid_ip6addr_length). @@ -1768,7 +1770,7 @@ %% Length compact_otp4920_msg25(suite) -> []; -compact_otp4920_msg25(Config) when list(Config) -> +compact_otp4920_msg25(Config) when is_list(Config) -> d("compact_otp4920_msg25 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg25(), bad_mid_ip6addr_length). @@ -1911,42 +1913,42 @@ compact_otp5186_msg01(suite) -> []; -compact_otp5186_msg01(Config) when list(Config) -> +compact_otp5186_msg01(Config) when is_list(Config) -> d("compact_otp5186_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_1(compact_otp5186_msg01(), error, ignore). compact_otp5186_msg02(suite) -> []; -compact_otp5186_msg02(Config) when list(Config) -> +compact_otp5186_msg02(Config) when is_list(Config) -> d("compact_otp5186_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_1(compact_otp5186_msg02(), ok, ok). compact_otp5186_msg03(suite) -> []; -compact_otp5186_msg03(Config) when list(Config) -> +compact_otp5186_msg03(Config) when is_list(Config) -> d("compact_otp5186_msg03 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg03(), ok, ok). compact_otp5186_msg04(suite) -> []; -compact_otp5186_msg04(Config) when list(Config) -> +compact_otp5186_msg04(Config) when is_list(Config) -> d("compact_otp5186_msg04 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg04(), ok, ok). compact_otp5186_msg05(suite) -> []; -compact_otp5186_msg05(Config) when list(Config) -> +compact_otp5186_msg05(Config) when is_list(Config) -> d("compact_otp5186_msg05 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg05(), ok, ok). compact_otp5186_msg06(suite) -> []; -compact_otp5186_msg06(Config) when list(Config) -> +compact_otp5186_msg06(Config) when is_list(Config) -> d("compact_otp5186_msg06 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg06(), ok, ok). @@ -2418,7 +2420,7 @@ compact_otp5793_msg01(suite) -> []; -compact_otp5793_msg01(Config) when list(Config) -> +compact_otp5793_msg01(Config) when is_list(Config) -> d("compact_otp5793_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5793(ok, pretty_otp5793_msg1()). @@ -2431,21 +2433,21 @@ compact_otp5993_msg01(suite) -> []; -compact_otp5993_msg01(Config) when list(Config) -> +compact_otp5993_msg01(Config) when is_list(Config) -> d("compact_otp5993_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5993(ok, compact_otp5993_msg01()). compact_otp5993_msg02(suite) -> []; -compact_otp5993_msg02(Config) when list(Config) -> +compact_otp5993_msg02(Config) when is_list(Config) -> d("compact_otp5993_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5993(ok, compact_otp5993_msg02()). compact_otp5993_msg03(suite) -> []; -compact_otp5993_msg03(Config) when list(Config) -> +compact_otp5993_msg03(Config) when is_list(Config) -> d("compact_otp5993_msg03 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5993(ok, compact_otp5993_msg03()). @@ -2510,7 +2512,7 @@ compact_otp6017_msg01(suite) -> []; -compact_otp6017_msg01(Config) when list(Config) -> +compact_otp6017_msg01(Config) when is_list(Config) -> d("compact_otp6017_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(0), @@ -2518,7 +2520,7 @@ compact_otp6017_msg02(suite) -> []; -compact_otp6017_msg02(Config) when list(Config) -> +compact_otp6017_msg02(Config) when is_list(Config) -> d("compact_otp6017_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(16#FFFFFFFE), @@ -2526,7 +2528,7 @@ compact_otp6017_msg03(suite) -> []; -compact_otp6017_msg03(Config) when list(Config) -> +compact_otp6017_msg03(Config) when is_list(Config) -> d("compact_otp6017_msg03 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(16#FFFFFFFF), @@ -2567,7 +2569,7 @@ flex_compact_otp7431_msg01(suite) -> []; -flex_compact_otp7431_msg01(Config) when list(Config) -> +flex_compact_otp7431_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg01 -> entry", []), @@ -2576,7 +2578,7 @@ flex_compact_otp7431_msg02(suite) -> []; -flex_compact_otp7431_msg02(Config) when list(Config) -> +flex_compact_otp7431_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg02 -> entry", []), @@ -2585,7 +2587,7 @@ flex_compact_otp7431_msg03(suite) -> []; -flex_compact_otp7431_msg03(Config) when list(Config) -> +flex_compact_otp7431_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg03 -> entry", []), @@ -2594,7 +2596,7 @@ flex_compact_otp7431_msg04(suite) -> []; -flex_compact_otp7431_msg04(Config) when list(Config) -> +flex_compact_otp7431_msg04(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg04 -> entry", []), @@ -2603,7 +2605,7 @@ flex_compact_otp7431_msg05(suite) -> []; -flex_compact_otp7431_msg05(Config) when list(Config) -> +flex_compact_otp7431_msg05(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg05 -> entry", []), @@ -2612,7 +2614,7 @@ flex_compact_otp7431_msg06(suite) -> []; -flex_compact_otp7431_msg06(Config) when list(Config) -> +flex_compact_otp7431_msg06(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg06 -> entry", []), @@ -2621,7 +2623,7 @@ flex_compact_otp7431_msg07(suite) -> []; -flex_compact_otp7431_msg07(Config) when list(Config) -> +flex_compact_otp7431_msg07(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg07 -> entry", []), @@ -2707,12 +2709,12 @@ pretty_otp4632_msg1(suite) -> []; -pretty_otp4632_msg1(Config) when list(Config) -> +pretty_otp4632_msg1(Config) when is_list(Config) -> d("pretty_otp4632_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg1(), case encode_message(megaco_pretty_text_encoder, ?EC, Msg0) of - {ok, BinMsg} when binary(BinMsg) -> + {ok, BinMsg} when is_binary(BinMsg) -> {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, ?EC, BinMsg), ok = chk_MegacoMessage(Msg0, Msg1); @@ -2727,12 +2729,12 @@ pretty_otp4632_msg2(suite) -> []; -pretty_otp4632_msg2(Config) when list(Config) -> +pretty_otp4632_msg2(Config) when is_list(Config) -> d("pretty_otp4632_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg2(), case encode_message(megaco_pretty_text_encoder, ?EC, Msg0) of - {ok, BinMsg} when binary(BinMsg) -> + {ok, BinMsg} when is_binary(BinMsg) -> {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, ?EC, BinMsg), ok = chk_MegacoMessage(Msg0,Msg1); @@ -2748,14 +2750,14 @@ pretty_otp4632_msg3(suite) -> []; -pretty_otp4632_msg3(Config) when list(Config) -> +pretty_otp4632_msg3(Config) when is_list(Config) -> d("pretty_otp4632_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg3(), Bin0 = list_to_binary(Msg0), case decode_message(megaco_pretty_text_encoder, false, ?EC, Bin0) of - {ok, Msg} when record(Msg, 'MegacoMessage') -> + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> {ok, Bin1} = encode_message(megaco_pretty_text_encoder, ?EC, Msg), Msg1 = binary_to_list(Bin1), %% io:format("Msg1:~n~s~n", [Msg1]), @@ -2774,13 +2776,13 @@ pretty_otp4632_msg4(suite) -> []; -pretty_otp4632_msg4(Config) when list(Config) -> +pretty_otp4632_msg4(Config) when is_list(Config) -> d("pretty_otp4632_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg4(), Bin0 = list_to_binary(Msg0), case decode_message(megaco_pretty_text_encoder, false, ?EC, Bin0) of - {ok, Msg} when record(Msg, 'MegacoMessage') -> + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> {ok, Bin1} = encode_message(megaco_pretty_text_encoder, ?EC, Msg), Msg1 = binary_to_list(Bin1), %% io:format("Msg1:~n~s~n", [Msg1]), @@ -2812,12 +2814,12 @@ pretty_otp4710_msg1(suite) -> []; -pretty_otp4710_msg1(Config) when list(Config) -> +pretty_otp4710_msg1(Config) when is_list(Config) -> d("pretty_otp4710_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4710_msg1(), case encode_message(megaco_pretty_text_encoder, ?EC, Msg0) of - {ok, Bin} when binary(Bin) -> + {ok, Bin} when is_binary(Bin) -> {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, ?EC, Bin), ok = chk_MegacoMessage(Msg0,Msg1); @@ -2833,13 +2835,13 @@ pretty_otp4710_msg2(suite) -> []; -pretty_otp4710_msg2(Config) when list(Config) -> +pretty_otp4710_msg2(Config) when is_list(Config) -> d("pretty_otp4710_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4710_msg2(), Bin0 = list_to_binary(Msg0), case decode_message(megaco_pretty_text_encoder, false, ?EC, Bin0) of - {ok, Msg} when record(Msg, 'MegacoMessage') -> + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> {ok, Bin1} = encode_message(megaco_pretty_text_encoder, ?EC, Msg), Msg1 = binary_to_list(Bin1), %% io:format("Msg1:~n~s~n", [Msg1]), @@ -2877,7 +2879,7 @@ pretty_otp4945_msg1(suite) -> []; -pretty_otp4945_msg1(Config) when list(Config) -> +pretty_otp4945_msg1(Config) when is_list(Config) -> d("pretty_otp4945_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg1(), @@ -2915,7 +2917,7 @@ pretty_otp4945_msg2(suite) -> []; -pretty_otp4945_msg2(Config) when list(Config) -> +pretty_otp4945_msg2(Config) when is_list(Config) -> d("pretty_otp4945_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg2(), @@ -2952,7 +2954,7 @@ pretty_otp4945_msg3(suite) -> []; -pretty_otp4945_msg3(Config) when list(Config) -> +pretty_otp4945_msg3(Config) when is_list(Config) -> d("pretty_otp4945_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg3(), @@ -2990,7 +2992,7 @@ pretty_otp4945_msg4(suite) -> []; -pretty_otp4945_msg4(Config) when list(Config) -> +pretty_otp4945_msg4(Config) when is_list(Config) -> d("pretty_otp4945_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg4(), @@ -3021,7 +3023,7 @@ pretty_otp4945_msg5(suite) -> []; -pretty_otp4945_msg5(Config) when list(Config) -> +pretty_otp4945_msg5(Config) when is_list(Config) -> d("pretty_otp4945_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg5(), @@ -3061,7 +3063,7 @@ pretty_otp4945_msg6(suite) -> []; -pretty_otp4945_msg6(Config) when list(Config) -> +pretty_otp4945_msg6(Config) when is_list(Config) -> d("pretty_otp4945_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg6(), @@ -3101,7 +3103,7 @@ pretty_otp4949_msg1(suite) -> []; -pretty_otp4949_msg1(Config) when list(Config) -> +pretty_otp4949_msg1(Config) when is_list(Config) -> d("pretty_otp4949_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4949_msg1(), @@ -3130,7 +3132,7 @@ pretty_otp4949_msg2(suite) -> []; -pretty_otp4949_msg2(Config) when list(Config) -> +pretty_otp4949_msg2(Config) when is_list(Config) -> d("pretty_otp4949_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4949_msg2(), @@ -3168,7 +3170,7 @@ pretty_otp4949_msg3(suite) -> []; -pretty_otp4949_msg3(Config) when list(Config) -> +pretty_otp4949_msg3(Config) when is_list(Config) -> d("pretty_otp4949_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4949_msg3(), @@ -3206,7 +3208,7 @@ pretty_otp5042_msg1(suite) -> []; -pretty_otp5042_msg1(Config) when list(Config) -> +pretty_otp5042_msg1(Config) when is_list(Config) -> d("pretty_otp5042_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp5042_msg1(), @@ -3241,7 +3243,7 @@ pretty_otp5068_msg1(suite) -> []; -pretty_otp5068_msg1(Config) when list(Config) -> +pretty_otp5068_msg1(Config) when is_list(Config) -> d("pretty_otp5068_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg = pretty_otp5068_msg1(), @@ -3312,56 +3314,56 @@ pretty_otp5085_msg1(suite) -> []; -pretty_otp5085_msg1(Config) when list(Config) -> +pretty_otp5085_msg1(Config) when is_list(Config) -> d("pretty_otp5085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg1()). pretty_otp5085_msg2(suite) -> []; -pretty_otp5085_msg2(Config) when list(Config) -> +pretty_otp5085_msg2(Config) when is_list(Config) -> d("pretty_otp5085_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(error, pretty_otp5085_msg2()). pretty_otp5085_msg3(suite) -> []; -pretty_otp5085_msg3(Config) when list(Config) -> +pretty_otp5085_msg3(Config) when is_list(Config) -> d("pretty_otp5085_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg3()). pretty_otp5085_msg4(suite) -> []; -pretty_otp5085_msg4(Config) when list(Config) -> +pretty_otp5085_msg4(Config) when is_list(Config) -> d("pretty_otp5085_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg4()). pretty_otp5085_msg5(suite) -> []; -pretty_otp5085_msg5(Config) when list(Config) -> +pretty_otp5085_msg5(Config) when is_list(Config) -> d("pretty_otp5085_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg5()). pretty_otp5085_msg6(suite) -> []; -pretty_otp5085_msg6(Config) when list(Config) -> +pretty_otp5085_msg6(Config) when is_list(Config) -> d("pretty_otp5085_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg6()). pretty_otp5085_msg7(suite) -> []; -pretty_otp5085_msg7(Config) when list(Config) -> +pretty_otp5085_msg7(Config) when is_list(Config) -> d("pretty_otp5085_msg7 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg7()). pretty_otp5085_msg8(suite) -> []; -pretty_otp5085_msg8(Config) when list(Config) -> +pretty_otp5085_msg8(Config) when is_list(Config) -> d("pretty_otp5085_msg8 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -3384,7 +3386,7 @@ "~n Expected: ~p" "~n Msg: ~p", [Expected, Msg]), case (catch encode_message(megaco_pretty_text_encoder, [?EC_V3|Conf], Msg)) of - {error, Reason} when Expected == error -> + {error, Reason} when Expected =:= error -> d("pretty_otp5085 -> encode failed as expected" "~n Reason: ~w", [Reason]), ok; @@ -3392,7 +3394,7 @@ e("pretty_otp5085 -> encode failed unexpectedly: " "~n Reason: ~w", [Reason]), exit({unexpected_encode_result, Reason}); - {ok, Bin} when Expected == error -> + {ok, Bin} when Expected =:= error -> e("pretty_otp5085 -> encode succeded unexpectedly: " "~n ~w", [binary_to_list(Bin)]), exit({unexpected_encode_result, binary_to_list(Bin)}); @@ -3650,7 +3652,7 @@ pretty_otp5600_msg1(suite) -> []; -pretty_otp5600_msg1(Config) when list(Config) -> +pretty_otp5600_msg1(Config) when is_list(Config) -> d("pretty_otp5600_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -3659,7 +3661,7 @@ pretty_otp5600_msg2(suite) -> []; -pretty_otp5600_msg2(Config) when list(Config) -> +pretty_otp5600_msg2(Config) when is_list(Config) -> d("pretty_otp5600_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -3674,7 +3676,7 @@ "~n Expected: ~p" "~n Msg: ~p", [Expected, Msg]), case (catch encode_message(megaco_pretty_text_encoder, [?EC_V3|Conf], Msg)) of - {error, Reason} when Expected == error -> + {error, Reason} when Expected =:= error -> d("pretty_otp5600 -> encode failed as expected" "~n Reason: ~w", [Reason]), ok; @@ -3682,7 +3684,7 @@ e("pretty_otp5600 -> encode failed unexpectedly: " "~n Reason: ~w", [Reason]), exit({unexpected_encode_result, Reason}); - {ok, Bin} when Expected == error -> + {ok, Bin} when Expected =:= error -> e("pretty_otp5600 -> encode succeded unexpectedly: " "~n ~w", [binary_to_list(Bin)]), exit({unexpected_encode_result, binary_to_list(Bin)}); @@ -3780,7 +3782,7 @@ pretty_otp5601_msg1(suite) -> []; -pretty_otp5601_msg1(Config) when list(Config) -> +pretty_otp5601_msg1(Config) when is_list(Config) -> d("pretty_otp5601_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -3795,7 +3797,7 @@ "~n Expected: ~p" "~n Msg: ~p", [Expected, Msg]), case (catch encode_message(megaco_pretty_text_encoder, [?EC_V3|Conf], Msg)) of - {error, Reason} when Expected == error -> + {error, Reason} when Expected =:= error -> d("pretty_otp5601 -> encode failed as expected" "~n Reason: ~w", [Reason]), ok; @@ -3803,7 +3805,7 @@ e("pretty_otp5601 -> encode failed unexpectedly: " "~n Reason: ~w", [Reason]), exit({unexpected_encode_result, Reason}); - {ok, Bin} when Expected == error -> + {ok, Bin} when Expected =:= error -> e("pretty_otp5601 -> encode succeded unexpectedly: " "~n ~w", [binary_to_list(Bin)]), exit({unexpected_encode_result, binary_to_list(Bin)}); @@ -3865,7 +3867,7 @@ pretty_otp5793_msg01(suite) -> []; -pretty_otp5793_msg01(Config) when list(Config) -> +pretty_otp5793_msg01(Config) when is_list(Config) -> d("pretty_otp5793_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -4058,25 +4060,25 @@ otp6490(Msg, Codec, Conf, ExpectedEncode, ExpectedDecode) -> case (catch encode_message(Codec, [?EC_V3|Conf], Msg)) of - {error, _Reason} when ExpectedEncode == error -> + {error, _Reason} when ExpectedEncode =:= error -> ok; - {error, Reason} when ExpectedEncode == ok -> + {error, Reason} when ExpectedEncode =:= ok -> exit({unexpected_encode_failure, Reason}); - {ok, Bin} when ExpectedEncode == error -> + {ok, Bin} when ExpectedEncode =:= error -> exit({unexpected_encode_success, Msg, binary_to_list(Bin)}); - {ok, Bin} when ExpectedEncode == ok -> + {ok, Bin} when ExpectedEncode =:= ok -> case decode_message(Codec, false, [?EC_V3|Conf], Bin) of - {ok, Msg} when ExpectedDecode == ok -> + {ok, Msg} when ExpectedDecode =:= ok -> ok; - {ok, Msg} when ExpectedDecode == error -> + {ok, Msg} when ExpectedDecode =:= error -> exit({unexpected_decode_success, Msg}); - {ok, Msg2} when ExpectedDecode == ok -> + {ok, Msg2} when ExpectedDecode =:= ok -> exit({unexpected_decode_result, Msg, Msg2}); - {ok, Msg2} when ExpectedDecode == error -> + {ok, Msg2} when ExpectedDecode =:= error -> exit({unexpected_decode_success, Msg, Msg2}); - {error, _Reason} when ExpectedDecode == error -> + {error, _Reason} when ExpectedDecode =:= error -> ok; - {error, Reason} when ExpectedDecode == ok -> + {error, Reason} when ExpectedDecode =:= ok -> exit({unexpected_decode_failure, Msg, Reason}) end end. @@ -4345,6 +4347,94 @@ ok. +%% -------------------------------------------------------------- +%% + + +pretty_otp8114_msg01(suite) -> + []; +pretty_otp8114_msg01(Config) when is_list(Config) -> + put(severity, trc), + put(dbg, true), + d("pretty_otp8114_msg01 -> entry", []), + ok = otp8114( pretty_otp8114_msg01(), megaco_pretty_text_encoder, ?EC), + erase(dbg), + erase(severity), + ok. + +pretty_otp8114_msg01() -> + "MEGACO/" ?VERSION_STR " [10.10.10.10]:1234\nTransaction = 1 {\n\tContext =\n1 {\n\t\tModify = ip/1/1/1 {\n\t\t\tMedia {\n\t\t\t\tStream = 1\n{\n\t\t\t\t\t\tLocalControl {\n\t\t\t\t\t\tMode =\nSendReceive\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tEvents = 1\n{\n\t\t\t\tadid/ipstop\n{\n\t\t\t\t\tdt=30,\n\t\t\t\t\tdir=\"BOTH\"\n\t\t\t\t},\n\t\t\t\tg/cause\n\n\t\t\t}\n\t\t}\n\t}\n}". + + +otp8114(InitialMessage, Codec, Conf) -> + Decode = fun(M) -> Codec:decode_message(Conf, M) end, + Encode = fun(B) -> Codec:encode_message(Conf, B) end, + InitialData = InitialMessage, + Instructions = + [ + %% List to binary + megaco_codec_test_lib:expect_instruction( + "Convert (initial) message to a binary", + fun(Msg) when is_list(Msg) -> + %% io:format("~s~n", [Msg]), + {ok, list_to_binary(Msg)}; + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Bin}, _Msg) when is_binary(Bin) -> + {ok, Bin}; + (Bad, _Msg) -> + {error, {failed_to_binary, Bad}} + end), + + %% Initial decode + megaco_codec_test_lib:expect_instruction( + "Decode (initial) message", + fun(Bin) when is_binary(Bin) -> + (catch Decode(Bin)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Msg}, _Bin) when is_record(Msg, 'MegacoMessage') -> + %% io:format("~p~n", [Msg]), + {ok, Msg}; + (Bad, _) -> + {error, {initial_decode_failed, Bad}} + end), + + %% Encode + megaco_codec_test_lib:expect_instruction( + "Encode message", + fun(Msg) when is_record(Msg, 'MegacoMessage') -> + (catch Encode(Msg)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Bin}, _Msg) when is_binary(Bin) -> + %% io:format("~s~n", [binary_to_list(Bin)]), + {ok, Bin}; + (Bad, _) -> + {error, {encode_failed, Bad}} + end), + + %% Decode + megaco_codec_test_lib:expect_instruction( + "(final) Decode message", + fun(Bin) when is_binary(Bin) -> + (catch Decode(Bin)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Msg}, _Bin) when is_record(Msg, 'MegacoMessage') -> + %% io:format("~p~n", [Msg]), + {ok, Msg}; + (Bad, _) -> + {error, {decode_failed, Bad}} + end) + ], + megaco_codec_test_lib:expect_exec(Instructions, InitialData). + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% expect_codec(Expect, Codec, Msg, Conf) -> @@ -4352,7 +4442,7 @@ "~n Expect: ~p" "~n Msg: ~p", [Expect, Msg]), case (catch encode_message(Codec, [?EC_V3|Conf], Msg)) of - {error, _Reason} when Expect == error -> + {error, _Reason} when Expect =:= error -> d("expect_codec -> encode failed as expected" "~n _Reason: ~w", [_Reason]), ok; @@ -4360,7 +4450,7 @@ e("expect_codec -> encode failed unexpectedly: " "~n Reason: ~w", [Reason]), exit({unexpected_encode_result, Reason}); - {ok, Bin} when Expect == error -> + {ok, Bin} when Expect =:= error -> e("expect_codec -> encode succeded unexpectedly: " "~n ~w", [binary_to_list(Bin)]), exit({unexpected_encode_result, binary_to_list(Bin)}); @@ -4493,9 +4583,9 @@ msgs3_name(N) -> list_to_atom("rfc3525_" ++ atom_to_list(N)). -rfc3525_decode(M) when list(M) -> +rfc3525_decode(M) when is_list(M) -> rfc3525_decode(list_to_binary(M)); -rfc3525_decode(M) when binary(M) -> +rfc3525_decode(M) when is_binary(M) -> case (catch decode_message(megaco_pretty_text_encoder, false, ?EC, M)) of {ok, Msg} -> Msg; @@ -4705,7 +4795,7 @@ Actions = [Action], msg_reply(Mid, TransId, Actions). -msg_ack(Mid, [Range|_] = Ranges) when tuple(Range) -> +msg_ack(Mid, [Range|_] = Ranges) when is_tuple(Range) -> msg_ack(Mid, [Ranges]); msg_ack(Mid, Ranges) -> @@ -4806,7 +4896,7 @@ msg4() -> msg4(?MG1_MID_NO_PORT, "901 mg col boot"). -msg4(Mid, Reason) when list(Reason) -> +msg4(Mid, Reason) when is_list(Reason) -> Address = {portNumber, ?DEFAULT_PORT}, Profile = cre_SvcChProf("resgw",1), Parm = cre_SvcChParm(restart,Address,[Reason],Profile), @@ -5310,7 +5400,7 @@ msg40() -> msg40(?MG1_MID_NO_PORT, "901 mg col boot"). -msg40(Mid, Reason) when list(Reason) -> +msg40(Mid, Reason) when is_list(Reason) -> Address = {portNumber, ?DEFAULT_PORT}, Profile = cre_SvcChProf("resgw",1), Parm = cre_SvcChParm(restart,Address,[Reason],Profile), @@ -6775,7 +6865,7 @@ %% io:format("d", []), io:format("decoded:~n~p~n", [M2]), case (catch Codec:encode_message(Config, Ver, M2)) of - {ok, Bin2} when binary(Bin2) -> + {ok, Bin2} when is_binary(Bin2) -> %% io:format("e~n", []), io:format("encode: ~n~s~n", [erlang:binary_to_list(Bin2)]), {N,ok}; @@ -6942,7 +7032,7 @@ ?MSG_LIB:cre_IndAudTerminationStateDescriptor(PP, EBC, SS). cre_IndAudEvsDesc(RID, PN) - when integer(RID) -> + when is_integer(RID) -> ?MSG_LIB:cre_IndAudEventsDescriptor(RID, PN). cre_IndAudEvBufDesc(EN, SID) -> @@ -7078,7 +7168,7 @@ ?MSG_LIB:cre_DigitMapValue(Start, Short, Long, Body). %% Media related -cre_MediaDesc(SD) when record(SD, 'StreamDescriptor') -> +cre_MediaDesc(SD) when is_record(SD, 'StreamDescriptor') -> cre_MediaDesc([SD]); cre_MediaDesc(SDs) -> ?MSG_LIB:cre_MediaDescriptor(SDs). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_prev3b_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_prev3b_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_prev3b_test.erl 2009-03-12 12:32:26.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_prev3b_test.erl 2009-09-18 13:47:53.000000000 +0100 @@ -189,6 +189,7 @@ pretty_otp7671_msg03/1, pretty_otp7671_msg04/1, pretty_otp7671_msg05/1, + pretty_otp8114_msg01/1, flex_pretty_tickets/1, flex_pretty_otp5042_msg1/1, @@ -274,7 +275,7 @@ case (catch apply(?MODULE,Case,[suite])) of [] -> expand(Cases, [Case|Acc]); - C when list(C) -> + C when is_list(C) -> expand(Cases, [expand(C, [])|Acc]); _ -> expand(Cases, [Case|Acc]) @@ -557,7 +558,8 @@ pretty_otp7671_msg02, pretty_otp7671_msg03, pretty_otp7671_msg04, - pretty_otp7671_msg05 + pretty_otp7671_msg05, + pretty_otp8114_msg01 ]. flex_pretty_tickets(suite) -> @@ -598,7 +600,7 @@ pretty_test_msgs(suite) -> []; -pretty_test_msgs(Config) when list(Config) -> +pretty_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(text) ++ msgs2(text) ++ msgs3(text) ++ msgs4(text) ++ msgs5(text) ++ msgs6(text), @@ -622,7 +624,7 @@ flex_pretty_test_msgs(suite) -> []; -flex_pretty_test_msgs(Config) when list(Config) -> +flex_pretty_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(text) ++ msgs2(text) ++ msgs3(text) ++ msgs4(text) ++ msgs5(text) ++ msgs6(text), @@ -633,7 +635,7 @@ flex_pretty_otp5042_msg1(suite) -> []; -flex_pretty_otp5042_msg1(Config) when list(Config) -> +flex_pretty_otp5042_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5042_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp5042_msg1(), @@ -658,7 +660,7 @@ flex_pretty_otp5085_msg1(suite) -> []; -flex_pretty_otp5085_msg1(Config) when list(Config) -> +flex_pretty_otp5085_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -666,7 +668,7 @@ flex_pretty_otp5085_msg2(suite) -> []; -flex_pretty_otp5085_msg2(Config) when list(Config) -> +flex_pretty_otp5085_msg2(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -674,7 +676,7 @@ flex_pretty_otp5085_msg3(suite) -> []; -flex_pretty_otp5085_msg3(Config) when list(Config) -> +flex_pretty_otp5085_msg3(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -682,7 +684,7 @@ flex_pretty_otp5085_msg4(suite) -> []; -flex_pretty_otp5085_msg4(Config) when list(Config) -> +flex_pretty_otp5085_msg4(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -690,7 +692,7 @@ flex_pretty_otp5085_msg5(suite) -> []; -flex_pretty_otp5085_msg5(Config) when list(Config) -> +flex_pretty_otp5085_msg5(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -698,7 +700,7 @@ flex_pretty_otp5085_msg6(suite) -> []; -flex_pretty_otp5085_msg6(Config) when list(Config) -> +flex_pretty_otp5085_msg6(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -706,7 +708,7 @@ flex_pretty_otp5085_msg7(suite) -> []; -flex_pretty_otp5085_msg7(Config) when list(Config) -> +flex_pretty_otp5085_msg7(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg7 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -714,7 +716,7 @@ flex_pretty_otp5085_msg8(suite) -> []; -flex_pretty_otp5085_msg8(Config) when list(Config) -> +flex_pretty_otp5085_msg8(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg8 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -722,7 +724,7 @@ flex_pretty_otp5600_msg1(suite) -> []; -flex_pretty_otp5600_msg1(Config) when list(Config) -> +flex_pretty_otp5600_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5600_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -730,7 +732,7 @@ flex_pretty_otp5600_msg2(suite) -> []; -flex_pretty_otp5600_msg2(Config) when list(Config) -> +flex_pretty_otp5600_msg2(Config) when is_list(Config) -> d("flex_pretty_otp5600_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -738,7 +740,7 @@ flex_pretty_otp5601_msg1(suite) -> []; -flex_pretty_otp5601_msg1(Config) when list(Config) -> +flex_pretty_otp5601_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5601_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -747,7 +749,7 @@ flex_pretty_otp5793_msg01(suite) -> []; -flex_pretty_otp5793_msg01(Config) when list(Config) -> +flex_pretty_otp5793_msg01(Config) when is_list(Config) -> d("flex_pretty_otp5793_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -756,7 +758,7 @@ flex_pretty_otp5803_msg01(suite) -> []; -flex_pretty_otp5803_msg01(Config) when list(Config) -> +flex_pretty_otp5803_msg01(Config) when is_list(Config) -> d("flex_pretty_otp5803_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -766,7 +768,7 @@ flex_pretty_otp5803_msg02(suite) -> []; -flex_pretty_otp5803_msg02(Config) when list(Config) -> +flex_pretty_otp5803_msg02(Config) when is_list(Config) -> d("flex_pretty_otp5803_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -777,7 +779,7 @@ flex_pretty_otp5805_msg01(suite) -> []; -flex_pretty_otp5805_msg01(Config) when list(Config) -> +flex_pretty_otp5805_msg01(Config) when is_list(Config) -> d("flex_pretty_otp5805_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -788,7 +790,7 @@ flex_pretty_otp5836_msg01(suite) -> []; -flex_pretty_otp5836_msg01(Config) when list(Config) -> +flex_pretty_otp5836_msg01(Config) when is_list(Config) -> d("flex_pretty_otp5836_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -799,7 +801,7 @@ flex_pretty_otp7431_msg01(suite) -> []; -flex_pretty_otp7431_msg01(Config) when list(Config) -> +flex_pretty_otp7431_msg01(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -807,7 +809,7 @@ flex_pretty_otp7431_msg02(suite) -> []; -flex_pretty_otp7431_msg02(Config) when list(Config) -> +flex_pretty_otp7431_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp7431_msg02 -> entry", []), @@ -817,7 +819,7 @@ flex_pretty_otp7431_msg03(suite) -> []; -flex_pretty_otp7431_msg03(Config) when list(Config) -> +flex_pretty_otp7431_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp7431_msg03 -> entry", []), @@ -827,7 +829,7 @@ flex_pretty_otp7431_msg04(suite) -> []; -flex_pretty_otp7431_msg04(Config) when list(Config) -> +flex_pretty_otp7431_msg04(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg04 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -835,7 +837,7 @@ flex_pretty_otp7431_msg05(suite) -> []; -flex_pretty_otp7431_msg05(Config) when list(Config) -> +flex_pretty_otp7431_msg05(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg05 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -843,7 +845,7 @@ flex_pretty_otp7431_msg06(suite) -> []; -flex_pretty_otp7431_msg06(Config) when list(Config) -> +flex_pretty_otp7431_msg06(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg06 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -851,7 +853,7 @@ flex_pretty_otp7431_msg07(suite) -> []; -flex_pretty_otp7431_msg07(Config) when list(Config) -> +flex_pretty_otp7431_msg07(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg07 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -1015,7 +1017,7 @@ compact_test_msgs(suite) -> []; -compact_test_msgs(Config) when list(Config) -> +compact_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(text) ++ msgs2(text) ++ msgs3(text) ++ msgs4(text) ++ msgs5(text) ++ msgs6(text), @@ -1034,7 +1036,7 @@ flex_compact_test_msgs(suite) -> []; -flex_compact_test_msgs(Config) when list(Config) -> +flex_compact_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(text) ++ msgs2(text) ++ msgs3(text) ++ msgs4(text) ++ msgs5(text) ++ msgs6(text), @@ -1045,14 +1047,14 @@ flex_compact_dm_timers1(suite) -> []; -flex_compact_dm_timers1(Config) when list(Config) -> +flex_compact_dm_timers1(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("1", "2", "3"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers1 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1064,14 +1066,14 @@ flex_compact_dm_timers2(suite) -> []; -flex_compact_dm_timers2(Config) when list(Config) -> +flex_compact_dm_timers2(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("02", "03", "04"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers2 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1083,14 +1085,14 @@ flex_compact_dm_timers3(suite) -> []; -flex_compact_dm_timers3(Config) when list(Config) -> +flex_compact_dm_timers3(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("1", "02", "31"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers3 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1102,14 +1104,14 @@ flex_compact_dm_timers4(suite) -> []; -flex_compact_dm_timers4(Config) when list(Config) -> +flex_compact_dm_timers4(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("10", "21", "99"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers4 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1121,14 +1123,14 @@ flex_compact_dm_timers5(suite) -> []; -flex_compact_dm_timers5(Config) when list(Config) -> +flex_compact_dm_timers5(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("99", "23", "11"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers5 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1140,14 +1142,14 @@ flex_compact_dm_timers6(suite) -> []; -flex_compact_dm_timers6(Config) when list(Config) -> +flex_compact_dm_timers6(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("77", "09", "1"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers6 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1159,14 +1161,14 @@ flex_compact_dm_timers7(suite) -> []; -flex_compact_dm_timers7(Config) when list(Config) -> +flex_compact_dm_timers7(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("77", "09", "1", "99"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers7 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1178,14 +1180,14 @@ flex_compact_dm_timers8(suite) -> []; -flex_compact_dm_timers8(Config) when list(Config) -> +flex_compact_dm_timers8(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("01", "09", "01", "02"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers8 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1219,13 +1221,13 @@ exit({invalid_timer_values, {TMRs, TMRs1}}) end. -get_dm_timers({transactions, T}) when list(T) -> +get_dm_timers({transactions, T}) when is_list(T) -> get_dm_timers1(T); get_dm_timers(Other) -> {error, {invalid_transactions, Other}}. get_dm_timers1([{transactionRequest,T}|Ts]) - when record(T,'TransactionRequest') -> + when is_record(T,'TransactionRequest') -> case get_dm_timers2(T) of {ok, Timers} -> Timers; @@ -1238,11 +1240,11 @@ {error, {no_timers, 'TransactionRequest'}}. -get_dm_timers2(#'TransactionRequest'{actions = Actions}) when list(Actions) -> +get_dm_timers2(#'TransactionRequest'{actions = Actions}) when is_list(Actions) -> get_dm_timers3(Actions). -get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when list(Cmds) -> +get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when is_list(Cmds) -> case get_dm_timers4(Cmds) of {ok, Timers} -> {ok, Timers}; @@ -1298,7 +1300,7 @@ bin_test_msgs(suite) -> []; -bin_test_msgs(Config) when list(Config) -> +bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(binary) ++ msgs4(binary) ++ msgs5(binary) ++ msgs6(binary), %% Msgs = msgs5(binary), @@ -1310,7 +1312,7 @@ ber_test_msgs(suite) -> []; -ber_test_msgs(Config) when list(Config) -> +ber_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(binary) ++ msgs4(binary) ++ msgs5(binary) ++ msgs6(binary), %% Msgs = msgs6(binary), @@ -1322,7 +1324,7 @@ ber_bin_test_msgs(suite) -> []; -ber_bin_test_msgs(Config) when list(Config) -> +ber_bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(binary) ++ msgs4(binary) ++ msgs5(binary) ++ msgs6(binary), DynamicDecode = true, @@ -1333,7 +1335,7 @@ per_test_msgs(suite) -> []; -per_test_msgs(Config) when list(Config) -> +per_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(binary) ++ msgs4(binary) ++ msgs5(binary) ++ msgs6(binary), DynamicDecode = false, @@ -1344,7 +1346,7 @@ per_bin_test_msgs(suite) -> []; -per_bin_test_msgs(Config) when list(Config) -> +per_bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(binary) ++ msgs4(binary) ++ msgs5(binary) ++ msgs6(binary), DynamicDecode = false, @@ -1355,7 +1357,7 @@ erl_dist_m_test_msgs(suite) -> []; -erl_dist_m_test_msgs(Config) when list(Config) -> +erl_dist_m_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1(erlang) ++ msgs2(erlang) ++ @@ -1378,7 +1380,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg1(suite) -> []; -compact_otp4011_msg1(Config) when list(Config) -> +compact_otp4011_msg1(Config) when is_list(Config) -> % put(severity,trc), % put(dbg,true), d("compact_otp4011_msg1 -> entry", []), @@ -1394,7 +1396,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg2(suite) -> []; -compact_otp4011_msg2(Config) when list(Config) -> +compact_otp4011_msg2(Config) when is_list(Config) -> d("compact_otp4011_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), M = "!/" ?VERSION_STR " ML T=233350{C=${A=stedevice/01{M{O{MO=SO,RV=OFF,RG=OFF,tdmc/ec=OFF,MO=SR}}}}}", @@ -1407,7 +1409,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg3(suite) -> []; -compact_otp4011_msg3(Config) when list(Config) -> +compact_otp4011_msg3(Config) when is_list(Config) -> d("compact_otp4011_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), M = "!/" ?VERSION_STR " ML T=233350{C=${A=stedevice/01{M{O{MO=SR,RV=OFF,RG=OFF,tdmc/ec=OFF,MO=SO}}}}}", @@ -1423,7 +1425,7 @@ case decode_message(megaco_compact_text_encoder, false, ?EC, Bin) of {ok, _} -> exit({decoded_erroneous_message,M}); - {error, Error} when list(Error) -> % Expected result + {error, Error} when is_list(Error) -> % Expected result d("compact_otp4011 -> expected error result (so far)", []), case lists:keysearch(reason,1,Error) of {value, {reason,Reason}} -> @@ -1432,10 +1434,10 @@ case Reason of {0, megaco_text_parser_prev3b, {do_merge_control_streamParms, [A,B]}} - when list(A), record(B, 'LocalControlDescriptor') -> + when is_list(A) andalso is_record(B, 'LocalControlDescriptor') -> case lists:keysearch(mode,1,A) of {value, {mode, _Mode}} - when B#'LocalControlDescriptor'.streamMode /= asn1_NOVALUE -> + when B#'LocalControlDescriptor'.streamMode =/= asn1_NOVALUE -> d("compact_otp4011 -> expected error",[]), ok; Other -> @@ -1460,7 +1462,7 @@ %% MEGCAO instead of the correct MEGACO. compact_otp4013_msg1(suite) -> []; -compact_otp4013_msg1(Config) when list(Config) -> +compact_otp4013_msg1(Config) when is_list(Config) -> d("compact_otp4013_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), M = "MEGCAO/3 MG1 T=12345678{C=-{SC=root{SV{MT=RS,RE=901}}}}", @@ -1485,7 +1487,7 @@ %% compact_otp4085_msg1(suite) -> []; -compact_otp4085_msg1(Config) when list(Config) -> +compact_otp4085_msg1(Config) when is_list(Config) -> d("compact_otp4085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), M = compact_otp4085_erroneous_msg(), @@ -1493,7 +1495,7 @@ case decode_message(megaco_compact_text_encoder, false, ?EC, Bin) of {ok, M} -> exit({decoded_erroneous_message,M}); - {error, Error} when list(Error) -> % Expected result + {error, Error} when is_list(Error) -> % Expected result t("compact_otp4085_msg1 -> decode failed", []), case lists:keysearch(reason, 1, Error) of {value, {reason,{999999, Module, Crap}}} -> @@ -1522,7 +1524,7 @@ %% compact_otp4085_msg1 is actually ok when you add '}' at the end. compact_otp4085_msg2(suite) -> []; -compact_otp4085_msg2(Config) when list(Config) -> +compact_otp4085_msg2(Config) when is_list(Config) -> d("compact_otp4085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), M1 = compact_otp4085_erroneous_msg() ++ "}", @@ -1555,14 +1557,14 @@ %% compact_otp4280_msg1(suite) -> []; -compact_otp4280_msg1(Config) when list(Config) -> +compact_otp4280_msg1(Config) when is_list(Config) -> d("compact_otp4280_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Bin = list_to_binary(compact_otp4280_msg()), case decode_message(megaco_compact_text_encoder, false, ?EC, Bin) of {ok, _Msg} -> ok; - {error, Error} when list(Error) -> + {error, Error} when is_list(Error) -> t("compact_otp4280_msg1 -> decode failed", []), case lists:keysearch(reason, 1, Error) of {value, {reason,{Line, Module, Reason} = R}} -> @@ -1592,7 +1594,7 @@ %% This ticket is about comments in a message compact_otp4299_msg1(suite) -> []; -compact_otp4299_msg1(Config) when list(Config) -> +compact_otp4299_msg1(Config) when is_list(Config) -> d("compact_otp4299_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Bin = list_to_binary(compact_otp4299_msg()), @@ -1611,7 +1613,7 @@ %% Same message, but this time decoded using the flex scanner compact_otp4299_msg2(suite) -> []; -compact_otp4299_msg2(Config) when list(Config) -> +compact_otp4299_msg2(Config) when is_list(Config) -> d("compact_otp4299_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), @@ -1677,7 +1679,7 @@ %% compact_otp4359_msg1(suite) -> []; -compact_otp4359_msg1(Config) when list(Config) -> +compact_otp4359_msg1(Config) when is_list(Config) -> d("compact_otp4359_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Bin = list_to_binary(compact_otp4359_msg()), @@ -1706,7 +1708,7 @@ %% compact_otp4920_msg0(suite) -> []; -compact_otp4920_msg0(Config) when list(Config) -> +compact_otp4920_msg0(Config) when is_list(Config) -> d("compact_otp4920_msg0 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1714,7 +1716,7 @@ compact_otp4920_msg1(suite) -> []; -compact_otp4920_msg1(Config) when list(Config) -> +compact_otp4920_msg1(Config) when is_list(Config) -> d("compact_otp4920_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1722,42 +1724,42 @@ compact_otp4920_msg2(suite) -> []; -compact_otp4920_msg2(Config) when list(Config) -> +compact_otp4920_msg2(Config) when is_list(Config) -> d("compact_otp4920_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg2(), false). compact_otp4920_msg3(suite) -> []; -compact_otp4920_msg3(Config) when list(Config) -> +compact_otp4920_msg3(Config) when is_list(Config) -> d("compact_otp4920_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg3(), true). compact_otp4920_msg4(suite) -> []; -compact_otp4920_msg4(Config) when list(Config) -> +compact_otp4920_msg4(Config) when is_list(Config) -> d("compact_otp4920_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg4(), true). compact_otp4920_msg5(suite) -> []; -compact_otp4920_msg5(Config) when list(Config) -> +compact_otp4920_msg5(Config) when is_list(Config) -> d("compact_otp4920_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg5(), true). compact_otp4920_msg6(suite) -> []; -compact_otp4920_msg6(Config) when list(Config) -> +compact_otp4920_msg6(Config) when is_list(Config) -> d("compact_otp4920_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg6(), true). compact_otp4920_msg7(suite) -> []; -compact_otp4920_msg7(Config) when list(Config) -> +compact_otp4920_msg7(Config) when is_list(Config) -> d("compact_otp4920_msg7 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1765,7 +1767,7 @@ compact_otp4920_msg8(suite) -> []; -compact_otp4920_msg8(Config) when list(Config) -> +compact_otp4920_msg8(Config) when is_list(Config) -> d("compact_otp4920_msg8 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1773,28 +1775,28 @@ compact_otp4920_msg9(suite) -> []; -compact_otp4920_msg9(Config) when list(Config) -> +compact_otp4920_msg9(Config) when is_list(Config) -> d("compact_otp4920_msg9 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg9(), false). compact_otp4920_msg10(suite) -> []; -compact_otp4920_msg10(Config) when list(Config) -> +compact_otp4920_msg10(Config) when is_list(Config) -> d("compact_otp4920_msg10 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg10(), false). compact_otp4920_msg11(suite) -> []; -compact_otp4920_msg11(Config) when list(Config) -> +compact_otp4920_msg11(Config) when is_list(Config) -> d("compact_otp4920_msg11 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg11(), false). compact_otp4920_msg12(suite) -> []; -compact_otp4920_msg12(Config) when list(Config) -> +compact_otp4920_msg12(Config) when is_list(Config) -> d("compact_otp4920_msg12 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg12(), true). @@ -1802,7 +1804,7 @@ %% Duplicate padding compact_otp4920_msg20(suite) -> []; -compact_otp4920_msg20(Config) when list(Config) -> +compact_otp4920_msg20(Config) when is_list(Config) -> d("compact_otp4920_msg20 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg20(), bad_mid_duplicate_padding). @@ -1810,7 +1812,7 @@ %% Length compact_otp4920_msg21(suite) -> []; -compact_otp4920_msg21(Config) when list(Config) -> +compact_otp4920_msg21(Config) when is_list(Config) -> d("compact_otp4920_msg21 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg21(), bad_mid_ip6addr_length). @@ -1818,7 +1820,7 @@ %% Length compact_otp4920_msg22(suite) -> []; -compact_otp4920_msg22(Config) when list(Config) -> +compact_otp4920_msg22(Config) when is_list(Config) -> d("compact_otp4920_msg22 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg22(), bad_mid_ip6addr_length). @@ -1826,7 +1828,7 @@ %% Length compact_otp4920_msg23(suite) -> []; -compact_otp4920_msg23(Config) when list(Config) -> +compact_otp4920_msg23(Config) when is_list(Config) -> d("compact_otp4920_msg23 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg23(), bad_mid_ip6addr_length). @@ -1834,7 +1836,7 @@ %% Length compact_otp4920_msg24(suite) -> []; -compact_otp4920_msg24(Config) when list(Config) -> +compact_otp4920_msg24(Config) when is_list(Config) -> d("compact_otp4920_msg24 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg24(), bad_mid_ip6addr_length). @@ -1842,7 +1844,7 @@ %% Length compact_otp4920_msg25(suite) -> []; -compact_otp4920_msg25(Config) when list(Config) -> +compact_otp4920_msg25(Config) when is_list(Config) -> d("compact_otp4920_msg25 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg25(), bad_mid_ip6addr_length). @@ -1856,7 +1858,7 @@ {ok, Bin1} -> io:format(", encoded - equal:", []), ok; - {ok, Bin2} when CheckEqual == true -> + {ok, Bin2} when CheckEqual =:= true -> M2 = binary_to_list(Bin2), io:format(", encoded - not equal:", []), exit({messages_not_equal, M1, M2}); @@ -1985,42 +1987,42 @@ compact_otp5186_msg01(suite) -> []; -compact_otp5186_msg01(Config) when list(Config) -> +compact_otp5186_msg01(Config) when is_list(Config) -> d("compact_otp5186_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_1(compact_otp5186_msg01(), error, ignore). compact_otp5186_msg02(suite) -> []; -compact_otp5186_msg02(Config) when list(Config) -> +compact_otp5186_msg02(Config) when is_list(Config) -> d("compact_otp5186_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_1(compact_otp5186_msg02(), ok, ok). compact_otp5186_msg03(suite) -> []; -compact_otp5186_msg03(Config) when list(Config) -> +compact_otp5186_msg03(Config) when is_list(Config) -> d("compact_otp5186_msg03 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg03(), ok, ok). compact_otp5186_msg04(suite) -> []; -compact_otp5186_msg04(Config) when list(Config) -> +compact_otp5186_msg04(Config) when is_list(Config) -> d("compact_otp5186_msg04 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg04(), ok, ok). compact_otp5186_msg05(suite) -> []; -compact_otp5186_msg05(Config) when list(Config) -> +compact_otp5186_msg05(Config) when is_list(Config) -> d("compact_otp5186_msg05 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg05(), ok, ok). compact_otp5186_msg06(suite) -> []; -compact_otp5186_msg06(Config) when list(Config) -> +compact_otp5186_msg06(Config) when is_list(Config) -> d("compact_otp5186_msg06 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg06(), ok, ok). @@ -2028,44 +2030,44 @@ compact_otp5186_msg_1(M1, DecodeExpect, EncodeExpect) -> Bin1 = list_to_binary(M1), case compact_decode_message(false, ?EC, Bin1) of - {ok, Msg} when DecodeExpect == ok -> + {ok, Msg} when DecodeExpect =:= ok -> io:format(" decoded", []), case compact_encode_message(?EC, Msg) of - {ok, Bin1} when EncodeExpect == ok -> + {ok, Bin1} when EncodeExpect =:= ok -> io:format(", encoded - equal:", []), ok; - {ok, Bin2} when EncodeExpect == ok -> + {ok, Bin2} when EncodeExpect =:= ok -> M2 = binary_to_list(Bin2), io:format(", encoded - not equal:", []), exit({messages_not_equal, Msg, M1, M2}); - {ok, Bin3} when EncodeExpect == error -> + {ok, Bin3} when EncodeExpect =:= error -> M3 = binary_to_list(Bin3), io:format(", unexpected encode:", []), exit({unexpected_encode_success, Msg, M1, M3}); - _Else when EncodeExpect == error -> + _Else when EncodeExpect =:= error -> io:format(", encode failed ", []), ok end; - {ok, Msg} when DecodeExpect == error -> + {ok, Msg} when DecodeExpect =:= error -> io:format(" decoded", []), exit({unexpected_decode_success, Msg}); - _Else when DecodeExpect == error -> + _Else when DecodeExpect =:= error -> io:format(" decode failed ", []), ok; - Else when DecodeExpect == ok -> + Else when DecodeExpect =:= ok -> io:format(" decode failed ", []), exit({unexpected_decode_result, Else}) end. compact_otp5186_msg_2(Msg1, EncodeExpect, DecodeExpect) -> case encode_message(megaco_compact_text_encoder, ?EC, Msg1) of - {ok, Bin} when EncodeExpect == ok -> + {ok, Bin} when EncodeExpect =:= ok -> io:format(" encoded", []), case decode_message(megaco_compact_text_encoder, false, ?EC, Bin) of - {ok, Msg1} when DecodeExpect == ok -> + {ok, Msg1} when DecodeExpect =:= ok -> io:format(", decoded - equal:", []), ok; - {ok, Msg2} when DecodeExpect == ok -> + {ok, Msg2} when DecodeExpect =:= ok -> M = binary_to_list(Bin), case (catch compact_otp5186_check_megamsg(Msg1, Msg2)) of ok -> @@ -2075,26 +2077,26 @@ io:format(", decoded - not equal:", []), exit({messages_not_equal, M, Reason, Msg1, Msg2}) end; - {ok, Msg3} when DecodeExpect == error -> + {ok, Msg3} when DecodeExpect =:= error -> M = binary_to_list(Bin), io:format(", decoded:", []), exit({unexpected_decode_success, M, Msg1, Msg3}); - Else when DecodeExpect == ok -> + Else when DecodeExpect =:= ok -> M = binary_to_list(Bin), io:format(", decode failed ", []), exit({unexpected_decode_success, Msg1, M, Else}); - _Else when DecodeExpect == error -> + _Else when DecodeExpect =:= error -> io:format(", decode failed ", []), ok end; - {ok, Bin} when EncodeExpect == error -> + {ok, Bin} when EncodeExpect =:= error -> M = binary_to_list(Bin), io:format(" encoded", []), exit({unexpected_encode_success, Msg1, M}); - _Else when EncodeExpect == error -> + _Else when EncodeExpect =:= error -> io:format(" encode failed ", []), ok; - Else when EncodeExpect == ok -> + Else when EncodeExpect =:= ok -> io:format(" encode failed ", []), exit({unexpected_encode_result, Else}) end. @@ -2493,7 +2495,7 @@ compact_otp5793_msg01(suite) -> []; -compact_otp5793_msg01(Config) when list(Config) -> +compact_otp5793_msg01(Config) when is_list(Config) -> d("compact_otp5793_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5793(ok, pretty_otp5793_msg1()). @@ -2504,7 +2506,7 @@ compact_otp5836_msg01(suite) -> []; -compact_otp5836_msg01(Config) when list(Config) -> +compact_otp5836_msg01(Config) when is_list(Config) -> d("compact_otp5836_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -2549,21 +2551,21 @@ compact_otp5993_msg01(suite) -> []; -compact_otp5993_msg01(Config) when list(Config) -> +compact_otp5993_msg01(Config) when is_list(Config) -> d("compact_otp5993_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5993(ok, compact_otp5993_msg01()). compact_otp5993_msg02(suite) -> []; -compact_otp5993_msg02(Config) when list(Config) -> +compact_otp5993_msg02(Config) when is_list(Config) -> d("compact_otp5993_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5993(ok, compact_otp5993_msg02()). compact_otp5993_msg03(suite) -> []; -compact_otp5993_msg03(Config) when list(Config) -> +compact_otp5993_msg03(Config) when is_list(Config) -> d("compact_otp5993_msg03 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5993(ok, compact_otp5993_msg03()). @@ -2628,7 +2630,7 @@ compact_otp6017_msg01(suite) -> []; -compact_otp6017_msg01(Config) when list(Config) -> +compact_otp6017_msg01(Config) when is_list(Config) -> d("compact_otp6017_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(0), @@ -2636,7 +2638,7 @@ compact_otp6017_msg02(suite) -> []; -compact_otp6017_msg02(Config) when list(Config) -> +compact_otp6017_msg02(Config) when is_list(Config) -> d("compact_otp6017_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(16#FFFFFFFE), @@ -2644,7 +2646,7 @@ compact_otp6017_msg03(suite) -> []; -compact_otp6017_msg03(Config) when list(Config) -> +compact_otp6017_msg03(Config) when is_list(Config) -> d("compact_otp6017_msg03 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(16#FFFFFFFF), @@ -2684,7 +2686,7 @@ flex_compact_otp7431_msg01(suite) -> []; -flex_compact_otp7431_msg01(Config) when list(Config) -> +flex_compact_otp7431_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg01 -> entry", []), @@ -2693,7 +2695,7 @@ flex_compact_otp7431_msg02(suite) -> []; -flex_compact_otp7431_msg02(Config) when list(Config) -> +flex_compact_otp7431_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg02 -> entry", []), @@ -2702,7 +2704,7 @@ flex_compact_otp7431_msg03(suite) -> []; -flex_compact_otp7431_msg03(Config) when list(Config) -> +flex_compact_otp7431_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg03 -> entry", []), @@ -2711,7 +2713,7 @@ flex_compact_otp7431_msg04(suite) -> []; -flex_compact_otp7431_msg04(Config) when list(Config) -> +flex_compact_otp7431_msg04(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg04 -> entry", []), @@ -2720,7 +2722,7 @@ flex_compact_otp7431_msg05(suite) -> []; -flex_compact_otp7431_msg05(Config) when list(Config) -> +flex_compact_otp7431_msg05(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg05 -> entry", []), @@ -2729,7 +2731,7 @@ flex_compact_otp7431_msg06(suite) -> []; -flex_compact_otp7431_msg06(Config) when list(Config) -> +flex_compact_otp7431_msg06(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg06 -> entry", []), @@ -2738,7 +2740,7 @@ flex_compact_otp7431_msg07(suite) -> []; -flex_compact_otp7431_msg07(Config) when list(Config) -> +flex_compact_otp7431_msg07(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg07 -> entry", []), @@ -2831,12 +2833,12 @@ pretty_otp4632_msg1(suite) -> []; -pretty_otp4632_msg1(Config) when list(Config) -> +pretty_otp4632_msg1(Config) when is_list(Config) -> d("pretty_otp4632_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg1(), case pretty_encode_message(?EC, Msg0) of - {ok, BinMsg} when binary(BinMsg) -> + {ok, BinMsg} when is_binary(BinMsg) -> {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, ?EC, BinMsg), ok = chk_MegacoMessage(Msg0, Msg1); @@ -2851,12 +2853,12 @@ pretty_otp4632_msg2(suite) -> []; -pretty_otp4632_msg2(Config) when list(Config) -> +pretty_otp4632_msg2(Config) when is_list(Config) -> d("pretty_otp4632_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg2(), case encode_message(megaco_pretty_text_encoder, ?EC, Msg0) of - {ok, BinMsg} when binary(BinMsg) -> + {ok, BinMsg} when is_binary(BinMsg) -> {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, ?EC, BinMsg), ok = chk_MegacoMessage(Msg0,Msg1); @@ -2872,14 +2874,14 @@ pretty_otp4632_msg3(suite) -> []; -pretty_otp4632_msg3(Config) when list(Config) -> +pretty_otp4632_msg3(Config) when is_list(Config) -> d("pretty_otp4632_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg3(), Bin0 = list_to_binary(Msg0), case decode_message(megaco_pretty_text_encoder, false, ?EC, Bin0) of - {ok, Msg} when record(Msg, 'MegacoMessage') -> + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> {ok, Bin1} = encode_message(megaco_pretty_text_encoder, ?EC, Msg), Msg1 = binary_to_list(Bin1), %% io:format("Msg1:~n~s~n", [Msg1]), @@ -2898,13 +2900,13 @@ pretty_otp4632_msg4(suite) -> []; -pretty_otp4632_msg4(Config) when list(Config) -> +pretty_otp4632_msg4(Config) when is_list(Config) -> d("pretty_otp4632_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg4(), Bin0 = list_to_binary(Msg0), case decode_message(megaco_pretty_text_encoder, false, ?EC, Bin0) of - {ok, Msg} when record(Msg, 'MegacoMessage') -> + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> {ok, Bin1} = encode_message(megaco_pretty_text_encoder, ?EC, Msg), Msg1 = binary_to_list(Bin1), %% io:format("Msg1:~n~s~n", [Msg1]), @@ -2936,12 +2938,12 @@ pretty_otp4710_msg1(suite) -> []; -pretty_otp4710_msg1(Config) when list(Config) -> +pretty_otp4710_msg1(Config) when is_list(Config) -> d("pretty_otp4710_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4710_msg1(), case encode_message(megaco_pretty_text_encoder, ?EC, Msg0) of - {ok, Bin} when binary(Bin) -> + {ok, Bin} when is_binary(Bin) -> {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, ?EC, Bin), ok = chk_MegacoMessage(Msg0,Msg1); @@ -2957,13 +2959,13 @@ pretty_otp4710_msg2(suite) -> []; -pretty_otp4710_msg2(Config) when list(Config) -> +pretty_otp4710_msg2(Config) when is_list(Config) -> d("pretty_otp4710_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4710_msg2(), Bin0 = list_to_binary(Msg0), case decode_message(megaco_pretty_text_encoder, false, ?EC, Bin0) of - {ok, Msg} when record(Msg, 'MegacoMessage') -> + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> {ok, Bin1} = encode_message(megaco_pretty_text_encoder, ?EC, Msg), Msg1 = binary_to_list(Bin1), %% io:format("Msg1:~n~s~n", [Msg1]), @@ -3001,7 +3003,7 @@ pretty_otp4945_msg1(suite) -> []; -pretty_otp4945_msg1(Config) when list(Config) -> +pretty_otp4945_msg1(Config) when is_list(Config) -> d("pretty_otp4945_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg1(), @@ -3039,7 +3041,7 @@ pretty_otp4945_msg2(suite) -> []; -pretty_otp4945_msg2(Config) when list(Config) -> +pretty_otp4945_msg2(Config) when is_list(Config) -> d("pretty_otp4945_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg2(), @@ -3076,7 +3078,7 @@ pretty_otp4945_msg3(suite) -> []; -pretty_otp4945_msg3(Config) when list(Config) -> +pretty_otp4945_msg3(Config) when is_list(Config) -> d("pretty_otp4945_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg3(), @@ -3114,7 +3116,7 @@ pretty_otp4945_msg4(suite) -> []; -pretty_otp4945_msg4(Config) when list(Config) -> +pretty_otp4945_msg4(Config) when is_list(Config) -> d("pretty_otp4945_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg4(), @@ -3145,7 +3147,7 @@ pretty_otp4945_msg5(suite) -> []; -pretty_otp4945_msg5(Config) when list(Config) -> +pretty_otp4945_msg5(Config) when is_list(Config) -> d("pretty_otp4945_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg5(), @@ -3185,7 +3187,7 @@ pretty_otp4945_msg6(suite) -> []; -pretty_otp4945_msg6(Config) when list(Config) -> +pretty_otp4945_msg6(Config) when is_list(Config) -> d("pretty_otp4945_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg6(), @@ -3225,7 +3227,7 @@ pretty_otp4949_msg1(suite) -> []; -pretty_otp4949_msg1(Config) when list(Config) -> +pretty_otp4949_msg1(Config) when is_list(Config) -> d("pretty_otp4949_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4949_msg1(), @@ -3254,7 +3256,7 @@ pretty_otp4949_msg2(suite) -> []; -pretty_otp4949_msg2(Config) when list(Config) -> +pretty_otp4949_msg2(Config) when is_list(Config) -> d("pretty_otp4949_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4949_msg2(), @@ -3292,7 +3294,7 @@ pretty_otp4949_msg3(suite) -> []; -pretty_otp4949_msg3(Config) when list(Config) -> +pretty_otp4949_msg3(Config) when is_list(Config) -> d("pretty_otp4949_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4949_msg3(), @@ -3330,7 +3332,7 @@ pretty_otp5042_msg1(suite) -> []; -pretty_otp5042_msg1(Config) when list(Config) -> +pretty_otp5042_msg1(Config) when is_list(Config) -> d("pretty_otp5042_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp5042_msg1(), @@ -3365,7 +3367,7 @@ pretty_otp5068_msg1(suite) -> []; -pretty_otp5068_msg1(Config) when list(Config) -> +pretty_otp5068_msg1(Config) when is_list(Config) -> d("pretty_otp5068_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg = pretty_otp5068_msg1(), @@ -3436,56 +3438,56 @@ pretty_otp5085_msg1(suite) -> []; -pretty_otp5085_msg1(Config) when list(Config) -> +pretty_otp5085_msg1(Config) when is_list(Config) -> d("pretty_otp5085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg1()). pretty_otp5085_msg2(suite) -> []; -pretty_otp5085_msg2(Config) when list(Config) -> +pretty_otp5085_msg2(Config) when is_list(Config) -> d("pretty_otp5085_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(error, pretty_otp5085_msg2()). pretty_otp5085_msg3(suite) -> []; -pretty_otp5085_msg3(Config) when list(Config) -> +pretty_otp5085_msg3(Config) when is_list(Config) -> d("pretty_otp5085_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg3()). pretty_otp5085_msg4(suite) -> []; -pretty_otp5085_msg4(Config) when list(Config) -> +pretty_otp5085_msg4(Config) when is_list(Config) -> d("pretty_otp5085_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg4()). pretty_otp5085_msg5(suite) -> []; -pretty_otp5085_msg5(Config) when list(Config) -> +pretty_otp5085_msg5(Config) when is_list(Config) -> d("pretty_otp5085_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg5()). pretty_otp5085_msg6(suite) -> []; -pretty_otp5085_msg6(Config) when list(Config) -> +pretty_otp5085_msg6(Config) when is_list(Config) -> d("pretty_otp5085_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg6()). pretty_otp5085_msg7(suite) -> []; -pretty_otp5085_msg7(Config) when list(Config) -> +pretty_otp5085_msg7(Config) when is_list(Config) -> d("pretty_otp5085_msg7 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg7()). pretty_otp5085_msg8(suite) -> []; -pretty_otp5085_msg8(Config) when list(Config) -> +pretty_otp5085_msg8(Config) when is_list(Config) -> d("pretty_otp5085_msg8 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -3774,7 +3776,7 @@ pretty_otp5600_msg1(suite) -> []; -pretty_otp5600_msg1(Config) when list(Config) -> +pretty_otp5600_msg1(Config) when is_list(Config) -> d("pretty_otp5600_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -3783,7 +3785,7 @@ pretty_otp5600_msg2(suite) -> []; -pretty_otp5600_msg2(Config) when list(Config) -> +pretty_otp5600_msg2(Config) when is_list(Config) -> d("pretty_otp5600_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -3904,7 +3906,7 @@ pretty_otp5601_msg1(suite) -> []; -pretty_otp5601_msg1(Config) when list(Config) -> +pretty_otp5601_msg1(Config) when is_list(Config) -> d("pretty_otp5601_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -3989,7 +3991,7 @@ pretty_otp5793_msg01(suite) -> []; -pretty_otp5793_msg01(Config) when list(Config) -> +pretty_otp5793_msg01(Config) when is_list(Config) -> d("pretty_otp5793_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(severity,trc), @@ -4052,7 +4054,7 @@ pretty_otp5803_msg01(suite) -> []; -pretty_otp5803_msg01(Config) when list(Config) -> +pretty_otp5803_msg01(Config) when is_list(Config) -> d("pretty_otp5803_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -4061,7 +4063,7 @@ pretty_otp5803_msg02(suite) -> []; -pretty_otp5803_msg02(Config) when list(Config) -> +pretty_otp5803_msg02(Config) when is_list(Config) -> d("pretty_otp5803_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -4156,7 +4158,7 @@ pretty_otp5805_msg01(suite) -> []; -pretty_otp5805_msg01(Config) when list(Config) -> +pretty_otp5805_msg01(Config) when is_list(Config) -> d("pretty_otp5805_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -4183,7 +4185,7 @@ pretty_otp5836_msg01(suite) -> []; -pretty_otp5836_msg01(Config) when list(Config) -> +pretty_otp5836_msg01(Config) when is_list(Config) -> d("pretty_otp5836_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -4616,6 +4618,94 @@ ok. +%% -------------------------------------------------------------- +%% + + +pretty_otp8114_msg01(suite) -> + []; +pretty_otp8114_msg01(Config) when is_list(Config) -> + put(severity, trc), + put(dbg, true), + d("pretty_otp8114_msg01 -> entry", []), + ok = otp8114( pretty_otp8114_msg01(), megaco_pretty_text_encoder, ?EC), + erase(dbg), + erase(severity), + ok. + +pretty_otp8114_msg01() -> + "MEGACO/" ?VERSION_STR " [10.10.10.10]:1234\nTransaction = 1 {\n\tContext =\n1 {\n\t\tModify = ip/1/1/1 {\n\t\t\tMedia {\n\t\t\t\tStream = 1\n{\n\t\t\t\t\t\tLocalControl {\n\t\t\t\t\t\tMode =\nSendReceive\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tEvents = 1\n{\n\t\t\t\tadid/ipstop\n{\n\t\t\t\t\tdt=30,\n\t\t\t\t\tdir=\"BOTH\"\n\t\t\t\t},\n\t\t\t\tg/cause\n\n\t\t\t}\n\t\t}\n\t}\n}". + + +otp8114(InitialMessage, Codec, Conf) -> + Decode = fun(M) -> Codec:decode_message(Conf, M) end, + Encode = fun(B) -> Codec:encode_message(Conf, B) end, + InitialData = InitialMessage, + Instructions = + [ + %% List to binary + megaco_codec_test_lib:expect_instruction( + "Convert (initial) message to a binary", + fun(Msg) when is_list(Msg) -> + %% io:format("~s~n", [Msg]), + {ok, list_to_binary(Msg)}; + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Bin}, _Msg) when is_binary(Bin) -> + {ok, Bin}; + (Bad, _Msg) -> + {error, {failed_to_binary, Bad}} + end), + + %% Initial decode + megaco_codec_test_lib:expect_instruction( + "Decode (initial) message", + fun(Bin) when is_binary(Bin) -> + (catch Decode(Bin)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Msg}, _Bin) when is_record(Msg, 'MegacoMessage') -> + %% io:format("~p~n", [Msg]), + {ok, Msg}; + (Bad, _) -> + {error, {initial_decode_failed, Bad}} + end), + + %% Encode + megaco_codec_test_lib:expect_instruction( + "Encode message", + fun(Msg) when is_record(Msg, 'MegacoMessage') -> + (catch Encode(Msg)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Bin}, _Msg) when is_binary(Bin) -> + %% io:format("~s~n", [binary_to_list(Bin)]), + {ok, Bin}; + (Bad, _) -> + {error, {encode_failed, Bad}} + end), + + %% Decode + megaco_codec_test_lib:expect_instruction( + "(final) Decode message", + fun(Bin) when is_binary(Bin) -> + (catch Decode(Bin)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Msg}, _Bin) when is_record(Msg, 'MegacoMessage') -> + %% io:format("~p~n", [Msg]), + {ok, Msg}; + (Bad, _) -> + {error, {decode_failed, Bad}} + end) + ], + megaco_codec_test_lib:expect_exec(Instructions, InitialData). + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% expect_codec_e(error, Codec, Msg, Conf) -> @@ -4701,7 +4791,7 @@ ({error, R}, _) -> {Line, Mod, Reason} = case lists:keysearch(reason, 1, R) of - {value, {reason, {L, M, Raw}}} when list(Raw) -> + {value, {reason, {L, M, Raw}}} when is_list(Raw) -> {L, M, lists:flatten(Raw)}; {value, {reason, {L, M, Raw}}} -> {L, M, Raw} @@ -4872,9 +4962,9 @@ msgs3_name(N) -> list_to_atom("rfc3525_" ++ atom_to_list(N)). -rfc3525_decode(M) when list(M) -> +rfc3525_decode(M) when is_list(M) -> rfc3525_decode(list_to_binary(M)); -rfc3525_decode(M) when binary(M) -> +rfc3525_decode(M) when is_binary(M) -> case (catch decode_message(megaco_pretty_text_encoder, false, ?EC, M)) of {ok, Msg} -> Msg; @@ -5089,7 +5179,7 @@ Actions = [Action], msg_reply(Mid, TransId, Actions). -msg_ack(Mid, [Range|_] = Ranges) when tuple(Range) -> +msg_ack(Mid, [Range|_] = Ranges) when is_tuple(Range) -> msg_ack(Mid, [Ranges]); msg_ack(Mid, Ranges) -> @@ -5190,7 +5280,7 @@ msg4() -> msg4(?MG1_MID_NO_PORT, "901 mg col boot"). -msg4(Mid, Reason) when list(Reason) -> +msg4(Mid, Reason) when is_list(Reason) -> Address = {portNumber, ?DEFAULT_PORT}, Profile = cre_SvcChProf("resgw",1), Parm = cre_SvcChParm(restart,Address,[Reason],Profile), @@ -5694,7 +5784,7 @@ msg40() -> msg40(?MG1_MID_NO_PORT, "901 mg col boot"). -msg40(Mid, Reason) when list(Reason) -> +msg40(Mid, Reason) when is_list(Reason) -> Address = {portNumber, ?DEFAULT_PORT}, Profile = cre_SvcChProf("resgw",1), Parm = cre_SvcChParm(restart,Address,[Reason],Profile), @@ -7240,7 +7330,7 @@ %% io:format("d", []), io:format("decoded:~n~p~n", [M2]), case (catch Codec:encode_message(Config, Ver, M2)) of - {ok, Bin2} when binary(Bin2) -> + {ok, Bin2} when is_binary(Bin2) -> %% io:format("e~n", []), io:format("encode: ~n~s~n", [erlang:binary_to_list(Bin2)]), {N,ok}; @@ -7420,7 +7510,7 @@ ?MSG_LIB:cre_IndAudTerminationStateDescriptor(PP, EBC, SS). cre_IndAudEvsDesc(RID, PN) - when integer(RID) -> + when is_integer(RID) -> ?MSG_LIB:cre_IndAudEventsDescriptor(RID, PN). cre_IndAudEvBufDesc(EN, SID) -> @@ -7556,7 +7646,7 @@ ?MSG_LIB:cre_DigitMapValue(Start, Short, Long, Body). %% Media related -cre_MediaDesc(SD) when record(SD, 'StreamDescriptor') -> +cre_MediaDesc(SD) when is_record(SD, 'StreamDescriptor') -> cre_MediaDesc([SD]); cre_MediaDesc(SDs) -> ?MSG_LIB:cre_MediaDescriptor(SDs). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_prev3c_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_prev3c_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_prev3c_test.erl 2009-03-12 12:32:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_prev3c_test.erl 2009-09-18 13:47:55.000000000 +0100 @@ -190,6 +190,7 @@ pretty_otp7671_msg03/1, pretty_otp7671_msg04/1, pretty_otp7671_msg05/1, + pretty_otp8114_msg01/1, flex_pretty_tickets/1, flex_pretty_otp5042_msg1/1, @@ -279,7 +280,7 @@ case (catch apply(?MODULE,Case,[suite])) of [] -> expand(Cases, [Case|Acc]); - C when list(C) -> + C when is_list(C) -> expand(Cases, [expand(C, [])|Acc]); _ -> expand(Cases, [Case|Acc]) @@ -564,7 +565,8 @@ pretty_otp7671_msg02, pretty_otp7671_msg03, pretty_otp7671_msg04, - pretty_otp7671_msg05 + pretty_otp7671_msg05, + pretty_otp8114_msg01 ]. @@ -606,7 +608,7 @@ pretty_test_msgs(suite) -> []; -pretty_test_msgs(Config) when list(Config) -> +pretty_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(text) ++ @@ -635,7 +637,7 @@ flex_pretty_test_msgs(suite) -> []; -flex_pretty_test_msgs(Config) when list(Config) -> +flex_pretty_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(text) ++ @@ -653,7 +655,7 @@ compact_test_msgs(suite) -> []; -compact_test_msgs(Config) when list(Config) -> +compact_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(text) ++ @@ -677,7 +679,7 @@ flex_compact_test_msgs(suite) -> []; -flex_compact_test_msgs(Config) when list(Config) -> +flex_compact_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(text) ++ @@ -693,14 +695,14 @@ flex_compact_dm_timers1(suite) -> []; -flex_compact_dm_timers1(Config) when list(Config) -> +flex_compact_dm_timers1(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("1", "2", "3"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers1 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -712,14 +714,14 @@ flex_compact_dm_timers2(suite) -> []; -flex_compact_dm_timers2(Config) when list(Config) -> +flex_compact_dm_timers2(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("02", "03", "04"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers2 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -731,14 +733,14 @@ flex_compact_dm_timers3(suite) -> []; -flex_compact_dm_timers3(Config) when list(Config) -> +flex_compact_dm_timers3(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("1", "02", "31"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers3 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -750,14 +752,14 @@ flex_compact_dm_timers4(suite) -> []; -flex_compact_dm_timers4(Config) when list(Config) -> +flex_compact_dm_timers4(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("10", "21", "99"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers4 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -769,14 +771,14 @@ flex_compact_dm_timers5(suite) -> []; -flex_compact_dm_timers5(Config) when list(Config) -> +flex_compact_dm_timers5(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("99", "23", "11"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers5 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -788,14 +790,14 @@ flex_compact_dm_timers6(suite) -> []; -flex_compact_dm_timers6(Config) when list(Config) -> +flex_compact_dm_timers6(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("77", "09", "1"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers6 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -807,14 +809,14 @@ flex_compact_dm_timers7(suite) -> []; -flex_compact_dm_timers7(Config) when list(Config) -> +flex_compact_dm_timers7(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("77", "09", "1", "99"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers7 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -826,14 +828,14 @@ flex_compact_dm_timers8(suite) -> []; -flex_compact_dm_timers8(Config) when list(Config) -> +flex_compact_dm_timers8(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("01", "09", "01", "02"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers8 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -867,13 +869,13 @@ exit({invalid_timer_values, {TMRs, TMRs1}}) end. -get_dm_timers({transactions, T}) when list(T) -> +get_dm_timers({transactions, T}) when is_list(T) -> get_dm_timers1(T); get_dm_timers(Other) -> {error, {invalid_transactions, Other}}. get_dm_timers1([{transactionRequest,T}|Ts]) - when record(T,'TransactionRequest') -> + when is_record(T,'TransactionRequest') -> case get_dm_timers2(T) of {ok, Timers} -> Timers; @@ -886,11 +888,11 @@ {error, {no_timers, 'TransactionRequest'}}. -get_dm_timers2(#'TransactionRequest'{actions = Actions}) when list(Actions) -> +get_dm_timers2(#'TransactionRequest'{actions = Actions}) when is_list(Actions) -> get_dm_timers3(Actions). -get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when list(Cmds) -> +get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when is_list(Cmds) -> case get_dm_timers4(Cmds) of {ok, Timers} -> {ok, Timers}; @@ -946,7 +948,7 @@ bin_test_msgs(suite) -> []; -bin_test_msgs(Config) when list(Config) -> +bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(binary) ++ @@ -962,7 +964,7 @@ ber_test_msgs(suite) -> []; -ber_test_msgs(Config) when list(Config) -> +ber_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(binary) ++ @@ -978,7 +980,7 @@ ber_bin_test_msgs(suite) -> []; -ber_bin_test_msgs(Config) when list(Config) -> +ber_bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(binary) ++ @@ -993,7 +995,7 @@ per_test_msgs(suite) -> []; -per_test_msgs(Config) when list(Config) -> +per_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(binary) ++ @@ -1008,7 +1010,7 @@ per_bin_test_msgs(suite) -> []; -per_bin_test_msgs(Config) when list(Config) -> +per_bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(binary) ++ @@ -1023,7 +1025,7 @@ erl_dist_m_test_msgs(suite) -> []; -erl_dist_m_test_msgs(Config) when list(Config) -> +erl_dist_m_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(erlang) ++ @@ -1047,7 +1049,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg1(suite) -> []; -compact_otp4011_msg1(Config) when list(Config) -> +compact_otp4011_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4011_msg1 -> entry", []), @@ -1063,7 +1065,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg2(suite) -> []; -compact_otp4011_msg2(Config) when list(Config) -> +compact_otp4011_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4011_msg2 -> entry", []), @@ -1080,7 +1082,7 @@ compact_otp4011_msg3(suite) -> []; -compact_otp4011_msg3(Config) when list(Config) -> +compact_otp4011_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4011_msg3 -> entry", []), @@ -1113,9 +1115,9 @@ end. compact_otp4011_chk2({0, ParserMod, {ParserFunc, [A, B]}}) - when (ParserMod == megaco_text_parser_prev3c) and - (ParserFunc == do_merge_control_streamParms) and - is_list(A) and + when (ParserMod =:= megaco_text_parser_prev3c) andalso + (ParserFunc =:= do_merge_control_streamParms) andalso + is_list(A) andalso is_record(B, 'LocalControlDescriptor') -> SM = B#'LocalControlDescriptor'.streamMode, case lists:keysearch(mode, 1, A) of @@ -1135,7 +1137,7 @@ %% MEGCAO instead of the correct MEGACO. compact_otp4013_msg1(suite) -> []; -compact_otp4013_msg1(Config) when list(Config) -> +compact_otp4013_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4013_msg1 -> entry", []), @@ -1182,7 +1184,7 @@ %% compact_otp4085_msg1(suite) -> []; -compact_otp4085_msg1(Config) when list(Config) -> +compact_otp4085_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4085_msg1 -> entry", []), @@ -1236,7 +1238,7 @@ %% compact_otp4085_msg1 is actually ok when you add '}' at the end. compact_otp4085_msg2(suite) -> []; -compact_otp4085_msg2(Config) when list(Config) -> +compact_otp4085_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4085_msg1 -> entry", []), @@ -1277,7 +1279,7 @@ %% compact_otp4280_msg1(suite) -> []; -compact_otp4280_msg1(Config) when list(Config) -> +compact_otp4280_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4280_msg1 -> entry", []), @@ -1316,7 +1318,7 @@ %% compact_otp4299_msg1(suite) -> []; -compact_otp4299_msg1(Config) when list(Config) -> +compact_otp4299_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4299_msg1 -> entry", []), @@ -1362,7 +1364,7 @@ compact_otp4359_msg1(suite) -> []; -compact_otp4359_msg1(Config) when list(Config) -> +compact_otp4359_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4359_msg1 -> entry", []), @@ -1413,7 +1415,7 @@ %% compact_otp4920_msg0(suite) -> []; -compact_otp4920_msg0(Config) when list(Config) -> +compact_otp4920_msg0(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg0 -> entry", []), @@ -1425,7 +1427,7 @@ compact_otp4920_msg1(suite) -> []; -compact_otp4920_msg1(Config) when list(Config) -> +compact_otp4920_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg1 -> entry", []), @@ -1437,7 +1439,7 @@ compact_otp4920_msg2(suite) -> []; -compact_otp4920_msg2(Config) when list(Config) -> +compact_otp4920_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg2 -> entry", []), @@ -1449,7 +1451,7 @@ compact_otp4920_msg3(suite) -> []; -compact_otp4920_msg3(Config) when list(Config) -> +compact_otp4920_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg3 -> entry", []), @@ -1461,7 +1463,7 @@ compact_otp4920_msg4(suite) -> []; -compact_otp4920_msg4(Config) when list(Config) -> +compact_otp4920_msg4(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg4 -> entry", []), @@ -1473,7 +1475,7 @@ compact_otp4920_msg5(suite) -> []; -compact_otp4920_msg5(Config) when list(Config) -> +compact_otp4920_msg5(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg5 -> entry", []), @@ -1485,7 +1487,7 @@ compact_otp4920_msg6(suite) -> []; -compact_otp4920_msg6(Config) when list(Config) -> +compact_otp4920_msg6(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg6 -> entry", []), @@ -1497,7 +1499,7 @@ compact_otp4920_msg7(suite) -> []; -compact_otp4920_msg7(Config) when list(Config) -> +compact_otp4920_msg7(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg7 -> entry", []), @@ -1509,7 +1511,7 @@ compact_otp4920_msg8(suite) -> []; -compact_otp4920_msg8(Config) when list(Config) -> +compact_otp4920_msg8(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg8 -> entry", []), @@ -1521,7 +1523,7 @@ compact_otp4920_msg9(suite) -> []; -compact_otp4920_msg9(Config) when list(Config) -> +compact_otp4920_msg9(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg9 -> entry", []), @@ -1533,7 +1535,7 @@ compact_otp4920_msg10(suite) -> []; -compact_otp4920_msg10(Config) when list(Config) -> +compact_otp4920_msg10(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg10 -> entry", []), @@ -1545,7 +1547,7 @@ compact_otp4920_msg11(suite) -> []; -compact_otp4920_msg11(Config) when list(Config) -> +compact_otp4920_msg11(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg11 -> entry", []), @@ -1557,7 +1559,7 @@ compact_otp4920_msg12(suite) -> []; -compact_otp4920_msg12(Config) when list(Config) -> +compact_otp4920_msg12(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg12 -> entry", []), @@ -1570,7 +1572,7 @@ %% Duplicate padding compact_otp4920_msg20(suite) -> []; -compact_otp4920_msg20(Config) when list(Config) -> +compact_otp4920_msg20(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg20 -> entry", []), @@ -1583,7 +1585,7 @@ %% Length compact_otp4920_msg21(suite) -> []; -compact_otp4920_msg21(Config) when list(Config) -> +compact_otp4920_msg21(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg21 -> entry", []), @@ -1596,7 +1598,7 @@ %% Length compact_otp4920_msg22(suite) -> []; -compact_otp4920_msg22(Config) when list(Config) -> +compact_otp4920_msg22(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg22 -> entry", []), @@ -1609,7 +1611,7 @@ %% Length compact_otp4920_msg23(suite) -> []; -compact_otp4920_msg23(Config) when list(Config) -> +compact_otp4920_msg23(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg23 -> entry", []), @@ -1622,7 +1624,7 @@ %% Length compact_otp4920_msg24(suite) -> []; -compact_otp4920_msg24(Config) when list(Config) -> +compact_otp4920_msg24(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg24 -> entry", []), @@ -1635,7 +1637,7 @@ %% Length compact_otp4920_msg25(suite) -> []; -compact_otp4920_msg25(Config) when list(Config) -> +compact_otp4920_msg25(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg25 -> entry", []), @@ -1771,7 +1773,7 @@ compact_otp5186_msg01(suite) -> []; -compact_otp5186_msg01(Config) when list(Config) -> +compact_otp5186_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg01 -> entry", []), @@ -1783,7 +1785,7 @@ compact_otp5186_msg02(suite) -> []; -compact_otp5186_msg02(Config) when list(Config) -> +compact_otp5186_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg02 -> entry", []), @@ -1795,7 +1797,7 @@ compact_otp5186_msg03(suite) -> []; -compact_otp5186_msg03(Config) when list(Config) -> +compact_otp5186_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg03 -> entry", []), @@ -1808,7 +1810,7 @@ compact_otp5186_msg04(suite) -> []; -compact_otp5186_msg04(Config) when list(Config) -> +compact_otp5186_msg04(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg04 -> entry", []), @@ -1821,7 +1823,7 @@ compact_otp5186_msg05(suite) -> []; -compact_otp5186_msg05(Config) when list(Config) -> +compact_otp5186_msg05(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg05 -> entry", []), @@ -1834,7 +1836,7 @@ compact_otp5186_msg06(suite) -> []; -compact_otp5186_msg06(Config) when list(Config) -> +compact_otp5186_msg06(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg06 -> entry", []), @@ -1986,7 +1988,7 @@ compact_otp5793_msg01(suite) -> []; -compact_otp5793_msg01(Config) when list(Config) -> +compact_otp5793_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5793_msg01 -> entry", []), @@ -2001,7 +2003,7 @@ compact_otp5836_msg01(suite) -> []; -compact_otp5836_msg01(Config) when list(Config) -> +compact_otp5836_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5836_msg01 -> entry", []), @@ -2046,7 +2048,7 @@ compact_otp5993_msg01(suite) -> []; -compact_otp5993_msg01(Config) when list(Config) -> +compact_otp5993_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5993_msg01 -> entry", []), @@ -2067,7 +2069,7 @@ compact_otp5993_msg02(suite) -> []; -compact_otp5993_msg02(Config) when list(Config) -> +compact_otp5993_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5993_msg02 -> entry", []), @@ -2089,7 +2091,7 @@ compact_otp5993_msg03(suite) -> []; -compact_otp5993_msg03(Config) when list(Config) -> +compact_otp5993_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5993_msg03 -> entry", []), @@ -2140,7 +2142,7 @@ compact_otp6017_msg01(suite) -> []; -compact_otp6017_msg01(Config) when list(Config) -> +compact_otp6017_msg01(Config) when is_list(Config) -> d("compact_otp6017_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(0), @@ -2148,7 +2150,7 @@ compact_otp6017_msg02(suite) -> []; -compact_otp6017_msg02(Config) when list(Config) -> +compact_otp6017_msg02(Config) when is_list(Config) -> d("compact_otp6017_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(16#FFFFFFFE), @@ -2156,7 +2158,7 @@ compact_otp6017_msg03(suite) -> []; -compact_otp6017_msg03(Config) when list(Config) -> +compact_otp6017_msg03(Config) when is_list(Config) -> d("compact_otp6017_msg03 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(16#FFFFFFFF), @@ -2196,7 +2198,7 @@ flex_compact_otp4299_msg1(suite) -> []; -flex_compact_otp4299_msg1(Config) when list(Config) -> +flex_compact_otp4299_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp4299_msg1 -> entry", []), @@ -2211,7 +2213,7 @@ flex_compact_otp7431_msg01(suite) -> []; -flex_compact_otp7431_msg01(Config) when list(Config) -> +flex_compact_otp7431_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg01 -> entry", []), @@ -2220,7 +2222,7 @@ flex_compact_otp7431_msg02(suite) -> []; -flex_compact_otp7431_msg02(Config) when list(Config) -> +flex_compact_otp7431_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg02 -> entry", []), @@ -2229,7 +2231,7 @@ flex_compact_otp7431_msg03(suite) -> []; -flex_compact_otp7431_msg03(Config) when list(Config) -> +flex_compact_otp7431_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg03 -> entry", []), @@ -2238,7 +2240,7 @@ flex_compact_otp7431_msg04(suite) -> []; -flex_compact_otp7431_msg04(Config) when list(Config) -> +flex_compact_otp7431_msg04(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg04 -> entry", []), @@ -2247,7 +2249,7 @@ flex_compact_otp7431_msg05(suite) -> []; -flex_compact_otp7431_msg05(Config) when list(Config) -> +flex_compact_otp7431_msg05(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg05 -> entry", []), @@ -2256,7 +2258,7 @@ flex_compact_otp7431_msg06(suite) -> []; -flex_compact_otp7431_msg06(Config) when list(Config) -> +flex_compact_otp7431_msg06(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg06 -> entry", []), @@ -2265,7 +2267,7 @@ flex_compact_otp7431_msg07(suite) -> []; -flex_compact_otp7431_msg07(Config) when list(Config) -> +flex_compact_otp7431_msg07(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg07 -> entry", []), @@ -2358,7 +2360,7 @@ pretty_otp4632_msg1(suite) -> []; -pretty_otp4632_msg1(Config) when list(Config) -> +pretty_otp4632_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4632_msg1 -> entry", []), @@ -2373,7 +2375,7 @@ pretty_otp4632_msg2(suite) -> []; -pretty_otp4632_msg2(Config) when list(Config) -> +pretty_otp4632_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4632_msg2 -> entry", []), @@ -2389,7 +2391,7 @@ pretty_otp4632_msg3(suite) -> []; -pretty_otp4632_msg3(Config) when list(Config) -> +pretty_otp4632_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4632_msg3 -> entry", []), @@ -2406,7 +2408,7 @@ pretty_otp4632_msg4(suite) -> []; -pretty_otp4632_msg4(Config) when list(Config) -> +pretty_otp4632_msg4(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4632_msg4 -> entry", []), @@ -2447,7 +2449,7 @@ %% pretty_otp4710_msg1(suite) -> []; -pretty_otp4710_msg1(Config) when list(Config) -> +pretty_otp4710_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4710_msg1 -> entry", []), @@ -2463,7 +2465,7 @@ pretty_otp4710_msg2(suite) -> []; -pretty_otp4710_msg2(Config) when list(Config) -> +pretty_otp4710_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4710_msg2 -> entry", []), @@ -2509,7 +2511,7 @@ %% pretty_otp4945_msg1(suite) -> []; -pretty_otp4945_msg1(Config) when list(Config) -> +pretty_otp4945_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg1 -> entry", []), @@ -2543,7 +2545,7 @@ pretty_otp4945_msg2(suite) -> []; -pretty_otp4945_msg2(Config) when list(Config) -> +pretty_otp4945_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg2 -> entry", []), @@ -2577,7 +2579,7 @@ pretty_otp4945_msg3(suite) -> []; -pretty_otp4945_msg3(Config) when list(Config) -> +pretty_otp4945_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg3 -> entry", []), @@ -2610,7 +2612,7 @@ pretty_otp4945_msg4(suite) -> []; -pretty_otp4945_msg4(Config) when list(Config) -> +pretty_otp4945_msg4(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg4 -> entry", []), @@ -2637,7 +2639,7 @@ pretty_otp4945_msg5(suite) -> []; -pretty_otp4945_msg5(Config) when list(Config) -> +pretty_otp4945_msg5(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg5 -> entry", []), @@ -2674,7 +2676,7 @@ pretty_otp4945_msg6(suite) -> []; -pretty_otp4945_msg6(Config) when list(Config) -> +pretty_otp4945_msg6(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg6 -> entry", []), @@ -2725,7 +2727,7 @@ %% pretty_otp4949_msg1(suite) -> []; -pretty_otp4949_msg1(Config) when list(Config) -> +pretty_otp4949_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4949_msg1 -> entry", []), @@ -2750,7 +2752,7 @@ pretty_otp4949_msg2(suite) -> []; -pretty_otp4949_msg2(Config) when list(Config) -> +pretty_otp4949_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4949_msg2 -> entry", []), @@ -2785,7 +2787,7 @@ pretty_otp4949_msg3(suite) -> []; -pretty_otp4949_msg3(Config) when list(Config) -> +pretty_otp4949_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4949_msg3 -> entry", []), @@ -2822,7 +2824,7 @@ %% pretty_otp5042_msg1(suite) -> []; -pretty_otp5042_msg1(Config) when list(Config) -> +pretty_otp5042_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5042_msg1 -> entry", []), @@ -2847,7 +2849,7 @@ %% pretty_otp5068_msg1(suite) -> []; -pretty_otp5068_msg1(Config) when list(Config) -> +pretty_otp5068_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5068_msg1 -> entry", []), @@ -2908,7 +2910,7 @@ %% pretty_otp5085_msg1(suite) -> []; -pretty_otp5085_msg1(Config) when list(Config) -> +pretty_otp5085_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg1 -> entry", []), @@ -2948,7 +2950,7 @@ pretty_otp5085_msg2(suite) -> []; -pretty_otp5085_msg2(Config) when list(Config) -> +pretty_otp5085_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg2 -> entry", []), @@ -2988,7 +2990,7 @@ pretty_otp5085_msg3(suite) -> []; -pretty_otp5085_msg3(Config) when list(Config) -> +pretty_otp5085_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg3 -> entry", []), @@ -3028,7 +3030,7 @@ pretty_otp5085_msg4(suite) -> []; -pretty_otp5085_msg4(Config) when list(Config) -> +pretty_otp5085_msg4(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg4 -> entry", []), @@ -3069,7 +3071,7 @@ pretty_otp5085_msg5(suite) -> []; -pretty_otp5085_msg5(Config) when list(Config) -> +pretty_otp5085_msg5(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg5 -> entry", []), @@ -3110,7 +3112,7 @@ pretty_otp5085_msg6(suite) -> []; -pretty_otp5085_msg6(Config) when list(Config) -> +pretty_otp5085_msg6(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg6 -> entry", []), @@ -3151,7 +3153,7 @@ pretty_otp5085_msg7(suite) -> []; -pretty_otp5085_msg7(Config) when list(Config) -> +pretty_otp5085_msg7(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg7 -> entry", []), @@ -3191,7 +3193,7 @@ pretty_otp5085_msg8(suite) -> []; -pretty_otp5085_msg8(Config) when list(Config) -> +pretty_otp5085_msg8(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg8 -> entry", []), @@ -3248,7 +3250,7 @@ %% pretty_otp5600_msg1(suite) -> []; -pretty_otp5600_msg1(Config) when list(Config) -> +pretty_otp5600_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5600_msg1 -> entry", []), @@ -3297,7 +3299,7 @@ pretty_otp5600_msg2(suite) -> []; -pretty_otp5600_msg2(Config) when list(Config) -> +pretty_otp5600_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5600_msg2 -> entry", []), @@ -3350,7 +3352,7 @@ %% pretty_otp5601_msg1(suite) -> []; -pretty_otp5601_msg1(Config) when list(Config) -> +pretty_otp5601_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5601_msg1 -> entry", []), @@ -3403,7 +3405,7 @@ %% pretty_otp5793_msg01(suite) -> []; -pretty_otp5793_msg01(Config) when list(Config) -> +pretty_otp5793_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5793_msg01 -> entry", []), @@ -3464,7 +3466,7 @@ %% pretty_otp5803_msg01(suite) -> []; -pretty_otp5803_msg01(Config) when list(Config) -> +pretty_otp5803_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5803_msg01 -> entry", []), @@ -3517,7 +3519,7 @@ pretty_otp5803_msg02(suite) -> []; -pretty_otp5803_msg02(Config) when list(Config) -> +pretty_otp5803_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5803_msg02 -> entry", []), @@ -3569,7 +3571,7 @@ %% pretty_otp5805_msg01(suite) -> []; -pretty_otp5805_msg01(Config) when list(Config) -> +pretty_otp5805_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5805_msg01 -> entry", []), @@ -3594,7 +3596,7 @@ %% pretty_otp5836_msg01(suite) -> []; -pretty_otp5836_msg01(Config) when list(Config) -> +pretty_otp5836_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5836_msg01 -> entry", []), @@ -3987,6 +3989,94 @@ ok. +%% -------------------------------------------------------------- +%% + + +pretty_otp8114_msg01(suite) -> + []; +pretty_otp8114_msg01(Config) when is_list(Config) -> + put(severity, trc), + put(dbg, true), + d("pretty_otp8114_msg01 -> entry", []), + ok = otp8114( pretty_otp8114_msg01(), megaco_pretty_text_encoder, ?EC), + erase(dbg), + erase(severity), + ok. + +pretty_otp8114_msg01() -> + "MEGACO/" ?VERSION_STR " [10.10.10.10]:1234\nTransaction = 1 {\n\tContext =\n1 {\n\t\tModify = ip/1/1/1 {\n\t\t\tMedia {\n\t\t\t\tStream = 1\n{\n\t\t\t\t\t\tLocalControl {\n\t\t\t\t\t\tMode =\nSendReceive\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tEvents = 1\n{\n\t\t\t\tadid/ipstop\n{\n\t\t\t\t\tdt=30,\n\t\t\t\t\tdir=\"BOTH\"\n\t\t\t\t},\n\t\t\t\tg/cause\n\n\t\t\t}\n\t\t}\n\t}\n}". + + +otp8114(InitialMessage, Codec, Conf) -> + Decode = fun(M) -> Codec:decode_message(Conf, M) end, + Encode = fun(B) -> Codec:encode_message(Conf, B) end, + InitialData = InitialMessage, + Instructions = + [ + %% List to binary + megaco_codec_test_lib:expect_instruction( + "Convert (initial) message to a binary", + fun(Msg) when is_list(Msg) -> + %% io:format("~s~n", [Msg]), + {ok, list_to_binary(Msg)}; + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Bin}, _Msg) when is_binary(Bin) -> + {ok, Bin}; + (Bad, _Msg) -> + {error, {failed_to_binary, Bad}} + end), + + %% Initial decode + megaco_codec_test_lib:expect_instruction( + "Decode (initial) message", + fun(Bin) when is_binary(Bin) -> + (catch Decode(Bin)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Msg}, _Bin) when is_record(Msg, 'MegacoMessage') -> + %% io:format("~p~n", [Msg]), + {ok, Msg}; + (Bad, _) -> + {error, {initial_decode_failed, Bad}} + end), + + %% Encode + megaco_codec_test_lib:expect_instruction( + "Encode message", + fun(Msg) when is_record(Msg, 'MegacoMessage') -> + (catch Encode(Msg)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Bin}, _Msg) when is_binary(Bin) -> + %% io:format("~s~n", [binary_to_list(Bin)]), + {ok, Bin}; + (Bad, _) -> + {error, {encode_failed, Bad}} + end), + + %% Decode + megaco_codec_test_lib:expect_instruction( + "(final) Decode message", + fun(Bin) when is_binary(Bin) -> + (catch Decode(Bin)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Msg}, _Bin) when is_record(Msg, 'MegacoMessage') -> + %% io:format("~p~n", [Msg]), + {ok, Msg}; + (Bad, _) -> + {error, {decode_failed, Bad}} + end) + ], + megaco_codec_test_lib:expect_exec(Instructions, InitialData). + + %% ============================================================== %% %% F l e x P r e t t y T e s t c a s e s @@ -3994,7 +4084,7 @@ flex_pretty_otp5042_msg1(suite) -> []; -flex_pretty_otp5042_msg1(Config) when list(Config) -> +flex_pretty_otp5042_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5042_msg1 -> entry", []), @@ -4009,7 +4099,7 @@ %% flex_pretty_otp5085_msg1(suite) -> []; -flex_pretty_otp5085_msg1(Config) when list(Config) -> +flex_pretty_otp5085_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg1 -> entry", []), @@ -4022,7 +4112,7 @@ flex_pretty_otp5085_msg2(suite) -> []; -flex_pretty_otp5085_msg2(Config) when list(Config) -> +flex_pretty_otp5085_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg2 -> entry", []), @@ -4035,7 +4125,7 @@ flex_pretty_otp5085_msg3(suite) -> []; -flex_pretty_otp5085_msg3(Config) when list(Config) -> +flex_pretty_otp5085_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg3 -> entry", []), @@ -4048,7 +4138,7 @@ flex_pretty_otp5085_msg4(suite) -> []; -flex_pretty_otp5085_msg4(Config) when list(Config) -> +flex_pretty_otp5085_msg4(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg4 -> entry", []), @@ -4061,7 +4151,7 @@ flex_pretty_otp5085_msg5(suite) -> []; -flex_pretty_otp5085_msg5(Config) when list(Config) -> +flex_pretty_otp5085_msg5(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg5 -> entry", []), @@ -4074,7 +4164,7 @@ flex_pretty_otp5085_msg6(suite) -> []; -flex_pretty_otp5085_msg6(Config) when list(Config) -> +flex_pretty_otp5085_msg6(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg6 -> entry", []), @@ -4087,7 +4177,7 @@ flex_pretty_otp5085_msg7(suite) -> []; -flex_pretty_otp5085_msg7(Config) when list(Config) -> +flex_pretty_otp5085_msg7(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg7 -> entry", []), @@ -4100,7 +4190,7 @@ flex_pretty_otp5085_msg8(suite) -> []; -flex_pretty_otp5085_msg8(Config) when list(Config) -> +flex_pretty_otp5085_msg8(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg8 -> entry", []), @@ -4116,7 +4206,7 @@ %% flex_pretty_otp5600_msg1(suite) -> []; -flex_pretty_otp5600_msg1(Config) when list(Config) -> +flex_pretty_otp5600_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5600_msg1 -> entry", []), @@ -4129,7 +4219,7 @@ flex_pretty_otp5600_msg2(suite) -> []; -flex_pretty_otp5600_msg2(Config) when list(Config) -> +flex_pretty_otp5600_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5600_msg2 -> entry", []), @@ -4145,7 +4235,7 @@ %% flex_pretty_otp5601_msg1(suite) -> []; -flex_pretty_otp5601_msg1(Config) when list(Config) -> +flex_pretty_otp5601_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5601_msg1 -> entry", []), @@ -4161,7 +4251,7 @@ %% flex_pretty_otp5793_msg01(suite) -> []; -flex_pretty_otp5793_msg01(Config) when list(Config) -> +flex_pretty_otp5793_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5793_msg01 -> entry", []), @@ -4177,7 +4267,7 @@ %% flex_pretty_otp5803_msg01(suite) -> []; -flex_pretty_otp5803_msg01(Config) when list(Config) -> +flex_pretty_otp5803_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5803_msg01 -> entry", []), @@ -4190,7 +4280,7 @@ flex_pretty_otp5803_msg02(suite) -> []; -flex_pretty_otp5803_msg02(Config) when list(Config) -> +flex_pretty_otp5803_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5803_msg02 -> entry", []), @@ -4206,7 +4296,7 @@ %% flex_pretty_otp5805_msg01(suite) -> []; -flex_pretty_otp5805_msg01(Config) when list(Config) -> +flex_pretty_otp5805_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5805_msg01 -> entry", []), @@ -4222,7 +4312,7 @@ %% flex_pretty_otp5836_msg01(suite) -> []; -flex_pretty_otp5836_msg01(Config) when list(Config) -> +flex_pretty_otp5836_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5836_msg01 -> entry", []), @@ -4236,7 +4326,7 @@ flex_pretty_otp7431_msg01(suite) -> []; -flex_pretty_otp7431_msg01(Config) when list(Config) -> +flex_pretty_otp7431_msg01(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -4244,7 +4334,7 @@ flex_pretty_otp7431_msg02(suite) -> []; -flex_pretty_otp7431_msg02(Config) when list(Config) -> +flex_pretty_otp7431_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp7431_msg02 -> entry", []), @@ -4254,7 +4344,7 @@ flex_pretty_otp7431_msg03(suite) -> []; -flex_pretty_otp7431_msg03(Config) when list(Config) -> +flex_pretty_otp7431_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp7431_msg03 -> entry", []), @@ -4264,7 +4354,7 @@ flex_pretty_otp7431_msg04(suite) -> []; -flex_pretty_otp7431_msg04(Config) when list(Config) -> +flex_pretty_otp7431_msg04(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg04 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -4272,7 +4362,7 @@ flex_pretty_otp7431_msg05(suite) -> []; -flex_pretty_otp7431_msg05(Config) when list(Config) -> +flex_pretty_otp7431_msg05(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg05 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -4280,7 +4370,7 @@ flex_pretty_otp7431_msg06(suite) -> []; -flex_pretty_otp7431_msg06(Config) when list(Config) -> +flex_pretty_otp7431_msg06(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg06 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -4288,7 +4378,7 @@ flex_pretty_otp7431_msg07(suite) -> []; -flex_pretty_otp7431_msg07(Config) when list(Config) -> +flex_pretty_otp7431_msg07(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg07 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -4558,9 +4648,9 @@ msgs3_name(N) -> list_to_atom("rfc3525_" ++ atom_to_list(N)). -rfc3525_decode(M) when list(M) -> +rfc3525_decode(M) when is_list(M) -> rfc3525_decode(list_to_binary(M)); -rfc3525_decode(M) when binary(M) -> +rfc3525_decode(M) when is_binary(M) -> case (catch decode_message(megaco_pretty_text_encoder, false, ?EC, M)) of {ok, Msg} -> Msg; @@ -4803,7 +4893,7 @@ Actions = [Action], msg_reply(Mid, TransId, Actions). -msg_ack(Mid, [Range|_] = Ranges) when tuple(Range) -> +msg_ack(Mid, [Range|_] = Ranges) when is_tuple(Range) -> msg_ack(Mid, [Ranges]); msg_ack(Mid, Ranges) -> @@ -4904,7 +4994,7 @@ msg4() -> msg4(?MG1_MID_NO_PORT, "901 mg col boot"). -msg4(Mid, Reason) when list(Reason) -> +msg4(Mid, Reason) when is_list(Reason) -> Address = {portNumber, ?DEFAULT_PORT}, Profile = cre_SvcChProf("resgw",1), Parm = cre_SvcChParm(restart,Address,[Reason],Profile), @@ -5409,7 +5499,7 @@ msg40() -> msg40(?MG1_MID_NO_PORT, "901 mg col boot"). -msg40(Mid, Reason) when list(Reason) -> +msg40(Mid, Reason) when is_list(Reason) -> Address = {portNumber, ?DEFAULT_PORT}, Profile = cre_SvcChProf("resgw",1), Parm = cre_SvcChParm(restart,Address,[Reason],Profile), @@ -7450,7 +7540,7 @@ %% io:format("d", []), io:format("decoded:~n~p~n", [M2]), case (catch Codec:encode_message(Config, Ver, M2)) of - {ok, Bin2} when binary(Bin2) -> + {ok, Bin2} when is_binary(Bin2) -> %% io:format("e~n", []), io:format("encode: ~n~s~n", [erlang:binary_to_list(Bin2)]), {N,ok}; @@ -7843,7 +7933,7 @@ ?MSG_LIB:cre_IndAudTerminationStateDescriptor(PP, EBC, SS, SSS). cre_IndAudEvsDesc(RID, PN) - when integer(RID) -> + when is_integer(RID) -> ?MSG_LIB:cre_IndAudEventsDescriptor(RID, PN). cre_IndAudEvBufDesc(EN, SID) -> @@ -7984,7 +8074,7 @@ ?MSG_LIB:cre_DigitMapValue(Start, Short, Long, Body). %% Media related -cre_MediaDesc(SD) when record(SD, 'StreamDescriptor') -> +cre_MediaDesc(SD) when is_record(SD, 'StreamDescriptor') -> cre_MediaDesc([SD]); cre_MediaDesc(SDs) -> ?MSG_LIB:cre_MediaDescriptor(SDs). @@ -8092,8 +8182,8 @@ cre_SecReqEv(N, EPL) -> ?MSG_LIB:cre_SecondRequestedEvent(N, EPL). -cre_SecReqEv(N, SID, EA) when is_list(N) and - is_integer(SID) and +cre_SecReqEv(N, SID, EA) when is_list(N) andalso + is_integer(SID) andalso is_record(EA, 'SecondRequestedActions') -> cre_SecReqEv(N, SID, EA, []); cre_SecReqEv(A, B, C) -> diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_test_lib.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_test_lib.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_test_lib.erl 2009-03-12 12:31:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_test_lib.erl 2009-09-18 13:47:46.000000000 +0100 @@ -87,7 +87,7 @@ display_text_messages(V, EC, Msgs). -display_text_message(Name, EC, Msg, V) when tuple(Msg) -> +display_text_message(Name, EC, Msg, V) when is_tuple(Msg) -> io:format("~n(Erlang) message ~p:~n~p~n", [Name, Msg]), case (catch megaco_pretty_text_encoder:encode_message(EC,V,Msg)) of {'EXIT', _R} -> @@ -163,7 +163,7 @@ end. test_msgs(Codec, DynamicDecode, Ver, EC, Check, Msgs) - when function(Check), list(Msgs) -> + when is_function(Check) andalso is_list(Msgs) -> io:format("~n", []), test_msgs(Codec, DynamicDecode, Ver, EC, Check, Msgs, []). @@ -200,7 +200,7 @@ end. encode_decode(Func, Check, Codec, DynamicDecode, Ver, EC, Msg1) - when function(Func) -> + when is_function(Func) -> d("encode_decode -> entry with" "~n Func: ~p" "~n Check: ~p" @@ -288,7 +288,7 @@ M2 = M1#'MegacoMessage'{mess = Mess2}, encode_message(Codec, Ver, EC, M2). -encode_transactions(Codec, Ver, EC, Trans) when list(Trans) -> +encode_transactions(Codec, Ver, EC, Trans) when is_list(Trans) -> d("encode_transactions -> entry"), [encode_transaction(Codec, Ver, EC, T) || T <- Trans]. @@ -322,7 +322,7 @@ M2 = M1#'MegacoMessage'{mess = Mess2}, encode_message(Codec, Ver, EC, M2). -encode_actions(Codec, Ver, EC, Trans) when list(Trans) -> +encode_actions(Codec, Ver, EC, Trans) when is_list(Trans) -> d("encode_actions -> entry"), [encode_actions1(Codec, Ver, EC, T) || T <- Trans]. @@ -362,7 +362,7 @@ M2 = M1#'MegacoMessage'{mess = Mess2}, encode_message(Codec, Ver, EC, M2). -encode_action(Codec, Ver, EC, Trans) when list(Trans) -> +encode_action(Codec, Ver, EC, Trans) when is_list(Trans) -> d("encode_action -> entry"), [encode_action1(Codec, Ver, EC, T) || T <- Trans]. @@ -437,7 +437,7 @@ %% ------------------------------------------------------------------ expect_instruction(Desc, Cmd, Verify) - when is_list(Desc) and is_function(Cmd) and is_function(Verify) -> + when is_list(Desc) andalso is_function(Cmd) andalso is_function(Verify) -> #expect_instruction{description = Desc, command = Cmd, verify = Verify}. @@ -454,7 +454,7 @@ %% ------------------------------------------------------------------ expect_encode(InitialData, Encode, Check) - when is_function(Encode) and is_function(Check) -> + when is_function(Encode) andalso is_function(Check) -> Instructions = [ %% Initial encode @@ -494,7 +494,7 @@ %% ------------------------------------------------------------------ expect_encode_only(InitialData, Encode, Check) - when is_function(Encode) and is_function(Check) -> + when is_function(Encode) andalso is_function(Check) -> Instructions = [ %% Initial encode @@ -532,7 +532,9 @@ %% ------------------------------------------------------------------ expect_encode_decode(InitialData, Encode, Decode, Check) - when is_function(Encode) and is_function(Decode) and is_function(Check) -> + when is_function(Encode) andalso + is_function(Decode) andalso + is_function(Check) -> Instructions = [ %% Initial encode @@ -595,7 +597,9 @@ %% ------------------------------------------------------------------ expect_encode_decode_only(InitialData, Encode, Decode, Check) - when is_function(Encode) and is_function(Decode) and is_function(Check) -> + when is_function(Encode) andalso + is_function(Decode) andalso + is_function(Check) -> Instructions = [ %% Initial encode @@ -671,7 +675,7 @@ when is_list(InitialData) -> expect_decode(list_to_binary(InitialData), Decode, Check); expect_decode(InitialData, Decode, Check) - when is_function(Decode) and is_function(Check) -> + when is_function(Decode) andalso is_function(Check) -> Instructions = [ %% Initial decode @@ -715,7 +719,7 @@ when is_list(InitialData) -> expect_decode_only(list_to_binary(InitialData), Decode, Check); expect_decode_only(InitialData, Decode, Check) - when is_function(Decode) and is_function(Check) -> + when is_function(Decode) andalso is_function(Check) -> Instructions = [ %% Initial decode @@ -778,7 +782,9 @@ when is_list(InitialData) -> expect_decode_encode(list_to_binary(InitialData), Decode, Encode, Check); expect_decode_encode(InitialData, Decode, Encode, Check) - when is_function(Decode) and is_function(Encode) and is_function(Check) -> + when is_function(Decode) andalso + is_function(Encode) andalso + is_function(Check) -> Instructions = [ %% Initial decode @@ -889,7 +895,9 @@ expect_decode_encode_only(list_to_binary(InitialData), Decode, Encode, Check); expect_decode_encode_only(InitialData, Decode, Encode, Check) - when is_function(Decode) and is_function(Encode) and is_function(Check) -> + when is_function(Decode) andalso + is_function(Encode) andalso + is_function(Check) -> Instructions = [ %% Initial decode diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_v2_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_v2_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_v2_test.erl 2009-03-12 12:31:21.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_v2_test.erl 2009-09-18 15:13:07.000000000 +0100 @@ -425,7 +425,7 @@ case (catch apply(?MODULE,Case,[suite])) of [] -> expand(Cases, [Case|Acc]); - C when list(C) -> + C when is_list(C) -> expand(Cases, [expand(C, [])|Acc]); _ -> expand(Cases, [Case|Acc]) @@ -758,7 +758,7 @@ pretty_test_msgs(suite) -> []; -pretty_test_msgs(Config) when list(Config) -> +pretty_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1() ++ msgs2() ++ msgs3() ++ msgs4() ++ msgs5(), %% Msgs = msgs5(), @@ -777,7 +777,7 @@ flex_pretty_test_msgs(suite) -> []; -flex_pretty_test_msgs(Config) when list(Config) -> +flex_pretty_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1() ++ msgs2() ++ msgs3() ++ msgs4(), Conf = flex_scanner_conf(Config), @@ -787,7 +787,7 @@ flex_pretty_otp5042_msg1(suite) -> []; -flex_pretty_otp5042_msg1(Config) when list(Config) -> +flex_pretty_otp5042_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5042_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp5042_msg1(), @@ -813,7 +813,7 @@ flex_pretty_otp5085_msg1(suite) -> []; -flex_pretty_otp5085_msg1(Config) when list(Config) -> +flex_pretty_otp5085_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -821,7 +821,7 @@ flex_pretty_otp5085_msg2(suite) -> []; -flex_pretty_otp5085_msg2(Config) when list(Config) -> +flex_pretty_otp5085_msg2(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -829,7 +829,7 @@ flex_pretty_otp5085_msg3(suite) -> []; -flex_pretty_otp5085_msg3(Config) when list(Config) -> +flex_pretty_otp5085_msg3(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -837,7 +837,7 @@ flex_pretty_otp5085_msg4(suite) -> []; -flex_pretty_otp5085_msg4(Config) when list(Config) -> +flex_pretty_otp5085_msg4(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -845,7 +845,7 @@ flex_pretty_otp5085_msg5(suite) -> []; -flex_pretty_otp5085_msg5(Config) when list(Config) -> +flex_pretty_otp5085_msg5(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -853,7 +853,7 @@ flex_pretty_otp5085_msg6(suite) -> []; -flex_pretty_otp5085_msg6(Config) when list(Config) -> +flex_pretty_otp5085_msg6(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -861,7 +861,7 @@ flex_pretty_otp5085_msg7(suite) -> []; -flex_pretty_otp5085_msg7(Config) when list(Config) -> +flex_pretty_otp5085_msg7(Config) when is_list(Config) -> d("flex_pretty_otp5085_msg7 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -869,7 +869,7 @@ flex_pretty_otp5600_msg1(suite) -> []; -flex_pretty_otp5600_msg1(Config) when list(Config) -> +flex_pretty_otp5600_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5600_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -877,7 +877,7 @@ flex_pretty_otp5600_msg2(suite) -> []; -flex_pretty_otp5600_msg2(Config) when list(Config) -> +flex_pretty_otp5600_msg2(Config) when is_list(Config) -> d("flex_pretty_otp5600_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -885,7 +885,7 @@ flex_pretty_otp5601_msg1(suite) -> []; -flex_pretty_otp5601_msg1(Config) when list(Config) -> +flex_pretty_otp5601_msg1(Config) when is_list(Config) -> d("flex_pretty_otp5601_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -893,7 +893,7 @@ flex_pretty_otp5793_msg01(suite) -> []; -flex_pretty_otp5793_msg01(Config) when list(Config) -> +flex_pretty_otp5793_msg01(Config) when is_list(Config) -> d("flex_pretty_otp5793_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -902,7 +902,7 @@ flex_pretty_otp7431_msg01(suite) -> []; -flex_pretty_otp7431_msg01(Config) when list(Config) -> +flex_pretty_otp7431_msg01(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -910,7 +910,7 @@ flex_pretty_otp7431_msg02(suite) -> []; -flex_pretty_otp7431_msg02(Config) when list(Config) -> +flex_pretty_otp7431_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp7431_msg02 -> entry", []), @@ -920,7 +920,7 @@ flex_pretty_otp7431_msg03(suite) -> []; -flex_pretty_otp7431_msg03(Config) when list(Config) -> +flex_pretty_otp7431_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp7431_msg03 -> entry", []), @@ -930,7 +930,7 @@ flex_pretty_otp7431_msg04(suite) -> []; -flex_pretty_otp7431_msg04(Config) when list(Config) -> +flex_pretty_otp7431_msg04(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg04 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -938,7 +938,7 @@ flex_pretty_otp7431_msg05(suite) -> []; -flex_pretty_otp7431_msg05(Config) when list(Config) -> +flex_pretty_otp7431_msg05(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg05 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -946,7 +946,7 @@ flex_pretty_otp7431_msg06(suite) -> []; -flex_pretty_otp7431_msg06(Config) when list(Config) -> +flex_pretty_otp7431_msg06(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg06 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -954,7 +954,7 @@ flex_pretty_otp7431_msg07(suite) -> []; -flex_pretty_otp7431_msg07(Config) when list(Config) -> +flex_pretty_otp7431_msg07(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg07 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -1118,7 +1118,7 @@ compact_test_msgs(suite) -> []; -compact_test_msgs(Config) when list(Config) -> +compact_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1() ++ msgs2() ++ msgs3() ++ msgs4(), DynamicDecode = false, @@ -1136,7 +1136,7 @@ flex_compact_test_msgs(suite) -> []; -flex_compact_test_msgs(Config) when list(Config) -> +flex_compact_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1() ++ msgs2() ++ msgs3() ++ msgs4(), Conf = flex_scanner_conf(Config), @@ -1146,13 +1146,13 @@ flex_compact_dm_timers1(suite) -> []; -flex_compact_dm_timers1(Config) when list(Config) -> +flex_compact_dm_timers1(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("1", "2", "3"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers1 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1164,13 +1164,13 @@ flex_compact_dm_timers2(suite) -> []; -flex_compact_dm_timers2(Config) when list(Config) -> +flex_compact_dm_timers2(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("02", "03", "04"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers2 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1182,13 +1182,13 @@ flex_compact_dm_timers3(suite) -> []; -flex_compact_dm_timers3(Config) when list(Config) -> +flex_compact_dm_timers3(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("1", "02", "31"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers3 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1200,13 +1200,13 @@ flex_compact_dm_timers4(suite) -> []; -flex_compact_dm_timers4(Config) when list(Config) -> +flex_compact_dm_timers4(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("10", "21", "99"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers4 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1218,13 +1218,13 @@ flex_compact_dm_timers5(suite) -> []; -flex_compact_dm_timers5(Config) when list(Config) -> +flex_compact_dm_timers5(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("99", "23", "11"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers5 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1236,13 +1236,13 @@ flex_compact_dm_timers6(suite) -> []; -flex_compact_dm_timers6(Config) when list(Config) -> +flex_compact_dm_timers6(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("77", "09", "1"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers6 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1254,13 +1254,13 @@ flex_compact_dm_timers7(suite) -> []; -flex_compact_dm_timers7(Config) when list(Config) -> +flex_compact_dm_timers7(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("77", "09", "1", "99"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers7 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1272,13 +1272,13 @@ flex_compact_dm_timers8(suite) -> []; -flex_compact_dm_timers8(Config) when list(Config) -> +flex_compact_dm_timers8(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("01", "09", "01", "02"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers8 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -1312,13 +1312,13 @@ exit({invalid_timer_values, {TMRs, TMRs1}}) end. -get_dm_timers({transactions, T}) when list(T) -> +get_dm_timers({transactions, T}) when is_list(T) -> get_dm_timers1(T); get_dm_timers(Other) -> {error, {invalid_transactions, Other}}. get_dm_timers1([{transactionRequest,T}|Ts]) - when record(T,'TransactionRequest') -> + when is_record(T,'TransactionRequest') -> case get_dm_timers2(T) of {ok, Timers} -> Timers; @@ -1331,11 +1331,11 @@ {error, {no_timers, 'TransactionRequest'}}. -get_dm_timers2(#'TransactionRequest'{actions = Actions}) when list(Actions) -> +get_dm_timers2(#'TransactionRequest'{actions = Actions}) when is_list(Actions) -> get_dm_timers3(Actions). -get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when list(Cmds) -> +get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when is_list(Cmds) -> case get_dm_timers4(Cmds) of {ok, Timers} -> {ok, Timers}; @@ -1391,7 +1391,7 @@ bin_test_msgs(suite) -> []; -bin_test_msgs(Config) when list(Config) -> +bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1() ++ msgs4(), DynamicDecode = false, @@ -1402,7 +1402,7 @@ ber_test_msgs(suite) -> []; -ber_test_msgs(Config) when list(Config) -> +ber_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1() ++ msgs4(), DynamicDecode = false, @@ -1413,7 +1413,7 @@ ber_bin_test_msgs(suite) -> []; -ber_bin_test_msgs(Config) when list(Config) -> +ber_bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1() ++ msgs4(), DynamicDecode = true, @@ -1424,7 +1424,7 @@ per_test_msgs(suite) -> []; -per_test_msgs(Config) when list(Config) -> +per_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1() ++ msgs4(), DynamicDecode = false, @@ -1435,7 +1435,7 @@ per_bin_test_msgs(suite) -> []; -per_bin_test_msgs(Config) when list(Config) -> +per_bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1() ++ msgs4(), DynamicDecode = false, @@ -1446,7 +1446,7 @@ erl_dist_m_test_msgs(suite) -> []; -erl_dist_m_test_msgs(Config) when list(Config) -> +erl_dist_m_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1() ++ msgs2() ++ msgs3() ++ msgs4(), DynamicDecode = false, @@ -1464,7 +1464,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg1(suite) -> []; -compact_otp4011_msg1(Config) when list(Config) -> +compact_otp4011_msg1(Config) when is_list(Config) -> % put(severity,trc), % put(dbg,true), d("compact_otp4011_msg1 -> entry", []), @@ -1480,7 +1480,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg2(suite) -> []; -compact_otp4011_msg2(Config) when list(Config) -> +compact_otp4011_msg2(Config) when is_list(Config) -> d("compact_otp4011_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), M = "!/" ?VERSION_STR " ML T=233350{C=${A=stedevice/01{M{O{MO=SO,RV=OFF,RG=OFF,tdmc/ec=OFF,MO=SR}}}}}", @@ -1493,7 +1493,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg3(suite) -> []; -compact_otp4011_msg3(Config) when list(Config) -> +compact_otp4011_msg3(Config) when is_list(Config) -> d("compact_otp4011_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), M = "!/" ?VERSION_STR " ML T=233350{C=${A=stedevice/01{M{O{MO=SR,RV=OFF,RG=OFF,tdmc/ec=OFF,MO=SO}}}}}", @@ -1509,7 +1509,7 @@ case decode_message(megaco_compact_text_encoder, false, [], Bin) of {ok, _} -> exit({decoded_erroneous_message,M}); - {error, Error} when list(Error) -> % Expected result + {error, Error} when is_list(Error) -> % Expected result d("compact_otp4011 -> expected error result (so far)", []), case lists:keysearch(reason,1,Error) of {value, {reason,Reason}} -> @@ -1518,7 +1518,7 @@ case Reason of {0, megaco_text_parser_v2, {do_merge_control_streamParms, [A,B]}} - when list(A), record(B, 'LocalControlDescriptor') -> + when is_list(A) andalso is_record(B, 'LocalControlDescriptor') -> case lists:keysearch(mode,1,A) of {value, {mode, Mode}} when B#'LocalControlDescriptor'.streamMode /= asn1_NOVALUE -> @@ -1547,7 +1547,7 @@ %% MEGCAO instead of the correct MEGACO. compact_otp4013_msg1(suite) -> []; -compact_otp4013_msg1(Config) when list(Config) -> +compact_otp4013_msg1(Config) when is_list(Config) -> d("compact_otp4013_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), M = "MEGCAO/2 MG1 T=12345678{C=-{SC=root{SV{MT=RS,RE=901}}}}", @@ -1572,7 +1572,7 @@ %% compact_otp4085_msg1(suite) -> []; -compact_otp4085_msg1(Config) when list(Config) -> +compact_otp4085_msg1(Config) when is_list(Config) -> d("compact_otp4085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), M = compact_otp4085_erroneous_msg(), @@ -1580,7 +1580,7 @@ case decode_message(megaco_compact_text_encoder, false, [], Bin) of {ok, M} -> exit({decoded_erroneous_message,M}); - {error, Error} when list(Error) -> % Expected result + {error, Error} when is_list(Error) -> % Expected result t("compact_otp4085_msg1 -> decode failed", []), case lists:keysearch(reason, 1, Error) of {value, {reason,{999999, Module, Crap}}} -> @@ -1609,7 +1609,7 @@ %% compact_otp4085_msg1 is actually ok when you add '}' at the end. compact_otp4085_msg2(suite) -> []; -compact_otp4085_msg2(Config) when list(Config) -> +compact_otp4085_msg2(Config) when is_list(Config) -> d("compact_otp4085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), M1 = compact_otp4085_erroneous_msg() ++ "}", @@ -1642,14 +1642,14 @@ %% compact_otp4280_msg1(suite) -> []; -compact_otp4280_msg1(Config) when list(Config) -> +compact_otp4280_msg1(Config) when is_list(Config) -> d("compact_otp4280_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Bin = list_to_binary(compact_otp4280_msg()), case decode_message(megaco_compact_text_encoder, false, [], Bin) of {ok, _Msg} -> ok; - {error, Error} when list(Error) -> + {error, Error} when is_list(Error) -> t("compact_otp4280_msg1 -> decode failed", []), case lists:keysearch(reason, 1, Error) of {value, {reason,{Line, Module, Reason} = R}} -> @@ -1679,7 +1679,7 @@ %% This ticket is about comments in a message compact_otp4299_msg1(suite) -> []; -compact_otp4299_msg1(Config) when list(Config) -> +compact_otp4299_msg1(Config) when is_list(Config) -> d("compact_otp4299_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Bin = list_to_binary(compact_otp4299_msg()), @@ -1698,7 +1698,7 @@ %% Same message, but this time decoded using the flex scanner compact_otp4299_msg2(suite) -> []; -compact_otp4299_msg2(Config) when list(Config) -> +compact_otp4299_msg2(Config) when is_list(Config) -> d("compact_otp4299_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), @@ -1757,7 +1757,7 @@ %% compact_otp4359_msg1(suite) -> []; -compact_otp4359_msg1(Config) when list(Config) -> +compact_otp4359_msg1(Config) when is_list(Config) -> d("compact_otp4359_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Bin = list_to_binary(compact_otp4359_msg()), @@ -1786,7 +1786,7 @@ %% compact_otp4920_msg0(suite) -> []; -compact_otp4920_msg0(Config) when list(Config) -> +compact_otp4920_msg0(Config) when is_list(Config) -> d("compact_otp4920_msg0 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1794,7 +1794,7 @@ compact_otp4920_msg1(suite) -> []; -compact_otp4920_msg1(Config) when list(Config) -> +compact_otp4920_msg1(Config) when is_list(Config) -> d("compact_otp4920_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1802,42 +1802,42 @@ compact_otp4920_msg2(suite) -> []; -compact_otp4920_msg2(Config) when list(Config) -> +compact_otp4920_msg2(Config) when is_list(Config) -> d("compact_otp4920_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg2(), false). compact_otp4920_msg3(suite) -> []; -compact_otp4920_msg3(Config) when list(Config) -> +compact_otp4920_msg3(Config) when is_list(Config) -> d("compact_otp4920_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg3(), true). compact_otp4920_msg4(suite) -> []; -compact_otp4920_msg4(Config) when list(Config) -> +compact_otp4920_msg4(Config) when is_list(Config) -> d("compact_otp4920_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg4(), true). compact_otp4920_msg5(suite) -> []; -compact_otp4920_msg5(Config) when list(Config) -> +compact_otp4920_msg5(Config) when is_list(Config) -> d("compact_otp4920_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg5(), true). compact_otp4920_msg6(suite) -> []; -compact_otp4920_msg6(Config) when list(Config) -> +compact_otp4920_msg6(Config) when is_list(Config) -> d("compact_otp4920_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg6(), true). compact_otp4920_msg7(suite) -> []; -compact_otp4920_msg7(Config) when list(Config) -> +compact_otp4920_msg7(Config) when is_list(Config) -> d("compact_otp4920_msg7 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1845,7 +1845,7 @@ compact_otp4920_msg8(suite) -> []; -compact_otp4920_msg8(Config) when list(Config) -> +compact_otp4920_msg8(Config) when is_list(Config) -> d("compact_otp4920_msg8 -> entry", []), ?ACQUIRE_NODES(1, Config), % put(dbg,true), @@ -1853,28 +1853,28 @@ compact_otp4920_msg9(suite) -> []; -compact_otp4920_msg9(Config) when list(Config) -> +compact_otp4920_msg9(Config) when is_list(Config) -> d("compact_otp4920_msg9 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg9(), false). compact_otp4920_msg10(suite) -> []; -compact_otp4920_msg10(Config) when list(Config) -> +compact_otp4920_msg10(Config) when is_list(Config) -> d("compact_otp4920_msg10 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg10(), false). compact_otp4920_msg11(suite) -> []; -compact_otp4920_msg11(Config) when list(Config) -> +compact_otp4920_msg11(Config) when is_list(Config) -> d("compact_otp4920_msg11 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg11(), false). compact_otp4920_msg12(suite) -> []; -compact_otp4920_msg12(Config) when list(Config) -> +compact_otp4920_msg12(Config) when is_list(Config) -> d("compact_otp4920_msg12 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_1(compact_otp4920_msg12(), true). @@ -1882,7 +1882,7 @@ %% Duplicate padding compact_otp4920_msg20(suite) -> []; -compact_otp4920_msg20(Config) when list(Config) -> +compact_otp4920_msg20(Config) when is_list(Config) -> d("compact_otp4920_msg20 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg20(), bad_mid_duplicate_padding). @@ -1890,7 +1890,7 @@ %% Length compact_otp4920_msg21(suite) -> []; -compact_otp4920_msg21(Config) when list(Config) -> +compact_otp4920_msg21(Config) when is_list(Config) -> d("compact_otp4920_msg21 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg21(), bad_mid_ip6addr_length). @@ -1898,7 +1898,7 @@ %% Length compact_otp4920_msg22(suite) -> []; -compact_otp4920_msg22(Config) when list(Config) -> +compact_otp4920_msg22(Config) when is_list(Config) -> d("compact_otp4920_msg22 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg22(), bad_mid_ip6addr_length). @@ -1906,7 +1906,7 @@ %% Length compact_otp4920_msg23(suite) -> []; -compact_otp4920_msg23(Config) when list(Config) -> +compact_otp4920_msg23(Config) when is_list(Config) -> d("compact_otp4920_msg23 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg23(), bad_mid_ip6addr_length). @@ -1914,7 +1914,7 @@ %% Length compact_otp4920_msg24(suite) -> []; -compact_otp4920_msg24(Config) when list(Config) -> +compact_otp4920_msg24(Config) when is_list(Config) -> d("compact_otp4920_msg24 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg24(), bad_mid_ip6addr_length). @@ -1922,7 +1922,7 @@ %% Length compact_otp4920_msg25(suite) -> []; -compact_otp4920_msg25(Config) when list(Config) -> +compact_otp4920_msg25(Config) when is_list(Config) -> d("compact_otp4920_msg25 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp4920_msg_2(compact_otp4920_msg25(), bad_mid_ip6addr_length). @@ -1936,7 +1936,7 @@ {ok, Bin1} -> io:format(", encoded - equal:", []), ok; - {ok, Bin2} when binary(Bin2), CheckEqual == true -> + {ok, Bin2} when is_binary(Bin2) andalso (CheckEqual =:= true) -> M2 = binary_to_list(Bin2), io:format(", encoded - not equal:", []), exit({messages_not_equal, M1, M2}); @@ -2065,42 +2065,42 @@ compact_otp5186_msg01(suite) -> []; -compact_otp5186_msg01(Config) when list(Config) -> +compact_otp5186_msg01(Config) when is_list(Config) -> d("compact_otp5186_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_1(compact_otp5186_msg01(), error, ignore). compact_otp5186_msg02(suite) -> []; -compact_otp5186_msg02(Config) when list(Config) -> +compact_otp5186_msg02(Config) when is_list(Config) -> d("compact_otp5186_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_1(compact_otp5186_msg02(), ok, ok). compact_otp5186_msg03(suite) -> []; -compact_otp5186_msg03(Config) when list(Config) -> +compact_otp5186_msg03(Config) when is_list(Config) -> d("compact_otp5186_msg03 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg03(), ok, ok). compact_otp5186_msg04(suite) -> []; -compact_otp5186_msg04(Config) when list(Config) -> +compact_otp5186_msg04(Config) when is_list(Config) -> d("compact_otp5186_msg04 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg04(), ok, ok). compact_otp5186_msg05(suite) -> []; -compact_otp5186_msg05(Config) when list(Config) -> +compact_otp5186_msg05(Config) when is_list(Config) -> d("compact_otp5186_msg05 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg05(), ok, ok). compact_otp5186_msg06(suite) -> []; -compact_otp5186_msg06(Config) when list(Config) -> +compact_otp5186_msg06(Config) when is_list(Config) -> d("compact_otp5186_msg06 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5186_msg_2(compact_otp5186_msg06(), ok, ok). @@ -2576,14 +2576,14 @@ compact_otp5290_msg01(suite) -> []; -compact_otp5290_msg01(Config) when list(Config) -> +compact_otp5290_msg01(Config) when is_list(Config) -> d("compact_otp5290_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5290_msg_1(compact_otp5290_msg01(), ok, ok). compact_otp5290_msg02(suite) -> []; -compact_otp5290_msg02(Config) when list(Config) -> +compact_otp5290_msg02(Config) when is_list(Config) -> d("compact_otp5290_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5290_msg_1(compact_otp5290_msg02(), error, ignore). @@ -2629,7 +2629,7 @@ compact_otp5793_msg01(suite) -> []; -compact_otp5793_msg01(Config) when list(Config) -> +compact_otp5793_msg01(Config) when is_list(Config) -> d("compact_otp5793_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5793(ok, pretty_otp5793_msg1()). @@ -2642,21 +2642,21 @@ compact_otp5993_msg01(suite) -> []; -compact_otp5993_msg01(Config) when list(Config) -> +compact_otp5993_msg01(Config) when is_list(Config) -> d("compact_otp5993_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5993(ok, compact_otp5993_msg01()). compact_otp5993_msg02(suite) -> []; -compact_otp5993_msg02(Config) when list(Config) -> +compact_otp5993_msg02(Config) when is_list(Config) -> d("compact_otp5993_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5993(ok, compact_otp5993_msg02()). compact_otp5993_msg03(suite) -> []; -compact_otp5993_msg03(Config) when list(Config) -> +compact_otp5993_msg03(Config) when is_list(Config) -> d("compact_otp5993_msg03 -> entry", []), ?ACQUIRE_NODES(1, Config), compact_otp5993(ok, compact_otp5993_msg03()). @@ -2721,7 +2721,7 @@ compact_otp6017_msg01(suite) -> []; -compact_otp6017_msg01(Config) when list(Config) -> +compact_otp6017_msg01(Config) when is_list(Config) -> d("compact_otp6017_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(0), @@ -2729,7 +2729,7 @@ compact_otp6017_msg02(suite) -> []; -compact_otp6017_msg02(Config) when list(Config) -> +compact_otp6017_msg02(Config) when is_list(Config) -> d("compact_otp6017_msg02 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(16#FFFFFFFE), @@ -2737,7 +2737,7 @@ compact_otp6017_msg03(suite) -> []; -compact_otp6017_msg03(Config) when list(Config) -> +compact_otp6017_msg03(Config) when is_list(Config) -> d("compact_otp6017_msg03 -> entry", []), ?ACQUIRE_NODES(1, Config), ok = compact_otp6017(16#FFFFFFFF), @@ -2773,7 +2773,7 @@ compact_otp7138_msg01(suite) -> []; -compact_otp7138_msg01(Config) when list(Config) -> +compact_otp7138_msg01(Config) when is_list(Config) -> %% put(dbg, true), %% put(severity, trc), d("compact_otp7138_msg01 -> entry", []), @@ -2785,7 +2785,7 @@ compact_otp7138_msg02(suite) -> []; -compact_otp7138_msg02(Config) when list(Config) -> +compact_otp7138_msg02(Config) when is_list(Config) -> %% put(dbg, true), %% put(severity, trc), d("compact_otp7138_msg02 -> entry", []), @@ -2908,7 +2908,7 @@ compact_otp7576_msg01(suite) -> []; -compact_otp7576_msg01(Config) when list(Config) -> +compact_otp7576_msg01(Config) when is_list(Config) -> %% put(dbg, true), %% put(severity, trc), d("compact_otp7576_msg01 -> entry", []), @@ -3014,7 +3014,7 @@ flex_compact_otp7138_msg01(suite) -> []; -flex_compact_otp7138_msg01(Config) when list(Config) -> +flex_compact_otp7138_msg01(Config) when is_list(Config) -> %% put(dbg, true), %% put(severity, trc), d("flex_compact_otp7138_msg01 -> entry", []), @@ -3024,7 +3024,7 @@ flex_compact_otp7138_msg02(suite) -> []; -flex_compact_otp7138_msg02(Config) when list(Config) -> +flex_compact_otp7138_msg02(Config) when is_list(Config) -> %% put(dbg, true), %% put(severity, trc), d("flex_compact_otp7138_msg02 -> entry", []), @@ -3035,7 +3035,7 @@ flex_compact_otp7431_msg01(suite) -> []; -flex_compact_otp7431_msg01(Config) when list(Config) -> +flex_compact_otp7431_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg01 -> entry", []), @@ -3044,7 +3044,7 @@ flex_compact_otp7431_msg02(suite) -> []; -flex_compact_otp7431_msg02(Config) when list(Config) -> +flex_compact_otp7431_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg02 -> entry", []), @@ -3053,7 +3053,7 @@ flex_compact_otp7431_msg03(suite) -> []; -flex_compact_otp7431_msg03(Config) when list(Config) -> +flex_compact_otp7431_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg03 -> entry", []), @@ -3062,7 +3062,7 @@ flex_compact_otp7431_msg04(suite) -> []; -flex_compact_otp7431_msg04(Config) when list(Config) -> +flex_compact_otp7431_msg04(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg04 -> entry", []), @@ -3071,7 +3071,7 @@ flex_compact_otp7431_msg05(suite) -> []; -flex_compact_otp7431_msg05(Config) when list(Config) -> +flex_compact_otp7431_msg05(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg05 -> entry", []), @@ -3080,7 +3080,7 @@ flex_compact_otp7431_msg06(suite) -> []; -flex_compact_otp7431_msg06(Config) when list(Config) -> +flex_compact_otp7431_msg06(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg06 -> entry", []), @@ -3089,7 +3089,7 @@ flex_compact_otp7431_msg07(suite) -> []; -flex_compact_otp7431_msg07(Config) when list(Config) -> +flex_compact_otp7431_msg07(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg07 -> entry", []), @@ -3292,7 +3292,7 @@ flex_compact_otp7576_msg01(suite) -> []; -flex_compact_otp7576_msg01(Config) when list(Config) -> +flex_compact_otp7576_msg01(Config) when is_list(Config) -> %% put(dbg, true), %% put(severity, trc), d("flex_compact_otp7576_msg01 -> entry", []), @@ -3308,12 +3308,12 @@ pretty_otp4632_msg1(suite) -> []; -pretty_otp4632_msg1(Config) when list(Config) -> +pretty_otp4632_msg1(Config) when is_list(Config) -> d("pretty_otp4632_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg1(), case encode_message(megaco_pretty_text_encoder, [], Msg0) of - {ok, BinMsg} when binary(BinMsg) -> + {ok, BinMsg} when is_binary(BinMsg) -> {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, [], BinMsg), ok = chk_MegacoMessage(Msg0, Msg1); @@ -3328,12 +3328,12 @@ pretty_otp4632_msg2(suite) -> []; -pretty_otp4632_msg2(Config) when list(Config) -> +pretty_otp4632_msg2(Config) when is_list(Config) -> d("pretty_otp4632_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg2(), case encode_message(megaco_pretty_text_encoder, [], Msg0) of - {ok, BinMsg} when binary(BinMsg) -> + {ok, BinMsg} when is_binary(BinMsg) -> {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, [], BinMsg), ok = chk_MegacoMessage(Msg0,Msg1); @@ -3349,14 +3349,14 @@ pretty_otp4632_msg3(suite) -> []; -pretty_otp4632_msg3(Config) when list(Config) -> +pretty_otp4632_msg3(Config) when is_list(Config) -> d("pretty_otp4632_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg3(), Bin0 = list_to_binary(Msg0), case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of - {ok, Msg} when record(Msg, 'MegacoMessage') -> + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> {ok, Bin1} = encode_message(megaco_pretty_text_encoder, [], Msg), Msg1 = binary_to_list(Bin1), %% io:format("Msg1:~n~s~n", [Msg1]), @@ -3375,13 +3375,13 @@ pretty_otp4632_msg4(suite) -> []; -pretty_otp4632_msg4(Config) when list(Config) -> +pretty_otp4632_msg4(Config) when is_list(Config) -> d("pretty_otp4632_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4632_msg4(), Bin0 = list_to_binary(Msg0), case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of - {ok, Msg} when record(Msg, 'MegacoMessage') -> + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> {ok, Bin1} = encode_message(megaco_pretty_text_encoder, [], Msg), Msg1 = binary_to_list(Bin1), %% io:format("Msg1:~n~s~n", [Msg1]), @@ -3413,12 +3413,12 @@ pretty_otp4710_msg1(suite) -> []; -pretty_otp4710_msg1(Config) when list(Config) -> +pretty_otp4710_msg1(Config) when is_list(Config) -> d("pretty_otp4710_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4710_msg1(), case encode_message(megaco_pretty_text_encoder, [], Msg0) of - {ok, Bin} when binary(Bin) -> + {ok, Bin} when is_binary(Bin) -> {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, [], Bin), ok = chk_MegacoMessage(Msg0,Msg1); @@ -3434,13 +3434,13 @@ pretty_otp4710_msg2(suite) -> []; -pretty_otp4710_msg2(Config) when list(Config) -> +pretty_otp4710_msg2(Config) when is_list(Config) -> d("pretty_otp4710_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4710_msg2(), Bin0 = list_to_binary(Msg0), case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of - {ok, Msg} when record(Msg, 'MegacoMessage') -> + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> {ok, Bin1} = encode_message(megaco_pretty_text_encoder, [], Msg), Msg1 = binary_to_list(Bin1), %% io:format("Msg1:~n~s~n", [Msg1]), @@ -3478,7 +3478,7 @@ pretty_otp4945_msg1(suite) -> []; -pretty_otp4945_msg1(Config) when list(Config) -> +pretty_otp4945_msg1(Config) when is_list(Config) -> d("pretty_otp4945_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg1(), @@ -3516,7 +3516,7 @@ pretty_otp4945_msg2(suite) -> []; -pretty_otp4945_msg2(Config) when list(Config) -> +pretty_otp4945_msg2(Config) when is_list(Config) -> d("pretty_otp4945_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg2(), @@ -3553,7 +3553,7 @@ pretty_otp4945_msg3(suite) -> []; -pretty_otp4945_msg3(Config) when list(Config) -> +pretty_otp4945_msg3(Config) when is_list(Config) -> d("pretty_otp4945_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg3(), @@ -3591,7 +3591,7 @@ pretty_otp4945_msg4(suite) -> []; -pretty_otp4945_msg4(Config) when list(Config) -> +pretty_otp4945_msg4(Config) when is_list(Config) -> d("pretty_otp4945_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg4(), @@ -3622,7 +3622,7 @@ pretty_otp4945_msg5(suite) -> []; -pretty_otp4945_msg5(Config) when list(Config) -> +pretty_otp4945_msg5(Config) when is_list(Config) -> d("pretty_otp4945_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg5(), @@ -3662,7 +3662,7 @@ pretty_otp4945_msg6(suite) -> []; -pretty_otp4945_msg6(Config) when list(Config) -> +pretty_otp4945_msg6(Config) when is_list(Config) -> d("pretty_otp4945_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4945_msg6(), @@ -3702,7 +3702,7 @@ pretty_otp4949_msg1(suite) -> []; -pretty_otp4949_msg1(Config) when list(Config) -> +pretty_otp4949_msg1(Config) when is_list(Config) -> d("pretty_otp4949_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4949_msg1(), @@ -3731,7 +3731,7 @@ pretty_otp4949_msg2(suite) -> []; -pretty_otp4949_msg2(Config) when list(Config) -> +pretty_otp4949_msg2(Config) when is_list(Config) -> d("pretty_otp4949_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4949_msg2(), @@ -3769,7 +3769,7 @@ pretty_otp4949_msg3(suite) -> []; -pretty_otp4949_msg3(Config) when list(Config) -> +pretty_otp4949_msg3(Config) when is_list(Config) -> d("pretty_otp4949_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp4949_msg3(), @@ -3807,7 +3807,7 @@ pretty_otp5042_msg1(suite) -> []; -pretty_otp5042_msg1(Config) when list(Config) -> +pretty_otp5042_msg1(Config) when is_list(Config) -> d("pretty_otp5042_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg0 = pretty_otp5042_msg1(), @@ -3842,7 +3842,7 @@ pretty_otp5068_msg1(suite) -> []; -pretty_otp5068_msg1(Config) when list(Config) -> +pretty_otp5068_msg1(Config) when is_list(Config) -> d("pretty_otp5068_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), Msg = pretty_otp5068_msg1(), @@ -3898,49 +3898,49 @@ pretty_otp5085_msg1(suite) -> []; -pretty_otp5085_msg1(Config) when list(Config) -> +pretty_otp5085_msg1(Config) when is_list(Config) -> d("pretty_otp5085_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg1()). pretty_otp5085_msg2(suite) -> []; -pretty_otp5085_msg2(Config) when list(Config) -> +pretty_otp5085_msg2(Config) when is_list(Config) -> d("pretty_otp5085_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(error, pretty_otp5085_msg2()). pretty_otp5085_msg3(suite) -> []; -pretty_otp5085_msg3(Config) when list(Config) -> +pretty_otp5085_msg3(Config) when is_list(Config) -> d("pretty_otp5085_msg3 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg3()). pretty_otp5085_msg4(suite) -> []; -pretty_otp5085_msg4(Config) when list(Config) -> +pretty_otp5085_msg4(Config) when is_list(Config) -> d("pretty_otp5085_msg4 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg4()). pretty_otp5085_msg5(suite) -> []; -pretty_otp5085_msg5(Config) when list(Config) -> +pretty_otp5085_msg5(Config) when is_list(Config) -> d("pretty_otp5085_msg5 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg5()). pretty_otp5085_msg6(suite) -> []; -pretty_otp5085_msg6(Config) when list(Config) -> +pretty_otp5085_msg6(Config) when is_list(Config) -> d("pretty_otp5085_msg6 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg6()). pretty_otp5085_msg7(suite) -> []; -pretty_otp5085_msg7(Config) when list(Config) -> +pretty_otp5085_msg7(Config) when is_list(Config) -> d("pretty_otp5085_msg7 -> entry", []), ?ACQUIRE_NODES(1, Config), pretty_otp5085(ok, pretty_otp5085_msg7()). @@ -4178,7 +4178,7 @@ pretty_otp5600_msg1(suite) -> []; -pretty_otp5600_msg1(Config) when list(Config) -> +pretty_otp5600_msg1(Config) when is_list(Config) -> d("pretty_otp5600_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -4187,7 +4187,7 @@ pretty_otp5600_msg2(suite) -> []; -pretty_otp5600_msg2(Config) when list(Config) -> +pretty_otp5600_msg2(Config) when is_list(Config) -> d("pretty_otp5600_msg2 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -4310,7 +4310,7 @@ pretty_otp5601_msg1(suite) -> []; -pretty_otp5601_msg1(Config) when list(Config) -> +pretty_otp5601_msg1(Config) when is_list(Config) -> d("pretty_otp5601_msg1 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -4395,7 +4395,7 @@ pretty_otp5793_msg01(suite) -> []; -pretty_otp5793_msg01(Config) when list(Config) -> +pretty_otp5793_msg01(Config) when is_list(Config) -> d("pretty_otp5793_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), %% put(severity,trc), @@ -5044,9 +5044,9 @@ msgs3_name(N) -> list_to_atom("rfc3525_" ++ atom_to_list(N)). -rfc3525_decode(M) when list(M) -> +rfc3525_decode(M) when is_list(M) -> rfc3525_decode(list_to_binary(M)); -rfc3525_decode(M) when binary(M) -> +rfc3525_decode(M) when is_binary(M) -> case (catch decode_message(megaco_pretty_text_encoder, false, [], M)) of {ok, Msg} -> Msg; @@ -5189,7 +5189,7 @@ Mess = ?MSG_LIB:cre_Message(?VERSION, Mid, [Trans]), ?MSG_LIB:cre_MegacoMessage(Mess). -msg_ack(Mid, [Range|_] = Ranges) when tuple(Range) -> +msg_ack(Mid, [Range|_] = Ranges) when is_tuple(Range) -> msg_ack(Mid, [Ranges]); msg_ack(Mid, Ranges) -> @@ -5289,7 +5289,7 @@ msg4() -> msg4(?MG1_MID_NO_PORT, "901 mg col boot"). -msg4(Mid, Reason) when list(Reason) -> +msg4(Mid, Reason) when is_list(Reason) -> Address = {portNumber, ?DEFAULT_PORT}, Profile = cre_SvcChProf("resgw",1), Parm = cre_SvcChParm(restart,Address,[Reason],Profile), @@ -5796,7 +5796,7 @@ msg40() -> msg40(?MG1_MID_NO_PORT, "901 mg col boot"). -msg40(Mid, Reason) when list(Reason) -> +msg40(Mid, Reason) when is_list(Reason) -> Address = {portNumber, ?DEFAULT_PORT}, Profile = cre_SvcChProf("resgw",1), Parm = cre_SvcChParm(restart,Address,[Reason],Profile), @@ -6615,7 +6615,7 @@ %% io:format("d", []), io:format("decoded:~n~p~n", [M2]), case (catch Codec:encode_message(Config, Ver, M2)) of - {ok, Bin2} when binary(Bin2) -> + {ok, Bin2} when is_binary(Bin2) -> %% io:format("e~n", []), io:format("encode: ~n~s~n", [erlang:binary_to_list(Bin2)]), {N,ok}; @@ -6740,7 +6740,7 @@ ?MSG_LIB:cre_IndAudTerminationStateDescriptor(PP, EBC, SS). cre_IndAudEvsDesc(RID, PN) - when integer(RID) -> + when is_integer(RID) -> ?MSG_LIB:cre_IndAudEventsDescriptor(RID, PN). cre_IndAudEvBufDesc(EN, SID) -> @@ -6854,7 +6854,7 @@ ?MSG_LIB:cre_DigitMapValue(Start, Short, Long, Body). %% Media related -cre_MediaDesc(SD) when record(SD, 'StreamDescriptor') -> +cre_MediaDesc(SD) when is_record(SD, 'StreamDescriptor') -> cre_MediaDesc([SD]); cre_MediaDesc(SDs) -> ?MSG_LIB:cre_MediaDescriptor(SDs). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_v3_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_v3_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_codec_v3_test.erl 2009-03-12 12:32:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_codec_v3_test.erl 2009-09-18 13:47:55.000000000 +0100 @@ -191,6 +191,7 @@ pretty_otp7671_msg03/1, pretty_otp7671_msg04/1, pretty_otp7671_msg05/1, + pretty_otp8114_msg01/1, flex_pretty_tickets/1, flex_pretty_otp5042_msg1/1, @@ -278,7 +279,7 @@ case (catch apply(?MODULE,Case,[suite])) of [] -> expand(Cases, [Case|Acc]); - C when list(C) -> + C when is_list(C) -> expand(Cases, [expand(C, [])|Acc]); _ -> expand(Cases, [Case|Acc]) @@ -563,7 +564,8 @@ pretty_otp7671_msg02, pretty_otp7671_msg03, pretty_otp7671_msg04, - pretty_otp7671_msg05 + pretty_otp7671_msg05, + pretty_otp8114_msg01 ]. @@ -605,7 +607,7 @@ pretty_test_msgs(suite) -> []; -pretty_test_msgs(Config) when list(Config) -> +pretty_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(text) ++ @@ -636,7 +638,7 @@ flex_pretty_test_msgs(suite) -> []; -flex_pretty_test_msgs(Config) when list(Config) -> +flex_pretty_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(text) ++ @@ -655,7 +657,7 @@ compact_test_msgs(suite) -> []; -compact_test_msgs(Config) when list(Config) -> +compact_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(text) ++ @@ -681,7 +683,7 @@ flex_compact_test_msgs(suite) -> []; -flex_compact_test_msgs(Config) when list(Config) -> +flex_compact_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(text) ++ @@ -698,14 +700,14 @@ flex_compact_dm_timers1(suite) -> []; -flex_compact_dm_timers1(Config) when list(Config) -> +flex_compact_dm_timers1(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("1", "2", "3"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers1 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -717,14 +719,14 @@ flex_compact_dm_timers2(suite) -> []; -flex_compact_dm_timers2(Config) when list(Config) -> +flex_compact_dm_timers2(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("02", "03", "04"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers2 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -736,14 +738,14 @@ flex_compact_dm_timers3(suite) -> []; -flex_compact_dm_timers3(Config) when list(Config) -> +flex_compact_dm_timers3(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("1", "02", "31"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers3 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -755,14 +757,14 @@ flex_compact_dm_timers4(suite) -> []; -flex_compact_dm_timers4(Config) when list(Config) -> +flex_compact_dm_timers4(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("10", "21", "99"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers4 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -774,14 +776,14 @@ flex_compact_dm_timers5(suite) -> []; -flex_compact_dm_timers5(Config) when list(Config) -> +flex_compact_dm_timers5(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("99", "23", "11"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers5 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -793,14 +795,14 @@ flex_compact_dm_timers6(suite) -> []; -flex_compact_dm_timers6(Config) when list(Config) -> +flex_compact_dm_timers6(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("77", "09", "1"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers6 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -812,14 +814,14 @@ flex_compact_dm_timers7(suite) -> []; -flex_compact_dm_timers7(Config) when list(Config) -> +flex_compact_dm_timers7(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("77", "09", "1", "99"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers7 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -831,14 +833,14 @@ flex_compact_dm_timers8(suite) -> []; -flex_compact_dm_timers8(Config) when list(Config) -> +flex_compact_dm_timers8(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), M = build_dm_timers_message("01", "09", "01", "02"), B = list_to_binary(M), Conf = flex_scanner_conf(Config), case decode_message(megaco_compact_text_encoder, false, [?EC_V3,Conf], B) of - {ok, M1} when record(M1,'MegacoMessage') -> + {ok, M1} when is_record(M1,'MegacoMessage') -> t("flex_compact_dm_timers8 -> " "~n M: ~s" "~n M1: ~p", [M, M1]), @@ -872,13 +874,13 @@ exit({invalid_timer_values, {TMRs, TMRs1}}) end. -get_dm_timers({transactions, T}) when list(T) -> +get_dm_timers({transactions, T}) when is_list(T) -> get_dm_timers1(T); get_dm_timers(Other) -> {error, {invalid_transactions, Other}}. get_dm_timers1([{transactionRequest,T}|Ts]) - when record(T,'TransactionRequest') -> + when is_record(T,'TransactionRequest') -> case get_dm_timers2(T) of {ok, Timers} -> Timers; @@ -891,11 +893,11 @@ {error, {no_timers, 'TransactionRequest'}}. -get_dm_timers2(#'TransactionRequest'{actions = Actions}) when list(Actions) -> +get_dm_timers2(#'TransactionRequest'{actions = Actions}) when is_list(Actions) -> get_dm_timers3(Actions). -get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when list(Cmds) -> +get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when is_list(Cmds) -> case get_dm_timers4(Cmds) of {ok, Timers} -> {ok, Timers}; @@ -951,7 +953,7 @@ bin_test_msgs(suite) -> []; -bin_test_msgs(Config) when list(Config) -> +bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(binary) ++ @@ -968,7 +970,7 @@ ber_test_msgs(suite) -> []; -ber_test_msgs(Config) when list(Config) -> +ber_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(binary) ++ @@ -985,7 +987,7 @@ ber_bin_test_msgs(suite) -> []; -ber_bin_test_msgs(Config) when list(Config) -> +ber_bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(binary) ++ @@ -1001,7 +1003,7 @@ per_test_msgs(suite) -> []; -per_test_msgs(Config) when list(Config) -> +per_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(binary) ++ @@ -1017,7 +1019,7 @@ per_bin_test_msgs(suite) -> []; -per_bin_test_msgs(Config) when list(Config) -> +per_bin_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(binary) ++ @@ -1033,7 +1035,7 @@ erl_dist_m_test_msgs(suite) -> []; -erl_dist_m_test_msgs(Config) when list(Config) -> +erl_dist_m_test_msgs(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Msgs = msgs1a(erlang) ++ @@ -1058,7 +1060,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg1(suite) -> []; -compact_otp4011_msg1(Config) when list(Config) -> +compact_otp4011_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4011_msg1 -> entry", []), @@ -1074,7 +1076,7 @@ %% Observe that this decode SHALL fail compact_otp4011_msg2(suite) -> []; -compact_otp4011_msg2(Config) when list(Config) -> +compact_otp4011_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4011_msg2 -> entry", []), @@ -1091,7 +1093,7 @@ compact_otp4011_msg3(suite) -> []; -compact_otp4011_msg3(Config) when list(Config) -> +compact_otp4011_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4011_msg3 -> entry", []), @@ -1124,9 +1126,9 @@ end. compact_otp4011_chk2({0, ParserMod, {ParserFunc, [A, B]}}) - when (ParserMod == megaco_text_parser_v3) and - (ParserFunc == do_merge_control_streamParms) and - is_list(A) and + when (ParserMod =:= megaco_text_parser_v3) andalso + (ParserFunc =:= do_merge_control_streamParms) andalso + is_list(A) andalso is_record(B, 'LocalControlDescriptor') -> SM = B#'LocalControlDescriptor'.streamMode, case lists:keysearch(mode, 1, A) of @@ -1146,7 +1148,7 @@ %% MEGCAO instead of the correct MEGACO. compact_otp4013_msg1(suite) -> []; -compact_otp4013_msg1(Config) when list(Config) -> +compact_otp4013_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4013_msg1 -> entry", []), @@ -1193,7 +1195,7 @@ %% compact_otp4085_msg1(suite) -> []; -compact_otp4085_msg1(Config) when list(Config) -> +compact_otp4085_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4085_msg1 -> entry", []), @@ -1247,7 +1249,7 @@ %% compact_otp4085_msg1 is actually ok when you add '}' at the end. compact_otp4085_msg2(suite) -> []; -compact_otp4085_msg2(Config) when list(Config) -> +compact_otp4085_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4085_msg1 -> entry", []), @@ -1288,7 +1290,7 @@ %% compact_otp4280_msg1(suite) -> []; -compact_otp4280_msg1(Config) when list(Config) -> +compact_otp4280_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4280_msg1 -> entry", []), @@ -1327,7 +1329,7 @@ %% compact_otp4299_msg1(suite) -> []; -compact_otp4299_msg1(Config) when list(Config) -> +compact_otp4299_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4299_msg1 -> entry", []), @@ -1373,7 +1375,7 @@ compact_otp4359_msg1(suite) -> []; -compact_otp4359_msg1(Config) when list(Config) -> +compact_otp4359_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4359_msg1 -> entry", []), @@ -1424,7 +1426,7 @@ %% compact_otp4920_msg0(suite) -> []; -compact_otp4920_msg0(Config) when list(Config) -> +compact_otp4920_msg0(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg0 -> entry", []), @@ -1436,7 +1438,7 @@ compact_otp4920_msg1(suite) -> []; -compact_otp4920_msg1(Config) when list(Config) -> +compact_otp4920_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg1 -> entry", []), @@ -1448,7 +1450,7 @@ compact_otp4920_msg2(suite) -> []; -compact_otp4920_msg2(Config) when list(Config) -> +compact_otp4920_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg2 -> entry", []), @@ -1460,7 +1462,7 @@ compact_otp4920_msg3(suite) -> []; -compact_otp4920_msg3(Config) when list(Config) -> +compact_otp4920_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg3 -> entry", []), @@ -1472,7 +1474,7 @@ compact_otp4920_msg4(suite) -> []; -compact_otp4920_msg4(Config) when list(Config) -> +compact_otp4920_msg4(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg4 -> entry", []), @@ -1484,7 +1486,7 @@ compact_otp4920_msg5(suite) -> []; -compact_otp4920_msg5(Config) when list(Config) -> +compact_otp4920_msg5(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg5 -> entry", []), @@ -1496,7 +1498,7 @@ compact_otp4920_msg6(suite) -> []; -compact_otp4920_msg6(Config) when list(Config) -> +compact_otp4920_msg6(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg6 -> entry", []), @@ -1508,7 +1510,7 @@ compact_otp4920_msg7(suite) -> []; -compact_otp4920_msg7(Config) when list(Config) -> +compact_otp4920_msg7(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg7 -> entry", []), @@ -1520,7 +1522,7 @@ compact_otp4920_msg8(suite) -> []; -compact_otp4920_msg8(Config) when list(Config) -> +compact_otp4920_msg8(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg8 -> entry", []), @@ -1532,7 +1534,7 @@ compact_otp4920_msg9(suite) -> []; -compact_otp4920_msg9(Config) when list(Config) -> +compact_otp4920_msg9(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg9 -> entry", []), @@ -1544,7 +1546,7 @@ compact_otp4920_msg10(suite) -> []; -compact_otp4920_msg10(Config) when list(Config) -> +compact_otp4920_msg10(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg10 -> entry", []), @@ -1556,7 +1558,7 @@ compact_otp4920_msg11(suite) -> []; -compact_otp4920_msg11(Config) when list(Config) -> +compact_otp4920_msg11(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg11 -> entry", []), @@ -1568,7 +1570,7 @@ compact_otp4920_msg12(suite) -> []; -compact_otp4920_msg12(Config) when list(Config) -> +compact_otp4920_msg12(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg12 -> entry", []), @@ -1581,7 +1583,7 @@ %% Duplicate padding compact_otp4920_msg20(suite) -> []; -compact_otp4920_msg20(Config) when list(Config) -> +compact_otp4920_msg20(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg20 -> entry", []), @@ -1594,7 +1596,7 @@ %% Length compact_otp4920_msg21(suite) -> []; -compact_otp4920_msg21(Config) when list(Config) -> +compact_otp4920_msg21(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg21 -> entry", []), @@ -1607,7 +1609,7 @@ %% Length compact_otp4920_msg22(suite) -> []; -compact_otp4920_msg22(Config) when list(Config) -> +compact_otp4920_msg22(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg22 -> entry", []), @@ -1620,7 +1622,7 @@ %% Length compact_otp4920_msg23(suite) -> []; -compact_otp4920_msg23(Config) when list(Config) -> +compact_otp4920_msg23(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg23 -> entry", []), @@ -1633,7 +1635,7 @@ %% Length compact_otp4920_msg24(suite) -> []; -compact_otp4920_msg24(Config) when list(Config) -> +compact_otp4920_msg24(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg24 -> entry", []), @@ -1646,7 +1648,7 @@ %% Length compact_otp4920_msg25(suite) -> []; -compact_otp4920_msg25(Config) when list(Config) -> +compact_otp4920_msg25(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp4920_msg25 -> entry", []), @@ -1782,7 +1784,7 @@ compact_otp5186_msg01(suite) -> []; -compact_otp5186_msg01(Config) when list(Config) -> +compact_otp5186_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg01 -> entry", []), @@ -1794,7 +1796,7 @@ compact_otp5186_msg02(suite) -> []; -compact_otp5186_msg02(Config) when list(Config) -> +compact_otp5186_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg02 -> entry", []), @@ -1806,7 +1808,7 @@ compact_otp5186_msg03(suite) -> []; -compact_otp5186_msg03(Config) when list(Config) -> +compact_otp5186_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg03 -> entry", []), @@ -1819,7 +1821,7 @@ compact_otp5186_msg04(suite) -> []; -compact_otp5186_msg04(Config) when list(Config) -> +compact_otp5186_msg04(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg04 -> entry", []), @@ -1832,7 +1834,7 @@ compact_otp5186_msg05(suite) -> []; -compact_otp5186_msg05(Config) when list(Config) -> +compact_otp5186_msg05(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg05 -> entry", []), @@ -1845,7 +1847,7 @@ compact_otp5186_msg06(suite) -> []; -compact_otp5186_msg06(Config) when list(Config) -> +compact_otp5186_msg06(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5186_msg06 -> entry", []), @@ -1997,7 +1999,7 @@ compact_otp5793_msg01(suite) -> []; -compact_otp5793_msg01(Config) when list(Config) -> +compact_otp5793_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5793_msg01 -> entry", []), @@ -2012,7 +2014,7 @@ compact_otp5836_msg01(suite) -> []; -compact_otp5836_msg01(Config) when list(Config) -> +compact_otp5836_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5836_msg01 -> entry", []), @@ -2057,7 +2059,7 @@ compact_otp5993_msg01(suite) -> []; -compact_otp5993_msg01(Config) when list(Config) -> +compact_otp5993_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5993_msg01 -> entry", []), @@ -2078,7 +2080,7 @@ compact_otp5993_msg02(suite) -> []; -compact_otp5993_msg02(Config) when list(Config) -> +compact_otp5993_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5993_msg02 -> entry", []), @@ -2100,7 +2102,7 @@ compact_otp5993_msg03(suite) -> []; -compact_otp5993_msg03(Config) when list(Config) -> +compact_otp5993_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp5993_msg03 -> entry", []), @@ -2151,7 +2153,7 @@ compact_otp6017_msg01(suite) -> []; -compact_otp6017_msg01(Config) when list(Config) -> +compact_otp6017_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp6017_msg01 -> entry", []), @@ -2163,7 +2165,7 @@ compact_otp6017_msg02(suite) -> []; -compact_otp6017_msg02(Config) when list(Config) -> +compact_otp6017_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp6017_msg02 -> entry", []), @@ -2175,7 +2177,7 @@ compact_otp6017_msg03(suite) -> []; -compact_otp6017_msg03(Config) when list(Config) -> +compact_otp6017_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("compact_otp6017_msg03 -> entry", []), @@ -2225,7 +2227,7 @@ flex_compact_otp4299_msg1(suite) -> []; -flex_compact_otp4299_msg1(Config) when list(Config) -> +flex_compact_otp4299_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp4299_msg1 -> entry", []), @@ -2240,7 +2242,7 @@ flex_compact_otp7431_msg01(suite) -> []; -flex_compact_otp7431_msg01(Config) when list(Config) -> +flex_compact_otp7431_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg01 -> entry", []), @@ -2249,7 +2251,7 @@ flex_compact_otp7431_msg02(suite) -> []; -flex_compact_otp7431_msg02(Config) when list(Config) -> +flex_compact_otp7431_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg02 -> entry", []), @@ -2258,7 +2260,7 @@ flex_compact_otp7431_msg03(suite) -> []; -flex_compact_otp7431_msg03(Config) when list(Config) -> +flex_compact_otp7431_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg03 -> entry", []), @@ -2267,7 +2269,7 @@ flex_compact_otp7431_msg04(suite) -> []; -flex_compact_otp7431_msg04(Config) when list(Config) -> +flex_compact_otp7431_msg04(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg04 -> entry", []), @@ -2276,7 +2278,7 @@ flex_compact_otp7431_msg05(suite) -> []; -flex_compact_otp7431_msg05(Config) when list(Config) -> +flex_compact_otp7431_msg05(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg05 -> entry", []), @@ -2285,7 +2287,7 @@ flex_compact_otp7431_msg06(suite) -> []; -flex_compact_otp7431_msg06(Config) when list(Config) -> +flex_compact_otp7431_msg06(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg06 -> entry", []), @@ -2294,7 +2296,7 @@ flex_compact_otp7431_msg07(suite) -> []; -flex_compact_otp7431_msg07(Config) when list(Config) -> +flex_compact_otp7431_msg07(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_comppact_otp7431_msg07 -> entry", []), @@ -2387,7 +2389,7 @@ pretty_otp4632_msg1(suite) -> []; -pretty_otp4632_msg1(Config) when list(Config) -> +pretty_otp4632_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4632_msg1 -> entry", []), @@ -2402,7 +2404,7 @@ pretty_otp4632_msg2(suite) -> []; -pretty_otp4632_msg2(Config) when list(Config) -> +pretty_otp4632_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4632_msg2 -> entry", []), @@ -2418,7 +2420,7 @@ pretty_otp4632_msg3(suite) -> []; -pretty_otp4632_msg3(Config) when list(Config) -> +pretty_otp4632_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4632_msg3 -> entry", []), @@ -2435,7 +2437,7 @@ pretty_otp4632_msg4(suite) -> []; -pretty_otp4632_msg4(Config) when list(Config) -> +pretty_otp4632_msg4(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4632_msg4 -> entry", []), @@ -2476,7 +2478,7 @@ %% pretty_otp4710_msg1(suite) -> []; -pretty_otp4710_msg1(Config) when list(Config) -> +pretty_otp4710_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4710_msg1 -> entry", []), @@ -2492,7 +2494,7 @@ pretty_otp4710_msg2(suite) -> []; -pretty_otp4710_msg2(Config) when list(Config) -> +pretty_otp4710_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4710_msg2 -> entry", []), @@ -2538,7 +2540,7 @@ %% pretty_otp4945_msg1(suite) -> []; -pretty_otp4945_msg1(Config) when list(Config) -> +pretty_otp4945_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg1 -> entry", []), @@ -2572,7 +2574,7 @@ pretty_otp4945_msg2(suite) -> []; -pretty_otp4945_msg2(Config) when list(Config) -> +pretty_otp4945_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg2 -> entry", []), @@ -2606,7 +2608,7 @@ pretty_otp4945_msg3(suite) -> []; -pretty_otp4945_msg3(Config) when list(Config) -> +pretty_otp4945_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg3 -> entry", []), @@ -2639,7 +2641,7 @@ pretty_otp4945_msg4(suite) -> []; -pretty_otp4945_msg4(Config) when list(Config) -> +pretty_otp4945_msg4(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg4 -> entry", []), @@ -2666,7 +2668,7 @@ pretty_otp4945_msg5(suite) -> []; -pretty_otp4945_msg5(Config) when list(Config) -> +pretty_otp4945_msg5(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg5 -> entry", []), @@ -2703,7 +2705,7 @@ pretty_otp4945_msg6(suite) -> []; -pretty_otp4945_msg6(Config) when list(Config) -> +pretty_otp4945_msg6(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4945_msg6 -> entry", []), @@ -2754,7 +2756,7 @@ %% pretty_otp4949_msg1(suite) -> []; -pretty_otp4949_msg1(Config) when list(Config) -> +pretty_otp4949_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4949_msg1 -> entry", []), @@ -2779,7 +2781,7 @@ pretty_otp4949_msg2(suite) -> []; -pretty_otp4949_msg2(Config) when list(Config) -> +pretty_otp4949_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4949_msg2 -> entry", []), @@ -2814,7 +2816,7 @@ pretty_otp4949_msg3(suite) -> []; -pretty_otp4949_msg3(Config) when list(Config) -> +pretty_otp4949_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp4949_msg3 -> entry", []), @@ -2851,7 +2853,7 @@ %% pretty_otp5042_msg1(suite) -> []; -pretty_otp5042_msg1(Config) when list(Config) -> +pretty_otp5042_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5042_msg1 -> entry", []), @@ -2876,7 +2878,7 @@ %% pretty_otp5068_msg1(suite) -> []; -pretty_otp5068_msg1(Config) when list(Config) -> +pretty_otp5068_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5068_msg1 -> entry", []), @@ -2936,7 +2938,7 @@ %% pretty_otp5085_msg1(suite) -> []; -pretty_otp5085_msg1(Config) when list(Config) -> +pretty_otp5085_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg1 -> entry", []), @@ -2976,7 +2978,7 @@ pretty_otp5085_msg2(suite) -> []; -pretty_otp5085_msg2(Config) when list(Config) -> +pretty_otp5085_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg2 -> entry", []), @@ -3016,7 +3018,7 @@ pretty_otp5085_msg3(suite) -> []; -pretty_otp5085_msg3(Config) when list(Config) -> +pretty_otp5085_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg3 -> entry", []), @@ -3056,7 +3058,7 @@ pretty_otp5085_msg4(suite) -> []; -pretty_otp5085_msg4(Config) when list(Config) -> +pretty_otp5085_msg4(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg4 -> entry", []), @@ -3097,7 +3099,7 @@ pretty_otp5085_msg5(suite) -> []; -pretty_otp5085_msg5(Config) when list(Config) -> +pretty_otp5085_msg5(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg5 -> entry", []), @@ -3138,7 +3140,7 @@ pretty_otp5085_msg6(suite) -> []; -pretty_otp5085_msg6(Config) when list(Config) -> +pretty_otp5085_msg6(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg6 -> entry", []), @@ -3179,7 +3181,7 @@ pretty_otp5085_msg7(suite) -> []; -pretty_otp5085_msg7(Config) when list(Config) -> +pretty_otp5085_msg7(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg7 -> entry", []), @@ -3219,7 +3221,7 @@ pretty_otp5085_msg8(suite) -> []; -pretty_otp5085_msg8(Config) when list(Config) -> +pretty_otp5085_msg8(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5085_msg8 -> entry", []), @@ -3276,7 +3278,7 @@ %% pretty_otp5600_msg1(suite) -> []; -pretty_otp5600_msg1(Config) when list(Config) -> +pretty_otp5600_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5600_msg1 -> entry", []), @@ -3325,7 +3327,7 @@ pretty_otp5600_msg2(suite) -> []; -pretty_otp5600_msg2(Config) when list(Config) -> +pretty_otp5600_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5600_msg2 -> entry", []), @@ -3378,7 +3380,7 @@ %% pretty_otp5601_msg1(suite) -> []; -pretty_otp5601_msg1(Config) when list(Config) -> +pretty_otp5601_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5601_msg1 -> entry", []), @@ -3431,7 +3433,7 @@ %% pretty_otp5793_msg01(suite) -> []; -pretty_otp5793_msg01(Config) when list(Config) -> +pretty_otp5793_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5793_msg01 -> entry", []), @@ -3492,7 +3494,7 @@ %% pretty_otp5803_msg01(suite) -> []; -pretty_otp5803_msg01(Config) when list(Config) -> +pretty_otp5803_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5803_msg01 -> entry", []), @@ -3545,7 +3547,7 @@ pretty_otp5803_msg02(suite) -> []; -pretty_otp5803_msg02(Config) when list(Config) -> +pretty_otp5803_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5803_msg02 -> entry", []), @@ -3597,7 +3599,7 @@ %% pretty_otp5805_msg01(suite) -> []; -pretty_otp5805_msg01(Config) when list(Config) -> +pretty_otp5805_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5805_msg01 -> entry", []), @@ -3622,7 +3624,7 @@ %% pretty_otp5836_msg01(suite) -> []; -pretty_otp5836_msg01(Config) when list(Config) -> +pretty_otp5836_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("pretty_otp5836_msg01 -> entry", []), @@ -4014,6 +4016,94 @@ ok. +%% -------------------------------------------------------------- +%% + + +pretty_otp8114_msg01(suite) -> + []; +pretty_otp8114_msg01(Config) when is_list(Config) -> + put(severity, trc), + put(dbg, true), + d("pretty_otp8114_msg01 -> entry", []), + ok = otp8114( pretty_otp8114_msg01(), megaco_pretty_text_encoder, ?EC), + erase(dbg), + erase(severity), + ok. + +pretty_otp8114_msg01() -> + "MEGACO/" ?VERSION_STR " [10.10.10.10]:1234\nTransaction = 1 {\n\tContext =\n1 {\n\t\tModify = ip/1/1/1 {\n\t\t\tMedia {\n\t\t\t\tStream = 1\n{\n\t\t\t\t\t\tLocalControl {\n\t\t\t\t\t\tMode =\nSendReceive\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tEvents = 1\n{\n\t\t\t\tadid/ipstop\n{\n\t\t\t\t\tdt=30,\n\t\t\t\t\tdir=\"BOTH\"\n\t\t\t\t},\n\t\t\t\tg/cause\n\n\t\t\t}\n\t\t}\n\t}\n}". + + +otp8114(InitialMessage, Codec, Conf) -> + Decode = fun(M) -> Codec:decode_message(Conf, M) end, + Encode = fun(B) -> Codec:encode_message(Conf, B) end, + InitialData = InitialMessage, + Instructions = + [ + %% List to binary + megaco_codec_test_lib:expect_instruction( + "Convert (initial) message to a binary", + fun(Msg) when is_list(Msg) -> + %% io:format("~s~n", [Msg]), + {ok, list_to_binary(Msg)}; + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Bin}, _Msg) when is_binary(Bin) -> + {ok, Bin}; + (Bad, _Msg) -> + {error, {failed_to_binary, Bad}} + end), + + %% Initial decode + megaco_codec_test_lib:expect_instruction( + "Decode (initial) message", + fun(Bin) when is_binary(Bin) -> + (catch Decode(Bin)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Msg}, _Bin) when is_record(Msg, 'MegacoMessage') -> + %% io:format("~p~n", [Msg]), + {ok, Msg}; + (Bad, _) -> + {error, {initial_decode_failed, Bad}} + end), + + %% Encode + megaco_codec_test_lib:expect_instruction( + "Encode message", + fun(Msg) when is_record(Msg, 'MegacoMessage') -> + (catch Encode(Msg)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Bin}, _Msg) when is_binary(Bin) -> + %% io:format("~s~n", [binary_to_list(Bin)]), + {ok, Bin}; + (Bad, _) -> + {error, {encode_failed, Bad}} + end), + + %% Decode + megaco_codec_test_lib:expect_instruction( + "(final) Decode message", + fun(Bin) when is_binary(Bin) -> + (catch Decode(Bin)); + (Bad) -> + {error, {invalid_data, Bad}} + end, + fun({ok, Msg}, _Bin) when is_record(Msg, 'MegacoMessage') -> + %% io:format("~p~n", [Msg]), + {ok, Msg}; + (Bad, _) -> + {error, {decode_failed, Bad}} + end) + ], + megaco_codec_test_lib:expect_exec(Instructions, InitialData). + + %% ============================================================== %% %% F l e x P r e t t y T e s t c a s e s @@ -4021,7 +4111,7 @@ flex_pretty_otp5042_msg1(suite) -> []; -flex_pretty_otp5042_msg1(Config) when list(Config) -> +flex_pretty_otp5042_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5042_msg1 -> entry", []), @@ -4036,7 +4126,7 @@ %% flex_pretty_otp5085_msg1(suite) -> []; -flex_pretty_otp5085_msg1(Config) when list(Config) -> +flex_pretty_otp5085_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg1 -> entry", []), @@ -4049,7 +4139,7 @@ flex_pretty_otp5085_msg2(suite) -> []; -flex_pretty_otp5085_msg2(Config) when list(Config) -> +flex_pretty_otp5085_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg2 -> entry", []), @@ -4062,7 +4152,7 @@ flex_pretty_otp5085_msg3(suite) -> []; -flex_pretty_otp5085_msg3(Config) when list(Config) -> +flex_pretty_otp5085_msg3(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg3 -> entry", []), @@ -4075,7 +4165,7 @@ flex_pretty_otp5085_msg4(suite) -> []; -flex_pretty_otp5085_msg4(Config) when list(Config) -> +flex_pretty_otp5085_msg4(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg4 -> entry", []), @@ -4088,7 +4178,7 @@ flex_pretty_otp5085_msg5(suite) -> []; -flex_pretty_otp5085_msg5(Config) when list(Config) -> +flex_pretty_otp5085_msg5(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg5 -> entry", []), @@ -4101,7 +4191,7 @@ flex_pretty_otp5085_msg6(suite) -> []; -flex_pretty_otp5085_msg6(Config) when list(Config) -> +flex_pretty_otp5085_msg6(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg6 -> entry", []), @@ -4114,7 +4204,7 @@ flex_pretty_otp5085_msg7(suite) -> []; -flex_pretty_otp5085_msg7(Config) when list(Config) -> +flex_pretty_otp5085_msg7(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg7 -> entry", []), @@ -4127,7 +4217,7 @@ flex_pretty_otp5085_msg8(suite) -> []; -flex_pretty_otp5085_msg8(Config) when list(Config) -> +flex_pretty_otp5085_msg8(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5085_msg8 -> entry", []), @@ -4143,7 +4233,7 @@ %% flex_pretty_otp5600_msg1(suite) -> []; -flex_pretty_otp5600_msg1(Config) when list(Config) -> +flex_pretty_otp5600_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5600_msg1 -> entry", []), @@ -4156,7 +4246,7 @@ flex_pretty_otp5600_msg2(suite) -> []; -flex_pretty_otp5600_msg2(Config) when list(Config) -> +flex_pretty_otp5600_msg2(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5600_msg2 -> entry", []), @@ -4172,7 +4262,7 @@ %% flex_pretty_otp5601_msg1(suite) -> []; -flex_pretty_otp5601_msg1(Config) when list(Config) -> +flex_pretty_otp5601_msg1(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5601_msg1 -> entry", []), @@ -4188,7 +4278,7 @@ %% flex_pretty_otp5793_msg01(suite) -> []; -flex_pretty_otp5793_msg01(Config) when list(Config) -> +flex_pretty_otp5793_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5793_msg01 -> entry", []), @@ -4204,7 +4294,7 @@ %% flex_pretty_otp5803_msg01(suite) -> []; -flex_pretty_otp5803_msg01(Config) when list(Config) -> +flex_pretty_otp5803_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5803_msg01 -> entry", []), @@ -4217,7 +4307,7 @@ flex_pretty_otp5803_msg02(suite) -> []; -flex_pretty_otp5803_msg02(Config) when list(Config) -> +flex_pretty_otp5803_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5803_msg02 -> entry", []), @@ -4233,7 +4323,7 @@ %% flex_pretty_otp5805_msg01(suite) -> []; -flex_pretty_otp5805_msg01(Config) when list(Config) -> +flex_pretty_otp5805_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5805_msg01 -> entry", []), @@ -4249,7 +4339,7 @@ %% flex_pretty_otp5836_msg01(suite) -> []; -flex_pretty_otp5836_msg01(Config) when list(Config) -> +flex_pretty_otp5836_msg01(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp5836_msg01 -> entry", []), @@ -4263,7 +4353,7 @@ flex_pretty_otp7431_msg01(suite) -> []; -flex_pretty_otp7431_msg01(Config) when list(Config) -> +flex_pretty_otp7431_msg01(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg01 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -4271,7 +4361,7 @@ flex_pretty_otp7431_msg02(suite) -> []; -flex_pretty_otp7431_msg02(Config) when list(Config) -> +flex_pretty_otp7431_msg02(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp7431_msg02 -> entry", []), @@ -4281,7 +4371,7 @@ flex_pretty_otp7431_msg03(suite) -> []; -flex_pretty_otp7431_msg03(Config) when list(Config) -> +flex_pretty_otp7431_msg03(Config) when is_list(Config) -> %% put(severity,trc), %% put(dbg,true), d("flex_pretty_otp7431_msg03 -> entry", []), @@ -4291,7 +4381,7 @@ flex_pretty_otp7431_msg04(suite) -> []; -flex_pretty_otp7431_msg04(Config) when list(Config) -> +flex_pretty_otp7431_msg04(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg04 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -4299,7 +4389,7 @@ flex_pretty_otp7431_msg05(suite) -> []; -flex_pretty_otp7431_msg05(Config) when list(Config) -> +flex_pretty_otp7431_msg05(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg05 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -4307,7 +4397,7 @@ flex_pretty_otp7431_msg06(suite) -> []; -flex_pretty_otp7431_msg06(Config) when list(Config) -> +flex_pretty_otp7431_msg06(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg06 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -4315,7 +4405,7 @@ flex_pretty_otp7431_msg07(suite) -> []; -flex_pretty_otp7431_msg07(Config) when list(Config) -> +flex_pretty_otp7431_msg07(Config) when is_list(Config) -> d("flex_pretty_otp7431_msg07 -> entry", []), ?ACQUIRE_NODES(1, Config), Conf = flex_scanner_conf(Config), @@ -4586,9 +4676,9 @@ msgs3_name(N) -> list_to_atom("rfc3525_" ++ atom_to_list(N)). -rfc3525_decode(M) when list(M) -> +rfc3525_decode(M) when is_list(M) -> rfc3525_decode(list_to_binary(M)); -rfc3525_decode(M) when binary(M) -> +rfc3525_decode(M) when is_binary(M) -> case (catch decode_message(megaco_pretty_text_encoder, false, ?EC, M)) of {ok, Msg} -> Msg; @@ -4856,7 +4946,7 @@ Actions = [Action], msg_reply(Mid, TransId, Actions). -msg_ack(Mid, [Range|_] = Ranges) when tuple(Range) -> +msg_ack(Mid, [Range|_] = Ranges) when is_tuple(Range) -> msg_ack(Mid, [Ranges]); msg_ack(Mid, Ranges) -> @@ -4957,7 +5047,7 @@ msg4() -> msg4(?MG1_MID_NO_PORT, "901 mg col boot"). -msg4(Mid, Reason) when list(Reason) -> +msg4(Mid, Reason) when is_list(Reason) -> Address = {portNumber, ?DEFAULT_PORT}, Profile = cre_SvcChProf("resgw",1), Parm = cre_SvcChParm(restart,Address,[Reason],Profile), @@ -5462,7 +5552,7 @@ msg40() -> msg40(?MG1_MID_NO_PORT, "901 mg col boot"). -msg40(Mid, Reason) when list(Reason) -> +msg40(Mid, Reason) when is_list(Reason) -> Address = {portNumber, ?DEFAULT_PORT}, Profile = cre_SvcChProf("resgw",1), Parm = cre_SvcChParm(restart,Address,[Reason],Profile), @@ -7581,7 +7671,7 @@ %% io:format("d", []), io:format("decoded:~n~p~n", [M2]), case (catch Codec:encode_message(Config, Ver, M2)) of - {ok, Bin2} when binary(Bin2) -> + {ok, Bin2} when is_binary(Bin2) -> %% io:format("e~n", []), io:format("encode: ~n~s~n", [erlang:binary_to_list(Bin2)]), {N,ok}; @@ -7986,7 +8076,7 @@ ?MSG_LIB:cre_IndAudTerminationStateDescriptor(PP, EBC, SS, SSS). cre_IndAudEvsDesc(RID, PN) - when integer(RID) -> + when is_integer(RID) -> ?MSG_LIB:cre_IndAudEventsDescriptor(RID, PN). cre_IndAudEvBufDesc(EN, SID) -> @@ -8127,7 +8217,7 @@ ?MSG_LIB:cre_DigitMapValue(Start, Short, Long, Body). %% Media related -cre_MediaDesc(SD) when record(SD, 'StreamDescriptor') -> +cre_MediaDesc(SD) when is_record(SD, 'StreamDescriptor') -> cre_MediaDesc([SD]); cre_MediaDesc(SDs) -> ?MSG_LIB:cre_MediaDescriptor(SDs). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_config_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_config_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_config_test.erl 2009-03-12 12:30:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_config_test.erl 2009-11-20 08:48:33.000000000 +0000 @@ -73,7 +73,9 @@ tickets(suite) -> [ - otp_7216 + otp_7216, + otp_8167, + otp_8183 ]. @@ -82,7 +84,7 @@ config(suite) -> []; -config(Config) when list(Config) -> +config(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), Mid = fake_mid, @@ -697,7 +699,7 @@ otp_7216(suite) -> []; -otp_7216(Config) when list(Config) -> +otp_7216(Config) when is_list(Config) -> put(tc, otp_7216), p("start"), @@ -816,6 +818,260 @@ ok. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +otp_8167(suite) -> + []; +otp_8167(Config) when is_list(Config) -> + put(tc, otp8167), + p("start"), + + p("start the megaco config process"), + megaco_config:start_link(), + + LocalMid1 = {deviceName, "local-mid-1"}, + LocalMid2 = {deviceName, "local-mid-2"}, + RemoteMid1 = {deviceName, "remote-mid-1"}, + %% RemoteMid2 = {deviceName, "remote-mid-2"}, + RH1 = #megaco_receive_handle{local_mid = LocalMid1, + encoding_mod = dummy_codec_module, + encoding_config = [], + send_mod = dummy_transport_module}, +%% RH2 = #megaco_receive_handle{local_mid = LocalMid2, +%% encoding_mod = dummy_codec_module, +%% encoding_config = [], +%% send_mod = dummy_transport_module}, + + User1ConfigA = [{call_proxy_gc_timeout, 1}], + User1ConfigB = [{call_proxy_gc_timeout, 0}], + User2ConfigA = [{call_proxy_gc_timeout, -1}], + User2ConfigB = [{call_proxy_gc_timeout, infinity}], + User2ConfigC = [{call_proxy_gc_timeout, "1"}], + User2ConfigD = [{call_proxy_gc_timeout, 1.0}], + + p("start local user (1A): ~p", [LocalMid1]), + ok = megaco_config:start_user(LocalMid1, User1ConfigA), + p("stop local user (1A): ~p", [LocalMid1]), + ok = megaco_config:stop_user(LocalMid1), + + p("start local user (1B): ~p", [LocalMid1]), + ok = megaco_config:start_user(LocalMid1, User1ConfigB), + p("try (and fail) change value for item call_proxy_gc_timeout for local user: ~p -> ~p", + [LocalMid1, -1]), + {error, {bad_user_val, LocalMid1, call_proxy_gc_timeout, -1}} = + megaco_config:update_user_info(LocalMid1, call_proxy_gc_timeout, -1), + p("try (and fail) change value for item call_proxy_gc_timeout for local user: ~p -> ~p", + [LocalMid1, infinity]), + {error, {bad_user_val, LocalMid1, call_proxy_gc_timeout, infinity}} = + megaco_config:update_user_info(LocalMid1, call_proxy_gc_timeout, infinity), + p("try (and fail) change value for item call_proxy_gc_timeout for local user: ~p -> ~p", + [LocalMid1, "1"]), + {error, {bad_user_val, LocalMid1, call_proxy_gc_timeout, "1"}} = + megaco_config:update_user_info(LocalMid1, call_proxy_gc_timeout, "1"), + p("try (and fail) change value for item call_proxy_gc_timeout for local user: ~p -> ~p", + [LocalMid1, 1.0]), + {error, {bad_user_val, LocalMid1, call_proxy_gc_timeout, 1.0}} = + megaco_config:update_user_info(LocalMid1, call_proxy_gc_timeout, 1.0), + p("change value for item call_proxy_gc_timeout for local user: ~p", [LocalMid1]), + ok = megaco_config:update_user_info(LocalMid1, call_proxy_gc_timeout, 10101), + + p("connect"), + {ok, CD} = megaco_config:connect(RH1, RemoteMid1, + dummy_send_handle, self()), + p("connect ok: CD = ~n~p", [CD]), + CH = CD#conn_data.conn_handle, + + p("get value for item call_proxy_gc_timeout for connection: ~p", [CH]), + 10101 = megaco_config:conn_info(CH, call_proxy_gc_timeout), + + p("change value for item call_proxy_gc_timeout for connection: ~p -> ~p", + [CH, 20202]), + ok = megaco_config:update_conn_info(CH, call_proxy_gc_timeout, 20202), + + p("try (and fail) change value for item call_proxy_gc_timeout for connection: ~p -> ~p", + [CH, -1]), + {error, {bad_user_val, LocalMid1, call_proxy_gc_timeout, -1}} = + megaco_config:update_conn_info(CH, call_proxy_gc_timeout, -1), + + p("try (and fail) change value for item call_proxy_gc_timeout for connection: ~p -> ~p", + [CH, infinity]), + {error, {bad_user_val, LocalMid1, call_proxy_gc_timeout, infinity}} = + megaco_config:update_conn_info(CH, call_proxy_gc_timeout, infinity), + + p("try (and fail) change value for item call_proxy_gc_timeout for connection: ~p -> ~p", + [CH, "1"]), + {error, {bad_user_val, LocalMid1, call_proxy_gc_timeout, "1"}} = + megaco_config:update_conn_info(CH, call_proxy_gc_timeout, "1"), + + p("try (and fail) change value for item call_proxy_gc_timeout for connection: ~p -> ~p", + [CH, 1.0]), + {error, {bad_user_val, LocalMid1, call_proxy_gc_timeout, 1.0}} = + megaco_config:update_conn_info(CH, call_proxy_gc_timeout, 1.0), + + p("disconnect: ~p", [CH]), + {ok, _, _} = megaco_config:disconnect(CH), + + p("stop local user (1B): ~p", [LocalMid1]), + ok = megaco_config:stop_user(LocalMid1), + + p("try (and fail) start local user (2A): ~p", [LocalMid2]), + {error, {bad_user_val, LocalMid2, call_proxy_gc_timeout, -1}} = + megaco_config:start_user(LocalMid2, User2ConfigA), + + p("try (and fail) start local user (2B): ~p", [LocalMid2]), + {error, {bad_user_val, LocalMid2, call_proxy_gc_timeout, infinity}} = + megaco_config:start_user(LocalMid2, User2ConfigB), + + p("try (and fail) start local user (2C): ~p", [LocalMid2]), + {error, {bad_user_val, LocalMid2, call_proxy_gc_timeout, "1"}} = + megaco_config:start_user(LocalMid2, User2ConfigC), + + p("try (and fail) start local user (2D): ~p", [LocalMid2]), + {error, {bad_user_val, LocalMid2, call_proxy_gc_timeout, 1.0}} = + megaco_config:start_user(LocalMid2, User2ConfigD), + + p("done"), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +otp_8183(suite) -> + []; +otp_8183(Config) when is_list(Config) -> + put(tc, otp8183), + p("start"), + + p("start the megaco config process"), + megaco_config:start_link(), + + LocalMid1 = {deviceName, "local-mid-1"}, + LocalMid2 = {deviceName, "local-mid-2"}, + RemoteMid1 = {deviceName, "remote-mid-1"}, +%% RemoteMid2 = {deviceName, "remote-mid-2"}, + RH1 = #megaco_receive_handle{local_mid = LocalMid1, + encoding_mod = dummy_codec_module, + encoding_config = [], + send_mod = dummy_transport_module}, +%% RH2 = #megaco_receive_handle{local_mid = LocalMid2, +%% encoding_mod = dummy_codec_module, +%% encoding_config = [], +%% send_mod = dummy_transport_module}, + + OkValA = 100, + OkValB = 0, + OkValC = plain, + OkValD = 10101, + OkValE = 20202, + BadValA = -1, + BadValB = pain, + BadValC = "1", + BadValD = 1.0, + User1ConfigA = [{request_keep_alive_timeout, OkValA}], + User1ConfigB = [{request_keep_alive_timeout, OkValB}], + User1ConfigC = [{request_keep_alive_timeout, OkValC}], + User2ConfigA = [{request_keep_alive_timeout, BadValA}], + User2ConfigB = [{request_keep_alive_timeout, BadValB}], + User2ConfigC = [{request_keep_alive_timeout, BadValC}], + User2ConfigD = [{request_keep_alive_timeout, BadValD}], + + p("start local user (1A): ~p", [LocalMid1]), + ok = megaco_config:start_user(LocalMid1, User1ConfigA), + p("stop local user (1A): ~p", [LocalMid1]), + ok = megaco_config:stop_user(LocalMid1), + + p("start local user (1B): ~p", [LocalMid1]), + ok = megaco_config:start_user(LocalMid1, User1ConfigB), + p("stop local user (1B): ~p", [LocalMid1]), + ok = megaco_config:stop_user(LocalMid1), + + p("start local user (1C): ~p", [LocalMid1]), + ok = megaco_config:start_user(LocalMid1, User1ConfigC), + + p("try (and fail) change value for item call_proxy_gc_timeout for local user: ~p -> ~p", + [LocalMid1, BadValA]), + {error, {bad_user_val, LocalMid1, request_keep_alive_timeout, BadValA}} = + megaco_config:update_user_info(LocalMid1, request_keep_alive_timeout, BadValA), + + p("try (and fail) change value for item request_keep_alive_timeout for local user: ~p -> ~p", + [LocalMid1, BadValB]), + {error, {bad_user_val, LocalMid1, request_keep_alive_timeout, BadValB}} = + megaco_config:update_user_info(LocalMid1, request_keep_alive_timeout, BadValB), + + p("try (and fail) change value for item request_keep_alive_timeout for local user: ~p -> ~p", + [LocalMid1, BadValC]), + {error, {bad_user_val, LocalMid1, request_keep_alive_timeout, BadValC}} = + megaco_config:update_user_info(LocalMid1, request_keep_alive_timeout, BadValC), + + p("try (and fail) change value for item request_keep_alive_timeout for local user: ~p -> ~p", + [LocalMid1, BadValD]), + {error, {bad_user_val, LocalMid1, request_keep_alive_timeout, BadValD}} = + megaco_config:update_user_info(LocalMid1, request_keep_alive_timeout, BadValD), + + p("change value for item request_keep_alive_timeout for local user: ~p", [LocalMid1]), + ok = megaco_config:update_user_info(LocalMid1, request_keep_alive_timeout, OkValD), + + p("connect"), + {ok, CD} = megaco_config:connect(RH1, RemoteMid1, + dummy_send_handle, self()), + p("connect ok: CD = ~n~p", [CD]), + CH = CD#conn_data.conn_handle, + + p("get value for item request_keep_alive_timeout for connection: ~p", [CH]), + OkValD = megaco_config:conn_info(CH, request_keep_alive_timeout), + + p("change value for item request_keep_alive_timeout for connection: ~p -> ~p", + [CH, OkValE]), + ok = megaco_config:update_conn_info(CH, request_keep_alive_timeout, OkValE), + + p("try (and fail) change value for item request_keep_alive_timeout for connection: ~p -> ~p", + [CH, BadValA]), + {error, {bad_user_val, LocalMid1, request_keep_alive_timeout, BadValA}} = + megaco_config:update_conn_info(CH, request_keep_alive_timeout, BadValA), + + p("try (and fail) change value for item request_keep_alive_timeout for connection: ~p -> ~p", + [CH, BadValB]), + {error, {bad_user_val, LocalMid1, request_keep_alive_timeout, BadValB}} = + megaco_config:update_conn_info(CH, request_keep_alive_timeout, BadValB), + + p("try (and fail) change value for item request_keep_alive_timeout for connection: ~p -> ~p", + [CH, BadValC]), + {error, {bad_user_val, LocalMid1, request_keep_alive_timeout, BadValC}} = + megaco_config:update_conn_info(CH, request_keep_alive_timeout, BadValC), + + p("try (and fail) change value for item request_keep_alive_timeout for connection: ~p -> ~p", + [CH, BadValD]), + {error, {bad_user_val, LocalMid1, request_keep_alive_timeout, BadValD}} = + megaco_config:update_conn_info(CH, request_keep_alive_timeout, BadValD), + + p("disconnect: ~p", [CH]), + {ok, _, _} = megaco_config:disconnect(CH), + + p("stop local user (1B): ~p", [LocalMid1]), + ok = megaco_config:stop_user(LocalMid1), + + p("try (and fail) start local user (2A): ~p", [LocalMid2]), + {error, {bad_user_val, LocalMid2, request_keep_alive_timeout, BadValA}} = + megaco_config:start_user(LocalMid2, User2ConfigA), + + p("try (and fail) start local user (2B): ~p", [LocalMid2]), + {error, {bad_user_val, LocalMid2, request_keep_alive_timeout, BadValB}} = + megaco_config:start_user(LocalMid2, User2ConfigB), + + p("try (and fail) start local user (2C): ~p", [LocalMid2]), + {error, {bad_user_val, LocalMid2, request_keep_alive_timeout, BadValC}} = + megaco_config:start_user(LocalMid2, User2ConfigC), + + p("try (and fail) start local user (2D): ~p", [LocalMid2]), + {error, {bad_user_val, LocalMid2, request_keep_alive_timeout, BadValD}} = + megaco_config:start_user(LocalMid2, User2ConfigD), + + p("done"), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + p(F) -> p(F, []). @@ -823,8 +1079,6 @@ io:format("[~w] " ++ F ++ "~n", [get(tc)|A]). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - i(F) -> i(F, []). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_examples_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_examples_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_examples_test.erl 2009-03-12 12:30:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_examples_test.erl 2009-09-18 15:12:48.000000000 +0100 @@ -80,7 +80,7 @@ simple(suite) -> []; -simple(Config) when list(Config) -> +simple(Config) when is_list(Config) -> ?ACQUIRE_NODES(1, Config), d("simple -> proxy start",[]), ProxyPid = megaco_test_lib:proxy_start({?MODULE, ?LINE}), @@ -91,7 +91,7 @@ d("simple -> start mgc",[]), ?APPLY(ProxyPid, fun() -> megaco_simple_mgc:start() end), receive - {res, _, {ok, MgcAll}} when list(MgcAll) -> + {res, _, {ok, MgcAll}} when is_list(MgcAll) -> MgcBad = [MgcRes || MgcRes <- MgcAll, element(1, MgcRes) /= ok], ?VERIFY([], MgcBad), %% MgcGood = MgcAll -- MgcBad, @@ -100,12 +100,12 @@ d("simple -> start mg",[]), ?APPLY(ProxyPid, fun() -> megaco_simple_mg:start() end), receive - {res, _, MgList} when list(MgList), length(MgList) == 4 -> + {res, _, MgList} when is_list(MgList) andalso (length(MgList) =:= 4) -> d("simple -> received res: ~p",[MgList]), Verify = - fun({_MgMid, {TransId, Res}}) when TransId == 1 -> + fun({_MgMid, {TransId, Res}}) when TransId =:= 1 -> case Res of - {ok, [AR]} when record(AR, 'ActionReply') -> + {ok, [AR]} when is_record(AR, 'ActionReply') -> case AR#'ActionReply'.commandReply of [{serviceChangeReply, SCR}] -> case SCR#'ServiceChangeReply'.serviceChangeResult of diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_load_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_load_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_load_test.erl 2009-03-12 12:31:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_load_test.erl 2009-09-18 15:13:04.000000000 +0100 @@ -127,7 +127,7 @@ []; single_user_light_load(doc) -> []; -single_user_light_load(Config) when list(Config) -> +single_user_light_load(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, single_user_light_load), put(sname, "TEST"), @@ -150,7 +150,7 @@ []; single_user_medium_load(doc) -> []; -single_user_medium_load(Config) when list(Config) -> +single_user_medium_load(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, single_user_medium_load), put(sname, "TEST"), @@ -172,7 +172,7 @@ []; single_user_heavy_load(doc) -> []; -single_user_heavy_load(Config) when list(Config) -> +single_user_heavy_load(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, single_user_heavy_load), put(sname, "TEST"), @@ -194,7 +194,7 @@ []; single_user_extreme_load(doc) -> []; -single_user_extreme_load(Config) when list(Config) -> +single_user_extreme_load(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, single_user_extreme_load), put(sname, "TEST"), @@ -216,7 +216,7 @@ []; multi_user_light_load(doc) -> []; -multi_user_light_load(Config) when list(Config) -> +multi_user_light_load(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, multi_user_light_load), put(sname, "TEST"), @@ -238,7 +238,7 @@ []; multi_user_medium_load(doc) -> []; -multi_user_medium_load(Config) when list(Config) -> +multi_user_medium_load(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, multi_user_medium_load), put(sname, "TEST"), @@ -260,7 +260,7 @@ []; multi_user_heavy_load(doc) -> []; -multi_user_heavy_load(Config) when list(Config) -> +multi_user_heavy_load(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, multi_user_heavy_load), put(sname, "TEST"), @@ -282,7 +282,7 @@ []; multi_user_extreme_load(doc) -> []; -multi_user_extreme_load(Config) when list(Config) -> +multi_user_extreme_load(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, multi_user_extreme_load), put(sname, "TEST"), @@ -601,9 +601,9 @@ Name = lists:flatten(io_lib:format("~p~w", [BaseName,N])), make_node_names(BaseName, N-1, [make_node_name(Name)|Names]). -make_node_name(Name) when atom(Name) -> +make_node_name(Name) when is_atom(Name) -> make_node_name(atom_to_list(Name)); -make_node_name(Name) when list(Name) -> +make_node_name(Name) when is_list(Name) -> case string:tokens(atom_to_list(node()), [$@]) of [_,Host] -> list_to_atom(lists:concat([Name ++ "@" ++ Host])); @@ -611,7 +611,7 @@ exit("Test node must be started with '-sname'") end. -make_mids(MgNodes) when list(MgNodes), length(MgNodes) > 0 -> +make_mids(MgNodes) when is_list(MgNodes) andalso (length(MgNodes) > 0) -> make_mids(MgNodes, []). make_mids([], Mids) -> diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_mess_otp8212_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_mess_otp8212_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_mess_otp8212_test.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_mess_otp8212_test.erl 2009-11-20 08:48:38.000000000 +0000 @@ -0,0 +1,181 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% +%%---------------------------------------------------------------------- +%% Purpose: A fun implementation of user callbacks +%%---------------------------------------------------------------------- + +-module(megaco_mess_otp8212_test). + +-behaviour(megaco_user). + +%% Megaco user callback exports +-export([ + handle_connect/2, handle_connect/3, + handle_disconnect/3, + %% handle_syntax_error/3, handle_syntax_error/4, + %% handle_message_error/3, handle_message_error/4, + handle_trans_request/3, %% handle_trans_request/4, + %% handle_trans_long_request/3, handle_trans_long_request/4, + %% handle_trans_reply/4, handle_trans_reply/5, + %% handle_trans_ack/4, handle_trans_ack/5, + handle_unexpected_trans/3, handle_unexpected_trans/4 %% , + %% handle_trans_request_abort/4, handle_trans_request_abort/5, + %% handle_segment_reply/5, handle_segment_reply/6 + ]). + +%% Megaco encoder callback exports +-export([ + encode_message/3, + decode_message/3 + ]). + +%% Megaco transport callback exports +-export([ + send_message/2 + ]). + +-include("megaco_test_lib.hrl"). +-include_lib("megaco/include/megaco.hrl"). +-include_lib("megaco/include/megaco_message_v1.hrl"). + + +%%---------------------------------------------------------------------- +%% Megaco user callback +%%---------------------------------------------------------------------- + +%% -- handle_connect/2 -- + +handle_connect(_, _) -> + %% i("handle_connect -> entry"), + ok. + +handle_connect(_, _, otp8212_extra) -> + %% i("handle_connect -> entry"), + ok; +handle_connect(_, _, {otp8212_extra, _}) -> + %% i("handle_connect -> entry"), + ok. + +handle_disconnect(Conn, _, {user_disconnect, {otp8212_done, Pid}}) -> + %% i("handle_disconnect -> entry"), + Pid ! {disconnected, Conn}, + ok. + +handle_trans_request(_, _, _) -> %% incoming SC + %% i("handle_trans_request -> entry"), + {discard_ack, ["sc reply"]}. + +handle_unexpected_trans(_ConnHandle, _ProtocolVersion, _Trans) -> +%% i("handle_unexpected_trans -> entry with" +%% "~n ConnHandle: ~p" +%% "~n ProtocolVersion: ~p" +%% "~n Trans: ~p", [ConnHandle, ProtocolVersion, Trans]), + ok. +handle_unexpected_trans(_ConnHandle, _ProtocolVersion, _Trans, {otp8212_extra, Pid}) -> +%% i("handle_unexpected_trans -> entry with" +%% "~n ConnHandle: ~p" +%% "~n ProtocolVersion: ~p" +%% "~n Trans: ~p", [ConnHandle, ProtocolVersion, Trans]), + Pid ! {handle_unexpected_trans, otp8212_extra}, + ok. + + +%%---------------------------------------------------------------------- +%% Megaco encoder callback +%%---------------------------------------------------------------------- + + +%% Should only be encoding MGC's outgoing request, which we expect +%% has transaction id = 1. + +-define(REQUEST(Id, A), + #'MegacoMessage' + {mess + = #'Message' + {version = 1, + mId = {deviceName,"MGC"}, + messageBody + = {transactions, [{transactionRequest, + #'TransactionRequest'{transactionId = Id, + actions = A}}]}}}). + +-define(REPLY(A), + #'MegacoMessage' + {mess + = #'Message' + {version = 1, + mId = {deviceName,"MGC"}, + messageBody + = {transactions, + [{transactionReply, + #'TransactionReply'{transactionResult + = {actionReplies, [A]}}}]}}}). + +request() -> + list_to_binary("!/1 MGC T=1{C=-{SC=ROOT{SV{MT=RS,RE=\"901\"}}}}"). + +sc_reply() -> + list_to_binary("!/1 MGC P=19731{C=-{SC=root}}"). + +encode_message(_, _, ?REQUEST(1, "action request")) -> + %% i("encode_message -> entry with request"), + {ok, request()}; + +encode_message(_, _, ?REPLY("sc reply")) -> + %% i("encode_message -> entry with reply"), + {ok, sc_reply()}. + +decode_message(_, V248, Bin) -> + %% i("decode_message -> entry"), + megaco_compact_text_encoder:decode_message([], V248, Bin). + + +%%---------------------------------------------------------------------- +%% Megaco transport callback +%%---------------------------------------------------------------------- + +%% Outgoing SC reply. +%% send_message(otp8212_scr, _) -> +%% i("send_message(scr) -> entry"), +%% ok; + +%% Outgoing request: fake reception of the the reply. +send_message({RH, ControlPid, _, WrongMidStr}, _) -> + %% i("send_message -> entry"), + spawn(fun() -> receive_reply(200, RH, ControlPid, WrongMidStr) end), + ok. + +receive_reply(After, RH, ControlPid, WrongMidStr) -> + timer:sleep(After), + %% i("receive_reply -> issue reply"), + megaco:process_received_message(RH, ControlPid, + otp8212_sendhandle, + reply(WrongMidStr), + {otp8212_extra, ControlPid}). + +reply(WrongMidStr) -> %% note "wrong" mid. + list_to_binary("!/1 " ++ WrongMidStr ++ " P=1{C=-{SC=root}}"). + +%% i(F) -> +%% i(F, []). + +%% i(F, A) -> +%% io:format(F ++ "~n", A). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_mess_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_mess_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_mess_test.erl 2009-03-12 12:30:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_mess_test.erl 2009-11-20 13:37:10.000000000 +0000 @@ -77,7 +77,10 @@ otp_6865_request_and_reply_plain_extra2/1, otp_7189/1, otp_7259/1, - otp_7713/1 + otp_7713/1, + otp_8183/1, + otp_8183_request1/1, + otp_8212/1 ]). %% -behaviour(megaco_user). @@ -260,6 +263,11 @@ otp_7189_mg_verify_service_change_rep_msg/1, otp_7189_mg_verify_notify_req_msg/1, + %% Case: otp_6442_resend_request1 + otp_8183_request1_mg_verify_handle_connect/1, + otp_8183_request1_mg_verify_service_change_rep/1, + otp_8183_request1_mg_verify_notify_rep/1, + %% Utility encode_msg/3, decode_msg/3 @@ -383,7 +391,9 @@ otp_6865, otp_7189, otp_7259, - otp_7713 + otp_7713, + otp_8183, + otp_8212 ]. otp_6442(suite) -> @@ -400,6 +410,11 @@ otp_6865_request_and_reply_plain_extra2 ]. +otp_8183(suite) -> + [ + otp_8183_request1 + ]. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1942,7 +1957,7 @@ "reply (discard ack). " "The MGC is a megaco instance (megaco event sequence) and the " "MG is emulated (tcp event sequence)"]; -single_trans_req_and_reply(Config) when list(Config) -> +single_trans_req_and_reply(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, strar), @@ -2451,7 +2466,7 @@ "reply with handle_ack and a reply_timer in sendoptions. " "The MGC is a megaco instance (megaco event sequence) and the " "MG is emulated (tcp event sequence)"]; -single_trans_req_and_reply_sendopts(Config) when list(Config) -> +single_trans_req_and_reply_sendopts(Config) when is_list(Config) -> %% Skippable = [{unix, [darwin, linux]}], Condition = fun() -> ?OS_BASED_SKIP(Skippable) end, @@ -4852,7 +4867,7 @@ "then receive the same reply again after the timeout. " "The MGC is a megaco instance (megaco event sequence) and the " "MG is emulated (tcp event sequence)"]; -trans_req_and_reply_and_req(Config) when list(Config) -> +trans_req_and_reply_and_req(Config) when is_list(Config) -> %% Skippable = [{unix, [darwin, linux]}], Condition = fun() -> ?OS_BASED_SKIP(Skippable) end, @@ -7010,7 +7025,7 @@ otp_4359_analyze_result(RH,T). otp_4359_analyze_encoded_message(RH, ExpErrorCode, M) - when is_record(RH, megaco_receive_handle), binary(M) -> + when is_record(RH, megaco_receive_handle) andalso is_binary(M) -> #megaco_receive_handle{encoding_mod = Mod, encoding_config = Conf} = RH, case (catch Mod:decode_message(Conf, M)) of @@ -8825,7 +8840,7 @@ []; otp_6276(doc) -> "OTP-6276: Cancel when receiving reply raise condition"; -otp_6276(Config) when list(Config) -> +otp_6276(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, otp_6276), @@ -9480,7 +9495,7 @@ []; otp_6276(doc) -> "OTP-6276"; -otp_6276(Config) when list(Config) -> +otp_6276(Config) when is_list(Config) -> ?SKIP("included only if compiled with USE_MEGACO_TEST_CODE=true"). @@ -11908,7 +11923,7 @@ []; otp_7189(doc) -> "..."; -otp_7189(Config) when list(Config) -> +otp_7189(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, otp_7189), @@ -12845,6 +12860,482 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +otp_8183_request1(suite) -> + []; +otp_8183_request1(Config) when is_list(Config) -> + put(verbosity, debug), + put(sname, "TEST"), + put(tc, otp8183r1), + i("starting"), + + MgNode = make_node_name(mg), + d("start (MG) node: ~p", [MgNode]), + ok = megaco_test_lib:start_nodes([MgNode], ?FILE, ?LINE), + + d("[MG] start the simulator "), + {ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode), + + d("[MG] create the event sequence"), + MgMid = {deviceName,"mg"}, + MgEvSeq = otp_8183_r1_mg_event_sequence(MgMid), + + i("wait some time before starting the MG simulation"), + sleep(1000), + + d("[MG] start the simulation"), + {ok, MgId} = megaco_test_megaco_generator:exec(Mg, MgEvSeq), + + i("await the transport module service change send_message event"), + Pid = otp_8183_expect(fun(Ev) -> otp_8183_r1_verify_scr_msg(Ev) end, 5000), + + i("wait some before issuing the service change reply"), + sleep(500), + + i("send the service change reply"), + MgcMid = {deviceName,"mgc"}, + ServiceChangeReply = otp_8183_r1_mgc_service_change_reply_msg(MgcMid, 1, 1), + megaco_test_generic_transport:incomming_message(Pid, ServiceChangeReply), + + i("await the transport module " + "notify-request send_message event from MG: " + "ignore"), + {TransId2, Cid2, TermId2} = + otp_8183_expect(fun(Ev) -> otp_8183_r1_verify_nr_msg(Ev) end, 5000), + + i("wait some before issuing the notify reply (twice)"), + sleep(500), + + i("send the notify reply, twice times"), + NotifyReply = + otp_8183_r1_mgc_notify_reply_msg(MgcMid, TransId2, Cid2, TermId2), + megaco_test_generic_transport:incomming_message(Pid, NotifyReply), + megaco_test_generic_transport:incomming_message(Pid, NotifyReply), + + d("await the generator reply"), + await_completion([MgId]), + + %% Tell Mg to stop + i("[MG] stop generator"), + megaco_test_megaco_generator:stop(Mg), + + i("done", []), + ok. + + +otp_8183_expect(Verify, Timeout) when (Timeout > 0) -> + T = mtime(), + receive + Msg -> + case (catch Verify(Msg)) of + {ok, Result} -> + d("verified after ~p msec", [mtime() - T]), + Result; + skip -> + otp_8183_expect(Verify, to(Timeout, T)); + {error, Reason} -> + exit({verification_failed, Reason}) + end + after Timeout -> + exit(timeout) + end; +otp_8183_expect(_, _Timeout) -> + exit(timeout). + +otp_8183_r1_verify_scr_msg( + {transport_event, {send_message, _SH, {message, Msg}}, Pid}) + when is_record(Msg, 'MegacoMessage') -> + d("received expected service change request message: " + "~n Msg: ~p", [Msg]), + Reply = ok, + Pid ! {transport_reply, Reply, self()}, + {ok, Pid}; +otp_8183_r1_verify_scr_msg( + {transport_event, {send_message, _SH, BadMsg}, _Pid}) -> + io:format("otp_8183_r1_verify_scr_msg -> error: " + "~n BadMsg: ~p" + "~n", [BadMsg]), + {error, {invalid_message, BadMsg}}; +otp_8183_r1_verify_scr_msg({transport_event, BadEvent, _Pid}) -> + io:format("otp_8183_r1_verify_scr_msg -> error: " + "~n BadEvent: ~p" + "~n", [BadEvent]), + {error, {invalid_message, BadEvent}}; +otp_8183_r1_verify_scr_msg(Msg) -> + io:format("otp_8183_r1_verify_scr_msg -> error: " + "~n Msg: ~p" + "~n", [Msg]), + {error, {invalid_message, Msg}}. + +otp_8183_r1_verify_nr_msg( + {transport_event, {send_message, _SH, {message, Msg}}, Pid}) + when is_record(Msg, 'MegacoMessage') -> + io:format("otp_8183_r1_verify_nr_msg -> " + "entry when received expected message with" + "~n Msg: ~p" + "~n", [Msg]), + Reply = ok, + Pid ! {transport_reply, Reply, self()}, + #'MegacoMessage'{mess = Mess} = Msg, + #'Message'{mId = _Mid, + messageBody = Body} = Mess, + {transactions, Transactions} = Body, + [Transaction] = Transactions, + {transactionRequest, TransReq} = Transaction, + #'TransactionRequest'{transactionId = TransId, + actions = Actions} = TransReq, + [Action] = Actions, + #'ActionRequest'{contextId = Cid, + commandRequests = CmdReqs} = Action, + [CmdReq] = CmdReqs, + #'CommandRequest'{command = Cmd} = CmdReq, + {notifyReq, NR} = Cmd, + #'NotifyRequest'{terminationID = [TermId]} = NR, + {ok, {TransId, Cid, TermId}}; +otp_8183_r1_verify_nr_msg(Msg) -> + io:format("otp_8183_r1_verify_nr_msg -> entry when error with" + "~n Msg: ~p" + "~n", [Msg]), + {error, {invalid_message, Msg}}. + +otp_8183_r1_mgc_service_change_reply_msg(Mid, TransId, Cid) -> + SCRP = #'ServiceChangeResParm'{serviceChangeMgcId = Mid}, + SCRPs = {serviceChangeResParms, SCRP}, + Root = #megaco_term_id{id = ["root"]}, + SCR = #'ServiceChangeReply'{terminationID = [Root], + serviceChangeResult = SCRPs}, + CR = {serviceChangeReply, SCR}, + otp_8183_r1_mgc_reply_msg(Mid, TransId, CR, Cid). + +otp_8183_r1_mgc_notify_reply_msg(Mid, TransId, Cid, TermId) -> + NR = #'NotifyReply'{terminationID = [TermId]}, + CR = {notifyReply, NR}, + otp_8183_r1_mgc_reply_msg(Mid, TransId, CR, Cid). + +otp_8183_r1_mgc_reply_msg(Mid, TransId, CR, Cid) -> + AR = #'ActionReply'{contextId = Cid, + commandReply = [CR]}, + ARs = {actionReplies, [AR]}, + TR = #'TransactionReply'{transactionId = TransId, + transactionResult = ARs}, + Body = {transactions, [{transactionReply, TR}]}, + Mess = #'Message'{version = 1, + mId = Mid, + messageBody = Body}, + #'MegacoMessage'{mess = Mess}. + + +%% +%% MG generator stuff +%% +-ifdef(megaco_hipe_special). +-define(otp_8183_r1_mg_verify_handle_connect_fun(), + {?MODULE, otp_8183_r1_mg_verify_handle_connect, []}). +-define(otp_8183_r1_mg_verify_service_change_rep_fun(), + {?MODULE, otp_8183_r1_mg_verify_service_change_rep, []}). +-define(otp_8183_r1_mg_verify_notify_rep_fun(Nr + {?MODULE, otp_8183_r1_mg_verify_notify_rep, [Nr). +-else. +-define(otp_8183_r1_mg_verify_handle_connect_fun(), + otp_8183_r1_mg_verify_handle_connect_fun()). +-define(otp_8183_r1_mg_verify_service_change_rep_fun(), + otp_8183_r1_mg_verify_service_change_rep_fun()). +-define(otp_8183_r1_mg_verify_notify_rep_fun(Nr), + otp_8183_r1_mg_verify_notify_rep_fun(Nr)). +-endif. + +otp_8183_r1_mg_event_sequence(Mid) -> + RI = [ + {port, self()}, % This is just a trick to get my pid to the transport module + {encoding_module, megaco_pretty_text_encoder}, + {encoding_config, []}, + {transport_module, megaco_test_generic_transport} + ], + ServiceChangeReq = + otp_8183_r1_mg_service_change_request_ar(Mid, 1), + Tid = #megaco_term_id{id = ["00000000","00000000","01101101"]}, + NotifyReq = otp_8183_r1_mg_notify_request_ar(1, Tid, 1), + ConnectVerify = + ?otp_8183_r1_mg_verify_handle_connect_fun(), + ServiceChangeReplyVerify = + ?otp_8183_r1_mg_verify_service_change_rep_fun(), + NotifyReplyVerify = + fun(Nr) -> + ?otp_8183_r1_mg_verify_notify_rep_fun(Nr) + end, + EvSeq = [ + {debug, true}, % false}, + megaco_start, + {megaco_start_user, Mid, RI, []}, + start_transport, + {megaco_trace, disable}, + {megaco_system_info, users}, + {megaco_system_info, connections}, + connect, + {megaco_callback, handle_connect, ConnectVerify}, + megaco_connect, + {megaco_cast, [ServiceChangeReq], []}, + {megaco_callback, handle_connect, ConnectVerify}, + {megaco_callback, handle_trans_reply, ServiceChangeReplyVerify}, + + {sleep, 1000}, + {megaco_cast, [NotifyReq], [{request_keep_alive_timeout, 5000}]}, + {megaco_callback, handle_trans_reply, NotifyReplyVerify(1)}, + {megaco_callback, handle_trans_reply, NotifyReplyVerify(2)}, + {sleep, 1000}, + megaco_stop_user, + megaco_stop, + {sleep, 1000} + ], + EvSeq. + + +-ifndef(megaco_hipe_special). +otp_8183_r1_mg_verify_handle_connect_fun() -> + fun(Ev) -> + otp_8183_r1_mg_verify_handle_connect(Ev) + end. +-endif. + +otp_8183_r1_mg_verify_handle_connect({handle_connect, CH, ?VERSION}) -> + io:format("otp_8183_r1_mg_verify_handle_connect -> ok" + "~n CH: ~p~n", [CH]), + {ok, CH, ok}; +otp_8183_r1_mg_verify_handle_connect(Else) -> + io:format("otp_8183_r1_mg_verify_handle_connect -> unknown" + "~n Else: ~p~n", [Else]), + {error, Else, ok}. + +-ifndef(megaco_hipe_special). +otp_8183_r1_mg_verify_service_change_rep_fun() -> + fun(Rep) -> + otp_8183_r1_mg_verify_service_change_rep(Rep) + end. +-endif. + +otp_8183_r1_mg_verify_service_change_rep( + {handle_trans_reply, _CH, ?VERSION, {ok, [AR]}, _}) -> + (catch otp_8183_r1_mg_do_verify_service_change_rep(AR)); +otp_8183_r1_mg_verify_service_change_rep(Crap) -> + io:format("otp_8183_r1_mg_verify_service_change_rep -> crap" + "~n Crap: ~p" + "~n", [Crap]), + {error, Crap, ok}. + +otp_8183_r1_mg_do_verify_service_change_rep(AR) -> + io:format("otp_8183_r1_mg_do_verify_service_change_rep -> ok" + "~n AR: ~p~n", [AR]), + CR = + case AR of + #'ActionReply'{commandReply = [CmdRep]} -> + CmdRep; + _ -> + Reason1 = {invalid_action_reply, AR}, + throw({error, Reason1, ok}) + end, + SCR = + case CR of + {serviceChangeReply, ServChRep} -> + ServChRep; + _ -> + Reason2 = {invalid_command_reply, CR}, + throw({error, Reason2, ok}) + end, + {Tid, SCRes} = + case SCR of + #'ServiceChangeReply'{terminationID = [TermID], + serviceChangeResult = Res} -> + {TermID, Res}; + _ -> + Reason3 = {invalid_service_change_reply, SCR}, + throw({error, Reason3, ok}) + end, + case Tid of + #megaco_term_id{contains_wildcards = false, id = ["root"]} -> + ok; + _ -> + Reason4 = {invalid_termination_id, Tid}, + throw({error, Reason4, ok}) + end, + SCRParm = + case SCRes of + {serviceChangeResParms, ServChResParms} -> + ServChResParms; + _ -> + Reason5 = {invalid_serviceChangeResult, SCRes}, + throw({error, Reason5, ok}) + end, + case SCRParm of + #'ServiceChangeResParm'{serviceChangeMgcId = _RemoteMid} -> + {ok, AR, ok}; + _ -> + Reason6 = {invalid_service_change_result, SCRParm}, + {error, Reason6, ok} + end. + +-ifndef(megaco_hipe_special). +otp_8183_r1_mg_verify_notify_rep_fun(Nr) -> + fun(Rep) -> + otp_8183_r1_mg_verify_notify_rep(Nr, Rep) + end. +-endif. + +otp_8183_r1_mg_verify_notify_rep(Nr, + {handle_trans_reply, _CH, ?VERSION, {ok, Nr, [AR]}, _}) -> + io:format("otp_8183_r1_mg_verify_notify_rep -> ok" + "~n Nr: ~p" + "~n AR: ~p" + "~n", [Nr, AR]), + {ok, AR, ok}; +otp_8183_r1_mg_verify_notify_rep(Nr, Else) -> + io:format("otp_8183_r1_mg_verify_notify_rep -> unknown" + "~n Nr: ~p" + "~n Else: ~p" + "~n", [Nr, Else]), + {error, Else, ok}. + + +otp_8183_r1_mg_service_change_request_ar(_Mid, Cid) -> + Prof = cre_serviceChangeProf("resgw", 1), + SCP = cre_serviceChangeParm(restart, ["901 mg col boot"], Prof), + Root = #megaco_term_id{id = ["root"]}, + SCR = cre_serviceChangeReq([Root], SCP), + CMD = cre_command(SCR), + CR = cre_cmdReq(CMD), + cre_actionReq(Cid, [CR]). + +otp_8183_r1_mg_notify_request_ar(Rid, Tid, Cid) -> + TT = cre_timeNotation("19990729", "22000000"), + Ev = cre_obsEvent("al/of", TT), + EvsDesc = cre_obsEvsDesc(Rid, [Ev]), + NR = cre_notifyReq([Tid], EvsDesc), + CMD = cre_command(NR), + CR = cre_cmdReq(CMD), + cre_actionReq(Cid, [CR]). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +otp8212_scr(MidStr) -> + Msg = "!/1 " ++ MidStr ++ " T=19731{C=-{SC=ROOT{SV{MT=RS,RE=\"901\"}}}}", + list_to_binary(Msg). + +otp_8212(suite) -> + []; +otp_8212(doc) -> + []; +otp_8212(Config) when is_list(Config) -> + %% ?ACQUIRE_NODES(1, Config), + + put(verbosity, debug), + put(sname, "TEST"), + put(tc, otp8212), + i("starting"), + + Extra = otp8212_extra, + NoMid = preliminary_mid, + LocalMid = {deviceName, "MGC"}, + RemoteMidStr1 = "bgf1", + RemoteMid1 = {deviceName, RemoteMidStr1}, + RemoteMidStr2 = "bgf2", + RemoteMid2 = {deviceName, RemoteMidStr2}, + UserMod = megaco_mess_otp8212_test, + + d("set megaco trace level to max",[]), + megaco:enable_trace(max, io), + + d("start megaco app",[]), + ?VERIFY(ok, application:start(megaco)), + + d("start local user (MGC) ~p", [LocalMid]), + UserConfig = [{user_mod, UserMod}, {send_mod, UserMod}], + ?VERIFY(ok, megaco:start_user(LocalMid, UserConfig)), + + d("get (MGC) receive info for ~p", [LocalMid]), + RH0 = user_info(LocalMid, receive_handle), + RH = RH0#megaco_receive_handle{encoding_mod = megaco_mess_otp8212_test, + encoding_config = []}, + + d("do a pre-connect for ~p", [LocalMid]), + ControlPid = self(), + SendHandle = {RH, ControlPid, RemoteMidStr1, RemoteMidStr2}, + ?VERIFY({ok, _}, megaco:connect(RH, NoMid, SendHandle, ControlPid)), + + d("simulate incomming service change message from ~p", + [RemoteMidStr1]), + ?VERIFY(ok, + megaco:process_received_message(RH, ControlPid, + otp8212_scr, + otp8212_scr(RemoteMidStr1))), + + d("get the updated connection handle", []), + [CH] = megaco:user_info(LocalMid, connections), + + d("verify connection with ~p", [RemoteMidStr1]), + ?VERIFY(RemoteMid1, megaco:conn_info(CH, remote_mid)), + + d("send a request to ~p but receive no reply but an unexpected call", + [RemoteMidStr1]), + Res = megaco:call(CH, ["action request"], [{request_timer, 2000}]), + d("request result: ~p", [Res]), + ?VERIFY({1, [{error, {wrong_mid, RemoteMid2, RemoteMid1, _}, {Extra, _}}]}, Res), + + Conns = disconnect_all(LocalMid), + await_disconnected(Conns), + + d("stop megaco user ~p",[LocalMid]), + ok = await_stopped_user(LocalMid), + + d("stop megaco app",[]), + ?VERIFY(ok, application:stop(megaco)), + ?RECEIVE([]), + + d("done",[]), + ok. + +disconnect_all(LocalMid) -> + Conns = megaco:user_info(LocalMid, connections), + d("[~p] disconnect from all connections: ~n~p", [LocalMid, Conns]), + lists:foreach( + fun(Conn) -> + d("[~p] disconnect from connection ~p", [LocalMid, Conn]), + DiscoRes = megaco:disconnect(Conn, {otp8212_done, self()}), + d("[~p] disconnect result: ~p", [LocalMid, DiscoRes]) + end, + Conns), + Conns. + +await_disconnected([]) -> + ok; +await_disconnected(Conns) -> + receive + {disconnected, Conn} -> + d("disconnected: ~p", [Conn]), + Conns2 = lists:delete(Conn, Conns), + await_disconnected(Conns2) + end. + + +await_stopped_user(LocalMid) -> + await_stopped_user(LocalMid, 10). + +await_stopped_user(LocalMid, N) when N =< 0 -> + ?ERROR({failed_stopping_user, LocalMid}); +await_stopped_user(LocalMid, N) -> + case megaco:stop_user(LocalMid) of + ok -> + d("user stopped(~w)", [N]), + ok; + {error, {active_connections, _}} -> + d("still active connections when N = ~w", [N]), + Conns = disconnect_all(LocalMid), + await_disconnected(Conns), + ?SLEEP(500), + await_stopped_user(LocalMid, N-1) + end. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + cre_ErrDesc(T) -> EC = ?megaco_internal_gateway_error, ET = lists:flatten(io_lib:format("~w",[T])), @@ -12897,9 +13388,9 @@ #'TransactionRequest'{transactionId = TransId, actions = ARs}. -cre_transResult(ED) when record(ED, 'ErrorDescriptor') -> +cre_transResult(ED) when is_record(ED, 'ErrorDescriptor') -> {transactionError, ED}; -cre_transResult([AR|_] = ARs) when record(AR, 'ActionReply') -> +cre_transResult([AR|_] = ARs) when is_record(AR, 'ActionReply') -> {actionReplies, ARs}. cre_transReply(TransId, Res) -> @@ -12950,7 +13441,7 @@ #'ActionReply'{contextId = CtxId, commandReply = CmdRep}. -cre_serviceChangeProf(Name, Ver) when is_list(Name), integer(Ver) -> +cre_serviceChangeProf(Name, Ver) when is_list(Name) andalso is_integer(Ver) -> #'ServiceChangeProfile'{profileName = Name, version = Ver}. diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_mess_user_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_mess_user_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_mess_user_test.erl 2009-03-12 12:30:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_mess_user_test.erl 2009-09-18 15:12:47.000000000 +0100 @@ -71,7 +71,7 @@ case get(?MODULE) of undefined -> exit(no_server, ?MODULE); - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> Pid end. @@ -80,7 +80,7 @@ ?APPLY(Pid, Fun), ok. -reply(Mod, Line, Fun) when function(Fun) -> +reply(Mod, Line, Fun) when is_function(Fun) -> receive {?MODULE, Pid, UserCallback} -> UserReply = Fun(UserCallback), @@ -99,7 +99,7 @@ case global:whereis_name(?SERVER) of undefined -> exit({no_server, ?SERVER, Request}); - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> ?LOG("call[~p] -> bang request: " "~n ~p" "~n", [Pid, Request]), diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_mib_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_mib_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_mib_test.erl 2009-03-12 12:31:09.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_mib_test.erl 2009-09-18 15:13:00.000000000 +0100 @@ -86,7 +86,7 @@ []; plain(doc) -> ["Test case for the basic statistics counter handling. "]; -plain(Config) when list(Config) -> +plain(Config) when is_list(Config) -> io:format("create test table 1~n", []), Tab1 = megaco_test_cnt1, megaco_stats:init(Tab1), @@ -188,7 +188,7 @@ []; connect(doc) -> []; -connect(Config) when list(Config) -> +connect(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), i("connect -> starting"), @@ -275,7 +275,7 @@ []; traffic(doc) -> []; -traffic(Config) when list(Config) -> +traffic(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), i("traffic -> starting"), @@ -415,7 +415,7 @@ traffic_verify_mgc_stats(Pid, Out, In) - when pid(Pid), integer(Out), integer(In) -> + when is_pid(Pid) andalso is_integer(Out) andalso is_integer(In) -> d("traffic_verify_mgc_stats -> entry with" "~n Out: ~p" "~n In: ~p", [Out, In]), @@ -423,7 +423,7 @@ d("traffic_verify_mgc_stats -> stats (2) for Mgc: ~n~p~n", [Stats]), traffic_verify_mgc_stats(Stats, Out, In); -traffic_verify_mgc_stats(Stats, Out, In) when list(Stats) -> +traffic_verify_mgc_stats(Stats, Out, In) when is_list(Stats) -> d("traffic_verify_mgc_stats -> checking stats"), Gen = traffic_verify_get_stats(gen, Stats), Trans = traffic_verify_get_stats(trans, Stats), @@ -463,7 +463,7 @@ traffic_verify_mg_stats(MgConf, Out, In) - when integer(Out), integer(In) -> + when is_integer(Out) andalso is_integer(In) -> d("traffic_verify_mg_stats -> entry with" "~n Out: ~p" "~n In: ~p", [Out, In]), @@ -806,7 +806,7 @@ SendMod -> exit(Pid, Reason) end. -get_trans_stats(P, SendMod) when pid(P) -> +get_trans_stats(P, SendMod) when is_pid(P) -> case (catch SendMod:get_stats()) of {ok, Stats} -> {SendMod, Stats}; @@ -891,7 +891,7 @@ d("failed creating mgc tcp listen socket after ~p tries: ~p", [N, InitialReason]), throw({error, {failed_starting_tcp_listen, InitialReason}}); -mgc_tcp_create_listen(Sup, Opts, MaxN, N, InitialReason) +mgc_tcp_create_listen(Sup, Opts, MaxN, N, _InitialReason) when is_integer(N) andalso is_integer(MaxN) andalso (MaxN > N) -> d("try create mgc tcp listen socket [~w]", [N]), case megaco_tcp:listen(Sup, Opts) of @@ -1161,7 +1161,7 @@ "own connection ~p: ~p. " "~nexiting...", [CH, Reason]), exit({invalid_connection, CH, Reason}); - SendMod when atom(SendMod) -> + SendMod when is_atom(SendMod) -> SendMod:reset_stats() end. @@ -1343,14 +1343,14 @@ {ok, S#mg{conn_handle = CH, state = connected}}; mg_handle_request({handle_trans_reply, _CH, _PV, {error, ED}, RD}, #mg{parent = Pid, load_counter = 0} = S) - when record(ED, 'ErrorDescriptor'), - record(RD, 'ObservedEventsDescriptor') -> + when is_record(ED, 'ErrorDescriptor') andalso + is_record(RD, 'ObservedEventsDescriptor') -> Pid ! {load_complete, self()}, {ok, S}; mg_handle_request({handle_trans_reply, _CH, _PV, {error, ED}, RD}, #mg{load_counter = N} = S) - when record(ED, 'ErrorDescriptor'), - record(RD, 'ObservedEventsDescriptor') -> + when is_record(ED, 'ErrorDescriptor') andalso + is_record(RD, 'ObservedEventsDescriptor') -> apply_load_timer(), {ok, S#mg{load_counter = N-1}}; @@ -1542,7 +1542,7 @@ case text_codec(EM) of true -> case megaco:system_info(text_config) of - [Conf] when list(Conf) -> + [Conf] when is_list(Conf) -> Conf; _ -> [] diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_mreq_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_mreq_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_mreq_test.erl 2009-03-12 12:31:11.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_mreq_test.erl 2009-09-18 15:13:02.000000000 +0100 @@ -91,7 +91,7 @@ []; req_and_rep(doc) -> []; -req_and_rep(Config) when list(Config) -> +req_and_rep(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), i("req_and_rep -> starting"), @@ -273,7 +273,7 @@ []; req_and_pending(doc) -> []; -req_and_pending(Config) when list(Config) -> +req_and_pending(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), i("req_and_pending -> starting"), @@ -332,7 +332,7 @@ []; req_and_cancel(doc) -> []; -req_and_cancel(Config) when list(Config) -> +req_and_cancel(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), i("req_and_cancel -> starting"), diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_pending_limit_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_pending_limit_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_pending_limit_test.erl 2009-03-12 12:31:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_pending_limit_test.erl 2009-09-18 15:13:08.000000000 +0100 @@ -189,7 +189,7 @@ []; sent_timer_late_reply(doc) -> "..."; -sent_timer_late_reply(Config) when list(Config) -> +sent_timer_late_reply(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, sent_timer_late_reply), @@ -264,7 +264,7 @@ []; sent_timer_exceeded(doc) -> "..."; -sent_timer_exceeded(Config) when list(Config) -> +sent_timer_exceeded(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, sent_timer_exceeded), @@ -337,7 +337,7 @@ []; sent_timer_exceeded_long(doc) -> "..."; -sent_timer_exceeded_long(Config) when list(Config) -> +sent_timer_exceeded_long(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, sent_timer_exceeded_long), @@ -413,7 +413,7 @@ []; sent_resend_late_reply(doc) -> "..."; -sent_resend_late_reply(Config) when list(Config) -> +sent_resend_late_reply(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, sent_resend_late_reply), @@ -496,7 +496,7 @@ []; sent_resend_late_reply(doc) -> "..."; -sent_resend_late_reply(Config) when list(Config) -> +sent_resend_late_reply(Config) when is_list(Config) -> ?SKIP("included only if compiled with USE_MEGACO_TEST_CODE=true"). -endif. @@ -513,7 +513,7 @@ []; sent_resend_exceeded(doc) -> "..."; -sent_resend_exceeded(Config) when list(Config) -> +sent_resend_exceeded(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, sent_resend_exceeded), @@ -592,7 +592,7 @@ []; sent_resend_exceeded(doc) -> "..."; -sent_resend_exceeded(Config) when list(Config) -> +sent_resend_exceeded(Config) when is_list(Config) -> ?SKIP("included only if compiled with USE_MEGACO_TEST_CODE=true"). -endif. @@ -608,7 +608,7 @@ []; sent_resend_exceeded_long(doc) -> "..."; -sent_resend_exceeded_long(Config) when list(Config) -> +sent_resend_exceeded_long(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, sent_resend_exceeded_long), @@ -688,7 +688,7 @@ []; sent_resend_exceeded_long(doc) -> "..."; -sent_resend_exceeded_long(Config) when list(Config) -> +sent_resend_exceeded_long(Config) when is_list(Config) -> ?SKIP("included only if compiled with USE_MEGACO_TEST_CODE=true"). -endif. @@ -704,7 +704,7 @@ []; recv_limit_exceeded1(doc) -> "Received pending limit exceeded (exactly)"; -recv_limit_exceeded1(Config) when list(Config) -> +recv_limit_exceeded1(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, rle1), @@ -1084,7 +1084,7 @@ []; recv_limit_exceeded2(doc) -> "Received pending limit exceeded"; -recv_limit_exceeded2(Config) when list(Config) -> +recv_limit_exceeded2(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, rle2), @@ -1105,7 +1105,7 @@ otp_4956(suite) -> []; -otp_4956(Config) when list(Config) -> +otp_4956(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, otp_4956), @@ -1663,7 +1663,7 @@ []; otp_5310(doc) -> "..."; -otp_5310(Config) when list(Config) -> +otp_5310(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, otp_5310), @@ -1826,7 +1826,7 @@ []; otp_5619(doc) -> "..."; -otp_5619(Config) when list(Config) -> +otp_5619(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, otp_5619), @@ -1942,19 +1942,19 @@ #'NotifyRequest'{terminationID = Tid, observedEventsDescriptor = EvsDesc}. -cre_command(R) when record(R, 'NotifyRequest') -> +cre_command(R) when is_record(R, 'NotifyRequest') -> {notifyReq, R}; -cre_command(R) when record(R, 'ServiceChangeRequest') -> +cre_command(R) when is_record(R, 'ServiceChangeRequest') -> {serviceChangeReq, R}. cre_cmdReq(Cmd) -> #'CommandRequest'{command = Cmd}. -cre_actionReq(CtxId, CmdReqs) when list(CmdReqs) -> +cre_actionReq(CtxId, CmdReqs) when is_list(CmdReqs) -> #'ActionRequest'{contextId = CtxId, commandRequests = CmdReqs}. -cre_transReq(TransId, ARs) when list(ARs) -> +cre_transReq(TransId, ARs) when is_list(ARs) -> #'TransactionRequest'{transactionId = TransId, actions = ARs}. @@ -1967,18 +1967,18 @@ #'ServiceChangeResParm'{serviceChangeMgcId = Mid, serviceChangeVersion = V}. -cre_serviceChangeResult(SCRP) when record(SCRP, 'ServiceChangeResParm') -> +cre_serviceChangeResult(SCRP) when is_record(SCRP, 'ServiceChangeResParm') -> {serviceChangeResParms, SCRP}; -cre_serviceChangeResult(ED) when record(ED, 'ErrorDescriptor') -> +cre_serviceChangeResult(ED) when is_record(ED, 'ErrorDescriptor') -> {errorDescriptor, ED}. cre_serviceChangeReply(Tid, Res) -> #'ServiceChangeReply'{terminationID = Tid, serviceChangeResult = Res}. -cre_cmdReply(R) when record(R, 'NotifyReply') -> +cre_cmdReply(R) when is_record(R, 'NotifyReply') -> {notifyReply, R}; -cre_cmdReply(R) when record(R, 'ServiceChangeReply') -> +cre_cmdReply(R) when is_record(R, 'ServiceChangeReply') -> {serviceChangeReply, R}. cre_notifyReply(Tid) -> @@ -1999,20 +1999,20 @@ %% -- -cre_serviceChangeProf(Name, Ver) when list(Name), integer(Ver) -> +cre_serviceChangeProf(Name, Ver) when is_list(Name) andalso is_integer(Ver) -> #'ServiceChangeProfile'{profileName = Name, version = Ver}. -cre_transaction(Trans) when record(Trans, 'TransactionRequest') -> +cre_transaction(Trans) when is_record(Trans, 'TransactionRequest') -> {transactionRequest, Trans}; -cre_transaction(Trans) when record(Trans, 'TransactionPending') -> +cre_transaction(Trans) when is_record(Trans, 'TransactionPending') -> {transactionPending, Trans}; -cre_transaction(Trans) when record(Trans, 'TransactionReply') -> +cre_transaction(Trans) when is_record(Trans, 'TransactionReply') -> {transactionReply, Trans}; -cre_transaction(Trans) when record(Trans, 'TransactionAck') -> +cre_transaction(Trans) when is_record(Trans, 'TransactionAck') -> {transactionResponseAck, Trans}. -cre_transactions(Trans) when list(Trans) -> +cre_transactions(Trans) when is_list(Trans) -> {transactions, Trans}. cre_message(Version, Mid, Body) -> diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_sdp_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_sdp_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_sdp_test.erl 2009-03-12 12:30:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_sdp_test.erl 2009-09-18 13:47:43.000000000 +0100 @@ -26,7 +26,9 @@ -export([all/1, decode_encode/1, - %% tickets/1, + + tickets/1, + otp8123/1, init_per_testcase/2, fin_per_testcase/2, @@ -55,19 +57,21 @@ all(suite) -> [ - decode_encode%% , -%% tickets + decode_encode, + tickets ]. -%% tickets(suite) -> -%% []. +tickets(suite) -> + [ + otp8123 + ]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% decode_encode(suite) -> []; -decode_encode(Config) when list(Config) -> +decode_encode(Config) when is_list(Config) -> io:format("decode_encode -> entry with" "~n Config: ~p" "~n", [Config]), @@ -764,6 +768,75 @@ %% =============================================================== + +otp8123(suite) -> + []; +otp8123(Config) when is_list(Config) -> + io:format("otp8123 -> entry with" + "~n Config: ~p" + "~n", [Config]), + + Instructions = + [ + pg_dec_instruction("property group 01 - dec [ok]", otp8123_pg1()), + pg_dec_instruction("property group 02 - dec [ok]", otp8123_pg2()), + pg_dec_instruction("property group 03 - dec [ok]", otp8123_pg3()), + pg_dec_instruction("property group 04 - dec [ok]", otp8123_pg4()) + ], + exec(Instructions), + ok. + +otp8123_pg1() -> + PP1 = #'PropertyParm'{name = "m", + value = ["audio 49154 RTP/AVP 8"]}, + PP2 = #'PropertyParm'{name = "a", + value = ["maxptime: 30"]}, + PP3 = #'PropertyParm'{name = "a", + value = ["ptime:2"]}, + PP4 = #'PropertyParm'{name = "a", + value = ["tpmap:8 PCMA/8000/1"]}, + PG = [PP1, PP2, PP3, PP4], + [{PP, ok} || PP <- PG]. + +otp8123_pg2() -> + PP1 = #'PropertyParm'{name = "m", + value = ["audio 49154 RTP/AVP 8"]}, + PP2 = #'PropertyParm'{name = "a", + value = ["maxptime: 30 "]}, + PP3 = #'PropertyParm'{name = "a", + value = ["ptime:2"]}, + PP4 = #'PropertyParm'{name = "a", + value = ["tpmap:8 PCMA/8000/1"]}, + PG = [PP1, PP2, PP3, PP4], + [{PP, ok} || PP <- PG]. + +otp8123_pg3() -> + PP1 = #'PropertyParm'{name = "m", + value = ["audio 49154 RTP/AVP 8"]}, + PP2 = #'PropertyParm'{name = "a", + value = ["maxptime:30"]}, + PP3 = #'PropertyParm'{name = "a", + value = ["ptime: 2"]}, + PP4 = #'PropertyParm'{name = "a", + value = ["tpmap:8 PCMA/8000/1"]}, + PG = [PP1, PP2, PP3, PP4], + [{PP, ok} || PP <- PG]. + +otp8123_pg4() -> + PP1 = #'PropertyParm'{name = "m", + value = ["audio 49154 RTP/AVP 8"]}, + PP2 = #'PropertyParm'{name = "a", + value = ["maxptime:30"]}, + PP3 = #'PropertyParm'{name = "a", + value = ["ptime: 2 "]}, + PP4 = #'PropertyParm'{name = "a", + value = ["tpmap:8 PCMA/8000/1"]}, + PG = [PP1, PP2, PP3, PP4], + [{PP, ok} || PP <- PG]. + + + +%% =============================================================== %% %% Instruction engine %% diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_segment_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_segment_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_segment_test.erl 2009-03-12 12:32:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_segment_test.erl 2009-09-18 15:13:30.000000000 +0100 @@ -118,7 +118,7 @@ send_segmented_msg_plain1(doc) -> "First plain test that it is possible to send segmented messages. " "Send window = infinity. "; -send_segmented_msg_plain1(Config) when list(Config) -> +send_segmented_msg_plain1(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, ssmp1), @@ -721,7 +721,7 @@ send_segmented_msg_plain2(doc) -> "Second plain test that it is possible to send segmented messages. " "Send window = infinity. "; -send_segmented_msg_plain2(Config) when list(Config) -> +send_segmented_msg_plain2(Config) when is_list(Config) -> %% Skippable = [{unix, [linux]}], Condition = fun() -> ?OS_BASED_SKIP(Skippable) end, @@ -1318,7 +1318,7 @@ send_segmented_msg_plain3(doc) -> "Third plain test that it is possible to send segmented messages. " "Send window = 1. "; -send_segmented_msg_plain3(Config) when list(Config) -> +send_segmented_msg_plain3(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, ssmp3), @@ -2005,7 +2005,7 @@ send_segmented_msg_plain4(doc) -> "Forth plain test that it is possible to send segmented messages. " "Send window = 3. "; -send_segmented_msg_plain4(Config) when list(Config) -> +send_segmented_msg_plain4(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, ssmp4), @@ -2686,7 +2686,7 @@ "Tests that it is possible to send segmented messages, when the " "segment reply is sent out-of-order. " "Send window = 3. "; -send_segmented_msg_ooo1(Config) when list(Config) -> +send_segmented_msg_ooo1(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, ssmo1), @@ -3367,7 +3367,7 @@ "Tests that the callbacks and error messages are delivered " "when a segment reply goes missing. Ack expected. " "Send window = 3. "; -send_segmented_msg_missing_seg_reply1(Config) when list(Config) -> +send_segmented_msg_missing_seg_reply1(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, ssmmsr1), @@ -4133,7 +4133,7 @@ "Tests that the callbacks and error messages are delivered " "when a segment reply goes missing. Ack expected. " "Send window = 1. "; -send_segmented_msg_missing_seg_reply2(Config) when list(Config) -> +send_segmented_msg_missing_seg_reply2(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, ssmmsr2), @@ -4873,7 +4873,7 @@ []; recv_segmented_msg_plain(doc) -> "Received segmented megaco message [plain]"; -recv_segmented_msg_plain(Config) when list(Config) -> +recv_segmented_msg_plain(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, rsmp), @@ -5542,7 +5542,7 @@ []; recv_segmented_msg_ooo_seg(doc) -> "Received segmented megaco message [out-of-order segments]"; -recv_segmented_msg_ooo_seg(Config) when list(Config) -> +recv_segmented_msg_ooo_seg(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, rsmos), @@ -6209,7 +6209,7 @@ recv_segmented_msg_missing_seg1(doc) -> "Received segmented megaco message with one segment missing " "using plain integer recv segment timer"; -recv_segmented_msg_missing_seg1(Config) when list(Config) -> +recv_segmented_msg_missing_seg1(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, rsmms1), @@ -6877,7 +6877,7 @@ recv_segmented_msg_missing_seg2(doc) -> "Received segmented megaco message with one segment missing " "using incremental recv segment timer"; -recv_segmented_msg_missing_seg2(Config) when list(Config) -> +recv_segmented_msg_missing_seg2(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, rsmms2), @@ -7641,9 +7641,9 @@ #'ActionReply'{contextId = CtxId, commandReply = CmdRep}. -cre_transResult(ED) when record(ED, 'ErrorDescriptor') -> +cre_transResult(ED) when is_record(ED, 'ErrorDescriptor') -> {transactionError, ED}; -cre_transResult([AR|_] = ARs) when record(AR, 'ActionReply') -> +cre_transResult([AR|_] = ARs) when is_record(AR, 'ActionReply') -> {actionReplies, ARs}. %% cre_transReply(TransId, Res) -> @@ -7667,7 +7667,7 @@ %% -- -cre_serviceChangeProf(Name, Ver) when list(Name), integer(Ver) -> +cre_serviceChangeProf(Name, Ver) when is_list(Name) andalso is_integer(Ver) -> #'ServiceChangeProfile'{profileName = Name, version = Ver}. diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_tcp_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_tcp_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_tcp_test.erl 2009-03-12 12:30:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_tcp_test.erl 2009-09-18 15:12:47.000000000 +0100 @@ -1012,15 +1012,15 @@ megaco_tcp:close(Handle), {ok, State#server{handle = undefined}}. -server_block(#server{handle = Handle} = State) - when (Handle =/= undefined) -> - megaco_tcp:block(Handle), - {ok, State}. - -server_unblock(#server{handle = Handle} = State) - when (Handle =/= undefined) -> - megaco_tcp:unblock(Handle), - {ok, State}. +%% server_block(#server{handle = Handle} = State) +%% when (Handle =/= undefined) -> +%% megaco_tcp:block(Handle), +%% {ok, State}. + +%% server_unblock(#server{handle = Handle} = State) +%% when (Handle =/= undefined) -> +%% megaco_tcp:unblock(Handle), +%% {ok, State}. server_stop_transport(#server{transport_ref = Ref} = State) when (Ref =/= undefined) -> diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_generic_transport.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_generic_transport.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_generic_transport.erl 2009-03-12 12:32:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_generic_transport.erl 2009-11-20 08:48:37.000000000 +0000 @@ -29,6 +29,7 @@ -export([ start_transport/0, + listen/2, connect/2, start/1, stop/0, @@ -80,6 +81,9 @@ connect(Sup, Opts) -> call({connect, Sup, Opts}). +listen(Sup, Opts) -> + call({listen, Sup, Opts}). + stop() -> call(stop). @@ -136,6 +140,18 @@ {reply, Reply, State#state{controller = Controller, receive_handle = ReceiveHandle}}; +handle_call({listen, _Sup, Opts}, _From, State) -> + d("handle_call(listen) -> entry with" + "~n Opts: ~p", [Opts]), + {value, {_, ReceiveHandle}} = lists:keysearch(receive_handle, 1, Opts), + {value, {_, Controller}} = lists:keysearch(port, 1, Opts), + SendHandle = self(), + ControlPid = self(), + Reply = {ok, SendHandle, ControlPid}, + Controller ! {listen, ReceiveHandle, SendHandle, ControlPid}, + {reply, Reply, State#state{controller = Controller, + receive_handle = ReceiveHandle}}; + handle_call(stop, _From, State) -> d("handle_call(stop) -> entry"), Reply = ok, diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_lib.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_lib.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_lib.erl 2009-03-12 12:30:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_lib.erl 2009-11-20 08:48:31.000000000 +0000 @@ -46,6 +46,11 @@ ok. +hours(N) -> trunc(N * 1000 * 60 * 60). +minutes(N) -> trunc(N * 1000 * 60). +seconds(N) -> trunc(N * 1000). + + %% ---------------------------------------------------------------- %% Conditional skip of testcases %% @@ -113,9 +118,9 @@ display_result(Res), Res. -tickets(Cases, Config) when list(Cases) -> +tickets(Cases, Config) when is_list(Cases) -> [tickets(Case, Config) || Case <- Cases]; -tickets(Mod, Config) when atom(Mod) -> +tickets(Mod, Config) when is_atom(Mod) -> Res = tickets(Mod, tickets, Config), Res; tickets(Bad, _Config) -> @@ -143,7 +148,7 @@ {req, _, {conf, Init, Cases, Finish}} -> case (catch Mod:Init(Config)) of - Conf when list(Conf) -> + Conf when is_list(Conf) -> io:format("Expand: ~p:~p ...~n", [Mod, Func]), Map = fun({M,_}) when is_atom(M) -> tickets(M, tickets, Config); @@ -342,7 +347,7 @@ TestCase = {?MODULE, Mod, Fun}, Label = lists:concat(["TEST CASE: ", Fun]), receive - {done, Pid, ok, Time} when Errors == [] -> + {done, Pid, ok, Time} when Errors =:= [] -> megaco:report_event(40, Mod, ?MODULE, Label ++ " ok", [TestCase, Config]), {ok, {Mod, Fun}, Errors, Time}; @@ -350,7 +355,7 @@ megaco:report_event(40, Mod, ?MODULE, Label ++ " failed", [TestCase, Config]), {failed, {Mod, Fun}, Errors, Time}; - {done, Pid, {ok, _}, Time} when Errors == [] -> + {done, Pid, {ok, _}, Time} when Errors =:= [] -> megaco:report_event(40, Mod, ?MODULE, Label ++ " ok", [TestCase, Config]), {ok, {Mod, Fun}, Errors, Time}; @@ -661,12 +666,13 @@ undefined -> global:register_name(megaco_global_logger, Pid); Pid -> - io:format("init_per_testcase -> " - "already registered to ~p~n", [Pid]), + io:format("~w:init_per_testcase -> " + "already registered to ~p~n", [?MODULE, Pid]), ok; - OtherPid when pid(OtherPid) -> - io:format("init_per_testcase -> " - "already registered to other ~p (~p)~n", [OtherPid,Pid]), + OtherPid when is_pid(OtherPid) -> + io:format("~w:init_per_testcase -> " + "already registered to other ~p (~p)~n", + [?MODULE, OtherPid, Pid]), exit({already_registered, {megaco_global_logger, OtherPid, Pid}}) end, set_kill_timer(Config). @@ -675,9 +681,10 @@ Name = megaco_global_logger, case global:whereis_name(Name) of undefined -> - io:format("fin_per_testcase -> already un-registered~n", []), + io:format("~w:fin_per_testcase -> already un-registered~n", + [?MODULE]), ok; - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> global:unregister_name(megaco_global_logger), ok end, @@ -696,7 +703,7 @@ case lookup_config(tc_timeout, Config) of [] -> timer:minutes(5); - ConfigTime when integer(ConfigTime) -> + ConfigTime when is_integer(ConfigTime) -> ConfigTime end, Dog = @@ -773,7 +780,7 @@ pick_n_nodes(all, AllNodes, _File, _Line) -> AllNodes; pick_n_nodes(N, AllNodes, _File, _Line) - when integer(N), length(AllNodes) >= N -> + when is_integer(N) andalso (length(AllNodes) >= N) -> AllNodes -- lists:nthtail(N, AllNodes); pick_n_nodes(N, AllNodes, File, Line) -> fatal_skip({too_few_nodes, N, AllNodes}, File, Line). @@ -815,7 +822,7 @@ pang -> [Name, Host] = node_to_name_and_host(Node), case slave:start_link(Host, Name) of - {ok, NewNode} when NewNode == Node -> + {ok, NewNode} when NewNode =:= Node -> Path = code:get_path(), {ok, Cwd} = file:get_cwd(), true = rpc:call(Node, code, set_path, [Path]), diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_lib.hrl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_lib.hrl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_lib.hrl 2009-03-12 12:30:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_lib.hrl 2009-11-20 08:48:31.000000000 +0000 @@ -81,3 +81,7 @@ -define(SLEEP(MSEC), megaco_test_lib:sleep(MSEC)). -define(M(), megaco_test_lib:millis()). -define(MDIFF(A,B), megaco_test_lib:millis_diff(A,B)). + +-define(HOURS(T), megaco_test_lib:hours(T)). +-define(MINUTES(T), megaco_test_lib:minutes(T)). +-define(SECONDS(T), megaco_test_lib:seconds(T)). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_megaco_generator.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_megaco_generator.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_megaco_generator.erl 2009-03-12 12:32:52.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_megaco_generator.erl 2009-11-20 08:48:38.000000000 +0000 @@ -467,6 +467,17 @@ Else -> error({udp_open, Opts0, Else}) end; +handle_exec({listen, Opts0, _MaybeRetry}, + #state{recv_handle = RH, port = Port, transport_sup = Pid} = State) + when RH#megaco_receive_handle.send_mod =:= megaco_test_generic_transport -> + p("listen(generic)"), + Opts = [{module, ?DELIVER_MOD}, {port, Port}, {receive_handle, RH}|Opts0], + case (catch megaco_test_generic_transport:listen(Pid, Opts)) of + {ok, _SH, _CtrlPid} -> + {ok, State}; + Else -> + error({udp_open, Opts0, Else}) + end; handle_exec({connect, Host, Opts0, MaybeRetry}, #state{transport_sup = Sup, diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_mgc.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_mgc.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_mgc.erl 2009-03-12 12:31:12.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_mgc.erl 2009-09-18 15:13:02.000000000 +0100 @@ -154,6 +154,10 @@ {started, Pid} -> d("await_started ~p: ok", [Pid]), {ok, Pid}; + {'EXIT', Pid, + {failed_starting_tcp_listen, {could_not_start_listener, {gen_tcp_listen, eaddrinuse}}}} -> + i("await_started ~p: address already in use", [Pid]), + ?SKIP(eaddrinuse); {'EXIT', Pid, Reason} -> i("await_started ~p: received exit signal: ~p", [Pid, Reason]), exit({failed_starting, Pid, Reason}) @@ -280,16 +284,20 @@ put(verbosity, Verbosity), put(sname, "MGC"), i("mgc -> starting"), - {Mid, TcpSup, UdpSup, DSITimer} = init(Config), - notify_started(Parent), - S = #mgc{parent = Parent, - tcp_sup = TcpSup, - udp_sup = UdpSup, - mid = Mid, - dsi_timer = DSITimer}, - i("mgc -> started"), - display_system_info("at start "), - loop(S). + case (catch init(Config)) of + {error, Reason} -> + exit(Reason); + {Mid, TcpSup, UdpSup, DSITimer} -> + notify_started(Parent), + S = #mgc{parent = Parent, + tcp_sup = TcpSup, + udp_sup = UdpSup, + mid = Mid, + dsi_timer = DSITimer}, + i("mgc -> started"), + display_system_info("at start "), + loop(S) + end. init(Config) -> d("init -> entry"), @@ -317,7 +325,7 @@ megaco:enable_trace(max, io); {value, {megaco_trace, io}} -> megaco:enable_trace(max, io); - {value, {megaco_trace, File}} when list(File) -> + {value, {megaco_trace, File}} when is_list(File) -> megaco:enable_trace(max, File); _ -> ok @@ -578,7 +586,7 @@ SendMod -> exit(Pid, Reason) end. -get_trans_stats(P, SendMod) when pid(P) -> +get_trans_stats(P, SendMod) when is_pid(P) -> case (catch SendMod:get_stats()) of {ok, Stats} -> {SendMod, Stats}; @@ -710,7 +718,12 @@ end; try_start_tcp(Sup, _Opts, _Timeout, Error) -> megaco_tcp:stop_transport(Sup), - throw({error, {failed_starting_tcp_listen, Error}}). + case Error of + {error, Reason} -> + throw({error, {failed_starting_tcp_listen, Reason}}); + _ -> + throw({error, {failed_starting_tcp_listen, Error}}) + end. start_udp(TO, RH, Port, Sup) -> @@ -772,7 +785,7 @@ {no_reply, S}; handle_megaco_request({handle_trans_request, CH, PV, ARs}, - #mgc{req_info = P} = S) when pid(P) -> + #mgc{req_info = P} = S) when is_pid(P) -> d("handle_megaco_request(handle_trans_request,~p) -> entry", [P]), P ! {req_received, self(), ARs}, do_handle_trans_request(CH, PV, ARs, S); @@ -800,7 +813,7 @@ {ok, S}; handle_megaco_request({handle_trans_ack, CH, PV, AS, AD}, - #mgc{ack_info = P} = S) when pid(P) -> + #mgc{ack_info = P} = S) when is_pid(P) -> d("handle_megaco_request(handle_trans_ack,~p) -> entry when" "~n CH: ~p" "~n PV: ~p" @@ -832,7 +845,7 @@ "~n Handler: ~p", [CH, PV, TI, Handler]), Reply = case S#mgc.abort_info of - P when pid(P) -> + P when is_pid(P) -> P ! {abort_received, self(), TI}, ok; _ -> @@ -1091,7 +1104,7 @@ case text_codec(EM) of true -> case megaco:system_info(text_config) of - [Conf] when list(Conf) -> + [Conf] when is_list(Conf) -> Conf; _ -> [] diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_prev3a_lib.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_prev3a_lib.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_prev3a_lib.erl 2009-03-12 12:32:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_prev3a_lib.erl 2009-09-18 15:13:19.000000000 +0100 @@ -176,12 +176,12 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -cre_MegacoMessage(M) when record(M, 'Message') -> +cre_MegacoMessage(M) when is_record(M, 'Message') -> #'MegacoMessage'{mess = M}. cre_MegacoMessage(AH, M) - when record(AH, 'AuthenticationHeader'), - record(M, 'Message') -> + when is_record(AH, 'AuthenticationHeader') andalso + is_record(M, 'Message') -> #'MegacoMessage'{authHeader = AH, mess = M}. @@ -190,39 +190,39 @@ seqNum = SN, ad = AD}. -cre_Message(V, Mid, ED) when record(ED, 'ErrorDescriptor') -> +cre_Message(V, Mid, ED) when is_record(ED, 'ErrorDescriptor') -> Body = {errorDescriptor, ED}, #'Message'{version = V, mId = Mid, messageBody = Body}; -cre_Message(V, Mid, Transactions) when list(Transactions) -> +cre_Message(V, Mid, Transactions) when is_list(Transactions) -> Body = {transactions, Transactions}, #'Message'{version = V, mId = Mid, messageBody = Body}; -cre_Message(V, Mid, {transactions, T} = Body) when list(T) -> +cre_Message(V, Mid, {transactions, T} = Body) when is_list(T) -> #'Message'{version = V, mId = Mid, messageBody = Body}; cre_Message(V, Mid, {errorDescriptor, ED} = Body) - when record(ED, 'ErrorDescriptor') -> + when is_record(ED, 'ErrorDescriptor') -> #'Message'{version = V, mId = Mid, messageBody = Body}. -cre_ErrorDescriptor(EC) when integer(EC) -> +cre_ErrorDescriptor(EC) when is_integer(EC) -> #'ErrorDescriptor'{errorCode = EC}. -cre_ErrorDescriptor(EC, ET) when integer(EC), list(ET) -> +cre_ErrorDescriptor(EC, ET) when is_integer(EC) andalso is_list(ET) -> #'ErrorDescriptor'{errorCode = EC, errorText = ET}. -cre_ErrorCode(C) when integer(C), 0 =< C, C =< 65535 -> +cre_ErrorCode(C) when is_integer(C) andalso (0 =< C) andalso (C =< 65535) -> C; cre_ErrorCode(C) -> exit({invalid_ErrorCode, C}). -cre_ErrorText(T) when list(T) -> +cre_ErrorText(T) when is_list(T) -> T. cre_ContextID(Val) when 0 =< Val, Val =< 4294967295 -> @@ -230,34 +230,34 @@ cre_ContextID(Val) -> exit({invalid_ContextID, Val}). -cre_Transaction(TR) when record(TR, 'TransactionRequest') -> +cre_Transaction(TR) when is_record(TR, 'TransactionRequest') -> {transactionRequest, TR}; -cre_Transaction(TP) when record(TP, 'TransactionPending') -> +cre_Transaction(TP) when is_record(TP, 'TransactionPending') -> {transactionPending, TP}; -cre_Transaction(TR) when record(TR, 'TransactionReply') -> +cre_Transaction(TR) when is_record(TR, 'TransactionReply') -> {transactionReply, TR}; -cre_Transaction(TRA) when list(TRA) -> +cre_Transaction(TRA) when is_list(TRA) -> {transactionResponseAck, TRA}. -cre_TransactionId(Val) when 0 =< Val, Val =< 4294967295 -> +cre_TransactionId(Val) when (0 =< Val) andalso (Val =< 4294967295) -> Val; cre_TransactionId(Val) -> exit({invalid_TransactionId, Val}). -cre_TransactionRequest(TransID, ARs) when integer(TransID), list(ARs) -> +cre_TransactionRequest(TransID, ARs) when is_integer(TransID) andalso is_list(ARs) -> #'TransactionRequest'{transactionId = TransID, actions = ARs}. -cre_TransactionPending(TransID) when integer(TransID) -> +cre_TransactionPending(TransID) when is_integer(TransID) -> #'TransactionPending'{transactionId = TransID}. cre_TransactionReply(TransID, ED) - when integer(TransID), record(ED, 'ErrorDescriptor') -> + when is_integer(TransID) andalso is_record(ED, 'ErrorDescriptor') -> Res = {transactionError, ED}, #'TransactionReply'{transactionId = TransID, transactionResult = Res}; cre_TransactionReply(TransID, ARs) - when integer(TransID), list(ARs) -> + when is_integer(TransID) andalso is_list(ARs) -> Res = {actionReplies, ARs}, #'TransactionReply'{transactionId = TransID, transactionResult = Res}. @@ -319,30 +319,30 @@ commandRequests = CmdReqs}. cre_ActionReply(CtxID, CmdReps) - when integer(CtxID), - list(CmdReps) -> + when is_integer(CtxID) andalso + is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, commandReply = CmdReps}. cre_ActionReply(CtxID, ED, CmdReps) - when integer(CtxID), - record(ED, 'ErrorDescriptor'), - list(CmdReps) -> + when is_integer(CtxID) andalso + is_record(ED, 'ErrorDescriptor') andalso + is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, errorDescriptor = ED, commandReply = CmdReps}; cre_ActionReply(CtxID, CtxReq, CmdReps) - when is_integer(CtxID) and - is_record(CtxReq, 'ContextRequest') and + when is_integer(CtxID) andalso + is_record(CtxReq, 'ContextRequest') andalso is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, contextReply = CtxReq, commandReply = CmdReps}. cre_ActionReply(CtxID, ED, CtxReq, CmdReps) - when is_integer(CtxID) and - (is_record(ED, 'ErrorDescriptor') or (ED == asn1_NOVALUE)) and - (is_record(CtxReq, 'ContextRequest') or (CtxReq == asn1_NOVALUE)) and + when is_integer(CtxID) andalso + (is_record(ED, 'ErrorDescriptor') orelse (ED =:= asn1_NOVALUE)) andalso + (is_record(CtxReq, 'ContextRequest') orelse (CtxReq =:= asn1_NOVALUE)) andalso is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, errorDescriptor = ED, @@ -352,11 +352,11 @@ cre_ContextRequest() -> strip_ContextRequest(#'ContextRequest'{}). -cre_ContextRequest(Prio) when integer(Prio), 0 =< Prio, Prio =< 15 -> +cre_ContextRequest(Prio) when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) -> strip_ContextRequest(#'ContextRequest'{priority = Prio}); -cre_ContextRequest(Em) when Em == true; Em == false; Em == asn1_NOVALUE -> +cre_ContextRequest(Em) when (Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE) -> strip_ContextRequest(#'ContextRequest'{emergency = Em}); -cre_ContextRequest(Top) when list(Top) -> +cre_ContextRequest(Top) when is_list(Top) -> strip_ContextRequest(#'ContextRequest'{topologyReq = Top}). cre_ContextRequest(Prio, Em) @@ -366,7 +366,7 @@ emergency = Em}, strip_ContextRequest(CR); cre_ContextRequest(Prio, Top) - when integer(Prio), 0 =< Prio, Prio =< 15, list(Top) -> + when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) andalso is_list(Top) -> CR = #'ContextRequest'{priority = Prio, topologyReq = Top}, strip_ContextRequest(CR). @@ -507,53 +507,53 @@ wildcardReturn = WR}. cre_Command(addReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(moveReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(modReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(subtractReq = Tag, Req) - when record(Req, 'SubtractRequest') -> + when is_record(Req, 'SubtractRequest') -> {Tag, Req}; cre_Command(auditCapRequest = Tag, Req) - when record(Req, 'AuditRequest') -> + when is_record(Req, 'AuditRequest') -> {Tag, Req}; cre_Command(auditValueRequest = Tag, Req) - when record(Req, 'AuditRequest') -> + when is_record(Req, 'AuditRequest') -> {Tag, Req}; cre_Command(notifyReq = Tag, Req) - when record(Req, 'NotifyRequest') -> + when is_record(Req, 'NotifyRequest') -> {Tag, Req}; cre_Command(serviceChangeReq = Tag, Req) - when record(Req, 'ServiceChangeRequest') -> + when is_record(Req, 'ServiceChangeRequest') -> {Tag, Req}. cre_CommandReply(addReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(moveReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(modReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(subtractReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(auditCapReply = Tag, Rep) - when tuple(Rep) -> + when is_tuple(Rep) -> {Tag, Rep}; cre_CommandReply(auditValueReply = Tag, Rep) - when tuple(Rep) -> + when is_tuple(Rep) -> {Tag, Rep}; cre_CommandReply(notifyReply = Tag, Rep) - when record(Rep, 'NotifyReply') -> + when is_record(Rep, 'NotifyReply') -> {Tag, Rep}; cre_CommandReply(serviceChangeReply = Tag, Rep) - when record(Rep, 'ServiceChangeReply') -> + when is_record(Rep, 'ServiceChangeReply') -> {Tag, Rep}. cre_TopologyRequest(From, To, Dir) @@ -591,19 +591,19 @@ error({invalid_AmmRequest, {TermIDs, Descs}}) end. -cre_AmmDescriptor(D) when record(D, 'MediaDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'MediaDescriptor') -> {mediaDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'ModemDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'ModemDescriptor') -> {modemDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'MuxDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'MuxDescriptor') -> {muxDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'EventsDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'EventsDescriptor') -> {eventsDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'DigitMapDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'DigitMapDescriptor') -> {digitMapDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'AuditDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'AuditDescriptor') -> {auditDescriptor, D}; -cre_AmmDescriptor(D) when list(D) -> +cre_AmmDescriptor(D) when is_list(D) -> case is_EventBufferDescriptor(D) of true -> {eventBufferDescriptor, D}; @@ -621,35 +621,35 @@ end end. -cre_AmmsReply(TermIDs) when list(TermIDs) -> +cre_AmmsReply(TermIDs) when is_list(TermIDs) -> #'AmmsReply'{terminationID = TermIDs}. -cre_AmmsReply(TermIDs, TAs) when list(TermIDs), list(TAs) -> +cre_AmmsReply(TermIDs, TAs) when is_list(TermIDs) andalso is_list(TAs) -> #'AmmsReply'{terminationID = TermIDs, terminationAudit = TAs}. -cre_SubtractRequest(TermIDs) when list(TermIDs) -> +cre_SubtractRequest(TermIDs) when is_list(TermIDs) -> #'SubtractRequest'{terminationID = TermIDs}. cre_SubtractRequest(TermIDs, Audit) - when list(TermIDs), record(Audit, 'AuditDescriptor') -> + when is_list(TermIDs) andalso is_record(Audit, 'AuditDescriptor') -> #'SubtractRequest'{terminationID = TermIDs, auditDescriptor = Audit}. cre_AuditRequest(TermID, Audit) - when record(TermID, megaco_term_id), record(Audit, 'AuditDescriptor') -> + when is_record(TermID, megaco_term_id) andalso is_record(Audit, 'AuditDescriptor') -> #'AuditRequest'{terminationID = TermID, auditDescriptor = Audit}. -cre_AuditReply(TermIDs) when list(TermIDs) -> +cre_AuditReply(TermIDs) when is_list(TermIDs) -> {contextAuditResult, TermIDs}; -cre_AuditReply(ED) when record(ED, 'ErrorDescriptor') -> +cre_AuditReply(ED) when is_record(ED, 'ErrorDescriptor') -> {error, ED}; -cre_AuditReply(Audit) when record(Audit, 'AuditResult') -> +cre_AuditReply(Audit) when is_record(Audit, 'AuditResult') -> {auditResult, Audit}. cre_AuditResult(TermID, TAs) - when record(TermID, megaco_term_id), list(TAs) -> + when is_record(TermID, megaco_term_id) andalso is_list(TAs) -> #'AuditResult'{terminationID = TermID, terminationAuditResult = TAs}. @@ -657,35 +657,35 @@ true = is_TerminationAudit(D), D. -cre_AuditReturnParameter(D) when record(D, 'ErrorDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ErrorDescriptor') -> {errorDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'MediaDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'MediaDescriptor') -> {mediaDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'ModemDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ModemDescriptor') -> {modemDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'MuxDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'MuxDescriptor') -> {muxDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'EventsDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'EventsDescriptor') -> {eventsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'EventSpec') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'EventSpec') -> {eventBufferDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'DigitMapDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'DigitMapDescriptor') -> {digitMapDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'ObservedEventsDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ObservedEventsDescriptor') -> {observedEventsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'StatisticsParameter') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'StatisticsParameter') -> {statisticsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'PackagesItem') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'PackagesItem') -> {packagesDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'AuditDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'AuditDescriptor') -> {emptyDescriptors, D}; -cre_AuditReturnParameter([H|_] = D) when tuple(H) -> +cre_AuditReturnParameter([H|_] = D) when is_tuple(H) -> {signalsDescriptor, D}. cre_AuditDescriptor() -> #'AuditDescriptor'{}. -cre_AuditDescriptor([H|_] = AT) when atom(H) -> +cre_AuditDescriptor([H|_] = AT) when is_atom(H) -> #'AuditDescriptor'{auditToken = AT}; cre_AuditDescriptor(APT) -> #'AuditDescriptor'{auditPropertyToken = APT}. @@ -694,74 +694,74 @@ #'AuditDescriptor'{auditToken = AT, auditPropertyToken = APT}. -cre_IndAuditParameter(D) when record(D, 'IndAudMediaDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudMediaDescriptor') -> {indAudMediaDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudEventsDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudEventsDescriptor') -> {indAudEventsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudEventBufferDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudEventBufferDescriptor') -> {indAudEventBufferDescriptor, D}; cre_IndAuditParameter({signal, _} = D) -> {indAudSignalsDescriptor, D}; cre_IndAuditParameter({seqSigList, _} = D) -> {indAudSignalsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudDigitMapDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudDigitMapDescriptor') -> {indAudDigitMapDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudStatisticsDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudStatisticsDescriptor') -> {indAudStatisticsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudPackagesDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudPackagesDescriptor') -> {indAudPackagesDescriptor, D}. cre_IndAudMediaDescriptor() -> #'IndAudMediaDescriptor'{}. cre_IndAudMediaDescriptor(TSD) - when record(TSD, 'IndAudTerminationStateDescriptor') -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') -> #'IndAudMediaDescriptor'{termStateDescr = TSD}; -cre_IndAudMediaDescriptor(Parms) when record(Parms, 'IndAudStreamParms') -> +cre_IndAudMediaDescriptor(Parms) when is_record(Parms, 'IndAudStreamParms') -> Streams = {oneStream, Parms}, #'IndAudMediaDescriptor'{streams = Streams}; -cre_IndAudMediaDescriptor(Descs) when list(Descs) -> +cre_IndAudMediaDescriptor(Descs) when is_list(Descs) -> Streams = {multiStream, Descs}, #'IndAudMediaDescriptor'{streams = Streams}. cre_IndAudMediaDescriptor(TSD, Parms) - when record(TSD, 'IndAudTerminationStateDescriptor'), - record(Parms, 'IndAudStreamParms') -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso + is_record(Parms, 'IndAudStreamParms') -> Streams = {oneStream, Parms}, #'IndAudMediaDescriptor'{termStateDescr = TSD, streams = Streams}; cre_IndAudMediaDescriptor(TSD, Descs) - when record(TSD, 'IndAudTerminationStateDescriptor'), list(Descs) -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso is_list(Descs) -> Streams = {multiStream, Descs}, #'IndAudMediaDescriptor'{termStateDescr = TSD, streams = Streams}. cre_IndAudStreamDescriptor(SID, Parms) - when integer(SID), record(Parms, 'IndAudStreamParms') -> + when is_integer(SID) andalso is_record(Parms, 'IndAudStreamParms') -> #'IndAudStreamDescriptor'{streamID = SID, streamParms = Parms}. cre_IndAudStreamParms() -> #'IndAudStreamParms'{}. -cre_IndAudStreamParms(LCD) when record(LCD, 'IndAudLocalControlDescriptor') -> +cre_IndAudStreamParms(LCD) when is_record(LCD, 'IndAudLocalControlDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LCD}; -cre_IndAudStreamParms(SD) when record(SD, 'IndAudStatisticsDescriptor') -> +cre_IndAudStreamParms(SD) when is_record(SD, 'IndAudStatisticsDescriptor') -> #'IndAudStreamParms'{statisticsDescriptor = SD}. cre_IndAudStreamParms(LC, L, R) - when record(LC, 'IndAudLocalControlDescriptor'), - record(L, 'IndAudLocalRemoteDescriptor'), - record(R, 'IndAudLocalRemoteDescriptor') -> + when is_record(LC, 'IndAudLocalControlDescriptor') andalso + is_record(L, 'IndAudLocalRemoteDescriptor') andalso + is_record(R, 'IndAudLocalRemoteDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LC, localDescriptor = L, remoteDescriptor = R}. cre_IndAudStreamParms(LC, L, R, S) - when record(LC, 'IndAudLocalControlDescriptor'), - record(L, 'IndAudLocalRemoteDescriptor'), - record(R, 'IndAudLocalRemoteDescriptor'), - record(S, 'IndAudStatisticsDescriptor') -> + when is_record(LC, 'IndAudLocalControlDescriptor') andalso + is_record(L, 'IndAudLocalRemoteDescriptor') andalso + is_record(R, 'IndAudLocalRemoteDescriptor') andalso + is_record(S, 'IndAudStatisticsDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LC, localDescriptor = L, remoteDescriptor = R, @@ -780,28 +780,28 @@ reserveGroup = RG, propertyParms = PP}. -cre_IndAudPropertyParm(PkgdName) when list(PkgdName) -> +cre_IndAudPropertyParm(PkgdName) when is_list(PkgdName) -> #'IndAudPropertyParm'{name = PkgdName}. cre_IndAudLocalRemoteDescriptor(Grps) - when list(Grps) -> + when is_list(Grps) -> #'IndAudLocalRemoteDescriptor'{propGrps = Grps}. cre_IndAudLocalRemoteDescriptor(GrpID, Grps) - when integer(GrpID), 0 =< GrpID, GrpID =< 65535, list(Grps) -> + when is_integer(GrpID) andalso (0 =< GrpID) andalso (GrpID =< 65535) andalso is_list(Grps) -> #'IndAudLocalRemoteDescriptor'{propGroupID = GrpID, propGrps = Grps}. cre_IndAudPropertyGroup([]) -> []; cre_IndAudPropertyGroup([H|_] = PG) - when record(H, 'IndAudPropertyParm') -> + when is_record(H, 'IndAudPropertyParm') -> PG. cre_IndAudTerminationStateDescriptor([] = PP) -> #'IndAudTerminationStateDescriptor'{propertyParms = PP}; cre_IndAudTerminationStateDescriptor([H|_] = PP) - when record(H, 'IndAudPropertyParm') -> + when is_record(H, 'IndAudPropertyParm') -> #'IndAudTerminationStateDescriptor'{propertyParms = PP}. cre_IndAudTerminationStateDescriptor([] = PP, EBC, SS) @@ -819,109 +819,111 @@ serviceState = SS}. cre_IndAudEventsDescriptor(PkgdName) - when list(PkgdName) -> + when is_list(PkgdName) -> #'IndAudEventsDescriptor'{pkgdName = PkgdName}. cre_IndAudEventsDescriptor(RID, PkgdName) - when integer(RID), list(PkgdName) -> + when is_integer(RID) andalso is_list(PkgdName) -> #'IndAudEventsDescriptor'{requestID = RID, pkgdName = PkgdName}; cre_IndAudEventsDescriptor(PkgdName, SID) - when list(PkgdName), integer(SID) -> + when is_list(PkgdName) andalso is_integer(SID) -> #'IndAudEventsDescriptor'{pkgdName = PkgdName, streamID = SID}. cre_IndAudEventsDescriptor(RID, PkgdName, SID) - when integer(RID), list(PkgdName), integer(SID) -> + when is_integer(RID) andalso is_list(PkgdName) andalso is_integer(SID) -> #'IndAudEventsDescriptor'{requestID = RID, pkgdName = PkgdName, streamID = SID}. -cre_IndAudEventBufferDescriptor(EventName) when list(EventName) -> +cre_IndAudEventBufferDescriptor(EventName) when is_list(EventName) -> #'IndAudEventBufferDescriptor'{eventName = EventName}. cre_IndAudEventBufferDescriptor(EventName, SID) - when list(EventName), integer(SID) -> + when is_list(EventName) andalso is_integer(SID) -> #'IndAudEventBufferDescriptor'{eventName = EventName, streamID = SID}. -cre_IndAudSignalsDescriptor(S) when record(S, 'IndAudSignal') -> +cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSignal') -> {signal, S}; -cre_IndAudSignalsDescriptor(S) when record(S, 'IndAudSeqSigList') -> +cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSeqSigList') -> {seqSigList, S}. -cre_IndAudSeqSigList(ID) when integer(ID), 0=< ID, ID =< 65535 -> +cre_IndAudSeqSigList(ID) when is_integer(ID) andalso (0=< ID) andalso (ID =< 65535) -> #'IndAudSeqSigList'{id = ID}. cre_IndAudSeqSigList(ID, S) - when integer(ID), 0=< ID, ID =< 65535, - record(S, 'IndAudSignal') -> + when is_integer(ID) andalso (0=< ID) andalso (ID =< 65535) andalso is_record(S, 'IndAudSignal') -> #'IndAudSeqSigList'{id = ID, signalList = S}. -cre_IndAudSignal(SigName) when list(SigName) -> +cre_IndAudSignal(SigName) when is_list(SigName) -> #'IndAudSignal'{signalName = SigName}. -cre_IndAudSignal(SigName, SID) when list(SigName), integer(SID) -> +cre_IndAudSignal(SigName, SID) when is_list(SigName) andalso is_integer(SID) -> #'IndAudSignal'{signalName = SigName, streamID = SID}. cre_IndAudDigitMapDescriptor() -> #'IndAudDigitMapDescriptor'{}. -cre_IndAudDigitMapDescriptor(DMN) when list(DMN) -> +cre_IndAudDigitMapDescriptor(DMN) when is_list(DMN) -> #'IndAudDigitMapDescriptor'{digitMapName = DMN}. -cre_IndAudStatisticsDescriptor(StatName) when list(StatName) -> +cre_IndAudStatisticsDescriptor(StatName) when is_list(StatName) -> #'IndAudStatisticsDescriptor'{statName = StatName}. cre_IndAudPackagesDescriptor(N, V) - when list(N), - integer(V), 0 =< V, V =< 99 -> + when is_list(N) andalso + is_integer(V) andalso (0 =< V) andalso (V =< 99) -> #'IndAudPackagesDescriptor'{packageName = N, packageVersion = V}. cre_NotifyRequest(TermIDs, D) - when list(TermIDs), record(D, 'ObservedEventsDescriptor') -> + when is_list(TermIDs) andalso is_record(D, 'ObservedEventsDescriptor') -> #'NotifyRequest'{terminationID = TermIDs, observedEventsDescriptor = D}. cre_NotifyRequest(TermIDs, D, ED) - when list(TermIDs), - record(D, 'ObservedEventsDescriptor'), - record(ED, 'ErrorDescriptor') -> + when is_list(TermIDs) andalso + is_record(D, 'ObservedEventsDescriptor') andalso + is_record(ED, 'ErrorDescriptor') -> #'NotifyRequest'{terminationID = TermIDs, observedEventsDescriptor = D, errorDescriptor = ED}. -cre_NotifyReply(TermIDs) when list(TermIDs) -> +cre_NotifyReply(TermIDs) when is_list(TermIDs) -> #'NotifyReply'{terminationID = TermIDs}. cre_NotifyReply(TermIDs, ED) - when list(TermIDs), - record(ED, 'ErrorDescriptor') -> + when is_list(TermIDs) andalso + is_record(ED, 'ErrorDescriptor') -> #'NotifyReply'{terminationID = TermIDs, errorDescriptor = ED}. cre_ObservedEventsDescriptor(RID, [H|_] = L) - when integer(RID), record(H, 'ObservedEvent') -> + when is_integer(RID) andalso is_record(H, 'ObservedEvent') -> #'ObservedEventsDescriptor'{requestId = RID, observedEventLst = L}. -cre_ObservedEvent(EN, EPL) when list(EN), list(EPL) -> +cre_ObservedEvent(EN, EPL) when is_list(EN) andalso is_list(EPL) -> #'ObservedEvent'{eventName = EN, eventParList = EPL}; -cre_ObservedEvent(EN, TN) when list(EN), record(TN, 'TimeNotation') -> +cre_ObservedEvent(EN, TN) when is_list(EN) andalso is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, timeNotation = TN}. -cre_ObservedEvent(EN, SID, EPL) when list(EN), integer(SID), list(EPL) -> +cre_ObservedEvent(EN, SID, EPL) when is_list(EN) andalso is_integer(SID) andalso is_list(EPL) -> #'ObservedEvent'{eventName = EN, streamID = SID, eventParList = EPL}; cre_ObservedEvent(EN, EPL, TN) - when list(EN), list(EPL), record(TN, 'TimeNotation') -> + when is_list(EN) andalso is_list(EPL) andalso is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, eventParList = EPL, timeNotation = TN}. cre_ObservedEvent(EN, SID, EPL, TN) - when list(EN), integer(SID), list(EPL), record(TN, 'TimeNotation') -> + when is_list(EN) andalso + is_integer(SID) andalso + is_list(EPL) andalso + is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, streamID = SID, eventParList = EPL, @@ -930,93 +932,105 @@ cre_EventName(N) when is_list(N) -> N. -cre_EventParameter(N, V) when list(N), list(V) -> +cre_EventParameter(N, V) + when is_list(N) andalso + is_list(V) -> #'EventParameter'{eventParameterName = N, value = V}. cre_EventParameter(N, V, relation = Tag, R) - when list(N), list(V), atom(R) -> + when is_list(N) andalso + is_list(V) andalso + is_atom(R) -> EI = {Tag, R}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}; cre_EventParameter(N, V, range = Tag, B) - when list(N), list(V), atom(B) -> + when is_list(N) andalso + is_list(V) andalso + is_atom(B) -> EI = {Tag, B}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}; cre_EventParameter(N, V, sublist = Tag, B) - when list(N), list(V), atom(B) -> + when is_list(N) andalso + is_list(V) andalso + is_atom(B) -> EI = {Tag, B}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}. cre_ServiceChangeRequest(TermIDs, SCP) - when list(TermIDs), - record(SCP, 'ServiceChangeParm') -> + when is_list(TermIDs) andalso + is_record(SCP, 'ServiceChangeParm') -> #'ServiceChangeRequest'{terminationID = TermIDs, serviceChangeParms = SCP}. cre_ServiceChangeReply(TermIDs, {Tag, R} = SCR) - when list(TermIDs), atom(Tag), tuple(R) -> + when is_list(TermIDs) andalso + is_atom(Tag) andalso + is_tuple(R) -> #'ServiceChangeReply'{terminationID = TermIDs, serviceChangeResult = SCR}. -cre_ServiceChangeResult(ED) when record(ED, 'ErrorDescriptor') -> +cre_ServiceChangeResult(ED) when is_record(ED, 'ErrorDescriptor') -> {errorDescriptor, ED}; -cre_ServiceChangeResult(SCRP) when record(SCRP, 'ServiceChangeResParm') -> +cre_ServiceChangeResult(SCRP) when is_record(SCRP, 'ServiceChangeResParm') -> {serviceChangeResParms, SCRP}. %% cre_WildcardField(L) when list(L), length(L) == 1 -> L. cre_TerminationID(W, ID) - when list(W), - list(ID), 1 =< length(ID), length(ID) =< 8 -> + when is_list(W) andalso + is_list(ID) andalso + (1 =< length(ID)) andalso + (length(ID) =< 8) -> #'TerminationID'{wildcard = W, id = ID}. -cre_TerminationIDList(L) when list(L) -> +cre_TerminationIDList(L) when is_list(L) -> L. cre_MediaDescriptor() -> #'MediaDescriptor'{}. -cre_MediaDescriptor(TSD) when record(TSD, 'TerminationStateDescriptor') -> +cre_MediaDescriptor(TSD) when is_record(TSD, 'TerminationStateDescriptor') -> #'MediaDescriptor'{termStateDescr = TSD}; -cre_MediaDescriptor(SP) when record(SP, 'StreamParms') -> +cre_MediaDescriptor(SP) when is_record(SP, 'StreamParms') -> Streams = {oneStream, SP}, #'MediaDescriptor'{streams = Streams}; -cre_MediaDescriptor([H|_] = SDs) when record(H, 'StreamDescriptor') -> +cre_MediaDescriptor([H|_] = SDs) when is_record(H, 'StreamDescriptor') -> Streams = {multiStream, SDs}, #'MediaDescriptor'{streams = Streams}. cre_MediaDescriptor(TSD, SP) - when record(TSD, 'TerminationStateDescriptor'), - record(SP, 'StreamParms') -> + when is_record(TSD, 'TerminationStateDescriptor') andalso + is_record(SP, 'StreamParms') -> Streams = {oneStream, SP}, #'MediaDescriptor'{termStateDescr = TSD, streams = Streams}; cre_MediaDescriptor(TSD, [H|_] = SDs) - when record(TSD, 'TerminationStateDescriptor'), - record(H, 'StreamDescriptor') -> + when is_record(TSD, 'TerminationStateDescriptor') andalso + is_record(H, 'StreamDescriptor') -> Streams = {multiStream, SDs}, #'MediaDescriptor'{termStateDescr = TSD, streams = Streams}. -cre_StreamDescriptor(SID, SP) when integer(SID), record(SP, 'StreamParms') -> +cre_StreamDescriptor(SID, SP) when is_integer(SID) andalso is_record(SP, 'StreamParms') -> #'StreamDescriptor'{streamID = SID, streamParms = SP}. cre_StreamParms() -> #'StreamParms'{}. -cre_StreamParms(LCD) when record(LCD, 'LocalControlDescriptor') -> +cre_StreamParms(LCD) when is_record(LCD, 'LocalControlDescriptor') -> #'StreamParms'{localControlDescriptor = LCD}; -cre_StreamParms(LD) when record(LD, 'LocalRemoteDescriptor') -> +cre_StreamParms(LD) when is_record(LD, 'LocalRemoteDescriptor') -> #'StreamParms'{localDescriptor = LD}; -cre_StreamParms(SD) when list(SD) -> +cre_StreamParms(SD) when is_list(SD) -> #'StreamParms'{statisticsDescriptor = SD}. cre_StreamParms(LCD, LD) @@ -1050,13 +1064,13 @@ remoteDescriptor = RD, statisticsDescriptor = SD}. -cre_LocalControlDescriptor(SM) when atom(SM) -> +cre_LocalControlDescriptor(SM) when is_atom(SM) -> #'LocalControlDescriptor'{streamMode = SM, propertyParms = []}; -cre_LocalControlDescriptor([H|_] = PP) when record(H, 'PropertyParm') -> +cre_LocalControlDescriptor([H|_] = PP) when is_record(H, 'PropertyParm') -> #'LocalControlDescriptor'{propertyParms = PP}. cre_LocalControlDescriptor(SM, [H|_] = PP) - when atom(SM), record(H, 'PropertyParm') -> + when is_atom(SM) andalso is_record(H, 'PropertyParm') -> #'LocalControlDescriptor'{streamMode = SM, propertyParms = PP}. @@ -1081,19 +1095,19 @@ cre_StreamMode(loopBack = M) -> M. -cre_PropertyParm(N, [H|_] = V) when list(N), list(H) -> +cre_PropertyParm(N, [H|_] = V) when is_list(N) andalso is_list(H) -> #'PropertyParm'{name = N, value = V}. cre_PropertyParm(N, [H|_] = V, relation = Tag, R) - when list(N), list(H), atom(R) -> + when is_list(N) andalso is_list(H) andalso is_atom(R) -> EI = {Tag, R}, #'PropertyParm'{name = N, value = V, extraInfo = EI}; cre_PropertyParm(N, [H|_] = V, range = Tag, B) - when list(N), list(H), atom(B) -> + when is_list(N) andalso is_list(H) andalso is_atom(B) -> EI = {Tag, B}, #'PropertyParm'{name = N, value = V, extraInfo = EI}; cre_PropertyParm(N, [H|_] = V, sublist = Tag, B) - when list(N), list(H), atom(B) -> + when is_list(N) andalso is_list(H) andalso is_atom(B) -> EI = {Tag, B}, #'PropertyParm'{name = N, value = V, extraInfo = EI}. @@ -1127,38 +1141,38 @@ cre_Relation(unequalTo = R) -> R. -cre_LocalRemoteDescriptor([H|_] = PGs) when list(H) -> +cre_LocalRemoteDescriptor([H|_] = PGs) when is_list(H) -> #'LocalRemoteDescriptor'{propGrps = PGs}. -cre_PropertyGroup([H|_] = PG) when record(H, 'PropertyParm') -> +cre_PropertyGroup([H|_] = PG) when is_record(H, 'PropertyParm') -> PG. -cre_TerminationStateDescriptor([H|_] = PPs) when record(H, 'PropertyParm') -> +cre_TerminationStateDescriptor([H|_] = PPs) when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs}. cre_TerminationStateDescriptor([H|_] = PPs, off = EBC) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, eventBufferControl = EBC}; cre_TerminationStateDescriptor([H|_] = PPs, lockStep = EBC) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, eventBufferControl = EBC}; cre_TerminationStateDescriptor([H|_] = PPs, test = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}; cre_TerminationStateDescriptor([H|_] = PPs, outOfSvc = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}; cre_TerminationStateDescriptor([H|_] = PPs, inSvc = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}. cre_TerminationStateDescriptor([H|_] = PPs, EMC, SS) - when record(H, 'PropertyParm'), + when is_record(H, 'PropertyParm') andalso ((EMC == off) or (EMC == lockStep)) and ((SS == test) or (SS == outOfSvc) or (SS == inSvc)) -> #'TerminationStateDescriptor'{propertyParms = PPs, @@ -1178,7 +1192,7 @@ SS. cre_MuxDescriptor(MT, [H|_] = TL) - when atom(MT), record(H, 'TerminationID') -> + when is_atom(MT) andalso is_record(H, 'TerminationID') -> #'MuxDescriptor'{muxType = MT, termList = TL}. %% cre_MuxDescriptor(MT, [H|_] = TL, NSD) @@ -1196,7 +1210,7 @@ cre_MuxType(nx64k = MT) -> MT. -cre_StreamID(Val) when 0 =< Val, Val =< 65535 -> +cre_StreamID(Val) when (0 =< Val) andalso (Val =< 65535) -> Val; cre_StreamID(Val) -> exit({invalid_ContextID, Val}). @@ -1206,44 +1220,44 @@ #'EventsDescriptor'{eventList = []}. cre_EventsDescriptor(RID, [H|_] = EL) - when integer(RID), record(H, 'RequestedEvent') -> + when is_integer(RID) andalso is_record(H, 'RequestedEvent') -> #'EventsDescriptor'{requestID = RID, eventList = EL}. cre_RequestedEvent(N) -> #'RequestedEvent'{pkgdName = N}. cre_RequestedEvent(N, [H|_] = EPL) - when list(N), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, evParList = EPL}; cre_RequestedEvent(N, EA) - when list(N), - record(EA, 'RequestedActions')-> + when is_list(N) andalso + is_record(EA, 'RequestedActions')-> #'RequestedEvent'{pkgdName = N, eventAction = EA}. cre_RequestedEvent(N, SID, [H|_] = EPL) - when list(N), - integer(SID), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, streamID = SID, evParList = EPL}; cre_RequestedEvent(N, EA, [H|_] = EPL) - when list(N), - record(EA, 'RequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(EA, 'RequestedActions') andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, eventAction = EA, evParList = EPL}. cre_RequestedEvent(N, SID, EA, [H|_] = EPL) - when list(N), - integer(SID), - record(EA, 'RequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(EA, 'RequestedActions') andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, streamID = SID, eventAction = EA, @@ -1275,45 +1289,45 @@ secondEvent = SE, signalsDescriptor = SD}. -cre_EventDM(N) when list(N) -> +cre_EventDM(N) when is_list(N) -> {digitMapName, N}; -cre_EventDM(V) when record(V, 'DigitMapValue') -> +cre_EventDM(V) when is_record(V, 'DigitMapValue') -> {digitMapValue, V}. cre_SecondEventsDescriptor([H|_] = EL) - when record(H, 'SecondRequestedEvent') -> + when is_record(H, 'SecondRequestedEvent') -> #'SecondEventsDescriptor'{eventList = EL}. cre_SecondEventsDescriptor(RID, [H|_] = EL) - when integer(RID), record(H, 'SecondRequestedEvent') -> + when is_integer(RID) andalso is_record(H, 'SecondRequestedEvent') -> #'SecondEventsDescriptor'{requestID = RID, eventList = EL}. cre_SecondRequestedEvent(N, [H|_] = EPL) - when list(N), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, evParList = EPL}. cre_SecondRequestedEvent(N, SID, [H|_] = EPL) - when list(N), - integer(SID), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, streamID = SID, evParList = EPL}; cre_SecondRequestedEvent(N, EA, [H|_] = EPL) - when list(N), - record(EA, 'SecondRequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(EA, 'SecondRequestedActions') andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, eventAction = EA, evParList = EPL}. cre_SecondRequestedEvent(N, SID, EA, [H|_] = EPL) - when list(N), - integer(SID), - record(EA, 'SecondRequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(EA, 'SecondRequestedActions') andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, streamID = SID, eventAction = EA, @@ -1325,9 +1339,9 @@ cre_SecondRequestedActions(KA) when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) -> #'SecondRequestedActions'{keepActive = KA}; -cre_SecondRequestedActions(SD) when list(SD) -> +cre_SecondRequestedActions(SD) when is_list(SD) -> #'SecondRequestedActions'{signalsDescriptor = SD}; -cre_SecondRequestedActions({Tag, _} = EDM) when atom(Tag) -> +cre_SecondRequestedActions({Tag, _} = EDM) when is_atom(Tag) -> #'SecondRequestedActions'{eventDM = EDM}. cre_SecondRequestedActions(KA, SD) @@ -1347,14 +1361,14 @@ eventDM = EDM, signalsDescriptor = SD}. -cre_EventBufferDescriptor([H|_] = D) when record(H, 'EventSpec') -> +cre_EventBufferDescriptor([H|_] = D) when is_record(H, 'EventSpec') -> D. -cre_EventSpec(N, [H|_] = EPL) when list(N), record(H, 'EventParameter') -> +cre_EventSpec(N, [H|_] = EPL) when is_list(N) andalso is_record(H, 'EventParameter') -> #'EventSpec'{eventName = N, eventParList = EPL}. cre_EventSpec(N, SID, [H|_] = EPL) - when list(N), integer(SID), record(H, 'EventParameter') -> + when is_list(N) andalso is_integer(SID) andalso is_record(H, 'EventParameter') -> #'EventSpec'{eventName = N, streamID = SID, eventParList = EPL}. cre_SignalsDescriptor(D) -> @@ -1365,19 +1379,19 @@ error({invalid_SignalsDescriptor, D}) end. -cre_SignalRequest(S) when record(S, 'Signal') -> +cre_SignalRequest(S) when is_record(S, 'Signal') -> {signal, S}; -cre_SignalRequest(S) when record(S, 'SeqSigList') -> +cre_SignalRequest(S) when is_record(S, 'SeqSigList') -> {seqSigList, S}. cre_SeqSigList(ID, [H|_] = SL) - when integer(ID), 0 =< ID, ID =< 65535, record(H, 'Signal') -> + when is_integer(ID) andalso (0 =< ID) andalso (ID =< 65535) andalso is_record(H, 'Signal') -> #'SeqSigList'{id = ID, signalList = SL}. -cre_Signal(N) when list(N) -> +cre_Signal(N) when is_list(N) -> #'Signal'{signalName = N}. -cre_Signal(N, SPL) when list(N), list(SPL) -> +cre_Signal(N, SPL) when is_list(N) andalso is_list(SPL) -> #'Signal'{signalName = N, sigParList = SPL}. @@ -1439,7 +1453,7 @@ cre_SignalName(N) -> cre_PkgdName(N). -cre_NotifyCompletion(L) when list(L) -> +cre_NotifyCompletion(L) when is_list(L) -> Vals = [onTimeOut, onInterruptByEvent, onInterruptByNewSignalDescr, otherReason], F = fun(E) -> case lists:member(E, Vals) of @@ -1452,19 +1466,19 @@ lists:foreach(F, L), L. -cre_SigParameter(N, V) when list(N), list(V) -> +cre_SigParameter(N, V) when is_list(N) andalso is_list(V) -> #'SigParameter'{sigParameterName = N, value = V}. cre_SigParameter(N, V, relation = Tag, R) - when is_list(N) and is_list(V) and is_atom(R) -> + when is_list(N) andalso is_list(V) andalso is_atom(R) -> EI = {Tag, R}, #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI}; cre_SigParameter(N, V, range = Tag, B) - when is_list(N) and is_list(V) and is_atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI}; cre_SigParameter(N, V, sublist = Tag, B) - when is_list(N) and is_list(V) and is_atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI}. @@ -1473,7 +1487,7 @@ cre_RequestID(Val) -> exit({invalid_RequestID, Val}). -cre_ModemDescriptor(MTL, MPL) when list(MTL), list(MPL) -> +cre_ModemDescriptor(MTL, MPL) when is_list(MTL) andalso is_list(MPL) -> #'ModemDescriptor'{mtl = MTL, mpl = MPL}. %% cre_ModemDescriptor(MTL, MPL, NSD) @@ -1502,18 +1516,18 @@ cre_DigitMapDescriptor() -> #'DigitMapDescriptor'{}. -cre_DigitMapDescriptor(N) when list(N) -> +cre_DigitMapDescriptor(N) when is_list(N) -> #'DigitMapDescriptor'{digitMapName = N}; -cre_DigitMapDescriptor(V) when record(V, 'DigitMapValue') -> +cre_DigitMapDescriptor(V) when is_record(V, 'DigitMapValue') -> #'DigitMapDescriptor'{digitMapValue = V}. -cre_DigitMapDescriptor(N, V) when list(N), record(V, 'DigitMapValue') -> +cre_DigitMapDescriptor(N, V) when is_list(N) andalso is_record(V, 'DigitMapValue') -> #'DigitMapDescriptor'{digitMapName = N, digitMapValue = V}. cre_DigitMapName(N) -> cre_Name(N). -cre_DigitMapValue(DMB) when list(DMB) -> +cre_DigitMapValue(DMB) when is_list(DMB) -> #'DigitMapValue'{digitMapBody = DMB}. cre_DigitMapValue(Start, Short, Long, DMB) -> @@ -1535,7 +1549,7 @@ digitMapBody = DMB, durationTimer = Dur}. -cre_ServiceChangeParm(M, R) when atom(M), list(R) -> +cre_ServiceChangeParm(M, R) when is_atom(M) andalso is_list(R) -> #'ServiceChangeParm'{serviceChangeMethod = M, serviceChangeReason = R}. @@ -1581,17 +1595,17 @@ end. cre_ServiceChangeAddress(portNumber = Tag, P) - when integer(P), 0 =< P, P =< 65535 -> + when is_integer(P) andalso (0 =< P) andalso (P =< 65535) -> {Tag, P}; -cre_ServiceChangeAddress(ip4Address = Tag, A) when record(A, 'IP4Address') -> +cre_ServiceChangeAddress(ip4Address = Tag, A) when is_record(A, 'IP4Address') -> {Tag, A}; -cre_ServiceChangeAddress(ip6Address = Tag, A) when record(A, 'IP6Address') -> +cre_ServiceChangeAddress(ip6Address = Tag, A) when is_record(A, 'IP6Address') -> {Tag, A}; -cre_ServiceChangeAddress(domainName = Tag, N) when record(N, 'DomainName') -> +cre_ServiceChangeAddress(domainName = Tag, N) when is_record(N, 'DomainName') -> {Tag, N}; -cre_ServiceChangeAddress(deviceName = Tag, N) when list(N) -> +cre_ServiceChangeAddress(deviceName = Tag, N) when is_list(N) -> {Tag, N}; -cre_ServiceChangeAddress(mtpAddress = Tag, A) when list(A) -> +cre_ServiceChangeAddress(mtpAddress = Tag, A) when is_list(A) -> {Tag, A}. cre_ServiceChangeResParm() -> @@ -1638,13 +1652,14 @@ cre_ServiceChangeProfile(N, 1). cre_ServiceChangeProfile(N, V) - when is_list(N) and is_integer(V) and (0 =< V) and (V =< 99) -> + when is_list(N) andalso is_integer(V) andalso (0 =< V) andalso (V =< 99) -> #'ServiceChangeProfile'{profileName = N, version = V}. -cre_PackagesDescriptor([H|_] = D) when record(H, 'PackagesItem') -> +cre_PackagesDescriptor([H|_] = D) when is_record(H, 'PackagesItem') -> D. -cre_PackagesItem(N, Ver) when list(N), integer(Ver), 0 =< Ver, Ver =< 99 -> +cre_PackagesItem(N, Ver) + when is_list(N) andalso is_integer(Ver) andalso (0 =< Ver) andalso (Ver =< 99) -> #'PackagesItem'{packageName = N, packageVersion = Ver}. @@ -1652,10 +1667,10 @@ true = is_StatisticsDescriptor(D), D. -cre_StatisticsParameter(N) when list(N) -> +cre_StatisticsParameter(N) when is_list(N) -> #'StatisticsParameter'{statName = N}. -cre_StatisticsParameter(N, V) when list(N), list(V) -> +cre_StatisticsParameter(N, V) when is_list(N) andalso is_list(V) -> #'StatisticsParameter'{statName = N, statValue = V}. %% cre_NonStandardData({Tag, _} = Id, Data) when atom(Tag), list(Data) -> @@ -1679,10 +1694,12 @@ %% manufacturerCode = MC}. cre_TimeNotation(D, T) - when list(D), length(D) == 8, list(T), length(T) == 8 -> + when is_list(D) andalso + (length(D) =:= 8) andalso + is_list(T), length(T) == 8 -> #'TimeNotation'{date = D, time = T}. -cre_Value([H|_] = V) when list(H) -> +cre_Value([H|_] = V) when is_list(H) -> V. cre_BOOLEAN(true = B) -> @@ -2962,7 +2979,7 @@ lists:member(D, [bothway, isolate, oneway]). -chk_TopologyRequest(T, T) when record(T,'TopologyRequest') -> +chk_TopologyRequest(T, T) when is_record(T,'TopologyRequest') -> ok; chk_TopologyRequest(#'TopologyRequest'{terminationFrom = F1, terminationTo = T1, @@ -3034,7 +3051,7 @@ wrong_type('AmmRequest_descriptors', Descs). -chk_AmmRequest(R, R) when record(R, 'AmmRequest') -> +chk_AmmRequest(R, R) when is_record(R, 'AmmRequest') -> d("chk_AmmRequest -> entry when equal"), chk_type(fun is_AmmRequest/1, 'AmmRequest', R); chk_AmmRequest(#'AmmRequest'{terminationID = Tids1, @@ -6395,12 +6412,12 @@ %% -- ModemDescriptor -- -is_ModemDescriptor(D) when record(D, 'ModemDescriptor') -> +is_ModemDescriptor(D) when is_record(D, 'ModemDescriptor') -> true; is_ModemDescriptor(_) -> false. -chk_ModemDescriptor(D, D) when record(D, 'ModemDescriptor') -> +chk_ModemDescriptor(D, D) when is_record(D, 'ModemDescriptor') -> ok; chk_ModemDescriptor(#'ModemDescriptor'{mtl = MTL1, mpl = MPL1, @@ -7233,7 +7250,7 @@ end. -is_IA5String(S) when list(S) -> +is_IA5String(S) when is_list(S) -> true; is_IA5String(_) -> false. @@ -7248,7 +7265,7 @@ % wrong_type('IA5String', S1, S2) % end. -is_IA5String(S, _) when list(S) -> +is_IA5String(S, _) when is_list(S) -> true; is_IA5String(_, _) -> false. @@ -7266,16 +7283,16 @@ is_OCTET_STRING(L) -> is_OCTET_STRING(L, any). -is_OCTET_STRING(L, any) when list(L) -> +is_OCTET_STRING(L, any) when is_list(L) -> true; -is_OCTET_STRING(L, {exact, Len}) when list(L), length(L) == Len -> +is_OCTET_STRING(L, {exact, Len}) when is_list(L) andalso (length(L) =:= Len) -> true; -is_OCTET_STRING(L, {atleast, Len}) when list(L), Len =< length(L) -> +is_OCTET_STRING(L, {atleast, Len}) when is_list(L) andalso (Len =< length(L)) -> true; -is_OCTET_STRING(L, {atmost, Len}) when list(L), length(L) =< Len -> +is_OCTET_STRING(L, {atmost, Len}) when is_list(L) andalso (length(L) =< Len) -> true; is_OCTET_STRING(L, {range, Min, Max}) - when list(L), Min =< length(L), length(L) =< Max -> + when is_list(L) andalso (Min =< length(L)) andalso (length(L) =< Max) -> true; is_OCTET_STRING(_, _) -> false. @@ -7328,16 +7345,26 @@ is_opt_INTEGER(I, R) -> is_OPTIONAL(fun(X) -> is_INTEGER(X, R) end, I). -is_INTEGER(I, any) when integer(I) -> - true; -is_INTEGER(I, {exact, I}) when integer(I) -> +is_INTEGER(I, any) when is_integer(I) -> true; -is_INTEGER(I, {atleast, Min}) when integer(I), integer(Min), Min =< I -> +is_INTEGER(I, {exact, I}) when is_integer(I) -> true; -is_INTEGER(I, {atmost, Max}) when integer(I), integer(Max), I =< Max -> +is_INTEGER(I, {atleast, Min}) + when is_integer(I) andalso + is_integer(Min) andalso + (Min =< I) -> + true; +is_INTEGER(I, {atmost, Max}) + when is_integer(I) andalso + is_integer(Max) andalso + (I =< Max) -> true; is_INTEGER(I, {range, Min, Max}) - when integer(I), integer(Min), integer(Max), Min =< I, I =< Max -> + when is_integer(I) andalso + is_integer(Min) andalso + is_integer(Max) andalso + (Min =< I) andalso + (I =< Max) -> true; is_INTEGER(_, _) -> false. @@ -7371,7 +7398,7 @@ []. -validate(F, Type) when function(F) -> +validate(F, Type) when is_function(F) -> case (catch F()) of {error, Reason} -> error({Type, Reason}); @@ -7380,7 +7407,7 @@ end. -chk_type(F, T, V) when function(F), atom(T) -> +chk_type(F, T, V) when is_function(F) andalso is_atom(T) -> case F(V) of true -> ok; @@ -7388,7 +7415,7 @@ wrong_type(T, V) end. -chk_type(F, T, V1, V2) when function(F), atom(T) -> +chk_type(F, T, V1, V2) when is_function(F) andalso is_atom(T) -> case F(V1, V2) of true -> ok; @@ -7399,26 +7426,26 @@ is_OPTIONAL(_, asn1_NOVALUE) -> true; -is_OPTIONAL(F, Val) when function(F) -> +is_OPTIONAL(F, Val) when is_function(F) -> F(Val). chk_OPTIONAL(_, asn1_NOVALUE, asn1_NOVALUE, _, _) -> ok; -chk_OPTIONAL(Type, asn1_NOVALUE = V1, V2, IS, _CHK) when function(IS) -> +chk_OPTIONAL(Type, asn1_NOVALUE = V1, V2, IS, _CHK) when is_function(IS) -> case IS(V2) of true -> not_equal(Type, V1, V2); false -> wrong_type(Type, V1, V2) end; -chk_OPTIONAL(Type, V1, asn1_NOVALUE = V2, IS, _CHK) when function(IS) -> +chk_OPTIONAL(Type, V1, asn1_NOVALUE = V2, IS, _CHK) when is_function(IS) -> case IS(V1) of true -> not_equal(Type, V1, V2); false -> wrong_type(Type, V1, V2) end; -chk_OPTIONAL(_Type, V1, V2, _IS, CHK) when function(CHK) -> +chk_OPTIONAL(_Type, V1, V2, _IS, CHK) when is_function(CHK) -> CHK(V1, V2). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_prev3b_lib.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_prev3b_lib.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_prev3b_lib.erl 2009-03-12 12:32:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_prev3b_lib.erl 2009-09-18 15:13:25.000000000 +0100 @@ -176,12 +176,12 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -cre_MegacoMessage(M) when record(M, 'Message') -> +cre_MegacoMessage(M) when is_record(M, 'Message') -> #'MegacoMessage'{mess = M}. cre_MegacoMessage(AH, M) - when record(AH, 'AuthenticationHeader'), - record(M, 'Message') -> + when is_record(AH, 'AuthenticationHeader') andalso + is_record(M, 'Message') -> #'MegacoMessage'{authHeader = AH, mess = M}. @@ -190,53 +190,53 @@ seqNum = SN, ad = AD}. -cre_Message(V, Mid, ED) when record(ED, 'ErrorDescriptor') -> +cre_Message(V, Mid, ED) when is_record(ED, 'ErrorDescriptor') -> Body = {errorDescriptor, ED}, #'Message'{version = V, mId = Mid, messageBody = Body}; -cre_Message(V, Mid, Transactions) when list(Transactions) -> +cre_Message(V, Mid, Transactions) when is_list(Transactions) -> Body = {transactions, Transactions}, #'Message'{version = V, mId = Mid, messageBody = Body}; -cre_Message(V, Mid, {transactions, T} = Body) when list(T) -> +cre_Message(V, Mid, {transactions, T} = Body) when is_list(T) -> #'Message'{version = V, mId = Mid, messageBody = Body}; cre_Message(V, Mid, {errorDescriptor, ED} = Body) - when record(ED, 'ErrorDescriptor') -> + when is_record(ED, 'ErrorDescriptor') -> #'Message'{version = V, mId = Mid, messageBody = Body}. -cre_ErrorDescriptor(EC) when integer(EC) -> +cre_ErrorDescriptor(EC) when is_integer(EC) -> #'ErrorDescriptor'{errorCode = EC}. -cre_ErrorDescriptor(EC, ET) when integer(EC), list(ET) -> +cre_ErrorDescriptor(EC, ET) when is_integer(EC) andalso is_list(ET) -> #'ErrorDescriptor'{errorCode = EC, errorText = ET}. -cre_ErrorCode(C) when integer(C), 0 =< C, C =< 65535 -> +cre_ErrorCode(C) when is_integer(C) andalso (0 =< C) andalso (C =< 65535) -> C; cre_ErrorCode(C) -> exit({invalid_ErrorCode, C}). -cre_ErrorText(T) when list(T) -> +cre_ErrorText(T) when is_list(T) -> T. -cre_ContextID(Val) when 0 =< Val, Val =< 4294967295 -> +cre_ContextID(Val) when (0 =< Val) andalso (Val =< 4294967295) -> Val; cre_ContextID(Val) -> exit({invalid_ContextID, Val}). -cre_Transaction(TR) when record(TR, 'TransactionRequest') -> +cre_Transaction(TR) when is_record(TR, 'TransactionRequest') -> {transactionRequest, TR}; -cre_Transaction(TP) when record(TP, 'TransactionPending') -> +cre_Transaction(TP) when is_record(TP, 'TransactionPending') -> {transactionPending, TP}; -cre_Transaction(TR) when record(TR, 'TransactionReply') -> +cre_Transaction(TR) when is_record(TR, 'TransactionReply') -> {transactionReply, TR}; -cre_Transaction(TRA) when list(TRA) -> +cre_Transaction(TRA) when is_list(TRA) -> {transactionResponseAck, TRA}. cre_TransactionId(Val) when 0 =< Val, Val =< 4294967295 -> @@ -244,20 +244,20 @@ cre_TransactionId(Val) -> exit({invalid_TransactionId, Val}). -cre_TransactionRequest(TransID, ARs) when integer(TransID), list(ARs) -> +cre_TransactionRequest(TransID, ARs) when is_integer(TransID) andalso is_list(ARs) -> #'TransactionRequest'{transactionId = TransID, actions = ARs}. -cre_TransactionPending(TransID) when integer(TransID) -> +cre_TransactionPending(TransID) when is_integer(TransID) -> #'TransactionPending'{transactionId = TransID}. cre_TransactionReply(TransID, ED) - when integer(TransID), record(ED, 'ErrorDescriptor') -> + when is_integer(TransID) andalso is_record(ED, 'ErrorDescriptor') -> Res = {transactionError, ED}, #'TransactionReply'{transactionId = TransID, transactionResult = Res}; cre_TransactionReply(TransID, ARs) - when integer(TransID), list(ARs) -> + when is_integer(TransID) andalso is_list(ARs) -> Res = {actionReplies, ARs}, #'TransactionReply'{transactionId = TransID, transactionResult = Res}. @@ -319,30 +319,30 @@ commandRequests = CmdReqs}. cre_ActionReply(CtxID, CmdReps) - when integer(CtxID), - list(CmdReps) -> + when is_integer(CtxID) andalso + is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, commandReply = CmdReps}. cre_ActionReply(CtxID, ED, CmdReps) - when integer(CtxID), - record(ED, 'ErrorDescriptor'), - list(CmdReps) -> + when is_integer(CtxID) andalso + is_record(ED, 'ErrorDescriptor') andalso + is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, errorDescriptor = ED, commandReply = CmdReps}; cre_ActionReply(CtxID, CtxReq, CmdReps) - when is_integer(CtxID) and - is_record(CtxReq, 'ContextRequest') and + when is_integer(CtxID) andalso + is_record(CtxReq, 'ContextRequest') andalso is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, contextReply = CtxReq, commandReply = CmdReps}. cre_ActionReply(CtxID, ED, CtxReq, CmdReps) - when is_integer(CtxID) and - (is_record(ED, 'ErrorDescriptor') or (ED == asn1_NOVALUE)) and - (is_record(CtxReq, 'ContextRequest') or (CtxReq == asn1_NOVALUE)) and + when is_integer(CtxID) andalso + (is_record(ED, 'ErrorDescriptor') orelse (ED =:= asn1_NOVALUE)) andalso + (is_record(CtxReq, 'ContextRequest') orelse (CtxReq =:= asn1_NOVALUE)) andalso is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, errorDescriptor = ED, @@ -352,11 +352,11 @@ cre_ContextRequest() -> strip_ContextRequest(#'ContextRequest'{}). -cre_ContextRequest(Prio) when integer(Prio), 0 =< Prio, Prio =< 15 -> +cre_ContextRequest(Prio) when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) -> strip_ContextRequest(#'ContextRequest'{priority = Prio}); -cre_ContextRequest(Em) when Em == true; Em == false; Em == asn1_NOVALUE -> +cre_ContextRequest(Em) when (Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE) -> strip_ContextRequest(#'ContextRequest'{emergency = Em}); -cre_ContextRequest(Top) when list(Top) -> +cre_ContextRequest(Top) when is_list(Top) -> strip_ContextRequest(#'ContextRequest'{topologyReq = Top}). cre_ContextRequest(Prio, Em) @@ -366,7 +366,7 @@ emergency = Em}, strip_ContextRequest(CR); cre_ContextRequest(Prio, Top) - when integer(Prio), 0 =< Prio, Prio =< 15, list(Top) -> + when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) andalso is_list(Top) -> CR = #'ContextRequest'{priority = Prio, topologyReq = Top}, strip_ContextRequest(CR). @@ -507,53 +507,53 @@ wildcardReturn = WR}. cre_Command(addReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(moveReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(modReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(subtractReq = Tag, Req) - when record(Req, 'SubtractRequest') -> + when is_record(Req, 'SubtractRequest') -> {Tag, Req}; cre_Command(auditCapRequest = Tag, Req) - when record(Req, 'AuditRequest') -> + when is_record(Req, 'AuditRequest') -> {Tag, Req}; cre_Command(auditValueRequest = Tag, Req) - when record(Req, 'AuditRequest') -> + when is_record(Req, 'AuditRequest') -> {Tag, Req}; cre_Command(notifyReq = Tag, Req) - when record(Req, 'NotifyRequest') -> + when is_record(Req, 'NotifyRequest') -> {Tag, Req}; cre_Command(serviceChangeReq = Tag, Req) - when record(Req, 'ServiceChangeRequest') -> + when is_record(Req, 'ServiceChangeRequest') -> {Tag, Req}. cre_CommandReply(addReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(moveReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(modReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(subtractReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(auditCapReply = Tag, Rep) - when tuple(Rep) -> + when is_tuple(Rep) -> {Tag, Rep}; cre_CommandReply(auditValueReply = Tag, Rep) - when tuple(Rep) -> + when is_tuple(Rep) -> {Tag, Rep}; cre_CommandReply(notifyReply = Tag, Rep) - when record(Rep, 'NotifyReply') -> + when is_record(Rep, 'NotifyReply') -> {Tag, Rep}; cre_CommandReply(serviceChangeReply = Tag, Rep) - when record(Rep, 'ServiceChangeReply') -> + when is_record(Rep, 'ServiceChangeReply') -> {Tag, Rep}. cre_TopologyRequest(From, To, Dir) @@ -591,19 +591,19 @@ error({invalid_AmmRequest, {TermIDs, Descs}}) end. -cre_AmmDescriptor(D) when record(D, 'MediaDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'MediaDescriptor') -> {mediaDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'ModemDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'ModemDescriptor') -> {modemDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'MuxDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'MuxDescriptor') -> {muxDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'EventsDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'EventsDescriptor') -> {eventsDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'DigitMapDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'DigitMapDescriptor') -> {digitMapDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'AuditDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'AuditDescriptor') -> {auditDescriptor, D}; -cre_AmmDescriptor(D) when list(D) -> +cre_AmmDescriptor(D) when is_list(D) -> case is_EventBufferDescriptor(D) of true -> {eventBufferDescriptor, D}; @@ -621,35 +621,35 @@ end end. -cre_AmmsReply(TermIDs) when list(TermIDs) -> +cre_AmmsReply(TermIDs) when is_list(TermIDs) -> #'AmmsReply'{terminationID = TermIDs}. -cre_AmmsReply(TermIDs, TAs) when list(TermIDs), list(TAs) -> +cre_AmmsReply(TermIDs, TAs) when is_list(TermIDs) andalso is_list(TAs) -> #'AmmsReply'{terminationID = TermIDs, terminationAudit = TAs}. -cre_SubtractRequest(TermIDs) when list(TermIDs) -> +cre_SubtractRequest(TermIDs) when is_list(TermIDs) -> #'SubtractRequest'{terminationID = TermIDs}. cre_SubtractRequest(TermIDs, Audit) - when list(TermIDs), record(Audit, 'AuditDescriptor') -> + when is_list(TermIDs) andalso is_record(Audit, 'AuditDescriptor') -> #'SubtractRequest'{terminationID = TermIDs, auditDescriptor = Audit}. cre_AuditRequest(TermID, Audit) - when record(TermID, megaco_term_id), record(Audit, 'AuditDescriptor') -> + when is_record(TermID, megaco_term_id) andalso is_record(Audit, 'AuditDescriptor') -> #'AuditRequest'{terminationID = TermID, auditDescriptor = Audit}. -cre_AuditReply(TermIDs) when list(TermIDs) -> +cre_AuditReply(TermIDs) when is_list(TermIDs) -> {contextAuditResult, TermIDs}; -cre_AuditReply(ED) when record(ED, 'ErrorDescriptor') -> +cre_AuditReply(ED) when is_record(ED, 'ErrorDescriptor') -> {error, ED}; -cre_AuditReply(Audit) when record(Audit, 'AuditResult') -> +cre_AuditReply(Audit) when is_record(Audit, 'AuditResult') -> {auditResult, Audit}. cre_AuditResult(TermID, TAs) - when record(TermID, megaco_term_id), list(TAs) -> + when is_record(TermID, megaco_term_id) andalso is_list(TAs) -> #'AuditResult'{terminationID = TermID, terminationAuditResult = TAs}. @@ -657,35 +657,35 @@ true = is_TerminationAudit(D), D. -cre_AuditReturnParameter(D) when record(D, 'ErrorDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ErrorDescriptor') -> {errorDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'MediaDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'MediaDescriptor') -> {mediaDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'ModemDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ModemDescriptor') -> {modemDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'MuxDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'MuxDescriptor') -> {muxDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'EventsDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'EventsDescriptor') -> {eventsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'EventSpec') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'EventSpec') -> {eventBufferDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'DigitMapDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'DigitMapDescriptor') -> {digitMapDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'ObservedEventsDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ObservedEventsDescriptor') -> {observedEventsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'StatisticsParameter') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'StatisticsParameter') -> {statisticsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'PackagesItem') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'PackagesItem') -> {packagesDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'AuditDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'AuditDescriptor') -> {emptyDescriptors, D}; -cre_AuditReturnParameter([H|_] = D) when tuple(H) -> +cre_AuditReturnParameter([H|_] = D) when is_tuple(H) -> {signalsDescriptor, D}. cre_AuditDescriptor() -> #'AuditDescriptor'{}. -cre_AuditDescriptor([H|_] = AT) when atom(H) -> +cre_AuditDescriptor([H|_] = AT) when is_atom(H) -> #'AuditDescriptor'{auditToken = AT}; cre_AuditDescriptor(APT) -> #'AuditDescriptor'{auditPropertyToken = APT}. @@ -694,74 +694,74 @@ #'AuditDescriptor'{auditToken = AT, auditPropertyToken = APT}. -cre_IndAuditParameter(D) when record(D, 'IndAudMediaDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudMediaDescriptor') -> {indAudMediaDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudEventsDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudEventsDescriptor') -> {indAudEventsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudEventBufferDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudEventBufferDescriptor') -> {indAudEventBufferDescriptor, D}; cre_IndAuditParameter({signal, _} = D) -> {indAudSignalsDescriptor, D}; cre_IndAuditParameter({seqSigList, _} = D) -> {indAudSignalsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudDigitMapDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudDigitMapDescriptor') -> {indAudDigitMapDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudStatisticsDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudStatisticsDescriptor') -> {indAudStatisticsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudPackagesDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudPackagesDescriptor') -> {indAudPackagesDescriptor, D}. cre_IndAudMediaDescriptor() -> #'IndAudMediaDescriptor'{}. cre_IndAudMediaDescriptor(TSD) - when record(TSD, 'IndAudTerminationStateDescriptor') -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') -> #'IndAudMediaDescriptor'{termStateDescr = TSD}; -cre_IndAudMediaDescriptor(Parms) when record(Parms, 'IndAudStreamParms') -> +cre_IndAudMediaDescriptor(Parms) when is_record(Parms, 'IndAudStreamParms') -> Streams = {oneStream, Parms}, #'IndAudMediaDescriptor'{streams = Streams}; -cre_IndAudMediaDescriptor(Descs) when list(Descs) -> +cre_IndAudMediaDescriptor(Descs) when is_list(Descs) -> Streams = {multiStream, Descs}, #'IndAudMediaDescriptor'{streams = Streams}. cre_IndAudMediaDescriptor(TSD, Parms) - when record(TSD, 'IndAudTerminationStateDescriptor'), - record(Parms, 'IndAudStreamParms') -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso + is_record(Parms, 'IndAudStreamParms') -> Streams = {oneStream, Parms}, #'IndAudMediaDescriptor'{termStateDescr = TSD, streams = Streams}; cre_IndAudMediaDescriptor(TSD, Descs) - when record(TSD, 'IndAudTerminationStateDescriptor'), list(Descs) -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso is_list(Descs) -> Streams = {multiStream, Descs}, #'IndAudMediaDescriptor'{termStateDescr = TSD, streams = Streams}. cre_IndAudStreamDescriptor(SID, Parms) - when integer(SID), record(Parms, 'IndAudStreamParms') -> + when is_integer(SID) andalso is_record(Parms, 'IndAudStreamParms') -> #'IndAudStreamDescriptor'{streamID = SID, streamParms = Parms}. cre_IndAudStreamParms() -> #'IndAudStreamParms'{}. -cre_IndAudStreamParms(LCD) when record(LCD, 'IndAudLocalControlDescriptor') -> +cre_IndAudStreamParms(LCD) when is_record(LCD, 'IndAudLocalControlDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LCD}; -cre_IndAudStreamParms(SD) when record(SD, 'IndAudStatisticsDescriptor') -> +cre_IndAudStreamParms(SD) when is_record(SD, 'IndAudStatisticsDescriptor') -> #'IndAudStreamParms'{statisticsDescriptor = SD}. cre_IndAudStreamParms(LC, L, R) - when record(LC, 'IndAudLocalControlDescriptor'), - record(L, 'IndAudLocalRemoteDescriptor'), - record(R, 'IndAudLocalRemoteDescriptor') -> + when is_record(LC, 'IndAudLocalControlDescriptor') andalso + is_record(L, 'IndAudLocalRemoteDescriptor') andalso + is_record(R, 'IndAudLocalRemoteDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LC, localDescriptor = L, remoteDescriptor = R}. cre_IndAudStreamParms(LC, L, R, S) - when record(LC, 'IndAudLocalControlDescriptor'), - record(L, 'IndAudLocalRemoteDescriptor'), - record(R, 'IndAudLocalRemoteDescriptor'), - record(S, 'IndAudStatisticsDescriptor') -> + when is_record(LC, 'IndAudLocalControlDescriptor') andalso + is_record(L, 'IndAudLocalRemoteDescriptor') andalso + is_record(R, 'IndAudLocalRemoteDescriptor') andalso + is_record(S, 'IndAudStatisticsDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LC, localDescriptor = L, remoteDescriptor = R, @@ -780,28 +780,28 @@ reserveGroup = RG, propertyParms = PP}. -cre_IndAudPropertyParm(PkgdName) when list(PkgdName) -> +cre_IndAudPropertyParm(PkgdName) when is_list(PkgdName) -> #'IndAudPropertyParm'{name = PkgdName}. cre_IndAudLocalRemoteDescriptor(Grps) - when list(Grps) -> + when is_list(Grps) -> #'IndAudLocalRemoteDescriptor'{propGrps = Grps}. cre_IndAudLocalRemoteDescriptor(GrpID, Grps) - when integer(GrpID), 0 =< GrpID, GrpID =< 65535, list(Grps) -> + when is_integer(GrpID) andalso (0 =< GrpID) andalso (GrpID =< 65535) andalso is_list(Grps) -> #'IndAudLocalRemoteDescriptor'{propGroupID = GrpID, propGrps = Grps}. cre_IndAudPropertyGroup([]) -> []; cre_IndAudPropertyGroup([H|_] = PG) - when record(H, 'IndAudPropertyParm') -> + when is_record(H, 'IndAudPropertyParm') -> PG. cre_IndAudTerminationStateDescriptor([] = PP) -> #'IndAudTerminationStateDescriptor'{propertyParms = PP}; cre_IndAudTerminationStateDescriptor([H|_] = PP) - when record(H, 'IndAudPropertyParm') -> + when is_record(H, 'IndAudPropertyParm') -> #'IndAudTerminationStateDescriptor'{propertyParms = PP}. cre_IndAudTerminationStateDescriptor([] = PP, EBC, SS) @@ -819,109 +819,118 @@ serviceState = SS}. cre_IndAudEventsDescriptor(PkgdName) - when list(PkgdName) -> + when is_list(PkgdName) -> #'IndAudEventsDescriptor'{pkgdName = PkgdName}. cre_IndAudEventsDescriptor(RID, PkgdName) - when integer(RID), list(PkgdName) -> + when is_integer(RID) andalso is_list(PkgdName) -> #'IndAudEventsDescriptor'{requestID = RID, pkgdName = PkgdName}; cre_IndAudEventsDescriptor(PkgdName, SID) - when list(PkgdName), integer(SID) -> + when is_list(PkgdName) andalso is_integer(SID) -> #'IndAudEventsDescriptor'{pkgdName = PkgdName, streamID = SID}. cre_IndAudEventsDescriptor(RID, PkgdName, SID) - when integer(RID), list(PkgdName), integer(SID) -> + when is_integer(RID) andalso is_list(PkgdName) andalso is_integer(SID) -> #'IndAudEventsDescriptor'{requestID = RID, pkgdName = PkgdName, streamID = SID}. -cre_IndAudEventBufferDescriptor(EventName) when list(EventName) -> +cre_IndAudEventBufferDescriptor(EventName) when is_list(EventName) -> #'IndAudEventBufferDescriptor'{eventName = EventName}. cre_IndAudEventBufferDescriptor(EventName, SID) - when list(EventName), integer(SID) -> + when is_list(EventName) andalso is_integer(SID) -> #'IndAudEventBufferDescriptor'{eventName = EventName, streamID = SID}. -cre_IndAudSignalsDescriptor(S) when record(S, 'IndAudSignal') -> +cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSignal') -> {signal, S}; -cre_IndAudSignalsDescriptor(S) when record(S, 'IndAudSeqSigList') -> +cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSeqSigList') -> {seqSigList, S}. -cre_IndAudSeqSigList(ID) when integer(ID), 0=< ID, ID =< 65535 -> +cre_IndAudSeqSigList(ID) when is_integer(ID) andalso (0=< ID) andalso (ID =< 65535) -> #'IndAudSeqSigList'{id = ID}. cre_IndAudSeqSigList(ID, S) - when integer(ID), 0=< ID, ID =< 65535, - record(S, 'IndAudSignal') -> + when is_integer(ID) andalso + (0=< ID) andalso + (ID =< 65535) andalso + is_record(S, 'IndAudSignal') -> #'IndAudSeqSigList'{id = ID, signalList = S}. -cre_IndAudSignal(SigName) when list(SigName) -> +cre_IndAudSignal(SigName) + when is_list(SigName) -> #'IndAudSignal'{signalName = SigName}. -cre_IndAudSignal(SigName, SID) when list(SigName), integer(SID) -> +cre_IndAudSignal(SigName, SID) + when is_list(SigName) andalso is_integer(SID) -> #'IndAudSignal'{signalName = SigName, streamID = SID}. cre_IndAudDigitMapDescriptor() -> #'IndAudDigitMapDescriptor'{}. -cre_IndAudDigitMapDescriptor(DMN) when list(DMN) -> +cre_IndAudDigitMapDescriptor(DMN) when is_list(DMN) -> #'IndAudDigitMapDescriptor'{digitMapName = DMN}. -cre_IndAudStatisticsDescriptor(StatName) when list(StatName) -> +cre_IndAudStatisticsDescriptor(StatName) when is_list(StatName) -> #'IndAudStatisticsDescriptor'{statName = StatName}. cre_IndAudPackagesDescriptor(N, V) - when list(N), - integer(V), 0 =< V, V =< 99 -> + when is_list(N) andalso is_integer(V) andalso (0 =< V) andalso (V =< 99) -> #'IndAudPackagesDescriptor'{packageName = N, packageVersion = V}. cre_NotifyRequest(TermIDs, D) - when list(TermIDs), record(D, 'ObservedEventsDescriptor') -> + when is_list(TermIDs) andalso is_record(D, 'ObservedEventsDescriptor') -> #'NotifyRequest'{terminationID = TermIDs, observedEventsDescriptor = D}. cre_NotifyRequest(TermIDs, D, ED) - when list(TermIDs), - record(D, 'ObservedEventsDescriptor'), - record(ED, 'ErrorDescriptor') -> + when is_list(TermIDs) andalso + is_record(D, 'ObservedEventsDescriptor') andalso + is_record(ED, 'ErrorDescriptor') -> #'NotifyRequest'{terminationID = TermIDs, observedEventsDescriptor = D, errorDescriptor = ED}. -cre_NotifyReply(TermIDs) when list(TermIDs) -> +cre_NotifyReply(TermIDs) when is_list(TermIDs) -> #'NotifyReply'{terminationID = TermIDs}. cre_NotifyReply(TermIDs, ED) - when list(TermIDs), - record(ED, 'ErrorDescriptor') -> + when is_list(TermIDs) andalso + is_record(ED, 'ErrorDescriptor') -> #'NotifyReply'{terminationID = TermIDs, errorDescriptor = ED}. cre_ObservedEventsDescriptor(RID, [H|_] = L) - when integer(RID), record(H, 'ObservedEvent') -> + when is_integer(RID) andalso is_record(H, 'ObservedEvent') -> #'ObservedEventsDescriptor'{requestId = RID, observedEventLst = L}. -cre_ObservedEvent(EN, EPL) when list(EN), list(EPL) -> +cre_ObservedEvent(EN, EPL) when is_list(EN) andalso is_list(EPL) -> #'ObservedEvent'{eventName = EN, eventParList = EPL}; -cre_ObservedEvent(EN, TN) when list(EN), record(TN, 'TimeNotation') -> +cre_ObservedEvent(EN, TN) when is_list(EN) andalso is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, timeNotation = TN}. -cre_ObservedEvent(EN, SID, EPL) when list(EN), integer(SID), list(EPL) -> +cre_ObservedEvent(EN, SID, EPL) + when is_list(EN) andalso is_integer(SID) andalso is_list(EPL) -> #'ObservedEvent'{eventName = EN, streamID = SID, eventParList = EPL}; cre_ObservedEvent(EN, EPL, TN) - when list(EN), list(EPL), record(TN, 'TimeNotation') -> + when is_list(EN) andalso + is_list(EPL) andalso + is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, eventParList = EPL, timeNotation = TN}. cre_ObservedEvent(EN, SID, EPL, TN) - when list(EN), integer(SID), list(EPL), record(TN, 'TimeNotation') -> + when is_list(EN) andalso + is_integer(SID) andalso + is_list(EPL) andalso + is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, streamID = SID, eventParList = EPL, @@ -930,93 +939,92 @@ cre_EventName(N) when is_list(N) -> N. -cre_EventParameter(N, V) when list(N), list(V) -> +cre_EventParameter(N, V) when is_list(N) andalso is_list(V) -> #'EventParameter'{eventParameterName = N, value = V}. cre_EventParameter(N, V, relation = Tag, R) - when list(N), list(V), atom(R) -> + when is_list(N) andalso is_list(V) andalso is_atom(R) -> EI = {Tag, R}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}; cre_EventParameter(N, V, range = Tag, B) - when list(N), list(V), atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}; cre_EventParameter(N, V, sublist = Tag, B) - when list(N), list(V), atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}. cre_ServiceChangeRequest(TermIDs, SCP) - when list(TermIDs), - record(SCP, 'ServiceChangeParm') -> + when is_list(TermIDs) andalso + is_record(SCP, 'ServiceChangeParm') -> #'ServiceChangeRequest'{terminationID = TermIDs, serviceChangeParms = SCP}. cre_ServiceChangeReply(TermIDs, {Tag, R} = SCR) - when list(TermIDs), atom(Tag), tuple(R) -> + when is_list(TermIDs) andalso is_atom(Tag) andalso is_tuple(R) -> #'ServiceChangeReply'{terminationID = TermIDs, serviceChangeResult = SCR}. -cre_ServiceChangeResult(ED) when record(ED, 'ErrorDescriptor') -> +cre_ServiceChangeResult(ED) when is_record(ED, 'ErrorDescriptor') -> {errorDescriptor, ED}; -cre_ServiceChangeResult(SCRP) when record(SCRP, 'ServiceChangeResParm') -> +cre_ServiceChangeResult(SCRP) when is_record(SCRP, 'ServiceChangeResParm') -> {serviceChangeResParms, SCRP}. %% cre_WildcardField(L) when list(L), length(L) == 1 -> L. cre_TerminationID(W, ID) - when list(W), - list(ID), 1 =< length(ID), length(ID) =< 8 -> + when is_list(W) andalso is_list(ID) andalso (1 =< length(ID)) andalso (length(ID) =< 8) -> #'TerminationID'{wildcard = W, id = ID}. -cre_TerminationIDList(L) when list(L) -> +cre_TerminationIDList(L) when is_list(L) -> L. cre_MediaDescriptor() -> #'MediaDescriptor'{}. -cre_MediaDescriptor(TSD) when record(TSD, 'TerminationStateDescriptor') -> +cre_MediaDescriptor(TSD) when is_record(TSD, 'TerminationStateDescriptor') -> #'MediaDescriptor'{termStateDescr = TSD}; -cre_MediaDescriptor(SP) when record(SP, 'StreamParms') -> +cre_MediaDescriptor(SP) when is_record(SP, 'StreamParms') -> Streams = {oneStream, SP}, #'MediaDescriptor'{streams = Streams}; -cre_MediaDescriptor([H|_] = SDs) when record(H, 'StreamDescriptor') -> +cre_MediaDescriptor([H|_] = SDs) when is_record(H, 'StreamDescriptor') -> Streams = {multiStream, SDs}, #'MediaDescriptor'{streams = Streams}. cre_MediaDescriptor(TSD, SP) - when record(TSD, 'TerminationStateDescriptor'), - record(SP, 'StreamParms') -> + when is_record(TSD, 'TerminationStateDescriptor') andalso + is_record(SP, 'StreamParms') -> Streams = {oneStream, SP}, #'MediaDescriptor'{termStateDescr = TSD, streams = Streams}; cre_MediaDescriptor(TSD, [H|_] = SDs) - when record(TSD, 'TerminationStateDescriptor'), - record(H, 'StreamDescriptor') -> + when is_record(TSD, 'TerminationStateDescriptor') andalso + is_record(H, 'StreamDescriptor') -> Streams = {multiStream, SDs}, #'MediaDescriptor'{termStateDescr = TSD, streams = Streams}. -cre_StreamDescriptor(SID, SP) when integer(SID), record(SP, 'StreamParms') -> +cre_StreamDescriptor(SID, SP) when is_integer(SID) andalso is_record(SP, 'StreamParms') -> #'StreamDescriptor'{streamID = SID, streamParms = SP}. cre_StreamParms() -> #'StreamParms'{}. -cre_StreamParms(LCD) when record(LCD, 'LocalControlDescriptor') -> +cre_StreamParms(LCD) when is_record(LCD, 'LocalControlDescriptor') -> #'StreamParms'{localControlDescriptor = LCD}; -cre_StreamParms(LD) when record(LD, 'LocalRemoteDescriptor') -> +cre_StreamParms(LD) when is_record(LD, 'LocalRemoteDescriptor') -> #'StreamParms'{localDescriptor = LD}; -cre_StreamParms(SD) when list(SD) -> +cre_StreamParms(SD) when is_list(SD) -> #'StreamParms'{statisticsDescriptor = SD}. cre_StreamParms(LCD, LD) @@ -1050,13 +1058,13 @@ remoteDescriptor = RD, statisticsDescriptor = SD}. -cre_LocalControlDescriptor(SM) when atom(SM) -> +cre_LocalControlDescriptor(SM) when is_atom(SM) -> #'LocalControlDescriptor'{streamMode = SM, propertyParms = []}; -cre_LocalControlDescriptor([H|_] = PP) when record(H, 'PropertyParm') -> +cre_LocalControlDescriptor([H|_] = PP) when is_record(H, 'PropertyParm') -> #'LocalControlDescriptor'{propertyParms = PP}. cre_LocalControlDescriptor(SM, [H|_] = PP) - when atom(SM), record(H, 'PropertyParm') -> + when is_atom(SM) andalso is_record(H, 'PropertyParm') -> #'LocalControlDescriptor'{streamMode = SM, propertyParms = PP}. @@ -1081,19 +1089,19 @@ cre_StreamMode(loopBack = M) -> M. -cre_PropertyParm(N, [H|_] = V) when list(N), list(H) -> +cre_PropertyParm(N, [H|_] = V) when is_list(N) andalso is_list(H) -> #'PropertyParm'{name = N, value = V}. cre_PropertyParm(N, [H|_] = V, relation = Tag, R) - when list(N), list(H), atom(R) -> + when is_list(N) andalso is_list(H) andalso is_atom(R) -> EI = {Tag, R}, #'PropertyParm'{name = N, value = V, extraInfo = EI}; cre_PropertyParm(N, [H|_] = V, range = Tag, B) - when list(N), list(H), atom(B) -> + when is_list(N) andalso is_list(H) andalso is_atom(B) -> EI = {Tag, B}, #'PropertyParm'{name = N, value = V, extraInfo = EI}; cre_PropertyParm(N, [H|_] = V, sublist = Tag, B) - when list(N), list(H), atom(B) -> + when is_list(N) andalso is_list(H) andalso is_atom(B) -> EI = {Tag, B}, #'PropertyParm'{name = N, value = V, extraInfo = EI}. @@ -1127,40 +1135,40 @@ cre_Relation(unequalTo = R) -> R. -cre_LocalRemoteDescriptor([H|_] = PGs) when list(H) -> +cre_LocalRemoteDescriptor([H|_] = PGs) when is_list(H) -> #'LocalRemoteDescriptor'{propGrps = PGs}. -cre_PropertyGroup([H|_] = PG) when record(H, 'PropertyParm') -> +cre_PropertyGroup([H|_] = PG) when is_record(H, 'PropertyParm') -> PG. -cre_TerminationStateDescriptor([H|_] = PPs) when record(H, 'PropertyParm') -> +cre_TerminationStateDescriptor([H|_] = PPs) when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs}. cre_TerminationStateDescriptor([H|_] = PPs, off = EBC) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, eventBufferControl = EBC}; cre_TerminationStateDescriptor([H|_] = PPs, lockStep = EBC) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, eventBufferControl = EBC}; cre_TerminationStateDescriptor([H|_] = PPs, test = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}; cre_TerminationStateDescriptor([H|_] = PPs, outOfSvc = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}; cre_TerminationStateDescriptor([H|_] = PPs, inSvc = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}. cre_TerminationStateDescriptor([H|_] = PPs, EMC, SS) - when record(H, 'PropertyParm'), - ((EMC == off) or (EMC == lockStep)) and - ((SS == test) or (SS == outOfSvc) or (SS == inSvc)) -> + when is_record(H, 'PropertyParm') andalso + ((EMC =:= off) orelse (EMC =:= lockStep)) andalso + ((SS =:= test) orelse (SS =:= outOfSvc) orelse (SS =:= inSvc)) -> #'TerminationStateDescriptor'{propertyParms = PPs, eventBufferControl = EMC, serviceState = SS}. @@ -1178,7 +1186,7 @@ SS. cre_MuxDescriptor(MT, [H|_] = TL) - when atom(MT), record(H, 'TerminationID') -> + when is_atom(MT) andalso is_record(H, 'TerminationID') -> #'MuxDescriptor'{muxType = MT, termList = TL}. %% cre_MuxDescriptor(MT, [H|_] = TL, NSD) @@ -1206,44 +1214,44 @@ #'EventsDescriptor'{eventList = []}. cre_EventsDescriptor(RID, [H|_] = EL) - when integer(RID), record(H, 'RequestedEvent') -> + when is_integer(RID) andalso is_record(H, 'RequestedEvent') -> #'EventsDescriptor'{requestID = RID, eventList = EL}. cre_RequestedEvent(N) -> #'RequestedEvent'{pkgdName = N}. cre_RequestedEvent(N, [H|_] = EPL) - when list(N), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, evParList = EPL}; cre_RequestedEvent(N, EA) - when list(N), - record(EA, 'RequestedActions')-> + when is_list(N) andalso + is_record(EA, 'RequestedActions')-> #'RequestedEvent'{pkgdName = N, eventAction = EA}. cre_RequestedEvent(N, SID, [H|_] = EPL) - when list(N), - integer(SID), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, streamID = SID, evParList = EPL}; cre_RequestedEvent(N, EA, [H|_] = EPL) - when list(N), - record(EA, 'RequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(EA, 'RequestedActions') andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, eventAction = EA, evParList = EPL}. cre_RequestedEvent(N, SID, EA, [H|_] = EPL) - when list(N), - integer(SID), - record(EA, 'RequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(EA, 'RequestedActions') andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, streamID = SID, eventAction = EA, @@ -1275,45 +1283,45 @@ secondEvent = SE, signalsDescriptor = SD}. -cre_EventDM(N) when list(N) -> +cre_EventDM(N) when is_list(N) -> {digitMapName, N}; -cre_EventDM(V) when record(V, 'DigitMapValue') -> +cre_EventDM(V) when is_record(V, 'DigitMapValue') -> {digitMapValue, V}. cre_SecondEventsDescriptor([H|_] = EL) - when record(H, 'SecondRequestedEvent') -> + when is_record(H, 'SecondRequestedEvent') -> #'SecondEventsDescriptor'{eventList = EL}. cre_SecondEventsDescriptor(RID, [H|_] = EL) - when integer(RID), record(H, 'SecondRequestedEvent') -> + when is_integer(RID) andalso is_record(H, 'SecondRequestedEvent') -> #'SecondEventsDescriptor'{requestID = RID, eventList = EL}. cre_SecondRequestedEvent(N, [H|_] = EPL) - when list(N), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, evParList = EPL}. cre_SecondRequestedEvent(N, SID, [H|_] = EPL) - when list(N), - integer(SID), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, streamID = SID, evParList = EPL}; cre_SecondRequestedEvent(N, EA, [H|_] = EPL) - when list(N), - record(EA, 'SecondRequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(EA, 'SecondRequestedActions') andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, eventAction = EA, evParList = EPL}. cre_SecondRequestedEvent(N, SID, EA, [H|_] = EPL) - when list(N), - integer(SID), - record(EA, 'SecondRequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(EA, 'SecondRequestedActions') andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, streamID = SID, eventAction = EA, @@ -1323,38 +1331,39 @@ #'SecondRequestedActions'{}. cre_SecondRequestedActions(KA) - when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) -> + when ((KA =:= true) orelse (KA =:= false) orelse (KA =:= asn1_NOVALUE)) -> #'SecondRequestedActions'{keepActive = KA}; -cre_SecondRequestedActions(SD) when list(SD) -> +cre_SecondRequestedActions(SD) when is_list(SD) -> #'SecondRequestedActions'{signalsDescriptor = SD}; -cre_SecondRequestedActions({Tag, _} = EDM) when atom(Tag) -> +cre_SecondRequestedActions({Tag, _} = EDM) when is_atom(Tag) -> #'SecondRequestedActions'{eventDM = EDM}. cre_SecondRequestedActions(KA, SD) - when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and + when ((KA =:= true) orelse (KA =:= false) orelse (KA =:= asn1_NOVALUE)) andalso is_list(SD) -> #'SecondRequestedActions'{keepActive = KA, signalsDescriptor = SD}; cre_SecondRequestedActions(KA, {Tag, _} = EDM) - when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and + when ((KA =:= true) orelse (KA =:= false) orelse (KA =:= asn1_NOVALUE)) andalso is_atom(Tag) -> #'SecondRequestedActions'{keepActive = KA, eventDM = EDM}. cre_SecondRequestedActions(KA, {Tag, _} = EDM, SD) - when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and - is_atom(Tag), + when ((KA =:= true) orelse (KA =:= false) orelse (KA =:= asn1_NOVALUE)) andalso + is_atom(Tag) andalso is_list(SD) -> #'SecondRequestedActions'{keepActive = KA, eventDM = EDM, signalsDescriptor = SD}. -cre_EventBufferDescriptor([H|_] = D) when record(H, 'EventSpec') -> +cre_EventBufferDescriptor([H|_] = D) when is_record(H, 'EventSpec') -> D. -cre_EventSpec(N, [H|_] = EPL) when list(N), record(H, 'EventParameter') -> +cre_EventSpec(N, [H|_] = EPL) + when is_list(N) andalso is_record(H, 'EventParameter') -> #'EventSpec'{eventName = N, eventParList = EPL}. cre_EventSpec(N, SID, [H|_] = EPL) - when list(N), integer(SID), record(H, 'EventParameter') -> + when is_list(N) andalso is_integer(SID) andalso is_record(H, 'EventParameter') -> #'EventSpec'{eventName = N, streamID = SID, eventParList = EPL}. cre_SignalsDescriptor(D) -> @@ -1365,19 +1374,19 @@ error({invalid_SignalsDescriptor, D}) end. -cre_SignalRequest(S) when record(S, 'Signal') -> +cre_SignalRequest(S) when is_record(S, 'Signal') -> {signal, S}; -cre_SignalRequest(S) when record(S, 'SeqSigList') -> +cre_SignalRequest(S) when is_record(S, 'SeqSigList') -> {seqSigList, S}. cre_SeqSigList(ID, [H|_] = SL) - when integer(ID), 0 =< ID, ID =< 65535, record(H, 'Signal') -> + when is_integer(ID) andalso (0 =< ID) andalso (ID =< 65535) andalso is_record(H, 'Signal') -> #'SeqSigList'{id = ID, signalList = SL}. -cre_Signal(N) when list(N) -> +cre_Signal(N) when is_list(N) -> #'Signal'{signalName = N}. -cre_Signal(N, SPL) when list(N), list(SPL) -> +cre_Signal(N, SPL) when is_list(N) andalso is_list(SPL) -> #'Signal'{signalName = N, sigParList = SPL}. @@ -1439,7 +1448,7 @@ cre_SignalName(N) -> cre_PkgdName(N). -cre_NotifyCompletion(L) when list(L) -> +cre_NotifyCompletion(L) when is_list(L) -> Vals = [onTimeOut, onInterruptByEvent, onInterruptByNewSignalDescr, otherReason], F = fun(E) -> case lists:member(E, Vals) of @@ -1452,7 +1461,7 @@ lists:foreach(F, L), L. -cre_SigParameter(N, V) when list(N), list(V) -> +cre_SigParameter(N, V) when is_list(N) andalso is_list(V) -> #'SigParameter'{sigParameterName = N, value = V}. cre_SigParameter(N, V, relation = Tag, R) @@ -1473,7 +1482,7 @@ cre_RequestID(Val) -> exit({invalid_RequestID, Val}). -cre_ModemDescriptor(MTL, MPL) when list(MTL), list(MPL) -> +cre_ModemDescriptor(MTL, MPL) when is_list(MTL) andalso is_list(MPL) -> #'ModemDescriptor'{mtl = MTL, mpl = MPL}. %% cre_ModemDescriptor(MTL, MPL, NSD) @@ -1502,18 +1511,18 @@ cre_DigitMapDescriptor() -> #'DigitMapDescriptor'{}. -cre_DigitMapDescriptor(N) when list(N) -> +cre_DigitMapDescriptor(N) when is_list(N) -> #'DigitMapDescriptor'{digitMapName = N}; -cre_DigitMapDescriptor(V) when record(V, 'DigitMapValue') -> +cre_DigitMapDescriptor(V) when is_record(V, 'DigitMapValue') -> #'DigitMapDescriptor'{digitMapValue = V}. -cre_DigitMapDescriptor(N, V) when list(N), record(V, 'DigitMapValue') -> +cre_DigitMapDescriptor(N, V) when is_list(N) andalso is_record(V, 'DigitMapValue') -> #'DigitMapDescriptor'{digitMapName = N, digitMapValue = V}. cre_DigitMapName(N) -> cre_Name(N). -cre_DigitMapValue(DMB) when list(DMB) -> +cre_DigitMapValue(DMB) when is_list(DMB) -> #'DigitMapValue'{digitMapBody = DMB}. cre_DigitMapValue(Start, Short, Long, DMB) -> @@ -1535,7 +1544,7 @@ digitMapBody = DMB, durationTimer = Dur}. -cre_ServiceChangeParm(M, R) when atom(M), list(R) -> +cre_ServiceChangeParm(M, R) when is_atom(M) andalso is_list(R) -> #'ServiceChangeParm'{serviceChangeMethod = M, serviceChangeReason = R}. @@ -1581,17 +1590,17 @@ end. cre_ServiceChangeAddress(portNumber = Tag, P) - when integer(P), 0 =< P, P =< 65535 -> + when is_integer(P) andalso (0 =< P) andalso (P =< 65535) -> {Tag, P}; -cre_ServiceChangeAddress(ip4Address = Tag, A) when record(A, 'IP4Address') -> +cre_ServiceChangeAddress(ip4Address = Tag, A) when is_record(A, 'IP4Address') -> {Tag, A}; -cre_ServiceChangeAddress(ip6Address = Tag, A) when record(A, 'IP6Address') -> +cre_ServiceChangeAddress(ip6Address = Tag, A) when is_record(A, 'IP6Address') -> {Tag, A}; -cre_ServiceChangeAddress(domainName = Tag, N) when record(N, 'DomainName') -> +cre_ServiceChangeAddress(domainName = Tag, N) when is_record(N, 'DomainName') -> {Tag, N}; -cre_ServiceChangeAddress(deviceName = Tag, N) when list(N) -> +cre_ServiceChangeAddress(deviceName = Tag, N) when is_list(N) -> {Tag, N}; -cre_ServiceChangeAddress(mtpAddress = Tag, A) when list(A) -> +cre_ServiceChangeAddress(mtpAddress = Tag, A) when is_list(A) -> {Tag, A}. cre_ServiceChangeResParm() -> @@ -1600,12 +1609,12 @@ cre_ServiceChangeResParm(asn1_NOVALUE, Addr, asn1_NOVALUE, Prof, asn1_NOVALUE). cre_ServiceChangeResParm(Mid, Addr, Ver, Prof, TS) - when ((is_integer(Ver) and (0 =< Ver) and (Ver =< 99)) or - (Ver == asn1_NOVALUE)) and - (is_record(Prof, 'ServiceChangeProfile') or (Prof == asn1_NOVALUE)) and - (is_record(TS, 'TimeNotation') or (TS == asn1_NOVALUE)) -> + when ((is_integer(Ver) and (0 =< Ver) andalso (Ver =< 99)) orelse + (Ver =:= asn1_NOVALUE)) andalso + (is_record(Prof, 'ServiceChangeProfile') orelse (Prof =:= asn1_NOVALUE)) andalso + (is_record(TS, 'TimeNotation') orelse (TS =:= asn1_NOVALUE)) -> F = fun(A) -> - (A == asn1_NOVALUE) orelse + (A =:= asn1_NOVALUE) orelse (is_tuple(A) andalso is_atom(element(1, A))) end, @@ -1638,13 +1647,14 @@ cre_ServiceChangeProfile(N, 1). cre_ServiceChangeProfile(N, V) - when is_list(N) and is_integer(V) and (0 =< V) and (V =< 99) -> + when is_list(N) andalso is_integer(V) andalso (0 =< V) andalso (V =< 99) -> #'ServiceChangeProfile'{profileName = N, version = V}. -cre_PackagesDescriptor([H|_] = D) when record(H, 'PackagesItem') -> +cre_PackagesDescriptor([H|_] = D) when is_record(H, 'PackagesItem') -> D. -cre_PackagesItem(N, Ver) when list(N), integer(Ver), 0 =< Ver, Ver =< 99 -> +cre_PackagesItem(N, Ver) + when is_list(N) andalso is_integer(Ver) andalso (0 =< Ver) andalso (Ver =< 99) -> #'PackagesItem'{packageName = N, packageVersion = Ver}. @@ -1652,10 +1662,10 @@ true = is_StatisticsDescriptor(D), D. -cre_StatisticsParameter(N) when list(N) -> +cre_StatisticsParameter(N) when is_list(N) -> #'StatisticsParameter'{statName = N}. -cre_StatisticsParameter(N, V) when list(N), list(V) -> +cre_StatisticsParameter(N, V) when is_list(N) andalso is_list(V) -> #'StatisticsParameter'{statName = N, statValue = V}. %% cre_NonStandardData({Tag, _} = Id, Data) when atom(Tag), list(Data) -> @@ -1679,10 +1689,10 @@ %% manufacturerCode = MC}. cre_TimeNotation(D, T) - when list(D), length(D) == 8, list(T), length(T) == 8 -> + when is_list(D) andalso (length(D) =:= 8) andalso is_list(T) andalso (length(T) =:= 8) -> #'TimeNotation'{date = D, time = T}. -cre_Value([H|_] = V) when list(H) -> +cre_Value([H|_] = V) when is_list(H) -> V. cre_BOOLEAN(true = B) -> @@ -2962,7 +2972,7 @@ lists:member(D, [bothway, isolate, oneway]). -chk_TopologyRequest(T, T) when record(T,'TopologyRequest') -> +chk_TopologyRequest(T, T) when is_record(T,'TopologyRequest') -> ok; chk_TopologyRequest(#'TopologyRequest'{terminationFrom = F1, terminationTo = T1, @@ -3034,7 +3044,7 @@ wrong_type('AmmRequest_descriptors', Descs). -chk_AmmRequest(R, R) when record(R, 'AmmRequest') -> +chk_AmmRequest(R, R) when is_record(R, 'AmmRequest') -> d("chk_AmmRequest -> entry when equal"), chk_type(fun is_AmmRequest/1, 'AmmRequest', R); chk_AmmRequest(#'AmmRequest'{terminationID = Tids1, @@ -6395,12 +6405,12 @@ %% -- ModemDescriptor -- -is_ModemDescriptor(D) when record(D, 'ModemDescriptor') -> +is_ModemDescriptor(D) when is_record(D, 'ModemDescriptor') -> true; is_ModemDescriptor(_) -> false. -chk_ModemDescriptor(D, D) when record(D, 'ModemDescriptor') -> +chk_ModemDescriptor(D, D) when is_record(D, 'ModemDescriptor') -> ok; chk_ModemDescriptor(#'ModemDescriptor'{mtl = MTL1, mpl = MPL1, @@ -7233,7 +7243,7 @@ end. -is_IA5String(S) when list(S) -> +is_IA5String(S) when is_list(S) -> true; is_IA5String(_) -> false. @@ -7248,7 +7258,7 @@ % wrong_type('IA5String', S1, S2) % end. -is_IA5String(S, _) when list(S) -> +is_IA5String(S, _) when is_list(S) -> true; is_IA5String(_, _) -> false. @@ -7266,16 +7276,16 @@ is_OCTET_STRING(L) -> is_OCTET_STRING(L, any). -is_OCTET_STRING(L, any) when list(L) -> +is_OCTET_STRING(L, any) when is_list(L) -> true; -is_OCTET_STRING(L, {exact, Len}) when list(L), length(L) == Len -> +is_OCTET_STRING(L, {exact, Len}) when is_list(L) andalso (length(L) =:= Len) -> true; -is_OCTET_STRING(L, {atleast, Len}) when list(L), Len =< length(L) -> +is_OCTET_STRING(L, {atleast, Len}) when is_list(L) andalso (Len =< length(L)) -> true; -is_OCTET_STRING(L, {atmost, Len}) when list(L), length(L) =< Len -> +is_OCTET_STRING(L, {atmost, Len}) when is_list(L) andalso (length(L) =< Len) -> true; is_OCTET_STRING(L, {range, Min, Max}) - when list(L), Min =< length(L), length(L) =< Max -> + when is_list(L) andalso (Min =< length(L)) andalso (length(L) =< Max) -> true; is_OCTET_STRING(_, _) -> false. @@ -7328,16 +7338,19 @@ is_opt_INTEGER(I, R) -> is_OPTIONAL(fun(X) -> is_INTEGER(X, R) end, I). -is_INTEGER(I, any) when integer(I) -> +is_INTEGER(I, any) when is_integer(I) -> true; -is_INTEGER(I, {exact, I}) when integer(I) -> +is_INTEGER(I, {exact, I}) when is_integer(I) -> true; -is_INTEGER(I, {atleast, Min}) when integer(I), integer(Min), Min =< I -> +is_INTEGER(I, {atleast, Min}) when is_integer(I) andalso is_integer(Min) andalso (Min =< I) -> true; -is_INTEGER(I, {atmost, Max}) when integer(I), integer(Max), I =< Max -> +is_INTEGER(I, {atmost, Max}) when is_integer(I) andalso is_integer(Max) andalso (I =< Max) -> true; is_INTEGER(I, {range, Min, Max}) - when integer(I), integer(Min), integer(Max), Min =< I, I =< Max -> + when is_integer(I) andalso + is_integer(Min) andalso + is_integer(Max) andalso + (Min =< I) andalso (I =< Max) -> true; is_INTEGER(_, _) -> false. @@ -7363,7 +7376,7 @@ %% ---------------------------------------------------------------------- -to_lower([C|Cs]) when C >= $A, C =< $Z -> +to_lower([C|Cs]) when (C >= $A) andalso (C =< $Z) -> [C+($a-$A)|to_lower(Cs)]; to_lower([C|Cs]) -> [C|to_lower(Cs)]; @@ -7371,7 +7384,7 @@ []. -validate(F, Type) when function(F) -> +validate(F, Type) when is_function(F) -> case (catch F()) of {error, Reason} -> error({Type, Reason}); @@ -7380,7 +7393,7 @@ end. -chk_type(F, T, V) when function(F), atom(T) -> +chk_type(F, T, V) when is_function(F) andalso is_atom(T) -> case F(V) of true -> ok; @@ -7388,7 +7401,7 @@ wrong_type(T, V) end. -chk_type(F, T, V1, V2) when function(F), atom(T) -> +chk_type(F, T, V1, V2) when is_function(F) andalso is_atom(T) -> case F(V1, V2) of true -> ok; @@ -7399,26 +7412,26 @@ is_OPTIONAL(_, asn1_NOVALUE) -> true; -is_OPTIONAL(F, Val) when function(F) -> +is_OPTIONAL(F, Val) when is_function(F) -> F(Val). chk_OPTIONAL(_, asn1_NOVALUE, asn1_NOVALUE, _, _) -> ok; -chk_OPTIONAL(Type, asn1_NOVALUE = V1, V2, IS, _CHK) when function(IS) -> +chk_OPTIONAL(Type, asn1_NOVALUE = V1, V2, IS, _CHK) when is_function(IS) -> case IS(V2) of true -> not_equal(Type, V1, V2); false -> wrong_type(Type, V1, V2) end; -chk_OPTIONAL(Type, V1, asn1_NOVALUE = V2, IS, _CHK) when function(IS) -> +chk_OPTIONAL(Type, V1, asn1_NOVALUE = V2, IS, _CHK) when is_function(IS) -> case IS(V1) of true -> not_equal(Type, V1, V2); false -> wrong_type(Type, V1, V2) end; -chk_OPTIONAL(_Type, V1, V2, _IS, CHK) when function(CHK) -> +chk_OPTIONAL(_Type, V1, V2, _IS, CHK) when is_function(CHK) -> CHK(V1, V2). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_prev3c_lib.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_prev3c_lib.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_prev3c_lib.erl 2009-03-12 12:32:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_prev3c_lib.erl 2009-09-18 15:13:28.000000000 +0100 @@ -257,12 +257,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -cre_MegacoMessage(M) when record(M, 'Message') -> +cre_MegacoMessage(M) when is_record(M, 'Message') -> #'MegacoMessage'{mess = M}. cre_MegacoMessage(AH, M) - when record(AH, 'AuthenticationHeader'), - record(M, 'Message') -> + when is_record(AH, 'AuthenticationHeader') andalso is_record(M, 'Message') -> #'MegacoMessage'{authHeader = AH, mess = M}. @@ -271,39 +270,39 @@ seqNum = SN, ad = AD}. -cre_Message(V, Mid, ED) when record(ED, 'ErrorDescriptor') -> +cre_Message(V, Mid, ED) when is_record(ED, 'ErrorDescriptor') -> Body = {errorDescriptor, ED}, #'Message'{version = V, mId = Mid, messageBody = Body}; -cre_Message(V, Mid, Transactions) when list(Transactions) -> +cre_Message(V, Mid, Transactions) when is_list(Transactions) -> Body = {transactions, Transactions}, #'Message'{version = V, mId = Mid, messageBody = Body}; -cre_Message(V, Mid, {transactions, T} = Body) when list(T) -> +cre_Message(V, Mid, {transactions, T} = Body) when is_list(T) -> #'Message'{version = V, mId = Mid, messageBody = Body}; cre_Message(V, Mid, {errorDescriptor, ED} = Body) - when record(ED, 'ErrorDescriptor') -> + when is_record(ED, 'ErrorDescriptor') -> #'Message'{version = V, mId = Mid, messageBody = Body}. -cre_ErrorDescriptor(EC) when integer(EC) -> +cre_ErrorDescriptor(EC) when is_integer(EC) -> #'ErrorDescriptor'{errorCode = EC}. -cre_ErrorDescriptor(EC, ET) when integer(EC), list(ET) -> +cre_ErrorDescriptor(EC, ET) when is_integer(EC) andalso is_list(ET) -> #'ErrorDescriptor'{errorCode = EC, errorText = ET}. -cre_ErrorCode(C) when integer(C), 0 =< C, C =< 65535 -> +cre_ErrorCode(C) when is_integer(C) andalso (0 =< C) andalso (C =< 65535) -> C; cre_ErrorCode(C) -> exit({invalid_ErrorCode, C}). -cre_ErrorText(T) when list(T) -> +cre_ErrorText(T) when is_list(T) -> T. cre_ContextID(Val) when 0 =< Val, Val =< 4294967295 -> @@ -311,13 +310,13 @@ cre_ContextID(Val) -> exit({invalid_ContextID, Val}). -cre_Transaction(TR) when record(TR, 'TransactionRequest') -> +cre_Transaction(TR) when is_record(TR, 'TransactionRequest') -> {transactionRequest, TR}; -cre_Transaction(TP) when record(TP, 'TransactionPending') -> +cre_Transaction(TP) when is_record(TP, 'TransactionPending') -> {transactionPending, TP}; -cre_Transaction(TR) when record(TR, 'TransactionReply') -> +cre_Transaction(TR) when is_record(TR, 'TransactionReply') -> {transactionReply, TR}; -cre_Transaction(TRA) when list(TRA) -> +cre_Transaction(TRA) when is_list(TRA) -> {transactionResponseAck, TRA}. cre_TransactionId(Val) when 0 =< Val, Val =< 4294967295 -> @@ -325,34 +324,34 @@ cre_TransactionId(Val) -> exit({invalid_TransactionId, Val}). -cre_TransactionRequest(TransID, ARs) when integer(TransID), list(ARs) -> +cre_TransactionRequest(TransID, ARs) when is_integer(TransID) andalso is_list(ARs) -> #'TransactionRequest'{transactionId = TransID, actions = ARs}. -cre_TransactionPending(TransID) when integer(TransID) -> +cre_TransactionPending(TransID) when is_integer(TransID) -> #'TransactionPending'{transactionId = TransID}. cre_TransactionReply(TransID, ED) - when integer(TransID), record(ED, 'ErrorDescriptor') -> + when is_integer(TransID) andalso is_record(ED, 'ErrorDescriptor') -> Res = {transactionError, ED}, #'TransactionReply'{transactionId = TransID, transactionResult = Res}; cre_TransactionReply(TransID, ARs) - when integer(TransID), list(ARs) -> + when is_integer(TransID) andalso is_list(ARs) -> Res = {actionReplies, ARs}, #'TransactionReply'{transactionId = TransID, transactionResult = Res}. cre_TransactionReply(TransID, IAR, ED) - when is_integer(TransID) and - ((IAR == 'NULL') or (IAR == asn1_NOVALUE)) and + when is_integer(TransID) andalso + ((IAR =:= 'NULL') orelse (IAR =:= asn1_NOVALUE)) andalso is_record(ED, 'ErrorDescriptor') -> Res = {transactionError, ED}, #'TransactionReply'{transactionId = TransID, transactionResult = Res}; cre_TransactionReply(TransID, IAR, ARs) - when is_integer(TransID) and - ((IAR == 'NULL') or (IAR == asn1_NOVALUE)) and + when is_integer(TransID) andalso + ((IAR =:= 'NULL') orelse (IAR =:= asn1_NOVALUE)) andalso is_list(ARs) -> Res = {actionReplies, ARs}, #'TransactionReply'{transactionId = TransID, @@ -368,13 +367,13 @@ lastAck = LastAck}. cre_ActionRequest(CtxID, CmdReqs) - when is_integer(CtxID) and is_list(CmdReqs) -> + when is_integer(CtxID) andalso is_list(CmdReqs) -> #'ActionRequest'{contextId = CtxID, commandRequests = CmdReqs}. cre_ActionRequest(CtxID, CtxReq, CmdReqs) - when is_integer(CtxID) and - is_record(CtxReq, 'ContextRequest') and + when is_integer(CtxID) andalso + is_record(CtxReq, 'ContextRequest') andalso is_list(CmdReqs) -> #'ActionRequest'{contextId = CtxID, contextRequest = CtxReq, @@ -400,30 +399,27 @@ commandRequests = CmdReqs}. cre_ActionReply(CtxID, CmdReps) - when integer(CtxID), - list(CmdReps) -> + when is_integer(CtxID) andalso is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, commandReply = CmdReps}. cre_ActionReply(CtxID, ED, CmdReps) - when integer(CtxID), - record(ED, 'ErrorDescriptor'), - list(CmdReps) -> + when is_integer(CtxID) andalso is_record(ED, 'ErrorDescriptor') andalso is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, errorDescriptor = ED, commandReply = CmdReps}; cre_ActionReply(CtxID, CtxReq, CmdReps) - when is_integer(CtxID) and - is_record(CtxReq, 'ContextRequest') and + when is_integer(CtxID) andalso + is_record(CtxReq, 'ContextRequest') andalso is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, contextReply = CtxReq, commandReply = CmdReps}. cre_ActionReply(CtxID, ED, CtxReq, CmdReps) - when is_integer(CtxID) and - (is_record(ED, 'ErrorDescriptor') or (ED == asn1_NOVALUE)) and - (is_record(CtxReq, 'ContextRequest') or (CtxReq == asn1_NOVALUE)) and + when is_integer(CtxID) andalso + (is_record(ED, 'ErrorDescriptor') orelse (ED =:= asn1_NOVALUE)) andalso + (is_record(CtxReq, 'ContextRequest') orelse (CtxReq =:= asn1_NOVALUE)) andalso is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, errorDescriptor = ED, @@ -433,11 +429,11 @@ cre_ContextRequest() -> strip_ContextRequest(#'ContextRequest'{}). -cre_ContextRequest(Prio) when integer(Prio), 0 =< Prio, Prio =< 15 -> +cre_ContextRequest(Prio) when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) -> strip_ContextRequest(#'ContextRequest'{priority = Prio}); -cre_ContextRequest(Em) when Em == true; Em == false; Em == asn1_NOVALUE -> +cre_ContextRequest(Em) when (Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE) -> strip_ContextRequest(#'ContextRequest'{emergency = Em}); -cre_ContextRequest(Top) when list(Top) -> +cre_ContextRequest(Top) when is_list(Top) -> strip_ContextRequest(#'ContextRequest'{topologyReq = Top}). cre_ContextRequest(Prio, Em) @@ -447,7 +443,7 @@ emergency = Em}, strip_ContextRequest(CR); cre_ContextRequest(Prio, Top) - when integer(Prio), 0 =< Prio, Prio =< 15, list(Top) -> + when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) andalso is_list(Top) -> CR = #'ContextRequest'{priority = Prio, topologyReq = Top}, strip_ContextRequest(CR). @@ -752,53 +748,53 @@ wildcardReturn = WR}. cre_Command(addReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(moveReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(modReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(subtractReq = Tag, Req) - when record(Req, 'SubtractRequest') -> + when is_record(Req, 'SubtractRequest') -> {Tag, Req}; cre_Command(auditCapRequest = Tag, Req) - when record(Req, 'AuditRequest') -> + when is_record(Req, 'AuditRequest') -> {Tag, Req}; cre_Command(auditValueRequest = Tag, Req) - when record(Req, 'AuditRequest') -> + when is_record(Req, 'AuditRequest') -> {Tag, Req}; cre_Command(notifyReq = Tag, Req) - when record(Req, 'NotifyRequest') -> + when is_record(Req, 'NotifyRequest') -> {Tag, Req}; cre_Command(serviceChangeReq = Tag, Req) - when record(Req, 'ServiceChangeRequest') -> + when is_record(Req, 'ServiceChangeRequest') -> {Tag, Req}. cre_CommandReply(addReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(moveReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(modReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(subtractReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(auditCapReply = Tag, Rep) - when tuple(Rep) -> + when is_tuple(Rep) -> {Tag, Rep}; cre_CommandReply(auditValueReply = Tag, Rep) - when tuple(Rep) -> + when is_tuple(Rep) -> {Tag, Rep}; cre_CommandReply(notifyReply = Tag, Rep) - when record(Rep, 'NotifyReply') -> + when is_record(Rep, 'NotifyReply') -> {Tag, Rep}; cre_CommandReply(serviceChangeReply = Tag, Rep) - when record(Rep, 'ServiceChangeReply') -> + when is_record(Rep, 'ServiceChangeReply') -> {Tag, Rep}. @@ -861,19 +857,19 @@ error({invalid_AmmRequest, {TermIDs, Descs}}) end. -cre_AmmDescriptor(D) when record(D, 'MediaDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'MediaDescriptor') -> {mediaDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'ModemDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'ModemDescriptor') -> {modemDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'MuxDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'MuxDescriptor') -> {muxDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'EventsDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'EventsDescriptor') -> {eventsDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'DigitMapDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'DigitMapDescriptor') -> {digitMapDescriptor, D}; -cre_AmmDescriptor(D) when record(D, 'AuditDescriptor') -> +cre_AmmDescriptor(D) when is_record(D, 'AuditDescriptor') -> {auditDescriptor, D}; -cre_AmmDescriptor(D) when list(D) -> +cre_AmmDescriptor(D) when is_list(D) -> case is_EventBufferDescriptor(D) of true -> {eventBufferDescriptor, D}; @@ -891,24 +887,24 @@ end end. -cre_AmmsReply(TermIDs) when list(TermIDs) -> +cre_AmmsReply(TermIDs) when is_list(TermIDs) -> #'AmmsReply'{terminationID = TermIDs}. -cre_AmmsReply(TermIDs, TAs) when list(TermIDs), list(TAs) -> +cre_AmmsReply(TermIDs, TAs) when is_list(TermIDs) andalso is_list(TAs) -> #'AmmsReply'{terminationID = TermIDs, terminationAudit = TAs}. -cre_SubtractRequest(TermIDs) when list(TermIDs) -> +cre_SubtractRequest(TermIDs) when is_list(TermIDs) -> #'SubtractRequest'{terminationID = TermIDs}. cre_SubtractRequest(TermIDs, Audit) - when list(TermIDs), record(Audit, 'AuditDescriptor') -> + when is_list(TermIDs) andalso is_record(Audit, 'AuditDescriptor') -> #'SubtractRequest'{terminationID = TermIDs, auditDescriptor = Audit}. cre_AuditRequest(TermID, Audit) - when record(TermID, megaco_term_id), - record(Audit, 'AuditDescriptor') -> + when is_record(TermID, megaco_term_id) andalso + is_record(Audit, 'AuditDescriptor') -> #'AuditRequest'{terminationID = TermID, auditDescriptor = Audit}. @@ -919,22 +915,22 @@ auditDescriptor = Audit, terminationIDList = TIDs}. -cre_AuditReply(TermIDs) when list(TermIDs) -> +cre_AuditReply(TermIDs) when is_list(TermIDs) -> {contextAuditResult, TermIDs}; -cre_AuditReply(ED) when record(ED, 'ErrorDescriptor') -> +cre_AuditReply(ED) when is_record(ED, 'ErrorDescriptor') -> {error, ED}; -cre_AuditReply(Audit) when record(Audit, 'AuditResult') -> +cre_AuditReply(Audit) when is_record(Audit, 'AuditResult') -> {auditResult, Audit}; -cre_AuditReply(ARTL) when record(ARTL, 'TermListAuditResult') -> +cre_AuditReply(ARTL) when is_record(ARTL, 'TermListAuditResult') -> {auditResultTermList, ARTL}. cre_AuditResult(TID, TAs) - when record(TID, megaco_term_id), list(TAs) -> + when is_record(TID, megaco_term_id) andalso is_list(TAs) -> #'AuditResult'{terminationID = TID, terminationAuditResult = TAs}. cre_TermListAuditResult(TIDs, TA) - when is_list(TIDs) and is_list(TA) -> + when is_list(TIDs) andalso is_list(TA) -> #'TermListAuditResult'{terminationIDList = TIDs, terminationAuditResult = TA}. @@ -942,35 +938,35 @@ true = is_TerminationAudit(D), D. -cre_AuditReturnParameter(D) when record(D, 'ErrorDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ErrorDescriptor') -> {errorDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'MediaDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'MediaDescriptor') -> {mediaDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'ModemDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ModemDescriptor') -> {modemDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'MuxDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'MuxDescriptor') -> {muxDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'EventsDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'EventsDescriptor') -> {eventsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'EventSpec') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'EventSpec') -> {eventBufferDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'DigitMapDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'DigitMapDescriptor') -> {digitMapDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'ObservedEventsDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ObservedEventsDescriptor') -> {observedEventsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'StatisticsParameter') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'StatisticsParameter') -> {statisticsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'PackagesItem') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'PackagesItem') -> {packagesDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'AuditDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'AuditDescriptor') -> {emptyDescriptors, D}; -cre_AuditReturnParameter([H|_] = D) when tuple(H) -> +cre_AuditReturnParameter([H|_] = D) when is_tuple(H) -> {signalsDescriptor, D}. cre_AuditDescriptor() -> #'AuditDescriptor'{}. -cre_AuditDescriptor([H|_] = AT) when atom(H) -> +cre_AuditDescriptor([H|_] = AT) when is_atom(H) -> #'AuditDescriptor'{auditToken = AT}; cre_AuditDescriptor(APT) -> #'AuditDescriptor'{auditPropertyToken = APT}. @@ -979,50 +975,50 @@ #'AuditDescriptor'{auditToken = AT, auditPropertyToken = APT}. -cre_IndAuditParameter(D) when record(D, 'IndAudMediaDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudMediaDescriptor') -> {indAudMediaDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudEventsDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudEventsDescriptor') -> {indAudEventsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudEventBufferDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudEventBufferDescriptor') -> {indAudEventBufferDescriptor, D}; cre_IndAuditParameter({signal, _} = D) -> {indAudSignalsDescriptor, D}; cre_IndAuditParameter({seqSigList, _} = D) -> {indAudSignalsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudDigitMapDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudDigitMapDescriptor') -> {indAudDigitMapDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudStatisticsDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudStatisticsDescriptor') -> {indAudStatisticsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudPackagesDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudPackagesDescriptor') -> {indAudPackagesDescriptor, D}. cre_IndAudMediaDescriptor() -> #'IndAudMediaDescriptor'{}. cre_IndAudMediaDescriptor(TSD) - when record(TSD, 'IndAudTerminationStateDescriptor') -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') -> #'IndAudMediaDescriptor'{termStateDescr = TSD}; -cre_IndAudMediaDescriptor(Parms) when record(Parms, 'IndAudStreamParms') -> +cre_IndAudMediaDescriptor(Parms) when is_record(Parms, 'IndAudStreamParms') -> Streams = {oneStream, Parms}, #'IndAudMediaDescriptor'{streams = Streams}; -cre_IndAudMediaDescriptor(Descs) when list(Descs) -> +cre_IndAudMediaDescriptor(Descs) when is_list(Descs) -> Streams = {multiStream, Descs}, #'IndAudMediaDescriptor'{streams = Streams}. cre_IndAudMediaDescriptor(TSD, Parms) - when record(TSD, 'IndAudTerminationStateDescriptor'), - record(Parms, 'IndAudStreamParms') -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso + is_record(Parms, 'IndAudStreamParms') -> Streams = {oneStream, Parms}, #'IndAudMediaDescriptor'{termStateDescr = TSD, streams = Streams}; cre_IndAudMediaDescriptor(TSD, Descs) - when record(TSD, 'IndAudTerminationStateDescriptor'), list(Descs) -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso is_list(Descs) -> Streams = {multiStream, Descs}, #'IndAudMediaDescriptor'{termStateDescr = TSD, streams = Streams}. cre_IndAudStreamDescriptor(SID, Parms) - when integer(SID), record(Parms, 'IndAudStreamParms') -> + when is_integer(SID) andalso is_record(Parms, 'IndAudStreamParms') -> #'IndAudStreamDescriptor'{streamID = SID, streamParms = Parms}; cre_IndAudStreamDescriptor(SID, Parms) -> @@ -1031,24 +1027,24 @@ cre_IndAudStreamParms() -> #'IndAudStreamParms'{}. -cre_IndAudStreamParms(LCD) when record(LCD, 'IndAudLocalControlDescriptor') -> +cre_IndAudStreamParms(LCD) when is_record(LCD, 'IndAudLocalControlDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LCD}; -cre_IndAudStreamParms(SD) when record(SD, 'IndAudStatisticsDescriptor') -> +cre_IndAudStreamParms(SD) when is_record(SD, 'IndAudStatisticsDescriptor') -> #'IndAudStreamParms'{statisticsDescriptor = SD}. cre_IndAudStreamParms(LC, L, R) - when record(LC, 'IndAudLocalControlDescriptor'), - record(L, 'IndAudLocalRemoteDescriptor'), - record(R, 'IndAudLocalRemoteDescriptor') -> + when is_record(LC, 'IndAudLocalControlDescriptor') andalso + is_record(L, 'IndAudLocalRemoteDescriptor') andalso + is_record(R, 'IndAudLocalRemoteDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LC, localDescriptor = L, remoteDescriptor = R}. cre_IndAudStreamParms(LC, L, R, S) - when record(LC, 'IndAudLocalControlDescriptor'), - record(L, 'IndAudLocalRemoteDescriptor'), - record(R, 'IndAudLocalRemoteDescriptor'), - record(S, 'IndAudStatisticsDescriptor') -> + when is_record(LC, 'IndAudLocalControlDescriptor') andalso + is_record(L, 'IndAudLocalRemoteDescriptor') andalso + is_record(R, 'IndAudLocalRemoteDescriptor') andalso + is_record(S, 'IndAudStatisticsDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LC, localDescriptor = L, remoteDescriptor = R, @@ -1097,32 +1093,32 @@ error({invalid_IndAudLocalControlDescriptor, SMS}) end. -cre_IndAudPropertyParm(PkgdName) when list(PkgdName) -> +cre_IndAudPropertyParm(PkgdName) when is_list(PkgdName) -> #'IndAudPropertyParm'{name = PkgdName}. cre_IndAudPropertyParm(PkgdName, PP) - when is_list(PkgdName) and is_record(PP, 'PropertyParm') -> + when is_list(PkgdName) andalso is_record(PP, 'PropertyParm') -> #'IndAudPropertyParm'{name = PkgdName, propertyParms = PP}. cre_IndAudLocalRemoteDescriptor(Grps) - when list(Grps) -> + when is_list(Grps) -> #'IndAudLocalRemoteDescriptor'{propGrps = Grps}. cre_IndAudLocalRemoteDescriptor(GID, Grps) - when is_integer(GID) and (0 =< GID) and (GID =< 65535) and is_list(Grps) -> + when is_integer(GID) andalso (0 =< GID) andalso (GID =< 65535) andalso is_list(Grps) -> #'IndAudLocalRemoteDescriptor'{propGroupID = GID, propGrps = Grps}. cre_IndAudPropertyGroup([]) -> []; cre_IndAudPropertyGroup([H|_] = PG) - when record(H, 'IndAudPropertyParm') -> + when is_record(H, 'IndAudPropertyParm') -> PG. cre_IndAudTerminationStateDescriptor([] = PP) -> #'IndAudTerminationStateDescriptor'{propertyParms = PP}; cre_IndAudTerminationStateDescriptor([H|_] = PP) - when record(H, 'IndAudPropertyParm') -> + when is_record(H, 'IndAudPropertyParm') -> #'IndAudTerminationStateDescriptor'{propertyParms = PP}. cre_IndAudTerminationStateDescriptor([] = PP, EBC, SS) @@ -1132,20 +1128,20 @@ eventBufferControl = EBC, serviceState = SS}; cre_IndAudTerminationStateDescriptor([H|_] = PP, EBC, SS) - when is_record(H, 'IndAudPropertyParm') and - ((EBC == 'NULL') or (EBC == asn1_NOVALUE)) and - ((SS == 'NULL') or (SS == asn1_NOVALUE)) -> + when is_record(H, 'IndAudPropertyParm') andalso + ((EBC =:= 'NULL') orelse (EBC =:= asn1_NOVALUE)) andalso + ((SS =:= 'NULL') orelse (SS =:= asn1_NOVALUE)) -> #'IndAudTerminationStateDescriptor'{propertyParms = PP, eventBufferControl = EBC, serviceState = SS}. cre_IndAudTerminationStateDescriptor(PP, EBC, SS, SSS) - when (SS == 'NULL') and - ((is_atom(SSS) and (SSS =/= asn1_NOVALUE))) -> + when (SS =:= 'NULL') andalso + ((is_atom(SSS) andalso (SSS =/= asn1_NOVALUE))) -> error({invalid_IndAudTerminationStateDescriptor, [PP, EBC, SS, SSS]}); cre_IndAudTerminationStateDescriptor([] = PP, EBC, SS, SSS) - when ((EBC == 'NULL') or (EBC == asn1_NOVALUE)) and - ((SS == 'NULL') or (SS == asn1_NOVALUE)) and + when ((EBC =:= 'NULL') orelse (EBC =:= asn1_NOVALUE)) andalso + ((SS =:= 'NULL') orelse (SS =:= asn1_NOVALUE)) andalso is_atom(SSS) -> #'IndAudTerminationStateDescriptor'{propertyParms = PP, eventBufferControl = EBC, @@ -1153,8 +1149,8 @@ serviceStateSel = SSS}; cre_IndAudTerminationStateDescriptor([H|_] = PP, EBC, SS, SSS) when is_record(H, 'IndAudPropertyParm') and - ((EBC == 'NULL') or (EBC == asn1_NOVALUE)) and - ((SS == 'NULL') or (SS == asn1_NOVALUE)) and + ((EBC =:= 'NULL') orelse (EBC =:= asn1_NOVALUE)) andalso + ((SS =:= 'NULL') orelse (SS =:= asn1_NOVALUE)) andalso is_atom(SSS) -> #'IndAudTerminationStateDescriptor'{propertyParms = PP, eventBufferControl = EBC, @@ -1162,111 +1158,106 @@ serviceStateSel = SSS}. cre_IndAudEventsDescriptor(PkgdName) - when list(PkgdName) -> + when is_list(PkgdName) -> #'IndAudEventsDescriptor'{pkgdName = PkgdName}. cre_IndAudEventsDescriptor(RID, PkgdName) - when integer(RID), list(PkgdName) -> + when is_integer(RID) andalso is_list(PkgdName) -> #'IndAudEventsDescriptor'{requestID = RID, pkgdName = PkgdName}; cre_IndAudEventsDescriptor(PkgdName, SID) - when list(PkgdName), integer(SID) -> + when is_list(PkgdName) andalso is_integer(SID) -> #'IndAudEventsDescriptor'{pkgdName = PkgdName, streamID = SID}. cre_IndAudEventsDescriptor(RID, PkgdName, SID) - when integer(RID), list(PkgdName), integer(SID) -> + when is_integer(RID) andalso is_list(PkgdName) andalso is_integer(SID) -> #'IndAudEventsDescriptor'{requestID = RID, pkgdName = PkgdName, streamID = SID}. -cre_IndAudEventBufferDescriptor(EventName) when list(EventName) -> +cre_IndAudEventBufferDescriptor(EventName) when is_list(EventName) -> #'IndAudEventBufferDescriptor'{eventName = EventName}. cre_IndAudEventBufferDescriptor(EventName, SID) - when list(EventName), integer(SID) -> + when is_list(EventName) andalso is_integer(SID) -> #'IndAudEventBufferDescriptor'{eventName = EventName, streamID = SID}. -cre_IndAudSignalsDescriptor(S) when record(S, 'IndAudSignal') -> +cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSignal') -> {signal, S}; -cre_IndAudSignalsDescriptor(S) when record(S, 'IndAudSeqSigList') -> +cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSeqSigList') -> {seqSigList, S}. -cre_IndAudSeqSigList(ID) when integer(ID), 0=< ID, ID =< 65535 -> +cre_IndAudSeqSigList(ID) when is_integer(ID) andalso (0=< ID) andalso (ID =< 65535) -> #'IndAudSeqSigList'{id = ID}. cre_IndAudSeqSigList(ID, S) - when integer(ID), 0=< ID, ID =< 65535, - record(S, 'IndAudSignal') -> + when is_integer(ID) andalso (0=< ID) andalso (ID =< 65535) andalso is_record(S, 'IndAudSignal') -> #'IndAudSeqSigList'{id = ID, signalList = S}. -cre_IndAudSignal(SigName) when list(SigName) -> +cre_IndAudSignal(SigName) when is_list(SigName) -> #'IndAudSignal'{signalName = SigName}. cre_IndAudSignal(SigName, RID) - when is_list(SigName) and is_integer(RID) -> + when is_list(SigName) andalso is_integer(RID) -> #'IndAudSignal'{signalName = SigName, signalRequestID = RID}. cre_IndAudDigitMapDescriptor() -> #'IndAudDigitMapDescriptor'{}. -cre_IndAudDigitMapDescriptor(DMN) when list(DMN) -> +cre_IndAudDigitMapDescriptor(DMN) when is_list(DMN) -> #'IndAudDigitMapDescriptor'{digitMapName = DMN}. -cre_IndAudStatisticsDescriptor(StatName) when list(StatName) -> +cre_IndAudStatisticsDescriptor(StatName) when is_list(StatName) -> #'IndAudStatisticsDescriptor'{statName = StatName}. cre_IndAudPackagesDescriptor(N, V) - when list(N), - integer(V), 0 =< V, V =< 99 -> + when is_list(N) andalso is_integer(V) andalso (0 =< V) andalso (V =< 99) -> #'IndAudPackagesDescriptor'{packageName = N, packageVersion = V}. cre_NotifyRequest(TermIDs, D) - when list(TermIDs), record(D, 'ObservedEventsDescriptor') -> + when is_list(TermIDs) andalso is_record(D, 'ObservedEventsDescriptor') -> #'NotifyRequest'{terminationID = TermIDs, observedEventsDescriptor = D}. cre_NotifyRequest(TermIDs, D, ED) - when list(TermIDs), - record(D, 'ObservedEventsDescriptor'), - record(ED, 'ErrorDescriptor') -> + when is_list(TermIDs) andalso is_record(D, 'ObservedEventsDescriptor') andalso is_record(ED, 'ErrorDescriptor') -> #'NotifyRequest'{terminationID = TermIDs, observedEventsDescriptor = D, errorDescriptor = ED}. -cre_NotifyReply(TermIDs) when list(TermIDs) -> +cre_NotifyReply(TermIDs) when is_list(TermIDs) -> #'NotifyReply'{terminationID = TermIDs}. cre_NotifyReply(TermIDs, ED) - when list(TermIDs), - record(ED, 'ErrorDescriptor') -> + when is_list(TermIDs) andalso is_record(ED, 'ErrorDescriptor') -> #'NotifyReply'{terminationID = TermIDs, errorDescriptor = ED}. cre_ObservedEventsDescriptor(RID, [H|_] = L) - when integer(RID), record(H, 'ObservedEvent') -> + when is_integer(RID) andalso is_record(H, 'ObservedEvent') -> #'ObservedEventsDescriptor'{requestId = RID, observedEventLst = L}. -cre_ObservedEvent(EN, EPL) when list(EN), list(EPL) -> +cre_ObservedEvent(EN, EPL) when is_list(EN) andalso is_list(EPL) -> #'ObservedEvent'{eventName = EN, eventParList = EPL}; -cre_ObservedEvent(EN, TN) when list(EN), record(TN, 'TimeNotation') -> +cre_ObservedEvent(EN, TN) when is_list(EN) andalso is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, timeNotation = TN}. -cre_ObservedEvent(EN, SID, EPL) when list(EN), integer(SID), list(EPL) -> +cre_ObservedEvent(EN, SID, EPL) when is_list(EN) andalso is_integer(SID) andalso is_list(EPL) -> #'ObservedEvent'{eventName = EN, streamID = SID, eventParList = EPL}; cre_ObservedEvent(EN, EPL, TN) - when list(EN), list(EPL), record(TN, 'TimeNotation') -> + when is_list(EN) andalso is_list(EPL) andalso is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, eventParList = EPL, timeNotation = TN}. cre_ObservedEvent(EN, SID, EPL, TN) - when list(EN), integer(SID), list(EPL), record(TN, 'TimeNotation') -> + when is_list(EN) andalso is_integer(SID) andalso is_list(EPL) andalso is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, streamID = SID, eventParList = EPL, @@ -1275,93 +1266,91 @@ cre_EventName(N) when is_list(N) -> N. -cre_EventParameter(N, V) when list(N), list(V) -> +cre_EventParameter(N, V) when is_list(N) andalso is_list(V) -> #'EventParameter'{eventParameterName = N, value = V}. cre_EventParameter(N, V, relation = Tag, R) - when list(N), list(V), atom(R) -> + when is_list(N) andalso is_list(V) andalso is_atom(R) -> EI = {Tag, R}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}; cre_EventParameter(N, V, range = Tag, B) - when list(N), list(V), atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}; cre_EventParameter(N, V, sublist = Tag, B) - when list(N), list(V), atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}. cre_ServiceChangeRequest(TermIDs, SCP) - when list(TermIDs), - record(SCP, 'ServiceChangeParm') -> + when is_list(TermIDs) andalso is_record(SCP, 'ServiceChangeParm') -> #'ServiceChangeRequest'{terminationID = TermIDs, serviceChangeParms = SCP}. cre_ServiceChangeReply(TermIDs, {Tag, R} = SCR) - when list(TermIDs), atom(Tag), tuple(R) -> + when is_list(TermIDs) andalso is_atom(Tag) andalso is_tuple(R) -> #'ServiceChangeReply'{terminationID = TermIDs, serviceChangeResult = SCR}. -cre_ServiceChangeResult(ED) when record(ED, 'ErrorDescriptor') -> +cre_ServiceChangeResult(ED) when is_record(ED, 'ErrorDescriptor') -> {errorDescriptor, ED}; -cre_ServiceChangeResult(SCRP) when record(SCRP, 'ServiceChangeResParm') -> +cre_ServiceChangeResult(SCRP) when is_record(SCRP, 'ServiceChangeResParm') -> {serviceChangeResParms, SCRP}. %% cre_WildcardField(L) when list(L), length(L) == 1 -> L. cre_TerminationID(W, ID) - when list(W), - list(ID), 1 =< length(ID), length(ID) =< 8 -> + when is_list(W) andalso is_list(ID) andalso (1 =< length(ID)) andalso (length(ID) =< 8) -> #'TerminationID'{wildcard = W, id = ID}. -cre_TerminationIDList(L) when list(L) -> +cre_TerminationIDList(L) when is_list(L) -> L. cre_MediaDescriptor() -> #'MediaDescriptor'{}. -cre_MediaDescriptor(TSD) when record(TSD, 'TerminationStateDescriptor') -> +cre_MediaDescriptor(TSD) when is_record(TSD, 'TerminationStateDescriptor') -> #'MediaDescriptor'{termStateDescr = TSD}; -cre_MediaDescriptor(SP) when record(SP, 'StreamParms') -> +cre_MediaDescriptor(SP) when is_record(SP, 'StreamParms') -> Streams = {oneStream, SP}, #'MediaDescriptor'{streams = Streams}; -cre_MediaDescriptor([H|_] = SDs) when record(H, 'StreamDescriptor') -> +cre_MediaDescriptor([H|_] = SDs) when is_record(H, 'StreamDescriptor') -> Streams = {multiStream, SDs}, #'MediaDescriptor'{streams = Streams}. cre_MediaDescriptor(TSD, SP) - when record(TSD, 'TerminationStateDescriptor'), - record(SP, 'StreamParms') -> + when is_record(TSD, 'TerminationStateDescriptor') andalso + is_record(SP, 'StreamParms') -> Streams = {oneStream, SP}, #'MediaDescriptor'{termStateDescr = TSD, streams = Streams}; cre_MediaDescriptor(TSD, [H|_] = SDs) - when record(TSD, 'TerminationStateDescriptor'), - record(H, 'StreamDescriptor') -> + when is_record(TSD, 'TerminationStateDescriptor') andalso + is_record(H, 'StreamDescriptor') -> Streams = {multiStream, SDs}, #'MediaDescriptor'{termStateDescr = TSD, streams = Streams}. -cre_StreamDescriptor(SID, SP) when integer(SID), record(SP, 'StreamParms') -> +cre_StreamDescriptor(SID, SP) when is_integer(SID) andalso is_record(SP, 'StreamParms') -> #'StreamDescriptor'{streamID = SID, streamParms = SP}. cre_StreamParms() -> #'StreamParms'{}. -cre_StreamParms(LCD) when record(LCD, 'LocalControlDescriptor') -> +cre_StreamParms(LCD) when is_record(LCD, 'LocalControlDescriptor') -> #'StreamParms'{localControlDescriptor = LCD}; -cre_StreamParms(LD) when record(LD, 'LocalRemoteDescriptor') -> +cre_StreamParms(LD) when is_record(LD, 'LocalRemoteDescriptor') -> #'StreamParms'{localDescriptor = LD}; -cre_StreamParms(SD) when list(SD) -> +cre_StreamParms(SD) when is_list(SD) -> #'StreamParms'{statisticsDescriptor = SD}. cre_StreamParms(LCD, LD) @@ -1395,20 +1384,20 @@ remoteDescriptor = RD, statisticsDescriptor = SD}. -cre_LocalControlDescriptor(SM) when atom(SM) -> +cre_LocalControlDescriptor(SM) when is_atom(SM) -> #'LocalControlDescriptor'{streamMode = SM, propertyParms = []}; -cre_LocalControlDescriptor([H|_] = PP) when record(H, 'PropertyParm') -> +cre_LocalControlDescriptor([H|_] = PP) when is_record(H, 'PropertyParm') -> #'LocalControlDescriptor'{propertyParms = PP}. cre_LocalControlDescriptor(SM, [H|_] = PP) - when atom(SM), record(H, 'PropertyParm') -> + when is_atom(SM) andalso is_record(H, 'PropertyParm') -> #'LocalControlDescriptor'{streamMode = SM, propertyParms = PP}. cre_LocalControlDescriptor(SM, RV, RG, [H|_] = PP) - when is_atom(SM) and - ((RV == true) or (RV == false) or (RV == asn1_NOVALUE)) and - ((RG == true) or (RG == false) or (RG == asn1_NOVALUE)) and + when is_atom(SM) andalso + ((RV =:= true) orelse (RV =:= false) orelse (RV =:= asn1_NOVALUE)) andalso + ((RG =:= true) orelse (RG =:= false) orelse (RG =:= asn1_NOVALUE)) andalso is_record(H, 'PropertyParm') -> #'LocalControlDescriptor'{streamMode = SM, reserveValue = RV, @@ -1426,24 +1415,24 @@ cre_StreamMode(loopBack = M) -> M. -cre_PropertyParm(N, [H|_] = V) when list(N), list(H) -> +cre_PropertyParm(N, [H|_] = V) when is_list(N) andalso is_list(H) -> #'PropertyParm'{name = N, value = V}. cre_PropertyParm(N, [H|_] = V, relation = Tag, R) - when list(N), list(H), atom(R) -> + when is_list(N) andalso is_list(H) andalso is_atom(R) -> EI = {Tag, R}, #'PropertyParm'{name = N, value = V, extraInfo = EI}; cre_PropertyParm(N, [H|_] = V, range = Tag, B) - when list(N), list(H), atom(B) -> + when is_list(N) andalso is_list(H) andalso is_atom(B) -> EI = {Tag, B}, #'PropertyParm'{name = N, value = V, extraInfo = EI}; cre_PropertyParm(N, [H|_] = V, sublist = Tag, B) - when list(N), list(H), atom(B) -> + when is_list(N) andalso is_list(H) andalso is_atom(B) -> EI = {Tag, B}, #'PropertyParm'{name = N, value = V, extraInfo = EI}. -cre_Name(N) when is_list(N) and (length(N) == 2) -> +cre_Name(N) when is_list(N) andalso (length(N) == 2) -> N. cre_PkgdName(N) when is_list(N) -> @@ -1456,11 +1445,11 @@ cre_PkgdName(root, root) -> "*/*"; cre_PkgdName(PackageName, root) - when is_list(PackageName) and (length(PackageName) =< 64) -> + when is_list(PackageName) andalso (length(PackageName) =< 64) -> PackageName ++ "/*"; cre_PkgdName(PackageName, ItemID) - when ((is_list(PackageName) and (length(PackageName) =< 64)) and - (is_list(ItemID) and (length(ItemID) =< 64))) -> + when ((is_list(PackageName) andalso (length(PackageName) =< 64)) andalso + (is_list(ItemID) andalso (length(ItemID) =< 64))) -> PackageName ++ "/" ++ ItemID; cre_PkgdName(PackageName, ItemID) -> error({invalid_PkgdName, {PackageName, ItemID}}). @@ -1472,40 +1461,40 @@ cre_Relation(unequalTo = R) -> R. -cre_LocalRemoteDescriptor([H|_] = PGs) when list(H) -> +cre_LocalRemoteDescriptor([H|_] = PGs) when is_list(H) -> #'LocalRemoteDescriptor'{propGrps = PGs}. -cre_PropertyGroup([H|_] = PG) when record(H, 'PropertyParm') -> +cre_PropertyGroup([H|_] = PG) when is_record(H, 'PropertyParm') -> PG. -cre_TerminationStateDescriptor([H|_] = PPs) when record(H, 'PropertyParm') -> +cre_TerminationStateDescriptor([H|_] = PPs) when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs}. cre_TerminationStateDescriptor([H|_] = PPs, off = EBC) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, eventBufferControl = EBC}; cre_TerminationStateDescriptor([H|_] = PPs, lockStep = EBC) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, eventBufferControl = EBC}; cre_TerminationStateDescriptor([H|_] = PPs, test = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}; cre_TerminationStateDescriptor([H|_] = PPs, outOfSvc = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}; cre_TerminationStateDescriptor([H|_] = PPs, inSvc = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}. cre_TerminationStateDescriptor([H|_] = PPs, EMC, SS) - when record(H, 'PropertyParm'), - ((EMC == off) or (EMC == lockStep)) and - ((SS == test) or (SS == outOfSvc) or (SS == inSvc)) -> + when is_record(H, 'PropertyParm') andalso + ((EMC =:= off) orelse (EMC =:= lockStep)) andalso + ((SS =:= test) orelse (SS =:= outOfSvc) orelse (SS =:= inSvc)) -> #'TerminationStateDescriptor'{propertyParms = PPs, eventBufferControl = EMC, serviceState = SS}. @@ -1523,7 +1512,7 @@ SS. cre_MuxDescriptor(MT, [H|_] = TL) - when atom(MT), record(H, 'TerminationID') -> + when is_atom(MT) andalso is_record(H, 'TerminationID') -> #'MuxDescriptor'{muxType = MT, termList = TL}. %% cre_MuxDescriptor(MT, [H|_] = TL, NSD) @@ -1551,18 +1540,18 @@ #'EventsDescriptor'{eventList = []}. cre_EventsDescriptor(RID, [H|_] = EL) - when integer(RID), record(H, 'RequestedEvent') -> + when is_integer(RID) andalso is_record(H, 'RequestedEvent') -> #'EventsDescriptor'{requestID = RID, eventList = EL}. cre_RequestedEvent(N) -> #'RequestedEvent'{pkgdName = N}. cre_RequestedEvent(N, EPL) - when is_list(N) and is_list(EPL) -> + when is_list(N) andalso is_list(EPL) -> #'RequestedEvent'{pkgdName = N, evParList = EPL}; cre_RequestedEvent(N, EA) - when is_list(N) and is_record(EA, 'RequestedActions')-> + when is_list(N) andalso is_record(EA, 'RequestedActions')-> #'RequestedEvent'{pkgdName = N, eventAction = EA}. @@ -1660,43 +1649,43 @@ notifyBehaviour = NB, resetEventsDescriptor = RED}. -cre_EventDM(N) when list(N) -> +cre_EventDM(N) when is_list(N) -> {digitMapName, N}; -cre_EventDM(V) when record(V, 'DigitMapValue') -> +cre_EventDM(V) when is_record(V, 'DigitMapValue') -> {digitMapValue, V}. cre_SecondEventsDescriptor([H|_] = EL) - when record(H, 'SecondRequestedEvent') -> + when is_record(H, 'SecondRequestedEvent') -> #'SecondEventsDescriptor'{eventList = EL}. cre_SecondEventsDescriptor(RID, [H|_] = EL) - when integer(RID), record(H, 'SecondRequestedEvent') -> + when is_integer(RID) andalso is_record(H, 'SecondRequestedEvent') -> #'SecondEventsDescriptor'{requestID = RID, eventList = EL}. cre_SecondRequestedEvent(N, EPL) - when is_list(N) and is_list(EPL) -> + when is_list(N) andalso is_list(EPL) -> #'SecondRequestedEvent'{pkgdName = N, evParList = EPL}; cre_SecondRequestedEvent(N, EPL) -> error({invalid_SecondRequestedEvent, [N, EPL]}). cre_SecondRequestedEvent(N, SID, EPL) - when is_list(N) and is_integer(SID) and is_list(EPL) -> + when is_list(N) andalso is_integer(SID) andalso is_list(EPL) -> #'SecondRequestedEvent'{pkgdName = N, streamID = SID, evParList = EPL}; cre_SecondRequestedEvent(N, EA, EPL) - when is_list(N) and - is_record(EA, 'SecondRequestedActions') and + when is_list(N) andalso + is_record(EA, 'SecondRequestedActions') andalso is_list(EPL) -> #'SecondRequestedEvent'{pkgdName = N, eventAction = EA, evParList = EPL}. cre_SecondRequestedEvent(N, SID, EA, EPL) - when is_list(N) and - is_integer(SID) and - is_record(EA, 'SecondRequestedActions') and + when is_list(N) andalso + is_integer(SID) andalso + is_record(EA, 'SecondRequestedActions') andalso is_list(EPL) -> #'SecondRequestedEvent'{pkgdName = N, streamID = SID, @@ -1709,9 +1698,9 @@ cre_SecondRequestedActions(KA) when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) -> #'SecondRequestedActions'{keepActive = KA}; -cre_SecondRequestedActions(SD) when list(SD) -> +cre_SecondRequestedActions(SD) when is_list(SD) -> #'SecondRequestedActions'{signalsDescriptor = SD}; -cre_SecondRequestedActions({Tag, _} = Val) when atom(Tag) -> +cre_SecondRequestedActions({Tag, _} = Val) when is_atom(Tag) -> case is_EventDM(Val) of true -> #'SecondRequestedActions'{eventDM = Val}; @@ -1785,14 +1774,14 @@ notifyBehaviour = NB, resetEventsDescriptor = RED}. -cre_EventBufferDescriptor([H|_] = D) when record(H, 'EventSpec') -> +cre_EventBufferDescriptor([H|_] = D) when is_record(H, 'EventSpec') -> D. -cre_EventSpec(N, [H|_] = EPL) when list(N), record(H, 'EventParameter') -> +cre_EventSpec(N, [H|_] = EPL) when is_list(N) andalso is_record(H, 'EventParameter') -> #'EventSpec'{eventName = N, eventParList = EPL}. cre_EventSpec(N, SID, [H|_] = EPL) - when list(N), integer(SID), record(H, 'EventParameter') -> + when is_list(N) andalso is_integer(SID) andalso is_record(H, 'EventParameter') -> #'EventSpec'{eventName = N, streamID = SID, eventParList = EPL}. cre_SignalsDescriptor(D) -> @@ -1803,19 +1792,19 @@ error({invalid_SignalsDescriptor, D}) end. -cre_SignalRequest(S) when record(S, 'Signal') -> +cre_SignalRequest(S) when is_record(S, 'Signal') -> {signal, S}; -cre_SignalRequest(S) when record(S, 'SeqSigList') -> +cre_SignalRequest(S) when is_record(S, 'SeqSigList') -> {seqSigList, S}. cre_SeqSigList(ID, [H|_] = SL) - when integer(ID), 0 =< ID, ID =< 65535, record(H, 'Signal') -> + when is_integer(ID) andalso (0 =< ID) andalso (ID =< 65535) andalso is_record(H, 'Signal') -> #'SeqSigList'{id = ID, signalList = SL}. -cre_Signal(N) when list(N) -> +cre_Signal(N) when is_list(N) -> #'Signal'{signalName = N}. -cre_Signal(N, SPL) when list(N), list(SPL) -> +cre_Signal(N, SPL) when is_list(N) andalso is_list(SPL) -> #'Signal'{signalName = N, sigParList = SPL}. @@ -1902,7 +1891,7 @@ cre_SignalName(N) -> cre_PkgdName(N). -cre_NotifyCompletion(L) when list(L) -> +cre_NotifyCompletion(L) when is_list(L) -> Vals = [onTimeOut, onInterruptByEvent, onInterruptByNewSignalDescr, otherReason], F = fun(E) -> case lists:member(E, Vals) of @@ -1915,7 +1904,7 @@ lists:foreach(F, L), L. -cre_SigParameter(N, V) when list(N), list(V) -> +cre_SigParameter(N, V) when is_list(N) andalso is_list(V) -> #'SigParameter'{sigParameterName = N, value = V}. cre_SigParameter(N, V, relation = Tag, R) @@ -1936,7 +1925,7 @@ cre_RequestID(Val) -> exit({invalid_RequestID, Val}). -cre_ModemDescriptor(MTL, MPL) when list(MTL), list(MPL) -> +cre_ModemDescriptor(MTL, MPL) when is_list(MTL) andalso is_list(MPL) -> #'ModemDescriptor'{mtl = MTL, mpl = MPL}. %% cre_ModemDescriptor(MTL, MPL, NSD) @@ -1965,18 +1954,18 @@ cre_DigitMapDescriptor() -> #'DigitMapDescriptor'{}. -cre_DigitMapDescriptor(N) when list(N) -> +cre_DigitMapDescriptor(N) when is_list(N) -> #'DigitMapDescriptor'{digitMapName = N}; -cre_DigitMapDescriptor(V) when record(V, 'DigitMapValue') -> +cre_DigitMapDescriptor(V) when is_record(V, 'DigitMapValue') -> #'DigitMapDescriptor'{digitMapValue = V}. -cre_DigitMapDescriptor(N, V) when list(N), record(V, 'DigitMapValue') -> +cre_DigitMapDescriptor(N, V) when is_list(N) andalso is_record(V, 'DigitMapValue') -> #'DigitMapDescriptor'{digitMapName = N, digitMapValue = V}. cre_DigitMapName(N) -> cre_Name(N). -cre_DigitMapValue(DMB) when list(DMB) -> +cre_DigitMapValue(DMB) when is_list(DMB) -> #'DigitMapValue'{digitMapBody = DMB}. cre_DigitMapValue(Start, Short, Long, DMB) -> @@ -1998,7 +1987,7 @@ digitMapBody = DMB, durationTimer = Dur}. -cre_ServiceChangeParm(M, R) when atom(M), list(R) -> +cre_ServiceChangeParm(M, R) when is_atom(M) andalso is_list(R) -> #'ServiceChangeParm'{serviceChangeMethod = M, serviceChangeReason = R}. @@ -2044,17 +2033,17 @@ end. cre_ServiceChangeAddress(portNumber = Tag, P) - when integer(P), 0 =< P, P =< 65535 -> + when is_integer(P) andalso (0 =< P) andalso (P =< 65535) -> {Tag, P}; -cre_ServiceChangeAddress(ip4Address = Tag, A) when record(A, 'IP4Address') -> +cre_ServiceChangeAddress(ip4Address = Tag, A) when is_record(A, 'IP4Address') -> {Tag, A}; -cre_ServiceChangeAddress(ip6Address = Tag, A) when record(A, 'IP6Address') -> +cre_ServiceChangeAddress(ip6Address = Tag, A) when is_record(A, 'IP6Address') -> {Tag, A}; -cre_ServiceChangeAddress(domainName = Tag, N) when record(N, 'DomainName') -> +cre_ServiceChangeAddress(domainName = Tag, N) when is_record(N, 'DomainName') -> {Tag, N}; -cre_ServiceChangeAddress(deviceName = Tag, N) when list(N) -> +cre_ServiceChangeAddress(deviceName = Tag, N) when is_list(N) -> {Tag, N}; -cre_ServiceChangeAddress(mtpAddress = Tag, A) when list(A) -> +cre_ServiceChangeAddress(mtpAddress = Tag, A) when is_list(A) -> {Tag, A}. cre_ServiceChangeResParm() -> @@ -2063,10 +2052,10 @@ cre_ServiceChangeResParm(asn1_NOVALUE, Addr, asn1_NOVALUE, Prof, asn1_NOVALUE). cre_ServiceChangeResParm(Mid, Addr, Ver, Prof, TS) - when ((is_integer(Ver) and (0 =< Ver) and (Ver =< 99)) or - (Ver == asn1_NOVALUE)) and - (is_record(Prof, 'ServiceChangeProfile') or (Prof == asn1_NOVALUE)) and - (is_record(TS, 'TimeNotation') or (TS == asn1_NOVALUE)) -> + when ((is_integer(Ver) andalso (0 =< Ver) andalso (Ver =< 99)) orelse + (Ver =:= asn1_NOVALUE)) andalso + (is_record(Prof, 'ServiceChangeProfile') orelse (Prof =:= asn1_NOVALUE)) andalso + (is_record(TS, 'TimeNotation') orelse (TS =:= asn1_NOVALUE)) -> F = fun(A) -> (A == asn1_NOVALUE) orelse (is_tuple(A) @@ -2101,13 +2090,13 @@ cre_ServiceChangeProfile(N, 1). cre_ServiceChangeProfile(N, V) - when is_list(N) and is_integer(V) and (0 =< V) and (V =< 99) -> + when is_list(N) andalso is_integer(V) andalso (0 =< V) andalso (V =< 99) -> #'ServiceChangeProfile'{profileName = N, version = V}. -cre_PackagesDescriptor([H|_] = D) when record(H, 'PackagesItem') -> +cre_PackagesDescriptor([H|_] = D) when is_record(H, 'PackagesItem') -> D. -cre_PackagesItem(N, Ver) when list(N), integer(Ver), 0 =< Ver, Ver =< 99 -> +cre_PackagesItem(N, Ver) when is_list(N) andalso is_integer(Ver) andalso (0 =< Ver) andalso (Ver =< 99) -> #'PackagesItem'{packageName = N, packageVersion = Ver}. @@ -2115,10 +2104,10 @@ true = is_StatisticsDescriptor(D), D. -cre_StatisticsParameter(N) when list(N) -> +cre_StatisticsParameter(N) when is_list(N) -> #'StatisticsParameter'{statName = N}. -cre_StatisticsParameter(N, V) when list(N), list(V) -> +cre_StatisticsParameter(N, V) when is_list(N) andalso is_list(V) -> #'StatisticsParameter'{statName = N, statValue = V}. %% cre_NonStandardData({Tag, _} = Id, Data) when atom(Tag), list(Data) -> @@ -2142,10 +2131,10 @@ %% manufacturerCode = MC}. cre_TimeNotation(D, T) - when list(D), length(D) == 8, list(T), length(T) == 8 -> + when is_list(D) andalso (length(D) =:= 8) andalso is_list(T) andalso (length(T) =:= 8) -> #'TimeNotation'{date = D, time = T}. -cre_Value([H|_] = V) when list(H) -> +cre_Value([H|_] = V) when is_list(H) -> V. cre_BOOLEAN(true = B) -> @@ -3625,7 +3614,7 @@ lists:member(D, [onewayexternal, onewayboth]). -chk_TopologyRequest(T, T) when record(T,'TopologyRequest') -> +chk_TopologyRequest(T, T) when is_record(T,'TopologyRequest') -> ok; chk_TopologyRequest(#'TopologyRequest'{terminationFrom = F1, terminationTo = T1, @@ -3719,7 +3708,7 @@ wrong_type('AmmRequest_descriptors', Descs). -chk_AmmRequest(R, R) when record(R, 'AmmRequest') -> +chk_AmmRequest(R, R) when is_record(R, 'AmmRequest') -> d("chk_AmmRequest -> entry when equal"), chk_type(fun is_AmmRequest/1, 'AmmRequest', R); chk_AmmRequest(#'AmmRequest'{terminationID = Tids1, @@ -7471,12 +7460,12 @@ %% -- ModemDescriptor -- -is_ModemDescriptor(D) when record(D, 'ModemDescriptor') -> +is_ModemDescriptor(D) when is_record(D, 'ModemDescriptor') -> true; is_ModemDescriptor(_) -> false. -chk_ModemDescriptor(D, D) when record(D, 'ModemDescriptor') -> +chk_ModemDescriptor(D, D) when is_record(D, 'ModemDescriptor') -> ok; chk_ModemDescriptor(#'ModemDescriptor'{mtl = MTL1, mpl = MPL1, @@ -8311,7 +8300,7 @@ end. -is_IA5String(S) when list(S) -> +is_IA5String(S) when is_list(S) -> true; is_IA5String(_) -> false. @@ -8326,7 +8315,7 @@ % wrong_type('IA5String', S1, S2) % end. -is_IA5String(S, _) when list(S) -> +is_IA5String(S, _) when is_list(S) -> true; is_IA5String(_, _) -> false. @@ -8344,16 +8333,16 @@ is_OCTET_STRING(L) -> is_OCTET_STRING(L, any). -is_OCTET_STRING(L, any) when list(L) -> +is_OCTET_STRING(L, any) when is_list(L) -> true; -is_OCTET_STRING(L, {exact, Len}) when list(L), length(L) == Len -> +is_OCTET_STRING(L, {exact, Len}) when is_list(L) andalso (length(L) =:= Len) -> true; -is_OCTET_STRING(L, {atleast, Len}) when list(L), Len =< length(L) -> +is_OCTET_STRING(L, {atleast, Len}) when is_list(L) andalso (Len =< length(L)) -> true; -is_OCTET_STRING(L, {atmost, Len}) when list(L), length(L) =< Len -> +is_OCTET_STRING(L, {atmost, Len}) when is_list(L) andalso (length(L) =< Len) -> true; is_OCTET_STRING(L, {range, Min, Max}) - when list(L), Min =< length(L), length(L) =< Max -> + when is_list(L) andalso (Min =< length(L)) andalso (length(L) =< Max) -> true; is_OCTET_STRING(_, _) -> false. @@ -8409,16 +8398,22 @@ "~n R: ~p", [I, R]), is_OPTIONAL(fun(X) -> is_INTEGER(X, R) end, I). -is_INTEGER(I, any) when integer(I) -> +is_INTEGER(I, any) when is_integer(I) -> true; -is_INTEGER(I, {exact, I}) when integer(I) -> +is_INTEGER(I, {exact, I}) when is_integer(I) -> true; -is_INTEGER(I, {atleast, Min}) when integer(I), integer(Min), Min =< I -> +is_INTEGER(I, {atleast, Min}) + when is_integer(I) andalso is_integer(Min) andalso (Min =< I) -> true; -is_INTEGER(I, {atmost, Max}) when integer(I), integer(Max), I =< Max -> +is_INTEGER(I, {atmost, Max}) + when is_integer(I) andalso is_integer(Max) andalso (I =< Max) -> true; is_INTEGER(I, {range, Min, Max}) - when integer(I), integer(Min), integer(Max), Min =< I, I =< Max -> + when is_integer(I) andalso + is_integer(Min) andalso + is_integer(Max) andalso + (Min =< I) andalso + (I =< Max) -> true; is_INTEGER(_, _) -> false. @@ -8444,7 +8439,7 @@ %% ---------------------------------------------------------------------- -to_lower([C|Cs]) when C >= $A, C =< $Z -> +to_lower([C|Cs]) when (C >= $A) andalso (C =< $Z) -> [C+($a-$A)|to_lower(Cs)]; to_lower([C|Cs]) -> [C|to_lower(Cs)]; @@ -8452,7 +8447,7 @@ []. -validate(F, Type) when function(F) -> +validate(F, Type) when is_function(F) -> case (catch F()) of {error, Reason} -> error({Type, Reason}); @@ -8461,7 +8456,7 @@ end. -chk_type(F, T, V) when function(F), atom(T) -> +chk_type(F, T, V) when is_function(F) andalso is_atom(T) -> case F(V) of true -> ok; @@ -8469,7 +8464,7 @@ wrong_type(T, V) end. -chk_type(F, T, V1, V2) when function(F), atom(T) -> +chk_type(F, T, V1, V2) when is_function(F) andalso is_atom(T) -> case F(V1, V2) of true -> ok; @@ -8480,26 +8475,26 @@ is_OPTIONAL(_, asn1_NOVALUE) -> true; -is_OPTIONAL(F, Val) when function(F) -> +is_OPTIONAL(F, Val) when is_function(F) -> F(Val). chk_OPTIONAL(_, asn1_NOVALUE, asn1_NOVALUE, _, _) -> ok; -chk_OPTIONAL(Type, asn1_NOVALUE = V1, V2, IS, _CHK) when function(IS) -> +chk_OPTIONAL(Type, asn1_NOVALUE = V1, V2, IS, _CHK) when is_function(IS) -> case IS(V2) of true -> not_equal(Type, V1, V2); false -> wrong_type(Type, V1, V2) end; -chk_OPTIONAL(Type, V1, asn1_NOVALUE = V2, IS, _CHK) when function(IS) -> +chk_OPTIONAL(Type, V1, asn1_NOVALUE = V2, IS, _CHK) when is_function(IS) -> case IS(V1) of true -> not_equal(Type, V1, V2); false -> wrong_type(Type, V1, V2) end; -chk_OPTIONAL(_Type, V1, V2, _IS, CHK) when function(CHK) -> +chk_OPTIONAL(_Type, V1, V2, _IS, CHK) when is_function(CHK) -> CHK(V1, V2). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_v1_lib.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_v1_lib.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_v1_lib.erl 2009-03-12 12:32:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_v1_lib.erl 2009-09-18 15:13:31.000000000 +0100 @@ -175,12 +175,12 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -cre_MegacoMessage(M) when record(M, 'Message') -> +cre_MegacoMessage(M) when is_record(M, 'Message') -> #'MegacoMessage'{mess = M}. cre_MegacoMessage(AH, M) - when record(AH, 'AuthenticationHeader'), - record(M, 'Message') -> + when is_record(AH, 'AuthenticationHeader') andalso + is_record(M, 'Message') -> #'MegacoMessage'{authHeader = AH, mess = M}. @@ -229,21 +229,21 @@ cre_ContextID(Val) -> exit({invalid_ContextID, Val}). -cre_Transaction(TR) when record(TR, 'TransactionRequest') -> +cre_Transaction(TR) when is_record(TR, 'TransactionRequest') -> {transactionRequest, TR}; -cre_Transaction(TP) when record(TP, 'TransactionPending') -> +cre_Transaction(TP) when is_record(TP, 'TransactionPending') -> {transactionPending, TP}; -cre_Transaction(TR) when record(TR, 'TransactionReply') -> +cre_Transaction(TR) when is_record(TR, 'TransactionReply') -> {transactionReply, TR}; -cre_Transaction(TRA) when list(TRA) -> +cre_Transaction(TRA) when is_list(TRA) -> {transactionResponseAck, TRA}. -cre_TransactionId(Val) when 0 =< Val, Val =< 4294967295 -> +cre_TransactionId(Val) when (0 =< Val) andalso (Val =< 4294967295) -> Val; cre_TransactionId(Val) -> exit({invalid_TransactionId, Val}). -cre_TransactionRequest(TransID, ARs) when integer(TransID), list(ARs) -> +cre_TransactionRequest(TransID, ARs) when is_integer(TransID) andalso is_list(ARs) -> #'TransactionRequest'{transactionId = TransID, actions = ARs}. @@ -790,24 +790,24 @@ cre_EventName(N) when is_list(N) -> N. -cre_EventParameter(N, V) when list(N), list(V) -> +cre_EventParameter(N, V) when is_list(N) andalso is_list(V) -> #'EventParameter'{eventParameterName = N, value = V}. cre_EventParameter(N, V, relation = Tag, R) - when list(N), list(V), atom(R) -> + when is_list(N) andalso is_list(V) andalso is_atom(R) -> EI = {Tag, R}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}; cre_EventParameter(N, V, range = Tag, B) - when list(N), list(V), atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}; cre_EventParameter(N, V, sublist = Tag, B) - when list(N), list(V), atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'EventParameter'{eventParameterName = N, value = V, @@ -1188,14 +1188,16 @@ %% eventDM = EDM, %% signalsDescriptor = SD}. -cre_EventBufferDescriptor([H|_] = D) when record(H, 'EventSpec') -> +cre_EventBufferDescriptor([H|_] = D) + when is_record(H, 'EventSpec') -> D. -cre_EventSpec(N, [H|_] = EPL) when list(N), record(H, 'EventParameter') -> +cre_EventSpec(N, [H|_] = EPL) + when is_list(N) andalso is_record(H, 'EventParameter') -> #'EventSpec'{eventName = N, eventParList = EPL}. cre_EventSpec(N, SID, [H|_] = EPL) - when list(N), integer(SID), record(H, 'EventParameter') -> + when is_list(N) andalso is_integer(SID) andalso is_record(H, 'EventParameter') -> #'EventSpec'{eventName = N, streamID = SID, eventParList = EPL}. %% cre_SignalsDescriptor(D) when list(D) -> @@ -6808,16 +6810,16 @@ is_OCTET_STRING(L) -> is_OCTET_STRING(L, any). -is_OCTET_STRING(L, any) when list(L) -> +is_OCTET_STRING(L, any) when is_list(L) -> true; -is_OCTET_STRING(L, {exact, Len}) when list(L), length(L) == Len -> +is_OCTET_STRING(L, {exact, Len}) when is_list(L) andalso (length(L) =:= Len) -> true; -is_OCTET_STRING(L, {atleast, Len}) when list(L), Len =< length(L) -> +is_OCTET_STRING(L, {atleast, Len}) when is_list(L) andalso (Len =< length(L)) -> true; -is_OCTET_STRING(L, {atmost, Len}) when list(L), length(L) =< Len -> +is_OCTET_STRING(L, {atmost, Len}) when is_list(L) andalso (length(L) =< Len) -> true; is_OCTET_STRING(L, {range, Min, Max}) - when list(L), Min =< length(L), length(L) =< Max -> + when is_list(L) andalso (Min =< length(L)) andalso (length(L) =< Max) -> true; is_OCTET_STRING(_, _) -> false. @@ -6870,16 +6872,20 @@ is_opt_INTEGER(I, R) -> is_OPTIONAL(fun(X) -> is_INTEGER(X, R) end, I). -is_INTEGER(I, any) when integer(I) -> +is_INTEGER(I, any) when is_integer(I) -> true; -is_INTEGER(I, {exact, I}) when integer(I) -> +is_INTEGER(I, {exact, I}) when is_integer(I) -> true; -is_INTEGER(I, {atleast, Min}) when integer(I), integer(Min), Min =< I -> +is_INTEGER(I, {atleast, Min}) when is_integer(I) andalso is_integer(Min) andalso (Min =< I) -> true; -is_INTEGER(I, {atmost, Max}) when integer(I), integer(Max), I =< Max -> +is_INTEGER(I, {atmost, Max}) when is_integer(I) andalso is_integer(Max) andalso (I =< Max) -> true; is_INTEGER(I, {range, Min, Max}) - when integer(I), integer(Min), integer(Max), Min =< I, I =< Max -> + when is_integer(I) andalso + is_integer(Min) andalso + is_integer(Max) andalso + (Min =< I) andalso + (I =< Max) -> true; is_INTEGER(_, _) -> false. @@ -6941,7 +6947,7 @@ is_OPTIONAL(_, asn1_NOVALUE) -> true; -is_OPTIONAL(F, Val) when function(F) -> +is_OPTIONAL(F, Val) when is_function(F) -> F(Val). %% chk_OPTIONAL(_, asn1_NOVALUE, asn1_NOVALUE, _, _) -> diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_v2_lib.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_v2_lib.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_v2_lib.erl 2009-03-12 12:32:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_v2_lib.erl 2009-09-18 15:13:16.000000000 +0100 @@ -173,12 +173,12 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -cre_MegacoMessage(M) when record(M, 'Message') -> +cre_MegacoMessage(M) when is_record(M, 'Message') -> #'MegacoMessage'{mess = M}. cre_MegacoMessage(AH, M) - when record(AH, 'AuthenticationHeader'), - record(M, 'Message') -> + when is_record(AH, 'AuthenticationHeader') andalso + is_record(M, 'Message') -> #'MegacoMessage'{authHeader = AH, mess = M}. @@ -187,39 +187,39 @@ seqNum = SN, ad = AD}. -cre_Message(V, Mid, ED) when record(ED, 'ErrorDescriptor') -> +cre_Message(V, Mid, ED) when is_record(ED, 'ErrorDescriptor') -> Body = {errorDescriptor, ED}, #'Message'{version = V, mId = Mid, messageBody = Body}; -cre_Message(V, Mid, Transactions) when list(Transactions) -> +cre_Message(V, Mid, Transactions) when is_list(Transactions) -> Body = {transactions, Transactions}, #'Message'{version = V, mId = Mid, messageBody = Body}; -cre_Message(V, Mid, {transactions, T} = Body) when list(T) -> +cre_Message(V, Mid, {transactions, T} = Body) when is_list(T) -> #'Message'{version = V, mId = Mid, messageBody = Body}; cre_Message(V, Mid, {errorDescriptor, ED} = Body) - when record(ED, 'ErrorDescriptor') -> + when is_record(ED, 'ErrorDescriptor') -> #'Message'{version = V, mId = Mid, messageBody = Body}. -cre_ErrorDescriptor(EC) when integer(EC) -> +cre_ErrorDescriptor(EC) when is_integer(EC) -> #'ErrorDescriptor'{errorCode = EC}. -cre_ErrorDescriptor(EC, ET) when integer(EC), list(ET) -> +cre_ErrorDescriptor(EC, ET) when is_integer(EC) andalso is_list(ET) -> #'ErrorDescriptor'{errorCode = EC, errorText = ET}. -cre_ErrorCode(C) when integer(C), 0 =< C, C =< 65535 -> +cre_ErrorCode(C) when is_integer(C) andalso (0 =< C) andalso (C =< 65535) -> C; cre_ErrorCode(C) -> exit({invalid_ErrorCode, C}). -cre_ErrorText(T) when list(T) -> +cre_ErrorText(T) when is_list(T) -> T. cre_ContextID(Val) when 0 =< Val, Val =< 4294967295 -> @@ -227,34 +227,34 @@ cre_ContextID(Val) -> exit({invalid_ContextID, Val}). -cre_Transaction(TR) when record(TR, 'TransactionRequest') -> +cre_Transaction(TR) when is_record(TR, 'TransactionRequest') -> {transactionRequest, TR}; -cre_Transaction(TP) when record(TP, 'TransactionPending') -> +cre_Transaction(TP) when is_record(TP, 'TransactionPending') -> {transactionPending, TP}; -cre_Transaction(TR) when record(TR, 'TransactionReply') -> +cre_Transaction(TR) when is_record(TR, 'TransactionReply') -> {transactionReply, TR}; -cre_Transaction(TRA) when list(TRA) -> +cre_Transaction(TRA) when is_list(TRA) -> {transactionResponseAck, TRA}. -cre_TransactionId(Val) when 0 =< Val, Val =< 4294967295 -> +cre_TransactionId(Val) when (0 =< Val) andalso (Val =< 4294967295) -> Val; cre_TransactionId(Val) -> exit({invalid_TransactionId, Val}). -cre_TransactionRequest(TransID, ARs) when integer(TransID), list(ARs) -> +cre_TransactionRequest(TransID, ARs) when is_integer(TransID) andalso is_list(ARs) -> #'TransactionRequest'{transactionId = TransID, actions = ARs}. -cre_TransactionPending(TransID) when integer(TransID) -> +cre_TransactionPending(TransID) when is_integer(TransID) -> #'TransactionPending'{transactionId = TransID}. cre_TransactionReply(TransID, ED) - when integer(TransID), record(ED, 'ErrorDescriptor') -> + when is_integer(TransID) andalso is_record(ED, 'ErrorDescriptor') -> Res = {transactionError, ED}, #'TransactionReply'{transactionId = TransID, transactionResult = Res}; cre_TransactionReply(TransID, ARs) - when integer(TransID), list(ARs) -> + when is_integer(TransID) andalso is_list(ARs) -> Res = {actionReplies, ARs}, #'TransactionReply'{transactionId = TransID, transactionResult = Res}. @@ -284,61 +284,61 @@ lastAck = LastAck}. cre_ActionRequest(CtxID, CmdReqs) - when integer(CtxID), list(CmdReqs) -> + when is_integer(CtxID) andalso is_list(CmdReqs) -> #'ActionRequest'{contextId = CtxID, commandRequests = CmdReqs}. cre_ActionRequest(CtxID, CtxReq, CmdReqs) - when integer(CtxID), - record(CtxReq, 'ContextRequest'), - list(CmdReqs) -> + when is_integer(CtxID) andalso + is_record(CtxReq, 'ContextRequest') andalso + is_list(CmdReqs) -> #'ActionRequest'{contextId = CtxID, contextRequest = CtxReq, commandRequests = CmdReqs}; cre_ActionRequest(CtxID, CAAR, CmdReqs) - when integer(CtxID), - record(CAAR, 'ContextAttrAuditRequest'), - list(CmdReqs) -> + when is_integer(CtxID) andalso + is_record(CAAR, 'ContextAttrAuditRequest') andalso + is_list(CmdReqs) -> #'ActionRequest'{contextId = CtxID, contextAttrAuditReq = CAAR, commandRequests = CmdReqs}. cre_ActionRequest(CtxID, CtxReq, CAAR, CmdReqs) - when integer(CtxID), - record(CtxReq, 'ContextRequest'), - record(CAAR, 'ContextAttrAuditRequest'), - list(CmdReqs) -> + when is_integer(CtxID) andalso + is_record(CtxReq, 'ContextRequest') andalso + is_record(CAAR, 'ContextAttrAuditRequest') andalso + is_list(CmdReqs) -> #'ActionRequest'{contextId = CtxID, contextRequest = CtxReq, contextAttrAuditReq = CAAR, commandRequests = CmdReqs}. cre_ActionReply(CtxID, CmdReps) - when integer(CtxID), - list(CmdReps) -> + when is_integer(CtxID) andalso + is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, commandReply = CmdReps}. cre_ActionReply(CtxID, ED, CmdReps) - when integer(CtxID), - record(ED, 'ErrorDescriptor'), - list(CmdReps) -> + when is_integer(CtxID) andalso + is_record(ED, 'ErrorDescriptor') andalso + is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, errorDescriptor = ED, commandReply = CmdReps}; cre_ActionReply(CtxID, CtxReq, CmdReps) - when integer(CtxID), - record(CtxReq, 'ContextRequest'), - list(CmdReps) -> + when is_integer(CtxID) andalso + is_record(CtxReq, 'ContextRequest') andalso + is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, contextReply = CtxReq, commandReply = CmdReps}. cre_ActionReply(CtxID, ED, CtxReq, CmdReps) - when integer(CtxID), - record(ED, 'ErrorDescriptor'), - record(CtxReq, 'ContextRequest'), - list(CmdReps) -> + when is_integer(CtxID) andalso + is_record(ED, 'ErrorDescriptor') andalso + is_record(CtxReq, 'ContextRequest') andalso + is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, errorDescriptor = ED, contextReply = CtxReq, @@ -347,11 +347,11 @@ cre_ContextRequest() -> #'ContextRequest'{}. -cre_ContextRequest(Prio) when integer(Prio), 0 =< Prio, Prio =< 15 -> +cre_ContextRequest(Prio) when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) -> #'ContextRequest'{priority = Prio}; -cre_ContextRequest(Em) when Em == true; Em == false; Em == asn1_NOVALUE -> +cre_ContextRequest(Em) when (Em =:= true) andalso (Em =:= false) andalso (Em =:= asn1_NOVALUE) -> #'ContextRequest'{emergency = Em}; -cre_ContextRequest(Top) when list(Top) -> +cre_ContextRequest(Top) when is_list(Top) -> #'ContextRequest'{topologyReq = Top}. cre_ContextRequest(Prio, Em) @@ -360,7 +360,7 @@ #'ContextRequest'{priority = Prio, emergency = Em}; cre_ContextRequest(Prio, Top) - when integer(Prio), 0 =< Prio, Prio =< 15, list(Top) -> + when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) andalso is_list(Top) -> #'ContextRequest'{priority = Prio, topologyReq = Top}. @@ -399,53 +399,53 @@ wildcardReturn = WR}. cre_Command(addReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(moveReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(modReq = Tag, Req) - when record(Req, 'AmmRequest') -> + when is_record(Req, 'AmmRequest') -> {Tag, Req}; cre_Command(subtractReq = Tag, Req) - when record(Req, 'SubtractRequest') -> + when is_record(Req, 'SubtractRequest') -> {Tag, Req}; cre_Command(auditCapRequest = Tag, Req) - when record(Req, 'AuditRequest') -> + when is_record(Req, 'AuditRequest') -> {Tag, Req}; cre_Command(auditValueRequest = Tag, Req) - when record(Req, 'AuditRequest') -> + when is_record(Req, 'AuditRequest') -> {Tag, Req}; cre_Command(notifyReq = Tag, Req) - when record(Req, 'NotifyRequest') -> + when is_record(Req, 'NotifyRequest') -> {Tag, Req}; cre_Command(serviceChangeReq = Tag, Req) - when record(Req, 'ServiceChangeRequest') -> + when is_record(Req, 'ServiceChangeRequest') -> {Tag, Req}. cre_CommandReply(addReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(moveReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(modReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(subtractReply = Tag, Rep) - when record(Rep, 'AmmsReply') -> + when is_record(Rep, 'AmmsReply') -> {Tag, Rep}; cre_CommandReply(auditCapReply = Tag, Rep) - when tuple(Rep) -> + when is_tuple(Rep) -> {Tag, Rep}; cre_CommandReply(auditValueReply = Tag, Rep) - when tuple(Rep) -> + when is_tuple(Rep) -> {Tag, Rep}; cre_CommandReply(notifyReply = Tag, Rep) - when record(Rep, 'NotifyReply') -> + when is_record(Rep, 'NotifyReply') -> {Tag, Rep}; cre_CommandReply(serviceChangeReply = Tag, Rep) - when record(Rep, 'ServiceChangeReply') -> + when is_record(Rep, 'ServiceChangeReply') -> {Tag, Rep}. cre_TopologyRequest(From, To, Dir) @@ -466,7 +466,7 @@ topologyDirection = Dir, streamID = SID}. -cre_AmmRequest(TermIDs, Descs) when list(TermIDs), list(Descs) -> +cre_AmmRequest(TermIDs, Descs) when is_list(TermIDs) andalso is_list(Descs) -> #'AmmRequest'{terminationID = TermIDs, descriptors = Descs}. @@ -495,67 +495,67 @@ end end. -cre_AmmsReply(TermIDs) when list(TermIDs) -> +cre_AmmsReply(TermIDs) when is_list(TermIDs) -> #'AmmsReply'{terminationID = TermIDs}. -cre_AmmsReply(TermIDs, TAs) when list(TermIDs), list(TAs) -> +cre_AmmsReply(TermIDs, TAs) when is_list(TermIDs) andalso is_list(TAs) -> #'AmmsReply'{terminationID = TermIDs, terminationAudit = TAs}. -cre_SubtractRequest(TermIDs) when list(TermIDs) -> +cre_SubtractRequest(TermIDs) when is_list(TermIDs) -> #'SubtractRequest'{terminationID = TermIDs}. cre_SubtractRequest(TermIDs, Audit) - when list(TermIDs), record(Audit, 'AuditDescriptor') -> + when is_list(TermIDs) andalso is_record(Audit, 'AuditDescriptor') -> #'SubtractRequest'{terminationID = TermIDs, auditDescriptor = Audit}. cre_AuditRequest(TermID, Audit) - when record(TermID, megaco_term_id), record(Audit, 'AuditDescriptor') -> + when is_record(TermID, megaco_term_id) andalso is_record(Audit, 'AuditDescriptor') -> #'AuditRequest'{terminationID = TermID, auditDescriptor = Audit}. -cre_AuditReply(TermIDs) when list(TermIDs) -> +cre_AuditReply(TermIDs) when is_list(TermIDs) -> {contextAuditResult, TermIDs}; -cre_AuditReply(ED) when record(ED, 'ErrorDescriptor') -> +cre_AuditReply(ED) when is_record(ED, 'ErrorDescriptor') -> {error, ED}; -cre_AuditReply(Audit) when record(Audit, 'AuditResult') -> +cre_AuditReply(Audit) when is_record(Audit, 'AuditResult') -> {auditResult, Audit}. cre_AuditResult(TermID, TAs) - when record(TermID, megaco_term_id), list(TAs) -> + when is_record(TermID, megaco_term_id) andalso is_list(TAs) -> #'AuditResult'{terminationID = TermID, terminationAuditResult = TAs}. -cre_AuditReturnParameter(D) when record(D, 'ErrorDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ErrorDescriptor') -> {errorDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'MediaDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'MediaDescriptor') -> {mediaDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'ModemDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ModemDescriptor') -> {modemDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'MuxDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'MuxDescriptor') -> {muxDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'EventsDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'EventsDescriptor') -> {eventsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'EventSpec') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'EventSpec') -> {eventBufferDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'DigitMapDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'DigitMapDescriptor') -> {digitMapDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'ObservedEventsDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'ObservedEventsDescriptor') -> {observedEventsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'StatisticsParameter') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'StatisticsParameter') -> {statisticsDescriptor, D}; -cre_AuditReturnParameter([H|_] = D) when record(H, 'PackagesItem') -> +cre_AuditReturnParameter([H|_] = D) when is_record(H, 'PackagesItem') -> {packagesDescriptor, D}; -cre_AuditReturnParameter(D) when record(D, 'AuditDescriptor') -> +cre_AuditReturnParameter(D) when is_record(D, 'AuditDescriptor') -> {emptyDescriptors, D}; -cre_AuditReturnParameter([H|_] = D) when tuple(H) -> +cre_AuditReturnParameter([H|_] = D) when is_tuple(H) -> {signalsDescriptor, D}. cre_AuditDescriptor() -> #'AuditDescriptor'{}. -cre_AuditDescriptor([H|_] = AT) when atom(H) -> +cre_AuditDescriptor([H|_] = AT) when is_atom(H) -> #'AuditDescriptor'{auditToken = AT}; cre_AuditDescriptor(APT) -> #'AuditDescriptor'{auditPropertyToken = APT}. @@ -564,63 +564,63 @@ #'AuditDescriptor'{auditToken = AT, auditPropertyToken = APT}. -cre_IndAuditParameter(D) when record(D, 'IndAudMediaDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudMediaDescriptor') -> {indAudMediaDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudEventsDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudEventsDescriptor') -> {indAudEventsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudEventBufferDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudEventBufferDescriptor') -> {indAudEventBufferDescriptor, D}; cre_IndAuditParameter({signal, _} = D) -> {indAudSignalsDescriptor, D}; cre_IndAuditParameter({seqSigList, _} = D) -> {indAudSignalsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudDigitMapDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudDigitMapDescriptor') -> {indAudDigitMapDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudStatisticsDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudStatisticsDescriptor') -> {indAudStatisticsDescriptor, D}; -cre_IndAuditParameter(D) when record(D, 'IndAudPackagesDescriptor') -> +cre_IndAuditParameter(D) when is_record(D, 'IndAudPackagesDescriptor') -> {indAudPackagesDescriptor, D}. cre_IndAudMediaDescriptor() -> #'IndAudMediaDescriptor'{}. cre_IndAudMediaDescriptor(TSD) - when record(TSD, 'IndAudTerminationStateDescriptor') -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') -> #'IndAudMediaDescriptor'{termStateDescr = TSD}; -cre_IndAudMediaDescriptor(Parms) when record(Parms, 'IndAudStreamParms') -> +cre_IndAudMediaDescriptor(Parms) when is_record(Parms, 'IndAudStreamParms') -> Streams = {oneStream, Parms}, #'IndAudMediaDescriptor'{streams = Streams}; -cre_IndAudMediaDescriptor(Descs) when list(Descs) -> +cre_IndAudMediaDescriptor(Descs) when is_list(Descs) -> Streams = {multiStream, Descs}, #'IndAudMediaDescriptor'{streams = Streams}. cre_IndAudMediaDescriptor(TSD, Parms) - when record(TSD, 'IndAudTerminationStateDescriptor'), - record(Parms, 'IndAudStreamParms') -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso + is_record(Parms, 'IndAudStreamParms') -> Streams = {oneStream, Parms}, #'IndAudMediaDescriptor'{termStateDescr = TSD, streams = Streams}; cre_IndAudMediaDescriptor(TSD, Descs) - when record(TSD, 'IndAudTerminationStateDescriptor'), list(Descs) -> + when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso is_list(Descs) -> Streams = {multiStream, Descs}, #'IndAudMediaDescriptor'{termStateDescr = TSD, streams = Streams}. cre_IndAudStreamDescriptor(SID, Parms) - when integer(SID), record(Parms, 'IndAudStreamParms') -> + when is_integer(SID) andalso is_record(Parms, 'IndAudStreamParms') -> #'IndAudStreamDescriptor'{streamID = SID, streamParms = Parms}. cre_IndAudStreamParms() -> #'IndAudStreamParms'{}. -cre_IndAudStreamParms(LCD) when record(LCD, 'IndAudLocalControlDescriptor') -> +cre_IndAudStreamParms(LCD) when is_record(LCD, 'IndAudLocalControlDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LCD}. cre_IndAudStreamParms(LCD, L, R) - when record(LCD, 'IndAudLocalControlDescriptor'), - record(L, 'IndAudLocalRemoteDescriptor'), - record(R, 'IndAudLocalRemoteDescriptor') -> + when is_record(LCD, 'IndAudLocalControlDescriptor') andalso + is_record(L, 'IndAudLocalRemoteDescriptor') andalso + is_record(R, 'IndAudLocalRemoteDescriptor') -> #'IndAudStreamParms'{localControlDescriptor = LCD, localDescriptor = L, remoteDescriptor = R}. @@ -638,28 +638,28 @@ reserveGroup = RG, propertyParms = PP}. -cre_IndAudPropertyParm(PkgdName) when list(PkgdName) -> +cre_IndAudPropertyParm(PkgdName) when is_list(PkgdName) -> #'IndAudPropertyParm'{name = PkgdName}. cre_IndAudLocalRemoteDescriptor(Grps) - when list(Grps) -> + when is_list(Grps) -> #'IndAudLocalRemoteDescriptor'{propGrps = Grps}. cre_IndAudLocalRemoteDescriptor(GrpID, Grps) - when integer(GrpID), 0 =< GrpID, GrpID =< 65535, list(Grps) -> + when is_integer(GrpID) andalso (0 =< GrpID) andalso (GrpID =< 65535) andalso is_list(Grps) -> #'IndAudLocalRemoteDescriptor'{propGroupID = GrpID, propGrps = Grps}. cre_IndAudPropertyGroup([]) -> []; cre_IndAudPropertyGroup([H|_] = PG) - when record(H, 'IndAudPropertyParm') -> + when is_record(H, 'IndAudPropertyParm') -> PG. cre_IndAudTerminationStateDescriptor([] = PP) -> #'IndAudTerminationStateDescriptor'{propertyParms = PP}; cre_IndAudTerminationStateDescriptor([H|_] = PP) - when record(H, 'IndAudPropertyParm') -> + when is_record(H, 'IndAudPropertyParm') -> #'IndAudTerminationStateDescriptor'{propertyParms = PP}. cre_IndAudTerminationStateDescriptor([] = PP, EBC, SS) @@ -677,109 +677,123 @@ serviceState = SS}. cre_IndAudEventsDescriptor(PkgdName) - when list(PkgdName) -> + when is_list(PkgdName) -> #'IndAudEventsDescriptor'{pkgdName = PkgdName}. cre_IndAudEventsDescriptor(RID, PkgdName) - when integer(RID), list(PkgdName) -> + when is_integer(RID) andalso is_list(PkgdName) -> #'IndAudEventsDescriptor'{requestID = RID, pkgdName = PkgdName}; cre_IndAudEventsDescriptor(PkgdName, SID) - when list(PkgdName), integer(SID) -> + when is_list(PkgdName) andalso is_integer(SID) -> #'IndAudEventsDescriptor'{pkgdName = PkgdName, streamID = SID}. cre_IndAudEventsDescriptor(RID, PkgdName, SID) - when integer(RID), list(PkgdName), integer(SID) -> + when is_integer(RID) andalso is_list(PkgdName) andalso is_integer(SID) -> #'IndAudEventsDescriptor'{requestID = RID, pkgdName = PkgdName, streamID = SID}. -cre_IndAudEventBufferDescriptor(EventName) when list(EventName) -> +cre_IndAudEventBufferDescriptor(EventName) when is_list(EventName) -> #'IndAudEventBufferDescriptor'{eventName = EventName}. cre_IndAudEventBufferDescriptor(EventName, SID) - when list(EventName), integer(SID) -> + when is_list(EventName) andalso is_integer(SID) -> #'IndAudEventBufferDescriptor'{eventName = EventName, streamID = SID}. -cre_IndAudSignalsDescriptor(S) when record(S, 'IndAudSignal') -> +cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSignal') -> {signal, S}; -cre_IndAudSignalsDescriptor(S) when record(S, 'IndAudSeqSigList') -> +cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSeqSigList') -> {seqSigList, S}. -cre_IndAudSeqSigList(ID) when integer(ID), 0=< ID, ID =< 65535 -> +cre_IndAudSeqSigList(ID) when is_integer(ID) andalso (0=< ID) andalso (ID =< 65535) -> #'IndAudSeqSigList'{id = ID}. cre_IndAudSeqSigList(ID, S) - when integer(ID), 0=< ID, ID =< 65535, - record(S, 'IndAudSignal') -> + when is_integer(ID) andalso + (0 =< ID) andalso (ID =< 65535) andalso + is_record(S, 'IndAudSignal') -> #'IndAudSeqSigList'{id = ID, signalList = S}. -cre_IndAudSignal(SigName) when list(SigName) -> +cre_IndAudSignal(SigName) when is_list(SigName) -> #'IndAudSignal'{signalName = SigName}. -cre_IndAudSignal(SigName, SID) when list(SigName), integer(SID) -> +cre_IndAudSignal(SigName, SID) when is_list(SigName) andalso is_integer(SID) -> #'IndAudSignal'{signalName = SigName, streamID = SID}. cre_IndAudDigitMapDescriptor() -> #'IndAudDigitMapDescriptor'{}. -cre_IndAudDigitMapDescriptor(DMN) when list(DMN) -> +cre_IndAudDigitMapDescriptor(DMN) when is_list(DMN) -> #'IndAudDigitMapDescriptor'{digitMapName = DMN}. -cre_IndAudStatisticsDescriptor(StatName) when list(StatName) -> +cre_IndAudStatisticsDescriptor(StatName) when is_list(StatName) -> #'IndAudStatisticsDescriptor'{statName = StatName}. cre_IndAudPackagesDescriptor(N, V) - when list(N), - integer(V), 0 =< V, V =< 99 -> + when is_list(N) andalso + is_integer(V) andalso + (0 =< V) andalso + (V =< 99) -> #'IndAudPackagesDescriptor'{packageName = N, packageVersion = V}. cre_NotifyRequest(TermIDs, D) - when list(TermIDs), record(D, 'ObservedEventsDescriptor') -> + when is_list(TermIDs) andalso is_record(D, 'ObservedEventsDescriptor') -> #'NotifyRequest'{terminationID = TermIDs, observedEventsDescriptor = D}. cre_NotifyRequest(TermIDs, D, ED) - when list(TermIDs), - record(D, 'ObservedEventsDescriptor'), - record(ED, 'ErrorDescriptor') -> + when is_list(TermIDs) andalso + is_record(D, 'ObservedEventsDescriptor') andalso + is_record(ED, 'ErrorDescriptor') -> #'NotifyRequest'{terminationID = TermIDs, observedEventsDescriptor = D, errorDescriptor = ED}. -cre_NotifyReply(TermIDs) when list(TermIDs) -> +cre_NotifyReply(TermIDs) when is_list(TermIDs) -> #'NotifyReply'{terminationID = TermIDs}. cre_NotifyReply(TermIDs, ED) - when list(TermIDs), - record(ED, 'ErrorDescriptor') -> + when is_list(TermIDs) andalso + is_record(ED, 'ErrorDescriptor') -> #'NotifyReply'{terminationID = TermIDs, errorDescriptor = ED}. cre_ObservedEventsDescriptor(RID, [H|_] = L) - when integer(RID), record(H, 'ObservedEvent') -> + when is_integer(RID) andalso is_record(H, 'ObservedEvent') -> #'ObservedEventsDescriptor'{requestId = RID, observedEventLst = L}. -cre_ObservedEvent(EN, EPL) when list(EN), list(EPL) -> +cre_ObservedEvent(EN, EPL) + when is_list(EN) andalso is_list(EPL) -> #'ObservedEvent'{eventName = EN, eventParList = EPL}; -cre_ObservedEvent(EN, TN) when list(EN), record(TN, 'TimeNotation') -> +cre_ObservedEvent(EN, TN) + when is_list(EN) andalso + is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, timeNotation = TN}. -cre_ObservedEvent(EN, SID, EPL) when list(EN), integer(SID), list(EPL) -> +cre_ObservedEvent(EN, SID, EPL) + when is_list(EN) andalso + is_integer(SID) andalso + is_list(EPL) -> #'ObservedEvent'{eventName = EN, streamID = SID, eventParList = EPL}; cre_ObservedEvent(EN, EPL, TN) - when list(EN), list(EPL), record(TN, 'TimeNotation') -> + when is_list(EN) andalso + is_list(EPL) andalso + is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, eventParList = EPL, timeNotation = TN}. cre_ObservedEvent(EN, SID, EPL, TN) - when list(EN), integer(SID), list(EPL), record(TN, 'TimeNotation') -> + when is_list(EN) andalso + is_integer(SID) andalso + is_list(EPL) andalso + is_record(TN, 'TimeNotation') -> #'ObservedEvent'{eventName = EN, streamID = SID, eventParList = EPL, @@ -788,91 +802,91 @@ cre_EventName(N) when is_list(N) -> N. -cre_EventParameter(N, V) when list(N), list(V) -> +cre_EventParameter(N, V) when is_list(N) andalso is_list(V) -> #'EventParameter'{eventParameterName = N, value = V}. cre_EventParameter(N, V, relation = Tag, R) - when list(N), list(V), atom(R) -> + when is_list(N) andalso is_list(V) andalso is_atom(R) -> EI = {Tag, R}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}; cre_EventParameter(N, V, range = Tag, B) - when list(N), list(V), atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}; cre_EventParameter(N, V, sublist = Tag, B) - when list(N), list(V), atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'EventParameter'{eventParameterName = N, value = V, extraInfo = EI}. cre_ServiceChangeRequest(TermIDs, SCP) - when list(TermIDs), - record(SCP, 'ServiceChangeParm') -> + when is_list(TermIDs) andalso + is_record(SCP, 'ServiceChangeParm') -> #'ServiceChangeRequest'{terminationID = TermIDs, serviceChangeParms = SCP}. cre_ServiceChangeReply(TermIDs, {Tag, R} = SCR) - when list(TermIDs), atom(Tag), tuple(R) -> + when is_list(TermIDs) andalso is_atom(Tag) andalso is_tuple(R) -> #'ServiceChangeReply'{terminationID = TermIDs, serviceChangeResult = SCR}. -cre_ServiceChangeResult(ED) when record(ED, 'ErrorDescriptor') -> +cre_ServiceChangeResult(ED) when is_record(ED, 'ErrorDescriptor') -> {errorDescriptor, ED}; -cre_ServiceChangeResult(SCRP) when record(SCRP, 'ServiceChangeResParm') -> +cre_ServiceChangeResult(SCRP) when is_record(SCRP, 'ServiceChangeResParm') -> {serviceChangeResParms, SCRP}. %% cre_WildcardField(L) when list(L), length(L) == 1 -> L. cre_TerminationID(W, ID) - when list(W), - list(ID), 1 =< length(ID), length(ID) =< 8 -> + when is_list(W) andalso + is_list(ID) andalso (1 =< length(ID)) andalso (length(ID) =< 8) -> #'TerminationID'{wildcard = W, id = ID}. -cre_TerminationIDList(L) when list(L) -> +cre_TerminationIDList(L) when is_list(L) -> L. cre_MediaDescriptor() -> #'MediaDescriptor'{}. -cre_MediaDescriptor(TSD) when record(TSD, 'TerminationStateDescriptor') -> +cre_MediaDescriptor(TSD) when is_record(TSD, 'TerminationStateDescriptor') -> #'MediaDescriptor'{termStateDescr = TSD}; -cre_MediaDescriptor(SP) when record(SP, 'StreamParms') -> +cre_MediaDescriptor(SP) when is_record(SP, 'StreamParms') -> Streams = {oneStream, SP}, #'MediaDescriptor'{streams = Streams}; -cre_MediaDescriptor([H|_] = SDs) when record(H, 'StreamDescriptor') -> +cre_MediaDescriptor([H|_] = SDs) when is_record(H, 'StreamDescriptor') -> Streams = {multiStream, SDs}, #'MediaDescriptor'{streams = Streams}. cre_MediaDescriptor(TSD, SP) - when record(TSD, 'TerminationStateDescriptor'), - record(SP, 'StreamParms') -> + when is_record(TSD, 'TerminationStateDescriptor') andalso + is_record(SP, 'StreamParms') -> Streams = {oneStream, SP}, #'MediaDescriptor'{termStateDescr = TSD, streams = Streams}; cre_MediaDescriptor(TSD, [H|_] = SDs) - when record(TSD, 'TerminationStateDescriptor'), - record(H, 'StreamDescriptor') -> + when is_record(TSD, 'TerminationStateDescriptor') andalso + is_record(H, 'StreamDescriptor') -> Streams = {multiStream, SDs}, #'MediaDescriptor'{termStateDescr = TSD, streams = Streams}. -cre_StreamDescriptor(SID, SP) when integer(SID), record(SP, 'StreamParms') -> +cre_StreamDescriptor(SID, SP) when is_integer(SID) andalso is_record(SP, 'StreamParms') -> #'StreamDescriptor'{streamID = SID, streamParms = SP}. cre_StreamParms() -> #'StreamParms'{}. -cre_StreamParms(LCD) when record(LCD, 'LocalControlDescriptor') -> +cre_StreamParms(LCD) when is_record(LCD, 'LocalControlDescriptor') -> #'StreamParms'{localControlDescriptor = LCD}; -cre_StreamParms(LD) when record(LD, 'LocalRemoteDescriptor') -> +cre_StreamParms(LD) when is_record(LD, 'LocalRemoteDescriptor') -> #'StreamParms'{localDescriptor = LD}. cre_StreamParms(LCD, LD) @@ -889,13 +903,13 @@ localDescriptor = LD, remoteDescriptor = RD}. -cre_LocalControlDescriptor(SM) when atom(SM) -> +cre_LocalControlDescriptor(SM) when is_atom(SM) -> #'LocalControlDescriptor'{streamMode = SM, propertyParms = []}; -cre_LocalControlDescriptor([H|_] = PP) when record(H, 'PropertyParm') -> +cre_LocalControlDescriptor([H|_] = PP) when is_record(H, 'PropertyParm') -> #'LocalControlDescriptor'{propertyParms = PP}. cre_LocalControlDescriptor(SM, [H|_] = PP) - when atom(SM), record(H, 'PropertyParm') -> + when is_atom(SM) andalso is_record(H, 'PropertyParm') -> #'LocalControlDescriptor'{streamMode = SM, propertyParms = PP}. @@ -920,24 +934,24 @@ cre_StreamMode(loopBack = M) -> M. -cre_PropertyParm(N, [H|_] = V) when list(N), list(H) -> +cre_PropertyParm(N, [H|_] = V) when is_list(N) andalso is_list(H) -> #'PropertyParm'{name = N, value = V}. cre_PropertyParm(N, [H|_] = V, relation = Tag, R) - when list(N), list(H), atom(R) -> + when is_list(N) andalso is_list(H) andalso is_atom(R) -> EI = {Tag, R}, #'PropertyParm'{name = N, value = V, extraInfo = EI}; cre_PropertyParm(N, [H|_] = V, range = Tag, B) - when list(N), list(H), atom(B) -> + when is_list(N) andalso is_list(H) andalso is_atom(B) -> EI = {Tag, B}, #'PropertyParm'{name = N, value = V, extraInfo = EI}; cre_PropertyParm(N, [H|_] = V, sublist = Tag, B) - when list(N), list(H), atom(B) -> + when is_list(N) andalso is_list(H) andalso is_atom(B) -> EI = {Tag, B}, #'PropertyParm'{name = N, value = V, extraInfo = EI}. -cre_Name(N) when list(N), length(N) == 2 -> +cre_Name(N) when is_list(N) andalso (length(N) =:= 2) -> N. cre_PkgdName(N) when is_list(N) -> @@ -966,38 +980,38 @@ cre_Relation(unequalTo = R) -> R. -cre_LocalRemoteDescriptor([H|_] = PGs) when list(H) -> +cre_LocalRemoteDescriptor([H|_] = PGs) when is_list(H) -> #'LocalRemoteDescriptor'{propGrps = PGs}. -cre_PropertyGroup([H|_] = PG) when record(H, 'PropertyParm') -> +cre_PropertyGroup([H|_] = PG) when is_record(H, 'PropertyParm') -> PG. -cre_TerminationStateDescriptor([H|_] = PPs) when record(H, 'PropertyParm') -> +cre_TerminationStateDescriptor([H|_] = PPs) when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs}. cre_TerminationStateDescriptor([H|_] = PPs, off = EBC) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, eventBufferControl = EBC}; cre_TerminationStateDescriptor([H|_] = PPs, lockStep = EBC) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, eventBufferControl = EBC}; cre_TerminationStateDescriptor([H|_] = PPs, test = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}; cre_TerminationStateDescriptor([H|_] = PPs, outOfSvc = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}; cre_TerminationStateDescriptor([H|_] = PPs, inSvc = SS) - when record(H, 'PropertyParm') -> + when is_record(H, 'PropertyParm') -> #'TerminationStateDescriptor'{propertyParms = PPs, serviceState = SS}. cre_TerminationStateDescriptor([H|_] = PPs, EMC, SS) - when record(H, 'PropertyParm'), + when is_record(H, 'PropertyParm') andalso ((EMC == off) or (EMC == lockStep)) and ((SS == test) or (SS == outOfSvc) or (SS == inSvc)) -> #'TerminationStateDescriptor'{propertyParms = PPs, @@ -1017,7 +1031,7 @@ SS. cre_MuxDescriptor(MT, [H|_] = TL) - when atom(MT), record(H, 'TerminationID') -> + when is_atom(MT) andalso is_record(H, 'TerminationID') -> #'MuxDescriptor'{muxType = MT, termList = TL}. %% cre_MuxDescriptor(MT, [H|_] = TL, NSD) @@ -1045,44 +1059,44 @@ #'EventsDescriptor'{eventList = []}. cre_EventsDescriptor(RID, [H|_] = EL) - when integer(RID), record(H, 'RequestedEvent') -> + when is_integer(RID) andalso is_record(H, 'RequestedEvent') -> #'EventsDescriptor'{requestID = RID, eventList = EL}. cre_RequestedEvent(N) -> #'RequestedEvent'{pkgdName = N}. cre_RequestedEvent(N, [H|_] = EPL) - when list(N), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, evParList = EPL}; cre_RequestedEvent(N, EA) - when list(N), - record(EA, 'RequestedActions')-> + when is_list(N) andalso + is_record(EA, 'RequestedActions')-> #'RequestedEvent'{pkgdName = N, eventAction = EA}. cre_RequestedEvent(N, SID, [H|_] = EPL) - when list(N), - integer(SID), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, streamID = SID, evParList = EPL}; cre_RequestedEvent(N, EA, [H|_] = EPL) - when list(N), - record(EA, 'RequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(EA, 'RequestedActions') andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, eventAction = EA, evParList = EPL}. cre_RequestedEvent(N, SID, EA, [H|_] = EPL) - when list(N), - integer(SID), - record(EA, 'RequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(EA, 'RequestedActions') andalso + is_record(H, 'EventParameter') -> #'RequestedEvent'{pkgdName = N, streamID = SID, eventAction = EA, @@ -1114,45 +1128,45 @@ secondEvent = SE, signalsDescriptor = SD}. -cre_EventDM(N) when list(N) -> +cre_EventDM(N) when is_list(N) -> {digitMapName, N}; -cre_EventDM(V) when record(V, 'DigitMapValue') -> +cre_EventDM(V) when is_record(V, 'DigitMapValue') -> {digitMapValue, V}. cre_SecondEventsDescriptor([H|_] = EL) - when record(H, 'SecondRequestedEvent') -> + when is_record(H, 'SecondRequestedEvent') -> #'SecondEventsDescriptor'{eventList = EL}. cre_SecondEventsDescriptor(RID, [H|_] = EL) - when integer(RID), record(H, 'SecondRequestedEvent') -> + when is_integer(RID) andalso is_record(H, 'SecondRequestedEvent') -> #'SecondEventsDescriptor'{requestID = RID, eventList = EL}. cre_SecondRequestedEvent(N, [H|_] = EPL) - when list(N), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, evParList = EPL}. cre_SecondRequestedEvent(N, SID, [H|_] = EPL) - when list(N), - integer(SID), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, streamID = SID, evParList = EPL}; cre_SecondRequestedEvent(N, EA, [H|_] = EPL) - when list(N), - record(EA, 'SecondRequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_record(EA, 'SecondRequestedActions') andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, eventAction = EA, evParList = EPL}. cre_SecondRequestedEvent(N, SID, EA, [H|_] = EPL) - when list(N), - integer(SID), - record(EA, 'SecondRequestedActions'), - record(H, 'EventParameter') -> + when is_list(N) andalso + is_integer(SID) andalso + is_record(EA, 'SecondRequestedActions') andalso + is_record(H, 'EventParameter') -> #'SecondRequestedEvent'{pkgdName = N, streamID = SID, eventAction = EA, @@ -1164,9 +1178,9 @@ cre_SecondRequestedActions(KA) when ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) -> #'SecondRequestedActions'{keepActive = KA}; -cre_SecondRequestedActions(SD) when list(SD) -> +cre_SecondRequestedActions(SD) when is_list(SD) -> #'SecondRequestedActions'{signalsDescriptor = SD}; -cre_SecondRequestedActions({Tag, _} = EDM) when atom(Tag) -> +cre_SecondRequestedActions({Tag, _} = EDM) when is_atom(Tag) -> #'SecondRequestedActions'{eventDM = EDM}. cre_SecondRequestedActions(KA, SD) @@ -1186,32 +1200,32 @@ eventDM = EDM, signalsDescriptor = SD}. -cre_EventBufferDescriptor([H|_] = D) when record(H, 'EventSpec') -> +cre_EventBufferDescriptor([H|_] = D) when is_record(H, 'EventSpec') -> D. -cre_EventSpec(N, [H|_] = EPL) when list(N), record(H, 'EventParameter') -> +cre_EventSpec(N, [H|_] = EPL) when is_list(N) andalso is_record(H, 'EventParameter') -> #'EventSpec'{eventName = N, eventParList = EPL}. cre_EventSpec(N, SID, [H|_] = EPL) - when list(N), integer(SID), record(H, 'EventParameter') -> + when is_list(N) andalso is_integer(SID) andalso is_record(H, 'EventParameter') -> #'EventSpec'{eventName = N, streamID = SID, eventParList = EPL}. -cre_SignalsDescriptor(D) when list(D) -> +cre_SignalsDescriptor(D) when is_list(D) -> D. -cre_SignalRequest(S) when record(S, 'Signal') -> +cre_SignalRequest(S) when is_record(S, 'Signal') -> {signal, S}; -cre_SignalRequest(S) when record(S, 'SeqSigList') -> +cre_SignalRequest(S) when is_record(S, 'SeqSigList') -> {seqSigList, S}. cre_SeqSigList(ID, [H|_] = SL) - when integer(ID), 0 =< ID, ID =< 65535, record(H, 'Signal') -> + when is_integer(ID) andalso (0 =< ID) andalso (ID =< 65535) andalso is_record(H, 'Signal') -> #'SeqSigList'{id = ID, signalList = SL}. -cre_Signal(N) when list(N) -> +cre_Signal(N) when is_list(N) -> #'Signal'{signalName = N}. -cre_Signal(N, [H|_] = SPL) when list(N), record(H, 'SigParameter') -> +cre_Signal(N, [H|_] = SPL) when is_list(N) andalso is_record(H, 'SigParameter') -> #'Signal'{signalName = N, sigParList = SPL}. @@ -1243,7 +1257,7 @@ cre_SignalName(N) -> cre_PkgdName(N). -cre_NotifyCompletion(L) when list(L) -> +cre_NotifyCompletion(L) when is_list(L) -> Vals = [onTimeOut, onInterruptByEvent, onInterruptByNewSignalDescr, otherReason], F = fun(E) -> case lists:member(E, Vals) of @@ -1256,19 +1270,19 @@ lists:foreach(F, L), L. -cre_SigParameter(N, V) when list(N), list(V) -> +cre_SigParameter(N, V) when is_list(N) andalso is_list(V) -> #'SigParameter'{sigParameterName = N, value = V}. cre_SigParameter(N, V, relation = Tag, R) - when is_list(N) and is_list(V) and is_atom(R) -> + when is_list(N) andalso is_list(V) andalso is_atom(R) -> EI = {Tag, R}, #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI}; cre_SigParameter(N, V, range = Tag, B) - when is_list(N) and is_list(V) and is_atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI}; cre_SigParameter(N, V, sublist = Tag, B) - when is_list(N) and is_list(V) and is_atom(B) -> + when is_list(N) andalso is_list(V) andalso is_atom(B) -> EI = {Tag, B}, #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI}. @@ -1277,7 +1291,7 @@ cre_RequestID(Val) -> exit({invalid_RequestID, Val}). -cre_ModemDescriptor(MTL, MPL) when list(MTL), list(MPL) -> +cre_ModemDescriptor(MTL, MPL) when is_list(MTL) andalso is_list(MPL) -> #'ModemDescriptor'{mtl = MTL, mpl = MPL}. %% cre_ModemDescriptor(MTL, MPL, NSD) @@ -1306,18 +1320,18 @@ cre_DigitMapDescriptor() -> #'DigitMapDescriptor'{}. -cre_DigitMapDescriptor(N) when list(N) -> +cre_DigitMapDescriptor(N) when is_list(N) -> #'DigitMapDescriptor'{digitMapName = N}; -cre_DigitMapDescriptor(V) when record(V, 'DigitMapValue') -> +cre_DigitMapDescriptor(V) when is_record(V, 'DigitMapValue') -> #'DigitMapDescriptor'{digitMapValue = V}. -cre_DigitMapDescriptor(N, V) when list(N), record(V, 'DigitMapValue') -> +cre_DigitMapDescriptor(N, V) when is_list(N) andalso is_record(V, 'DigitMapValue') -> #'DigitMapDescriptor'{digitMapName = N, digitMapValue = V}. cre_DigitMapName(N) -> cre_Name(N). -cre_DigitMapValue(DMB) when list(DMB) -> +cre_DigitMapValue(DMB) when is_list(DMB) -> #'DigitMapValue'{digitMapBody = DMB}. cre_DigitMapValue(Start, Short, Long, DMB) -> @@ -1339,7 +1353,7 @@ digitMapBody = DMB, durationTimer = Dur}. -cre_ServiceChangeParm(M, R) when atom(M), list(R) -> +cre_ServiceChangeParm(M, R) when is_atom(M) andalso is_list(R) -> #'ServiceChangeParm'{serviceChangeMethod = M, serviceChangeReason = R}. @@ -1379,17 +1393,17 @@ end. cre_ServiceChangeAddress(portNumber = Tag, P) - when integer(P), 0 =< P, P =< 65535 -> + when is_integer(P) andalso (0 =< P) andalso (P =< 65535) -> {Tag, P}; -cre_ServiceChangeAddress(ip4Address = Tag, A) when record(A, 'IP4Address') -> +cre_ServiceChangeAddress(ip4Address = Tag, A) when is_record(A, 'IP4Address') -> {Tag, A}; -cre_ServiceChangeAddress(ip6Address = Tag, A) when record(A, 'IP6Address') -> +cre_ServiceChangeAddress(ip6Address = Tag, A) when is_record(A, 'IP6Address') -> {Tag, A}; -cre_ServiceChangeAddress(domainName = Tag, N) when record(N, 'DomainName') -> +cre_ServiceChangeAddress(domainName = Tag, N) when is_record(N, 'DomainName') -> {Tag, N}; -cre_ServiceChangeAddress(deviceName = Tag, N) when list(N) -> +cre_ServiceChangeAddress(deviceName = Tag, N) when is_list(N) -> {Tag, N}; -cre_ServiceChangeAddress(mtpAddress = Tag, A) when list(A) -> +cre_ServiceChangeAddress(mtpAddress = Tag, A) when is_list(A) -> {Tag, A}. cre_ServiceChangeResParm() -> @@ -1436,23 +1450,26 @@ cre_ServiceChangeProfile(N, 1). cre_ServiceChangeProfile(N, V) - when is_list(N) and is_integer(V) and (0 =< V) and (V =< 99) -> + when is_list(N) andalso is_integer(V) andalso (0 =< V) andalso (V =< 99) -> #'ServiceChangeProfile'{profileName = N, version = V}. -cre_PackagesDescriptor([H|_] = D) when record(H, 'PackagesItem') -> +cre_PackagesDescriptor([H|_] = D) when is_record(H, 'PackagesItem') -> D. -cre_PackagesItem(N, Ver) when list(N), integer(Ver), 0 =< Ver, Ver =< 99 -> +cre_PackagesItem(N, Ver) + when is_list(N) andalso + is_integer(Ver) andalso + (0 =< Ver) andalso (Ver =< 99) -> #'PackagesItem'{packageName = N, packageVersion = Ver}. -cre_StatisticsDescriptor([H|_] = D) when record(H, 'StatisticsParameter') -> +cre_StatisticsDescriptor([H|_] = D) when is_record(H, 'StatisticsParameter') -> D. -cre_StatisticsParameter(N) when list(N) -> +cre_StatisticsParameter(N) when is_list(N) -> #'StatisticsParameter'{statName = N}. -cre_StatisticsParameter(N, V) when list(N), list(V) -> +cre_StatisticsParameter(N, V) when is_list(N) andalso is_list(V) -> #'StatisticsParameter'{statName = N, statValue = V}. %% cre_NonStandardData({Tag, _} = Id, Data) when atom(Tag), list(Data) -> @@ -1476,10 +1493,10 @@ %% manufacturerCode = MC}. cre_TimeNotation(D, T) - when list(D), length(D) == 8, list(T), length(T) == 8 -> + when is_list(D) andalso (length(D) =:= 8) andalso is_list(T) andalso (length(T) =:= 8) -> #'TimeNotation'{date = D, time = T}. -cre_Value([H|_] = V) when list(H) -> +cre_Value([H|_] = V) when is_list(H) -> V. cre_BOOLEAN(true = B) -> @@ -1569,7 +1586,7 @@ is_Message(_) -> false. -chk_Message(M,M) when record(M,'Message') -> +chk_Message(M,M) when is_record(M,'Message') -> ok; chk_Message(#'Message'{version = V1, mId = MID1, @@ -2587,7 +2604,7 @@ lists:member(D, [bothway, isolate, oneway]). -chk_TopologyRequest(T, T) when record(T,'TopologyRequest') -> +chk_TopologyRequest(T, T) when is_record(T,'TopologyRequest') -> ok; chk_TopologyRequest(#'TopologyRequest'{terminationFrom = F1, terminationTo = T1, @@ -2658,7 +2675,7 @@ wrong_type('AmmRequest_descriptors', Descs). -chk_AmmRequest(R, R) when record(R, 'AmmRequest') -> +chk_AmmRequest(R, R) when is_record(R, 'AmmRequest') -> d("chk_AmmRequest -> entry when equal"), chk_type(fun is_AmmRequest/1, 'AmmRequest', R); chk_AmmRequest(#'AmmRequest'{terminationID = Tids1, @@ -5943,12 +5960,12 @@ %% -- ModemDescriptor -- -is_ModemDescriptor(D) when record(D, 'ModemDescriptor') -> +is_ModemDescriptor(D) when is_record(D, 'ModemDescriptor') -> true; is_ModemDescriptor(_) -> false. -chk_ModemDescriptor(D, D) when record(D, 'ModemDescriptor') -> +chk_ModemDescriptor(D, D) when is_record(D, 'ModemDescriptor') -> ok; chk_ModemDescriptor(#'ModemDescriptor'{mtl = MTL1, mpl = MPL1, @@ -6773,12 +6790,12 @@ end. -is_IA5String(S) when list(S) -> +is_IA5String(S) when is_list(S) -> true; is_IA5String(_) -> false. -is_IA5String(S, _) when list(S) -> +is_IA5String(S, _) when is_list(S) -> true; is_IA5String(_, _) -> false. @@ -6806,16 +6823,16 @@ is_OCTET_STRING(L) -> is_OCTET_STRING(L, any). -is_OCTET_STRING(L, any) when list(L) -> +is_OCTET_STRING(L, any) when is_list(L) -> true; -is_OCTET_STRING(L, {exact, Len}) when list(L), length(L) == Len -> +is_OCTET_STRING(L, {exact, Len}) when is_list(L) andalso (length(L) =:= Len) -> true; -is_OCTET_STRING(L, {atleast, Len}) when list(L), Len =< length(L) -> +is_OCTET_STRING(L, {atleast, Len}) when is_list(L) andalso (Len =< length(L)) -> true; -is_OCTET_STRING(L, {atmost, Len}) when list(L), length(L) =< Len -> +is_OCTET_STRING(L, {atmost, Len}) when is_list(L) andalso (length(L) =< Len) -> true; is_OCTET_STRING(L, {range, Min, Max}) - when list(L), Min =< length(L), length(L) =< Max -> + when is_list(L) andalso (Min =< length(L)) andalso (length(L) =< Max) -> true; is_OCTET_STRING(_, _) -> false. @@ -6868,16 +6885,20 @@ is_opt_INTEGER(I, R) -> is_OPTIONAL(fun(X) -> is_INTEGER(X, R) end, I). -is_INTEGER(I, any) when integer(I) -> +is_INTEGER(I, any) when is_integer(I) -> true; -is_INTEGER(I, {exact, I}) when integer(I) -> +is_INTEGER(I, {exact, I}) when is_integer(I) -> true; -is_INTEGER(I, {atleast, Min}) when integer(I), integer(Min), Min =< I -> +is_INTEGER(I, {atleast, Min}) when is_integer(I) andalso is_integer(Min) andalso (Min =< I) -> true; -is_INTEGER(I, {atmost, Max}) when integer(I), integer(Max), I =< Max -> +is_INTEGER(I, {atmost, Max}) when is_integer(I) andalso is_integer(Max) andalso (I =< Max) -> true; is_INTEGER(I, {range, Min, Max}) - when integer(I), integer(Min), integer(Max), Min =< I, I =< Max -> + when is_integer(I) andalso + is_integer(Min) andalso + is_integer(Max) andalso + (Min =< I) andalso + (I =< Max) -> true; is_INTEGER(_, _) -> false. @@ -6911,7 +6932,7 @@ []. -validate(F, Type) when function(F) -> +validate(F, Type) when is_function(F) -> case (catch F()) of {error, Reason} -> error({Type, Reason}); @@ -6920,7 +6941,7 @@ end. -chk_type(F, T, V) when function(F), atom(T) -> +chk_type(F, T, V) when is_function(F) andalso is_atom(T) -> case F(V) of true -> ok; @@ -6928,7 +6949,7 @@ wrong_type(T, V) end. -chk_type(F, T, V1, V2) when function(F), atom(T) -> +chk_type(F, T, V1, V2) when is_function(F) andalso is_atom(T) -> case F(V1, V2) of true -> ok; @@ -6939,26 +6960,26 @@ is_OPTIONAL(_, asn1_NOVALUE) -> true; -is_OPTIONAL(F, Val) when function(F) -> +is_OPTIONAL(F, Val) when is_function(F) -> F(Val). chk_OPTIONAL(_, asn1_NOVALUE, asn1_NOVALUE, _, _) -> ok; -chk_OPTIONAL(Type, asn1_NOVALUE = V1, V2, IS, _CHK) when function(IS) -> +chk_OPTIONAL(Type, asn1_NOVALUE = V1, V2, IS, _CHK) when is_function(IS) -> case IS(V2) of true -> not_equal(Type, V1, V2); false -> wrong_type(Type, V1, V2) end; -chk_OPTIONAL(Type, V1, asn1_NOVALUE = V2, IS, _CHK) when function(IS) -> +chk_OPTIONAL(Type, V1, asn1_NOVALUE = V2, IS, _CHK) when is_function(IS) -> case IS(V1) of true -> not_equal(Type, V1, V2); false -> wrong_type(Type, V1, V2) end; -chk_OPTIONAL(_Type, V1, V2, _IS, CHK) when function(CHK) -> +chk_OPTIONAL(_Type, V1, V2, _IS, CHK) when is_function(CHK) -> CHK(V1, V2). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_v3_lib.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_v3_lib.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_test_msg_v3_lib.erl 2009-03-12 12:32:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_test_msg_v3_lib.erl 2009-09-18 15:13:29.000000000 +0100 @@ -307,7 +307,7 @@ cre_ErrorCode(C) -> exit({invalid_ErrorCode, C}). -cre_ErrorText(T) when list(T) -> +cre_ErrorText(T) when is_list(T) -> T. cre_ContextID(Val) when (0 =< Val) and (Val =< 4294967295) -> @@ -474,9 +474,9 @@ commandReply = CmdReps}. cre_ActionReply(CtxID, ED, CtxReq, CmdReps) - when is_integer(CtxID) and - (is_record(ED, 'ErrorDescriptor') or (ED == asn1_NOVALUE)) and - (is_record(CtxReq, 'ContextRequest') or (CtxReq == asn1_NOVALUE)) and + when is_integer(CtxID) andalso + (is_record(ED, 'ErrorDescriptor') orelse (ED =:= asn1_NOVALUE)) andalso + (is_record(CtxReq, 'ContextRequest') orelse (CtxReq =:= asn1_NOVALUE)) andalso is_list(CmdReps) -> #'ActionReply'{contextId = CtxID, errorDescriptor = ED, @@ -487,50 +487,50 @@ strip_ContextRequest(#'ContextRequest'{}). cre_ContextRequest(Prio) - when is_integer(Prio) and (0 =< Prio) and (Prio =< 15) -> + when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) -> strip_ContextRequest(#'ContextRequest'{priority = Prio}); cre_ContextRequest(Em) - when (Em == true) or (Em == false) or (Em == asn1_NOVALUE) -> + when (Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE) -> strip_ContextRequest(#'ContextRequest'{emergency = Em}); -cre_ContextRequest(Top) when list(Top) -> +cre_ContextRequest(Top) when is_list(Top) -> strip_ContextRequest(#'ContextRequest'{topologyReq = Top}). cre_ContextRequest(Prio, Em) - when (is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) and - ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) -> + when (is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15)) andalso + ((Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE)) -> CR = #'ContextRequest'{priority = Prio, emergency = Em}, strip_ContextRequest(CR); cre_ContextRequest(Prio, Top) - when is_integer(Prio) and (0 =< Prio) and (Prio =< 15) and is_list(Top) -> + when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) andalso is_list(Top) -> CR = #'ContextRequest'{priority = Prio, topologyReq = Top}, strip_ContextRequest(CR). cre_ContextRequest(Prio, Em, Top) - when (is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) and - ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and - (is_list(Top) or (Top == asn1_NOVALUE)) -> + when (is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15)) andalso + ((Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE)) andalso + (is_list(Top) orelse (Top == asn1_NOVALUE)) -> CR = #'ContextRequest'{priority = Prio, emergency = Em, topologyReq = Top}, strip_ContextRequest(CR). cre_ContextRequest(Prio, Em, Top, Ieps) - when (is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) and - ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and - (is_list(Top) or (Top == asn1_NOVALUE)) and - ((Ieps == true) or (Ieps == false)) -> + when (is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15)) andalso + ((Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE)) andalso + (is_list(Top) orelse (Top =:= asn1_NOVALUE)) andalso + ((Ieps =:= true) orelse (Ieps =:= false)) -> CR = #'ContextRequest'{priority = Prio, emergency = Em, topologyReq = Top, iepscallind = Ieps}, strip_ContextRequest(CR); cre_ContextRequest(Prio, Em, Top, Ctx) - when ((is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) or - (Prio == asn1_NOVALUE)) and - ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and - (is_list(Top) or (Top == asn1_NOVALUE)) and + when ((is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15)) or + (Prio =:= asn1_NOVALUE)) andalso + ((Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE)) andalso + (is_list(Top) orelse (Top =:= asn1_NOVALUE)) andalso (is_list(Ctx)) -> CR = case context_list_or_prop(Ctx) of @@ -548,11 +548,11 @@ strip_ContextRequest(CR). cre_ContextRequest(Prio, Em, Top, Ieps, Ctx) - when ((is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) or - (Prio == asn1_NOVALUE)) and - ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and - (is_list(Top) or (Top == asn1_NOVALUE)) and - ((Ieps == true) or (Ieps == false) or (Ieps == asn1_NOVALUE)) and + when ((is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15)) orelse + (Prio =:= asn1_NOVALUE)) andalso + ((Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE)) andalso + (is_list(Top) orelse (Top =:= asn1_NOVALUE)) andalso + ((Ieps =:= true) orelse (Ieps =:= false) orelse (Ieps =:= asn1_NOVALUE)) andalso (is_list(Ctx)) -> CR = case context_list_or_prop(Ctx) of @@ -572,13 +572,13 @@ strip_ContextRequest(CR). cre_ContextRequest(Prio, Em, Top, Ieps, CtxProp, CtxList) - when ((is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) or - (Prio == asn1_NOVALUE)) and - ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and - (is_list(Top) or (Top == asn1_NOVALUE)) and - ((Ieps == true) or (Ieps == false) or (Ieps == asn1_NOVALUE)) and - (is_list(CtxProp) or (CtxProp == asn1_NOVALUE)) and - (is_list(CtxList) or (CtxList == asn1_NOVALUE)) -> + when ((is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15)) orelse + (Prio =:= asn1_NOVALUE)) andalso + ((Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE)) andalso + (is_list(Top) orelse (Top =:= asn1_NOVALUE)) andalso + ((Ieps =:= true) orelse (Ieps =:= false) orelse (Ieps =:= asn1_NOVALUE)) andalso + (is_list(CtxProp) orelse (CtxProp =:= asn1_NOVALUE)) andalso + (is_list(CtxList) orelse (CtxList =:= asn1_NOVALUE)) -> CR = #'ContextRequest'{priority = Prio, emergency = Em, topologyReq = Top, @@ -603,9 +603,9 @@ What; context_list_or_prop([H|T], What) -> case is_ContextID(H) of - true when (What == contextList) -> + true when (What =:= contextList) -> context_list_or_prop(T, What); - false when (What == contextProp) -> + false when (What =:= contextProp) -> context_list_or_prop(T, What); _ -> error({invalid_contextListOrProp, H, What}) @@ -637,19 +637,19 @@ strip_ContextAttrAuditRequest(#'ContextAttrAuditRequest'{}). cre_ContextAttrAuditRequest(Top, Em, Prio) - when ((Top == 'NULL') or (Top == asn1_NOVALUE)) and - ((Em == 'NULL') or (Em == asn1_NOVALUE)) and - ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) -> + when ((Top =:= 'NULL') orelse (Top =:= asn1_NOVALUE)) andalso + ((Em =:= 'NULL') orelse (Em =:= asn1_NOVALUE)) andalso + ((Prio =:= 'NULL') orelse (Prio =:= asn1_NOVALUE)) -> CAAR = #'ContextAttrAuditRequest'{topology = Top, emergency = Em, priority = Prio}, strip_ContextAttrAuditRequest(CAAR). cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps) - when ((Top == 'NULL') or (Top == asn1_NOVALUE)) and - ((Em == 'NULL') or (Em == asn1_NOVALUE)) and - ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and - ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) -> + when ((Top =:= 'NULL') orelse (Top =:= asn1_NOVALUE)) andalso + ((Em =:= 'NULL') orelse (Em =:= asn1_NOVALUE)) andalso + ((Prio =:= 'NULL') orelse (Prio =:= asn1_NOVALUE)) andalso + ((Ieps =:= 'NULL') orelse (Ieps =:= asn1_NOVALUE)) -> CAAR = #'ContextAttrAuditRequest'{topology = Top, emergency = Em, priority = Prio, @@ -657,11 +657,11 @@ strip_ContextAttrAuditRequest(CAAR). cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps, Ctx) - when ((Top == 'NULL') or (Top == asn1_NOVALUE)) and - ((Em == 'NULL') or (Em == asn1_NOVALUE)) and - ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and - ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) and - (is_list(Ctx) or (Ctx == asn1_NOVALUE)) -> + when ((Top =:= 'NULL') orelse (Top =:= asn1_NOVALUE)) andalso + ((Em =:= 'NULL') orelse (Em =:= asn1_NOVALUE)) andalso + ((Prio =:= 'NULL') orelse (Prio =:= asn1_NOVALUE)) andalso + ((Ieps =:= 'NULL') orelse (Ieps =:= asn1_NOVALUE)) andalso + (is_list(Ctx) orelse (Ctx =:= asn1_NOVALUE)) -> CAAR = #'ContextAttrAuditRequest'{topology = Top, emergency = Em, priority = Prio, @@ -670,13 +670,13 @@ strip_ContextAttrAuditRequest(CAAR). cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps, Ctx, SelPrio) - when ((Top == 'NULL') or (Top == asn1_NOVALUE)) and - ((Em == 'NULL') or (Em == asn1_NOVALUE)) and - ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and - ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) and - (is_list(Ctx) or (Ctx == asn1_NOVALUE)) and - ((is_integer(SelPrio) and ((0 =< SelPrio) and (SelPrio =< 15))) or - (SelPrio == asn1_NOVALUE)) -> + when ((Top =:= 'NULL') orelse (Top =:= asn1_NOVALUE)) andalso + ((Em =:= 'NULL') orelse (Em =:= asn1_NOVALUE)) andalso + ((Prio =:= 'NULL') orelse (Prio =:= asn1_NOVALUE)) andalso + ((Ieps =:= 'NULL') orelse (Ieps =:= asn1_NOVALUE)) andalso + (is_list(Ctx) orelse (Ctx =:= asn1_NOVALUE)) andalso + ((is_integer(SelPrio) andalso ((0 =< SelPrio) and (SelPrio =< 15))) orelse + (SelPrio =:= asn1_NOVALUE)) -> CAAR = #'ContextAttrAuditRequest'{topology = Top, emergency = Em, priority = Prio, @@ -686,14 +686,14 @@ strip_ContextAttrAuditRequest(CAAR). cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps, Ctx, SelPrio, SelLog) - when ((Top == 'NULL') or (Top == asn1_NOVALUE)) and - ((Em == 'NULL') or (Em == asn1_NOVALUE)) and - ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and - ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) and - (is_list(Ctx) or (Ctx == asn1_NOVALUE)) and - ((is_integer(SelPrio) and ((0 =< SelPrio) and (SelPrio =< 15))) or - (SelPrio == asn1_NOVALUE)) -> - case ((SelLog == asn1_NOVALUE) orelse is_SelectLogic(SelLog)) of + when ((Top =:= 'NULL') orelse (Top =:= asn1_NOVALUE)) andalso + ((Em =:= 'NULL') orelse (Em =:= asn1_NOVALUE)) andalso + ((Prio =:= 'NULL') orelse (Prio =:= asn1_NOVALUE)) andalso + ((Ieps =:= 'NULL') orelse (Ieps =:= asn1_NOVALUE)) andalso + (is_list(Ctx) orelse (Ctx =:= asn1_NOVALUE)) andalso + ((is_integer(SelPrio) andalso ((0 =< SelPrio) andalso (SelPrio =< 15))) orelse + (SelPrio =:= asn1_NOVALUE)) -> + case ((SelLog =:= asn1_NOVALUE) orelse is_SelectLogic(SelLog)) of true -> CAAR = #'ContextAttrAuditRequest'{topology = Top, emergency = Em, @@ -1282,24 +1282,24 @@ observedEventsDescriptor = D}. cre_NotifyRequest(TermIDs, D, ED) - when is_list(TermIDs) and - is_record(D, 'ObservedEventsDescriptor') and + when is_list(TermIDs) andalso + is_record(D, 'ObservedEventsDescriptor') andalso is_record(ED, 'ErrorDescriptor') -> #'NotifyRequest'{terminationID = TermIDs, observedEventsDescriptor = D, errorDescriptor = ED}. -cre_NotifyReply(TermIDs) when list(TermIDs) -> +cre_NotifyReply(TermIDs) when is_list(TermIDs) -> #'NotifyReply'{terminationID = TermIDs}. cre_NotifyReply(TermIDs, ED) - when is_list(TermIDs) and + when is_list(TermIDs) andalso is_record(ED, 'ErrorDescriptor') -> #'NotifyReply'{terminationID = TermIDs, errorDescriptor = ED}. cre_ObservedEventsDescriptor(RID, [H|_] = L) - when is_integer(RID) and is_record(H, 'ObservedEvent') -> + when is_integer(RID) andalso is_record(H, 'ObservedEvent') -> #'ObservedEventsDescriptor'{requestId = RID, observedEventLst = L}. @@ -1370,7 +1370,7 @@ #'ServiceChangeReply'{terminationID = TermIDs, serviceChangeResult = SCR}. -cre_ServiceChangeResult(ED) when record(ED, 'ErrorDescriptor') -> +cre_ServiceChangeResult(ED) when is_record(ED, 'ErrorDescriptor') -> {errorDescriptor, ED}; cre_ServiceChangeResult(SCRP) when is_record(SCRP, 'ServiceChangeResParm') -> {serviceChangeResParms, SCRP}. @@ -1378,12 +1378,12 @@ %% cre_WildcardField(L) when list(L), length(L) == 1 -> L. cre_TerminationID(W, ID) - when is_list(W) and - is_list(ID) and (1 =< length(ID)) and (length(ID) =< 8) -> + when is_list(W) andalso + is_list(ID) andalso (1 =< length(ID)) andalso (length(ID) =< 8) -> #'TerminationID'{wildcard = W, id = ID}. -cre_TerminationIDList(L) when list(L) -> +cre_TerminationIDList(L) when is_list(L) -> L. cre_MediaDescriptor() -> diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_timer_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_timer_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_timer_test.erl 2009-03-12 12:32:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_timer_test.erl 2009-09-18 15:13:31.000000000 +0100 @@ -129,7 +129,7 @@ []; simple_init(doc) -> []; -simple_init(Config) when list(Config) -> +simple_init(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, si), put(sname, "TEST"), @@ -243,7 +243,7 @@ []; simple_usage(doc) -> []; -simple_usage(Config) when list(Config) -> +simple_usage(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, su), put(sname, "TEST"), @@ -335,7 +335,7 @@ []; integer_timer_start_and_expire(doc) -> []; -integer_timer_start_and_expire(Config) when list(Config) -> +integer_timer_start_and_expire(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, itsae), put(sname, "TEST"), @@ -361,7 +361,7 @@ []; integer_timer_start_and_stop(doc) -> []; -integer_timer_start_and_stop(Config) when list(Config) -> +integer_timer_start_and_stop(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(tc, itsas), put(sname, "TEST"), diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_trans_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_trans_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_trans_test.erl 2009-03-12 12:31:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_trans_test.erl 2009-09-18 15:13:03.000000000 +0100 @@ -175,7 +175,7 @@ []; single_ack(doc) -> []; -single_ack(Config) when list(Config) -> +single_ack(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, single_ack), @@ -326,7 +326,7 @@ []; multi_ack_maxcount(doc) -> []; -multi_ack_maxcount(Config) when list(Config) -> +multi_ack_maxcount(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_ack_maxcount), @@ -411,7 +411,7 @@ []; single_trans_req(doc) -> []; -single_trans_req(Config) when list(Config) -> +single_trans_req(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, single_trans_req), @@ -691,7 +691,7 @@ -else. -define(str_mg_connect_verify_fun(), fun str_mg_verify_handle_connect/1). --define(str_mg_service_change_reply_verify_fun(Mid), +-define(str_mg_service_change_reply_verify_fun(), fun str_mg_verify_service_change_reply/1). -define(str_mg_notify_reply_verify_fun(), fun str_mg_verify_notify_reply/1). @@ -846,7 +846,7 @@ []; multi_trans_req_timeout(doc) -> []; -multi_trans_req_timeout(Config) when list(Config) -> +multi_trans_req_timeout(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_timeout), @@ -1292,7 +1292,7 @@ []; multi_trans_req_maxcount1(doc) -> "Test that a message is sent when req_maxcount is reached"; -multi_trans_req_maxcount1(Config) when list(Config) -> +multi_trans_req_maxcount1(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_maxcount1), @@ -1744,7 +1744,7 @@ multi_trans_req_maxcount2(doc) -> "Test that the message is sent when req_maxcount is reached " "with a request bigger then maxsize limit"; -multi_trans_req_maxcount2(Config) when list(Config) -> +multi_trans_req_maxcount2(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_maxcount2), @@ -2248,7 +2248,7 @@ []; multi_trans_req_maxsize1(doc) -> "Test that the message is sent when req_maxsize is reached"; -multi_trans_req_maxsize1(Config) when list(Config) -> +multi_trans_req_maxsize1(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_maxsize1), @@ -2700,7 +2700,7 @@ multi_trans_req_maxsize2(doc) -> "Test that the message is sent when req_maxsize is reached, " "when the 'last' message is bigger then req_maxsize itself"; -multi_trans_req_maxsize2(Config) when list(Config) -> +multi_trans_req_maxsize2(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_maxsize2), @@ -3194,7 +3194,7 @@ []; single_trans_req_and_ack(doc) -> []; -single_trans_req_and_ack(Config) when list(Config) -> +single_trans_req_and_ack(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, single_trans_req_and_ack), @@ -3675,7 +3675,7 @@ []; multi_trans_req_and_ack_timeout(doc) -> []; -multi_trans_req_and_ack_timeout(Config) when list(Config) -> +multi_trans_req_and_ack_timeout(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_and_ack_timeout), @@ -4166,7 +4166,7 @@ []; multi_trans_req_and_ack_ackmaxcount(doc) -> []; -multi_trans_req_and_ack_ackmaxcount(Config) when list(Config) -> +multi_trans_req_and_ack_ackmaxcount(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_and_ack_ackmaxcount), @@ -4664,7 +4664,7 @@ []; multi_trans_req_and_ack_reqmaxcount(doc) -> []; -multi_trans_req_and_ack_reqmaxcount(Config) when list(Config) -> +multi_trans_req_and_ack_reqmaxcount(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_and_ack_reqmaxcount), @@ -5161,7 +5161,7 @@ []; multi_trans_req_and_ack_maxsize1(doc) -> []; -multi_trans_req_and_ack_maxsize1(Config) when list(Config) -> +multi_trans_req_and_ack_maxsize1(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_and_ack_maxsize1), @@ -5657,7 +5657,7 @@ []; multi_trans_req_and_ack_maxsize2(doc) -> []; -multi_trans_req_and_ack_maxsize2(Config) when list(Config) -> +multi_trans_req_and_ack_maxsize2(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_and_ack_maxsize2), @@ -6176,7 +6176,7 @@ []; single_trans_req_and_pending(doc) -> []; -single_trans_req_and_pending(Config) when list(Config) -> +single_trans_req_and_pending(Config) when is_list(Config) -> ?SKIP(not_yet_implemented). @@ -6186,7 +6186,7 @@ []; multi_trans_req_and_pending(doc) -> []; -multi_trans_req_and_pending(Config) when list(Config) -> +multi_trans_req_and_pending(Config) when is_list(Config) -> ?SKIP(not_yet_implemented). @@ -6196,7 +6196,7 @@ []; multi_trans_req_and_ack_and_pending(doc) -> []; -multi_trans_req_and_ack_and_pending(Config) when list(Config) -> +multi_trans_req_and_ack_and_pending(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, mtraaap), @@ -6764,7 +6764,7 @@ []; multi_ack_and_pending(doc) -> []; -multi_ack_and_pending(Config) when list(Config) -> +multi_ack_and_pending(Config) when is_list(Config) -> ?SKIP(not_yet_implemented). @@ -6774,7 +6774,7 @@ []; multi_trans_req_and_reply(doc) -> []; -multi_trans_req_and_reply(Config) when list(Config) -> +multi_trans_req_and_reply(Config) when is_list(Config) -> ?SKIP(not_yet_implemented). @@ -6784,7 +6784,7 @@ []; multi_trans_req_and_ack_and_reply(doc) -> []; -multi_trans_req_and_ack_and_reply(Config) when list(Config) -> +multi_trans_req_and_ack_and_reply(Config) when is_list(Config) -> put(verbosity, ?TEST_VERBOSITY), put(sname, "TEST"), put(tc, multi_trans_req_and_ack_and_reply), @@ -7357,7 +7357,7 @@ []; multi_ack_and_reply(doc) -> []; -multi_ack_and_reply(Config) when list(Config) -> +multi_ack_and_reply(Config) when is_list(Config) -> ?SKIP(not_yet_implemented). @@ -9106,19 +9106,19 @@ #'NotifyRequest'{terminationID = Tid, observedEventsDescriptor = EvsDesc}. -cre_command(R) when record(R, 'NotifyRequest') -> +cre_command(R) when is_record(R, 'NotifyRequest') -> {notifyReq, R}; -cre_command(R) when record(R, 'ServiceChangeRequest') -> +cre_command(R) when is_record(R, 'ServiceChangeRequest') -> {serviceChangeReq, R}. cre_cmdReq(Cmd) -> #'CommandRequest'{command = Cmd}. -cre_actionReq(CtxId, CmdReqs) when list(CmdReqs) -> +cre_actionReq(CtxId, CmdReqs) when is_list(CmdReqs) -> #'ActionRequest'{contextId = CtxId, commandRequests = CmdReqs}. -cre_transReq(TransId, ARs) when list(ARs) -> +cre_transReq(TransId, ARs) when is_list(ARs) -> #'TransactionRequest'{transactionId = TransId, actions = ARs}. @@ -9127,18 +9127,18 @@ cre_serviceChangeResParm(Mid) -> #'ServiceChangeResParm'{serviceChangeMgcId = Mid}. -cre_serviceChangeResult(SCRP) when record(SCRP, 'ServiceChangeResParm') -> +cre_serviceChangeResult(SCRP) when is_record(SCRP, 'ServiceChangeResParm') -> {serviceChangeResParms, SCRP}; -cre_serviceChangeResult(ED) when record(ED, 'ErrorDescriptor') -> +cre_serviceChangeResult(ED) when is_record(ED, 'ErrorDescriptor') -> {errorDescriptor, ED}. cre_serviceChangeReply(Tid, Res) -> #'ServiceChangeReply'{terminationID = Tid, serviceChangeResult = Res}. -cre_cmdReply(R) when record(R, 'NotifyReply') -> +cre_cmdReply(R) when is_record(R, 'NotifyReply') -> {notifyReply, R}; -cre_cmdReply(R) when record(R, 'ServiceChangeReply') -> +cre_cmdReply(R) when is_record(R, 'ServiceChangeReply') -> {serviceChangeReply, R}. cre_notifyReply(Tid) -> @@ -9148,9 +9148,9 @@ #'ActionReply'{contextId = CtxId, commandReply = CmdRep}. -cre_transResult(ED) when record(ED, 'ErrorDescriptor') -> +cre_transResult(ED) when is_record(ED, 'ErrorDescriptor') -> {transactionError, ED}; -cre_transResult([AR|_] = ARs) when record(AR, 'ActionReply') -> +cre_transResult([AR|_] = ARs) when is_record(AR, 'ActionReply') -> {actionReplies, ARs}. cre_transReply(TransId, Res) -> @@ -9160,20 +9160,20 @@ %% -- -cre_serviceChangeProf(Name, Ver) when list(Name), integer(Ver) -> +cre_serviceChangeProf(Name, Ver) when is_list(Name) andalso is_integer(Ver) -> #'ServiceChangeProfile'{profileName = Name, version = Ver}. -cre_transaction(Trans) when record(Trans, 'TransactionRequest') -> +cre_transaction(Trans) when is_record(Trans, 'TransactionRequest') -> {transactionRequest, Trans}; -cre_transaction(Trans) when record(Trans, 'TransactionPending') -> +cre_transaction(Trans) when is_record(Trans, 'TransactionPending') -> {transactionPending, Trans}; -cre_transaction(Trans) when record(Trans, 'TransactionReply') -> +cre_transaction(Trans) when is_record(Trans, 'TransactionReply') -> {transactionReply, Trans}; -cre_transaction(Trans) when record(Trans, 'TransactionAck') -> +cre_transaction(Trans) when is_record(Trans, 'TransactionAck') -> {transactionResponseAck, Trans}. -cre_transactions(Trans) when list(Trans) -> +cre_transactions(Trans) when is_list(Trans) -> {transactions, Trans}. cre_message(Version, Mid, Body) -> @@ -9213,7 +9213,7 @@ await_ack(_User, 0, Timeout, _Expected) -> d("await_ack -> done when Timeout = ~p", [Timeout]), ok; -await_ack(User, N, Timeout, Expected) when N > 0, integer(Timeout) -> +await_ack(User, N, Timeout, Expected) when (N > 0) andalso is_integer(Timeout) -> d("await_ack -> entry with N: ~p, Timeout: ~p", [N,Timeout]), T = tim(), receive @@ -9240,7 +9240,7 @@ await_req(_User, 0, Timeout) -> d("await_req -> done when Timeout = ~p", [Timeout]), ok; -await_req(User, N, Timeout) when N > 0, integer(Timeout) -> +await_req(User, N, Timeout) when (N > 0) andalso is_integer(Timeout) -> d("await_req -> entry with N: ~p, Timeout: ~p", [N,Timeout]), T = tim(), receive @@ -9262,7 +9262,7 @@ await_req1(N, []) when N >= 0 -> N; -await_req1(N, [AR|ARs]) when N > 0, record(AR, 'ActionRequest') -> +await_req1(N, [AR|ARs]) when (N > 0) andalso is_record(AR, 'ActionRequest') -> await_req1(N-1, ARs); await_req1(N, ARs) -> exit({unexpected_req_result, N, ARs}). diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/megaco_udp_test.erl erlang-13.b.3-dfsg/lib/megaco/test/megaco_udp_test.erl --- erlang-13.b.1-dfsg/lib/megaco/test/megaco_udp_test.erl 2009-03-12 12:30:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/megaco_udp_test.erl 2009-09-18 15:12:47.000000000 +0100 @@ -332,7 +332,7 @@ []; sendreceive(doc) -> ["Test send and receive with the UDP transport. "]; -sendreceive(Config) when list(Config) -> +sendreceive(Config) when is_list(Config) -> put(sname, "sendreceive"), p("BEGIN TEST-CASE"), @@ -368,7 +368,8 @@ {'EXIT', Server, {skip, Reason}} -> ?SKIP(Reason); {'EXIT', Client, {skip, Reason}} -> - ?SKIP(Reason) after 5000 -> + ?SKIP(Reason) + after 5000 -> {error, server_timeout} end, diff -Nru erlang-13.b.1-dfsg/lib/megaco/test/modules.mk erlang-13.b.3-dfsg/lib/megaco/test/modules.mk --- erlang-13.b.1-dfsg/lib/megaco/test/modules.mk 2009-03-12 12:30:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/megaco/test/modules.mk 2009-11-20 08:48:33.000000000 +0000 @@ -47,6 +47,7 @@ megaco_load_test \ megaco_mess_test \ megaco_mess_user_test \ + megaco_mess_otp8212_test \ megaco_mib_test \ megaco_mreq_test \ megaco_pending_limit_test \ diff -Nru erlang-13.b.1-dfsg/lib/megaco/vsn.mk erlang-13.b.3-dfsg/lib/megaco/vsn.mk --- erlang-13.b.1-dfsg/lib/megaco/vsn.mk 2009-06-05 13:55:42.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/megaco/vsn.mk 2009-11-20 13:37:06.000000000 +0000 @@ -17,11 +17,21 @@ # # %CopyrightEnd% -MEGACO_VSN = 3.11 +MEGACO_VSN = 3.13 PRE_VSN = APP_VSN = "megaco-$(MEGACO_VSN)$(PRE_VSN)" -TICKETS = OTP-7302 OTP-7995 +TICKETS = OTP-8205 OTP-8239 OTP-8249 + +TICKETS_3_12 = OTP-8183 OTP-8212 + +TICKETS_3_11_3 = OTP-8164 OTP-8167 OTP-8191 + +TICKETS_3_11_2 = OTP-8123 + +TICKETS_3_11_1 = OTP-8081 OTP-8114 + +TICKETS_3_11 = OTP-7302 OTP-7995 TICKETS_3_10_1 = OTP-7926 OTP-7936 diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/book.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/book.xml 2007-11-26 13:08:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/book.xml 2009-11-20 13:36:04.000000000 +0000 @@ -1,29 +1,27 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - Mnesia Database Management System (MNESIA) + Mnesia Claes Wikström, Hans Nilsson and Håkan Mattsson 1997-05-27 @@ -37,11 +35,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Makefile erlang-13.b.3-dfsg/lib/mnesia/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Makefile 2009-03-12 12:28:11.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Makefile 2009-11-20 13:36:04.000000000 +0000 @@ -26,17 +26,20 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(MNESIA_VSN) +APPLICATION=mnesia # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- +ifndef DOCSUPPORT include make.dep +endif # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/mnesia-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -68,6 +71,11 @@ BOOK_FILES = book.xml + +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + GIF_FILES = \ book.gif \ company.gif \ @@ -97,6 +105,13 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ @@ -104,8 +119,8 @@ TEX_FILES_USERS_GUIDE = \ $(XML_CHAPTER_FILES:%.xml=%.tex) -TOP_PDF_FILE = mnesia-$(VSN).pdf -TOP_PS_FILE = mnesia-$(VSN).ps +TOP_PDF_FILE = $(APPLICATION)-$(VSN).pdf +TOP_PS_FILE = $(APPLICATION)-$(VSN).ps $(TOP_PDF_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ @@ -113,6 +128,8 @@ $(TOP_PS_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +endif + # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- @@ -125,6 +142,24 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ +ifdef DOCSUPPORT + +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + +else + ifeq ($(DOCTYPE),pdf) docs: pdf else @@ -141,6 +176,15 @@ html: $(HTML_FILES) + +clean clean_docs clean_tex: + rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) + rm -f $(HTML_FILES) $(MAN3_FILES) + rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) + rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) + +endif + man: $(MAN3_FILES) gifs: $(GIF_FILES:%=$(HTMLDIR)/%) @@ -150,17 +194,25 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) - # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + +else + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -181,5 +233,8 @@ endif endif +endif + + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_A.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_A.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_A.xml 2007-11-26 13:08:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_A.xml 2009-11-20 13:36:00.000000000 +0000 @@ -4,23 +4,21 @@
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Appendix A: Mnesia Error Messages @@ -31,7 +29,7 @@ Bjarne Däcker 96-11-20 B - Mnesia_App_A.sgml + Mnesia_App_A.xml

    Whenever an operation returns an error in Mnesia, a description of the error is available. For example, the functions diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_B.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_B.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_B.xml 2007-11-26 13:08:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_B.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,43 +0,0 @@ - - - - -

    - - 1997 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Appendix B: The Backup Call Back Interface - Claes Wikström, Hans Nilsson and Håkan Mattsson - Bjarne Däcker - - Bjarne Däcker - Bjarne Däcker - 97-05-27 - C - mnesiaab.sgm -
    - -
    - mnesia_backup callback behavior -

    - -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_B.xmlsrc erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_B.xmlsrc --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_B.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_B.xmlsrc 2009-11-20 13:36:00.000000000 +0000 @@ -0,0 +1,41 @@ + + + + +
    + + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Appendix B: The Backup Call Back Interface + Claes Wikström, Hans Nilsson and Håkan Mattsson + Bjarne Däcker + + Bjarne Däcker + Bjarne Däcker + 97-05-27 + C + Mnesia_App_B.xml +
    + +
    + mnesia_backup callback behavior +

    + +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_C.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_C.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_C.xml 2007-11-26 13:08:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_C.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,45 +0,0 @@ - - - - -
    - - 1998 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Appendix C: The Activity Access Call Back Interface - Håkan Mattsson - - - - - - - -
    - -
    - mnesia_access callback behavior -

    - -

    - -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_C.xmlsrc erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_C.xmlsrc --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_C.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_C.xmlsrc 2009-11-20 13:36:20.000000000 +0000 @@ -0,0 +1,43 @@ + + + + +
    + + 19982009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Appendix C: The Activity Access Call Back Interface + Håkan Mattsson + + + + + + + Mnesia_App_C.xml +
    + +
    + mnesia_access callback behavior +

    + +

    + +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_D.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_D.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_D.xml 2007-11-26 13:10:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_D.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,45 +0,0 @@ - - - - -
    - - 2002 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Appendix D: The Fragmented Table Hashing Call Back Interface - Håkan Mattsson - - - - - - - -
    - -
    - mnesia_frag_hash callback behavior -

    - -

    - -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_D.xmlsrc erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_D.xmlsrc --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_App_D.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_App_D.xmlsrc 2009-11-20 13:37:21.000000000 +0000 @@ -0,0 +1,43 @@ + + + + +
    + + 20022009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Appendix D: The Fragmented Table Hashing Call Back Interface + Håkan Mattsson + + + + + + + Mnesia_App_D.xml +
    + +
    + mnesia_frag_hash callback behavior +

    + +

    + +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap1.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap1.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap1.xml 2007-11-26 13:08:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap1.xml 2009-11-20 13:36:00.000000000 +0000 @@ -4,23 +4,21 @@
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Introduction @@ -31,7 +29,7 @@ Bjarne Däcker C - mnesia.report.sgml + Mnesia_chap1.xml

    This book describes the Mnesia DataBase Management System (DBMS). Mnesia is a distributed Database Management diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap2.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap2.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap2.xml 2007-11-26 13:08:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap2.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,649 +0,0 @@ - - - - -

    - - 1997 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Getting Started with Mnesia - Claes Wikström, Hans Nilsson and Håkan Mattsson - - - - - - C - -
    -

    This chapter introduces Mnesia. Following a brief discussion - about the first initial setup, a Mnesia database example is - demonstrated. This database example will be referenced in the - following chapters, where this example is modified in order to - illustrate various program constructs. In this chapter, the - following mandatory procedures are illustrated by examples: -

    - - Starting an Erlang session and specifying a directory for the - Mnesia database. - - Initializing a database schema. - - Starting Mnesia and creating the required tables. - - -
    - Starting Mnesia for the first time -

    Following is a simplified demonstration of a Mnesia system startup. This is the dialogue from the Erlang - shell: -

    -
      erl -mnesia dir '"/tmp/funky"'
    -        Erlang (BEAM) emulator version 4.9
    -        
    -        Eshell V4.9  (abort with ^G)
    -        1> 
    -        1> mnesia:create_schema([node()]).
    -        ok
    -        2> mnesia:start().
    -        ok
    -        3> mnesia:create_table(funky, []).
    -        {atomic,ok}
    -        4> mnesia:info().
    -        ---> Processes holding locks <--- 
    -        ---> Processes waiting for locks <--- 
    -        ---> Pending (remote) transactions <--- 
    -        ---> Active (local) transactions <---
    -        ---> Uncertain transactions <--- 
    -        ---> Active tables <--- 
    -        funky          : with 0 records occupying 269 words of mem 
    -        schema         : with 2 records occupying 353 words of mem 
    -        ===> System info in version "1.0", debug level = none <===
    -        opt_disc. Directory "/tmp/funky" is used.
    -        use fall-back at restart = false
    -        running db nodes = [nonode@nohost]
    -        stopped db nodes = [] 
    -        remote           = []
    -        ram_copies       = [funky]
    -        disc_copies      = [schema]
    -        disc_only_copies = []
    -        [{nonode@nohost,disc_copies}] = [schema]
    -        [{nonode@nohost,ram_copies}] = [funky]
    -        1 transactions committed, 0 aborted, 0 restarted, 1 logged to disc
    -        0 held locks, 0 in queue; 0 local transactions, 0 remote
    -        0 transactions waits for other nodes: []
    -        ok      
    -    ]]>
    -

    In the example above the following actions were performed: -

    - - The Erlang system was started from the UNIX prompt - with a flag -mnesia dir '"/tmp/funky"'. This flag indicates - to Mnesia which directory will store the data. - - A new empty schema was initialized on the local node by evaluating - mnesia:create_schema([node()]). The schema contains - information about the database in general. This will be - thoroughly explained later on. - - The DBMS was started by evaluating mnesia:start(). - - A first table was created, called funky by evaluating - the expression mnesia:create_table(funky, []). The table - was given default properties. - - mnesia:info() was evaluated and subsequently displayed - information regarding the status of the database on the terminal. - - -
    - -
    - An Introductory Example -

    A Mnesia database is organized as a set of tables. - Each table is populated with instances (Erlang records). - A table also has a number of properties, such as location and - persistence. -

    -

    In this example we shall: -

    - - Start an Erlang system, and specify the directory where - the database will be located. - - Initiate a new schema with an attribute that specifies - on which node, or nodes, the database will operate. - - Start Mnesia itself. - - Create and populate the database tables. - - - -
    - The Example Database -
    -

    In this database example, we will create the database and - relationships depicted in the following diagram. We will call this - database the Company database. -

    - - Company Entity-Relation Diagram - -

    The database model looks as follows: -

    - - There are three entities: employee, project, and - department. - - -

    There are three relationships between these entities:

    - - A department is managed by an employee, hence the - manager relationship. - - An employee works at a department, hence the - at_dep relationship. - - Each employee works on a number of projects, hence - the in_proj relationship. - - -
    -
    - -
    - Defining Structure and Content -

    We first enter our record definitions into a text file - named company.hrl. This file defines the following - structure for our sample database: -

    - -

    The structure defines six tables in our database. In Mnesia, - the function mnesia:create_table(Name, ArgList) is - used to create tables. Name is the table - name Note: The current version of Mnesia does - not require that the name of the table is the same as the record - name, See Chapter 4: - Record Names Versus Table Names.

    -

    For example, the table - for employees will be created with the function - mnesia:create_table(employee, [{attributes, record_info(fields, employee)}]). The table - name employee matches the name for records specified - in ArgList. The expression record_info(fields, RecordName) is processed by the Erlang preprocessor and - evaluates to a list containing the names of the different - fields for a record. -

    -
    - -
    - The Program -

    The following shell interaction starts Mnesia and - initializes the schema for our company database: -

    -
    -
    -        % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
    -         Erlang (BEAM) emulator version 4.9
    -          
    -          Eshell V4.9  (abort with ^G)
    -          1> mnesia:create_schema([node()]).
    -          ok
    -          2> mnesia:start().
    -          ok
    -      
    -

    The following program module creates and populates previously defined tables: -

    - -
    - -
    - The Program Explained -

    The following commands and functions were used to initiate the - Company database: -

    - - % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'. This is a UNIX - command line entry which starts the Erlang system. The flag - -mnesia dir Dir specifies the location of the - database directory. The system responds and waits for - further input with the prompt 1>. - - mnesia:create_schema([node()]). This function - has the format mnesia:create_schema(DiscNodeList) and - initiates a new schema. In this example, we have created a - non-distributed system using only one node. Schemas are fully - explained in Chapter 3:Defining a Schema. - - mnesia:start(). This function starts - Mnesia. This function is fully explained in Chapter 3: - Starting Mnesia. - - -

    Continuing the dialogue with the Erlang shell will produce the following - the following: -

    -
     company:init().
    -        {atomic,ok}
    -        4> mnesia:info().
    -        ---> Processes holding locks <--- 
    -        ---> Processes waiting for locks <--- 
    -        ---> Pending (remote) transactions <--- 
    -        ---> Active (local) transactions <---
    -        ---> Uncertain transactions <--- 
    -        ---> Active tables <--- 
    -        in_proj        : with 0 records occuping 269 words of mem 
    -        at_dep         : with 0 records occuping 269 words of mem 
    -        manager        : with 0 records occuping 269 words of mem 
    -        project        : with 0 records occuping 269 words of mem 
    -        dept           : with 0 records occuping 269 words of mem 
    -        employee       : with 0 records occuping 269 words of mem 
    -        schema         : with 7 records occuping 571 words of mem 
    -        ===> System info in version "1.0", debug level = none <===
    -        opt_disc. Directory "/ldisc/scratch/Mnesia.Company" is used.
    -        use fall-back at restart = false
    -        running db nodes = [nonode@nohost]
    -        stopped db nodes = [] 
    -        remote           = []
    -        ram_copies       =
    -            [at_dep,dept,employee,in_proj,manager,project]
    -        disc_copies      = [schema]
    -        disc_only_copies = []
    -        [{nonode@nohost,disc_copies}] = [schema]
    -        [{nonode@nohost,ram_copies}] =
    -            [employee,dept,project,manager,at_dep,in_proj]
    -        6 transactions committed, 0 aborted, 0 restarted, 6 logged to disc
    -        0 held locks, 0 in queue; 0 local transactions, 0 remote
    -        0 transactions waits for other nodes: []
    -        ok
    -      ]]>
    -

    A set of tables is created: -

    - - mnesia:create_table(Name,ArgList). This - function is used to create the required database tables. The - options available with ArgList are explained in - Chapter 3: Creating New Tables. - -

    The company:init/0 function creates our tables. Two tables are - of type bag. This is the manager relation as well - the in_proj relation. This shall be interpreted as: An - employee can be manager over several departments, and an employee - can participate in several projects. However, the at_dep - relation is set because an employee can only work in one department. - In this data model we have examples of relations that are one-to-one (set), - as well as one-to-many (bag). -

    -

    mnesia:info() now indicates that a database - which has seven local tables, of which, six are our - user defined tables and one is the schema. - Six transactions have been committed, as six successful transactions were run when - creating the tables. -

    -

    To write a function which inserts an employee record into the database, there must be an - at_dep record and a set of in_proj records inserted. Examine the following - code used to complete this action: -

    - - - -

    insert_emp(Emp, DeptId, ProjNames) ->. The - insert_emp/3 arguments are:

    - - Emp is an employee record. - - DeptId is the identity of the department where the employee is working. - - ProjNames is a list of the names of the projects where the employee are working. - -
    -
    -

    The insert_emp(Emp, DeptId, ProjNames) -> function - creates a functional object. Functional objects - are identified by the term Fun. The Fun is passed - as a single argument to the function - mnesia:transaction(Fun). This means that Fun is - run as a transaction with the following properties: -

    - - Fun either succeeds or fails completely. - - Code which manipulates the same data records can be - run concurrently without the different processes interfering - with each other. - - -

    The function can be used as:

    - - Emp = #employee{emp_no= 104732, - name = klacke, - salary = 7, - sex = male, - phone = 98108, - room_no = {221, 015}}, - insert_emp(Me, 'B/SFR', [Erlang, mnesia, otp]). - - -

    Functional Objects (Funs) are described in the - Erlang Reference Manual, "Fun Expressions". -

    -
    -
    - -
    - Initial Database Content -

    After the insertion of the employee named klacke - we have the following records in the database: -

    - -
    - + User's Guide
    -User's Guide +User's Guide
    - + Reference Manual
    -Reference Manual +Reference Manual
    - + Release Notes
    -Release Notes +Release Notes
    - - emp_no - name - salary - sex - phone - room_no - - - 104732 - klacke - 7 - male - 99586 - {221, 015} - - -Employee -
    -

    An employee record has the following Erlang record/tuple - representation: {employee, 104732, klacke, 7, male, 98108, {221, 015}}

    - - - - emp - dept_name - - - klacke - B/SFR - - -At_dep -
    -

    At_dep has the following Erlang tuple representation: - {at_dep, klacke, 'B/SFR'}. -

    - - - - emp - proj_name - - - klacke - Erlang - - - klacke - otp - - - klacke - mnesia - - -In_proj -
    -

    In_proj has the following Erlang tuple representation: - {in_proj, klacke, 'Erlang', klacke, 'otp', klacke, 'mnesia'}

    -

    There is no difference between rows in a table and Mnesia - records. Both concepts are the same and will be used - interchangeably throughout this book. -

    -

    A Mnesia table is populated by Mnesia records. For example, - the tuple {boss, klacke, bjarne} is an record. The - second element in this tuple is the key. In order to uniquely - identify a table row both the key and the table name is - needed. The term object identifier, - (oid) is sometimes used for the arity two tuple {Tab, Key}. The oid for - the {boss, klacke, bjarne} record is the arity two - tuple {boss, klacke}. The first element of the tuple is - the type of the record and the second element is the key. An - oid can lead to zero, one, or more records depending on - whether the table type is set or bag. -

    -

    We were also able to insert the {boss, klacke, bjarne} record which contains an implicit reference to - another employee which does not yet exist in the - database. Mnesia does not enforce this. -

    -
  • - -
    - Adding Records and Relationships to the Database -

    After adding additional record to the Company database, we - may end up with the following records: -

    -

    Employees

    - - {employee, 104465, "Johnson Torbjorn", 1, male, 99184, {242,038}}. - {employee, 107912, "Carlsson Tuula", 2, female,94556, {242,056}}. - {employee, 114872, "Dacker Bjarne", 3, male, 99415, {221,035}}. - {employee, 104531, "Nilsson Hans", 3, male, 99495, {222,026}}. - {employee, 104659, "Tornkvist Torbjorn", 2, male, 99514, {222,022}}. - {employee, 104732, "Wikstrom Claes", 2, male, 99586, {221,015}}. - {employee, 117716, "Fedoriw Anna", 1, female,99143, {221,031}}. - {employee, 115018, "Mattsson Hakan", 3, male, 99251, {203,348}}. - -

    Dept

    - - - {dept, 'B/SF', "Open Telecom Platform"}. - {dept, 'B/SFP', "OTP - Product Development"}. - {dept, 'B/SFR', "Computer Science Laboratory"}. - -

    Projects

    - - %% projects - {project, erlang, 1}. - {project, otp, 2}. - {project, beam, 3}. - {project, mnesia, 5}. - {project, wolf, 6}. - {project, documentation, 7}. - {project, www, 8}. - -

    The above three tables, titled employees, - dept, and projects, are the tables which are - made up of real records. The following database content is - stored in the tables which is built on - relationships. These tables are titled manager, - at_dep, and in_proj. -

    -

    Manager

    - - - {manager, 104465, 'B/SF'}. - {manager, 104465, 'B/SFP'}. - {manager, 114872, 'B/SFR'}. - -

    At_dep

    - - {at_dep, 104465, 'B/SF'}. - {at_dep, 107912, 'B/SF'}. - {at_dep, 114872, 'B/SFR'}. - {at_dep, 104531, 'B/SFR'}. - {at_dep, 104659, 'B/SFR'}. - {at_dep, 104732, 'B/SFR'}. - {at_dep, 117716, 'B/SFP'}. - {at_dep, 115018, 'B/SFP'}. - -

    In_proj

    - - {in_proj, 104465, otp}. - {in_proj, 107912, otp}. - {in_proj, 114872, otp}. - {in_proj, 104531, otp}. - {in_proj, 104531, mnesia}. - {in_proj, 104545, wolf}. - {in_proj, 104659, otp}. - {in_proj, 104659, wolf}. - {in_proj, 104732, otp}. - {in_proj, 104732, mnesia}. - {in_proj, 104732, erlang}. - {in_proj, 117716, otp}. - {in_proj, 117716, documentation}. - {in_proj, 115018, otp}. - {in_proj, 115018, mnesia}. - -

    The room number is an attribute of the employee - record. This is a structured attribute which consists of a - tuple. The first element of the tuple identifies a corridor, - and the second element identifies the actual room in the - corridor. We could have chosen to represent this as a record - -record(room, {corr, no}). instead of an anonymous - tuple representation. -

    -

    The Company database is now initialized and contains - data.

    -
    - -
    - Writing Queries -

    Retrieving data from DBMS should usually be done with mnesia:read/3 or - mnesia:read/1 functions. The following function raises the salary:

    - -

    Since we want to update the record using mnesia:write/1 after we have - increased the salary we acquire a write lock (third argument to read) when we read the - record from the table. -

    -

    It is not always the case that we can directly read the values from the table, - we might need to search the table or several tables to get the data we want, this - is done by writing database queries. Queries are always more expensive operations - than direct lookups done with mnesia:read and should be avoided in performance - critical code.

    -

    There are two methods for writing database queries: -

    - - Mnesia functions - - QLC - - -
    - Mnesia functions -

    -

    The following function extracts the names of the female employees - stored in the database: -

    -
    -\011  mnesia:select(employee, [{#employee{sex = female, name = '$1', _ = '_'},[], ['$1']}]).
    -        
    -

    Select must always run within an activity such as a - transaction. To be able to call from the shell we might - construct a function as: -

    - -

    The select expression matches all entries in table employee with - the field sex set to female. -

    -

    This function can be called from the shell as follows: -

    -
    -          (klacke@gin)1> company:all_females().
    -          {atomic,  ["Carlsson Tuula", "Fedoriw Anna"]}
    -        
    -

    See also the Pattern Matching - chapter for a description of select and its syntax. -

    -
    - -
    - Using QLC -

    This section contains simple introductory examples - only. Refer to QLC reference manual for a - full description of the QLC query language. Using QLC - might be more expensive than using Mnesia functions directly but - offers a nice syntax. -

    -

    The following function extracts a list of female employees - from the database: -

    -
    -          Q = qlc:q([E#employee.name || E  mnesia:table(employee),
    -\011                                E#employee.sex == female]),
    -\011  qlc:e(Q),
    -        
    -

    Accessing mnesia tables from a QLC list comprehension must - always be done within a transaction. Consider the following - function: -

    - -

    This function can be called from the shell as follows: -

    -
    -          (klacke@gin)1> company:females().
    -          {atomic, ["Carlsson Tuula", "Fedoriw Anna"]}
    -        
    -

    In traditional relational database terminology, the above - operation would be called a selection, followed by a projection. -

    -

    The list comprehension expression shown above contains a - number of syntactical elements. -

    - - the first [ bracket should be read as "build the - list" - - the || "such that" and the arrow should - be read as "taken from" - - -

    Hence, the above list comprehension demonstrates the - formation of the list E#employee.name such that E is - taken from the table of employees and the sex attribute - of each records is equal with the atom female. -

    -

    The whole list comprehension must be given to the - qlc:q/1 function. -

    -

    It is possible to combine list comprehensions with low - level Mnesia functions in the same transaction. If we want to - raise the salary of all female employees we execute: -

    - -

    The function raise_females/1 returns the tuple - {atomic, Number}, where Number is the number of - female employees who received a salary increase. Should an error - occur, the value {aborted, Reason} is returned. In the - case of an error, Mnesia guarantees that the salary is not - raised for any employees at all. -

    -
    -
    -          33>company:raise_females(33).
    -          {atomic,2}
    -        
    -
    -
    -
    - - diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap2.xmlsrc erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap2.xmlsrc --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap2.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap2.xmlsrc 2009-11-20 13:36:01.000000000 +0000 @@ -0,0 +1,647 @@ + + + + +
    + + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Getting Started with Mnesia + Claes Wikström, Hans Nilsson and Håkan Mattsson + + + + + + C + Mnesia_chap2.xml +
    +

    This chapter introduces Mnesia. Following a brief discussion + about the first initial setup, a Mnesia database example is + demonstrated. This database example will be referenced in the + following chapters, where this example is modified in order to + illustrate various program constructs. In this chapter, the + following mandatory procedures are illustrated by examples: +

    + + Starting an Erlang session and specifying a directory for the + Mnesia database. + + Initializing a database schema. + + Starting Mnesia and creating the required tables. + + +
    + Starting Mnesia for the first time +

    Following is a simplified demonstration of a Mnesia system startup. This is the dialogue from the Erlang + shell: +

    +
      erl -mnesia dir '"/tmp/funky"'
    +        Erlang (BEAM) emulator version 4.9
    +        
    +        Eshell V4.9  (abort with ^G)
    +        1> 
    +        1> mnesia:create_schema([node()]).
    +        ok
    +        2> mnesia:start().
    +        ok
    +        3> mnesia:create_table(funky, []).
    +        {atomic,ok}
    +        4> mnesia:info().
    +        ---> Processes holding locks <--- 
    +        ---> Processes waiting for locks <--- 
    +        ---> Pending (remote) transactions <--- 
    +        ---> Active (local) transactions <---
    +        ---> Uncertain transactions <--- 
    +        ---> Active tables <--- 
    +        funky          : with 0 records occupying 269 words of mem 
    +        schema         : with 2 records occupying 353 words of mem 
    +        ===> System info in version "1.0", debug level = none <===
    +        opt_disc. Directory "/tmp/funky" is used.
    +        use fall-back at restart = false
    +        running db nodes = [nonode@nohost]
    +        stopped db nodes = [] 
    +        remote           = []
    +        ram_copies       = [funky]
    +        disc_copies      = [schema]
    +        disc_only_copies = []
    +        [{nonode@nohost,disc_copies}] = [schema]
    +        [{nonode@nohost,ram_copies}] = [funky]
    +        1 transactions committed, 0 aborted, 0 restarted, 1 logged to disc
    +        0 held locks, 0 in queue; 0 local transactions, 0 remote
    +        0 transactions waits for other nodes: []
    +        ok      
    +    ]]>
    +

    In the example above the following actions were performed: +

    + + The Erlang system was started from the UNIX prompt + with a flag -mnesia dir '"/tmp/funky"'. This flag indicates + to Mnesia which directory will store the data. + + A new empty schema was initialized on the local node by evaluating + mnesia:create_schema([node()]). The schema contains + information about the database in general. This will be + thoroughly explained later on. + + The DBMS was started by evaluating mnesia:start(). + + A first table was created, called funky by evaluating + the expression mnesia:create_table(funky, []). The table + was given default properties. + + mnesia:info() was evaluated and subsequently displayed + information regarding the status of the database on the terminal. + + +
    + +
    + An Introductory Example +

    A Mnesia database is organized as a set of tables. + Each table is populated with instances (Erlang records). + A table also has a number of properties, such as location and + persistence. +

    +

    In this example we shall: +

    + + Start an Erlang system, and specify the directory where + the database will be located. + + Initiate a new schema with an attribute that specifies + on which node, or nodes, the database will operate. + + Start Mnesia itself. + + Create and populate the database tables. + + + +
    + The Example Database +
    +

    In this database example, we will create the database and + relationships depicted in the following diagram. We will call this + database the Company database. +

    + + Company Entity-Relation Diagram + +

    The database model looks as follows: +

    + + There are three entities: employee, project, and + department. + + +

    There are three relationships between these entities:

    + + A department is managed by an employee, hence the + manager relationship. + + An employee works at a department, hence the + at_dep relationship. + + Each employee works on a number of projects, hence + the in_proj relationship. + + +
    +
    + +
    + Defining Structure and Content +

    We first enter our record definitions into a text file + named company.hrl. This file defines the following + structure for our sample database: +

    + +

    The structure defines six tables in our database. In Mnesia, + the function mnesia:create_table(Name, ArgList) is + used to create tables. Name is the table + name Note: The current version of Mnesia does + not require that the name of the table is the same as the record + name, See Chapter 4: + Record Names Versus Table Names.

    +

    For example, the table + for employees will be created with the function + mnesia:create_table(employee, [{attributes, record_info(fields, employee)}]). The table + name employee matches the name for records specified + in ArgList. The expression record_info(fields, RecordName) is processed by the Erlang preprocessor and + evaluates to a list containing the names of the different + fields for a record. +

    +
    + +
    + The Program +

    The following shell interaction starts Mnesia and + initializes the schema for our company database: +

    +
    +
    +        % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
    +         Erlang (BEAM) emulator version 4.9
    +          
    +          Eshell V4.9  (abort with ^G)
    +          1> mnesia:create_schema([node()]).
    +          ok
    +          2> mnesia:start().
    +          ok
    +      
    +

    The following program module creates and populates previously defined tables: +

    + +
    + +
    + The Program Explained +

    The following commands and functions were used to initiate the + Company database: +

    + + % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'. This is a UNIX + command line entry which starts the Erlang system. The flag + -mnesia dir Dir specifies the location of the + database directory. The system responds and waits for + further input with the prompt 1>. + + mnesia:create_schema([node()]). This function + has the format mnesia:create_schema(DiscNodeList) and + initiates a new schema. In this example, we have created a + non-distributed system using only one node. Schemas are fully + explained in Chapter 3:Defining a Schema. + + mnesia:start(). This function starts + Mnesia. This function is fully explained in Chapter 3: + Starting Mnesia. + + +

    Continuing the dialogue with the Erlang shell will produce the following + the following: +

    +
     company:init().
    +        {atomic,ok}
    +        4> mnesia:info().
    +        ---> Processes holding locks <--- 
    +        ---> Processes waiting for locks <--- 
    +        ---> Pending (remote) transactions <--- 
    +        ---> Active (local) transactions <---
    +        ---> Uncertain transactions <--- 
    +        ---> Active tables <--- 
    +        in_proj        : with 0 records occuping 269 words of mem 
    +        at_dep         : with 0 records occuping 269 words of mem 
    +        manager        : with 0 records occuping 269 words of mem 
    +        project        : with 0 records occuping 269 words of mem 
    +        dept           : with 0 records occuping 269 words of mem 
    +        employee       : with 0 records occuping 269 words of mem 
    +        schema         : with 7 records occuping 571 words of mem 
    +        ===> System info in version "1.0", debug level = none <===
    +        opt_disc. Directory "/ldisc/scratch/Mnesia.Company" is used.
    +        use fall-back at restart = false
    +        running db nodes = [nonode@nohost]
    +        stopped db nodes = [] 
    +        remote           = []
    +        ram_copies       =
    +            [at_dep,dept,employee,in_proj,manager,project]
    +        disc_copies      = [schema]
    +        disc_only_copies = []
    +        [{nonode@nohost,disc_copies}] = [schema]
    +        [{nonode@nohost,ram_copies}] =
    +            [employee,dept,project,manager,at_dep,in_proj]
    +        6 transactions committed, 0 aborted, 0 restarted, 6 logged to disc
    +        0 held locks, 0 in queue; 0 local transactions, 0 remote
    +        0 transactions waits for other nodes: []
    +        ok
    +      ]]>
    +

    A set of tables is created: +

    + + mnesia:create_table(Name,ArgList). This + function is used to create the required database tables. The + options available with ArgList are explained in + Chapter 3: Creating New Tables. + +

    The company:init/0 function creates our tables. Two tables are + of type bag. This is the manager relation as well + the in_proj relation. This shall be interpreted as: An + employee can be manager over several departments, and an employee + can participate in several projects. However, the at_dep + relation is set because an employee can only work in one department. + In this data model we have examples of relations that are one-to-one (set), + as well as one-to-many (bag). +

    +

    mnesia:info() now indicates that a database + which has seven local tables, of which, six are our + user defined tables and one is the schema. + Six transactions have been committed, as six successful transactions were run when + creating the tables. +

    +

    To write a function which inserts an employee record into the database, there must be an + at_dep record and a set of in_proj records inserted. Examine the following + code used to complete this action: +

    + + + +

    insert_emp(Emp, DeptId, ProjNames) ->. The + insert_emp/3 arguments are:

    + + Emp is an employee record. + + DeptId is the identity of the department where the employee is working. + + ProjNames is a list of the names of the projects where the employee are working. + +
    +
    +

    The insert_emp(Emp, DeptId, ProjNames) -> function + creates a functional object. Functional objects + are identified by the term Fun. The Fun is passed + as a single argument to the function + mnesia:transaction(Fun). This means that Fun is + run as a transaction with the following properties: +

    + + Fun either succeeds or fails completely. + + Code which manipulates the same data records can be + run concurrently without the different processes interfering + with each other. + + +

    The function can be used as:

    + + Emp = #employee{emp_no= 104732, + name = klacke, + salary = 7, + sex = male, + phone = 98108, + room_no = {221, 015}}, + insert_emp(Me, 'B/SFR', [Erlang, mnesia, otp]). + + +

    Functional Objects (Funs) are described in the + Erlang Reference Manual, "Fun Expressions". +

    +
    +
    + +
    + Initial Database Content +

    After the insertion of the employee named klacke + we have the following records in the database: +

    + + + + emp_no + name + salary + sex + phone + room_no + + + 104732 + klacke + 7 + male + 99586 + {221, 015} + + +Employee +
    +

    An employee record has the following Erlang record/tuple + representation: {employee, 104732, klacke, 7, male, 98108, {221, 015}}

    + + + + emp + dept_name + + + klacke + B/SFR + + +At_dep +
    +

    At_dep has the following Erlang tuple representation: + {at_dep, klacke, 'B/SFR'}. +

    + + + + emp + proj_name + + + klacke + Erlang + + + klacke + otp + + + klacke + mnesia + + +In_proj +
    +

    In_proj has the following Erlang tuple representation: + {in_proj, klacke, 'Erlang', klacke, 'otp', klacke, 'mnesia'}

    +

    There is no difference between rows in a table and Mnesia + records. Both concepts are the same and will be used + interchangeably throughout this book. +

    +

    A Mnesia table is populated by Mnesia records. For example, + the tuple {boss, klacke, bjarne} is an record. The + second element in this tuple is the key. In order to uniquely + identify a table row both the key and the table name is + needed. The term object identifier, + (oid) is sometimes used for the arity two tuple {Tab, Key}. The oid for + the {boss, klacke, bjarne} record is the arity two + tuple {boss, klacke}. The first element of the tuple is + the type of the record and the second element is the key. An + oid can lead to zero, one, or more records depending on + whether the table type is set or bag. +

    +

    We were also able to insert the {boss, klacke, bjarne} record which contains an implicit reference to + another employee which does not yet exist in the + database. Mnesia does not enforce this. +

    +
    + +
    + Adding Records and Relationships to the Database +

    After adding additional record to the Company database, we + may end up with the following records: +

    +

    Employees

    + + {employee, 104465, "Johnson Torbjorn", 1, male, 99184, {242,038}}. + {employee, 107912, "Carlsson Tuula", 2, female,94556, {242,056}}. + {employee, 114872, "Dacker Bjarne", 3, male, 99415, {221,035}}. + {employee, 104531, "Nilsson Hans", 3, male, 99495, {222,026}}. + {employee, 104659, "Tornkvist Torbjorn", 2, male, 99514, {222,022}}. + {employee, 104732, "Wikstrom Claes", 2, male, 99586, {221,015}}. + {employee, 117716, "Fedoriw Anna", 1, female,99143, {221,031}}. + {employee, 115018, "Mattsson Hakan", 3, male, 99251, {203,348}}. + +

    Dept

    + + + {dept, 'B/SF', "Open Telecom Platform"}. + {dept, 'B/SFP', "OTP - Product Development"}. + {dept, 'B/SFR', "Computer Science Laboratory"}. + +

    Projects

    + + %% projects + {project, erlang, 1}. + {project, otp, 2}. + {project, beam, 3}. + {project, mnesia, 5}. + {project, wolf, 6}. + {project, documentation, 7}. + {project, www, 8}. + +

    The above three tables, titled employees, + dept, and projects, are the tables which are + made up of real records. The following database content is + stored in the tables which is built on + relationships. These tables are titled manager, + at_dep, and in_proj. +

    +

    Manager

    + + + {manager, 104465, 'B/SF'}. + {manager, 104465, 'B/SFP'}. + {manager, 114872, 'B/SFR'}. + +

    At_dep

    + + {at_dep, 104465, 'B/SF'}. + {at_dep, 107912, 'B/SF'}. + {at_dep, 114872, 'B/SFR'}. + {at_dep, 104531, 'B/SFR'}. + {at_dep, 104659, 'B/SFR'}. + {at_dep, 104732, 'B/SFR'}. + {at_dep, 117716, 'B/SFP'}. + {at_dep, 115018, 'B/SFP'}. + +

    In_proj

    + + {in_proj, 104465, otp}. + {in_proj, 107912, otp}. + {in_proj, 114872, otp}. + {in_proj, 104531, otp}. + {in_proj, 104531, mnesia}. + {in_proj, 104545, wolf}. + {in_proj, 104659, otp}. + {in_proj, 104659, wolf}. + {in_proj, 104732, otp}. + {in_proj, 104732, mnesia}. + {in_proj, 104732, erlang}. + {in_proj, 117716, otp}. + {in_proj, 117716, documentation}. + {in_proj, 115018, otp}. + {in_proj, 115018, mnesia}. + +

    The room number is an attribute of the employee + record. This is a structured attribute which consists of a + tuple. The first element of the tuple identifies a corridor, + and the second element identifies the actual room in the + corridor. We could have chosen to represent this as a record + -record(room, {corr, no}). instead of an anonymous + tuple representation. +

    +

    The Company database is now initialized and contains + data.

    +
    + +
    + Writing Queries +

    Retrieving data from DBMS should usually be done with mnesia:read/3 or + mnesia:read/1 functions. The following function raises the salary:

    + +

    Since we want to update the record using mnesia:write/1 after we have + increased the salary we acquire a write lock (third argument to read) when we read the + record from the table. +

    +

    It is not always the case that we can directly read the values from the table, + we might need to search the table or several tables to get the data we want, this + is done by writing database queries. Queries are always more expensive operations + than direct lookups done with mnesia:read and should be avoided in performance + critical code.

    +

    There are two methods for writing database queries: +

    + + Mnesia functions + + QLC + + +
    + Mnesia functions +

    +

    The following function extracts the names of the female employees + stored in the database: +

    +
    +\011  mnesia:select(employee, [{#employee{sex = female, name = '$1', _ = '_'},[], ['$1']}]).
    +        
    +

    Select must always run within an activity such as a + transaction. To be able to call from the shell we might + construct a function as: +

    + +

    The select expression matches all entries in table employee with + the field sex set to female. +

    +

    This function can be called from the shell as follows: +

    +
    +          (klacke@gin)1> company:all_females().
    +          {atomic,  ["Carlsson Tuula", "Fedoriw Anna"]}
    +        
    +

    See also the Pattern Matching + chapter for a description of select and its syntax. +

    +
    + +
    + Using QLC +

    This section contains simple introductory examples + only. Refer to QLC reference manual for a + full description of the QLC query language. Using QLC + might be more expensive than using Mnesia functions directly but + offers a nice syntax. +

    +

    The following function extracts a list of female employees + from the database: +

    +
    +          Q = qlc:q([E#employee.name || E  mnesia:table(employee),
    +\011                                E#employee.sex == female]),
    +\011  qlc:e(Q),
    +        
    +

    Accessing mnesia tables from a QLC list comprehension must + always be done within a transaction. Consider the following + function: +

    + +

    This function can be called from the shell as follows: +

    +
    +          (klacke@gin)1> company:females().
    +          {atomic, ["Carlsson Tuula", "Fedoriw Anna"]}
    +        
    +

    In traditional relational database terminology, the above + operation would be called a selection, followed by a projection. +

    +

    The list comprehension expression shown above contains a + number of syntactical elements. +

    + + the first [ bracket should be read as "build the + list" + + the || "such that" and the arrow should + be read as "taken from" + + +

    Hence, the above list comprehension demonstrates the + formation of the list E#employee.name such that E is + taken from the table of employees and the sex attribute + of each records is equal with the atom female. +

    +

    The whole list comprehension must be given to the + qlc:q/1 function. +

    +

    It is possible to combine list comprehensions with low + level Mnesia functions in the same transaction. If we want to + raise the salary of all female employees we execute: +

    + +

    The function raise_females/1 returns the tuple + {atomic, Number}, where Number is the number of + female employees who received a salary increase. Should an error + occur, the value {aborted, Reason} is returned. In the + case of an error, Mnesia guarantees that the salary is not + raised for any employees at all. +

    +
    +
    +          33>company:raise_females(33).
    +          {atomic,2}
    +        
    +
    +
    +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap3.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap3.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap3.xml 2007-11-26 13:08:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap3.xml 2009-11-20 13:36:01.000000000 +0000 @@ -4,23 +4,21 @@
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Building A Mnesia Database @@ -31,7 +29,7 @@ - + Mnesia_chap3.xml

    This chapter details the basic steps involved when designing a Mnesia database and the programming constructs which make different diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap4.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap4.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap4.xml 2007-11-28 12:10:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap4.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,1173 +0,0 @@ - - - - -

    - - 1997 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Transactions and Other Access Contexts - Claes Wikström, Hans Nilsson and Håkan Mattsson - - - - - - - -
    -

    This chapter describes the Mnesia transaction system and the - transaction properties which make Mnesia a fault tolerant, - distributed database management system. -

    -

    Also covered in this chapter are the locking functions, - including table locks and sticky locks, as well as alternative - functions which bypass the transaction system in favor of improved - speed and reduced overheads. These functions are called "dirty - operations". We also describe the usage of nested transactions. - This chapter contains the following sections: -

    - - transaction properties, which include atomicity, - consistency, isolation, and durability - - Locking - - Dirty operations - - Record names vs table names - - Activity concept and various access contexts - - Nested transactions - - Pattern matching - - Iteration - - - -
    - - Transaction Properties -

    Transactions are an important tool when designing fault - tolerant, distributed systems. A Mnesia transaction is a mechanism - by which a series of database operations can be executed as one - functional block. The functional block which is run as a - transaction is called a Functional Object (Fun), and this code can - read, write, or delete Mnesia records. The Fun is evaluated as a - transaction which either commits, or aborts. If a transaction - succeeds in executing Fun it will replicate the action on all nodes - involved, or abort if an error occurs. -

    -

    The following example shows a transaction which raises the - salary of certain employee numbers. -

    - -

    The transaction raise(Eno, Raise) - > contains a Fun - made up of four lines of code. This Fun is called by the statement - mnesia:transaction(F) and returns a value. -

    -

    The Mnesia transaction system facilitates the construction of - reliable, distributed systems by providing the following important - properties: -

    - - The transaction handler ensures that a Fun which is placed - inside a transaction does not interfere with operations embedded - in other transactions when it executes a series of operations on - tables. - - The transaction handler ensures that either all operations - in the transaction are performed successfully on all nodes - atomically, or the transaction fails without permanent effect on - any of the nodes. - - The Mnesia transactions have four important properties, - which we call Atomicity, - Consistency,Isolation, and - Durability, or ACID for short. These properties are - described in the following sub-sections. - - -
    - Atomicity -

    Atomicity means that database changes which are - executed by a transaction take effect on all nodes involved, or - on none of the nodes. In other words, the transaction either - succeeds entirely, or it fails entirely. -

    -

    Atomicity is particularly important when we want to - atomically write more than one record in the same - transaction. The raise/2 function, shown as an example - above, writes one record only. The insert_emp/3 function, - shown in the program listing in Chapter 2, writes the record - employee as well as employee relations such as - at_dep and in_proj into the database. If we run - this latter code inside a transaction, then the transaction - handler ensures that the transaction either succeeds completely, - or not at all. -

    -

    Mnesia is a distributed DBMS where data can be replicated on - several nodes. In many such applications, it is important that a - series of write operations are performed atomically inside a - transaction. The atomicity property ensures that a transaction - take effect on all nodes, or none at all.

    -
    - -
    - Consistency -

    Consistency. This transaction property ensures that - a transaction always leaves the DBMS in a consistent state. For - example, Mnesia ensures that inconsistencies will not occur if - Erlang, Mnesia or the computer crashes while a write operation - is in progress. -

    -
    - -
    - Isolation -

    Isolation. This transaction property ensures that - transactions which execute on different nodes in a network, and - access and manipulate the same data records, will not interfere - with each other. -

    -

    The isolation property makes it possible to concurrently execute - the raise/2 function. A classical problem in concurrency control - theory is the so called "lost update problem". -

    -

    The isolation property is extremely useful if the following - circumstances occurs where an employee (with an employee number - 123) and two processes, (P1 and P2), are concurrently trying to - raise the salary for the employee. The initial value of the - employees salary is, for example, 5. Process P1 then starts to execute, - it reads the employee record and adds 2 to the salary. At this - point in time, process P1 is for some reason preempted and - process P2 has the opportunity to run. P2 reads the record, adds 3 - to the salary, and finally writes a new employee record with - the salary set to 8. Now, process P1 start to run again and - writes its employee record with salary set to 7, thus - effectively overwriting and undoing the work performed by - process P2. The update performed by P2 is lost. -

    -

    A transaction system makes it possible to concurrently - execute two or more processes which manipulate the same - record. The programmer does not need to check that the - updates are synchronous, this is overseen by the - transaction handler. All programs accessing the database through - the transaction system may be written as if they had sole access - to the data. -

    -
    - -
    - Durability -

    Durability. This transaction property ensures that - changes made to the DBMS by a transaction are permanent. Once a - transaction has been committed, all changes made to the database - are durable - i.e. they are written safely to disc and will not - be corrupted or disappear. -

    - -

    The durability feature described does not entirely apply to - situations where Mnesia is configured as a "pure" primary memory - database. -

    -
    -
    -
    - -
    - Locking -

    Different transaction managers employ different strategies to - satisfy the isolation property. Mnesia uses the standard technique - of two-phase locking. This means that locks are set on records - before they are read or written. Mnesia uses five different kinds - of locks. -

    - - Read locks. A read lock is set on one replica of - a record before it can be read. - - Write locks. Whenever a transaction writes to an - record, write locks are first set on all replicas of that - particular record. - - Read table locks. If a transaction traverses an - entire table in search for a record which satisfy some - particular property, it is most inefficient to set read locks on - the records, one by one. It is also very memory consuming, since - the read locks themselves may take up considerable space if the - table is very large. For this reason, Mnesia can set a read lock - on an entire table. - - Write table locks. If a transaction writes a - large number of records to one table, it is possible to set a - write lock on the entire table. - - Sticky locks. These are write locks that stay in - place at a node after the transaction which initiated the lock - has terminated. - -

    Mnesia employs a strategy whereby functions such as - mnesia:read/1 acquire the necessary locks dynamically as - the transactions execute. Mnesia automatically sets and releases - the locks and the programmer does not have to code these - operations. -

    -

    Deadlocks can occur when concurrent processes set and release - locks on the same records. Mnesia employs a "wait-die" strategy to - resolve these situations. If Mnesia suspects that a deadlock can - occur when a transaction tries to set a lock, the transaction is - forced to release all its locks and sleep for a while. The - Fun in the transaction will be evaluated one more time. -

    -

    For this reason, it is important that the code inside the Fun given to - mnesia:transaction/1 is pure. Some strange results can - occur if, for example, messages are sent by the transaction - Fun. The following example illustrates this situation: -

    - -

    This transaction could write the text "Trying to write ... " a thousand times to the terminal. Mnesia does guarantee, - however, that each and every transaction will eventually run. As a - result, Mnesia is not only deadlock free, but also livelock - free. -

    -

    The Mnesia programmer cannot prioritize one particular - transaction to execute before other transactions which are waiting - to execute. As a result, the Mnesia DBMS transaction system is not - suitable for hard real time applications. However, Mnesia contains - other features that have real time properties. -

    -

    Mnesia dynamically sets and releases locks as - transactions execute, therefore, it is very dangerous to execute code with - transaction side-effects. In particular, a receive - statement inside a transaction can lead to a situation where the - transaction hangs and never returns, which in turn can cause locks - not to release. This situation could bring the whole system to a - standstill since other transactions which execute in other - processes, or on other nodes, are forced to wait for the defective - transaction. -

    -

    If a transaction terminates abnormally, Mnesia will - automatically release the locks held by the transaction. -

    -

    We have shown examples of a number of functions that can be - used inside a transaction. The following list shows the - simplest Mnesia functions that work with transactions. It - is important to realize that these functions must be embedded in a - transaction. If no enclosing transaction (or other enclosing - Mnesia activity) exists, they will all fail. -

    - - mnesia:transaction(Fun) -> {aborted, Reason} |{atomic, Value}. This function executes one transaction with the - functional object Fun as the single parameter. - - mnesia:read({Tab, Key}) -> transaction abort | RecordList. This function reads all records with Key - as key from table Tab. This function has the same semantics - regardless of the location of Table. If the table is of - type bag, the read({Tab, Key}) can return an arbitrarily - long list. If the table is of type set, the list is - either of length one, or []. - - mnesia:wread({Tab, Key}) -> transaction abort | RecordList. This function behaves the same way as the - previously listed read/1 function, except that it - acquires a write lock instead of a read lock. If we execute a - transaction which reads a record, modifies the record, and then - writes the record, it is slightly more efficient to set the - write lock immediately. In cases where we issue a - mnesia:read/1, followed by a mnesia:write/1, the - first read lock must be upgraded to a write lock when the write - operation is executed. - - mnesia:write(Record) -> transaction abort | ok. This function writes a record into the database. The - Record argument is an instance of a record. The function - returns ok, or aborts the transaction if an error should - occur. - - mnesia:delete({Tab, Key}) -> transaction abort | ok. This - function deletes all records with the given key. - - mnesia:delete_object(Record) -> transaction abort | ok. This function deletes records with object id - Record. This function is used when we want to delete only - some records in a table of type bag. - - -
    - Sticky Locks -

    As previously stated, the locking strategy used by Mnesia is - to lock one record when we read a record, and lock all replicas - of a record when we write a record. However, there are - applications which use Mnesia mainly for its fault-tolerant - qualities, and these applications may be configured with one - node doing all the heavy work, and a standby node which is ready - to take over in case the main node fails. Such applications may - benefit from using sticky locks instead of the normal locking - scheme. -

    -

    A sticky lock is a lock which stays in place at a node after - the transaction which first acquired the lock has terminated. To - illustrate this, assume that we execute the following - transaction: -

    - - F = fun() -> - mnesia:write(#foo{a = kalle}) - end, - mnesia:transaction(F). - -

    The foo table is replicated on the two nodes N1 - and N2. -

    -Normal locking requires: -

    - - one network rpc (2 messages) to acquire the write lock - - three network messages to execute the two-phase commit protocol. - - -

    If we use sticky locks, we must first change the code as follows: -

    - - - F = fun() -> - mnesia:s_write(#foo{a = kalle}) - end, - mnesia:transaction(F). - -

    This code uses the s_write/1 function instead of the - write/1 function. The s_write/1 function sets a - sticky lock instead of a normal lock. If the table is not - replicated, sticky locks have no special effect. If the table is - replicated, and we set a sticky lock on node N1, this - lock will then stick to node N1. The next time we try to - set a sticky lock on the same record at node N1, Mnesia - will see that the lock is already set and will not do a network - operation in order to acquire the lock. -

    -

    It is much more efficient to set a local lock than it is to set - a networked lock, and for this reason sticky locks can benefit - application that use a replicated table and perform most of the - work on only one of the nodes. -

    -

    If a record is stuck at node N1 and we try to set a - sticky lock for the record on node N2, the record must be - unstuck. This operation is expensive and will reduce performance. The unsticking is - done automatically if we issue s_write/1 requests at - N2. -

    -
    - -
    - Table Locks -

    Mnesia supports read and write locks on whole tables as a - complement to the normal locks on single records. As previously - stated, Mnesia sets and releases locks automatically, and the - programmer does not have to code these operations. However, - transactions which read and write a large number of records in a - specific table will execute more efficiently if we start the - transaction by setting a table lock on this table. This will - block other concurrent transactions from the table. The - following two function are used to set explicit table locks for - read and write operations: -

    - - mnesia:read_lock_table(Tab) Sets a read lock on - the table Tab - mnesia:write_lock_table(Tab) Sets a write lock on - the table Tab - -

    Alternate syntax for acquisition of table locks is as follows: -

    - - mnesia:lock({table, Tab}, read) - mnesia:lock({table, Tab}, write) - -

    The matching operations in Mnesia may either lock the entire - table or just a single record (when the key is bound in the - pattern). -

    -
    - -
    - Global Locks -

    Write locks are normally acquired on all nodes where a - replica of the table resides (and is active). Read locks are - acquired on one node (the local one if a local - replica exists). -

    -

    The function mnesia:lock/2 is intended to support - table locks (as mentioned previously) - but also for situations when locks need to be - acquired regardless of how tables have been replicated: -

    - - mnesia:lock({global, GlobalKey, Nodes}, LockKind) - - LockKind ::= read | write | ... - -

    The lock is acquired on the LockItem on all Nodes in the - nodes list.

    -
    -
    - -
    - Dirty Operations -

    In many applications, the overhead of processing a transaction - may result in a loss of performance. Dirty operation are short - cuts which bypass much of the processing and increase the speed - of the transaction. -

    -

    Dirty operation are useful in many situations, for example in a datagram routing - application where Mnesia stores the routing table, and it is time - consuming to start a whole transaction every time a packet is - received. For this reason, Mnesia has functions which manipulate - tables without using transactions. This alternative - to processing is known as a dirty operation. However, it is important to - realize the trade-off in avoiding the overhead of transaction - processing: -

    - - The atomicity and the isolation properties of Mnesia are lost. - - The isolation property is compromised, because other - Erlang processes, which use transaction to manipulate the data, - do not get the benefit of isolation if we simultaneously use - dirty operations to read and write records from the same table. - - -

    The major advantage of dirty operations is that they execute - much faster than equivalent operations that are processed as - functional objects within a transaction. -

    -

    Dirty operations - are written to disc if they are performed on a table of type - disc_copies, or type disc_only_copies. Mnesia also - ensures that all replicas of a table are updated if a - dirty write operation is performed on a table. -

    -

    A dirty operation will ensure a certain level of consistency. - For example, it is not possible for dirty operations to return - garbled records. Hence, each individual read or write operation - is performed in an atomic manner. -

    -

    All dirty functions execute a call to exit({aborted, Reason}) on failure. Even if the following functions are - executed inside a transaction no locks will be aquired. The - following functions are available: -

    - - mnesia:dirty_read({Tab, Key}). This function reads - record(s) from Mnesia. - - mnesia:dirty_write(Record). This function writes - the record Record - mnesia:dirty_delete({Tab, Key}). This function deletes - record(s) with the key Key. - - mnesia:dirty_delete_object(Record) This function is - the dirty operation alternative to the function - delete_object/1 - -

    mnesia:dirty_first(Tab). This function returns the - "first" key in the table Tab.

    -

    Records in set or bag tables are not sorted. - However, there is - a record order which is not known to the user. - This means that it is possible to traverse a table by means of - this function in conjunction with the dirty_next/2 - function. -

    -

    If there are no records at all in the table, this function - will return the atom '$end_of_table'. It is not - recommended to use this atom as the key for any user - records. -

    -
    - mnesia:dirty_next(Tab, Key). This function returns - the "next" key in the table Tab. This function makes it - possible to traverse a table and perform some operation on all - records in the table. When the end of the table is reached the - special key '$end_of_table' is returned. Otherwise, the - function returns a key which can be used to read the actual - record. -

    -The behavior is undefined if any process perform a write - operation on the table while we traverse the table with the - dirty_next/2 function. This is because write - operations on a Mnesia table may lead to internal reorganizations - of the table itself. This is an implementation detail, but remember - the dirty functions are low level functions. -
    - mnesia:dirty_last(Tab) This function works exactly as - mnesia:dirty_first/1 but returns the last object in - Erlang term order for the ordered_set table type. For - all other table types, mnesia:dirty_first/1 and - mnesia:dirty_last/1 are synonyms. - - mnesia:dirty_prev(Tab, Key) This function works exactly as - mnesia:dirty_next/2 but returns the previous object in - Erlang term order for the ordered_set table type. For - all other table types, mnesia:dirty_next/2 and - mnesia:dirty_prev/2 are synonyms. - - -

    mnesia:dirty_slot(Tab, Slot)

    -

    Returns the list of records that are associated with Slot - in a table. It can be used to traverse a table in a manner - similar to the dirty_next/2 function. A table has a - number of slots that range from zero to some unknown upper - bound. The function dirty_slot/2 returns the special - atom '$end_of_table' when the end of the table is - reached. -

    -The behavior of this function is undefined if the - table is written on while being - traversed. mnesia:read_lock_table(Tab) may be used to - ensure that no transaction protected writes are performed - during the iteration. -

    -
    - -

    mnesia:dirty_update_counter({Tab,Key}, Val).

    -

    Counters are positive integers with a value greater than or - equal to zero. Updating a counter will add the Val and - the counter where Val is a positive or negative integer. -

    - There exists no special counter records in - Mnesia. However, records on the form of {TabName, Key, Integer} can be used as counters, and can be - persistent. -

    -

    It is not possible to have transaction protected updates of - counter records. -

    -

    There are two significant differences when using this - function instead of reading the record, performing the - arithmetic, and writing the record: -

    - - it is much more efficient - - the dirty_update_counter/2 function is - performed as an atomic operation although it is not protected by - a transaction. Accordingly, no table update is lost if two - processes simultaneously execute the - dirty_update_counter/2 function. - - -
    - mnesia:dirty_match_object(Pat). This function is - the dirty equivalent of mnesia:match_object/1. - - mnesia:dirty_select(Tab, Pat). This function is - the dirty equivalent of mnesia:select/2. - - mnesia:dirty_index_match_object(Pat, Pos). This - function is the dirty equivalent of - mnesia:index_match_object/2. - - mnesia:dirty_index_read(Tab, SecondaryKey, Pos). This - function is the dirty equivalent of mnesia:index_read/3. - - mnesia:dirty_all_keys(Tab). This function is the - dirty equivalent of mnesia:all_keys/1. - -
    -
    - -
    - - Record Names versus Table Names -

    In Mnesia, all records in a table must have the same name. All - the records must be instances of the same - record type. The record name does however not necessarily be - the same as the table name. Even though that it is the case in - the most of the examples in this document. If a table is created - without the record_name property the code below will - ensure all records in the tables have the same name as the table: -

    - - mnesia:create_table(subscriber, []) - -

    However, if the table is is created with an explicit record name - as argument, as shown below, it is possible to store subscriber - records in both of the tables regardless of the table names: -

    - - TabDef = [{record_name, subscriber}], - mnesia:create_table(my_subscriber, TabDef), - mnesia:create_table(your_subscriber, TabDef). - -

    In order to access such - tables it is not possible to use the simplified access functions - as described earlier in the document. For example, - writing a subscriber record into a table requires a - mnesia:write/3function instead of the simplified functions - mnesia:write/1 and mnesia:s_write/1: -

    - - mnesia:write(subscriber, #subscriber{}, write) - mnesia:write(my_subscriber, #subscriber{}, sticky_write) - mnesia:write(your_subscriber, #subscriber{}, write) - -

    The following simplified piece of code illustrates the - relationship between the simplified access functions used in - most examples and their more flexible counterparts: -

    - - mnesia:dirty_write(Record) -> - Tab = element(1, Record), - mnesia:dirty_write(Tab, Record). - - mnesia:dirty_delete({Tab, Key}) -> - mnesia:dirty_delete(Tab, Key). - - mnesia:dirty_delete_object(Record) -> - Tab = element(1, Record), - mnesia:dirty_delete_object(Tab, Record) - - mnesia:dirty_update_counter({Tab, Key}, Incr) -> - mnesia:dirty_update_counter(Tab, Key, Incr). - - mnesia:dirty_read({Tab, Key}) -> - Tab = element(1, Record), - mnesia:dirty_read(Tab, Key). - - mnesia:dirty_match_object(Pattern) -> - Tab = element(1, Pattern), - mnesia:dirty_match_object(Tab, Pattern). - - mnesia:dirty_index_match_object(Pattern, Attr) - Tab = element(1, Pattern), - mnesia:dirty_index_match_object(Tab, Pattern, Attr). - - mnesia:write(Record) -> - Tab = element(1, Record), - mnesia:write(Tab, Record, write). - - mnesia:s_write(Record) -> - Tab = element(1, Record), - mnesia:write(Tab, Record, sticky_write). - - mnesia:delete({Tab, Key}) -> - mnesia:delete(Tab, Key, write). - - mnesia:s_delete({Tab, Key}) -> - mnesia:delete(Tab, Key, sticky_write). - - mnesia:delete_object(Record) -> - Tab = element(1, Record), - mnesia:delete_object(Tab, Record, write). - - mnesia:s_delete_object(Record) -> - Tab = element(1, Record), - mnesia:delete_object(Tab, Record. sticky_write). - - mnesia:read({Tab, Key}) -> - mnesia:read(Tab, Key, read). - - mnesia:wread({Tab, Key}) -> - mnesia:read(Tab, Key, write). - - mnesia:match_object(Pattern) -> - Tab = element(1, Pattern), - mnesia:match_object(Tab, Pattern, read). - - mnesia:index_match_object(Pattern, Attr) -> - Tab = element(1, Pattern), - mnesia:index_match_object(Tab, Pattern, Attr, read). - -
    - -
    - Activity Concept and Various Access Contexts -

    As previously described, a functional object (Fun) performing - table access operations as listed below may be - passed on as arguments to the function - mnesia:transaction/1,2,3: -

    - - -

    mnesia:write/3 (write/1, s_write/1)

    -
    - -

    mnesia:delete/3 (delete/1, s_delete/1)

    -
    - -

    mnesia:delete_object/3 (delete_object/1, s_delete_object/1)

    -
    - -

    mnesia:read/3 (read/1, wread/1)

    -
    - -

    mnesia:match_object/2 (match_object/1)

    -
    - -

    mnesia:select/3 (select/2)

    -
    - -

    mnesia:foldl/3 (foldl/4, foldr/3, foldr/4)

    -
    - -

    mnesia:all_keys/1

    -
    - -

    mnesia:index_match_object/4 (index_match_object/2)

    -
    - -

    mnesia:index_read/3

    -
    - -

    mnesia:lock/2 (read_lock_table/1, write_lock_table/1)

    -
    - -

    mnesia:table_info/2

    -
    -
    -

    These functions will be performed in a - transaction context involving mechanisms like locking, logging, - replication, checkpoints, subscriptions, commit protocols - etc.However, the same function may also be - evaluated in other activity contexts. -

    -The following activity access contexts are currently supported: -

    - - -

    transaction

    -
    - -

    sync_transaction

    -
    - -

    async_dirty

    -
    - -

    sync_dirty

    -
    - -

    ets

    -
    -
    -

    By passing the same "fun" as argument to the function - mnesia:sync_transaction(Fun [, Args]) it will be performed - in synced transaction context. Synced transactions waits until all - active replicas has committed the transaction (to disc) before - returning from the mnesia:sync_transaction call. Using - sync_transaction is useful for applications that are executing on - several nodes and want to be sure that the update is performed on - the remote nodes before a remote process is spawned or a message - is sent to a remote process, and also when combining transaction - writes with dirty_reads. This is also useful in situations where - an application performs frequent or voluminous updates which may - overload Mnesia on other nodes. -

    -

    By passing the same "fun" as argument to the function - mnesia:async_dirty(Fun [, Args]) it will be performed in - dirty context. The function calls will be mapped to the - corresponding dirty functions. This will still involve logging, - replication and subscriptions but there will be no locking, - local transaction storage or commit protocols involved. - Checkpoint retainers will be updated but will be updated - "dirty". Thus, they will be updated asynchronously. The - functions will wait for the operation to be performed on one - node but not the others. If the table resides locally no waiting - will occur. -

    -

    By passing the same "fun" as an argument to the function - mnesia:sync_dirty(Fun [, Args]) it will be performed in - almost the same context as mnesia:async_dirty/1,2. The - difference is that the operations are performed - synchronously. The caller will wait for the updates to be - performed on all active replicas. Using sync_dirty is useful for - applications that are executing on several nodes and want to be - sure that the update is performed on the remote nodes before a remote - process is spawned or a message is sent to a remote process. This - is also useful in situations where an application performs frequent or - voluminous updates which may overload Mnesia on other - nodes. -

    -

    You can check if your code is executed within a transaction with - mnesia:is_transaction/0, it returns true when called - inside a transaction context and false otherwise.

    - -

    Mnesia tables with storage type RAM_copies and disc_copies - are implemented internally as "ets-tables" and - it is possible for applications to access the these tables - directly. This is only recommended if all options have been weighed - and the possible outcomes are understood. By passing the earlier - mentioned "fun" to the function - mnesia:ets(Fun [, Args]) it will be performed but in a very raw - context. The operations will be performed directly on the - local ets tables assuming that the local storage type are - RAM_copies and that the table is not replicated on other - nodes. Subscriptions will not be triggered nor - checkpoints updated, but this operation is blindingly fast. Disc resident - tables should not be updated with the ets-function since the - disc will not be updated. -

    -

    The Fun may also be passed as an argument to the function - mnesia:activity/2,3,4 which enables usage of customized - activity access callback modules. It can either be obtained - directly by stating the module name as argument or implicitly - by usage of the access_module configuration parameter. A - customized callback module may be used for several purposes, - such as providing triggers, integrity constraints, run time - statistics, or virtual tables. -

    - The callback module does - not have to access real Mnesia tables, it is free to do whatever - it likes as long as the callback interface is fulfilled. -

    - In Appendix C "The Activity Access Call Back Interface" the source - code for one alternate implementation is provided - (mnesia_frag.erl). The context sensitive function - mnesia:table_info/2 may be used to provide virtual - information about a table. One usage of this is to perform - QLC queries within an activity context with a - customized callback module. By providing table information about - table indices and other QLC requirements, - QLC may be used as a generic query language to - access virtual tables. -

    -

    QLC queries may be performed in all these activity - contexts (transaction, sync_transaction, async_dirty, sync_dirty - and ets). The ets activity will only work if the table has no - indices. -

    - -

    The mnesia:dirty_* function always executes with - async_dirty semantics regardless of which activity access contexts - are invoked. They may even invoke contexts without any - enclosing activity access context.

    -
    -
    - -
    - Nested transactions -

    Transactions may be nested in an arbitrary fashion. A child transaction - must run in the same process as its parent. When a child transaction - aborts, the caller of the child transaction will get the - return value {aborted, Reason} and any work performed - by the child will be erased. If a child transaction commits, the - records written by the child will be propagated to the parent. -

    -

    No locks are released when child transactions terminate. Locks - created by a sequence of nested transactions are kept until - the topmost transaction terminates. Furthermore, any updates - performed by a nested transaction are only propagated - in such a manner so that the parent of the nested transaction - sees the updates. No final commitment will be done until - the top level transaction is terminated. - So, although a nested transaction returns {atomic, Val}, - if the enclosing parent transaction is aborted, the entire - nested operation is aborted. -

    -

    The ability to have nested transaction with identical semantics - as top level transaction makes it easier to write - library functions that manipulate mnesia tables. -

    -

    Say for example that we have a function that adds a - new subscriber to a telephony system:

    -
    -      add_subscriber(S) ->
    -          mnesia:transaction(fun() ->
    -              case mnesia:read( ..........
    -    
    -

    This function needs to be called as a transaction. - Now assume that we wish to write a function that - both calls the add_subscriber/1 function and - is in itself protected by the context of a transaction. - By simply calling the add_subscriber/1 from within - another transaction, a nested transaction is created. -

    -

    It is also possible to mix different activity access contexts while nesting, - but the dirty ones (async_dirty,sync_dirty and ets) will inherit the transaction - semantics if they are called inside a transaction and thus it will grab locks and - use two or three phase commit. -

    -
    -      add_subscriber(S) ->
    -          mnesia:transaction(fun() ->
    -             %% Transaction context 
    -             mnesia:read({some_tab, some_data}),
    -             mnesia:sync_dirty(fun() ->
    -                 %% Still in a transaction context.
    -                 case mnesia:read( ..) ..end), end).
    -      add_subscriber2(S) ->
    -          mnesia:sync_dirty(fun() ->
    -             %% In dirty context 
    -             mnesia:read({some_tab, some_data}),
    -             mnesia:transaction(fun() ->
    -                 %% In a transaction context.
    -                 case mnesia:read( ..) ..end), end).
    -    
    -
    - -
    - Pattern Matching - -

    When it is not possible to use mnesia:read/3 Mnesia - provides the programmer with several functions for matching - records against a pattern. The most useful functions of these are: -

    - - mnesia:select(Tab, MatchSpecification, LockKind) -> - transaction abort | [ObjectList] - mnesia:select(Tab, MatchSpecification, NObjects, Lock) -> - transaction abort | {[Object],Continuation} | '$end_of_table' - mnesia:select(Cont) -> - transaction abort | {[Object],Continuation} | '$end_of_table' - mnesia:match_object(Tab, Pattern, LockKind) -> - transaction abort | RecordList - -

    These functions matches a Pattern against all records in - table Tab. In a mnesia:select call Pattern is - a part of MatchSpecification described below. It is not - necessarily performed as an exhaustive search of the entire - table. By utilizing indices and bound values in the key of the - pattern, the actual work done by the function may be condensed - into a few hash lookups. Using ordered_set tables may reduce the - search space if the keys are partially bound. -

    -

    The pattern provided to the functions must be a valid record, - and the first element of the provided tuple must be the - record_name of the table. The special element '_' - matches any data structure in Erlang (also known as an Erlang - term). The special elements ']]> behaves as Erlang - variables i.e. matches anything and binds the first occurrence and - matches the coming occurrences of that variable against the bound value. -

    -

    Use the function mnesia:table_info(Tab, wild_pattern) - to obtain a basic pattern which matches all records in a table - or use the default value in record creation. - Do not make the pattern hard coded since it will make your code more - vulnerable to future changes of the record definition. -

    - - Wildpattern = mnesia:table_info(employee, wild_pattern), - %% Or use - Wildpattern = #employee{_ = '_'}, - -

    For the employee table the wild pattern will look like:

    - - {employee, '_', '_', '_', '_', '_',' _'}. - -

    In order to constrain the match you must replace some - of the '_' elements. The code for matching out - all female employees, looks like: -

    - - Pat = #employee{sex = female, _ = '_'}, - F = fun() -> mnesia:match_object(Pat) end, - Females = mnesia:transaction(F). - -

    It is also possible to use the match function if we want to - check the equality of different attributes. Assume that we want - to find all employees which happens to have a employee number - which is equal to their room number: -

    - - Pat = #employee{emp_no = '$1', room_no = '$1', _ = '_'}, - F = fun() -> mnesia:match_object(Pat) end, - Odd = mnesia:transaction(F). - -

    The function mnesia:match_object/3 lacks some important - features that mnesia:select/3 have. For example - mnesia:match_object/3 can only return the matching records, - and it can not express constraints other then equality. - If we want to find the names of the male employees on the second floor - we could write: -

    - -

    Select can be used to add additional constraints and create - output which can not be done with mnesia:match_object/3.

    -

    The second argument to select is a MatchSpecification. - A MatchSpecification is list of MatchFunctions, where - each MatchFunction consists of a tuple containing - {MatchHead, MatchCondition, MatchBody}. MatchHead - is the same pattern used in mnesia:match_object/3 - described above. MatchCondition is a list of additional - constraints applied to each record, and MatchBody is used - to construct the return values. -

    -

    A detailed explanation of match specifications can be found in - the Erts users guide: Match specifications in Erlang , - and the ets/dets documentations may provide some additional - information. -

    -

    The functions select/4 and select/1 are used to - get a limited number of results, where the Continuation - are used to get the next chunk of results. Mnesia uses the - NObjects as an recommendation only, thus more or less - results then specified with NObjects may be returned in - the result list, even the empty list may be returned despite there - are more results to collect. -

    - -

    There is a severe performance penalty in using - mnesia:select/[1|2|3|4] after any modifying operations - are done on that table in the same transaction, i.e. avoid using - mnesia:write/1 or mnesia:delete/1 before a - mnesia:select in the same transaction.

    -
    -

    If the key attribute is bound in a pattern, the match operation - is very efficient. However, if the key attribute in a pattern is - given as '_', or '$1', the whole employee - table must be searched for records that match. Hence if the table is - large, this can become a time consuming operation, but it can be - remedied with indices (refer to Chapter 5: Indexing) if - mnesia:match_object is used. -

    -

    QLC queries can also be used to search Mnesia tables. By - using mnesia:table/[1|2] as the generator inside a QLC - query you let the query operate on a mnesia table. Mnesia - specific options to mnesia:table/2 are {lock, Lock}, - {n_objects,Integer} and {traverse, SelMethod}. The lock - option specifies whether mnesia should acquire a read or write - lock on the table, and n_objects specifies how many - results should be returned in each chunk to QLC. The last option is - traverse and it specifies which function mnesia should - use to traverse the table. Default select is used, but by using - {traverse, {select, MatchSpecification}} as an option to - mnesia:table/2 the user can specify it's own view of the - table. -

    -

    If no options are specified a read lock will acquired and 100 - results will be returned in each chunk, and select will be used - to traverse the table, i.e.: -

    - - mnesia:table(Tab) -> - mnesia:table(Tab, [{n_objects,100},{lock, read}, {traverse, select}]). - -

    The function mnesia:all_keys(Tab) returns all keys in a - table.

    -
    - -
    - Iteration - -

    Mnesia provides a couple of functions which iterates over all - the records in a table. -

    - - mnesia:foldl(Fun, Acc0, Tab) -> NewAcc | transaction abort - mnesia:foldr(Fun, Acc0, Tab) -> NewAcc | transaction abort - mnesia:foldl(Fun, Acc0, Tab, LockType) -> NewAcc | transaction abort - mnesia:foldr(Fun, Acc0, Tab, LockType) -> NewAcc | transaction abort - -

    These functions iterate over the mnesia table Tab and - apply the function Fun to each record. The Fun - takes two arguments, the first argument is a record from the - table and the second argument is the accumulator. The - Fun return a new accumulator.

    -

    The first time the Fun is applied Acc0 will - be the second argument. The next time the Fun is called - the return value from the previous call, will be used as the - second argument. The term the last call to the Fun returns - will be the return value of the fold[lr] function. -

    -

    The difference between foldl and foldr is the - order the table is accessed for ordered_set tables, - for every other table type the functions are equivalent. -

    -

    LockType specifies what type of lock that shall be - acquired for the iteration, default is read. If - records are written or deleted during the iteration a write - lock should be acquired.

    -

    These functions might be used to find records in a table - when it is impossible to write constraints for - mnesia:match_object/3, or when you want to perform - some action on certain records. -

    -

    For example finding all the employees who has a salary - below 10 could look like:

    - - Constraint = - fun(Emp, Acc) when Emp#employee.salary < 10 -> - [Emp | Acc]; - (_, Acc) -> - Acc - end, - Find = fun() -> mnesia:foldl(Constraint, [], employee) end, - mnesia:transaction(Find). - ]]> -

    Raising the salary to 10 for everyone with a salary below 10 - and return the sum of all raises:

    - - Increase = - fun(Emp, Acc) when Emp#employee.salary < 10 -> - OldS = Emp#employee.salary, - ok = mnesia:write(Emp#employee{salary = 10}), - Acc + 10 - OldS; - (_, Acc) -> - Acc - end, - IncLow = fun() -> mnesia:foldl(Increase, 0, employee, write) end, - mnesia:transaction(IncLow). - ]]> -

    A lot of nice things can be done with the iterator functions - but some caution should be taken about performance and memory - utilization for large tables.

    -

    Call these iteration functions on nodes that contain a replica of the - table. Each call to the function Fun access the table and if the table - resides on another node it will generate a lot of unnecessary - network traffic.

    -

    Mnesia also provides some functions that make it possible for - the user to iterate over the table. The order of the - iteration is unspecified if the table is not of the ordered_set - type.

    - - mnesia:first(Tab) -> Key | transaction abort - mnesia:last(Tab) -> Key | transaction abort - mnesia:next(Tab,Key) -> Key | transaction abort - mnesia:prev(Tab,Key) -> Key | transaction abort - mnesia:snmp_get_next_index(Tab,Index) -> {ok, NextIndex} | endOfTable - -

    The order of first/last and next/prev are only valid for - ordered_set tables, for all other tables, they are synonyms. - When the end of the table is reached the special key - '$end_of_table' is returned.

    -

    If records are written and deleted during the traversal, use - mnesia:fold[lr]/4 with a write lock. Or - mnesia:write_lock_table/1 when using first and next.

    -

    Writing or deleting in transaction context creates a local copy - of each modified record, so modifying each record in a large - table uses a lot of memory. Mnesia will compensate for every - written or deleted record during the iteration in a transaction - context, which may reduce the performance. If possible avoid writing - or deleting records in the same transaction before iterating over the - table.

    -

    In dirty context, i.e. sync_dirty or async_dirty, - the modified records are not stored in a local copy; instead, - each record is updated separately. This generates a lot of - network traffic if the table has a replica on another node and - has all the other drawbacks that dirty operations - have. Especially for the mnesia:first/1 and - mnesia:next/2 commands, the same drawbacks as described - above for dirty_first and dirty_next applies, i.e. - no writes to the table should be done during iteration.

    -

    -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc 2009-11-20 13:36:02.000000000 +0000 @@ -0,0 +1,1171 @@ + + + + +
    + + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Transactions and Other Access Contexts + Claes Wikström, Hans Nilsson and Håkan Mattsson + + + + + + + Mnesia_chap4.xml +
    +

    This chapter describes the Mnesia transaction system and the + transaction properties which make Mnesia a fault tolerant, + distributed database management system. +

    +

    Also covered in this chapter are the locking functions, + including table locks and sticky locks, as well as alternative + functions which bypass the transaction system in favor of improved + speed and reduced overheads. These functions are called "dirty + operations". We also describe the usage of nested transactions. + This chapter contains the following sections: +

    + + transaction properties, which include atomicity, + consistency, isolation, and durability + + Locking + + Dirty operations + + Record names vs table names + + Activity concept and various access contexts + + Nested transactions + + Pattern matching + + Iteration + + + +
    + + Transaction Properties +

    Transactions are an important tool when designing fault + tolerant, distributed systems. A Mnesia transaction is a mechanism + by which a series of database operations can be executed as one + functional block. The functional block which is run as a + transaction is called a Functional Object (Fun), and this code can + read, write, or delete Mnesia records. The Fun is evaluated as a + transaction which either commits, or aborts. If a transaction + succeeds in executing Fun it will replicate the action on all nodes + involved, or abort if an error occurs. +

    +

    The following example shows a transaction which raises the + salary of certain employee numbers. +

    + +

    The transaction raise(Eno, Raise) - > contains a Fun + made up of four lines of code. This Fun is called by the statement + mnesia:transaction(F) and returns a value. +

    +

    The Mnesia transaction system facilitates the construction of + reliable, distributed systems by providing the following important + properties: +

    + + The transaction handler ensures that a Fun which is placed + inside a transaction does not interfere with operations embedded + in other transactions when it executes a series of operations on + tables. + + The transaction handler ensures that either all operations + in the transaction are performed successfully on all nodes + atomically, or the transaction fails without permanent effect on + any of the nodes. + + The Mnesia transactions have four important properties, + which we call Atomicity, + Consistency,Isolation, and + Durability, or ACID for short. These properties are + described in the following sub-sections. + + +
    + Atomicity +

    Atomicity means that database changes which are + executed by a transaction take effect on all nodes involved, or + on none of the nodes. In other words, the transaction either + succeeds entirely, or it fails entirely. +

    +

    Atomicity is particularly important when we want to + atomically write more than one record in the same + transaction. The raise/2 function, shown as an example + above, writes one record only. The insert_emp/3 function, + shown in the program listing in Chapter 2, writes the record + employee as well as employee relations such as + at_dep and in_proj into the database. If we run + this latter code inside a transaction, then the transaction + handler ensures that the transaction either succeeds completely, + or not at all. +

    +

    Mnesia is a distributed DBMS where data can be replicated on + several nodes. In many such applications, it is important that a + series of write operations are performed atomically inside a + transaction. The atomicity property ensures that a transaction + take effect on all nodes, or none at all.

    +
    + +
    + Consistency +

    Consistency. This transaction property ensures that + a transaction always leaves the DBMS in a consistent state. For + example, Mnesia ensures that inconsistencies will not occur if + Erlang, Mnesia or the computer crashes while a write operation + is in progress. +

    +
    + +
    + Isolation +

    Isolation. This transaction property ensures that + transactions which execute on different nodes in a network, and + access and manipulate the same data records, will not interfere + with each other. +

    +

    The isolation property makes it possible to concurrently execute + the raise/2 function. A classical problem in concurrency control + theory is the so called "lost update problem". +

    +

    The isolation property is extremely useful if the following + circumstances occurs where an employee (with an employee number + 123) and two processes, (P1 and P2), are concurrently trying to + raise the salary for the employee. The initial value of the + employees salary is, for example, 5. Process P1 then starts to execute, + it reads the employee record and adds 2 to the salary. At this + point in time, process P1 is for some reason preempted and + process P2 has the opportunity to run. P2 reads the record, adds 3 + to the salary, and finally writes a new employee record with + the salary set to 8. Now, process P1 start to run again and + writes its employee record with salary set to 7, thus + effectively overwriting and undoing the work performed by + process P2. The update performed by P2 is lost. +

    +

    A transaction system makes it possible to concurrently + execute two or more processes which manipulate the same + record. The programmer does not need to check that the + updates are synchronous, this is overseen by the + transaction handler. All programs accessing the database through + the transaction system may be written as if they had sole access + to the data. +

    +
    + +
    + Durability +

    Durability. This transaction property ensures that + changes made to the DBMS by a transaction are permanent. Once a + transaction has been committed, all changes made to the database + are durable - i.e. they are written safely to disc and will not + be corrupted or disappear. +

    + +

    The durability feature described does not entirely apply to + situations where Mnesia is configured as a "pure" primary memory + database. +

    +
    +
    +
    + +
    + Locking +

    Different transaction managers employ different strategies to + satisfy the isolation property. Mnesia uses the standard technique + of two-phase locking. This means that locks are set on records + before they are read or written. Mnesia uses five different kinds + of locks. +

    + + Read locks. A read lock is set on one replica of + a record before it can be read. + + Write locks. Whenever a transaction writes to an + record, write locks are first set on all replicas of that + particular record. + + Read table locks. If a transaction traverses an + entire table in search for a record which satisfy some + particular property, it is most inefficient to set read locks on + the records, one by one. It is also very memory consuming, since + the read locks themselves may take up considerable space if the + table is very large. For this reason, Mnesia can set a read lock + on an entire table. + + Write table locks. If a transaction writes a + large number of records to one table, it is possible to set a + write lock on the entire table. + + Sticky locks. These are write locks that stay in + place at a node after the transaction which initiated the lock + has terminated. + +

    Mnesia employs a strategy whereby functions such as + mnesia:read/1 acquire the necessary locks dynamically as + the transactions execute. Mnesia automatically sets and releases + the locks and the programmer does not have to code these + operations. +

    +

    Deadlocks can occur when concurrent processes set and release + locks on the same records. Mnesia employs a "wait-die" strategy to + resolve these situations. If Mnesia suspects that a deadlock can + occur when a transaction tries to set a lock, the transaction is + forced to release all its locks and sleep for a while. The + Fun in the transaction will be evaluated one more time. +

    +

    For this reason, it is important that the code inside the Fun given to + mnesia:transaction/1 is pure. Some strange results can + occur if, for example, messages are sent by the transaction + Fun. The following example illustrates this situation: +

    + +

    This transaction could write the text "Trying to write ... " a thousand times to the terminal. Mnesia does guarantee, + however, that each and every transaction will eventually run. As a + result, Mnesia is not only deadlock free, but also livelock + free. +

    +

    The Mnesia programmer cannot prioritize one particular + transaction to execute before other transactions which are waiting + to execute. As a result, the Mnesia DBMS transaction system is not + suitable for hard real time applications. However, Mnesia contains + other features that have real time properties. +

    +

    Mnesia dynamically sets and releases locks as + transactions execute, therefore, it is very dangerous to execute code with + transaction side-effects. In particular, a receive + statement inside a transaction can lead to a situation where the + transaction hangs and never returns, which in turn can cause locks + not to release. This situation could bring the whole system to a + standstill since other transactions which execute in other + processes, or on other nodes, are forced to wait for the defective + transaction. +

    +

    If a transaction terminates abnormally, Mnesia will + automatically release the locks held by the transaction. +

    +

    We have shown examples of a number of functions that can be + used inside a transaction. The following list shows the + simplest Mnesia functions that work with transactions. It + is important to realize that these functions must be embedded in a + transaction. If no enclosing transaction (or other enclosing + Mnesia activity) exists, they will all fail. +

    + + mnesia:transaction(Fun) -> {aborted, Reason} |{atomic, Value}. This function executes one transaction with the + functional object Fun as the single parameter. + + mnesia:read({Tab, Key}) -> transaction abort | RecordList. This function reads all records with Key + as key from table Tab. This function has the same semantics + regardless of the location of Table. If the table is of + type bag, the read({Tab, Key}) can return an arbitrarily + long list. If the table is of type set, the list is + either of length one, or []. + + mnesia:wread({Tab, Key}) -> transaction abort | RecordList. This function behaves the same way as the + previously listed read/1 function, except that it + acquires a write lock instead of a read lock. If we execute a + transaction which reads a record, modifies the record, and then + writes the record, it is slightly more efficient to set the + write lock immediately. In cases where we issue a + mnesia:read/1, followed by a mnesia:write/1, the + first read lock must be upgraded to a write lock when the write + operation is executed. + + mnesia:write(Record) -> transaction abort | ok. This function writes a record into the database. The + Record argument is an instance of a record. The function + returns ok, or aborts the transaction if an error should + occur. + + mnesia:delete({Tab, Key}) -> transaction abort | ok. This + function deletes all records with the given key. + + mnesia:delete_object(Record) -> transaction abort | ok. This function deletes records with object id + Record. This function is used when we want to delete only + some records in a table of type bag. + + +
    + Sticky Locks +

    As previously stated, the locking strategy used by Mnesia is + to lock one record when we read a record, and lock all replicas + of a record when we write a record. However, there are + applications which use Mnesia mainly for its fault-tolerant + qualities, and these applications may be configured with one + node doing all the heavy work, and a standby node which is ready + to take over in case the main node fails. Such applications may + benefit from using sticky locks instead of the normal locking + scheme. +

    +

    A sticky lock is a lock which stays in place at a node after + the transaction which first acquired the lock has terminated. To + illustrate this, assume that we execute the following + transaction: +

    + + F = fun() -> + mnesia:write(#foo{a = kalle}) + end, + mnesia:transaction(F). + +

    The foo table is replicated on the two nodes N1 + and N2. +

    +Normal locking requires: +

    + + one network rpc (2 messages) to acquire the write lock + + three network messages to execute the two-phase commit protocol. + + +

    If we use sticky locks, we must first change the code as follows: +

    + + + F = fun() -> + mnesia:s_write(#foo{a = kalle}) + end, + mnesia:transaction(F). + +

    This code uses the s_write/1 function instead of the + write/1 function. The s_write/1 function sets a + sticky lock instead of a normal lock. If the table is not + replicated, sticky locks have no special effect. If the table is + replicated, and we set a sticky lock on node N1, this + lock will then stick to node N1. The next time we try to + set a sticky lock on the same record at node N1, Mnesia + will see that the lock is already set and will not do a network + operation in order to acquire the lock. +

    +

    It is much more efficient to set a local lock than it is to set + a networked lock, and for this reason sticky locks can benefit + application that use a replicated table and perform most of the + work on only one of the nodes. +

    +

    If a record is stuck at node N1 and we try to set a + sticky lock for the record on node N2, the record must be + unstuck. This operation is expensive and will reduce performance. The unsticking is + done automatically if we issue s_write/1 requests at + N2. +

    +
    + +
    + Table Locks +

    Mnesia supports read and write locks on whole tables as a + complement to the normal locks on single records. As previously + stated, Mnesia sets and releases locks automatically, and the + programmer does not have to code these operations. However, + transactions which read and write a large number of records in a + specific table will execute more efficiently if we start the + transaction by setting a table lock on this table. This will + block other concurrent transactions from the table. The + following two function are used to set explicit table locks for + read and write operations: +

    + + mnesia:read_lock_table(Tab) Sets a read lock on + the table Tab + mnesia:write_lock_table(Tab) Sets a write lock on + the table Tab + +

    Alternate syntax for acquisition of table locks is as follows: +

    + + mnesia:lock({table, Tab}, read) + mnesia:lock({table, Tab}, write) + +

    The matching operations in Mnesia may either lock the entire + table or just a single record (when the key is bound in the + pattern). +

    +
    + +
    + Global Locks +

    Write locks are normally acquired on all nodes where a + replica of the table resides (and is active). Read locks are + acquired on one node (the local one if a local + replica exists). +

    +

    The function mnesia:lock/2 is intended to support + table locks (as mentioned previously) + but also for situations when locks need to be + acquired regardless of how tables have been replicated: +

    + + mnesia:lock({global, GlobalKey, Nodes}, LockKind) + + LockKind ::= read | write | ... + +

    The lock is acquired on the LockItem on all Nodes in the + nodes list.

    +
    +
    + +
    + Dirty Operations +

    In many applications, the overhead of processing a transaction + may result in a loss of performance. Dirty operation are short + cuts which bypass much of the processing and increase the speed + of the transaction. +

    +

    Dirty operation are useful in many situations, for example in a datagram routing + application where Mnesia stores the routing table, and it is time + consuming to start a whole transaction every time a packet is + received. For this reason, Mnesia has functions which manipulate + tables without using transactions. This alternative + to processing is known as a dirty operation. However, it is important to + realize the trade-off in avoiding the overhead of transaction + processing: +

    + + The atomicity and the isolation properties of Mnesia are lost. + + The isolation property is compromised, because other + Erlang processes, which use transaction to manipulate the data, + do not get the benefit of isolation if we simultaneously use + dirty operations to read and write records from the same table. + + +

    The major advantage of dirty operations is that they execute + much faster than equivalent operations that are processed as + functional objects within a transaction. +

    +

    Dirty operations + are written to disc if they are performed on a table of type + disc_copies, or type disc_only_copies. Mnesia also + ensures that all replicas of a table are updated if a + dirty write operation is performed on a table. +

    +

    A dirty operation will ensure a certain level of consistency. + For example, it is not possible for dirty operations to return + garbled records. Hence, each individual read or write operation + is performed in an atomic manner. +

    +

    All dirty functions execute a call to exit({aborted, Reason}) on failure. Even if the following functions are + executed inside a transaction no locks will be acquired. The + following functions are available: +

    + + mnesia:dirty_read({Tab, Key}). This function reads + record(s) from Mnesia. + + mnesia:dirty_write(Record). This function writes + the record Record + mnesia:dirty_delete({Tab, Key}). This function deletes + record(s) with the key Key. + + mnesia:dirty_delete_object(Record) This function is + the dirty operation alternative to the function + delete_object/1 + +

    mnesia:dirty_first(Tab). This function returns the + "first" key in the table Tab.

    +

    Records in set or bag tables are not sorted. + However, there is + a record order which is not known to the user. + This means that it is possible to traverse a table by means of + this function in conjunction with the dirty_next/2 + function. +

    +

    If there are no records at all in the table, this function + will return the atom '$end_of_table'. It is not + recommended to use this atom as the key for any user + records. +

    +
    + mnesia:dirty_next(Tab, Key). This function returns + the "next" key in the table Tab. This function makes it + possible to traverse a table and perform some operation on all + records in the table. When the end of the table is reached the + special key '$end_of_table' is returned. Otherwise, the + function returns a key which can be used to read the actual + record. +

    +The behavior is undefined if any process perform a write + operation on the table while we traverse the table with the + dirty_next/2 function. This is because write + operations on a Mnesia table may lead to internal reorganizations + of the table itself. This is an implementation detail, but remember + the dirty functions are low level functions. +
    + mnesia:dirty_last(Tab) This function works exactly as + mnesia:dirty_first/1 but returns the last object in + Erlang term order for the ordered_set table type. For + all other table types, mnesia:dirty_first/1 and + mnesia:dirty_last/1 are synonyms. + + mnesia:dirty_prev(Tab, Key) This function works exactly as + mnesia:dirty_next/2 but returns the previous object in + Erlang term order for the ordered_set table type. For + all other table types, mnesia:dirty_next/2 and + mnesia:dirty_prev/2 are synonyms. + + +

    mnesia:dirty_slot(Tab, Slot)

    +

    Returns the list of records that are associated with Slot + in a table. It can be used to traverse a table in a manner + similar to the dirty_next/2 function. A table has a + number of slots that range from zero to some unknown upper + bound. The function dirty_slot/2 returns the special + atom '$end_of_table' when the end of the table is + reached. +

    +The behavior of this function is undefined if the + table is written on while being + traversed. mnesia:read_lock_table(Tab) may be used to + ensure that no transaction protected writes are performed + during the iteration. +

    +
    + +

    mnesia:dirty_update_counter({Tab,Key}, Val).

    +

    Counters are positive integers with a value greater than or + equal to zero. Updating a counter will add the Val and + the counter where Val is a positive or negative integer. +

    + There exists no special counter records in + Mnesia. However, records on the form of {TabName, Key, Integer} can be used as counters, and can be + persistent. +

    +

    It is not possible to have transaction protected updates of + counter records. +

    +

    There are two significant differences when using this + function instead of reading the record, performing the + arithmetic, and writing the record: +

    + + it is much more efficient + + the dirty_update_counter/2 function is + performed as an atomic operation although it is not protected by + a transaction. Accordingly, no table update is lost if two + processes simultaneously execute the + dirty_update_counter/2 function. + + +
    + mnesia:dirty_match_object(Pat). This function is + the dirty equivalent of mnesia:match_object/1. + + mnesia:dirty_select(Tab, Pat). This function is + the dirty equivalent of mnesia:select/2. + + mnesia:dirty_index_match_object(Pat, Pos). This + function is the dirty equivalent of + mnesia:index_match_object/2. + + mnesia:dirty_index_read(Tab, SecondaryKey, Pos). This + function is the dirty equivalent of mnesia:index_read/3. + + mnesia:dirty_all_keys(Tab). This function is the + dirty equivalent of mnesia:all_keys/1. + +
    +
    + +
    + + Record Names versus Table Names +

    In Mnesia, all records in a table must have the same name. All + the records must be instances of the same + record type. The record name does however not necessarily be + the same as the table name. Even though that it is the case in + the most of the examples in this document. If a table is created + without the record_name property the code below will + ensure all records in the tables have the same name as the table: +

    + + mnesia:create_table(subscriber, []) + +

    However, if the table is is created with an explicit record name + as argument, as shown below, it is possible to store subscriber + records in both of the tables regardless of the table names: +

    + + TabDef = [{record_name, subscriber}], + mnesia:create_table(my_subscriber, TabDef), + mnesia:create_table(your_subscriber, TabDef). + +

    In order to access such + tables it is not possible to use the simplified access functions + as described earlier in the document. For example, + writing a subscriber record into a table requires a + mnesia:write/3function instead of the simplified functions + mnesia:write/1 and mnesia:s_write/1: +

    + + mnesia:write(subscriber, #subscriber{}, write) + mnesia:write(my_subscriber, #subscriber{}, sticky_write) + mnesia:write(your_subscriber, #subscriber{}, write) + +

    The following simplified piece of code illustrates the + relationship between the simplified access functions used in + most examples and their more flexible counterparts: +

    + + mnesia:dirty_write(Record) -> + Tab = element(1, Record), + mnesia:dirty_write(Tab, Record). + + mnesia:dirty_delete({Tab, Key}) -> + mnesia:dirty_delete(Tab, Key). + + mnesia:dirty_delete_object(Record) -> + Tab = element(1, Record), + mnesia:dirty_delete_object(Tab, Record) + + mnesia:dirty_update_counter({Tab, Key}, Incr) -> + mnesia:dirty_update_counter(Tab, Key, Incr). + + mnesia:dirty_read({Tab, Key}) -> + Tab = element(1, Record), + mnesia:dirty_read(Tab, Key). + + mnesia:dirty_match_object(Pattern) -> + Tab = element(1, Pattern), + mnesia:dirty_match_object(Tab, Pattern). + + mnesia:dirty_index_match_object(Pattern, Attr) + Tab = element(1, Pattern), + mnesia:dirty_index_match_object(Tab, Pattern, Attr). + + mnesia:write(Record) -> + Tab = element(1, Record), + mnesia:write(Tab, Record, write). + + mnesia:s_write(Record) -> + Tab = element(1, Record), + mnesia:write(Tab, Record, sticky_write). + + mnesia:delete({Tab, Key}) -> + mnesia:delete(Tab, Key, write). + + mnesia:s_delete({Tab, Key}) -> + mnesia:delete(Tab, Key, sticky_write). + + mnesia:delete_object(Record) -> + Tab = element(1, Record), + mnesia:delete_object(Tab, Record, write). + + mnesia:s_delete_object(Record) -> + Tab = element(1, Record), + mnesia:delete_object(Tab, Record. sticky_write). + + mnesia:read({Tab, Key}) -> + mnesia:read(Tab, Key, read). + + mnesia:wread({Tab, Key}) -> + mnesia:read(Tab, Key, write). + + mnesia:match_object(Pattern) -> + Tab = element(1, Pattern), + mnesia:match_object(Tab, Pattern, read). + + mnesia:index_match_object(Pattern, Attr) -> + Tab = element(1, Pattern), + mnesia:index_match_object(Tab, Pattern, Attr, read). + +
    + +
    + Activity Concept and Various Access Contexts +

    As previously described, a functional object (Fun) performing + table access operations as listed below may be + passed on as arguments to the function + mnesia:transaction/1,2,3: +

    + + +

    mnesia:write/3 (write/1, s_write/1)

    +
    + +

    mnesia:delete/3 (delete/1, s_delete/1)

    +
    + +

    mnesia:delete_object/3 (delete_object/1, s_delete_object/1)

    +
    + +

    mnesia:read/3 (read/1, wread/1)

    +
    + +

    mnesia:match_object/2 (match_object/1)

    +
    + +

    mnesia:select/3 (select/2)

    +
    + +

    mnesia:foldl/3 (foldl/4, foldr/3, foldr/4)

    +
    + +

    mnesia:all_keys/1

    +
    + +

    mnesia:index_match_object/4 (index_match_object/2)

    +
    + +

    mnesia:index_read/3

    +
    + +

    mnesia:lock/2 (read_lock_table/1, write_lock_table/1)

    +
    + +

    mnesia:table_info/2

    +
    +
    +

    These functions will be performed in a + transaction context involving mechanisms like locking, logging, + replication, checkpoints, subscriptions, commit protocols + etc.However, the same function may also be + evaluated in other activity contexts. +

    +The following activity access contexts are currently supported: +

    + + +

    transaction

    +
    + +

    sync_transaction

    +
    + +

    async_dirty

    +
    + +

    sync_dirty

    +
    + +

    ets

    +
    +
    +

    By passing the same "fun" as argument to the function + mnesia:sync_transaction(Fun [, Args]) it will be performed + in synced transaction context. Synced transactions waits until all + active replicas has committed the transaction (to disc) before + returning from the mnesia:sync_transaction call. Using + sync_transaction is useful for applications that are executing on + several nodes and want to be sure that the update is performed on + the remote nodes before a remote process is spawned or a message + is sent to a remote process, and also when combining transaction + writes with dirty_reads. This is also useful in situations where + an application performs frequent or voluminous updates which may + overload Mnesia on other nodes. +

    +

    By passing the same "fun" as argument to the function + mnesia:async_dirty(Fun [, Args]) it will be performed in + dirty context. The function calls will be mapped to the + corresponding dirty functions. This will still involve logging, + replication and subscriptions but there will be no locking, + local transaction storage or commit protocols involved. + Checkpoint retainers will be updated but will be updated + "dirty". Thus, they will be updated asynchronously. The + functions will wait for the operation to be performed on one + node but not the others. If the table resides locally no waiting + will occur. +

    +

    By passing the same "fun" as an argument to the function + mnesia:sync_dirty(Fun [, Args]) it will be performed in + almost the same context as mnesia:async_dirty/1,2. The + difference is that the operations are performed + synchronously. The caller will wait for the updates to be + performed on all active replicas. Using sync_dirty is useful for + applications that are executing on several nodes and want to be + sure that the update is performed on the remote nodes before a remote + process is spawned or a message is sent to a remote process. This + is also useful in situations where an application performs frequent or + voluminous updates which may overload Mnesia on other + nodes. +

    +

    You can check if your code is executed within a transaction with + mnesia:is_transaction/0, it returns true when called + inside a transaction context and false otherwise.

    + +

    Mnesia tables with storage type RAM_copies and disc_copies + are implemented internally as "ets-tables" and + it is possible for applications to access the these tables + directly. This is only recommended if all options have been weighed + and the possible outcomes are understood. By passing the earlier + mentioned "fun" to the function + mnesia:ets(Fun [, Args]) it will be performed but in a very raw + context. The operations will be performed directly on the + local ets tables assuming that the local storage type are + RAM_copies and that the table is not replicated on other + nodes. Subscriptions will not be triggered nor + checkpoints updated, but this operation is blindingly fast. Disc resident + tables should not be updated with the ets-function since the + disc will not be updated. +

    +

    The Fun may also be passed as an argument to the function + mnesia:activity/2,3,4 which enables usage of customized + activity access callback modules. It can either be obtained + directly by stating the module name as argument or implicitly + by usage of the access_module configuration parameter. A + customized callback module may be used for several purposes, + such as providing triggers, integrity constraints, run time + statistics, or virtual tables. +

    + The callback module does + not have to access real Mnesia tables, it is free to do whatever + it likes as long as the callback interface is fulfilled. +

    + In Appendix C "The Activity Access Call Back Interface" the source + code for one alternate implementation is provided + (mnesia_frag.erl). The context sensitive function + mnesia:table_info/2 may be used to provide virtual + information about a table. One usage of this is to perform + QLC queries within an activity context with a + customized callback module. By providing table information about + table indices and other QLC requirements, + QLC may be used as a generic query language to + access virtual tables. +

    +

    QLC queries may be performed in all these activity + contexts (transaction, sync_transaction, async_dirty, sync_dirty + and ets). The ets activity will only work if the table has no + indices. +

    + +

    The mnesia:dirty_* function always executes with + async_dirty semantics regardless of which activity access contexts + are invoked. They may even invoke contexts without any + enclosing activity access context.

    +
    +
    + +
    + Nested transactions +

    Transactions may be nested in an arbitrary fashion. A child transaction + must run in the same process as its parent. When a child transaction + aborts, the caller of the child transaction will get the + return value {aborted, Reason} and any work performed + by the child will be erased. If a child transaction commits, the + records written by the child will be propagated to the parent. +

    +

    No locks are released when child transactions terminate. Locks + created by a sequence of nested transactions are kept until + the topmost transaction terminates. Furthermore, any updates + performed by a nested transaction are only propagated + in such a manner so that the parent of the nested transaction + sees the updates. No final commitment will be done until + the top level transaction is terminated. + So, although a nested transaction returns {atomic, Val}, + if the enclosing parent transaction is aborted, the entire + nested operation is aborted. +

    +

    The ability to have nested transaction with identical semantics + as top level transaction makes it easier to write + library functions that manipulate mnesia tables. +

    +

    Say for example that we have a function that adds a + new subscriber to a telephony system:

    +
    +      add_subscriber(S) ->
    +          mnesia:transaction(fun() ->
    +              case mnesia:read( ..........
    +    
    +

    This function needs to be called as a transaction. + Now assume that we wish to write a function that + both calls the add_subscriber/1 function and + is in itself protected by the context of a transaction. + By simply calling the add_subscriber/1 from within + another transaction, a nested transaction is created. +

    +

    It is also possible to mix different activity access contexts while nesting, + but the dirty ones (async_dirty,sync_dirty and ets) will inherit the transaction + semantics if they are called inside a transaction and thus it will grab locks and + use two or three phase commit. +

    +
    +      add_subscriber(S) ->
    +          mnesia:transaction(fun() ->
    +             %% Transaction context 
    +             mnesia:read({some_tab, some_data}),
    +             mnesia:sync_dirty(fun() ->
    +                 %% Still in a transaction context.
    +                 case mnesia:read( ..) ..end), end).
    +      add_subscriber2(S) ->
    +          mnesia:sync_dirty(fun() ->
    +             %% In dirty context 
    +             mnesia:read({some_tab, some_data}),
    +             mnesia:transaction(fun() ->
    +                 %% In a transaction context.
    +                 case mnesia:read( ..) ..end), end).
    +    
    +
    + +
    + Pattern Matching + +

    When it is not possible to use mnesia:read/3 Mnesia + provides the programmer with several functions for matching + records against a pattern. The most useful functions of these are: +

    + + mnesia:select(Tab, MatchSpecification, LockKind) -> + transaction abort | [ObjectList] + mnesia:select(Tab, MatchSpecification, NObjects, Lock) -> + transaction abort | {[Object],Continuation} | '$end_of_table' + mnesia:select(Cont) -> + transaction abort | {[Object],Continuation} | '$end_of_table' + mnesia:match_object(Tab, Pattern, LockKind) -> + transaction abort | RecordList + +

    These functions matches a Pattern against all records in + table Tab. In a mnesia:select call Pattern is + a part of MatchSpecification described below. It is not + necessarily performed as an exhaustive search of the entire + table. By utilizing indices and bound values in the key of the + pattern, the actual work done by the function may be condensed + into a few hash lookups. Using ordered_set tables may reduce the + search space if the keys are partially bound. +

    +

    The pattern provided to the functions must be a valid record, + and the first element of the provided tuple must be the + record_name of the table. The special element '_' + matches any data structure in Erlang (also known as an Erlang + term). The special elements ']]> behaves as Erlang + variables i.e. matches anything and binds the first occurrence and + matches the coming occurrences of that variable against the bound value. +

    +

    Use the function mnesia:table_info(Tab, wild_pattern) + to obtain a basic pattern which matches all records in a table + or use the default value in record creation. + Do not make the pattern hard coded since it will make your code more + vulnerable to future changes of the record definition. +

    + + Wildpattern = mnesia:table_info(employee, wild_pattern), + %% Or use + Wildpattern = #employee{_ = '_'}, + +

    For the employee table the wild pattern will look like:

    + + {employee, '_', '_', '_', '_', '_',' _'}. + +

    In order to constrain the match you must replace some + of the '_' elements. The code for matching out + all female employees, looks like: +

    + + Pat = #employee{sex = female, _ = '_'}, + F = fun() -> mnesia:match_object(Pat) end, + Females = mnesia:transaction(F). + +

    It is also possible to use the match function if we want to + check the equality of different attributes. Assume that we want + to find all employees which happens to have a employee number + which is equal to their room number: +

    + + Pat = #employee{emp_no = '$1', room_no = '$1', _ = '_'}, + F = fun() -> mnesia:match_object(Pat) end, + Odd = mnesia:transaction(F). + +

    The function mnesia:match_object/3 lacks some important + features that mnesia:select/3 have. For example + mnesia:match_object/3 can only return the matching records, + and it can not express constraints other then equality. + If we want to find the names of the male employees on the second floor + we could write: +

    + +

    Select can be used to add additional constraints and create + output which can not be done with mnesia:match_object/3.

    +

    The second argument to select is a MatchSpecification. + A MatchSpecification is list of MatchFunctions, where + each MatchFunction consists of a tuple containing + {MatchHead, MatchCondition, MatchBody}. MatchHead + is the same pattern used in mnesia:match_object/3 + described above. MatchCondition is a list of additional + constraints applied to each record, and MatchBody is used + to construct the return values. +

    +

    A detailed explanation of match specifications can be found in + the Erts users guide: Match specifications in Erlang , + and the ets/dets documentations may provide some additional + information. +

    +

    The functions select/4 and select/1 are used to + get a limited number of results, where the Continuation + are used to get the next chunk of results. Mnesia uses the + NObjects as an recommendation only, thus more or less + results then specified with NObjects may be returned in + the result list, even the empty list may be returned despite there + are more results to collect. +

    + +

    There is a severe performance penalty in using + mnesia:select/[1|2|3|4] after any modifying operations + are done on that table in the same transaction, i.e. avoid using + mnesia:write/1 or mnesia:delete/1 before a + mnesia:select in the same transaction.

    +
    +

    If the key attribute is bound in a pattern, the match operation + is very efficient. However, if the key attribute in a pattern is + given as '_', or '$1', the whole employee + table must be searched for records that match. Hence if the table is + large, this can become a time consuming operation, but it can be + remedied with indices (refer to Chapter 5: Indexing) if + mnesia:match_object is used. +

    +

    QLC queries can also be used to search Mnesia tables. By + using mnesia:table/[1|2] as the generator inside a QLC + query you let the query operate on a mnesia table. Mnesia + specific options to mnesia:table/2 are {lock, Lock}, + {n_objects,Integer} and {traverse, SelMethod}. The lock + option specifies whether mnesia should acquire a read or write + lock on the table, and n_objects specifies how many + results should be returned in each chunk to QLC. The last option is + traverse and it specifies which function mnesia should + use to traverse the table. Default select is used, but by using + {traverse, {select, MatchSpecification}} as an option to + mnesia:table/2 the user can specify it's own view of the + table. +

    +

    If no options are specified a read lock will acquired and 100 + results will be returned in each chunk, and select will be used + to traverse the table, i.e.: +

    + + mnesia:table(Tab) -> + mnesia:table(Tab, [{n_objects,100},{lock, read}, {traverse, select}]). + +

    The function mnesia:all_keys(Tab) returns all keys in a + table.

    +
    + +
    + Iteration + +

    Mnesia provides a couple of functions which iterates over all + the records in a table. +

    + + mnesia:foldl(Fun, Acc0, Tab) -> NewAcc | transaction abort + mnesia:foldr(Fun, Acc0, Tab) -> NewAcc | transaction abort + mnesia:foldl(Fun, Acc0, Tab, LockType) -> NewAcc | transaction abort + mnesia:foldr(Fun, Acc0, Tab, LockType) -> NewAcc | transaction abort + +

    These functions iterate over the mnesia table Tab and + apply the function Fun to each record. The Fun + takes two arguments, the first argument is a record from the + table and the second argument is the accumulator. The + Fun return a new accumulator.

    +

    The first time the Fun is applied Acc0 will + be the second argument. The next time the Fun is called + the return value from the previous call, will be used as the + second argument. The term the last call to the Fun returns + will be the return value of the fold[lr] function. +

    +

    The difference between foldl and foldr is the + order the table is accessed for ordered_set tables, + for every other table type the functions are equivalent. +

    +

    LockType specifies what type of lock that shall be + acquired for the iteration, default is read. If + records are written or deleted during the iteration a write + lock should be acquired.

    +

    These functions might be used to find records in a table + when it is impossible to write constraints for + mnesia:match_object/3, or when you want to perform + some action on certain records. +

    +

    For example finding all the employees who has a salary + below 10 could look like:

    + + Constraint = + fun(Emp, Acc) when Emp#employee.salary < 10 -> + [Emp | Acc]; + (_, Acc) -> + Acc + end, + Find = fun() -> mnesia:foldl(Constraint, [], employee) end, + mnesia:transaction(Find). + ]]> +

    Raising the salary to 10 for everyone with a salary below 10 + and return the sum of all raises:

    + + Increase = + fun(Emp, Acc) when Emp#employee.salary < 10 -> + OldS = Emp#employee.salary, + ok = mnesia:write(Emp#employee{salary = 10}), + Acc + 10 - OldS; + (_, Acc) -> + Acc + end, + IncLow = fun() -> mnesia:foldl(Increase, 0, employee, write) end, + mnesia:transaction(IncLow). + ]]> +

    A lot of nice things can be done with the iterator functions + but some caution should be taken about performance and memory + utilization for large tables.

    +

    Call these iteration functions on nodes that contain a replica of the + table. Each call to the function Fun access the table and if the table + resides on another node it will generate a lot of unnecessary + network traffic.

    +

    Mnesia also provides some functions that make it possible for + the user to iterate over the table. The order of the + iteration is unspecified if the table is not of the ordered_set + type.

    + + mnesia:first(Tab) -> Key | transaction abort + mnesia:last(Tab) -> Key | transaction abort + mnesia:next(Tab,Key) -> Key | transaction abort + mnesia:prev(Tab,Key) -> Key | transaction abort + mnesia:snmp_get_next_index(Tab,Index) -> {ok, NextIndex} | endOfTable + +

    The order of first/last and next/prev are only valid for + ordered_set tables, for all other tables, they are synonyms. + When the end of the table is reached the special key + '$end_of_table' is returned.

    +

    If records are written and deleted during the traversal, use + mnesia:fold[lr]/4 with a write lock. Or + mnesia:write_lock_table/1 when using first and next.

    +

    Writing or deleting in transaction context creates a local copy + of each modified record, so modifying each record in a large + table uses a lot of memory. Mnesia will compensate for every + written or deleted record during the iteration in a transaction + context, which may reduce the performance. If possible avoid writing + or deleting records in the same transaction before iterating over the + table.

    +

    In dirty context, i.e. sync_dirty or async_dirty, + the modified records are not stored in a local copy; instead, + each record is updated separately. This generates a lot of + network traffic if the table has a replica on another node and + has all the other drawbacks that dirty operations + have. Especially for the mnesia:first/1 and + mnesia:next/2 commands, the same drawbacks as described + above for dirty_first and dirty_next applies, i.e. + no writes to the table should be done during iteration.

    +

    +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap5.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap5.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap5.xml 2007-11-26 13:08:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap5.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,1400 +0,0 @@ - - - - -
    - - 1997 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Miscellaneous Mnesia Features - Claes Wikström, Hans Nilsson and Håkan Mattsson - - - - - - - -
    -

    The earlier chapters of this User Guide described how to get - started with Mnesia, and how to build a Mnesia database. In this - chapter, we will describe the more advanced features available - when building a distributed, fault tolerant Mnesia database. This - chapter contains the following sections: -

    - - Indexing - - Distribution and Fault Tolerance - - Table fragmentation. - - Local content tables. - - Disc-less nodes. - - More about schema management - - Debugging a Mnesia application - - Concurrent Processes in Mnesia - - Prototyping - - Object Based Programming with Mnesia. - - - -
    - - Indexing -

    Data retrieval and matching can be performed very efficiently - if we know the key for the record. Conversely, if the key is not - known, all records in a table must be searched. The larger the - table the more time consuming it will become. To remedy this - problem Mnesia's indexing capabilities are used to improve data - retrieval and matching of records. -

    -

    The following two functions manipulate indexes on existing tables: -

    - - mnesia:add_table_index(Tab, AttributeName) -> {aborted, R} |{atomic, ok} - mnesia:del_table_index(Tab, AttributeName) -> {aborted, R} |{atomic, ok} - -

    These functions create or delete a table index on field - defined by AttributeName. To illustrate this, add an - index to the table definition (employee, {emp_no, name, salary, sex, phone, room_no}, which is the example table - from the Company database. The function - which adds an index on the element salary can be expressed in - the following way: -

    - - mnesia:add_table_index(employee, salary) - -

    The indexing capabilities of Mnesia are utilized with the - following three functions, which retrieve and match records on the - basis of index entries in the database. -

    - - mnesia:index_read(Tab, SecondaryKey, AttributeName) -> transaction abort | RecordList. - Avoids an exhaustive search of the entire table, by looking up - the SecondaryKey in the index to find the primary keys. - - mnesia:index_match_object(Pattern, AttributeName) -> transaction abort | RecordList - Avoids an exhaustive search of the entire table, by looking up - the secondary key in the index to find the primary keys. - The secondary key is found in the AttributeName field of - the Pattern. The secondary key must be bound. - - mnesia:match_object(Pattern) -> transaction abort | RecordList - Uses indices to avoid exhaustive search of the entire table. - Unlike the other functions above, this function may utilize - any index as long as the secondary key is bound. - -

    These functions are further described and exemplified in - Chapter 4: Pattern matching. -

    -
    - -
    - Distribution and Fault Tolerance -

    Mnesia is a distributed, fault tolerant DBMS. It is possible - to replicate tables on different Erlang nodes in a variety of - ways. The Mnesia programmer does not have to state - where the different tables reside, only the names of the - different tables are specified in the program code. This is - known as "location transparency" and it is an important - concept. In particular: -

    - - A program will work regardless of the - location of the data. It makes no difference whether the data - resides on the local node, or on a remote node. Note: The program - will run slower if the data is located on a remote node. - - The database can be reconfigured, and tables can be - moved between nodes. These operations do not effect the user - programs. - - -

    We have previously seen that each table has a number of - system attributes, such as index and - type. -

    -

    Table attributes are specified when the table is created. For - example, the following function will create a new table with two - RAM replicas: -

    -
    -      mnesia:create_table(foo,
    -                          [{ram_copies, [N1, N2]},
    -                           {attributes, record_info(fields, foo)}]).
    -    
    -

    Tables can also have the following properties, - where each attribute has a list of Erlang nodes as its value. -

    - - -

    ram_copies. The value of the node list is a list of - Erlang nodes, and a RAM replica of the table will reside on - each node in the list. This is a RAM replica, and it is - important to realize that no disc operations are performed when - a program executes write operations to these replicas. However, - should permanent RAM replicas be a requirement, then the - following alternatives are available:

    - - The mnesia:dump_tables/1 function can be used - to dump RAM table replicas to disc. - - The table replicas can be backed up; either from - RAM, or from disc if dumped there with the above - function. - - -
    - disc_copies. The value of the attribute is a list - of Erlang nodes, and a replica of the table will reside both - in RAM and on disc on each node in the list. Write operations - addressed to the table will address both the RAM and the disc - copy of the table. - - disc_only_copies. The value of the attribute is a - list of Erlang nodes, and a replica of the table will reside - only as a disc copy on each node in the list. The major - disadvantage of this type of table replica is the access - speed. The major advantage is that the table does not occupy - space in memory. - -
    -

    It is also possible to set and change table properties on - existing tables. Refer to Chapter 3: Defining the Schema for full - details. -

    -

    There are basically two reasons for using more than one table - replica: fault tolerance, or speed. It is worthwhile to note - that table replication provides a solution to both of these - system requirements. -

    -

    If we have two active table replicas, all information is - still available if one of the replicas fail. This can be a very - important property in many applications. Furthermore, if a table - replica exists at two specific nodes, applications which execute - at either of these nodes can read data from the table without - accessing the network. Network operations are considerably - slower and consume more resources than local operations. -

    -

    It can be advantageous to create table replicas for a - distributed application which reads data often, but writes data - seldom, in order to achieve fast read operations on the local - node. The major disadvantage with replication is the increased - time to write data. If a table has two replicas, every write - operation must access both table replicas. Since one of these - write operations must be a network operation, it is considerably - more expensive to perform a write operation to a replicated - table than to a non-replicated table. -

    -
    - -
    - Table Fragmentation - -
    - The Concept -

    A concept of table fragmentation has been introduced in - order to cope with very large tables. The idea is to split a - table into several more manageable fragments. Each fragment - is implemented as a first class Mnesia table and may be - replicated, have indices etc. as any other table. But the - tables may neither have local_content nor have the - snmp connection activated. -

    -

    In order to be able to access a record in a fragmented - table, Mnesia must determine to which fragment the - actual record belongs. This is done by the - mnesia_frag module, which implements the - mnesia_access callback behaviour. Please, read the - documentation about mnesia:activity/4 to see how - mnesia_frag can be used as a mnesia_access - callback module. -

    -

    At each record access mnesia_frag first computes - a hash value from the record key. Secondly the name of the - table fragment is determined from the hash value. And - finally the actual table access is performed by the same - functions as for non-fragmented tables. When the key is - not known beforehand, all fragments are searched for - matching records. Note: In ordered_set tables - the records will be ordered per fragment, and the - the order is undefined in results returned by select and - match_object. -

    -

    The following piece of code illustrates - how an existing Mnesia table is converted to be a - fragmented table and how more fragments are added later on. -

    - mnesia:start(). -ok -(a@sam)2> mnesia:system_info(running_db_nodes). -[b@sam,c@sam,a@sam] -(a@sam)3> Tab = dictionary. -dictionary -(a@sam)4> mnesia:create_table(Tab, [{ram_copies, [a@sam, b@sam]}]). -{atomic,ok} -(a@sam)5> Write = fun(Keys) -> [mnesia:write({Tab,K,-K}) || K <- Keys], ok end. -#Fun -(a@sam)6> mnesia:activity(sync_dirty, Write, [lists:seq(1, 256)], mnesia_frag). -ok -(a@sam)7> mnesia:change_table_frag(Tab, {activate, []}). -{atomic,ok} -(a@sam)8> mnesia:table_info(Tab, frag_properties). -[{base_table,dictionary}, - {foreign_key,undefined}, - {n_doubles,0}, - {n_fragments,1}, - {next_n_to_split,1}, - {node_pool,[a@sam,b@sam,c@sam]}] -(a@sam)9> Info = fun(Item) -> mnesia:table_info(Tab, Item) end. -#Fun -(a@sam)10> Dist = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag). -[{c@sam,0},{a@sam,1},{b@sam,1}] -(a@sam)11> mnesia:change_table_frag(Tab, {add_frag, Dist}). -{atomic,ok} -(a@sam)12> Dist2 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag). -[{b@sam,1},{c@sam,1},{a@sam,2}] -(a@sam)13> mnesia:change_table_frag(Tab, {add_frag, Dist2}). -{atomic,ok} -(a@sam)14> Dist3 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag). -[{a@sam,2},{b@sam,2},{c@sam,2}] -(a@sam)15> mnesia:change_table_frag(Tab, {add_frag, Dist3}). -{atomic,ok} -(a@sam)16> Read = fun(Key) -> mnesia:read({Tab, Key}) end. -#Fun -(a@sam)17> mnesia:activity(transaction, Read, [12], mnesia_frag). -[{dictionary,12,-12}] -(a@sam)18> mnesia:activity(sync_dirty, Info, [frag_size], mnesia_frag). -[{dictionary,64}, - {dictionary_frag2,64}, - {dictionary_frag3,64}, - {dictionary_frag4,64}] -(a@sam)19> - ]]> -
    - -
    - Fragmentation Properties -

    There is a table property called - frag_properties and may be read with - mnesia:table_info(Tab, frag_properties). The - fragmentation properties is a list of tagged tuples with - the arity 2. By default the list is empty, but when it is - non-empty it triggers Mnesia to regard the table as - fragmented. The fragmentation properties are: -

    - - {n_fragments, Int} - -

    n_fragments regulates how many fragments - that the table currently has. This property may explictly - be set at table creation and later be changed with - {add_frag, NodesOrDist} or - del_frag. n_fragments defaults to 1. -

    -
    - {node_pool, List} - -

    The node pool contains a list of nodes and may - explicitly be set at table creation and later be changed - with {add_node, Node} or {del_node, Node}. At table creation Mnesia tries to distribute - the replicas of each fragment evenly over all the nodes in - the node pool. Hopefully all nodes will end up with the - same number of replicas. node_pool defaults to the - return value from mnesia:system_info(db_nodes). -

    -
    - {n_ram_copies, Int} - -

    Regulates how many ram_copies replicas - that each fragment should have. This property may - explicitly be set at table creation. The default is - 0, but if n_disc_copies and - n_disc_only_copies also are 0, - n_ram_copies\011will default be set to 1. -

    -
    - {n_disc_copies, Int} - -

    Regulates how many disc_copies replicas - that each fragment should have. This property may - explicitly be set at table creation. The default is 0. -

    -
    - {n_disc_only_copies, Int} - -

    Regulates how many disc_only_copies replicas - that each fragment should have. This property may - explicitly be set at table creation. The default is 0. -

    -
    - {foreign_key, ForeignKey} - -

    ForeignKey may either be the atom - undefined or the tuple {ForeignTab, Attr}, - where Attr denotes an attribute which should be - interpreted as a key in another fragmented table named - ForeignTab. Mnesia will ensure that the number of - fragments in this table and in the foreign table are - always the same. When fragments are added or deleted - Mnesia will automatically propagate the operation to all - fragmented tables that has a foreign key referring to this - table. Instead of using the record key to determine which - fragment to access, the value of the Attr field is - used. This feature makes it possible to automatically - co-locate records in different tables to the same - node. foreign_key defaults to - undefined. However if the foreign key is set to - something else it will cause the default values of the - other fragmentation properties to be the same values as - the actual fragmentation properties of the foreign table. -

    -
    - {hash_module, Atom} - -

    Enables definition of an alternate hashing scheme. - The module must implement the mnesia_frag_hash - callback behaviour (see the reference manual). This - property may explicitly be set at table creation. - The default is mnesia_frag_hash.

    -

    Older tables that was created before the concept of - user defined hash modules was introduced, uses - the mnesia_frag_old_hash module in order to - be backwards compatible. The mnesia_frag_old_hash - is still using the poor depricated erlang:hash/1 - function. -

    -
    - {hash_state, Term} - -

    Enables a table specific parameterization - of a generic hash module. This property may explicitly - be set at table creation. - The default is undefined.

    - mnesia:start(). -ok -(a@sam)2> PrimProps = [{n_fragments, 7}, {node_pool, [node()]}]. -[{n_fragments,7},{node_pool,[a@sam]}] -(a@sam)3> mnesia:create_table(prim_dict, - [{frag_properties, PrimProps}, - {attributes,[prim_key,prim_val]}]). -{atomic,ok} -(a@sam)4> SecProps = [{foreign_key, {prim_dict, sec_val}}]. -[{foreign_key,{prim_dict,sec_val}}] -(a@sam)5> mnesia:create_table(sec_dict, -\011 [{frag_properties, SecProps}, -(a@sam)5> {attributes, [sec_key, sec_val]}]). -{atomic,ok} -(a@sam)6> Write = fun(Rec) -> mnesia:write(Rec) end. -#Fun -(a@sam)7> PrimKey = 11. -11 -(a@sam)8> SecKey = 42. -42 -(a@sam)9> mnesia:activity(sync_dirty, Write, -\011\011 [{prim_dict, PrimKey, -11}], mnesia_frag). -ok -(a@sam)10> mnesia:activity(sync_dirty, Write, -\011\011 [{sec_dict, SecKey, PrimKey}], mnesia_frag). -ok -(a@sam)11> mnesia:change_table_frag(prim_dict, {add_frag, [node()]}). -{atomic,ok} -(a@sam)12> SecRead = fun(PrimKey, SecKey) -> -\011\011 mnesia:read({sec_dict, PrimKey}, SecKey, read) end. -#Fun -(a@sam)13> mnesia:activity(transaction, SecRead, -\011\011 [PrimKey, SecKey], mnesia_frag). -[{sec_dict,42,11}] -(a@sam)14> Info = fun(Tab, Item) -> mnesia:table_info(Tab, Item) end. -#Fun -(a@sam)15> mnesia:activity(sync_dirty, Info, -\011\011 [prim_dict, frag_size], mnesia_frag). -[{prim_dict,0}, - {prim_dict_frag2,0}, - {prim_dict_frag3,0}, - {prim_dict_frag4,1}, - {prim_dict_frag5,0}, - {prim_dict_frag6,0}, - {prim_dict_frag7,0}, - {prim_dict_frag8,0}] -(a@sam)16> mnesia:activity(sync_dirty, Info, -\011\011 [sec_dict, frag_size], mnesia_frag). -[{sec_dict,0}, - {sec_dict_frag2,0}, - {sec_dict_frag3,0}, - {sec_dict_frag4,1}, - {sec_dict_frag5,0}, - {sec_dict_frag6,0}, - {sec_dict_frag7,0}, - {sec_dict_frag8,0}] -(a@sam)17> - ]]> -
    -
    -
    - -
    - Management of Fragmented Tables -

    The function mnesia:change_table_frag(Tab, Change) - is intended to be used for reconfiguration of fragmented - tables. The Change argument should have one of the - following values: -

    - - {activate, FragProps} - -

    Activates the fragmentation properties of an - existing table. FragProps should either contain - {node_pool, Nodes} or be empty. -

    -
    - deactivate - -

    Deactivates the fragmentation properties of a - table. The number of fragments must be 1. No other - tables may refer to this table in its foreign key. -

    -
    - {add_frag, NodesOrDist} - -

    Adds one new fragment to a fragmented table. All - records in one of the old fragments will be rehashed and - about half of them will be moved to the new (last) - fragment. All other fragmented tables, which refers to this - table in their foreign key, will automatically get a new - fragment, and their records will also be dynamically - rehashed in the same manner as for the main table. -

    -

    The NodesOrDist argument may either be a list - of nodes or the result from mnesia:table_info(Tab, frag_dist). The NodesOrDist argument is - assumed to be a sorted list with the best nodes to - host new replicas first in the list. The new fragment - will get the same number of replicas as the first - fragment (see n_ram_copies, n_disc_copies - and n_disc_only_copies). The NodesOrDist - list must at least contain one element for each - replica that needs to be allocated. -

    -
    - del_frag - -

    Deletes one fragment from a fragmented table. All - records in the last fragment will be moved to one of the other - fragments. All other fragmented tables which refers to - this table in their foreign key, will automatically lose - their last fragment and their records will also be - dynamically rehashed in the same manner as for the main - table. -

    -
    - {add_node, Node} - -

    Adds a new node to the node_pool. The new - node pool will affect the list returned from - mnesia:table_info(Tab, frag_dist). -

    -
    - {del_node, Node} - -

    Deletes a new node from the node_pool. The - new node pool will affect the list returned from - mnesia:table_info(Tab, frag_dist).

    -
    -
    -
    - -
    - Extensions of Existing Functions -

    The function mnesia:create_table/2 is used to - create a brand new fragmented table, by setting the table - property frag_properties to some proper values. -

    -

    The function mnesia:delete_table/1 is used to - delete a fragmented table including all its - fragments. There must however not exist any other - fragmented tables which refers to this table in their foreign key. -

    -

    The function mnesia:table_info/2 now understands - the frag_properties item. -

    -

    If the function mnesia:table_info/2 is invoked in - the activity context of the mnesia_frag module, - information of several new items may be obtained: -

    - - base_table - -

    the name of the fragmented table -

    -
    - n_fragments - -

    the actual number of fragments -

    -
    - node_pool - -

    the pool of nodes -

    -
    - n_ram_copies - - n_disc_copies - - n_disc_only_copies - -

    the number of replicas with storage type - ram_copies, disc_copies and disc_only_copies - respectively. The actual values are dynamically derived - from the first fragment. The first fragment serves as a - pro-type and when the actual values needs to be computed - (e.g. when adding new fragments) they are simply - determined by counting the number of each replicas for - each storage type. This means, when the functions - mnesia:add_table_copy/3, - mnesia:del_table_copy/2 andmnesia:change_table_copy_type/2 are applied on the - first fragment, it will affect the settings on - n_ram_copies, n_disc_copies, and - n_disc_only_copies. -

    -
    - foreign_key - -

    the foreign key. -

    -
    - foreigners - -

    all other tables that refers to this table in - their foreign key. -

    -
    - frag_names - -

    the names of all fragments. -

    -
    - frag_dist - -

    a sorted list of {Node, Count} tuples - which is sorted in increasing Count order. The - Count is the total number of replicas that this - fragmented table hosts on each Node. The list - always contains at least all nodes in the - node_pool. The nodes which not belongs to the - node_pool will be put last in the list even if - their Count is lower. -

    -
    - frag_size - -

    a list of {Name, Size} tuples where - Name is a fragment Name and Size is - how many records it contains. -

    -
    - frag_memory - -

    a list of {Name, Memory} tuples where - Name is a fragment Name and Memory is - how much memory it occupies. -

    -
    - size - -

    total size of all fragments -

    -
    - memory - -

    the total memory of all fragments

    -
    -
    -
    - -
    - Load Balancing -

    There are several algorithms for distributing records - in a fragmented table evenly over a - pool of nodes. No one is best, it simply depends of the - application needs. Here follows some examples of - situations which may need some attention: -

    -

    permanent change of nodes when a new permanent - db_node is introduced or dropped, it may be time to - change the pool of nodes and re-distribute the replicas - evenly over the new pool of nodes. It may also be time to - add or delete a fragment before the replicas are re-distributed. -

    -

    size/memory threshold when the total size or - total memory of a fragmented table (or a single - fragment) exceeds some application specific threshold, it - may be time to dynamically add a new fragment in order - obtain a better distribution of records. -

    -

    temporary node down when a node temporarily goes - down it may be time to compensate some fragments with new - replicas in order to keep the desired level of - redundancy. When the node comes up again it may be time to - remove the superfluous replica. -

    -

    overload threshold when the load on some node is - exceeds some application specific threshold, it may be time to - either add or move some fragment replicas to nodes with lesser - load. Extra care should be taken if the table has a foreign - key relation to some other table. In order to avoid severe - performance penalties, the same re-distribution must be - performed for all of the related tables. -

    -

    Use mnesia:change_table_frag/2 to add new fragments - and apply the usual schema manipulation functions (such as - mnesia:add_table_copy/3, mnesia:del_table_copy/2 - and mnesia:change_table_copy_type/2) on each fragment - to perform the actual re-distribution. -

    -
    -
    - -
    - Local Content Tables -

    Replicated tables have the same content on all nodes where - they are replicated. However, it is sometimes advantageous to - have tables but different content on different nodes. -

    -

    If we specify the attribute {local_content, true} when - we create the table, the table will reside on the nodes where - we specify that the table shall exist, but the write operations on the - table will only be performed on the local copy. -

    -

    Furthermore, when the table is initialized at start-up, the - table will only be initialized locally, and the table - content will not be copied from another node. -

    -
    - -
    - Disc-less Nodes -

    It is possible to run Mnesia on nodes that do not have a - disc. It is of course not possible to have replicas - of neither disc_copies, nor disc_only_copies - on such nodes. This especially troublesome for the - schema table since Mnesia need the schema in order - to initialize itself. -

    -

    The schema table may, as other tables, reside on one or - more nodes. The storage type of the schema table may either - be disc_copies or ram_copies - (not disc_only_copies). At - start-up Mnesia uses its schema to determine with which - nodes it should try to establish contact. If any - of the other nodes are already started, the starting node - merges its table definitions with the table definitions - brought from the other nodes. This also applies to the - definition of the schema table itself. The application - parameter extra_db_nodes contains a list of nodes which - Mnesia also should establish contact with besides the ones - found in the schema. The default value is the empty list - []. -

    -

    Hence, when a disc-less node needs to find the schema - definitions from a remote node on the network, we need to supply - this information through the application parameter -mnesia extra_db_nodes NodeList. Without this - configuration parameter set, Mnesia will start as a single node - system. It is also possible to use mnesia:change_config/2 - to assign a value to 'extra_db_nodes' and force a connection - after mnesia have been started, i.e. - mnesia:change_config(extra_db_nodes, NodeList). -

    -

    The application parameter schema_location controls where - Mnesia will search for its schema. The parameter may be one of - the following atoms: -

    - - disc - -

    Mandatory disc. The schema is assumed to be located - on the Mnesia directory. And if the schema cannot be found, - Mnesia refuses to start. -

    -
    - ram - -

    Mandatory ram. The schema resides in ram - only. At start-up a tiny new schema is generated. This - default schema contains just the definition of the schema - table and only resides on the local node. Since no other - nodes are found in the default schema, the configuration - parameter extra_db_nodes must be used in order to let the - node share its table definitions with other nodes. (The - extra_db_nodes parameter may also be used on disc-full nodes.) -

    -
    - opt_disc - -

    Optional disc. The schema may reside on either disc - or ram. If the schema is found on disc, Mnesia starts as a - disc-full node (the storage type of the schema table is - disc_copies). If no schema is found on disc, Mnesia starts - as a disc-less node (the storage type of the schema table is - ram_copies). The default value for the application parameter - is - opt_disc.

    -
    -
    -

    When the schema_location is set to opt_disc the - function mnesia:change_table_copy_type/3 may be used to - change the storage type of the schema. - This is illustrated below: -

    -
    -        1> mnesia:start().
    -        ok
    -        2> mnesia:change_table_copy_type(schema, node(), disc_copies).
    -        {atomic, ok}
    -    
    -

    Assuming that the call to mnesia:start did not - find any schema to read on the disc, then Mnesia has started - as a disc-less node, and then changed it to a node that - utilizes the disc to locally store the schema. -

    -
    - -
    - More Schema Management -

    It is possible to add and remove nodes from a Mnesia system. - This can be done by adding a copy of the schema to those nodes. -

    -

    The functions mnesia:add_table_copy/3 and - mnesia:del_table_copy/2 may be used to add and delete - replicas of the schema table. Adding a node to the list - of nodes where the schema is replicated will affect two - things. First it allows other tables to be replicated to - this node. Secondly it will cause Mnesia to try to contact - the node at start-up of disc-full nodes. -

    -

    The function call mnesia:del_table_copy(schema, mynode@host) deletes the node 'mynode@host' from the - Mnesia system. The call fails if mnesia is running on - 'mynode@host'. The other mnesia nodes will never try to connect - to that node again. Note, if there is a disc - resident schema on the node 'mynode@host', the entire mnesia - directory should be deleted. This can be done with - mnesia:delete_schema/1. If - mnesia is started again on the the node 'mynode@host' and the - directory has not been cleared, mnesia's behaviour is undefined. -

    -

    If the storage type of the schema is ram_copies, i.e, we - have disc-less node, Mnesia - will not use the disc on that particular node. The disc - usage is enabled by changing the storage type of the table - schema to disc_copies. -

    -

    New schemas are - created explicitly with mnesia:create_schema/1 or implicitly - by starting Mnesia without a disc resident schema. Whenever - a table (including the schema table) is created it is - assigned its own unique cookie. The schema table is not created with - mnesia:create_table/2 as normal tables. -

    -

    At start-up Mnesia connects different nodes to each other, - then they exchange table definitions with each other and the - table definitions are merged. During the merge procedure Mnesia - performs a sanity test to ensure that the table definitions are - compatible with each other. If a table exists on several nodes - the cookie must be the same, otherwise Mnesia will shutdown one - of the nodes. This unfortunate situation will occur if a table - has been created on two nodes independently of each other while - they were disconnected. To solve the problem, one of the tables - must be deleted (as the cookies differ we regard it to be two - different tables even if they happen to have the same name). -

    -

    Merging different versions of the schema table, does not - always require the cookies to be the same. If the storage - type of the schema table is disc_copies, the cookie is - immutable, and all other db_nodes must have the same - cookie. When the schema is stored as type ram_copies, - its cookie can be replaced with a cookie from another node - (ram_copies or disc_copies). The cookie replacement (during - merge of the schema table definition) is performed each time - a RAM node connects to another node. -

    -

    mnesia:system_info(schema_location) and - mnesia:system_info(extra_db_nodes) may be used to determine - the actual values of schema_location and extra_db_nodes - respectively. mnesia:system_info(use_dir) may be used to - determine whether Mnesia is actually using the Mnesia - directory. use_dir may be determined even before - Mnesia is started. The function mnesia:info/0 may now be - used to printout some system information even before Mnesia - is started. When Mnesia is started the function prints out - more information. -

    -

    Transactions which update the definition of a table, - requires that Mnesia is started on all nodes where the - storage type of the schema is disc_copies. All replicas of - the table on these nodes must also be loaded. There are a - few exceptions to these availability rules. Tables may be - created and new replicas may be added without starting all - of the disc-full nodes. New replicas may be added before all - other replicas of the table have been loaded, it will suffice - when one other replica is active. -

    -
    - -
    - Mnesia Event Handling -

    System events and table events are the two categories of events - that Mnesia will generate in various situations. -

    -

    It is possible for user process to subscribe on the - events generated by Mnesia. - We have the following two functions:

    - - mnesia:subscribe(Event-Category) - -

    Ensures that a copy of all events of type - Event-Category are sent to the calling process. -

    -
    - mnesia:unsubscribe(Event-Category) - Removes the subscription on events of type - Event-Category -
    -

    Event-Category may either be the atom system, or - one of the tuples {table, Tab, simple}, {table, Tab, detailed}. The old event-category {table, Tab} is the same - event-category as {table, Tab, simple}. - The subscribe functions activate a subscription - of events. The events are delivered as messages to the process - evaluating the mnesia:subscribe/1 function. The syntax of - system events is {mnesia_system_event, Event} and - {mnesia_table_event, Event} for table events. What system - events and table events means is described below. -

    -

    All system events are subscribed by Mnesia's - gen_event handler. The default gen_event handler is - mnesia_event. But it may be changed by using the application - parameter event_module. The value of this parameter must be - the name of a module implementing a complete handler - as specified by the gen_event module in - STDLIB. mnesia:system_info(subscribers) and - mnesia:table_info(Tab, subscribers) may be used to determine - which processes are subscribed to various - events. -

    - -
    - System Events -

    The system events are detailed below:

    - - {mnesia_up, Node} - -

    Mnesia has been started on a node. - Node is the name of the node. By default this event is ignored. -

    -
    - {mnesia_down, Node} - -

    Mnesia has been stopped on a node. - Node is the name of the node. By default this event is - ignored. -

    -
    - {mnesia_checkpoint_activated, Checkpoint} - -

    a checkpoint with the name - Checkpoint has been activated and that the current node is - involved in the checkpoint. Checkpoints may be activated - explicitly with mnesia:activate_checkpoint/1 or implicitly - at backup, adding table replicas, internal transfer of data - between nodes etc. By default this event is ignored. -

    -
    - {mnesia_checkpoint_deactivated, Checkpoint} - -

    A checkpoint with the name - Checkpoint has been deactivated and that the current node was - involved in the checkpoint. Checkpoints may explicitly be - deactivated with mnesia:deactivate/1 or implicitly when the - last replica of a table (involved in the checkpoint) - becomes unavailable, e.g. at node down. By default this - event is ignored. -

    -
    - {mnesia_overload, Details} - -

    Mnesia on the current node is - overloaded and the subscriber should take action. -

    -

    A typical overload situation occurs when the - applications are performing more updates on disc - resident tables than Mnesia is able to handle. Ignoring - this kind of overload may lead into a situation where - the disc space is exhausted (regardless of the size of - the tables stored on disc). -

    - Each update is appended to - the transaction log and occasionally(depending of how it - is configured) dumped to the tables files. The - table file storage is more compact than the transaction - log storage, especially if the same record is updated - over and over again. If the thresholds for dumping the - transaction log have been reached before the previous - dump was finished an overload event is triggered. -

    -

    Another typical overload situation is when the - transaction manager cannot commit transactions at the - same pace as the applications are performing updates of - disc resident tables. When this happens the message - queue of the transaction manager will continue to grow - until the memory is exhausted or the load - decreases. -

    -

    The same problem may occur for dirty updates. The overload - is detected locally on the current node, but its cause may - be on another node. Application processes may cause heavy - loads if any table are residing on other nodes (replicated or not). By default this event - is reported to the error_logger. -

    -
    - {inconsistent_database, Context, Node} - -

    Mnesia regards the database as - potential inconsistent and gives its applications a chance - to recover from the inconsistency, e.g. by installing a - consistent backup as fallback and then restart the system - or pick a MasterNode from mnesia:system_info(db_nodes)) - and invoke mnesia:set_master_node([MasterNode]). By default an - error is reported to the error logger. -

    -
    - {mnesia_fatal, Format, Args, BinaryCore} - -

    Mnesia has encountered a fatal error - and will (in a short period of time) be terminated. The reason for - the fatal error is explained in Format and Args which may - be given as input to io:format/2 or sent to the - error_logger. By default it will be sent to the - error_logger. BinaryCore is a binary containing a summary of - Mnesia's internal state at the time the when the fatal error was - encountered. By default the binary is written to a - unique file name on current directory. On RAM nodes the - core is ignored. -

    -
    - {mnesia_info, Format, Args} - -

    Mnesia has detected something that - may be of interest when debugging the system. This is explained - in Format and Args which may appear - as input to io:format/2 or sent to the error_logger. By - default this event is printed with io:format/2. -

    -
    - {mnesia_error, Format, Args} - -

    Mnesia has encountered an error. The - reason for the error is explained i Format and Args - which may be given as input to io:format/2 or sent to the - error_logger. By default this event is reported to the error_logger. -

    -
    - {mnesia_user, Event} - -

    An application has invoked the - function mnesia:report_event(Event). Event may be any Erlang - data structure. When tracing a system of Mnesia applications - it is useful to be able to interleave Mnesia's own events with - application related events that give information about the - application context. Whenever the application starts with - a new and demanding Mnesia activity or enters a - new and interesting phase in its execution it may be a good idea - to use mnesia:report_event/1.

    -
    -
    -
    - -
    - Table Events -

    Another category of events are table events, which are - events related to table updates. There are two types of table - events simple and detailed. -

    -

    The simple table events are tuples looking like this: - {Oper, Record, ActivityId}. Where Oper is the - operation performed. Record is the record involved in the - operation and ActivityId is the identity of the - transaction performing the operation. Note that the name of the - record is the table name even when the record_name has - another setting. The various table related events that may - occur are: -

    - - {write, NewRecord, ActivityId} - -

    a new record has been written. - NewRecord contains the new value of the record. -

    -
    - {delete_object, OldRecord, ActivityId} - -

    a record has possibly been deleted - with mnesia:delete_object/1. OldRecord - contains the value of the old record as stated as argument - by the application. Note that, other records with the same - key may be remaining in the table if it is a bag. -

    -
    - {delete, {Tab, Key}, ActivityId} - -

    one or more records possibly has - been deleted. All records with the key Key in the table - Tab have been deleted.

    -
    -
    -

    The detailed table events are tuples looking like - this: {Oper, Table, Data, [OldRecs], ActivityId}. - Where Oper is the operation - performed. Table is the table involved in the operation, - Data is the record/oid written/deleted. - OldRecs is the contents before the operation. - and ActivityId is the identity of the transaction - performing the operation. - The various table related events that may occur are: -

    - - {write, Table, NewRecord, [OldRecords], ActivityId} - -

    a new record has been written. - NewRecord contains the new value of the record and OldRecords - contains the records before the operation is performed. - Note that the new content is dependent on the type of the table.

    -
    - {delete, Table, What, [OldRecords], ActivityId} - -

    records has possibly been deleted - What is either {Table, Key} or a record {RecordName, Key, ...} - that was deleted. - Note that the new content is dependent on the type of the table.

    -
    -
    -
    -
    - -
    - Debugging Mnesia Applications -

    Debugging a Mnesia application can be difficult due to a number of reasons, primarily related - to difficulties in understanding how the transaction - and table load mechanisms work. An other source of - confusion may be the semantics of nested transactions. -

    -

    We may set the debug level of Mnesia by calling: -

    - - mnesia:set_debug_level(Level) - -

    Where the parameter Level is: -

    - - none - -

    no trace outputs at all. This is the default. -

    -
    - verbose - -

    activates tracing of important debug events. These - debug events will generate {mnesia_info, Format, Args} - system events. Processes may subscribe to these events with - mnesia:subscribe/1. The events are always sent to Mnesia's - event handler. -

    -
    - debug - -

    activates all events at the verbose level plus - traces of all debug events. These debug events will generate - {mnesia_info, Format, Args} system events. Processes may - subscribe to these events with mnesia:subscribe/1. The - events are always sent to Mnesia's event handler. On this - debug level Mnesia's event handler starts subscribing - updates in the schema table. -

    -
    - trace - -

    activates all events at the debug level. On this - debug level Mnesia's event handler starts subscribing - updates on all Mnesia tables. This level is only intended - for debugging small toy systems, since many large - events may be generated.

    -
    - false - -

    is an alias for none.

    -
    - true - -

    is an alias for debug.

    -
    -
    -

    The debug level of Mnesia itself, is also an application - parameter, thereby making it possible to start an Erlang system - in order to turn on Mnesia debug in the initial - start-up phase by using the following code: -

    -
    -      % erl -mnesia debug verbose
    -    
    -
    - -
    - Concurrent Processes in Mnesia -

    Programming concurrent Erlang systems is the subject of - a separate book. However, it is worthwhile to draw attention to - the following features, which permit concurrent processes to - exist in a Mnesia system. -

    -

    A group of functions or processes can be called within a - transaction. A transaction may include statements that read, - write or delete data from the DBMS. A large number of such - transactions can run concurrently, and the programmer does not - have to explicitly synchronize the processes which manipulate - the data. All programs accessing the database through the - transaction system may be written as if they had sole access to - the data. This is a very desirable property since all - synchronization is taken care of by the transaction handler. If - a program reads or writes data, the system ensures that no other - program tries to manipulate the same data at the same time. -

    -

    It is possible to move tables, delete tables or reconfigure - the layout of a table in various ways. An important aspect of - the actual implementation of these functions is that it is - possible for user programs to continue to use a table while it - is being reconfigured. For example, it is possible to - simultaneously move a table and perform write operations to the - table . This is important for many applications that - require continuously available services. Refer to Chapter 4: - Transactions and other access contexts for more information. -

    -
    - -
    - Prototyping -

    If and when we decide that we would like to start and manipulate - Mnesia, it is often easier to write the definitions and - data into an ordinary text file. - Initially, no tables and no data exist, or which - tables are required. At the initial stages of prototyping it - is prudent write all data into one file, process - that file and have the data in the file inserted into the database. - It is possible to initialize Mnesia with data read from a text file. - We have the following two functions to work with text files. -

    - - -

    mnesia:load_textfile(Filename) Which loads a - series of local table definitions and data found in the file - into Mnesia. This function also starts Mnesia and possibly - creates a new schema. The function only operates on the - local node. -

    -
    - -

    mnesia:dump_to_textfile(Filename) Dumps - all local tables of a mnesia system into a text file which can - then be edited (by means of a normal text editor) and then - later reloaded.

    -
    -
    -

    These functions are of course much slower than the ordinary - store and load functions of Mnesia. However, this is mainly intended for minor experiments - and initial prototyping. The major advantages of these functions is that they are very easy - to use. -

    -

    The format of the text file is: -

    -
    -      {tables, [{Typename, [Options]},
    -      {Typename2 ......}]}.
    -      
    -      {Typename, Attribute1, Atrribute2 ....}.
    -      {Typename, Attribute1, Atrribute2 ....}.
    -    
    -

    Options is a list of {Key,Value} tuples conforming - to the options we could give to mnesia:create_table/2. -

    -

    For example, if we want to start playing with a small - database for healthy foods, we enter then following data into - the file FRUITS. -

    - -

    The following session with the Erlang shell then shows how - to load the fruits database. -

    -
     mnesia:load_textfile("FRUITS").
    -      New table fruit
    -      New table vegetable
    -      {atomic,ok}
    -      2> mnesia:info().
    -      ---> Processes holding locks <--- 
    -      ---> Processes waiting for locks <--- 
    -      ---> Pending (remote) transactions <--- 
    -      ---> Active (local) transactions <---
    -      ---> Uncertain transactions <--- 
    -      ---> Active tables <--- 
    -      vegetable      : with 2 records occuping 299 words of mem 
    -      fruit          : with 2 records occuping 291 words of mem 
    -      schema         : with 3 records occuping 401 words of mem 
    -      ===> System info in version "1.1", debug level = none <===
    -      opt_disc. Directory "/var/tmp/Mnesia.nonode@nohost" is used.
    -      use fallback at restart = false
    -      running db nodes = [nonode@nohost]
    -      stopped db nodes = [] 
    -      remote           = []
    -      ram_copies       = [fruit,vegetable]
    -      disc_copies      = [schema]
    -      disc_only_copies = []
    -      [{nonode@nohost,disc_copies}] = [schema]
    -      [{nonode@nohost,ram_copies}] = [fruit,vegetable]
    -      3 transactions committed, 0 aborted, 0 restarted, 2 logged to disc
    -      0 held locks, 0 in queue; 0 local transactions, 0 remote
    -      0 transactions waits for other nodes: []
    -      ok
    -      3> 
    -    ]]>
    -

    Where we can see that the DBMS was initiated from a - regular text file. -

    -
    - -
    - Object Based Programming with Mnesia -

    The Company database introduced in Chapter 2 has three tables - which store records (employee, dept, project), and three tables - which store relationships (manager, at_dep, in_proj). This is a - normalized data model, which has some advantages over a - non-normalized data model. -

    -

    It is more efficient to do a - generalized search in a normalized database. Some operations are - also easier to perform on a normalized data model. For example, - we can easily remove one project, as the following example - illustrates: -

    - -

    In reality, data models are seldom fully normalized. A - realistic alternative to a normalized database model would be - a data model which is not even in first normal form. Mnesia - is very suitable for applications such as telecommunications, - because it is easy to organize data in a very flexible manner. A - Mnesia database is always organized as a set of tables. Each - table is filled with rows/objects/records. What sets Mnesia - apart is that individual fields in a record can contain any type - of compound data structures. An individual field in a record can - contain lists, tuples, functions, and even record code. -

    -

    Many telecommunications applications have unique requirements - on lookup times for certain types of records. If our Company - database had been a part of a telecommunications system, then it - could be that the lookup time of an employee together - with a list of the projects the employee is working on, should - be minimized. If this was the case, we might choose a - drastically different data model which has no direct - relationships. We would only have the records themselves, and - different records could contain either direct references to - other records, or they could contain other records which are not - part of the Mnesia schema. -

    -

    We could create the following record definitions: -

    - -

    An record which describes an employee might look like this: -

    -
    -        Me = #employee{emp_no= 104732,
    -        name = klacke,
    -        salary = 7,
    -        sex = male,
    -        phone = 99586,
    -        room_no = {221, 015},
    -        dept = 'B/SFR',
    -        projects = [erlang, mnesia, otp],
    -        manager = 114872},
    -    
    -

    This model only has three different tables, and the employee - records contain references to other records. We have the following - references in the record. -

    - - 'B/SFR' refers to a dept record. - - [erlang, mnesia, otp]. This is a list of three - direct references to three different projects records. - - 114872. This refers to another employee record. - - -

    We could also use the Mnesia record identifiers ({Tab, Key}) - as references. In this case, the dept attribute would be - set to the value {dept, 'B/SFR'} instead of - 'B/SFR'. -

    -

    With this data model, some operations execute considerably - faster than they do with the normalized data model in our - Company database. On the other hand, some other operations - become much more complicated. In particular, it becomes more - difficult to ensure that records do not contain dangling - pointers to other non-existent, or deleted, records. -

    -

    The following code exemplifies a search with a non-normalized - data model. To find all employees at department - Dep with a salary higher than Salary, use the following code: -

    - -

    This code is not only easier to write and to understand, but it - also executes much faster. -

    -

    It is easy to show examples of code which executes faster if - we use a non-normalized data model, instead of a normalized - model. The main reason for this is that fewer tables are - required. For this reason, we can more easily combine data from - different tables in join operations. In the above example, the - get_emps/2 function was transformed from a join operation - into a simple query which consists of a selection and a projection - on one single table. -

    -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap5.xmlsrc erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap5.xmlsrc --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap5.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap5.xmlsrc 2009-11-20 13:36:02.000000000 +0000 @@ -0,0 +1,1398 @@ + + + + +
    + + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Miscellaneous Mnesia Features + Claes Wikström, Hans Nilsson and Håkan Mattsson + + + + + + + Mnesia_chap5.xml +
    +

    The earlier chapters of this User Guide described how to get + started with Mnesia, and how to build a Mnesia database. In this + chapter, we will describe the more advanced features available + when building a distributed, fault tolerant Mnesia database. This + chapter contains the following sections: +

    + + Indexing + + Distribution and Fault Tolerance + + Table fragmentation. + + Local content tables. + + Disc-less nodes. + + More about schema management + + Debugging a Mnesia application + + Concurrent Processes in Mnesia + + Prototyping + + Object Based Programming with Mnesia. + + + +
    + + Indexing +

    Data retrieval and matching can be performed very efficiently + if we know the key for the record. Conversely, if the key is not + known, all records in a table must be searched. The larger the + table the more time consuming it will become. To remedy this + problem Mnesia's indexing capabilities are used to improve data + retrieval and matching of records. +

    +

    The following two functions manipulate indexes on existing tables: +

    + + mnesia:add_table_index(Tab, AttributeName) -> {aborted, R} |{atomic, ok} + mnesia:del_table_index(Tab, AttributeName) -> {aborted, R} |{atomic, ok} + +

    These functions create or delete a table index on field + defined by AttributeName. To illustrate this, add an + index to the table definition (employee, {emp_no, name, salary, sex, phone, room_no}, which is the example table + from the Company database. The function + which adds an index on the element salary can be expressed in + the following way: +

    + + mnesia:add_table_index(employee, salary) + +

    The indexing capabilities of Mnesia are utilized with the + following three functions, which retrieve and match records on the + basis of index entries in the database. +

    + + mnesia:index_read(Tab, SecondaryKey, AttributeName) -> transaction abort | RecordList. + Avoids an exhaustive search of the entire table, by looking up + the SecondaryKey in the index to find the primary keys. + + mnesia:index_match_object(Pattern, AttributeName) -> transaction abort | RecordList + Avoids an exhaustive search of the entire table, by looking up + the secondary key in the index to find the primary keys. + The secondary key is found in the AttributeName field of + the Pattern. The secondary key must be bound. + + mnesia:match_object(Pattern) -> transaction abort | RecordList + Uses indices to avoid exhaustive search of the entire table. + Unlike the other functions above, this function may utilize + any index as long as the secondary key is bound. + +

    These functions are further described and exemplified in + Chapter 4: Pattern matching. +

    +
    + +
    + Distribution and Fault Tolerance +

    Mnesia is a distributed, fault tolerant DBMS. It is possible + to replicate tables on different Erlang nodes in a variety of + ways. The Mnesia programmer does not have to state + where the different tables reside, only the names of the + different tables are specified in the program code. This is + known as "location transparency" and it is an important + concept. In particular: +

    + + A program will work regardless of the + location of the data. It makes no difference whether the data + resides on the local node, or on a remote node. Note: The program + will run slower if the data is located on a remote node. + + The database can be reconfigured, and tables can be + moved between nodes. These operations do not effect the user + programs. + + +

    We have previously seen that each table has a number of + system attributes, such as index and + type. +

    +

    Table attributes are specified when the table is created. For + example, the following function will create a new table with two + RAM replicas: +

    +
    +      mnesia:create_table(foo,
    +                          [{ram_copies, [N1, N2]},
    +                           {attributes, record_info(fields, foo)}]).
    +    
    +

    Tables can also have the following properties, + where each attribute has a list of Erlang nodes as its value. +

    + + +

    ram_copies. The value of the node list is a list of + Erlang nodes, and a RAM replica of the table will reside on + each node in the list. This is a RAM replica, and it is + important to realize that no disc operations are performed when + a program executes write operations to these replicas. However, + should permanent RAM replicas be a requirement, then the + following alternatives are available:

    + + The mnesia:dump_tables/1 function can be used + to dump RAM table replicas to disc. + + The table replicas can be backed up; either from + RAM, or from disc if dumped there with the above + function. + + +
    + disc_copies. The value of the attribute is a list + of Erlang nodes, and a replica of the table will reside both + in RAM and on disc on each node in the list. Write operations + addressed to the table will address both the RAM and the disc + copy of the table. + + disc_only_copies. The value of the attribute is a + list of Erlang nodes, and a replica of the table will reside + only as a disc copy on each node in the list. The major + disadvantage of this type of table replica is the access + speed. The major advantage is that the table does not occupy + space in memory. + +
    +

    It is also possible to set and change table properties on + existing tables. Refer to Chapter 3: Defining the Schema for full + details. +

    +

    There are basically two reasons for using more than one table + replica: fault tolerance, or speed. It is worthwhile to note + that table replication provides a solution to both of these + system requirements. +

    +

    If we have two active table replicas, all information is + still available if one of the replicas fail. This can be a very + important property in many applications. Furthermore, if a table + replica exists at two specific nodes, applications which execute + at either of these nodes can read data from the table without + accessing the network. Network operations are considerably + slower and consume more resources than local operations. +

    +

    It can be advantageous to create table replicas for a + distributed application which reads data often, but writes data + seldom, in order to achieve fast read operations on the local + node. The major disadvantage with replication is the increased + time to write data. If a table has two replicas, every write + operation must access both table replicas. Since one of these + write operations must be a network operation, it is considerably + more expensive to perform a write operation to a replicated + table than to a non-replicated table. +

    +
    + +
    + Table Fragmentation + +
    + The Concept +

    A concept of table fragmentation has been introduced in + order to cope with very large tables. The idea is to split a + table into several more manageable fragments. Each fragment + is implemented as a first class Mnesia table and may be + replicated, have indices etc. as any other table. But the + tables may neither have local_content nor have the + snmp connection activated. +

    +

    In order to be able to access a record in a fragmented + table, Mnesia must determine to which fragment the + actual record belongs. This is done by the + mnesia_frag module, which implements the + mnesia_access callback behaviour. Please, read the + documentation about mnesia:activity/4 to see how + mnesia_frag can be used as a mnesia_access + callback module. +

    +

    At each record access mnesia_frag first computes + a hash value from the record key. Secondly the name of the + table fragment is determined from the hash value. And + finally the actual table access is performed by the same + functions as for non-fragmented tables. When the key is + not known beforehand, all fragments are searched for + matching records. Note: In ordered_set tables + the records will be ordered per fragment, and the + the order is undefined in results returned by select and + match_object. +

    +

    The following piece of code illustrates + how an existing Mnesia table is converted to be a + fragmented table and how more fragments are added later on. +

    + mnesia:start(). +ok +(a@sam)2> mnesia:system_info(running_db_nodes). +[b@sam,c@sam,a@sam] +(a@sam)3> Tab = dictionary. +dictionary +(a@sam)4> mnesia:create_table(Tab, [{ram_copies, [a@sam, b@sam]}]). +{atomic,ok} +(a@sam)5> Write = fun(Keys) -> [mnesia:write({Tab,K,-K}) || K <- Keys], ok end. +#Fun +(a@sam)6> mnesia:activity(sync_dirty, Write, [lists:seq(1, 256)], mnesia_frag). +ok +(a@sam)7> mnesia:change_table_frag(Tab, {activate, []}). +{atomic,ok} +(a@sam)8> mnesia:table_info(Tab, frag_properties). +[{base_table,dictionary}, + {foreign_key,undefined}, + {n_doubles,0}, + {n_fragments,1}, + {next_n_to_split,1}, + {node_pool,[a@sam,b@sam,c@sam]}] +(a@sam)9> Info = fun(Item) -> mnesia:table_info(Tab, Item) end. +#Fun +(a@sam)10> Dist = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag). +[{c@sam,0},{a@sam,1},{b@sam,1}] +(a@sam)11> mnesia:change_table_frag(Tab, {add_frag, Dist}). +{atomic,ok} +(a@sam)12> Dist2 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag). +[{b@sam,1},{c@sam,1},{a@sam,2}] +(a@sam)13> mnesia:change_table_frag(Tab, {add_frag, Dist2}). +{atomic,ok} +(a@sam)14> Dist3 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag). +[{a@sam,2},{b@sam,2},{c@sam,2}] +(a@sam)15> mnesia:change_table_frag(Tab, {add_frag, Dist3}). +{atomic,ok} +(a@sam)16> Read = fun(Key) -> mnesia:read({Tab, Key}) end. +#Fun +(a@sam)17> mnesia:activity(transaction, Read, [12], mnesia_frag). +[{dictionary,12,-12}] +(a@sam)18> mnesia:activity(sync_dirty, Info, [frag_size], mnesia_frag). +[{dictionary,64}, + {dictionary_frag2,64}, + {dictionary_frag3,64}, + {dictionary_frag4,64}] +(a@sam)19> + ]]> +
    + +
    + Fragmentation Properties +

    There is a table property called + frag_properties and may be read with + mnesia:table_info(Tab, frag_properties). The + fragmentation properties is a list of tagged tuples with + the arity 2. By default the list is empty, but when it is + non-empty it triggers Mnesia to regard the table as + fragmented. The fragmentation properties are: +

    + + {n_fragments, Int} + +

    n_fragments regulates how many fragments + that the table currently has. This property may explicitly + be set at table creation and later be changed with + {add_frag, NodesOrDist} or + del_frag. n_fragments defaults to 1. +

    +
    + {node_pool, List} + +

    The node pool contains a list of nodes and may + explicitly be set at table creation and later be changed + with {add_node, Node} or {del_node, Node}. At table creation Mnesia tries to distribute + the replicas of each fragment evenly over all the nodes in + the node pool. Hopefully all nodes will end up with the + same number of replicas. node_pool defaults to the + return value from mnesia:system_info(db_nodes). +

    +
    + {n_ram_copies, Int} + +

    Regulates how many ram_copies replicas + that each fragment should have. This property may + explicitly be set at table creation. The default is + 0, but if n_disc_copies and + n_disc_only_copies also are 0, + n_ram_copies\011will default be set to 1. +

    +
    + {n_disc_copies, Int} + +

    Regulates how many disc_copies replicas + that each fragment should have. This property may + explicitly be set at table creation. The default is 0. +

    +
    + {n_disc_only_copies, Int} + +

    Regulates how many disc_only_copies replicas + that each fragment should have. This property may + explicitly be set at table creation. The default is 0. +

    +
    + {foreign_key, ForeignKey} + +

    ForeignKey may either be the atom + undefined or the tuple {ForeignTab, Attr}, + where Attr denotes an attribute which should be + interpreted as a key in another fragmented table named + ForeignTab. Mnesia will ensure that the number of + fragments in this table and in the foreign table are + always the same. When fragments are added or deleted + Mnesia will automatically propagate the operation to all + fragmented tables that has a foreign key referring to this + table. Instead of using the record key to determine which + fragment to access, the value of the Attr field is + used. This feature makes it possible to automatically + co-locate records in different tables to the same + node. foreign_key defaults to + undefined. However if the foreign key is set to + something else it will cause the default values of the + other fragmentation properties to be the same values as + the actual fragmentation properties of the foreign table. +

    +
    + {hash_module, Atom} + +

    Enables definition of an alternate hashing scheme. + The module must implement the mnesia_frag_hash + callback behaviour (see the reference manual). This + property may explicitly be set at table creation. + The default is mnesia_frag_hash.

    +

    Older tables that was created before the concept of + user defined hash modules was introduced, uses + the mnesia_frag_old_hash module in order to + be backwards compatible. The mnesia_frag_old_hash + is still using the poor deprecated erlang:hash/1 + function. +

    +
    + {hash_state, Term} + +

    Enables a table specific parameterization + of a generic hash module. This property may explicitly + be set at table creation. + The default is undefined.

    + mnesia:start(). +ok +(a@sam)2> PrimProps = [{n_fragments, 7}, {node_pool, [node()]}]. +[{n_fragments,7},{node_pool,[a@sam]}] +(a@sam)3> mnesia:create_table(prim_dict, + [{frag_properties, PrimProps}, + {attributes,[prim_key,prim_val]}]). +{atomic,ok} +(a@sam)4> SecProps = [{foreign_key, {prim_dict, sec_val}}]. +[{foreign_key,{prim_dict,sec_val}}] +(a@sam)5> mnesia:create_table(sec_dict, +\011 [{frag_properties, SecProps}, +(a@sam)5> {attributes, [sec_key, sec_val]}]). +{atomic,ok} +(a@sam)6> Write = fun(Rec) -> mnesia:write(Rec) end. +#Fun +(a@sam)7> PrimKey = 11. +11 +(a@sam)8> SecKey = 42. +42 +(a@sam)9> mnesia:activity(sync_dirty, Write, +\011\011 [{prim_dict, PrimKey, -11}], mnesia_frag). +ok +(a@sam)10> mnesia:activity(sync_dirty, Write, +\011\011 [{sec_dict, SecKey, PrimKey}], mnesia_frag). +ok +(a@sam)11> mnesia:change_table_frag(prim_dict, {add_frag, [node()]}). +{atomic,ok} +(a@sam)12> SecRead = fun(PrimKey, SecKey) -> +\011\011 mnesia:read({sec_dict, PrimKey}, SecKey, read) end. +#Fun +(a@sam)13> mnesia:activity(transaction, SecRead, +\011\011 [PrimKey, SecKey], mnesia_frag). +[{sec_dict,42,11}] +(a@sam)14> Info = fun(Tab, Item) -> mnesia:table_info(Tab, Item) end. +#Fun +(a@sam)15> mnesia:activity(sync_dirty, Info, +\011\011 [prim_dict, frag_size], mnesia_frag). +[{prim_dict,0}, + {prim_dict_frag2,0}, + {prim_dict_frag3,0}, + {prim_dict_frag4,1}, + {prim_dict_frag5,0}, + {prim_dict_frag6,0}, + {prim_dict_frag7,0}, + {prim_dict_frag8,0}] +(a@sam)16> mnesia:activity(sync_dirty, Info, +\011\011 [sec_dict, frag_size], mnesia_frag). +[{sec_dict,0}, + {sec_dict_frag2,0}, + {sec_dict_frag3,0}, + {sec_dict_frag4,1}, + {sec_dict_frag5,0}, + {sec_dict_frag6,0}, + {sec_dict_frag7,0}, + {sec_dict_frag8,0}] +(a@sam)17> + ]]> +
    +
    +
    + +
    + Management of Fragmented Tables +

    The function mnesia:change_table_frag(Tab, Change) + is intended to be used for reconfiguration of fragmented + tables. The Change argument should have one of the + following values: +

    + + {activate, FragProps} + +

    Activates the fragmentation properties of an + existing table. FragProps should either contain + {node_pool, Nodes} or be empty. +

    +
    + deactivate + +

    Deactivates the fragmentation properties of a + table. The number of fragments must be 1. No other + tables may refer to this table in its foreign key. +

    +
    + {add_frag, NodesOrDist} + +

    Adds one new fragment to a fragmented table. All + records in one of the old fragments will be rehashed and + about half of them will be moved to the new (last) + fragment. All other fragmented tables, which refers to this + table in their foreign key, will automatically get a new + fragment, and their records will also be dynamically + rehashed in the same manner as for the main table. +

    +

    The NodesOrDist argument may either be a list + of nodes or the result from mnesia:table_info(Tab, frag_dist). The NodesOrDist argument is + assumed to be a sorted list with the best nodes to + host new replicas first in the list. The new fragment + will get the same number of replicas as the first + fragment (see n_ram_copies, n_disc_copies + and n_disc_only_copies). The NodesOrDist + list must at least contain one element for each + replica that needs to be allocated. +

    +
    + del_frag + +

    Deletes one fragment from a fragmented table. All + records in the last fragment will be moved to one of the other + fragments. All other fragmented tables which refers to + this table in their foreign key, will automatically lose + their last fragment and their records will also be + dynamically rehashed in the same manner as for the main + table. +

    +
    + {add_node, Node} + +

    Adds a new node to the node_pool. The new + node pool will affect the list returned from + mnesia:table_info(Tab, frag_dist). +

    +
    + {del_node, Node} + +

    Deletes a new node from the node_pool. The + new node pool will affect the list returned from + mnesia:table_info(Tab, frag_dist).

    +
    +
    +
    + +
    + Extensions of Existing Functions +

    The function mnesia:create_table/2 is used to + create a brand new fragmented table, by setting the table + property frag_properties to some proper values. +

    +

    The function mnesia:delete_table/1 is used to + delete a fragmented table including all its + fragments. There must however not exist any other + fragmented tables which refers to this table in their foreign key. +

    +

    The function mnesia:table_info/2 now understands + the frag_properties item. +

    +

    If the function mnesia:table_info/2 is invoked in + the activity context of the mnesia_frag module, + information of several new items may be obtained: +

    + + base_table + +

    the name of the fragmented table +

    +
    + n_fragments + +

    the actual number of fragments +

    +
    + node_pool + +

    the pool of nodes +

    +
    + n_ram_copies + + n_disc_copies + + n_disc_only_copies + +

    the number of replicas with storage type + ram_copies, disc_copies and disc_only_copies + respectively. The actual values are dynamically derived + from the first fragment. The first fragment serves as a + pro-type and when the actual values needs to be computed + (e.g. when adding new fragments) they are simply + determined by counting the number of each replicas for + each storage type. This means, when the functions + mnesia:add_table_copy/3, + mnesia:del_table_copy/2 andmnesia:change_table_copy_type/2 are applied on the + first fragment, it will affect the settings on + n_ram_copies, n_disc_copies, and + n_disc_only_copies. +

    +
    + foreign_key + +

    the foreign key. +

    +
    + foreigners + +

    all other tables that refers to this table in + their foreign key. +

    +
    + frag_names + +

    the names of all fragments. +

    +
    + frag_dist + +

    a sorted list of {Node, Count} tuples + which is sorted in increasing Count order. The + Count is the total number of replicas that this + fragmented table hosts on each Node. The list + always contains at least all nodes in the + node_pool. The nodes which not belongs to the + node_pool will be put last in the list even if + their Count is lower. +

    +
    + frag_size + +

    a list of {Name, Size} tuples where + Name is a fragment Name and Size is + how many records it contains. +

    +
    + frag_memory + +

    a list of {Name, Memory} tuples where + Name is a fragment Name and Memory is + how much memory it occupies. +

    +
    + size + +

    total size of all fragments +

    +
    + memory + +

    the total memory of all fragments

    +
    +
    +
    + +
    + Load Balancing +

    There are several algorithms for distributing records + in a fragmented table evenly over a + pool of nodes. No one is best, it simply depends of the + application needs. Here follows some examples of + situations which may need some attention: +

    +

    permanent change of nodes when a new permanent + db_node is introduced or dropped, it may be time to + change the pool of nodes and re-distribute the replicas + evenly over the new pool of nodes. It may also be time to + add or delete a fragment before the replicas are re-distributed. +

    +

    size/memory threshold when the total size or + total memory of a fragmented table (or a single + fragment) exceeds some application specific threshold, it + may be time to dynamically add a new fragment in order + obtain a better distribution of records. +

    +

    temporary node down when a node temporarily goes + down it may be time to compensate some fragments with new + replicas in order to keep the desired level of + redundancy. When the node comes up again it may be time to + remove the superfluous replica. +

    +

    overload threshold when the load on some node is + exceeds some application specific threshold, it may be time to + either add or move some fragment replicas to nodes with lesser + load. Extra care should be taken if the table has a foreign + key relation to some other table. In order to avoid severe + performance penalties, the same re-distribution must be + performed for all of the related tables. +

    +

    Use mnesia:change_table_frag/2 to add new fragments + and apply the usual schema manipulation functions (such as + mnesia:add_table_copy/3, mnesia:del_table_copy/2 + and mnesia:change_table_copy_type/2) on each fragment + to perform the actual re-distribution. +

    +
    +
    + +
    + Local Content Tables +

    Replicated tables have the same content on all nodes where + they are replicated. However, it is sometimes advantageous to + have tables but different content on different nodes. +

    +

    If we specify the attribute {local_content, true} when + we create the table, the table will reside on the nodes where + we specify that the table shall exist, but the write operations on the + table will only be performed on the local copy. +

    +

    Furthermore, when the table is initialized at start-up, the + table will only be initialized locally, and the table + content will not be copied from another node. +

    +
    + +
    + Disc-less Nodes +

    It is possible to run Mnesia on nodes that do not have a + disc. It is of course not possible to have replicas + of neither disc_copies, nor disc_only_copies + on such nodes. This especially troublesome for the + schema table since Mnesia need the schema in order + to initialize itself. +

    +

    The schema table may, as other tables, reside on one or + more nodes. The storage type of the schema table may either + be disc_copies or ram_copies + (not disc_only_copies). At + start-up Mnesia uses its schema to determine with which + nodes it should try to establish contact. If any + of the other nodes are already started, the starting node + merges its table definitions with the table definitions + brought from the other nodes. This also applies to the + definition of the schema table itself. The application + parameter extra_db_nodes contains a list of nodes which + Mnesia also should establish contact with besides the ones + found in the schema. The default value is the empty list + []. +

    +

    Hence, when a disc-less node needs to find the schema + definitions from a remote node on the network, we need to supply + this information through the application parameter -mnesia extra_db_nodes NodeList. Without this + configuration parameter set, Mnesia will start as a single node + system. It is also possible to use mnesia:change_config/2 + to assign a value to 'extra_db_nodes' and force a connection + after mnesia have been started, i.e. + mnesia:change_config(extra_db_nodes, NodeList). +

    +

    The application parameter schema_location controls where + Mnesia will search for its schema. The parameter may be one of + the following atoms: +

    + + disc + +

    Mandatory disc. The schema is assumed to be located + on the Mnesia directory. And if the schema cannot be found, + Mnesia refuses to start. +

    +
    + ram + +

    Mandatory ram. The schema resides in ram + only. At start-up a tiny new schema is generated. This + default schema contains just the definition of the schema + table and only resides on the local node. Since no other + nodes are found in the default schema, the configuration + parameter extra_db_nodes must be used in order to let the + node share its table definitions with other nodes. (The + extra_db_nodes parameter may also be used on disc-full nodes.) +

    +
    + opt_disc + +

    Optional disc. The schema may reside on either disc + or ram. If the schema is found on disc, Mnesia starts as a + disc-full node (the storage type of the schema table is + disc_copies). If no schema is found on disc, Mnesia starts + as a disc-less node (the storage type of the schema table is + ram_copies). The default value for the application parameter + is + opt_disc.

    +
    +
    +

    When the schema_location is set to opt_disc the + function mnesia:change_table_copy_type/3 may be used to + change the storage type of the schema. + This is illustrated below: +

    +
    +        1> mnesia:start().
    +        ok
    +        2> mnesia:change_table_copy_type(schema, node(), disc_copies).
    +        {atomic, ok}
    +    
    +

    Assuming that the call to mnesia:start did not + find any schema to read on the disc, then Mnesia has started + as a disc-less node, and then changed it to a node that + utilizes the disc to locally store the schema. +

    +
    + +
    + More Schema Management +

    It is possible to add and remove nodes from a Mnesia system. + This can be done by adding a copy of the schema to those nodes. +

    +

    The functions mnesia:add_table_copy/3 and + mnesia:del_table_copy/2 may be used to add and delete + replicas of the schema table. Adding a node to the list + of nodes where the schema is replicated will affect two + things. First it allows other tables to be replicated to + this node. Secondly it will cause Mnesia to try to contact + the node at start-up of disc-full nodes. +

    +

    The function call mnesia:del_table_copy(schema, mynode@host) deletes the node 'mynode@host' from the + Mnesia system. The call fails if mnesia is running on + 'mynode@host'. The other mnesia nodes will never try to connect + to that node again. Note, if there is a disc + resident schema on the node 'mynode@host', the entire mnesia + directory should be deleted. This can be done with + mnesia:delete_schema/1. If + mnesia is started again on the the node 'mynode@host' and the + directory has not been cleared, mnesia's behaviour is undefined. +

    +

    If the storage type of the schema is ram_copies, i.e, we + have disc-less node, Mnesia + will not use the disc on that particular node. The disc + usage is enabled by changing the storage type of the table + schema to disc_copies. +

    +

    New schemas are + created explicitly with mnesia:create_schema/1 or implicitly + by starting Mnesia without a disc resident schema. Whenever + a table (including the schema table) is created it is + assigned its own unique cookie. The schema table is not created with + mnesia:create_table/2 as normal tables. +

    +

    At start-up Mnesia connects different nodes to each other, + then they exchange table definitions with each other and the + table definitions are merged. During the merge procedure Mnesia + performs a sanity test to ensure that the table definitions are + compatible with each other. If a table exists on several nodes + the cookie must be the same, otherwise Mnesia will shutdown one + of the nodes. This unfortunate situation will occur if a table + has been created on two nodes independently of each other while + they were disconnected. To solve the problem, one of the tables + must be deleted (as the cookies differ we regard it to be two + different tables even if they happen to have the same name). +

    +

    Merging different versions of the schema table, does not + always require the cookies to be the same. If the storage + type of the schema table is disc_copies, the cookie is + immutable, and all other db_nodes must have the same + cookie. When the schema is stored as type ram_copies, + its cookie can be replaced with a cookie from another node + (ram_copies or disc_copies). The cookie replacement (during + merge of the schema table definition) is performed each time + a RAM node connects to another node. +

    +

    mnesia:system_info(schema_location) and + mnesia:system_info(extra_db_nodes) may be used to determine + the actual values of schema_location and extra_db_nodes + respectively. mnesia:system_info(use_dir) may be used to + determine whether Mnesia is actually using the Mnesia + directory. use_dir may be determined even before + Mnesia is started. The function mnesia:info/0 may now be + used to printout some system information even before Mnesia + is started. When Mnesia is started the function prints out + more information. +

    +

    Transactions which update the definition of a table, + requires that Mnesia is started on all nodes where the + storage type of the schema is disc_copies. All replicas of + the table on these nodes must also be loaded. There are a + few exceptions to these availability rules. Tables may be + created and new replicas may be added without starting all + of the disc-full nodes. New replicas may be added before all + other replicas of the table have been loaded, it will suffice + when one other replica is active. +

    +
    + +
    + Mnesia Event Handling +

    System events and table events are the two categories of events + that Mnesia will generate in various situations. +

    +

    It is possible for user process to subscribe on the + events generated by Mnesia. + We have the following two functions:

    + + mnesia:subscribe(Event-Category) + +

    Ensures that a copy of all events of type + Event-Category are sent to the calling process. +

    +
    + mnesia:unsubscribe(Event-Category) + Removes the subscription on events of type + Event-Category +
    +

    Event-Category may either be the atom system, or + one of the tuples {table, Tab, simple}, {table, Tab, detailed}. The old event-category {table, Tab} is the same + event-category as {table, Tab, simple}. + The subscribe functions activate a subscription + of events. The events are delivered as messages to the process + evaluating the mnesia:subscribe/1 function. The syntax of + system events is {mnesia_system_event, Event} and + {mnesia_table_event, Event} for table events. What system + events and table events means is described below. +

    +

    All system events are subscribed by Mnesia's + gen_event handler. The default gen_event handler is + mnesia_event. But it may be changed by using the application + parameter event_module. The value of this parameter must be + the name of a module implementing a complete handler + as specified by the gen_event module in + STDLIB. mnesia:system_info(subscribers) and + mnesia:table_info(Tab, subscribers) may be used to determine + which processes are subscribed to various + events. +

    + +
    + System Events +

    The system events are detailed below:

    + + {mnesia_up, Node} + +

    Mnesia has been started on a node. + Node is the name of the node. By default this event is ignored. +

    +
    + {mnesia_down, Node} + +

    Mnesia has been stopped on a node. + Node is the name of the node. By default this event is + ignored. +

    +
    + {mnesia_checkpoint_activated, Checkpoint} + +

    a checkpoint with the name + Checkpoint has been activated and that the current node is + involved in the checkpoint. Checkpoints may be activated + explicitly with mnesia:activate_checkpoint/1 or implicitly + at backup, adding table replicas, internal transfer of data + between nodes etc. By default this event is ignored. +

    +
    + {mnesia_checkpoint_deactivated, Checkpoint} + +

    A checkpoint with the name + Checkpoint has been deactivated and that the current node was + involved in the checkpoint. Checkpoints may explicitly be + deactivated with mnesia:deactivate/1 or implicitly when the + last replica of a table (involved in the checkpoint) + becomes unavailable, e.g. at node down. By default this + event is ignored. +

    +
    + {mnesia_overload, Details} + +

    Mnesia on the current node is + overloaded and the subscriber should take action. +

    +

    A typical overload situation occurs when the + applications are performing more updates on disc + resident tables than Mnesia is able to handle. Ignoring + this kind of overload may lead into a situation where + the disc space is exhausted (regardless of the size of + the tables stored on disc). +

    + Each update is appended to + the transaction log and occasionally(depending of how it + is configured) dumped to the tables files. The + table file storage is more compact than the transaction + log storage, especially if the same record is updated + over and over again. If the thresholds for dumping the + transaction log have been reached before the previous + dump was finished an overload event is triggered. +

    +

    Another typical overload situation is when the + transaction manager cannot commit transactions at the + same pace as the applications are performing updates of + disc resident tables. When this happens the message + queue of the transaction manager will continue to grow + until the memory is exhausted or the load + decreases. +

    +

    The same problem may occur for dirty updates. The overload + is detected locally on the current node, but its cause may + be on another node. Application processes may cause heavy + loads if any table are residing on other nodes (replicated or not). By default this event + is reported to the error_logger. +

    +
    + {inconsistent_database, Context, Node} + +

    Mnesia regards the database as + potential inconsistent and gives its applications a chance + to recover from the inconsistency, e.g. by installing a + consistent backup as fallback and then restart the system + or pick a MasterNode from mnesia:system_info(db_nodes)) + and invoke mnesia:set_master_node([MasterNode]). By default an + error is reported to the error logger. +

    +
    + {mnesia_fatal, Format, Args, BinaryCore} + +

    Mnesia has encountered a fatal error + and will (in a short period of time) be terminated. The reason for + the fatal error is explained in Format and Args which may + be given as input to io:format/2 or sent to the + error_logger. By default it will be sent to the + error_logger. BinaryCore is a binary containing a summary of + Mnesia's internal state at the time the when the fatal error was + encountered. By default the binary is written to a + unique file name on current directory. On RAM nodes the + core is ignored. +

    +
    + {mnesia_info, Format, Args} + +

    Mnesia has detected something that + may be of interest when debugging the system. This is explained + in Format and Args which may appear + as input to io:format/2 or sent to the error_logger. By + default this event is printed with io:format/2. +

    +
    + {mnesia_error, Format, Args} + +

    Mnesia has encountered an error. The + reason for the error is explained i Format and Args + which may be given as input to io:format/2 or sent to the + error_logger. By default this event is reported to the error_logger. +

    +
    + {mnesia_user, Event} + +

    An application has invoked the + function mnesia:report_event(Event). Event may be any Erlang + data structure. When tracing a system of Mnesia applications + it is useful to be able to interleave Mnesia's own events with + application related events that give information about the + application context. Whenever the application starts with + a new and demanding Mnesia activity or enters a + new and interesting phase in its execution it may be a good idea + to use mnesia:report_event/1.

    +
    +
    +
    + +
    + Table Events +

    Another category of events are table events, which are + events related to table updates. There are two types of table + events simple and detailed. +

    +

    The simple table events are tuples looking like this: + {Oper, Record, ActivityId}. Where Oper is the + operation performed. Record is the record involved in the + operation and ActivityId is the identity of the + transaction performing the operation. Note that the name of the + record is the table name even when the record_name has + another setting. The various table related events that may + occur are: +

    + + {write, NewRecord, ActivityId} + +

    a new record has been written. + NewRecord contains the new value of the record. +

    +
    + {delete_object, OldRecord, ActivityId} + +

    a record has possibly been deleted + with mnesia:delete_object/1. OldRecord + contains the value of the old record as stated as argument + by the application. Note that, other records with the same + key may be remaining in the table if it is a bag. +

    +
    + {delete, {Tab, Key}, ActivityId} + +

    one or more records possibly has + been deleted. All records with the key Key in the table + Tab have been deleted.

    +
    +
    +

    The detailed table events are tuples looking like + this: {Oper, Table, Data, [OldRecs], ActivityId}. + Where Oper is the operation + performed. Table is the table involved in the operation, + Data is the record/oid written/deleted. + OldRecs is the contents before the operation. + and ActivityId is the identity of the transaction + performing the operation. + The various table related events that may occur are: +

    + + {write, Table, NewRecord, [OldRecords], ActivityId} + +

    a new record has been written. + NewRecord contains the new value of the record and OldRecords + contains the records before the operation is performed. + Note that the new content is dependent on the type of the table.

    +
    + {delete, Table, What, [OldRecords], ActivityId} + +

    records has possibly been deleted + What is either {Table, Key} or a record {RecordName, Key, ...} + that was deleted. + Note that the new content is dependent on the type of the table.

    +
    +
    +
    +
    + +
    + Debugging Mnesia Applications +

    Debugging a Mnesia application can be difficult due to a number of reasons, primarily related + to difficulties in understanding how the transaction + and table load mechanisms work. An other source of + confusion may be the semantics of nested transactions. +

    +

    We may set the debug level of Mnesia by calling: +

    + + mnesia:set_debug_level(Level) + +

    Where the parameter Level is: +

    + + none + +

    no trace outputs at all. This is the default. +

    +
    + verbose + +

    activates tracing of important debug events. These + debug events will generate {mnesia_info, Format, Args} + system events. Processes may subscribe to these events with + mnesia:subscribe/1. The events are always sent to Mnesia's + event handler. +

    +
    + debug + +

    activates all events at the verbose level plus + traces of all debug events. These debug events will generate + {mnesia_info, Format, Args} system events. Processes may + subscribe to these events with mnesia:subscribe/1. The + events are always sent to Mnesia's event handler. On this + debug level Mnesia's event handler starts subscribing + updates in the schema table. +

    +
    + trace + +

    activates all events at the debug level. On this + debug level Mnesia's event handler starts subscribing + updates on all Mnesia tables. This level is only intended + for debugging small toy systems, since many large + events may be generated.

    +
    + false + +

    is an alias for none.

    +
    + true + +

    is an alias for debug.

    +
    +
    +

    The debug level of Mnesia itself, is also an application + parameter, thereby making it possible to start an Erlang system + in order to turn on Mnesia debug in the initial + start-up phase by using the following code: +

    +
    +      % erl -mnesia debug verbose
    +    
    +
    + +
    + Concurrent Processes in Mnesia +

    Programming concurrent Erlang systems is the subject of + a separate book. However, it is worthwhile to draw attention to + the following features, which permit concurrent processes to + exist in a Mnesia system. +

    +

    A group of functions or processes can be called within a + transaction. A transaction may include statements that read, + write or delete data from the DBMS. A large number of such + transactions can run concurrently, and the programmer does not + have to explicitly synchronize the processes which manipulate + the data. All programs accessing the database through the + transaction system may be written as if they had sole access to + the data. This is a very desirable property since all + synchronization is taken care of by the transaction handler. If + a program reads or writes data, the system ensures that no other + program tries to manipulate the same data at the same time. +

    +

    It is possible to move tables, delete tables or reconfigure + the layout of a table in various ways. An important aspect of + the actual implementation of these functions is that it is + possible for user programs to continue to use a table while it + is being reconfigured. For example, it is possible to + simultaneously move a table and perform write operations to the + table . This is important for many applications that + require continuously available services. Refer to Chapter 4: + Transactions and other access contexts for more information. +

    +
    + +
    + Prototyping +

    If and when we decide that we would like to start and manipulate + Mnesia, it is often easier to write the definitions and + data into an ordinary text file. + Initially, no tables and no data exist, or which + tables are required. At the initial stages of prototyping it + is prudent write all data into one file, process + that file and have the data in the file inserted into the database. + It is possible to initialize Mnesia with data read from a text file. + We have the following two functions to work with text files. +

    + + +

    mnesia:load_textfile(Filename) Which loads a + series of local table definitions and data found in the file + into Mnesia. This function also starts Mnesia and possibly + creates a new schema. The function only operates on the + local node. +

    +
    + +

    mnesia:dump_to_textfile(Filename) Dumps + all local tables of a mnesia system into a text file which can + then be edited (by means of a normal text editor) and then + later reloaded.

    +
    +
    +

    These functions are of course much slower than the ordinary + store and load functions of Mnesia. However, this is mainly intended for minor experiments + and initial prototyping. The major advantages of these functions is that they are very easy + to use. +

    +

    The format of the text file is: +

    +
    +      {tables, [{Typename, [Options]},
    +      {Typename2 ......}]}.
    +      
    +      {Typename, Attribute1, Atrribute2 ....}.
    +      {Typename, Attribute1, Atrribute2 ....}.
    +    
    +

    Options is a list of {Key,Value} tuples conforming + to the options we could give to mnesia:create_table/2. +

    +

    For example, if we want to start playing with a small + database for healthy foods, we enter then following data into + the file FRUITS. +

    + +

    The following session with the Erlang shell then shows how + to load the fruits database. +

    +
     mnesia:load_textfile("FRUITS").
    +      New table fruit
    +      New table vegetable
    +      {atomic,ok}
    +      2> mnesia:info().
    +      ---> Processes holding locks <--- 
    +      ---> Processes waiting for locks <--- 
    +      ---> Pending (remote) transactions <--- 
    +      ---> Active (local) transactions <---
    +      ---> Uncertain transactions <--- 
    +      ---> Active tables <--- 
    +      vegetable      : with 2 records occuping 299 words of mem 
    +      fruit          : with 2 records occuping 291 words of mem 
    +      schema         : with 3 records occuping 401 words of mem 
    +      ===> System info in version "1.1", debug level = none <===
    +      opt_disc. Directory "/var/tmp/Mnesia.nonode@nohost" is used.
    +      use fallback at restart = false
    +      running db nodes = [nonode@nohost]
    +      stopped db nodes = [] 
    +      remote           = []
    +      ram_copies       = [fruit,vegetable]
    +      disc_copies      = [schema]
    +      disc_only_copies = []
    +      [{nonode@nohost,disc_copies}] = [schema]
    +      [{nonode@nohost,ram_copies}] = [fruit,vegetable]
    +      3 transactions committed, 0 aborted, 0 restarted, 2 logged to disc
    +      0 held locks, 0 in queue; 0 local transactions, 0 remote
    +      0 transactions waits for other nodes: []
    +      ok
    +      3> 
    +    ]]>
    +

    Where we can see that the DBMS was initiated from a + regular text file. +

    +
    + +
    + Object Based Programming with Mnesia +

    The Company database introduced in Chapter 2 has three tables + which store records (employee, dept, project), and three tables + which store relationships (manager, at_dep, in_proj). This is a + normalized data model, which has some advantages over a + non-normalized data model. +

    +

    It is more efficient to do a + generalized search in a normalized database. Some operations are + also easier to perform on a normalized data model. For example, + we can easily remove one project, as the following example + illustrates: +

    + +

    In reality, data models are seldom fully normalized. A + realistic alternative to a normalized database model would be + a data model which is not even in first normal form. Mnesia + is very suitable for applications such as telecommunications, + because it is easy to organize data in a very flexible manner. A + Mnesia database is always organized as a set of tables. Each + table is filled with rows/objects/records. What sets Mnesia + apart is that individual fields in a record can contain any type + of compound data structures. An individual field in a record can + contain lists, tuples, functions, and even record code. +

    +

    Many telecommunications applications have unique requirements + on lookup times for certain types of records. If our Company + database had been a part of a telecommunications system, then it + could be that the lookup time of an employee together + with a list of the projects the employee is working on, should + be minimized. If this was the case, we might choose a + drastically different data model which has no direct + relationships. We would only have the records themselves, and + different records could contain either direct references to + other records, or they could contain other records which are not + part of the Mnesia schema. +

    +

    We could create the following record definitions: +

    + +

    An record which describes an employee might look like this: +

    +
    +        Me = #employee{emp_no= 104732,
    +        name = klacke,
    +        salary = 7,
    +        sex = male,
    +        phone = 99586,
    +        room_no = {221, 015},
    +        dept = 'B/SFR',
    +        projects = [erlang, mnesia, otp],
    +        manager = 114872},
    +    
    +

    This model only has three different tables, and the employee + records contain references to other records. We have the following + references in the record. +

    + + 'B/SFR' refers to a dept record. + + [erlang, mnesia, otp]. This is a list of three + direct references to three different projects records. + + 114872. This refers to another employee record. + + +

    We could also use the Mnesia record identifiers ({Tab, Key}) + as references. In this case, the dept attribute would be + set to the value {dept, 'B/SFR'} instead of + 'B/SFR'. +

    +

    With this data model, some operations execute considerably + faster than they do with the normalized data model in our + Company database. On the other hand, some other operations + become much more complicated. In particular, it becomes more + difficult to ensure that records do not contain dangling + pointers to other non-existent, or deleted, records. +

    +

    The following code exemplifies a search with a non-normalized + data model. To find all employees at department + Dep with a salary higher than Salary, use the following code: +

    + +

    This code is not only easier to write and to understand, but it + also executes much faster. +

    +

    It is easy to show examples of code which executes faster if + we use a non-normalized data model, instead of a normalized + model. The main reason for this is that fewer tables are + required. For this reason, we can more easily combine data from + different tables in join operations. In the above example, the + get_emps/2 function was transformed from a join operation + into a simple query which consists of a selection and a projection + on one single table. +

    +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap7.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap7.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap7.xml 2007-11-26 13:08:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap7.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,892 +0,0 @@ - - - - -
    - - 1997 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Mnesia System Information - Claes Wikström, Hans Nilsson and Håkan Mattsson - - - - - - - -
    - -
    - Database Configuration Data -

    The following two functions can be used to retrieve system - information. They are described in detail in the reference manual. -

    - - mnesia:table_info(Tab, Key) ->Info | exit({aborted, Reason}). - Returns information about one table. Such as the - current size of the table, on which nodes it resides etc. - - mnesia:system_info(Key) -> Info | exit({aborted, Reason}). - Returns information about the Mnesia system. For example, transaction - statistics, db_nodes, configuration parameters etc. - - -
    - -
    - Core Dumps -

    If Mnesia malfunctions, system information is dumped to a file - named MnesiaCore.Node.When. The type of system - information contained in this file can also be generated with - the function mnesia_lib:coredump(). If a Mnesia system - behaves strangely, it is recommended that a Mnesia core dump - file be included in the bug report.

    -
    - -
    - Dumping Tables -

    Tables of type ram_copies are by definition stored in - memory only. It is possible, however, to dump these tables to - disc, either at regular intervals, or before the system is - shutdown. The function mnesia:dump_tables(TabList) dumps - all replicas of a set of RAM tables to disc. The tables can be - accessed while being dumped to disc. To dump the tables to - disc all replicas must have the storage type ram_copies. -

    -

    The table content is placed in a .DCD file on the - disc. When the Mnesia system is started, the RAM table will - initially be loaded with data from its .DCD file. -

    -
    - -
    - - Checkpoints -

    A checkpoint is a transaction consistent state that spans over - one or more tables. When a checkpoint is activated, the system - will remember the current content of the set of tables. The - checkpoint retains a transaction consistent state of the tables, - allowing the tables to be read and updated while the checkpoint - is active. A checkpoint is typically used to - back up tables to external media, but they are also used - internally in Mnesia for other purposes. Each checkpoint is - independent and a table may be involved in several checkpoints - simultaneously. -

    -

    Each table retains its old contents in a checkpoint retainer - and for performance critical applications, it may be important - to realize the processing overhead associated with checkpoints. - In a worst case scenario, the checkpoint retainer will consume - even more memory than the table itself. Each update will also be - slightly slower on those nodes where checkpoint - retainers are attached to the tables. -

    -

    For each table it is possible to choose if there should be one - checkpoint retainer attached to all replicas of the table, or if - it is enough to have only one checkpoint retainer attached to a - single replica. With a single checkpoint retainer per table, the - checkpoint will consume less memory, but it will be vulnerable - to node crashes. With several redundant checkpoint retainers the - checkpoint will survive as long as there is at least one active - checkpoint retainer attached to each table. -

    -

    Checkpoints may be explicitly deactivated with the function - mnesia:deactivate_checkpoint(Name), where Name is - the name of an active checkpoint. This function returns - ok if successful, or {error, Reason} in the case - of an error. All tables in a checkpoint must be attached to at - least one checkpoint retainer. The checkpoint is automatically - de-activated by Mnesia, when any table lacks a checkpoint - retainer. This may happen when a node goes down or when a - replica is deleted. Use the min and - max arguments described below, to control the degree of - checkpoint retainer redundancy. -

    -

    Checkpoints are activated with the function -mnesia:activate_checkpoint(Args), - where Args is a list of the following tuples: -

    - - {name,Name}. Name specifies a temporary name - of the checkpoint. The name may be re-used when the checkpoint - has been de-activated. If no name is specified, a name is - generated automatically. - - {max,MaxTabs}. MaxTabs is a list of tables - which will be included in the checkpoint. The default is - [] (an empty list). For these tables, the redundancy - will be maximized. The old contents of the table will be - retained in the checkpoint retainer when the main table is - updated by the applications. The checkpoint becomes more fault - tolerant if the tables have several replicas. When new - replicas are added by means of the schema manipulation - function mnesia:add_table_copy/3, it will also - attach a local checkpoint retainer. - - {min,MinTabs}. MinTabs is a list of tables - that should be included in the checkpoint. The default is - []. For these tables, the redundancy will be minimized, - and there will be a single checkpoint retainer per table, - preferably at the local node. - - {allow_remote,Bool}. false means that all - checkpoint retainers must be local. If a table does not reside - locally, the checkpoint cannot be activated. true - allows checkpoint retainers to be allocated on any node. The - defaults is true. - - {ram_overrides_dump,Bool}. This argument only - applies to tables of type ram_copies. Bool - specifies if the table state in RAM should override the table - state on disc. true means that the latest committed - records in RAM are included in the checkpoint retainer. These - are the records that the application accesses. false - means that the records on the disc .DAT file are - included in the checkpoint retainer. These are the records - that will be loaded on start-up. Default is false. - -

    The mnesia:activate_checkpoint(Args) returns one of the - following values: -

    - - {ok, Name, Nodes} - {error, Reason}. - -

    Name is the name of the checkpoint, and Nodes are - the nodes where the checkpoint is known. -

    -

    A list of active checkpoints can be obtained with the following - functions: -

    - - mnesia:system_info(checkpoints). This function - returns all active checkpoints on the current node. - mnesia:table_info(Tab,checkpoints). This function - returns active checkpoints on a specific table. - -
    - -
    - Files -

    This section describes the internal files which are created and maintained by the Mnesia system, - in particular, the workings of the Mnesia log is described. -

    - -
    - Start-Up Files -
    -

    In Chapter 3 we detailed the following pre-requisites for - starting Mnesia (refer Chapter 3: Starting Mnesia: -

    - - We must start an Erlang session and specify a Mnesia - directory for our database. - - We must initiate a database schema, using the function - mnesia:create_schema/1. - - -

    The following example shows how these tasks are performed: -

    - - -
    -% erl  -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'        
    -
    - -
    -Erlang (BEAM) emulator version 4.9
    - 
    -Eshell V4.9  (abort with ^G)
    -(klacke@gin)1> mnesia:create_schema([node()]).
    -ok
    -(klacke@gin)2> 
    -^Z
    -Suspended        
    -

    We can inspect the Mnesia directory to see what files have been created. Enter the following command: -

    -
    -% ls -l /ldisc/scratch/klacke
    --rw-rw-r--   1 klacke   staff       247 Aug 12 15:06 FALLBACK.BUP        
    -

    The response shows that the file FALLBACK.BUP has been created. This is called a backup file, and it contains an initial schema. If we had specified more than one node in the mnesia:create_schema/1 function, identical backup files would have been created on all nodes. -

    -
    - -

    Continue by starting Mnesia:

    -
    -(klacke@gin)3>mnesia:start( ).
    -ok        
    -

    We can now see the following listing in the Mnesia directory: -

    -
    --rw-rw-r--   1 klacke   staff         86 May 26 19:03 LATEST.LOG
    --rw-rw-r--   1 klacke   staff      34507 May 26 19:03 schema.DAT        
    -

    The schema in the backup file FALLBACK.BUP has been used to generate the file schema.DAT. Since we have no other disc resident tables than the schema, no other data files were created. The file FALLBACK.BUP was removed after the successful "restoration". We also see a number of files that are for internal use by Mnesia. -

    -
    - -

    Enter the following command to create a table:

    -
    -(klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
    -{atomic,ok}        
    -

    We can now see the following listing in the Mnesia directory: -

    -
    -% ls -l /ldisc/scratch/klacke
    --rw-rw-r-- 1 klacke staff    86 May 26 19:07 LATEST.LOG
    --rw-rw-r-- 1 klacke staff    94 May 26 19:07 foo.DCD
    --rw-rw-r-- 1 klacke staff  6679 May 26 19:07 schema.DAT        
    -

    Where a file foo.DCD has been created. This file will eventually store - all data that is written into the foo table.

    -
    -
    - -
    - The Log File -

    When starting Mnesia, a .LOG file called LATEST.LOG - was created and placed in the database directory. This file is - used by Mnesia to log disc based transactions. This includes all - transactions that write at least one record in a table which is - of storage type disc_copies, or - disc_only_copies. It also includes all operations which - manipulate the schema itself, such as creating new tables. The - format of the log can vary with different implementations of - Mnesia. The Mnesia log is currently implemented with the - standard library module disc_log. -

    -

    The log file will grow continuously and must be dumped at - regular intervals. "Dumping the log file" means that Mnesia will - perform all the operations listed in the log and place the - records in the corresponding .DAT, .DCD and .DCL data files. For - example, if the operation "write record {foo, 4, elvis, 6}" - is listed in the log, Mnesia inserts the operation into the - file foo.DCL, later when Mnesia thinks the .DCL has become to large - the data is moved to the .DCD file. - The dumping operation can be time consuming - if the log is very large. However, it is important to realize - that the Mnesia system continues to operate during log dumps. -

    -

    By default Mnesia either dumps the log whenever 100 records have - been written in the log or when 3 minutes have passed. - This is controlled by the two application parameters - -mnesia dump_log_write_threshold WriteOperations and - -mnesia dump_log_time_threshold MilliSecs. -

    -

    Before the log is dumped, the file LATEST.LOG is - renamed to PREVIOUS.LOG, and a new LATEST.LOG file - is created. Once the log has been successfully dumped, the file - PREVIOUS.LOG is deleted. -

    -

    The log is also dumped at start-up and whenever a schema - operation is performed. -

    -
    - -
    - The Data Files -

    The directory listing also contains one .DAT file. This contain - the schema itself, contained in the schema.DAT - file. The DAT files are indexed files, and it is efficient to - insert and search for records in these files with a specific - key. The .DAT files are used for the schema and for disc_only_copies - tables. The Mnesia data files are currently implemented with the - standard library module dets, and all operations which - can be performed on dets files can also be performed on - the Mnesia data files. For example, dets contains a - function dets:traverse/2 which can be used to view the - contents of a Mnesia DAT file. However, this can only be done - when Mnesia is not running. So, to view a our schema file, we - can:

    -
    -{ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false}, 
    -{keypos, 2}]),
    -F = fun(X) -> io:format("~p~n", [X]), continue end,
    -dets:traverse(N, F),
    -dets:close(N).      
    - -

    Refer to the Reference Manual, std_lib for information about dets.

    -
    - -

    The DAT files must always be opened with the {repair, false} - option. This ensures that these files are not - automatically repaired. Without this option, the database may - become inconsistent, because Mnesia may - believe that the files were properly closed. Refer to the reference - manual for information about the configuration parameter - auto_repair.

    -
    - -

    It is recommended that Data files are not tampered with while Mnesia is - running. While not prohibited, the behavior of Mnesia is unpredictable.

    -
    -

    The disc_copies tables are stored on disk with .DCL and .DCD files, - which are standard disk_log files. -

    -
    -
    - -
    - Loading of Tables at Start-up -

    At start-up Mnesia loads tables in order to make them accessible - for its applications. Sometimes Mnesia decides to load all tables - that reside locally, and sometimes the tables may not be - accessible until Mnesia brings a copy of the table - from another node. -

    -

    To understand the behavior of Mnesia at start-up it is - essential to understand how Mnesia reacts when it loses contact - with Mnesia on another node. At this stage, Mnesia cannot distinguish - between a communication failure and a "normal" node down.

    - - When this happens, Mnesia will assume that the other node is no longer running. - Whereas, in reality, the communication between the nodes has merely failed. -

    -

    To overcome this situation, simply try to restart the ongoing transactions that are - accessing tables on the failing node, and write a mnesia_down entry to a log file. -

    -

    At start-up, it must be noted that all tables residing on nodes - without a mnesia_down entry, may have fresher replicas. - Their replicas may have been updated after the termination - of Mnesia on the current node. In order to catch up with the latest - updates, transfer a copy of the table from one of these other - "fresh" nodes. If you are unlucky, other nodes may be down - and you must wait for the table to be - loaded on one of these nodes before receiving a fresh copy of - the table. -

    -

    Before an application makes its first access to a table, - mnesia:wait_for_tables(TabList, Timeout) ought to be executed - to ensure that the table is accessible from the local node. If - the function times out the application may choose to force a - load of the local replica with - mnesia:force_load_table(Tab) and deliberately lose all - updates that may have been performed on the other nodes while - the local node was down. If - Mnesia already has loaded the table on another node or intends - to do so, we will copy the table from that node in order to - avoid unnecessary inconsistency. -

    - -

    Keep in mind that it is only - one table that is loaded by mnesia:force_load_table(Tab) - and since committed transactions may have caused updates in - several tables, the tables may now become inconsistent due to - the forced load.

    -
    -

    The allowed AccessMode of a table may be defined to - either be read_only or read_write. And it may be - toggled with the function mnesia:change_table_access_mode(Tab, AccessMode) in runtime. read_only tables and - local_content tables will always be loaded locally, since - there are no need for copying the table from other nodes. Other - tables will primary be loaded remotely from active replicas on - other nodes if the table already has been loaded there, or if - the running Mnesia already has decided to load the table there. -

    -

    At start up, Mnesia will assume that its local replica is the - most recent version and load the table from disc if either - situation is detected: -

    - - mnesia_down is returned from all other nodes that holds a disc - resident replica of the table; or, - if all replicas are ram_copies - -

    This is normally a wise decision, but it may turn out to - be disastrous if the nodes have been disconnected due to a - communication failure, since Mnesia's normal table load - mechanism does not cope with communication failures. -

    -

    When Mnesia is loading many tables the default load - order. However, it is possible to - affect the load order by explicitly changing the - load_order property for the tables, with the function - mnesia:change_table_load_order(Tab, LoadOrder). The - LoadOrder is by default 0 for all tables, but it - can be set to any integer. The table with the highest - load_order will be loaded first. Changing load order is - especially useful for applications that need to ensure early - availability of fundamental tables. Large peripheral - tables should have a low load order value, perhaps set - below 0. -

    -
    - -
    - Recovery from Communication Failure -

    There are several occasions when Mnesia may detect that the - network has been partitioned due to a communication failure. -

    -

    One is when Mnesia already is up and running and the Erlang - nodes gain contact again. Then Mnesia will try to contact Mnesia - on the other node to see if it also thinks that the network has - been partitioned for a while. If Mnesia on both nodes has logged - mnesia_down entries from each other, Mnesia generates a - system event, called {inconsistent_database, running_partitioned_network, Node} which is sent to Mnesia's - event handler and other possible subscribers. The default event - handler reports an error to the error logger. -

    -

    Another occasion when Mnesia may detect that the network has - been partitioned due to a communication failure, is at start-up. - If Mnesia detects that both the local node and another node received - mnesia_down from each other it generates a - {inconsistent_database, starting_partitioned_network, Node} system event and acts as described above. -

    -

    If the application detects that there has been a communication - failure which may have caused an inconsistent database, it may - use the function mnesia:set_master_nodes(Tab, Nodes) to - pinpoint from which nodes each table may be loaded.

    -

    At start-up Mnesia's normal table load algorithm will be - bypassed and the table will be loaded from one of the master - nodes defined for the table, regardless of potential - mnesia_down entries in the log. The Nodes may only - contain nodes where the table has a replica and if it is empty, - the master node recovery mechanism for the particular table will - be reset and the normal load mechanism will be used when next - restarting. -

    -

    The function mnesia:set_master_nodes(Nodes) sets master - nodes for all tables. For each table it will determine its - replica nodes and invoke mnesia:set_master_nodes(Tab, TabNodes) with those replica nodes that are included in the - Nodes list (i.e. TabNodes is the intersection of - Nodes and the replica nodes of the table). If the - intersection is empty the master node recovery mechanism for the - particular table will be reset and the normal load mechanism - will be used at next restart. -

    -

    The functions mnesia:system_info(master_node_tables) and - mnesia:table_info(Tab, master_nodes) may be used to - obtain information about the potential master nodes. -

    -

    The function mnesia:force_load_table(Tab) may be used to - force load the table regardless of which table load mechanism - is activated. -

    -
    - -
    - Recovery of Transactions -

    A Mnesia table may reside on one or more nodes. When a table is - updated, Mnesia will ensure that the updates will be replicated - to all nodes where the table resides. If a replica happens to be - inaccessible for some reason (e.g. due to a temporary node down), - Mnesia will then perform the replication later. -

    -

    On the node where the application is started, there will be a - transaction coordinator process. If the transaction is - distributed, there will also be a transaction participant process on - all the other nodes where commit work needs to be performed. -

    -

    Internally Mnesia uses several commit protocols. The selected - protocol depends on which table that has been updated in - the transaction. If all the involved tables are symmetrically - replicated, (i.e. they all have the same ram_nodes, - disc_nodes and disc_only_nodes currently - accessible from the coordinator node), a lightweight transaction - commit protocol is used. -

    -

    The number of messages that the - transaction coordinator and its participants needs to exchange - is few, since Mnesia's table load mechanism takes care of the - transaction recovery if the commit protocol gets - interrupted. Since all involved tables are replicated - symmetrically the transaction will automatically be recovered by - loading the involved tables from the same node at start-up of a - failing node. We do not really care if the transaction was - aborted or committed as long as we can ensure the ACID - properties. The lightweight commit protocol is non-blocking, - i.e. the surviving participants and their coordinator will - finish the transaction, regardless of some node crashes in the - middle of the commit protocol or not. -

    -

    If a node goes down in the middle of a dirty operation the - table load mechanism will ensure that the update will be - performed on all replicas or none. Both asynchronous dirty - updates and synchronous dirty updates use the same recovery - principle as lightweight transactions. -

    -

    If a transaction involves updates of asymmetrically replicated - tables or updates of the schema table, a heavyweight commit - protocol will be used. The heavyweight commit protocol is able - to finish the transaction regardless of how the tables are - replicated. The typical usage of a heavyweight transaction is - when we want to move a replica from one node to another. Then we - must ensure that the replica either is entirely moved or left as - it was. We must never end up in a situation with replicas on both - nodes or no node at all. Even if a node crashes in the middle of - the commit protocol, the transaction must be guaranteed to be - atomic. The heavyweight commit protocol involves more messages - between the transaction coordinator and its participants than - a lightweight protocol and it will perform recovery work at - start-up in order to finish the abort or commit work. -

    -

    The heavyweight commit protocol is also non-blocking, - which allows the surviving participants and their coordinator to - finish the transaction regardless (even if a node crashes in the - middle of the commit protocol). When a node fails at start-up, - Mnesia will determine the outcome of the transaction and - recover it. Lightweight protocols, heavyweight protocols and dirty updates, are - dependent on other nodes to be up and running in order to make the - correct heavyweight transaction recovery decision. -

    -

    If Mnesia has not started on some of the nodes that are involved in the - transaction AND neither the local node or any of the already - running nodes know the outcome of the transaction, Mnesia will - by default wait for one. In the worst case scenario all other - involved nodes must start before Mnesia can make the correct decision - about the transaction and finish its start-up. -

    -

    This means that Mnesia (on one node)may hang if a double fault occurs, i.e. when two nodes crash simultaneously - and one attempts to start when the other refuses to - start e.g. due to a hardware error. -

    -

    It is possible to specify the maximum time that Mnesia - will wait for other nodes to respond with a transaction - recovery decision. The configuration parameter - max_wait_for_decision defaults to infinity (which may - cause the indefinite hanging as mentioned above) but if it is - set to a definite time period (eg.three minutes), Mnesia will then enforce a - transaction recovery decision if needed, in order to allow - Mnesia to continue with its start-up procedure.

    -

    The downside of an enforced transaction recovery decision, is that the decision may be - incorrect, due to insufficient information regarding the other nodes' - recovery decisions. This may result in an - inconsistent database where Mnesia has committed the transaction - on some nodes but aborted it on others.

    -

    In fortunate cases the inconsistency will only appear in tables belonging to a specific - application, but if a schema transaction has been inconsistently - recovered due to the enforced transaction recovery decision, the - effects of the inconsistency can be fatal. - However, if the higher priority is availability rather than - consistency, then it may be worth the risk.

    -

    If Mnesia - encounters a inconsistent transaction decision a - {inconsistent_database, bad_decision, Node} system event - will be generated in order to give the application a chance to - install a fallback or other appropriate measures to resolve the inconsistency. The default - behavior of the Mnesia event handler is the same as if the - database became inconsistent as a result of partitioned network (see - above). -

    -
    - -
    - Backup, Fallback, and Disaster Recovery -

    The following functions are used to backup data, to install a - backup as fallback, and for disaster recovery. -

    - - mnesia:backup_checkpoint(Name, Opaque, [Mod]). This - function performs a backup of the tables included in the - checkpoint. - - mnesia:backup(Opaque, [Mod]). This function - activates a new checkpoint which covers all Mnesia tables and - performs a backup. It is performed with maximum degree of - redundancy (also refer to the function mnesia:activate_checkpoint(Args), - {max, MaxTabs} and {min, MinTabs}). - mnesia:traverse_backup(Source,[SourceMod,]Target,[TargetMod,]Fun,Ac). This function can be used - to read an existing backup, create a new backup from an - existing one, or to copy a backup from one type media to - another. - - mnesia:uninstall_fallback(). This function removes - previously installed fallback files. - - mnesia:restore(Opaque, Args). This function - restores a set of tables from a previous backup. - - mnesia:install_fallback(Opaque, [Mod]). This - function can be configured to restart the Mnesia and reload data - tables, and possibly schema tables, from an existing - backup. This function is typically used for disaster recovery - purposes, when data or schema tables are corrupted. - -

    These functions are explained in the following - sub-sections. Also refer to the the section Checkpoints in this chapter, which - describes the two functions used to activate and de-activate - checkpoints. -

    - -
    - Backup -

    Backup operation are performed with the following functions: -

    - - mnesia:backup_checkpoint(Name, Opaque, [Mod]) - mnesia:backup(Opaque, [Mod]) - mnesia:traverse_backup(Source, [SourceMod,],Target,[TargetMod,]Fun,Acc). - -

    By default, the actual access to the backup media is - performed via the mnesia_backup module for both read - and write. Currently mnesia_backup is implemented with - the standard library module disc_log, but it is possible to write - your own module with the same interface as - mnesia_backup and configure Mnesia so the alternate - module performs the actual accesses to the backup media. This - means that the user may put the backup on medias that Mnesia - does not know about, possibly on hosts where Erlang is not - running. Use the configuration parameter ]]> for this purpose.

    -

    The source - for a backup is an activated checkpoint. The backup function - most commonly used is mnesia:backup_checkpoint(Name, Opaque,[Mod]). This function returns either ok, or - {error,Reason}. It has the following arguments: -

    - - Name is the name of an activated - checkpoint. Refer to the section Checkpoints in this chapter, the - function mnesia:activate_checkpoint(ArgList) for - details on how to include table names in checkpoints. - - Opaque. Mnesia does not interpret this argument, - but it is forwarded to the backup module. The Mnesia default - backup module, mnesia_backup interprets this argument - as a local file name. - - Mod. The name of an alternate backup module. - - -

    The function mnesia:backup(Opaque[, Mod]) activates a - new checkpoint which covers all Mnesia tables with maximum - degree of redundancy and performs a backup. Maximum - redundancy means that each table replica has a checkpoint - retainer. Tables with the local_contents property are - backed up as they - look on the current node. -

    -

    It is possible to iterate over a backup, either for the - purpose of transforming it into a new backup, or just reading - it. The function mnesia:traverse_backup(Source, [SourceMod,]Target, [TargeMod,] Fun, Acc) which normally returns {ok, LastAcc}, is used for both of these purposes. -

    -

    Before the traversal starts, the source backup media is - opened with SourceMod:open_read(Source), and the target - backup media is opened with - TargetMod:open_write(Target). The arguments are: -

    - - SourceMod and TargetMod are module names. - - Source and Target are opaque data used - exclusively by the modules SourceMod and - TargetMod for the purpose of initializing the backup - medias. - - Acc is an initial accumulator value. - - Fun(BackupItems, Acc) is applied to each item in - the backup. The Fun must return a tuple {ValGoodBackupItems, NewAcc}, where ValidBackupItems is a list of valid - backup items, and NewAcc is a new accumulator value. - The ValidBackupItems are written to the target backup - with the function TargetMod:write/2. - - LastAcc is the last accumulator value. I.e. - the last NewAcc value that was returned by Fun. - - -

    It is also possible to perform a read-only traversal of the - source backup without updating a target backup. If - TargetMod==read_only, then no target backup is accessed - at all. -

    -

    By setting SourceMod and TargetMod to different - modules it is possible to copy a backup from one kind of backup - media to another. -

    -

    Valid BackupItems are the following tuples: -

    - - {schema, Tab} specifies a table to be deleted. - - {schema, Tab, CreateList} specifies a table to be - created. See mnesia_create_table/2 for more - information about CreateList. - - {Tab, Key} specifies the full identity of a record - to be deleted. - - {Record} specifies a record to be inserted. It - can be a tuple with Tab as first field. Note that the - record name is set to the table name regardless of what - record_name is set to. - - -

    The backup data is divided into two sections. The first - section contains information related to the schema. All schema - related items are tuples where the first field equals the atom - schema. The second section is the record section. It is not - possible to mix schema records with other records and all schema - records must be located first in the backup. -

    -

    The schema itself is a table and will possibly be included in - the backup. All nodes where the schema table resides are - regarded as a db_node. -

    -

    The following example illustrates how - mnesia:traverse_backup can be used to rename a db_node in - a backup file: -

    - -
    - -
    - Restore -

    Tables can be restored on-line from a backup without - restarting Mnesia. A restore is performed with the function - mnesia:restore(Opaque,Args), where Args can - contain the following tuples: -

    - - {module,Mod}. The backup module Mod is - used to access the backup media. If omitted, the default - backup module will be used. - {skip_tables, TableList} Where TableList - is a list of tables which should not be read from the backup. - {clear_tables, TableList} Where TableList - is a list of tables which should be cleared, before the - records from the backup are inserted, i.e. all records in - the tables are deleted before the tables are restored. - Schema information about the tables is not cleared or read - from backup. - {keep_tables, TableList} Where TableList - is a list of tables which should be not be cleared, before - the records from the backup are inserted, i.e. the records - in the backup will be added to the records in the table. - Schema information about the tables is not cleared or read - from backup. - {recreate_tables, TableList} Where TableList - is a list of tables which should be re-created, before the - records from the backup are inserted. The tables are first - deleted and then created with the schema information from the - backup. All the nodes in the backup needs to be up and running. - {default_op, Operation} Where Operation is - one of the following operations skip_tables, - clear_tables, keep_tables or - recreate_tables. The default operation specifies - which operation should be used on tables from the backup - which are not specified in any of the lists above. - If omitted, the operation clear_tables will be used. - -

    The argument Opaque is forwarded to the backup module. - It returns {atomic, TabList} if successful, or the - tuple {aborted, Reason} in the case of an error. - TabList is a list of the restored tables. Tables which - are restored are write locked for the duration of the restore - operation. However, regardless of any lock conflict caused by - this, applications can continue to do their work during the - restore operation. -

    -

    The restoration is performed as a single transaction. If the - database is very large, it may not be possible to restore it - online. In such a case the old database must be restored by - installing a fallback, and then restart. -

    -
    - -
    - Fallbacks -

    The function mnesia:install_fallback(Opaque, [Mod]) is - used to install a backup as fallback. It uses the backup module - Mod, or the default backup module, to access the backup - media. This function returns ok if successful, or - {error, Reason} in the case of an error. -

    -

    Installing a fallback is a distributed operation that is - only performed on all db_nodes. The fallback - is used to restore the database the next time the system is - started. If a Mnesia node with a fallback installed detects that - Mnesia on another node has died for some reason, it will - unconditionally terminate itself. -

    -

    A fallback is typically used when a system upgrade is - performed. A system typically involves the installation of new - software versions, and Mnesia tables are often transformed into - new layouts. If the system crashes during an upgrade, it is - highly probable re-installation of the old - applications will be required and restoration of the database - to its previous state. This can be done if a backup is performed and - installed as a fallback before the system upgrade begins. -

    -

    If the system upgrade fails, Mnesia must be restarted on all - db_nodes in order to restore the old database. The - fallback will be automatically de-installed after a successful - start-up. The function mnesia:uninstall_fallback() may - also be used to de-install the fallback after a - successful system upgrade. Again, this is a distributed - operation that is either performed on all db_nodes, or - none. Both the installation and de-installation of fallbacks - require Erlang to be up and running on all db_nodes, but - it does not matter if Mnesia is running or not. -

    -
    - -
    - Disaster Recovery -

    The system may become inconsistent as a result of a power - failure. The UNIX fsck feature can possibly repair the - file system, but there is no guarantee that the file contents - will be consistent. -

    -

    If Mnesia detects that a file has not been properly closed, - possibly as a result of a power failure, it will attempt to - repair the bad file in a similar manner. Data may be lost, but - Mnesia can be restarted even if the data is inconsistent. The - configuration parameter ]]> can be - used to control the behavior of Mnesia at start-up. If - ]]> has the value true, Mnesia will attempt to - repair the file; if ]]> has the value false, - Mnesia will not restart if it detects a suspect file. This - configuration parameter affects the repair behavior of log - files, DAT files, and the default backup media. -

    -

    The configuration parameter ]]> controls the safety level of - the mnesia:dump_log() function. By default, Mnesia will - dump the transaction log directly into the DAT files. If a power - failure happens during the dump, this may cause the randomly - accessed DAT files to become corrupt. If the parameter is set to - false, Mnesia will copy the DAT files and target the dump - to the new temporary files. If the dump is successful, the - temporary files will be renamed to their normal DAT - suffixes. The possibility for unrecoverable inconsistencies in - the data files will be much smaller with this strategy. On the - other hand, the actual dumping of the transaction log will be - considerably slower. The system designer must decide whether - speed or safety is the higher priority. -

    -

    Replicas of type disc_only_copies will only be - affected by this parameter during the initial dump of the log - file at start-up. When designing applications which have - very high requirements, it may be appropriate not to - use disc_only_copies tables at all. The reason for this - is the random access nature of normal operating system files. If - a node goes down for reason for a reason such as a power - failure, these files may be corrupted because they are not - properly closed. The DAT files for disc_only_copies are - updated on a per transaction basis. -

    -

    If a disaster occurs and the Mnesia database has been - corrupted, it can be reconstructed from a backup. This should be - regarded as a last resort, since the backup contains old data. The - data is hopefully consistent, but data will definitely be lost - when an old backup is used to restore the database. -

    -
    -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap7.xmlsrc erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap7.xmlsrc --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap7.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap7.xmlsrc 2009-11-20 13:36:03.000000000 +0000 @@ -0,0 +1,890 @@ + + + + +
    + + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Mnesia System Information + Claes Wikström, Hans Nilsson and Håkan Mattsson + + + + + + + Mnesia_chap7.xml +
    + +
    + Database Configuration Data +

    The following two functions can be used to retrieve system + information. They are described in detail in the reference manual. +

    + + mnesia:table_info(Tab, Key) ->Info | exit({aborted, Reason}). + Returns information about one table. Such as the + current size of the table, on which nodes it resides etc. + + mnesia:system_info(Key) -> Info | exit({aborted, Reason}). + Returns information about the Mnesia system. For example, transaction + statistics, db_nodes, configuration parameters etc. + + +
    + +
    + Core Dumps +

    If Mnesia malfunctions, system information is dumped to a file + named MnesiaCore.Node.When. The type of system + information contained in this file can also be generated with + the function mnesia_lib:coredump(). If a Mnesia system + behaves strangely, it is recommended that a Mnesia core dump + file be included in the bug report.

    +
    + +
    + Dumping Tables +

    Tables of type ram_copies are by definition stored in + memory only. It is possible, however, to dump these tables to + disc, either at regular intervals, or before the system is + shutdown. The function mnesia:dump_tables(TabList) dumps + all replicas of a set of RAM tables to disc. The tables can be + accessed while being dumped to disc. To dump the tables to + disc all replicas must have the storage type ram_copies. +

    +

    The table content is placed in a .DCD file on the + disc. When the Mnesia system is started, the RAM table will + initially be loaded with data from its .DCD file. +

    +
    + +
    + + Checkpoints +

    A checkpoint is a transaction consistent state that spans over + one or more tables. When a checkpoint is activated, the system + will remember the current content of the set of tables. The + checkpoint retains a transaction consistent state of the tables, + allowing the tables to be read and updated while the checkpoint + is active. A checkpoint is typically used to + back up tables to external media, but they are also used + internally in Mnesia for other purposes. Each checkpoint is + independent and a table may be involved in several checkpoints + simultaneously. +

    +

    Each table retains its old contents in a checkpoint retainer + and for performance critical applications, it may be important + to realize the processing overhead associated with checkpoints. + In a worst case scenario, the checkpoint retainer will consume + even more memory than the table itself. Each update will also be + slightly slower on those nodes where checkpoint + retainers are attached to the tables. +

    +

    For each table it is possible to choose if there should be one + checkpoint retainer attached to all replicas of the table, or if + it is enough to have only one checkpoint retainer attached to a + single replica. With a single checkpoint retainer per table, the + checkpoint will consume less memory, but it will be vulnerable + to node crashes. With several redundant checkpoint retainers the + checkpoint will survive as long as there is at least one active + checkpoint retainer attached to each table. +

    +

    Checkpoints may be explicitly deactivated with the function + mnesia:deactivate_checkpoint(Name), where Name is + the name of an active checkpoint. This function returns + ok if successful, or {error, Reason} in the case + of an error. All tables in a checkpoint must be attached to at + least one checkpoint retainer. The checkpoint is automatically + de-activated by Mnesia, when any table lacks a checkpoint + retainer. This may happen when a node goes down or when a + replica is deleted. Use the min and + max arguments described below, to control the degree of + checkpoint retainer redundancy. +

    +

    Checkpoints are activated with the function +mnesia:activate_checkpoint(Args), + where Args is a list of the following tuples: +

    + + {name,Name}. Name specifies a temporary name + of the checkpoint. The name may be re-used when the checkpoint + has been de-activated. If no name is specified, a name is + generated automatically. + + {max,MaxTabs}. MaxTabs is a list of tables + which will be included in the checkpoint. The default is + [] (an empty list). For these tables, the redundancy + will be maximized. The old contents of the table will be + retained in the checkpoint retainer when the main table is + updated by the applications. The checkpoint becomes more fault + tolerant if the tables have several replicas. When new + replicas are added by means of the schema manipulation + function mnesia:add_table_copy/3, it will also + attach a local checkpoint retainer. + + {min,MinTabs}. MinTabs is a list of tables + that should be included in the checkpoint. The default is + []. For these tables, the redundancy will be minimized, + and there will be a single checkpoint retainer per table, + preferably at the local node. + + {allow_remote,Bool}. false means that all + checkpoint retainers must be local. If a table does not reside + locally, the checkpoint cannot be activated. true + allows checkpoint retainers to be allocated on any node. The + defaults is true. + + {ram_overrides_dump,Bool}. This argument only + applies to tables of type ram_copies. Bool + specifies if the table state in RAM should override the table + state on disc. true means that the latest committed + records in RAM are included in the checkpoint retainer. These + are the records that the application accesses. false + means that the records on the disc .DAT file are + included in the checkpoint retainer. These are the records + that will be loaded on start-up. Default is false. + +

    The mnesia:activate_checkpoint(Args) returns one of the + following values: +

    + + {ok, Name, Nodes} + {error, Reason}. + +

    Name is the name of the checkpoint, and Nodes are + the nodes where the checkpoint is known. +

    +

    A list of active checkpoints can be obtained with the following + functions: +

    + + mnesia:system_info(checkpoints). This function + returns all active checkpoints on the current node. + mnesia:table_info(Tab,checkpoints). This function + returns active checkpoints on a specific table. + +
    + +
    + Files +

    This section describes the internal files which are created and maintained by the Mnesia system, + in particular, the workings of the Mnesia log is described. +

    + +
    + Start-Up Files +
    +

    In Chapter 3 we detailed the following pre-requisites for + starting Mnesia (refer Chapter 3: Starting Mnesia: +

    + + We must start an Erlang session and specify a Mnesia + directory for our database. + + We must initiate a database schema, using the function + mnesia:create_schema/1. + + +

    The following example shows how these tasks are performed: +

    + + +
    +% erl  -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'        
    +
    + +
    +Erlang (BEAM) emulator version 4.9
    + 
    +Eshell V4.9  (abort with ^G)
    +(klacke@gin)1> mnesia:create_schema([node()]).
    +ok
    +(klacke@gin)2> 
    +^Z
    +Suspended        
    +

    We can inspect the Mnesia directory to see what files have been created. Enter the following command: +

    +
    +% ls -l /ldisc/scratch/klacke
    +-rw-rw-r--   1 klacke   staff       247 Aug 12 15:06 FALLBACK.BUP        
    +

    The response shows that the file FALLBACK.BUP has been created. This is called a backup file, and it contains an initial schema. If we had specified more than one node in the mnesia:create_schema/1 function, identical backup files would have been created on all nodes. +

    +
    + +

    Continue by starting Mnesia:

    +
    +(klacke@gin)3>mnesia:start( ).
    +ok        
    +

    We can now see the following listing in the Mnesia directory: +

    +
    +-rw-rw-r--   1 klacke   staff         86 May 26 19:03 LATEST.LOG
    +-rw-rw-r--   1 klacke   staff      34507 May 26 19:03 schema.DAT        
    +

    The schema in the backup file FALLBACK.BUP has been used to generate the file schema.DAT. Since we have no other disc resident tables than the schema, no other data files were created. The file FALLBACK.BUP was removed after the successful "restoration". We also see a number of files that are for internal use by Mnesia. +

    +
    + +

    Enter the following command to create a table:

    +
    +(klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
    +{atomic,ok}        
    +

    We can now see the following listing in the Mnesia directory: +

    +
    +% ls -l /ldisc/scratch/klacke
    +-rw-rw-r-- 1 klacke staff    86 May 26 19:07 LATEST.LOG
    +-rw-rw-r-- 1 klacke staff    94 May 26 19:07 foo.DCD
    +-rw-rw-r-- 1 klacke staff  6679 May 26 19:07 schema.DAT        
    +

    Where a file foo.DCD has been created. This file will eventually store + all data that is written into the foo table.

    +
    +
    + +
    + The Log File +

    When starting Mnesia, a .LOG file called LATEST.LOG + was created and placed in the database directory. This file is + used by Mnesia to log disc based transactions. This includes all + transactions that write at least one record in a table which is + of storage type disc_copies, or + disc_only_copies. It also includes all operations which + manipulate the schema itself, such as creating new tables. The + format of the log can vary with different implementations of + Mnesia. The Mnesia log is currently implemented with the + standard library module disc_log. +

    +

    The log file will grow continuously and must be dumped at + regular intervals. "Dumping the log file" means that Mnesia will + perform all the operations listed in the log and place the + records in the corresponding .DAT, .DCD and .DCL data files. For + example, if the operation "write record {foo, 4, elvis, 6}" + is listed in the log, Mnesia inserts the operation into the + file foo.DCL, later when Mnesia thinks the .DCL has become to large + the data is moved to the .DCD file. + The dumping operation can be time consuming + if the log is very large. However, it is important to realize + that the Mnesia system continues to operate during log dumps. +

    +

    By default Mnesia either dumps the log whenever 100 records have + been written in the log or when 3 minutes have passed. + This is controlled by the two application parameters + -mnesia dump_log_write_threshold WriteOperations and + -mnesia dump_log_time_threshold MilliSecs. +

    +

    Before the log is dumped, the file LATEST.LOG is + renamed to PREVIOUS.LOG, and a new LATEST.LOG file + is created. Once the log has been successfully dumped, the file + PREVIOUS.LOG is deleted. +

    +

    The log is also dumped at start-up and whenever a schema + operation is performed. +

    +
    + +
    + The Data Files +

    The directory listing also contains one .DAT file. This contain + the schema itself, contained in the schema.DAT + file. The DAT files are indexed files, and it is efficient to + insert and search for records in these files with a specific + key. The .DAT files are used for the schema and for disc_only_copies + tables. The Mnesia data files are currently implemented with the + standard library module dets, and all operations which + can be performed on dets files can also be performed on + the Mnesia data files. For example, dets contains a + function dets:traverse/2 which can be used to view the + contents of a Mnesia DAT file. However, this can only be done + when Mnesia is not running. So, to view a our schema file, we + can:

    +
    +{ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false}, 
    +{keypos, 2}]),
    +F = fun(X) -> io:format("~p~n", [X]), continue end,
    +dets:traverse(N, F),
    +dets:close(N).      
    + +

    Refer to the Reference Manual, std_lib for information about dets.

    +
    + +

    The DAT files must always be opened with the {repair, false} + option. This ensures that these files are not + automatically repaired. Without this option, the database may + become inconsistent, because Mnesia may + believe that the files were properly closed. Refer to the reference + manual for information about the configuration parameter + auto_repair.

    +
    + +

    It is recommended that Data files are not tampered with while Mnesia is + running. While not prohibited, the behavior of Mnesia is unpredictable.

    +
    +

    The disc_copies tables are stored on disk with .DCL and .DCD files, + which are standard disk_log files. +

    +
    +
    + +
    + Loading of Tables at Start-up +

    At start-up Mnesia loads tables in order to make them accessible + for its applications. Sometimes Mnesia decides to load all tables + that reside locally, and sometimes the tables may not be + accessible until Mnesia brings a copy of the table + from another node. +

    +

    To understand the behavior of Mnesia at start-up it is + essential to understand how Mnesia reacts when it loses contact + with Mnesia on another node. At this stage, Mnesia cannot distinguish + between a communication failure and a "normal" node down.

    + + When this happens, Mnesia will assume that the other node is no longer running. + Whereas, in reality, the communication between the nodes has merely failed. +

    +

    To overcome this situation, simply try to restart the ongoing transactions that are + accessing tables on the failing node, and write a mnesia_down entry to a log file. +

    +

    At start-up, it must be noted that all tables residing on nodes + without a mnesia_down entry, may have fresher replicas. + Their replicas may have been updated after the termination + of Mnesia on the current node. In order to catch up with the latest + updates, transfer a copy of the table from one of these other + "fresh" nodes. If you are unlucky, other nodes may be down + and you must wait for the table to be + loaded on one of these nodes before receiving a fresh copy of + the table. +

    +

    Before an application makes its first access to a table, + mnesia:wait_for_tables(TabList, Timeout) ought to be executed + to ensure that the table is accessible from the local node. If + the function times out the application may choose to force a + load of the local replica with + mnesia:force_load_table(Tab) and deliberately lose all + updates that may have been performed on the other nodes while + the local node was down. If + Mnesia already has loaded the table on another node or intends + to do so, we will copy the table from that node in order to + avoid unnecessary inconsistency. +

    + +

    Keep in mind that it is only + one table that is loaded by mnesia:force_load_table(Tab) + and since committed transactions may have caused updates in + several tables, the tables may now become inconsistent due to + the forced load.

    +
    +

    The allowed AccessMode of a table may be defined to + either be read_only or read_write. And it may be + toggled with the function mnesia:change_table_access_mode(Tab, AccessMode) in runtime. read_only tables and + local_content tables will always be loaded locally, since + there are no need for copying the table from other nodes. Other + tables will primary be loaded remotely from active replicas on + other nodes if the table already has been loaded there, or if + the running Mnesia already has decided to load the table there. +

    +

    At start up, Mnesia will assume that its local replica is the + most recent version and load the table from disc if either + situation is detected: +

    + + mnesia_down is returned from all other nodes that holds a disc + resident replica of the table; or, + if all replicas are ram_copies + +

    This is normally a wise decision, but it may turn out to + be disastrous if the nodes have been disconnected due to a + communication failure, since Mnesia's normal table load + mechanism does not cope with communication failures. +

    +

    When Mnesia is loading many tables the default load + order. However, it is possible to + affect the load order by explicitly changing the + load_order property for the tables, with the function + mnesia:change_table_load_order(Tab, LoadOrder). The + LoadOrder is by default 0 for all tables, but it + can be set to any integer. The table with the highest + load_order will be loaded first. Changing load order is + especially useful for applications that need to ensure early + availability of fundamental tables. Large peripheral + tables should have a low load order value, perhaps set + below 0. +

    +
    + +
    + Recovery from Communication Failure +

    There are several occasions when Mnesia may detect that the + network has been partitioned due to a communication failure. +

    +

    One is when Mnesia already is up and running and the Erlang + nodes gain contact again. Then Mnesia will try to contact Mnesia + on the other node to see if it also thinks that the network has + been partitioned for a while. If Mnesia on both nodes has logged + mnesia_down entries from each other, Mnesia generates a + system event, called {inconsistent_database, running_partitioned_network, Node} which is sent to Mnesia's + event handler and other possible subscribers. The default event + handler reports an error to the error logger. +

    +

    Another occasion when Mnesia may detect that the network has + been partitioned due to a communication failure, is at start-up. + If Mnesia detects that both the local node and another node received + mnesia_down from each other it generates a + {inconsistent_database, starting_partitioned_network, Node} system event and acts as described above. +

    +

    If the application detects that there has been a communication + failure which may have caused an inconsistent database, it may + use the function mnesia:set_master_nodes(Tab, Nodes) to + pinpoint from which nodes each table may be loaded.

    +

    At start-up Mnesia's normal table load algorithm will be + bypassed and the table will be loaded from one of the master + nodes defined for the table, regardless of potential + mnesia_down entries in the log. The Nodes may only + contain nodes where the table has a replica and if it is empty, + the master node recovery mechanism for the particular table will + be reset and the normal load mechanism will be used when next + restarting. +

    +

    The function mnesia:set_master_nodes(Nodes) sets master + nodes for all tables. For each table it will determine its + replica nodes and invoke mnesia:set_master_nodes(Tab, TabNodes) with those replica nodes that are included in the + Nodes list (i.e. TabNodes is the intersection of + Nodes and the replica nodes of the table). If the + intersection is empty the master node recovery mechanism for the + particular table will be reset and the normal load mechanism + will be used at next restart. +

    +

    The functions mnesia:system_info(master_node_tables) and + mnesia:table_info(Tab, master_nodes) may be used to + obtain information about the potential master nodes. +

    +

    The function mnesia:force_load_table(Tab) may be used to + force load the table regardless of which table load mechanism + is activated. +

    +
    + +
    + Recovery of Transactions +

    A Mnesia table may reside on one or more nodes. When a table is + updated, Mnesia will ensure that the updates will be replicated + to all nodes where the table resides. If a replica happens to be + inaccessible for some reason (e.g. due to a temporary node down), + Mnesia will then perform the replication later. +

    +

    On the node where the application is started, there will be a + transaction coordinator process. If the transaction is + distributed, there will also be a transaction participant process on + all the other nodes where commit work needs to be performed. +

    +

    Internally Mnesia uses several commit protocols. The selected + protocol depends on which table that has been updated in + the transaction. If all the involved tables are symmetrically + replicated, (i.e. they all have the same ram_nodes, + disc_nodes and disc_only_nodes currently + accessible from the coordinator node), a lightweight transaction + commit protocol is used. +

    +

    The number of messages that the + transaction coordinator and its participants needs to exchange + is few, since Mnesia's table load mechanism takes care of the + transaction recovery if the commit protocol gets + interrupted. Since all involved tables are replicated + symmetrically the transaction will automatically be recovered by + loading the involved tables from the same node at start-up of a + failing node. We do not really care if the transaction was + aborted or committed as long as we can ensure the ACID + properties. The lightweight commit protocol is non-blocking, + i.e. the surviving participants and their coordinator will + finish the transaction, regardless of some node crashes in the + middle of the commit protocol or not. +

    +

    If a node goes down in the middle of a dirty operation the + table load mechanism will ensure that the update will be + performed on all replicas or none. Both asynchronous dirty + updates and synchronous dirty updates use the same recovery + principle as lightweight transactions. +

    +

    If a transaction involves updates of asymmetrically replicated + tables or updates of the schema table, a heavyweight commit + protocol will be used. The heavyweight commit protocol is able + to finish the transaction regardless of how the tables are + replicated. The typical usage of a heavyweight transaction is + when we want to move a replica from one node to another. Then we + must ensure that the replica either is entirely moved or left as + it was. We must never end up in a situation with replicas on both + nodes or no node at all. Even if a node crashes in the middle of + the commit protocol, the transaction must be guaranteed to be + atomic. The heavyweight commit protocol involves more messages + between the transaction coordinator and its participants than + a lightweight protocol and it will perform recovery work at + start-up in order to finish the abort or commit work. +

    +

    The heavyweight commit protocol is also non-blocking, + which allows the surviving participants and their coordinator to + finish the transaction regardless (even if a node crashes in the + middle of the commit protocol). When a node fails at start-up, + Mnesia will determine the outcome of the transaction and + recover it. Lightweight protocols, heavyweight protocols and dirty updates, are + dependent on other nodes to be up and running in order to make the + correct heavyweight transaction recovery decision. +

    +

    If Mnesia has not started on some of the nodes that are involved in the + transaction AND neither the local node or any of the already + running nodes know the outcome of the transaction, Mnesia will + by default wait for one. In the worst case scenario all other + involved nodes must start before Mnesia can make the correct decision + about the transaction and finish its start-up. +

    +

    This means that Mnesia (on one node)may hang if a double fault occurs, i.e. when two nodes crash simultaneously + and one attempts to start when the other refuses to + start e.g. due to a hardware error. +

    +

    It is possible to specify the maximum time that Mnesia + will wait for other nodes to respond with a transaction + recovery decision. The configuration parameter + max_wait_for_decision defaults to infinity (which may + cause the indefinite hanging as mentioned above) but if it is + set to a definite time period (eg.three minutes), Mnesia will then enforce a + transaction recovery decision if needed, in order to allow + Mnesia to continue with its start-up procedure.

    +

    The downside of an enforced transaction recovery decision, is that the decision may be + incorrect, due to insufficient information regarding the other nodes' + recovery decisions. This may result in an + inconsistent database where Mnesia has committed the transaction + on some nodes but aborted it on others.

    +

    In fortunate cases the inconsistency will only appear in tables belonging to a specific + application, but if a schema transaction has been inconsistently + recovered due to the enforced transaction recovery decision, the + effects of the inconsistency can be fatal. + However, if the higher priority is availability rather than + consistency, then it may be worth the risk.

    +

    If Mnesia + encounters a inconsistent transaction decision a + {inconsistent_database, bad_decision, Node} system event + will be generated in order to give the application a chance to + install a fallback or other appropriate measures to resolve the inconsistency. The default + behavior of the Mnesia event handler is the same as if the + database became inconsistent as a result of partitioned network (see + above). +

    +
    + +
    + Backup, Fallback, and Disaster Recovery +

    The following functions are used to backup data, to install a + backup as fallback, and for disaster recovery. +

    + + mnesia:backup_checkpoint(Name, Opaque, [Mod]). This + function performs a backup of the tables included in the + checkpoint. + + mnesia:backup(Opaque, [Mod]). This function + activates a new checkpoint which covers all Mnesia tables and + performs a backup. It is performed with maximum degree of + redundancy (also refer to the function mnesia:activate_checkpoint(Args), + {max, MaxTabs} and {min, MinTabs}). + mnesia:traverse_backup(Source,[SourceMod,]Target,[TargetMod,]Fun,Ac). This function can be used + to read an existing backup, create a new backup from an + existing one, or to copy a backup from one type media to + another. + + mnesia:uninstall_fallback(). This function removes + previously installed fallback files. + + mnesia:restore(Opaque, Args). This function + restores a set of tables from a previous backup. + + mnesia:install_fallback(Opaque, [Mod]). This + function can be configured to restart the Mnesia and reload data + tables, and possibly schema tables, from an existing + backup. This function is typically used for disaster recovery + purposes, when data or schema tables are corrupted. + +

    These functions are explained in the following + sub-sections. Also refer to the the section Checkpoints in this chapter, which + describes the two functions used to activate and de-activate + checkpoints. +

    + +
    + Backup +

    Backup operation are performed with the following functions: +

    + + mnesia:backup_checkpoint(Name, Opaque, [Mod]) + mnesia:backup(Opaque, [Mod]) + mnesia:traverse_backup(Source, [SourceMod,],Target,[TargetMod,]Fun,Acc). + +

    By default, the actual access to the backup media is + performed via the mnesia_backup module for both read + and write. Currently mnesia_backup is implemented with + the standard library module disc_log, but it is possible to write + your own module with the same interface as + mnesia_backup and configure Mnesia so the alternate + module performs the actual accesses to the backup media. This + means that the user may put the backup on medias that Mnesia + does not know about, possibly on hosts where Erlang is not + running. Use the configuration parameter ]]> for this purpose.

    +

    The source + for a backup is an activated checkpoint. The backup function + most commonly used is mnesia:backup_checkpoint(Name, Opaque,[Mod]). This function returns either ok, or + {error,Reason}. It has the following arguments: +

    + + Name is the name of an activated + checkpoint. Refer to the section Checkpoints in this chapter, the + function mnesia:activate_checkpoint(ArgList) for + details on how to include table names in checkpoints. + + Opaque. Mnesia does not interpret this argument, + but it is forwarded to the backup module. The Mnesia default + backup module, mnesia_backup interprets this argument + as a local file name. + + Mod. The name of an alternate backup module. + + +

    The function mnesia:backup(Opaque[, Mod]) activates a + new checkpoint which covers all Mnesia tables with maximum + degree of redundancy and performs a backup. Maximum + redundancy means that each table replica has a checkpoint + retainer. Tables with the local_contents property are + backed up as they + look on the current node. +

    +

    It is possible to iterate over a backup, either for the + purpose of transforming it into a new backup, or just reading + it. The function mnesia:traverse_backup(Source, [SourceMod,]Target, [TargeMod,] Fun, Acc) which normally returns {ok, LastAcc}, is used for both of these purposes. +

    +

    Before the traversal starts, the source backup media is + opened with SourceMod:open_read(Source), and the target + backup media is opened with + TargetMod:open_write(Target). The arguments are: +

    + + SourceMod and TargetMod are module names. + + Source and Target are opaque data used + exclusively by the modules SourceMod and + TargetMod for the purpose of initializing the backup + medias. + + Acc is an initial accumulator value. + + Fun(BackupItems, Acc) is applied to each item in + the backup. The Fun must return a tuple {ValGoodBackupItems, NewAcc}, where ValidBackupItems is a list of valid + backup items, and NewAcc is a new accumulator value. + The ValidBackupItems are written to the target backup + with the function TargetMod:write/2. + + LastAcc is the last accumulator value. I.e. + the last NewAcc value that was returned by Fun. + + +

    It is also possible to perform a read-only traversal of the + source backup without updating a target backup. If + TargetMod==read_only, then no target backup is accessed + at all. +

    +

    By setting SourceMod and TargetMod to different + modules it is possible to copy a backup from one kind of backup + media to another. +

    +

    Valid BackupItems are the following tuples: +

    + + {schema, Tab} specifies a table to be deleted. + + {schema, Tab, CreateList} specifies a table to be + created. See mnesia_create_table/2 for more + information about CreateList. + + {Tab, Key} specifies the full identity of a record + to be deleted. + + {Record} specifies a record to be inserted. It + can be a tuple with Tab as first field. Note that the + record name is set to the table name regardless of what + record_name is set to. + + +

    The backup data is divided into two sections. The first + section contains information related to the schema. All schema + related items are tuples where the first field equals the atom + schema. The second section is the record section. It is not + possible to mix schema records with other records and all schema + records must be located first in the backup. +

    +

    The schema itself is a table and will possibly be included in + the backup. All nodes where the schema table resides are + regarded as a db_node. +

    +

    The following example illustrates how + mnesia:traverse_backup can be used to rename a db_node in + a backup file: +

    + +
    + +
    + Restore +

    Tables can be restored on-line from a backup without + restarting Mnesia. A restore is performed with the function + mnesia:restore(Opaque,Args), where Args can + contain the following tuples: +

    + + {module,Mod}. The backup module Mod is + used to access the backup media. If omitted, the default + backup module will be used. + {skip_tables, TableList} Where TableList + is a list of tables which should not be read from the backup. + {clear_tables, TableList} Where TableList + is a list of tables which should be cleared, before the + records from the backup are inserted, i.e. all records in + the tables are deleted before the tables are restored. + Schema information about the tables is not cleared or read + from backup. + {keep_tables, TableList} Where TableList + is a list of tables which should be not be cleared, before + the records from the backup are inserted, i.e. the records + in the backup will be added to the records in the table. + Schema information about the tables is not cleared or read + from backup. + {recreate_tables, TableList} Where TableList + is a list of tables which should be re-created, before the + records from the backup are inserted. The tables are first + deleted and then created with the schema information from the + backup. All the nodes in the backup needs to be up and running. + {default_op, Operation} Where Operation is + one of the following operations skip_tables, + clear_tables, keep_tables or + recreate_tables. The default operation specifies + which operation should be used on tables from the backup + which are not specified in any of the lists above. + If omitted, the operation clear_tables will be used. + +

    The argument Opaque is forwarded to the backup module. + It returns {atomic, TabList} if successful, or the + tuple {aborted, Reason} in the case of an error. + TabList is a list of the restored tables. Tables which + are restored are write locked for the duration of the restore + operation. However, regardless of any lock conflict caused by + this, applications can continue to do their work during the + restore operation. +

    +

    The restoration is performed as a single transaction. If the + database is very large, it may not be possible to restore it + online. In such a case the old database must be restored by + installing a fallback, and then restart. +

    +
    + +
    + Fallbacks +

    The function mnesia:install_fallback(Opaque, [Mod]) is + used to install a backup as fallback. It uses the backup module + Mod, or the default backup module, to access the backup + media. This function returns ok if successful, or + {error, Reason} in the case of an error. +

    +

    Installing a fallback is a distributed operation that is + only performed on all db_nodes. The fallback + is used to restore the database the next time the system is + started. If a Mnesia node with a fallback installed detects that + Mnesia on another node has died for some reason, it will + unconditionally terminate itself. +

    +

    A fallback is typically used when a system upgrade is + performed. A system typically involves the installation of new + software versions, and Mnesia tables are often transformed into + new layouts. If the system crashes during an upgrade, it is + highly probable re-installation of the old + applications will be required and restoration of the database + to its previous state. This can be done if a backup is performed and + installed as a fallback before the system upgrade begins. +

    +

    If the system upgrade fails, Mnesia must be restarted on all + db_nodes in order to restore the old database. The + fallback will be automatically de-installed after a successful + start-up. The function mnesia:uninstall_fallback() may + also be used to de-install the fallback after a + successful system upgrade. Again, this is a distributed + operation that is either performed on all db_nodes, or + none. Both the installation and de-installation of fallbacks + require Erlang to be up and running on all db_nodes, but + it does not matter if Mnesia is running or not. +

    +
    + +
    + Disaster Recovery +

    The system may become inconsistent as a result of a power + failure. The UNIX fsck feature can possibly repair the + file system, but there is no guarantee that the file contents + will be consistent. +

    +

    If Mnesia detects that a file has not been properly closed, + possibly as a result of a power failure, it will attempt to + repair the bad file in a similar manner. Data may be lost, but + Mnesia can be restarted even if the data is inconsistent. The + configuration parameter ]]> can be + used to control the behavior of Mnesia at start-up. If + ]]> has the value true, Mnesia will attempt to + repair the file; if ]]> has the value false, + Mnesia will not restart if it detects a suspect file. This + configuration parameter affects the repair behavior of log + files, DAT files, and the default backup media. +

    +

    The configuration parameter ]]> controls the safety level of + the mnesia:dump_log() function. By default, Mnesia will + dump the transaction log directly into the DAT files. If a power + failure happens during the dump, this may cause the randomly + accessed DAT files to become corrupt. If the parameter is set to + false, Mnesia will copy the DAT files and target the dump + to the new temporary files. If the dump is successful, the + temporary files will be renamed to their normal DAT + suffixes. The possibility for unrecoverable inconsistencies in + the data files will be much smaller with this strategy. On the + other hand, the actual dumping of the transaction log will be + considerably slower. The system designer must decide whether + speed or safety is the higher priority. +

    +

    Replicas of type disc_only_copies will only be + affected by this parameter during the initial dump of the log + file at start-up. When designing applications which have + very high requirements, it may be appropriate not to + use disc_only_copies tables at all. The reason for this + is the random access nature of normal operating system files. If + a node goes down for reason for a reason such as a power + failure, these files may be corrupted because they are not + properly closed. The DAT files for disc_only_copies are + updated on a per transaction basis. +

    +

    If a disaster occurs and the Mnesia database has been + corrupted, it can be reconstructed from a backup. This should be + regarded as a last resort, since the backup contains old data. The + data is hopefully consistent, but data will definitely be lost + when an old backup is used to restore the database. +

    +
    +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap8.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap8.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/Mnesia_chap8.xml 2007-11-26 13:08:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/Mnesia_chap8.xml 2009-11-20 13:36:03.000000000 +0000 @@ -4,23 +4,21 @@
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Combining Mnesia with SNMP @@ -31,7 +29,7 @@ - + Mnesia_chap8.xml
    diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/mnesia.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/mnesia.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/mnesia.xml 2009-04-16 10:26:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/mnesia.xml 2009-11-20 13:35:49.000000000 +0000 @@ -1553,7 +1553,7 @@

    The normal usage is to call the function without checking the return value since it exits if it fails and the transaction is restarted by the transaction manager. It - returns all the locked nodes if a write lock is aquired, and + returns all the locked nodes if a write lock is acquired, and ok if it was a read lock.

    This function mnesia:lock/2 is intended to support diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/notes_history.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/notes_history.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/notes_history.xml 2007-11-26 13:10:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/notes_history.xml 2009-11-20 13:37:35.000000000 +0000 @@ -4,23 +4,21 @@

    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Mnesia Release Notes @@ -190,7 +188,7 @@

    Removed dead code (dialyzer warnings) and debugging features that called interpreter commands.

    Minor - performance increase when a lot of simultanously + performance increase when a lot of simultaneous transactions where active.

    Thank you Scott Lystig Fritchie for debugging and bug reports.

    diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/notes.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/notes.xml 2009-06-05 13:54:55.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/notes.xml 2009-11-20 13:35:51.000000000 +0000 @@ -38,6 +38,44 @@ thus constitutes one section in this document. The title of each section is the version number of Mnesia.

    +
    Mnesia 4.4.12 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8250

    +
    +
    +
    + +
    +
    Mnesia 4.4.11 + +
    Improvements and New Features + + +

    + Fixed duplicate results with mnesia:index_read() on + ordered_set tables. Reported by Sam Bobroff.

    +

    + Fixed locking in mnesia:index_read() which now grabs a read + table lock to ensure correctness, this may slow down the + operation or block other processes trying to reach the + same table.

    +

    + Calling mnesia:dump_log() could crash mnesia, + Reported by Igor Ribeiro Sucupira.

    +

    Own Id: OTP-8074

    +
    +
    +
    + +
    Mnesia 4.4.10
    Fixed Bugs and Malfunctions @@ -337,9 +375,9 @@
    -
    + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/part_notes.xml 2007-11-26 13:08:12.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/part_notes.xml 2009-11-20 13:36:09.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + MNESIA Release Notes @@ -38,6 +36,6 @@

    For information about older versions see release notes history.

    - + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/part.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/part.xml 2007-11-26 13:08:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/part.xml 2009-11-20 13:36:03.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Mnesia User's Guide @@ -36,16 +34,16 @@ Erlang applications which require continuous operation and exhibit soft real-time properties.

    - - - - - - - - - - - + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/mnesia/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/mnesia/doc/src/ref_man.xml 2007-11-26 13:08:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/doc/src/ref_man.xml 2009-11-20 13:36:05.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Mnesia Reference Manual @@ -39,8 +37,8 @@ Erlang applications which require continuous operation and exhibit soft real-time properties.

    - - - + + + diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia.appup.src erlang-13.b.3-dfsg/lib/mnesia/src/mnesia.appup.src --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia.appup.src 2009-06-05 13:55:28.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia.appup.src 2009-11-20 13:36:40.000000000 +0000 @@ -1,11 +1,35 @@ %% -*- erlang -*- {"%VSN%", [ + {"4.4.11", + [ + {update, mnesia_locker, soft, soft_purge, soft_purge, []}, + {update, mnesia_controller, soft, soft_purge, soft_purge, []} + ] + }, + {"4.4.10", + [ + {update, mnesia_locker, soft, soft_purge, soft_purge, []}, + {update, mnesia_controller, soft, soft_purge, soft_purge, []} + ] + }, {"4.4.9", [{restart_application, mnesia}]}, {"4.4.8", [{restart_application, mnesia}]}, {"4.4.7", [{restart_application, mnesia}]} ], [ + {"4.4.11", + [ + {update, mnesia_locker, soft, soft_purge, soft_purge, []}, + {update, mnesia_controller, soft, soft_purge, soft_purge, []} + ] + }, + {"4.4.10", + [ + {update, mnesia_locker, soft, soft_purge, soft_purge, []}, + {update, mnesia_controller, soft, soft_purge, soft_purge, []} + ] + }, {"4.4.9", [{restart_application, mnesia}]}, {"4.4.8", [{restart_application, mnesia}]}, {"4.4.7", [{restart_application, mnesia}]} diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_checkpoint.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_checkpoint.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_checkpoint.erl 2009-03-12 12:27:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_checkpoint.erl 2009-09-18 15:12:16.000000000 +0100 @@ -122,7 +122,7 @@ checkpoints()), ok. -tm_prepare(Cp) when record(Cp, checkpoint_args) -> +tm_prepare(Cp) when is_record(Cp, checkpoint_args) -> Name = Cp#checkpoint_args.name, case lists:member(Name, checkpoints()) of false -> @@ -130,7 +130,7 @@ true -> {error, {already_exists, Name, node()}} end; -tm_prepare(Cp) when record(Cp, checkpoint) -> +tm_prepare(Cp) when is_record(Cp, checkpoint) -> %% Node with old protocol sent an old checkpoint record %% and we have to convert it case convert_cp_record(Cp) of @@ -370,7 +370,7 @@ {error, Reason} end. -args2cp(Args) when list(Args)-> +args2cp(Args) when is_list(Args)-> case catch lists:foldl(fun check_arg/2, #checkpoint_args{}, Args) of {'EXIT', Reason} -> {error, Reason}; @@ -391,7 +391,7 @@ exit({already_exists, Name}); false -> case catch tab2retainer({foo, Name}) of - List when list(List) -> + List when is_list(List) -> Cp#checkpoint_args{name = Name}; _ -> exit({badarg, Name}) @@ -405,13 +405,13 @@ Cp#checkpoint_args{ram_overrides_dump = true}; check_arg({ram_overrides_dump, false}, Cp) -> Cp#checkpoint_args{ram_overrides_dump = false}; -check_arg({ram_overrides_dump, Tabs}, Cp) when list(Tabs) -> +check_arg({ram_overrides_dump, Tabs}, Cp) when is_list(Tabs) -> Cp#checkpoint_args{ram_overrides_dump = Tabs}; -check_arg({min, Tabs}, Cp) when list(Tabs) -> +check_arg({min, Tabs}, Cp) when is_list(Tabs) -> Cp#checkpoint_args{min = Tabs}; -check_arg({max, Tabs}, Cp) when list(Tabs) -> +check_arg({max, Tabs}, Cp) when is_list(Tabs) -> Cp#checkpoint_args{max = Tabs}; -check_arg({ignore_new, Tids}, Cp) when list(Tids) -> +check_arg({ignore_new, Tids}, Cp) when is_list(Tids) -> Cp#checkpoint_args{ignore_new = Tids}; check_arg(Arg, _) -> exit({badarg, Arg}). @@ -433,7 +433,7 @@ {ok, [], AllTabs}; Overriders == true -> {ok, AllTabs, AllTabs}; - list(Overriders) -> + is_list(Overriders) -> case [T || T <- Overriders, not lists:member(T, Min)] of [] -> case [T || T <- Overriders, not lists:member(T, Max)] of @@ -584,7 +584,7 @@ {'EXIT', _} -> {error, {no_exists, Name}}; - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> Pid ! {self(), Msg}, {ok, Pid} end. @@ -594,7 +594,7 @@ {'EXIT', _} -> {error, {no_exists, Name}}; - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> Monitor = erlang:monitor(process, Pid), %catch link(Pid), % Always local Pid ! {self(), Msg}, Self = self(), @@ -749,7 +749,7 @@ ReallyRetain. traverse_dcd({Cont, [LogH | Rest]}, Log, Fun) - when record(LogH, log_header), + when is_record(LogH, log_header), LogH#log_header.log_kind == dcd_log, LogH#log_header.log_version >= "1.0" -> traverse_dcd({Cont, Rest}, Log, Fun); %% BUGBUG Error handling repaired files @@ -777,14 +777,14 @@ %% '$end_of_table'; %% [] -> %% retainer_next_slot(Tab, Pos + 1); -%% Recs when list(Recs) -> +%% Recs when is_list(Recs) -> %% {Pos, Recs} %% end. %% %% retainer_slot({ets, Store}, Pos) -> ?ets_next(Store, Pos); %% retainer_slot({dets, Store}, Pos) -> dets:slot(Store, Pos). -retainer_fixtable(Tab, Bool) when atom(Tab) -> +retainer_fixtable(Tab, Bool) when is_atom(Tab) -> mnesia_lib:db_fixtable(val({Tab, storage_type}), Tab, Bool); retainer_fixtable({ets, Tab}, Bool) -> mnesia_lib:db_fixtable(ram_copies, Tab, Bool); @@ -876,7 +876,7 @@ retainer_loop(Cp#checkpoint_args{iterators = Iters}); {_From, {exit_pending, Tid}} - when list(Cp#checkpoint_args.wait_for_old) -> + when is_list(Cp#checkpoint_args.wait_for_old) -> StillPending = lists:delete(Tid, Cp#checkpoint_args.wait_for_old), Cp2 = Cp#checkpoint_args{wait_for_old = StillPending}, Cp3 = maybe_activate(Cp2), @@ -1226,7 +1226,7 @@ system_code_change(Cp, _Module, _OldVsn, _Extra) -> {ok, Cp}. -convert_cp_record(Cp) when record(Cp, checkpoint) -> +convert_cp_record(Cp) when is_record(Cp, checkpoint) -> ROD = case Cp#checkpoint.ram_overrides_dump of true -> Cp#checkpoint.min ++ Cp#checkpoint.max; @@ -1251,7 +1251,7 @@ supervisor = Cp#checkpoint.supervisor, pid = Cp#checkpoint.pid }}; -convert_cp_record(Cp) when record(Cp, checkpoint_args) -> +convert_cp_record(Cp) when is_record(Cp, checkpoint_args) -> AllTabs = Cp#checkpoint_args.min ++ Cp#checkpoint_args.max, ROD = case Cp#checkpoint_args.ram_overrides_dump of [] -> diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_controller.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_controller.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_controller.erl 2009-06-05 13:54:51.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_controller.erl 2009-09-18 15:12:03.000000000 +0100 @@ -1843,15 +1843,15 @@ InitBy = Worker#dump_log.initiated_by, Queue = State#state.dumper_queue, case lists:keymember(InitBy, #dump_log.initiated_by, Queue) of - false -> - ignore; true when Worker#dump_log.opt_reply_to == undefined -> %% The same threshold has been exceeded again, %% before we have had the possibility to %% process the older one. DetectedBy = {dump_log, InitBy}, Event = {mnesia_overload, DetectedBy}, - mnesia_lib:report_system_event(Event) + mnesia_lib:report_system_event(Event); + _ -> + ignore end, Queue2 = Queue ++ [Worker], State2 = State#state{dumper_queue = Queue2}, diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_dumper.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_dumper.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_dumper.erl 2009-03-12 12:27:29.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_dumper.erl 2009-09-18 15:12:02.000000000 +0100 @@ -94,7 +94,7 @@ Reg = case whereis(?REGULATOR_NAME) of undefined -> nopid; - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> Pid end, perform_dump(InitBy, Reg). @@ -189,7 +189,7 @@ insert_recs([Rec | Recs], InPlace, InitBy, Regulator, LogV) -> regulate(Regulator), case insert_rec(Rec, InPlace, InitBy, LogV) of - LogH when record(LogH, log_header) -> + LogH when is_record(LogH, log_header) -> insert_recs(Recs, InPlace, InitBy, Regulator, LogH#log_header.log_version); _ -> insert_recs(Recs, InPlace, InitBy, Regulator, LogV) @@ -200,14 +200,14 @@ insert_rec(Rec, _InPlace, scan_decisions, _LogV) -> if - record(Rec, commit) -> + is_record(Rec, commit) -> ignore; - record(Rec, log_header) -> + is_record(Rec, log_header) -> ignore; true -> mnesia_recover:note_log_decision(Rec, scan_decisions) end; -insert_rec(Rec, InPlace, InitBy, LogV) when record(Rec, commit) -> +insert_rec(Rec, InPlace, InitBy, LogV) when is_record(Rec, commit) -> %% Determine the Outcome of the transaction and recover it D = Rec#commit.decision, case mnesia_recover:wait_for_decision(D, InitBy) of @@ -216,7 +216,7 @@ {Tid, aborted} -> mnesia_schema:undo_prepare_commit(Tid, Rec) end; -insert_rec(H, _InPlace, _InitBy, _LogV) when record(H, log_header) -> +insert_rec(H, _InPlace, _InitBy, _LogV) when is_record(H, log_header) -> CurrentVersion = mnesia_log:version(), if H#log_header.log_kind /= trans_log -> @@ -343,7 +343,7 @@ true -> {RecName, Incr} = Val, case catch dets:update_counter(Tab, Key, Incr) of - CounterVal when integer(CounterVal) -> + CounterVal when is_integer(CounterVal) -> ok; _ when Incr < 0 -> Zero = {RecName, Key, 0}, diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia.erl 2009-04-16 10:26:03.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia.erl 2009-09-18 15:12:00.000000000 +0100 @@ -165,17 +165,17 @@ is_digits([]) -> true. -has_var(X) when atom(X) -> +has_var(X) when is_atom(X) -> if X == '_' -> true; - atom(X) -> + is_atom(X) -> is_dollar_digits(X); true -> false end; -has_var(X) when tuple(X) -> - e_has_var(X, size(X)); +has_var(X) when is_tuple(X) -> + e_has_var(X, tuple_size(X)); has_var([H|T]) -> case has_var(H) of false -> has_var(T); @@ -209,7 +209,7 @@ {error, R} end. -start(ExtraEnv) when list(ExtraEnv) -> +start(ExtraEnv) when is_list(ExtraEnv) -> case mnesia_lib:ensure_loaded(?APPLICATION) of ok -> patched_start(ExtraEnv); @@ -219,7 +219,7 @@ start(ExtraEnv) -> {error, {badarg, ExtraEnv}}. -patched_start([{Env, Val} | Tail]) when atom(Env) -> +patched_start([{Env, Val} | Tail]) when is_atom(Env) -> case mnesia_monitor:patch_env(Env, Val) of {error, Reason} -> {error, Reason}; @@ -238,7 +238,7 @@ Other -> Other end. -change_config(extra_db_nodes, Ns) when list(Ns) -> +change_config(extra_db_nodes, Ns) when is_list(Ns) -> mnesia_controller:connect_nodes(Ns); change_config(dc_dump_limit, N) when is_number(N), N > 0 -> case mnesia_lib:is_running() of @@ -317,7 +317,7 @@ transaction(Fun) -> transaction(get(mnesia_activity_state), Fun, [], infinity, ?DEFAULT_ACCESS, async). -transaction(Fun, Retries) when integer(Retries), Retries >= 0 -> +transaction(Fun, Retries) when is_integer(Retries), Retries >= 0 -> transaction(get(mnesia_activity_state), Fun, [], Retries, ?DEFAULT_ACCESS, async); transaction(Fun, Retries) when Retries == infinity -> transaction(get(mnesia_activity_state), Fun, [], Retries, ?DEFAULT_ACCESS, async); @@ -328,7 +328,7 @@ sync_transaction(Fun) -> transaction(get(mnesia_activity_state), Fun, [], infinity, ?DEFAULT_ACCESS, sync). -sync_transaction(Fun, Retries) when integer(Retries), Retries >= 0 -> +sync_transaction(Fun, Retries) when is_integer(Retries), Retries >= 0 -> transaction(get(mnesia_activity_state), Fun, [], Retries, ?DEFAULT_ACCESS, sync); sync_transaction(Fun, Retries) when Retries == infinity -> transaction(get(mnesia_activity_state), Fun, [], Retries, ?DEFAULT_ACCESS, sync); @@ -339,16 +339,16 @@ transaction(State, Fun, Args, Retries, Mod, Kind) - when function(Fun), list(Args), Retries == infinity, atom(Mod) -> + when is_function(Fun), is_list(Args), Retries == infinity, is_atom(Mod) -> mnesia_tm:transaction(State, Fun, Args, Retries, Mod, Kind); transaction(State, Fun, Args, Retries, Mod, Kind) - when function(Fun), list(Args), integer(Retries), Retries >= 0, atom(Mod) -> + when is_function(Fun), is_list(Args), is_integer(Retries), Retries >= 0, is_atom(Mod) -> mnesia_tm:transaction(State, Fun, Args, Retries, Mod, Kind); transaction(_State, Fun, Args, Retries, Mod, _Kind) -> {aborted, {badarg, Fun, Args, Retries, Mod}}. non_transaction(State, Fun, Args, ActivityKind, Mod) - when function(Fun), list(Args), atom(Mod) -> + when is_function(Fun), is_list(Args), is_atom(Mod) -> mnesia_tm:non_transaction(State, Fun, Args, ActivityKind, Mod); non_transaction(_State, Fun, Args, _ActivityKind, _Mod) -> {aborted, {badarg, Fun, Args}}. @@ -370,7 +370,7 @@ activity(Kind, Fun) -> activity(Kind, Fun, []). -activity(Kind, Fun, Args) when list(Args) -> +activity(Kind, Fun, Args) when is_list(Args) -> activity(Kind, Fun, Args, mnesia_monitor:get_env(access_module)); activity(Kind, Fun, Mod) -> activity(Kind, Fun, [], Mod). @@ -442,7 +442,7 @@ lock({table, Tab}, write), ok. -lock_record(Tid, Ts, Tab, Key, LockKind) when atom(Tab) -> +lock_record(Tid, Ts, Tab, Key, LockKind) when is_atom(Tab) -> Store = Ts#tidstore.store, Oid = {Tab, Key}, case LockKind of @@ -460,7 +460,7 @@ lock_record(_Tid, _Ts, Tab, _Key, _LockKind) -> abort({bad_type, Tab}). -lock_table(Tid, Ts, Tab, LockKind) when atom(Tab) -> +lock_table(Tid, Ts, Tab, LockKind) when is_atom(Tab) -> Store = Ts#tidstore.store, case LockKind of read -> @@ -477,7 +477,7 @@ lock_table(_Tid, _Ts, Tab, _LockKind) -> abort({bad_type, Tab}). -global_lock(Tid, Ts, Item, Kind, Nodes) when list(Nodes) -> +global_lock(Tid, Ts, Item, Kind, Nodes) when is_list(Nodes) -> case element(1, Tid) of tid -> Store = Ts#tidstore.store, @@ -501,13 +501,13 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Access within an activity - updates -write(Val) when tuple(Val), size(Val) > 2 -> +write(Val) when is_tuple(Val), tuple_size(Val) > 2 -> Tab = element(1, Val), write(Tab, Val, write); write(Val) -> abort({bad_type, Val}). -s_write(Val) when tuple(Val), size(Val) > 2 -> +s_write(Val) when is_tuple(Val), tuple_size(Val) > 2 -> Tab = element(1, Val), write(Tab, Val, sticky_write). @@ -522,7 +522,7 @@ end. write(Tid, Ts, Tab, Val, LockKind) - when atom(Tab), Tab /= schema, tuple(Val), size(Val) > 2 -> + when is_atom(Tab), Tab /= schema, is_tuple(Val), tuple_size(Val) > 2 -> case element(1, Tid) of ets -> ?ets_insert(Tab, Val), @@ -548,7 +548,7 @@ write_to_store(Tab, Store, Oid, Val) -> case ?catch_val({Tab, record_validation}) of {RecName, Arity, Type} - when size(Val) == Arity, RecName == element(1, Val) -> + when tuple_size(Val) == Arity, RecName == element(1, Val) -> case Type of bag -> ?ets_insert(Store, {Oid, Val, write}); @@ -584,7 +584,7 @@ end. delete(Tid, Ts, Tab, Key, LockKind) - when atom(Tab), Tab /= schema -> + when is_atom(Tab), Tab /= schema -> case element(1, Tid) of ets -> ?ets_delete(Tab, Key), @@ -609,13 +609,13 @@ delete(_Tid, _Ts, Tab, _Key, _LockKind) -> abort({bad_type, Tab}). -delete_object(Val) when tuple(Val), size(Val) > 2 -> +delete_object(Val) when is_tuple(Val), tuple_size(Val) > 2 -> Tab = element(1, Val), delete_object(Tab, Val, write); delete_object(Val) -> abort({bad_type, Val}). -s_delete_object(Val) when tuple(Val), size(Val) > 2 -> +s_delete_object(Val) when is_tuple(Val), tuple_size(Val) > 2 -> Tab = element(1, Val), delete_object(Tab, Val, sticky_write); s_delete_object(Val) -> @@ -632,7 +632,7 @@ end. delete_object(Tid, Ts, Tab, Val, LockKind) - when atom(Tab), Tab /= schema, tuple(Val), size(Val) > 2 -> + when is_atom(Tab), Tab /= schema, is_tuple(Val), tuple_size(Val) > 2 -> case has_var(Val) of false -> do_delete_object(Tid, Ts, Tab, Val, LockKind); @@ -704,7 +704,7 @@ end. read(Tid, Ts, Tab, Key, LockKind) - when atom(Tab), Tab /= schema -> + when is_atom(Tab), Tab /= schema -> case element(1, Tid) of ets -> ?ets_lookup(Tab, Key); @@ -740,7 +740,7 @@ end. first(Tid, Ts, Tab) - when atom(Tab), Tab /= schema -> + when is_atom(Tab), Tab /= schema -> case element(1, Tid) of ets -> ?ets_first(Tab); @@ -767,7 +767,7 @@ end. last(Tid, Ts, Tab) - when atom(Tab), Tab /= schema -> + when is_atom(Tab), Tab /= schema -> case element(1, Tid) of ets -> ?ets_last(Tab); @@ -793,7 +793,7 @@ abort(no_transaction) end. next(Tid,Ts,Tab,Key) - when atom(Tab), Tab /= schema -> + when is_atom(Tab), Tab /= schema -> case element(1, Tid) of ets -> ?ets_next(Tab,Key); @@ -819,7 +819,7 @@ abort(no_transaction) end. prev(Tid,Ts,Tab,Key) - when atom(Tab), Tab /= schema -> + when is_atom(Tab), Tab /= schema -> case element(1, Tid) of ets -> ?ets_prev(Tab,Key); @@ -946,7 +946,7 @@ foldl(Fun, Acc, Tab) -> foldl(Fun, Acc, Tab, read). -foldl(Fun, Acc, Tab, LockKind) when function(Fun) -> +foldl(Fun, Acc, Tab, LockKind) when is_function(Fun) -> case get(mnesia_activity_state) of {?DEFAULT_ACCESS, Tid, Ts} -> foldl(Tid, Ts, Fun, Acc, Tab, LockKind); @@ -985,7 +985,7 @@ foldr(Fun, Acc, Tab) -> foldr(Fun, Acc, Tab, read). -foldr(Fun, Acc, Tab, LockKind) when function(Fun) -> +foldr(Fun, Acc, Tab, LockKind) when is_function(Fun) -> case get(mnesia_activity_state) of {?DEFAULT_ACCESS, Tid, Ts} -> foldr(Tid, Ts, Fun, Acc, Tab, LockKind); @@ -1096,7 +1096,7 @@ add_written_to_bag([{_, Val, delete_object} | Tail], Objs, Ack) -> add_written_to_bag(Tail, lists:delete(Val, Objs), lists:delete(Val, Ack)). -match_object(Pat) when tuple(Pat), size(Pat) > 2 -> +match_object(Pat) when is_tuple(Pat), tuple_size(Pat) > 2 -> Tab = element(1, Pat), match_object(Tab, Pat, read); match_object(Pat) -> @@ -1113,7 +1113,7 @@ end. match_object(Tid, Ts, Tab, Pat, LockKind) - when atom(Tab), Tab /= schema, tuple(Pat), size(Pat) > 2 -> + when is_atom(Tab), Tab /= schema, is_tuple(Pat), tuple_size(Pat) > 2 -> case element(1, Tid) of ets -> mnesia_lib:db_match_object(ram_copies, Tab, Pat); @@ -1263,7 +1263,7 @@ select(Tab, Pat) -> select(Tab, Pat, read). select(Tab, Pat, LockKind) - when atom(Tab), Tab /= schema, list(Pat) -> + when is_atom(Tab), Tab /= schema, is_list(Pat) -> case get(mnesia_activity_state) of {?DEFAULT_ACCESS, Tid, Ts} -> select(Tid, Ts, Tab, Pat, LockKind); @@ -1309,7 +1309,7 @@ select_lock(Tid,Ts,LockKind,Spec,Tab) -> %% Avoid table lock if possible case Spec of - [{HeadPat,_, _}] when tuple(HeadPat), size(HeadPat) > 2 -> + [{HeadPat,_, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 -> Key = element(2, HeadPat), case has_var(Key) of false -> lock_record(Tid, Ts, Tab, Key, LockKind); @@ -1321,7 +1321,7 @@ %% Breakable Select select(Tab, Pat, NObjects, LockKind) - when atom(Tab), Tab /= schema, list(Pat), number(NObjects) -> + when is_atom(Tab), Tab /= schema, is_list(Pat), is_integer(NObjects) -> case get(mnesia_activity_state) of {?DEFAULT_ACCESS, Tid, Ts} -> select(Tid, Ts, Tab, Pat, NObjects, LockKind); @@ -1430,7 +1430,7 @@ end. all_keys(Tid, Ts, Tab, LockKind) - when atom(Tab), Tab /= schema -> + when is_atom(Tab), Tab /= schema -> Pat0 = val({Tab, wild_pattern}), Pat = setelement(2, Pat0, '$1'), Keys = select(Tid, Ts, Tab, [{Pat, [], ['$1']}], LockKind), @@ -1443,7 +1443,7 @@ all_keys(_Tid, _Ts, Tab, _LockKind) -> abort({bad_type, Tab}). -index_match_object(Pat, Attr) when tuple(Pat), size(Pat) > 2 -> +index_match_object(Pat, Attr) when is_tuple(Pat), tuple_size(Pat) > 2 -> Tab = element(1, Pat), index_match_object(Tab, Pat, Attr, read); index_match_object(Pat, _Attr) -> @@ -1460,13 +1460,13 @@ end. index_match_object(Tid, Ts, Tab, Pat, Attr, LockKind) - when atom(Tab), Tab /= schema, tuple(Pat), size(Pat) > 2 -> + when is_atom(Tab), Tab /= schema, is_tuple(Pat), tuple_size(Pat) > 2 -> case element(1, Tid) of ets -> dirty_index_match_object(Tab, Pat, Attr); % Should be optimized? tid -> case mnesia_schema:attr_tab_to_pos(Tab, Attr) of - Pos when Pos =< size(Pat) -> + Pos when Pos =< tuple_size(Pat) -> case LockKind of read -> Store = Ts#tidstore.store, @@ -1496,7 +1496,7 @@ end. index_read(Tid, Ts, Tab, Key, Attr, LockKind) - when atom(Tab), Tab /= schema -> + when is_atom(Tab), Tab /= schema -> case element(1, Tid) of ets -> dirty_index_read(Tab, Key, Attr); % Should be optimized? @@ -1525,7 +1525,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Dirty access regardless of activities - updates -dirty_write(Val) when tuple(Val), size(Val) > 2 -> +dirty_write(Val) when is_tuple(Val), tuple_size(Val) > 2 -> Tab = element(1, Val), dirty_write(Tab, Val); dirty_write(Val) -> @@ -1535,10 +1535,10 @@ do_dirty_write(async_dirty, Tab, Val). do_dirty_write(SyncMode, Tab, Val) - when atom(Tab), Tab /= schema, tuple(Val), size(Val) > 2 -> + when is_atom(Tab), Tab /= schema, is_tuple(Val), tuple_size(Val) > 2 -> case ?catch_val({Tab, record_validation}) of {RecName, Arity, _Type} - when size(Val) == Arity, RecName == element(1, Val) -> + when tuple_size(Val) == Arity, RecName == element(1, Val) -> Oid = {Tab, element(2, Val)}, mnesia_tm:dirty(SyncMode, {Oid, Val, write}); {'EXIT', _} -> @@ -1557,13 +1557,13 @@ dirty_delete(Tab, Key) -> do_dirty_delete(async_dirty, Tab, Key). -do_dirty_delete(SyncMode, Tab, Key) when atom(Tab), Tab /= schema -> +do_dirty_delete(SyncMode, Tab, Key) when is_atom(Tab), Tab /= schema -> Oid = {Tab, Key}, mnesia_tm:dirty(SyncMode, {Oid, Oid, delete}); do_dirty_delete(_SyncMode, Tab, _Key) -> abort({bad_type, Tab}). -dirty_delete_object(Val) when tuple(Val), size(Val) > 2 -> +dirty_delete_object(Val) when is_tuple(Val), tuple_size(Val) > 2 -> Tab = element(1, Val), dirty_delete_object(Tab, Val); dirty_delete_object(Val) -> @@ -1573,7 +1573,7 @@ do_dirty_delete_object(async_dirty, Tab, Val). do_dirty_delete_object(SyncMode, Tab, Val) - when atom(Tab), Tab /= schema, tuple(Val), size(Val) > 2 -> + when is_atom(Tab), Tab /= schema, is_tuple(Val), tuple_size(Val) > 2 -> Oid = {Tab, element(2, Val)}, case has_var(Val) of false -> @@ -1596,7 +1596,7 @@ do_dirty_update_counter(async_dirty, Tab, Key, Incr). do_dirty_update_counter(SyncMode, Tab, Key, Incr) - when atom(Tab), Tab /= schema, integer(Incr) -> + when is_atom(Tab), Tab /= schema, is_integer(Incr) -> case ?catch_val({Tab, record_validation}) of {RecName, 3, set} -> Oid = {Tab, Key}, @@ -1616,7 +1616,7 @@ abort({bad_type, Oid}). dirty_read(Tab, Key) - when atom(Tab), Tab /= schema -> + when is_atom(Tab), Tab /= schema -> %% case catch ?ets_lookup(Tab, Key) of %% {'EXIT', _} -> %% Bad luck, we have to perform a real lookup @@ -1627,14 +1627,14 @@ dirty_read(Tab, _Key) -> abort({bad_type, Tab}). -dirty_match_object(Pat) when tuple(Pat), size(Pat) > 2 -> +dirty_match_object(Pat) when is_tuple(Pat), tuple_size(Pat) > 2 -> Tab = element(1, Pat), dirty_match_object(Tab, Pat); dirty_match_object(Pat) -> abort({bad_type, Pat}). dirty_match_object(Tab, Pat) - when atom(Tab), Tab /= schema, tuple(Pat), size(Pat) > 2 -> + when is_atom(Tab), Tab /= schema, is_tuple(Pat), tuple_size(Pat) > 2 -> dirty_rpc(Tab, ?MODULE, remote_dirty_match_object, [Tab, Pat]); dirty_match_object(Tab, Pat) -> abort({bad_type, Tab, Pat}). @@ -1649,7 +1649,7 @@ remote_dirty_match_object(Tab, Pat, PosList) end. -remote_dirty_match_object(Tab, Pat, [Pos | Tail]) when Pos =< size(Pat) -> +remote_dirty_match_object(Tab, Pat, [Pos | Tail]) when Pos =< tuple_size(Pat) -> IxKey = element(Pos, Pat), case has_var(IxKey) of false -> @@ -1662,14 +1662,14 @@ remote_dirty_match_object(Tab, Pat, _PosList) -> abort({bad_type, Tab, Pat}). -dirty_select(Tab, Spec) when atom(Tab), Tab /= schema, list(Spec) -> +dirty_select(Tab, Spec) when is_atom(Tab), Tab /= schema, is_list(Spec) -> dirty_rpc(Tab, ?MODULE, remote_dirty_select, [Tab, Spec]); dirty_select(Tab, Spec) -> abort({bad_type, Tab, Spec}). remote_dirty_select(Tab, Spec) -> case Spec of - [{HeadPat, _, _}] when tuple(HeadPat), size(HeadPat) > 2 -> + [{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 -> Key = element(2, HeadPat), case has_var(Key) of false -> @@ -1683,7 +1683,7 @@ end. remote_dirty_select(Tab, [{HeadPat,_, _}] = Spec, [Pos | Tail]) - when tuple(HeadPat), size(HeadPat) > 2, Pos =< size(HeadPat) -> + when is_tuple(HeadPat), tuple_size(HeadPat) > 2, Pos =< tuple_size(HeadPat) -> Key = element(Pos, HeadPat), case has_var(Key) of false -> @@ -1710,7 +1710,7 @@ dirty_sel_cont(#mnesia_select{node=Node,tab=Tab,storage=Type,cont=Cont,orig=Ms}) -> do_dirty_rpc(Tab,Node,mnesia_lib,db_select_cont,[Type,Cont,Ms]). -dirty_all_keys(Tab) when atom(Tab), Tab /= schema -> +dirty_all_keys(Tab) when is_atom(Tab), Tab /= schema -> case ?catch_val({Tab, wild_pattern}) of {'EXIT', _} -> abort({no_exists, Tab}); @@ -1725,16 +1725,16 @@ dirty_all_keys(Tab) -> abort({bad_type, Tab}). -dirty_index_match_object(Pat, Attr) when tuple(Pat), size(Pat) > 2 -> +dirty_index_match_object(Pat, Attr) when is_tuple(Pat), tuple_size(Pat) > 2 -> Tab = element(1, Pat), dirty_index_match_object(Tab, Pat, Attr); dirty_index_match_object(Pat, _Attr) -> abort({bad_type, Pat}). dirty_index_match_object(Tab, Pat, Attr) - when atom(Tab), Tab /= schema, tuple(Pat), size(Pat) > 2 -> + when is_atom(Tab), Tab /= schema, is_tuple(Pat), tuple_size(Pat) > 2 -> case mnesia_schema:attr_tab_to_pos(Tab, Attr) of - Pos when Pos =< size(Pat) -> + Pos when Pos =< tuple_size(Pat) -> case has_var(element(2, Pat)) of false -> dirty_match_object(Tab, Pat); @@ -1754,7 +1754,7 @@ dirty_index_match_object(Tab, Pat, _Attr) -> abort({bad_type, Tab, Pat}). -dirty_index_read(Tab, Key, Attr) when atom(Tab), Tab /= schema -> +dirty_index_read(Tab, Key, Attr) when is_atom(Tab), Tab /= schema -> Pos = mnesia_schema:attr_tab_to_pos(Tab, Attr), case has_var(Key) of false -> @@ -1765,27 +1765,27 @@ dirty_index_read(Tab, _Key, _Attr) -> abort({bad_type, Tab}). -dirty_slot(Tab, Slot) when atom(Tab), Tab /= schema, integer(Slot) -> +dirty_slot(Tab, Slot) when is_atom(Tab), Tab /= schema, is_integer(Slot) -> dirty_rpc(Tab, mnesia_lib, db_slot, [Tab, Slot]); dirty_slot(Tab, Slot) -> abort({bad_type, Tab, Slot}). -dirty_first(Tab) when atom(Tab), Tab /= schema -> +dirty_first(Tab) when is_atom(Tab), Tab /= schema -> dirty_rpc(Tab, mnesia_lib, db_first, [Tab]); dirty_first(Tab) -> abort({bad_type, Tab}). -dirty_last(Tab) when atom(Tab), Tab /= schema -> +dirty_last(Tab) when is_atom(Tab), Tab /= schema -> dirty_rpc(Tab, mnesia_lib, db_last, [Tab]); dirty_last(Tab) -> abort({bad_type, Tab}). -dirty_next(Tab, Key) when atom(Tab), Tab /= schema -> +dirty_next(Tab, Key) when is_atom(Tab), Tab /= schema -> dirty_rpc(Tab, mnesia_lib, db_next_key, [Tab, Key]); dirty_next(Tab, _Key) -> abort({bad_type, Tab}). -dirty_prev(Tab, Key) when atom(Tab), Tab /= schema -> +dirty_prev(Tab, Key) when is_atom(Tab), Tab /= schema -> dirty_rpc(Tab, mnesia_lib, db_prev_key, [Tab, Key]); dirty_prev(Tab, _Key) -> abort({bad_type, Tab}). @@ -1809,7 +1809,7 @@ mnesia:abort({ErrorTag, Args}); NewNode -> case get(mnesia_activity_state) of - {_Mod, Tid, _Ts} when record(Tid, tid) -> + {_Mod, Tid, _Ts} when is_record(Tid, tid) -> %% In order to perform a consistent %% retry of a transaction we need %% to acquire the lock on the NewNode. @@ -1851,14 +1851,14 @@ any_table_info(Tab, Item). -any_table_info(Tab, Item) when atom(Tab) -> +any_table_info(Tab, Item) when is_atom(Tab) -> case Item of master_nodes -> mnesia_recover:get_master_nodes(Tab); % checkpoints -> % case ?catch_val({Tab, commit_work}) of % [{checkpoints, List} | _] -> List; -% No_chk when list(No_chk) -> []; +% No_chk when is_list(No_chk) -> []; % Else -> info_reply(Else, Tab, Item) % end; size -> @@ -2066,7 +2066,7 @@ DiscNs = ?catch_val({schema, disc_copies}), RamNs = ?catch_val({schema, ram_copies}), if - list(DiscNs), list(RamNs) -> + is_list(DiscNs), is_list(RamNs) -> DiscNs ++ RamNs; true -> case mnesia_schema:read_nodes() of @@ -2349,7 +2349,7 @@ create_table(Arg) -> mnesia_schema:create_table(Arg). -create_table(Name, Arg) when list(Arg) -> +create_table(Name, Arg) when is_list(Arg) -> mnesia_schema:create_table([{name, Name}| Arg]); create_table(Name, Arg) -> {aborted, badarg, Name, Arg}. @@ -2452,7 +2452,7 @@ change_table_load_order(T, O) -> mnesia_schema:change_table_load_order(T, O). -set_master_nodes(Nodes) when list(Nodes) -> +set_master_nodes(Nodes) when is_list(Nodes) -> UseDir = system_info(use_dir), IsRunning = system_info(is_running), case IsRunning of @@ -2490,7 +2490,7 @@ Args = lists:map(Fun, Cstructs), mnesia_recover:log_master_nodes(Args, UseDir, IsRunning). -set_master_nodes(Tab, Nodes) when list(Nodes) -> +set_master_nodes(Tab, Nodes) when is_list(Nodes) -> UseDir = system_info(use_dir), IsRunning = system_info(is_running), case IsRunning of @@ -2562,7 +2562,7 @@ snmp_close_table(Tab) -> mnesia_schema:del_snmp(Tab). -snmp_get_row(Tab, RowIndex) when atom(Tab), Tab /= schema, is_list(RowIndex) -> +snmp_get_row(Tab, RowIndex) when is_atom(Tab), Tab /= schema, is_list(RowIndex) -> case get(mnesia_activity_state) of {Mod, Tid, Ts=#tidstore{store=Store}} when element(1, Tid) =:= tid -> case snmp_oid_to_mnesia_key(RowIndex, Tab) of @@ -2598,7 +2598,7 @@ %%%%%%%%%%%%% -snmp_get_next_index(Tab, RowIndex) when atom(Tab), Tab /= schema, is_list(RowIndex) -> +snmp_get_next_index(Tab, RowIndex) when is_atom(Tab), Tab /= schema, is_list(RowIndex) -> {Next,OrigKey} = dirty_rpc(Tab, mnesia_snmp_hook, get_next_index, [Tab, RowIndex]), case get(mnesia_activity_state) of {_Mod, Tid, #tidstore{store=Store}} when element(1, Tid) =:= tid -> diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_event.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_event.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_event.erl 2009-03-12 12:27:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_event.erl 2009-09-18 15:12:20.000000000 +0100 @@ -226,9 +226,9 @@ UseDir = mnesia_monitor:use_dir(), CoreDir = mnesia_monitor:get_env(core_dir), if - list(CoreDir),CoreDumped == false,binary(BinaryCore) -> + is_list(CoreDir),CoreDumped == false, is_binary(BinaryCore) -> core_file(CoreDir,BinaryCore,Format,Args); - (UseDir == true),CoreDumped == false,binary(BinaryCore) -> + (UseDir == true),CoreDumped == false, is_binary(BinaryCore) -> core_file(CoreDir,BinaryCore,Format,Args); true -> report_error("(ignoring core) ** FATAL ** " ++ Format, Args) @@ -241,7 +241,7 @@ (I) -> ["_",I] end, List = lists:append([Fun(I) || I <- Integers]), - CoreFile = if list(CoreDir) -> + CoreFile = if is_list(CoreDir) -> filename:absname(lists:concat(["MnesiaCore.", node()] ++ List), CoreDir); true -> diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_frag.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_frag.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_frag.erl 2009-03-12 12:28:40.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_frag.erl 2009-09-18 15:12:28.000000000 +0100 @@ -1240,7 +1240,7 @@ %% Returns name of fragment table n_to_frag_name(Tab, 1) -> Tab; -n_to_frag_name(Tab, N) when atom(Tab), integer(N) -> +n_to_frag_name(Tab, N) when is_atom(Tab), is_integer(N) -> list_to_atom(atom_to_list(Tab) ++ "_frag" ++ integer_to_list(N)); n_to_frag_name(Tab, N) -> mnesia:abort({bad_type, Tab, N}). diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_frag_hash.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_frag_hash.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_frag_hash.erl 2009-03-12 12:31:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_frag_hash.erl 2009-09-18 15:12:58.000000000 +0100 @@ -127,7 +127,7 @@ match_spec_to_frag_numbers(#hash_state{n_fragments = N} = State, MatchSpec) -> case MatchSpec of - [{HeadPat, _, _}] when tuple(HeadPat), size(HeadPat) > 2 -> + [{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 -> KeyPat = element(2, HeadPat), case has_var(KeyPat) of false -> diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_frag_old_hash.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_frag_old_hash.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_frag_old_hash.erl 2009-03-12 12:31:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_frag_old_hash.erl 2009-09-18 15:12:59.000000000 +0100 @@ -54,7 +54,7 @@ #old_hash_state{n_fragments = 1, next_n_to_split = 1, n_doubles = 0}; -init_state(_Tab, FH) when record(FH, frag_hash) -> +init_state(_Tab, FH) when is_record(FH, frag_hash) -> %% Old style. Kept for backwards compatibility. #old_hash_state{n_fragments = FH#frag_hash.n_fragments, next_n_to_split = FH#frag_hash.next_n_to_split, @@ -62,7 +62,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -add_frag(State) when record(State, old_hash_state) -> +add_frag(State) when is_record(State, old_hash_state) -> SplitN = State#old_hash_state.next_n_to_split, P = SplitN + 1, L = State#old_hash_state.n_doubles, @@ -80,7 +80,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -del_frag(State) when record(State, old_hash_state) -> +del_frag(State) when is_record(State, old_hash_state) -> P = State#old_hash_state.next_n_to_split - 1, L = State#old_hash_state.n_doubles, N = State#old_hash_state.n_fragments, @@ -101,7 +101,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -key_to_frag_number(State, Key) when record(State, old_hash_state) -> +key_to_frag_number(State, Key) when is_record(State, old_hash_state) -> L = State#old_hash_state.n_doubles, A = erlang:hash(Key, trunc(math:pow(2, L))), P = State#old_hash_state.next_n_to_split, @@ -114,9 +114,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -match_spec_to_frag_numbers(State, MatchSpec) when record(State, old_hash_state) -> +match_spec_to_frag_numbers(State, MatchSpec) when is_record(State, old_hash_state) -> case MatchSpec of - [{HeadPat, _, _}] when tuple(HeadPat), size(HeadPat) > 2 -> + [{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 -> KeyPat = element(2, HeadPat), case has_var(KeyPat) of false -> diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_index.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_index.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_index.erl 2009-03-12 12:27:29.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_index.erl 2009-09-18 15:12:03.000000000 +0100 @@ -252,7 +252,7 @@ %% assuming that the file exists. init_disc_index(_Tab, []) -> done; -init_disc_index(Tab, [Pos | Tail]) when integer(Pos) -> +init_disc_index(Tab, [Pos | Tail]) when is_integer(Pos) -> Fn = tab2filename(Tab, Pos), IxTag = {Tab, index, Pos}, file:delete(Fn), @@ -299,7 +299,7 @@ add_ram_index(Tab, Pos), make_ram_index(Tab, Tail). -add_ram_index(Tab, Pos) when integer(Pos) -> +add_ram_index(Tab, Pos) when is_integer(Pos) -> verbose("Creating index for ~w ~n", [Tab]), Index = mnesia_monitor:mktab(mnesia_index, [bag, public]), Insert = fun(Rec, _Acc) -> diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_loader.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_loader.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_loader.erl 2009-03-12 12:28:48.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_loader.erl 2009-09-18 15:12:28.000000000 +0100 @@ -396,7 +396,7 @@ finish_copy(Storage,Tab,Cs,SenderPid,DatBin,OrigTabRec); %% Protocol conversion hack - {SenderPid, {no_more, DatBin}} when pid(PConv) -> + {SenderPid, {no_more, DatBin}} when is_pid(PConv) -> PConv ! {SenderPid, no_more}, receive {old_init_table_complete, ok} -> @@ -410,7 +410,7 @@ {actual_tabrec, Pid} -> tab_receiver(Node, Tab, Storage, Cs, Pid,OrigTabRec); - {SenderPid, {more, [Recs]}} when pid(PConv) -> + {SenderPid, {more, [Recs]}} when is_pid(PConv) -> PConv ! {SenderPid, {more, Recs}}, %% Forward Msg to OldNodes tab_receiver(Node, Tab, Storage, Cs, PConv,OrigTabRec); @@ -737,7 +737,7 @@ receive {NewPid, more} -> case send_packet(N - 1, NewPid, Chunk, DataState, OldNode) of - New when integer(New) -> + New when is_integer(New) -> New - 1; NewData -> send_more(NewPid, ?MAX_NOPACKETS, Chunk, NewData, Tab, OldNode) diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_locker.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_locker.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_locker.erl 2009-06-05 13:54:52.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_locker.erl 2009-09-18 15:12:04.000000000 +0100 @@ -192,27 +192,17 @@ loop(State); {From, {ix_read, Tid, Tab, IxKey, Pos}} -> - case catch mnesia_index:get_index_table(Tab, Pos) of - {'EXIT', _} -> - reply(From, {not_granted, {no_exists, Tab, {index, [Pos]}}}), + case ?ets_lookup(mnesia_sticky_locks, Tab) of + [] -> + set_read_lock_on_all_keys(Tid,From,Tab,IxKey,Pos), loop(State); - Index -> - Rk = mnesia_lib:elems(2,mnesia_index:db_get(Index, IxKey)), - %% list of real keys - case ?ets_lookup(mnesia_sticky_locks, Tab) of - [] -> - set_read_lock_on_all_keys(Tid, From,Tab,Rk,Rk, - []), - loop(State); - [{_,N}] when N == node() -> - set_read_lock_on_all_keys(Tid, From,Tab,Rk,Rk, - []), - loop(State); - [{_,N}] -> - Req = {From, {ix_read, Tid, Tab, IxKey, Pos}}, - From ! {?MODULE, node(), {switch, N, Req}}, - loop(State) - end + [{_,N}] when N == node() -> + set_read_lock_on_all_keys(Tid,From,Tab,IxKey,Pos), + loop(State); + [{_,N}] -> + Req = {From, {ix_read, Tid, Tab, IxKey, Pos}}, + From ! {?MODULE, node(), {switch, N, Req}}, + loop(State) end; {From, {sync_release_tid, Tid}} -> @@ -284,25 +274,33 @@ ?ets_insert(mnesia_tid_locks, {Tid, Oid, {queued, Op}}) end. -grant_lock(Tid, read, Lock, {Tab, Key}) +grant_lock(Tid, read, Lock, Oid = {Tab, Key}) when Key /= ?ALL, Tab /= ?GLOBAL -> case node(Tid#tid.pid) == node() of true -> - set_lock(Tid, {Tab, Key}, Lock), + set_lock(Tid, Oid, Lock), {granted, lookup_in_client}; false -> - case catch mnesia_lib:db_get(Tab, Key) of %% lookup as well - {'EXIT', _Reason} -> + try + Val = mnesia_lib:db_get(Tab, Key), %% lookup as well + set_lock(Tid, Oid, Lock), + {granted, Val} + catch _:_Reason -> %% Table has been deleted from this node, %% restart the transaction. - C = #cyclic{op = read, lock = Lock, oid = {Tab, Key}, + C = #cyclic{op = read, lock = Lock, oid = Oid, lucky = nowhere}, - {not_granted, C}; - Val -> - set_lock(Tid, {Tab, Key}, Lock), - {granted, Val} + {not_granted, C} end end; +grant_lock(Tid, {ix_read,IxKey,Pos}, Lock, Oid = {Tab, _}) -> + try + Res = ix_read_res(Tab, IxKey,Pos), + set_lock(Tid, Oid, Lock), + {granted, Res, [?ALL]} + catch _:_ -> + {not_granted, {no_exists, Tab, {index, [Pos]}}} + end; grant_lock(Tid, read, Lock, Oid) -> set_lock(Tid, Oid, Lock), {granted, ok}; @@ -450,35 +448,27 @@ [#queue{tid=Max}|_] = sort_queue(L), Max. -%% We can't queue the ixlock requests since it -%% becomes to complivated for little me :-) -%% If we encounter an object with a wlock we reject the -%% entire lock request -%% -%% BUGBUG: this is actually a bug since we may starve - -set_read_lock_on_all_keys(Tid, From, Tab, [RealKey | Tail], Orig, Ack) -> - Oid = {Tab, RealKey}, - case can_lock(Tid, read, Oid, {no, bad_luck}) of +set_read_lock_on_all_keys(Tid, From, Tab, IxKey, Pos) -> + Oid = {Tab,?ALL}, + Op = {ix_read,IxKey, Pos}, + Lock = read, + case can_lock(Tid, Lock, Oid, {no, bad_luck}) of yes -> - {granted, Val} = grant_lock(Tid, read, read, Oid), - case opt_lookup_in_client(Val, Oid, read) of % Ought to be invoked - C = #cyclic{} -> % in the client - reply(From, {not_granted, C}); - Val2 -> - Ack2 = lists:append(Val2, Ack), - set_read_lock_on_all_keys(Tid, From, Tab, Tail, Orig, Ack2) - end; + Reply = grant_lock(Tid, Op, Lock, Oid), + reply(From, Reply); {no, Lucky} -> - C = #cyclic{op = read, lock = read, oid = Oid, lucky = Lucky}, + C = #cyclic{op = Op, lock = Lock, oid = Oid, lucky = Lucky}, + ?dbg("Rejected ~p ~p ~p ~p ~n", [Tid, Oid, Lock, Lucky]), reply(From, {not_granted, C}); - {queue, Lucky} -> - C = #cyclic{op = read, lock = read, oid = Oid, lucky = Lucky}, - reply(From, {not_granted, C}) - end; -set_read_lock_on_all_keys(_Tid, From, _Tab, [], Orig, Ack) -> - reply(From, {granted, Ack, Orig}). - + {queue, Lucky} -> + ?dbg("Queued ~p ~p ~p ~p ~n", [Tid, Oid, Lock, Lucky]), + %% Append to queue: Nice place for trace output + ?ets_insert(mnesia_lock_queue, + #queue{oid = Oid, tid = Tid, op = Op, + pid = From, lucky = Lucky}), + ?ets_insert(mnesia_tid_locks, {Tid, Oid, {queued, Op}}) + end. + %%%%%%%%%%%%%%%%%%%%%%%%%%% %% Release of locks @@ -592,6 +582,8 @@ try_waiter({queue, Oid, Tid, read_write, ReplyTo, _}) -> try_waiter(Oid, read_write, read, write, ReplyTo, Tid); +try_waiter({queue, Oid, Tid, IXR = {ix_read,_,_}, ReplyTo, _}) -> + try_waiter(Oid, IXR, IXR, read, ReplyTo, Tid); try_waiter({queue, Oid, Tid, Op, ReplyTo, _}) -> try_waiter(Oid, Op, Op, Op, ReplyTo, Tid). @@ -603,7 +595,7 @@ #queue{oid=Oid, tid = Tid, op = Op, pid = ReplyTo, lucky = '_'}), Reply = grant_lock(Tid, SimpleOp, Lock, Oid), - ReplyTo ! {?MODULE, node(), Reply}, + reply(ReplyTo,Reply), locked; {queue, _Why} -> ?dbg("Keep ~p ~p ~p ~p~n", [Tid, Oid, Lock, _Why]), @@ -616,7 +608,7 @@ #queue{oid=Oid, tid = Tid, op = Op, pid = ReplyTo, lucky = '_'}), Reply = {not_granted, C}, - ReplyTo ! {?MODULE, node(), Reply}, + reply(ReplyTo,Reply), removed end. @@ -629,6 +621,10 @@ key_delete_all(_, _, [], Ack) -> lists:reverse(Ack). +ix_read_res(Tab,IxKey,Pos) -> + Index = mnesia_index:get_index_table(Tab, Pos), + Rks = mnesia_lib:elems(2,mnesia_index:db_get(Index, IxKey)), + lists:append(lists:map(fun(Real) -> mnesia_lib:db_get(Tab, Real) end, Rks)). %% ********************* end server code ******************** %% The following code executes at the client side of a transactions @@ -1025,11 +1021,13 @@ ?ets_insert(Store, {nodes, Node}), return_granted_or_nodes(Oid, [Node]); rlock_get_reply(Node, Store, Tab, {granted, V, RealKeys}) -> + %% Kept for backwards compatibility, keep until no old nodes + %% are available L = fun(K) -> ?ets_insert(Store, {{locks, Tab, K}, read}) end, lists:foreach(L, RealKeys), ?ets_insert(Store, {nodes, Node}), V; -rlock_get_reply(_Node, _Store, _Oid, {not_granted , Reason}) -> +rlock_get_reply(_Node, _Store, _Oid, {not_granted, Reason}) -> exit({aborted, Reason}); rlock_get_reply(_Node, Store, Oid, {switch, N2, Req}) -> @@ -1045,8 +1043,17 @@ nowhere -> mnesia:abort({no_exists, Tab}); Node -> - R = l_request(Node, {ix_read, Tid, Tab, IxKey, Pos}, Store), - rlock_get_reply(Node, Store, Tab, R) + %%% Old code + %% R = l_request(Node, {ix_read, Tid, Tab, IxKey, Pos}, Store), + %% rlock_get_reply(Node, Store, Tab, R) + + case need_lock(Store, Tab, ?ALL, read) of + no when Node =:= node() -> + ix_read_res(Tab,IxKey,Pos); + _ -> %% yes or need to get the result from other node + R = l_request(Node, {ix_read, Tid, Tab, IxKey, Pos}, Store), + rlock_get_reply(Node, Store, Tab, R) + end end. %% Grabs the locks or exits diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_log.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_log.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_log.erl 2009-03-12 12:27:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_log.erl 2009-09-18 15:12:04.000000000 +0100 @@ -209,13 +209,13 @@ dcl_version() -> "1.0". dcd_version() -> "1.0". -append(Log, Bin) when binary(Bin) -> +append(Log, Bin) when is_binary(Bin) -> disk_log:balog(Log, Bin); append(Log, Term) -> disk_log:alog(Log, Term). %% Synced append -sappend(Log, Bin) when binary(Bin) -> +sappend(Log, Bin) when is_binary(Bin) -> ok = disk_log:blog(Log, Bin); sappend(Log, Term) -> ok = disk_log:log(Log, Term). @@ -229,7 +229,7 @@ case mnesia_monitor:use_dir() of true -> if - record(C, commit) -> + is_record(C, commit) -> C2 = C#commit{ram_copies = [], snmp = []}, append(latest_log, C2); true -> @@ -252,7 +252,7 @@ case mnesia_monitor:use_dir() of true -> if - record(C, commit) -> + is_record(C, commit) -> C2 = C#commit{ram_copies = [], snmp = []}, sappend(latest_log, C2); true -> @@ -601,9 +601,9 @@ backup(Opaque) -> backup(Opaque, []). -backup(Opaque, Mod) when atom(Mod) -> +backup(Opaque, Mod) when is_atom(Mod) -> backup(Opaque, [{module, Mod}]); -backup(Opaque, Args) when list(Args) -> +backup(Opaque, Args) when is_list(Args) -> %% Backup all tables with max redundancy CpArgs = [{ram_overrides_dump, false}, {max, val({schema, tables})}], case mnesia_checkpoint:activate(CpArgs) of @@ -618,9 +618,9 @@ backup_checkpoint(Name, Opaque) -> backup_checkpoint(Name, Opaque, []). -backup_checkpoint(Name, Opaque, Mod) when atom(Mod) -> +backup_checkpoint(Name, Opaque, Mod) when is_atom(Mod) -> backup_checkpoint(Name, Opaque, [{module, Mod}]); -backup_checkpoint(Name, Opaque, Args) when list(Args) -> +backup_checkpoint(Name, Opaque, Args) when is_list(Args) -> DefaultMod = mnesia_monitor:get_env(backup_module), B = #backup_args{name = Name, module = DefaultMod, @@ -664,7 +664,7 @@ B#backup_args{module = Mod2}; {incremental, Name} -> B#backup_args{prev_name = Name}; - {tables, Tabs} when list(Tabs) -> + {tables, Tabs} when is_list(Tabs) -> B#backup_args{tables = Tabs} end. @@ -700,7 +700,7 @@ Tabs = case B#backup_args.tables of all -> AllTabs; - SomeTabs when list(SomeTabs) -> SomeTabs + SomeTabs when is_list(SomeTabs) -> SomeTabs end, case B#backup_args.scope of global -> @@ -767,7 +767,7 @@ abort_write(B, {?MODULE, backup_tab}, [Tab, B], {error, Reason}) end. -tab_copier(Pid, B, Tab) when record(B, backup_args) -> +tab_copier(Pid, B, Tab) when is_record(B, backup_args) -> %% Intentional crash at exit Name = B#backup_args.name, PrevName = B#backup_args.prev_name, @@ -889,7 +889,7 @@ rec_filter(B, schema, _RecName, Recs) -> case catch mnesia_bup:refresh_cookie(Recs, B#backup_args.cookie) of - Recs2 when list(Recs2) -> + Recs2 when is_list(Recs2) -> Recs2; {error, _Reason} -> %% No schema table cookie @@ -955,7 +955,7 @@ end. insert_dcdchunk({Cont, [LogH | Rest]}, Log, Tab) - when record(LogH, log_header), + when is_record(LogH, log_header), LogH#log_header.log_kind == dcd_log, LogH#log_header.log_version >= "1.0" -> insert_dcdchunk({Cont, Rest}, Log, Tab); @@ -1003,7 +1003,7 @@ add_recs([{{Tab, Key}, Val, update_counter} | Rest], N) -> {RecName, Incr} = Val, case catch ets:update_counter(Tab, Key, Incr) of - CounterVal when integer(CounterVal) -> + CounterVal when is_integer(CounterVal) -> ok; _ when Incr < 0 -> Zero = {RecName, Key, 0}, @@ -1014,7 +1014,7 @@ end, add_recs(Rest, N+1); add_recs([LogH|Rest], N) - when record(LogH, log_header), + when is_record(LogH, log_header), LogH#log_header.log_kind == dcl_log, LogH#log_header.log_version >= "1.0" -> add_recs(Rest, N); diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_recover.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_recover.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_recover.erl 2009-03-12 12:28:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_recover.erl 2009-09-18 15:12:22.000000000 +0100 @@ -193,7 +193,7 @@ note_master_nodes(Tab, []) -> ?ets_delete(mnesia_decision, Tab); -note_master_nodes(Tab, Nodes) when list(Nodes) -> +note_master_nodes(Tab, Nodes) when is_list(Nodes) -> Master = {master_nodes, Tab, Nodes}, ?ets_insert(mnesia_decision, Master). @@ -509,7 +509,7 @@ note_log_decision(NewD, InitBy) when NewD#decision.outcome == pre_commit -> note_log_decision(NewD#decision{outcome = unclear}, InitBy); -note_log_decision(NewD, _InitBy) when record(NewD, decision) -> +note_log_decision(NewD, _InitBy) when is_record(NewD, decision) -> Tid = NewD#decision.tid, sync_trans_tid_serial(Tid), note_outcome(NewD); @@ -557,7 +557,7 @@ incr_trans_tid_serial() -> ?ets_update_counter(mnesia_decision, serial, 1). -sync_trans_tid_serial(ThatCounter) when integer(ThatCounter) -> +sync_trans_tid_serial(ThatCounter) when is_integer(ThatCounter) -> ThisCounter = trans_tid_serial(), if ThatCounter > ThisCounter -> @@ -795,7 +795,7 @@ Decision = case decision(Tid) of no_decision -> OtherD; - MyD when record(MyD, decision) -> MyD + MyD when is_record(MyD, decision) -> MyD end, announce([Node], [Decision], [], true), {noreply, State}; @@ -841,7 +841,7 @@ handle_info(check_overload, S) -> %% Time to check if mnesia_tm is overloaded case whereis(mnesia_tm) of - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> Threshold = 100, Prev = S#state.tm_queue_len, @@ -956,9 +956,9 @@ decision(Tid, [Tab | Tabs]) -> case catch ?ets_lookup(Tab, Tid) of - [D] when record(D, decision) -> + [D] when is_record(D, decision) -> D; - [C] when record(C, transient_decision) -> + [C] when is_record(C, transient_decision) -> #decision{tid = C#transient_decision.tid, outcome = C#transient_decision.outcome, disc_nodes = [], @@ -1009,7 +1009,7 @@ NewD#decision{disc_nodes = []}; D == no_decision -> NewD; - record(D, decision) -> + is_record(D, decision) -> DiscNs = D#decision.disc_nodes -- ([node(), Node]), OldD = filter_aborted(D#decision{disc_nodes = DiscNs}), %% mnesia_lib:dbg_out("merge ~w: NewD = ~w~n D = ~w~n OldD = ~w~n", @@ -1059,12 +1059,12 @@ end end. -add_remote_decisions(Node, [D | Tail], State) when record(D, decision) -> +add_remote_decisions(Node, [D | Tail], State) when is_record(D, decision) -> State2 = add_remote_decision(Node, D, State), add_remote_decisions(Node, Tail, State2); add_remote_decisions(Node, [C | Tail], State) - when record(C, transient_decision) -> + when is_record(C, transient_decision) -> D = #decision{tid = C#transient_decision.tid, outcome = C#transient_decision.outcome, disc_nodes = [], @@ -1166,7 +1166,7 @@ send_decisions([]) -> ok. -arrange([To | ToNodes], D, Acc, ForceSend) when record(D, decision) -> +arrange([To | ToNodes], D, Acc, ForceSend) when is_record(D, decision) -> NeedsAdd = (ForceSend or lists:member(To, D#decision.disc_nodes) or lists:member(To, D#decision.ram_nodes)), diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_schema.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_schema.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_schema.erl 2009-03-12 12:27:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_schema.erl 2009-09-18 15:12:05.000000000 +0100 @@ -312,7 +312,7 @@ %% Delete the Mnesia directory on all given nodes %% Requires that Mnesia is not running anywhere %% Returns ok | {error,Reason} -delete_schema(Ns) when list(Ns), Ns /= [] -> +delete_schema(Ns) when is_list(Ns), Ns /= [] -> RunningNs = mnesia_lib:running_nodes(Ns), Reason = "Cannot delete schema on all nodes", if @@ -356,7 +356,7 @@ {error, Reason} end. -ensure_no_schema([H|T]) when atom(H) -> +ensure_no_schema([H|T]) when is_atom(H) -> case rpc:call(H, ?MODULE, remote_read_schema, []) of {badrpc, Reason} -> {H, {"All nodes not running", H, Reason}}; @@ -562,7 +562,7 @@ get_tid_ts_and_lock(Tab, Intent) -> TidTs = get(mnesia_activity_state), case TidTs of - {_Mod, Tid, Ts} when record(Ts, tidstore)-> + {_Mod, Tid, Ts} when is_record(Ts, tidstore)-> Store = Ts#tidstore.store, case Intent of read -> mnesia_locker:rlock_table(Tid, Store, Tab); @@ -595,7 +595,7 @@ Client ! {transaction_done, Res, self()}, unlink(Client); -schema_coordinator(Client, Fun, Controller) when pid(Controller) -> +schema_coordinator(Client, Fun, Controller) when is_pid(Controller) -> %% Do not trap exit in order to automatically die %% when the controller dies @@ -622,10 +622,10 @@ do_insert_schema_ops(_Store, []) -> ok. -cs2list(Cs) when record(Cs, cstruct) -> +cs2list(Cs) when is_record(Cs, cstruct) -> Tags = record_info(fields, cstruct), rec2list(Tags, 2, Cs); -cs2list(CreateList) when list(CreateList) -> +cs2list(CreateList) when is_list(CreateList) -> CreateList. rec2list([Tag | Tags], Pos, Rec) -> @@ -634,7 +634,7 @@ rec2list([], _Pos, _Rec) -> []. -list2cs(List) when list(List) -> +list2cs(List) when is_list(List) -> Name = pick(unknown, name, List, must), Type = pick(Name, type, List, set), Rc0 = pick(Name, ram_copies, List, []), @@ -698,15 +698,15 @@ end. %% Convert attribute name to integer if neccessary -attr_tab_to_pos(_Tab, Pos) when integer(Pos) -> +attr_tab_to_pos(_Tab, Pos) when is_integer(Pos) -> Pos; attr_tab_to_pos(Tab, Attr) -> attr_to_pos(Attr, val({Tab, attributes})). %% Convert attribute name to integer if neccessary -attr_to_pos(Pos, _Attrs) when integer(Pos) -> +attr_to_pos(Pos, _Attrs) when is_integer(Pos) -> Pos; -attr_to_pos(Attr, Attrs) when atom(Attr) -> +attr_to_pos(Attr, Attrs) when is_atom(Attr) -> attr_to_pos(Attr, Attrs, 2); attr_to_pos(Attr, _) -> mnesia:abort({bad_type, Attr}). @@ -743,7 +743,7 @@ false. %% This is the only place where we check the validity of data -verify_cstruct(Cs) when record(Cs, cstruct) -> +verify_cstruct(Cs) when is_record(Cs, cstruct) -> verify_nodes(Cs), Tab = Cs#cstruct.name, @@ -791,7 +791,7 @@ fun(Pos) -> verify(true, fun() -> if - integer(Pos), + is_integer(Pos), Pos > 2, Pos =< Arity -> true; @@ -813,22 +813,22 @@ verify(true, mnesia_snmp_hook:check_ustruct(Snmp), {badarg, Tab, {snmp, Snmp}}), - CheckProp = fun(Prop) when tuple(Prop), size(Prop) >= 1 -> ok; + CheckProp = fun(Prop) when is_tuple(Prop), size(Prop) >= 1 -> ok; (Prop) -> mnesia:abort({bad_type, Tab, {user_properties, [Prop]}}) end, lists:foreach(CheckProp, Cs#cstruct.user_properties), case Cs#cstruct.cookie of {{MegaSecs, Secs, MicroSecs}, _Node} - when integer(MegaSecs), integer(Secs), - integer(MicroSecs), atom(node) -> + when is_integer(MegaSecs), is_integer(Secs), + is_integer(MicroSecs), is_atom(node) -> ok; Cookie -> mnesia:abort({bad_type, Tab, {cookie, Cookie}}) end, case Cs#cstruct.version of {{Major, Minor}, _Detail} - when integer(Major), integer(Minor) -> + when is_integer(Major), is_integer(Minor) -> ok; Version -> mnesia:abort({bad_type, Tab, {version, Version}}) @@ -864,7 +864,7 @@ AtomCheck = fun(N) -> verify(atom, mnesia_lib:etype(N), {bad_type, Tab, N}) end, lists:foreach(AtomCheck, Nodes). -verify(Expected, Fun, Error) when function(Fun) -> +verify(Expected, Fun, Error) when is_function(Fun) -> do_verify(Expected, catch Fun(), Error); verify(Expected, Actual, Error) -> do_verify(Expected, Actual, Error). @@ -1090,7 +1090,7 @@ change_table_frag(Tab, Change) -> schema_transaction(fun() -> do_change_table_frag(Tab, Change) end). -do_change_table_frag(Tab, Change) when atom(Tab), Tab /= schema -> +do_change_table_frag(Tab, Change) when is_atom(Tab), Tab /= schema -> TidTs = get_tid_ts_and_lock(schema, write), Ops = mnesia_frag:change_table_frag(Tab, Change), [insert_schema_ops(TidTs, Op) || Op <- Ops], @@ -1122,7 +1122,7 @@ add_table_copy(Tab, Node, Storage) -> schema_transaction(fun() -> do_add_table_copy(Tab, Node, Storage) end). -do_add_table_copy(Tab, Node, Storage) when atom(Tab), atom(Node) -> +do_add_table_copy(Tab, Node, Storage) when is_atom(Tab), is_atom(Node) -> TidTs = get_tid_ts_and_lock(schema, write), insert_schema_ops(TidTs, make_add_table_copy(Tab, Node, Storage)); do_add_table_copy(Tab,Node,_) -> @@ -1160,7 +1160,7 @@ del_table_copy(Tab, Node) -> schema_transaction(fun() -> do_del_table_copy(Tab, Node) end). -do_del_table_copy(Tab, Node) when atom(Node) -> +do_del_table_copy(Tab, Node) when is_atom(Node) -> TidTs = get_tid_ts_and_lock(schema, write), %% get_tid_ts_and_lock(Tab, write), insert_schema_ops(TidTs, make_del_table_copy(Tab, Node)); @@ -1244,7 +1244,7 @@ do_move_table(schema, _FromNode, _ToNode) -> mnesia:abort({bad_type, schema}); -do_move_table(Tab, FromNode, ToNode) when atom(FromNode), atom(ToNode) -> +do_move_table(Tab, FromNode, ToNode) when is_atom(FromNode), is_atom(ToNode) -> TidTs = get_tid_ts_and_lock(schema, write), insert_schema_ops(TidTs, make_move_table(Tab, FromNode, ToNode)); do_move_table(Tab, FromNode, ToNode) -> @@ -1278,7 +1278,7 @@ change_table_copy_type(Tab, Node, ToS) -> schema_transaction(fun() -> do_change_table_copy_type(Tab, Node, ToS) end). -do_change_table_copy_type(Tab, Node, ToS) when atom(Node) -> +do_change_table_copy_type(Tab, Node, ToS) when is_atom(Node) -> TidTs = get_tid_ts_and_lock(schema, write), get_tid_ts_and_lock(Tab, write), % ensure global sync %% get_tid_ts_and_lock(Tab, read), @@ -1400,11 +1400,11 @@ %% transform_table(Tab, Fun, NewAttrs, NewRecName) - when function(Fun), list(NewAttrs), atom(NewRecName) -> + when is_function(Fun), is_list(NewAttrs), is_atom(NewRecName) -> schema_transaction(fun() -> do_transform_table(Tab, Fun, NewAttrs, NewRecName) end); transform_table(Tab, ignore, NewAttrs, NewRecName) - when list(NewAttrs), atom(NewRecName) -> + when is_list(NewAttrs), is_atom(NewRecName) -> schema_transaction(fun() -> do_transform_table(Tab, ignore, NewAttrs, NewRecName) end); transform_table(Tab, Fun, NewAttrs, NewRecName) -> @@ -1494,7 +1494,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -write_table_property(Tab, Prop) when tuple(Prop), size(Prop) >= 1 -> +write_table_property(Tab, Prop) when is_tuple(Prop), size(Prop) >= 1 -> schema_transaction(fun() -> do_write_table_property(Tab, Prop) end); write_table_property(Tab, Prop) -> {aborted, {bad_type, Tab, Prop}}. @@ -2456,14 +2456,14 @@ restore(Opaque) -> restore(Opaque, [], mnesia_monitor:get_env(backup_module)). -restore(Opaque, Args) when list(Args) -> +restore(Opaque, Args) when is_list(Args) -> restore(Opaque, Args, mnesia_monitor:get_env(backup_module)); restore(_Opaque, BadArg) -> {aborted, {badarg, BadArg}}. -restore(Opaque, Args, Module) when list(Args), atom(Module) -> +restore(Opaque, Args, Module) when is_list(Args), is_atom(Module) -> InitR = #r{opaque = Opaque, module = Module}, case catch lists:foldl(fun check_restore_arg/2, InitR, Args) of - R when record(R, r) -> + R when is_record(R, r) -> case mnesia_bup:read_schema(R#r.module, Opaque) of {error, Reason} -> {aborted, Reason}; @@ -2476,10 +2476,10 @@ restore(_Opaque, Args, Module) -> {aborted, {badarg, Args, Module}}. -check_restore_arg({module, Mod}, R) when atom(Mod) -> +check_restore_arg({module, Mod}, R) when is_atom(Mod) -> R#r{module = Mod}; -check_restore_arg({clear_tables, List}, R) when list(List) -> +check_restore_arg({clear_tables, List}, R) when is_list(List) -> case lists:member(schema, List) of false -> TableList = [{Tab, clear_tables} || Tab <- List], @@ -2487,7 +2487,7 @@ true -> exit({badarg, {clear_tables, schema}}) end; -check_restore_arg({recreate_tables, List}, R) when list(List) -> +check_restore_arg({recreate_tables, List}, R) when is_list(List) -> case lists:member(schema, List) of false -> TableList = [{Tab, recreate_tables} || Tab <- List], @@ -2495,10 +2495,10 @@ true -> exit({badarg, {recreate_tables, schema}}) end; -check_restore_arg({keep_tables, List}, R) when list(List) -> +check_restore_arg({keep_tables, List}, R) when is_list(List) -> TableList = [{Tab, keep_tables} || Tab <- List], R#r{table_options = R#r.table_options ++ TableList}; -check_restore_arg({skip_tables, List}, R) when list(List) -> +check_restore_arg({skip_tables, List}, R) when is_list(List) -> TableList = [{Tab, skip_tables} || Tab <- List], R#r{table_options = R#r.table_options ++ TableList}; check_restore_arg({default_op, Op}, R) -> @@ -2627,7 +2627,7 @@ Recs. %%%%%%%%% Dump tables %%%%%%%%%%%%% -dump_tables(Tabs) when list(Tabs) -> +dump_tables(Tabs) when is_list(Tabs) -> schema_transaction(fun() -> do_dump_tables(Tabs) end); dump_tables(Tabs) -> {aborted, {bad_type, Tabs}}. @@ -2869,7 +2869,7 @@ Cs; {'EXIT', Reason} -> exit(Reason); - MergedCs when record(MergedCs, cstruct) -> + MergedCs when is_record(MergedCs, cstruct) -> MergedCs; Other -> throw(Other) diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_snmp_hook.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_snmp_hook.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_snmp_hook.erl 2009-03-12 12:27:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_snmp_hook.erl 2009-09-18 15:12:05.000000000 +0100 @@ -42,7 +42,7 @@ is_snmp_type(to_list(Types)); check_ustruct(_) -> false. -to_list(Tuple) when tuple(Tuple) -> tuple_to_list(Tuple); +to_list(Tuple) when is_tuple(Tuple) -> tuple_to_list(Tuple); to_list(X) -> [X]. is_snmp_type([integer | T]) -> is_snmp_type(T); diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_subscr.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_subscr.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_subscr.erl 2009-03-12 12:27:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_subscr.erl 2009-09-18 15:12:20.000000000 +0100 @@ -171,7 +171,7 @@ what(Tab, Tid, {RecName, Key}, delete, undefined) -> case catch mnesia_lib:db_get(Tab, Key) of - Old when list(Old) -> %% Op only allowed for set table. + Old when is_list(Old) -> %% Op only allowed for set table. {mnesia_table_event, {delete, Tab, {RecName, Key}, Old, Tid}}; _ -> %% Record just deleted by a dirty_op or @@ -184,7 +184,7 @@ {mnesia_table_event, {delete, Tab, Obj, [Obj], Tid}}; what(Tab, Tid, Obj, write, undefined) -> case catch mnesia_lib:db_get(Tab, element(2, Obj)) of - Old when list(Old) -> + Old when is_list(Old) -> {mnesia_table_event, {write, Tab, Obj, Old, Tid}}; {'EXIT', _} -> ignore @@ -297,10 +297,10 @@ %%% Internal functions %%%---------------------------------------------------------------------- -do_change({activate, ClientPid, system}, SubscrTab) when pid(ClientPid) -> +do_change({activate, ClientPid, system}, SubscrTab) when is_pid(ClientPid) -> Var = subscribers, activate(ClientPid, system, Var, subscribers(), SubscrTab); -do_change({activate, ClientPid, {table, Tab, How}}, SubscrTab) when pid(ClientPid) -> +do_change({activate, ClientPid, {table, Tab, How}}, SubscrTab) when is_pid(ClientPid) -> case ?catch_val({Tab, where_to_read}) of Node when Node == node() -> Var = {Tab, commit_work}, @@ -417,7 +417,7 @@ deactivate(ClientPid, What, Var, SubscrTab) -> ?ets_match_delete(SubscrTab, {ClientPid, What}), case catch ?ets_lookup_element(SubscrTab, ClientPid, 1) of - List when list(List) -> + List when is_list(List) -> ignore; {'EXIT', _} -> unlink(ClientPid) diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_sup.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_sup.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_sup.erl 2009-03-12 12:27:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_sup.erl 2009-09-18 15:12:16.000000000 +0100 @@ -123,7 +123,7 @@ case whereis(Name) of undefined -> ok; - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> exit(Pid, kill), timer:sleep(10), ensure_dead(Name) diff -Nru erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_text.erl erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_text.erl --- erlang-13.b.1-dfsg/lib/mnesia/src/mnesia_text.erl 2009-03-12 12:27:45.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/mnesia/src/mnesia_text.erl 2009-09-18 15:12:16.000000000 +0100 @@ -133,7 +133,7 @@ io:format("No tables found\n", []), error(bad_header). -collect_data(Tabs, [{Line, Term} | Tail]) when tuple(Term) -> +collect_data(Tabs, [{Line, Term} | Tail]) when is_tuple(Term) -> case lists:keysearch(element(1, Term), 1, Tabs) of {value, _} -> [Term | collect_data(Tabs, Tail)]; diff -Nru erlang-13.b.1-dfsg/lib/mnesia/vsn.mk erlang-13.b.3-dfsg/lib/mnesia/vsn.mk --- erlang-13.b.1-dfsg/lib/mnesia/vsn.mk 2009-06-05 13:54:56.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/mnesia/vsn.mk 2009-11-20 13:35:54.000000000 +0000 @@ -1,7 +1,9 @@ -MNESIA_VSN = 4.4.10 +MNESIA_VSN = 4.4.12 -TICKETS = OTP-7928 OTP-7968 OTP-8002 +TICKETS = OTP-8250 +#TICKETS_4.4.11 = OTP-8074 +#TICKETS_4.4.10 = OTP-7928 OTP-7968 OTP-8002 #TICKETS_4.4.9 = OTP-7911 #TICKETS_4.4.8 = OTP-7753 OTP-7835 #TICKETS_4.4.7 = OTP-7524 OTP-7625 diff -Nru erlang-13.b.1-dfsg/lib/observer/doc/src/book.xml erlang-13.b.3-dfsg/lib/observer/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/observer/doc/src/book.xml 2007-11-26 19:03:46.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/observer/doc/src/book.xml 2009-11-20 13:34:16.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2002 - 2007 - Ericsson AB, All Rights Reserved + 20022009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Observer @@ -37,11 +35,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/observer/doc/src/crashdump_ug.xml erlang-13.b.3-dfsg/lib/observer/doc/src/crashdump_ug.xml --- erlang-13.b.1-dfsg/lib/observer/doc/src/crashdump_ug.xml 2007-11-26 19:03:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/observer/doc/src/crashdump_ug.xml 2009-11-20 13:34:16.000000000 +0000 @@ -4,23 +4,21 @@
    - 2003 - 2007 - Ericsson AB, All Rights Reserved + 20032009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Crashdump Viewer @@ -28,6 +26,7 @@ + crashdump_ug.xml
    diff -Nru erlang-13.b.1-dfsg/lib/observer/doc/src/etop_ug.xml erlang-13.b.3-dfsg/lib/observer/doc/src/etop_ug.xml --- erlang-13.b.1-dfsg/lib/observer/doc/src/etop_ug.xml 2007-11-26 19:03:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/observer/doc/src/etop_ug.xml 2009-11-20 13:34:14.000000000 +0000 @@ -4,23 +4,21 @@
    - 2002 - 2007 - Ericsson AB, All Rights Reserved + 20022009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Erlang Top @@ -28,6 +26,7 @@ + etop_ug.xml
    @@ -65,7 +64,7 @@ ======================================================================================== ]]>

    And graphically it looks like this:

    - + Graphical presentation of etop

    The header includes some system information: @@ -130,13 +129,13 @@

    Example: Change configuration with graphical presentation - + Select the option to change from the Options menu. - + Enter the new value in the popup window and click "Ok" - + The interface is updated with the new configuration
    @@ -189,7 +188,7 @@ Print to file

    At any time, the current etop display can be dumped to a text file. Use Dump to file on the File menu - with the grapical presentation or the function etop:dump/1 + with the graphical presentation or the function etop:dump/1 with the text based presentation.

    diff -Nru erlang-13.b.1-dfsg/lib/observer/doc/src/Makefile erlang-13.b.3-dfsg/lib/observer/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/observer/doc/src/Makefile 2007-11-26 19:03:46.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/observer/doc/src/Makefile 2009-11-20 13:34:15.000000000 +0000 @@ -23,17 +23,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(OBSERVER_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=observer # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/observer-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -59,6 +54,12 @@ BOOK_FILES = book.xml + +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) \ + $(XML_APPLICATION_FILES) $(XML_REF6_FILES) + ONLY_HTML_FILE = \ crashdump_help.html @@ -77,65 +78,44 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_PART = \ - $(XML_PART_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = observer-$(VSN).pdf -TOP_PS_FILE = observer-$(VSN).ps +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets # ---------------------------------------------------- -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -$(HTMLDIR)/$(ONLY_HTML_FILE): - $(INSTALL_DATA) $(ONLY_HTML_FILE) $@ +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) pdf: $(TOP_PDF_FILE) -ps: $(TOP_PS_FILE) +html: gifs $(HTML_REF_MAN_FILE) $(ONLY_HTML_FILE:%=$(HTMLDIR)/%) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(MAN6DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + -html: $(HTML_FILES) $(ONLY_HTML_FILE:%=$(HTMLDIR)/%) +$(HTMLDIR)/$(ONLY_HTML_FILE): + $(INSTALL_DATA) $(ONLY_HTML_FILE) $@ man: $(MAN3_FILES) $(MAN6_FILES) @@ -143,41 +123,25 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) - rm -f $(TEX_FILES_BOOK) $(TEX_FILES_PART) - rm -f $(EXTRA_FILES) $(HTML_FILES) $(MAN3_FILES) $(MAN6_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) - rm -f $(GIF_FILES:%=$(HTMLDIR)/%) - rm -f $(ONLY_HTML_FILE:%=$(HTMLDIR)/%) # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else + release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ - $(ONLY_HTML_FILE) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6 -endif -endif + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/observer/doc/src/notes.xml erlang-13.b.3-dfsg/lib/observer/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/observer/doc/src/notes.xml 2009-06-05 13:54:25.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/observer/doc/src/notes.xml 2009-11-20 13:34:20.000000000 +0000 @@ -26,6 +26,7 @@ nil nil nil + notes.xml

    This document describes the changes made to the Observer application.

    diff -Nru erlang-13.b.1-dfsg/lib/observer/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/observer/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/observer/doc/src/part_notes.xml 2007-11-26 19:03:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/observer/doc/src/part_notes.xml 2009-11-20 13:34:22.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Observer Release Notes @@ -35,6 +33,6 @@

    For information about older versions, see Release Notes History.

    - + diff -Nru erlang-13.b.1-dfsg/lib/observer/doc/src/part.xml erlang-13.b.3-dfsg/lib/observer/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/observer/doc/src/part.xml 2007-11-26 19:03:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/observer/doc/src/part.xml 2009-11-20 13:34:15.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2002 - 2007 - Ericsson AB, All Rights Reserved + 20022009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Observer User's Guide @@ -30,11 +28,11 @@
    -

    The OBSERVER application contains tools for tracing +

    The Observer application contains tools for tracing and investigation of distributed systems.

    - - - + + +
    diff -Nru erlang-13.b.1-dfsg/lib/observer/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/observer/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/observer/doc/src/ref_man.xml 2007-11-26 19:03:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/observer/doc/src/ref_man.xml 2009-11-20 13:34:14.000000000 +0000 @@ -1,29 +1,27 @@ - +
    - 2002 - 2007 - Ericsson AB, All Rights Reserved + 20022009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - OBSERVER Reference Manual + Observer Reference Manual @@ -31,13 +29,13 @@ application.sgml
    -

    The OBSERVER application contains tools for tracing +

    The Observer application contains tools for tracing and investigation of distributed systems.



    - - - - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/observer/doc/src/ttb_ug.xml erlang-13.b.3-dfsg/lib/observer/doc/src/ttb_ug.xml --- erlang-13.b.1-dfsg/lib/observer/doc/src/ttb_ug.xml 2007-11-26 19:03:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/observer/doc/src/ttb_ug.xml 2009-11-20 13:34:15.000000000 +0000 @@ -4,23 +4,21 @@
    - 2002 - 2007 - Ericsson AB, All Rights Reserved + 20022009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Trace Tool Builder @@ -28,6 +26,7 @@ + ttb_ug.xml
    @@ -107,7 +106,7 @@ f() -> receive From when pid(From) -> -\011 Now = erlang:now(), + Now = erlang:now(), From ! {self(),Now} end.

    The following example shows the basic use of ttb from @@ -215,16 +214,16 @@ do_print(Out,{trace_ts,P,call,{M,F,A},Ts},N) -> io:format(Out, -\011 "~w: ~w, ~w:~n" -\011 "Call : ~w:~w/~w~n" -\011 "Arguments :~p~n~n", -\011 [N,Ts,P,M,F,length(A),A]); + "~w: ~w, ~w:~n" + "Call : ~w:~w/~w~n" + "Arguments :~p~n~n", + [N,Ts,P,M,F,length(A),A]); do_print(Out,{trace_ts,P,return_from,{M,F,A},R,Ts},N) -> io:format(Out, -\011 "~w: ~w, ~w:~n" -\011 "Return from : ~w:~w/~w~n" -\011 "Return value :~p~n~n", -\011 [N,Ts,P,M,F,A,R]). ]]> + "~w: ~w, ~w:~n" + "Return from : ~w:~w/~w~n" + "Return value :~p~n~n", + [N,Ts,P,M,F,A,R]). ]]>

    To distinguish trace logs produced with this tool from other logs, the file option is used in tracer/2. The logs will therefore be named Node-debug_log, where @@ -323,7 +322,7 @@

    Wrap Logs

    If you want to limit the size of the trace logs, you can use - wrap logs. This works almost like a ciclular buffer. You can + wrap logs. This works almost like a circular buffer. You can specify the maximum number of binary logs and the maximum size of each log. ttb will create a new binary log each time a log reaches the maximum size. When the the maximum number of logs are @@ -471,7 +470,7 @@ works with local call trace, i.e. when trace patterns are set with ttb:tpl.

    -

    The same result can be obtaind by using the call flag +

    The same result can be obtained by using the call flag only and setting a match specification like this on local or global function calls:

    @@ -515,10 +514,10 @@ following result:

    - + Filter: "processes" - + Filter: "mods_and_procs"
    @@ -691,7 +690,7 @@ seq_trace module in the kernel application.

    -

    The support for sequencial tracing provided by the Trace Tool +

    The support for sequential tracing provided by the Trace Tool Builder includes

    Initiation of the system tracer. This is automatically diff -Nru erlang-13.b.1-dfsg/lib/odbc/c_src/odbcserver.c erlang-13.b.3-dfsg/lib/odbc/c_src/odbcserver.c --- erlang-13.b.1-dfsg/lib/odbc/c_src/odbcserver.c 2009-06-05 13:55:24.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/odbc/c_src/odbcserver.c 2009-11-20 13:36:30.000000000 +0000 @@ -2451,6 +2451,7 @@ SQLSMALLINT errmsg_buffer_size, record_nr, errmsg_size; int acc_errmsg_size; byte *current_errmsg_pos; + SQLCHAR current_sql_state[SQL_STATE_SIZE]; diagnos.error_msg[0] = 0; @@ -2463,7 +2464,7 @@ /* Foreach diagnostic record in the current set of diagnostic records the error message is obtained */ for(record_nr = 1; ;record_nr++) { - if(SQLGetDiagRec(handleType, handle, record_nr, diagnos.sqlState, + if(SQLGetDiagRec(handleType, handle, record_nr, current_sql_state, &nativeError, current_errmsg_pos, (SQLSMALLINT)errmsg_buffer_size, &errmsg_size) != SQL_SUCCESS) { @@ -2471,6 +2472,9 @@ break; } else { + /* update the sqlstate in the diagnos record, because the SQLGetDiagRec + call succeeded */ + memcpy(diagnos.sqlState, current_sql_state, SQL_STATE_SIZE); errmsg_buffer_size = errmsg_buffer_size - errmsg_size; acc_errmsg_size = acc_errmsg_size + errmsg_size; current_errmsg_pos = current_errmsg_pos + errmsg_size; diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/book.xml erlang-13.b.3-dfsg/lib/odbc/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/odbc/doc/src/book.xml 2009-03-12 12:28:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/book.xml 2009-11-20 13:36:23.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19992009 @@ -21,7 +21,7 @@ - Erlang ODBC application + Erlang ODBC Ingvar Meyer @@ -30,16 +30,19 @@
    - Erlang ODBC application + Erlang ODBC - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/databases.xml erlang-13.b.3-dfsg/lib/odbc/doc/src/databases.xml --- erlang-13.b.1-dfsg/lib/odbc/doc/src/databases.xml 2009-03-12 12:31:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/databases.xml 2009-11-20 13:37:22.000000000 +0000 @@ -29,7 +29,7 @@ - + databases.xml
    @@ -57,7 +57,7 @@ unfortunately there is no guarantee that all databases actually treats the ANSI data types equivalently. For instance an installation of Oracle Enterprise release 8.0.5.0.0 for unix will accept that you create a table column with the - ANSI data type integer, but when retrinving values from + ANSI data type integer, but when retrieving values from this column the driver reports that it is of type SQL_DECIMAL(0, 38) and not SQL_INTEGER as you may have expected.

    @@ -89,7 +89,7 @@ DOUBLE PRECISION CHARACTER VARYING(size), CHAR VARYING(size) -

    When inputing data using sql_query/[2,3] the values will +

    When inputting data using sql_query/[2,3] the values will always be in string format as they are part of an SQL-query. Example:

    diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/error_handling.xml erlang-13.b.3-dfsg/lib/odbc/doc/src/error_handling.xml --- erlang-13.b.1-dfsg/lib/odbc/doc/src/error_handling.xml 2009-03-12 12:31:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/error_handling.xml 2009-11-20 13:37:23.000000000 +0000 @@ -29,7 +29,7 @@ - + error_handling.xml
    @@ -88,7 +88,7 @@
    The whole picture

    As the Erlang ODBC application relies on third party products - and communicates with a database that proably runs on an other + and communicates with a database that probably runs on an other computer in the network there are plenty of things that might go wrong. To fully understand the things that might happen it facilitate to know the design of the Erlang ODBC application, @@ -99,7 +99,7 @@ semantics of the API will not change as it is independent of the implementation.

    - + Architecture of the Erlang odbc application

    When you do application:start(odbc) the only thing that diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/getting_started.xml erlang-13.b.3-dfsg/lib/odbc/doc/src/getting_started.xml --- erlang-13.b.1-dfsg/lib/odbc/doc/src/getting_started.xml 2009-03-12 12:31:08.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/getting_started.xml 2009-11-20 13:37:22.000000000 +0000 @@ -29,7 +29,7 @@ - + getting_started.xml

    @@ -80,7 +80,7 @@ ok

    Connect to the database

    {ok, Ref} = odbc:connect("DSN=sql-server;UID=aladin;PWD=sesame", []). + 2 > {ok, Ref} = odbc:connect("DSN=sql-server;UID=aladdin;PWD=sesame", []). {ok,<0.342.0>} ]]>

    Create a table

    @@ -131,7 +131,7 @@ {6,"Piper","Halliwell","F"}, {7,"Prue","Halliwell","F"}, {8,"Louise","Lane","F"}]]} -

    Associate a result set containg the whole table +

    Associate a result set containing the whole table EMPLOYEE to the connection. The number of rows in the result set is returned.

    @@ -147,7 +147,7 @@ {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    If your driver supports scrollable cursors you have a little - more freedom, and can do thigs like this.

    + more freedom, and can do things like this.

    11 > odbc:last(Ref). {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{8,"Louise","Lane","F"}]} @@ -191,7 +191,7 @@ 17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'"). {ok,6} -

    A few more ways of retriving parts of the result set when the +

    A few more ways of retrieving parts of the result set when the driver supports scrollable cursors. Note that next will work even without support for scrollable cursors.

    diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/introduction.xml erlang-13.b.3-dfsg/lib/odbc/doc/src/introduction.xml --- erlang-13.b.1-dfsg/lib/odbc/doc/src/introduction.xml 2009-03-12 12:31:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/introduction.xml 2009-11-20 13:37:21.000000000 +0000 @@ -29,7 +29,7 @@ 2002-09-17 A - introduction.sgml + introduction.xml
    diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/Makefile erlang-13.b.3-dfsg/lib/odbc/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/odbc/doc/src/Makefile 2009-03-12 12:28:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/Makefile 2009-11-20 13:36:23.000000000 +0000 @@ -26,17 +26,20 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(ODBC_VSN) +APPLICATION=odbc # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- +ifndef DOCSUPPORT include make.dep +endif # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/odbc-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -83,6 +86,14 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ @@ -90,8 +101,8 @@ TEX_FILES_USERS_GUIDE = \ $(XML_CHAPTER_FILES:%.xml=%.tex) -TOP_PDF_FILE = odbc-$(VSN).pdf -TOP_PS_FILE = odbc-$(VSN).ps +TOP_PDF_FILE = $(APPLICATION)-$(VSN).pdf +TOP_PS_FILE = $(APPLICATION)-$(VSN).ps $(TOP_PDF_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ @@ -99,6 +110,8 @@ $(TOP_PS_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +endif + # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- @@ -109,6 +122,27 @@ # Targets # ---------------------------------------------------- +$(HTMLDIR)/%.gif: %.gif # Copy them to ../html + $(INSTALL_DATA) $< $@ + +ifdef DOCSUPPORT + +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + +else + ifeq ($(DOCTYPE),pdf) docs: pdf else @@ -125,20 +159,19 @@ html: $(HTML_FILES) -man: $(MAN3_FILES) - -gifs: $(GIF_FILES:%=$(HTMLDIR)/%) # We depend just to copy them to ../html - -debug opt: - clean clean_docs clean_tex: rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) rm -f $(HTML_FILES) $(MAN3_FILES) rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) -$(HTMLDIR)/%.gif: %.gif # Copy them to ../html - $(INSTALL_DATA) $< $@ +endif + +man: $(MAN3_FILES) + +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) # We depend just to copy them to ../html + +debug opt: # ---------------------------------------------------- @@ -146,6 +179,19 @@ # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 +else + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -166,6 +212,8 @@ endif endif +endif + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/notes.xml erlang-13.b.3-dfsg/lib/odbc/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/odbc/doc/src/notes.xml 2009-06-05 13:55:59.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/notes.xml 2009-11-20 13:37:35.000000000 +0000 @@ -26,10 +26,41 @@ nil nil nil + notes.xml

    This document describes the changes made to the odbc application.

    +
    ODBC 2.10.6 + +
    Fixed Bugs and Malfunctions + + +

    + Applied a patch from Andrew Thompson, which fixes some + error cases.

    +

    + Own Id: OTP-8291

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8250

    +
    +
    +
    + +
    +
    ODBC 2.10.5
    Fixed Bugs and Malfunctions @@ -103,7 +134,7 @@

    - SQLINTEGERs where not retrived correctly on 64 bit + SQLINTEGERs where not retrieved correctly on 64 bit platforms as an SQLINTEGER is defined to be a 32 bit integer and not a true long.

    @@ -151,7 +182,7 @@

    - SQLINTEGERs are not retrived correctly on 64 bit + SQLINTEGERs are not retrieved correctly on 64 bit platforms as an SQLINTEGER seems to be defined to be a 32 bit integer and not a true long.

    @@ -186,9 +217,9 @@

    The odbc application now has to be explicitly started and - stoped e.i. it will not automatically be started as a + stopped e.i. it will not automatically be started as a temporary application as it did before. Although a - prictial feature when testing things in the shell it is + practical feature when testing things in the shell, it is not desirable that people take advantage of this and not start the odbc application in a correct way in their products. Added functions to the odbc API that calls @@ -453,8 +484,8 @@

    -

    For information about older versions see - release notes history.

    +
    diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/odbc.xml erlang-13.b.3-dfsg/lib/odbc/doc/src/odbc.xml --- erlang-13.b.1-dfsg/lib/odbc/doc/src/odbc.xml 2009-03-12 12:28:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/odbc.xml 2009-11-20 13:36:23.000000000 +0000 @@ -99,8 +99,8 @@ is driver defined, and hence should be ignored.
    odbc_data_type() = sql_integer | sql_smallint | sql_tinyint | - {sql_decimal, precison(), scale()} | - {sql_numeric, precison(), scale()} | + {sql_decimal, precision(), scale()} | + {sql_numeric, precision(), scale()} | {sql_char, size()} | {sql_varchar, size()} | {sql_float, precision()} | {sql_float, precision()} | sql_real | sql_double | sql_bit | atom() @@ -138,38 +138,38 @@ Opens a connection to the database. ConnectStr = string() - An example of a connection string:"DSN=sql-server;UID=alladin;PWD=sesame"where DSN is your ODBC Data Source Name, UID is a database user id and PWD is the password for that user. These are usually the attributes required in the connection string, but some drivers have other driver specific attributes, for example"DSN=Oracle8;DBQ=gandalf;UID=alladin;PWD=sesame"where DBQ is your TNSNAMES.ORA entry name e.g. some Oracle specific configuration attribute. + An example of a connection string:"DSN=sql-server;UID=aladdin;PWD=sesame"where DSN is your ODBC Data Source Name, UID is a database user id and PWD is the password for that user. These are usually the attributes required in the connection string, but some drivers have other driver specific attributes, for example"DSN=Oracle8;DBQ=gandalf;UID=aladdin;PWD=sesame"where DBQ is your TNSNAMES.ORA entry name e.g. some Oracle specific configuration attribute. Options = [] | [option()] All options has default values. - option() = {auto_commit, auto_commit_mode()} | {timeout, milliseconds()} | {tuple_row, tuple_mode()} | {scrollable_cursors, use_srollable_cursors()} | {trace_driver, trace_mode()} + option() = {auto_commit, auto_commit_mode()} | {timeout, milliseconds()} | {tuple_row, tuple_mode()} | {scrollable_cursors, use_scrollable_cursors()} | {trace_driver, trace_mode()} The default timeout is infinity auto_commit_mode() = on | off Default is on. tuple_mode() = on | off Default is on. The option is deprecated and should not be used in new code. - use_srollable_cursors() = on | off + use_scrollable_cursors() = on | off Default is on. trace_mode() = on | off Default is off. - Ref = connection_reference() - should be used to acess the connection. + Ref = connection_reference() - should be used to access the connection. Reason = port_program_executable_not_found | common_reason()

    Opens a connection to the database. The connection is associated with the process that created it and can only be - accessed through it. This funtion may spawn new processes + accessed through it. This function may spawn new processes to handle the connection. These processes will terminate if the process that created the connection dies or if you call disconnect/1.

    If automatic commit mode is turned on, each query will be considered as an individual transaction and will be - automaticly commited after it has been executed. If you want + automatically committed after it has been executed. If you want more than one query to be part of the same transaction the automatic commit mode should be turned off. Then you will have to call commit/3 explicitly to end a transaction.

    As default result sets are returned as a lists of tuples. The TupleMode option still exists to keep some - degree of backwards compatiblity. If the option is set to + degree of backwards compatibility. If the option is set to off, result sets will be returned as a lists of lists instead of a lists of tuples.

    Scrollable cursors are nice but causes some overhead. For @@ -422,7 +422,7 @@

    Selects N consecutive rows of the result set. If - Position is next it is semanticly equivalent + Position is next it is semantically equivalent of calling next/[1,2]N times. If Position is {relative, Pos}, Pos will be used as an offset from the current cursor position to diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/odbc/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/odbc/doc/src/part_notes.xml 2009-03-12 12:31:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/part_notes.xml 2009-11-20 13:37:35.000000000 +0000 @@ -1,7 +1,7 @@ - +

    20042009 @@ -34,7 +34,7 @@

    For information about older versions see release notes history.

    - + diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/part.xml erlang-13.b.3-dfsg/lib/odbc/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/odbc/doc/src/part.xml 2009-03-12 12:28:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/part.xml 2009-11-20 13:36:24.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19992009 @@ -32,10 +32,10 @@

    The Erlang ODBC Application provides an interface for accessing relational SQL-databases from Erlang.

    - - - - + + + + diff -Nru erlang-13.b.1-dfsg/lib/odbc/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/odbc/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/odbc/doc/src/ref_man.xml 2009-03-12 12:28:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/odbc/doc/src/ref_man.xml 2009-11-20 13:36:23.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19992009 @@ -35,7 +35,7 @@

    The Erlang ODBC application provides an interface for accessing relational SQL-databases from Erlang.

    - + diff -Nru erlang-13.b.1-dfsg/lib/odbc/vsn.mk erlang-13.b.3-dfsg/lib/odbc/vsn.mk --- erlang-13.b.1-dfsg/lib/odbc/vsn.mk 2009-06-05 13:55:19.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/odbc/vsn.mk 2009-11-20 13:36:22.000000000 +0000 @@ -1,8 +1,12 @@ -ODBC_VSN = 2.10.5 +ODBC_VSN = 2.10.6 TICKETS = \ - OTP-7978 + OTP-8250 \ + OTP-8291 + +TICKETS_2.10.5 = \ + OTP-7978 TICKETS_2.10.4 = \ OTP-7720 \ diff -Nru erlang-13.b.1-dfsg/lib/orber/COSS/CosNaming/orber_cosnaming_utils.erl erlang-13.b.3-dfsg/lib/orber/COSS/CosNaming/orber_cosnaming_utils.erl --- erlang-13.b.1-dfsg/lib/orber/COSS/CosNaming/orber_cosnaming_utils.erl 2009-06-05 13:55:26.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/orber/COSS/CosNaming/orber_cosnaming_utils.erl 2009-11-20 13:36:37.000000000 +0000 @@ -19,7 +19,7 @@ %% %% %%----------------------------------------------------------------- -%% File: CosNaming_BindingIterator_impl.erl +%% File: orber_cosnaming_utils.erl %% Modified: %% %%----------------------------------------------------------------- @@ -520,8 +520,7 @@ Request = "GET " ++ Key ++ " HTTP/1.0\r\n\r\n", case gen_tcp:send(Socket, Request) of ok -> - _HdrMSG = receive_msg(Socket, false, SendTimeout), - receive_msg(Socket, true, SendTimeout); + receive_msg(Socket, [], SendTimeout); {error, Reason} -> orber:dbg("[~p] orber_cosnaming_utils:lookup();~n" "Failed to send request: ~p.", @@ -534,17 +533,13 @@ corba:raise(#'CosNaming_NamingContextExt_InvalidAddress'{}). -receive_msg(Socket, Close, Timeout) -> +receive_msg(Socket, Acc, Timeout) -> receive {tcp_closed, Socket} -> - orber:dbg("[~p] orber_cosnaming_utils:receive_msg();~n" - "HTTP-server closed connection.", [?LINE], ?DEBUG_LEVEL), - corba:raise(#'COMM_FAILURE'{completion_status=?COMPLETED_NO}); - {tcp, Socket, Response} when Close == true -> - gen_tcp:close(Socket), - Response; + [_Header, Body] = re:split(Acc,"\r\n\r\n",[{return,list}]), + Body; {tcp, Socket, Response} -> - Response; + receive_msg(Socket, Acc ++ Response, Timeout); {tcp_error, Socket, Reason} -> orber:dbg("[~p] orber_cosnaming_utils:receive_msg();~n" "connection failed: ~p.", @@ -555,7 +550,6 @@ gen_tcp:close(Socket), corba:raise(#'COMM_FAILURE'{completion_status=?COMPLETED_NO}) end. - create_connection(Host, Port, Timeout) -> case gen_tcp:connect(Host,Port,[{packet,0},{reuseaddr,true}], Timeout) of @@ -604,7 +598,7 @@ key2id_helper("PolicyCurrent") -> {ok, "IDL:omg.org/CORBA/PolicyCurrent:1.0"}; key2id_helper("NotificationService") -> - {ok, 'CosNotifyChannelAdmin_EventChannelFactory':typeID()}; + {ok, "IDL:omg.org/CosNotifyChannelAdmin/EventChannelFactory:1.0"}; key2id_helper("TypedNotificationService") -> {ok, "IDL:omg.org/CosTypedNotifyChannelAdmin::TypedEventChannelFactory:1.0"}; key2id_helper("CodecFactory") -> diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/book.xml erlang-13.b.3-dfsg/lib/orber/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/book.xml 2007-11-26 13:08:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/book.xml 2009-11-20 13:36:13.000000000 +0000 @@ -1,29 +1,27 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - Orber Application + orber 1998-04-25 @@ -31,43 +29,19 @@
    - Orber Application + Orber - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_contents.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_contents.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_contents.xml 2009-03-12 12:29:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_contents.xml 2009-11-20 13:36:30.000000000 +0000 @@ -26,6 +26,7 @@ 1998-05-05 B + ch_contents.xml
    diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_debugging.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_debugging.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_debugging.xml 2009-03-12 12:30:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_debugging.xml 2009-11-20 13:37:16.000000000 +0000 @@ -26,6 +26,7 @@ 2001-11-29 + ch_debugging.xml
    diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_example.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_example.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_example.xml 2009-04-16 10:26:06.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_example.xml 2009-11-20 13:36:11.000000000 +0000 @@ -26,6 +26,7 @@ 1997-05-20 A + ch_example.xml
    diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_exceptions.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_exceptions.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_exceptions.xml 2009-03-12 12:30:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_exceptions.xml 2009-11-20 13:37:01.000000000 +0000 @@ -26,6 +26,7 @@ 2000-12-19 + ch_exceptions.xml
    @@ -55,7 +56,7 @@ 'COMPLETED_MAYBE' Orber invoked the operation on the target object but an error occurred and it is impossible to decide if the request really reached the object or not. - Table 1: System Exceptions Status + System Exceptions Status
    @@ -113,7 +114,7 @@ which caused, for example, a connection to be closed. 'INV_IDENT' - this exception indicates that an IDL identifier is incorrect. - 'INV_OBJREF' - this exception is raised if an objet + 'INV_OBJREF' - this exception is raised if an object reference is malformed or a nil reference (see also corba:create_nil_objref/0). 'INV_POLICY' - the invocation cannot be made due to an diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_idl_to_erlang_mapping.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_idl_to_erlang_mapping.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_idl_to_erlang_mapping.xml 2009-03-12 12:28:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_idl_to_erlang_mapping.xml 2009-11-20 13:36:11.000000000 +0000 @@ -26,6 +26,7 @@ 1998-10-10 + ch_idl_to_erlang_mapping.xml
    @@ -359,7 +360,7 @@ Orber's Reference Manual.

    Now we continue to work on our IDL specification. To begin with, we want to limit the size of the logon parameters (Id and password). Since the - UserID and Password paremeters, only will be used when + UserID and Password parameters, only will be used when invoking operations on the Access interface, we may choose to define them within the scope that interface. To keep it simple our DB will contain employee information. Hence, as the DB key we choose an integer @@ -514,7 +515,7 @@

    Every field in, for example, a struct must be initiated. Otherwise it will be set to the atom undefined, which Orber cannot encode when communicating via IIOP. In the example above, invoking - the opertion with #'myStruct'{a=300} will fail (equal to + the operation with #'myStruct'{a=300} will fail (equal to #'myStruct'{a=300, b=undefined})

    Now we can continue to work on our IDL specification. To begin with, we should @@ -624,7 +625,7 @@ handles the remaining OMG IDL scopes.

    An Erlang module, corresponding to an IDL global name, is derived by - converting occurencies of "::" to underscore, and eliminating + converting occurrences of "::" to underscore, and eliminating the leading "::". Hence, accessing MyEnum from another module, one use MyModule::MyEnum

    For example, an operation foo defined in interface I, which @@ -691,7 +692,7 @@

    Using underscores in IDL names can lead to ambiguities due to the name mapping described above. It is advisable to avoid the use of underscores in identifiers. For example, the following - definition would generate two structures namned x_y_z.

    + definition would generate two structures named x_y_z.

    module x { @@ -1118,7 +1119,7 @@ templates, we simply rename DB_Administrator_impl.erl to DBUser_impl.erl. See also the Exceptions chapter. - In the following example, only the implementation of the API functios + In the following example, only the implementation of the API functions are shown:

    %%====================================================================== @@ -1315,7 +1316,7 @@ illegal as keywords and identifiers. But, since the OMG must be able to expand the IDL grammar, it is possible to use Escaped Identifiers. For example, it is not unlikely that native have been used in IDL-specifications as identifiers. One option is to - change all occurances to myNative. Usually, it is necessary + change all occurrences to myNative. Usually, it is necessary to change programming language code that depends upon that IDL as well. Since Escaped Identifiers just disable type checking (i.e. if it is a reserved word or not) and leaves everything else unchanged, it is only necessary to diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_ifr.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_ifr.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_ifr.xml 2007-11-26 13:08:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_ifr.xml 2009-11-20 13:36:31.000000000 +0000 @@ -4,23 +4,21 @@
    - 1999 - 2007 - Ericsson AB, All Rights Reserved + 19992009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Interface Repository @@ -28,6 +26,7 @@ 1998-10-10 + ch_ifr.xml
    diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_install.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_install.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_install.xml 2009-04-16 10:26:06.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_install.xml 2009-11-20 13:36:09.000000000 +0000 @@ -29,6 +29,7 @@ 1998-09-28 + ch_install.xml
    @@ -920,7 +921,7 @@ (Network Address Translation), we must activate this behavior and define the external address and/or ports.

    - + TCP Firewall With NAT diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_interceptors.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_interceptors.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_interceptors.xml 2009-03-12 12:30:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_interceptors.xml 2009-11-20 13:37:06.000000000 +0000 @@ -26,6 +26,7 @@ 2001-08-16 + ch_interceptors.xml
    @@ -93,7 +94,7 @@ are called, as shown below, for every Request/Reply to/from remote CORBA Objects.

    - + The Invocation Order of Interceptor Functions. diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_introduction.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_introduction.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_introduction.xml 2007-11-26 13:08:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_introduction.xml 2009-11-20 13:36:31.000000000 +0000 @@ -4,23 +4,21 @@
    - 1999 - 2007 - Ericsson AB, All Rights Reserved + 19992009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Introduction to Orber @@ -28,6 +26,7 @@ 1998-09-21 + ch_introduction.xml
    @@ -97,7 +96,7 @@ Purpose and Dependencies

    The system architecture and OTP dependencies of Orber are illustrated in figure 1 below:

    - + Figure 1: Orber Dependencies and Structure. @@ -112,14 +111,14 @@ further details.

    - + Figure 2: ORB interface between Java and Erlang Environment Nodes.

    This simplified illustration in figure 2 demonstrates how Orber can facilitate communication in a heterogeneous environment. The Erlang Nodes running OTP and the other Node running applications written in Java can communicate via an Object Request Broker - ORB open software bus architecture specified by the OMG which allows object components to communicate in a heterogeneous environment.(Object Request Broker). Using - Orber means that CORBA functions can be used to achive this + Orber means that CORBA functions can be used to achieve this communication.

    For example, if one of the above nodes requests an object, it does not diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_naming_service.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_naming_service.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_naming_service.xml 2009-03-12 12:28:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_naming_service.xml 2009-11-20 13:36:17.000000000 +0000 @@ -26,6 +26,7 @@ 1998-10-10 + ch_naming_service.xml

    @@ -74,7 +75,7 @@ object itself, has no name.

    - + Figure 1: Contextual object relationships using the Naming Service. diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_orber_kernel.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_orber_kernel.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_orber_kernel.xml 2007-11-26 13:08:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_orber_kernel.xml 2009-11-20 13:36:31.000000000 +0000 @@ -4,23 +4,21 @@
    - 1999 - 2007 - Ericsson AB, All Rights Reserved + 19992009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + The Orber Application @@ -28,6 +26,7 @@ 1998-10-05 + ch_orber_kernel.xml
    @@ -64,7 +63,7 @@

    How the ORB provides communication is shown very simply in figure 1 below:

    - + Figure 1: How the Object Request Broker works. @@ -90,7 +89,7 @@

    Figure 2 below demonstrates how IIOP works between objects:

    - + Figure 2: IIOP communication between domains and objects. diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_orberweb.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_orberweb.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_orberweb.xml 2009-03-12 12:30:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_orberweb.xml 2009-11-20 13:37:16.000000000 +0000 @@ -26,6 +26,7 @@ 2001-11-22 + ch_orberweb.xml
    @@ -53,7 +54,7 @@

    - + The Menu Frame.

    Which nodes we can access is determined by what is returned when invoking [node()|nodes()]. @@ -68,7 +69,7 @@ configuration settings for the target node.

    - + Configuration Settings.

    It is also possible to change those configuration parameters which can be changed when Orber @@ -85,7 +86,7 @@ listed when choosing IFR Types in the menu frame:

    - + Select Type.

    After selecting a type all definitions of that particular type will be displayed. If no such @@ -95,7 +96,7 @@ the NameService exceptions listed.

    - + List Registered Exceptions.
    @@ -119,7 +120,7 @@ associated with ncontext and objects with nobject.

    - + Add a New Context.

    To create the next level context (i.e. erlang), simply follow the link and repeat the procedure. @@ -132,7 +133,7 @@ A completion status message will be displayed after deleting the context.

    - + Delete Context.

    Now it is possible to bind an object using the complete name string. To find out how this is @@ -140,7 +141,7 @@ For now, we will just assume that an object have been created and bound as TheObjectName.

    - + Object Stored in the NameService.

    If you follow the TheObjectName link, data about the bound object will be @@ -150,7 +151,7 @@ been bound under the name org/erlang/TheObjectName.

    - + Object Data.

    OrberWeb also makes it possible to remove a binding and dispose the associated object. @@ -166,7 +167,7 @@ NameService.

    - + Create a New Object. @@ -209,7 +210,7 @@ erl> webtool:start(). -WebTool is availible at http://localhost:8888/ +WebTool is available at http://localhost:8888/ Or http://127.0.0.1:8888/

    Type one of the URL:s in your web-browser. If you want to access the WebTool application diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_security.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_security.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_security.xml 2007-11-26 13:08:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_security.xml 2009-11-20 13:36:40.000000000 +0000 @@ -4,23 +4,21 @@

    - 1999 - 2007 - Ericsson AB, All Rights Reserved + 19992009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + How to use security in Orber @@ -28,6 +26,7 @@ 1999-09-01 + ch_security.xml
    diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ch_stubs.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ch_stubs.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ch_stubs.xml 2007-11-26 13:08:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ch_stubs.xml 2009-11-20 13:36:40.000000000 +0000 @@ -4,23 +4,21 @@
    - 1999 - 2007 - Ericsson AB, All Rights Reserved + 19992009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Orber Stubs/Skeletons @@ -28,6 +26,7 @@ 1999-09-03 A + ch_stubs.xml
    diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/lname.xml erlang-13.b.3-dfsg/lib/orber/doc/src/lname.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/lname.xml 2009-03-12 12:28:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/lname.xml 2009-11-20 13:36:13.000000000 +0000 @@ -103,7 +103,7 @@ - num_components(Name) -> Return + num_component(Name) -> Return Count the number of name components in a name Name = [NameComponent] diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/Makefile erlang-13.b.3-dfsg/lib/orber/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/orber/doc/src/Makefile 2009-03-12 12:28:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/Makefile 2009-11-20 13:36:10.000000000 +0000 @@ -25,17 +25,20 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(ORBER_VSN) +APPLICATION=orber # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- +ifndef DOCSUPPORT include make.dep +endif # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/orber-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -88,6 +91,9 @@ BOOK_FILES = book.xml +XML_FILES = $(BOOK_FILES) $(XML_APPLICATION_FILES) $(XML_REF3_FILES) \ + $(XML_PART_FILES) $(XML_CHAPTER_FILES) + TECHNICAL_DESCR_FILES = GIF_FILES = \ @@ -129,6 +135,14 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ @@ -136,8 +150,8 @@ TEX_FILES_USERS_GUIDE = \ $(XML_CHAPTER_FILES:%.xml=%.tex) -TOP_PDF_FILE = orber-$(VSN).pdf -TOP_PS_FILE = orber-$(VSN).ps +TOP_PDF_FILE = $(APPLICATION)-$(VSN).pdf +TOP_PS_FILE = $(APPLICATION)-$(VSN).ps $(TOP_PDF_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ @@ -145,6 +159,8 @@ $(TOP_PS_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +endif + # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- @@ -157,6 +173,26 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ + +ifdef DOCSUPPORT + +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + rm -f $(JD_HTML) $(JD_PACK) + +else + ifeq ($(DOCTYPE),pdf) docs: pdf else @@ -173,24 +209,42 @@ html: $(HTML_FILES) $(INTERNAL_HTML_FILES) -man: $(MAN3_FILES) - -gifs: $(GIF_FILES:%=$(HTMLDIR)/%) - -debug opt: - clean clean_docs clean_tex: rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) + rm -f $(HTMLDIR)/* + rm -f $(MAN3DIR)/* rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) rm -f $(JD_HTML) $(JD_PACK) +endif + + +man: $(MAN3_FILES) + +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) + +debug opt: + # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk + +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 +else + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -212,5 +266,7 @@ endif endif +endif + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/notes.xml erlang-13.b.3-dfsg/lib/orber/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/notes.xml 2009-06-05 13:55:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/notes.xml 2009-11-20 13:36:12.000000000 +0000 @@ -29,9 +29,27 @@ 99-02-12 A + notes.xml
    + Orber 3.6.14 + +
    + Improvements and New Features + + +

    + The documentation is now built with open source tools (xsltproc and fop) + that exists on most platforms. One visible change is that the frames are removed.

    +

    + Own Id: OTP-8201 Aux Id:

    +
    +
    +
    +
    + +
    Orber 3.6.13
    @@ -385,8 +403,8 @@
    -

    For information about older versions see - release notes history.

    +
    diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/orber_ifr.xml erlang-13.b.3-dfsg/lib/orber/doc/src/orber_ifr.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/orber_ifr.xml 2009-03-12 12:28:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/orber_ifr.xml 2009-11-20 13:36:14.000000000 +0000 @@ -887,7 +887,7 @@
    set_params(Objref,Params) -> Return - Set the params attibute of the target object to the given parameter description records + Set the params attribute of the target object to the given parameter description records Objref = #IFR_OperationDef_objref Params = list() (list of parameter description records) diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/orber/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/part_notes.xml 2007-11-26 13:08:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/part_notes.xml 2009-11-20 13:36:12.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Orber Release Notes @@ -35,6 +33,6 @@

    For information about older versions see release notes history.

    - + diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/part.xml erlang-13.b.3-dfsg/lib/orber/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/part.xml 2007-11-26 13:08:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/part.xml 2009-11-20 13:36:10.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Orber User's Guide @@ -33,19 +31,19 @@

    The Orber application is an Erlang implementation of a CORBA Object Request Broker.

    - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/orber/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/orber/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/orber/doc/src/ref_man.xml 2007-11-26 13:08:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/orber/doc/src/ref_man.xml 2009-11-20 13:36:09.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Orber Reference Manual @@ -33,22 +31,22 @@

    The Orber application is an Erlang implementation of a CORBA Object Request Broker.

    - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/orber/vsn.mk erlang-13.b.3-dfsg/lib/orber/vsn.mk --- erlang-13.b.1-dfsg/lib/orber/vsn.mk 2009-06-05 13:54:59.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/orber/vsn.mk 2009-11-20 13:35:55.000000000 +0000 @@ -1,7 +1,9 @@ -ORBER_VSN = 3.6.13 +ORBER_VSN = 3.6.14 -TICKETS = OTP-7987 +TICKETS = OTP-8201 + +TICKETS_3.6.13 = OTP-7987 TICKETS_3.6.12 = OTP-7906 diff -Nru erlang-13.b.1-dfsg/lib/os_mon/c_src/memsup.c erlang-13.b.3-dfsg/lib/os_mon/c_src/memsup.c --- erlang-13.b.1-dfsg/lib/os_mon/c_src/memsup.c 2009-04-16 10:23:39.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/os_mon/c_src/memsup.c 2009-09-18 15:07:08.000000000 +0100 @@ -81,7 +81,7 @@ * the preprocessor (usually by a -D option). */ -#ifdef sgi +#if defined(sgi) || defined(__sgi) || defined(__sgi__) #include #include #endif @@ -425,7 +425,7 @@ } #endif -#if defined(__sgi__) +#if defined(sgi) || defined(__sgi) || defined(__sgi__) static int get_extended_mem_sgi(memory_ext *me) { struct rminfo rmi; @@ -456,7 +456,7 @@ if (get_extended_mem_bsd4(me)) return; /* sgi */ -#elif defined(sgi) +#elif defined(sgi) || defined(__sgi) || defined(__sgi__) if (get_extended_mem_sgi(me)) return; #endif @@ -512,7 +512,7 @@ fail: print_error("%s", strerror(errno)); exit(1); -#elif defined(sgi) +#elif defined(sgi) || defined(__sgi) || defined(__sgi__) struct rminfo rmi; if (sysmp(MP_SAGET, MPSA_RMINFO, &rmi, sizeof(rmi)) != -1) { *tot = (unsigned long)(rmi.physmem); diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/book.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/book.xml 2009-03-12 12:19:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/book.xml 2009-11-20 13:30:18.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19972009 @@ -34,8 +34,11 @@ - + + + + diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/cpu_sup.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/cpu_sup.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/cpu_sup.xml 2009-03-12 12:19:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/cpu_sup.xml 2009-11-20 13:30:14.000000000 +0000 @@ -32,7 +32,7 @@

    cpu_sup is a process which supervises the CPU load and CPU utilization. It is part of the OS_Mon application, see - os_mon(6). Available for Unix, + os_mon(6). Available for Unix, although CPU utilization values (util/0,1) are only available for Solaris and Linux.

    The load values are proportional to how long time a runnable @@ -275,7 +275,7 @@

    See Also -

    os_mon(3)

    +

    os_mon(3)

    diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/disksup.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/disksup.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/disksup.xml 2009-03-12 12:18:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/disksup.xml 2009-11-20 13:29:43.000000000 +0000 @@ -32,7 +32,7 @@

    disksup is a process which supervises the available disk space in the system. It is part of the OS_Mon application, see - os_mon(6). Available for Unix + os_mon(6). Available for Unix and Windows.

    Periodically checks the disks. For each disk or partition which uses more than a certain amount of the available space, the alarm @@ -120,7 +120,7 @@

    Changes the time interval, given in minutes, for the periodic disk space check.

    The change will take effect after the next disk space check - and is non-persistant. That is, in case of a process restart, + and is non-persist. That is, in case of a process restart, this value is forgotten and the default value will be used. See Configuration above.

    @@ -145,7 +145,7 @@

    Changes the threshold, given as a float, for disk space utilization.

    The change will take effect during the next disk space check - and is non-persistant. That is, in case of a process restart, + and is non-persist. That is, in case of a process restart, this value is forgotten and the default value will be used. See Configuration above.

    @@ -155,7 +155,7 @@
    See Also

    alarm_handler(3), - os_mon(3)

    + os_mon(3)

    diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/Makefile erlang-13.b.3-dfsg/lib/os_mon/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/Makefile 2009-03-12 12:19:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/Makefile 2009-11-20 13:30:18.000000000 +0000 @@ -24,17 +24,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(OS_MON_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=os_mon # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/os_mon-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -43,11 +38,12 @@ XML_REF3_FILES = cpu_sup.xml \ disksup.xml \ memsup.xml \ - os_mon.xml \ os_mon_mib.xml \ os_sup.xml \ nteventlog.xml +XML_REF6_FILES = os_mon_app.xml + XML_PART_FILES = part_notes.xml XML_CHAPTER_FILES = notes.xml @@ -57,6 +53,9 @@ note.gif \ warning.gif +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_REF6_FILES) $(XML_APPLICATION_FILES) # ---------------------------------------------------- @@ -64,35 +63,19 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = os_mon-$(VSN).pdf -TOP_PS_FILE = os_mon-$(VSN).ps +MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets @@ -100,58 +83,42 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) -man: $(MAN3_FILES) +man: $(MAN3_FILES) $(MAN6_FILES) gifs: $(GIF_FILES:%=$(HTMLDIR)/%) debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 + $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 + $(INSTALL_DATA) $(MAN6DIR)/* $(RELEASE_PATH)/man/man6 release_spec: diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/memsup.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/memsup.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/memsup.xml 2009-03-12 12:18:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/memsup.xml 2009-11-20 13:29:44.000000000 +0000 @@ -32,7 +32,7 @@

    memsup is a process which supervises the memory usage for the system and for individual processes. It is part of the OS_Mon - application, see os_mon(6). + application, see os_mon(6). Available for Unix, Windows and VxWorks.

    Periodically performs a memory check:

    @@ -101,8 +101,8 @@

    A timeout, in seconds, for how long the memsup process should wait for a result from a memory check. If - the timeout expires, a warning message "OS_MON (memsup) timeout" is issued via error_loger and any - pending, synchrous client calls will return a dummy value. + the timeout expires, a warning message "OS_MON (memsup) timeout" is issued via error_logger and any + pending, synchronous client calls will return a dummy value. Normally, this situation should not occur. There have been cases on Linux, however, where the pseudo file from which system data is read is temporarily unavailable when the system @@ -186,7 +186,7 @@ the memory is. buffered_memory - The amount of memory the system uses for tempory storing raw disk blocks. + The amount of memory the system uses for temporary storing raw disk blocks. cached_memory @@ -245,7 +245,7 @@

    Changes the time interval, given in minutes, for the periodic memory check.

    The change will take effect after the next memory check and is - non-persistant. That is, in case of a process restart, this + non-persistent. That is, in case of a process restart, this value is forgotten and the default value will be used. See Configuration above.

    @@ -265,7 +265,7 @@

    Changes the threshold, given as a float, for process memory allocation.

    The change will take effect during the next periodic memory - check and is non-persistant. That is, in case of a process + check and is non-persistent. That is, in case of a process restart, this value is forgotten and the default value will be used. See Configuration above.

    @@ -286,7 +286,7 @@

    Changes the threshold, given as a float, for system memory allocation.

    The change will take effect during the next periodic memory - check and is non-persistant. That is, in case of a process + check and is non-persistent. That is, in case of a process restart, this value is forgotten and the default value will be used. See Configuration above.

    @@ -312,7 +312,7 @@

    Changes the timeout value, given in seconds, for memory checks.

    The change will take effect for the next memory check and is - non-persistant. That is, in the case of a process restart, this + non-persistent. That is, in the case of a process restart, this value is forgotten and the default value will be used. See Configuration above.

    @@ -322,7 +322,7 @@
    See Also

    alarm_handler(3), - os_mon(3)

    + os_mon(3)

    diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/notes.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/notes.xml 2009-06-05 13:53:35.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/notes.xml 2009-11-20 13:31:56.000000000 +0000 @@ -26,9 +26,63 @@ nil nil nil + notes.xml

    This document describes the changes made to the OS_Mon application.

    +
    Os_Mon 2.2.4 + +
    Fixed Bugs and Malfunctions + + +

    + Memsup did not read memory correctly on MaxOSX + Snowleopard. This has now been corrected. (Thanks to Joel + Reymont)

    +

    + Own Id: OTP-8211

    +
    + +

    + Removed unused code in cpu_sup.erl.

    +

    + Own Id: OTP-8226

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    + +
    Os_Mon 2.2.3 + +
    Fixed Bugs and Malfunctions + + +

    + A missing define in memsup.c caused a build error + on IRIX machines. This has now been fixed.

    +

    + Own Id: OTP-8094

    +
    +
    +
    + +
    +
    Os_Mon 2.2.2
    Fixed Bugs and Malfunctions @@ -37,7 +91,7 @@

    disksup:get_disk_data/0 returned disk volume in bytes instead of kbytes as stated in the documentation. The - problem occured on Windows only and is now corrected.

    + problem occurred on Windows only and is now corrected.

    *** POTENTIAL INCOMPATIBILITY ***

    diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/nteventlog.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/nteventlog.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/nteventlog.xml 2009-03-12 12:19:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/nteventlog.xml 2009-11-20 13:30:37.000000000 +0000 @@ -32,7 +32,7 @@

    nteventlog provides a generic interface to the Windows event log. It is part of the OS_Mon application, see - os_mon(6). Available for + os_mon(6). Available for Windows versions where the event log is available. That is, not for Windows 98 and some other older Windows versions, but for most (all?) newer Windows versions.

    @@ -96,7 +96,7 @@
    See Also -

    os_mon(6), +

    os_mon(6), os_sup(3)

    Windows NT documentation

    diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/os_mon_app.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/os_mon_app.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/os_mon_app.xml 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/os_mon_app.xml 2009-03-12 12:18:35.000000000 +0000 @@ -0,0 +1,126 @@ + + + + +
    + + 19962009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + os_mon + + + + +
    + os_mon + OS Monitoring Application + +

    The operating system monitor, OS_Mon, provides the following + services:

    + + cpu_sup + CPU load and utilization supervision (Unix) + disksup + Disk supervision(Unix, Windows) + memsup + Memory supervision (Unix, Windows, VxWorks) + os_sup + Interface to OS system messages (Solaris, Windows) + +

    To simplify usage of OS_Mon on distributed Erlang systems, it is + not considered an error trying to use a service at a node where it + is not available (either because OS_Mon is not running, or because + the service is not available for that OS, or because the service + is not started). Instead, a warning message is issued via + error_logger and a dummy value is returned, which one is + specified in the man pages for the respective services.

    +
    + +
    + Configuration +

    When OS_Mon is started, by default all services available for + the OS, except os_sup, are automatically started. This + configuration can be changed using the following application + configuration parameters:

    + + start_cpu_sup = bool() + +

    Specifies if cpu_sup should be started. Defaults to + true.

    +
    + start_disksup = bool() + +

    Specifies if disksup should be started. Defaults to + true.

    +
    + start_memsup = bool() + +

    Specifies if memsup should be started. Defaults to + true.

    +
    + start_os_sup = bool() + +

    Specifies if os_sup should be started. Defaults to + false.

    +
    +
    +

    Configuration parameters effecting the different OS_Mon services + are described in the respective man pages.

    +

    See config(4) for + information about how to change the value of configuration + parameters.

    +
    + +
    + SNMP MIBs +

    The following MIBs are defined in OS_Mon:

    + + OTP-OS-MON-MIB + +

    This MIB contains objects for instrumentation of disk, + memory and CPU usage of the nodes in the system.

    +
    +
    +

    The MIB is stored in the mibs directory. It is defined + in SNMPv2 SMI syntax. An SNMPv1 version of the MIB is delivered + in the mibs/v1 directory.

    +

    The compiled MIB is located under priv/mibs, and + the generated .hrl file under the include directory. + To compile a MIB that IMPORTS the OTP-OS-MON-MIB, give + the option {il, ["os_mon/priv/mibs"]} to the MIB compiler.

    +

    If the MIB should be used in a system, it should be loaded into + an agent with a call to os_mon_mib:load(Agent), where + Agent is the pid or registered name of an SNMP agent. Use + os_mon_mib:unload(Agent) to unload the MIB. + The implementation of this MIB uses Mnesia to store a cache with + data needed, which implicates that Mnesia must be up and running. + The MIB also use functions defined for the OTP-MIB, thus + that MIB must be loaded as well.

    +
    + +
    + See Also +

    cpu_sup(3), + disksup(3), + memsup(3), + os_sup(3), + nteventlog(3), + snmp(3).

    +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/os_mon_mib.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/os_mon_mib.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/os_mon_mib.xml 2009-03-12 12:21:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/os_mon_mib.xml 2009-11-20 13:31:49.000000000 +0000 @@ -63,7 +63,7 @@
    See Also -

    os_mon(6), +

    os_mon(6), snmp(3)

    diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/os_mon.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/os_mon.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/os_mon.xml 2009-03-12 12:18:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/os_mon.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,126 +0,0 @@ - - - - -
    - - 19962009 - Ericsson AB. All Rights Reserved. - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - - - os_mon - - - - -
    - os_mon - OS Monitoring Application - -

    The operating system monitor, OS_Mon, provides the following - services:

    - - cpu_sup - CPU load and utilization supervision (Unix) - disksup - Disk supervision(Unix, Windows) - memsup - Memory supervision (Unix, Windows, VxWorks) - os_sup - Interface to OS system messages (Solaris, Windows) - -

    To simplify usage of OS_Mon on distributed Erlang systems, it is - not considered an error trying to use a service at a node where it - is not available (either because OS_Mon is not running, or because - the service is not available for that OS, or because the service - is not started). Instead, a warning message is issued via - error_logger and a dummy value is returned, which one is - specified in the man pages for the respective services.

    -
    - -
    - Configuration -

    When OS_Mon is started, by default all services available for - the OS, except os_sup, are automatically started. This - configuration can be changed using the following application - configuration parameters:

    - - start_cpu_sup = bool() - -

    Specifies if cpu_sup should be started. Defaults to - true.

    -
    - start_disksup = bool() - -

    Specifies if disksup should be started. Defaults to - true.

    -
    - start_memsup = bool() - -

    Specifies if memsup should be started. Defaults to - true.

    -
    - start_os_sup = bool() - -

    Specifies if os_sup should be started. Defaults to - false.

    -
    -
    -

    Configuration parameters effecting the different OS_Mon services - are described in the respective man pages.

    -

    See config(4) for - information about how to change the value of configuration - parameters.

    -
    - -
    - SNMP MIBs -

    The following MIBs are defined in OS_Mon:

    - - OTP-OS-MON-MIB - -

    This MIB contains objects for instrumentation of disk, - memory and CPU usage of the nodes in the system.

    -
    -
    -

    The MIB is stored in the mibs directory. It is defined - in SNMPv2 SMI syntax. An SNMPv1 version of the MIB is delivered - in the mibs/v1 directory.

    -

    The compiled MIB is located under priv/mibs, and - the generated .hrl file under the include directory. - To compile a MIB that IMPORTS the OTP-OS-MON-MIB, give - the option {il, ["os_mon/priv/mibs"]} to the MIB compiler.

    -

    If the MIB should be used in a system, it should be loaded into - an agent with a call to os_mon_mib:load(Agent), where - Agent is the pid or registered name of an SNMP agent. Use - os_mon_mib:unload(Agent) to unload the MIB. - The implementation of this MIB uses Mnesia to store a cache with - data needed, which implicates that Mnesia must be up and running. - The MIB also use functions defined for the OTP-MIB, thus - that MIB must be loaded as well.

    -
    - -
    - See Also -

    cpu_sup(3), - disksup(3), - memsup(3), - os_sup(3), - nteventlog(3), - snmp(3).

    -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/os_sup.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/os_sup.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/os_sup.xml 2009-03-12 12:18:46.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/os_sup.xml 2009-11-20 13:29:54.000000000 +0000 @@ -33,7 +33,7 @@

    os_sup is a process providing a message passing service from the operating system to the error logger in the Erlang runtime system. It is part of the OS_Mon application, see - os_mon(6). Available for + os_mon(6). Available for Solaris and Windows.

    Messages received from the operating system results in an user defined callback function being called. This function can do @@ -64,7 +64,7 @@

    Windows Operation -

    The Windows messages are retreived from the eventlog file.

    +

    The Windows messages are retrieved from the eventlog file.

    The nteventlog module is used to implement os_sup. See nteventlog(3). Note that the start functions of nteventlog does not need to be @@ -84,7 +84,7 @@ another notion of category, which in most cases is totally meaningless and therefore not imported into Erlang. What is called a category here is one of the main three types of - events occuring in a normal NT system.

    + events occurring in a normal NT system.

    Facility = string() @@ -232,7 +232,7 @@
    See also

    error_logger(3), - os_mon(3)

    + os_mon(3)

    syslogd(1M), syslog.conf(4) in the Solaris documentation.

    diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/part_notes.xml 2009-03-12 12:21:11.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/part_notes.xml 2009-11-20 13:31:58.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20042009 @@ -31,6 +31,6 @@

    The operating system monitor, OS_Mon, provides services for monitoring CPU load, disk usage, memory usage and OS messages.

    - + diff -Nru erlang-13.b.1-dfsg/lib/os_mon/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/os_mon/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/os_mon/doc/src/ref_man.xml 2009-03-12 12:18:45.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/doc/src/ref_man.xml 2009-11-20 13:29:53.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19962009 @@ -31,12 +31,12 @@

    The operating system monitor, OS_Mon, provides services for monitoring CPU load, disk usage, memory usage and OS messages.

    - - - - - - - + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/os_mon/src/cpu_sup.erl erlang-13.b.3-dfsg/lib/os_mon/src/cpu_sup.erl --- erlang-13.b.1-dfsg/lib/os_mon/src/cpu_sup.erl 2009-04-16 10:23:50.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/os_mon/src/cpu_sup.erl 2009-11-20 13:30:14.000000000 +0000 @@ -711,10 +711,8 @@ port_receive_cpu_util(0, _NE, Garbage, _) -> exit( {port_garbage, Garbage}); port_receive_cpu_util(NP, NE, CpuData, CpuList) -> - case port_receive_cpu_util_entries(NE, #cpu_util{}, CpuData) of - {error, Reason} -> exit({port_receive_cpu_util_entries_exit, Reason}); - {CpuUtil, Rest} -> port_receive_cpu_util(NP - 1, NE, Rest, [ CpuUtil | CpuList]) - end. + {CpuUtil, Rest} = port_receive_cpu_util_entries(NE, #cpu_util{}, CpuData), + port_receive_cpu_util(NP - 1, NE, Rest, [ CpuUtil | CpuList]). % per entry receive loop port_receive_cpu_util_entries(0, CU, Rest) -> diff -Nru erlang-13.b.1-dfsg/lib/os_mon/src/memsup.erl erlang-13.b.3-dfsg/lib/os_mon/src/memsup.erl --- erlang-13.b.1-dfsg/lib/os_mon/src/memsup.erl 2009-03-12 12:18:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/os_mon/src/memsup.erl 2009-11-20 13:29:35.000000000 +0000 @@ -722,14 +722,14 @@ %% Mac OS X 10.2.2 - the pages given are based on 4000 bytes, but %% the vm_stat command tells us that it is 4096... get_memory_usage({unix,darwin}) -> - Str = os:cmd("/usr/bin/vm_stat"), - {ok, [Free],Str2} = io_lib:fread("Pages free:~d.",skip_to_eol(Str)), - {ok, [Active],Str3} = - io_lib:fread("Pages active:~d.", skip_to_eol(Str2)), - {ok, [Inactive],Str4} = - io_lib:fread("Pages inactive:~d.", skip_to_eol(Str3)), - {ok, [Wired],_} = - io_lib:fread("Pages wired down:~d.", skip_to_eol(Str4)), + Str1 = os:cmd("/usr/bin/vm_stat"), + + {[Free], Str2} = fread_value("Pages free:~d.", Str1), + {[Active], Str3} = fread_value("Pages active:~d.", Str2), + {[Inactive], Str4} = fread_value("Pages inactive:~d.", Str3), + {[_], Str5} = fread_value("Pages speculative:~d.", Str4), + {[Wired], _} = fread_value("Pages wired down:~d.", Str5), + NMemUsed = (Wired + Active + Inactive) * 4000, NMemTotal = NMemUsed + Free * 4000, {NMemUsed,NMemTotal}; @@ -753,12 +753,15 @@ io_lib:fread("~d~d~d~d~d~d~d", Result), {TotPhys-AvailPhys, TotPhys}. -skip_to_eol([]) -> - []; -skip_to_eol([$\n | T]) -> - T; -skip_to_eol([_ | T]) -> - skip_to_eol(T). +fread_value(Format, Str0) -> + case io_lib:fread(Format, skip_to_eol(Str0)) of + {error, {fread, input}} -> {[0], Str0}; + {ok, Value, Str1} -> {Value, Str1} + end. + +skip_to_eol([]) -> []; +skip_to_eol([$\n | T]) -> T; +skip_to_eol([_ | T]) -> skip_to_eol(T). freebsd_sysctl(Def) -> list_to_integer(os:cmd("/sbin/sysctl -n " ++ Def) -- "\n"). diff -Nru erlang-13.b.1-dfsg/lib/os_mon/vsn.mk erlang-13.b.3-dfsg/lib/os_mon/vsn.mk --- erlang-13.b.1-dfsg/lib/os_mon/vsn.mk 2009-06-05 13:53:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/os_mon/vsn.mk 2009-11-20 13:30:05.000000000 +0000 @@ -1 +1 @@ -OS_MON_VSN = 2.2.2 +OS_MON_VSN = 2.2.4 diff -Nru erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/book.xml erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/book.xml 2009-03-12 12:20:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/book.xml 2009-11-20 13:31:40.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20032009 @@ -21,7 +21,7 @@ - OTP_Mibs application + OTP_Mibs Ingela Anderton 2003-04-15 @@ -34,11 +34,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/introduction.xml erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/introduction.xml --- erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/introduction.xml 2009-03-12 12:20:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/introduction.xml 2009-11-20 13:31:42.000000000 +0000 @@ -26,6 +26,7 @@ 2003-05-19 A + introduction.xml
    diff -Nru erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/Makefile erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/Makefile 2009-03-12 12:20:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/Makefile 2009-11-20 13:31:39.000000000 +0000 @@ -25,17 +25,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(OTP_MIBS_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=otp_mibs # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/otp_mibs-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- @@ -50,6 +45,10 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + GIF_FILES = note.gif # ---------------------------------------------------- @@ -58,29 +57,12 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - part.tex part_notes.tex $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PDF_FILE = otp_mibs-$(VSN).pdf -TOP_PS_FILE = otp_mibs-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -94,21 +76,13 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) @@ -116,37 +90,26 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ min_head.gif \ - $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 release_spec: diff -Nru erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/mibs.xml erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/mibs.xml --- erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/mibs.xml 2009-03-12 12:20:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/mibs.xml 2009-11-20 13:31:42.000000000 +0000 @@ -26,6 +26,7 @@ 2003-05-19 A + mibs.xml
    diff -Nru erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/notes.xml erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/notes.xml 2009-03-12 15:27:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/notes.xml 2009-11-20 13:31:59.000000000 +0000 @@ -26,10 +26,28 @@ nil nil nil + notes.xml

    This document describes the changes made to the OTP_Mibs application.

    +
    Otp_Mibs 1.0.6 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    +
    Otp_Mibs 1.0.5
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/part_notes.xml 2009-03-12 12:21:12.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/part_notes.xml 2009-11-20 13:32:00.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20042009 @@ -31,7 +31,7 @@

    The OTP_Mibs application provides an SNMP management information base for Erlang nodes.

    - + diff -Nru erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/part.xml erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/part.xml 2009-03-12 12:20:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/part.xml 2009-11-20 13:31:42.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20032009 @@ -31,8 +31,8 @@

    The OTP_Mibs application provides an SNMP management information base for Erlang nodes.

    - - + + diff -Nru erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/otp_mibs/doc/src/ref_man.xml 2009-03-12 12:20:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/otp_mibs/doc/src/ref_man.xml 2009-11-20 13:31:39.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20032009 @@ -31,7 +31,7 @@

    The OTP_Mibs application provides an SNMP management information base for Erlang nodes.

    - + diff -Nru erlang-13.b.1-dfsg/lib/otp_mibs/vsn.mk erlang-13.b.3-dfsg/lib/otp_mibs/vsn.mk --- erlang-13.b.1-dfsg/lib/otp_mibs/vsn.mk 2009-03-12 12:20:40.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/otp_mibs/vsn.mk 2009-11-20 13:31:39.000000000 +0000 @@ -1,4 +1,4 @@ -OTP_MIBS_VSN = 1.0.5 +OTP_MIBS_VSN = 1.0.6 # Note: The branch 'otp_mibs' is defunct as of otp_mibs-1.0.4 and # should NOT be used again. diff -Nru erlang-13.b.1-dfsg/lib/parsetools/doc/src/book.xml erlang-13.b.3-dfsg/lib/parsetools/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/parsetools/doc/src/book.xml 2009-03-12 12:23:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/parsetools/doc/src/book.xml 2009-11-20 13:33:57.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19972009 @@ -21,7 +21,7 @@ - Parse Tools Application (PARSETOOLS) + Parse Tools Carl Velin 1997-05-02 @@ -30,13 +30,16 @@
    - Parse Tools Application (PARSETOOLS) + Parse Tools - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/parsetools/doc/src/leex.xml erlang-13.b.3-dfsg/lib/parsetools/doc/src/leex.xml --- erlang-13.b.1-dfsg/lib/parsetools/doc/src/leex.xml 2009-06-05 13:54:38.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/parsetools/doc/src/leex.xml 2009-11-20 13:34:48.000000000 +0000 @@ -8,7 +8,7 @@ Ericsson AB. All Rights Reserved.
    - Copyright (c) 2008 Robert Virding. All rights reserved. + Copyright (c) 2008,2009 Robert Virding. All rights reserved. leex @@ -254,13 +254,13 @@ <Token Rules> -Erlang Code. +Erlang code. -<Erlang Code> +<Erlang code> -

    The "Definitions.", "Rules." and "Erlang Code." headings are +

    The "Definitions.", "Rules." and "Erlang code." headings are mandatory and must occur at the beginning of a source line. The - <Header>, <Macro Definitions> and <Erlang Code> + <Header>, <Macro Definitions> and <Erlang code> sections may be empty but there must be at least one rule.

    Macro definitions have the following format:

    @@ -347,7 +347,7 @@ {D}+\\.{D}+((E|e)(\\+|\\-)?{D}+)? : {token,{float,TokenLine,list_to_float(TokenChars)}}.
    -

    The Erlang code in the "Erlang Code." section is written into +

    The Erlang code in the "Erlang code." section is written into the output file directly after the module declaration and predefined exports declaration so it is possible to add extra exports, define imports and other attributes which are then @@ -450,6 +450,6 @@

    Anchoring a regular expression with ^ and $ is not implemented in the current version of Leex and just - generates an error.

    + generates a parse error.

    diff -Nru erlang-13.b.1-dfsg/lib/parsetools/doc/src/Makefile erlang-13.b.3-dfsg/lib/parsetools/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/parsetools/doc/src/Makefile 2009-06-05 13:54:23.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/parsetools/doc/src/Makefile 2009-11-20 13:33:57.000000000 +0000 @@ -25,17 +25,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(PARSETOOLS_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=parsetools # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/parsetools-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -48,6 +43,10 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + GIF_FILES = \ note.gif @@ -61,29 +60,12 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PDF_FILE = parsetools-$(VSN).pdf -TOP_PS_FILE = parsetools-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -97,21 +79,19 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) pdf: $(TOP_PDF_FILE) -ps: $(TOP_PS_FILE) +html: gifs $(HTML_REF_MAN_FILE) -html: $(HTML_FILES) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ man: $(MAN3_FILES) @@ -119,36 +99,21 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) - # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/parsetools/doc/src/notes.xml erlang-13.b.3-dfsg/lib/parsetools/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/parsetools/doc/src/notes.xml 2009-06-05 13:54:24.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/parsetools/doc/src/notes.xml 2009-11-20 13:34:01.000000000 +0000 @@ -26,9 +26,35 @@ nil nil nil + notes.xml

    This document describes the changes made to the Parsetools application.

    +
    Parsetools 2.0.1 + +
    Improvements and New Features + + +

    Leex no longer uses the deprecated regexp + module. (Thanks to Robert Virding.).

    +

    + Own Id: OTP-8231

    +
    +
    +
    + +
    Fixed Bugs and Malfunctions + + +

    A minor bug in leex(3) has been fixed.

    +

    + Own Id: OTP-8197

    +
    +
    +
    + +
    +
    Parsetools 2.0
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/parsetools/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/parsetools/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/parsetools/doc/src/part_notes.xml 2009-06-05 13:54:24.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/parsetools/doc/src/part_notes.xml 2009-11-20 13:34:00.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19972009 @@ -38,6 +38,6 @@

    There are also release notes for older versions.

    - + diff -Nru erlang-13.b.1-dfsg/lib/parsetools/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/parsetools/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/parsetools/doc/src/ref_man.xml 2009-06-05 13:54:24.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/parsetools/doc/src/ref_man.xml 2009-11-20 13:33:57.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19972009 @@ -36,7 +36,7 @@ code for a parser as output. Leex is a regular expression based lexical analyzer generator for Erlang, similar to lex or flex.

    - - + + diff -Nru erlang-13.b.1-dfsg/lib/parsetools/src/leex.erl erlang-13.b.3-dfsg/lib/parsetools/src/leex.erl --- erlang-13.b.1-dfsg/lib/parsetools/src/leex.erl 2009-06-05 13:54:39.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/parsetools/src/leex.erl 2009-11-20 13:34:49.000000000 +0000 @@ -1,4 +1,4 @@ -%% Copyright (c) 2008 Robert Virding. All rights reserved. +%% Copyright (c) 2008,2009 Robert Virding. All rights reserved. %% %% Redistribution and use in source and binary forms, with or without %% modification, are permitted provided that the following conditions @@ -34,16 +34,19 @@ -export([compile/3,file/1,file/2,format_error/1]). --import(lists, [member/2,reverse/1,sort/1,keysearch/3,keysort/2, - map/2,foldl/3,foreach/2,flatmap/2, - delete/2,keydelete/3]). --import(string, [substr/2,substr/3,span/2,tokens/2]). +-import(lists, [member/2,reverse/1,sort/1,delete/2, + keysearch/3,keysort/2,keydelete/3,keyfind/3, + map/2,foldl/3,foreach/2,flatmap/2]). +-import(string, [substr/2,substr/3,span/2]). -import(ordsets, [is_element/2,add_element/2,union/2]). -import(orddict, [store/3]). -include("erl_compile.hrl"). +%%-include_lib("stdlib/include/erl_compile.hrl"). -define(LEEXINC, "leexinc.hrl"). % Include file +-define(LEEXLIB, parsetools). % Leex is in lib parsetools +%%-define(LEEXLIB, leex). % Leex is in lib leex -define(DEFS_HEAD, "Definitions."). -define(RULE_HEAD, "Rules."). @@ -55,6 +58,7 @@ gfile=[], % Graph file module, % Module name opts=[], % Options + posix=false, % POSIX regular expressions errors=[], warnings=[] }). @@ -120,13 +124,21 @@ format_error(missing_code) -> "missing Erlang code"; format_error(empty_rules) -> "no rules"; format_error(bad_rule) -> "bad rule"; -format_error({regexp,E})-> ["bad regexp `",regexp:format_error(E),"'"]; -format_error({after_regexp,S}) -> - ["bad code after regexp ",io_lib:write_string(S)]; +format_error({regexp,E})-> + Es = case E of + {interval_range,_} -> "interval range"; + {unterminated,Cs} -> + "unterminated " ++ Cs; + {illegal_char,Cs} -> + "illegal character " ++ Cs; + {posix_cc,What} -> + ["illegal POSIX character class ",io_lib:write_string(What)]; + {char_class,What} -> + ["illegal character class ",io_lib:write_string(What)] + end, + ["bad regexp `",Es,"'"]; format_error(ignored_characters) -> - "ignored characters"; -format_error(not_yet_implemented) -> - "anchoring a regular expression with ^ and $ is not yet implemented". + "ignored characters". %%% %%% Local functions @@ -350,79 +362,87 @@ {ok,Xfile} -> try verbose_print(St0, "Parsing file ~s, ", [St0#leex.xfile]), - {ok,REAs,Actions,Code,St1} = parse_head(St0, Xfile), + %% We KNOW that errors throw so we can ignore them here. + {ok,Line1,St1} = parse_head(Xfile, St0), + {ok,Line2,Macs,St2} = parse_defs(Xfile, Line1, St1), + {ok,Line3,REAs,Actions,St3} = + parse_rules(Xfile, Line2, Macs, St2), + {ok,Code,St4} = parse_code(Xfile, Line3, St3), verbose_print(St1, "contained ~w rules.~n", [length(REAs)]), - {ok,REAs,Actions,Code,St1} + {ok,REAs,Actions,Code,St4} after file:close(Xfile) end; {error,Error} -> add_error({none,leex,{file_error,Error}}, St0) end. -%% parse_head(State, File) +%% parse_head(File, State) -> {ok,NextLine,State}. %% Parse the head of the file. Skip all comments and blank lines. -parse_head(St, Ifile) -> parse_defs(St, Ifile, nextline(Ifile, 0)). +parse_head(Ifile, St) -> {ok,nextline(Ifile, 0),St}. -%% parse_defs(State, File, Line) +%% parse_defs(File, Line, State) -> {ok,NextLine,Macros,State}. %% Parse the macro definition section of a file. This must exist. +%% The section is ended by a non-blank line which is not a macro def. -parse_defs(St, Ifile, {ok,?DEFS_HEAD ++ Rest,L}) -> - St1 = warn_ignored_chars(St, L, Rest), - parse_defs(St1, Ifile, nextline(Ifile, L), []); -parse_defs(St, _, {ok,_,L}) -> +parse_defs(Ifile, {ok,?DEFS_HEAD ++ Rest,L}, St) -> + St1 = warn_ignored_chars(L, Rest, St), + parse_defs(Ifile, nextline(Ifile, L), [], St1); +parse_defs(_, {ok,_,L}, St) -> add_error({L,leex,missing_defs}, St); -parse_defs(St, _, {eof,L}) -> +parse_defs(_, {eof,L}, St) -> add_error({L,leex,missing_defs}, St). -parse_defs(St, Ifile, {ok,Chars,L}, Ms) -> - case tokens(Chars, " \t\n") of % Also strips \n from eol! - [Name,"=",Def] -> - parse_defs(St, Ifile, nextline(Ifile, L), [{Name,Def}|Ms]); - _ -> % Anything else - parse_rules(St, Ifile, {ok,Chars,L}, Ms) +parse_defs(Ifile, {ok,Chars,L}=Line, Ms, St) -> + %% This little beauty matches out a macro definition, RE's are so clear. + MS = "^[ \t]*([A-Z_][A-Za-z0-9_]*)[ \t]*=[ \t]*([^ \t\r\n]*)[ \t\r\n]*\$", + case re:run(Chars, MS, [{capture,all_but_first,list}]) of + {match,[Name,Def]} -> + %%io:fwrite("~p = ~p\n", [Name,Def]), + parse_defs(Ifile, nextline(Ifile, L), [{Name,Def}|Ms], St); + _ -> {ok,Line,Ms,St} % Anything else end; -parse_defs(St, Ifile, Line, Ms) -> - parse_rules(St, Ifile, Line, Ms). +parse_defs(_, Line, Ms, St) -> + {ok,Line,Ms,St}. -%% parse_rules(State, File, Line, Macros) +%% parse_rules(File, Line, Macros, State) -> {ok,NextLine,REAs,Actions,State}. %% Parse the RE rules section of the file. This must exist. -parse_rules(St, Ifile, {ok,?RULE_HEAD ++ Rest,L}, Ms) -> - St1 = warn_ignored_chars(St, L, Rest), - parse_rules(St1, Ifile, nextline(Ifile, L), Ms, [], [], 0); -parse_rules(St, _, {ok,_,L}, _) -> +parse_rules(Ifile, {ok,?RULE_HEAD ++ Rest,L}, Ms, St) -> + St1 = warn_ignored_chars(L, Rest, St), + parse_rules(Ifile, nextline(Ifile, L), Ms, [], [], 0, St1); +parse_rules(_, {ok,_,L}, _, St) -> add_error({L,leex,missing_rules}, St); -parse_rules(St, _, {eof,L}, _) -> +parse_rules(_, {eof,L}, _, St) -> add_error({L,leex,missing_rules}, St). -%% parse_rules(State, File, Result, Macros, RegExpActions, Actions, Acount) -> -%% {ok,RegExpActions,Actions,Code,NewState} | throw(NewState) +%% parse_rules(File, Result, Macros, RegExpActions, Actions, Acount, State) -> +%% {ok,NextCLine,RegExpActions,Actions,NewState} | throw(NewState) -parse_rules(St, Ifile, NextLine, Ms, REAs, As, N) -> +parse_rules(Ifile, NextLine, Ms, REAs, As, N, St) -> case NextLine of {ok,?CODE_HEAD ++ _Rest,_} -> - parse_rules_end(St, Ifile, NextLine, REAs, As); + parse_rules_end(Ifile, NextLine, REAs, As, St); {ok,Chars,L0} -> %%io:fwrite("~w: ~p~n", [L0,Chars]), case collect_rule(Ifile, Chars, L0) of {ok,Re,Atoks,L1} -> - {ok,REA,A,St1} = parse_rule(St, Re, L0, Atoks, Ms, N), - parse_rules(St1, Ifile, nextline(Ifile, L1), Ms, - [REA|REAs], [A|As], N+1); + {ok,REA,A,St1} = parse_rule(Re, L0, Atoks, Ms, N, St), + parse_rules(Ifile, nextline(Ifile, L1), Ms, + [REA|REAs], [A|As], N+1, St1); {error,E} -> add_error(E, St) end; {eof,_} -> - parse_rules_end(St, Ifile, NextLine, REAs, As) + parse_rules_end(Ifile, NextLine, REAs, As, St) end. -parse_rules_end(St, _, {ok,_,L}, [], []) -> +parse_rules_end(_, {ok,_,L}, [], [], St) -> add_error({L,leex,empty_rules}, St); -parse_rules_end(St, _, {eof,L}, [], []) -> +parse_rules_end(_, {eof,L}, [], [], St) -> add_error({L,leex,empty_rules}, St); -parse_rules_end(St, Ifile, NextLine, REAs, As) -> +parse_rules_end(_, NextLine, REAs, As, St) -> %% Must be *VERY* careful to put rules in correct order! - parse_code(St, Ifile, NextLine, reverse(REAs), reverse(As)). + {ok,NextLine,reverse(REAs),reverse(As),St}. %% collect_rule(File, Line, Lineno) -> %% {ok,RegExp,ActionTokens,NewLineno} | {error,E}. @@ -430,7 +450,9 @@ %% action has been read. Keep track of line number. collect_rule(Ifile, Chars, L0) -> - {match,St,Len} = regexp:first_match(Chars, "[^ \t\r\n]+"), + %% Erlang strings are 1 based, but re 0 :-( + {match,[{St0,Len}|_]} = re:run(Chars, "[^ \t\r\n]+"), + St = St0 + 1, %%io:fwrite("RE = ~p~n", [substr(Chars, St, Len)]), case collect_action(Ifile, substr(Chars, St+Len), L0, []) of {ok,[{':',_}|Toks],L1} -> {ok,substr(Chars, St, Len),Toks,L1}; @@ -448,84 +470,65 @@ collect_action(Ifile, io:get_line(Ifile, leex), L0+1, Cont1) end. -%% parse_rule(State, RegExpString, RegExpLine, ActionTokens, Macros, Counter) +%% parse_rule(RegExpString, RegExpLine, ActionTokens, Macros, Counter, State) -> +%% {ok,{RE,Action},ActionData,State}. %% Parse one regexp after performing macro substition. -parse_rule(St, S, Line, [{dot,_}], Ms, N) -> - case parse_rule_regexp(S, Ms) of +parse_rule(S, Line, [{dot,_}], Ms, N, St) -> + case parse_rule_regexp(S, Ms, St) of {ok,R} -> - ok = anchors_not_yet_implemented(St, R, Line), {ok,{R,N},{N,empty_action},St}; {error,E} -> - add_error({Line,leex,{regexp,E}}, St) + add_error({Line,leex,E}, St) end; -parse_rule(St, S, Line, Atoks, Ms, N) -> - case parse_rule_regexp(S, Ms) of +parse_rule(S, Line, Atoks, Ms, N, St) -> + case parse_rule_regexp(S, Ms, St) of {ok,R} -> - ok = anchors_not_yet_implemented(St, R, Line), - case erl_parse:parse_exprs(Atoks) of - {ok,_Aes} -> - %% Check for token variables. - TokenChars = var_used('TokenChars', Atoks), - TokenLen = var_used('TokenLen', Atoks), - TokenLine = var_used('TokenLine', Atoks), - {ok,{R,N},{N,Atoks,TokenChars,TokenLen,TokenLine},St}; - {error,_} -> - add_error({Line,leex,{after_regexp,S}}, St) - end; + %%io:fwrite("RE = ~p~n", [R]), + %% Check for token variables. + TokenChars = var_used('TokenChars', Atoks), + TokenLen = var_used('TokenLen', Atoks), + TokenLine = var_used('TokenLine', Atoks), + {ok,{R,N},{N,Atoks,TokenChars,TokenLen,TokenLine},St}; {error,E} -> - add_error({Line,leex,{regexp,E}}, St) - end. - -anchors_not_yet_implemented(St, R, L) -> - case catch build_nfa(R, 1, 0) of - {'EXIT', _} -> - add_error({L,leex,not_yet_implemented}, St); - _ -> - ok + add_error({Line,leex,E}, St) end. var_used(Name, Toks) -> - case keysearch(Name, 3, Toks) of - {value,{var,_,Name}} -> true; + case keyfind(Name, 3, Toks) of + {var,_,Name} -> true; %It's the var we want _ -> false end. -%% parse_rule_regexp(RegExpString, Macros) -> {ok,RegExp} | {error,Error}. -%% Substitute in macros and parse RegExpString. Cannot use regexp:gsub +%% parse_rule_regexp(RegExpString, Macros, State) -> +%% {ok,RegExp} | {error,Error}. +%% Substitute in macros and parse RegExpString. Cannot use re:replace %% here as it uses info in replace string (&). -parse_rule_regexp(RE0, [{M,Exp}|Ms]) -> - case regexp:matches(RE0, "{" ++ M ++ "}") of - {match,Mats} -> - RE1 = sub_repl(Mats, Exp, RE0, 1), - parse_rule_regexp(RE1, Ms); - {error,_} -> - parse_rule_regexp(RE0, Ms) - end; -parse_rule_regexp(RE, []) -> +parse_rule_regexp(RE0, [{M,Exp}|Ms], St) -> + Split= re:split(RE0, "\\{" ++ M ++ "\\}", [{return,list}]), + RE1 = string:join(Split, Exp), + parse_rule_regexp(RE1, Ms, St); +parse_rule_regexp(RE, [], St) -> %%io:fwrite("RE = ~p~n", [RE]), - regexp:parse(RE). - -sub_repl([{St,L}|Ss], Rep, S, Pos) -> - Rs = sub_repl(Ss, Rep, S, St+L), - substr(S, Pos, St-Pos) ++ Rep ++ Rs; -sub_repl([], _Rep, S, Pos) -> substr(S, Pos). + case re_parse(RE, St) of + {ok,R} -> {ok,R}; + {error,E} -> {error,{regexp,E}} + end. -%% parse_code(State, File, Line, REAs, Actions) -> -%% {ok,RegExpActions,Actions,CodeLine,NewState}. +%% parse_code(File, Line, State) -> {ok,Code,NewState}. %% Finds the line and the position where the code section of the file %% begins. This must exist. -parse_code(St, Ifile, {ok,?CODE_HEAD ++ Rest,CodeL}, REAs, As) -> - St1 = warn_ignored_chars(St, CodeL, Rest), +parse_code(Ifile, {ok,?CODE_HEAD ++ Rest,CodeL}, St) -> + St1 = warn_ignored_chars(CodeL, Rest, St), {ok, CodePos} = file:position(Ifile, cur), %% Just count the lines; copy the code from file to file later. NCodeLines = count_lines(Ifile, 0), - {ok,REAs,As,{CodeL,CodePos,NCodeLines},St1}; -parse_code(St, _, {ok,_,L}, _, _) -> + {ok,{CodeL,CodePos,NCodeLines},St1}; +parse_code(_, {ok,_,L}, St) -> add_error({L,leex,missing_code}, St); -parse_code(St, _, {eof,L}, _, _) -> +parse_code(_, {eof,L}, St) -> add_error({L,leex,missing_code}, St). count_lines(File, N) -> @@ -548,7 +551,7 @@ end end. -warn_ignored_chars(St, Line, S) -> +warn_ignored_chars(Line, S, St) -> case non_white(S) of [] -> St; _ -> add_warning(Line, ignored_characters, St) @@ -557,6 +560,266 @@ non_white(S) -> [C || C <- S, C > $\s, C < $\200 orelse C > $\240]. +%% This is the regular expression grammar used. It is equivalent to the +%% one used in AWK, except that we allow ^ $ to be used anywhere and fail +%% in the matching. +%% +%% reg -> alt : '$1'. +%% alt -> seq "|" seq ... : {alt,['$1','$2'...]}. +%% seq -> repeat repeat ... : {seq,['$1','$2'...]}. +%% repeat -> repeat "*" : {kclosure,'$1'}. +%% repeat -> repeat "+" : {pclosure,'$1'}. +%% repeat -> repeat "?" : {optional,'$1'}. +%% repeat -> repeat "{" [Min],[Max] "}" : {interval,'$1',Min,Max} +%% repeat -> single : '$1'. +%% single -> "(" reg ")" : {sub,'$2',Number}. +%% single -> "^" : bos/bol. +%% single -> "$" : eos/eol. +%% single -> "." : any. +%% single -> "[" class "]" : {char_class,char_class('$2')} +%% single -> "[" "^" class "]" : {comp_class,char_class('$3')}. +%% single -> "\"" chars "\"" : {lit,'$2'}. +%% single -> "\\" char : {lit,['$2']}. +%% single -> char : {lit,['$1']}. +%% single -> empty : epsilon. +%% The grammar of the current regular expressions. The actual parser +%% is a recursive descent implementation of the grammar. + +%% re_parse(Chars, State) -> {ok,RegExp} | {error,Error}. + +re_parse(Cs0, St) -> + case catch re_reg(Cs0, 0, St) of + {RE,_,[]} -> {ok,RE}; + {_,_,[C|_]} -> {error,{illegal_char,[C]}}; + {parse_error,E} -> {error,E} + end. + +parse_error(E) -> throw({parse_error,E}). + +re_reg(Cs, Sn, St) -> re_alt(Cs, Sn, St). + +re_alt(Cs0, Sn0, St) -> + {L,Sn1,Cs1} = re_seq(Cs0, Sn0, St), + case re_alt1(Cs1, Sn1, St) of + {[],Sn2,Cs2} -> {L,Sn2,Cs2}; + {Rs,Sn2,Cs2} -> {{alt,[L|Rs]},Sn2,Cs2} + end. + +re_alt1([$||Cs0], Sn0, St) -> + {L,Sn1,Cs1} = re_seq(Cs0, Sn0, St), + {Rs,Sn2,Cs2} = re_alt1(Cs1, Sn1, St), + {[L|Rs],Sn2,Cs2}; +re_alt1(Cs, Sn, _) -> {[],Sn,Cs}. + +%% Parse a sequence of regexps. Don't allow the empty sequence. +%% re_seq(Cs0, Sn0, St) -> +%% {L,Sn1,Cs1} = repeat(Cs0, Sn0, St), +%% case re_seq1(Cs1, Sn1, St) of +%% {[],Sn2,Cs2} -> {L,Sn2,Cs2}; +%% {Rs,Sn2,Cs2} -> {{seq,[L|Rs]},Sn2,Cs2} +%% end. + +%% re_seq(Chars, SubNumber, State) -> {RegExp,SubNumber,Chars}. +%% Parse a sequence of regexps. Allow the empty sequence, returns epsilon. + +re_seq(Cs0, Sn0, St) -> + case re_seq1(Cs0, Sn0, St) of + {[],Sn1,Cs1} -> {epsilon,Sn1,Cs1}; + {[R],Sn1,Cs1} -> {R,Sn1,Cs1}; + {Rs,Sn1,Cs1} -> {{seq,Rs},Sn1,Cs1} + end. + +re_seq1([C|_]=Cs0, Sn0, St) when C /= $|, C /= $) -> + {L,Sn1,Cs1} = re_repeat(Cs0, Sn0, St), + {Rs,Sn2,Cs2} = re_seq1(Cs1, Sn1, St), + {[L|Rs],Sn2,Cs2}; +re_seq1(Cs, Sn, _) -> {[],Sn,Cs}. + +%% re_repeat(Chars, SubNumber, State) -> {RegExp,SubNumber,Chars}. + +re_repeat(Cs0, Sn0, St) -> + {S,Sn1,Cs1} = re_single(Cs0, Sn0, St), + re_repeat1(Cs1, Sn1, S, St). + +re_repeat1([$*|Cs], Sn, S, St) -> re_repeat1(Cs, Sn, {kclosure,S}, St); +re_repeat1([$+|Cs], Sn, S, St) -> re_repeat1(Cs, Sn, {pclosure,S}, St); +re_repeat1([$?|Cs], Sn, S, St) -> re_repeat1(Cs, Sn, {optional,S}, St); +%% { only starts interval when ere is true, otherwise normal character. +re_repeat1([${|Cs0], Sn, S, #leex{posix=true}=St) -> % $} + case re_interval_range(Cs0) of + {Min,Max,[$}|Cs1]} when is_integer(Min), is_integer(Max), Min =< Max -> + re_repeat1(Cs1, Sn, {interval,S,Min,Max}, St); + {Min,Max,[$}|Cs1]} when is_integer(Min), is_atom(Max) -> + re_repeat1(Cs1, Sn, {interval,S,Min,Max}, St); + {_,_,Cs1} -> parse_error({interval_range,string_between([${|Cs0], Cs1)}) + end; +re_repeat1(Cs, Sn, S, _) -> {S,Sn,Cs}. + +%% re_single(Chars, SubNumber, State) -> {RegExp,SubNumber,Chars}. +%% Parse a re_single regexp. + +re_single([$(|Cs0], Sn0, St) -> % $) + Sn1 = Sn0 + 1, % Keep track of sub count anyway + case re_reg(Cs0, Sn1, St) of + {S,Sn2,[$)|Cs1]} -> {S,Sn2,Cs1}; + %%{S,Sn2,[$)|Cs1]} -> {{sub,S,Sn1},Sn2,Cs1}; + _ -> parse_error({unterminated,"("}) + end; +%% These are not legal inside a regexp. +%% re_single([$^|Cs], Sn, St) -> {bos,Sn,Cs}; +%% re_single([$$|Cs], Sn, St) -> {eos,Sn,Cs}; +%% re_single([$.|Cs], Sn, St) -> {any,Sn,Cs}; +re_single([$.|Cs], Sn, _) -> {{comp_class,"\n"},Sn,Cs}; % Do this here? +re_single("[^" ++ Cs0, Sn, St) -> + case re_char_class(Cs0, St) of + {Cc,[$]|Cs1]} -> {{comp_class,Cc},Sn,Cs1}; + _ -> parse_error({unterminated,"["}) + end; +re_single([$[|Cs0], Sn, St) -> + case re_char_class(Cs0, St) of + {Cc,[$]|Cs1]} -> {{char_class,Cc},Sn,Cs1}; + _ -> parse_error({unterminated,"["}) + end; +re_single([$\\|Cs0], Sn, _) -> + {C,Cs1} = re_char($\\, Cs0), + {{lit,[C]},Sn,Cs1}; +re_single([C|Cs0], Sn, St) -> + case special_char(C, St) of + true -> parse_error({illegal_char,[C]}); + false -> + {C,Cs1} = re_char(C, Cs0), + {{lit,[C]},Sn,Cs1} + end. + +-define(IS_HEX(C), C >= $0 andalso C =< $9 orelse + C >= $A andalso C =< $F orelse + C >= $a andalso C =< $f). + +%% re_char(Char, Chars) -> {CharValue,Chars}. +%% Reads one character value from the input list, it knows about escapes. + +re_char($\\, [O1,O2,O3|S]) when + O1 >= $0, O1 =< $7, O2 >= $0, O2 =< $7, O3 >= $0, O3 =< $7 -> + {(O1*8 + O2)*8 + O3 - 73*$0,S}; +re_char($\\, [$x,H1,H2|S]) when ?IS_HEX(H1), ?IS_HEX(H2) -> + {erlang:list_to_integer([H1,H2], 16),S}; +re_char($\\,[$x,${|S0]) -> + re_hex(S0, []); +re_char($\\,[$x|_]) -> + parse_error({illegal_char,"\\x"}); +re_char($\\, [C|S]) -> {escape_char(C),S}; +re_char($\\, []) -> parse_error({unterminated,"\\"}); +re_char(C, S) -> {C,S}. % Just this character + +re_hex([C|Cs], L) when ?IS_HEX(C) -> re_hex(Cs, [C|L]); +re_hex([$}|S], L0) -> + L = lists:reverse(L0), + case erlang:list_to_integer(L, 16) of + C when C =< 16#10FFFF -> {C,S}; + _ -> parse_error({illegal_char,[$\\,$x,${|L]++"}"}) + end; +re_hex(_, _) -> parse_error({unterminated,"\\x{"}). + +%% special_char(Char, State) -> bool(). +%% These are the special characters for an ERE. +%% N.B. ]}) are only special in the context after [{(. + +special_char($^, _) -> true; +special_char($., _) -> true; +special_char($[, _) -> true; +special_char($$, _) -> true; +special_char($(, _) -> true; +special_char($), _) -> true; +special_char($|, _) -> true; +special_char($*, _) -> true; +special_char($+, _) -> true; +special_char($?, _) -> true; +special_char(${, #leex{posix=true}) -> true; % Only when POSIX set +special_char($\\, _) -> true; +special_char(_, _) -> false. + +%% re_char_class(Chars, State) -> {CharClass,Chars}. +%% Parse a character class. + +re_char_class([$]|Cs], St) -> % Must special case this. + re_char_class(Cs, [$]], St); +re_char_class(Cs, St) -> re_char_class(Cs, [], St). + +re_char_class("[:" ++ Cs0, Cc, #leex{posix=true}=St) -> + %% POSIX char class only. + case posix_cc(Cs0) of + {Pcl,":]" ++ Cs1} -> re_char_class(Cs1, [{posix,Pcl}|Cc], St); + {_,Cs1} -> parse_error({posix_cc,string_between(Cs0, Cs1)}) + end; +re_char_class([C1|Cs0], Cc, St) when C1 /= $] -> + case re_char(C1, Cs0) of + {Cf,[$-,C2|Cs1]} when C2 /= $] -> + case re_char(C2, Cs1) of + {Cl,Cs2} when Cf < Cl -> + re_char_class(Cs2, [{range,Cf,Cl}|Cc], St); + {_,Cs2} -> + parse_error({char_class,string_between([C1|Cs0], Cs2)}) + end; + {C,Cs1} -> re_char_class(Cs1, [C|Cc], St) + end; +re_char_class(Cs, Cc, _) -> {reverse(Cc),Cs}. % Preserve order + +%% posix_cc(String) -> {PosixClass,RestString}. +%% Handle POSIX character classes. + +posix_cc("alnum" ++ Cs) -> {alnum,Cs}; +posix_cc("alpha" ++ Cs) -> {alpha,Cs}; +posix_cc("blank" ++ Cs) -> {blank,Cs}; +posix_cc("cntrl" ++ Cs) -> {cntrl,Cs}; +posix_cc("digit" ++ Cs) -> {digit,Cs}; +posix_cc("graph" ++ Cs) -> {graph,Cs}; +posix_cc("lower" ++ Cs) -> {lower,Cs}; +posix_cc("print" ++ Cs) -> {print,Cs}; +posix_cc("punct" ++ Cs) -> {punct,Cs}; +posix_cc("space" ++ Cs) -> {space,Cs}; +posix_cc("upper" ++ Cs) -> {upper,Cs}; +posix_cc("xdigit" ++ Cs) -> {xdigit,Cs}; +posix_cc(Cs) -> parse_error({posix_cc,substr(Cs, 1, 5)}). + +escape_char($n) -> $\n; % \n = LF +escape_char($r) -> $\r; % \r = CR +escape_char($t) -> $\t; % \t = TAB +escape_char($v) -> $\v; % \v = VT +escape_char($b) -> $\b; % \b = BS +escape_char($f) -> $\f; % \f = FF +escape_char($e) -> $\e; % \e = ESC +escape_char($s) -> $\s; % \s = SPACE +escape_char($d) -> $\d; % \d = DEL +escape_char(C) -> C. % Pass it straight through + +%% re_interval_range(Chars) -> {Min,Max,RestChars}. +%% NoInt -> none,none +%% Int -> Int,none +%% Int, -> Int,any +%% Int1,Int2 -> Int1,Int2 + +re_interval_range(Cs0) -> + case re_number(Cs0) of + {none,Cs1} -> {none,none,Cs1}; + {N,[$,|Cs1]} -> + case re_number(Cs1) of + {none,Cs2} -> {N,any,Cs2}; + {M,Cs2} -> {N,M,Cs2} + end; + {N,Cs1} -> {N,none,Cs1} + end. + +re_number([C|Cs]) when C >= $0, C =< $9 -> + re_number(Cs, C - $0); +re_number(Cs) -> {none,Cs}. + +re_number([C|Cs], Acc) when C >= $0, C =< $9 -> + re_number(Cs, 10*Acc + (C - $0)); +re_number(Cs, Acc) -> {Acc,Cs}. + +string_between(Cs1, Cs2) -> + substr(Cs1, 1, length(Cs1)-length(Cs2)). + %% We use standard methods, Thompson's construction and subset %% construction, to create first an NFA and then a DFA from the %% regexps. A non-standard feature is that we work with sets of @@ -612,8 +875,8 @@ epsilon_trans(Firsts) -> [ {epsilon,F} || F <- Firsts ]. %% build_nfa(RegExp, NextState, Action) -> {NFA,NextState,FirstState}. -%% When building the NFA states for a ??? we don't build the end -%% state, just allocate a State for it and return this state +%% When building the NFA states for a regexp we don't build the end +%% state, just allocate a State for it and return this state's %% number. This allows us to avoid building unnecessary states for %% concatenation which would then have to be removed by overwriting %% an existing state. @@ -623,21 +886,17 @@ {[#nfa_state{no=E,accept={accept,Action}}|NFA],N1,N0}. %% build_nfa(RegExp, NextState, FirstState, NFA) -> {NFA,NextState,EndState}. -%% The NFA is a list of nfa_state is no predefined order. The state -%% number of the returned EndState is already allocated! - -build_nfa({'or',RE1,RE2}, N0, F, NFA0) -> - {NFA1,N1,E1} = build_nfa(RE1, N0+1, N0, NFA0), - {NFA2,N2,E2} = build_nfa(RE2, N1+1, N1, NFA1), - E = N2, % End state - {[#nfa_state{no=F,edges=[{epsilon,N0},{epsilon,N1}]}, - #nfa_state{no=E1,edges=[{epsilon,E}]}, - #nfa_state{no=E2,edges=[{epsilon,E}]}|NFA2], - N2+1,E}; -build_nfa({concat,RE1, RE2}, N0, F, NFA0) -> - {NFA1,N1,E1} = build_nfa(RE1, N0, F, NFA0), - {NFA2,N2,E2} = build_nfa(RE2, N1, E1, NFA1), - {NFA2,N2,E2}; +%% Build an NFA from the RegExp. NFA is a list of #nfa_state{} in no +%% predefined order. NextState is the number of the next free state +%% to use, FirstState is the the state which must be the start for +%% this regexp as a previous regexp refers to it, EndState is the +%% state to which this NFA will exit to. The number of the returned +%% EndState is already allocated! + +build_nfa({alt,REs}, N, F, NFA) -> + build_nfa_alt(REs, N, F, NFA); +build_nfa({seq,REs}, N, F, NFA) -> + build_nfa_seq(REs, N, F, NFA); build_nfa({kclosure,RE}, N0, F, NFA0) -> {NFA1,N1,E1} = build_nfa(RE, N0+1, N0, NFA0), E = N1, % End state @@ -657,17 +916,79 @@ #nfa_state{no=E1,edges=[{epsilon,E}]}|NFA1], N1+1,E}; build_nfa({char_class,Cc}, N, F, NFA) -> - {[#nfa_state{no=F,edges=[{char_class(Cc),N}]}|NFA],N+1,N}; + {[#nfa_state{no=F,edges=[{pack_cc(Cc),N}]}|NFA],N+1,N}; build_nfa({comp_class,Cc}, N, F, NFA) -> {[#nfa_state{no=F,edges=[{comp_class(Cc),N}]}|NFA],N+1,N}; -build_nfa(C, N, F, NFA) when is_integer(C) -> - {[#nfa_state{no=F,edges=[{[{C,C}],N}]}|NFA],N+1,N}. +build_nfa({lit,Cs}, N, F, NFA) -> % Implicit concatenation + build_nfa_lit(Cs, N, F, NFA); +build_nfa(epsilon, N, F, NFA) -> % Just an epsilon transition + {[#nfa_state{no=F,edges=[{epsilon,N}]}|NFA],N+1,N}. + +%% build_nfa_lit(Chars, NextState, FirstState, NFA) -> {NFA,NextState,EndState}. +%% Build an NFA for the sequence of literal characters. + +build_nfa_lit(Cs, N0, F0, NFA0) -> + foldl(fun (C, {NFA,N,F}) -> + {[#nfa_state{no=F,edges=[{[{C,C}],N}]}|NFA],N+1,N} + end, {NFA0,N0,F0}, Cs). + +%% build_nfa_lit([C|Cs], N, F, NFA0) when is_integer(C) -> +%% NFA1 = [#nfa_state{no=F,edges=[{[{C,C}],N}]}|NFA0], +%% build_nfa_lit(Cs, N+1, N, NFA1); +%% build_nfa_lit([], N, F, NFA) -> {NFA,N,F}. + +%% build_nfa_seq(REs, NextState, FirstState, NFA) -> {NFA,NextState,EndState}. +%% Build an NFA for the regexps in a sequence. + +build_nfa_seq(REs, N0, F0, NFA0) -> + foldl(fun (RE, {NFA,N,F}) -> build_nfa(RE, N, F, NFA) end, + {NFA0,N0,F0}, REs). + +%% build_nfa_seq([RE|REs], N0, F, NFA0) -> +%% {NFA1,N1,E1} = build_nfa(RE, N0, F, NFA0), +%% build_nfa_seq(REs, N1, E1, NFA1); +%% build_nfa_seq([], N, F, NFA) -> {NFA,N,F}. + +%% build_nfa_alt(REs, NextState, FirstState, NFA) -> {NFA,NextState,EndState}. +%% Build an NFA for the regexps in an alternative. N.B. we don't +%% handle empty alts here but the parser should never generate them +%% anyway. + +build_nfa_alt([RE], N, F, NFA) -> build_nfa(RE, N, F, NFA); +build_nfa_alt([RE|REs], N0, F, NFA0) -> + {NFA1,N1,E1} = build_nfa(RE, N0+1, N0, NFA0), + {NFA2,N2,E2} = build_nfa_alt(REs, N1+1, N1, NFA1), + E = N2, % End state + {[#nfa_state{no=F,edges=[{epsilon,N0},{epsilon,N1}]}, + #nfa_state{no=E1,edges=[{epsilon,E}]}, + #nfa_state{no=E2,edges=[{epsilon,E}]}|NFA2], + N2+1,E}. -char_class(Cc) -> - Crs = lists:foldl(fun ({C1,C2}, Set) -> add_element({C1,C2}, Set); - (C, Set) -> add_element({C,C}, Set) - end, ordsets:new(), Cc), - pack_crs(ordsets:to_list(Crs)). +%% build_nfa_alt(REs, NextState, FirstState, NFA) -> {NFA,NextState,EndState}. +%% Build an NFA for the regexps in an alternative. Make one big +%% epsilon split state, not necessary but fun. + +%% build_nfa_alt(REs, N0, F0, NFA0) -> +%% E = N0, % Must reserve End state first +%% {Fs,{NFA1,N1}} = mapfoldl(fun (RE, {NFA,N}) -> +%% build_nfa_alt1(RE, N, E, NFA) +%% end, {NFA0,N0+1}, REs), +%% {[#nfa_state{no=F0,edges=epsilon_trans(Fs)}, +%% #nfa_state{no=E,edges=[{epsilon,N1}]}|NFA1],N1+1,N1}. + +%% build_nfa_alt1(RE, N0, End, NFA0) -> +%% {NFA1,N1,E} = build_nfa(RE, N0+1, N0, NFA0), +%% {N0,{[#nfa_state{no=E,edges=[{epsilon,End}]}|NFA1],N1}}. + +%% pack_cc(CharClass) -> CharClass +%% Pack and optimise a character class specification (bracket +%% expression). First sort it and then compact it. + +pack_cc(Cc) -> + Crs = foldl(fun ({range,Cf,Cl}, Set) -> add_element({Cf,Cl}, Set); + (C, Set) -> add_element({C,C}, Set) + end, ordsets:new(), Cc), + pack_crs(Crs). % An ordset IS a list! pack_crs([{C1,C2}=Cr,{C3,C4}|Crs]) when C1 =< C3, C2 >= C4 -> %% C1 C2 @@ -685,10 +1006,13 @@ pack_crs([]) -> []. comp_class(Cc) -> - Crs = char_class(Cc), - %%io:fwrite("comp: ~p\n", [Crs]), - comp_crs(Crs, 0). + Crs = pack_cc(Cc), + Comp = comp_crs(Crs, 0), + %% io:fwrite("comp: ~p\n ~p\n", [Crs,Comp]), + Comp. +comp_crs([{0,C2}|Crs], 0) -> % Get first range right + comp_crs(Crs, C2+1); comp_crs([{C1,C2}|Crs], Last) -> [{Last,C1-1}|comp_crs(Crs, C2+1)]; comp_crs([], Last) -> [{Last,maxchar}]. @@ -736,7 +1060,7 @@ Crs1 = lists:usort(Crs0), % Must remove duplicates! %% Build list of disjoint test ranges. Test = disjoint_crs(Crs1), - %%io:fwrite("bd: ~p\n ~p\n ~p\n ~p\n", [Set,Crs0,Crs1,Test]), + %% io:fwrite("bd: ~p\n ~p\n ~p\n ~p\n", [Set,Crs0,Crs1,Test]), build_dfa(Test, Set, Us, N, Ts, Ms, NFA). %% disjoint_crs([CharRange]) -> [CharRange]. @@ -938,7 +1262,7 @@ after file:close(Ofile) end; {error,Error} -> - verbose_print(St0, "not ok~n", []), + verbose_print(St0, "error~n", []), add_error({none,leex,{file_error,Error}}, St0) end after file:close(Ifile) @@ -1131,13 +1455,13 @@ map(fun ({A,empty_action}) -> {A,empty_action}; ({A,Code,TokenChars,TokenLen,TokenLine}) -> - Vs = [{"TokenChars",TokenChars}, - {"TokenLen",TokenLen}, - {"TokenLine",TokenLine}, - {"YYtcs",TokenChars}, - {"TokenLen",TokenLen or TokenChars}], - Vars = [if F -> S; true -> "_" end || {S,F} <- Vs], - Name = list_to_atom(lists:concat([yy_,A,'_'])), + Vs = [{TokenChars,"TokenChars"}, + {TokenLen,"TokenLen"}, + {TokenLine,"TokenLine"}, + {TokenChars,"YYtcs"}, + {TokenLen or TokenChars,"TokenLen"}], + Vars = [if F -> S; true -> "_" end || {F,S} <- Vs], + Name = list_to_atom(lists:concat([yyaction_,A])), [Chars,Len,Line,_,_] = Vars, Args = [V || V <- [Chars,Len,Line], V =/= "_"], ArgsChars = string:join(Args, ", "), @@ -1165,29 +1489,34 @@ {line, L} = erl_scan:token_info(hd(Code), line), output_file_directive(File, XrlFile, L-2), io:fwrite(File, "~s(~s) ->~n", [Name, ArgsChars]), - io:fwrite(File, " ~s.\n", [pp_tokens(Code, L)]). + io:fwrite(File, " ~s\n", [pp_tokens(Code, L)]). -%% Keeps the line breaks of the original code. -pp_tokens(Tokens, Line0) -> - lists:concat(pp_tokens1(Tokens, Line0, [])). +%% pp_tokens(Tokens, Line) -> [char()]. +%% Prints the tokens keeping the line breaks of the original code. + +pp_tokens(Tokens, Line0) -> pp_tokens(Tokens, Line0, none). -pp_tokens1([], _Line0, _T0) -> - []; -pp_tokens1([T | Ts], Line0, T0) -> +pp_tokens([], _Line0, _) -> []; +pp_tokens([T | Ts], Line0, Prev) -> {line, Line} = erl_scan:token_info(T, line), - [pp_sep(Line, Line0, T0), pp_symbol(T) | pp_tokens1(Ts, Line, T)]. + [pp_sep(Line, Line0, Prev, T), pp_symbol(T) | pp_tokens(Ts, Line, T)]. -pp_symbol({var,_,Var}) -> Var; +pp_symbol({var,_,Var}) -> atom_to_list(Var); pp_symbol({_,_,Symbol}) -> io_lib:fwrite("~p", [Symbol]); -pp_symbol({dot, _}) -> ""; -pp_symbol({Symbol, _}) -> Symbol. +pp_symbol({dot, _}) -> "."; +pp_symbol({Symbol, _}) -> atom_to_list(Symbol). -pp_sep(Line, Line0, T0) when Line > Line0 -> - ["\n " | pp_sep(Line - 1, Line0, T0)]; -pp_sep(_Line, _Line0, {'.',_}) -> - ""; -pp_sep(_Line, _Line0, _T0) -> - " ". +pp_sep(Line, Line0, Prev, T) when Line > Line0 -> + ["\n " | pp_sep(Line - 1, Line0, Prev, T)]; +pp_sep(_, _, {'.',_}, _) -> ""; % No space after '.' (not a dot) +pp_sep(_, _, {'#',_}, _) -> ""; % No space after '#' +pp_sep(_, _, {'(',_}, _) -> ""; % No space after '(' +pp_sep(_, _, {'[',_}, _) -> ""; % No space after '[' +pp_sep(_, _, _, {'.',_}) -> ""; % No space before '.' +pp_sep(_, _, _, {'#',_}) -> ""; % No space before '#' +pp_sep(_, _, _, {',',_}) -> ""; % No space before ',' +pp_sep(_, _, _, {')',_}) -> ""; % No space before ')' +pp_sep(_, _, _, _) -> " ". %% out_dfa_graph(LeexState, DFA, DfaStart) -> ok | error. %% Writes the DFA to a .dot file in DOT-format which can be viewed @@ -1207,7 +1536,7 @@ after file:close(Gfile) end; {error,Error} -> - verbose_print(St, "not ok~n", []), + verbose_print(St, "error~n", []), add_error({none,leex,{file_error,Error}}, St) end. @@ -1240,6 +1569,7 @@ dfa_edgelabel([C]) when is_integer(C) -> quote(C); dfa_edgelabel(Cranges) -> + %% io:fwrite("el: ~p\n", [Cranges]), "[" ++ map(fun ({A,B}) -> [quote(A), "-", quote(B)]; (C) -> [quote(C)] end, Cranges) ++ "]". @@ -1268,9 +1598,11 @@ quote($\v) -> "\\\\v"; quote($\d) -> "\\\\d"; quote($\\) -> "\\\\"; -quote(C) when 32 =< C, C =< 126 -> [C]; -quote(C) when 0 =< C, C =< 255 -> - <> = <>, - ["\\\\", $0+T2, $0+T1, $0+T0]; +quote(C) when is_integer(C) -> + %% Must remove the $ and get the \'s right. + case io_lib:write_unicode_char(C) of + [$$,$\\|Cs] -> "\\\\" ++ Cs; + [$$|Cs] -> Cs + end; quote(maxchar) -> - "MAX". + "MAXCHAR". diff -Nru erlang-13.b.1-dfsg/lib/parsetools/vsn.mk erlang-13.b.3-dfsg/lib/parsetools/vsn.mk --- erlang-13.b.1-dfsg/lib/parsetools/vsn.mk 2009-06-05 13:54:23.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/parsetools/vsn.mk 2009-11-20 13:33:52.000000000 +0000 @@ -1 +1 @@ -PARSETOOLS_VSN = 2.0 +PARSETOOLS_VSN = 2.0.1 diff -Nru erlang-13.b.1-dfsg/lib/percept/doc/src/book.xml erlang-13.b.3-dfsg/lib/percept/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/percept/doc/src/book.xml 2007-11-26 19:04:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/percept/doc/src/book.xml 2009-11-20 13:34:29.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2007 @@ -23,7 +23,7 @@ The Initial Developer of the Original Code is Ericsson AB. - Percept Application + Percept Björn-Egil Dahlberg 2007-11-02 @@ -32,16 +32,19 @@
    - Percept Application + Percept - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/percept/doc/src/egd_ug.xml erlang-13.b.3-dfsg/lib/percept/doc/src/egd_ug.xml --- erlang-13.b.1-dfsg/lib/percept/doc/src/egd_ug.xml 2009-03-12 12:25:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/percept/doc/src/egd_ug.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,82 +0,0 @@ - - - - -
    - - 2007 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - egd - Björn-Egil Dahlberg - - 2007-11-03 - A - egd_ug.xml -
    -
    - Introduction -

    - The egd module is an interface for 2d-image rendering and is used by - Percept to generate dynamic graphs to its web pages. All code is pure - erlang, no drivers needed. -

    -

    - The library is intended for small to medium image sizes with low - complexity for optimal performance. The library handles horizontal - lines better then vertical lines. -

    -

    - The foremost purpose for this module is to enable users to - generate images from erlang code and/or datasets and to - send these images to either files or web servers. -

    -
    -
    - File example -

    Drawing examples:

    - - - test1.gif - - - test2.gif - - - test3.gif - - - test4.gif - -
    -
    - ESI example -

    Using egd with inets ESI to generate images on the fly:

    - - - Example of result. - -

    - For more information regarding ESI, please see inets application - mod_esi. -

    -
    -
    - - diff -Nru erlang-13.b.1-dfsg/lib/percept/doc/src/egd_ug.xmlsrc erlang-13.b.3-dfsg/lib/percept/doc/src/egd_ug.xmlsrc --- erlang-13.b.1-dfsg/lib/percept/doc/src/egd_ug.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/percept/doc/src/egd_ug.xmlsrc 2009-11-20 13:34:31.000000000 +0000 @@ -0,0 +1,86 @@ + + + + +
    + + 2007 + 2007 + Ericsson AB, All Rights Reserved + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + + + egd + Björn-Egil Dahlberg + + 2007-11-03 + A + egd_ug.xml +
    +
    + Introduction +

    + The egd module is an interface for 2d-image rendering and is used by + Percept to generate dynamic graphs to its web pages. All code is pure + erlang, no drivers needed. +

    +

    + The library is intended for small to medium image sizes with low + complexity for optimal performance. The library handles horizontal + lines better then vertical lines. +

    +

    + The foremost purpose for this module is to enable users to + generate images from erlang code and/or datasets and to + send these images to either files or web servers. +

    +
    +
    + File example +

    Drawing examples:

    + + + First save. + test1.png + + + Second save. + test2.png + + + Third save. + test3.png + + + Fourth save. + test4.png + +
    +
    + ESI example +

    Using egd with inets ESI to generate images on the fly:

    + + + Example of result. + +

    + For more information regarding ESI, please see inets application + mod_esi. +

    +
    +
    + + diff -Nru erlang-13.b.1-dfsg/lib/percept/doc/src/Makefile erlang-13.b.3-dfsg/lib/percept/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/percept/doc/src/Makefile 2009-03-12 12:25:08.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/percept/doc/src/Makefile 2009-11-20 13:34:29.000000000 +0000 @@ -25,11 +25,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(PERCEPT_VSN) +APPLICATION=percept # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/percept-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Help application directory specification @@ -40,7 +41,7 @@ # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- -PERCEPT_DIR = $(ERL_TOP)/lib/percept/src +PERCEPT_DIR = $(ERL_TOP)/lib/$(APPLICATION)/src RUNTIME_TOOLS_DIR = $(ERL_TOP)/lib/runtime_tools/src PERCEPT_MODULES = \ @@ -75,14 +76,22 @@ egd_ug.xml \ percept_ug.xml +GEN_XML = \ + egd_ug.xml \ + percept_ug.xml + +BOOK_FILES = book.xml + +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_REF_MAN) HTML_EXAMPLE_FILES = \ percept_examples.html - + HTML_STYLESHEET_FILES = \ ../stylesheet.css -BOOK_FILES = book.xml GIF_FILES = \ test1.gif \ @@ -102,56 +111,47 @@ $(XML_REF_MAN:%.xml=$(HTMLDIR)/%.html) \ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) -EXTRA_FILES = \ - $(DEFAULT_HTML_FILES) \ - $(DEFAULT_GIF_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) - MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_REF_MAN:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) -TOP_PDF_FILE = percept-$(VSN).pdf -TOP_PS_FILE = percept-$(VSN).ps +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets # ---------------------------------------------------- -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif - $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: + rm -f $(MODULE_XML_FILES) $(GEN_XML) + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + +man: $(MAN3_FILES) $(MAN6_FILES) + +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) + +xml: $(MODULE_XML_FILES) + $(PERCEPT_XML_FILES): docb_gen $(PERCEPT_DIR)/$(@:%.xml=%.erl) @@ -165,69 +165,25 @@ @echo "PERCEPT_MODULES: $(PERCEPT_MODULES)" @echo "HTML_FILES: $(HTML_FILES)" @echo "HTMLDIR: $(HTMLDIR)" - @echo "DEFAULT_GIF_FILES: $(DEFAULT_GIF_FILES)" - @echo "DEFAULT_HTML_FILES: $(DEFAULT_HTML_FILES)" - @echo "EXTRA_FILES: $(EXTRA_FILES)" - -pdf: xml $(TOP_PDF_FILE) - -ps: xml $(TOP_PS_FILE) - -html: xml $(HTML_FILES) - -man: $(MAN3_FILES) $(MAN6_FILES) -gifs: $(GIF_FILES:%=$(HTMLDIR)/%) - -xml: $(MODULE_XML_FILES) debug opt: - -clean clean_docs clean_tex: - rm -f $(MODULE_XML_FILES) - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) $(MAN6_FILES) - rm -f $(EXTRA_FILES:fascicules.xml= ) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f min_head.gif - rm -f errs core *~ *sgmls_output *sgmls_errs $(LATEX_CLEAN) - - # ---------------------------------------------------- # Release Target # ---------------------------------------------------- - - include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ - $(HTML_EXAMPLE_FILES) $(HTML_STYLESHEET_FILES) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTML_EXAMPLE_FILES) $(HTML_STYLESHEET_FILES) \ + $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 release_spec: - - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- --include make.dep - - diff -Nru erlang-13.b.1-dfsg/lib/percept/doc/src/notes.xml erlang-13.b.3-dfsg/lib/percept/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/percept/doc/src/notes.xml 2009-06-05 13:54:26.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/percept/doc/src/notes.xml 2009-11-20 13:34:29.000000000 +0000 @@ -28,9 +28,27 @@ nil nil nil + notes.xml

    This document describes the changes made to the Percept application.

    +
    Percept 0.8.3 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    +
    Percept 0.8.2
    Improvements and New Features @@ -139,7 +157,7 @@

    Calling egd:destroy/1 did not properly remove the process holding the image.

    Synchronous calls done via the egd interface could - errornous receive messages not intended for egd. Messages + erroneous receive messages not intended for egd. Messages are now tagged in such a way so this should not occur.

    diff -Nru erlang-13.b.1-dfsg/lib/percept/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/percept/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/percept/doc/src/part_notes.xml 2007-11-26 19:04:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/percept/doc/src/part_notes.xml 2009-11-20 13:34:31.000000000 +0000 @@ -1,7 +1,7 @@ - +

    2007 @@ -35,6 +35,6 @@ The Percept application.

    - + diff -Nru erlang-13.b.1-dfsg/lib/percept/doc/src/part.xml erlang-13.b.3-dfsg/lib/percept/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/percept/doc/src/part.xml 2007-11-29 16:55:45.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/percept/doc/src/part.xml 2009-11-20 13:34:30.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2007 @@ -32,15 +32,15 @@

    - Percept is an akronym for Percept - erlang + Percept is an acronym for Percept - erlang concurrency profiling tool.

    It is a tool to visualize application level concurrency and - indentify concurrency bottlenecks. + identify concurrency bottlenecks.

    - - + +
    diff -Nru erlang-13.b.1-dfsg/lib/percept/doc/src/percept_ug.xml erlang-13.b.3-dfsg/lib/percept/doc/src/percept_ug.xml --- erlang-13.b.1-dfsg/lib/percept/doc/src/percept_ug.xml 2009-03-12 12:25:09.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/percept/doc/src/percept_ug.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,222 +0,0 @@ - - - - -
    - - 2007 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Percept - Björn-Egil Dahlberg - - 2007-11-02 - A - percept_ug.xml -
    -

    - Percept, or Percept - Erlang Concurrency Profiling Tool, utilizes trace - informations and profiler events to form a picture of the processes's and - ports runnability. -

    - -
    - Introduction -

    - Percept uses erlang:trace/3 and erlang:system_profile/2 to monitor events from - process states. Such states are,

    - - waiting - running - runnable - free - exiting - -

    - There are some other states too, suspended, hibernating, and - garbage collecting (gc). The only ignored state is gc and a process is considered to have - its previous state through out the entire garbage collecting phase. The main reason for this, is that our - model considers the gc as a third state neither active nor inactive. -

    -

    - A waiting or suspended process is considered an inactive process and a running or - runnable process is considered an active process. -

    -

    - Events are collected and stored to a file. The file can be moved and - analyzed on a different machine than the target machine. -

    -

    - Note, even if percept is not installed on your target machine, profiling - can still be done via the module percept_profile - located in runtime_tools. -

    -
    -
    - Getting started -
    - Profiling -

    - There are a few ways to start the profiling of a specific code. The - command percept:profile/3 is a preferred way. -

    -

    - The command takes a filename for the data destination file as first - argument, a callback entry-point as second argument and a - list of specific profiler options, for instance procs, as third - argument. -

    -

    - Let's say we have a module called example that initializes our - profiling-test and let it run under some defined manner designed by ourself. - The module needs a start function, let's call it go and it takes zero arguments. - The start arguments would look like: -

    -

    percept:profile("test.dat", {test, go, []}, [procs]).

    -

    - For a semi-real example we start a tree of processes that does sorting - of random numbers. In our model below we use a controller process that - distributes work to different client processes. -

    - -

    We can now start our test using percept:

    -
    -Erlang (BEAM) emulator version 5.6 [async-threads:0] [kernel-poll:false]
    -
    -Eshell V5.6  (abort with ^G)
    -1> percept:profile("test.dat", {sorter, go, [5, 2000, 15]}, [procs]).
    -Starting profiling.
    -ok
    -    
    -

    - Percept sets up the trace and profiling facilities to listen for process - specific events. It then stores these events to the test.dat - file. The profiling will go on for the whole duration until - sorter:go/3 returns and the profiling has concluded. -

    -
    -
    - Data viewing -

    - To analyze this file, use percept:analyze("test.dat"). We can do - this on any machine with Percept installed. The command will parse the - data file and insert all events in a RAM database, percept_db. The - initial command will only prompt how many processes were involved in the - profile. -

    -
    -2> percept:analyze("test.dat").                                      
    -Parsing: "test.dat" 
    -Parsed 428 entries in 3.81310e-2 s.
    -    17 created processes.
    -    0 opened ports.
    -ok
    -     
    -

    - To view the data we start the web-server using - percept:start_webserver/1. The command will return the hostname - and the a port where we should direct our favorite web browser. -

    -
    -3> percept:start_webserver(8888).
    -{started,"durin",8888}
    -4> 
    -     
    -
    - Overview selection -

    - Now we can view our data. The database has its content from - percept:analyze/1 command and the webserver is started. -

    -

    - When we click on the overview button in the menu percept will - generate a graph of the concurrency and send it to our web browser. In this - view we get no details but rather the big picture. We can see if - our processes behave in an inefficient manner. Dips in the graph represents - low concurrency in the erlang system. -

    -

    - We can zoom in on different areas of the graph either using the mouse - to select an area or by specifying min and max ranges in the edit boxes. -

    - -

    Measured time is presented in seconds if nothing else is stated.

    -
    - - Overview selection - -
    -
    - Processes selection -

    - To get a more detailed description we can select the process view by - clicking the processes button in the menu. -

    -

    - The table shows process id's that are click-able and direct you to - the process information page, a lifetime bar that presents a rough estimate - in green color about when the process was alive during profiling, an - entry-point, its registered name if it had one and the process's - parent id. -

    -

    - We can select which processes we want to compare and then hit the - compare button on the top right of the screen. -

    - - Processes selection - -
    -
    - Compare selection -

    - The activity bar under the concurrency graph shows each process's - runnability. The color green shows when a process is active (which is - running or runnable) and the white color represents time when a - process is inactive (waiting in a receive or is suspended). -

    -

    - To inspect a certain process click on the process id button, this will - direct you to a process information page for that specific process. -

    - - Processes compare selection - -
    -
    - Process information selection -

    - Here we can some general information for the process. Parent and - children processes, spawn and exit times, entry-point and start arguments. -

    -

    - We can also see the process' inactive times. How many times it has - been waiting, statistical information and most importantly in which - function. -

    -

    - The time percentages presented in process information are of time spent in waiting, not total run time. -

    - - Process information selection - -
    -
    -
    -
    diff -Nru erlang-13.b.1-dfsg/lib/percept/doc/src/percept_ug.xmlsrc erlang-13.b.3-dfsg/lib/percept/doc/src/percept_ug.xmlsrc --- erlang-13.b.1-dfsg/lib/percept/doc/src/percept_ug.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/percept/doc/src/percept_ug.xmlsrc 2009-11-20 13:34:31.000000000 +0000 @@ -0,0 +1,222 @@ + + + + +
    + + 2007 + 2007 + Ericsson AB, All Rights Reserved + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + + + Percept + Björn-Egil Dahlberg + + 2007-11-02 + A + percept_ug.xml +
    +

    + Percept, or Percept - Erlang Concurrency Profiling Tool, utilizes trace + informations and profiler events to form a picture of the processes's and + ports runnability. +

    + +
    + Introduction +

    + Percept uses erlang:trace/3 and erlang:system_profile/2 to monitor events from + process states. Such states are,

    + + waiting + running + runnable + free + exiting + +

    + There are some other states too, suspended, hibernating, and + garbage collecting (gc). The only ignored state is gc and a process is considered to have + its previous state through out the entire garbage collecting phase. The main reason for this, is that our + model considers the gc as a third state neither active nor inactive. +

    +

    + A waiting or suspended process is considered an inactive process and a running or + runnable process is considered an active process. +

    +

    + Events are collected and stored to a file. The file can be moved and + analyzed on a different machine than the target machine. +

    +

    + Note, even if percept is not installed on your target machine, profiling + can still be done via the module percept_profile + located in runtime_tools. +

    +
    +
    + Getting started +
    + Profiling +

    + There are a few ways to start the profiling of a specific code. The + command percept:profile/3 is a preferred way. +

    +

    + The command takes a filename for the data destination file as first + argument, a callback entry-point as second argument and a + list of specific profiler options, for instance procs, as third + argument. +

    +

    + Let's say we have a module called example that initializes our + profiling-test and let it run under some defined manner designed by ourself. + The module needs a start function, let's call it go and it takes zero arguments. + The start arguments would look like: +

    +

    percept:profile("test.dat", {test, go, []}, [procs]).

    +

    + For a semi-real example we start a tree of processes that does sorting + of random numbers. In our model below we use a controller process that + distributes work to different client processes. +

    + +

    We can now start our test using percept:

    +
    +Erlang (BEAM) emulator version 5.6 [async-threads:0] [kernel-poll:false]
    +
    +Eshell V5.6  (abort with ^G)
    +1> percept:profile("test.dat", {sorter, go, [5, 2000, 15]}, [procs]).
    +Starting profiling.
    +ok
    +    
    +

    + Percept sets up the trace and profiling facilities to listen for process + specific events. It then stores these events to the test.dat + file. The profiling will go on for the whole duration until + sorter:go/3 returns and the profiling has concluded. +

    +
    +
    + Data viewing +

    + To analyze this file, use percept:analyze("test.dat"). We can do + this on any machine with Percept installed. The command will parse the + data file and insert all events in a RAM database, percept_db. The + initial command will only prompt how many processes were involved in the + profile. +

    +
    +2> percept:analyze("test.dat").                                      
    +Parsing: "test.dat" 
    +Parsed 428 entries in 3.81310e-2 s.
    +    17 created processes.
    +    0 opened ports.
    +ok
    +     
    +

    + To view the data we start the web-server using + percept:start_webserver/1. The command will return the hostname + and the a port where we should direct our favorite web browser. +

    +
    +3> percept:start_webserver(8888).
    +{started,"durin",8888}
    +4> 
    +     
    +
    + Overview selection +

    + Now we can view our data. The database has its content from + percept:analyze/1 command and the webserver is started. +

    +

    + When we click on the overview button in the menu percept will + generate a graph of the concurrency and send it to our web browser. In this + view we get no details but rather the big picture. We can see if + our processes behave in an inefficient manner. Dips in the graph represents + low concurrency in the erlang system. +

    +

    + We can zoom in on different areas of the graph either using the mouse + to select an area or by specifying min and max ranges in the edit boxes. +

    + +

    Measured time is presented in seconds if nothing else is stated.

    +
    + + Overview selection + +
    +
    + Processes selection +

    + To get a more detailed description we can select the process view by + clicking the processes button in the menu. +

    +

    + The table shows process id's that are click-able and direct you to + the process information page, a lifetime bar that presents a rough estimate + in green color about when the process was alive during profiling, an + entry-point, its registered name if it had one and the process's + parent id. +

    +

    + We can select which processes we want to compare and then hit the + compare button on the top right of the screen. +

    + + Processes selection + +
    +
    + Compare selection +

    + The activity bar under the concurrency graph shows each process's + runnability. The color green shows when a process is active (which is + running or runnable) and the white color represents time when a + process is inactive (waiting in a receive or is suspended). +

    +

    + To inspect a certain process click on the process id button, this will + direct you to a process information page for that specific process. +

    + + Processes compare selection + +
    +
    + Process information selection +

    + Here we can some general information for the process. Parent and + children processes, spawn and exit times, entry-point and start arguments. +

    +

    + We can also see the process' inactive times. How many times it has + been waiting, statistical information and most importantly in which + function. +

    +

    + The time percentages presented in process information are of time spent in waiting, not total run time. +

    + + Process information selection + +
    +
    +
    +
    diff -Nru erlang-13.b.1-dfsg/lib/percept/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/percept/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/percept/doc/src/ref_man.xml 2009-03-12 12:25:09.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/percept/doc/src/ref_man.xml 2009-11-20 13:34:30.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2007 @@ -32,16 +32,16 @@

    - Percept is an akronym for Percept - erlang + Percept is an acronym for Percept - erlang concurrency profiling tool.

    It is a tool to visualize application level concurrency and - indentify concurrency bottlenecks. + identify concurrency bottlenecks.

    - - - + + +
    diff -Nru erlang-13.b.1-dfsg/lib/percept/vsn.mk erlang-13.b.3-dfsg/lib/percept/vsn.mk --- erlang-13.b.1-dfsg/lib/percept/vsn.mk 2009-06-05 13:54:26.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/percept/vsn.mk 2009-11-20 13:34:28.000000000 +0000 @@ -1 +1 @@ -PERCEPT_VSN = 0.8.2 +PERCEPT_VSN = 0.8.3 diff -Nru erlang-13.b.1-dfsg/lib/pman/doc/src/book.xml erlang-13.b.3-dfsg/lib/pman/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/pman/doc/src/book.xml 2007-11-26 19:03:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/pman/doc/src/book.xml 2009-11-20 13:33:59.000000000 +0000 @@ -1,29 +1,27 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - + Pman @@ -33,10 +31,13 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/pman/doc/src/Makefile erlang-13.b.3-dfsg/lib/pman/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/pman/doc/src/Makefile 2007-11-26 19:03:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/pman/doc/src/Makefile 2009-11-20 13:33:58.000000000 +0000 @@ -1,19 +1,21 @@ -# ``The contents of this file are subject to the Erlang Public License, +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in # compliance with the License. You should have received a copy of the # Erlang Public License along with this software. If not, it can be -# retrieved via the world wide web at http://www.erlang.org/. +# retrieved online at http://www.erlang.org/. # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # -# The Initial Developer of the Original Code is Ericsson Utvecklings AB. -# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings -# AB. All Rights Reserved.'' -# -# $Id$ +# %CopyrightEnd% +# # include $(ERL_TOP)/make/target.mk include $(ERL_TOP)/make/$(TARGET)/otp.mk @@ -23,17 +25,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(PMAN_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=pman # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/pman-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -46,6 +43,10 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + GIF_FILES = \ main_window.gif \ trace.gif \ @@ -57,35 +58,18 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = pman-$(VSN).pdf -TOP_PS_FILE = pman-$(VSN).ps +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets @@ -93,21 +77,13 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) @@ -115,35 +91,26 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/pman/doc/src/notes.xml erlang-13.b.3-dfsg/lib/pman/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/pman/doc/src/notes.xml 2009-03-12 15:27:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/pman/doc/src/notes.xml 2009-11-20 13:34:19.000000000 +0000 @@ -26,9 +26,27 @@ nil nil nil + notes.xml

    This document describes the changes made to the Pman application.

    +
    Pman 2.7.1 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    +
    Pman 2.7
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/pman/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/pman/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/pman/doc/src/part_notes.xml 2007-11-26 19:03:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/pman/doc/src/part_notes.xml 2009-11-20 13:34:22.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Pman Release Notes @@ -36,6 +34,6 @@ nodes. It is also possible to trace events in the individual processes.

    - + diff -Nru erlang-13.b.1-dfsg/lib/pman/doc/src/part.xml erlang-13.b.3-dfsg/lib/pman/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/pman/doc/src/part.xml 2007-11-26 19:03:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/pman/doc/src/part.xml 2009-11-20 13:33:49.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Pman User's Guide @@ -34,6 +32,6 @@ inspect the Erlang processes executing either locally or on remote nodes. It is also possible to trace events in the individual processes.

    - + diff -Nru erlang-13.b.1-dfsg/lib/pman/doc/src/pman_chapter.xml erlang-13.b.3-dfsg/lib/pman/doc/src/pman_chapter.xml --- erlang-13.b.1-dfsg/lib/pman/doc/src/pman_chapter.xml 2007-11-26 19:03:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/pman/doc/src/pman_chapter.xml 2009-11-20 13:33:49.000000000 +0000 @@ -4,23 +4,21 @@
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Pman @@ -28,6 +26,7 @@ + pman_chapter.xml
    @@ -59,7 +58,7 @@ and traced events are added dynamically.

    Which events to trace are selected in the Options Window which - is opened by chosing File->Options... in the Main Window or in a + is opened by choosing File->Options... in the Main Window or in a Trace Window. Currently supported trace events are message sending, message receiving, function calls and process events.

    It is possible to by-pass the Main Window and open a Trace @@ -72,9 +71,9 @@ The Main Window

    The Main Window shows all processes running at the displayed node. The window is automatically updated every 5 seconds. - Select which node to display in the window by chosing the node name + Select which node to display in the window by choosing the node name from the Nodes menu.

    - + The Main Window.

    A process can be selected by clicking on its line. The selected @@ -204,7 +203,7 @@ A Trace Window automatically uses the trace options set in the Main Window, but it is also possible to change the options for each Trace Window individually.

    - + The Trace Window.

    There is no limit to how many Trace Windows can be open at the same @@ -315,7 +314,7 @@ The Options Window

    The Options Window allows the user to specify the amount of output, and the destination of output for traced processes.

    - + The Options Window.

    In the upper left corner of the Options Window, there are check diff -Nru erlang-13.b.1-dfsg/lib/pman/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/pman/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/pman/doc/src/ref_man.xml 2007-11-26 19:03:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/pman/doc/src/ref_man.xml 2009-11-20 13:33:49.000000000 +0000 @@ -1,26 +1,24 @@ - +

    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Pman Reference Manual @@ -34,6 +32,6 @@ inspect the Erlang processes executing either locally or on remote nodes. It is also possible to trace events in the individual processes.

    - + diff -Nru erlang-13.b.1-dfsg/lib/pman/vsn.mk erlang-13.b.3-dfsg/lib/pman/vsn.mk --- erlang-13.b.1-dfsg/lib/pman/vsn.mk 2009-03-12 12:23:19.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/pman/vsn.mk 2009-11-20 13:33:53.000000000 +0000 @@ -1 +1 @@ -PMAN_VSN = 2.7 +PMAN_VSN = 2.7.1 diff -Nru erlang-13.b.1-dfsg/lib/public_key/asn1/PKIX1Explicit88.asn1 erlang-13.b.3-dfsg/lib/public_key/asn1/PKIX1Explicit88.asn1 --- erlang-13.b.1-dfsg/lib/public_key/asn1/PKIX1Explicit88.asn1 2009-03-12 12:32:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/asn1/PKIX1Explicit88.asn1 2009-09-18 15:13:34.000000000 +0100 @@ -579,7 +579,7 @@ ub-title INTEGER ::= 64 ub-serial-number INTEGER ::= 64 ub-match INTEGER ::= 128 -ub-emailaddress-length INTEGER ::= 128 +ub-emailaddress-length INTEGER ::= 255 ub-common-name-length INTEGER ::= 64 ub-country-name-alpha-length INTEGER ::= 2 ub-country-name-numeric-length INTEGER ::= 3 diff -Nru erlang-13.b.1-dfsg/lib/public_key/doc/src/book.xml erlang-13.b.3-dfsg/lib/public_key/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/public_key/doc/src/book.xml 2009-03-12 12:32:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/doc/src/book.xml 2009-11-20 13:37:46.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2008 @@ -37,11 +37,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/public_key/doc/src/cert_records.xml erlang-13.b.3-dfsg/lib/public_key/doc/src/cert_records.xml --- erlang-13.b.1-dfsg/lib/public_key/doc/src/cert_records.xml 2009-03-12 12:32:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/doc/src/cert_records.xml 2009-11-20 13:37:46.000000000 +0000 @@ -295,7 +295,7 @@ id-ce-keyUsage - [key_usasge()] + [key_usage()] id-ce-privateKeyUsagePeriod @@ -363,7 +363,7 @@

    - key_usasge() = digitalSignature | nonRepudiation | keyEncipherment| + key_usage() = digitalSignature | nonRepudiation | keyEncipherment| dataEncipherment | keyAgreement | keyCertSign | cRLSign | encipherOnly | decipherOnly

    diff -Nru erlang-13.b.1-dfsg/lib/public_key/doc/src/introduction.xml erlang-13.b.3-dfsg/lib/public_key/doc/src/introduction.xml --- erlang-13.b.1-dfsg/lib/public_key/doc/src/introduction.xml 2009-03-12 12:32:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/doc/src/introduction.xml 2009-11-20 13:37:47.000000000 +0000 @@ -45,7 +45,7 @@ Prerequisites

    It is assumed that the reader is familiar with the Erlang programming language, concepts of OTP and has a basic understanding - of the consepts of using public keys.

    + of the concepts of using public keys.

    diff -Nru erlang-13.b.1-dfsg/lib/public_key/doc/src/Makefile erlang-13.b.3-dfsg/lib/public_key/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/public_key/doc/src/Makefile 2009-03-12 12:32:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/doc/src/Makefile 2009-11-20 13:37:47.000000000 +0000 @@ -26,17 +26,20 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(PUBLIC_KEY_VSN) +APPLICATION=public_key # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- +ifndef DOCSUPPORT include make.dep +endif # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/public_key-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- @@ -72,6 +75,14 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ @@ -89,6 +100,8 @@ $(TOP_PS_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +endif + # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- @@ -101,6 +114,24 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ +ifdef DOCSUPPORT + +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + +else + ifeq ($(DOCTYPE),pdf) docs: pdf else @@ -117,12 +148,6 @@ html: $(HTML_FILES) -man: $(MAN3_FILES) - -gifs: $(GIF_FILES:%=$(HTMLDIR)/%) - -debug opt: - clean clean_docs clean_tex: rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) rm -f $(HTML_FILES) $(MAN3_FILES) @@ -130,11 +155,33 @@ rm -f errs core *~ min_head.gif \ $(LATEX_CLEAN) +endif + +man: $(MAN3_FILES) + +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) + +debug opt: + + # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 +else + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -155,6 +202,8 @@ endif endif +endif + release_spec: info: diff -Nru erlang-13.b.1-dfsg/lib/public_key/doc/src/notes.xml erlang-13.b.3-dfsg/lib/public_key/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/public_key/doc/src/notes.xml 2009-03-12 12:32:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/doc/src/notes.xml 2009-11-20 13:37:47.000000000 +0000 @@ -31,9 +31,57 @@ 2008-01-22 A - notes.sgml + notes.xml
    + +
    Public_Key 0.4 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8250

    +
    +
    +
    + +
    + +
    Public_Key 0.3 + +
    Fixed Bugs and Malfunctions + + +

    + Unknown attributes in certificates are left encoded + instead of crashing. Patch by Will "wglozer" thanks.

    +

    + Own Id: OTP-8100

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + Allow public_key:pem_to_der/[1,2] to take a binary as + argument in addition to a filename. Patch by Geoff Cant, + thanks.

    +

    + Own Id: OTP-8142

    +
    +
    +
    + +
    +
    Public_Key 0.2
    Improvements and New Features @@ -41,7 +89,7 @@

    X509 certificate handling has been extended and improved - as a result of more extensive testning of both the ssl + as a result of more extensive testing of both the ssl and public_key application. Even more extensions of the certificate handling is yet to be implemented.

    diff -Nru erlang-13.b.1-dfsg/lib/public_key/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/public_key/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/public_key/doc/src/part_notes.xml 2009-03-12 12:32:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/doc/src/part_notes.xml 2009-11-20 13:37:48.000000000 +0000 @@ -1,7 +1,7 @@ - +

    2008 @@ -32,7 +32,7 @@

    - + diff -Nru erlang-13.b.1-dfsg/lib/public_key/doc/src/part.xml erlang-13.b.3-dfsg/lib/public_key/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/public_key/doc/src/part.xml 2009-03-12 12:32:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/doc/src/part.xml 2009-11-20 13:37:47.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2008 @@ -35,8 +35,8 @@ from RFC 3280 (X.509 certificates) and some public key formats defined by the PKCS-standard.

    - - - + + + diff -Nru erlang-13.b.1-dfsg/lib/public_key/doc/src/public_key.xml erlang-13.b.3-dfsg/lib/public_key/doc/src/public_key.xml --- erlang-13.b.1-dfsg/lib/public_key/doc/src/public_key.xml 2009-03-13 11:04:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/doc/src/public_key.xml 2009-11-20 13:37:48.000000000 +0000 @@ -34,7 +34,7 @@ API module for public key infrastructure.

    This module provides functions to handle public key infrastructure - from RFC 3280 - X.509 certificates (will later be upraded to RFC 5280) + from RFC 3280 - X.509 certificates (will later be upgraded to RFC 5280) and some parts of the PKCS-standard. Currently this application is mainly used by the new ssl implementation. The API is yet under construction diff -Nru erlang-13.b.1-dfsg/lib/public_key/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/public_key/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/public_key/doc/src/ref_man.xml 2009-03-12 12:32:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/doc/src/ref_man.xml 2009-11-20 13:37:48.000000000 +0000 @@ -1,7 +1,7 @@ - +

    2008 @@ -35,7 +35,7 @@ from RFC 3280 (X.509 certificates) and some parts of the PKCS-standard.

    - + diff -Nru erlang-13.b.1-dfsg/lib/public_key/src/pubkey_cert_records.erl erlang-13.b.3-dfsg/lib/public_key/src/pubkey_cert_records.erl --- erlang-13.b.1-dfsg/lib/public_key/src/pubkey_cert_records.erl 2009-03-12 12:33:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/src/pubkey_cert_records.erl 2009-09-18 15:13:35.000000000 +0100 @@ -187,8 +187,11 @@ end, Exts). transform(#'AttributeTypeAndValue'{type=Id,value=Value0} = ATAV, Func) -> - Type = attribute_type(Id), - {ok, Value} = 'OTP-PUB-KEY':Func(Type, Value0), + {ok, Value} = + case attribute_type(Id) of + Type when is_atom(Type) -> 'OTP-PUB-KEY':Func(Type, Value0); + _UnknownType -> {ok, Value0} + end, ATAV#'AttributeTypeAndValue'{value=Value}; transform(AKI = #'AuthorityKeyIdentifier'{authorityCertIssuer=ACI},Func) -> AKI#'AuthorityKeyIdentifier'{authorityCertIssuer=transform(ACI,Func)}; @@ -231,7 +234,8 @@ attribute_type(?'id-at-serialNumber') -> 'X520SerialNumber'; attribute_type(?'id-at-pseudonym') -> 'X520Pseudonym'; attribute_type(?'id-domainComponent') -> 'DomainComponent'; -attribute_type(?'id-emailAddress') -> 'EmailAddress'. +attribute_type(?'id-emailAddress') -> 'EmailAddress'; +attribute_type(Type) -> Type. %%% Old code transforms diff -Nru erlang-13.b.1-dfsg/lib/public_key/src/pubkey_pem.erl erlang-13.b.3-dfsg/lib/public_key/src/pubkey_pem.erl --- erlang-13.b.1-dfsg/lib/public_key/src/pubkey_pem.erl 2009-03-12 12:32:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/src/pubkey_pem.erl 2009-09-18 15:13:34.000000000 +0100 @@ -40,7 +40,7 @@ -module(pubkey_pem). --export([read_file/1, read_file/2, write_file/2]). +-export([read_file/1, read_file/2, write_file/2, decode/2]). -export([decode_key/2]). -define(ENCODED_LINE_LENGTH, 64). @@ -53,8 +53,7 @@ read_file(File, Passwd) -> {ok, Bin} = file:read_file(File), - Result = decode_file(split_bin(Bin), Passwd), - Result. + decode(Bin, Passwd). write_file(File, Ds) -> file:write_file(File, encode_file(Ds)). @@ -64,6 +63,9 @@ decode_key({_Type, Bin, {Chipher,Salt}}, Password) -> decode_key(Bin, Password, Chipher, Salt). +decode(Bin, Passwd) -> + decode_file(split_bin(Bin), Passwd). + %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/public_key/src/public_key.appup.src erlang-13.b.3-dfsg/lib/public_key/src/public_key.appup.src --- erlang-13.b.1-dfsg/lib/public_key/src/public_key.appup.src 2009-03-12 12:34:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/src/public_key.appup.src 2009-11-20 13:37:50.000000000 +0000 @@ -3,4 +3,4 @@ [ ], [ - ]} \ No newline at end of file + ]}. diff -Nru erlang-13.b.1-dfsg/lib/public_key/src/public_key.erl erlang-13.b.3-dfsg/lib/public_key/src/public_key.erl --- erlang-13.b.1-dfsg/lib/public_key/src/public_key.erl 2009-03-12 12:32:59.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/src/public_key.erl 2009-09-18 15:13:34.000000000 +0100 @@ -109,9 +109,12 @@ pubkey_crypto:encrypt_private(PlainText, Key, Padding). %%-------------------------------------------------------------------- -%% Function: pem_to_der(File) -> -%% pem_to_der(File, Password) -> {ok, [Entry]} | {error, Reason} +%% Function: pem_to_der(CertSource) -> +%% pem_to_der(CertSource, Password) -> {ok, [Entry]} | +%% {error, Reason} %% +%% CertSource = File | CertData +%% CertData = binary() %% File = path() %% Password = string() %% Entry = {entry_type(), der_bin(), ChipherInfo} @@ -120,17 +123,19 @@ %% entry_type() = cert | cert_req | rsa_private_key | dsa_private_key %% dh_params %% -%% Description: Read and decode PEM file and returns entries as asn1 -%% der encoded entities. Currently supported entry types are -%% certificates, certificate requests, rsa private keys and dsa -%% private keys. In the case of a key entry ChipherInfo will be +%% Description: decode PEM binary data or a PEM file and return +%% entries as asn1 der encoded entities. Currently supported entry +%% types are certificates, certificate requests, rsa private keys and +%% dsa private keys. In the case of a key entry ChipherInfo will be %% used by decode_private_key/2 if the key is protected by a password. %%-------------------------------------------------------------------- -pem_to_der(File) -> - pubkey_pem:read_file(File). +pem_to_der(CertSource) -> + pem_to_der(CertSource, no_passwd). -pem_to_der(File, Password) -> - pubkey_pem:read_file(File, Password). +pem_to_der(File, Password) when is_list(File) -> + pubkey_pem:read_file(File, Password); +pem_to_der(PemBin, Password) when is_binary(PemBin) -> + pubkey_pem:decode(PemBin, Password). %%-------------------------------------------------------------------- %% Function: pkix_decode_cert(BerCert, Type) -> {ok, Cert} | {error, Reason} diff -Nru erlang-13.b.1-dfsg/lib/public_key/test/public_key_SUITE.erl erlang-13.b.3-dfsg/lib/public_key/test/public_key_SUITE.erl --- erlang-13.b.1-dfsg/lib/public_key/test/public_key_SUITE.erl 2009-03-12 12:33:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/test/public_key_SUITE.erl 2009-09-18 15:13:35.000000000 +0100 @@ -134,6 +134,9 @@ public_key:pem_to_der(filename:join(Datadir, "rsa.pem")), {ok,[{rsa_private_key, _, _}]} = public_key:pem_to_der(filename:join(Datadir, "rsa.pem"), "abcd1234"), + {ok, Bin0} = file:read_file(filename:join(Datadir, "rsa.pem")), + {ok, [{rsa_private_key, _, _}]} = public_key:pem_to_der(Bin0, "abcd1234"), + {ok,[{dh_params, _, _}]} = public_key:pem_to_der(filename:join(Datadir, "dh.pem")), {ok,[{cert, _, not_encrypted}]} = @@ -142,6 +145,10 @@ public_key:pem_to_der(filename:join(Datadir, "req.pem")), {ok,[{cert, _, _}, {cert, _, _}]} = public_key:pem_to_der(filename:join(Datadir, "cacerts.pem")), + + {ok, Bin1} = file:read_file(filename:join(Datadir, "cacerts.pem")), + {ok, [{cert, _, _}, {cert, _, _}]} = public_key:pem_to_der(Bin1), + ok. %%-------------------------------------------------------------------- decode_private_key(doc) -> diff -Nru erlang-13.b.1-dfsg/lib/public_key/vsn.mk erlang-13.b.3-dfsg/lib/public_key/vsn.mk --- erlang-13.b.1-dfsg/lib/public_key/vsn.mk 2009-03-12 12:32:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/public_key/vsn.mk 2009-11-20 13:37:48.000000000 +0000 @@ -1,6 +1,6 @@ -PUBLIC_KEY_VSN = 0.2 +PUBLIC_KEY_VSN = 0.4 -TICKETS = OTP-7860\ - -TICKETS_0.1 = \ - OTP-7637 \ No newline at end of file +TICKETS = OTP-8250 +#TICKETS_0.3 = OTP-8100 OTP-8142 +#TICKETS_0.2 = OTP-7860 +#TICKETS_0.1 = OTP-7637 \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/reltool/doc/src/book.xml erlang-13.b.3-dfsg/lib/reltool/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/reltool/doc/src/book.xml 2009-03-12 12:26:26.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/doc/src/book.xml 2009-11-20 13:34:43.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2009 @@ -23,7 +23,7 @@ The Initial Developer of the Original Code is Ericsson AB. - Reltool application + Reltool Håkan Mattsson @@ -31,15 +31,18 @@
    - Reltool application + Reltool - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/reltool/doc/src/Makefile erlang-13.b.3-dfsg/lib/reltool/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/reltool/doc/src/Makefile 2009-03-12 12:26:27.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/doc/src/Makefile 2009-11-20 13:34:43.000000000 +0000 @@ -1,4 +1,3 @@ -# ``The contents of this file are subject to the Erlang Public License, # # %CopyrightBegin% # @@ -25,17 +24,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(RELTOOL_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=reltool # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/reltool-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -49,36 +43,22 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(filter-out ../html/note.gif, $(DEFAULT_GIF_FILES)) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = reltool-$(VSN).pdf +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) -TOP_PS_FILE = reltool-$(VSN).ps +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets @@ -86,21 +66,13 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) @@ -108,36 +80,26 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 release_spec: diff -Nru erlang-13.b.1-dfsg/lib/reltool/doc/src/notes.xml erlang-13.b.3-dfsg/lib/reltool/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/reltool/doc/src/notes.xml 2009-06-05 13:54:35.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/doc/src/notes.xml 2009-11-20 13:34:44.000000000 +0000 @@ -27,7 +27,8 @@ Håkan Mattsson - %VSN% + + notes.xml

    This document describes the changes made to the Reltool system from version to version. The intention of this document is to @@ -36,6 +37,99 @@ thus constitutes one section in this document. The title of each section is the version number of Reltool.

    + +
    Reltool 0.5.2 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the HTML frames are removed.

    +

    + Own Id: OTP-8254

    +
    +
    +
    + +
    + +
    Reltool 0.5.1 + +
    Fixed Bugs and Malfunctions + + +

    + In the new release of Reltool (0.5) there is a severe bug + that may cause your source files to be deleted. The bug + is triggered when you generate a target system WITH + archive files AND your library directories are given with + absolute paths. (Library directories are given with the + ERL_LIBS environment variable or with the lib_dirs + configuration parameter.)

    +

    + Own Id: OTP-8199

    +
    +
    +
    + +
    + +
    Reltool 0.5 + +
    Improvements and New Features + + +

    + The tool is still experimental. Feedback is appreciated.

    +

    + Major improvements of the target system generation has + been performed. Now it is possible to generate a + relocatable target system that does not need to be + re-installed if it is moved to a new location. Archive + files are automatically generated. A detailed + specification of the target system can be generated + without actually creating the target system. Relocatable + escripts are put in the bin directory of the target + system. etc. etc.

    +

    + Some new functions has been introduced in the + reltool module: start/1, start_link/1, + get_config/3, get_target_spec/1 and + eval_target_spec/3.

    +

    + Some new configuration parameters has been introduced: + profile, incl_sys_filters, excl_sys_filters, + incl_app_filters, excl_app_filters, incl_archive_filters, + excl_archive_filters, archive_opts, escript and + relocatable.

    +

    + Some parameters have been obsoleted and given new + semantics: incl_erts_dirs (incl_sys_filters), + excl_erts_dirs (excl_sys_filters), incl_app_dirs + (incl_app_filters), excl_app_dirs (excl_app_filters) and + escripts (escript).

    +

    + *** POTENTIAL INCOMPATIBILITY ***

    +

    + Own Id: OTP-7949

    +
    +
    +
    + +
    + Known Bugs and Problems + + +

    + The application is experimental. Feedback is appreciated.

    +
    +
    +
    + +
    +
    Reltool 0.2.2 @@ -45,7 +139,7 @@

    The tool crashed when rel, script and boot files were - generated via the. This has been fixed.

    + generated via the GUI. This has been fixed.

    Own Id: OTP-7999

    diff -Nru erlang-13.b.1-dfsg/lib/reltool/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/reltool/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/reltool/doc/src/part_notes.xml 2009-03-12 12:26:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/doc/src/part_notes.xml 2009-11-20 13:34:44.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2009 @@ -37,5 +37,5 @@ target system. The backend provides a batch interface for generation of customized target systems.

    - + diff -Nru erlang-13.b.1-dfsg/lib/reltool/doc/src/part.xml erlang-13.b.3-dfsg/lib/reltool/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/reltool/doc/src/part.xml 2009-03-12 12:26:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/doc/src/part.xml 2009-11-20 13:34:44.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2009 @@ -37,7 +37,7 @@ target system. The backend provides a batch interface for generation of customized target systems.

    - - - + + + diff -Nru erlang-13.b.1-dfsg/lib/reltool/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/reltool/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/reltool/doc/src/ref_man.xml 2009-03-12 12:26:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/doc/src/ref_man.xml 2009-11-20 13:34:44.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2009 @@ -37,5 +37,5 @@ target system. The backend provides a batch interface for generation of customized target systems.

    - + diff -Nru erlang-13.b.1-dfsg/lib/reltool/doc/src/reltool_examples.xml erlang-13.b.3-dfsg/lib/reltool/doc/src/reltool_examples.xml --- erlang-13.b.1-dfsg/lib/reltool/doc/src/reltool_examples.xml 2009-03-16 14:10:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/doc/src/reltool_examples.xml 2009-11-20 13:34:44.000000000 +0000 @@ -10,7 +10,7 @@
    The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in + Version 1.1, (the "License"); you may noot use this file except in compliance with the License. You should have received a copy of the Erlang Public License along with this software. If not, it can be retrieved online at http://www.erlang.org/. @@ -31,38 +31,229 @@ %VSN% + reltool_examples.xml
    Start and stop windows and servers +

    The main process in Reltool is the server. It can be used as it + is or be used via the GUI frontend process. When the GUI is + started, a server process will automatically be started. The GUI + process is started with reltool:start/0, + reltool:start/1 or reltool:start_link/1. The pid of + its server can be obtained with reltool:get_server/1

    +
    -Erlang R13A (erts-5.7) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
    +Erlang R13B02 (erts-5.7.3) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
     
    -Eshell V5.7  (abort with ^G)
    -1> reltool:start_server([]).
    -{ok,<0.35.0>}
    -2> reltool:get_config_server(Server).
    +Eshell V5.7.3  (abort with ^G)
    +1> {ok, Win} = reltool:start([]).
    +{ok,<0.36.01>}
    +2> {ok, Server} = reltool:get_server([]).
    +{ok,<0.37.01>}
    +3> reltool:get_config(Server).
    +{ok,{sys,[]}}
    +4> reltool:stop(Win).
    +ok
    +
    +
    +5> {ok, Server2} = reltool:start_server([]).
    +{ok,<0.6535.01>}
    +6> reltool:get_config(Server2).
     {ok,{sys,[]}}
    -3>  reltool:stop(Server).
    +7> reltool:stop(Server2).
     ok
         
    + Inspecting the configuration + +
    +Erlang R13B02 (erts-5.7.3) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
    +
    +Eshell V5.7.3  (abort with ^G)
    +1> Config = {sys, [{escript, "examples/display_args", [{incl_cond, include}]},
    +		   {app, inets, [{incl_cond, include}]},
    +		   {app, mnesia, [{incl_cond, exclude}]},
    +		   {app, ssl, [{incl_cond, exclude}]},
    +		   {app, runtime_tools, [{incl_cond, exclude}]},
    +		   {app, syntax_tools, [{incl_cond, exclude}]}]}.
    +{sys,[{escript,"examples/display_args",[{incl_cond,include}]},
    +      {app,inets,[{incl_cond,include}]},
    +      {app,mnesia,[{incl_cond,exclude}]},
    +      {app,ssl,[{incl_cond,exclude}]},
    +      {app,runtime_tools,[{incl_cond,exclude}]},
    +      {app,syntax_tools,[{incl_cond,exclude}]}]}
    +
    +
    +
    +2> {ok, Server} = reltool:start_server([Config]).
    +{ok,<0.35.0>}
    +3> reltool:get_config(Server).
    +{ok,{sys,[{escript,"/clearcase/otp/tools/reltool/examples/display_args",
    +                   [{incl_cond,include}]}]}}
    +4> reltool:get_config(Server, false, false).
    +{ok,{sys,[{escript,"/clearcase/otp/tools/reltool/examples/display_args",
    +                   [{incl_cond,include}]}]}}
    +
    +
    +
    +5> reltool:get_config(Server, true, false).
    +{ok,{sys,[{root_dir,"/ldisk/hakan/otp_test"},
    +          {lib_dirs,[]},
    +          {escript,"/clearcase/otp/tools/reltool/examples/display_args",
    +                   [{incl_cond,include}]},
    +          {mod_cond,all},
    +          {incl_cond,derived},
    +          {boot_rel,"start_clean"},
    +          {emu_name,"beam"},
    +          {relocatable,true},
    +          {profile,development},
    +          {incl_sys_files,[".*"]},
    +          {excl_sys_files,[]},
    +          {incl_app_files,[".*"]},
    +          {excl_app_files,[]},
    +          {incl_archive_dirs,[".*"]},
    +          {excl_archive_dirs,["^include$","^priv$"]},
    +          {archive_opts,[]},
    +          {app_type,permanent},
    +          {app_file,keep},
    +          {debug_info,keep}]}}
    +
    +
    +
    +6> reltool:get_config(Server, true, true).
    +{ok,{sys,[{root_dir,"/ldisk/hakan/otp_test"},
    +          {lib_dirs,[]},
    +          {escript,"/clearcase/otp/tools/reltool/examples/display_args",
    +                   [{incl_cond,include}]},
    +          {mod_cond,all},
    +          {incl_cond,derived},
    +          {erts,[{vsn,"5.7.3"},
    +                 {mod,erl_prim_loader,[]},
    +                 {mod,erlang,[]},
    +                 {mod,init,[]},
    +                 {mod,otp_ring0,[]},
    +                 {mod,prim_file,[]},
    +                 {mod,prim_inet,[]},
    +                 {mod,prim_zip,[]},
    +                 {mod,zlib,[]}]},
    +          {app,compiler,
    +               [{vsn,"4.6.3"},
    +                {mod,beam_asm,[]},
    +                {mod,beam_block,[]},
    +                {mod,beam_bool,[]},
    +                {mod,beam_bsm,[]},
    +                {mod,beam_clean,[]},
    +                {mod,beam_dead,[]},
    +                {mod,beam_dict,[]},
    +                {mod,beam_disasm,[]},
    +                {mod,beam_flatten,[]},
    +                {mod,beam_jump,[]},
    +                {mod,beam_listing,[]},
    +                {mod,beam_opcodes,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,crypto,
    +               [{vsn,"1.6.1"},
    +                {mod,crypto,[]},
    +                {mod,crypto_app,[]},
    +                {mod,crypto_server,[]},
    +                {mod,crypto_sup,[]}]},
    +          {app,hipe,
    +               [{vsn,"3.7.3"},
    +                {mod,cerl_cconv,[]},
    +                {mod,cerl_closurean,[]},
    +                {mod,cerl_hipeify,[]},
    +                {mod,cerl_hybrid_transform,[]},
    +                {mod,cerl_lib,[]},
    +                {mod,cerl_messagean,[]},
    +                {mod,cerl_pmatch,[]},
    +                {mod,cerl_prettypr,[]},
    +                {mod,cerl_to_icode,[]},
    +                {mod,cerl_typean,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,kernel,
    +               [{vsn,"2.13.3"},
    +                {mod,application,[]},
    +                {mod,application_controller,[]},
    +                {mod,application_master,[]},
    +                {mod,application_starter,[]},
    +                {mod,auth,[]},
    +                {mod,code,[]},
    +                {mod,code_server,[]},
    +                {mod,disk_log,[]},
    +                {mod,disk_log_1,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,stdlib,
    +               [{vsn,"1.16.3"},
    +                {mod,array,[]},
    +                {mod,base64,[]},
    +                {mod,beam_lib,[]},
    +                {mod,c,[]},
    +                {mod,calendar,[]},
    +                {mod,dets,[]},
    +                {mod,dets_server,[]},
    +                {mod,dets_sup,...},
    +                {mod,...},
    +                {...}|...]},
    +          {boot_rel,"start_clean"},
    +          {emu_name,"beam"},
    +          {relocatable,true},
    +          {profile,development},
    +          {incl_sys_files,[".*"]},
    +          {excl_sys_files,[]},
    +          {incl_app_files,[".*"]},
    +          {excl_app_files,[]},
    +          {incl_archive_dirs,[".*"]},
    +          {excl_archive_dirs,["^include$",[...]]},
    +          {archive_opts,[]},
    +          {app_type,permanent},
    +          {app_file,...},
    +          {...}]}}
    +
    +
    +
    +7> reltool:get_config([{sys,[{profile, embedded}]}]).
    +{ok,{sys,[{profile,embedded},
    +          {incl_sys_filters,["^bin","^erts","^lib","^releases"]},
    +          {excl_sys_filters,["^bin/(erlc|dialyzer|typer)(|\\.exe)$",
    +                             "^erts.*/bin/(erlc|dialyzer|typer)(|\\.exe)$",
    +                             "^erts.*/bin/.*(debug|pdb)"]},
    +          {incl_app_filters,["^ebin","^include","^priv"]}]}}
    +8> reltool:get_config([{sys,[{profile, standalone}]}]).
    +{ok,{sys,[{profile,standalone},
    +          {incl_sys_filters,["^bin/(erl|epmd)(|\\.exe|\\.ini)$",
    +                             "^bin/start(|_clean).boot$","^erts.*/bin","^lib$"]},
    +          {excl_sys_filters,["^erts.*/bin/(erlc|dialyzer|typer)(|\\.exe)$",
    +                             "^erts.*/bin/(start|escript|to_erl|run_erl)(|\\.exe)$",
    +                             "^erts.*/bin/.*(debug|pdb)"]},
    +          {incl_app_filters,["^ebin","^priv"]},
    +          {excl_app_filters,["^ebin/.*\\.appup$"]}]}}
    +
    +    
    + +
    + +
    Generate release and script files
    -5> {ok, Server} = reltool:start_server([{config, {sys, [{boot_rel, "NAME"}, {rel, "NAME", "VSN", [kernel, stdlib, sasl]}]}}]).
    +5> {ok, Server} = reltool:start_server([{config, {sys, [{boot_rel, "NAME"},
    +                                                        {rel, "NAME", "VSN", [kernel, stdlib, sasl]}]}}]).
     {ok,<0.1288.0>}
    -6>  reltool:get_config(Server).
    +6>  reltool:get_config(Server).
     {ok,{sys,[{boot_rel,"NAME"},
               {rel,"NAME","VSN",[kernel,stdlib,sasl]}]}}
    -7>  reltool:get_rel(Server, "NAME").
    +7>  reltool:get_rel(Server, "NAME").
     {ok,{release,{"NAME","VSN"},
                  {erts,"5.7"},
                  [{kernel,"2.13"},{stdlib,"1.16"},{sasl,"2.1.6"}]}}
    -8>  reltool:get_script(Server, "NAME").
    +8>  reltool:get_script(Server, "NAME").
     {ok,{script,{"NAME","VSN"},
                 [{preLoaded,[erl_prim_loader,erlang,init,otp_ring0,
                              prim_file,prim_inet,prim_zip,zlib]},
    @@ -98,7 +289,7 @@
                  {apply,{...}},
                  {apply,...},
                  {...}|...]}}
    -9>  reltool:stop(Server).
    +9>  reltool:stop(Server).
     ok
         
    @@ -106,23 +297,169 @@
    Create a target system
    -11> file:list_dir("TARGET_DIR").
    -{error,enoent}
    -12>  reltool:create_target([{config, {sys, [{app, sasl, [{incl_cond, include}]},
    -                                            {boot_rel, "NAME"},
    -                                            {rel, "NAME", "VSN", [kernel, stdlib, sasl]}]}}],
    -                           "TARGET_DIR").
    -ok
    -13> file:list_dir("TARGET_DIR").
    -{ok,["bin","erts-5.7","lib","releases"]}
    -14> file:list_dir("TARGET_DIR/lib").
    -{ok,["erts-5.7","tools-2.6.3","syntax_tools-1.6",
    -     "stdlib-1.16","sasl-2.1.6","kernel-2.13","hipe-3.7",
    -     "compiler-4.6"]}
    -15> file:list_dir("TARGET_DIR/erts-5.7").
    -{ok,["bin"]}
    -16> file:list_dir("TARGET_DIR/releases").
    -{ok,["VSN","start_erl.data"]}
    +Erlang R13B02 (erts-5.7.3) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
    +
    +Eshell V5.7.3  (abort with ^G)
    +1> Config = {sys, [{escript, "examples/display_args", [{incl_cond, include}]},
    +		   {app, inets, [{incl_cond, include}]},
    +		   {app, mnesia, [{incl_cond, exclude}]},
    +		   {app, ssl, [{incl_cond, exclude}]},
    +		   {app, runtime_tools, [{incl_cond, exclude}]},
    +		   {app, syntax_tools, [{incl_cond, exclude}]}]}.
    +{sys,[{escript,"examples/display_args",[{incl_cond,include}]},
    +      {app,inets,[{incl_cond,include}]},
    +      {app,mnesia,[{incl_cond,exclude}]},
    +      {app,ssl,[{incl_cond,exclude}]},
    +      {app,runtime_tools,[{incl_cond,exclude}]},
    +      {app,syntax_tools,[{incl_cond,exclude}]}]}
    +
    +
    +
    +2> {ok, Spec} = reltool:get_target_spec([Config]).
    +{ok,[{create_dir,"releases",
    +                 [{write_file,"start_erl.data","5.7.3 1.0"},
    +                  {create_dir,"1.0",
    +                              [{write_file,"start_clean.rel",
    +                                           [37,37,32,114,101,108,32,103,101,110,101,114,97,116|...]},
    +                               {write_file,"start_clean.script",
    +                                           [37,37,32,115,99,114,105,112,116,32,103,101,110|...]},
    +                               {write_file,"start_clean.boot",
    +                                           <<131,104,3,100,0,6,115,99,114,105,112,116,...>>},
    +                               {write_file,"start_sasl.rel",
    +                                           [37,37,32,114,101,108,32,103,101,110,101|...]},
    +                               {write_file,"start_sasl.script",
    +                                           [37,37,32,115,99,114,105,112,116,32|...]},
    +                               {write_file,"start_sasl.boot",
    +                                           <<131,104,3,100,0,6,115,99,114,...>>}]}]},
    +     {create_dir,"bin",
    +                 [{copy_file,"display_args.escript",
    +                             "/clearcase/otp/tools/reltool/examples/display_args"},
    +                  {copy_file,"display_args","erts-5.7.3/bin/escript"},
    +                  {copy_file,"start","erts-5.7.3/bin/start"},
    +                  {copy_file,"erl","erts-5.7.3/bin/dyn_erl"},
    +                  {copy_file,"epmd","erts-5.7.3/bin/epmd"},
    +                  {copy_file,"to_erl","erts-5.7.3/bin/to_erl"},
    +                  {copy_file,"run_erl","erts-5.7.3/bin/run_erl"},
    +                  {copy_file,"escript","erts-5.7.3/bin/escript"},
    +                  {copy_file,"erlc","erts-5.7.3/bin/erlc"},
    +                  {copy_file,"dialyzer","erts-5.7.3/bin/dialyzer"},
    +                  {copy_file,"typer","erts-5.7.3/bin/typer"},
    +                  {write_file,"start_clean.boot",
    +                              <<131,104,3,100,0,6,115,...>>},
    +                  {write_file,"start_sasl.boot",<<131,104,3,100,0,6,...>>},
    +                  {write_file,"start.boot",<<131,104,3,100,0,...>>}]},
    +     {create_dir,"misc",
    +                 [{copy_file,"makewhatis"},{copy_file,"format_man_pages"}]},
    +     {copy_file,"Install"},
    +     {create_dir,"usr",
    +                 [{create_dir,"lib",
    +                              [{copy_file,"liberts_r.a"},{copy_file,"liberts.a"}]},
    +                  {create_dir,"include",
    +                              [{copy_file,"erl_fixed_size_int_types.h"},
    +                               {copy_file,"erl_int_sizes_config.h"},
    +                               {copy_file,"erl_memory_trace_parser.h"},
    +                               {create_dir,"obsolete",[{copy_file,"driver.h"}]},
    +                               {copy_file,"driver_int.h"},
    +                               {copy_file,"erl_driver.h"}]}]},
    +     {create_dir,"erts-5.7.3",
    +                 [{create_dir,"lib",
    +                              [{create_dir,"internal",
    +                                           [{copy_file,"liberts_internal_r.a"},
    +                                            {copy_file,"liberts_internal.a"},
    +                                            {copy_file,"libethread.a"},
    +                                            {copy_file,"README"}]},
    +                               {copy_file,"liberts_r.a"},
    +                               {copy_file,"liberts.a"}]},
    +                  {create_dir,"bin",
    +                              [{copy_file,"start"},
    +                               {copy_file,"erl","erts-5.7.3/bin/dyn_erl"},
    +                               {copy_file,"epmd"},
    +                               {copy_file,"to_erl"},
    +                               {copy_file,"run_erl"},
    +                               {copy_file,"escript"},
    +                               {copy_file,"erlc"},
    +                               {copy_file,"dialyzer"},
    +                               {copy_file,"typer"},
    +                               {copy_file,"erlexec"},
    +                               {copy_file,[...]},
    +                               {copy_file,...},
    +                               {...}|...]},
    +                  {create_dir,"doc",[]},
    +                  {create_dir,"man",[]},
    +                  {create_dir,"include",
    +                              [{create_dir,"internal",
    +                                           [{create_dir,"tile",[{copy_file,...},{...}]},
    +                                            {create_dir,"sparc64",[{...}]},
    +                                            {create_dir,"sparc32",[...]},
    +                                            {create_dir,[...],...},
    +                                            {create_dir,...},
    +                                            {...}|...]},
    +                               {copy_file,"erl_fixed_size_int_types.h"},
    +                               {copy_file,"erl_int_sizes_config.h"},
    +                               {copy_file,"erl_memory_trace_parser.h"},
    +                               {copy_file,"driver_int.h"},
    +                               {copy_file,"erl_driver.h"}]},
    +                  {create_dir,"src",[{copy_file,"setuid_socket_wrap.c"}]}]},
    +     {create_dir,"lib",
    +                 [{archive,"compiler-4.6.3.ez",[],
    +                           [{create_dir,"compiler-4.6.3",
    +                                        [{create_dir,"ebin",
    +                                                     [{copy_file,"compiler.appup"},
    +                                                      {copy_file,[...]},
    +                                                      {copy_file,...},
    +                                                      {...}|...]},
    +                                         {create_dir,"src",
    +                                                     [{copy_file,[...]},{copy_file,...},{...}|...]}]}]},
    +                  {archive,"crypto-1.6.1.ez",[],
    +                           [{create_dir,"crypto-1.6.1",
    +                                        [{create_dir,"ebin",
    +                                                     [{copy_file,[...]},{copy_file,...},{...}|...]},
    +                                         {create_dir,"src",[{copy_file,...},{...}|...]}]}]},
    +                  {create_dir,"crypto-1.6.1",
    +                              [{create_dir,"priv",
    +                                           [{create_dir,"lib",[{copy_file,[...]}]},
    +                                            {create_dir,"obj",[{copy_file,...},{...}]}]}]},
    +                  {archive,"erts-5.7.3.ez",[],
    +                           [{create_dir,"erts-5.7.3",
    +                                        [{create_dir,"ebin",[{...}|...]},
    +                                         {create_dir,"src",[...]}]}]},
    +                  {archive,"hipe-3.7.3.ez",[],
    +                           [{create_dir,"hipe-3.7.3",
    +                                        [{create_dir,"util",[...]},
    +                                         {create_dir,[...],...},
    +                                         {create_dir,...},
    +                                         {...}|...]}]},
    +                  {archive,"kernel-2.13.3.ez",[],
    +                           [{create_dir,"kernel-2.13.3",
    +                                        [{create_dir,[...],...},{create_dir,...},{...}]}]},
    +                  {create_dir,"kernel-2.13.3",
    +                              [{create_dir,"include",
    +                                           [{copy_file,[...]},{copy_file,...},{...}]}]},
    +                  {archive,"stdlib-1.16.3.ez",[],
    +                           [{create_dir,"stdlib-1.16.3",[{...}|...]}]},
    +                  {create_dir,"stdlib-1.16.3",
    +                              [{create_dir,"include",[{...}|...]}]}]}]}
    +
    +
    +
    +3> TargetDir = "my_target_dir".
    +"my_target_dir"
    +4> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).
    +{error,"/clearcase/otp/tools/reltool/my_target_dir: no such file or directory"}
    +5> file:make_dir("my_target_dir").
    +ok
    +6> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).
    +ok
    +7> file:list_dir(TargetDir).
    +{ok,["lib","erts-5.7.3","usr","Install","misc","bin","releases"]}
    +8> file:list_dir(filename:join([TargetDir,"lib"])).
    +{ok,["stdlib-1.16.3","stdlib-1.16.3.ez","kernel-2.13.3",
    +     "kernel-2.13.3.ez","hipe-3.7.3.ez","erts-5.7.3.ez",
    +     "crypto-1.6.1","crypto-1.6.1.ez","compiler-4.6.3.ez"]}
    +9> file:make_dir("yet_another_target_dir").
    +ok
    +10> reltool:create_target(Config, "yet_another_target_dir").
    +ok
         
    diff -Nru erlang-13.b.1-dfsg/lib/reltool/doc/src/reltool_intro.xml erlang-13.b.3-dfsg/lib/reltool/doc/src/reltool_intro.xml --- erlang-13.b.1-dfsg/lib/reltool/doc/src/reltool_intro.xml 2009-03-12 12:26:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/doc/src/reltool_intro.xml 2009-11-20 13:34:45.000000000 +0000 @@ -31,6 +31,7 @@ %VSN% + reltool_intro.xml

    Reltool is a release management tool. It analyses a given Erlang/OTP installation and determines various dependencies between @@ -56,7 +57,7 @@ principles

    -

    The application requires Erlang/OTP release R13A or later.

    +

    The application requires Erlang/OTP release R13B02 or later.

    diff -Nru erlang-13.b.1-dfsg/lib/reltool/doc/src/reltool_usage.xml erlang-13.b.3-dfsg/lib/reltool/doc/src/reltool_usage.xml --- erlang-13.b.1-dfsg/lib/reltool/doc/src/reltool_usage.xml 2009-03-16 14:10:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/doc/src/reltool_usage.xml 2009-11-20 13:34:45.000000000 +0000 @@ -31,6 +31,7 @@ %VSN% + reltool_usage.xml
    @@ -68,7 +69,7 @@

    On the library page it is possible to control which sources that the tool will use. The page is organized as a tree which can be expanded and collapsed by clicking on the little symbol - in the beginning of the expandable/collapsable lines.

    + in the beginning of the expandable/collapsible lines.

    The Root directory can be edited by selecting the line where the path of the root directory is displayed and @@ -115,7 +116,7 @@ applications page. Included contains applications that are explicitly included. Excluded contains applications that are explicitly excluded. Derived contains - applications that either are used directly by excplicitly + applications that either are used directly by explicitly included applications or by other derived applications. Available contains the remaining applications.

    @@ -174,8 +175,11 @@

    Save configuration - Saves the current - configuration to file. Only configuration parameters with - values that differs from their defaults are saved.

    + configuration to file. Normally, only the explictit + configuration parameters with values that differs from their + defaults are saved. But the configuration with or without + default values and with or without derived values may also + be saved.

    Generate rel, script and boot files

    @@ -256,7 +260,7 @@

    By default the Application inclusion policy on system level is used for all applications. Set the value to - include if you want to excplicitly include one particular + include if you want to explicitly include one particular application. Set it to exclude if you want to exclude the application despite that it is used by another (explicitly or implicitly) included application. derived means that the @@ -283,7 +287,7 @@ page. Included contains modules that are explicitly included. Excluded contains modules that are explicitly excluded. Derived contains modules that either are used - directly by excplicitly included modules or by other derived + directly by explicitly included modules or by other derived modules. Available contains the remaining modules.

    Select one or more modules and click on a button directly @@ -294,7 +298,7 @@ module back to the available category. The tick is undone.

    -

    The symbola in front of the module names are intended to +

    The symbols in front of the module names are intended to describe the status of the module. There are error symbols and warning symbols that means that there are something that needs attention. The tick symbol means that the module is included diff -Nru erlang-13.b.1-dfsg/lib/reltool/doc/src/reltool.xml erlang-13.b.3-dfsg/lib/reltool/doc/src/reltool.xml --- erlang-13.b.1-dfsg/lib/reltool/doc/src/reltool.xml 2009-03-12 12:26:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/doc/src/reltool.xml 2009-09-18 15:11:16.000000000 +0100 @@ -35,7 +35,7 @@ reltool Main API of the Reltool application -

    This is an interface module for the Reltool application

    +

    This is an interface module for the Reltool application.

    Reltool is a release management tool. It analyses a given Erlang/OTP installation and determines various dependencies @@ -53,25 +53,27 @@ listed by the operating system environment variable ERL_LIBS. See the module code for more info. Finally single modules and entire applications may be read from - Escripts. The names of the Escripts are given in the configuration - parameter escripts. By default, no Escripts are - included.

    - -

    Some configuration parameters control the behavior of Reltool on system - (sys) level. Others provide control on application (app) - level and yet others are on module (mod) level. Module level - parameters overrides application level parameters and application level - parameters overrides system level parameters.

    + Escripts.

    + +

    Some configuration parameters control the behavior of Reltool + on system (sys) level. Others provide control on + application (app) level and yet others are on module + (mod) level. Module level parameters overrides application + level parameters and application level parameters overrides system + level parameters. Escript escript level parameters + overrides system level parameters.

    The following top level options are supported:

    +

    This is the main option and it controls the configuration of reltool. It can either be a sys tuple or a name of a file containing a sys tuple.

    +

    This option controls the error handling behavior of @@ -79,30 +81,42 @@ exit, but this behavior can altered by setting trap_exit to false.

    +

    This option controls the debug level of wx. As its name indicates it is only useful for debugging. See wx:debug/1 for more info.

    +
    -

    Besides the already mentioned source parameters root_dir, - lib_dirs and escripts, the following system - (sys) level options are supported:

    +

    Besides the already mentioned source parameters root_dir + and lib_dirs, the following system (sys) level + options are supported:

    +

    Erts specific configuration. See application level options below.

    + + + +

    Escript specific configuration. An escript has a mandatory + file name and escript level options that are described + below.

    +
    +

    Application specific configuration. An application has a mandatory name and application level options that are described below.

    +

    This parameter controls the module inclusion policy. It @@ -119,25 +133,28 @@ included modules are included. The mod_cond setting on system level is used as default for all applications.

    + -

    This parameter controls the application inclusion policy. - It defaults to derived which means that the - applications that not have any explicit incl_cond - setting, will only be included if any other (explicitly or - implicitly included) application uses it. The value - include implies that all applications that that not - have any explicit incl_cond setting will be included. - exclude implies that all applications that that not - have any explicit incl_cond setting will be - excluded.

    +

    This parameter controls the application and escript + inclusion policy. It defaults to derived which means + that the applications that not have any explicit + incl_cond setting, will only be included if any other + (explicitly or implicitly included) application uses it. The + value include implies that all applications and + escripts that that not have any explicit incl_cond + setting will be included. exclude implies that all + applications and escripts) that that not have any explicit + incl_cond setting will be excluded.

    +

    A target system may have several releases but the one given as boot_rel will be used as default when the system is booting up.

    +

    Release specific configuration. Each release maps to a @@ -147,6 +164,38 @@ few release specific parameters such as type and included applications.

    + + + +

    This parameter controls whether the erl executable + in the target system automatically should determine where it + is installed or if it should use a hardcoded path to the + installation. In the latter case the target system must be + installed with reltool:install/2 before it can be + used. If the system is relocatable, the file tree containing + the target system can be moved to another location without + re-installation. The default is true.

    +
    + + + +

    The creation of the specification for a target system is + performed in two steps. In the first step a complete + specification is generated. It will likely contain much more + files than you are interested in your customized target + system. In the second step the specification will be filtered + according to your filters. There you have the ability to + specify filters per application as well as system wide + filters. You can also select a profile for your + system. Depending on the profile, different default + filters will be used. There are three different profiles to + choose from: development, embedded and + standalone. development is default. The + parameters that are affected by the profile are: + incl_sys_filters, excl_sys_filters, + incl_app_filters and excl_app_filters.

    +
    +

    This parameter controls the default handling of the @@ -163,6 +212,7 @@ file will be created for all but not for keep and strip.

    +

    The debug_info parameter controls whether the debug @@ -170,35 +220,97 @@ stripped strip when the file is copied to the target system.

    - + + -

    By default only the bin directory is copied to the - target system for erts. This parameter controls if other - directories should be copied. erts may optionally have an - application directory containing erl and beam - files for preloaded code. Which application directories that - shall be copied are controlled with incl_app_dirs and - excl_app_dirs.

    -
    - - -

    This parameter controls which erts directories that not - should be copied to the target system. In order to be copied, - a directory must be included in incl_erts_dirs and NOT - be included in excl_erts_dirs.

    -
    - - -

    By default only the application directories ebin and - priv are copied to the target system. This parameter - controls if other directories should be copied.

    -
    - - -

    This parameter controls which applications directories that - not should be copied to the target system. In order to be - copied, a directory must be included in incl_app_dirs - and NOT be included in excl_app_dirs.

    +

    This parameter normally contains a list of regular + expressions that controls which files in the system that + should be included. Each file in the target system must match + at least one of the listed regular expressions in order to be + included. Further the files may not match any filter in + excl_sys_filters in order to be included. Which + application files that should be included are controlled with + the parameters incl_app_filters and + excl_app_filters. This parameter defaults to + [".*"].

    +
    + + + +

    This parameter normally contains a list of regular + expressions that controls which files in the system that not + should be included in the target system. In order to be + included, a file must match some filter in + incl_sys_filters but not any filter in + excl_sys_filters. This parameter defaults to + [].

    +
    + + +

    This parameter normally contains a list of regular + expressions that controls which application specific files + that should be included. Each file in the application must + match at least one of the listed regular expressions in order + to be included. Further the files may not match any filter in + excl_app_filters in order to be included. This + parameter defaults to [".*"].

    +
    + + + +

    This parameter normally contains a list of regular + expressions that controls which application specific files + that not should be included in the target system. In order to + be included, a file must match some filter in + incl_app_filters but not any filter in + excl_app_filters. This parameter defaults to + [].

    +
    + + + +

    This parameter normally contains a list of regular + expressions that controls which top level directories in an + application that should be included in an archive file (as + opposed of beeing included as a regular directory outside the + archive). Each top directory in the application must match at + least one of the listed regular expressions in order to be + included. Further the files may not match any filter in + excl_app_filters in order to be included. This + parameter defaults to [".*"].

    +
    + + + +

    This parameter normally contains a list of regular + expressions that controls which top level directories in an + application that not should be included in an archive file. In + order to be included in the application archive, a top + directory must match some filter in incl_archive_filters + but not any filter in excl_archive_filters. This + parameter defaults to ["^include$","^priv$"].

    +
    + + + +

    This parameter contains a list of options that are given to + zip:create/3 when application specific files are + packaged into an archive. All options are not supported. The + most useful options in this context, are the ones that + controls which types of files that should be compressed. This + parameter defaults to [].

    +
    + +
    + +

    On application (escript) level,the following options are + supported:

    + + + + +

    The value of this parameter overrides the parameter with the + same name on system level.

    @@ -238,12 +350,30 @@

    The value of this parameter overrides the parameter with the same name on system level.

    - + + +

    The value of this parameter overrides the parameter with the + same name on system level.

    +
    + + +

    The value of this parameter overrides the parameter with the + same name on system level.

    +
    + + + +

    The value of this parameter overrides the parameter with the + same name on system level.

    +
    + +

    The value of this parameter overrides the parameter with the same name on system level.

    - + +

    The value of this parameter overrides the parameter with the same name on system level.

    @@ -277,69 +407,87 @@
    DATA TYPES +options() = [option()] +option() = {config, config() | file()} + | {trap_exit, bool()} + | {wx_debug, term()} +config() = {sys, [sys()]} +sys() = {root_dir, root_dir()} + | {lib_dirs, [lib_dir()]} + | {profile, profile()} + | {erts, app()} + | {escript, escript_file(), [escript()]} + | {app, app_name(), [app()]} + | {mod_cond, mod_cond()} + | {incl_cond, incl_cond()} + | {boot_rel, boot_rel()} + | {rel, rel_name(), rel_vsn(), [rel_app()]} + | {relocatable, relocatable()} + | {app_file, app_file()} + | {debug_info, debug_info()} + | {incl_sys_filters, incl_sys_filters()} + | {excl_sys_filters, excl_sys_filters()} + | {incl_app_filters, incl_app_filters()} + | {excl_app_filters, excl_app_filters()} + | {incl_archive_filters, incl_archive_filters()} + | {excl_archive_filters, excl_archive_filters()} + | {archive_opts, [archive_opt()]} +app() = {vsn, app_vsn()} + | {mod, mod_name(), mod()} + | {mod_cond, mod_cond()} + | {incl_cond, incl_cond()} + | {debug_info, debug_info()} + | {app_file, app_file()} + | {incl_sys_filters, incl_sys_filters()} + | {excl_sys_filters, excl_sys_filters()} + | {incl_app_filters, incl_app_filters()} + | {excl_app_filters, excl_app_filters()} + | {incl_archive_filters, incl_archive_filters()} + | {excl_archive_filters, excl_archive_filters()} + | {archive_opts, [archive_opt()]} +mod() = {vsn, app_vsn()} + | {incl_cond, incl_cond()} + | {debug_info, debug_info()} +rel_app() = app_name() + | {app_name(), app_type()} + | {app_name(), [incl_app()]} + | {app_name(), app_type(), [incl_app()]} +app_name() = atom() +app_type() = permanent | transient | temporary | load | none +app_vsn() = string() +archive_opt = zip_create_opt() +boot_rel() = rel_name() +app_file() = keep | strip | all +debug_info() = keep | strip +dir() = string() +escript() = {incl_cond, incl_cond()} +escript_file() = file() +excl_app_filters() = regexps() +excl_archive_filters() = regexps() +excl_sys_filters() = regexps() +file() = string() +incl_app() = app_name() +incl_app_filters() = regexps() +incl_archive_filters() = regexps() +incl_cond() = include | exclude | derived +incl_sys_filters() = regexps() +lib_dir() = dir() +mod_cond() = all | app | ebin | derived | none +mod_name() = atom() +profile() = development | embedded | standalone +re_regexp() = string() +reason() = string() +regexps() = [re_regexp()] | {add, [re_regexp()]} | {del, [re_regexp()]} +rel_file() = term() +rel_name() = string() +rel_vsn() = string() +relocatable = boolean() +root_dir() = dir() +script_file() = term() +server() = server_pid() | options() +server_pid() = pid() +target_dir() = file() +window_pid() = pid()]]>
    @@ -349,12 +497,54 @@ create_target(Server, TargetDir) -> ok | {error, Reason} Create a target system - Server = server() - TargetDir = dir() + Server = server() + TargetDir = target_dir() + Reason = reason() + +

    Create a target system. Gives the same result as + {ok,TargetSpec}=reltool:get_target_spec(Server) and + reltool:eval_target_spec(TargetSpec,RootDir,TargetDir).

    + + + + eval_target_spec(TargetSpec, RootDir, TargetDir) -> ok | {error, Reason} + Create a target system + + TargetSpec = target_spec() + RootDir = root_dir() + TargetDir = target_dir() Reason = reason() -

    Create a target system. In order to be able to run the target - system, it must be installed first.

    +

    Create the actual target system from a specification + generated by reltool:get_target_spec/1. The creation of + the specification for a target system is performed in two + steps. In the first step a complete specification will be + generated. It will likely contain much more files than you are + interested in in your target system. In the second step the + specification will be filtered according to your filters. There + you have the ability to specify filters per application as well + as system wide filters. You can also select a profile for + your system. Depending on the profile, different default + filters will be used.

    + +

    The top directories bin, releases and + lib are treated differently from other files. All other + files are by default copied to the target system. The + releases directory contains generated rel, + script, and boot files. The lib directory + contains the applications. Which applications that are included + and if they should be customized (archived, stripped from debug + info etc.) is specified with various configuration + parameters. The files in the bin directory are copied + from the erts-vsn/bin directory, but only those files + that was originally included in bin directory of the + source system.

    + +

    If the configuration parameter relocatable was set to + true there is no need to install the target system with + reltool:install/2 before it can be started. In that case + the file tree containing the target system can be moved without + re-installation.

    @@ -365,8 +555,26 @@ Config = config() Reason = reason() -

    Get reltool configuration. Only configuration parameters with - values that differs from their defaults are returned.

    +

    Get reltool configuration. Shorthand for + reltool:get_config(Server,false,false).

    +
    + + + get_config(Server, InclDefaults, InclDerived) -> {ok, Config} | {error, Reason} + Get reltool configuration + + Server = server() + InclDefaults = incl_defaults() + InclDerived = incl_derived() + Config = config() + Reason = reason() + +

    Get reltool configuration. Normally, only the explicit + configuration parameters with values that differs from their + defaults are interesting. But the builtin default values can be + returned by setting InclDefaults to true. The + derived configuration can be return by setting + InclDerived to true.

    @@ -396,17 +604,52 @@ + get_server(WindowPid) -> {ok, ServerPid} | {error, Reason} + Start server process with options + + WindowPid = window_pid() + ServerPid = server_pid() + Reason = reason() + +

    Return the process identifier of the server process.

    +
    + + + get_target_spec(Server) -> {ok, targetSpec} | {error, Reason} + Return a specification of the target system + + Server = server() + TargetSpec = target_spec() + Reason = reason() + +

    Return a specification of the target system. The actual + target system can be created with + reltool:eval_target_spec/3.

    +
    +
    + + install(Server, TargetDir) -> ok | {error, Reason} Install a target system Server = server() - TargetDir = dir() + TargetDir = target_dir() Reason = reason()

    Install a created target system

    + start() -> {ok, WindowPid} | {error, Reason} + Start main window process + + WindowPid = window_pid() + Reason = reason() + +

    Start a main window process with default options

    +
    + + start(Options) -> {ok, WindowPid} | {error, Reason} Start main window process with options @@ -418,6 +661,17 @@ + start_link(Options) -> {ok, WindowPid} | {error, Reason} + Start main window process with options + + Options = options() + WindowPid = window_pid() + Reason = reason() + +

    Start a main window process with options. The process is linked.

    +
    + + start_server(Options) -> {ok, ServerPid} | {error, Reason} Start server process with options diff -Nru erlang-13.b.1-dfsg/lib/reltool/examples/display_args erlang-13.b.3-dfsg/lib/reltool/examples/display_args --- erlang-13.b.1-dfsg/lib/reltool/examples/display_args 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/examples/display_args 2009-11-20 13:34:49.000000000 +0000 @@ -0,0 +1,8 @@ +#!/usr/bin/env escript +%% -*- erlang -*- +%%! -smp disable + +main(Args) -> + io:format("Root dir: ~s\n", [code:root_dir()]), + io:format("Script args: ~p\n", [Args]), + io:format("Smp: ~p\n", [erlang:system_info(smp_support)]). diff -Nru erlang-13.b.1-dfsg/lib/reltool/examples/Makefile erlang-13.b.3-dfsg/lib/reltool/examples/Makefile --- erlang-13.b.1-dfsg/lib/reltool/examples/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/examples/Makefile 2009-09-18 15:11:31.000000000 +0100 @@ -0,0 +1,79 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../vsn.mk +VSN=$(RELTOOL_VSN) + +# ---------------------------------------------------- +# Release Macros +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/reltool-$(VSN) + +# ---------------------------------------------------- +# Common Macros +# ---------------------------------------------------- + + +MODULES = + +ERL_FILES= $(MODULES:=.erl) + +HRL_FILES = + +DATA_FILES = \ + display_args \ + mnesia_core_dump_viewer + +# TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) +TARGET_FILES = + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- +ERL_COMPILE_FLAGS += -pa ../ebin +EBIN = . + +# ---------------------------------------------------- +# Make Rules +# ---------------------------------------------------- +debug opt: $(TARGET_FILES) + +clean: + rm -f $(TARGET_FILES) *~ + +docs: + +# ---------------------------------------------------- +# Release Targets +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + +release_spec: opt + $(INSTALL_DIR) $(RELSYSDIR)/examples + $(INSTALL_DATA) $(ERL_FILES) $(DATA_FILES) $(HRL_FILES) $(RELSYSDIR)/examples + +release_docs_spec: + diff -Nru erlang-13.b.1-dfsg/lib/reltool/examples/mnesia_core_dump_viewer erlang-13.b.3-dfsg/lib/reltool/examples/mnesia_core_dump_viewer --- erlang-13.b.1-dfsg/lib/reltool/examples/mnesia_core_dump_viewer 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/examples/mnesia_core_dump_viewer 2009-09-18 15:11:31.000000000 +0100 @@ -0,0 +1,54 @@ +#!/usr/bin/env escript +%% -*- erlang -*- +%% +%% Pretty print a Mnesia Core Dump +%% +%% core_dump_viewer CoreFile [OutputFile] +%% +%% Status codes: +%% +%% 0 -> Ok +%% 1 -> Bad usage +%% 2 -> Cannot read Mnesia Core file +%% 3 -> Cannot write to file + +-mode(compile). + +main([CoreFile | OptOutputFile]) when CoreFile =/= "--help" -> + %% io:format("Args: ~p\n", [init:get_arguments()]), + case file:read_file(CoreFile) of + {ok, Bin} -> + Core = binary_to_term(Bin), + PrettyCore = io_lib:format("~p\n", [Core]), + PrettyBin = list_to_binary(PrettyCore), + case OptOutputFile of + [OutputFile] -> + case file:write_file(OutputFile, PrettyBin) of + ok -> + ok; + {error, Reason} -> + io:format(" Cannot write to file ~p ~p\n", + [OutputFile, Reason]), + halt(3) + end; + [] -> + io:format("~p\n", [Core]), + io:format("ok\n", []), + timer:sleep(timer:seconds(2)), % Poor mans flush of io buffers + init:stop(); + _ -> + usage() + end; + {error, Reason} -> + io:format(" Cannot read Mnesia Core file ~p ~p\n", + [CoreFile, Reason]), + halt(2) + end; +main(_BadArgs) -> + usage(). + +usage() -> + FullName = escript:script_name(), + BaseName = filename:basename(FullName), + io:format("usage: ~s CoreFile [OutputFile]\n", [BaseName]), + halt(1). diff -Nru erlang-13.b.1-dfsg/lib/reltool/Makefile erlang-13.b.3-dfsg/lib/reltool/Makefile --- erlang-13.b.1-dfsg/lib/reltool/Makefile 2009-03-12 12:26:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/Makefile 2009-09-18 15:11:10.000000000 +0100 @@ -23,7 +23,7 @@ # Macros # ---------------------------------------------------- -SUB_DIRECTORIES = src doc/src +SUB_DIRECTORIES = src examples doc/src include vsn.mk VSN = $(RELTOOL_VSN) diff -Nru erlang-13.b.1-dfsg/lib/reltool/src/Makefile erlang-13.b.3-dfsg/lib/reltool/src/Makefile --- erlang-13.b.1-dfsg/lib/reltool/src/Makefile 2009-03-12 12:26:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/src/Makefile 2009-09-18 15:11:11.000000000 +0100 @@ -78,6 +78,12 @@ docs: # ---------------------------------------------------- +# Dependencies +# ---------------------------------------------------- + +$(TARGET_FILES): $(HRL_FILES) $(INTERNAL_HRL_FILES) + +# ---------------------------------------------------- # Release Target # ---------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/reltool/src/reltool_app_win.erl erlang-13.b.3-dfsg/lib/reltool/src/reltool_app_win.erl --- erlang-13.b.1-dfsg/lib/reltool/src/reltool_app_win.erl 2009-04-16 10:25:51.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/src/reltool_app_win.erl 2009-09-18 15:11:11.000000000 +0100 @@ -19,7 +19,7 @@ -module(reltool_app_win). %% Public --export([start/4, raise/1, refresh/1, open_mod/2]). +-export([start_link/4, raise/1, refresh/1, open_mod/2]). %% Internal -export([init/5, loop/1]). @@ -78,41 +78,21 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Client -start(WxEnv, Xref, Common, AppName) -> +start_link(WxEnv, Xref, Common, AppName) -> proc_lib:start_link(?MODULE, init, [self(), WxEnv, Xref, Common, AppName], infinity, []). raise(Pid) -> - cast(Pid, raise). + reltool_utils:cast(Pid, raise). refresh(Pid) -> - cast(Pid, refresh). + reltool_utils:cast(Pid, refresh). open_mod(Pid, ModName) -> - call(Pid, {open_mod, ModName}). - -call(Name, Msg) when is_atom(Name) -> - call(whereis(Name), Msg); -call(Pid, Msg) when is_pid(Pid) -> - Ref = erlang:monitor(process, Pid), - Pid ! {call, self(), Ref, Msg}, - receive - {Ref, Reply} -> - erlang:demonitor(Ref, [flush]), - Reply; - {'DOWN', Ref, _, _, Reason} -> - {error, Reason} - end. - -cast(Pid, Msg) -> - Pid ! {cast, self(), Msg}, - ok. + reltool_utils:call(Pid, {open_mod, ModName}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Server -reply(Pid, Ref, Msg) -> - Pid ! {Ref, Msg}. - init(Parent, WxEnv, Xref, C, AppName) -> try do_init(Parent, WxEnv, Xref, C, AppName) @@ -160,7 +140,7 @@ {call, ReplyTo, Ref, {open_mod, ModName}} -> S2 = create_mod_window(S, ModName), {value, #mod_win{pid = ModPid}} = lists:keysearch(ModName, #mod_win.name, S2#state.mod_wins), - reply(ReplyTo, Ref, {ok, ModPid}), + reltool_utils:reply(ReplyTo, Ref, {ok, ModPid}), ?MODULE:loop(S2); #wx{event = #wxSize{}} = Wx -> Wx2 = reltool_utils:get_latest_resize(Wx), @@ -589,7 +569,7 @@ case lists:keysearch(ModName, #mod_win.name, S#state.mod_wins) of false -> WxEnv = wx:get_env(), - {ok, Pid} = reltool_mod_win:start(WxEnv, Xref, RelPid, C, ModName), + {ok, Pid} = reltool_mod_win:start_link(WxEnv, Xref, RelPid, C, ModName), MW = #mod_win{name = ModName, pid = Pid}, S#state{mod_wins = [MW | S#state.mod_wins]}; {value, MW} -> @@ -882,7 +862,7 @@ Local end, Choice = GetChoice(AppCond), - wxListBox:setSelection(LocalBox, Choice). + wxRadioBox:setSelection(LocalBox, Choice). redraw_window(S) -> %% wx_misc:beginBusyCursor(), diff -Nru erlang-13.b.1-dfsg/lib/reltool/src/reltool.erl erlang-13.b.3-dfsg/lib/reltool/src/reltool.erl --- erlang-13.b.1-dfsg/lib/reltool/src/reltool.erl 2009-03-12 12:26:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/src/reltool.erl 2009-09-18 15:11:12.000000000 +0100 @@ -21,72 +21,104 @@ %% Public -export([ main/1, % Escript - start/0, start/1, debug/0, % GUI - start_server/1, stop/1, - get_config/1, get_rel/2, get_script/2, - create_target/2, install/2 + start/0, start/1, start_link/1, debug/0, % GUI + start_server/1, get_server/1, stop/1, + get_config/1, get_config/3, get_rel/2, get_script/2, + create_target/2, get_target_spec/1, eval_target_spec/3, + install/2 ]). --type file() :: string(). --type dir() :: string(). --type mod_cond() :: all | app | ebin | derived | none. --type incl_cond() :: include | exclude | derived. --type debug_info() :: keep | strip. --type app_file() :: keep | strip | all. --type incl_erts_dir() :: dir(). --type excl_erts_dir() :: dir(). --type incl_app_dir() :: dir(). --type excl_app_dir() :: dir(). --type root_dir() :: dir(). --type lib_dir() :: dir(). --type escript() :: file(). --type mod_name() :: atom(). --type app_name() :: atom(). --type app_vsn() :: string(). --type app_type() :: permanent | transient | temporary | load | none. --type incl_app() :: app_name(). --type rel_name() :: string(). --type rel_vsn() :: string(). --type boot_rel() :: rel_name(). --type rel_app() :: app_name() - | {app_name(), app_type()} - | {app_name(), [incl_app()]} - | {app_name(), app_type(), [incl_app()]}. --type mod() :: {incl_cond, incl_cond()} - | {debug_info, debug_info()}. --type app() :: {vsn, app_vsn()} - | {mod, mod_name(), mod()} - | {mod_cond, mod_cond()} - | {incl_cond, incl_cond()} - | {app_file, app_file()} - | {debug_info, debug_info()} - | {incl_app_dirs, [incl_app_dir()]} - | {excl_app_dirs, [excl_app_dir()]}. --type sys() :: {mod_cond, mod_cond()} - | {incl_cond, incl_cond()} - | {debug_info, debug_info()} - | {app_file, app_file()} - | {incl_erts_dirs, [incl_erts_dir()]} - | {excl_erts_dirs, [excl_erts_dir()]} - | {incl_app_dirs, [incl_app_dir()]} - | {excl_app_dirs, [excl_app_dir()]} - | {root_dir, root_dir()} - | {lib_dirs, [lib_dir()]} - | {escripts, [escript()]} - | {boot_rel, boot_rel()} - | {rel, rel_name(), rel_vsn(), [rel_app()]} - | {erts, app()} - | {app, app_name(), [app()]}. --type config() :: {sys, [sys()]}. --type option() :: {wx_debug, term()} | {trap_exit, bool()} | {config, config() | file()}. --type options() :: [option()]. --type server_pid() :: pid(). --type window_pid() :: pid(). --type server() :: server_pid() | options(). --type rel_file() :: term(). --type script_file() :: term(). --type reason() :: string(). --type escript_arg() :: string(). +-type file() :: string(). +-type dir() :: string(). +-type mod_cond() :: all | app | ebin | derived | none. +-type incl_cond() :: include | exclude | derived. +-type debug_info() :: keep | strip. +-type app_file() :: keep | strip | all. +-type re_regexp() :: string(). +-type regexps() :: [re_regexp()] | {add, [re_regexp()]} | {del, [re_regexp()]} . +-type incl_sys_filters() :: regexps(). +-type excl_sys_filters() :: regexps(). +-type incl_app_filters() :: regexps(). +-type excl_app_filters() :: regexps(). +-type incl_archive_filters() :: regexps(). +-type excl_archive_filters() :: regexps(). +-type archive_opt() :: term(). +-type root_dir() :: dir(). +-type lib_dir() :: dir(). +-type profile() :: development | embedded | standalone. +-type relocatable() :: boolean(). +-type escript_file() :: file(). +-type mod_name() :: atom(). +-type app_name() :: atom(). +-type app_vsn() :: string(). +-type app_type() :: permanent | transient | temporary | load | none. +-type incl_app() :: app_name(). +-type rel_name() :: string(). +-type rel_vsn() :: string(). +-type boot_rel() :: rel_name(). +-type rel_app() :: app_name() + | {app_name(), app_type()} + | {app_name(), [incl_app()]} + | {app_name(), app_type(), [incl_app()]}. +-type mod() :: {incl_cond, incl_cond()} + | {debug_info, debug_info()}. +-type app() :: {vsn, app_vsn()} + | {mod, mod_name(), mod()} + | {mod_cond, mod_cond()} + | {incl_cond, incl_cond()} + | {app_file, app_file()} + | {debug_info, debug_info()} + | {incl_app_filters, incl_app_filters()} + | {excl_app_filters, excl_app_filters()} + | {incl_archive_filters, incl_archive_filters()} + | {excl_archive_filters, excl_archive_filters()}. +-type escript() :: {incl_cond, incl_cond()}. +-type sys() :: {mod_cond, mod_cond()} + | {incl_cond, incl_cond()} + | {debug_info, debug_info()} + | {app_file, app_file()} + | {profile, profile()} + | {incl_sys_filters, incl_sys_filters()} + | {excl_sys_filters, excl_sys_filters()} + | {incl_app_filters, incl_app_filters()} + | {excl_app_filters, excl_app_filters()} + | {incl_archive_filters, incl_archive_filters()} + | {excl_archive_filters, excl_archive_filters()} + | {archive_opts, [archive_opt()]} + | {root_dir, root_dir()} + | {lib_dirs, [lib_dir()]} + | {boot_rel, boot_rel()} + | {rel, rel_name(), rel_vsn(), [rel_app()]} + | {relocatable, relocatable()} + | {erts, app()} + | {escript, escript_file(), [escript()]} + | {app, app_name(), [app()]}. +-type config() :: {sys, [sys()]}. +-type option() :: {wx_debug, term()} | {trap_exit, boolean()} | config() | {config, config() | file()}. +-type options() :: [option()]. +-type server_pid() :: pid(). +-type window_pid() :: pid(). +-type server() :: server_pid() | options(). +-type rel_file() :: term(). +-type script_file() :: term(). +-type reason() :: string(). +-type escript_arg() :: string(). +%%-type base_dir() :: dir(). +%%-type base_file() :: file(). +%%-type top_dir() :: file(). +%%-type top_file() :: file(). +%%-type target_spec() :: [target_spec()] +%% | {create_dir, base_dir(), [target_spec()]} +%% | {create_dir, base_dir(), top_dir(), [target_spec()]} +%% | {archive, base_file(), [archive_opt()], [target_spec()]} +%% | {copy_file, base_file()} +%% | {copy_file, base_file(), top_file()} +%% | {write_file, base_file(), iolist()} +%% | {strip_beam_file, base_file()}. +-type target_spec() :: term(). +-type target_dir() :: dir(). +-type incl_defaults() :: boolean(). +-type incl_derived() :: boolean(). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -94,37 +126,42 @@ -spec main([escript_arg()]) -> ok. main(_) -> process_flag(trap_exit, true), - {ok, Pid} = start([]), + {ok, WinPid} = start_link([]), receive - {'EXIT', Pid, shutdown} -> + {'EXIT', WinPid, shutdown} -> ok; - {'EXIT', Pid, normal} -> + {'EXIT', WinPid, normal} -> ok; - {'EXIT', Pid, Reason} -> + {'EXIT', WinPid, Reason} -> io:format("EXIT: ~p\n", [Reason]), erlang:halt(1) end. %% Start main window process --spec start() -> {ok, pid()}. +-spec start() -> {ok, window_pid()}. start() -> - {ok, Pid} = start([]), - unlink(Pid), - {ok, Pid}. + start([]). + +%% Start main window process +-spec start(options()) -> {ok, window_pid() | {error, reason()}}. +start(Options)when is_list(Options) -> + {ok, WinPid} = start_link(Options), + unlink(WinPid), + {ok, WinPid}. %% Start main window process with wx debugging enabled --spec debug() -> {ok, pid()}. +-spec debug() -> {ok, window_pid()}. debug() -> - {ok, Pid} = start([{wx_debug, 2}]), - unlink(Pid), - {ok, Pid}. + {ok, WinPid} = start_link([{wx_debug, 2}]), + unlink(WinPid), + {ok, WinPid}. %% Start main window process with options --spec start(options()) -> {ok, window_pid() | {error, reason()}}. -start(Options) when is_list(Options) -> - case reltool_sys_win:start(Options) of - {ok, Pid} -> - {ok, Pid}; +-spec start_link(options()) -> {ok, window_pid() | {error, reason()}}. +start_link(Options) when is_list(Options) -> + case reltool_sys_win:start_link(Options) of + {ok, WinPid} -> + {ok, WinPid}; {error, Reason} -> {error, lists:flatten(io_lib:format("~p", [Reason]))} end. @@ -132,9 +169,19 @@ %% Start server process with options -spec start_server(options()) -> {ok, server_pid()} | {error, reason()}. start_server(Options) -> - case reltool_server:start(Options) of - {ok, Pid, _Common, _Sys} -> - {ok, Pid}; + case reltool_server:start_link(Options) of + {ok, ServerPid, _Common, _Sys} -> + {ok, ServerPid}; + {error, Reason} -> + {error, lists:flatten(io_lib:format("~p", [Reason]))} + end. + +%% Start server process with options +-spec get_server(window_pid()) -> {ok, server_pid()} | {error, reason()}. +get_server(WinPid) -> + case reltool_sys_win:get_server(WinPid) of + {ok, ServerPid} -> + {ok, ServerPid}; {error, Reason} -> {error, lists:flatten(io_lib:format("~p", [Reason]))} end. @@ -168,8 +215,12 @@ %% Get reltool configuration -spec get_config(server()) -> {ok, config()} | {error, reason()}. -get_config(PidOrOptions) when is_pid(PidOrOptions); is_list(PidOrOptions) -> - eval_server(PidOrOptions, fun(Pid) -> reltool_server:get_config(Pid) end). +get_config(PidOrOption) -> + get_config(PidOrOption, false, false). + +-spec get_config(server(), incl_defaults(), incl_derived()) -> {ok, config()} | {error, reason()}. +get_config(PidOrOptions, InclDefaults, InclDerived) when is_pid(PidOrOptions); is_list(PidOrOptions) -> + eval_server(PidOrOptions, fun(Pid) -> reltool_server:get_config(Pid, InclDefaults, InclDerived) end). %% Get contents of release file -spec get_rel(server(), rel_name()) -> {ok, rel_file()} | {error, reason()}. @@ -182,10 +233,20 @@ eval_server(PidOrOptions, fun(Pid) -> reltool_server:get_script(Pid, RelName) end). %% Generate a target system --spec create_target(server(), dir()) -> ok | {error, reason()}. +-spec create_target(server(), target_dir()) -> ok | {error, reason()}. create_target(PidOrOptions, TargetDir) when is_pid(PidOrOptions); is_list(PidOrOptions) -> eval_server(PidOrOptions, fun(Pid) -> reltool_server:gen_target(Pid, TargetDir) end). +%% Generate a target system +-spec get_target_spec(server()) -> {ok, target_spec()} | {error, reason()}. +get_target_spec(PidOrOptions) when is_pid(PidOrOptions); is_list(PidOrOptions) -> + eval_server(PidOrOptions, fun(Pid) -> reltool_server:gen_spec(Pid) end). + +%% Generate a target system +-spec eval_target_spec(target_spec(), root_dir(), target_dir()) -> ok | {error, reason()}. +eval_target_spec(Spec, SourceDir, TargetDir) when is_list(SourceDir), is_list(TargetDir) -> + reltool_target:eval_spec(Spec, SourceDir, TargetDir). + %% Install a target system -spec install(rel_name(), dir()) -> ok | {error, reason()}. install(RelName, TargetDir) -> diff -Nru erlang-13.b.1-dfsg/lib/reltool/src/reltool.hrl erlang-13.b.3-dfsg/lib/reltool/src/reltool.hrl --- erlang-13.b.1-dfsg/lib/reltool/src/reltool.hrl 2009-04-16 10:25:51.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/src/reltool.hrl 2009-09-18 15:11:13.000000000 +0100 @@ -21,67 +21,92 @@ -define(MISSING_APP_TEXT, "*MISSING*"). -record(common, - {sys_debug, % term() - wx_debug, % term() - trap_exit, % bool() - app_tab, % ets_tab() - mod_tab, % ets_tab() - mod_used_by_tab}). % ets_tab() + { + sys_debug, % term() + wx_debug, % term() + trap_exit, % bool() + app_tab, % ets_tab() + mod_tab, % ets_tab() + mod_used_by_tab % ets_tab() + }). -record(sys, - {mod_cond, % all | app | ebin | derived | none - incl_cond, % include | exclude | derived - debug_info, % keep | strip - app_file, % keep | strip | all - profile, % standalone | development | embedded - emu_name, % string() - incl_erts_dirs, % all | [directory()] | {add, [directory()]} | {del, [directory()]} - excl_erts_dirs, % all | [directory()] | {add, [directory()]} | {del, [directory()]} - incl_app_dirs, % all | [directory()] | {add, [directory()]} | {del, [directory()]} - excl_app_dirs, % all | [directory()] | {add, [directory()]} | {del, [directory()]} - root_dir, % directory() - lib_dirs, % [directory()] - escripts, % [file()] - apps, % [#app{}] - boot_rel, % string() - rels}). % [#rel{}] + { + %% Sources + root_dir, % directory() + lib_dirs, % [directory()] + escripts, % [file()] + mod_cond, % all | app | ebin | derived | none + incl_cond, % include | exclude | derived + apps, % [#app{}] + + %% Target cond + boot_rel, % string() + rels, % [#rel{}] + emu_name, % string() + profile, % standalone | development | embedded + incl_sys_filters, % [regexp()] + excl_sys_filters, % [regexp()] + incl_app_filters, % [regexp()] + excl_app_filters, % [regexp()] + incl_archive_filters, % [regexp()] + excl_archive_filters, % [regexp()] + archive_opts, % [zip:create()] + relocatable, % bool() + app_type, % permanent | transient | temporary | load | none + app_file, % keep | strip | all + debug_info % keep | strip + }). -record(rel, - {name, % string() - vsn, % string() - rel_apps}). % [#rel_app{}] + { + name, % string() + vsn, % string() + rel_apps % [#rel_app{}] + }). -record(rel_app, - {name, % atom() - type, % permanent | transient | temporary | load | none - incl_apps}). % [atom()] + { + name, % atom() + app_type, % permanent | transient | temporary | load | none + incl_apps % [atom()] + }). -record(app, - {%% Static - name, % atom() - is_escript, % bool() - mod_cond, % all | app | ebin | derived | none | undefined - incl_cond, % include | exclude | derived | undefined - debug_info, % keep | strip | undefined - app_file, % keep | strip | all | undefined - incl_app_dirs, % all | [directory()] | {add, [directory()]} | {del, [directory()]} | undefined - excl_app_dirs, % all | [directory()] | {add, [directory()]} | {del, [directory()]} | undefined - use_selected_vsn,% bool() | undefined - active_dir, % dir_name() - sorted_dirs, % [dir_name()] - vsn, % string() e.g. "4.7" - label, % string() e.g. "mnesia" or "mnesia-4.7" - info, % #app_info{} | undefined - mods, % [#mod{}] - type, % permanent | transient | temporary | load | none - %% Dynamic - status, % missing | ok - uses_mods, % [atom()] - used_by_mods, % [atom()] - uses_apps, % [atom()] - used_by_apps, % [atom()] - is_pre_included, % bool() - is_included}). % bool() + {%% Static info + name, % atom() + is_escript, % bool() + use_selected_vsn,% bool() | undefined + active_dir, % dir_name() + sorted_dirs, % [dir_name()] + vsn, % string() e.g. "4.7" + label, % string() e.g. "mnesia" or "mnesia-4.7" + info, % #app_info{} | undefined + mods, % [#mod{}] + + %% Static source cond + mod_cond, % all | app | ebin | derived | none | undefined + incl_cond, % include | exclude | derived | undefined + + %% Static target cond + debug_info, % keep | strip | undefined + app_file, % keep | strip | all | undefined + app_type, % permanent | transient | temporary | load | none + incl_app_filters, % [regexp()] + excl_app_filters, % [regexp()] + incl_archive_filters, % [regexp()] + excl_archive_filters, % [regexp()] + archive_opts, % [zip_create_opt()] + + %% Dynamic + status, % missing | ok + uses_mods, % [atom()] + used_by_mods, % [atom()] + uses_apps, % [atom()] + used_by_apps, % [atom()] + is_pre_included, % bool() + is_included % bool() + }). -record(mod, {%% Static @@ -97,25 +122,30 @@ status, % missing | ok used_by_mods, % [atom()] is_pre_included, % bool() | undefined - is_included}). % bool() | undefined + is_included % bool() | undefined + }). %% app - Include all modules in app file %% ebin - Include all modules on ebin directory %% derived - Include only those modules that others are dependent on -record(app_info, - {description = "", - id = "", - vsn = "", - modules = [], - maxP = infinity, - maxT = infinity, - registered = [], - incl_apps = [], - applications = [], - env = [], - mod = undefined, - start_phases = undefined}). + { + description = "", + id = "", + vsn = "", + modules = [], + maxP = infinity, + maxT = infinity, + registered = [], + incl_apps = [], + applications = [], + env = [], + mod = undefined, + start_phases = undefined + }). + +-record(regexp, {source, compiled}). -define(ERR_IMAGE, 0). -define(WARN_IMAGE, 1). @@ -127,12 +157,46 @@ -define(KEYSEARCH(Key, Pos, List), reltool_utils:safe_keysearch(Key, Pos, List, ?MODULE, ?LINE)). --define(DEFAULT_INCL_COND, derived). --define(DEFAULT_MOD_COND, all). --define(DEFAULT_DEBUG_INFO, keep). --define(DEFAULT_APP_FILE, keep). --define(DEFAULT_INCL_APP_DIRS, ["ebin", "priv"]). --define(DEFAULT_EXCL_APP_DIRS, []). --define(DEFAULT_INCL_ERTS_DIRS, ["bin"]). --define(DEFAULT_EXCL_ERTS_DIRS, []). --define(DEFAULT_REL_NAME, "start_clean"). +-define(DEFAULT_LIBS, []). +-define(DEFAULT_APPS, []). +-define(DEFAULT_INCL_COND, derived). +-define(DEFAULT_MOD_COND, all). +-define(DEFAULT_REL_NAME, "start_clean"). +-define(DEFAULT_EMU_NAME, "beam"). +-define(DEFAULT_PROFILE, development). +-define(DEFAULT_RELOCATABLE, true). +-define(DEFAULT_APP_TYPE, permanent). +-define(DEFAULT_APP_FILE, keep). +-define(DEFAULT_DEBUG_INFO, keep). + +-define(DEFAULT_INCL_ARCHIVE_FILTERS, [".*"]). +-define(DEFAULT_EXCL_ARCHIVE_FILTERS, ["^include$", "^priv$"]). +-define(DEFAULT_ARCHIVE_OPTS, []). + +-define(DEFAULT_INCL_SYS_FILTERS, [".*"]). +-define(DEFAULT_EXCL_SYS_FILTERS, []). +-define(DEFAULT_INCL_APP_FILTERS, [".*"]). +-define(DEFAULT_EXCL_APP_FILTERS, []). + +-define(EMBEDDED_INCL_SYS_FILTERS, ["^bin", + "^erts", + "^lib", + "^releases"]). +-define(EMBEDDED_EXCL_SYS_FILTERS, ["^bin/(erlc|dialyzer|typer)(|\\.exe)$", + "^erts.*/bin/(erlc|dialyzer|typer)(|\\.exe)$", + "^erts.*/bin/.*(debug|pdb)"]). +-define(EMBEDDED_INCL_APP_FILTERS, ["^ebin", + "^priv", + "^include"]). +-define(EMBEDDED_EXCL_APP_FILTERS, []). + +-define(STANDALONE_INCL_SYS_FILTERS, ["^bin/(erl|epmd)(|\\.exe|\\.ini)$", + "^bin/start(|_clean).boot$", + "^erts.*/bin", + "^lib$"]). +-define(STANDALONE_EXCL_SYS_FILTERS, ["^erts.*/bin/(erlc|dialyzer|typer)(|\\.exe)$", + "^erts.*/bin/(start|escript|to_erl|run_erl)(|\\.exe)$", + "^erts.*/bin/.*(debug|pdb)"]). +-define(STANDALONE_INCL_APP_FILTERS, ["^ebin", + "^priv"]). +-define(STANDALONE_EXCL_APP_FILTERS, ["^ebin/.*\\.appup$"]). diff -Nru erlang-13.b.1-dfsg/lib/reltool/src/reltool_mod_win.erl erlang-13.b.3-dfsg/lib/reltool/src/reltool_mod_win.erl --- erlang-13.b.1-dfsg/lib/reltool/src/reltool_mod_win.erl 2009-04-16 10:25:51.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/src/reltool_mod_win.erl 2009-09-18 15:11:13.000000000 +0100 @@ -19,7 +19,7 @@ -module(reltool_mod_win). %% Public --export([start/5, raise/1, refresh/1]). +-export([start_link/5, raise/1, refresh/1]). %% Internal -export([init/6, loop/1]). @@ -86,38 +86,18 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Client -start(WxEnv, Xref, RelPid, Common, ModName) -> +start_link(WxEnv, Xref, RelPid, Common, ModName) -> proc_lib:start_link(?MODULE, init, [self(), WxEnv, Xref, RelPid, Common, ModName], infinity, []). raise(Pid) -> - cast(Pid, raise). + reltool_utils:cast(Pid, raise). refresh(Pid) -> - cast(Pid, refresh). - -%% call(Name, Msg) when is_atom(Name) -> -%% call(whereis(Name), Msg); -%% call(Pid, Msg) when is_pid(Pid) -> -%% Ref = erlang:monitor(process, Pid), -%% Pid ! {call, self(), Ref, Msg}, -%% receive -%% {Ref, Reply} -> -%% erlang:demonitor(Ref, [flush]), -%% Reply; -%% {'DOWN', Ref, _, _, Reason} -> -%% {error, Reason} -%% end. - -cast(Pid, Msg) -> - Pid ! {cast, self(), Msg}, - ok. + reltool_utils:cast(Pid, refresh). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Server -%% reply(Pid, Ref, Msg) -> -%% Pid ! {Ref, Msg}. - init(Parent, WxEnv, Xref, RelPid, C, ModName) -> try do_init(Parent, WxEnv, Xref, RelPid, C, ModName) @@ -360,7 +340,7 @@ [_] -> Bin = GetBin(), case beam_lib:version(Bin) of - {ok,{M, _}} when M =:= ModName -> + {ok,{M, _}} when M =:= ModName; FullName =:= "." -> case beam_lib:chunks(Bin, [abstract_code]) of {ok,{_,[{abstract_code,{_,AC}}]}} -> {obj, list_to_binary(erl_prettypr:format(erl_syntax:form_list(AC)))}; @@ -765,7 +745,7 @@ load_code(Ed, Code) when is_binary(Code) -> wxStyledTextCtrl:setReadOnly(Ed, false), - wxStyledTextCtrl:setTextRaw(Ed, Code), + wxStyledTextCtrl:setTextRaw(Ed, <>), Lines = wxStyledTextCtrl:getLineCount(Ed), Sz = trunc(math:log10(Lines))+1, LW = wxStyledTextCtrl:textWidth(Ed, ?wxSTC_STYLE_LINENUMBER, lists:duplicate(Sz, $9)), diff -Nru erlang-13.b.1-dfsg/lib/reltool/src/reltool_server.erl erlang-13.b.3-dfsg/lib/reltool/src/reltool_server.erl --- erlang-13.b.1-dfsg/lib/reltool/src/reltool_server.erl 2009-04-16 10:25:52.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/src/reltool_server.erl 2009-09-18 15:11:13.000000000 +0100 @@ -20,15 +20,16 @@ %% Public -export([ - start/0, start/1, - get_config/1, load_config/2, save_config/2, - get_rel/2, get_script/2, - reset_config/1, undo_config/1, + start_link/0, start_link/1, + get_config/3, load_config/2, save_config/4, + get_rel/2, get_script/2, + reset_config/1, undo_config/1, get_mod/2, get_app/2, set_app/2, - get_apps/2, set_apps/2, + get_apps/2, set_apps/2, get_sys/1, set_sys/2, - gen_rel_files/2, gen_target/2 + get_status/1, + gen_rel_files/2, gen_target/2, gen_spec/1 ]). %% Internal @@ -45,135 +46,130 @@ -record(state, {options, - parent_pid, + parent_pid, common, sys, - old_sys}). + old_sys, + status, + old_status}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Client -start() -> - start([]). +start_link() -> + start_link([]). -start(Options) -> +start_link(Options) -> proc_lib:start_link(?MODULE, init, [[{parent, self()} | Options]], infinity, []). -get_config(Pid) -> - call(Pid, get_config). +get_config(Pid, InclDefaults, InclDerivates) -> + reltool_utils:call(Pid, {get_config, InclDefaults, InclDerivates}). load_config(Pid, FilenameOrConfig) -> - call(Pid, {load_config, FilenameOrConfig}). + reltool_utils:call(Pid, {load_config, FilenameOrConfig}). -save_config(Pid, Filename) -> - call(Pid, {save_config, Filename}). +save_config(Pid, Filename, InclDefaults, InclDerivates) -> + reltool_utils:call(Pid, {save_config, Filename, InclDefaults, InclDerivates}). reset_config(Pid) -> - call(Pid, reset_config). + reltool_utils:call(Pid, reset_config). undo_config(Pid) -> - call(Pid, undo_config). + reltool_utils:call(Pid, undo_config). get_rel(Pid, RelName) -> - call(Pid, {get_rel, RelName}). + reltool_utils:call(Pid, {get_rel, RelName}). get_script(Pid, RelName) -> - call(Pid, {get_script, RelName}). + reltool_utils:call(Pid, {get_script, RelName}). get_mod(Pid, ModName) -> - call(Pid, {get_mod, ModName}). + reltool_utils:call(Pid, {get_mod, ModName}). get_app(Pid, AppName) -> - call(Pid, {get_app, AppName}). + reltool_utils:call(Pid, {get_app, AppName}). set_app(Pid, App) -> - call(Pid, {set_app, App}). + reltool_utils:call(Pid, {set_app, App}). get_apps(Pid, Kind) -> - call(Pid, {get_apps, Kind}). + reltool_utils:call(Pid, {get_apps, Kind}). set_apps(Pid, Apps) -> - call(Pid, {set_apps, Apps}). + reltool_utils:call(Pid, {set_apps, Apps}). get_sys(Pid) -> - call(Pid, get_sys). + reltool_utils:call(Pid, get_sys). set_sys(Pid, Sys) -> - call(Pid, {set_sys, Sys}). + reltool_utils:call(Pid, {set_sys, Sys}). + +get_status(Pid) -> + reltool_utils:call(Pid, get_status). gen_rel_files(Pid, Dir) -> - call(Pid, {gen_rel_files, Dir}). + reltool_utils:call(Pid, {gen_rel_files, Dir}). gen_target(Pid, Dir) -> - call(Pid, {gen_target, Dir}). + reltool_utils:call(Pid, {gen_target, Dir}). -call(Name, Msg) when is_atom(Name) -> - call(whereis(Name), Msg); -call(Pid, Msg) when is_pid(Pid) -> - Ref = erlang:monitor(process, Pid), - %% io:format("Send~p: ~p\n", [self(), Msg]), - Pid ! {self(), Ref, Msg}, - receive - {Ref, Reply} -> - %% io:format("Rec~p: ~p\n", [self(), Reply]), - erlang:demonitor(Ref, [flush]), - Reply; - {'DOWN', Ref, _, _, Reason} -> - {error, Reason} - end. +gen_spec(Pid) -> + reltool_utils:call(Pid, gen_spec). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Server -reply(Pid, Ref, Msg) -> - Pid ! {Ref, Msg}. - init(Options) -> try - do_init(Options) + do_init(Options) catch - error:Reason -> - exit({Reason, erlang:get_stacktrace()}) + error:Reason -> + exit({Reason, erlang:get_stacktrace()}) end. do_init(Options) -> case parse_options(Options) of {#state{parent_pid = ParentPid, common = C, sys = Sys} = S, Status} -> - %% process_flag(trap_exit, (S#state.common)#common.trap_exit), + %% process_flag(trap_exit, (S#state.common)#common.trap_exit), proc_lib:init_ack(ParentPid, {ok, self(), C, Sys#sys{apps = undefined}}), {S2, Status2} = refresh(S, true, Status), - {S3, Status3} = analyse(S2#state{old_sys = S2#state.sys}, Status2), - case Status3 of - {ok, _} -> - loop(S3); - {error, Reason} -> - exit(Reason) - end + {S3, Status3} = analyse(S2#state{old_sys = S2#state.sys}, Status2), + case Status3 of + {ok, _Warnings} -> + loop(S3#state{status = Status3, old_status = {ok, []}}); + {error, Reason} -> + exit(Reason) + end end. parse_options(Opts) -> AppTab = ets:new(reltool_apps, [public, ordered_set, {keypos, #app.name}]), ModTab = ets:new(reltool_mods, [public, ordered_set, {keypos, #mod.name}]), ModUsesTab = ets:new(reltool_mod_uses, [public, bag, {keypos, 1}]), - Sys = #sys{incl_cond = ?DEFAULT_INCL_COND, - mod_cond = ?DEFAULT_MOD_COND, - debug_info = ?DEFAULT_DEBUG_INFO, - app_file = ?DEFAULT_APP_FILE, - emu_name = "beam", - profile = development, - incl_erts_dirs = ?DEFAULT_INCL_ERTS_DIRS, - excl_erts_dirs = ?DEFAULT_EXCL_ERTS_DIRS, - incl_app_dirs = ?DEFAULT_INCL_APP_DIRS, - excl_app_dirs = ?DEFAULT_EXCL_APP_DIRS, - root_dir = reltool_utils:root_dir(), - lib_dirs = reltool_utils:erl_libs(), - escripts = [], - apps = [], - boot_rel = ?DEFAULT_REL_NAME, - rels = reltool_utils:default_rels()}, + Sys = #sys{root_dir = reltool_utils:root_dir(), + lib_dirs = reltool_utils:erl_libs(), + escripts = [], + incl_cond = ?DEFAULT_INCL_COND, + mod_cond = ?DEFAULT_MOD_COND, + apps = ?DEFAULT_APPS, + boot_rel = ?DEFAULT_REL_NAME, + rels = reltool_utils:default_rels(), + emu_name = ?DEFAULT_EMU_NAME, + profile = ?DEFAULT_PROFILE, + incl_sys_filters = reltool_utils:decode_regexps(incl_sys_filters, ?DEFAULT_INCL_SYS_FILTERS, []), + excl_sys_filters = reltool_utils:decode_regexps(excl_sys_filters, ?DEFAULT_EXCL_SYS_FILTERS, []), + incl_app_filters = reltool_utils:decode_regexps(incl_app_filters, ?DEFAULT_INCL_APP_FILTERS, []), + excl_app_filters = reltool_utils:decode_regexps(excl_app_filters, ?DEFAULT_EXCL_APP_FILTERS, []), + relocatable = ?DEFAULT_RELOCATABLE, + app_type = ?DEFAULT_APP_TYPE, + app_file = ?DEFAULT_APP_FILE, + incl_archive_filters = reltool_utils:decode_regexps(incl_archive_filters, ?DEFAULT_INCL_ARCHIVE_FILTERS, []), + excl_archive_filters = reltool_utils:decode_regexps(excl_archive_filters, ?DEFAULT_EXCL_ARCHIVE_FILTERS, []), + archive_opts = ?DEFAULT_ARCHIVE_OPTS, + debug_info = ?DEFAULT_DEBUG_INFO}, C2 = #common{sys_debug = [], wx_debug = 0, - trap_exit = true, + trap_exit = true, app_tab = AppTab, mod_tab = ModTab, mod_used_by_tab = ModUsesTab}, @@ -191,191 +187,201 @@ trap_exit -> parse_options(KeyVals, S, C#common{trap_exit = Val}, Sys, Status); config -> - {Sys2, Status2} = read_config(Sys, Val, Status), + {Sys2, Status2} = read_config(Sys, Val, Status), + parse_options(KeyVals, S, C, Sys2, Status2); + sys -> + {Sys2, Status2} = read_config(Sys, {sys, Val}, Status), parse_options(KeyVals, S, C, Sys2, Status2); - incl_cond -> - parse_options(KeyVals, S, C, Sys#sys{incl_cond = Val}, Status); - mod_cond -> - parse_options(KeyVals, S, C, Sys#sys{mod_cond = Val}, Status); - root_dir -> - parse_options(KeyVals, S, C, Sys#sys{root_dir = Val}, Status); - lib_dirs -> - parse_options(KeyVals, S, C, Sys#sys{lib_dirs = Val}, Status); - escripts -> - parse_options(KeyVals, S, C, Sys#sys{escripts = Val}, Status); _ -> - Text = lists:flatten(io_lib:format("~p", [{Key, Val}])), - Status2 = reltool_utils:return_first_error(Status, "Illegal parameter: " ++ Text), + Text = lists:flatten(io_lib:format("~p", [{Key, Val}])), + Status2 = reltool_utils:return_first_error(Status, "Illegal option: " ++ Text), parse_options(KeyVals, S, C, Sys, Status2) end; parse_options([], S, C, Sys, Status) -> - {S#state{common = C, sys = Sys}, Status}. + {S#state{common = C, sys = Sys}, Status}; +parse_options(KeyVals, S, C, Sys, Status) -> + Text = lists:flatten(io_lib:format("~p", [KeyVals])), + Status2 = reltool_utils:return_first_error(Status, "Illegal options: " ++ Text), + {S#state{common = C, sys = Sys}, Status2}. loop(#state{common = C, sys = Sys} = S) -> receive {system, From, Msg} -> sys:handle_system_msg(Msg, From, S#state.parent_pid, ?MODULE, C#common.sys_debug, S); - {ReplyTo, Ref, get_config} -> - Reply = do_get_config(S), - reply(ReplyTo, Ref, Reply), + {call, ReplyTo, Ref, {get_config, InclDefaults, InclDerivates}} -> + Reply = do_get_config(S, InclDefaults, InclDerivates), + reltool_utils:reply(ReplyTo, Ref, Reply), ?MODULE:loop(S); - {ReplyTo, Ref, {load_config, SysConfig}} -> - {S2, Reply} = do_load_config(S, SysConfig), - reply(ReplyTo, Ref, Reply), + {call, ReplyTo, Ref, {load_config, SysConfig}} -> + {S2, Reply} = do_load_config(S, SysConfig), + reltool_utils:reply(ReplyTo, Ref, Reply), ?MODULE:loop(S2); - {ReplyTo, Ref, {save_config, Filename}} -> - Reply = do_save_config(S, Filename), - reply(ReplyTo, Ref, Reply), + {call, ReplyTo, Ref, {save_config, Filename, InclDefaults, InclDerivates}} -> + Reply = do_save_config(S, Filename, InclDefaults, InclDerivates), + reltool_utils:reply(ReplyTo, Ref, Reply), ?MODULE:loop(S); - {ReplyTo, Ref, reset_config} -> - {S2, Status} = parse_options(S#state.options), - S3 = shrink_sys(S2), - {S4, Status2} = refresh(S3, true, Status), - {S5, Status3} = analyse(S4#state{old_sys = S4#state.sys}, Status2), - S6 = - case Status3 of - {ok, _} -> - S5; - {error, _} -> - S - end, - reply(ReplyTo, Ref, Status2), + {call, ReplyTo, Ref, reset_config} -> + {S2, Status} = parse_options(S#state.options), + S3 = shrink_sys(S2), + {S4, Status2} = refresh(S3, true, Status), + {S5, Status3} = analyse(S4#state{old_sys = S4#state.sys}, Status2), + S6 = + case Status3 of + {ok, _Warnings} -> + S5#state{status = Status3, old_status = S#state.status}; + {error, _} -> + S + end, + reltool_utils:reply(ReplyTo, Ref, Status3), ?MODULE:loop(S6); - {ReplyTo, Ref, undo_config} -> - reply(ReplyTo, Ref, ok), - ?MODULE:loop(S#state{sys = S#state.old_sys, old_sys = S#state.sys}); - {ReplyTo, Ref, {get_rel, RelName}} -> - Sys = S#state.sys, - Reply = - case lists:keysearch(RelName, #rel.name, Sys#sys.rels) of - {value, Rel} -> - {ok, reltool_target:gen_rel(Rel, Sys)}; - false -> - {error, "No such release"} - end, - reply(ReplyTo, Ref, Reply), + {call, ReplyTo, Ref, undo_config} -> + reltool_utils:reply(ReplyTo, Ref, ok), + S2 = S#state{sys = S#state.old_sys, + old_sys = S#state.sys, + status = S#state.old_status, + old_status = S#state.status}, + ?MODULE:loop(S2); + {call, ReplyTo, Ref, {get_rel, RelName}} -> + Sys = S#state.sys, + Reply = + case lists:keysearch(RelName, #rel.name, Sys#sys.rels) of + {value, Rel} -> + {ok, reltool_target:gen_rel(Rel, Sys)}; + false -> + {error, "No such release"} + end, + reltool_utils:reply(ReplyTo, Ref, Reply), ?MODULE:loop(S); - {ReplyTo, Ref, {get_script, RelName}} -> - Sys = S#state.sys, - Reply = - case lists:keysearch(RelName, #rel.name, Sys#sys.rels) of - {value, Rel} -> - PathFlag = true, - Variables = [], - reltool_target:gen_script(Rel, Sys, PathFlag, Variables); - false -> - {error, "No such release"} - end, - reply(ReplyTo, Ref, Reply), + {call, ReplyTo, Ref, {get_script, RelName}} -> + Sys = S#state.sys, + Reply = + case lists:keysearch(RelName, #rel.name, Sys#sys.rels) of + {value, Rel} -> + PathFlag = true, + Variables = [], + reltool_target:gen_script(Rel, Sys, PathFlag, Variables); + false -> + {error, "No such release"} + end, + reltool_utils:reply(ReplyTo, Ref, Reply), ?MODULE:loop(S); - {ReplyTo, Ref, {get_mod, ModName}} -> + {call, ReplyTo, Ref, {get_mod, ModName}} -> Reply = - case ets:lookup(C#common.mod_tab, ModName) of - [M] -> - {ok, M}; - [] -> - {ok, missing_mod(ModName, ?MISSING_APP)} - end, - reply(ReplyTo, Ref, Reply), + case ets:lookup(C#common.mod_tab, ModName) of + [M] -> + {ok, M}; + [] -> + {ok, missing_mod(ModName, ?MISSING_APP)} + end, + reltool_utils:reply(ReplyTo, Ref, Reply), + ?MODULE:loop(S); + {call, ReplyTo, Ref, {get_app, AppName}} when is_atom(AppName) -> + Reply = + case lists:keysearch(AppName, #app.name, Sys#sys.apps) of + {value, App} -> + {ok, App}; + false -> + {error, enoent} + end, + reltool_utils:reply(ReplyTo, Ref, Reply), ?MODULE:loop(S); - {ReplyTo, Ref, {get_app, AppName}} when is_atom(AppName) -> - Reply = - case lists:keysearch(AppName, #app.name, Sys#sys.apps) of - {value, App} -> - {ok, App}; - false -> - {error, enoent} - end, - reply(ReplyTo, Ref, Reply), + {call, ReplyTo, Ref, {set_app, App}} -> + {S2, Status} = do_set_app(S, App, {ok, []}), + {S3, Status2} = analyse(S2, Status), + case Status2 of + {ok, Warnings} -> + App2 = ?KEYSEARCH(App#app.name, + #app.name, + (S3#state.sys)#sys.apps), + reltool_utils:reply(ReplyTo, Ref, {ok, App2, Warnings}), + ?MODULE:loop(S3); + {error, Reason} -> + reltool_utils:reply(ReplyTo, Ref, {error, Reason}), + ?MODULE:loop(S) + end; + {call, ReplyTo, Ref, {get_apps, Kind}} -> + AppNames = + case Kind of + whitelist -> + [A || + A <- Sys#sys.apps, + A#app.is_pre_included =:= true]; + blacklist -> + [A || + A <- Sys#sys.apps, + A#app.is_pre_included =:= false]; + source -> + [A || + A <- Sys#sys.apps, + A#app.is_included =/= true, + A#app.is_pre_included =/= false]; + derived -> + [A || + A <- Sys#sys.apps, + A#app.is_included =:= true, + A#app.is_pre_included =/= true] + end, + reltool_utils:reply(ReplyTo, Ref, {ok, AppNames}), ?MODULE:loop(S); - {ReplyTo, Ref, {set_app, App}} -> - {S2, Status} = do_set_app(S, App, {ok, []}), - {S3, Status2} = analyse(S2, Status), - case Status2 of - {ok, Warnings} -> - App2 = ?KEYSEARCH(App#app.name, - #app.name, - (S3#state.sys)#sys.apps), - reply(ReplyTo, Ref, {ok, App2, Warnings}), - ?MODULE:loop(S3); - {error, Reason} -> - reply(ReplyTo, Ref, {error, Reason}), - ?MODULE:loop(S) - end; - {ReplyTo, Ref, {get_apps, Kind}} -> - AppNames = - case Kind of - whitelist -> - [A || - A <- Sys#sys.apps, - A#app.is_pre_included =:= true]; - blacklist -> - [A || - A <- Sys#sys.apps, - A#app.is_pre_included =:= false]; - source -> - [A || - A <- Sys#sys.apps, - A#app.is_included =/= true, - A#app.is_pre_included =/= false]; - derived -> - [A || - A <- Sys#sys.apps, - A#app.is_included =:= true, - A#app.is_pre_included =/= true] - end, - reply(ReplyTo, Ref, {ok, AppNames}), - ?MODULE:loop(S); - {ReplyTo, Ref, {set_apps, Apps}} -> - {S2, Status} = lists:foldl(fun(A, {X, Y}) -> do_set_app(X, A, Y) end, {S, {ok, []}}, Apps), - {S3, Status2} = analyse(S2, Status), - reply(ReplyTo, Ref, Status2), - ?MODULE:loop(S3); - {ReplyTo, Ref, get_sys} -> - reply(ReplyTo, Ref, {ok, Sys#sys{apps = undefined}}), - ?MODULE:loop(S); - {ReplyTo, Ref, {set_sys, Sys2}} -> - S2 = S#state{sys = Sys2#sys{apps = Sys#sys.apps}}, - Force = - (Sys2#sys.root_dir =/= Sys#sys.root_dir) orelse - (Sys2#sys.lib_dirs =/= Sys#sys.lib_dirs) orelse - (Sys2#sys.escripts =/= Sys#sys.escripts), - {S3, Status} = refresh(S2, Force, {ok, []}), - {S4, Status2} = analyse(S3#state{old_sys = S#state.sys}, Status), - S6 = - case Status2 of - {ok, _} -> - S4; - {error, _} -> - S - end, - reply(ReplyTo, Ref, Status), - ?MODULE:loop(S6); - {ReplyTo, Ref, {gen_rel_files, Dir}} -> - Status = - case reltool_target:gen_rel_files(S#state.sys, Dir) of - ok -> - {ok, []}; - {error, Reason} -> - {error, Reason} - end, - reply(ReplyTo, Ref, Status), - ?MODULE:loop(S); - {ReplyTo, Ref, {gen_target, Dir}} -> - Reply = reltool_target:gen_target(S#state.sys, Dir), - reply(ReplyTo, Ref, Reply), - ?MODULE:loop(S); - {'EXIT', Pid, Reason} when Pid =:= S#state.parent_pid -> - exit(Reason); - {ReplyTo, Ref, Msg} when is_pid(ReplyTo), is_reference(Ref) -> - error_logger:format("~p~p got unexpected call:\n\t~p\n", - [?MODULE, self(), Msg]), - reply(ReplyTo, Ref, {error, {invalid_call, Msg}}), - ?MODULE:loop(S); - Msg -> - error_logger:format("~p~p got unexpected message:\n\t~p\n", - [?MODULE, self(), Msg]), - ?MODULE:loop(S) + {call, ReplyTo, Ref, {set_apps, Apps}} -> + {S2, Status} = lists:foldl(fun(A, {X, Y}) -> do_set_app(X, A, Y) end, + {S, {ok, []}}, + Apps), + {S3, Status2} = analyse(S2, Status), + reltool_utils:reply(ReplyTo, Ref, Status2), + ?MODULE:loop(S3); + {call, ReplyTo, Ref, get_sys} -> + reltool_utils:reply(ReplyTo, Ref, {ok, Sys#sys{apps = undefined}}), + ?MODULE:loop(S); + {call, ReplyTo, Ref, {set_sys, Sys2}} -> + S2 = S#state{sys = Sys2#sys{apps = Sys#sys.apps}}, + Force = + (Sys2#sys.root_dir =/= Sys#sys.root_dir) orelse + (Sys2#sys.lib_dirs =/= Sys#sys.lib_dirs) orelse + (Sys2#sys.escripts =/= Sys#sys.escripts), + {S3, Status} = refresh(S2, Force, {ok, []}), + {S4, Status2} = analyse(S3#state{old_sys = S#state.sys}, Status), + S6 = + case Status2 of + {ok, _Warnings} -> + S4#state{status = Status2, old_status = S#state.status}; + {error, _} -> + S + end, + reltool_utils:reply(ReplyTo, Ref, Status2), + ?MODULE:loop(S6); + {call, ReplyTo, Ref, get_status} -> + reltool_utils:reply(ReplyTo, Ref, S#state.status), + ?MODULE:loop(S); + {call, ReplyTo, Ref, {gen_rel_files, Dir}} -> + Status = + case reltool_target:gen_rel_files(S#state.sys, Dir) of + ok -> + {ok, []}; + {error, Reason} -> + {error, Reason} + end, + reltool_utils:reply(ReplyTo, Ref, Status), + ?MODULE:loop(S); + {call, ReplyTo, Ref, {gen_target, Dir}} -> + Reply = reltool_target:gen_target(S#state.sys, Dir), + reltool_utils:reply(ReplyTo, Ref, Reply), + ?MODULE:loop(S); + {call, ReplyTo, Ref, gen_spec} -> + Reply = reltool_target:gen_spec(S#state.sys), + reltool_utils:reply(ReplyTo, Ref, Reply), + ?MODULE:loop(S); + {'EXIT', Pid, Reason} when Pid =:= S#state.parent_pid -> + exit(Reason); + {call, ReplyTo, Ref, Msg} when is_pid(ReplyTo), is_reference(Ref) -> + error_logger:format("~p~p got unexpected call:\n\t~p\n", + [?MODULE, self(), Msg]), + reltool_utils:reply(ReplyTo, Ref, {error, {invalid_call, Msg}}), + ?MODULE:loop(S); + Msg -> + error_logger:format("~p~p got unexpected message:\n\t~p\n", + [?MODULE, self(), Msg]), + ?MODULE:loop(S) end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -385,7 +391,8 @@ {App2, Status2} = refresh_app(App, false, Status), Apps = Sys#sys.apps, Apps2 = lists:keystore(AppName, #app.name, Apps, App2), - Sys2 = Sys#sys{apps = Apps2}, + Escripts = [A#app.active_dir || A <- Apps2, A#app.is_escript], + Sys2 = Sys#sys{apps = Apps2, escripts = Escripts}, {S#state{sys = Sys2}, Status2}. analyse(#state{common = C, sys = #sys{apps = Apps0} = Sys} = S, Status) -> @@ -396,33 +403,33 @@ MissingApp = default_app(?MISSING_APP, "missing"), ets:insert(C#common.app_tab, MissingApp), - Apps2 = app_init_is_included(C, Sys, Apps, []), + Apps2 = lists:map(fun(App) -> app_init_is_included(C, Sys, App) end, Apps), Apps3 = - case app_propagate_is_included(C, Sys, Apps2, []) of - [] -> - Apps2; - MissingMods -> - %% io:format("Missing mods: ~p\n", [MissingMods]), - MissingApp2 = MissingApp#app{label = ?MISSING_APP_TEXT, - info = missing_app_info(""), - mods = MissingMods, - status = missing, - uses_mods = []}, - [MissingApp2 | Apps2] - end, + case app_propagate_is_included(C, Sys, Apps2, []) of + [] -> + Apps2; + MissingMods -> + %% io:format("Missing mods: ~p\n", [MissingMods]), + MissingApp2 = MissingApp#app{label = ?MISSING_APP_TEXT, + info = missing_app_info(""), + mods = MissingMods, + status = missing, + uses_mods = []}, + [MissingApp2 | Apps2] + end, app_propagate_is_used_by(C, Apps3), Apps4 = read_apps(C, Sys, Apps3, []), %% io:format("Missing app: ~p\n", [lists:keysearch(?MISSING_APP, #app.name, Apps4)]), Sys2 = Sys#sys{apps = Apps4}, try - Status2 = verify_config(Sys2, Status), - {S#state{sys = Sys2}, Status2} + Status2 = verify_config(Sys2, Status), + {S#state{sys = Sys2}, Status2} catch - throw:{error, Status3} -> - {S, Status3} + throw:{error, Status3} -> + {S, Status3} end. -app_init_is_included(C, Sys, [#app{mods = Mods} = A | Apps], Acc) -> +app_init_is_included(C, Sys, #app{mods = Mods} = A) -> AppCond = case A#app.incl_cond of undefined -> Sys#sys.incl_cond; @@ -441,12 +448,11 @@ end, A2 = A#app{is_pre_included = IsIncl, is_included = IsIncl}, ets:insert(C#common.app_tab, A2), - mod_init_is_included(C, Mods, ModCond, AppCond), - app_init_is_included(C, Sys, Apps, [A2 | Acc]); -app_init_is_included(_C, _Sys, [], Acc) -> - lists:reverse(Acc). + lists:foreach(fun(Mod) -> mod_init_is_included(C, Mod, ModCond, AppCond, undefined) end, Mods), + %%app_mod_init_is_included(C, AppName, Info, ModCond, AppCond), + A2. -mod_init_is_included(C, [M | Mods], ModCond, AppCond) -> +mod_init_is_included(C, M, ModCond, AppCond, Default) -> %% print(M#mod.name, hipe, "incl_cond -> ~p\n", [AppCond]), IsIncl = case AppCond of @@ -462,7 +468,7 @@ all -> true; app -> false_to_undefined(M#mod.is_app_mod); ebin -> false_to_undefined(M#mod.is_ebin_mod); - derived -> undefined; + derived -> Default; none -> false end end; @@ -475,15 +481,12 @@ exclude -> false; undefined -> - undefined + Default end end, M2 = M#mod{is_pre_included = IsIncl, is_included = IsIncl}, %% print(M#mod.name, hipe, "~p -> ~p\n", [M2, IsIncl]), - ets:insert(C#common.mod_tab, M2), - mod_init_is_included(C, Mods, ModCond, AppCond); -mod_init_is_included(_C, [], _ModCond, _AppCond) -> - ok. + ets:insert(C#common.mod_tab, M2). false_to_undefined(Bool) -> case Bool of @@ -502,92 +505,92 @@ %% print(ModName, file, "Maybe Prop ~p -> ~p\n", [M2, M2#mod.is_included]), %% print(ModName, filename, "Maybe Prop ~p -> ~p\n", [M2, M2#mod.is_included]), Acc2 = - case M2#mod.is_included of - true -> - %% Propagate include mark - mod_mark_is_included(C, Sys, ModName, M2#mod.uses_mods, Acc); - false -> - Acc; - undefined -> - Acc - end, + case M2#mod.is_included of + true -> + %% Propagate include mark + mod_mark_is_included(C, Sys, ModName, M2#mod.uses_mods, Acc); + false -> + Acc; + undefined -> + Acc + end, mod_propagate_is_included(C, Sys, A, Mods, Acc2); mod_propagate_is_included(_C, _Sys, _A, [], Acc) -> Acc. mod_mark_is_included(C, Sys, UsedByName, [ModName | ModNames], Acc) -> Acc3 = - case ets:lookup(C#common.mod_tab, ModName) of - [M] -> - %% print(UsedByName, file, "Maybe Mark ~p -> ~p\n", [M, M#mod.is_included]), - %% print(UsedByName, filename, "Maybe Mark ~p -> ~p\n", [M, M#mod.is_included]), - case M#mod.is_included of - true -> - %% Already marked - Acc; - false -> - %% Already marked - Acc; - undefined -> - %% Mark and propagate - M2 = - case M#mod.incl_cond of - include -> - M#mod{is_pre_included = true, is_included = true}; - exclude -> - M#mod{is_pre_included = true, is_included = true}; - undefined -> - M#mod{is_included = true} - end, - ets:insert(C#common.mod_tab, M2), - %% io:format("Propagate mod: ~p -> ~p (~p)\n", [UsedByName, ModName, M#mod.incl_cond]), - [A] = ets:lookup(C#common.app_tab, M2#mod.app_name), - Acc2 = - case A#app.is_included of - true -> - Acc; - false -> - Acc; - undefined -> - ModCond = - case A#app.mod_cond of - undefined -> Sys#sys.mod_cond; - _ -> A#app.mod_cond - end, - Filter = - fun(M3) -> - case ModCond of - all -> true; - app -> M3#mod.is_app_mod; - ebin -> M3#mod.is_ebin_mod; - derived -> false; - none -> false - end - end, - Mods = lists:filter(Filter, A#app.mods), - %% io:format("Propagate app: ~p ~p -> ~p\n", - %% [UsedByName, A#app.name, [M3#mod.name || M3 <- Mods]]), - A2 = A#app{is_included = true}, - ets:insert(C#common.app_tab, A2), - mod_mark_is_included(C, Sys, ModName, [M3#mod.name || M3 <- Mods], Acc) - end, - mod_mark_is_included(C, Sys, ModName, M2#mod.uses_mods, Acc2) - end; - [] -> - M = missing_mod(ModName, ?MISSING_APP), - M2 = M#mod{is_included = true}, - ets:insert(C#common.mod_tab, M2), - ets:insert(C#common.mod_used_by_tab, {UsedByName, ModName}), - [M2 | Acc] - end, + case ets:lookup(C#common.mod_tab, ModName) of + [M] -> + %% print(UsedByName, file, "Maybe Mark ~p -> ~p\n", [M, M#mod.is_included]), + %% print(UsedByName, filename, "Maybe Mark ~p -> ~p\n", [M, M#mod.is_included]), + case M#mod.is_included of + true -> + %% Already marked + Acc; + false -> + %% Already marked + Acc; + undefined -> + %% Mark and propagate + M2 = + case M#mod.incl_cond of + include -> + M#mod{is_pre_included = true, is_included = true}; + exclude -> + M#mod{is_pre_included = true, is_included = true}; + undefined -> + M#mod{is_included = true} + end, + ets:insert(C#common.mod_tab, M2), + %% io:format("Propagate mod: ~p -> ~p (~p)\n", [UsedByName, ModName, M#mod.incl_cond]), + [A] = ets:lookup(C#common.app_tab, M2#mod.app_name), + Acc2 = + case A#app.is_included of + true -> + Acc; + false -> + Acc; + undefined -> + ModCond = + case A#app.mod_cond of + undefined -> Sys#sys.mod_cond; + _ -> A#app.mod_cond + end, + Filter = + fun(M3) -> + case ModCond of + all -> true; + app -> M3#mod.is_app_mod; + ebin -> M3#mod.is_ebin_mod; + derived -> false; + none -> false + end + end, + Mods = lists:filter(Filter, A#app.mods), + %% io:format("Propagate app: ~p ~p -> ~p\n", + %% [UsedByName, A#app.name, [M3#mod.name || M3 <- Mods]]), + A2 = A#app{is_included = true}, + ets:insert(C#common.app_tab, A2), + mod_mark_is_included(C, Sys, ModName, [M3#mod.name || M3 <- Mods], Acc) + end, + mod_mark_is_included(C, Sys, ModName, M2#mod.uses_mods, Acc2) + end; + [] -> + M = missing_mod(ModName, ?MISSING_APP), + M2 = M#mod{is_included = true}, + ets:insert(C#common.mod_tab, M2), + ets:insert(C#common.mod_used_by_tab, {UsedByName, ModName}), + [M2 | Acc] + end, mod_mark_is_included(C, Sys, UsedByName, ModNames, Acc3); mod_mark_is_included(_C, _Sys, _UsedByName, [], Acc) -> Acc. app_propagate_is_used_by(C, [#app{mods = Mods, name = Name} | Apps]) -> case Name =:= ?MISSING_APP of - true -> ok; - false -> ok + true -> ok; + false -> ok end, mod_propagate_is_used_by(C, Mods), app_propagate_is_used_by(C, Apps); @@ -630,8 +633,8 @@ status = Status, uses_mods = UsesMods2, used_by_mods = UsedByMods2, - uses_apps = UsesApps2, - used_by_apps = UsedByApps2, + uses_apps = UsesApps2, + used_by_apps = UsedByApps2, is_included = IsIncl2}, read_apps(C, Sys, Apps, [A2 | Acc]); read_apps(_C, _Sys, [], Acc) -> @@ -639,7 +642,7 @@ read_apps(C, Sys, A, [#mod{name = ModName} | Mods], Acc, IsIncl) -> [M2] = ets:lookup(C#common.mod_tab, ModName), - Status = get_status(M2), + Status = do_get_status(M2), %% print(M2#mod.name, hipe, "status -> ~p\n", [Status]), {IsIncl2, M3} = case M2#mod.is_included of @@ -654,7 +657,7 @@ read_apps(_C, _Sys, _A, [], Acc, IsIncl) -> {lists:reverse(Acc), IsIncl}. -get_status(M) -> +do_get_status(M) -> if M#mod.exists =:= false, M#mod.is_included =/= false -> missing; @@ -668,88 +671,109 @@ filter_app(A) -> Mods = [M#mod{is_app_mod = undefined, - is_ebin_mod = undefined, - uses_mods = undefined, - exists = false, - is_pre_included = undefined, - is_included = undefined} || - M <- A#app.mods, - M#mod.incl_cond =/= undefined], + is_ebin_mod = undefined, + uses_mods = undefined, + exists = false, + is_pre_included = undefined, + is_included = undefined} || + M <- A#app.mods, + M#mod.incl_cond =/= undefined], if - Mods =:= [], - A#app.mod_cond =:= undefined, - A#app.incl_cond =:= undefined, - A#app.use_selected_vsn =:= undefined -> - false; - true -> - {Dir, Dirs} = - case A#app.use_selected_vsn of - true -> {A#app.active_dir, [A#app.active_dir]}; - false -> {shrinked, []}; - undefined -> {shrinked, []} - end, - OptVsn = - case A#app.use_selected_vsn of - undefined -> undefined; - false -> undefined; - true -> A#app.vsn - end, - {true, A#app{active_dir = Dir, - sorted_dirs = Dirs, - vsn = OptVsn, - label = undefined, - info = undefined, - mods = Mods, - uses_mods = undefined, - is_included = undefined}} + A#app.is_escript -> + {true, A#app{vsn = undefined, + label = undefined, + info = undefined, + mods = [], + uses_mods = undefined, + is_included = undefined}}; + Mods =:= [], + A#app.mod_cond =:= undefined, + A#app.incl_cond =:= undefined, + A#app.use_selected_vsn =:= undefined -> + false; + true -> + {Dir, Dirs} = + case A#app.use_selected_vsn of + undefined -> + {shrinked, []}; + false -> + {shrinked, []}; + true -> + {A#app.active_dir, [A#app.active_dir]}; + _ when A#app.is_escript -> + {A#app.active_dir, [A#app.active_dir]} + end, + OptVsn = + case A#app.use_selected_vsn of + undefined -> undefined; + false -> undefined; + true -> A#app.vsn + end, + {true, A#app{active_dir = Dir, + sorted_dirs = Dirs, + vsn = OptVsn, + label = undefined, + info = undefined, + mods = Mods, + uses_mods = undefined, + is_included = undefined}} end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% refresh_app(#app{name = AppName, is_escript = IsEscript, - active_dir = ActiveDir, - label = OptLabel, + active_dir = ActiveDir, + label = OptLabel, mods = Mods} = App, Force, - Status) -> + Status) -> if Force; OptLabel =:= undefined -> - {AppInfo, EbinMods, Status3} = - case IsEscript of - false -> - - %% Add info from .app file - Base = get_base(AppName, ActiveDir), - {_, DefaultVsn} = reltool_utils:split_app_name(Base), - Ebin = filename:join([ActiveDir, "ebin"]), - AppFile = filename:join([Ebin, atom_to_list(AppName) ++ ".app"]), - {AI, Status2} = read_app_info(AppFile, AppFile, AppName, DefaultVsn, Status), - {AI, read_ebin_mods(Ebin, AppName), Status2}; - true -> - {App#app.info, Mods, Status} - end, - - %% Add non-existing modules - AppModNames = AppInfo#app_info.modules, + {AppInfo, EbinMods, Status3} = + case IsEscript of + false -> + + %% Add info from .app file + Base = get_base(AppName, ActiveDir), + {_, DefaultVsn} = reltool_utils:split_app_name(Base), + Ebin = filename:join([ActiveDir, "ebin"]), + AppFile = filename:join([Ebin, atom_to_list(AppName) ++ ".app"]), + {AI, Status2} = read_app_info(AppFile, AppFile, AppName, DefaultVsn, Status), + {AI, read_ebin_mods(Ebin, AppName), Status2}; + true -> + {App#app.info, Mods, Status} + end, + + %% Add non-existing modules + AppModNames = + case AppInfo#app_info.mod of + {StartModName, _} -> + case lists:member(StartModName, AppInfo#app_info.modules) of + true -> AppInfo#app_info.modules; + false -> [StartModName | AppInfo#app_info.modules] + end; + undefined -> + AppInfo#app_info.modules + end, MissingMods = add_missing_mods(AppName, EbinMods, AppModNames), - + %% Add optional user config for each module Mods2 = add_mod_config(MissingMods ++ EbinMods, Mods), - + %% Set app flag for each module in app file Mods3 = set_mod_flags(Mods2, AppModNames), - AppVsn = AppInfo#app_info.vsn, - AppLabel = - case AppVsn of - "" -> atom_to_list(AppName); - _ -> atom_to_list(AppName) ++ "-" ++ AppVsn - end, + AppVsn = AppInfo#app_info.vsn, + AppLabel = + case AppVsn of + "" -> atom_to_list(AppName); + _ -> atom_to_list(AppName) ++ "-" ++ AppVsn + end, App2 = App#app{vsn = AppVsn, - label = AppLabel, - info = AppInfo, - mods = lists:keysort(#mod.name, Mods3)}, - {App2, Status3}; + label = AppLabel, + info = AppInfo, + mods = lists:keysort(#mod.name, Mods3)}, + {App2, Status3}; true -> {App, Status} end. @@ -760,16 +784,19 @@ read_app_info(_AppFileOrBin, _AppFile, erts, DefaultVsn, Status) -> {missing_app_info(DefaultVsn), Status}; read_app_info(AppFileOrBin, AppFile, AppName, DefaultVsn, Status) -> + EnoentText = file:format_error(enoent), case reltool_utils:prim_consult(AppFileOrBin) of {ok, [{application, AppName, Info}]} -> - AI = #app_info{vsn = DefaultVsn}, + AI = #app_info{vsn = DefaultVsn}, parse_app_info(AppFile, Info, AI, Status); {ok, _BadApp} -> - Text = lists:concat([AppName, ": Illegal contents in app file ", AppFile]), - {missing_app_info(DefaultVsn), reltool_utils:add_warning(Status, Text)}; - {error, Text} -> - Text2 = lists:concat([AppName, ": Cannot parse app file ", AppFile, " (", Text, ")."]), - {missing_app_info(DefaultVsn), reltool_utils:add_warning(Status, Text2)} + Text = lists:concat([AppName, ": Illegal contents in app file ", AppFile]), + {missing_app_info(DefaultVsn), reltool_utils:add_warning(Status, Text)}; + {error, Text} when Text =:= EnoentText-> + {missing_app_info(DefaultVsn), Status}; + {error, Text} -> + Text2 = lists:concat([AppName, ": Cannot parse app file ", AppFile, " (", Text, ")."]), + {missing_app_info(DefaultVsn), reltool_utils:add_warning(Status, Text2)} end. parse_app_info(File, [{Key, Val} | KeyVals], AI, Status) -> @@ -796,11 +823,11 @@ {ok, Files} -> Ext = code:objfile_extension(), InitMod = fun(F) -> - File = filename:join([Ebin, F]), - init_mod(AppName, File, File, Ext) - end, + File = filename:join([Ebin, F]), + init_mod(AppName, File, File, Ext) + end, Files2 = [F || F <- Files, filename:extension(F) =:= Ext], - pmap(InitMod, Files2); + pmap(InitMod, Files2); error -> [] end. @@ -825,11 +852,11 @@ %% [PR#pmap_res.res || PR <- lists:keysort(#pmap_res.count, Results)]; %% pmap(Fun, List, N, Max, Count, WaitFor, Results) -> %% receive -%% #pmap_res{ref = Ref} = PR -> -%% WaitFor2 = lists:keydelete(Ref, #pmap_wait.ref, WaitFor), -%% pmap(Fun, List, N - 1, Max, Count, WaitFor2, [PR | Results]); -%% {'EXIT', Reason} -> -%% exit(Reason) +%% #pmap_res{ref = Ref} = PR -> +%% WaitFor2 = lists:keydelete(Ref, #pmap_wait.ref, WaitFor), +%% pmap(Fun, List, N - 1, Max, Count, WaitFor2, [PR | Results]); +%% {'EXIT', Reason} -> +%% exit(Reason) %% end. init_mod(AppName, File, FileOrBin, Ext) -> @@ -837,20 +864,20 @@ Base = filename:basename(File, Ext), ModName = list_to_atom(Base), #mod{name = ModName, - app_name = AppName, - incl_cond = undefined, - is_ebin_mod = true, - uses_mods = UsesMods, - exists = true}. + app_name = AppName, + incl_cond = undefined, + is_ebin_mod = true, + uses_mods = UsesMods, + exists = true}. xref_mod({Base, Bin}) when is_binary(Bin) -> Dir = filename:absname("reltool_server.tmp"), - ok = filelib:ensure_dir(filename:join([Dir, "foo"])), + ok = reltool_utils:recursive_delete(Dir), + ok = file:make_dir(Dir), File = filename:join([Dir, Base]), ok = file:write_file(File, Bin), Res = xref_mod(File), - ok = file:delete(File), - ok = file:del_dir(Dir), + ok = reltool_utils:recursive_delete(Dir), Res; xref_mod(File) when is_list(File) -> {ok, Pid} = xref:start([{xref_mode, modules}]), @@ -862,10 +889,22 @@ %% {ok, ExportedFuns} = xref:q(Pid, "X", []), %% io:format("Unres: ~p\n", [xref:variables(Pid, [predefined])]), %% io:format("Q: ~p\n", [xref:q(Pid, "XU", [])]), + Ref = erlang:monitor(process, Pid), unlink(Pid), xref:stop(Pid), + wait_for_processto_die(Ref, Pid, File), UnknownMods. +wait_for_processto_die(Ref, Pid, File) -> + receive + {'DOWN', Ref, _Type, _Object, _Info} -> + ok + after timer:seconds(30) -> + error_logger:error_msg("~p(~p): Waiting for process ~p to die ~p\n", + [?MODULE, ?LINE, Pid, File]), + wait_for_processto_die(Ref, Pid, File) + end. + add_missing_mods(AppName, EbinMods, AppModNames) -> EbinModNames = [M#mod.name || M <- EbinMods], MissingModNames = AppModNames -- EbinModNames, @@ -879,7 +918,7 @@ is_ebin_mod = false, exists = false, status = missing, - uses_mods = []}. + uses_mods = []}. add_mod_config(Mods, ModConfigs) -> AddConfig = @@ -904,14 +943,18 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -do_get_config(S) -> - S2 = shrink_sys(S), - {ok, reltool_target:gen_config(S2#state.sys)}. +do_get_config(S, InclDefaults, InclDerivates) -> + S2 = + case InclDerivates of + false -> shrink_sys(S); + true -> S + end, + {ok, reltool_target:gen_config(S2#state.sys, InclDefaults)}. -do_save_config(S, Filename) -> - {ok, Config} = do_get_config(S), +do_save_config(S, Filename, InclDefaults, InclDerivates) -> + {ok, Config} = do_get_config(S, InclDefaults, InclDerivates), IoList = io_lib:format("%% config generated at ~w ~w\n~p.\n\n", - [date(), time(), Config]), + [date(), time(), Config]), file:write_file(Filename, IoList). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -922,48 +965,54 @@ ShrinkedSys = S2#state.sys, {NewSys, Status} = read_config(ShrinkedSys#sys{apps = []}, SysConfig, {ok, []}), case Status of - {ok, _Warnings} -> - Force = false, - {MergedSys, Status2} = merge_config(OldSys, NewSys, Force, Status), - {S3, Status3} = analyse(S2#state{sys = MergedSys, old_sys = OldSys}, Status2), - S4 = - case Status3 of - {ok, _} -> - S3; - {error, _} -> - S - end, - {S4, Status3}; - {error, _} -> - %% Keep old state - {S, Status} + {ok, _Warnings} -> + Force = false, + {MergedSys, Status2} = merge_config(OldSys, NewSys, Force, Status), + {S3, Status3} = analyse(S2#state{sys = MergedSys, old_sys = OldSys}, Status2), + S4 = + case Status3 of + {ok, _Warnings2} -> + S3#state{status = Status3, old_status = S#state.status}; + {error, _} -> + S + end, + {S4, Status3}; + {error, _} -> + %% Keep old state + {S, Status} end. read_config(OldSys, Filename, Status) when is_list(Filename) -> case file:consult(Filename) of - {ok, [SysConfig | _]} -> - read_config(OldSys, SysConfig, Status); - {ok, Content} -> - Text = lists:flatten(io_lib:format("~p", [Content])), - {OldSys, reltool_utils:return_first_error(Status, "Illegal file content: " ++ Text)}; - {error, Reason} -> - Text = file:format_error(Reason), - {OldSys, reltool_utils:return_first_error(Status, "File access: " ++ Text)} + {ok, [SysConfig | _]} -> + read_config(OldSys, SysConfig, Status); + {ok, Content} -> + Text = lists:flatten(io_lib:format("~p", [Content])), + {OldSys, reltool_utils:return_first_error(Status, "Illegal file content: " ++ Text)}; + {error, Reason} -> + Text = file:format_error(Reason), + {OldSys, reltool_utils:return_first_error(Status, "File access: " ++ Text)} end; read_config(OldSys, {sys, KeyVals}, Status) -> - {NewSys, Status2} = decode(OldSys#sys{apps = [], rels = []}, KeyVals, Status), + {NewSys, Status2} = + try + decode(OldSys#sys{apps = [], rels = []}, KeyVals, Status) + catch + throw:{error, Text} -> + {OldSys, reltool_utils:return_first_error(Status, Text)} + end, Apps = [A#app{mods = lists:sort(A#app.mods)} || A <- NewSys#sys.apps], case NewSys#sys.rels of - [] -> Rels = reltool_utils:default_rels(); - Rels -> ok + [] -> Rels = reltool_utils:default_rels(); + Rels -> ok end, - NewSys2 = NewSys#sys{apps = lists:sort(Apps), rels = lists:sort(Rels)}, + NewSys2 = NewSys#sys{apps = lists:sort(Apps), rels = lists:sort(Rels)}, case lists:keysearch(NewSys2#sys.boot_rel, #rel.name, NewSys2#sys.rels) of - {value, _} -> - {NewSys2, Status2}; - false -> - Text = "Missing rel: " ++ NewSys2#sys.boot_rel, - {OldSys, reltool_utils:return_first_error(Status2, Text)} + {value, _} -> + {NewSys2, Status2}; + false -> + Text2 = "Missing rel: " ++ NewSys2#sys.boot_rel, + {OldSys, reltool_utils:return_first_error(Status2, Text2)} end; read_config(OldSys, BadConfig, Status) -> Text = lists:flatten(io_lib:format("~p", [BadConfig])), @@ -979,158 +1028,206 @@ App = default_app(Name), {App2, Status2} = decode(App, AppKeyVals, Status), decode(Sys#sys{apps = [App2 | Apps]}, SysKeyVals, Status2); -decode(Sys, [{boot_rel, RelName} | SysKeyVals], Status) - when is_list(RelName) -> - decode(Sys#sys{boot_rel = RelName}, SysKeyVals, Status); +decode(#sys{apps = Apps, escripts = Escripts} = Sys, [{escript, File, AppKeyVals} | SysKeyVals], Status) + when is_list(File), is_list(AppKeyVals) -> + {Name, Label} = split_escript_name(File), + App = default_app(Name, File), + App2 = App#app{is_escript = true, + label = Label, + info = missing_app_info(""), + active_dir = File, + sorted_dirs = [File]}, + {App3, Status2} = decode(App2, AppKeyVals, Status), + decode(Sys#sys{apps = [App3 | Apps], escripts = [File | Escripts]}, SysKeyVals, Status2); decode(#sys{rels = Rels} = Sys, [{rel, Name, Vsn, RelApps} | SysKeyVals], Status) when is_list(Name), is_list(Vsn), is_list(RelApps) -> Rel = #rel{name = Name, vsn = Vsn, rel_apps = []}, {Rel2, Status2} = decode(Rel, RelApps, Status), decode(Sys#sys{rels = [Rel2 | Rels]}, SysKeyVals, Status2); decode(#sys{} = Sys, [{Key, Val} | KeyVals], Status) -> - {Sys2, Status2} = - case Key of - mod_cond when Val =:= all; Val =:= app; - Val =:= ebin; Val =:= derived; - Val =:= none -> - {Sys#sys{mod_cond = Val}, Status}; - incl_cond when Val =:= include; Val =:= exclude; - Val =:= derived -> - {Sys#sys{incl_cond = Val}, Status}; - profile when Val =:= standalone; Val =:= development; Val =:= embedded -> - {Sys#sys{profile = Val}, Status}; - emu_name when is_list(Val) -> - {Sys#sys{emu_name = Val}, Status}; - debug_info when Val =:= keep; Val =:= strip -> - {Sys#sys{debug_info = Val}, Status}; - app_file when Val =:= keep; Val =:= strip, Val =:= all -> - {Sys#sys{app_file = Val}, Status}; - incl_erts_dirs -> - decode_dirs(Key, Val, #sys.incl_erts_dirs, Sys, Status); - excl_erts_dirs -> - decode_dirs(Key, Val, #sys.excl_erts_dirs, Sys, Status); - incl_app_dirs -> - decode_dirs(Key, Val, #sys.incl_app_dirs, Sys, Status); - excl_app_dirs -> - decode_dirs(Key, Val, #sys.excl_app_dirs, Sys, Status); - root_dir when is_list(Val) -> - {Sys#sys{root_dir = Val}, Status}; - lib_dirs when is_list(Val) -> - {Sys#sys{lib_dirs = Val}, Status}; - escripts when is_list(Val) -> - {Sys#sys{escripts = Val}, Status}; - _ -> - Text = lists:flatten(io_lib:format("~p", [{Key, Val}])), - {Sys, reltool_utils:return_first_error(Status, "Illegal parameter: " ++ Text)} - end, - decode(Sys2, KeyVals, Status2); + {Sys3, Status3} = + case Key of + root_dir when is_list(Val) -> + {Sys#sys{root_dir = Val}, Status}; + lib_dirs when is_list(Val) -> + {Sys#sys{lib_dirs = Val}, Status}; + mod_cond when Val =:= all; Val =:= app; + Val =:= ebin; Val =:= derived; + Val =:= none -> + {Sys#sys{mod_cond = Val}, Status}; + incl_cond when Val =:= include; Val =:= exclude; + Val =:= derived -> + {Sys#sys{incl_cond = Val}, Status}; + boot_rel when is_list(Val) -> + {Sys#sys{boot_rel = Val}, Status}; + emu_name when is_list(Val) -> + {Sys#sys{emu_name = Val}, Status}; + profile when Val =:= development -> + Val = ?DEFAULT_PROFILE, % assert, + {Sys#sys{profile = Val, + incl_sys_filters = reltool_utils:decode_regexps(incl_sys_filters, + ?DEFAULT_INCL_SYS_FILTERS, + Sys#sys.incl_sys_filters), + excl_sys_filters = reltool_utils:decode_regexps(excl_sys_filters, + ?DEFAULT_EXCL_SYS_FILTERS, + Sys#sys.excl_sys_filters), + incl_app_filters = reltool_utils:decode_regexps(incl_app_filters, + ?DEFAULT_INCL_APP_FILTERS, + Sys#sys.incl_app_filters), + excl_app_filters = reltool_utils:decode_regexps(excl_app_filters, + ?DEFAULT_EXCL_APP_FILTERS, + Sys#sys.excl_app_filters)}, + Status}; + profile when Val =:= embedded -> + {Sys#sys{profile = Val, + incl_sys_filters = reltool_utils:decode_regexps(incl_sys_filters, + ?EMBEDDED_INCL_SYS_FILTERS, + Sys#sys.incl_sys_filters), + excl_sys_filters = reltool_utils:decode_regexps(excl_sys_filters, + ?EMBEDDED_EXCL_SYS_FILTERS, + Sys#sys.excl_sys_filters), + incl_app_filters = reltool_utils:decode_regexps(incl_app_filters, + ?EMBEDDED_INCL_APP_FILTERS, + Sys#sys.incl_app_filters), + excl_app_filters = reltool_utils:decode_regexps(excl_app_filters, + ?EMBEDDED_EXCL_APP_FILTERS, + Sys#sys.excl_app_filters)}, + Status}; + profile when Val =:= standalone -> + {Sys#sys{profile = Val, + incl_sys_filters = reltool_utils:decode_regexps(incl_sys_filters, + ?STANDALONE_INCL_SYS_FILTERS, + Sys#sys.incl_sys_filters), + excl_sys_filters = reltool_utils:decode_regexps(excl_sys_filters, + ?STANDALONE_EXCL_SYS_FILTERS, + Sys#sys.excl_sys_filters), + incl_app_filters = reltool_utils:decode_regexps(incl_app_filters, + ?STANDALONE_INCL_APP_FILTERS, + Sys#sys.incl_app_filters), + excl_app_filters = reltool_utils:decode_regexps(excl_app_filters, + ?STANDALONE_EXCL_APP_FILTERS, + Sys#sys.excl_app_filters)}, + Status}; + incl_sys_filters -> + {Sys#sys{incl_sys_filters = reltool_utils:decode_regexps(Key, Val, Sys#sys.incl_sys_filters)}, Status}; + excl_sys_filters -> + {Sys#sys{excl_sys_filters = reltool_utils:decode_regexps(Key, Val, Sys#sys.excl_sys_filters)}, Status}; + incl_app_filters -> + {Sys#sys{incl_app_filters = reltool_utils:decode_regexps(Key, Val, Sys#sys.incl_app_filters)}, Status}; + excl_app_filters -> + {Sys#sys{excl_app_filters = reltool_utils:decode_regexps(Key, Val, Sys#sys.excl_app_filters)}, Status}; + incl_archive_filters -> + {Sys#sys{incl_archive_filters = reltool_utils:decode_regexps(Key, Val, Sys#sys.incl_archive_filters)}, Status}; + excl_archive_filters -> + {Sys#sys{excl_archive_filters = reltool_utils:decode_regexps(Key, Val, Sys#sys.excl_archive_filters)}, Status}; + archive_opts when is_list(Val) -> + {Sys#sys{archive_opts = Val}, Status}; + relocatable when Val =:= true; Val =:= false -> + {Sys#sys{relocatable = Val}, Status}; + app_type when Val =:= permanent; Val =:= transient; Val =:= temporary; + Val =:= load; Val =:= none -> + {Sys#sys{app_type = Val}, Status}; + app_file when Val =:= keep; Val =:= strip, Val =:= all -> + {Sys#sys{app_file = Val}, Status}; + debug_info when Val =:= keep; Val =:= strip -> + {Sys#sys{debug_info = Val}, Status}; + _ -> + Text = lists:flatten(io_lib:format("~p", [{Key, Val}])), + {Sys, reltool_utils:return_first_error(Status, "Illegal option: " ++ Text)} + end, + decode(Sys3, KeyVals, Status3); decode(#app{} = App, [{Key, Val} | KeyVals], Status) -> {App2, Status2} = - case Key of - mod_cond when Val =:= all; Val =:= app; Val =:= ebin; Val =:= derived; Val =:= none -> - {App#app{mod_cond = Val}, Status}; - incl_cond when Val =:= include; Val =:= exclude; Val =:= derived -> - {App#app{incl_cond = Val}, Status}; - debug_info when Val =:= keep; Val =:= strip -> - {App#app{debug_info = Val}, Status}; - app_file when Val =:= keep; Val =:= strip, Val =:= all -> - {App#app{app_file = Val}, Status}; - incl_app_dirs -> - decode_dirs(Key, Val, #app.incl_app_dirs, App, Status); - excl_app_dirs -> - decode_dirs(Key, Val, #app.excl_app_dirs, App, Status); - vsn when is_list(Val) -> - {App#app{use_selected_vsn = true, vsn = Val}, Status}; - _ -> - Text = lists:flatten(io_lib:format("~p", [{Key, Val}])), - {App, reltool_utils:return_first_error(Status, "Illegal parameter: " ++ Text)} - end, + case Key of + mod_cond when Val =:= all; Val =:= app; Val =:= ebin; Val =:= derived; Val =:= none -> + {App#app{mod_cond = Val}, Status}; + incl_cond when Val =:= include; Val =:= exclude; Val =:= derived -> + {App#app{incl_cond = Val}, Status}; + + debug_info when Val =:= keep; Val =:= strip -> + {App#app{debug_info = Val}, Status}; + app_file when Val =:= keep; Val =:= strip, Val =:= all -> + {App#app{app_file = Val}, Status}; + app_type when Val =:= permanent; Val =:= transient; Val =:= temporary; + Val =:= load; Val =:= none -> + {App#app{app_type = Val}, Status}; + incl_app_filters -> + {App#app{incl_app_filters = reltool_utils:decode_regexps(Key, Val, App#app.incl_app_filters)}, Status}; + excl_app_filters -> + {App#app{excl_app_filters = reltool_utils:decode_regexps(Key, Val, App#app.excl_app_filters)}, Status}; + incl_archive_filters -> + {App#app{incl_archive_filters = reltool_utils:decode_regexps(Key, Val, App#app.incl_archive_filters)}, Status}; + excl_archive_filters -> + {App#app{excl_archive_filters = reltool_utils:decode_regexps(Key, Val, App#app.excl_archive_filters)}, Status}; + archive_opts when is_list(Val) -> + {App#app{archive_opts = Val}, Status}; + vsn when is_list(Val) -> + {App#app{use_selected_vsn = true, vsn = Val}, Status}; + _ -> + Text = lists:flatten(io_lib:format("~p", [{Key, Val}])), + {App, reltool_utils:return_first_error(Status, "Illegal option: " ++ Text)} + end, decode(App2, KeyVals, Status2); decode(#app{mods = Mods} = App, [{mod, Name, ModKeyVals} | AppKeyVals], Status) -> {Mod, Status2} = decode(#mod{name = Name}, ModKeyVals, Status), decode(App#app{mods = [Mod | Mods]}, AppKeyVals, Status2); decode(#mod{} = Mod, [{Key, Val} | KeyVals], Status) -> {Mod2, Status2} = - case Key of - incl_cond when Val =:= include; Val =:= exclude; Val =:= derived -> - {Mod#mod{incl_cond = Val}, Status}; - debug_info when Val =:= keep; Val =:= strip -> - {Mod#mod{debug_info = Val}, Status}; - _ -> - Text = lists:flatten(io_lib:format("~p", [{Key, Val}])), - {Mod, reltool_utils:return_first_error(Status, "Illegal parameter: " ++ Text)} - end, + case Key of + incl_cond when Val =:= include; Val =:= exclude; Val =:= derived -> + {Mod#mod{incl_cond = Val}, Status}; + debug_info when Val =:= keep; Val =:= strip -> + {Mod#mod{debug_info = Val}, Status}; + _ -> + Text = lists:flatten(io_lib:format("~p", [{Key, Val}])), + {Mod, reltool_utils:return_first_error(Status, "Illegal option: " ++ Text)} + end, decode(Mod2, KeyVals, Status2); decode(#rel{rel_apps = RelApps} = Rel, [RelApp | KeyVals], Status) -> RA = - case RelApp of - Name when is_atom(Name) -> - #rel_app{name = Name, type = undefined, incl_apps = []}; - {Name, Type} when is_atom(Name) -> - #rel_app{name = Name, type = Type, incl_apps = []}; - {Name, InclApps} when is_atom(Name), is_list(InclApps) -> - #rel_app{name = Name, type = undefined, incl_apps = InclApps}; - {Name, Type, InclApps} when is_atom(Name), is_list(InclApps) -> - #rel_app{name = Name, type = Type, incl_apps = InclApps}; - _ -> - #rel_app{incl_apps = []} - end, - IsType = is_type(RA#rel_app.type), + case RelApp of + Name when is_atom(Name) -> + #rel_app{name = Name, app_type = undefined, incl_apps = []}; + {Name, Type} when is_atom(Name) -> + #rel_app{name = Name, app_type = Type, incl_apps = []}; + {Name, InclApps} when is_atom(Name), is_list(InclApps) -> + #rel_app{name = Name, app_type = undefined, incl_apps = InclApps}; + {Name, Type, InclApps} when is_atom(Name), is_list(InclApps) -> + #rel_app{name = Name, app_type = Type, incl_apps = InclApps}; + _ -> + #rel_app{incl_apps = []} + end, + IsType = is_type(RA#rel_app.app_type), NonAtoms = [IA || IA <- RA#rel_app.incl_apps, not is_atom(IA)], if - IsType, NonAtoms =:= [] -> - decode(Rel#rel{rel_apps = RelApps ++ [RA]}, KeyVals, Status); - true -> - Text = lists:flatten(io_lib:format("~p", [RelApp])), - Status2 = reltool_utils:return_first_error(Status, "Illegal parameter: " ++ Text), - decode(Rel, KeyVals, Status2) + IsType, NonAtoms =:= [] -> + decode(Rel#rel{rel_apps = RelApps ++ [RA]}, KeyVals, Status); + true -> + Text = lists:flatten(io_lib:format("~p", [RelApp])), + Status2 = reltool_utils:return_first_error(Status, "Illegal option: " ++ Text), + decode(Rel, KeyVals, Status2) end; decode(Acc, [], Status) -> {Acc, Status}; decode(Acc, KeyVal, Status) -> Text = lists:flatten(io_lib:format("~p", [KeyVal])), - {Acc, reltool_utils:return_first_error(Status, "Illegal parameter: " ++ Text)}. - -decode_dirs(Key,Val, Pos, Rec, Status) -> - case Val of - all -> - {setelement(Pos, Rec, Val), Status}; - List when is_list(List) -> - {setelement(Pos, Rec, Val), Status}; - {add, List} when is_list(List) -> - New = - case element(Pos, Rec) of - all -> - all; - Old when is_list(Old) -> - lists:usort(Old ++ List) - end, - {setelement(Pos, Rec, New), Status}; - {del, List} when is_list(List) -> - New = - case element(Pos, Rec) of - all -> - all; - Old when is_list(Old) -> - Old -- List - end, - {setelement(Pos, Rec, New), Status}; - _ -> - Text = lists:flatten(io_lib:format("~p", [{Key, Val}])), - {Rec, reltool_utils:return_first_error(Status, "Illegal parameter: " ++ Text)} - end. + {Acc, reltool_utils:return_first_error(Status, "Illegal option: " ++ Text)}. is_type(Type) -> case Type of - undefined -> true; - permanent -> true; - transient -> true; - temporary -> true; - load -> true; - none -> true; - _ -> false + undefined -> true; + permanent -> true; + transient -> true; + temporary -> true; + load -> true; + none -> true; + _ -> false end. - + +split_escript_name(File) when is_list(File) -> + Label = filename:basename(File, ".escript"), + {list_to_atom("*escript* " ++ Label), Label}. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% refresh(#state{sys = Sys} = S, Force, Status) -> @@ -1142,255 +1239,241 @@ LibDirs = [filename:absname(D) || D <- NewSys#sys.lib_dirs], Escripts = [filename:absname(E) || E <- NewSys#sys.escripts], {SourceDirs, Status2} = - libs_to_dirs(RootDir, LibDirs, Status), + libs_to_dirs(RootDir, LibDirs, Status), MergedApps = merge_app_dirs(SourceDirs, NewSys#sys.apps, OldSys#sys.apps), {AllApps, Status3} = - escripts_to_apps(Escripts, MergedApps, Status2), + escripts_to_apps(Escripts, MergedApps, OldSys#sys.apps, Status2), {RefreshedApps, Status4} = - refresh_apps(OldSys#sys.apps, AllApps, [], Force, Status3), + refresh_apps(OldSys#sys.apps, AllApps, [], Force, Status3), {PatchedApps, Status5} = patch_erts_version(RootDir, RefreshedApps, Status4), + Escripts2 = [A#app.active_dir || A <- PatchedApps, A#app.is_escript], NewSys2 = NewSys#sys{root_dir = RootDir, - lib_dirs = LibDirs, - escripts = Escripts, - apps = PatchedApps}, + lib_dirs = LibDirs, + escripts = Escripts2, + apps = PatchedApps}, {NewSys2, Status5}. verify_config(Sys, Status) -> - check_dir("erts_dirs", "bin", Sys#sys.incl_erts_dirs, Sys#sys.excl_erts_dirs, Status), - check_dir("app_dirs", "ebin", Sys#sys.incl_app_dirs, Sys#sys.excl_app_dirs, Status), - lists:foreach(fun(App) -> check_app(App, Sys, Status) end, Sys#sys.apps), case lists:keymember(Sys#sys.boot_rel, #rel.name, Sys#sys.rels) of - true -> - lists:foreach(fun(Rel)-> check_rel(Rel, Sys, Status) end, Sys#sys.rels), - Status; - false -> - Text = lists:concat([Sys#sys.boot_rel, ": release is mandatory"]), - Status2 = reltool_utils:return_first_error(Status, Text), - throw({error, Status2}) - end. - -check_dir(Label, SubDir, Incl, Excl, Status) -> - case lists:member(SubDir, Incl -- Excl) of - true -> - Status; - false -> - Text = lists:concat([Label, ": directory ", SubDir, " is mandatory"]), - Status2 = reltool_utils:return_first_error(Status, Text), - throw({error, Status2}) - end. - -check_app(App, Sys, Status) -> - Incl = default_val(App#app.incl_app_dirs, Sys#sys.incl_app_dirs), - Excl = default_val(App#app.excl_app_dirs, Sys#sys.excl_app_dirs), - check_dir(App#app.name, "ebin", Incl, Excl, Status). - -default_val(Val, Default) -> - case Val of - undefined -> Default; - _ -> Val + true -> + lists:foreach(fun(Rel)-> check_rel(Rel, Sys, Status) end, Sys#sys.rels), + Status; + false -> + Text = lists:concat([Sys#sys.boot_rel, ": release is mandatory"]), + Status2 = reltool_utils:return_first_error(Status, Text), + throw({error, Status2}) end. check_rel(#rel{name = RelName, rel_apps = RelApps}, #sys{apps = Apps}, Status) -> EnsureApp = - fun(AppName) -> - case lists:keymember(AppName, #rel_app.name, RelApps) of - true -> - ok; - false -> - Text = lists:concat([RelName, ": ", AppName, " is not included."]), - Status2 = reltool_utils:return_first_error(Status, Text), - throw({error, Status2}) - end - end, + fun(AppName) -> + case lists:keymember(AppName, #rel_app.name, RelApps) of + true -> + ok; + false -> + Text = lists:concat([RelName, ": ", AppName, " is not included."]), + Status2 = reltool_utils:return_first_error(Status, Text), + throw({error, Status2}) + end + end, EnsureApp(kernel), EnsureApp(stdlib), CheckRelApp = - fun(#rel_app{name = AppName}) -> - case lists:keysearch(AppName, #app.name, Apps) of - {value, App} when App#app.is_pre_included -> - ok; - {value, App} when App#app.is_included -> - ok; - _ -> - Text = lists:concat([RelName, ": uses application ", - AppName, " that not is included."]), - Status2 = reltool_utils:return_first_error(Status, Text), - %% throw BUGBUG: add throw - ({error, Status2}) - end - end, + fun(#rel_app{name = AppName}) -> + case lists:keysearch(AppName, #app.name, Apps) of + {value, App} when App#app.is_pre_included -> + ok; + {value, App} when App#app.is_included -> + ok; + _ -> + Text = lists:concat([RelName, ": uses application ", + AppName, " that not is included."]), + Status2 = reltool_utils:return_first_error(Status, Text), + %% throw BUGBUG: add throw + ({error, Status2}) + end + end, lists:foreach(CheckRelApp, RelApps). patch_erts_version(RootDir, Apps, Status) -> AppName = erts, case lists:keysearch(AppName, #app.name, Apps) of - {value, Erts} -> - LocalRoot = code:root_dir(), - Vsn = Erts#app.vsn, - if - LocalRoot =:= RootDir, Vsn =:= "" -> - Vsn2 = erlang:system_info(version), - Erts2 = Erts#app{vsn = Vsn2, label = "erts-" ++ Vsn2}, - Apps2 = lists:keystore(AppName, #app.name, Apps, Erts2), - {Apps2, Status}; - Vsn =:= "" -> - {Apps, reltool_utils:add_warning(Status, "erts has no version")}; - true -> - {Apps, Status} - end; - false -> - Text = "erts cannnot be found in the root directory " ++ RootDir, - Status2 = reltool_utils:return_first_error(Status, Text), - {Apps, Status2} + {value, Erts} -> + LocalRoot = code:root_dir(), + Vsn = Erts#app.vsn, + if + LocalRoot =:= RootDir, Vsn =:= "" -> + Vsn2 = erlang:system_info(version), + Erts2 = Erts#app{vsn = Vsn2, label = "erts-" ++ Vsn2}, + Apps2 = lists:keystore(AppName, #app.name, Apps, Erts2), + {Apps2, Status}; + Vsn =:= "" -> + {Apps, reltool_utils:add_warning(Status, "erts has no version")}; + true -> + {Apps, Status} + end; + false -> + Text = "erts cannnot be found in the root directory " ++ RootDir, + Status2 = reltool_utils:return_first_error(Status, Text), + {Apps, Status2} end. libs_to_dirs(RootDir, LibDirs, Status) -> case file:list_dir(RootDir) of {ok, RootFiles} -> - RootLibDir = filename:join([RootDir, "lib"]), - SortedLibDirs = lists:sort(LibDirs), - AllLibDirs = [RootLibDir | SortedLibDirs], - case AllLibDirs -- lists:usort(AllLibDirs) of - [] -> - Fun = fun(Base) -> - AppDir = filename:join([RootLibDir, Base]), - case filelib:is_dir(filename:join([AppDir, "ebin"]), erl_prim_loader) of - true -> - AppDir; - false -> - filename:join([RootDir, Base, "preloaded"]) - end - end, - ErtsFiles = [{erts, Fun(F)} || F <- RootFiles, lists:prefix("erts", F)], - app_dirs2(AllLibDirs, [ErtsFiles], Status); - [Duplicate | _] -> - {[], reltool_utils:return_first_error(Status, "Duplicate library: " ++ Duplicate)} - end; + RootLibDir = filename:join([RootDir, "lib"]), + AllLibDirs = [RootLibDir | LibDirs], + case AllLibDirs -- lists:usort(AllLibDirs) of + [] -> + Fun = fun(Base) -> + AppDir = filename:join([RootLibDir, Base]), + case filelib:is_dir(filename:join([AppDir, "ebin"]), erl_prim_loader) of + true -> + AppDir; + false -> + filename:join([RootDir, Base, "preloaded"]) + end + end, + ErtsFiles = [{erts, Fun(F)} || F <- RootFiles, lists:prefix("erts", F)], + app_dirs2(AllLibDirs, [ErtsFiles], Status); + [Duplicate | _] -> + {[], reltool_utils:return_first_error(Status, "Duplicate library: " ++ Duplicate)} + end; {error, Reason} -> - Text = file:format_error(Reason), - {[], reltool_utils:return_first_error(Status, "Missing root library " ++ RootDir ++ ": " ++ Text)} + Text = file:format_error(Reason), + {[], reltool_utils:return_first_error(Status, "Missing root library " ++ RootDir ++ ": " ++ Text)} end. app_dirs2([Lib | Libs], Acc, Status) -> case file:list_dir(Lib) of {ok, Files} -> - Filter = - fun(Base) -> - AppDir = filename:join([Lib, Base]), - EbinDir = filename:join([AppDir, "ebin"]), - case filelib:is_dir(EbinDir, erl_prim_loader) of - true -> - {Name, _Vsn} = reltool_utils:split_app_name(Base), - case Name of - erts -> false; - _ -> {true, {Name, AppDir}} - end; - false -> - false - end - end, - Files2 = lists:zf(Filter, Files), + Filter = + fun(Base) -> + AppDir = filename:join([Lib, Base]), + EbinDir = filename:join([AppDir, "ebin"]), + case filelib:is_dir(EbinDir, erl_prim_loader) of + true -> + {Name, _Vsn} = reltool_utils:split_app_name(Base), + case Name of + erts -> false; + _ -> {true, {Name, AppDir}} + end; + false -> + false + end + end, + Files2 = lists:zf(Filter, Files), app_dirs2(Libs, [Files2 | Acc], Status); {error, Reason} -> - Text = file:format_error(Reason), + Text = file:format_error(Reason), {[], reltool_utils:return_first_error(Status, "Illegal library " ++ Lib ++ ": " ++ Text)} end; app_dirs2([], Acc, Status) -> {lists:sort(lists:append(Acc)), Status}. -escripts_to_apps([Escript | Escripts], Apps, Status) -> - EscriptAppName = list_to_atom("*escript* " ++ filename:basename(Escript)), +escripts_to_apps([Escript | Escripts], Apps, OldApps, Status) -> + {EscriptAppName, _Label} = split_escript_name(Escript), Ext = code:objfile_extension(), Fun = fun(FullName, _GetInfo, GetBin, {FileAcc, StatusAcc}) -> - Components = filename:split(FullName), - case Components of - [AppLabel, "ebin", File] -> - case filename:extension(File) of - ".app" -> - {AppName, DefaultVsn} = reltool_utils:split_app_name(AppLabel), - AppFileName = filename:join([Escript, FullName]), - {Info, StatusAcc2} = - read_app_info(GetBin(), AppFileName, AppName, DefaultVsn, Status), - Dir = filename:join([Escript, AppName]), - {[{AppName, app, Dir, Info} | FileAcc], StatusAcc2}; - E when E =:= Ext -> - {AppName, _} = reltool_utils:split_app_name(AppLabel), - Mod = init_mod(AppName, File, {File, GetBin()}, Ext), - Dir = filename:join([Escript, AppName]), - {[{AppName, mod, Dir, Mod} | FileAcc], StatusAcc}; - _ -> - {FileAcc, StatusAcc} - end; - ["."] -> - Bin = GetBin(), - {ok, {ModName, _}} = beam_lib:version(Bin), - ModStr = atom_to_list(ModName) ++ Ext, - Mod = init_mod(EscriptAppName, ModStr, {ModStr, GetBin()}, Ext), - {[{EscriptAppName, mod, Escript, Mod} | FileAcc], StatusAcc}; - [File] -> - case filename:extension(File) of - E when E =:= Ext -> - Mod = init_mod(EscriptAppName, File, {File, GetBin()}, Ext), - {[{EscriptAppName, mod, File, Mod} | FileAcc], StatusAcc}; - _ -> - {FileAcc, StatusAcc} - end; - _ -> - {FileAcc, StatusAcc} - end - end, + Components = filename:split(FullName), + case Components of + [AppLabel, "ebin", File] -> + case filename:extension(File) of + ".app" -> + {AppName, DefaultVsn} = reltool_utils:split_app_name(AppLabel), + AppFileName = filename:join([Escript, FullName]), + {Info, StatusAcc2} = + read_app_info(GetBin(), AppFileName, AppName, DefaultVsn, Status), + Dir = filename:join([Escript, AppName]), + {[{AppName, app, Dir, Info} | FileAcc], StatusAcc2}; + E when E =:= Ext -> + {AppName, _} = reltool_utils:split_app_name(AppLabel), + Mod = init_mod(AppName, File, {File, GetBin()}, Ext), + Dir = filename:join([Escript, AppName]), + {[{AppName, mod, Dir, Mod} | FileAcc], StatusAcc}; + _ -> + {FileAcc, StatusAcc} + end; + ["."] -> + Bin = GetBin(), + {ok, {ModName, _}} = beam_lib:version(Bin), + ModStr = atom_to_list(ModName) ++ Ext, + Mod = init_mod(EscriptAppName, ModStr, {ModStr, GetBin()}, Ext), + {[{EscriptAppName, mod, Escript, Mod} | FileAcc], StatusAcc}; + [File] -> + case filename:extension(File) of + E when E =:= Ext -> + Mod = init_mod(EscriptAppName, File, {File, GetBin()}, Ext), + {[{EscriptAppName, mod, File, Mod} | FileAcc], StatusAcc}; + _ -> + {FileAcc, StatusAcc} + end; + _ -> + {FileAcc, StatusAcc} + end + end, try - case escript:foldl(Fun, {[], Status}, Escript) of - {ok, {Files, Status2}} -> - {Apps2, Status3} = files_to_apps(Escript, lists:sort(Files), Apps, Apps, Status2), - escripts_to_apps(Escripts, Apps2, Status3); - {error, Reason} -> - Text = lists:flatten(io_lib:format("~p", [Reason])), - {[], reltool_utils:return_first_error(Status, "Illegal escript " ++ Escript ++ ": " ++ Text)} - end + case escript:foldl(Fun, {[], Status}, Escript) of + {ok, {Files, Status2}} -> + {Apps2, Status3} = files_to_apps(Escript, lists:sort(Files), Apps, Apps, OldApps, Status2), + escripts_to_apps(Escripts, Apps2, OldApps, Status3); + {error, Reason} -> + Text = lists:flatten(io_lib:format("~p", [Reason])), + {[], reltool_utils:return_first_error(Status, "Illegal escript " ++ Escript ++ ": " ++ Text)} + end catch - throw:Reason2 when is_list(Reason2) -> - {[], reltool_utils:return_first_error(Status, "Illegal escript " ++ Escript ++ ": " ++ Reason2)} + throw:Reason2 when is_list(Reason2) -> + {[], reltool_utils:return_first_error(Status, "Illegal escript " ++ Escript ++ ": " ++ Reason2)} end; -escripts_to_apps([], Apps, Status) -> +escripts_to_apps([], Apps, _OldApps, Status) -> {Apps, Status}. %% Assume that all files for an app are in consecutive order %% Assume the app info is before the mods -files_to_apps(Escript, [{AppName, Type, Dir, ModOrInfo} | Files] = AllFiles, Acc, Apps, Status) -> +files_to_apps(Escript, [{AppName, Type, Dir, ModOrInfo} | Files] = AllFiles, Acc, Apps, OldApps, Status) -> case Type of - mod -> - case Acc of - [] -> - Info = missing_app_info(""), - {NewApp, Status2} = new_escript_app(AppName, Dir, Info, [ModOrInfo], Apps, Status), - files_to_apps(Escript, AllFiles, [NewApp | Acc], Apps, Status2); - [App | Acc2] when App#app.name =:= ModOrInfo#mod.app_name -> - App2 = App#app{mods = [ModOrInfo | App#app.mods]}, - files_to_apps(Escript, Files, [App2 | Acc2], Apps, Status); - [App | Acc2] -> - PrevApp = App#app{mods = lists:keysort(#mod.name, App#app.mods)}, - Info = missing_app_info(""), - {NewApp, Status2} = new_escript_app(AppName, Dir, Info, [ModOrInfo], Apps, Status), - files_to_apps(Escript, Files, [NewApp, PrevApp | Acc2], Apps, Status2) - end; - app -> - {App, Status2} = new_escript_app(AppName, Dir, ModOrInfo, [], Apps, Status), - files_to_apps(Escript, Files, [App | Acc], Apps, Status2) + mod -> + case Acc of + [] -> + Info = missing_app_info(""), + {NewApp, Status2} = merge_escript_app(AppName, Dir, Info, [ModOrInfo], Apps, OldApps, Status), + files_to_apps(Escript, AllFiles, [NewApp | Acc], Apps, OldApps, Status2); + [App | Acc2] when App#app.name =:= ModOrInfo#mod.app_name -> + App2 = App#app{mods = [ModOrInfo | App#app.mods]}, + files_to_apps(Escript, Files, [App2 | Acc2], Apps, OldApps, Status); + [App | Acc2] -> + PrevApp = App#app{mods = lists:keysort(#mod.name, App#app.mods)}, + Info = missing_app_info(""), + {NewApp, Status2} = merge_escript_app(AppName, Dir, Info, [ModOrInfo], Apps, OldApps, Status), + files_to_apps(Escript, Files, [NewApp, PrevApp | Acc2], Apps, OldApps, Status2) + end; + app -> + {App, Status2} = merge_escript_app(AppName, Dir, ModOrInfo, [], Apps, OldApps, Status), + files_to_apps(Escript, Files, [App | Acc], Apps, OldApps, Status2) end; -files_to_apps(_Escript, [], Acc, _Apps, Status) -> +files_to_apps(_Escript, [], Acc, _Apps, _OldApps, Status) -> {lists:keysort(#app.name, Acc), Status}. -new_escript_app(AppName, Dir, Info, Mods, Apps, Status) -> - App = default_app(AppName, Dir), - App2 = App#app{is_escript = true, info = Info, mods = Mods}, +merge_escript_app(AppName, Dir, Info, Mods, Apps, OldApps, Status) -> + case lists:keysearch(AppName, #app.name, OldApps) of + {value, App} -> + ok; + false -> + App = default_app(AppName, Dir) + end, + App2 = App#app{is_escript = true, + label = filename:basename(Dir, ".escript"), + info = Info, + mods = Mods, + active_dir = Dir, + sorted_dirs = [Dir]}, case lists:keysearch(AppName, #app.name, Apps) of - {value, _} -> - Error = lists:concat([AppName, ": Application name clash. ", - "Escript ", Dir," contains application ", AppName, "."]), - {App2, reltool_utils:return_first_error(Status, Error)}; - false -> - {App2, Status} + {value, _} -> + Error = lists:concat([AppName, ": Application name clash. ", + "Escript ", Dir," contains application ", AppName, "."]), + {App2, reltool_utils:return_first_error(Status, Error)}; + false -> + {App2, Status} end. merge_app_dirs([{Name, Dir} | Rest], [App | Apps], OldApps) @@ -1402,29 +1485,29 @@ %% Initate app Apps2 = sort_app_dirs(Apps), Apps4 = - case lists:keysearch(Name, #app.name, Apps) of - false -> - case lists:keysearch(Name, #app.name, OldApps) of - {value, OldApp} when OldApp#app.active_dir =:= Dir -> - [OldApp | Apps2]; - {value, OldApp} -> - App = - case filter_app(OldApp) of - {true, NewApp} -> - NewApp#app{active_dir = Dir, sorted_dirs = [Dir]}; - false -> - default_app(Name, Dir) - end, - [App | Apps2]; - false -> - App = default_app(Name, Dir), - [App | Apps2] - end; - {value, OldApp} -> - Apps3 = lists:keydelete(Name, #app.name, Apps2), - App = OldApp#app{sorted_dirs = [Dir | OldApp#app.sorted_dirs]}, - [App | Apps3] - end, + case lists:keysearch(Name, #app.name, Apps) of + false -> + case lists:keysearch(Name, #app.name, OldApps) of + {value, OldApp} when OldApp#app.active_dir =:= Dir -> + [OldApp | Apps2]; + {value, OldApp} -> + App = + case filter_app(OldApp) of + {true, NewApp} -> + NewApp#app{active_dir = Dir, sorted_dirs = [Dir]}; + false -> + default_app(Name, Dir) + end, + [App | Apps2]; + false -> + App = default_app(Name, Dir), + [App | Apps2] + end; + {value, OldApp} -> + Apps3 = lists:keydelete(Name, #app.name, Apps2), + App = OldApp#app{sorted_dirs = [Dir | OldApp#app.sorted_dirs]}, + [App | Apps3] + end, merge_app_dirs(Rest, Apps4, OldApps); merge_app_dirs([], Apps, _OldApps) -> Apps2 = sort_app_dirs(Apps), @@ -1433,8 +1516,8 @@ sort_app_dirs([#app{sorted_dirs = Dirs} = App | Acc]) -> SortedDirs = lists:sort(fun reltool_utils:app_dir_test/2, Dirs), case SortedDirs of - [ActiveDir | _] -> ok; - [] -> ActiveDir = undefined + [ActiveDir | _] -> ok; + [] -> ActiveDir = undefined end, [App#app{active_dir = ActiveDir, sorted_dirs = SortedDirs} | Acc]; sort_app_dirs([]) -> @@ -1443,40 +1526,42 @@ default_app(Name, Dir) -> App = default_app(Name), App#app{active_dir = Dir, - sorted_dirs = [Dir]}. + sorted_dirs = [Dir]}. default_app(Name) -> #app{name = Name, - is_escript = false, - label = undefined, - mod_cond = undefined, - incl_cond = undefined, - use_selected_vsn = undefined, - active_dir = undefined, - sorted_dirs = [], - vsn = undefined, - info = undefined, - mods = [], - status = missing, - uses_mods = undefined, - is_pre_included = undefined, - is_included = undefined}. + is_escript = false, + use_selected_vsn = undefined, + active_dir = undefined, + sorted_dirs = [], + vsn = undefined, + label = undefined, + info = undefined, + mods = [], + + mod_cond = undefined, + incl_cond = undefined, + + status = missing, + uses_mods = undefined, + is_pre_included = undefined, + is_included = undefined}. %% Assume that the application are sorted refresh_apps([Old | OldApps], [New | NewApps], Acc, Force, Status) when New#app.name =:= Old#app.name -> {Info, ActiveDir, Status2} = ensure_app_info(New, Status), OptLabel = - case Info#app_info.vsn =:= New#app.vsn of - true -> New#app.label; - false -> undefined % Cause refresh - end, + case Info#app_info.vsn =:= New#app.vsn of + true -> New#app.label; + false -> undefined % Cause refresh + end, {Refreshed, Status3} = - refresh_app(New#app{label = OptLabel, - active_dir = ActiveDir, - vsn = Info#app_info.vsn, - info = Info}, - Force, - Status2), + refresh_app(New#app{label = OptLabel, + active_dir = ActiveDir, + vsn = Info#app_info.vsn, + info = Info}, + Force, + Status2), refresh_apps(OldApps, NewApps, [Refreshed | Acc], Force, Status3); refresh_apps([Old | OldApps], [New | NewApps], Acc, Force, Status) when New#app.name < Old#app.name -> %% No old app version exists. Use new as is. @@ -1486,13 +1571,13 @@ refresh_apps([Old | OldApps], [New | NewApps], Acc, Force, Status) when New#app.name > Old#app.name -> %% No new version. Remove the old. Status2 = - case Old#app.name =:= ?MISSING_APP of - true -> - Status; - false -> - Warning = lists:concat([Old#app.name, ": The source dirs does not contain the application anymore."]), - reltool_utils:add_warning(Status, Warning) - end, + case Old#app.name =:= ?MISSING_APP of + true -> + Status; + false -> + Warning = lists:concat([Old#app.name, ": The source dirs does not contain the application anymore."]), + reltool_utils:add_warning(Status, Warning) + end, refresh_apps(OldApps, [New | NewApps], Acc, Force, Status2); refresh_apps([], [New | NewApps], Acc, Force, Status) -> %% No old app version exists. Use new as is. @@ -1501,14 +1586,14 @@ refresh_apps([Old | OldApps], [], Acc, Force, Status) -> %% No new version. Remove the old. Status2 = - case Old#app.name =:= ?MISSING_APP of - true -> - Status; - false -> - Warning = lists:concat([Old#app.name, ": The source dirs ", - "does not contain the application anymore."]), - reltool_utils:add_warning(Status, Warning) - end, + case Old#app.name =:= ?MISSING_APP of + true -> + Status; + false -> + Warning = lists:concat([Old#app.name, ": The source dirs ", + "does not contain the application anymore."]), + reltool_utils:add_warning(Status, Warning) + end, refresh_apps(OldApps, [], Acc, Force, Status2); refresh_apps([], [], Acc, _Force, Status) -> {lists:reverse(Acc), Status}. @@ -1521,41 +1606,41 @@ {missing_app_info(""), undefined, Status2}; ensure_app_info(#app{name = Name, vsn = Vsn, sorted_dirs = Dirs, info = undefined}, Status) -> ReadInfo = - fun(Dir, StatusAcc) -> - Base = get_base(Name, Dir), - Ebin = filename:join([Dir, "ebin"]), - {_, DefaultVsn} = reltool_utils:split_app_name(Base), - AppFile = filename:join([Ebin, atom_to_list(Name) ++ ".app"]), - read_app_info(AppFile, AppFile, Name, DefaultVsn, StatusAcc) - end, + fun(Dir, StatusAcc) -> + Base = get_base(Name, Dir), + Ebin = filename:join([Dir, "ebin"]), + {_, DefaultVsn} = reltool_utils:split_app_name(Base), + AppFile = filename:join([Ebin, atom_to_list(Name) ++ ".app"]), + read_app_info(AppFile, AppFile, Name, DefaultVsn, StatusAcc) + end, {AllInfo, Status2} = lists:mapfoldl(ReadInfo, Status, Dirs), AllVsns = [I#app_info.vsn || I <- AllInfo], Status3 = - case AllVsns -- lists:usort(AllVsns) of - [] -> - %% No redundant info - Status2; - [BadVsn | _] -> - Error2 = lists:concat([Name, ": Application version clash. ", - "Multiple directories contains version \"", BadVsn, "\"."]), - reltool_utils:return_first_error(Status2, Error2) - end, + case AllVsns -- lists:usort(AllVsns) of + [] -> + %% No redundant info + Status2; + [BadVsn | _] -> + Error2 = lists:concat([Name, ": Application version clash. ", + "Multiple directories contains version \"", BadVsn, "\"."]), + reltool_utils:return_first_error(Status2, Error2) + end, FirstInfo = hd(AllInfo), FirstDir = hd(Dirs), if - Vsn =:= undefined -> - {FirstInfo, FirstDir, Status3}; - Vsn =:= FirstInfo#app_info.vsn -> - {FirstInfo, FirstDir, Status3}; - true -> - case find_vsn(Vsn, AllInfo, Dirs) of - {Info, VsnDir} -> - {Info, VsnDir, Status3}; - false -> - Error3 = lists:concat([Name, ": No application directory contains selected version \"", Vsn, "\"."]), - Status4 = reltool_utils:return_first_error(Status3, Error3), - {FirstInfo, FirstDir, Status4} - end + Vsn =:= undefined -> + {FirstInfo, FirstDir, Status3}; + Vsn =:= FirstInfo#app_info.vsn -> + {FirstInfo, FirstDir, Status3}; + true -> + case find_vsn(Vsn, AllInfo, Dirs) of + {Info, VsnDir} -> + {Info, VsnDir, Status3}; + false -> + Error3 = lists:concat([Name, ": No application directory contains selected version \"", Vsn, "\"."]), + Status4 = reltool_utils:return_first_error(Status3, Error3), + {FirstInfo, FirstDir, Status4} + end end; ensure_app_info(#app{active_dir = Dir, info = Info}, Status) -> {Info, Dir, Status}. @@ -1569,15 +1654,15 @@ get_base(Name, Dir) -> case Name of - erts -> - case filename:basename(Dir) of - "preloaded" -> - filename:basename(filename:dirname(Dir)); - TmpBase -> - TmpBase - end; - _ -> - filename:basename(Dir) + erts -> + case filename:basename(Dir) of + "preloaded" -> + filename:basename(filename:dirname(Dir)); + TmpBase -> + TmpBase + end; + _ -> + filename:basename(Dir) end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff -Nru erlang-13.b.1-dfsg/lib/reltool/src/reltool_sys_win.erl erlang-13.b.3-dfsg/lib/reltool/src/reltool_sys_win.erl --- erlang-13.b.1-dfsg/lib/reltool/src/reltool_sys_win.erl 2009-06-05 13:54:35.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/src/reltool_sys_win.erl 2009-09-18 15:11:13.000000000 +0100 @@ -19,7 +19,7 @@ -module(reltool_sys_win). %% Public --export([start/1, set_app/2, open_app/2]). +-export([start_link/1, get_server/1, set_app/2, open_app/2]). %% Internal -export([init/1, loop/1]). @@ -36,7 +36,7 @@ -record(state, {parent_pid, - xref_pid, + server_pid, app_wins, sys, common, @@ -66,11 +66,14 @@ -define(APP_GRAPH_ITEM, 301). -define(MOD_GRAPH_ITEM, 302). -define(LOAD_CONFIG_ITEM, 303). --define(SAVE_CONFIG_ITEM, 304). --define(UNDO_CONFIG_ITEM, 305). --define(RESET_CONFIG_ITEM, 306). --define(GEN_REL_FILES_ITEM, 307). --define(GEN_TARGET_ITEM, 308). +-define(SAVE_CONFIG_NODEF_NODER_ITEM, 304). +-define(SAVE_CONFIG_NODEF_DER_ITEM, 305). +-define(SAVE_CONFIG_DEF_NODER_ITEM, 306). +-define(SAVE_CONFIG_DEF_DER_ITEM, 307). +-define(UNDO_CONFIG_ITEM, 308). +-define(RESET_CONFIG_ITEM, 309). +-define(GEN_REL_FILES_ITEM, 310). +-define(GEN_TARGET_ITEM, 311). -define(APP_PAGE, "Applications"). -define(LIB_PAGE, "Libraries"). @@ -96,36 +99,21 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Client -start(Opts) -> +start_link(Opts) -> proc_lib:start_link(?MODULE, init, [[{parent, self()} | Opts]], infinity, []). +get_server(Pid) -> + reltool_utils:call(Pid, get_server). + set_app(Pid, App) -> - call(Pid, {set_app, App}). + reltool_utils:call(Pid, {set_app, App}). open_app(Pid, AppName) -> - call(Pid, {open_app, AppName}). - -call(Name, Msg) when is_atom(Name) -> - call(whereis(Name), Msg); -call(Pid, Msg) when is_pid(Pid) -> - Ref = erlang:monitor(process, Pid), - %% io:format("Send~p: ~p\n", [self(), Msg]), - Pid ! {self(), Ref, Msg}, - receive - {Ref, Reply} -> - %% io:format("Rec~p: ~p\n", [self(), Reply]), - erlang:demonitor(Ref, [flush]), - Reply; - {'DOWN', Ref, _, _, Reason} -> - {error, Reason} - end. + reltool_utils:call(Pid, {open_app, AppName}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Server -reply(Pid, Ref, Msg) -> - Pid ! {Ref, Msg}. - init(Options) -> try do_init(Options) @@ -135,11 +123,11 @@ end. do_init([{parent, Parent} | Options]) -> - case reltool_server:start(Options) of - {ok, XrefPid, C, Sys} -> + case reltool_server:start_link(Options) of + {ok, ServerPid, C, Sys} -> process_flag(trap_exit, C#common.trap_exit), S = #state{parent_pid = Parent, - xref_pid = XrefPid, + server_pid = ServerPid, common = C, config_file = filename:absname("config.reltool"), target_dir = filename:absname("reltool_target_dir"), @@ -151,23 +139,43 @@ S2 = create_window(S), %% wx_misc:beginBusyCursor(), - {ok, Sys2} = reltool_server:get_sys(XrefPid), - S3 = S2#state{sys = Sys2}, - S5 = wx:batch(fun() -> - Title = atom_to_list(?APPLICATION), - wxFrame:setTitle(S3#state.frame, Title), - %% wxFrame:setMinSize(Frame, {?WIN_WIDTH, ?WIN_HEIGHT}), - wxStatusBar:setStatusText(S3#state.status_bar, "Done."), - S4 = redraw_apps(S3), - redraw_libs(S4) - end), - %% wx_misc:endBusyCursor(), - %% wxFrame:destroy(Frame), - proc_lib:init_ack(S#state.parent_pid, {ok, self()}), - loop(S5); - {error, Reason} -> - io:format("~p(~p): ~p\n", [?MODULE, ?LINE, Reason]), - exit(Reason) + case reltool_server:get_status(ServerPid) of + {ok, Warnings} -> + exit_dialog(Warnings), + {ok, Sys2} = reltool_server:get_sys(ServerPid), + S3 = S2#state{sys = Sys2}, + S5 = wx:batch(fun() -> + Title = atom_to_list(?APPLICATION), + wxFrame:setTitle(S3#state.frame, Title), + %% wxFrame:setMinSize(Frame, {?WIN_WIDTH, ?WIN_HEIGHT}), + wxStatusBar:setStatusText(S3#state.status_bar, "Done."), + S4 = redraw_apps(S3), + redraw_libs(S4) + end), + %% wx_misc:endBusyCursor(), + %% wxFrame:destroy(Frame), + proc_lib:init_ack(S#state.parent_pid, {ok, self()}), + loop(S5); + {error, Reason} -> + io:format("~p(~p): ~p\n", [?MODULE, ?LINE, Reason]), + exit(Reason) + end; + {error, Reason} -> + io:format("~p(~p): ~p\n", [?MODULE, ?LINE, Reason]), + exit(Reason) + end. + +exit_dialog([]) -> + ok; +exit_dialog(Warnings) -> + Question = "Do you want to continue despite these warnings?", + Details = lists:flatten([[W, $\n] || W <- Warnings]), + case question_dialog(Question, Details) of + ?wxID_OK -> + ok; + ?wxID_CANCEL -> + io:format("~p(~p): ~s\n", [?MODULE, ?LINE, Details]), + exit(Details) end. loop(S) -> @@ -205,14 +213,17 @@ #wx{} = Wx -> S2 = handle_event(S, Wx), ?MODULE:loop(S2); - {ReplyTo, Ref, {set_app, NewApp}} -> + {call, ReplyTo, Ref, get_server} -> + reltool_utils:reply(ReplyTo, Ref, {ok, S#state.server_pid}), + ?MODULE:loop(S); + {call, ReplyTo, Ref, {set_app, NewApp}} -> {ok, AnalysedApp, S2} = do_set_app(S, NewApp), - reply(ReplyTo, Ref, {ok, AnalysedApp}), + reltool_utils:reply(ReplyTo, Ref, {ok, AnalysedApp}), ?MODULE:loop(S2); - {ReplyTo, Ref, {open_app, AppName}} -> + {call, ReplyTo, Ref, {open_app, AppName}} -> S2 = do_open_app(S, AppName), {value, #app_win{pid = AppPid}} = lists:keysearch(AppName, #app_win.name, S2#state.app_wins), - reply(ReplyTo, Ref, {ok, AppPid}), + reltool_utils:reply(ReplyTo, Ref, {ok, AppPid}), ?MODULE:loop(S2); {'EXIT', Pid, Reason} when Pid =:= S#state.parent_pid -> [reltool_fgraph_win:stop(FW#fgraph_win.pid, Reason) || FW <- S#state.fgraph_wins], @@ -301,7 +312,13 @@ wxMenu:append(File, ?RESET_CONFIG_ITEM, "Reset configuration to default" ), wxMenu:append(File, ?UNDO_CONFIG_ITEM, "Undo configuration (toggle)" ), wxMenu:append(File, ?LOAD_CONFIG_ITEM, "Load configuration" ), - wxMenu:append(File, ?SAVE_CONFIG_ITEM, "Save configuration" ), + Save = wxMenu:new(), + wxMenu:append(Save, ?SAVE_CONFIG_NODEF_NODER_ITEM, "Save explicit configuration (neither defaults nor derivates)"), + wxMenu:append(Save, ?SAVE_CONFIG_DEF_NODER_ITEM , "Save configuration defaults (defaults only)"), + wxMenu:append(Save, ?SAVE_CONFIG_NODEF_DER_ITEM, "Save configuration derivates (derivates only))"), + wxMenu:append(Save, ?SAVE_CONFIG_DEF_DER_ITEM, "Save extended configuration (both defaults and derivates)"), + + wxMenu:append(File, ?wxID_ANY, "Save configuration", Save), wxMenu:appendSeparator(File), wxMenu:append(File, ?GEN_REL_FILES_ITEM, "Generate rel, script and boot files" ), wxMenu:append(File, ?GEN_TARGET_ITEM, "Generate target system" ), @@ -452,7 +469,7 @@ wxTreeCtrl:deleteAllItems(Tree), Top = wxTreeCtrl:addRoot(Tree, "Sources", []), - {ok, Erts} = reltool_server:get_app(S#state.xref_pid, erts), + {ok, Erts} = reltool_server:get_app(S#state.server_pid, erts), append_root(Tree, Top, Sys#sys.root_dir, Erts), LibItem = wxTreeCtrl:appendItem(Tree, Top, "Library directories", []), @@ -612,11 +629,11 @@ do_open_app(S, AppName); do_open_app(S, '') -> S; -do_open_app(#state{xref_pid = Xref, common = C, app_wins = AppWins} = S, AppName) when is_atom(AppName) -> +do_open_app(#state{server_pid = ServerPid, common = C, app_wins = AppWins} = S, AppName) when is_atom(AppName) -> case lists:keysearch(AppName, #app_win.name, AppWins) of false -> WxEnv = wx:get_env(), - {ok, Pid} = reltool_app_win:start(WxEnv, Xref, C, AppName), + {ok, Pid} = reltool_app_win:start_link(WxEnv, ServerPid, C, AppName), AW = #app_win{name = AppName, pid = Pid}, S#state{app_wins = [AW | AppWins]}; {value, AW} -> @@ -698,8 +715,14 @@ undo_config(S); #wxCommand{type = command_menu_selected} when Id =:= ?LOAD_CONFIG_ITEM -> load_config(S); - #wxCommand{type = command_menu_selected} when Id =:= ?SAVE_CONFIG_ITEM -> - save_config(S); + #wxCommand{type = command_menu_selected} when Id =:= ?SAVE_CONFIG_NODEF_NODER_ITEM -> + save_config(S, false, false); + #wxCommand{type = command_menu_selected} when Id =:= ?SAVE_CONFIG_NODEF_DER_ITEM -> + save_config(S, false, true); + #wxCommand{type = command_menu_selected} when Id =:= ?SAVE_CONFIG_DEF_NODER_ITEM -> + save_config(S, true, false); + #wxCommand{type = command_menu_selected} when Id =:= ?SAVE_CONFIG_DEF_DER_ITEM -> + save_config(S, true, true); #wxCommand{type = command_menu_selected} when Id =:= ?GEN_REL_FILES_ITEM -> gen_rel_files(S); #wxCommand{type = command_menu_selected} when Id =:= ?GEN_TARGET_ITEM -> @@ -723,8 +746,8 @@ AboutStr, [{style, ?wxOK bor ?wxICON_INFORMATION}, {caption, "About Reltool"}]), - wxDialog:showModal(MD), - wxDialog:destroy(MD), + wxMessageDialog:showModal(MD), + wxMessageDialog:destroy(MD), S; #wxMenu{type = menu_close} -> S#state{popup_menu = undefined}; @@ -924,9 +947,9 @@ [?MODULE, self(), ObjRef, UserData, Event]), S. -handle_app_button(#state{xref_pid = Xref, app_wins = AppWins} = S, Items, Action) -> +handle_app_button(#state{server_pid = ServerPid, app_wins = AppWins} = S, Items, Action) -> NewApps = [move_app(S, Item, Action) || Item <- Items], - case reltool_server:set_apps(Xref, NewApps) of + case reltool_server:set_apps(ServerPid, NewApps) of {ok, []} -> ok; {ok, Warnings} -> @@ -938,14 +961,14 @@ [ok = reltool_app_win:refresh(AW#app_win.pid) || AW <- AppWins], redraw_apps(S). -do_set_sys(#state{sys = Sys, xref_pid = Xref, status_bar = Bar} = S) -> +do_set_sys(#state{sys = Sys, server_pid = ServerPid, status_bar = Bar} = S) -> wxStatusBar:setStatusText(Bar, "Processing libraries..."), - Status = reltool_server:set_sys(Xref, Sys), + Status = reltool_server:set_sys(ServerPid, Sys), check_and_refresh(S, Status). move_app(S, {_ItemNo, AppBase}, Action) -> {AppName, _Vsn} = reltool_utils:split_app_name(AppBase), - {ok, OldApp} = reltool_server:get_app(S#state.xref_pid, AppName), + {ok, OldApp} = reltool_server:get_app(S#state.server_pid, AppName), AppCond = case Action of whitelist_add -> @@ -967,8 +990,8 @@ end, OldApp#app{incl_cond = AppCond}. -do_set_app(#state{xref_pid = Xref, app_wins = AppWins} = S, NewApp) -> - {ok, AnalysedApp, Warnings} = reltool_server:set_app(Xref, NewApp), +do_set_app(#state{server_pid = ServerPid, app_wins = AppWins} = S, NewApp) -> + {ok, AnalysedApp, Warnings} = reltool_server:set_app(ServerPid, NewApp), [ok = reltool_app_win:refresh(AW#app_win.pid) || AW <- AppWins], S2 = redraw_apps(S), case Warnings of @@ -980,15 +1003,15 @@ end, {ok, AnalysedApp, S2}. -redraw_apps(#state{xref_pid = Xref, +redraw_apps(#state{server_pid = ServerPid, source = SourceCtrl, whitelist = WhiteCtrl, blacklist = BlackCtrl, derived = DerivedCtrl} = S) -> - {ok, SourceApps} = reltool_server:get_apps(Xref, source), - {ok, WhiteApps} = reltool_server:get_apps(Xref, whitelist), - {ok, BlackApps} = reltool_server:get_apps(Xref, blacklist), - {ok, DerivedApps} = reltool_server:get_apps(Xref, derived), + {ok, SourceApps} = reltool_server:get_apps(ServerPid, source), + {ok, WhiteApps} = reltool_server:get_apps(ServerPid, whitelist), + {ok, BlackApps} = reltool_server:get_apps(ServerPid, blacklist), + {ok, DerivedApps} = reltool_server:get_apps(ServerPid, derived), BadApps = fun(#app{used_by_apps = UsedBy} = A) when UsedBy =/= [] -> A#app{status = missing}; @@ -1039,8 +1062,8 @@ N. update_app_graph(S) -> - {ok, WhiteApps} = reltool_server:get_apps(S#state.xref_pid, whitelist), - {ok, DerivedApps} = reltool_server:get_apps(S#state.xref_pid, derived), + {ok, WhiteApps} = reltool_server:get_apps(S#state.server_pid, whitelist), + {ok, DerivedApps} = reltool_server:get_apps(S#state.server_pid, derived), WhiteNames = [A#app.name || A <- WhiteApps], DerivedNames = [A#app.name || A <- DerivedApps], @@ -1062,8 +1085,8 @@ create_fgraph_window(S, Title, Nodes, Links). update_mod_graph(S) -> - {ok, WhiteApps} = reltool_server:get_apps(S#state.xref_pid, whitelist), - {ok, DerivedApps} = reltool_server:get_apps(S#state.xref_pid, derived), + {ok, WhiteApps} = reltool_server:get_apps(S#state.server_pid, whitelist), + {ok, DerivedApps} = reltool_server:get_apps(S#state.server_pid, derived), WhiteMods = lists:usort([M || A <- WhiteApps, M <- A#app.mods, M#mod.is_included =:= true]), DerivedMods = lists:usort([M || A <- DerivedApps, M <- A#app.mods, M#mod.is_included =:= true]), @@ -1108,12 +1131,12 @@ reset_config(#state{status_bar = Bar} = S) -> wxStatusBar:setStatusText(Bar, "Processing libraries..."), - Status = reltool_server:reset_config(S#state.xref_pid), + Status = reltool_server:reset_config(S#state.server_pid), check_and_refresh(S, Status). undo_config(#state{status_bar = Bar} = S) -> wxStatusBar:setStatusText(Bar, "Processing libraries..."), - ok = reltool_server:undo_config(S#state.xref_pid), + ok = reltool_server:undo_config(S#state.server_pid), refresh(S). load_config(#state{status_bar = Bar, config_file = OldFile} = S) -> @@ -1121,17 +1144,17 @@ case select_file(S#state.frame, "Select a file to load the configuration from", OldFile, Style) of {ok, NewFile} -> wxStatusBar:setStatusText(Bar, "Processing libraries..."), - Status = reltool_server:load_config(S#state.xref_pid, NewFile), + Status = reltool_server:load_config(S#state.server_pid, NewFile), check_and_refresh(S#state{config_file = NewFile}, Status); cancel -> S end. -save_config(#state{config_file = OldFile} = S) -> +save_config(#state{config_file = OldFile} = S, InclDefaults, InclDerivates) -> Style = ?wxFD_SAVE bor ?wxFD_OVERWRITE_PROMPT, case select_file(S#state.frame, "Select a file to save the configuration to", OldFile, Style) of {ok, NewFile} -> - Status = reltool_server:save_config(S#state.xref_pid, NewFile), + Status = reltool_server:save_config(S#state.server_pid, NewFile, InclDefaults, InclDerivates), check_and_refresh(S#state{config_file = NewFile}, Status); cancel -> S @@ -1141,7 +1164,7 @@ Style = ?wxFD_SAVE bor ?wxFD_OVERWRITE_PROMPT, case select_dir(S#state.frame, "Select a directory to generate rel, script and boot files to", OldDir, Style) of {ok, NewDir} -> - Status = reltool_server:gen_rel_files(S#state.xref_pid, NewDir), + Status = reltool_server:gen_rel_files(S#state.server_pid, NewDir), check_and_refresh(S, Status); cancel -> S @@ -1151,7 +1174,7 @@ Style = ?wxFD_SAVE bor ?wxFD_OVERWRITE_PROMPT, case select_dir(S#state.frame, "Select a directory to generate a target system to", OldDir, Style) of {ok, NewDir} -> - Status = reltool_server:gen_target(S#state.xref_pid, NewDir), + Status = reltool_server:gen_target(S#state.server_pid, NewDir), check_and_refresh(S#state{target_dir = NewDir}, Status); cancel -> S @@ -1188,11 +1211,8 @@ case Status of ok -> true; - {ok, []} -> - true; {ok, Warnings} -> - Q = lists:flatten([[W, $\n] || W <- Warnings]), - undo_dialog(S, "Do you want to perform the update despite these warnings?\n\n" ++ Q); + undo_dialog(S, Warnings); {error, Reason} when is_list(Reason) -> display_message(Reason, ?wxICON_ERROR), false; @@ -1204,23 +1224,51 @@ refresh(S). refresh(S) -> - {ok, Sys} = reltool_server:get_sys(S#state.xref_pid), + {ok, Sys} = reltool_server:get_sys(S#state.server_pid), [ok = reltool_app_win:refresh(AW#app_win.pid) || AW <- S#state.app_wins], S2 = S#state{sys = Sys}, S3 = redraw_libs(S2), redraw_apps(S3). -undo_dialog(S, Question) -> - Dialog = wxMessageDialog:new(wx:null(), - Question, - [{style, ?wxYES_NO bor ?wxICON_ERROR}]), - Answer = wxMessageDialog:showModal(Dialog), - wxMessageDialog:destroy(Dialog), - case Answer of - ?wxID_YES -> +question_dialog(Question, Details) -> + %% Parent = S#state.frame, + Parent = wx:typeCast(wx:null(), wxWindow), + %% [{style, ?wxYES_NO bor ?wxICON_ERROR bor ?wx}]), + DialogStyle = ?wxRESIZE_BORDER bor ?wxCAPTION bor ?wxSYSTEM_MENU bor + ?wxMINIMIZE_BOX bor ?wxMAXIMIZE_BOX bor ?wxCLOSE_BOX, + Dialog = wxDialog:new(Parent, ?wxID_ANY, "Undo dialog", [{style, DialogStyle}]), + Color = wxWindow:getBackgroundColour(Dialog), + TextStyle = ?wxTE_READONLY bor ?wxTE_MULTILINE bor ?wxHSCROLL, + Text1 = wxTextCtrl:new(Dialog, ?wxID_ANY, [{style, ?wxTE_READONLY bor ?wxBORDER_NONE}]), + wxWindow:setBackgroundColour(Text1, Color), + wxTextCtrl:appendText(Text1, Question), + Text2 = wxTextCtrl:new(Dialog, ?wxID_ANY, [{size, {600, 400}}, {style, TextStyle}]), + wxWindow:setBackgroundColour(Text2, Color), + wxTextCtrl:appendText(Text2, Details), + %% wxDialog:setAffirmativeId(Dialog, ?wxID_YES), + %% wxDialog:setEscapeId(Dialog, ?wxID_NO), + Sizer = wxBoxSizer:new(?wxVERTICAL), + wxSizer:add(Sizer, Text1, [{border, 2}, {flag, ?wxEXPAND}]), + wxSizer:add(Sizer, Text2, [{border, 2}, {flag, ?wxEXPAND}, {proportion, 1}]), + ButtSizer = wxDialog:createStdDialogButtonSizer(Dialog, ?wxOK bor ?wxCANCEL), + wxSizer:add(Sizer, ButtSizer, [{border, 2}, {flag, ?wxEXPAND}]), + wxPanel:setSizer(Dialog, Sizer), + wxSizer:fit(Sizer, Dialog), + wxSizer:setSizeHints(Sizer, Dialog), + Answer = wxDialog:showModal(Dialog), + wxDialog:destroy(Dialog), + Answer. + +undo_dialog(_S, []) -> + true; +undo_dialog(S, Warnings) -> + Question = "Do you want to perform the update despite these warnings?", + Details = lists:flatten([[W, $\n] || W <- Warnings]), + case question_dialog(Question, Details) of + ?wxID_OK -> true; - ?wxID_NO -> - reltool_server:undo_config(S#state.xref_pid), + ?wxID_CANCEL -> + reltool_server:undo_config(S#state.server_pid), false end. diff -Nru erlang-13.b.1-dfsg/lib/reltool/src/reltool_target.erl erlang-13.b.3-dfsg/lib/reltool/src/reltool_target.erl --- erlang-13.b.1-dfsg/lib/reltool/src/reltool_target.erl 2009-04-17 10:59:31.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/src/reltool_target.erl 2009-11-20 13:34:42.000000000 +0000 @@ -20,17 +20,20 @@ %% Public -export([ - gen_config/1, + gen_config/2, gen_app/1, - gen_rel/2, gen_rel_files/2, + gen_rel/2, + gen_rel_files/2, gen_boot/1, gen_script/4, + gen_spec/1, + eval_spec/3, gen_target/2, install/2 ]). - --include_lib("kernel/include/file.hrl"). +-compile(export_all). -include("reltool.hrl"). +-include_lib("kernel/include/file.hrl"). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Hardcoded internals about the kernel application @@ -59,92 +62,134 @@ %% Generate the contents of a config file %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -gen_config(#sys{mod_cond = ModCond, - incl_cond = AppCond, - debug_info = DebugInfo, - app_file = AppFile, - incl_erts_dirs = InclErtsDirs, - excl_erts_dirs = ExclErtsDirs, - incl_app_dirs = InclAppDirs, - excl_app_dirs = ExclAppDirs, - root_dir = RootDir, - lib_dirs = LibDirs, - escripts = Escripts, - apps = Apps, - boot_rel = BootRel, - rels = Rels}) -> - ErtsItem = +gen_config(#sys{root_dir = RootDir, + lib_dirs = LibDirs, + mod_cond = ModCond, + incl_cond = AppCond, + apps = Apps, + boot_rel = BootRel, + rels = Rels, + emu_name = EmuName, + profile = Profile, + incl_sys_filters = InclSysFiles, + excl_sys_filters = ExclSysFiles, + incl_app_filters = InclAppFiles, + excl_app_filters = ExclAppFiles, + incl_archive_filters = InclArchiveDirs, + excl_archive_filters = ExclArchiveDirs, + archive_opts = ArchiveOpts, + relocatable = Relocatable, + app_type = AppType, + app_file = AppFile, + debug_info = DebugInfo}, + InclDefaults) -> + ErtsItems = case lists:keysearch(erts, #app.name, Apps) of {value, Erts} -> - [{erts, gen_config(Erts)}]; + [{erts, gen_config(Erts, InclDefaults)}]; false -> [] end, - Default = reltool_utils:default_rels(), - RelsItem = - case {[{rel, R#rel.name, R#rel.vsn, gen_config(R)} || R <- Rels], - [{rel, R#rel.name, R#rel.vsn, gen_config(R)} || R <- Default]} of + AppsItems = + [{app, A#app.name, gen_config(A, InclDefaults)} + || A <- Apps, + A#app.name =/= ?MISSING_APP, + A#app.name =/= erts, + A#app.is_included =:= true, + A#app.is_escript =/= true], + EscriptItems = [{escript, A#app.active_dir, emit(incl_cond, A#app.incl_cond, undefined, InclDefaults)} + || A <- Apps, A#app.is_escript], + DefaultRels = reltool_utils:default_rels(), + RelsItems = + case {[{rel, R#rel.name, R#rel.vsn, gen_config(R, InclDefaults)} || R <- Rels], + [{rel, R#rel.name, R#rel.vsn, gen_config(R, InclDefaults)} || R <- DefaultRels]} of {RI, RI} -> []; {RI, _} -> RI end, - {sys, - [{mod_cond, ModCond} || ModCond =/= ?DEFAULT_MOD_COND] ++ - [{incl_cond, AppCond} || AppCond =/= ?DEFAULT_INCL_COND] ++ - [{debug_info, DebugInfo} || DebugInfo =/= ?DEFAULT_DEBUG_INFO] ++ - [{app_file, AppFile} || AppFile =/= ?DEFAULT_APP_FILE] ++ - [{incl_erts_dirs, InclErtsDirs} || InclErtsDirs =/= ?DEFAULT_INCL_ERTS_DIRS] ++ - [{excl_erts_dirs, ExclErtsDirs} || ExclErtsDirs =/= ?DEFAULT_EXCL_ERTS_DIRS] ++ - [{incl_app_dirs, InclAppDirs} || InclAppDirs =/= ?DEFAULT_INCL_APP_DIRS] ++ - [{excl_app_dirs, ExclAppDirs} || ExclAppDirs =/= ?DEFAULT_EXCL_APP_DIRS] ++ - [{root_dir, RootDir} || RootDir =/= code:root_dir()] ++ - [{lib_dirs, LibDirs} || LibDirs =/= []] ++ - [{escripts, Escripts} || Escripts =/= []] ++ - ErtsItem ++ - [{app, A#app.name, gen_config(A)} || A <- Apps, A#app.name =/= erts] ++ - [{boot_rel, BootRel} || BootRel =/= ?DEFAULT_REL_NAME] ++ - RelsItem}; -gen_config(#app{name = _Name, - mod_cond = ModCond, - incl_cond = AppCond, - debug_info = DebugInfo, - app_file = AppFile, - incl_app_dirs = InclAppDirs, - excl_app_dirs = ExclAppDirs, - use_selected_vsn = UseSelected, + X = fun(List) -> [Re || #regexp{source = Re} <- List] end, + {sys, + emit(root_dir, RootDir, code:root_dir(), InclDefaults) ++ + emit(lib_dirs, LibDirs, ?DEFAULT_LIBS, InclDefaults) ++ + EscriptItems ++ + emit(mod_cond, ModCond, ?DEFAULT_MOD_COND, InclDefaults) ++ + emit(incl_cond, AppCond, ?DEFAULT_INCL_COND, InclDefaults) ++ + ErtsItems ++ + AppsItems ++ + emit(boot_rel, BootRel, ?DEFAULT_REL_NAME, InclDefaults) ++ + RelsItems ++ + emit(emu_name, EmuName, ?DEFAULT_EMU_NAME, InclDefaults) ++ + emit(relocatable, Relocatable, ?DEFAULT_RELOCATABLE, InclDefaults) ++ + emit(profile, Profile, ?DEFAULT_PROFILE, InclDefaults) ++ + emit(incl_sys_filters, X(InclSysFiles), ?DEFAULT_INCL_SYS_FILTERS, InclDefaults) ++ + emit(excl_sys_filters, X(ExclSysFiles), ?DEFAULT_EXCL_SYS_FILTERS, InclDefaults) ++ + emit(incl_app_filters, X(InclAppFiles), ?DEFAULT_INCL_APP_FILTERS, InclDefaults) ++ + emit(excl_app_filters, X(ExclAppFiles), ?DEFAULT_EXCL_APP_FILTERS, InclDefaults) ++ + emit(incl_archive_filters, X(InclArchiveDirs), ?DEFAULT_INCL_ARCHIVE_FILTERS, InclDefaults) ++ + emit(excl_archive_filters, X(ExclArchiveDirs), ?DEFAULT_EXCL_ARCHIVE_FILTERS, InclDefaults) ++ + emit(archive_opts, ArchiveOpts, ?DEFAULT_ARCHIVE_OPTS, InclDefaults) ++ + emit(app_type, AppType, ?DEFAULT_APP_TYPE, InclDefaults) ++ + emit(app_file, AppFile, ?DEFAULT_APP_FILE, InclDefaults) ++ + emit(debug_info, DebugInfo, ?DEFAULT_DEBUG_INFO, InclDefaults)}; +gen_config(#app{name = _Name, + mod_cond = ModCond, + incl_cond = AppCond, + debug_info = DebugInfo, + app_file = AppFile, + incl_app_filters = InclAppFiles, + excl_app_filters = ExclAppFiles, + incl_archive_filters = InclArchiveDirs, + excl_archive_filters = ExclArchiveDirs, + archive_opts = ArchiveOpts, + use_selected_vsn = UseSelected, vsn = Vsn, - mods = Mods}) -> - [{mod_cond, ModCond} || ModCond =/= undefined] ++ - [{incl_cond, AppCond} || AppCond =/= undefined] ++ - [{debug_info, DebugInfo} || DebugInfo =/= undefined] ++ - [{app_file, AppFile} || AppFile =/= undefined] ++ - [{incl_app_dirs, InclAppDirs} || InclAppDirs =/= undefined] ++ - [{excl_app_dirs, ExclAppDirs} || ExclAppDirs =/= undefined] ++ - [{vsn, Vsn} || Vsn =/= undefined, UseSelected =/= true] ++ - [{mod, M#mod.name, gen_config(M)} || M <- Mods]; + mods = Mods}, + InclDefaults) -> + emit(mod_cond, ModCond, undefined, InclDefaults) ++ + emit(incl_cond, AppCond, undefined, InclDefaults) ++ + emit(debug_info, DebugInfo, undefined, InclDefaults) ++ + emit(app_file, AppFile, undefined, InclDefaults) ++ + emit(incl_app_filters, InclAppFiles, undefined, InclDefaults) ++ + emit(excl_app_filters, ExclAppFiles, undefined, InclDefaults) ++ + emit(incl_archive_filters, InclArchiveDirs, undefined, InclDefaults) ++ + emit(excl_archive_filters, ExclArchiveDirs, undefined, InclDefaults) ++ + emit(archive_opts, ArchiveOpts, undefined, InclDefaults) ++ + emit(vsn, Vsn, undefined, InclDefaults orelse UseSelected =/= true) ++ + [{mod, M#mod.name, gen_config(M, InclDefaults)} || M <- Mods, M#mod.is_included =:= true]; gen_config(#mod{name = _Name, incl_cond = AppCond, - debug_info = DebugInfo}) -> - [{incl_cond, AppCond} || AppCond =/= undefined] ++ - [{debug_info, DebugInfo} || DebugInfo =/= undefined]; + debug_info = DebugInfo}, + InclDefaults) -> + emit(incl_cond, AppCond, undefined, InclDefaults) ++ + emit(debug_info, DebugInfo, undefined, InclDefaults); gen_config(#rel{name = _Name, vsn = _Vsn, - rel_apps = RelApps}) -> - [gen_config(RA) || RA <- RelApps]; + rel_apps = RelApps}, + InclDefaults) -> + [gen_config(RA, InclDefaults) || RA <- RelApps]; gen_config(#rel_app{name = Name, - type = Type, - incl_apps = InclApps}) -> + app_type = Type, + incl_apps = InclApps}, + _InclDefaults) -> case {Type, InclApps} of {undefined, []} -> Name; {undefined, _} -> {Name, InclApps}; {_, []} -> {Name, Type}; {_, _} -> {Name, Type, InclApps} end; -gen_config({Tag, Val}) -> - [{Tag, Val} || Val =/= undefined]; -gen_config([]) -> +gen_config({Tag, Val}, InclDefaults) -> + emit(Tag, Val, undefined, InclDefaults); +gen_config([], _InclDefaults) -> []; -gen_config([H | T]) -> - lists:flatten([gen_config(H), gen_config(T)]). +gen_config([H | T], InclDefaults) -> + lists:flatten([gen_config(H, InclDefaults), gen_config(T, InclDefaults)]). + +emit(Tag, Val, Default, InclDefaults) -> + if + Val == undefined -> []; + InclDefaults -> [{Tag, Val}]; + Val =/= Default -> [{Tag, Val}]; + true -> [] + end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Generate the contents of an app file @@ -194,7 +239,7 @@ {erts, Erts#app.vsn}, [app_to_rel(RA, Apps ) || RA <- RelApps]}. -app_to_rel(#rel_app{name = Name, type = Type, incl_apps = InclApps}, Apps) -> +app_to_rel(#rel_app{name = Name, app_type = Type, incl_apps = InclApps}, Apps) -> {value, #app{vsn = Vsn}} = lists:keysearch(Name, #app.name, Apps), case {Type, InclApps} of {undefined, []} -> {Name, Vsn}; @@ -222,18 +267,15 @@ {error, Text} end. -throw_error(Format, Args) -> - throw({error, lists:flatten(io_lib:format(Format, Args))}). - do_gen_script(#rel{name = RelName, vsn = RelVsn, rel_apps = RelApps}, - #sys{apps = Apps}, + #sys{apps = Apps, app_type = DefaultType}, PathFlag, Variables) -> {value, Erts} = lists:keysearch(erts, #app.name, Apps), Preloaded = [Mod#mod.name || Mod <- Erts#app.mods], Mandatory = mandatory_modules(), Early = Mandatory ++ Preloaded, - MergedApps = [merge_app(RA, Apps) || RA <- RelApps], + MergedApps = [merge_app(RA, Apps, DefaultType) || RA <- RelApps], SortedApps = sort_apps(MergedApps), {value, KernelApp} = lists:keysearch(kernel, #app.name, SortedApps), @@ -251,52 +293,52 @@ {primLoad, lists:sort(Mandatory)}, {kernel_load_completed}, {progress, kernel_load_completed}, - + %% Load remaining modules [load_app_mods(A, Early, PathFlag, Variables) || A <- SortedApps], {progress, modules_loaded}, - + %% Start kernel processes {path, create_path(SortedApps, PathFlag, Variables)}, kernel_processes(gen_app(KernelApp)), {progress, init_kernel_started}, - + %% Load applications [{apply, {application, load, [gen_app(A)]}} || - A <- SortedApps, - A#app.name =/= kernel, - A#app.type =/= none], + A = #app{name = Name, app_type = Type} <- SortedApps, + Name =/= kernel, + Type =/= none], {progress, applications_loaded}, - + %% Start applications [{apply, {application, start_boot, [Name, Type]}} || - #app{name = Name, type = Type} <- SortedApps, + #app{name = Name, app_type = Type} <- SortedApps, Type =/= none, Type =/= load, not lists:member(Name, InclApps)], - + %% Apply user specific customizations - {apply, {c, erlangrc, []}}, + {apply, {c, erlangrc, []}}, {progress, started} ], {ok, {script, {RelName, RelVsn}, lists:flatten(DeepList)}}. -merge_app(#rel_app{name = Name, type = Type, incl_apps = RelIncl}, Apps) -> +merge_app(#rel_app{name = Name, app_type = Type, incl_apps = RelIncl}, Apps, DefaultType) -> {value, App} = lists:keysearch(Name, #app.name, Apps), Type2 = - case {Type, App#app.type} of - {undefined, undefined} -> permanent; + case {Type, App#app.app_type} of + {undefined, undefined} -> DefaultType; {undefined, AppType} -> AppType; {_, _} -> Type end, Info = App#app.info, case RelIncl -- Info#app_info.incl_apps of [] -> - App#app{type = Type2, info = Info#app_info{incl_apps = RelIncl}}; + App#app{app_type = Type2, info = Info#app_info{incl_apps = RelIncl}}; BadIncl -> - throw_error("~p: These applications are missing as " - "included_applications in the app file: ~p\n", - [Name, BadIncl]) + reltool_utils:throw_error("~p: These applications are missing as " + "included_applications in the app file: ~p\n", + [Name, BadIncl]) end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -372,13 +414,13 @@ []; sort_apps([], Missing, [], _) -> %% this has already been checked before, but as we have the info... - throw_error("Undefined applications: ~p\n", [make_set(Missing)]); + reltool_utils:throw_error("Undefined applications: ~p\n", [make_set(Missing)]); sort_apps([], [], Circular, _) -> - throw_error("Circular dependencies: ~p\n", [make_set(Circular)]); + reltool_utils:throw_error("Circular dependencies: ~p\n", [make_set(Circular)]); sort_apps([], Missing, Circular, _) -> - throw_error("Circular dependencies: ~p\n" - "Undefined applications: ~p\n", - [make_set(Circular), make_set(Missing)]). + reltool_utils:throw_error("Circular dependencies: ~p\n" + "Undefined applications: ~p\n", + [make_set(Circular), make_set(Missing)]). find_all(CheckingApp, [Name | Names], Apps, Visited, Found, NotFound) -> case lists:keysearch(Name, #app.name, Apps) of @@ -493,289 +535,594 @@ Y =/= H]]. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Generate a complete target system +%% Generate rel, script and boot files %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -gen_target(Sys, TargetDir) -> +gen_rel_files(Sys, TargetDir) -> try - do_gen_target(Sys, TargetDir) + Spec = spec_rel_files(Sys), + eval_spec(Spec, Sys#sys.root_dir, TargetDir) catch throw:{error, Text} -> {error, Text} end. -do_gen_target(Sys, TargetDir) -> - TargetDir2 = filename:absname(TargetDir), - recursive_delete(TargetDir2), - create_dir(TargetDir2), - RelVsnDir = create_system_files(Sys, TargetDir2), - ErtsDir = copy_apps(Sys, TargetDir2), - create_bin(Sys, ErtsDir, RelVsnDir, TargetDir2). - -create_system_files(Sys, TargetDir) -> - RelDir = filename:join([TargetDir, "releases"]), - create_dir(RelDir), - {value, Erts} = lists:keysearch(erts, #app.name, Sys#sys.apps), - {value, BootRel} = lists:keysearch(Sys#sys.boot_rel, #rel.name, Sys#sys.rels), - Data = Erts#app.vsn ++ " " ++ BootRel#rel.vsn ++ "\n", - DataFile = filename:join([RelDir, "start_erl.data"]), - case file:write_file(DataFile, Data) of - ok -> - ok; - {error, Reason} -> - throw_error("~s: ~s\n", [DataFile, file:format_error(Reason)]) - end, - RelVsnDir = filename:join([RelDir, BootRel#rel.vsn]), - do_gen_rel_files(Sys, RelVsnDir), - file:copy(filename:join([Sys#sys.root_dir, "COPYRIGHT"]), - filename:join([TargetDir, "COPYRIGHT"])), - RelVsnDir. - +spec_rel_files(#sys{rels = Rels} = Sys) -> + lists:append([do_spec_rel_files(R, Sys) || R <- Rels]). + +do_spec_rel_files(#rel{name = Name} = Rel, Sys) -> + RelFile = Name ++ ".rel", + ScriptFile = Name ++ ".script", + BootFile = Name ++ ".boot", + GenRel = gen_rel(Rel, Sys), + PathFlag = true, + Variables = [], + {ok, Script} = do_gen_script(Rel, Sys, PathFlag, Variables), + {ok, BootBin} = gen_boot(Script), + Date = date(), + Time = time(), + RelIoList = io_lib:format("%% rel generated at ~w ~w\n~p.\n\n", + [Date, Time, GenRel]), + ScriptIoList = io_lib:format("%% script generated at ~w ~w\n~p.\n\n", + [Date, Time, Script]), + [ + {write_file, RelFile, RelIoList}, + {write_file, ScriptFile, ScriptIoList}, + {write_file, BootFile, BootBin} + ]. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Generate rel, script and boot files +%% Generate a complete target system %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -gen_rel_files(Sys, Dir) -> +gen_target(Sys, TargetDir) -> try - do_gen_rel_files(Sys, Dir) + Spec = do_gen_spec(Sys), + eval_spec(Spec, Sys#sys.root_dir, TargetDir) + catch + throw:{error, Text} -> + {error, Text} + end. + +gen_spec(Sys) -> + try + {ok, do_gen_spec(Sys)} catch throw:{error, Text} -> {error, Text} end. -do_gen_rel_files(#sys{rels = Rels} = Sys, Dir) -> - lists:foreach(fun(R) -> do_gen_rel_files(R, Sys, Dir) end, Rels). +do_gen_spec(#sys{root_dir = RootDir, + incl_sys_filters = InclRegexps, + excl_sys_filters = ExclRegexps, + relocatable = Relocatable, + apps = Apps} = Sys) -> + {create_dir, _, SysFiles} = spec_dir(RootDir), + {ExclRegexps2, SysFiles2} = strip_sys_files(Relocatable, SysFiles, Apps, ExclRegexps), + RelFiles = spec_rel_files(Sys), + {InclRegexps2, BinFiles} = spec_bin_files(Sys, SysFiles, SysFiles2, RelFiles, InclRegexps), + LibFiles = spec_lib_files(Sys), + {BootVsn, StartFile} = spec_start_file(Sys), + SysFiles3 = + [ + {create_dir, "releases", + [StartFile, + {create_dir,BootVsn, RelFiles}]}, + {create_dir, "bin", BinFiles} + ] ++ SysFiles2, + %% io:format("InclRegexps2: ~p\n", [InclRegexps2]), + %% io:format("ExclRegexps2: ~p\n", [ExclRegexps2]), + SysFiles4 = filter_spec(SysFiles3, InclRegexps2, ExclRegexps2), + SysFiles5 = SysFiles4 ++ [{create_dir, "lib", LibFiles}], + check_sys(["bin", "erts", "lib"], SysFiles5), + SysFiles5. + +strip_sys_files(Relocatable, SysFiles, Apps, ExclRegexps) -> + ExclRegexps2 = + case Relocatable of + true -> + ExtraExcl = ["^erts.*/bin/.*src$"], + reltool_utils:decode_regexps(excl_sys_filters, {add, ExtraExcl}, ExclRegexps); + false -> + ExclRegexps + end, + {value, Erts} = lists:keysearch(erts, #app.name, Apps), + FilterErts = + fun(Spec) -> + File = element(2, Spec), + case lists:prefix("erts", File) of + true -> + if + File =:= Erts#app.label -> + replace_dyn_erl(Relocatable, Spec); + true -> + false + end; + false -> + true + end + end, + SysFiles2 = lists:zf(FilterErts, SysFiles), + SysFiles3 = lists:foldl(fun(F, Acc) -> lists:keydelete(F, 2, Acc) end, + SysFiles2, + ["releases", "lib", "bin"]), + {ExclRegexps2, SysFiles3}. + +replace_dyn_erl(false, _ErtsSpec) -> + true; +replace_dyn_erl(true, {create_dir, ErtsDir, ErtsFiles}) -> + [{create_dir, _, BinFiles}] = safe_lookup_spec("bin", ErtsFiles), + case lookup_spec("dyn_erl", BinFiles) of + [] -> + case lookup_spec("erl.ini", BinFiles) of + [] -> + true; + [{copy_file, ErlIni}] -> + %% Remove Windows .ini file + BinFiles2 = lists:keydelete(ErlIni, 2, BinFiles), + ErtsFiles2 = lists:keyreplace("bin", 2, ErtsFiles, {create_dir, "bin", BinFiles2}), + {true, {create_dir, ErtsDir, ErtsFiles2}} + end; + [{copy_file, DynErlExe}] -> + %% Replace erl with dyn_erl + ErlExe = "erl" ++ filename:extension(DynErlExe), + BinFiles2 = lists:keydelete(DynErlExe, 2, BinFiles), + DynErlExe2 = filename:join([ErtsDir, "bin", DynErlExe]), + BinFiles3 = lists:keyreplace(ErlExe, 2, BinFiles2, {copy_file, ErlExe, DynErlExe2}), + ErtsFiles2 = lists:keyreplace("bin", 2, ErtsFiles, {create_dir, "bin", BinFiles3}), + {true, {create_dir, ErtsDir, ErtsFiles2}} + end. -do_gen_rel_files(R, Sys, Dir) -> - create_dir(Dir), - Rel = gen_rel(R, Sys), - PathFlag = true, - Variables = [], - {ok, Script} = gen_script(R, Sys, PathFlag, Variables), - {ok, BootBin} = gen_boot(Script), - Base = filename:join([Dir, R#rel.name]), - Date = date(), - Time = time(), - RelIoList = io_lib:format("%% rel generated at ~w ~w\n~p.\n\n", - [Date, Time, Rel]), - RelFile = Base ++ ".rel", - RelRes = file:write_file(RelFile, RelIoList), +spec_bin_files(Sys, AllSysFiles, StrippedSysFiles, RelFiles, InclRegexps) -> + [{create_dir, ErtsLabel, ErtsFiles}] = safe_lookup_spec("erts", StrippedSysFiles), + [{create_dir, _, BinFiles}] = safe_lookup_spec("bin", ErtsFiles), + ErtsBin = filename:join([ErtsLabel, "bin"]), + Escripts = spec_escripts(Sys, ErtsBin, BinFiles), + Map = fun({copy_file, File}) -> + {copy_file, File, filename:join([ErtsBin, File])}; + ({copy_file, NewFile, OldFile}) -> + {_, OldFile2} = abs_to_rel_path(ErtsBin, filename:join([ErtsBin, OldFile])), + {copy_file, NewFile, OldFile2} + end, + + %% Do only copy those bin files from erts/bin that also exists in bin + [{create_dir, _, OldBinFiles}] = safe_lookup_spec("bin", AllSysFiles), + GoodNames = [F || {copy_file, F} <- OldBinFiles, + not lists:suffix(".boot", F), + not lists:suffix(".script", F)], + BinFiles2 = [Map(S) || S <- BinFiles, lists:member(element(2, S), GoodNames)], + BootFiles = [F || F <- RelFiles, lists:suffix(".boot", element(2, F))], + [{write_file, _, BootRel}] = safe_lookup_spec(Sys#sys.boot_rel ++ ".boot", BootFiles), + BootFiles2 = lists:keystore("start.boot", 2, BootFiles, {write_file, "start.boot", BootRel}), + MakeRegexp = fun(File) -> "^bin/" ++ element(2, File) ++ "(|.escript)$" end, + ExtraIncl = lists:map(MakeRegexp, Escripts), + InclRegexps2 = reltool_utils:decode_regexps(incl_sys_filters, {add, ExtraIncl}, InclRegexps), + {InclRegexps2, Escripts ++ BinFiles2 ++ BootFiles2}. + +spec_escripts(#sys{apps = Apps}, ErtsBin, BinFiles) -> + Filter = fun(#app{is_escript = IsEscript, is_included = IsIncl, + is_pre_included = IsPre, name = Name, active_dir = File}) -> + if + Name =:= ?MISSING_APP -> + false; + not IsEscript -> + false; + IsIncl; IsPre -> + {true, do_spec_escript(File, ErtsBin, BinFiles)}; + true -> + false + end + end, + lists:flatten(lists:zf(Filter, Apps)). + +do_spec_escript(File, ErtsBin, BinFiles) -> + [{copy_file, EscriptExe}] = safe_lookup_spec("escript", BinFiles), + EscriptExt = ".escript", + Base = filename:basename(File, EscriptExt), + ExeExt = filename:extension(EscriptExe), + [{copy_file, Base ++ EscriptExt, File}, + {copy_file, Base ++ ExeExt, filename:join([ErtsBin, EscriptExe])}]. + +check_sys(Mandatory, SysFiles) -> + lists:foreach(fun(M) -> do_check_sys(M, SysFiles) end, Mandatory). - ScriptIoList = io_lib:format("%% script generated at ~w ~w\n~p.\n\n", - [Date, Time, Script]), - ScriptFile = Base ++ ".script", - ScriptRes = file:write_file(ScriptFile, ScriptIoList), +do_check_sys(Prefix, Specs) -> + %%io:format("Prefix: ~p\n", [Prefix]), + case lookup_spec(Prefix, Specs) of + [] -> + reltool_utils:throw_error("Mandatory system directory ~s is not included", + [Prefix]); + _ -> + ok + end. - BootFile = Base ++ ".boot", - BootRes = file:write_file(BootFile, BootBin), - case lists:keysearch(error, 1, [RelRes, ScriptRes, BootRes]) of - false -> - ok; - {value, {_, Reason}} -> - file:delete(RelFile), - file:delete(ScriptFile), - file:delete(BootFile), - throw_error("~s: ~s\n", [RelFile, file:format_error(Reason)]) +spec_start_file(#sys{boot_rel = BootRelName, + rels = Rels, + apps = Apps}) -> + {value, Erts} = lists:keysearch(erts, #app.name, Apps), + {value, BootRel} = lists:keysearch(BootRelName, #rel.name, Rels), + Data = Erts#app.vsn ++ " " ++ BootRel#rel.vsn ++ "\n", + {BootRel#rel.vsn, {write_file, "start_erl.data", Data}}. + +lookup_spec(Prefix, Specs) -> + lists:filter(fun(S) -> lists:prefix(Prefix, element(2, S)) end, Specs). + +safe_lookup_spec(Prefix, Specs) -> + case lookup_spec(Prefix, Specs) of + [] -> + reltool_utils:throw_error("Mandatory system file ~s is not included", [Prefix]); + Match -> + Match end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Specify applications %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -copy_apps(#sys{apps = Apps} = Sys, TargetDir) -> - Filter = fun(#app{is_included = IsIncl, is_pre_included = IsPre, name = Name}) -> - if - IsIncl; IsPre -> - Name =/= erts andalso Name =/= ?MISSING_APP; - true -> - false - end - end, - case lists:filter(Filter, Apps) of - [] -> - throw_error("No applications are included", []); - IncludedApps -> - LibDir = filename:join([TargetDir, "lib"]), - create_dir(LibDir), - lists:foreach(fun(App) -> copy_app(App, Sys, LibDir) end, IncludedApps), - copy_erts(Sys, LibDir, TargetDir) - end. +spec_lib_files(#sys{apps = Apps} = Sys) -> + Filter = fun(#app{is_escript = IsEscript, is_included = IsIncl, + is_pre_included = IsPre, name = Name}) -> + if + Name =:= ?MISSING_APP -> + false; + IsEscript -> + false; + IsIncl; IsPre -> + true; + true -> + false + end + end, + SelectedApps = lists:filter(Filter, Apps), + check_apps([kernel, stdlib], SelectedApps), + lists:flatten([spec_app(App, Sys) || App <- SelectedApps]). -copy_erts(#sys{apps = Apps, root_dir = SourceDir} = Sys, LibDir, TargetDir) -> - %% Try to copy preloaded modules - {value, Erts} = lists:keysearch(erts, #app.name, Apps), - PreloadedDir = Erts#app.active_dir, - case filename:basename(PreloadedDir) of - "preloaded" -> - Base = filename:dirname(PreloadedDir); - Base -> - ignore - end, - case filelib:is_dir(PreloadedDir, erl_prim_loader) of - true -> - %% Maybe copy preloaded modules for tools to play with - do_copy_app(Erts, Sys, filename:join([LibDir, Erts#app.label])); +check_apps([Mandatory | Names], Apps) -> + case lists:keymember(Mandatory, #app.name, Apps) of false -> - %% No preloaded modules to copy. Do not care as they are optional. - ignore - end, - - %% Copy main erts directory - ErtsSource = filename:join([SourceDir, Base]), - ErtsTarget = filename:join([TargetDir, Erts#app.label]), - create_dir(ErtsTarget), - {ok, SubDirs} = file:list_dir(ErtsSource), - Copy = fun(Dir) -> - copy_file(filename:join([ErtsSource, Dir]), - filename:join([ErtsTarget, Dir])) - end, - lists:foreach(Copy, strip_dirs(SubDirs, Sys#sys.incl_erts_dirs, Sys#sys.excl_erts_dirs)), - - ErtsSourceBinDir = filename:join([ErtsSource, "bin"]), - ErtsTargetBinDir = filename:join([ErtsTarget, "bin"]), - case filelib:is_dir(ErtsSourceBinDir, erl_prim_loader) of + reltool_utils:throw_error("Mandatory application ~p is not included in ~p", + [Mandatory, Apps]); true -> - ok; - false -> - %% ClearCase special - Arch = erlang:system_info(system_architecture), - ClearCaseBinDir = filename:join([SourceDir, "bin", Arch]), - copy_file(ClearCaseBinDir, ErtsTargetBinDir) - end, - - %% Remove scripts - file:delete(filename:join([ErtsTargetBinDir, "erl"])), - file:delete(filename:join([ErtsTargetBinDir, "start"])), - - %% Remove superfluous preloaded - recursive_delete(filename:join([ErtsTarget, "preloaded"])), - ErtsTarget. - -copy_app(#app{label = Label} = App, Sys, LibDir) -> - do_copy_app(App, Sys, filename:join([LibDir, Label])). - -do_copy_app(#app{active_dir = SourceDir, - incl_app_dirs = AppInclDirs, - excl_app_dirs = AppExclDirs} = App, - #sys{incl_app_dirs = SysInclDirs, - excl_app_dirs = SysExclDirs} = Sys, - TargetDir) -> - create_dir(TargetDir), - {ok, SubDirs} = file:list_dir(SourceDir), - InclDirs = default_val(AppInclDirs, SysInclDirs), - ExclDirs = default_val(AppExclDirs, SysExclDirs), - Copy = fun(Dir) -> copy_app_dir(Dir, SourceDir, TargetDir, App, Sys) end, - lists:foreach(Copy, strip_dirs(SubDirs, InclDirs, ExclDirs)). - -copy_app_dir("ebin" = Dir, SourceDir, TargetDir, App, Sys) -> - EbinSource = filename:join([SourceDir, Dir]), - EbinTarget = filename:join([TargetDir, Dir]), - create_dir(EbinTarget), - copy_app_file(EbinSource, EbinTarget, App, Sys), - DebugInfo = default_val(App#app.debug_info, Sys#sys.debug_info), - [copy_mod(M, EbinSource, EbinTarget, DebugInfo) || - M <- App#app.mods, M#mod.is_included, M#mod.exists], - ok; -copy_app_dir(Dir, SourceDir, TargetDir, _App, _Sys) -> - copy_file(filename:join([SourceDir, Dir]), - filename:join([TargetDir, Dir])). - -copy_app_file(SourceDir, TargetDir, App, Sys) -> - Base = atom_to_list(App#app.name) ++ ".app", - AppSource = filename:join([SourceDir, Base]), - AppTarget = filename:join([TargetDir, Base]), - Info = App#app.info, - Mods = App#app.mods, - AppMods = Info#app_info.modules, - case default_val(App#app.app_file, Sys#sys.app_file) of + check_apps(Names, Apps) + end; +check_apps([], _) -> + ok. + +spec_app(#app{name = Name, + mods = Mods, + active_dir = SourceDir, + incl_app_filters = AppInclRegexps, + excl_app_filters = AppExclRegexps} = App, + #sys{incl_app_filters = SysInclRegexps, + excl_app_filters = SysExclRegexps, + debug_info = SysDebugInfo} = Sys) -> + %% List files recursively + {create_dir, _, AppFiles} = spec_dir(SourceDir), + + %% Replace ebin + AppUpFilename = atom_to_list(Name) ++ ".appup", + EbinDir = filename:join([SourceDir, "ebin"]), + OptAppUpFileSpec = spec_opt_copy_file(EbinDir, AppUpFilename), + OptAppFileSpec = spec_app_file(App, Sys, EbinDir), + ModSpecs = [spec_mod(M, SysDebugInfo) || M <- Mods, M#mod.is_included, M#mod.exists], + NewEbin = {create_dir, "ebin", OptAppUpFileSpec ++ OptAppFileSpec ++ ModSpecs}, + AppFiles2 = lists:keystore("ebin", 2, AppFiles, NewEbin), + + %% Apply file filter + InclRegexps = reltool_utils:default_val(AppInclRegexps, SysInclRegexps), + ExclRegexps = reltool_utils:default_val(AppExclRegexps, SysExclRegexps), + AppFiles3 = filter_spec(AppFiles2, InclRegexps, ExclRegexps), + + %% Regular top directory and/or archive + spec_archive(App, Sys, AppFiles3). + +spec_archive(#app{label = Label, + active_dir = SourceDir, + incl_archive_filters = AppInclArchiveDirs, + excl_archive_filters = AppExclArchiveDirs, + archive_opts = AppArchiveOpts}, + #sys{root_dir = RootDir, + incl_archive_filters = SysInclArchiveDirs, + excl_archive_filters = SysExclArchiveDirs, + archive_opts = SysArchiveOpts}, + Files) -> + InclArchiveDirs = reltool_utils:default_val(AppInclArchiveDirs, SysInclArchiveDirs), + ExclArchiveDirs = reltool_utils:default_val(AppExclArchiveDirs, SysExclArchiveDirs), + ArchiveOpts = reltool_utils:default_val(AppArchiveOpts, SysArchiveOpts), + Match = fun(F) -> match(element(2, F), InclArchiveDirs, ExclArchiveDirs) end, + case lists:filter(Match, Files) of + [] -> + %% Nothing to archive + [spec_create_dir(RootDir, SourceDir, Label, Files)]; + ArchiveFiles -> + OptDir = + case Files -- ArchiveFiles of + [] -> + []; + ExternalFiles -> + [spec_create_dir(RootDir, SourceDir, Label, ExternalFiles)] + end, + ArchiveOpts = reltool_utils:default_val(AppArchiveOpts, SysArchiveOpts), + ArchiveDir = spec_create_dir(RootDir, SourceDir, Label, ArchiveFiles), + [{archive, Label ++ ".ez", ArchiveOpts, [ArchiveDir]} | OptDir] + end. + +spec_dir(Dir) -> + Base = filename:basename(Dir), + case erl_prim_loader:read_file_info(Dir) of + {ok, #file_info{type = directory}} -> + case erl_prim_loader:list_dir(Dir) of + {ok, Files} -> + %% Directory + {create_dir, Base, [spec_dir(filename:join([Dir, F])) || F <- Files]}; + error -> + reltool_utils:throw_error("list dir ~s failed\n", [Dir]) + end; + {ok, #file_info{type = regular}} -> + %% Plain file + {copy_file, Base}; + _ -> + reltool_utils:throw_error("read file info ~s failed\n", [Dir]) + end. + +spec_mod(Mod, DebugInfo) -> + File = atom_to_list(Mod#mod.name) ++ code:objfile_extension(), + case reltool_utils:default_val(Mod#mod.debug_info, DebugInfo) of keep -> - _ = file:copy(AppSource, AppTarget); % Copy if it exists + {copy_file, File}; + strip -> + {strip_beam, File} + end. + +spec_app_file(#app{name = Name, + info = Info, + mods = Mods, + app_file = AppFile} = App, + #sys{app_file = SysAppFile}, + EbinDir) -> + AppFilename = atom_to_list(Name) ++ ".app", + case reltool_utils:default_val(AppFile, SysAppFile) of + keep -> + %% Copy if it exists + spec_opt_copy_file(EbinDir, AppFilename); strip -> %% Remove non-included modules %% Generate new file ModNames = [M#mod.name || M <- Mods, M#mod.is_included, - lists:member(M#mod.name, AppMods)], + lists:member(M#mod.name, + Info#app_info.modules)], App2 = App#app{info = Info#app_info{modules = ModNames}}, - gen_app_file(App2, AppTarget); + Contents = gen_app(App2), + AppIoList = io_lib:format("%% app generated at ~w ~w\n~p.\n\n", + [date(), time(), Contents]), + [{write_file, AppFilename, AppIoList}]; all -> %% Include all included modules %% Generate new file ModNames = [M#mod.name || M <- Mods, M#mod.is_included], App2 = App#app{info = Info#app_info{modules = ModNames}}, - gen_app_file(App2, AppTarget) + Contents = gen_app(App2), + AppIoList = io_lib:format("%% app generated at ~w ~w\n~p.\n\n", + [date(), time(), Contents]), + [{write_file, AppFilename, AppIoList}] + end. -gen_app_file(App, AppFile) -> - Content = gen_app(App), - AppIoList = io_lib:format("%% app generated at ~w ~w\n~p.\n\n", - [date(), time(), Content]), - ok = file:write_file(AppFile, AppIoList). - -copy_mod(Mod, SourceDir, TargetDir, DebugInfo) -> - Base = atom_to_list(Mod#mod.name) ++ code:objfile_extension(), - SourceFile = filename:join([SourceDir, Base]), - TargetFile = filename:join([TargetDir, Base]), - case default_val(Mod#mod.debug_info, DebugInfo) of - keep -> - {ok, _} = file:copy(SourceFile, TargetFile), - ok; - strip -> - {ok, BeamBin} = file:read_file(SourceFile), - {ok, {_, BeamBin2}} = beam_lib:strip(BeamBin), - ok = file:write_file(TargetFile, BeamBin2) +spec_opt_copy_file(DirName, BaseName) -> + case filelib:is_regular(filename:join([DirName, BaseName]), erl_prim_loader) of + true -> [{copy_file, BaseName}]; + false -> [] end. -strip_dirs(_SubDirs, _InclDirs, all) -> - []; -strip_dirs(SubDirs, all, ExclDirs) -> - SubDirs -- ExclDirs; -strip_dirs(SubDirs, InclDirs, ExclDirs) -> - [Dir || Dir <- SubDirs, - lists:member(Dir, InclDirs), - not lists:member(Dir, ExclDirs)]. +spec_create_dir(RootDir, SourceDir, BaseDir, Files) -> + LibDir = filename:join([RootDir, "lib"]), + case abs_to_rel_path(LibDir, SourceDir) of + {relative, Dir} -> {create_dir, Dir, Files}; + {absolute, Dir} -> {create_dir, BaseDir, Dir, Files} + end. + +abs_to_rel_path(RootDir, SourcePath) -> + R = filename:split(RootDir), + S = filename:split(SourcePath), + abs_to_rel_path(R, S, SourcePath). +abs_to_rel_path([H | R], [H | S], SourcePath) -> + abs_to_rel_path(R, S, SourcePath); +abs_to_rel_path([], S, _SourcePath) -> + {relative, filename:join(S)}; +abs_to_rel_path(_, _, SourcePath) -> + {absolute, SourcePath}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Evaluate specification %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -create_bin(Sys, ErtsDir, RelVsnDir, TargetDir) -> - SystemBinDir = filename:join([TargetDir, "bin"]), - create_dir(SystemBinDir), - ErtsBinDir = filename:join([ErtsDir, "bin"]), - BootFile = Sys#sys.boot_rel ++ ".boot", - {ok, Files} = file:list_dir(RelVsnDir), - [copy_file(filename:join([RelVsnDir, F]), - filename:join([SystemBinDir, F])) || F <- Files], - copy_file(filename:join([RelVsnDir, BootFile]), - filename:join([SystemBinDir, "start.boot"])), - copy_file(filename:join([ErtsBinDir, "epmd"]), - filename:join([SystemBinDir, "epmd"])), - copy_file(filename:join([ErtsBinDir, "run_erl"]), - filename:join([SystemBinDir, "run_erl"])), - copy_file(filename:join([ErtsBinDir, "to_erl"]), - filename:join([SystemBinDir, "to_erl"])), - %% [copy_file(RelVsnDir, F, SystemBinDir, F) || F <- Files], - %% copy_file(RelVsnDir, BootFile, SystemBinDir, "start.boot"), - %% [copy_file(ErtsBinDir, F, SystemBinDir, F) || F <- execs(Sys)], - %% [copy_file(F, filename:join([SystemBinDir, filename:basename(F)])) || F <- escripts(Sys)], - ok. +eval_spec(Spec, SourceDir, TargetDir) -> + SourceDir2 = filename:absname(SourceDir), + TargetDir2 = filename:absname(TargetDir), + try + case filelib:is_dir(TargetDir2) of + true -> + do_eval_spec(Spec, SourceDir2, SourceDir2, TargetDir2), + ok; + false -> + {error, TargetDir2 ++ ": " ++ file:format_error(enoent)} + end + catch + throw:{error, Text} -> + cleanup_spec(Spec, TargetDir2), + {error, Text} + end. -%% execs(Sys) -> -%% Execs = -%% case Sys#sys.profile of -%% standalone -> []; -%% development -> ["dialyzer", "erl", "erlc", "escript", "typer"]; -%% embedded -> ["erl", "escript"] -%% end, -%% case os:type() of -%% {win32, _} -> [Exec ++ ".exe" || Exec <- Execs]; -%% _ -> Execs -%% end. -%% -%% escripts(Sys) -> -%% case Sys#sys.profile of -%% standalone -> Sys#sys.escripts; -%% development -> []; -%% embedded -> [] -%% end. +do_eval_spec(List, OrigSourceDir, SourceDir, TargetDir) when is_list(List) -> + lists:foreach(fun(F) -> do_eval_spec(F, OrigSourceDir, SourceDir, TargetDir) end, List); +%% do_eval_spec({source_dir, SourceDir2, Spec}, OrigSourceDir, _SourceDir, TargetDir) -> +%% %% Source dir is absolute or relative the original source dir +%% SourceDir3 = filename:join([OrigSourceDir, SourceDir2]), +%% do_eval_spec(Spec, OrigSourceDir, SourceDir3, TargetDir); +do_eval_spec({create_dir, Dir, Files}, OrigSourceDir, SourceDir, TargetDir) -> + SourceDir2 = filename:join([SourceDir, Dir]), + TargetDir2 = filename:join([TargetDir, Dir]), + reltool_utils:create_dir(TargetDir2), + do_eval_spec(Files, OrigSourceDir, SourceDir2, TargetDir2); +do_eval_spec({create_dir, NewDir, OldDir, Files}, OrigSourceDir, _SourceDir, TargetDir) -> + SourceDir2 = filename:join([OrigSourceDir, OldDir]), + TargetDir2 = filename:join([TargetDir, NewDir]), + reltool_utils:create_dir(TargetDir2), + do_eval_spec(Files, SourceDir2, SourceDir2, TargetDir2); +do_eval_spec({archive, Archive, Options, Files}, OrigSourceDir, SourceDir, TargetDir) -> + TmpSpec = {create_dir, "tmp", Files}, + TmpDir = filename:join([TargetDir, "tmp"]), + reltool_utils:create_dir(TmpDir), + do_eval_spec(Files, OrigSourceDir, SourceDir, TmpDir), + + ArchiveFile = filename:join([TargetDir, Archive]), + Files2 = [element(2, F) || F <- Files], + Res = zip:create(ArchiveFile, Files2, [{cwd, TmpDir} | Options]), + + cleanup_spec(TmpSpec, TargetDir), + case Res of + {ok, _} -> + ok; + {error, Reason} -> + reltool_utils:throw_error("create archive ~s: ~p\n", [ArchiveFile, Reason]) + end; +do_eval_spec({copy_file, File}, _OrigSourceDir, SourceDir, TargetDir) -> + SourceFile = filename:join([SourceDir, File]), + TargetFile = filename:join([TargetDir, File]), + reltool_utils:copy_file(SourceFile, TargetFile); +do_eval_spec({copy_file, NewFile, OldFile}, OrigSourceDir, _SourceDir, TargetDir) -> + SourceFile = filename:join([OrigSourceDir, OldFile]), + TargetFile = filename:join([TargetDir, NewFile]), + reltool_utils:copy_file(SourceFile, TargetFile); +do_eval_spec({write_file, File, IoList}, _OrigSourceDir, _SourceDir, TargetDir) -> + TargetFile = filename:join([TargetDir, File]), + reltool_utils:write_file(TargetFile, IoList); +do_eval_spec({strip_beam, File}, _OrigSourceDir, SourceDir, TargetDir) -> + SourceFile = filename:join([SourceDir, File]), + TargetFile = filename:join([TargetDir, File]), + BeamBin = reltool_utils:read_file(SourceFile), + {ok, {_, BeamBin2}} = beam_lib:strip(BeamBin), + reltool_utils:write_file(TargetFile, BeamBin2). + +cleanup_spec(List, TargetDir) when is_list(List) -> + lists:foreach(fun(F)-> cleanup_spec(F, TargetDir) end, List); +%% cleanup_spec({source_dir, _SourceDir, Spec}, TargetDir) -> +%% cleanup_spec(Spec, TargetDir); +cleanup_spec({create_dir, Dir, Files}, TargetDir) -> + TargetDir2 = filename:join([TargetDir, Dir]), + cleanup_spec(Files, TargetDir2), + file:del_dir(TargetDir2); +cleanup_spec({create_dir, NewDir, _OldDir, Files}, TargetDir) -> + TargetDir2 = filename:join([TargetDir, NewDir]), + cleanup_spec(Files, TargetDir2), + file:del_dir(TargetDir2); +cleanup_spec({archive, Archive, _Options, Files}, TargetDir) -> + TargetFile = filename:join([TargetDir, Archive]), + file:delete(TargetFile), + TmpDir = filename:join([TargetDir, "tmp"]), + cleanup_spec(Files, TmpDir), + file:del_dir(TmpDir); +cleanup_spec({copy_file, File}, TargetDir) -> + TargetFile = filename:join([TargetDir, File]), + file:delete(TargetFile); +cleanup_spec({copy_file, NewFile, _OldFile}, TargetDir) -> + TargetFile = filename:join([TargetDir, NewFile]), + file:delete(TargetFile); +cleanup_spec({write_file, File, _IoList}, TargetDir) -> + TargetFile = filename:join([TargetDir, File]), + file:delete(TargetFile); +cleanup_spec({strip_beam, File}, TargetDir) -> + TargetFile = filename:join([TargetDir, File]), + file:delete(TargetFile). + +filter_spec(List, InclRegexps, ExclRegexps) -> + do_filter_spec("", List, InclRegexps, ExclRegexps). + +do_filter_spec(Path, List, InclRegexps, ExclRegexps) when is_list(List) -> + lists:zf(fun(File) -> do_filter_spec(Path, File, InclRegexps, ExclRegexps) end, List); +%% do_filter_spec(Path, {source_dir, _SourceDir, Spec}, InclRegexps, ExclRegexps) -> +%% do_filter_spec(Path, Spec, InclRegexps, ExclRegexps); +do_filter_spec(Path, {create_dir, Dir, Files}, InclRegexps, ExclRegexps) -> + Path2 = opt_join(Path, Dir), + case do_filter_spec(Path2, Files, InclRegexps, ExclRegexps) of + [] -> + case match(Path2, InclRegexps, ExclRegexps) of + true -> + {true, {create_dir, Dir, []}}; + false -> + false + end; + Files2 when is_list(Files2) -> + {true, {create_dir, Dir, Files2}} + end; +do_filter_spec(Path, {create_dir, NewDir, OldDir, Files}, InclRegexps, ExclRegexps) -> + Path2 = opt_join(Path, NewDir), + case do_filter_spec(Path2, Files, InclRegexps, ExclRegexps) of + [] -> + case match(Path2, InclRegexps, ExclRegexps) of + true -> + {true, {create_dir, NewDir, OldDir, []}}; + false -> + false + end; + Files2 when is_list(Files2) -> + {true, {create_dir, NewDir, OldDir, Files2}} + end; +do_filter_spec(Path, {archive, Archive, Options, Files}, InclRegexps, ExclRegexps) -> + case do_filter_spec(Path, Files, InclRegexps, ExclRegexps) of + [] -> + case match(Path, InclRegexps, ExclRegexps) of + true -> + {true, {archive, Archive, Options, []}}; + false -> + false + end; + Files2 when is_list(Files2) -> + {true, {archive, Archive, Options, Files2}} + end; +do_filter_spec(Path, {copy_file, File}, InclRegexps, ExclRegexps) -> + Path2 = opt_join(Path, File), + match(Path2, InclRegexps, ExclRegexps); +do_filter_spec(Path, {copy_file, NewFile, _OldFile}, InclRegexps, ExclRegexps) -> + Path2 = opt_join(Path, NewFile), + match(Path2, InclRegexps, ExclRegexps); +do_filter_spec(Path, {write_file, File, _IoList}, InclRegexps, ExclRegexps) -> + Path2 = opt_join(Path, File), + match(Path2, InclRegexps, ExclRegexps); +do_filter_spec(Path, {strip_beam, File}, InclRegexps, ExclRegexps) -> + Path2 = opt_join(Path, File), + match(Path2, InclRegexps, ExclRegexps). + +opt_join([], File) -> + File; +opt_join(Path, File) -> + filename:join([Path, File]). + +match(String, InclRegexps, ExclRegexps) -> + %%case + match(String, InclRegexps) andalso not match(String, ExclRegexps). +%% of +%% true -> +%% true; +%% false -> +%% io:format("no match: ~p\n" +%% " incl: ~p\n" +%% " excl: ~p\n", +%% [String, InclRegexps, ExclRegexps]), +%% false +%% end. + +%% Match at least one regexp +match(_String, []) -> + false; +match(String, [#regexp{source = _, compiled = MP} | Regexps]) -> + %% io:format("Regexp: ~p ~p\n", [String, Regexp]), + case re:run(String, MP, [{capture, none}]) of + nomatch -> match(String, Regexps); + match -> true + end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -791,24 +1138,32 @@ TargetDir2 = filename:absname(TargetDir), RelDir = filename:join([TargetDir2, "releases"]), DataFile = filename:join([RelDir, "start_erl.data"]), - case file:read_file(DataFile) of - {ok, Bin} -> - case string:tokens(binary_to_list(Bin), " \n") of - [ErlVsn, RelVsn | _] -> - ErtsBinDir = filename:join([TargetDir2, "erts-" ++ ErlVsn, "bin"]), - BinDir = filename:join([TargetDir2, "bin"]), - subst_src_scripts(start_scripts(), ErtsBinDir, BinDir, - [{"FINAL_ROOTDIR", TargetDir2}, {"EMU", "beam"}], - [preserve]), - RelFile = filename:join([RelDir, RelVsn, RelName ++ ".rel"]), - ok = release_handler:create_RELEASES(TargetDir2, RelFile), - ok; - _ -> - throw_error("~s: Illegal syntax.\n", [DataFile]) - end; - {error,Reason} -> - Text = file:format_error(Reason), - throw_error("~s: ~s\n", [DataFile, Text]) + Bin = reltool_utils:read_file(DataFile), + case string:tokens(binary_to_list(Bin), " \n") of + [ErlVsn, RelVsn | _] -> + ErtsBinDir = filename:join([TargetDir2, "erts-" ++ ErlVsn, "bin"]), + BinDir = filename:join([TargetDir2, "bin"]), + case os:type() of + {win32, _} -> + NativeRootDir = filename:nativename(TargetDir2), + %% NativeBinDir = filename:nativename(filename:join([BinDir, "win32"])), + NativeBinDir = filename:nativename(BinDir), + IniData = ["[erlang]\r\n", + "Bindir=", NativeBinDir, "\r\n", + "Progname=erl\r\n", + "Rootdir=", NativeRootDir, "\r\n"], + IniFile = filename:join([BinDir, "erl.ini"]), + ok = file:write_file(IniFile, IniData); + _ -> + subst_src_scripts(start_scripts(), ErtsBinDir, BinDir, + [{"FINAL_ROOTDIR", TargetDir2}, {"EMU", "beam"}], + [preserve]) + end, + RelFile = filename:join([RelDir, RelVsn, RelName ++ ".rel"]), + ok = release_handler:create_RELEASES(TargetDir2, RelFile), + ok; + _ -> + reltool_utils:throw_error("~s: Illegal syntax.\n", [DataFile]) end. subst_src_scripts(Scripts, SrcDir, DestDir, Vars, Opts) -> @@ -822,25 +1177,15 @@ Opts). subst_file(Src, Dest, Vars, Opts) -> - case file:read_file(Src) of - {ok, Bin} -> - Chars = subst(binary_to_list(Bin), Vars), - case file:write_file(Dest, Chars) of - ok -> - case lists:member(preserve, Opts) of - true -> - {ok, FileInfo} = file:read_file_info(Src), - ok = file:write_file_info(Dest, FileInfo); - false -> - ok - end; - {error, Reason} -> - Text = file:format_error(Reason), - throw_error("~s: ~s\n", [Src, Text]) - end; - {error, Reason} -> - Text = file:format_error(Reason), - throw_error("~s: ~s\n", [Src, Text]) + Bin = reltool_utils:read_file(Src), + Chars = subst(binary_to_list(Bin), Vars), + reltool_utils:write_file(Dest, Chars), + case lists:member(preserve, Opts) of + true -> + FileInfo = reltool_utils:read_file_info(Src), + reltool_utils:write_file_info(Dest, FileInfo); + false -> + ok end. %% subst(Str, Vars) @@ -879,90 +1224,3 @@ start_scripts() -> ["erl", "start", "start_erl"]. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -create_dir(Dir) -> - filelib:ensure_dir(Dir), - case file:make_dir(Dir) of - ok -> - ok; - {error, eexist} -> - ok; - {error, Reason} -> - Text = file:format_error(Reason), - throw_error("~s: ~s\n", [Dir, Text]) - end. - -recursive_delete(Dir) -> - case file:list_dir(Dir) of - {ok, Files} -> - Fun = fun(F) -> recursive_delete(filename:join([Dir, F])) end, - lists:foreach(Fun, Files), - delete(Dir, directory); - {error, enoent} -> - ok; - {error, enotdir} -> - %% Plain file - delete(Dir, regular); - {error, Reason} -> - Text = file:format_error(Reason), - throw_error("~s: ~s\n", [Dir, Text]) - end. - -delete(File, Type) -> - case do_delete(File, Type) of - ok -> - ok; - {error, enoent} -> - ok; - {error, Reason} -> - Text = file:format_error(Reason), - throw_error("~s: ~s\n", [File, Text]) - end. - -do_delete(File, regular) -> - file:delete(File); -do_delete(Dir, directory) -> - file:del_dir(Dir). - -%% copy_file(FromDir, FromBase, ToDir, ToBase) -> -%% copy_file(filename:join([FromDir, FromBase]), -%% filename:join([ToDir, ToBase])). - -copy_file(From, To) -> - case file:list_dir(From) of - {ok, Files} -> - create_dir(To), - Copy = - fun(F) -> - copy_file(filename:join([From, F]), - filename:join([To, F])) - end, - lists:foreach(Copy, Files); - {error, enotdir} -> - %% Plain file - case file:copy(From, To) of - {ok, _} -> - {ok, FromInfo} = file:read_file_info(From), - {ok, ToInfo} = file:read_file_info(To), - FromMode = FromInfo#file_info.mode, - ToMode = ToInfo#file_info.mode, - ToMode2 = FromMode bor ToMode, - FileInfo = FromInfo#file_info{mode = ToMode2}, - ok = file:write_file_info(To, FileInfo), - ok; - {error, Reason} -> - Text = file:format_error(Reason), - throw_error("~s -> ~s: ~s\n", [From, To, Text]) - end; - {error, Reason} -> - Text = file:format_error(Reason), - throw_error("~s -> ~s: ~s\n", [From, To, Text]) - end. - -default_val(Val, Default) -> - case Val of - undefined -> Default; - _ -> Val - end. diff -Nru erlang-13.b.1-dfsg/lib/reltool/src/reltool_utils.erl erlang-13.b.3-dfsg/lib/reltool/src/reltool_utils.erl --- erlang-13.b.1-dfsg/lib/reltool/src/reltool_utils.erl 2009-03-12 12:26:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/reltool/src/reltool_utils.erl 2009-09-18 15:11:14.000000000 +0100 @@ -21,6 +21,7 @@ %% Public -compile([export_all]). +-include_lib("kernel/include/file.hrl"). -include_lib("wx/include/wx.hrl"). -include("reltool.hrl"). @@ -363,3 +364,192 @@ {error, Error} -> {error, Error} end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +create_dir(Dir) -> + filelib:ensure_dir(Dir), + case file:make_dir(Dir) of + ok -> + ok; + {error, eexist} -> + ok; + {error, Reason} -> + Text = file:format_error(Reason), + throw_error("create dir ~s: ~s\n", [Dir, Text]) + end. + +list_dir(Dir) -> + case erl_prim_loader:list_dir(Dir) of + {ok, Files} -> + Files; + error -> + Text = file:format_error(enoent), + throw_error("list dir ~s: ~s\n", [Dir, Text]) + end. + +read_file_info(File) -> + case file:read_file_info(File) of + {ok, Info} -> + Info; + {error, Reason} -> + Text = file:format_error(Reason), + throw_error("read file info ~s: ~s\n", [File, Text]) + end. + +write_file_info(File, Info) -> + case file:write_file_info(File, Info) of + ok -> + ok; + {error, Reason} -> + Text = file:format_error(Reason), + throw_error("write file info ~s: ~s\n", [File, Text]) + end. + +read_file(File) -> + case file:read_file(File) of + {ok, Bin} -> + Bin; + {error, Reason} -> + Text = file:format_error(Reason), + throw_error("read file ~s: ~s\n", [File, Text]) + end. + +write_file(File, IoList) -> + case file:write_file(File, IoList) of + ok -> + ok; + {error, Reason} -> + Text = file:format_error(Reason), + throw_error("write file ~s: ~s\n", [File, Text]) + end. + +recursive_delete(Dir) -> + case filelib:is_dir(Dir) of + true -> + case file:list_dir(Dir) of + {ok, Files} -> + Fun = fun(F) -> recursive_delete(filename:join([Dir, F])) end, + lists:foreach(Fun, Files), + delete(Dir, directory); + {error, enoent} -> + ok; + {error, Reason} -> + Text = file:format_error(Reason), + throw_error("delete file ~s: ~s\n", [Dir, Text]) + end; + false -> + delete(Dir, regular) + end. + +delete(File, Type) -> + case do_delete(File, Type) of + ok -> + ok; + {error, enoent} -> + ok; + {error, Reason} -> + Text = file:format_error(Reason), + throw_error("delete file ~s: ~s\n", [File, Text]) + end. + +do_delete(File, regular) -> + file:delete(File); +do_delete(Dir, directory) -> + file:del_dir(Dir). + +recursive_copy_file(From, To) -> + case erl_prim_loader:list_dir(From) of + {ok, Files} -> + %% Copy all files in the directory + create_dir(To), + Copy = + fun(F) -> + recursive_copy_file(filename:join([From, F]), + filename:join([To, F])) + end, + lists:foreach(Copy, Files); + error -> + %% Copy single file + copy_file(From, To) + end. + +copy_file(From, To) -> + case erl_prim_loader:get_file(From) of + {ok, Bin, _} -> + case file:write_file(To, Bin) of + ok -> + FromInfo = read_file_info(From), + ToInfo = read_file_info(To), + FromMode = FromInfo#file_info.mode, + ToMode = ToInfo#file_info.mode, + ToMode2 = FromMode bor ToMode, + FileInfo = FromInfo#file_info{mode = ToMode2}, + write_file_info(To, FileInfo), + ok; + {error, Reason} -> + Text = file:format_error(Reason), + throw_error("copy file ~s -> ~s: ~s\n", [From, To, Text]) + end; + error -> + Text = file:format_error(enoent), + throw_error("copy file ~s -> ~s: ~s\n", [From, To, Text]) + end. + +throw_error(Format, Args) -> + throw({error, lists:flatten(io_lib:format(Format, Args))}). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +decode_regexps(Key, {add, Regexps}, Old) when is_list(Regexps) -> + do_decode_regexps(Key, Regexps, Old); +decode_regexps(_Key, {del, Regexps}, Old) when is_list(Regexps) -> + [Re || Re <- Old, not lists:member(Re#regexp.source, Regexps)]; +decode_regexps(Key, Regexps, _Old) when is_list(Regexps) -> + do_decode_regexps(Key, Regexps, []); +decode_regexps(Key, Regexps, _Old) when is_list(Regexps) -> + Text = lists:flatten(io_lib:format("~p", [{Key, Regexps}])), + throw({error, "Illegal option: " ++ Text}). + +do_decode_regexps(Key, [Regexp | Regexps], Acc) -> + case catch re:compile(Regexp, []) of + {ok, MP} -> + do_decode_regexps(Key, Regexps, [#regexp{source = Regexp, compiled = MP} | Acc]); + _ -> + Text = lists:flatten(io_lib:format("~p", [{Key, Regexp}])), + throw({error, "Illegal option: " ++ Text}) + end; +do_decode_regexps(_Key, [], Acc) -> + lists:sort(Acc). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +default_val(Val, Default) -> + case Val of + undefined -> Default; + _ -> Val + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +call(Name, Msg) when is_atom(Name) -> + call(whereis(Name), Msg); +call(Pid, Msg) when is_pid(Pid) -> + Ref = erlang:monitor(process, Pid), + Pid ! {call, self(), Ref, Msg}, + receive + {Ref, Reply} -> + Reply; + {'EXIT', Pid, Reason} -> + erlang:demonitor(Ref, [flush]), + {error, Reason}; + {'DOWN', Ref, _, _, Reason} -> + {error, Reason} + end. + +cast(Pid, Msg) -> + Pid ! {cast, self(), Msg}, + ok. + +reply(Pid, Ref, Msg) -> + Pid ! {Ref, Msg}. diff -Nru erlang-13.b.1-dfsg/lib/reltool/vsn.mk erlang-13.b.3-dfsg/lib/reltool/vsn.mk --- erlang-13.b.1-dfsg/lib/reltool/vsn.mk 2009-06-05 13:54:35.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/reltool/vsn.mk 2009-11-20 13:34:42.000000000 +0000 @@ -16,9 +16,11 @@ # # %CopyrightEnd% -RELTOOL_VSN = 0.2.2 +RELTOOL_VSN = 0.5.2 -TICKETS = OTP-7999 -TICKETS_2.2.1 = OTP-7840 -TICKETS = OTP-7840 -TICKETS_0.2 = OTP-7805 +TICKETS = OTP-8254 +TICKETS_0_5_1 = OTP-8199 +TICKETS_0_5 = OTP-7949 +TICKETS_0_2_2 = OTP-7999 +TICKETS_2_2_1 = OTP-7840 +TICKETS_0_2 = OTP-7805 diff -Nru erlang-13.b.1-dfsg/lib/runtime_tools/c_src/Makefile.in erlang-13.b.3-dfsg/lib/runtime_tools/c_src/Makefile.in --- erlang-13.b.1-dfsg/lib/runtime_tools/c_src/Makefile.in 2009-03-12 12:24:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/runtime_tools/c_src/Makefile.in 2009-09-18 15:10:39.000000000 +0100 @@ -35,7 +35,7 @@ LD = @DED_LD@ SHELL = /bin/sh LIBS = @LIBS@ -LDFLAGS = @DED_LDFLAGS@ +LDFLAGS += @DED_LDFLAGS@ ERLANG_OSTYPE = @ERLANG_OSTYPE@ SYSINCLUDE = -I$(ERL_TOP)/erts/emulator/beam \ diff -Nru erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/book.xml erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/book.xml 2007-11-26 19:03:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/book.xml 2009-11-20 13:34:05.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1999 - 2007 - Ericsson AB, All Rights Reserved + 19992009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Runtime_Tools @@ -37,8 +35,11 @@ - + + + + diff -Nru erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/dbg.xml erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/dbg.xml --- erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/dbg.xml 2009-03-12 12:23:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/dbg.xml 2009-11-20 13:33:44.000000000 +0000 @@ -360,7 +360,7 @@ (x@y)4> dbg:tp({dbg,ltp,0},[{[],[],[{message, two, arguments}, {noexist}]}]). {error, [{error,"Special form 'message' called with wrong number of -\011 arguments in {message,two,arguments}."}, + arguments in {message,two,arguments}."}, {error,"Function noexist/1 does_not_exist."}]} @@ -864,8 +864,8 @@ flush

    This function is used to flush the internal buffers - held by a\011trace port driver. Currently only the - file trace driver\011supports this operation. + held by a trace port driver. Currently only the + file trace driver supports this operation. Returns ok.

    get_listen_port diff -Nru erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/erts_alloc_config.xml erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/erts_alloc_config.xml --- erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/erts_alloc_config.xml 2009-03-12 12:25:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/erts_alloc_config.xml 2009-11-20 13:34:28.000000000 +0000 @@ -45,7 +45,7 @@ produce is intended as a suggestion, and may need to be adjusted manually.

    The configuration is created based on information about a number - of runtime scenarios. It is obviously impossible to forsee every + of runtime scenarios. It is obviously impossible to foresee every runtime scenario that can occur. The important scenarios are those that cause maximum or minimum load on specific memory allocators. Load in this context is total size of memory blocks diff -Nru erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/Makefile erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/Makefile 2007-11-26 19:03:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/Makefile 2009-11-20 13:34:04.000000000 +0000 @@ -1,19 +1,20 @@ -# ``The contents of this file are subject to the Erlang Public License, +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1999-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in # compliance with the License. You should have received a copy of the # Erlang Public License along with this software. If not, it can be -# retrieved via the world wide web at http://www.erlang.org/. +# retrieved online at http://www.erlang.org/. # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # -# The Initial Developer of the Original Code is Ericsson Utvecklings AB. -# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings -# AB. All Rights Reserved.'' -# -# $Id$ +# %CopyrightEnd% # include $(ERL_TOP)/make/target.mk @@ -28,16 +29,17 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(RUNTIME_TOOLS_VSN) +APPLICATION=runtime_tools # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/runtime_tools-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- -XML_APPLICATION_FILES = refman.xml +XML_APPLICATION_FILES = ref_man.xml XML_REF3_FILES = dbg.xml erts_alloc_config.xml XML_REF6_FILES = runtime_tools_app.xml @@ -46,10 +48,12 @@ BOOK_FILES = book.xml -GIF_FILES = \ - note.gif \ - warning.gif +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) \ + $(XML_REF6_FILES) $(XML_APPLICATION_FILES) +GIF_FILES = # ---------------------------------------------------- @@ -57,32 +61,13 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PDF_FILE = runtime_tools-$(VSN).pdf -TOP_PS_FILE = runtime_tools-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -93,24 +78,16 @@ # ---------------------------------------------------- # Targets # ---------------------------------------------------- -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif - $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -pdf: $(TOP_PDF_FILE) +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) $(MAN6_FILES) @@ -118,44 +95,29 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) $(MAN6_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(MAN6DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6 -endif -endif release_spec: -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep - diff -Nru erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/notes.xml erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/notes.xml 2009-03-12 15:27:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/notes.xml 2009-11-20 13:34:18.000000000 +0000 @@ -26,10 +26,45 @@ + notes.xml

    This document describes the changes made to the Runtime_Tools application.

    +
    Runtime_Tools 1.8.2 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    + +
    Runtime_Tools 1.8.1 + +
    Fixed Bugs and Malfunctions + + +

    + Makefile.in has been updated to use the LDFLAGS + environment variable (if set). (Thanks to Davide + Pesavento.)

    +

    + Own Id: OTP-8157

    +
    +
    +
    + +
    +
    Runtime_Tools 1.8
    Improvements and New Features @@ -354,11 +389,11 @@

    This ticket includes several improvements and bugfixes to both runtime_tools and inviso. The overload mechanism can - now also react to incomming messages. This is useful if + now also react to incoming messages. This is useful if an external overload watch-dog is used. Some improvements of variable bindings has been done to the default autostart mechanism - inviso_autostart_server. Autostart - "jobs" can now be done in paralell, allowing for some + "jobs" can now be done in parallel, allowing for some jobs to hang waiting for some parts of the traced system to become ready before proceeding. Previously when using named meta-match-specs (tpm_ms) ending up with zero diff -Nru erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/part_notes.xml 2007-11-26 19:03:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/part_notes.xml 2009-11-20 13:34:21.000000000 +0000 @@ -1,26 +1,24 @@ - +

    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Runtime_Tools Release Notes @@ -35,6 +33,6 @@

    For information about older versions, see Release Notes History.

    - + diff -Nru erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/ref_man.xml 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/ref_man.xml 2009-11-20 13:34:05.000000000 +0000 @@ -0,0 +1,38 @@ + + + + +
    + + 19992009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Runtime_Tools Reference Manual + Patrik Nyblom + + 1999-05-27 + A +
    + +

    Runtime_Tools provides low footprint tracing/debugging + tools suitable for inclusion in a production system.

    +
    + + + +
    + diff -Nru erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/refman.xml erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/refman.xml --- erlang-13.b.1-dfsg/lib/runtime_tools/doc/src/refman.xml 2007-11-26 19:03:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/runtime_tools/doc/src/refman.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,40 +0,0 @@ - - - - -
    - - 1999 - 2007 - Ericsson AB, All Rights Reserved - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. - - - Runtime_Tools Reference Manual - Patrik Nyblom - - 1999-05-27 - A -
    - -

    Runtime_Tools provides low footprint tracing/debugging - tools suitable for inclusion in a production system.

    -
    - - - -
    - diff -Nru erlang-13.b.1-dfsg/lib/runtime_tools/vsn.mk erlang-13.b.3-dfsg/lib/runtime_tools/vsn.mk --- erlang-13.b.1-dfsg/lib/runtime_tools/vsn.mk 2009-03-12 12:24:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/runtime_tools/vsn.mk 2009-11-20 13:34:04.000000000 +0000 @@ -1 +1 @@ -RUNTIME_TOOLS_VSN = 1.8 +RUNTIME_TOOLS_VSN = 1.8.2 diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/appup.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/appup.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/appup.xml 2007-11-26 18:57:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/appup.xml 2009-11-20 13:30:27.000000000 +0000 @@ -4,23 +4,21 @@
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + appup @@ -78,7 +76,7 @@ RELEASE UPGRADE INSTRUCTIONS

    Release upgrade instructions are interpreted by the release handler when an upgrade or downgrade is made. For more - information about release handling, refer to OTP Design Principes.

    + information about release handling, refer to OTP Design Principles.

    A process is said to use a module Mod, if Mod is listed in the Modules part of the child specification used to start the process, see supervisor(3). diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/book.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/book.xml 2007-11-26 18:57:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/book.xml 2009-11-20 13:30:20.000000000 +0000 @@ -1,26 +1,24 @@ - +

    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + System Application Support Libraries (SASL) @@ -28,7 +26,7 @@ 1999-04-22 B - book.sgml + book.xml
    @@ -37,11 +35,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/error_logging.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/error_logging.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/error_logging.xml 2007-11-26 18:56:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/error_logging.xml 2009-11-20 13:30:07.000000000 +0000 @@ -4,23 +4,21 @@
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + SASL Error Logging @@ -31,7 +29,7 @@ 1999-04-13 B - error_logging.sgml + error_logging.xml

    The SASL application introduces three types of reports:

    @@ -116,46 +114,46 @@ progress report is generated when the process is finally re-started.

    -\011=ERROR REPORT==== 27-May-1996::13:38:56 ===
    -\011<0.63.0>: Divide by zero !
    -\011
    -\011=CRASH REPORT==== 27-May-1996::13:38:56 ===
    -\011crasher:
    -\011pid: <0.63.0>
    -\011registered_name: []
    -\011error_info: {badarith,{test,s,[]}}
    -\011initial_call: {test,s,[]}
    -\011ancestors: [test_sup,<0.46.0>]
    -\011messages: []
    -\011links: [<0.47.0>]
    -\011dictionary: []
    -\011trap_exit: false
    -\011status: running
    -\011heap_size: 128
    -\011stack_size: 128
    -\011reductions: 348
    -\011neighbours:
    -\011
    -\011=SUPERVISOR REPORT==== 27-May-1996::13:38:56 ===
    -\011Supervisor: {local,test_sup}
    -\011Context:    child_terminated
    -\011Reason:     {badarith,{test,s,[]}}
    -\011Offender:   [{pid,<0.63.0>},
    -\011{name,test},
    -\011{mfa,{test,t,[]}},
    -\011{restart_type,permanent},
    -\011{shutdown,200},
    -\011{child_type,worker}]
    -\011
    -\011
    -\011=PROGRESS REPORT==== 27-May-1996::13:38:56 ===
    -\011Supervisor: {local,test_sup}
    -\011Started:  [{pid,<0.64.0>},
    -\011{name,test},
    -\011{mfa,{test,t,[]}},
    -\011{restart_type,permanent},
    -\011{shutdown,200},
    -\011{child_type,worker}]
    +        =ERROR REPORT==== 27-May-1996::13:38:56 ===
    +        <0.63.0>: Divide by zero !
    +        
    +        =CRASH REPORT==== 27-May-1996::13:38:56 ===
    +        crasher:
    +        pid: <0.63.0>
    +        registered_name: []
    +        error_info: {badarith,{test,s,[]}}
    +        initial_call: {test,s,[]}
    +        ancestors: [test_sup,<0.46.0>]
    +        messages: []
    +        links: [<0.47.0>]
    +        dictionary: []
    +        trap_exit: false
    +        status: running
    +        heap_size: 128
    +        stack_size: 128
    +        reductions: 348
    +        neighbours:
    +        
    +        =SUPERVISOR REPORT==== 27-May-1996::13:38:56 ===
    +        Supervisor: {local,test_sup}
    +        Context:    child_terminated
    +        Reason:     {badarith,{test,s,[]}}
    +        Offender:   [{pid,<0.63.0>},
    +        {name,test},
    +        {mfa,{test,t,[]}},
    +        {restart_type,permanent},
    +        {shutdown,200},
    +        {child_type,worker}]
    +        
    +        
    +        =PROGRESS REPORT==== 27-May-1996::13:38:56 ===
    +        Supervisor: {local,test_sup}
    +        Started:  [{pid,<0.64.0>},
    +        {name,test},
    +        {mfa,{test,t,[]}},
    +        {restart_type,permanent},
    +        {shutdown,200},
    +        {child_type,worker}]
           
    @@ -192,11 +190,11 @@ example:

     
    -\0115>rb:start([{max, 20}]).
    -\011rb: reading report...done.
    -\011rb: reading report...done.
    -\011rb: reading report...done.
    -\011rb: reading report...done.
    +        5>rb:start([{max, 20}]).
    +        rb: reading report...done.
    +        rb: reading report...done.
    +        rb: reading report...done.
    +        rb: reading report...done.
           
    @@ -211,30 +209,30 @@

    The function rb:list() lists all loaded reports:

     
    -\0114>rb:list().
    -\011No                Type          Process       Date     Time
    -\011==                ====          =======       ====     ====
    -\01120            progress         <0.17.0> 1996-10-16 16:14:54
    -\01119            progress         <0.14.0> 1996-10-16 16:14:55
    -\01118               error         <0.15.0> 1996-10-16 16:15:02
    -\01117            progress         <0.14.0> 1996-10-16 16:15:06
    -\01116            progress         <0.38.0> 1996-10-16 16:15:12
    -\01115            progress         <0.17.0> 1996-10-16 16:16:14
    -\01114            progress         <0.17.0> 1996-10-16 16:16:14
    -\01113            progress         <0.17.0> 1996-10-16 16:16:14
    -\01112            progress         <0.14.0> 1996-10-16 16:16:14
    -\01111               error         <0.17.0> 1996-10-16 16:16:21
    -\01110               error         <0.17.0> 1996-10-16 16:16:21
    -\0119        crash_report  release_handler 1996-10-16 16:16:21
    -\0118   supervisor_report         <0.17.0> 1996-10-16 16:16:21
    -\0117            progress         <0.17.0> 1996-10-16 16:16:21
    -\0116            progress         <0.17.0> 1996-10-16 16:16:36
    -\0115            progress         <0.17.0> 1996-10-16 16:16:36
    -\0114            progress         <0.17.0> 1996-10-16 16:16:36
    -\0113            progress         <0.14.0> 1996-10-16 16:16:36
    -\0112               error         <0.15.0> 1996-10-16 16:17:04
    -\0111            progress         <0.14.0> 1996-10-16 16:17:09
    -\011ok
    +        4>rb:list().
    +        No                Type          Process       Date     Time
    +        ==                ====          =======       ====     ====
    +        20            progress         <0.17.0> 1996-10-16 16:14:54
    +        19            progress         <0.14.0> 1996-10-16 16:14:55
    +        18               error         <0.15.0> 1996-10-16 16:15:02
    +        17            progress         <0.14.0> 1996-10-16 16:15:06
    +        16            progress         <0.38.0> 1996-10-16 16:15:12
    +        15            progress         <0.17.0> 1996-10-16 16:16:14
    +        14            progress         <0.17.0> 1996-10-16 16:16:14
    +        13            progress         <0.17.0> 1996-10-16 16:16:14
    +        12            progress         <0.14.0> 1996-10-16 16:16:14
    +        11               error         <0.17.0> 1996-10-16 16:16:21
    +        10               error         <0.17.0> 1996-10-16 16:16:21
    +        9        crash_report  release_handler 1996-10-16 16:16:21
    +        8   supervisor_report         <0.17.0> 1996-10-16 16:16:21
    +        7            progress         <0.17.0> 1996-10-16 16:16:21
    +        6            progress         <0.17.0> 1996-10-16 16:16:36
    +        5            progress         <0.17.0> 1996-10-16 16:16:36
    +        4            progress         <0.17.0> 1996-10-16 16:16:36
    +        3            progress         <0.14.0> 1996-10-16 16:16:36
    +        2               error         <0.15.0> 1996-10-16 16:17:04
    +        1            progress         <0.14.0> 1996-10-16 16:17:09
    +        ok
           
    @@ -246,7 +244,7 @@ 10> rb:show(1). 7> rb:show(4). -\011 + PROGRESS REPORT <0.20.0> 1996-10-16 16:16:36 =============================================================================== supervisor {local,sasl_sup} @@ -257,10 +255,10 @@ {restart_type,permanent}, {shutdown,2000}, {child_type,worker}] -\011 + ok 8> rb:show(9). -\011 + CRASH REPORT <0.24.0> 1996-10-16 16:16:21 =============================================================================== Crashing process @@ -301,16 +299,16 @@ 12>rb:grep("mbj_func"). Found match in report number 11 -\011 + ERROR REPORT <0.24.0> 1996-10-16 16:16:21 =============================================================================== -\011 + ** undefined function: release_handler:mbj_func[] ** Found match in report number 10 ERROR REPORT <0.24.0> 1996-10-16 16:16:21 =============================================================================== -\011 + ** Generic server release_handler terminating ** Last message in was {unpack_release,hej} ** When Server state == {state,[], @@ -325,7 +323,7 @@ ** Reason for termination == ** {undef,{release_handler,mbj_func,[]}} Found match in report number 9 -\011 + CRASH REPORT <0.24.0> 1996-10-16 16:16:21 =============================================================================== Crashing process @@ -351,13 +349,13 @@ heap_size 610 stack_size 142 reductions 54 -\011 + Found match in report number 8 -\011 + SUPERVISOR REPORT <0.20.0> 1996-10-16 16:16:21 =============================================================================== Reporting supervisor {local,sasl_sup} -\011 + Child process errorContext child_terminated reason {undef,{release_handler,mbj_func,[]}} @@ -367,20 +365,20 @@ restart_type permanent shutdown 2000 child_type worker -\011 -\011ok + +ok +
    -
    - Stop the Server -

    Stop the rb_server with the function - rb:stop():

    -
    +    
    + Stop the Server +

    Stop the rb_server with the function + rb:stop():

    +
     
     13>rb:stop().
     ok
    -        
    -
    +
    diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/Makefile erlang-13.b.3-dfsg/lib/sasl/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/sasl/doc/src/Makefile 2007-11-26 18:57:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/Makefile 2009-11-20 13:30:19.000000000 +0000 @@ -23,17 +23,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(SASL_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=sasl # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/sasl-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -61,6 +56,11 @@ note.gif \ warning.gif +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_REF4_FILES) \ + $(XML_REF6_FILES) $(XML_APPLICATION_FILES) + # ---------------------------------------------------- @@ -68,62 +68,33 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF4_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN4_FILES = $(XML_REF4_FILES:%.xml=$(MAN4DIR)/%.4) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF4_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) \ - part.tex - -TOP_PDF_FILE = sasl-$(VSN).pdf -TOP_PS_FILE = sasl-$(VSN).ps +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets # ---------------------------------------------------- +$(HTMLDIR)/%.gif: %.gif + $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) $(MAN4_FILES) $(MAN6_FILES) @@ -131,44 +102,32 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) $(MAN4_FILES) $(MAN6_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) - rm -f min_head.gif - -$(HTMLDIR)/%.gif: %.gif # Copy them to ../html - $(INSTALL_DATA) $< $@ +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(MAN4DIR)/* + rm -f $(MAN6DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 $(INSTALL_DIR) $(RELEASE_PATH)/man/man4 $(INSTALL_DATA) $(MAN4_FILES) $(RELEASE_PATH)/man/man4 $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6 -endif -endif release_spec: diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/notes_history.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/notes_history.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/notes_history.xml 2007-11-26 19:00:51.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/notes_history.xml 2009-11-20 13:32:18.000000000 +0000 @@ -4,23 +4,21 @@
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + SASL Release Notes History @@ -61,7 +59,7 @@ listed for the new, not the old, version of the application to be unloaded. If the set of modules was changed, this meant the release handler would try to - purge non-existant modules and/or forget to unload + purge non-existent modules and/or forget to unload modules no longer used.

    restart_application is now translated to a correct set of delete_module and add_module diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/notes.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/notes.xml 2009-03-12 15:27:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/notes.xml 2009-11-20 13:31:55.000000000 +0000 @@ -26,9 +26,44 @@ nil nil nil + notes.xml

    This document describes the changes made to the SASL application.

    +
    SASL 2.1.8 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    + +
    SASL 2.1.7 + +
    Improvements and New Features + + +

    + The Windows utility Erlsrv, run in interactive mode now + accepts options for registering internal service name and + description field of Windows registry database.

    +

    + Own Id: OTP-8132

    +
    +
    +
    + +
    +
    SASL 2.1.6
    Fixed Bugs and Malfunctions diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/overload.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/overload.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/overload.xml 2007-11-26 18:56:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/overload.xml 2009-11-20 13:29:53.000000000 +0000 @@ -4,23 +4,21 @@
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + overload @@ -139,7 +137,7 @@

    Returns the current total and accept intensities, the configuration parameters, and absolute counts of the total number of requests, and accepted number of requests (since - the overload process was started).\011

    + the overload process was started).

    diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/part_notes.xml 2007-11-26 19:00:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/part_notes.xml 2009-11-20 13:31:58.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + SASL Release Notes @@ -35,6 +33,6 @@

    For information about older versions, see Release Notes History.

    - + diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/part.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/part.xml 2007-11-26 18:56:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/part.xml 2009-11-20 13:29:45.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + SASL User's Guide @@ -28,13 +26,13 @@ 1997-06-04 1.3.1 - part.sgml + part.xml

    The System Architecture Support Libraries, SASL, provides support for alarm and release handling etc.

    - - + +
    diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/ref_man.xml 2007-11-26 18:56:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/ref_man.xml 2009-11-20 13:29:53.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + SASL Reference Manual @@ -28,21 +26,21 @@ 1997-11-17 1.4 - application.sgml + application.xml

    The System Architecture Support Libraries application, SASL, provides support for alarm and release handling etc.

    - - - - - - - - - - + + + + + + + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/release_handler.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/release_handler.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/release_handler.xml 2007-11-26 18:56:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/release_handler.xml 2009-11-20 13:29:44.000000000 +0000 @@ -4,23 +4,21 @@
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + release_handler @@ -245,7 +243,7 @@ Reason = {illegal_option, Opt} | {already_installed, Vsn} | {change_appl_data, term()} | term() -

    Installs the specfied version Vsn of the release. +

    Installs the specified version Vsn of the release. Looks first for a relup file for Vsn and a script {UpFromVsn,Descr1,Instructions1} in this file for upgrading from the current version. If not found, @@ -424,7 +422,7 @@ not be used together with calls to install_release/1,2, as this will cause release_handler to end up in an inconsistent state.

    -

    No persistant information is updated, why these functions can +

    No persistent information is updated, why these functions can be used on any Erlang node, embedded or not. Also, using these functions does not effect which code will be loaded in case of a reboot.

    diff -Nru erlang-13.b.1-dfsg/lib/sasl/doc/src/sasl_intro.xml erlang-13.b.3-dfsg/lib/sasl/doc/src/sasl_intro.xml --- erlang-13.b.1-dfsg/lib/sasl/doc/src/sasl_intro.xml 2009-03-12 12:19:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/doc/src/sasl_intro.xml 2009-11-20 13:30:20.000000000 +0000 @@ -26,6 +26,7 @@ + sasl_intro.xml
    diff -Nru erlang-13.b.1-dfsg/lib/sasl/src/erlsrv.erl erlang-13.b.3-dfsg/lib/sasl/src/erlsrv.erl --- erlang-13.b.1-dfsg/lib/sasl/src/erlsrv.erl 2009-03-12 12:19:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/src/erlsrv.erl 2009-09-18 15:07:56.000000000 +0100 @@ -129,6 +129,8 @@ %%% sname | name : The short name of the node %%% priority : The OS priority of the erlang process %%% args : All arguments correctly parsed into a list of strings +%%% comment : The service description +%%% internalservicename : The windows internal service name %%% env : A list of environment variables and values [{"VAR", "VALUE"}] %%% Example: %%% [{servicename,"kalle_R4A"}, @@ -154,7 +156,9 @@ {"Name",name, []}, {"Priority",priority, "default"}, {"DebugType",debugtype, "none"}, - {"Args",args,[]}], + {"Args",args,[]}, + {"InternalServiceName",internalservicename,[]}, + {"Comment",comment,[]}], %% Env has special treatment... F = fun(X) -> {Name,Value} = splitline(X), @@ -204,13 +208,14 @@ false -> {error, no_servicename}; {value, {_,Name}} -> - Action = case get_service(Name) of + {Action,Service1} = case get_service(Name) of {error, no_such_service} -> - "add"; + {"add",Service}; _ -> - "set" + {"set", + lists:keydelete(internalservicename,1,Service)} end, - Commands = [Action | build_commands(Name, Service)], + Commands = [Action | build_commands(Name, Service1)], case run_erlsrv_interactive(EmulatorVersion,Commands) of {ok, _} -> ok; @@ -250,16 +255,20 @@ new_service(NewServiceName, OldService, Data) -> new_service(NewServiceName, OldService, Data, []). new_service(NewServiceName, OldService, Data, RestartName) -> - Tmp0 = lists:keyreplace(servicename, 1, OldService, {servicename, NewServiceName}), - Tmp = case lists:keysearch(env,1,Tmp0) of + Tmp0 = lists:keydelete(internalservicename,1,OldService), %Remove when + % creating new service from + % old. + Tmp1 = lists:keyreplace(servicename, 1, Tmp0, + {servicename, NewServiceName}), + Tmp = case lists:keysearch(env,1,Tmp1) of {value, {env,Env0}} -> Env1 = lists:keydelete("ERLSRV_SERVICE_NAME",1,Env0), - lists:keyreplace(env,1,Tmp0, + lists:keyreplace(env,1,Tmp1, {env, [{"ERLSRV_SERVICE_NAME", RestartName} | Env1]}); _ -> - Tmp0 + Tmp1 end, ArgsTmp = case lists:keysearch(args, 1, Tmp) of diff -Nru erlang-13.b.1-dfsg/lib/sasl/vsn.mk erlang-13.b.3-dfsg/lib/sasl/vsn.mk --- erlang-13.b.1-dfsg/lib/sasl/vsn.mk 2009-03-12 12:18:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/sasl/vsn.mk 2009-11-20 13:30:05.000000000 +0000 @@ -1 +1 @@ -SASL_VSN = 2.1.6 +SASL_VSN = 2.1.8 diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/book.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/book.xml 2009-03-12 12:28:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/book.xml 2009-11-20 13:36:05.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19972009 @@ -35,11 +35,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/depend.mk erlang-13.b.3-dfsg/lib/snmp/doc/src/depend.mk --- erlang-13.b.1-dfsg/lib/snmp/doc/src/depend.mk 2009-06-05 13:55:55.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/depend.mk 2009-11-20 08:48:37.000000000 +0000 @@ -76,6 +76,7 @@ snmpm_conf.xml \ snmpm_mpd.xml \ snmpm_network_interface.xml \ + snmpm_network_interface_filter.xml \ snmpm_user.xml diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/files.mk erlang-13.b.3-dfsg/lib/snmp/doc/src/files.mk --- erlang-13.b.1-dfsg/lib/snmp/doc/src/files.mk 2009-06-05 13:55:39.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/files.mk 2009-11-20 08:48:29.000000000 +0000 @@ -59,6 +59,7 @@ snmpm_conf.xml \ snmpm_mpd.xml \ snmpm_network_interface.xml \ + snmpm_network_interface_filter.xml \ snmpm_user.xml XML_REF3_FILES = \ @@ -134,3 +135,19 @@ snmp-um-1-image-8.ps \ MIB_mechanism.ps + +MIB_FILES = \ + $(MIBSDIR)/RFC1213-MIB.mib \ + $(MIBSDIR)/STANDARD-MIB.mib \ + $(MIBSDIR)/SNMPv2-TM.mib \ + $(MIBSDIR)/SNMPv2-MIB.mib \ + $(MIBSDIR)/SNMP-FRAMEWORK-MIB.mib \ + $(MIBSDIR)/SNMP-MPD-MIB.mib \ + $(MIBSDIR)/SNMP-TARGET-MIB.mib \ + $(MIBSDIR)/SNMP-NOTIFICATION-MIB.mib \ + $(MIBSDIR)/SNMP-COMMUNITY-MIB.mib \ + $(MIBSDIR)/SNMP-USER-BASED-SM-MIB.mib \ + $(MIBSDIR)/SNMP-VIEW-BASED-ACM-MIB.mib \ + $(MIBSDIR)/SNMP-USM-AES-MIB.mib \ + $(MIBSDIR)/INET-ADDRESS-MIB.mib \ + $(MIBSDIR)/OTP-SNMPEA-MIB.mib diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/index.html.src erlang-13.b.3-dfsg/lib/snmp/doc/src/index.html.src --- erlang-13.b.1-dfsg/lib/snmp/doc/src/index.html.src 2007-11-26 13:07:50.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/index.html.src 2009-11-20 13:35:51.000000000 +0000 @@ -57,30 +57,30 @@ diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/make.dep erlang-13.b.3-dfsg/lib/snmp/doc/src/make.dep --- erlang-13.b.1-dfsg/lib/snmp/doc/src/make.dep 2009-06-05 13:55:21.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/make.dep 2009-11-20 08:48:28.000000000 +0000 @@ -53,7 +53,8 @@ snmpa_notification_filter.tex \ snmpa_supervisor.tex \ snmpc.tex snmpm.tex snmpm_conf.tex snmpm_mpd.tex \ - snmpm_network_interface.tex snmpm_user.tex + snmpm_network_interface.tex snmpm_network_interface_filter.tex \ + snmpm_user.tex # ---------------------------------------------------- # Source inlined when transforming from source to LaTeX diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/Makefile erlang-13.b.3-dfsg/lib/snmp/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/snmp/doc/src/Makefile 2009-03-12 12:28:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/Makefile 2009-11-20 13:36:05.000000000 +0000 @@ -25,26 +25,28 @@ # ---------------------------------------------------- include ../../vsn.mk VSN = $(SNMP_VSN) +APPLICATION=snmp # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- +ifndef DOCSUPPORT include make.dep +endif # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/snmp-$(VSN) - +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- +MIBSDIR = ../../mibs include files.mk - # ---------------------------------------------------- HTML_APP_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) @@ -75,8 +77,20 @@ $(HTML_REF6_FILES) \ $(HTML_CHAP_FILES) + +MAN7DIR = $(DOCDIR)/man7 + MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) +MAN7_FILES = $(MIB_FILES:$(MIBSDIR)/%.mib=$(MAN7DIR)/%.7) + +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) @@ -101,12 +115,14 @@ TOP_HTML_FILES = $(INDEX_TARGET) -GIF_TARGETS = $(GIF_FILES:%=$(HTMLDIR)/%) +endif INDEX_FILE = index.html INDEX_SRC = $(INDEX_FILE).src INDEX_TARGET = $(DOCDIR)/$(INDEX_FILE) +GIF_TARGETS = $(GIF_FILES:%=$(HTMLDIR)/%) + # ---------------------------------------------------- # FLAGS @@ -117,6 +133,25 @@ # ---------------------------------------------------- # Targets # ---------------------------------------------------- +$(HTMLDIR)/%.gif: %.gif # Copy them to ../html + $(INSTALL_DATA) $< $@ + +ifdef DOCSUPPORT + +docs: pdf html man + +ldocs: local_docs $(INDEX_TARGET) + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: clean_html clean_man clean_pdf + rm -f errs core *~ + +else ifeq ($(DOCTYPE),pdf) docs: pdf @@ -136,13 +171,15 @@ html2: gifs $(TOP_HTML_FILES) $(HTML_FILES) $(HTML_REF3_FILES) $(HTML_REF6_FILES) $(HTML_CHAP_FILES) -man: $(MAN3_FILES) $(MAN6_FILES) +clean: clean_tex clean_html clean_man clean_docs -gifs: $(GIF_TARGETS) -debug opt: - -clean: clean_tex clean_html clean_man clean_gifs clean_docs +clean_tex: + @echo "cleaning tex:" + rm -f $(TEX_FILES_USERS_GUIDE) + rm -f $(TEX_FILES_REF_MAN) + rm -f $(TEX_PART_FILES) + rm -f $(TEX_FILES_BOOK) clean_docs: @echo "cleaning docs:" @@ -150,37 +187,47 @@ rm -f $(TOP_PS_FILE) rm -f core $(LATEX_CLEAN) -clean_man: - @echo "cleaning man:" - rm -f $(MAN3_FILES) $(MAN6_FILES) - -clean_tex: - @echo "cleaning tex:" - rm -f $(TEX_FILES_USERS_GUIDE) - rm -f $(TEX_FILES_REF_MAN) - rm -f $(TEX_PART_FILES) - rm -f $(TEX_FILES_BOOK) -clean_html: - @echo "cleaning html:" - rm -f $(TOP_HTML_FILES) - rm -f $(HTML_FILES) - rm -f $(DEFAULT_HTML_FILES) - rm -f $(HTML_REF3_FILES) - rm -f $(HTML_REF6_FILES) - rm -f $(HTML_CHAP_FILES) - -clean_gifs: - @echo "cleaning gifs:" - rm -f $(GIF_TARGETS) +$(HTML_PART_FILES): notes.xml -$(HTMLDIR)/%.gif: %.gif # Copy them to ../html - $(INSTALL_DATA) $< $@ +endif $(INDEX_TARGET): $(INDEX_SRC) ../../vsn.mk # Create top make file sed -e 's;%VSN%;$(VSN);' $< > $@ # inserting version number -$(HTML_PART_FILES): notes.xml +man: man3 man6 man7 + +man3: $(MAN3_FILES) + +man6: $(MAN6_FILES) + +man7: $(MAN7_FILES) + +gifs: $(GIF_TARGETS) + +debug opt: + +clean_pdf: + @echo "cleaning pdf:" + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + +clean_man: + @echo "cleaning man:" + rm -f $(MAN3DIR)/* + rm -f $(MAN6DIR)/* + rm -f $(MAN7DIR)/* + +clean_html: + @echo "cleaning html:" + rm -rf $(HTMLDIR)/* + +$(MAN7DIR)/%.7: $(MIBSDIR)/%.mib + @echo "processing $*" + @echo ".TH $* 7 \"SNMP\" \"Erlang/OTP\" \"MIB\"" > $@ + @echo ".nf" >> $@ + @cat $< >> $@ + @echo ".fi" >> $@ + @echo "" >> $@ # ---------------------------------------------------- @@ -188,6 +235,25 @@ # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 + $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man6 + $(INSTALL_DIR) $(RELEASE_PATH)/man/man7 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man7 + +else + + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -207,19 +273,35 @@ $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6 + $(INSTALL_DIR) $(RELEASE_PATH)/man/man7 + $(INSTALL_DATA) $(MAN7_FILES) $(RELEASE_PATH)/man/man7 $(INSTALL_DATA) $(TOP_HTML_FILES) \ $(RELSYSDIR)/doc endif endif +endif + release_spec: -info: info_xml info_html info_tex +ifdef DOCSUPPORT +info: info_xml info_man info_html +else +info: info_xml info_man info_html info_tex @echo "DVI2PS = $(DVI2PS)" @echo "DVIPS_FLAGS = $(DVIPS_FLAGS)" @echo "" @echo "DISTILL = $(DISTILL)" @echo "DISTILL_FLAGS = $(DISTILL_FLAGS)" +endif + +info_man: + @echo "man files:" + @echo "MAN3_FILES = $(MAN3_FILES)" + @echo "MAN6_FILES = $(MAN6_FILES)" + @echo "MAN7_FILES = $(MAN7_FILES)" + @echo "" + @echo "MIB_FILES = $(MIB_FILES)" info_xml: @echo "xml files:" @@ -237,6 +319,11 @@ info_html: @echo "html files:" + @echo "DOCDIR = $(DOCDIR)" + @echo "INDEX_FILE = $(INDEX_FILE)" + @echo "INDEX_SRC = $(INDEX_SRC)" + @echo "INDEX_TARGET = $(INDEX_TARGET)" + @echo "" @echo "HTMLDIR = $(HTMLDIR)" @echo "HTML_APP_FILES = $(HTML_APP_FILES)" @echo "HTML_PART_FILES = $(HTML_PART_FILES)" @@ -257,5 +344,6 @@ @echo "TEX_PART_FILES = $(TEX_PART_FILES)" @echo "TEX_FILES_BOOK = $(TEX_FILES_BOOK)" +ifndef DOCSUPPORT include depend.mk - +endif diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/notes_history.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/notes_history.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/notes_history.xml 2009-03-12 12:31:59.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/notes_history.xml 2009-11-20 13:37:36.000000000 +0000 @@ -96,7 +96,7 @@ -

    [compiler] The MIB-compiler did not suppport a name assignment +

    [compiler] The MIB-compiler did not support a name assignment which was sequence of numbers, only a parent object name followed by a sequence of numbers.

    Ola Samuelsson

    @@ -1373,9 +1373,9 @@

    [manager] Added another get, get-next and set function with another argument, ExtraInfo (see - synchronous get (g), asynchroneous get (ag), - synchronous set (s), asynchroneous set (as), - synchronous get-next (gn), and asynchroneous get-next (agn)). + synchronous get (g), asynchronous get (ag), + synchronous set (s), asynchronous set (as), + synchronous get-next (gn), and asynchronous get-next (agn)). This argument is passed on to the net-if process. The net-if process included in this application makes no use of this info, but other implementations might.

    @@ -1794,7 +1794,7 @@

    [agent] The agent local_db volatile storage method uses an ets-table which is private. This table has been made - protected in order to make it easier to bedug and test the + protected in order to make it easier to debug and test the snmp agent.

    Own Id: OTP-5308

    @@ -1938,7 +1938,7 @@ "left hanging". Now, if the request is synchronous, it will return with a proper reason (snmpm:g, snmpm:gn and snmpm:s), and if the request - was asynchroneous, the new callback function, + was asynchronous, the new callback function, handle_error (see snmpm_user) is called.

    diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/notes.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/notes.xml 2009-06-05 13:54:56.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/notes.xml 2009-11-20 13:35:53.000000000 +0000 @@ -33,6 +33,296 @@
    + SNMP Development Toolkit 4.15 + +

    Version 4.15 supports code replacement in runtime from/to + version 4.14 and 4.13.5.

    + +
    + Improvements and new features + + + + +

    The documentation is now built with open source tools + (xsltproc and fop) that exists on most + platforms. One visible change is that the frames are removed.

    +

    Own Id: OTP-8249

    +
    + +
    + +
    + +
    + Reported Fixed Bugs and Malfunctions + + + +

    [manager] When information from an unknown agent is received, + it was previously delivered to the default user via calls to all + the functions of the callback API depending on the info type + (pdu, trap, report or inform). + The problem was that the TargetName argument was useless + in this case (only an already known agent has a known/valid + TargetName, but the TargetName used in these calls + was generated "on the fly").

    +

    This has now been changed so that when a message is received + from an unknown agent, then only + handle_agent + (for the default user) is called, but now this call also has a + Type argument, which is + pdu | trap | report | inform, depending on what kind of + message was actually received, thus making it possible for the + user to properly analyze the data received.

    +

    To handle this, the + snmpm_user behaviour has + been updated.

    +

    *** POTENTIAL INCOMPATIBILITY ***

    +

    Own Id: OTP-8229

    + +
    + +
    + +
    + +
    + + +
    + SNMP Development Toolkit 4.14 + +

    Version 4.14 supports code replacement in runtime from/to + version 4.13.5, 4.13.4, 4.13.3, 4.13.2, 4.13.1 and 4.13.

    + +
    + Improvements and new features + + + + +

    [compiler] Include object- and notification groups in the + compiled mib. + This will make it possible to import groups from other mibs.

    +

    Also the SNMPv2-MIB-file has been updated to a more + up-to-date version.

    +

    Own Id: OTP-8223

    + +
    + + +

    [manager] Added support for message filtering in the + network interface module provided with the application. + The component that actually make the filter decisions + is the network interface filter module. This module + must implement the + network interface filter behaviour + for message filtering. + See also the Configuring chapter of + the User's Guide to see how to configure this feature.

    +

    See the + configuration + chapter for more info about the filter options.

    +

    Own Id: OTP-8228

    +

    Aux Id: Seq 11411

    +
    + + +

    The MIBs delivered as part of the application is now + also available as man pages, section 7.

    +

    Own Id: OTP-8237

    + +
    + +
    + +
    + +
    + Reported Fixed Bugs and Malfunctions +

    -

    + + + +
    + +
    + Incompatibilities +

    -

    +
    +
    + + +
    + SNMP Development Toolkit 4.13.5 + +

    Version 4.13.5 supports code replacement in runtime from/to + version 4.13.4, 4.13.3, 4.13.2, 4.13.1 and 4.13.

    + +
    + Improvements and new features + + + + +

    [agent] Improved the cache handling of the mib server.

    +

    A number of new functions and config options for the mib server + cache has been added.

    +

    See + invalidate_mibs_cache/0,1, + enable_mibs_cache/0,1, + disable_mibs_cache/0,1, + gc_mibs_cache/0,1,2,3, + enable_mibs_cache_autogc/0,1, + disable_mibs_cache_autogc/0,1, + update_mibs_cache_age/1,2 and + update_mibs_cache_gclimit/1,2 for more info.

    +

    See also the + configuration + chapter for more info about the mib server cache options.

    +

    Own Id: OTP-8182

    +

    Aux Id: Seq 11383

    +
    + + +

    [agent] A manager could no longer use the SNMPv3 user "initial" + as this was interpretated as the first step of the discovery.

    +

    Introduced a new terminating option, trigger_username to + make it possible to configure the username the agent reacts to. + Default is "".

    +

    See the + configuration + chapter for more info about the discovery options.

    +

    Own Id: OTP-8120

    +

    Aux Id: Seq 11361

    +
    + +
    + +
    + +
    + Reported Fixed Bugs and Malfunctions + + + +

    [agent] The main agent type header file contained some miss-information + regarding the type of the entrytype field of the me-record, causing + unneccessary confusion.

    +

    Own Id: OTP-8116

    +

    Aux Id: Seq 11312

    +
    + +
    + +
    + +
    + Incompatibilities +

    -

    +
    +
    + + +
    + SNMP Development Toolkit 4.13.4 + +

    Version 4.13.4 supports code replacement in runtime from/to + version 4.13.3, 4.13.2, 4.13.1 and 4.13.

    + +
    + Improvements and new features +

    -

    + + + +
    + +
    + Reported Fixed Bugs and Malfunctions + + + +

    [agent] Originating discovery problems.

    +

    Invalid state variable update during second stage of + discovery causes master agent crash.

    +

    Also the net_if process failed to activate socket + ({active, once}) after first discovery response was sent.

    +

    Own Id: OTP-8044

    +

    Aux Id: Seq 11295

    +
    + + +

    [agent] Terminating discovery problem.

    +

    The reply to the second stage request should include a + varbind with usmStatsNotInTimeWindows.

    +

    Own Id: OTP-8062

    +

    Aux Id: Seq 11318

    +
    + + +

    [agent] Originating discovery improvement.

    +

    Added the ExtraInfo argument to the + discovery function. + This argument will be passed on to the stage1_finish callback + function. Also, the + discovery function + will now always return {ok, ManagerEngineID} on successful + discovery.

    +

    The discovery handler + behaviour updated accordingly.

    +

    Own Id: OTP-8098

    +

    Aux Id: Seq 11346

    +
    + +
    + +
    + +
    + Incompatibilities +

    -

    +
    +
    + + +
    SNMP Development Toolkit 4.13.3

    Version 4.13.3 supports code replacement in runtime from/to @@ -96,7 +386,7 @@ of these problems.

    Introduced various options for controlling the discovery process. See the - configuration + configuration chapter for more info about the discovery options.

    Own Id: OTP-8020

    Aux Id: Seq 11295

    @@ -166,7 +456,7 @@ -

    [manager] EngineId lookup failes when using version-3.

    +

    [manager] EngineId lookup fails when using version-3.

    Own Id: OTP-7983

    Aux Id: Seq 11275

    @@ -319,7 +609,7 @@ and Port) to identify the agent (also the return value of which_agents has been changed).

    -

    Second, for backward compatibillity, the old functions still +

    Second, for backward compatibility, the old functions still exist, but are no longer documented and are now wrappers for the new functions, including erroneous default value for EngineID and all. The TargetName is however generated from the provided @@ -434,7 +724,7 @@

    Logging of messages with the GetBulk-request PDU incorrectly produced an erroneous entry in the - log: "An error occured".

    + log: "An error occurred".

    The reason for this was that the PDU-fields error_status and error_index is re-used for Non-repeaters and Max-repetitions for @@ -594,7 +884,7 @@ --> -

    [compiler] The MIB compiler did not retreive the REFERENCE part +

    [compiler] The MIB compiler did not retrieve the REFERENCE part of a SNMP MIB definition.

    This problem has been partly solved. For SNMP tables, the assocList field of the tables mib-entry record now contains @@ -602,7 +892,7 @@ MIB was compiled with the compiler option +reference.

    This solution is temporary, until such time as a permanent solution (and probably not backward compatible) is devised, which - retreives and stores all REFERENCE part(s) of a MIB.

    + retrieves and stores all REFERENCE part(s) of a MIB.

    See the compiler options for more info.

    @@ -725,10 +1015,10 @@
    -
    + diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/part_notes.xml 2009-03-12 12:28:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/part_notes.xml 2009-11-20 13:36:08.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19972009 @@ -35,6 +35,6 @@

    For information about older versions see release notes history.

    - + diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/part.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/part.xml 2009-03-12 12:27:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/part.xml 2009-11-20 13:35:50.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19962009 @@ -33,22 +33,22 @@ featuring an Extensible Agent, a simple manager and a MIB compiler and facilities for implementing SNMP MIBs etc.

    - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/ref_man.xml 2009-06-05 13:54:54.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/ref_man.xml 2009-11-20 13:35:50.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19962009 @@ -34,37 +34,38 @@ a MIB compiler and facilities for implementing SNMP MIBs etc.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmpa_discovery_handler.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmpa_discovery_handler.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmpa_discovery_handler.xml 2009-06-05 13:56:13.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmpa_discovery_handler.xml 2009-11-20 13:37:50.000000000 +0000 @@ -50,17 +50,19 @@ - stage1_finish(TargetName, ManagerEngineID) -> ignore | {ok, usm_entry()} + stage1_finish(TargetName, ManagerEngineID, ExtraInfo) -> ignore | {ok, usm_entry() | [usm_entry()]} | {ok, usm_entry() | [usm_entry()], NewExtraInfo} Discovery stage 1 finish TargetName = string() ManagerEngineID = string() + ExtraInfo = term() usm_entry() = tuple() compatible with usm.conf + NewExtraInfo = term()

    This function is called at the end of stage 1 of the discovery process. It should return either the atom - ignore or {ok, usm_entry()}. See + ignore or {ok, usm_entry() | [usm_entry()]}. See usm_entry() and usm_entry/13 @@ -76,17 +78,33 @@

    In either case, the agent will do nothing, but return - the retreived ManagerEngineID (see + the retrieved ManagerEngineID (see discovery for more info) and possible continue with stage 2 of the discovery process.

    +

    The ExtraInfo argument is passed on from the + discovery + function.

    + +

    This function may return an updated NewExtraInfo + that will be used in subsequent calls to the callback + functions. Intended for future use.

    +

    The purpose of this function is to generate the usm- related security data needed for usm processing in the agent. Specifically, updating the usmUserTable.

    -

    When an usm_entry() tuple is returned, this data is - then added to the usmUserTable by the (master-) agent.

    +

    When an usm_entry() tuple (or a list of such + tuples) is returned, this data is then added to the + usmUserTable by the (master-) agent.

    + +

    When an usm_entry() tuple (or a list of such + tuples) is returned, this data is then added to the + usmUserTable by the (master-) agent.

    + +

    Note that the function does not check if this entry + already exists.

    Note that this function is executed in the context of the master-agent process.

    diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_agent_funct_descr.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_agent_funct_descr.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_agent_funct_descr.xml 2009-03-12 12:28:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_agent_funct_descr.xml 2009-11-20 13:36:06.000000000 +0000 @@ -200,7 +200,7 @@

    The figures in this section illustrate the steps involved in the development of an SNMP agent.

    - + MIB Compiler Principles

    The compiler parses the SMI file and associates each table or @@ -212,7 +212,7 @@ agent at MIB load time (see the figure Starting the Agent). The instrumentation is ordinary Erlang code which is loaded explicitly or automatically the first time it is called.

    - + Starting the Agent

    The SNMP agent system consists of one Master Agent and optional @@ -229,7 +229,7 @@

    The following illustration shows how a system can look in runtime.

    - + Architecture

    A typical operation could include the following steps:

    @@ -607,7 +607,7 @@

    The following picture gives an overview of the mechanism to select an MIB view:

    - + Overview of the mechanism of MIB selection @@ -924,6 +924,12 @@
    Discovery +

    The sender is authoritative for messages containing + payload which does not expect a response (for example + SNMPv2-Trap, Response or Report PDU).

    +

    The receiver is authoritative for messages containing + payload which expects a response (for example + Get, GetNext, Get-Bulk, Set or Inform PDU).

    The agent can both perform and respond to discovery.

    The agent responds to discovery autonomously, without interaction by the user.

    diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_agent_netif.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_agent_netif.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_agent_netif.xml 2009-03-12 12:28:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_agent_netif.xml 2009-11-20 13:36:08.000000000 +0000 @@ -32,7 +32,7 @@ snmp_agent_netif.xml

    - + The Purpose of Agent Net if

    The Network Interface (Net if) process delivers SNMP PDUs to a diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_app_b.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_app_b.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_app_b.xml 2009-03-12 12:28:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_app_b.xml 2009-11-20 13:36:06.000000000 +0000 @@ -451,7 +451,7 @@ time should be long enough to allow for human response time (including `think time') between the creation of the conceptual row and the setting of the status to `active'. - In the absense of such information in the DESCRIPTION + In the absence of such information in the DESCRIPTION clause, it is suggested that this period be approximately 5 minutes in length. This removal action applies not only to newly-created rows, but also to previously active rows which diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_app.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_app.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_app.xml 2009-06-05 13:55:07.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_app.xml 2009-11-20 08:48:27.000000000 +0000 @@ -81,6 +81,8 @@

    Each snmp component has it's own set of configuration parameters, even though some of the types are common to both components.

    + +
           snmp_components_config() -> [snmp_component_config()]
           snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
    @@ -145,7 +147,8 @@
           
             

    agent_terminating_discovery_opt() = {enable, boolean()} | - {stage2, discovery | plain}

    + {stage2, discovery | plain} | + {trigger_username, string()}

    These are options effecting discovery terminating in this agent (i.e. initiated by a manager).

    The default values for the terminating @@ -153,6 +156,7 @@ enable: true stage2: discovery + trigger_username: "" @@ -323,10 +327,45 @@

    Default is false.

    - ]]> + ]]>

    Shall the agent utilize the mib server lookup cache or not.

    -

    Default is true.

    +

    Default is true (in which case the mibs_cache_opts() + default values apply).

    +
    + + ]]> + +

    mibs_cache_opt() = {autogc, mibs_cache_autogc()} | {gclimit, mibs_cache_gclimit()} | {age, mibs_cache_age()}

    +

    Defines options specific for the SNMP agent mib server cache.

    +

    For defaults see the options in mibs_cache_opt().

    +
    + + ]]> + +

    Defines if the mib server shall perform cache gc automatically or + leave it to the user (see + gc_mibs_cache/0,1,2,3).

    +

    Default is false.

    +
    + + 0 ]]> + +

    Defines how old the entries in the cache will be allowed before + they are GC'ed (assuming GC is performed). Each entry in the + cache is "touched" whenever it is accessed.

    +

    The age is defined in milliseconds.

    +

    Default is 10 timutes.

    +
    + + 0 | infinity ]]> + +

    When performing a GC, this is the max number of cache entries + that will be deleted from the cache.

    +

    The reason for having this limit is that if the cache is + large, the GC can potentially take a long time, during which + the agent is locked.

    +

    Default is 100.

    ]]> @@ -400,32 +439,38 @@

    Time in milli-seconds.

    Default is 30000.

    + ]]>

    manager_config_opt() = {dir, manager_config_dir()} | {db_dir, manager_db_dir()} | {db_init_error, db_init_error()} | {repair, manager_repair()} | {auto_save, manager_auto_save()} | {verbosity, verbosity()}

    Defines specific config related options for the SNMP manager.

    For defaults see the options in manager_config_opt().

    + ]]>

    Defines where the SNMP manager configuration files are stored.

    + ]]>

    Defines where the SNMP manager store persistent data.

    + ]]>

    Defines the repair option for the persistent database (if and how the table is repaired when opened).

    Default is true.

    + ]]>

    The auto save interval. The table is flushed to disk whenever not accessed for this amount of time.

    Default is 5000.

    + ]]>

    This option defines how the manager will handle the sending of @@ -454,27 +499,37 @@ definition of the manager net if for more info.

    Default is auto.

    + ]]>

    Specifies a list of MIBs (including path) and defines which MIBs are initially loaded into the SNMP manager.

    Default is [].

    + ]]> -

    manager_net_if_opt() = {module, manager_net_if_module()} | {verbosity, verbosity()} | {options, manager_net_if_options()}

    +

    manager_net_if_opt() = {module, manager_net_if_module()} | + {verbosity, verbosity()} | + {options, manager_net_if_options()}

    Defines options specific for the SNMP manager network interface entity.

    For defaults see the options in manager_net_if_opt().

    + ]]> -

    manager_net_if_option() = {bind_to, bind_to()} | {sndbuf, sndbuf()} | {recbuf, recbuf()} | {no_reuse, no_reuse()}

    +

    manager_net_if_option() = {bind_to, bind_to()} | + {sndbuf, sndbuf()} | + {recbuf, recbuf()} | + {no_reuse, no_reuse()} | + {filter, manager_net_if_filter_options()}

    These options are actually specific to the used module. The ones shown here are applicable to the default manager_net_if_module().

    For defaults see the options in manager_net_if_option().

    + ]]>

    Module which handles the network interface part for the @@ -482,12 +537,32 @@ snmpm_network_interface behaviour.

    Default is snmpm_net_if.

    + + ]]> + +

    manager_net_if_filter_option() = {module, manager_net_if_filter_module()}

    +

    These options are actually specific to the used module. + The ones shown here are applicable to the default + .

    +

    For defaults see the options in + manager_net_if_filter_option().

    +
    + + ]]> + +

    Module which handles the network interface filter part for the + SNMP manager. Must implement the + snmpm_network_interface_filter behaviour.

    +

    Default is snmpm_net_if_filter.

    +
    + ]]>

    The module implementing the default user. See the snmpm_user behaviour.

    Default is snmpm_user_default.

    + ]]>

    Data for the default user. Passed to the user module when @@ -495,6 +570,7 @@

    Default is undefined.

    +

    Common config types:

    restart_type() = permanent | transient | temporary diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmpa.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmpa.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmpa.xml 2009-06-05 13:55:54.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmpa.xml 2009-09-18 15:13:13.000000000 +0100 @@ -588,6 +588,7 @@ + me_of(Oid) -> {ok, Me} | {error, Reason} me_of(Agent, Oid) -> {ok, Me} | {error, Reason} @@ -604,10 +605,141 @@ <Oid for var>.0 and if it is a table, Oid must be <table>.<entry>.<col>.<any>

    + + +
    + + + invalidate_mibs_cache() -> void() + invalidate_mibs_cache(Agent) -> void() + Invalidate the mib server cache + + Agent = pid() | atom() + + +

    Invalidate the mib server cache.

    +

    The entire contents of the cache will be deleted.

    + + +
    +
    + + + enable_mibs_cache() -> void() + enable_mibs_cache(Agent) -> void() + Enable the mib server cache + + Agent = pid() | atom() + + +

    Enable the mib server cache.

    + + +
    +
    + + + disable_mibs_cache() -> void() + disable_mibs_cache(Agent) -> void() + Disable the mib server cache + + Agent = pid() | atom() + + +

    Disable the mib server cache.

    + + +
    +
    + + + gc_mibs_cache() -> {ok, NumElementsGCed} | {error, Reason} + gc_mibs_cache(Agent) -> {ok, NumElementsGCed} | {error, Reason} + gc_mibs_cache(Age) -> {ok, NumElementsGCed} | {error, Reason} + gc_mibs_cache(Agent, Age) -> {ok, NumElementsGCed} | {error, Reason} + gc_mibs_cache(Age, GcLimit) -> {ok, NumElementsGCed} | {error, Reason} + gc_mibs_cache(Agent, Age, GcLimit) -> {ok, NumElementsGCed} | {error, Reason} + Perform mib server cache gc + + Agent = pid() | atom() + Age = integer() > 0 + GcLimit = integer() > 0 | infinity + NumElementsGCed = integer() >= 0 + Reason = term() + + +

    Perform mib server cache gc.

    +

    Manually performs a mib server cache gc. + This can be done regardless of the value of the + autogc option. + The NumElementsGCed value indicates how many + elements where actually removed from the cache.

    + + +
    +
    + + + enable_mibs_cache_autogc() -> void() + enable_mibs_cache_autogc(Agent) -> void() + Enable automatic gc of the mib server cache + + Agent = pid() | atom() + + +

    Enable automatic gc of the mib server cache.

    + + +
    +
    + + + disable_mibs_cache_autogc() -> void() + disable_mibs_cache_autogc(Agent) -> void() + Disable automatic gc of the mib server cache + + Agent = pid() | atom() + + +

    Disable automatic gc of the mib server cache.

    + + +
    +
    + + + update_mibs_cache_age(NewAge) -> ok | {error, Reason} + update_mibs_cache_age(Agent, NewAge) -> ok | {error, Reason} + Change the mib server cache age property + + Agent = pid() | atom() + NewAge = integer() > 0 + Reason = term() + + +

    Change the mib server cache age property.

    + + +
    +
    + + + update_mibs_cache_gclimit(NewGcLimit) -> ok | {error, Reason} + update_mibs_cache_gclimit(Agent, NewGCLimit) -> ok | {error, Reason} + Change the mib server cache gclimit property + + Agent = pid() | atom() + NewGcLimit = integer() > 0 | infinity + Reason = term() + + +

    Change the mib server cache gclimit property.

    +
    + register_notification_filter(Id, Mod, Data) -> ok | {error, Reason} register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason} @@ -984,12 +1116,13 @@ - discovery(TargetName, Notification) -> ok | {ok, ManagerEngineID} | {error, Reason} - discovery(TargetName, Notification, Varbinds) -> ok | {ok, ManagerEngineID} | {error, Reason} - discovery(TargetName, Notification, DiscoHandler) -> ok | {ok, ManagerEngineID} | {error, Reason} - discovery(TargetName, Notification, ContextName, Varbinds) -> ok | {ok, ManagerEngineID} | {error, Reason} - discovery(TargetName, Notification, Varbinds, DiscoHandler) -> ok | {ok, ManagerEngineID} | {error, Reason} - discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler) -> ok | {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, Varbinds) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, DiscoHandler) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, ContextName, Varbinds) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, Varbinds, DiscoHandler) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler, ExtraInfo) -> {ok, ManagerEngineID} | {error, Reason} Initiate the discovery process with a manager TargetName = string() @@ -998,6 +1131,7 @@ Varbinds = varbinds() varbinds() = [varbind()] DiscoHandler = snmpa_discovery_handler() + ExtraInfo = term() snmpa_discovery_handler() = Module implementing the snmpa_discovery_handler behaviour ManagerEngineID = string() varbind() = {Variable, Value} | {Column, RowIndex, Value} | {OID, Value} @@ -1020,11 +1154,8 @@ discovery handler for more info.

    -

    In case the - stage1_finish - function returns ignore then the discovery will - return {ok, ManagerEngineID} for a successfull discovery. - eitherwise ok is returned.

    +

    The ExtraInfo argument is passed on to the callback functions + of the DiscoHandler.

    If we are not at security-level noAuthNoPriv, this could be complicated, since the agent will then continue diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_config.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_config.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_config.xml 2009-06-05 13:55:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_config.xml 2009-11-20 13:36:06.000000000 +0000 @@ -78,6 +78,8 @@ defined in an Erlang system configuration file. The following configuration parameters are defined for the SNMP application:

    + +
           agent_options() = [agent_option()]
           agent_option() = {restart_type,     restart_type()}     | 
    @@ -140,7 +142,8 @@
           
             

    agent_terminating_discovery_opt() = {enable, boolean()} | - {stage2, discovery | plain}

    + {stage2, discovery | plain} | + {trigger_username, string()}

    These are options effecting discovery terminating in this agent (i.e. initiated by a manager).

    The default values for the terminating @@ -148,6 +151,7 @@ enable: true stage2: discovery + trigger_username: "" @@ -320,10 +324,45 @@

    Default is false.

    - ]]> + ]]>

    Shall the agent utilize the mib server lookup cache or not.

    -

    Default is true.

    +

    Default is true (in which case the mibs_cache_opts() + default values apply).

    +
    + + ]]> + +

    mibs_cache_opt() = {autogc, mibs_cache_autogc()} | {gclimit, mibs_cache_gclimit()} | {age, mibs_cache_age()}

    +

    Defines options specific for the SNMP agent mib server cache.

    +

    For defaults see the options in mibs_cache_opt().

    +
    + + ]]> + +

    Defines if the mib server shall perform cache gc automatically or + leave it to the user (see + gc_mibs_cache/0,1,2,3).

    +

    Default is false.

    +
    + + 0 ]]> + +

    Defines how old the entries in the cache will be allowed before + they are GC'ed (assuming GC is performed). Each entry in the + cache is "touched" whenever it is accessed.

    +

    The age is defined in milliseconds.

    +

    Default is 10 timutes.

    +
    + + 0 | infinity ]]> + +

    When performing a GC, this is the max number of cache entries + that will be deleted from the cache.

    +

    The reason for having this limit is that if the cache is + large, the GC can potentially take a long time, during which + the agent is locked.

    +

    Default is 100.

    ]]> @@ -468,7 +507,9 @@ ]]> -

    manager_net_if_opt() = {module, manager_net_if_module()} | {verbosity, verbosity()} | {options, manager_net_if_options()}

    +

    manager_net_if_opt() = {module, manager_net_if_module()} | + {verbosity, verbosity()} | + {options, manager_net_if_options()}

    Defines options specific for the SNMP manager network interface entity.

    For defaults see the options in manager_net_if_opt().

    @@ -476,7 +517,11 @@ ]]> -

    manager_net_if_option() = {bind_to, bind_to()} | {sndbuf, sndbuf()} | {recbuf, recbuf()} | {no_reuse, no_reuse()}

    +

    manager_net_if_option() = {bind_to, bind_to()} | + {sndbuf, sndbuf()} | + {recbuf, recbuf()} | + {no_reuse, no_reuse()} | + {filter, manager_net_if_filter_options()}

    These options are actually specific to the used module. The ones shown here are applicable to the default manager_net_if_module().

    @@ -491,6 +536,24 @@

    Default is snmpm_net_if.

    + ]]> + +

    manager_net_if_filter_option() = {module, manager_net_if_filter_module()}

    +

    These options are actually specific to the used module. + The ones shown here are applicable to the default + .

    +

    For defaults see the options in + manager_net_if_filter_option().

    +
    + + ]]> + +

    Module which handles the network interface filter part for the + SNMP manager. Must implement the + snmpm_network_interface_filter behaviour.

    +

    Default is snmpm_net_if_filter.

    +
    + ]]>

    The module implementing the default user. See the @@ -862,7 +925,7 @@ 6> %% Example of output from the agent when a get-next-request arrives: ** SNMP NET-IF LOG: - got paket from {147,12,12,12}:5000 + got packet from {147,12,12,12}:5000 ** SNMP NET-IF MPD LOG: v1, community: all-rights @@ -891,27 +954,27 @@ -

    info is used to retreive a list of miscellaneous agent information.

    +

    info is used to retrieve a list of miscellaneous agent information.

    -

    which_aliasnames is used to retreive a list of all alias-names known to the agent.

    +

    which_aliasnames is used to retrieve a list of all alias-names known to the agent.

    -

    which_tables is used to retreive a list of all (MIB) tables known to the agent.

    +

    which_tables is used to retrieve a list of all (MIB) tables known to the agent.

    -

    which_variables is used to retreive a list of all (MIB) variables known to the agent.

    +

    which_variables is used to retrieve a list of all (MIB) variables known to the agent.

    -

    which_notifications is used to retreive a list of all (MIB) notifications/traps known to the agent.

    +

    which_notifications is used to retrieve a list of all (MIB) notifications/traps known to the agent.

    @@ -931,6 +994,37 @@
    +

    Another usefull way to debug the agent is to pretty-print the content of + some of the (MIB-) tables handled directly by the agent. This can be done + for the following tables:

    + + + +

    +
    + + + +

    +
    + + + +

    +
    + + + +

    +
    + + + +

    +
    + +
    +
    diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_instr_functions.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_instr_functions.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_instr_functions.xml 2009-03-12 12:28:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_instr_functions.xml 2009-11-20 13:36:07.000000000 +0000 @@ -197,7 +197,7 @@ rows. The instrumentation function for this table is called my_table.

    - + Contents of my_table @@ -227,7 +227,7 @@

    - + GetNext from [3,1,1] and [5,1,1].

    The manager now issues the following getNext request: @@ -250,7 +250,7 @@

    - + GetNext from [3,2,1] and [5,2,1].

    The manager now issues the following getNext request: @@ -273,7 +273,7 @@

    - + GetNext from [3,1,2] and [4,1,2].

    The manager now issues the following getNext request: diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_intro.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_intro.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_intro.xml 2009-03-12 12:28:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_intro.xml 2009-11-20 13:36:07.000000000 +0000 @@ -155,7 +155,7 @@ Agent An agent responds to commands from the manager, and sends notification to the manager. There are potentially many agents - in a systrem. + in a system. diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_manager_funct_descr.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_manager_funct_descr.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_manager_funct_descr.xml 2009-03-12 12:31:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_manager_funct_descr.xml 2009-11-20 13:37:30.000000000 +0000 @@ -106,7 +106,7 @@ MIB loading

    It is possible to load mibs into the manager, but this is not - necessary for normal operation, and not recomended.

    + necessary for normal operation, and not recommended.

    diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_manager_netif.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_manager_netif.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmp_manager_netif.xml 2009-03-12 12:31:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmp_manager_netif.xml 2009-11-20 13:37:30.000000000 +0000 @@ -32,7 +32,7 @@ snmp_manager_netif.xml

    - + The Purpose of Manager Net if

    The Network Interface (Net if) process delivers SNMP PDUs to the diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmpm_network_interface_filter.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmpm_network_interface_filter.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmpm_network_interface_filter.xml 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmpm_network_interface_filter.xml 2009-11-20 08:48:39.000000000 +0000 @@ -0,0 +1,158 @@ + + + + +

    + + 20072009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpm_network_interface_filter + + + + + + + + snmpm_network_interface_filter.xml +
    + snmpm_network_interface_filter + Behaviour module for the SNMP manager network-interface filter. + +

    This module defines the behaviour of the manager network interface + filter. A snmpm_network_interface_filter compliant module + must export the following functions:

    + + +

    accept_recv/2

    +
    + +

    accept_send/2

    +
    + +

    accept_recv_pdu/3

    +
    + +

    accept_send_pdu/2

    +
    +
    +

    The semantics of them and their exact signatures are explained + below.

    +

    The purpose of the network interface filter is to allow for filtering + of messages (accept or reject) receive and send. This is done + on two levels:

    + + +

    The first level is at the UDP entry / exit point, i.e. + immediately after the receipt of the message, before any message + processing is done (accept_recv) and + immediately before sending the message, after all message + processing is done (accept_send).

    +
    + +

    The second level is at the MPD entry / exit point, i.e. + immediately after the basic message processing (accept_recv_pdu) / + immediately before the basic message processing (accept_send_pdu).

    +
    +
    +

    Note that the network interface filter is something which is used + by the network interface implementation provided by the application + (snmpm_net_if). The default filter accepts all messages.

    +

    A network interface filter can e.g. be used during testing or for load + regulation.

    +
    + +
    + DATA TYPES + +port() = integer() > 0 +pdu_type() = 'get-request' | 'get-next-request' | 'get-response' | 'set-request' | trap | 'get-bulk-request' | 'inform-request' | report | trappdu + + +
    + + + + accept_recv(Addr, Port) -> boolean() + Shall the received message be accepted + + Addr = ip_address() + Port = port() + + +

    Called at the reception of a message (before any processing + has been done).

    +

    For the message to be rejected, the function must return + false.

    + +
    +
    + + + accept_send(Addr, Port) -> boolean() + Shall the message be sent + + Addr = ip_address() + Port = port() + + +

    Called before the sending of a message (after all processing + has been done).

    +

    For the message to be rejected, the function must return + false.

    + +
    +
    + + + accept_recv_pdu(Addr, Port, PduType) -> boolean() + Shall the received pdu be accepted + + Addr = ip_address() + Port = port() + PduType = pdu_type() + + +

    Called after the basic message processing (MPD) has been done, + but before the pdu is handed over to the server for primary + processing.

    +

    For the pdu to be rejected, the function must return + false.

    + +
    +
    + + + accept_send_pdu(Addr, Port, PduType) -> boolean() + Shall the pdu be sent + + Addr = ip_address() + Port = port() + PduType = pdu_type() > 0 + + +

    Called before the basic message processing (MPD) is done, + when a pdu has been received from the master-agent.

    +

    For the message to be rejected, the function must return + false.

    +
    +
    +
    + + + diff -Nru erlang-13.b.1-dfsg/lib/snmp/doc/src/snmpm_user.xml erlang-13.b.3-dfsg/lib/snmp/doc/src/snmpm_user.xml --- erlang-13.b.1-dfsg/lib/snmp/doc/src/snmpm_user.xml 2009-03-12 12:31:50.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/doc/src/snmpm_user.xml 2009-11-20 13:37:31.000000000 +0000 @@ -97,12 +97,13 @@ - handle_agent(Addr, Port, SnmpInfo, UserData) -> Reply + handle_agent(Addr, Port, Type, SnmpInfo, UserData) -> Reply Handle agent Addr = ip_address() Port = integer() - SnmpInfo = {ErrorStatus, ErrorIndex, Varbinds} + Type = pdu | trap | report | inform + SnmpInfo = SnmpPduInfo | SnmpTrapInfo | SnmpReportInfo | SnmpInformInfo ErrorStatus = atom() ErrorIndex = integer() Varbinds = [varbind()] @@ -119,6 +120,33 @@

    Note that this will always be the default user that is called.

    For more info about the agent_info(), see register_agent.

    + +

    The arguments Type and SnmpInfo relates in the + following way:

    + + + +

    pdu - SnmpPduInfo + (see handle_pdu + for more info).

    +
    + +

    trap - SnmpTrapInfo + (see handle_trap + for more info).

    +
    + +

    report - SnmpReportInfo + (see handle_report + for more info).

    +
    + +

    inform - SnmpInformInfo + (see handle_inform + for more info).

    +
    +
    +

    The only user which would return {register, UserId, TargetName, agent_info()} is the default user.

    @@ -128,12 +156,12 @@
    - handle_pdu(TargetName, ReqId, SnmpResponse, UserData) -> Reply - Handle the reply to an asynchroneous request + handle_pdu(TargetName, ReqId, SnmpPduInfo, UserData) -> Reply + Handle the reply to an asynchronous request TargetName = target_name() ReqId = term() - SnmpResponse = {ErrorStatus, ErrorIndex, Varbinds} + SnmpPduInfo = {ErrorStatus, ErrorIndex, Varbinds} ErrorStatus = atom() ErrorIndex = integer() Varbinds = [varbind()] @@ -142,12 +170,12 @@ Reply = ignore -

    Handle the reply to an asynchroneous request, such as +

    Handle the reply to an asynchronous request, such as async_get, async_get_next or async_set.

    It could also be a late reply to a synchronous request.

    -

    ReqId is returned by the asynchroneous request function.

    +

    ReqId is returned by the asynchronous request function.

    @@ -185,11 +213,11 @@
    - handle_inform(TargetName, SnmpInfo, UserData) -> Reply + handle_inform(TargetName, SnmpInformInfo, UserData) -> Reply Handle a inform message TargetName = TargetName2 = target_name() - SnmpInfo = {ErrorStatus, ErrorIndex, Varbinds} + SnmpInformInfo = {ErrorStatus, ErrorIndex, Varbinds} ErrorStatus = atom() ErrorIndex = integer() Varbinds = [varbind()] @@ -210,20 +238,20 @@ inform request behaviour configuration option is set to user or {user, integer()}, the response (acknowledgment) to this - inform-request will be sent when this function returnes.

    + inform-request will be sent when this function returns.

    - handle_report(TargetName, SnmpInfo, UserData) -> Reply + handle_report(TargetName, SnmpReportInfo, UserData) -> Reply Handle a report message TargetName = TargetName2 = target_name() Addr = ip_address() Port = integer() - SnmpInfo = {ErrorStatus, ErrorIndex, Varbinds} + SnmpReportInfo = {ErrorStatus, ErrorIndex, Varbinds} ErrorStatus = atom() ErrorIndex = integer() Varbinds = [varbind()] diff -Nru erlang-13.b.1-dfsg/lib/snmp/include/snmp_types.hrl erlang-13.b.3-dfsg/lib/snmp/include/snmp_types.hrl --- erlang-13.b.1-dfsg/lib/snmp/include/snmp_types.hrl 2009-03-12 12:27:40.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/include/snmp_types.hrl 2009-09-18 15:12:13.000000000 +0100 @@ -115,7 +115,8 @@ %% defval is a default value for the variable %%----------------------------------------------------------------- -record(variable_info, - {defval + { + defval } ). @@ -124,7 +125,7 @@ %% MibEntry %% aliasname is the name for the oid. %% asn1_type is a record of asn1_type. -%% entrytype: variable | table | tableColumn | internal +%% entrytype: variable | table | table_column | internal %% access: notAccessible | readOnly | readWrite | readCreate (see rfc 1142) %% assocList: list of %% {table_info, #table_info} when entrytype == table @@ -134,19 +135,21 @@ %% description: DESCRIPTIONS field %%---------------------------------------------------------------------- -record(me, - {oid, - entrytype, - aliasname, - asn1_type, - access, - mfa, - imported = false, - assocList = [], - description = undefined, - units - } + { + oid, + entrytype, + aliasname, + asn1_type, + access, + mfa, + imported = false, + assocList = [], + description = undefined, + units + } ). + %% oidobjects is a list of {oid, asn1_type} to be sent in the trap %% with the description field included. -record(trap, diff -Nru erlang-13.b.1-dfsg/lib/snmp/mibs/SNMPv2-MIB.mib erlang-13.b.3-dfsg/lib/snmp/mibs/SNMPv2-MIB.mib --- erlang-13.b.1-dfsg/lib/snmp/mibs/SNMPv2-MIB.mib 1997-11-09 22:42:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/mibs/SNMPv2-MIB.mib 2009-11-20 08:48:27.000000000 +0000 @@ -5,40 +5,69 @@ TimeTicks, Counter32, snmpModules, mib-2 FROM SNMPv2-SMI DisplayString, TestAndIncr, TimeStamp + FROM SNMPv2-TC MODULE-COMPLIANCE, OBJECT-GROUP, NOTIFICATION-GROUP FROM SNMPv2-CONF; snmpMIB MODULE-IDENTITY - LAST-UPDATED "9511090000Z" - ORGANIZATION "IETF SNMPv2 Working Group" + LAST-UPDATED "200210160000Z" + ORGANIZATION "IETF SNMPv3 Working Group" CONTACT-INFO - " Marshall T. Rose - - Postal: Dover Beach Consulting, Inc. - 420 Whisman Court - Mountain View, CA 94043-2186 - US + "WG-EMail: snmpv3@lists.tislabs.com + Subscribe: snmpv3-request@lists.tislabs.com - Tel: +1 415 968 1052 - - E-mail: mrose@dbc.mtview.ca.us" - DESCRIPTION - "The MIB module for SNMPv2 entities." - REVISION "9304010000Z" + Co-Chair: Russ Mundy + Network Associates Laboratories + postal: 15204 Omega Drive, Suite 300 + Rockville, MD 20850-4601 + USA + EMail: mundy@tislabs.com + phone: +1 301 947-7107 + + Co-Chair: David Harrington + Enterasys Networks + postal: 35 Industrial Way + P. O. Box 5005 + Rochester, NH 03866-5005 + USA + EMail: dbh@enterasys.com + phone: +1 603 337-2614 + + Editor: Randy Presuhn + BMC Software, Inc. + postal: 2141 North First Street + San Jose, CA 95131 + USA + EMail: randy_presuhn@bmc.com + phone: +1 408 546-1006" + DESCRIPTION + "The MIB module for SNMP entities. + + Copyright (C) The Internet Society (2002). This + version of this MIB module is part of RFC 3418; + see the RFC itself for full legal notices. + " + REVISION "200210160000Z" + DESCRIPTION + "This revision of this MIB module was published as + RFC 3418." + REVISION "199511090000Z" + DESCRIPTION + "This revision of this MIB module was published as + RFC 1907." + REVISION "199304010000Z" DESCRIPTION - "The initial revision of this MIB module was published as - RFC 1450." + "The initial revision of this MIB module was published + as RFC 1450." ::= { snmpModules 1 } - snmpMIBObjects OBJECT IDENTIFIER ::= { snmpMIB 1 } -- ::= { snmpMIBObjects 1 } this OID is obsolete -- ::= { snmpMIBObjects 2 } this OID is obsolete -- ::= { snmpMIBObjects 3 } this OID is obsolete - -- the System group -- -- a collection of objects common to all managed systems. @@ -51,26 +80,25 @@ STATUS current DESCRIPTION "A textual description of the entity. This value should - include the full name and version identification of the - system's hardware type, software operating-system, and - networking software." + include the full name and version identification of + the system's hardware type, software operating-system, + and networking software." ::= { system 1 } sysObjectID OBJECT-TYPE - - SYNTAX OBJECT IDENTIFIER MAX-ACCESS read-only STATUS current DESCRIPTION - "The vendor's authoritative identification of the network - management subsystem contained in the entity. This value is - allocated within the SMI enterprises subtree (1.3.6.1.4.1) - and provides an easy and unambiguous means for determining - `what kind of box' is being managed. For example, if vendor - `Flintstones, Inc.' was assigned the subtree - 1.3.6.1.4.1.4242, it could assign the identifier - 1.3.6.1.4.1.4242.1.1 to its `Fred Router'." + "The vendor's authoritative identification of the + network management subsystem contained in the entity. + This value is allocated within the SMI enterprises + subtree (1.3.6.1.4.1) and provides an easy and + unambiguous means for determining `what kind of box' is + being managed. For example, if vendor `Flintstones, + Inc.' was assigned the subtree 1.3.6.1.4.1.424242, + it could assign the identifier 1.3.6.1.4.1.424242.1.1 + to its `Fred Router'." ::= { system 2 } sysUpTime OBJECT-TYPE @@ -78,8 +106,9 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "The time (in hundredths of a second) since the network - management portion of the system was last re-initialized." + "The time (in hundredths of a second) since the + network management portion of the system was last + re-initialized." ::= { system 3 } sysContact OBJECT-TYPE @@ -87,10 +116,10 @@ MAX-ACCESS read-write STATUS current DESCRIPTION - "The textual identification of the contact person for this - managed node, together with information on how to contact - this person. If no contact information is known, the value - is the zero-length string." + "The textual identification of the contact person for + this managed node, together with information on how + to contact this person. If no contact information is + known, the value is the zero-length string." ::= { system 4 } sysName OBJECT-TYPE @@ -98,10 +127,10 @@ MAX-ACCESS read-write STATUS current DESCRIPTION - "An administratively-assigned name for this managed node. - By convention, this is the node's fully-qualified domain - name. If the name is unknown, the value is the zero-length - string." + "An administratively-assigned name for this managed + node. By convention, this is the node's fully-qualified + domain name. If the name is unknown, the value is + the zero-length string." ::= { system 5 } sysLocation OBJECT-TYPE @@ -109,9 +138,9 @@ MAX-ACCESS read-write STATUS current DESCRIPTION - "The physical location of this node (e.g., `telephone - closet, 3rd floor'). If the location is unknown, the value - is the zero-length string." + "The physical location of this node (e.g., 'telephone + closet, 3rd floor'). If the location is unknown, the + value is the zero-length string." ::= { system 6 } sysServices OBJECT-TYPE @@ -120,16 +149,17 @@ STATUS current DESCRIPTION "A value which indicates the set of services that this - entity may potentially offers. The value is a sum. This - sum initially takes the value zero, Then, for each layer, L, - in the range 1 through 7, that this node performs - transactions for, 2 raised to (L - 1) is added to the sum. - For example, a node which performs only routing functions - would have a value of 4 (2^(3-1)). In contrast, a node - which is a host offering application services would have a - value of 72 (2^(4-1) + 2^(7-1)). Note that in the context - of the Internet suite of protocols, values should be - calculated accordingly: + entity may potentially offer. The value is a sum. + + This sum initially takes the value zero. Then, for + each layer, L, in the range 1 through 7, that this node + performs transactions for, 2 raised to (L - 1) is added + to the sum. For example, a node which performs only + routing functions would have a value of 4 (2^(3-1)). + In contrast, a node which is a host offering application + services would have a value of 72 (2^(4-1) + 2^(7-1)). + Note that in the context of the Internet suite of + protocols, values should be calculated accordingly: layer functionality 1 physical (e.g., repeaters) @@ -138,14 +168,13 @@ 4 end-to-end (e.g., supports the TCP) 7 applications (e.g., supports the SMTP) - For systems including OSI protocols, layers 5 and 6 may also - be counted." + For systems including OSI protocols, layers 5 and 6 + may also be counted." ::= { system 7 } - -- object resource information -- --- a collection of objects which describe the SNMPv2 entity's +-- a collection of objects which describe the SNMP entity's -- (statically and dynamically configurable) support of -- various MIB modules. @@ -163,11 +192,12 @@ MAX-ACCESS not-accessible STATUS current DESCRIPTION - "The (conceptual) table listing the capabilities of the - local SNMPv2 entity acting in an agent role with respect to - various MIB modules. SNMPv2 entities having dynamically- - configurable support of MIB modules will have a - dynamically-varying number of conceptual rows." + "The (conceptual) table listing the capabilities of + the local SNMP application acting as a command + responder with respect to various MIB modules. + SNMP entities having dynamically-configurable support + of MIB modules will have a dynamically-varying number + of conceptual rows." ::= { system 9 } sysOREntry OBJECT-TYPE @@ -191,8 +221,8 @@ MAX-ACCESS not-accessible STATUS current DESCRIPTION - "The auxiliary variable used for identifying instances of - the columnar objects in the sysORTable." + "The auxiliary variable used for identifying instances + of the columnar objects in the sysORTable." ::= { sysOREntry 1 } sysORID OBJECT-TYPE @@ -200,10 +230,10 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "An authoritative identification of a capabilities statement - with respect to various MIB modules supported by the local - SNMPv2 entity acting in an agent role." - + "An authoritative identification of a capabilities + statement with respect to various MIB modules supported + by the local SNMP application acting as a command + responder." ::= { sysOREntry 2 } sysORDescr OBJECT-TYPE @@ -211,8 +241,8 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "A textual description of the capabilities identified by the - corresponding instance of sysORID." + "A textual description of the capabilities identified + by the corresponding instance of sysORID." ::= { sysOREntry 3 } sysORUpTime OBJECT-TYPE @@ -220,11 +250,10 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "The value of sysUpTime at the time this conceptual row was - last instanciated." + "The value of sysUpTime at the time this conceptual + row was last instantiated." ::= { sysOREntry 4 } - -- the SNMP group -- -- a collection of objects providing basic instrumentation and @@ -237,8 +266,8 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "The total number of messages delivered to the SNMP entity - from the transport service." + "The total number of messages delivered to the SNMP + entity from the transport service." ::= { snmp 1 } snmpInBadVersions OBJECT-TYPE @@ -246,8 +275,9 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "The total number of SNMP messages which were delivered to - the SNMP entity and were for an unsupported SNMP version." + "The total number of SNMP messages which were delivered + to the SNMP entity and were for an unsupported SNMP + version." ::= { snmp 3 } snmpInBadCommunityNames OBJECT-TYPE @@ -255,9 +285,20 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "The total number of SNMP messages delivered to the SNMP - entity which used a SNMP community name not known to said - entity." + "The total number of community-based SNMP messages (for + example, SNMPv1) delivered to the SNMP entity which + used an SNMP community name not known to said entity. + Also, implementations which authenticate community-based + SNMP messages using check(s) in addition to matching + the community name (for example, by also checking + whether the message originated from a transport address + allowed to use a specified community name) MAY include + in this value the number of messages which failed the + additional check(s). It is strongly RECOMMENDED that + + the documentation for any security model which is used + to authenticate community-based SNMP messages specify + the precise conditions that contribute to this value." ::= { snmp 4 } snmpInBadCommunityUses OBJECT-TYPE @@ -265,9 +306,18 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "The total number of SNMP messages delivered to the SNMP - entity which represented an SNMP operation which was not - allowed by the SNMP community named in the message." + "The total number of community-based SNMP messages (for + example, SNMPv1) delivered to the SNMP entity which + represented an SNMP operation that was not allowed for + the SNMP community named in the message. The precise + conditions under which this counter is incremented + (if at all) depend on how the SNMP entity implements + its access control mechanism and how its applications + interact with that access control mechanism. It is + strongly RECOMMENDED that the documentation for any + access control mechanism which is used to control access + to and visibility of MIB instrumentation specify the + precise conditions that contribute to this value." ::= { snmp 5 } snmpInASNParseErrs OBJECT-TYPE @@ -275,8 +325,8 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "The total number of ASN.1 or BER errors encountered by the - SNMP entity when decoding received SNMP messages." + "The total number of ASN.1 or BER errors encountered by + the SNMP entity when decoding received SNMP messages." ::= { snmp 6 } snmpEnableAuthenTraps OBJECT-TYPE @@ -284,15 +334,16 @@ MAX-ACCESS read-write STATUS current DESCRIPTION - "Indicates whether the SNMP entity is permitted to generate - authenticationFailure traps. The value of this object - overrides any configuration information; as such, it - provides a means whereby all authenticationFailure traps may - be disabled. - - Note that it is strongly recommended that this object be - stored in non-volatile memory so that it remains constant - across re-initializations of the network management system." + "Indicates whether the SNMP entity is permitted to + generate authenticationFailure traps. The value of this + object overrides any configuration information; as such, + it provides a means whereby all authenticationFailure + traps may be disabled. + + Note that it is strongly recommended that this object + be stored in non-volatile memory so that it remains + constant across re-initializations of the network + management system." ::= { snmp 30 } snmpSilentDrops OBJECT-TYPE @@ -300,13 +351,16 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "The total number of GetRequest-PDUs, GetNextRequest-PDUs, - GetBulkRequest-PDUs, SetRequest-PDUs, and InformRequest-PDUs - delivered to the SNMP entity which were silently dropped - because the size of a reply containing an alternate - Response-PDU with an empty variable-bindings field was - greater than either a local constraint or the maximum - message size associated with the originator of the request." + "The total number of Confirmed Class PDUs (such as + GetRequest-PDUs, GetNextRequest-PDUs, + GetBulkRequest-PDUs, SetRequest-PDUs, and + InformRequest-PDUs) delivered to the SNMP entity which + were silently dropped because the size of a reply + containing an alternate Response Class PDU (such as a + Response-PDU) with an empty variable-bindings field + was greater than either a local constraint or the + maximum message size associated with the originator of + the request." ::= { snmp 31 } snmpProxyDrops OBJECT-TYPE @@ -314,32 +368,34 @@ MAX-ACCESS read-only STATUS current DESCRIPTION - "The total number of GetRequest-PDUs, GetNextRequest-PDUs, - GetBulkRequest-PDUs, SetRequest-PDUs, and InformRequest-PDUs - delivered to the SNMP entity which were silently dropped - because the transmission of the (possibly translated) - message to a proxy target failed in a manner (other than a - time-out) such that no Response-PDU could be returned." + "The total number of Confirmed Class PDUs + (such as GetRequest-PDUs, GetNextRequest-PDUs, + GetBulkRequest-PDUs, SetRequest-PDUs, and + InformRequest-PDUs) delivered to the SNMP entity which + were silently dropped because the transmission of + the (possibly translated) message to a proxy target + failed in a manner (other than a time-out) such that + no Response Class PDU (such as a Response-PDU) could + be returned." ::= { snmp 32 } - -- information for notifications -- --- a collection of objects which allow the SNMPv2 entity, when --- acting in an agent role, to be configured to generate --- SNMPv2-Trap-PDUs. +-- a collection of objects which allow the SNMP entity, when +-- supporting a notification originator application, +-- to be configured to generate SNMPv2-Trap-PDUs. snmpTrap OBJECT IDENTIFIER ::= { snmpMIBObjects 4 } - snmpTrapOID OBJECT-TYPE SYNTAX OBJECT IDENTIFIER MAX-ACCESS accessible-for-notify STATUS current DESCRIPTION "The authoritative identification of the notification - currently being sent. This variable occurs as the second - varbind in every SNMPv2-Trap-PDU and InformRequest-PDU." + currently being sent. This variable occurs as + the second varbind in every SNMPv2-Trap-PDU and + InformRequest-PDU." ::= { snmpTrap 1 } -- ::= { snmpTrap 2 } this OID is obsolete @@ -350,14 +406,14 @@ STATUS current DESCRIPTION "The authoritative identification of the enterprise - associated with the trap currently being sent. When a - SNMPv2 proxy agent is mapping an RFC1157 Trap-PDU into a - SNMPv2-Trap-PDU, this variable occurs as the last varbind." + associated with the trap currently being sent. When an + SNMP proxy agent is mapping an RFC1157 Trap-PDU + into a SNMPv2-Trap-PDU, this variable occurs as the + last varbind." ::= { snmpTrap 3 } -- ::= { snmpTrap 4 } this OID is obsolete - -- well-known traps snmpTraps OBJECT IDENTIFIER ::= { snmpMIBObjects 5 } @@ -365,60 +421,62 @@ coldStart NOTIFICATION-TYPE STATUS current DESCRIPTION - "A coldStart trap signifies that the SNMPv2 entity, acting - in an agent role, is reinitializing itself and that its - configuration may have been altered." + "A coldStart trap signifies that the SNMP entity, + supporting a notification originator application, is + reinitializing itself and that its configuration may + have been altered." ::= { snmpTraps 1 } warmStart NOTIFICATION-TYPE STATUS current DESCRIPTION - "A warmStart trap signifies that the SNMPv2 entity, acting - in an agent role, is reinitializing itself such that its - configuration is unaltered." + "A warmStart trap signifies that the SNMP entity, + supporting a notification originator application, + is reinitializing itself such that its configuration + is unaltered." ::= { snmpTraps 2 } -- Note the linkDown NOTIFICATION-TYPE ::= { snmpTraps 3 } -- and the linkUp NOTIFICATION-TYPE ::= { snmpTraps 4 } --- are defined in RFC 1573 +-- are defined in RFC 2863 [RFC2863] authenticationFailure NOTIFICATION-TYPE STATUS current DESCRIPTION - "An authenticationFailure trap signifies that the SNMPv2 - entity, acting in an agent role, has received a protocol - message that is not properly authenticated. While all - implementations of the SNMPv2 must be capable of generating - this trap, the snmpEnableAuthenTraps object indicates - whether this trap will be generated." + "An authenticationFailure trap signifies that the SNMP + entity has received a protocol message that is not + properly authenticated. While all implementations + of SNMP entities MAY be capable of generating this + trap, the snmpEnableAuthenTraps object indicates + whether this trap will be generated." ::= { snmpTraps 5 } --- Note the egpNeighborLoss NOTIFICATION-TYPE ::= { snmpTraps 6 } --- is defined in RFC 1213 +-- Note the egpNeighborLoss notification is defined +-- as { snmpTraps 6 } in RFC 1213 + -- the set group -- -- a collection of objects which allow several cooperating --- SNMPv2 entities, all acting in a manager role, to --- coordinate their use of the SNMPv2 set operation. +-- command generator applications to coordinate their use of the +-- set operation. snmpSet OBJECT IDENTIFIER ::= { snmpMIBObjects 6 } - snmpSetSerialNo OBJECT-TYPE SYNTAX TestAndIncr MAX-ACCESS read-write STATUS current DESCRIPTION - "An advisory lock used to allow several cooperating SNMPv2 - entities, all acting in a manager role, to coordinate their - use of the SNMPv2 set operation. - - This object is used for coarse-grain coordination. To - achieve fine-grain coordination, one or more similar objects - might be defined within each MIB group, as appropriate." + "An advisory lock used to allow several cooperating + command generator applications to coordinate their + use of the SNMP set operation. + + This object is used for coarse-grain coordination. + To achieve fine-grain coordination, one or more similar + objects might be defined within each MIB group, as + appropriate." ::= { snmpSet 1 } - -- conformance information snmpMIBConformance @@ -428,16 +486,17 @@ OBJECT IDENTIFIER ::= { snmpMIBConformance 1 } snmpMIBGroups OBJECT IDENTIFIER ::= { snmpMIBConformance 2 } - -- compliance statements -- ::= { snmpMIBCompliances 1 } this OID is obsolete - snmpBasicCompliance MODULE-COMPLIANCE - STATUS current + STATUS deprecated DESCRIPTION "The compliance statement for SNMPv2 entities which - implement the SNMPv2 MIB." + implement the SNMPv2 MIB. + + This compliance statement is replaced by + snmpBasicComplianceRev2." MODULE -- this module MANDATORY-GROUPS { snmpGroup, snmpSetGroup, systemGroup, snmpBasicNotificationsGroup } @@ -446,15 +505,36 @@ DESCRIPTION "This group is mandatory for SNMPv2 entities which support community-based authentication." - ::= { snmpMIBCompliances 2 } +snmpBasicComplianceRev2 MODULE-COMPLIANCE + STATUS current + DESCRIPTION + "The compliance statement for SNMP entities which + implement this MIB module." + MODULE -- this module + MANDATORY-GROUPS { snmpGroup, snmpSetGroup, systemGroup, + snmpBasicNotificationsGroup } + + GROUP snmpCommunityGroup + DESCRIPTION + "This group is mandatory for SNMP entities which + support community-based authentication." + + GROUP snmpWarmStartNotificationGroup + DESCRIPTION + "This group is mandatory for an SNMP entity which + supports command responder applications, and is + able to reinitialize itself such that its + configuration is unaltered." + ::= { snmpMIBCompliances 3 } -- units of conformance -- ::= { snmpMIBGroups 1 } this OID is obsolete -- ::= { snmpMIBGroups 2 } this OID is obsolete -- ::= { snmpMIBGroups 3 } this OID is obsolete + -- ::= { snmpMIBGroups 4 } this OID is obsolete snmpGroup OBJECT-GROUP @@ -466,8 +546,8 @@ snmpEnableAuthenTraps } STATUS current DESCRIPTION - "A collection of objects providing basic instrumentation and - control of an SNMPv2 entity." + "A collection of objects providing basic instrumentation + and control of an SNMP entity." ::= { snmpMIBGroups 8 } snmpCommunityGroup OBJECT-GROUP @@ -475,8 +555,8 @@ snmpInBadCommunityUses } STATUS current DESCRIPTION - "A collection of objects providing basic instrumentation of - a SNMPv2 entity which supports community-based + "A collection of objects providing basic instrumentation + of a SNMP entity which supports community-based authentication." ::= { snmpMIBGroups 9 } @@ -485,8 +565,8 @@ STATUS current DESCRIPTION "A collection of objects which allow several cooperating - SNMPv2 entities, all acting in a manager role, to coordinate - their use of the SNMPv2 set operation." + command generator applications to coordinate their + use of the set operation." ::= { snmpMIBGroups 5 } systemGroup OBJECT-GROUP @@ -505,26 +585,26 @@ NOTIFICATIONS { coldStart, authenticationFailure } STATUS current DESCRIPTION - "The two notifications which an SNMPv2 entity is required to - implement." + "The basic notifications implemented by an SNMP entity + supporting command responder applications." ::= { snmpMIBGroups 7 } --- mbj added to make compileable -snmpAdvancedNotificationsGroup NOTIFICATION-GROUP - NOTIFICATIONS { warmStart } - STATUS current - DESCRIPTION - "" - ::= { snmpMIBGroups 0 } +snmpWarmStartNotificationGroup NOTIFICATION-GROUP + NOTIFICATIONS { warmStart } + STATUS current + DESCRIPTION + "An additional notification for an SNMP entity supporting + command responder applications, if it is able to reinitialize + itself such that its configuration is unaltered." + ::= { snmpMIBGroups 11 } --- mbj added to make compileable -snmpTrapGroup OBJECT-GROUP +snmpNotificationGroup OBJECT-GROUP OBJECTS { snmpTrapOID, snmpTrapEnterprise } STATUS current DESCRIPTION - "" - ::= { snmpMIBGroups 0 } - + "These objects are required for entities + which support notification originator applications." + ::= { snmpMIBGroups 12 } -- definitions in RFC 1213 made obsolete by the inclusion of a -- subset of the snmp group in this MIB @@ -548,7 +628,7 @@ DESCRIPTION "The total number of SNMP PDUs which were delivered to the SNMP protocol entity and for - which the value of the error-status field is + which the value of the error-status field was `tooBig'." ::= { snmp 8 } @@ -559,7 +639,7 @@ DESCRIPTION "The total number of SNMP PDUs which were delivered to the SNMP protocol entity and for - which the value of the error-status field is + which the value of the error-status field was `noSuchName'." ::= { snmp 9 } @@ -570,7 +650,7 @@ DESCRIPTION "The total number of SNMP PDUs which were delivered to the SNMP protocol entity and for - which the value of the error-status field is + which the value of the error-status field was `badValue'." ::= { snmp 10 } @@ -579,15 +659,14 @@ MAX-ACCESS read-only STATUS obsolete DESCRIPTION - "The total number valid SNMP PDUs which were - delivered to the SNMP protocol entity and for - which the value of the error-status field is - `readOnly'. It should be noted that it is a - protocol error to generate an SNMP PDU which - contains the value `readOnly' in the error-status - field, as such this object is provided as a means - of detecting incorrect implementations of the - SNMP." + "The total number valid SNMP PDUs which were delivered + to the SNMP protocol entity and for which the value + of the error-status field was `readOnly'. It should + be noted that it is a protocol error to generate an + SNMP PDU which contains the value `readOnly' in the + error-status field, as such this object is provided + as a means of detecting incorrect implementations of + the SNMP." ::= { snmp 11 } snmpInGenErrs OBJECT-TYPE @@ -595,10 +674,9 @@ MAX-ACCESS read-only STATUS obsolete DESCRIPTION - "The total number of SNMP PDUs which were - delivered to the SNMP protocol entity and for - which the value of the error-status field is - `genErr'." + "The total number of SNMP PDUs which were delivered + to the SNMP protocol entity and for which the value + of the error-status field was `genErr'." ::= { snmp 12 } snmpInTotalReqVars OBJECT-TYPE @@ -618,9 +696,8 @@ STATUS obsolete DESCRIPTION "The total number of MIB objects which have been - altered successfully by the SNMP protocol entity - as the result of receiving valid SNMP Set-Request - PDUs." + altered successfully by the SNMP protocol entity as + the result of receiving valid SNMP Set-Request PDUs." ::= { snmp 14 } snmpInGetRequests OBJECT-TYPE @@ -638,9 +715,8 @@ MAX-ACCESS read-only STATUS obsolete DESCRIPTION - "The total number of SNMP Get-Next PDUs which have - been accepted and processed by the SNMP protocol - entity." + "The total number of SNMP Get-Next PDUs which have been + accepted and processed by the SNMP protocol entity." ::= { snmp 16 } snmpInSetRequests OBJECT-TYPE @@ -649,8 +725,8 @@ STATUS obsolete DESCRIPTION "The total number of SNMP Set-Request PDUs which - have been accepted and processed by the SNMP - protocol entity." + have been accepted and processed by the SNMP protocol + entity." ::= { snmp 17 } snmpInGetResponses OBJECT-TYPE @@ -659,8 +735,8 @@ STATUS obsolete DESCRIPTION "The total number of SNMP Get-Response PDUs which - have been accepted and processed by the SNMP - protocol entity." + have been accepted and processed by the SNMP protocol + entity." ::= { snmp 18 } snmpInTraps OBJECT-TYPE @@ -668,9 +744,8 @@ MAX-ACCESS read-only STATUS obsolete DESCRIPTION - "The total number of SNMP Trap PDUs which have - been accepted and processed by the SNMP protocol - entity." + "The total number of SNMP Trap PDUs which have been + accepted and processed by the SNMP protocol entity." ::= { snmp 19 } snmpOutTooBigs OBJECT-TYPE @@ -678,10 +753,9 @@ MAX-ACCESS read-only STATUS obsolete DESCRIPTION - "The total number of SNMP PDUs which were - generated by the SNMP protocol entity and for - which the value of the error-status field is - `tooBig.'" + "The total number of SNMP PDUs which were generated + by the SNMP protocol entity and for which the value + of the error-status field was `tooBig.'" ::= { snmp 20 } snmpOutNoSuchNames OBJECT-TYPE @@ -689,10 +763,9 @@ MAX-ACCESS read-only STATUS obsolete DESCRIPTION - "The total number of SNMP PDUs which were - generated by the SNMP protocol entity and for - which the value of the error-status is - `noSuchName'." + "The total number of SNMP PDUs which were generated + by the SNMP protocol entity and for which the value + of the error-status was `noSuchName'." ::= { snmp 21 } snmpOutBadValues OBJECT-TYPE @@ -700,13 +773,11 @@ MAX-ACCESS read-only STATUS obsolete DESCRIPTION - "The total number of SNMP PDUs which were - generated by the SNMP protocol entity and for - which the value of the error-status field is - `badValue'." + "The total number of SNMP PDUs which were generated + by the SNMP protocol entity and for which the value + of the error-status field was `badValue'." ::= { snmp 22 } - -- { snmp 23 } is not used snmpOutGenErrs OBJECT-TYPE @@ -714,10 +785,9 @@ MAX-ACCESS read-only STATUS obsolete DESCRIPTION - "The total number of SNMP PDUs which were - generated by the SNMP protocol entity and for - which the value of the error-status field is - `genErr'." + "The total number of SNMP PDUs which were generated + by the SNMP protocol entity and for which the value + of the error-status field was `genErr'." ::= { snmp 24 } snmpOutGetRequests OBJECT-TYPE @@ -771,13 +841,14 @@ snmpInTotalReqVars, snmpInTotalSetVars, snmpInGetRequests, snmpInGetNexts, snmpInSetRequests, snmpInGetResponses, snmpInTraps, snmpOutTooBigs, - snmpOutNoSuchNames, snmpOutBadValues, snmpOutGenErrs, - snmpOutGetRequests, snmpOutGetNexts, snmpOutSetRequests, - snmpOutGetResponses, snmpOutTraps } + snmpOutNoSuchNames, snmpOutBadValues, + snmpOutGenErrs, snmpOutGetRequests, snmpOutGetNexts, + snmpOutSetRequests, snmpOutGetResponses, snmpOutTraps + } STATUS obsolete DESCRIPTION - "A collection of objects from RFC 1213 made obsolete by this - MIB." + "A collection of objects from RFC 1213 made obsolete + by this MIB module." ::= { snmpMIBGroups 10 } END diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_agent.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_agent.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_agent.erl 2009-06-05 13:54:53.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_agent.erl 2009-11-20 08:48:23.000000000 +0000 @@ -36,17 +36,23 @@ which_notification_filter/1, get_net_if/1]). -export([ - discovery/5, + discovery/6, is_originating_discovery_enabled/0, is_terminating_discovery_enabled/0, - terminating_discovery_stage2/0 + terminating_discovery_stage2/0, + terminating_trigger_username/0 ]). -export([verbosity/2, dump_mibs/1, dump_mibs/2]). -export([validate_err/3, make_value_a_correct_value/3, do_get/3, do_get/4, get/2, get/3, get_next/2, get_next/3]). -export([mib_of/1, mib_of/2, me_of/1, me_of/2, - invalidate_mibs_cache/1]). + invalidate_mibs_cache/1, + enable_mibs_cache/1, disable_mibs_cache/1, + gc_mibs_cache/1, gc_mibs_cache/2, gc_mibs_cache/3, + enable_mibs_cache_autogc/1, disable_mibs_cache_autogc/1, + update_mibs_cache_age/2, + update_mibs_cache_gclimit/2]). -export([get_agent_mib_storage/0, db/1, backup/2]). -export([get_log_type/1, set_log_type/2]). @@ -71,6 +77,8 @@ -define(vt(_F, _A), ok). -endif. +-define(DISCO_TERMINATING_TRIGGER_USERNAME, ""). + -ifdef(snmp_debug). -define(GS_START_LINK3(Prio, Parent, Ref, Opts), @@ -91,7 +99,8 @@ -record(notification_filter, {id, mod, data}). -record(disco, - {from, rec, sender, target, sec_level, ctx, ivbs, stage, handler}). + {from, rec, sender, target, engine_id, + sec_level, ctx, ivbs, stage, handler, extra}). %%----------------------------------------------------------------- @@ -124,7 +133,9 @@ net_if, %% Currently unused net_if_mod, backup, - disco}). + disco, + mibs_cache_request}). + %%%----------------------------------------------------------------- %%% This module implements the agent machinery; both for the master @@ -211,10 +222,41 @@ me_of(Agent, Oid) when is_list(Oid) -> call(Agent, {me_of, Oid}). + invalidate_mibs_cache(Agent) -> - call(Agent, invalidate_mibs_cache). + call(Agent, {mibs_cache_request, invalidate_cache}). + + +gc_mibs_cache(Agent) -> + call(Agent, {mibs_cache_request, gc_cache}). + +gc_mibs_cache(Agent, Age) -> + call(Agent, {mibs_cache_request, {gc_cache, Age}}). + +gc_mibs_cache(Agent, Age, GcLimit) -> + call(Agent, {mibs_cache_request, {gc_cache, Age, GcLimit}}). + + +enable_mibs_cache(Agent) -> + call(Agent, {mibs_cache_request, enable_cache}). + +disable_mibs_cache(Agent) -> + call(Agent, {mibs_cache_request, disable_cache}). + +enable_mibs_cache_autogc(Agent) -> + call(Agent, {mibs_cache_request, enable_autogc}). +disable_mibs_cache_autogc(Agent) -> + call(Agent, {mibs_cache_request, disable_autogc}). + + +update_mibs_cache_gclimit(Agent, GcLimit) -> + call(Agent, {mibs_cache_request, {update_gclimit, GcLimit}}). + + +update_mibs_cache_age(Agent, Age) -> + call(Agent, {mibs_cache_request, {update_age, Age}}). init([Prio, Parent, Ref, Options]) -> @@ -345,7 +387,7 @@ Pid; {error, Reason} -> ?vinfo("error starting mib server: ~n~p",[Reason]), - throw({error, {min_server_error, Reason}}); + throw({error, {mib_server_error, Reason}}); {'EXIT', Reason} -> ?vinfo("exit starting mib server: ~n~p",[Reason]), throw({error, {mib_server_exit, Reason}}); @@ -477,71 +519,80 @@ %% -- Discovery functions -- -is_originating_discovery_enabled() -> +disco_opts() -> case ets:lookup(snmp_agent_table, discovery) of - [] -> % upgrade - true; + [] -> + []; [{discovery, DiscoOptions}] -> - case lists:keysearch(originating, 1, DiscoOptions) of - {value, {originating, OrigDisco}} -> - case lists:keysearch(enable, 1, OrigDisco) of - {value, {enable, false}} -> - false; - _ -> - true - end; - _ -> - true - end + DiscoOptions + end. + +originating_disco_opts() -> + DiscoOpts = disco_opts(), + case lists:keysearch(originating, 1, DiscoOpts) of + {value, {originating, OrigDisco}} -> + OrigDisco; + _ -> + [] + end. + +is_originating_discovery_enabled() -> + OrigDisco = originating_disco_opts(), + case lists:keysearch(enable, 1, OrigDisco) of + {value, {enable, false}} -> + false; + _ -> + true end. +terminating_disco_opts() -> + DiscoOpts = disco_opts(), + case lists:keysearch(terminating, 1, DiscoOpts) of + {value, {terminating, TermDisco}} -> + TermDisco; + _ -> + [] + end. + is_terminating_discovery_enabled() -> - Default = true, - case ets:lookup(snmp_agent_table, discovery) of - [] -> % upgrade - Default; - [{discovery, DiscoOptions}] -> - case lists:keysearch(terminating, 1, DiscoOptions) of - {value, {terminating, TermDisco}} -> - case lists:keysearch(enable, 1, TermDisco) of - {value, {enable, false}} -> - false; - _ -> - Default - end; - _ -> - Default - end + TermDisco = terminating_disco_opts(), + case lists:keysearch(enable, 1, TermDisco) of + {value, {enable, false}} -> + false; + _ -> + true end. - + terminating_discovery_stage2() -> - Default = discovery, - case ets:lookup(snmp_agent_table, discovery) of - [] -> % upgrade - Default; - [{discovery, DiscoOptions}] -> - case lists:keysearch(terminating, 1, DiscoOptions) of - {value, {terminating, TermDisco}} -> - case lists:keysearch(stage2, 1, TermDisco) of - {value, {stage2, Stage2}} when ((Stage2 =:= discovery) orelse (Stage2 =:= plain)) -> - Stage2; - _ -> - Default - end; - _ -> - Default - end + Default = discovery, + TermDisco = terminating_disco_opts(), + case lists:keysearch(stage2, 1, TermDisco) of + {value, {stage2, Stage2}} when ((Stage2 =:= discovery) orelse (Stage2 =:= plain)) -> + Stage2; + _ -> + Default end. +terminating_trigger_username() -> + Default = ?DISCO_TERMINATING_TRIGGER_USERNAME, + TermDisco = terminating_disco_opts(), + case lists:keysearch(trigger_username, 1, TermDisco) of + {value, {trigger_username, Trigger}} when is_list(Trigger) -> + Trigger; + _ -> + Default + end. + discovery(TargetName, Notification, ContextName, Varbinds, - DiscoHandler) -> + DiscoHandler, ExtraInfo) -> case is_originating_discovery_enabled() of true -> Agent = snmp_master_agent, call(Agent, {discovery, - TargetName, Notification, ContextName, Varbinds, DiscoHandler}); + TargetName, Notification, ContextName, Varbinds, + DiscoHandler, ExtraInfo}); false -> {error, not_enabled} end. @@ -748,6 +799,12 @@ end, {noreply, S} end; +handle_info({'DOWN', Ref, process, Pid, {mibs_cache_reply, Reply}}, + #state{mibs_cache_request = {Pid, Ref, From}} = S) -> + ?vlog("reply from the mibs cache request handler (~p): ~n~p", + [Pid, Reply]), + gen_server:reply(From, Reply), + {noreply, S#state{mibs_cache_request = undefined}}; handle_info(Info, S) -> warning_msg("received unexpected info: ~n~p", [Info]), @@ -796,7 +853,7 @@ {reply, {error, send_failed}, S} end; handle_call({discovery, - TargetName, Notification, ContextName, Vbs, DiscoHandler}, + TargetName, Notification, ContextName, Vbs, DiscoHandler, ExtraInfo}, From, #state{disco = undefined} = S) -> ?vlog("[handle_call] initiate discovery process:" @@ -804,10 +861,13 @@ "~n Notification: ~p" "~n ContextName: ~p" "~n Vbs: ~p" - "~n DiscoHandler: ~p", - [TargetName, Notification, ContextName, Vbs, DiscoHandler]), + "~n DiscoHandler: ~p" + "~n ExtraInfo: ~p", + [TargetName, Notification, ContextName, Vbs, + DiscoHandler, ExtraInfo]), case handle_discovery(S, From, TargetName, - Notification, ContextName, Vbs, DiscoHandler) of + Notification, ContextName, Vbs, DiscoHandler, + ExtraInfo) of {ok, NewS} -> ?vtrace("[handle_call] first stage of discovery process initiated", []), @@ -815,7 +875,7 @@ {error, _} = Error -> {reply, Error, S} end; -handle_call({discovery, _TargetName, _Notification, _ContextName, _Vbs, _DiscoHandler}, _From, +handle_call({discovery, _TargetName, _Notification, _ContextName, _Vbs, _DiscoHandler, _ExtraInfo}, _From, #state{disco = DiscoData} = S) -> Reply = {error, {discovery_in_progress, DiscoData}}, {reply, Reply, S}; @@ -945,10 +1005,12 @@ ?vlog("whereis mib ~p", [Mib]), {reply, snmpa_mib:whereis_mib(get(mibserver), Mib), S}; -handle_call(invalidate_mibs_cache, _From, S) -> - ?vlog("invalidate_mibs_cache", []), - snmpa_mib:invalidate_cache(get(mibserver)), - {reply, ignore, S}; +handle_call({mibs_cache_request, MibsCacheReq}, From, S) -> + ?vlog("mibs_cache_request: ~p", [MibsCacheReq]), + {MibsCacheWorker, Ref} = + handle_mibs_cache_request(get(mibserver), MibsCacheReq), + NewS = S#state{mibs_cache_request = {MibsCacheWorker, Ref, From}}, + {noreply, NewS}; handle_call(info, _From, S) -> ?vlog("info", []), @@ -1119,6 +1181,41 @@ ok. +handle_mibs_cache_request(MibServer, Req) -> + {MibsCacheWorker, MibsCacheRef} = + spawn_monitor( + fun() -> + Reply = + case Req of + invalidate_cache -> + snmpa_mib:invalidate_cache(MibServer); + gc_cache -> + snmpa_mib:gc_cache(MibServer); + {gc_cache, Age} -> + snmpa_mib:gc_cache(MibServer, Age); + {gc_cache, Age, GcLimit} -> + snmpa_mib:gc_cache(MibServer, Age, GcLimit); + enable_cache -> + snmpa_mib:enable_cache(MibServer); + disable_cache -> + snmpa_mib:disable_cache(MibServer); + enable_autogc -> + snmpa_mib:enable_cache_autogc(MibServer); + disable_autogc -> + snmpa_mib:disable_cache_autogc(MibServer); + {update_gclimit, GcLimit} -> + snmpa_mib:update_cache_gclimit(MibServer, + GcLimit); + {update_age, Age} -> + snmpa_mib:update_cache_age(MibServer, Age); + _ -> + {error, {unknown_mibs_cache_request, Req}} + end, + exit({mibs_cache_reply, Reply}) + end), + {MibsCacheWorker, MibsCacheRef}. + + %%----------------------------------------------------------------- %% Code replacement %% @@ -1730,7 +1827,7 @@ handle_discovery(#state{type = master_agent} = S, From, TargetName, Notification, ContextName, Varbinds, - DiscoHandler) -> + DiscoHandler, ExtraInfo) -> ?vtrace("handle_discovery -> entry with" "~n TargetName: ~p" "~n Notification: ~p" @@ -1743,19 +1840,21 @@ "~n Record: ~p" "~n InitVars: ~p", [Record, InitVars]), send_discovery(S, From, TargetName, - Record, ContextName, InitVars, DiscoHandler); + Record, ContextName, InitVars, + DiscoHandler, ExtraInfo); error -> {error, failed_constructing_notification} end; handle_discovery(_S, _From, _TargetName, _Notification, _ContextName, _Varbinds, - _DiscoHandler) -> + _DiscoHandler, _ExtraInfo) -> {error, only_master_discovery}. %% We ignore if the master agent is multi-threaded or not. %% send_discovery(S, From, - TargetName, Record, ContextName, InitVars, DiscoHandler) -> + TargetName, Record, ContextName, InitVars, + DiscoHandler, ExtraInfo) -> case snmpa_trap:send_discovery(TargetName, Record, ContextName, InitVars, get(net_if)) of {ok, Sender, SecLevel} -> @@ -1767,7 +1866,8 @@ ctx = ContextName, ivbs = InitVars, stage = 1, - handler = DiscoHandler}, + handler = DiscoHandler, + extra = ExtraInfo}, {ok, S#state{disco = Disco}}; Error -> ?vlog("send_discovery -> failed sending discovery: " @@ -1785,7 +1885,8 @@ S#state{disco = undefined}; handle_discovery_response(#state{disco = #disco{target = TargetName, - stage = 1} = Disco} = S, + stage = 1, + extra = ExtraInfo} = Disco} = S, {ok, _Pdu, ManagerEngineId}) when is_record(Disco, disco) -> ?vlog("handle_discovery_response(1) -> entry with" @@ -1798,43 +1899,61 @@ case snmp_target_mib:set_target_engine_id(TargetName, ManagerEngineId) of true when Disco#disco.sec_level =:= ?'SnmpSecurityLevel_noAuthNoPriv' -> %% Ok, we are done - From = Disco#disco.from, + From = Disco#disco.from, Handler = Disco#disco.handler, - Reply = handle_discovery_stage1_finish(Handler, - TargetName, ManagerEngineId), + Reply = + case handle_discovery_stage1_finish(Handler, + TargetName, + ManagerEngineId, + ExtraInfo) of + {ok, _} -> + {ok, ManagerEngineId}; + Error -> + Error + end, gen_server:reply(From, Reply), S#state{disco = undefined}; true when Disco#disco.sec_level =/= ?'SnmpSecurityLevel_noAuthNoPriv' -> %% Ok, time for stage 2 - %% Send the same inform again, this time we have the proper EngineId + %% Send the same inform again, + %% this time we have the proper EngineId - From = Disco#disco.from, + From = Disco#disco.from, Handler = Disco#disco.handler, case handle_discovery_stage1_finish(Handler, - TargetName, ManagerEngineId) of - ok -> + TargetName, + ManagerEngineId, + ExtraInfo) of + {ok, NewExtraInfo} -> ?vdebug("handle_discovery_response(1) -> " "we are done with stage 1 - " "continue with stage 2", []), - #disco{target = TargetName, - rec = Record, - ctx = ContextName, - ivbs = InitVars} = Disco, - case snmpa_trap:send_discovery(TargetName, Record, ContextName, + #disco{rec = Record, + ctx = ContextName, + ivbs = InitVars} = Disco, + case snmpa_trap:send_discovery(TargetName, Record, + ContextName, InitVars, get(net_if)) of {ok, Sender, _SecLevel} -> ?vdebug("handle_discovery_response(1) -> " "stage 2 trap sent", []), - Disco2 = Disco#disco{sender = Sender, - stage = 2}, - {ok, S#state{disco = Disco2}}; + Disco2 = Disco#disco{sender = Sender, + engine_id = ManagerEngineId, + stage = 2, + extra = NewExtraInfo}, + S#state{disco = Disco2}; Error -> ?vlog("handle_discovery_response(1) -> " "failed sending stage 2 trap: " "~n ~p", [Error]), - Error + error_msg("failed sending second " + "discovery message: " + "~n ~p", [Error]), + Reply = {error, {second_send_failed, Error}}, + gen_server:reply(From, Reply), + S#state{disco = undefined} end; {error, Reason} = Error -> ?vlog("handle_discovery_response(1) -> " @@ -1854,11 +1973,13 @@ end; -handle_discovery_response(#state{disco = #disco{from = From, stage = 2}} = S, +handle_discovery_response(#state{disco = #disco{from = From, + engine_id = EngineID, + stage = 2}} = S, {ok, _Pdu}) -> ?vlog("handle_discovery_response(2) -> entry with" "~n From: ~p", [From]), - gen_server:reply(From, ok), + gen_server:reply(From, {ok, EngineID}), S#state{disco = undefined}; handle_discovery_response(#state{disco = #disco{from = From}} = S, Crap) -> @@ -1870,39 +1991,85 @@ warning_msg("Received unexpected discovery response: ~p", [Crap]), S. - -handle_discovery_stage1_finish(Handler, TargetName, ManagerEngineID) -> - case (catch Handler:stage1_finish(TargetName, ManagerEngineID)) of +handle_discovery_stage1_finish(Handler, TargetName, ManagerEngineID, + ExtraInfo) -> + case (catch Handler:stage1_finish(TargetName, ManagerEngineID, + ExtraInfo)) of ignore -> ?vtrace("handle_discovery_stage1_finish -> " - "we are done - [ignore] inform the user", []), - {ok, ManagerEngineID}; + "we are done - [ignore] inform the user", []), + {ok, ExtraInfo}; + {ok, UsmEntry} when is_tuple(UsmEntry) -> ?vtrace("handle_discovery_stage1_finish -> " - "received usm entry - attempt to add entry", []), - case snmp_user_based_sm_mib:add_user(UsmEntry) of - {ok, _} -> - ok; - {error, Reason} -> - ?vlog("handle_discovery_stage1_finish -> " - "failed adding usm entry: " - "~n ~p", [Reason]), - {error, {failed_adding_entry, Reason, ManagerEngineID}} + "received usm entry - attempt to add it", []), + case add_usm_users([UsmEntry]) of + ok -> + {ok, ExtraInfo}; + Error -> + Error + end; + + {ok, UsmEntry, NewExtraInfo} when is_tuple(UsmEntry) -> + ?vtrace("handle_discovery_stage1_finish -> " + "received usm entry - attempt to add it", []), + case add_usm_users([UsmEntry]) of + ok -> + {ok, NewExtraInfo}; + Error -> + Error end; + + {ok, UsmEntries} when is_list(UsmEntries) -> + ?vtrace("handle_discovery_stage1_finish -> " + "received usm entries - attempt to add them", []), + case add_usm_users(UsmEntries) of + ok -> + {ok, ExtraInfo}; + Error -> + Error + end; + + {ok, UsmEntries, NewExtraInfo} when is_list(UsmEntries) -> + ?vtrace("handle_discovery_stage1_finish -> " + "received usm entries - attempt to add them", []), + case add_usm_users(UsmEntries) of + ok -> + {ok, NewExtraInfo}; + Error -> + Error + end; + {'EXIT', Reason} -> ?vlog("handle_discovery_stage1_finish -> stage 1 function exited: " "~n ~p", [Reason]), {error, {finish_exit, Reason, ManagerEngineID}}; + {error, Reason} -> ?vlog("handle_discovery_stage1_finish -> stage 1 function error: " "~n ~p", [Reason]), {error, {finish_error, Reason, ManagerEngineID}}; + Unknown -> ?vlog("handle_discovery_stage1_finish -> stage 1 function unknown: " "~n ~p", [Unknown]), {error, {finish_failed, Unknown, ManagerEngineID}} end. +add_usm_users([]) -> + ok; +add_usm_users([UsmEntry|UsmEntries]) when is_tuple(UsmEntry) -> + ?vtrace("add_usm_users -> attempt to add entry (~w)", + [element(1, UsmEntry)]), + case snmp_user_based_sm_mib:add_user(UsmEntry) of + {ok, _} -> + add_usm_users(UsmEntries); + {error, Reason} -> + ?vlog("add_usm_users -> failed adding usm entry: " + "~n ~p", [Reason]), + {error, {failed_adding_entry, Reason, UsmEntry}} + end. + handle_me_of(MibServer, Oid) -> case snmpa_mib:lookup(MibServer, Oid) of diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_app.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_app.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_app.erl 2009-03-12 12:27:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_app.erl 2009-09-18 15:12:18.000000000 +0100 @@ -124,7 +124,7 @@ get_db_dir(Opts) -> case get_opt(snmp_db_dir, Opts) of - {value, Dir} when list(Dir) -> + {value, Dir} when is_list(Dir) -> Dir; {value, Bad} -> exit({bad_config, {db_dir, Bad}}); @@ -137,7 +137,7 @@ get_priority(Opts) -> case get_opt(snmp_priority, Opts) of - {value, Prio} when atom(Prio) -> + {value, Prio} when is_atom(Prio) -> Prio; _ -> normal @@ -183,7 +183,7 @@ get_audit_trail_log_dir(Opts) -> case get_opt(audit_trail_log_dir, Opts) of - {value, Dir} when list(Dir) -> + {value, Dir} when is_list(Dir) -> Dir; {value, Bad} -> exit({bad_config, {audit_trail_log_dir, Bad}}); @@ -193,7 +193,7 @@ get_audit_trail_log_size(Opts) -> case get_opt(audit_trail_log_size, Opts) of - {value, {MB, MF} = Sz} when integer(MB), integer(MF) -> + {value, {MB, MF} = Sz} when is_integer(MB) andalso is_integer(MF) -> Sz; {value, Bad} -> exit({bad_config, {audit_trail_log_size, Bad}}); @@ -306,7 +306,7 @@ get_config_dir(Opts) -> case get_opt(snmp_config_dir, Opts) of - {value, Dir} when list(Dir) -> Dir; + {value, Dir} when is_list(Dir) -> Dir; {value, Bad} -> exit({bad_config, {config_dir, Bad}}); _ -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_discovery_handler_default.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_discovery_handler_default.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_discovery_handler_default.erl 2009-06-05 13:56:12.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_discovery_handler_default.erl 2009-09-18 13:47:58.000000000 +0100 @@ -24,7 +24,7 @@ %%%----------------------------------------------------------------- %%% Implements different error mechanisms. %%%----------------------------------------------------------------- --export([stage1_finish/2]). +-export([stage1_finish/3]). %%----------------------------------------------------------------- @@ -33,6 +33,6 @@ %% %% %%----------------------------------------------------------------- -stage1_finish(_TargetName, _ManagerEngineID) -> +stage1_finish(_TargetName, _ManagerEngineID, _ExtraInfo) -> ignore. diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_discovery_handler.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_discovery_handler.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_discovery_handler.erl 2009-06-05 13:56:13.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_discovery_handler.erl 2009-09-18 13:47:58.000000000 +0100 @@ -21,7 +21,7 @@ -export([behaviour_info/1, verify/1]). behaviour_info(callbacks) -> - [{stage1_finish, 2}]; + [{stage1_finish, 3}]; behaviour_info(_) -> undefined. diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa.erl 2009-06-05 13:55:54.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa.erl 2009-09-18 15:13:12.000000000 +0100 @@ -47,6 +47,13 @@ mib_of/1, mib_of/2, me_of/1, me_of/2, invalidate_mibs_cache/0, invalidate_mibs_cache/1, + enable_mibs_cache/0, enable_mibs_cache/1, + disable_mibs_cache/0, disable_mibs_cache/1, + gc_mibs_cache/0, gc_mibs_cache/1, gc_mibs_cache/2, gc_mibs_cache/3, + enable_mibs_cache_autogc/0, enable_mibs_cache_autogc/1, + disable_mibs_cache_autogc/0, disable_mibs_cache_autogc/1, + update_mibs_cache_age/1, update_mibs_cache_age/2, + update_mibs_cache_gclimit/1, update_mibs_cache_gclimit/2, get/2, get/3, get_next/2, get_next/3, @@ -56,7 +63,7 @@ send_notification/6, send_trap/3, send_trap/4, - discovery/2, discovery/3, discovery/4, discovery/5, + discovery/2, discovery/3, discovery/4, discovery/5, discovery/6, sys_up_time/0, system_start_time/0, @@ -98,6 +105,8 @@ -include("snmpa_atl.hrl"). +-define(EXTRA_INFO, undefined). + %%----------------------------------------------------------------- %% This utility function is used to convert an old SNMP application @@ -284,6 +293,7 @@ me_of(Agent, Oid) -> snmpa_agent:me_of(Agent, Oid). + invalidate_mibs_cache() -> invalidate_mibs_cache(snmp_master_agent). @@ -291,6 +301,67 @@ snmpa_agent:invalidate_mibs_cache(Agent). +enable_mibs_cache() -> + enable_mibs_cache(snmp_master_agent). + +enable_mibs_cache(Agent) -> + snmpa_agent:enable_mibs_cache(Agent). + + +disable_mibs_cache() -> + disable_mibs_cache(snmp_master_agent). + +disable_mibs_cache(Agent) -> + snmpa_agent:disable_mibs_cache(Agent). + + +gc_mibs_cache() -> + gc_mibs_cache(snmp_master_agent). + +gc_mibs_cache(Agent) when is_atom(Agent) orelse is_pid(Agent) -> + snmpa_agent:gc_mibs_cache(Agent); +gc_mibs_cache(Age) -> + gc_mibs_cache(snmp_master_agent, Age). + +gc_mibs_cache(Agent, Age) when is_atom(Agent) orelse is_pid(Agent) -> + snmpa_agent:gc_mibs_cache(Agent, Age); +gc_mibs_cache(Age, GcLimit) -> + gc_mibs_cache(snmp_master_agent, Age, GcLimit). + +gc_mibs_cache(Agent, Age, GcLimit) when is_atom(Agent) orelse is_pid(Agent) -> + snmpa_agent:gc_mibs_cache(Agent, Age, GcLimit). + + +enable_mibs_cache_autogc() -> + enable_mibs_cache_autogc(snmp_master_agent). + +enable_mibs_cache_autogc(Agent) -> + snmpa_agent:enable_mibs_cache_autogc(Agent). + + +disable_mibs_cache_autogc() -> + disable_mibs_cache_autogc(snmp_master_agent). + +disable_mibs_cache_autogc(Agent) -> + snmpa_agent:disable_mibs_cache_autogc(Agent). + + +update_mibs_cache_age(Age) -> + update_mibs_cache_age(snmp_master_agent, Age). + +update_mibs_cache_age(Agent, Age) -> + snmpa_agent:update_mibs_cache_age(Agent, Age). + + +update_mibs_cache_gclimit(GcLimit) -> + update_mibs_cache_age(snmp_master_agent, GcLimit). + +update_mibs_cache_gclimit(Agent, GcLimit) -> + snmpa_agent:update_mibs_cache_gclimit(Agent, GcLimit). + + + + %% - message filter / load regulation register_notification_filter(Id, Mod, Data) when is_atom(Mod) -> @@ -379,11 +450,17 @@ discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler); discovery(TargetName, Notification, Varbinds, DiscoHandler) - when is_function(DiscoHandler) -> + when is_atom(DiscoHandler) -> ContextName = "", discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler). -discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler) +discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler) -> + ExtraInfo = ?EXTRA_INFO, + discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler, + ExtraInfo). + +discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler, + ExtraInfo) when (is_list(TargetName) andalso (length(TargetName) > 0) andalso is_atom(Notification) andalso is_list(ContextName) andalso @@ -391,8 +468,8 @@ is_atom(DiscoHandler)) -> case (catch snmpa_discovery_handler:verify(DiscoHandler)) of ok -> - snmpa_agent:discovery(TargetName, Notification, ContextName, Varbinds, - DiscoHandler); + snmpa_agent:discovery(TargetName, Notification, ContextName, + Varbinds, DiscoHandler, ExtraInfo); Error -> Error end. diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_general_db.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_general_db.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_general_db.erl 2009-03-12 12:30:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_general_db.erl 2009-09-18 15:12:37.000000000 +0100 @@ -58,7 +58,7 @@ %% An empty node list ([]), is traslated into a list containing %% only the own node. %% --------------------------------------------------------------- -open({mnesia,Nodes,clear}, Name, RecName, Attr, Type) when list(Nodes) -> +open({mnesia,Nodes,clear}, Name, RecName, Attr, Type) when is_list(Nodes) -> ?vtrace("[mnesia] open ~p database ~p for ~p on ~p; clear", [Type, Name, RecName, Nodes]), mnesia_open(mnesia_table_check(Name), Nodes, RecName, Attr, Type, clear); @@ -66,7 +66,7 @@ ?vtrace("[mnesia] open ~p database ~p for ~p on ~p; keep", [Type, Name, RecName, Nodes]), open({mnesia,Nodes}, Name, RecName, Attr, Type); -open({mnesia,Nodes}, Name, RecName, Attr, Type) when list(Nodes) -> +open({mnesia,Nodes}, Name, RecName, Attr, Type) when is_list(Nodes) -> ?vtrace("[mnesia] open ~p database ~p for ~p on ~p", [Type, Name, RecName, Nodes]), mnesia_open(mnesia_table_check(Name), Nodes, RecName, Attr, Type, keep); @@ -415,7 +415,7 @@ %% --------------------------------------------------------------- info({mnesia, Name}) -> case (catch mnesia:table_info(Name, all)) of - Info when list(Info) -> + Info when is_list(Info) -> Info; {'EXIT', {aborted, Reason}} -> {error, Reason}; diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_local_db.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_local_db.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_local_db.erl 2009-03-12 12:27:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_local_db.erl 2009-09-18 13:47:31.000000000 +0100 @@ -40,7 +40,8 @@ table_get_element/3, table_get_elements/4, table_set_elements/3, table_set_status/7, table_next/2, - table_max_col/2]). + table_max_col/2, + table_get/1]). -export([get_elements/2]). @@ -88,10 +89,10 @@ %%% Opt = {auto_repair, false | true | true_verbose} | %%% {verbosity,silence | log | debug} %%%----------------------------------------------------------------- -start_link(Prio, DbDir, Opts) when list(Opts) -> +start_link(Prio, DbDir, Opts) when is_list(Opts) -> start_link(Prio, DbDir, terminate, Opts). -start_link(Prio, DbDir, DbInitError, Opts) when list(Opts) -> +start_link(Prio, DbDir, DbInitError, Opts) when is_list(Opts) -> ?d("start_link -> entry with" "~n Prio: ~p" "~n DbDir: ~p" @@ -312,6 +313,24 @@ call({match, Name, volatile, Pattern}). +table_get(Table) -> + table_get(Table, [], []). + +table_get(Table, Idx, Acc) -> + case table_next(Table, Idx) of + endOfTable -> + lists:reverse(Acc); + NextIdx -> + case table_get_row(Table, NextIdx) of + undefined -> + {error, {failed_get_row, NextIdx, lists:reverse(Acc)}}; + Row -> + NewAcc = [{NextIdx, Row}|Acc], + table_get(Table, NextIdx, NewAcc) + end + end. + + %%----------------------------------------------------------------- %% Implements the variable functions. %%----------------------------------------------------------------- @@ -443,7 +462,7 @@ Res = case lookup(Db, {Name, Indexes}, State) of {value, {_Row, _Prev, Next}} -> if - Next == first -> endOfTable; + Next =:= first -> endOfTable; true -> Next end; undefined -> @@ -722,7 +741,7 @@ {{Name, Next}, {NRow, NPrev, NNext}} -> {value, {PRow, PPrev, _PNext}} = lookup(Db, {Name, NPrev}, State), if - Next == NPrev -> + Next =:= NPrev -> % Insert before first insert(Db, {Name, NPrev}, {PRow, Indexes, Indexes}, State); true -> @@ -805,7 +824,7 @@ if Cur > Indexes -> {{Name, Cur}, {Row, Prev, Next}}; - Cur == Indexes -> + Cur =:= Indexes -> {same_row, {Prev, Next}}; true -> table_loop2(Db, Name, Indexes, Next, State) @@ -820,16 +839,16 @@ case lookup(Db, {Name, Indexes}, State) of {value, {Row, _Prev, Next}} -> if - Next == first -> + Next =:= first -> if - integer(element(Col, Row)), - element(Col, Row) > Max -> + is_integer(element(Col, Row)) andalso + (element(Col, Row) > Max) -> element(Col, Row); true -> Max end; - integer(element(Col, Row)), - element(Col, Row) > Max -> + is_integer(element(Col, Row)) andalso + (element(Col, Row) > Max) -> table_max_col(Db,Name, Col,element(Col, Row),Next, State); true -> table_max_col(Db, Name, Col, Max, Next, State) diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_mib_data.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_mib_data.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_mib_data.erl 2009-03-12 12:27:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_mib_data.erl 2009-11-20 08:48:24.000000000 +0000 @@ -89,9 +89,7 @@ register_subagent/3, unregister_subagent/2]). %% Internal exports --export([merge_nodes/2, - drop_internal_and_imported/1, - code_change/2]). +-export([code_change/2]). %%----------------------------------------------------------------- @@ -164,7 +162,7 @@ %% Returns: new mib data | {error, Reason} %%---------------------------------------------------------------------- load_mib(MibData,FileName,MeOverride,TeOverride) - when record(MibData,mib_data), list(FileName) -> + when is_record(MibData,mib_data) andalso is_list(FileName) -> ?vlog("load mib file: ~p",[FileName]), ActualFileName = filename:rootname(FileName, ".bin") ++ ".bin", MibName = list_to_atom(filename:basename(FileName, ".bin")), @@ -185,7 +183,7 @@ Mib = do_read_mib(ActualFileName), ?vtrace("do_load_mib -> read mib ~s",[Mib#mib.name]), NonInternalMes = - lists:filter(fun drop_internal_and_imported/1, Mib#mib.mes), + lists:filter(fun(ME) -> maybe_drop_me(ME) end, Mib#mib.mes), OldRoot = Tree#tree.root, T = build_tree(NonInternalMes, MibName), ?d("load_mib -> " @@ -196,7 +194,7 @@ ?vlog("error merging nodes:" "~n~p~nand~n~p", [Node1,Node2]), {error, oid_conflict}; - NewRoot when tuple(NewRoot), element(1,NewRoot) == tree -> + NewRoot when is_tuple(NewRoot) andalso (element(1,NewRoot) =:= tree) -> ?d("load_mib -> " "~n NewRoot: ~p", [NewRoot]), Symbolic = not lists:member(no_symbolic_info, Mib#mib.misc), @@ -338,7 +336,7 @@ %%---------------------------------------------------------------------- %% Returns: new mib data | {error, Reason} %%---------------------------------------------------------------------- -unload_mib(MibData, FileName, _, _) when list(FileName) -> +unload_mib(MibData, FileName, _, _) when is_list(FileName) -> MibName = list_to_atom(filename:basename(FileName, ".bin")), (catch do_unload_mib(MibData, MibName)). @@ -410,7 +408,7 @@ %% Purpose: Deletes SA with Pid from all subtrees it handles. %% Returns: NewMibData. %%---------------------------------------------------------------------- -unregister_subagent(MibData, Pid) when pid(Pid) -> +unregister_subagent(MibData, Pid) when is_pid(Pid) -> SAs = MibData#mib_data.subagents, case lists:keysearch(Pid, 1, SAs) of false -> MibData; @@ -425,7 +423,7 @@ %% Purpose: Deletes one unique subagent. %% Returns: {error, Reason} | {ok, NewMibData, DeletedSubagentPid} %%---------------------------------------------------------------------- -unregister_subagent(#mib_data{tree = T} = MibData, Oid) when list(Oid) -> +unregister_subagent(#mib_data{tree = T} = MibData, Oid) when is_list(Oid) -> case catch delete_subagent(T#tree.root, Oid) of {tree, Tree, Info} -> OldSAs = MibData#mib_data.subagents, @@ -579,7 +577,7 @@ ?vtrace("lookup -> entry with" "~n Oid: ~p",[Oid]), case (catch find_node(D, T#tree.root, Oid, [])) of - {variable, ME, _Mib} when record(ME, me) -> + {variable, ME, _Mib} when is_record(ME, me) -> ?vtrace("lookup -> variable:" "~n ME: ~p",[ME]), {variable, ME}; @@ -763,7 +761,7 @@ end; next_node(D, {tree, Tree, _Info}, [Int | RestOfOid], RevOidSoFar, MibView) - when Int < size(Tree), Int >= 0 -> + when (Int < size(Tree)) andalso (Int >= 0) -> ?vtrace("next_node(tree) -> entry when" "~n size(Tree): ~p" "~n Int: ~p" @@ -1001,7 +999,7 @@ %% where the ME really should be in _this_ subtree (not above). %%-------------------------------------------------- classify_how_in_subtree(LevelPrefix, Me) - when length(Me#me.oid) == length(LevelPrefix) + 1 -> + when (length(Me#me.oid) =:= (length(LevelPrefix) + 1)) -> Oid = Me#me.oid, case node_or_subtree(Me#me.entrytype) of subtree -> @@ -1011,7 +1009,7 @@ end; classify_how_in_subtree(LevelPrefix, Me) - when length(Me#me.oid) > length(LevelPrefix) + 1 -> + when (length(Me#me.oid) > (length(LevelPrefix) + 1)) -> L1 = length(LevelPrefix) + 1, Oid = Me#me.oid, {internal_subtree, lists:nth(L1, Oid), lists:sublist(Oid, 1, L1)}. @@ -1036,7 +1034,7 @@ {Index, {tree, dict_list_to_tuple(L), Info}}; convert_tree({Index, {node, Info}}) when Index >= 0 -> {Index, {node, Info}}; -convert_tree(Tree) when list(Tree) -> +convert_tree(Tree) when is_list(Tree) -> L = lists:map(fun convert_tree/1, Tree), dict_list_to_tuple(L). @@ -1092,17 +1090,16 @@ %% to extend than a tuple. %% Returns: The resulting, merged level tuple. %%---------------------------------------------------------------------- -merge_levels(Level1, Level2) when length(Level1) == length(Level2) -> - list_to_tuple(snmp_misc:multi_map({?MODULE, merge_nodes}, - [Level1, Level2])); +merge_levels(Level1, Level2) when length(Level1) =:= length(Level2) -> + MergeNodes = fun(N1, N2) -> merge_nodes(N1, N2) end, + list_to_tuple(snmp_misc:multi_map(MergeNodes, [Level1, Level2])); merge_levels(Level1, Level2) when length(Level1) > length(Level2) -> - merge_levels(Level1,Level2 ++ undefined_nodes_list(length(Level1) - - length(Level2))); + merge_levels(Level1, Level2 ++ + undefined_nodes_list(length(Level1) - length(Level2))); merge_levels(Level1, Level2) when length(Level1) < length(Level2) -> merge_levels(Level2, Level1). -undefined_nodes_list(0) -> []; -undefined_nodes_list(N) -> [undefined_node | undefined_nodes_list(N-1)]. +undefined_nodes_list(N) -> lists:duplicate(N, undefined_node). %%%====================================================================== @@ -1129,7 +1126,7 @@ %% other mibs use it) anymore the empty list is returned. %% Returns: {MEs, The new level represented as a list} %%---------------------------------------------------------------------- -delete_tree(Tree, MibName) when tuple(Tree) -> +delete_tree(Tree, MibName) when is_tuple(Tree) -> NewLevel = delete_nodes(tuple_to_list(Tree), MibName, []), case lists:filter(fun drop_undefined_nodes/1,NewLevel) of [] -> []; @@ -1185,12 +1182,13 @@ case catch convert_tree(ListTree) of {'EXIT', _Reason} -> {error, 'cannot construct tree from oid'}; - Level when tuple(Level) -> + Level when is_tuple(Level) -> T = {tree, Level, internal}, case catch merge_nodes(T, OldRoot) of {error_merge_nodes, _Node1, _Node2} -> {error, oid_conflict}; - NewRoot when tuple(NewRoot), element(1, NewRoot) == tree-> + NewRoot when is_tuple(NewRoot) andalso + (element(1, NewRoot) =:= tree) -> NewRoot end end. @@ -1333,9 +1331,11 @@ call_instrumentation(_ShitME, _Operation) -> done. -drop_internal_and_imported(#me{entrytype = internal}) -> false; -drop_internal_and_imported(#me{imported = true}) -> false; -drop_internal_and_imported(_) -> true. + +maybe_drop_me(#me{entrytype = internal}) -> false; +maybe_drop_me(#me{entrytype = group}) -> false; +maybe_drop_me(#me{imported = true}) -> false; +maybe_drop_me(_) -> true. %%---------------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_mib.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_mib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_mib.erl 2009-03-12 12:27:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_mib.erl 2009-09-18 15:12:08.000000000 +0100 @@ -31,7 +31,14 @@ register_subagent/3, unregister_subagent/2, info/1, info/2, verbosity/2, dump/1, dump/2, backup/2, - invalidate_cache/1]). + invalidate_cache/1, + gc_cache/1, gc_cache/2, gc_cache/3, + enable_cache/1, disable_cache/1, + enable_cache_autogc/1, disable_cache_autogc/1, + update_cache_gclimit/2, + update_cache_age/2, + which_cache_size/1 + ]). %% Internal exports -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, @@ -44,9 +51,16 @@ -include("snmp_debug.hrl"). --define(SERVER, ?MODULE). --define(NO_CACHE, no_mibs_cache). --define(DEFAULT_CACHE_USAGE, true). +-define(SERVER, ?MODULE). +-define(NO_CACHE, no_mibs_cache). +-define(DEFAULT_CACHE_USAGE, true). +-define(CACHE_GC_TICKTIME, timer:minutes(1)). +-define(DEFAULT_CACHE_AUTOGC, false). +-define(DEFAULT_CACHE_GCLIMIT, 100). +-define(DEFAULT_CACHE_AGE, timer:minutes(10)). +-define(CACHE_GC_TRIGGER, cache_gc_trigger). + + -ifdef(snmp_debug). -define(GS_START_LINK(Prio, Mibs, Opts), @@ -65,7 +79,8 @@ %% meo - mib entry override %% teo - trap (notification) entry override %%----------------------------------------------------------------- --record(state, {data, meo, teo, backup, cache}). +-record(state, {data, meo, teo, backup, + cache, cache_tmr, cache_autogc, cache_gclimit, cache_age}). @@ -81,7 +96,7 @@ ?d("start_link -> entry with" "~n Prio: ~p" "~n Mibs: ~p" - "~n Opts: ~p",[Prio, Mibs, Opts]), + "~n Opts: ~p", [Prio, Mibs, Opts]), ?GS_START_LINK(Prio, Mibs, Opts). verbosity(MibServer, Verbosity) -> @@ -93,6 +108,44 @@ invalidate_cache(MibServer) -> call(MibServer, invalidate_cache). +gc_cache(MibServer) -> + call(MibServer, gc_cache). + +gc_cache(MibServer, Age) -> + call(MibServer, {gc_cache, Age}). + +gc_cache(MibServer, Age, GcLimit) -> + call(MibServer, {gc_cache, Age, GcLimit}). + +which_cache_size(MibServer) -> + call(MibServer, cache_size). + +enable_cache(MibServer) -> + update_cache_opts(MibServer, cache, true). +disable_cache(MibServer) -> + update_cache_opts(MibServer, cache, false). + +enable_cache_autogc(MibServer) -> + update_cache_opts(MibServer, autogc, true). +disable_cache_autogc(MibServer) -> + update_cache_opts(MibServer, autogc, false). + +update_cache_gclimit(MibServer, GcLimit) + when ((is_integer(GcLimit) andalso (GcLimit > 0)) orelse + (GcLimit =:= infinity)) -> + update_cache_opts(MibServer, gclimit, GcLimit); +update_cache_gclimit(_, BadLimit) -> + {error, {bad_gclimit, BadLimit}}. + +update_cache_age(MibServer, Age) + when is_integer(Age) andalso (Age > 0) -> + update_cache_opts(MibServer, age, Age); +update_cache_age(_, BadAge) -> + {error, {bad_age, BadAge}}. + +update_cache_opts(MibServer, Key, Value) -> + call(MibServer, {update_cache_opts, Key, Value}). + %%----------------------------------------------------------------- %% Func: lookup/2 @@ -173,10 +226,10 @@ dump(MibServer) -> call(MibServer, dump). -dump(MibServer, File) when list(File) -> +dump(MibServer, File) when is_list(File) -> call(MibServer, {dump, File}). -backup(MibServer, BackupDir) when list(BackupDir) -> +backup(MibServer, BackupDir) when is_list(BackupDir) -> call(MibServer, {backup, BackupDir}). @@ -188,7 +241,7 @@ ?d("init -> entry with" "~n Prio: ~p" "~n Mibs: ~p" - "~n Opts: ~p",[Prio, Mibs, Opts]), + "~n Opts: ~p", [Prio, Mibs, Opts]), case (catch do_init(Prio, Mibs, Opts)) of {ok, State} -> {ok, State}; @@ -204,9 +257,35 @@ process_flag(priority, Prio), process_flag(trap_exit, true), put(sname,ms), - put(verbosity,?vvalidate(get_verbosity(Opts))), + put(verbosity, ?vvalidate(get_verbosity(Opts))), ?vlog("starting",[]), - Cache = maybe_create_cache(Opts), + + %% Extract the cache options + {Cache, CacheOptions} = + case get_opt(cache, Opts, ?DEFAULT_CACHE_USAGE) of + true -> + {new_cache(), []}; + false -> + {?NO_CACHE, []}; + CacheOpts when is_list(CacheOpts) -> + {new_cache(), CacheOpts}; + Bad -> + throw({error, {bad_option, {cache, Bad}}}) + end, + CacheAutoGC = get_cacheopt_autogc(Cache, CacheOptions), + CacheGcLimit = get_cacheopt_gclimit(Cache, CacheOptions), + CacheAge = get_cacheopt_age(Cache, CacheOptions), + + %% Maybe start the cache gc timer + CacheGcTimer = + if + ((Cache =/= ?NO_CACHE) andalso + (CacheAutoGC =:= true)) -> + start_cache_gc_timer(); + true -> + undefined + end, + MeOverride = get_me_override(Opts), TeOverride = get_te_override(Opts), MibStorage = get_mib_storage(Opts), @@ -218,10 +297,14 @@ ?vdebug("started",[]), snmpa_mib_data:sync(Data2), ?vdebug("mib data synced",[]), - {ok, #state{data = Data2, - teo = TeOverride, - meo = MeOverride, - cache = Cache}}; + {ok, #state{data = Data2, + teo = TeOverride, + meo = MeOverride, + cache = Cache, + cache_tmr = CacheGcTimer, + cache_autogc = CacheAutoGC, + cache_gclimit = CacheGcLimit, + cache_age = CacheAge}}; {'aborted at', Mib, _NewData, Reason} -> ?vinfo("failed loading mib ~p: ~p",[Mib,Reason]), {error, {Mib, Reason}} @@ -249,7 +332,7 @@ mib_operations(Operation, Mibs, Data, MeOverride, TeOverride, Force). mib_operation(Operation, Mib, Data0, MeOverride, TeOverride, Force) - when list(Mib) -> + when is_list(Mib) -> ?vtrace("mib operation on mib ~p", [Mib]), case apply(snmpa_mib_data, Operation, [Data0,Mib,MeOverride,TeOverride]) of {error, 'already loaded'} when (Operation =:= load_mib) andalso @@ -280,23 +363,56 @@ NewCache = maybe_invalidate_cache(Cache), {reply, ignore, State#state{cache = NewCache}}; +handle_call(cache_size, _From, #state{cache = Cache} = State) -> + ?vlog("cache_size", []), + Reply = maybe_cache_size(Cache), + {reply, Reply, State}; + +handle_call(gc_cache, _From, + #state{cache = Cache, + cache_age = Age, + cache_gclimit = GcLimit} = State) -> + ?vlog("gc_cache", []), + Result = maybe_gc_cache(Cache, Age, GcLimit), + {reply, Result, State}; + +handle_call({gc_cache, Age}, _From, + #state{cache = Cache, + cache_gclimit = GcLimit} = State) -> + ?vlog("gc_cache with Age = ~p", [Age]), + Result = maybe_gc_cache(Cache, Age, GcLimit), + {reply, Result, State}; + +handle_call({gc_cache, Age, GcLimit}, _From, + #state{cache = Cache} = State) -> + ?vlog("gc_cache with Age = ~p and GcLimut = ~p", [Age, GcLimit]), + Result = maybe_gc_cache(Cache, Age, GcLimit), + {reply, Result, State}; + +handle_call({update_cache_opts, Key, Value}, _From, State) -> + ?vlog("update_cache_opts: ~p -> ~p", [Key, Value]), + {Result, NewState} = handle_update_cache_opts(Key, Value, State), + {reply, Result, NewState}; + handle_call({lookup, Oid}, _From, #state{data = Data, cache = Cache} = State) -> ?vlog("lookup ~p", [Oid]), Key = {lookup, Oid}, - Reply = case maybe_cache_lookup(Cache, Key) of - ?NO_CACHE -> - snmpa_mib_data:lookup(Data, Oid); - [] -> - Rep = snmpa_mib_data:lookup(Data, Oid), - ets:insert(Cache, {Key, Rep}), - Rep; - [{Key, Rep}] -> - ?vdebug("lookup -> found in cache", []), - Rep - end, - ?vdebug("lookup -> Reply: ~p",[Reply]), - {reply, Reply, State}; + {Reply, NewState} = + case maybe_cache_lookup(Cache, Key) of + ?NO_CACHE -> + {snmpa_mib_data:lookup(Data, Oid), State}; + [] -> + Rep = snmpa_mib_data:lookup(Data, Oid), + ets:insert(Cache, {Key, Rep, timestamp()}), + {Rep, maybe_start_cache_gc_timer(State)}; + [{Key, Rep, _}] -> + ?vdebug("lookup -> found in cache", []), + ets:update_element(Cache, Key, {3, timestamp()}), + {Rep, State} + end, + ?vdebug("lookup -> Reply: ~p", [Reply]), + {reply, Reply, NewState}; handle_call({which_mib, Oid}, _From, #state{data = Data} = State) -> ?vlog("which_mib ~p",[Oid]), @@ -306,21 +422,23 @@ handle_call({next, Oid, MibView}, _From, #state{data = Data, cache = Cache} = State) -> - ?vlog("next ~p [~p]",[Oid,MibView]), + ?vlog("next ~p [~p]", [Oid, MibView]), Key = {next, Oid, MibView}, - Reply = case maybe_cache_lookup(Cache, Key) of - ?NO_CACHE -> - snmpa_mib_data:next(Data, Oid, MibView); - [] -> - Rep = snmpa_mib_data:next(Data, Oid, MibView), - ets:insert(Cache, {Key, Rep}), - Rep; - [{Key, Rep}] -> - ?vdebug("lookup -> found in cache", []), - Rep - end, - ?vdebug("next -> Reply: ~p",[Reply]), - {reply, Reply, State}; + {Reply, NewState} = + case maybe_cache_lookup(Cache, Key) of + ?NO_CACHE -> + {snmpa_mib_data:next(Data, Oid, MibView), State}; + [] -> + Rep = snmpa_mib_data:next(Data, Oid, MibView), + ets:insert(Cache, {Key, Rep, timestamp()}), + {Rep, maybe_start_cache_gc_timer(State)}; + [{Key, Rep, _}] -> + ?vdebug("lookup -> found in cache", []), + ets:update_element(Cache, Key, {3, timestamp()}), + {Rep, State} + end, + ?vdebug("next -> Reply: ~p", [Reply]), + {reply, Reply, NewState}; handle_call({load_mibs, Mibs}, _From, #state{data = Data, @@ -476,6 +594,7 @@ warning_msg("received unknown message: ~n~p", [Msg]), {noreply, State}. + handle_info({'EXIT', Pid, Reason}, #state{backup = {Pid, From}} = S) -> ?vlog("backup server (~p) exited for reason ~n~p", [Pid, Reason]), gen_server:reply(From, {error, Reason}), @@ -492,6 +611,20 @@ gen_server:reply(From, Reply), {noreply, S#state{backup = undefined}}; +handle_info(?CACHE_GC_TRIGGER, #state{cache = Cache, + cache_age = Age, + cache_gclimit = GcLimit, + cache_autogc = true} = S) + when (Cache =/= ?NO_CACHE) -> + ?vlog("cache gc trigger event", []), + maybe_gc_cache(Cache, Age, GcLimit), + Tmr = start_cache_gc_timer(), + {noreply, S#state{cache_tmr = Tmr}}; + +handle_info(?CACHE_GC_TRIGGER, S) -> + ?vlog("out-of-date cache gc trigger event - ignore", []), + {noreply, S#state{cache_tmr = undefined}}; + handle_info(Info, State) -> warning_msg("received unknown info: ~n~p", [Info]), {noreply, State}. @@ -508,19 +641,19 @@ %% downgrade %% -code_change({down, _Vsn}, S1, downgrade_to_pre_4_12) -> - #state{data = Data, meo = MEO, teo = TEO, backup = B, cache = Cache} = S1, - del_cache(Cache), - S2 = {state, Data, MEO, TEO, B}, - {ok, S2}; - -%% upgrade -%% -code_change(_Vsn, S1, upgrade_from_pre_4_12) -> - {state, Data, MEO, TEO, B} = S1, - Cache = new_cache(), - S2 = #state{data = Data, meo = MEO, teo = TEO, backup = B, cache = Cache}, - {ok, S2}; +%% code_change({down, _Vsn}, S1, downgrade_to_pre_4_12) -> +%% #state{data = Data, meo = MEO, teo = TEO, backup = B, cache = Cache} = S1, +%% del_cache(Cache), +%% S2 = {state, Data, MEO, TEO, B}, +%% {ok, S2}; + +%% %% upgrade +%% %% +%% code_change(_Vsn, S1, upgrade_from_pre_4_12) -> +%% {state, Data, MEO, TEO, B} = S1, +%% Cache = new_cache(), +%% S2 = #state{data = Data, meo = MEO, teo = TEO, backup = B, cache = Cache}, +%% {ok, S2}; code_change(_Vsn, State, _Extra) -> {ok, State}. @@ -531,27 +664,161 @@ %%----------------------------------------------------------------- get_verbosity(Options) -> - snmp_misc:get_option(verbosity, Options, ?default_verbosity). + get_opt(verbosity, Options, ?default_verbosity). get_me_override(Options) -> - snmp_misc:get_option(mibentry_override, Options, false). + get_opt(mibentry_override, Options, false). get_te_override(Options) -> - snmp_misc:get_option(trapentry_override, Options, false). + get_opt(trapentry_override, Options, false). get_mib_storage(Options) -> - snmp_misc:get_option(mib_storage, Options, ets). + get_opt(mib_storage, Options, ets). + +get_cacheopt_autogc(Cache, CacheOpts) -> + IsValid = fun(AutoGC) when ((AutoGC =:= true) orelse + (AutoGC =:= false)) -> + true; + (_) -> + false + end, + get_cacheopt(Cache, autogc, CacheOpts, + false, ?DEFAULT_CACHE_AUTOGC, + IsValid). + +get_cacheopt_gclimit(Cache, CacheOpts) -> + IsValid = fun(Limit) when ((is_integer(Limit) andalso (Limit > 0)) orelse + (Limit =:= infinity)) -> + true; + (_) -> + false + end, + get_cacheopt(Cache, gclimit, CacheOpts, + infinity, ?DEFAULT_CACHE_GCLIMIT, + IsValid). + +get_cacheopt_age(Cache, CacheOpts) -> + IsValid = fun(Age) when is_integer(Age) andalso (Age > 0) -> + true; + (_) -> + false + end, + get_cacheopt(Cache, age, CacheOpts, + ?DEFAULT_CACHE_AGE, ?DEFAULT_CACHE_AGE, + IsValid). + +get_cacheopt(?NO_CACHE, _, _, NoCacheVal, _, _) -> + NoCacheVal; +get_cacheopt(_, Key, Opts, _, Default, IsValid) -> + Val = get_opt(Key, Opts, Default), + case IsValid(Val) of + true -> + Val; + false -> + throw({error, {bad_option, {Key, Val}}}) + end. %% ---------------------------------------------------------------- -maybe_create_cache(Options) when is_list(Options) -> - case snmp_misc:get_option(cache, Options, ?DEFAULT_CACHE_USAGE) of - true -> - new_cache(); - _ -> - ?NO_CACHE - end. +handle_update_cache_opts(cache, true = _Value, + #state{cache = ?NO_CACHE} = State) -> + {ok, State#state{cache = new_cache()}}; +handle_update_cache_opts(cache, true = _Value, State) -> + {ok, State}; + +handle_update_cache_opts(cache, false = _Value, + #state{cache = ?NO_CACHE} = State) -> + {ok, State}; +handle_update_cache_opts(cache, false = _Value, + #state{cache = Cache, + cache_tmr = Tmr} = State) -> + maybe_stop_cache_gc_timer(Tmr), + del_cache(Cache), + {ok, State#state{cache = ?NO_CACHE, cache_tmr = undefined}}; + +handle_update_cache_opts(autogc, true = _Value, + #state{cache_autogc = true} = State) -> + {ok, State}; +handle_update_cache_opts(autogc, true = Value, State) -> + {ok, maybe_start_cache_gc_timer(State#state{cache_autogc = Value})}; +handle_update_cache_opts(autogc, false = _Value, + #state{cache_autogc = false} = State) -> + {ok, State}; +handle_update_cache_opts(autogc, false = Value, + #state{cache_tmr = Tmr} = State) -> + maybe_stop_cache_gc_timer(Tmr), + {ok, State#state{cache_autogc = Value, cache_tmr = undefined}}; + +handle_update_cache_opts(age, Age, State) -> + {ok, State#state{cache_age = Age}}; + +handle_update_cache_opts(gclimit, GcLimit, State) -> + {ok, State#state{cache_gclimit = GcLimit}}; + +handle_update_cache_opts(BadKey, Value, State) -> + {{error, {bad_cache_opt, BadKey, Value}}, State}. + + +maybe_stop_cache_gc_timer(undefined) -> + ok; +maybe_stop_cache_gc_timer(Tmr) -> + erlang:cancel_timer(Tmr). + + +maybe_start_cache_gc_timer(#state{cache = Cache, + cache_autogc = true, + cache_tmr = undefined} = State) + when (Cache =/= ?NO_CACHE) -> + Tmr = start_cache_gc_timer(), + State#state{cache_tmr = Tmr}; +maybe_start_cache_gc_timer(State) -> + State. + +start_cache_gc_timer() -> + erlang:send_after(?CACHE_GC_TICKTIME, self(), ?CACHE_GC_TRIGGER). + + +%% ---------------------------------------------------------------- + +maybe_gc_cache(?NO_CACHE, _Age) -> + ?vtrace("cache not enabled", []), + ok; +maybe_gc_cache(Cache, Age) -> + MatchSpec = gc_cache_matchspec(Age), + Keys = ets:select(Cache, MatchSpec), + do_gc_cache(Cache, Keys), + {ok, length(Keys)}. + +maybe_gc_cache(?NO_CACHE, _Age, _GcLimit) -> + ok; +maybe_gc_cache(Cache, Age, infinity = _GcLimit) -> + maybe_gc_cache(Cache, Age); +maybe_gc_cache(Cache, Age, GcLimit) -> + MatchSpec = gc_cache_matchspec(Age), + Keys = + case ets:select(Cache, MatchSpec, GcLimit) of + {Match, _Cont} -> + Match; + '$end_of_table' -> + [] + end, + do_gc_cache(Cache, Keys), + {ok, length(Keys)}. + +gc_cache_matchspec(Age) -> + Oldest = timestamp() - Age, + MatchHead = {'$1', '_', '$2'}, + Guard = [{'<', '$2', Oldest}], + MatchFunc = {MatchHead, Guard, ['$1']}, + MatchSpec = [MatchFunc], + MatchSpec. + +do_gc_cache(_, []) -> + ok; +do_gc_cache(Cache, [Key|Keys]) -> + ets:delete(Cache, Key), + do_gc_cache(Cache, Keys). maybe_invalidate_cache(?NO_CACHE) -> ?NO_CACHE; @@ -559,6 +826,11 @@ del_cache(Cache), new_cache(). +maybe_cache_size(?NO_CACHE) -> + {error, not_enabled}; +maybe_cache_size(Cache) -> + {ok, ets:info(Cache, size)}. + new_cache() -> ets:new(snmpa_mib_cache, [set, protected, {keypos, 1}]). @@ -582,6 +854,15 @@ undefined end. +timestamp() -> + snmp_misc:now(ms). + + +%% ---------------------------------------------------------------- + +get_opt(Key, Options, Default) -> + snmp_misc:get_option(Key, Options, Default). + %% ---------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_mib_lib.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_mib_lib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_mib_lib.erl 2009-03-12 12:31:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_mib_lib.erl 2009-09-18 13:47:49.000000000 +0100 @@ -19,6 +19,7 @@ -module(snmpa_mib_lib). -export([table_cre_row/3, table_del_row/2]). +-export([get_table/2, print_table/3, print_table/4, print_tables/1]). -export([gc_tab/3, gc_tab/5]). -include("SNMPv2-TC.hrl"). @@ -48,11 +49,96 @@ ?vtrace("delete mnesia table ~w row with Key: ~w",[Tab, Key]), {error, mnesia_not_supported}; table_del_row({Tab, Db} = TabDb, Key) -> - ?vtrace("delete ~w table ~w row with Key: ~w",[Db, Tab, Key]), + ?vtrace("delete ~w table ~w row with Key: ~w", [Db, Tab, Key]), snmpa_local_db:table_delete_row(TabDb, Key). %%%----------------------------------------------------------------- +%%% Retreives the entire table. Used for debugging +%%%----------------------------------------------------------------- + +get_table(NameDb, FOI) -> + (catch get_table(NameDb, FOI, [], [])). + +get_table(NameDb, FOI, Oid, Acc) -> + case table_next(NameDb, Oid) of + endOfTable -> + ?vdebug("end of table",[]), + {ok, lists:reverse(Acc)}; + Oid -> + %% Crap, circular ref + ?vinfo("cyclic reference: ~w -> ~w", [Oid,Oid]), + throw({error, {cyclic_db_reference, Oid, Acc}}); + NextOid -> + ?vtrace("get row for oid ~w", [NextOid]), + case table_get_row(NameDb, NextOid, FOI) of + undefined -> + throw({error, {invalid_rowindex, NextOid, Acc}}); + Row -> + ?vtrace("row: ~w", [Row]), + get_table(NameDb, FOI, NextOid, [{NextOid, Row}|Acc]) + end + end. + + +print_tables(Tables) when is_list(Tables) -> + lists:foreach(fun({Table, DB, FOI, PrintRow}) -> + print_table(Table, DB, FOI, PrintRow) + end, Tables), + ok. + +%% print_table(Table, DB, FOI, PrintRow) -> +%% TableInfo = get_table(DB(Table), FOI(Table)), +%% print_table(Table, TableInfo, PrintRow), +%% ok. + +print_table(Table, DB, FOI, PrintRow) -> + TableInfo = get_table(DB, FOI), + print_table(Table, TableInfo, PrintRow). + +print_table(Table, TableInfo, PrintRow) when is_function(PrintRow, 2) -> + io:format("~w => ~n", [Table]), + do_print_table(TableInfo, PrintRow). + +do_print_table({ok, TableInfo}, PrintRow) when is_function(PrintRow, 2) -> + lists:foreach(fun({RowIdx, Row}) -> + io:format(" ~w => ~n~s~n", + [RowIdx, PrintRow(" ", Row)]) + end, TableInfo), + io:format("~n", []); +do_print_table({error, {invalid_rowindex, BadRowIndex, []}}, _PrintRow) -> + io:format("Error: Bad rowindex ~w~n", [BadRowIndex]); +do_print_table({error, {invalid_rowindex, BadRowIndex, TableInfo}}, PrintRow) -> + io:format("Error: Bad rowindex ~w", [BadRowIndex]), + do_print_table(TableInfo, PrintRow); +do_print_table(Error, _PrintRow) -> + io:format("Error: ~p~n", [Error]). + + +%%%----------------------------------------------------------------- +%%% +%%%----------------------------------------------------------------- + +table_next({Name, mnesia}, RestOid) -> + snmp_generic_mnesia:table_next(Name, RestOid); +table_next(NameDb, RestOid) -> + snmpa_local_db:table_next(NameDb, RestOid). + + +table_get_row({Name, mnesia}, RowIndex) -> + snmp_generic_mnesia:table_get_row(Name, RowIndex); +table_get_row(NameDb, RowIndex) -> + snmpa_local_db:table_get_row(NameDb, RowIndex). + +table_get_row(NameDb, RowIndex, undefined) -> + table_get_row(NameDb, RowIndex); +table_get_row({Name, mnesia}, RowIndex, FOI) -> + snmp_generic_mnesia:table_get_row(Name, RowIndex, FOI); +table_get_row(NameDb, RowIndex, _FOI) -> + snmpa_local_db:table_get_row(NameDb, RowIndex). + + +%%%----------------------------------------------------------------- %%% Utility module for the mib-implementation modules (such as %%% snmp_target_mib). %%%----------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_mpd.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_mpd.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_mpd.erl 2009-06-05 13:55:08.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_mpd.erl 2009-09-18 13:47:36.000000000 +0100 @@ -275,8 +275,8 @@ {SecEngineID, SecName, ScopedPDUBytes, SecData, DiscoOrPlain} = check_sec_module_result(SecRes, V3Hdr, Data, IsReportable, Log), ?vtrace("v3_proc -> " - "~n DiscoOrPlain: ~p" - "~n SecEngineID: ~p" + "~n DiscoOrPlain: ~w" + "~n SecEngineID: ~w" "~n SecName: ~p", [DiscoOrPlain, SecEngineID, SecName]), %% 7.2.7 #scopedPdu{contextEngineID = ContextEngineID, @@ -301,7 +301,7 @@ ok end, ?vlog("7.2.7 result: " - "~n contextEngineID: \"~s\"" + "~n contextEngineID: ~w" "~n ContextName: \"~s\"", [ContextEngineID, ContextName]), if SecLevel =:= ?'SnmpSecurityLevel_authPriv' -> @@ -332,7 +332,7 @@ ?vdebug("v3_proc -> PDU type: ~p", [PDU#pdu.type]), case PDU#pdu.type of report when DiscoOrPlain =:= discovery -> - %% Discovery step 1 response + %% Discovery stage 1 response Key = {agent, MsgID}, Note = snmp_note_store:get_note(NoteStore, Key), case Note of @@ -345,8 +345,8 @@ disco = true, req_id = _ReqId} -> %% This is part of the discovery process initiated by us. - %% Response to the discovery step 1 request - ?vdebug("v3_proc -> discovery step 1 response", []), + %% Response to the discovery stage 1 request + ?vdebug("v3_proc -> discovery stage 1 response", []), {ok, 'version-3', PDU, PduMMS, {discovery, SecEngineID}}; #note{sec_engine_id = SecEngineID, sec_model = _MsgSecModel, @@ -357,12 +357,13 @@ disco = true, req_id = _ReqId} -> %% This is part of the discovery process initiated by us. - %% Response to the discovery step 2 request - ?vdebug("v3_proc -> discovery step 2 response", []), + %% Response to the discovery stage 2 request + ?vdebug("v3_proc -> discovery stage 2 response", []), {ok, 'version-3', PDU, PduMMS, discovery}; _ -> %% 7.2.11 - throw({discarded, report}) + DiscardReason = {bad_disco_note, Key, Note}, + throw({discarded, DiscardReason}) end; report -> %% 7.2.11 @@ -381,8 +382,8 @@ disco = true, req_id = _ReqId} -> %% This is part of the discovery process initiated by us. - %% Response to the discovery step 1 request - ?vdebug("v3_proc -> discovery step 1 response", []), + %% Response to the discovery stage 1 request + ?vdebug("v3_proc -> discovery stage 1 response", []), {ok, 'version-3', PDU, PduMMS, {discovery, SecEngineID}}; #note{sec_engine_id = SecEngineID, sec_model = _MsgSecModel, @@ -393,8 +394,8 @@ disco = true, req_id = _ReqId} -> %% This is part of the discovery process initiated by us. - %% Response to the discovery step 2 request - ?vdebug("v3_proc -> discovery step 2 response", []), + %% Response to the discovery stage 2 request + ?vdebug("v3_proc -> discovery stage 2 response", []), {ok, 'version-3', PDU, PduMMS, discovery}; #note{sec_engine_id = SecEngineID, sec_model = MsgSecurityModel, @@ -415,11 +416,11 @@ Type -> %% 7.2.13 SnmpEngineID = snmp_framework_mib:get_engine_id(), - ?vtrace("v3_proc -> SnmpEngineID = ~p", [SnmpEngineID]), + ?vtrace("v3_proc -> SnmpEngineID = ~w", [SnmpEngineID]), case SecEngineID of SnmpEngineID when (DiscoOrPlain =:= discovery) -> %% This is a discovery step 2 message! - ?vtrace("v3_proc -> discovery step 2", []), + ?vtrace("v3_proc -> discovery stage 2", []), generate_discovery2_report_msg(MsgID, MsgSecurityModel, SecName, @@ -611,7 +612,7 @@ snmpa_usm end, SecEngineID = snmp_framework_mib:get_engine_id(), - ?vtrace("generate_response_msg -> SecEngineID: ~p", [SecEngineID]), + ?vtrace("generate_response_msg -> SecEngineID: ~w", [SecEngineID]), case (catch SecModule:generate_outgoing_msg(Message, SecEngineID, SecName, @@ -713,7 +714,7 @@ %% ok; %% {error, Reason} -> -%% Response to step 1 discovery message (from the manager) +%% Response to stage 1 discovery message (terminating, i.e. from the manager) generate_discovery1_report_msg(MsgID, MsgSecurityModel, SecName, SecLevel, ContextEngineID, ContextName, @@ -740,18 +741,20 @@ Error end. -%% Response to step 2 discovery message (from the manager) +%% Response to stage 2 discovery message (terminating, i.e. from the manager) generate_discovery2_report_msg(MsgID, MsgSecurityModel, SecName, SecLevel, ContextEngineID, ContextName, SecData, #pdu{request_id = ReqId}, Log) -> ?vtrace("generate_discovery2_report_msg -> entry with" "~n ReqId: ~p", [ReqId]), + SecModule = get_security_module(MsgSecurityModel), + Vb = SecModule:current_statsNotInTimeWindows_vb(), PduOut = #pdu{type = report, request_id = ReqId, error_status = noError, error_index = 0, - varbinds = []}, + varbinds = [Vb]}, case generate_response_msg('version-3', PduOut, report, {v3, MsgID, MsgSecurityModel, SecName, SecLevel, ContextEngineID, ContextName, SecData}, Log) of @@ -937,7 +940,7 @@ InitialUserName, ContextName, Timeout) -> %% 7.1.7 - ?vdebug("generate_discovery_msg -> 7.1.7 (~p)", [ManagerEngineID]), + ?vdebug("generate_discovery_msg -> 7.1.7 (~w)", [ManagerEngineID]), MsgID = generate_msg_id(), PduType = Pdu#pdu.type, MsgFlags = mk_msg_flags(PduType, SecLevelFlag), @@ -953,7 +956,6 @@ %% 7.1.9b ?vdebug("generate_discovery_msg -> 7.1.9b", []), case generate_sec_discovery_msg(Message, SecModule, - ContextEngineID, ManagerEngineID, SecName, SecLevelFlag, InitialUserName) of @@ -984,11 +986,9 @@ end. generate_sec_discovery_msg(Message, SecModule, - ContextEngineID, ManagerEngineID, - SecName, SecLevelFlag, + SecEngineID, SecName, SecLevelFlag, InitialUserName) -> - case (catch SecModule:generate_discovery_msg(Message, ContextEngineID, - ManagerEngineID, + case (catch SecModule:generate_discovery_msg(Message, SecEngineID, SecName, SecLevelFlag, InitialUserName)) of {'EXIT', Reason} -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_net_if.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_net_if.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_net_if.erl 2009-06-05 13:55:56.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_net_if.erl 2009-09-18 15:13:14.000000000 +0100 @@ -80,7 +80,7 @@ info(Pid) -> case call(Pid, info) of - Info when list(Info) -> + Info when is_list(Info) -> Info; _ -> [] @@ -312,16 +312,6 @@ NewS = handle_send_discovery(S, Pdu, MsgData, To, From), loop(NewS); -%% {send_discovery, Pdu, MsgData, Timeout, To, From} -> -%% ?vdebug("send pdu request: " -%% "~n Pdu: ~p" -%% "~n Timeout: ~p" -%% "~n To: ~p" -%% "~n From: ~p", -%% [Pdu, Timeout, To, toname(From)]), -%% NewS = handle_send_discovery(S, Pdu, MsgData, To, From), -%% loop(NewS); - {discarded_pdu, _Vsn, ReqId, _ACMData, Variable, _Extra} -> ?vdebug("discard PDU: ~p", [Variable]), snmpa_mpd:discarded_pdu(Variable), @@ -390,7 +380,7 @@ end, loop(NewS); - {'EXIT', Port, Reason} when port(Port) -> + {'EXIT', Port, Reason} when is_port(Port) -> error_msg("Exit message from port ~p for reason ~p~n", [Port, Reason]), loop(S); @@ -479,9 +469,10 @@ handle_discovery_response(_Ip, _Port, #pdu{request_id = ReqId} = Pdu, ManagerEngineId, - #state{reqs = Reqs} = S) -> + #state{usock = Sock, reqs = Reqs} = S) -> case lists:keysearch(ReqId, 1, S#state.reqs) of {value, {_, Pid}} -> + active_once(Sock), Pid ! {snmp_discovery_response_received, Pdu, ManagerEngineId}, NReqs = lists:keydelete(ReqId, 1, Reqs), S#state{reqs = NReqs}; @@ -508,16 +499,14 @@ handle_discovery_response(Ip, Port, Pdu, undefined, S); {ok, Vsn, Pdu, PduMS, ACMData} -> - ?vlog("got pdu" - "~n ~s", - [?vapply(snmp_misc, format, [256, "~w", [Pdu]])]), + ?vlog("got pdu ~s", + [?vapply(snmp_misc, format, [256, "~w", [Pdu]])]), %% handle_recv_pdu(Ip, Port, Vsn, Pdu, PduMS, ACMData, S); maybe_handle_recv_pdu(Ip, Port, Vsn, Pdu, PduMS, ACMData, S); {discarded, Reason} -> - ?vlog("packet discarded for reason: " - "~n ~s", - [?vapply(snmp_misc, format, [256, "~w", [Reason]])]), + ?vlog("packet discarded for reason: ~s", + [?vapply(snmp_misc, format, [256, "~w", [Reason]])]), active_once(Sock), S; @@ -833,8 +822,8 @@ ok end. -sz(L) when list(L) -> length(L); -sz(B) when binary(B) -> size(B); +sz(L) when is_list(L) -> length(L); +sz(B) when is_binary(B) -> size(B); sz(_) -> undefined. diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_set_lib.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_set_lib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_set_lib.erl 2009-03-12 12:27:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_set_lib.erl 2009-09-18 15:12:09.000000000 +0100 @@ -117,11 +117,11 @@ %% Returns: true | checkASN1Type(#me{asn1_type = ASN1Type}, #varbind{variabletype = Type, value = Value}) - when ASN1Type#asn1_type.bertype == Type -> + when ASN1Type#asn1_type.bertype =:= Type -> case make_value_a_correct_value({value, Value}, ASN1Type, undef) of {value, Type, Value} -> true; - {error, Error} when atom(Error) -> throw(Error) + {error, Error} when is_atom(Error) -> throw(Error) end; checkASN1Type(_,_) -> throw(wrongType). @@ -337,11 +337,11 @@ col_to_orgindex(ColNumber, OrgCols) -> snmpa_svbl:col_to_orgindex(ColNumber, OrgCols). -find_org_index(ExternIndex, _SortedVarbinds) when ExternIndex == 0 -> 0; +find_org_index(ExternIndex, _SortedVarbinds) when ExternIndex =:= 0 -> 0; find_org_index(ExternIndex, SortedVarbinds) -> VBs = lists:flatten(SortedVarbinds), case length(VBs) of - Len when ExternIndex =< Len, ExternIndex >= 1 -> + Len when (ExternIndex =< Len) andalso (ExternIndex >= 1) -> IVB = lists:nth(ExternIndex, VBs), VB = IVB#ivarbind.varbind, VB#varbind.org_index; diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_supervisor.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_supervisor.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_supervisor.erl 2009-06-05 13:54:53.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_supervisor.erl 2009-09-18 15:12:10.000000000 +0100 @@ -158,7 +158,7 @@ %% ---------------------------------------------------------------- start_sub_agent(ParentAgent, Subtree, Mibs) - when pid(ParentAgent), list(Mibs) -> + when is_pid(ParentAgent) andalso is_list(Mibs) -> ?d("start_sub_agent -> entry with" "~n ParentAgent: ~p" "~n Subtree: ~p" @@ -515,8 +515,12 @@ worker_spec(Name, Mod, start_link, Args, Type, Time, Modules). worker_spec(Name, Mod, Func, Args, Type, Time, Modules) - when is_atom(Name) and is_atom(Mod) and is_atom(Func) and is_list(Args) and - is_atom(Type) and is_list(Modules) -> + when is_atom(Name) andalso + is_atom(Mod) andalso + is_atom(Func) andalso + is_list(Args) andalso + is_atom(Type) andalso + is_list(Modules) -> ?d("worker_spec -> entry with" "~n Name: ~p" "~n Mod: ~p" diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_svbl.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_svbl.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_svbl.erl 2009-03-12 12:27:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_svbl.erl 2009-09-18 15:12:11.000000000 +0100 @@ -75,9 +75,9 @@ % VarBind#varbind{variabletype = 'BITS', % value = snmp_pdus:octet_str_to_bits(V)}; fix_bits(VarBind, #me{asn1_type=A}) - when A#asn1_type.bertype == 'BITS', - VarBind#varbind.variabletype == 'OCTET STRING', - list(VarBind#varbind.value) -> + when ((A#asn1_type.bertype =:= 'BITS') andalso + (VarBind#varbind.variabletype =:= 'OCTET STRING') andalso + is_list(VarBind#varbind.value)) -> VarBind#varbind{variabletype = 'BITS', value = snmp_pdus:octet_str_to_bits(VarBind#varbind.value)}; fix_bits(Vb,_me) -> Vb. diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_symbolic_store.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_symbolic_store.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_symbolic_store.erl 2009-03-12 12:27:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_symbolic_store.erl 2009-09-18 15:12:11.000000000 +0100 @@ -595,7 +595,7 @@ stop_backup_server(undefined) -> ok; -stop_backup_server({Pid, _}) when pid(Pid) -> +stop_backup_server({Pid, _}) when is_pid(Pid) -> exit(Pid, kill). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_trap.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_trap.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_trap.erl 2009-06-05 13:54:54.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_trap.erl 2009-09-18 13:47:31.000000000 +0100 @@ -516,7 +516,6 @@ {error, {not_found, snmpTargetAddrTable}} end. - send_discovery_pdu({Dest, TargetName, {SecModel, SecName, SecLevel}, Timeout, Retry}, Record, ContextName, Vbs, NetIf) -> @@ -532,8 +531,7 @@ "~n ContextName: ~p", [Dest, TargetName, SecModel, SecName, SecLevel, Timeout, Retry, Record, ContextName]), - case snmpa_vacm:get_mib_view(notify, SecModel, SecName, SecLevel, - ContextName) of + case get_mib_view(SecModel, SecName, SecLevel, ContextName) of {ok, MibView} -> case check_all_varbinds(Record, Vbs, MibView) of true -> @@ -631,8 +629,7 @@ "~n V2Res: ~p" "~n V3Res: ~p", [DestAddr, TargetName, MpModel, Type, V1Res, V2Res, V3Res]), - case snmpa_vacm:get_mib_view(notify, SecModel, SecName, SecLevel, - ContextName) of + case get_mib_view(SecModel, SecName, SecLevel, ContextName) of {ok, MibView} -> case check_all_varbinds(TrapRec, Vbs, MibView) of true when MpModel =:= ?MP_V1 -> @@ -1042,6 +1039,13 @@ mk_flag(?'SnmpSecurityLevel_authPriv') -> 3. +%%-------------------------------------------------- +%% Mib view wrapper +%%-------------------------------------------------- +get_mib_view(SecModel, SecName, SecLevel, ContextName) -> + snmpa_vacm:get_mib_view(notify, + SecModel, SecName, SecLevel, ContextName). + user_err(F, A) -> snmpa_error:user_err(F, A). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_usm.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_usm.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmpa_usm.erl 2009-06-05 13:55:23.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmpa_usm.erl 2009-09-18 15:12:34.000000000 +0100 @@ -21,7 +21,8 @@ -export([ process_incoming_msg/4, generate_outgoing_msg/5, - generate_discovery_msg/5, generate_discovery_msg/6 + generate_discovery_msg/4, generate_discovery_msg/5, + current_statsNotInTimeWindows_vb/0 ]). -define(SNMP_USE_V3, true). @@ -58,6 +59,7 @@ process_incoming_msg(Packet, Data, SecParams, SecLevel) -> TermDiscoEnabled = is_terminating_discovery_enabled(), + TermTriggerUsername = terminating_trigger_username(), %% 3.2.1 ?vtrace("process_incoming_msg -> check security parms: 3.2.1",[]), UsmSecParams = @@ -70,22 +72,17 @@ end, case UsmSecParams of #usmSecurityParameters{msgAuthoritativeEngineID = MsgAuthEngineID, - msgUserName = ""} when TermDiscoEnabled =:= true -> + msgUserName = TermTriggerUsername} when TermDiscoEnabled =:= true -> %% Step 1 discovery message - ?vtrace("process_incoming_msg -> discovery step 1", []), - process_discovery_msg(MsgAuthEngineID, Data, SecLevel); - - #usmSecurityParameters{msgAuthoritativeEngineID = MsgAuthEngineID, - msgUserName = "initial"} when TermDiscoEnabled =:= true -> - %% Step 1 discovery message - ?vtrace("process_incoming_msg -> [initial] discovery step 1", []), + ?vtrace("process_incoming_msg -> [~p] discovery step 1", + [TermTriggerUsername]), process_discovery_msg(MsgAuthEngineID, Data, SecLevel); #usmSecurityParameters{msgAuthoritativeEngineID = MsgAuthEngineID, msgUserName = MsgUserName} -> ?vlog("process_incoming_msg -> USM security parms: " - "~n authEngineID: \"~s\"" - "~n userName: \"~s\"", [MsgAuthEngineID, MsgUserName]), + "~n msgAuthEngineID: ~w" + "~n userName: ~p", [MsgAuthEngineID, MsgUserName]), %% 3.2.3 ?vtrace("process_incoming_msg -> check engine id: 3.2.3",[]), case snmp_user_based_sm_mib:is_engine_id_known(MsgAuthEngineID) of @@ -171,7 +168,7 @@ authenticate_incoming(Packet, UsmSecParams, UsmUser, SecLevel) -> %% 3.2.6 - ?vtrace("authenticate_incoming -> 3.2.6",[]), + ?vtrace("authenticate_incoming -> 3.2.6", []), AuthProtocol = element(?usmUserAuthProtocol, UsmUser), #usmSecurityParameters{msgAuthoritativeEngineID = MsgAuthEngineID, msgAuthoritativeEngineBoots = MsgAuthEngineBoots, @@ -179,7 +176,7 @@ msgAuthenticationParameters = MsgAuthParams} = UsmSecParams, ?vtrace("authenticate_incoming -> Sec params: " - "~n MsgAuthEngineID: ~p" + "~n MsgAuthEngineID: ~w" "~n MsgAuthEngineBoots: ~p" "~n MsgAuthEngineTime: ~p", [MsgAuthEngineID, MsgAuthEngineBoots, MsgAuthEngineTime]), @@ -256,9 +253,13 @@ [SecName, MsgAuthEngineID, MsgAuthEngineBoots, MsgAuthEngineTime]), SnmpEngineBoots = get_engine_boots(MsgAuthEngineID), - ?vtrace("non_authoritative -> SnmpEngineBoots: ~p", [SnmpEngineBoots]), - SnmpEngineTime = get_engine_time(MsgAuthEngineID), - LatestRecvTime = get_engine_latest_time(MsgAuthEngineID), + SnmpEngineTime = get_engine_time(MsgAuthEngineID), + LatestRecvTime = get_engine_latest_time(MsgAuthEngineID), + ?vtrace("non_authoritative -> " + "~n SnmpEngineBoots: ~p" + "~n SnmpEngineTime: ~p" + "~n LatestRecvTime: ~p", + [SnmpEngineBoots, SnmpEngineTime, LatestRecvTime]), UpdateLCD = if MsgAuthEngineBoots > SnmpEngineBoots -> true; @@ -279,16 +280,15 @@ end, %% 3.2.7.b2 ?vtrace("non_authoritative -> " - "check if message is outside time window: 3.2.7b2", - []), + "check if message is outside time window: 3.2.7b2", []), InTimeWindow = if - SnmpEngineBoots == 2147483647 -> + SnmpEngineBoots =:= 2147483647 -> false; MsgAuthEngineBoots < SnmpEngineBoots -> false; - MsgAuthEngineBoots =:= SnmpEngineBoots, - MsgAuthEngineTime < (SnmpEngineTime - 150) -> + ((MsgAuthEngineBoots =:= SnmpEngineBoots) andalso + (MsgAuthEngineTime < (SnmpEngineTime - 150))) -> false; true -> true end, @@ -305,9 +305,19 @@ SnmpEngineTime, MsgAuthEngineTime]), error(notInTimeWindow, []); true -> - ok - end, - true. + %% If the previous values where all zero's this is the + %% second stage discovery message + if + ((SnmpEngineBoots =:= 0) andalso + (SnmpEngineTime =:= 0) andalso + (LatestRecvTime =:= 0)) -> + ?vtrace("non_authoritative -> " + "[maybe] originating discovery stage 2", []), + discovery; + true -> + true + end + end. is_auth(?usmNoAuthProtocol, _, _, _, SecName, _, _, _) -> % 3.2.5 @@ -318,6 +328,7 @@ TermDiscoEnabled = is_terminating_discovery_enabled(), TermDiscoStage2 = terminating_discovery_stage2(), IsAuth = auth_in(AuthProtocol, AuthKey, AuthParams, Packet), + ?vtrace("is_auth -> IsAuth: ~p", [IsAuth]), case IsAuth of true -> %% 3.2.7 @@ -330,13 +341,13 @@ (MsgAuthEngineTime =:= 0) andalso (TermDiscoEnabled =:= true) andalso (TermDiscoStage2 =:= discovery)) -> %% 3.2.7a - ?vtrace("is_auth -> discovery stage 2 - discovery",[]), + ?vtrace("is_auth -> terminating discovery stage 2 - discovery",[]), discovery; SnmpEngineID when ((MsgAuthEngineBoots =:= 0) andalso (MsgAuthEngineTime =:= 0) andalso (TermDiscoEnabled =:= true) andalso (TermDiscoStage2 =:= plain)) -> %% 3.2.7a - ?vtrace("is_auth -> discovery stage 2 - plain",[]), + ?vtrace("is_auth -> terminating discovery stage 2 - plain",[]), %% This will *always* result in the manager *not* %% beeing in timewindow authoritative(SecName, @@ -477,23 +488,20 @@ AuthKey, AuthProtocol, SecLevel). -generate_discovery_msg(Message, SecEngineID, ManagerEngineID, - SecName, SecLevel) -> - generate_discovery_msg(Message, SecEngineID, ManagerEngineID, - SecName, SecLevel, ""). +generate_discovery_msg(Message, SecEngineID, SecName, SecLevel) -> + generate_discovery_msg(Message, SecEngineID, SecName, SecLevel, ""). -generate_discovery_msg(Message, SecEngineID, ManagerEngineID, - SecName, SecLevel, InitialUserName) -> +generate_discovery_msg(Message, + SecEngineID, SecName, SecLevel, + InitialUserName) -> ?vtrace("generate_discovery_msg -> entry with" "~n SecEngineID: ~p" - "~n ManagerEngineID: ~p" "~n SecName: ~p" "~n SecLevel: ~p" "~n InitialUserName: ~p", - [SecEngineID, ManagerEngineID, SecName, SecLevel, - InitialUserName]), + [SecEngineID, SecName, SecLevel, InitialUserName]), {UserName, AuthProtocol, AuthKey, PrivProtocol, PrivKey} = - case ManagerEngineID of + case SecEngineID of "" -> %% Discovery step 1 %% Nothing except the user name will be used in this @@ -504,26 +512,6 @@ {InitialUserName, usmNoAuthProtocol, "", usmNoPrivProtocol, ""}; -%% _ -> -%% %% Discovery step 2 -%% case snmp_user_based_sm_mib:get_user_from_security_name( -%% SecEngineID, SecName) of -%% User when element(?usmUserStatus, User) =:= -%% ?'RowStatus_active' -> -%% {element(?usmUserName, User), -%% element(?usmUserAuthProtocol, User), -%% element(?usmUserAuthKey, User), -%% usmNoPrivProtocol, ""}; -%% {_, Name,_,_,_,_,_,_,_,_,_,_,_, RowStatus,_,_} -> -%% ?vdebug("generate_discovery_msg -> " -%% "found user ~p with wrong row status: ~p", -%% [Name, RowStatus]), -%% error(unknownSecurityName); -%% _ -> -%% error(unknownSecurityName) -%% end - - _ -> %% Discovery step 2 case snmp_user_based_sm_mib:get_user_from_security_name( @@ -548,7 +536,7 @@ {ScopedPduData, MsgPrivParams} = encrypt(ScopedPduBytes, PrivProtocol, PrivKey, SecLevel), UsmSecParams = - #usmSecurityParameters{msgAuthoritativeEngineID = ManagerEngineID, + #usmSecurityParameters{msgAuthoritativeEngineID = SecEngineID, msgAuthoritativeEngineBoots = 0, % Boots, msgAuthoritativeEngineTime = 0, % Time, msgUserName = UserName, @@ -676,6 +664,14 @@ terminating_discovery_stage2() -> snmpa_agent:terminating_discovery_stage2(). +terminating_trigger_username() -> + snmpa_agent:terminating_trigger_username(). + +current_statsNotInTimeWindows_vb() -> + #varbind{oid = ?usmStatsNotInTimeWindows_instance, + variabletype = 'Counter32', + value = get_counter(usmStatsNotInTimeWindows)}. + %%----------------------------------------------------------------- %% We cache the local values of all non-auth engines we know. diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_community_mib.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_community_mib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_community_mib.erl 2009-03-12 12:29:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_community_mib.erl 2009-09-18 13:47:39.000000000 +0100 @@ -337,6 +337,49 @@ %%----------------------------------------------------------------- %% Instrumentation Functions %%----------------------------------------------------------------- +%% Op = print - Used for debugging purposes +snmpCommunityTable(print) -> + Table = snmpCommunityTable, + DB = db(Table), + FOI = foi(Table), + PrintRow = + fun(Prefix, Row) -> + lists:flatten( + io_lib:format("~sIndex: ~p" + "~n~sName: ~p" + "~n~sSecurityName: ~p" + "~n~sContextEngineID: ~p" + "~n~sContextName: ~p" + "~n~sTransportTag: ~p" + "~n~sStorageType: ~p (~w)" + "~n~sStatus: ~p (~w)", + [Prefix, element(?snmpCommunityIndex, Row), + Prefix, element(?snmpCommunityName, Row), + Prefix, element(?snmpCommunitySecurityName, Row), + Prefix, element(?snmpCommunityContextEngineID, Row), + Prefix, element(?snmpCommunityContextName, Row), + Prefix, element(?snmpCommunityTransportTag, Row), + Prefix, element(?snmpCommunityStorageType, Row), + case element(?snmpCommunityStorageType, Row) of + ?'snmpCommunityStorageType_readOnly' -> readOnly; + ?'snmpCommunityStorageType_permanent' -> permanent; + ?'snmpCommunityStorageType_nonVolatile' -> nonVolatile; + ?'snmpCommunityStorageType_volatile' -> volatile; + ?'snmpCommunityStorageType_other' -> other; + _ -> undefined + end, + Prefix, element(?snmpCommunityStatus, Row), + case element(?snmpCommunityStatus, Row) of + ?'snmpCommunityStatus_destroy' -> destroy; + ?'snmpCommunityStatus_createAndWait' -> createAndWait; + ?'snmpCommunityStatus_createAndGo' -> createAndGo; + ?'snmpCommunityStatus_notReady' -> notReady; + ?'snmpCommunityStatus_notInService' -> notInService; + ?'snmpCommunityStatus_active' -> active; + _ -> undefined + end])) + end, + snmpa_mib_lib:print_table(Table, DB, FOI, PrintRow); %% Op == new | delete snmpCommunityTable(Op) -> snmp_generic:table_func(Op, db(snmpCommunityTable)). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_generic.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_generic.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_generic.erl 2009-03-12 12:27:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_generic.erl 2009-09-18 15:12:07.000000000 +0100 @@ -629,11 +629,11 @@ [[A, B, C, D] | collect_keys(Indexes, Keys)]; %% Otherwise, check if it has constant size collect_keys([#asn1_type{lo = X, hi = X} | Indexes], Keys) - when integer(X), length(Keys) >= X -> + when is_integer(X) andalso (length(Keys) >= X) -> {StrKey, Rest} = collect_length(X, Keys, []), [StrKey | collect_keys(Indexes, Rest)]; collect_keys([#asn1_type{lo = X, hi = X} | _Indexes], Keys) - when integer(X) -> + when is_integer(X) -> exit({error, {size_mismatch, X, Keys}}); %% Otherwise, its a dynamic-length type => its a list %% OBJECT IDENTIFIER, OCTET STRING or BITS (or derivatives) @@ -756,7 +756,7 @@ table_try_make_consistent(Name, RowIndex, _Cols) -> TableInfo = table_info(Name), case TableInfo#table_info.status_col of - StatusCol when integer(StatusCol) -> + StatusCol when is_integer(StatusCol) -> {value, StatusVal} = table_get_element(Name, RowIndex, StatusCol), table_try_make_consistent(Name, RowIndex, StatusVal, TableInfo); _ -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_generic_mnesia.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_generic_mnesia.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_generic_mnesia.erl 2009-03-12 12:27:40.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_generic_mnesia.erl 2009-09-18 15:12:13.000000000 +0100 @@ -190,7 +190,7 @@ make_row_list(N-1, Row, [element(N, Row) | Acc]); make_row_list(2, Row, Acc) -> case element(2, Row) of - Keys when tuple(Keys) -> + Keys when is_tuple(Keys) -> lists:append(tuple_to_list(Keys), Acc); Key -> [Key | Acc] @@ -268,7 +268,7 @@ status_col = StatusCol, index_types = IT} = snmp_generic:table_info(Name), if - integer(StatusCol) -> + is_integer(StatusCol) -> NewRow = make_row(NewDbRow, FirstOwnIndex), StatusVal = element(StatusCol, NewRow), AddCol = if diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_notification_mib.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_notification_mib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_notification_mib.erl 2009-03-12 12:28:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_notification_mib.erl 2009-09-18 13:47:37.000000000 +0100 @@ -288,6 +288,48 @@ %%----------------------------------------------------------------- %% Instrumentation Functions %%----------------------------------------------------------------- +%% Op = print - Used for debugging purposes +snmpNotifyTable(print) -> + Table = snmpNotifyTable, + DB = db(Table), + FOI = foi(Table), + PrintRow = + fun(Prefix, Row) -> + lists:flatten( + io_lib:format("~sName: ~p" + "~n~sTag: ~p" + "~n~sType: ~p (~w)" + "~n~sStorageType: ~p (~w)" + "~n~sStatus: ~p (~w)", + [Prefix, element(?snmpNotifyName, Row), + Prefix, element(?snmpNotifyTag, Row), + Prefix, element(?snmpNotifyType, Row), + case element(?snmpNotifyType, Row) of + ?snmpNotifyType_inform -> inform; + ?snmpNotifyType_trap -> trap; + _ -> undefined + end, + Prefix, element(?snmpNotifyStorageType, Row), + case element(?snmpNotifyStorageType, Row) of + ?'snmpNotifyStorageType_readOnly' -> readOnly; + ?'snmpNotifyStorageType_permanent' -> permanent; + ?'snmpNotifyStorageType_nonVolatile' -> nonVolatile; + ?'snmpNotifyStorageType_volatile' -> volatile; + ?'snmpNotifyStorageType_other' -> other; + _ -> undefined + end, + Prefix, element(?snmpNotifyRowStatus, Row), + case element(?snmpNotifyRowStatus, Row) of + ?'snmpNotifyRowStatus_destroy' -> destroy; + ?'snmpNotifyRowStatus_createAndWait' -> createAndWait; + ?'snmpNotifyRowStatus_createAndGo' -> createAndGo; + ?'snmpNotifyRowStatus_notReady' -> notReady; + ?'snmpNotifyRowStatus_notInService' -> notInService; + ?'snmpNotifyRowStatus_active' -> active; + _ -> undefined + end])) + end, + snmpa_mib_lib:print_table(Table, DB, FOI, PrintRow); %% Op == new | delete snmpNotifyTable(Op) -> snmp_generic:table_func(Op, db(snmpNotifyTable)). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_standard_mib.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_standard_mib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_standard_mib.erl 2009-03-12 12:27:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_standard_mib.erl 2009-09-18 15:12:10.000000000 +0100 @@ -279,7 +279,7 @@ sys_or_table(Op, RowIndex, Cols) -> snmp_generic:table_func(Op, RowIndex, Cols, {sysORTable, volatile}). -add_agent_caps(Oid, Descr) when list(Oid), list(Descr) -> +add_agent_caps(Oid, Descr) when is_list(Oid) andalso is_list(Descr) -> {value, Next} = snmpa_local_db:variable_get({next_sys_or_index, volatile}), snmpa_local_db:variable_set({next_sys_or_index, volatile}, Next+1), SysUpTime = sys_up_time(), diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_target_mib.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_target_mib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_target_mib.erl 2009-03-12 12:28:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_target_mib.erl 2009-09-18 13:47:37.000000000 +0100 @@ -33,6 +33,7 @@ -include("SNMP-TARGET-MIB.hrl"). -include("SNMPv2-TC.hrl"). -include("SNMPv2-TM.hrl"). +-include("SNMP-FRAMEWORK-MIB.hrl"). -define(VMODULE,"TARGET-MIB"). -include("snmp_verbosity.hrl"). @@ -531,6 +532,71 @@ {snmpTargetSpinLock, volatile}). +%% Op = print - Used for debugging purposes +snmpTargetAddrTable(print) -> + Table = snmpTargetAddrTable, + DB = db(Table), + FOI = foi(Table), + PrintRow = + fun(Prefix, Row) -> + lists:flatten( + io_lib:format("~sName: ~p" + "~n~sTDomain: ~p (~w)" + "~n~sTAddress: ~p (~s)" + "~n~sTimeout: ~p" + "~n~sRetryCount: ~p" + "~n~sTagList: ~p" + "~n~sParams: ~p" + "~n~sStorageType: ~p (~w)" + "~n~sStatus: ~p (~w)" + "~n~s[NonAcc] EngineID: ~p" + "~n~s[Ext] TMask: ~p" + "~n~s[Ext] MMS: ~p", + [Prefix, element(?snmpTargetAddrName, Row), + Prefix, element(?snmpTargetAddrTDomain, Row), + case element(?snmpTargetAddrTDomain, Row) of + ?snmpUDPDomain -> udp; + _ -> undefined + end, + Prefix, element(?snmpTargetAddrTAddress, Row), + case element(?snmpTargetAddrTAddress, Row) of + [A,B,C,D,U1,U2] -> + lists:flatten( + io_lib:format("~w.~w.~w.~w:~w", + [A, B, C, D, U1 bsl 8 + U2])); + _ -> "-" + end, + Prefix, element(?snmpTargetAddrTimeout, Row), + Prefix, element(?snmpTargetAddrRetryCount, Row), + Prefix, element(?snmpTargetAddrTagList, Row), + Prefix, element(?snmpTargetAddrParams, Row), + Prefix, element(?snmpTargetAddrStorageType, Row), + case element(?snmpTargetAddrStorageType, Row) of + ?'snmpTargetAddrStorageType_readOnly' -> readOnly; + ?'snmpTargetAddrStorageType_permanent' -> permanent; + ?'snmpTargetAddrStorageType_nonVolatile' -> nonVolatile; + ?'snmpTargetAddrStorageType_volatile' -> volatile; + ?'snmpTargetAddrStorageType_other' -> other; + _ -> undefined + end, + Prefix, element(?snmpTargetAddrRowStatus, Row), + case element(?snmpTargetAddrRowStatus, Row) of + ?'snmpTargetAddrRowStatus_destroy' -> destroy; + ?'snmpTargetAddrRowStatus_createAndWait' -> createAndWait; + ?'snmpTargetAddrRowStatus_createAndGo' -> createAndGo; + ?'snmpTargetAddrRowStatus_notReady' -> notReady; + ?'snmpTargetAddrRowStatus_notInService' -> notInService; + ?'snmpTargetAddrRowStatus_active' -> active; + _ -> undefined + end, + Prefix, + element(?snmpTargetAddrEngineId, Row), + Prefix, + element(?snmpTargetAddrTMask, Row), + Prefix, + element(?snmpTargetAddrMMS, Row)])) + end, + snmpa_mib_lib:print_table(Table, DB, FOI, PrintRow); %% Op == new | delete snmpTargetAddrTable(Op) -> snmp_generic:table_func(Op, db(snmpTargetAddrTable)). @@ -630,6 +696,73 @@ Val. +%% Op = print - Used for debugging purposes +snmpTargetParamsTable(print) -> + Table = snmpTargetParamsTable, + DB = db(Table), + FOI = foi(Table), + PrintRow = + fun(Prefix, Row) -> + lists:flatten( + io_lib:format("~sName: ~p" + "~n~sMPModel: ~p (~w)" + "~n~sSecurityModel: ~p (~w)" + "~n~sSecurityName: ~p" + "~n~sSecurityLevel: ~p (~w)" + "~n~sStorageType: ~p (~w)" + "~n~sStatus: ~p (~w)", + [Prefix, + element(?snmpTargetParamsName, Row), + Prefix, + element(?snmpTargetParamsMPModel, Row), + case element(?snmpTargetParamsMPModel, Row) of + ?MP_V1 -> v1; + ?MP_V2C -> v2c; + ?MP_V3 -> v3; + _ -> undefined + end, + Prefix, + element(?snmpTargetParamsSecurityModel, Row), + case element(?snmpTargetParamsSecurityModel, Row) of + ?SEC_ANY -> any; + ?SEC_V1 -> v1; + ?SEC_V2C -> v2c; + ?SEC_USM -> usm; + _ -> undefined + end, + Prefix, + element(?snmpTargetParamsSecurityName, Row), + Prefix, + element(?snmpTargetParamsSecurityLevel, Row), + case element(?snmpTargetParamsSecurityLevel, Row) of + ?'SnmpSecurityLevel_noAuthNoPriv' -> noAuthNoPriv; + ?'SnmpSecurityLevel_authNoPriv' -> authNoPriv; + ?'SnmpSecurityLevel_authPriv' -> authPriv; + _ -> undefined + end, + Prefix, + element(?snmpTargetParamsStorageType, Row), + case element(?snmpTargetParamsStorageType, Row) of + ?'snmpTargetParamsStorageType_readOnly' -> readOnly; + ?'snmpTargetParamsStorageType_permanent' -> permanent; + ?'snmpTargetParamsStorageType_nonVolatile' -> nonVolatile; + ?'snmpTargetParamsStorageType_volatile' -> volatile; + ?'snmpTargetParamsStorageType_other' -> other; + _ -> undefined + end, + Prefix, + element(?snmpTargetParamsRowStatus, Row), + case element(?snmpTargetParamsRowStatus, Row) of + ?'snmpTargetParamsRowStatus_destroy' -> destroy; + ?'snmpTargetParamsRowStatus_createAndWait' -> createAndWait; + ?'snmpTargetParamsRowStatus_createAndGo' -> createAndGo; + ?'snmpTargetParamsRowStatus_notReady' -> notReady; + ?'snmpTargetParamsRowStatus_notInService' -> notInService; + ?'snmpTargetParamsRowStatus_active' -> active; + _ -> undefined + end])) + end, + snmpa_mib_lib:print_table(Table, DB, FOI, PrintRow); %% Op == new | delete snmpTargetParamsTable(Op) -> snmp_generic:table_func(Op, db(snmpTargetParamsTable)). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_user_based_sm_mib.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_user_based_sm_mib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_user_based_sm_mib.erl 2009-06-05 13:55:22.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_user_based_sm_mib.erl 2009-09-18 13:47:38.000000000 +0100 @@ -35,7 +35,7 @@ -include("snmpa_internal.hrl"). -include("snmp_types.hrl"). --define(VMODULE,"USB_MIB"). +-define(VMODULE,"USM_MIB"). -include("snmp_verbosity.hrl"). -ifndef(default_verbosity). @@ -49,6 +49,10 @@ %%%----------------------------------------------------------------- +%%% Utility functions +%%%----------------------------------------------------------------- + +%%%----------------------------------------------------------------- %%% Implements the instrumentation functions and additional %%% functions for the SNMP-USER-BASED-SM-MIB. %%%----------------------------------------------------------------- @@ -226,12 +230,6 @@ end. -% maybe_create_table(Name) -> -% case snmpa_local_db:table_exists(db(Name)) of -% true -> ok; -% _ -> snmpa_local_db:table_create(db(Name)) -% end. - init_tabs(Users) -> ?vdebug("create usm user table",[]), snmpa_local_db:table_delete(db(usmUserTable)), @@ -314,21 +312,26 @@ init_var(Var) -> ets:insert(snmp_agent_table, {Var, 0}). vars() -> - [usmStatsUnsupportedSecLevels, + [ + usmStatsUnsupportedSecLevels, usmStatsNotInTimeWindows, usmStatsUnknownUserNames, usmStatsUnknownEngineIDs, usmStatsWrongDigests, - usmStatsDecryptionErrors]. + usmStatsDecryptionErrors + ]. %%----------------------------------------------------------------- %% API functions %%----------------------------------------------------------------- is_engine_id_known(EngineID) -> EngineKey = [length(EngineID) | EngineID], + ?vtrace("is_engine_id_known -> EngineKey: ~w", [EngineKey]), case table_next(usmUserTable, EngineKey) of endOfTable -> false; - Key -> lists:prefix(EngineKey, Key) + Key -> + ?vtrace("is_engine_id_known -> Key: ~w", [Key]), + lists:prefix(EngineKey, Key) end. get_user(EngineID, UserName) -> @@ -392,6 +395,76 @@ {usmUserSpinLock, volatile}). +%% Op = print - Used for debugging purposes +usmUserTable(print) -> + Table = usmUserTable, + DB = db(Table), + FOI = foi(Table), + %% TableInfo = snmpa_mib_lib:get_table(db(Table), foi(Table)), + PrintRow = + fun(Prefix, Row) -> + lists:flatten( + io_lib:format("~sEngineID: ~p" + "~n~sName: ~p" + "~n~sSecurityName: ~p" + "~n~sCloneFrom: ~p" + "~n~sAuthProtocol: ~p (~w)" + "~n~sAuthKeyChange: ~p" + "~n~sOwnAuthKeyChange: ~p" + "~n~sPrivProtocol: ~p (~w)" + "~n~sPrivKeyChange: ~p" + "~n~sOwnPrivKeyChange: ~p" + "~n~sPublic: ~p" + "~n~sStorageType: ~p (~w)" + "~n~sStatus: ~p (~w)", + [Prefix, element(?usmUserEngineID, Row), + Prefix, element(?usmUserName, Row), + Prefix, element(?usmUserSecurityName, Row), + Prefix, element(?usmUserCloneFrom, Row), + Prefix, element(?usmUserAuthProtocol, Row), + case element(?usmUserAuthProtocol, Row) of + ?usmNoAuthProtocol -> none; + ?usmHMACMD5AuthProtocol -> md5; + ?usmHMACSHAAuthProtocol -> sha; + md5 -> md5; + sha -> sha; + _ -> undefined + end, + Prefix, element(?usmUserAuthKeyChange, Row), + Prefix, element(?usmUserOwnAuthKeyChange, Row), + Prefix, element(?usmUserPrivProtocol, Row), + case element(?usmUserPrivProtocol, Row) of + ?usmNoPrivProtocol -> none; + ?usmDESPrivProtocol -> des; + ?usmAesCfb128Protocol -> aes; + des -> des; + aes -> aes; + _ -> undefined + end, + Prefix, element(?usmUserPrivKeyChange, Row), + Prefix, element(?usmUserOwnPrivKeyChange, Row), + Prefix, element(?usmUserPublic, Row), + Prefix, element(?usmUserStorageType, Row), + case element(?usmUserStorageType, Row) of + ?'usmUserStorageType_readOnly' -> readOnly; + ?'usmUserStorageType_permanent' -> permanent; + ?'usmUserStorageType_nonVolatile' -> nonVolatile; + ?'usmUserStorageType_volatile' -> volatile; + ?'usmUserStorageType_other' -> other; + _ -> undefined + end, + Prefix, element(?usmUserStatus, Row), + case element(?usmUserStatus, Row) of + ?'usmUserStatus_destroy' -> destroy; + ?'usmUserStatus_createAndWait' -> createAndWait; + ?'usmUserStatus_createAndGo' -> createAndGo; + ?'usmUserStatus_notReady' -> notReady; + ?'usmUserStatus_notInService' -> notInService; + ?'usmUserStatus_active' -> active; + _ -> undefined + end])) + end, + snmpa_mib_lib:print_table(Table, DB, FOI, PrintRow); %% Op == new | delete usmUserTable(Op) -> snmp_generic:table_func(Op, db(usmUserTable)). @@ -787,8 +860,8 @@ auth -> case get_auth_proto(RowIndex, Cols) of ?usmNoAuthProtocol -> ok; - ?usmHMACMD5AuthProtocol when Len == 32 -> ok; - ?usmHMACSHAAuthProtocol when Len == 40 -> ok; + ?usmHMACMD5AuthProtocol when Len =:= 32 -> ok; + ?usmHMACSHAAuthProtocol when Len =:= 40 -> ok; _ -> wrongValue(KeyChangeCol) end; priv -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_view_based_acm_mib.erl erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_view_based_acm_mib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/agent/snmp_view_based_acm_mib.erl 2009-03-12 12:29:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/agent/snmp_view_based_acm_mib.erl 2009-09-18 15:12:34.000000000 +0100 @@ -489,13 +489,14 @@ {value, {Col, ?'RowStatus_createAndGo'}} -> % ok, if it doesn't exist Res = lists:keysearch(?vacmAccessContextMatch, 1, Cols), case snmpa_vacm:get_row(RowIndex) of - false when IsValidKey == true, tuple(Res) -> {noError, 0}; + false when (IsValidKey =:= true) andalso + is_tuple(Res) -> {noError, 0}; false -> {noCreation, Col}; % Bad RowIndex _ -> {inconsistentValue, Col} end; {value, {Col, ?'RowStatus_createAndWait'}} -> % ok, if it doesn't exist case snmpa_vacm:get_row(RowIndex) of - false when IsValidKey == true -> {noError, 0}; + false when (IsValidKey =:= true) -> {noError, 0}; false -> {noCreation, Col}; % Bad RowIndex _ -> {inconsistentValue, Col} end; diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/app/snmp.app.src erlang-13.b.3-dfsg/lib/snmp/src/app/snmp.app.src --- erlang-13.b.1-dfsg/lib/snmp/src/app/snmp.app.src 2009-06-05 13:54:54.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/app/snmp.app.src 2009-11-20 08:48:25.000000000 +0000 @@ -90,7 +90,9 @@ snmpm_misc_sup, snmpm_mpd, snmpm_net_if, + snmpm_net_if_filter, snmpm_network_interface, + snmpm_network_interface_filter, snmpm_server, snmpm_server_sup, snmpm_supervisor, diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/app/snmp_app_sup.erl erlang-13.b.3-dfsg/lib/snmp/src/app/snmp_app_sup.erl --- erlang-13.b.1-dfsg/lib/snmp/src/app/snmp_app_sup.erl 2009-03-12 12:31:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/app/snmp_app_sup.erl 2009-09-18 15:13:09.000000000 +0100 @@ -47,7 +47,7 @@ stop() -> ?d("stop -> entry", []), case whereis(?SERVER) of - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> ?d("stop -> Pid: ~p", [Pid]), exit(Pid, shutdown), ?d("stop -> stopped", []), diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/app/snmp.appup.src erlang-13.b.3-dfsg/lib/snmp/src/app/snmp.appup.src --- erlang-13.b.1-dfsg/lib/snmp/src/app/snmp.appup.src 2009-06-05 13:55:28.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/app/snmp.appup.src 2009-11-20 13:36:39.000000000 +0000 @@ -22,68 +22,25 @@ %% ----- U p g r a d e ------------------------------------------------------- [ - {"4.13.2", + {"4.14", [ - {load_module, snmp, soft_purge, soft_purge, []}, - {load_module, snmpm, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpa_supervisor, supervisor}, - {load_module, snmpa, soft_purge, soft_purge, - [snmpa_agent, snmpa_discovery_handler, snmpa_discovery_handler_default]}, - {load_module, snmpa_trap, soft_purge, soft_purge, [snmpa_net_if]}, - {load_module, snmpa_mpd, soft_purge, soft_purge, [snmpa_usm]}, - {load_module, snmpa_usm, soft_purge, soft_purge, []}, - {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge, []}, - {update, snmpa_agent, soft, soft_purge, soft_purge, - [snmpa_trap, snmp_user_based_sm_mib, - snmpa_discovery_handler, snmpa_discovery_handler_default]}, - {update, snmpa_net_if, soft, soft_purge, soft_purge, [snmpa_mpd]}, - {update, snmpm_server, soft, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpm_config, soft, soft_purge, soft_purge, []}, - {add_module, snmpa_discovery_handler}, - {add_module, snmpa_discovery_handler_default} + {load_module, snmpm_user, soft_purge, soft_purge, []}, + {load_module, snmpm_user_default, soft_purge, soft_purge, [snmpm_user]}, + {update, snmpm_server, soft, soft_purge, soft_purge, + [snmpm_user_default]} ] }, - {"4.13.1", + {"4.13.5", [ - {load_module, snmp, soft_purge, soft_purge, []}, - {load_module, snmpm, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpa_supervisor, supervisor}, - {load_module, snmpa, soft_purge, soft_purge, - [snmpa_agent, snmpa_discovery_handler, snmpa_discovery_handler_default]}, - {load_module, snmpa_trap, soft_purge, soft_purge, [snmpa_net_if]}, - {load_module, snmpa_mpd, soft_purge, soft_purge, [snmpa_usm]}, - {load_module, snmpa_usm, soft_purge, soft_purge, []}, - {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge, []}, - {update, snmpa_agent, soft, soft_purge, soft_purge, - [snmpa_trap, snmp_user_based_sm_mib, - snmpa_discovery_handler, snmpa_discovery_handler_default]}, - {update, snmpa_net_if, soft, soft_purge, soft_purge, [snmpa_mpd]}, - {update, snmpm_server, soft, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpm_config, soft, soft_purge, soft_purge, []}, - {add_module, snmpa_discovery_handler}, - {add_module, snmpa_discovery_handler_default} - ] - }, - {"4.13", - [ - {load_module, snmp, soft_purge, soft_purge, []}, - {load_module, snmpm, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpa_supervisor, supervisor}, - {load_module, snmpa, soft_purge, soft_purge, - [snmpa_agent, snmpa_discovery_handler, snmpa_discovery_handler_default]}, - {load_module, snmpa_trap, soft_purge, soft_purge, [snmpa_net_if]}, - {load_module, snmpa_mpd, soft_purge, soft_purge, [snmpa_usm]}, - {load_module, snmpa_usm, soft_purge, soft_purge, []}, - {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge, []}, - {update, snmpa_agent, soft, soft_purge, soft_purge, - [snmpa_trap, snmp_user_based_sm_mib, - snmpa_discovery_handler, snmpa_discovery_handler_default]}, - {update, snmpa_net_if, soft, soft_purge, soft_purge, [snmpa_mpd]}, - {update, snmpm_server, soft, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpm_config, soft, soft_purge, soft_purge, [snmpm_user_old]}, - {add_module, snmpm_user_old}, - {add_module, snmpa_discovery_handler}, - {add_module, snmpa_discovery_handler_default} + {load_module, snmpm_user, soft_purge, soft_purge, []}, + {load_module, snmpm_user_default, soft_purge, soft_purge, [snmpm_user]}, + {load_module, snmpa_mib_data, soft_purge, soft_purge, []}, + {update, snmpa_agent, soft, soft_purge, soft_purge, []}, + {update, snmpa_net_if, soft, soft_purge, soft_purge, []}, + {update, snmpm_config, soft, soft_purge, soft_purge, []}, + {update, snmpm_server, soft, soft_purge, soft_purge, [snmpm_user_default]}, + {add_module, snmpm_net_if_filter}, + {add_module, snmpm_network_interface_filter} ] } ], @@ -91,63 +48,24 @@ %% ------D o w n g r a d e --------------------------------------------------- [ - {"4.13.2", + {"4.14", [ - {load_module, snmp, soft_purge, soft_purge, []}, - {load_module, snmpm, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpa_supervisor, supervisor}, - {load_module, snmpa, soft_purge, soft_purge, [snmpa_agent]}, - {load_module, snmpa_trap, soft_purge, soft_purge, [snmpa_net_if]}, - {load_module, snmpa_mpd, soft_purge, soft_purge, [snmpa_usm]}, - {load_module, snmpa_usm, soft_purge, soft_purge, []}, - {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge, []}, - {update, snmpa_agent, soft, soft_purge, soft_purge, - [snmpa_trap, snmp_user_based_sm_mib]}, - {update, snmpa_agent, soft, soft_purge, soft_purge, [snmpa_trap]}, - {update, snmpa_net_if, soft, soft_purge, soft_purge, [snmpa_mpd]}, - {update, snmpm_server, soft, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpm_config, soft, soft_purge, soft_purge, []}, - {delete_module, snmpa_discovery_handler}, - {delete_module, snmpa_discovery_handler_default} - ] - }, - {"4.13.1", - [ - {load_module, snmp, soft_purge, soft_purge, []}, - {load_module, snmpm, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpa_supervisor, supervisor}, - {load_module, snmpa, soft_purge, soft_purge, [snmpa_agent]}, - {load_module, snmpa_trap, soft_purge, soft_purge, [snmpa_net_if]}, - {load_module, snmpa_mpd, soft_purge, soft_purge, [snmpa_usm]}, - {load_module, snmpa_usm, soft_purge, soft_purge, []}, - {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge, []}, - {update, snmpa_agent, soft, soft_purge, soft_purge, - [snmpa_trap, snmp_user_based_sm_mib]}, - {update, snmpa_net_if, soft, soft_purge, soft_purge, [snmpa_mpd]}, - {update, snmpm_server, soft, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpm_config, soft, soft_purge, soft_purge, []}, - {delete_module, snmpa_discovery_handler}, - {delete_module, snmpa_discovery_handler_default} + {load_module, snmpm_user, soft_purge, soft_purge, []}, + {load_module, snmpm_user_default, soft_purge, soft_purge, [snmpm_user]}, + {update, snmpm_server, soft, soft_purge, soft_purge, [snmpm_user_default]} ] }, - {"4.13", + {"4.13.5", [ - {load_module, snmp, soft_purge, soft_purge, []}, - {load_module, snmpm, soft_purge, soft_purge, [snmpm_config]}, - {update, snmpa_supervisor, supervisor}, - {load_module, snmpa, soft_purge, soft_purge, [snmpa_agent]}, - {load_module, snmpa_trap, soft_purge, soft_purge, [snmpa_net_if]}, - {load_module, snmpa_mpd, soft_purge, soft_purge, [snmpa_usm]}, - {load_module, snmpa_usm, soft_purge, soft_purge, []}, - {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge, []}, - {update, snmpa_agent, soft, soft_purge, soft_purge, - [snmpa_trap, snmp_user_based_sm_mib]}, - {update, snmpa_net_if, soft, soft_purge, soft_purge, [snmpa_mpd]}, - {update, snmpm_server, soft, soft_purge, soft_purge, [snmpm_config]}, + {load_module, snmpm_user, soft_purge, soft_purge, []}, + {load_module, snmpm_user_default, soft_purge, soft_purge, [snmpm_user]}, + {load_module, snmpa_mib_data, soft_purge, soft_purge, []}, + {update, snmpa_agent, soft, soft_purge, soft_purge, []}, + {update, snmpa_net_if, soft, soft_purge, soft_purge, []}, {update, snmpm_config, soft, soft_purge, soft_purge, []}, - {delete_module, snmpm_user_old}, - {delete_module, snmpa_discovery_handler}, - {delete_module, snmpa_discovery_handler_default} + {update, snmpm_server, soft, soft_purge, soft_purge, [snmpm_user_default]}, + {remove, {snmpm_net_if_filter, soft_purge, brutal_purge}}, + {remove, {snmpm_network_interface_filter, soft_purge, brutal_purge}} ] } ] diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/compile/modules.mk erlang-13.b.3-dfsg/lib/snmp/src/compile/modules.mk --- erlang-13.b.1-dfsg/lib/snmp/src/compile/modules.mk 2009-03-12 12:31:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/compile/modules.mk 2009-11-20 08:48:35.000000000 +0000 @@ -32,4 +32,5 @@ INTERNAL_HRL_FILES = \ snmpc.hrl \ + snmpc_lib.hrl \ snmpc_misc.hrl diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc.erl erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc.erl --- erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc.erl 2009-03-12 12:28:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc.erl 2009-11-20 08:48:27.000000000 +0000 @@ -32,6 +32,7 @@ -include_lib("stdlib/include/erl_compile.hrl"). -include("snmp_types.hrl"). -include("snmpc.hrl"). +-include("snmpc_lib.hrl"). look_at(Mib) -> @@ -91,7 +92,7 @@ [WarningOpt, OutdirOpt, IncludeOpt | Spec]. %% Returns: {ok, File}|{error, Reason} -compile([AtomFilename]) when atom(AtomFilename) -> +compile([AtomFilename]) when is_atom(AtomFilename) -> compile(atom_to_list(AtomFilename), []), % from cmd line halt(); compile(FileName) -> @@ -118,7 +119,7 @@ %% (hidden) options %%---------------------------------------------------------------------- -compile(FileName, Options) when list(FileName) -> +compile(FileName, Options) when is_list(FileName) -> true = snmpc_misc:is_string(FileName), DefOpts = [{deprecated, true}, {group_check, true}, @@ -221,11 +222,11 @@ case snmpc_misc:assq(Key, Options) of false -> update_options(DefOpts, [{Key,DefVal}|Options]); - {value, Val} when Key == i -> + {value, Val} when Key =:= i -> Options1 = lists:keyreplace(Key, 1, Options, {Key, Val++DefVal}), update_options(DefOpts, Options1); - {value, Val} when Key == il -> + {value, Val} when Key =:= il -> Options1 = lists:keyreplace(Key, 1, Options, {Key, Val++DefVal}), update_options(DefOpts, Options1); @@ -239,13 +240,13 @@ check_options([]) -> ok; check_options([no_symbolic_info|T]) -> check_options(T); -check_options([{outdir, Str} | T]) when list(Str) -> +check_options([{outdir, Str} | T]) when is_list(Str) -> check_options(T); -check_options([{debug, Atom} | T]) when atom(Atom) -> +check_options([{debug, Atom} | T]) when is_atom(Atom) -> check_options(T); -check_options([{deprecated, Atom} | T]) when atom(Atom) -> +check_options([{deprecated, Atom} | T]) when is_atom(Atom) -> check_options(T); -check_options([{group_check, Atom} | T]) when atom(Atom) -> +check_options([{group_check, Atom} | T]) when is_atom(Atom) -> check_options(T); check_options([{warnings, Bool} | T]) -> check_bool(warnings, Bool), @@ -256,11 +257,11 @@ check_options(T); check_options([{db, mnesia} | T]) -> check_options(T); -check_options([{i, [Str|_]} | T]) when list(Str) -> +check_options([{i, [Str|_]} | T]) when is_list(Str) -> check_options(T); check_options([{il, []} | T]) -> check_options(T); -check_options([{il, [Str|_]} | T]) when list(Str) -> +check_options([{il, [Str|_]} | T]) when is_list(Str) -> check_options(T); check_options([{description, Bool}| T]) -> check_bool(description, Bool), @@ -272,7 +273,7 @@ check_options(T); check_options([reference| T]) -> %% same as {reference, true} check_options(T); -check_options([{verbosity, V} | T]) when atom(V) -> +check_options([{verbosity, V} | T]) when is_atom(V) -> snmpc_lib:vvalidate(V), check_options(T); check_options([version| T]) -> @@ -283,7 +284,7 @@ check_options(T); check_options([module_identity| T]) -> check_options(T); -check_options([{module, M} | T]) when atom(M) -> +check_options([{module, M} | T]) when is_atom(M) -> check_options(T); check_options([no_defs| T]) -> check_options(T); @@ -340,14 +341,6 @@ %% verbosity stuff %%---------------------------------------------------------------------- -t(F,A) -> snmpc_lib:t(F,A). -%% d(F,A) -> snmpc_lib:d(F,A). -l(F,A) -> snmpc_lib:l(F,A). -i(F,A) -> snmpc_lib:i(F,A). -i(F,A,L) -> snmpc_lib:i(F,A,L). -%% w(F,A) -> snmpc_lib:w(F,A). -w(F,A,L) -> snmpc_lib:w(F,A,L). - %% Verbosity level is selected from three (historical reasons) %% options: warnings, debug and verbosity %% - If warnings is true, then verbosity is _atleast_ warning @@ -401,11 +394,11 @@ c_impl(File) -> {ok, PData} = parse(File), - t("Syntax analysis:~n" - " ~p",[PData]), + ?vtrace("Syntax analysis:" + "~n PData: ~p", [PData]), MibName = compile_parsed_data(PData), - t("Compiler output:~n" - " ~p",[get(cdata)]), + ?vtrace("Compiler output:" + "~n CDATA: ~p", [get(cdata)]), save(File, MibName, get(options)). compile_parsed_data(#pdata{mib_name = MibName, @@ -445,7 +438,7 @@ Line}|T], false) -> %% May be implemented but the compiler chooses not to. - i("object_type ~w is deprecated => ignored",[ObjName],Line), + ?vinfo2("object_type ~w is deprecated => ignored", [ObjName], Line), update_status(ObjName, deprecated), definitions_loop(T, false); @@ -453,7 +446,7 @@ definitions_loop([{#mc_object_type{name = ObjName, status = obsolete}, Line}|T], Deprecated) -> - l("object_type ~w (~w) is obsolete => ignored",[ObjName,Line]), + ?vlog2("object_type ~w is obsolete => ignored", [ObjName], Line), %% No need to implement a obsolete object update_status(ObjName, obsolete), ensure_macro_imported('OBJECT-TYPE', Line), @@ -483,28 +476,29 @@ fields = FieldList}, Sline}|ColsEtc], Deprecated) -> - l("defloop -> [object_type(sequence_of),object_type(type,[1]),sequence]:~n" - " NameOfTable: ~p~n" - " SeqName: ~p~n" - " Taccess: ~p~n" - " Kind: ~p~n" - " Tstatus: ~p~n" - " Tindex: ~p~n" - " Tunits: ~p~n" - " Tline: ~p~n" - " NameOfEntry: ~p~n" - " TEline: ~p~n" - " IndexingInfo: ~p~n" - " Estatus: ~p~n" - " Eunits: ~p~n" - " Ref: ~p~n" - " Eline: ~p~n" - " FieldList: ~p~n" - " Sline: ~p", - [NameOfTable,SeqName,Taccess,Kind,Tstatus, - Tindex,Tunits,Tline, - NameOfEntry,TEline,IndexingInfo,Estatus,Eunits,Ref,Eline, - FieldList,Sline]), + ?vlog("defloop -> " + "[object_type(sequence_of),object_type(type,[1]),sequence]:" + "~n NameOfTable: ~p" + "~n SeqName: ~p" + "~n Taccess: ~p" + "~n Kind: ~p" + "~n Tstatus: ~p" + "~n Tindex: ~p" + "~n Tunits: ~p" + "~n Tline: ~p" + "~n NameOfEntry: ~p" + "~n TEline: ~p" + "~n IndexingInfo: ~p" + "~n Estatus: ~p" + "~n Eunits: ~p" + "~n Ref: ~p" + "~n Eline: ~p" + "~n FieldList: ~p" + "~n Sline: ~p", + [NameOfTable,SeqName,Taccess,Kind,Tstatus, + Tindex,Tunits,Tline, + NameOfEntry,TEline,IndexingInfo,Estatus,Eunits,Ref,Eline, + FieldList,Sline]), update_status(NameOfTable, Tstatus), update_status(NameOfEntry, Estatus), update_status(SeqName, undefined), @@ -557,29 +551,29 @@ {#mc_sequence{name = SeqName, fields = FieldList}, Sline}|ColsEtc], Deprecated) -> - l("defloop -> " - "[object_type(sequence_of),object_type(type),sequence(fieldList)]:~n" - " NameOfTable: ~p~n" - " SeqName: ~p~n" - " Taccess: ~p~n" - " Kind: ~p~n" - " Tstatus: ~p~n" - " Tindex: ~p~n" - " Tunits: ~p~n" - " Tline: ~p~n" - " NameOfEntry: ~p~n" - " IndexingInfo: ~p~n" - " Estatus: ~p~n" - " BadOID: ~p~n" - " Eunits: ~p~n" - " Ref: ~p~n" - " Eline: ~p~n" - " FieldList: ~p~n" - " Sline: ~p", - [NameOfTable,SeqName,Taccess,Kind,Tstatus, - Tindex,Tunits,Tline, - NameOfEntry,IndexingInfo,Estatus,BadOID,Eunits,Ref,Eline, - FieldList,Sline]), + ?vlog("defloop -> " + "[object_type(sequence_of),object_type(type),sequence(fieldList)]:" + "~n NameOfTable: ~p" + "~n SeqName: ~p" + "~n Taccess: ~p" + "~n Kind: ~p" + "~n Tstatus: ~p" + "~n Tindex: ~p" + "~n Tunits: ~p" + "~n Tline: ~p" + "~n NameOfEntry: ~p" + "~n IndexingInfo: ~p" + "~n Estatus: ~p" + "~n BadOID: ~p" + "~n Eunits: ~p" + "~n Ref: ~p" + "~n Eline: ~p" + "~n FieldList: ~p" + "~n Sline: ~p", + [NameOfTable,SeqName,Taccess,Kind,Tstatus, + Tindex,Tunits,Tline, + NameOfEntry,IndexingInfo,Estatus,BadOID,Eunits,Ref,Eline, + FieldList,Sline]), update_status(NameOfTable, Tstatus), update_status(NameOfEntry, Estatus), update_status(SeqName, undefined), @@ -618,12 +612,12 @@ syntax = OldType, display_hint = DisplayHint},Line}|T], Deprecated) -> - l("defloop -> new_type:~n" - " Macro: ~p~n" - " NewTypeName: ~p~n" - " OldType: ~p~n" - " DisplayHint: ~p~n" - " Line: ~p",[Macro,NewTypeName,OldType,DisplayHint,Line]), + ?vlog2("defloop -> new_type:" + "~n Macro: ~p" + "~n NewTypeName: ~p" + "~n OldType: ~p" + "~n DisplayHint: ~p", + [Macro, NewTypeName, OldType, DisplayHint], Line), ensure_macro_imported(Macro,Line), Types = (get(cdata))#cdata.asn1_types, case lists:keysearch(NewTypeName, #asn1_type.aliasname, Types) of @@ -650,17 +644,17 @@ units = Units, name_assign = {Parent,SubIndex}},Line} |T], Deprecated) -> - l("defloop -> object_type (variable):~n" - " NewVarName: ~p~n" - " Type: ~p~n" - " Access: ~p~n" - " DefVal: ~p~n" - " Status: ~p~n" - " Units: ~p~n" - " Parent: ~p~n" - " SubIndex: ~p~n" - " Line: ~p", - [NewVarName, Type, Access, DefVal, Status, Units, Parent, SubIndex, Line]), + ?vlog2("defloop -> object_type (variable):" + "~n NewVarName: ~p" + "~n Type: ~p" + "~n Access: ~p" + "~n DefVal: ~p" + "~n Status: ~p" + "~n Units: ~p" + "~n Parent: ~p" + "~n SubIndex: ~p", + [NewVarName, Type, Access, DefVal, + Status, Units, Parent, SubIndex], Line), update_status(NewVarName, Status), snmpc_lib:test_father(Parent, NewVarName, SubIndex, Line), ASN1type = snmpc_lib:make_ASN1type(Type), @@ -689,17 +683,16 @@ name_assign = {Parent, SubIndex}}, Line}|T], Deprecated) -> - l("defloop -> module-identity: " - "~n NewVarName: ~p" - "~n LU: ~p" - "~n Org: ~p" - "~n CI: ~p" - "~n Desc: ~p" - "~n Revs0: ~p" - "~n Parent: ~p" - "~n SubIndex: ~p" - "~n Line: ~p", - [NewVarName, LU, Org, CI, Desc, Revs0, Parent, SubIndex, Line]), + ?vlog2("defloop -> module-identity: " + "~n NewVarName: ~p" + "~n LU: ~p" + "~n Org: ~p" + "~n CI: ~p" + "~n Desc: ~p" + "~n Revs0: ~p" + "~n Parent: ~p" + "~n SubIndex: ~p", + [NewVarName, LU, Org, CI, Desc, Revs0, Parent, SubIndex], Line), ensure_macro_imported('MODULE-IDENTITY', Line), snmpc_lib:register_oid(Line, NewVarName, Parent, SubIndex), Revs = [{R,D}||#mc_revision{revision = R,description = D} <- Revs0], @@ -720,12 +713,12 @@ parent = Parent, sub_index = SubIndex},Line}|T], Deprecated) -> - l("defloop -> internal:~n" - " NewVarName: ~p~n" - " Macro: ~p~n" - " Parent: ~p~n" - " SubIndex: ~p~n" - " Line: ~p",[NewVarName, Macro, Parent, SubIndex, Line]), + ?vlog2("defloop -> internal:" + "~n NewVarName: ~p" + "~n Macro: ~p" + "~n Parent: ~p" + "~n SubIndex: ~p", + [NewVarName, Macro, Parent, SubIndex], Line), ensure_macro_imported(Macro, Line), snmpc_lib:register_oid(Line, NewVarName, Parent, SubIndex), snmpc_lib:add_cdata( @@ -740,13 +733,12 @@ description = Desc1, num = SpecificCode}, Line}|T], Deprecated) -> - l("defloop -> trap:~n" - " TrapName: ~p~n" - " EnterPrise: ~p~n" - " Variables: ~p~n" - " SpecificCode: ~p~n" - " Line: ~p", - [TrapName,EnterPrise,Variables,SpecificCode,Line]), + ?vlog2("defloop -> trap:" + "~n TrapName: ~p" + "~n EnterPrise: ~p" + "~n Variables: ~p" + "~n SpecificCode: ~p", + [TrapName, EnterPrise, Variables, SpecificCode], Line), update_status(TrapName, undefined), CDATA = get(cdata), snmpc_lib:check_trap_name(EnterPrise, Line, CDATA#cdata.mes), @@ -760,8 +752,8 @@ %% the update_trap_objects function. oidobjects = Variables, description = Descriptions}, - snmpc_misc:map({snmpc_lib,check_trap}, [Trap, Line], - CDATA#cdata.traps), + lists:foreach(fun(Trap2) -> snmpc_lib:check_trap(Trap2, Trap, Line) end, + CDATA#cdata.traps), snmpc_lib:add_cdata(#cdata.traps, [Trap]), definitions_loop(T, Deprecated); @@ -772,26 +764,26 @@ status = Estatus, name_assign = SubIndex},Eline}|T], Deprecated) -> - l("defloop -> object_type (table_entry):~n" - " NameOfEntry: ~p~n" - " Type: ~p~n" - " Eaccess: ~p~n" - " Index: ~p~n" - " Estatus: ~p~n" - " SubIndex: ~p~n" - " SubIndex: ~p~n" - " Eline: ~p", - [NameOfEntry,Type,Eaccess,Index,Estatus,SubIndex,Eline]), + ?vlog("defloop -> object_type (table_entry):" + "~n NameOfEntry: ~p" + "~n Type: ~p" + "~n Eaccess: ~p" + "~n Index: ~p" + "~n Estatus: ~p" + "~n SubIndex: ~p" + "~n SubIndex: ~p" + "~n Eline: ~p", + [NameOfEntry, Type, Eaccess, Index, Estatus, SubIndex, Eline]), update_status(NameOfEntry, Estatus), snmpc_lib:print_error("Misplaced TableEntry definition (~w)", - [NameOfEntry],Eline), + [NameOfEntry], Eline), definitions_loop(T, Deprecated); definitions_loop([{#mc_notification{name = TrapName, status = deprecated}, Line}|T], false) -> - i("defloop -> notification ~w is deprecated => ignored", - [TrapName],Line), + ?vinfo2("defloop -> notification ~w is deprecated => ignored", + [TrapName], Line), update_status(TrapName, deprecated), ensure_macro_imported('NOTIFICATION-TYPE', Line), definitions_loop(T, false); @@ -799,8 +791,8 @@ definitions_loop([{#mc_notification{name = TrapName, status = obsolete}, Line}|T], Deprecated) -> - l("defloop -> notification ~w (~w) is obsolete => ignored", - [TrapName,Line]), + ?vlog2("defloop -> notification ~w is obsolete => ignored", + [TrapName], Line), update_status(TrapName, obsolete), ensure_macro_imported('NOTIFICATION-TYPE', Line), definitions_loop(T, Deprecated); @@ -811,14 +803,13 @@ description = Desc, name_assign = {Parent, SubIndex}},Line}|T], Deprecated) -> - l("defloop -> notification:~n" - " TrapName: ~p~n" - " Variables: ~p~n" - " Status: ~p~n" - " Parent: ~p~n" - " SubIndex: ~p~n" - " Line: ~p", - [TrapName, Variables, Status, Parent, SubIndex, Line]), + ?vlog2("defloop -> notification:" + "~n TrapName: ~p" + "~n Variables: ~p" + "~n Status: ~p" + "~n Parent: ~p" + "~n SubIndex: ~p", + [TrapName, Variables, Status, Parent, SubIndex], Line), update_status(TrapName, Status), ensure_macro_imported('NOTIFICATION-TYPE', Line), CDATA = get(cdata), @@ -836,20 +827,26 @@ definitions_loop(T, Deprecated); definitions_loop([{#mc_module_compliance{name = Name},Line}|T], Deprecated) -> - l("defloop -> module_compliance:~n" - " Name: ~p~n" - " Line: ~p",[Name,Line]), + ?vlog2("defloop -> module_compliance:" + "~n Name: ~p", [Name], Line), ensure_macro_imported('MODULE-COMPLIANCE', Line), definitions_loop(T, Deprecated); -definitions_loop([{#mc_object_group{name = Name, - objects = GroupObjects, - status = Status}, Line}|T], +definitions_loop([{#mc_object_group{name = Name, + objects = GroupObjects, + status = Status, + description = Desc, + reference = Ref, + name_assign = {Parent,SubIndex}}, Line}|T], Deprecated) -> - l("defloop -> object_group ~p:~n" - " Status: ~p~n" - " GroupObjects: ~p~n" - " Line: ~p",[Name,Status,GroupObjects,Line]), + ?vlog2("defloop -> object_group ~p:" + "~n GroupObjects: ~p" + "~n Status: ~p" + "~n Desc: ~p" + "~n Ref: ~p" + "~n Parent: ~p" + "~n SubIndex: ~p", + [Name, GroupObjects, Status, Desc, Ref, Parent, SubIndex], Line), ensure_macro_imported('OBJECT-GROUP', Line), GroupBool = get_group_check(get(options)), case GroupBool of @@ -859,20 +856,41 @@ %% Check that the group members has been defined %% and that they have the correct status snmpc_lib:check_object_group(Name, GroupObjects, - Line, Status); + Line, Status); _ -> ok end, + + update_status(Name, Status), + snmpc_lib:test_father(Parent, Name, SubIndex, Line), + snmpc_lib:register_oid(Line, Name, Parent, SubIndex), + Description = make_description(Desc), + NewME = #me{aliasname = Name, + entrytype = group, + access = 'not-accessible', + description = Description, + assocList = [{kind, object}, + {objects, GroupObjects}]}, + snmpc_lib:add_cdata(#cdata.mes, [NewME]), + definitions_loop(T, Deprecated); -definitions_loop([{#mc_notification_group{name = Name, - objects = GroupObjects, - status = Status},Line} +definitions_loop([{#mc_notification_group{name = Name, + objects = GroupObjects, + status = Status, + description = Desc, + reference = Ref, + name_assign = {Parent,SubIndex}}, + Line} |T], Deprecated) -> - l("defloop -> notification_group ~p: ~n" - " Status: ~p~n" - " GroupObjects: ~p~n" - " Line: ~p",[Name,Status,GroupObjects,Line]), + ?vlog2("defloop -> notification_group ~p:" + "~n GroupObjects: ~p" + "~n Status: ~p" + "~n Desc: ~p" + "~n Ref: ~p" + "~n Parent: ~p" + "~n SubIndex: ~p", + [Name, GroupObjects, Status, Desc, Ref, Parent, SubIndex], Line), ensure_macro_imported('NOTIFICATION-GROUP', Line), GroupBool = get_group_check(get(options)), case GroupBool of @@ -887,6 +905,19 @@ _ -> ok end, + + update_status(Name, Status), + snmpc_lib:test_father(Parent, Name, SubIndex, Line), + snmpc_lib:register_oid(Line, Name, Parent, SubIndex), + Description = make_description(Desc), + NewME = #me{aliasname = Name, + entrytype = group, + access = 'not-accessible', + description = Description, + assocList = [{kind, notification}, + {objects, GroupObjects}]}, + snmpc_lib:add_cdata(#cdata.mes, [NewME]), + definitions_loop(T, Deprecated); definitions_loop([{#mc_object_type{name = NameOfTable, @@ -894,13 +925,13 @@ status = Tstatus},Tline}, Entry, Seq|T], Deprecated) -> - l("defloop -> object_type (sequence_of)~n" - " NameOfTable: ~p~n" - " SeqName: ~p~n" - " Tline: ~p~n" - " Entry: ~p~n" - " Seq: ~p", - [NameOfTable,SeqName,Tline,Entry,Seq]), + ?vlog("defloop -> object_type (sequence_of): " + "~n NameOfTable: ~p" + "~n SeqName: ~p" + "~n Tline: ~p" + "~n Entry: ~p" + "~n Seq: ~p", + [NameOfTable, SeqName, Tline, Entry, Seq]), update_status(NameOfTable, Tstatus), case Entry of {#mc_object_type{syntax = {{type, SeqName},_line}, @@ -913,13 +944,14 @@ "table (~p,~w).",[SeqName,Sline], Tline); _ -> - i("defloop -> Invalid sequence: ~p",[Seq]), + ?vinfo("defloop -> Invalid sequence: ~p", [Seq]), snmpc_lib:print_error( "Invalid SEQUENCE OF '~p'.", [safe_elem(1,safe_elem(2,Seq))],Tline) end; Else -> - i("defloop -> Invalid table entry: Else = ~p",[Else]), + ?vinfo("defloop -> Invalid table entry: " + "~n ~p", [Else]), snmpc_lib:print_error( "Invalid TableEntry '~p' (check STATUS, Sequence name, Oid)", [safe_elem(1,safe_elem(2,Entry))],Tline) @@ -930,37 +962,32 @@ syntax = {{sequence_of, SeqName},_}, status = Tstatus},Tline}|T], Deprecated) -> - l("defloop -> object_type (sequence_of):~n" - " object_type: ~p~n" - " sequence_of: ~p~n" - " Tline: ~p",[NameOfTable,SeqName,Tline]), + ?vlog("defloop -> object_type (sequence_of):" + "~n object_type: ~p" + "~n sequence_of: ~p" + "~n Tline: ~p", [NameOfTable, SeqName, Tline]), update_status(NameOfTable, Tstatus), snmpc_lib:print_error("Invalid statements following table ~p.", [NameOfTable],Tline), definitions_loop(T, Deprecated); definitions_loop([{#mc_sequence{name = SeqName, - fields = FieldList},Line}|T], + fields = _FieldList},Line}|T], Deprecated) -> - l("defloop -> sequence (fieldList):" - "~n SeqName: ~p" - "~n FieldList: ~p" - "~n Line: ~p",[SeqName, FieldList, Line]), - w("Unexpected SEQUENCE ~w, ignoring.",[SeqName],Line), + ?vwarning2("Unexpected SEQUENCE ~w => ignoring", [SeqName], Line), definitions_loop(T, Deprecated); definitions_loop([{Obj,Line}|T], Deprecated) -> - i("defloop -> unknown Error ~n" - " Obj: ~p~n" - " Line: ~p",[Obj,Line]), + ?vinfo2("defloop -> unknown error" + "~n Obj: ~p", [Obj], Line), snmpc_lib:print_error("Unknown Error in MIB. " "Can't describe the error better than this: ~999p ignored." " Please send a trouble report to support@erlang.ericsson.se.", - [Obj],Line), + [Obj], Line), definitions_loop(T, Deprecated); definitions_loop([], _Deprecated) -> - l("defloop -> done",[]), + ?vlog("defloop -> done", []), ok. safe_elem(N,T) -> @@ -982,16 +1009,17 @@ Oline}|Rest], SubIndex, [{NameOfCol,Type2}|Fields], NameOfEntry, TableName, ColMEs) -> - l("defcols -> object_type (variable):~n" - " NameOfCol: ~p~n" - " Type1: ~p~n" - " Access: ~p~n" - " Defval: ~p~n" - " Status ~p~n" - " Units ~p~n" - " NameOfEntry ~p~n" - " Oline: ~p", - [NameOfCol,Type1,Access,Defval,Status,Units,NameOfEntry,Oline]), + ?vlog("defcols -> object_type (variable):" + "~n NameOfCol: ~p" + "~n Type1: ~p" + "~n Access: ~p" + "~n Defval: ~p" + "~n Status ~p" + "~n Units ~p" + "~n NameOfEntry ~p" + "~n Oline: ~p", + [NameOfCol, Type1, Access, Defval, Status, Units, + NameOfEntry, Oline]), update_status(NameOfCol, Status), Deprecated = get_deprecated(get(options)), ASN1type = snmpc_lib:make_ASN1type(Type1), @@ -1004,13 +1032,13 @@ end, NewAccess = % a simple way to get the obsolete behaviour if - Status == obsolete -> + Status =:= obsolete -> %% Be quiet and don't implement 'not-accessible'; - Status == deprecated, Deprecated == false -> + (Status =:= deprecated) andalso (Deprecated =:= false) -> %% The compiler chooses not to implement the column. - i("object_type ~w is deprecated => ignored", - [NameOfCol],Oline), + ?vinfo2("object_type ~w is deprecated => ignored", + [NameOfCol], Oline), 'not-accessible'; true -> Access end, @@ -1040,14 +1068,14 @@ Oline}|Rest], ExpectedSubIndex, Fields, NameOfEntry, TableName, ColMEs) when SubIndex > ExpectedSubIndex -> - l("defcols -> object_type (non consecutive cols):~n" - " NameOfCol: ~p~n" - " Type1: ~p~n" - " Access: ~p~n" - " Status ~p~n" - " NameOfEntry ~p~n" - " Oline: ~p", - [NameOfCol,Type1,Access,Status,NameOfEntry,Oline]), + ?vlog("defcols -> object_type (non consecutive cols):" + "~n NameOfCol: ~p" + "~n Type1: ~p" + "~n Access: ~p" + "~n Status ~p" + "~n NameOfEntry ~p" + "~n Oline: ~p", + [NameOfCol, Type1, Access, Status, NameOfEntry, Oline]), update_status(NameOfCol, Status), Int = {{type, 'INTEGER'},Oline}, GeneratedColumn = @@ -1084,14 +1112,14 @@ name_assign = SubIndex}, Oline}|Rest], SubIndex2, [{NameOfCol, _Type2}|Fields], NameOfEntry, TableName, ColMEs) -> - l("defcols -> object_type (name of field and object is the same):~n" - " NameOfCol: ~p~n" - " Kind: ~p~n" - " SubIndex: ~p~n" - " Oline: ~p n" - " SubIndex2: ~p~n" - " NameOfEntry ~p~n" - " TableName ~p~n", + ?vlog("defcols -> object_type (name of field and object is the same):" + "~n NameOfCol: ~p" + "~n Kind: ~p" + "~n SubIndex: ~p" + "~n Oline: ~p" + "~n SubIndex2: ~p" + "~n NameOfEntry ~p" + "~n TableName ~p", [NameOfCol,Kind,SubIndex,Oline,SubIndex2,NameOfEntry,TableName]), SIok = case SubIndex of {Parent,[_SI]} when Parent =/= NameOfEntry -> @@ -1189,7 +1217,8 @@ "Couldn't write file \"~s\".",[File2]) end; E -> - l("save failed: ~n~p", [E]), + ?vlog("save failed: " + "~n ~p", [E]), {'EXIT',error} end; MibNameL -> @@ -1221,9 +1250,10 @@ end, put(cdata,snmpc_lib:make_cdata(CDataArg)), snmpc_tok:stop(TokPid), - Res = if list(Toks) -> + Res = if + is_list(Toks) -> snmpc_mib_gram:parse(Toks); - true -> + true -> Toks end, %% t("parse -> parsed: ~n~p", [Res]), @@ -1241,7 +1271,7 @@ end end. -set_version(Toks) when list(Toks) -> +set_version(Toks) when is_list(Toks) -> %% MODULE-IDENTITY _must_ be invoked in SNMPv2 according to RFC1908 case lists:keymember('MODULE-IDENTITY',1,Toks) of true -> @@ -1324,4 +1354,5 @@ 'WRITE-SYNTAX', 'MIN-ACCESS', 'BITS' - ]. + ] +. diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_lib.erl erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_lib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_lib.erl 2009-03-12 12:28:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_lib.erl 2009-11-20 08:48:28.000000000 +0000 @@ -37,11 +37,12 @@ -export([check_of/1, check_trap/2, check_trap/3, get_elem/2]). %% debug exports --export([vvalidate/1, w/2, w/3, i/2, i/3, l/2, d/2, t/2]). +-export([vvalidate/1, vprint/6]). -include("snmp_types.hrl"). -include("snmpc.hrl"). +-include("snmpc_lib.hrl"). %%---------------------------------------------------------------------------- @@ -397,7 +398,8 @@ {error, enoent} -> read_mib(Line, Filename, Path); {error, Reason} -> - w("~s found but not imported. Reason: ~p.",[AbsFile,Reason]), + ?vwarning("~s found but not imported: " + "~n Reason: ~p", [AbsFile,Reason]), read_mib(Line, Filename, Path) end. @@ -416,8 +418,8 @@ end; import({type, TypeName}, #mib{asn1_types = Types, name = MibName}) -> case lists:keysearch(TypeName, #asn1_type.aliasname, Types) of - {value, ASN1Type} when record(ASN1Type, asn1_type), - ASN1Type#asn1_type.imported == false -> + {value, ASN1Type} when is_record(ASN1Type, asn1_type) andalso + (ASN1Type#asn1_type.imported =:= false) -> add_cdata(#cdata.asn1_types, [ASN1Type#asn1_type{imported=true, aliasname=TypeName}]); _X -> @@ -567,21 +569,23 @@ has_complex_defval(#me{aliasname = N, assocList = AssocList, asn1_type = #asn1_type{bertype = BT}}) - when list(AssocList) -> + when is_list(AssocList) -> case snmpc_misc:assq(defval, AssocList) of - {value, Int} when integer(Int) -> + {value, Int} when is_integer(Int) -> false; - {value, Val} when atom(Val), BT == 'OBJECT IDENTIFIER' -> + {value, Val} when is_atom(Val) andalso (BT =:= 'OBJECT IDENTIFIER') -> false; % resolved in update_me_oids - {value, Val} when atom(Val), BT == 'INTEGER' -> + {value, Val} when is_atom(Val) andalso (BT =:= 'INTEGER') -> true; - {value, Bits} when list(Bits), BT == 'BITS' -> + {value, Bits} when is_list(Bits) andalso (BT =:= 'BITS') -> true; - {value, Str} when list(Str), BT == 'OCTET STRING' -> + {value, Str} when is_list(Str) andalso (BT =:= 'OCTET STRING') -> false; % but ok - {value, Str} when list(Str), BT == 'Opaque' -> + {value, Str} when is_list(Str) andalso (BT =:= 'Opaque') -> false; % but ok - {value, Str} when list(Str), length(Str) == 4, BT == 'IpAddress' -> + {value, Str} when is_list(Str) andalso + (length(Str) =:= 4) andalso + (BT =:= 'IpAddress') -> false; % but ok {value, Shit} -> print_error("Bad default value for ~p: ~p [~p]",[N,Shit,BT]), @@ -608,14 +612,14 @@ print_error("Enum '~w' not found. " "Used in DEFVAL for '~w'.", [DefVal, MEName]), ME; - {value, IntVal} when integer(IntVal) -> + {value, IntVal} when is_integer(IntVal) -> ME#me{assocList = lists:keyreplace(defval, 1, AssocList, {defval, IntVal})} end end; resolve_complex_defval(ME, _AllMEs) - when (ME#me.asn1_type)#asn1_type.bertype == 'BITS' -> + when (ME#me.asn1_type)#asn1_type.bertype =:= 'BITS' -> #me{aliasname = MEName, assocList = AssocList} = ME, {value, DefVal} = snmpc_misc:assq(defval, AssocList), #asn1_type{assocList = AssocListForASN1Type} = ME#me.asn1_type, @@ -624,7 +628,7 @@ error-> print_error("Invalid default value ~w for ~w.",[DefVal, MEName]), ME; - IntVal when integer(IntVal) -> + IntVal when is_integer(IntVal) -> ME#me{assocList = lists:keyreplace(defval, 1, AssocList, {defval, IntVal})} end. @@ -641,13 +645,13 @@ #variable_info{defval = Defval}. get_def(#asn1_type{bertype = BT, lo = LO, assocList = AL}) -> - t("get_def -> entry with" - "~n BT: ~p" - "~n LO: ~p" - "~n AL: ~p", [BT, LO, AL]), + ?vtrace("get_def -> entry with" + "~n BT: ~p" + "~n LO: ~p" + "~n AL: ~p", [BT, LO, AL]), get_def(BT, LO, AL). -get_def('INTEGER', Lo, _) when integer(Lo) -> Lo; +get_def('INTEGER', Lo, _) when is_integer(Lo) -> Lo; get_def('INTEGER', _, AL) -> case snmpc_misc:assq(enums, AL) of {value, Enums} -> @@ -669,7 +673,7 @@ get_def('OBJECT IDENTIFIER', _, _) -> [0, 0]; get_def('Opaque', _, _) -> ""; %v2 -get_def('Integer32',Lo, _) when integer(Lo) -> Lo; +get_def('Integer32',Lo, _) when is_integer(Lo) -> Lo; get_def('Integer32',_, _) -> 0; get_def('Counter32',_, _) -> 0; get_def('Gauge32',_, _) -> 0; @@ -766,7 +770,7 @@ end. list_not_accessible(none,_) -> []; -list_not_accessible(NonIndexCol, ColMEs) when integer(NonIndexCol) -> +list_not_accessible(NonIndexCol, ColMEs) when is_integer(NonIndexCol) -> list_not_accessible(lists:nthtail(NonIndexCol - 1,ColMEs)). list_not_accessible([#me{access='not-accessible', oid=Col}|ColMEs]) -> @@ -832,10 +836,10 @@ %% returns: an asn1_type if ColME is an indexfield, otherwise undefined. get_asn1_type({implied,ColumnName}, MEs, Line) -> case lookup(ColumnName, MEs) of - {value,#me{asn1_type=A}} when A#asn1_type.bertype == + {value,#me{asn1_type=A}} when A#asn1_type.bertype =:= 'OCTET STRING' -> A#asn1_type{implied = true}; - {value,#me{asn1_type=A}} when A#asn1_type.bertype == + {value,#me{asn1_type=A}} when A#asn1_type.bertype =:= 'OBJECT IDENTIFIER' -> A#asn1_type{implied = true}; Shit -> @@ -860,20 +864,23 @@ test_index_positions_impl(_Line, [], [#me{oid=Col}|_ColMEs]) -> Col; test_index_positions_impl(Line, Indexes, - [#me{aliasname=Name, asn1_type=Asn1} | ColMEs]) -> + [#me{aliasname = Name, + asn1_type = Asn1} | ColMEs]) -> case lists:member(Name, Indexes) of true -> - if Asn1#asn1_type.bertype == 'BITS' -> + if + Asn1#asn1_type.bertype =:= 'BITS' -> print_error("Invalid data type 'BITS' for index '~w'.", [Name],Line); true -> true end, test_index_positions_impl(Line, lists:delete(Name, Indexes), ColMEs); - false -> w("Index columns must be first for " - "the default functions to work properly. " - "~w is no index column.", [Name], Line), - none + false -> + ?vwarning2("Index columns must be first for " + "the default functions to work properly. " + "~w is no index column.", [Name], Line), + none end. is_table_local_index(IndexName, ColMEs) -> @@ -893,7 +900,7 @@ %% returns: {ok, % {snmp_mib, MEs, traps, list of {TrapOid, list of oids (objects)}}} get_final_mib(Name, Options) -> - d("get_final_mib -> entry",[]), + ?vdebug("get_final_mib -> entry", []), CDATA = get(cdata), #cdata{mes = MEs, mibfuncs = MibFuncs, @@ -901,34 +908,34 @@ traps = Traps0, oid_ets = OidEts} = CDATA, - d("get_final_mib -> resolve oids",[]), + ?vdebug("get_final_mib -> resolve oids", []), resolve_oids(OidEts), %% Reverse so that we get report on objects earlier in the file %% before later objects. UMEs = update_me_oids(lists:reverse(MEs), OidEts, []), - t("get_final_mib -> " - "~n UMEs: ~p",[UMEs]), + ?vtrace("get_final_mib -> " + "~n UMEs: ~p", [UMEs]), Traps1 = update_trap_objects(Traps0, MEs, []), Traps2 = update_trap_oids(Traps1, OidEts, []), - t("get_final_mib -> " - "~n Traps2: ~p",[Traps2]), + ?vtrace("get_final_mib -> " + "~n Traps2: ~p", [Traps2]), SortedMEs = lists:keysort(#me.oid,UMEs), - d("get_final_mib -> search for dublettes",[]), + ?vdebug("get_final_mib -> search for dublettes", []), search_for_dublettes(#me{aliasname=dummy_init}, SortedMEs), - d("get_final_mib -> search for oid conflicts",[]), + ?vdebug("get_final_mib -> search for oid conflicts", []), search_for_oid_conflicts(Traps2, SortedMEs), - d("get_final_mib -> resolve oid",[]), + ?vdebug("get_final_mib -> resolve oid", []), %% FIXME: use list comprehension instead MibFs = lists:keysort(1, lists:zf(fun({module, _Mod}) -> false; (MF) -> {true, resolve_oid(MF,SortedMEs)} end, MibFuncs)), - t("get_final_mib -> " - "~n MibFs: ~p",[MibFs]), + ?vtrace("get_final_mib -> " + "~n MibFs: ~p", [MibFs]), {value, DBName} = snmpc_misc:assq(db, Options), Module = key1search(module, MibFuncs, undefined), MEsWithMFA = insert_mfa(MibFs, SortedMEs, DBName, Module), @@ -940,14 +947,14 @@ {value, GroupBool} = snmpc_misc:assq(group_check, Options), case GroupBool of true -> - case get(snmp_version) == 2 of + case get(snmp_version) =:= 2 of true -> - d("get_final_mib -> check groups:~n ~p", - [CDATA#cdata.objectgroups]), + ?vdebug("get_final_mib -> check object groups:" + "~n ~p", [CDATA#cdata.objectgroups]), check_group(CDATA#cdata.mes, CDATA#cdata.objectgroups), - d("get_final_mib -> check notifications groups:~n ~p", - [CDATA#cdata.notificationgroups]), + ?vdebug("get_final_mib -> check notifications group:" + "~n ~p", [CDATA#cdata.notificationgroups]), check_notification(Traps2, CDATA#cdata.notificationgroups); false -> @@ -960,12 +967,16 @@ Mib = #mib{name = Name, misc = Misc, module_identity = MI, - mes = lists:map(fun translate_me_type/1,MEsWithMFA), + mes = lists:map(fun(ME) -> translate_me_type(ME) end, + MEsWithMFA), variable_infos = extract_variable_infos(MEsWithMFA), table_infos = extract_table_infos(MEsWithMFA), - traps = lists:map(fun translate_trap_type/1, Traps2), - asn1_types = lists:map(fun translate_type/1, Types), + traps = lists:map(fun(T) -> translate_trap_type(T) end, + Traps2), + asn1_types = lists:map(fun(T) -> translate_type(T) end, + Types), imports = CDATA#cdata.imports}, + ?vdebug("get_final_mib -> done", []), {ok, Mib}. @@ -979,12 +990,12 @@ update_trap_objects([], _MEs, Acc) -> - t("update_trap_objects -> done", []), + ?vtrace("update_trap_objects -> done", []), lists:reverse(Acc); update_trap_objects([#trap{trapname = Name, oidobjects = Variables} = Trap|Traps], MEs, Acc) -> - t("update_trap_objects -> update objects for trap ~p:" - "~n ~p", [Name, Variables]), + ?vtrace("update_trap_objects -> update objects for trap ~p:" + "~n ~p", [Name, Variables]), OidObjects = [trap_variable_info(Var, "trap", MEs) || Var <- Variables], UpdTrap = Trap#trap{oidobjects = OidObjects}, @@ -992,8 +1003,8 @@ update_trap_objects([#notification{trapname = Name, oidobjects = Variables} = Notif|Traps], MEs, Acc) -> - t("update_trap_objects -> update objects for notification ~p:" - "~n ~p", [Name, Variables]), + ?vtrace("update_trap_objects -> update objects for notification ~p:" + "~n ~p", [Name, Variables]), OidObjects = [trap_variable_info(Var, "notification", MEs) || Var <- Variables], UpdNotif = Notif#notification{oidobjects = OidObjects}, @@ -1011,9 +1022,9 @@ translate_me_type(ME) -> ME#me{asn1_type = translate_type(ME#me.asn1_type)}. -translate_trap_type(Trap) when record(Trap,notification)-> +translate_trap_type(Trap) when is_record(Trap, notification) -> translate_trap_type_notif(Trap); -translate_trap_type(Trap) when record(Trap,trap)-> +translate_trap_type(Trap) when is_record(Trap, trap) -> translate_trap_type_trap(Trap). translate_trap_type_notif(Trap)-> @@ -1024,19 +1035,21 @@ translate_trap_type_trap(Trap)-> NewOidobjects = - lists:map(fun({Oid,ASN1type}) ->{Oid,translate_type(ASN1type)} end, + lists:map(fun({Oid,ASN1type}) -> + {Oid, translate_type(ASN1type)} + end, Trap#trap.oidobjects), - Trap#trap{oidobjects=NewOidobjects}. + Trap#trap{oidobjects = NewOidobjects}. -translate_type(ASN1type) when ASN1type#asn1_type.bertype == 'NetworkAddress' -> +translate_type(ASN1type) when ASN1type#asn1_type.bertype =:= 'NetworkAddress' -> ASN1type#asn1_type{bertype = 'IpAddress'}; -translate_type(ASN1type) when ASN1type#asn1_type.bertype == 'Integer32' -> +translate_type(ASN1type) when ASN1type#asn1_type.bertype =:= 'Integer32' -> ASN1type#asn1_type{bertype = 'INTEGER'}; -translate_type(ASN1type) when ASN1type#asn1_type.bertype == 'Counter' -> +translate_type(ASN1type) when ASN1type#asn1_type.bertype =:= 'Counter' -> ASN1type#asn1_type{bertype = 'Counter32'}; -translate_type(ASN1type) when ASN1type#asn1_type.bertype == 'Gauge' -> +translate_type(ASN1type) when ASN1type#asn1_type.bertype =:= 'Gauge' -> ASN1type#asn1_type{bertype = 'Unsigned32'}; -translate_type(ASN1type) when ASN1type#asn1_type.bertype == 'Gauge32' -> +translate_type(ASN1type) when ASN1type#asn1_type.bertype =:= 'Gauge32' -> ASN1type#asn1_type{bertype = 'Unsigned32'}; translate_type(ASN1type) -> ASN1type. @@ -1047,7 +1060,7 @@ Objects = get_notification_names(Traps), check_def(notification, Name, Line, Status, GroupObjects, Objects, Ets). -get_notification_names(Traps) when list(Traps) -> +get_notification_names(Traps) when is_list(Traps) -> [Name || #notification{trapname = Name} <- Traps]. check_object_group(Name, GroupObjects, Line, Status) -> @@ -1057,7 +1070,7 @@ get_object_names([])->[]; get_object_names([#me{access=A, entrytype=T, aliasname=N}|MEs]) - when A =/= 'not-accessible', T =/= 'internal' -> + when (A =/= 'not-accessible') andalso (T =/= 'internal') -> [N|get_object_names(MEs)]; get_object_names([_ME|Rest]) -> get_object_names(Rest). @@ -1065,16 +1078,16 @@ %% Strictly we should not need to check more then the status %% table, but since error do happen... check_def(Type, Name, Line, Status, [GroupObject|GroupObjects], Objects, Ets) -> - d("check definition of ~p [~p,~p]: presumed member of ~p [~p]", - [GroupObject, Type, Line, Name, Status]), + ?vdebug2("check definition of ~p [~p]: presumed member of ~p [~p]", + [GroupObject, Type, Name, Status], Line), case lists:member(GroupObject, Objects) of true -> - t("~p is a member of ~p", [GroupObject, Name]), + ?vtrace("~p is a member of ~p", [GroupObject, Name]), %% Lucky so far, now lets check that the status is valid case ets:lookup(Ets, GroupObject) of [{GroupObject, ObjectStatus}] -> - t("check that the object status (~p) is valid", - [ObjectStatus]), + ?vtrace("check that the object status (~p) is valid", + [ObjectStatus]), check_group_member_status(Name, Status, GroupObject, ObjectStatus); _ -> @@ -1085,12 +1098,13 @@ false -> %% Ok, this could be because the status is obsolete or %% deprecated (with the deprecated flag = false) - t("~p is not a member of ~p [object status could be obsolete]", - [GroupObject, Name]), + ?vtrace("~p is not a member of ~p " + "[object status could be obsolete]", + [GroupObject, Name]), case ets:lookup(Ets, GroupObject) of [{GroupObject, ObjectStatus}] -> - t("check that the object status (~p) is valid", - [ObjectStatus]), + ?vtrace("check that the object status (~p) is valid", + [ObjectStatus]), check_group_member_status(Name, Status, GroupObject, ObjectStatus); _ -> @@ -1117,15 +1131,15 @@ group_member_status_error(GroupName, current, Member, MemberStatus, "current"); check_group_member_status(_GroupName, deprecated, _Member, MemberStatus) - when MemberStatus == deprecated; MemberStatus == current -> + when (MemberStatus =:= deprecated) orelse (MemberStatus =:= current) -> ok; check_group_member_status(GroupName, deprecated, Member, MemberStatus) -> group_member_status_error(GroupName, deprecated, Member, MemberStatus, "deprecated or current"); check_group_member_status(_GroupName, obsolete, _Member, MemberStatus) - when MemberStatus == obsolete; - MemberStatus == deprecated; - MemberStatus == current -> + when (MemberStatus =:= obsolete) orelse + (MemberStatus =:= deprecated) orelse + (MemberStatus =:= current) -> ok; check_group_member_status(GroupName, obsolete, Member, MemberStatus) -> group_member_status_error(GroupName, obsolete, Member, MemberStatus, @@ -1159,32 +1173,35 @@ %%----------------------------- check_group([#me{imported = true} | T],GroupObjects)-> - t("check_group(imported) -> skip", []), + ?vtrace("check_group(imported) -> skip", []), check_group(T,GroupObjects); check_group([],_GroupObjects) -> - t("check_group -> done", []), + ?vtrace("check_group -> done", []), ok; -check_group([#me{access=A, entrytype=T, aliasname=N}|MEs], GroupObjects) - when A =/= 'not-accessible', T =/= 'internal' -> - t("check_group -> " - "~n access: ~p" - "~n entrytype: ~p" - "~n aliasname: ~p", [A, T, N]), +check_group([#me{access = A, + entrytype = T, + aliasname = N}|MEs], GroupObjects) + when ((A =/= 'not-accessible') andalso + (T =/= 'internal') andalso + (T =/= group)) -> + ?vtrace("check_group -> " + "~n access: ~p" + "~n entrytype: ~p" + "~n aliasname: ~p", [A, T, N]), check_member_group(N, GroupObjects), check_group(MEs,GroupObjects); check_group([_|MEs],GroupObjects) -> check_group(MEs,GroupObjects). -check_member_group(Aliasname,[])-> +check_member_group(Aliasname, [])-> print_error("'~w' missing in OBJECT-GROUP",[Aliasname]); -check_member_group(Aliasname,[{Name,GroupObject,Line}|Tl])-> - t("check_member_group -> entry with" - "~n Aliasname: ~p" - "~n Name: ~p" - "~n GroupObject: ~p" - "~n Line: ~p", [Aliasname,Name,GroupObject,Line]), +check_member_group(Aliasname, [{Name,GroupObject,Line}|Tl])-> + ?vtrace2("check_member_group -> entry with" + "~n Aliasname: ~p" + "~n Name: ~p" + "~n GroupObject: ~p", [Aliasname, Name, GroupObject], Line), case lists:member(Aliasname,GroupObject) of - true-> + true -> ok; false -> check_member_group(Aliasname,Tl) @@ -1241,15 +1258,19 @@ %% Pre: Fs, MEs are sorted (on Oid) (then we can traverse mib efficiently) %%---------------------------------------------------------------------- insert_mfa(Fs, [ME | MEs], DBName, Mod) - when ME#me.imported == true -> + when ME#me.imported =:= true -> [ME | insert_mfa(Fs, MEs, DBName, Mod)]; insert_mfa(Fs, [ME | MEs], DBName, Mod) - when ME#me.entrytype == internal -> + when ME#me.entrytype =:= internal -> + [ME | insert_mfa(Fs, MEs, DBName, Mod)]; + +insert_mfa(Fs, [ME|MEs], DBName, Mod) + when ME#me.entrytype =:= group -> [ME | insert_mfa(Fs, MEs, DBName, Mod)]; insert_mfa([X | Fs], [ME | MEs], DBName, Mod) - when ME#me.entrytype == variable -> + when ME#me.entrytype =:= variable -> {Oid, {M,F,A}} = X, case ME#me.oid of Oid -> @@ -1260,7 +1281,7 @@ end; insert_mfa([X | Fs], [TableME | MEs], DBName, Mod) - when TableME#me.entrytype == table -> + when TableME#me.entrytype =:= table -> {Oid, {M,F,A}} = X, {TableMEs, RestMEs} = collect_mes_for_table(TableME, [TableME | MEs]), [TableEntryME | ColMEs] = tl(TableMEs), @@ -1282,11 +1303,11 @@ end; insert_mfa([], [ME|MEs], DBName, Mod) - when ME#me.entrytype == variable -> + when ME#me.entrytype =:= variable -> [insert_default_mfa(ME, DBName, Mod) | insert_mfa([], MEs, DBName, Mod)]; insert_mfa([], [ME|MEs], DBName, Mod) - when ME#me.entrytype == table -> + when ME#me.entrytype =:= table -> {TableMEs, RestMEs} = collect_mes_for_table(ME, [ME|MEs]), [TableME, _TableEntryME | ColMEs] = TableMEs, DefVals = get_defvals(ColMEs), @@ -1318,16 +1339,17 @@ end. %% returns: MibEntry with access-functions. -insert_default_mfa(ME, DBName, undefined) when record(ME, me)-> +insert_default_mfa(ME, DBName, undefined) when is_record(ME, me)-> case lists:member(no_defs, get(options)) of true -> error("Missing access function for ~s", [ME#me.aliasname]); false -> - i("No accessfunction for '~w', using default.", [ME#me.aliasname]), + ?vinfo("No accessfunction for '~w' => using default", + [ME#me.aliasname]), set_default_function(ME, DBName) end; -insert_default_mfa(ME, _DBName, Mod) when record(ME, me)-> +insert_default_mfa(ME, _DBName, Mod) when is_record(ME, me)-> ME#me{mfa = {Mod, ME#me.aliasname, []}}; insert_default_mfa([TableME, EntryME | Columns], DBName, undefined) -> @@ -1335,8 +1357,8 @@ true -> error("Missing access function for ~s", [TableME#me.aliasname]); false -> - i("No accessfunction for '~w', using default.", - [TableME#me.aliasname]), + ?vinfo("No accessfunction for '~w' => using default", + [TableME#me.aliasname]), set_default_function([TableME, EntryME | Columns], DBName) end; @@ -1351,19 +1373,20 @@ lists:prefix(Oid, TableOid). %% returns false | {value, ME} -lookup(UniqName, MEs) when atom(UniqName) -> +lookup(UniqName, MEs) when is_atom(UniqName) -> lists:keysearch(UniqName, #me.aliasname, MEs); -lookup(Oid, MEs) when list(Oid) -> +lookup(Oid, MEs) when is_list(Oid) -> lists:keysearch(Oid, #me.oid, MEs). search_for_dublettes(PrevME, [ME|_MEs]) - when PrevME#me.oid==ME#me.oid -> + when PrevME#me.oid =:= ME#me.oid -> error("Multiple used object with OBJECT IDENTIFIER '~w'. " "Used in '~w' and '~w'.", [PrevME#me.oid, PrevME#me.aliasname, ME#me.aliasname]); search_for_dublettes(PrevME, [ME|MEs]) - when PrevME#me.entrytype == variable, ME#me.entrytype == variable -> + when ((PrevME#me.entrytype =:= variable) andalso + (ME#me.entrytype =:= variable)) -> case lists:prefix(PrevME#me.oid, ME#me.oid) of true -> error("Variable '~w' (~w) defined below other " @@ -1379,7 +1402,7 @@ ok. -search_for_oid_conflicts([Rec|Traps],MEs) when record(Rec,notification) -> +search_for_oid_conflicts([Rec|Traps],MEs) when is_record(Rec,notification) -> #notification{oid = Oid, trapname = Name} = Rec, case search_for_oid_conflicts1(Oid,MEs) of {error,ME} -> @@ -1415,9 +1438,9 @@ {value,TableInfo} = snmpc_misc:assq(table_info,TableME#me.assocList), case TableInfo#table_info.status_col of undefined -> - w("No RowStatus column in table ~w. " - "The default functions won't work properly.", - [TableME#me.aliasname]); + ?vwarning("No RowStatus column in table ~w => " + "The default functions won't work properly", + [TableME#me.aliasname]); _Q -> ok end. @@ -1472,73 +1495,6 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Section for debug functions -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -t(F,A) -> - vprint(printable(get(verbosity),trace),F,A,undefined). - -d(F,A) -> - vprint(printable(get(verbosity),debug),F,A,undefined). - -l(F,A) -> - vprint(printable(get(verbosity),log),F,A,undefined). - -i(F,A) -> - vprint(printable(get(verbosity),info),F,A,undefined). -i(F,A,L) -> - vprint(printable(get(verbosity),info),F,A,L). - -w(F,A) -> - vprint(printable(get(verbosity),warning),F,A,undefined). -w(F,A,L) -> - vprint(printable(get(verbosity),warning),F,A,L). - - - -vprint(false,_F,_A,_L) -> - ok; -vprint(S,F,A,undefined) -> - io:format("~s: " ++ image_of_severity(S) ++ F ++ "~n", - [get(filename)|A]); -vprint(S,F,A,L) -> - io:format("~s: ~w: " ++ image_of_severity(S) ++ F ++ "~n", - [get(filename),L|A]). - - -printable(silence,_) -> false; -printable(warning,warning) -> warning; -printable(info,info) -> info; -printable(info,warning) -> warning; -printable(log,warning) -> warning; -printable(log,info) -> info; -printable(log,log) -> log; -printable(debug,warning) -> warning; -printable(debug,info) -> info; -printable(debug,log) -> log; -printable(debug,debug) -> debug; -printable(trace,V) -> V; -printable(_V,_S) -> false. - --spec image_of_severity(Sev :: severity()) -> string(). -image_of_severity(warning) -> "Warning: "; -image_of_severity(info) -> "Info: "; -image_of_severity(log) -> "Log: "; -image_of_severity(debug) -> "Debug: "; -image_of_severity(trace) -> "Trace: "; -image_of_severity(_) -> " - ". - - -vvalidate(silence) -> ok; -vvalidate(warning) -> ok; -vvalidate(info) -> ok; -vvalidate(log) -> ok; -vvalidate(debug) -> ok; -vvalidate(trace) -> ok; -vvalidate(V) -> exit({invalid_verbosity,V}). - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Section for misc useful functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1624,48 +1580,50 @@ %% is updated. The functions for this is update_me_oids/2 %% and update_trap_oids/2. %%----------------------------------------------------------------- -register_oid(Line, Name, FatherName, SubIndex) when Name /= '$no_name$' -> - t("register_oid -> entry with" - "~n Line: ~w" +register_oid(Line, Name, ParentName, SubIndex) when Name =/= '$no_name$' -> + ?vtrace2("register_oid -> entry with" "~n Name: ~p" - "~n FatherName: ~p" - "~n SubIndex: ~p", [Line, Name, FatherName, SubIndex]), + "~n ParentName: ~p" + "~n SubIndex: ~p", [Name, ParentName, SubIndex], Line), check_sub_ids(SubIndex, Name, Line), OidEts = (get(cdata))#cdata.oid_ets, - %% Lookup Father - if it doesn't already exist, create it - {_FatherName, HisFatherName, HisLine, HisSubIndex, Children} = - case ets:lookup(OidEts, FatherName) of + %% Lookup Parent - if it doesn't already exist, create it + {_ParentName, ItsParentName, ItsLine, ItsSubIndex, Children} = + case ets:lookup(OidEts, ParentName) of [Found] -> - t("register_oid -> father found: ~n~p", [Found]), + ?vtrace("register_oid -> parent found: " + "~n ~p", [Found]), Found; [] -> - t("register_oid -> father not found: ~n~p", - [ets:tab2list(OidEts)]), - {FatherName, undef, undef, [], []} + ?vtrace("register_oid -> father not found: " + "~n ~p", [ets:tab2list(OidEts)]), + {ParentName, undef, undef, [], []} end, %% Update Father with a pointer to us NChildren = case lists:member(Name, Children) of true -> Children; false -> [Name | Children] end, - NFather = {FatherName, HisFatherName, HisLine, HisSubIndex,NChildren}, - t("register_oid -> NFather: ~n~p", [NFather]), - ets:insert(OidEts, NFather), + NParent = {ParentName, ItsParentName, ItsLine, ItsSubIndex, NChildren}, + ?vtrace("register_oid -> NParent: ~n~p", [NParent]), + ets:insert(OidEts, NParent), %% Lookup ourselves - if we don't exist, create us MyChildren = case ets:lookup(OidEts, Name) of [Found2] -> - t("register_oid -> child found: ~n~p", [Found2]), + ?vtrace("register_oid -> children found: " + "~n ~p", [Found2]), element(5, Found2); [] -> - t("register_oid -> child not found", []), + ?vtrace("register_oid -> no children found", []), [] end, %% Update ourselves - NSelf = {Name, FatherName, Line, SubIndex, MyChildren}, - t("register_oid -> NSelf: ~n~p", [NSelf]), + NSelf = {Name, ParentName, Line, SubIndex, MyChildren}, + ?vtrace("register_oid -> NSelf: " + "~n ~p", [NSelf]), ets:insert(OidEts, NSelf); -register_oid(_Line, _Name, _FatherName, _SubIndex) -> +register_oid(_Line, _Name, _ParentName, _SubIndex) -> ok. @@ -1700,8 +1658,8 @@ update_me_oids([#me{aliasname = '$no_name$'} | Mes], OidEts, Acc) -> update_me_oids(Mes, OidEts, Acc); update_me_oids([Me | Mes], OidEts, Acc) -> - t("update_me_oids -> entry with" - "~n Me: ~p", [Me]), + ?vtrace("update_me_oids -> entry with" + "~n Me: ~p", [Me]), Oid = tr_oid(Me#me.aliasname, OidEts), NMe = resolve_oid_defval(Me, OidEts), update_me_oids(Mes, OidEts, [NMe#me{oid = Oid} | Acc]). @@ -1711,8 +1669,8 @@ update_trap_oids([#trap{enterpriseoid = EOid, oidobjects = OidObjs} = Trap | Traps], OidEts, Acc) -> - t("update_trap_oids -> entry with" - "~n EOid: ~p", [EOid]), + ?vtrace("update_trap_oids -> entry with" + "~n EOid: ~p", [EOid]), NEnter = tr_oid(EOid, OidEts), NOidObjs = tr_oid_objs(OidObjs, OidEts), NTrap = Trap#trap{enterpriseoid = NEnter, @@ -1721,16 +1679,16 @@ update_trap_oids([#notification{trapname = Name, oidobjects = OidObjs} = Notif | Traps], OidEts, Acc) -> - t("update_trap_oids -> entry with" - "~n Name: ~p", [Name]), + ?vtrace("update_trap_oids -> entry with" + "~n Name: ~p", [Name]), Oid = tr_oid(Name, OidEts), NOidObjs = tr_oid_objs(OidObjs, OidEts), NNotif = Notif#notification{oid = Oid, oidobjects = NOidObjs}, update_trap_oids(Traps, OidEts, [NNotif|Acc]). tr_oid(Name, OidEts) -> - t("tr_oid -> entry with" - "~n Name: ~p", [Name]), + ?vtrace("tr_oid -> entry with" + "~n Name: ~p", [Name]), case ets:lookup(OidEts, Name) of [{Name, MyOid, _MyLine}] -> MyOid; @@ -1739,19 +1697,19 @@ "of undefined parent object. Parent: '~w'." "(Sub-indexes: ~w.)", [Name, Parent, SubIndex], Line), - t("tr_oid -> ets:tab2list(~w): " - "~n~p", [OidEts, ets:tab2list(OidEts)]), + ?vtrace("tr_oid -> ets:tab2list(~w): " + "~n ~p", [OidEts, ets:tab2list(OidEts)]), rnd_oid() end. tr_oid_objs([{{variable, Name}, Type} | T], OidEts) -> - t("tr_oid_objs(variable) -> entry with" - "~n Name: ~p", [Name]), + ?vtrace("tr_oid_objs(variable) -> entry with" + "~n Name: ~p", [Name]), Oid = tr_oid(Name, OidEts) ++ [0], [{Oid, Type} | tr_oid_objs(T, OidEts)]; tr_oid_objs([{{column, Name}, Type} | T], OidEts) -> - t("tr_oid_objs(column) -> entry with" - "~n Name: ~p", [Name]), + ?vtrace("tr_oid_objs(column) -> entry with" + "~n Name: ~p", [Name]), Oid = tr_oid(Name, OidEts), [{Oid, Type} | tr_oid_objs(T, OidEts)]; tr_oid_objs([], _OidEts) -> @@ -1762,7 +1720,7 @@ when (ME#me.asn1_type)#asn1_type.bertype == 'OBJECT IDENTIFIER' -> #me{aliasname = MEName, assocList = AssocList} = ME, case snmpc_misc:assq(defval, AssocList) of - {value, DefVal} when atom(DefVal) -> + {value, DefVal} when is_atom(DefVal) -> case ets:lookup(OidEts, DefVal) of [{_, Oid, _}] -> ME#me{assocList = lists:keyreplace(defval, 1, AssocList, @@ -1781,20 +1739,81 @@ rnd_oid() -> [99,99]. %% '99' means "stop computer" in Y2Kish... -error(FormatStr, Data) when list(FormatStr) -> +error(FormatStr, Data) when is_list(FormatStr) -> print_error(FormatStr,Data), exit(error). -error(FormatStr, Data, Line) when list(FormatStr) -> +error(FormatStr, Data, Line) when is_list(FormatStr) -> print_error(FormatStr,Data,Line), exit(error). -print_error(FormatStr, Data) when list(FormatStr) -> +print_error(FormatStr, Data) when is_list(FormatStr) -> ok = io:format("~s: Error: " ++ FormatStr,[get(filename)|Data]), put(errors,yes), io:format("~n"). -print_error(FormatStr, Data,Line) when list(FormatStr) -> +print_error(FormatStr, Data,Line) when is_list(FormatStr) -> ok = io:format("~s: ~w: Error: " ++ FormatStr,[get(filename), Line |Data]), put(errors,yes), io:format("~n"). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Section for debug functions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +vprint(Severity, Mod, Line, MibLine, F, A) -> + case printable(Severity) of + standard when is_integer(MibLine) -> + io:format("[~s:~w][~s]: " ++ F ++ "~n", + [get(filename), MibLine, image_of_severity(Severity)|A]); + standard -> + io:format("[~s][~s]: " ++ F ++ "~n", + [get(filename), image_of_severity(Severity)|A]); + extended when is_integer(MibLine) -> + io:format("[~s:~w][~w:~w][~s]: " ++ F ++ "~n", + [get(filename), MibLine, Mod, Line, + image_of_severity(Severity)|A]); + extended -> + io:format("[~s][~w:~w][~s]: " ++ F ++ "~n", + [get(filename), Mod, Line, + image_of_severity(Severity)|A]); + _ -> + ok + end. + +printable(Severity) -> + printable(get(verbosity), Severity). + +printable(silence, _) -> none; +printable(warning, warning) -> standard; +printable(info, info) -> standard; +printable(info, warning) -> standard; +printable(log, warning) -> standard; +printable(log, info) -> standard; +printable(log, log) -> standard; +printable(debug, warning) -> standard; +printable(debug, info) -> standard; +printable(debug, log) -> standard; +printable(debug, debug) -> standard; +printable(trace, _Sev) -> extended; +printable(_Ver, _Sev) -> none. + +-spec image_of_severity(Sev :: severity()) -> string(). +image_of_severity(warning) -> "WAR"; +image_of_severity(info) -> "INF"; +image_of_severity(log) -> "LOG"; +image_of_severity(debug) -> "DBG"; +image_of_severity(trace) -> "TRC"; +image_of_severity(_) -> " - ". + + +vvalidate(silence) -> ok; +vvalidate(warning) -> ok; +vvalidate(info) -> ok; +vvalidate(log) -> ok; +vvalidate(debug) -> ok; +vvalidate(trace) -> ok; +vvalidate(V) -> exit({invalid_verbosity,V}). + + diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_lib.hrl erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_lib.hrl --- erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_lib.hrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_lib.hrl 2009-11-20 08:48:38.000000000 +0000 @@ -0,0 +1,37 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-ifndef(snmpc_lib). +-define(snmpc_lib, true). + +-define(vwarning(F, A), ?verbosity(warning, F, A, ignore)). +-define(vwarning2(F, A, MibLine), ?verbosity(warning, F, A, MibLine)). +-define(vinfo(F, A), ?verbosity(info, F, A, ignore)). +-define(vinfo2(F, A, MibLine), ?verbosity(info, F, A, MibLine)). +-define(vlog(F, A), ?verbosity(log, F, A, ignore)). +-define(vlog2(F, A, MibLine), ?verbosity(log, F, A, MibLine)). +-define(vdebug(F, A), ?verbosity(debug, F, A, ignore)). +-define(vdebug2(F, A, MibLine), ?verbosity(debug, F, A, MibLine)). +-define(vtrace(F, A), ?verbosity(trace, F, A, ignore)). +-define(vtrace2(F, A, MibLine), ?verbosity(trace, F, A, MibLine)). + +-define(verbosity(Severity, F, A, MibLine), + snmpc_lib:vprint(Severity, ?MODULE, ?LINE, MibLine, F, A)). + +-endif. % -ifndef(snmpc_lib). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_mib_gram.yrl erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_mib_gram.yrl --- erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_mib_gram.yrl 2009-03-12 12:27:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_mib_gram.yrl 2009-11-20 08:48:24.000000000 +0000 @@ -625,6 +625,7 @@ %%---------------------------------------------------------------------- -include("snmp_types.hrl"). +-include("snmpc_lib.hrl"). -include("snmpc.hrl"). % value @@ -813,7 +814,7 @@ case lists:member(Atom, [h, 'H', b, 'B']) of true -> case catch make_defval_for_string2(Str, Atom) of - Defval when list(Defval) -> + Defval when is_list(Defval) -> Defval; {error, ErrStr} -> snmpc_lib:print_error("Bad DEFVAL ~w string ~p - ~s", @@ -931,7 +932,7 @@ display_hint(Val) -> case val(Val) of - Str when list(Str) -> + Str when is_list(Str) -> lists:reverse(Str); _ -> throw({error, {invalid_display_hint, Val}}) @@ -939,7 +940,7 @@ units(Val) -> case val(Val) of - Str when list(Str) -> + Str when is_list(Str) -> lists:reverse(Str); _ -> throw({error, {invalid_units, Val}}) @@ -965,7 +966,7 @@ filter_v2imports(_,Type) -> {type, Type}. w(F, A) -> - snmpc_lib:w(F, A). + ?vwarning(F, A). %i(F, A) -> % io:format("~w:" ++ F ++ "~n", [?MODULE|A]). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_mib_to_hrl.erl erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_mib_to_hrl.erl --- erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_mib_to_hrl.erl 2009-03-12 12:27:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_mib_to_hrl.erl 2009-11-20 08:48:24.000000000 +0000 @@ -21,6 +21,7 @@ -include_lib("stdlib/include/erl_compile.hrl"). -include("snmp_types.hrl"). +-include("snmpc_lib.hrl"). %% External exports -export([convert/1, compile/3]). @@ -42,24 +43,24 @@ convert(MibFile, HrlFile, MibName). convert(MibFile, HrlFile, MibName) -> - t("convert -> entry with" - "~n MibFile: ~s" - "~n HrlFile: ~s" - "~n MibName: ~s", [MibFile, HrlFile, MibName]), + ?vtrace("convert -> entry with" + "~n MibFile: ~s" + "~n HrlFile: ~s" + "~n MibName: ~s", [MibFile, HrlFile, MibName]), case snmpc_misc:read_mib(MibFile) of {ok, #mib{asn1_types = Types, mes = MEs, traps = Traps}} -> - d("mib successfully read"), + ?vdebug("mib successfully read", []), resolve(Types, MEs, Traps, HrlFile, filename:basename(MibName)), ok; {error, Reason} -> - i("failed reading mib: " - "~n Reason: ~p", [Reason]), + ?vinfo("failed reading mib: " + "~n Reason: ~p", [Reason]), {error, Reason} end. resolve(Types, MEs, Traps, HrlFile, MibName) -> - t("resolve -> entry"), + ?vtrace("resolve -> entry", []), case file:open(HrlFile, [write]) of {ok, Fd} -> insert_header(Fd), @@ -71,15 +72,15 @@ insert_defvals(MEs, Fd), insert_end(Fd), file:close(Fd), - l("~s written", [HrlFile]); + ?vlog("~s written", [HrlFile]); {error, Reason} -> - i("failed opening output file: " - "~n Reason: ~p", [Reason]), + ?vinfo("failed opening output file: " + "~n Reason: ~p", [Reason]), {error, Reason} end. insert_header(Fd) -> - d("insert file header"), + ?vdebug("insert file header", []), io:format(Fd, "%%% This file was automatically generated by " "snmpc_mib_to_hrl version ~s~n", [?version]), {Y,Mo,D} = date(), @@ -88,17 +89,17 @@ [D,month(Mo),Y,H,Mi,S]). insert_begin(Fd, MibName) -> - d("insert file begin"), + ?vdebug("insert file begin", []), io:format(Fd, "-ifndef('~s').~n" "-define('~s', true).~n", [MibName, MibName]). insert_end(Fd) -> - d("insert file end"), + ?vdebug("insert file end", []), io:format(Fd, "-endif.~n", []). insert_oids(MEs, Fd) -> - d("insert oids"), + ?vdebug("insert oids", []), io:format(Fd, "~n%% Oids~n", []), insert_oids2(MEs, Fd), io:format(Fd, "~n", []). @@ -107,18 +108,18 @@ insert_oids2(T, Fd); insert_oids2([#me{entrytype = table_column, oid = Oid, aliasname = Name} | T], Fd) -> - t("insert oid [table column]: ~p - ~w", [Name, Oid]), + ?vtrace("insert oid [table column]: ~p - ~w", [Name, Oid]), io:format(Fd, "-define(~w, ~w).~n", [Name, lists:last(Oid)]), insert_oids2(T, Fd); insert_oids2([#me{entrytype = variable, oid = Oid, aliasname = Name} | T], Fd) -> - t("insert oid [variable]: ~p - ~w", [Name, Oid]), + ?vtrace("insert oid [variable]: ~p - ~w", [Name, Oid]), io:format(Fd, "-define(~w, ~w).~n", [Name, Oid]), io:format(Fd, "-define(~w, ~w).~n", [merge_atoms(Name, instance), Oid ++ [0]]), insert_oids2(T, Fd); insert_oids2([#me{oid = Oid, aliasname = Name} | T], Fd) -> - t("insert oid: ~p - ~w", [Name, Oid]), + ?vtrace("insert oid: ~p - ~w", [Name, Oid]), io:format(Fd, "~n-define(~w, ~w).~n", [Name, Oid]), insert_oids2(T, Fd); insert_oids2([], _Fd) -> @@ -126,7 +127,7 @@ insert_notifs(Traps, Fd) -> - d("insert notifications"), + ?vdebug("insert notifications", []), Notifs = [Notif || Notif <- Traps, is_record(Notif, notification)], case Notifs of [] -> @@ -139,7 +140,7 @@ insert_notifs2([], _Fd) -> ok; insert_notifs2([#notification{trapname = Name, oid = Oid}|T], Fd) -> - t("insert notification ~p - ~w", [Name, Oid]), + ?vtrace("insert notification ~p - ~w", [Name, Oid]), io:format(Fd, "-define(~w, ~w).~n", [Name, Oid]), insert_notifs2(T, Fd). @@ -150,7 +151,7 @@ %% ins_types and then ins_mes to insert enums from different places. %%----------------------------------------------------------------- insert_enums(Types, MEs, Fd) -> - d("insert enums"), + ?vdebug("insert enums", []), T = ins_types(Types, Fd, []), ins_mes(MEs, T, Fd). @@ -160,9 +161,9 @@ assocList = Alist, imported = false} | T], Fd, Res) - when list(Alist) -> + when is_list(Alist) -> case lists:keysearch(enums, 1, Alist) of - {value, {enums, Enums}} when Enums /= [] -> + {value, {enums, Enums}} when Enums =/= [] -> case Enums of [] -> ins_types(T, Fd, Res); NewEnums -> @@ -185,9 +186,9 @@ aliasname = Aname}, imported = false} | T], Types, Fd) - when list(Alist) -> + when is_list(Alist) -> case lists:keysearch(enums, 1, Alist) of - {value, {enums, Enums}} when Enums /= [] -> + {value, {enums, Enums}} when Enums =/= [] -> case Enums of [] -> ins_mes(T, Types, Fd); NewEnums -> @@ -224,7 +225,7 @@ atom_to_list(Name)])). insert_defvals(Mes, Fd) -> - d("insert default values"), + ?vdebug("insert default values", []), io:format(Fd, "~n%% Default values~n", []), insert_defvals2(Mes, Fd), io:format(Fd, "~n", []). @@ -260,7 +261,7 @@ insert_defvals2([], _Fd) -> ok. insert_range(Mes, Fd) -> - d("insert range"), + ?vdebug("insert range", []), io:format(Fd, "~n%% Range values~n", []), insert_range2(Mes, Fd), io:format(Fd, "~n", []). @@ -268,7 +269,7 @@ insert_range2([#me{imported = true} | T], Fd)-> insert_range2(T,Fd); insert_range2([#me{asn1_type=#asn1_type{bertype='OCTET STRING',lo=Low,hi=High},aliasname=Name}|T],Fd)-> - case Low==undefined of + case Low =:= undefined of true-> insert_range2(T,Fd); false-> @@ -291,7 +292,7 @@ io:format(Fd,"-define(~w, ~w).~n",[AtomHigh,High]), insert_range2(T,Fd); insert_range2([#me{asn1_type=#asn1_type{bertype='INTEGER',lo=Low,hi=High},aliasname=Name}|T],Fd)-> - case Low==undefined of + case Low =:= undefined of true-> insert_range2(T,Fd); false-> @@ -327,10 +328,10 @@ compile(Input, Output, Opts) -> set_verbosity(Opts), set_filename(Input), - t("compile -> entry with" - "~n Input: ~s" - "~n Output: ~s" - "~n Opts: ~p", [Input, Output, Opts]), + ?vtrace("compile -> entry with" + "~n Input: ~s" + "~n Output: ~s" + "~n Opts: ~p", [Input, Output, Opts]), case convert(Input++".bin", Output++".hrl", Input) of ok -> ok; @@ -386,21 +387,5 @@ put(filename, Basename). -i(F, A) -> - snmpc_lib:i(F, A). - -l(F, A) -> - snmpc_lib:l(F, A). - -d(F) -> - d(F, []). -d(F, A) -> - snmpc_lib:d(F, A). - -t(F) -> - t(F, []). -t(F, A) -> - snmpc_lib:t(F, A). - diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_misc.erl erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_misc.erl --- erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_misc.erl 2009-03-12 12:31:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_misc.erl 2009-11-20 08:48:35.000000000 +0000 @@ -29,7 +29,6 @@ ensure_trailing_dir_delimiter/1, foreach/3, is_string/1, - map/3, read_mib/1, read_noexit/2, strip_extension_from_filename/2, @@ -71,23 +70,24 @@ end. -strip_extension_from_filename(FileName, Ext) when atom(FileName) -> +strip_extension_from_filename(FileName, Ext) when is_atom(FileName) -> strip_extension_from_filename(atom_to_list(FileName), Ext); -strip_extension_from_filename(FileName, Ext) when list(FileName) -> +strip_extension_from_filename(FileName, Ext) when is_list(FileName) -> case lists:suffix(Ext, FileName) of true -> lists:sublist(FileName, 1, length(FileName) - length(Ext)); false -> FileName end. -to_upper([C|Cs]) when C >= $a, C =< $z -> [C-($a-$A)|to_upper(Cs)]; +to_upper([C|Cs]) when (C >= $a) andalso (C =< $z) -> [C-($a-$A)|to_upper(Cs)]; to_upper([C|Cs]) -> [C|to_upper(Cs)]; to_upper([]) -> []. is_string([]) -> true; -is_string([Tkn | Str]) when integer(Tkn), Tkn >= 0, Tkn =< 255 -> +is_string([Tkn | Str]) + when is_integer(Tkn) andalso (Tkn >= 0) andalso (Tkn =< 255) -> is_string(Str); is_string(_) -> false. @@ -95,10 +95,8 @@ foreach(Function, ExtraArgs, [H | T]) -> apply(Function, [H | ExtraArgs]), foreach(Function, ExtraArgs, T); -foreach(_Function, _ExtraArgs, []) -> true. - - -map(F, Eas, List) -> [ apply(F, [E|Eas]) || E <- List ]. +foreach(_Function, _ExtraArgs, []) -> + true. diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_misc.hrl erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_misc.hrl --- erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_misc.hrl 2009-03-12 12:31:46.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_misc.hrl 2009-09-18 15:13:14.000000000 +0100 @@ -20,10 +20,10 @@ -define(verify_format_version(VFV_Ver1,VFV_Ver2), fun(VFV_V,VFV_V) -> ok; - (VFV_V1,VFV_V2) when list(VFV_V1), list(VFV_V2) -> + (VFV_V1,VFV_V2) when is_list(VFV_V1) andalso is_list(VFV_V2) -> Toks1 = string:tokens(VFV_V1, [$.]), [Major1|_] = case (catch [list_to_integer(I) || I <- Toks1]) of - Nums when list(Nums) -> + Nums when is_list(Nums) -> Nums; _ -> {error, {invalid_version_format, VFV_V1}} @@ -49,7 +49,7 @@ throw(RM_Error) end, RM_Mib = case (catch binary_to_term(RM_Bin)) of - RM_M when record(RM_M, mib) -> + RM_M when is_record(RM_M, mib) -> RM_M; _ -> throw({error, bad_mib_format}) @@ -57,7 +57,7 @@ #mib{mib_format_version = RM_V1} = #mib{}, case RM_Mib of #mib{mib_format_version = RM_V2, - misc = RM_X} when integer(RM_X) -> + misc = RM_X} when is_integer(RM_X) -> case (catch ?verify_format_version(RM_V1, RM_V2)) of ok -> {ok, RM_Mib#mib{misc = []}}; diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_tok.erl erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_tok.erl --- erlang-13.b.1-dfsg/lib/snmp/src/compile/snmpc_tok.erl 2009-03-12 12:27:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/compile/snmpc_tok.erl 2009-09-18 15:12:11.000000000 +0100 @@ -212,10 +212,10 @@ %% Returns: {ReplyToken, NewState} safe_tokenise(eof) -> {{eof, get(line)}, eof}; -safe_tokenise(Chars) when list(Chars) -> +safe_tokenise(Chars) when is_list(Chars) -> case catch tokenise(Chars) of {error, ErrorInfo} -> {{error, ErrorInfo, get(line)}, {[], eof}}; - {Token, RestChars} when tuple(Token) -> + {Token, RestChars} when is_tuple(Token) -> {{ok, [Token], get(line)}, RestChars} end. @@ -224,7 +224,7 @@ get_all_tokens(Str,Toks) -> case catch tokenise(Str) of {error, ErrorInfo} -> {error, ErrorInfo}; - {Token, RestChars} when tuple(Token) -> + {Token, RestChars} when is_tuple(Token) -> get_all_tokens(RestChars, [Token|Toks]) end. @@ -233,10 +233,10 @@ %%-------------------------------------------------- %% Returns: {Token, Rest} %%-------------------------------------------------- -tokenise([H|T]) when $a =< H , H =< $z -> +tokenise([H|T]) when ($a =< H) andalso (H =< $z) -> get_name(atom, [H], T); -tokenise([H|T]) when $A =< H , H =< $Z -> +tokenise([H|T]) when ($A =< H) andalso (H =< $Z) -> get_name(variable, [H], T); tokenise([$:,$:,$=|T]) -> @@ -245,11 +245,11 @@ tokenise([$-,$-|T]) -> tokenise(skip_comment(T)); -tokenise([$-,H|T]) when $0 =< H , H =< $9 -> +tokenise([$-,H|T]) when ($0 =< H ) andalso (H =< $9) -> {Val, Rest} = get_integer(T, [H]), {{integer, get(line), -1 * Val}, Rest}; -tokenise([H|T]) when $0 =< H , H =< $9 -> +tokenise([H|T]) when ($0 =< H) andalso (H =< $9) -> {Val, Rest} = get_integer(T, [H]), {{integer, get(line), Val}, Rest}; @@ -313,16 +313,16 @@ isInName($-) -> true; isInName(Ch) -> isalnum(Ch). -isalnum(H) when $A =< H , H =< $Z -> +isalnum(H) when ($A =< H) andalso (H =< $Z) -> true; -isalnum(H) when $a =< H , H =< $z -> +isalnum(H) when ($a =< H) andalso (H =< $z) -> true; -isalnum(H) when $0 =< H , H =< $9 -> +isalnum(H) when ($0 =< H) andalso (H =< $9) -> true; isalnum(_) -> false. -isdigit(H) when $0 =< H , H =< $9 -> +isdigit(H) when ($0 =< H) andalso (H =< $9) -> true; isdigit(_) -> false. diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/manager/modules.mk erlang-13.b.3-dfsg/lib/snmp/src/manager/modules.mk --- erlang-13.b.1-dfsg/lib/snmp/src/manager/modules.mk 2009-04-16 10:26:16.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/manager/modules.mk 2009-11-20 08:48:36.000000000 +0000 @@ -20,7 +20,8 @@ BEHAVIOUR_MODULES = \ snmpm_user \ snmpm_user_old \ - snmpm_network_interface + snmpm_network_interface \ + snmpm_network_interface_filter MODULES = \ $(BEHAVIOUR_MODULES) \ @@ -30,6 +31,7 @@ snmpm_mpd \ snmpm_misc_sup \ snmpm_net_if \ + snmpm_net_if_filter \ snmpm_server \ snmpm_server_sup \ snmpm_supervisor \ diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_config.erl erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_config.erl --- erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_config.erl 2009-06-05 13:55:54.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_config.erl 2009-11-20 08:48:36.000000000 +0000 @@ -68,7 +68,7 @@ maybe_cre_stats_counter/2, incr_stats_counter/2, reset_stats_counter/1, - get_stats_counters/0, + get_stats_counters/0, get_stats_counter/1, load_mib/1, unload_mib/1, which_mibs/0, make_mini_mib/0, @@ -764,7 +764,7 @@ %% Wrap-counters (wrapping at 2147483647 or 4294967295) cre_counter(Counter, Initial) -> - case (whereis(?SERVER) == self()) of + case (whereis(?SERVER) =:= self()) of false -> call({cre_counter, Counter, Initial}); true -> @@ -801,7 +801,7 @@ end. cre_stats_counter(Counter, Initial) -> - case (whereis(?SERVER) == self()) of + case (whereis(?SERVER) =:= self()) of false -> call({cre_stats_counter, Counter, Initial}); true -> @@ -818,7 +818,7 @@ end. reset_stats_counter(Counter) -> - case (whereis(?SERVER) == self()) of + case (whereis(?SERVER) =:= self()) of false -> call({reset_stats_counter, Counter}); true -> @@ -826,6 +826,14 @@ end, ok. +get_stats_counter(Counter) -> + case ets:lookup(snmpm_stats_table, Counter) of + [{Counter, Value}] -> + {ok, Value}; + _ -> + {error, not_found} + end. + get_stats_counters() -> ets:tab2list(snmpm_stats_table). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_net_if.erl erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_net_if.erl --- erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_net_if.erl 2009-03-12 12:31:37.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_net_if.erl 2009-11-20 08:48:36.000000000 +0000 @@ -37,7 +37,8 @@ info/1, verbosity/2, %% system_info_updated/2, - get_log_type/1, set_log_type/2 + get_log_type/1, set_log_type/2, + filter_reset/1 ]). %% gen_server callbacks @@ -61,10 +62,14 @@ mpd_state, log, irb = auto, % auto | {user, integer()} - irgc + irgc, + filter }). +-define(DEFAULT_FILTER_MODULE, snmpm_net_if_filter). +-define(DEFAULT_FILTER_OPTS, [{module, ?DEFAULT_FILTER_MODULE}]). + -ifdef(snmp_debug). -define(GS_START_LINK(Args), gen_server:start_link(?MODULE, Args, [{debug,[trace]}])). @@ -94,7 +99,7 @@ send_pdu(Pid, Pdu, Vsn, MsgData, Addr, Port, undefined). send_pdu(Pid, Pdu, Vsn, MsgData, Addr, Port, ExtraInfo) - when record(Pdu, pdu) -> + when is_record(Pdu, pdu) -> ?d("send_pdu -> entry with" "~n Pid: ~p" "~n Pdu: ~p" @@ -125,6 +130,9 @@ set_log_type(Pid, NewType) -> call(Pid, {set_log_type, NewType}). +filter_reset(Pid) -> + cast(Pid, filter_reset). + %%%------------------------------------------------------------------- %%% Callback functions from gen_server @@ -184,10 +192,17 @@ {ok, Port} = snmpm_config:system_info(port), {ok, Sock} = do_open_port(Port, SndBuf, RecBuf, BindTo, NoReuse), + %% Flow control -- + FilterOpts = get_opt(Opts, filter, []), + FilterMod = create_filter(FilterOpts), + ?vdebug("FilterMod: ~w", [FilterMod]), + %% -- Audit trail log --- {ok, ATL} = snmpm_config:system_info(audit_trail_log), Log = do_init_log(ATL), + %% -- Initiate counters --- + init_counters(), %% -- We are done --- State = #state{server = Server, @@ -196,7 +211,8 @@ sock = Sock, log = Log, irb = IRB, - irgc = IrGcRef}, + irgc = IrGcRef, + filter = FilterMod}, ?vdebug("started", []), {ok, State}. @@ -214,12 +230,19 @@ IpOpts3 = recbuf(RecvSz), IpOpts4 = sndbuf(SendSz), IpOpts = [binary | IpOpts1 ++ IpOpts2 ++ IpOpts3 ++ IpOpts4], - case init:get_argument(snmpm_fd) of - {ok, [[FdStr]]} -> - Fd = list_to_integer(FdStr), - gen_udp:open(0, [{fd, Fd}|IpOpts]); - error -> - gen_udp:open(Port, IpOpts) + OpenRes = + case init:get_argument(snmpm_fd) of + {ok, [[FdStr]]} -> + Fd = list_to_integer(FdStr), + gen_udp:open(0, [{fd, Fd}|IpOpts]); + error -> + gen_udp:open(Port, IpOpts) + end, + case OpenRes of + {error, _} = Error -> + throw(Error); + OK -> + OK end. bind_to(true) -> @@ -250,6 +273,18 @@ [{sndbuf, Sz}]. +create_filter(Opts) when is_list(Opts) -> + case get_opt(Opts, module, ?DEFAULT_FILTER_MODULE) of + ?DEFAULT_FILTER_MODULE = Mod -> + Mod; + Module -> + snmpm_network_interface_filter:verify(Module), + Module + end; +create_filter(BadOpts) -> + throw({error, {bad_filter_opts, BadOpts}}). + + %% Open log do_init_log(false) -> ?vtrace("do_init_log(false) -> entry", []), @@ -331,7 +366,7 @@ "~n MsgData: ~p" "~n Addr: ~p" "~n Port: ~p", [Pdu, Vsn, MsgData, Addr, Port]), - handle_send_pdu(Pdu, Vsn, MsgData, Addr, Port, State), + maybe_handle_send_pdu(Pdu, Vsn, MsgData, Addr, Port, State), {noreply, State}; handle_cast({inform_response, Ref, Addr, Port}, State) -> @@ -342,6 +377,11 @@ handle_inform_response(Ref, Addr, Port, State), {noreply, State}; +handle_cast(filter_reset, State) -> + ?vlog("received filter_reset message", []), + reset_counters(), + {noreply, State}; + handle_cast(Msg, State) -> warning_msg("received unknown message: ~n~p", [Msg]), {noreply, State}. @@ -355,7 +395,7 @@ %%-------------------------------------------------------------------- handle_info({udp, Sock, Ip, Port, Bytes}, #state{sock = Sock} = State) -> ?vlog("received ~w bytes from ~p:~p [~w]", [size(Bytes), Ip, Port, Sock]), - handle_recv_msg(Ip, Port, Bytes, State), + maybe_handle_recv_msg(Ip, Port, Bytes, State), {noreply, State}; handle_info(inform_response_gc, State) -> @@ -437,6 +477,17 @@ %%% Internal functions %%%------------------------------------------------------------------- +maybe_handle_recv_msg(Addr, Port, Bytes, #state{filter = FilterMod} = State) -> + case (catch FilterMod:accept_recv(Addr, Port)) of + false -> + %% Drop the received packet + inc(netIfMsgInDrops), + ok; + _ -> + handle_recv_msg(Addr, Port, Bytes, State) + end. + + handle_recv_msg(Addr, Port, Bytes, #state{server = Pid}) when is_binary(Bytes) andalso (size(Bytes) =:= 0) -> Pid ! {snmp_error, {empty_message, Addr, Port}, Addr, Port}, @@ -447,54 +498,24 @@ note_store = NoteStore, mpd_state = MpdState, sock = Sock, - log = Log, - irb = IRB}) -> + log = Log} = State) -> Logger = logger(Log, read, Addr, Port), case (catch snmpm_mpd:process_msg(Bytes, snmpUDPDomain, Addr, Port, MpdState, NoteStore, Logger)) of - %% BMK BMK BMK - %% Do we really need message size here?? - {ok, Vsn, #pdu{type = 'inform-request'} = Pdu, _MS, ACM} -> - handle_inform_request(IRB, Pid, Vsn, Pdu, ACM, - Sock, Addr, Port, Logger); - -%% {ok, _Vsn, #pdu{type = report} = Pdu, _MS, _ACM} -> -%% ?vtrace("received report", []), -%% Pid ! {snmp_report, Pdu, Addr, Port}; - - {ok, _Vsn, #pdu{type = report} = Pdu, _MS, ok} -> - ?vtrace("received report - ok", []), - Pid ! {snmp_report, {ok, Pdu}, Addr, Port}; - - {ok, _Vsn, #pdu{type = report} = Pdu, _MS, {error, ReqId, Reason}} -> - ?vtrace("received report - error", []), - Pid ! {snmp_report, {error, ReqId, Reason, Pdu}, Addr, Port}; - -%% {ok, _Vsn, #pdu{type = report} = Pdu, _MS, {error, ReqId, Reason}} -> -%% ?vtrace("received report - error", []), -%% Pid ! {snmp_error, ReqId, Pdu, Reason, Addr, Port}; - - {ok, _Vsn, #pdu{type = 'snmpv2-trap'} = Pdu, _MS, _ACM} -> - ?vtrace("received snmpv2-trap", []), - Pid ! {snmp_trap, Pdu, Addr, Port}; - - {ok, _Vsn, Trap, _MS, _ACM} when record(Trap, trappdu) -> - ?vtrace("received trappdu", []), - Pid ! {snmp_trap, Trap, Addr, Port}; - - {ok, _Vsn, Pdu, _MS, _ACM} when record(Pdu, pdu) -> - ?vtrace("received pdu", []), - Pid ! {snmp_pdu, Pdu, Addr, Port}; + + {ok, Vsn, Pdu, MS, ACM} -> + maybe_handle_recv_pdu(Addr, Port, Vsn, Pdu, MS, ACM, + Logger, State); {discarded, Reason, Report} -> - ?vtrace("discarded: ~p", [Reason]), + ?vdebug("discarded: ~p", [Reason]), ErrorInfo = {failed_processing_message, Reason}, Pid ! {snmp_error, ErrorInfo, Addr, Port}, - udp_send(Sock, Addr, Port, Report), + maybe_udp_send(State#state.filter, Sock, Addr, Port, Report), ok; {discarded, Reason} -> - ?vtrace("discarded: ~p", [Reason]), + ?vdebug("discarded: ~p", [Reason]), ErrorInfo = {failed_processing_message, Reason}, Pid ! {snmp_error, ErrorInfo, Addr, Port}, ok; @@ -506,23 +527,80 @@ end. -handle_inform_request(auto, Pid, Vsn, Pdu, ACM, Sock, Addr, Port, Logger) -> +maybe_handle_recv_pdu(Addr, Port, + Vsn, #pdu{type = Type} = Pdu, PduMS, ACM, + Logger, + #state{filter = FilterMod} = State) -> + case (catch FilterMod:accept_recv_pdu(Addr, Port, Type)) of + false -> + inc(netIfPduInDrops), + ok; + _ -> + handle_recv_pdu(Addr, Port, Vsn, Pdu, PduMS, ACM, Logger, State) + end; +maybe_handle_recv_pdu(Addr, Port, Vsn, Trap, PduMS, ACM, Logger, + #state{filter = FilterMod} = State) + when is_record(Trap, trappdu) -> + case (catch FilterMod:accept_recv_pdu(Addr, Port, trappdu)) of + false -> + inc(netIfPduInDrops), + ok; + _ -> + handle_recv_pdu(Addr, Port, Vsn, Trap, PduMS, ACM, Logger, State) + end; +maybe_handle_recv_pdu(Addr, Port, Vsn, Pdu, PduMS, ACM, Logger, State) -> + handle_recv_pdu(Addr, Port, Vsn, Pdu, PduMS, ACM, Logger, State). + + +handle_recv_pdu(Addr, Port, + Vsn, #pdu{type = 'inform-request'} = Pdu, _PduMS, ACM, + Logger, #state{server = Pid, irb = IRB} = State) -> + handle_inform_request(IRB, Pid, Vsn, Pdu, ACM, + Addr, Port, Logger, State); +handle_recv_pdu(Addr, Port, + _Vsn, #pdu{type = report} = Pdu, _PduMS, ok, + _Logger, + #state{server = Pid} = _State) -> + ?vtrace("received report - ok", []), + Pid ! {snmp_report, {ok, Pdu}, Addr, Port}; +handle_recv_pdu(Addr, Port, + _Vsn, #pdu{type = report} = Pdu, _PduMS, + {error, ReqId, Reason}, + _Logger, + #state{server = Pid} = _State) -> + ?vtrace("received report - error", []), + Pid ! {snmp_report, {error, ReqId, Reason, Pdu}, Addr, Port}; +handle_recv_pdu(Addr, Port, + _Vsn, #pdu{type = 'snmpv2-trap'} = Pdu, _PduMS, _ACM, + _Logger, + #state{server = Pid} = _State) -> + ?vtrace("received snmpv2-trap", []), + Pid ! {snmp_trap, Pdu, Addr, Port}; +handle_recv_pdu(Addr, Port, + _Vsn, Trap, _PduMS, _ACM, + _Logger, + #state{server = Pid} = _State) when is_record(Trap, trappdu) -> + ?vtrace("received trappdu", []), + Pid ! {snmp_trap, Trap, Addr, Port}; +handle_recv_pdu(Addr, Port, + _Vsn, Pdu, _PduMS, _ACM, + _Logger, + #state{server = Pid} = _State) when is_record(Pdu, pdu) -> + ?vtrace("received pdu", []), + Pid ! {snmp_pdu, Pdu, Addr, Port}; +handle_recv_pdu(_Addr, _Port, _Vsn, Pdu, _PduMS, ACM, _Logger, _State) -> + ?vlog("received unexpected pdu: " + "~n Pdu: ~p" + "~n ACM: ~p", [Pdu, ACM]). + + +handle_inform_request(auto, Pid, Vsn, Pdu, ACM, Addr, Port, Logger, State) -> ?vtrace("received inform-request (true)", []), Pid ! {snmp_inform, ignore, Pdu, Addr, Port}, RePdu = make_response_pdu(Pdu), - case snmpm_mpd:generate_response_msg(Vsn, RePdu, ACM, Logger) of - {ok, Msg} -> - udp_send(Sock, Addr, Port, Msg); - {discarded, Reason} -> - ?vlog("failed generating response message:" - "~n Reason: ~p", [Reason]), - ReqId = RePdu#pdu.request_id, - ErrorInfo = {failed_generating_response, {RePdu, Reason}}, - Pid ! {snmp_error, ReqId, ErrorInfo, Addr, Port}, - ok - end; + maybe_send_inform_response(RePdu, Vsn, ACM, Addr, Port, Logger, State); handle_inform_request({user, To}, Pid, Vsn, #pdu{request_id = ReqId} = Pdu, - ACM, _, Addr, Port, _) -> + ACM, Addr, Port, _Logger, _State) -> ?vtrace("received inform-request (false)", []), Pid ! {snmp_inform, ReqId, Pdu, Addr, Port}, @@ -544,16 +622,32 @@ ets:insert(snmpm_inform_request_table, Rec) end. -handle_inform_response(Ref, Addr, Port, - #state{server = Pid, sock = Sock, log = Log}) -> - Logger = logger(Log, read, Addr, Port), - Key = {Ref, Addr, Port}, +handle_inform_response(Ref, Addr, Port, State) -> + Key = {Ref, Addr, Port}, case ets:lookup(snmpm_inform_request_table, Key) of [{Key, _, {Vsn, ACM, RePdu}}] -> + Logger = logger(State#state.log, read, Addr, Port), ets:delete(snmpm_inform_request_table, Key), + maybe_send_inform_response(RePdu, Vsn, ACM, Addr, Port, + Logger, State); + [] -> + %% Already acknowledged, or the user was to slow to reply... + ok + end, + ok. + +maybe_send_inform_response(RePdu, Vsn, ACM, Addr, Port, Logger, + #state{server = Pid, + sock = Sock, + filter = FilterMod}) -> + case (catch FilterMod:accept_send_pdu(Addr, Port, pdu_type_of(RePdu))) of + false -> + inc(netIfPduOutDrops), + ok; + _ -> case snmpm_mpd:generate_response_msg(Vsn, RePdu, ACM, Logger) of {ok, Msg} -> - udp_send(Sock, Addr, Port, Msg); + maybe_udp_send(FilterMod, Sock, Addr, Port, Msg); {discarded, Reason} -> ?vlog("failed generating response message:" "~n Reason: ~p", [Reason]), @@ -561,14 +655,9 @@ ErrorInfo = {failed_generating_response, {RePdu, Reason}}, Pid ! {snmp_error, ReqId, ErrorInfo, Addr, Port}, ok - end; - [] -> - %% Already acknowledged, or the user was to slow to reply... - ok - end, - ok. - - + end + end. + handle_inform_response_gc(#state{irb = IRB} = State) -> ets:safe_fixtable(snmpm_inform_request_table, true), do_irgc(ets:first(snmpm_inform_request_table), t()), @@ -599,17 +688,28 @@ (catch erlang:cancel_timer(Ref)). +maybe_handle_send_pdu(Pdu, Vsn, MsgData, Addr, Port, + #state{filter = FilterMod} = State) -> + case (catch FilterMod:accept_send_pdu(Addr, Port, pdu_type_of(Pdu))) of + false -> + inc(netIfPduOutDrops), + ok; + _ -> + handle_send_pdu(Pdu, Vsn, MsgData, Addr, Port, State) + end. + handle_send_pdu(Pdu, Vsn, MsgData, Addr, Port, #state{server = Pid, note_store = NoteStore, sock = Sock, - log = Log}) -> + log = Log, + filter = FilterMod}) -> Logger = logger(Log, write, Addr, Port), case (catch snmpm_mpd:generate_msg(Vsn, NoteStore, Pdu, MsgData, Logger)) of {ok, Msg} -> ?vtrace("handle_send_pdu -> message generated", []), - udp_send(Sock, Addr, Port, Msg); + maybe_udp_send(FilterMod, Sock, Addr, Port, Msg); {discarded, Reason} -> ?vlog("PDU not sent: " "~n PDU: ~p" @@ -619,6 +719,16 @@ end. +maybe_udp_send(FilterMod, Sock, Addr, Port, Msg) -> + case (catch FilterMod:accept_send(Addr, Port)) of + false -> + inc(netIfMsgOutDrops), + ok; + _ -> + udp_send(Sock, Addr, Port, Msg) + end. + + udp_send(Sock, Addr, Port, Msg) -> case (catch gen_udp:send(Sock, Addr, Port, Msg)) of ok -> @@ -633,9 +743,9 @@ "~n ~p",[Addr, Port, Error]) end. -sz(B) when binary(B) -> +sz(B) when is_binary(B) -> size(B); -sz(L) when list(L) -> +sz(L) when is_list(L) -> length(L); sz(_) -> undefined. @@ -834,6 +944,14 @@ varbinds = Vbs}. +%% ---------------------------------------------------------------- + +pdu_type_of(#pdu{type = Type}) -> + Type; +pdu_type_of(TrapPdu) when is_record(TrapPdu, trappdu) -> + trap. + + %% ------------------------------------------------------------------- t() -> @@ -954,6 +1072,46 @@ BufSz. +%%----------------------------------------------------------------- +%% Counter functions +%%----------------------------------------------------------------- +init_counters() -> + F = fun(Counter) -> maybe_create_counter(Counter) end, + lists:map(F, counters()). + +reset_counters() -> + F = fun(Counter) -> snmpm_config:reset_stats_counter(Counter) end, + lists:map(F, counters()). + +maybe_create_counter(Counter) -> + snmpm_config:maybe_cre_stats_counter(Counter, 0). + +counters() -> + [ + netIfMsgOutDrops, + netIfMsgInDrops, + netIfPduOutDrops, + netIfPduInDrops + ]. + +inc(Name) -> inc(Name, 1). +inc(Name, N) -> snmpm_config:incr_stats_counter(Name, N). + +%% get_counters() -> +%% Counters = counters(), +%% get_counters(Counters, []). + +%% get_counters([], Acc) -> +%% lists:reverse(Acc); +%% get_counters([Counter|Counters], Acc) -> +%% case snmpm_config:get_stats_counter(Counter) of +%% {ok, CounterVal} -> +%% get_counters(Counters, [{Counter, CounterVal}|Acc]); +%% _ -> +%% get_counters(Counters, Acc) +%% end. + + %% ---------------------------------------------------------------- call(Pid, Req) -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_net_if_filter.erl erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_net_if_filter.erl --- erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_net_if_filter.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_net_if_filter.erl 2009-11-20 08:48:39.000000000 +0000 @@ -0,0 +1,53 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(snmpm_net_if_filter). + +-export([accept_recv/2, + accept_send/2, + accept_recv_pdu/3, + accept_send_pdu/3]). + +-include("snmp_debug.hrl"). + +accept_recv(_Addr, _Port) -> + ?d("accept_recv -> entry with" + "~n Addr: ~p" + "~n Port: ~p", [_Addr, _Port]), + true. + +accept_send(_Addr, _Port) -> + ?d("accept_send -> entry with" + "~n Addr: ~p" + "~n Port: ~p", [_Addr, _Port]), + true. + +accept_recv_pdu(_Addr, _Port, _PduType) -> + ?d("accept_recv_pdu -> entry with" + "~n Addr: ~p" + "~n Port: ~p" + "~n PduType: ~p", [_Addr, _Port, _PduType]), + true. + +accept_send_pdu(_Addr, _Port, _PduType) -> + ?d("accept_send_pdu -> entry with" + "~n Addr: ~p" + "~n Port: ~p" + "~n PduType: ~p", [_Addr, _Port, _PduType]), + true. + diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_network_interface_filter.erl erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_network_interface_filter.erl --- erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_network_interface_filter.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_network_interface_filter.erl 2009-11-20 08:48:39.000000000 +0000 @@ -0,0 +1,54 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(snmpm_network_interface_filter). + +-export([behaviour_info/1]). +-export([verify/1]). + + +behaviour_info(callbacks) -> + [{accept_recv, 2}, + {accept_send, 2}, + {accept_recv_pdu, 3}, + {accept_send_pdu, 3}]; +behaviour_info(_) -> + undefined. + + +%% accept_recv(address(), port()) -> boolean() +%% Called at the receiption of a message +%% (before *any* processing has been done). +%% +%% accept_send(address(), port()) -> boolean() +%% Called before the sending of a message +%% (after *all* processing has been done). +%% +%% accept_recv_pdu(Addr, Port, pdu_type()) -> boolean() +%% Called after the basic message processing (MPD) has been done, +%% but before the pdu is handed over to the master-agent for +%% primary processing. +%% +%% accept_send_pdu(Addr, Port, pdu_type()) -> boolean() +%% Called before the basic message processing (MPD) is done, +%% when a pdu has been received from the master-agent. +%% + + +verify(Module) -> + snmp_misc:verify_behaviour(?MODULE, Module). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_server.erl erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_server.erl --- erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_server.erl 2009-06-05 13:55:53.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_server.erl 2009-11-20 13:37:28.000000000 +0000 @@ -480,6 +480,7 @@ {Pid, Ref}; {error, Reason} -> ?vlog("failed starting note-store - Reason: " + "~n Reason: ~p" "~n", [Reason]), throw({error, {failed_starting_note_store, Reason}}) end. @@ -494,6 +495,7 @@ {Pid, NetIfModule, Ref}; {error, Reason} -> ?vlog("failed starting net-if - Reason: " + "~n Reason: ~p" "~n", [Reason]), throw({error, {failed_starting_net_if, Reason}}) end. @@ -1645,7 +1647,9 @@ "no agent info found", []), case snmpm_config:user_info() of {ok, DefUserId, DefMod, DefData} -> - handle_agent(DefUserId, DefMod, Addr, Port, + handle_agent(DefUserId, DefMod, + Addr, Port, + pdu, ignore, SnmpInfo, DefData, State); Error -> error_msg("failed retreiving the default user " @@ -1662,6 +1666,7 @@ "~p", [Addr, Port, CrapPdu]), ok. + handle_pdu(_UserId, Mod, target_name = _RegType, TargetName, _Addr, _Port, ReqId, SnmpResponse, Data, _State) -> ?vtrace("handle_pdu(target_name) -> entry when" @@ -1682,60 +1687,145 @@ ok. -handle_agent(UserId, Mod, Addr, Port, SnmpInfo, Data, State) -> +handle_agent(UserId, Mod, Addr, Port, Type, Ref, SnmpInfo, Data, State) -> ?vtrace("handle_agent -> entry when" "~n UserId: ~p" - "~n Mod: ~p", [UserId, Mod]), + "~n Type: ~p" + "~n Mod: ~p", [UserId, Type, Mod]), F = fun() -> - do_handle_agent(UserId, Mod, Addr, Port, SnmpInfo, Data, State) + do_handle_agent(UserId, Mod, Addr, Port, + Type, Ref, SnmpInfo, Data, State) end, handle_callback(F), ok. -do_handle_agent(UserId, Mod, Addr, Port, SnmpInfo, Data, _State) -> +do_handle_agent(DefUserId, DefMod, + Addr, Port, + Type, Ref, + SnmpInfo, DefData, State) -> ?vdebug("do_handle_agent -> entry when" - "~n UserId: ~p", [UserId]), - case (catch Mod:handle_agent(Addr, Port, SnmpInfo, Data)) of - {register, UserId2, Config} -> - ?vtrace("do_handle_agent -> register: " - "~n UserId2: ~p" - "~n Config: ~p", [UserId2, Config]), - TargetName = mk_target_name(Addr, Port, Config), - Config2 = [{reg_type, target_name}, - {address, Addr}, {port, Port} | Config], - case snmpm_config:register_agent(UserId2, - TargetName, Config2) of - ok -> - ok; - {error, Reason} -> - error_msg("failed registering agent " - "handling agent " - "~p <~p,~p>: ~n~w", - [TargetName, Addr, Port, Reason]), + "~n DefUserId: ~p", [DefUserId]), + case (catch DefMod:handle_agent(Addr, Port, Type, SnmpInfo, DefData)) of + {'EXIT', {undef, _}} when Type =:= pdu -> + %% Maybe, still on the old API + ?vdebug("do_handle_agent -> maybe still on the old api", []), + case (catch DefMod:handle_agent(Addr, Port, SnmpInfo, DefData)) of + {register, UserId2, Config} -> + ?vtrace("do_handle_agent -> register: " + "~n UserId2: ~p" + "~n Config: ~p", [UserId2, Config]), + TargetName = mk_target_name(Addr, Port, Config), + Config2 = [{reg_type, addr_port}, + {address, Addr}, + {port, Port} | Config], + case snmpm_config:register_agent(UserId2, + TargetName, Config2) of + ok -> + ok; + {error, Reason} -> + error_msg("failed registering agent - " + "handling agent " + "~p <~p,~p>: ~n~w", + [TargetName, Addr, Port, Reason]), + ok + end; + {register, UserId2, TargetName, Config} -> + ?vtrace("do_handle_agent -> register: " + "~n UserId2: ~p" + "~n TargetName: ~p" + "~n Config: ~p", + [UserId2, TargetName, Config]), + Config2 = ensure_present([{address, Addr}, {port, Port}], + Config), + Config3 = [{reg_type, target_name} | Config2], + case snmpm_config:register_agent(UserId2, + TargetName, Config3) of + ok -> + ok; + {error, Reason} -> + error_msg("failed registering agent - " + "handling agent " + "~p <~p,~p>: ~n~w", + [TargetName, Addr, Port, Reason]), + ok + end; + _Ignore -> + ?vdebug("do_handle_agent -> ignore", []), ok end; + + {'EXIT', {undef, _}} -> + %% If the user does not implement the new API (but the + %% old), then this clause catches all non-pdu handle_agent + %% calls. These calls was previously never made,so we make + %% a best-effert call (using reg-type target_name) to the + %% various callback functions, and leave it to the user to + %% figure out + + %% Backward compatibillity crap + RegType = target_name, + Target = mk_target_name(Addr, Port, default_agent_config()), + case Type of + report -> + SnmpInform = SnmpInfo, + handle_report(DefUserId, DefMod, + RegType, Target, Addr, Port, + SnmpInform, DefData, State); + + inform -> + SnmpInform = SnmpInfo, + handle_inform(DefUserId, DefMod, Ref, + RegType, Target, Addr, Port, + SnmpInform, DefData, State); + + trap -> + SnmpTrapInfo = SnmpInfo, + handle_trap(DefUserId, DefMod, + RegType, Target, Addr, Port, + SnmpTrapInfo, DefData, State); + + _ -> + error_msg("failed delivering ~w info to default user - " + "regarding agent " + "<~p,~p>: ~n~w", [Type, Addr, Port, SnmpInfo]) + end; + {register, UserId2, TargetName, Config} -> ?vtrace("do_handle_agent -> register: " "~n UserId2: ~p" "~n TargetName: ~p" - "~n Config: ~p", [UserId2, TargetName, Config]), - Config2 = [{reg_type, target_name} | Config], + "~n Config: ~p", + [UserId2, TargetName, Config]), + Config2 = ensure_present([{address, Addr}, {port, Port}], Config), + Config3 = [{reg_type, target_name} | Config2], case snmpm_config:register_agent(UserId2, - TargetName, Config2) of + TargetName, Config3) of ok -> ok; {error, Reason} -> - error_msg("failed registering agent " + error_msg("failed registering agent - " "handling agent " "~p <~p,~p>: ~n~w", [TargetName, Addr, Port, Reason]), ok end; + _Ignore -> - ?vtrace("do_handle_agent -> ignore", []), + ?vdebug("do_handle_agent -> ignore", []), ok + end. +ensure_present([], Config) -> + Config; +ensure_present([{Key, _Val} = Elem|Ensure], Config) -> + case lists:keymember(Key, 1, Config) of + false -> + ensure_present(Ensure, [Elem|Config]); + true -> + ensure_present(Ensure, Config) + end. + %% Retrieve user info for this agent. %% If this is an unknown agent, then use the default user @@ -1777,47 +1867,62 @@ do_handle_snmp_trap(SnmpTrapInfo, Addr, Port, State) -> case snmpm_config:get_agent_user_info(Addr, Port) of {ok, UserId, Target, RegType} -> - ?vtrace("handle_snmp_trap -> found user: ~p",[UserId]), + ?vtrace("handle_snmp_trap -> found user: ~p", [UserId]), case snmpm_config:user_info(UserId) of {ok, Mod, Data} -> handle_trap(UserId, Mod, RegType, Target, Addr, Port, SnmpTrapInfo, Data, State); - - Error -> - %% Oh crap, use the default user - ?vlog("[trap] failed retreiving user info for user ~p: " - "~n ~p", [UserId, Error]), - case snmpm_config:user_info() of - {ok, DefUserId, DefMod, DefData} -> - handle_trap(DefUserId, DefMod, - RegType, Target, Addr, Port, - SnmpTrapInfo, DefData, State); - Error -> - error_msg("failed retreiving the default user " - "info handling report from " - "~p <~p,~p>: ~n~w~n~w", - [Target, Addr, Port, - Error, SnmpTrapInfo]) + + Error1 -> + %% User no longer exists, unregister agent + ?vlog("[trap] failed retreiving user info for " + "user ~p: " + "~n ~p", [UserId, Error1]), + case snmpm_config:unregister_agent(UserId, Target) of + ok -> + %% Try use the default user + case snmpm_config:user_info() of + {ok, DefUserId, DefMod, DefData} -> + handle_agent(DefUserId, DefMod, + Addr, Port, + trap, ignore, + SnmpTrapInfo, DefData, State); + Error2 -> + error_msg("failed retreiving the default " + "user info handling report from " + "~p <~p,~p>: ~n~w~n~w", + [Target, Addr, Port, + Error2, SnmpTrapInfo]) + end; + Error3 -> + %% Failed unregister agent, + %% now its getting messy... + warning_msg("failed unregister agent ~p <~p,~p> " + "belonging to non-existing " + "user ~p, handling trap: " + "~n Error: ~w" + "~n Trap info: ~w", + [Target, Addr, Port, UserId, + Error3, SnmpTrapInfo]) end end; - Error -> + + Error4 -> %% Unknown agent, pass it on to the default user ?vlog("[trap] failed retreiving user id for agent <~p,~p>: " - "~n ~p", [Addr, Port, Error]), + "~n ~p", [Addr, Port, Error4]), case snmpm_config:user_info() of {ok, DefUserId, DefMod, DefData} -> - RegType = target_name, - Target = - mk_target_name(Addr, Port, default_agent_config()), - handle_trap(DefUserId, DefMod, - RegType, Target, Addr, Port, - SnmpTrapInfo, DefData, State); - Error2 -> + handle_agent(DefUserId, DefMod, + Addr, Port, + trap, ignore, + SnmpTrapInfo, DefData, State); + Error5 -> error_msg("failed retreiving " "the default user info handling trap from " "<~p,~p>: ~n~w~n~w", - [Addr, Port, Error2, SnmpTrapInfo]) + [Addr, Port, Error5, SnmpTrapInfo]) end end, ok. @@ -1926,40 +2031,55 @@ handle_inform(UserId, Mod, Ref, RegType, Target, Addr, Port, SnmpInform, Data, State); - Error -> - %% Oh crap, use the default user - ?vlog("[inform] failed retreiving user " - "info for user ~p:" - "~n ~p", [UserId, Error]), - case snmpm_config:user_info() of - {ok, DefUserId, DefMod, DefData} -> - handle_inform(DefUserId, DefMod, Ref, - RegType, Target, Addr, Port, - SnmpInform, DefData, State); - Error -> - error_msg("failed retreiving the default user " - "info handling inform from " - "~p <~p,~p>: ~n~w~n~w", - [Target, Addr, Port, Error, Pdu]) + Error1 -> + %% User no longer exists, unregister agent + case snmpm_config:unregister_agent(UserId, Target) of + ok -> + %% Try use the default user + ?vlog("[inform] failed retreiving user " + "info for user ~p:" + "~n ~p", [UserId, Error1]), + case snmpm_config:user_info() of + {ok, DefUserId, DefMod, DefData} -> + handle_agent(DefUserId, DefMod, + Addr, Port, + inform, Ref, + SnmpInform, DefData, State); + Error2 -> + error_msg("failed retreiving the default " + "user info handling inform from " + "~p <~p,~p>: ~n~w~n~w", + [Target, Addr, Port, + Error2, Pdu]) + end; + Error3 -> + %% Failed unregister agent, + %% now its getting messy... + warning_msg("failed unregister agent ~p <~p,~p> " + "~n belonging to non-existing " + "user ~p, handling inform: " + "~n Error: ~w" + "~n Pdu: ~w", + [Target, Addr, Port, UserId, + Error3, Pdu]) end end; - Error -> + + Error4 -> %% Unknown agent, pass it on to the default user ?vlog("[inform] failed retreiving user id for agent <~p,~p>: " - "~n ~p", [Addr, Port, Error]), + "~n ~p", [Addr, Port, Error4]), case snmpm_config:user_info() of {ok, DefUserId, DefMod, DefData} -> - RegType = target_name, - Target = - mk_target_name(Addr, Port, default_agent_config()), - handle_inform(DefUserId, DefMod, Ref, - RegType, Target, Addr, Port, - SnmpInform, DefData, State); - Error2 -> + handle_agent(DefUserId, DefMod, + Addr, Port, + inform, Ref, + SnmpInform, DefData, State); + Error5 -> error_msg("failed retreiving " "the default user info handling inform from " "<~p,~p>: ~n~w~n~w", - [Addr, Port, Error2, Pdu]) + [Addr, Port, Error5, Pdu]) end end, ok; @@ -2075,7 +2195,7 @@ "~n Port: ~p" "~n Pdu: ~p", [Addr, Port, Pdu]), - Varbinds2 = fix_vbs_BITS(Varbinds), + Varbinds2 = fix_vbs_BITS(Varbinds), SnmpReport = {EStatus, EIndex, Varbinds2}, case snmpm_config:get_agent_user_info(Addr, Port) of {ok, UserId, Target, RegType} -> @@ -2084,43 +2204,61 @@ ?vdebug("[report] callback handle_report with: " "~n ~p" "~n ~p" - "~n ~p", [UserId, Mod, SnmpReport]), + "~n ~p" + "~n ~p", [UserId, Mod, Target, SnmpReport]), handle_report(UserId, Mod, RegType, Target, Addr, Port, SnmpReport, Data, State); - Error -> - %% Oh crap, use the default user - ?vlog("[report] failed retreiving user info for user ~p:" - " ~n ~p", [UserId, Error]), - case snmpm_config:user_info() of - {ok, DefUserId, DefMod, DefData} -> - handle_report(DefUserId, DefMod, - RegType, Target, Addr, Port, - SnmpReport, DefData, State); - Error -> - error_msg("failed retreiving the default user " - "info handling report from " - "~p <~p,~p>: ~n~w~n~w", - [Target, Addr, Port, Error, Pdu]) + Error1 -> + %% User no longer exists, unregister agent + ?vlog("[report] failed retreiving user info " + "for user ~p:" + " ~n ~p", [UserId, Error1]), + case snmpm_config:unregister_agent(UserId, Target) of + ok -> + %% Try use the default user + case snmpm_config:user_info() of + {ok, DefUserId, DefMod, DefData} -> + handle_agent(DefUserId, DefMod, + Addr, Port, + report, ignore, + SnmpReport, DefData, State); + + Error2 -> + error_msg("failed retreiving the default " + "user info handling report from " + "~p <~p,~p>: ~n~w~n~w", + [Target, Addr, Port, + Error2, Pdu]) + end; + Error3 -> + %% Failed unregister agent, + %% now its getting messy... + warning_msg("failed unregister agent ~p <~p,~p> " + "belonging to non-existing " + "user ~p, handling report: " + "~n Error: ~w" + "~n Report: ~w", + [Target, Addr, Port, UserId, + Error3, Pdu]) end - end; - Error -> - %% Unknown agent, pass it on to the default user - ?vlog("[report] failed retreiving user id for agent <~p,~p>: " - "~n ~p", [Addr, Port, Error]), + end; + + Error4 -> + %% Unknown agent, pass it on to the default user + ?vlog("[report] failed retreiving user id for agent <~p,~p>: " + "~n ~p", [Addr, Port, Error4]), case snmpm_config:user_info() of {ok, DefUserId, DefMod, DefData} -> - RegType = target_name, - Target = - mk_target_name(Addr, Port, default_agent_config()), - handle_report(DefUserId, DefMod, - RegType, Target, Addr, Port, - SnmpReport, DefData, State); - Error2 -> + handle_agent(DefUserId, DefMod, + Addr, Port, + report, ignore, + SnmpReport, DefData, State); + Error5 -> error_msg("failed retreiving " "the default user info handling report from " "<~p,~p>: ~n~w~n~w", - [Addr, Port, Error2, Pdu]) + [Addr, Port, Error5, Pdu]) end end, ok; @@ -2268,7 +2406,7 @@ target_name -> fun() -> Mod:handle_report(Target, SnmpReport, Data) end; addr_port -> - fun() -> Mod:handle_inform(Addr, Port, SnmpReport, Data) end + fun() -> Mod:handle_report(Addr, Port, SnmpReport, Data) end end, case (catch HandleReport()) of diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_server_sup.erl erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_server_sup.erl --- erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_server_sup.erl 2009-03-12 12:32:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_server_sup.erl 2009-09-18 15:13:28.000000000 +0100 @@ -46,7 +46,7 @@ stop() -> ?d("stop -> entry", []), case whereis(?SERVER) of - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> ?d("stop -> Pid: ~p", [Pid]), exit(Pid, shutdown), ?d("stop -> stopped", []), diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_supervisor.erl erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_supervisor.erl --- erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_supervisor.erl 2009-03-12 12:31:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_supervisor.erl 2009-09-18 15:13:13.000000000 +0100 @@ -46,7 +46,7 @@ stop() -> ?d("stop -> entry", []), case whereis(?SERVER) of - Pid when pid(Pid) -> + Pid when is_pid(Pid) -> ?d("stop -> Pid: ~p", [Pid]), exit(Pid, shutdown), ?d("stop -> stopped", []), diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_user_default.erl erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_user_default.erl --- erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_user_default.erl 2009-04-16 10:26:17.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_user_default.erl 2009-11-20 13:37:29.000000000 +0000 @@ -20,10 +20,9 @@ -module(snmpm_user_default). -behaviour(snmpm_user). -%% -behaviour(snmpm_user_old). -export([handle_error/3, - handle_agent/4, + handle_agent/5, handle_pdu/4, handle_trap/3, handle_inform/3, @@ -37,12 +36,13 @@ ignore. -handle_agent(Addr, Port, SnmpInfo, UserData) -> +handle_agent(Addr, Port, Type, SnmpInfo, UserData) -> info("received handle_agent:" "~n Addr: ~p" "~n Port: ~p" + "~n Type: ~p" "~n SnmpInfo: ~p" - "~n UserData: ~p", [Addr, Port, SnmpInfo, UserData]), + "~n UserData: ~p", [Addr, Port, Type, SnmpInfo, UserData]), ignore. @@ -71,7 +71,7 @@ "~n SnmpInform: ~p" "~n UserData: ~p", [TargetName, SnmpInform, UserData]), - ok. + no_reply. handle_report(TargetName, SnmpReport, UserData) -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_user.erl erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_user.erl --- erlang-13.b.1-dfsg/lib/snmp/src/manager/snmpm_user.erl 2009-03-12 12:31:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/manager/snmpm_user.erl 2009-11-20 13:37:29.000000000 +0000 @@ -23,7 +23,7 @@ behaviour_info(callbacks) -> [{handle_error, 3}, - {handle_agent, 4}, + {handle_agent, 5}, {handle_pdu, 4}, {handle_trap, 3}, {handle_inform, 3}, @@ -35,18 +35,19 @@ %% handle_error(ReqId, Reason, UserData) -> Reply %% ReqId -> integer() %% Reason -> term() -%% UserData -> term() (supplied when the user regester) +%% UserData -> term() (supplied when the user register) %% Reply -> ignore -%% handle_agent(Addr, Port, SnmpInfo, UserData) -> Reply +%% handle_agent(Addr, Port, Type, SnmpInfo, UserData) -> Reply %% Addr -> term() %% Port -> integer() +%% Type -> pdu | trap | inform | report %% SnmpInfo -> {ErrorStatus, ErrorIndex, Varbinds} %% UserId -> term() %% ErrorStatus -> atom() %% ErrorIndex -> integer() %% Varbinds -> [varbind()] -%% UserData -> term() (supplied when the user regester) +%% UserData -> term() (supplied when the user register) %% Reply -> ignore | {register, UserId, agent_info()} %% agent_info() -> [{agent_info_item(), agent_info_value()}] %% This is the same info as in update_agent_info/4 @@ -58,7 +59,7 @@ %% ErrorStatus -> atom() %% ErrorIndex -> integer() %% Varbinds -> [varbind()] -%% UserData -> term() (supplied when the user regester) +%% UserData -> term() (supplied when the user register) %% Reply -> ignore %% handle_trap(TargetName, SnmpTrapInfo, UserData) -> Reply @@ -72,7 +73,7 @@ %% ErrorStatus -> atom() %% ErrorIndex -> integer() %% Varbinds -> [varbind()] -%% UserData -> term() (supplied when the user regester) +%% UserData -> term() (supplied when the user register) %% Reply -> ignore | unregister | {register, UserId, agent_info()} %% handle_inform(TargetName, SnmpInform, UserData) -> Reply @@ -81,7 +82,7 @@ %% ErrorStatus -> atom() %% ErrorIndex -> integer() %% Varbinds -> [varbind()] -%% UserData -> term() (supplied when the user regester) +%% UserData -> term() (supplied when the user register) %% Reply -> ignore | unregister | {register, UserId, agent_info()} %% @@ -91,6 +92,6 @@ %% ErrorStatus -> integer() %% ErrorIndex -> integer() %% Varbinds -> [varbind()] -%% UserData -> term() (supplied when the user regester) +%% UserData -> term() (supplied when the user register) %% Reply -> ignore | unregister | {register, UserId, agent_info()} diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_config.erl erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_config.erl --- erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_config.erl 2009-03-12 12:27:40.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_config.erl 2009-09-18 15:12:14.000000000 +0100 @@ -948,9 +948,9 @@ verify_max_message_size(MMS) -> case (catch list_to_integer(MMS)) of - I when integer(I), I >= 484 -> + I when is_integer(I) andalso (I >= 484) -> {ok, I}; - I when integer(I) -> + I when is_integer(I) -> {error, "invalid max message size (must be atleast 484): " ++ MMS}; _ -> {error, "invalid max message size: " ++ MMS} @@ -959,7 +959,7 @@ verify_port_number(P) -> case (catch list_to_integer(P)) of - N when integer(N), N > 0 -> + N when is_integer(N) andalso (N > 0) -> {ok, N}; _ -> {error, "invalid port number: " ++ P} @@ -1078,7 +1078,7 @@ {ok, infinity}; verify_dets_auto_save(I0) -> case (catch list_to_integer(I0)) of - I when integer(I), I > 0 -> + I when is_integer(I) andalso (I > 0) -> {ok, I}; _ -> {error, "invalid auto save timeout time: " ++ I0} @@ -1088,7 +1088,7 @@ %% I know that this is a little of the edge, but... verify_module(M0) -> case (catch list_to_atom(M0)) of - M when atom(M) -> + M when is_atom(M) -> {ok, M}; _ -> {error, "invalid module: " ++ M0} @@ -1113,7 +1113,7 @@ verify_timeout(T0) -> case (catch list_to_integer(T0)) of - T when integer(T), T > 0 -> + T when is_integer(T) andalso (T > 0) -> {ok, T}; _ -> {error, "invalid timeout time: '" ++ T0 ++ "'"} @@ -1140,7 +1140,7 @@ end; verify_retransmission_timeout(T0) -> case (catch list_to_integer(T0)) of - T when integer(T), T > 0 -> + T when is_integer(T) andalso (T > 0) -> {ok, T}; _ -> {error, "invalid timeout time: '" ++ T0 ++ "'"} @@ -1148,9 +1148,9 @@ incr_timer_value(Str, Min) -> case (catch list_to_integer(Str)) of - I when integer(I), I >= Min -> + I when is_integer(I) andalso (I >= Min) -> I; - I when integer(I) -> + I when is_integer(I) -> E = lists:flatten(io_lib:format("invalid incremental timer value " "(min value is ~w): " ++ Str, [Min])), @@ -1183,7 +1183,7 @@ verify_pos_integer(I0) -> case (catch list_to_integer(I0)) of - I when integer(I), I > 0 -> + I when is_integer(I) andalso (I > 0) -> {ok, I}; _ -> {error, "invalid integer value: " ++ I0} @@ -1194,7 +1194,7 @@ {ok, infinity}; verify_netif_req_limit(I0) -> case (catch list_to_integer(I0)) of - I when integer(I), I > 0 -> + I when is_integer(I) andalso (I > 0) -> {ok, I}; _ -> {error, "invalid network interface request limit: " ++ I0} @@ -1210,7 +1210,7 @@ {ok, default}; verify_netif_recbuf_or_sndbuf(I0, Buf) -> case (catch list_to_integer(I0)) of - I when integer(I), I > 0 -> + I when is_integer(I) andalso (I > 0) -> {ok, I}; _ -> {error, "invalid network interface " ++ Buf ++ " size: " ++ I0} @@ -1230,7 +1230,7 @@ {ok, default}; verify_irb_user(TO) -> case (catch list_to_integer(TO)) of - I when integer(I), I > 0 -> + I when is_integer(I) andalso (I > 0) -> {ok, I*1000}; % Time is given in seconds _ -> {error, "invalid IRB GC time: " ++ TO} @@ -1238,14 +1238,14 @@ -verify_user_id(UserId) when list(UserId) -> +verify_user_id(UserId) when is_list(UserId) -> case (catch list_to_atom(UserId)) of - A when atom(A) -> + A when is_atom(A) -> {ok, A}; _ -> {error, "invalid user id: " ++ UserId} end; -verify_user_id(UserId) when atom(UserId) -> +verify_user_id(UserId) when is_atom(UserId) -> {ok, UserId}; verify_user_id(UserId) -> E = lists:flatten(io_lib:format("invalid user id: ~p", [UserId])), @@ -1345,7 +1345,7 @@ verify_usm_key(_What, "\"\"", _ExpectLength) -> {ok, ""}; -verify_usm_key(_What, Key, ExpectLength) when length(Key) == ExpectLength -> +verify_usm_key(_What, Key, ExpectLength) when length(Key) =:= ExpectLength -> {ok, Key}; verify_usm_key(What, [$[|RestKey] = Key0, ExpectLength) -> case lists:reverse(RestKey) of @@ -1361,7 +1361,7 @@ verify_usm_key2(What, Key0, ExpectLength) -> case string:tokens(Key0, [$,]) of - Key when length(Key) == ExpectLength -> + Key when length(Key) =:= ExpectLength -> convert_usm_key(Key, []); _ -> {error, "invalid " ++ What ++ " key length: " ++ Key0} @@ -1371,7 +1371,7 @@ {ok, lists:reverse(Acc)}; convert_usm_key([I|Is], Acc) -> case (catch list_to_integer(I)) of - Int when integer(Int) -> + Int when is_integer(Int) -> convert_usm_key(Is, [Int|Acc]); _Err -> {error, "invalid key number: " ++ I} @@ -1394,16 +1394,16 @@ print_q(Q, mandatory) -> io:format(Q ++ " ",[]); -print_q(Q, Default) when list(Default) -> +print_q(Q, Default) when is_list(Default) -> io:format(Q ++ " [~s] ",[Default]). %% Defval = string() | mandatory -ask(Q, Default, Verify) when list(Q), function(Verify) -> +ask(Q, Default, Verify) when is_list(Q) andalso is_function(Verify) -> print_q(Q, Default), PrelAnsw = io:get_line(''), Answer = case remove_newline(PrelAnsw) of - "" when Default /= mandatory -> Default; + "" when Default =/= mandatory -> Default; "" -> ask(Q, Default, Verify); A -> A end, @@ -1420,7 +1420,7 @@ case (catch inet:gethostname()) of {ok, Name} -> case (catch inet:getaddr(Name, inet)) of - {ok, Addr} when tuple(Addr) -> + {ok, Addr} when is_tuple(Addr) -> lists:flatten( io_lib:format("~w.~w.~w.~w", tuple_to_list(Addr))); _ -> @@ -1468,8 +1468,13 @@ %%---------------------------------------------------------------------- write_agent_snmp_files(Dir, Vsns, ManagerIP, TrapUdp, AgentIP, AgentUDP, SysName) - when list(Dir), list(Vsns), list(ManagerIP), integer(TrapUdp), - list(AgentIP), integer(AgentUDP), list(SysName) -> + when is_list(Dir) andalso + is_list(Vsns) andalso + is_list(ManagerIP) andalso + is_integer(TrapUdp) andalso + is_list(AgentIP) andalso + is_integer(AgentUDP) andalso + is_list(SysName) -> write_agent_snmp_files(Dir, Vsns, ManagerIP, TrapUdp, AgentIP, AgentUDP, SysName, "trap", none, "", "agentEngine", 484). @@ -2222,7 +2227,10 @@ write_config_file(Dir, FileName, Verify, Write) - when list(Dir), list(FileName), function(Verify), function(Write) -> + when (is_list(Dir) andalso + is_list(FileName) andalso + is_function(Verify) andalso + is_function(Write)) -> (catch do_write_config_file(Dir, FileName, Verify, Write)). do_write_config_file(Dir, FileName, Verify, Write) -> @@ -2238,7 +2246,10 @@ append_config_file(Dir, FileName, Verify, Write) - when list(Dir), list(FileName), function(Verify), function(Write) -> + when (is_list(Dir) andalso + is_list(FileName) andalso + is_function(Verify) andalso + is_function(Write)) -> (catch do_append_config_file(Dir, FileName, Verify, Write)). do_append_config_file(Dir, FileName, Verify, Write) -> @@ -2255,7 +2266,7 @@ read_config_file(Dir, FileName, Verify) - when list(Dir), list(FileName), function(Verify) -> + when is_list(Dir) andalso is_list(FileName) andalso is_function(Verify) -> (catch do_read_config_file(Dir, FileName, Verify)). do_read_config_file(Dir, FileName, Verify) -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_log.erl erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_log.erl --- erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_log.erl 2009-03-12 12:28:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_log.erl 2009-09-18 15:12:25.000000000 +0100 @@ -78,7 +78,7 @@ info(Log) -> case disk_log:info(Log) of - Info when list(Info) -> + Info when is_list(Info) -> Items = [no_current_bytes, no_current_items, current_file, no_overflows], info_filter(Items, Info, []); @@ -137,7 +137,7 @@ log_to_txt(Log, FileName, Dir, Mibs, TextFile, Start, null). log_to_txt(Log, FileName, Dir, Mibs, TextFile, Start, Stop) - when list(Mibs), list(TextFile) -> + when is_list(Mibs) andalso is_list(TextFile) -> ?vtrace("log_to_txt -> entry with" "~n Log: ~p" "~n FileName: ~p" @@ -163,7 +163,7 @@ log_to_io(Log, FileName, Dir, Mibs, Start, null). log_to_io(Log, FileName, Dir, Mibs, Start, Stop) - when list(Mibs) -> + when is_list(Mibs) -> File = filename:join(Dir, FileName), Converter = fun(L) -> do_log_to_io(L, Mibs, Start, Stop) @@ -203,9 +203,9 @@ end end. -convert_name(Name) when list(Name) -> +convert_name(Name) when is_list(Name) -> Name ++ "_tmp"; -convert_name(Name) when atom(Name) -> +convert_name(Name) when is_atom(Name) -> list_to_atom(atom_to_list(Name) ++ "_tmp"); convert_name(Name) -> lists:flatten(io_lib:format("~w_tmp", [Name])). @@ -287,7 +287,7 @@ case timestamp_filter(TimeStamp, Start, Stop) of true -> case (catch snmp_pdus:dec_scoped_pdu(ScopedPdu)) of - ScopedPDU when record(ScopedPDU, scopedPdu) -> + ScopedPDU when is_record(ScopedPDU, scopedPdu) -> Msg = #message{version = 'version-3', vsn_hdr = V3Hdr, data = ScopedPDU}, @@ -305,7 +305,7 @@ case timestamp_filter(TimeStamp, Start, Stop) of true -> case (catch snmp_pdus:dec_message(binary_to_list(Packet))) of - Msg when record(Msg, message) -> + Msg when is_record(Msg, message) -> f(ts2str(TimeStamp), Msg, Addr, Port, Mib); {'EXIT', Reason} -> format_tab("** error in log file ~p\n\n", [Reason]) @@ -442,7 +442,7 @@ get_type(#scopedPdu{data = Pdu}) -> get_type(Pdu); -get_type(Pdu) when record(Pdu, trappdu) -> +get_type(Pdu) when is_record(Pdu, trappdu) -> trappdu; get_type(#pdu{type = Type}) -> Type. @@ -572,7 +572,7 @@ log_info(Log) -> case disk_log:info(Log) of - Info when list(Info) -> + Info when is_list(Info) -> Info; _ -> [] diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_mini_mib.erl erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_mini_mib.erl --- erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_mini_mib.erl 2009-03-12 12:32:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_mini_mib.erl 2009-11-20 13:37:43.000000000 +0000 @@ -80,16 +80,23 @@ %% Returns: a list of {Oid, Aliasname, Type} %%---------------------------------------------------------------------- make_mini_mib_elem([]) -> []; -make_mini_mib_elem([#me{aliasname = N, oid = Oid, entrytype = variable, - asn1_type = #asn1_type{bertype = Type}} | T]) -> +make_mini_mib_elem([#me{aliasname = N, + oid = Oid, + entrytype = variable, + asn1_type = #asn1_type{bertype = Type}} | T]) -> [{Oid, N, Type} | make_mini_mib_elem(T)]; -make_mini_mib_elem([#me{aliasname = N, oid = Oid, entrytype = table_column, - asn1_type = ASN1}|T]) when record(ASN1, asn1_type)-> +make_mini_mib_elem([#me{aliasname = N, + oid = Oid, + entrytype = table_column, + asn1_type = ASN1}|T]) + when is_record(ASN1, asn1_type)-> [{Oid, N, ASN1#asn1_type.bertype} | make_mini_mib_elem(T)]; -make_mini_mib_elem([#me{aliasname = N, oid = Oid, - asn1_type = undefined}|T]) -> +make_mini_mib_elem([#me{aliasname = N, + oid = Oid, + asn1_type = undefined}|T]) -> [{Oid, N, undefined} | make_mini_mib_elem(T)]; -make_mini_mib_elem([#notification{trapname = N, oid = Oid}|T]) -> +make_mini_mib_elem([#notification{trapname = N, + oid = Oid}|T]) -> [{Oid, N, undefined} | make_mini_mib_elem(T)]; make_mini_mib_elem([_|T]) -> make_mini_mib_elem(T). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_misc.erl erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_misc.erl --- erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_misc.erl 2009-03-12 12:27:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_misc.erl 2009-11-20 08:48:24.000000000 +0000 @@ -51,7 +51,6 @@ is_tag_member/2, is_tmask_match/3, keyreplaceadd/4, - map/3, mem_size/1, mk_msg_flags/2, multi_map/2, @@ -269,8 +268,6 @@ foreach(Function, ExtraArgs, T); foreach(_Function, _ExtraArgs, []) -> true. -map(F, Eas, List) -> [ apply(F, [E|Eas]) || E <- List ]. - str_xor([H1|T1], [H2|T2]) -> [H1 bxor H2 | str_xor(T1, T2)]; str_xor([], []) -> @@ -283,10 +280,17 @@ %% Returns: A list of length M where element Y is the result of %% applying Func on [Elem(Y, List1), ..., Elem(Y, ListN)]. %%----------------------------------------------------------------- -multi_map(_Func, [[] | _ListOfLists]) -> []; +multi_map(_Func, [[] | _ListOfLists]) -> + []; multi_map(Func, ListOfLists) -> - [apply(Func, map({erlang, hd}, [], ListOfLists)) | - multi_map(Func, map({erlang, tl}, [], ListOfLists))]. + HD = [hd(L) || L <- ListOfLists], + TL = [tl(L) || L <- ListOfLists], +%% io:format("multi_map -> " +%% "~n HD: ~p" +%% "~n TL: ~p", [HD, TL]), + [ + apply(Func, HD) | multi_map(Func, TL) + ]. %% Primitive performance analysis. time(M,F,A) -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_note_store.erl erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_note_store.erl --- erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_note_store.erl 2009-03-12 12:27:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_note_store.erl 2009-09-18 15:12:09.000000000 +0100 @@ -371,7 +371,7 @@ gc(Flag, [{_Key, {infinity, _}} | T], Tab, Now) -> gc(Flag, T, Tab, Now); gc(Flag, [{Key, {BestBefore, _}} | T], Tab, Now) - when integer(BestBefore), BestBefore < Now -> + when is_integer(BestBefore) andalso (BestBefore < Now) -> ets:delete(Tab, Key), gc(Flag, T, Tab, Now); gc(_Flag, [_ | T], Tab, Now) -> gc(work_to_do, T, Tab, Now); @@ -387,7 +387,7 @@ [{process_memory, [{notes, ProcSize}, {timer, TMRSz}]}, {db_memory, [{notes, NotesSz}]}]. -proc_mem(P) when pid(P) -> +proc_mem(P) when is_pid(P) -> case (catch erlang:process_info(P, memory)) of {memory, Sz} -> Sz; @@ -399,7 +399,7 @@ tab_size(T) -> case (catch ets:info(T, memory)) of - Sz when integer(Sz) -> + Sz when is_integer(Sz) -> Sz; _ -> undefined diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_usm.erl erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_usm.erl --- erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_usm.erl 2009-03-12 12:31:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_usm.erl 2009-09-18 13:47:47.000000000 +0100 @@ -155,6 +155,11 @@ %% 6.3.2.5 MAC = binary_to_list(crypto:md5_mac_96(AuthKey, Packet2)), %% 6.3.2.6 +%% ?vtrace("md5_auth_in -> entry with" +%% "~n Packet2: ~w" +%% "~n AuthKey: ~w" +%% "~n AuthParams: ~w" +%% "~n MAC: ~w", [Packet2, AuthKey, AuthParams, MAC]), MAC == AuthParams; md5_auth_in(_AuthKey, _AuthParams, _Packet) -> %% 6.3.2.1 @@ -174,7 +179,7 @@ %% 7.3.1.5 set_msg_auth_params(Message, UsmSecParams, MAC). -sha_auth_in(AuthKey, AuthParams, Packet) when length(AuthParams) == 12 -> +sha_auth_in(AuthKey, AuthParams, Packet) when length(AuthParams) =:= 12 -> %% 7.3.2.3 Packet2 = patch_packet(binary_to_list(Packet)), %% 7.3.2.5 @@ -199,7 +204,8 @@ EncData = crypto:des_cbc_encrypt(DesKey, IV, [Data,Tail]), {ok, binary_to_list(EncData), Salt}. -des_decrypt(PrivKey, MsgPrivParams, EncData) when length(MsgPrivParams) == 8 -> +des_decrypt(PrivKey, MsgPrivParams, EncData) + when length(MsgPrivParams) =:= 8 -> [A,B,C,D,E,F,G,H | PreIV] = PrivKey, DesKey = [A,B,C,D,E,F,G,H], Salt = MsgPrivParams, @@ -315,7 +321,7 @@ {[Hd | DigList], Rest} end. -dec_len(D) when integer(D) -> +dec_len(D) when is_integer(D) -> D; dec_len([_LongOctet|T]) -> dl(T). diff -Nru erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_verbosity.erl erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_verbosity.erl --- erlang-13.b.1-dfsg/lib/snmp/src/misc/snmp_verbosity.erl 2009-03-12 12:29:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/src/misc/snmp_verbosity.erl 2009-09-18 15:12:36.000000000 +0100 @@ -82,7 +82,8 @@ process_args([], Acc) -> lists:reverse(Acc); -process_args([{vapply, {M,F,A}}|T], Acc) when atom(M), atom(F), list(A) -> +process_args([{vapply, {M,F,A}}|T], Acc) + when is_atom(M) andalso is_atom(F) andalso is_list(A) -> process_args(T, [(catch apply(M,F,A))|Acc]); process_args([H|T], Acc) -> process_args(T, [H|Acc]). diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/klas3.erl erlang-13.b.3-dfsg/lib/snmp/test/klas3.erl --- erlang-13.b.1-dfsg/lib/snmp/test/klas3.erl 2009-03-12 12:28:19.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/klas3.erl 2009-09-18 15:12:24.000000000 +0100 @@ -56,17 +56,17 @@ fname(get) -> Str2 = (catch begin case snmpa:current_request_id() of - {value, Int} when integer(Int) -> ok; + {value, Int} when is_integer(Int) -> ok; {value, _} -> throw("bad_int"); _ -> throw("bad_req") end, case snmpa:current_community() of - {value, Str} when list(Str) -> Str; + {value, Str} when is_list(Str) -> Str; {value, _} -> throw("bad_str"); _ -> throw("bad_com") end, case snmpa:current_address() of - {value, {[_A,_B,_C,_D], E}} when integer(E) -> ok; + {value, {[_A,_B,_C,_D], E}} when is_integer(E) -> ok; {value, _} -> throw("bad_ip"); _ -> throw("bad_adr") end, diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_agent_mibs_test.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_agent_mibs_test.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_agent_mibs_test.erl 2009-03-12 12:31:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_agent_mibs_test.erl 2009-09-18 15:13:11.000000000 +0100 @@ -32,6 +32,7 @@ -include_lib("snmp/include/SNMP-COMMUNITY-MIB.hrl"). -include_lib("snmp/include/SNMP-VIEW-BASED-ACM-MIB.hrl"). -include_lib("snmp/include/SNMP-USER-BASED-SM-MIB.hrl"). +-include("snmp_test_data/Test2.hrl"). %%---------------------------------------------------------------------- @@ -49,7 +50,8 @@ size_check_mnesia/1, load_unload/1, me_lookup/1, - which_mib/1 + which_mib/1, + cache_test/1 ]). @@ -71,30 +73,47 @@ %% External functions %%====================================================================== -init_per_testcase(size_check_dets, Config) when list(Config) -> +init_per_testcase(size_check_dets, Config) when is_list(Config) -> Dir = ?config(priv_dir, Config), DetsDir = join(Dir, "dets_dir/"), ?line ok = file:make_dir(DetsDir), [{dets_dir, DetsDir}|Config]; -init_per_testcase(size_check_mnesia, Config) when list(Config) -> +init_per_testcase(size_check_mnesia, Config) when is_list(Config) -> Dir = ?config(priv_dir, Config), MnesiaDir = join(Dir, "mnesia_dir/"), ?line ok = file:make_dir(MnesiaDir), mnesia_start([{dir, MnesiaDir}]), [{mnesia_dir, MnesiaDir}|Config]; -init_per_testcase(_Case, Config) when list(Config) -> +init_per_testcase(cache_test, Config) when is_list(Config) -> + Min = timer:minutes(5), + Timeout = + case lists:keysearch(tc_timeout, 1, Config) of + {value, {tc_timeout, TcTimeout}} when TcTimeout < Min -> + Min; + {value, {tc_timeout, TcTimeout}} -> + TcTimeout; + _ -> + Min + end, + Dog = test_server:timetrap(Timeout), + [{watchdog, Dog} | Config]; +init_per_testcase(_Case, Config) when is_list(Config) -> Config. -fin_per_testcase(size_check_dets, Config) when list(Config) -> +fin_per_testcase(size_check_dets, Config) when is_list(Config) -> Dir = ?config(dets_dir, Config), ?line ok = ?DEL_DIR(Dir), lists:keydelete(dets_dir, 1, Config); -fin_per_testcase(size_check_mnesia, Config) when list(Config) -> +fin_per_testcase(size_check_mnesia, Config) when is_list(Config) -> mnesia_stop(), Dir = ?config(mnesia_dir, Config), ?line ok = ?DEL_DIR(Dir), lists:keydelete(mnesia_dir, 1, Config); -fin_per_testcase(_Case, Config) when list(Config) -> +fin_per_testcase(cache_test, Config) when is_list(Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + Config; +fin_per_testcase(_Case, Config) when is_list(Config) -> Config. @@ -111,10 +130,11 @@ load_unload, size_check, me_lookup, - which_mib + which_mib, + cache_test ]. -init_all(Config) when list(Config) -> +init_all(Config) when is_list(Config) -> %% Data dir points wrong DataDir0 = ?config(data_dir, Config), DataDir1 = filename:split(filename:absname(DataDir0)), @@ -122,7 +142,7 @@ DataDir = filename:join(lists:reverse(DataDir2) ++ [?snmp_test_data]), [{snmp_data_dir, DataDir ++ "/"}|Config]. -finish_all(Config) when list(Config) -> +finish_all(Config) when is_list(Config) -> lists:keydelete(snmp_data_dir, 1, Config). @@ -131,7 +151,7 @@ %%====================================================================== start_and_stop(suite) -> []; -start_and_stop(Config) when list(Config) -> +start_and_stop(Config) when is_list(Config) -> Prio = normal, Verbosity = trace, @@ -149,7 +169,7 @@ %% --------------------------------------------------------------------- load_unload(suite) -> []; -load_unload(Config) when list(Config) -> +load_unload(Config) when is_list(Config) -> Prio = normal, Verbosity = log, %% MibStorage = ets, @@ -206,18 +226,18 @@ size_check_ets(suite) -> []; -size_check_ets(Config) when list(Config) -> +size_check_ets(Config) when is_list(Config) -> do_size_check([{mib_storage, ets}|Config]). size_check_dets(suite) -> []; -size_check_dets(Config) when list(Config) -> +size_check_dets(Config) when is_list(Config) -> Dir = ?config(dets_dir, Config), do_size_check([{mib_storage, {dets, Dir}}|Config]). size_check_mnesia(suite) -> []; -size_check_mnesia(Config) when list(Config) -> +size_check_mnesia(Config) when is_list(Config) -> do_size_check([{mib_storage, {mnesia, [node()]}}|Config]). do_size_check(Config) -> @@ -274,7 +294,7 @@ %% --------------------------------------------------------------------- me_lookup(suite) -> []; -me_lookup(Config) when list(Config) -> +me_lookup(Config) when is_list(Config) -> Prio = normal, Verbosity = trace, %% MibStorage = ets, @@ -328,7 +348,7 @@ %% --------------------------------------------------------------------- which_mib(suite) -> []; -which_mib(Config) when list(Config) -> +which_mib(Config) when is_list(Config) -> Prio = normal, Verbosity = trace, %% MibStorage = ets, @@ -382,6 +402,111 @@ ok. +%% --------------------------------------------------------------------- + +cache_test(suite) -> []; +cache_test(Config) when is_list(Config) -> + ?DBG("cache_test -> start", []), + Prio = normal, + Verbosity = trace, + MibStorage = ets, + MibDir = ?config(snmp_data_dir, Config), + StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/", + Mibs = ["Test2", "TestTrap", "TestTrapv2"], + StdMibs = ["OTP-SNMPEA-MIB", + "SNMP-COMMUNITY-MIB", + "SNMP-FRAMEWORK-MIB", + "SNMP-MPD-MIB", + "SNMP-NOTIFICATION-MIB", + "SNMP-TARGET-MIB", + %% "SNMP-USER-BASED-SM-MIB", + "SNMP-VIEW-BASED-ACM-MIB", + "SNMPv2-MIB", + "SNMPv2-TC", + "SNMPv2-TM"], + + ?DBG("cache_test -> start symbolic store", []), + ?line sym_start(Prio, MibStorage, Verbosity), + + ?DBG("cache_test -> start mib server", []), + GcLimit = 2, + Age = timer:seconds(10), + CacheOpts = [{autogc, false}, {age, Age}, {gclimit, GcLimit}], + ?line MibsPid = mibs_start(Prio, MibStorage, [], Verbosity, CacheOpts), + + ?DBG("cache_test -> load mibs", []), + ?line load_mibs(MibsPid, MibDir, Mibs), + ?DBG("cache_test -> load std mibs", []), + ?line load_mibs(MibsPid, StdMibDir, StdMibs), + + ?DBG("cache_test -> do a simple walk to populate the cache", []), + ?line ok = walk(MibsPid), + + {ok, Sz1} = snmpa_mib:which_cache_size(MibsPid), + ?DBG("cache_test -> Size1: ~p", [Sz1]), + + ?DBG("cache_test -> sleep 5 secs", []), + ?SLEEP(timer:seconds(5)), + + ?DBG("cache_test -> perform gc, expect nothing", []), + {ok, 0} = snmpa_mib:gc_cache(MibsPid), + + ?DBG("cache_test -> sleep 10 secs", []), + ?SLEEP(timer:seconds(10)), + + ?DBG("cache_test -> perform gc, expect GcLimit", []), + GcLimit1 = GcLimit + 1, + {ok, GcLimit1} = snmpa_mib:gc_cache(MibsPid, Age, GcLimit1), + + Sz2 = Sz1 - GcLimit1, + {ok, Sz2} = snmpa_mib:which_cache_size(MibsPid), + ?DBG("cache_test -> Size2: ~p", [Sz2]), + + ?DBG("cache_test -> enable cache autogc", []), + ?line ok = snmpa_mib:enable_cache_autogc(MibsPid), + + ?DBG("cache_test -> wait 65 seconds to allow gc to happen", []), + ?SLEEP(timer:seconds(65)), + Sz3 = Sz2 - GcLimit, + {ok, Sz3} = snmpa_mib:which_cache_size(MibsPid), + ?DBG("cache_test -> Size3: ~p", [Sz3]), + + ?DBG("cache_test -> " + "wait 2 minutes to allow gc to happen, expect empty cache", []), + ?SLEEP(timer:minutes(2)), + {ok, 0} = snmpa_mib:which_cache_size(MibsPid), + + ?DBG("cache_test -> stop mib server", []), + ?line mibs_stop(MibsPid), + + ?DBG("cache_test -> stop symbolic store", []), + ?line sym_stop(), + ok. + +walk(MibsPid) -> + MibView = snmpa_acm:get_root_mib_view(), + do_walk(MibsPid, ?snmpTrapCommunity_instance, MibView), + do_walk(MibsPid, ?vacmViewSpinLock_instance, MibView), + do_walk(MibsPid, ?usmStatsNotInTimeWindows_instance, MibView), + do_walk(MibsPid, ?tDescr_instance, MibView). + + +do_walk(MibsPid, Oid, MibView) -> + io:format("do_walk -> entry with" + "~n Oid: ~p" + "~n", [Oid]), + case snmpa_mib:next(MibsPid, Oid, MibView) of + {table, _, _, #me{oid = Oid}} -> + ok; + {table, _, _, #me{oid = Next}} -> + do_walk(MibsPid, Next, MibView); + {variable, #me{oid = Oid}, _} -> + ok; + {variable, #me{oid = Next}, _} -> + do_walk(MibsPid, Next, MibView) + end. + + %%====================================================================== %% Internal functions %%====================================================================== @@ -431,14 +556,27 @@ %% -- MIB server mini interface -mibs_start(Prio, Verbosity) -> +mibs_start(Prio, Verbosity) when is_atom(Prio) andalso is_atom(Verbosity) -> mibs_start(Prio, ets, [], Verbosity). -mibs_start(Prio, MibStorage, Verbosity) -> +mibs_start(Prio, MibStorage, Verbosity) + when is_atom(Prio) andalso is_atom(Verbosity) -> mibs_start(Prio, MibStorage, [], Verbosity). -mibs_start(Prio, MibStorage, Mibs, Verbosity) -> - Opts = [{mib_storage, MibStorage}, {verbosity,Verbosity}], +mibs_start(Prio, MibStorage, Mibs, Verbosity) + when is_atom(Prio) andalso + is_list(Mibs) andalso + is_atom(Verbosity) -> + mibs_start(Prio, MibStorage, Mibs, Verbosity, []). + +mibs_start(Prio, MibStorage, Mibs, Verbosity, CacheOpts) + when is_atom(Prio) andalso + is_list(Mibs) andalso + is_atom(Verbosity) andalso + is_list(CacheOpts) -> + Opts = [{mib_storage, MibStorage}, + {verbosity, Verbosity}, + {cache, CacheOpts}], {ok, Pid} = snmpa_mib:start_link(Prio, Mibs, Opts), Pid. @@ -519,7 +657,7 @@ which_mib(Pid, Oid, Mib1) -> case snmpa_mib:which_mib(Pid, Oid) of - {ok, Mib2} when atom(Mib2) -> + {ok, Mib2} when is_atom(Mib2) -> Mib3 = atom_to_list(Mib2), which_mib(Mib1, Mib3); {ok, Mib2} -> @@ -564,14 +702,14 @@ key1search([], Res) -> Res; -key1search([Key|Keys], List) when atom(Key), list(List) -> +key1search([Key|Keys], List) when is_atom(Key) andalso is_list(List) -> case lists:keysearch(Key, 1, List) of {value, {Key, Val}} -> key1search(Keys, Val); false -> undefined end; -key1search(Key, List) when atom(Key) -> +key1search(Key, List) when is_atom(Key) -> case lists:keysearch(Key, 1, List) of {value, {Key, Val}} -> Val; diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_agent_nfilter_test.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_agent_nfilter_test.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_agent_nfilter_test.erl 2009-03-12 12:31:48.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_agent_nfilter_test.erl 2009-09-18 15:13:14.000000000 +0100 @@ -55,10 +55,10 @@ %% External functions %%====================================================================== -init_per_testcase(_Case, Config) when list(Config) -> +init_per_testcase(_Case, Config) when is_list(Config) -> Config. -fin_per_testcase(_Case, Config) when list(Config) -> +fin_per_testcase(_Case, Config) when is_list(Config) -> Config. %%====================================================================== diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_agent_test.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_agent_test.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_agent_test.erl 2009-03-12 12:31:11.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_agent_test.erl 2009-09-18 15:13:01.000000000 +0100 @@ -212,7 +212,7 @@ start_bilingual_agent(Config) -> snmp_agent_test_lib:start_bilingual_agent(Config). -start_multi_threaded_agent(Config) when list(Config) -> +start_multi_threaded_agent(Config) when is_list(Config) -> snmp_agent_test_lib:start_mt_agent(Config). stop_agent(Config) -> @@ -397,23 +397,23 @@ varm_mib_storage_mnesia_cases() -> [msm_varm_mib_start]. -init_mib_storage_ets(Config) when list(Config) -> +init_mib_storage_ets(Config) when is_list(Config) -> ?LOG("init_mib_storage_ets -> entry", []), MibStorage = {snmp_mib_storage,ets}, init_ms(Config, [MibStorage]). -init_mib_storage_dets(Config) when list(Config) -> +init_mib_storage_dets(Config) when is_list(Config) -> ?LOG("init_mib_storage_ets -> entry", []), ?line AgentDir = ?GCONF(agent_dir, Config), MibStorage = {snmp_mib_storage,{dets,AgentDir}}, init_ms(Config, [MibStorage]). -init_mib_storage_mnesia(Config) when list(Config) -> +init_mib_storage_mnesia(Config) when is_list(Config) -> ?LOG("init_mib_storage_ets -> entry", []), MibStorage = {snmp_mib_storage,{mnesia,[]}}, init_ms(Config, [MibStorage]). -init_ms(Config, Opts) when list(Config) -> +init_ms(Config, Opts) when is_list(Config) -> ?LOG("init_mib_storage_ets -> entry", []), ?line SaNode = ?GCONF(snmp_sa, Config), ?line create_tables(SaNode), @@ -427,20 +427,20 @@ Opts1 = [MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity|Opts], [{vsn, v1} | start_v1_agent(Config,Opts1)]. -init_size_check_mse(Config) when list(Config) -> +init_size_check_mse(Config) when is_list(Config) -> MibStorage = {snmp_mib_storage, ets}, init_size_check_ms(Config, [MibStorage]). -init_size_check_msd(Config) when list(Config) -> +init_size_check_msd(Config) when is_list(Config) -> AgentDir = ?GCONF(agent_dir, Config), MibStorage = {snmp_mib_storage, {dets, AgentDir}}, init_size_check_ms(Config, [MibStorage]). -init_size_check_msm(Config) when list(Config) -> +init_size_check_msm(Config) when is_list(Config) -> MibStorage = {snmp_mib_storage, {mnesia,[]}}, init_size_check_ms(Config, [MibStorage]). -init_size_check_ms(Config, Opts) when list(Config) -> +init_size_check_ms(Config, Opts) when is_list(Config) -> SaNode = ?GCONF(snmp_sa, Config), %% We are using v3 here, so crypto must be supported or else... case ?CRYPTO_START() of @@ -462,7 +462,7 @@ config([v3], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)), [{vsn, v3} | start_v3_agent(Config, Opts)]. -init_varm_mib_storage_dets(Config) when list(Config) -> +init_varm_mib_storage_dets(Config) when is_list(Config) -> ?LOG("init_varm_mib_storage_dets -> entry", []), ?line SaNode = ?GCONF(snmp_sa, Config), ?line create_tables(SaNode), @@ -477,7 +477,7 @@ Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity], [{vsn, v1}, {agent_opts,Opts} | Config]. -init_varm_mib_storage_mnesia(Config) when list(Config) -> +init_varm_mib_storage_mnesia(Config) when is_list(Config) -> ?LOG("init_varm_mib_storage_mnesia -> entry", []), ?line SaNode = ?GCONF(snmp_sa, Config), ?line create_tables(SaNode), @@ -492,7 +492,7 @@ Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity], [{vsn, v1}, {agent_opts,Opts} | Config]. -finish_mib_storage_ets(Config) when list(Config) -> +finish_mib_storage_ets(Config) when is_list(Config) -> ?LOG("finish_mib_storage_ets -> entry", []), delete_tables(), C1 = stop_agent(Config), @@ -500,7 +500,7 @@ C2 = lists:keydelete(vsn, 1, C1), lists:keydelete(agent_opts, 1, C2). -finish_mib_storage_dets(Config) when list(Config) -> +finish_mib_storage_dets(Config) when is_list(Config) -> ?LOG("finish_mib_storage_dets -> entry", []), delete_tables(), C1 = stop_agent(Config), @@ -508,7 +508,7 @@ C2 = lists:keydelete(vsn, 1, C1), lists:keydelete(agent_opts, 1, C2). -finish_mib_storage_mnesia(Config) when list(Config) -> +finish_mib_storage_mnesia(Config) when is_list(Config) -> ?LOG("finish_mib_storage_mnesia -> entry", []), delete_tables(), delete_mib_storage_mnesia_tables(), @@ -517,7 +517,7 @@ C2 = lists:keydelete(vsn, 1, C1), lists:keydelete(agent_opts, 1, C2). -finish_varm_mib_storage_dets(Config) when list(Config) -> +finish_varm_mib_storage_dets(Config) when is_list(Config) -> ?LOG("finish_varm_mib_storage_dets -> entry", []), delete_tables(), %% C1 = stop_agent(Config), % In case something went wrong... @@ -525,7 +525,7 @@ C2 = lists:keydelete(vsn, 1, Config), lists:keydelete(agent_opts, 1, C2). -finish_varm_mib_storage_mnesia(Config) when list(Config) -> +finish_varm_mib_storage_mnesia(Config) when is_list(Config) -> ?LOG("finish_varm_mib_storage_mnesia -> entry", []), delete_tables(), delete_mib_storage_mnesia_tables(), @@ -534,16 +534,16 @@ C2 = lists:keydelete(vsn, 1, Config), lists:keydelete(agent_opts, 1, C2). -finish_size_check_mse(Config) when list(Config) -> +finish_size_check_mse(Config) when is_list(Config) -> finish_size_check_ms(Config). -finish_size_check_msd(Config) when list(Config) -> +finish_size_check_msd(Config) when is_list(Config) -> finish_size_check_ms(Config). -finish_size_check_msm(Config) when list(Config) -> +finish_size_check_msm(Config) when is_list(Config) -> finish_size_check_ms(Config). -finish_size_check_ms(Config) when list(Config) -> +finish_size_check_ms(Config) when is_list(Config) -> delete_tables(), C1 = stop_agent(Config), delete_files(C1), @@ -634,7 +634,7 @@ varm_mib_start(X). ms_size_check(suite) -> []; -ms_size_check(Config) when list(Config) -> +ms_size_check(Config) when is_list(Config) -> ?P(ms_size_check), init_case(Config), ?LOG("mib server size check...", []), @@ -676,7 +676,7 @@ varm_mib_start(suite) -> []; -varm_mib_start(Config) when list(Config) -> +varm_mib_start(Config) when is_list(Config) -> ?P(varm_mib_start), ?LOG("varm_mib_start -> entry", []), init_case(Config), @@ -739,7 +739,7 @@ -define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]). ms_me_of(suite) -> []; -ms_me_of(Config) when list(Config) -> +ms_me_of(Config) when is_list(Config) -> ?P(ms_me_of), init_case(Config), @@ -810,7 +810,7 @@ ms_mib_of(suite) -> []; -ms_mib_of(Config) when list(Config) -> +ms_mib_of(Config) when is_list(Config) -> ?P(ms_mib_of), init_case(Config), @@ -894,7 +894,7 @@ ]. app_info(suite) -> []; -app_info(Config) when list(Config) -> +app_info(Config) when is_list(Config) -> ?P(app_info), SnmpDir = app_dir(snmp), SslDir = app_dir(ssl), @@ -917,7 +917,7 @@ app_dir(App) -> case code:lib_dir(App) of - D when list(D) -> + D when is_list(D) -> filename:basename(D); {error, _Reason} -> "undefined" @@ -953,7 +953,7 @@ change_target_addr_config ]. -init_v1(Config) when list(Config) -> +init_v1(Config) when is_list(Config) -> ?line SaNode = ?config(snmp_sa, Config), ?line create_tables(SaNode), ?line AgentDir = ?config(agent_dir, Config), @@ -962,7 +962,7 @@ ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)), [{vsn, v1} | start_v1_agent(Config)]. -finish_v1(Config) when list(Config) -> +finish_v1(Config) when is_list(Config) -> delete_tables(), C1 = stop_agent(Config), delete_files(C1), @@ -997,7 +997,7 @@ v2_caps ]. -init_v2(Config) when list(Config) -> +init_v2(Config) when is_list(Config) -> SaNode = ?config(snmp_sa, Config), create_tables(SaNode), AgentDir = ?config(agent_dir, Config), @@ -1006,7 +1006,7 @@ config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)), [{vsn, v2} | start_v2_agent(Config)]. -finish_v2(Config) when list(Config) -> +finish_v2(Config) when is_list(Config) -> delete_tables(), C1 = stop_agent(Config), delete_files(C1), @@ -1018,7 +1018,7 @@ v1_v2_cases() -> [simple_bi]. -init_v1_v2(Config) when list(Config) -> +init_v1_v2(Config) when is_list(Config) -> SaNode = ?config(snmp_sa, Config), create_tables(SaNode), AgentDir = ?config(agent_dir, Config), @@ -1027,7 +1027,7 @@ config([v1,v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)), [{vsn, bilingual} | start_bilingual_agent(Config)]. -finish_v1_v2(Config) when list(Config) -> +finish_v1_v2(Config) when is_list(Config) -> delete_tables(), C1 = stop_agent(Config), delete_files(C1), @@ -1063,7 +1063,7 @@ v2_caps_3 ]. -init_v3(Config) when list(Config) -> +init_v3(Config) when is_list(Config) -> %% Make sure crypto works, otherwise start_agent will fail %% and we will be stuck with a bunch of mnesia tables for %% the rest of this suite... @@ -1093,7 +1093,7 @@ tuple_to_list(Ip), tuple_to_list(Ip)), [{vsn, v3} | start_v3_agent(Config)]. -finish_v3(Config) when list(Config) -> +finish_v3(Config) when is_list(Config) -> delete_tables(), C1 = stop_agent(Config), delete_files(C1), @@ -1105,7 +1105,7 @@ mt_cases() -> [multi_threaded, mt_trap]. -init_mt(Config) when list(Config) -> +init_mt(Config) when is_list(Config) -> SaNode = ?config(snmp_sa, Config), create_tables(SaNode), AgentDir = ?config(agent_dir, Config), @@ -1115,7 +1115,7 @@ config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)), [{vsn, v2} | start_multi_threaded_agent(Config)]. -finish_mt(Config) when list(Config) -> +finish_mt(Config) when is_list(Config) -> delete_tables(), C1 = stop_agent(Config), delete_files(C1), @@ -1187,7 +1187,7 @@ simple(suite) -> []; -simple(Config) when list(Config) -> +simple(Config) when is_list(Config) -> ?P(simple), init_case(Config), @@ -1196,7 +1196,7 @@ simple_2(X) -> ?P(simple_2), simple(X). simple_bi(suite) -> []; -simple_bi(Config) when list(Config) -> +simple_bi(Config) when is_list(Config) -> ?P(simple_bi), init_case(Config), @@ -1210,7 +1210,7 @@ ?P(simple_3), simple(X). big(suite) -> []; -big(Config) when list(Config) -> +big(Config) when is_list(Config) -> ?P(big), %% put(sname, {?MODULE, big}), %% put(verbosity, trace), @@ -1240,7 +1240,7 @@ big2(suite) -> []; -big2(Config) when list(Config) -> +big2(Config) when is_list(Config) -> ?P(big2), %% This is exactly the same tests as 'big', but with the %% v2 equivalent of the mibs. @@ -1262,7 +1262,7 @@ multi_threaded(suite) -> []; -multi_threaded(Config) when list(Config) -> +multi_threaded(Config) when is_list(Config) -> ?P(multi_threaded), init_case(Config), @@ -1271,7 +1271,7 @@ ?line unload_master("Test1"). mt_trap(suite) -> []; -mt_trap(Config) when list(Config) -> +mt_trap(Config) when is_list(Config) -> ?P(mt_trap), init_case(Config), MA = whereis(snmp_master_agent), @@ -1283,7 +1283,7 @@ ?line unload_master("Test1"). v2_types(suite) -> []; -v2_types(Config) when list(Config) -> +v2_types(Config) when is_list(Config) -> ?P(v2_types), init_case(Config), @@ -1295,7 +1295,7 @@ implied(suite) -> []; -implied(Config) when list(Config) -> +implied(Config) when is_list(Config) -> ?P(implied), init_case(Config), MA = whereis(snmp_master_agent), @@ -1308,7 +1308,7 @@ sparse_table(suite) -> []; -sparse_table(Config) when list(Config) -> +sparse_table(Config) when is_list(Config) -> ?P(sparse_table), init_case(Config), @@ -1321,7 +1321,7 @@ sparse_table_3(X) -> ?P(sparse_table_3), sparse_table(X). cnt_64(suite) -> []; -cnt_64(Config) when list(Config) -> +cnt_64(Config) when is_list(Config) -> ?P(cnt_64), init_case(Config), MA = whereis(snmp_master_agent), @@ -1335,7 +1335,7 @@ cnt_64_3(X) -> ?P(cnt_64_3), cnt_64(X). opaque(suite) -> []; -opaque(Config) when list(Config) -> +opaque(Config) when is_list(Config) -> ?P(opaque), init_case(Config), @@ -1349,7 +1349,7 @@ change_target_addr_config(suite) -> []; -change_target_addr_config(Config) when list(Config) -> +change_target_addr_config(Config) when is_list(Config) -> ?P(change_target_addr_config), ?LOG("change_target_addr_config -> entry",[]), init_case(Config), @@ -1493,9 +1493,9 @@ dummy_manager_loop(P,S,MA) end. -dummy_manager_message_sz(B) when binary(B) -> +dummy_manager_message_sz(B) when is_binary(B) -> size(B); -dummy_manager_message_sz(L) when list(L) -> +dummy_manager_message_sz(L) when is_list(L) -> length(L); dummy_manager_message_sz(_) -> undefined. @@ -1514,7 +1514,7 @@ api(suite) -> []; -api(Config) when list(Config) -> +api(Config) when is_list(Config) -> ?P(api), init_case(Config), @@ -1529,7 +1529,7 @@ subagent(suite) -> []; -subagent(Config) when list(Config) -> +subagent(Config) when is_list(Config) -> ?P(subagent), {SaNode, _MgrNode, MibDir} = init_case(Config), @@ -1570,7 +1570,7 @@ mnesia(suite) -> []; -mnesia(Config) when list(Config) -> +mnesia(Config) when is_list(Config) -> ?P(mnesia), {SaNode, _MgrNode, _MibDir} = init_case(Config), @@ -1614,7 +1614,7 @@ [mul_get_3, mul_get_err_3, mul_next_3, mul_next_err_3, mul_set_err_3]. -init_mul(Config) when list(Config) -> +init_mul(Config) when is_list(Config) -> {SaNode, _MgrNode, _MibDir} = init_case(Config), ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"), @@ -1622,7 +1622,7 @@ ?line init_old(), [{mul_sub, SA} | Config]. -finish_mul(Config) when list(Config) -> +finish_mul(Config) when is_list(Config) -> init_case(Config), SA = ?config(mul_sub, Config), @@ -1632,7 +1632,7 @@ lists:keydelete(mul_sub, 1, Config). mul_get(suite) -> []; -mul_get(Config) when list(Config) -> +mul_get(Config) when is_list(Config) -> ?P(mul_get), init_case(Config), @@ -1645,7 +1645,7 @@ mul_get_err(suite) -> []; -mul_get_err(Config) when list(Config) -> +mul_get_err(Config) when is_list(Config) -> ?P(mul_get_err), init_case(Config), @@ -1658,7 +1658,7 @@ mul_next(suite) -> []; -mul_next(Config) when list(Config) -> +mul_next(Config) when is_list(Config) -> ?P(mul_next), init_case(Config), @@ -1671,7 +1671,7 @@ mul_next_err(suite) -> []; -mul_next_err(Config) when list(Config) -> +mul_next_err(Config) when is_list(Config) -> ?P(mul_next_err), init_case(Config), @@ -1684,7 +1684,7 @@ mul_set(suite) -> []; -mul_set(Config) when list(Config) -> +mul_set(Config) when is_list(Config) -> ?P(mul_set), init_case(Config), @@ -1697,7 +1697,7 @@ mul_set_err(suite) -> []; -mul_set_err(Config) when list(Config) -> +mul_set_err(Config) when is_list(Config) -> ?P(mul_set_err), init_case(Config), @@ -1710,7 +1710,7 @@ sa_register(suite) -> []; -sa_register(Config) when list(Config) -> +sa_register(Config) when is_list(Config) -> ?P(sa_register), {SaNode, _MgrNode, MibDir} = init_case(Config), @@ -1748,7 +1748,7 @@ v1_trap(suite) -> []; -v1_trap(Config) when list(Config) -> +v1_trap(Config) when is_list(Config) -> ?P(v1_trap), trap1(Config). @@ -1784,7 +1784,7 @@ ?line stop_subagent(SA). v2_trap(suite) -> []; -v2_trap(Config) when list(Config) -> +v2_trap(Config) when is_list(Config) -> ?P(v2_trap), trap2(Config). @@ -1839,7 +1839,7 @@ %% v2_inform(X). {req, [], {conf, init_v3_inform, [v3_inform_i], finish_v3_inform}}. -init_v2_inform(Config) when list(Config) -> +init_v2_inform(Config) when is_list(Config) -> _Dir = ?config(agent_dir, Config), %% snmp_internal_mib:configure(Dir), Config. @@ -1847,7 +1847,7 @@ init_v3_inform(X) -> init_v2_inform(X). -finish_v2_inform(Config) when list(Config) -> +finish_v2_inform(Config) when is_list(Config) -> _Dir = ?config(agent_dir, Config), %% snmp_internal_mib:configure(Dir), Config. @@ -1858,7 +1858,7 @@ v2_inform_i(suite) -> []; -v2_inform_i(Config) when list(Config) -> +v2_inform_i(Config) when is_list(Config) -> ?P(v2_inform_i), inform_i(Config). @@ -1894,7 +1894,7 @@ sa_error(suite) -> []; -sa_error(Config) when list(Config) -> +sa_error(Config) when is_list(Config) -> ?P(sa_error), {SaNode, _MgrNode, _MibDir} = init_case(Config), @@ -1988,7 +1988,7 @@ undo(suite) -> []; -undo(Config) when list(Config) -> +undo(Config) when is_list(Config) -> ?P(undo), {SaNode, _MgrNode, MibDir} = init_case(Config), @@ -2045,7 +2045,7 @@ %% Req. Test2 v1_processing(suite) -> []; -v1_processing(Config) when list(Config) -> +v1_processing(Config) when is_list(Config) -> ?P(v1_processing), ?DBG("v1_processing -> entry", []), init_case(Config), @@ -2060,7 +2060,7 @@ %% Req. Test2 v2_processing(suite) -> []; -v2_processing(Config) when list(Config) -> +v2_processing(Config) when is_list(Config) -> ?P(v2_processing), init_case(Config), @@ -2074,7 +2074,7 @@ %% Req. Test2 v3_processing(suite) -> []; -v3_processing(Config) when list(Config) -> +v3_processing(Config) when is_list(Config) -> ?P(v3_processing), init_case(Config), @@ -2150,7 +2150,7 @@ v3_md5_auth(suite) -> []; -v3_md5_auth(Config) when list(Config) -> +v3_md5_auth(Config) when is_list(Config) -> ?P(v3_md5_auth), init_case(Config), @@ -2177,7 +2177,7 @@ ?line reset_target_params_conf(AgentDir). v3_sha_auth(suite) -> []; -v3_sha_auth(Config) when list(Config) -> +v3_sha_auth(Config) when is_list(Config) -> ?P(v3_sha_auth), init_case(Config), @@ -2204,7 +2204,7 @@ ?line reset_target_params_conf(AgentDir). v3_des_priv(suite) -> []; -v3_des_priv(Config) when list(Config) -> +v3_des_priv(Config) when is_list(Config) -> ?P(v3_des_priv), init_case(Config), @@ -2216,6 +2216,8 @@ MA = whereis(snmp_master_agent), + snmp_user_based_sm_mib:usmUserTable(print), + ?line load_master("Test2"), ?line load_master("TestTrap"), ?line load_master("TestTrapv2"), @@ -2255,7 +2257,7 @@ v2_caps(suite) -> []; -v2_caps(Config) when list(Config) -> +v2_caps(Config) when is_list(Config) -> ?P(v2_caps), init_case(Config), @@ -2690,7 +2692,7 @@ %% This is run in the agent node db_notify_client(suite) -> []; -db_notify_client(Config) when list(Config) -> +db_notify_client(Config) when is_list(Config) -> ?P(db_notify_client), {SaNode, MgrNode, MibDir} = init_case(Config), ?DBG("db_notify_client -> case initiated: " @@ -2966,7 +2968,7 @@ get_multi_pid(N) -> ?SLEEP(1000), case global:whereis_name(snmp_multi_tester) of - Pid when pid(Pid) -> Pid; + Pid when is_pid(Pid) -> Pid; _ -> get_multi_pid(N-1) end. @@ -3194,8 +3196,8 @@ ?line false = rpc:call(MaNode, snmp, int_to_enum, ['RowStatus', 25]), ?line false = rpc:call(MaNode, snmp, int_to_enum, ['xxRowStatus', 1]), ?line case snmp:date_and_time() of - List when list(List), length(List) == 8 -> ok; - List when list(List), length(List) == 11 -> ok + List when is_list(List), length(List) == 8 -> ok; + List when is_list(List), length(List) == 11 -> ok end. %% Req. Klas3 @@ -3979,7 +3981,7 @@ %% o Test the counters and control objects in SNMP-STANDARD-MIB %%----------------------------------------------------------------- snmp_standard_mib(suite) -> []; -snmp_standard_mib(Config) when list(Config) -> +snmp_standard_mib(Config) when is_list(Config) -> ?P(snmp_standard_mib), init_case(Config), ?DBG("snmp_standard_mib -> std_mib_init", []), @@ -4061,7 +4063,7 @@ %% o Test the counters and control objects in SNMPv2-MIB %%----------------------------------------------------------------- snmpv2_mib_2(suite) -> []; -snmpv2_mib_2(Config) when list(Config) -> +snmpv2_mib_2(Config) when is_list(Config) -> ?P(snmpv2_mib_2), ?LOG("snmpv2_mib_2 -> start",[]), init_case(Config), @@ -4106,7 +4108,7 @@ %% Req. SNMPv2-MIB snmpv2_mib_3(suite) -> []; -snmpv2_mib_3(Config) when list(Config) -> +snmpv2_mib_3(Config) when is_list(Config) -> %% Skippable = [{unix, [darwin]}], Condition = fun() -> ?OS_BASED_SKIP(Skippable) end, @@ -4194,7 +4196,7 @@ %% o Test add/deletion of rows. %%----------------------------------------------------------------- snmp_community_mib(suite) -> []; -snmp_community_mib(Config) when list(Config) -> +snmp_community_mib(Config) when is_list(Config) -> ?P(snmp_community_mib), init_case(Config), ?line load_master_std("SNMP-COMMUNITY-MIB"), @@ -4212,7 +4214,7 @@ %% o Test engine boots / time %%----------------------------------------------------------------- snmp_framework_mib(suite) -> []; -snmp_framework_mib(Config) when list(Config) -> +snmp_framework_mib(Config) when is_list(Config) -> ?P(snmp_framework_mib), init_case(Config), ?line load_master_std("SNMP-FRAMEWORK-MIB"), @@ -4222,7 +4224,7 @@ snmp_framework_mib_2(X) -> ?P(snmp_framework_mib_2), snmp_framework_mib(X). snmp_framework_mib_3(suite) -> []; -snmp_framework_mib_3(Config) when list(Config) -> +snmp_framework_mib_3(Config) when is_list(Config) -> ?P(snmp_framework_mib_3), init_case(Config), try_test(snmp_framework_mib). @@ -4257,7 +4259,7 @@ %% o Test the counters %%----------------------------------------------------------------- snmp_mpd_mib_3(suite) -> []; -snmp_mpd_mib_3(Config) when list(Config) -> +snmp_mpd_mib_3(Config) when is_list(Config) -> %% Skippable = [{unix, [darwin]}], Condition = fun() -> ?OS_BASED_SKIP(Skippable) end, @@ -4324,7 +4326,7 @@ snmp_target_mib(suite) -> []; -snmp_target_mib(Config) when list(Config) -> +snmp_target_mib(Config) when is_list(Config) -> ?P(snmp_target_mib), init_case(Config), ?line load_master_std("SNMP-TARGET-MIB"), @@ -4340,7 +4342,7 @@ nyi. snmp_notification_mib(suite) -> []; -snmp_notification_mib(Config) when list(Config) -> +snmp_notification_mib(Config) when is_list(Config) -> ?P(snmp_notification_mib), init_case(Config), ?line load_master_std("SNMP-NOTIFICATION-MIB"), @@ -4362,7 +4364,7 @@ %% o try boundaries %%----------------------------------------------------------------- snmp_view_based_acm_mib(suite) -> []; -snmp_view_based_acm_mib(Config) when list(Config) -> +snmp_view_based_acm_mib(Config) when is_list(Config) -> ?P(snmp_view_based_acm_mib), init_case(Config), @@ -4556,7 +4558,7 @@ %% o try bad ops; check counters %%----------------------------------------------------------------- snmp_user_based_sm_mib_3(suite) -> []; -snmp_user_based_sm_mib_3(Config) when list(Config) -> +snmp_user_based_sm_mib_3(Config) when is_list(Config) -> %% Skippable = [{unix, [darwin]}], Condition = fun() -> ?OS_BASED_SKIP(Skippable) end, @@ -4784,7 +4786,7 @@ %% Load all std mibs that are not loaded by default. %%----------------------------------------------------------------- loop_mib(suite) -> []; -loop_mib(Config) when list(Config) -> +loop_mib(Config) when is_list(Config) -> ?P(loop_mib), ?LOG("loop_mib -> initiate case",[]), %% snmpa:verbosity(master_agent,debug), @@ -4826,7 +4828,7 @@ loop_mib_2(suite) -> []; -loop_mib_2(Config) when list(Config) -> +loop_mib_2(Config) when is_list(Config) -> ?P(loop_mib_2), ?LOG("loop_mib_2 -> initiate case",[]), {SaNode, MgrNode, MibDir} = init_case(Config), @@ -4853,7 +4855,7 @@ loop_mib_3(suite) -> []; -loop_mib_3(Config) when list(Config) -> +loop_mib_3(Config) when is_list(Config) -> ?P(loop_mib_3), ?LOG("loop_mib_3 -> initiate case",[]), {SaNode, MgrNode, MibDir} = init_case(Config), @@ -5080,7 +5082,7 @@ %% Slogan: Bug in handling of createAndWait set-requests. %%----------------------------------------------------------------- otp_1128(suite) -> []; -otp_1128(Config) when list(Config) -> +otp_1128(Config) when is_list(Config) -> ?P(otp_1128), init_case(Config), @@ -5116,7 +5118,7 @@ %% Slogan: snmpa:int_to_enum crashes on bad oids %%----------------------------------------------------------------- otp_1129(suite) -> []; -otp_1129(Config) when list(Config) -> +otp_1129(Config) when is_list(Config) -> ?P(otp_1129), init_case(Config), ?line load_master("Klas3"), @@ -5139,7 +5141,7 @@ %% and RowIdenx [3,2]. %%----------------------------------------------------------------- otp_1131(suite) -> []; -otp_1131(Config) when list(Config) -> +otp_1131(Config) when is_list(Config) -> ?P(otp_1131), init_case(Config), @@ -5171,7 +5173,7 @@ %% Slogan: snmp_agent can't handle wrongValue from instrum.func %%----------------------------------------------------------------- otp_1162(suite) -> []; -otp_1162(Config) when list(Config) -> +otp_1162(Config) when is_list(Config) -> ?P(otp_1162), {SaNode, _MgrNode, _MibDir} = init_case(Config), ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"), @@ -5192,7 +5194,7 @@ %% Slogan: snmp agent crash if faulty index is returned from instrum %%----------------------------------------------------------------- otp_1222(suite) -> []; -otp_1222(Config) when list(Config) -> +otp_1222(Config) when is_list(Config) -> ?P(otp_1222), init_case(Config), ?line load_master("Klas3"), @@ -5217,7 +5219,7 @@ %% Slogan: Negative INTEGER values are treated as positive. %%----------------------------------------------------------------- otp_1298(suite) -> []; -otp_1298(Config) when list(Config) -> +otp_1298(Config) when is_list(Config) -> ?P(otp_1298), init_case(Config), @@ -5240,7 +5242,7 @@ %% Slogan: snmp_generic should return noError when deleting non-ex row %%----------------------------------------------------------------- otp_1331(suite) -> []; -otp_1331(Config) when list(Config) -> +otp_1331(Config) when is_list(Config) -> ?P(otp_1331), init_case(Config), ?line load_master("OLD-SNMPEA-MIB"), @@ -5263,7 +5265,7 @@ %% Slogan: snmp bug in initialisation of default values for mnesia tabs %%----------------------------------------------------------------- otp_1338(suite) -> []; -otp_1338(Config) when list(Config) -> +otp_1338(Config) when is_list(Config) -> ?P(otp_1338), init_case(Config), @@ -5287,7 +5289,7 @@ %% Set when INDEX is read-write gets into an infinite loop! %%----------------------------------------------------------------- otp_1342(suite) -> []; -otp_1342(Config) when list(Config) -> +otp_1342(Config) when is_list(Config) -> ?P(otp_1342), init_case(Config), ?line load_master("Klas4"), @@ -5312,7 +5314,7 @@ %% mgrs on two different machines. %%----------------------------------------------------------------- otp_1366(suite) -> []; -otp_1366(Config) when list(Config) -> +otp_1366(Config) when is_list(Config) -> ?P(otp_1366), init_case(Config), ?line load_master("OLD-SNMPEA-MIB"), @@ -5333,7 +5335,7 @@ %% Slogan: snmp:validate_date_and_time() fails when time is 00:00 %%----------------------------------------------------------------- otp_2776(suite) -> []; -otp_2776(Config) when list(Config) -> +otp_2776(Config) when is_list(Config) -> ?P(otp_2776), init_case(Config), try_test(otp_2776). @@ -5400,7 +5402,7 @@ %% returns bad response. %%----------------------------------------------------------------- otp_2979(suite) -> []; -otp_2979(Config) when list(Config) -> +otp_2979(Config) when is_list(Config) -> ?P(otp_2979), init_case(Config), ?line load_master("Test1"), @@ -5423,7 +5425,7 @@ %% endOfTable - should return value. %%----------------------------------------------------------------- otp_3187(suite) -> []; -otp_3187(Config) when list(Config) -> +otp_3187(Config) when is_list(Config) -> ?P(otp_3187), init_case(Config), ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"), @@ -5449,7 +5451,7 @@ %% Slogan: %%----------------------------------------------------------------- otp_3542(suite) -> []; -otp_3542(Config) when list(Config) -> +otp_3542(Config) when is_list(Config) -> ?P(otp_3542), init_case(Config), try_test(otp_3542). @@ -5465,7 +5467,7 @@ %% Slogan: Slow response time on snmpa:int_to_enum %%----------------------------------------------------------------- otp_3725(suite) -> []; -otp_3725(Config) when list(Config) -> +otp_3725(Config) when is_list(Config) -> ?P(otp_3725), init_case(Config), @@ -5529,7 +5531,7 @@ [otp_4394_test], finish_otp_4394}}. -init_otp_4394(Config) when list(Config) -> +init_otp_4394(Config) when is_list(Config) -> ?DBG("init_otp_4394 -> entry with" "~n Config: ~p", [Config]), ?line AgentDir = ?config(agent_dir, Config), @@ -5583,7 +5585,7 @@ -finish_otp_4394(Config) when list(Config) -> +finish_otp_4394(Config) when is_list(Config) -> ?DBG("finish_otp_4394 -> entry", []), C1 = stop_agent(Config), delete_files(C1), @@ -5646,7 +5648,7 @@ [{vsn, v2} | start_v2_agent(Config, Opts)]. -finish_otp_7157(Config) when list(Config) -> +finish_otp_7157(Config) when is_list(Config) -> ?DBG("finish_otp_7157 -> entry", []), C1 = stop_agent(Config), delete_files(C1), @@ -5693,7 +5695,7 @@ %%----------------------------------------------------------------- info_test(suite) -> []; -info_test(Config) when list(Config) -> +info_test(Config) when is_list(Config) -> ?P(info_test), init_case(Config), @@ -5731,14 +5733,14 @@ Info = verify_info1(Info0, Key), verify_info(Info, Keys). -verify_info1(Info0, Key) when atom(Key) -> +verify_info1(Info0, Key) when is_atom(Key) -> case lists:keydelete(Key, 1, Info0) of Info0 -> ?FAIL({missing_info, Key}); Info -> Info end; -verify_info1(Info0, {Key, SubKeys}) when atom(Key), list(SubKeys) -> +verify_info1(Info0, {Key, SubKeys}) when is_atom(Key) andalso is_list(SubKeys) -> case lists:keysearch(Key, 1, Info0) of false -> ?FAIL({missing_info, Key}); @@ -5986,14 +5988,14 @@ lists_key1search([], Res) -> Res; -lists_key1search([Key|Keys], List) when atom(Key), list(List) -> +lists_key1search([Key|Keys], List) when is_atom(Key) andalso is_list(List) -> case lists:keysearch(Key, 1, List) of {value, {Key, Val}} -> lists_key1search(Keys, Val); false -> undefined end; -lists_key1search(Key, List) when atom(Key) -> +lists_key1search(Key, List) when is_atom(Key) -> case lists:keysearch(Key, 1, List) of {value, {Key, Val}} -> Val; diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_agent_test_lib.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_agent_test_lib.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_agent_test_lib.erl 2009-03-12 12:32:12.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_agent_test_lib.erl 2009-09-18 15:13:20.000000000 +0100 @@ -119,7 +119,7 @@ %%% didn't undo (since it failed). %%%----------------------------------------------------------------- -init_all(Config0) when list(Config0) -> +init_all(Config0) when is_list(Config0) -> ?LOG("init_all -> entry with" "~n Config0: ~p",[Config0]), @@ -209,7 +209,7 @@ Config]. -finish_all(Config) when list(Config) -> +finish_all(Config) when is_list(Config) -> SaNode = ?config(snmp_sa, Config), MgrNode = ?config(snmp_mgr, Config), stop_node(SaNode), @@ -219,7 +219,7 @@ %% --- This one *must* be run first in each case --- -init_case(Config) when list(Config) -> +init_case(Config) when is_list(Config) -> ?DBG("init_case -> entry with" "~n Config: ~p", [Config]), SaNode = ?config(snmp_sa, Config), @@ -388,45 +388,72 @@ start_v1_agent(Config) when is_list(Config) -> start_agent(Config, [v1]). -start_v1_agent(Config, Opts) when is_list(Config) and is_list(Opts) -> +start_v1_agent(Config, Opts) when is_list(Config) andalso is_list(Opts) -> start_agent(Config, [v1], Opts). start_v2_agent(Config) when is_list(Config) -> start_agent(Config, [v2]). -start_v2_agent(Config, Opts) when is_list(Config) and is_list(Opts) -> +start_v2_agent(Config, Opts) when is_list(Config) andalso is_list(Opts) -> start_agent(Config, [v2], Opts). start_v3_agent(Config) when is_list(Config) -> start_agent(Config, [v3]). -start_v3_agent(Config, Opts) when is_list(Config) and is_list(Opts) -> +start_v3_agent(Config, Opts) when is_list(Config) andalso is_list(Opts) -> start_agent(Config, [v3], Opts). start_bilingual_agent(Config) when is_list(Config) -> start_agent(Config, [v1,v2]). -start_bilingual_agent(Config, Opts) when is_list(Config) and is_list(Opts) -> +start_bilingual_agent(Config, Opts) when is_list(Config) andalso is_list(Opts) -> start_agent(Config, [v1,v2], Opts). start_mt_agent(Config) when is_list(Config) -> start_agent(Config, [v2], [{snmp_multi_threaded, true}]). -start_mt_agent(Config, Opts) when is_list(Config) and is_list(Opts) -> +start_mt_agent(Config, Opts) when is_list(Config) andalso is_list(Opts) -> start_agent(Config, [v2], [{snmp_multi_threaded, true}|Opts]). -start_agent(Config, Vsn) -> - start_agent(Config, Vsn, []). -start_agent(Config, Vsn, Opts) -> +start_agent(Config, Vsns) -> + start_agent(Config, Vsns, []). +start_agent(Config, Vsns, Opts) -> ?LOG("start_agent -> entry (~p) with" "~n Config: ~p" - "~n Vsn: ~p" - "~n Opts: ~p",[node(), Config, Vsn, Opts]), + "~n Vsns: ~p" + "~n Opts: ~p",[node(), Config, Vsns, Opts]), ?line AgentDir = ?config(agent_dir, Config), ?line SaNode = ?config(snmp_sa, Config), - app_env_init(vsn_init(Vsn) ++ +%% AgentConfig = +%% [{agent_type, master}, +%% %% {multi_threaded, MultiT}, +%% %% {priority, Prio}, +%% %% {error_report_mod, ErrorReportMod}, +%% {versions, Vsns}, +%% {db_dir, AgentDir}, +%% %% {db_init_error, DbInitError}, +%% %% {set_mechanism, SetModule}, +%% %% {authentication_service, AuthModule}, +%% {audit_trail_log, [{type, read_write}, +%% {dir, AgentDir}, +%% {size, {10240, 10}}, +%% {repair, true}]}, +%% {config, [{verbosity, info}, +%% {dir, AgentDir}, +%% {force_load, false}]}, +%% {mibs, Mibs}, +%% %% {mib_storage, MibStorage}, +%% {local_db, []}, +%% {mib_server, []}, +%% {symbolic_store, []}, +%% {note_store, []}, +%% {net_if, []}, +%% %% {supervisor, SupOpts} +%% ], + + app_env_init(vsn_init(Vsns) ++ [{audit_trail_log, read_write_log}, {audit_trail_log_dir, AgentDir}, {audit_trail_log_size, {10240, 10}}, @@ -501,7 +528,7 @@ lists:foreach(F2, Env). -stop_agent(Config) when list(Config) -> +stop_agent(Config) when is_list(Config) -> ?LOG("stop_agent -> entry with" "~n Config: ~p",[Config]), @@ -545,9 +572,9 @@ ?FAIL({start_failed,Else, ?IS_MNESIA_RUNNING()}) end. -stop_sup(Pid, _) when (node(Pid) == node()) -> +stop_sup(Pid, _) when (node(Pid) =:= node()) -> case (catch process_info(Pid)) of - PI when list(PI) -> + PI when is_list(PI) -> ?LOG("stop_sup -> attempt to stop ~p", [Pid]), Ref = erlang:monitor(process, Pid), exit(Pid, kill), @@ -722,7 +749,7 @@ receive_pdu(To) -> receive - {snmp_pdu, PDU} when record(PDU, pdu) -> + {snmp_pdu, PDU} when is_record(PDU, pdu) -> PDU after To -> {error, timeout} @@ -730,7 +757,7 @@ receive_trap(To) -> receive - {snmp_pdu, PDU} when record(PDU, trappdu) -> + {snmp_pdu, PDU} when is_record(PDU, trappdu) -> PDU after To -> {error, timeout} @@ -741,7 +768,7 @@ do_expect({Expect, get_timeout()}); do_expect({any_pdu, To}) - when is_integer(To) or (To == infinity) -> + when is_integer(To) orelse (To =:= infinity) -> io:format("~w:do_expect(any_pdu) -> entry with" "~n To: ~w" "~n", [?MODULE, To]), @@ -766,7 +793,7 @@ end; do_expect({Err, To}) - when is_atom(Err) and (is_integer(To) or (To == infinity)) -> + when is_atom(Err) andalso (is_integer(To) orelse (To =:= infinity)) -> do_expect({{error, Err}, To}); do_expect({error, Err}) when is_atom(Err) -> @@ -882,12 +909,12 @@ do_expect2(Check, Type, Err, Idx, ExpVBs, To) - when is_function(Check) and - is_atom(Type) and - is_atom(Err) and - (is_integer(Idx) or is_list(Idx) or (Idx == any)) and - (is_list(ExpVBs) or (ExpVBs == any)) and - (is_integer(To) or (To == infinity)) -> + when is_function(Check) andalso + is_atom(Type) andalso + is_atom(Err) andalso + (is_integer(Idx) orelse is_list(Idx) orelse (Idx =:= any)) andalso + (is_list(ExpVBs) orelse (ExpVBs =:= any)) andalso + (is_integer(To) orelse (To =:= infinity)) -> io:format("~w:do_expect2 -> entry with" "~n Type: ~w" @@ -903,39 +930,41 @@ #pdu{type = Type, error_status = Err, - error_index = Idx} when ExpVBs == any -> + error_index = Idx} when ExpVBs =:= any -> ok; #pdu{type = Type, request_id = ReqId, error_status = Err2, - error_index = Idx} when ExpVBs == any -> + error_index = Idx} when ExpVBs =:= any -> {error, {unexpected_error_status, Err, Err2, ReqId}}; - #pdu{error_status = Err} when (Type == any) and - (Idx == any) and - (ExpVBs == any) -> + #pdu{error_status = Err} when (Type =:= any) andalso + (Idx =:= any) andalso + (ExpVBs =:= any) -> ok; #pdu{request_id = ReqId, - error_status = Err2} when (Type == any) and - (Idx == any) and - (ExpVBs == any) -> + error_status = Err2} when (Type =:= any) andalso + (Idx =:= any) andalso + (ExpVBs =:= any) -> {error, {unexpected_error_status, Err, Err2, ReqId}}; #pdu{type = Type, - error_status = Err} when (Idx == any) and (ExpVBs == any) -> + error_status = Err} when (Idx =:= any) andalso + (ExpVBs =:= any) -> ok; #pdu{type = Type, request_id = ReqId, - error_status = Err2} when (Idx == any) and (ExpVBs == any) -> + error_status = Err2} when (Idx =:= any) andalso + (ExpVBs =:= any) -> {error, {unexpected_error_status, Err, Err2, ReqId}}; #pdu{type = Type, request_id = ReqId, error_status = Err, - error_index = EI} when is_list(Idx) and (ExpVBs == any) -> + error_index = EI} when is_list(Idx) andalso (ExpVBs =:= any) -> case lists:member(EI, Idx) of true -> ok; @@ -946,7 +975,7 @@ #pdu{type = Type, request_id = ReqId, error_status = Err2, - error_index = EI} when is_list(Idx) and (ExpVBs == any) -> + error_index = EI} when is_list(Idx) andalso (ExpVBs =:= any) -> case lists:member(EI, Idx) of true -> {error, {unexpected_error_status, Err, Err2, ReqId}}; @@ -957,7 +986,7 @@ #pdu{type = Type2, request_id = ReqId, error_status = Err2, - error_index = Idx2} when ExpVBs == any -> + error_index = Idx2} when ExpVBs =:= any -> {error, {unexpected_pdu, {Type, Err, Idx}, {Type2, Err2, Idx2}, ReqId}}; @@ -970,7 +999,7 @@ #pdu{type = Type, error_status = Err, - varbinds = VBs} = PDU when Idx == any -> + varbinds = VBs} = PDU when Idx =:= any -> Check(PDU, check_vbs(purify_oids(ExpVBs), VBs)); #pdu{type = Type, @@ -1022,7 +1051,7 @@ purify_oids({VbsCondition, VBs}) - when ((VbsCondition == true) orelse (VbsCondition == false)) andalso + when ((VbsCondition =:= true) orelse (VbsCondition =:= false)) andalso is_list(VBs) -> {VbsCondition, do_purify_oids(VBs)}; purify_oids(VBs) when is_list(VBs) -> @@ -1328,7 +1357,7 @@ snmp_config:write_agent_target_params_config(Dir, "", Conf). rewrite_target_params_conf(Dir, SecName, SecLevel) - when is_list(SecName) and is_atom(SecLevel) -> + when is_list(SecName) andalso is_atom(SecLevel) -> ?line ok = file:rename(filename:join(Dir,"target_params.conf"), filename:join(Dir,"target_params.old")), Conf = [{"target_v3", v3, usm, SecName, SecLevel}], @@ -1376,14 +1405,14 @@ key1search([], Res) -> Res; -key1search([Key|Keys], List) when atom(Key), list(List) -> +key1search([Key|Keys], List) when is_atom(Key) andalso is_list(List) -> case lists:keysearch(Key, 1, List) of {value, {Key, Val}} -> key1search(Keys, Val); false -> undefined end; -key1search(Key, List) when atom(Key) -> +key1search(Key, List) when is_atom(Key) -> case lists:keysearch(Key, 1, List) of {value, {Key, Val}} -> Val; @@ -1413,14 +1442,14 @@ %% await_response(To, What) -> %% await_response(To, What, []). %% -%% await_response(To, What, Stuff) when integer(To), To >= 0 -> +%% await_response(To, What, Stuff) when is_integer(To) andalso (To >= 0) -> %% T = t(), %% receive -%% {snmp_pdu, PDU} when record(Trap, pdu), What == pdu -> +%% {snmp_pdu, PDU} when is_record(Trap, pdu) andalso (What =:= pdu) -> %% {ok, PDU}; -%% {snmp_pdu, Trap} when record(Trap, trappdu), What == trap -> +%% {snmp_pdu, Trap} is_when record(Trap, trappdu) andalso (What =:= trap) -> %% {ok, Trap}; -%% Any when What == any -> +%% Any when What =:= any -> %% {ok, Any}; %% Any -> %% %% Recalc time diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_app_test.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_app_test.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_app_test.erl 2009-03-12 12:31:10.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_app_test.erl 2009-11-20 13:37:23.000000000 +0000 @@ -30,6 +30,7 @@ modules/1, exportall/1, app_depend/1, + undef_funcs/1, start_and_stop/1, start_and_stop_empty/1, @@ -56,6 +57,7 @@ modules, exportall, app_depend, + undef_funcs, start_and_stop ], {conf, init_suite, Cases, fin_suite}. @@ -104,6 +106,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Test server callbacks +init_per_testcase(undef_funcs, Config) -> + Config2 = lists:keydelete(watchdog, 1, Config), + [{watchdog, ?WD_START(?MINS(10))} | Config2]; init_per_testcase(_Case, Config) -> Config. @@ -117,7 +122,7 @@ []; fields(doc) -> []; -fields(Config) when list(Config) -> +fields(Config) when is_list(Config) -> AppFile = key1search(app_file, Config), Fields = [vsn, description, modules, registered, applications], case check_fields(Fields, AppFile, []) of @@ -148,7 +153,7 @@ []; modules(doc) -> []; -modules(Config) when list(Config) -> +modules(Config) when is_list(Config) -> AppFile = key1search(app_file, Config), Mods = key1search(modules, AppFile), EbinList = get_ebin_mods(snmp), @@ -211,7 +216,7 @@ []; exportall(doc) -> []; -exportall(Config) when list(Config) -> +exportall(Config) when is_list(Config) -> AppFile = key1search(app_file, Config), Mods = key1search(modules, AppFile), check_export_all(Mods). @@ -244,7 +249,7 @@ []; app_depend(doc) -> []; -app_depend(Config) when list(Config) -> +app_depend(Config) when is_list(Config) -> AppFile = key1search(app_file, Config), Apps = key1search(applications, AppFile), check_apps(Apps). @@ -263,6 +268,57 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +undef_funcs(suite) -> + []; +undef_funcs(doc) -> + []; +undef_funcs(Config) when is_list(Config) -> + App = snmp, + AppFile = key1search(app_file, Config), + Mods = key1search(modules, AppFile), + Root = code:root_dir(), + LibDir = code:lib_dir(App), + EbinDir = filename:join([LibDir,"ebin"]), + XRefTestName = undef_funcs_make_name(App, xref_test_name), + {ok, XRef} = xref:start(XRefTestName), + ok = xref:set_default(XRef, + [{verbose,false},{warnings,false}]), + XRefName = undef_funcs_make_name(App, xref_name), + {ok, XRefName} = xref:add_release(XRef, Root, {name,XRefName}), + {ok, App} = xref:replace_application(XRef, App, EbinDir), + {ok, Undefs} = xref:analyze(XRef, undefined_function_calls), + xref:stop(XRef), + analyze_undefined_function_calls(Undefs, Mods, []). + +analyze_undefined_function_calls([], _, []) -> + ok; +analyze_undefined_function_calls([], _, AppUndefs) -> + exit({suite_failed, {undefined_function_calls, AppUndefs}}); +analyze_undefined_function_calls([{{Mod, _F, _A}, _C} = AppUndef|Undefs], + AppModules, AppUndefs) -> + %% Check that this module is our's + case lists:member(Mod,AppModules) of + true -> + {Calling,Called} = AppUndef, + {Mod1,Func1,Ar1} = Calling, + {Mod2,Func2,Ar2} = Called, + io:format("undefined function call: " + "~n ~w:~w/~w calls ~w:~w/~w~n", + [Mod1,Func1,Ar1,Mod2,Func2,Ar2]), + analyze_undefined_function_calls(Undefs, AppModules, + [AppUndef|AppUndefs]); + false -> + io:format("dropping ~p~n", [Mod]), + analyze_undefined_function_calls(Undefs, AppModules, AppUndefs) + end. + +%% This function is used simply to avoid cut-and-paste errors later... +undef_funcs_make_name(App, PostFix) -> + list_to_atom(atom_to_list(App) ++ "_" ++ atom_to_list(PostFix)). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + start_and_stop(suite) -> [ start_and_stop_empty, diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_compiler_test.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_compiler_test.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_compiler_test.erl 2009-03-12 12:31:27.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_compiler_test.erl 2009-09-18 15:13:09.000000000 +0100 @@ -68,7 +68,7 @@ %% External functions %%====================================================================== -init_per_testcase(_Case, Config) when list(Config) -> +init_per_testcase(_Case, Config) when is_list(Config) -> Dir = ?config(priv_dir, Config), DataDir = ?config(data_dir, Config), [_|RL] = lists:reverse(filename:split(DataDir)), @@ -77,7 +77,7 @@ ?line ok = file:make_dir(CompDir), [{comp_dir, CompDir},{mib_dir, MibDir}|Config]. -fin_per_testcase(_Case, Config) when list(Config) -> +fin_per_testcase(_Case, Config) when is_list(Config) -> CompDir = ?config(comp_dir, Config), ?line ok = ?DEL_DIR(CompDir), lists:keydelete(comp_dir, 1, Config). @@ -107,7 +107,7 @@ %%====================================================================== description(suite) -> []; -description(Config) when list(Config) -> +description(Config) when is_list(Config) -> put(tname,desc), p("starting with Config: ~p~n", [Config]), @@ -140,7 +140,7 @@ oid_conflicts(suite) -> []; -oid_conflicts(Config) when list(Config) -> +oid_conflicts(Config) when is_list(Config) -> put(tname,oid_conflicts), p("starting with Config: ~p~n", [Config]), @@ -154,13 +154,13 @@ imports(suite) -> []; -imports(Config) when list(Config) -> +imports(Config) when is_list(Config) -> ?SKIP(not_yet_implemented). module_identity(suite) -> []; -module_identity(Config) when list(Config) -> +module_identity(Config) when is_list(Config) -> ?SKIP(not_yet_implemented). diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_conf_test.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_conf_test.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_conf_test.erl 2009-03-12 12:31:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_conf_test.erl 2009-09-18 15:13:11.000000000 +0100 @@ -77,10 +77,10 @@ %% External functions %%====================================================================== -init_per_testcase(_Case, Config) when list(Config) -> +init_per_testcase(_Case, Config) when is_list(Config) -> Config. -fin_per_testcase(_Case, Config) when list(Config) -> +fin_per_testcase(_Case, Config) when is_list(Config) -> Config. %%====================================================================== @@ -113,7 +113,7 @@ %%====================================================================== check_mandatory(suite) -> []; -check_mandatory(Config) when list(Config) -> +check_mandatory(Config) when is_list(Config) -> ?P(check_mandatory), %% d("check_mandatory -> entry"), A1 = [{a, hej}, {b, hopp}, {c, 10}, {d, 10101}, {f, 10.88}], @@ -163,7 +163,7 @@ %%====================================================================== check_integer1(suite) -> []; -check_integer1(Config) when list(Config) -> +check_integer1(Config) when is_list(Config) -> ?P(check_integer1), ?line ok = verify_int(0), ?line ok = verify_int(16#FF), @@ -197,7 +197,7 @@ %%====================================================================== check_integer2(suite) -> []; -check_integer2(Config) when list(Config) -> +check_integer2(Config) when is_list(Config) -> ?P(check_integer2), ?line ok = verify_int(0, any), @@ -265,7 +265,7 @@ %%====================================================================== check_string1(suite) -> []; -check_string1(Config) when list(Config) -> +check_string1(Config) when is_list(Config) -> ?P(check_string1), ?line ok = verify_string("kalle & hobbe"), ?line ok = verify_not_string(kalle_hobbe), @@ -293,7 +293,7 @@ %%====================================================================== check_string2(suite) -> []; -check_string2(Config) when list(Config) -> +check_string2(Config) when is_list(Config) -> ?P(check_string2), Str = "kalle & hobbe", ?line ok = verify_string(Str, any), @@ -333,7 +333,7 @@ %%====================================================================== check_atom(suite) -> []; -check_atom(Config) when list(Config) -> +check_atom(Config) when is_list(Config) -> ?P(check_atom), Atoms = [{kalle, "kalle"}, {hobbe, "hobbe"}, {dummy, "dummy"}], ?line ok = verify_atom(kalle, Atoms), @@ -362,7 +362,7 @@ %%====================================================================== check_ip(suite) -> []; -check_ip(Config) when list(Config) -> +check_ip(Config) when is_list(Config) -> ?P(check_ip), ?line ok = verify_ip([1,2,3,4]), ?line ok = verify_not_ip([1,2,3]), @@ -393,7 +393,7 @@ %%====================================================================== check_taddress(suite) -> []; -check_taddress(Config) when list(Config) -> +check_taddress(Config) when is_list(Config) -> ?P(check_taddress), ?line ok = verify_taddress([1,2,3,4,5,6]), ?line ok = verify_not_taddress([1,2,3,4,5]), @@ -424,7 +424,7 @@ %%====================================================================== check_packet_size(suite) -> []; -check_packet_size(Config) when list(Config) -> +check_packet_size(Config) when is_list(Config) -> ?P(check_packet_size), Min = 484, Max = 2147483647, @@ -459,7 +459,7 @@ %%====================================================================== check_oid(suite) -> []; -check_oid(Config) when list(Config) -> +check_oid(Config) when is_list(Config) -> ?P(check_oid), [_,_|Rest] = ?otpSnmpeaModule, ErrOid = [6,16|Rest], @@ -493,7 +493,7 @@ %%====================================================================== check_sec_model1(suite) -> []; -check_sec_model1(Config) when list(Config) -> +check_sec_model1(Config) when is_list(Config) -> ?P(check_sec_model1), Exclude1 = [], Exclude2 = [v1], @@ -529,7 +529,7 @@ %%====================================================================== check_sec_model2(suite) -> []; -check_sec_model2(Config) when list(Config) -> +check_sec_model2(Config) when is_list(Config) -> ?P(check_sec_model2), ?line ok = verify_sec_model(v1, v1, []), ?line ok = verify_sec_model(v1, v1, [v2c]), @@ -572,7 +572,7 @@ %%====================================================================== check_sec_level(suite) -> []; -check_sec_level(Config) when list(Config) -> +check_sec_level(Config) when is_list(Config) -> ?P(check_sec_level), ?line ok = verify_sec_level(noAuthNoPriv), ?line ok = verify_sec_level(authNoPriv), @@ -608,7 +608,7 @@ %%====================================================================== check_timer(suite) -> []; -check_timer(Config) when list(Config) -> +check_timer(Config) when is_list(Config) -> ?P(check_timer), ?line ok = verify_timer(infinity), ?line ok = verify_timer(1), @@ -656,7 +656,7 @@ %%====================================================================== read(suite) -> []; -read(Config) when list(Config) -> +read(Config) when is_list(Config) -> ?P(read), ?SKIP(not_implemented_yet). @@ -664,7 +664,7 @@ %%====================================================================== read_files(suite) -> []; -read_files(Config) when list(Config) -> +read_files(Config) when is_list(Config) -> ?P(read_files), ?SKIP(not_implemented_yet). diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_log_test.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_log_test.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_log_test.erl 2009-03-12 12:31:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_log_test.erl 2009-09-18 15:13:10.000000000 +0100 @@ -71,7 +71,7 @@ %% External functions %%====================================================================== -init_per_testcase(Case, Config) when list(Config) -> +init_per_testcase(Case, Config) when is_list(Config) -> Dir = ?config(priv_dir, Config), LogTestDir = join(Dir, ?MODULE), CaseDir = join(LogTestDir, Case), @@ -87,7 +87,7 @@ Dog = ?WD_START(?MINS(5)), [{log_dir, CaseDir}, {watchdog, Dog}|Config]. -fin_per_testcase(_Case, Config) when list(Config) -> +fin_per_testcase(_Case, Config) when is_list(Config) -> %% Leave the dirs created above (enable debugging of the test case(s)) Dog = ?config(watchdog, Config), ?WD_STOP(Dog), @@ -114,7 +114,7 @@ %%====================================================================== open_and_close(suite) -> []; -open_and_close(Config) when list(Config) -> +open_and_close(Config) when is_list(Config) -> p(open_and_close), put(sname,open_and_close), put(verbosity,trace), @@ -133,7 +133,7 @@ %%====================================================================== open_write_and_close(suite) -> []; -open_write_and_close(Config) when list(Config) -> +open_write_and_close(Config) when is_list(Config) -> p(open_write_and_close), put(sname,open_write_and_close), put(verbosity,trace), @@ -189,7 +189,7 @@ log_to_io1(suite) -> []; log_to_io1(doc) -> "Log to io from the same process that opened " "and wrote the log"; -log_to_io1(Config) when list(Config) -> +log_to_io1(Config) when is_list(Config) -> p(log_to_io1), put(sname,l2i1), put(verbosity,trace), @@ -243,7 +243,7 @@ log_to_io2(suite) -> []; log_to_io2(doc) -> "Log to io from a different process than which " "opened and wrote the log"; -log_to_io2(Config) when list(Config) -> +log_to_io2(Config) when is_list(Config) -> process_flag(trap_exit, true), p(log_to_io2), put(sname, l2i2), @@ -303,7 +303,7 @@ %%====================================================================== log_to_txt1(suite) -> []; -log_to_txt1(Config) when list(Config) -> +log_to_txt1(Config) when is_list(Config) -> p(log_to_txt1), put(sname,l2t1), put(verbosity,trace), @@ -408,7 +408,7 @@ log_to_txt2(suite) -> []; log_to_txt2(doc) -> "Log to txt file from a different process than which " "opened and wrote the log"; -log_to_txt2(Config) when list(Config) -> +log_to_txt2(Config) when is_list(Config) -> process_flag(trap_exit, true), p(log_to_txt2), put(sname,l2t2), @@ -628,7 +628,7 @@ exit({failed_stopping_reader, timeout, Msg}) end. -log_reader_log_to(Pid, LogToFun) when function(LogToFun) -> +log_reader_log_to(Pid, LogToFun) when is_function(LogToFun) -> Pid ! {log_to, LogToFun, self()}, receive {log_to_reply, Res, Pid} -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_manager_config_test.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_manager_config_test.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_manager_config_test.erl 2009-03-12 12:31:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_manager_config_test.erl 2009-09-18 15:13:13.000000000 +0100 @@ -111,7 +111,7 @@ %% External functions %%====================================================================== -init_per_testcase(Case, Config) when list(Config) -> +init_per_testcase(Case, Config) when is_list(Config) -> p("init_per_testcase -> Case: ~p", [Case]), SnmpPrivDir = ?config(priv_dir, Config), p("init_per_testcase -> SnmpPrivDir: ~p", [SnmpPrivDir]), @@ -145,7 +145,7 @@ {manager_log_dir, MgrLogDir} | Config]. -fin_per_testcase(Case, Config) when list(Config) -> +fin_per_testcase(Case, Config) when is_list(Config) -> p("fin_per_testcase -> Case: ~p", [Case]), %% The cleanup is removed due to some really discusting NFS behaviour... %% CaseTopDir = ?config(manager_dir, Config), @@ -195,7 +195,7 @@ simple_start_and_stop(doc) -> "Start the snmp manager config process with the \n" "minimum setof options (config dir)."; -simple_start_and_stop(Conf) when list(Conf) -> +simple_start_and_stop(Conf) when is_list(Conf) -> put(tname,ssas), p("start"), process_flag(trap_exit, true), @@ -221,7 +221,7 @@ start_without_mandatory_opts1(doc) -> "Start the snmp manager config process with some of the \n" "mandatory options missing."; -start_without_mandatory_opts1(Conf) when list(Conf) -> +start_without_mandatory_opts1(Conf) when is_list(Conf) -> put(tname,swomo1), put(verbosity,trace), p("start"), @@ -250,7 +250,7 @@ start_without_mandatory_opts2(doc) -> "Start the snmp manager config process with some of the \n" "mandatory options missing."; -start_without_mandatory_opts2(Conf) when list(Conf) -> +start_without_mandatory_opts2(Conf) when is_list(Conf) -> put(tname,swomo2), put(verbosity,trace), p("start"), @@ -279,7 +279,7 @@ start_with_all_valid_opts(doc) -> "Start the snmp manager config process with the \n" "complete set of all the valid options."; -start_with_all_valid_opts(Conf) when list(Conf) -> +start_with_all_valid_opts(Conf) when is_list(Conf) -> put(tname,swavo), p("start"), process_flag(trap_exit, true), @@ -332,7 +332,7 @@ start_with_unknown_opts(doc) -> "Start the snmp manager config process when some of\n" "the options are unknown."; -start_with_unknown_opts(Conf) when list(Conf) -> +start_with_unknown_opts(Conf) when is_list(Conf) -> put(tname,swuo), p("start"), process_flag(trap_exit, true), @@ -385,7 +385,7 @@ start_with_incorrect_opts(doc) -> "Start the snmp manager config process when some of\n" "the options has incorrect values."; -start_with_incorrect_opts(Conf) when list(Conf) -> +start_with_incorrect_opts(Conf) when is_list(Conf) -> put(tname,swio), p("start"), process_flag(trap_exit, true), @@ -628,7 +628,7 @@ start_with_invalid_manager_conf_file1(suite) -> []; start_with_invalid_manager_conf_file1(doc) -> "Start with invalid manager config file (1)."; -start_with_invalid_manager_conf_file1(Conf) when list(Conf) -> +start_with_invalid_manager_conf_file1(Conf) when is_list(Conf) -> put(tname,swimcf), p("start"), process_flag(trap_exit, true), @@ -784,7 +784,7 @@ start_with_invalid_users_conf_file1(suite) -> []; start_with_invalid_users_conf_file1(doc) -> "Start with invalid users config file."; -start_with_invalid_users_conf_file1(Conf) when list(Conf) -> +start_with_invalid_users_conf_file1(Conf) when is_list(Conf) -> put(tname,swiucf), p("start"), process_flag(trap_exit, true), @@ -1283,7 +1283,7 @@ start_with_invalid_usm_conf_file1(suite) -> []; start_with_invalid_usm_conf_file1(doc) -> "Start with invalid usm config file."; -start_with_invalid_usm_conf_file1(Conf) when list(Conf) -> +start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) -> put(tname,swiusmcf), p("start"), process_flag(trap_exit, true), @@ -1639,7 +1639,7 @@ simple_system_op(doc) -> "Access some of the known system info and some \n" "system info that does not exist."; -simple_system_op(Conf) when list(Conf) -> +simple_system_op(Conf) when is_list(Conf) -> put(tname,sso), p("start"), ConfDir = ?config(manager_conf_dir, Conf), @@ -1689,7 +1689,7 @@ register_user_using_file(suite) -> []; register_user_using_file(doc) -> "Register user using the 'users.conf' file."; -register_user_using_file(Conf) when list(Conf) -> +register_user_using_file(Conf) when is_list(Conf) -> put(tname,ruufi), p("start"), process_flag(trap_exit, true), @@ -1705,7 +1705,7 @@ register_user_using_function(suite) -> []; register_user_using_function(doc) -> "Register user using the API (function)."; -register_user_using_function(Conf) when list(Conf) -> +register_user_using_function(Conf) when is_list(Conf) -> put(tname,ruufu), p("start"), process_flag(trap_exit, true), @@ -1721,7 +1721,7 @@ register_user_failed_using_function1(suite) -> []; register_user_failed_using_function1(doc) -> "Register user failed using incorrect arguments to API (function)."; -register_user_failed_using_function1(Conf) when list(Conf) -> +register_user_failed_using_function1(Conf) when is_list(Conf) -> put(tname,rufufu1), p("start"), process_flag(trap_exit, true), @@ -1751,7 +1751,7 @@ register_agent_using_file(suite) -> []; register_agent_using_file(doc) -> "Register agents using the 'agents'conf' file."; -register_agent_using_file(Conf) when list(Conf) -> +register_agent_using_file(Conf) when is_list(Conf) -> put(tname,raufi), p("start"), process_flag(trap_exit, true), @@ -1890,7 +1890,7 @@ register_agent_using_function(suite) -> []; register_agent_using_function(doc) -> "Register agents using the API (function)."; -register_agent_using_function(Conf) when list(Conf) -> +register_agent_using_function(Conf) when is_list(Conf) -> put(tname,raufu), p("start"), process_flag(trap_exit, true), @@ -1907,7 +1907,7 @@ register_agent_failed_using_function1(doc) -> "Register agents failng using the API (function) with incorrect " "config (1)."; -register_agent_failed_using_function1(Conf) when list(Conf) -> +register_agent_failed_using_function1(Conf) when is_list(Conf) -> put(tname,rafuf1), p("start"), process_flag(trap_exit, true), @@ -1938,7 +1938,7 @@ register_usm_user_using_file(suite) -> []; register_usm_user_using_file(doc) -> "Register usm user using the 'usm.conf' file."; -register_usm_user_using_file(Conf) when list(Conf) -> +register_usm_user_using_file(Conf) when is_list(Conf) -> put(tname,ruuufi), p("start"), process_flag(trap_exit, true), @@ -2022,7 +2022,7 @@ register_usm_user_using_function(suite) -> []; register_usm_user_using_function(doc) -> "Register usm user using the API (function)."; -register_usm_user_using_function(Conf) when list(Conf) -> +register_usm_user_using_function(Conf) when is_list(Conf) -> put(tname,ruuufu), p("start"), process_flag(trap_exit, true), @@ -2123,7 +2123,7 @@ register_usm_user_failed_using_function1(suite) -> []; register_usm_user_failed_using_function1(doc) -> "Register usm user failed using incorrect arguments to API (function)."; -register_usm_user_failed_using_function1(Conf) when list(Conf) -> +register_usm_user_failed_using_function1(Conf) when is_list(Conf) -> put(tname,ruufufu1), p("start"), process_flag(trap_exit, true), @@ -2152,7 +2152,7 @@ update_usm_user_info(suite) -> []; update_usm_user_info(doc) -> "Update usm user info."; -update_usm_user_info(Conf) when list(Conf) -> +update_usm_user_info(Conf) when is_list(Conf) -> put(tname,ruufufu1), p("start"), process_flag(trap_exit, true), @@ -2193,7 +2193,7 @@ create_and_increment(suite) -> []; create_and_increment(doc) -> "Craete and increment counters."; -create_and_increment(Conf) when list(Conf) -> +create_and_increment(Conf) when is_list(Conf) -> put(tname,cai), p("start"), process_flag(trap_exit, true), @@ -2244,7 +2244,7 @@ stats_create_and_increment(suite) -> []; stats_create_and_increment(doc) -> "Create and increment statistics counters."; -stats_create_and_increment(Conf) when list(Conf) -> +stats_create_and_increment(Conf) when is_list(Conf) -> put(tname,scai), p("start"), process_flag(trap_exit, true), @@ -2303,7 +2303,7 @@ []; otp_7219(doc) -> "Test-case for ticket OTP-7219"; -otp_7219(Config) when list(Config) -> +otp_7219(Config) when is_list(Config) -> put(tname, otp7219), p("start"), process_flag(trap_exit, true), diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_manager_test.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_manager_test.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_manager_test.erl 2009-06-05 13:55:52.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_manager_test.erl 2009-09-18 15:13:10.000000000 +0100 @@ -146,7 +146,7 @@ %% External functions %%====================================================================== -init_per_testcase(Case, Config) when list(Config) -> +init_per_testcase(Case, Config) when is_list(Config) -> io:format(user, "~n~n*** INIT ~w:~w ***~n~n", [?MODULE,Case]), init_per_testcase2(Case, Config). @@ -460,7 +460,7 @@ %%====================================================================== simple_start_and_stop1(suite) -> []; -simple_start_and_stop1(Config) when list(Config) -> +simple_start_and_stop1(Config) when is_list(Config) -> %% ?SKIP(not_yet_implemented), process_flag(trap_exit, true), put(tname,ssas1), @@ -493,7 +493,7 @@ %%====================================================================== simple_start_and_stop2(suite) -> []; -simple_start_and_stop2(Config) when list(Config) -> +simple_start_and_stop2(Config) when is_list(Config) -> %% ?SKIP(not_yet_implemented), process_flag(trap_exit, true), put(tname,ssas2), @@ -541,7 +541,7 @@ %%====================================================================== simple_start_and_monitor_crash1(suite) -> []; -simple_start_and_monitor_crash1(Config) when list(Config) -> +simple_start_and_monitor_crash1(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,ssamc1), p("starting with Config: ~n~p", [Config]), @@ -594,7 +594,7 @@ %%====================================================================== simple_start_and_monitor_crash2(suite) -> []; -simple_start_and_monitor_crash2(Config) when list(Config) -> +simple_start_and_monitor_crash2(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,ssamc2), p("starting with Config: ~n~p", [Config]), @@ -686,7 +686,7 @@ %%====================================================================== notify_started01(suite) -> []; -notify_started01(Config) when list(Config) -> +notify_started01(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,ns01), p("starting with Config: ~n~p", [Config]), @@ -774,7 +774,7 @@ %%====================================================================== notify_started02(suite) -> []; -notify_started02(Config) when list(Config) -> +notify_started02(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,ns02), p("starting with Config: ~n~p", [Config]), @@ -877,7 +877,7 @@ %%====================================================================== info(suite) -> []; -info(Config) when list(Config) -> +info(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,info), p("starting with Config: ~n~p", [Config]), @@ -910,7 +910,7 @@ p("end"), ok. -verify_info(Info) when list(Info) -> +verify_info(Info) when is_list(Info) -> Keys = [{server, [process_memory, db_memory]}, {config, [process_memory, db_memory]}, {net_if, [process_memory, port_info]}, @@ -922,7 +922,7 @@ verify_info([], _) -> ok; -verify_info([Key|Keys], Info) when atom(Key) -> +verify_info([Key|Keys], Info) when is_atom(Key) -> case lists:keymember(Key, 1, Info) of true -> verify_info(Keys, Info); @@ -946,7 +946,7 @@ %%====================================================================== register_user1(suite) -> []; -register_user1(Config) when list(Config) -> +register_user1(Config) when is_list(Config) -> %% ?SKIP(not_yet_implemented). process_flag(trap_exit, true), put(tname,ru1), @@ -2306,7 +2306,7 @@ simple_sync_get_bulk1(doc) -> ["Simple (sync) get_bulk-request - " "Old style (Addr & Port)"]; simple_sync_get_bulk1(suite) -> []; -simple_sync_get_bulk1(Config) when list(Config) -> +simple_sync_get_bulk1(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname, ssgb1), p("starting with Config: ~p~n", [Config]), @@ -2477,7 +2477,7 @@ simple_sync_get_bulk2(doc) -> ["Simple (sync) get_bulk-request - " "New style (TargetName)"]; simple_sync_get_bulk2(suite) -> []; -simple_sync_get_bulk2(Config) when list(Config) -> +simple_sync_get_bulk2(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname, ssgb2), p("starting with Config: ~p~n", [Config]), @@ -2612,7 +2612,7 @@ simple_async_get_bulk1(doc) -> ["Simple (async) get_bulk-request - " "Old style (Addr & Port)"]; simple_async_get_bulk1(suite) -> []; -simple_async_get_bulk1(Config) when list(Config) -> +simple_async_get_bulk1(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname, sagb1), p("starting with Config: ~p~n", [Config]), @@ -3086,7 +3086,7 @@ misc_async2(doc) -> ["Misc (async) request(s) - " "New style (TargetName)"]; misc_async2(suite) -> []; -misc_async2(Config) when list(Config) -> +misc_async2(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname, ms2), p("starting with Config: ~p~n", [Config]), @@ -3272,7 +3272,7 @@ %%====================================================================== discovery(suite) -> []; -discovery(Config) when list(Config) -> +discovery(Config) when is_list(Config) -> ?SKIP(not_yet_implemented). @@ -3335,7 +3335,7 @@ %%====================================================================== trap1(suite) -> []; -trap1(Config) when list(Config) -> +trap1(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,t1), p("starting with Config: ~p~n", [Config]), @@ -3486,7 +3486,7 @@ %%====================================================================== trap2(suite) -> []; -trap2(Config) when list(Config) -> +trap2(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,t2), p("starting with Config: ~p~n", [Config]), @@ -3677,7 +3677,7 @@ %%====================================================================== inform1(suite) -> []; -inform1(Config) when list(Config) -> +inform1(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,i1), p("starting with Config: ~p~n", [Config]), @@ -3717,7 +3717,7 @@ {async_event, From, {inform, Pid, Inform}} -> p("received inform"), case Inform of - {noError, 0, VBs} when list(VBs) -> + {noError, 0, VBs} when is_list(VBs) -> case (catch validate_testTrapv22_vbs(MgrNode, VBs)) of ok -> @@ -3754,7 +3754,7 @@ {async_event, From, {inform, Pid, Inform}} -> p("received inform"), case Inform of - {noError, 0, VBs} when list(VBs) -> + {noError, 0, VBs} when is_list(VBs) -> case (catch validate_testTrapv22_vbs(MgrNode, VBs)) of ok -> @@ -3802,7 +3802,7 @@ %%====================================================================== inform2(suite) -> []; -inform2(Config) when list(Config) -> +inform2(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,i2), p("starting with Config: ~p~n", [Config]), @@ -3899,7 +3899,7 @@ {async_event, From, {inform, Pid, Inform}} -> p("received inform"), case Inform of - {noError, 0, VBs} when list(VBs) -> + {noError, 0, VBs} when is_list(VBs) -> case (catch validate_testTrapv22_vbs(MgrNode, VBs)) of ok -> @@ -3972,7 +3972,7 @@ %%====================================================================== inform3(suite) -> []; -inform3(Config) when list(Config) -> +inform3(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,i3), p("starting with Config: ~p~n", [Config]), @@ -4030,7 +4030,7 @@ {async_event, From, {inform, Pid, Inform}} -> p("received inform"), case Inform of - {noError, 0, VBs} when list(VBs) -> + {noError, 0, VBs} when is_list(VBs) -> case (catch validate_testTrapv22_vbs(MgrNode, VBs)) of ok -> @@ -4106,7 +4106,7 @@ %%====================================================================== inform4(suite) -> []; -inform4(Config) when list(Config) -> +inform4(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname,i4), p("starting with Config: ~p~n", [Config]), @@ -4144,7 +4144,7 @@ {async_event, From, {inform, Pid, Inform}} -> p("received inform"), case Inform of - {noError, 0, VBs} when list(VBs) -> + {noError, 0, VBs} when is_list(VBs) -> case (catch validate_testTrapv22_vbs(MgrNode, VBs)) of ok -> @@ -4224,7 +4224,7 @@ %% Test: ts:run(snmp, snmp_manager_test, inform_swarm, [batch]). inform_swarm(suite) -> []; -inform_swarm(Config) when list(Config) -> +inform_swarm(Config) when is_list(Config) -> process_flag(trap_exit, true), put(tname, is), p("starting with Config: ~p~n", [Config]), @@ -4345,7 +4345,7 @@ {async_event, From, {inform, Pid, Inform}} -> p("received inform"), case Inform of - {noError, 0, VBs} when list(VBs) -> + {noError, 0, VBs} when is_list(VBs) -> Pid ! {handle_inform_response, From}, inform_swarm_collector(N, SentAckCnt, RecvCnt+1, RespCnt, Timeout); @@ -4384,7 +4384,7 @@ %%====================================================================== report(suite) -> []; -report(Config) when list(Config) -> +report(Config) when is_list(Config) -> ?SKIP(not_yet_implemented). @@ -4517,7 +4517,7 @@ purify_oid(Node, Oid) -> case mgr_user_purify_oid(Node, Oid) of - Oid2 when list(Oid2) -> + Oid2 when is_list(Oid2) -> Oid2; {error, _} = Error -> throw(Error) @@ -4689,24 +4689,24 @@ %% -- Misc application wrapper functions -- -load_app(Node, App) when Node == node(), atom(App) -> +load_app(Node, App) when (Node =:= node()) andalso is_atom(App) -> application:load(App); -load_app(Node, App) when atom(App) -> +load_app(Node, App) when is_atom(App) -> rcall(Node, application, load, [App]). -start_app(Node, App) when Node == node(), atom(App) -> +start_app(Node, App) when (Node =:= node()) andalso is_atom(App) -> application:start(App); start_app(Node, App) -> rcall(Node, application, start, [App]). -stop_app(Node, App) when Node == node(), atom(App) -> +stop_app(Node, App) when (Node =:= node()) andalso is_atom(App) -> application:stop(App); -stop_app(Node, App) when atom(App) -> +stop_app(Node, App) when is_atom(App) -> rcall(Node, application, stop, [App]). -set_app_env(Node, App, Key, Val) when Node == node(), atom(App) -> +set_app_env(Node, App, Key, Val) when (Node =:= node()) andalso is_atom(App) -> application:set_env(App, Key, Val); -set_app_env(Node, App, Key, Val) when atom(App) -> +set_app_env(Node, App, Key, Val) when is_atom(App) -> rcall(Node, application, set_env, [App, Key, Val]). @@ -4728,7 +4728,7 @@ %% mgr_register_user(Node, Id, Data) -> %% mgr_register_user(Node, Id, ?MODULE, Data). -mgr_register_user(Node, Id, Mod, Data) when atom(Mod) -> +mgr_register_user(Node, Id, Mod, Data) when is_atom(Mod) -> rcall(Node, snmpm, register_user, [Id, Mod, Data]). mgr_unregister_user(Node, Id) -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_manager_user.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_manager_user.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_manager_user.erl 2009-04-16 10:26:18.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_manager_user.erl 2009-09-18 15:13:21.000000000 +0100 @@ -804,7 +804,7 @@ %% ------------- -do_purify_oid([A|T]) when atom(A) -> +do_purify_oid([A|T]) when is_atom(A) -> case snmpm:name_to_oid(A) of {ok, [Oid|_]} -> verify_pure_oid(lists:flatten([Oid|T])); @@ -813,14 +813,14 @@ {error, _} = Error -> Error end; -do_purify_oid(L) when list(L) -> +do_purify_oid(L) when is_list(L) -> verify_pure_oid(lists:flatten(L)); do_purify_oid(X) -> {error, {unpure_oid, X}}. verify_pure_oid([]) -> []; -verify_pure_oid([H | T]) when is_integer(H) and (H >= 0) -> +verify_pure_oid([H | T]) when is_integer(H) andalso (H >= 0) -> [H | verify_pure_oid(T)]; verify_pure_oid([H | _]) -> throw({error, {not_pure_oid, H}}). @@ -837,7 +837,7 @@ call(Req) -> call(Req, 5000). -call(Req, To) when integer(To) -> +call(Req, To) when is_integer(To) -> Ref = make_ref(), ?SERVER ! {Req, self(), Ref}, receive diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_SUITE.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_SUITE.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_SUITE.erl 2009-03-12 12:28:20.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_SUITE.erl 2009-09-18 15:12:24.000000000 +0100 @@ -45,10 +45,10 @@ %% ----- %% -init_per_testcase(_Case, Config) when list(Config) -> +init_per_testcase(_Case, Config) when is_list(Config) -> Config. -fin_per_testcase(_Case, Config) when list(Config) -> +fin_per_testcase(_Case, Config) when is_list(Config) -> Config. diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_test_lib.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_test_lib.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_test_lib.erl 2009-06-05 13:26:43.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_test_lib.erl 2009-09-18 15:13:00.000000000 +0100 @@ -58,9 +58,9 @@ {ok, Ip} = snmp_misc:ip(net_adm:localhost()), Ip. -sz(L) when list(L) -> +sz(L) when is_list(L) -> length(L); -sz(B) when binary(B) -> +sz(B) when is_binary(B) -> size(B); sz(O) -> {unknown_size,O}. @@ -289,7 +289,7 @@ local_nodes() -> nodes_on(net_adm:localhost()). -nodes_on(Host) when list(Host) -> +nodes_on(Host) when is_list(Host) -> net_adm:world_list([list_to_atom(Host)]). @@ -302,7 +302,7 @@ %% Application and Crypto utility functions %% -is_app_running(App) when atom(App) -> +is_app_running(App) when is_atom(App) -> Apps = application:which_applications(), lists:keymember(App,1,Apps). @@ -427,7 +427,7 @@ %% file & dir functions %% -del_dir(Dir) when list(Dir) -> +del_dir(Dir) when is_list(Dir) -> (catch do_del_dir(Dir)). do_del_dir(Dir) -> @@ -484,7 +484,7 @@ %% cover functions %% -cover([Suite, Case] = Args) when atom(Suite), atom(Case) -> +cover([Suite, Case] = Args) when is_atom(Suite) andalso is_atom(Case) -> Mods0 = cover:compile_directory("../src"), Mods1 = [Mod || {ok, Mod} <- Mods0], snmp_test_server:t(Args), @@ -497,7 +497,7 @@ %% (debug) Print functions %% -p(Mod, Case) when is_atom(Mod) and is_atom(Case) -> +p(Mod, Case) when is_atom(Mod) andalso is_atom(Case) -> case get(test_case) of undefined -> put(test_case, Case), @@ -506,7 +506,7 @@ ok end; -p(F, A) when is_list(F) and is_list(A) -> +p(F, A) when is_list(F) andalso is_list(A) -> io:format(user, F ++ "~n", A). print(Prefix, Module, Line, Format, Args) -> diff -Nru erlang-13.b.1-dfsg/lib/snmp/test/snmp_test_mgr_misc.erl erlang-13.b.3-dfsg/lib/snmp/test/snmp_test_mgr_misc.erl --- erlang-13.b.1-dfsg/lib/snmp/test/snmp_test_mgr_misc.erl 2009-03-12 12:27:40.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/snmp/test/snmp_test_mgr_misc.erl 2009-09-18 15:12:14.000000000 +0100 @@ -51,7 +51,7 @@ start_link_packet(InHandler, AgentIp, UdpPort, TrapUdp, VsnHdr, Version, Dir, BufSz, - Dbg) when integer(UdpPort) -> + Dbg) when is_integer(UdpPort) -> Args = [self(), InHandler, AgentIp, UdpPort, TrapUdp, VsnHdr, Version, Dir, BufSz, @@ -99,19 +99,19 @@ init_usm(Version, Dir), packet_loop(SnmpMgr, UdpId, AgentIp, UdpPort, VsnHdr, Version, []). -init_debug(Dbg) when atom(Dbg) -> +init_debug(Dbg) when is_atom(Dbg) -> put(debug,Dbg), put(verbosity,silence); %% put(verbosity,trace); -init_debug(DbgOptions) when list(DbgOptions) -> +init_debug(DbgOptions) when is_list(DbgOptions) -> case lists:keysearch(debug, 1, DbgOptions) of - {value, {_, Dbg}} when atom(Dbg) -> + {value, {_, Dbg}} when is_atom(Dbg) -> put(debug, Dbg); _ -> put(debug, false) end, case lists:keysearch(verbosity, 1, DbgOptions) of - {value, {_, Ver}} when atom(ver) -> + {value, {_, Ver}} when is_atom(Ver) -> put(verbosity, Ver); _ -> put(verbosity, silence) @@ -141,7 +141,7 @@ case mk_msg(Version, Pdu, VsnHdr, MsgData) of error -> ok; - B when list(B) -> + B when is_list(B) -> udp_send(UdpId, AgentIp, UdpPort, B) end, packet_loop(SnmpMgr,UdpId,AgentIp,UdpPort,VsnHdr,Version,[]); @@ -156,7 +156,7 @@ error("Encoding error:" "~n Msg: ~w" "~n Reason: ~w",[Msg, Reason]); - B when list(B) -> + B when is_list(B) -> udp_send(UdpId, Ip, Udp, B) end, packet_loop(SnmpMgr,UdpId,AgentIp,UdpPort,VsnHdr,Version,[]); @@ -229,7 +229,7 @@ %% v1 or v2c d("handle_udp_packet -> version v1 or v2c"), case catch snmp_pdus:dec_pdu(Message#message.data) of - Pdu when record(Pdu, pdu) -> + Pdu when is_record(Pdu, pdu) -> case SnmpMgr of {pdu, Pid} -> d("handle_udp_packet -> " @@ -243,7 +243,7 @@ Msg = Message#message{data = Pdu}, Pid ! {snmp_msg, Msg, Ip, UdpPort} end; - Pdu when record(Pdu, trappdu) -> + Pdu when is_record(Pdu, trappdu) -> case SnmpMgr of {pdu, Pid} -> d("handle_udp_packet -> " @@ -402,7 +402,7 @@ "~n ErrorInfo: ~p", [ErrorInfo]), {Varbind, SecName, Opts} = ErrorInfo, ReqId = - if record(Data, scopedPdu) -> (Data#scopedPdu.data)#pdu.request_id; + if is_record(Data, scopedPdu) -> (Data#scopedPdu.data)#pdu.request_id; true -> 0 end, Pdu = #pdu{type = report, request_id = ReqId, @@ -527,7 +527,7 @@ "~n Pdu: ~w" "~n Reason: ~w",[Version, Pdu, Reason]), error; - B when list(B) -> + B when is_list(B) -> B end. @@ -638,10 +638,10 @@ display_msgSecurityParameters(_Model,Params) -> display_prop("msgSecurityParameters",Params). -display_usmSecurityParameters(P) when list(P) -> +display_usmSecurityParameters(P) when is_list(P) -> P1 = lists:flatten(P), display_usmSecurityParameters(snmp_pdus:dec_usm_security_parameters(P1)); -display_usmSecurityParameters(P) when record(P,usmSecurityParameters) -> +display_usmSecurityParameters(P) when is_record(P,usmSecurityParameters) -> ID = P#usmSecurityParameters.msgAuthoritativeEngineID, display_msgAuthoritativeEngineID(ID), Boots = P#usmSecurityParameters.msgAuthoritativeEngineBoots, @@ -675,9 +675,9 @@ display_msgPrivacyParameters(V) -> display_prop("msgPrivacyParameters",V). -display_msg_data('version-3',Direction,D) when record(D,scopedPdu) -> +display_msg_data('version-3',Direction,D) when is_record(D,scopedPdu) -> display_scoped_pdu(Direction,D); -display_msg_data(_Version,Direction,D) when record(D,pdu) -> +display_msg_data(_Version,Direction,D) when is_record(D,pdu) -> display_pdu(Direction,D); display_msg_data(_Version,_Direction,D) -> display_prop("Unknown message data",D). @@ -693,9 +693,9 @@ display_contextName(Name) -> display_prop("contextName",Name). -display_scoped_pdu_data(Direction,D) when record(D,pdu) -> +display_scoped_pdu_data(Direction,D) when is_record(D,pdu) -> display_pdu(Direction,D); -display_scoped_pdu_data(Direction,D) when record(D,trappdu) -> +display_scoped_pdu_data(Direction,D) when is_record(D,trappdu) -> display_trappdu(Direction,D); display_scoped_pdu_data(_Direction,D) -> display_prop("Unknown scoped pdu data",D). @@ -727,7 +727,7 @@ display_varbinds([]) -> ok. -display_varbind(V) when record(V,varbind) -> +display_varbind(V) when is_record(V,varbind) -> display_oid(V#varbind.oid), display_vtype(V#varbind.variabletype), display_value(V#varbind.value), @@ -765,9 +765,9 @@ %% Debug %%---------------------------------------------------------------------- -sz(L) when list(L) -> +sz(L) when is_list(L) -> length(lists:flatten(L)); -sz(B) when binary(B) -> +sz(B) when is_binary(B) -> size(B); sz(O) -> {unknown_size, O}. diff -Nru erlang-13.b.1-dfsg/lib/snmp/vsn.mk erlang-13.b.3-dfsg/lib/snmp/vsn.mk --- erlang-13.b.1-dfsg/lib/snmp/vsn.mk 2009-06-05 13:54:56.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/snmp/vsn.mk 2009-11-20 13:35:54.000000000 +0000 @@ -17,11 +17,19 @@ # # %CopyrightEnd% -SNMP_VSN = 4.13.3 +SNMP_VSN = 4.15 PRE_VSN = APP_VSN = "snmp-$(SNMP_VSN)$(PRE_VSN)" -TICKETS = OTP-8015 OTP-8020 +TICKETS = OTP-8229 OTP-8249 + +TICKETS_4_14 = OTP-8223 OTP-8228 OTP-8237 + +TICKETS_4_13_5 = OTP-8116 OTP-8120 OTP-8181 OTP-8182 + +TICKETS_4_13_4 = OTP-8044 OTP-8062 OTP-8098 + +TICKETS_4_13_3 = OTP-8015 OTP-8020 TICKETS_4_13_2 = OTP-7961 OTP-7977 OTP-7983 OTP-7989 diff -Nru erlang-13.b.1-dfsg/lib/ssh/doc/src/book.xml erlang-13.b.3-dfsg/lib/ssh/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/ssh/doc/src/book.xml 2007-11-30 14:56:40.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/doc/src/book.xml 2009-11-20 13:37:40.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2005 - 2007 - Ericsson AB, All Rights Reserved + 20052009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + SSH @@ -37,8 +35,11 @@ - + + + + diff -Nru erlang-13.b.1-dfsg/lib/ssh/doc/src/Makefile erlang-13.b.3-dfsg/lib/ssh/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/ssh/doc/src/Makefile 2009-03-12 12:31:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/doc/src/Makefile 2009-11-20 13:37:31.000000000 +0000 @@ -26,18 +26,21 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(SSH_VSN) +APPLICATION=ssh # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- -include make.dep +ifndef DOCSUPPORT +include make.dep +endif # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/ssh-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -72,6 +75,15 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) + +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ @@ -79,8 +91,8 @@ TEX_FILES_USERS_GUIDE = \ $(XML_CHAPTER_FILES:%.xml=%.tex) -TOP_PDF_FILE = ssh-$(VSN).pdf -TOP_PS_FILE = ssh-$(VSN).ps +TOP_PDF_FILE = $(APPLICATION)-$(VSN).pdf +TOP_PS_FILE = $(APPLICATION)-$(VSN).ps $(TOP_PDF_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ @@ -88,6 +100,8 @@ $(TOP_PS_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +endif + # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- @@ -100,6 +114,24 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ +ifdef DOCSUPPORT + +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: $(HTML_REF_MAN_FILE) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + +else + ifeq ($(DOCTYPE),pdf) docs: pdf else @@ -116,21 +148,38 @@ html: $(HTML_FILES) -man: $(MAN3_FILES) - -debug opt: - clean clean_docs clean_tex: rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) rm -f $(HTML_FILES) $(MAN3_FILES) rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) +endif + +man: $(MAN3_FILES) + + +debug opt: + + # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 +else + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -151,4 +200,6 @@ endif endif +endif + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/ssh/doc/src/notes.xml erlang-13.b.3-dfsg/lib/ssh/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/ssh/doc/src/notes.xml 2009-06-05 13:55:58.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/doc/src/notes.xml 2009-11-20 13:37:33.000000000 +0000 @@ -29,6 +29,147 @@ notes.xml
    +
    Ssh 1.1.7 + +
    Fixed Bugs and Malfunctions + + +

    + Now clear all processes when a connnection is terminated.

    +

    + Own Id: OTP-8121 Aux Id:

    +
    + +

    + In some rare cases the connection handler could enter an infinite loop.

    +

    + Own Id: OTP-8277 Aux Id: seq11428

    +
    + +

    + If an SFTP server did not respond with EOF, the function + ssh_sftp:list_dir/2/3 would enter an infinite loop.

    +

    + Own Id: OTP-8278 Aux Id: seq11450

    +
    +
    +
    + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools (xsltproc and fop) + that exists on most platforms. One visible change is that the frames are removed.

    +

    + Own Id: OTP-8201 Aux Id:

    +
    +
    +
    + +
    + +
    Ssh 1.1.6 + +
    Fixed Bugs and Malfunctions + + +

    + ssh_sftp:start_channel did not handle all possible return + values from ssh_channel:start correctly. +

    +

    + Own Id: OTP-8176 Aux Id:

    +
    + +

    + SFTPD did not handle rename command (version 4) correctly. +

    +

    + Own Id: OTP-8175 Aux Id: seq11373

    +
    + +

    + If a connection manager already had been terminated it could cause a channel + to generate a crash report when it was about to stop. +

    +

    + Own Id: OTP-8174 Aux Id: seq11377

    +
    + +

    + Requests could result in badarg or badmatch EXIT messages in the connection + manager if the channel no longer existed.

    +

    + Own Id: OTP-8173 Aux Id: seq11379

    +
    + +

    + ssh_transport:unpack/3 could cause a badarg error.

    +

    + Own Id: OTP-8162 Aux Id:

    +
    +
    +
    + +
    Improvements and New Features + + +

    + The encryption algorithm aes128-cbc is now supported. + Requires that crypto-1.6.1 is available.

    +

    + Own Id: OTP-8110 Aux Id:

    +
    +
    +
    + +
    + + +
    Ssh 1.1.5 + +
    Fixed Bugs and Malfunctions + + +

    + ssh_sftp:start_channel/3 did not handle timout correctly.

    +

    + Own Id: OTP-8159 Aux Id: seq11386

    +
    + +

    + If a progress message was not recieved after invoking ssh:connect/3 + the call could hang for ever. A timeout option has also been added.

    +

    + Own Id: OTP-8160 Aux Id: seq11386

    +
    + +

    + A comma has been missing in the ssh.appup file since SSH-1.0.2.

    +

    + Own Id: OTP-8161 Aux Id:

    +
    +
    +
    + +
    + +
    Ssh 1.1.4 + +
    Fixed Bugs and Malfunctions + + +

    + SSH sometimes caused a crash report at disconnect.

    +

    + Own Id: OTP-8071 Aux Id: seq11319

    +
    +
    +
    + +
    +
    Ssh 1.1.3
    Fixed Bugs and Malfunctions @@ -78,7 +219,7 @@

    - A crash occured if a non-valid channel reference were recieved.

    + A crash occurred if a non-valid channel reference was received.

    Own Id: OTP-7918 Aux Id: seq11238

    @@ -90,7 +231,7 @@

    - It was not posssible to start a SFTP subsystem on certain plattforms, + It was not possible to start a SFTP subsystem on certain platforms, i.e. those who do not support symbolic links.

    Own Id: OTP-7930 Aux Id:

    @@ -200,10 +341,10 @@

    - A flaw in the implementation of the supervison tree - caused the ssh deamon to close the connections to all + A flaw in the implementation of the supervision tree + caused the ssh daemon to close the connections to all currently logged in users if one user logged out. Another - problem related to the supervison tree caused the closing + problem related to the supervision tree caused the closing down of clients to leak processes e.i. all processes was not shutdown correctly.

    @@ -361,7 +502,7 @@

    A few minor bugs where fixed in ssh_userreg.erl and ssh_connection_manager and a a ssh_cli option was added - to restore backwards compatiblity with the old ssh_cm - + to restore backwards compatibility with the old ssh_cm - API.

    Own Id: OTP-7565

    @@ -440,8 +581,8 @@
    -

    For information about older versions see - release notes history.

    +
    diff -Nru erlang-13.b.1-dfsg/lib/ssh/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/ssh/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/ssh/doc/src/part_notes.xml 2009-03-12 12:31:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/doc/src/part_notes.xml 2009-11-20 13:37:34.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20042009 @@ -33,6 +33,6 @@

    For information about older versions see release notes history.

    - + diff -Nru erlang-13.b.1-dfsg/lib/ssh/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/ssh/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/ssh/doc/src/ref_man.xml 2009-03-12 12:31:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/doc/src/ref_man.xml 2009-11-20 13:37:33.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20042009 @@ -32,10 +32,10 @@

    The SSH application is an erlang implementation of the secure shell protocol.

    - - - - - + + + + + diff -Nru erlang-13.b.1-dfsg/lib/ssh/doc/src/ssh_channel.xml erlang-13.b.3-dfsg/lib/ssh/doc/src/ssh_channel.xml --- erlang-13.b.1-dfsg/lib/ssh/doc/src/ssh_channel.xml 2009-03-12 12:34:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/doc/src/ssh_channel.xml 2009-11-20 13:37:50.000000000 +0000 @@ -56,7 +56,7 @@

    string() = list of ASCII characters

    timeout() = infinity | integer() - in milliseconds.

    ssh_connection_ref() - opaque to the user returned by - ssh:connect/[1,2,3] or sent to a ssh channel process

    + ssh:connect/3 or sent to a ssh channel process

    ssh_channel_id() = integer()

    ssh_data_type_code() = 1 ("stderr") | 0 ("normal") are currently valid values see RFC 4254 section 5.2.

    @@ -217,7 +217,7 @@
    - + CALLBACK TIMEOUTS

    If an integer timeout value is provided in a return value of one of the callback functions, a timeout will occur unless a @@ -334,7 +334,7 @@

    For more detailed information on timeouts see the section CALLBACK TIMEOUTS.

    - + diff -Nru erlang-13.b.1-dfsg/lib/ssh/doc/src/ssh_connection.xml erlang-13.b.3-dfsg/lib/ssh/doc/src/ssh_connection.xml --- erlang-13.b.1-dfsg/lib/ssh/doc/src/ssh_connection.xml 2009-03-12 12:33:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/doc/src/ssh_connection.xml 2009-11-20 13:37:49.000000000 +0000 @@ -50,7 +50,7 @@

    string() = list of ASCII characters

    timeout() = infinity | integer() - in milliseconds.

    ssh_connection_ref() - opaque to the user returned by - ssh:connect/[1,2,3] or sent to a ssh channel processes

    + ssh:connect/3 or sent to a ssh channel processes

    ssh_channel_id() = integer()

    ssh_data_type_code() = 1 ("stderr") | 0 ("normal") are currently valid values see RFC 4254 section 5.2.

    @@ -91,7 +91,7 @@ - close(ConnectionRef, ChannelId) -> ok + close(ConnectionRef, ChannelId) -> ok Sends a close message on the channel ChannelId. ConnectionRef = ssh_connection_ref() diff -Nru erlang-13.b.1-dfsg/lib/ssh/doc/src/ssh_sftpd.xml erlang-13.b.3-dfsg/lib/ssh/doc/src/ssh_sftpd.xml --- erlang-13.b.1-dfsg/lib/ssh/doc/src/ssh_sftpd.xml 2009-04-16 10:26:19.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/doc/src/ssh_sftpd.xml 2009-11-20 13:37:39.000000000 +0000 @@ -45,12 +45,12 @@ subsystem using the ssh_channel behavior see ssh_channel(3)

    channel_init_args() = list() - The one given as argument to function - subssystem_spec/1.

    + subsystem_spec/1.

    - subsystem_spec(Options) -> subssystem_spec() - Returns the subsystem specification that allows an ssh daemon to handle the subssystem "sftp". + subsystem_spec(Options) -> subsystem_spec() + Returns the subsystem specification that allows an ssh daemon to handle the subsystem "sftp". Options = [{Option, Value}] diff -Nru erlang-13.b.1-dfsg/lib/ssh/doc/src/ssh_sftp.xml erlang-13.b.3-dfsg/lib/ssh/doc/src/ssh_sftp.xml --- erlang-13.b.1-dfsg/lib/ssh/doc/src/ssh_sftp.xml 2009-03-12 12:32:26.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/doc/src/ssh_sftp.xml 2009-11-20 13:37:39.000000000 +0000 @@ -45,7 +45,7 @@ and/or abstractions to indicate the intended use of the data type:

    ssh_connection_ref() - opaque to the user - returned by ssh:connect/[1,2,3]

    + returned by ssh:connect/3

    timeout() = infinity | integer() - in milliseconds.

    @@ -88,7 +88,7 @@

    All other options are directly passed to - ssh:connect[2/3] or ignored if a + ssh:connect/3 or ignored if a connection is already provided.

    @@ -128,7 +128,7 @@ ChannelPid = pid() File = string() - Data = binary() + Iolist = iolist() Timeout = timeout() Reason = term() diff -Nru erlang-13.b.1-dfsg/lib/ssh/doc/src/ssh.xml erlang-13.b.3-dfsg/lib/ssh/doc/src/ssh.xml --- erlang-13.b.1-dfsg/lib/ssh/doc/src/ssh.xml 2009-03-12 12:31:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/doc/src/ssh.xml 2009-11-20 13:37:34.000000000 +0000 @@ -46,7 +46,7 @@

    ssh_daemon_ref() - opaque to the user returned by ssh:daemon/[1,2,3]

    ssh_connection_ref() - opaque to the user - returned by ssh:connect/[1,2,3]

    + returned by ssh:connect/3

    ip_address() - {N1,N2,N3,N4} % IPv4 | {K1,K2,K3,K4,K5,K6,K7,K8} % IPv6

    subsystem_spec() = {subsystem_name(), {channel_callback(), channel_init_args()}}

    @@ -70,9 +70,8 @@ - connect(Host) -> - connect(Host, Options) -> - connect(Host, Port, Options) -> {ok, ssh_connection_ref()} + connect(Host, Port, Options) -> + connect(Host, Port, Options, Timeout) -> {ok, ssh_connection_ref()} | {error, Reason} Connect to an ssh server. @@ -80,10 +79,11 @@ Port = integer() The default is , the registered port for SSH. Options = [{Option, Value}] + Timeout = infinity | integer(milliseconds)

    Connects to an SSH server. No channel is started this is done - by calling ssh_connect:session_cahnnel/2.

    + by calling ssh_connect:session_channel/2.

    Options are:

    @@ -92,7 +92,7 @@ ssh configuration files for the user such as , and . Defaults to the directory normally - referd to as

    + referred to as

    @@ -197,7 +197,7 @@ Provides specifications for handling of subsystems. The - "sftp" subsystem-spec can be retrived by calling + "sftp" subsystem-spec can be retrieved by calling ssh_sftd:subsystem_spec/1. If the subsystems option in not present the value of [ssh_sftd:subsystem_spec([])] will be used. It is of course possible to set the option to the empty list @@ -264,7 +264,7 @@ Host = string() Port = integer() - Options - see ssh:connect/[1,2,3] + Options - see ssh:connect/3

    Starts an interactive shell to an SSH server on the @@ -302,8 +302,8 @@ - stop_daemon(DaemonRef) -> - stop_daemon(Address, Port) -> ok + stop_daemon(DaemonRef) -> + stop_daemon(Address, Port) -> ok Stops the listener and all connections started by the listener. diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/Makefile erlang-13.b.3-dfsg/lib/ssh/src/Makefile --- erlang-13.b.1-dfsg/lib/ssh/src/Makefile 2009-06-05 13:55:58.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/Makefile 2009-11-20 13:37:32.000000000 +0000 @@ -43,9 +43,9 @@ sshd_sup \ ssh_channel \ ssh_connection \ - ssh_connection_sup \ ssh_connection_handler \ ssh_connection_manager \ + ssh_connection_controler \ ssh_shell \ ssh_system_sup \ ssh_subsystem_sup \ diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_acceptor.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_acceptor.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_acceptor.erl 2009-03-12 12:33:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_acceptor.erl 2009-11-20 13:37:49.000000000 +0000 @@ -82,7 +82,7 @@ ssh_system_sup:start_subsystem(SystemSup, Options), ConnectionSup = ssh_system_sup:connection_supervisor(SystemSup), {ok, Pid} = - ssh_connection_sup:start_manager_child(ConnectionSup, + ssh_connection_controler:start_manager_child(ConnectionSup, [server, Socket, Options]), Callback:controlling_process(Socket, Pid), SshOpts = proplists:get_value(ssh_opts, Options), diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh.app.src erlang-13.b.3-dfsg/lib/ssh/src/ssh.app.src --- erlang-13.b.1-dfsg/lib/ssh/src/ssh.app.src 2009-03-12 12:31:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh.app.src 2009-11-20 13:37:32.000000000 +0000 @@ -18,7 +18,7 @@ ssh_connection, ssh_connection_handler, ssh_connection_manager, - ssh_connection_sup, + ssh_connection_controler, ssh_shell, sshc_sup, sshd_sup, diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh.appup.src erlang-13.b.3-dfsg/lib/ssh/src/ssh.appup.src --- erlang-13.b.1-dfsg/lib/ssh/src/ssh.appup.src 2009-06-05 13:55:58.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh.appup.src 2009-11-20 13:37:32.000000000 +0000 @@ -1,33 +1,36 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + {"%VSN%", [ - {"1.1.2", [{load_module, ssh_acceptor_sup, soft_purge, soft_purge, []}, - {load_module, ssh_connection_sup, soft_purge, soft_purge, []}, - {load_module, sshd_sup, soft_purge, soft_purge, []}, - {load_module, ssh_subsystem_sup, soft_purge, soft_purge, []}, - {load_module, ssh_bits, soft_purge, soft_purge, []}, - {load_module, ssh_cli, soft_purge, soft_purge, []}, - {load_module, ssh_connection, soft_purge, soft_purge, []}, - {load_module, ssh_io, soft_purge, soft_purge, []}, - {load_module, ssh_sftp, soft_purge, soft_purge, []}, - {load_module, ssh_transport, soft_purge, soft_purge, []}, - {load_module, ssh_xfer, soft_purge, soft_purge, []}, - {load_module, ssh_connection_manager, soft_purge, soft_purge, []} - ]} - ] + {"1.1.6", [{restart_application, ssh}]}, + {"1.1.5", [{restart_application, ssh}]}, + {"1.1.4", [{restart_application, ssh}]}, + {"1.1.3", [{restart_application, ssh}]}, + {"1.1.2", [{restart_application, ssh}]} + ], [ - {"1.1.2", [{load_module, ssh_acceptor_sup, soft_purge, soft_purge, []}, - {load_module, ssh_connection_sup, soft_purge, soft_purge, []}, - {load_module, sshd_sup, soft_purge, soft_purge, []}, - {load_module, ssh_subsystem_sup, soft_purge, soft_purge, []}, - {load_module, ssh_bits, soft_purge, soft_purge, []}, - {load_module, ssh_cli, soft_purge, soft_purge, []}, - {load_module, ssh_connection, soft_purge, soft_purge, []}, - {load_module, ssh_io, soft_purge, soft_purge, []}, - {load_module, ssh_sftp, soft_purge, soft_purge, []}, - {load_module, ssh_transport, soft_purge, soft_purge, []}, - {load_module, ssh_xfer, soft_purge, soft_purge, []}, - {load_module, ssh_connection_manager, soft_purge, soft_purge, []} - ]} + {"1.1.6", [{restart_application, ssh}]}, + {"1.1.5", [{restart_application, ssh}]}, + {"1.1.4", [{restart_application, ssh}]}, + {"1.1.3", [{restart_application, ssh}]}, + {"1.1.2", [{restart_application, ssh}]} ] }. diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_channel.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_channel.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_channel.erl 2009-03-12 12:33:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_channel.erl 2009-09-18 15:13:36.000000000 +0100 @@ -26,7 +26,7 @@ -behaviour(gen_server). %%% API --export([behaviour_info/1, start/4, start_link/4, call/2, call/3, +-export([behaviour_info/1, start/4, start/5, start_link/4, start_link/5, call/2, call/3, cast/2, reply/2, enter_loop/1]). %% gen_server callbacks @@ -92,17 +92,25 @@ %% Description: Starts the server %%-------------------------------------------------------------------- start(ConnectionManager, ChannelId, CallBack, CbInitArgs) -> + start(ConnectionManager, ChannelId, CallBack, CbInitArgs, undefined). + +start(ConnectionManager, ChannelId, CallBack, CbInitArgs, Exec) -> Options = [{channel_cb, CallBack}, {channel_id, ChannelId}, {init_args, CbInitArgs}, - {cm, ConnectionManager}], + {cm, ConnectionManager}, + {exec, Exec}], gen_server:start(?MODULE, [Options], []). start_link(ConnectionManager, ChannelId, CallBack, CbInitArgs) -> + start_link(ConnectionManager, ChannelId, CallBack, CbInitArgs, undefined). + +start_link(ConnectionManager, ChannelId, CallBack, CbInitArgs, Exec) -> Options = [{channel_cb, CallBack}, {channel_id, ChannelId}, {init_args, CbInitArgs}, - {cm, ConnectionManager}], + {cm, ConnectionManager}, + {exec, Exec}], gen_server:start_link(?MODULE, [Options], []). enter_loop(State) -> @@ -124,7 +132,14 @@ ConnectionManager = proplists:get_value(cm, Options), ChannelId = proplists:get_value(channel_id, Options), process_flag(trap_exit, true), - try Cb:init(proplists:get_value(init_args, Options)) of + InitArgs = + case proplists:get_value(exec, Options) of + undefined -> + proplists:get_value(init_args, Options); + Exec -> + proplists:get_value(init_args, Options) ++ [Exec] + end, + try Cb:init(InitArgs) of {ok, ChannelState} -> State = #state{cm = ConnectionManager, channel_cb = Cb, @@ -138,7 +153,9 @@ channel_id = ChannelId, channel_state = ChannelState}, self() ! {ssh_channel_up, ChannelId, ConnectionManager}, - {ok, State, Timeout} + {ok, State, Timeout}; + {stop, Why} -> + {stop, Why} catch _:Reason -> {stop, Reason} @@ -194,7 +211,8 @@ handle_info({ssh_cm, ConnectionManager, {closed, ChannelId}}, #state{cm = ConnectionManager, close_sent = false} = State) -> - ssh_connection:close(ConnectionManager, ChannelId), + %% To be on the safe side, i.e. the manager has already been terminated. + (catch ssh_connection:close(ConnectionManager, ChannelId)), {stop, normal, State}; handle_info({ssh_cm, _, _} = Msg, #state{cm = ConnectionManager, diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_cli.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_cli.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_cli.erl 2009-06-05 13:56:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_cli.erl 2009-09-18 13:47:53.000000000 +0100 @@ -42,7 +42,8 @@ pty, group, buf, - shell + shell, + exec }). %%==================================================================== @@ -54,6 +55,8 @@ %% %% Description: Initiates the CLI %%-------------------------------------------------------------------- +init([Shell, Exec]) -> + {ok, #state{shell = Shell, exec = Exec}}; init([Shell]) -> {ok, #state{shell = Shell}}. @@ -109,7 +112,7 @@ cm = ConnectionManager}}; handle_ssh_msg({ssh_cm, ConnectionManager, - {exec, ChannelId, WantReply, Cmd}}, State) -> + {exec, ChannelId, WantReply, Cmd}}, #state{exec=undefined} = State) -> {Reply, Status} = exec(Cmd), write_chars(ConnectionManager, ChannelId, io_lib:format("~p\n", [Reply])), @@ -118,6 +121,13 @@ ssh_connection:exit_status(ConnectionManager, ChannelId, Status), ssh_connection:send_eof(ConnectionManager, ChannelId), {stop, ChannelId, State#state{channel = ChannelId, cm = ConnectionManager}}; +handle_ssh_msg({ssh_cm, ConnectionManager, + {exec, ChannelId, WantReply, Cmd}}, State) -> + NewState = start_shell(ConnectionManager, Cmd, State), + ssh_connection:reply_request(ConnectionManager, WantReply, + success, ChannelId), + {ok, NewState#state{channel = ChannelId, + cm = ConnectionManager}}; handle_ssh_msg({ssh_cm, _ConnectionManager, {eof, _ChannelId}}, State) -> {ok, State}; @@ -430,6 +440,11 @@ Group = group:start(self(), ShellFun, [{echo, Echo}]), State#state{group = Group, buf = empty_buf()}. +start_shell(_ConnectionManager, Cmd, #state{exec={M, F, A}} = State) -> + Group = group:start(self(), {M, F, A++[Cmd]}, [{echo,false}]), + State#state{group = Group, buf = empty_buf()}. + + % Pty can be undefined if the client never sets any pty options before % starting the shell. get_echo(undefined) -> diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_connect.hrl erlang-13.b.3-dfsg/lib/ssh/src/ssh_connect.hrl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_connect.hrl 2009-03-12 12:32:20.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_connect.hrl 2009-09-18 13:47:52.000000000 +0100 @@ -259,5 +259,6 @@ cli_spec, address, port, - options + options, + exec }). diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_connection_controler.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_connection_controler.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_connection_controler.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_connection_controler.erl 2009-11-20 13:37:51.000000000 +0000 @@ -0,0 +1,137 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%-------------------------------------------------------------------- +%% File : ssh_connection_controler.erl +%% Description : +%% +%%-------------------------------------------------------------------- + +-module(ssh_connection_controler). + +-behaviour(gen_server). + +%%----------------------------------------------------------------- +%% External exports +%%----------------------------------------------------------------- +-export([start_link/1, start_handler_child/2, start_manager_child/2, + connection_manager/1]). + +%%----------------------------------------------------------------- +%% Internal exports +%%----------------------------------------------------------------- +-export([init/1, handle_call/3, handle_cast/2, handle_info/2, + code_change/3, terminate/2, stop/1]). + +-record(state, {role, manager, handler, timeout}). + +%%----------------------------------------------------------------- +%% External interface functions +%%----------------------------------------------------------------- +%%----------------------------------------------------------------- +%% Func: start/0 +%%----------------------------------------------------------------- +start_link(Args) -> + gen_server:start_link(?MODULE, [Args], []). + +%% Will be called from the manager child process +start_handler_child(ServerRef, Args) -> + gen_server:call(ServerRef, {handler, self(), Args}, infinity). + +%% Will be called from the acceptor process +start_manager_child(ServerRef, Args) -> + gen_server:call(ServerRef, {manager, Args}, infinity). + +connection_manager(ServerRef) -> + {ok, gen_server:call(ServerRef, manager, infinity)}. + +%%----------------------------------------------------------------- +%% Internal interface functions +%%----------------------------------------------------------------- +%%----------------------------------------------------------------- +%% Func: stop/1 +%%----------------------------------------------------------------- +stop(Pid) -> + gen_server:cast(Pid, stop). + +%%----------------------------------------------------------------- +%% Server functions +%%----------------------------------------------------------------- +%%----------------------------------------------------------------- +%% Func: init/1 +%%----------------------------------------------------------------- +init([Opts]) -> + process_flag(trap_exit, true), + case proplists:get_value(role, Opts) of + client -> + {ok, Manager} = ssh_connection_manager:start_link([client, Opts]), + {ok, #state{role = client, manager = Manager}}; + _server -> + %% Children started by acceptor process + {ok, #state{role = server}} + end. + + +%%----------------------------------------------------------------- +%% Func: terminate/2 +%%----------------------------------------------------------------- +terminate(_Reason, #state{}) -> + ok. + +%%----------------------------------------------------------------- +%% Func: handle_call/3 +%%----------------------------------------------------------------- +handle_call({handler, Pid, [Role, Socket, Opts]}, _From, State) -> + {ok, Handler} = ssh_connection_handler:start_link(Role, Pid, Socket, Opts), + {reply, {ok, Handler}, State#state{handler = Handler}}; +handle_call({manager, [server = Role, Socket, Opts]}, _From, State) -> + {ok, Manager} = ssh_connection_manager:start_link([Role, Socket, Opts]), + {reply, {ok, Manager}, State#state{manager = Manager}}; +handle_call({manager, [client = Role | Opts]}, _From, State) -> + {ok, Manager} = ssh_connection_manager:start_link([Role, Opts]), + {reply, {ok, Manager}, State#state{manager = Manager}}; +handle_call(manager, _From, State) -> + {reply, State#state.manager, State}; +handle_call(stop, _From, State) -> + {stop, normal, ok, State}; +handle_call(_, _, State) -> + {noreply, State, State#state.timeout}. + +%%----------------------------------------------------------------- +%% Func: handle_cast/2 +%%----------------------------------------------------------------- +handle_cast(stop, State) -> + {stop, normal, State}; +handle_cast(_, State) -> + {noreply, State, State#state.timeout}. + +%%----------------------------------------------------------------- +%% Func: handle_info/2 +%%----------------------------------------------------------------- +%% handle_info(ssh_connected, State) -> +%% {stop, normal, State}; +%% Servant termination. +handle_info({'EXIT', _Pid, normal}, State) -> + {stop, normal, State}. + +%%----------------------------------------------------------------- +%% Func: code_change/3 +%%----------------------------------------------------------------- +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_connection.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_connection.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_connection.erl 2009-06-05 13:56:10.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_connection.erl 2009-09-18 13:47:57.000000000 +0100 @@ -945,7 +945,10 @@ end. start_channel(Address, Port, Cb, Id, Args) -> - ChildSpec = child_spec(Cb, Id, Args), + start_channel(Address, Port, Cb, Id, Args, undefined). + +start_channel(Address, Port, Cb, Id, Args, Exec) -> + ChildSpec = child_spec(Cb, Id, Args, Exec), SystemSup = ssh_system_sup:system_supervisor(Address, Port), ChannelSup = ssh_system_sup:channel_supervisor(SystemSup), ssh_channel_sup:start_child(ChannelSup, ChildSpec). @@ -993,9 +996,9 @@ Value end. -child_spec(Callback, Id, Args) -> +child_spec(Callback, Id, Args, Exec) -> Name = make_ref(), - StartFunc = {ssh_channel, start_link, [self(), Id, Callback, Args]}, + StartFunc = {ssh_channel, start_link, [self(), Id, Callback, Args, Exec]}, Restart = temporary, Shutdown = 3600, Type = worker, @@ -1013,8 +1016,8 @@ end; start_cli(#connection{address = Address, port = Port, - cli_spec = {CbModule, Args}}, ChannelId) -> - start_channel(Address, Port, CbModule, ChannelId, Args). + cli_spec = {CbModule, Args}, exec = Exec}, ChannelId) -> + start_channel(Address, Port, CbModule, ChannelId, Args, Exec). start_subsytem(BinName, #connection{address = Address, port = Port, options = Options}, diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_connection_handler.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_connection_handler.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_connection_handler.erl 2009-03-12 12:33:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_connection_handler.erl 2009-11-20 13:37:49.000000000 +0000 @@ -16,9 +16,7 @@ %% %% %CopyrightEnd% %% - %% - %%---------------------------------------------------------------------- %% Purpose: Handles the setup of an ssh connection, e.i. both the %% setup SSH Transport Layer Protocol (RFC 4253) and Authentication @@ -369,8 +367,19 @@ manager = Pid} = State) -> case ssh_auth:userauth_request_msg(Ssh0) of {disconnect, Event, {Msg, _}} -> - send_msg(Msg, State), - ssh_connection_manager:event(Pid, Event), + try + send_msg(Msg, State), + ssh_connection_manager:event(Pid, Event) + catch + exit:{noproc, _Reason} -> + Report = io_lib:format("Connection Manager terminated: ~p~n", + [Pid]), + error_logger:info_report(Report); + exit:Exit -> + Report = io_lib:format("Connection Manager returned:~n~p~n~p~n", + [Msg, Exit]), + error_logger:info_report(Report) + end, {stop, normal, State}; {Msg, Ssh} -> send_msg(Msg, State), @@ -427,7 +436,7 @@ handle_event(#ssh_msg_disconnect{} = Msg, _StateName, #state{manager = Pid} = State) -> - ssh_connection_manager:event(Pid, Msg), + (catch ssh_connection_manager:event(Pid, Msg)), {stop, normal, State}; handle_event(#ssh_msg_ignore{}, StateName, State) -> @@ -571,7 +580,8 @@ %%-------------------------------------------------------------------- terminate(normal, _, #state{transport_cb = Transport, socket = Socket}) -> - Transport:close(Socket); + (catch Transport:close(Socket)), + ok; terminate(shutdown, _, State) -> DisconnectMsg = @@ -724,7 +734,7 @@ encoded_data_buffer = Buff, socket = Socket, transport_protocol = Protocol} = - State) when Buff =/= <<>> -> + State) when Buff =/= <<>> andalso size(Buff) >= 8 -> %% More data from the next packet has been received %% Fake a socket-recive message so that the data will be processed self() ! {Protocol, Socket, <<>>} , @@ -785,7 +795,7 @@ %% Important to be set for %% next_packet decoded_data_buffer = <<>>}, EncData); - false -> + false -> DisconnectMsg = #ssh_msg_disconnect{code = ?SSH_DISCONNECT_PROTOCOL_ERROR, description = "Bad mac", @@ -796,9 +806,19 @@ handle_disconnect(#ssh_msg_disconnect{} = Msg, #state{ssh_params = Ssh0, manager = Pid} = State) -> {SshPacket, Ssh} = ssh_transport:ssh_packet(Msg, Ssh0), - send_msg(SshPacket, State), - ssh_connection_manager:event(Pid, Msg), - %%ok = ssh_connection_manager:delivered(Pid), + try + send_msg(SshPacket, State), + ssh_connection_manager:event(Pid, Msg) + catch + exit:{noproc, _Reason} -> + Report = io_lib:format("~p Connection Manager terminated: ~p~n", + [self(), Pid]), + error_logger:info_report(Report); + exit:Exit -> + Report = io_lib:format("Connection Manager returned:~n~p~n~p~n", + [Msg, Exit]), + error_logger:info_report(Report) + end, {stop, normal, State#state{ssh_params = Ssh}}. counterpart_versions(NumVsn, StrVsn, #ssh{role = server} = Ssh) -> diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_connection_manager.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_connection_manager.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_connection_manager.erl 2009-06-05 13:56:10.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_connection_manager.erl 2009-09-18 15:13:35.000000000 +0100 @@ -30,6 +30,7 @@ -include("ssh.hrl"). -include("ssh_connect.hrl"). +-include("ssh_transport.hrl"). -export([start_link/1]). @@ -275,6 +276,11 @@ [ConnectionMsg, Reason]), error_logger:info_report(Report), {noreply, State}; + error:Error -> + Report = io_lib:format("Connection message returned:~n~p~n~p~n", + [ConnectionMsg, Error]), + error_logger:info_report(Report), + {noreply, State}; exit:Exit -> Report = io_lib:format("Connection message returned:~n~p~n~p~n", [ConnectionMsg, Exit]), @@ -393,6 +399,16 @@ {reply, ok, State} end; +handle_call(stop, _, #state{role = _client, + client = ChannelPid, + connection = Pid} = State) -> + DisconnectMsg = + #ssh_msg_disconnect{code = ?SSH_DISCONNECT_BY_APPLICATION, + description = "Application disconnect", + language = "en"}, + (catch gen_fsm:send_all_state_event(Pid, DisconnectMsg)), +% ssh_connection_handler:send(Pid, DisconnectMsg), + {stop, normal, ok, State}; handle_call(stop, _, State) -> {stop, normal, ok, State}; @@ -476,13 +492,15 @@ #state{connection_state = CState} = State) -> {ok, Connection} = ssh_transport:accept(Address, Port, Socket, Options), Shell = proplists:get_value(shell, Options), + Exec = proplists:get_value(exec, Options), CliSpec = proplists:get_value(ssh_cli, Options, {ssh_cli, [Shell]}), {noreply, State#state{connection = Connection, connection_state = CState#connection{address = Address, port = Port, cli_spec = CliSpec, - options = Options}}}; + options = Options, + exec = Exec}}}; handle_info({start_connection, client, [Parent, Address, Port, ChannelPid, SocketOpts, Options]}, @@ -585,14 +603,26 @@ decode_ssh_msg(Msg) -> Msg. -send_msg({channel_data, Pid, Data}) -> + +send_msg(Msg) -> + case catch do_send_msg(Msg) of + {'EXIT', Reason}-> + Report = io_lib:format("Connection Manager fail to send:~n~p~n" + "Reason why it failed was:~n~p~n", + [Msg, Reason]), + error_logger:info_report(Report); + _ -> + ok + end. + +do_send_msg({channel_data, Pid, Data}) -> Pid ! {ssh_cm, self(), Data}; -send_msg({channel_requst_reply, From, Data}) -> +do_send_msg({channel_requst_reply, From, Data}) -> gen_server:reply(From, Data); -send_msg({connection_reply, Pid, Data}) -> +do_send_msg({connection_reply, Pid, Data}) -> Msg = ssh_bits:encode(Data), ssh_connection_handler:send(Pid, Msg); -send_msg({flow_control, Cache, Channel, From, Msg}) -> +do_send_msg({flow_control, Cache, Channel, From, Msg}) -> ssh_channel:cache_update(Cache, Channel#channel{flow_control = undefined}), gen_server:reply(From, Msg). @@ -609,7 +639,7 @@ State = add_request(WantReply, ChannelId, From, State0), {{replies, Replies}, State}; undefined -> - {noreply, State0} + {{replies, []}, State0} end. handle_request(ChannelId, Type, Data, WantReply, From, @@ -624,7 +654,7 @@ State = add_request(WantReply, ChannelId, From, State0), {{replies, Replies}, State}; undefined -> - {noreply, State0} + {{replies, []}, State0} end. handle_down({{replies, Replies}, State}) -> diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_connection_sup.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_connection_sup.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_connection_sup.erl 2009-06-05 13:56:09.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_connection_sup.erl 1970-01-01 01:00:00.000000000 +0100 @@ -1,119 +0,0 @@ -%% -%% %CopyrightBegin% -%% -%% Copyright Ericsson AB 2008-2009. All Rights Reserved. -%% -%% The contents of this file are subject to the Erlang Public License, -%% Version 1.1, (the "License"); you may not use this file except in -%% compliance with the License. You should have received a copy of the -%% Erlang Public License along with this software. If not, it can be -%% retrieved online at http://www.erlang.org/. -%% -%% Software distributed under the License is distributed on an "AS IS" -%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See -%% the License for the specific language governing rights and limitations -%% under the License. -%% -%% %CopyrightEnd% -%% -%% -%%---------------------------------------------------------------------- -%% Purpose: Ssh connection supervisor. -%%---------------------------------------------------------------------- - --module(ssh_connection_sup). - --behaviour(supervisor). - --export([start_link/1, start_handler_child/2, start_manager_child/2, - connection_manager/1]). - -%% Supervisor callback --export([init/1]). - -%%%========================================================================= -%%% API -%%%========================================================================= -start_link(Args) -> - supervisor:start_link(?MODULE, [Args]). - -%% Will be called from the manager child process -start_handler_child(Sup, Args) -> - [Spec] = child_specs(handler, Args), - supervisor:start_child(Sup, Spec). - -%% Will be called from the acceptor process -start_manager_child(Sup, Args) -> - [Spec] = child_specs(manager, Args), - supervisor:start_child(Sup, Spec). - -connection_manager(SupPid) -> - Children = supervisor:which_children(SupPid), - {ok, ssh_connection_manager(Children)}. - -%%%========================================================================= -%%% Supervisor callback -%%%========================================================================= -init([Args]) -> - RestartStrategy = one_for_one, -% RestartStrategy = one_for_all, - MaxR = 0, - MaxT = 3600, - Children = child_specs(Args), - {ok, {{RestartStrategy, MaxR, MaxT}, Children}}. - -%%%========================================================================= -%%% Internal functions -%%%========================================================================= -child_specs(Opts) -> - case proplists:get_value(role, Opts) of - client -> - child_specs(manager, [client | Opts]); - server -> - %% Children started by acceptor process - [] - end. - -% The manager process starts the handler process -child_specs(manager, Opts) -> - [manager_spec(Opts)]; -child_specs(handler, Opts) -> - [handler_spec(Opts)]. - -manager_spec([server = Role, Socket, Opts]) -> - Name = make_ref(), - StartFunc = {ssh_connection_manager, start_link, [[Role, Socket, Opts]]}, - Restart = transient, -% Restart = permanent, - Shutdown = 3600, - Modules = [ssh_connection_manager], - Type = worker, - {Name, StartFunc, Restart, Shutdown, Type, Modules}; - -manager_spec([client = Role | Opts]) -> - Name = make_ref(), - StartFunc = {ssh_connection_manager, start_link, [[Role, Opts]]}, - %%TODO restarttype? - Restart = temporary, -% Restart = transient, -% Restart = permanent, - Shutdown = 3600, - Modules = [ssh_connection_manager], - Type = worker, - {Name, StartFunc, Restart, Shutdown, Type, Modules}. - -handler_spec([Role, Socket, Opts]) -> - Name = make_ref(), - StartFunc = {ssh_connection_handler, - start_link, [Role, self(), Socket, Opts]}, - Restart = transient, -% Restart = permanent, - Shutdown = 3600, - Modules = [ssh_connection_handler], - Type = worker, - {Name, StartFunc, Restart, Shutdown, Type, Modules}. - -ssh_connection_manager([{_, Child, _, [ssh_connection_manager]} | _]) -> - Child; -ssh_connection_manager([_ | Rest]) -> - ssh_connection_manager(Rest). diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/sshc_sup.erl erlang-13.b.3-dfsg/lib/ssh/src/sshc_sup.erl --- erlang-13.b.1-dfsg/lib/ssh/src/sshc_sup.erl 2009-03-12 12:33:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/src/sshc_sup.erl 2009-11-20 13:37:49.000000000 +0000 @@ -54,10 +54,12 @@ %%%========================================================================= child_spec(_) -> Name = undefined, % As simple_one_for_one is used. - StartFunc = {ssh_connection_sup, start_link, []}, + StartFunc = {ssh_connection_controler, start_link, []}, Restart = temporary, - Shutdown = infinity, - Modules = [ssh_connection_sup], - Type = supervisor, +% Shutdown = infinity, + Shutdown = 5000, + Modules = [ssh_connection_controler], +% Type = supervisor, + Type = worker, {Name, StartFunc, Restart, Shutdown, Type, Modules}. diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh.erl 2009-03-12 12:31:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh.erl 2009-11-20 13:37:33.000000000 +0000 @@ -53,15 +53,19 @@ application:stop(ssh). %%-------------------------------------------------------------------- -%% Function: connect(Host, Port, Options) -> ConnectionRef | {error, Reason} +%% Function: connect(Host, Port, Options) -> +%% connect(Host, Port, Options, Timeout -> ConnectionRef | {error, Reason} %% %% Host - string() %% Port - integer() %% Options - [{Option, Value}] +%% Timeout - infinity | integer(). %% %% Description: Starts an ssh connection. %%-------------------------------------------------------------------- connect(Host, Port, Options) -> + connect(Host, Port, Options, infinity). +connect(Host, Port, Options, Timeout) -> {SocketOpts, Opts} = handle_options(Options), DisableIpv6 = proplists:get_value(ip_v6_disabled, Opts, false), Inet = inetopt(DisableIpv6), @@ -70,11 +74,13 @@ {channel_pid, self()}, {socket_opts, [Inet | SocketOpts]}, {ssh_opts, [{host, Host}| Opts]}]]) of - {ok, ConnectionSup} -> + {ok, ConnectionSup} -> {ok, Manager} = - ssh_connection_sup:connection_manager(ConnectionSup), + ssh_connection_controler:connection_manager(ConnectionSup), + MRef = erlang:monitor(process, Manager), receive {Manager, is_connected} -> + do_demonitor(MRef, Manager), {ok, Manager}; %% When the connection fails %% ssh_connection_sup:connection_manager @@ -82,15 +88,38 @@ %% could allready have terminated, so we will not %% match the Manager in this case {_, not_connected, {error, Reason}} -> + do_demonitor(MRef, Manager), {error, Reason}; {_, not_connected, Other} -> - {error, Other} + do_demonitor(MRef, Manager), + {error, Other}; + {'DOWN', MRef, _, Manager, Reason} when is_pid(Manager) -> + receive %% Clear EXIT message from queue + {'EXIT', Manager, _What} -> + {error, Reason} + after 0 -> + {error, Reason} + end + after Timeout -> + do_demonitor(MRef, Manager), + ssh_connection_manager:stop(Manager), + {error, timeout} end catch exit:{noproc, _} -> {error, ssh_not_started} end. +do_demonitor(MRef, Manager) -> + erlang:demonitor(MRef), + receive + {'DOWN', MRef, _, Manager, _} -> + ok + after 0 -> + ok + end. + + %%-------------------------------------------------------------------- %% Function: close(ConnectionRef) -> ok %% diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_file.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_file.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_file.erl 2009-04-16 10:26:19.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_file.erl 2009-11-20 13:37:39.000000000 +0000 @@ -526,5 +526,5 @@ FN. default_user_dir()-> - {ok,[[Home]]} = init:get_argument(home), + {ok,[[Home|_]]} = init:get_argument(home), filename:join(Home, ".ssh"). diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_sftpd.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_sftpd.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_sftpd.erl 2009-04-16 10:26:19.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_sftpd.erl 2009-09-18 15:13:22.000000000 +0100 @@ -385,9 +385,9 @@ send_status(Status, ReqId, State1); handle_op(?SSH_FXP_RENAME, ReqId, - Bin = <>, - State = #state{xf = #ssh_xfer{vsn = 3}}) -> + Bin = <>, + State = #state{xf = #ssh_xfer{vsn = Vsn}}) when Vsn==3; Vsn==4 -> handle_op(?SSH_FXP_RENAME, ReqId, <>, State); handle_op(?SSH_FXP_RENAME, ReqId, diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_sftp.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_sftp.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_sftp.erl 2009-06-05 13:56:03.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_sftp.erl 2009-11-20 13:37:38.000000000 +0000 @@ -95,13 +95,19 @@ Timeout = proplists:get_value(timeout, Opts, infinity), case ssh_xfer:attach(Cm, []) of {ok, ChannelId, Cm} -> - {ok, Pid} = ssh_channel:start(Cm, ChannelId, - ?MODULE, [Cm, ChannelId, Timeout]), - case wait_for_version_negotiation(Pid, Timeout) of - ok -> - {ok, Pid}; - TimeOut -> - TimeOut + case ssh_channel:start(Cm, ChannelId, + ?MODULE, [Cm, ChannelId, Timeout]) of + {ok, Pid} -> + case wait_for_version_negotiation(Pid, Timeout) of + ok -> + {ok, Pid}; + TimeOut -> + TimeOut + end; + {error, Reason} -> + {error, Reason}; + ignore -> + {error, ignore} end; Error -> Error @@ -113,14 +119,20 @@ Timeout = proplists:get_value(timeout, Opts, infinity), case ssh_xfer:connect(Host, Port, proplists:delete(timeout, Opts)) of {ok, ChannelId, Cm} -> - {ok, Pid} = ssh_channel:start(Cm, ChannelId, ?MODULE, [Cm, - ChannelId, Timeout]), - case wait_for_version_negotiation(Pid, Timeout) of - ok -> - {ok, Pid, Cm}; - TimeOut -> - TimeOut - end; + case ssh_channel:start(Cm, ChannelId, ?MODULE, [Cm, + ChannelId, Timeout]) of + {ok, Pid} -> + case wait_for_version_negotiation(Pid, Timeout) of + ok -> + {ok, Pid, Cm}; + TimeOut -> + TimeOut + end; + {error, Reason} -> + {error, Reason}; + ignore -> + {error, ignore} + end; Error -> Error end. @@ -309,6 +321,8 @@ do_list_dir(Pid, Handle, FileOpTimeout, Acc) -> case readdir(Pid, Handle, FileOpTimeout) of + {ok, []} -> + {ok, Acc}; {ok, Names} -> do_list_dir(Pid, Handle, FileOpTimeout, Acc ++ Names); eof -> diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_subsystem_sup.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_subsystem_sup.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_subsystem_sup.erl 2009-06-05 13:56:09.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_subsystem_sup.erl 2009-11-20 13:37:48.000000000 +0000 @@ -70,13 +70,13 @@ Address = proplists:get_value(address, Opts), Port = proplists:get_value(port, Opts), Role = proplists:get_value(role, Opts), - Name = id(Role, ssh_connection_sup, Address, Port), - StartFunc = {ssh_connection_sup, start_link, [Opts]}, + Name = id(Role, ssh_connection_controler, Address, Port), + StartFunc = {ssh_connection_controler, start_link, [Opts]}, Restart = transient, % Restart = permanent, - Shutdown = infinity, - Modules = [ssh_connection_sup], - Type = supervisor, + Shutdown = 5000, + Modules = [ssh_connection_controler], + Type = worker, {Name, StartFunc, Restart, Shutdown, Type, Modules}. ssh_channel_child_spec(Opts) -> @@ -95,7 +95,7 @@ id(Role, Sup, Address, Port) -> {Role, Sup, Address, Port}. -ssh_connection_sup([{_, Child, _, [ssh_connection_sup]} | _]) -> +ssh_connection_sup([{_, Child, _, [ssh_connection_controler]} | _]) -> Child; ssh_connection_sup([_ | Rest]) -> ssh_connection_sup(Rest). diff -Nru erlang-13.b.1-dfsg/lib/ssh/src/ssh_transport.erl erlang-13.b.3-dfsg/lib/ssh/src/ssh_transport.erl --- erlang-13.b.1-dfsg/lib/ssh/src/ssh_transport.erl 2009-06-05 13:55:58.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/src/ssh_transport.erl 2009-11-20 13:37:33.000000000 +0000 @@ -150,7 +150,7 @@ case do_connect(Callback, Address, Port, SocketOpts, Timeout) of {ok, Socket} -> {ok, Pid} = - ssh_connection_sup:start_handler_child(ConnectionSup, + ssh_connection_controler:start_handler_child(ConnectionSup, [client, Socket, [{address, Address}, {port, Port} | @@ -180,7 +180,7 @@ ssh_system_sup:connection_supervisor( ssh_system_sup:system_supervisor(Address, Port)), {ok, Pid} = - ssh_connection_sup:start_handler_child(ConnectionSup, + ssh_connection_controler:start_handler_child(ConnectionSup, [server, Socket, [{address, Address}, {port, Port} | Options]]), @@ -228,8 +228,8 @@ cookie = Random, kex_algorithms = ["diffie-hellman-group1-sha1"], server_host_key_algorithms = ["ssh-rsa", "ssh-dss"], - encryption_algorithms_client_to_server = ["3des-cbc"], - encryption_algorithms_server_to_client = ["3des-cbc"], + encryption_algorithms_client_to_server = ["aes128-cbc","3des-cbc"], + encryption_algorithms_server_to_client = ["aes128-cbc","3des-cbc"], mac_algorithms_client_to_server = ["hmac-sha1"], mac_algorithms_server_to_client = ["hmac-sha1"], compression_algorithms_client_to_server = Compression, @@ -243,8 +243,8 @@ cookie = Random, kex_algorithms = ["diffie-hellman-group1-sha1"], server_host_key_algorithms = ["ssh-dss"], - encryption_algorithms_client_to_server = ["3des-cbc"], - encryption_algorithms_server_to_client = ["3des-cbc"], + encryption_algorithms_client_to_server = ["aes128-cbc","3des-cbc"], + encryption_algorithms_server_to_client = ["aes128-cbc","3des-cbc"], mac_algorithms_client_to_server = ["hmac-sha1"], mac_algorithms_server_to_client = ["hmac-sha1"], compression_algorithms_client_to_server = Compression, @@ -715,7 +715,12 @@ {NoMac0, Mac0, Rest0} end, {Ssh1, DecData, <<>>} = - ssh_transport:decrypt_blocks(NoMac, SshLength, Ssh0), + case SshLength of + 0 -> + {Ssh0, <<>>, <<>>}; + _ -> + decrypt_blocks(NoMac, SshLength, Ssh0) + end, {Ssh1, DecData, Rest, Mac}. msg_data(PacketData) -> @@ -800,7 +805,19 @@ <> = hash(Ssh, "D", 192), {ok, Ssh#ssh{encrypt_keys = {K1,K2,K3}, encrypt_block_size = 8, - encrypt_ctx = IV}}. + encrypt_ctx = IV}}; +encrypt_init(#ssh{encrypt = 'aes128-cbc', role = client} = Ssh) -> + IV = hash(Ssh, "A", 128), + <> = hash(Ssh, "C", 128), + {ok, Ssh#ssh{encrypt_keys = K, + encrypt_block_size = 16, + encrypt_ctx = IV}}; +encrypt_init(#ssh{encrypt = 'aes128-cbc', role = server} = Ssh) -> + IV = hash(Ssh, "B", 128), + <> = hash(Ssh, "D", 128), + {ok, Ssh#ssh{encrypt_keys = K, + encrypt_block_size = 16, + encrypt_ctx = IV}}. encrypt_final(Ssh) -> {ok, Ssh#ssh{encrypt = none, @@ -819,6 +836,15 @@ Enc = crypto:des3_cbc_encrypt(K1,K2,K3,IV0,Data), %%?dbg(?DBG_CRYPTO, "encrypt: ~p -> ~p ~n", [Data, Enc]), IV = crypto:des_cbc_ivec(Enc), + {Ssh#ssh{encrypt_ctx = IV}, Enc}; +encrypt(#ssh{encrypt = 'aes128-cbc', + encrypt_keys = K, + encrypt_ctx = IV0} = Ssh, Data) -> + %%?dbg(?DBG_CRYPTO, "encrypt: IV=~p K=~p ~n", + %% [IV0,K]), + Enc = crypto:aes_cbc_128_encrypt(K,IV0,Data), + %%?dbg(?DBG_CRYPTO, "encrypt: ~p -> ~p ~n", [Data, Enc]), + IV = crypto:aes_cbc_ivec(Enc), {Ssh#ssh{encrypt_ctx = IV}, Enc}. @@ -834,13 +860,25 @@ <> = KD, {ok, Ssh#ssh{decrypt_keys = {K1,K2,K3}, decrypt_ctx = IV, decrypt_block_size = 8}}; - decrypt_init(#ssh{decrypt = '3des-cbc', role = server} = Ssh) -> {IV, KD} = {hash(Ssh, "A", 64), hash(Ssh, "C", 192)}, <> = KD, {ok, Ssh#ssh{decrypt_keys = {K1, K2, K3}, decrypt_ctx = IV, - decrypt_block_size = 8}}. + decrypt_block_size = 8}}; +decrypt_init(#ssh{decrypt = 'aes128-cbc', role = client} = Ssh) -> + {IV, KD} = {hash(Ssh, "B", 128), + hash(Ssh, "D", 128)}, + <> = KD, + {ok, Ssh#ssh{decrypt_keys = K, decrypt_ctx = IV, + decrypt_block_size = 16}}; +decrypt_init(#ssh{decrypt = 'aes128-cbc', role = server} = Ssh) -> + {IV, KD} = {hash(Ssh, "A", 128), + hash(Ssh, "C", 128)}, + <> = KD, + {ok, Ssh#ssh{decrypt_keys = K, decrypt_ctx = IV, + decrypt_block_size = 16}}. + decrypt_final(Ssh) -> {ok, Ssh#ssh {decrypt = none, @@ -858,8 +896,17 @@ Dec = crypto:des3_cbc_decrypt(K1,K2,K3,IV0,Data), %%?dbg(?DBG_CRYPTO, "decrypt: ~p -> ~p ~n", [Data, Dec]), IV = crypto:des_cbc_ivec(Data), + {Ssh#ssh{decrypt_ctx = IV}, Dec}; +decrypt(#ssh{decrypt = 'aes128-cbc', decrypt_keys = Key, + decrypt_ctx = IV0} = Ssh, Data) -> + %%?dbg(?DBG_CRYPTO, "decrypt: IV=~p Key=~p ~n", + %% [IV0,Key]), + Dec = crypto:aes_cbc_128_decrypt(Key,IV0,Data), + %%?dbg(?DBG_CRYPTO, "decrypt: ~p -> ~p ~n", [Data, Dec]), + IV = crypto:aes_cbc_ivec(Data), {Ssh#ssh{decrypt_ctx = IV}, Dec}. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Compression %% diff -Nru erlang-13.b.1-dfsg/lib/ssh/vsn.mk erlang-13.b.3-dfsg/lib/ssh/vsn.mk --- erlang-13.b.1-dfsg/lib/ssh/vsn.mk 2009-06-05 13:55:58.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssh/vsn.mk 2009-11-20 13:37:31.000000000 +0000 @@ -1,9 +1,27 @@ #-*-makefile-*- ; force emacs to enter makefile-mode -SSH_VSN = 1.1.3 +SSH_VSN = 1.1.7 APP_VSN = "ssh-$(SSH_VSN)" -TICKETS = OTP-7996 \ +TICKETS = OTP-8121 \ + OTP-8277 \ + OTP-8278 \ + OTP-8201 + +TICKETS_1.1.6 = OTP-8110 \ + OTP-8162 \ + OTP-8173 \ + OTP-8174 \ + OTP-8175 \ + OTP-8176 + +TICKETS_1.1.5 = OTP-8159 \ + OTP-8160 \ + OTP-8161 + +TICKETS_1.1.4 = OTP-8071 + +TICKETS_1.1.3 = OTP-7996 \ OTP-8034 \ OTP-8035 diff -Nru erlang-13.b.1-dfsg/lib/ssl/c_src/Makefile.in erlang-13.b.3-dfsg/lib/ssl/c_src/Makefile.in --- erlang-13.b.1-dfsg/lib/ssl/c_src/Makefile.in 2009-03-12 12:29:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/c_src/Makefile.in 2009-09-18 15:12:33.000000000 +0100 @@ -163,7 +163,7 @@ # Unix $(BINDIR)/ssl_esock: $(OBJS) - $(CC) $(CC_R_OPT) $(PLAIN_CFLAGS) -o $@ $^ $(LIBS) $(SSL_LINK_LIB) + $(CC) $(CC_R_OPT) $(PLAIN_CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) $(SSL_LINK_LIB) # Win32/Cygwin $(BINDIR)/ssl_esock.exe: $(OBJS) diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/book.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/book.xml 2009-03-12 12:29:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/book.xml 2009-11-20 13:36:28.000000000 +0000 @@ -1,7 +1,7 @@ - +

    19992009 @@ -36,11 +36,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/create_certs.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/create_certs.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/create_certs.xml 2009-03-12 12:31:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/create_certs.xml 2009-11-20 13:37:25.000000000 +0000 @@ -26,7 +26,7 @@ 2003-06-16 A - create_certs.sgml + create_certs.xml

    Here we consider the creation of example certificates.

    diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/licenses.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/licenses.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/licenses.xml 2009-03-12 12:31:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/licenses.xml 2009-11-20 13:37:26.000000000 +0000 @@ -26,7 +26,7 @@ 2003-05-26 A - licenses.sgml + licenses.xml

    This chapter contains in extenso versions diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/Makefile erlang-13.b.3-dfsg/lib/ssl/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/ssl/doc/src/Makefile 2009-06-05 13:26:40.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/Makefile 2009-11-20 13:36:27.000000000 +0000 @@ -26,17 +26,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(SSL_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=ssl # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/ssl-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -79,23 +74,9 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_PART_FILES:%.xml=%.tex) \ - $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PDF_FILE = ssl-$(VSN).pdf -TOP_PS_FILE = ssl-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -109,21 +90,19 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) pdf: $(TOP_PDF_FILE) -ps: $(TOP_PS_FILE) +html: gifs $(HTML_REF_MAN_FILE) -html: $(HTML_FILES) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ man: $(MAN3_FILES) $(MAN6_FILES) @@ -131,37 +110,21 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) $(MAN6_FILES) $(EXTRA_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ *xmls_output *xmls_errs $(LATEX_CLEAN) - # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6 -endif -endif release_spec: diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/new_ssl.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/new_ssl.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/new_ssl.xml 2009-06-05 13:56:08.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/new_ssl.xml 2009-11-20 13:37:46.000000000 +0000 @@ -153,8 +153,8 @@

    ciphers() = [ciphersuite()] | sting() (according to old API)

    -

    chiphersuite() = - {key_exchange(), chipher(), hash(), exportable()}

    +

    ciphersuite() = + {key_exchange(), cipher(), hash(), exportable()}

    key_exchange() = rsa | dh_dss | dh_rsa | dh_anon | dhe_dss | dhe_rsa | krb5 | KeyExchange_export diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/notes.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/notes.xml 2009-06-05 13:55:21.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/notes.xml 2009-11-20 13:36:28.000000000 +0000 @@ -26,11 +26,108 @@ 2003-08-03 G - notes.sgml + notes.xml

    This document describes the changes made to the SSL application.

    +
    SSL 3.10.7 + +
    Fixed Bugs and Malfunctions + + +

    + A ticker process could potentially be blocked + indefinitely trying to send a tick to a node not + responding. If this happened, the connection would not be + brought down as it should.

    +

    This requires erts-5.7.4 and kernel-2.13.4 or later + to be able to get the erlang distribution over ssl to work.

    +

    + Own Id: OTP-8218

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8250

    +
    + +

    + Code cleanup from Kostis.

    +

    + Own Id: OTP-8260

    +
    +
    +
    + +
    + +
    SSL 3.10.6 + +
    Fixed Bugs and Malfunctions + + +

    + The ssl:ssl_accept/3 issue was not properly fixed in the + previous patch, see OTP-8244.

    +

    + Own Id: OTP-8275 Aux Id: seq11451

    +
    +
    +
    + +
    + +
    SSL 3.10.5 + +
    Fixed Bugs and Malfunctions + + +

    + Allow clients to not send certificates if option + fail_if_no_peer_cert was not set.

    +

    + Own Id: OTP-8224

    +
    + +

    A ssl:ssl_accept/3 could crash a connection if the + timing was wrong.

    Removed info message if the + socket closed without a proper disconnect from the ssl + layer.

    ssl:send/2 is now blocking until the + message is sent.

    +

    + Own Id: OTP-8244 Aux Id: seq11420

    +
    +
    +
    + +
    + +
    SSL 3.10.4 + +
    Fixed Bugs and Malfunctions + + +

    + A client could avoid a certificate check if the client + code didn't send the requested certificate.

    +

    + Own Id: OTP-8137

    +
    +
    +
    + +
    +
    SSL 3.10.3
    Improvements and New Features @@ -136,7 +233,7 @@

    All handling of X509-certificates and public keys have - been moved to the new appliction public_key.

    + been moved to the new application public_key.

    Own Id: OTP-6894

    @@ -433,7 +530,7 @@ support it.

    Solaris/Sparc, 64-bit emulator: The SO_REUSEADDR option was not set for listen sockets, which essentially - made the ssl application unusuable. Corrected.

    + made the ssl application unusable. Corrected.

    The default listen queue size for ssl port program was changed to 128 (from 5).

    Own Id: OTP-5755 Aux Id: seq10068

    @@ -597,7 +694,7 @@

    The cache_timout option was silently ignored. It had to do with SSL sessions, where multiple connections can occur. - Since the Erlang SSL applicaton does not support sessions the + Since the Erlang SSL application does not support sessions the option is still ignored, and consequently the documentation about it has been removed.

    OwnId: OTP-3146

    @@ -615,7 +712,7 @@

    The ssl_esock port program is now part of the distribution and thus does not have to be created - explicitely. It is dynamically linked to OpenSSL + explicitly. It is dynamically linked to OpenSSL libraries in a "standard" location (typically /usr/local/lib on UNIX; in the path on Win32).

    OwnId: @@ -663,8 +760,8 @@

    OwnId: OTP-3146

    -

    There was a syncronization error at closing of an SSL - connnection.

    +

    There was a synchronization error at closing of an SSL + connection.

    OwnId: OTP-4435

    Aux Id: seq7534

    @@ -945,7 +1042,7 @@

    The set of possible error reasons has been extended to - contain diagnostics on erronous certificates and failures + contain diagnostics on erroneous certificates and failures to verify certificates.

    OwnId: OTP-3145

    @@ -961,7 +1058,7 @@ Fixed Bugs and Malfunctions -

    A dead-lock occuring when write queues are not empty has +

    A dead-lock occurring when write queues are not empty has been removed.

    OwnId: OTP-3145

    diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/pkix_certs.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/pkix_certs.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/pkix_certs.xml 2009-03-12 12:31:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/pkix_certs.xml 2009-11-20 13:37:24.000000000 +0000 @@ -26,7 +26,7 @@ 2003-06-09 A - pkix_certs.sgml + pkix_certs.xml
    @@ -238,7 +238,7 @@ authorityInfoAccess - How to access CA information of the isssuer of the certificate. + How to access CA information of the issuer of the certificate. subjectInfoAccess diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/refman.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/refman.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/refman.xml 2009-06-05 13:26:41.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/refman.xml 2009-11-20 13:36:28.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19992009 @@ -43,9 +43,9 @@

    For full OpenSSL and SSLeay license texts, see Licenses.

    - - - + + + diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/release_notes.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/release_notes.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/release_notes.xml 2009-03-12 12:29:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/release_notes.xml 2009-11-20 13:36:28.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19992009 @@ -43,7 +43,7 @@

    For full OpenSSL and SSLeay license texts, see Licenses.

    - + diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/remember.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/remember.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/remember.xml 2009-03-12 12:31:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/remember.xml 2009-11-20 13:37:27.000000000 +0000 @@ -54,7 +54,7 @@ standards: ASN.1, X.509, X.520, PKIX, PKCS, PEM. - incompatibilites between standards (X.509-1997 vs old) - the + incompatibilities between standards (X.509-1997 vs old) - the ASN.1 problem of ANY, BIT STRING and OCTET STRING - the module ssl_pkix. diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/ssl_app.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/ssl_app.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/ssl_app.xml 2009-03-12 12:29:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/ssl_app.xml 2009-11-20 13:36:27.000000000 +0000 @@ -85,7 +85,7 @@ and msgdebug to be printed to a file named .log]]> in the directory specified by debugdir, where ]]> is the operating system - specific textual representation of the process indentifier + specific textual representation of the process identifier of the external port program of the SSL application. Default is false, i.e. no log file is produced.

    diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/ssl_distribution.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/ssl_distribution.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/ssl_distribution.xml 2009-03-12 12:29:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/ssl_distribution.xml 2009-11-20 13:36:51.000000000 +0000 @@ -29,7 +29,7 @@ 2003-04-01 B - ssl_distribution.sgml + ssl_distribution.xml

    This chapter describes how the Erlang distribution can use SSL to get additional verification and security.

    @@ -116,7 +116,7 @@ is started by the distribution module itself, so as long as the primitive code server can reach the code, the distribution will start. The -pa method is only recommended for testing - purpouses.

    + purposes.

    diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/ssl_protocol.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/ssl_protocol.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/ssl_protocol.xml 2009-03-12 12:31:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/ssl_protocol.xml 2009-11-20 13:37:26.000000000 +0000 @@ -26,7 +26,7 @@ 2003-04-28 PA2 - ssl_protocol.sgml + ssl_protocol.xml

    Here we provide a short introduction to the SSL protocol. We only consider those part of the protocol that are important from a @@ -71,7 +71,7 @@

    An SSL connection also consists of data transfer and connection close, However, the data transfer contains encrypted data, and in order to establish the encryption parameters, the data - transfer is preceeded by an SSL handshake. In this + transfer is preceded by an SSL handshake. In this handshake the server plays a dominant role, and the main instrument used in achieving a valid SSL connection is the server's certificate. We consider certificates in the diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/ssl.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/ssl.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/ssl.xml 2009-03-13 08:55:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/ssl.xml 2009-11-20 13:36:27.000000000 +0000 @@ -181,7 +181,7 @@

    {ciphers, string()} String of ciphers as a colon separated list of ciphers. The function ciphers/0 can - be used to find all availabe ciphers.

    + be used to find all available ciphers.

    The type sslsocket() is opaque to the user. @@ -224,7 +224,7 @@ socket. When a socket is opened, that process links to the calling client process. Implementations that want to detect abnormal exits from the socket process by receiving {'EXIT', Pid, Reason} messages, should use the function pid/1 - to retreive the process identifier from the socket, in order to + to retrieve the process identifier from the socket, in order to be able to match exit messages properly.

    @@ -232,7 +232,7 @@ ciphers() -> {ok, string()} | {error, enotstarted} Get supported ciphers. -

    Returns a string constisting of colon separated cipher +

    Returns a string consisting of colon separated cipher designations that are supported by the current SSL library implementation.

    @@ -333,7 +333,7 @@

    Sets up a socket to listen on port Port at the local host. If Port is zero, listen/2 picks an available port - number (use port/1 to retreive it). + number (use port/1 to retrieve it).

    The listen queue size defaults to 5. If a different value is wanted, the option {backlog, Size} should be added to the diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/usersguide.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/usersguide.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/usersguide.xml 2009-03-12 12:29:55.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/usersguide.xml 2009-11-20 13:36:51.000000000 +0000 @@ -1,7 +1,7 @@ - +

    20002009 @@ -44,12 +44,12 @@

    For full OpenSSL and SSLeay license texts, see Licenses.

    - - - - - - + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/ssl/doc/src/using_ssl.xml erlang-13.b.3-dfsg/lib/ssl/doc/src/using_ssl.xml --- erlang-13.b.1-dfsg/lib/ssl/doc/src/using_ssl.xml 2009-03-12 12:31:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/doc/src/using_ssl.xml 2009-11-20 13:37:25.000000000 +0000 @@ -26,7 +26,7 @@ 2003-04-23 PA2 - using_ssl.sgml + using_ssl.xml

    Here we provide an introduction to using the Erlang/OTP SSL application, which is accessed through the ssl interface @@ -67,7 +67,7 @@ containing the certificate of the holder of the connection endpoint. In case of a server endpoint this option is mandatory since the contents of the sever certificate is needed in the - the handshake preceeding the establishment of a connection. + the handshake preceding the establishment of a connection.

    Similarly, the keyfile option points to a local file containing the private key of the holder of the endpoint. If the diff -Nru erlang-13.b.1-dfsg/lib/ssl/examples/src/client_server.erl erlang-13.b.3-dfsg/lib/ssl/examples/src/client_server.erl --- erlang-13.b.1-dfsg/lib/ssl/examples/src/client_server.erl 2009-03-12 12:31:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/examples/src/client_server.erl 2009-09-18 15:13:02.000000000 +0100 @@ -44,7 +44,7 @@ %% Accept {ok, ASock} = ssl:transport_accept(LSock), - ok = ssl:ssl_accept(LSock), + ok = ssl:ssl_accept(ASock), io:fwrite("Accept: accepted.~n"), {ok, Cert} = ssl:peercert(ASock, CertOpts), io:fwrite("Accept: peer cert:~n~p~n", [Cert]), diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/inet_ssl_dist.erl erlang-13.b.3-dfsg/lib/ssl/src/inet_ssl_dist.erl --- erlang-13.b.1-dfsg/lib/ssl/src/inet_ssl_dist.erl 2009-03-12 12:29:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/inet_ssl_dist.erl 2009-11-20 13:36:51.000000000 +0000 @@ -34,8 +34,8 @@ --define(to_port(Socket, Data), - case ssl_prim:send(Socket, Data) of +-define(to_port(Socket, Data, Opts), + case ssl_prim:send(Socket, Data, Opts) of {error, closed} -> self() ! {ssl_closed, Socket}, {error, closed}; @@ -46,12 +46,6 @@ -include("dist.hrl"). -include("dist_util.hrl"). --record(tick, {read = 0, - write = 0, - tick = 0, - ticked = 0 - }). - %% ------------------------------------------------------------- %% This function should return a valid childspec, so that @@ -298,7 +292,7 @@ %% If Node is illegal terminate the connection setup!! splitnode(Node, LongOrShortNames) -> case split_node(atom_to_list(Node), $@, []) of - [Name|Tail] when Tail /= [] -> + [Name|Tail] when Tail =/= [] -> Host = lists:append(Tail), case split_node(Host, $., []) of [_] when LongOrShortNames == longnames -> @@ -308,7 +302,7 @@ "** Hostname ~s is illegal **~n", [Host]), ?shutdown(Node); - L when length(L) > 1, LongOrShortNames == shortnames -> + [_, _ | _] when LongOrShortNames == shortnames -> error_msg("** System NOT running to use fully qualified " "hostnames **~n" "** Hostname ~s is illegal **~n", @@ -385,7 +379,7 @@ M3 band IP3, M4 band IP4}. -is_node_name(Node) when atom(Node) -> +is_node_name(Node) when is_atom(Node) -> case split_node(atom_to_list(Node), $@, []) of [_, _Host] -> true; _ -> false @@ -393,7 +387,7 @@ is_node_name(_Node) -> false. tick(Sock) -> - ?to_port(Sock,[]). + ?to_port(Sock,[],[force]). getstat(Socket) -> case ssl_prim:getstat(Socket, [recv_cnt, send_cnt, send_pend]) of {ok, Stat} -> @@ -442,7 +436,7 @@ exit(malformed_ssl_dist_opt). fixup(Value) -> - case (catch list_to_integer(Value)) of + case catch list_to_integer(Value) of {'EXIT',_} -> Value; Int -> diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl.appup.src erlang-13.b.3-dfsg/lib/ssl/src/ssl.appup.src --- erlang-13.b.1-dfsg/lib/ssl/src/ssl.appup.src 2009-06-05 13:55:29.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl.appup.src 2009-11-20 13:36:41.000000000 +0000 @@ -1,12 +1,21 @@ +%% -*- erlang -*- {"%VSN%", [ - {"3.10", [{restart_application, ssl}]}, - {"3.10.1", [{restart_application, ssl}]}, - {"3.10.2", [{restart_application, ssl}]} + {"3.10", [{restart_application, ssl}]}, + {"3.10.1", [{restart_application, ssl}]}, + {"3.10.2", [{restart_application, ssl}]}, + {"3.10.3", [{restart_application, ssl}]}, + {"3.10.4", [{restart_application, ssl}]}, + {"3.10.5", [{restart_application, ssl}]}, + {"3.10.6", [{restart_application, ssl}]} ], [ - {"3.10", [{restart_application, ssl}]}, - {"3.10.1", [{restart_application, ssl}]}, - {"3.10.2", [{restart_application, ssl}]} + {"3.10", [{restart_application, ssl}]}, + {"3.10.1", [{restart_application, ssl}]}, + {"3.10.2", [{restart_application, ssl}]}, + {"3.10.3", [{restart_application, ssl}]}, + {"3.10.4", [{restart_application, ssl}]}, + {"3.10.5", [{restart_application, ssl}]}, + {"3.10.6", [{restart_application, ssl}]} ]}. diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_base64.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_base64.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_base64.erl 2009-03-12 12:31:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_base64.erl 2009-11-20 13:37:23.000000000 +0000 @@ -39,7 +39,7 @@ %% Take 3 bytes a time (3 x 8 = 24 bits), and make 4 characters out of %% them (4 x 6 = 24 bits). %% -encode(Bs) when list(Bs) -> +encode(Bs) when is_list(Bs) -> encode(list_to_binary(Bs)); encode(<>) -> <> = B, diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_broker.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_broker.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_broker.erl 2009-03-12 12:29:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_broker.erl 2009-11-20 13:36:29.000000000 +0000 @@ -148,12 +148,11 @@ gen_server:start_link(?MODULE, [Client, Type], GenOpts). -%% accept(Pid, ListenSocket, Timeout) -> {ok, Socket} | -%% {error, Reason} +%% accept(Pid, ListenSocket, Timeout) -> {ok, Socket} | {error, Reason} %% %% Types: Pid = pid() of acceptor %% ListenSocket = Socket = sslsocket() -%% Timeout = integer() | infinity +%% Timeout = timeout() %% %% accept(Pid, ListenSocket, Timeout) %% when is_pid(Pid), is_record(ListenSocket, sslsocket) -> @@ -165,42 +164,38 @@ %% %% Types: Pid = pid() of acceptor %% ListenSocket = Socket = sslsocket() -%% Timeout = integer() | infinity +%% Timeout = timeout() %% -transport_accept(Pid, ListenSocket, Timeout) - when is_pid(Pid), is_record(ListenSocket, sslsocket) -> +transport_accept(Pid, #sslsocket{} = ListenSocket, Timeout) when is_pid(Pid) -> Req = {transport_accept, self(), ListenSocket, Timeout}, gen_server:call(Pid, Req, infinity). -%% ssl_accept(Pid, Socket, Timeout) -> {ok, Socket} | -%% {error, Reason} +%% ssl_accept(Pid, Socket, Timeout) -> {ok, Socket} | {error, Reason} %% %% Types: Pid = pid() of acceptor %% ListenSocket = Socket = sslsocket() -%% Timeout = integer() | infinity +%% Timeout = timeout() %% -ssl_accept(Socket, Timeout) - when is_record(Socket, sslsocket) -> +ssl_accept(#sslsocket{pid = Pid} = Socket, Timeout) -> Req = {ssl_accept, self(), Socket, Timeout}, - gen_server:call(Socket#sslsocket.pid, Req, infinity). + gen_server:call(Pid, Req, infinity). %% close(Socket) -> ok | {error, Reason} %% %% Types: Socket = sslsocket() | pid() %% -close(Socket) when is_record(Socket, sslsocket) -> - close(Socket#sslsocket.pid); +close(#sslsocket{pid = Pid}) -> + close(Pid); close(Pid) when is_pid(Pid) -> gen_server:call(Pid, {close, self()}, infinity). -%% connect(Pid, Address, Port, Opts, Timeout) -> {ok, Socket} | -%% {error, Reason} +%% connect(Pid, Address, Port, Opts, Timeout) -> {ok, Socket} | {error, Reason} %% %% Types: Pid = pid() of connector %% Address = string() | {byte(), byte(), byte(), byte()} %% Port = int() %% Opts = options() -%% Timeout = integer() | infinity +%% Timeout = timeout() %% Socket = sslsocket() %% connect(Pid, Address, Port, Opts, Timeout) when is_pid(Pid), is_list(Opts) -> @@ -215,15 +210,13 @@ %% %% connection_info(Socket) -> {ok, {Protocol, Cipher} | {error, Reason} %% -connection_info(Socket) when is_record(Socket, sslsocket) -> +connection_info(#sslsocket{pid = Pid}) -> Req = {connection_info, self()}, - gen_server:call(Socket#sslsocket.pid, Req, infinity). + gen_server:call(Pid, Req, infinity). %% controlling_process(Socket, NewOwner) -> ok | {error, Reason} -controlling_process(Socket, NewOwner) - when is_record(Socket, sslsocket), is_pid(NewOwner) -> - Pid = Socket#sslsocket.pid, +controlling_process(#sslsocket{pid = Pid}, NewOwner) when is_pid(NewOwner) -> case gen_server:call(Pid, {inhibit_msgs, self()}, infinity) of ok -> transfer_messages(Pid, NewOwner), @@ -252,9 +245,9 @@ %% %% peername(Socket) -> {ok, {Address, Port}} | {error, Reason} %% -peername(Socket) when is_record(Socket, sslsocket) -> +peername(#sslsocket{pid = Pid}) -> Req = {peername, self()}, - gen_server:call(Socket#sslsocket.pid, Req, infinity). + gen_server:call(Pid, Req, infinity). %% recv(Socket, Length, Timeout) -> {ok, Data} | {error, Reason} @@ -263,56 +256,55 @@ %% Length = Timeout = integer() %% Data = bytes() | binary() %% -recv(Socket, Length, Timeout) when is_record(Socket, sslsocket) -> +recv(#sslsocket{pid = Pid}, Length, Timeout) -> Req = {recv, self(), Length, Timeout}, - gen_server:call(Socket#sslsocket.pid, Req, infinity). + gen_server:call(Pid, Req, infinity). %% send(Socket, Data) -> ok | {error, Reason} %% %% Types: Socket = sslsocket() %% -send(Socket, Data) when is_record(Socket, sslsocket) -> - gen_server:call(Socket#sslsocket.pid, {send, self(), Data}, infinity). +send(#sslsocket{pid = Pid}, Data) -> + gen_server:call(Pid, {send, self(), Data}, infinity). %% getopts(Socket, OptTags) -> {ok, Opts} | {error, einval} %% %% Types: Pid = pid() of broker -%% Timeout = integer() >= 0 | infinity +%% Timeout = timeout() %% OptTags = option_tags() %% Opts = options() %% getopts(Socket, OptTags) -> getopts(Socket, OptTags, infinity). -getopts(Socket, OptTags, Timeout) when is_record(Socket, sslsocket), - is_list(OptTags) -> +getopts(#sslsocket{pid = Pid}, OptTags, Timeout) when is_list(OptTags) -> Req = {getopts, self(), OptTags}, - gen_server:call(Socket#sslsocket.pid, Req, Timeout). + gen_server:call(Pid, Req, Timeout). %% %% setopts(Socket, Opts) -> ok | {error, Reason} %% -setopts(Socket, Opts) when is_record(Socket, sslsocket) -> +setopts(#sslsocket{pid = Pid}, Opts) -> Req = {setopts, self(), Opts}, - gen_server:call(Socket#sslsocket.pid, Req, infinity). + gen_server:call(Pid, Req, infinity). %% %% sockname(Socket) -> {ok, {Address, Port}} | {error, Reason} %% -sockname(Socket) when is_record(Socket, sslsocket) -> +sockname(#sslsocket{pid = Pid}) -> Req = {sockname, self()}, - gen_server:call(Socket#sslsocket.pid, Req, infinity). + gen_server:call(Pid, Req, infinity). %% %% peercert(Socket) -> {ok, Cert} | {error, Reason} %% -peercert(Socket) when is_record(Socket, sslsocket) -> +peercert(#sslsocket{pid = Pid}) -> Req = {peercert, self()}, - gen_server:call(Socket#sslsocket.pid, Req, infinity). + gen_server:call(Pid, Req, infinity). %% %% INIT @@ -331,17 +323,12 @@ {ok, true} -> true; _ -> - case os:getenv("ERL_SSL_DEBUG") of - false -> - false; - _ -> - true - end + os:getenv("ERL_SSL_DEBUG") =/= false end end, Server = whereis(ssl_server), if - pid(Server) -> + is_pid(Server) -> link(Server), debug1(Debug, Type, "in start, client = ~w", [Client]), {ok, #st{brokertype = Type, server = Server, client = Client, @@ -357,14 +344,14 @@ %% recv - passive mode %% -handle_call({recv, Client, Length, Timeout}, _From, St) - when St#st.active == false -> +handle_call({recv, Client, Length, Timeout}, _From, + #st{active = false, proxysock = Proxysock, status = Status} = St) -> debug(St, "recv: client = ~w~n", [Client]), if - St#st.status =/= open -> + Status =/= open -> {reply, {error, closed}, St}; true -> - case gen_tcp:recv(St#st.proxysock, Length, Timeout) of + case gen_tcp:recv(Proxysock, Length, Timeout) of {ok, Data} -> {reply, {ok, Data}, St}; {error, timeout} -> @@ -454,8 +441,6 @@ Reply = ssl_server:connection_info(St#st.fd), {reply, Reply, St}; - - %% close from client %% handle_call({close, Client}, _From, St) -> @@ -463,11 +448,11 @@ %% Terminate {stop, normal, ok, St#st{status = closed}}; -%% listen +%% listen %% -%% Client = pid of client -%% Port = int() -%% Opts = options() +%% Client = pid of client +%% Port = int() +%% Opts = options() %% handle_call({listen, Client, Port, Opts}, _From, St) -> debug(St, "listen: client = ~w, port = ~w~n", @@ -493,7 +478,6 @@ end, {reply, Reply, St}; - %% setopts %% handle_call({setopts, Client, Opts0}, _From, St0) -> @@ -507,7 +491,7 @@ are_opts(fun is_tcp_connect_opt/1, Opts0) end, if - OptsOK == false -> + OptsOK =:= false -> {reply, {error, eoptions}, St0}; true -> Opts1 = lists:keydelete(nodelay, 1, Opts0), @@ -557,32 +541,26 @@ Reply = ssl_server:peercert(St#st.fd), {reply, Reply, St}; - %% inhibit msgs %% -%% -handle_call({inhibit_msgs, Client}, _From, St) when St#st.client == Client -> +handle_call({inhibit_msgs, Client}, _From, #st{client = Client} = St) -> debug(St, "inhibit_msgs: client = ~w~n", [Client]), {ok, Collector} = start_collector(), {reply, ok, St#st{collector = Collector}}; - %% release msgs %% -%% -handle_call({release_msgs, Client, NewClient}, _From, St) - when St#st.client == Client -> +handle_call({release_msgs, Client, NewClient}, _From, + #st{client = Client, collector = Collector} = St) -> debug(St, "release_msgs: client = ~w~n", [Client]), unlink(Client), link(NewClient), - release_collector(St#st.collector, NewClient), + release_collector(Collector, NewClient), NSt = St#st{client = NewClient, collector = NewClient}, {reply, ok, NSt}; - %% getopts %% -%% handle_call({getopts, Client, OptTags}, _From, St) -> debug(St, "getopts: client = ~w~n", [Client]), Reply = case are_opt_tags(St#st.brokertype, OptTags) of @@ -593,9 +571,7 @@ end, {reply, Reply, St}; - %% bad call -%% %% handle_call(Request, _From, St) -> debug(St, "++++ ssl_broker: bad call: ~w~n", [Request]), @@ -618,14 +594,15 @@ %% The collector is different from client only during change of %% controlling process. %% -handle_info({tcp, Socket, Data}, St) - when St#st.proxysock == Socket, St#st.status == open, -St#st.active =/= false -> +handle_info({tcp, Socket, Data}, + #st{active = Active, collector = Collector, status = open, + proxysock = Socket, thissock = Thissock} = St) + when Active =/= false -> debug(St, "tcp: socket = ~w~n", [Socket]), - Msg = {ssl, St#st.thissock, Data}, - St#st.collector ! Msg, + Msg = {ssl, Thissock, Data}, + Collector ! Msg, if - St#st.active == once -> + Active =:= once -> {noreply, St#st{active = false}}; true -> {noreply, St} @@ -634,13 +611,15 @@ %% tcp_closed - from proxy socket, active mode %% %% -handle_info({tcp_closed, Socket}, St) - when St#st.proxysock == Socket, St#st.active =/= false -> +handle_info({tcp_closed, Socket}, + #st{active = Active, collector = Collector, + proxysock = Socket, thissock = Thissock} = St) + when Active =/= false -> debug(St, "tcp_closed: socket = ~w~n", [Socket]), - Msg = {ssl_closed, St#st.thissock}, - St#st.collector ! Msg, + Msg = {ssl_closed, Thissock}, + Collector ! Msg, if - St#st.active == once -> + Active =:= once -> {noreply, St#st{status = closing, active = false}}; true -> {noreply, St#st{status = closing}} @@ -649,37 +628,36 @@ %% tcp_error - from proxy socket, active mode %% %% -handle_info({tcp_error, Socket, Reason}, St) - when St#st.proxysock == Socket, St#st.active =/= false -> +handle_info({tcp_error, Socket, Reason}, + #st{active = Active, collector = Collector, + proxysock = Socket} = St) + when Active =/= false -> debug(St, "tcp_error: socket = ~w, reason = ~w~n", [Socket, Reason]), - Msg = {ssl_error, St#st.thissock, Reason}, - St#st.collector ! Msg, + Msg = {ssl_error, Socket, Reason}, + Collector ! Msg, if - St#st.active == once -> + Active =:= once -> {noreply, St#st{status = closing, active = false}}; true -> {noreply, St#st{status = closing}} end; - %% EXIT - from client %% %% -handle_info({'EXIT', Client, Reason}, St) when St#st.client == Client -> +handle_info({'EXIT', Client, Reason}, #st{client = Client} = St) -> debug(St, "exit client: client = ~w, reason = ~w~n", [Client, Reason]), {stop, normal, St#st{status = closed}}; % do not make noise - %% EXIT - from server %% %% -handle_info({'EXIT', Server, Reason}, St) when St#st.server == Server -> +handle_info({'EXIT', Server, Reason}, #st{server = Server} = St) -> debug(St, "exit server: reason = ~w~n", [Reason]), {stop, Reason, St}; %% handle info catch all %% -%% handle_info(Info, St) -> debug(St, " bad info: ~w~n", [Info]), {stop, {error, {badinfo, Info}}, St}. @@ -987,7 +965,7 @@ %% Options %% -%% are_*_opts(Opts) -> true | false +%% are_*_opts(Opts) -> boolean() %% are_connect_opts(Opts) -> are_opts(fun is_connect_opt/1, Opts). @@ -1002,16 +980,16 @@ %% get_*_opts(Opts) -> Value %% get_tcp_accept_opts(Opts) -> - lists:filter(fun is_tcp_accept_opt/1, transform_opts(Opts)). + [O || O <- transform_opts(Opts), is_tcp_accept_opt(O)]. get_tcp_connect_opts(Opts) -> - lists:filter(fun is_tcp_connect_opt/1, transform_opts(Opts)). + [O || O <- transform_opts(Opts), is_tcp_connect_opt(O)]. get_tcp_listen_opts(Opts) -> - lists:filter(fun is_tcp_listen_opt/1, transform_opts(Opts)). + [O || O <- transform_opts(Opts), is_tcp_listen_opt(O)]. get_ssl_opts(Opts) -> - lists:filter(fun is_ssl_opt/1, transform_opts(Opts)). + [O || O <- transform_opts(Opts), is_ssl_opt(O)]. get_active(Opts) -> get_tagged_opt(active, Opts, true). @@ -1046,20 +1024,20 @@ add_default_opts(Opts, DefOpts) -> TOpts = transform_opts(Opts), - TOpts ++ [{DTag, DVal} || - {DTag, DVal} <- DefOpts, not lists:keymember(DTag, 1, TOpts)]. + TOpts ++ [DP || {DTag, _DVal} = DP <- DefOpts, + not lists:keymember(DTag, 1, TOpts)]. default_tcp_accept_opts() -> - lists:filter(fun is_tcp_accept_opt/1, default_opts()). + [O || O <- default_opts(), is_tcp_accept_opt(O)]. default_tcp_connect_opts() -> - lists:filter(fun is_tcp_connect_opt/1, default_opts()). + [O || O <- default_opts(), is_tcp_connect_opt(O)]. default_tcp_listen_opts() -> - lists:filter(fun is_tcp_listen_opt/1, default_opts()). + [O || O <- default_opts(), is_tcp_listen_opt(O)]. default_ssl_opts() -> - lists:filter(fun is_ssl_opt/1, default_opts()). + [O || O <- default_opts(), is_ssl_opt(O)]. default_opts() -> [{mode, list}, {packet, 0}, {nodelay, false}, {active, true}, @@ -1073,11 +1051,11 @@ transform_opts(Opts) -> lists:flatmap(fun transform_opt/1, Opts). -transform_opt(binary) -> [{mode, binary}]; -transform_opt(list) -> [{mode, list}]; -transform_opt({packet, raw}) -> [{packet, 0}]; -transform_opt(raw) -> []; -transform_opt(Opt) -> [Opt]. +transform_opt(binary) -> [{mode, binary}]; +transform_opt(list) -> [{mode, list}]; +transform_opt({packet, raw}) -> [{packet, 0}]; +transform_opt(raw) -> []; +transform_opt(Opt) -> [Opt]. %% NOTE: The is_*_opt/1 functions must be applied on transformed options %% only. @@ -1123,7 +1101,7 @@ is_tcp_listen_only_opt({backlog, Size}) when is_integer(Size), 0 =< Size -> true; -is_tcp_listen_only_opt({reuseaddr, Bool}) when Bool == true; Bool == false -> +is_tcp_listen_only_opt({reuseaddr, Bool}) when is_boolean(Bool) -> true; is_tcp_listen_only_opt(_Opt) -> false. @@ -1150,7 +1128,7 @@ is_string(_) -> false. -is_ip_address(Addr) when is_tuple(Addr), size(Addr) == 4 -> +is_ip_address(Addr) when tuple_size(Addr) =:= 4 -> is_string(tuple_to_list(Addr)); is_ip_address(Addr) when is_list(Addr) -> is_string(Addr); @@ -1171,7 +1149,7 @@ %% Makes a "command line" string of SSL options %% mk_ssl_optstr(Opts) -> - lists:flatten(lists:map(fun mk_one_ssl_optstr/1, Opts)). + lists:flatten([mk_one_ssl_optstr(O) || O <- Opts]). mk_one_ssl_optstr({verify, Code}) -> [" -verify ", integer_to_list(Code)]; @@ -1193,7 +1171,7 @@ "". extract_opts(OptTags, Opts) -> - lists:filter(fun ({Tag, _}) -> lists:member(Tag, OptTags) end, Opts). + [O || O = {Tag,_} <- Opts, lists:member(Tag, OptTags)]. replace_opts(NOpts, Opts) -> lists:foldl(fun({Key, Val}, Acc) -> @@ -1207,5 +1185,4 @@ %% Misc is_subset(A, B) -> - [] == A -- B. - + [] =:= A -- B. diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_cipher.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_cipher.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_cipher.erl 2009-03-12 12:32:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_cipher.erl 2009-11-20 13:37:44.000000000 +0000 @@ -48,9 +48,7 @@ %% cipher values has been updated according to %%------------------------------------------------------------------- security_parameters(CipherSuite, SecParams) -> - { _, Cipher, Hash, Exportable} = - suite_definition(CipherSuite), - + { _, Cipher, Hash, Exportable} = suite_definition(CipherSuite), SecParams#security_parameters{ cipher_suite = CipherSuite, bulk_cipher_algorithm = bulk_cipher_algorithm(Cipher), @@ -58,7 +56,7 @@ key_size = effective_key_bits(Cipher), expanded_key_material_length = expanded_key_material(Cipher), key_material_length = key_material(Cipher), - iv_size = iv_size(Cipher), + iv_size = iv_size(Cipher), mac_algorithm = mac_algorithm(Hash), hash_size = hash_size(Hash), exportable = Exportable}. @@ -102,9 +100,9 @@ crypto:des3_cbc_encrypt(K1, K2, K3, IV, T) end, block_size(des_cbc), CipherState, Mac, Fragment); cipher(?AES, CipherState, Mac, Fragment) -> - block_cipher(fun(Key, IV, T) when size(Key) == 16 -> + block_cipher(fun(Key, IV, T) when byte_size(Key) =:= 16 -> crypto:aes_cbc_128_encrypt(Key, IV, T); - (Key, IV, T) when size(Key) == 32 -> + (Key, IV, T) when byte_size(Key) =:= 32 -> crypto:aes_cbc_256_encrypt(Key, IV, T) end, block_size(aes_128_cbc), CipherState, Mac, Fragment); %% cipher(?IDEA, CipherState, Mac, Fragment) -> @@ -118,7 +116,7 @@ block_cipher(Fun, BlockSz, #cipher_state{key=Key, iv=IV} = CS0, Mac, Fragment) -> - TotSz = erlang:byte_size(Mac) + erlang:iolist_size(Fragment)+1, + TotSz = byte_size(Mac) + erlang:iolist_size(Fragment) + 1, {PaddingLength, Padding} = get_padding(TotSz, BlockSz), L = [Fragment, Mac, PaddingLength, Padding], ?DBG_HEX(Key), @@ -168,9 +166,9 @@ crypto:des3_cbc_decrypt(K1, K2, K3, IV, T) end, CipherState, HashSz, Fragment); decipher(?AES, HashSz, CipherState, Fragment) -> - block_decipher(fun(Key, IV, T) when size(Key) == 16 -> + block_decipher(fun(Key, IV, T) when byte_size(Key) =:= 16 -> crypto:aes_cbc_128_decrypt(Key, IV, T); - (Key, IV, T) when size(Key) == 32 -> + (Key, IV, T) when byte_size(Key) =:= 32 -> crypto:aes_cbc_256_decrypt(Key, IV, T) end, CipherState, HashSz, Fragment); %% decipher(?IDEA, HashSz, CipherState, Fragment) -> @@ -750,16 +748,16 @@ 20. generic_block_cipher_from_bin(T, HashSize) -> - Sz1 = size(T)-1, + Sz1 = byte_size(T) - 1, <<_:Sz1/binary, ?BYTE(PadLength)>> = T, - CompressedLength = size(T) - PadLength - 1 - HashSize, + CompressedLength = byte_size(T) - PadLength - 1 - HashSize, <> = T, #generic_block_cipher{content=Content, mac=Mac, padding=Padding, padding_length=PadLength}. generic_stream_cipher_from_bin(T, HashSz) -> - Sz = size(T), + Sz = byte_size(T), CompressedLength = Sz - HashSz, <> = T, #generic_stream_cipher{content=Content, @@ -778,8 +776,8 @@ {N, list_to_binary(lists:duplicate(N, N))}. next_iv(Bin, IV) -> - BinSz = size(Bin), - IVSz = size(IV), + BinSz = byte_size(Bin), + IVSz = byte_size(IV), FirstPart = BinSz - IVSz, <<_:FirstPart/binary, NextIV:IVSz/binary>> = Bin, NextIV. diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_connection.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_connection.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_connection.erl 2009-06-05 13:56:07.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_connection.erl 2009-11-20 13:37:43.000000000 +0000 @@ -39,7 +39,7 @@ -include_lib("public_key/include/public_key.hrl"). %% Internal application API --export([send/2, recv/3, connect/7, accept/6, close/1, shutdown/2, +-export([send/2, send/3, recv/3, connect/7, accept/6, close/1, shutdown/2, new_user/2, get_opts/2, set_opts/2, info/1, session_info/1, peer_certificate/1, sockname/1, peername/1]). @@ -48,7 +48,7 @@ -export([start_link/7]). %% gen_fsm callbacks --export([init/1, hello/2, certify/2, cipher/2, connection/2, abbreviated/2, +-export([init/1, hello/2, certify/2, cipher/2, connection/2, connection/3, abbreviated/2, handle_event/3, handle_sync_event/4, handle_info/3, terminate/3, code_change/4]). @@ -99,7 +99,9 @@ %% Description: %%-------------------------------------------------------------------- send(Pid, Data) -> - send_event(Pid, {application_data, erlang:iolist_to_binary(Data)}). + sync_send_event(Pid, {application_data, erlang:iolist_to_binary(Data)}, infinity). +send(Pid, Data, Timeout) -> + sync_send_event(Pid, {application_data, erlang:iolist_to_binary(Data)}, Timeout). %%-------------------------------------------------------------------- %% Function: %% @@ -248,7 +250,6 @@ session_cache = CacheRef, private_key = Key}, {ok, hello, State} - catch throw:Error -> {stop, Error} @@ -267,7 +268,8 @@ %% called if a timeout occurs. %%-------------------------------------------------------------------- hello(socket_control, #state{host = Host, port = Port, role = client, - ssl_options = SslOpts, + ssl_options = SslOpts, + transport_cb = Transport, socket = Socket, connection_states = ConnectionStates} = State0) -> Hello = ssl_handshake:client_hello(Host, Port, ConnectionStates, SslOpts), @@ -275,8 +277,7 @@ Hashes0 = ssl_handshake:init_hashes(), {BinMsg, CS2, Hashes1} = encode_handshake(Hello, Version, ConnectionStates, Hashes0), - Transport = State0#state.transport_cb, - Transport:send(State0#state.socket, BinMsg), + Transport:send(Socket, BinMsg), State = State0#state{connection_states = CS2, negotiated_version = Version, %% Requested version session = @@ -285,31 +286,27 @@ tls_handshake_hashes = Hashes1}, {next_state, hello, next_record(State)}; -hello(socket_control, #state{role = server} = State0) -> - State = State0#state{session = #session{is_resumable = false}}, +hello(socket_control, #state{role = server} = State) -> {next_state, hello, next_record(State)}; hello(hello, #state{role = client} = State) -> {next_state, hello, State}; -hello(Hello = #server_hello{}, #state{session = Session0 = - #session{session_id = OldId}, - connection_states = - ConnectionStates0, - role = client, - negotiated_version = ReqVersion, - host = Host, port = Port, - session_cache = Cache, - session_cache_cb = CacheCb} = State0) -> +hello(#server_hello{cipher_suite = CipherSuite, + compression_method = Compression} = Hello, + #state{session = Session0 = #session{session_id = OldId}, + connection_states = ConnectionStates0, + role = client, + negotiated_version = ReqVersion, + host = Host, port = Port, + session_cache = Cache, + session_cache_cb = CacheCb} = State0) -> {Version, NewId, ConnectionStates1} = ssl_handshake:hello(Hello, ConnectionStates0), - CipherSuite = Hello#server_hello.cipher_suite, - {KeyAlgorithm, _, _, _} = ssl_cipher:suite_definition(CipherSuite), - Compression = Hello#server_hello.compression_method, PremasterSecret = make_premaster_secret(ReqVersion), State = State0#state{key_algorithm = KeyAlgorithm, @@ -339,7 +336,7 @@ end end; -hello(Hello = #client_hello{}, +hello(Hello = #client_hello{client_version = ClientVersion}, State = #state{connection_states = ConnectionStates0, port = Port, session = Session0, session_cache = Cache, @@ -355,11 +352,12 @@ negotiated_version = Version, session = Session}); #alert{} = Alert -> - handle_own_alert(Alert, Hello#client_hello.client_version, - hello, State), + handle_own_alert(Alert, ClientVersion, hello, State), {stop, normal, State} end. +abbreviated(socket_control, #state{role = server} = State) -> + {next_state, abbreviated, State}; abbreviated(hello, State) -> {next_state, certify, State}; @@ -398,6 +396,8 @@ {stop, normal, State} end. +certify(socket_control, #state{role = server} = State) -> + {next_state, certify, State}; certify(hello, State) -> {next_state, certify, State}; @@ -415,7 +415,7 @@ ssl_options = #ssl_options{verify = verify_peer, fail_if_no_peer_cert = false}} = State) -> - {next_state, certify, next_record(State)}; + {next_state, certify, next_record(State#state{client_certificate_requested = false})}; certify(#certificate{} = Cert, #state{session = Session, @@ -427,8 +427,10 @@ Opts#ssl_options.verify_fun) of {PeerCert, PublicKeyInfo} -> State = State0#state{session = - Session#session{peer_certificate = PeerCert}, - public_key_info = PublicKeyInfo}, + Session#session{peer_certificate = PeerCert}, + public_key_info = PublicKeyInfo, + client_certificate_requested = false + }, {next_state, certify, next_record(State)}; #alert{} = Alert -> handle_own_alert(Alert, Version, certify_certificate, State0), @@ -478,6 +480,17 @@ {stop, normal, State0} end; +certify(#client_key_exchange{}, + State = #state{role = server, + client_certificate_requested = true, + ssl_options = #ssl_options{fail_if_no_peer_cert = true}, + negotiated_version = Version}) -> + %% We expect a certificate here + Alert = ?ALERT_REC(?FATAL, ?UNEXPECTED_MESSAGE), + handle_own_alert(Alert, Version, certify_server_waiting_certificate, State), + {stop, normal, State}; + + certify(#client_key_exchange{exchange_keys = #encrypted_premaster_secret{premaster_secret = EncPMS}}, @@ -506,6 +519,8 @@ {stop, normal, State0} end. +cipher(socket_control, #state{role = server} = State) -> + {next_state, cipher, State}; cipher(hello, State) -> {next_state, cipher, State}; @@ -562,6 +577,8 @@ {stop, normal, State} end. +connection(socket_control, #state{role = server} = State) -> + {next_state, connection, State}; connection(hello, State = #state{host = Host, port = Port, socket = Socket, ssl_options = SslOpts, @@ -576,17 +593,7 @@ encode_handshake(Hello, Version, ConnectionStates0, Hashes0), Transport:send(Socket, BinMsg), {next_state, hello, State#state{connection_states = ConnectionStates1, - tls_handshake_hashes = Hashes1}}; - -connection({application_data, Data}, - State = #state{socket = Socket, - negotiated_version = Version, - transport_cb = Transport, - connection_states = ConnectionStates0}) -> - {Msgs, ConnectionStates1} = encode_data(Data, Version, ConnectionStates0), - Transport:send(Socket, Msgs), - {next_state, connection, State#state{connection_states = - ConnectionStates1}}. + tls_handshake_hashes = Hashes1}}. %%-------------------------------------------------------------------- %% Function: @@ -603,8 +610,18 @@ %% gen_fsm:sync_send_event/2,3, the instance of this function with the same %% name as the current state name StateName is called to handle the event. %%-------------------------------------------------------------------- -%% state_name(_Event, _From, State) -> -%% {reply, _Reply, _StateName, State}. +connection({application_data, Data}, _From, + State = #state{socket = Socket, + negotiated_version = Version, + transport_cb = Transport, + connection_states = ConnectionStates0}) -> + %% We should look into having a worker process to do this to + %% parallize send and receive decoding and not block the receiver + %% if sending is overloading the socket. + {Msgs, ConnectionStates1} = encode_data(Data, Version, ConnectionStates0), + Result = Transport:send(Socket, Msgs), + {reply, Result, + connection, State#state{connection_states = ConnectionStates1}}. %%-------------------------------------------------------------------- %% Function: @@ -874,7 +891,8 @@ port = Port, socket_options = Opts, user_application = {_Mon,Pid}, from = From, role = Role, session = Session} = State) -> - error_logger:info_report("SSL: Peer did not send close notify alert."), + %% Debug option maybe, the user do NOT want to see these in their logs + %% error_logger:info_report("SSL: Peer did not send close notify alert."), case Version of {1, N} when N >= 1 -> ok; @@ -1000,16 +1018,30 @@ send_event(FsmPid, Event) -> gen_fsm:send_event(FsmPid, Event). +sync_send_event(FsmPid, Event, Timeout) -> + try gen_fsm:sync_send_event(FsmPid, Event, Timeout) of + Reply -> + Reply + catch + exit:{noproc, _} -> + {error, closed}; + exit:{timeout, _} -> + {error, timeout}; + exit:{normal, _} -> + {error, closed} + end. + + + send_all_state_event(FsmPid, Event) -> gen_fsm:send_all_state_event(FsmPid, Event). sync_send_all_state_event(FsmPid, Event) -> - sync_send_all_state_event(FsmPid, Event, ?DEFAULT_TIMEOUT). + sync_send_all_state_event(FsmPid, Event, ?DEFAULT_TIMEOUT +). sync_send_all_state_event(FsmPid, Event, Timeout) -> - try gen_fsm:sync_send_all_state_event(FsmPid, Event, Timeout) of - Reply -> - Reply + try gen_fsm:sync_send_all_state_event(FsmPid, Event, Timeout) catch exit:{noproc, _} -> {error, closed}; @@ -1096,19 +1128,18 @@ end end; -do_server_hello(#server_hello{} = ServerHello, +do_server_hello(#server_hello{cipher_suite = CipherSuite, + compression_method = Compression, + session_id = SessionId}, #state{session = Session0, negotiated_version = Version} = State0) -> try server_certify_and_key_exchange(State0) of #state{} = State1 -> State = server_hello_done(State1), - CipherSuite = ServerHello#server_hello.cipher_suite, Session = - Session0#session{session_id = - ServerHello#server_hello.session_id, + Session0#session{session_id = SessionId, cipher_suite = CipherSuite, - compression_method = - ServerHello#server_hello.compression_method}, + compression_method = Compression}, {next_state, certify, State#state{session = Session}} catch #alert{} = Alert -> @@ -1304,7 +1335,8 @@ {BinMsg, ConnectionStates1, Hashes1} = encode_handshake(Msg, Version, ConnectionStates0, Hashes0), Transport:send(Socket, BinMsg), - State#state{connection_states = ConnectionStates1, + State#state{client_certificate_requested = true, + connection_states = ConnectionStates1, tls_handshake_hashes = Hashes1}; request_client_cert(#state{ssl_options = #ssl_options{verify = verify_none}} = State) -> @@ -1425,7 +1457,7 @@ Active =/= false orelse BytesToRead =:= 0 -> %% Active true or once, or passive mode recv(0) {ok, Buffer, <<>>}; - size(Buffer) >= BytesToRead -> + byte_size(Buffer) >= BytesToRead -> %% Passive Mode, recv(Bytes) <> = Buffer, {ok, Data, Rest}; @@ -1565,6 +1597,7 @@ %% We do not want to save the password in the state so that %% could be written in the clear into error logs. ssl_options = SSLOptions#ssl_options{password = undefined}, + session = #session{is_resumable = false}, transport_cb = CbModule, data_tag = DataTag, close_tag = CloseTag, diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl.erl 2009-06-05 13:55:21.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl.erl 2009-11-20 13:36:29.000000000 +0000 @@ -429,12 +429,9 @@ %%-------------------------------------------------------------------- versions() -> Vsns = ssl_record:supported_protocol_versions(), - SupportedVsns = lists:map(fun(Version) -> - ssl_record:protocol_version(Version) - end, Vsns), + SupportedVsns = [ssl_record:protocol_version(Vsn) || Vsn <- Vsns], AvailableVsns = ?DEFAULT_SUPPORTED_VERSIONS, - [{ssl_app, ?VSN}, {supported, SupportedVsns}, - {available, AvailableVsns}]. + [{ssl_app, ?VSN}, {supported, SupportedVsns}, {available, AvailableVsns}]. %%%-------------------------------------------------------------- %%% Internal functions @@ -607,17 +604,13 @@ Value; validate_option(ciphers, Value) when is_list(Value) -> Version = ssl_record:highest_protocol_version([]), - try cipher_suites(Version, Value) of - Ciphers -> - Ciphers + try cipher_suites(Version, Value) catch exit:_ -> throw({error, {eoptions, {ciphers, Value}}}) end; - validate_option(reuse_session, Value) when is_function(Value) -> Value; - validate_option(reuse_sessions, Value) when Value == true; Value == false -> Value; @@ -639,7 +632,7 @@ when Value =/= list, Value =/= binary -> throw({error, {eoptions, {mode,Value}}}); validate_inet_option(packet, Value) - when not (is_atom(Value) or is_integer(Value)) -> + when not (is_atom(Value) orelse is_integer(Value)) -> throw({error, {eoptions, {packet,Value}}}); validate_inet_option(packet_size, Value) when not is_integer(Value) -> @@ -705,7 +698,7 @@ cipher_suites(Version, []) -> ssl_cipher:suites(Version); cipher_suites(Version, [{_,_,_,_}| _] = Ciphers0) -> - Ciphers = lists:map(fun ssl_cipher:suite/1, Ciphers0), + Ciphers = [ssl_cipher:suite(C) || C <- Ciphers0], cipher_suites(Version, Ciphers); cipher_suites(Version, [Cipher0 | _] = Ciphers0) when is_binary(Cipher0) -> Supported = ssl_cipher:suites(Version), @@ -717,12 +710,11 @@ end; cipher_suites(Version, [Head | _] = Ciphers0) when is_list(Head) -> %% Format: ["RC4-SHA","RC4-MD5"] - Ciphers = lists:map(fun ssl_cipher:openssl_suite/1, Ciphers0), + Ciphers = [ssl_cipher:openssl_suite(C) || C <- Ciphers0], cipher_suites(Version, Ciphers); cipher_suites(Version, Ciphers0) -> %% Format: "RC4-SHA:RC4-MD5" - Ciphers = lists:map(fun ssl_cipher:openssl_suite/1, - string:tokens(Ciphers0, ":")), + Ciphers = [ssl_cipher:openssl_suite(C) || C <- string:tokens(Ciphers0, ":")], cipher_suites(Version, Ciphers). format_error({error, Reason}) -> @@ -845,5 +837,5 @@ %% work correctly if a valid pid is returned. pid(#sslsocket{fd = new_ssl}) -> whereis(ssl_connection_sup); -pid(#sslsocket{} = Socket) -> - Socket#sslsocket.pid. +pid(#sslsocket{pid = Pid}) -> + Pid. diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_handshake.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_handshake.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_handshake.erl 2009-06-05 13:56:07.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_handshake.erl 2009-11-20 13:37:44.000000000 +0000 @@ -101,45 +101,34 @@ %% {Version, Id, NewConnectionStates} | %% #alert{} %% -%% Hello = #client_hello | #server_hello +%% Hello = #client_hello{} | #server_hello{} %% Info = ConnectionStates | {Port, Session, ConnectionStates} %% ConnectionStates = #connection_states{} %% %% Description: Handles a recieved hello message %%-------------------------------------------------------------------- -hello(Hello = #server_hello{}, ConnectionStates) -> - - Version = Hello#server_hello.server_version, - SessionId = Hello#server_hello.session_id, - +hello(#server_hello{cipher_suite = CipherSuite, server_version = Version, + compression_method = Compression, random = Random, + session_id = SessionId}, ConnectionStates) -> NewConnectionStates = - hello_pending_connection_states(client, - Hello#server_hello.cipher_suite, - Hello#server_hello.random, - Hello#server_hello.compression_method, - ConnectionStates), - + hello_pending_connection_states(client, CipherSuite, Random, + Compression, ConnectionStates), {Version, SessionId, NewConnectionStates}; -hello(Hello = #client_hello{}, {Port, - #ssl_options{versions = Versions} = SslOpts, - Session0, Cache, CacheCb, - ConnectionStates0}) -> - - Version = select_version(Hello#client_hello.client_version, Versions), - +hello(#client_hello{client_version = ClientVersion, random = Random} = Hello, + {Port, #ssl_options{versions = Versions} = SslOpts, + Session0, Cache, CacheCb, ConnectionStates0}) -> + Version = select_version(ClientVersion, Versions), case ssl_record:is_acceptable_version(Version) of true -> {Type, #session{cipher_suite = CipherSuite, compression_method = Compression} = Session} = select_session(Hello, Port, Session0, Version, SslOpts, Cache, CacheCb), - case CipherSuite of no_suite -> ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY); _ -> - Random = Hello#client_hello.random, ConnectionStates = hello_pending_connection_states(server, CipherSuite, @@ -259,9 +248,8 @@ %% Description: Checks that the certificate_verify message is valid. %%-------------------------------------------------------------------- certificate_verify(Signature, {_, PublicKey, _}, Version, - MasterSecret, Algorithm, {_, Hashes0}) when Algorithm == rsa; - Algorithm == dh_rsa; - Algorithm == dhe_rsa -> + MasterSecret, Algorithm, {_, Hashes0}) + when Algorithm =:= rsa; Algorithm =:= dh_rsa; Algorithm =:= dhe_rsa -> Hashes = calc_certificate_verify(Version, MasterSecret, Algorithm, Hashes0), case public_key:decrypt_public(Signature, PublicKey, @@ -271,7 +259,7 @@ _ -> ?ALERT_REC(?FATAL, ?BAD_CERTIFICATE) end. -%% TODO dsa cluse +%% TODO dsa clause %%-------------------------------------------------------------------- %% Function: certificate_request(ConnectionStates, CertDbRef) -> @@ -309,7 +297,7 @@ dh_public = <<>> }}; key_exchange(client, {dh, PublicKey}) -> - Len = size(PublicKey), + Len = byte_size(PublicKey), #client_key_exchange{ exchange_keys = #client_diffie_hellman_public{ dh_public = <>} @@ -319,9 +307,9 @@ %% #'DomainParameters'{p = P, g = G, y = Y}, %% SignAlgorithm, ClientRandom, ServerRandom}}) -> %% ServerDHParams = #server_dh_params{dh_p = P, dh_g = G, dh_y = Y}, -%% PLen = size(P), -%% GLen = size(G), -%% YLen = size(Y), +%% PLen = byte_size(P), +%% GLen = byte_size(G), +%% YLen = byte_size(Y), %% Hash = server_key_exchange_hash(SignAlgorithm, < - Result + ConnectionStates, Role) catch exit:Reason -> error_logger:error_report("Key calculation failed due to ~p", @@ -375,10 +361,7 @@ try master_secret(Version, calc_master_secret(Version,PremasterSecret, ClientRandom, ServerRandom), - SecParams, ConnectionStates, Role) of - Result -> - Result - + SecParams, ConnectionStates, Role) catch exit:Reason -> error_logger:error_report("Master secret calculation failed" @@ -436,7 +419,7 @@ %%-------------------------------------------------------------------- encode_handshake(Package, Version, SigAlg) -> {MsgType, Bin} = enc_hs(Package, Version, SigAlg), - Len = size(Bin), + Len = byte_size(Bin), [MsgType, ?uint24(Len), Bin]. %%-------------------------------------------------------------------- @@ -719,9 +702,7 @@ decrypt_premaster_secret(Secret, RSAPrivateKey) -> try public_key:decrypt_private(Secret, RSAPrivateKey, - [{rsa_pad, rsa_pkcs1_padding}]) of - PreMasterSecret -> - PreMasterSecret + [{rsa_pad, rsa_pkcs1_padding}]) catch _:_ -> throw(?ALERT_REC(?FATAL, ?DECRYPTION_FAILED)) @@ -738,7 +719,7 @@ certs_from_list(ACList) -> list_to_binary([begin - CertLen = size(Cert), + CertLen = byte_size(Cert), <> end || Cert <- ACList]). @@ -750,11 +731,11 @@ session_id = SessionID, cipher_suites = CipherSuites, compression_methods = CompMethods}, _Version, _) -> - SIDLength = size(SessionID), + SIDLength = byte_size(SessionID), BinCompMethods = list_to_binary(CompMethods), - CmLength = size(BinCompMethods), + CmLength = byte_size(BinCompMethods), BinCipherSuites = list_to_binary(CipherSuites), - CsLength = size(BinCipherSuites), + CsLength = byte_size(BinCipherSuites), {?CLIENT_HELLO, < - SID_length = size(Session_ID), + SID_length = byte_size(Session_ID), {?SERVER_HELLO, <>}; @@ -776,8 +757,8 @@ enc_hs(#server_key_exchange{params = #server_rsa_params{rsa_modulus = Mod, rsa_exponent = Exp}, signed_params = SignedParams}, _Version, _) -> - ModLen = size(Mod), - ExpLen = size(Exp), + ModLen = byte_size(Mod), + ExpLen = byte_size(Exp), {?SERVER_KEY_EXCHANGE, <> @@ -785,9 +766,9 @@ enc_hs(#server_key_exchange{params = #server_dh_params{ dh_p = P, dh_g = G, dh_y = Y}, signed_params = SignedParams}, _Version, _) -> - PLen = size(P), - GLen = size(G), - YLen = size(Y), + PLen = byte_size(P), + GLen = byte_size(G), + YLen = byte_size(Y), {?SERVER_KEY_EXCHANGE, < - CertTypesLen = size(CertTypes), - CertAuthsLen = size(CertAuths), + CertTypesLen = byte_size(CertTypes), + CertAuthsLen = byte_size(CertAuths), {?CERTIFICATE_REQUEST, <> @@ -815,14 +796,14 @@ enc_cke(#encrypted_premaster_secret{premaster_secret = PKEPMS},{3, 0}) -> PKEPMS; enc_cke(#encrypted_premaster_secret{premaster_secret = PKEPMS}, _) -> - PKEPMSLen = size(PKEPMS), + PKEPMSLen = byte_size(PKEPMS), <>; enc_cke(#client_diffie_hellman_public{dh_public = DHPublic}, _) -> - Len = size(DHPublic), + Len = byte_size(DHPublic), <>. enc_bin_sig(BinSig) -> - Size = size(BinSig), + Size = byte_size(BinSig), <>. init_hashes() -> diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_pem.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_pem.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_pem.erl 2009-03-12 12:31:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_pem.erl 2009-11-20 13:37:24.000000000 +0000 @@ -116,26 +116,25 @@ file:write_file(File, encode_file(Ds)). encode_file(Ds) -> - lists:map( - fun({cert, Bin}) -> - %% PKIX (X.509) - ["-----BEGIN CERTIFICATE-----\n", - ssl_base64:encode_split(Bin), - "-----END CERTIFICATE-----\n\n"]; - ({cert_req, Bin}) -> - %% PKCS#10 - ["-----BEGIN CERTIFICATE REQUEST-----\n", - ssl_base64:encode_split(Bin), - "-----END CERTIFICATE REQUEST-----\n\n"]; - ({rsa_private_key, Bin}) -> - %% PKCS#? - ["XXX Following key assumed not encrypted\n", - "-----BEGIN RSA PRIVATE KEY-----\n", - ssl_base64:encode_split(Bin), - "-----END RSA PRIVATE KEY-----\n\n"] - end, Ds). + [encode_file_1(D) || D <- Ds]. + +encode_file_1({cert, Bin}) -> + %% PKIX (X.509) + ["-----BEGIN CERTIFICATE-----\n", + ssl_base64:encode_split(Bin), + "-----END CERTIFICATE-----\n\n"]; +encode_file_1({cert_req, Bin}) -> + %% PKCS#10 + ["-----BEGIN CERTIFICATE REQUEST-----\n", + ssl_base64:encode_split(Bin), + "-----END CERTIFICATE REQUEST-----\n\n"]; +encode_file_1({rsa_private_key, Bin}) -> + %% PKCS#? + ["XXX Following key assumed not encrypted\n", + "-----BEGIN RSA PRIVATE KEY-----\n", + ssl_base64:encode_split(Bin), + "-----END RSA PRIVATE KEY-----\n\n"]. - password_to_key(Data, Salt, KeyLen) -> <> = password_to_key(<<>>, Data, Salt, KeyLen, <<>>), @@ -145,4 +144,4 @@ Acc; password_to_key(Prev, Data, Salt, Len, Acc) -> M = crypto:md5([Prev, Data, Salt]), - password_to_key(M, Data, Salt, Len - size(M), <>). + password_to_key(M, Data, Salt, Len - byte_size(M), <>). diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_pkix.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_pkix.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_pkix.erl 2009-06-05 13:26:43.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_pkix.erl 2009-11-20 13:37:24.000000000 +0000 @@ -161,32 +161,25 @@ %% Transfrom from PKIX1-Explicit88 to SSL-PKIX. -transform(#'Certificate'{} = Cert, Type) -> - Cert#'Certificate'{tbsCertificate = - transform(Cert#'Certificate'.tbsCertificate, Type), - signatureAlgorithm = - transform(Cert#'Certificate'.signatureAlgorithm, Type), - signature = - transform(Cert#'Certificate'.signature, Type)}; +transform(#'Certificate'{signature = Signature, + signatureAlgorithm = SignatureAlgorithm, + tbsCertificate = TbsCertificate} = Cert, Type) -> + Cert#'Certificate'{tbsCertificate = transform(TbsCertificate, Type), + signatureAlgorithm = transform(SignatureAlgorithm, Type), + signature = transform(Signature, Type)}; %% -record('TBSCertificate',{ %% version = asn1_DEFAULT, serialNumber, signature, issuer, validity, subject, %% subjectPublicKeyInfo, issuerUniqueID = asn1_NOVALUE, %% subjectUniqueID = asn1_NOVALUE, extensions = asn1_NOVALUE}). -transform(#'TBSCertificate'{} = TBSCert, Type) -> - Signature = TBSCert#'TBSCertificate'.signature, - Issuer = TBSCert#'TBSCertificate'.issuer, - Subject = TBSCert#'TBSCertificate'.subject, - SPKInfo = TBSCert#'TBSCertificate'.subjectPublicKeyInfo, - Extensions = TBSCert#'TBSCertificate'.extensions, - +transform(#'TBSCertificate'{signature = Signature, issuer = Issuer, + subject = Subject, extensions = Extensions, + subjectPublicKeyInfo = SPKInfo} = TBSCert, Type) -> TBSCert#'TBSCertificate'{signature = transform(Signature, Type), issuer = transform(Issuer, Type), - subject = - transform(Subject, Type), - subjectPublicKeyInfo = - transform(SPKInfo, Type), + subject = transform(Subject, Type), + subjectPublicKeyInfo = transform(SPKInfo, Type), extensions = transform_extensions(Extensions, Type) }; @@ -201,9 +194,7 @@ SignAlgCd#'SignatureAlgorithm'{algorithm = NAlgo}; transform({rdnSequence, Lss}, Type) when is_list(Lss) -> - {rdnSequence, - lists:map(fun(Ls) -> lists:map(fun(L) -> transform(L, Type) end, Ls) - end, Lss)}; + {rdnSequence, [[transform(L, Type) || L <- Ls] || Ls <- Lss]}; transform({rdnSequence, Lss}, _) -> {rdnSequence, Lss}; @@ -232,15 +223,12 @@ %% -record('PublicKeyAlgorithm',{ %% algorithm, parameters = asn1_NOVALUE}). -transform(#'SubjectPublicKeyInfo'{} = SInfo, ssl) -> +transform(#'SubjectPublicKeyInfo'{subjectPublicKey = SubjectPublicKey, + algorithm = Algorithm}, ssl) -> %% Transform from SubjectPublicKeyInfo (PKIX1Explicit88) %% to SubjectPublicKeyInfo-Any (SSL-PKIX). - Algorithm = SInfo#'SubjectPublicKeyInfo'.algorithm, Algo = Algorithm#'AlgorithmIdentifier'.algorithm, Parameters = Algorithm#'AlgorithmIdentifier'.parameters, - SubjectPublicKey = - SInfo#'SubjectPublicKeyInfo'.subjectPublicKey, - AlgorithmAny = #'PublicKeyAlgorithm'{algorithm = Algo, parameters = Parameters}, {0, Bin} = SubjectPublicKey, @@ -268,12 +256,11 @@ transform(#'SubjectPublicKeyInfo'{} = SInfo, pkix) -> SInfo; -transform(#'Extension'{} = Ext, ssl) -> - NewExtID = ssl_pkix_oid:id2atom(Ext#'Extension'.extnID), +transform(#'Extension'{extnID = ExtnID} = Ext, ssl) -> + NewExtID = ssl_pkix_oid:id2atom(ExtnID), ExtAny = setelement(1, Ext, 'Extension-Any'), {ok, AnyEnc} = 'OTP-PKIX':encode('Extension-Any', ExtAny), - {ok, ExtCd} = 'OTP-PKIX':decode('SSLExtension', - list_to_binary(AnyEnc)), + {ok, ExtCd} = 'OTP-PKIX':decode('SSLExtension', list_to_binary(AnyEnc)), ExtValue = transform_extension_value(NewExtID, ExtCd#'SSLExtension'.extnValue, @@ -282,17 +269,13 @@ critical = ExtCd#'SSLExtension'.critical, extnValue = ExtValue}; -transform(#'Extension'{} = Ext, pkix) -> - NewExtID = ssl_pkix_oid:id2atom(Ext#'Extension'.extnID), - ExtValue = - transform_extension_value(NewExtID, - Ext#'Extension'.extnValue, - pkix), - +transform(#'Extension'{extnID = ExtnID, extnValue = ExtnValue} = Ext, pkix) -> + NewExtID = ssl_pkix_oid:id2atom(ExtnID), + ExtValue = transform_extension_value(NewExtID, ExtnValue, pkix), Ext#'Extension'{extnValue = ExtValue}; -transform(#'AuthorityKeyIdentifier'{} = Ext, Type) -> - CertIssuer = Ext#'AuthorityKeyIdentifier'.authorityCertIssuer, +transform(#'AuthorityKeyIdentifier'{authorityCertIssuer = CertIssuer} = Ext, + Type) -> Ext#'AuthorityKeyIdentifier'{authorityCertIssuer = transform(CertIssuer, Type)}; @@ -308,7 +291,7 @@ Value. transform_extensions(Exts, Type) when is_list(Exts) -> - lists:map(fun(Ext) -> transform(Ext, Type) end, Exts); + [transform(Ext, Type) || Ext <- Exts]; transform_extensions(Exts, _) -> Exts. diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_prim.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_prim.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_prim.erl 2009-03-12 12:29:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_prim.erl 2009-11-20 13:36:50.000000000 +0000 @@ -24,7 +24,7 @@ -module(ssl_prim). --export([listen/2, connect/3, accept/1, close/1, send/2, recv/2, recv/3, +-export([listen/2, connect/3, accept/1, close/1, send/2, send/3, recv/2, recv/3, getll/1, getstat/2, setopts/2, controlling_process/2, peername/1, sockname/1, getif/1]). @@ -43,7 +43,7 @@ ?filter(ssl_broker:connect_prim(ssl_server_prim, inet_tcp, self(), Address, Port, nonactive(Opts), infinity, St)). -accept(ListenSt0) when record(ListenSt0, st) -> +accept(#st{} = ListenSt0) -> case transport_accept(ListenSt0) of {ok, ListenSt1} -> ssl_accept(ListenSt0, ListenSt1); @@ -51,108 +51,95 @@ Error end. -transport_accept(ListenSt) when record(ListenSt, st) -> +transport_accept(#st{opts = ListenOpts, thissock = ListenSocket}) -> NewSt = newstate(acceptor), - ListenSocket=ListenSt#st.thissock, ListenFd = ListenSocket#sslsocket.fd, - ListenOpts = ListenSt#st.opts, - ?filter(ssl_broker:transport_accept_prim( - ssl_server_prim, ListenFd, - ListenOpts, infinity, NewSt)). + ?filter(ssl_broker:transport_accept_prim(ssl_server_prim, ListenFd, + ListenOpts, infinity, NewSt)). -ssl_accept(ListenSt0, ListenSt1) when is_record(ListenSt0, st) -> - LOpts = ListenSt0#st.opts, - %% LOpts = [], - A = ?filter(ssl_broker:ssl_accept_prim( - ssl_server_prim, gen_tcp, self(), LOpts, infinity, ListenSt1)), - A. +ssl_accept(#st{opts = LOpts}, ListenSt1) -> + ?filter(ssl_broker:ssl_accept_prim(ssl_server_prim, gen_tcp, self(), + LOpts, infinity, ListenSt1)). - - -close(_St = #st{fd = Fd}) when integer(Fd) -> +close(#st{fd = Fd}) when is_integer(Fd) -> ssl_server:close_prim(ssl_server_prim, Fd), ok; close(_) -> ok. -send(St, Data) when record(St, st), St#st.status =:= open -> - case inet_tcp:send(St#st.proxysock, Data) of +send(St, Data) -> + send(St, Data, []). + +send(#st{proxysock = Proxysock, status = open}, Data, Opts) -> + case inet_tcp:send(Proxysock, Data, Opts) of ok -> ok; {error, _} -> {error, closed} end; - -send(St, _Data) when record(St, st) -> +send(#st{}, _Data, _Opts) -> {error, closed}. -recv(St,Length) -> - recv(St,Length,infinity). +recv(St, Length) -> + recv(St, Length, infinity). -recv(St, Length, Tmo) when record(St, st), St#st.status =:= open -> - inet_tcp:recv(St#st.proxysock, Length, Tmo); - -recv(St, _Length, _Tmo) when record(St, st) -> +recv(#st{proxysock = Proxysock, status = open}, Length, Tmo) -> + inet_tcp:recv(Proxysock, Length, Tmo); +recv(#st{}, _Length, _Tmo) -> {error, closed}. -getll(St) when record(St, st), St#st.status =:= open -> - inet:getll(St#st.proxysock); - -getll(St) when record(St, st) -> +getll(#st{proxysock = Proxysock, status = open}) -> + inet:getll(Proxysock); +getll(#st{}) -> {error, closed}. -getstat(St, Opts) when record(St, st), St#st.status =:= open -> - inet:getstat(St#st.proxysock, Opts); - -getstat(St, _Opts) when record(St, st) -> +getstat(#st{proxysock = Proxysock, status = open}, Opts) -> + inet:getstat(Proxysock, Opts); +getstat(#st{}, _Opts) -> {error, closed}. -setopts(St, Opts) when record(St, st), St#st.status =:= open -> +setopts(#st{proxysock = Proxysock, status = open}, Opts) -> case remove_supported(Opts) of [] -> - inet:setopts(St#st.proxysock, Opts); + inet:setopts(Proxysock, Opts); _ -> {error, enotsup} end; - -setopts(St, _Opts) when record(St, st) -> +setopts(#st{}, _Opts) -> {error, closed}. -controlling_process(St, Pid) when record(St, st), St#st.status =:= open, pid(Pid) -> - inet_tcp:controlling_process(St#st.proxysock, Pid); - -controlling_process(St, Pid) when record(St, st), pid(Pid) -> +controlling_process(#st{proxysock = Proxysock, status = open}, Pid) + when is_pid(Pid) -> + inet_tcp:controlling_process(Proxysock, Pid); +controlling_process(#st{}, Pid) when is_pid(Pid) -> {error, closed}. -peername(St) when record(St, st), St#st.status =:= open -> - case ssl_server:peername_prim(ssl_server_prim, St#st.fd) of +peername(#st{fd = Fd, status = open}) -> + case ssl_server:peername_prim(ssl_server_prim, Fd) of {ok, {Address, Port}} -> {ok, At} = inet_parse:ipv4_address(Address), {ok, {At, Port}}; Error -> Error end; - -peername(St) when record(St, st) -> +peername(#st{}) -> {error, closed}. -sockname(St) when record(St, st), St#st.status =:= open -> - case ssl_server:sockname_prim(ssl_server_prim, St#st.fd) of +sockname(#st{fd = Fd, status = open}) -> + case ssl_server:sockname_prim(ssl_server_prim, Fd) of {ok, {Address, Port}} -> {ok, At} = inet_parse:ipv4_address(Address), {ok, {At, Port}}; Error -> Error end; - -sockname(St) when record(St, st) -> +sockname(#st{}) -> {error, closed}. -getif(St) when record(St, st), St#st.status =:= open -> - inet:getif(St#st.proxysock); - -getif(St) when record(St, st) -> +getif(#st{proxysock = Proxysock, status = open}) -> + inet:getif(Proxysock); +getif(#st{}) -> {error, closed}. remove_supported([{active, _}|T]) -> @@ -184,4 +171,3 @@ newstate(Type) -> #st{brokertype = Type, server = whereis(ssl_server_prim), client = undefined, collector = undefined, debug = false}. - diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_record.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_record.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_record.erl 2009-03-12 12:32:46.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_record.erl 2009-11-20 13:37:43.000000000 +0000 @@ -255,7 +255,7 @@ Data:Length/binary, Rest/binary>>, Acc) -> get_tls_records_aux(Rest, [#ssl_tls{type = ?HANDSHAKE, version = {MajVer, MinVer}, - fragment=Data} | Acc]); + fragment = Data} | Acc]); get_tls_records_aux(<>, Acc) -> @@ -475,7 +475,7 @@ end. encode_data(Frag, Version, ConnectionStates) - when erlang:byte_size(Frag) < (?MAX_PLAIN_TEXT_LENGTH - 2048) -> + when byte_size(Frag) < (?MAX_PLAIN_TEXT_LENGTH - 2048) -> encode_plain_text(?APPLICATION_DATA,Version,Frag,ConnectionStates); encode_data(Frag, Version, ConnectionStates) -> Data = split_bin(Frag, ?MAX_PLAIN_TEXT_LENGTH - 2048), @@ -511,12 +511,12 @@ CTBin = encode_tls_cipher_text(Type, Version, CipherText), {CTBin, ConnectionStates#connection_states{current_write = CS2}}. -encode_tls_cipher_text(Type,{MajVer,MinVer},Fragment) -> +encode_tls_cipher_text(Type, {MajVer, MinVer}, Fragment) -> Length = erlang:iolist_size(Fragment), [<>, Fragment]. cipher(Type, Version, Fragment, CS0) -> - Length = erlang:iolist_size(Fragment), + Length = erlang:iolist_size(Fragment), {Hash, CS1=#connection_state{cipher_state = CipherS0, security_parameters= #security_parameters{bulk_cipher_algorithm = @@ -572,6 +572,6 @@ mac_hash({3, 0}, MacAlg, MacSecret, SeqNo, Type, Length, Fragment) -> ssl_ssl3:mac_hash(MacAlg, MacSecret, SeqNo, Type, Length, Fragment); mac_hash({3, N} = Version, MacAlg, MacSecret, SeqNo, Type, Length, Fragment) - when N == 1; N == 2 -> + when N =:= 1; N =:= 2 -> ssl_tls1:mac_hash(MacAlg, MacSecret, SeqNo, Type, Version, Length, Fragment). diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_server.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_server.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_server.erl 2009-03-12 12:29:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_server.erl 2009-11-20 13:36:29.000000000 +0000 @@ -260,12 +260,7 @@ {ok, true} -> true; _ -> - case os:getenv("ERL_SSL_DEBUG") of - false -> - false; - _ -> - true - end + os:getenv("ERL_SSL_DEBUG") =/= false end end, ProgDir = @@ -279,7 +274,7 @@ Cmd = filename:join(ProgDir, Program) ++ " " ++ Flags, debug1(Debug, " start, Cmd = ~s~n", [Cmd]), case (catch open_port({spawn, Cmd}, [binary, {packet, 4}])) of - Port when port(Port) -> + Port when is_port(Port) -> process_flag(trap_exit, true), receive {Port, {data, Bin}} -> @@ -468,12 +463,12 @@ %% %% seed %% -handle_call({seed, Data}, _From, St) when binary(Data) -> - send_cmd(St#st.port, ?SET_SEED, [int32(size(Data)), Data]), +handle_call({seed, Data}, _From, St) when is_binary(Data) -> + send_cmd(St#st.port, ?SET_SEED, [int32(byte_size(Data)), Data]), {reply, ok, St}; handle_call({seed, Data}, From, St) -> - case (catch list_to_binary(Data)) of + case catch list_to_binary(Data) of {'EXIT', _} -> {reply, {error, edata}, St}; Bin -> @@ -578,22 +573,21 @@ %% Data from port %% -handle_info({Port, {data, Bin}}, St) - when St#st.port == Port, binary(Bin) -> +handle_info({Port, {data, Bin}}, + #st{cons = StCons, paccepts = Paccepts, + port = Port, proxylsport = Proxylsport} = St) + when is_binary(Bin) -> %% io:format("++++ ssl_server got from port: ~w~n", [Bin]), - <> = Bin, - case OpCode of - %% %% transport_accept %% - ?TRANSPORT_ACCEPT_ERR when size(Bin) >= 5 -> + ?TRANSPORT_ACCEPT_ERR when byte_size(Bin) >= 5 -> {ListenFd, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "transport_accept_err: listenfd = ~w, " "reason = ~w~n", [ListenFd, Reason]), - case delete_last_by_fd(ListenFd, St#st.paccepts) of + case delete_last_by_fd(ListenFd, Paccepts) of {ok, {_, _, From}, PAccepts} -> gen_server:reply(From, {error, Reason}), {noreply, St#st{paccepts = PAccepts}}; @@ -601,16 +595,16 @@ %% Already closed {noreply, St} end; - ?TRANSPORT_ACCEPT_REP when size(Bin) >= 9 -> + ?TRANSPORT_ACCEPT_REP when byte_size(Bin) >= 9 -> {ListenFd, Fd} = decode_msg(Bin, [int32, int32]), debug(St, "transport_accept_rep: listenfd = ~w, " "fd = ~w~n", [ListenFd, Fd]), - case delete_last_by_fd(ListenFd, St#st.paccepts) of + case delete_last_by_fd(ListenFd, Paccepts) of {ok, {_, Broker, From}, PAccepts} -> - Reply = {ok, Fd, St#st.proxylsport}, + Reply = {ok, Fd, Proxylsport}, gen_server:reply(From, Reply), debug(St, "transport_accept_rep: From = ~w\n", [From]), - Cons = add({Fd, Broker, From}, St#st.cons), + Cons = add({Fd, Broker, From}, StCons), {noreply, St#st{cons = Cons, paccepts = PAccepts}}; _Other -> %% Already closed @@ -620,12 +614,12 @@ %% %% ssl_accept %% - ?SSL_ACCEPT_ERR when size(Bin) >= 5 -> + ?SSL_ACCEPT_ERR when byte_size(Bin) >= 5 -> {Fd, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "ssl_accept_err: listenfd = ~w, " "reason = ~w~n", [Fd, Reason]), %% JC: remove this? - case delete_last_by_fd(Fd, St#st.cons) of + case delete_last_by_fd(Fd, StCons) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {error, Reason}), {noreply, St#st{cons = Cons}}; @@ -633,10 +627,10 @@ %% Already closed {noreply, St} end; - ?SSL_ACCEPT_REP when size(Bin) >= 5 -> + ?SSL_ACCEPT_REP when byte_size(Bin) >= 5 -> Fd = decode_msg(Bin, [int32]), debug(St, "ssl_accept_rep: Fd = ~w\n", [Fd]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, ok), {noreply, St#st{cons = Cons}}; @@ -647,50 +641,49 @@ %% %% connect %% - ?CONNECT_SYNC_ERR when size(Bin) >= 5 -> + ?CONNECT_SYNC_ERR when byte_size(Bin) >= 5 -> {IntRef, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "connect_sync_err: intref = ~w, " "reason = ~w~n", [IntRef, Reason]), - case delete_by_intref(IntRef, St#st.cons) of + case delete_by_intref(IntRef, StCons) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {error, Reason}), {noreply, St#st{cons = Cons}}; _Other -> {noreply, St} end; - ?CONNECT_WAIT when size(Bin) >= 9 -> + ?CONNECT_WAIT when byte_size(Bin) >= 9 -> {IntRef, Fd} = decode_msg(Bin, [int32, int32]), debug(St, "connect_wait: intref = ~w, " "fd = ~w~n", [IntRef, Fd]), - case replace_fd_by_intref(IntRef, St#st.cons, Fd) of + case replace_fd_by_intref(IntRef, StCons, Fd) of {ok, _, Cons} -> %% We reply when we get CONNECT_REP or CONNECT_ERR {noreply, St#st{cons = Cons}}; _Other -> %% We have a new Fd which must be closed - send_cmd(St#st.port, ?CLOSE, int32(Fd)), + send_cmd(Port, ?CLOSE, int32(Fd)), {noreply, St} end; - ?CONNECT_REP when size(Bin) >= 5 -> + ?CONNECT_REP when byte_size(Bin) >= 5 -> %% after CONNECT_WAIT Fd = decode_msg(Bin, [int32]), debug(St, "connect_rep: fd = ~w~n", [Fd]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> - gen_server:reply(From, - {ok, Fd, St#st.proxylsport}), + gen_server:reply(From, {ok, Fd, Proxylsport}), {noreply, St#st{cons = Cons}}; _Other -> {noreply, St} end; - ?CONNECT_ERR when size(Bin) >= 5 -> + ?CONNECT_ERR when byte_size(Bin) >= 5 -> {Fd, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "connect_err: fd = ~w, " "reason = ~w~n", [Fd, Reason]), - case delete_by_fd(Fd, St#st.cons) of + case delete_by_fd(Fd, StCons) of {ok, {_, _, From}, Cons} -> %% Fd not yet published - hence close ourselves - send_cmd(St#st.port, ?CLOSE, int32(Fd)), + send_cmd(Port, ?CLOSE, int32(Fd)), gen_server:reply(From, {error, Reason}), {noreply, St#st{cons = Cons}}; _Other -> @@ -701,11 +694,11 @@ %% %% connection_info %% - ?GETCONNINFO_REP when size(Bin) >= 5 -> + ?GETCONNINFO_REP when byte_size(Bin) >= 5 -> {Fd, Protocol, Cipher} = decode_msg(Bin, [int32, string, string]), debug(St, "connection_info_rep: fd = ~w, " "protcol = ~p, ip = ~p~n", [Fd, Protocol, Cipher]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {ok, {protocol_name(Protocol), Cipher}}), @@ -714,11 +707,11 @@ %% Already closed {noreply, St} end; - ?GETCONNINFO_ERR when size(Bin) >= 5 -> + ?GETCONNINFO_ERR when byte_size(Bin) >= 5 -> {Fd, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "connection_info_err: fd = ~w, " "reason = ~w~n", [Fd, Reason]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {error, Reason}), {noreply, St#st{cons = Cons}}; @@ -730,40 +723,39 @@ %% %% listen %% - ?LISTEN_SYNC_ERR when size(Bin) >= 5 -> + ?LISTEN_SYNC_ERR when byte_size(Bin) >= 5 -> {IntRef, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "listen_sync_err: intref = ~w, " "reason = ~w~n", [IntRef, Reason]), - case delete_by_intref(IntRef, St#st.cons) of + case delete_by_intref(IntRef, StCons) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {error, Reason}), {noreply, St#st{cons = Cons}}; _Other -> {noreply, St} end; - ?LISTEN_REP when size(Bin) >= 11 -> + ?LISTEN_REP when byte_size(Bin) >= 11 -> {IntRef, ListenFd, LPort} = decode_msg(Bin, [int32, int32, int16]), debug(St, "listen_rep: intref = ~w, " "listenfd = ~w, sport = ~w~n", [IntRef, ListenFd, LPort]), - case replace_fd_from_by_intref(IntRef, St#st.cons, - ListenFd, []) of + case replace_fd_from_by_intref(IntRef, StCons, ListenFd, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {ok, ListenFd, LPort}), {noreply, St#st{cons = Cons}}; _Other -> %% ListenFd has to be closed. - send_cmd(St#st.port, ?CLOSE, int32(ListenFd)), + send_cmd(Port, ?CLOSE, int32(ListenFd)), {noreply, St} end; %% %% proxy join %% - ?PROXY_JOIN_REP when size(Bin) >= 5 -> + ?PROXY_JOIN_REP when byte_size(Bin) >= 5 -> Fd = decode_msg(Bin, [int32]), debug(St, "proxy_join_rep: fd = ~w~n", [Fd]), - case get_by_fd(Fd, St#st.cons) of + case get_by_fd(Fd, StCons) of {ok, {_, _, From}} -> gen_server:reply(From, ok), {noreply, St}; @@ -771,11 +763,11 @@ %% Already closed {noreply, St} end; - ?PROXY_JOIN_ERR when size(Bin) >= 5 -> + ?PROXY_JOIN_ERR when byte_size(Bin) >= 5 -> {Fd, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "proxy_join_rep: fd = ~w, " "reason = ~w~n", [Fd, Reason]), - case delete_by_fd(Fd, St#st.cons) of + case delete_by_fd(Fd, StCons) of {ok, {_, _, From}, Cons} -> case Reason of enoproxysocket -> @@ -794,11 +786,11 @@ %% %% peername %% - ?GETPEERNAME_REP when size(Bin) >= 5 -> + ?GETPEERNAME_REP when byte_size(Bin) >= 5 -> {Fd, LPort, IPString} = decode_msg(Bin, [int32, int16, string]), debug(St, "getpeername_rep: fd = ~w, " "sport = ~w, ip = ~p~n", [Fd, LPort, IPString]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {ok, {IPString, LPort}}), {noreply, St#st{cons = Cons}}; @@ -806,11 +798,11 @@ %% Already closed {noreply, St} end; - ?GETPEERNAME_ERR when size(Bin) >= 5 -> + ?GETPEERNAME_ERR when byte_size(Bin) >= 5 -> {Fd, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "getpeername_err: fd = ~w, " "reason = ~w~n", [Fd, Reason]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {error, Reason}), {noreply, St#st{cons = Cons}}; @@ -822,11 +814,11 @@ %% %% ioctl %% - ?IOCTL_OK when size(Bin) >= 5 -> + ?IOCTL_OK when byte_size(Bin) >= 5 -> Fd = decode_msg(Bin, [int32]), debug(St, "ioctl_ok: fd = ~w~n", [Fd]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, ok), {noreply, St#st{cons = Cons}}; @@ -834,11 +826,11 @@ %% Already closed {noreply, St} end; - ?IOCTL_ERR when size(Bin) >= 5 -> + ?IOCTL_ERR when byte_size(Bin) >= 5 -> {Fd, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "ioctl_err: fd = ~w, " "reason = ~w~n", [Fd, Reason]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {error, Reason}), {noreply, St#st{cons = Cons}}; @@ -850,11 +842,11 @@ %% %% sockname %% - ?GETSOCKNAME_REP when size(Bin) >= 5 -> + ?GETSOCKNAME_REP when byte_size(Bin) >= 5 -> {Fd, LPort, IPString} = decode_msg(Bin, [int32, int16, string]), debug(St, "getsockname_rep: fd = ~w, " "sport = ~w, ip = ~p~n", [Fd, LPort, IPString]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {ok, {IPString, LPort}}), {noreply, St#st{cons = Cons}}; @@ -862,11 +854,11 @@ %% Already closed {noreply, St} end; - ?GETSOCKNAME_ERR when size(Bin) >= 5 -> + ?GETSOCKNAME_ERR when byte_size(Bin) >= 5 -> {Fd, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "getsockname_err: fd = ~w, " "reason = ~w~n", [Fd, Reason]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {error, Reason}), {noreply, St#st{cons = Cons}}; @@ -878,10 +870,10 @@ %% %% peercert %% - ?GETPEERCERT_REP when size(Bin) >= 5 -> + ?GETPEERCERT_REP when byte_size(Bin) >= 5 -> {Fd, Cert} = decode_msg(Bin, [int32, bin]), debug(St, "getpeercert_rep: fd = ~w~n", [Fd]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {ok, Cert}), {noreply, St#st{cons = Cons}}; @@ -889,11 +881,11 @@ %% Already closed {noreply, St} end; - ?GETPEERCERT_ERR when size(Bin) >= 5 -> + ?GETPEERCERT_ERR when byte_size(Bin) >= 5 -> {Fd, Reason} = decode_msg(Bin, [int32, atom]), debug(St, "getpeercert_err: fd = ~w, reason = ~w~n", [Fd, Reason]), - case replace_from_by_fd(Fd, St#st.cons, []) of + case replace_from_by_fd(Fd, StCons, []) of {ok, {_, _, From}, Cons} -> gen_server:reply(From, {error, Reason}), {noreply, St#st{cons = Cons}}; @@ -906,7 +898,7 @@ %% %% EXIT %% -handle_info({'EXIT', Pid, Reason}, St) when pid(Pid) -> +handle_info({'EXIT', Pid, Reason}, St) when is_pid(Pid) -> debug(St, "exit pid = ~w, " "reason = ~w~n", [Pid, Reason]), case delete_by_pid(Pid, St#st.cons) of @@ -942,11 +934,11 @@ %% %% 'badsig' means bad message to port. Port program is unaffected. %% -handle_info({'EXIT', Port, badsig}, St) when St#st.port == Port -> +handle_info({'EXIT', Port, badsig}, #st{port = Port} = St) -> debug(St, "badsig!!!~n", []), {noreply, St}; -handle_info({'EXIT', Port, Reason}, St) when St#st.port == Port -> +handle_info({'EXIT', Port, Reason}, #st{port = Port} = St) -> {stop, Reason, St}; handle_info(Info, St) -> @@ -1138,11 +1130,9 @@ %% decode_msg(<<_, Bin/binary>>, Format) -> Dec = dec(Format, Bin), - if - length(Dec) == 1 -> - hd(Dec); - true -> - list_to_tuple(Dec) + case Dec of + [Dec1] -> Dec1; + _ -> list_to_tuple(Dec) end. dec([], _) -> @@ -1208,14 +1198,12 @@ port_program(Default) -> case application:get_env(ssl, port_program) of - {ok, Program} when list(Program) -> + {ok, Program} when is_list(Program) -> Program; _Other -> Default end. - - %% %% As this server may be started by the distribution, it is not safe to assume %% a working code server, neither a working file server. @@ -1261,10 +1249,7 @@ extension() -> %% erlang:info(machine) returns machine name as text in all uppercase - "." ++ lists:map(fun(X) -> - X + $a - $A - end, - erlang:system_info(machine)). + "." ++ string:to_lower(erlang:system_info(machine)). debug_flag() -> case os:getenv("ERL_SSL_DEBUG") of @@ -1310,7 +1295,7 @@ case os:getenv("ERL_SSL_DEBUG") of false -> case application:get_env(ssl, debugdir) of - {ok, Dir} when list(Dir) -> + {ok, Dir} when is_list(Dir) -> "-dd " ++ Dir; _Other -> "" @@ -1339,7 +1324,7 @@ case application:get_env(ssl, protocol_version) of {ok, []} -> ""; - {ok, Vsns} when list(Vsns) -> + {ok, Vsns} when is_list(Vsns) -> case transform_vsns(Vsns) of N when (N > 0) -> "-pv " ++ integer_to_list(N); diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_session.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_session.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_session.erl 2009-03-12 12:32:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_session.erl 2009-11-20 13:37:45.000000000 +0000 @@ -117,13 +117,13 @@ no_session; select_session(Sessions, #ssl_options{ciphers = Ciphers, - reuse_sessions = ReuseSession}) -> + reuse_sessions = ReuseSession}) -> IsResumable = fun(Session) -> ReuseSession andalso (Session#session.is_resumable) andalso lists:member(Session#session.cipher_suite, Ciphers) end, - case [Id || [Id, Session] <- Sessions, IsResumable(Session)] of + case [Id || [Id, Session] <- Sessions, IsResumable(Session)] of [] -> no_session; List -> @@ -158,12 +158,12 @@ is_resumable(SuggestedSessionId, Port, ReuseEnabled, ReuseFun, Cache, CacheCb, SecondLifeTime) -> case CacheCb:lookup(Cache, {Port, SuggestedSessionId}) of - #session{} = Session -> - PeerCert = Session#session.peer_certificate, - Compression = Session#session.compression_method, - CipherSuite = Session#session.cipher_suite, + #session{cipher_suite = CipherSuite, + compression_method = Compression, + is_resumable = Is_resumable, + peer_certificate = PeerCert} = Session -> ReuseEnabled - andalso (Session#session.is_resumable) + andalso Is_resumable andalso valid_session(Session, SecondLifeTime) andalso ReuseFun(SuggestedSessionId, PeerCert, Compression, CipherSuite); diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_ssl3.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_ssl3.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_ssl3.erl 2009-03-12 12:32:50.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_ssl3.erl 2009-11-20 13:37:45.000000000 +0000 @@ -261,15 +261,12 @@ InnerHash = handshake_hash(Method, HandshakeHash, [MasterSecret, pad_1(Method)]), - Hash = hash(Method, [MasterSecret, pad_2(Method), InnerHash]), - Hash; - + hash(Method, [MasterSecret, pad_2(Method), InnerHash]); handshake_hash(Method, MasterSecret, Sender, HandshakeHash) -> InnerHash = handshake_hash(Method, HandshakeHash, [Sender, MasterSecret, pad_1(Method)]), - Hash = hash(Method, [MasterSecret, pad_2(Method), InnerHash]), - Hash. + hash(Method, [MasterSecret, pad_2(Method), InnerHash]). get_sender(client) -> "CLNT"; get_sender(server) -> "SRVR"; @@ -287,12 +284,3 @@ SHA = crypto:sha([Prefix, All]), MD5 = crypto:md5([Secret, SHA]), gen(Secret, All, Wanted, Len + 16, C+1, N+1, [MD5 | Acc]). - - - - - - - - - diff -Nru erlang-13.b.1-dfsg/lib/ssl/src/ssl_tls1.erl erlang-13.b.3-dfsg/lib/ssl/src/ssl_tls1.erl --- erlang-13.b.1-dfsg/lib/ssl/src/ssl_tls1.erl 2009-03-12 12:32:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/ssl/src/ssl_tls1.erl 2009-11-20 13:37:45.000000000 +0000 @@ -192,13 +192,13 @@ []; p_hash(_Secret, _Seed, WantedLength, _Method, _N, [Last | Acc]) when WantedLength =< 0 -> - Keep = size(Last) + WantedLength, + Keep = byte_size(Last) + WantedLength, <> = Last, lists:reverse(Acc, [B]); p_hash(Secret, Seed, WantedLength, Method, N, Acc) -> N1 = N+1, Bin = hmac_hash(Method, Secret, [a(N1, Secret, Seed, Method), Seed]), - p_hash(Secret, Seed, WantedLength - size(Bin), Method, N1, [Bin | Acc]). + p_hash(Secret, Seed, WantedLength - byte_size(Bin), Method, N1, [Bin|Acc]). %% ... Where A(0) = seed @@ -219,7 +219,7 @@ %% The secret is partitioned into two halves (with the possibility of %% one shared byte) as described above, S1 taking the first L_S1 bytes, %% and S2 the last L_S2 bytes. - Length = size(BinSecret), + Length = byte_size(BinSecret), Div = Length div 2, EvenLength = Length - Div, <> = BinSecret, diff -Nru erlang-13.b.1-dfsg/lib/ssl/vsn.mk erlang-13.b.3-dfsg/lib/ssl/vsn.mk --- erlang-13.b.1-dfsg/lib/ssl/vsn.mk 2009-06-05 13:55:22.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/ssl/vsn.mk 2009-11-20 13:36:30.000000000 +0000 @@ -1,7 +1,33 @@ -SSL_VSN = 3.10.3 +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1999-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# -TICKETS = OTP-8011 +SSL_VSN = 3.10.7 +TICKETS = OTP-8260 OTP-8218 OTP-8250 + +#TICKETS_3.10.6 = OTP-8275 + +#TICKETS_3.10.5 = OTP-8224 OTP-8244 + +#TICKETS_3.10.4 = OTP-8137 + +#TICKETS_3.10.3 = OTP-8011 #TICKETS_3.10.2 = OTP-7963 # TICKETS_3.10.1 = OTP-7878 \ diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/array.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/array.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/array.xml 2007-11-28 12:10:28.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/array.xml 2009-11-20 13:32:34.000000000 +0000 @@ -3,23 +3,21 @@

    - 2007 - 2007 - Ericsson AB, All Rights Reserved + 20072009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + array @@ -320,10 +318,10 @@ -

    Reset entry I to the default value for the array. This is - equivalent to set(I, default(Array), Array), and hence may cause - the array to grow in size, but will not shrink it. Shrinking can be - done explicitly by calling resize/2.

    +

    Reset entry I to the default value for the array. + If the value of entry I is the default value the array will be + returned unchanged. Reset will never change size of the array. + Shrinking can be done explicitly by calling resize/2.

    If I is not a nonnegative integer, or if the array has fixed size and I is larger than the maximum index, the call fails with reason diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/beam_lib.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/beam_lib.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/beam_lib.xml 2009-03-12 12:19:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/beam_lib.xml 2009-11-20 13:31:11.000000000 +0000 @@ -463,7 +463,7 @@ register a fun, {error, exists} is returned.

    The fun must handle the following arguments:

    -\011 CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term} + CryptoKeyFun(init) -> ok | {ok, NewCryptoKeyFun} | {error, Term}

    Called when the fun is registered, in the process that holds the fun. Here the crypto key fun can do any necessary initializations. If {ok, NewCryptoKeyFun} is returned @@ -472,14 +472,14 @@ the registration is aborted and crypto_key_fun/1 returns {error, Term} as well.

    -\011 CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key + CryptoKeyFun({debug_info, Mode, Module, Filename}) -> Key

    Called when the key is needed for the module Module in the file named Filename. Mode is the type of crypto algorithm; currently, the only possible value thus is des3_cbc. The call should fail (raise an exception) if there is no key available.

    -\011 CryptoKeyFun(clear) -> term() + CryptoKeyFun(clear) -> term()

    Called before the fun is unregistered. Here any cleaning up can be done. The return value is not important, but is passed back to the caller of clear_crypto_key_fun/0 as part diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/book.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/book.xml 2009-03-16 17:07:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/book.xml 2009-11-20 13:30:18.000000000 +0000 @@ -1,7 +1,7 @@ - +

    19972009 @@ -35,11 +35,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/erl_eval.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/erl_eval.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/erl_eval.xml 2009-06-05 13:53:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/erl_eval.xml 2009-09-18 15:07:19.000000000 +0100 @@ -226,7 +226,9 @@ handler will however be called with the evaluated arguments of the call to erlang:apply/2,3: Func(Fun, Args) or Func({Module, Function}, Args) (assuming that {Module, Function} is not {erlang, apply}).

    - +

    Calls to functions defined by evaluating fun expressions + "fun ... end" are also hidden from non-local function + handlers.

    The nonlocal function handler argument is probably not used as frequently as the local function handler argument. A possible use is to call exit/1 on calls to functions that for some diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/erl_lint.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/erl_lint.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/erl_lint.xml 2007-11-26 18:56:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/erl_lint.xml 2009-11-20 13:29:49.000000000 +0000 @@ -4,23 +4,21 @@

    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + erl_lint @@ -91,7 +89,7 @@

    Since this module is of interest only to the maintainers of the compiler, and to avoid having the same description in - two places to avoid the usual maintainence nightmare, the + two places to avoid the usual maintenance nightmare, the elements of Options that control the warnings are only described in compile(3).

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/erl_scan.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/erl_scan.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/erl_scan.xml 2009-06-05 13:53:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/erl_scan.xml 2009-09-18 15:07:19.000000000 +0100 @@ -172,8 +172,9 @@ {error, ErrorInfo, EndLocation} -

    An error occurred. LeftOverChars is always - an empty list in this case.

    +

    An error occurred. LeftOverChars is the remaining + characters of the input data, + starting from EndLocation.

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/erl_tar.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/erl_tar.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/erl_tar.xml 2009-03-12 12:20:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/erl_tar.xml 2009-11-20 13:31:36.000000000 +0000 @@ -179,7 +179,7 @@ creates a tar file and archives the files whose names are given in FileList into it. The files may either be read from disk or given as binaries.

    -

    The options in OptionList modify the defaults\011as follows. +

    The options in OptionList modify the defaults as follows.

    compressed diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/ets.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/ets.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/ets.xml 2009-06-05 13:53:02.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/ets.xml 2009-11-20 13:29:49.000000000 +0000 @@ -64,16 +64,6 @@ In the current implementation, every object insert and look-up operation results in a copy of the object. - This module provides very limited support for concurrent - updates. No locking is available, but the safe_fixtable/2 - function can be used to guarantee that a sequence of - first/1 and next/2 calls will traverse the table - without errors and that each object in the table is visited - exactly once, even if another process (or the same process) - simultaneously deletes or inserts objects into the table. - Nothing more is guaranteed; in particular any object inserted - during a traversal may be visited in the traversal. - '$end_of_table' should not be used as a key since this atom is used to mark the end of the table when using first/next. @@ -97,6 +87,31 @@ table identifier is invalid.

    +
    + Concurrency +

    This module provides some limited support for concurrent access. + All updates to single objects are guaranteed to be both atomic + and isolated. This means that an updating operation towards + a single object will either succeed or fail completely without any + effect at all (atomicy). + Nor can any intermediate results of the update be seen by other + processes (isolation). Some functions that update several objects + state that they even guarantee atomicy and isolation for the entire + operation. In database terms the isolation level can be seen as + "serializable", as if all isolated operations were carried out serially, + one after the other in a strict order.

    +

    No other support is available within ETS that would guarantee + consistency between objects. However, the safe_fixtable/2 + function can be used to guarantee that a sequence of + first/1 and next/2 calls will traverse the table + without errors and that each existing object in the table is visited + exactly once, even if another process (or the same process) + simultaneously deletes or inserts objects into the table. + Nothing more is guaranteed; in particular objects that are inserted + or deleted during such a traversal may be visited once or not at all. + Functions that internally traverse over a table, like select + and match, will give the same guarantee as safe_fixtable.

    +
    Match Specifications @@ -158,8 +173,9 @@ Tab = tid() | atom() -

    Delete all objects in the ETS table Tab. The deletion - is atomic.

    +

    Delete all objects in the ETS table Tab. + The operation is guaranteed to be + atomic and isolated.

    @@ -172,7 +188,8 @@

    Delete the exact object Object from the ETS table, leaving objects with the same key but other differences - (useful for type bag).

    + (useful for type bag). In a duplicate_bag, all + instances of the object will be deleted.

    @@ -564,6 +581,9 @@ set, one will be inserted, which one is not defined. The same thing holds for ordered_set, but will also happen if the keys compare equal.

    +

    The entire operation is guaranteed to be + atomic and isolated, + even when a list of objects is inserted.

    @@ -583,7 +603,8 @@ list, the function checks every key prior to inserting anything. Nothing will be inserted if not all keys present in the list are absent from the - table.

    + table. Like insert/2, the entire operation is guaranteed to be + atomic and isolated.

    @@ -1024,10 +1045,14 @@ mutates (writes to) the table will obtain exclusive access, blocking any concurrent access of the same table until finished. If set to true, the table is optimized towards concurrent - write access. Different parts of the same table can be mutated - (and read) by concurrent processes. This is achieve to some degree + write access. Different objects of the same table can be mutated + (and read) by concurrent processes. This is achieved to some degree at the expense of single access and concurrent reader performance. - Table typ ordered_set is not affected by this option in current + Note that this option does not change any guarantees about + atomicy and isolation. + Functions that makes such promises over several objects (like + insert/2) will gain less (or nothing) from this option.

    +

    Table type ordered_set is not affected by this option in current implementation.

    @@ -1104,7 +1129,7 @@ be restored, meaning it can once again be used in subsequent ets:select/1 calls even though it has been stored on disk or on another node.

    -

    As an example, the following seqence of calls will fail:

    +

    As an example, the following sequence of calls will fail:

    T=ets:new(x,[]), ... diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/file_sorter.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/file_sorter.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/file_sorter.xml 2009-03-12 12:20:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/file_sorter.xml 2009-11-20 13:31:25.000000000 +0000 @@ -204,25 +204,25 @@ input(Log, Cont) -> fun(close) -> -\011 ok; + ok; (read) -> -\011 case disk_log:chunk(Log, Cont) of -\011\011{error, Reason} -> -\011\011 {error, Reason}; -\011\011{Cont2, Terms} -> -\011\011 {Terms, input(Log, Cont2)}; -\011\011{Cont2, Terms, _Badbytes} -> -\011\011 {Terms, input(Log, Cont2)}; -\011\011eof -> -\011\011 end_of_input -\011 end + case disk_log:chunk(Log, Cont) of + {error, Reason} -> + {error, Reason}; + {Cont2, Terms} -> + {Terms, input(Log, Cont2)}; + {Cont2, Terms, _Badbytes} -> + {Terms, input(Log, Cont2)}; + eof -> + end_of_input + end end. output(L) -> fun(close) -> -\011 lists:append(lists:reverse(L)); + lists:append(lists:reverse(L)); (Terms) -> -\011 output([Terms | L]) + output([Terms | L]) end.

    Further examples of functions as input and output can be found at the end of the file_sorter module; the term @@ -238,7 +238,7 @@

    {bad_term, FileName}. io:read/2 failed - to read some term.\011

    + to read some term.

    {file_error, FileName, Reason2}. See diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/gb_trees.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/gb_trees.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/gb_trees.xml 2009-04-16 10:24:09.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/gb_trees.xml 2009-11-20 13:31:29.000000000 +0000 @@ -32,7 +32,7 @@

    An efficient implementation of Prof. Arne Andersson's General Balanced Trees. These have no storage overhead compared to - unbalaced binary trees, and their performance is in general + unbalanced binary trees, and their performance is in general better than AVL trees.

    @@ -52,7 +52,7 @@

    Performance is comparable to the AVL trees in the Erlang book (and faster in general due to less overhead); the difference is that deletion works for these trees, but not for the book's - trees. Behaviour is logaritmic (as it should be).

    + trees. Behaviour is logarithmic (as it should be).

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/gen_event.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/gen_event.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/gen_event.xml 2009-03-12 12:18:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/gen_event.xml 2009-11-20 13:29:40.000000000 +0000 @@ -43,11 +43,11 @@ functions and the callback functions can be illustrated as follows:

     gen_event module                   Callback module
    ----------------\011                   -------------
    +----------------                   ---------------
     gen_event:start_link       ----->  -
     
     gen_event:add_handler
    -gen_event:add_sup_handler   ----->  Module:init/1
    +gen_event:add_sup_handler  ----->  Module:init/1
     
     gen_event:notify
     gen_event:sync_notify      ----->  Module:handle_event/2
    @@ -77,7 +77,9 @@
           Module:terminate/2 (see below), giving as argument
           {error,{'EXIT',Reason}} or {error,Term}, respectively.
           No other event handler will be affected.

    -

    The sys module can be used for debugging an event manager.

    +

    A gen_event process handles system messages as documented in + sys(3). The sys module + can be used for debugging an event manager.

    Note that an event manager does trap exit signals automatically.

    The gen_event process can go into hibernation @@ -577,6 +579,11 @@ Reason.

    Arg=stop if the event handler is deleted because the event manager is terminating.

    +

    The event manager will terminate if it is part of a supervision + tree and it is ordered by its supervisor to terminate. + Even if it is not part of a supervision tree, it will + terminate if it receives an 'EXIT' message from + its parent.

    Arg=remove_handler if the event handler is deleted because another callback function has returned remove_handler or {remove_handler,Reply}.

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/gen_fsm.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/gen_fsm.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/gen_fsm.xml 2009-03-12 12:18:29.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/gen_fsm.xml 2009-11-20 13:29:39.000000000 +0000 @@ -60,7 +60,9 @@ - -----> Module:code_change/4

    If a callback function fails or returns a bad value, the gen_fsm will terminate.

    -

    The sys module can be used for debugging a gen_fsm.

    +

    A gen_fsm handles system messages as documented in + sys(3). The sys module + can be used for debugging a gen_fsm.

    Note that a gen_fsm does not trap exit signals automatically, this must be explicitly initiated in the callback module.

    Unless otherwise stated, all functions in this module fail if @@ -684,6 +686,10 @@ child specification is an integer timeout value, not brutal_kill. +

    Even if the gen_fsm is not part of a supervision tree, + this function will be called if it receives an 'EXIT' + message from its parent. Reason will be the same as in + the 'EXIT' message.

    Otherwise, the gen_fsm will be immediately terminated.

    Note that for any other reason than normal, shutdown, or {shutdown,Term} the gen_fsm is diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/gen_server.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/gen_server.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/gen_server.xml 2009-03-12 12:18:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/gen_server.xml 2009-11-20 13:29:40.000000000 +0000 @@ -58,7 +58,9 @@ - -----> Module:code_change/3

    If a callback function fails or returns a bad value, the gen_server will terminate.

    -

    The sys module can be used for debugging a gen_server.

    +

    A gen_server handles system messages as documented in + sys(3). The sys module + can be used for debugging a gen_server.

    Note that a gen_server does not trap exit signals automatically, this must be explicitly initiated in the callback module.

    Unless otherwise stated, all functions in this module fail if @@ -203,7 +205,12 @@ specifies how many milliseconds to wait for a reply, or the atom infinity to wait indefinitely. Default value is 5000. If no reply is received within the specified time, - the function call fails.

    + the function call fails. If the caller catches the failure + and continues running, and the server is just late with the reply, + it may arrive at any time later into the caller's message queue. + The caller must in this case be prepared for this + and discard any such garbage messages that are two element + tuples with a reference as the first element.

    The return value Reply is defined in the return value of Module:handle_call/3.

    The call may fail for several reasons, including timeout and @@ -550,6 +557,10 @@ child specification is an integer timeout value, not brutal_kill. +

    Even if the gen_server is not part of a supervision tree, + this function will be called if it receives an 'EXIT' + message from its parent. Reason will be the same as in + the 'EXIT' message.

    Otherwise, the gen_server will be immediately terminated.

    Note that for any other reason than normal, shutdown, or {shutdown,Term} the gen_server is diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/io_protocol.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/io_protocol.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/io_protocol.xml 2009-03-13 14:15:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/io_protocol.xml 2009-11-20 13:33:05.000000000 +0000 @@ -30,7 +30,7 @@ 2009-02-25 PA1 - match_spec.sgml + io_protocol.xml

    @@ -165,7 +165,7 @@ Encoding denotes how data is to be sent back to the client and what data is sent to the function denoted by Module/Function/Arity. If the function supplied returns data as a - list, the data is converted to this encoding. If hoowever the + list, the data is converted to this encoding. If however the function supplied returns data in some other format, no conversion can be done and it's up to the client supplied function to return data in a proper way. If Encoding is latin1, lists of integers @@ -305,7 +305,7 @@ format, i.e. UTF-8 (note that the function in get_until still gets list data regardless of the io_server mode).

    -

    Note that i.e. the get_until request allows for a function with the data specified as always beeing a list. Also the return value data from such a function can be of any type (as is indeed the case when an io:fread request is sent to an io_server). The client has to be prepared for data received as answers to those requests to be in a variety of forms, but the server should convert the results to binaries whenever possible (i.e. when the function supplied to get_until actually returns a list). The example shown later in this text does just that.

    +

    Note that i.e. the get_until request allows for a function with the data specified as always being a list. Also the return value data from such a function can be of any type (as is indeed the case when an io:fread request is sent to an io_server). The client has to be prepared for data received as answers to those requests to be in a variety of forms, but the server should convert the results to binaries whenever possible (i.e. when the function supplied to get_until actually returns a list). The example shown later in this text does just that.

    An I/O-server in binary mode will affect the data sent to the client, so that it has to be able to handle binary data. For convenience, it @@ -493,7 +493,7 @@

    The "private" message {From, rewind} results in the current position in the pseudo-file to be reset to 0 (the beginning of the "file"). This is a typical example of device-specific -messages not beeing part of the I/O-protocol. It is usually a bad idea +messages not being part of the I/O-protocol. It is usually a bad idea to embed such private messages in io_request tuples, as that might be confusing to the reader.

    @@ -542,10 +542,10 @@ request({get_until, Encoding, _Prompt, M, F, As}, State) -> get_until(Encoding, M, F, As, State); request({get_chars, Encoding, _Prompt, N}, State) -> - %% To simplify the code, get_chars is implementad using get_until + %% To simplify the code, get_chars is implemented using get_until get_until(Encoding, ?MODULE, until_enough, [N], State); request({get_line, Encoding, _Prompt}, State) -> - %% To simplify the code, get_line is implementad using get_until + %% To simplify the code, get_line is implemented using get_until get_until(Encoding, ?MODULE, until_newline, [$\\n], State);
    @@ -557,7 +557,7 @@ get_until/5, lets look into the few remaining requests:

    -request({get_geomentry,_}, State) -> +request({get_geometry,_}, State) -> {error, {error,enotsup}, State}; request({setopts, Opts}, State) -> setopts(Opts, State); diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/io.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/io.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/io.xml 2009-04-16 11:11:26.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/io.xml 2009-11-20 13:29:50.000000000 +0000 @@ -237,7 +237,7 @@ {echo, bool()} -

    Denotes if the terminal shpould echo input. Only supported for the standard shell I/O-server (group.erl)

    +

    Denotes if the terminal should echo input. Only supported for the standard shell I/O-server (group.erl)

    {expand_fun, fun()} @@ -273,7 +273,7 @@ {encoding, utf8 | utf16 | utf32 | {utf16,big} | {utf16,little} | {utf32,big} | {utf32,little}} -

    For disk files, the encoding can be set to various UTF variants. This will have the effect that data is expected to be read as the specified encoding from the file and the data will be wriiten in the specified encoding to the disk file.

    +

    For disk files, the encoding can be set to various UTF variants. This will have the effect that data is expected to be read as the specified encoding from the file and the data will be written in the specified encoding to the disk file.

    {encoding, utf8} will have the same effect as {encoding,unicode} on files.

    The extended encodings are only supported on disk files (opened by the file:open/2 function)

    @@ -1001,7 +1001,7 @@
    Standard Error -

    In certain situations, especially when the standard output is redirected, access to an io_server() specific for error messages might be conveninet. The io_device 'standard_error' can be used to direct output to whatever the current operating system considers a suitable device for error output. Example on a Unix-like operating system:

    +

    In certain situations, especially when the standard output is redirected, access to an io_server() specific for error messages might be convenient. The io_device 'standard_error' can be used to direct output to whatever the current operating system considers a suitable device for error output. Example on a Unix-like operating system:

     $ erl -noshell -noinput -eval 'io:format(standard_error,"Error: ~s~n",["error 11"]),init:stop().' > /dev/null
     Error: error 11
    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/lists.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/lists.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/lists.xml 2009-03-12 12:18:41.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/lists.xml 2009-09-18 15:07:21.000000000 +0100 @@ -53,6 +53,8 @@

    x F y or y F x (F is total).

    +

    An example of a typical ordering function is less than or equal + to, =</2.

    @@ -614,10 +616,11 @@ sorted according to the ordering function Fun prior to evaluating this function. Fun(A, - B) should return true if A comes before - B in the ordering, false otherwise. When two - elements compare equal, the element from List1 is - picked before the element from List2.

    + B) should return true if A compares less + than or equal to B in the ordering, false + otherwise. When two elements compare equal, the element from + List1 is picked before the element from + List2.

    @@ -806,8 +809,8 @@ List1, according to the ordering function Fun. Fun(A, B) should return true if - A comes before B in the ordering, false - otherwise.

    + A compares less than or equal to B in the + ordering, false otherwise.

    @@ -1020,8 +1023,9 @@ marker="#ordering_function">ordering function Fun and contain no duplicates prior to evaluating this function. Fun(A, B) should return true if - A comes before B in the ordering, false - otherwise. When two elements compare equal, the element from + A compares less than or equal to B in the + ordering, false otherwise. When two elements compare + equal, the element from List1 is picked and the one from List2 deleted.

    @@ -1100,8 +1104,8 @@ comparing equal according to the ordering function Fun have been deleted. Fun(A, B) should return - true if A comes before B in the - ordering, false otherwise.

    + true if A compares less than or equal to + B in the ordering, false otherwise.

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/Makefile erlang-13.b.3-dfsg/lib/stdlib/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/Makefile 2009-03-16 17:07:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/Makefile 2009-11-20 13:30:18.000000000 +0000 @@ -1,19 +1,20 @@ -# ``The contents of this file are subject to the Erlang Public License, +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in # compliance with the License. You should have received a copy of the # Erlang Public License along with this software. If not, it can be -# retrieved via the world wide web at http://www.erlang.org/. +# retrieved online at http://www.erlang.org/. # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # -# The Initial Developer of the Original Code is Ericsson Utvecklings AB. -# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings -# AB. All Rights Reserved.'' -# -# $Id$ +# %CopyrightEnd% # include $(ERL_TOP)/make/target.mk include $(ERL_TOP)/make/$(TARGET)/otp.mk @@ -23,22 +24,18 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(STDLIB_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=stdlib # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/stdlib-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- XML_APPLICATION_FILES = ref_man.xml + XML_REF3_FILES = \ array.xml \ base64.xml \ @@ -108,6 +105,10 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_REF6_FILES) $(XML_APPLICATION_FILES) + # ---------------------------------------------------- HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \ @@ -115,39 +116,18 @@ $(GIF_FILES:%.gif=$(HTMLDIR)/%.gif) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) \ - part.tex - -TOP_PDF_FILE = stdlib-$(VSN).pdf -TOP_PS_FILE = stdlib-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets @@ -155,57 +135,42 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) $(MAN6_FILES) +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) + debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) $(MAN6_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ min_head.gif $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(MAN6DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6 -endif -endif release_spec: diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/ms_transform.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/ms_transform.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/ms_transform.xml 2009-03-12 12:20:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/ms_transform.xml 2009-11-20 13:31:32.000000000 +0000 @@ -79,9 +79,9 @@ -record(emp, {empno, %Employee number as a string, the key surname, %Surname of the employee -\011 givenname, %Given name of employee -\011 dept, %Department one of {dev,sales,prod,adm} -\011 empyear}). %Year the employee was employed + givenname, %Given name of employee + dept, %Department one of {dev,sales,prod,adm} + empyear}). %Year the employee was employed

    We create the table using:

    ets:new(emp_tab,[{keypos,#emp.empno},named_table,ordered_set]). @@ -113,9 +113,9 @@ ets:foldr(fun(#emp{empno = E, dept = sales},Acc) -> [E | Acc]; (_,Acc) -> Acc -\011 end, -\011 [], -\011 emp_tab). + end, + [], + emp_tab).

    Running that would result in ["011103","076324"] , which at least gets rid of the extra lists. The fun is also quite straightforward, so the only problem is that all the data from the @@ -326,7 +326,7 @@ is_record guard works as in ordinary Erlang code.

    Semicolons (;) in guards are allowed, the result will be (as expected) one "match_spec-clause" for each semicolon-separated - part of the guard. The semantics beeing identical to the Erlang + part of the guard. The semantics being identical to the Erlang semantics.

    The body of the fun is used to construct the resulting value. When selecting from tables one usually just construct @@ -466,7 +466,7 @@ causing all this trouble.

    This was just a toy example, but it illustrated the most used calls in match specifications for dbg The other, more - esotherical calls are listed and explained in the Users guide of the ERTS application, they really are beyond the scope of this + esotheric calls are listed and explained in the Users guide of the ERTS application, they really are beyond the scope of this document.

    To end this chatty introduction with something more precise, here follows some parts about caveats and restrictions concerning the fun's @@ -543,7 +543,7 @@ The following expressions are translated equally:

    ets:fun2ms(fun({a,_} = A) -> A end). -ets:fun2ms(fun({a,_}) -> object() end).\011 +ets:fun2ms(fun({a,_}) -> object() end).

    The special match_spec variables '$_' and '$*' diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/notes_history.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/notes_history.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/notes_history.xml 2007-11-26 19:00:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/notes_history.xml 2009-11-20 13:32:22.000000000 +0000 @@ -4,23 +4,21 @@

    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + STDLIB Release Notes @@ -63,7 +61,7 @@ implementation now corresponds to the documentation in ERTS User's Guide. The following things are corrected:

    - Guard sematics was wrong when it came to logical + Guard semantics was wrong when it came to logical operators and exceptions. {'or', {'is_integer','$1'}, {'or', '$1', '$1'}} evaluated to true with '$1' bound to an @@ -123,7 +121,7 @@

    It is now possible to compile files with erlc without - getting a lot of (for compilation) unneccessary code + getting a lot of (for compilation) unnecessary code loaded and executed (like distribution, inet config, etc). erlc now also calls erl with -boot start_clean (so that SASL is not started even if start_sasl is default boot script).

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/notes.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/notes.xml 2009-06-05 13:53:35.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/notes.xml 2009-11-20 13:31:56.000000000 +0000 @@ -26,9 +26,199 @@ + notes.xml

    This document describes the changes made to the STDLIB application.

    +
    STDLIB 1.16.4 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    + +

    + [escript] The restriction that the first line in escripts + must begin with #! has been removed.

    +

    + [escript] Some command line options to the escript + executable has now been documented. For example you can + run an escript in the debugger by just adding a command + line option.

    +

    + [escript] The documentation of the escript header syntax + has been clarified. For example the header is optional. + This means that it is possible to directly "execute" + .erl, .beam and.zip files.

    +

    + Own Id: OTP-8215

    +
    + +

    Optimized array:from_orddict/1, it is now faster and + uses less memory if the orddict was sparse.

    +

    Changed array:reset/2, it will now never expand the + array which it could before for non fixed arrays. See the + documentation.

    +

    + Own Id: OTP-8216

    +
    + +

    The Erlang Pretty Printer (erl_pp) now puts the + leading [ of list comprehensions as well as the + leading << of bit string comprehensions on a + separate line in order to expose the Cover counter of the + template.

    +

    + Own Id: OTP-8227

    +
    + +

    The extension ".xrl" used for Leex input files is now + recognized by the compiler.

    +

    + Own Id: OTP-8232

    +
    + +

    + Some clarifications have been made in the documentation + regarding gen_server, gen_fsm, and + gen_event behavior when handling 'EXIT' + messages from the parent process. For more information + see the gen_server(3), gen_fsm(3), and gen_event(3) documentation.

    +

    + Own Id: OTP-8255 Aux Id: seq11419

    +
    + +

    The -on_load() directive can be used to run a function + when a module is loaded. It is documented in the section + about code loading in the Reference Manual.

    +

    + Own Id: OTP-8295

    +
    +
    +
    + +
    + +
    STDLIB 1.16.3.1 + +
    Fixed Bugs and Malfunctions + + +

    + An erroneous type spec for gen:start/6 caused + dialyzer to erroneously issue warnings when + {spawn_opt, SpawnOptionList} was passed in the + option list to the gen_server and gen_fsm + start functions.

    +

    + Own Id: OTP-8068 Aux Id: seq11323, seq11314

    +
    +
    +
    + +
    + +
    STDLIB 1.16.3 + +
    Fixed Bugs and Malfunctions + + +

    The linter used to crash on invalid -opaque + declarations.

    +

    + Own Id: OTP-8051

    +
    + +

    Bugs in digraph:add_edge/5 and + digraph:del_path/3 have been fixed. (Thanks to + Crystal Din.)

    +

    + Own Id: OTP-8066

    +
    + +

    When trying to insert objects with + dets:insert_new() into a Dets table of type + duplicate_bag, already existing objects would + sometimes be duplicated. This bug has been fixed. (Thanks + to Crystal Din.)

    +

    + Own Id: OTP-8070

    +
    + +

    + Running erlc in a very deep directory (with a path length + of more 256 or more characters) would cause the emulator + to crash in a call to list_to_atom/1. (Thanks to + Chris Newcombe.)

    +

    + Own Id: OTP-8124

    +
    + +

    A few minor bugs have been fixed in the Erlang Code + Preprocessor (epp).

    +

    + Own Id: OTP-8130

    +
    + +

    A bug in The Erlang Meta Interpreter (erl_eval) + has been fixed: exceptions generated in the template of + bit string comprehensions were not handled properly. + (Thanks to Ulf Wiger.)

    +

    + Own Id: OTP-8133

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + Option {capture,none} was missing in documentation + for re:run/3.

    +

    + Own Id: OTP-8113

    +
    + +

    When erl_scan:tokens() returns an error tuple + {error, ErrorInfo, EndLocation}, the list + LeftOverChars is the remaining characters of the + input data, starting from EndLocation. It used to + be the empty list.

    +

    + *** POTENTIAL INCOMPATIBILITY ***

    +

    + Own Id: OTP-8129

    +
    + +

    The Erlang Meta Interpreter (erl_eval) has been + somewhat optimized when it comes to interpreting + receive-expressions. (Thanks to Richard + Carlsson.)

    +

    + Own Id: OTP-8139

    +
    + +

    The Erlang Pretty Printer (erl_pp) has been + modified as to handle types.

    +

    + Own Id: OTP-8150

    +
    +
    +
    + +
    +
    STDLIB 1.16.2
    Fixed Bugs and Malfunctions @@ -599,7 +789,7 @@

    - The re module is exdended with repetitive matches (global + The re module is extended with repetitive matches (global option) and replacement function.

    Own Id: OTP-7494 Aux Id: OTP-7181

    @@ -2270,7 +2460,7 @@ backwards compatibility in STDLIB 1.13.1. The flag to be used for this is now called async_shell_start and has been documented. New shells started from the JCL menu are - not syncronized with init anymore. This makes it + not synchronized with init anymore. This makes it possible to start a new shell (e.g. for debugging purposes) even if the initial shell has not come up.

    Own Id: OTP-5406 Aux Id: OTP-5218

    @@ -2476,13 +2666,13 @@ gives you a remote initial shell instead of a local one. Example:

    -\011    erl -sname this_node -rsh other_node@other_host
    +            erl -sname this_node -rsh other_node@other_host
               

    Own Id: OTP-5210

    The man page for the lists module has been updated - with decscription of the new zip, unzip, + with description of the new zip, unzip, and partition/2 functions.

    Own Id: OTP-5213

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/part_notes.xml 2007-11-26 19:00:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/part_notes.xml 2009-11-20 13:31:58.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + STDLIB Release Notes @@ -35,6 +33,6 @@

    For information about older versions, see Release Notes History.

    - + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/part.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/part.xml 2009-03-13 14:15:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/part.xml 2009-11-20 13:33:05.000000000 +0000 @@ -1,7 +1,7 @@ - +
    1996 @@ -28,12 +28,12 @@ 2008-02-25 1.0 - part.sgml + part.xml

    The Erlang standard library STDLIB.

    - - + +
    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/proplists.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/proplists.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/proplists.xml 2009-03-12 12:20:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/proplists.xml 2009-11-20 13:31:33.000000000 +0000 @@ -103,22 +103,22 @@ the same key are deleted from List.

    For example, the following expressions all return [fie, bar, baz, fum]:

    -\011 expand([{foo, [bar, baz]}], -\011 [fie, foo, fum]) -\011 expand([{{foo, true}, [bar, baz]}], -\011 [fie, foo, fum]) -\011 expand([{{foo, false}, [bar, baz]}], -\011 [fie, {foo, false}, fum]) + expand([{foo, [bar, baz]}], + [fie, foo, fum]) + expand([{{foo, true}, [bar, baz]}], + [fie, foo, fum]) + expand([{{foo, false}, [bar, baz]}], + [fie, {foo, false}, fum])

    However, no expansion is done in the following call:

    -\011 expand([{{foo, true}, [bar, baz]}], -\011 [{foo, false}, fie, foo, fum]) + expand([{{foo, true}, [bar, baz]}], + [{foo, false}, fie, foo, fum])

    because {foo, false} shadows foo.

    Note that if the original property term is to be preserved in the result when expanded, it must be included in the expansion list. The inserted terms are not expanded recursively. If Expansions contains more than one property with the same - key, only the first occurrance is used.

    + key, only the first occurrence is used.

    See also: normalize/2.

    @@ -377,7 +377,7 @@ List = [term()] -

    Unfolds all occurences of atoms in List to tuples +

    Unfolds all occurrences of atoms in List to tuples {Atom, true}.

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/qlc.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/qlc.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/qlc.xml 2009-03-12 12:21:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/qlc.xml 2009-11-20 13:31:53.000000000 +0000 @@ -879,16 +879,22 @@ io:format("~s~n", [qlc:info(QH, unique_all)]). begin V1 = - qlc:q([SQV || - SQV <- [x,y]], + qlc:q([ + SQV || + SQV <- [x,y] + ], [{unique,true}]), V2 = - qlc:q([SQV || - SQV <- [a,b]], + qlc:q([ + SQV || + SQV <- [a,b] + ], [{unique,true}]), - qlc:q([{X,Y} || + qlc:q([ + {X,Y} || X <- V1, - Y <- V2], + Y <- V2 + ], [{unique,true}]) end @@ -907,16 +913,22 @@ io:format("~s~n", [qlc:info(Q)]). begin V1 = - qlc:q([P0 || - P0 = {W,Y} <- ets:table(17)]), + qlc:q([ + P0 || + P0 = {W,Y} <- ets:table(17) + ]), V2 = - qlc:q([[G1|G2] || + qlc:q([ + [G1|G2] || G2 <- V1, G1 <- ets:table(16), - element(2, G1) =:= element(1, G2)], + element(2, G1) =:= element(1, G2) + ], [{join,lookup}]), - qlc:q([{X,Z,W} || - [{X,Z}|{W,Y}] <- V2]) + qlc:q([ + {X,Z,W} || + [{X,Z}|{W,Y}] <- V2 + ]) end

    In this example the query list comprehension V2 has @@ -1080,21 +1092,31 @@ io:format("~s~n", [qlc:info(Q)]). begin V1 = - qlc:q([P0 || - P0 = {X,Z} <- qlc:keysort(1, [{a,1},{b,4},{c,6}], [])]), + qlc:q([ + P0 || + P0 = {X,Z} <- + qlc:keysort(1, [{a,1},{b,4},{c,6}], []) + ]), V2 = - qlc:q([P0 || - P0 = {W,Y} <- qlc:keysort(2, [{2,a},{3,b},{4,c}], [])]), + qlc:q([ + P0 || + P0 = {W,Y} <- + qlc:keysort(2, [{2,a},{3,b},{4,c}], []) + ]), V3 = - qlc:q([[G1|G2] || + qlc:q([ + [G1|G2] || G1 <- V1, G2 <- V2, - element(1, G1) == element(2, G2)], + element(1, G1) == element(2, G2) + ], [{join,merge},{cache,list}]), - qlc:q([{A,X,Z,W} || + qlc:q([ + {A,X,Z,W} || A <- [a,b,c], [{X,Z}|{W,Y}] <- V3, - X =:= Y]) + X =:= Y + ]) end

    In this example the cached results of the merge join are @@ -1447,7 +1469,7 @@

    See Also

    dets(3), - + Erlang Reference Manual, erl_eval(3), erlang(3), @@ -1456,7 +1478,7 @@ error_logger(3), file_sorter(3), mnesia(3), - + Programming Examples, shell(3)

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/random.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/random.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/random.xml 2009-06-05 13:53:02.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/random.xml 2009-11-20 13:29:50.000000000 +0000 @@ -69,10 +69,10 @@ dictionary, and returns the old state.

    One way of obtaining a seed is to use the BIF now/0:

    -\011 ... -\011 {A1,A2,A3} = now(), -\011 random:seed(A1, A2, A3), -\011 ... + ... + {A1,A2,A3} = now(), + random:seed(A1, A2, A3), + ... diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/ref_man.xml 2009-03-12 12:18:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/ref_man.xml 2009-11-20 13:29:51.000000000 +0000 @@ -1,7 +1,7 @@ - +
    19962009 @@ -26,72 +26,72 @@ 1997-06-04 1.3.1 - application.sgml + application.xml

    The Standard Erlang Libraries application, STDLIB, contains modules for manipulating lists, strings and files etc.



    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/re.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/re.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/re.xml 2009-03-12 12:21:52.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/re.xml 2009-11-20 13:32:39.000000000 +0000 @@ -192,7 +192,7 @@ Options = [ Option ] Option = anchored | global | notbol | noteol | notempty | {offset, int()} | {newline, NLSpec} | bsr_anycrlf | bsr_unicode | {capture, ValueSpec} | {capture, ValueSpec, Type} | CompileOpt Type = index | list | binary - ValueSpec = all | all_but_first | first | ValueList + ValueSpec = all | all_but_first | first | none | ValueList ValueList = [ ValueID ] ValueID = int() | string() | atom() CompileOpt = see compile/2 above @@ -260,7 +260,7 @@ Limits re:run/3 to matching at the first matching position. If a pattern was compiled with anchored, or turned out to be anchored by virtue of its contents, it cannot - be made unachored at matching time, hence there is no + be made unanchored at matching time, hence there is no unanchored option. global @@ -477,7 +477,7 @@ -

    In general, subpatterns that got assigned no value in the match are returned as the tuple {-1,0} when type is index. Unasigned subpatterns are returned as the empty binary or list respectively for other return types. Consider the regular expression:

    +

    In general, subpatterns that got assigned no value in the match are returned as the tuple {-1,0} when type is index. Unassigned subpatterns are returned as the empty binary or list respectively for other return types. Consider the regular expression:

    ".*((?<FOO>abdd)|a(..d)).*"

    There are three explicitly capturing subpatterns, where the opening parenthesis position determines the order in the result, hence ((?<FOO>abdd)|a(..d)) is subpattern index 1, (?<FOO>abdd) is subpattern index 2 and (..d) is subpattern index 3. When matched against the following string:

    "ABCabcdABC" @@ -629,7 +629,7 @@ ["Er","l","a","n","g"] -

    The text matching the subexpression (marked by the parantheses +

    The text matching the subexpression (marked by the parentheses in the regexp) is inserted in the result list where it was found. In effect this means that concatenating the result of a split where the whole regexp is a @@ -743,7 +743,7 @@

    The return value from the function will in this case be a list() of list()'s. Each sublist begins with the string picked out of the subject string, followed by the parts - matching each of the subexpressions in order of occurence in the + matching each of the subexpressions in order of occurrence in the regular expression.

    @@ -801,7 +801,7 @@ Full stop (period, dot) Matching a single byte Square brackets and character classes -Posix character classes +POSIX character classes Vertical bar Internal option setting Subpatterns @@ -1102,7 +1102,7 @@ there is no character to match.

    For compatibility with Perl, \\s does not match the VT character (code 11). -This makes it different from the the POSIX "space" class. The \\s characters +This makes it different from the POSIX "space" class. The \\s characters are HT (9), LF (10), FF (12), CR (13), and space (32). If "use locale;" is included in a Perl script, \\s may match the VT character. In PCRE, it never does.

    @@ -1179,7 +1179,7 @@

    It is possible to restrict \\R to match only CR, LF, or CRLF (instead of the complete set of Unicode line endings) by setting the option bsr_anycrlf -either at compile time or when the pattern is matched. (BSR is an abbrevation +either at compile time or when the pattern is matched. (BSR is an abbreviation for "backslash R".) This can be made the default when PCRE is built; if this is the case, the other behaviour can be requested via the bsr_unicode option. It is also possible to specify these settings by starting a pattern string with @@ -1582,7 +1582,6 @@ the \\C escape sequence is best avoided.

    PCRE does not allow \\C to appear in lookbehind assertions (described below), - because in UTF-8 mode this would make it impossible to calculate the length of the lookbehind.

    @@ -1686,7 +1685,7 @@
    -
    Posix character classes +
    POSIX character classes

    Perl supports the POSIX notation for character classes. This uses names enclosed by [: and :] within the enclosing square brackets. PCRE also supports @@ -1961,7 +1960,7 @@ documentation.

    --> -

    In case of capturing named subpatterns which are not unique, the first occurence is returned from re:exec/3, if the name is specified int the values part of the capture statement.

    +

    In case of capturing named subpatterns which are not unique, the first occurrence is returned from re:exec/3, if the name is specified int the values part of the capture statement.

    @@ -2933,7 +2932,7 @@

    If the subject is "aaaac...", after the first match attempt fails (starting at the first character in the string), the starting point skips on to start the -next attempt at "c". Note that a possessive quantifer does not have the same +next attempt at "c". Note that a possessive quantifier does not have the same effect in this example; although it would suppress backtracking during the first match attempt, the second attempt would start at the second character instead of skipping on to "c".

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/shell.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/shell.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/shell.xml 2009-03-12 12:18:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/shell.xml 2009-11-20 13:29:50.000000000 +0000 @@ -91,7 +91,7 @@ user_default (if loaded) are read each time a new job is started. For instance, adding the line

    -\011 -include_lib("kernel/include/file.hrl"). + -include_lib("kernel/include/file.hrl").

    to user_default makes the definition of file_info readily available in the shell.

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/string.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/string.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/string.xml 2009-03-12 12:18:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/string.xml 2009-11-20 13:29:51.000000000 +0000 @@ -166,7 +166,7 @@

    Returns a string with the elements of StringList - seperated by the string in Seperator.

    + separated by the string in Seperator.

    For example:

    > join(["one", "two", "three"], ", "). @@ -347,14 +347,14 @@ in the string after the float are returned in Rest.

    Example:

    -\011 > {F1,Fs} = string:to_float("1.0-1.0e-1"), -\011 > {F2,[]} = string:to_float(Fs), -\011 > F1+F2. -\011 0.9 -\011 > string:to_float("3/2=1.5"). -\011 {error,no_float} -\011 > string:to_float("-1.5eX"). -\011 {-1.5,"eX"} + > {F1,Fs} = string:to_float("1.0-1.0e-1"), + > {F2,[]} = string:to_float(Fs), + > F1+F2. + 0.9 + > string:to_float("3/2=1.5"). + {error,no_float} + > string:to_float("-1.5eX"). + {-1.5,"eX"}
    @@ -372,14 +372,14 @@ in the string after the integer are returned in Rest.

    Example:

    -\011 > {I1,Is} = string:to_integer("33+22"), -\011 > {I2,[]} = string:to_integer(Is), -\011 > I1-I2. -\011 11 -\011 > string:to_integer("0.5"). -\011 {0,".5"} -\011 > string:to_integer("x=2"). -\011 {error,no_integer} + > {I1,Is} = string:to_integer("33+22"), + > {I2,[]} = string:to_integer(Is), + > I1-I2. + 11 + > string:to_integer("0.5"). + {0,".5"} + > string:to_integer("x=2"). + {error,no_integer}
    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/supervisor.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/supervisor.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/supervisor.xml 2009-03-12 12:18:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/supervisor.xml 2009-11-20 13:29:39.000000000 +0000 @@ -429,7 +429,7 @@ check_childspecs([ChildSpec]) -> Result - Check if child specifications are syntactically correct. + Check if children specifications are syntactically correct. ChildSpec = child_spec() Result = ok | {error,Error} diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/timer.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/timer.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/timer.xml 2009-03-12 12:18:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/timer.xml 2009-11-20 13:29:51.000000000 +0000 @@ -195,7 +195,7 @@

    Suspends the process calling this function for Time amount - of milliseconds and then returns ok, or supend the process + of milliseconds and then returns ok, or suspend the process forever if Time is the atom infinity. Naturally, this function does not return immediately.

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/unicode_usage.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/unicode_usage.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/unicode_usage.xml 2009-04-16 11:11:27.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/unicode_usage.xml 2009-11-20 13:33:05.000000000 +0000 @@ -58,7 +58,7 @@
    Standard Unicode representation in Erlang

    In Erlang, strings are actually lists of integers. A string is defined to be encoded in the ISO-latin-1 (ISO8859-1) character set, which is, codepoint by codepoint, a sub-range of the Unicode character set.

    -

    The standard list encoding for strings is therefore easily extendable to cope with the whole Unicode range: A Unicode string in Erlang is simply a list containing integers, each integer being a valid Unicode codepoint and representing one character in the Unicode character set.

    +

    The standard list encoding for strings is therefore easily extendible to cope with the whole Unicode range: A Unicode string in Erlang is simply a list containing integers, each integer being a valid Unicode codepoint and representing one character in the Unicode character set.

    Regular Erlang strings in ISO-latin-1 are a subset of there Unicode strings.

    Binaries on the other hand are more troublesome. For performance reasons, programs often store textual data in binaries instead of lists, mainly because they are more compact (one byte per character instead of two words per character, as is the case with lists). Using erlang:list_to_binary/1, an regular Erlang string can be converted into a binary, effectively using the ISO-latin-1 encoding in the binary - one byte per character. This is very convenient for those regular Erlang strings, but cannot be done for Unicode lists.

    @@ -161,9 +161,9 @@ 2>

    When (finally?) everything is in order with the locale settings, fonts and the terminal emulator, you probably also have discovered a way to input characters in the script you desire. For testing, the simplest way is to add some keyboard mappings for other languages, usually done with some applet in your desktop environment. In my KDE environment, I start the KDE Control Center (Personal Settings), select "Regional and Accessibility" and then "Keyboard Layout". On Windows XP®, I start Control Panel->Regional and Language Options, select the Language tab and click the Details... button in the square named "Text services and input Languages". Your environment probably provides similar means of changing the keyboard layout. Make sure you have a way to easily switch back and forth between keyboards if you are not used to this, entering commands using a Cyrillic character set is, as an example, not easily done in the Erlang shell.

    Now you are set up for some Unicode input and output. The simplest thing to do is of course to enter a string in the shell:

    -Cyrillic characters in an Erlang shell +Cyrillic characters in an Erlang shell

    While strings can be input as Unicode characters, the language elements are still limited to the ISO-latin-1 character set. Only character constants and strings are allowed to be beyond that range:

    -Unicode characters in allowed and disallowed context +Unicode characters in allowed and disallowed context
    Unicode-aware modules @@ -235,7 +235,7 @@

    Obviously the second io:format gives undesired output because the UTF-8 binary is not in latin1. Because ISO-latin-1 is still the defined character set of Erlang, the non prefixed "s" control character expects ISO-latin-1 in binaries as well as lists.

    As long as the data is always lists, the "t" modifier can be used for any string, but when binary data is involved, care must be taken to make the tight choice of formatting characters.

    The function format in io_lib behaves similarly. This function is defined to return a deep list of characters and the output could easily be converted to binary data for outputting on a device of any kind by a simple erlang:list_to_binary. When the translation modifier is used, the list can however contain characters that cannot be stored in one byte. The call to erlang:list_to_binary will in that case fail. However, if the io_server you want to communicate with is Unicode-aware, the list returned can still be used directly:

    -io_lib:format with Unicode translation +io_lib:format with Unicode translation

    The Unicode string is returned as a Unicode list, why the return value of io_lib:format no longer qualifies as a regular Erlang string (the function io_lib:deep_char_list will, as an example, return false). The Unicode list is however valid input to the io:put_chars function, so data can be output on any Unicode capable device anyway. If the device is a terminal, characters will be output in the \x{H ...} format if encoding is latin1 otherwise in UTF-8 (for the non-interactive terminal - "oldshell" or "noshell") or whatever is suitable to show the character properly (for an interactive terminal - the regular shell). The bottom line is that you can always send Unicode data to the standard_io device. Files will however only accept Unicode codepoints beyond ISO-latin-1 if encoding is set to something else than latin1.

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/unicode.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/unicode.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/unicode.xml 2009-03-13 14:15:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/unicode.xml 2009-11-20 13:32:50.000000000 +0000 @@ -145,7 +145,7 @@ because of invalid UTF encoding in any binaries, an error tuple is returned. The error tuple contains the tag error, a list representing the characters that could be - converted before the error occured and a representation of the + converted before the error occurred and a representation of the characters including and after the offending integer/bytes. The last part is mostly for debugging as it still constitutes a possibly deep and/or mixed list, not necessarily of the same @@ -200,12 +200,12 @@ binaries in the Data, the conversion succeeds. This means that a character can be decoded from a range of binaries as long as the whole range is given as input without errors - occuring. Example:

    + occurring. Example:

    decode_data(Data) -> case unicode:characters_to_list(Data,unicode) of - {inclomplete,Encoded, Rest} -> + {incomplete,Encoded, Rest} -> More = get_some_more_data(), Encoded ++ decode_data([Rest, More]); {error,Encoded,Rest} -> diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/win32reg.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/win32reg.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/win32reg.xml 2009-03-12 12:19:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/win32reg.xml 2009-11-20 13:31:14.000000000 +0000 @@ -176,7 +176,7 @@ characters. Anything between two % is taken for a environment variable, and is replaced by the value. Two consecutive % is replaced by one %.

    -

    A variable name that is not in the environment, will result in an error.\011

    +

    A variable name that is not in the environment, will result in an error.

    diff -Nru erlang-13.b.1-dfsg/lib/stdlib/doc/src/zip.xml erlang-13.b.3-dfsg/lib/stdlib/doc/src/zip.xml --- erlang-13.b.1-dfsg/lib/stdlib/doc/src/zip.xml 2009-03-12 12:21:31.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/doc/src/zip.xml 2009-11-20 13:32:19.000000000 +0000 @@ -32,7 +32,7 @@ zip.sgml zip - Utility for reading and creating 'zip' arhcives. + Utility for reading and creating 'zip' archives.

    The zip module archives and extract files to and from a zip archive. The zip format is specified by the "ZIP Appnote.txt" file @@ -75,7 +75,7 @@

    Only the DEFLATE (zlib-compression) and the STORE (uncompressed data) zip methods are supported.

    The size of the archive is limited to 2 G-byte (32 bits).

    -

    Comments for indivudal files is not supported when creating zip +

    Comments for individual files is not supported when creating zip archives. The zip archive comment for the whole zip archive is supported.

    There is currently no support for altering an existing zip archive. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/include/erl_compile.hrl erlang-13.b.3-dfsg/lib/stdlib/include/erl_compile.hrl --- erlang-13.b.1-dfsg/lib/stdlib/include/erl_compile.hrl 2009-03-12 12:18:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/include/erl_compile.hrl 2009-11-20 13:30:10.000000000 +0000 @@ -20,9 +20,9 @@ %% Generic compiler options, passed from the erl_compile module. -record(options, - {includes=[] :: [string()], % Include paths (list of + {includes=[] :: [file:filename()], % Include paths (list of % absolute directory names). - outdir="." :: string(), % Directory for result + outdir="." :: file:filename(), % Directory for result % (absolute path). output_type=undefined :: atom(), % Type of output file. defines=[] :: [atom() | {atom(),_}], % Preprocessor defines. Each @@ -32,12 +32,12 @@ warning=1 :: non_neg_integer(), % Warning level (0 - no % warnings, 1 - standard level, % 2, 3, ... - more warnings). - verbose=false :: bool(), % Verbose (true/false). + verbose=false :: boolean(), % Verbose (true/false). optimize=999, % Optimize options. specific=[] :: [_], % Compiler specific options. - outfile="" :: string(), % Name of output file (internal + outfile="" :: file:filename(), % Name of output file (internal % use in erl_compile.erl). - cwd :: string() % Current working directory + cwd :: file:filename() % Current working directory % for erlc. }). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/array.erl erlang-13.b.3-dfsg/lib/stdlib/src/array.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/array.erl 2009-06-05 13:53:45.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/array.erl 2009-11-20 13:32:34.000000000 +0000 @@ -86,6 +86,7 @@ foldr/3, sparse_foldl/3, sparse_foldr/3, fix/1, relax/1, is_fix/1, resize/1, resize/2]). +%%-define(TEST,1). -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). -endif. @@ -134,6 +135,7 @@ -define(NEW_NODE(S), % beware of argument duplication! setelement((?NODESIZE+1),erlang:make_tuple((?NODESIZE+1),(S)),(S))). -define(NEW_LEAF(D), erlang:make_tuple(?LEAFSIZE,(D))). +-define(NODELEAFS, ?NODESIZE*?LEAFSIZE). %% These make the code a little easier to experiment with. %% It turned out that using shifts (when NODESIZE=2^n) was not faster. @@ -162,7 +164,7 @@ -type array_indx() :: non_neg_integer(). -type array_opt() :: 'fixed' | non_neg_integer() - | {'default', term()} | {'fixed', bool()} + | {'default', term()} | {'fixed', boolean()} | {'size', non_neg_integer()}. -type array_opts() :: array_opt() | [array_opt()]. @@ -273,6 +275,9 @@ new_1(_Options, _Size, _Fixed, _Default) -> erlang:error(badarg). +new(0, false, undefined) -> + %% Constant empty array + #array{size=0, max=?LEAFSIZE, elements=?LEAFSIZE}; new(Size, Fixed, Default) -> E = find_max(Size - 1, ?LEAFSIZE), M = if Fixed -> 0; @@ -288,13 +293,13 @@ M. -%% @spec (X::term()) -> bool() +%% @spec (X::term()) -> boolean() %% @doc Returns `true' if `X' appears to be an array, otherwise `false'. %% Note that the check is only shallow; there is no guarantee that `X' %% is a well-formed array representation even if this function returns %% `true'. --spec is_array(term()) -> bool(). +-spec is_array(term()) -> boolean(). is_array(#array{size = Size, max = Max}) when is_integer(Size), is_integer(Max) -> @@ -411,12 +416,12 @@ A#array{max = 0}. -%% @spec (array()) -> bool() +%% @spec (array()) -> boolean() %% @doc Check if the array has fixed size. %% Returns `true' if the array is fixed, otherwise `false'. %% @see fix/1 --spec is_fix(array()) -> bool(). +-spec is_fix(array()) -> boolean(). is_fix(#array{max = 0}) -> true; is_fix(#array{}) -> false. @@ -656,10 +661,10 @@ %% @spec (integer(), array()) -> array() -%% @doc Reset entry `I' to the default value for the array. This is -%% equivalent to `set(I, default(Array), Array)', and hence may cause -%% the array to grow in size, but will not shrink it. Shrinking can be -%% done explicitly by calling {@link resize/2}. +%% @doc Reset entry `I' to the default value for the array. +%% If the value of entry `I' is the default value the array will be +%% returned unchanged. Reset will never change size of the array. +%% Shrinking can be done explicitly by calling {@link resize/2}. %% %% If `I' is not a nonnegative integer, or if the array has fixed size %% and `I' is larger than the maximum index, the call fails with reason @@ -672,8 +677,31 @@ -spec reset(array_indx(), array()) -> array(). -reset(I, Array) -> - set(I, Array#array.default, Array). +reset(I, #array{size = N, max = M, default = D, elements = E}=A) + when is_integer(I), I >= 0 -> + if I < N -> + try A#array{elements = reset_1(I, E, D)} + catch throw:default -> A + end; + M > 0 -> + A; + true -> + erlang:error(badarg) + end; +reset(_I, _A) -> + erlang:error(badarg). + +reset_1(I, E=?NODEPATTERN(S), D) -> + I1 = I div S + 1, + setelement(I1, E, reset_1(I rem S, element(I1, E), D)); +reset_1(_I, E, _D) when is_integer(E) -> + throw(default); +reset_1(I, E, D) -> + Indx = I+1, + case element(Indx, E) of + D -> throw(default); + _ -> setelement(I+1, E, D) + end. -ifdef(EUNIT). @@ -1177,43 +1205,110 @@ from_orddict([], Default) -> new({default,Default}); from_orddict(List, Default) when is_list(List) -> - {E, N, M} = from_orddict_1(?LEAFSIZE, List, 0, Default, 0, [], []), + {E, N, M} = from_orddict_0(List, 0, ?LEAFSIZE, Default, []), #array{size = N, max = M, default = Default, elements = E}; from_orddict(_, _) -> erlang:error(badarg). -%% Note: see from_list_1() above for details. +%% 2 pass implementation, first pass builds the needed leaf nodes +%% and adds hole sizes. +%% (inserts default elements for missing list entries in the leafs +%% and pads the last tuple if necessary). +%% Second pass builds the tree from the leafs and the holes. +%% +%% Doesn't build/expand unnecessary leaf nodes which costs memory +%% and time for sparse arrays. + +from_orddict_0([], N, _Max, _D, Es) -> + %% Finished, build the resulting tree + case Es of + [E] -> + {E, N, ?LEAFSIZE}; + _ -> + collect_leafs(N, Es, ?LEAFSIZE) + end; -%% Building the leaf nodes (inserts default elements for missing list -%% entries and pads the last tuple if necessary) and counting the total -%% number of elements. We then call from_list_2 to finish the job. -from_orddict_1(0, Xs, Ix, D, N, As, Es) -> +from_orddict_0(Xs=[{Ix1, _}|_], Ix, Max0, D, Es0) + when Ix1 > Max0, is_integer(Ix1) -> + %% We have a hole larger than a leaf + Hole = Ix1-Ix, + Step = Hole - (Hole rem ?LEAFSIZE), + Next = Ix+Step, + from_orddict_0(Xs, Next, Next+?LEAFSIZE, D, [Step|Es0]); +from_orddict_0(Xs0=[{_, _}|_], Ix0, Max, D, Es) -> + %% Fill a leaf + {Xs,E,Ix} = from_orddict_1(Ix0, Max, Xs0, Ix0, D, []), + from_orddict_0(Xs, Ix, Ix+?LEAFSIZE, D, [E|Es]); +from_orddict_0(Xs, _, _, _,_) -> + erlang:error({badarg, Xs}). + +from_orddict_1(Ix, Ix, Xs, N, _D, As) -> + %% Leaf is full E = list_to_tuple(lists:reverse(As)), - case Xs of - [] -> - case Es of - [] -> - {E, N, ?LEAFSIZE}; - _ -> - from_list_2_0(N, [E | Es], ?LEAFSIZE) - end; - [_|_] -> - from_orddict_1(?LEAFSIZE, Xs, Ix, D, N, [], [E | Es]); - _ -> - erlang:error(badarg) - end; -from_orddict_1(I, Xs, Ix, D, N, As, Es) -> + {Xs, E, N}; +from_orddict_1(Ix, Max, Xs, N0, D, As) -> case Xs of [{Ix, Val} | Xs1] -> - from_orddict_1(I-1, Xs1, Ix+1, D, N+1, [Val | As], Es); + N = Ix+1, + from_orddict_1(N, Max, Xs1, N, D, [Val | As]); [{Ix1, _} | _] when is_integer(Ix1), Ix1 > Ix -> - from_orddict_1(I-1, Xs, Ix+1, D, N+1, [D | As], Es); + N = Ix+1, + from_orddict_1(N, Max, Xs, N, D, [D | As]); [_ | _] -> erlang:error({badarg, Xs}); _ -> - from_orddict_1(I-1, Xs, Ix+1, D, N, [D | As], Es) + from_orddict_1(Ix+1, Max, Xs, N0, D, [D | As]) end. +%% Es is reversed i.e. starting from the largest leafs +collect_leafs(N, Es, S) -> + I = (N-1) div S + 1, + Pad = ((?NODESIZE - (I rem ?NODESIZE)) rem ?NODESIZE) * S, + case Pad of + 0 -> + collect_leafs(?NODESIZE, Es, S, N, [S], []); + _ -> %% Pad the end + collect_leafs(?NODESIZE, [Pad|Es], S, N, [S], []) + end. + +collect_leafs(0, Xs, S, N, As, Es) -> + E = list_to_tuple(As), + case Xs of + [] -> + case Es of + [] -> + {E, N, ?extend(S)}; + _ -> + collect_leafs(N, lists:reverse([E | Es]), + ?extend(S)) + end; + _ -> + collect_leafs(?NODESIZE, Xs, S, N, [S], [E | Es]) + end; +collect_leafs(I, [X | Xs], S, N, As0, Es0) + when is_integer(X) -> + %% A hole, pad accordingly. + Step0 = (X div S), + if + Step0 < I -> + As = push(Step0, S, As0), + collect_leafs(I-Step0, Xs, S, N, As, Es0); + I =:= ?NODESIZE -> + Step = Step0 rem ?NODESIZE, + As = push(Step, S, As0), + collect_leafs(I-Step, Xs, S, N, As, [X|Es0]); + I =:= Step0 -> + As = push(I, S, As0), + collect_leafs(0, Xs, S, N, As, Es0); + true -> + As = push(I, S, As0), + Step = Step0 - I, + collect_leafs(0, [Step*S|Xs], S, N, As, Es0) + end; +collect_leafs(I, [X | Xs], S, N, As, Es) -> + collect_leafs(I-1, Xs, S, N, [X | As], Es); +collect_leafs(?NODESIZE, [], S, N, [_], Es) -> + collect_leafs(N, lists:reverse(Es), ?extend(S)). -ifdef(EUNIT). from_orddict_test_() -> @@ -1231,7 +1326,7 @@ =:= N1), ?_assertError({badarg,_}, from_orddict([foo])), ?_assertError({badarg,_}, from_orddict([{200,foo},{1,bar}])), - ?_assertError(badarg, from_orddict([{N,0}||N<-lists:seq(0,N0-1)] ++ not_a_list)), + ?_assertError({badarg,_}, from_orddict([{N,0}||N<-lists:seq(0,N0-1)] ++ not_a_list)), ?_assertError(badarg, from_orddict(no_array)), @@ -1246,7 +1341,47 @@ ?_assert(?LET(L, [{N,0}||N<-lists:seq(0,N3-1)], L =:= to_orddict(from_orddict(L)))), ?_assert(?LET(L, [{N,0}||N<-lists:seq(0,N4-1)], - L =:= to_orddict(from_orddict(L)))) + L =:= to_orddict(from_orddict(L)))), + + %% Hole in the begining + ?_assert(?LET(L, [{0,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N0,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N3,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N4,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N0-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N1-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N3-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N4-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + + %% Hole in middle + + ?_assert(?LET(L, [{0,0},{N0,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N3,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N4,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N0-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N1-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N3-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N4-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))) + ]. -endif. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/beam_lib.erl erlang-13.b.3-dfsg/lib/stdlib/src/beam_lib.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/beam_lib.erl 2009-03-12 12:19:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/beam_lib.erl 2009-11-20 13:31:09.000000000 +0000 @@ -41,60 +41,159 @@ terminate/2,code_change/3]). -export([make_crypto_key/2, get_crypto_key/1]). %Utilities used by compiler --import(lists, - [append/1, delete/2, foreach/2, keysearch/3, keysort/2, - member/2, reverse/1, sort/1, splitwith/2]). +-import(lists, [append/1, delete/2, foreach/2, keysort/2, + member/2, reverse/1, sort/1, splitwith/2]). -include_lib("kernel/include/file.hrl"). -include("erl_compile.hrl"). +%%------------------------------------------------------------------------- + +-type beam() :: module() | file:filename() | binary(). + +%% XXX: THE FOLLOWING SHOULD BE IMPORTED FROM SOMEWHERE ELSE +-type forms() :: term(). + +-type abst_vsn() :: atom(). +-type abst_code() :: {abst_vsn(), forms()} | 'no_abstract_code'. +-type attribute() :: atom(). +-type attrvalue() :: term(). +-type dataB() :: binary(). +-type index() :: non_neg_integer(). +-type label() :: integer(). + +-type chunkid() :: nonempty_string(). % approximation of the strings below +%% "Abst" | "Attr" | "CInf" | "ExpT" | "ImpT" | "LocT" | "Atom". +-type chunkname() :: 'abstract_code' | 'attributes' | 'compile_info' + | 'exports' | 'labeled_exports' + | 'imports' | 'indexed_imports' + | 'locals' | 'labeled_locals' + | 'atoms'. +-type chunkref() :: chunkname() | chunkid(). + +-type attrib_entry() :: {attribute(), [attrvalue()]}. +-type compinfo_entry() :: {atom(), term()}. +-type labeled_entry() :: {atom(), arity(), label()}. + +-type chunkdata() :: {chunkid(), dataB()} + | {'abstract_code', abst_code()} + | {'attributes', [attrib_entry()]} + | {'compile_info', [compinfo_entry()]} + | {'exports', [{atom(), arity()}]} + | {'labeled_exports', [labeled_entry()]} + | {'imports', [mfa()]} + | {'indexed_imports', [{index(), module(), atom(), arity()}]} + | {'locals', [{atom(), arity()}]} + | {'labeled_locals', [labeled_entry()]} + | {'atoms', [{integer(), atom()}]}. + +-type info_pair() :: {'file', file:filename()} + | {'binary', binary()} + | {'module', module()} + | {'chunks', [{chunkid(), integer(), integer()}]}. + +%% Error reasons +-type info_rsn() :: {'chunk_too_big', file:filename(), + chunkid(), integer(), integer()} + | {'invalid_beam_file', file:filename(), integer()} + | {'invalid_chunk', file:filename(), chunkid()} + | {'missing_chunk', file:filename(), chunkid()} + | {'not_a_beam_file', file:filename()} + | {'file_error', file:filename(), file:posix()}. +-type chnk_rsn() :: {'unknown_chunk', file:filename(), atom()} + | {'key_missing_or_invalid', file:filename(), + 'abstract_code'} + | info_rsn(). +-type cmp_rsn() :: {'modules_different', module(), module()} + | {'chunks_different', chunkid()} + | info_rsn(). + +%%------------------------------------------------------------------------- + %% %% Exported functions %% +-spec info(beam()) -> [info_pair()] | {'error', 'beam_lib', info_rsn()}. + info(File) -> read_info(beam_filename(File)). +-spec chunks(beam(), [chunkref()]) -> + {'ok', {module(), [chunkdata()]}} | {'error', 'beam_lib', chnk_rsn()}. + chunks(File, Chunks) -> read_chunk_data(File, Chunks). +-spec chunks(beam(), [chunkref()], ['allow_missing_chunks']) -> + {'ok', {module(), [{chunkref(), chunkdata() | 'missing_chunk'}]}} + | {'error', 'beam_lib', chnk_rsn()}. + chunks(File, Chunks, Options) -> try read_chunk_data(File, Chunks, Options) catch Error -> Error end. +-spec all_chunks(beam()) -> {'ok', 'beam_lib', [{chunkid(), dataB()}]}. + all_chunks(File) -> read_all_chunks(File). +-spec cmp(beam(), beam()) -> 'ok' | {'error', 'beam_lib', cmp_rsn()}. + cmp(File1, File2) -> try cmp_files(File1, File2) catch Error -> Error end. +-spec cmp_dirs(atom() | file:filename(), atom() | file:filename()) -> + {[file:filename()], [file:filename()], + [{file:filename(), file:filename()}]} + | {'error', 'beam_lib', {'not_a_directory', term()} | info_rsn()}. + cmp_dirs(Dir1, Dir2) -> catch compare_dirs(Dir1, Dir2). +-spec diff_dirs(atom() | file:filename(), atom() | file:filename()) -> + 'ok' | {'error', 'beam_lib', {'not_a_directory', term()} | info_rsn()}. + diff_dirs(Dir1, Dir2) -> catch diff_directories(Dir1, Dir2). +-spec strip(beam()) -> + {'ok', {module(), beam()}} | {'error', 'beam_lib', info_rsn()}. + strip(FileName) -> try strip_file(FileName) catch Error -> Error end. +-spec strip_files([beam()]) -> + {'ok', [{module(), beam()}]} | {'error', 'beam_lib', info_rsn()}. + strip_files(Files) when is_list(Files) -> try strip_fils(Files) catch Error -> Error end. - + +-spec strip_release(atom() | file:filename()) -> + {'ok', [{module(), file:filename()}]} + | {'error', 'beam_lib', {'not_a_directory', term()} | info_rsn()}. + strip_release(Root) -> catch strip_rel(Root). +-spec version(beam()) -> + {'ok', {module(), [term()]}} | {'error', 'beam_lib', chnk_rsn()}. + version(File) -> case catch read_chunk_data(File, [attributes]) of {ok, {Module, [{attributes, Attrs}]}} -> - {value, {vsn, Version}} = keysearch(vsn, 1, Attrs), + {vsn, Version} = lists:keyfind(vsn, 1, Attrs), {ok, {Module, Version}}; Error -> Error end. +-spec md5(beam()) -> + {'ok', {module(), binary()}} | {'error', 'beam_lib', chnk_rsn()}. + md5(File) -> case catch read_significant_chunks(File) of {ok, {Module, Chunks0}} -> @@ -104,6 +203,8 @@ Error end. +-spec format_error(term()) -> [char() | string()]. + format_error({error, Error}) -> format_error(Error); format_error({error, Module, Error}) -> @@ -149,12 +250,25 @@ %% Exported functions for encrypted debug info. %% +-type mode() :: 'des3_cbc'. +-type crypto_fun_arg() :: 'init' + | 'clear' + | {'debug_info', mode(), module(), file:filename()}. +-type crypto_fun() :: fun((crypto_fun_arg()) -> term()). + +-spec crypto_key_fun(crypto_fun()) -> 'ok' | {'error', term()}. + crypto_key_fun(F) -> call_crypto_server({crypto_key_fun, F}). +-spec clear_crypto_key_fun() -> 'undefined' | {'ok', term()}. + clear_crypto_key_fun() -> call_crypto_server(clear_crypto_key_fun). +-spec make_crypto_key(mode(), string()) -> + {binary(), binary(), binary(), binary()}. + make_crypto_key(des3_cbc, String) -> <> = First = erlang:md5(String), <> = erlang:md5([First|reverse(String)]), @@ -179,7 +293,7 @@ diff_only(Dir2, OnlyDir2), foreach(fun(D) -> io:format("** different: ~p~n", [D]) end, Diff), ok. - + diff_only(_Dir, []) -> ok; diff_only(Dir, Only) -> @@ -353,7 +467,7 @@ try chunks_to_data(Names, Chunks, File, Chunks, Module, T, []) after ets:delete(AT) end. - + %% -> {ok, list()} | throw(Error) check_chunks([ChunkName | Ids], File, IL, L) when is_atom(ChunkName) -> ChunkId = chunk_name_to_id(ChunkName, File), @@ -460,7 +574,7 @@ end. chunks_to_data([{Id, Name} | CNs], Chunks, File, Cs, Module, Atoms, L) -> - {value, {_Id, Chunk}} = keysearch(Id, 1, Chunks), + {_Id, Chunk} = lists:keyfind(Id, 1, Chunks), {NewAtoms, Ret} = chunk_to_data(Name, Chunk, File, Cs, Atoms, Module), chunks_to_data(CNs, Chunks, File, Cs, Module, NewAtoms, [Ret | L]); chunks_to_data([], _Chunks, _File, _Cs, Module, _Atoms, L) -> @@ -567,7 +681,7 @@ %% AT is updated. ensure_atoms({empty, AT}, Cs) -> - {value, {_Id, AtomChunk}} = keysearch("Atom", 1, Cs), + {_Id, AtomChunk} = lists:keyfind("Atom", 1, Cs), extract_atoms(AtomChunk, AT), AT; ensure_atoms(AT, _Cs) -> @@ -666,7 +780,7 @@ error({not_a_directory, FileName}) end. --spec file_error([char(),...], {'error',atom()}) -> no_return(). +-spec file_error(file:filename(), {'error',atom()}) -> no_return(). file_error(FileName, {error, Reason}) -> error({file_error, FileName, Reason}). @@ -698,7 +812,7 @@ %%% can use it. %%% ==================================================================== --record(state, {crypto_key_f :: fun((_) -> _)}). +-record(state, {crypto_key_f :: crypto_fun()}). -define(CRYPTO_KEY_SERVER, beam_lib__crypto_key_server). @@ -742,9 +856,20 @@ start_crypto_server() -> gen_server:start({local,?CRYPTO_KEY_SERVER}, ?MODULE, [], []). +-spec init([]) -> {'ok', #state{}}. + init([]) -> {ok, #state{}}. +-type calls() :: 'clear_crypto_key_fun' + | {'crypto_key_fun', _} + | {'get_crypto_key', _}. + +-spec handle_call(calls(), {pid(), term()}, #state{}) -> + {'noreply', #state{}} | + {'reply', 'error' | {'error','badfun' | 'exists'}, #state{}} | + {'stop', 'normal', 'undefined' | {'ok', term()}, #state{}}. + handle_call({get_crypto_key, _}=R, From, #state{crypto_key_f=undefined}=S) -> case crypto_key_fun_from_file() of error -> @@ -812,15 +937,23 @@ {stop,normal,{ok,Result},S} end. +-spec handle_cast(term(), #state{}) -> {'noreply', #state{}}. + handle_cast(_, State) -> {noreply, State}. +-spec handle_info(term(), #state{}) -> {'noreply', #state{}}. + handle_info(_, State) -> {noreply, State}. +-spec code_change(term(), #state{}, term()) -> {'ok', #state{}}. + code_change(_OldVsn, State, _Extra) -> {ok, State}. - + +-spec terminate(term(), #state{}) -> 'ok'. + terminate(_Reason, _State) -> ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/calendar.erl erlang-13.b.3-dfsg/lib/stdlib/src/calendar.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/calendar.erl 2009-03-12 12:17:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/calendar.erl 2009-09-18 15:06:56.000000000 +0100 @@ -160,11 +160,11 @@ %% is_leap_year(Year) = true | false %% --spec is_leap_year(year()) -> bool(). +-spec is_leap_year(year()) -> boolean(). is_leap_year(Y) when is_integer(Y), Y >= 0 -> is_leap_year1(Y). --spec is_leap_year1(year()) -> bool(). +-spec is_leap_year1(year()) -> boolean(). is_leap_year1(Year) when Year rem 4 =:= 0, Year rem 100 > 0 -> true; is_leap_year1(Year) when Year rem 400 =:= 0 -> @@ -336,17 +336,17 @@ %% valid_date(Year, Month, Day) = true | false %% valid_date({Year, Month, Day}) = true | false %% --spec valid_date(integer(), integer(), integer()) -> bool(). +-spec valid_date(integer(), integer(), integer()) -> boolean(). valid_date(Y, M, D) when is_integer(Y), is_integer(M), is_integer(D) -> valid_date1(Y, M, D). --spec valid_date1(integer(), integer(), integer()) -> bool(). +-spec valid_date1(integer(), integer(), integer()) -> boolean(). valid_date1(Y, M, D) when Y >= 0, M > 0, M < 13, D > 0 -> D =< last_day_of_the_month(Y, M); valid_date1(_, _, _) -> false. --spec valid_date({integer(),integer(),integer()}) -> bool(). +-spec valid_date({integer(),integer(),integer()}) -> boolean(). valid_date({Y, M, D}) -> valid_date(Y, M, D). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/dets_v9.erl erlang-13.b.3-dfsg/lib/stdlib/src/dets_v9.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/dets_v9.erl 2009-03-12 12:20:27.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/dets_v9.erl 2009-09-18 15:08:31.000000000 +0100 @@ -2284,7 +2284,7 @@ eval_end(New, NLU, Type, Ws, NewNo, Orig); true -> NewOld = dets_utils:msort(New), - eval_key1(L, Cs, NewOld, Type, Key, NLU, Ws, NewNo, Orig) + eval_key1(L, [], NewOld, Type, Key, NLU, Ws, NewNo, Orig) end; eval_key1([{_Seq,delete_key} | L], _Cs, Old, Type, K, LU, Ws, No, Orig) -> NewNo = No - length(Old), diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/dict.erl erlang-13.b.3-dfsg/lib/stdlib/src/dict.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/dict.erl 2009-03-12 12:19:52.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/dict.erl 2009-09-18 15:08:12.000000000 +0100 @@ -80,7 +80,7 @@ Empty = mk_seg(?seg_size), #dict{empty=Empty,segs={Empty}}. --spec is_key(term(), dict()) -> bool(). +-spec is_key(term(), dict()) -> boolean(). is_key(Key, D) -> Slot = get_slot(D, Key), @@ -310,7 +310,7 @@ map(F, D) -> map_dict(F, D). --spec filter(fun((term(), term()) -> bool()), dict()) -> dict(). +-spec filter(fun((term(), term()) -> boolean()), dict()) -> dict(). filter(F, D) -> filter_dict(F, D). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/digraph.erl erlang-13.b.3-dfsg/lib/stdlib/src/digraph.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/digraph.erl 2009-03-12 12:17:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/digraph.erl 2009-09-18 15:06:57.000000000 +0100 @@ -39,7 +39,7 @@ -record(digraph, {vtab = notable :: ets:tab(), etab = notable :: ets:tab(), ntab = notable :: ets:tab(), - cyclic = true :: bool()}). + cyclic = true :: boolean()}). %% A declaration equivalent to the following one is hard-coded in erl_types. %% That declaration contains hard-coded information about the #digraph{} %% record and the types of its fields. So, please make sure that any @@ -85,8 +85,8 @@ %% %% Check type of graph %% -%-spec check_type([d_type()], d_protection(), [{'cyclic', bool()}]) -> -% {d_protection(), [{'cyclic', bool()}]}. +%-spec check_type([d_type()], d_protection(), [{'cyclic', boolean()}]) -> +% {d_protection(), [{'cyclic', boolean()}]}. check_type([acyclic|Ts], A, L) -> check_type(Ts, A,[{cyclic,false} | L]); @@ -102,7 +102,7 @@ %% %% Set graph type %% --spec set_type([{'cyclic', bool()}], digraph()) -> digraph(). +-spec set_type([{'cyclic', boolean()}], digraph()) -> digraph(). set_type([{cyclic,V} | Ks], G) -> set_type(Ks, G#digraph{cyclic = V}); @@ -316,10 +316,10 @@ %% %% Collect either source or sink vertices. %% -collect_vertices(#digraph{vtab=VT, ntab=NT}, Type) -> - Vs = ets:select(VT, [{{'$1', '_'}, [], ['$1']}]), +collect_vertices(G, Type) -> + Vs = vertices(G), lists:foldl(fun(V, A) -> - case ets:member(NT, {Type, V}) of + case ets:member(G#digraph.ntab, {Type, V}) of true -> A; false -> [V|A] end @@ -343,7 +343,7 @@ [{E, V1, V2, _}] -> do_del_edge(E, V1, V2, G), do_del_nedges(Ns, G); - [] -> + [] -> % cannot happen do_del_nedges(Ns, G) end; do_del_nedges([], #digraph{}) -> true. @@ -376,13 +376,13 @@ -spec rm_edge(vertex(), vertex(), digraph()) -> 'ok'. rm_edge(V1, V2, G) -> - Ns = ets:lookup(G#digraph.ntab, {out, V1}), - rm_edge_0(Ns, V1, V2, G). + Es = out_edges(G, V1), + rm_edge_0(Es, V1, V2, G). -rm_edge_0([{_, E}|Es], V1, V2, G) -> +rm_edge_0([E|Es], V1, V2, G) -> case ets:lookup(G#digraph.etab, E) of [{E, V1, V2, _}] -> - ets:delete(G#digraph.etab, E), + do_del_edge(E, V1, V2, G), rm_edge_0(Es, V1, V2, G); _ -> rm_edge_0(Es, V1, V2, G) @@ -401,13 +401,25 @@ true -> case ets:member(G#digraph.vtab, V2) of false -> {error, {bad_vertex, V2}}; - true when G#digraph.cyclic =:= false -> - acyclic_add_edge(E, V1, V2, Label, G); - true -> - do_insert_edge(E, V1, V2, Label, G) + true -> + case other_edge_exists(G, E, V1, V2) of + true -> {error, {bad_edge, [V1, V2]}}; + false when G#digraph.cyclic =:= false -> + acyclic_add_edge(E, V1, V2, Label, G); + false -> + do_insert_edge(E, V1, V2, Label, G) + end end end. +other_edge_exists(#digraph{etab = ET}, E, V1, V2) -> + case ets:lookup(ET, E) of + [{E, Vert1, Vert2, _}] when Vert1 =/= V1; Vert2 =/= V2 -> + true; + _ -> + false + end. + -spec do_insert_edge(edge(), vertex(), vertex(), label(), digraph()) -> edge(). do_insert_edge(E, V1, V2, Label, #digraph{ntab=NT, etab=ET}) -> @@ -436,7 +448,7 @@ case get_path(G, V1, V2) of false -> true; Path -> - rm_edges([V1|Path], G), + rm_edges(Path, G), del_path(G, V1, V2) end. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/digraph_utils.erl erlang-13.b.3-dfsg/lib/stdlib/src/digraph_utils.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/digraph_utils.erl 2009-03-12 12:19:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/digraph_utils.erl 2009-09-18 15:08:07.000000000 +0100 @@ -35,30 +35,52 @@ preorder/1, postorder/1]). %% +%% A convenient type alias +%% + +-type vertices() :: [digraph:vertex()]. + +%% %% Exported functions %% +-spec components(digraph()) -> vertices(). + components(G) -> forest(G, fun inout/3). - + +-spec strong_components(digraph()) -> vertices(). + strong_components(G) -> forest(G, fun in/3, revpostorder(G)). +-spec cyclic_strong_components(digraph()) -> vertices(). + cyclic_strong_components(G) -> remove_singletons(strong_components(G), G, []). +-spec reachable(vertices(), digraph()) -> vertices(). + reachable(Vs, G) when is_list(Vs) -> lists:append(forest(G, fun out/3, Vs, first)). - + +-spec reachable_neighbours(vertices(), digraph()) -> vertices(). + reachable_neighbours(Vs, G) when is_list(Vs) -> lists:append(forest(G, fun out/3, Vs, not_first)). - + +-spec reaching(vertices(), digraph()) -> vertices(). + reaching(Vs, G) when is_list(Vs) -> lists:append(forest(G, fun in/3, Vs, first)). - + +-spec reaching_neighbours(vertices(), digraph()) -> vertices(). + reaching_neighbours(Vs, G) when is_list(Vs) -> lists:append(forest(G, fun in/3, Vs, not_first)). - + +-spec topsort(digraph()) -> vertices() | 'false'. + topsort(G) -> L = revpostorder(G), case length(forest(G, fun in/3, L)) =:= length(digraph:vertices(G)) of @@ -66,12 +88,13 @@ false -> false end. +-spec is_acyclic(digraph()) -> boolean(). + is_acyclic(G) -> - case loop_vertices(G) of - [] -> topsort(G) =/= false; - _ -> false - end. - + loop_vertices(G) =:= [] andalso topsort(G) =/= false. + +-spec arborescence_root(digraph()) -> 'no' | {'yes', digraph:vertex()}. + arborescence_root(G) -> case digraph:no_edges(G) =:= digraph:no_vertices(G) - 1 of true -> @@ -91,16 +114,24 @@ no end. +-spec is_arborescence(digraph()) -> boolean(). + is_arborescence(G) -> arborescence_root(G) =/= no. +-spec is_tree(digraph()) -> boolean(). + is_tree(G) -> (digraph:no_edges(G) =:= digraph:no_vertices(G) - 1) andalso (length(components(G)) =:= 1). +-spec loop_vertices(digraph()) -> vertices(). + loop_vertices(G) -> [V || V <- digraph:vertices(G), is_reflexive_vertex(V, G)]. +-spec subgraph(digraph(), vertices()) -> digraph(). + subgraph(G, Vs) -> try subgraph_opts(G, Vs, []) @@ -109,6 +140,11 @@ erlang:error(badarg) end. +-type option() :: {'type', 'inherit' | [digraph:d_type()]} + | {'keep_labels', boolean()}. + +-spec subgraph(digraph(), vertices(), [option()]) -> digraph(). + subgraph(G, Vs, Opts) -> try subgraph_opts(G, Vs, Opts) @@ -117,6 +153,8 @@ erlang:error(badarg) end. +-spec condensation(digraph()) -> digraph(). + condensation(G) -> SCs = strong_components(G), %% Each component is assigned a number. @@ -137,10 +175,14 @@ ets:delete(V2I), ets:delete(I2C), SCG. - + +-spec preorder(digraph()) -> vertices(). + preorder(G) -> lists:reverse(revpreorder(G)). +-spec postorder(digraph()) -> vertices(). + postorder(G) -> lists:reverse(revpostorder(G)). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/edlin_expand.erl erlang-13.b.3-dfsg/lib/stdlib/src/edlin_expand.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/edlin_expand.erl 2009-03-12 12:21:20.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/edlin_expand.erl 2009-09-18 15:09:01.000000000 +0100 @@ -22,7 +22,7 @@ -export([expand/1, format_matches/1]). --import(lists, [reverse/1, nthtail/2, keysearch/3, prefix/2]). +-import(lists, [reverse/1, nthtail/2, prefix/2]). %% expand(CurrentBefore) -> %% {yes, Expansion, Matches} | {no, Matches} @@ -50,8 +50,8 @@ case erlang:module_loaded(Mod) of true -> L = Mod:module_info(), - case keysearch(exports, 1, L) of - {value, {_, Exports}} -> + case lists:keyfind(exports, 1, L) of + {_, Exports} -> match(FuncPrefix, Exports, "("); _ -> {no, [], []} @@ -63,7 +63,7 @@ match(Prefix, Alts, Extra) -> Len = length(Prefix), Matches = [{S, A} || {H, A} <- Alts, prefix(Prefix, S=atom_to_list(H))], - case longest_common_head([N || {N,_} <- Matches]) of + case longest_common_head([N || {N, _} <- Matches]) of {partial, []} -> {no, [], Matches}; % format_matches(Matches)}; {partial, Str} -> @@ -82,11 +82,10 @@ %% Return the list of names L in multiple columns. format_matches(L) -> S = format_col(lists:sort(L), []), - Res = ["\n" | S], - Res. + ["\n" | S]. format_col([], _) -> []; -format_col(L, Acc) -> format_col(L, field_width(L), 0, Acc). +format_col(L, Acc) -> format_col(L, field_width(L), 0, Acc). format_col(X, Width, Len, Acc) when Width + Len > 79 -> format_col(X, Width, 0, ["\n" | Acc]); @@ -99,7 +98,7 @@ {H1, _} -> H1; H2 -> H2 end, - Acc = [io_lib:format("~-*s",[Width,H]) | Acc0], + Acc = [io_lib:format("~-*s", [Width,H]) | Acc0], format_col(T, Width, Len+Width, Acc); format_col([], _, _, Acc) -> lists:reverse(Acc, "\n"). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/epp.erl erlang-13.b.3-dfsg/lib/stdlib/src/epp.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/epp.erl 2009-03-12 12:17:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/epp.erl 2009-11-20 13:29:29.000000000 +0000 @@ -24,22 +24,26 @@ -export([scan_erl_form/1,parse_erl_form/1,macro_defs/1]). -export([parse_file/1, parse_file/3]). -export([interpret_file_attribute/1]). --export([normalize_typed_record_fields/1]). +-export([normalize_typed_record_fields/1,restore_typed_record_fields/1]). + +%%------------------------------------------------------------------------ + +-type macros() :: [{atom(), term()}]. %% Epp state record. -record(epp, {file, %Current file - line = 1, %Current line number + location, %Current location name="", %Current file name istk=[], %Ifdef stack sstk=[], %State stack path=[], %Include-path - macs=dict:new(), %Macros - uses=dict:new(), %Macro use structure - pre_opened = false + macs = dict:new() :: dict(), %Macros (don't care locations) + uses = dict:new() :: dict(), %Macro use structure + pre_opened = false :: boolean() }). -%%% Note on representation: as tokens, both {var, Line, Name} and -%%% {atom, Line, Name} can occur as macro identifiers. However, keeping +%%% Note on representation: as tokens, both {var, Location, Name} and +%%% {atom, Location, Name} can occur as macro identifiers. However, keeping %%% this distinction here is done for historical reasons only: previously, %%% ?FOO and ?'FOO' were not the same, but now they are. Removing the %%% distinction in the internal representation would simplify the code @@ -47,7 +51,7 @@ %% open(FileName, IncludePath) %% open(FileName, IncludePath, PreDefMacros) -%% open(FileName, IoDevice, StartLine, IncludePath, PreDefMacros) +%% open(FileName, IoDevice, StartLocation, IncludePath, PreDefMacros) %% close(Epp) %% scan_erl_form(Epp) %% parse_erl_form(Epp) @@ -55,19 +59,27 @@ %% parse_file(FileName, IncludePath, PreDefMacros) %% macro_defs(Epp) +-spec open(file:name(), [file:name()]) -> + {'ok', pid()} | {'error', term()}. + open(Name, Path) -> open(Name, Path, []). +-spec open(file:name(), [file:name()], macros()) -> + {'ok', pid()} | {'error', term()}. + open(Name, Path, Pdm) -> Self = self(), Epp = spawn(fun() -> server(Self, Name, Path, Pdm) end), epp_request(Epp). -open(Name, File, StartLine, Path, Pdm) -> +open(Name, File, StartLocation, Path, Pdm) -> Self = self(), - Epp = spawn(fun() -> server(Self, Name, File, StartLine, Path, Pdm) end), + Epp = spawn(fun() -> server(Self, Name, File, StartLocation,Path,Pdm) end), epp_request(Epp). +-spec close(pid()) -> 'ok'. + close(Epp) -> %% Make sure that close is synchronous as a courtesy to test %% cases that test for resource leaks. @@ -154,8 +166,8 @@ end; {error,E} -> [{error,E}|parse_file(Epp)]; - {eof,Line} -> - [{eof,Line}] + {eof,Location} -> + [{eof,Location}] end. normalize_typed_record_fields(Fields) -> @@ -172,30 +184,48 @@ normalize_typed_record_fields([Field|Rest], NewFields, Typed) -> normalize_typed_record_fields(Rest, [Field|NewFields], Typed). +restore_typed_record_fields([]) -> + []; +restore_typed_record_fields([{attribute,La,record,{Record,_NewFields}}, + {attribute,La,type,{{record,Record},Fields,[]}}| + Forms]) -> + [{attribute,La,record,{Record,Fields}}| + restore_typed_record_fields(Forms)]; +restore_typed_record_fields([{attribute,La,type,{{record,Record},Fields,[]}}| + Forms]) -> + %% This clause is due to the compiler's 'E' option. + %% Record information kept by erl_expand_records. + [{attribute,La,record,{Record,Fields}}| + restore_typed_record_fields(Forms)]; +restore_typed_record_fields([Form|Forms]) -> + [Form|restore_typed_record_fields(Forms)]. + %% server(StarterPid, FileName, Path, PreDefMacros) server(Pid, Name, Path, Pdm) -> process_flag(trap_exit, true), case file:open(Name, [read]) of {ok,File} -> - init_server(Pid, Name, File, 1, Path, Pdm, false); + Location = 1, + init_server(Pid, Name, File, Location, Path, Pdm, false); {error,E} -> epp_reply(Pid, {error,E}) end. -%% server(StarterPid, FileName, IoDevice, Path, PreDefMacros) -server(Pid, Name, File, AtLine, Path, Pdm) -> +%% server(StarterPid, FileName, IoDevice, Location, Path, PreDefMacros) +server(Pid, Name, File, AtLocation, Path, Pdm) -> process_flag(trap_exit, true), - init_server(Pid, Name, File, AtLine, Path, Pdm, true). + init_server(Pid, Name, File, AtLocation, Path, Pdm, true). -init_server(Pid, Name, File, AtLine, Path, Pdm, Pre) -> +init_server(Pid, Name, File, AtLocation, Path, Pdm, Pre) -> Ms0 = predef_macros(Name), case user_predef(Pdm, Ms0) of {ok,Ms1} -> epp_reply(Pid, {ok,self()}), - St = #epp{file=File,line=AtLine,name=Name,path=Path,macs=Ms1, pre_opened = Pre}, + St = #epp{file=File, location=AtLocation, name=Name, + path=Path, macs=Ms1, pre_opened = Pre}, From = wait_request(St), - enter_file_reply(From, Name, AtLine, AtLine), + enter_file_reply(From, Name, AtLocation, AtLocation), wait_req_scan(St); {error,E} -> epp_reply(Pid, {error,E}) @@ -206,16 +236,17 @@ %% FILE, LINE, MODULE as undefined, MACHINE and MACHINE value. predef_macros(File) -> - Ms0 = dict:new(), - Ms1 = dict:store({atom,'FILE'}, {none,[{string,1,File}]}, Ms0), - Ms2 = dict:store({atom,'LINE'}, {none,[{integer,1,1}]}, Ms1), - Ms3 = dict:store({atom,'MODULE'}, undefined, Ms2), - Ms4 = dict:store({atom,'MODULE_STRING'}, undefined, Ms3), - Ms5 = dict:store({atom,'BASE_MODULE'}, undefined, Ms4), - Ms6 = dict:store({atom,'BASE_MODULE_STRING'}, undefined, Ms5), - Machine = list_to_atom(erlang:system_info(machine)), - Ms7 = dict:store({atom,'MACHINE'}, {none,[{atom,1,Machine}]}, Ms6), - dict:store({atom,Machine}, {none,[{atom,1,true}]}, Ms7). + Machine = list_to_atom(erlang:system_info(machine)), + dict:from_list([ + {{atom,'FILE'}, {none,[{string,1,File}]}}, + {{atom,'LINE'}, {none,[{integer,1,1}]}}, + {{atom,'MODULE'}, undefined}, + {{atom,'MODULE_STRING'}, undefined}, + {{atom,'BASE_MODULE'}, undefined}, + {{atom,'BASE_MODULE_STRING'}, undefined}, + {{atom,'MACHINE'}, {none,[{atom,1,Machine}]}}, + {{atom,Machine}, {none,[{atom,1,true}]}} + ]). %% user_predef(PreDefMacros, Macros) -> %% {ok,MacroDict} | {error,E} @@ -279,41 +310,46 @@ From = wait_request(St), skip_toks(From, St, Sis). -%% enter_file(Path, FileName, IncludeLine, From, EppState) +%% enter_file(Path, FileName, IncludeToken, From, EppState) %% leave_file(From, EppState) %% Handle entering and leaving included files. Notify caller when the %% current file is changed. Note it is an error to exit a file if we are %% in a conditional. These functions never return. -enter_file(_Path, _NewName, Li, From, St) +enter_file(_Path, _NewName, Inc, From, St) when length(St#epp.sstk) >= 8 -> - epp_reply(From, {error,{Li,epp,{depth,"include"}}}), + epp_reply(From, {error,{abs_loc(Inc),epp,{depth,"include"}}}), wait_req_scan(St); -enter_file(Path, NewName, Li, From, St) -> +enter_file(Path, NewName, Inc, From, St) -> case file:path_open(Path, NewName, [read]) of {ok,NewF,Pname} -> - wait_req_scan(enter_file2(NewF, Pname, From, St, 1)); + Loc = start_loc(St#epp.location), + wait_req_scan(enter_file2(NewF, Pname, From, St, Loc)); {error,_E} -> - epp_reply(From, {error,{Li,epp,{include,file,NewName}}}), + epp_reply(From, {error,{abs_loc(Inc),epp,{include,file,NewName}}}), wait_req_scan(St) end. -%% enter_file2(File, FullName, From, EppState, AtLine) -> EppState. +%% enter_file2(File, FullName, From, EppState, AtLocation) -> EppState. %% Set epp to use this file and "enter" it. -enter_file2(NewF, Pname, From, St, AtLine) -> - enter_file2(NewF, Pname, From, St, AtLine, []). +enter_file2(NewF, Pname, From, St, AtLocation) -> + enter_file2(NewF, Pname, From, St, AtLocation, []). -enter_file2(NewF, Pname, From, St, AtLine, ExtraPath) -> - enter_file_reply(From, Pname, 1, AtLine), - Ms = dict:store({atom,'FILE'}, {none,[{string,1,Pname}]}, St#epp.macs), +enter_file2(NewF, Pname, From, St, AtLocation, ExtraPath) -> + Loc = start_loc(AtLocation), + enter_file_reply(From, Pname, Loc, AtLocation), + Ms = dict:store({atom,'FILE'}, {none,[{string,Loc,Pname}]}, St#epp.macs), Path = St#epp.path ++ ExtraPath, - #epp{file=NewF,name=Pname,sstk=[St|St#epp.sstk],path=Path,macs=Ms}. + #epp{location=Loc,file=NewF, + name=Pname,sstk=[St|St#epp.sstk],path=Path,macs=Ms}. -enter_file_reply(From, Name, Line, AtLine) -> - Rep = {ok, [{'-',AtLine},{atom,AtLine,file},{'(',AtLine}, - {string,AtLine,file_name(Name)},{',',AtLine}, - {integer,AtLine,Line},{')',Line},{dot,AtLine}]}, +enter_file_reply(From, Name, Location, AtLocation) -> + Attr = loc_attr(AtLocation), + Rep = {ok, [{'-',Attr},{atom,Attr,file},{'(',Attr}, + {string,Attr,file_name(Name)},{',',Attr}, + {integer,Attr,get_line(Location)},{')',Location}, + {dot,Attr}]}, epp_reply(From, Rep). %% Flatten filename to a string. Must be a valid filename. @@ -331,21 +367,23 @@ case St#epp.istk of [I|Cis] -> epp_reply(From, - {error,{St#epp.line,epp, {illegal,"unterminated",I}}}), + {error,{St#epp.location,epp, + {illegal,"unterminated",I}}}), leave_file(wait_request(St),St#epp{istk=Cis}); [] -> case St#epp.sstk of [OldSt|Sts] -> close_file(St), enter_file_reply(From, OldSt#epp.name, - OldSt#epp.line, OldSt#epp.line), + OldSt#epp.location, OldSt#epp.location), Ms = dict:store({atom,'FILE'}, {none, - [{string,OldSt#epp.line,OldSt#epp.name}]}, + [{string,OldSt#epp.location, + OldSt#epp.name}]}, St#epp.macs), wait_req_scan(OldSt#epp{sstk=Sts,macs=Ms}); [] -> - epp_reply(From, {eof,St#epp.line}), + epp_reply(From, {eof,St#epp.location}), wait_req_scan(St) end end. @@ -354,43 +392,43 @@ %% scan_toks(Tokens, From, EppState) scan_toks(From, St) -> - case io:scan_erl_form(St#epp.file, '', St#epp.line) of + case io:scan_erl_form(St#epp.file, '', St#epp.location) of {ok,Toks,Cl} -> - scan_toks(Toks, From, St#epp{line=Cl}); + scan_toks(Toks, From, St#epp{location=Cl}); {error,E,Cl} -> epp_reply(From, {error,E}), - wait_req_scan(St#epp{line=Cl}); + wait_req_scan(St#epp{location=Cl}); {eof,Cl} -> - leave_file(From, St#epp{line=Cl}); + leave_file(From, St#epp{location=Cl}); {error,_E} -> - epp_reply(From, {error,{St#epp.line,epp,cannot_parse}}), + epp_reply(From, {error,{St#epp.location,epp,cannot_parse}}), leave_file(From, St) %This serious, just exit! end. -scan_toks([{'-',_Lh},{atom,Ld,define}|Toks], From, St) -> - scan_define(Toks, Ld, From, St); -scan_toks([{'-',_Lh},{atom,Ld,undef}|Toks], From, St) -> - scan_undef(Toks, Ld, From, St); -scan_toks([{'-',_Lh},{atom,Li,include}|Toks], From, St) -> - scan_include(Toks, abs(Li), From, St); -scan_toks([{'-',_Lh},{atom,Li,include_lib}|Toks], From, St) -> - scan_include_lib(Toks, abs(Li), From, St); -scan_toks([{'-',_Lh},{atom,Li,ifdef}|Toks], From, St) -> - scan_ifdef(Toks, Li, From, St); -scan_toks([{'-',_Lh},{atom,Li,ifndef}|Toks], From, St) -> - scan_ifndef(Toks, Li, From, St); -scan_toks([{'-',_Lh},{atom,Le,else}|Toks], From, St) -> - scan_else(Toks, Le, From, St); -scan_toks([{'-',_Lh},{atom,Le,'if'}|Toks], From, St) -> - scan_if(Toks, Le, From, St); -scan_toks([{'-',_Lh},{atom,Le,elif}|Toks], From, St) -> - scan_elif(Toks, Le, From, St); -scan_toks([{'-',_Lh},{atom,Le,endif}|Toks], From, St) -> - scan_endif(Toks, Le, From, St); -scan_toks([{'-',_Lh},{atom,Lf,file}|Toks0], From, St) -> +scan_toks([{'-',_Lh},{atom,_Ld,define}=Define|Toks], From, St) -> + scan_define(Toks, Define, From, St); +scan_toks([{'-',_Lh},{atom,_Ld,undef}=Undef|Toks], From, St) -> + scan_undef(Toks, Undef, From, St); +scan_toks([{'-',_Lh},{atom,_Li,include}=Inc|Toks], From, St) -> + scan_include(Toks, Inc, From, St); +scan_toks([{'-',_Lh},{atom,_Li,include_lib}=IncLib|Toks], From, St) -> + scan_include_lib(Toks, IncLib, From, St); +scan_toks([{'-',_Lh},{atom,_Li,ifdef}=IfDef|Toks], From, St) -> + scan_ifdef(Toks, IfDef, From, St); +scan_toks([{'-',_Lh},{atom,_Li,ifndef}=IfnDef|Toks], From, St) -> + scan_ifndef(Toks, IfnDef, From, St); +scan_toks([{'-',_Lh},{atom,_Le,'else'}=Else|Toks], From, St) -> + scan_else(Toks, Else, From, St); +scan_toks([{'-',_Lh},{'if',_Le}=If|Toks], From, St) -> + scan_if(Toks, If, From, St); +scan_toks([{'-',_Lh},{atom,_Le,elif}=Elif|Toks], From, St) -> + scan_elif(Toks, Elif, From, St); +scan_toks([{'-',_Lh},{atom,_Le,endif}=Endif|Toks], From, St) -> + scan_endif(Toks, Endif, From, St); +scan_toks([{'-',_Lh},{atom,_Lf,file}=FileToken|Toks0], From, St) -> case catch expand_macros(Toks0, {St#epp.macs, St#epp.uses}) of Toks1 when is_list(Toks1) -> - scan_file(Toks1, Lf, From, St); + scan_file(Toks1, FileToken, From, St); {error,ErrL,What} -> epp_reply(From, {error,{ErrL,epp,What}}), wait_req_scan(St) @@ -436,22 +474,22 @@ scan_extends(Ts, As, Ms); scan_extends(_Ts, _As, Ms) -> Ms. -%% scan_define(Tokens, DefineLine, From, EppState) +%% scan_define(Tokens, DefineToken, From, EppState) -scan_define([{'(',_Lp},{atom,Lm,M},{',',_Lc}|Toks], _Ld, From, St) -> +scan_define([{'(',_Lp},{atom,_Lm,M}=Mac,{',',_Lc}|Toks], _Def, From, St) -> case dict:find({atom,M}, St#epp.macs) of - {ok,_Def} -> - epp_reply(From, {error,{Lm,epp,{redefine,M}}}), + {ok,_OldDef} -> + epp_reply(From, {error,{loc(Mac),epp,{redefine,M}}}), wait_req_scan(St); error -> scan_define_cont(From, St, {atom, M}, {none,macro_expansion(Toks)}) end; -scan_define([{'(',_Lp},{atom,Lm,M},{'(',_Lc}|Toks], Ld, From, St) -> +scan_define([{'(',_Lp},{atom,_Lm,M}=Mac,{'(',_Lc}|Toks], Def, From, St) -> case dict:find({atom,M}, St#epp.macs) of {ok,_Def} -> - epp_reply(From, {error,{Lm,epp,{redefine,M}}}), + epp_reply(From, {error,{loc(Mac),epp,{redefine,M}}}), wait_req_scan(St); error -> case catch macro_pars(Toks, []) of @@ -460,24 +498,24 @@ {atom, M}, {As, Me}); _ -> - epp_reply(From, {error,{Ld,epp,{bad,define}}}), + epp_reply(From, {error,{loc(Def),epp,{bad,define}}}), wait_req_scan(St) end end; -scan_define([{'(',_Lp},{var,Lm,M},{',',_Lc}|Toks], _Ld, From, St) -> +scan_define([{'(',_Lp},{var,_Lm,M}=Mac,{',',_Lc}|Toks], _Def, From, St) -> case dict:find({atom,M}, St#epp.macs) of - {ok,_Def} -> - epp_reply(From, {error,{Lm,epp,{redefine,M}}}), + {ok,_OldDef} -> + epp_reply(From, {error,{loc(Mac),epp,{redefine,M}}}), wait_req_scan(St); error -> scan_define_cont(From, St, {atom, M}, {none,macro_expansion(Toks)}) end; -scan_define([{'(',_Lp},{var,Lm,M},{'(',_Lc}|Toks], Ld, From, St) -> +scan_define([{'(',_Lp},{var,_Lm,M}=Mac,{'(',_Lc}|Toks], Def, From, St) -> case dict:find({atom,M}, St#epp.macs) of {ok,_Def} -> - epp_reply(From, {error,{Lm,epp,{redefine,M}}}), + epp_reply(From, {error,{loc(Mac),epp,{redefine,M}}}), wait_req_scan(St); error -> case catch macro_pars(Toks, []) of @@ -486,12 +524,12 @@ {atom, M}, {As, Me}); _ -> - epp_reply(From, {error,{Ld,epp,{bad,define}}}), + epp_reply(From, {error,{loc(Def),epp,{bad,define}}}), wait_req_scan(St) end end; -scan_define(_Toks, Ld, From, St) -> - epp_reply(From, {error,{Ld,epp,{bad,define}}}), +scan_define(_Toks, Def, From, St) -> + epp_reply(From, {error,{loc(Def),epp,{bad,define}}}), wait_req_scan(St). %%% Detection of circular macro expansions (which would either keep @@ -535,29 +573,29 @@ add_macro_uses([{Key, Def} | Rest], D0) -> add_macro_uses(Rest, dict:store(Key, macro_uses(Def), D0)). -%% scan_undef(Tokens, UndefLine, From, EppState) +%% scan_undef(Tokens, UndefToken, From, EppState) -scan_undef([{'(',_Llp},{atom,_Lm,M},{')',_Lrp},{dot,_Ld}], _Lu, From, St) -> +scan_undef([{'(',_Llp},{atom,_Lm,M},{')',_Lrp},{dot,_Ld}], _Undef, From, St) -> scan_toks(From, St#epp{macs=dict:erase({atom,M}, St#epp.macs), uses=all_macro_uses(St#epp.macs)}); -scan_undef([{'(',_Llp},{var,_Lm,M},{')',_Lrp},{dot,_Ld}], _Lu, From,St) -> +scan_undef([{'(',_Llp},{var,_Lm,M},{')',_Lrp},{dot,_Ld}], _Undef, From,St) -> scan_toks(From, St#epp{macs=dict:erase({atom,M}, St#epp.macs), uses=all_macro_uses(St#epp.macs)}); -scan_undef(_Toks, Lu, From,St) -> - epp_reply(From, {error,{Lu,epp,{bad,undef}}}), +scan_undef(_Toks, Undef, From, St) -> + epp_reply(From, {error,{loc(Undef),epp,{bad,undef}}}), wait_req_scan(St). -%% scan_include(Tokens, IncludeLine, From, St) +%% scan_include(Tokens, IncludeToken, From, St) -scan_include([{'(',_Llp},{string,_Lf,NewName0},{')',_Lrp},{dot,_Ld}], Li, +scan_include([{'(',_Llp},{string,_Lf,NewName0},{')',_Lrp},{dot,_Ld}], Inc, From, St) -> NewName = expand_var(NewName0), - enter_file(St#epp.path, NewName, Li, From, St); -scan_include(_Toks, Li, From, St) -> - epp_reply(From, {error,{Li,epp,{bad,include}}}), + enter_file(St#epp.path, NewName, Inc, From, St); +scan_include(_Toks, Inc, From, St) -> + epp_reply(From, {error,{abs_loc(Inc),epp,{bad,include}}}), wait_req_scan(St). -%% scan_include_lib(Tokens, IncludeLine, From, EppState) +%% scan_include_lib(Tokens, IncludeToken, From, EppState) %% For include_lib we first test if we can find the file through the %% normal search path, if not we assume that the first directory name %% is a library name, find its true directory and try with that. @@ -566,17 +604,18 @@ [Lib | Rest] = filename:split(NewName), {code:lib_dir(list_to_atom(Lib)), Rest}. -scan_include_lib([{'(',_Llp},{string,_Lf,_NewName0},{')',_Lrp},{dot,_Ld}], Li, - From, St) +scan_include_lib([{'(',_Llp},{string,_Lf,_NewName0},{')',_Lrp},{dot,_Ld}], + Inc, From, St) when length(St#epp.sstk) >= 8 -> - epp_reply(From, {error,{Li,epp,{depth,"include_lib"}}}), + epp_reply(From, {error,{abs_loc(Inc),epp,{depth,"include_lib"}}}), wait_req_scan(St); -scan_include_lib([{'(',_Llp},{string,_Lf,NewName0},{')',_Lrp},{dot,_Ld}], Li, - From, St) -> +scan_include_lib([{'(',_Llp},{string,_Lf,NewName0},{')',_Lrp},{dot,_Ld}], + Inc, From, St) -> NewName = expand_var(NewName0), + Loc = start_loc(St#epp.location), case file:path_open(St#epp.path, NewName, [read]) of {ok,NewF,Pname} -> - wait_req_scan(enter_file2(NewF, Pname, From, St, 1)); + wait_req_scan(enter_file2(NewF, Pname, From, St, Loc)); {error,_E1} -> case catch find_lib_dir(NewName) of {LibDir, Rest} when is_list(LibDir) -> @@ -585,160 +624,172 @@ {ok,NewF} -> ExtraPath = [filename:dirname(LibName)], wait_req_scan(enter_file2(NewF, LibName, From, - St, 1, ExtraPath)); + St, Loc, ExtraPath)); {error,_E2} -> epp_reply(From, - {error,{Li,epp,{include,lib,NewName}}}), + {error,{abs_loc(Inc),epp, + {include,lib,NewName}}}), wait_req_scan(St) end; _Error -> - epp_reply(From, {error,{Li,epp,{include,lib,NewName}}}), + epp_reply(From, {error,{abs_loc(Inc),epp, + {include,lib,NewName}}}), wait_req_scan(St) end end; -scan_include_lib(_Toks, Li, From, St) -> - epp_reply(From, {error,{Li,epp,{bad,include_lib}}}), +scan_include_lib(_Toks, Inc, From, St) -> + epp_reply(From, {error,{abs_loc(Inc),epp,{bad,include_lib}}}), wait_req_scan(St). -%% scan_ifdef(Tokens, IfdefLine, From, EppState) -%% scan_ifndef(Tokens, IfdefLine, From, EppSate) +%% scan_ifdef(Tokens, IfdefToken, From, EppState) +%% scan_ifndef(Tokens, IfdefToken, From, EppSate) %% Handle the conditional parsing of a file. %% Report a badly formed if[n]def test and then treat as undefined macro. -scan_ifdef([{'(',_Llp},{atom,_Lm,M},{')',_Lrp},{dot,_Ld}], _Li, From, St) -> +scan_ifdef([{'(',_Llp},{atom,_Lm,M},{')',_Lrp},{dot,_Ld}], _IfD, From, St) -> case dict:find({atom,M}, St#epp.macs) of {ok,_Def} -> scan_toks(From, St#epp{istk=[ifdef|St#epp.istk]}); error -> skip_toks(From, St, [ifdef]) end; -scan_ifdef([{'(',_Llp},{var,_Lm,M},{')',_Lrp},{dot,_Ld}], _Li, From, St) -> +scan_ifdef([{'(',_Llp},{var,_Lm,M},{')',_Lrp},{dot,_Ld}], _IfD, From, St) -> case dict:find({atom,M}, St#epp.macs) of {ok,_Def} -> scan_toks(From, St#epp{istk=[ifdef|St#epp.istk]}); error -> skip_toks(From, St, [ifdef]) end; -scan_ifdef(_Toks, Li, From, St) -> - epp_reply(From, {error,{Li,epp,{bad,ifdef}}}), +scan_ifdef(_Toks, IfDef, From, St) -> + epp_reply(From, {error,{loc(IfDef),epp,{bad,ifdef}}}), wait_req_skip(St, [ifdef]). -scan_ifndef([{'(',_Llp},{atom,_Lm,M},{')',_Lrp},{dot,_Ld}], _Li, From, St) -> +scan_ifndef([{'(',_Llp},{atom,_Lm,M},{')',_Lrp},{dot,_Ld}], _IfnD, From, St) -> case dict:find({atom,M}, St#epp.macs) of {ok,_Def} -> skip_toks(From, St, [ifndef]); error -> scan_toks(From, St#epp{istk=[ifndef|St#epp.istk]}) end; -scan_ifndef([{'(',_Llp},{var,_Lm,M},{')',_Lrp},{dot,_Ld}], _Li, From, St) -> +scan_ifndef([{'(',_Llp},{var,_Lm,M},{')',_Lrp},{dot,_Ld}], _IfnD, From, St) -> case dict:find({atom,M}, St#epp.macs) of {ok,_Def} -> skip_toks(From, St, [ifndef]); error -> scan_toks(From, St#epp{istk=[ifndef|St#epp.istk]}) end; -scan_ifndef(_Toks, Li, From, St) -> - epp_reply(From, {error,{Li,epp,{bad,ifndef}}}), - wait_req_scan(St). +scan_ifndef(_Toks, IfnDef, From, St) -> + epp_reply(From, {error,{loc(IfnDef),epp,{bad,ifndef}}}), + wait_req_skip(St, [ifndef]). -%% scan_else(Tokens, ElseLine, From, EppState) +%% scan_else(Tokens, ElseToken, From, EppState) %% If we are in an if body then convert to else and skip, if we are in an %% else or not in anything report an error. -scan_else([{dot,_Ld}], Le, From, St) -> +scan_else([{dot,_Ld}], Else, From, St) -> case St#epp.istk of - [else|Cis] -> - epp_reply(From, {error,{Le,epp,{illegal,"repeated",else}}}), - wait_req_skip(St#epp{istk=Cis}, [else]); + ['else'|Cis] -> + epp_reply(From, {error,{loc(Else), + epp,{illegal,"repeated",'else'}}}), + wait_req_skip(St#epp{istk=Cis}, ['else']); [_I|Cis] -> - skip_toks(From, St#epp{istk=Cis}, [else]); + skip_toks(From, St#epp{istk=Cis}, ['else']); [] -> - epp_reply(From, {error,{Le,epp,{illegal,"unbalanced",else}}}), + epp_reply(From, {error,{loc(Else),epp, + {illegal,"unbalanced",'else'}}}), wait_req_scan(St) end; -scan_else(_Toks, Le, From, St) -> - epp_reply(From, {error,{Le,epp,{bad,else}}}), +scan_else(_Toks, Else, From, St) -> + epp_reply(From, {error,{loc(Else),epp,{bad,'else'}}}), wait_req_scan(St). -%% scan_if(Tokens, EndifLine, From, EppState) +%% scan_if(Tokens, EndifToken, From, EppState) %% Handle the conditional parsing of a file. %% Report a badly formed if test and then treat as false macro. -scan_if(_Toks, Le, From, St) -> - epp_reply(From, {error,{Le,epp,{'NYI','if'}}}), +scan_if(_Toks, If, From, St) -> + epp_reply(From, {error,{loc(If),epp,{'NYI','if'}}}), wait_req_skip(St, ['if']). -%% scan_elif(Tokens, EndifLine, From, EppState) +%% scan_elif(Tokens, EndifToken, From, EppState) %% Handle the conditional parsing of a file. %% Report a badly formed if test and then treat as false macro. -scan_elif(_Toks, Le, From, St) -> - epp_reply(From, {error,{Le,epp,{'NYI','elif'}}}), - wait_req_skip(St, ['elif']). +scan_elif(_Toks, Elif, From, St) -> + epp_reply(From, {error,{loc(Elif),epp,{'NYI','elif'}}}), + wait_req_scan(St). -%% scan_endif(Tokens, EndifLine, From, EppState) +%% scan_endif(Tokens, EndifToken, From, EppState) %% If we are in an if body then exit it, else report an error. -scan_endif([{dot,_Ld}], Le, From, St) -> +scan_endif([{dot,_Ld}], Endif, From, St) -> case St#epp.istk of [_I|Cis] -> scan_toks(From, St#epp{istk=Cis}); [] -> - epp_reply(From, {error,{Le,epp,{illegal,"unbalanced",endif}}}), + epp_reply(From, {error,{loc(Endif),epp, + {illegal,"unbalanced",endif}}}), wait_req_scan(St) end; -scan_endif(_Toks, Le, From, St) -> - epp_reply(From, {error,{Le,epp,{bad,endif}}}), +scan_endif(_Toks, Endif, From, St) -> + epp_reply(From, {error,{loc(Endif),epp,{bad,endif}}}), wait_req_scan(St). -%% scan_file(Tokens, FileLine, From, EppState) +%% scan_file(Tokens, FileToken, From, EppState) %% Set the current file and line to the given file and line. %% Note that the line of the attribute itself is kept. scan_file([{'(',_Llp},{string,_Ls,Name},{',',_Lc},{integer,_Li,Ln},{')',_Lrp}, - {dot,_Ld}], Lf, From, St) -> - enter_file_reply(From, Name, Ln, -abs(Lf)), + {dot,_Ld}], Tf, From, St) -> + enter_file_reply(From, Name, Ln, neg_line(abs_loc(Tf))), Ms = dict:store({atom,'FILE'}, {none,[{string,1,Name}]}, St#epp.macs), - scan_toks(From, St#epp{name=Name,line=Ln+(St#epp.line-Lf),macs=Ms}); -scan_file(_Toks, Lf, From, St) -> - epp_reply(From, {error,{Lf,epp,{bad,file}}}), + Locf = loc(Tf), + NewLoc = new_location(Ln, St#epp.location, Locf), + scan_toks(From, St#epp{name=Name,location=NewLoc,macs=Ms}); +scan_file(_Toks, Tf, From, St) -> + epp_reply(From, {error,{loc(Tf),epp,{bad,file}}}), wait_req_scan(St). +new_location(Ln, Le, Lf) when is_integer(Lf) -> + Ln+(Le-Lf); +new_location(Ln, {Le,_}, {Lf,_}) -> + {Ln+(Le-Lf),1}. + %% skip_toks(From, EppState, SkipIstack) %% Skip over forms until current conditional has been exited. Handle %% nested conditionals and repeated 'else's. skip_toks(From, St, [I|Sis]) -> - case io:scan_erl_form(St#epp.file, '', St#epp.line) of + case io:scan_erl_form(St#epp.file, '', St#epp.location) of {ok,[{'-',_Lh},{atom,_Li,ifdef}|_Toks],Cl} -> - skip_toks(From, St#epp{line=Cl}, [ifdef,I|Sis]); + skip_toks(From, St#epp{location=Cl}, [ifdef,I|Sis]); {ok,[{'-',_Lh},{atom,_Li,ifndef}|_Toks],Cl} -> - skip_toks(From, St#epp{line=Cl}, [ifndef,I|Sis]); - {ok,[{'-',_Lh},{atom,_Li,'if'}|_Toks],Cl} -> - skip_toks(From, St#epp{line=Cl}, ['if',I|Sis]); - {ok,[{'-',_Lh},{atom,Le,else}|_Toks],Cl}-> - skip_else(Le, From, St#epp{line=Cl}, [I|Sis]); + skip_toks(From, St#epp{location=Cl}, [ifndef,I|Sis]); + {ok,[{'-',_Lh},{'if',_Li}|_Toks],Cl} -> + skip_toks(From, St#epp{location=Cl}, ['if',I|Sis]); + {ok,[{'-',_Lh},{atom,_Le,'else'}=Else|_Toks],Cl}-> + skip_else(Else, From, St#epp{location=Cl}, [I|Sis]); {ok,[{'-',_Lh},{atom,_Le,endif}|_Toks],Cl} -> - skip_toks(From, St#epp{line=Cl}, Sis); + skip_toks(From, St#epp{location=Cl}, Sis); {ok,_Toks,Cl} -> - skip_toks(From, St#epp{line=Cl}, [I|Sis]); + skip_toks(From, St#epp{location=Cl}, [I|Sis]); {error,_E,Cl} -> - skip_toks(From, St#epp{line=Cl}, [I|Sis]); + skip_toks(From, St#epp{location=Cl}, [I|Sis]); {eof,Cl} -> - leave_file(From, St#epp{line=Cl,istk=[I|Sis]}); + leave_file(From, St#epp{location=Cl,istk=[I|Sis]}); {error,_E} -> - epp_reply(From, {error,{St#epp.line,epp,cannot_parse}}), + epp_reply(From, {error,{St#epp.location,epp,cannot_parse}}), leave_file(From, St) %This serious, just exit! end; skip_toks(From, St, []) -> scan_toks(From, St). -skip_else(Le, From, St, [else|Sis]) -> - epp_reply(From, {error,{Le,epp,{illegal,"repeated",else}}}), - wait_req_skip(St, [else|Sis]); -skip_else(_Le, From, St, [_I]) -> - scan_toks (From, St#epp{istk=[else|St#epp.istk]}); -skip_else(_Le, From, St, Sis) -> +skip_else(Else, From, St, ['else'|Sis]) -> + epp_reply(From, {error,{loc(Else),epp,{illegal,"repeated",'else'}}}), + wait_req_skip(St, ['else'|Sis]); +skip_else(_Else, From, St, [_I]) -> + scan_toks(From, St#epp{istk=['else'|St#epp.istk]}); +skip_else(_Else, From, St, Sis) -> skip_toks(From, St, Sis). %% macro_pars(Tokens, ArgStack) @@ -760,21 +811,23 @@ [T|macro_expansion(Ts)]. %% expand_macros(Tokens, Macros) -%% expand_macro(Tokens, MacroLine, RestTokens) +%% expand_macro(Tokens, MacroToken, RestTokens) %% Expand the macros in a list of tokens, making sure that an expansion -%% gets the same line number as the macro call. +%% gets the same location as the macro call. -expand_macros(Type, Lm, M, Toks, Ms0) -> +expand_macros(Type, MacT, M, Toks, Ms0) -> %% (Type will always be 'atom') {Ms, U} = Ms0, + Lm = loc(MacT), check_uses([{Type,M}], [], U, Lm), + Tinfo = element(2, MacT), case dict:find({Type,M}, Ms) of {ok,{none,Exp}} -> - expand_macros(expand_macro(Exp, Lm, Toks, dict:new()), Ms0); + expand_macros(expand_macro(Exp, Tinfo, Toks, dict:new()), Ms0); {ok,{As,Exp}} -> {Bs,Toks1} = bind_args(Toks, Lm, M, As, dict:new()), %%io:format("Bound arguments to macro ~w (~w)~n", [M,Bs]), - expand_macros(expand_macro(Exp, Lm, Toks1, Bs), Ms0); + expand_macros(expand_macro(Exp, Tinfo, Toks1, Bs), Ms0); {ok,undefined} -> throw({error,Lm,{undefined,M}}); error -> @@ -805,31 +858,37 @@ end. %% Macro expansion -expand_macros([{'?',_Lq},{atom,Lm,M}|Toks], Ms) -> - expand_macros(atom, Lm, M, Toks, Ms); +%% Note: io:scan_erl_form() does not return comments or white spaces. +expand_macros([{'?',_Lq},{atom,_Lm,M}=MacT|Toks], Ms) -> + expand_macros(atom, MacT, M, Toks, Ms); %% Special macros -expand_macros([{'?',_Lq},{var,Lm,'LINE'}|Toks], Ms) -> - [{integer,Lm,Lm}|expand_macros(Toks, Ms)]; -expand_macros([{'?',_Lq},{var,Lm,M}|Toks], Ms) -> - expand_macros(atom, Lm, M, Toks, Ms); +expand_macros([{'?',_Lq},{var,Lm,'LINE'}=Tok|Toks], Ms) -> + {line,Line} = erl_scan:token_info(Tok, line), + [{integer,Lm,Line}|expand_macros(Toks, Ms)]; +expand_macros([{'?',_Lq},{var,_Lm,M}=MacT|Toks], Ms) -> + expand_macros(atom, MacT, M, Toks, Ms); %% Illegal macros -expand_macros([{'?',_Lq},{Type,Lt}|_Toks], _Ms) -> - throw({error,Lt,{call,[$?|atom_to_list(Type)]}}); -expand_macros([{'?',_Lq},{_Type,Lt,What}|_Toks], _Ms) -> - throw({error,Lt,{call,[$?|io_lib:write(What)]}}); - +expand_macros([{'?',_Lq},Token|_Toks], _Ms) -> + T = case erl_scan:token_info(Token, text) of + {text,Text} -> + Text; + undefined -> + {symbol,Symbol} = erl_scan:token_info(Token, symbol), + io_lib:write(Symbol) + end, + throw({error,loc(Token),{call,[$?|T]}}); expand_macros([T|Ts], Ms) -> [T|expand_macros(Ts, Ms)]; expand_macros([], _Ms) -> []. -%% bind_args(Tokens, MacroLine, MacroName, ArgumentVars, Bindings) +%% bind_args(Tokens, MacroLocation, MacroName, ArgumentVars, Bindings) %% Collect the arguments to a macro call and check for correct number. bind_args([{'(',_Llp},{')',_Lrp}|Toks], _Lm, _M, [], Bs) -> {Bs,Toks}; bind_args([{'(',_Llp}|Toks0], Lm, M, [A|As], Bs) -> {Arg,Toks1} = macro_arg(Toks0, [], []), - macro_args(Toks1, Lm, M, As, dict:store(A, Arg, Bs)); + macro_args(Toks1, Lm, M, As, store_arg(Lm, M, A, Arg, Bs)); bind_args(_Toks, Lm, M, _As, _Bs) -> throw({error,Lm,{mismatch,M}}). @@ -837,12 +896,17 @@ {Bs,Toks}; macro_args([{',',_Lc}|Toks0], Lm, M, [A|As], Bs) -> {Arg,Toks1} = macro_arg(Toks0, [], []), - macro_args(Toks1, Lm, M, As, dict:store(A, Arg, Bs)); + macro_args(Toks1, Lm, M, As, store_arg(Lm, M, A, Arg, Bs)); macro_args([], Lm, M, _As, _Bs) -> throw({error,Lm,{arg_error,M}}); macro_args(_Toks, Lm, M, _As, _Bs) -> throw({error,Lm,{mismatch,M}}). +store_arg(L, M, _A, [], _Bs) -> + throw({error,L,{mismatch,M}}); +store_arg(_L, _M, A, Arg, Bs) -> + dict:store(A, Arg, Bs). + %% macro_arg([Tok], [ClosePar], [ArgTok]) -> {[ArgTok],[RestTok]}. %% Collect argument tokens until we hit a ',' or a ')'. We know a %% enough about syntax to recognise "open parentheses" and keep @@ -866,12 +930,16 @@ macro_arg(Toks, ['end'|E], [{'if',Li}|Arg]); macro_arg([{'case',Lc}|Toks], E, Arg) -> macro_arg(Toks, ['end'|E], [{'case',Lc}|Arg]); +macro_arg([{'fun',Lc}|[{'(',_}|_]=Toks], E, Arg) -> + macro_arg(Toks, ['end'|E], [{'fun',Lc}|Arg]); macro_arg([{'receive',Lr}|Toks], E, Arg) -> macro_arg(Toks, ['end'|E], [{'receive',Lr}|Arg]); macro_arg([{'try',Lr}|Toks], E, Arg) -> macro_arg(Toks, ['end'|E], [{'try',Lr}|Arg]); macro_arg([{'cond',Lr}|Toks], E, Arg) -> macro_arg(Toks, ['end'|E], [{'cond',Lr}|Arg]); +macro_arg([{'query',Lr}|Toks], E, Arg) -> + macro_arg(Toks, ['end'|E], [{'query',Lr}|Arg]); macro_arg([{Rb,Lrb}|Toks], [Rb|E], Arg) -> %Found matching close macro_arg(Toks, E, [{Rb,Lrb}|Arg]); macro_arg([T|Toks], E, Arg) -> @@ -879,10 +947,10 @@ macro_arg([], _E, Arg) -> {lists:reverse(Arg),[]}. -%% expand_macro(MacroDef, MacroLine, RestTokens, Bindings) -%% expand_arg(Argtokens, MacroTokens, MacroLine, RestTokens, Bindings) +%% expand_macro(MacroDef, MacroTokenInfo, RestTokens, Bindings) +%% expand_arg(Argtokens, MacroTokens, MacroLocation, RestTokens, Bindings) %% Insert the macro expansion replacing macro parameters with their -%% argument values, inserting the line number of first the macro call +%% argument values, inserting the location of first the macro call %% and then the macro arguments, i.e. simulate textual expansion. expand_macro([{var,_Lv,V}|Ts], L, Rest, Bs) -> @@ -906,24 +974,24 @@ expand_macro([], _L, Rest, _Bs) -> Rest. expand_arg([A|As], Ts, _L, Rest, Bs) -> - [A|expand_arg(As, Ts, element(2, A), Rest, Bs)]; + %% It is not obvious that the location of arguments should replace L. + NextL = element(2, A), + [A|expand_arg(As, Ts, NextL, Rest, Bs)]; expand_arg([], Ts, L, Rest, Bs) -> expand_macro(Ts, L, Rest, Bs). %%% stringify(Ts, L) returns a list of one token: a string which when %%% tokenized would yield the token list Ts. -%tst(Str) -> -% {ok, T, _} = erl_scan:string(Str), -% [{string, _, S}] = stringify(T, 1), -% S. - +%% erl_scan:token_info(T, text) is not backward compatible with this. token_src({dot, _}) -> "."; token_src({X, _}) when is_atom(X) -> atom_to_list(X); token_src({var, _, X}) -> atom_to_list(X); +token_src({char,_,C}) -> + io_lib:write_char(C); token_src({string, _, X}) -> lists:flatten(io_lib:format("~p", [X])); token_src({_, _, X}) -> @@ -982,6 +1050,35 @@ true = Value =/= false, {ok, filename:join([Value | Rest])}. +%% The line only. (Other tokens may have the column and text as well...) +loc_attr(Line) when is_integer(Line) -> + Line; +loc_attr({Line,_Column}) -> + Line. + +loc(Token) -> + {location,Location} = erl_scan:token_info(Token, location), + Location. + +abs_loc(Token) -> + loc(setelement(2, Token, abs_line(element(2, Token)))). + +neg_line(L) -> + erl_scan:set_attribute(line, L, fun(Line) -> -abs(Line) end). + +abs_line(L) -> + erl_scan:set_attribute(line, L, fun(Line) -> abs(Line) end). + +start_loc(Line) when is_integer(Line) -> + 1; +start_loc({_Line, _Column}) -> + {1,1}. + +get_line(Line) when is_integer(Line) -> + Line; +get_line({Line,_Column}) -> + Line. + %% epp has always output -file attributes when entering and leaving %% included files (-include, -include_lib). Starting with R11B the %% -file attribute is also recognized in the input file. This is @@ -1012,27 +1109,37 @@ %% It turns out to be difficult to distinguish -file attributes in the %% input file from the ones added by epp unless some action is taken. %% The (less than perfect) solution employed is to let epp assign -%% negative line number to user supplied -file attributes. +%% negative line numbers to user supplied -file attributes. + +%% Note: it is assumed that the second element is a line or a key-list +%% where 'line' can be found. interpret_file_attribute(Forms) -> interpret_file_attr(Forms, 0, []). -interpret_file_attr([{attribute,L,file,{_File,Line}} | Forms], - Delta, Fs) when L < 0 -> - %% -file attribute - interpret_file_attr(Forms, (abs(L) + Delta) - Line, Fs); -interpret_file_attr([{attribute,_AL,file,{File,_Line}}=Form | Forms], +interpret_file_attr([{attribute,Loc,file,{File,Line}}=Form | Forms], Delta, Fs) -> - %% -include or -include_lib - % true = _AL =:= _Line, - case Fs of - [_, Delta1, File | Fs1] -> % end of included file - [Form | interpret_file_attr(Forms, Delta1, [File | Fs1])]; - _ -> % start of included file - [Form | interpret_file_attr(Forms, 0, [File, Delta | Fs])] + {line, L} = erl_scan:attributes_info(Loc, line), + if + L < 0 -> + %% -file attribute + interpret_file_attr(Forms, (abs(L) + Delta) - Line, Fs); + true -> + %% -include or -include_lib + % true = L =:= Line, + case Fs of + [_, Delta1, File | Fs1] -> % end of included file + [Form | interpret_file_attr(Forms, Delta1, [File | Fs1])]; + _ -> % start of included file + [Form | interpret_file_attr(Forms, 0, [File, Delta | Fs])] + end end; interpret_file_attr([Form0 | Forms], Delta, Fs) -> - Form = erl_lint:modify_line(Form0, fun(L) -> abs(L) + Delta end), + F = fun(Attrs) -> + F2 = fun(L) -> abs(L) + Delta end, + erl_scan:set_attribute(line, Attrs, F2) + end, + Form = erl_lint:modify_line(Form0, F), [Form | interpret_file_attr(Forms, Delta, Fs)]; interpret_file_attr([], _Delta, _Fs) -> []. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/erl_bits.erl erlang-13.b.3-dfsg/lib/stdlib/src/erl_bits.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/erl_bits.erl 2009-03-12 12:19:49.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/erl_bits.erl 2009-11-20 13:30:59.000000000 +0000 @@ -19,19 +19,21 @@ -module(erl_bits). --include("../include/erl_bits.hrl"). - -export([system_bittypes/0, system_bitdefault/0, set_bit_type/2, as_list/1]). +-include("../include/erl_bits.hrl"). + %% Dummies. -spec system_bitdefault() -> 'no_system_bitdefault'. + system_bitdefault() -> no_system_bitdefault. -spec system_bittypes() -> 'no_system_types'. + system_bittypes() -> no_system_types. -spec as_list(#bittype{}) -> @@ -40,10 +42,17 @@ as_list(Bt) -> [Bt#bittype.type,{unit,Bt#bittype.unit},Bt#bittype.sign,Bt#bittype.endian]. -%% set_bit_type(Size, 'default' | TypeList) -> -%% {'ok', Size, #bittype{}} | -%% {'error', {'undefined_bittype', term()}} | -%% {'error', {'bittype_mismatch', term(), term(), string()}}. +%% XXX: tuple() below stands for what's produced by the parser +%% {integer,L,M} | {var,L,VAR} | {atom,L,ATOM} | {op,L,OP,OP1,OP2} | ... +-type size() :: 'all' | 'unknown' | non_neg_integer() | tuple(). % XXX: REFINE +-type type() :: 'bytes' | 'bitstring' | 'bits' + | bt_type() | bt_endian() | bt_sign() + | {'unit', 'undefined' | bt_unit()}. + +-spec set_bit_type('default' | size(), 'default' | [type()]) -> + {'ok', 'undefined' | size(), #bittype{}} | + {'error', {'undefined_bittype', term()}} | + {'error', {'bittype_mismatch', term(), term(), string()}}. set_bit_type(Size, default) -> set_bit_type(Size, []); @@ -120,7 +129,7 @@ apply_defaults(integer, Size, Unit, Sign, Endian); apply_defaults(binary, default, Unit, Sign, Endian) -> %default size - %check_unit(Unit), removed to allow bitlevel binaries + %% check_unit(Unit), removed to allow bitlevel binaries apply_defaults(binary, all, Unit, Sign, Endian); apply_defaults(integer, default, Unit, Sign, Endian) -> check_unit(Unit), diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/erl_compile.erl erlang-13.b.3-dfsg/lib/stdlib/src/erl_compile.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/erl_compile.erl 2009-03-12 12:18:56.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/erl_compile.erl 2009-11-20 13:30:10.000000000 +0000 @@ -31,6 +31,7 @@ compiler(".core") -> {compile, compile_core}; compiler(".mib") -> {snmpc, compile}; compiler(".bin") -> {snmpc, mib_to_hrl}; +compiler(".xrl") -> {leex, compile}; compiler(".yrl") -> {yecc, compile}; compiler(".script") -> {systools, script2boot}; compiler(".rel") -> {systools, compile_rel}; @@ -43,6 +44,10 @@ %% Entry from command line. +-type cmd_line_arg() :: atom() | string(). + +-spec compile_cmdline([cmd_line_arg()]) -> no_return(). + compile_cmdline(List) -> case compile(List) of ok -> my_halt(0); @@ -76,13 +81,13 @@ error end. --spec compiler_runner([_]) -> no_return(). +-spec compiler_runner([cmd_line_arg()]) -> no_return(). compiler_runner(List) -> %% We don't want the current directory in the code path. %% Remove it. Path = [D || D <- code:get_path(), D =/= "."], - code:set_path(Path), + true = code:set_path(Path), exit({compiler_result, compile1(List)}). %% Parses the first part of the option list. @@ -90,8 +95,10 @@ compile1(['@cwd', Cwd|Rest]) -> CwdL = atom_to_list(Cwd), compile1(Rest, CwdL, #options{outdir=CwdL, cwd=CwdL}); -compile1(Other) -> - throw({error, {bad_input, Other}}). +compile1(Args) -> + %% From R13B02, the @cwd argument is optional. + {ok, Cwd} = file:get_cwd(), + compile1(Args, Cwd, #options{outdir=Cwd, cwd=Cwd}). %% Parses all options. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/erl_eval.erl erlang-13.b.3-dfsg/lib/stdlib/src/erl_eval.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/erl_eval.erl 2009-06-05 13:52:54.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/erl_eval.erl 2009-09-18 15:06:58.000000000 +0100 @@ -316,12 +316,8 @@ eval_op(Op, L, R, merge_bindings(Bs1, Bs2), Ef, RBs); expr({bin,_,Fs}, Bs0, Lf, Ef, RBs) -> EvalFun = fun(E, B) -> expr(E, B, Lf, Ef, none) end, - case catch eval_bits:expr_grp(Fs, Bs0, EvalFun) of - {value,V,Bs} -> - ret_expr(V, Bs, RBs); - {'EXIT',{Reason,_}} -> - erlang:raise(error, Reason, stacktrace()) - end; + {value,V,Bs} = eval_bits:expr_grp(Fs, Bs0, EvalFun), + ret_expr(V, Bs, RBs); expr({remote,_,_,_}, _Bs, _Lf, _Ef, _RBs) -> erlang:raise(error, {badexpr,':'}, stacktrace()); expr({value,_,Val}, Bs, _Lf, _Ef, RBs) -> % Special case straight values. @@ -741,6 +737,8 @@ exprs(B, Bs1, Lf, Ef, RBs) end. +merge_queue([]) -> + true; merge_queue(Ms) -> send_all(recv_all(Ms), self()). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/erl_expand_records.erl erlang-13.b.3-dfsg/lib/stdlib/src/erl_expand_records.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/erl_expand_records.erl 2009-03-12 12:21:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/erl_expand_records.erl 2009-11-20 13:32:12.000000000 +0000 @@ -26,7 +26,7 @@ -export([module/2]). --import(lists, [map/2,foldl/3,foldr/3,sort/1,reverse/1,duplicate/2]). +-import(lists, [map/2,foldl/3,foldr/3,sort/1,reverse/1,duplicate/2]). -record(exprec, {compile=[], % Compile flags vcount=0, % Variable counter @@ -63,6 +63,7 @@ uses_types([{attribute,_L,spec,_}|_]) -> true; uses_types([{attribute,_L,type,_}|_]) -> true; +uses_types([{attribute,_L,opaque,_}|_]) -> true; uses_types([_|Fs]) -> uses_types(Fs); uses_types([]) -> false. @@ -230,7 +231,8 @@ expr({atom,Line,false}, St); false -> Fs = record_fields(Name, St), - expr({call,-Line,{remote,-Line,{atom,-Line,erlang},{atom,-Line,is_record}}, + NLine = neg_line(Line), + expr({call,NLine,{remote,NLine,{atom,NLine,erlang},{atom,NLine,is_record}}, [Term,{atom,Line,Name},{integer,Line,length(Fs)+1}]}, St) end. @@ -255,10 +257,11 @@ %% evaluate to a tuple properly. Fs = record_fields(Name, St0), {Var,St} = new_var(Line, St0), + NLine = neg_line(Line), expr({block,Line, [{match,Line,Var,Expr}, - {call,-Line,{remote,-Line,{atom,-Line,erlang}, - {atom,-Line,is_record}}, + {call,NLine,{remote,NLine,{atom,NLine,erlang}, + {atom,NLine,is_record}}, [Var,{atom,Line,Name},{integer,Line,length(Fs)+1}]}]}, St). exprs([E0 | Es0], St0) -> @@ -352,22 +355,22 @@ expr({call,Line,{tuple,_,[{atom,_,erlang},{atom,_,is_record}]}, [A,{atom,_,Name}]}, St) -> record_test(Line, A, Name, St); -expr({call,Line,{atom,La,N},As0}, St0) -> +expr({call,Line,{atom,_La,N}=Atom,As0}, St0) -> {As,St1} = expr_list(As0, St0), Ar = length(As), case erl_internal:bif(N, Ar) of true -> - {{call,Line,{atom,La,N},As},St1}; + {{call,Line,Atom,As},St1}; false -> case imported(N, Ar, St1) of {yes,_Mod} -> - {{call,Line,{atom,La,N},As},St1}; + {{call,Line,Atom,As},St1}; no -> case {N,Ar} of {record_info,2} -> record_info_call(Line, As, St1); _ -> - {{call,Line,{atom,La,N},As},St1} + {{call,Line,Atom,As},St1} end end end; @@ -446,12 +449,13 @@ conj([], _E) -> empty; conj([{{Name,_Rp},L,R,Sz} | AL], E) -> - T1 = {op,-L,'orelse', - {call,-L,{atom,-L,is_record},[R,{atom,-L,Name},{integer,-L,Sz}]}, - {atom,-L,fail}}, + NL = neg_line(L), + T1 = {op,NL,'orelse', + {call,NL,{atom,NL,is_record},[R,{atom,NL,Name},{integer,NL,Sz}]}, + {atom,NL,fail}}, T2 = case conj(AL, none) of empty -> T1; - C -> {op,-L,'and',C,T1} + C -> {op,NL,'and',C,T1} end, case E of none -> @@ -464,10 +468,10 @@ %% expression returns 'fail'. ('orelse' used to verify %% that its right operand was a boolean, but that is no %% longer the case.) - {op,-L,'and',T2,{atom,-L,true}} + {op,NL,'and',T2,{atom,NL,true}} end; _ -> - {op,-L,'and',T2,E} + {op,NL,'and',T2,E} end. %% lc_tq(Line, Qualifiers, State) -> @@ -510,7 +514,8 @@ {record_field,Lf,Field,{atom,Lf,undefined}}; ({typed_record_field,Field,_Type}) -> Field; - (F) -> F end, Fs). + (F) -> F + end, Fs). %% record_fields(RecordName, State) %% find_field(FieldName, Fields) @@ -558,13 +563,14 @@ Fs = record_fields(Name, St), I = index_expr(F, Fs, 2), P = record_pattern(2, I, Var, length(Fs)+1, Line, [{atom,Line,Name}]), - E = {'case',-Line,R, - [{clause,-Line,[{tuple,-Line,P}],[],[Var]}, - {clause,-Line,[{var,-Line,'_'}],[], - [{call,-Line,{remote,-Line, - {atom,-Line,erlang}, - {atom,-Line,error}}, - [{tuple,-Line,[{atom,-Line,badrecord},{atom,-Line,Name}]}]}]}]}, + NLine = neg_line(Line), + E = {'case',NLine,R, + [{clause,NLine,[{tuple,NLine,P}],[],[Var]}, + {clause,NLine,[{var,NLine,'_'}],[], + [{call,NLine,{remote,NLine, + {atom,NLine,erlang}, + {atom,NLine,error}}, + [{tuple,NLine,[{atom,NLine,badrecord},{atom,NLine,Name}]}]}]}]}, expr(E, St); true -> %In a guard. Fs = record_fields(Name, St0), @@ -610,8 +616,8 @@ {ok,Match} -> Match; error when Wildcard =:= none -> {var,L,'_'}; error -> Wildcard - end end, - Fs). + end + end, Fs). %% record_inits([RecDefField], [Init]) -> [InitExpr]. %% Build a list of initialisation expressions for the record tuple @@ -625,8 +631,8 @@ {ok,Init} -> Init; error when WildcardInit =:= none -> D; error -> WildcardInit - end end, - Fs). + end + end, Fs). record_wildcard_init([{record_field,_,{var,_,'_'},D} | _]) -> D; record_wildcard_init([_ | Is]) -> record_wildcard_init(Is); @@ -668,11 +674,12 @@ record_match(R, Name, Lr, Fs, Us, St0) -> {Ps,News,St1} = record_upd_fs(Fs, Us, St0), + NLr = neg_line(Lr), {{'case',Lr,R, [{clause,Lr,[{tuple,Lr,[{atom,Lr,Name} | Ps]}],[], [{tuple,Lr,[{atom,Lr,Name} | News]}]}, - {clause,-Lr,[{var,-Lr,'_'}],[], - [call_error(-Lr, {tuple,-Lr,[{atom,-Lr,badrecord},{atom,-Lr,Name}]})]} + {clause,NLr,[{var,NLr,'_'}],[], + [call_error(NLr, {tuple,NLr,[{atom,NLr,badrecord},{atom,NLr,Name}]})]} ]}, St1}. @@ -698,13 +705,14 @@ Us = [T || {_,T} <- Us2], Lr = element(2, hd(Us)), Wildcards = duplicate(length(Fs), {var,Lr,'_'}), + NLr = neg_line(Lr), {'case',Lr,R, [{clause,Lr,[{tuple,Lr,[{atom,Lr,Name} | Wildcards]}],[], [foldr(fun ({I,Lf,Val}, Acc) -> {call,Lf,{atom,Lf,setelement},[I,Acc,Val]} end, R, Us)]}, - {clause,-Lr,[{var,-Lr,'_'}],[], - [call_error(-Lr, {tuple,-Lr,[{atom,-Lr,badrecord},{atom,-Lr,Name}]})]}]}. + {clause,NLr,[{var,NLr,'_'}],[], + [call_error(NLr, {tuple,NLr,[{atom,NLr,badrecord},{atom,NLr,Name}]})]}]}. %% Expand a call to record_info/2. We have checked that it is not %% shadowed by an import. @@ -795,3 +803,6 @@ {ok,Mod} -> {yes,Mod}; error -> no end. + +neg_line(L) -> + erl_parse:set_line(L, fun(Line) -> -abs(Line) end). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/erl_internal.erl erlang-13.b.3-dfsg/lib/stdlib/src/erl_internal.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/erl_internal.erl 2009-04-16 10:23:54.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/erl_internal.erl 2009-09-18 15:07:50.000000000 +0100 @@ -54,7 +54,7 @@ %%--------------------------------------------------------------------------- %% Erlang builtin functions allowed in guards. --spec guard_bif(Name::atom(), Arity::arity()) -> bool(). +-spec guard_bif(Name::atom(), Arity::arity()) -> boolean(). guard_bif(abs, 1) -> true; guard_bif(float, 1) -> true; @@ -90,13 +90,13 @@ guard_bif(Name, A) when is_atom(Name), is_integer(A) -> false. %% Erlang type tests. --spec type_test(Name::atom(), Arity::arity()) -> bool(). +-spec type_test(Name::atom(), Arity::arity()) -> boolean(). type_test(Name, Arity) -> new_type_test(Name, Arity) orelse old_type_test(Name, Arity). %% Erlang new-style type tests. --spec new_type_test(Name::atom(), Arity::arity()) -> bool(). +-spec new_type_test(Name::atom(), Arity::arity()) -> boolean(). new_type_test(is_atom, 1) -> true; new_type_test(is_boolean, 1) -> true; @@ -117,7 +117,7 @@ new_type_test(Name, A) when is_atom(Name), is_integer(A) -> false. %% Erlang old-style type tests. --spec old_type_test(Name::atom(), Arity::arity()) -> bool(). +-spec old_type_test(Name::atom(), Arity::arity()) -> boolean(). old_type_test(integer, 1) -> true; old_type_test(float, 1) -> true; @@ -133,7 +133,7 @@ old_type_test(function, 1) -> true; old_type_test(Name, A) when is_atom(Name), is_integer(A) -> false. --spec arith_op(Op::atom(), Arity::arity()) -> bool(). +-spec arith_op(Op::atom(), Arity::arity()) -> boolean(). arith_op('+', 1) -> true; arith_op('-', 1) -> true; @@ -151,7 +151,7 @@ arith_op('bsr', 2) -> true; arith_op(Op, A) when is_atom(Op), is_integer(A) -> false. --spec bool_op(Op::atom(), Arity::arity()) -> bool(). +-spec bool_op(Op::atom(), Arity::arity()) -> boolean(). bool_op('not', 1) -> true; bool_op('and', 2) -> true; @@ -159,7 +159,7 @@ bool_op('xor', 2) -> true; bool_op(Op, A) when is_atom(Op), is_integer(A) -> false. --spec comp_op(Op::atom(), Arity::arity()) -> bool(). +-spec comp_op(Op::atom(), Arity::arity()) -> boolean(). comp_op('==', 2) -> true; comp_op('/=', 2) -> true; @@ -171,18 +171,18 @@ comp_op('=/=', 2) -> true; comp_op(Op, A) when is_atom(Op), is_integer(A) -> false. --spec list_op(Op::atom(), Arity::arity()) -> bool(). +-spec list_op(Op::atom(), Arity::arity()) -> boolean(). list_op('++', 2) -> true; list_op('--', 2) -> true; list_op(Op, A) when is_atom(Op), is_integer(A) -> false. --spec send_op(Op::atom(), Arity::arity()) -> bool(). +-spec send_op(Op::atom(), Arity::arity()) -> boolean(). send_op('!', 2) -> true; send_op(Op, A) when is_atom(Op), is_integer(A) -> false. --spec op_type(atom(), 1 | 2) -> 'arith' | 'bool' | 'comp' | 'list' | 'send'. +-spec op_type(atom(), arity()) -> 'arith' | 'bool' | 'comp' | 'list' | 'send'. op_type('+', 1) -> arith; op_type('-', 1) -> arith; @@ -214,12 +214,12 @@ op_type('--', 2) -> list; op_type('!', 2) -> send. --spec bif(Mod::atom(), Name::atom(), Arity::arity()) -> bool(). +-spec bif(Mod::atom(), Name::atom(), Arity::arity()) -> boolean(). bif(erlang, Name, Arity) -> bif(Name, Arity); bif(M, F, A) when is_atom(M), is_atom(F), is_integer(A) -> false. --spec bif(Name::atom(), Arity::arity()) -> bool(). +-spec bif(Name::atom(), Arity::arity()) -> boolean(). %% Returns true if erlang:Name/Arity is an auto-imported BIF, false otherwise. %% Use erlang:is_bultin(Mod, Name, Arity) to find whether a function is a BIF %% (meaning implemented in C) or not. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/erl_lint.erl erlang-13.b.3-dfsg/lib/stdlib/src/erl_lint.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/erl_lint.erl 2009-06-05 13:52:55.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/erl_lint.erl 2009-11-20 13:29:30.000000000 +0000 @@ -40,7 +40,7 @@ %% Value. %% The option handling functions. --spec bool_option(atom(), atom(), bool(), [_]) -> bool(). +-spec bool_option(atom(), atom(), boolean(), [_]) -> boolean(). bool_option(On, Off, Default, Opts) -> foldl(fun (Opt, _Def) when Opt =:= On -> true; @@ -95,6 +95,8 @@ compile=[], %Compile flags records=dict:new() :: dict(), %Record definitions defined=gb_sets:empty() :: gb_set(), %Defined fuctions + on_load=[] :: [{atom(),integer()}], %On-load function + on_load_line=0 :: integer(), %Line for on_load clashes=[], %Exported functions named as BIFs not_deprecated=[], %Not considered deprecated func=[], %Current function @@ -104,10 +106,10 @@ warnings=[], %Current warnings global_vt=[], %The global VarTable file = "" :: string(), %From last file attribute - recdef_top=false :: bool(), %true in record initialisation + recdef_top=false :: boolean(), %true in record initialisation %outside any fun or lc - xqlc= false :: bool(), %true if qlc.hrl included - new = false :: bool(), %Has user-defined 'new/N' + xqlc= false :: boolean(), %true if qlc.hrl included + new = false :: boolean(), %Has user-defined 'new/N' called= [], %Called functions usage = #usage{} :: #usage{}, specs = dict:new() :: dict(), %Type specifications @@ -161,6 +163,14 @@ io_lib:format("function ~w/~w undefined", [F,A]); format_error({bad_nowarn_deprecated_function,{M,F,A}}) -> io_lib:format("~w:~w/~w is not a deprecated function", [M,F,A]); +format_error({bad_on_load,Term}) -> + io_lib:format("badly formed on_load attribute: ~w", [Term]); +format_error(multiple_on_loads) -> + "more than one on_load attribute"; +format_error({bad_on_load_arity,{F,A}}) -> + io_lib:format("function ~w/~w has wrong arity (must be 0)", [F,A]); +format_error({undefined_on_load,{F,A}}) -> + io_lib:format("function ~w/~w undefined", [F,A]); format_error(export_all) -> "export_all flag enabled - all functions will be exported"; @@ -232,9 +242,11 @@ format_error({unbound_var,V}) -> io_lib:format("variable ~w is unbound", [V]); format_error({unsafe_var,V,{What,Where}}) -> - io_lib:format("variable ~w unsafe in ~w (line ~w)", [V,What,Where]); + io_lib:format("variable ~w unsafe in ~w ~s", + [V,What,format_where(Where)]); format_error({exported_var,V,{What,Where}}) -> - io_lib:format("variable ~w exported from ~w (line ~w)", [V,What,Where]); + io_lib:format("variable ~w exported from ~w ~s", + [V,What,format_where(Where)]); format_error({shadowed_var,V,In}) -> io_lib:format("variable ~w shadowed in ~w", [V,In]); format_error({unused_var, V}) -> @@ -261,7 +273,7 @@ %% --- behaviours --- format_error({conflicting_behaviours,{Name,Arity},B,FirstL,FirstB}) -> io_lib:format("conflicting behaviours - callback ~w/~w required by both '~p' " - "and '~p' (line ~p)", [Name,Arity,B,FirstB,FirstL]); + "and '~p' ~s", [Name,Arity,B,FirstB,format_where(FirstL)]); format_error({undefined_behaviour_func, {Func,Arity}, Behaviour}) -> io_lib:format("undefined callback function ~w/~w (behaviour '~w')", [Func,Arity,Behaviour]); @@ -287,6 +299,9 @@ format_error({builtin_type, {TypeName, Arity}}) -> io_lib:format("type ~w~s is a builtin type; it cannot be redefined", [TypeName, gen_type_paren(Arity)]); +format_error({renamed_type, OldName, NewName}) -> + io_lib:format("type ~w() is now called ~w(); " + "please use the new name instead", [OldName, NewName]); format_error({redefine_type, {TypeName, Arity}}) -> io_lib:format("type ~w~s already defined", [TypeName, gen_type_paren(Arity)]); @@ -325,6 +340,11 @@ format_mf(M, F, ArityString) when is_atom(M), is_atom(F) -> atom_to_list(M) ++ ":" ++ atom_to_list(F) ++ "/" ++ ArityString. +format_where(L) when is_integer(L) -> + io_lib:format("(line ~p)", [L]); +format_where({L,C}) when is_integer(L), is_integer(C) -> + io_lib:format("(line ~p, column ~p)", [L, C]). + %% Local functions that are somehow automatically generated. pseudolocals() -> @@ -354,7 +374,8 @@ Vt = orddict:from_list(Vs), {Evt,_St} = exprs(zip_file_and_line(Exprs, "nofile"), Vt, start()), {ok, foldl(fun({V,{_,used,_}}, L) -> [V | L]; - (_, L) -> L end, [], Evt)}. + (_, L) -> L + end, [], Evt)}. %% module([Form]) -> %% module([Form], FileName) -> @@ -493,13 +514,23 @@ add_error(E, St) -> St#lint{errors=[{St#lint.file,E}|St#lint.errors]}. -add_error({File,Line}, E, St) -> - add_error({Line,erl_lint,E}, St#lint{file = File}). +add_error(FileLine, E, St) -> + {File,Location} = loc(FileLine), + add_error({Location,erl_lint,E}, St#lint{file = File}). add_warning(W, St) -> St#lint{warnings=[{St#lint.file,W}|St#lint.warnings]}. -add_warning({File,Line}, W, St) -> - add_warning({Line,erl_lint,W}, St#lint{file = File}). +add_warning(FileLine, W, St) -> + {File,Location} = loc(FileLine), + add_warning({Location,erl_lint,W}, St#lint{file = File}). + +loc(L) -> + case erl_parse:get_attribute(L, location) of + {location,{{File,Line},Column}} -> + {File,{Line,Column}}; + {location,{File,Line}} -> + {File,Line} + end. %% forms([Form], State) -> State' @@ -548,7 +579,9 @@ []. zip_file_and_line(T, File) -> - modify_line(T, fun(Line) -> {File,Line} end). + F0 = fun(Line) -> {File,Line} end, + F = fun(L) -> erl_parse:set_line(L, F0) end, + modify_line(T, F). %% form(Form, State) -> State' %% Check a form returning the updated State. Handle generic cases here. @@ -646,6 +679,8 @@ type_def(opaque, L, TypeName, TypeDef, Args, St); attribute_state({attribute,L,spec,{Fun,Types}}, St) -> spec_decl(L, Fun, Types, St); +attribute_state({attribute,L,on_load,Val}, St) -> + on_load(L, Val, St); attribute_state({attribute,_L,_Other,_Val}, St) -> % Ignore others St; attribute_state(Form, St) -> @@ -687,7 +722,7 @@ Clashes = ordsets:subtract(ordsets:from_list(Clashes0), Nowarn), St#lint{clashes=Clashes}. --spec is_bif_clash(atom(), byte(), lint_state()) -> bool(). +-spec is_bif_clash(atom(), byte(), lint_state()) -> boolean(). is_bif_clash(_Name, _Arity, #lint{clashes=[]}) -> false; @@ -724,7 +759,8 @@ St9 = check_functions_without_spec(Forms, St8), StA = check_unused_types(Forms, St9), StB = check_untyped_records(Forms, StA), - check_unused_records(Forms, StB). + StC = check_on_load(StB), + check_unused_records(Forms, StC). %% check_behaviour(State0) -> State %% Check that the behaviour attribute is valid. @@ -746,10 +782,7 @@ all_behaviour_callbacks([], Acc, St) -> {reverse(Acc),St}. behaviour_callbacks(Line, B, St0) -> - case catch B:behaviour_info(callbacks) of - {'EXIT', _Reason} -> - St1 = add_warning(Line, {undefined_behaviour,B}, St0), - {[], St1}; + try B:behaviour_info(callbacks) of Funcs when is_list(Funcs) -> All = all(fun({FuncName, Arity}) -> is_atom(FuncName) andalso is_integer(Arity); @@ -772,6 +805,10 @@ _Other -> St1 = add_warning(Line, {ill_defined_behaviour_callbacks,B}, St0), {[], St1} + catch + _:_ -> + St1 = add_warning(Line, {undefined_behaviour,B}, St0), + {[], St1} end. behaviour_missing_callbacks([{{Line,B},Bfs}|T], #lint{exports=Exp}=St0) -> @@ -791,7 +828,8 @@ R = sofs:to_external(R4), behaviour_add_conflicts(R, St). -behaviour_add_conflicts([{Cb,[{{_,FirstL},FirstB}|Cs]}|T], St0) -> +behaviour_add_conflicts([{Cb,[{FirstLoc,FirstB}|Cs]}|T], St0) -> + FirstL = element(2, loc(FirstLoc)), St = behaviour_add_conflict(Cs, Cb, FirstL, FirstB, St0), behaviour_add_conflicts(T, St); behaviour_add_conflicts([], St) -> St. @@ -889,7 +927,7 @@ false -> Nowarn = nowarn_function(nowarn_unused_function, Opts), Usage = St1#lint.usage, - Used = reached_functions(gb_sets:to_list(St1#lint.exports), + Used = reached_functions(initially_reached(St1), Usage#usage.calls), UsedOrNowarn = ordsets:union(Used, Nowarn), Unused = ordsets:subtract(gb_sets:to_list(St1#lint.defined), @@ -899,6 +937,9 @@ func_line_warning(unused_function, Bad, St1) end. +initially_reached(#lint{exports=Exp,on_load=OnLoad}) -> + OnLoad ++ gb_sets:to_list(Exp). + %% reached_functions(RootSet, CallRef) -> [ReachedFunc]. %% reached_functions(RootSet, CallRef, [ReachedFunc]) -> [ReachedFunc]. @@ -993,9 +1034,9 @@ URecs = foldl(fun (Used, Recs) -> dict:erase(Used, Recs) end, St0#lint.records, UsedRecords), - Unused = [{Name,Line} || - {Name,{Line,_Fields}} <- dict:to_list(URecs), - element(1, Line) =:= FirstFile], + Unused = [{Name,FileLine} || + {Name,{FileLine,_Fields}} <- dict:to_list(URecs), + element(1, loc(FileLine)) =:= FirstFile], foldl(fun ({N,L}, St) -> add_warning(L, {unused_record, N}, St) end, St0, Unused); @@ -1089,6 +1130,38 @@ error -> no end. +%% on_load(Line, Val, State) -> State. +%% Check an on_load directive and remember it. + +on_load(Line, {Name,Arity}=Fa, #lint{on_load=OnLoad0}=St0) + when is_atom(Name), is_integer(Arity) -> + %% Always add the function name (even if there is a problem), + %% to avoid irrelevant warnings for unused functions. + St = St0#lint{on_load=[Fa|OnLoad0],on_load_line=Line}, + case St of + #lint{on_load=[{_,0}]} -> + %% This is the first on_load attribute seen in the module + %% and it has the correct arity. + St; + #lint{on_load=[{_,_}]} -> + %% Wrong arity. + add_error(Line, {bad_on_load_arity,Fa}, St); + #lint{on_load=[_,_|_]} -> + %% Multiple on_load attributes. + add_error(Line, multiple_on_loads, St) + end; +on_load(Line, Val, St) -> + %% Bad syntax. + add_error(Line, {bad_on_load,Val}, St). + +check_on_load(#lint{defined=Defined,on_load=[{_,0}=Fa], + on_load_line=Line}=St) -> + case gb_sets:is_member(Fa, Defined) of + true -> St; + false -> add_error(Line, {undefined_on_load,Fa}, St) + end; +check_on_load(St) -> St. + %% call_function(Line, Name, Arity, State) -> State. %% Add to both called and calls. @@ -2352,11 +2425,13 @@ error -> dict:store(Name, {seen_once, L}, SeenVars) end, {NewSeenVars, St}; -check_type({type, L, 'fun', [Dom, Range]}, SeenVars, St) -> +check_type({type, L, bool, []}, SeenVars, St) -> + {SeenVars, add_warning(L, {renamed_type, bool, boolean}, St)}; +check_type({type, L, 'fun', [Dom, Range]}, SeenVars, St) -> St1 = case Dom of {type, _, product, _} -> St; - {type, _, any, []} -> St; + {type, _, any} -> St; _ -> add_error(L, {type_syntax, 'fun'}, St) end, check_type({type, -1, product, [Dom, Range]}, SeenVars, St1); @@ -2368,6 +2443,7 @@ end, {SeenVars, St1}; check_type({type, _L, tuple, any}, SeenVars, St) -> {SeenVars, St}; +check_type({type, _L, any}, SeenVars, St) -> {SeenVars, St}; check_type({type, L, binary, [Base, Unit]}, SeenVars, St) -> St1 = case {Base, Unit} of @@ -2378,7 +2454,9 @@ {SeenVars, St1}; check_type({type, L, record, [Name|Fields]}, SeenVars, St) -> case Name of - {atom, _, Atom} -> check_record_types(L, Atom, Fields, SeenVars, St); + {atom, _, Atom} -> + St1 = used_record(Atom, St), + check_record_types(L, Atom, Fields, SeenVars, St1); _ -> {SeenVars, add_error(L, {type_syntax, record}, St)} end; check_type({type, _L, product, Args}, SeenVars, St) -> @@ -2519,7 +2597,7 @@ is_newly_introduced_builtin_type({queue, 0}) -> true; % opaque is_newly_introduced_builtin_type({set, 0}) -> true; % opaque is_newly_introduced_builtin_type({tid, 0}) -> true; % opaque -%% R13B-1 +%% R13B01 is_newly_introduced_builtin_type({boolean, 0}) -> true; is_newly_introduced_builtin_type({Name, _}) when is_atom(Name) -> false. @@ -2607,13 +2685,14 @@ fun(_Type, -1, AccSt) -> %% Default type AccSt; - (Type, Line, AccSt) -> - case Line of + (Type, FileLine, AccSt) -> + case loc(FileLine) of {FirstFile, _} -> case sets:is_element(Type, UsedTypes) of true -> AccSt; false -> - add_warning(Line, {unused_type, Type}, + add_warning(FileLine, + {unused_type, Type}, AccSt) end; _ -> @@ -2968,10 +3047,12 @@ %% vtunsafe([Variable], From, VarTable) -> VarTable. %% Add the variables to VarTable either as exported from From or as unsafe. -vtexport(Vs, {InTag,{_File,Line}}, Vt0) -> +vtexport(Vs, {InTag,FileLine}, Vt0) -> + {_File,Line} = loc(FileLine), vtupdate([{V,{{export,{InTag,Line}},unused,[]}} || V <- Vs], Vt0). -vtunsafe(Vs, {InTag,{_File,Line}}, Vt0) -> +vtunsafe(Vs, {InTag,FileLine}, Vt0) -> + {_File,Line} = loc(FileLine), vtupdate([{V,{{unsafe,{InTag,Line}},unused,[]}} || V <- Vs], Vt0). %% vtmerge(VarTable, VarTable) -> VarTable. @@ -3066,42 +3147,48 @@ %% modify_line(Expression, Fun) -> Expression %% Applies Fun to each line number occurrence. +modify_line(T, F0) -> + modify_line1(T, F0). + %% Forms. -modify_line({function,F,A}, _Mf) -> {function,F,A}; -modify_line({function,M,F,A}, _Mf) -> {function,M,F,A}; -modify_line({attribute,L,record,{Name,Fields}}, Mf) -> - {attribute,Mf(L),record,{Name,modify_line(Fields, Mf)}}; -modify_line({attribute,L,spec,{Fun,Types}}, Mf) -> - {attribute,Mf(L),spec,{Fun,modify_line(Types, Mf)}}; -modify_line({attribute,L,type,{TypeName,TypeDef,Args}}, Mf) -> - {attribute,Mf(L),type,{TypeName,modify_line(TypeDef, Mf), - modify_line(Args, Mf)}}; -modify_line({attribute,L,Attr,Val}, Mf) -> {attribute,Mf(L),Attr,Val}; -modify_line({warning,W}, _Mf) -> {warning,W}; -modify_line({error,W}, _Mf) -> {error,W}; +modify_line1({function,F,A}, _Mf) -> {function,F,A}; +modify_line1({function,M,F,A}, _Mf) -> {function,M,F,A}; +modify_line1({attribute,L,record,{Name,Fields}}, Mf) -> + {attribute,Mf(L),record,{Name,modify_line1(Fields, Mf)}}; +modify_line1({attribute,L,spec,{Fun,Types}}, Mf) -> + {attribute,Mf(L),spec,{Fun,modify_line1(Types, Mf)}}; +modify_line1({attribute,L,type,{TypeName,TypeDef,Args}}, Mf) -> + {attribute,Mf(L),type,{TypeName,modify_line1(TypeDef, Mf), + modify_line1(Args, Mf)}}; +modify_line1({attribute,L,opaque,{TypeName,TypeDef,Args}}, Mf) -> + {attribute,Mf(L),opaque,{TypeName,modify_line1(TypeDef, Mf), + modify_line1(Args, Mf)}}; +modify_line1({attribute,L,Attr,Val}, Mf) -> {attribute,Mf(L),Attr,Val}; +modify_line1({warning,W}, _Mf) -> {warning,W}; +modify_line1({error,W}, _Mf) -> {error,W}; %% Expressions. -modify_line({clauses,Cs}, Mf) -> {clauses,modify_line(Cs, Mf)}; -modify_line({typed_record_field,Field,Type}, Mf) -> - {typed_record_field,modify_line(Field, Mf),modify_line(Type, Mf)}; -modify_line({Tag,L}, Mf) -> {Tag,Mf(L)}; -modify_line({Tag,L,E1}, Mf) -> - {Tag,Mf(L),modify_line(E1, Mf)}; -modify_line({Tag,L,E1,E2}, Mf) -> - {Tag,Mf(L),modify_line(E1, Mf),modify_line(E2, Mf)}; -modify_line({bin_element,L,E1,E2,TSL}, Mf) -> - {bin_element,Mf(L),modify_line(E1, Mf),modify_line(E2, Mf), TSL}; -modify_line({Tag,L,E1,E2,E3}, Mf) -> - {Tag,Mf(L),modify_line(E1, Mf),modify_line(E2, Mf),modify_line(E3, Mf)}; -modify_line({Tag,L,E1,E2,E3,E4}, Mf) -> +modify_line1({clauses,Cs}, Mf) -> {clauses,modify_line1(Cs, Mf)}; +modify_line1({typed_record_field,Field,Type}, Mf) -> + {typed_record_field,modify_line1(Field, Mf),modify_line1(Type, Mf)}; +modify_line1({Tag,L}, Mf) -> {Tag,Mf(L)}; +modify_line1({Tag,L,E1}, Mf) -> + {Tag,Mf(L),modify_line1(E1, Mf)}; +modify_line1({Tag,L,E1,E2}, Mf) -> + {Tag,Mf(L),modify_line1(E1, Mf),modify_line1(E2, Mf)}; +modify_line1({bin_element,L,E1,E2,TSL}, Mf) -> + {bin_element,Mf(L),modify_line1(E1, Mf),modify_line1(E2, Mf), TSL}; +modify_line1({Tag,L,E1,E2,E3}, Mf) -> + {Tag,Mf(L),modify_line1(E1, Mf),modify_line1(E2, Mf),modify_line1(E3, Mf)}; +modify_line1({Tag,L,E1,E2,E3,E4}, Mf) -> {Tag,Mf(L), - modify_line(E1, Mf), - modify_line(E2, Mf), - modify_line(E3, Mf), - modify_line(E4, Mf)}; -modify_line([H|T], Mf) -> - [modify_line(H, Mf)|modify_line(T, Mf)]; -modify_line([], _Mf) -> []; -modify_line(E, _Mf) when not is_tuple(E), not is_list(E) -> E. + modify_line1(E1, Mf), + modify_line1(E2, Mf), + modify_line1(E3, Mf), + modify_line1(E4, Mf)}; +modify_line1([H|T], Mf) -> + [modify_line1(H, Mf)|modify_line1(T, Mf)]; +modify_line1([], _Mf) -> []; +modify_line1(E, _Mf) when not is_tuple(E), not is_list(E) -> E. %% Check a record_info call. We have already checked that it is not %% shadowed by an import. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/erl_pp.erl erlang-13.b.3-dfsg/lib/stdlib/src/erl_pp.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/erl_pp.erl 2009-03-12 12:18:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/erl_pp.erl 2009-11-20 13:29:30.000000000 +0000 @@ -22,8 +22,8 @@ %%% the parser. It does not always produce pretty code. -export([form/1,form/2, - attribute/1,attribute/2,function/1,function/2,rule/1,rule/2, - guard/1,guard/2,exprs/1,exprs/2,exprs/3,expr/1,expr/2,expr/3,expr/4]). + attribute/1,attribute/2,function/1,function/2,rule/1,rule/2, + guard/1,guard/2,exprs/1,exprs/2,exprs/3,expr/1,expr/2,expr/3,expr/4]). -import(lists, [append/1,foldr/3,mapfoldl/3,reverse/1,reverse/2]). -import(io_lib, [write/1,format/2,write_char/1,write_string/1]). @@ -104,6 +104,12 @@ lform({eof,_Line}, _Hook) -> $\n. +lattribute({attribute,_Line,type,Type}, Hook) -> + [typeattr(type, Type, Hook),leaf(".\n")]; +lattribute({attribute,_Line,opaque,Type}, Hook) -> + [typeattr(opaque, Type, Hook),leaf(".\n")]; +lattribute({attribute,_Line,spec,Arg}, _Hook) -> + [specattr(Arg),leaf(".\n")]; lattribute({attribute,_Line,Name,Arg}, Hook) -> [lattribute(Name, Arg, Hook),leaf(".\n")]. @@ -127,6 +133,120 @@ lattribute(Name, Arg, _Hook) -> attr(write(Name), [erl_parse:abstract(Arg)]). +typeattr(Tag, {TypeName,Type,Args}, _Hook) -> + {first,leaf("-"++atom_to_list(Tag)++" "), + typed(call({atom,0,TypeName}, Args, 0, none), Type)}. + +ltype({ann_type,_Line,[V,T]}) -> + typed(lexpr(V, none), T); +ltype({paren_type,_Line,[T]}) -> + [$(,ltype(T),$)]; +ltype({type,_Line,union,Ts}) -> + {seq,[],[],[' |'],ltypes(Ts)}; +ltype({type,_Line,list,[T]}) -> + {seq,$[,$],$,,[ltype(T)]}; +ltype({type,_Line,nonempty_list,[T]}) -> + {seq,$[,$],[$,],[ltype(T),leaf("...")]}; +ltype({type,Line,nil,[]}) -> + lexpr({nil,Line}, 0, none); +ltype({type,Line,tuple,any}) -> + simple_type({atom,Line,tuple}, []); +ltype({type,_Line,tuple,Ts}) -> + tuple_type(Ts, fun ltype/1); +ltype({type,_Line,record,[N|Fs]}) -> + record_type(N, Fs); +ltype({type,_Line,range,[_I1,_I2]=Es}) -> + expr_list(Es, '..', fun lexpr/2, none); +ltype({type,_Line,binary,[I1,I2]}) -> + binary_type(I1, I2); % except binary() +ltype({type,_Line,'fun',[]}) -> + leaf("fun()"); +ltype({type,_Line,'fun',_}=FunType) -> + [fun_type(['fun',$(], FunType),$)]; +ltype({type,Line,T,Ts}) -> + simple_type({atom,Line,T}, Ts); +ltype({remote_type,Line,[M,F,Ts]}) -> + simple_type({remote,Line,M,F}, Ts); +ltype({atom,_,T}) -> + %% Follow the convention to always quote atoms (in types): + leaf([$',atom_to_list(T),$']); +ltype(E) -> + lexpr(E, 0, none). + +binary_type({integer,_,Int1}=I1, {integer,_,Int2}=I2) -> + E1 = [[leaf("_:"),lexpr(I1, 0, none)] || Int1 =/= 0], + E2 = [[leaf("_:_*"),lexpr(I2, 0, none)] || Int2 =/= 0], + {seq,'<<','>>',[$,],E1++E2}. + +record_type({atom,_,Name}, Fields) -> + {first,[record_name(Name)],field_types(Fields)}. + +field_types(Fs) -> + tuple_type(Fs, fun field_type/1). + +field_type({type,_Line,field_type,[Name,Type]}) -> + typed(lexpr(Name, none), Type). + +typed(B, {type,_,union,Ts}) -> + %% Special layout for :: followed by union. + {first,[B,$\s],{seq,[],[],[],union_type(Ts)}}; +typed(B, Type) -> + {list,[{cstep,[B,' ::'],ltype(Type)}]}. + +union_type([T|Ts]) -> + [[leaf(":: "),ltype(T)] | ltypes(Ts, fun union_elem/1)]. + +union_elem(T) -> + [leaf(" | "),ltype(T)]. + +tuple_type(Ts, F) -> + {seq,${,$},[$,],ltypes(Ts, F)}. + +specattr({FuncSpec,TypeSpecs}) -> + Func = case FuncSpec of + {F,_A} -> + format("~w", [F]); + {M,F,_A} -> + format("~w:~w", [M, F]) + end, + {first,leaf("-spec "), + {list,[{first,leaf(Func),spec_clauses(TypeSpecs)}]}}. + +spec_clauses(TypeSpecs) -> + {prefer_nl,[$;],[sig_type(T) || T <- TypeSpecs]}. + +sig_type({type,_Line,bounded_fun,[T,Gs]}) -> + guard_type(fun_type([], T), Gs); +sig_type(FunType) -> + fun_type([], FunType). + +guard_type(Before, Gs) -> + Gl = {list,[{step,'when',expr_list(Gs, [$,], fun constraint/2, none)}]}, + {list,[{step,Before,Gl}]}. + +constraint({type,_Line,constraint,[Tag,As]}, _Hook) -> + simple_type(Tag, As). + +fun_type(Before, {type,_,'fun',[FType,Ret]}) -> + {first,Before,{step,[type_args(FType),' ->'],ltype(Ret)}}. + +type_args({type,_Line,any}) -> + leaf("(...)"); +type_args({type,_line,product,Ts}) -> + targs(Ts). + +simple_type(Tag, Types) -> + {first,lexpr(Tag, 0, none),targs(Types)}. + +targs(Ts) -> + {seq,$(,$),[$,],ltypes(Ts)}. + +ltypes(Ts) -> + ltypes(Ts, fun ltype/1). + +ltypes(Ts, F) -> + [F(T) || T <- Ts]. + attr(Name, Args) -> call({var,0,format("-~s", [Name])}, Args, 0, none). @@ -194,7 +314,7 @@ lexpr(E, Hook) -> lexpr(E, 0, Hook). -lexpr({var,_,V}, _, _) when is_integer(V) -> %Special hack for Robert +lexpr({var,_,V}, _, _) when is_integer(V) -> %Special hack for Robert leaf(format("_~w", [V])); lexpr({var,_,V}, _, _) -> leaf(format("~s", [V])); lexpr({char,_,C}, _, _) -> leaf(write_char(C)); @@ -207,22 +327,24 @@ list(T, [H], Hook); lexpr({lc,_,E,Qs}, _Prec, Hook) -> Lcl = {list,[{step,[lexpr(E, Hook),leaf(" ||")],lc_quals(Qs, Hook)}]}, - {seq,$[,$],[],[Lcl]}; + {list,[{seq,$[,[],[[]],[{force_nl,leaf(" "),[Lcl]}]},$]]}; + %% {list,[{step,$[,Lcl},$]]}; lexpr({bc,_,E,Qs}, _Prec, Hook) -> Lcl = {list,[{step,[lexpr(E, Hook),leaf(" ||")],lc_quals(Qs, Hook)}]}, - {seq,leaf("<< "),leaf(" >>"),[],[Lcl]}; + {list,[{seq,'<<',[],[[]],[{force_nl,leaf(" "),[Lcl]}]},'>>']}; + %% {list,[{step,'<<',Lcl},'>>']}; lexpr({tuple,_,Elts}, _, Hook) -> tuple(Elts, Hook); %%lexpr({struct,_,Tag,Elts}, _, Hook) -> %% {first,format("~w", [Tag]),tuple(Elts, Hook)}; lexpr({record_index, _, Name, F}, Prec, Hook) -> {P,R} = preop_prec('#'), - Nl = leaf(format("#~w", [Name])), + Nl = record_name(Name), El = [Nl,$.,lexpr(F, R, Hook)], maybe_paren(P, Prec, El); lexpr({record, _, Name, Fs}, Prec, Hook) -> {P,_R} = preop_prec('#'), - Nl = leaf(format("#~w", [Name])), + Nl = record_name(Name), El = {first,Nl,record_fields(Fs, Hook)}, maybe_paren(P, Prec, El); lexpr({record_field, _, Rec, Name, F}, Prec, Hook) -> @@ -234,7 +356,7 @@ lexpr({record, _, Rec, Name, Fs}, Prec, Hook) -> {L,P,_R} = inop_prec('#'), Rl = lexpr(Rec, L, Hook), - Nl = leaf(format("#~w", [Name])), + Nl = record_name(Name), El = {first,[Rl,Nl],record_fields(Fs, Hook)}, maybe_paren(P, Prec, El); lexpr({record_field, _, {atom,_,''}, F}, Prec, Hook) -> @@ -327,7 +449,7 @@ Ll = lexpr(Larg, L, Hook), Ol = leaf(format("~s", [Op])), Lr = lexpr(Rarg, R, Hook), - El = {prefer_nl,[],[Ll,Ol,Lr]}, + El = {prefer_nl,[[]],[Ll,Ol,Lr]}, maybe_paren(P, Prec, El); lexpr({op,_,Op,Larg,Rarg}, Prec, Hook) -> {L,P,R} = inop_prec(Op), @@ -375,7 +497,7 @@ {string,S} catch _:_ -> bit_elems(Fs, Hook) - end], + end], ['>>']]). bin_string([]) -> @@ -399,7 +521,7 @@ Types =/= default -> [SChars,$/|bit_elem_types(Types)]; true -> - SChars + SChars end. bit_elem_types([T]) -> @@ -416,6 +538,9 @@ %% end of BITS +record_name(Name) -> + leaf(format("#~w", [Name])). + record_fields(Fs, Hook) -> tuple(Fs, fun record_field/2, Hook). @@ -424,9 +549,22 @@ Fl = lexpr(F, L, Hook), Vl = lexpr(Val, R, Hook), {list,[{cstep,[Fl,' ='],Vl}]}; +record_field({typed_record_field,{record_field,_,F,Val},Type}, Hook) -> + {L,_P,R} = inop_prec('='), + Fl = lexpr(F, L, Hook), + Vl = typed(lexpr(Val, R, Hook), Type), + {list,[{cstep,[Fl,' ='],Vl}]}; +record_field({typed_record_field,Field,Type0}, Hook) -> + Type = remove_undefined(Type0), + typed(record_field(Field, Hook), Type); record_field({record_field,_,F}, Hook) -> lexpr(F, 0, Hook). +remove_undefined({type,L,union,[{atom,_,undefined}|T]}) -> + {type,L,union,T}; +remove_undefined(T) -> % cannot happen + T. + list({cons,_,H,T}, Es, Hook) -> list(T, [H|Es], Hook); list({nil,_}, Es, Hook) -> @@ -612,9 +750,9 @@ f([Item|Items], I0, ST, WT) -> consecutive(Items, f(Item, I0, ST, WT), I0, ST, WT); f({list,Items}, I0, ST, WT) -> - f({seq,[],[],[],Items}, I0, ST, WT); + f({seq,[],[],[[]],Items}, I0, ST, WT); f({first,E,Item}, I0, ST, WT) -> - f({seq,E,[],[],[Item]}, I0, ST, WT); + f({seq,E,[],[[]],[Item]}, I0, ST, WT); f({seq,Before,After,Sep,LItems}, I0, ST, WT) -> BCharsSize = f(Before, I0, ST, WT), I = indent(BCharsSize, I0), @@ -623,8 +761,10 @@ {BCharsL,BSizeL} = unz1([BCharsSize]), Sizes = BSizeL ++ SizeL, NSepChars = if - is_list(Sep) -> erlang:max(0, length(CharsL)-1); - true -> 0 + is_list(Sep), Sep =/= [] -> + erlang:max(0, length(CharsL)-1); + true -> + 0 end, case same_line(I0, Sizes, NSepChars) of {yes,Size} -> @@ -827,7 +967,8 @@ wordtable() -> L = [begin {leaf,Sz,S} = leaf(W), {S,Sz} end || W <- [" ->"," =","<<",">>","[]","after","begin","case","catch", - "end","fun","if","of","receive","try","when"]], + "end","fun","if","of","receive","try","when"," ::","..", + " |"]], list_to_tuple(L). word(' ->', WT) -> element(1, WT); @@ -845,4 +986,7 @@ word('of', WT) -> element(13, WT); word('receive', WT) -> element(14, WT); word('try', WT) -> element(15, WT); -word('when', WT) -> element(16, WT). +word('when', WT) -> element(16, WT); +word(' ::', WT) -> element(17, WT); +word('..', WT) -> element(18, WT); +word(' |', WT) -> element(19, WT). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/erl_scan.erl erlang-13.b.3-dfsg/lib/stdlib/src/erl_scan.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/erl_scan.erl 2009-06-05 13:52:56.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/erl_scan.erl 2009-11-20 13:29:31.000000000 +0000 @@ -77,12 +77,15 @@ -type column() :: pos_integer(). -type line() :: integer(). -type location() :: line() | {line(),column()}. --type resword_fun() :: fun((atom()) -> bool()). +-type resword_fun() :: fun((atom()) -> boolean()). -type option() :: 'return' | 'return_white_spaces' | 'return_comments' | 'text' | {'reserved_word_fun', resword_fun()}. -type options() :: option() | [option()]. -type symbol() :: atom() | float() | integer() | string(). --opaque attributes_data() :: list() | tuple(). +-type info_line() :: integer() | term(). +-type attributes_data() + :: [{'column', column()} | {'line', info_line()} | {'text', string()}] + | {line(), column()}. %% The fact that {line(),column()} is a possible attributes() type %% is hidden. -type attributes() :: line() | attributes_data(). @@ -127,7 +130,10 @@ string1(String, options(Options), Line, Column, []). -type char_spec() :: string() | 'eof'. --opaque return_cont() :: tuple(). +-type cont_fun() :: fun((char_spec(), #erl_scan{}, line(), column(), + tokens(), any()) -> any()). +-opaque return_cont() :: {string(), column(), tokens(), line(), + #erl_scan{}, cont_fun(), any()}. -type cont() :: return_cont() | []. -type tokens_result() :: {'ok', tokens(), location()} | {'eof', location()} @@ -153,7 +159,6 @@ -type attribute_item() :: 'column' | 'length' | 'line' | 'location' | 'text'. --type info_line() :: integer() | term(). -type info_location() :: location() | term(). -type attribute_info() :: {'column', column()}| {'length', pos_integer()} | {'line', info_line()} @@ -337,6 +342,8 @@ erlang:error(badarg, [Attrs, Item]) end. +-spec set_attr('line', attributes(), fun((line()) -> line())) -> attributes(). + set_attr(line, Line, Fun) when ?ALINE(Line) -> Ln = Fun(Line), if @@ -373,8 +380,8 @@ {done,Res,eof}; {ok,Toks0,Rest,Nline,Ncol} -> {done,{ok,lists:reverse(Toks0),location(Nline, Ncol)},Rest}; - {error,_,_}=Error -> - {done,Error,[]} + {{error,_,_}=Error,Rest} -> + {done,Error,Rest} end. string1(Cs, St, Line, Col, Toks) -> @@ -383,14 +390,14 @@ case Fun(Cs0++eof, St, Nline, Ncol, Ntoks, Any) of {ok,Toks1,_Rest,Line2,Col2} -> {ok,lists:reverse(Toks1),location(Line2, Col2)}; - {error,_,_}=Error -> + {{error,_,_}=Error,_Rest} -> Error end; {ok,Ntoks,[_|_]=Rest,Nline,Ncol} -> string1(Rest, St, Nline, Ncol, Ntoks); {ok,Ntoks,_,Nline,Ncol} -> {ok,lists:reverse(Ntoks),location(Nline, Ncol)}; - {error,_,_}=Error -> + {{error,_,_}=Error,_Rest} -> Error end. @@ -569,7 +576,7 @@ tok2(Cs, St, Line, Col, Toks, Str, Sym, 1); _ -> Ncol = incr_column(Col, 1), - scan_error({illegal,character}, Line, Col, Line, Ncol) + scan_error({illegal,character}, Line, Col, Line, Ncol, Cs) end; scan1([]=Cs, _St, Line, Col, Toks) -> {more,{Cs,Col,Toks,Line,[],fun scan/6}}; @@ -591,7 +598,7 @@ end; _Error -> Ncol = incr_column(Col, length(Wcs)), - scan_error({illegal,atom}, Line, Col, Line, Ncol) + scan_error({illegal,atom}, Line, Col, Line, Ncol, Cs) end end. @@ -605,7 +612,7 @@ tok3(Cs, St, Line, Col, Toks, var, Wcs, Name); _Error -> Ncol = incr_column(Col, length(Wcs)), - scan_error({illegal,var}, Line, Col, Line, Ncol) + scan_error({illegal,var}, Line, Col, Line, Ncol, Cs) end end. @@ -765,10 +772,10 @@ case scan_escape(Cs, incr_column(Col, 2)) of more -> {more,{[$$|Cs0],Col,Toks,Line,[],fun scan/6}}; - {error,Error,Ncol} -> - scan_error(Error, Line, Col, Line, Ncol); + {error,Ncs,Error,Ncol} -> + scan_error(Error, Line, Col, Line, Ncol, Ncs); {eof,Ncol} -> - scan_error(char, Line, Col, Line, Ncol); + scan_error(char, Line, Col, Line, Ncol, eof); {nl,Val,Str,Ncs,Ncol} -> Attrs = attributes(Line, Col, St, "$\\"++Str), Ntoks = [{char,Attrs,Val}|Toks], @@ -792,18 +799,18 @@ scan_char([], _St, Line, Col, Toks) -> {more,{[$$],Col,Toks,Line,[],fun scan/6}}; scan_char(eof, _St, Line, Col, _Toks) -> - scan_error(char, Line, Col, Line, incr_column(Col, 1)). + scan_error(char, Line, Col, Line, incr_column(Col, 1), eof). scan_string(Cs, St, Line, Col, Toks, {Wcs,Str,Line0,Col0,Uni0}) -> case scan_string0(Cs, St, Line, Col, $\", Str, Wcs, Uni0) of {more,Ncs,Nline,Ncol,Nstr,Nwcs,Uni} -> State = {Nwcs,Nstr,Line0,Col0,Uni}, {more,{Ncs,Ncol,Toks,Nline,State,fun scan_string/6}}; - {char_error,Error,Nline,Ncol,EndCol} -> - scan_error(Error, Nline, Ncol, Nline, EndCol); - {error,Nline,Ncol,Nwcs} -> + {char_error,Ncs,Error,Nline,Ncol,EndCol} -> + scan_error(Error, Nline, Ncol, Nline, EndCol, Ncs); + {error,Nline,Ncol,Nwcs,Ncs} -> Estr = string:substr(Nwcs, 1, 16), % Expanded escape chars. - scan_error({string,$\",Estr}, Line0, Col0, Nline, Ncol); + scan_error({string,$\",Estr}, Line0, Col0, Nline, Ncol, Ncs); {Ncs,Nline,Ncol,Nstr,Nwcs,?NO_UNICODE} -> Attrs = attributes(Line0, Col0, St, Nstr), scan1(Ncs, St, Nline, Ncol, [{string,Attrs,Nwcs}|Toks]); @@ -860,18 +867,18 @@ {more,Ncs,Nline,Ncol,Nstr,Nwcs,Uni} -> State = {Nwcs,Nstr,Line0,Col0,Uni}, {more,{Ncs,Ncol,Toks,Nline,State,fun scan_qatom/6}}; - {char_error,Error,Nline,Ncol,EndCol} -> - scan_error(Error, Nline, Ncol, Nline, EndCol); - {error,Nline,Ncol,Nwcs} -> + {char_error,Ncs,Error,Nline,Ncol,EndCol} -> + scan_error(Error, Nline, Ncol, Nline, EndCol, Ncs); + {error,Nline,Ncol,Nwcs,Ncs} -> Estr = string:substr(Nwcs, 1, 16), % Expanded escape chars. - scan_error({string,$\',Estr}, Line0, Col0, Nline, Ncol); + scan_error({string,$\',Estr}, Line0, Col0, Nline, Ncol, Ncs); {Ncs,Nline,Ncol,Nstr,Nwcs,?NO_UNICODE} -> case catch list_to_atom(Nwcs) of A when is_atom(A) -> Attrs = attributes(Line0, Col0, St, Nstr), scan1(Ncs, St, Nline, Ncol, [{atom,Attrs,A}|Toks]); _ -> - scan_error({illegal,atom}, Line0, Col0, Nline, Ncol) + scan_error({illegal,atom}, Line0, Col0, Nline, Ncol, Ncs) end end. @@ -912,6 +919,11 @@ %% workaround is eventually removed. -define(UNI_STR(Col, S), S). +%% Note: in those cases when a 'char_error' tuple is returned below it +%% is tempting to skip over characters up to the first Q character, +%% but then the end location of the error tuple would not correspond +%% to the start location of the returned Rest string. (Maybe the end +%% location could be modified, but that too is ugly.) scan_string1([Q|Cs], Line, Col, Q, Str0, Wcs0, Uni) -> Wcs = lists:reverse(Wcs0), Str = ?UNI_STR(Col, [Q|lists:reverse(Str0, [Q])]), @@ -923,16 +935,16 @@ case scan_escape(Cs, Col) of more -> {more,Cs0,Line,Col,Str,Wcs,Uni}; - {error,Error,Ncol} -> - {char_error,Error,Line,Col,incr_column(Ncol, 1)}; + {error,Ncs,Error,Ncol} -> + {char_error,Ncs,Error,Line,Col,incr_column(Ncol, 1)}; {eof,Ncol} -> - {error,Line,incr_column(Ncol, 1),lists:reverse(Wcs)}; + {error,Line,incr_column(Ncol, 1),lists:reverse(Wcs),eof}; {nl,Val,ValStr,Ncs,Ncol} -> Nstr = ?UNI_STR(Ncol, lists:reverse(ValStr, [$\\|Str])), Nwcs = [Val|Wcs], scan_string1(Ncs, Line+1, Ncol, Q, Nstr, Nwcs, Uni); - {unicode,_Val,_ValStr,_Ncs,Ncol} when Q =:= $' -> %' Emacs - {char_error,{illegal,character},Line,Col,incr_column(Ncol, 1)}; + {unicode,_Val,_ValStr,Ncs,Ncol} when Q =:= $' -> %' Emacs + {char_error,Ncs,{illegal,character},Line,Col,incr_column(Ncol, 1)}; {unicode,Val,ValStr,Ncs,Ncol} -> % UNI. Uni is set to Val. Nstr = ?UNI_STR(Ncol, lists:reverse(ValStr, [$\\|Str])), Nwcs = [Val|Wcs], % not used @@ -948,14 +960,14 @@ scan_string1(Cs, Line, Col, Q, [C|Str], [C|Wcs], Uni); % UNI scan_string1([C|Cs], Line, Col, Q, Str, Wcs, Uni) when ?CHAR(C), ?UNI255(C) -> scan_string1(Cs, Line, Col+1, Q, [C|Str], [C|Wcs], Uni); -scan_string1([C|_Cs], Line, Col, $', _Str, _Wcs, _Uni) when ?CHAR(C) -> %' UNI - {char_error,{illegal,character},Line,Col,incr_column(Col, 1)}; +scan_string1([C|Cs], Line, Col, $', _Str, _Wcs, _Uni) when ?CHAR(C) -> %' UNI + {char_error,Cs,{illegal,character},Line,Col,incr_column(Col, 1)}; scan_string1([C|Cs], Line, Col, Q, Str, Wcs, _Uni) when ?CHAR(C) -> % UNI scan_string1(Cs, Line, incr_column(Col, 1), Q, [C|Str], [C|Wcs], C); scan_string1([]=Cs, Line, Col, _Q, Str, Wcs, Uni) -> {more,Cs,Line,Col,Str,Wcs,Uni}; scan_string1(eof, Line, Col, _Q, _Str, Wcs, _Uni) -> - {error,Line,Col,lists:reverse(Wcs)}. + {error,Line,Col,lists:reverse(Wcs),eof}. -define(OCT(C), C >= $0, C =< $7). -define(HEX(C), C >= $0 andalso C =< $9 orelse @@ -988,8 +1000,8 @@ {Val,?UNI_STR(Col, [$x,H1,H2]),Cs,incr_column(Col, 3)}; scan_escape([$x,H1], _Col) when ?HEX(H1) -> more; -scan_escape([$x|_], Col) -> - {error,{illegal,character},incr_column(Col, 1)}; +scan_escape([$x|Cs], Col) -> + {error,Cs,{illegal,character},incr_column(Col, 1)}; %% \^X -> CTL-X scan_escape([$^=C0,$\n=C|Cs], Col) -> {nl,C,?UNI_STR(Col, [C0,C]),Cs,new_column(Col, 1)}; @@ -1027,14 +1039,14 @@ Val when Val =< 16#10FFFF -> {unicode,Val,?UNI_STR(Col, Str0++Wcs++[$}]),Cs,incr_column(Col,1)}; _ -> - {error,{illegal,character},incr_column(Col, 1)} + {error,Cs,{illegal,character},incr_column(Col, 1)} end; scan_esc_end([], _Col, _Wcs, _B, _Str0) -> more; scan_esc_end(eof, Col, _Wcs, _B, _Str0) -> {eof,Col}; -scan_esc_end(_Cs, Col, _Wcs, _B, _Str0) -> - {error,{illegal,character},Col}. +scan_esc_end(Cs, Col, _Wcs, _B, _Str0) -> + {error,Cs,{illegal,character},Col}. escape_char($n) -> $\n; % \n = LF escape_char($r) -> $\r; % \r = CR @@ -1053,7 +1065,7 @@ scan_fraction(Cs, St, Line, Col, Toks, [C,$.|Ncs]); scan_number([$.]=Cs, _St, Line, Col, Toks, Ncs) -> {more,{Cs,Col,Toks,Line,Ncs,fun scan_number/6}}; -scan_number([$#|Cs], St, Line, Col, Toks, Ncs0) -> +scan_number([$#|Cs]=Cs0, St, Line, Col, Toks, Ncs0) -> Ncs = lists:reverse(Ncs0), case catch list_to_integer(Ncs) of B when B >= 2, B =< 1+$Z-$A+10 -> @@ -1061,7 +1073,7 @@ scan_based_int(Cs, St, Line, Col, Toks, {B,[],Bcs}); B -> Len = length(Ncs), - scan_error({base,B}, Line, Col, Line, incr_column(Col, Len)) + scan_error({base,B}, Line, Col, Line, incr_column(Col, Len), Cs0) end; scan_number([]=Cs, _St, Line, Col, Toks, Ncs) -> {more,{Cs,Col,Toks,Line,Ncs,fun scan_number/6}}; @@ -1072,7 +1084,7 @@ tok3(Cs, St, Line, Col, Toks, integer, Ncs, N); _ -> Ncol = incr_column(Col, length(Ncs)), - scan_error({illegal,integer}, Line, Col, Line, Ncol) + scan_error({illegal,integer}, Line, Col, Line, Ncol, Cs) end. scan_based_int([C|Cs], St, Line, Col, Toks, {B,Ncs,Bcs}) @@ -1094,7 +1106,7 @@ _ -> Len = length(Bcs)+length(Ncs), Ncol = incr_column(Col, Len), - scan_error({illegal,integer}, Line, Col, Line, Ncol) + scan_error({illegal,integer}, Line, Col, Line, Ncol, Cs) end. scan_fraction([C|Cs], St, Line, Col, Toks, Ncs) when ?DIGIT(C) -> @@ -1127,7 +1139,7 @@ tok3(Cs, St, Line, Col, Toks, float, Ncs, F); _ -> Ncol = incr_column(Col, length(Ncs)), - scan_error({illegal,float}, Line, Col, Line, Ncol) + scan_error({illegal,float}, Line, Col, Line, Ncol, Cs) end. skip_comment([C|Cs], St, Line, Col, Toks, N) when C =/= $\n, ?CHAR(C) -> @@ -1170,13 +1182,13 @@ Token = {Item,attributes(Line, Col, St, String),Sym}, scan1(Cs, St, Line, incr_column(Col, Length), [Token|Toks]). -scan_error(Error, Line, Col, EndLine, EndCol) -> +scan_error(Error, Line, Col, EndLine, EndCol, Rest) -> Loc = location(Line, Col), EndLoc = location(EndLine, EndCol), - scan_error(Error, Loc, EndLoc). + scan_error(Error, Loc, EndLoc, Rest). -scan_error(Error, ErrorLoc, EndLoc) -> - {error,{ErrorLoc,?MODULE,Error},EndLoc}. +scan_error(Error, ErrorLoc, EndLoc, Rest) -> + {{error,{ErrorLoc,?MODULE,Error},EndLoc},Rest}. -compile({inline,[attributes/4]}). @@ -1262,7 +1274,7 @@ tabs(9) -> "\t\t\t\t\t\t\t\t\t"; tabs(10) -> "\t\t\t\t\t\t\t\t\t\t". --spec reserved_word(atom()) -> bool(). +-spec reserved_word(atom()) -> boolean(). reserved_word('after') -> true; reserved_word('begin') -> true; reserved_word('case') -> true; diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/erl_tar.erl erlang-13.b.3-dfsg/lib/stdlib/src/erl_tar.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/erl_tar.erl 2009-03-12 12:18:57.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/erl_tar.erl 2009-09-18 15:07:35.000000000 +0100 @@ -30,7 +30,7 @@ -record(add_opts, {read_info, % Fun to use for read file/link info. - verbose = false :: bool()}). % Verbose on/off. + verbose = false :: boolean()}). % Verbose on/off. %% Opens a tar archive. @@ -423,12 +423,12 @@ -record(read_opts, {cwd :: string(), % Current working directory. - keep_old_files = false :: bool(), % Owerwrite or not. + keep_old_files = false :: boolean(), % Owerwrite or not. files = all, % Set of files to extract % (or all). output = file :: 'file' | 'memory', open_mode = [], % Open mode options. - verbose = false :: bool()}). % Verbose on/off. + verbose = false :: boolean()}). % Verbose on/off. extract_opts(List) -> extract_opts(List, default_options()). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/escript.erl erlang-13.b.3-dfsg/lib/stdlib/src/escript.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/escript.erl 2009-06-05 13:53:44.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/escript.erl 2009-11-20 13:32:30.000000000 +0000 @@ -241,63 +241,88 @@ {error, R} -> fatal(lists:concat([file:format_error(R), ": '", File, "'"])) end, - {HeaderSz, StartLine, FirstBodyLine} = skip_header(Fd, 1), + {HeaderSz, StartLine, ScriptType} = skip_header(Fd, 1), #state{mode = Mode, source = Source, module = Module, forms_or_bin = FormsOrBin} = - case FirstBodyLine of - [$P, $K | _] -> + case ScriptType of + archive -> %% Archive file ok = file:close(Fd), parse_archive(S, File, HeaderSz); - [$F, $O, $R, $1 | _] -> + beam -> %% Beam file ok = file:close(Fd), parse_beam(S, File, HeaderSz, CheckOnly); - _ -> + source -> %% Source code parse_source(S, File, Fd, StartLine, HeaderSz, CheckOnly) end, {Source, Module, FormsOrBin, Mode}. -%% Skip header and return first body line +%% Skip header and make a heuristic guess about the script type skip_header(P, LineNo) -> %% Skip shebang on first line {ok, HeaderSz0} = file:position(P, cur), Line1 = get_line(P), - case Line1 of + case classify_line(Line1) of + shebang -> + find_first_body_line(P, LineNo); + archive -> + {HeaderSz0, LineNo, archive}; + beam -> + {HeaderSz0, LineNo, beam}; + _ -> + find_first_body_line(P, LineNo) + end. + +find_first_body_line(P, LineNo) -> + {ok, HeaderSz1} = file:position(P, cur), + %% Look for special comment on second line + Line2 = get_line(P), + {ok, HeaderSz2} = file:position(P, cur), + case classify_line(Line2) of + emu_args -> + %% Skip special comment on second line + Line3 = get_line(P), + {HeaderSz2, LineNo + 2, guess_type(Line3)}; + _ -> + %% Look for special comment on third line + Line3 = get_line(P), + {ok, HeaderSz3} = file:position(P, cur), + case classify_line(Line3) of + emu_args -> + %% Skip special comment on third line + Line4 = get_line(P), + {HeaderSz3, LineNo + 3, guess_type(Line4)}; + _ -> + %% Just skip shebang on first line + {HeaderSz1, LineNo + 1, guess_type(Line2)} + end + end. + +classify_line(Line) -> + case Line of [$\#, $\! | _] -> - %% Shebang - {ok, HeaderSz1} = file:position(P, cur), - - %% Look for special comment on second line - Line2 = get_line(P), - {ok, HeaderSz2} = file:position(P, cur), - case Line2 of - [$\%, $\%, $\! | _] -> - %% Skip special comment on second line - Line3 = get_line(P), - {HeaderSz2, LineNo + 2, Line3}; - _ -> - %% Look for special comment on third line - Line3 = get_line(P), - {ok, HeaderSz3} = file:position(P, cur), - case Line3 of - [$\%, $\%, $\! | _] -> - %% Skip special comment on third line - Line4 = get_line(P), - {HeaderSz3, LineNo + 3, Line4}; - _ -> - %% Just skip shebang on first line - {HeaderSz1, LineNo + 1, Line2} - end - end; - _ -> - %% No shebang. Assume that there is no header. - {HeaderSz0, LineNo, Line1} + shebang; + [$P, $K | _] -> + archive; + [$F, $O, $R, $1 | _] -> + beam; + [$\%, $\%, $\! | _] -> + emu_args; + _ -> + undefined + end. + +guess_type(Line) -> + case classify_line(Line) of + archive -> archive; + beam -> beam; + _ -> source end. - + get_line(P) -> case io:get_line(P, '') of eof -> @@ -442,9 +467,16 @@ pre_def_macros(File) -> {MegaSecs, Secs, MicroSecs} = erlang:now(), + Replace = fun(Char) -> + case Char of + $\. -> $\_; + _ -> Char + end + end, + CleanBase = lists:map(Replace, filename:basename(File)), ModuleStr = + CleanBase ++ "__" ++ "escript__" ++ - filename:basename(File) ++ "__" ++ integer_to_list(MegaSecs) ++ "__" ++ integer_to_list(Secs) ++ "__" ++ integer_to_list(MicroSecs), diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/ets.erl erlang-13.b.3-dfsg/lib/stdlib/src/ets.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/ets.erl 2009-03-12 12:18:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/ets.erl 2009-09-18 15:07:01.000000000 +0100 @@ -53,7 +53,7 @@ -type table_info() :: {'name', atom()} | {'type', type()} | {'protection', protection()} - | {'named_table', bool()} + | {'named_table', boolean()} | {'keypos', non_neg_integer()} | {'size', non_neg_integer()} | {'extended_info', [ext_info()]} @@ -325,8 +325,8 @@ -record(filetab_options, { - object_count = false :: bool(), - md5sum = false :: bool() + object_count = false :: boolean(), + md5sum = false :: boolean() }). -type fname() :: string() | atom(). @@ -493,10 +493,10 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Read a dumped file from disk and create a corresponding table %% Opts := [Opt] -%% Opt := {verify,bool()} +%% Opt := {verify,boolean()} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --type f2t_option() :: {'verify', bool()}. +-type f2t_option() :: {'verify', boolean()}. -spec file2tab(fname()) -> {'ok', tab()} | {'error', term()}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/eval_bits.erl erlang-13.b.3-dfsg/lib/stdlib/src/eval_bits.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/eval_bits.erl 2009-04-16 10:23:58.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/eval_bits.erl 2009-09-18 15:08:09.000000000 +0100 @@ -55,7 +55,7 @@ << <> || X <- List >>. expr_grp(Fields, Bindings, EvalFun) -> - catch expr_grp(Fields, Bindings, EvalFun, <<>>). + expr_grp(Fields, Bindings, EvalFun, <<>>). expr_grp([Field | FS], Bs0, Lf, Acc) -> {Bin,Bs} = eval_field(Field, Bs0, Lf), diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/filelib.erl erlang-13.b.3-dfsg/lib/stdlib/src/filelib.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/filelib.erl 2009-04-16 10:23:52.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/filelib.erl 2009-09-18 15:07:44.000000000 +0100 @@ -40,50 +40,50 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec wildcard(name()) -> [string()]. +-spec wildcard(name()) -> [file:filename()]. wildcard(Pattern) when is_list(Pattern) -> ?HANDLE_ERROR(do_wildcard(Pattern, file)). --spec wildcard(name(), name() | atom()) -> [string()]. +-spec wildcard(name(), name() | atom()) -> [file:filename()]. wildcard(Pattern, Cwd) when is_list(Pattern), is_list(Cwd) -> ?HANDLE_ERROR(do_wildcard(Pattern, Cwd, file)); wildcard(Pattern, Mod) when is_list(Pattern), is_atom(Mod) -> ?HANDLE_ERROR(do_wildcard(Pattern, Mod)). --spec wildcard(name(), name(), atom()) -> [string()]. +-spec wildcard(name(), name(), atom()) -> [file:filename()]. wildcard(Pattern, Cwd, Mod) when is_list(Pattern), is_list(Cwd), is_atom(Mod) -> ?HANDLE_ERROR(do_wildcard(Pattern, Cwd, Mod)). --spec is_dir(name()) -> bool(). +-spec is_dir(name()) -> boolean(). is_dir(Dir) -> do_is_dir(Dir, file). --spec is_dir(name(), atom()) -> bool(). +-spec is_dir(name(), atom()) -> boolean(). is_dir(Dir, Mod) when is_atom(Mod) -> do_is_dir(Dir, Mod). --spec is_file(name()) -> bool(). +-spec is_file(name()) -> boolean(). is_file(File) -> do_is_file(File, file). --spec is_file(name(), atom()) -> bool(). +-spec is_file(name(), atom()) -> boolean(). is_file(File, Mod) when is_atom(Mod) -> do_is_file(File, Mod). --spec is_regular(name()) -> bool(). +-spec is_regular(name()) -> boolean(). is_regular(File) -> do_is_regular(File, file). --spec is_regular(name(), atom()) -> bool(). +-spec is_regular(name(), atom()) -> boolean(). is_regular(File, Mod) when is_atom(Mod) -> do_is_regular(File, Mod). --spec fold_files(name(), string(), bool(), fun((_,_) -> _), _) -> _. +-spec fold_files(name(), string(), boolean(), fun((_,_) -> _), _) -> _. fold_files(Dir, RegExp, Recursive, Fun, Acc) -> do_fold_files(Dir, RegExp, Recursive, Fun, Acc, file). --spec fold_files(name(), string(), bool(), fun((_,_) -> _), _, atom()) -> _. +-spec fold_files(name(), string(), boolean(), fun((_,_) -> _), _, atom()) -> _. fold_files(Dir, RegExp, Recursive, Fun, Acc, Mod) when is_atom(Mod) -> do_fold_files(Dir, RegExp, Recursive, Fun, Acc, Mod). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/filename.erl erlang-13.b.3-dfsg/lib/stdlib/src/filename.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/filename.erl 2009-03-12 12:18:52.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/filename.erl 2009-11-20 13:30:04.000000000 +0000 @@ -155,7 +155,7 @@ basename1([], Tail, _DirSep2) -> lists:reverse(Tail). -skip_prefix(Name, false) -> % No prefix for unix, but for VxWorks. +skip_prefix(Name, false) -> % No prefix for unix, but for VxWorks. case major_os_type() of vxworks -> case vxworks_first(Name) of @@ -357,6 +357,7 @@ %% a given base directory, which is is assumed to be normalised %% by a previous call to join/{1,2}. +-spec append(string(), name()) -> string(). append(Dir, Name) -> Dir ++ [$/|Name]. @@ -426,7 +427,6 @@ Name = flatten(Name0), rootname(Name, [], [], major_os_type()). --spec rootname(name(), name()) -> string(). rootname([$/|Rest], Root, Ext, OsType) -> rootname(Rest, [$/]++Ext++Root, [], OsType); rootname([$\\|Rest], Root, Ext, win32) -> @@ -451,6 +451,7 @@ %% Examples: rootname("/jam.src/kalle.jam", ".erl") -> "/jam.src/kalle.jam" %% rootname("/jam.src/foo.erl", ".erl") -> "/jam.src/foo" +-spec rootname(name(), name()) -> string(). rootname(Name0, Ext0) -> Name = flatten(Name0), Ext = flatten(Ext0), @@ -644,7 +645,7 @@ end; try_file(Src, _ObjFilename, Mod, _Rules) -> List = Mod:module_info(compile), - {value, {options, Options}} = lists:keysearch(options, 1, List), + {options, Options} = lists:keyfind(options, 1, List), {ok, Cwd} = file:get_cwd(), AbsPath = make_abs_path(Cwd, Src), {AbsPath, filter_options(dirname(AbsPath), Options, [])}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/gb_sets.erl erlang-13.b.3-dfsg/lib/stdlib/src/gb_sets.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/gb_sets.erl 2009-06-05 13:53:21.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/gb_sets.erl 2009-09-18 15:08:16.000000000 +0100 @@ -214,7 +214,7 @@ new() -> empty(). --spec is_empty(gb_set()) -> bool(). +-spec is_empty(gb_set()) -> boolean(). is_empty({0, nil}) -> true; @@ -231,12 +231,12 @@ singleton(Key) -> {1, {Key, nil, nil}}. --spec is_element(term(), gb_set()) -> bool(). +-spec is_element(term(), gb_set()) -> boolean(). is_element(Key, S) -> is_member(Key, S). --spec is_member(term(), gb_set()) -> bool(). +-spec is_member(term(), gb_set()) -> boolean(). is_member(Key, {_, T}) -> is_member_1(Key, T). @@ -666,7 +666,7 @@ intersection_list(intersection(S, S1), Ss); intersection_list(S, []) -> S. --spec is_disjoint(gb_set(), gb_set()) -> bool(). +-spec is_disjoint(gb_set(), gb_set()) -> boolean(). is_disjoint({N1, T1}, {N2, T2}) when N1 < N2 -> is_disjoint_1(T1, T2); @@ -747,7 +747,7 @@ %% Subset testing is much the same thing as set difference, but %% without the construction of a new set. --spec is_subset(gb_set(), gb_set()) -> bool(). +-spec is_subset(gb_set(), gb_set()) -> boolean(). is_subset({N1, T1}, {N2, T2}) -> is_subset(to_list_1(T1), N1, T2, N2). @@ -788,13 +788,13 @@ %% For compatibility with `sets': --spec is_set(term()) -> bool(). +-spec is_set(term()) -> boolean(). is_set({0, nil}) -> true; is_set({N, {_, _, _}}) when is_integer(N), N >= 0 -> true; is_set(_) -> false. --spec filter(fun((term()) -> bool()), gb_set()) -> gb_set(). +-spec filter(fun((term()) -> boolean()), gb_set()) -> gb_set(). filter(F, S) -> from_ordset([X || X <- to_list(S), F(X)]). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/gb_trees.erl erlang-13.b.3-dfsg/lib/stdlib/src/gb_trees.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/gb_trees.erl 2009-03-12 12:20:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/gb_trees.erl 2009-09-18 15:08:17.000000000 +0100 @@ -166,7 +166,7 @@ empty() -> {0, nil}. --spec is_empty(gb_tree()) -> bool(). +-spec is_empty(gb_tree()) -> boolean(). is_empty({0, nil}) -> true; @@ -205,7 +205,7 @@ %% This is a specialized version of `lookup'. --spec is_defined(term(), gb_tree()) -> bool(). +-spec is_defined(term(), gb_tree()) -> boolean(). is_defined(Key, {_, T}) -> is_defined_1(Key, T). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/gen.erl erlang-13.b.3-dfsg/lib/stdlib/src/gen.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/gen.erl 2009-06-05 13:53:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/gen.erl 2009-11-20 13:29:38.000000000 +0000 @@ -33,14 +33,17 @@ %%----------------------------------------------------------------- --type linkage() :: 'link' | 'nolink'. --type emgr_name() :: {'local', atom()} | {'global', term()}. +-type linkage() :: 'link' | 'nolink'. +-type emgr_name() :: {'local', atom()} | {'global', term()}. --type start_ret() :: {'ok', pid()} | 'ignore' | {'error', term()}. +-type start_ret() :: {'ok', pid()} | 'ignore' | {'error', term()}. --type opts_flag() :: 'trace' | 'log' | 'statistics' | 'debug' - | {'logfile', string()}. --type options() :: [{'timeout', timeout()} | {'debug', [opts_flag()]}]. +-type debug_flag() :: 'trace' | 'log' | 'statistics' | 'debug' + | {'logfile', string()}. +-type option() :: {'timeout', timeout()} + | {'debug', [debug_flag()]} + | {'spawn_opt', [proc_lib:spawn_option()]}. +-type options() :: [option()]. %%----------------------------------------------------------------- %% Starts a generic process. @@ -50,7 +53,7 @@ %% LinkP = link | nolink %% Name = {local, atom()} | {global, term()} %% Args = term(), init arguments (to Mod:init/1) -%% Options = [{timeout, Timeout} | {debug, [Flag]}] +%% Options = [{timeout, Timeout} | {debug, [Flag]} | {spawn_opt, OptionList}] %% Flag = trace | log | {logfile, File} | statistics | debug %% (debug == log && statistics) %% Returns: {ok, Pid} | ignore |{error, Reason} | diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/io.erl erlang-13.b.3-dfsg/lib/stdlib/src/io.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/io.erl 2009-03-12 12:18:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/io.erl 2009-09-18 15:07:03.000000000 +0100 @@ -32,6 +32,17 @@ parse_erl_form/1,parse_erl_form/2,parse_erl_form/3]). -export([request/1,request/2,requests/1,requests/2]). + +%%------------------------------------------------------------------------- + +-type device() :: atom() | pid(). +-type prompt() :: atom() | string(). + +%% XXX: Some uses of line() in this file may need to read erl_scan:location() +-type line() :: pos_integer(). + +%%------------------------------------------------------------------------- + %% %% User interface. %% @@ -65,52 +76,75 @@ Other end. -% Put chars takes mixed *unicode* list from R13 onwards. +%% Put chars takes mixed *unicode* list from R13 onwards. +-spec put_chars(iodata()) -> 'ok'. + put_chars(Chars) -> put_chars(default_output(), Chars). +-spec put_chars(device(), iodata()) -> 'ok'. + put_chars(Io, Chars) -> o_request(Io, {put_chars,unicode,Chars}, put_chars). -spec nl() -> 'ok'. + nl() -> nl(default_output()). +-spec nl(device()) -> 'ok'. + nl(Io) -> % o_request(Io, {put_chars,io_lib:nl()}). o_request(Io, nl, nl). +-spec columns() -> {'ok', pos_integer()} | {'error', 'enotsup'}. + columns() -> columns(default_output()). + +-spec columns(device()) -> {'ok', pos_integer()} | {'error', 'enotsup'}. + columns(Io) -> - case request(Io,{get_geometry,columns}) of + case request(Io, {get_geometry,columns}) of N when is_integer(N), N > 0 -> {ok,N}; _ -> {error,enotsup} end. +-spec rows() -> {'ok', pos_integer()} | {'error', 'enotsup'}. + rows() -> rows(default_output()). + +-spec rows(device()) -> {'ok', pos_integer()} | {'error', 'enotsup'}. + rows(Io) -> case request(Io,{get_geometry,rows}) of N when is_integer(N), N > 0 -> {ok,N}; _ -> {error,enotsup} - end. - + end. +-spec get_chars(prompt(), non_neg_integer()) -> iodata() | 'eof'. get_chars(Prompt, N) -> get_chars(default_input(), Prompt, N). +-spec get_chars(device(), prompt(), non_neg_integer()) -> iodata() | 'eof'. + get_chars(Io, Prompt, N) when is_integer(N), N >= 0 -> request(Io, {get_chars,unicode,Prompt,N}). +-spec get_line(prompt()) -> iodata() | 'eof' | {'error', term()}. + get_line(Prompt) -> get_line(default_input(), Prompt). +-spec get_line(device(), prompt()) -> iodata() | 'eof' | {'error', term()}. + get_line(Io, Prompt) -> request(Io, {get_line,unicode,Prompt}). @@ -120,32 +154,60 @@ get_password(Io) -> request(Io, {get_password,unicode}). +-type encoding() :: 'latin1' | 'unicode' | 'utf8' | 'utf16' | 'utf32' + | {'utf16', 'big' | 'little'} | {'utf32','big' | 'little'}. +-type expand_fun() :: fun((term()) -> {'yes'|'no', string(), [string(), ...]}). +-type opt_pair() :: {'binary', boolean()} + | {'echo', boolean()} + | {'expand_fun', expand_fun()} + | {'encoding', encoding()}. + +-spec getopts() -> [opt_pair()]. + getopts() -> getopts(default_input()). +-spec getopts(device()) -> [opt_pair()]. + getopts(Io) -> request(Io, getopts). +-type setopt() :: 'binary' | 'list' | opt_pair(). + +-spec setopts([setopt()]) -> 'ok' | {'error', term()}. + setopts(Opts) -> setopts(default_input(), Opts). +-spec setopts(device(), [setopt()]) -> 'ok' | {'error', term()}. + setopts(Io, Opts) -> request(Io, {setopts, Opts}). %% Writing and reading Erlang terms. +-spec write(term()) -> 'ok'. + write(Term) -> write(default_output(), Term). +-spec write(device(), term()) -> 'ok'. + write(Io, Term) -> o_request(Io, {write,Term}, write). +-spec read(prompt()) -> + {'ok', term()} | 'eof' | {'error', erl_scan:error_info()}. + % Read does not use get_until as erl_scan does not work with unicode % XXX:PaN fixme? read(Prompt) -> read(default_input(), Prompt). +-spec read(device(), prompt()) -> + {'ok', term()} | 'eof' | {'error', erl_scan:error_info()}. + read(Io, Prompt) -> case request(Io, {get_until,unicode,Prompt,erl_scan,tokens,[1]}) of {ok,Toks,_EndLine} -> @@ -160,6 +222,10 @@ Other end. +-spec read(device(), prompt(), line()) -> + {'ok', term(), line()} | {'eof', line()} | + {'error', erl_scan:error_info(), line()}. + read(Io, Prompt, StartLine) when is_integer(StartLine) -> case request(Io, {get_until,unicode,Prompt,erl_scan,tokens,[StartLine]}) of {ok,Toks,EndLine} -> @@ -167,10 +233,10 @@ {ok,Term} -> {ok,Term,EndLine}; {error,ErrorInfo} -> {error,ErrorInfo,EndLine} end; - {error,E,EndLine} -> - {error,E,EndLine}; - {eof,EndLine} -> - {eof,EndLine}; + {error,_E,_EndLine} = Error -> + Error; + {eof,_EndLine} = Eof -> + Eof; Other -> Other end. @@ -182,18 +248,31 @@ conv_reason(_, {no_translation,_,_}) -> no_translation; conv_reason(_, _Reason) -> badarg. +-type format() :: atom() | string() | binary(). + +-spec fwrite(format()) -> 'ok'. + fwrite(Format) -> format(Format). +-spec fwrite(format(), [term()]) -> 'ok'. + fwrite(Format, Args) -> format(Format, Args). +-spec fwrite(device(), format(), [term()]) -> 'ok'. + fwrite(Io, Format, Args) -> format(Io, Format, Args). +-spec fread(prompt(), format()) -> {'ok', [term()]} | 'eof' | {'error',term()}. + fread(Prompt, Format) -> fread(default_input(), Prompt, Format). +-spec fread(device(), prompt(), format()) -> + {'ok', [term()]} | 'eof' | {'error',term()}. + fread(Io, Prompt, Format) -> case request(Io, {fread,Prompt,Format}) of % {error, Reason} when atom(Reason) -> @@ -202,43 +281,73 @@ Other end. +-spec format(format()) -> 'ok'. + format(Format) -> format(Format, []). +-spec format(format(), [term()]) -> 'ok'. + format(Format, Args) -> format(default_output(), Format, Args). +-spec format(device(), format(), [term()]) -> 'ok'. + format(Io, Format, Args) -> o_request(Io, {format,Format,Args}, format). %% Scanning Erlang code. +-spec scan_erl_exprs(prompt()) -> erl_scan:tokens_result(). + scan_erl_exprs(Prompt) -> scan_erl_exprs(default_input(), Prompt, 1). +-spec scan_erl_exprs(device(), prompt()) -> erl_scan:tokens_result(). + scan_erl_exprs(Io, Prompt) -> scan_erl_exprs(Io, Prompt, 1). +-spec scan_erl_exprs(device(), prompt(), line()) -> erl_scan:tokens_result(). + scan_erl_exprs(Io, Prompt, Pos0) -> request(Io, {get_until,unicode,Prompt,erl_scan,tokens,[Pos0]}). +-spec scan_erl_form(prompt()) -> erl_scan:tokens_result(). + scan_erl_form(Prompt) -> scan_erl_form(default_input(), Prompt, 1). +-spec scan_erl_form(device(), prompt()) -> erl_scan:tokens_result(). + scan_erl_form(Io, Prompt) -> scan_erl_form(Io, Prompt, 1). +-spec scan_erl_form(device(), prompt(), line()) -> erl_scan:tokens_result(). + scan_erl_form(Io, Prompt, Pos0) -> request(Io, {get_until,unicode,Prompt,erl_scan,tokens,[Pos0]}). %% Parsing Erlang code. +-type erl_parse_expr_list() :: [_]. %% XXX: should be imported from erl_parse + +-type parse_ret() :: {'ok', erl_parse_expr_list(), line()} + | {'eof', line()} + | {'error', erl_scan:error_info(), line()}. + +-spec parse_erl_exprs(prompt()) -> parse_ret(). + parse_erl_exprs(Prompt) -> parse_erl_exprs(default_input(), Prompt, 1). +-spec parse_erl_exprs(device(), prompt()) -> parse_ret(). + parse_erl_exprs(Io, Prompt) -> parse_erl_exprs(Io, Prompt, 1). +-spec parse_erl_exprs(device(), prompt(), line()) -> parse_ret(). + parse_erl_exprs(Io, Prompt, Pos0) -> case request(Io, {get_until,unicode,Prompt,erl_scan,tokens,[Pos0]}) of {ok,Toks,EndPos} -> @@ -250,12 +359,24 @@ Other end. +-type erl_parse_absform() :: _. %% XXX: should be imported from erl_parse + +-type parse_form_ret() :: {'ok', erl_parse_absform(), line()} + | {'eof', line()} + | {'error', erl_scan:error_info(), line()}. + +-spec parse_erl_form(prompt()) -> parse_form_ret(). + parse_erl_form(Prompt) -> parse_erl_form(default_input(), Prompt, 1). +-spec parse_erl_form(device(), prompt()) -> parse_form_ret(). + parse_erl_form(Io, Prompt) -> parse_erl_form(Io, Prompt, 1). +-spec parse_erl_form(device(), prompt(), line()) -> parse_form_ret(). + parse_erl_form(Io, Prompt, Pos0) -> case request(Io, {get_until,unicode,Prompt,erl_scan,tokens,[Pos0]}) of {ok,Toks,EndPos} -> @@ -284,16 +405,15 @@ request(Pid, Request) end. -execute_request(Pid,{Convert,Converted}) -> - Mref = erlang:monitor(process,Pid), +execute_request(Pid, {Convert,Converted}) -> + Mref = erlang:monitor(process, Pid), Pid ! {io_request,self(),Pid,Converted}, if Convert -> - convert_binaries(wait_io_mon_reply(Pid,Mref)); + convert_binaries(wait_io_mon_reply(Pid, Mref)); true -> - wait_io_mon_reply(Pid,Mref) + wait_io_mon_reply(Pid, Mref) end. - requests(Requests) -> %Requests as atomic action requests(default_output(), Requests). @@ -311,7 +431,7 @@ requests(Pid, Requests) end. - + default_input() -> group_leader(). @@ -320,7 +440,7 @@ wait_io_mon_reply(From, Mref) -> receive - {io_reply,From,Reply} -> + {io_reply, From, Reply} -> erlang:demonitor(Mref), receive {'DOWN', Mref, _, _, _} -> true @@ -342,7 +462,6 @@ end. - %% io_requests(Requests) %% Transform requests into correct i/o server messages. Only handle the %% one we KNOW must be changed, others, including incorrect ones, are @@ -401,6 +520,7 @@ false -> {MaybeConvert,Op} end. + io_request(Pid, {write,Term}) -> bc_req(Pid,{put_chars,unicode,io_lib,write,[Term]},false); io_request(Pid, {format,Format,Args}) -> diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/io_lib.erl erlang-13.b.3-dfsg/lib/stdlib/src/io_lib.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/io_lib.erl 2009-04-16 10:23:37.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/io_lib.erl 2009-11-20 13:29:33.000000000 +0000 @@ -66,22 +66,43 @@ -export([write_atom/1,write_string/1,write_string/2,write_unicode_string/1, write_unicode_string/2, write_char/1, write_unicode_char/1]). --export([quote_atom/2,char_list/1,unicode_char_list/1,deep_char_list/1,deep_unicode_char_list/1,printable_list/1,printable_unicode_list/1]). +-export([quote_atom/2, char_list/1, unicode_char_list/1, + deep_char_list/1, deep_unicode_char_list/1, + printable_list/1, printable_unicode_list/1]). %% Utilities for collecting characters. --export([collect_chars/3,collect_chars/4,collect_line/2,collect_line/3,collect_line/4,get_until/3,get_until/4]). +-export([collect_chars/3, collect_chars/4, + collect_line/2, collect_line/3, collect_line/4, + get_until/3, get_until/4]). + +%%---------------------------------------------------------------------- + + %% XXX: overapproximates a deep list of (unicode) characters +-type chars() :: [_]. +-type depth() :: -1 | non_neg_integer(). + +%%---------------------------------------------------------------------- %% Interface calls to sub-modules. +-spec fwrite(io:format(), [term()]) -> chars(). + fwrite(Format, Args) -> format(Format, Args). +-spec fread(string(), string()) -> io_lib_fread:fread_2_ret(). + fread(Chars, Format) -> io_lib_fread:fread(Chars, Format). +-spec fread(io_lib_fread:continuation(), string(), string()) -> + io_lib_fread:fread_3_ret(). + fread(Cont, Chars, Format) -> io_lib_fread:fread(Cont, Chars, Format). +-spec format(io:format(), [term()]) -> chars(). + format(Format, Args) -> case catch io_lib_format:fwrite(Format, Args) of {'EXIT',_} -> @@ -90,12 +111,18 @@ Other end. +-spec print(term()) -> chars(). + print(Term) -> io_lib_pretty:print(Term). +-spec print(term(), non_neg_integer(), non_neg_integer(), depth()) -> chars(). + print(Term, Column, LineLength, Depth) -> io_lib_pretty:print(Term, Column, LineLength, Depth). +-spec indentation(string(), integer()) -> integer(). + indentation(Chars, Current) -> io_lib_format:indentation(Chars, Current). @@ -105,6 +132,9 @@ %% printed without any additional quotes. %% Note that the output is a deep string, and not an iolist (i.e., %% it may be deep, but never contains binaries, due to the "~s"). + +-spec format_prompt(term()) -> chars(). + format_prompt({format,Format,Args}) -> format_prompt(Format,Args); format_prompt(Prompt) @@ -113,8 +143,8 @@ format_prompt(Prompt) -> format_prompt("~p", [Prompt]). -format_prompt(Format,Args) -> - case catch io_lib:format(Format,Args) of +format_prompt(Format, Args) -> + case catch io_lib:format(Format, Args) of {'EXIT',_} -> "???"; List -> List end. @@ -126,13 +156,19 @@ %% Return a (non-flattened) list of characters giving a printed %% representation of the term. write/3 is for backward compatibility. +-spec write(term()) -> chars(). + write(Term) -> write(Term, -1). +-spec write(term(), depth(), boolean()) -> chars(). + write(Term, D, true) -> io_lib_pretty:print(Term, 1, 80, D); write(Term, D, false) -> write(Term, D). +-spec write(term(), depth()) -> chars(). + write(_Term, 0) -> "..."; write(Term, _D) when is_integer(Term) -> integer_to_list(Term); write(Term, _D) when is_float(Term) -> io_lib_format:fwrite_g(Term); @@ -196,6 +232,8 @@ %% write_atom(Atom) -> [Char] %% Generate the list of characters needed to print an atom. +-spec write_atom(atom()) -> chars(). + write_atom(Atom) -> Chars = atom_to_list(Atom), case quote_atom(Atom, Chars) of @@ -209,6 +247,8 @@ %% Return 'true' if atom with chars in CharList needs to be quoted, else %% return 'false'. +-spec quote_atom(atom(), chars()) -> boolean(). + quote_atom(Atom, Cs0) -> case erl_scan:reserved_word(Atom) of true -> true; @@ -241,9 +281,13 @@ %% write_string([Char]) -> [Char] %% Generate the list of characters needed to print a string. +-spec write_string(string()) -> chars(). + write_string(S) -> write_string(S, $"). %" +-spec write_string(string(), char()) -> chars(). + write_string(S, Q) -> [Q|write_string1(latin1, S, Q)]. @@ -284,6 +328,8 @@ %% Generate the list of characters needed to print a character constant. %% Must special case SPACE, $\s, here. +-spec write_char(char()) -> chars(). + write_char($\s) -> "$\\s"; %Must special case this. write_char(C) when is_integer(C), C >= $\000, C =< $\377 -> [$$|string_char(latin1,C, -1, [])]. @@ -298,11 +344,15 @@ %% Return true if CharList is a (possibly deep) list of characters, else %% false. +-spec char_list(term()) -> boolean(). + char_list([C|Cs]) when is_integer(C), C >= $\000, C =< $\377 -> char_list(Cs); char_list([]) -> true; char_list(_) -> false. %Everything else is false +-spec unicode_char_list(term()) -> boolean(). + unicode_char_list([C|Cs]) when is_integer(C), C >= 0, C < 16#D800; is_integer(C), C > 16#DFFF, C < 16#FFFE; is_integer(C), C > 16#FFFF, C =< 16#10FFFF -> @@ -310,6 +360,8 @@ unicode_char_list([]) -> true; unicode_char_list(_) -> false. %Everything else is false +-spec deep_char_list(term()) -> boolean(). + deep_char_list(Cs) -> deep_char_list(Cs, []). @@ -323,6 +375,8 @@ deep_char_list(_, _More) -> %Everything else is false false. +-spec deep_unicode_char_list(term()) -> boolean(). + deep_unicode_char_list(Cs) -> deep_unicode_char_list(Cs, []). @@ -339,10 +393,12 @@ deep_unicode_char_list(_, _More) -> %Everything else is false false. -%% printable_list([Char]) -> bool() +%% printable_list([Char]) -> boolean() %% Return true if CharList is a list of printable characters, else %% false. +-spec printable_list(term()) -> boolean(). + printable_list([C|Cs]) when is_integer(C), C >= $\040, C =< $\176 -> printable_list(Cs); printable_list([C|Cs]) when is_integer(C), C >= $\240, C =< $\377 -> @@ -357,12 +413,14 @@ printable_list([]) -> true; printable_list(_) -> false. %Everything else is false -%% printable_unicode_list([Char]) -> bool() +%% printable_unicode_list([Char]) -> boolean() %% Return true if CharList is a list of printable characters, else %% false. The notion of printable in Unicode terms is somewhat floating. %% Everything that is not a control character and not invalid unicode %% will be considered printable. +-spec printable_unicode_list(term()) -> boolean(). + printable_unicode_list([C|Cs]) when is_integer(C), C >= $\040, C =< $\176 -> printable_unicode_list(Cs); printable_unicode_list([C|Cs]) @@ -378,11 +436,13 @@ printable_unicode_list([$\f|Cs]) -> printable_unicode_list(Cs); printable_unicode_list([$\e|Cs]) -> printable_unicode_list(Cs); printable_unicode_list([]) -> true; -printable_unicode_list(_) -> false. %Everything else is false +printable_unicode_list(_) -> false. %Everything else is false %% List = nl() %% Return a list of characters to generate a newline. +-spec nl() -> string(). + nl() -> "\n". diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/io_lib_fread.erl erlang-13.b.3-dfsg/lib/stdlib/src/io_lib_fread.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/io_lib_fread.erl 2009-03-12 12:18:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/io_lib_fread.erl 2009-11-20 13:29:35.000000000 +0000 @@ -24,11 +24,33 @@ -import(lists, [reverse/1,reverse/2]). +%%----------------------------------------------------------------------- +%% Local types +%%----------------------------------------------------------------------- + +-type done_arg2() :: {'ok', io_lib:chars()} | 'eof' | {'error', term()}. + +%%----------------------------------------------------------------------- +%% Types also used in other files +%%----------------------------------------------------------------------- + +-type continuation() :: [] | {_, _, _, _}. % XXX: refine + +-type fread_2_ret() :: {'ok', io_lib:chars(), string()} + | {'more', string(), non_neg_integer(), io_lib:chars()} + | {'error', term()}. +-type fread_3_ret() :: {'more', continuation()} + | {'done', done_arg2(), string()}. + +%%----------------------------------------------------------------------- + %% fread(Continuation, CharList, FormatString) %% This is the main function into the re-entrant formatted reader. It %% repeatedly collects lines and calls fread/2 to format the input until %% all the format string has been used. And it counts the characters. +-spec fread(io_lib_fread:continuation(), string(), string()) -> fread_3_ret(). + fread([], Chars, Format) -> %%io:format("FREAD: ~w `~s'~n", [Format,Chars]), fread_collect(Format, [], 0, [], Chars); @@ -57,7 +79,7 @@ {ok,Results,[]} -> {done,{ok,Results},Chars}; {ok,Results,Rest} -> - %% Don't loose the whitespace + %% Don't lose the whitespace {done,{ok,Results},Rest++(Newline++Chars)}; %% fread/4 should not return {more,...} on eof; guard just in case... %% Count newline characters here since fread/4 does not get them. @@ -82,6 +104,8 @@ %% WHITE Skip white space %% X Literal X +-spec fread(string(), string()) -> fread_2_ret(). + fread(Format, Line) -> fread(Format, Line, 0, []). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/lib.erl erlang-13.b.3-dfsg/lib/stdlib/src/lib.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/lib.erl 2009-03-12 12:18:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/lib.erl 2009-11-20 13:29:33.000000000 +0000 @@ -18,12 +18,14 @@ %% -module(lib). --export([flush_receive/0,error_message/2, progname/0, nonl/1, send/2, +-export([flush_receive/0, error_message/2, progname/0, nonl/1, send/2, sendw/2, eval_str/1]). -export([format_exception/6, format_stacktrace/4, format_call/4, format_fun/1]). +-spec flush_receive() -> 'ok'. + flush_receive() -> receive _Any -> @@ -36,12 +38,14 @@ %% %% Functions for doing standard system format i/o. %% +-spec error_message(atom() | string() | binary(), [term()]) -> 'ok'. error_message(Format, Args) -> io:format(<<"** ~s **\n">>, [io_lib:format(Format, Args)]). %% Return the name of the script that starts (this) erlang %% +-spec progname() -> atom(). progname() -> case init:get_argument(progname) of @@ -51,26 +55,31 @@ no_prog_name end. +-spec nonl(string()) -> string(). + nonl([10]) -> []; nonl([]) -> []; nonl([H|T]) -> [H|nonl(T)]. +-spec send(pid() | atom() | {atom(), node()}, term()) -> term(). send(To, Msg) -> To ! Msg. +-spec sendw(pid() | atom() | {atom(), node()}, term()) -> term(). + sendw(To, Msg) -> To ! {self(), Msg}, receive Reply -> Reply end. - - %% eval_str(InStr) -> {ok, OutStr} | {error, ErrStr'} %% InStr must represent a body -define(result(F,D), lists:flatten(io_lib:format(F, D))). +-spec eval_str(string() | binary()) -> {'ok', string()} | {'error', string()}. + eval_str(Str) when is_list(Str) -> case erl_scan:tokens([], Str, 0) of {more, _} -> diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/lists.erl erlang-13.b.3-dfsg/lib/stdlib/src/lists.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/lists.erl 2009-03-12 12:18:05.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/lists.erl 2009-09-18 15:07:04.000000000 +0100 @@ -107,7 +107,7 @@ %% prefix(Prefix, List) -> (true | false) --spec prefix([T], [T]) -> bool(). +-spec prefix([T], [T]) -> boolean(). prefix([X|PreTail], [X|Tail]) -> prefix(PreTail, Tail); @@ -116,7 +116,7 @@ %% suffix(Suffix, List) -> (true | false) --spec suffix([T], [T]) -> bool(). +-spec suffix([T], [T]) -> boolean(). suffix(Suffix, List) -> Delta = length(List) - length(Suffix), @@ -717,7 +717,7 @@ %%% Suggestion from OTP-2948: sort and merge with Fun. --spec sort(fun((T, T) -> bool()), [T]) -> [T]. +-spec sort(fun((T, T) -> boolean()), [T]) -> [T]. sort(Fun, []) when is_function(Fun, 2) -> []; @@ -731,7 +731,7 @@ fsplit_2(Y, X, Fun, T, [], []) end. --spec merge(fun((X, Y) -> bool()), [X], [Y]) -> [_]. +-spec merge(fun((X, Y) -> boolean()), [X], [Y]) -> [_]. merge(Fun, T1, [H2 | T2]) when is_function(Fun, 2) -> lists:reverse(fmerge2_1(T1, H2, Fun, T2, []), []); @@ -740,14 +740,14 @@ %% reverse(rmerge(F,reverse(A),reverse(B))) is equal to merge(F,A,B). --spec rmerge(fun((X, Y) -> bool()), [X], [Y]) -> [_]. +-spec rmerge(fun((X, Y) -> boolean()), [X], [Y]) -> [_]. rmerge(Fun, T1, [H2 | T2]) when is_function(Fun, 2) -> lists:reverse(rfmerge2_1(T1, H2, Fun, T2, []), []); rmerge(Fun, T1, []) when is_function(Fun, 2) -> T1. --spec usort(fun((T, T) -> bool()), [T]) -> [T]. +-spec usort(fun((T, T) -> boolean()), [T]) -> [T]. usort(Fun, [_] = L) when is_function(Fun, 2) -> L; @@ -774,7 +774,7 @@ ufsplit_2(Y, L, Fun, [X]) end. --spec umerge(fun((X, Y) -> bool()), [X], [Y]) -> [_]. +-spec umerge(fun((X, Y) -> boolean()), [X], [Y]) -> [_]. umerge(Fun, [], T2) when is_function(Fun, 2) -> T2; @@ -783,7 +783,7 @@ %% reverse(rumerge(F,reverse(A),reverse(B))) is equal to umerge(F,A,B). --spec rumerge(fun((X, Y) -> bool()), [X], [Y]) -> [_]. +-spec rumerge(fun((X, Y) -> boolean()), [X], [Y]) -> [_]. rumerge(Fun, T1, []) when is_function(Fun, 2) -> T1; @@ -928,7 +928,7 @@ %% There are also versions with an extra argument, ExtraArgs, which is a %% list of extra arguments to each call. --spec all(fun((T) -> bool()), [T]) -> bool(). +-spec all(fun((T) -> boolean()), [T]) -> boolean(). all(Pred, [Hd|Tail]) -> case Pred(Hd) of @@ -937,7 +937,7 @@ end; all(Pred, []) when is_function(Pred, 1) -> true. --spec any(fun((T) -> bool()), [T]) -> bool(). +-spec any(fun((T) -> boolean()), [T]) -> boolean(). any(Pred, [Hd|Tail]) -> case Pred(Hd) of @@ -970,7 +970,7 @@ F(Hd, foldr(F, Accu, Tail)); foldr(F, Accu, []) when is_function(F, 2) -> Accu. --spec filter(Pred :: fun((T) -> bool()), List :: [T]) -> [T]. +-spec filter(Pred :: fun((T) -> boolean()), List :: [T]) -> [T]. filter(Pred, List) when is_function(Pred, 1) -> [ E || E <- List, Pred(E) ]. @@ -978,7 +978,7 @@ %% Equivalent to {filter(F, L), filter(NotF, L)}, if NotF = 'fun(X) -> %% not F(X) end'. --spec partition(Pred :: fun((T) -> bool()), List :: [T]) -> {[T], [T]}. +-spec partition(Pred :: fun((T) -> boolean()), List :: [T]) -> {[T], [T]}. partition(Pred, L) -> partition(Pred, L, [], []). @@ -991,7 +991,7 @@ partition(Pred, [], As, Bs) when is_function(Pred, 1) -> {reverse(As), reverse(Bs)}. --spec zf(fun((T) -> bool() | {'true', X}), [T]) -> [(T | X)]. +-spec zf(fun((T) -> boolean() | {'true', X}), [T]) -> [(T | X)]. zf(F, [Hd|Tail]) -> case F(Hd) of @@ -1027,7 +1027,7 @@ {[R|Rs],Accu2}; mapfoldr(F, Accu, []) when is_function(F, 2) -> {[],Accu}. --spec takewhile(fun((T) -> bool()), [T]) -> [T]. +-spec takewhile(fun((T) -> boolean()), [T]) -> [T]. takewhile(Pred, [Hd|Tail]) -> case Pred(Hd) of @@ -1036,7 +1036,7 @@ end; takewhile(Pred, []) when is_function(Pred, 1) -> []. --spec dropwhile(fun((T) -> bool()), [T]) -> [T]. +-spec dropwhile(fun((T) -> boolean()), [T]) -> [T]. dropwhile(Pred, [Hd|Tail]=Rest) -> case Pred(Hd) of @@ -1045,7 +1045,7 @@ end; dropwhile(Pred, []) when is_function(Pred, 1) -> []. --spec splitwith(fun((T) -> bool()), [T]) -> {[T], [T]}. +-spec splitwith(fun((T) -> boolean()), [T]) -> {[T], [T]}. splitwith(Pred, List) when is_function(Pred, 1) -> splitwith(Pred, List, []). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/log_mf_h.erl erlang-13.b.3-dfsg/lib/stdlib/src/log_mf_h.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/log_mf_h.erl 2009-03-12 12:18:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/log_mf_h.erl 2009-11-20 13:29:32.000000000 +0000 @@ -25,37 +25,62 @@ -export([init/1, handle_event/2, handle_info/2, terminate/2]). -export([handle_call/2, code_change/3]). --record(state, {dir, maxB, maxF, curB, curF, cur_fd, index = [], pred}). +%%----------------------------------------------------------------- + +-type dir() :: file:filename(). +-type b() :: non_neg_integer(). +-type f() :: 1..255. +-type pred() :: fun((term()) -> boolean()). + +%%----------------------------------------------------------------- + +-record(state, {dir :: dir(), + maxB :: b(), + maxF :: f(), + curB :: b(), + curF :: f(), + cur_fd :: file:fd(), + index = [], %% Seems unused - take out?? + pred :: pred()}). %%%----------------------------------------------------------------- %%% This module implements an event handler that writes events -%%% to multiple files (configureable). +%%% to multiple files (configurable). %%%----------------------------------------------------------------- %% Func: init/3, init/4 -%% Args: EventMgr = pid() | atom() -%% Dir = string() +%% Args: Dir = string() %% MaxB = integer() %% MaxF = byte() %% Pred = fun(Event) -> boolean() %% Purpose: An event handler. Writes binary events %% to files in the directory Dir. Each file is called -%% 1, 2, 3, ..., MaxF. Writes MaxB bytes on each -%% file. Creates a file called 'index' in the Dir. This -%% file contains the last written FileName. +%% 1, 2, 3, ..., MaxF. Writes MaxB bytes on each file. +%% Creates a file called 'index' in the Dir. +%% This file contains the last written FileName. %% On startup, this file is read, and the next available %% filename is used as first logfile. %% Each event is filtered with the predicate function Pred. %% Reports can be browsed with Report Browser Tool (rb). %% Returns: Args = term() %% The Args term should be used in a call to -%% gen_event:add_handler(EventMgr, log_mf_h, Args). +%% gen_event:add_handler(EventMgr, log_mf_h, Args) +%% EventMgr = pid() | atom(). %%----------------------------------------------------------------- + +-spec init(dir(), b(), f()) -> {dir(), b(), f(), pred()}. + init(Dir, MaxB, MaxF) -> init(Dir, MaxB, MaxF, fun(_) -> true end). + +-spec init(dir(), b(), f(), pred()) -> {dir(), b(), f(), pred()}. + init(Dir, MaxB, MaxF, Pred) -> {Dir, MaxB, MaxF, Pred}. %%----------------------------------------------------------------- %% Call-back functions from gen_event %%----------------------------------------------------------------- + +-spec init({dir(), b(), f(), pred()}) -> {'ok', #state{}} | {'error', term()}. + init({Dir, MaxB, MaxF, Pred}) when is_integer(MaxF), MaxF > 0, MaxF < 256 -> First = case read_index_file(Dir) of @@ -63,20 +88,23 @@ _ -> 1 end, case catch file_open(Dir, First) of - {ok, Fd} -> {ok, #state{dir = Dir, maxB = MaxB, maxF = MaxF, - pred = Pred, - curF = First, cur_fd = Fd, curB = 0}}; + {ok, Fd} -> + {ok, #state{dir = Dir, maxB = MaxB, maxF = MaxF, pred = Pred, + curF = First, cur_fd = Fd, curB = 0}}; Error -> Error end. %%----------------------------------------------------------------- -%% This function may crash! In this case, this +%% The handle_event/2 function may crash! In this case, this %% handler is removed by gen_event from the event handlers. %% Fails: 'file_open' if file:open failed for a log file. %% 'write_index_file' if file:write_file failed for the %% index file. %% {file_exit, Reason} if the current Fd crashes. %%----------------------------------------------------------------- + +-spec handle_event(term(), #state{}) -> {'ok', #state{}}. + handle_event(Event, State) -> #state{curB = CurB, maxB = MaxB, curF = CurF, maxF = MaxF, dir = Dir, cur_fd = CurFd, pred = Pred} = State, @@ -100,24 +128,33 @@ {ok, State} end. +-spec handle_info(term(), #state{}) -> {'ok', #state{}}. + handle_info({emulator, GL, Chars}, State) -> handle_event({emulator, GL, Chars}, State); handle_info(_, State) -> {ok, State}. +-spec terminate(term(), #state{}) -> #state{}. + terminate(_, State) -> ok = file:close(State#state.cur_fd), State. +-spec handle_call('null', #state{}) -> {'ok', 'null', #state{}}. + handle_call(null, State) -> {ok, null, State}. +-spec code_change(term(), #state{}, term()) -> {'ok', #state{}}. + code_change(_OldVsn, State, _Extra) -> {ok, State}. %%----------------------------------------------------------------- -%% Misc functions +%% Misc local functions %%----------------------------------------------------------------- + file_open(Dir, FileNo) -> case file:open(Dir ++ [$/ | integer_to_list(FileNo)], [raw, write]) of {ok, Fd} -> @@ -130,7 +167,7 @@ put_int16(I) -> [((I band 16#ff00) bsr 8),I band 16#ff]. -tag_event(Event) -> +tag_event(Event) -> {erlang:localtime(), Event}. read_index_file(Dir) -> @@ -149,6 +186,7 @@ %% Write the index file. This file contains one binary with %% the last used filename (an integer). %%----------------------------------------------------------------- + write_index_file(Dir, Index) -> case file:open(Dir ++ "/index", [raw, write]) of {ok, Fd} -> diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/ms_transform.erl erlang-13.b.3-dfsg/lib/stdlib/src/ms_transform.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/ms_transform.erl 2009-03-12 12:20:32.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/ms_transform.erl 2009-11-20 13:31:32.000000000 +0000 @@ -692,7 +692,6 @@ _ -> throw({error,Line,{?ERR_HEADBADREC,RName}}) end; - th({match,Line,_,_},_) -> throw({error,Line,?ERR_HEADMATCH}); th({atom,Line,A},B) -> @@ -727,28 +726,30 @@ {list_to_tuple(L),NB}; th(Nonstruct,B) -> {Nonstruct,B}. -% Could be more efficient... -check_multi_field(_,_,[],_) -> + +%% Could be more efficient... +check_multi_field(_, _, [], _) -> ok; check_multi_field(RName, Line, [{Key,_}|T], ErrCode) -> - case lists:keysearch(Key,1,T) of - {value,_} -> + case lists:keymember(Key,1,T) of + true -> throw({error,Line,{ErrCode,RName,Key}}); - _ -> + false -> check_multi_field(RName, Line, T, ErrCode) end. -check_undef_field(_,_,[],_,_) -> +check_undef_field(_, _, [], _, _) -> ok; check_undef_field(RName, Line, [{Key,_}|T], FieldList, ErrCode) -> - case lists:keysearch(Key,1,FieldList) of - {value,_} -> + case lists:keymember(Key, 1, FieldList) of + true -> check_undef_field(RName, Line, T, FieldList, ErrCode); - _ -> + false -> throw({error,Line,{ErrCode,RName,Key}}) end. cre_bind() -> {1,[{'_','_'}]}. + lkup_bind(Name,{_,List}) -> case lists:keysearch(Name,1,List) of {value, {Name, Trans}} -> @@ -756,6 +757,7 @@ _ -> undefined end. + new_bind({Name,Trans},{Next,L}) -> {Next,[{Name,Trans}|L]}; new_bind(Name,{Next,L}) -> @@ -953,7 +955,7 @@ freeze(Line,Term) -> {frozen,Line,Term}. -% Most of this is bluntly stolen from erl_parse. +%% Most of this is bluntly stolen from erl_parse. normalise({frozen,_,Term}) -> Term; @@ -978,7 +980,7 @@ normalise({op,_,'+',{char,_,I}}) -> I; normalise({op,_,'+',{integer,_,I}}) -> I; normalise({op,_,'+',{float,_,F}}) -> F; -normalise({op,_,'-',{char,_,I}}) -> -I; %Weird, but compatible! +normalise({op,_,'-',{char,_,I}}) -> -I; % Weird, but compatible! normalise({op,_,'-',{integer,_,I}}) -> -I; normalise({op,_,'-',{float,_,F}}) -> -F. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/orddict.erl erlang-13.b.3-dfsg/lib/stdlib/src/orddict.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/orddict.erl 2009-04-16 10:23:36.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/orddict.erl 2009-09-18 15:06:57.000000000 +0100 @@ -35,7 +35,7 @@ new() -> []. --spec is_key(Key::term(), Dictionary::orddict()) -> bool(). +-spec is_key(Key::term(), Dictionary::orddict()) -> boolean(). is_key(Key, [{K,_}|_]) when Key < K -> false; is_key(Key, [{K,_}|Dict]) when Key > K -> is_key(Key, Dict); diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/ordsets.erl erlang-13.b.3-dfsg/lib/stdlib/src/ordsets.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/ordsets.erl 2009-04-16 10:23:38.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/ordsets.erl 2009-11-20 13:29:34.000000000 +0000 @@ -26,19 +26,19 @@ -export([subtract/2,is_subset/2]). -export([fold/3,filter/2]). --type ordset() :: [_]. +-type ordset(T) :: [T]. %% new() -> Set. %% Return a new empty ordered set. --spec new() -> ordset(). +-spec new() -> ordset(term()). new() -> []. -%% is_set(Term) -> bool(). +%% is_set(Term) -> boolean(). %% Return 'true' if Set is an ordered set of elements, else 'false'. --spec is_set(term()) -> bool(). +-spec is_set(term()) -> boolean(). is_set([E|Es]) -> is_set(Es, E); is_set([]) -> true; @@ -52,29 +52,29 @@ %% size(OrdSet) -> int(). %% Return the number of elements in OrdSet. --spec size(ordset()) -> non_neg_integer(). +-spec size(ordset(_)) -> non_neg_integer(). size(S) -> length(S). %% to_list(OrdSet) -> [Elem]. %% Return the elements in OrdSet as a list. --spec to_list(ordset()) -> [term()]. +-spec to_list(ordset(T)) -> [T]. to_list(S) -> S. %% from_list([Elem]) -> Set. %% Build an ordered set from the elements in List. --spec from_list([term()]) -> ordset(). +-spec from_list([T]) -> ordset(T). from_list(L) -> lists:usort(L). -%% is_element(Element, OrdSet) -> bool(). +%% is_element(Element, OrdSet) -> boolean(). %% Return 'true' if Element is an element of OrdSet, else 'false'. --spec is_element(term(), ordset()) -> bool(). +-spec is_element(term(), ordset(_)) -> boolean(). is_element(E, [H|Es]) when E > H -> is_element(E, Es); is_element(E, [H|_]) when E < H -> false; @@ -84,7 +84,7 @@ %% add_element(Element, OrdSet) -> OrdSet. %% Return OrdSet with Element inserted in it. --spec add_element(term(), ordset()) -> ordset(). +-spec add_element(term(), ordset(_)) -> ordset(_). add_element(E, [H|Es]) when E > H -> [H|add_element(E, Es)]; add_element(E, [H|_]=Set) when E < H -> [E|Set]; @@ -94,7 +94,7 @@ %% del_element(Element, OrdSet) -> OrdSet. %% Return OrdSet but with Element removed. --spec del_element(term(), ordset()) -> ordset(). +-spec del_element(term(), ordset(_)) -> ordset(_). del_element(E, [H|Es]) when E > H -> [H|del_element(E, Es)]; del_element(E, [H|_]=Set) when E < H -> Set; @@ -104,7 +104,7 @@ %% union(OrdSet1, OrdSet2) -> OrdSet %% Return the union of OrdSet1 and OrdSet2. --spec union(ordset(), ordset()) -> ordset(). +-spec union(ordset(_), ordset(_)) -> ordset(_). union([E1|Es1], [E2|_]=Set2) when E1 < E2 -> [E1|union(Es1, Set2)]; @@ -118,7 +118,7 @@ %% union([OrdSet]) -> OrdSet %% Return the union of the list of ordered sets. --spec union([ordset()]) -> ordset(). +-spec union([ordset(_)]) -> ordset(_). union([S1,S2|Ss]) -> union1(union(S1, S2), Ss); @@ -131,7 +131,7 @@ %% intersection(OrdSet1, OrdSet2) -> OrdSet. %% Return the intersection of OrdSet1 and OrdSet2. --spec intersection(ordset(), ordset()) -> ordset(). +-spec intersection(ordset(_), ordset(_)) -> ordset(_). intersection([E1|Es1], [E2|_]=Set2) when E1 < E2 -> intersection(Es1, Set2); @@ -147,7 +147,7 @@ %% intersection([OrdSet]) -> OrdSet. %% Return the intersection of the list of ordered sets. --spec intersection([ordset()]) -> ordset(). +-spec intersection([ordset(_)]) -> ordset(_). intersection([S1,S2|Ss]) -> intersection1(intersection(S1, S2), Ss); @@ -157,10 +157,10 @@ intersection1(intersection(S1, S2), Ss); intersection1(S1, []) -> S1. -%% is_disjoint(OrdSet1, OrdSet2) -> true|false. +%% is_disjoint(OrdSet1, OrdSet2) -> boolean(). %% Check whether OrdSet1 and OrdSet2 are disjoint. --spec is_disjoint(ordset(), ordset()) -> bool(). +-spec is_disjoint(ordset(_), ordset(_)) -> boolean(). is_disjoint([E1|Es1], [E2|_]=Set2) when E1 < E2 -> is_disjoint(Es1, Set2); @@ -177,7 +177,7 @@ %% Return all and only the elements of OrdSet1 which are not also in %% OrdSet2. --spec subtract(ordset(), ordset()) -> ordset(). +-spec subtract(ordset(_), ordset(_)) -> ordset(_). subtract([E1|Es1], [E2|_]=Set2) when E1 < E2 -> [E1|subtract(Es1, Set2)]; @@ -188,11 +188,11 @@ subtract([], _) -> []; subtract(Es1, []) -> Es1. -%% is_subset(OrdSet1, OrdSet2) -> bool(). +%% is_subset(OrdSet1, OrdSet2) -> boolean(). %% Return 'true' when every element of OrdSet1 is also a member of %% OrdSet2, else 'false'. --spec is_subset(ordset(), ordset()) -> bool(). +-spec is_subset(ordset(_), ordset(_)) -> boolean(). is_subset([E1|_], [E2|_]) when E1 < E2 -> %E1 not in Set2 false; @@ -206,7 +206,7 @@ %% fold(Fun, Accumulator, OrdSet) -> Accumulator. %% Fold function Fun over all elements in OrdSet and return Accumulator. --spec fold(fun((_, _) -> _), _, ordset()) -> _. +-spec fold(fun((_, _) -> _), _, ordset(_)) -> _. fold(F, Acc, Set) -> lists:foldl(F, Acc, Set). @@ -214,7 +214,7 @@ %% filter(Fun, OrdSet) -> OrdSet. %% Filter OrdSet with Fun. --spec filter(fun((_) -> bool()), ordset()) -> ordset(). +-spec filter(fun((_) -> boolean()), ordset(_)) -> ordset(_). filter(F, Set) -> lists:filter(F, Set). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/otp_internal.erl erlang-13.b.3-dfsg/lib/stdlib/src/otp_internal.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/otp_internal.erl 2009-06-05 13:53:18.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/otp_internal.erl 2009-11-20 13:30:56.000000000 +0000 @@ -260,10 +260,7 @@ obsolete_1(httpd, unblock, 2) -> {deprecated,{httpd,reload_config,2},"R14B"}; obsolete_1(httpd_util, key1search, 2) -> {removed,{proplists,get_value,2},"R13B"}; obsolete_1(httpd_util, key1search, 3) -> {removed,{proplists,get_value,3},"R13B"}; -obsolete_1(ftp, open, 1) -> {deprecated,{inets,start,[2,3]},"R14B"}; -obsolete_1(ftp, open, 2) -> {deprecated,{inets,start,[2,3]},"R14B"}; obsolete_1(ftp, open, 3) -> {deprecated,{inets,start,[2,3]},"R14B"}; -obsolete_1(ftp, close, 1) -> {deprecated,{inets,stop,2},"R14B"}; obsolete_1(ftp, force_active, 1) -> {deprecated,{inets,start,[2,3]},"R14B"}; %% Added in R12B-4. @@ -342,7 +339,7 @@ no. --spec is_snmp_agent_function(atom(), byte()) -> bool(). +-spec is_snmp_agent_function(atom(), byte()) -> boolean(). is_snmp_agent_function(c, 1) -> true; is_snmp_agent_function(c, 2) -> true; diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/pg.erl erlang-13.b.3-dfsg/lib/stdlib/src/pg.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/pg.erl 2009-03-12 12:18:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/pg.erl 2009-09-18 15:07:05.000000000 +0100 @@ -35,7 +35,9 @@ %% Create a brand new empty process group with the master residing %% at the local node -create(PgName) -> +-spec create(term()) -> 'ok' | {'error', term()}. + +create(PgName) -> catch begin check(PgName), Pid = spawn(pg,master,[PgName]), global:register_name(PgName,Pid), @@ -44,25 +46,29 @@ %% Create a brand new empty process group with the master %% residing at Node -create(PgName,Node) -> +-spec create(term(), node()) -> 'ok' | {'error', term()}. + +create(PgName, Node) -> catch begin check(PgName), Pid = spawn(Node,pg,master,[PgName]), global:register_name(PgName,Pid), ok end. -%% Have a process on Node that will act as a standby for -%% the process group manager. So if the node where the -%% manager runs fails, the process group will continue -%% to function. +%% Have a process on Node that will act as a standby for the process +%% group manager. So if the node where the manager runs fails, the +%% process group will continue to function. + +-spec standby(term(), node()) -> 'ok'. standby(_PgName, _Node) -> ok. - %% Tell process group PgName that Pid is a new member of the group %% synchronously return a list of all old members in the group -join(PgName,Pid) when is_atom(PgName) -> +-spec join(atom(), pid()) -> [pid()]. + +join(PgName, Pid) when is_atom(PgName) -> global:send(PgName, {join,self(),Pid}), receive {_P,{members,Members}} -> @@ -71,22 +77,31 @@ %% Multi cast Mess to all members in the group -send(PgName,Mess) when is_atom(PgName) -> - global:send(PgName, {send, self(), Mess}); -send(Pg,Mess) when is_pid(Pg) -> - Pg ! {send,self(),Mess}. +-spec send(atom() | pid(), term()) -> 'ok'. +send(PgName, Mess) when is_atom(PgName) -> + global:send(PgName, {send, self(), Mess}), + ok; +send(Pg, Mess) when is_pid(Pg) -> + Pg ! {send,self(),Mess}, + ok. %% multi cast a message to all members in the group but ourselves %% If we are a member -esend(PgName,Mess) when is_atom(PgName) -> - global:send(PgName,{esend,self(),Mess}); -esend(Pg,Mess) when is_pid(Pg) -> - Pg ! {esend,self(),Mess}. +-spec esend(atom() | pid(), term()) -> 'ok'. + +esend(PgName, Mess) when is_atom(PgName) -> + global:send(PgName, {esend,self(),Mess}), + ok; +esend(Pg, Mess) when is_pid(Pg) -> + Pg ! {esend,self(),Mess}, + ok. %% Return the members of the group +-spec members(atom() | pid()) -> [pid()]. + members(PgName) when is_atom(PgName) -> global:send(PgName, {self() ,members}), receive @@ -100,12 +115,16 @@ Members end. +-spec name_to_pid(atom()) -> pid() | 'undefined'. + name_to_pid(PgName) when is_atom(PgName) -> global:whereis_name(PgName). +-spec master(term()) -> no_return(). + master(PgName) -> - process_flag(trap_exit,true), - master_loop(PgName,[]). + process_flag(trap_exit, true), + master_loop(PgName, []). master_loop(PgName,Members) -> receive @@ -134,14 +153,13 @@ false -> Members end, - master_loop(PgName,L) - + master_loop(PgName,L) end. -send_all([],_) -> done; -send_all([P|Tail],M) -> +send_all([], _) -> ok; +send_all([P|Ps], M) -> P ! M, - send_all(Tail,M). + send_all(Ps, M). %% Check if the process group already exists @@ -152,7 +170,3 @@ undefined -> ok end. - - - - diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/pool.erl erlang-13.b.3-dfsg/lib/stdlib/src/pool.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/pool.erl 2009-03-12 12:18:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/pool.erl 2009-09-18 15:07:05.000000000 +0100 @@ -48,14 +48,16 @@ handle_info/2, terminate/2]). --import(gen_server, [call/2]). - %% User interface %% Start up using the .hosts.erlang file -start(Name) -> + +-spec start(atom()) -> [node()]. +start(Name) -> start(Name,[]). -start(Name,Args) when is_atom(Name) -> + +-spec start(atom(), string()) -> [node()]. +start(Name, Args) when is_atom(Name) -> gen_server:start({global, pool_master}, pool, [], []), Hosts = net_adm:host_file(), Nodes = start_nodes(Hosts, Name, Args), @@ -65,13 +67,30 @@ %% %% Interface functions ... %% -get_nodes() -> get_elements(2,get_nodes_and_load()). -attach(Node) -> call({global, pool_master}, {attach, Node}). -get_nodes_and_load() -> call({global, pool_master},get_nodes). -get_node() -> call({global, pool_master},get_node). -pspawn(M,F,A) -> call({global, pool_master}, - {spawn, group_leader(), M,F,A}). -pspawn_link(M,F,A) -> P = pspawn(M,F,A),link(P), P. +-spec get_nodes() -> [node()]. +get_nodes() -> + get_elements(2, get_nodes_and_load()). + +-spec attach(node()) -> 'already_attached' | 'attached'. +attach(Node) -> + gen_server:call({global, pool_master}, {attach, Node}). + +get_nodes_and_load() -> + gen_server:call({global, pool_master}, get_nodes). + +-spec get_node() -> node(). +get_node() -> + gen_server:call({global, pool_master}, get_node). + +-spec pspawn(module(), atom(), [term()]) -> pid(). +pspawn(M, F, A) -> + gen_server:call({global, pool_master}, {spawn, group_leader(), M, F, A}). + +-spec pspawn_link(module(), atom(), [term()]) -> pid(). +pspawn_link(M, F, A) -> + P = pspawn(M, F, A), + link(P), + P. start_nodes([], _, _) -> []; start_nodes([Host|Tail], Name, Args) -> @@ -83,14 +102,16 @@ [Node | start_nodes(Tail, Name, Args)] end. -stop() -> call({global, pool_master}, stop). +-spec stop() -> 'stopped'. +stop() -> + gen_server:call({global, pool_master}, stop). get_elements(_Pos,[]) -> []; get_elements(Pos,[E|T]) -> [element(Pos,E) | get_elements(Pos,T)]. stop_em([]) -> stopped; stop_em([N|Tail]) -> - rpc:cast(N,erlang,halt,[]), + rpc:cast(N, erlang, halt, []), stop_em(Tail). init([]) -> @@ -100,25 +121,21 @@ handle_call(get_nodes, _From, Nodes)-> {reply, Nodes, Nodes}; - handle_call(get_node, _From, [{Load,N}|Tail]) -> {reply, N, Tail++[{Load+1, N}]}; - handle_call({attach, Node}, _From, Nodes) -> - case lists:keysearch(Node,2,Nodes) of - {value,_} -> + case lists:keymember(Node, 2, Nodes) of + true -> {reply, already_attached, Nodes}; false -> erlang:monitor_node(Node, true), spawn_link(Node, pool, statistic_collector, []), {reply, attached, Nodes++[{999999,Node}]} end; - -handle_call({spawn,Gl, M, F, A}, _From, Nodes) -> +handle_call({spawn, Gl, M, F, A}, _From, Nodes) -> [{Load,N}|Tail] = Nodes, Pid = spawn(N, pool, do_spawn, [Gl, M, F, A]), {reply, Pid, Tail++[{Load+1, N}]}; - handle_call(stop, _From, Nodes) -> %% clean up in terminate/2 {stop, normal, stopped, Nodes}. @@ -127,12 +144,10 @@ {noreply, Nodes}. handle_info({Node,load,Load}, Nodes) -> - Nodes2 = insert_node({Load,Node},Nodes), + Nodes2 = insert_node({Load,Node}, Nodes), {noreply, Nodes2}; - handle_info({nodedown, Node}, Nodes) -> - {noreply, lists:keydelete(Node,2,Nodes)}; - + {noreply, lists:keydelete(Node, 2, Nodes)}; handle_info(_, Nodes) -> %% The EXIT signals etc.etc {noreply, Nodes}. @@ -141,9 +156,10 @@ stop_em(N), ok. +-spec do_spawn(pid(), module(), atom(), [term()]) -> term(). do_spawn(Gl, M, F, A) -> - group_leader(Gl,self()), - apply(M,F,A). + group_leader(Gl, self()), + apply(M, F, A). insert_node({Load,Node},[{L,Node}|Tail]) when Load > L -> %% We have a raised load here @@ -158,16 +174,15 @@ error_logger:error_msg("Pool_master: Bad node list X=~w\n", [X]), exit(crash). - pure_insert({Load,Node},[]) -> [{Load,Node}]; pure_insert({Load,Node},[{L,N}|Tail]) when Load < L -> - [{Load,Node} , {L,N} | Tail]; + [{Load,Node}, {L,N} | Tail]; pure_insert(L,[H|T]) -> [H|pure_insert(L,T)]. -%% Really should not meassure the contributions from +%% Really should not measure the contributions from %% the back ground processes here .... which we do :-( -%% We don';t have to monitor the master, since we're slaves anyway +%% We don't have to monitor the master, since we're slaves anyway statistic_collector() -> statistic_collector(5). @@ -179,25 +194,19 @@ undefined -> statistic_collector(I-1); M -> - stat_loop(M,999999) + stat_loop(M, 999999) end. %% Do not tell the master about our load if it has not changed -stat_loop(M,Old) -> +stat_loop(M, Old) -> sleep(2000), case statistics(run_queue) of Old -> - stat_loop(M,Old); + stat_loop(M, Old); NewLoad -> - M ! {node(),load,NewLoad}, %% async - stat_loop(M,NewLoad) + M ! {node(), load, NewLoad}, %% async + stat_loop(M, NewLoad) end. sleep(I) -> receive after I -> ok end. - - - - - - diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/proc_lib.erl erlang-13.b.3-dfsg/lib/stdlib/src/proc_lib.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/proc_lib.erl 2009-03-12 12:18:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/proc_lib.erl 2009-09-18 15:07:06.000000000 +0100 @@ -21,14 +21,12 @@ %% This module is used to set some initial information %% in each created process. %% Then a process terminates the Reason is checked and -%% an crash report is generated if the Reason was not -%% expected. -%% +%% a crash report is generated if the Reason was not expected. --export([spawn/1,spawn_link/1, spawn/2, spawn_link/2, - spawn/3,spawn_link/3,spawn/4,spawn_link/4, +-export([spawn/1, spawn_link/1, spawn/2, spawn_link/2, + spawn/3, spawn_link/3, spawn/4, spawn_link/4, spawn_opt/2, spawn_opt/3, spawn_opt/4, spawn_opt/5, - start/3, start/4, start/5, start_link/3, start_link/4,start_link/5, + start/3, start/4, start/5, start_link/3, start_link/4, start_link/5, hibernate/3, init_ack/1, init_ack/2, init_p/3,init_p/5,format/1,initial_call/1,translate_initial_call/1]). @@ -36,69 +34,103 @@ %% Internal exports. -export([wake_up/3]). +%%----------------------------------------------------------------------------- + +-type priority_level() :: 'high' | 'low' | 'max' | 'normal'. +-type spawn_option() :: 'link' + | {'priority', priority_level()} + | {'min_heap_size', non_neg_integer()} + | {'fullsweep_after', non_neg_integer()}. + +-type dict_or_pid() :: pid() | [_] | {integer(), integer(), integer()}. + +%%----------------------------------------------------------------------------- + +-spec spawn(function()) -> pid(). + spawn(F) when is_function(F) -> Parent = get_my_name(), Ancestors = get_ancestors(), - erlang:spawn(proc_lib,init_p,[Parent,Ancestors,F]). + erlang:spawn(?MODULE, init_p, [Parent,Ancestors,F]). + +-spec spawn(atom(), atom(), [term()]) -> pid(). spawn(M,F,A) when is_atom(M), is_atom(F), is_list(A) -> Parent = get_my_name(), Ancestors = get_ancestors(), - erlang:spawn(proc_lib,init_p,[Parent,Ancestors,M,F,A]). + erlang:spawn(?MODULE, init_p, [Parent,Ancestors,M,F,A]). + +-spec spawn_link(function()) -> pid(). spawn_link(F) when is_function(F) -> Parent = get_my_name(), Ancestors = get_ancestors(), - erlang:spawn_link(proc_lib,init_p,[Parent,Ancestors,F]). + erlang:spawn_link(?MODULE, init_p, [Parent,Ancestors,F]). + +-spec spawn_link(atom(), atom(), [term()]) -> pid(). spawn_link(M,F,A) when is_atom(M), is_atom(F), is_list(A) -> Parent = get_my_name(), Ancestors = get_ancestors(), - erlang:spawn_link(proc_lib,init_p,[Parent,Ancestors,M,F,A]). + erlang:spawn_link(?MODULE, init_p, [Parent,Ancestors,M,F,A]). + +-spec spawn(node(), function()) -> pid(). spawn(Node, F) when is_function(F) -> Parent = get_my_name(), Ancestors = get_ancestors(), - erlang:spawn(Node,proc_lib,init_p,[Parent,Ancestors,F]). + erlang:spawn(Node, ?MODULE, init_p, [Parent,Ancestors,F]). -spawn(Node,M,F,A) when is_atom(M), is_atom(F), is_list(A) -> +-spec spawn(node(), atom(), atom(), [term()]) -> pid(). +spawn(Node, M, F, A) when is_atom(M), is_atom(F), is_list(A) -> Parent = get_my_name(), Ancestors = get_ancestors(), - erlang:spawn(Node,proc_lib,init_p,[Parent,Ancestors,M,F,A]). + erlang:spawn(Node, ?MODULE, init_p, [Parent,Ancestors,M,F,A]). + +-spec spawn_link(node(), function()) -> pid(). -spawn_link(Node,F) when is_function(F) -> +spawn_link(Node, F) when is_function(F) -> Parent = get_my_name(), Ancestors = get_ancestors(), - erlang:spawn_link(Node,proc_lib,init_p,[Parent,Ancestors,F]). + erlang:spawn_link(Node, ?MODULE, init_p, [Parent,Ancestors,F]). -spawn_link(Node,M,F,A) when is_atom(M), is_atom(F), is_list(A) -> +-spec spawn_link(node(), atom(), atom(), [term()]) -> pid(). + +spawn_link(Node, M, F, A) when is_atom(M), is_atom(F), is_list(A) -> Parent = get_my_name(), Ancestors = get_ancestors(), - erlang:spawn_link(Node,proc_lib,init_p,[Parent,Ancestors,M,F,A]). + erlang:spawn_link(Node, ?MODULE, init_p, [Parent,Ancestors,M,F,A]). +-spec spawn_opt(function(), [spawn_option()]) -> pid(). spawn_opt(F, Opts) when is_function(F) -> Parent = get_my_name(), Ancestors = get_ancestors(), check_for_monitor(Opts), - erlang:spawn_opt(proc_lib,init_p,[Parent,Ancestors,F],Opts). + erlang:spawn_opt(?MODULE, init_p, [Parent,Ancestors,F],Opts). + +-spec spawn_opt(node(), function(), [spawn_option()]) -> pid(). spawn_opt(Node, F, Opts) when is_function(F) -> Parent = get_my_name(), Ancestors = get_ancestors(), check_for_monitor(Opts), - erlang:spawn_opt(Node,proc_lib,init_p,[Parent,Ancestors,F],Opts). + erlang:spawn_opt(Node, ?MODULE, init_p, [Parent,Ancestors,F], Opts). + +-spec spawn_opt(atom(), atom(), [term()], [spawn_option()]) -> pid(). -spawn_opt(M,F,A,Opts) when is_atom(M), is_atom(F), is_list(A) -> +spawn_opt(M, F, A, Opts) when is_atom(M), is_atom(F), is_list(A) -> Parent = get_my_name(), Ancestors = get_ancestors(), check_for_monitor(Opts), - erlang:spawn_opt(proc_lib,init_p,[Parent,Ancestors,M,F,A],Opts). + erlang:spawn_opt(?MODULE, init_p, [Parent,Ancestors,M,F,A], Opts). -spawn_opt(Node,M,F,A,Opts) when is_atom(M), is_atom(F), is_list(A) -> +-spec spawn_opt(node(), atom(), atom(), [term()], [spawn_option()]) -> pid(). + +spawn_opt(Node, M, F, A, Opts) when is_atom(M), is_atom(F), is_list(A) -> Parent = get_my_name(), Ancestors = get_ancestors(), check_for_monitor(Opts), - erlang:spawn_opt(Node,proc_lib,init_p,[Parent,Ancestors,M,F,A],Opts). + erlang:spawn_opt(Node, ?MODULE, init_p, [Parent,Ancestors,M,F,A], Opts). %% OTP-6345 %% monitor spawn_opt option is currently not possible to use @@ -110,8 +142,10 @@ false end. -hibernate(M,F,A) when is_atom(M), is_atom(F), is_list(A) -> - erlang:hibernate(proc_lib, wake_up, [M,F,A]). +-spec hibernate(module(), atom(), [term()]) -> no_return(). + +hibernate(M, F, A) when is_atom(M), is_atom(F), is_list(A) -> + erlang:hibernate(?MODULE, wake_up, [M, F, A]). ensure_link(SpawnOpts) -> case lists:member(link, SpawnOpts) of @@ -121,9 +155,10 @@ [link|SpawnOpts] end. +-spec init_p(pid(), [pid()], function()) -> term(). -init_p(Parent,Ancestors,Fun) when is_function(Fun) -> - put('$ancestors',[Parent|Ancestors]), +init_p(Parent, Ancestors, Fun) when is_function(Fun) -> + put('$ancestors', [Parent|Ancestors]), {module,Mod} = erlang:fun_info(Fun, module), {name,Name} = erlang:fun_info(Fun, name), {arity,Arity} = erlang:fun_info(Fun, arity), @@ -135,7 +170,9 @@ exit_p(Class, Reason) end. -init_p(Parent,Ancestors,M,F,A) when is_atom(M), is_atom(F), is_list(A) -> +-spec init_p(pid(), [pid()], atom(), atom(), [term()]) -> term(). + +init_p(Parent, Ancestors, M, F, A) when is_atom(M), is_atom(F), is_list(A) -> put('$ancestors', [Parent|Ancestors]), put('$initial_call', trans_init(M, F, A)), init_p_do_apply(M, F, A). @@ -148,6 +185,8 @@ exit_p(Class, Reason) end. +-spec wake_up(atom(), atom(), [term()]) -> term(). + wake_up(M, F, A) when is_atom(M), is_atom(F), is_list(A) -> try apply(M, F, A) @@ -169,26 +208,38 @@ exit(Reason) end. -start(M,F,A) when is_atom(M), is_atom(F), is_list(A) -> - start(M,F,A,infinity). +-spec start(atom(), atom(), [term()]) -> term(). + +start(M, F, A) when is_atom(M), is_atom(F), is_list(A) -> + start(M, F, A, infinity). -start(M,F,A,Timeout) when is_atom(M), is_atom(F), is_list(A) -> - Pid = proc_lib:spawn(M,F,A), +-spec start(atom(), atom(), [term()], timeout()) -> term(). + +start(M, F, A, Timeout) when is_atom(M), is_atom(F), is_list(A) -> + Pid = ?MODULE:spawn(M, F, A), sync_wait(Pid, Timeout). -start(M,F,A,Timeout,SpawnOpts) when is_atom(M), is_atom(F), is_list(A) -> - Pid = proc_lib:spawn_opt(M, F, A, SpawnOpts), +-spec start(atom(), atom(), [term()], timeout(), [spawn_option()]) -> term(). + +start(M, F, A, Timeout, SpawnOpts) when is_atom(M), is_atom(F), is_list(A) -> + Pid = ?MODULE:spawn_opt(M, F, A, SpawnOpts), sync_wait(Pid, Timeout). -start_link(M,F,A) when is_atom(M), is_atom(F), is_list(A) -> - start_link(M,F,A,infinity). +-spec start_link(atom(), atom(), [term()]) -> term(). -start_link(M,F,A,Timeout) when is_atom(M), is_atom(F), is_list(A) -> - Pid = proc_lib:spawn_link(M,F,A), +start_link(M, F, A) when is_atom(M), is_atom(F), is_list(A) -> + start_link(M, F, A, infinity). + +-spec start_link(atom(), atom(), [term()], timeout()) -> term(). + +start_link(M, F, A, Timeout) when is_atom(M), is_atom(F), is_list(A) -> + Pid = ?MODULE:spawn_link(M, F, A), sync_wait(Pid, Timeout). +-spec start_link(atom(),atom(),[term()],timeout(),[spawn_option()]) -> term(). + start_link(M,F,A,Timeout,SpawnOpts) when is_atom(M), is_atom(F), is_list(A) -> - Pid = proc_lib:spawn_opt(M, F, A, ensure_link(SpawnOpts)), + Pid = ?MODULE:spawn_opt(M, F, A, ensure_link(SpawnOpts)), sync_wait(Pid, Timeout). sync_wait(Pid, Timeout) -> @@ -204,6 +255,8 @@ {error, timeout} end. +-spec flush(pid()) -> 'true'. + flush(Pid) -> receive {'EXIT', Pid, _} -> @@ -211,10 +264,14 @@ after 0 -> true end. - + +-spec init_ack(pid(), term()) -> 'ok'. + init_ack(Parent, Return) -> - Parent ! {ack, self(), Return}. + Parent ! {ack, self(), Return}, + ok. +-spec init_ack(term()) -> 'ok'. init_ack(Return) -> [Parent|_] = get('$ancestors'), init_ack(Parent, Return). @@ -223,6 +280,8 @@ %% Fetch the initial call of a proc_lib spawned process. %% ----------------------------------------------------- +-spec initial_call(dict_or_pid()) -> {atom(), atom(), [atom()]} | 'false'. + initial_call(DictOrPid) -> case raw_initial_call(DictOrPid) of {M,F,A} -> @@ -244,12 +303,14 @@ %% This function is typically called from c:i() and c:regs(). %% ----------------------------------------------------- +-spec translate_initial_call(dict_or_pid()) -> mfa(). + translate_initial_call(DictOrPid) -> case raw_initial_call(DictOrPid) of {_,_,_}=MFA -> MFA; false -> - {proc_lib,init_p,5} + {?MODULE,init_p,5} end. %% ----------------------------------------------------- @@ -257,26 +318,26 @@ %% in the process dictionary. %% ----------------------------------------------------- -raw_initial_call({X,Y,Z}) when is_integer(X),is_integer(Y),is_integer(Z) -> +raw_initial_call({X,Y,Z}) when is_integer(X), is_integer(Y), is_integer(Z) -> raw_initial_call(c:pid(X,Y,Z)); raw_initial_call(Pid) when is_pid(Pid) -> - case get_process_info(Pid,dictionary) of + case get_process_info(Pid, dictionary) of {dictionary,Dict} -> raw_init_call(Dict); _ -> false end; raw_initial_call(ProcInfo) when is_list(ProcInfo) -> - case lists:keysearch(dictionary,1,ProcInfo) of - {value,{dictionary,Dict}} -> + case lists:keyfind(dictionary, 1, ProcInfo) of + {dictionary,Dict} -> raw_init_call(Dict); _ -> false end. raw_init_call(Dict) -> - case lists:keysearch('$initial_call', 1, Dict) of - {value,{_,{_,_,_}=MFA}} -> + case lists:keyfind('$initial_call', 1, Dict) of + {_,{_,_,_}=MFA} -> MFA; _ -> false @@ -340,6 +401,8 @@ get_process_info(self(), reductions) ]. +-spec get_ancestors(pid()) -> {'ancestors', [pid()]}. + get_ancestors(Pid) -> case get_dictionary(Pid,'$ancestors') of {'$ancestors',Ancestors} -> @@ -373,21 +436,20 @@ _ -> undefined end. - linked_info(Pid) -> make_neighbour_reports1(neighbours(Pid)). -make_neighbour_reports1([P| Ps]) -> +make_neighbour_reports1([P|Ps]) -> ReportBody = make_neighbour_report(P), - % - % Process P might have been deleted. - % + %% + %% Process P might have been deleted. + %% case lists:member(undefined, ReportBody) of true -> make_neighbour_reports1(Ps); false -> - [{neighbour, ReportBody}| make_neighbour_reports1(Ps)] + [{neighbour, ReportBody}|make_neighbour_reports1(Ps)] end; make_neighbour_reports1([]) -> []. @@ -409,56 +471,59 @@ ]. get_initial_call(Pid) -> - case get_dictionary(Pid,'$initial_call') of - {'$initial_call',{M,F,A}} -> - {initial_call,{M,F,make_dummy_args(A, [])}}; + case get_dictionary(Pid, '$initial_call') of + {'$initial_call', {M, F, A}} -> + {initial_call, {M, F, make_dummy_args(A, [])}}; _ -> - get_process_info(Pid,initial_call) + get_process_info(Pid, initial_call) end. -% neighbours(Pid) = list of Pids -% -% Get the neighbours of Pid. A neighbour is a process which is -% linked to Pid and does not trap exit; or a neigbour of a -% neighbour etc. -% -% A breadth-first search is performed. -% +%% neighbours(Pid) = list of Pids +%% +%% Get the neighbours of Pid. A neighbour is a process which is +%% linked to Pid and does not trap exit; or a neigbour of a +%% neighbour etc. +%% +%% A breadth-first search is performed. -max_neighbours() -> 15. +-spec neighbours(pid()) -> [pid()]. neighbours(Pid) -> {_, Visited} = visit(adjacents(Pid), {max_neighbours(), [Pid]}), - lists:delete(Pid,Visited). + lists:delete(Pid, Visited). -% -% visit(Ps, {N, Vs}, Max) = {N0, V0s} -% -% A breadth-first search of neighbours. -% Ps processes, -% Vs visited processes, -% N max number to visit. -% -visit([P| Ps], {N, Vs}) when N > 0 -> +max_neighbours() -> 15. + +%% +%% visit(Ps, {N, Vs}) = {N0, V0s} +%% +%% A breadth-first search of neighbours. +%% Ps processes, +%% Vs visited processes, +%% N max number to visit. +%% +visit([P|Ps], {N, Vs} = NVs) when N > 0 -> case lists:member(P, Vs) of - false -> visit(adjacents(P), visit(Ps, {N-1, [P| Vs]})); - true -> visit(Ps, {N, Vs}) + false -> visit(adjacents(P), visit(Ps, {N-1, [P|Vs]})); + true -> visit(Ps, NVs) end; -visit(_, {N, Vs}) -> - {N, Vs}. - -% -% adjacents(Pid) = AdjacencyList -% +visit(_, {_N, _Vs} = NVs) -> + NVs. + +%% +%% adjacents(Pid) = AdjacencyList +%% +-spec adjacents(pid()) -> [pid()]. + adjacents(Pid) -> case catch proc_info(Pid, links) of {links, Links} -> no_trap(Links); _ -> [] end. -no_trap([P| Ps]) -> +no_trap([P|Ps]) -> case catch proc_info(P, trap_exit) of - {trap_exit, false} -> [P| no_trap(Ps)]; + {trap_exit, false} -> [P|no_trap(Ps)]; _ -> no_trap(Ps) end; no_trap([]) -> @@ -484,10 +549,12 @@ _ -> self() end. +-spec get_ancestors() -> [pid()]. + get_ancestors() -> case get('$ancestors') of A when is_list(A) -> A; - _ -> [] + _ -> [] end. proc_info(Pid,Item) when node(Pid) =:= node() -> @@ -508,16 +575,18 @@ %%% Format (and write) a generated crash info structure. %%% ----------------------------------------------------------- +-spec format([term()]) -> string(). + format([OwnReport,LinkReport]) -> OwnFormat = format_report(OwnReport), LinkFormat = format_report(LinkReport), - io_lib:format(" crasher:~n~s neighbours:~n~s", - [OwnFormat,LinkFormat]). + S = io_lib:format(" crasher:~n~s neighbours:~n~s",[OwnFormat,LinkFormat]), + lists:flatten(S). format_report(Rep) when is_list(Rep) -> format_rep(Rep); format_report(Rep) -> - io_lib:format("~p~n",[Rep]). + io_lib:format("~p~n", [Rep]). format_rep([{initial_call,InitialCall}|Rep]) -> [format_mfa(InitialCall)|format_rep(Rep)]; @@ -552,4 +621,4 @@ end. format_tag(Tag, Data) -> - io_lib:format(" ~p: ~80.18p~n", [Tag,Data]). + io_lib:format(" ~p: ~80.18p~n", [Tag, Data]). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/proplists.erl erlang-13.b.3-dfsg/lib/stdlib/src/proplists.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/proplists.erl 2009-03-12 12:20:00.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/proplists.erl 2009-09-18 15:08:17.000000000 +0100 @@ -83,7 +83,7 @@ %% %% @see property/1 --spec property(Key::any(), Value::any()) -> atom() | {any(), any()}. +-spec property(Key::term(), Value::term()) -> atom() | {term(), term()}. property(Key, true) when is_atom(Key) -> Key; @@ -100,7 +100,7 @@ %% %% @see compact/1 --spec unfold(List::[any()]) -> [any()]. +-spec unfold(List::[term()]) -> [term()]. unfold([P | Ps]) -> if is_atom(P) -> @@ -138,7 +138,7 @@ %% @see get_value/2 %% @see get_bool/2 --spec lookup(Key::any(), List::[any()]) -> 'none' | tuple(). +-spec lookup(Key::term(), List::[term()]) -> 'none' | tuple(). lookup(Key, [P | Ps]) -> if is_atom(P), P =:= Key -> @@ -160,7 +160,7 @@ %% %% @see lookup/2 --spec lookup_all(Key::any(), List::[any()]) -> [tuple()]. +-spec lookup_all(Key::term(), List::[term()]) -> [tuple()]. lookup_all(Key, [P | Ps]) -> if is_atom(P), P =:= Key -> @@ -176,13 +176,13 @@ %% --------------------------------------------------------------------- -%% @spec is_defined(Key::term(), List::[term()]) -> bool() +%% @spec is_defined(Key::term(), List::[term()]) -> boolean() %% %% @doc Returns true if List contains at least %% one entry associated with Key, otherwise %% false is returned. --spec is_defined(Key::any(), List::[any()]) -> bool(). +-spec is_defined(Key::term(), List::[term()]) -> boolean(). is_defined(Key, [P | Ps]) -> if is_atom(P), P =:= Key -> @@ -201,7 +201,7 @@ %% @spec get_value(Key::term(), List::[term()]) -> term() %% @equiv get_value(Key, List, undefined) --spec get_value(Key::any(), List::[any()]) -> any(). +-spec get_value(Key::term(), List::[term()]) -> term(). get_value(Key, List) -> get_value(Key, List, undefined). @@ -219,7 +219,7 @@ %% @see get_all_values/2 %% @see get_bool/2 --spec get_value(Key::any(), List::[any()], Default::any()) -> any(). +-spec get_value(Key::term(), List::[term()], Default::term()) -> term(). get_value(Key, [P | Ps], Default) -> if is_atom(P), P =:= Key -> @@ -247,7 +247,7 @@ %% %% @see get_value/2 --spec get_all_values(Key::any(), List::[any()]) -> [any()]. +-spec get_all_values(Key::term(), List::[term()]) -> [term()]. get_all_values(Key, [P | Ps]) -> if is_atom(P), P =:= Key -> @@ -276,7 +276,7 @@ %% %% @see get_all_values/2 --spec append_values(Key::any(), List::[any()]) -> [any()]. +-spec append_values(Key::term(), List::[term()]) -> [term()]. append_values(Key, [P | Ps]) -> if is_atom(P), P =:= Key -> @@ -299,7 +299,7 @@ %% --------------------------------------------------------------------- -%% @spec get_bool(Key::term(), List::[term()]) -> bool() +%% @spec get_bool(Key::term(), List::[term()]) -> boolean() %% %% @doc Returns the value of a boolean key/value option. If %% lookup(Key, List) would yield {Key, true}, @@ -309,7 +309,7 @@ %% @see lookup/2 %% @see get_value/2 --spec get_bool(Key::any(), List::[any()]) -> bool(). +-spec get_bool(Key::term(), List::[term()]) -> boolean(). get_bool(Key, [P | Ps]) -> if is_atom(P), P =:= Key -> @@ -336,7 +336,7 @@ %% @doc Returns an unordered list of the keys used in List, %% not containing duplicates. --spec get_keys(List::[any()]) -> [any()]. +-spec get_keys(List::[term()]) -> [term()]. get_keys(Ps) -> sets:to_list(get_keys(Ps, sets:new())). @@ -360,7 +360,7 @@ %% @doc Deletes all entries associated with Key from %% List. --spec delete(Key::any(), List::[any()]) -> [any()]. +-spec delete(Key::term(), List::[term()]) -> [term()]. delete(Key, [P | Ps]) -> if is_atom(P), P =:= Key -> @@ -396,7 +396,7 @@ %% @see substitute_negations/2 %% @see normalize/2 --spec substitute_aliases(aliases(), List::[any()]) -> [any()]. +-spec substitute_aliases(aliases(), List::[term()]) -> [term()]. substitute_aliases(As, Props) -> [substitute_aliases_1(As, P) || P <- Props]. @@ -441,7 +441,7 @@ %% @see substitute_aliases/2 %% @see normalize/2 --spec substitute_negations(negations(), List::[any()]) -> [any()]. +-spec substitute_negations(negations(), List::[term()]) -> [term()]. substitute_negations(As, Props) -> [substitute_negations_1(As, P) || P <- Props]. @@ -508,7 +508,7 @@ %% %% @see normalize/2 --spec expand(Expansions::expansions(), [any()]) -> [any()]. +-spec expand(Expansions::expansions(), [term()]) -> [term()]. expand(Es, Ps) when is_list(Ps) -> Es1 = [{property(P), V} || {P, V} <- Es], @@ -621,7 +621,7 @@ | {'negations', negations()} | {'expand', expansions()}. --spec normalize(List::[any()], Stages::[operation()]) -> [any()]. +-spec normalize(List::[term()], Stages::[operation()]) -> [term()]. normalize(L, [{aliases, As} | Xs]) -> normalize(substitute_aliases(As, L), Xs); @@ -652,7 +652,7 @@ %% {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]} %%

    --spec split(List::[any()], Keys::[any()]) -> {[[any()]], [any()]}. +-spec split(List::[term()], Keys::[term()]) -> {[[term()]], [term()]}. split(List, Keys) -> {Store, Rest} = split(List, dict:from_list([{K, []} || K <- Keys]), []), diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/qlc.erl erlang-13.b.3-dfsg/lib/stdlib/src/qlc.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/qlc.erl 2009-03-12 12:21:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/qlc.erl 2009-11-20 13:31:52.000000000 +0000 @@ -1457,7 +1457,7 @@ {?qual_data(QNum, GoI, SI, {gen, Prep}), ModGens} end, {Qdata, ModGens} = lists:mapfoldl(F, [], Qdata0), - SomeLookUp = lists:keysearch(true, 2, ModGens) =/= false, + SomeLookUp = lists:keymember(true, 2, ModGens) =/= false, check_lookup_option(Opt, SomeLookUp), case ModGens of [{_QNum, _LookUp, all, OnePrep}] -> @@ -1847,7 +1847,7 @@ Col1 = {Q1,C1}, Col2 = {Q2,C2}, DoSort = [QC || {{_QNum,Col}=QC,SortL} <- [{Col1,Sort1}, {Col2,Sort2}], - lists:keysearch({Col, ascending}, 1, SortL) =:= false], + lists:keymember({Col, ascending}, 1, SortL) =:= false], J = [{{Q1,C1,Q2,C2}, {merge_join,DoSort,KE,Skip}}], %% true = (QOpt(template))(Col1, '==') =:= (QOpt(template))(Col2, '==') [{{Column, ascending}, J} || @@ -2066,7 +2066,7 @@ %% from a query handle) then the lookup join cannot be done. case MS =/= no_match_spec andalso - lists:keysearch(Q2, 1, LU_SkipQuals) =:= false + lists:keymember(Q2, 1, LU_SkipQuals) =:= false of true -> opt_join_lu(LJ, Qdata, LU_SkipQuals); diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/qlc_pt.erl erlang-13.b.3-dfsg/lib/stdlib/src/qlc_pt.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/qlc_pt.erl 2009-03-12 12:21:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/qlc_pt.erl 2009-09-18 15:08:52.000000000 +0100 @@ -194,7 +194,7 @@ compile_messages(Forms, FormsNoShadows, Options, State) -> %% The qlc module cannot handle binary generators. BGenF = fun(_QId,{b_generate,Line,_P,_LE}=BGen, GA, A) -> - M = {Line,?APIMOD,binary_generator}, + M = {loc(Line),?APIMOD,binary_generator}, {BGen,[{get(?QLC_FILE),[M]}|GA],A}; (_QId, Q, GA, A) -> {Q,GA,A} @@ -230,13 +230,34 @@ tagged_messages(MsL) -> [{File, - [{get_lcid_line(Id),Mod,untag(T)} || {Id,Mod,T} <- Ms, - is_lcid(Id)]} + [{Loc,Mod,untag(T)} || {Loc0,Mod,T} <- Ms, + {true,Loc} <- [tloc(Loc0)]]} || {File,Ms} <- MsL] ++ - [{File,[{Line,?APIMOD,{used_generator_variable,V}}]} + [{File,[{Loc,?APIMOD,{used_generator_variable,V}}]} || {_, Ms} <- MsL, - {{extra,Line,File,V},erl_lint,{unbound_var,_}} <- Ms]. + {XLoc,erl_lint,{unbound_var,_}} <- Ms, + {Loc,File,V} <- [extra(XLoc)]]. + +tloc({Id,Column}) -> + {IsLcid,T} = tloc(Id), + {IsLcid,{T,Column}}; +tloc(Id) -> + IsLcid = is_lcid(Id), + {IsLcid,case IsLcid of + true -> get_lcid_line(Id); + false -> any + end}. + +extra({extra,Line,File,V}) -> + {Line,File,V}; +extra({Line,Column}) -> + case extra(Line) of + {L,File,V} -> {{L,Column},File,V}; + Else -> Else + end; +extra(Else) -> + Else. untag([E | Es]) -> [untag(E) | untag(Es)]; untag(T) when is_tuple(T) -> list_to_tuple(untag(tuple_to_list(T))); @@ -269,9 +290,10 @@ %% template mentioning all variables occurring in F. Vs = ordsets:to_list(qlc:vars(Filter0)), Id = QId#qid.lcid, - LC1 = embed_vars([{var,{QId,f1},V} || V <- Vs], Id), - LC2 = embed_vars([{var,{QId,f2},V} || V <- Vs], Id), - Filter = {block,line,[LC1,Filter0,LC2]}, + LC1 = embed_vars(intro_set_line({QId,f1}, Vs), Id), + LC2 = embed_vars(intro_set_line({QId,f2}, Vs), Id), + AnyLine = -1, + Filter = {block,AnyLine,[LC1,Filter0,LC2]}, {Filter,{GVs,[{QId,[]} | QIds]},Foo} end, Acc0 = {[],[]}, @@ -293,6 +315,10 @@ I1 = family(IV ++ GenVars), sofs:to_external(sofs:family_union(sofs:family(QIds), I1)). +intro_set_line(Tag, Vars) -> + L = erl_parse:set_line(1, fun(_) -> Tag end), + [{var,L,V} || V <- Vars]. + compile_errors(FormsNoShadows) -> case compile_forms(FormsNoShadows, []) of {[], _Warnings} -> @@ -354,7 +380,11 @@ when T =:= b_generate; T =:= generate -> F = fun({var, _, V}=Var) -> {var, L, OrigVar} = undo_no_shadows(Var), - {var, {extra, L, get(?QLC_FILE), OrigVar}, V} + AF = fun(Line) -> + {extra, Line, get(?QLC_FILE), OrigVar} + end, + L2 = erl_parse:set_line(L, AF), + {var, L2, V} end, Vs = [Var || {var, _, V}=Var <- qlc:var_fold(F, [], LE), lists:member(V, IVsSoFar0)], @@ -606,7 +636,7 @@ %% Finds filters and patterns that cannot match any values at all. %% Nothing but the patterns and the filters themselves is analyzed. -%% A much weaker analysis than the one of Dialyzer. +%% A much weaker analysis than the one of Dialyzer's. warn_failing_qualifiers(Qualifiers, AllIVs, Dependencies, State) -> {FilterData, GeneratorData} = qual_data(Qualifiers), Anon = 1, @@ -625,7 +655,7 @@ [] -> {[], [{get(?QLC_FILE), - [{abs(element(2, Filter)),?APIMOD, + [{abs_loc(element(2, Filter)),?APIMOD, nomatch_filter}]} | Warnings]}; Frames1 -> {Frames1,Warnings} @@ -635,7 +665,7 @@ {failed, _, _} -> {Frames, [{get(?QLC_FILE), - [{abs(element(2, Pattern)),?APIMOD, + [{abs_loc(element(2, Pattern)),?APIMOD, nomatch_pattern}]} | Warnings]}; _ -> {Frames,Warnings} @@ -2381,8 +2411,15 @@ aux_var(Name, LcN, QN, N, AllVars) -> qlc:aux_name(lists:concat([Name, LcN, '_', QN, '_']), N, AllVars). -no_compiler_warning(Line) -> - - abs(Line). +no_compiler_warning(L) -> + erl_parse:set_line(L, fun(Line) -> -abs(Line) end). + +abs_loc(L) -> + loc(erl_parse:set_line(L, fun(Line) -> abs(Line) end)). + +loc(L) -> + {location,Location} = erl_parse:get_attribute(L, location), + Location. list2op([E], _Op) -> E; @@ -2464,7 +2501,7 @@ %% tried (to avoid mixing up introduced names with existing ones). %% %% The original names of variables are kept in the line number - %% position of the abstract code: {var, {OriginalName, L}, + %% position of the abstract code: {var, {nos, OriginalName, L}, %% NewName}. undo_no_shadows/1 re-creates the original code. AllVars = sets:from_list(ordsets:to_list(qlc:vars(Forms0))), ?DEBUG("nos AllVars = ~p~n", [sets:to_list(AllVars)]), @@ -2513,8 +2550,11 @@ {{lc,L,E,Qs}, S}; nos({var,L,V}=Var, {_LI,Vs,UV,_A,_Sg}=S) when V =/= '_' -> case used_var(V, Vs, UV) of - {true, VN} -> {{var,{V,L},VN}, S}; - false -> {Var, S} + {true, VN} -> + NL = nos_var(L, V), + {{var,NL,VN}, S}; + false -> + {Var, S} end; nos(T, S0) when is_tuple(T) -> {TL, S} = nos(tuple_to_list(T), S0), @@ -2544,13 +2584,17 @@ end, {N, Vs1, [{V,VN} | PVs0]} end, - {{var,{V,L},Name}, {LI,Vs,UV,A,Sg}, PVs}; + NL = nos_var(L, V), + {{var,NL,Name}, {LI,Vs,UV,A,Sg}, PVs}; nos_pattern(T, S0, PVs0) when is_tuple(T) -> {TL, S, PVs} = nos_pattern(tuple_to_list(T), S0, PVs0), {list_to_tuple(TL), S, PVs}; nos_pattern(T, S, PVs) -> {T, S, PVs}. +nos_var(L, Name) -> + erl_parse:set_line(L, fun(Line) -> {nos,Name,Line} end). + used_var(V, Vs, UV) -> case dict:find(V, Vs) of {ok,Value} -> @@ -2577,33 +2621,50 @@ undo_no_shadows(E) -> var_map(fun undo_no_shadows1/1, E). -undo_no_shadows1({var, {V, VL}, _}) -> - undo_no_shadows1({var, VL, V}); -undo_no_shadows1({var, _, _}=Var) -> - Var. +undo_no_shadows1({var, L, _}=Var) -> + case erl_parse:get_attribute(L, line) of + {line,{nos,V,_VL}} -> + NL = erl_parse:set_line(L, fun({nos,_V,VL}) -> VL end), + undo_no_shadows1({var, NL, V}); + _Else -> + Var + end. restore_line_numbers(E) -> var_map(fun restore_line_numbers1/1, E). -restore_line_numbers1({var, {_, VL}, V}) -> - restore_line_numbers1({var, VL, V}); -restore_line_numbers1({var, L, _}=Var) when is_integer(L) -> - Var. +restore_line_numbers1({var, L, V}=Var) -> + case erl_parse:get_attribute(L, line) of + {line,{nos,_,_}} -> + NL = erl_parse:set_line(L, fun({nos,_V,VL}) -> VL end), + restore_line_numbers1({var, NL, V}); + _Else -> + Var + end. %% QLC identifier. %% The first one encountered in the file has No=1. -make_lcid(Line, No) when is_integer(Line), Line < (1 bsl ?MAX_NUM_OF_LINES), - is_integer(No), No > 0 -> - sgn(Line) * ((No bsl ?MAX_NUM_OF_LINES) + sgn(Line) * Line). +make_lcid(Attrs, No) when is_integer(No), No > 0 -> + F = fun(Line) when is_integer(Line), Line < (1 bsl ?MAX_NUM_OF_LINES) -> + sgn(Line) * ((No bsl ?MAX_NUM_OF_LINES) + sgn(Line) * Line) + end, + erl_parse:set_line(Attrs, F). -is_lcid(Id) -> - is_integer(Id) andalso (abs(Id) > (1 bsl ?MAX_NUM_OF_LINES)). +is_lcid(Attrs) -> + try + {line,Id} = erl_parse:get_attribute(Attrs, line), + is_integer(Id) andalso (abs(Id) > (1 bsl ?MAX_NUM_OF_LINES)) + catch _:_ -> + false + end. -get_lcid_no(Id) -> - abs(Id) bsr ?MAX_NUM_OF_LINES. +get_lcid_no(IdAttrs) -> + {line,Id} = erl_parse:get_attribute(IdAttrs, line), + abs(Id) bsr ?MAX_NUM_OF_LINES. -get_lcid_line(Id) -> +get_lcid_line(IdAttrs) -> + {line,Id} = erl_parse:get_attribute(IdAttrs, line), sgn(Id) * (abs(Id) band ((1 bsl ?MAX_NUM_OF_LINES) - 1)). sgn(X) when X >= 0 -> diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/queue.erl erlang-13.b.3-dfsg/lib/stdlib/src/queue.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/queue.erl 2009-04-16 10:23:38.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/queue.erl 2009-09-18 15:07:06.000000000 +0100 @@ -56,14 +56,14 @@ new() -> {[],[]}. %{RearList,FrontList} %% O(1) --spec is_queue(term()) -> bool(). +-spec is_queue(term()) -> boolean(). is_queue({R,F}) when is_list(R), is_list(F) -> true; is_queue(_) -> false. %% O(1) --spec is_empty(queue()) -> bool(). +-spec is_empty(queue()) -> boolean(). is_empty({[],[]}) -> true; is_empty({In,Out}) when is_list(In), is_list(Out) -> @@ -97,7 +97,7 @@ %% Return true or false depending on if element is in queue %% %% O(length(Q)) worst case --spec member(term(), queue()) -> bool(). +-spec member(term(), queue()) -> boolean(). member(X, {R,F}) when is_list(R), is_list(F) -> lists:member(X, R) orelse lists:member(X, F); member(X, Q) -> @@ -340,7 +340,7 @@ %% %% Fun(_) -> List: O(length(List) * len(Q)) %% else: O(len(Q) --spec filter(fun((term()) -> bool() | list()), queue()) -> queue(). +-spec filter(fun((term()) -> boolean() | list()), queue()) -> queue(). filter(Fun, {R0,F0}) when is_function(Fun, 1), is_list(R0), is_list(F0) -> F = filter_f(Fun, F0), R = filter_r(Fun, R0), diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/sets.erl erlang-13.b.3-dfsg/lib/stdlib/src/sets.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/sets.erl 2009-04-16 10:23:58.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/src/sets.erl 2009-09-18 15:08:12.000000000 +0100 @@ -82,9 +82,9 @@ Empty = mk_seg(?seg_size), #set{empty = Empty, segs = {Empty}}. -%% is_set(Set) -> bool(). +%% is_set(Set) -> boolean(). %% Return 'true' if Set is a set of elements, else 'false'. --spec is_set(term()) -> bool(). +-spec is_set(term()) -> boolean(). is_set(#set{}) -> true; is_set(_) -> false. @@ -105,9 +105,9 @@ from_list(L) -> lists:foldl(fun (E, S) -> add_element(E, S) end, new(), L). -%% is_element(Element, Set) -> bool(). +%% is_element(Element, Set) -> boolean(). %% Return 'true' if Element is an element of Set, else 'false'. --spec is_element(term(), set()) -> bool(). +-spec is_element(term(), set()) -> boolean(). is_element(E, S) -> Slot = get_slot(S, E), Bkt = get_bucket(S, Slot), @@ -183,9 +183,9 @@ intersection1(intersection(S1, S2), Ss); intersection1(S1, []) -> S1. -%% is_disjoint(Set1, Set2) -> true|false. +%% is_disjoint(Set1, Set2) -> boolean(). %% Check whether Set1 and Set2 are disjoint. --spec is_disjoint(set(), set()) -> bool(). +-spec is_disjoint(set(), set()) -> boolean(). is_disjoint(S1, S2) when S1#set.size < S2#set.size -> fold(fun (_, false) -> false; (E, true) -> not is_element(E, S2) @@ -202,10 +202,10 @@ subtract(S1, S2) -> filter(fun (E) -> not is_element(E, S2) end, S1). -%% is_subset(Set1, Set2) -> bool(). +%% is_subset(Set1, Set2) -> boolean(). %% Return 'true' when every element of Set1 is also a member of %% Set2, else 'false'. --spec is_subset(set(), set()) -> bool(). +-spec is_subset(set(), set()) -> boolean(). is_subset(S1, S2) -> fold(fun (E, Sub) -> Sub andalso is_element(E, S2) end, true, S1). @@ -216,7 +216,7 @@ %% filter(Fun, Set) -> Set. %% Filter Set with Fun. --spec filter(fun((_) -> bool()), set()) -> set(). +-spec filter(fun((_) -> boolean()), set()) -> set(). filter(F, D) -> filter_set(F, D). %% get_slot(Hashdb, Key) -> Slot. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/shell.erl erlang-13.b.3-dfsg/lib/stdlib/src/shell.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/shell.erl 2009-03-12 12:18:08.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/shell.erl 2009-11-20 13:29:34.000000000 +0000 @@ -33,7 +33,7 @@ -define(MAXSIZE_HEAPBINARY, 64). -% When used as the fallback restricted shell callback module... +%% When used as the fallback restricted shell callback module... local_allowed(q,[],State) -> {true,State}; local_allowed(_,_,State) -> @@ -44,13 +44,13 @@ non_local_allowed(_,_,State) -> {false,State}. +-spec start() -> pid(). start() -> start(false, false). start(init) -> start(false, true); - start(NoCtrlG) -> start(NoCtrlG, false). @@ -59,6 +59,8 @@ spawn(fun() -> server(NoCtrlG, StartSync) end). %% Find the pid of the current evaluator process. +-spec whereis_evaluator() -> 'undefined' | pid(). + whereis_evaluator() -> %% locate top group leader, always registered as user %% can be implemented by group (normally) or user @@ -84,8 +86,8 @@ [{current_group,Group}] -> %% get shell pid from group GrIfs = group:interfaces(Group), - case lists:keysearch(shell, 1, GrIfs) of - {value,{shell,Shell}} -> + case lists:keyfind(shell, 1, GrIfs) of + {shell, Shell} -> whereis_evaluator(Shell); false -> undefined @@ -94,11 +96,13 @@ end end. +-spec whereis_evaluator(pid()) -> 'undefined' | pid(). + whereis_evaluator(Shell) -> case process_info(Shell, dictionary) of {dictionary,Dict} -> - case lists:keysearch(evaluator, 1, Dict) of - {value,{_,Eval}} when is_pid(Eval) -> + case lists:keyfind(evaluator, 1, Dict) of + {_, Eval} when is_pid(Eval) -> Eval; _ -> undefined @@ -106,24 +110,27 @@ _ -> undefined end. - %% Call this function to start a user restricted shell %% from a normal shell session. +-spec start_restricted(module()) -> {'error', code:load_error_rsn()}. + start_restricted(RShMod) when is_atom(RShMod) -> case code:ensure_loaded(RShMod) of {module,RShMod} -> application:set_env(stdlib, restricted_shell, RShMod), exit(restricted_shell_started); - {error,What} -> + {error,What} = Error -> error_logger:error_report( lists:flatten( io_lib:fwrite( <<"Restricted shell module ~w not found: ~p\n">>, [RShMod,What]))), - {error,What} + Error end. +-spec stop_restricted() -> no_return(). + stop_restricted() -> application:unset_env(stdlib, restricted_shell), exit(restricted_shell_stopped). @@ -138,6 +145,8 @@ %%% {keylist, 'erl.lang.list.keylist'}, %%% {debug, 'erl.system.debug'}]. +-spec server(boolean(), boolean()) -> 'terminated'. + server(NoCtrlG, StartSync) -> put(no_control_g, NoCtrlG), server(StartSync). @@ -152,7 +161,9 @@ %%% Still, by means of a flag, we make it possible to start the shell the %%% old way (for backwards compatibility reasons). This should however not %%% be used unless for very special reasons necessary. - + +-spec server(boolean()) -> 'terminated'. + server(StartSync) -> case init:get_argument(async_shell_start) of {ok,_} -> @@ -292,8 +303,8 @@ prompt(N) -> case is_alive() of - true -> {format,<<"(~s)~w> ">>,[node(),N]}; - false -> {format,<<"~w> ">>,[N]} + true -> io_lib:format(<<"(~s)~w> ">>, [node(), N]); + false -> io_lib:format(<<"~w> ">>, [N]) end. %% expand_hist(Expressions, CommandNumber) @@ -439,7 +450,7 @@ has_bin([E | Es]) -> has_bin(E), has_bin(Es); -has_bin(B) when is_binary(B), byte_size(B) > ?MAXSIZE_HEAPBINARY -> +has_bin(B) when byte_size(B) > ?MAXSIZE_HEAPBINARY -> throw(true); has_bin(T) -> T. @@ -854,12 +865,12 @@ erl_expand_records:module(Forms, [strict_record_tests]), prep_rec(NE). -prep_rec({value,CommandN,V}) -> +prep_rec({value,_CommandN,_V}=Value) -> %% erl_expand_records cannot handle the history expansion {value,_,_}. - {atom,{value,CommandN,V},ok}; -prep_rec({atom,{value,CommandN,V},ok}) -> + {atom,Value,ok}; +prep_rec({atom,{value,_CommandN,_V}=Value,ok}) -> %% Undo the effect of the previous clause... - {value,CommandN,V}; + Value; prep_rec(T) when is_tuple(T) -> list_to_tuple(prep_rec(tuple_to_list(T))); prep_rec([E | Es]) -> [prep_rec(E) | prep_rec(Es)]; prep_rec(E) -> E. @@ -1142,11 +1153,9 @@ {Recs1, _} = lists:mapfoldl(fun ({Name,Def}, I) -> {{Name,I,Def},I+1} end, 0, Recs0), Recs2 = lists:keysort(2, lists:ukeysort(1, Recs1)), - Bs1 = lists:foldl(fun ({Name,I,Def}, Bs) -> - erl_eval:add_binding({record,I,Name}, - Def, Bs) - end, Bs0, Recs2), - Bs1. + lists:foldl(fun ({Name,I,Def}, Bs) -> + erl_eval:add_binding({record,I,Name}, Def, Bs) + end, Bs0, Recs2). %%% Read record information from file(s) @@ -1213,10 +1222,10 @@ %% This is how the debugger searches for source files. See int.erl. try_source(Beam, CB) -> - Os = case lists:keysearch(options, 1, binary_to_term(CB)) of + Os = case lists:keyfind(options, 1, binary_to_term(CB)) of false -> []; - {value,{_,Os0}} -> Os0 - end, + {_, Os0} -> Os0 + end, Src0 = filename:rootname(Beam) ++ ".erl", case is_file(Src0) of true -> parse_file(Src0, Os); @@ -1415,11 +1424,17 @@ application_controller:set_env(App, Name, Val), Prev. +-spec history(non_neg_integer()) -> non_neg_integer(). + history(L) when is_integer(L), L >= 0 -> set_env(stdlib, shell_history_length, L, ?DEF_HISTORY). +-spec results(non_neg_integer()) -> non_neg_integer(). + results(L) when is_integer(L), L >= 0 -> set_env(stdlib, shell_saved_results, L, ?DEF_RESULTS). +-spec catch_exception(boolean()) -> boolean(). + catch_exception(Bool) -> set_env(stdlib, shell_catch_exception, Bool, ?DEF_CATCH_EXCEPTION). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/string.erl erlang-13.b.3-dfsg/lib/stdlib/src/string.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/string.erl 2009-03-12 12:18:09.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/string.erl 2009-09-18 15:07:07.000000000 +0100 @@ -45,7 +45,7 @@ %% equal(String1, String2) %% Test if 2 strings are equal. --spec equal(string(), string()) -> bool(). +-spec equal(string(), string()) -> boolean(). equal(S, S) -> true; equal(_, _) -> false. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/supervisor.erl erlang-13.b.3-dfsg/lib/stdlib/src/supervisor.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/supervisor.erl 2009-03-12 12:18:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/supervisor.erl 2009-11-20 13:29:34.000000000 +0000 @@ -753,9 +753,9 @@ check_startspec([ChildSpec|T], Res) -> case check_childspec(ChildSpec) of {ok, Child} -> - case lists:keysearch(Child#child.name, #child.name, Res) of - {value, _} -> {duplicate_child_name, Child#child.name}; - _ -> check_startspec(T, [Child | Res]) + case lists:keymember(Child#child.name, #child.name, Res) of + true -> {duplicate_child_name, Child#child.name}; + false -> check_startspec(T, [Child | Res]) end; Error -> Error end; @@ -776,9 +776,9 @@ {ok, #child{name = Name, mfa = Func, restart_type = RestartType, shutdown = Shutdown, child_type = ChildType, modules = Mods}}. -validChildType(supervisor) -> true; +validChildType(supervisor) -> true; validChildType(worker) -> true; -validChildType(What) -> throw({invalid_child_type, What}). +validChildType(What) -> throw({invalid_child_type, What}). validName(_Name) -> true. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/src/sys.erl erlang-13.b.3-dfsg/lib/stdlib/src/sys.erl --- erlang-13.b.1-dfsg/lib/stdlib/src/sys.erl 2009-03-12 12:18:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/stdlib/src/sys.erl 2009-09-18 15:07:07.000000000 +0100 @@ -66,11 +66,11 @@ log(Name, Flag, Timeout) -> send_system_msg(Name, {debug, {log, Flag}}, Timeout). --spec trace(name(), bool()) -> 'ok'. +-spec trace(name(), boolean()) -> 'ok'. trace(Name, Flag) -> send_system_msg(Name, {debug, {trace, Flag}}). --spec trace(name(), bool(), timeout()) -> 'ok'. +-spec trace(name(), boolean(), timeout()) -> 'ok'. trace(Name, Flag, Timeout) -> send_system_msg(Name, {debug, {trace, Flag}}, Timeout). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/array_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/array_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/array_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/array_SUITE.erl 2009-11-20 13:32:35.000000000 +0000 @@ -0,0 +1,816 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(array_SUITE). + +-include("test_server.hrl"). + +%% Default timetrap timeout (set in init_per_testcase). +%% This should be set relatively high (10-15 times the expected +%% max testcasetime). +-define(default_timeout, ?t:seconds(60)). + +%% Test server specific exports +-export([all/1]). +-export([init_per_testcase/2, fin_per_testcase/2]). + +-export([ + new_test/1, + fix_test/1, + relax_test/1, + resize_test/1, + set_get_test/1, + to_list_test/1, + sparse_to_list_test/1, + from_list_test/1, + to_orddict_test/1, + sparse_to_orddict_test/1, + from_orddict_test/1, + map_test/1, + sparse_map_test/1, + foldl_test/1, + sparse_foldl_test/1, + foldr_test/1, + sparse_foldr_test/1 + ]). + + +-export([t/0,t/1,extract_tests/0]). + +-import(array, + [new/0, new/1, new/2, is_array/1, set/3, get/2, %size/1, + sparse_size/1, default/1, reset/2, to_list/1, sparse_to_list/1, + from_list/1, from_list/2, to_orddict/1, sparse_to_orddict/1, + from_orddict/1, from_orddict/2, map/2, sparse_map/2, foldl/3, + foldr/3, sparse_foldl/3, sparse_foldr/3, fix/1, relax/1, is_fix/1, + resize/1, resize/2]). + +%% +%% all/1 +%% +all(doc) -> + []; +all(suite) -> + [new_test, + fix_test, + relax_test, + resize_test, + set_get_test, + to_list_test, + sparse_to_list_test, + from_list_test, + to_orddict_test, + sparse_to_orddict_test, + from_orddict_test, + map_test, + sparse_map_test, + foldl_test, + sparse_foldl_test, + foldr_test, + sparse_foldr_test + ]. + +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +-define(LEAFSIZE,10). +-define(NODESIZE,?LEAFSIZE). + +-record(array, {size, %% number of defined entries + max, %% maximum number of entries in current tree + default, %% the default value (usually 'undefined') + elements %% the tuple tree + }). + +-define(_assert(What), + begin ?line true = What end + ). +-define(_assertNot(What), + begin ?line false = What end + ). + +-define(_assertMatch(Res,What), + begin + ?line case What of Res -> ok end + end + ). +-define(_assertError(Reas,What), + begin ?line fun() -> + try What of + A_Success -> exit({test_error, A_Success}) + catch error:Reas -> ok end + end() + end + ). + +-define(LET(Var,Expr, Test), begin ?line fun() -> Var = Expr, Test end() end). + +-define(_test(Expr), begin ?line Expr end). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Some helpers to be able to run the tests without testserver +%%%%%%%%%%%%%%%%%%%%%%%%% +t() -> t([all]). + +t(What) when not is_list(What) -> + t([What]); +t(What) -> + lists:foreach(fun(T) -> + io:format("Test ~p ~n",[T]), + try + ?MODULE:T([]) + catch _E:_R -> + Line = get(test_server_loc), + io:format("Failed ~p:~p ~p ~p~n ~p~n", + [T,Line,_E,_R, erlang:get_stacktrace()]) + end + end, expand(What)). + +expand(All) -> + lists:reverse(expand(All,[])). +expand([H|T], Acc) -> + case ?MODULE:H(suite) of + [] -> expand(T,[H|Acc]); + Cs -> + R = expand(Cs, Acc), + expand(T, R) + end; +expand([], Acc) -> Acc. + +%%%%% extract tests + +extract_tests() -> + {ok, In} = file:open("../src/array.erl", [read]), + {ok, Out} = file:open("array_temp.erl", [write]), + try + Tests = extract_tests(In,Out,[]), + Call = fun(Test) -> + io:format(Out, "~s(doc) -> [];~n", [Test]), + io:format(Out, "~s(suite) -> [];~n", [Test]), + io:format(Out, "~s(Config) when is_list(Config) -> ~s_(), ok.~n", + [Test, Test]) + end, + [Call(Test) || Test <- Tests], + io:format("Tests ~p~n", [Tests]) + catch _:Err -> + io:format("Error: ~p ~p~n", [Err, erlang:get_stacktrace()]) + end, + file:close(In), + file:close(Out). + +extract_tests(In,Out,Tests) -> + case io:get_line(In,"") of + eof -> lists:reverse(Tests); + "-ifdef(EUNIT)" ++ _ -> + Test = write_test(In,Out), + extract_tests(In,Out, [Test|Tests]); + _E -> + extract_tests(In,Out,Tests) + end. + +write_test(In,Out) -> + Line = io:get_line(In,""), + io:put_chars(Out, Line), + [$_|Test] = lists:dropwhile(fun($_) -> false;(_) -> true end,lists:reverse(Line)), + write_test_1(In,Out), + lists:reverse(Test). + +write_test_1(In,Out) -> + case io:get_line(In,"") of + "-endif" ++ _ -> + io:nl(Out), + ok; + Line -> + io:put_chars(Out, Line), + write_test_1(In,Out) + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Actual tests + +new_test_() -> + N0 = ?LEAFSIZE, + N01 = N0+1, + N1 = ?NODESIZE*N0, + N11 = N1+1, + N2 = ?NODESIZE*N1, + [?_test(new()), + + ?_test(new([])), + ?_test(new(10)), + ?_test(new({size,10})), + ?_test(new(fixed)), + ?_test(new({fixed,true})), + ?_test(new({fixed,false})), + ?_test(new({default,undefined})), + ?_test(new([{size,100},{fixed,false},{default,undefined}])), + ?_test(new([100,fixed,{default,0}])), + + ?_assert(new() =:= new([])), + ?_assert(new() =:= new([{size,0},{default,undefined},{fixed,false}])), + ?_assert(new() =:= new(0, {fixed,false})), + ?_assert(new(fixed) =:= new(0)), + ?_assert(new(fixed) =:= new(0, [])), + ?_assert(new(10) =:= new([{size,0},{size,5},{size,10}])), + ?_assert(new(10) =:= new(0, {size,10})), + ?_assert(new(10, []) =:= new(10, [{default,undefined},{fixed,true}])), + + ?_assertError(badarg, new(-1)), + ?_assertError(badarg, new(10.0)), + ?_assertError(badarg, new(undefined)), + ?_assertError(badarg, new([undefined])), + ?_assertError(badarg, new([{default,0} | fixed])), + + ?_assertError(badarg, new(-1, [])), + ?_assertError(badarg, new(10.0, [])), + ?_assertError(badarg, new(undefined, [])), + + ?_assertMatch(#array{size=0,max=N0,default=undefined,elements=N0}, + new()), + ?_assertMatch(#array{size=0,max=0,default=undefined,elements=N0}, + new(fixed)), + ?_assertMatch(#array{size=N0,max=N0,elements=N0}, + new(N0, {fixed,false})), + ?_assertMatch(#array{size=N01,max=N1,elements=N1}, + new(N01, {fixed,false})), + ?_assertMatch(#array{size=N1,max=N1,elements=N1}, + new(N1, {fixed,false})), + ?_assertMatch(#array{size=N11,max=N2,elements=N2}, + new(N11, {fixed,false})), + ?_assertMatch(#array{size=N2, max=N2, default=42,elements=N2}, + new(N2, [{fixed,false},{default,42}])), + + ?_assert(0 =:= array:size(new())), + ?_assert(17 =:= array:size(new(17))), + ?_assert(100 =:= array:size(array:set(99,0,new()))), + ?_assertError(badarg, array:size({bad_data,gives_error})), + + ?_assert(undefined =:= default(new())), + ?_assert(4711 =:= default(new({default,4711}))), + ?_assert(0 =:= default(new(10, {default,0}))), + ?_assertError(badarg, default({bad_data,gives_error})), + + ?_assert(is_array(new())), + ?_assert(false =:= is_array({foobar, 23, 23})), + ?_assert(false =:= is_array(#array{size=bad})), + ?_assert(false =:= is_array(#array{max=bad})), + ?_assert(is_array(new(10))), + ?_assert(is_array(new(10, {fixed,false}))) + ]. + +fix_test_() -> + [?_assert(is_array(fix(new()))), + ?_assert(fix(new()) =:= new(fixed)), + + ?_assertNot(is_fix(new())), + ?_assertNot(is_fix(new([]))), + ?_assertNot(is_fix(new({fixed,false}))), + ?_assertNot(is_fix(new(10, {fixed,false}))), + ?_assert(is_fix(new({fixed,true}))), + ?_assert(is_fix(new(fixed))), + ?_assert(is_fix(new(10))), + ?_assert(is_fix(new(10, []))), + ?_assert(is_fix(new(10, {fixed,true}))), + ?_assert(is_fix(fix(new()))), + ?_assert(is_fix(fix(new({fixed,false})))), + + ?_test(set(0, 17, new())), + ?_assertError(badarg, set(0, 17, new(fixed))), + ?_assertError(badarg, set(1, 42, fix(set(0, 17, new())))), + + ?_test(set(9, 17, new(10))), + ?_assertError(badarg, set(10, 17, new(10))), + ?_assertError(badarg, set(10, 17, fix(new(10, {fixed,false})))) + ]. + +relax_test_() -> + [?_assert(is_array(relax(new(fixed)))), + ?_assertNot(is_fix(relax(fix(new())))), + ?_assertNot(is_fix(relax(new(fixed)))), + + ?_assert(new() =:= relax(new(fixed))), + ?_assert(new() =:= relax(new(0))), + ?_assert(new(17, {fixed,false}) =:= relax(new(17))), + ?_assert(new(100, {fixed,false}) + =:= relax(fix(new(100, {fixed,false})))) + ]. + +resize_test_() -> + [?_assert(resize(0, new()) =:= new()), + ?_assert(resize(99, new(99)) =:= new(99)), + ?_assert(resize(99, relax(new(99))) =:= relax(new(99))), + ?_assert(is_fix(resize(100, new(10)))), + ?_assertNot(is_fix(resize(100, relax(new(10))))), + + ?_assert(array:size(resize(100, new())) =:= 100), + ?_assert(array:size(resize(0, new(100))) =:= 0), + ?_assert(array:size(resize(99, new(10))) =:= 99), + ?_assert(array:size(resize(99, new(1000))) =:= 99), + + ?_assertError(badarg, set(99, 17, new(10))), + ?_test(set(99, 17, resize(100, new(10)))), + ?_assertError(badarg, set(100, 17, resize(100, new(10)))), + + ?_assert(array:size(resize(new())) =:= 0), + ?_assert(array:size(resize(new(8))) =:= 0), + ?_assert(array:size(resize(array:set(7, 0, new()))) =:= 8), + ?_assert(array:size(resize(array:set(7, 0, new(10)))) =:= 8), + ?_assert(array:size(resize(array:set(99, 0, new(10,{fixed,false})))) + =:= 100), + ?_assert(array:size(resize(array:set(7, undefined, new()))) =:= 0), + ?_assert(array:size(resize(array:from_list([1,2,3,undefined]))) + =:= 3), + ?_assert(array:size( + resize(array:from_orddict([{3,0},{17,0},{99,undefined}]))) + =:= 18), + ?_assertError(badarg, resize(foo, bad_argument)) + ]. + +set_get_test_() -> + N0 = ?LEAFSIZE, + N1 = ?NODESIZE*N0, + [?_assert(array:get(0, new()) =:= undefined), + ?_assert(array:get(1, new()) =:= undefined), + ?_assert(array:get(99999, new()) =:= undefined), + + ?_assert(array:get(0, new(1)) =:= undefined), + ?_assert(array:get(0, new(1,{default,0})) =:= 0), + ?_assert(array:get(9, new(10)) =:= undefined), + + ?_assertError(badarg, array:get(0, new(fixed))), + ?_assertError(badarg, array:get(1, new(1))), + ?_assertError(badarg, array:get(-1, new(1))), + ?_assertError(badarg, array:get(10, new(10))), + ?_assertError(badarg, array:set(-1, foo, new(10))), + ?_assertError(badarg, array:set(10, foo, no_array)), + + ?_assert(array:size(set(0, 17, new())) =:= 1), + ?_assert(array:size(set(N1-1, 17, new())) =:= N1), + ?_assert(array:size(set(0, 42, set(0, 17, new()))) =:= 1), + ?_assert(array:size(set(9, 42, set(0, 17, new()))) =:= 10), + + ?_assert(array:get(0, set(0, 17, new())) =:= 17), + ?_assert(array:get(0, set(1, 17, new())) =:= undefined), + ?_assert(array:get(1, set(1, 17, new())) =:= 17), + + ?_assert(array:get(0, fix(set(0, 17, new()))) =:= 17), + ?_assertError(badarg, array:get(1, fix(set(0, 17, new())))), + + ?_assert(array:get(N1-2, set(N1-1, 17, new())) =:= undefined), + ?_assert(array:get(N1-1, set(N1-1, 17, new())) =:= 17), + ?_assertError(badarg, array:get(N1, fix(set(N1-1, 17, new())))), + + ?_assert(array:get(0, set(0, 42, set(0, 17, new()))) =:= 42), + + ?_assert(array:get(0, reset(0, new())) =:= undefined), + ?_assert(array:get(0, reset(0, set(0, 17, new()))) =:= undefined), + ?_assert(array:get(0, reset(0, new({default,42}))) =:= 42), + ?_assert(array:get(0, reset(0, set(0, 17, new({default,42})))) + =:= 42) + ]. + +to_list_test_() -> + N0 = ?LEAFSIZE, + [?_assert([] =:= to_list(new())), + ?_assert([undefined] =:= to_list(new(1))), + ?_assert([undefined,undefined] =:= to_list(new(2))), + ?_assert(lists:duplicate(N0,0) =:= to_list(new(N0,{default,0}))), + ?_assert(lists:duplicate(N0+1,1) =:= to_list(new(N0+1,{default,1}))), + ?_assert(lists:duplicate(N0+2,2) =:= to_list(new(N0+2,{default,2}))), + ?_assert(lists:duplicate(666,6) =:= to_list(new(666,{default,6}))), + ?_assert([1,2,3] =:= to_list(set(2,3,set(1,2,set(0,1,new()))))), + ?_assert([3,2,1] =:= to_list(set(0,3,set(1,2,set(2,1,new()))))), + ?_assert([1|lists:duplicate(N0-2,0)++[1]] =:= + to_list(set(N0-1,1,set(0,1,new({default,0}))))), + ?_assert([1|lists:duplicate(N0-1,0)++[1]] =:= + to_list(set(N0,1,set(0,1,new({default,0}))))), + ?_assert([1|lists:duplicate(N0,0)++[1]] =:= + to_list(set(N0+1,1,set(0,1,new({default,0}))))), + ?_assert([1|lists:duplicate(N0*3,0)++[1]] =:= + to_list(set((N0*3)+1,1,set(0,1,new({default,0}))))), + ?_assertError(badarg, to_list(no_array)) + ]. + +sparse_to_list_test_() -> + N0 = ?LEAFSIZE, + [?_assert([] =:= sparse_to_list(new())), + ?_assert([] =:= sparse_to_list(new(1))), + ?_assert([] =:= sparse_to_list(new(1,{default,0}))), + ?_assert([] =:= sparse_to_list(new(2))), + ?_assert([] =:= sparse_to_list(new(2,{default,0}))), + ?_assert([] =:= sparse_to_list(new(N0,{default,0}))), + ?_assert([] =:= sparse_to_list(new(N0+1,{default,1}))), + ?_assert([] =:= sparse_to_list(new(N0+2,{default,2}))), + ?_assert([] =:= sparse_to_list(new(666,{default,6}))), + ?_assert([1,2,3] =:= sparse_to_list(set(2,3,set(1,2,set(0,1,new()))))), + ?_assert([3,2,1] =:= sparse_to_list(set(0,3,set(1,2,set(2,1,new()))))), + ?_assert([0,1] =:= sparse_to_list(set(N0-1,1,set(0,0,new())))), + ?_assert([0,1] =:= sparse_to_list(set(N0,1,set(0,0,new())))), + ?_assert([0,1] =:= sparse_to_list(set(N0+1,1,set(0,0,new())))), + ?_assert([0,1,2] =:= sparse_to_list(set(N0*10+1,2,set(N0*2+1,1,set(0,0,new()))))), + ?_assertError(badarg, sparse_to_list(no_array)) + ]. + +from_list_test_() -> + N0 = ?LEAFSIZE, + N1 = ?NODESIZE*N0, + N2 = ?NODESIZE*N1, + N3 = ?NODESIZE*N2, + N4 = ?NODESIZE*N3, + [?_assert(array:size(from_list([])) =:= 0), + ?_assert(array:is_fix(from_list([])) =:= false), + ?_assert(array:size(from_list([undefined])) =:= 1), + ?_assert(array:is_fix(from_list([undefined])) =:= false), + ?_assert(array:size(from_list(lists:seq(1,N1))) =:= N1), + ?_assert(to_list(from_list(lists:seq(1,N0))) =:= lists:seq(1,N0)), + ?_assert(to_list(from_list(lists:seq(1,N0+1))) =:= lists:seq(1,N0+1)), + ?_assert(to_list(from_list(lists:seq(1,N0+2))) =:= lists:seq(1,N0+2)), + ?_assert(to_list(from_list(lists:seq(1,N2))) =:= lists:seq(1,N2)), + ?_assert(to_list(from_list(lists:seq(1,N2+1))) =:= lists:seq(1,N2+1)), + ?_assert(to_list(from_list(lists:seq(0,N3))) =:= lists:seq(0,N3)), + ?_assert(to_list(from_list(lists:seq(0,N4))) =:= lists:seq(0,N4)), + ?_assertError(badarg, from_list([a,b,a,c|d])), + ?_assertError(badarg, from_list(no_array)) + ]. + +to_orddict_test_() -> + N0 = ?LEAFSIZE, + [?_assert([] =:= to_orddict(new())), + ?_assert([{0,undefined}] =:= to_orddict(new(1))), + ?_assert([{0,undefined},{1,undefined}] =:= to_orddict(new(2))), + ?_assert([{N,0}||N<-lists:seq(0,N0-1)] + =:= to_orddict(new(N0,{default,0}))), + ?_assert([{N,1}||N<-lists:seq(0,N0)] + =:= to_orddict(new(N0+1,{default,1}))), + ?_assert([{N,2}||N<-lists:seq(0,N0+1)] + =:= to_orddict(new(N0+2,{default,2}))), + ?_assert([{N,6}||N<-lists:seq(0,665)] + =:= to_orddict(new(666,{default,6}))), + ?_assert([{0,1},{1,2},{2,3}] =:= + to_orddict(set(2,3,set(1,2,set(0,1,new()))))), + ?_assert([{0,3},{1,2},{2,1}] =:= + to_orddict(set(0,3,set(1,2,set(2,1,new()))))), + ?_assert([{0,1}|[{N,0}||N<-lists:seq(1,N0-2)]++[{N0-1,1}]] + =:= to_orddict(set(N0-1,1,set(0,1,new({default,0}))))), + ?_assert([{0,1}|[{N,0}||N<-lists:seq(1,N0-1)]++[{N0,1}]] + =:= to_orddict(set(N0,1,set(0,1,new({default,0}))))), + ?_assert([{0,1}|[{N,0}||N<-lists:seq(1,N0)]++[{N0+1,1}]] + =:= to_orddict(set(N0+1,1,set(0,1,new({default,0}))))), + ?_assert([{0,0} | [{N,undefined}||N<-lists:seq(1,N0*2)]] ++ + [{N0*2+1,1} | [{N,undefined}||N<-lists:seq(N0*2+2,N0*10)]] ++ + [{N0*10+1,2}] =:= + to_orddict(set(N0*10+1,2,set(N0*2+1,1,set(0,0,new()))))), + ?_assertError(badarg, to_orddict(no_array)) + ]. + +sparse_to_orddict_test_() -> + N0 = ?LEAFSIZE, + [?_assert([] =:= sparse_to_orddict(new())), + ?_assert([] =:= sparse_to_orddict(new(1))), + ?_assert([] =:= sparse_to_orddict(new(1,{default,0}))), + ?_assert([] =:= sparse_to_orddict(new(2))), + ?_assert([] =:= sparse_to_orddict(new(2,{default,0}))), + ?_assert([] =:= sparse_to_orddict(new(N0,{default,0}))), + ?_assert([] =:= sparse_to_orddict(new(N0+1,{default,1}))), + ?_assert([] =:= sparse_to_orddict(new(N0+2,{default,2}))), + ?_assert([] =:= sparse_to_orddict(new(666,{default,6}))), + ?_assert([{0,1},{1,2},{2,3}] =:= + sparse_to_orddict(set(2,3,set(1,2,set(0,1,new()))))), + ?_assert([{0,3},{1,2},{2,1}] =:= + sparse_to_orddict(set(0,3,set(1,2,set(2,1,new()))))), + ?_assert([{0,1},{N0-1,1}] =:= + sparse_to_orddict(set(N0-1,1,set(0,1,new({default,0}))))), + ?_assert([{0,1},{N0,1}] =:= + sparse_to_orddict(set(N0,1,set(0,1,new({default,0}))))), + ?_assert([{0,1},{N0+1,1}] =:= + sparse_to_orddict(set(N0+1,1,set(0,1,new({default,0}))))), + ?_assert([{0,0},{N0*2+1,1},{N0*10+1,2}] =:= + sparse_to_orddict(set(N0*10+1,2,set(N0*2+1,1,set(0,0,new()))))), + ?_assertError(badarg, sparse_to_orddict(no_array)) + ]. + +from_orddict_test_() -> + N0 = ?LEAFSIZE, + N1 = ?NODESIZE*N0, + N2 = ?NODESIZE*N1, + N3 = ?NODESIZE*N2, + N4 = ?NODESIZE*N3, + [?_assert(array:size(from_orddict([])) =:= 0), + ?_assert(array:is_fix(from_orddict([])) =:= false), + ?_assert(array:size(from_orddict([{0,undefined}])) =:= 1), + ?_assert(array:is_fix(from_orddict([{0,undefined}])) =:= false), + ?_assert(array:size(from_orddict([{N0-1,undefined}])) =:= N0), + ?_assert(array:size(from_orddict([{N,0}||N<-lists:seq(0,N1-1)])) + =:= N1), + ?_assertError({badarg,_}, from_orddict([foo])), + ?_assertError({badarg,_}, from_orddict([{200,foo},{1,bar}])), + ?_assertError({badarg,_}, from_orddict([{N,0}||N<-lists:seq(0,N0-1)] ++ not_a_list)), + ?_assertError(badarg, from_orddict(no_array)), + + + ?_assert(?LET(L, [{N,0}||N<-lists:seq(0,N0-1)], + L =:= to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N,0}||N<-lists:seq(0,N0)], + L =:= to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N,0}||N<-lists:seq(0,N2-1)], + L =:= to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N,0}||N<-lists:seq(0,N2)], + L =:= to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N,0}||N<-lists:seq(0,N3-1)], + L =:= to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N,0}||N<-lists:seq(0,N4-1)], + L =:= to_orddict(from_orddict(L)))), + + %% Hole in the begining + ?_assert(?LET(L, [{0,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N0,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N3,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N4,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N0-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N1-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N3-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{N4-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + + %% Hole in middle + + ?_assert(?LET(L, [{0,0},{N0,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N3,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N4,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N0-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N1-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N3-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))), + ?_assert(?LET(L, [{0,0},{N4-1,0}], + L =:= sparse_to_orddict(from_orddict(L)))) + + ]. + +map_test_() -> + N0 = ?LEAFSIZE, + Id = fun (_,X) -> X end, + Plus = fun(N) -> fun (_,X) -> X+N end end, + Default = fun(_K,undefined) -> no_value; + (K,V) -> K+V + end, + [?_assertError(badarg, map([], new())), + ?_assertError(badarg, map([], new(10))), + ?_assert(to_list(map(Id, new())) =:= []), + ?_assert(to_list(map(Id, new(1))) =:= [undefined]), + ?_assert(to_list(map(Id, new(5,{default,0}))) =:= [0,0,0,0,0]), + ?_assert(to_list(map(Id, from_list([1,2,3,4]))) =:= [1,2,3,4]), + ?_assert(to_list(map(Plus(1), from_list([0,1,2,3]))) =:= [1,2,3,4]), + ?_assert(to_list(map(Plus(-1), from_list(lists:seq(1,11)))) + =:= lists:seq(0,10)), + ?_assert(to_list(map(Plus(11), from_list(lists:seq(0,99999)))) + =:= lists:seq(11,100010)), + ?_assert([{0,0},{N0*2+1,N0*2+1+1},{N0*100+1,N0*100+1+2}] =:= + sparse_to_orddict((map(Default, + set(N0*100+1,2, + set(N0*2+1,1, + set(0,0,new())))))#array{default = no_value})) + ]. + +sparse_map_test_() -> + N0 = ?LEAFSIZE, + Id = fun (_,X) -> X end, + Plus = fun(N) -> fun (_,X) -> X+N end end, + KeyPlus = fun (K,X) -> K+X end, + [?_assertError(badarg, sparse_map([], new())), + ?_assertError(badarg, sparse_map([], new(10))), + ?_assert(to_list(sparse_map(Id, new())) =:= []), + ?_assert(to_list(sparse_map(Id, new(1))) =:= [undefined]), + ?_assert(to_list(sparse_map(Id, new(5,{default,0}))) =:= [0,0,0,0,0]), + ?_assert(to_list(sparse_map(Id, from_list([1,2,3,4]))) =:= [1,2,3,4]), + ?_assert(to_list(sparse_map(Plus(1), from_list([0,1,2,3]))) + =:= [1,2,3,4]), + ?_assert(to_list(sparse_map(Plus(-1), from_list(lists:seq(1,11)))) + =:= lists:seq(0,10)), + ?_assert(to_list(sparse_map(Plus(11), from_list(lists:seq(0,99999)))) + =:= lists:seq(11,100010)), + ?_assert(to_list(sparse_map(Plus(1), set(1,1,new({default,0})))) + =:= [0,2]), + ?_assert(to_list(sparse_map(Plus(1), + set(3,4,set(0,1,new({default,0}))))) + =:= [2,0,0,5]), + ?_assert(to_list(sparse_map(Plus(1), + set(9,9,set(1,1,new({default,0}))))) + =:= [0,2,0,0,0,0,0,0,0,10]), + ?_assert([{0,0},{N0*2+1,N0*2+1+1},{N0*100+1,N0*100+1+2}] =:= + sparse_to_orddict(sparse_map(KeyPlus, + set(N0*100+1,2, + set(N0*2+1,1, + set(0,0,new())))))) + + ]. + +foldl_test_() -> + N0 = ?LEAFSIZE, + Count = fun (_,_,N) -> N+1 end, + Sum = fun (_,X,N) -> N+X end, + Reverse = fun (_,X,L) -> [X|L] end, + Vals = fun(_K,undefined,{C,L}) -> {C+1,L}; + (K,X,{C,L}) -> {C,[K+X|L]} + end, + [?_assertError(badarg, foldl([], 0, new())), + ?_assertError(badarg, foldl([], 0, new(10))), + ?_assert(foldl(Count, 0, new()) =:= 0), + ?_assert(foldl(Count, 0, new(1)) =:= 1), + ?_assert(foldl(Count, 0, new(10)) =:= 10), + ?_assert(foldl(Count, 0, from_list([1,2,3,4])) =:= 4), + ?_assert(foldl(Count, 10, from_list([0,1,2,3,4,5,6,7,8,9])) =:= 20), + ?_assert(foldl(Count, 1000, from_list(lists:seq(0,999))) =:= 2000), + ?_assert(foldl(Sum, 0, from_list(lists:seq(0,10))) =:= 55), + ?_assert(foldl(Reverse, [], from_list(lists:seq(0,1000))) + =:= lists:reverse(lists:seq(0,1000))), + ?_assert({999,[N0*100+1+2,N0*2+1+1,0]} =:= + foldl(Vals, {0,[]}, + set(N0*100+1,2, + set(N0*2+1,1, + set(0,0,new()))))) + + ]. + +sparse_foldl_test_() -> + N0 = ?LEAFSIZE, + Count = fun (_,_,N) -> N+1 end, + Sum = fun (_,X,N) -> N+X end, + Reverse = fun (_,X,L) -> [X|L] end, + Vals = fun(_K,undefined,{C,L}) -> {C+1,L}; + (K,X,{C,L}) -> {C,[K+X|L]} + end, + [?_assertError(badarg, sparse_foldl([], 0, new())), + ?_assertError(badarg, sparse_foldl([], 0, new(10))), + ?_assert(sparse_foldl(Count, 0, new()) =:= 0), + ?_assert(sparse_foldl(Count, 0, new(1)) =:= 0), + ?_assert(sparse_foldl(Count, 0, new(10,{default,1})) =:= 0), + ?_assert(sparse_foldl(Count, 0, from_list([0,1,2,3,4],0)) =:= 4), + ?_assert(sparse_foldl(Count, 0, from_list([0,1,2,3,4,5,6,7,8,9,0],0)) + =:= 9), + ?_assert(sparse_foldl(Count, 0, from_list(lists:seq(0,999),0)) + =:= 999), + ?_assert(sparse_foldl(Sum, 0, from_list(lists:seq(0,10), 5)) =:= 50), + ?_assert(sparse_foldl(Reverse, [], from_list(lists:seq(0,1000), 0)) + =:= lists:reverse(lists:seq(1,1000))), + ?_assert({0,[N0*100+1+2,N0*2+1+1,0]} =:= + sparse_foldl(Vals, {0,[]}, + set(N0*100+1,2, + set(N0*2+1,1, + set(0,0,new()))))) + ]. + +foldr_test_() -> + N0 = ?LEAFSIZE, + Count = fun (_,_,N) -> N+1 end, + Sum = fun (_,X,N) -> N+X end, + List = fun (_,X,L) -> [X|L] end, + Vals = fun(_K,undefined,{C,L}) -> {C+1,L}; + (K,X,{C,L}) -> {C,[K+X|L]} + end, + [?_assertError(badarg, foldr([], 0, new())), + ?_assertError(badarg, foldr([], 0, new(10))), + ?_assert(foldr(Count, 0, new()) =:= 0), + ?_assert(foldr(Count, 0, new(1)) =:= 1), + ?_assert(foldr(Count, 0, new(10)) =:= 10), + ?_assert(foldr(Count, 0, from_list([1,2,3,4])) =:= 4), + ?_assert(foldr(Count, 10, from_list([0,1,2,3,4,5,6,7,8,9])) =:= 20), + ?_assert(foldr(Count, 1000, from_list(lists:seq(0,999))) =:= 2000), + ?_assert(foldr(Sum, 0, from_list(lists:seq(0,10))) =:= 55), + ?_assert(foldr(List, [], from_list(lists:seq(0,1000))) + =:= lists:seq(0,1000)), + ?_assert({999,[0,N0*2+1+1,N0*100+1+2]} =:= + foldr(Vals, {0,[]}, + set(N0*100+1,2, + set(N0*2+1,1, + set(0,0,new()))))) + + ]. + +sparse_foldr_test_() -> + N0 = ?LEAFSIZE, + Count = fun (_,_,N) -> N+1 end, + Sum = fun (_,X,N) -> N+X end, + List = fun (_,X,L) -> [X|L] end, + Vals = fun(_K,undefined,{C,L}) -> {C+1,L}; + (K,X,{C,L}) -> {C,[K+X|L]} + end, + [?_assertError(badarg, sparse_foldr([], 0, new())), + ?_assertError(badarg, sparse_foldr([], 0, new(10))), + ?_assert(sparse_foldr(Count, 0, new()) =:= 0), + ?_assert(sparse_foldr(Count, 0, new(1)) =:= 0), + ?_assert(sparse_foldr(Count, 0, new(10,{default,1})) =:= 0), + ?_assert(sparse_foldr(Count, 0, from_list([0,1,2,3,4],0)) =:= 4), + ?_assert(sparse_foldr(Count, 0, from_list([0,1,2,3,4,5,6,7,8,9,0],0)) + =:= 9), + ?_assert(sparse_foldr(Count, 0, from_list(lists:seq(0,999),0)) + =:= 999), + ?_assert(sparse_foldr(Sum, 0, from_list(lists:seq(0,10),5)) =:= 50), + ?_assert(sparse_foldr(List, [], from_list(lists:seq(0,1000),0)) + =:= lists:seq(1,1000)), + + ?_assert(sparse_size(new()) =:= 0), + ?_assert(sparse_size(new(8)) =:= 0), + ?_assert(sparse_size(array:set(7, 0, new())) =:= 8), + ?_assert(sparse_size(array:set(7, 0, new(10))) =:= 8), + ?_assert(sparse_size(array:set(99, 0, new(10,{fixed,false}))) + =:= 100), + ?_assert(sparse_size(array:set(7, undefined, new())) =:= 0), + ?_assert(sparse_size(array:from_list([1,2,3,undefined])) =:= 3), + ?_assert(sparse_size(array:from_orddict([{3,0},{17,0},{99,undefined}])) + =:= 18), + ?_assert({0,[0,N0*2+1+1,N0*100+1+2]} =:= + sparse_foldr(Vals, {0,[]}, + set(N0*100+1,2, + set(N0*2+1,1, + set(0,0,new()))))) + ]. + +new_test(doc) -> []; +new_test(suite) -> []; +new_test(Config) when is_list(Config) -> new_test_(), ok. +fix_test(doc) -> []; +fix_test(suite) -> []; +fix_test(Config) when is_list(Config) -> fix_test_(), ok. +relax_test(doc) -> []; +relax_test(suite) -> []; +relax_test(Config) when is_list(Config) -> relax_test_(), ok. +resize_test(doc) -> []; +resize_test(suite) -> []; +resize_test(Config) when is_list(Config) -> resize_test_(), ok. +set_get_test(doc) -> []; +set_get_test(suite) -> []; +set_get_test(Config) when is_list(Config) -> set_get_test_(), ok. +to_list_test(doc) -> []; +to_list_test(suite) -> []; +to_list_test(Config) when is_list(Config) -> to_list_test_(), ok. +sparse_to_list_test(doc) -> []; +sparse_to_list_test(suite) -> []; +sparse_to_list_test(Config) when is_list(Config) -> sparse_to_list_test_(), ok. +from_list_test(doc) -> []; +from_list_test(suite) -> []; +from_list_test(Config) when is_list(Config) -> from_list_test_(), ok. +to_orddict_test(doc) -> []; +to_orddict_test(suite) -> []; +to_orddict_test(Config) when is_list(Config) -> to_orddict_test_(), ok. +sparse_to_orddict_test(doc) -> []; +sparse_to_orddict_test(suite) -> []; +sparse_to_orddict_test(Config) when is_list(Config) -> sparse_to_orddict_test_(), ok. +from_orddict_test(doc) -> []; +from_orddict_test(suite) -> []; +from_orddict_test(Config) when is_list(Config) -> from_orddict_test_(), ok. +map_test(doc) -> []; +map_test(suite) -> []; +map_test(Config) when is_list(Config) -> map_test_(), ok. +sparse_map_test(doc) -> []; +sparse_map_test(suite) -> []; +sparse_map_test(Config) when is_list(Config) -> sparse_map_test_(), ok. +foldl_test(doc) -> []; +foldl_test(suite) -> []; +foldl_test(Config) when is_list(Config) -> foldl_test_(), ok. +sparse_foldl_test(doc) -> []; +sparse_foldl_test(suite) -> []; +sparse_foldl_test(Config) when is_list(Config) -> sparse_foldl_test_(), ok. +foldr_test(doc) -> []; +foldr_test(suite) -> []; +foldr_test(Config) when is_list(Config) -> foldr_test_(), ok. +sparse_foldr_test(doc) -> []; +sparse_foldr_test(suite) -> []; +sparse_foldr_test(Config) when is_list(Config) -> sparse_foldr_test_(), ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/base64_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/base64_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/base64_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/base64_SUITE.erl 2009-11-20 13:32:29.000000000 +0000 @@ -0,0 +1,257 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(base64_SUITE). +-author('jakob@erix.ericsson.se'). + +-include("test_server.hrl"). +-include("test_server_line.hrl"). + +%% Test server specific exports +-export([all/1, init_per_testcase/2, end_per_testcase/2]). + +%% Test cases must be exported. +-export([base64_encode/1, base64_decode/1, base64_otp_5635/1, + base64_otp_6279/1, big/1, illegal/1, mime_decode/1, + roundtrip/1]). + +init_per_testcase(_, Config) -> + Dog = test_server:timetrap(?t:minutes(2)), + NewConfig = lists:keydelete(watchdog, 1, Config), + [{watchdog, Dog} | NewConfig]. + +end_per_testcase(_, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +%%------------------------------------------------------------------------- +%% Test cases starts here. +%%------------------------------------------------------------------------- +all(doc) -> + ["Test library functions for base64 encode and decode " + "(taken from inets/test/http_format_SUITE)"]; +all(suite) -> + [base64_encode, base64_decode, base64_otp_5635, + base64_otp_6279, big, illegal, mime_decode, + roundtrip]. + + +%%------------------------------------------------------------------------- +base64_encode(doc) -> + ["Test base64:encode/1."]; +base64_encode(suite) -> + []; +base64_encode(Config) when is_list(Config) -> + %% Two pads + <<"QWxhZGRpbjpvcGVuIHNlc2FtZQ==">> = + base64:encode("Aladdin:open sesame"), + %% One pad + <<"SGVsbG8gV29ybGQ=">> = base64:encode(<<"Hello World">>), + %% No pad + "QWxhZGRpbjpvcGVuIHNlc2Ft" = + base64:encode_to_string("Aladdin:open sesam"), + + "MDEyMzQ1Njc4OSFAIzBeJiooKTs6PD4sLiBbXXt9" = + base64:encode_to_string(<<"0123456789!@#0^&*();:<>,. []{}">>), + ok. +%%------------------------------------------------------------------------- +base64_decode(doc) -> + ["Test base64:decode/1."]; +base64_decode(suite) -> + []; +base64_decode(Config) when is_list(Config) -> + %% Two pads + <<"Aladdin:open sesame">> = + base64:decode("QWxhZGRpbjpvcGVuIHNlc2FtZQ=="), + %% One pad + <<"Hello World">> = base64:decode(<<"SGVsbG8gV29ybGQ=">>), + %% No pad + <<"Aladdin:open sesam">> = + base64:decode("QWxhZGRpbjpvcGVuIHNlc2Ft"), + + Alphabet = list_to_binary(lists:seq(0, 255)), + Alphabet = base64:decode(base64:encode(Alphabet)), + + %% Encoded base 64 strings may be devided by non base 64 chars. + %% In this cases whitespaces. + "0123456789!@#0^&*();:<>,. []{}" = + base64:decode_to_string( + "MDEy MzQ1Njc4 \tOSFAIzBeJ \niooKTs6 PD4sLi \r\nBbXXt9"), + "0123456789!@#0^&*();:<>,. []{}" = + base64:decode_to_string( + <<"MDEy MzQ1Njc4 \tOSFAIzBeJ \niooKTs6 PD4sLi \r\nBbXXt9">>), + ok. +%%------------------------------------------------------------------------- +base64_otp_5635(doc) -> + ["OTP-5635: Some data doesn't pass through base64:decode/1 " + "correctly"]; +base64_otp_5635(suite) -> + []; +base64_otp_5635(Config) when is_list(Config) -> + <<"===">> = base64:decode(base64:encode("===")), + ok. +%%------------------------------------------------------------------------- +base64_otp_6279(doc) -> + ["OTP-6279: Guard needed so that function fails in a correct" + "way for faulty input i.e. function_clause"]; +base64_otp_6279(suite) -> + []; +base64_otp_6279(Config) when is_list(Config) -> + {'EXIT',{function_clause, _}} = (catch base64:decode("dGVzda==a")), + ok. +%%------------------------------------------------------------------------- +big(doc) -> + ["Encode and decode big binaries."]; +big(suite) -> + []; +big(Config) when is_list(Config) -> + Big = make_big_binary(300000), + B = base64:encode(Big), + true = is_binary(B), + 400000 = byte_size(B), + Big = base64:decode(B), + Big = base64:mime_decode(B), + ok. +%%------------------------------------------------------------------------- +illegal(doc) -> + ["Make sure illegal characters are rejected when decoding."]; +illegal(suite) -> + []; +illegal(Config) when is_list(Config) -> + {'EXIT',{function_clause, _}} = (catch base64:decode("()")), + ok. +%%------------------------------------------------------------------------- +mime_decode(doc) -> + ["Test base64:mime_decode/1."]; +mime_decode(suite) -> + []; +mime_decode(Config) when is_list(Config) -> + %% Two pads + <<"Aladdin:open sesame">> = + base64:mime_decode("QWxhZGRpbjpvc()GVuIHNlc2FtZQ=="), + %% One pad, followed by ignored text + <<"Hello World">> = base64:mime_decode(<<"SGVsb)(G8gV29ybGQ=apa">>), + %% No pad + "Aladdin:open sesam" = + base64:mime_decode_to_string("QWxhZGRpbjpvcG¤\")(VuIHNlc2Ft"), + + %% Encoded base 64 strings may be divided by non base 64 chars. + %% In this cases whitespaces. + "0123456789!@#0^&*();:<>,. []{}" = + base64:mime_decode_to_string( + <<"MDEy MzQ1Njc4 \tOSFAIzBeJ \nio)(oKTs6 PD4sLi \r\nBbXXt9">>), + ok. + + +roundtrip(Config) when is_list(Config) -> + Sizes = lists:seq(1, 255) ++ lists:seq(2400-5, 2440), + roundtrip_1(Sizes, []). + +roundtrip_1([NextSize|Sizes], Current) -> + Len = length(Current), + io:format("~p", [Len]), + do_roundtrip(Current), + Next = random_byte_list(NextSize - Len, Current), + roundtrip_1(Sizes, Next); +roundtrip_1([], Last) -> + io:format("~p", [length(Last)]), + do_roundtrip(Last). + +do_roundtrip(List) -> + Bin = list_to_binary(List), + Base64Bin = base64:encode(List), + Base64Bin = base64:encode(Bin), + Base64List = base64:encode_to_string(List), + Base64Bin = list_to_binary(Base64List), + Bin = base64:decode(Base64Bin), + List = base64:decode_to_string(Base64Bin), + Bin = base64:mime_decode(Base64Bin), + List = base64:mime_decode_to_string(Base64Bin), + append_roundtrip(8, Bin, List, Base64Bin), + prepend_roundtrip(8, Bin, List, Base64List), + interleaved_ws_roundtrip(Bin, List, Base64List). + +append_roundtrip(0, _, _, _) -> ok; +append_roundtrip(N, Bin, List, Base64Bin0) -> + Base64Bin = <>, + Bin = base64:decode(Base64Bin), + List = base64:decode_to_string(Base64Bin), + Bin = base64:mime_decode(Base64Bin), + List = base64:mime_decode_to_string(Base64Bin), + + Base64List = binary_to_list(Base64Bin), + Bin = base64:decode(Base64List), + List = base64:decode_to_string(Base64List), + Bin = base64:mime_decode(Base64List), + List = base64:mime_decode_to_string(Base64List), + append_roundtrip(N-1, Bin, List, Base64Bin). + +prepend_roundtrip(0, _, _, _) -> ok; +prepend_roundtrip(N, Bin, List, Base64List0) -> + Base64List = [$\s|Base64List0], + Bin = base64:decode(Base64List), + List = base64:decode_to_string(Base64List), + Bin = base64:mime_decode(Base64List), + List = base64:mime_decode_to_string(Base64List), + + Base64Bin = list_to_binary(Base64List), + Bin = base64:decode(Base64Bin), + List = base64:decode_to_string(Base64Bin), + Bin = base64:mime_decode(Base64Bin), + List = base64:mime_decode_to_string(Base64Bin), + prepend_roundtrip(N-1, Bin, List, Base64List). + +%% Do an exhaustive test of interleaving whitespace (for short strings). +interleaved_ws_roundtrip(Bin, List, Base64List) when byte_size(Bin) =< 6 -> + interleaved_ws_roundtrip_1(lists:reverse(Base64List), [], Bin, List); +interleaved_ws_roundtrip(_, _, _) -> ok. + +interleaved_ws_roundtrip_1([H|T], Tail, Bin, List) -> + interleaved_ws_roundtrip_1(T, [H|Tail], Bin, List), + interleaved_ws_roundtrip_1(T, [H,$\s|Tail], Bin, List), + interleaved_ws_roundtrip_1(T, [H,$\s,$\t|Tail], Bin, List), + interleaved_ws_roundtrip_1(T, [H,$\n,$\t|Tail], Bin, List); +interleaved_ws_roundtrip_1([], Base64List, Bin, List) -> + Bin = base64:decode(Base64List), + List = base64:decode_to_string(Base64List), + Bin = base64:mime_decode(Base64List), + List = base64:mime_decode_to_string(Base64List), + + Base64Bin = list_to_binary(Base64List), + Bin = base64:decode(Base64Bin), + List = base64:decode_to_string(Base64Bin), + Bin = base64:mime_decode(Base64Bin), + List = base64:mime_decode_to_string(Base64Bin), + ok. + +random_byte_list(0, Acc) -> + Acc; +random_byte_list(N, Acc) -> + random_byte_list(N-1, [random:uniform(255)|Acc]). + +make_big_binary(N) -> + list_to_binary(mbb(N, [])). + +mbb(N, Acc) when N > 256 -> + B = list_to_binary(lists:seq(0, 255)), + mbb(N - 256, [B | Acc]); +mbb(N, Acc) -> + B = list_to_binary(lists:seq(0, N-1)), + lists:reverse(Acc, B). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/beam_lib_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/beam_lib_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/beam_lib_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/beam_lib_SUITE.erl 2009-11-20 13:31:13.000000000 +0000 @@ -0,0 +1,761 @@ +%% +%% %CopyrightBegin% +%% +%% %CopyrightEnd% +%% +-module(beam_lib_SUITE). + +%-define(debug, true). + +-ifdef(debug). +-define(format(S, A), io:format(S, A)). +-define(line, put(line, ?LINE), ). +-define(config(X,Y), "./log_dir/"). +-define(t,test_server). +-define(privdir, "beam_lib_SUITE_priv"). +-else. +-include("test_server.hrl"). +-define(format(S, A), ok). +-define(privdir, ?config(priv_dir, Conf)). +-endif. + +-export([all/1, normal/1, error/1, cmp/1, cmp_literals/1, strip/1, otp_6711/1, + building/1, md5/1, encrypted_abstr/1, encrypted_abstr_file/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +all(suite) -> + [error, normal, cmp, cmp_literals, strip, otp_6711, building, md5, + encrypted_abstr, encrypted_abstr_file]. + +init_per_testcase(_Case, Config) -> + Dog=?t:timetrap(?t:minutes(2)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +normal(suite) -> []; +normal(doc) -> ["Read correct beam file"]; +normal(Conf) when is_list(Conf) -> + ?line PrivDir = ?privdir, + ?line Simple = filename:join(PrivDir, "simple"), + ?line Source = Simple ++ ".erl", + ?line BeamFile = Simple ++ ".beam", + ?line simple_file(Source), + + ?line NoOfTables = length(ets:all()), + ?line P0 = pps(), + + CompileFlags = [{outdir,PrivDir}, debug_info], + ?line {ok,_} = compile:file(Source, CompileFlags), + ?line {ok, Binary} = file:read_file(BeamFile), + + ?line do_normal(BeamFile), + ?line do_normal(Binary), + + ?line {ok,_} = compile:file(Source, [{outdir,PrivDir}, no_debug_info]), + ?line {ok, {simple, [{abstract_code, no_abstract_code}]}} = + beam_lib:chunks(BeamFile, [abstract_code]), + + %% ?line {ok,_} = compile:file(Source, [compressed | CompileFlags]), + %% ?line do_normal(BeamFile), + + ?line file:delete(BeamFile), + ?line file:delete(Source), + ?line NoOfTables = length(ets:all()), + ?line true = (P0 == pps()), + ok. + +do_normal(BeamFile) -> + ?line Imports = {imports, [{erlang, get_module_info, 1}, + {erlang, get_module_info, 2}, + {lists, member, 2}]}, + ?line Exports = {exports, [{module_info, 0}, {module_info, 1}, {t, 0}]}, + ?line Local = {locals, [{t, 1}]}, + ?line {ok, {simple, [Imports]}} = beam_lib:chunks(BeamFile, [imports]), + ?line {ok, {simple, [{"ImpT",_Bin}]}} = + beam_lib:chunks(BeamFile, ["ImpT"]), + ?line {ok, {simple, [Exports]}} = beam_lib:chunks(BeamFile, [exports]), + ?line {ok, {simple, [{attributes, [{vsn, [_]}]}]}} = + beam_lib:chunks(BeamFile, [attributes]), + ?line {ok, {simple, [{compile_info, _}=CompileInfo]}} = + beam_lib:chunks(BeamFile, [compile_info]), + ?line {ok, {simple, [Local]}} = beam_lib:chunks(BeamFile, [locals]), + ?line {ok, {simple, [{attributes, [{vsn, [_]}]}, CompileInfo, + Exports, Imports, Local]}} = + beam_lib:chunks(BeamFile, [attributes, compile_info, exports, imports, locals]), + ?line {ok, {simple, [{atoms, _Atoms}]}} = + beam_lib:chunks(BeamFile, [atoms]), + ?line {ok, {simple, [{labeled_exports, _LExports}]}} = + beam_lib:chunks(BeamFile, [labeled_exports]), + ?line {ok, {simple, [{labeled_locals, _LLocals}]}} = + beam_lib:chunks(BeamFile, [labeled_locals]), + ?line {ok, {simple, [_Vsn]}} = beam_lib:version(BeamFile), + ?line {ok, {simple, [{abstract_code, _}]}} = + beam_lib:chunks(BeamFile, [abstract_code]), + + %% Test reading optional chunks. + All = ["Atom", "Code", "StrT", "ImpT", "ExpT", "FunT", "LitT"], + ?line {ok,{simple,Chunks}} = beam_lib:chunks(BeamFile, All, [allow_missing_chunks]), + ?line verify_simple(Chunks). + +verify_simple([{"Atom", AtomBin}, + {"Code", CodeBin}, + {"StrT", StrBin}, + {"ImpT", ImpBin}, + {"ExpT", ExpBin}, + {"FunT", missing_chunk}, + {"LitT", missing_chunk}]) + when is_binary(AtomBin), is_binary(CodeBin), is_binary(StrBin), + is_binary(ImpBin), is_binary(ExpBin) -> + ok. + +error(suite) -> []; +error(doc) -> ["Read invalid beam files"]; +error(Conf) when is_list(Conf) -> + ?line PrivDir = ?privdir, + ?line Simple = filename:join(PrivDir, "simple"), + ?line Source = Simple ++ ".erl", + ?line BeamFile = Simple ++ ".beam", + ?line WrongFile = Simple ++ "foo.beam", + ?line simple_file(Source), + + ?line NoOfTables = length(ets:all()), + ?line P0 = pps(), + ?line {ok,_} = compile:file(Source, [{outdir,PrivDir},debug_info]), + ?line ACopy = filename:join(PrivDir, "a_copy.beam"), + ?line copy_file(BeamFile, ACopy), + + ?line {ok, Binary} = file:read_file(BeamFile), + + ?line copy_file(ACopy, WrongFile), + ?line verify(file_error, beam_lib:info("./does_simply_not_exist")), + + ?line do_error(BeamFile, ACopy), + ?line do_error(Binary, ACopy), + + ?line copy_file(ACopy, BeamFile), + ?line verify(unknown_chunk, beam_lib:chunks(BeamFile, [not_a_chunk])), + + ?line ok = file:write_file(BeamFile, <<>>), + ?line verify(not_a_beam_file, beam_lib:info(BeamFile)), + ?line verify(not_a_beam_file, beam_lib:info(<<>>)), + ?line ok = file:write_file(BeamFile, <<"short">>), + ?line verify(not_a_beam_file, beam_lib:info(BeamFile)), + ?line verify(not_a_beam_file, beam_lib:info(<<"short">>)), + + ?line {Binary1, _} = split_binary(Binary, byte_size(Binary)-10), + ?line verify(chunk_too_big, beam_lib:chunks(Binary1, ["Abst"])), + ?line Chunks = chunk_info(Binary), + ?line {value, {_, AbstractStart, _}} = lists:keysearch("Abst", 1, Chunks), + ?line {Binary2, _} = split_binary(Binary, AbstractStart), + ?line verify(chunk_too_big, beam_lib:chunks(Binary2, ["Abst"])), + ?line {Binary3, _} = split_binary(Binary, AbstractStart-4), + ?line verify(invalid_beam_file, beam_lib:chunks(Binary3, ["Abst"])), + + %% Instead of the 5:32 field below, there used to be control characters + %% (including zero bytes) directly in the string. Because inferior programs + %% such as sed and clearcasediff don't like zero bytes in text files, + %% we have eliminated them. + ?line ok = file:write_file(BeamFile, <<"FOR1",5:32,"BEAMfel">>), +% ?line verify(invalid_beam_file, beam_lib:info(BeamFile)), +% ?line verify(invalid_beam_file, beam_lib:info(<<"FOR1",5:32,"BEAMfel">>)), + + ?line NoOfTables = length(ets:all()), + ?line true = (P0 == pps()), + ?line file:delete(Source), + ?line file:delete(WrongFile), + ?line file:delete(BeamFile), + ?line file:delete(ACopy), + ok. + +do_error(BeamFile, ACopy) -> + % evil tests + ?line Chunks = chunk_info(BeamFile), + ?line {value, {_, AtomStart, _}} = lists:keysearch("Atom", 1, Chunks), + ?line {value, {_, ImportStart, _}} = lists:keysearch("ImpT", 1, Chunks), + ?line {value, {_, AbstractStart, _}} = lists:keysearch("Abst", 1, Chunks), + ?line {value, {_, AttributesStart, _}} = + lists:keysearch("Attr", 1, Chunks), + ?line {value, {_, CompileInfoStart, _}} = + lists:keysearch("CInf", 1, Chunks), + ?line verify(missing_chunk, beam_lib:chunks(BeamFile, ["__"])), + ?line BF2 = set_byte(ACopy, BeamFile, ImportStart+4, 17), + ?line verify(invalid_chunk, beam_lib:chunks(BF2, [imports])), + ?line BF3 = set_byte(ACopy, BeamFile, AtomStart-6, 17), + ?line verify(missing_chunk, beam_lib:chunks(BF3, [imports])), + ?line BF4 = set_byte(ACopy, BeamFile, AbstractStart+10, 17), + ?line verify(invalid_chunk, beam_lib:chunks(BF4, [abstract_code])), + ?line BF5 = set_byte(ACopy, BeamFile, AttributesStart+10, 17), + ?line verify(invalid_chunk, beam_lib:chunks(BF5, [attributes])), + + ?line BF6 = set_byte(ACopy, BeamFile, 1, 17), + ?line verify(not_a_beam_file, beam_lib:info(BF6)), + ?line BF7 = set_byte(ACopy, BeamFile, 9, 17), + ?line verify(not_a_beam_file, beam_lib:info(BF7)), + + ?line BF8 = set_byte(ACopy, BeamFile, 13, 17), + ?line verify(missing_chunk, beam_lib:chunks(BF8, ["Atom"])), + + ?line BF9 = set_byte(ACopy, BeamFile, CompileInfoStart+10, 17), + ?line verify(invalid_chunk, beam_lib:chunks(BF9, [compile_info])). + + +cmp(suite) -> []; +cmp(doc) -> ["Compare contents of BEAM files and directories"]; +cmp(Conf) when is_list(Conf) -> + ?line PrivDir = ?privdir, + + ?line Dir1 = filename:join(PrivDir, dir1), + ?line Dir2 = filename:join(PrivDir, dir2), + + ok = file:make_dir(Dir1), + ok = file:make_dir(Dir2), + + ?line {SourceD1, BeamFileD1} = make_beam(Dir1, simple, member), + ?line {Source2D1, BeamFile2D1} = make_beam(Dir1, simple2, concat), + ?line {SourceD2, BeamFileD2} = make_beam(Dir2, simple, concat), + + ?line NoOfTables = length(ets:all()), + ?line P0 = pps(), + + %% cmp + ?line ok = beam_lib:cmp(BeamFileD1, BeamFileD1), + ?line ver(modules_different, beam_lib:cmp(BeamFileD1, BeamFile2D1)), + ?line ver(chunks_different, beam_lib:cmp(BeamFileD1, BeamFileD2)), + ?line verify(file_error, beam_lib:cmp(foo, bar)), + + ?line {ok, B1} = file:read_file(BeamFileD1), + ?line ok = beam_lib:cmp(B1, BeamFileD1), + ?line {ok, B2} = file:read_file(BeamFileD2), + ?line ver(chunks_different, beam_lib:cmp(B1, B2)), + + %% cmp_dirs + ?line {[],[],[]} = beam_lib:cmp_dirs(Dir1, Dir1), + ?line true = {[BeamFile2D1], [], [{BeamFileD1,BeamFileD2}]} == + beam_lib:cmp_dirs(Dir1, Dir2), + ?line true = {[], [BeamFile2D1], [{BeamFileD2,BeamFileD1}]} == + beam_lib:cmp_dirs(Dir2, Dir1), + ?line ver(not_a_directory, beam_lib:cmp_dirs(foo, bar)), + + %% diff_dirs + ?line ok = beam_lib:diff_dirs(Dir1, Dir1), + ?line ver(not_a_directory, beam_lib:diff_dirs(foo, bar)), + + ?line true = (P0 == pps()), + ?line NoOfTables = length(ets:all()), + ?line delete_files([SourceD1, BeamFileD1, Source2D1, + BeamFile2D1, SourceD2, BeamFileD2]), + + file:del_dir(Dir1), + file:del_dir(Dir2), + ok. + +cmp_literals(suite) -> []; +cmp_literals(doc) -> ["Compare contents of BEAM files having literals"]; +cmp_literals(Conf) when is_list(Conf) -> + ?line PrivDir = ?privdir, + + ?line Dir1 = filename:join(PrivDir, dir1), + ?line Dir2 = filename:join(PrivDir, dir2), + + ok = file:make_dir(Dir1), + ok = file:make_dir(Dir2), + + ?line {SourceD1, BeamFileD1} = make_beam(Dir1, simple, constant), + ?line {SourceD2, BeamFileD2} = make_beam(Dir2, simple, constant2), + + ?line NoOfTables = length(ets:all()), + ?line P0 = pps(), + + %% cmp + ?line ok = beam_lib:cmp(BeamFileD1, BeamFileD1), + ?line ver(chunks_different, beam_lib:cmp(BeamFileD1, BeamFileD2)), + + ?line {ok, B1} = file:read_file(BeamFileD1), + ?line ok = beam_lib:cmp(B1, BeamFileD1), + ?line {ok, B2} = file:read_file(BeamFileD2), + ?line ver(chunks_different, beam_lib:cmp(B1, B2)), + + ?line true = (P0 == pps()), + ?line NoOfTables = length(ets:all()), + + ?line delete_files([SourceD1, BeamFileD1, SourceD2, BeamFileD2]), + + file:del_dir(Dir1), + file:del_dir(Dir2), + ok. + +strip(suite) -> []; +strip(doc) -> ["Strip BEAM files"]; +strip(Conf) when is_list(Conf) -> + ?line PrivDir = ?privdir, + ?line {SourceD1, BeamFileD1} = make_beam(PrivDir, simple, member), + ?line {Source2D1, BeamFile2D1} = make_beam(PrivDir, simple2, concat), + ?line {Source3D1, BeamFile3D1} = make_beam(PrivDir, make_fun, make_fun), + ?line {Source4D1, BeamFile4D1} = make_beam(PrivDir, constant, constant), + + ?line NoOfTables = length(ets:all()), + ?line P0 = pps(), + + %% strip binary + ?line verify(not_a_beam_file, beam_lib:strip(<<>>)), + ?line {ok, B1} = file:read_file(BeamFileD1), + ?line {ok, {simple, NB1}} = beam_lib:strip(B1), + ?line BId1 = chunk_ids(B1), + ?line NBId1 = chunk_ids(NB1), + ?line true = length(BId1) > length(NBId1), + ?line compare_chunks(B1, NB1, NBId1), + + %% strip file + ?line verify(file_error, beam_lib:strip(foo)), + ?line {ok, {simple, _}} = beam_lib:strip(BeamFileD1), + ?line compare_chunks(NB1, BeamFileD1, NBId1), + + %% strip_files + ?line {ok, B2} = file:read_file(BeamFile2D1), + ?line {ok, [{simple,_},{simple2,_}]} = beam_lib:strip_files([B1, B2]), + ?line {ok, [{simple,_},{simple2,_},{make_fun,_},{constant,_}]} = + beam_lib:strip_files([BeamFileD1, BeamFile2D1, BeamFile3D1, BeamFile4D1]), + + %% check that each module can be loaded. + ?line {module, simple} = code:load_abs(filename:rootname(BeamFileD1)), + ?line {module, simple2} = code:load_abs(filename:rootname(BeamFile2D1)), + ?line {module, make_fun} = code:load_abs(filename:rootname(BeamFile3D1)), + ?line {module, constant} = code:load_abs(filename:rootname(BeamFile4D1)), + + ?line true = (P0 == pps()), + ?line NoOfTables = length(ets:all()), + + ?line delete_files([SourceD1, BeamFileD1, + Source2D1, BeamFile2D1, + Source3D1, BeamFile3D1, + Source4D1, BeamFile4D1]), + ok. + + +otp_6711(Conf) when is_list(Conf) -> + ?line {'EXIT',{function_clause,_}} = (catch {a, beam_lib:info(3)}), + ?line {'EXIT',{function_clause,_}} = (catch {a, beam_lib:chunks(a, b)}), + ?line {'EXIT',{function_clause,_}} = (catch {a, beam_lib:chunks(a,b,c)}), + ?line {'EXIT',{function_clause,_}} = (catch {a, beam_lib:all_chunks(3)}), + ?line {'EXIT',{function_clause,_}} = (catch {a, beam_lib:cmp(3,4)}), + ?line {'EXIT',{function_clause,_}} = (catch {a, beam_lib:strip(3)}), + ?line {'EXIT',{function_clause,_}} = + (catch {a, beam_lib:strip_files([3])}), + + ?line PrivDir = ?privdir, + ?line Dir = filename:join(PrivDir, dir), + ?line Lib = filename:join(Dir, "lib"), + ?line App = filename:join(Lib, "app"), + ?line EBin = filename:join(App, "ebin"), + + ok = file:make_dir(Dir), + ok = file:make_dir(Lib), + ok = file:make_dir(App), + ok = file:make_dir(EBin), + + ?line {SourceD, BeamFileD} = make_beam(EBin, simple, member), + + unwritable(BeamFileD), + + %% There is no way that strip_release can fail with + %% function_clause or something like that... + ?line {error,_,{file_error,_,_}} = beam_lib:strip_release(Dir), + + ?line delete_files([SourceD, BeamFileD]), + file:del_dir(EBin), + file:del_dir(App), + file:del_dir(Lib), + file:del_dir(Dir), + ok. + +-include_lib("kernel/include/file.hrl"). + +unwritable(Fname) -> + {ok, Info} = file:read_file_info(Fname), + Mode = Info#file_info.mode - 8#00200, + file:write_file_info(Fname, Info#file_info{mode = Mode}). + +building(doc) -> "Testing building of BEAM files."; +building(Conf) when is_list(Conf) -> + ?line PrivDir = ?privdir, + + ?line Dir1 = filename:join(PrivDir, b_dir1), + ?line Dir2 = filename:join(PrivDir, b_dir2), + + ok = file:make_dir(Dir1), + ok = file:make_dir(Dir2), + + ?line {SourceD1, BeamFileD1} = make_beam(Dir1, building, member), + + ?line NoOfTables = length(ets:all()), + ?line P0 = pps(), + + %% read all chunks + ?line ChunkIds = chunk_ids(BeamFileD1), + ?line {ok, _Mod, Chunks} = beam_lib:all_chunks(BeamFileD1), + ?line ChunkIds = lists:map(fun ({Id, Data}) when is_binary(Data) -> Id + end, Chunks), + + %% write a new beam file, with reversed chunk order + ?line BeamFileD2 = filename:join(Dir2, "building.beam"), + ?line {ok,RevBeam} = beam_lib:build_module(lists:reverse(Chunks)), + ?line file:write_file(BeamFileD2, RevBeam), + + %% compare files + ?line compare_chunks(BeamFileD1, BeamFileD2, ChunkIds), + + %% test that we can retrieve a chunk before the atom table + %% (actually, try to retrieve all chunks) + + ?line lists:foreach(fun(Id) -> + {ok, {building, [{Id, _Data}]}} = + beam_lib:chunks(BeamFileD1, [Id]) + end, ChunkIds), + ?line lists:foreach(fun(Id) -> + {ok, {building, [{Id, _Data}]}} = + beam_lib:chunks(BeamFileD2, [Id]) + end, ChunkIds), + + ?line true = (P0 == pps()), + ?line NoOfTables = length(ets:all()), + + ?line delete_files([SourceD1, BeamFileD1, BeamFileD2]), + file:del_dir(Dir1), + file:del_dir(Dir2), + ok. + +md5(suite) -> []; +md5(doc) -> ["Compare beam_lib:md5/1 and code:module_md5/1."]; +md5(Conf) when is_list(Conf) -> + ?line Beams = collect_beams(), + io:format("Found ~w beam files", [length(Beams)]), + md5_1(Beams). + +md5_1([N|Ns]) -> + {ok,Beam0} = file:read_file(N), + Beam = maybe_uncompress(Beam0), + {ok,{Mod,MD5}} = beam_lib:md5(Beam), + {Mod,MD5} = {Mod,code:module_md5(Beam)}, + md5_1(Ns); +md5_1([]) -> ok. + +collect_beams() -> + SuperDir = filename:dirname(filename:dirname(code:which(?MODULE))), + TestDirs = filelib:wildcard(filename:join([SuperDir,"*_test"])), + AbsDirs = [filename:absname(X) || X <- code:get_path()], + collect_beams_1(AbsDirs ++ TestDirs). + +collect_beams_1([Dir|Dirs]) -> + filelib:wildcard(filename:join(Dir, "*.beam")) ++ collect_beams_1(Dirs); +collect_beams_1([]) -> []. + +maybe_uncompress(<<"FOR1",_/binary>>=Beam) -> Beam; +maybe_uncompress(Beam) -> zlib:gunzip(Beam). + +encrypted_abstr(suite) -> []; +encrypted_abstr(doc) -> ["Test encrypted abstract format"]; +encrypted_abstr(Conf) when is_list(Conf) -> + run_if_crypto_works(fun() -> encrypted_abstr_1(Conf) end). + +encrypted_abstr_1(Conf) -> + ?line PrivDir = ?privdir, + ?line Simple = filename:join(PrivDir, "simple"), + ?line Source = Simple ++ ".erl", + ?line BeamFile = Simple ++ ".beam", + ?line simple_file(Source), + + %% Avoid getting an extra port when crypto starts erl_ddll. + ?line erl_ddll:start(), + + ?line NoOfTables = length(ets:all()), + ?line P0 = pps(), + + Key = "#a_crypto_key", + CompileFlags = [{outdir,PrivDir}, debug_info, {debug_info_key,Key}], + ?line {ok,_} = compile:file(Source, CompileFlags), + ?line {ok, Binary} = file:read_file(BeamFile), + + ?line do_encrypted_abstr(BeamFile, Key), + ?line do_encrypted_abstr(Binary, Key), + + ?line ok = crypto:stop(), %To get rid of extra ets tables. + ?line file:delete(BeamFile), + ?line file:delete(Source), + ?line NoOfTables = length(ets:all()), + ?line true = (P0 == pps()), + ok. + +do_encrypted_abstr(Beam, Key) -> + ?line verify(key_missing_or_invalid, beam_lib:chunks(Beam, [abstract_code])), + + %% The raw chunk "Abst" can still be read even without a key. + ?line {ok,{simple,[{"Abst",Abst}]}} = beam_lib:chunks(Beam, ["Abst"]), + ?line <<0:8,8:8,"des3_cbc",_/binary>> = Abst, + + %% Try som invalid funs. + ?line bad_fun(badfun, fun() -> ok end), + ?line bad_fun(badfun, {a,b}), + ?line bad_fun(blurf), + ?line {function_clause,_} = bad_fun(fun(glurf) -> ok end), + + %% Funs that return something strange. + ?line bad_fun(badfun, fun(init) -> {ok,fun() -> ok end} end), + ?line glurf = bad_fun(fun(init) -> {error,glurf} end), + + %% Try clearing (non-existing fun). + ?line undefined = beam_lib:clear_crypto_key_fun(), + + %% Install a fun which cannot retrieve a key. + ?line ok = beam_lib:crypto_key_fun(fun(init) -> ok end), + ?line {error,beam_lib,Error} = beam_lib:chunks(Beam, [abstract_code]), + + %% Install a fun which returns an incorrect key. + ?line {ok,_} = beam_lib:clear_crypto_key_fun(), + ?line ok = beam_lib:crypto_key_fun(simple_crypto_fun("wrong key...")), + ?line {error,beam_lib,Error} = beam_lib:chunks(Beam, [abstract_code]), + + %% Installing a new key fun is not possible without clearing the old. + ?line verify(exists, beam_lib:crypto_key_fun(simple_crypto_fun(Key))), + + %% Install the simplest possible working key fun. + ?line {ok,_} = beam_lib:clear_crypto_key_fun(), + ?line ok = beam_lib:crypto_key_fun(simple_crypto_fun(Key)), + ?line verify_abstract(Beam), + ?line {ok,{simple,[{"Abst",Abst}]}} = beam_lib:chunks(Beam, ["Abst"]), + + %% Installing a new key fun is not possible without clearing the old. + verify(exists, beam_lib:crypto_key_fun(ets_crypto_fun(Key))), + + %% Install a key using an ets table. + ?line {ok,_} = beam_lib:clear_crypto_key_fun(), + ?line ok = beam_lib:crypto_key_fun(ets_crypto_fun(Key)), + ?line verify_abstract(Beam), + ?line {ok,{simple,[{"Abst",Abst}]}} = beam_lib:chunks(Beam, ["Abst"]), + + ?line {ok,cleared} = beam_lib:clear_crypto_key_fun(), + ok. + + +bad_fun(F) -> + {error,E} = beam_lib:crypto_key_fun(F), + E. + +bad_fun(S, F) -> + verify(S, beam_lib:crypto_key_fun(F)). + + +verify_abstract(Beam) -> + {ok,{simple,[Chunk]}} = beam_lib:chunks(Beam, [abstract_code]), + {abstract_code,{raw_abstract_v1,_}} = Chunk. + +simple_crypto_fun(Key) -> + fun(init) -> ok; + ({debug_info, des3_cbc, simple, _}) -> Key + end. + +ets_crypto_fun(Key) -> + fun(init) -> + T = ets:new(beam_lib_SUITE_keys, [private, set]), + true = ets:insert(T, {key,Key}), + {ok,fun({debug_info, des3_cbc, simple, _}) -> + [{key,Val}] = ets:lookup(T, key), + Val; + (clear) -> + ets:delete(T), + cleared + end} + end. + +encrypted_abstr_file(suite) -> []; +encrypted_abstr_file(doc) -> + ["Test encrypted abstract format with the key in .erlang.crypt"]; +encrypted_abstr_file(Conf) when is_list(Conf) -> + run_if_crypto_works(fun() -> encrypted_abstr_file_1(Conf) end). + +encrypted_abstr_file_1(Conf) -> + ?line PrivDir = ?privdir, + ?line Simple = filename:join(PrivDir, "simple"), + ?line Source = Simple ++ ".erl", + ?line BeamFile = Simple ++ ".beam", + ?line simple_file(Source), + + %% Avoid getting an extra port when crypto starts erl_ddll. + ?line erl_ddll:start(), + + ?line NoOfTables = length(ets:all()), + ?line P0 = pps(), + + Key = "Long And niCe 99Krypto Key", + CompileFlags = [{outdir,PrivDir}, debug_info, {debug_info_key,Key}], + ?line {ok,_} = compile:file(Source, CompileFlags), + ?line {ok, Binary} = file:read_file(BeamFile), + + ?line {ok,OldCwd} = file:get_cwd(), + ?line ok = file:set_cwd(PrivDir), + ?line do_encrypted_abstr_file(BeamFile, Key), + ?line do_encrypted_abstr_file(Binary, Key), + ?line ok = file:set_cwd(OldCwd), + + ?line ok = crypto:stop(), %To get rid of extra ets tables. + ?line file:delete(filename:join(PrivDir, ".erlang.crypt")), + ?line file:delete(BeamFile), + ?line file:delete(Source), + ?line NoOfTables = length(ets:all()), + ?line true = (P0 == pps()), + ok. + +do_encrypted_abstr_file(Beam, Key) -> + %% No key. + ?line write_crypt_file(""), + ?line {error,beam_lib,Error} = beam_lib:chunks(Beam, [abstract_code]), + + %% A wrong key. + ?line write_crypt_file(["[{debug_info,des3_cbc,simple,\"A Wrong Key\"}].\n"]), + ?line {error,beam_lib,Error} = beam_lib:chunks(Beam, [abstract_code]), + + %% Write correct key... + ?line write_crypt_file(["[{debug_info,des3_cbc,simple,\"",Key,"\"}].\n"]), + + %% ... but the fun with the wrong key is still there. + ?line {error,beam_lib,Error} = beam_lib:chunks(Beam, [abstract_code]), + + %% Clear the fun. Now it should work. + ?line {ok,_} = beam_lib:clear_crypto_key_fun(), + ?line verify_abstract(Beam), + ?line verify_abstract(Beam), + ?line ok = file:delete(".erlang.crypt"), + ?line verify_abstract(Beam), + + %% Clear, otherwise the second pass will fail. + ?line {ok,_} = beam_lib:clear_crypto_key_fun(), + ?line {error,beam_lib,Error} = beam_lib:chunks(Beam, [abstract_code]), + ok. + +write_crypt_file(Contents0) -> + Contents = list_to_binary([Contents0]), + io:format("~s\n", [binary_to_list(Contents)]), + ok = file:write_file(".erlang.crypt", Contents). + +compare_chunks(File1, File2, ChunkIds) -> + ?line {ok, {_, Chunks1}} = beam_lib:chunks(File1, ChunkIds), + ?line {ok, {_, Chunks2}} = beam_lib:chunks(File2, ChunkIds), + ?line true = Chunks1 == Chunks2. + +chunk_ids(File) -> + ?line lists:map(fun({Id,_Start,_Size}) -> Id end, chunk_info(File)). + +chunk_info(File) -> + ?line {value, {chunks, Chunks}} = + lists:keysearch(chunks, 1, beam_lib:info(File)), + Chunks. + +make_beam(Dir, Module, F) -> + ?line FileBase = filename:join(Dir, Module), + ?line Source = FileBase ++ ".erl", + ?line BeamFile = FileBase ++ ".beam", + ?line simple_file(Source, Module, F), + ?line {ok, _} = compile:file(Source, [{outdir,Dir}, debug_info, report]), + {Source, BeamFile}. + +set_byte(_Backup, Binary, Pos, Byte) when is_binary(Binary) -> + ?line <> = Binary, + NB = <>, + NB; +set_byte(Backup, File, Pos, Byte) -> + ?line copy_file(Backup, File), + ?line set_byte(File, Pos, Byte), + File. + +set_byte(File, Pos, Byte) -> + ?line {ok, Fd} = file:open(File, [read, write]), + ?line {ok, _} = file:position(Fd, Pos), + ?line ok = file:write(Fd, [Byte]), + ?line file:close(Fd). + +copy_file(Src, Dest) -> + % ?t:format("copying from ~p to ~p~n", [Src, Dest]), + ?line {ok, _} = file:copy(Src, Dest), + ?line ok = file:change_mode(Dest, 8#0666). + +delete_files(Files) -> + lists:foreach(fun(F) -> file:delete(F) end, Files). + +verify(S, {error, beam_lib, R}) -> + verify_error(S, R); +verify(S, {error, R}) -> + verify_error(S, R). + +verify_error(S, R) -> + if + S =:= R -> ok; + true -> [S|_] = tuple_to_list(R) + end, + + %% Most formatted messages begin with "./simple.beam:" or "<<...". + FM = string:str(lists:flatten(beam_lib:format_error(R)), "simpl") > 0, + BM = string:str(lists:flatten(beam_lib:format_error(R)), "<<") > 0, + + %% Also make sure that formatted message is not just the term printed. + Handled = beam_lib:format_error(R) =/= io_lib:format("~p~n", [R]), + true = ((FM > 0) or (BM > 0)) and Handled. + +ver(S, {error, beam_lib, R}) -> + [S|_] = tuple_to_list(R), + case lists:flatten(beam_lib:format_error(R)) of + [${ | _] -> + test_server:fail({bad_format_error, R}); + _ -> + ok + end. + +pps() -> + {erlang:ports()}. + +simple_file(File) -> + simple_file(File, simple). + +simple_file(File, Module) -> + simple_file(File, Module, member). + +simple_file(File, Module, make_fun) -> + B = list_to_binary(["-module(", atom_to_list(Module), "). " + "-export([t/1]). " + "t(A) -> " + " fun(X) -> A+X end. "]), + ok = file:write_file(File, B); +simple_file(File, Module, constant) -> + B = list_to_binary(["-module(", atom_to_list(Module), "). " + "-export([t/1]). " + "t(A) -> " + " {a,b,[2,3],c,d}. "]), + ok = file:write_file(File, B); +simple_file(File, Module, constant2) -> + B = list_to_binary(["-module(", atom_to_list(Module), "). " + "-export([t/1]). " + "t(A) -> " + " {a,b,[2,3],x,y}. "]), + ok = file:write_file(File, B); +simple_file(File, Module, F) -> + B = list_to_binary(["-module(", atom_to_list(Module), "). " + "-export([t/0]). " + "t() -> " + " t([]). " + "t(L) -> " + " lists:", + atom_to_list(F), "(a, L). "]), + ok = file:write_file(File, B). + +run_if_crypto_works(Test) -> + try begin crypto:start(), crypto:info(), crypto:stop(), ok end of + ok -> + Test() + catch + error:_ -> + {skip,"The crypto application is missing or broken"} + end. + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/calendar_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/calendar_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/calendar_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/calendar_SUITE.erl 2009-11-20 13:30:26.000000000 +0000 @@ -0,0 +1,251 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(calendar_SUITE). + +-include("test_server.hrl"). + +-export([all/1, + gregorian_days/1, + gregorian_seconds/1, + day_of_the_week/1, + day_of_the_week_calibrate/1, + leap_years/1, + last_day_of_the_month/1, + local_time_to_universal_time_dst/1]). + +-define(START_YEAR, 1947). +-define(END_YEAR, 2012). + +all(suite) -> [gregorian_days, + gregorian_seconds, + day_of_the_week, + day_of_the_week_calibrate, + leap_years, + last_day_of_the_month, + local_time_to_universal_time_dst]; + +all(doc) -> "This is the test suite for calendar.erl". + +gregorian_days(doc) -> + "Tests that date_to_gregorian_days and gregorian_days_to_date " + "are each others inverses from ?START_YEAR-01-01 up to ?END_YEAR-01-01. " + "At the same time valid_date is tested."; +gregorian_days(suite) -> + []; +gregorian_days(Config) when list(Config) -> + ?line Days = calendar:date_to_gregorian_days({?START_YEAR, 1, 1}), + ?line MaxDays = calendar:date_to_gregorian_days({?END_YEAR, 1, 1}), + ?line check_gregorian_days(Days, MaxDays). + +gregorian_seconds(doc) -> + "Tests that datetime_to_gregorian_seconds and " + "gregorian_seconds_to_date are each others inverses for a sampled " + "number of seconds from ?START_YEAR-01-01 up to ?END_YEAR-01-01: We check " + "every 2 days + 1 second."; +gregorian_seconds(suite) -> + []; +gregorian_seconds(Config) when list(Config) -> + ?line Secs = calendar:datetime_to_gregorian_seconds({{?START_YEAR, 1, 1}, + {0, 0, 0}}), + ?line MaxSecs = calendar:datetime_to_gregorian_seconds({{?END_YEAR, 1, 1}, + {0, 0, 0}}), + ?line check_gregorian_seconds(Secs, MaxSecs). + +day_of_the_week(doc) -> + "Tests that day_of_the_week reports correctly the day of the week from " + "year ?START_YEAR up to ?END_YEAR."; +day_of_the_week(suite) -> + []; +day_of_the_week(Config) when list(Config) -> + ?line Days = calendar:date_to_gregorian_days({?START_YEAR, 1, 1}), + ?line MaxDays = calendar:date_to_gregorian_days({?END_YEAR, 1, 1}), + ?line DayNumber = calendar:day_of_the_week({?START_YEAR, 1, 1}), + ?line check_day_of_the_week(Days, MaxDays, DayNumber). + +day_of_the_week_calibrate(doc) -> + "Tests that day_of_the_week for 1997-11-11 is Tuesday (2)"; +day_of_the_week_calibrate(suite) -> + []; +day_of_the_week_calibrate(Config) when list(Config) -> + ?line 2 = calendar:day_of_the_week({1997, 11, 11}). + +leap_years(doc) -> + "Tests that is_leap_year reports correctly the leap years from " + "year ?START_YEAR up to ?END_YEAR."; +leap_years(suite) -> + []; +leap_years(Config) when list(Config) -> + ?line check_leap_years(?START_YEAR, ?END_YEAR). + +last_day_of_the_month(doc) -> + "Tests that last_day_of_the_month reports correctly from " + "year ?START_YEAR up to ?END_YEAR."; +last_day_of_the_month(suite) -> + []; +last_day_of_the_month(Config) when list(Config) -> + ?line check_last_day_of_the_month({?START_YEAR, 1}, {?END_YEAR, 1}). + +local_time_to_universal_time_dst(doc) -> + "Tests local_time_to_universal_time_dst for MET"; +local_time_to_universal_time_dst(suite) -> + []; +local_time_to_universal_time_dst(Config) when list(Config) -> + case os:type() of + {unix,_} -> + case os:cmd("date '+%Z'") of + "SAST"++_ -> + {comment, "Spoky time zone with zero-set DST, skipped"}; + _ -> + local_time_to_universal_time_dst_x(Config) + end; + _ -> + local_time_to_universal_time_dst_x(Config) + end. +local_time_to_universal_time_dst_x(Config) when list(Config) -> + %% Assumes MET (UTC+1 / UTC+2(dst) + ?line LtW = {{2003,01,15},{14,00,00}}, % Winter + ?line UtW = {{2003,01,15},{13,00,00}}, % + ?line UtWd = {{2003,01,15},{12,00,00}}, % dst + ?line LtS = {{2003,07,15},{14,00,00}}, % Summer + ?line UtS = {{2003,07,15},{13,00,00}}, % + ?line UtSd = {{2003,07,15},{12,00,00}}, % dst + ?line LtWS = {{2003,03,30},{02,30,00}}, % Winter->Summer + ?line UtWS = {{2003,03,30},{01,30,00}}, % + ?line UtWSd = {{2003,03,30},{00,30,00}}, % dst + ?line LtSW = {{2003,10,26},{02,30,00}}, % Summer->Winter + ?line UtSW = {{2003,10,26},{01,30,00}}, % + ?line UtSWd = {{2003,10,26},{00,30,00}}, % dst + %% + ?line UtW = calendar:local_time_to_universal_time(LtW, false), + ?line UtWd = calendar:local_time_to_universal_time(LtW, true), + ?line UtW = calendar:local_time_to_universal_time(LtW, undefined), + %% + ?line UtS = calendar:local_time_to_universal_time(LtS, false), + ?line UtSd = calendar:local_time_to_universal_time(LtS, true), + ?line UtSd = calendar:local_time_to_universal_time(LtS, undefined), + %% + case calendar:local_time_to_universal_time(LtWS, false) of + UtWS -> + ?line UtWSd = calendar:local_time_to_universal_time(LtWS, true), + ?line [] = calendar:local_time_to_universal_time_dst(LtWS), + %% + ?line UtSW = calendar:local_time_to_universal_time(LtSW, false), + ?line UtSWd = calendar:local_time_to_universal_time(LtSW, true), + ?line [UtSWd, UtSW] = calendar:local_time_to_universal_time_dst(LtSW), + ok; + {{1969,12,31},{23,59,59}} -> + %% It seems that Apple has no intention of fixing this bug in + %% Mac OS 10.3.9, and we have no intention of implementing a + %% workaround. + {comment,"Bug in mktime() in this OS"} + end. + + +%% +%% LOCAL FUNCTIONS +%% + +%% check_gregorian_days +%% +check_gregorian_days(Days, MaxDays) when Days < MaxDays -> + ?line Date = calendar:gregorian_days_to_date(Days), + ?line true = calendar:valid_date(Date), + ?line Days = calendar:date_to_gregorian_days(Date), + ?line check_gregorian_days(Days + 1, MaxDays); +check_gregorian_days(_Days, _MaxDays) -> + ok. + +%% check_gregorian_seconds +%% +%% We increment with something prime (172801 = 2 days + 1 second). +%% +check_gregorian_seconds(Secs, MaxSecs) when Secs < MaxSecs -> + ?line DateTime = calendar:gregorian_seconds_to_datetime(Secs), + ?line Secs = calendar:datetime_to_gregorian_seconds(DateTime), + ?line check_gregorian_seconds(Secs + 172801, MaxSecs); +check_gregorian_seconds(_Secs, _MaxSecs) -> + ok. + + +%% check_day_of_the_week +%% +check_day_of_the_week(Days, MaxDays, DayNumber) when Days < MaxDays -> + ?line Date = calendar:gregorian_days_to_date(Days), + ?line DayNumber = calendar:day_of_the_week(Date), + ?line check_day_of_the_week(Days + 1, MaxDays, + ((DayNumber rem 7) + 1)); +check_day_of_the_week(_Days, _MaxDays, _DayNumber) -> + ok. + +%% check_leap_years +%% +%% SYr must be larger than 1800, and EYr must be less than ?END_YEAR. +%% +check_leap_years(SYr, EYr) when SYr < EYr -> + ?line Rem = SYr rem 4, + case Rem of + 0 -> + case SYr of + 1900 -> + ?line false = calendar:is_leap_year(SYr); + 2000 -> + ?line true = calendar:is_leap_year(SYr); + _ -> + ?line true = calendar:is_leap_year(SYr) + end; + _ -> + ?line false = calendar:is_leap_year(SYr) + end, + check_leap_years(SYr + 1, EYr); +check_leap_years(_SYr, _EYr) -> + ok. + +check_last_day_of_the_month({SYr, SMon}, {EYr, EMon}) when SYr < EYr -> + ?line LastDay = calendar:last_day_of_the_month(SYr, SMon), + ?line LastDay = case SMon of + 1 -> 31; + 2 -> + case calendar:is_leap_year(SYr) of + true -> 29; + false -> 28 + end; + 3 -> 31; + 4 -> 30; + 5 -> 31; + 6 -> 30; + 7 -> 31; + 8 -> 31; + 9 -> 30; + 10 -> 31; + 11 -> 30; + 12 -> 31 + end, + ?line NYr = case SMon of + 12 -> SYr + 1; + _ -> SYr + end, + ?line check_last_day_of_the_month({NYr, (SMon rem 12) + 1}, + {EYr, EMon}); +check_last_day_of_the_month(_, _) -> + ok. + + + + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/c_SUITE_data/m.erl erlang-13.b.3-dfsg/lib/stdlib/test/c_SUITE_data/m.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/c_SUITE_data/m.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/c_SUITE_data/m.erl 2009-11-20 13:30:31.000000000 +0000 @@ -0,0 +1,25 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(m). +-export([factorial/1]). + +factorial(0) -> + 1; +factorial(N) -> + N * factorial(N-1). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/c_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/c_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/c_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/c_SUITE.erl 2009-11-20 13:30:30.000000000 +0000 @@ -0,0 +1,116 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(c_SUITE). +-export([all/1]). +-export([c_1/1, c_2/1, c_3/1, c_4/1, memory/1]). + +-include("test_server.hrl"). + +-import(c, [c/2]). + +all(doc) -> ["Test cases for the 'c' module."]; +all(suite) -> + [c_1, c_2, c_3, c_4, memory]. + +%%% Write output to a directory other than current directory: + +c_1(doc) -> + ["Checks that c:c works also with option 'outdir' [ticket OTP-1209]."]; +c_1(suite) -> + []; +c_1(Config) when list(Config) -> + ?line R = filename:join(?config(data_dir, Config), "m.erl"), + ?line W = ?config(priv_dir, Config), + ?line Result = c(R,[{outdir,W}]), + ?line {ok, m} = Result. + +c_2(doc) -> + ["Checks that c:c works also with option 'outdir' [ticket OTP-1209]."]; +c_2(suite) -> + []; +c_2(Config) when list(Config) -> + ?line R = filename:join(?config(data_dir, Config), "m"), + ?line W = ?config(priv_dir, Config), + ?line Result = c(R,[{outdir,W}]), + ?line {ok, m} = Result. + + +%%% Put results in current directory (or rather, change current dir +%%% to the output dir): + +c_3(doc) -> + ["Checks that c:c works also with option 'outdir' (same as current" + "directory). [ticket OTP-1209]."]; +c_3(suite) -> + []; +c_3(Config) when list(Config) -> + ?line R = filename:join(?config(data_dir, Config), "m.erl"), + ?line W = ?config(priv_dir, Config), + ?line file:set_cwd(W), + ?line Result = c(R,[{outdir,W}]), + ?line {ok, m} = Result. + +c_4(doc) -> + ["Checks that c:c works also with option 'outdir' (same as current" + "directory). [ticket OTP-1209]."]; +c_4(suite) -> + []; +c_4(Config) when list(Config) -> + ?line R = filename:join(?config(data_dir, Config), "m"), + ?line W = ?config(priv_dir, Config), + ?line file:set_cwd(W), + ?line Result = c(R,[{outdir,W}]), + ?line {ok, m} = Result. + +memory(doc) -> + ["Checks that c:memory/[0,1] returns consistent results."]; +memory(suite) -> + []; +memory(Config) when list(Config) -> + try + ?line ML = c:memory(), + ?line T = mget(total, ML), + ?line P = mget(processes, ML), + ?line S = mget(system, ML), + ?line A = mget(atom, ML), + ?line AU = mget(atom_used, ML), + ?line B = mget(binary, ML), + ?line C = mget(code, ML), + ?line E = mget(ets, ML), + ?line T = P + S, + ?line if S >= A + B + C + E -> ok end, + ?line if A >= AU -> ok end, + ?line ok + catch + error:notsup -> + ?line {skipped, + "erlang:memory/[0,1] and c:memory/[0,1] not supported"} + end. + +% Help function for c_SUITE:memory/1 +mget(K, L) -> + ?line {value,{K,V}} = lists:keysearch(K, 1, L), + ?line test_v(c:memory(K)), % Check that c:memory/1 also accept this + % argument and returns an integer (usally + % *not* the same as V). + ?line test_v(V). + +% Help function for c_SUITE:memory/1 +test_v(V) when integer(V) -> + ?line V. Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/dets_SUITE_data/dets_test_v8b.dets and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/dets_SUITE_data/dets_test_v8b.dets differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/dets_SUITE_data/dets_test_v8b_little_endian.dets and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/dets_SUITE_data/dets_test_v8b_little_endian.dets differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/dets_SUITE_data/version_9a.dets and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/dets_SUITE_data/version_9a.dets differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/dets_SUITE_data/version_9b_phash.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/dets_SUITE_data/version_9b_phash.dat differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/dets_SUITE_data/version_r2d.dets and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/dets_SUITE_data/version_r2d.dets differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/dets_SUITE_data/version_r3b02.dets and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/dets_SUITE_data/version_r3b02.dets differ diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/dets_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/dets_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/dets_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/dets_SUITE.erl 2009-09-18 15:07:22.000000000 +0100 @@ -0,0 +1,4136 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(dets_SUITE). + +%-define(debug, true). + +-ifdef(debug). +-define(format(S, A), io:format(S, A)). +-define(line, put(line, ?LINE), ). +-define(config(X,Y), foo). +-define(t, test_server). +-define(privdir(_), "./dets_SUITE_priv"). +-define(datadir(_), "./dets_SUITE_data"). +-else. +-include("test_server.hrl"). +-define(format(S, A), ok). +-define(privdir(Conf), ?config(priv_dir, Conf)). +-define(datadir(Conf), ?config(data_dir, Conf)). +-endif. + +-export([all/1, not_run/1, newly_started/1, basic_v8/1, basic_v9/1, + open_v8/1, open_v9/1, sets_v8/1, sets_v9/1, bags_v8/1, + bags_v9/1, duplicate_bags_v8/1, duplicate_bags_v9/1, + access_v8/1, access_v9/1, dirty_mark/1, dirty_mark2/1, + bag_next_v8/1, bag_next_v9/1, oldbugs_v8/1, oldbugs_v9/1, + unsafe_assumptions/1, truncated_segment_array_v8/1, + truncated_segment_array_v9/1, open_file_v8/1, open_file_v9/1, + init_table_v8/1, init_table_v9/1, repair_v8/1, repair_v9/1, + hash_v8b_v8c/1, phash/1, fold_v8/1, fold_v9/1, fixtable_v8/1, + fixtable_v9/1, match_v8/1, match_v9/1, select_v8/1, + select_v9/1, update_counter/1, badarg/1, cache_sets_v8/1, + cache_sets_v9/1, cache_bags_v8/1, cache_bags_v9/1, + cache_duplicate_bags_v8/1, cache_duplicate_bags_v9/1, + otp_4208/1, otp_4989/1, many_clients/1, otp_4906/1, otp_5402/1, + simultaneous_open/1, insert_new/1, repair_continuation/1, + otp_5487/1, otp_6206/1, otp_6359/1, otp_4738/1, otp_7146/1, + otp_8070/1]). + +-export([dets_dirty_loop/0]). + +-export([histogram/1, sum_histogram/1, ave_histogram/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +%% Internal export. +-export([client/2]). + +-import(lists, + [append/1, delete/2, duplicate/2, filter/2, foreach/2, keysearch/3, + last/1, map/2, member/2, reverse/1, seq/2, sort/1, usort/1]). + +-include_lib("kernel/include/file.hrl"). + +-define(DETS_SERVER, dets). + +%% HEADSZ taken from dets_v8.erl and dets_v9.erl. +-define(HEADSZ_v8, 40). +-define(HEADSZ_v9, (56+28*4+16)). +-define(NO_KEYS_POS_v9, 36). +-define(CLOSED_PROPERLY_POS, 8). + +-define(NOT_PROPERLY_CLOSED,0). +-define(CLOSED_PROPERLY,1). + +init_per_testcase(_Case, Config) -> + Dog=?t:timetrap(?t:minutes(15)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, _Config) -> + Dog=?config(watchdog, _Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + case os:type() of + vxworks -> + [not_run]; + _ -> + {req,[stdlib], + [basic_v8, basic_v9, open_v8, open_v9, sets_v8, sets_v9, + bags_v8, bags_v9, duplicate_bags_v8, duplicate_bags_v9, + newly_started, open_file_v8, open_file_v9, + init_table_v8, init_table_v9, repair_v8, repair_v9, + access_v8, access_v9, oldbugs_v8, oldbugs_v9, + unsafe_assumptions, truncated_segment_array_v8, + truncated_segment_array_v9, dirty_mark, dirty_mark2, + bag_next_v8, bag_next_v9, hash_v8b_v8c, phash, fold_v8, + fold_v9, fixtable_v8, fixtable_v9, match_v8, match_v9, + select_v8, select_v9, update_counter, badarg, + cache_sets_v8, cache_sets_v9, cache_bags_v8, + cache_bags_v9, cache_duplicate_bags_v8, + cache_duplicate_bags_v9, otp_4208, otp_4989, many_clients, + otp_4906, otp_5402, simultaneous_open, insert_new, + repair_continuation, otp_5487, otp_6206, otp_6359, otp_4738, + otp_7146, otp_8070]} + end. + +not_run(suite) -> []; +not_run(Conf) when is_list(Conf) -> + {comment, "Not runnable VxWorks/NFS"}. + +newly_started(doc) -> + ["OTP-3621"]; +newly_started(suite) -> + []; +newly_started(Config) when is_list(Config) -> + ?line true = is_alive(), + ?line {ok, Node} = test_server:start_node(slave1, slave, []), + ?line [] = rpc:call(Node, dets, all, []), + ?line test_server:stop_node(Node), + ok. + +basic_v8(doc) -> + ["Basic test case."]; +basic_v8(suite) -> + []; +basic_v8(Config) when is_list(Config) -> + basic(Config, 8). + +basic_v9(doc) -> + ["Basic test case."]; +basic_v9(suite) -> + []; +basic_v9(Config) when is_list(Config) -> + basic(Config, 9). + +basic(Config, Version) -> + ?line Tab = dets_basic_test, + ?line FName = filename(Tab, Config), + + P0 = pps(), + ?line {ok, _} = dets:open_file(Tab,[{file, FName},{version,Version}]), + ?line ok = dets:insert(Tab,{mazda,japan}), + ?line ok = dets:insert(Tab,{toyota,japan}), + ?line ok = dets:insert(Tab,{suzuki,japan}), + ?line ok = dets:insert(Tab,{honda,japan}), + ?line ok = dets:insert(Tab,{renault,france}), + ?line ok = dets:insert(Tab,{citroen,france}), + ?line ok = dets:insert(Tab,{opel,germany}), + ?line ok = dets:insert(Tab,{saab,sweden}), + ?line ok = dets:insert(Tab,{volvo,sweden}), + ?line [{opel,germany}] = dets:lookup(Tab,opel), + ?line Japs = dets:traverse(Tab, fun(Obj) -> + case Obj of + {_, japan} -> {continue, Obj}; + _ -> continue + end + end), + ?line 4 = length(Japs), + ?line ok = dets:close(Tab), + ?line file:delete(FName), + ?line check_pps(P0), + ok. + + +open_v8(doc) -> + []; +open_v8(suite) -> + []; +open_v8(Config) when is_list(Config) -> + open(Config, 8). + +open_v9(doc) -> + []; +open_v9(suite) -> + []; +open_v9(Config) when is_list(Config) -> + open(Config, 9). + +open(Config, Version) -> + %% Running this test twice means that the Dets server is restarted + %% twice. dets_sup specifies a maximum of 4 restarts in an hour. + %% If this becomes a problem, one should consider running this + %% test on a slave node. + + ?line {Sets, Bags, Dups} = args(Config), + + ?line All = Sets ++ Bags ++ Dups, + ?line delete_files(All), + + ?line Data = make_data(1), + + P0 = pps(), + ?line Tabs = open_files(1, All, Version), + ?line initialize(Tabs, Data), + ?line check(Tabs, Data), + + ?line foreach(fun(Tab) -> ok = dets:close(Tab) end, Tabs), + %% Now reopen the files + ?format("Reopening closed files \n", []), + ?line Tabs = open_files(1, All, Version), + ?format("Checking contents of reopened files \n", []), + ?line check(Tabs, Data), + %% crash the dets server + + ?format("Crashing dets server \n", []), + process_flag(trap_exit, true), + Procs = [whereis(?DETS_SERVER) | map(fun(Tab) -> dets:info(Tab, pid) end, + Tabs)], + foreach(fun(Pid) -> exit(Pid, kill) end, Procs), + timer:sleep(100), + c:flush(), %% flush all the EXIT sigs + timer:sleep(200), + + %% Now reopen the files again + ?format("Reopening crashed files \n", []), + ?line open_files(1, All, Version), + ?format("Checking contents of repaired files \n", []), + ?line check(Tabs, Data), + + ?line close_all(Tabs), + + ?line delete_files(All), + P1 = pps(), + {Ports0, Procs0} = P0, + {Ports1, Procs1} = P1, + ?line true = Ports1 =:= Ports0, + %% The dets_server process has been restarted: + ?line [_] = Procs0 -- Procs1, + ?line [_] = Procs1 -- Procs0, + ok. + +check(Tabs, Data) -> + foreach(fun(Tab) -> + ?line Kp = dets:info(Tab, keypos), + ?format("checking ~p~n", [Tab]), + foreach(fun(Item) -> + case dets:lookup(Tab, k(Kp,Item)) of + [Item] -> ok; + _Other -> bad(Tab,Item) + end + end, Data) + end, Tabs), + ok. + +k(Kp, Obj) -> element(Kp, Obj). + +bad(_Tab, _Item) -> + ?format("Can't find item ~p in ~p ~n", [_Item, _Tab]), + exit(badtab). + +sets_v8(doc) -> + ["Performs traversal and match testing on set type dets tables."]; +sets_v8(suite) -> + []; +sets_v8(Config) when is_list(Config) -> + sets(Config, 8). + +sets_v9(doc) -> + ["Performs traversal and match testing on set type dets tables."]; +sets_v9(suite) -> + []; +sets_v9(Config) when is_list(Config) -> + sets(Config, 9). + +sets(Config, Version) -> + ?line {Sets, _, _} = args(Config), + + ?line Data = make_data(1), + ?line delete_files(Sets), + P0 = pps(), + ?line Tabs = open_files(1, Sets, Version), + Bigger = [{17,q,w,w}, {48,q,w,w,w,w,w,w}], % 48 requires a bigger buddy + ?line initialize(Tabs, Data++Bigger++Data), % overwrite + ?line Len = length(Data), + ?line foreach(fun(Tab) -> trav_test(Data, Len, Tab) end, Tabs), + ?line size_test(Len, Tabs), + ?line no_keys_test(Tabs), + ?line foreach(fun(Tab) -> del_test(Tab) end, Tabs), + ?line initialize(Tabs, Data), + ?line foreach(fun(Tab) -> del_obj_test(Tab) end, Tabs), + ?line initialize(Tabs, Data), + ?line foreach(fun(Tab) -> + Len = dets:info(Tab, size) end, + Tabs), + ?line foreach(fun(Tab) -> match_test(Data, Tab) end, Tabs), + ?line foreach(fun(Tab) -> match_del_test(Tab) end, Tabs), + + ?line close_all(Tabs), + ?line delete_files(Sets), + ?line check_pps(P0), + ok. + +bags_v8(doc) -> + ["Performs traversal and match testing on bag type dets tables."]; +bags_v8(suite) -> + []; +bags_v8(Config) when is_list(Config) -> + bags(Config, 8). + +bags_v9(doc) -> + ["Performs traversal and match testing on bag type dets tables."]; +bags_v9(suite) -> + []; +bags_v9(Config) when is_list(Config) -> + bags(Config, 9). + +bags(Config, Version) -> + {_, Bags, _} = args(Config), + ?line Data = make_data(1, bag), %% gives twice as many objects + ?line delete_files(Bags), + P0 = pps(), + ?line Tabs = open_files(1, Bags, Version), + ?line initialize(Tabs, Data++Data), + ?line Len = length(Data), + ?line foreach(fun(Tab) -> trav_test(Data, Len, Tab) end, Tabs), + ?line size_test(Len, Tabs), + ?line no_keys_test(Tabs), + ?line foreach(fun(Tab) -> del_test(Tab) end, Tabs), + ?line initialize(Tabs, Data), + ?line foreach(fun(Tab) -> del_obj_test(Tab) end, Tabs), + ?line initialize(Tabs, Data), + ?line foreach(fun(Tab) -> + Len = dets:info(Tab, size) end, + Tabs), + ?line foreach(fun(Tab) -> match_test(Data, Tab) end, Tabs), + ?line foreach(fun(Tab) -> match_del_test(Tab) end, Tabs), + ?line close_all(Tabs), + ?line delete_files(Bags), + ?line check_pps(P0), + ok. + + +duplicate_bags_v8(doc) -> + ["Performs traversal and match testing on duplicate_bag type dets tables."]; +duplicate_bags_v8(suite) -> + []; +duplicate_bags_v8(Config) when is_list(Config) -> + duplicate_bags(Config, 8). + +duplicate_bags_v9(doc) -> + ["Performs traversal and match testing on duplicate_bag type dets tables."]; +duplicate_bags_v9(suite) -> + []; +duplicate_bags_v9(Config) when is_list(Config) -> + duplicate_bags(Config, 9). + +duplicate_bags(Config, Version) when is_list(Config) -> + {_, _, Dups} = args(Config), + ?line Data = make_data(1, duplicate_bag), %% gives twice as many objects + ?line delete_files(Dups), + P0 = pps(), + ?line Tabs = open_files(1, Dups, Version), + ?line initialize(Tabs, Data), + ?line Len = length(Data), + ?line foreach(fun(Tab) -> trav_test(Data, Len, Tab) end, Tabs), + ?line size_test(Len, Tabs), + ?line no_keys_test(Tabs), + ?line foreach(fun(Tab) -> del_test(Tab) end, Tabs), + ?line initialize(Tabs, Data), + ?line foreach(fun(Tab) -> del_obj_test(Tab) end, Tabs), + ?line initialize(Tabs, Data), + ?line foreach(fun(Tab) -> + Len = dets:info(Tab, size) end, + Tabs), + ?line foreach(fun(Tab) -> match_test(Data, Tab) end, Tabs), + ?line foreach(fun(Tab) -> match_del_test(Tab) end, Tabs), + ?line close_all(Tabs), + ?line delete_files(Dups), + ?line check_pps(P0), + ok. + + +access_v8(doc) -> + []; +access_v8(suite) -> + []; +access_v8(Config) when is_list(Config) -> + access(Config, 8). + +access_v9(doc) -> + []; +access_v9(suite) -> + []; +access_v9(Config) when is_list(Config) -> + access(Config, 9). + +access(Config, Version) -> + Args_acc = [[{ram_file, true}, {access, read}], + [{access, read}]], + Args = [[{ram_file, true}], + []], + + ?line {Args_acc_1, _, _} = zip_filename(Args_acc, [], [], Config), + ?line delete_files(Args_acc_1), + ?line {Args_1, _, _} = zip_filename(Args, [], [], Config), + + P0 = pps(), + ?line {error, {file_error,_,enoent}} = dets:open_file('1', hd(Args_acc_1)), + + ?line Tabs = open_files(1, Args_1, Version), + ?line close_all(Tabs), + ?line Tabs = open_files(1, Args_acc_1, Version), + + ?line foreach(fun(Tab) -> + {error, {access_mode,_}} = dets:insert(Tab, {1,2}), + [] = dets:lookup(Tab, 11), + '$end_of_table' = dets:first(Tab), + {error, {access_mode,_}} = dets:delete(Tab, 22) + end, Tabs), + ?line close_all(Tabs), + ?line delete_files(Args_acc_1), + ?line check_pps(P0), + ok. + + +dirty_mark(doc) -> + ["Test that the table is not marked dirty if not written"]; +dirty_mark(suite) -> + []; +dirty_mark(Config) when is_list(Config) -> + ?line true = is_alive(), + ?line Tab = dets_dirty_mark_test, + ?line FName = filename(Tab, Config), + P0 = pps(), + ?line dets:open_file(Tab,[{file, FName}]), + ?line dets:insert(Tab,{mazda,japan}), + ?line dets:insert(Tab,{toyota,japan}), + ?line dets:insert(Tab,{suzuki,japan}), + ?line dets:insert(Tab,{honda,japan}), + ?line dets:insert(Tab,{renault,france}), + ?line dets:insert(Tab,{citroen,france}), + ?line dets:insert(Tab,{opel,germany}), + ?line dets:insert(Tab,{saab,sweden}), + ?line dets:insert(Tab,{volvo,sweden}), + ?line [{opel,germany}] = dets:lookup(Tab,opel), + ?line ok = dets:close(Tab), + ?line Call = fun(P,A) -> + P ! {self(), A}, + receive + {P, Ans} -> + Ans + after 5000 -> + exit(other_process_dead) + end + end, + ?line {ok, Node} = test_server:start_node(dets_dirty_mark, + slave, + [{linked, false}, + {args, "-pa " ++ + filename:dirname + (code:which(?MODULE))}]), + ?line ok = ensure_node(20, Node), + %% io:format("~p~n",[rpc:call(Node, code, get_path, [])]), + %% io:format("~p~n",[rpc:call(Node, file, get_cwd, [])]), + %% io:format("~p~n",[Config]), + ?line Pid = rpc:call(Node,erlang, spawn, + [?MODULE, dets_dirty_loop, []]), + ?line {ok, Tab} = Call(Pid, [open, Tab, [{file, FName}]]), + ?line [{opel,germany}] = Call(Pid, [read,Tab,opel]), + ?line test_server:stop_node(Node), + ?line {ok, Tab} = dets:open_file(Tab,[{file, FName}, + {repair,false}]), + ?line ok = dets:close(Tab), + ?line file:delete(FName), + ?line check_pps(P0), + ok. + +dirty_mark2(doc) -> + ["Test that the table is flushed when auto_save is in effect"]; +dirty_mark2(suite) -> + []; +dirty_mark2(Config) when is_list(Config) -> + ?line true = is_alive(), + ?line Tab = dets_dirty_mark2_test, + ?line FName = filename(Tab, Config), + P0 = pps(), + ?line dets:open_file(Tab,[{file, FName}]), + ?line dets:insert(Tab,{toyota,japan}), + ?line dets:insert(Tab,{suzuki,japan}), + ?line dets:insert(Tab,{honda,japan}), + ?line dets:insert(Tab,{renault,france}), + ?line dets:insert(Tab,{citroen,france}), + ?line dets:insert(Tab,{opel,germany}), + ?line dets:insert(Tab,{saab,sweden}), + ?line dets:insert(Tab,{volvo,sweden}), + ?line [{opel,germany}] = dets:lookup(Tab,opel), + ?line ok = dets:close(Tab), + ?line Call = fun(P,A) -> + P ! {self(), A}, + receive + {P, Ans} -> + Ans + after 5000 -> + exit(other_process_dead) + end + end, + ?line {ok, Node} = test_server:start_node(dets_dirty_mark2, + slave, + [{linked, false}, + {args, "-pa " ++ + filename:dirname + (code:which(?MODULE))}]), + ?line ok = ensure_node(20, Node), + ?line Pid = rpc:call(Node,erlang, spawn, + [?MODULE, dets_dirty_loop, []]), + ?line {ok, Tab} = Call(Pid, [open, Tab, [{file, FName},{auto_save,1000}]]), + ?line ok = Call(Pid, [write,Tab,{mazda,japan}]), + ?line timer:sleep(2100), + %% Read something, just to give auto save time to finish. + ?line [{opel,germany}] = Call(Pid, [read,Tab,opel]), + ?line test_server:stop_node(Node), + ?line {ok, Tab} = dets:open_file(Tab, [{file, FName}, {repair,false}]), + ?line ok = dets:close(Tab), + ?line file:delete(FName), + ?line check_pps(P0), + ok. + +dets_dirty_loop() -> + receive + {From, [open, Name, Args]} -> + Ret = dets:open_file(Name, Args), + From ! {self(), Ret}, + dets_dirty_loop(); + {From, [read, Name, Key]} -> + Ret = dets:lookup(Name, Key), + From ! {self(), Ret}, + dets_dirty_loop(); + {From, [write, Name, Value]} -> + Ret = dets:insert(Name, Value), + From ! {self(), Ret}, + dets_dirty_loop() + end. + + +bag_next_v8(suite) -> + []; +bag_next_v8(doc) -> + ["Check that bags and next work as expected."]; +bag_next_v8(Config) when is_list(Config) -> + bag_next(Config, 8). + +bag_next_v9(suite) -> + []; +bag_next_v9(doc) -> + ["Check that bags and next work as expected."]; +bag_next_v9(Config) when is_list(Config) -> + ?line Tab = dets_bag_next_test, + ?line FName = filename(Tab, Config), + + %% first and next crash upon error + ?line dets:open_file(Tab,[{file, FName}, {type, bag},{version,9}]), + ?line ok = dets:insert(Tab, [{1,1},{2,2},{3,3},{4,4}]), + ?line FirstKey = dets:first(Tab), + ?line NextKey = dets:next(Tab, FirstKey), + ?line [FirstObj | _] = dets:lookup(Tab, FirstKey), + ?line [NextObj | _] = dets:lookup(Tab, NextKey), + ?line {ok, FirstPos} = dets:where(Tab, FirstObj), + ?line {ok, NextPos} = dets:where(Tab, NextObj), + crash(FName, NextPos+12), + ?line {'EXIT',BadObject1} = (catch dets:next(Tab, FirstKey)), + ?line bad_object(BadObject1, FName), + crash(FName, FirstPos+12), + ?line {'EXIT',BadObject2} = (catch dets:first(Tab)), + ?line bad_object(BadObject2, FName), + ?line dets:close(Tab), + ?line file:delete(FName), + + bag_next(Config, 9). + +bag_next(Config, Version) -> + ?line Tab = dets_bag_next_test, + ?line FName = filename(Tab, Config), + P0 = pps(), + ?line dets:open_file(Tab,[{file, FName}, {type, bag},{version,Version}]), + ?line dets:insert(Tab,{698,hopp}), + ?line dets:insert(Tab,{186,hopp}), + ?line dets:insert(Tab,{hej,hopp}), + ?line dets:insert(Tab,{186,plopp}), + Loop = fun(N, Last, Self) -> + case N of + 0 -> + exit({unterminated_first_next_sequence, N, Last}); + _ -> + case Last of + '$end_of_table' -> + ok; + _ -> + Self(N-1, dets:next(Tab,Last), Self) + end + end + end, + ?line ok = Loop(4,dets:first(Tab),Loop), + ?line dets:close(Tab), + ?line file:delete(FName), + ?line check_pps(P0), + ok. + +oldbugs_v8(doc) -> + []; +oldbugs_v8(suite) -> + []; +oldbugs_v8(Config) when is_list(Config) -> + oldbugs(Config, 8). + +oldbugs_v9(doc) -> + []; +oldbugs_v9(suite) -> + []; +oldbugs_v9(Config) when is_list(Config) -> + oldbugs(Config, 9). + +oldbugs(Config, Version) -> + FName = filename(dets_suite_oldbugs_test, Config), + P0 = pps(), + ?line {ok, ob} = dets:open_file(ob, [{version, Version}, + {type, bag}, {file, FName}]), + ?line ok = dets:insert(ob, {1, 2}), + ?line ok = dets:insert(ob, {1,3}), + ?line ok = dets:insert(ob, {1, 2}), + ?line 2 = dets:info(ob, size), %% assertion + ?line ok = dets:close(ob), + ?line file:delete(FName), + ?line check_pps(P0), + ok. + +unsafe_assumptions(suite) -> []; +unsafe_assumptions(doc) -> + "Tests that shrinking an object and then expanding it works."; +unsafe_assumptions(Config) when is_list(Config) -> + FName = filename(dets_suite_unsafe_assumptions_test, Config), + ?line file:delete(FName), + P0 = pps(), + ?line {ok, a} = dets:open_file(a, [{version,8},{file, FName}]), + O0 = {2,false}, + O1 = {1, false}, + O2 = {1, true}, + O3 = {1, duplicate(20,false)}, + O4 = {1, duplicate(25,false)}, % same 2-log as O3 + ?line ok = dets:insert(a, O1), + ?line ok = dets:insert(a, O0), + ?line true = [O1,O0] =:= sort(get_all_objects(a)), + ?line true = [O1,O0] =:= sort(get_all_objects_fast(a)), + ?line ok = dets:insert(a, O2), + ?line true = [O2,O0] =:= sort(get_all_objects(a)), + ?line true = [O2,O0] =:= sort(get_all_objects_fast(a)), + ?line ok = dets:insert(a, O3), + ?line true = [O3,O0] =:= sort(get_all_objects(a)), + ?line true = [O3,O0] =:= sort(get_all_objects_fast(a)), + ?line ok = dets:insert(a, O4), + ?line true = [O4,O0] =:= sort(get_all_objects(a)), + ?line true = [O4,O0] =:= sort(get_all_objects_fast(a)), + ?line ok = dets:close(a), + ?line file:delete(FName), + ?line check_pps(P0), + ok. + +truncated_segment_array_v8(suite) -> []; +truncated_segment_array_v8(doc) -> + "Tests that a file where the segment array has been truncated " + "is possible to repair."; +truncated_segment_array_v8(Config) when is_list(Config) -> + trunc_seg_array(Config, 8). + +truncated_segment_array_v9(suite) -> []; +truncated_segment_array_v9(doc) -> + "Tests that a file where the segment array has been truncated " + "is possible to repair."; +truncated_segment_array_v9(Config) when is_list(Config) -> + trunc_seg_array(Config, 9). + +trunc_seg_array(Config, V) -> + TabRef = dets_suite_truncated_segment_array_test, + Fname = filename(TabRef, Config), + %% Create file that needs to be repaired + ?line file:delete(Fname), + P0 = pps(), + ?line {ok, TabRef} = dets:open_file(TabRef, [{file, Fname},{version,V}]), + ?line ok = dets:close(TabRef), + + %% Truncate the file + ?line HeadSize = headsz(V), + ?line truncate(Fname, HeadSize + 10), + + %% Open the truncated file + ?line io:format("Expect repair:~n"), + ?line {ok, TabRef} = dets:open_file(TabRef, + [{file, Fname}, {repair, true}]), + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + ?line check_pps(P0), + ok. + +open_file_v8(doc) -> + ["open_file/1 test case."]; +open_file_v8(suite) -> + []; +open_file_v8(Config) when is_list(Config) -> + open_1(Config, 8). + +open_file_v9(doc) -> + ["open_file/1 test case."]; +open_file_v9(suite) -> + []; +open_file_v9(Config) when is_list(Config) -> + T = open_v9, + Fname = filename(T, Config), + ?line {ok, _} = dets:open_file(T, [{file,Fname},{version,9}]), + ?line 9 = dets:info(T, version), + ?line true = [self()] =:= dets:info(T, users), + ?line {ok, _} = dets:open_file(T, [{file,Fname},{version,9}]), + ?line {error,incompatible_arguments} = + dets:open_file(T, [{file,Fname},{version,8}]), + ?line true = [self(),self()] =:= dets:info(T, users), + ?line ok = dets:close(T), + ?line true = [self()] =:= dets:info(T, users), + ?line ok = dets:close(T), + ?line undefined = ets:info(T, users), + ?line file:delete(Fname), + + open_1(Config, 9). + +open_1(Config, V) -> + TabRef = open_file_1_test, + Fname = filename(TabRef, Config), + ?line file:delete(Fname), + + P0 = pps(), + ?line {error,{file_error,Fname,enoent}} = dets:open_file(Fname), + + ?line ok = file:write_file(Fname, duplicate(100,65)), + ?line {error,{not_a_dets_file,Fname}} = dets:open_file(Fname), + ?line file:delete(Fname), + + HeadSize = headsz(V), + ?line {ok, TabRef} = dets:open_file(TabRef, [{file, Fname},{version,V}]), + ?line ok = dets:close(TabRef), + ?line truncate(Fname, HeadSize + 10), + ?line true = dets:is_dets_file(Fname), + ?line io:format("Expect repair:~n"), + ?line {ok, Ref} = dets:open_file(Fname), % repairing + ?line ok = dets:close(Ref), + ?line file:delete(Fname), + + %% truncated file header, invalid type + ?line {ok, TabRef} = dets:open_file(TabRef, [{file,Fname},{version,V}]), + ?line ok = ins(TabRef, 3000), + ?line ok = dets:close(TabRef), + TypePos = 12, + crash(Fname, TypePos), + ?line {error, {invalid_type_code,Fname}} = dets:open_file(Fname), + ?line truncate(Fname, HeadSize - 10), + ?line {error, {tooshort,Fname}} = dets:open_file(Fname), + ?line {ok, TabRef} = dets:open_file(TabRef, [{file,Fname},{version,V}]), + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {error,{file_error,{foo,bar},_}} = dets:is_dets_file({foo,bar}), + ?line check_pps(P0), + ok. + +init_table_v8(doc) -> + ["initialize_table/2 and from_ets/2 test case."]; +init_table_v8(suite) -> + []; +init_table_v8(Config) when is_list(Config) -> + init_table(Config, 8). + +init_table_v9(doc) -> + ["initialize_table/2 and from_ets/2 test case."]; +init_table_v9(suite) -> + []; +init_table_v9(Config) when is_list(Config) -> + %% Objects are returned in "time order". + T = init_table_v9, + Fname = filename(T, Config), + ?line file:delete(Fname), + L = [{1,a},{2,b},{1,c},{2,c},{1,c},{2,a},{1,b}], + Input = init([L]), + ?line {ok, _} = dets:open_file(T, [{file,Fname},{version,9}, + {type,duplicate_bag}]), + ?line ok = dets:init_table(T, Input), + ?line [{1,a},{1,c},{1,c},{1,b}] = dets:lookup(T, 1), + ?line [{2,b},{2,c},{2,a}] = dets:lookup(T, 2), + ?line ok = dets:close(T), + ?line file:delete(Fname), + + init_table(Config, 9), + fast_init_table(Config). + +init_table(Config, V) -> + TabRef = init_table_test, + Fname = filename(TabRef, Config), + ?line file:delete(Fname), + P0 = pps(), + + Args = [{file,Fname},{version,V},{auto_save,120000}], + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {'EXIT', _} = + (catch dets:init_table(TabRef, fun(foo) -> bar end)), + dets:close(TabRef), + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {'EXIT', _} = (catch dets:init_table(TabRef, fun() -> foo end)), + dets:close(TabRef), + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {'EXIT', {badarg, _}} = (catch dets:init_table(TabRef, nofun)), + ?line {'EXIT', {badarg, _}} = + (catch dets:init_table(TabRef, fun(_X) -> end_of_input end, + [{foo,bar}])), + dets:close(TabRef), + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line away = (catch dets:init_table(TabRef, fun(_) -> throw(away) end)), + dets:close(TabRef), + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {error, {init_fun, fopp}} = + dets:init_table(TabRef, fun(read) -> fopp end), + dets:close(TabRef), + + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line dets:safe_fixtable(TabRef, true), + ?line {error, {fixed_table, TabRef}} = dets:init_table(TabRef, init([])), + ?line dets:safe_fixtable(TabRef, false), + ?line ET = ets:new(foo,[]), + ?line ok = dets:from_ets(TabRef, ET), + ?line [] = get_all_objects(TabRef), + ?line [] = get_all_objects_fast(TabRef), + ?line true = ets:insert(ET, {1,a}), + ?line true = ets:insert(ET, {2,b}), + ?line ok = dets:from_ets(TabRef, ET), + ?line [{1,a},{2,b}] = sort(get_all_objects(TabRef)), + ?line [{1,a},{2,b}] = sort(get_all_objects_fast(TabRef)), + ?line true = ets:delete(ET), + ?line 120000 = dets:info(TabRef, auto_save), + ?line ok = dets:close(TabRef), + + ?line {ok, _} = dets:open_file(TabRef, [{access,read} | Args]), + ?line {error, {access_mode, Fname}} = dets:init_table(TabRef, init([])), + ?line ok = dets:close(TabRef), + + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {error, invalid_objects_list} = + (catch dets:init_table(TabRef, init([[{1,2},bad,{3,4}]]))), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + L1 = [[{1,a},{2,b}],[],[{3,c}],[{4,d}],[]], + bulk_init(L1, set, 4, Config, V), + L2 = [[{1,a},{2,b}],[],[{2,q},{3,c}],[{4,d}],[{4,e},{2,q}]], + bulk_init(L2, set, 4, Config, V), + bulk_init(L2, bag, 6, Config, V), + bulk_init(L2, duplicate_bag, 7, Config, V), + bulk_init(L1, set, 4, 512, Config, V), + bulk_init([], set, 0, 10000, Config, V), + file:delete(Fname), + + %% Initiate a file that contains a lot of objects. + ?line {ok, _} = dets:open_file(TabRef, [{min_no_slots,10000} | Args]), + ?line ok = ins(TabRef, 6000), + Fun = init_fun(0, 10000), + ?line ok = dets:init_table(TabRef, Fun,{format,term}), + ?line All = sort(get_all_objects(TabRef)), + ?line FAll = get_all_objects_fast(TabRef), + ?line true = All =:= sort(FAll), + ?line true = length(All) =:= 10000, + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(TabRef, [{min_no_slots,4000} | Args]), + ?line ok = ins(TabRef, 6000), + ?line FileSize1 = dets:info(TabRef, file_size), + Fun2 = init_fun(0, 4000), + ?line ok = dets:init_table(TabRef, Fun2), + ?line FileSize2 = dets:info(TabRef, file_size), + ?line ok = dets:close(TabRef), + ?line true = FileSize1 > FileSize2, + ?line file:delete(Fname), + + ?line check_pps(P0), + ok. + +bulk_init(Ls, Type, N, Config, V) -> + bulk_init(Ls, Type, N, 256, Config, V). + +bulk_init(Ls, Type, N, Est, Config, V) -> + T = init_table_test, + Fname = filename(T, Config), + ?line file:delete(Fname), + Input = init(Ls), + Args = [{ram_file,false}, {type,Type},{keypos,1},{file,Fname}, + {estimated_no_objects, Est},{version,V}], + ?line {ok, T} = dets:open_file(T, Args), + ?line ok = dets:init_table(T, Input), + ?line All = sort(get_all_objects(T)), + ?line FAll = get_all_objects_fast(T), + ?line true = All =:= sort(FAll), + ?line true = length(All) =:= N, + ?line true = dets:info(T, size) =:= N, + ?line ok = dets:close(T), + + ?line {ok, T} = dets:open_file(T, Args), + ?line All2 = sort(get_all_objects(T)), + ?line FAll2 = get_all_objects_fast(T), + ?line true = All =:= All2, + ?line true = All =:= sort(FAll2), + ?line ok = dets:close(T), + ?line file:delete(Fname). + +init(L) -> + fun(close) -> + ok; + (read) when [] =:= L -> + end_of_input; + (read) -> + [E | Es] = L, + {E, init(Es)} + end. + +init_fun(I, N) -> + fun(read) when I =:= N -> + end_of_input; + (read) -> + {NewN, Items} = items(I, N, 1000, []), + {Items, init_fun(NewN, N)}; + (close) -> + ignored + end. + +fast_init_table(Config) -> + V = 9, + TabRef = init_table_test, + Fname = filename(TabRef, Config), + ?line file:delete(Fname), + P0 = pps(), + + Args = [{file,Fname},{version,V},{auto_save,120000}], + + Source = init_table_test_source, + SourceFname = filename(Source, Config), + ?line file:delete(SourceFname), + SourceArgs = [{file,SourceFname},{version,V},{auto_save,120000}], + + ?line {ok, Source} = dets:open_file(Source, SourceArgs), + + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {'EXIT', _} = + (catch dets:init_table(TabRef, fun(foo) -> bar end, {format,bchunk})), + dets:close(TabRef), + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {'EXIT', _} = (catch dets:init_table(TabRef, fun() -> foo end, + {format,bchunk})), + dets:close(TabRef), + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {'EXIT', {badarg, _}} = + (catch dets:init_table(TabRef, nofun, {format,bchunk})), + dets:close(TabRef), + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line away = (catch dets:init_table(TabRef, fun(_) -> throw(away) end, + {format,bchunk})), + dets:close(TabRef), + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {error, {init_fun, fopp}} = + dets:init_table(TabRef, fun(read) -> fopp end, {format,bchunk}), + dets:close(TabRef), + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line dets:safe_fixtable(TabRef, true), + ?line {error, {fixed_table, TabRef}} = + dets:init_table(TabRef, init([]), {format,bchunk}), + ?line dets:safe_fixtable(TabRef, false), + ?line ok = dets:close(TabRef), + + ?line {ok, _} = dets:open_file(TabRef, [{access,read} | Args]), + ?line {error, {access_mode, Fname}} = + dets:init_table(TabRef, init([]), {format,bchunk}), + ?line ok = dets:close(TabRef), + + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {error, {init_fun,{1,2}}} = + dets:init_table(TabRef, init([[{1,2},bad,{3,4}]]), {format,bchunk}), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {error, {init_fun, end_of_input}} = + dets:init_table(TabRef, init([]),{format,bchunk}), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line {'EXIT', {badarg, _}} = + (catch dets:init_table(TabRef, init([]),{format,foppla})), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line ok = ins(TabRef, 100), + + ?line [BParms | Objs] = collect_bchunk(TabRef, init_bchunk(TabRef)), + ?line Parms = binary_to_term(BParms), + ?line {error, {init_fun, <<"foobar">>}} = + dets:init_table(TabRef, init([[<<"foobar">>]]),{format,bchunk}), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line Parms1 = setelement(1, Parms, foobar), + BParms1 = term_to_binary(Parms1), + ?line {error, {init_fun, BParms1}} = + dets:init_table(TabRef, init([[BParms1 | Objs]]),{format,bchunk}), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(TabRef, Args), + [{Sz1,No1} | NoColls17] = element(tuple_size(Parms), Parms), + Parms2 = setelement(tuple_size(Parms), Parms, [{Sz1,No1+1} | NoColls17]), + BParms2 = term_to_binary(Parms2), + ?line {error, invalid_objects_list} = + dets:init_table(TabRef, init([[BParms2 | Objs]]),{format,bchunk}), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line [{LSize1,Slot1,Obj1} | ObjsRest] = Objs, + + ?line BadSize = byte_size(Obj1)-1, + ?line <> = Obj1, + ?line BadObjs = [{LSize1,Slot1,BadSizeObj} | ObjsRest], + ?line {error, invalid_objects_list} = + dets:init_table(TabRef, init([[BParms | BadObjs]]),{format,bchunk}), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line <> = list_to_binary(lists:duplicate(16,Obj1)), + ?line BigObj = <<(Size*16):32,BigObj0/binary>>, + ?line BadColl = [BParms, {LSize1+4,Slot1,BigObj} | ObjsRest], + ?line {error, invalid_objects_list} = + dets:init_table(TabRef, init([BadColl]),{format,bchunk}), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(TabRef, Args), + BadObj = <<"foobar">>, + ?line {error, invalid_objects_list} = + dets:init_table(TabRef, init([[BParms, BadObj]]),{format,bchunk}), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(TabRef, [{type,bag} | Args]), + ?line {error, {init_fun, _}} = + dets:init_table(TabRef, init([[BParms]]),{format,bchunk}), + ?line _ = dets:close(TabRef), + ?line file:delete(Fname), + + ?line ok = dets:close(Source), + ?line file:delete(SourceFname), + + L1 = [{1,a},{2,b},{3,c},{4,d}], + fast_bulk_init(L1, set, 4, 4, Config, V), + L2 = [{1,a},{2,b},{2,q},{3,c},{4,d},{4,e},{2,q}], + fast_bulk_init(L2, set, 4, 4, Config, V), + fast_bulk_init(L2, bag, 6, 4, Config, V), + fast_bulk_init(L2, duplicate_bag, 7, 4, Config, V), + fast_bulk_init(L1, set, 4, 4, 512, Config, V), + fast_bulk_init([], set, 0, 0, 10000, Config, V), + file:delete(Fname), + + %% Initiate a file that contains a lot of objects. + ?line {ok, _} = dets:open_file(Source, [{min_no_slots,10000} | SourceArgs]), + Fun1 = init_fun(0, 10000), + ?line ok = dets:init_table(Source, Fun1, {format,term}), + + ?line {ok, _} = dets:open_file(TabRef, [{min_no_slots,10000} | Args]), + ?line ok = ins(TabRef, 6000), + Fun2 = init_bchunk(Source), + ?line true = + dets:is_compatible_bchunk_format(TabRef, + dets:info(Source, bchunk_format)), + ?line false = dets:is_compatible_bchunk_format(TabRef, <<"foobar">>), + ?line ok = dets:init_table(TabRef, Fun2, {format, bchunk}), + ?line ok = dets:close(Source), + ?line file:delete(SourceFname), + ?line All = sort(get_all_objects(TabRef)), + ?line FAll = get_all_objects_fast(TabRef), + ?line true = All =:= sort(FAll), + ?line true = length(All) =:= 10000, + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + + %% Initiate inserts fewer objects than the table contains. + ?line {ok, _} = dets:open_file(Source, [{min_no_slots,1000} | SourceArgs]), + ?line ok = ins(Source, 4000), + + ?line {ok, _} = dets:open_file(TabRef, [{min_no_slots,1000} | Args]), + ?line ok = ins(TabRef, 6000), + ?line FileSize1 = dets:info(TabRef, file_size), + Fun4 = init_bchunk(Source), + ?line ok = dets:init_table(TabRef, Fun4, {format, bchunk}), + ?line ok = dets:close(Source), + ?line file:delete(SourceFname), + ?line FileSize2 = dets:info(TabRef, file_size), + ?line All_2 = sort(get_all_objects(TabRef)), + ?line FAll_2 = get_all_objects_fast(TabRef), + ?line true = All_2 =:= sort(FAll_2), + ?line true = length(All_2) =:= 4000, + ?line ok = dets:close(TabRef), + ?line true = FileSize1 > FileSize2, + + %% Bchunk and fixed table. + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line NoItems = dets:info(TabRef, no_objects), + ?line AllObjects1 = sort(get_all_objects_fast(TabRef)), + ?line dets:safe_fixtable(TabRef, true), + ?line true = dets:info(TabRef, fixed), + ?line Cont1 = init_bchunk(TabRef), + ?line NoDel = + dets:select_delete(TabRef, [{{'_',{item,'_','_'}},[],[true]}]), + ?line true = (NoDel > 0), + ?line AllObjects2 = sort(get_all_objects_fast(TabRef)), + ?line true = dets:info(TabRef, fixed), + ?line Cont2 = init_bchunk(TabRef), + ?line NoItems2 = dets:info(TabRef, no_objects), + ?line true = (NoItems =:= NoItems2 + NoDel), + ?line NoDel2 = dets:select_delete(TabRef, [{'_',[],[true]}]), + ?line true = (NoDel2 > 0), + ?line AllObjects3 = sort(get_all_objects_fast(TabRef)), + ?line NoItems3 = dets:info(TabRef, no_objects), + ?line true = (NoItems3 =:= 0), + ?line true = dets:info(TabRef, fixed), + ?line true = (NoItems2 =:= NoItems3 + NoDel2), + ?line Cont3 = init_bchunk(TabRef), + + ?line BinColl1 = collect_bchunk(TabRef, Cont1), + ?line BinColl2 = collect_bchunk(TabRef, Cont2), + ?line BinColl3 = collect_bchunk(TabRef, Cont3), + ?line dets:safe_fixtable(TabRef, false), + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + + %% Now check that the above collected binaries are correct. + ?line {ok, _} = dets:open_file(TabRef, Args), + ?line ok = dets:init_table(TabRef, init([BinColl1]),{format,bchunk}), + ?line true = (AllObjects1 =:= sort(get_all_objects_fast(TabRef))), + ?line true = (length(AllObjects1) =:= dets:info(TabRef, no_objects)), + ?line ok = dets:init_table(TabRef, init([BinColl2]),{format,bchunk}), + ?line true = (AllObjects2 =:= sort(get_all_objects_fast(TabRef))), + ?line true = (length(AllObjects2) =:= dets:info(TabRef, no_objects)), + ?line ok = dets:init_table(TabRef, init([BinColl3]),{format,bchunk}), + ?line true = (AllObjects3 =:= sort(get_all_objects_fast(TabRef))), + ?line true = (length(AllObjects3) =:= dets:info(TabRef, no_objects)), + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + ?line check_pps(P0), + ok. + +fast_bulk_init(L, Type, N, NoKeys, Config, V) -> + fast_bulk_init(L, Type, N, NoKeys, 256, Config, V). + +fast_bulk_init(L, Type, N, NoKeys, Est, Config, V) -> + T = init_table_test, + Fname = filename(T, Config), + ?line file:delete(Fname), + + Args0 = [{ram_file,false}, {type,Type},{keypos,1}, + {estimated_no_objects, Est},{version,V}], + Args = [{file,Fname} | Args0], + S = init_table_test_source, + SFname = filename(S, Config), + ?line file:delete(SFname), + SArgs = [{file,SFname} | Args0], + + ?line {ok, S} = dets:open_file(S, SArgs), + ?line ok = dets:insert(S, L), + + Input = init_bchunk(S), + ?line {ok, T} = dets:open_file(T, Args), + ?line ok = dets:init_table(T, Input, [{format,bchunk}]), + ?line All = sort(get_all_objects(T)), + ?line FAll = get_all_objects_fast(T), + ?line true = All =:= sort(FAll), + ?line true = length(All) =:= N, + ?line true = dets:info(T, size) =:= N, + ?line true = dets:info(T, no_keys) =:= NoKeys, + ?line ok = dets:close(T), + + ?line {ok, T} = dets:open_file(T, Args), + ?line All2 = sort(get_all_objects(T)), + ?line FAll2 = get_all_objects_fast(T), + ?line true = All =:= All2, + ?line true = All =:= sort(FAll2), + ?line ok = dets:close(T), + ?line file:delete(Fname), + + ?line ok = dets:close(S), + ?line file:delete(SFname), + ok. + +init_bchunk(T) -> + Start = dets:bchunk(T, start), + init_bchunk(T, Start). + +init_bchunk(Tab, State) -> + fun(read) when State =:= '$end_of_table' -> + end_of_input; + (read) when element(1, State) =:= error -> + State; + (read) -> + {Cont, Objs} = State, + {Objs, init_bchunk(Tab, dets:bchunk(Tab, Cont))}; + (close) -> + ok + end. + +collect_bchunk(Tab, Fun) -> + collect_bchunk(Tab, Fun, []). + +collect_bchunk(Tab, Fun, L) -> + case Fun(read) of + end_of_input -> + lists:append(lists:reverse(L)); + {Objs, Fun2} when is_list(Objs) -> + collect_bchunk(Tab, Fun2, [Objs | L]); + Error -> + Error + end. + +items(I, N, C, L) when I =:= N; C =:= 0 -> + {I, L}; +items(I, N, C, L) -> + items(I+1, N, C-1, [{I, item(I)} | L]). + +repair_v8(doc) -> + ["open_file and repair."]; +repair_v8(suite) -> + []; +repair_v8(Config) when is_list(Config) -> + repair(Config, 8). + +repair_v9(doc) -> + ["open_file and repair."]; +repair_v9(suite) -> + []; +repair_v9(Config) when is_list(Config) -> + %% Convert from format 9 to format 8. + T = convert_98, + Fname = filename(T, Config), + ?line file:delete(Fname), + ?line {ok, _} = dets:open_file(T, [{file,Fname},{version,9}, + {type,duplicate_bag}]), + ?line 9 = dets:info(T, version), + ?line true = is_binary(dets:info(T, bchunk_format)), + ?line ok = dets:insert(T, [{1,a},{2,b},{1,c},{2,c},{1,c},{2,a},{1,b}]), + ?line dets:close(T), + ?line {error, {version_mismatch, _}} = + dets:open_file(T, [{file,Fname},{version,8},{type,duplicate_bag}]), + ?line {ok, _} = dets:open_file(T, [{file,Fname},{version,8}, + {type,duplicate_bag},{repair,force}]), + ?line 8 = dets:info(T, version), + ?line true = undefined =:= dets:info(T, bchunk_format), + ?line [{1,a},{1,b},{1,c},{1,c}] = sort(dets:lookup(T, 1)), + ?line [{2,a},{2,b},{2,c}] = sort(dets:lookup(T, 2)), + ?line 7 = dets:info(T, no_objects), + ?line no_keys_test(T), + ?line _ = histogram(T, silent), + ?line ok = dets:close(T), + ?line file:delete(Fname), + + %% The short lived format 9(a). + %% Not very throughly tested here. + A9 = a9, + ?line Version9aS = filename:join(?datadir(Config), "version_9a.dets"), + ?line Version9aT = filename('v9a.dets', Config), + ?line {ok, _} = file:copy(Version9aS, Version9aT), + ?line {ok, A9} = dets:open_file(A9, [{file,Version9aT}]), + ?line undefined = dets:info(A9, bchunk_format), + ?line [{1,a},{2,b},{3,c}] = sort(dets:match_object(A9, '_')), + ?line ok = dets:insert(A9, {4,d}), + ?line ok = dets:close(A9), + ?line {ok, A9} = dets:open_file(A9, [{file,Version9aT}]), + ?line {error, old_version} = dets:bchunk(A9, start), + ?line ok = dets:close(A9), + ?line io:format("Expect forced repair:~n"), + ?line {ok, A9} = dets:open_file(A9, [{file,Version9aT},{repair,force}]), + ?line {_, _} = dets:bchunk(A9, start), + ?line ok = dets:close(A9), + ?line file:delete(Version9aT), + + repair(Config, 9). + +repair(Config, V) -> + TabRef = repair_test, + Fname = filename(TabRef, Config), + ?line file:delete(Fname), + HeadSize = headsz(V), + + P0 = pps(), + ?line {'EXIT', {badarg, _}} = + (catch dets:open_file(TabRef, [{min_no_slots,1000}, + {max_no_slots,500}])), + ?line {error,{file_error,hoppla,enoent}} = dets:file_info(hoppla), + ?line {error,{file_error,Fname,enoent}} = + dets:open_file(TabRef, [{file, Fname}, {access, read}]), + + %% compacting, and some kind of test that free lists are saved OK on file + ?line {ok, TabRef} = dets:open_file(TabRef, [{file,Fname},{version,V}]), + ?line 0 = dets:info(TabRef, size), + ?line ok = ins(TabRef, 30000), + ?line ok = del(TabRef, 30000, 3), + ?line ok = dets:close(TabRef), + ?line {error, {access_mode,Fname}} = + dets:open_file(foo, [{file,Fname},{repair,force},{access,read}]), + ?line {ok, Ref3} = dets:open_file(Fname), % no repair! + ?line 20000 = dets:info(Ref3, size), + ?line 20000 = dets:foldl(fun(_, N) -> N+1 end, 0, Ref3), + ?line 20000 = count_objects_quite_fast(Ref3), % actually a test of match + ?line no_keys_test(Ref3), + ?line ok = dets:close(Ref3), + if + V =:= 8 -> + ?line {ok, TabRef} = dets:open_file(TabRef, + [{file, Fname},{version,V},{access,read}]), + ?line ok = dets:close(TabRef), + ?line io:format("Expect compacting repair:~n"), + ?line {ok, TabRef} = dets:open_file(TabRef, + [{file, Fname},{version,V}]), + ?line 20000 = dets:info(TabRef, size), + ?line _ = histogram(TabRef, silent), + ?line ok = dets:close(TabRef); + true -> + ok + end, + ?line {error,{keypos_mismatch,Fname}} = + dets:open_file(TabRef, [{file, Fname},{keypos,17}]), + ?line {error,{type_mismatch,Fname}} = + dets:open_file(TabRef, [{file, Fname},{type,duplicate_bag}]), + + %% make one of the temporary files unwritable + TmpFile = if + V =:= 8 -> + Fname ++ ".TMP.10000"; + true -> Fname ++ ".TMP.1" + end, + ?line file:delete(TmpFile), + ?line {ok, TmpFd} = file:open(TmpFile, [read,write]), + ?line ok = file:close(TmpFd), + ?line unwritable(TmpFile), + ?line {error,{file_error,TmpFile,eacces}} = dets:fsck(Fname, V), + ?line {ok, _} = dets:open_file(TabRef, + [{repair,false},{file, Fname},{version,V}]), + ?line 20000 = length(get_all_objects(TabRef)), + ?line _ = histogram(TabRef, silent), + ?line 20000 = length(get_all_objects_fast(TabRef)), + ?line ok = dets:close(TabRef), + ?line writable(TmpFile), + ?line file:delete(TmpFile), + + ?line truncate(Fname, HeadSize + 10), + ?line {error,{not_closed, Fname}} = + dets:open_file(TabRef, [{file, Fname}, {access, read}]), + ?line {error,{not_closed, Fname}} = + dets:open_file(TabRef, [{file, Fname}, {access, read}, + {repair,force}]), + ?line {error,{needs_repair, Fname}} = + dets:open_file(TabRef, [{file, Fname}, {repair, false}]), + ?line file:delete(Fname), + + %% truncated file header + ?line {ok, TabRef} = dets:open_file(TabRef, [{file,Fname},{version,V}]), + ?line ok = ins(TabRef, 100), + ?line ok = dets:close(TabRef), + ?line truncate(Fname, HeadSize - 10), + %% a new file is created ('tooshort') + ?line {ok, TabRef} = dets:open_file(TabRef, + [{file,Fname},{version,V}, + {min_no_slots,1000}, + {max_no_slots,1000000}]), + case dets:info(TabRef, no_slots) of + undefined -> ok; + {Min1,Slot1,Max1} -> + ?line true = Min1 =< Slot1, true = Slot1 =< Max1, + ?line true = 1000 < Min1, true = 1000+256 > Min1, + ?line true = 1000000 < Max1, true = (1 bsl 20)+256 > Max1 + end, + ?line 0 = dets:info(TabRef, size), + ?line no_keys_test(TabRef), + ?line _ = histogram(TabRef, silent), + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + + %% version bump (v8) + ?line Version7S = filename:join(?datadir(Config), "version_r2d.dets"), + ?line Version7T = filename('v2.dets', Config), + ?line {ok, _} = file:copy(Version7S, Version7T), + ?line {error,{version_bump, Version7T}} = dets:open_file(Version7T), + ?line {error,{version_bump, Version7T}} = + dets:open_file(Version7T, [{file,Version7T},{repair,false}]), + ?line {error,{version_bump, Version7T}} = + dets:open_file(Version7T, [{file, Version7T}, {access, read}]), + ?line io:format("Expect upgrade:~n"), + ?line {ok, _} = dets:open_file(Version7T, + [{file, Version7T},{version, V}]), + ?line [{1,a},{2,b}] = sort(get_all_objects(Version7T)), + ?line [{1,a},{2,b}] = sort(get_all_objects_fast(Version7T)), + Phash = if + V =:= 8 -> phash; + true -> phash2 + end, + ?line Phash = dets:info(Version7T, hash), + ?line _ = histogram(Version7T, silent), + ?line ok = dets:close(Version7T), + ?line {ok, _} = dets:open_file(Version7T, [{file, Version7T}]), + ?line Phash = dets:info(Version7T, hash), + ?line ok = dets:close(Version7T), + ?line file:delete(Version7T), + + %% converting free lists + ?line Version8aS = filename:join(?datadir(Config), "version_r3b02.dets"), + ?line Version8aT = filename('v3.dets', Config), + ?line {ok, _} = file:copy(Version8aS, Version8aT), + %% min_no_slots and max_no_slots are ignored - no repair is taking place + ?line {ok, _} = dets:open_file(version_8a, + [{file, Version8aT},{min_no_slots,1000}, + {max_no_slots,100000}]), + ?line [{1,b},{2,a},{a,1},{b,2}] = sort(get_all_objects(version_8a)), + ?line [{1,b},{2,a},{a,1},{b,2}] = sort(get_all_objects_fast(version_8a)), + ?line ok = ins(version_8a, 1000), + ?line 1002 = dets:info(version_8a, size), + ?line no_keys_test(version_8a), + ?line All8a = sort(get_all_objects(version_8a)), + ?line 1002 = length(All8a), + ?line FAll8a = sort(get_all_objects_fast(version_8a)), + ?line true = sort(All8a) =:= sort(FAll8a), + ?line ok = del(version_8a, 300, 3), + ?line 902 = dets:info(version_8a, size), + ?line no_keys_test(version_8a), + ?line All8a2 = sort(get_all_objects(version_8a)), + ?line 902 = length(All8a2), + ?line FAll8a2 = sort(get_all_objects_fast(version_8a)), + ?line true = sort(All8a2) =:= sort(FAll8a2), + ?line _ = histogram(version_8a, silent), + ?line ok = dets:close(version_8a), + ?line file:delete(Version8aT), + + %% will fail unless the slots are properly sorted when repairing (v8) + BArgs = [{file, Fname},{type,duplicate_bag}, + {delayed_write,{3000,10000}},{version,V}], + ?line {ok, TabRef} = dets:open_file(TabRef, BArgs), + Seq = seq(1, 500), + Small = map(fun(X) -> {X,X} end, Seq), + Big = map(fun(X) -> erlang:make_tuple(20, X) end, Seq), + ?line ok = dets:insert(TabRef, Small), + ?line ok = dets:insert(TabRef, Big), + ?line ok = dets:insert(TabRef, Small), + ?line ok = dets:insert(TabRef, Big), + ?line All = sort(safe_get_all_objects(TabRef)), + ?line ok = dets:close(TabRef), + ?line io:format("Expect forced repair:~n"), + ?line {ok, _} = + dets:open_file(TabRef, [{repair,force},{min_no_slots,2000} | BArgs]), + if + V =:= 9 -> + ?line {MinNoSlots,_,MaxNoSlots} = dets:info(TabRef, no_slots), + ?line ok = dets:close(TabRef), + ?line io:format("Expect compaction:~n"), + ?line {ok, _} = + dets:open_file(TabRef, [{repair,force}, + {min_no_slots,MinNoSlots}, + {max_no_slots,MaxNoSlots} | BArgs]); + true -> + ok + end, + ?line All2 = get_all_objects(TabRef), + ?line true = All =:= sort(All2), + ?line FAll2 = get_all_objects_fast(TabRef), + ?line true = All =:= sort(FAll2), + ?line true = length(All) =:= dets:info(TabRef, size), + ?line no_keys_test(TabRef), + Fun = fun(X) -> 4 = length(dets:lookup(TabRef, X)) end, + ?line foreach(Fun, Seq), + ?line _ = histogram(TabRef, silent), + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + + %% object bigger than segments, the "hole" is taken care of + ?line {ok, TabRef} = dets:open_file(TabRef, [{file, Fname},{version,V}]), + Tuple = erlang:make_tuple(1000, foobar), % > 2 kB + ?line ok = dets:insert(TabRef, Tuple), + %% at least one full segment (objects smaller than 2 kB): + ?line ins(TabRef, 2000), + ?line ok = dets:close(TabRef), + + if + V =:= 8 -> + %% first estimated number of objects is wrong, repair once more + ?line {ok, Fd} = file:open(Fname, read_write), + NoPos = HeadSize - 8, % no_objects + ?line file:pwrite(Fd, NoPos, <<0:32>>), % NoItems + ok = file:close(Fd), + ?line dets:fsck(Fname, V), + ?line {ok, _} = + dets:open_file(TabRef, + [{repair,false},{file, Fname},{version,V}]), + ?line 2001 = length(get_all_objects(TabRef)), + ?line _ = histogram(TabRef, silent), + ?line 2001 = length(get_all_objects_fast(TabRef)), + ?line ok = dets:close(TabRef); + true -> + ok + end, + + ?line {ok, _} = + dets:open_file(TabRef, + [{repair,false},{file, Fname},{version,V}]), + ?line {ok, ObjPos} = dets:where(TabRef, {66,{item,number,66}}), + ?line ok = dets:close(TabRef), + %% Damaged object. + Pos = 12, % v9: compaction fails, proper repair follows + crash(Fname, ObjPos+Pos), + ?line io:format( + "Expect forced repair (possibly after attempted compaction):~n"), + ?line {ok, _} = + dets:open_file(TabRef, [{repair,force},{file, Fname},{version,V}]), + ?line true = dets:info(TabRef, size) < 2001, + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + + %% The file is smaller than the padded object. + ?line {ok, TabRef} = dets:open_file(TabRef, [{file,Fname},{version,V}]), + ?line ok = dets:insert(TabRef, Tuple), + ?line ok = dets:close(TabRef), + ?line io:format("Expect forced repair or compaction:~n"), + ?line {ok, _} = + dets:open_file(TabRef, [{repair,force},{file, Fname},{version,V}]), + ?line true = 1 =:= dets:info(TabRef, size), + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + + %% Damaged free lists. + ?line {ok, TabRef} = dets:open_file(TabRef, [{file,Fname},{version,V}]), + ?line ok = ins(TabRef, 300), + ?line ok = dets:sync(TabRef), + ?line ok = del(TabRef, 300, 3), + %% FileSize is approximately where the free lists will be written. + ?line FileSize = dets:info(TabRef, memory), + ?line ok = dets:close(TabRef), + crash(Fname, FileSize+20), + ?line {error, {bad_freelists, Fname}} = + dets:open_file(TabRef, [{file,Fname},{version,V}]), + ?line file:delete(Fname), + + %% File not closed, opening with read and read_write access tried. + ?line {ok, TabRef} = dets:open_file(TabRef, [{file,Fname},{version,V}]), + ?line ok = ins(TabRef, 300), + ?line ok = dets:close(TabRef), + ?line crash(Fname, ?CLOSED_PROPERLY_POS+3, ?NOT_PROPERLY_CLOSED), + ?line {error, {not_closed, Fname}} = + dets:open_file(foo, [{file,Fname},{version,V},{repair,force}, + {access,read}]), + ?line {error, {not_closed, Fname}} = + dets:open_file(foo, [{file,Fname},{version,V},{repair,true}, + {access,read}]), + ?line io:format("Expect repair:~n"), + ?line {ok, TabRef} = + dets:open_file(TabRef, [{file,Fname},{version,V},{repair,true}, + {access,read_write}]), + ?line ok = dets:close(TabRef), + ?line crash(Fname, ?CLOSED_PROPERLY_POS+3, ?NOT_PROPERLY_CLOSED), + ?line io:format("Expect forced repair:~n"), + ?line {ok, TabRef} = + dets:open_file(TabRef, [{file,Fname},{version,V},{repair,force}, + {access,read_write}]), + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + + %% The size of an object is huge. + ?line {ok, TabRef} = dets:open_file(TabRef, [{file,Fname},{version,V}]), + ?line ok = dets:insert(TabRef, [{1,2,3},{2,3,4}]), + ?line {ok, ObjPos2} = dets:where(TabRef, {1,2,3}), + ?line ok = dets:close(TabRef), + ObjPos3 = if + V =:= 8 -> ObjPos2 + 4; + V =:= 9 -> ObjPos2 + end, + crash(Fname, ObjPos3, 255), + ?line io:format("Expect forced repair:~n"), + ?line {ok, TabRef} = + dets:open_file(TabRef, [{file,Fname},{version,V},{repair,force}]), + ?line ok = dets:close(TabRef), + ?line file:delete(Fname), + + ?line check_pps(P0), + ok. + +hash_v8b_v8c(doc) -> + ["Test the use of different hashing algorithms in v8b and v8c of the " + "Dets file format."]; +hash_v8b_v8c(suite) -> + []; +hash_v8b_v8c(Config) when is_list(Config) -> + ?line Source = + filename:join(?datadir(Config), "dets_test_v8b.dets"), + %% Little endian version of old file (there is an endianess bug in + %% the old hash). This is all about version 8 of the dets file format. + + P0 = pps(), + ?line SourceLE = + filename:join(?datadir(Config), + "dets_test_v8b_little_endian.dets"), + ?line Target1 = filename('oldhash1.dets', Config), + ?line Target1LE = filename('oldhash1le.dets', Config), + ?line Target2 = filename('oldhash2.dets', Config), + ?line {ok, Bin} = file:read_file(Source), + ?line {ok, BinLE} = file:read_file(SourceLE), + ?line ok = file:write_file(Target1,Bin), + ?line ok = file:write_file(Target1LE,BinLE), + ?line ok = file:write_file(Target2,Bin), + ?line {ok, d1} = dets:open_file(d1,[{file,Target1}]), + ?line {ok, d1le} = dets:open_file(d1le,[{file,Target1LE}]), + ?line {ok, d2} = dets:open_file(d2,[{file,Target2},{repair,force}, + {version,8}]), + ?line FF = fun(N,_F,_T) when N > 16#FFFFFFFFFFFFFFFF -> + ok; + (N,F,T) -> + V = integer_to_list(N), + case dets:lookup(T,N) of + [{N,V}] -> + F(N*2,F,T); + _Error -> + exit({failed,{lookup,T,N}}) + end + end, + ?line Mess = case (catch FF(1,FF,d1)) of + {'EXIT', {failed, {lookup,_,_}}} -> + ?line ok = dets:close(d1), + ?line FF(1,FF,d1le), + ?line hash = dets:info(d1le,hash), + ?line dets:insert(d1le,{33333333333,hejsan}), + ?line [{33333333333,hejsan}] = + dets:lookup(d1le,33333333333), + ?line ok = dets:close(d1le), + ?line {ok, d1le} = dets:open_file(d1le, + [{file,Target1LE}]), + ?line [{33333333333,hejsan}] = + dets:lookup(d1le,33333333333), + ?line FF(1,FF,d1le), + ?line ok = dets:close(d1le), + "Seems to be a little endian machine"; + {'EXIT', Fault} -> + exit(Fault); + _ -> + ?line ok = dets:close(d1le), + ?line hash = dets:info(d1,hash), + ?line dets:insert(d1,{33333333333,hejsan}), + ?line [{33333333333,hejsan}] = + dets:lookup(d1,33333333333), + ?line ok = dets:close(d1), + ?line {ok, d1} = dets:open_file(d1,[{file,Target1}]), + ?line [{33333333333,hejsan}] = + dets:lookup(d1,33333333333), + ?line FF(1,FF,d1), + ?line ok = dets:close(d1), + "Seems to be a big endian machine" + end, + ?line FF(1,FF,d2), + ?line phash = dets:info(d2,hash), + ?line ok = dets:close(d2), + ?line file:delete(Target1), + ?line file:delete(Target1LE), + ?line file:delete(Target2), + ?line check_pps(P0), + {comment, Mess}. + +phash(doc) -> + ["Test version 9(b) with erlang:phash/2 as hash function."]; +phash(suite) -> + []; +phash(Config) when is_list(Config) -> + T = phash, + Phash_v9bS = filename:join(?datadir(Config), "version_9b_phash.dat"), + Fname = filename('v9b.dets', Config), + ?line {ok, _} = file:copy(Phash_v9bS, Fname), + + %% Deleting all objects changes the hash function. + %% A feature... (it's for free) + ?line {ok, T} = dets:open_file(T, [{file, Fname}]), + ?line phash = dets:info(T, hash), + ?line dets:delete_all_objects(T), + ?line phash2 = dets:info(T, hash), + ?line [] = get_all_objects(T), + ?line [] = get_all_objects_fast(T), + ?line ok = dets:close(T), + + %% The hash function is kept when compacting a table. + ?line {ok, _} = file:copy(Phash_v9bS, Fname), + ?line io:format("Expect compaction:~n"), + ?line {ok, T} = dets:open_file(T, [{file, Fname},{repair,force}]), + ?line phash = dets:info(T, hash), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e}] = + lists:sort(dets:lookup_keys(T, [1,2,3,4,5])), + ?line ok = dets:close(T), + + %% The hash function is updated when repairing a table (no cost). + ?line {ok, _} = file:copy(Phash_v9bS, Fname), + crash(Fname, ?CLOSED_PROPERLY_POS+3, 0), + ?line io:format("Expect repair:~n"), + ?line {ok, T} = dets:open_file(T, [{file, Fname}]), + ?line phash2 = dets:info(T, hash), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e}] = + lists:sort(dets:lookup_keys(T, [1,2,3,4,5])), + ?line ok = dets:close(T), + + %% One cannot use the bchunk format when copying between a phash + %% table and a phash2 table. (There is no test for the case an R9 + %% (or later) node (using phash2) copies a table to an R8 node + %% (using phash).) See also the comment on HASH_PARMS in dets_v9.erl. + ?line {ok, _} = file:copy(Phash_v9bS, Fname), + ?line {ok, T} = dets:open_file(T, [{file, Fname}]), + ?line Type = dets:info(T, type), + ?line KeyPos = dets:info(T, keypos), + Input = init_bchunk(T), + T2 = phash_table, + Fname2 = filename(T2, Config), + Args = [{type,Type},{keypos,KeyPos},{version,9},{file,Fname2}], + ?line {ok, T2} = dets:open_file(T2, Args), + ?line {error, {init_fun, _}} = + dets:init_table(T2, Input, {format,bchunk}), + ?line _ = dets:close(T2), + ?line ok = dets:close(T), + ?line file:delete(Fname2), + + ?line file:delete(Fname), + ok. + +fold_v8(doc) -> + ["foldl, foldr, to_ets"]; +fold_v8(suite) -> + []; +fold_v8(Config) when is_list(Config) -> + fold(Config, 8). + +fold_v9(doc) -> + ["foldl, foldr, to_ets"]; +fold_v9(suite) -> + []; +fold_v9(Config) when is_list(Config) -> + fold(Config, 9). + +fold(Config, Version) -> + T = test_table, + N = 100, + ?line Fname = filename(T, Config), + ?line file:delete(Fname), + P0 = pps(), + + Args = [{version, Version}, {file,Fname}, {estimated_no_objects, N}], + ?line {ok, _} = dets:open_file(T, Args), + + ?line ok = ins(T, N), + + ?line Ets = ets:new(to_ets, [public]), + ?line dets:to_ets(T, Ets), + ?line true = N =:= ets:info(Ets, size), + ?line ets:delete(Ets), + + ?line Ets2 = ets:new(to_ets, [private]), + ?line dets:to_ets(T, Ets2), + ?line true = N =:= ets:info(Ets2, size), + ?line ets:delete(Ets2), + + ?line {'EXIT', {badarg, _}} = (catch dets:to_ets(T, not_an_ets_table)), + + F0 = fun(X, A) -> [X | A] end, + ?line true = N =:= length(dets:foldl(F0, [], T)), + ?line true = N =:= length(dets:foldr(F0, [], T)), + + F1 = fun(_X, _A) -> throw(away) end, + ?line away = (catch dets:foldl(F1, [], T)), + ?line away = (catch dets:foldr(F1, [], T)), + + F2 = fun(X, A) -> X + A end, + ?line {'EXIT', _} = (catch dets:foldl(F2, [], T)), + ?line {'EXIT', _} = (catch dets:foldr(F2, [], T)), + + F3 = fun(_X) -> throw(away) end, + ?line away = (catch dets:traverse(T, F3)), + + F4 = fun(X) -> X + 17 end, + ?line {'EXIT', _} = (catch dets:traverse(T, F4)), + + ?line F5 = fun(_X) -> done end, + ?line done = dets:traverse(T, F5), + + ?line {ok, ObjPos} = dets:where(T, {66,{item,number,66}}), + ?line ok = dets:close(T), + + %% Damaged object. + Pos = if + Version =:= 8 -> 12; + Version =:= 9 -> 8 + end, + crash(Fname, ObjPos+Pos), + ?line {ok, _} = dets:open_file(T, Args), + ?line io:format("Expect corrupt table:~n"), + ?line BadObject1 = dets:foldl(F0, [], T), + ?line bad_object(BadObject1, Fname), + ?line BadObject2 = dets:close(T), + ?line bad_object(BadObject2, Fname), + + ?line file:delete(Fname), + ?line check_pps(P0), + ok. + +fixtable_v8(doc) -> + ["Add objects to a fixed table."]; +fixtable_v8(suite) -> + []; +fixtable_v8(Config) when is_list(Config) -> + fixtable(Config, 8). + +fixtable_v9(doc) -> + ["Add objects to a fixed table."]; +fixtable_v9(suite) -> + []; +fixtable_v9(Config) when is_list(Config) -> + fixtable(Config, 9). + +fixtable(Config, Version) when is_list(Config) -> + T = fixtable, + ?line Fname = filename(fixtable, Config), + ?line file:delete(Fname), + Args = [{version,Version},{file,Fname}], + P0 = pps(), + ?line {ok, _} = dets:open_file(T, Args), + + %% badarg + ?line {'EXIT', {badarg, [{dets,safe_fixtable,[no_table,true]}|_]}} = + (catch dets:safe_fixtable(no_table,true)), + ?line {'EXIT', {badarg, [{dets,safe_fixtable,[T,undefined]}|_]}} = + (catch dets:safe_fixtable(T,undefined)), + + %% The table is not allowed to grow while the elements are inserted: + + ?line ok = ins(T, 500), + ?line dets:safe_fixtable(T, false), + %% Now the table can grow. At the same time as elements are inserted, + %% the table tries to catch up with the previously inserted elements. + ?line ok = ins(T, 1000), + ?line 1000 = dets:info(T, size), + ?line ok = dets:close(T), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(T, [{type, duplicate_bag} | Args]), + %% In a fixed table, delete and re-insert an object. + ?line ok = dets:insert(T, {1, a, b}), + ?line dets:safe_fixtable(T, true), + ?line ok = dets:match_delete(T, {1, a, b}), + ?line ok = dets:insert(T, {1, a, b}), + ?line dets:safe_fixtable(T, false), + ?line 1 = length(dets:match_object(T, '_')), + + ?line ok = dets:match_delete(T, '_'), + %% In a fixed table, delete and insert a smaller object. + ?line ok = dets:insert(T, {1, duplicate(100, e)}), + ?line dets:safe_fixtable(T, true), + ?line ok = dets:match_delete(T, {1, '_'}), + ?line ok = dets:insert(T, {1, a, b}), + ?line dets:safe_fixtable(T, false), + ?line 1 = length(dets:match_object(T, '_')), + + ?line ok = dets:delete_all_objects(T), + %% Like the last one, but one extra object. + ?line ok = dets:insert(T, {1, duplicate(100, e)}), + ?line ok = dets:insert(T, {2, duplicate(100, e)}), + ?line dets:safe_fixtable(T, true), + ?line ok = dets:match_delete(T, {1, '_'}), + ?line ok = dets:insert(T, {1, a, b}), + ?line dets:safe_fixtable(T, false), + ?line 2 = length(dets:match_object(T, '_')), + ?line dets:safe_fixtable(T, true), + ?line ok = dets:delete_all_objects(T), + ?line true = dets:info(T, fixed), + ?line 0 = length(dets:match_object(T, '_')), + + ?line ok = dets:close(T), + ?line file:delete(Fname), + ?line check_pps(P0), + ok. + +match_v8(doc) -> + ["Matching objects of a fixed table."]; +match_v8(suite) -> + []; +match_v8(Config) when is_list(Config) -> + match(Config, 8). + +match_v9(doc) -> + ["Matching objects of a fixed table."]; +match_v9(suite) -> + []; +match_v9(Config) when is_list(Config) -> + match(Config, 9). + +match(Config, Version) -> + T = match, + ?line Fname = filename(match, Config), + ?line file:delete(Fname), + P0 = pps(), + + Args = [{version, Version}, {file,Fname}, {type, duplicate_bag}, + {estimated_no_objects,550}], + ?line {ok, _} = dets:open_file(T, Args), + ?line ok = dets:insert(T, {1, a, b}), + ?line ok = dets:insert(T, {1, b, a}), + ?line ok = dets:insert(T, {2, a, b}), + ?line ok = dets:insert(T, {2, b, a}), + + %% match, badarg + MSpec = [{'_',[],['$_']}], + ?line {'EXIT', {badarg, [{dets,safe_fixtable,[no_table,true]}|_]}} = + (catch dets:match(no_table, '_')), + ?line {'EXIT', {badarg, [{dets,match,[T,'_',not_a_number]}|_]}} = + (catch dets:match(T, '_', not_a_number)), + ?line {EC1, _} = dets:select(T, MSpec, 1), + ?line {'EXIT', {badarg, [{dets,match,[EC1]}|_]}} = + (catch dets:match(EC1)), + + %% match_object, badarg + ?line {'EXIT', {badarg, [{dets,safe_fixtable,[no_table,true]}|_]}} = + (catch dets:match_object(no_table, '_')), + ?line {'EXIT', {badarg, [{dets,match_object,[T,'_',not_a_number]}|_]}} = + (catch dets:match_object(T, '_', not_a_number)), + ?line {EC2, _} = dets:select(T, MSpec, 1), + ?line {'EXIT', {badarg, [{dets,match_object,[EC2]}|_]}} = + (catch dets:match_object(EC2)), + + dets:safe_fixtable(T, true), + ?line {[_, _], C1} = dets:match_object(T, '_', 2), + ?line {[_, _], C2} = dets:match_object(C1), + ?line '$end_of_table' = dets:match_object(C2), + ?line {[_, _], C3} = dets:match_object(T, {1, '_', '_'}, 100), + ?line '$end_of_table' = dets:match_object(C3), + ?line '$end_of_table' = dets:match_object(T, {'_'}, default), + ?line dets:safe_fixtable(T, false), + + ?line dets:safe_fixtable(T, true), + ?line {[_, _], C30} = dets:match(T, '$1', 2), + ?line {[_, _], C31} = dets:match(C30), + ?line '$end_of_table' = dets:match(C31), + ?line {[_, _], C32} = dets:match(T, {1, '$1', '_'}, 100), + ?line '$end_of_table' = dets:match(C32), + ?line '$end_of_table' = dets:match(T, {'_'}, default), + ?line dets:safe_fixtable(T, false), + ?line [[1],[1],[2],[2]] = sort(dets:match(T, {'$1','_','_'})), + + %% delete and insert while chunking + %% (this case almost worthless after changes in OTP-5232) + ?line ok = dets:match_delete(T, '_'), + L500 = seq(1, 500), + Fun = fun(X) -> ok = dets:insert(T, {X, a, b, c, d}) end, + ?line foreach(Fun, L500), + %% Select one object DI in L3 below to be deleted. + ?line {_, TmpCont} = dets:match_object(T, '_', 200), + ?line {_, TmpCont1} = dets:match_object(TmpCont), + ?line {TTL, _} = dets:match_object(TmpCont1), + ?line DI = if Version =:= 8 -> last(TTL); Version =:= 9 -> hd(TTL) end, + ?line dets:safe_fixtable(T, true), + ?line {L1, C20} = dets:match_object(T, '_', 200), + ?line true = 200 =< length(L1), + ?line ok = dets:match_delete(T, {'2','_','_'}), % no match + ?line ok = dets:match_delete(T, DI), % last object + Tiny = {1050}, + ?line ok = dets:insert(T, Tiny), + ?line true = member(Tiny, dets:match_object(T, '_')), + ?line {_L2, C21} = dets:match_object(C20), + ?line {_L3, _C22} = dets:match_object(C21), + %% It used to be that Tiny was not visible here, but since the + %% scanning of files was changed to inspect the free lists every + %% now and then it may very well be visible here. + %% ?line false = member(Tiny, _L3), + %% DI used to visible here, but the above mentioned modification + %% has changed that; it may or may not be visible. + %% ?line true = member(DI, _L3), + ?line dets:safe_fixtable(T, false), + ?line true = dets:member(T, 1050), + ?line true = member(Tiny, dets:match_object(T, '_')), + ?line false = member(DI, dets:match_object(T, '_')), + + ?line ok = dets:close(T), + ?line file:delete(Fname), + + N = 100, + ?line {ok, _} = dets:open_file(T, [{estimated_no_objects,N} | Args]), + ?line ok = ins(T, N), + Obj = {66,{item,number,66}}, + Spec = {'_','_'}, + ?line {ok, ObjPos} = dets:where(T, Obj), + ?line ok = dets:close(T), + %% Damaged object. + crash(Fname, ObjPos+12), + ?line {ok, _} = dets:open_file(T, Args), + ?line io:format("Expect corrupt table:~n"), + ?line case ins(T, N) of + ok -> + ?line bad_object(dets:sync(T), Fname); + Else -> + ?line bad_object(Else, Fname) + end, + ?line io:format("Expect corrupt table:~n"), + ?line bad_object(dets:match(T, Spec), Fname), + ?line io:format("Expect corrupt table:~n"), + ?line bad_object(dets:match_delete(T, Spec), Fname), + ?line bad_object(dets:close(T), Fname), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(T, [{estimated_no_objects,N} | Args]), + ?line ok = ins(T, N), + ?line {ok, ObjPos2} = dets:where(T, Obj), + ?line ok = dets:close(T), + + %% Damaged size of object. + %% In v8, there is a next pointer before the size. + CrashPos = if Version =:= 8 -> 5; Version =:= 9 -> 1 end, + crash(Fname, ObjPos2+CrashPos), + ?line {ok, _} = dets:open_file(T, Args), + ?line io:format("Expect corrupt table:~n"), + ?line case ins(T, N) of + ok -> + ?line bad_object(dets:sync(T), Fname); + Else2 -> + ?line bad_object(Else2, Fname) + end, + %% Just echoes... + ?line bad_object(dets:match(T, Spec), Fname), + ?line bad_object(dets:match_delete(T, Spec), Fname), + ?line bad_object(dets:close(T), Fname), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(T, [{estimated_no_objects,N} | Args]), + ?line ok = ins(T, N), + ?line {ok, ObjPos3} = dets:where(T, Obj), + ?line ok = dets:close(T), + + %% match_delete finds an error + CrashPos3 = if Version =:= 8 -> 12; Version =:= 9 -> 16 end, + crash(Fname, ObjPos3+CrashPos3), + ?line {ok, _} = dets:open_file(T, Args), + ?line bad_object(dets:match_delete(T, Spec), Fname), + ?line bad_object(dets:close(T), Fname), + ?line file:delete(Fname), + + %% The key is not fixed, but not all objects with the key are removed. + ?line {ok, _} = dets:open_file(T, Args), + ?line ok = dets:insert(T, [{1,a},{1,b},{1,c},{1,a},{1,b},{1,c}]), + ?line 6 = dets:info(T, size), + ?line ok = dets:match_delete(T, {'_',a}), + ?line 4 = dets:info(T, size), + ?line [{1,b},{1,b},{1,c},{1,c}] = + sort(dets:match_object(T,{'_','_'})), + ?line ok = dets:close(T), + ?line file:delete(Fname), + + ?line check_pps(P0), + ok. + +select_v8(doc) -> + ["Selecting objects of a fixed table."]; +select_v8(suite) -> + []; +select_v8(Config) when is_list(Config) -> + select(Config, 8). + +select_v9(doc) -> + ["Selecting objects of a fixed table."]; +select_v9(suite) -> + []; +select_v9(Config) when is_list(Config) -> + select(Config, 9). + +select(Config, Version) -> + T = select, + ?line Fname = filename(select, Config), + ?line file:delete(Fname), + P0 = pps(), + + ?line Args = [{version,Version}, {file,Fname}, {type, duplicate_bag}, + {estimated_no_objects,550}], + ?line {ok, _} = dets:open_file(T, Args), + ?line ok = dets:insert(T, {1, a, b}), + ?line ok = dets:insert(T, {1, b, a}), + ?line ok = dets:insert(T, {2, a, b}), + ?line ok = dets:insert(T, {2, b, a}), + ?line ok = dets:insert(T, {3, a, b}), + ?line ok = dets:insert(T, {3, b, a}), + + %% badarg + MSpec = [{'_',[],['$_']}], + ?line {'EXIT', {badarg, [{dets,safe_fixtable,[no_table,true]}|_]}} = + (catch dets:select(no_table, MSpec)), + ?line {'EXIT', {badarg, [{dets,select,[T,<<17>>]}|_]}} = + (catch dets:select(T, <<17>>)), + ?line {'EXIT', {badarg, [{dets,select,[T,[]]}|_]}} = + (catch dets:select(T, [])), + ?line {'EXIT', {badarg, [{dets,select,[T,MSpec,not_a_number]}|_]}} = + (catch dets:select(T, MSpec, not_a_number)), + ?line {EC, _} = dets:match(T, '_', 1), + ?line {'EXIT', {badarg, [{dets,select,[EC]}|_]}} = + (catch dets:select(EC)), + + AllSpec = [{'_',[],['$_']}], + + ?line dets:safe_fixtable(T, true), + ?line {[_, _], C1} = dets:select(T, AllSpec, 2), + ?line {[_, _], C2} = dets:select(C1), + ?line {[_, _], C2a} = dets:select(C2), + ?line '$end_of_table' = dets:select(C2a), + ?line {[_, _], C3} = dets:select(T, [{{1,'_','_'},[],['$_']}], 100), + ?line '$end_of_table' = dets:select(C3), + ?line '$end_of_table' = dets:select(T, [{{'_'},[],['$_']}], default), + ?line dets:safe_fixtable(T, false), + Sp1 = [{{1,'_','_'},[],['$_']},{{1,'_','_'},[],['$_']}, + {{2,'_','_'},[],['$_']}], + ?line [_,_,_,_] = dets:select(T, Sp1), + Sp2 = [{{1,'_','_'},[],['$_']},{{1,'_','_'},[],['$_']}, + {{'_','_','_'},[],['$_']}], + ?line [_,_,_,_,_,_] = dets:select(T, Sp2), + + AllDeleteSpec = [{'_',[],[true]}], + %% delete and insert while chunking + %% (this case almost worthless after changes in OTP-5232) + ?line 6 = dets:select_delete(T, AllDeleteSpec), + L500 = seq(1, 500), + Fun = fun(X) -> ok = dets:insert(T, {X, a, b, c, d}) end, + ?line foreach(Fun, L500), + %% Select one object DI in L3 below to be deleted. + ?line {_, TmpCont} = dets:match_object(T, '_', 200), + ?line {_, TmpCont1} = dets:match_object(TmpCont), + ?line {TTL, _} = dets:match_object(TmpCont1), + ?line DI = if Version =:= 8 -> last(TTL); Version =:= 9 -> hd(TTL) end, + ?line dets:safe_fixtable(T, true), + ?line {L1, C20} = dets:select(T, AllSpec, 200), + ?line true = 200 =< length(L1), + ?line 0 = dets:select_delete(T, [{{2,'_','_'},[],[true]}]), + ?line 1 = dets:select_delete(T, [{DI,[],[true]}]), % last object + Tiny = {1050}, + ?line ok = dets:insert(T, Tiny), + ?line true = member(Tiny, dets:select(T, AllSpec)), + ?line {_L2, C21} = dets:select(C20), + ?line {_L3, _C22} = dets:select(C21), + %% It used to be that Tiny was not visible here, but since the + %% scanning of files was changed to inspect the free lists every + %% now and then it may very well be visible here. + %% ?line false = member(Tiny, _L3), + %% DI used to visible here, but the above mentioned modification + %% has changed that; it may or may not be visible. + %% ?line true = member(DI, _L3), + ?line true = dets:member(T, 1050), + ?line true = member(Tiny, dets:select(T, AllSpec)), + ?line false = member(DI, dets:select(T, AllSpec)), + ?line dets:safe_fixtable(T, false), + ?line true = dets:member(T, 1050), + ?line true = member(Tiny, dets:select(T, AllSpec)), + ?line false = member(DI, dets:select(T, AllSpec)), + ?line ok = dets:close(T), + ?line file:delete(Fname), + + %% The key is not fixed, but not all objects with the key are removed. + ?line {ok, _} = dets:open_file(T, Args), + ?line ok = dets:insert(T, [{1,a},{1,b},{1,c},{1,a},{1,b},{1,c}]), + ?line 6 = dets:info(T, size), + ?line 2 = dets:select_delete(T, [{{'_',a},[],[true]}]), + ?line 4 = dets:info(T, size), + ?line [{1,b},{1,b},{1,c},{1,c}] = sort(dets:select(T, AllSpec)), + ?line ok = dets:close(T), + ?line file:delete(Fname), + + ?line check_pps(P0), + ok. + +update_counter(doc) -> + ["Test update_counter/1."]; +update_counter(suite) -> + []; +update_counter(Config) when is_list(Config) -> + T = update_counter, + ?line Fname = filename(select, Config), + ?line file:delete(Fname), + P0 = pps(), + + ?line {'EXIT', {badarg, [{dets,update_counter,[no_table,1,1]}|_]}} = + (catch dets:update_counter(no_table, 1, 1)), + + Args = [{file,Fname},{keypos,2}], + ?line {ok, _} = dets:open_file(T, [{type,set} | Args]), + ?line {'EXIT', {badarg, _}} = (catch dets:update_counter(T, 1, 1)), + ?line ok = dets:insert(T, {1,a}), + ?line {'EXIT', {badarg, _}} = (catch dets:update_counter(T, 1, 1)), + ?line ok = dets:insert(T, {0,1}), + ?line {'EXIT', {badarg, _}} = (catch dets:update_counter(T, 1, 1)), + ?line ok = dets:insert(T, {0,1,0}), + ?line 1 = dets:update_counter(T, 1, 1), + ?line 2 = dets:update_counter(T, 1, 1), + ?line 6 = dets:update_counter(T, 1, {3,4}), + ?line {'EXIT', {badarg, _}} = (catch dets:update_counter(T, 1, {0,3})), + ?line ok = dets:close(T), + ?line file:delete(Fname), + + ?line {ok, _} = dets:open_file(T, [{type,bag} | Args]), + ?line ok = dets:insert(T, {0,1,0}), + ?line {'EXIT', {badarg, _}} = (catch dets:update_counter(T, 1, 1)), + ?line ok = dets:close(T), + ?line file:delete(Fname), + ?line check_pps(P0), + + ok. + +badarg(doc) -> + ["Call some functions with bad arguments."]; +badarg(suite) -> + []; +badarg(Config) when is_list(Config) -> + T = badarg, + ?line Fname = filename(select, Config), + ?line file:delete(Fname), + P0 = pps(), + + Args = [{file,Fname},{keypos,3}], + ?line {ok, _} = dets:open_file(T, [{type,set} | Args]), + % ?line dets:verbose(), + + %% badargs are tested in match, select and fixtable too. + + %% open + ?line {'EXIT', {badarg, [{dets,open_file,[{a,tuple},[]]}|_]}} = + (catch dets:open_file({a,tuple},[])), + ?line {'EXIT', {badarg, [{dets,open_file,[{a,tuple}]}|_]}} = + (catch dets:open_file({a,tuple})), + ?line {'EXIT', {badarg, [{dets,open_file,[file,[foo]]}|_]}} = + (catch dets:open_file(file,[foo])), + ?line {'EXIT', {badarg,[{dets,open_file,[{hej,san},[{type,set}|3]]}|_]}} = + (catch dets:open_file({hej,san},[{type,set}|3])), + + %% insert + ?line {'EXIT', {badarg, [{dets,insert,[no_table,{1,2}]}|_]}} = + (catch dets:insert(no_table, {1,2})), + ?line {'EXIT', {badarg, [{dets,insert,[no_table,[{1,2}]]}|_]}} = + (catch dets:insert(no_table, [{1,2}])), + ?line {'EXIT', {badarg, [{dets,insert,[T,{1,2}]}|_]}} = + (catch dets:insert(T, {1,2})), + ?line {'EXIT', {badarg, [{dets,insert,[T,[{1,2}]]}|_]}} = + (catch dets:insert(T, [{1,2}])), + ?line {'EXIT', {badarg, [{dets,insert,[T,[{1,2,3}|3]]}|_]}} = + (catch dets:insert(T, [{1,2,3} | 3])), + + %% lookup{_keys} + ?line {'EXIT', {badarg, [{dets,lookup_keys,[badarg,[]]}|_]}} = + (catch dets:lookup_keys(T, [])), + ?line {'EXIT', {badarg, [{dets,lookup,[no_table,1]}|_]}} = + (catch dets:lookup(no_table, 1)), + ?line {'EXIT', {badarg, [{dets,lookup_keys,[T,[1|2]]}|_]}} = + (catch dets:lookup_keys(T, [1 | 2])), + + %% member + ?line {'EXIT', {badarg, [{dets,member,[no_table,1]}|_]}} = + (catch dets:member(no_table, 1)), + + %% sync + ?line {'EXIT', {badarg, [{dets,sync,[no_table]}|_]}} = + (catch dets:sync(no_table)), + + %% delete{_keys} + ?line {'EXIT', {badarg, [{dets,delete,[no_table,1]}|_]}} = + (catch dets:delete(no_table, 1)), + + %% delete_object + ?line {'EXIT', {badarg, [{dets,delete_object,[no_table,{1,2,3}]}|_]}} = + (catch dets:delete_object(no_table, {1,2,3})), + ?line {'EXIT', {badarg, [{dets,delete_object,[T,{1,2}]}|_]}} = + (catch dets:delete_object(T, {1,2})), + ?line {'EXIT', {badarg, [{dets,delete_object,[no_table,[{1,2,3}]]}|_]}} = + (catch dets:delete_object(no_table, [{1,2,3}])), + ?line {'EXIT', {badarg, [{dets,delete_object,[T,[{1,2}]]}|_]}} = + (catch dets:delete_object(T, [{1,2}])), + ?line {'EXIT', {badarg, [{dets,delete_object,[T,[{1,2,3}|3]]}|_]}} = + (catch dets:delete_object(T, [{1,2,3} | 3])), + + %% first,next,slot + ?line {'EXIT', {badarg, [{dets,first,[no_table]}|_]}} = + (catch dets:first(no_table)), + ?line {'EXIT', {badarg, [{dets,next,[no_table,1]}|_]}} = + (catch dets:next(no_table, 1)), + ?line {'EXIT', {badarg, [{dets,slot,[no_table,0]}|_]}} = + (catch dets:slot(no_table, 0)), + + %% info + ?line undefined = dets:info(no_table), + ?line undefined = dets:info(no_table, foo), + ?line undefined = dets:info(T, foo), + + %% match_delete + ?line {'EXIT', {badarg, [{dets,safe_fixtable,[no_table,true]}|_]}} = + (catch dets:match_delete(no_table, '_')), + + %% delete_all_objects + ?line {'EXIT', {badarg, [{dets,delete_all_objects,[no_table]}|_]}} = + (catch dets:delete_all_objects(no_table)), + + %% select_delete + MSpec = [{'_',[],['$_']}], + ?line {'EXIT', {badarg, [{dets,safe_fixtable,[no_table,true]}|_]}} = + (catch dets:select_delete(no_table, MSpec)), + ?line {'EXIT', {badarg, [{dets,select_delete,[T, <<17>>]}|_]}} = + (catch dets:select_delete(T, <<17>>)), + + %% traverse, fold + ?line {'EXIT', {badarg, [{dets,safe_fixtable,[no_table,true]}|_]}} = + (catch dets:traverse(no_table, fun(_) -> continue end)), + ?line {'EXIT', {badarg, [{dets,safe_fixtable,[no_table,true]}|_]}} = + (catch dets:foldl(fun(_, A) -> A end, [], no_table)), + ?line {'EXIT', {badarg, [{dets,safe_fixtable,[no_table,true]}|_]}} = + (catch dets:foldr(fun(_, A) -> A end, [], no_table)), + + %% close + ?line ok = dets:close(T), + ?line {error, not_owner} = dets:close(T), + ?line {error, not_owner} = dets:close(T), + + %% init_table + ?line {'EXIT', {badarg,[{dets,init_table,[no_table,_,[]]}|_]}} = + (catch dets:init_table(no_table, fun(X) -> X end)), + ?line {'EXIT', {badarg,[{dets,init_table,[no_table,_,[]]}|_]}} = + (catch dets:init_table(no_table, fun(X) -> X end, [])), + + %% from_ets + Ets = ets:new(ets,[]), + ?line {'EXIT', {badarg,[{dets,from_ets,[no_table,_]}|_]}} = + (catch dets:from_ets(no_table, Ets)), + ets:delete(Ets), + + ?line {ok, T} = dets:open_file(T, Args), + ?line {error,incompatible_arguments} = + dets:open_file(T, [{type,bag} | Args]), + ?line ok = dets:close(T), + + file:delete(Fname), + ?line check_pps(P0), + ok. + +cache_sets_v8(doc) -> + ["Test the write cache for sets."]; +cache_sets_v8(suite) -> + []; +cache_sets_v8(Config) when is_list(Config) -> + cache_sets(Config, 8). + +cache_sets_v9(doc) -> + ["Test the write cache for sets."]; +cache_sets_v9(suite) -> + []; +cache_sets_v9(Config) when is_list(Config) -> + cache_sets(Config, 9). + +cache_sets(Config, Version) -> + Small = 2, + cache_sets(Config, {0,0}, false, Small, Version), + cache_sets(Config, {0,0}, true, Small, Version), + cache_sets(Config, {5000,5000}, false, Small, Version), + cache_sets(Config, {5000,5000}, true, Small, Version), + %% Objects of size greater than 2 kB. + Big = 1200, + cache_sets(Config, {0,0}, false, Big, Version), + cache_sets(Config, {0,0}, true, Big, Version), + cache_sets(Config, {5000,5000}, false, Big, Version), + cache_sets(Config, {5000,5000}, true, Big, Version), + ok. + +cache_sets(Config, DelayedWrite, Extra, Sz, Version) -> + %% Extra = bool(). Insert tuples until the tested key is not alone. + %% Sz = integer(). Size of the inserted tuples. + + T = cache, + ?line Fname = filename(cache, Config), + ?line file:delete(Fname), + P0 = pps(), + + ?line {ok, _} = + dets:open_file(T,[{version, Version}, {file,Fname}, {type,set}, + {delayed_write, DelayedWrite}]), + + Dups = 1, + {Key, OtherKeys} = + if + Extra -> + %% Insert enough to get three keys in some slot. + ?line dets:safe_fixtable(T, true), + insert_objs(T, 1, Sz, Dups); + true -> + {1,[]} + end, + Tuple = erlang:make_tuple(Sz, Key), + ?line ok = dets:delete(T, Key), + ?line ok = dets:sync(T), + + %% The values of keys in the same slot as Key are checked. + ?line OtherValues = sort(lookup_keys(T, OtherKeys)), + + ?line ok = dets:insert(T, Tuple), + ?line [Tuple] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + ?line ok = dets:insert(T, [Tuple,Tuple]), + %% If no delay, the cache gets filled immediately, and written. + ?line [Tuple] = dets:lookup_keys(T, [Key,a,b,c,d,e,f]), + ?line true = dets:member(T, Key), + + %% If delay, this happens without file access. + ?line ok = dets:delete(T,Key), + ?line ok = dets:insert(T,Tuple), + ?line ok = dets:insert(T,Tuple), + ?line [Tuple] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + ?line ok = dets:sync(T), + ?line [Tuple] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + + %% Key's objects are is on file only, + %% key 'toto' in the cache (if there is one). + ?line ok = dets:delete(T,toto), + ?line ok = dets:insert(T,[{toto,b},{toto,b}]), + ?line true = sort([Tuple,{toto,b}]) =:= + sort(dets:lookup_keys(T, [Key,toto])), + ?line true = dets:member(T, toto), + + ?line ok = dets:delete(T, Key), + ?line ok = dets:sync(T), + ?line false = dets:member(T, Key), + ?line Size = dets:info(T, size), + + %% No object with the key on the file. + %% Delete, add one object. + Size1 = Size + 2, + del_and_ins(key, T, Size1, Tuple, Key, 1), + del_and_ins(object, T, Size1, Tuple, Key, 1), + del_and_ins(both, T, Size1, Tuple, Key, 1), + + %% One object with the key on the file. + %% Delete it, add one object. + Size2 = Size + 2, + del_and_ins(key, T, Size2, Tuple, Key, 1), + del_and_ins(object, T, Size2, Tuple, Key, 1), + del_and_ins(both, T, Size2, Tuple, Key, 1), + + %% Overwrite an old objekt with exactly the same size. + Element = case element(2, Tuple) of + 255 -> 254; + E -> E + 1 + end, + Tuple2 = setelement(2, Tuple, Element), + ?line ok = dets:sync(T), + ?line ok = dets:insert(T, Tuple2), + ?line [Tuple2] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + ?line ok = dets:sync(T), + ?line [Tuple2] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + + ?line ok = dets:insert(T, {3,a}), + ?line ok = dets:insert(T, {3,b}), + ?line ok = dets:delete_object(T, {3,c}), + ?line ok = dets:delete_object(T, {3,d}), + ?line [{3,b}] = dets:lookup(T, 3), + + ?line ok = dets:delete(T, 3), + ?line ok = dets:delete_object(T, {3,c}), + ?line ok = dets:delete_object(T, {3,d}), + ?line [] = dets:lookup(T, 3), + + ?line OtherValues = sort(lookup_keys(T, OtherKeys)), + if + Extra -> + %% Let the table grow a while, if it needs to. + ?line All1 = get_all_objects(T), + ?line dets:safe_fixtable(T, false), + ?line timer:sleep(1000), + ?line OtherValues = sort(lookup_keys(T, OtherKeys)), + ?line dets:safe_fixtable(T, true), + ?line All2 = get_all_objects(T), + ?line FAll2 = get_all_objects_fast(T), + ?line true = sort(All2) =:= sort(FAll2), + case symdiff(All1, All2) of + {[],[]} -> ok; + {X,Y} -> + NoBad = length(X) + length(Y), + test_server:fail({sets,DelayedWrite,Extra,Sz,NoBad}) + end; + true -> + ok + end, + ?line ok = dets:close(T), + + file:delete(Fname), + ?line check_pps(P0), + ok. + +cache_bags_v8(doc) -> + ["Test the write cache for bags."]; +cache_bags_v8(suite) -> + []; +cache_bags_v8(Config) when is_list(Config) -> + cache_bags(Config, 8). + +cache_bags_v9(doc) -> + ["Test the write cache for bags."]; +cache_bags_v9(suite) -> + []; +cache_bags_v9(Config) when is_list(Config) -> + cache_bags(Config, 9). + +cache_bags(Config, Version) -> + Small = 2, + cache_bags(Config, {0,0}, false, Small, Version), + cache_bags(Config, {0,0}, true, Small, Version), + cache_bags(Config, {5000,5000}, false, Small, Version), + cache_bags(Config, {5000,5000}, true, Small, Version), + %% Objects of size greater than 2 kB. + Big = 1200, + cache_bags(Config, {0,0}, false, Big, Version), + cache_bags(Config, {0,0}, true, Big, Version), + cache_bags(Config, {5000,5000}, false, Big, Version), + cache_bags(Config, {5000,5000}, true, Big, Version), + ok. + +cache_bags(Config, DelayedWrite, Extra, Sz, Version) -> + %% Extra = bool(). Insert tuples until the tested key is not alone. + %% Sz = integer(). Size of the inserted tuples. + + T = cache, + ?line Fname = filename(cache, Config), + ?line file:delete(Fname), + P0 = pps(), + + ?line {ok, _} = + dets:open_file(T,[{version, Version}, {file,Fname}, {type,bag}, + {delayed_write, DelayedWrite}]), + + Dups = 1, + {Key, OtherKeys} = + if + Extra -> + %% Insert enough to get three keys in some slot. + ?line dets:safe_fixtable(T, true), + insert_objs(T, 1, Sz, Dups); + true -> + {1,[]} + end, + Tuple = erlang:make_tuple(Sz, Key), + ?line ok = dets:delete(T, Key), + ?line ok = dets:sync(T), + + %% The values of keys in the same slot as Key are checked. + ?line OtherValues = sort(lookup_keys(T, OtherKeys)), + + ?line ok = dets:insert(T, Tuple), + ?line [Tuple] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + ?line ok = dets:insert(T, [Tuple,Tuple]), + %% If no delay, the cache gets filled immediately, and written. + ?line [Tuple] = dets:lookup_keys(T, [Key,a,b,c,d,e,f]), + ?line true = dets:member(T, Key), + + %% If delay, this happens without file access. + %% (This is no longer true; cache lookup has been simplified.) + ?line ok = dets:delete(T,Key), + ?line ok = dets:insert(T,Tuple), + ?line ok = dets:insert(T,Tuple), + ?line [Tuple] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + ?line ok = dets:sync(T), + ?line [Tuple] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + + %% Key's objects are is on file only, + %% key toto in the cache (if there is one). + ?line ok = dets:delete(T,toto), + ?line false = dets:member(T, toto), + ?line ok = dets:insert(T,[{toto,b},{toto,b}]), + ?line true = sort([Tuple,{toto,b}]) =:= + sort(dets:lookup_keys(T, [Key,toto])), + ?line true = dets:member(T, toto), + + ?line ok = dets:delete(T, Key), + ?line ok = dets:sync(T), + ?line Size = dets:info(T, size), + + %% No object with the key on the file. + %% Delete, add one object. + Size1 = Size + 2, + del_and_ins(key, T, Size1, Tuple, Key, 1), + del_and_ins(object, T, Size1, Tuple, Key, 1), + del_and_ins(both, T, Size1, Tuple, Key, 1), + + %% One object with the key on the file. + %% Delete it, add one object. + Size2 = Size + 2, + del_and_ins(key, T, Size2, Tuple, Key, 1), + del_and_ins(object, T, Size2, Tuple, Key, 1), + del_and_ins(both, T, Size2, Tuple, Key, 1), + + %% Overwrite an objekt on file with the same object. + ?line ok = dets:insert(T, Tuple), + ?line ok = dets:sync(T), + ?line [Tuple2] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + ?line ok = dets:insert(T, Tuple), + ?line ok = dets:sync(T), + ?line [Tuple2] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + + %% A mix of insert and delete. + ?line ok = dets:delete(T, Key), + ?line ok = dets:sync(T), + ?line ok = dets:delete(T, Key), + ?line ok = dets:insert(T, {Key,foo}), + ?line ok = dets:insert(T, {Key,bar}), + ?line [{Key,bar},{Key,foo}] = sort(dets:lookup(T, Key)), + ?line true = dets:member(T, Key), + ?line ok = dets:delete_object(T, {Key,foo}), + ?line ok = dets:insert(T, {Key,kar}), + ?line [{Key,bar},{Key,kar}] = sort(dets:lookup(T, Key)), + ?line true = dets:member(T, Key), + ?line ok = dets:insert(T, [{Key,kar},{Key,kar}]), + ?line [{Key,bar},{Key,kar}] = sort(dets:lookup(T, Key)), + ?line true = dets:member(T, Key), + ?line ok = dets:delete_object(T, {Key,bar}), + ?line ok = dets:delete_object(T, {Key,kar}), + ?line [] = dets:lookup(T, Key), + ?line false = dets:member(T, Key), + ?line ok = dets:sync(T), + ?line [] = dets:lookup(T, Key), + ?line false = dets:member(T, Key), + + ?line OtherValues = sort(lookup_keys(T, OtherKeys)), + if + Extra -> + %% Let the table grow for a while, if it needs to. + ?line All1 = get_all_objects(T), + ?line dets:safe_fixtable(T, false), + ?line timer:sleep(1200), + ?line OtherValues = sort(lookup_keys(T, OtherKeys)), + ?line dets:safe_fixtable(T, true), + ?line All2 = get_all_objects(T), + ?line FAll2 = get_all_objects_fast(T), + ?line true = sort(All2) =:= sort(FAll2), + case symdiff(All1, All2) of + {[],[]} -> ok; + {X,Y} -> + NoBad = length(X) + length(Y), + test_server:fail({bags,DelayedWrite,Extra,Sz,NoBad}) + end; + true -> + ok + end, + ?line ok = dets:close(T), + file:delete(Fname), + + %% Second object of a key added and looked up simultaneously. + R1 = {index_test,1,2,3,4}, + R2 = {index_test,2,2,13,14}, + R3 = {index_test,1,12,13,14}, + ?line {ok, _} = dets:open_file(T,[{version,Version},{type,bag}, + {keypos,2},{file,Fname}]), + ?line ok = dets:insert(T,R1), + ?line ok = dets:sync(T), + ?line ok = dets:insert(T,R2), + ?line ok = dets:sync(T), + ?line ok = dets:insert(T,R3), + ?line [R1,R3] = sort(dets:lookup(T,1)), + ?line true = dets:member(T, 1), + ?line [R1,R3] = sort(dets:lookup(T,1)), + ?line true = dets:member(T, 1), + ?line ok = dets:close(T), + file:delete(Fname), + + ?line check_pps(P0), + ok. + +cache_duplicate_bags_v8(doc) -> + ["Test the write cache for duplicate bags."]; +cache_duplicate_bags_v8(suite) -> + []; +cache_duplicate_bags_v8(Config) when is_list(Config) -> + cache_duplicate_bags(Config, 8). + +cache_duplicate_bags_v9(doc) -> + ["Test the write cache for duplicate bags."]; +cache_duplicate_bags_v9(suite) -> + []; +cache_duplicate_bags_v9(Config) when is_list(Config) -> + cache_duplicate_bags(Config, 9). + +cache_duplicate_bags(Config, Version) -> + Small = 2, + cache_dup_bags(Config, {0,0}, false, Small, Version), + cache_dup_bags(Config, {0,0}, true, Small, Version), + cache_dup_bags(Config, {5000,5000}, false, Small, Version), + cache_dup_bags(Config, {5000,5000}, true, Small, Version), + %% Objects of size greater than 2 kB. + Big = 1200, + cache_dup_bags(Config, {0,0}, false, Big, Version), + cache_dup_bags(Config, {0,0}, true, Big, Version), + cache_dup_bags(Config, {5000,5000}, false, Big, Version), + cache_dup_bags(Config, {5000,5000}, true, Big, Version). + +cache_dup_bags(Config, DelayedWrite, Extra, Sz, Version) -> + %% Extra = bool(). Insert tuples until the tested key is not alone. + %% Sz = integer(). Size of the inserted tuples. + + T = cache, + ?line Fname = filename(cache, Config), + ?line file:delete(Fname), + P0 = pps(), + + ?line {ok, _} = + dets:open_file(T,[{version, Version}, {file,Fname}, + {type,duplicate_bag}, + {delayed_write, DelayedWrite}]), + + Dups = 2, + {Key, OtherKeys} = + if + Extra -> + %% Insert enough to get three keys in some slot. + ?line dets:safe_fixtable(T, true), + insert_objs(T, 1, Sz, Dups); + true -> + {1,[]} + end, + Tuple = erlang:make_tuple(Sz, Key), + ?line ok = dets:delete(T, Key), + ?line ok = dets:sync(T), + ?line false = dets:member(T, Key), + + %% The values of keys in the same slot as Key are checked. + ?line OtherValues = sort(lookup_keys(T, OtherKeys)), + + ?line ok = dets:insert(T, Tuple), + ?line [Tuple] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + ?line ok = dets:insert(T, [Tuple,Tuple]), + %% If no delay, the cache gets filled immediately, and written. + ?line [Tuple,Tuple,Tuple] = dets:lookup_keys(T, [Key,a,b,c,d,e,f]), + ?line true = dets:member(T, Key), + + %% If delay, this happens without file access. + %% (This is no longer true; cache lookup has been simplified.) + ?line ok = dets:delete(T,Key), + ?line ok = dets:insert(T,Tuple), + ?line ok = dets:insert(T,Tuple), + ?line [Tuple,Tuple] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + ?line ok = dets:sync(T), + ?line [Tuple,Tuple] = dets:lookup(T, Key), + ?line true = dets:member(T, Key), + + %% One object in the cache, one on the file. + ?line ok = dets:delete(T,Key), + ?line ok = dets:insert(T,Tuple), + ?line ok = dets:sync(T), + ?line ok = dets:insert(T,Tuple), + ?line true = dets:member(T, Key), % should not read the file, but it does.. + + %% Key's objects are is on file only, + %% key toto in the cache (if there is one). + ?line ok = dets:delete(T,toto), + ?line ok = dets:insert(T,[{toto,b},{toto,b}]), + ?line true = sort([Tuple,Tuple,{toto,b},{toto,b}]) =:= + sort(dets:lookup_keys(T, [Key,toto])), + ?line true = dets:member(T, toto), + ?line Size = dets:info(T, size), + + %% Two objects with the same key on the file. + %% Delete them, add two objects. + del_and_ins(key, T, Size, Tuple, Key, 2), + + del_and_ins(object, T, Size, Tuple, Key, 2), + del_and_ins(both, T, Size, Tuple, Key, 2), + + %% Two objects with the same key on the file. + %% Delete them, add three objects. + del_and_ins(key, T, Size, Tuple, Key, 3), + del_and_ins(object, T, Size, Tuple, Key, 3), + del_and_ins(both, T, Size, Tuple, Key, 3), + + %% Two objects with the same key on the file. + %% Delete them, add one object. + del_and_ins(key, T, Size, Tuple, Key, 1), + del_and_ins(object, T, Size, Tuple, Key, 1), + del_and_ins(both, T, Size, Tuple, Key, 1), + + ?line OtherValues = sort(lookup_keys(T, OtherKeys)), + if + Extra -> + %% Let the table grow for a while, if it needs to. + ?line All1 = get_all_objects(T), + ?line dets:safe_fixtable(T, false), + ?line timer:sleep(1200), + ?line OtherValues = sort(lookup_keys(T, OtherKeys)), + ?line dets:safe_fixtable(T, true), + ?line All2 = get_all_objects(T), + ?line FAll2 = get_all_objects_fast(T), + ?line true = sort(All2) =:= sort(FAll2), + case symdiff(All1, All2) of + {[],[]} -> ok; + {X,Y} -> + NoBad = length(X) + length(Y), + test_server:fail({dup_bags,DelayedWrite,Extra,Sz,NoBad}) + end; + true -> + ok + end, + ?line ok = dets:close(T), + + file:delete(Fname), + ?line check_pps(P0), + ok. + +lookup_keys(_T, []) -> + []; +lookup_keys(T, Keys) -> + dets:lookup_keys(T, Keys). + +del_and_ins(W, T, Size, Obj, Key, N) -> + case W of + object -> + ?line ok = dets:delete_object(T, Obj); + key -> + + ?line ok = dets:delete(T, Key); + both -> + ?line ok = dets:delete(T, Key), + ?line ok = dets:delete_object(T, Obj) + end, + Objs = duplicate(N, Obj), + ?line [] = dets:lookup(T, Key), + ?line ok = dets:insert(T, Objs), + ?line Objs = dets:lookup_keys(T, [snurrespratt,Key]), + ?line true = Size + length(Objs)-2 =:= dets:info(T, size), + ?line Objs = dets:lookup(T, Key). + + +insert_objs(T, N, Sz, Dups) -> + Seq = seq(N,N+255), + L0 = map(fun(I) -> erlang:make_tuple(Sz, I) end, Seq), + L = append(duplicate(Dups, L0)), + ?line ok = dets:insert(T, L), + ?line case search_slot(T, 0) of + false -> + insert_objs(T, N+256, Sz, Dups); + Keys -> + Keys + end. + +search_slot(T, I) -> + ?line case dets:slot(T, I) of + '$end_of_table' -> + false; + Objs -> + case usort(map(fun(X) -> element(1, X) end, Objs)) of + [_, Key, _ | _] = Keys0 -> + Keys = delete(Key, Keys0), + {Key, Keys}; + _ -> + search_slot(T, I+1) + end + end. + +symdiff(L1, L2) -> + {X, _, Y} = + sofs:symmetric_partition(sofs:set(L1), sofs:set(L2)), + {sofs:to_external(X), sofs:to_external(Y)}. + +otp_4208(doc) -> + ["Read only table and traversal caused crash."]; +otp_4208(suite) -> + []; +otp_4208(Config) when is_list(Config) -> + Tab = otp_4208, + ?line FName = filename(Tab, Config), + Expected = sort([{3,ghi,12},{1,abc,10},{4,jkl,13},{2,def,11}]), + + file:delete(FName), + ?line {ok, Tab} = dets:open_file(Tab, [{file,FName}]), + ?line ok = dets:insert(Tab, [{1,abc,10},{2,def,11},{3,ghi,12},{4,jkl,13}]), + ?line Expected = sort(dets:traverse(Tab, fun(X) -> {continue, X} end)), + ?line ok = dets:close(Tab), + + ?line {ok, Tab} = dets:open_file(Tab, [{access, read},{file,FName}]), + ?line Expected = sort(dets:traverse(Tab, fun(X) -> {continue, X} end)), + ?line ok = dets:close(Tab), + file:delete(FName), + + ok. + +otp_4989(doc) -> + ["Read only table and growth."]; +otp_4989(suite) -> + []; +otp_4989(Config) when is_list(Config) -> + Tab = otp_4989, + ?line FName = filename(Tab, Config), + + %% Do exactly as in the error report. + ?line _Ets = ets:new(Tab, [named_table]), + ets_init(Tab, 100000), + ?line {ok, Tab} = + dets:open_file(Tab, [{access, read_write}, {file,FName}, {keypos,2}]), + ?line ok = dets:from_ets(Tab, Tab), + ?line ok = dets:close(Tab), + %% Restore. + ?line {ok, Tab} = + dets:open_file(Tab, [{access, read}, {keypos, 2}, {file, FName}]), + ?line true = ets:delete_all_objects(Tab), + ?line true = ets:from_dets(Tab, Tab), + ?line ok = dets:close(Tab), + ets:delete(Tab), + file:delete(FName), + ok. + +ets_init(_Tab, 0) -> + ok; +ets_init(Tab, N) -> + ets:insert(Tab, {N,N}), + ets_init(Tab, N - 1). + +many_clients(doc) -> + ["Several clients accessing a table simultaneously."]; +many_clients(suite) -> + []; +many_clients(Config) when is_list(Config) -> + Tab = many_clients, + ?line FName = filename(Tab, Config), + + Server = self(), + + ?line file:delete(FName), + P0 = pps(), + ?line {ok, _} = dets:open_file(Tab,[{file, FName},{version,9}]), + ?line [P1,P2,P3,P4] = new_clients(4, Tab), + + %% dets:init_table/2 is used for making sure that all processes + %% start sending requests before the Dets process begins to handle + %% them; the requests arrive "in parallel". + + %% Four processes accessing the same table at almost the same time. + + %% One key is read, updated, and read again. + Seq1 = [{P1,[{lookup,1,[{1,a}]}]}, {P2,[{insert,{1,b}}]}, + {P3,[{lookup,1,[{1,b}]}]}, {P4,[{lookup,1,[{1,b}]}]}], + ?line atomic_requests(Server, Tab, [[{1,a}]], Seq1), + ?line true = get_replies([{P1,ok}, {P2,ok}, {P3,ok}, {P4,ok}]), + + %% Different keys read by different processes + Seq2 = [{P1,[{member,1,true}]}, {P2,[{lookup,2,[{2,b}]}]}, + {P3,[{lookup,1,[{1,a}]}]}, {P4,[{lookup,3,[{3,c}]}]}], + ?line atomic_requests(Server, Tab, [[{1,a},{2,b},{3,c}]], Seq2), + ?line true = get_replies([{P1,ok}, {P2,ok}, {P3,ok}, {P4,ok}]), + + %% Reading deleted key. + Seq3 = [{P1,[{delete_key,2}]}, {P2,[{lookup,1,[{1,a}]}]}, + {P3,[{lookup,1,[{1,a}]}]}, {P4,[{member,2,false}]}], + ?line atomic_requests(Server, Tab, [[{1,a},{2,b},{3,c}]], Seq3), + ?line true = get_replies([{P1,ok}, {P2,ok}, {P3,ok}, {P4,ok}]), + + %% Inserting objects. + Seq4 = [{P1,[{insert,[{1,a},{2,b}]}]}, {P2,[{insert,[{2,c},{3,a}]}]}, + {P3,[{insert,[{3,b},{4,d}]}]}, + {P4,[{lookup_keys,[1,2,3,4],[{1,a},{2,c},{3,b},{4,d}]}]}], + ?line atomic_requests(Server, Tab, [], Seq4), + ?line true = get_replies([{P1,ok}, {P2,ok}, {P3,ok}, {P4,ok}]), + + %% Deleting objects. + Seq5 = [{P1,[{delete_object,{1,a}}]}, {P2,[{delete_object,{1,a}}]}, + {P3,[{delete_object,{3,c}}]}, + {P4,[{lookup_keys,[1,2,3,4],[{2,b}]}]}], + ?line atomic_requests(Server, Tab, [[{1,a},{2,b},{3,c}]], Seq5), + ?line true = get_replies([{P1,ok}, {P2,ok}, {P3,ok}, {P4,ok}]), + + %% Some request not streamed. + Seq6 = [{P1,[{lookup,1,[{1,a}]}]}, {P2,[{info,size,3}]}, + {P3,[{lookup,1,[{1,a}]}]}, {P4,[{info,size,3}]}], + ?line atomic_requests(Server, Tab, [[{1,a},{2,b},{3,c}]], Seq6), + ?line true = get_replies([{P1,ok}, {P2,ok}, {P3,ok}, {P4,ok}]), + + %% Some request not streamed. + Seq7 = [{P1,[{insert,[{3,a}]}]}, {P2,[{insert,[{3,b}]}]}, + {P3,[{delete_object,{3,c}}]}, + {P4,[{lookup,3,[{3,b}]}]}], + ?line atomic_requests(Server, Tab, [[{3,c}]], Seq7), + ?line true = get_replies([{P1,ok}, {P2,ok}, {P3,ok}, {P4,ok}]), + + ?line put_requests(Server, [{P1,stop},{P2,stop},{P3,stop},{P4,stop}]), + ?line ok = dets:close(Tab), + ?line file:delete(FName), + + %% Check that errors are handled correctly by the streaming operators. + ?line {ok, _} = dets:open_file(Tab,[{file, FName},{version,9}]), + ?line ok = ins(Tab, 100), + Obj = {66,{item,number,66}}, + ?line {ok, ObjPos} = dets:where(Tab, Obj), + ?line ok = dets:close(Tab), + %% Damaged object. + crash(FName, ObjPos+12), + ?line {ok, _} = dets:open_file(Tab,[{file, FName},{version,9}]), + ?line BadObject1 = dets:lookup_keys(Tab, [65,66,67,68,69]), + ?line bad_object(BadObject1, FName), + ?line _Error = dets:close(Tab), + ?line file:delete(FName), + + ?line check_pps(P0), + + ok. + +%% Tab is initiated with the objects in Objs. Objs = [[object()]]. +atomic_requests(Server, Tab, Objs, Req) -> + ok = dets:init_table(Tab, atomic_requests(Server, Objs, Req)). + +atomic_requests(Server, L, Req) -> + fun(close) -> + ok; + (read) when [] =:= L -> + put_requests(Server, Req), + end_of_input; + (read) -> + [E | Es] = L, + {E, atomic_requests(Server, Es, Req)} + end. + +put_requests(Server, L) -> + lists:foreach(fun({Pid,R}) -> Pid ! {Server,R}, timer:sleep(1) end, L). + +get_replies(L) -> + lists:all(fun({Pid,Reply}) -> Reply =:= get_reply(Pid) end, L). + +get_reply(Pid) -> + ?line receive {Pid, Reply} -> Reply end. + +new_clients(0, _Tab) -> + []; +new_clients(N, Tab) -> + [new_client(Tab) | new_clients(N-1, Tab)]. + +new_client(Tab) -> + spawn(?MODULE, client, [self(), Tab]). + +client(S, Tab) -> + receive + {S, stop} -> + exit(normal); + {S, ToDo} -> + ?line Reply = eval(ToDo, Tab), + case Reply of + {error, _} -> io:format("~p: ~p~n", [self(), Reply]); + _ -> ok + end, + S ! {self(), Reply} + end, + client(S, Tab). + +eval([], _Tab) -> + ok; +eval([sync | L], Tab) -> + ?line case dets:sync(Tab) of + ok -> eval(L, Tab); + Error -> {error, {sync,Error}} + end; +eval([{insert,Stuff} | L], Tab) -> + ?line case dets:insert(Tab, Stuff) of + ok -> eval(L, Tab); + Error -> {error, {insert,Stuff,Error}} + end; +eval([{lookup,Key,Expected} | L], Tab) -> + ?line case dets:lookup(Tab, Key) of + Expected -> eval(L, Tab); + Else -> {error, {lookup,Key,Expected,Else}} + end; +eval([{lookup_keys,Keys,Expected} | L], Tab) -> + %% Time order is destroyed... + ?line case dets:lookup_keys(Tab, Keys) of + R when is_list(R) -> + case lists:sort(Expected) =:= lists:sort(R) of + true -> eval(L, Tab); + false -> {error, {lookup_keys,Keys,Expected,R}} + end; + Else -> {error, {lookup_keys,Keys,Expected,Else}} + end; +eval([{member,Key,Expected} | L], Tab) -> + ?line case dets:member(Tab, Key) of + Expected -> eval(L, Tab); + Else -> {error, {member,Key,Expected,Else}} + end; +eval([{delete_key,Key} | L], Tab) -> + ?line case dets:delete(Tab, Key) of + ok -> eval(L, Tab); + Else -> {error, {delete_key,Key,Else}} + end; +eval([{delete_object,Object} | L], Tab) -> + ?line case dets:delete_object(Tab, Object) of + ok -> eval(L, Tab); + Else -> {error, {delete_object,Object,Else}} + end; +eval([{info,Tag,Expected} | L], Tab) -> + ?line case dets:info(Tab, Tag) of + Expected -> eval(L, Tab); + Else -> {error, {info,Tag,Else,Expected}} + end; +eval(Else, _Tab) -> + {error, {bad_request,Else}}. + +otp_4906(doc) -> + ["More than 128k keys caused crash."]; +otp_4906(suite) -> + []; +otp_4906(Config) when is_list(Config) -> + N = 256*512 + 400, + Tab = otp_4906, + ?line FName = filename(Tab, Config), + + file:delete(FName), + ?line {ok, Tab} = dets:open_file(Tab, [{file, FName}]), + ?line ok = ins_small(Tab, 0, N), + ?line ok = dets:close(Tab), + ?line {ok, Tab} = dets:open_file(Tab, [{file, FName}]), + ?line ok = read_4906(Tab, N-1), + ?line ok = dets:close(Tab), + file:delete(FName), + + %% If the (only) process fixing a table updates the table, the + %% process will no longer be punished with a 1 ms delay (hm, the + %% server is delayed, it should be the client...). In this example + %% the writing process *is* delayed. + ?line {ok,Tab} = dets:open_file(Tab, [{file,FName}]), + Parent = self(), + FixPid = spawn_link(fun() -> + dets:safe_fixtable(Tab, true), + receive {Parent, stop} -> ok end + end), + ?line ok = ins_small(Tab, 0, 1000), + FixPid ! {Parent, stop}, + timer:sleep(1), + ?line ok = dets:close(Tab), + file:delete(FName), + ok. + +read_4906(_T, N) when N < 0 -> + ok; +read_4906(T, N) -> + ?line [_] = dets:lookup(T, N), + read_4906(T, N-1). + +ins_small(_T, I, N) when I =:= N -> + ok; +ins_small(T, I, N) -> + ?line ok = dets:insert(T, {I}), + ins_small(T, I+1, N). + +otp_5402(doc) -> + ["Unwritable ramfile caused krasch."]; +otp_5402(suite) -> + []; +otp_5402(Config) when is_list(Config) -> + Tab = otp_5402, + ?line File = filename:join([cannot, write, this, file]), + + %% close + ?line{ok, T} = dets:open_file(Tab, [{ram_file,true}, + {file, File}]), + ?line ok = dets:insert(T, {1,a}), + ?line {error,{file_error,_,_}} = dets:close(T), + + %% sync + ?line {ok, T} = dets:open_file(Tab, [{ram_file,true}, + {file, File}]), + ?line ok = dets:insert(T, {1,a}), + ?line {error,{file_error,_,_}} = dets:sync(T), + ?line {error,{file_error,_,_}} = dets:close(T), + + %% auto_save + ?line {ok, T} = dets:open_file(Tab, [{ram_file,true}, + {auto_save, 2000}, + {file, File}]), + ?line ok = dets:insert(T, {1,a}), + ?line timer:sleep(5000), + ?line {error,{file_error,_,_}} = dets:close(T), + ok. + +simultaneous_open(doc) -> + ["Several clients open and close tables simultaneously."]; +simultaneous_open(suite) -> + []; +simultaneous_open(Config) -> + Tab = sim_open, + File = filename(Tab, Config), + + ?line ok = monit(Tab, File), + ?line ok = kill_while_repairing(Tab, File), + ?line ok = kill_while_init(Tab, File), + ?line ok = open_ro(Tab, File), + ?line ok = open_w(Tab, File, 0, Config), + ?line ok = open_w(Tab, File, 100, Config), + ok. + +%% One process logs and another process closes the log. Before +%% monitors were used, this would make the client never return. +monit(Tab, File) -> + file:delete(File), + {ok, Tab} = dets:open_file(Tab, [{file,File}]), + F1 = fun() -> dets:close(Tab) end, + F2 = fun() -> {'EXIT', {badarg, _}} = do_log(Tab) end, + spawn(F2), + timer:sleep(100), + spawn(F1), + dets:close(Tab), + file:delete(File), + ok. + +do_log(Tab) -> + case catch dets:insert(Tab, {hej,san,sa}) of + ok -> do_log(Tab); + Else -> Else + end. + +%% Kill the Dets process while repair is in progress. +kill_while_repairing(Tab, File) -> + ?line create_opened_log(File), + Delay = 1000, + dets:start(), + Parent = self(), + Ps = processes(), + F = fun() -> + R = (catch dets:open_file(Tab, [{file,File}])), + timer:sleep(Delay), + Parent ! {self(), R} + end, + ?line P1 = spawn(F), % will repair + timer:sleep(100), + ?line P2 = spawn(F), % pending... + ?line P3 = spawn(F), % pending... + ?line DetsPid = find_dets_pid([P1, P2, P3 | Ps]), + exit(DetsPid, kill), + + ?line receive {P1,R1} -> {'EXIT', {dets_process_died, _}} = R1 end, + ?line receive {P2,R2} -> {ok, _} = R2 end, + ?line receive {P3,R3} -> {ok, _} = R3 end, + + timer:sleep(200), + case dets:info(Tab) of + undefined -> + ok; + _Info -> + timer:sleep(5000), + ?line undefined = dets:info(Tab) + end, + + file:delete(File), + ok. + +find_dets_pid(P0) -> + case lists:sort(processes() -- P0) of + [P, _] -> P; + _ -> timer:sleep(100), find_dets_pid(P0) + end. + +%% Kill the Dets process when there are users and an on-going +%% initiailization. +kill_while_init(Tab, File) -> + file:delete(File), + Parent = self(), + F = fun() -> + R = dets:open_file(Tab, [{file,File}]), + Parent ! {self(), R}, + receive {Parent, die} -> ok end, + {error, not_owner} = dets:close(Tab) + end, + ?line P1 = spawn(F), + ?line P2 = spawn(F), + ?line P3 = spawn(F), + IF = fun() -> + R = dets:open_file(Tab, [{file,File}]), + Parent ! {self(), R}, + Fun = fun(_) -> timer:sleep(100000) end, + {'EXIT', {badarg, _}} = (catch dets:init_table(Tab, Fun)), + receive {Parent, die} -> ok end + end, + ?line P4 = spawn(IF), + ?line receive {P1,R1} -> {ok, _} = R1 end, + ?line receive {P2,R2} -> {ok, _} = R2 end, + ?line receive {P3,R3} -> {ok, _} = R3 end, + ?line receive {P4,R4} -> {ok, _} = R4 end, + ?line [DetsPid] = + lists:filter(fun(P) -> dets:pid2name(P) =/= undefined end, + erlang:processes()), + exit(DetsPid, kill), + + timer:sleep(1000), + ?line undefined = dets:info(Tab), + ?line P1 ! {Parent, die}, + ?line P2 ! {Parent, die}, + ?line P3 ! {Parent, die}, + ?line P4 ! {Parent, die}, + + file:delete(File), + timer:sleep(100), + ok. + +open_ro(Tab, File) -> + ?line create_opened_log(File), + Delay = 1000, + Parent = self(), + F = fun() -> + R = dets:open_file(Tab, [{file,File},{access,read}]), + timer:sleep(Delay), + Parent ! {self(), R} + end, + ?line P1 = spawn(F), + ?line P2 = spawn(F), + ?line P3 = spawn(F), + + ?line receive {P1,R1} -> {error,{not_closed,_}} = R1 end, + ?line receive {P2,R2} -> {error,{not_closed,_}} = R2 end, + ?line receive {P3,R3} -> {error,{not_closed,_}} = R3 end, + ok. + +open_w(Tab, File, Delay, Config) -> + ?line create_opened_log(File), + Parent = self(), + F = fun() -> + R = dets:open_file(Tab, [{file,File}]), + timer:sleep(Delay), + Parent ! {self(), R} + end, + ?line Pid1 = spawn(F), + ?line Pid2 = spawn(F), + ?line Pid3 = spawn(F), + ?line undefined = dets:info(Tab), % is repairing now + ?line 0 = qlen(), + + Tab2 = t2, + File2 = filename(Tab2, Config), + ?line file:delete(File2), + ?line {ok,Tab2} = dets:open_file(Tab2, [{file,File2}]), + ?line ok = dets:close(Tab2), + ?line file:delete(File2), + ?line 0 = qlen(), % still repairing + + ?line receive {Pid1,R1} -> {ok, Tab} = R1 end, + ?line receive {Pid2,R2} -> {ok, Tab} = R2 end, + ?line receive {Pid3,R3} -> {ok, Tab} = R3 end, + timer:sleep(200), + case dets:info(Tab) of + undefined -> + ok; + _Info -> + timer:sleep(5000), + ?line undefined = dets:info(Tab) + end, + + file:delete(File), + ok. + +qlen() -> + {_, {_, N}} = lists:keysearch(message_queue_len, 1, process_info(self())), + N. + +create_opened_log(File) -> + Tab = t, + file:delete(File), + ?line {ok, Tab} = dets:open_file(Tab, [{file,File}]), + ?line ok = ins(Tab, 60000), + ?line ok = dets:close(Tab), + ?line crash(File, ?CLOSED_PROPERLY_POS+3, ?NOT_PROPERLY_CLOSED), + ok. + +insert_new(doc) -> + ["OTP-5075. insert_new/2"]; +insert_new(suite) -> + []; +insert_new(Config) -> + Tab = insert_new, + File = filename(Tab, Config), + file:delete(File), + ?line {ok, T} = dets:open_file(Tab, [{file,File}]), + ?line {'EXIT', {badarg, _}} = (catch dets:insert_new(Tab, 14)), + ?line {'EXIT', {badarg, _}} = (catch dets:insert_new(Tab, {})), + ?line true = dets:insert_new(Tab, {1,a}), + ?line false = dets:insert_new(Tab, {1,a}), + ?line true = dets:insert_new(Tab, [{2,b}, {3,c}]), + ?line false = dets:insert_new(Tab, [{2,b}, {3,c}]), + ?line false = dets:insert_new(Tab, [{1,a}, {4,d}]), + ?line ok = dets:close(Tab), + + file:delete(File), + ?line {ok, T} = dets:open_file(Tab, [{file,File},{type,bag}]), + ?line true = dets:insert_new(Tab, {1,a}), + ?line false = dets:insert_new(Tab, {1,b}), + ?line true = dets:insert_new(Tab, [{2,b}, {3,c}]), + ?line false = dets:insert_new(Tab, [{2,a}, {3,d}]), + ?line false = dets:insert_new(Tab, [{1,a}, {4,d}]), + ?line ok = dets:close(Tab), + + + file:delete(File), + ok. + +repair_continuation(doc) -> + ["OTP-5126. repair_continuation/2"]; +repair_continuation(suite) -> + []; +repair_continuation(Config) -> + Tab = repair_continuation_table, + ?line Fname = filename(repair_cont, Config), + ?line file:delete(Fname), + ?line {ok, _} = dets:open_file(Tab, [{file,Fname}]), + ?line ok = dets:insert(Tab, [{1,a},{2,b},{3,c}]), + + ?line MS = [{'_',[],[true]}], + + ?line {[true], C1} = dets:select(Tab, MS, 1), + ?line C2 = binary_to_term(term_to_binary(C1)), + ?line {'EXIT', {badarg, _}} = (catch dets:select(C2)), + ?line C3 = dets:repair_continuation(C2, MS), + ?line {[true], C4} = dets:select(C3), + ?line C5 = dets:repair_continuation(C4, MS), + ?line {[true], _} = dets:select(C5), + ?line {'EXIT', {badarg, _}} = (catch dets:repair_continuation(Tab, bu)), + + ?line ok = dets:close(Tab), + ?line file:delete(Fname), + ok. + +otp_5487(doc) -> + ["OTP-5487. Growth of read-only table (again)."]; +otp_5487(suite) -> + []; +otp_5487(Config) -> + otp_5487(Config, 9), + otp_5487(Config, 8), + ok. + +otp_5487(Config, Version) -> + Tab = otp_5487, + ?line Fname = filename(otp_5487, Config), + ?line file:delete(Fname), + ?line Ets = ets:new(otp_5487, [public, set]), + ?line lists:foreach(fun(I) -> ets:insert(Ets, {I,I+1}) end, + lists:seq(0,1000)), + ?line {ok, _} = dets:open_file(Tab, [{file,Fname},{version,Version}]), + ?line ok = dets:from_ets(Tab, Ets), + ?line ok = dets:sync(Tab), + ?line ok = dets:close(Tab), + ?line {ok, _} = dets:open_file(Tab, [{file,Fname},{access,read}]), + ?line [{1,2}] = dets:lookup(Tab, 1), + ?line ok = dets:close(Tab), + ?line ets:delete(Ets), + ?line file:delete(Fname). + +otp_6206(doc) -> + ["OTP-6206. Badly formed free lists."]; +otp_6206(suite) -> + []; +otp_6206(Config) -> + Tab = otp_6206, + File = filename(Tab, Config), + + file:delete(File), + Options = [{file,File}], + ?line {ok, Tab} = dets:open_file(Tab, Options), + NObjs = 13006, + ?line ok = ins(Tab, NObjs), + ?line ok = del(Tab, NObjs, 2), + ?line ok = dets:close(Tab), + + %% Used to return {badmatch,{error,{bad_freelists,File}}. + ?line {ok, Tab} = dets:open_file(Tab, [{repair,false}|Options]), + ?line ok = dets:close(Tab), + file:delete(File), + ok. + +otp_6359(doc) -> + ["OTP-6359. select and match never return the empty list."]; +otp_6359(suite) -> + []; +otp_6359(Config) -> + Tab = otp_6359, + File = filename(Tab, Config), + + file:delete(File), + ?line {ok, _} = dets:open_file(Tab, [{file, File}]), + %% Used to return {[], Cont}: + ?line '$end_of_table' = dets:match(Tab, '_', 100), + ?line ok = dets:close(Tab), + file:delete(File), + ok. + +otp_4738(doc) -> + ["OTP-4738. ==/2 and =:=/2."]; +otp_4738(suite) -> + []; +otp_4738(Config) -> + %% Version 8 has not been corrected. + %% (The constant -12857447 is for version 9 only.) + otp_4738_set(9, Config), + otp_4738_bag(9, Config), + otp_4738_dupbag(9, Config), + ok. + +otp_4738_dupbag(Version, Config) -> + Tab = otp_4738, + File = filename(Tab, Config), + file:delete(File), + I = -12857447, + F = float(I), + One = 1, + FOne = float(One), + Args = [{file,File},{type,duplicate_bag},{version,Version}], + ?line {ok, Tab} = dets:open_file(Tab, Args), + ?line ok = dets:insert(Tab, [{I,One},{F,One},{I,FOne},{F,FOne}]), + ?line ok = dets:sync(Tab), + ?line [{F,One},{F,FOne}] = dets:lookup(Tab, F), + ?line [{I,One},{I,FOne}] = dets:lookup(Tab, I), + ?line ok = dets:insert(Tab, [{F,One},{F,FOne}]), + ?line [{I,One},{I,FOne},{F,One},{F,FOne},{F,One},{F,FOne}] = + dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:insert(Tab, [{F,FOne},{F,One}]), + ?line [{I,One},{I,FOne},{F,One},{F,FOne},{F,One}, + {F,FOne},{F,FOne},{F,One}] = + dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:delete_object(Tab, {I,FOne}), + ?line [{I,One},{F,One},{F,FOne},{F,One},{F,FOne},{F,FOne},{F,One}] = + dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:insert(Tab, {I,FOne}), + ?line [{I,One},{I,FOne},{F,One},{F,FOne},{F,One}, + {F,FOne},{F,FOne},{F,One}] = + dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:delete_object(Tab, {F,FOne}), + ?line [{I,One},{I,FOne},{F,One},{F,One},{F,One}] = + dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:delete(Tab, F), + ?line [{I,One},{I,FOne}] = dets:match_object(Tab, '_'), + ?line ok = dets:close(Tab), + file:delete(File), + + Zero = 0, + FZero = float(Zero), + ?line {ok, Tab} = dets:open_file(Tab, Args), + ?line ok = dets:insert(Tab, [{I,One},{F,One},{I,FOne},{F,FOne}]), + ?line ok = dets:insert(Tab, [{I,One},{F,One},{I,FOne},{F,FOne}]), + ?line ok = dets:insert(Tab, [{I,Zero},{F,Zero},{I,FZero},{I,FZero}]), + ?line Objs0 = dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:close(Tab), + crash(File, ?CLOSED_PROPERLY_POS+3, ?NOT_PROPERLY_CLOSED), + io:format("Expect repair:~n"), + ?line {ok, Tab} = dets:open_file(Tab, Args), + ?line Objs1 = dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:close(Tab), + ?line Objs1 = Objs0, + file:delete(File), + ok. + +otp_4738_bag(Version, Config) -> + Tab = otp_4738, + File = filename(Tab, Config), + file:delete(File), + I = -12857447, + F = float(I), + One = 1, + FOne = float(One), + Args = [{file,File},{type,bag},{version,Version}], + ?line {ok, Tab} = dets:open_file(Tab, Args), + ?line ok = dets:insert(Tab, [{I,One},{F,One},{I,FOne},{F,FOne}]), + ?line ok = dets:sync(Tab), + ?line [{F,One},{F,FOne}] = dets:lookup(Tab, F), + ?line [{I,One},{I,FOne}] = dets:lookup(Tab, I), + ?line ok = dets:insert(Tab, [{F,One},{F,FOne}]), + ?line [{I,One},{I,FOne},{F,One},{F,FOne}] = + dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:insert(Tab, [{F,FOne},{F,One}]), + ?line [{I,One},{I,FOne},{F,FOne},{F,One}] = + dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:delete_object(Tab, {I,FOne}), + ?line [{I,One},{F,FOne},{F,One}] = + dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:insert(Tab, {I,FOne}), + ?line [{I,One},{I,FOne},{F,FOne},{F,One}] = + dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:delete(Tab, F), + ?line [{I,One},{I,FOne}] = dets:match_object(Tab, '_'), + ?line ok = dets:close(Tab), + file:delete(File). + +otp_4738_set(Version, Config) -> + Tab = otp_4738, + File = filename(Tab, Config), + file:delete(File), + Args = [{file,File},{type,set},{version,Version}], + + %% I and F share the same slot. + I = -12857447, + F = float(I), + ?line {ok, Tab} = dets:open_file(Tab, Args), + ?line ok = dets:insert(Tab, [{I},{F}]), + ?line ok = dets:sync(Tab), + ?line [{F}] = dets:lookup(Tab, F), + ?line [{I}] = dets:lookup(Tab, I), + ?line ok = dets:insert(Tab, [{F}]), + ?line [{I},{F}] = dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:close(Tab), + file:delete(File), + + ?line {ok, Tab} = dets:open_file(Tab, Args), + ?line ok = dets:insert(Tab, [{I}]), + ?line ok = dets:sync(Tab), + ?line [] = dets:lookup(Tab, F), + ?line [{I}] = dets:lookup(Tab, I), + ?line ok = dets:insert(Tab, [{F}]), + ?line [{I},{F}] = dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:close(Tab), + file:delete(File), + + ?line {ok, Tab} = dets:open_file(Tab, Args), + ok = dets:insert(Tab, [{I},{F}]), + %% {insert, ...} in the cache, try lookup: + ?line [{F}] = dets:lookup(Tab, F), + ?line [{I}] = dets:lookup(Tab, I), + %% Both were found, but that cannot be verified. + ?line [{I},{F}] = dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:close(Tab), + file:delete(File), + + ?line {ok, Tab} = dets:open_file(Tab, Args), + ?line ok = dets:insert(Tab, [{I}]), + ?line ok = dets:sync(Tab), + ?line ok = dets:insert(Tab, [{F}]), + %% {insert, ...} in the cache, try lookup: + ?line [{F}] = dets:lookup(Tab, F), + ?line [{I}] = dets:lookup(Tab, I), + ?line [{I},{F}] = dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:close(Tab), + file:delete(File), + + ?line {ok, Tab} = dets:open_file(Tab, Args), + %% Both operations in the cache: + ?line ok = dets:insert(Tab, [{I}]), + ?line ok = dets:insert(Tab, [{F}]), + ?line [{I},{F}] = dets_utils:mkeysort(1, dets:match_object(Tab, '_')), + ?line ok = dets:close(Tab), + file:delete(File), + ok. + +otp_7146(doc) -> + ["OTP-7146. Bugfix: missing test when re-hashing."]; +otp_7146(suite) -> + []; +otp_7146(Config) -> + Tab = otp_7146, + File = filename(Tab, Config), + file:delete(File), + + Max = 2048, + ?line {ok, Tab} = dets:open_file(Tab, [{max_no_slots,Max}, {file,File}]), + write_dets(Tab, Max), + ?line ok = dets:close(Tab), + + file:delete(File), + ok. + +write_dets(Tab, Max) -> + write_dets(Tab, 0, Max). + +write_dets(_Tab, N, Max) when N > Max -> + ok; +write_dets(Tab, N, Max) -> + ok = dets:insert(Tab,{ N, {entry,N}}), + write_dets(Tab, N+1, Max). + +otp_8070(doc) -> + ["OTP-8070. Duplicated objects with insert_new() and duplicate_bag."]; +otp_8070(suite) -> + []; +otp_8070(Config) when is_list(Config) -> + Tab = otp_8070, + File = filename(Tab, Config), + file:delete(File), + ?line {ok, _} = dets:open_file(Tab, [{file,File},{type, duplicate_bag}]), + ?line ok = dets:insert(Tab, [{3,0}]), + ?line false = dets:insert_new(Tab, [{3,1},{3,1}]), + ?line [{3,0}] = dets:lookup(Tab, 3), + ?line ok = dets:close(Tab), + file:delete(File), + ok. + +%% +%% Parts common to several test cases +%% + +crash(File, Where) -> + crash(File, Where, 10). + +crash(File, Where, What) when is_integer(What) -> + ?line {ok, Fd} = file:open(File, read_write), + ?line file:position(Fd, Where), + ?line ok = file:write(Fd, [What]), + ?line ok = file:close(Fd). + +args(Config) -> + {Sets, Bags, Dups} = + {[ + [], + [{type, set}, {estimated_no_objects, 300}, + {ram_file, true}], + [{type, set}, {estimated_no_objects, 300}], + [{type, set}, {estimated_no_objects, 300}], + [{auto_save,20}, {type, set}, + {estimated_no_objects, 300}] + ], + + [ + [{type, bag}, {estimated_no_objects, 300}, {ram_file, true}], + [{type, bag}], + [{type, bag}, {estimated_no_objects, 300}], + [{type, bag}, {estimated_no_objects, 300}], + [{type, bag}, + {auto_save,20}, {estimated_no_objects, 300}], + [{type, bag}, {estimated_no_objects, 300}, {ram_file, true}] + ], + + [ + [{type, duplicate_bag}, {estimated_no_objects, 300}, + {ram_file, true}], + [{type, duplicate_bag}], + [{type, duplicate_bag}, {estimated_no_objects, 300}], + [{type, duplicate_bag}, {estimated_no_objects, 300}], + [{type, duplicate_bag}, + {auto_save,20}, {estimated_no_objects, 300}], + [{type, duplicate_bag}, {estimated_no_objects, 300}, + {ram_file, true}] + ] + }, + zip_filename(Sets, Bags, Dups, Config). + +zip_filename(S, B, D, Conf) -> + zip_filename(S, B, D, [], [], [], 1, Conf). + +zip_filename([H|T], B, D, S1, B1, D1, I, Conf) -> + zip_filename(T, B, D, [[{file, new_filename(I, Conf)} | H] | S1], + B1, D1, I+1, Conf); +zip_filename([], [H|B], D, S1, B1, D1, I, Conf) -> + zip_filename([], B, D, S1, [[{file, new_filename(I, Conf)} | H] | B1], + D1, I+1, Conf); +zip_filename([], [], [H|T], S1, B1, D1, I, Conf) -> + zip_filename([], [], T, S1, B1, [[{file, new_filename(I, Conf)} | H] | D1], + I+1, Conf); +zip_filename([], [], [], S1, B1, D1, _, _Conf) -> + {reverse(S1), reverse(B1), reverse(D1)}. + +del_test(Tab) -> + ?format("Deltest on ~p~n", [Tab]), + ?line Objs = safe_get_all_objects(Tab), + ?line Keys = map(fun(X) -> element(1, X) end, Objs), + ?line foreach(fun(Key) -> dets:delete(Tab, Key) end, Keys), + ?line 0 = length(get_all_objects(Tab)), + ?line [] = get_all_objects_fast(Tab), + ?line 0 = dets:info(Tab, size). + +del_obj_test(Tab) -> + ?format("Delobjtest on ~p~n", [Tab]), + ?line Objs = safe_get_all_objects(Tab), + ?line LL = length(Objs), + ?line LL = dets:info(Tab, size), + ?line foreach(fun(Obj) -> dets:delete_object(Tab, Obj) end, Objs), + ?line 0 = length(get_all_objects(Tab)), + ?line [] = get_all_objects_fast(Tab), + ?line 0 = dets:info(Tab, size). + +match_del_test(Tab) -> + ?line ?format("Match delete test on ~p~n", [Tab]), + ?line ok = dets:match_delete(Tab, {'_','_','_'}), + ?line Sz = dets:info(Tab, size), + ?line true = Sz =:= length(dets:match_object(Tab, '_')), + ?line ok = dets:match_delete(Tab, '_'), + ?line 0 = dets:info(Tab, size), + ?line 0 = length(get_all_objects(Tab)), + ?line [] = get_all_objects_fast(Tab). + +trav_test(_Data, Len, Tab) -> + ?format("Travtest on ~p~n", [Tab]), + ?line _X0 = dets:traverse(Tab, fun(_X) -> continue end), + ?line XX = dets:traverse(Tab, fun(X) -> {continue, X} end), + ?line case Len =:= length(XX) of + false -> ?format("DIFF ~p~n", [XX -- _Data]); + true -> ok + end, + ?line 1 = length(dets:traverse(Tab, fun(X) -> {done, X} end)). + +match_test(Data, Tab) -> + ?line ?format("Match test on ~p~n", [Tab]), + ?line Data1 = sort(filter(fun(X) when tuple_size(X) =:= 3 -> true; + (_X) -> false + end, Data)), + ?line Data1 = sort(dets:match_object(Tab, {'$1', '$2', '$3'})), + + ?line Len = length(Data), + ?line Len = length(dets:match(Tab, '_')), + ?line Len2 = length(Data1), + ?line Len2 = length(dets:match(Tab, {'$1', '_', '_'})), + + ?line Data3 = + filter(fun(X) -> + K = element(1, X), + if + tuple_size(X) =:= 3, tuple_size(K) =:= 2 -> true; + true -> false + end + end, Data), + ?line Len3 = length(Data3), + ?line Len3 = length(dets:match(Tab, {{'$1', '$2'}, '_', '_'})), + ?line Len3 = length(dets:match_object(Tab, {{'$1', '$2'}, '_', '_'})), + + ?line R = make_ref(), + ?line dets:insert(Tab, {{R, R}, 33 ,44}), + ?line 1 = length(dets:match(Tab, {{R, R}, '_', '_'})), + ?line 1 = length(dets:match_object(Tab, {{R, R}, '_', '_'})). + +%% +%% Utilities +%% + +headsz(8) -> + ?HEADSZ_v8; +headsz(_) -> + ?HEADSZ_v9. + +unwritable(Fname) -> + ?line {ok, Info} = file:read_file_info(Fname), + Mode = Info#file_info.mode - 8#00200, + ?line file:write_file_info(Fname, Info#file_info{mode = Mode}). + +writable(Fname) -> + ?line {ok, Info} = file:read_file_info(Fname), + Mode = Info#file_info.mode bor 8#00200, + ?line file:write_file_info(Fname, Info#file_info{mode = Mode}). + +truncate(File, Where) -> + ?line {ok, Fd} = file:open(File, read_write), + ?line file:position(Fd, Where), + ?line ok = file:truncate(Fd), + ?line ok = file:close(Fd). + +new_filename(Name, _Config) when is_integer(Name) -> + filename:join(?privdir(_Config), + integer_to_list(Name) ++ ".DETS"). + +filename(Name, Config) when is_atom(Name) -> + filename(atom_to_list(Name), Config); +filename(Name, _Config) -> + filename:join(?privdir(_Config), Name). + +open_files(_Name, [], _Version) -> + []; +open_files(Name0, [Args | Tail], Version) -> + ?format("init ~p~n", [Args]), + ?line Name = list_to_atom(integer_to_list(Name0)), + ?line {ok, Name} = dets:open_file(Name, [{version,Version} | Args]), + [Name | open_files(Name0+1, Tail, Version)]. + +close_all(Tabs) -> foreach(fun(Tab) -> ok = dets:close(Tab) end, Tabs). + +delete_files(Args) -> + Fun = fun(F) -> + {value, {file, File}} = keysearch(file, 1, F), + file:delete(File), + File + end, + map(Fun, Args). + +%% Initialize all tables +initialize(Tabs, Data) -> + ?line foreach(fun(Tab) -> + Fun = fun(Obj) -> ok = dets:insert(Tab, Obj) end, + foreach(Fun, Data), + dets:sync(Tab) + end, Tabs). + +%% need more than 512 objects to really trig overflow +make_data(Kp) -> + make_data(Kp, set). + +make_data(Kp, Type) -> + dup(Type, make_data(Kp, Type, 520)). + +dup(duplicate_bag, [H1, H2 |T]) -> + [H1,H2, H1, H2 | dup(duplicate_bag, T)]; +dup(_, Other) -> + Other. + +make_data(_Kp, Type, 0) -> + odd_keys(Type); +make_data(1, set, I) -> + [{I, q,w} | make_data(1, set, I-1)]; +make_data(2, set, I) -> + [{hh, I, q,w} | make_data(2, set, I-1)]; +make_data(1, bag, I) -> + [{I, q,w} , {I, hah, 77} | make_data(1, bag, I-1)]; +make_data(2, bag, I) -> + [{hh, I, q,w} , {hh, I, lalal, 900} | make_data(2, bag, I-1)]; +make_data(1, duplicate_bag, I) -> + [{I, q,w} , {I, hah, 77} | make_data(1, duplicate_bag, I-1)]; +make_data(2, duplicate_bag, I) -> + [{hh, I, q,w} , {hh, I, lalal, 900} | make_data(2, duplicate_bag, I-1)]. + +odd_keys(_) -> + [{foo, 1 ,2}, + {{foo, foo}, 2,3}, + {"kakaka", {{{}}}, jj}, + {{"kallll", "kkk", []}, 66.7777}, + {make_ref(), 99, 66}, + {{1},2,3,4,5,6,7,duplicate(50, 8)}, + {self(), 7,8,88}, + {[self()], 8, 11}]. + + +ins(_T, 0) -> + ok; +ins(T, N) -> + case dets:insert(T, {N, item(N)}) of + ok -> ins(T, N-1); + Error -> Error + end. + +item(N) when N rem 2 =:= 0 -> + {item, number, N}; +item(N) -> + {item, number, N, a, much, bigger, one, i, think}. + +del(_T, N, _I) when N =< 0 -> + ok; +del(T, N, I) -> + ok = dets:delete(T, N), + del(T, N-I, I). + +ensure_node(0, _Node) -> + could_not_start_node; +ensure_node(N, Node) -> + case net_adm:ping(Node) of + pang -> + receive after 1000 -> + ok + end, + ensure_node(N-1,Node); + pong -> + ok + end. + +size_test(Len, Tabs) -> + ?line foreach(fun(Tab) -> + Len = dets:info(Tab, size) + end, Tabs). + +no_keys_test([T | Ts]) -> + no_keys_test(T), + no_keys_test(Ts); +no_keys_test([]) -> + ok; +no_keys_test(T) -> + case dets:info(T, version) of + 8 -> + ok; + 9 -> + Kp = dets:info(T, keypos), + ?line All = dets:match_object(T, '_'), + ?line L = lists:map(fun(X) -> element(Kp, X) end, All), + ?line NoKeys = length(lists:usort(L)), + ?line case {dets:info(T, no_keys), NoKeys} of + {N, N} -> + ok; + {N1, N2} -> + exit({no_keys_test, N1, N2}) + end + end. + +safe_get_all_objects(Tab) -> + dets:safe_fixtable(Tab, true), + Objects = get_all_objects(Tab), + dets:safe_fixtable(Tab, false), + Objects. + +%% Caution: unless the table has been fixed, strange results can be returned. +get_all_objects(Tab) -> get_all_objects(dets:first(Tab), Tab, []). + +%% Assuming no key matches {error, Reason}... +get_all_objects('$end_of_table', _Tab, L) -> L; +get_all_objects({error, Reason}, _Tab, _L) -> + exit({get_all_objects, get(line), {error, Reason}}); +get_all_objects(Key, Tab, L) -> + Objs = dets:lookup(Tab, Key), + ?line get_all_objects(dets:next(Tab, Key), Tab, Objs ++ L). + +count_objects_quite_fast(Tab) -> + ?line R1 = dets:match_object(Tab, '_', 1), + count_objs_1(R1, 0). + +count_objs_1('$end_of_table', N) -> + N; +count_objs_1({Ts,C}, N) when is_list(Ts) -> + count_objs_1(dets:match_object(C), length(Ts) + N). + +get_all_objects_fast(Tab) -> + dets:match_object(Tab, '_'). + +%% Relevant for version 8. +histogram(Tab) -> + OnePercent = case dets:info(Tab, no_slots) of + undefined -> undefined; + {_, NoSlots, _} -> NoSlots/100 + end, + histogram(Tab, OnePercent). + +histogram(Tab, OnePercent) -> + ?line E = ets:new(histo, []), + ?line dets:safe_fixtable(Tab, true), + ?line Hist = histo(Tab, E, 0, OnePercent, OnePercent), + ?line dets:safe_fixtable(Tab, false), + ?line case Hist of + ok -> + ?line H = ets:tab2list(E), + ?line true = ets:delete(E), + sort(H); + Error -> + ets:delete(E), + Error + end. + +histo(T, E, I, One, Count) when is_number(Count), I > Count -> + io:format("."), + histo(T, E, I, One, Count+One); +histo(T, E, I, One, Count) -> + ?line case dets:slot(T, I) of + '$end_of_table' when is_number(Count) -> + io:format("~n"), + ok; + '$end_of_table' -> + ok; + Objs when is_list(Objs) -> + L = length(Objs), + case catch ets:update_counter(E, L, 1) of + {'EXIT', _} -> + ets:insert(E, {L, 1}); + _ -> + ok + end, + histo(T, E, I+1, One, Count); + Error -> + Error + end. + +sum_histogram(H) -> + sum_histogram(H, 0). + +sum_histogram([{S,N1} | H], N) -> + sum_histogram(H, N + S*N1); +sum_histogram([], N) -> + N. + +ave_histogram(H) -> + ave_histogram(H, 0)/sum_histogram(H). + +ave_histogram([{S,N1} | H], N) -> + ave_histogram(H, N + S*S*N1); +ave_histogram([], N) -> + N. + +bad_object({error,{bad_object,FileName}}, FileName) -> + ok; % Version 8, no debug. +bad_object({error,{{bad_object,_,_},FileName}}, FileName) -> + ok; % Version 8, debug... +bad_object({error,{{bad_object,_}, FileName}}, FileName) -> + ok; % No debug. +bad_object({error,{{{bad_object,_,_},_,_,_}, FileName}}, FileName) -> + ok. % Debug. + +check_pps(P0) -> + case pps() of + P0 -> + ok; + _ -> + %% On some (rare) occasions the dets process is still + %% running although the call to close() has returned, as + %% it seems... + timer:sleep(500), + case pps() of + P0 -> + ok; + P1 -> + io:format("failure, got ~p~n, expected ~p\n", [P1, P0]), + {Ports0,Procs0} = P0, + {Ports1,Procs1} = P1, + show("Old ports", Ports0 -- Ports1), + show("New ports", Ports1 -- Ports0), + show("Old procs", Procs0 -- Procs1), + show("New procs", Procs1 -- Procs0), + ?t:fail() + end + end. + +show(_S, []) -> + ok; +show(S, L) -> + io:format("~s: ~p~n", [S, L]). + +pps() -> + dets:start(), + {port_list(), process_list()}. + +port_list() -> + [{P,safe_second_element(erlang:port_info(P, name))} || + P <- erlang:ports()]. + +process_list() -> + [{P,process_info(P, registered_name), + safe_second_element(process_info(P, initial_call))} || + P <- processes()]. + +safe_second_element({_,Info}) -> Info; +safe_second_element(Other) -> Other. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/dict_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/dict_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/dict_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/dict_SUITE.erl 2009-11-20 13:32:40.000000000 +0000 @@ -0,0 +1,133 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% This module tests the ordsets, sets, and gb_sets modules. +%% + +-module(dict_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + create/1,store/1]). + +-include("test_server.hrl"). + +-import(lists, [foldl/3,reverse/1]). + +all(suite) -> + [create,store]. + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?t:minutes(5)), + [{watchdog,Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +create(Config) when is_list(Config) -> + test_all(fun create_1/1). + +create_1(M) -> + ?line D0 = M:empty(), + ?line [] = M:to_list(D0), + ?line 0 = M:size(D0), + D0. + +store(Config) when is_list(Config) -> + test_all([{0,132},{253,258},{510,514}], fun store_1/2). + +store_1(List, M) -> + ?line D0 = M:from_list(List), + + %% Make sure that we get the same result by inserting + %% elements one at the time. + ?line D1 = foldl(fun({K,V}, Dict) -> M:enter(K, V, Dict) end, + M:empty(), List), + ?line true = M:equal(D0, D1), + D0. + +%%% +%%% Helper functions. +%%% + +dict_mods() -> + Orddict = dict_test_lib:new(orddict, fun(X, Y) -> X == Y end), + Dict = dict_test_lib:new(dict, fun(X, Y) -> + lists:sort(dict:to_list(X)) == + lists:sort(dict:to_list(Y)) end), + Gb = dict_test_lib:new(gb_trees, fun(X, Y) -> + gb_trees:to_list(X) == + gb_trees:to_list(Y) end), + [Orddict,Dict,Gb]. + +test_all(Tester) -> + ?line Pids = [spawn_tester(M, Tester) || M <- dict_mods()], + collect_all(Pids, []). + +spawn_tester(M, Tester) -> + Parent = self(), + spawn_link(fun() -> + random:seed(1, 2, 42), + S = Tester(M), + Res = {M:size(S),lists:sort(M:to_list(S))}, + Parent ! {result,self(),Res} + end). + +collect_all([Pid|Pids], Acc) -> + receive + {result,Pid,Result} -> + collect_all(Pids, [Result|Acc]) + end; +collect_all([], Acc) -> + all_same(Acc). + +test_all(ListTemplate, Tester) -> + List = random_list(ListTemplate), + test_all(fun(M) -> Tester(List, M) end). + +all_same([H|T]) -> + all_same_1(T, H). + +all_same_1([H|T], H) -> + all_same_1(T, H); +all_same_1([], _) -> ok. + +rnd_list(Sz) -> + rnd_list_1(Sz, []). + +random_list([{Low,High}|T]) -> + random_list(lists:seq(Low, High)++T); +random_list([Sz|T]) when is_integer(Sz) -> + rnd_list(Sz)++random_list(T); +random_list([]) -> []. + +rnd_list_1(0, Acc) -> + Acc; +rnd_list_1(N, Acc) -> + Key = atomic_rnd_term(), + Value = random:uniform(100), + rnd_list_1(N-1, [{Key,Value}|Acc]). + +atomic_rnd_term() -> + case random:uniform(3) of + 1 -> list_to_atom(integer_to_list($\s+random:uniform(94))++"rnd"); + 2 -> random:uniform(); + 3 -> random:uniform(50)-37 + end. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/dict_test_lib.erl erlang-13.b.3-dfsg/lib/stdlib/test/dict_test_lib.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/dict_test_lib.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/dict_test_lib.erl 2009-11-20 13:32:40.000000000 +0000 @@ -0,0 +1,83 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(dict_test_lib, [Mod,Equal]). + +-export([module/0,equal/2,empty/0,size/1,to_list/1,from_list/1, + enter/3,delete/2,lookup/2]). + +module() -> + Mod. + +equal(X, Y) -> + Equal(X, Y). + +empty() -> + case erlang:function_exported(Mod, new, 0) of + false -> Mod:empty(); + true -> Mod:new() + end. + +size(S) -> + Mod:size(S). + +to_list(S) -> + Mod:to_list(S). + +from_list(S) -> + case erlang:function_exported(Mod, from_orddict, 1) of + false -> + Mod:from_list(S); + true -> + %% The gb_trees module has no from_list/1 function. + %% + %% The keys in S are not unique. To make sure + %% that we pick the same key/value pairs as + %% dict/orddict, first convert the list to an orddict. + Orddict = orddict:from_list(S), + Mod:from_orddict(Orddict) + end. + +%% Store new value into dictionary or update previous value in dictionary. +enter(Key, Val, Dict) -> + case erlang:function_exported(Mod, store, 3) of + false -> + Mod:enter(Key, Val, Dict); + true -> + Mod:store(Key, Val, Dict) + end. + +%% Delete an EXISTING key. +delete(Key, Dict) -> + case erlang:function_exported(Mod, delete, 2) of + true -> Mod:delete(Key, Dict); + false -> Mod:erase(Key, Dict) + end. + +%% -> none | {value,Value} +lookup(Key, Dict) -> + case erlang:function_exported(Mod, lookup, 2) of + false -> + case Mod:find(Key, Dict) of + error -> none; + {ok,Value} -> {value,Value} + end; + true -> + Mod:lookup(Key, Dict) + end. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/digraph_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/digraph_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/digraph_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/digraph_SUITE.erl 2009-09-18 15:07:25.000000000 +0100 @@ -0,0 +1,520 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(digraph_SUITE). + +%-define(STANDALONE,1). + +-ifdef(STANDALONE). +-define(line, put(line, ?LINE), ). +-else. +-include("test_server.hrl"). +-endif. + +-export([all/1]). + +-export([opts/1, degree/1, path/1, cycle/1, misc/1, vertices/1, + edges/1, data/1, tickets/1, otp_3522/1, otp_3630/1, otp_8066/1]). + +-export([spawn_graph/2]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +all(suite) -> {req, [stdlib], [opts, degree, path, cycle, misc, tickets]}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +opts(doc) -> []; +opts(suite) -> []; +opts(Config) when is_list(Config) -> + %% OTP-5985: the 'public' option has been removed + ?line {'EXIT',{badarg,_}} = (catch digraph:new([public])), + ?line {P2,G2} = spawn_graph([private]), + ?line {'EXIT',{badarg,_}} = (catch digraph:add_vertex(G2, x)), + ?line kill_graph(P2), + ?line {P3,G3} = spawn_graph([protected]), + ?line {'EXIT',{badarg,_}} = (catch digraph:add_vertex(G3, x)), + ?line kill_graph(P3), + ?line Template = [{v1,[v2]}, {v2,[v3]}, {v3,[v4]}, {v4,[]}], + ?line G4 = build_graph([], Template), + ?line e = digraph:add_edge(G4, e, v4, v1, []), + ?line digraph:delete(G4), + ?line G5 = build_graph([cyclic], Template), + ?line e = digraph:add_edge(G5, e, v4, v1, []), + ?line digraph:delete(G5), + ?line G6 = build_graph([acyclic], Template), + ?line acyclic = info(G6, cyclicity), + ?line {error, {bad_edge,_}} = digraph:add_edge(G6, v4, v1), + ?line digraph:delete(G6), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +degree(doc) -> []; +degree(suite) -> []; +degree(Config) when is_list(Config) -> + ?line G = build_graph([], [{x1,[]}, {x2,[x1]}, {x3,[x1,x2]}, + {x4,[x1,x2,x3]}, {x5,[x1,x2,x3,x4]}]), + %% out degree + ?line 0 = digraph:out_degree(G, x1), + ?line 1 = digraph:out_degree(G, x2), + ?line 2 = digraph:out_degree(G, x3), + ?line 3 = digraph:out_degree(G, x4), + ?line 4 = digraph:out_degree(G, x5), + %% out neighbours + ?line [] = check(digraph:out_neighbours(G, x1), []), + ?line [] = check(digraph:out_neighbours(G, x2), [x1]), + ?line [] = check(digraph:out_neighbours(G, x3), [x1,x2]), + ?line [] = check(digraph:out_neighbours(G, x4), [x1,x2,x3]), + ?line [] = check(digraph:out_neighbours(G, x5), [x1,x2,x3,x4]), + + %% in degree + ?line 4 = digraph:in_degree(G, x1), + ?line 3 = digraph:in_degree(G, x2), + ?line 2 = digraph:in_degree(G, x3), + ?line 1 = digraph:in_degree(G, x4), + ?line 0 = digraph:in_degree(G, x5), + %% in neighbours + ?line [] = check(digraph:in_neighbours(G, x1), [x2,x3,x4,x5]), + ?line [] = check(digraph:in_neighbours(G, x2), [x3,x4,x5]), + ?line [] = check(digraph:in_neighbours(G, x3), [x4,x5]), + ?line [] = check(digraph:in_neighbours(G, x4), [x5]), + ?line [] = check(digraph:in_neighbours(G, x5), []), + digraph:delete(G), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +path(doc) -> []; +path(suite) -> []; +path(Config) when is_list(Config) -> + ?line G = build_graph([], [{x1,[x2,x3]}, {x2,[x4]}, {x3,[x4]}, + {x4,[x5,x6]}, {x5,[x7]}, {x6,[x7]}]), + ?line Vi = case digraph:get_path(G, x1, x7) of + [x1,x2,x4,x5,x7] -> digraph:del_vertex(G, x5), x6; + [x1,x2,x4,x6,x7] -> digraph:del_vertex(G, x6), x5; + [x1,x3,x4,x5,x7] -> digraph:del_vertex(G, x5), x6; + [x1,x3,x4,x6,x7] -> digraph:del_vertex(G, x6), x5 + end, + ?line Vj = case digraph:get_path(G, x1, x7) of + [x1,x2,x4,Vi,x7] -> digraph:del_vertex(G,x2), x3; + [x1,x3,x4,Vi,x7] -> digraph:del_vertex(G,x3), x2 + end, + ?line [x1,Vj,x4,Vi,x7] = digraph:get_path(G, x1, x7), + ?line digraph:del_vertex(G, Vj), + ?line false = digraph:get_path(G, x1, x7), + ?line [] = check(digraph:vertices(G), [x1,x4,Vi,x7]), + digraph:delete(G), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +cycle(doc) -> []; +cycle(suite) -> []; +cycle(Config) when is_list(Config) -> + ?line G = build_graph([], [{x1,[x2,x3]}, {x2,[x4]}, {x3,[x4]}, + {x4,[x5,x6]}, {x5,[x7]}, {x6,[x7,x8]}, + {x8,[x3,x8]}]), + ?line false = digraph:get_cycle(G, x1), + ?line false = digraph:get_cycle(G, x2), + ?line false = digraph:get_cycle(G, x5), + ?line false = digraph:get_cycle(G, x7), + ?line [x3,x4,x6,x8,x3] = digraph:get_cycle(G, x3), + ?line [x4,x6,x8,x3,x4] = digraph:get_cycle(G, x4), + ?line [x6,x8,x3,x4,x6] = digraph:get_cycle(G, x6), + ?line [x8,x3,x4,x6,x8] = digraph:get_cycle(G, x8), + ?line digraph:del_vertex(G, x4), + ?line [x8] = digraph:get_cycle(G, x8), + digraph:delete(G), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +misc(suite) -> [vertices, edges, data]. + +vertices(doc) -> []; +vertices(suite) -> []; +vertices(Config) when is_list(Config) -> + ?line G = build_graph([], [{x,[]}, {y,[]}]), + ?line [] = check(digraph:vertices(G), [x,y]), + ?line digraph:del_vertices(G, [x,y]), + ?line [] = digraph:vertices(G), + ?line digraph:delete(G), + ok. + +edges(doc) -> []; +edges(suite) -> []; +edges(Config) when is_list(Config) -> + ?line G = build_graph([], [{x, [{exy,y},{exx,x}]}, + {y, [{eyx,x}]} + ]), + ?line [] = check(digraph:edges(G), [exy, eyx, exx]), + ?line [] = check(digraph:out_edges(G, x), [exy,exx]), + ?line [] = check(digraph:in_edges(G, x), [eyx,exx]), + ?line [] = check(digraph:out_edges(G, y), [eyx]), + ?line [] = check(digraph:in_edges(G, y), [exy]), + ?line true = digraph:del_edges(G, [exy, eyx, does_not_exist]), + ?line [exx] = digraph:edges(G), + ?line [] = check(digraph:out_edges(G, x), [exx]), + ?line [] = check(digraph:in_edges(G, x), [exx]), + ?line [] = check(digraph:out_edges(G, y), []), + ?line [] = check(digraph:in_edges(G, y), []), + ?line digraph:del_vertices(G, [x,y]), + ?line [] = digraph:edges(G), + ?line [] = digraph:vertices(G), + ?line digraph:delete(G), + ok. + +data(doc) -> []; +data(suite) -> []; +data(Config) when is_list(Config) -> + ?line G = build_graph([], [{x, [{exy, y}]}, {y, []}]), + + ?line {x,[]} = digraph:vertex(G, x), + ?line {y,[]} = digraph:vertex(G, y), + ?line {exy,x,y,[]} = digraph:edge(G, exy), + + ?line digraph:add_edge(G, exy, x, y, {data,x,y}), + ?line E = digraph:add_edge(G, x, y, {data,y,x}), + ?line digraph:add_vertex(G, x, {any}), + ?line digraph:add_vertex(G, y, '_'), + + ?line {x,{any}} = digraph:vertex(G, x), + ?line {y,'_'} = digraph:vertex(G, y), + ?line {exy,x,y,{data,x,y}} = digraph:edge(G, exy), + ?line {E,x,y,{data,y,x}} = digraph:edge(G, E), + ?line true = digraph:del_edge(G, E), + ?line false = digraph:edge(G, E), + ?line true = sane(G), + ?line digraph:delete(G), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +tickets(suite) -> [otp_3522, otp_3630, otp_8066]. + +otp_3522(doc) -> []; +otp_3522(suite) -> []; +otp_3522(Config) when is_list(Config) -> + ?line G1 = build_graph([acyclic], [{x, []}]), + ?line {error, {bad_edge,_}} = digraph:add_edge(G1, x, x), + ?line true = digraph:delete(G1), + + ?line G = digraph:new(), + ?line 0 = digraph:no_vertices(G), + ?line 0 = digraph:no_edges(G), + ?line V1 = digraph:add_vertex(G), + ?line '$vid' = digraph:add_vertex(G, '$vid'), + ?line V2 = digraph:add_vertex(G), + ?line '$eid' = digraph:add_edge(G, '$eid', V1, V2, []), + ?line E = digraph:add_edge(G, V1, V2), + ?line 3 = digraph:no_vertices(G), + ?line 2 = digraph:no_edges(G), + ?line cyclic = info(G, cyclicity), + ?line protected = info(G, protection), + + ?line [] = check(digraph:in_edges(G, V2), ['$eid', E]), + ?line [] = check(digraph:out_edges(G, V1), ['$eid', E]), + ?line [] = check(digraph:vertices(G), [V1,V2,'$vid']), + ?line [] = check(digraph:edges(G), [E, '$eid']), + ?line true = sane(G), + ?line true = digraph:delete(G), + ok. + +otp_3630(doc) -> []; +otp_3630(suite) -> []; +otp_3630(Config) when is_list(Config) -> + ?line G = build_graph([], [{x, [{exy,y},{exx,x}]}, + {y, [{eyy,y},{eyx,x}]} + ]), + ?line [x,y] = digraph:get_path(G, x, y), + ?line [y,x] = digraph:get_path(G, y, x), + + ?line [x,x] = digraph:get_short_path(G, x, x), + ?line [y,y] = digraph:get_short_path(G, y, y), + ?line true = digraph:delete(G), + + ?line G1 = build_graph([], [{1, [{12,2},{13,3},{11,1}]}, + {2, [{23,3}]}, + {3, [{34,4},{35,5}]}, + {4, [{45,5}]}, + {5, [{56,6},{57,7}]}, + {6, [{67,7}]}, + {7, [{71,1}]} + ]), + + ?line [1,3,5,7] = digraph:get_short_path(G1, 1, 7), + ?line [3,5,7,1,3] = digraph:get_short_cycle(G1, 3), + ?line [1,1] = digraph:get_short_cycle(G1, 1), + ?line true = digraph:delete(G1), + + F = 0.0, I = round(F), + ?line G2 = digraph:new([acyclic]), + ?line digraph:add_vertex(G2, F), + ?line digraph:add_vertex(G2, I), + ?line E = digraph:add_edge(G2, F, I), + ?line true = not is_tuple(E), + ?line true = sane(G2), + ?line true = digraph:delete(G2), + + ok. + +otp_8066(doc) -> []; +otp_8066(suite) -> []; +otp_8066(Config) when is_list(Config) -> + fun() -> + D = digraph:new(), + V1 = digraph:add_vertex(D), + V2 = digraph:add_vertex(D), + _ = digraph:add_edge(D, V1, V2), + ?line [V1, V2] = digraph:get_path(D, V1, V2), + ?line true = sane(D), + ?line true = digraph:del_path(D, V1, V2), + ?line true = sane(D), + ?line false = digraph:get_path(D, V1, V2), + ?line true = digraph:del_path(D, V1, V2), + ?line true = digraph:delete(D) + end(), + + fun() -> + D = digraph:new(), + V1 = digraph:add_vertex(D), + V2 = digraph:add_vertex(D), + _ = digraph:add_edge(D, V1, V2), + _ = digraph:add_edge(D, V1, V2), + _ = digraph:add_edge(D, V1, V1), + _ = digraph:add_edge(D, V2, V2), + ?line [V1, V2] = digraph:get_path(D, V1, V2), + ?line true = sane(D), + ?line true = digraph:del_path(D, V1, V2), + ?line false = digraph:get_short_path(D, V2, V1), + + ?line true = sane(D), + ?line false = digraph:get_path(D, V1, V2), + ?line true = digraph:del_path(D, V1, V2), + ?line true = digraph:delete(D) + end(), + + fun() -> + G = digraph:new(), + W1 = digraph:add_vertex(G), + W2 = digraph:add_vertex(G), + W3 = digraph:add_vertex(G), + W4 = digraph:add_vertex(G), + _ = digraph:add_edge(G,['$e'|0], W1, W2, {}), + ?line {error,{bad_vertex, bv}} = + digraph:add_edge(G, edge, bv, W1, {}), + ?line {error,{bad_vertex, bv}} = + digraph:add_edge(G, edge, W1, bv, {}), + ?line false = digraph:get_short_cycle(G, W1), + ?line {error, {bad_edge,_}} = + digraph:add_edge(G,['$e'|0], W3, W4, {}), + ?line true = sane(G), + ?line true = digraph:delete(G) + end(), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +sane(G) -> + sane1(G), + erase(sane) =:= undefined. + +sane1(G) -> + %% etab: {E, V1, V2, Label} + %% ntab: {{out,V},E} eller {{in,V},E} + %% vtab: {V,Label} + + Es = digraph:edges(G), + Vs = digraph:vertices(G), + VEs = lists:flatmap(fun(V) -> digraph:edges(G, V) end, Vs), + case lists:sort(Es++Es) =:= lists:sort(VEs) of + true -> ok; + false -> + io:format("Bad edges~n", []), put(sane, no) + end, + + lists:foreach( + fun(E) -> + Edge = {E, V1, V2, _L} = digraph:edge(G, E), + case {digraph:vertex(G, V1), digraph:vertex(G, V2)} of + {{V1, _}, {V2, _}} -> ok; + _ -> io:format("Missing vertex ~p~n", [Edge]), put(sane, no) + end, + In = digraph:in_edges(G, V2), + case lists:member(E, In) of + true -> ok; + false -> + io:format("Missing in-neighbour ~p~n", [Edge]), + put(sane, no) + end, + Out = digraph:out_edges(G, V1), + case lists:member(E, Out) of + true -> ok; + false -> + io:format("Missing out-neighbour ~p~n", [Edge]), + put(sane, no) + end + end, Es), + + lists:foreach( + fun(V) -> + InEs = digraph:in_edges(G, V), + %% Nu har man *alla* inkanter för V + lists:foreach( + fun(E) -> + case digraph:edge(G, E) of + {E, _, V, _} -> ok; + _ -> + io:format("Bad in-edge ~p: ~p~n", [V, E]), + put(sane, no) + end + end, InEs), + OutEs = digraph:out_edges(G, V), + lists:foreach( + fun(E) -> + case digraph:edge(G, E) of + {E, V, _, _} -> ok; + _ -> + io:format("Bad out-edge ~p: ~p~n", [V, E]), + put(sane, no) + end + end, OutEs) + end, Vs), + + InEs = lists:flatmap(fun(V) -> digraph:in_edges(G, V) end, Vs), + OutEs = lists:flatmap(fun(V) -> digraph:out_edges(G, V) end, Vs), + lists:foreach( + fun(E) -> + case digraph:edge(G, E) of + {E, _, _, _} -> ok; + _ -> + io:format("Unknown edge (neighbour) ~p~n", [E]), + put(sane, no) + end + end, InEs++OutEs), + + N_in = length(InEs), + N_out = length(OutEs), + N_edges = digraph:no_edges(G), + if + N_in =/= N_out -> + io:format("Number of in- and out-edges differs~n", []), + put(sane, no); + N_in+N_out =/= N_edges+N_edges -> + io:format("Invalid number of edges (~p+~p =/= 2*~p)~n", + [N_in, N_out, N_edges]), + put(sane, no); + true -> ok + end, + Edges = [digraph:edge(G, E) || E <- Es], + EVs = lists:usort([V || {_, V, _, _} <- Edges] ++ + [V || {_, _, V, _} <- Edges]), + lists:foreach( + fun(V) -> + case digraph:vertex(G, V) of + {_, _} -> ok; + false -> + io:format("Unknown vertex in edge: ~p~n", [V]), + put(sane, no) + end + end, EVs), + + %% sink_vertices and source_vertices were introduced in 2001. They + %% are not documented. + + %% sink: a vertex with no outgoing edges + SinkVs = [V || V <- Vs, digraph:out_edges(G, V) =:= [] ], + case lists:sort(SinkVs) =:= lists:sort(digraph:sink_vertices(G)) of + true -> ok; + false -> + io:format("Bad sinks~n"), put(sane, no) + end, + %% sink: a vertex with no incoming edges + SourceVs = [V || V <- Vs, digraph:in_edges(G, V) =:= [] ], + case lists:sort(SourceVs) =:= lists:sort(digraph:source_vertices(G)) of + true -> ok; + false -> + io:format("Bad sources~n"), put(sane, no) + end, + + true. + +build_graph(Opts, Gs) -> + G = digraph:new(Opts), + build_g(G, Gs). + +build_g(G, [{V,Ns} | Gs]) -> + digraph:add_vertex(G, V), + build_ns(G, V, Ns), + build_g(G, Gs); +build_g(G, []) -> + true = sane(G), + G. + +build_ns(G, V, [{E,W} | Ns]) -> + digraph:add_vertex(G, W), + digraph:add_edge(G, E, V, W, []), + build_ns(G, V, Ns); +build_ns(G, V, [W | Ns]) -> + digraph:add_vertex(G, W), + digraph:add_edge(G, V, W), + build_ns(G, V, Ns); +build_ns(_G, _V, []) -> + true. + +%% Spawn a process that create a graph return {Pid, Graph} + +spawn_graph(Opts) -> + Pid = spawn(?MODULE, spawn_graph, [self(),Opts]), + receive + {Pid, G} -> {Pid,G} + end. + +%% Create a graph and wait for die message +spawn_graph(Starter, Opts) -> + G = digraph:new(Opts), + Starter ! {self(), G}, + receive + die -> true + end. + +info(G, What) -> + case lists:keysearch(What, 1, digraph:info(G)) of + {value, {What, Value}} -> Value; + false -> [] + end. + +%% Kill process created by spawn_graph +kill_graph(Pid) -> + Pid ! die. + +check(R0, E0) -> + R = lists:sort(R0), + E = lists:sort(E0), + case R of + E -> + []; + _ -> + (R -- E) ++ (E -- R) + end. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/digraph_utils_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/digraph_utils_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/digraph_utils_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/digraph_utils_SUITE.erl 2009-11-20 13:31:02.000000000 +0000 @@ -0,0 +1,316 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(digraph_utils_SUITE). + +%-define(debug, true). +-ifdef(debug). +-define(line, put(line, ?LINE), ). +-else. +-include("test_server.hrl"). +-endif. + +-export([all/1]). + +-export([simple/1, loop/1, isolated/1, topsort/1, subgraph/1, + condensation/1, tree/1]). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +all(suite) -> {req, [stdlib], [simple, loop, isolated, topsort, + subgraph, condensation, tree]}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +simple(doc) -> []; +simple(suite) -> []; +simple(Config) when is_list(Config) -> + ?line G = digraph:new(), + ?line add_vertices(G, [a]), + ?line add_edges(G, [{b,c},{b,d},{e,f},{f,g},{g,e},{h,h},{i,i},{i,j}]), + ?line 10 = length(digraph_utils:postorder(G)), + ?line 10 = length(digraph_utils:preorder(G)), + ?line ok = evall(digraph_utils:components(G), + [[a],[b,c,d],[e,f,g],[h],[i,j]]), + ?line ok = evall(digraph_utils:strong_components(G), + [[a],[b],[c],[d],[e,f,g],[h],[i],[j]]), + ?line ok = evall(digraph_utils:cyclic_strong_components(G), + [[e,f,g],[h],[i]]), + ?line true = path(G, e, e), + ?line false = path(G, e, j), + ?line false = path(G, a, a), + ?line false = digraph_utils:topsort(G), + ?line false = digraph_utils:is_acyclic(G), + ?line ok = eval(digraph_utils:loop_vertices(G), [h,i]), + ?line ok = eval(digraph_utils:reaching([e], G), [e,f,g]), + ?line ok = eval(digraph_utils:reaching_neighbours([e], G), [e,f,g]), + ?line ok = eval(digraph_utils:reachable([e], G), [e,f,g]), + ?line ok = eval(digraph_utils:reachable_neighbours([e], G), [e,f,g]), + ?line ok = eval(digraph_utils:reaching([b], G), [b]), + ?line ok = eval(digraph_utils:reaching_neighbours([b], G), []), + ?line ok = eval(digraph_utils:reachable([b], G), [b,c,d]), + ?line ok = eval(digraph_utils:reachable_neighbours([b], G), [c,d]), + ?line ok = eval(digraph_utils:reaching([h], G), [h]), + ?line ok = eval(digraph_utils:reaching_neighbours([h], G), [h]), + ?line ok = eval(digraph_utils:reachable([h], G), [h]), + ?line ok = eval(digraph_utils:reachable_neighbours([h], G), [h]), + ?line ok = eval(digraph_utils:reachable([e,f], G), [e,f,g]), + ?line ok = eval(digraph_utils:reachable_neighbours([e,f], G), [e,f,g]), + ?line ok = eval(digraph_utils:reachable([h,h,h], G), [h]), + ?line true = digraph:delete(G), + ok. + +loop(doc) -> []; +loop(suite) -> []; +loop(Config) when is_list(Config) -> + ?line G = digraph:new(), + ?line add_vertices(G, [a,b]), + ?line add_edges(G, [{a,a},{b,b}]), + ?line ok = evall(digraph_utils:components(G), [[a],[b]]), + ?line ok = evall(digraph_utils:strong_components(G), [[a],[b]]), + ?line ok = evall(digraph_utils:cyclic_strong_components(G), [[a],[b]]), + ?line [_,_] = digraph_utils:topsort(G), + ?line false = digraph_utils:is_acyclic(G), + ?line ok = eval(digraph_utils:loop_vertices(G), [a,b]), + ?line [_,_] = digraph_utils:preorder(G), + ?line [_,_] = digraph_utils:postorder(G), + ?line ok = eval(digraph_utils:reaching([b], G), [b]), + ?line ok = eval(digraph_utils:reaching_neighbours([b], G), [b]), + ?line ok = eval(digraph_utils:reachable([b], G), [b]), + ?line ok = eval(digraph_utils:reachable_neighbours([b], G), [b]), + ?line true = path(G, a, a), + ?line true = digraph:delete(G), + ok. + +isolated(doc) -> []; +isolated(suite) -> []; +isolated(Config) when is_list(Config) -> + ?line G = digraph:new(), + ?line add_vertices(G, [a,b]), + ?line ok = evall(digraph_utils:components(G), [[a],[b]]), + ?line ok = evall(digraph_utils:strong_components(G), [[a],[b]]), + ?line ok = evall(digraph_utils:cyclic_strong_components(G), []), + ?line [_,_] = digraph_utils:topsort(G), + ?line true = digraph_utils:is_acyclic(G), + ?line ok = eval(digraph_utils:loop_vertices(G), []), + ?line [_,_] = digraph_utils:preorder(G), + ?line [_,_] = digraph_utils:postorder(G), + ?line ok = eval(digraph_utils:reaching([b], G), [b]), + ?line ok = eval(digraph_utils:reaching_neighbours([b], G), []), + ?line ok = eval(digraph_utils:reachable([b], G), [b]), + ?line ok = eval(digraph_utils:reachable_neighbours([b], G), []), + ?line false = path(G, a, a), + ?line true = digraph:delete(G), + ok. + +topsort(doc) -> []; +topsort(suite) -> []; +topsort(Config) when is_list(Config) -> + ?line G = digraph:new(), + ?line add_edges(G, [{a,b},{b,c},{c,d},{d,e},{e,f}]), + ?line ok = eval(digraph_utils:topsort(G), [a,b,c,d,e,f]), + ?line true = digraph:delete(G), + ok. + +subgraph(doc) -> []; +subgraph(suite) -> []; +subgraph(Config) when is_list(Config) -> + ?line G = digraph:new([acyclic]), + ?line add_edges(G, [{b,c},{b,d},{e,f},{f,fg,fgl,g},{f,fg2,fgl2,g},{g,e}, + {h,h},{i,i},{i,j}]), + ?line add_vertices(G, [{b,bl},{f,fl}]), + ?line SG = digraph_utils:subgraph(G, [u1,b,c,u2,f,g,i,u3]), + ?line [b,c,f,g,i] = lists:sort(digraph:vertices(SG)), + ?line {b,bl} = digraph:vertex(SG, b), + ?line {c,[]} = digraph:vertex(SG, c), + ?line {fg,f,g,fgl} = digraph:edge(SG, fg), + ?line {fg2,f,g,fgl2} = digraph:edge(SG, fg2), + ?line {_, {_, acyclic}} = lists:keysearch(cyclicity, 1, digraph:info(SG)), + ?line true = digraph:delete(SG), + + ?line SG1 = digraph_utils:subgraph(G, [f, g, h], + [{type, []}, {keep_labels, false}]), + ?line [f,g,h] = lists:sort(digraph:vertices(SG1)), + ?line {f,[]} = digraph:vertex(SG1, f), + ?line {fg,f,g,[]} = digraph:edge(SG1, fg), + ?line {_, {_, cyclic}} = lists:keysearch(cyclicity, 1, digraph:info(SG1)), + ?line true = digraph:delete(SG1), + + ?line SG2 = digraph_utils:subgraph(G, [f, g, h], + [{type, [acyclic]}, + {keep_labels, true}]), + ?line [f,g,h] = lists:sort(digraph:vertices(SG2)), + ?line {f,fl} = digraph:vertex(SG2, f), + ?line {fg,f,g,fgl} = digraph:edge(SG2, fg), + ?line {_, {_, acyclic}} = lists:keysearch(cyclicity, 1, digraph:info(SG2)), + ?line true = digraph:delete(SG2), + + ?line {'EXIT',{badarg,_}} = + (catch digraph_utils:subgraph(G, [f], [{invalid, opt}])), + ?line {'EXIT',{badarg,_}} = + (catch digraph_utils:subgraph(G, [f], [{keep_labels, not_Bool}])), + ?line {'EXIT',{badarg,_}} = + (catch digraph_utils:subgraph(G, [f], [{type, not_type}])), + ?line {'EXIT',{badarg,_}} = + (catch digraph_utils:subgraph(G, [f], [{type, [not_type]}])), + ?line {'EXIT',{badarg,_}} = + (catch digraph_utils:subgraph(G, [f], not_a_list)), + + ?line true = digraph:delete(G), + + ok. + +condensation(doc) -> []; +condensation(suite) -> []; +condensation(Config) when is_list(Config) -> + ?line G = digraph:new([]), + ?line add_edges(G, [{b,c},{b,d},{e,f},{f,fg,fgl,g},{f,fg2,fgl2,g},{g,e}, + {h,h},{j,i},{i,j}]), + ?line add_vertices(G, [q]), + ?line CG = digraph_utils:condensation(G), + ?line Vs = sort_2(digraph:vertices(CG)), + ?line [[b],[c],[d],[e,f,g],[h],[i,j],[q]] = Vs, + ?line Fun = fun(E) -> + {_E, V1, V2, _L} = digraph:edge(CG, E), + {lists:sort(V1), lists:sort(V2)} + end, + ?line Es = lists:map(Fun, digraph:edges(CG)), + ?line [{[b],[c]},{[b],[d]},{[e,f,g],[e,f,g]},{[h],[h]},{[i,j],[i,j]}] = + lists:sort(Es), + ?line true = digraph:delete(CG), + ?line true = digraph:delete(G), + ok. + +tree(doc) -> ["OTP-7081"]; +tree(suite) -> []; +tree(Config) when is_list(Config) -> + ?line false = is_tree([], []), + ?line true = is_tree([a], []), + ?line false = is_tree([a,b], []), + ?line true = is_tree([{a,b}]), + ?line false = is_tree([{a,b},{b,a}]), + ?line true = is_tree([{a,b},{a,c},{b,d},{b,e}]), + ?line false = is_tree([{a,b},{a,c},{b,d},{b,e}, {d,e}]), + ?line false = is_tree([{a,b},{a,c},{b,d},{b,e}, {b,e}]), + ?line true = is_tree([{a,c},{c,b}]), + ?line true = is_tree([{b,a},{c,a}]), + %% Parallel edges. Acyclic and with one componets + %% (according to the digraph module). + ?line false = is_tree([{a,b},{a,b}]), + + ?line no = arborescence_root([], []), + ?line {yes, a} = arborescence_root([a], []), + ?line no = arborescence_root([a,b], []), + ?line {yes, a} = arborescence_root([{a,b}]), + ?line no = arborescence_root([{a,b},{b,a}]), + ?line {yes, a} = arborescence_root([{a,b},{a,c},{b,d},{b,e}]), + ?line no = arborescence_root([{a,b},{a,c},{b,d},{b,e}, {d,e}]), + ?line no = arborescence_root([{a,b},{a,c},{b,d},{b,e}, {b,e}]), + ?line {yes, a} = arborescence_root([{a,c},{c,b}]), + ?line no = arborescence_root([{b,a},{c,a}]), + + ?line false = is_arborescence([], []), + ?line true = is_arborescence([a], []), + ?line false = is_arborescence([a,b], []), + ?line true = is_arborescence([{a,b}]), + ?line false = is_arborescence([{a,b},{b,a}]), + ?line true = is_arborescence([{a,b},{a,c},{b,d},{b,e}]), + ?line false = is_arborescence([{a,b},{a,c},{b,d},{b,e}, {d,e}]), + ?line false = is_arborescence([{a,b},{a,c},{b,d},{b,e}, {b,e}]), + ?line true = is_arborescence([{a,c},{c,b}]), + ?line false = is_arborescence([{b,a},{c,a}]), + + %% Parallel edges. + ?line false = is_arborescence([{a,b},{a,b}]), + + ok. + +is_tree(Es) -> + is_tree([], Es). + +is_tree(Vs, Es) -> + gu(Vs, Es, is_tree). + +is_arborescence(Es) -> + is_arborescence([], Es). + +is_arborescence(Vs, Es) -> + gu(Vs, Es, is_arborescence). + +arborescence_root(Es) -> + arborescence_root([], Es). + +arborescence_root(Vs, Es) -> + gu(Vs, Es, arborescence_root). + +gu(Vs, Es, F) -> + G = digraph:new(), + add_vertices(G, Vs), + add_edges(G, Es), + Reply = digraph_utils:F(G), + true = digraph:delete(G), + Reply. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +sort_2(L) -> + lists:sort(lists:map(fun(V) -> lists:sort(V) end, L)). + +path(G, V1, V2) -> + digraph:get_path(G, V1, V2) /= false. + +add_vertices(G, Vs) -> + lists:foreach(fun({V, Label}) -> digraph:add_vertex(G, V, Label); + (V) -> digraph:add_vertex(G, V) + end, Vs). + +add_edges(G, L) -> + Fun = fun({From, To}) -> + digraph:add_vertex(G, From), + digraph:add_vertex(G, To), + digraph:add_edge(G, From, To); + ({From, Edge, Label, To}) -> + digraph:add_vertex(G, From), + digraph:add_vertex(G, To), + digraph:add_edge(G, Edge, From, To, Label) + end, + lists:foreach(Fun, L). + +eval(L, E) -> + Expected = lists:sort(E), + Got = lists:sort(L), + if + Expected == Got -> + ok; + true -> + not_ok + end. + +evall(L, E) -> + F = fun(L1) -> lists:sort(L1) end, + Fun = fun(LL) -> F(lists:map(F, LL)) end, + + Expected = Fun(E), + Got = Fun(L), + if + Expected == Got -> + ok; + true -> + not_ok + end. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/dummy1_h.erl erlang-13.b.3-dfsg/lib/stdlib/test/dummy1_h.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/dummy1_h.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/dummy1_h.erl 2009-11-20 13:29:58.000000000 +0000 @@ -0,0 +1,70 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(dummy1_h). + +%% Test event handler for gen_event_SUITE.erl + +-export([init/1, handle_event/2, handle_call/2, handle_info/2, + terminate/2]). + +init(make_error) -> + {error, my_error}; +init({_, error}) -> % swap from non-existing handler. + non_existing; +init({swap, {ok, OldState}}) -> + {ok, OldState}; +init([Parent]) -> + {ok, Parent}. %% We will send special responses for every handled event. + +handle_event(delete_event, _Parent) -> + remove_handler; +handle_event(do_crash, _State) -> + erlang:error({badmatch,4}); +%Inverse of dummy_h +handle_event(hibernate, Parent) -> + {ok,Parent}; +handle_event(wakeup, Parent) -> + {ok,Parent,hibernate}; +handle_event(Event, Parent) -> + Parent ! {dummy1_h, Event}, + {ok, Parent}. + +handle_call(delete_call, _State) -> + {remove_handler, ok}; +handle_call(_Query, State) -> + {ok, ok, State}. + +handle_info(delete_info, _Parent) -> + remove_handler; +handle_info(do_crash, _State) -> + erlang:error({badmatch,4}); +handle_info(gnurf, Parent) -> + {ok, Parent, hibernate}; +handle_info(Info, Parent) -> + Parent ! {dummy1_h, Info}, + {ok, Parent}. + +terminate(return_hej, _State) -> + return_hej; +terminate(remove_handler, Parent) -> + Parent ! {dummy1_h, removed}; +terminate(_Reason, _State) -> + ok. + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/dummy_h.erl erlang-13.b.3-dfsg/lib/stdlib/test/dummy_h.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/dummy_h.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/dummy_h.erl 2009-11-20 13:29:58.000000000 +0000 @@ -0,0 +1,88 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(dummy_h). + +%% Test event handler for gen_event_SUITE.erl + +-export([init/1, handle_event/2, handle_call/2, handle_info/2, + terminate/2]). + +init(make_error) -> + {error, my_error}; +init([Parent]) -> + {ok, Parent}; %% We will send special responses for every handled event. +init([Parent,hibernate]) -> + {ok, Parent, hibernate}. %% We will send special responses for every handled event. + +handle_event({swap_event,Mod,Args}, State) -> + {swap_handler, swap, State, Mod, Args}; +handle_event(error_event, _State) -> + {return, faulty}; +handle_event(do_crash, _State) -> + erlang:error({badmatch,4}); +handle_event(hibernate, _State) -> + {ok,[],hibernate}; +handle_event(wakeup, _State) -> + {ok,[]}; +handle_event(Event, Parent) -> + Parent ! {dummy_h, Event}, + {ok, Parent}. + +handle_call(hejsan, State) -> + {ok, {ok, hejhopp}, State}; +handle_call({swap_call,Mod,Args}, State) -> + {swap_handler, {ok, swapped}, swap, State, Mod, Args}; +handle_call(error_call, _State) -> + {return, faulty}; +handle_call(exit_call, _State) -> + erlang:error({badmatch,4}); +handle_call(hibernate, _State) -> + {ok,true,[],hibernate}; +handle_call(hibernate_later, _State) -> + timer:send_after(1000,sleep), + {ok,later,[]}; +handle_call(_Query, State) -> + {ok, ok, State}. + +handle_info({swap_info,Mod,Args}, State) -> + {swap_handler, swap, State, Mod, Args}; +handle_info(error_info, _State) -> + {return, faulty}; +handle_info(do_crash, _State) -> + erlang:error({badmatch,4}); +handle_info(sleep, _State) -> + {ok, [], hibernate}; +handle_info(wake, _State) -> + {ok, []}; +handle_info(gnurf, _State) -> + {ok, []}; +handle_info(Info, Parent) -> + Parent ! {dummy_h, Info}, + {ok, Parent}. + +terminate(return_hej, _State) -> + return_hej; +terminate(swap, State) -> + {ok, State}; +terminate({error, {return, faulty}}, Parent) -> + Parent ! {dummy_h, returned_error}; +terminate(_Reason, _State) -> + ok. + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/mac2.erl erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/mac2.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/mac2.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/mac2.erl 2009-11-20 13:30:40.000000000 +0000 @@ -0,0 +1,38 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-ifndef(p). +-define(p, 1). +-endif. + +-ifndef('p'). +-define('p', 2). +-endif. + +-ifndef(P). +-define(P, 3). +-endif. + +-ifndef('P'). +-define('P', 4). +-endif. + +-plupp({?p, + ?'p', + ?P, + ?'P'}). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/mac3.erl erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/mac3.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/mac3.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/mac3.erl 2009-11-20 13:30:40.000000000 +0000 @@ -0,0 +1,36 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-l(?LINE). + +-f(?FILE). + +-machine1(?MACHINE). + +-module(mac3). + +-m(?MODULE). +-ms(?MODULE_STRING). + +-ifdef(JAM). +-machine2(jam). +-endif. + +-ifdef(BEAM). +-machine2(beam). +-endif. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/mac.erl erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/mac.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/mac.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/mac.erl 2009-11-20 13:30:40.000000000 +0000 @@ -0,0 +1,46 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(mac). + +-compile(export_all). + +-define(A, ?A + ?A). + +-define(a, ?a + ?a). +-define(b, x + ?c(2)). +-define(c(Y), x + Y). +-define(d(X), X X). + +bar() -> + 1 ?d(?d(?d(?d(?d(?d(?d(+1))))))). + +foo1() -> + ?a. + +foo2() -> + ?b. + +foo3() -> + ?A. + +-define( this, ?that). +-define( that, ?this). + +talkAbout()-> + ?this==?that. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/pmod.erl erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/pmod.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/pmod.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/pmod.erl 2009-11-20 13:32:01.000000000 +0000 @@ -0,0 +1,25 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(pmod, [Props]). + +-export([update/1]). + +update(X) -> + ?MODULE:new(X). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1.erl erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1.erl 2009-11-20 13:31:31.000000000 +0000 @@ -0,0 +1,24 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(variable_1). + +-include("$VAR/variable_1_include.hrl"). +-include_lib("$VAR/variable_1_include_dir.hrl"). + +-a({?variable_1_var1, ?variable_1_var2}). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1_include_dir.hrl erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1_include_dir.hrl --- erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1_include_dir.hrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1_include_dir.hrl 2009-11-20 13:31:31.000000000 +0000 @@ -0,0 +1,19 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-define(variable_1_var2, value2). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1_include.hrl erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1_include.hrl --- erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1_include.hrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE_data/variable_1_include.hrl 2009-11-20 13:31:31.000000000 +0000 @@ -0,0 +1,19 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-define(variable_1_var1, value1). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/epp_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/epp_SUITE.erl 2009-09-18 15:07:56.000000000 +0100 @@ -0,0 +1,1148 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(epp_SUITE). +-export([all/1]). + +-export([rec_1/1, predef_mac/1, + upcase_mac/1, upcase_mac_1/1, upcase_mac_2/1, + variable/1, variable_1/1, otp_4870/1, otp_4871/1, otp_5362/1, + pmod/1, not_circular/1, skip_header/1, otp_6277/1, otp_7702/1, + otp_8130/1]). + +-export([epp_parse_erl_form/2]). + +%% +%% Define to run outside of test server +%% +%-define(STANDALONE,1). + +-ifdef(STANDALONE). +-compile(export_all). +-define(line, put(line, ?LINE), ). +-define(config(A,B),config(A,B)). +%% -define(t, test_server). +-define(t, io). +config(priv_dir, _) -> + filename:absname("./epp_SUITE_priv"); +config(data_dir, _) -> + filename:absname("./epp_SUITE_data"). +-else. +-include("test_server.hrl"). +-export([init_per_testcase/2, fin_per_testcase/2]). + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +init_per_testcase(_, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{watchdog, Dog} | Config]. +fin_per_testcase(_, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. +-endif. + +all(doc) -> + ["Test cases for epp."]; +all(suite) -> + [rec_1, upcase_mac, predef_mac, variable, otp_4870, otp_4871, otp_5362, + pmod, not_circular, skip_header, otp_6277, otp_7702, otp_8130]. + +rec_1(doc) -> + ["Recursive macros hang or crash epp (OTP-1398)."]; +rec_1(suite) -> + []; +rec_1(Config) when is_list(Config) -> + ?line File = filename:join(?config(data_dir, Config), "mac.erl"), + ?line {ok, List} = epp_parse_file(File, [], []), + %% we should encounter errors + ?line {value, _} = lists:keysearch(error, 1, List), + ?line check_errors(List), + ok. + +%%% Here is a little reimplementation of epp:parse_file, which times out +%%% after 4 seconds if the epp server doesn't respond. If we use the +%%% regular epp:parse_file, the test case will time out, and then epp +%%% server will go on growing until we dump core. +epp_parse_file(File, Inc, Predef) -> + {ok, Epp} = epp:open(File, Inc, Predef), + List = collect_epp_forms(Epp), + epp:close(Epp), + {ok, List}. + +collect_epp_forms(Epp) -> + Result = epp_parse_erl_form(Epp), + case Result of + {error, _Error} -> + [Result | collect_epp_forms(Epp)]; + {ok, Form} -> + [Form | collect_epp_forms(Epp)]; + {eof, _} -> + [Result] + end. + +epp_parse_erl_form(Epp) -> + P = spawn(?MODULE, epp_parse_erl_form, [Epp, self()]), + receive + {P, Result} -> + Result + after 4000 -> + exit(Epp, kill), + exit(P, kill), + timeout + end. + +epp_parse_erl_form(Epp, Parent) -> + Parent ! {self(), epp:parse_erl_form(Epp)}. + +check_errors([]) -> + ok; +check_errors([{error, Info} | Rest]) -> + ?line {Line, Mod, Desc} = Info, + ?line case Line of + I when is_integer(I) -> ok; + {L,C} when is_integer(L), is_integer(C), C >= 1 -> ok + end, + ?line Str = lists:flatten(Mod:format_error(Desc)), + ?line [Str] = io_lib:format("~s", [Str]), + check_errors(Rest); +check_errors([_ | Rest]) -> + check_errors(Rest). + +upcase_mac(doc) -> + ["Check that uppercase macro names are implicitly quoted (OTP-2608)"]; +upcase_mac(suite) -> + [upcase_mac_1, upcase_mac_2]. + +upcase_mac_1(doc) -> + []; +upcase_mac_1(suite) -> + []; +upcase_mac_1(Config) when is_list(Config) -> + ?line File = filename:join(?config(data_dir, Config), "mac2.erl"), + ?line {ok, List} = epp:parse_file(File, [], []), + ?line [_, {attribute, _, plupp, Tuple} | _] = List, + ?line Tuple = {1, 1, 3, 3}, + ok. + +upcase_mac_2(doc) -> + []; +upcase_mac_2(suite) -> + []; +upcase_mac_2(Config) when is_list(Config) -> + ?line File = filename:join(?config(data_dir, Config), "mac2.erl"), + ?line {ok, List} = epp:parse_file(File, [], [{p, 5}, {'P', 6}]), + ?line [_, {attribute, _, plupp, Tuple} | _] = List, + ?line Tuple = {5, 5, 6, 6}, + ok. + +predef_mac(doc) -> + []; +predef_mac(suite) -> + []; +predef_mac(Config) when is_list(Config) -> + ?line File = filename:join(?config(data_dir, Config), "mac3.erl"), + ?line {ok, List} = epp:parse_file(File, [], []), + ?line [_, + {attribute, LineCol1, l, Line1}, + {attribute, _, f, File}, + {attribute, _, machine1, _}, + {attribute, _, module, mac3}, + {attribute, _, m, mac3}, + {attribute, _, ms, "mac3"}, + {attribute, _, machine2, _} + | _] = List, + ?line case LineCol1 of + Line1 -> ok; + {Line1,_} -> ok + end, + ok. + +variable(doc) -> + ["Check variable as first file component of the include directives."]; +variable(suite) -> + [variable_1]. + +variable_1(doc) -> + []; +variable_1(suite) -> + []; +variable_1(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line File = filename:join(DataDir, "variable_1.erl"), + ?line true = os:putenv("VAR", DataDir), + %% variable_1.erl includes variable_1_include.hrl and + %% variable_1_include_dir.hrl. + ?line {ok, List} = epp:parse_file(File, [], []), + ?line {value, {attribute,_,a,{value1,value2}}} = + lists:keysearch(a,3,List), + ok. + +otp_4870(doc) -> + ["undef without module declaration"]; +otp_4870(suite) -> + []; +otp_4870(Config) when is_list(Config) -> + Ts = [{otp_4870, + <<"-undef(foo). + ">>, + []}], + ?line [] = check(Config, Ts), + ok. + +otp_4871(doc) -> + ["crashing erl_scan"]; +otp_4871(suite) -> + []; +otp_4871(Config) when is_list(Config) -> + ?line Dir = ?config(priv_dir, Config), + ?line File = filename:join(Dir, "otp_4871.erl"), + ?line ok = file:write_file(File, "-module(otp_4871)."), + %% Testing crash in erl_scan. Unfortunately there currently is + %% no known way to crash erl_scan so it is emulated by killing the + %% file io server. This assumes lots of things about how + %% the processes are started and how monitors are set up, + %% so there are some sanity checks before killing. + ?line {ok,Epp} = epp:open(File, []), + timer:sleep(1), + ?line {current_function,{epp,_,_}} = process_info(Epp, current_function), + ?line {monitored_by,[Io]} = process_info(Epp, monitored_by), + ?line {current_function,{file_io_server,_,_}} = + process_info(Io, current_function), + ?line exit(Io, emulate_crash), + timer:sleep(1), + ?line {error,{_Line,epp,cannot_parse}} = otp_4871_parse_file(Epp), + ?line epp:close(Epp), + ok. + +otp_4871_parse_file(Epp) -> + case epp:parse_erl_form(Epp) of + {ok,_} -> otp_4871_parse_file(Epp); + Other -> Other + end. + +otp_5362(doc) -> + ["OTP-5362. The -file attribute is recognized."]; +otp_5362(suite) -> + []; +otp_5362(Config) when is_list(Config) -> + Dir = ?config(priv_dir, Config), + + Copts = [return, strong_validation,{i,Dir}], + + File_Incl = filename:join(Dir, "incl_5362.erl"), + File_Incl2 = filename:join(Dir, "incl2_5362.erl"), + File_Incl3 = filename:join(Dir, "incl3_5362.erl"), + Incl = <<"-module(incl_5362). + + -include(\"incl2_5362.erl\"). + + -include_lib(\"incl3_5362.erl\"). + + hi(There) -> % line 7 + a. + ">>, + Incl2 = <<"-file(\"some.file\", 100). + + foo(Bar) -> % line 102 + foo. + ">>, + Incl3 = <<"glurk(Foo) -> % line 1 + bar. + ">>, + ?line ok = file:write_file(File_Incl, Incl), + ?line ok = file:write_file(File_Incl2, Incl2), + ?line ok = file:write_file(File_Incl3, Incl3), + + ?line {ok, incl_5362, InclWarnings} = compile:file(File_Incl, Copts), + ?line true = message_compare( + [{File_Incl3,[{{1,1},erl_lint,{unused_function,{glurk,1}}}, + {{1,7},erl_lint,{unused_var,'Foo'}}]}, + {File_Incl,[{{7,15},erl_lint,{unused_function,{hi,1}}}, + {{7,18},erl_lint,{unused_var,'There'}}]}, + {"some.file",[{{102,16},erl_lint,{unused_function,{foo,1}}}, + {{102,20},erl_lint,{unused_var,'Bar'}}]}], + lists:usort(InclWarnings)), + + file:delete(File_Incl), + file:delete(File_Incl2), + file:delete(File_Incl3), + + %% A -file attribute referring back to the including file. + File_Back = filename:join(Dir, "back_5362.erl"), + File_Back_hrl = filename:join(Dir, "back_5362.hrl"), + Back = <<"-module(back_5362). + + -compile(export_all). + + -file(?FILE, 1). + -include(\"back_5362.hrl\"). + + foo(V) -> % line 4 + bar. + ">>, + Back_hrl = [<<" + -file(\"">>,File_Back,<<"\", 2). + ">>], + + ?line ok = file:write_file(File_Back, Back), + ?line ok = file:write_file(File_Back_hrl, list_to_binary(Back_hrl)), + + ?line {ok, back_5362, BackWarnings} = compile:file(File_Back, Copts), + ?line true = message_compare( + [{File_Back,[{{4,19},erl_lint,{unused_var,'V'}}]}], + BackWarnings), + file:delete(File_Back), + file:delete(File_Back_hrl), + + %% Set filename but keep line. + File_Change = filename:join(Dir, "change_5362.erl"), + Change = [<<"-module(change_5362). + + -file(?FILE, 100). + + -compile(export_all). + + -file(\"other.file\", ?LINE). % like an included file... + foo(A) -> % line 105 + bar. + + -file(\"">>,File_Change,<<"\", 1000). + + bar(B) -> % line 1002 + foo. + ">>], + + ?line ok = file:write_file(File_Change, list_to_binary(Change)), + + ?line {ok, change_5362, ChangeWarnings} = + compile:file(File_Change, Copts), + ?line true = message_compare( + [{File_Change,[{{1002,21},erl_lint,{unused_var,'B'}}]}, + {"other.file",[{{105,21},erl_lint,{unused_var,'A'}}]}], + lists:usort(ChangeWarnings)), + + file:delete(File_Change), + + %% -file attribute ending with a blank (not a newline). + File_Blank = filename:join(Dir, "blank_5362.erl"), + + Blank = <<"-module(blank_5362). + + -compile(export_all). + + - + file(?FILE, 18). q(Q) -> foo. % line 18 + + a(A) -> % line 20 + 1. + + -file(?FILE, 42). + + b(B) -> % line 44 + 2. + + -file(?FILE, ?LINE). c(C) -> % line 47 + 3. + ">>, + ?line ok = file:write_file(File_Blank, Blank), + ?line {ok, blank_5362, BlankWarnings} = compile:file(File_Blank, Copts), + ?line true = message_compare( + [{File_Blank,[{{18,3},erl_lint,{unused_var,'Q'}}, + {{20,18},erl_lint,{unused_var,'A'}}, + {{44,18},erl_lint,{unused_var,'B'}}, + {{47,3},erl_lint,{unused_var,'C'}}]}], + lists:usort(BlankWarnings)), + file:delete(File_Blank), + + %% __FILE__ is set by inclusion and by -file attribute + FILE_incl = filename:join(Dir, "file_5362.erl"), + FILE_incl1 = filename:join(Dir, "file_incl_5362.erl"), + FILE = <<"-module(file_5362). + + -export([ff/0, ii/0]). + + -include(\"file_incl_5362.erl\"). + + -file(\"other_file\", 100). + + ff() -> + ?FILE.">>, + FILE1 = <<"ii() -> ?FILE. + ">>, + FILE_Mod = file_5362, + ?line ok = file:write_file(FILE_incl, FILE), + ?line ok = file:write_file(FILE_incl1, FILE1), + FILE_Copts = [return, {i,Dir},{outdir,Dir}], + ?line {ok, file_5362, []} = compile:file(FILE_incl, FILE_Copts), + AbsFile = filename:rootname(FILE_incl, ".erl"), + ?line {module, FILE_Mod} = code:load_abs(AbsFile, FILE_Mod), + ?line II = FILE_Mod:ii(), + ?line "file_incl_5362.erl" = filename:basename(II), + ?line FF = FILE_Mod:ff(), + ?line "other_file" = filename:basename(FF), + code:purge(file_5362), + + file:delete(FILE_incl), + file:delete(FILE_incl1), + + ok. + +pmod(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line Pmod = filename:join(DataDir, "pmod.erl"), + ?line case epp:parse_file([Pmod], [], []) of + {ok,Forms} -> + %% ?line io:format("~p\n", [Forms]), + ?line [] = [F || {error,_}=F <- Forms], + ok + end, + ok. + +not_circular(Config) when is_list(Config) -> + %% Used to generate a compilation error, wrongly saying that it + %% was a circular definition. + + Ts = [{circular_1, + <<"-define(S(S), ??S).\n" + "t() -> \"string\" = ?S(string), ok.\n">>, + ok}], + ?line [] = run(Config, Ts), + ok. + +skip_header(doc) -> + ["Skip some bytes in the beginning of the file."]; +skip_header(suite) -> + []; +skip_header(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line File = filename:join([PrivDir, "epp_test_skip_header.erl"]), + ?line ok = file:write_file(File, + <<"some bytes + in the beginning of the file + that should be skipped + -module(epp_test_skip_header). + -export([main/1]). + + main(_) -> ?MODULE. + + ">>), + ?line {ok, Fd} = file:open(File, [read]), + ?line io:get_line(Fd, ''), + ?line io:get_line(Fd, ''), + ?line io:get_line(Fd, ''), + ?line {ok, Epp} = epp:open(list_to_atom(File), Fd, 4, [], []), + + ?line Forms = epp:parse_file(Epp), + ?line [] = [Reason || {error, Reason} <- Forms], + ?line ok = epp:close(Epp), + ?line ok = file:close(Fd), + + ok. + +otp_6277(doc) -> + ["?MODULE before module declaration."]; +otp_6277(suite) -> + []; +otp_6277(Config) when is_list(Config) -> + Ts = [{otp_6277, + <<"-undef(ASSERT). + -define(ASSERT, ?MODULE). + + ?ASSERT().">>, + [{error,{{4,16},epp,{undefined,'MODULE'}}}]}], + ?line [] = check(Config, Ts), + ok. + +otp_7702(doc) -> + ["OTP-7702. Wrong line number in stringifying macro expansion."]; +otp_7702(suite) -> + []; +otp_7702(Config) when is_list(Config) -> + Dir = ?config(priv_dir, Config), + File = filename:join(Dir, "file_7702.erl"), + Contents = <<"-module(file_7702). + + -export([t/0]). + + -define(RECEIVE(Msg,Body), + receive + Msg -> Body; + M -> + exit({unexpected_message,M,on_line,?LINE,was_expecting,??Msg}) + after 10000 -> + exit({timeout,on_line,?LINE,was_expecting,??Msg}) + end). + t() -> + ?RECEIVE(foo, bar).">>, + ?line ok = file:write_file(File, Contents), + ?line {ok, file_7702, []} = + compile:file(File, [debug_info,return,{outdir,Dir}]), + + BeamFile = filename:join(Dir, "file_7702.beam"), + {ok, AC} = beam_lib:chunks(BeamFile, [abstract_code]), + + {file_7702,[{abstract_code,{_,Forms}}]} = AC, + Fun = fun(Attrs) -> + {line, L} = erl_parse:get_attribute(Attrs, line), + L + end, + Forms2 = [erl_lint:modify_line(Form, Fun) || Form <- Forms], + ?line + [{attribute,1,file,_}, + _, + _, + {function,_,t,0, + [{clause,_,[],[], + [{'receive',14, + [_, + {clause,14, + [{var,14,'M'}], + [], + [{_,_,_, + [{tuple,14, + [{atom,14,unexpected_message}, + {var,14,'M'}, + {atom,14,on_line}, + {integer,14,14}, + {atom,14,was_expecting}, + {string,14,"foo"}]}]}]}], + {integer,14,10000}, + [{call,14, + {atom,14,exit}, + [{tuple,14, + [{atom,14,timeout}, + {atom,14,on_line}, + {integer,14,14}, + {atom,14,was_expecting}, + {string,14,"foo"}]}]}]}]}]}, + {eof,14}] = Forms2, + + file:delete(File), + file:delete(BeamFile), + + ok. + +otp_8130(doc) -> + ["OTP-8130. Misc tests."]; +otp_8130(suite) -> + []; +otp_8130(Config) when is_list(Config) -> + true = os:putenv("epp_inc1", "stdlib"), + Ts = [{otp_8130_1, + %% The scanner handles UNICODE in a special way. Hopefully + %% temporarily. + <<"-define(M(A), ??A). " + "t() -> " + " \"{ 34 , [ $1 , 2730 ] , \\\"34\\\" , X . a , 2730 }\" = " + " ?M({34,\"1\\x{aaa}\",\"34\",X.a,$\\x{aaa}}), ok. ">>, + ok}, + + {otp_8130_2, + <<"-define(M(A), ??B). " + "t() -> B = 18, 18 = ?M(34), ok. ">>, + ok}, + + {otp_8130_2a, + <<"-define(m(A), ??B). " + "t() -> B = 18, 18 = ?m(34), ok. ">>, + ok}, + + {otp_8130_3, + <<"-define(M1(A, B), {A,B}).\n" + "t0() -> 1.\n" + "t() ->\n" + " {2,7} =\n" + " ?M1(begin 1 = fun() -> 1 end(),\n" % Bug -R13B01 + " 2 end,\n" + " 7),\n" + " {2,7} =\n" + " ?M1(begin 1 = fun t0/0(),\n" + " 2 end,\n" + " 7),\n" + " {2,7} =\n" + " ?M1(begin 2 = byte_size(<<\"34\">>),\n" + " 2 end,\n" + " 7),\n" + " R2 = math:sqrt(2.0),\n" + " {2,7} =\n" + " ?M1(begin yes = if R2 > 1 -> yes end,\n" + " 2 end,\n" + " 7),\n" + " {2,7} =\n" + " ?M1(begin yes = case R2 > 1 of true -> yes end,\n" + " 2 end,\n" + " 7),\n" + " {2,7} =\n" + " ?M1(begin yes = receive 1 -> 2 after 0 -> yes end,\n" + " 2 end,\n" + " 7),\n" + " {2,7} =\n" + " ?M1(begin yes = try 1 of 1 -> yes after foo end,\n" + " 2 end,\n" + " 7),\n" + "ok.\n">>, + ok}, + + {otp_8130_4, + <<"-define(M3(), A).\n" + "t() -> A = 1, ?M3(), ok.\n">>, + ok}, + + {otp_8130_5, + <<"-include_lib(\"$epp_inc1/include/qlc.hrl\").\n" + "t() -> [1] = qlc:e(qlc:q([X || X <- [1]])), ok.\n">>, + ok}, + + {otp_8130_6, + <<"-include_lib(\"kernel/include/file.hrl\").\n" + "t() -> 14 = (#file_info{size = 14})#file_info.size, ok.\n">>, + ok}, + + {otp_8130_7, + <<"-record(b, {b}).\n" + "-define(A, {{a,#b.b.\n" + "t() -> {{a,2}} = ?A}}, ok.">>, + ok}, + + {otp_8130_8, + <<"\n-define(A(B), B).\n" + "-undef(A).\n" + "-define(A, ok).\n" + "t() -> ?A.\n">>, + ok}, + {otp_8130_9, + <<"-define(a, 1).\n" + "-define(b, {?a,?a}).\n" + "t() -> ?b.\n">>, + {1,1}} + + ], + ?line [] = run(Config, Ts), + + Cs = [{otp_8130_c1, + <<"-define(M1(A), if\n" + "A =:= 1 -> B;\n" + "true -> 2\n" + "end).\n" + "t() -> {?M1(1), ?M1(2)}. \n">>, + {errors,[{{5,13},erl_lint,{unbound_var,'B'}}, + {{5,21},erl_lint,{unbound_var,'B'}}], + []}}, + + {otp_8130_c2, + <<"-define(M(A), A).\n" + "t() -> ?M(1\n">>, + {errors,[{{2,9},epp,{arg_error,'M'}}],[]}}, + + {otp_8130_c3, + <<"-define(M(A), A).\n" + "t() -> ?M.\n">>, + {errors,[{{2,9},epp,{mismatch,'M'}}],[]}}, + + {otp_8130_c4, + <<"-define(M(A), A).\n" + "t() -> ?M(1, 2).\n">>, + {errors,[{{2,9},epp,{mismatch,'M'}}],[]}}, + + {otp_8130_c5, + <<"-define(M(A), A).\n" + "t() -> ?M().\n">>, + {errors,[{{2,9},epp,{mismatch,'M'}}],[]}}, + + {otp_8130_c6, + <<"-define(M3(), A).\n" + "t() -> A = 1, ?3.14159}.\n">>, + {errors,[{{2,16},epp,{call,"?3.14159"}}],[]}}, + + {otp_8130_c7, + <<"\nt() -> ?A.\n">>, + {errors,[{{2,9},epp,{undefined,'A'}}],[]}}, + + {otp_8130_c8, + <<"\n-include_lib(\"$apa/foo.hrl\").\n">>, + {errors,[{{2,2},epp,{include,lib,"$apa/foo.hrl"}}],[]}}, + + + {otp_8130_c9, + <<"-define(S, ?S).\n" + "t() -> ?S.\n">>, + {errors,[{{2,9},epp,{circular,'S'}}],[]}}, + + {otp_8130_c10, + <<"\n-file.">>, + {errors,[{{2,2},epp,{bad,file}}],[]}}, + + {otp_8130_c11, + <<"\n-include_lib 92.">>, + {errors,[{{2,2},epp,{bad,include_lib}}],[]}}, + + {otp_8130_c12, + <<"\n-include_lib(\"kernel/include/fopp.hrl\").\n">>, + {errors,[{{2,2},epp,{include,lib,"kernel/include/fopp.hrl"}}],[]}}, + + {otp_8130_c13, + <<"\n-include(foo).\n">>, + {errors,[{{2,2},epp,{bad,include}}],[]}}, + + {otp_8130_c14, + <<"\n-undef({foo}).\n">>, + {errors,[{{2,2},epp,{bad,undef}}],[]}}, + + {otp_8130_c15, + <<"\n-define(a, 1).\n" + "-define(a, 1).\n">>, + {errors,[{{3,9},epp,{redefine,a}}],[]}}, + + {otp_8130_c16, + <<"\n-define(A, 1).\n" + "-define(A, 1).\n">>, + {errors,[{{3,9},epp,{redefine,'A'}}],[]}}, + + {otp_8130_c17, + <<"\n-define(A(B), B).\n" + "-define(A, 1).\n">>, + {errors,[{{3,9},epp,{redefine,'A'}}],[]}}, + + {otp_8130_c18, + <<"\n-define(A, 1).\n" + "-define(A(B), B).\n">>, + {errors,[{{3,9},epp,{redefine,'A'}}],[]}}, + + {otp_8130_c19, + <<"\n-define(a(B), B).\n" + "-define(a, 1).\n">>, + {errors,[{{3,9},epp,{redefine,a}}],[]}}, + + {otp_8130_c20, + <<"\n-define(a, 1).\n" + "-define(a(B), B).\n">>, + {errors,[{{3,9},epp,{redefine,a}}],[]}}, + + {otp_8130_c21, + <<"\n-define(A(B, B), B).\n">>, + {errors,[{{2,2},epp,{bad,define}}],[]}}, + + {otp_8130_c22, + <<"\n-define(a(B, B), B).\n">>, + {errors,[{{2,2},epp,{bad,define}}],[]}}, + + {otp_8130_c23, + <<"\n-file(?b, 3).\n">>, + {errors,[{{2,8},epp,{undefined,b}}],[]}}, + + {otp_8130_c24, + <<"\n-include(\"no such file.erl\").\n">>, + {errors,[{{2,2},epp,{include,file,"no such file.erl"}}],[]}} + + ], + ?line [] = compile(Config, Cs), + + Cks = [{otp_check_1, + <<"\n-include_lib(\"epp_test.erl\").\n">>, + [{error,{{2,2},epp,{depth,"include_lib"}}}]}, + + {otp_check_2, + <<"\n-include(\"epp_test.erl\").\n">>, + [{error,{{2,2},epp,{depth,"include"}}}]} + ], + ?line [] = check(Config, Cks), + + ?line Dir = ?config(priv_dir, Config), + ?line File = filename:join(Dir, "otp_8130.erl"), + ?line ok = file:write_file(File, + "-module(otp_8130).\n" + "-define(a, 3.14).\n" + "t() -> ?a.\n"), + ?line {ok,Epp} = epp:open(File, []), + ?line ['BASE_MODULE','BASE_MODULE_STRING','BEAM','FILE','LINE', + 'MACHINE','MODULE','MODULE_STRING'] = macs(Epp), + ?line {ok,[{'-',_},{atom,_,file}|_]} = epp:scan_erl_form(Epp), + ?line {ok,[{'-',_},{atom,_,module}|_]} = epp:scan_erl_form(Epp), + ?line {ok,[{atom,_,t}|_]} = epp:scan_erl_form(Epp), + ?line {eof,_} = epp:scan_erl_form(Epp), + ?line ['BASE_MODULE','BASE_MODULE_STRING','BEAM','FILE','LINE', + 'MACHINE','MODULE','MODULE_STRING',a] = macs(Epp), + ?line epp:close(Epp), + + %% escript + ModuleStr = "any_name", + Module = list_to_atom(ModuleStr), + fun() -> + PreDefMacros = [{'MODULE', Module, redefine}, + {'MODULE_STRING', ModuleStr, redefine}, + a, {b,2}], + ?line {ok,Epp2} = epp:open(File, [], PreDefMacros), + ?line [{atom,_,true}] = macro(Epp2, a), + ?line [{integer,_,2}] = macro(Epp2, b), + ?line false = macro(Epp2, c), + ?line epp:close(Epp2) + end(), + fun() -> + PreDefMacros = [{a,b,c}], + ?line {error,{bad,{a,b,c}}} = epp:open(File, [], PreDefMacros) + end(), + fun() -> + PreDefMacros = [a, {a,1}], + ?line {error,{redefine,a}} = epp:open(File, [], PreDefMacros) + end(), + fun() -> + PreDefMacros = [{a,1},a], + ?line {error,{redefine,a}} = epp:open(File, [], PreDefMacros) + end(), + + ?line {error,enoent} = epp:open("no such file", []), + ?line {error,enoent} = epp:parse_file("no such file", [], []), + + _ = ifdef(Config), + + ok. + +macs(Epp) -> + Macros = epp:macro_defs(Epp), % not documented + lists:sort([MName || {{atom,MName},_} <- Macros]). + +macro(Epp, N) -> + case lists:keyfind({atom,N}, 1, epp:macro_defs(Epp)) of + false -> false; + {{atom,N},{_,V}} -> V + end. + +ifdef(Config) -> + Cs = [{ifdef_c1, + <<"-ifdef(a).\n" + "a bug.\n" + "-else.\n" + "-ifdef(A).\n" + "a bug.\n" + "-endif.\n" + "-else.\n" + "t() -> ok.\n" + "-endif.">>, + {errors,[{{7,2},epp,{illegal,"repeated",'else'}}],[]}}, + + {ifdef_c2, + <<"-define(a, true).\n" + "-ifdef(a).\n" + "a bug.\n" + "-endif.">>, + {errors,[{{3,3},erl_parse,["syntax error before: ","bug"]}],[]}}, + + {ifdef_c3, + <<"-define(a, true).\n" + "-ifdef(a).\n" + "-endif">>, + + {errors,[{{3,2},epp,{bad,endif}}, + {{3,7},epp,{illegal,"unterminated",ifdef}}], + []}}, + + {ifdef_c4, + <<"\n-ifdef a.\n" + "-endif.\n">>, + {errors,[{{2,2},epp,{bad,ifdef}}],[]}}, + + {ifdef_c5, + <<"-ifdef(a).\n" + "-else.\n" + "-endif.\n" + "-endif.\n">>, + {errors,[{{4,2},epp,{illegal,"unbalanced",endif}}],[]}}, + + {ifdef_c6, + <<"-ifdef(a).\n" + "-else.\n" + "-endif.\n" + "-else.\n">>, + {errors,[{{4,2},epp,{illegal,"unbalanced",'else'}}],[]}}, + + {ifdef_c7, + <<"-ifndef(a).\n" + "-else\n" + "foo bar\n" + "-else.\n" + "t() -> a.\n" + "-endif.\n">>, + {errors,[{{2,2},epp,{bad,else}}],[]}}, + + {ifdef_c8, + <<"-ifdef(a).\n" + "-foo bar.">>, + {errors,[{{2,10},epp,{illegal,"unterminated",ifdef}}],[]}}, + + {ifdef_c9, + <<"-ifdef(a).\n" + "3.3e12000.\n" + "-endif.\n">>, + []}, + + {ifdef_c10, + <<"\nt() -> 3.3e12000.\n">>, + {errors,[{{2,8},erl_scan,{illegal,float}}, + {{2,17},erl_parse,["syntax error before: ","'.'"]}], % ... + []}}, + + {ifndef_c1, + <<"-ifndef(a).\n" + "-ifndef(A).\n" + "t() -> ok.\n" + "-endif.\n" + "-else.\n" + "a bug.\n" + "-else.\n" + "a bug.\n" + "-endif.">>, + {errors,[{{7,2},epp,{illegal,"repeated",'else'}}],[]}}, + + {ifndef_c3, + <<"-ifndef(a).\n" + "-endif">>, + + {errors,[{{2,2},epp,{bad,endif}}, + {{2,7},epp,{illegal,"unterminated",ifndef}}], + []}}, + + {ifndef_c4, + <<"\n-ifndef a.\n" + "-endif.\n">>, + {errors,[{{2,2},epp,{bad,ifndef}}],[]}}, + + {define_c5, + <<"-\ndefine a.\n">>, + {errors,[{{2,1},epp,{bad,define}}],[]}}, + + {define_c6, + <<"\n-if.\n" + "-endif.\n">>, + {errors,[{{2,2},epp,{'NYI','if'}}],[]}}, + + {define_c7, + <<"-ifndef(a).\n" + "-elif.\n" + "-endif.\n">>, + {errors,[{{2,2},epp,{'NYI',elif}}],[]}}, + + {define_c7, + <<"-ifndef(a).\n" + "-if.\n" + "-elif.\n" + "-endif.\n" + "-endif.\n" + "t() -> a.\n">>, + {errors,[{{2,2},epp,{'NYI','if'}}],[]}} + ], + ?line [] = compile(Config, Cs), + + Ts = [{ifdef_1, + <<"-ifdef(a).\n" + "a bug.\n" + "-else.\n" + "-ifdef(A).\n" + "a bug.\n" + "-endif.\n" + "t() -> ok.\n" + "-endif.">>, + ok}, + + {ifdef_2, + <<"-define(a, true).\n" + "-ifdef(a).\n" + "-define(A, true).\n" + "-ifdef(A).\n" + "t() -> ok.\n" + "-else.\n" + "a bug.\n" + "-endif.\n" + "-else.\n" + "a bug.\n" + "-endif.">>, + ok}, + + {ifdef_3, + <<"\n-define(a, true).\n" + "-ifndef(a).\n" + "a bug.\n" + "-else.\n" + "-define(A, true).\n" + "-ifndef(A).\n" + "a bug.\n" + "-else.\n" + "t() -> ok.\n" + "-endif.\n" + "-endif.">>, + ok}, + + {ifdef_4, + <<"-ifdef(a).\n" + "a bug.\n" + "-ifdef(a).\n" + "a bug.\n" + "-else.\n" + "-endif.\n" + "-ifdef(A).\n" + "a bug.\n" + "-endif.\n" + "-else.\n" + "t() -> ok.\n" + "-endif.">>, + ok}, + + {ifdef_5, + <<"-ifdef(a).\n" + "-ifndef(A).\n" + "a bug.\n" + "-else.\n" + "-endif.\n" + "a bug.\n" + "-else.\n" + "t() -> ok.\n" + "-endif.">>, + ok}, + + {ifdef_6, + <<"-ifdef(a).\n" + "-if(A).\n" + "a bug.\n" + "-else.\n" + "-endif.\n" + "a bug.\n" + "-else.\n" + "t() -> ok.\n" + "-endif.">>, + ok} + + ], + ?line [] = run(Config, Ts). + +check(Config, Tests) -> + eval_tests(Config, fun check_test/2, Tests). + +compile(Config, Tests) -> + eval_tests(Config, fun compile_test/2, Tests). + +run(Config, Tests) -> + eval_tests(Config, fun run_test/2, Tests). + +eval_tests(Config, Fun, Tests) -> + F = fun({N,P,E}, BadL) -> + %% io:format("Testing ~p~n", [P]), + Return = Fun(Config, P), + case message_compare(E, Return) of + true -> + BadL; + false -> + ?t:format("~nTest ~p failed. Expected~n ~p~n" + "but got~n ~p~n", [N, E, Return]), + fail() + end + end, + lists:foldl(F, [], Tests). + + +check_test(Config, Test) -> + Filename = 'epp_test.erl', + ?line PrivDir = ?config(priv_dir, Config), + ?line File = filename:join(PrivDir, Filename), + ?line ok = file:write_file(File, Test), + ?line case epp:parse_file(File, [PrivDir], []) of + {ok,Forms} -> + [E || E={error,_} <- Forms]; + {error,Error} -> + Error + end. + +compile_test(Config, Test0) -> + Test = [<<"-module(epp_test). -compile(export_all). ">>, Test0], + Filename = 'epp_test.erl', + ?line PrivDir = ?config(priv_dir, Config), + ?line File = filename:join(PrivDir, Filename), + ?line ok = file:write_file(File, Test), + Opts = [export_all,return,nowarn_unused_record,{outdir,PrivDir}], + case compile_file(File, Opts) of + {ok, Ws} -> warnings(File, Ws); + Else -> Else + end. + +warnings(File, Ws) -> + case lists:append([W || {F, W} <- Ws, F =:= File]) of + [] -> []; + L -> {warnings, L} + end. + +compile_file(File, Opts) -> + case compile:file(File, Opts) of + {ok, _M, Ws} -> {ok, Ws}; + {error, FEs, []} -> {errors, errs(FEs, File), []}; + {error, FEs, [{File,Ws}]} -> {error, errs(FEs, File), Ws} + end. + +errs([{File,Es}|L], File) -> + Es ++ errs(L, File); +errs([_|L], File) -> + errs(L, File); +errs([], _File) -> + []. + +run_test(Config, Test0) -> + Test = [<<"-module(epp_test). -compile(export_all). ">>, Test0], + Filename = "epp_test.erl", + ?line PrivDir = ?config(priv_dir, Config), + ?line File = filename:join(PrivDir, Filename), + ?line ok = file:write_file(File, Test), + Opts = [return, {i,PrivDir},{outdir,PrivDir}], + ?line {ok, epp_test, []} = compile:file(File, Opts), + AbsFile = filename:rootname(File, ".erl"), + ?line {module, epp_test} = code:load_abs(AbsFile, epp_test), + ?line Reply = epp_test:t(), + code:purge(epp_test), + Reply. + +fail() -> + io:format("failed~n"), + test_server:fail(). + +message_compare(T, T) -> + true; +message_compare(T1, T2) -> + ln(T1) =:= T2. + +%% Replaces locations like {Line,Column} with Line. +ln({warnings,L}) -> + {warnings,ln0(L)}; +ln({errors,EL,WL}) -> + {errors,ln0(EL),ln0(WL)}; +ln(L) -> + ln0(L). + +ln0(L) -> + lists:keysort(1, ln1(L)). + +ln1([]) -> + []; +ln1([{File,Ms}|MsL]) when is_list(File) -> + [{File,ln0(Ms)}|ln1(MsL)]; +ln1([M|Ms]) -> + [ln2(M)|ln1(Ms)]. + +ln2({{L,_C},Mod,Mess}) -> + {L,Mod,Mess}; +ln2({error,M}) -> + {error,ln2(M)}; +ln2(M) -> + M. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/erl_eval_helper.erl erlang-13.b.3-dfsg/lib/stdlib/test/erl_eval_helper.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/erl_eval_helper.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/erl_eval_helper.erl 2009-11-20 13:32:06.000000000 +0000 @@ -0,0 +1,28 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(erl_eval_helper, [Base]). + +-export([add/1]). + +add(Arg) -> + Base+Arg. + + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/erl_eval_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/erl_eval_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/erl_eval_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/erl_eval_SUITE.erl 2009-09-18 15:07:55.000000000 +0100 @@ -0,0 +1,1399 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(erl_eval_SUITE). +-export([all/1]). + +-export([guard_1/1, guard_2/1, + match_pattern/1, + match_bin/1, + string_plusplus/1, + pattern_expr/1, + guard_3/1, guard_4/1, + lc/1, + simple_cases/1, + unary_plus/1, + apply_atom/1, + otp_5269/1, + otp_6539/1, + otp_6543/1, + otp_6787/1, + otp_6977/1, + otp_7550/1, + otp_8133/1, + funs/1, + try_catch/1, + eval_expr_5/1]). + +%% +%% Define to run outside of test server +%% +%%-define(STANDALONE,1). + +-import(lists,[concat/1, sort/1]). + +-export([count_down/2, count_down_fun/0, do_apply/2, + local_func/3, local_func_value/2]). + +-ifdef(STANDALONE). +-define(config(A,B),config(A,B)). +-export([config/2]). +-define(line, noop, ). +config(priv_dir,_) -> + ".". +-else. +-include("test_server.hrl"). +-export([init_per_testcase/2, fin_per_testcase/2]). +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{watchdog, Dog} | Config]. +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. +-endif. + +all(doc) -> + ["Test cases for the 'erl_eval' module."]; +all(suite) -> + [guard_1, guard_2, match_pattern, string_plusplus, pattern_expr, + match_bin, guard_3, guard_4, + lc, simple_cases, unary_plus, apply_atom, otp_5269, otp_6539, otp_6543, + otp_6787, otp_6977, otp_7550, otp_8133, funs, try_catch, eval_expr_5]. + +guard_1(doc) -> + ["(OTP-2405)"]; +guard_1(suite) -> + []; +guard_1(Config) when is_list(Config) -> + ?line {ok,Tokens ,_} = + erl_scan:string("if a+4 == 4 -> yes; true -> no end. "), + ?line {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + ?line no = guard_1_compiled(), + ?line {value, no, []} = erl_eval:expr(Expr, []), + ok. + +guard_1_compiled() -> + if a+4 == 4 -> yes; true -> no end. + +guard_2(doc) -> + ["Similar to guard_1, but type-correct"]; +guard_2(suite) -> + []; +guard_2(Config) when is_list(Config) -> + ?line {ok,Tokens ,_} = + erl_scan:string("if 6+4 == 4 -> yes; true -> no end. "), + ?line {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + ?line no = guard_2_compiled(), + ?line {value, no, []} = erl_eval:expr(Expr, []), + ok. + +guard_2_compiled() -> + if 6+4 == 4 -> yes; true -> no end. + +string_plusplus(doc) -> + ["OTP-3069: syntactic sugar string ++ ..."]; +string_plusplus(suite) -> + []; +string_plusplus(Config) when is_list(Config) -> + ?line check(fun() -> case "abc" of "ab" ++ L -> L end end, + "case \"abc\" of \"ab\" ++ L -> L end. ", + "c"), + ?line check(fun() -> case "abcde" of "ab" ++ "cd" ++ L -> L end end, + "case \"abcde\" of \"ab\" ++ \"cd\" ++ L -> L end. ", + "e"), + ?line check(fun() -> case "abc" of [97, 98] ++ L -> L end end, + "case \"abc\" of [97, 98] ++ L -> L end. ", + "c"), + ok. + +match_pattern(doc) -> + ["OTP-2983: match operator in pattern"]; +match_pattern(suite) -> + []; +match_pattern(Config) when is_list(Config) -> + ?line check(fun() -> case {a, b} of {a, _X}=Y -> {x,Y} end end, + "case {a, b} of {a, X}=Y -> {x,Y} end. ", + {x, {a, b}}), + ?line check(fun() -> case {a, b} of Y={a, _X} -> {x,Y} end end, + "case {a, b} of Y={a, X} -> {x,Y} end. ", + {x, {a, b}}), + ?line check(fun() -> case {a, b} of Y={a, _X}=Z -> {Z,Y} end end, + "case {a, b} of Y={a, X}=Z -> {Z,Y} end. ", + {{a, b}, {a, b}}), + ?line check(fun() -> A = 4, B = 28, <<13:(A+(X=B))>>, X end, + "begin A = 4, B = 28, <<13:(A+(X=B))>>, X end.", + 28), + ok. + +match_bin(doc) -> + ["binary match problems"]; +match_bin(suite) -> + []; +match_bin(Config) when is_list(Config) -> + ?line check(fun() -> <<"abc">> = <<"abc">> end, + "<<\"abc\">> = <<\"abc\">>. ", + <<"abc">>), + ?line check(fun() -> + <> = <<2,"AB","CD">>, + {Size,B,Rest} + end, + "begin <> = <<2,\"AB\",\"CD\">>, " + "{Size,B,Rest} end. ", + {2,<<"AB">>,<<"CD">>}), + ok. + +pattern_expr(doc) -> + ["OTP-3144: compile-time expressions in pattern"]; +pattern_expr(suite) -> + []; +pattern_expr(Config) when is_list(Config) -> + ?line check(fun() -> case 4 of 2+2 -> ok end end, + "case 4 of 2+2 -> ok end. ", + ok), + ?line check(fun() -> case 2 of +2 -> ok end end, + "case 2 of +2 -> ok end. ", + ok), + ok. + +guard_3(doc) -> + ["OTP-4518."]; +guard_3(suite) -> + []; +guard_3(Config) when is_list(Config) -> + ?line check(fun() -> if false -> false; true -> true end end, + "if false -> false; true -> true end.", + true), + ?line check(fun() -> if <<"hej">> == <<"hopp">> -> true; + true -> false end end, + "begin if <<\"hej\">> == <<\"hopp\">> -> true; + true -> false end end.", + false), + ?line check(fun() -> if <<"hej">> == <<"hej">> -> true; + true -> false end end, + "begin if <<\"hej\">> == <<\"hej\">> -> true; + true -> false end end.", + true), + ok. + +guard_4(doc) -> + ["OTP-4885."]; +guard_4(suite) -> + []; +guard_4(Config) when is_list(Config) -> + ?line check(fun() -> if {erlang,'+'}(3,a) -> true ; true -> false end end, + "if {erlang,'+'}(3,a) -> true ; true -> false end.", + false), + ?line check(fun() -> if {erlang,is_integer}(3) -> true ; true -> false end + end, + "if {erlang,is_integer}(3) -> true ; true -> false end.", + true), + ?line check(fun() -> [X || X <- [1,2,3], erlang:is_integer(X)] end, + "[X || X <- [1,2,3], erlang:is_integer(X)].", + [1,2,3]), + ?line check(fun() -> if is_atom(is_integer(a)) -> true ; true -> false end + end, + "if is_atom(is_integer(a)) -> true ; true -> false end.", + true), + ?line check(fun() -> if {erlang,is_atom}({erlang,is_integer}(a)) -> true; + true -> false end end, + "if {erlang,is_atom}({erlang,is_integer}(a)) -> true; " + "true -> false end.", + true), + ?line check(fun() -> if is_atom(3+a) -> true ; true -> false end end, + "if is_atom(3+a) -> true ; true -> false end.", + false), + ?line check(fun() -> if erlang:is_atom(3+a) -> true ; true -> false end + end, + "if erlang:is_atom(3+a) -> true ; true -> false end.", + false), + ok. + + +lc(doc) -> + ["OTP-4518."]; +lc(suite) -> + []; +lc(Config) when is_list(Config) -> + ?line check(fun() -> X = 32, [X || X <- [1,2,3]] end, + "begin X = 32, [X || X <- [1,2,3]] end.", + [1,2,3]), + ?line check(fun() -> X = 32, + [X || <> <- [<<1:32>>,<<2:32>>,<<3:8>>]] end, + %% "binsize variable" ^ + "begin X = 32, + [X || <> <- [<<1:32>>,<<2:32>>,<<3:8>>]] end.", + [1,2]), + ?line check(fun() -> Y = 13,[X || {X,Y} <- [{1,2}]] end, + "begin Y = 13,[X || {X,Y} <- [{1,2}]] end.", + [1]), + ?line error_check("begin [A || X <- [{1,2}], 1 == A] end.", + {unbound_var,'A'}), + ?line error_check("begin X = 32, + [{Y,W} || X <- [1,2,32,Y=4], Z <- [1,2,W=3]] end.", + {unbound_var,'Y'}), + ?line error_check("begin X = 32,<> = <<100:X>> end.", + {unbound_var,'B'}), + ?line check(fun() -> [X || X <- [1,2,3,4], not (X < 2)] end, + "begin [X || X <- [1,2,3,4], not (X < 2)] end.", + [2,3,4]), + ?line check(fun() -> [X || X <- [true,false], X] end, + "[X || X <- [true,false], X].", [true]), + ok. + +simple_cases(doc) -> + ["Simple cases, just to cover some code."]; +simple_cases(suite) -> + []; +simple_cases(Config) when is_list(Config) -> + ?line check(fun() -> A = $C end, "A = $C.", $C), + %% ?line check(fun() -> A = 3.14 end, "A = 3.14.", 3.14), + ?line check(fun() -> self() ! a, A = receive a -> true end end, + "begin self() ! a, A = receive a -> true end end.", + true), + ?line check(fun() -> c:flush(), self() ! a, self() ! b, self() ! c, + receive b -> b end, + {messages, [a,c]} = + erlang:process_info(self(), messages), + c:flush() end, + "begin c:flush(), self() ! a, self() ! b, self() ! c," + "receive b -> b end," + "{messages, [a,c]} =" + " erlang:process_info(self(), messages), c:flush() end.", + ok), + ?line check(fun() -> self() ! a, A = receive a -> true + after 0 -> false end end, + "begin self() ! a, A = receive a -> true" + " after 0 -> false end end.", + true), + ?line check(fun() -> c:flush(), self() ! a, self() ! b, self() ! c, + receive b -> b after 0 -> true end, + {messages, [a,c]} = + erlang:process_info(self(), messages), + c:flush() end, + "begin c:flush(), self() ! a, self() ! b, self() ! c," + "receive b -> b after 0 -> true end," + "{messages, [a,c]} =" + " erlang:process_info(self(), messages), c:flush() end.", + ok), + ?line check(fun() -> receive _ -> true after 10 -> false end end, + "receive _ -> true after 10 -> false end.", + false), + ?line check(fun() -> F = fun(A) -> A end, true = 3 == F(3) end, + "begin F = fun(A) -> A end, true = 3 == F(3) end.", + true), + ?line check(fun() -> F = fun(A) -> A end, true = 3 == apply(F, [3]) end, + "begin F = fun(A) -> A end, true = 3 == apply(F,[3]) end.", + true), + ?line check(fun() -> catch throw(a) end, "catch throw(a).", a), + ?line check(fun() -> catch a end, "catch a.", a), + ?line check(fun() -> 4 == 3 end, "4 == 3.", false), + ?line check(fun() -> not true end, "not true.", false), + ?line check(fun() -> -3 end, "-3.", -3), + + ?line error_check("3.0 = 4.0.", {badmatch,4.0}), + ?line check(fun() -> <<(3.0+2.0):32/float>> = <<5.0:32/float>> end, + "<<(3.0+2.0):32/float>> = <<5.0:32/float>>.", + <<5.0:32/float>>), + + ?line check(fun() -> false andalso kludd end, "false andalso kludd.", + false), + ?line check(fun() -> true andalso true end, "true andalso true.", + true), + ?line check(fun() -> true andalso false end, "true andalso false.", + false), + ?line check(fun() -> true andalso kludd end, "true andalso kludd.", + kludd), + ?line error_check("kladd andalso kludd.", {badarg,kladd}), + + ?line check(fun() -> if false andalso kludd -> a; true -> b end end, + "if false andalso kludd -> a; true -> b end.", + b), + ?line check(fun() -> if true andalso true -> a; true -> b end end, + "if true andalso true -> a; true -> b end.", + a), + ?line check(fun() -> if true andalso false -> a; true -> b end end, + "if true andalso false -> a; true -> b end.", + b), + + ?line check(fun() -> true orelse kludd end, + "true orelse kludd.", true), + ?line check(fun() -> false orelse false end, + "false orelse false.", false), + ?line check(fun() -> false orelse true end, + "false orelse true.", true), + ?line check(fun() -> false orelse kludd end, + "false orelse kludd.", kludd), + ?line error_check("kladd orelse kludd.", {badarg,kladd}), + ?line error_check("[X || X <- [1,2,3], begin 1 end].",{bad_filter,1}), + ?line error_check("[X || X <- a].",{bad_generator,a}), + + ?line check(fun() -> if true orelse kludd -> a; true -> b end end, + "if true orelse kludd -> a; true -> b end.", a), + ?line check(fun() -> if false orelse false -> a; true -> b end end, + "if false orelse false -> a; true -> b end.", b), + ?line check(fun() -> if false orelse true -> a; true -> b end end, + "if false orelse true -> a; true -> b end.", a), + + ?line check(fun() -> [X || X <- [1,2,3], X+2] end, + "[X || X <- [1,2,3], X+2].", []), + + ?line check(fun() -> [X || X <- [1,2,3], [X] == [X || X <- [2]]] end, + "[X || X <- [1,2,3], [X] == [X || X <- [2]]].", + [2]), + ?line check(fun() -> F = fun(1) -> ett; (2) -> zwei end, + ett = F(1), zwei = F(2) end, + "begin F = fun(1) -> ett; (2) -> zwei end, + ett = F(1), zwei = F(2) end.", + zwei), + ?line check(fun() -> F = fun(X) when X == 1 -> ett; + (X) when X == 2 -> zwei end, + ett = F(1), zwei = F(2) end, + "begin F = fun(X) when X == 1 -> ett; + (X) when X == 2 -> zwei end, + ett = F(1), zwei = F(2) end.", + zwei), + ?line error_check("begin F = fun(1) -> ett end, zwei = F(2) end.", + function_clause), + ?line check(fun() -> if length([1]) == 1 -> yes; + true -> no end end, + "if length([1]) == 1 -> yes; + true -> no end.", + yes), + ?line check(fun() -> if is_integer(3) -> true; true -> false end end, + "if is_integer(3) -> true; true -> false end.", true), + ?line check(fun() -> if integer(3) -> true; true -> false end end, + "if integer(3) -> true; true -> false end.", true), + ?line check(fun() -> if is_float(3) -> true; true -> false end end, + "if is_float(3) -> true; true -> false end.", false), + ?line check(fun() -> if float(3) -> true; true -> false end end, + "if float(3) -> true; true -> false end.", false), + ?line check(fun() -> if is_number(3) -> true; true -> false end end, + "if is_number(3) -> true; true -> false end.", true), + ?line check(fun() -> if number(3) -> true; true -> false end end, + "if number(3) -> true; true -> false end.", true), + ?line check(fun() -> if is_atom(a) -> true; true -> false end end, + "if is_atom(a) -> true; true -> false end.", true), + ?line check(fun() -> if atom(a) -> true; true -> false end end, + "if atom(a) -> true; true -> false end.", true), + ?line check(fun() -> if is_list([]) -> true; true -> false end end, + "if is_list([]) -> true; true -> false end.", true), + ?line check(fun() -> if list([]) -> true; true -> false end end, + "if list([]) -> true; true -> false end.", true), + ?line check(fun() -> if is_tuple({}) -> true; true -> false end end, + "if is_tuple({}) -> true; true -> false end.", true), + ?line check(fun() -> if tuple({}) -> true; true -> false end end, + "if tuple({}) -> true; true -> false end.", true), + ?line check(fun() -> if is_pid(self()) -> true; true -> false end end, + "if is_pid(self()) -> true; true -> false end.", true), + ?line check(fun() -> if pid(self()) -> true; true -> false end end, + "if pid(self()) -> true; true -> false end.", true), + ?line check(fun() -> R = make_ref(), if is_reference(R) -> true; + true -> false end end, + "begin R = make_ref(), if is_reference(R) -> true;" + "true -> false end end.", true), + ?line check(fun() -> R = make_ref(), if reference(R) -> true; + true -> false end end, + "begin R = make_ref(), if reference(R) -> true;" + "true -> false end end.", true), + ?line check(fun() -> if is_port(a) -> true; true -> false end end, + "if is_port(a) -> true; true -> false end.", false), + ?line check(fun() -> if port(a) -> true; true -> false end end, + "if port(a) -> true; true -> false end.", false), + ?line check(fun() -> if is_function(a) -> true; true -> false end end, + "if is_function(a) -> true; true -> false end.", false), + ?line check(fun() -> if function(a) -> true; true -> false end end, + "if function(a) -> true; true -> false end.", false), + ?line check(fun() -> if is_binary(<<>>) -> true; true -> false end end, + "if is_binary(<<>>) -> true; true -> false end.", true), + ?line check(fun() -> if binary(<<>>) -> true; true -> false end end, + "if binary(<<>>) -> true; true -> false end.", true), + ?line check(fun() -> if is_integer(a) == true -> yes; + true -> no end end, + "if is_integer(a) == true -> yes; + true -> no end.", + no), + ?line check(fun() -> if [] -> true; true -> false end end, + "if [] -> true; true -> false end.", false), + ?line error_check("if lists:member(1,[1]) -> true; true -> false end.", + illegal_guard_expr), + ?line error_check("if false -> true end.", if_clause), + ?line check(fun() -> if a+b -> true; true -> false end end, + "if a + b -> true; true -> false end.", false), + ?line check(fun() -> if + b -> true; true -> false end end, + "if + b -> true; true -> false end.", false), + ?line error_check("case foo of bar -> true end.", {case_clause,foo}), + ?line error_check("case 4 of 2+a -> true; _ -> false end.", + illegal_pattern), + ?line error_check("case 4 of +a -> true; _ -> false end.", + illegal_pattern), + ?line check(fun() -> case a of + X when X == b -> one; + X when X == a -> two + end end, + "begin case a of + X when X == b -> one; + X when X == a -> two + end end.", two), + ?line error_check("3 = 4.", {badmatch,4}), + ?line error_check("a = 3.", {badmatch,3}), + %% ?line error_check("3.1 = 2.7.",{badmatch,2.7}), + ?line error_check("$c = 4.", {badmatch,4}), + ?line check(fun() -> $c = $c end, "$c = $c.", $c), + ?line check(fun() -> _ = bar end, "_ = bar.", bar), + ?line check(fun() -> A = 14, A = 14 end, + "begin A = 14, A = 14 end.", 14), + ?line error_check("begin A = 14, A = 16 end.", {badmatch,16}), + ?line error_check("\"hej\" = \"san\".", {badmatch,"san"}), + ?line check(fun() -> "hej" = "hej" end, + "\"hej\" = \"hej\".", "hej"), + ?line error_check("[] = [a].", {badmatch,[a]}), + ?line check(fun() -> [] = [] end, "[] = [].", []), + ?line error_check("[a] = [].", {badmatch,[]}), + ?line error_check("{a,b} = 34.", {badmatch,34}), + ?line check(fun() -> <> = <<8:7>>, X end, + "begin <> = <<8:7>>, X end.", 8), + ?line error_check("<<34:32>> = \"hej\".", {badmatch,"hej"}), + ?line check(fun() -> trunc((1 * 3 div 3 + 4 - 3) / 1) rem 2 end, + "begin trunc((1 * 3 div 3 + 4 - 3) / 1) rem 2 end.", 0), + ?line check(fun() -> (2#101 band 2#10101) bor (2#110 bxor 2#010) end, + "(2#101 band 2#10101) bor (2#110 bxor 2#010).", 5), + ?line check(fun() -> (2#1 bsl 4) + (2#10000 bsr 3) end, + "(2#1 bsl 4) + (2#10000 bsr 3).", 18), + ?line check(fun() -> ((1<3) and ((1 =:= 2) or (1 =/= 2))) xor (1=<2) end, + "((1<3) and ((1 =:= 2) or (1 =/= 2))) xor (1=<2).", false), + ?line check(fun() -> (a /= b) or (2 > 4) or (3 >= 3) end, + "(a /= b) or (2 > 4) or (3 >= 3).", true), + ?line check(fun() -> "hej" ++ "san" =/= "hejsan" -- "san" end, + "\"hej\" ++ \"san\" =/= \"hejsan\" -- \"san\".", true), + ?line check(fun() -> (bnot 1) < -0 end, "(bnot (+1)) < -0.", true), + ok. + +unary_plus(doc) -> + ["OTP-4929. Unary plus rejects non-numbers."]; +unary_plus(suite) -> + []; +unary_plus(Config) when is_list(Config) -> + ?line check(fun() -> F = fun(X) -> + X end, + true = -1 == F(-1) end, + "begin F = fun(X) -> + X end," + " true = -1 == F(-1) end.", true, ['F'], none, none), + ?line error_check("+a.", badarith), + ok. + +apply_atom(doc) -> + ["OTP-5064. Can no longer apply atoms."]; +apply_atom(suite) -> + []; +apply_atom(Config) when is_list(Config) -> + ?line error_check("[X || X <- [[1],[2]], + begin L = length, L(X) =:= 1 end].", + {badfun,length}), + ok. + +otp_5269(doc) -> + ["OTP-5269. Bugs in the bit syntax."]; +otp_5269(suite) -> + []; +otp_5269(Config) when is_list(Config) -> + ?line check(fun() -> L = 8, + F = fun(<>) -> B end, + F(<<16:8, 7:16>>) + end, + "begin + L = 8, F = fun(<>) -> B end, F(<<16:8, 7:16>>) + end.", + 7), + ?line check(fun() -> L = 8, + F = fun(<>) -> B end, + F(<<16:8, 7:16>>) + end, + "begin + L = 8, F = fun(<>) -> B end, F(<<16:8, 7:16>>) + end.", + 7), + ?line check(fun() -> L = 8, <> = <<16:8, 7:16>>, B end, + "begin L = 8, <> = <<16:8, 7:16>>, B end.", + 7), + ?line error_check("begin L = 8, <> = <<16:8, 7:16>> end.", + {badmatch,<<16:8,7:16>>}), + + ?line error_check("begin <> = <<16:16,8:16>>, L end.", + {badmatch, <<16:16,8:16>>}), + ?line check(fun() -> U = 8, (fun(<>) -> U end)(<<32:8>>) end, + "begin U = 8, (fun(<>) -> U end)(<<32:8>>) end.", + 32), + ?line check(fun() -> U = 8, [U || <> <- [<<32:8>>]] end, + "begin U = 8, [U || <> <- [<<32:8>>]] end.", + [32]), + ?line error_check("(fun({3,<>}) -> a end) + ({3,<<17:32,19:32>>}).", + function_clause), + ?line check(fun() -> [X || <> <- [<<16:8,19:16>>], + <> <- [<>]] end, + "[X || <> <- [<<16:8,19:16>>], + <> <- [<>]].", + [19]), + ok. + +otp_6539(doc) -> + ["OTP-6539. try/catch bugs."]; +otp_6539(suite) -> + []; +otp_6539(Config) when is_list(Config) -> + ?line check(fun() -> + F = fun(A,B) -> + try A+B + catch _:_ -> dontthinkso + end + end, + lists:zipwith(F, [1,2], [2,3]) + end, + "begin + F = fun(A,B) -> + try A+B + catch _:_ -> dontthinkso + end + end, + lists:zipwith(F, [1,2], [2,3]) + end.", + [3, 5]), + ok. + +otp_6543(doc) -> + ["OTP-6543. bitlevel binaries."]; +otp_6543(suite) -> + []; +otp_6543(Config) when is_list(Config) -> + ?line check(fun() -> + << <> || <> <- [1,2,3] >> + end, + "<< <> || <> <- [1,2,3] >>.", + <<>>), + ?line check(fun() -> + << <> || X <- [1,2,3] >> + end, + "<< <> || X <- [1,2,3] >>.", + <<1,2,3>>), + ?line check(fun() -> + << <> || <> <= <<"hej">> >> + end, + "<< <> || <> <= <<\"hej\">> >>.", + <<1,2,2,0,1,2,1,1,1,2,2,2>>), + ?line check(fun() -> + << <> || + <<65,X:4>> <= <<65,7:4,65,3:4,66,8:4>> >> + end, + "<< <> || + <<65,X:4>> <= <<65,7:4,65,3:4,66,8:4>> >>.", + <<7,3>>), + ?line check(fun() -> <<34:18/big>> end, + "<<34:18/big>>.", + <<0,8,2:2>>), + ?line check(fun() -> <<34:18/big-unit:2>> end, + "<<34:18/big-unit:2>>.", + <<0,0,0,2,2:4>>), + ?line check(fun() -> <<34:18/little>> end, + "<<34:18/little>>.", + <<34,0,0:2>>), + ?line case eval_string("<<34:18/native>>.") of + <<0,8,2:2>> -> ok; + <<34,0,0:2>> -> ok + end, + ?line check(fun() -> <<34:18/big-signed>> end, + "<<34:18/big-signed>>.", + <<0,8,2:2>>), + ?line check(fun() -> <<34:18/little-signed>> end, + "<<34:18/little-signed>>.", + <<34,0,0:2>>), + ?line case eval_string("<<34:18/native-signed>>.") of + <<0,8,2:2>> -> ok; + <<34,0,0:2>> -> ok + end, + ?line check(fun() -> <<34:18/big-unsigned>> end, + "<<34:18/big-unsigned>>.", + <<0,8,2:2>>), + ?line check(fun() -> <<34:18/little-unsigned>> end, + "<<34:18/little-unsigned>>.", + <<34,0,0:2>>), + ?line case eval_string("<<34:18/native-unsigned>>.") of + <<0,8,2:2>> -> ok; + <<34,0,0:2>> -> ok + end, + ?line check(fun() -> <<3.14:32/float-big>> end, + "<<3.14:32/float-big>>.", + <<64,72,245,195>>), + ?line check(fun() -> <<3.14:32/float-little>> end, + "<<3.14:32/float-little>>.", + <<195,245,72,64>>), + ?line case eval_string("<<3.14:32/float-native>>.") of + <<64,72,245,195>> -> ok; + <<195,245,72,64>> -> ok + end, + ?line error_check("<<(<<17,3:2>>)/binary>>.", badarg), + ?line check(fun() -> <<(<<17,3:2>>)/bitstring>> end, + "<<(<<17,3:2>>)/bitstring>>.", + <<17,3:2>>), + ?line check(fun() -> <<(<<17,3:2>>):10/bitstring>> end, + "<<(<<17,3:2>>):10/bitstring>>.", + <<17,3:2>>), + ?line check(fun() -> <<<<344:17>>/binary-unit:17>> end, + "<<<<344:17>>/binary-unit:17>>.", + <<344:17>>), + + ?line check(fun() -> <> = <<34:18/big>>, X end, + "begin <> = <<34:18/big>>, X end.", + 34), + ?line check(fun() -> <> = <<34:18/big-unit:2>>, X end, + "begin <> = <<34:18/big-unit:2>>, X end.", + 34), + ?line check(fun() -> <> = <<34:18/little>>, X end, + "begin <> = <<34:18/little>>, X end.", + 34), + ?line check(fun() -> <> = <<34:18/native>>, X end, + "begin <> = <<34:18/native>>, X end.", + 34), + ?line check(fun() -> <> = <<34:18/big-signed>>, X end, + "begin <> = <<34:18/big-signed>>, X end.", + 34), + ?line check(fun() -> <> = <<34:18/little-signed>>, + X end, + "begin <> = <<34:18/little-signed>>, + X end.", + 34), + ?line check(fun() -> <> = <<34:18/native-signed>>, + X end, + "begin <> = <<34:18/native-signed>>, + X end.", + 34), + ?line check(fun() -> <> = <<34:18/big-unsigned>>, + X end, + "begin <> = <<34:18/big-unsigned>>, + X end.", + 34), + ?line check(fun() -> + <> = <<34:18/little-unsigned>>, + X end, + "begin <> = <<34:18/little-unsigned>>, + X end.", + 34), + ?line check(fun() -> + <> = <<34:18/native-unsigned>>, + X end, + "begin <> = <<34:18/native-unsigned>>, + X end.", + 34), + ?line check(fun() -> <> = <<2.0:32/float-big>>, X end, + "begin <> = <<2.0:32/float-big>>, + X end.", + 2.0), + ?line check(fun() -> <> = <<2.0:32/float-little>>, + X end, + "begin <> = <<2.0:32/float-little>>, + X end.", + 2.0), + ?line check(fun() -> <> = <<2.0:32/float-native>>, + X end, + "begin <> = <<2.0:32/float-native>>, + X end.", + 2.0), + + ?line check( + fun() -> + [X || <<"hej",X:8>> <= <<"hej",8,"san",9,"hej",17,"hej">>] + end, + "[X || <<\"hej\",X:8>> <= + <<\"hej\",8,\"san\",9,\"hej\",17,\"hej\">>].", + [8,17]), + ?line check( + fun() -> + L = 8, << <> || <> <= <<16:8, 7:16>> >> + end, + "begin L = 8, << <> || <> <= <<16:8, 7:16>> >> + end.", + <<0,0,0,7>>), + %% Test the Value part of a binary segment. + %% "Old" bugs have been fixed (partial_eval is called on Value). + ?line check(fun() -> [ 3 || <<17/float>> <= <<17.0/float>>] end, + "[ 3 || <<17/float>> <= <<17.0/float>>].", + [3]), + ?line check(fun() -> [ 3 || <<17/float>> <- [<<17.0/float>>]] end, + "[ 3 || <<17/float>> <- [<<17.0/float>>]].", + [3]), + ?line check(fun() -> [ X || <<17/float,X:3>> <= <<17.0/float,2:3>>] end, + "[ X || <<17/float,X:3>> <= <<17.0/float,2:3>>].", + [2]), + ?line check(fun() -> + [ foo || <<(1 bsl 1023)/float>> <= <<(1 bsl 1023)/float>>] + end, + "[ foo || <<(1 bsl 1023)/float>> <= <<(1 bsl 1023)/float>>].", + [foo]), + ?line check(fun() -> + [ foo || <<(1 bsl 1023)/float>> <- [<<(1 bsl 1023)/float>>]] + end, + "[ foo || <<(1 bsl 1023)/float>> <- [<<(1 bsl 1023)/float>>]].", + [foo]), + ?line error_check("[ foo || <<(1 bsl 1024)/float>> <- + [<<(1 bsl 1024)/float>>]].", + badarg), + ?line check(fun() -> + [ foo || <<(1 bsl 1024)/float>> <- [<<(1 bsl 1023)/float>>]] + end, + "[ foo || <<(1 bsl 1024)/float>> <- + [<<(1 bsl 1023)/float>>]].", + []), + ?line check(fun() -> + [ foo || <<(1 bsl 1024)/float>> <= <<(1 bsl 1023)/float>>] + end, + "[ foo || <<(1 bsl 1024)/float>> <= + <<(1 bsl 1023)/float>>].", + []), + ?line check(fun() -> + L = 8, + [{L,B} || <> <= <<32:8,7:32/float>>] + end, + "begin L = 8, + [{L,B} || <> <= <<32:8,7:32/float>>] + end.", + [{32,7.0}]), + ?line check(fun() -> + L = 8, + [{L,B} || <> <- [<<32:8,7:32/float>>]] + end, + "begin L = 8, + [{L,B} || <> <- [<<32:8,7:32/float>>]] + end.", + [{32,7.0}]), + ?line check(fun() -> + [foo || <<"s">> <= <<"st">>] + end, + "[foo || <<\"s\">> <= <<\"st\">>].", + [foo]), + ?line check(fun() -> <<_:32>> = <<17:32>> end, + "<<_:32>> = <<17:32>>.", + <<17:32>>), + ?line check(fun() -> [foo || <<_:32>> <= <<17:32,20:32>>] end, + "[foo || <<_:32>> <= <<17:32,20:32>>].", + [foo,foo]), + + ?line check(fun() -> << <> || X <- [1,2,3], X > 1 >> end, + "<< <> || X <- [1,2,3], X > 1 >>.", + <<0,0,0,2,0,0,0,3>>), + ?line error_check("[X || <> <= [a,b]].",{bad_generator,[a,b]}), + ok. + +otp_6787(doc) -> + ["OTP-6787. bitlevel binaries."]; +otp_6787(suite) -> + []; +otp_6787(Config) when is_list(Config) -> + ?line check( + fun() -> <<16:(1024*1024)>> = <<16:(1024*1024)>> end, + "<<16:(1024*1024)>> = <<16:(1024*1024)>>.", + <<16:1048576>>), + ok. + +otp_6977(doc) -> + ["OTP-6977. ++ bug."]; +otp_6977(suite) -> + []; +otp_6977(Config) when is_list(Config) -> + ?line check( + fun() -> (fun([$X] ++ _) -> ok end)("X") end, + "(fun([$X] ++ _) -> ok end)(\"X\").", + ok), + ok. + +otp_7550(doc) -> + ["OTP-7550. Support for UTF-8, UTF-16, UTF-32."]; +otp_7550(Config) when is_list(Config) -> + + %% UTF-8. + ?line check( + fun() -> <<65>> = <<65/utf8>> end, + "<<65>> = <<65/utf8>>.", + <<65>>), + ?line check( + fun() -> <<350/utf8>> = <<197,158>> end, + "<<350/utf8>> = <<197,158>>.", + <<197,158>>), + ?line check( + fun() -> <<$b,$j,$\303,$\266,$r,$n>> = <<"bj\366rn"/utf8>> end, + "<<$b,$j,$\303,$\266,$r,$n>> = <<\"bj\366rn\"/utf8>>.", + <<$b,$j,$\303,$\266,$r,$n>>), + + %% UTF-16. + ?line check( + fun() -> <<0,65>> = <<65/utf16>> end, + "<<0,65>> = <<65/utf16>>.", + <<0,65>>), + ?line check( + fun() -> <<16#D8,16#08,16#DF,16#45>> = <<16#12345/utf16>> end, + "<<16#D8,16#08,16#DF,16#45>> = <<16#12345/utf16>>.", + <<16#D8,16#08,16#DF,16#45>>), + ?line check( + fun() -> <<16#08,16#D8,16#45,16#DF>> = <<16#12345/little-utf16>> end, + "<<16#08,16#D8,16#45,16#DF>> = <<16#12345/little-utf16>>.", + <<16#08,16#D8,16#45,16#DF>>), + + ?line check( + fun() -> <<350/utf16>> = <<1,94>> end, + "<<350/utf16>> = <<1,94>>.", + <<1,94>>), + ?line check( + fun() -> <<350/little-utf16>> = <<94,1>> end, + "<<350/little-utf16>> = <<94,1>>.", + <<94,1>>), + ?line check( + fun() -> <<16#12345/utf16>> = <<16#D8,16#08,16#DF,16#45>> end, + "<<16#12345/utf16>> = <<16#D8,16#08,16#DF,16#45>>.", + <<16#D8,16#08,16#DF,16#45>>), + ?line check( + fun() -> <<16#12345/little-utf16>> = <<16#08,16#D8,16#45,16#DF>> end, + "<<16#12345/little-utf16>> = <<16#08,16#D8,16#45,16#DF>>.", + <<16#08,16#D8,16#45,16#DF>>), + + %% UTF-32. + ?line check( + fun() -> <<16#12345/utf32>> = <<16#0,16#01,16#23,16#45>> end, + "<<16#12345/utf32>> = <<16#0,16#01,16#23,16#45>>.", + <<16#0,16#01,16#23,16#45>>), + ?line check( + fun() -> <<16#0,16#01,16#23,16#45>> = <<16#12345/utf32>> end, + "<<16#0,16#01,16#23,16#45>> = <<16#12345/utf32>>.", + <<16#0,16#01,16#23,16#45>>), + ?line check( + fun() -> <<16#12345/little-utf32>> = <<16#45,16#23,16#01,16#00>> end, + "<<16#12345/little-utf32>> = <<16#45,16#23,16#01,16#00>>.", + <<16#45,16#23,16#01,16#00>>), + ?line check( + fun() -> <<16#12345/little-utf32>> end, + "<<16#12345/little-utf32>>.", + <<16#45,16#23,16#01,16#00>>), + + %% Mixed. + ?line check( + fun() -> <<16#41,16#12345/utf32,16#0391:16,16#2E:8>> end, + "<<16#41,16#12345/utf32,16#0391:16,16#2E:8>>.", + <<16#41,16#00,16#01,16#23,16#45,16#03,16#91,16#2E>>), + ok. + + +otp_8133(doc) -> + ["OTP-8133. Bit comprehension bug."]; +otp_8133(suite) -> + []; +otp_8133(Config) when is_list(Config) -> + ?line check( + fun() -> + E = fun(N) -> + if + is_integer(N) -> <>; + true -> throw(foo) + end + end, + try << << (E(V))/binary >> || V <- [1,2,3,a] >> + catch foo -> ok + end + end, + "begin + E = fun(N) -> + if is_integer(N) -> <>; + true -> throw(foo) + end + end, + try << << (E(V))/binary >> || V <- [1,2,3,a] >> + catch foo -> ok + end + end.", + ok), + ?line check( + fun() -> + E = fun(N) -> + if + is_integer(N) -> <>; + true -> erlang:error(foo) + end + end, + try << << (E(V))/binary >> || V <- [1,2,3,a] >> + catch error:foo -> ok + end + end, + "begin + E = fun(N) -> + if is_integer(N) -> <>; + true -> erlang:error(foo) + end + end, + try << << (E(V))/binary >> || V <- [1,2,3,a] >> + catch error:foo -> ok + end + end.", + ok), + ok. + +funs(doc) -> + ["Simple cases, just to cover some code."]; +funs(suite) -> + []; +funs(Config) when is_list(Config) -> + do_funs(none, none), + do_funs(lfh(), none), + do_funs(lfh(), efh()), + + ?line error_check("nix:foo().", {access_not_allowed,nix}, lfh(), efh()), + ?line error_check("bar().", undef, none, none), + + ?line check(fun() -> F1 = fun(F,N) -> ?MODULE:count_down(F, N) end, + F1(F1, 1000) end, + "begin F1 = fun(F,N) -> count_down(F, N) end," + "F1(F1,1000) end.", + 0, ['F1'], lfh(), none), + + ?line check(fun() -> F1 = fun(F,N) -> ?MODULE:count_down(F, N) end, + F1(F1, 1000) end, + "begin F1 = fun(F,N) -> count_down(F, N) end," + "F1(F1,1000) end.", + 0, ['F1'], lfh_value(), none), + + ?line check(fun() -> F1 = fun(F,N) -> ?MODULE:count_down(F, N) end, + F1(F1, 1000) end, + "begin F1 = fun(F,N) -> count_down(F, N) end," + "F1(F1,1000) end.", + 0, ['F1'], lfh_value_extra(), none), + + ?line check(fun() -> F1 = fun(F,N) -> ?MODULE:count_down(F, N) end, + F1(F1, 1000) end, + "begin F1 = fun(F,N) -> count_down(F, N) end," + "F1(F1,1000) end.", + 0, ['F1'], {?MODULE,local_func_value}, none), + %% This is not documented, and only for backward compatibility (good!). + B0 = erl_eval:new_bindings(), + ?line check(fun() -> is_function(?MODULE:count_down_fun()) end, + "begin is_function(count_down_fun()) end.", + true, [], {?MODULE,local_func,[B0]},none), + + EF = fun({timer,sleep}, As) when length(As) == 1 -> exit({got_it,sleep}); + ({M,F}, As) -> apply(M, F, As) + end, + EFH = {value, EF}, + ?line error_check("apply(timer, sleep, [1]).", got_it, none, EFH), + ?line error_check("begin F = fun(T) -> timer:sleep(T) end,F(1) end.", + got_it, none, EFH), + ?line error_check("fun c/1.", undef), + ?line error_check("fun a:b/0().", undef), + + MaxArgs = 20, + ?line [true] = + lists:usort([run_many_args(SAs) || SAs <- many_args(MaxArgs)]), + ?line {'EXIT',{{argument_limit,_},_}} = + (catch run_many_args(many_args1(MaxArgs+1))), + ok. + +run_many_args({S, As}) -> + apply(eval_string(S), As) =:= As. + +many_args(N) -> + [many_args1(I) || I <- lists:seq(1, N)]. + +many_args1(N) -> + F = fun(L, P) -> + tl(lists:flatten([","++P++integer_to_list(E) || E <- L])) + end, + L = lists:seq(1, N), + T = F(L, "V"), + S = lists:flatten(io_lib:format("fun(~s) -> [~s] end.", [T, T])), + {S, L}. + +do_funs(LFH, EFH) -> + %% LFH is not really used by these examples... + + %% These tests do not prove that tail recursive functions really + %% work (that the process does not grow); one should also run them + %% manually with 1000 replaced by 1000000. + + M = atom_to_list(?MODULE), + ?line check(fun() -> F1 = fun(F,N) -> ?MODULE:count_down(F, N) end, + F1(F1, 1000) end, + concat(["begin F1 = fun(F,N) -> ", M, + ":count_down(F, N) end, F1(F1,1000) end."]), + 0, ['F1'], LFH, EFH), + ?line check(fun() -> F1 = fun(F,N) -> apply(?MODULE,count_down,[F,N]) + end, F1(F1, 1000) end, + concat(["begin F1 = fun(F,N) -> apply(", M, + ",count_down,[F, N]) end, F1(F1,1000) end."]), + 0, ['F1'], LFH, EFH), + ?line check(fun() -> F1 = fun(F,N) -> {?MODULE,count_down}(F,N) + end, F1(F1, 1000) end, + concat(["begin F1 = fun(F,N) -> {", M, + ",count_down}(F, N) end, F1(F1,1000) end."]), + 0, ['F1'], LFH, EFH), + ?line check(fun() -> F = fun(F,N) when N > 0 -> apply(F,[F,N-1]); + (_F,0) -> ok end, + F(F, 1000) + end, + "begin F = fun(F,N) when N > 0 -> apply(F,[F,N-1]);" + "(_F,0) -> ok end," + "F(F, 1000) end.", + ok, ['F'], LFH, EFH), + ?line check(fun() -> F = fun(F,N) when N > 0 -> + apply(erlang,apply,[F,[F,N-1]]); + (_F,0) -> ok end, + F(F, 1000) + end, + "begin F = fun(F,N) when N > 0 ->" + "apply(erlang,apply,[F,[F,N-1]]);" + "(_F,0) -> ok end," + "F(F, 1000) end.", + ok, ['F'], LFH, EFH), + ?line check(fun() -> F = count_down_fun(), + SF = fun(SF, F1, N) -> F(SF, F1, N) end, + SF(SF, F, 1000) end, + concat(["begin F = ", M, ":count_down_fun()," + "SF = fun(SF, F1, N) -> F(SF, F1, N) end," + "SF(SF, F, 1000) end."]), + ok, ['F','SF'], LFH, EFH), + + + ?line check(fun() -> F = fun(X) -> A = 1+X, {X,A} end, + true = {2,3} == F(2) end, + "begin F = fun(X) -> A = 1+X, {X,A} end, + true = {2,3} == F(2) end.", true, ['F'], LFH, EFH), + ?line check(fun() -> F = fun(X) -> {erlang,'+'}(X,2) end, + true = 3 == F(1) end, + "begin F = fun(X) -> {erlang,'+'}(X,2) end," + " true = 3 == F(1) end.", true, ['F'], + LFH, EFH), + ?line check(fun() -> F = fun(X) -> byte_size(X) end, + ?MODULE:do_apply(F,<<"hej">>) end, + concat(["begin F = fun(X) -> size(X) end,", + M,":do_apply(F,<<\"hej\">>) end."]), + 3, ['F'], LFH, EFH), + + ?line check(fun() -> F1 = fun(X, Z) -> {X,Z} end, + Z = 5, + F2 = fun(X, Y) -> F1(Z,{X,Y}) end, + F3 = fun(X, Y) -> {a,F1(Z,{X,Y})} end, + {5,{x,y}} = F2(x,y), + {a,{5,{y,x}}} = F3(y,x), + {5,{5,y}} = F2(Z,y), + true = {5,{x,5}} == F2(x,Z) end, + "begin F1 = fun(X, Z) -> {X,Z} end, + Z = 5, + F2 = fun(X, Y) -> F1(Z,{X,Y}) end, + F3 = fun(X, Y) -> {a,F1(Z,{X,Y})} end, + {5,{x,y}} = F2(x,y), + {a,{5,{y,x}}} = F3(y,x), + {5,{5,y}} = F2(Z,y), + true = {5,{x,5}} == F2(x,Z) end.", + true, ['F1','Z','F2','F3'], LFH, EFH), + ?line check(fun() -> F = fun(X) -> byte_size(X) end, + F2 = fun(Y) -> F(Y) end, + ?MODULE:do_apply(F2,<<"hej">>) end, + concat(["begin F = fun(X) -> size(X) end,", + "F2 = fun(Y) -> F(Y) end,", + M,":do_apply(F2,<<\"hej\">>) end."]), + 3, ['F','F2'], LFH, EFH), + ?line check(fun() -> Z = 5, F = fun(X) -> {Z,X} end, + F2 = fun(Z) -> F(Z) end, F2(3) end, + "begin Z = 5, F = fun(X) -> {Z,X} end, + F2 = fun(Z) -> F(Z) end, F2(3) end.", + {5,3},['F','F2','Z'], LFH, EFH), + ?line check(fun() -> F = fun(Z) -> Z end, + F2 = fun(X) -> F(X), Z = {X,X}, Z end, + {1,1} = F2(1), Z = 7, Z end, + "begin F = fun(Z) -> Z end, + F2 = fun(X) -> F(X), Z = {X,X}, Z end, + {1,1} = F2(1), Z = 7, Z end.", 7, ['F','F2','Z'], + LFH, EFH), + ?line check(fun() -> F = fun(F, N) -> [?MODULE:count_down(F,N) || X <-[1]] + end, F(F,2) end, + concat(["begin F = fun(F, N) -> [", M, + ":count_down(F,N) || X <-[1]] end, F(F,2) end."]), + [[[0]]], ['F'], LFH, EFH), + + %% Tests for a bug found by the Dialyzer - used to crash. + ?line check(fun() -> Pmod = erl_eval_helper:new(42), Pmod:add(5) end, + "begin Pmod = erl_eval_helper:new(42), Pmod:add(5) end.", + 47, + ['Pmod'], LFH, EFH), + ?line check(fun() -> Pmod = erl_eval_helper:new(42), B = Pmod:add(7), B end, + "begin Pmod = erl_eval_helper:new(42), B = Pmod:add(7), B end.", + 49, + ['B','Pmod'], LFH, EFH), + + ok. + +count_down(F, N) when N > 0 -> + F(F, N-1); +count_down(_F, N) -> + N. + +count_down_fun() -> + fun(SF,F,N) when N > 0 -> SF(SF,F,N-1); + (_SF,_F,_N) -> ok + end. + +do_apply(F, V) -> + F(V). + +lfh() -> + {eval, fun(F, As, Bs) -> local_func(F, As, Bs) end}. + +local_func(F, As0, Bs0) when is_atom(F) -> + {As,Bs} = erl_eval:expr_list(As0, Bs0, {eval,lfh()}), + case erlang:function_exported(?MODULE, F, length(As)) of + true -> + {value,apply(?MODULE, F, As),Bs}; + false -> + {value,apply(shell_default, F, As),Bs} + end. + +lfh_value_extra() -> + %% Not documented. + {value, fun(F, As) -> local_func_value(F, As) end, []}. + +lfh_value() -> + {value, fun(F, As) -> local_func_value(F, As) end}. + +local_func_value(F, As) when is_atom(F) -> + case erlang:function_exported(?MODULE, F, length(As)) of + true -> + apply(?MODULE, F, As); + false -> + apply(shell_default, F, As) + end. + +efh() -> + {value, fun(F, As) -> external_func(F, As) end}. + +external_func({M,_}, _As) when M == nix -> + exit({{access_not_allowed,M},[mfa]}); +external_func(F, As) when is_function(F) -> + apply(F, As); +external_func({M,F}, As) -> + apply(M, F, As). + + + +try_catch(doc) -> + ["Test try-of-catch-after-end statement"]; +try_catch(suite) -> + []; +try_catch(Config) when is_list(Config) -> + %% Match in of with catch + ?line check(fun() -> try 1 of 1 -> 2 catch _:_ -> 3 end end, + "try 1 of 1 -> 2 catch _:_ -> 3 end.", 2), + ?line check(fun() -> try 1 of 1 -> 2; 3 -> 4 catch _:_ -> 5 end end, + "try 1 of 1 -> 2; 3 -> 4 catch _:_ -> 5 end.", 2), + ?line check(fun() -> try 3 of 1 -> 2; 3 -> 4 catch _:_ -> 5 end end, + "try 3 of 1 -> 2; 3 -> 4 catch _:_ -> 5 end.", 4), + %% Just after + ?line check(fun () -> X = try 1 after put(try_catch, 2) end, + {X,get(try_catch)} end, + "begin X = try 1 after put(try_catch, 2) end, " + "{X,get(try_catch)} end.", {1,2}), + %% Match in of with after + ?line check(fun() -> X = try 1 of 1 -> 2 after put(try_catch, 3) end, + {X,get(try_catch)} end, + "begin X = try 1 of 1 -> 2 after put(try_catch, 3) end, " + "{X,get(try_catch)} end.", {2,3}), + ?line check(fun() -> X = try 1 of 1 -> 2; 3 -> 4 + after put(try_catch, 5) end, + {X,get(try_catch)} end, + "begin X = try 1 of 1 -> 2; 3 -> 4 " + " after put(try_catch, 5) end, " + " {X,get(try_catch)} end.", {2,5}), + ?line check(fun() -> X = try 3 of 1 -> 2; 3 -> 4 + after put(try_catch, 5) end, + {X,get(try_catch)} end, + "begin X = try 3 of 1 -> 2; 3 -> 4 " + " after put(try_catch, 5) end, " + " {X,get(try_catch)} end.", {4,5}), + %% Nomatch in of + ?line error_check("try 1 of 2 -> 3 catch _:_ -> 4 end.", + {try_clause,1}), + %% Nomatch in of with after + ?line check(fun () -> {'EXIT',{{try_clause,1},_}} = + begin catch try 1 of 2 -> 3 + after put(try_catch, 4) end end, + get(try_catch) end, + "begin {'EXIT',{{try_clause,1},_}} = " + " begin catch try 1 of 2 -> 3 " + " after put(try_catch, 4) end end, " + " get(try_catch) end. ", 4), + %% Exception in try + ?line check(fun () -> try 1=2 catch error:{badmatch,2} -> 3 end end, + "try 1=2 catch error:{badmatch,2} -> 3 end.", 3), + ?line check(fun () -> try 1=2 of 3 -> 4 + catch error:{badmatch,2} -> 5 end end, + "try 1=2 of 3 -> 4 " + "catch error:{badmatch,2} -> 5 end.", 5), + %% Exception in try with after + ?line check(fun () -> X = try 1=2 + catch error:{badmatch,2} -> 3 + after put(try_catch, 4) end, + {X,get(try_catch)} end, + "begin X = try 1=2 " + " catch error:{badmatch,2} -> 3 " + " after put(try_catch, 4) end, " + " {X,get(try_catch)} end. ", {3,4}), + ?line check(fun () -> X = try 1=2 of 3 -> 4 + catch error:{badmatch,2} -> 5 + after put(try_catch, 6) end, + {X,get(try_catch)} end, + "begin X = try 1=2 of 3 -> 4" + " catch error:{badmatch,2} -> 5 " + " after put(try_catch, 6) end, " + " {X,get(try_catch)} end. ", {5,6}), + %% Uncaught exception + ?line error_check("try 1=2 catch error:undefined -> 3 end. ", + {badmatch,2}), + ?line error_check("try 1=2 of 3 -> 4 catch error:undefined -> 5 end. ", + {badmatch,2}), + %% Uncaught exception with after + ?line check(fun () -> {'EXIT',{{badmatch,2},_}} = + begin catch try 1=2 + after put(try_catch, 3) end end, + get(try_catch) end, + "begin {'EXIT',{{badmatch,2},_}} = " + " begin catch try 1=2 " + " after put(try_catch, 3) end end, " + " get(try_catch) end. ", 3), + ?line check(fun () -> {'EXIT',{{badmatch,2},_}} = + begin catch try 1=2 of 3 -> 4 + after put(try_catch, 5) end end, + get(try_catch) end, + "begin {'EXIT',{{badmatch,2},_}} = " + " begin catch try 1=2 of 3 -> 4" + " after put(try_catch, 5) end end, " + " get(try_catch) end. ", 5), + ?line check(fun () -> {'EXIT',{{badmatch,2},_}} = + begin catch try 1=2 catch error:undefined -> 3 + after put(try_catch, 4) end end, + get(try_catch) end, + "begin {'EXIT',{{badmatch,2},_}} = " + " begin catch try 1=2 catch error:undefined -> 3 " + " after put(try_catch, 4) end end, " + " get(try_catch) end. ", 4), + ?line check(fun () -> {'EXIT',{{badmatch,2},_}} = + begin catch try 1=2 of 3 -> 4 + catch error:undefined -> 5 + after put(try_catch, 6) end end, + get(try_catch) end, + "begin {'EXIT',{{badmatch,2},_}} = " + " begin catch try 1=2 of 3 -> 4 " + " catch error:undefined -> 5 " + " after put(try_catch, 6) end end, " + " get(try_catch) end. ", 6), + ok. + + +eval_expr_5(doc) -> + ["(OTP-7933)"]; +eval_expr_5(suite) -> + []; +eval_expr_5(Config) when is_list(Config) -> + ?line {ok,Tokens ,_} = + erl_scan:string("if a+4 == 4 -> yes; true -> no end. "), + ?line {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + ?line {value, no, []} = erl_eval:expr(Expr, [], none, none, none), + ?line no = erl_eval:expr(Expr, [], none, none, value), + try + erl_eval:expr(Expr, [], none, none, 4711), + ?line function_clause = should_never_reach_here + catch + error:function_clause -> + ok + end. + +%% Check the string in different contexts: as is; in fun; from compiled code. +check(F, String, Result) -> + check1(F, String, Result), + FunString = concat(["fun() -> ", no_final_dot(String), " end(). "]), + check1(F, FunString, Result), + CompileString = concat(["hd(lists:map(fun(_) -> ", no_final_dot(String), + " end, [foo])). "]), + check1(F, CompileString, Result). + +check1(F, String, Result) -> + Result = F(), + case catch parse_and_run(String) of + {value, Result, _} -> + ok; + Other -> + test_server:fail({eval, Other, Result}) + end. + +check(F, String, Result, BoundVars, LFH, EFH) -> + Result = F(), + case catch parse_and_run(String, LFH, EFH) of + {value, Result, Bs} -> + %% We just assume that Bs is an orddict... + Keys = orddict:fetch_keys(Bs), + case sort(BoundVars) == Keys of + true -> + ok; + false -> + test_server:fail({check, BoundVars, Keys}) + end, + ok; + Other -> + test_server:fail({check, Other, Result}) + end. + +error_check(String, Result) -> + case catch parse_and_run(String) of + {'EXIT', {Result,_}} -> + ok; + Other -> + test_server:fail({eval, Other, Result}) + end. + +error_check(String, Result, LFH, EFH) -> + case catch parse_and_run(String, LFH, EFH) of + {'EXIT', {Result,_}} -> + ok; + Other -> + test_server:fail({eval, Other, Result}) + end. + +eval_string(String) -> + {value, Result, _} = parse_and_run(String), + Result. + +parse_and_run(String) -> + {ok,Tokens,_} = erl_scan:string(String), + {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + erl_eval:expr(Expr, []). + +parse_and_run(String, LFH, EFH) -> + {ok,Tokens,_} = erl_scan:string(String), + {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + erl_eval:expr(Expr, [], LFH, EFH). + +no_final_dot(S) -> + case lists:reverse(S) of + " ." ++ R -> lists:reverse(R); + "." ++ R -> lists:reverse(R); + _ -> S + end. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/erl_expand_records_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/erl_expand_records_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/erl_expand_records_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/erl_expand_records_SUITE.erl 2009-11-20 13:32:12.000000000 +0000 @@ -0,0 +1,823 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(erl_expand_records_SUITE). + +%-define(debug, true). + +-ifdef(debug). +-define(line, put(line, ?LINE), ). +-define(config(X,Y), foo). +-define(privdir, "erl_expand_records_SUITE_priv"). +-define(t, test_server). +-else. +-include("test_server.hrl"). +-define(privdir, ?config(priv_dir, Config)). +-endif. + +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([abstract_module/1, attributes/1, expr/1, guard/1, + init/1, pattern/1, strict/1, update/1, + tickets/1, otp_5915/1, otp_7931/1, otp_5990/1, + otp_7078/1, otp_7101/1]). + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{watchdog, Dog} | Config]. + +fin_per_testcase(_Case, _Config) -> + Dog = ?config(watchdog, _Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + [abstract_module, attributes, expr, guard, init, pattern, + strict, update, tickets]. + +abstract_module(doc) -> + "Compile an abstract module."; +abstract_module(suite) -> []; +abstract_module(Config) when is_list(Config) -> + %% erl_expand_records does not handle abstract modules. But anyway... + File = filename("param.erl", Config), + Beam = filename("param.beam", Config), + Test = <<"-module(param, [A, B]). + + -export([args/1]). + + args(C) -> + X = local(C), + Z = new(A, B), + {X, Z}. + + local(C) -> + module_info(C). + ">>, + + ?line ok = file:write_file(File, Test), + ?line {ok, param} = compile:file(File, [{outdir,?privdir}]), + + ?line ok = file:delete(File), + ?line ok = file:delete(Beam), + ok. + +attributes(doc) -> + "Import module and functions."; +attributes(suite) -> []; +attributes(Config) when is_list(Config) -> + Ts = [ + <<"-import(erl_expand_records_SUITE). + -import(lists, [append/2, reverse/1]). + + -record(r, {a,b}). + + t() -> + [2,1] = reverse(append([1],[2])), + 3 = length([1,2,3]), + 3 = record_info(size, r), + [a, b] = record_info(fields, r), + [] = erl_expand_records_SUITE:attributes(suite), + ok. + ">> + ], + ?line run(Config, Ts), + ok. + +expr(doc) -> + "Some expressions."; +expr(suite) -> []; +expr(Config) when is_list(Config) -> + Ts = [ + <<" + -record(r, {a,b,c}). + + t() -> + [1,2] = [R#r.a || R <- [#r{a = 1}, #r{a = 2}, #r{a = 3}], + R#r.a < 3], + [1,2] = [R#r.a || R <- [#r{a = 1}, #r{a = 2}, #r{a = 3}], + begin R#r.a < 3 end], + [1,2,3] = [R#r.a || R <- [#r{a = 1}, #r{a = 2}, #r{a = 3}], + begin is_record(R, r) end], + [1,2,3] = [R#r.a || R <- [#r{a = 1}, #r{a = 2}, #r{a = 3}], + begin erlang:is_record(R, r) end], + ok. + ">>, + <<" + -record(r, {a,b,c}). + + f(X) -> X. + + t() -> + A = {$c, 1, 3.14, a, \"hi\", [], [a,b]}, + R = #r{a = element(6, A), b = #r.b}, + 3 = R#r.b, + <<1:8>> = <<(begin erlang:element(2, A) end):8>>, + self() ! {a, message, []}, + One = 1 = fun f/1(1), + 2 = fun(X) -> X end(One + One), + 3 = fun exprec_test:f/1(3), + 4 = {exprec_test,f}(4), + 5 = ''.f(5), + L = receive + {a,message,L0} -> + L0 + end, + case catch a.b.c:foo(bar) of + {'EXIT', _} -> ok + end, + _ = receive %Suppress warning. + noop -> + 1/(length(L) - 0) + after 0 -> + ok + end, + if + R#r.c =:= undefined -> + ok; + true -> + not_ok + end. + ">> + ], + + %% The code above should run equally well with and without + %% strict record tests. + ?line run(Config, Ts, [no_strict_record_tests]), + ?line run(Config, Ts, [strict_record_tests]), + + ok. + +guard(doc) -> + "is_record in guards."; +guard(suite) -> []; +guard(Config) when is_list(Config) -> + File = filename("guard.erl", Config), + Beam = filename("guard.beam", Config), + Test = <<"-module(guard, [A, B]). + + -export([t/1]). + + -record(r, {a,b}). + + t(_) when is_record(3, r) -> + 1; + t(_) when is_record(a, r) -> + 2; + t(_) when is_record(3.14, r) -> + 3; + t(_) when is_record([], r) -> + 4; + t(_) when is_record([a], r) -> + 5; + t(_) when is_record($a, r) -> + 6; + t(_) when is_record(\"foo\", r) -> + 7; + t(_) when is_record(#r.a, r) -> + 8; + t(_) when is_record(<<\"foo\">>, r) -> % line 23 + 9; + t(_) when is_record(1 + 2, r) -> + 10; + t(_) when is_record(+ 3, r) -> + 11; + t(_) -> + 12. + ">>, + + ?line ok = file:write_file(File, Test), + ?line {ok, guard, Ws} = compile:file(File, [return,{outdir,?privdir}]), + ?line Warnings = [L || {_File,WL} <- Ws, {L,_M,nomatch_guard} <- WL], + ?line [7,9,11,13,15,17,19,21,23,25,27] = Warnings, + + ?line ok = file:delete(File), + ?line ok = file:delete(Beam), + ok. + +init(doc) -> + "Wildcard initialisation."; +init(suite) -> []; +init(Config) when is_list(Config) -> + Ts = [ + <<" + -record(r, {a,b,c,d = foo}). + + t() -> + R = #r{_ = init, b = b}, + #r{c = init, b = b, a = init} = R, + case R of + #r{b = b, _ = init} -> ok; + _ -> not_ok + end. + ">> + ], + ?line run(Config, Ts), + ok. + +pattern(doc) -> + "Some patterns."; +pattern(suite) -> []; +pattern(Config) when is_list(Config) -> + Ts = [ + <<"-import(erl_expand_records_SUITE). + -import(lists, [append/2, reverse/1]). + + -record(r, {a,b}). + + t() -> + 1 = t(#r{}), + 2 = t($a), + 3 = t(1000), + 4 = t({1000}), + 5 = t(3), + 6 = t(-3.14), + 7 = t({4.0}), + 8 = t(3.14), + 9 = t(\"str\"), + 10 = t([]), + 11 = t([a|b]), + 12 = t(\"string\"), + 13 = t({[]}), + 14 = t({a,b}), + 15 = t({{}}), + 16 = t({tuple,tupel}), + 17 = t(4), + 18 = t(10), + 19 = t({a}), + 20 = t(<<100:8,220:8>>), + 21 = t(#r{a = #r{}}), + 22 = t(2), + 23 = t(#r{a = #r{}, b = b}), + 24 = t(a.b.c), + ok. + + t(a.b.c) -> + 24; + t($a) -> + 2; + t(3) -> + 5; + t(3.14) -> + 8; + t(\"str\") -> + 9; + t([]) -> + 10; + t([a|b]) -> + 11; + t(L) when is_list(L) -> + 12; + t({L}) when list(L) -> + 13; + t({a,b}) -> + 14; + t({T}) when is_tuple(T) -> + 15; + t(+ 4) -> + 17; + t(3+7) -> + 18; + t(<>) when A =:= 100 -> + 20; + t(#r{a = #r{}, b = undefined}) -> + 21; + t(#r.a) -> + 22; + t(A) when is_record(A, r), record(element(2, A), r) -> + 23; + t(A) when is_record(A, r) -> + 1; + t(I) when is_integer(I) -> + 3; + t({I}) when integer(I) -> + 4; + t({F}) when float(F) -> + 7; + t({A} = B) when A < B -> + 19; + t(F) when is_float(F) -> + 6; + t(T) when tuple(T) -> + 16. + ">> + ], + ?line run(Config, Ts), + ok. + +strict(doc) -> + ""; +strict(suite) -> []; +strict(Config) when is_list(Config) -> + Ts1 = [ + <<"-record(r1, {a,b}). + -record(r2, {a,b}). + + t() -> + A = #r1{a = 1, b = 2}, + ok = try + {1, 2} = {A#r2.a, A#r2.b}, + not_ok + catch error:{badrecord,r2} -> ok + end, + try + case foo of + _ when A#r2.a =:= 1 -> not_ok + end + catch error:_ -> ok + end. + ">> + ], + ?line run(Config, Ts1, [strict_record_tests]), + + Ts2 = [ + <<"-record(r1, {a,b}). + -record(r2, {a,b}). + + t() -> + A = #r1{a = 1, b = 2}, + {1, 2} = {A#r2.a, A#r2.b}, + case foo of + _ when A#r2.a =:= 1 -> ok + end. + ">> + ], + ?line run(Config, Ts2, [no_strict_record_tests]), + ok. + +update(doc) -> + "Record updates."; +update(suite) -> []; +update(Config) when is_list(Config) -> + Ts = [ + <<"-record(r, {a,b,c,d,e,f}). + + t() -> + R0 = #r{}, + R1 = R0#r{a = #r.a, e = {x,y}}, + 2 = R1#r.a, + R2 = R1#r{}, + true = R1 =:= R2, + R3 = R2#r{c = fun(X) -> X end, + d = <<\"foo\">>, + e = [x,y,z], + f = {R0,R1}}, + R4 = R3#r{a = R3#r{b = #r{}}}, + true = erlang:is_record((R4#r.a)#r.b, r), + #r{a = R0, b = 3, c = 3.14, d = [], e = [[]], f = [{}]} = + R4#r{a = R0, b = 3, c = 3.14, d = [], e = [[]], f = [{}]}, + ok. + + %% Just playing around a bit... + t1() -> + ((#r{a = (#r{b = #r{}})#r{a = #r{}}})#r{b = #r{}})#r{c = #r{}}. + + t2() -> + R0 = #r{}, + #r{_ = R0#r{a = ok}}. + ">> + ], + ?line run(Config, Ts), + ok. + +tickets(suite) -> + [otp_5915, otp_7931, otp_5990, otp_7078, otp_7101]. + +otp_5915(doc) -> + "Strict record tests in guards."; +otp_5915(suite) -> []; +otp_5915(Config) when is_list(Config) -> + %% These tests are also run by the compiler's record_SUITE. + Ts = [ + <<"-record(r, {a = 4,b}). + -record(r1, {a,b}). + -record(r2, {a = #r1{},b,c=length([1,2,3])}). + -record(r3, {a = fun(_) -> #r1{} end(1), b}). + + t() -> + foo = fun(A) when A#r1.a > A#r1.b -> foo end(#r1{b = 2}), + 0 = fun(A) when A#r2.a -> 0 end(#r2{a = true}), + 1 = fun(A) when (#r1{a = A})#r1.a > 2 -> 1 end(3), + 2 = fun(N) when ((#r2{a = #r{a = 4}, b = length([a,b,c])})#r2.a)#r.a > N -> + 2 end(2), + 3 = fun(A) when (A#r2.a)#r1.a =:= 3 -> 3 end(#r2{a = #r1{a = 3}}), + ok = fun() -> + F = fun(A) when record(A#r.a, r1) -> 4; + (A) when record(A#r1.a, r1) -> 5 + end, + 5 = F(#r1{a = #r1{}}), + 4 = F(#r{a = #r1{}}), + ok + end(), + 3 = fun(A) when record(A#r1.a, r), + (A#r1.a)#r.a > 3 -> 3 + end(#r1{a = #r{a = 4}}), + 7 = fun(A) when record(A#r3.a, r1) -> 7 end(#r3{}), + [#r1{a = 2,b = 1}] = + fun() -> + [A || A <- [#r1{a = 1, b = 3}, + #r2{a = 2,b = 1}, + #r1{a = 2, b = 1}], + A#r1.a > + A#r1.b] + end(), + {[_],b} = + fun(L) -> + %% A is checked only once: + R1 = [{A,B} || A <- L, A#r1.a, B <- L, A#r1.b], + A = #r2{a = true}, + %% A is checked again: + B = if A#r1.a -> a; true -> b end, + {R1,B} + end([#r1{a = true, b = true}]), + + p = fun(A) when (A#r1.a =:= 2) or (A#r2.a =:= 1) -> o; + (_) -> p + end(#r1{a = 2}), + + o = fun(A) when (A#r1.a =:= 2) orelse (A#r2.a =:= 1) -> o; + (_) -> p + end(#r1{a = 2}), + + 3 = fun(A) when A#r1.a > 3, + record(A, r1) -> 3 + end(#r1{a = 5}), + + ok = fun() -> + F = fun(A) when (A#r2.a =:= 1) orelse (A#r2.a) -> 2; + (A) when (A#r1.a =:= 1) orelse (A#r1.a) -> 1; + (A) when (A#r2.a =:= 2) andalso (A#r2.b) -> 3 + end, + 1 = F(#r1{a = 1}), + 2 = F(#r2{a = true}), + 3 = F(#r2{a = 2, b = true}), + ok + end(), + + b = fun(A) when false or not (A#r.a =:= 1) -> a; + (_) -> b + end(#r1{a = 1}), + b = fun(A) when not (A#r.a =:= 1) or false -> a; + (_) -> b + end(#r1{a = 1}), + + ok = fun() -> + F = fun(A) when not (A#r.a =:= 1) -> yes; + (_) -> no + end, + no = F(#r1{a = 2}), + yes = F(#r{a = 2}), + no = F(#r{a = 1}), + ok + end(), + + a = fun(A) when record(A, r), + A#r.a =:= 1, + A#r.b =:= 2 ->a + end(#r{a = 1, b = 2}), + a = fun(A) when erlang:is_record(A, r), + A#r.a =:= 1, + A#r.b =:= 2 -> a + end(#r{a = 1, b = 2}), + a = fun(A) when is_record(A, r), + A#r.a =:= 1, + A#r.b =:= 2 -> a + end(#r{a = 1, b = 2}), + + nop = fun(A) when (is_record(A, r1) and (A#r1.a > 3)) or (A#r2.a < 1) -> + japp; + (_) -> + nop + end(#r2{a = 0}), + nop = fun(A) when (A#r1.a > 3) or (A#r2.a < 1) -> japp; + (_) -> + nop + end(#r2{a = 0}), + + ok = fun() -> + F = fun(A) when (A#r1.a =:= 2) or (A#r2.a =:= 1) -> o; + (_) -> p + end, + p = F(#r2{a = 1}), + p = F(#r1{a = 2}), + ok + end(), + + ok = fun() -> + F = fun(A) when fail, A#r1.a; A#r1.a -> ab; + (_) -> bu + end, + ab = F(#r1{a = true}), + bu = F(#r2{a = true}), + ok + end(), + + both = fun(A) when A#r.a, A#r.b -> both + end(#r{a = true, b = true}), + + ok = fun() -> + F = fun(A, B) when ((A#r1.a) orelse (B#r2.a)) + or (B#r2.b) or (A#r1.b) -> true; + (_, _) -> false + end, + true = F(#r1{a = false, b = false}, #r2{a = false, b = true}), + false = F(#r1{a = true, b = true}, #r1{a = false, b = true}), + ok + end(), + + ok. + ">> + ], + ?line run(Config, Ts, [strict_record_tests]), + ok. + +otp_7931(doc) -> + "Test optimization of record accesses and is_record/3 tests in guards"; +otp_7931(suite) -> []; +otp_7931(Config) when is_list(Config) -> + Ts = [ + <<"-record(r, {a = 4,b}). + -record(r1, {a,b}). + -record(r2, {a = #r1{},b,c=length([1,2,3])}). + -record(r3, {a = fun(_) -> #r1{} end(1), b}). + + t() -> + ok = fun() -> + F = fun(F, [H,H|T]) when is_record(H, r) -> + [H|F(F, T)]; + (F, [H|T]) when is_record(H, r) -> + [H|F(F, T)]; + (_, []) -> [] + end, + [#r{a=4,b=7},#r{a=1,b=42}] = + F(F, [#r{a=4,b=7},#r{a=4,b=7},#r{a=1,b=42}]), + {'EXIT',_} = (catch F(F, [#r1{}])), + ok + end(), + + true = fun() -> + R = #r{}, + if is_record(R, r) -> true; true -> false end + end(), + + ok = fun() -> + F = fun(true, B) when B#r1.a -> ok; + (false, _) -> error + end, + ok = F(true, #r1{a=true}), + error = F(false, anything_goes), + {'EXIT',_} = (catch F(true, #r1{})), + {'EXIT',_} = (catch F(true, #r{})), + ok + end(), + + ok = fun() -> + F = fun([{a,R}=T]) when R#r.a =:= 42 -> + {ok,tuple_size(T)}; + ([{a,R}=T]) when R#r1.a =:= 7 -> + {ok,tuple_size(T)}; + (_) -> error + end, + {ok,2} = F([{a,#r{a=42}}]), + {ok,2} = F([{a,#r1{a=7}}]), + error = F([{a,#r1{}}]), + error = F({a,b,c}), + error = F([]), + ok + end(), + + ok = fun() -> + F = fun(X, Y, Z) when is_record(X, r1) andalso + (is_record(Y, r2) orelse + is_record(Z, r3)) -> true; + (_, _, _) -> false + end, + true = F(#r1{}, #r2{}, #r3{}), + true = F(#r1{}, #r2{}, blurf), + true = F(#r1{}, blurf, #r3{}), + false = F(#r1{}, blurf, blurf), + false = F(blurf, #r2{}, #r3{}), + false = F(blurf, #r2{}, blurf), + false = F(blurf, blurf, #r3{}), + false = F(blurf, blurf, blurf), + ok + end(), + + ok = fun() -> + F = fun(R=#r{a=42}) when R#r.b =:= 7 -> + {ok,R}; + (_) -> error + end, + {ok,#r{a=42,b=7}} = F(#r{a=42,b=7}), + error = F(#r{}), + error = F([a,b,c]), + ok + end(), + + ok. + ">> + ], + ?line run(Config, Ts, [strict_record_tests]), + ok. + +otp_5990(doc) -> + "OTP-5990. {erlang,is_record}."; +otp_5990(suite) -> []; +otp_5990(Config) when is_list(Config) -> + Ts = [ + <<" + -record(r, {a,b,c}). + + t() -> + [1,2,3] = [R#r.a || R <- [#r{a = 1}, #r{a = 2}, #r{a = 3}], + begin {erlang,is_record}(R, r) end], + [1,2,3] = [R#r.a || R <- [#r{a = 1}, #r{a = 2}, #r{a = 3}], + begin {erlang,is_record}(R, r) end], + ok. + ">>, + + <<" + -record('OrdSet', {orddata = {}, + ordtype = {}}). + + to_sets(S) when tuple(S#'OrdSet'.ordtype) -> + ok. + + lc(S) -> + [X || X <- [S], tuple(X#'OrdSet'.ordtype)]. + + t() -> + S = #'OrdSet'{}, + ok = to_sets(S), + [S] = lc(S), + ok. + ">> + ], + ?line run(Config, Ts, [strict_record_tests]), + ok. + + +otp_7078(doc) -> + "OTP-7078. Record update: missing test."; +otp_7078(suite) -> []; +otp_7078(Config) when is_list(Config) -> + Ts = [ + <<" + -record(r, {f}). + -record(r2, {}). + + t() -> + {'EXIT',_} = (catch (#r2{})#r{}), + {'EXIT',_} = (catch (#r2{})#r{f = 2}), + ok. + ">>, + + <<" + -record(r, {f}). + + maker(F) -> + put(a, get(a)+1), + #r{f = F}. + + t() -> + put(a, 0), + (maker(2))#r{}, + 1 = get(a), + ok. + ">> + + ], + ?line run(Config, Ts, [strict_record_tests]), + ok. + +-record(otp_7101, {a,b,c=[],d=[],e=[]}). + +otp_7101(doc) -> + "OTP-7101. Record update: more than one call to setelement/3."; +otp_7101(suite) -> []; +otp_7101(Config) when is_list(Config) -> + Rec = #otp_7101{}, + + %% Spawn a tracer process to count the number of setelement/3 calls. + %% The tracer will forward all trace messages to us. + Self = self(), + Tracer = spawn_link(fun() -> otp_7101_tracer(Self, 0) end), + ?line 1 = erlang:trace_pattern({erlang,setelement,3}, true), + ?line erlang:trace(self(), true, [{tracer,Tracer},call]), + + %% Update the record. + ?line #otp_7101{a=2,b=1,c=[],d=[],e=[]} = otp_7101_update1(Rec), + ?line #otp_7101{a=1,b=2,c=[],d=[],e=[]} = otp_7101_update2(Rec), + ?line #otp_7101{a=2,b=1,c=[],d=[],e=[]} = otp_7101_update3(Rec), + ?line #otp_7101{a=1,b=2,c=[],d=[],e=[]} = otp_7101_update4(Rec), + + %% Verify that setelement/3 was called the same number of times as + %% the number of record updates. + ?line Ref = erlang:trace_delivered(Self), + receive + {trace_delivered, Self, Ref} -> + Tracer ! done + end, + ?line 1 = erlang:trace_pattern({erlang,setelement,3}, false), + receive + 4 -> + ok; + Other -> + ?line ?t:fail({unexpected,Other}) + end. + +otp_7101_tracer(Parent, N) -> + receive + {trace,Parent,call,{erlang,setelement,[_,_,_]}} -> + otp_7101_tracer(Parent, N+1); + done -> + Parent ! N + end. + +otp_7101_update1(R) -> + R#otp_7101{b=1, + a=2}. + +otp_7101_update2(R) -> + R#otp_7101{a=1, + b=2}. + +otp_7101_update3(R) -> + R#otp_7101{b=1,a=2}. + +otp_7101_update4(R) -> + R#otp_7101{a=1,b=2}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +run(Config, Tests) -> + run(Config, Tests, []). + +run(Config, Tests, Opts) -> + F = fun(P) -> + {SourceFile, Mod} = compile_file_mod(Config), + _ = compile_file(Config, P, Opts), + AbsFile = filename:rootname(SourceFile, ".erl"), + code:purge(Mod), + code:load_abs(AbsFile, Mod), +%io:format("run~n"), + case catch Mod:t() of + {'EXIT', _Reason} = Error -> + ?t:format("failed, got ~p~n", [Error]), + fail(); + ok -> + ok + end + end, + lists:foreach(F, Tests). + +%% Compiles a test module and returns the list of errors and warnings. + +compile_file(Config, Test0, Opts0) -> + {File, _Mod} = compile_file_mod(Config), + Filename = 'exprec_test.erl', + Test = list_to_binary(["-module(exprec_test). " + "-compile(export_all). ", + Test0]), + File = filename(Filename, Config), + Opts = [export_all,return,{outdir,?privdir}|Opts0], + ok = file:write_file(File, Test), + {ok, _M, Ws} = compile:file(File, Opts), + warnings(File, Ws). + +compile_file_mod(Config) -> + {filename('exprec_test.erl', Config), exprec_test}. + +filename(Name, Config) when is_atom(Name) -> + filename(atom_to_list(Name), Config); +filename(Name, Config) -> + filename:join(?privdir, Name). + +warnings(File, Ws) -> + case lists:append([W || {F, W} <- Ws, F =:= File]) of + [] -> []; + L -> {warnings, L} + end. + +fail() -> + io:format("failed~n"), + ?t:fail(). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/erl_internal_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/erl_internal_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/erl_internal_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/erl_internal_SUITE.erl 2009-11-20 13:30:52.000000000 +0000 @@ -0,0 +1,69 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(erl_internal_SUITE). + +-export([all/1]). + +-export([behav/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-include("test_server.hrl"). + +all(suite) -> [behav]. + +-define(default_timeout, ?t:minutes(2)). + +init_per_testcase(_Case, Config) -> + ?line Dog = test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +behav(suite) -> []; +behav(doc) -> + ["Check that the behaviour callbacks are correctly defined"]; +behav(_) -> + ?line check_behav_list([{start,2}, {stop,1}], + application:behaviour_info(callbacks)), + ?line check_behav_list([{init,1}, {handle_call,3}, {handle_cast,2}, + {handle_info,2}, {terminate,2}, {code_change,3}], + gen_server:behaviour_info(callbacks)), + ?line check_behav_list([{init,1}, {handle_event,3}, {handle_sync_event,4}, + {handle_info,3}, {terminate,3}, {code_change,4}], + gen_fsm:behaviour_info(callbacks)), + ?line check_behav_list([{init,1}, {handle_event,2}, {handle_call,2}, + {handle_info,2}, {terminate,2}, {code_change,3}], + gen_event:behaviour_info(callbacks)), + ?line check_behav_list( [{init,1}, {terminate,2}], + supervisor_bridge:behaviour_info(callbacks)), + ?line check_behav_list([{init,1}], + supervisor:behaviour_info(callbacks)), + ok. + +check_behav_list([], []) -> ok; +check_behav_list([L | L1], L2) -> + ?line true = lists:member(L, L2), + ?line L3 = lists:delete(L, L2), + check_behav_list(L1, L3). + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/erl_lint_SUITE_data/format.erl erlang-13.b.3-dfsg/lib/stdlib/test/erl_lint_SUITE_data/format.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/erl_lint_SUITE_data/format.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/erl_lint_SUITE_data/format.erl 2009-11-20 13:30:57.000000000 +0000 @@ -0,0 +1,55 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(format). + +-export([f/1]). + +%%% There will be warnings at level 2 and 3. + +f(F) -> + io:format("~", F), %2 + io:format("~", [F]), %1 + io:format(a, b), %1 + io:format(a, "abc"), %1 + io:format(a, [a | "abc"]), %2 + io:format(4,5,6,7), %1 + + io:format("la cucaracha~n"), + io:format(""), + io:format("~p ~p~n", [F]), %1 + io:format("~p~n", [F]), + io:format("~m"), %1 + io:format(F, "~p", []), %1 + io:format("~x~n", [F]), %1 + io:format("~p~n", F), %2 + io:format(F, [3]), %2 + + io:format("~p", a), %1 + io:format("~p~", [F]), %1 + io:format("~p ~p", [F, 4 | 7]), %1 + io:format("~14p", [F]), + io:format("~*p", [a, F]), %no type checking + io:format("~*p", [14, F]), + + io:fwrite("~p", []), %1 + io_lib:format("~p", []), %1 + foo:format("~p", []), + io:format(), %1 + + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/erl_lint_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/erl_lint_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/erl_lint_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/erl_lint_SUITE.erl 2009-11-20 13:30:57.000000000 +0000 @@ -0,0 +1,2783 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(erl_lint_SUITE). + +%-define(debug, true). + +-ifdef(debug). +-define(line, put(line, ?LINE), ). +-define(config(X,Y), foo). +-define(datadir, "erl_lint_SUITE_data"). +-define(privdir, "erl_lint_SUITE_priv"). +-define(t, test_server). +-else. +-include("test_server.hrl"). +-define(datadir, ?config(data_dir, Conf)). +-define(privdir, ?config(priv_dir, Conf)). +-endif. + +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([unused_vars_warn/1, + unused_vars_warn_basic/1, + unused_vars_warn_lc/1, + unused_vars_warn_rec/1, + unused_vars_warn_fun/1, + unused_vars_OTP_4858/1, + export_vars_warn/1, + shadow_vars/1, + unused_import/1, + unused_function/1, + unsafe_vars/1,unsafe_vars2/1, + unsafe_vars_try/1, + guard/1, otp_4886/1, otp_4988/1, otp_5091/1, otp_5276/1, otp_5338/1, + otp_5362/1, otp_5371/1, otp_7227/1, otp_5494/1, otp_5644/1, otp_5878/1, + otp_5917/1, otp_6585/1, otp_6885/1, export_all/1, + bif_clash/1, + behaviour_basic/1, behaviour_multiple/1, + otp_7550/1, + otp_8051/1, + format_warn/1, + on_load/1, on_load_successful/1, on_load_failing/1 + ]). + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{watchdog, Dog} | Config]. + +fin_per_testcase(_Case, _Config) -> + Dog = ?config(watchdog, _Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + [unused_vars_warn, export_vars_warn, + shadow_vars, unused_import, unused_function, + unsafe_vars, unsafe_vars2, unsafe_vars_try, + guard, otp_4886, otp_4988, otp_5091, otp_5276, otp_5338, + otp_5362, otp_5371, otp_7227, otp_5494, otp_5644, otp_5878, otp_5917, otp_6585, + otp_6885, export_all, bif_clash, + behaviour_basic, behaviour_multiple, otp_7550, otp_8051, format_warn, + on_load]. + +unused_vars_warn(suite) -> + [unused_vars_warn_basic, unused_vars_warn_lc, unused_vars_warn_rec, + unused_vars_warn_fun, unused_vars_OTP_4858]. + +unused_vars_warn_basic(doc) -> + "Warnings for unused variables in some simple cases."; +unused_vars_warn_basic(suite) -> []; +unused_vars_warn_basic(Config) when is_list(Config) -> + Ts = [{basic1, + <<"f(F) -> % F unused. + ok. + + f(F, F) -> + ok. + + g(_X) -> + y. + + h(P) -> + P. + + x(N) -> + case a:b() of + [N|Y] -> % Y unused. + ok + end. + + y(N, L) -> + lists:map(fun(T) -> T*N end, L). + + z(N, L) -> % N unused + lists:map(fun(N, T) -> T*N end, L). % N shadowed. + + + c(A) -> + case A of + 1 -> B = []; % B unused. + 2 -> B = []; % B unused. + 3 -> B = f, B + end. + ">>, + [warn_unused_vars], + {warnings,[{1,erl_lint,{unused_var,'F'}}, + {15,erl_lint,{unused_var,'Y'}}, + {22,erl_lint,{unused_var,'N'}}, + {23,erl_lint,{shadowed_var,'N','fun'}}, + {28,erl_lint,{unused_var,'B'}}, + {29,erl_lint,{unused_var,'B'}}]}}], + ?line [] = run(Config, Ts), + ok. + +unused_vars_warn_lc(doc) -> + "Warnings for unused variables in list comprehensions."; +unused_vars_warn_lc(suite) -> []; +unused_vars_warn_lc(Config) when is_list(Config) -> + Ts = [{lc1, + <<"bin([X]) -> + [A || <> <- []]; % X used, not shadowed. + bin({X}) -> + [X || <> <- []]; % X used, and shadowed. + bin({X,Y,Z}) -> + [{A,B} || <> <- Z, <> <- Z]; + bin([X,Y,Z]) -> % Y unused. + [C || <> <- Z, <> <- Z, <> <- Z]. + ">>, + [warn_unused_vars], + {warnings, [{4,erl_lint,{shadowed_var,'X',generate}}, + {7,erl_lint,{unused_var,'Y'}}]}}, + + {lc2, + <<"bin([X]) -> + [A || <> <- []]; % X used, not shadowed. + bin({X}) -> + [X || <> <- []]; % X used, and shadowed. + bin({X,Y,Z}) -> + [{A,B} || <> <- Z, <> <- Z]; + bin([X,Y,Z]) -> % Y unused. + [C || <> <- Z, <> <- Z, <> <- Z]. + ">>, + [warn_unused_vars], + {warnings,[{4,erl_lint,{shadowed_var,'X',generate}}, + {7,erl_lint,{unused_var,'Y'}}]}}, + + {lc3, + <<"a([A]) -> + B = foo, + [{C,B} || {C,_} <- A]; + a({A}) -> + B = foo, + [C || {C,_} <- [B,A]]; + a({A,A}) -> + B = foo, + [C || {C,_} <- B, B < A]. + ">>, + [warn_unused_vars], + []}, + + {lc4, + <<"b(A) -> + B = foo, % B unused. + [C || {C,_} <- A]. + ">>, + [warn_unused_vars], + {warnings,[{2,erl_lint,{unused_var,'B'}}]}}, + + {lc5, + <<"c(A) -> + B = foo, + [C || {C,_} <- A], + B. + ">>, + [warn_unused_vars], + []}, + + {lc6, + <<"d(A) -> + B = foo, + [{A,B} || {Id,_} <- A]. % Id unused. + ">>, + [warn_unused_vars], + {warnings,[{3,erl_lint,{unused_var,'Id'}}]}}, + + {lc7, + <<"e(A) -> + B = foo, % B unused. + [B || B <- A]. % B shadowed. + ">>, + [warn_unused_vars], + {warnings,[{2,erl_lint,{unused_var,'B'}}, + {3,erl_lint,{shadowed_var,'B',generate}}]}}, + + {lc8, + <<"f(A) -> + B = foo, + [B || B <- A], % B shadowed. + B. + ">>, + [warn_unused_vars], + {warnings,[{3,erl_lint,{shadowed_var,'B',generate}}]}}, + + {lc9, + <<"g(A) -> + B = foo, % B unused. + [A || B <- A]. % B shadowed, B unused. + ">>, + [warn_unused_vars], + {warnings,[{2,erl_lint,{unused_var,'B'}}, + {3,erl_lint,{unused_var,'B'}}, + {3,erl_lint,{shadowed_var,'B',generate}}]}}, + + {lc10, + <<"h(A) -> + B = foo, + [A || B <- A], % B shadowed, B unused. + B. + ">>, + [warn_unused_vars], + {warnings,[{3,erl_lint,{unused_var,'B'}}, + {3,erl_lint,{shadowed_var,'B',generate}}]}}, + + {lc11, + <<"i(X) -> + [Z || Z <- X, % Z unused. + Z = X <- [foo]]. % X and Z shadowed. X unused! + ">>, + [warn_unused_vars], + {warnings,[{2,erl_lint,{unused_var,'Z'}}, + {3,erl_lint,{unused_var,'X'}}, + {3,erl_lint,{shadowed_var,'X',generate}}, + {3,erl_lint,{shadowed_var,'Z',generate}}]}}, + + {lc12, + <<"j({X}) -> + [Z || Z <- X, % Z unused. + Z <- X = [[1,2,3]], % Z shadowed. Z unused. + Z <- X, % Z shadowed. Z unused. + Z <- X]; % Z shadowed. + j(X) -> + [foo || X <- X, % X shadowed. + X <- % X shadowed. X unused. + X = + Y = [[1,2,3]], % Y unused. + X <- [], % X shadowed. + X <- X]. % X shadowed. X unused. + ">>, + [warn_unused_vars], + {warnings,[{2,erl_lint,{unused_var,'Z'}}, + {3,erl_lint,{unused_var,'Z'}}, + {3,erl_lint,{shadowed_var,'Z',generate}}, + {4,erl_lint,{unused_var,'Z'}}, + {4,erl_lint,{shadowed_var,'Z',generate}}, + {5,erl_lint,{shadowed_var,'Z',generate}}, + {7,erl_lint,{shadowed_var,'X',generate}}, + {8,erl_lint,{unused_var,'X'}}, + {8,erl_lint,{shadowed_var,'X',generate}}, + {10,erl_lint,{unused_var,'Y'}}, + {11,erl_lint,{shadowed_var,'X',generate}}, + {12,erl_lint,{unused_var,'X'}}, + {12,erl_lint,{shadowed_var,'X',generate}}]}}, + + {lc13, + <<"k(X) -> + [Z || Z <- Y = X]; % Y unused. + k(X) -> + [Z || Z <- X = Y = X]; % Y unused! + k(X) -> + [Z || Z <- begin X = Y = X, Y end]; + k(X) -> + [{Y,W} || W <- Y = X]; % Y unbound + k(X) -> + [Z || Z <- (Y = X), % Y unused. + Y > X]; % Y unbound. + k(X) -> + [Y || Y = X > 3, Z = X]; % Z unused. + k(X) -> + [Z || Y = X > 3, Z = X]. % Y unused. + ">>, + [warn_unused_vars], + {error,[{8,erl_lint,{unbound_var,'Y'}}, + {11,erl_lint,{unbound_var,'Y'}}], + [{2,erl_lint,{unused_var,'Y'}}, + {4,erl_lint,{unused_var,'Y'}}, + {8,erl_lint,{unused_var,'Y'}}, + {10,erl_lint,{unused_var,'Y'}}, + {13,erl_lint,{unused_var,'Z'}}, + {15,erl_lint,{unused_var,'Y'}}]}}, + + {lc14, + <<"lc2() -> + Z = [[1],[2],[3]], + [X || Z <- Z, % Z shadowed. + X <- Z]. + ">>, + [warn_unused_vars], + {warnings,[{3,erl_lint,{shadowed_var,'Z',generate}}]}}, + + {lc15, + <<"lc3() -> + Z = [1,2,3], + [X || X <- Z, + Z <- Z]. % Z shadowed. Z unused. + ">>, + [warn_unused_vars], + {warnings,[{4,erl_lint,{unused_var,'Z'}}, + {4,erl_lint,{shadowed_var,'Z',generate}}]}}, + + {lc16, + <<"bin(Z) -> + case bar of + true -> + U = 2; + false -> + true + end, + case bar of + true -> + X = 2; + false -> + X = 3 + end, + case foo of + true -> + Y = 3; % Y unused. + false -> + 4 + end, + case foo of + 1 -> + U; % U unsafe. + 2 -> + [Z || <> <- Z]; % (X exported.) U unused. + 3 -> + [Z || <> <- Z], % (X exported.) U unused. + U % U unsafe. + end. + ">>, + [warn_unused_vars], + {error,[{22,erl_lint,{unsafe_var,'U',{'case',2}}}, + {27,erl_lint,{unsafe_var,'U',{'case',2}}}], + [{16,erl_lint,{unused_var,'Y'}}, + % {24,erl_lint,{exported_var,'X',{'case',8}}}, + {24,erl_lint,{unused_var,'U'}}, + % {26,erl_lint,{exported_var,'X',{'case',8}}}, + {26,erl_lint,{unused_var,'U'}}]}}, + + {lc17, + <<"bin(Z) -> + %% This used to pass erl_lint... + case bar of + true -> + U = 2; + false -> + true + end, + case bar of + true -> + X = 2; + false -> + X = 3 + end, + case foo of + true -> + Y = 3; % Y unused. + false -> + 4 + end, + [Z || <> <- Z], % (X exported.) U unused. + U. % U unsafe. + ">>, + [warn_unused_vars], + {error,[{22,erl_lint,{unsafe_var,'U',{'case',3}}}], + [{17,erl_lint,{unused_var,'Y'}}, + % {21,erl_lint,{exported_var,'X',{'case',9}}}, + {21,erl_lint,{unused_var,'U'}}]}}, + + {lc18, + <<"bin(Z) -> + case bar of + true -> + U = 2; + false -> + true + end, + case bar of + true -> + X = 2; + false -> + X = 3 + end, + case foo of + true -> + Y = 3; + false -> + 4 + end, + [B || <> <- X, <> <- Z]. % U unsafe. Y unsafe. + % U shadowed. (X exported.) + ">>, + [warn_unused_vars], + {error,[{21,erl_lint,{unsafe_var,'U',{'case',2}}}, + {21,erl_lint,{unsafe_var,'Y',{'case',14}}}], + [{20,erl_lint,{unused_var,'U'}} + % ,{21,erl_lint,{exported_var,'X',{'case',8}}} + % ,{21,erl_lint,{shadowed_var,'U',generate}} + ]}}, + + {lc19, + <<"p({B,C}) -> + <> = <<17:32>>; + p(B) -> + <> = <<17:32>>. % A unused. + ">>, + [warn_unused_vars], + {warnings,[{4,erl_lint,{unused_var,'A'}}]}}, + + {lc20, + <<"c({I1,I2}) -> + if + <> == <<>> -> + foo + end; + c([C1,C2]) -> % C1 unused. + case foo of + <> -> % C3 unused. + bar + end. + + ">>, + [warn_unused_vars], + {warnings,[{6,erl_lint,{unused_var,'C1'}}, + {7,sys_core_fold,no_clause_match}, + {9,erl_lint,{unused_var,'C3'}}]}}, + + {lc21, + <<"t() -> + S = 8, + case <<3:8>> of + <> -> + X; + <> -> % X unbound + foo + end; + t() -> + S = 8, + case <<3:8>> of + <> -> + S; + <> -> % Q unused. + foo + end. + ">>, + [warn_unused_vars], + {error,[{6,erl_lint,{unbound_var,'X'}}], + [{14,erl_lint,{unused_var,'Q'}}]}} + + ], + ?line [] = run(Config, Ts), + ok. + + +unused_vars_warn_rec(doc) -> + "Warnings for unused variables in records."; +unused_vars_warn_rec(suite) -> []; +unused_vars_warn_rec(Config) when is_list(Config) -> + Ts = [{rec1, % An example provided by Bjorn. + <<"-record(edge, + {ltpr, + ltsu, + rtpr, + rtsu + }). + + f1(#edge{ltpr = A, ltsu = A}) -> + true; + f1({Q, Q}) -> + true. + + f2(Edge, Etab) -> + case gb_trees:lookup(Edge, Etab) of + {value,#edge{ltpr=Same,ltsu=Same}} -> ok; + {value,_} -> error + end. + + bar(Edge, Etab) -> + case gb_trees:lookup(Edge, Etab) of + {Same,Same} -> ok; + {value,#edge{ltpr=Same}} -> ok; % Same unused. + {value,_} -> error + end. + ">>, + [warn_unused_vars], + {warnings,[{22,erl_lint,{unused_var,'Same'}}]}}], + ?line [] = run(Config, Ts), + ok. + +unused_vars_warn_fun(doc) -> + "Warnings for unused variables in records."; +unused_vars_warn_fun(suite) -> []; +unused_vars_warn_fun(Config) when is_list(Config) -> + Ts = [{fun1, + <<"a({A,B}) -> % A unused. + fun(A) -> B end; % A shadowed. A unused. + a([A,B]) -> + fun(<>, % A shadowed. A unused. + <>) -> foo % Q unused. + end; + a({A,B,C,D,E}) -> + fun(E) when C == <>, <<17:B>> == D -> % E shadowed. E unused. + foo + end, + E; + a([A,B,C,D,E]) -> % E unused. + fun() -> + (C == <>) and (<<17:B>> == D) + end. + ">>, + [warn_unused_vars], + {warnings,[{1,erl_lint,{unused_var,'A'}}, + {2,erl_lint,{unused_var,'A'}}, + {2,erl_lint,{shadowed_var,'A','fun'}}, + {4,erl_lint,{unused_var,'A'}}, + {4,erl_lint,{shadowed_var,'A','fun'}}, + {5,erl_lint,{unused_var,'Q'}}, + {8,erl_lint,{unused_var,'E'}}, + {8,erl_lint,{shadowed_var,'E','fun'}}, + {8,sys_core_fold,useless_building}, + {12,erl_lint,{unused_var,'E'}}]}}, + + {fun2, + <<"u() -> + case foo of + true -> + U = 2; + false -> + true + end, + fun(U) -> foo end, % U unused. + U; % U unsafe. + u() -> + case foo of + true -> + U = 2; + false -> + U = 3 + end, + fun(U) -> foo end, % U shadowed. U unused. + U; + u() -> + case foo of + true -> + U = 2; % U unused. + false -> + U = 3 % U unused. + end, + fun(U) -> foo end. % U shadowed. U unused. + ">>, + [warn_unused_vars], + {error,[{9,erl_lint,{unsafe_var,'U',{'case',2}}}], + [{8,erl_lint,{unused_var,'U'}}, + {17,erl_lint,{unused_var,'U'}}, + {17,erl_lint,{shadowed_var,'U','fun'}}, + {22,erl_lint,{unused_var,'U'}}, + {24,erl_lint,{unused_var,'U'}}, + {26,erl_lint,{unused_var,'U'}}, + {26,erl_lint,{shadowed_var,'U','fun'}}]}} + ], + ?line [] = run(Config, Ts), + ok. + +unused_vars_OTP_4858(doc) -> + "Bit syntax, binsize variable used in the same matching."; +unused_vars_OTP_4858(suite) -> []; +unused_vars_OTP_4858(Config) when is_list(Config) -> + Ts = [{otp_4858, + <<"objs(<>) -> + B. + + fel(<>) -> % BadSize unbound. + BadSize. % B, Size unused. + + r9c_highlight() -> % B, Rest unused. + <> = <<2,\"AB\",3,\"CDE\">>. + ">>, + [warn_unused_vars], + {error,[{4,erl_lint,{unbound_var,'BadSize'}}], + [{4,erl_lint,{unused_var,'B'}}, + {4,erl_lint,{unused_var,'Size'}}, + {8,erl_lint,{unused_var,'B'}}, + {8,erl_lint,{unused_var,'Rest'}}]}} + ], + ?line [] = run(Config, Ts), + ok. + +export_vars_warn(doc) -> + "Warnings for exported variables"; +export_vars_warn(suite) -> []; +export_vars_warn(Config) when is_list(Config) -> + Ts = [{exp1, + <<"u() -> + case foo of + 1 -> + A = 1, + B = 2, + W = 3, % W unused. + Z = 3; % Z unused. + 2 -> + B = 2, + Z = 4 % Z unused. + end, + case bar of + true -> + A = 17, % A unsafe. + X = 3, % X unused. + U = 2, + U; + false -> + B = 19, % B exported. + U = 3; % U unused. + foo -> + X = 3, + X; + bar -> + X = 9, % X unused. + U = 14 % U unused. + end. + ">>, + [warn_unused_vars], + {error,[{14,erl_lint,{unsafe_var,'A',{'case',2}}}], + [{6,erl_lint,{unused_var,'W'}}, + {7,erl_lint,{unused_var,'Z'}}, + {10,erl_lint,{unused_var,'Z'}}, + {15,erl_lint,{unused_var,'X'}}, + {19,erl_lint,{exported_var,'B',{'case',2}}}, + {20,erl_lint,{unused_var,'U'}}, + {25,erl_lint,{unused_var,'X'}}, + {26,erl_lint,{unused_var,'U'}}]}}, + + {exp2, + <<"bin(A) -> + receive + M -> + X = M, + Y = M, + Z = M + end, + [B || <> <- A], % X exported. + Y = B, % Y exported. B unbound. + [B || B <- Z]. % Z exported. B shadowed. + ">>, + [warn_export_vars], + {error,[{9,erl_lint,{unbound_var,'B'}}], + [{8,erl_lint,{exported_var,'X',{'receive',2}}}, + {9,erl_lint,{exported_var,'Y',{'receive',2}}}, + {10,erl_lint,{exported_var,'Z',{'receive',2}}}, + {10,erl_lint,{shadowed_var,'B',generate}}]}}, + + {exp3, + <<"bin(A) -> + receive + M -> + X = M, + Y = M, + Z = M + end, + [B || <> <- A], % (X exported.) + Y = B, % Y exported. B unbound. + [B || B <- Z]. % (Z exported.) B shadowed. + ">>, + [], + {error,[{9,erl_lint,{unbound_var,'B'}}], + [{9,erl_lint,{exported_var,'Y',{'receive',2}}}, + {10,erl_lint,{shadowed_var,'B',generate}}]}} + ], + ?line [] = run(Config, Ts), + ok. + +shadow_vars(doc) -> + "Shadowed variables are tested in other places, but here we test " + "that the warning can be turned off."; +shadow_vars(suite) -> []; +shadow_vars(Config) when is_list(Config) -> + Ts = [{shadow1, + <<"bin(A) -> + receive + M -> + X = M, + Y = M, + Z = M + end, + [B || <> <- A], + Y = B, + [B || B <- Z]. % B shadowed. + ">>, + [nowarn_shadow_vars], + {error,[{9,erl_lint,{unbound_var,'B'}}], + [{9,erl_lint,{exported_var,'Y',{'receive',2}}}]}}], + + ?line [] = run(Config, Ts), + ok. + +unused_import(doc) -> + "Test that the 'warn_unused_import' option works."; +unused_import(suite) -> []; +unused_import(Config) when is_list(Config) -> + Ts = [{imp1, + <<"-import(lists, [map/2,foldl/3]). + t(L) -> + map(fun(X) -> 2*X end, L). + ">>, + [warn_unused_import], + {warnings,[{1,erl_lint,{unused_import,{{foldl,3},lists}}}]}}], + ?line [] = run(Config, Ts), + ok. + +unused_function(doc) -> + "Test warnings for unused functions."; +unused_function(suite) -> []; +unused_function(Config) when is_list(Config) -> + Ts = [{func1, + <<"-export([t/1]). + t(L) -> + lists:map(fun(X) -> 2*X end, L). + + fact(N) -> + fact_1(N, 1). + + fact_1(1, P) -> P; + fact_1(N, P) -> fact_1(N-1, P*N). + ">>, + {[]}, %Tuple indicates no 'export_all'. + {warnings,[{5,erl_lint,{unused_function,{fact,1}}}, + {8,erl_lint,{unused_function,{fact_1,2}}}]}}, + + %% Turn off warnings for unused functions. + {func2, + <<"-export([t/1]). + t(L) -> + lists:map(fun(X) -> 2*X end, L). + + b(X) -> + 32*X. + ">>, + {[nowarn_unused_function]}, %Tuple indicates no 'export_all'. + []}, + + %% Turn off warnings for unused functions using a -compile() directive. + {func3, + <<"-export([t/1]). + -compile(nowarn_unused_function). + + t(L) -> + lists:map(fun(X) -> 2*X end, L). + + b(X) -> + 32*X. + ">>, + {[]}, %Tuple indicates no 'export_all'. + []}], + + ?line [] = run(Config, Ts), + ok. + +unsafe_vars(doc) -> + "OTP-4671. Errors for unsafe variables"; +unsafe_vars(suite) -> []; +unsafe_vars(Config) when is_list(Config) -> + Ts = [{unsafe1, + <<"t() -> + (X = true) orelse (Y = false), + Y. + ">>, + [warn_unused_vars], + {error,[{3,erl_lint,{unsafe_var,'Y',{'orelse',2}}}], + [{2,erl_lint,{unused_var,'X'}}]}}, + {unsafe2, + <<"t2() -> + (X = true) orelse (Y = false), + X. + ">>, + [warn_unused_vars], + {warnings,[{2,erl_lint,{unused_var,'Y'}}]}}, + {unsafe3, + <<"t3() -> + (X = true) andalso (Y = false), + Y. + ">>, + [warn_unused_vars], + {error,[{3,erl_lint,{unsafe_var,'Y',{'andalso',2}}}], + [{2,erl_lint,{unused_var,'X'}}]}}, + {unsafe4, + <<"t4() -> + (X = true) andalso (true = X), + X. + ">>, + [warn_unused_vars], + []}, + {unsafe5, + <<"t5() -> + Y = 3, + (X = true) andalso (X = true), + {X,Y}. + ">>, + [warn_unused_vars], + []}, + {unsafe6, + <<"t6() -> + X = true, + (X = true) andalso (true = X), + X. + ">>, + [warn_unused_vars], + []}, + {unsafe7, + <<"t7() -> + (if true -> X = 3; false -> true end) + andalso (X > 2), + X. + ">>, + [warn_unused_vars], + {errors,[{3,erl_lint,{unsafe_var,'X',{'if',2}}}, + {4,erl_lint,{unsafe_var,'X',{'if',2}}}], + []}} + ], + ?line [] = run(Config, Ts), + ok. + +unsafe_vars2(doc) -> + "OTP-4831, seq8202. No warn_unused_vars and unsafe variables"; +unsafe_vars2(suite) -> []; +unsafe_vars2(Config) when is_list(Config) -> + Ts = [{unsafe2_1, + <<"foo(State) -> + case State of + true -> + if + false -> ok; + true -> State1=State + end + end, + State1. % unsafe + ">>, + [warn_unused_vars], + {errors,[{9,erl_lint,{unsafe_var,'State1',{'if',4}}}],[]}}, + {unsafe2_2, + <<"foo(State) -> + case State of + true -> + if + false -> ok; + true -> State1=State + end + end, + State1. % unsafe + ">>, + [], + {errors,[{9,erl_lint,{unsafe_var,'State1',{'if',4}}}],[]}} + ], + ?line [] = run(Config, Ts), + ok. + +unsafe_vars_try(doc) -> + "Errors for unsafe variables in try/catch constructs."; +unsafe_vars_try(suite) -> []; +unsafe_vars_try(Config) when is_list(Config) -> + Ts = [{unsafe_try1, + <<"foo2() -> + try self() + catch + Class:Data -> Result={Class,Data} + end, + Result. + foo3a() -> + try self() of + R -> R + catch + Class:Data -> Result={Class,Data} + end, + Result. + foo3b() -> + try self() of + Result -> ok + catch + Class:Data -> {Class,Data} + end, + Result. + ">>, + [], + {errors,[{6,erl_lint,{unsafe_var,'Result',{'try',2}}}, + {13,erl_lint,{unsafe_var,'Result',{'try',8}}}, + {20,erl_lint,{unsafe_var,'Result',{'try',15}}}], + []}}, + {unsafe_try2, + <<"foo1a() -> + Try = + try self() + catch + Class:Data -> Rc={Class,Data} + after + Ra=ok + end, + {Try,Rc,Ra}. + foo1b() -> + Try = + try self() of + R -> R + catch + Class:Data -> Rc={Class,Data} + after + Ra=R + end, + {Try,Rc,Ra}. + foo2() -> + Try = + try self() of + R -> Ro=R + catch + Class:Data -> {Class,Data} + after + Ra=R + end, + {Try,Ro,Ra}. + foo3() -> + Try = + try self() of + R -> Ro=R + catch + Class:Data -> Rc={Class,Data} + after + Ra=R + end, + {Try,R,Ro,Rc,Ra}. + ">>, + [], + {errors,[{9,erl_lint,{unsafe_var,'Ra',{'try',3}}}, + {9,erl_lint,{unsafe_var,'Rc',{'try',3}}}, + {17,erl_lint,{unsafe_var,'R',{'try',12}}}, + {19,erl_lint,{unsafe_var,'Ra',{'try',12}}}, + {19,erl_lint,{unsafe_var,'Rc',{'try',12}}}, + {27,erl_lint,{unsafe_var,'R',{'try',22}}}, + {29,erl_lint,{unsafe_var,'Ra',{'try',22}}}, + {29,erl_lint,{unsafe_var,'Ro',{'try',22}}}, + {37,erl_lint,{unsafe_var,'R',{'try',32}}}, + {39,erl_lint,{unsafe_var,'R',{'try',32}}}, + {39,erl_lint,{unsafe_var,'Ra',{'try',32}}}, + {39,erl_lint,{unsafe_var,'Rc',{'try',32}}}, + {39,erl_lint,{unsafe_var,'Ro',{'try',32}}}], + []}}, + {unsafe_try3, + <<"foo1(X) -> + Try = + try R=self() + catch + Class:Data -> Rc={X,R,Class,Data} + end, + {X,Try,Rc}. + foo2(X) -> + Try = + try R=self() of + RR -> Ro={X,R,RR} + catch + Class:Data -> {X,R,RR,Ro,Class,Data} + end, + {X,Try,R,RR,Ro,Class,Data}. + foo3(X) -> + Try = + try R=self() of + RR -> {X,R,RR} + catch + Class:Data -> {X,R,RR,Class,Data} + after + Ra={X,R,RR,Class,Data} + end, + {X,Try,R,RR,Ra,Class,Data}. + ">>, + [], + {errors,[{5,erl_lint,{unsafe_var,'R',{'try',3}}}, + {7,erl_lint,{unsafe_var,'Rc',{'try',3}}}, + {11,erl_lint,{unsafe_var,'R',{'try',10}}}, + {13,erl_lint,{unbound_var,'RR'}}, + {13,erl_lint,{unbound_var,'Ro'}}, + {13,erl_lint,{unsafe_var,'R',{'try',10}}}, + {15,erl_lint,{unsafe_var,'Class',{'try',10}}}, + {15,erl_lint,{unsafe_var,'Data',{'try',10}}}, + {15,erl_lint,{unsafe_var,'R',{'try',10}}}, + {15,erl_lint,{unsafe_var,'RR',{'try',10}}}, + {15,erl_lint,{unsafe_var,'Ro',{'try',10}}}, + {19,erl_lint,{unsafe_var,'R',{'try',18}}}, + {21,erl_lint,{unbound_var,'RR'}}, + {21,erl_lint,{unsafe_var,'R',{'try',18}}}, + {23,erl_lint,{unsafe_var,'Class',{'try',18}}}, + {23,erl_lint,{unsafe_var,'Data',{'try',18}}}, + {23,erl_lint,{unsafe_var,'R',{'try',18}}}, + {23,erl_lint,{unsafe_var,'RR',{'try',18}}}, + {25,erl_lint,{unsafe_var,'Class',{'try',18}}}, + {25,erl_lint,{unsafe_var,'Data',{'try',18}}}, + {25,erl_lint,{unsafe_var,'R',{'try',18}}}, + {25,erl_lint,{unsafe_var,'RR',{'try',18}}}, + {25,erl_lint,{unsafe_var,'Ra',{'try',18}}}], + []}}, + {unsafe_try4, + <<"foo1(X) -> + Try = + try R=self() of + RR -> Ro={X,R,RR} + catch + Class:Data -> Rc={X,R,RR,Ro,Class,Data} + after + Ra={X,R,RR,Ro,Rc,Class,Data} + end, + {X,Try,R,RR,Ro,Rc,Ra,Class,Data}. + ">>, + [], + {errors,[{4,erl_lint,{unsafe_var,'R',{'try',3}}}, + {6,erl_lint,{unbound_var,'RR'}}, + {6,erl_lint,{unbound_var,'Ro'}}, + {6,erl_lint,{unsafe_var,'R',{'try',3}}}, + {8,erl_lint,{unsafe_var,'Class',{'try',3}}}, + {8,erl_lint,{unsafe_var,'Data',{'try',3}}}, + {8,erl_lint,{unsafe_var,'R',{'try',3}}}, + {8,erl_lint,{unsafe_var,'RR',{'try',3}}}, + {8,erl_lint,{unsafe_var,'Rc',{'try',3}}}, + {8,erl_lint,{unsafe_var,'Ro',{'try',3}}}, + {10,erl_lint,{unsafe_var,'Class',{'try',3}}}, + {10,erl_lint,{unsafe_var,'Data',{'try',3}}}, + {10,erl_lint,{unsafe_var,'R',{'try',3}}}, + {10,erl_lint,{unsafe_var,'RR',{'try',3}}}, + {10,erl_lint,{unsafe_var,'Ra',{'try',3}}}, + {10,erl_lint,{unsafe_var,'Rc',{'try',3}}}, + {10,erl_lint,{unsafe_var,'Ro',{'try',3}}}], + []}}], + ?line [] = run(Config, Ts), + ok. + +guard(doc) -> + "OTP-4670. Guards, is_record in particular."; +guard(suite) -> []; +guard(Config) when is_list(Config) -> + %% Well, these could be plain code... + Ts = [{guard1, + <<"-record(apa, {}). + t(A) when atom(A) -> + atom; + t(A) when binary(A) -> + binary; + t(A) when constant(A) -> + constant; + t(A) when float(A) -> + float; + t(A) when function(A) -> + function; + t(A) when integer(A) -> + integer; + t(A) when is_atom(A) -> + is_atom; + t(A) when is_binary(A) -> + is_binary; + t(A) when is_constant(A) -> + is_constant; + t(A) when is_float(A) -> + is_float; + t(A) when is_function(A) -> + is_function; + t(A) when is_integer(A) -> + is_integer; + t(A) when is_list(A) -> + is_list; + t(A) when is_number(A) -> + is_number; + t(A) when is_pid(A) -> + is_pid; + t(A) when is_port(A) -> + is_port; + t(A) when is_record(A, apa) -> + is_record; + t(A) when is_record(A, apa, 1) -> + is_record; + t(A) when is_reference(A) -> + is_reference; + t(A) when is_tuple(A) -> + is_tuple; + t(A) when list(A) -> + list; + t(A) when number(A) -> + number; + t(A) when pid(A) -> + pid; + t(A) when port(A) -> + port; + t(A) when record(A, apa) -> + record; + t(A) when reference(A) -> + reference; + t(A) when tuple(A) -> + tuple. + ">>, + [nowarn_obsolete_guard], + {error, + [{6,erl_lint,illegal_guard_expr},{18,erl_lint,illegal_guard_expr}], + [{18,erl_lint,{removed,{erlang,is_constant,1}, + "Removed in R13B"}}]}}, + {guard2, + <<"-record(apa,{}). + t1(A) when atom(A), atom(A) -> + atom; + t1(A) when binary(A), binary(A) -> + binary; + t1(A) when constant(A), constant(A) -> + constant; + t1(A) when float(A), float(A) -> + float; + t1(A) when function(A), function(A) -> + function; + t1(A) when integer(A), integer(A) -> + integer; + t1(A) when is_atom(A), is_atom(A) -> + is_atom; + t1(A) when is_binary(A), is_binary(A) -> + is_binary; + t1(A) when is_constant(A), is_constant(A) -> + is_constant; + t1(A) when is_float(A), is_float(A) -> + is_float; + t1(A) when is_function(A), is_function(A) -> + is_function; + t1(A) when is_integer(A), is_integer(A) -> + is_integer; + t1(A) when is_list(A), is_list(A) -> + is_list; + t1(A) when is_number(A), is_number(A) -> + is_number; + t1(A) when is_pid(A), is_pid(A) -> + is_pid; + t1(A) when is_port(A), is_port(A) -> + is_port; + t1(A) when is_record(A, apa), is_record(A, apa) -> + is_record; + t1(A) when is_record(A, apa, 1), is_record(A, apa, 1) -> + is_record; + t1(A) when is_reference(A), is_reference(A) -> + is_reference; + t1(A) when is_tuple(A), is_tuple(A) -> + is_tuple; + t1(A) when list(A), list(A) -> + list; + t1(A) when number(A), number(A) -> + number; + t1(A) when pid(A), pid(A) -> + pid; + t1(A) when port(A), port(A) -> + port; + t1(A) when record(A, apa), record(A, apa) -> + record; + t1(A) when reference(A), reference(A) -> + reference; + t1(A) when tuple(A), tuple(A) -> + tuple. + ">>, + [nowarn_obsolete_guard], + {error,[{6,erl_lint,illegal_guard_expr}, + {6,erl_lint,illegal_guard_expr}, + {18,erl_lint,illegal_guard_expr}, + {18,erl_lint,illegal_guard_expr}], + [{18,erl_lint,{removed,{erlang,is_constant,1}, + "Removed in R13B"}}, + {18,erl_lint,{removed,{erlang,is_constant,1}, + "Removed in R13B"}}]}}, + {guard3, + <<"-record(apa,{}). + t2(A) when atom(A); atom(A) -> + atom; + t2(A) when binary(A); binary(A) -> + binary; + t2(A) when float(A); float(A) -> + float; + t2(A) when function(A); function(A) -> + function; + t2(A) when integer(A); integer(A) -> + integer; + t2(A) when is_atom(A); is_atom(A) -> + is_atom; + t2(A) when is_binary(A); is_binary(A) -> + is_binary; + t2(A) when is_float(A); is_float(A) -> + is_float; + t2(A) when is_function(A); is_function(A) -> + is_function; + t2(A) when is_integer(A); is_integer(A) -> + is_integer; + t2(A) when is_list(A); is_list(A) -> + is_list; + t2(A) when is_number(A); is_number(A) -> + is_number; + t2(A) when is_pid(A); is_pid(A) -> + is_pid; + t2(A) when is_port(A); is_port(A) -> + is_port; + t2(A) when is_record(A, apa); is_record(A, apa) -> + is_record; + t2(A) when is_record(A, gurka, 1); is_record(A, gurka, 1) -> + is_record; + t2(A) when is_reference(A); is_reference(A) -> + is_reference; + t2(A) when is_tuple(A); is_tuple(A) -> + is_tuple; + t2(A) when list(A); list(A) -> + list; + t2(A) when number(A); number(A) -> + number; + t2(A) when pid(A); pid(A) -> + pid; + t2(A) when port(A); port(A) -> + port; + t2(A) when record(A, apa); record(A, apa) -> + record; + t2(A) when reference(A); reference(A) -> + reference; + t2(A) when tuple(A); tuple(A) -> + tuple. + ">>, + [nowarn_obsolete_guard], + []}, + {guard4, + <<"-record(apa, {}). + t3(A) when float(A) or float(A) -> % coercing... (badarg) + float; + t3(A) when is_atom(A) or is_atom(A) -> + is_atom; + t3(A) when is_binary(A) or is_binary(A) -> + is_binary; + t3(A) when is_float(A) or is_float(A) -> + is_float; + t3(A) when is_function(A) or is_function(A) -> + is_function; + t3(A) when is_integer(A) or is_integer(A) -> + is_integer; + t3(A) when is_list(A) or is_list(A) -> + is_list; + t3(A) when is_number(A) or is_number(A) -> + is_number; + t3(A) when is_pid(A) or is_pid(A) -> + is_pid; + t3(A) when is_port(A) or is_port(A) -> + is_port; + t3(A) when is_record(A, apa) or is_record(A, apa) -> + is_record; + t3(A) when is_record(A, apa, 1) or is_record(A, apa, 1) -> + is_record; + t3(A) when is_reference(A) or is_reference(A) -> + is_reference; + t3(A) when is_tuple(A) or is_tuple(A) -> + is_tuple. + ">>, + [nowarn_obsolete_guard], + []}], + ?line [] = run(Config, Ts), + Ts1 = [{guard5, + <<"-record(apa, {}). + t3(A) when record(A, {apa}) -> + foo; + t3(A) when is_record(A, {apa}) -> + foo; + t3(A) when erlang:is_record(A, {apa}) -> + foo; + t3(A) when {erlang,is_record}(A, {apa}) -> + foo; + t3(A) when is_record(A, {apa}, 1) -> + foo; + t3(A) when erlang:is_record(A, {apa}, 1) -> + foo; + t3(A) when {erlang,is_record}(A, {apa}, 1) -> + foo; + t3(A) when is_record(A, apa, []) -> + foo; + t3(A) when erlang:is_record(A, apa, []) -> + foo; + t3(A) when {erlang,is_record}(A, apa, []) -> + foo; + t3(A) when record(A, apa) -> + foo; + t3(A) when is_record(A, apa) -> + foo; + t3(A) when erlang:is_record(A, apa) -> + foo; + t3(A) when {erlang,is_record}(A, apa) -> + foo. + ">>, + [warn_unused_vars, nowarn_obsolete_guard], + {errors,[{2,erl_lint,illegal_guard_expr}, + {4,erl_lint,illegal_guard_expr}, + {6,erl_lint,illegal_guard_expr}, + {8,erl_lint,illegal_guard_expr}, + {10,erl_lint,illegal_guard_expr}, + {12,erl_lint,illegal_guard_expr}, + {14,erl_lint,illegal_guard_expr}, + {16,erl_lint,illegal_guard_expr}, + {18,erl_lint,illegal_guard_expr}, + {20,erl_lint,illegal_guard_expr}], + []}}, + {guard6, + <<"-record(apa,{a=a,b=foo:bar()}). + apa() -> + [X || X <- [], #apa{a = a} == {r,X,foo}]; + apa() -> + [X || X <- [], #apa{b = b} == {r,X,foo}]; + apa() -> + [X || X <- [], #ful{a = a} == {r,X,foo}]. + ">>, + [], + {errors,[{7,erl_lint,{undefined_record,ful}}], + []}}, + {guard7, + <<"-record(apa,{}). + t() -> + [X || X <- [1,#apa{},3], (3+is_record(X, apa)) or + (is_record(X, apa)*2)]. + ">>, + [], + []}], + ?line [] = run(Config, Ts1), + ok. + +otp_4886(doc) -> + "OTP-4886. Calling is_record with given record name."; +otp_4886(suite) -> []; +otp_4886(Config) when is_list(Config) -> + Ts = [{otp_4886, + <<"t() -> + X = {foo}, + is_record(X, foo), + erlang:is_record(X, foo), + {erlang,is_record}(X, foo), + %% Note: is_record/3 does not verify that the record is defined, + %% so the following lines should give no errors. + is_record(X, foo, 1), + erlang:is_record(X, foo, 1), + {erlang,is_record}(X, foo, 1). + ">>, + [], + {errors,[{3,erl_lint,{undefined_record,foo}}, + {4,erl_lint,{undefined_record,foo}}, + {5,erl_lint,{undefined_record,foo}}], + []}}], + ?line [] = run(Config, Ts), + ok. + +otp_4988(doc) -> + "OTP-4988. Error when in-lining non-existent functions."; +otp_4988(suite) -> []; +otp_4988(Config) when is_list(Config) -> + Ts = [{otp_4988, + <<"-compile({inline, [{f,3},{f,4},{f,2},{f,a},{1,foo}]}). + -compile({inline, {g,1}}). + -compile({inline, {g,12}}). + -compile(inline). + -compile({inline_size,100}). + + f(A, B) -> + {g(A), B}. + + g(A) -> + {A}. + ">>, + [], + {errors,[{1,erl_lint,{bad_inline,{1,foo}}}, + {1,erl_lint,{bad_inline,{f,3}}}, + {1,erl_lint,{bad_inline,{f,4}}}, + {1,erl_lint,{bad_inline,{f,a}}}, + {3,erl_lint,{bad_inline,{g,12}}}], + []}}], + ?line [] = run(Config, Ts), + ok. + +otp_5091(doc) -> + "OTP-5091. Patterns and the bit syntax: invalid warnings."; +otp_5091(suite) -> []; +otp_5091(Config) when is_list(Config) -> + Ts = [{otp_5091_1, + <<"t() -> + [{Type, Value} || <> <- []]. + ">>, + [], + []}, + {otp_5091_2, + <<"t() -> + %% This one has always been handled OK: + <> = <<18:16, 9:16, \"123456789\">>, + {Type, Value}. + ">>, + [], + []}, + {otp_5091_3, + <<"t() -> + fun(<>) -> + {Type, Value} + end. + ">>, + [], + []}, + {otp_5091_4, + <<"t() -> + L = 8, + F = fun(<>) -> B end, + F(<<16:8, 7:16>>). + ">>, + [], + []}, + {otp_5091_5, + <<"t() -> + L = 8, + F = fun(<>) -> B end, + F(<<16:8, 7:16>>). + ">>, + [], + {warnings,[{3,erl_lint,{shadowed_var,'L','fun'}}]}}, + {otp_5091_6, + <<"t(A) -> + (fun(<>) -> ok end)(A). + ">>, + [], + {warnings,[{2,erl_lint,{unused_var,'N'}}]}}, + {otp_5091_7, + <<"t() -> + U = 8, + (fun(<>) -> U end)(<<32:8>>). + ">>, + [], + {warnings,[{3,erl_lint,{shadowed_var,'U','fun'}}]}}, + {otp_5091_8, + <<"t() -> + [X || <> <- [], + <> <- [B]]. + ">>, + [], + []}, + {otp_5091_9, + <<"t() -> + L = 8, + F = fun(<>) -> + L + end, + F(<<16:8, 8:16, 32:8>>). + ">>, + [], + {warnings,[{3,erl_lint,{shadowed_var,'L','fun'}}]}}, + {otp_5091_10, + <<"t() -> + L = 8, <> = <<16:8, 7:16>>, B. + ">>, + [], + []}, + {otp_5091_11, + <<"t() -> + fun(<>) -> ok end. + ">>, + [], + []}, + {otp_5091_12, + <<"t([A,B]) -> + fun(<>, % A shadowed and unused + <>) -> foo % Q unused. 'outer' A is used. + end. + ">>, + [], + {warnings,[{2,erl_lint,{unused_var,'A'}}, + {2,erl_lint,{shadowed_var,'A','fun'}}, + {3,erl_lint,{unused_var,'Q'}}]}}, + {otp_5091_13, + <<"t([A,B]) -> % A unused, B unused + fun({A,B}, % A shadowed, B unused, B shadowed + {Q,A}) -> foo % Q unused. 'inner' A is used + end. + ">>, + [], + {warnings,[{1,erl_lint,{unused_var,'A'}}, + {1,erl_lint,{unused_var,'B'}}, + {2,erl_lint,{unused_var,'B'}}, + {2,erl_lint,{shadowed_var,'A','fun'}}, + {2,erl_lint,{shadowed_var,'B','fun'}}, + {3,erl_lint,{unused_var,'Q'}}]}}, + {otp_5091_14, + <<"t() -> + A = 4, + fun(<>) -> 2 end. + ">>, + [], + {warnings,[{3,erl_lint,{unused_var,'A'}}, + {3,erl_lint,{shadowed_var,'A','fun'}}]}}, + {otp_5091_15, + <<"t() -> + A = 4, % unused + fun(<>) -> 2 end. + ">>, + [], + {warnings,[{2,erl_lint,{unused_var,'A'}}, + {3,erl_lint,{shadowed_var,'A','fun'}}]}}, + {otp_5091_16, + <<"t() -> + A = 4, + fun(<<8:A, % + A:8>>) -> 7 end. % shadowed, unused + ">>, + [], + {warnings,[{4,erl_lint,{unused_var,'A'}}, + {4,erl_lint,{shadowed_var,'A','fun'}}]}}, + {otp_5091_17, + <<"t() -> + L = 16, + fun(<>, % 'outer' L + <>) -> % 'outer' L + a + end. + ">>, + [], + {warnings,[{3,erl_lint,{shadowed_var,'L','fun'}}]}}, + {otp_5091_18, + <<"t() -> + L = 4, % L unused + fun({L, % L shadowed + L}, + {L, + L}) -> + a + end. + ">>, + [], + {warnings,[{2,erl_lint,{unused_var,'L'}}, + {3,erl_lint,{shadowed_var,'L','fun'}}]}}, + {otp_5091_19, + <<"t() -> + L = 4, + [L || <> <- []]. + ">>, + [], + {warnings,[{3,erl_lint,{shadowed_var,'L',generate}}]}}, + {otp_5091_20, + <<"t() -> + L = 4, % L unused. + [1 || L <- []]. % L unused, L shadowed. + ">>, + [], + {warnings,[{2,erl_lint,{unused_var,'L'}}, + {3,erl_lint,{unused_var,'L'}}, + {3,erl_lint,{shadowed_var,'L',generate}}]}}, + {otp_5091_21, + <<"t() -> + L = 4, + [1 || L <- [L]]. % L shadowed. L unused. + ">>, + [], + {warnings,[{3,erl_lint,{unused_var,'L'}}, + {3,erl_lint,{shadowed_var,'L',generate}}]}}, + {otp_5091_22, + <<"t() -> + L = 4, % unused + fun(L) -> L end. % shadowed + ">>, + [], + {warnings,[{2,erl_lint,{unused_var,'L'}}, + {3,erl_lint,{shadowed_var,'L','fun'}}]}}, + {otp_5091_23, + <<"t([A,A]) -> a.">>, [], []}, + {otp_5091_24, + <<"t({A,A}) -> a.">>, [], []}, + {otp_5091_25, + <<"-record(r, {f1,f2}). + t(#r{f1 = A, f2 = A}) -> a.">>, [], []}], + + ?line [] = run(Config, Ts), + ok. + +otp_5276(doc) -> + "OTP-5276. Check the 'deprecated' attributed."; +otp_5276(suite) -> []; +otp_5276(Config) when is_list(Config) -> + Ts = [{otp_5276_1, + <<"-deprecated([{frutt,0,next_version}]). + -deprecated([{does_not_exist,1}]). + -deprecated('foo bar'). + -deprecated(module). + -deprecated([{f,'_'}]). + -deprecated([{t,0}]). + -deprecated([{t,'_',eventually}]). + -deprecated([{'_','_',never}]). + -deprecated([{{badly,formed},1}]). + -deprecated([{'_','_',next_major_release}]). + -export([t/0]). + frutt() -> ok. + t() -> ok. + ">>, + {[]}, + {error,[{1,erl_lint,{bad_deprecated,{frutt,0}}}, + {2,erl_lint,{bad_deprecated,{does_not_exist,1}}}, + {3,erl_lint,{invalid_deprecated,'foo bar'}}, + {5,erl_lint,{bad_deprecated,{f,'_'}}}, + {8,erl_lint,{invalid_deprecated,{'_','_',never}}}, + {9,erl_lint,{invalid_deprecated,{{badly,formed},1}}}], + [{12,erl_lint,{unused_function,{frutt,0}}}]}}], + ?line [] = run(Config, Ts), + ok. + +otp_5917(doc) -> + "OTP-5917. Check the 'deprecated' attributed."; +otp_5917(suite) -> []; +otp_5917(Config) when is_list(Config) -> + Ts = [{otp_5917_1, + <<"-compile(export_all). + + -deprecated({t,0}). + + t() -> + foo. + ">>, + {[]}, + []}], + ?line [] = run(Config, Ts), + ok. + +otp_6585(doc) -> + "OTP-6585. Check the deprecated guards list/1, pid/1, ...."; +otp_6585(suite) -> []; +otp_6585(Config) when is_list(Config) -> + Ts = [{otp_6585_1, + <<"-compile(export_all). + + -record(r, {}). + + f(A) when list(A) -> list; + f(R) when record(R, r) -> rec; + f(P) when pid(P) -> pid. + + t() -> + f([]). + ">>, + [warn_obsolete_guard], + {warnings,[{5,erl_lint,{obsolete_guard,{list,1}}}, + {6,erl_lint,{obsolete_guard,{record,2}}}, + {7,erl_lint,{obsolete_guard,{pid,1}}}]}}], + ?line [] = run(Config, Ts), + ok. + +otp_5338(doc) -> + "OTP-5338. Bad warning in record initialization."; +otp_5338(suite) -> []; +otp_5338(Config) when is_list(Config) -> + %% OTP-5878: variables like X are no longer allowed in initialisations + Ts = [{otp_5338, + <<"-record(c, {a = <>}). + t() -> + X = <<\"hejsans\">>, + #c{}. + ">>, + [], + {error,[{1,erl_lint,{unbound_var,'X'}}], + [{3,erl_lint,{unused_var,'X'}}]}}], + ?line [] = run(Config, Ts), + ok. + +otp_5362(doc) -> + "OTP-5362. deprecated_function, " + "{nowarn_unused_funtion,FAs}, 'better' line numbers."; +otp_5362(suite) -> []; +otp_5362(Config) when is_list(Config) -> + Ts = [{otp_5362_1, + <<"-include_lib(\"stdlib/include/qlc.hrl\"). + + -file(?FILE, 1000). + + t() -> + qlc:q([X || X <- [], + begin A = 3, true end]). + ">>, + {[warn_unused_vars]}, + {warnings,[{1002,erl_lint,{unused_function,{t,0}}}, + {1004,erl_lint,{unused_var,'A'}}]}}, + + {otp_5362_2, + <<"-export([inline/0]). + + -import(lists.foo, [a/1,b/1]). % b/1 is not used + + -compile([{inline,{inl,7}}]). % undefined + -compile([{inline,[{inl,17}]}]). % undefined + -compile([{inline,{inl,1}}]). % OK + + foop() -> % unused function + a([]), % used import, OK + fipp(). % undefined + + inline() -> + inl(foo). + + inl(_) -> + true. + + not_used() -> % unused function + true. + + -compile({nowarn_unused_function,[{and_not_used,2}]}). % unknown + and_not_used(_) -> % unused function + foo. + + -compile({nowarn_unused_function,{unused_function,2}}). + unused_function(_, _) -> + ok. + ">>, + {[warn_unused_vars, warn_unused_import]}, + {error,[{5,erl_lint,{bad_inline,{inl,7}}}, + {6,erl_lint,{bad_inline,{inl,17}}}, + {11,erl_lint,{undefined_function,{fipp,0}}}, + {22,erl_lint,{bad_nowarn_unused_function,{and_not_used,2}}}], + [{3,erl_lint,{unused_import,{{b,1},'lists.foo'}}}, + {9,erl_lint,{unused_function,{foop,0}}}, + {19,erl_lint,{unused_function,{not_used,0}}}, + {23,erl_lint,{unused_function,{and_not_used,1}}}]}}, + + {otp_5362_3, + <<"-record(a, {x, + x}). + -record(a, {x, + X}). % erl_parse + -record(a, [x, + x]). % erl_parse + -record(ok, {a,b}). + + -record(r, {a = #ok{}, + b = (#ok{})#ok.a}). + + t() -> + {#a{}, + #nix{}, + #ok{nix = []}, + #ok{Var = 4}, + #r{} + }. + ">>, + {[nowarn_unused_function]}, + {errors2, [{4,erl_parse,"bad record field"}, + {5,erl_parse,"bad record declaration"}], + [{2,erl_lint,{redefine_field,a,x}}, + {14,erl_lint,{undefined_record,nix}}, + {15,erl_lint,{undefined_field,ok,nix}}, + {16,erl_lint,{field_name_is_variable,ok,'Var'}}]}}, + + {otp_5362_4, + <<"-compile(nowarn_deprecated_function). + -compile(nowarn_bif_clash). + spawn(A) -> + erlang:hash(A, 3000), + spawn(A). + ">>, + {[nowarn_unused_function, + warn_deprecated_function, + warn_bif_clash]}, + {error, + [{5,erl_lint,{call_to_redefined_bif,{spawn,1}}}], + [{3,erl_lint,{redefine_bif,{spawn,1}}}, + {4,erl_lint,{deprecated,{erlang,hash,2},{erlang,phash2,2}, + "in a future release"}}]}}, + + {otp_5362_5, + <<"-compile(nowarn_deprecated_function). + -compile(nowarn_bif_clash). + spawn(A) -> + erlang:hash(A, 3000), + spawn(A). + ">>, + {[nowarn_unused_function]}, + {warnings, + [{3,erl_lint,{redefine_bif,{spawn,1}}}]}}, + + %% The special nowarn_X are not affected by general warn_X. + {otp_5362_6, + <<"-compile({nowarn_deprecated_function,{erlang,hash,2}}). + -compile({nowarn_bif_clash,{spawn,1}}). + spawn(A) -> + erlang:hash(A, 3000), + spawn(A). + ">>, + {[nowarn_unused_function, + warn_deprecated_function, + warn_bif_clash]}, + {warnings, + [{3,erl_lint,{redefine_bif,{spawn,1}}}]}}, + + {otp_5362_7, + <<"-export([spawn/1]). + -compile({nowarn_deprecated_function,{erlang,hash,2}}). + -compile({nowarn_bif_clash,{spawn,1}}). + -compile({nowarn_bif_clash,{spawn,2}}). % bad + -compile([{nowarn_deprecated_function, + [{erlang,hash,-1},{3,hash,-1}]}, % 2 bad + {nowarn_deprecated_function, {{a,b,c},hash,-1}}]). % bad + spawn(A) -> + erlang:hash(A, 3000), + spawn(A). + ">>, + {[nowarn_unused_function]}, + {error,[{4,erl_lint,{bad_nowarn_bif_clash,{spawn,2}}}], + [{5,erl_lint,{bad_nowarn_deprecated_function,{3,hash,-1}}}, + {5,erl_lint,{bad_nowarn_deprecated_function,{erlang,hash,-1}}}, + {5,erl_lint,{bad_nowarn_deprecated_function,{{a,b,c},hash,-1}}}]} + }, + + {otp_5362_8, + <<"-export([spawn/1]). + -compile(warn_deprecated_function). + -compile(warn_bif_clash). + spawn(A) -> + erlang:hash(A, 3000), + spawn(A). + ">>, + {[nowarn_unused_function, + {nowarn_bif_clash,{spawn,1}}]}, % has no effect + {warnings, + [{5,erl_lint,{deprecated,{erlang,hash,2},{erlang,phash2,2}, + "in a future release"}}]}}, + + {otp_5362_9, + <<"-include_lib(\"stdlib/include/qlc.hrl\"). + -record(a, {x = qlc:q([{X,Y} || {X} <- [],{Y} <- [],X =:= Y])}). + -export([t/0]). + t() -> #a{}. + ">>, + {[]}, + []} + + ], + + ?line [] = run(Config, Ts), + ok. + +otp_5371(doc) -> + "OTP-5371. Aliases for bit syntax expressions are no longer allowed."; +otp_5371(suite) -> []; +otp_5371(Config) when is_list(Config) -> + Ts = [{otp_5371_1, + <<"t(<> = <>) -> + {A,B}. + ">>, + [], + {errors,[{1,erl_lint,illegal_bin_pattern}],[]}}, + {otp_5371_2, + <<"x([<>] = [<>]) -> + {A,B}. + y({a,<>} = {b,<>}) -> + {A,B}. + ">>, + [], + {errors,[{1,erl_lint,illegal_bin_pattern}, + {3,erl_lint,illegal_bin_pattern}],[]}}, + {otp_5371_3, + <<"-record(foo, {a,b,c}). + -record(bar, {x,y,z}). + -record(buzz, {x,y}). + a(#foo{a = <>} = #bar{x = <>}) -> + {X,Y}. + b(#foo{b = <>} = #foo{b = <>}) -> + {X,Y,Z}. + c(#foo{a = <>} = #buzz{x = <>}) -> + {X,Y}. + d(#foo{a=x,b = <>} = #buzz{y = <>}) -> + {X,Y}. + e(#foo{a=x,b = <>} = #buzz{x=glurf,y = <>}) -> + {X,Y}. + ">>, + [], + {errors,[{4,erl_lint,illegal_bin_pattern}, + {6,erl_lint,illegal_bin_pattern}, + {8,erl_lint,illegal_bin_pattern}, + {10,erl_lint,illegal_bin_pattern}, + {12,erl_lint,illegal_bin_pattern}],[]}}, + {otp_5371_4, + <<"-record(foo, {a,b,c}). + -record(bar, {x,y,z}). + -record(buzz, {x,y}). + a(#foo{a = <>,b=x} = #foo{b = <>}) -> + {X,Y}. + b(#foo{a = <>} = #bar{y = <>}) -> + {X,Y,Z}. + c(#foo{a = <>} = #buzz{y = <>}) -> + {X,Y}. + ">>, + [], + {warnings,[{4,v3_core,nomatch}, + {6,v3_core,nomatch}, + {8,v3_core,nomatch}]}} + ], + ?line [] = run(Config, Ts), + ok. + +otp_7227(doc) -> "OTP_7227. Some aliases for bit syntax expressions were still allowed."; +otp_7227(Config) when is_list(Config) -> + Ts = [{otp_7227_1, + <<"t([<> = {C,D} = <>]) -> + {A,B,C,D}. + ">>, + [], + {errors,[{1,erl_lint,illegal_bin_pattern}],[]}}, + {otp_7227_2, + <<"t([(<> = {C,D}) = <>]) -> + {A,B,C,D}. + ">>, + [], + {errors,[{1,erl_lint,illegal_bin_pattern}],[]}}, + {otp_7227_3, + <<"t([(<> = {C,D}) = (<> = <>)]) -> + {A,B,C,D}. + ">>, + [], + {errors,[{1,erl_lint,illegal_bin_pattern}, + {1,erl_lint,illegal_bin_pattern}, + {1,erl_lint,illegal_bin_pattern}],[]}}, + {otp_7227_4, + <<"t(Val) -> + <> = <> = Val, + {A,B}. + ">>, + [], + {errors,[{2,erl_lint,illegal_bin_pattern}],[]}}, + {otp_7227_5, + <<"t(Val) -> + <> = X = <> = Val, + {A,B,X}. + ">>, + [], + {errors,[{2,erl_lint,illegal_bin_pattern}],[]}}, + {otp_7227_6, + <<"t(X, Y) -> + <> = <>, + A. + ">>, + [], + []}, + {otp_7227_7, + <<"t(Val) -> + (<> = X) = (<> = <>) = Val, + {A,B,X}. + ">>, + [], + {errors,[{2,erl_lint,illegal_bin_pattern}, + {2,erl_lint,illegal_bin_pattern}, + {2,erl_lint,illegal_bin_pattern}],[]}}, + {otp_7227_8, + <<"t(Val) -> + (<> = X) = (Y = <>) = Val, + {A,B,X,Y}. + ">>, + [], + {errors,[{2,erl_lint,illegal_bin_pattern}],[]}}, + {otp_7227_9, + <<"t(Val) -> + (Z = <> = X) = (Y = <> = W) = Val, + {A,B,X,Y,Z,W}. + ">>, + [], + {errors,[{2,erl_lint,illegal_bin_pattern}],[]}} + ], + ?line [] = run(Config, Ts), + ok. + +otp_5494(doc) -> + "OTP-5494. Warnings for functions exported more than once."; +otp_5494(suite) -> []; +otp_5494(Config) when is_list(Config) -> + Ts = [{otp_5494_1, + <<"-export([t/0]). + -export([t/0]). + t() -> a. + ">>, + [], + {warnings,[{2,erl_lint,{duplicated_export,{t,0}}}]}}], + ?line [] = run(Config, Ts), + ok. + +otp_5644(doc) -> + "OTP-5644. M:F/A in record initialization."; +otp_5644(suite) -> []; +otp_5644(Config) when is_list(Config) -> + %% This test is a no-op. Although {function,mfa,i,1} was + %% transformed into {function,Line,i,1} by copy_expr, the module + %% was never checked (Line is the line number). + %% (OTP-5878: somewhat modified.) + Ts = [{otp_5644, + <<"-record(c, {a = fun ?MODULE:i/1(17)}). + t() -> + #c{}. + + i(X) -> + X. + ">>, + [], + []}], + ?line [] = run(Config, Ts), + ok. + +otp_5878(doc) -> + "OTP-5878. Record declaration: forward references, introduced variables."; +otp_5878(suite) -> []; +otp_5878(Config) when is_list(Config) -> + Ts = [{otp_5878_10, + <<"-record(rec1, {a = #rec2{}}). + -record(rec2, {a = #rec1{}}). + t() ->#rec1{}. + ">>, + [warn_unused_record], + {error,[{1,erl_lint,{undefined_record,rec2}}], + [{2,erl_lint,{unused_record,rec2}}]}}, + + {otp_5878_20, + <<"-record(r1, {a = begin A = 4, {A,B} end}). % B unbound + -record(r2, {e = begin A = 3, #r1{} end}). + t() -> #r2{}. + ">>, + [warn_unused_record], + {error,[{1,erl_lint,{unbound_var,'B'}}, + {1,erl_lint,{variable_in_record_def,'A'}}, + {2,erl_lint,{variable_in_record_def,'A'}}], + [{1,erl_lint,{unused_record,r1}}]}}, + + {otp_5878_30, + <<"-record(r1, {t = case foo of _ -> 3 end}). + -record(r2, {a = case foo of A -> A; _ -> 3 end}). + -record(r3, {a = case foo of A -> A end}). + t() -> {#r1{},#r2{},#r3{}}. + ">>, + [warn_unused_record], + {errors,[{2,erl_lint,{variable_in_record_def,'A'}}, + {3,erl_lint,{variable_in_record_def,'A'}}], + []}}, + + {otp_5878_40, + <<"-record(r1, {foo = A}). % A unbound + -record(r2, {a = fun(X) -> X end(3)}). + -record(r3, {a = [X || X <- [1,2,3]]}). + t() -> {#r1{},#r2{},#r3{}}. + ">>, + [warn_unused_record], + {errors,[{1,erl_lint,{unbound_var,'A'}}],[]}}, + + {otp_5878_50, + <<"-record(r1, {a = {A, % A unbound + A}}). % A unbound + -record(r2, {a = begin case foo of + A -> A + end, + A + end}). + -record(r3, {a = fun(X) -> + case foo of + A -> A + end + end + }). + -record(r4, {a = case foo of + foo -> + case foo of + A -> A + end; + _ -> + bar + end}). + t() -> {#r1{},#r2{},#r3{},#r4{}}. + ">>, + [warn_unused_record], + {error,[{1,erl_lint,{unbound_var,'A'}}, + {2,erl_lint,{unbound_var,'A'}}, + {4,erl_lint,{variable_in_record_def,'A'}}, + {17,erl_lint,{variable_in_record_def,'A'}}], + [{8,erl_lint,{unused_var,'X'}}]}}, + + {otp_5878_60, + <<"-record(r1, {a = fun(NotShadowing) -> NotShadowing end}). + t() -> + NotShadowing = 17, + {#r1{}, NotShadowing}. + ">>, + [warn_unused_record], + []}, + + {otp_5878_70, + <<"-record(r1, {a = fun(<>) -> X end, + b = case <<17:8>> of + <<_:Y>> -> Y; + <> -> + Y + end}). + t() -> #r1{}. + ">>, + [warn_unused_record], + {errors,[{3,erl_lint,{unbound_var,'Y'}}, + {4,erl_lint,{variable_in_record_def,'Y'}}], + []}}, + + {otp_5878_80, + <<"-record(r, {a = [X || {A,Y} <- [{1,2},V={3,4}], + begin Z = [1,2,3], true end, + X <- Z ++ [A,Y]]}). + t() ->#r{}. + ">>, + [warn_unused_record], + {warnings,[{1,erl_lint,{unused_var,'V'}}]}}, + + {otp_5878_90, + <<"-record(r, {a = foo()}). % unused + + t() -> ok. + ">>, + [warn_unused_record], + {error,[{1,erl_lint,{undefined_function,{foo,0}}}], + [{1,erl_lint,{unused_record,r}}]}} + + ], + ?line [] = run(Config, Ts), + + Abstr = <<"-module(lint_test, [A, B]). + + -export([args/1]). + + -record(r, {a = A, b = THIS}). % A and THIS are unbound + + %% param:args(compile,param:new(1,2)). + + args(C) -> + X = local(C), + Z = new(A, B), + F = fun(THIS) -> {x, A} end, % THIS unused and shadowed + {X, Z, THIS, F, #r{}}. + + local(C) -> + module_info(C). + ">>, + ?line {error,[{5,erl_lint,{unbound_var,'A'}}, + {5,erl_lint,{unbound_var,'THIS'}}], + [{12,erl_lint,{unused_var,'THIS'}}, + {12,erl_lint,{shadowed_var,'THIS','fun'}}]} + = run_test2(Config, Abstr, [warn_unused_record]), + + QLC1 = <<"-module(lint_test). + -include_lib(\"stdlib/include/qlc.hrl\"). + -export([t/0]). + -record(r1, {a = qlc:e(qlc:q([X || X <- [1,2,3]]))}). + -record(r2, {a = qlc:q([X || X <- [1,2,3]])}). + -record(r3, {a = qlc:q([X || {A,Y} <- [{1,2},V={3,4}], + begin Z = [1,2,3], true end, + X <- Z ++ [A,Y]])}). + t() -> {#r1{},#r2{},#r3{}}. + ">>, + ?line {error,[{8,qlc,{used_generator_variable,'A'}}, + {8,qlc,{used_generator_variable,'Y'}}, + {8,qlc,{used_generator_variable,'Z'}}], + [{6,erl_lint,{unused_var,'V'}}]} = + run_test2(Config, QLC1, [warn_unused_record]), + + Ill1 = <<"-module(lint_test). + -export([t/0]). + -record(r, {a = true}). + -record(r1, {a,b}). + -record(r2, {a = #r1{a = true}}). + -record(r3, {a = A}). % A is unbound + -record(r4, {a = dict:new()}). + + t() -> + case x() of + _ when (#r{})#r.a -> + a; + _ when (#r4{})#r.a -> % illegal + b; + _ when (#r3{q = 5})#r.a -> % no warning for unbound A + q; + _ when (#r{q = 5})#r.a -> + a; + _ when (((#r{a = #r2{}})#r.a)#r2.a)#r1.a -> + b; + _ when #r{a = dict:new()} -> % illegal + c; + _ when l() > 3 -> % illegal, does not use l/0... + d; + _ -> + w + end. + + l() -> + foo. + + x() -> + bar. + ">>, + + ?line {errors,[{6,erl_lint,{unbound_var,'A'}}, + {13,erl_lint,illegal_guard_expr}, + {15,erl_lint,{undefined_field,r3,q}}, + {17,erl_lint,{undefined_field,r,q}}, + {21,erl_lint,illegal_guard_expr}, + {23,erl_lint,illegal_guard_expr}], + []} = + run_test2(Config, Ill1, [warn_unused_record]), + + Ill2 = <<"-module(lint_test). + -export([t/0]). + t() -> + case x() of + _ when l() + or + l() -> + foo + end. + ">>, + ?line {errors,[{4,erl_lint,{undefined_function,{x,0}}}, + {5,erl_lint,illegal_guard_expr}, + {7,erl_lint,illegal_guard_expr}], + []} = + run_test2(Config, Ill2, [warn_unused_record]), + + Ill3 = <<"t() -> ok.">>, + ?line {errors,[{1,erl_lint,undefined_module}],[]} = + run_test2(Config, Ill3, [warn_unused_record]), + + Usage1 = <<"-module(lint_test). + -export([t/0]). + -record(u1, {a}). + -record(u2, {a = #u1{}}). + -record(u3, {a}). % unused + -record(u4, {a = #u3{}}). % unused + + t() -> + {#u2{}}. + ">>, + ?line {warnings,[{5,erl_lint,{unused_record,u3}}, + {6,erl_lint,{unused_record,u4}}]} = + run_test2(Config, Usage1, [warn_unused_record]), + + Usage2 = <<"-module(lint_test). + -export([t/0]). + -record(u1, {a}). + -record(u2, {a = #u1{}}). + -file(\"some_file.hrl\", 1). + -record(u3, {a}). % unused, but on other file + -record(u4, {a = #u3{}}). % -\"- + + t() -> + {#u2{}}. + ">>, + ?line [] = run_test2(Config, Usage2, [warn_unused_record]), + + %% This a completely different story... + %% The linter checks if qlc.hrl hasn't been included + QLC2 = <<"-module(lint_test). + -import(qlc, [q/2]). + -export([t/0]). + + t() -> + H1 = qlc:q([X || X <- [1,2]]), + H2 = qlc:q([X || X <- [1,2]], []), + H3 = q([X || X <- [1,2]], []), + {H1,H2,H3}. + ">>, + ?line {warnings,[{6,erl_lint,{missing_qlc_hrl,1}}, + {7,erl_lint,{missing_qlc_hrl,2}}, + {8,erl_lint,{missing_qlc_hrl,2}}]} = + run_test2(Config, QLC2, [warn_unused_record]), + + %% Records that are used by types are not unused. + %% (Thanks to Fredrik Thulin and Kostis Sagonas.) + UsedByType = <<"-module(t). + -export([foo/1]). + -record(sipurl, {host :: string()}). + -record(keylist, {list = [] :: [_]}). + -type sip_headers() :: #keylist{}. + -record(request, {uri :: #sipurl{}, header :: sip_headers()}). + + foo(#request{}) -> ok. + ">>, + ?line [] = run_test2(Config, UsedByType, [warn_unused_record]), + + ok. + +otp_6885(doc) -> + "OTP-6885. Binary fields in bit syntax matching is now only allowed at the end."; +otp_6885(suite) -> []; +otp_6885(Config) when is_list(Config) -> + Ts = <<"-module(otp_6885). + -export([t/1]). + t(<<_/binary,I>>) -> I; + t(<>) -> I; + t(<>) -> {B,T}. + + build(A, B) -> + <>. + + foo(<<\"abc\"/binary>>) -> + ok; + foo(<<\"abc\":13/integer>>) -> + ok; + foo(<<\"abc\"/float>>) -> + ok; + foo(<<\"abc\":19>>) -> + ok; + foo(<<\"abc\"/utf8>>) -> + ok; + foo(<<\"abc\"/utf16>>) -> + ok; + foo(<<\"abc\"/utf32>>) -> + ok. + + ">>, + ?line {errors,[{3,erl_lint,unsized_binary_not_at_end}, + {4,erl_lint,unsized_binary_not_at_end}, + {5,erl_lint,unsized_binary_not_at_end}, + {10,erl_lint,typed_literal_string}, + {12,erl_lint,typed_literal_string}, + {14,erl_lint,typed_literal_string}, + {16,erl_lint,typed_literal_string}], + []} = run_test2(Config, Ts, []), + ok. + +export_all(doc) -> + "OTP-7392. Warning for export_all."; +export_all(Config) when is_list(Config) -> + Ts = <<"-module(export_all_module). + -compile([export_all]). + + id(I) -> I. + ">>, + ?line [] = run_test2(Config, Ts, []), + ?line {warnings,[{2,erl_lint,export_all}]} = + run_test2(Config, Ts, [warn_export_all]), + ok. + +bif_clash(doc) -> + "Test warnings for functions that clash with BIFs."; +bif_clash(suite) -> []; +bif_clash(Config) when is_list(Config) -> + Ts = [{clash1, + <<"t(X) -> + size(X). + + %% No warning for the following calls, since they + %% are unambigous. + b(X) -> + erlang:size(X). + + c(X) -> + ?MODULE:size(X). + + size({N,_}) -> + N. + ">>, + [], + {errors,[{2,erl_lint,{call_to_redefined_bif,{size,1}}}],[]}}, + + %% Verify that (some) warnings can be turned off. + {clash2, + <<"-export([t/1,size/1]). + t(X) -> + size(X). + + size({N,_}) -> + N. + + %% My own abs/1 function works on lists too. + %% Unfortunately, it is not exported, so there will + %% be a warning that can't be turned off. + abs([H|T]) when $a =< H, H =< $z -> [H-($a-$A)|abs(T)]; + abs([H|T]) -> [H|abs(T)]; + abs([]) -> []; + abs(X) -> erlang:abs(X). + ">>, + {[nowarn_bif_clash]}, + {warnings,[{11,erl_lint,{redefine_bif,{abs,1}}}, + {11,erl_lint,{unused_function,{abs,1}}}]}}], + + ?line [] = run(Config, Ts), + ok. + +behaviour_basic(doc) -> + "Basic tests with one behaviour."; +behaviour_basic(suite) -> []; +behaviour_basic(Config) when is_list(Config) -> + Ts = [{behaviour1, + <<"-behaviour(application). + ">>, + [], + {warnings,[{1,erl_lint,{undefined_behaviour_func,{start,2},application}}, + {1,erl_lint,{undefined_behaviour_func,{stop,1},application}}]}}, + + {behaviour2, + <<"-behaviour(application). + -export([stop/1]). + stop(_) -> ok. + ">>, + [], + {warnings,[{1,erl_lint,{undefined_behaviour_func,{start,2},application}}]}}, + + {behaviour3, + <<"-behavior(application). %% Test American spelling. + -export([start/2,stop/1]). + start(_, _) -> ok. + stop(_) -> ok. + ">>, + [], + []} + ], + ?line [] = run(Config, Ts), + ok. + +behaviour_multiple(doc) -> + "Basic tests with multiple behaviours."; +behaviour_multiple(suite) -> []; +behaviour_multiple(Config) when is_list(Config) -> + Ts = [{behaviour1, + <<"-behaviour(application). + -behaviour(supervisor). + ">>, + [], + {warnings,[{1,erl_lint,{undefined_behaviour_func,{start,2},application}}, + {1,erl_lint,{undefined_behaviour_func,{stop,1},application}}, + {2,erl_lint,{undefined_behaviour_func,{init,1},supervisor}}]}}, + + {behaviour2, + <<"-behaviour(application). + -behaviour(supervisor). + -export([start/2,stop/1,init/1]). + start(_, _) -> ok. + stop(_) -> ok. + init(_) -> ok. + ">>, + [], + []}, + + {american_behavior2, + <<"-behavior(application). + -behavior(supervisor). + -export([start/2,stop/1,init/1]). + start(_, _) -> ok. + stop(_) -> ok. + init(_) -> ok. + ">>, + [], + []}, + + {behaviour3, + <<"-behaviour(gen_server). + -behaviour(supervisor). + -export([handle_call/3,handle_cast/2,handle_info/2]). + handle_call(_, _, _) -> ok. + handle_cast(_, _) -> ok. + handle_info(_, _) -> ok. + ">>, + [], + {warnings,[{1,erl_lint, + {undefined_behaviour_func,{code_change,3},gen_server}}, + {1,erl_lint,{undefined_behaviour_func,{init,1},gen_server}}, + {1,erl_lint,{undefined_behaviour_func,{terminate,2},gen_server}}, + {2,erl_lint,{undefined_behaviour_func,{init,1},supervisor}}, + {2, + erl_lint, + {conflicting_behaviours,{init,1},supervisor,1,gen_server}}]}}, + {american_behavior3, + <<"-behavior(gen_server). + -behavior(supervisor). + -export([handle_call/3,handle_cast/2,handle_info/2]). + handle_call(_, _, _) -> ok. + handle_cast(_, _) -> ok. + handle_info(_, _) -> ok. + ">>, + [], + {warnings,[{1,erl_lint, + {undefined_behaviour_func,{code_change,3},gen_server}}, + {1,erl_lint,{undefined_behaviour_func,{init,1},gen_server}}, + {1,erl_lint,{undefined_behaviour_func,{terminate,2},gen_server}}, + {2,erl_lint,{undefined_behaviour_func,{init,1},supervisor}}, + {2, + erl_lint, + {conflicting_behaviours,{init,1},supervisor,1,gen_server}}]}}, + + {behaviour4, + <<"-behaviour(gen_server). + -behaviour(gen_fsm). + -behaviour(supervisor). + -export([init/1,handle_call/3,handle_cast/2, + handle_info/2,handle_info/3, + handle_event/3,handle_sync_event/4, + code_change/3,code_change/4, + terminate/2,terminate/3,terminate/4]). + init(_) -> ok. + handle_call(_, _, _) -> ok. + handle_event(_, _, _) -> ok. + handle_sync_event(_, _, _, _) -> ok. + handle_cast(_, _) -> ok. + handle_info(_, _) -> ok. + handle_info(_, _, _) -> ok. + code_change(_, _, _) -> ok. + code_change(_, _, _, _) -> ok. + terminate(_, _) -> ok. + terminate(_, _, _) -> ok. + terminate(_, _, _, _) -> ok. + ">>, + [], + {warnings,[{2, + erl_lint, + {conflicting_behaviours,{init,1},gen_fsm,1,gen_server}}, + {3, + erl_lint, + {conflicting_behaviours,{init,1},supervisor,1,gen_server}}]}} + ], + ?line [] = run(Config, Ts), + ok. + +otp_7550(doc) -> + "Test that the new utf8/utf16/utf32 types do not allow size or unit specifiers."; +otp_7550(Config) when is_list(Config) -> + Ts = [{otp_7550, + <<"f8(A) -> + <>. + g8(A) -> + <>. + h8(A) -> + <>. + + f16(A) -> + <>. + g16(A) -> + <>. + h16(A) -> + <>. + + f32(A) -> + <>. + g32(A) -> + <>. + h32(A) -> + <>. + ">>, + [], + {errors,[{2,erl_lint,utf_bittype_size_or_unit}, + {4,erl_lint,utf_bittype_size_or_unit}, + {6,erl_lint,utf_bittype_size_or_unit}, + {9,erl_lint,utf_bittype_size_or_unit}, + {11,erl_lint,utf_bittype_size_or_unit}, + {13,erl_lint,utf_bittype_size_or_unit}, + {16,erl_lint,utf_bittype_size_or_unit}, + {18,erl_lint,utf_bittype_size_or_unit}, + {20,erl_lint,utf_bittype_size_or_unit} + ], + []}}], + ?line [] = run(Config, Ts), + ok. + + +otp_8051(doc) -> + "Bugfix: -opaque with invalid type."; +otp_8051(Config) when is_list(Config) -> + Ts = [{otp_8051, + <<"-opaque foo() :: bar(). + ">>, + [], + {error,[{1,erl_lint,{type_ref,{bar,0}}}], + [{1,erl_lint,{unused_type,{foo,0}}}]}}], + ?line [] = run(Config, Ts), + ok. + +format_warn(doc) -> + "Check that format warnings are generated."; +format_warn(suite) -> []; +format_warn(Config) when is_list(Config) -> + L1 = 14, + L2 = 4, + format_level(1, L1, Config), + format_level(2, L1+L2, Config), + format_level(3, L1+L2, Config), %there is no level 3 + ok. + +format_level(Level, Count, Config) -> + ?line W = get_compilation_warnings(Config, "format", + [{warn_format, Level}]), + %% Pick out the 'format' warnings. + ?line FW = lists:filter(fun({_Line, erl_lint, {format_error, _}}) -> true; + (_) -> false + end, + W), + ?line case length(FW) of + Count -> + ok; + Other -> + ?t:format("Expected ~w warning(s); got ~w", [Count,Other]), + fail() + end, + ok. + +%% Test the -on_load(Name/0) directive. + +on_load(suite) -> + [on_load_successful, on_load_failing]. + +on_load_successful(Config) when is_list(Config) -> + Ts = [{on_load_1, + %% Exported on_load function. + <<"-export([do_on_load/0]). + -on_load(do_on_load/0). + do_on_load() -> ok. + ">>, + {[]}, %Tuple indicates no 'export_all'. + []}, + + {on_load_2, + %% Local on_load function. + <<"-on_load(do_on_load/0). + do_on_load() -> ok. + ">>, + {[]}, %Tuple indicates no 'export_all'. + []}, + + {on_load_3, + %% Local on_load function, calling other local functions. + <<"-on_load(do_on_load/0). + do_on_load() -> foo(). + foo() -> bar(5) + 42. + bar(N) -> 2*N. + ">>, + {[]}, %Tuple indicates no 'export_all'. + []} + ], + ?line [] = run(Config, Ts), + ok. + +on_load_failing(Config) when is_list(Config) -> + Ts = [{on_load_1, + %% Badly formed. + <<"-on_load(atom). + ">>, + {[]}, %Tuple indicates no 'export_all'. + {errors, + [{1,erl_lint,{bad_on_load,atom}}],[]}}, + + {on_load_2, + %% Badly formed. + <<"-on_load({42,0}). + ">>, + {[]}, %Tuple indicates no 'export_all'. + {errors, + [{1,erl_lint,{bad_on_load,{42,0}}}],[]}}, + + {on_load_3, + %% Multiple on_load attributes. + <<"-on_load(foo/0). + -on_load(bar/0). + foo() -> ok. + bar() -> ok. + ">>, + {[]}, %Tuple indicates no 'export_all'. + {errors, + [{2,erl_lint,multiple_on_loads}],[]}}, + + {on_load_4, + %% Wrong arity. + <<"-on_load(foo/1). + foo(_) -> ok. + ">>, + {[]}, %Tuple indicates no 'export_all'. + {errors, + [{1,erl_lint,{bad_on_load_arity,{foo,1}}}],[]}}, + + {on_load_5, + %% Non-existing function. + <<"-on_load(non_existing/0). + ">>, + {[]}, %Tuple indicates no 'export_all'. + {errors, + [{1,erl_lint,{undefined_on_load,{non_existing,0}}}],[]}} + ], + ?line [] = run(Config, Ts), + ok. + +run(Config, Tests) -> + F = fun({N,P,Ws,E}, BadL) -> + case catch run_test(Config, P, Ws) of + E -> + BadL; + Bad -> + ?t:format("~nTest ~p failed. Expected~n ~p~n" + "but got~n ~p~n", [N, E, Bad]), + fail() + end + end, + lists:foldl(F, [], Tests). + +%% Compiles a test file and returns the list of warnings. + +get_compilation_warnings(Conf, Filename, Warnings) -> + ?line DataDir = ?datadir, + ?line File = filename:join(DataDir, Filename), + {ok,Bin} = file:read_file(File++".erl"), + FileS = binary_to_list(Bin), + {match,[{Start,Length}|_]} = re:run(FileS, "-module.*\\n"), + Test = lists:nthtail(Start+Length, FileS), + {warnings, Ws} = run_test(Conf, Test, Warnings), + Ws. + +%% Compiles a test module and returns the list of errors and warnings. + +run_test(Conf, Test0, Warnings0) -> + Test = list_to_binary(["-module(lint_test). ", Test0]), + run_test2(Conf, Test, Warnings0). + +run_test2(Conf, Test, Warnings0) -> + Filename = 'lint_test.erl', + DataDir = ?privdir, + File = filename:join(DataDir, Filename), + Opts = case Warnings0 of + {Warnings} -> %Hairy trick to not add export_all. + [return|Warnings]; + Warnings -> + [export_all,return|Warnings] + end, + ok = file:write_file(File, Test), + + %% We will use the 'binary' option so that the compiler will not + %% compare the module name to the output file name. Also, there + %% is no reason to produce an output file since we are only + %% interested in the errors and warnings. + + %% Print warnings, call erl_lint:format_error/1. + compile:file(File, [binary,report|Opts]), + + case compile:file(File, [binary|Opts]) of + {ok, _M, Code, Ws} when is_binary(Code) -> warnings(File, Ws); + {error, [{File,Es}], []} -> {errors, Es, []}; + {error, [{File,Es}], [{File,Ws}]} -> {error, Es, Ws}; + {error, [{File,Es1},{File,Es2}], []} -> {errors2, Es1, Es2} + end. + +warnings(File, Ws) -> + case lists:append([W || {F, W} <- Ws, F =:= File]) of + [] -> []; + L -> {warnings, L} + end. + +fail() -> + io:format("failed~n"), + ?t:fail(). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/erl_pp_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/erl_pp_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/erl_pp_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/erl_pp_SUITE.erl 2009-11-20 13:32:21.000000000 +0000 @@ -0,0 +1,1073 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%%---------------------------------------------------------------- +%%% Purpose:Test Suite for the 'erl_pp' module. +%%%----------------------------------------------------------------- +-module(erl_pp_SUITE). + +%-define(debug, true). + +-ifdef(debug). +-define(line, put(line, ?LINE), ). +-define(config(X,Y), foo). +-define(datadir, "erl_pp_SUITE_data"). +-define(privdir, "erl_pp_SUITE_priv"). +-define(t, test_server). +-else. +-include("test_server.hrl"). +-define(datadir, ?config(data_dir, Config)). +-define(privdir, ?config(priv_dir, Config)). +-endif. + +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([expr/1, func/1, call/1, recs/1, try_catch/1, if_then/1, + receive_after/1, bits/1, head_tail/1, package/1, + cond1/1, block/1, case1/1, ops/1, messages/1, + old_mnemosyne_syntax/1, + attributes/1, import_export/1, misc_attrs/1, + hook/1, + neg_indent/1, + tickets/1, + otp_6321/1, otp_6911/1, otp_6914/1, otp_8150/1, otp_8238/1]). + +%% Internal export. +-export([ehook/6]). + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(2)). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{watchdog, Dog} | Config]. + +fin_per_testcase(_Case, _Config) -> + Dog = ?config(watchdog, _Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + [expr, attributes, hook, neg_indent, tickets]. + +expr(suite) -> + [func, call, recs, try_catch, if_then, receive_after, bits, head_tail, + package, cond1, block, case1, ops, messages, old_mnemosyne_syntax]. + +func(suite) -> + []; +func(Config) when is_list(Config) -> + Ts = [{func_1, + <<"-record(r1, {a,b}). + -record(r3, {a = fun(_) -> #r1{} end(1), b}). + + t() -> + fun(A) when record(A#r3.a, r1) -> 7 end(#r3{}). + ">>}, + {func_2, + <<"-record(r1, {a,b}). + -record(r3, {a = fun(_) -> #r1{} end(1), b}). + + t() -> + fsdfsdfjsdfjkljf:sdlfjdsfjlf( + fun(sdfsd) -> {sdkjsdf,sdfjsdkljfsdl,sdfkjdklf} end). + ">>}, + {func_3, + <<"t() -> fun t/0.">>}, + {func_4, + %% Has already been expanded away in sys_pre_expand. + <<"t() -> fun modul:foo/3.">>}, + {func_5, % 'when' is moved down one line + <<"tkjlksjflksdjflsdjlk() + when kljlsajflksjdfklsjdlkjfklsdklfjsdlf < + kljasjfdsjflsdjfklsdjfklsdjfklsd -> + foo.">>}, + {func_6, + <<"t() -> + (fun() -> + true + end)().">>} + ], + ?line compile(Config, Ts), + ok. + +call(suite) -> + []; +call(Config) when is_list(Config) -> + Ts = [{call_1, + <<"t() -> + fookjljsflj:barlkjlkjsdfj(kjdslfjsdl,hej,san,sa, + foo,sdfds,sdfsdf,sdfsd,sdfdsf,sdfdsf,sfdsf, + sfds,sdfsdf,sfds). + ">>} + ], + ?line compile(Config, Ts), + ok. + +recs(suite) -> + []; +recs(Config) when is_list(Config) -> + %% Evolved while testing strict record tests in guards... + Ts = [{recs_1, + <<"-compile(strict_record_tests). + -record(r, {a = 4,b}). + -record(r1, {a,b}). + -record(r2, {a = #r1{},b,c=length([1,2,3])}). + -record(r3, {a = fun(_) -> #r1{} end(1), b}). + + t() -> + foo = fun(A) when A#r1.a > A#r1.b -> foo end(#r1{b = 2}), + 0 = fun(A) when A#r2.a -> 0 end(#r2{a = true}), + 1 = fun(A) when (#r1{a = A})#r1.a > 2 -> 1 end(3), + 2 = fun(N) when ((#r2{a = #r{a = 4}, b = length([a,b,c])})#r2.a)#r.a > N -> + 2 end(2), + 3 = fun(A) when (A#r2.a)#r1.a =:= 3 -> 3 end(#r2{a = #r1{a = 3}}), + ok = fun() -> + F = fun(A) when record(A#r.a, r1) -> 4; + (A) when record(A#r1.a, r1) -> 5 + end, + 5 = F(#r1{a = #r1{}}), + 4 = F(#r{a = #r1{}}), + ok + end(), + 3 = fun(A) when record(A#r1.a, r), + (A#r1.a)#r.a > 3 -> 3 + end(#r1{a = #r{a = 4}}), + 7 = fun(A) when record(A#r3.a, r1) -> 7 end(#r3{}), + [#r1{a = 2,b = 1}] = + fun() -> + [A || A <- [#r1{a = 1, b = 3}, + #r2{a = 2,b = 1}, + #r1{a = 2, b = 1}], + A#r1.a > + A#r1.b] + end(), + {[_],b} = + fun(L) -> + %% A is checked only once: + R1 = [{A,B} || A <- L, A#r1.a, B <- L, A#r1.b], + A = #r2{a = true}, + %% A is checked again: + B = if A#r1.a -> a; true -> b end, + {R1,B} + end([#r1{a = true, b = true}]), + + p = fun(A) when (A#r1.a =:= 2) or (A#r2.a =:= 1) -> o; + (_) -> p + end(#r1{a = 2}), + + o = fun(A) when (A#r1.a =:= 2) orelse (A#r2.a =:= 1) -> o; + (_) -> p + end(#r1{a = 2}), + + %% The test done twice (an effect of doing the test as soon as possible). + 3 = fun(A) when A#r1.a > 3, + record(A, r1) -> 3 + end(#r1{a = 5}), + + ok = fun() -> + F = fun(A) when (A#r2.a =:= 1) orelse (A#r2.a) -> 2; + (A) when (A#r1.a =:= 1) orelse (A#r1.a) -> 1; + (A) when (A#r2.a =:= 2) andalso (A#r2.b) -> 3 + end, + 1 = F(#r1{a = 1}), + 2 = F(#r2{a = true}), + 3 = F(#r2{a = 2, b = true}), + ok + end(), + + b = fun(A) when false or not (A#r.a =:= 1) -> a; + (_) -> b + end(#r1{a = 1}), + b = fun(A) when not (A#r.a =:= 1) or false -> a; + (_) -> b + end(#r1{a = 1}), + + ok = fun() -> + F = fun(A) when not (A#r.a =:= 1) -> yes; + (_) -> no + end, + no = F(#r1{a = 2}), + yes = F(#r{a = 2}), + no = F(#r{a = 1}), + ok + end(), + + %% No extra check added: + a = fun(A) when record(A, r), + A#r.a =:= 1, + A#r.b =:= 2 ->a + end(#r{a = 1, b = 2}), + a = fun(A) when erlang:is_record(A, r), + A#r.a =:= 1, + A#r.b =:= 2 -> a + end(#r{a = 1, b = 2}), + a = fun(A) when is_record(A, r), + A#r.a =:= 1, + A#r.b =:= 2 -> a + end(#r{a = 1, b = 2}), + + nop = fun(A) when (is_record(A, r1) and (A#r1.a > 3)) or (A#r2.a < 1) -> + japp; + (_) -> + nop + end(#r2{a = 0}), + nop = fun(A) when (A#r1.a > 3) or (A#r2.a < 1) -> japp; + (_) -> + nop + end(#r2{a = 0}), + + ok = fun() -> + F = fun(A) when (A#r1.a =:= 2) or (A#r2.a =:= 1) -> o; + (_) -> p + end, + p = F(#r2{a = 1}), + p = F(#r1{a = 2}), + ok + end(), + + ok = fun() -> + F = fun(A) when fail, A#r1.a; A#r1.a -> ab; + (_) -> bu + end, + ab = F(#r1{a = true}), + bu = F(#r2{a = true}), + ok + end(), + + both = fun(A) when A#r.a, A#r.b -> both + end(#r{a = true, b = true}), + + ok = fun() -> + F = fun(A, B) when ((A#r1.a) orelse (B#r2.a)) + or (B#r2.b) or (A#r1.b) -> + true; + (_, _) -> false + end, + true = F(#r1{a = false, b = false}, + #r2{a = false, b = true}), + false = F(#r1{a = true, b = true}, + #r1{a = false, b = true}), + ok + end(), + + ok. + ">>}, + {recs_2, + <<"-record(r1, {a, b = foo:bar(kljlfjsdlf, kjlksdjf)}). + -record(r2, {c = #r1{}, d = #r1{a = bar:foo(kljklsjdf)}}). + + t() -> + R = #r2{}, + R#r2{c = R, d = #r1{}}.">>} + ], + ?line compile(Config, Ts), + + ?line ok = pp_expr(<<"case #r{a={1,2},b=#r{}} of + X=Y=#r{a=foo,b=bar} -> + {(foooo:baaaar(X))#r{a = rep},Y,#r.b} + end">>), + ?line ok = pp_expr(<<"R#r{a = {kljasdklf,sdkfjsdl,sdafjkllsdf,sdfkjsd, + sdafjsd,sdf,sdafsd,sdfdsf,sdfdsf,dsfds}}">>), + ok. + +try_catch(suite) -> + []; +try_catch(Config) when is_list(Config) -> + Ts = [{try_1, % copied from erl_eval_SUITE + <<"t() -> try 1 of 1 -> 2 catch _:_ -> 3 end.">>}, + {try_2, + <<"t() -> try 1 of 1 -> 2; 3 -> 4 catch _:_ -> 5 end.">>}, + {try_3, + <<"t() -> try 3 of 1 -> 2; 3 -> 4 catch _:_ -> 5 end.">>}, + {try_4, + <<"t() -> try 1 after put(try_catch, 2) end.">>}, + {try_5, + <<"t() -> try 1 of 1 -> 2; 3 -> 4 + after put(try_catch, 5) end.">>}, + {try_6, + <<"t() -> try 1=2 catch throw:{badmatch,2} -> 3 end.">>}, + {try_7, + <<"t() -> try 1=2 of 3 -> 4 + catch error:{badmatch,2} -> 5 end.">>}, + {try_8, + <<"t() -> try 1=2 + catch error:{badmatch,2} -> 3 + after put(try_catch, 4) end.">>}, + {try_9, + <<"t() -> try 1=2 + catch error:{badmatch,2} -> 3 + after put(try_catch, 4) end.">>}, + {try_10, + <<"t() -> try a,b,c + catch exit:_ -> d; + throw:_ -> t; + error:{foo,bar} -> foo, + bar + end.">>}, + + {catch_1, + <<"t() -> catch foo.">>}, + {catch_2, + <<"t() -> case catch foo of bar -> foo end.">>}, + {catch_3, + <<"t() -> catch begin begin foo, bar, foo:bar(kljsldkfjdls,kljsdl), + (catch bar:foo(foo)) end end.">>} + ], + ?line compile(Config, Ts), + ?line ok = pp_expr(<<"try + erl_internal:bif(M,F,length(Args)) + of + true -> + call(N,Args,Prec,Hook); + false -> + call(Name,Args,Prec,Hook) + after foo end">>), + ok. + +if_then(suite) -> + []; +if_then(Config) when is_list(Config) -> + Ts = [{if_1, + <<"t() -> if 1 > 2 -> 1; true -> b end.">>}, + {if_2, + <<"t() -> if true -> true end.">>}, + {if_3, + <<"t() -> if 1 == 2 -> a; 1 > 2 -> b; 1 < 2 -> c end.">>} + ], + ?line compile(Config, Ts), + ok. + +receive_after(suite) -> + []; +receive_after(Config) when is_list(Config) -> + Ts = [{rec_1, + <<"t() -> receive foo -> bar; bar -> foo end.">>}, + {rec_2, + <<"t() -> receive foo -> bar after foo:bar() -> 0 end.">>}, + {rec_3, + <<"t() -> receive after 1 -> ok end.">>}, + {rec_4, + <<"t() -> receive {X,Y} -> {a,X,Y} end.">>}, + {rec_5, + <<"t() -> receive + {X,Y} -> + {X,Y}; + Z -> + Z + after + foo:bar() -> + {3,4} + end.">>} + ], + ?line compile(Config, Ts), + ok. + +bits(suite) -> + []; +bits(Config) when is_list(Config) -> + Ts = [{bit_1, % copied from shell_SUITE + <<"t() -> <<(<<\"abc\">>):3/binary>>.">>}, + {bit_2, + <<"t() -> <<(<<\"abc\">>)/binary>>.">>}, + {bit_3, + <<"t() -> <<3.14:64/float>>.">>}, + {bit_4, + <<"t() -> <<-20/signed>> = <<-20>>.">>}, + {bit_5, + <<"t() -> <<-300:16/signed>> = <<-300:16>>.">>}, + {bit_6, + <<"t() -> <<-(1 bsl 29):32/signed>> = <<-(1 bsl 29):32>>.">>}, + {bit_7, + <<"t() -> <> = <<\"hej\">>.">>}, + {bit_8, + <<"t() -> <<>>.">>}, + {bit_9, + <<"">>} + ], + ?line compile(Config, Ts), + ?line ok = pp_expr(<<"<<(list_to_binary([1,2]))/binary>>">>), + ?line ok = pp_expr( + <<"<<(list_to_binary([1,2])):all/binary-unit:8-unsigned-big>>">>), + ?line ok = pp_expr(<<"<<<<\"hej\">>/binary>>">>), + ?line ok = pp_expr(<<"<<(foo:bar())/binary>>">>), + ?line ok = pp_expr(<<"<<(a)/binary>>">>), + ?line ok = pp_expr(<<"<>">>), + ?line ok = pp_expr(<<"<<{a,b}/binary>>">>), + ?line ok = pp_expr(<<"<<{foo:bar(),b}/binary>>">>), + ?line ok = pp_expr(<<"<<(foo:bar()):(foo:bar())/binary>>">>), + ?line ok = pp_expr(<<"<<(foo.bar)/binary>>">>), + ?line ok = pp_expr(<<"<<(foo.bar):all/binary>>">>), + ?line ok = pp_expr(<<"<<(foo.bar):(foo.bar)/binary>>">>), + ok. + +head_tail(suite) -> + []; +head_tail(Config) when is_list(Config) -> + Ts = [{list_1, + <<"t() -> [a | b].">>}, + {list_2, + <<"t() -> [a,b,$\n].">>}, + {list_3, + <<"t() -> [].">>}, + {list_4, + <<"t() -> [a].">>}, + {list_5, + <<"t() -> + [foo:bar(lkjljlskdfj, klsdajflds, sdafkljsdlfkjdas, kjlsdadjl), + bar:foo(kljlkjsdf, lkjsdlfj, [kljsfj, sdfdsfsad])].">>} + ], + ?line compile(Config, Ts), + ok. + +package(suite) -> + []; +package(Config) when is_list(Config) -> + Ts = [{package_1, + <<"t() -> a.b:foo().">>}, + {package_2, + <<"t() -> .lists:sort([]).">>} + ], + ?line compile(Config, Ts), + ok. + +cond1(suite) -> + []; +cond1(Config) when is_list(Config) -> + C = {'cond',1,[{clause,2,[],[[{tuple,2,[{atom,2,foo},{atom,2,bar}]}]], + [{cons,3,{atom,3,a},{cons,3,{atom,3,b},{nil,3}}}]}, + {clause,4,[],[[{atom,4,true}]], + [{tuple,5,[{atom,5,x},{atom,5,y}]}]}]}, + ?line CChars = lists:flatten(erl_pp:expr(C)), +% ?line "cond {foo,bar} -> [a,b]; true -> {x,y} end" = CChars, + ?line "cond\n" + " {foo,bar} ->\n" + " [a,b];\n" + " true ->\n" + " {x,y}\n" + "end" = CChars, +% ?line ok = pp_expr(<<"cond +% {foo,bar} -> +% [a,b]; +% true -> +% {x,y} +% end">>), + ok. + +block(suite) -> + []; +block(Config) when is_list(Config) -> + Ts = [{block_1, + <<"t() -> begin a,{c,d} end.">>} + ], + ?line compile(Config, Ts), + ok. + +case1(suite) -> + []; +case1(Config) when is_list(Config) -> + Ts = [{case_1, + <<"t() -> case {foo,bar} of + {A,B} when true -> + [A,B]; + _ -> + foo + end.">>} + ], + ?line compile(Config, Ts), + ?line ok = pp_expr(<<"case + erl_internal:bif(M,F,length(Args)) + of + true -> + call(N,Args,Prec,Hook); + false -> + call(Name,Args,Prec,Hook) + end">>), + ok. + +ops(suite) -> + []; +ops(Config) when is_list(Config) -> + Ts = [{ops_1, + <<"t() -> {a,b} + (3 - 2) + 4.">>}, + {ops_2, + <<"t() -> a - (3 + 4).">>}, + {ops_3, + <<"t() -> - (- (- (- (- 3)))).">>} + ], + ?line compile(Config, Ts), + ok. + +messages(suite) -> + []; +messages(Config) when is_list(Config) -> + ?line true = "{error,{some,\"error\"}}\n" =:= + lists:flatten(erl_pp:form({error,{some,"error"}})), + ?line true = "{warning,{some,\"warning\"}}\n" =:= + lists:flatten(erl_pp:form({warning,{some,"warning"}})), + ?line true = "\n" =:= lists:flatten(erl_pp:form({eof,0})), + ok. + +old_mnemosyne_syntax(suite) -> + []; +old_mnemosyne_syntax(Config) when is_list(Config) -> + %% Since we have kept the 'query' syntax and ':-' token, + %% better test that we can pretty print it. + Q = {'query',6, + {lc,6, + {var,6,'X'}, + [{generate,6, + {var,6,'X'}, + {call,6,{atom,6,table},[{atom,6,tab}]}}, + {match,7, + {record_field,7,{var,7,'X'},{atom,7,foo}}, + {atom,7,bar}}]}}, + ?line "query\n" + " [ \n" % extra space... + " X ||\n" + " X <- table(tab),\n" + " X.foo = bar\n" + " ]\n" + "end" = + lists:flatten(erl_pp:expr(Q)), + + R = {rule,12,sales,2, + [{clause,12, + [{var,12,'E'},{atom,12,employee}], + [], + [{generate,13, + {var,13,'E'}, + {call,13,{atom,13,table},[{atom,13,employee}]}}, + {match,14, + {record_field,14,{var,14,'E'},{atom,14,salary}}, + {atom,14,sales}}]}]}, + ?line "sales(E, employee) :-\n" + " E <- table(employee),\n" + " E.salary = sales.\n" = + lists:flatten(erl_pp:form(R)), + ok. + + +attributes(suite) -> + [misc_attrs, import_export]. + +import_export(suite) -> + []; +import_export(Config) when is_list(Config) -> + Ts = [{import_1, + <<"-import(lists, [max/1, reverse/1]). + -import(sofs, []). + t(L) -> + max(reverse(L)).">>}, + {export_1, + <<"-export([t/0]). + -export([]). + t() -> [].">>}, + {qlc_1, + <<"-include_lib(\"stdlib/include/qlc.hrl\"). + t() -> qlc:q([X || X <- []]).">>} + ], + ?line compile(Config, Ts), + ok. + +misc_attrs(suite) -> + []; +misc_attrs(Config) when is_list(Config) -> + ?line ok = pp_forms(<<"-module(m). ">>), + ?line ok = pp_forms(<<"-module(m.p, [A,B]). ">>), + ?line ok = pp_forms(<<"-module(m, [Aafjlksfjdlsjflsdfjlsdjflkdsfjlk," + "Blsjfdlslfjsdf]). ">>), + ?line ok = pp_forms(<<"-export([]). ">>), + ?line ok = pp_forms(<<"-export([foo/2, bar/0]). ">>), + ?line ok = pp_forms(<<"-export([bar/0]). ">>), + ?line ok = pp_forms(<<"-import(.lists). ">>), + ?line ok = pp_forms(<<"-import(lists, []). ">>), + ?line ok = pp_forms(<<"-import(lists, [map/2]). ">>), + ?line ok = pp_forms(<<"-import(lists, [map/2, foreach/2]). ">>), + ?line ok = pp_forms(<<"-'wild '({attr2,3}). ">>), + ?line ok = pp_forms(<<"-record(a, {b,c}). ">>), + ?line ok = pp_forms(<<"-record(' a ', {}). ">>), + ?line ok = pp_forms(<<"-record(' a ', {foo = foo:bar()}). ">>), + + ok. + +hook(suite) -> + []; +hook(Config) when is_list(Config) -> + Lc = parse_expr(binary_to_list(<<"[X || X <- [1,2,3]].">>)), + H = fun hook/4, + Expr = {call,0,{atom,0,fff},[{foo,Lc},{foo,Lc},{foo,Lc}]}, + EChars = lists:flatten(erl_pp:expr(Expr, 0, H)), + Call = {call,0,{atom,0,foo},[Lc]}, + Expr2 = {call,0,{atom,0,fff},[Call,Call,Call]}, + EChars2 = erl_pp:exprs([Expr2]), + ?line true = EChars =:= lists:flatten(EChars2), + + EsChars = erl_pp:exprs([Expr], H), + ?line true = EChars =:= lists:flatten(EsChars), + + F = {function,1,ffff,0,[{clause,1,[],[],[Expr]}]}, + FuncChars = lists:flatten(erl_pp:function(F, H)), + F2 = {function,1,ffff,0,[{clause,1,[],[],[Expr2]}]}, + FuncChars2 = erl_pp:function(F2), + ?line true = FuncChars =:= lists:flatten(FuncChars2), + FFormChars = erl_pp:form(F, H), + ?line true = FuncChars =:= lists:flatten(FFormChars), + + A = {attribute,1,record,{r,[{record_field,1,{atom,1,a},Expr}]}}, + AChars = lists:flatten(erl_pp:attribute(A, H)), + A2 = {attribute,1,record,{r,[{record_field,1,{atom,1,a},Expr2}]}}, + AChars2 = erl_pp:attribute(A2), + ?line true = AChars =:= lists:flatten(AChars2), + AFormChars = erl_pp:form(A, H), + ?line true = AChars =:= lists:flatten(AFormChars), + + R = {rule,0,sales,0, + [{clause,0,[{var,0,'E'},{atom,0,employee}],[], + [{generate,2,{var,2,'E'}, + {call,2,{atom,2,table},[{atom,2,employee}]}}, + {match,3, + {record_field,3,{var,3,'E'},{atom,3,salary}}, + {foo,Expr}}]}]}, + RChars = lists:flatten(erl_pp:rule(R, H)), + R2 = {rule,0,sales,0, + [{clause,0,[{var,0,'E'},{atom,0,employee}],[], + [{generate,2,{var,2,'E'}, + {call,2,{atom,2,table},[{atom,2,employee}]}}, + {match,3, + {record_field,3,{var,3,'E'},{atom,3,salary}}, + {call,0,{atom,0,foo},[Expr2]}}]}]}, + RChars2 = erl_pp:rule(R2), + ?line true = RChars =:= lists:flatten(RChars2), + ARChars = erl_pp:form(R, H), + ?line true = RChars =:= lists:flatten(ARChars), + + ?line "INVALID-FORM:{foo,bar}:" = lists:flatten(erl_pp:expr({foo,bar})), + + %% A list (as before R6), not a list of lists. + G = [{op,1,'>',{atom,1,a},{foo,{atom,1,b}}}], % not a proper guard + GChars = lists:flatten(erl_pp:guard(G, H)), + G2 = [{op,1,'>',{atom,1,a}, + {call,0,{atom,0,foo},[{atom,1,b}]}}], % not a proper guard + GChars2 = erl_pp:guard(G2), + ?line true = GChars =:= lists:flatten(GChars2), + + EH = {?MODULE, ehook, [foo,bar]}, + XEChars = erl_pp:expr(Expr, -1, EH), + ?line true = remove_indentation(EChars) =:= lists:flatten(XEChars), + XEChars2 = erl_pp:expr(Expr, EH), + ?line true = EChars =:= lists:flatten(XEChars2), + + %% Note: no leading spaces before "begin". + Block = {block,0,[{match,0,{var,0,'A'},{integer,0,3}}, + {atom,0,true}]}, + ?line "begin\n A =" ++ _ = + lists:flatten(erl_pp:expr(Block, 17, none)), + + %% Special... + ?line true = + "{some,value}" =:= lists:flatten(erl_pp:expr({value,0,{some,value}})), + + %% Silly... + ?line true = + "if true -> 0 end" =:= + flat_expr({'if',0,[{clause,0,[],[],[{atom,0,0}]}]}), + + %% More compatibility: before R6 + OldIf = {'if',0,[{clause,0,[],[{atom,0,true}],[{atom,0,b}]}]}, + NewIf = {'if',0,[{clause,0,[],[[{atom,0,true}]],[{atom,0,b}]}]}, + OldIfChars = lists:flatten(erl_pp:expr(OldIf)), + NewIfChars = lists:flatten(erl_pp:expr(NewIf)), + ?line true = OldIfChars =:= NewIfChars, + + ok. + +remove_indentation(S) -> + %% T is for the very special leaf(" ") used for lc and bc. + T = re:replace(S, " \n *", "", [{return,list},global]), + re:replace(T, "\n *", " ", [{return,list},global]). + +ehook(HE, I, P, H, foo, bar) -> + hook(HE, I, P, H). + +hook({foo,E}, I, P, H) -> + erl_pp:expr({call,0,{atom,0,foo},[E]}, I, P, H). + +neg_indent(suite) -> + []; +neg_indent(Config) when is_list(Config) -> + ?line ok = pp_expr(<<"begin a end">>), + ?line ok = pp_expr(<<"begin a,b end">>), + ?line ok = pp_expr(<<"try a,b,c + catch exit:_ -> d; + throw:_ -> t; + error:{foo,bar} -> foo, + bar + end">>), + ?line ok = pp_expr( + <<"fun() -> + F = fun(A, B) when ((A#r1.a) orelse (B#r2.a)) + or (B#r2.b) or (A#r1.b) -> + true; + (_, _) -> false + end, + true = F(#r1{a = false, b = false}, + #r2{a = false, b = true}), + false = F(#r1{a = true, b = true}, + #r1{a = false, b = true}), + ok + end()">>), + + ?line ok = pp_expr(<<"[X || X <- a, true]">>), + ?line ok = pp_expr(<<"{[a,b,c],[d,e|f]}">>), + ?line ok = pp_expr(<<"f(a,b,c)">>), + ?line ok = pp_expr(<<"fun() when a,b;c,d -> a end">>), + ?line ok = pp_expr(<<"<<34:32,17:32>>">>), + ?line ok = pp_expr(<<"if a,b,c -> d; e,f,g -> h,i end">>), + ?line ok = pp_expr(<<"if a -> d; c -> d end">>), + ?line ok = pp_expr(<<"receive after 1 -> 2 end">>), + ?line ok = pp_expr(<<"begin a,b,c end">>), + + ?line "\"\"" = flat_expr({string,0,""}), + ?line ok = pp_expr(<<"\"abc\"">>), + ?line ok = pp_expr(<<"\"abc\n\n\n\n\nkjsd\n\n\n\n\nkljsddf\n\n\n\n\n" + "klafd\n\n\n\n\nkljsdf\n\n\n\n\nsdf\n\n\n\n\n\"">>), + ?line ok = pp_expr(<<"fkjlskljklkkljlkjlkjkljlkjsljklf" + "lsdjlfdsjlfjsdlfjdslfjdlsjfsdjfklsdkfjsdf(" + "\"abc\n\n\n\n\nkjsd\n\n\n\n\nkljsddf\n\n\n\n\n" + "kljsafd\n\n\n\n\nkljsdf\n\n\n\n\nkjsdf" + "\n\n\n\n\n\")">>), + + %% fun-info is skipped when everything is to fit on one single line + Fun1 = {'fun',1,{function,t,0},{0,45353021,'-t/0-fun-0-'}}, + ?line "fun t/0" = flat_expr(Fun1), + Fun2 = {'fun',2,{clauses,[{clause,2,[],[],[{atom,3,true}]}]}, + {0,108059557,'-t/0-fun-0-'}}, + ?line "fun() -> true end" = flat_expr(Fun2), + + ok. + +tickets(suite) -> + [otp_6321, otp_6911, otp_6914, otp_8150, otp_8238]. + +otp_6321(doc) -> + "OTP_6321. Bug fix of exprs()."; +otp_6321(suite) -> []; +otp_6321(Config) when is_list(Config) -> + Str = "S = hopp, {hej, S}. ", + {done, {ok, Tokens, _EndLine}, ""} = erl_scan:tokens("", Str, _L=1), + {ok, Exprs} = erl_parse:parse_exprs(Tokens), + "S = hopp, {hej,S}" = lists:flatten(erl_pp:exprs(Exprs)), + ok. + +otp_6911(doc) -> + "OTP_6911. More newlines."; +otp_6911(suite) -> []; +otp_6911(Config) when is_list(Config) -> + F = {function,5,thomas,1, + [{clause,5, + [{var,5,'X'}], + [], + [{'case',6, + {var,6,'X'}, + [{clause,7,[{atom,7,true}],[],[{integer,7,12}]}, + {clause,8,[{atom,8,false}],[],[{integer,8,14}]}]}]}]}, + ?line Chars = lists:flatten(erl_pp:form(F)), + ?line "thomas(X) ->\n" + " case X of\n" + " true ->\n" + " 12;\n" + " false ->\n" + " 14\n" + " end.\n" = Chars, + ?line ok = pp_expr(<<"case X of true -> 12; false -> 14 end">>), + ?line ok = pp_expr(<<"receive after 1 -> ok end">>), + ok. + +otp_6914(doc) -> + "OTP_6914. Binary comprehensions."; +otp_6914(suite) -> []; +otp_6914(Config) when is_list(Config) -> + ?line ok = pp_expr(<<"<< <> || B <- [0,1,1] >>">>), + ?line ok = pp_expr(<<"[ B || <> <= <<\"hi\">>]">>), + ?line ok = pp_expr(<<"<< <<1:1>> || true >>">>), + ok. + +otp_8150(doc) -> + "OTP_8150. Types."; +otp_8150(suite) -> []; +otp_8150(Config) when is_list(Config) -> + ?line _ = [{N,ok} = {N,pp_forms(B)} || + {N,B} <- type_examples() + ], + ok. + +otp_8238(doc) -> + "OTP_8238. Bugfix 'E'."; +otp_8238(suite) -> []; +otp_8238(Config) when is_list(Config) -> + Ex = [<<"-record(rec1, {}).\n" + "-record(rec2, {a, b}).\n" + "-record(rec3, {f123, g, h}).\n">>, + <<"-type line() :: integer().\n">>, + <<"-type info_line() :: integer() | term().\n">>, + <<"-type column() :: pos_integer().\n">>, + [["\n", B] || {_,B} <- type_examples()], + <<"t1(T) ->\n" + " foo:bar(#rec1{}, #rec2{}),\n" + " T.\n" + "t2() ->\n" + " #r{}.\n">> + ], + ?line compile(Config, [{otp_8238,iolist_to_binary(Ex)}]), + ok. + +type_examples() -> + [{ex1,<<"-type ann() :: Var :: integer(). ">>}, + {ex2,<<"-type ann2() :: Var :: " + "'return' | 'return_white_spaces' | 'return_comments'" + " | 'text' | ann(). ">>}, + {ex3,<<"-type paren() :: (ann2()). ">>}, + {ex4,<<"-type t1() :: atom(). ">>}, + {ex5,<<"-type t2() :: [t1()]. ">>}, + {ex6,<<"-type t3(Atom) :: integer(Atom). ">>}, + {ex7,<<"-type t4() :: t3(foobar). ">>}, + {ex8,<<"-type t5() :: {t1(), t3(foo)}. ">>}, + {ex9,<<"-type t6() :: 1 | 2 | 3 | 'foo' | 'bar'. ">>}, + {ex10,<<"-type t7() :: []. ">>}, + {ex11,<<"-type t71() :: [_]. ">>}, + {ex12,<<"-type t8() :: {any(),none(),pid(),port()," + "reference(),float()}. ">>}, + {ex13,<<"-type t9() :: [1|2|3|foo|bar] | " + "list(a | b | c) | t71(). ">>}, + {ex14,<<"-type t10() :: {1|2|3|foo|t9()} | {}. ">>}, + {ex15,<<"-type t11() :: 1..2. ">>}, + {ex16,<<"-type t13() :: maybe_improper_list(integer(), t11()). ">>}, + {ex17,<<"-type t14() :: [erl_scan:foo() | " + "erl_scan:bar(34, 92) | t13() | m:f(integer() | <<_:_*16>>)]. ">>}, + {ex18,<<"-type t15() :: {binary(),<<>>,<<_:34>>,<<_:_*42>>," + "<<_:3,_:_*14>>,<<>>} | [<<>>|<<_:34>>|<<_:16>>|" + "<<_:3,_:_*1472>>|<<_:19,_:_*14>>| <<_:34>>|" + "<<_:34>>|<<_:34>>|<<_:34>>]. ">>}, + {ex19,<<"-type t16() :: fun(). ">>}, + {ex20,<<"-type t17() :: fun((...) -> paren()). ">>}, + {ex21,<<"-type t18() :: fun(() -> t17() | t16()). ">>}, + {ex22,<<"-type t19() :: fun((t18()) -> t16()) |" + "fun((nonempty_maybe_improper_list('integer', any())|" + "1|2|3|a|b|<<_:3,_:_*14>>|integer()) ->" + "nonempty_maybe_improper_list('integer', any())|" + "1|2|3|a|b|<<_:3,_:_*14>>|integer()). ">>}, + {ex23,<<"-type t20() :: [t19(), ...]. ">>}, + {ex24,<<"-type t21() :: tuple(). ">>}, + {ex25,<<"-type t21(A) :: A. ">>}, + {ex26,<<"-type t22() :: t21(integer()). ">>}, + {ex27,<<"-type t23() :: #rec1{}. ">>}, + {ex28,<<"-type t24() :: #rec2{a :: t23(), b :: [atom()]}. ">>}, + {ex29,<<"-type t25() :: #rec3{f123 :: [t24() | " + "1|2|3|4|a|b|c|d| " + "nonempty_maybe_improper_list(integer, any())]}. ">>}, + {ex30,<<"-type t99() ::" + "{t2(),t4(),t5(),t6(),t7(),t8(),t10(),t14()," + "t15(),t20(),t21(), t22(),t25()}. ">>}, + {ex31,<<"-spec t1(FooBar :: t99()) -> t99();" + "(t2()) -> t2();" + "(t4()) -> t4() when is_subtype(t4(), t24);" + "(t23()) -> t23() when is_subtype(t23(), atom())," + " is_subtype(t23(), t14());" + "(t24()) -> t24() when is_subtype(t24(), atom())," + " is_subtype(t24(), t14())," + " is_subtype(t24(), t4()).">>}, + {ex32,<<"-spec mod:t2() -> any(). ">>}, + {ex33,<<"-opaque attributes_data() :: " + "[{'column', column()} | {'line', info_line()} |" + " {'text', string()}] | {line(),column()}. ">>}, + {ex34,<<"-record(r,{" + "f1 :: attributes_data()," + "f222 = foo:bar(34, #rec3{}, 234234234423, " + " aassdsfsdfsdf, 2234242323) :: " + " [t24() | 1|2|3|4|a|b|c|d| " + " nonempty_maybe_improper_list(integer, any())]," + "f333 :: [t24() | 1|2|3|4|a|b|c|d| " + " nonempty_maybe_improper_list(integer, any())]," + "f3 = x:y()," + "f4 = x:z() :: t99()," + "f17 :: 'undefined'," + "f18 :: 1 | 2 | 'undefined'," + "f19 = 3 :: integer()|undefined," + "f5 = 3 :: undefined|integer()}). ">>}]. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +compile(Config, Tests) -> + F = fun({N,P}, BadL) -> + case catch compile_file(Config, P) of + ok -> + case pp_forms(P) of + ok -> + BadL; + not_ok -> + ?t:format("~nTest ~p failed.~n", [N]), + fail() + end; + Bad -> + ?t:format("~nTest ~p failed. got~n ~p~n", + [N, Bad]), + fail() + end + end, + lists:foldl(F, [], Tests). + +compile_file(Config, Test0) -> + case compile_file(Config, Test0, ['E']) of + {ok, RootFile} -> + File = RootFile ++ ".E", + {ok, Bin0} = file:read_file(File), + Bin = strip_module_info(Bin0), + %% A very simple check: just try to compile the output. + case compile_file(Config, Bin, []) of + {ok, RootFile2} -> + File2 = RootFile2 ++ ".E", + {ok, Bin1} = file:read_file(File2), + case Bin0 =:= Bin1 of + true -> + test_max_line(binary_to_list(Bin)); + false -> + {error, file_contents_modified, {Bin0, Bin1}} + end; + Error -> + {error, could_not_compile_E_file, Error} + end; + Error -> + Error + end. + +compile_file(Config, Test0, Opts0) -> + FileName = filename('erl_pp_test.erl', Config), + Test = list_to_binary(["-module(erl_pp_test). " + "-compile(export_all). ", + Test0]), + Opts = [export_all,return,nowarn_unused_record,{outdir,?privdir} | Opts0], + ok = file:write_file(FileName, Test), + case compile:file(FileName, Opts) of + {ok, _M, _Ws} -> + {ok, filename:rootname(FileName)}; + Error -> Error + end. + +strip_module_info(Bin) -> + {match, [{Start,_Len}|_]} = re:run(Bin, "module_info"), + <> = Bin, + R. + +flat_expr(Expr) -> + lists:flatten(erl_pp:expr(Expr, -1, none)). + +pp_forms(Bin) -> + pp_forms(Bin, none). + +pp_forms(Bin, Hook) -> + PP1 = (catch parse_and_pp_forms(binary_to_list(Bin), Hook)), + PP2 = (catch parse_and_pp_forms(PP1, Hook)), + case PP1 =:= PP2 of % same line numbers + true -> + test_max_line(PP1); + false -> + not_ok + end. + +parse_and_pp_forms(String, Hook) -> + lists:append(lists:map(fun(AF) -> erl_pp:form(AF, Hook) + end, parse_forms(String))). + +parse_forms(Chars) -> + String = lists:flatten(Chars), + parse_forms2(String, [], 1, []). + +parse_forms2([], _Cont, _Line, Forms) -> + lists:reverse(Forms); +parse_forms2(String, Cont0, Line, Forms) -> + case erl_scan:tokens(Cont0, String, Line) of + {done, {ok, Tokens, EndLine}, Chars} -> + {ok, Form} = erl_parse:parse_form(Tokens), + parse_forms2(Chars, [], EndLine, [Form | Forms]); + {more, Cont} when element(3, Cont) =:= [] -> + %% extra spaces after forms... + parse_forms2([], Cont, Line, Forms); + {more, Cont} -> + %% final dot needs a space... + parse_forms2(" ", Cont, Line, Forms) + end. + +pp_expr(Bin) -> + pp_expr(Bin, none). + +%% Final dot is added. +pp_expr(Bin, Hook) -> + PP1 = (catch parse_and_pp_expr(binary_to_list(Bin), 0, Hook)), + PPneg = (catch parse_and_pp_expr(binary_to_list(Bin), -1, Hook)), + PP2 = (catch parse_and_pp_expr(PPneg, 0, Hook)), + if + PP1 =:= PP2 -> % same line numbers + case + (test_max_line(PP1) =:= ok) and (test_new_line(PPneg) =:= ok) + of + true -> + ok; + false -> + not_ok + end; + true -> + not_ok + end. + +parse_and_pp_expr(String, Indent, Hook) -> + StringDot = lists:flatten(String) ++ ".", + erl_pp:expr(parse_expr(StringDot), Indent, Hook). + +parse_expr(Chars) -> + {ok, Tokens, _} = erl_scan:string(Chars), + {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + Expr. + +test_new_line(String) -> + case string:chr(String, $\n) of + 0 -> ok; + _ -> not_ok + end. + +test_max_line(String) -> + case max_line(String) of + ML when ML > 100 -> + {error, max_line_too_big, {ML,String}}; + _ML -> + ok + end. + +max_line(String) -> + lists:max([0 | [length(Sub) || + Sub <- string:tokens(String, "\n"), + string:substr(Sub, 1, 5) =/= "-file"]]). + +filename(Name, Config) when is_atom(Name) -> + filename(atom_to_list(Name), Config); +filename(Name, Config) -> + filename:join(?privdir, Name). + +fail() -> + io:format("failed~n"), + ?t:fail(). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/erl_scan_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/erl_scan_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/erl_scan_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/erl_scan_SUITE.erl 2009-09-18 15:07:55.000000000 +0100 @@ -0,0 +1,1214 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(erl_scan_SUITE). +-export([all/1]). + +-export([error/1, error_1/1, error_2/1, iso88591/1, otp_7810/1]). + +-import(lists, [nth/2,flatten/1]). +-import(io_lib, [print/1]). + +%% +%% Define to run outside of test server +%% +%-define(STANDALONE,1). + +-ifdef(STANDALONE). +-compile(export_all). +-define(line, put(line, ?LINE), ). +-define(config(A,B),config(A,B)). +-define(t, test_server). +%% config(priv_dir, _) -> +%% "."; +%% config(data_dir, _) -> +%% ".". +-else. +-include("test_server.hrl"). +-export([init_per_testcase/2, fin_per_testcase/2]). + +init_per_testcase(_Case, Config) when is_list(Config) -> + ?line Dog=test_server:timetrap(test_server:seconds(1200)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. +-endif. + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +all(doc) -> + ["Test cases for the 'erl_scan' module."]; +all(suite) -> + [error,iso88591,otp_7810]. + +error(doc) -> + ["Error cases"]; +error(suite) -> + [error_1, error_2]. + +error_1(doc) -> + ["(OTP-2347)"]; +error_1(suite) -> + []; +error_1(Config) when is_list(Config) -> + ?line {error, _, _} = erl_scan:string("'a"), + ok. + +error_2(doc) -> + ["Checks that format_error works on the error cases."]; +error_2(suite) -> + []; +error_2(Config) when is_list(Config) -> + ?line lists:foreach(fun check/1, error_cases()), + ok. + +error_cases() -> + ["'a", + "\"a", + "'\\", + "\"\\", + "$", + "$\\", + "2.3e", + "2.3e-", + "91#9" +]. + +assert_type(N, integer) when is_integer(N) -> + ok; +assert_type(N, atom) when is_atom(N) -> + ok. + +check(String) -> + Error = erl_scan:string(String), + check_error(Error, erl_scan). + +%%% (This should be useful for all format_error functions.) +check_error({error, Info, EndLine}, Module0) -> + ?line {ErrorLine, Module, Desc} = Info, + ?line true = (Module == Module0), + ?line assert_type(EndLine, integer), + ?line assert_type(ErrorLine, integer), + ?line true = (ErrorLine =< EndLine), + ?line String = lists:flatten(Module0:format_error(Desc)), + ?line true = io_lib:printable_list(String). + +iso88591(doc) -> ["Tests the support for ISO-8859-1 i.e Latin-1"]; +iso88591(suite) -> []; +iso88591(Config) when is_list(Config) -> + ?line ok = + case catch begin + %% Some atom and variable names + V1s = [$Á,$á,$é,$ë], + V2s = [$N,$ä,$r], + A1s = [$h,$ä,$r], + A2s = [$ö,$r,$e], + %% Test parsing atom and variable characters. + {ok,Ts1,_} = erl_scan:string(V1s ++ " " ++ V2s ++ + "\327" ++ + A1s ++ " " ++ A2s), + V1s = atom_to_list(element(3, nth(1, Ts1))), + V2s = atom_to_list(element(3, nth(2, Ts1))), + A1s = atom_to_list(element(3, nth(4, Ts1))), + A2s = atom_to_list(element(3, nth(5, Ts1))), + %% Test printing atoms + A1s = flatten(print(element(3, nth(4, Ts1)))), + A2s = flatten(print(element(3, nth(5, Ts1)))), + %% Test parsing and printing strings. + S1 = V1s ++ "\327" ++ A1s ++ "\250" ++ A2s, + S1s = "\"" ++ S1 ++ "\"", + {ok,Ts2,_} = erl_scan:string(S1s), + S1 = element(3, nth(1, Ts2)), + S1s = flatten(print(element(3, nth(1, Ts2)))), + ok %It all worked + end of + {'EXIT',R} -> %Something went wrong! + {error,R}; + ok -> ok %Aok + end. + +otp_7810(doc) -> + ["OTP-7810. White spaces, comments, and more.."]; +otp_7810(suite) -> + []; +otp_7810(Config) when is_list(Config) -> + ?line ok = reserved_words(), + ?line ok = atoms(), + ?line ok = punctuations(), + ?line ok = comments(), + ?line ok = errors(), + ?line ok = integers(), + ?line ok = base_integers(), + ?line ok = floats(), + ?line ok = dots(), + ?line ok = chars(), + ?line ok = variables(), + ?line ok = eof(), + ?line ok = illegal(), + ?line ok = crashes(), + + ?line ok = options(), + ?line ok = token_info(), + ?line ok = column_errors(), + ?line ok = white_spaces(), + + ?line ok = unicode(), + + ?line ok = more_chars(), + ?line ok = more_options(), + ?line ok = attributes_info(), + ?line ok = set_attribute(), + + ok. + +reserved_words() -> + L = ['after', 'begin', 'case', 'try', 'cond', 'catch', + 'andalso', 'orelse', 'end', 'fun', 'if', 'let', 'of', + 'query', 'receive', 'when', 'bnot', 'not', 'div', + 'rem', 'band', 'and', 'bor', 'bxor', 'bsl', 'bsr', + 'or', 'xor', 'spec'] , % 'spec' shouldn't be there... + [begin + ?line {RW, true} = {RW, erl_scan:reserved_word(RW)}, + S = atom_to_list(RW), + Ts = [{RW,1}], + ?line test_string(S, Ts) + end || RW <- L], + ok. + + +atoms() -> + ?line test_string("a + b", [{atom,1,a},{atom,2,b}]), + ?line test_string("'a b'", [{atom,1,'a b'}]), + ?line test_string("a", [{atom,1,a}]), + ?line test_string("a@2", [{atom,1,a@2}]), + ?line test_string([39,65,200,39], [{atom,1,'AÈ'}]), + ?line test_string("ärlig östen", [{atom,1,ärlig},{atom,1,östen}]), + ?line {ok,[{atom,_,'$a'}],{1,6}} = + erl_scan:string("'$\\a'", {1,1}), + ?line test("'$\\a'"), + ok. + +punctuations() -> + L = ["<<", "<-", "<=", "<", ">>", ">=", ">", "->", "--", + "-", "++", "+", "=:=", "=/=", "=<", "==", "=", "/=", + "/", "||", "|", ":-", "::", ":"], + %% One token at a time: + [begin + W = list_to_atom(S), + Ts = [{W,1}], + ?line test_string(S, Ts) + end || S <- L], + Three = ["/=:=", "<=:=", "==:=", ">=:="], % three tokens... + No = Three ++ L, + SL0 = [{S1++S2,{-length(S1),S1,S2}} || + S1 <- L, + S2 <- L, + not lists:member(S1++S2, No)], + SL = family_list(SL0), + %% Two tokens. When there are several answers, the one with + %% the longest first token is chosen: + %% [the special case "=<<" is among the tested ones] + [begin + W1 = list_to_atom(S1), + W2 = list_to_atom(S2), + Ts = [{W1,1},{W2,1}], + ?line test_string(S, Ts) + end || {S,[{_,S1,S2}|_]} <- SL], + + PTs1 = [{'!',1},{'(',1},{')',1},{',',1},{';',1},{'=',1},{'[',1}, + {']',1},{'{',1},{'|',1},{'}',1}], + ?line test_string("!(),;=[]{|}", PTs1), + + PTs2 = [{'#',1},{'&',1},{'*',1},{'+',1},{'/',1}, + {':',1},{'<',1},{'>',1},{'?',1},{'@',1}, + {'\\',1},{'^',1},{'`',1},{'~',1}], + ?line test_string("#&*+/:<>?@\\^`~", PTs2), + + ok. + +comments() -> + ?line test("a %%\n b"), + ?line {ok,[],1} = erl_scan:string("%"), + ?line test("a %%\n b"), + ?line {ok,[{atom,_,a},{atom,_,b}],{2,3}} = + erl_scan:string("a %%\n b",{1,1}), + ?line {ok,[{atom,_,a},{comment,_,"%%"},{atom,_,b}],{2,3}} = + erl_scan:string("a %%\n b",{1,1}, [return_comments]), + ?line {ok,[{atom,_,a}, + {white_space,_," "}, + {white_space,_,"\n "}, + {atom,_,b}], + {2,3}} = + erl_scan:string("a %%\n b",{1,1},[return_white_spaces]), + ?line {ok,[{atom,_,a}, + {white_space,_," "}, + {comment,_,"%%"}, + {white_space,_,"\n "}, + {atom,_,b}], + {2,3}} = erl_scan:string("a %%\n b",{1,1},[return]), + ok. + +errors() -> + ?line {error,{1,erl_scan,{string,$',"qa"}},1} = erl_scan:string("'qa"), %' + ?line {error,{1,erl_scan,{string,$","str"}},1} = %" + erl_scan:string("\"str"), %" + ?line {error,{1,erl_scan,char},1} = erl_scan:string("$"), + ?line test_string([34,65,200,34], [{string,1,"AÈ"}]), + ?line test_string("\\", [{'\\',1}]), + ?line {'EXIT',_} = + (catch {foo, erl_scan:string('$\\a', {1,1})}), % type error + ?line {'EXIT',_} = + (catch {foo, erl_scan:tokens([], '$\\a', {1,1})}), % type error + + ?line "{a,tuple}" = erl_scan:format_error({a,tuple}), + ok. + +integers() -> + [begin + I = list_to_integer(S), + Ts = [{integer,1,I}], + ?line test_string(S, Ts) + end || S <- [[N] || N <- lists:seq($0, $9)] ++ ["2323","000"] ], + ok. + +base_integers() -> + [begin + B = list_to_integer(BS), + I = erlang:list_to_integer(S, B), + Ts = [{integer,1,I}], + ?line test_string(BS++"#"++S, Ts) + end || {BS,S} <- [{"2","11"}, {"5","23234"}, {"12","05a"}, + {"16","abcdef"}, {"16","ABCDEF"}] ], + + ?line {error,{1,erl_scan,{base,1}},1} = erl_scan:string("1#000"), + + ?line test_string("12#bc", [{integer,1,11},{atom,1,c}]), + + [begin + Str = BS ++ "#" ++ S, + ?line {error,{1,erl_scan,{illegal,integer}},1} = + erl_scan:string(Str) + end || {BS,S} <- [{"3","3"},{"15","f"}, {"12","c"}] ], + + ?line {ok,[{integer,1,239},{'@',1}],1} = erl_scan:string("16#ef@"), + ?line {ok,[{integer,1,14},{atom,1,g@}],1} = erl_scan:string("16#eg@"), + + ok. + +floats() -> + [begin + F = list_to_float(FS), + Ts = [{float,1,F}], + ?line test_string(FS, Ts) + end || FS <- ["1.0","001.17","3.31200","1.0e0","1.0E17", + "34.21E-18", "17.0E+14"]], + ?line test_string("1.e2", [{integer,1,1},{'.',1},{atom,1,e2}]), + + ?line {error,{1,erl_scan,{illegal,float}},1} = + erl_scan:string("1.0e400"), + [begin + ?line {error,{1,erl_scan,{illegal,float}},1} = erl_scan:string(S) + end || S <- ["1.14Ea"]], + + ok. + +dots() -> + Dot = [{".", {ok,[{dot,1}],1}}, + {". ", {ok,[{dot,1}],1}}, + {".\n", {ok,[{dot,1}],2}}, + {".%", {ok,[{dot,1}],1}}, + {".\210",{ok,[{dot,1}],1}}, + {".% öh",{ok,[{dot,1}],1}}, + {".%\n", {ok,[{dot,1}],2}}, + {".$", {error,{1,erl_scan,char},1}}, + {".$\\", {error,{1,erl_scan,char},1}}, + {".a", {ok,[{'.',1},{atom,1,a}],1}} + ], + ?line [R = erl_scan:string(S) || {S, R} <- Dot], + + ?line {ok,[{dot,_}=T1],{1,2}} = erl_scan:string(".", {1,1}, text), + ?line [{column,1},{length,1},{line,1},{text,"."}] = + erl_scan:token_info(T1, [column, length, line, text]), + ?line {ok,[{dot,_}=T2],{1,3}} = erl_scan:string(".%", {1,1}, text), + ?line [{column,1},{length,1},{line,1},{text,"."}] = + erl_scan:token_info(T2, [column, length, line, text]), + ?line {ok,[{dot,_}=T3],{1,6}} = + erl_scan:string(".% öh", {1,1}, text), + ?line [{column,1},{length,1},{line,1},{text,"."}] = + erl_scan:token_info(T3, [column, length, line, text]), + ?line {error,{{1,2},erl_scan,char},{1,3}} = + erl_scan:string(".$", {1,1}), + ?line {error,{{1,2},erl_scan,char},{1,4}} = + erl_scan:string(".$\\", {1,1}), + + ?line test(". "), + ?line test(". "), + ?line test(".\n"), + ?line test(".\n\n"), + ?line test(".\n\r"), + ?line test(".\n\n\n"), + ?line test(".\210"), + ?line test(".%\n"), + ?line test(".a"), + + ?line test("%. \n. "), + ?line {more,C} = erl_scan:tokens([], "%. ",{1,1}, return), + ?line {done,{ok,[{comment,_,"%. "}, + {white_space,_,"\n"}, + {dot,_}], + {2,3}}, ""} = + erl_scan:tokens(C, "\n. ", {1,1}, return), % any loc, any options + + ?line [test_string(S, R) || + {S, R} <- [{".$\n", [{'.',1},{char,1,$\n}]}, + {"$\\\n", [{char,1,$\n}]}, + {"'\\\n'", [{atom,1,'\n'}]}, + {"$\n", [{char,1,$\n}]}] ], + ok. + +chars() -> + [begin + L = lists:flatten(io_lib:format("$\\~.8b", [C])), + Ts = [{char,1,C}], + ?line test_string(L, Ts) + end || C <- lists:seq(0, 255)], + + %% Leading zeroes... + [begin + L = lists:flatten(io_lib:format("$\\~3.8.0b", [C])), + Ts = [{char,1,C}], + ?line test_string(L, Ts) + end || C <- lists:seq(0, 255)], + + %% $\^\n now increments the line... + [begin + L = "$\\^" ++ [C], + Ts = [{char,1,C band 2#11111}], + ?line test_string(L, Ts) + end || C <- lists:seq(0, 255)], + + [begin + L = "$\\" ++ [C], + Ts = [{char,1,V}], + ?line test_string(L, Ts) + end || {C,V} <- [{$n,$\n}, {$r,$\r}, {$t,$\t}, {$v,$\v}, + {$b,$\b}, {$f,$\f}, {$e,$\e}, {$s,$\s}, + {$d,$\d}]], + + EC = [$\n,$\r,$\t,$\v,$\b,$\f,$\e,$\s,$\d], + Ds = lists:seq($0, $9), + X = [$^,$n,$r,$t,$v,$b,$f,$e,$s,$d], + New = [${,$x], + No = EC ++ Ds ++ X ++ New, + [begin + L = "$\\" ++ [C], + Ts = [{char,1,C}], + ?line test_string(L, Ts) + end || C <- lists:seq(0, 255) -- No], + + [begin + L = "'$\\" ++ [C] ++ "'", + Ts = [{atom,1,list_to_atom("$"++[C])}], + ?line test_string(L, Ts) + end || C <- lists:seq(0, 255) -- No], + + ?line test_string("\"\\013a\\\n\"", [{string,1,"\va\n"}]), + + ?line test_string("'\n'", [{atom,1,'\n'}]), + ?line test_string("\"\n\a\"", [{string,1,"\na"}]), + + %% No escape + [begin + L = "$" ++ [C], + Ts = [{char,1,C}], + ?line test_string(L, Ts) + end || C <- lists:seq(0, 255) -- (No ++ [$\\])], + ?line test_string("$\n", [{char,1,$\n}]), + + ?line {error,{{1,1},erl_scan,char},{1,4}} = + erl_scan:string("$\\^",{1,1}), + ?line test_string("$\\\n", [{char,1,$\n}]), + %% Robert's scanner returns line 1: + ?line test_string("$\\\n", [{char,1,$\n}]), + ?line test_string("$\n\n", [{char,1,$\n}]), + ?line test("$\n\n"), + ok. + + +variables() -> + ?line test_string(" \237_Aouåeiyäö", [{var,1,'_Aouåeiyäö'}]), + ?line test_string("A_b_c@", [{var,1,'A_b_c@'}]), + ?line test_string("V@2", [{var,1,'V@2'}]), + ?line test_string("ABDÀ", [{var,1,'ABDÀ'}]), + ?line test_string("Ärlig Östen", [{var,1,'Ärlig'},{var,1,'Östen'}]), + ok. + +eof() -> + ?line {done,{eof,1},eof} = erl_scan:tokens([], eof, 1), + {more, C1} = erl_scan:tokens([]," \n", 1), + ?line {done,{eof,2},eof} = erl_scan:tokens(C1, eof, 1), + {more, C2} = erl_scan:tokens([], "abra", 1), + %% An error before R13A. + %% ?line {done,Err={error,{1,erl_scan,scan},1},eof} = + ?line {done,{ok,[{atom,1,abra}],1},eof} = + erl_scan:tokens(C2, eof, 1), + + %% With column. + ?line {more, C3} = erl_scan:tokens([]," \n",{1,1}), + ?line {done,{eof,{2,1}},eof} = erl_scan:tokens(C3, eof, 1), + {more, C4} = erl_scan:tokens([], "abra", {1,1}), + %% An error before R13A. + %% ?line {done,{error,{{1,1},erl_scan,scan},{1,5}},eof} = + ?line {done,{ok,[{atom,_,abra}],{1,5}},eof} = + erl_scan:tokens(C4, eof, 1), + + %% Robert's scanner returns "" as LeftoverChars; + %% the R12B scanner returns eof as LeftoverChars: (eof is correct) + ?line {more, C5} = erl_scan:tokens([], "a", 1), + %% An error before R13A. + %% ?line {done,{error,{1,erl_scan,scan},1},eof} = + ?line {done,{ok,[{atom,1,a}],1},eof} = + erl_scan:tokens(C5,eof,1), + + %% A dot followed by eof is special: + ?line {more, C} = erl_scan:tokens([], "a.", 1), + ?line {done,{ok,[{atom,1,a},{dot,1}],1},eof} = erl_scan:tokens(C,eof,1), + ?line {ok,[{atom,1,foo},{dot,1}],1} = erl_scan:string("foo."), + + ok. + +illegal() -> + Atom = lists:duplicate(1000, $a), + ?line {error,{1,erl_scan,{illegal,atom}},1} = erl_scan:string(Atom), + ?line {done,{error,{1,erl_scan,{illegal,atom}},1},". "} = + erl_scan:tokens([], Atom++". ", 1), + QAtom = "'" ++ Atom ++ "'", + ?line {error,{1,erl_scan,{illegal,atom}},1} = erl_scan:string(QAtom), + ?line {done,{error,{1,erl_scan,{illegal,atom}},1},". "} = + erl_scan:tokens([], QAtom++". ", 1), + Var = lists:duplicate(1000, $A), + ?line {error,{1,erl_scan,{illegal,var}},1} = erl_scan:string(Var), + ?line {done,{error,{1,erl_scan,{illegal,var}},1},". "} = + erl_scan:tokens([], Var++". ", 1), + Float = "1" ++ lists:duplicate(400, $0) ++ ".0", + ?line {error,{1,erl_scan,{illegal,float}},1} = erl_scan:string(Float), + ?line {done,{error,{1,erl_scan,{illegal,float}},1},". "} = + erl_scan:tokens([], Float++". ", 1), + String = "\"43\\x{aaaaaa}34\"", + ?line {error,{1,erl_scan,{illegal,character}},1} = erl_scan:string(String), + ?line {done,{error,{1,erl_scan,{illegal,character}},1},"34\". "} = + %% Would be nice if `34\"' were skipped... + %% Maybe, but then the LeftOverChars would not be the characters + %% immediately following the end location of the error. + erl_scan:tokens([], String++". ", 1), + + ?line {error,{{1,1},erl_scan,{illegal,atom}},{1,1001}} = + erl_scan:string(Atom, {1,1}), + ?line {done,{error,{{1,5},erl_scan,{illegal,atom}},{1,1005}},". "} = + erl_scan:tokens([], "foo "++Atom++". ", {1,1}), + ?line {error,{{1,1},erl_scan,{illegal,atom}},{1,1003}} = + erl_scan:string(QAtom, {1,1}), + ?line {done,{error,{{1,5},erl_scan,{illegal,atom}},{1,1007}},". "} = + erl_scan:tokens([], "foo "++QAtom++". ", {1,1}), + ?line {error,{{1,1},erl_scan,{illegal,var}},{1,1001}} = + erl_scan:string(Var, {1,1}), + ?line {done,{error,{{1,5},erl_scan,{illegal,var}},{1,1005}},". "} = + erl_scan:tokens([], "foo "++Var++". ", {1,1}), + ?line {error,{{1,1},erl_scan,{illegal,float}},{1,404}} = + erl_scan:string(Float, {1,1}), + ?line {done,{error,{{1,5},erl_scan,{illegal,float}},{1,408}},". "} = + erl_scan:tokens([], "foo "++Float++". ", {1,1}), + ?line {error,{{1,4},erl_scan,{illegal,character}},{1,14}} = + erl_scan:string(String, {1,1}), + ?line {done,{error,{{1,4},erl_scan,{illegal,character}},{1,14}},"34\". "} = + erl_scan:tokens([], String++". ", {1,1}), + ok. + +crashes() -> + ?line {'EXIT',_} = (catch {foo, erl_scan:string([-1])}), % type error + ?line {'EXIT',_} = (catch {foo, erl_scan:string("$"++[-1])}), + ?line {'EXIT',_} = (catch {foo, erl_scan:string("$\\"++[-1])}), + ?line {'EXIT',_} = (catch {foo, erl_scan:string("$\\^"++[-1])}), + ?line {'EXIT',_} = (catch {foo, erl_scan:string([$",-1,$"],{1,1})}), + ?line {'EXIT',_} = (catch {foo, erl_scan:string("\"\\v"++[-1,$"])}), %$" + ?line {'EXIT',_} = (catch {foo, erl_scan:string([$",-1,$"])}), + ?line {'EXIT',_} = (catch {foo, erl_scan:string("% foo"++[-1])}), + ?line {'EXIT',_} = + (catch {foo, erl_scan:string("% foo"++[-1],{1,1})}), + + ?line {'EXIT',_} = (catch {foo, erl_scan:string([a])}), % type error + ?line {'EXIT',_} = (catch {foo, erl_scan:string("$"++[a])}), + ?line {'EXIT',_} = (catch {foo, erl_scan:string("$\\"++[a])}), + ?line {'EXIT',_} = (catch {foo, erl_scan:string("$\\^"++[a])}), + ?line {'EXIT',_} = (catch {foo, erl_scan:string([$",a,$"],{1,1})}), + ?line {'EXIT',_} = (catch {foo, erl_scan:string("\"\\v"++[a,$"])}), %$" + ?line {'EXIT',_} = (catch {foo, erl_scan:string([$",a,$"])}), + ?line {'EXIT',_} = (catch {foo, erl_scan:string("% foo"++[a])}), + ?line {'EXIT',_} = + (catch {foo, erl_scan:string("% foo"++[a],{1,1})}), + + ?line {'EXIT',_} = (catch {foo, erl_scan:string([3.0])}), % type error + + ok. + +options() -> + %% line and column are not options, but tested here + ?line {ok,[{atom,1,foo},{white_space,1," "},{comment,1,"% bar"}], 1} = + erl_scan:string("foo % bar", 1, return), + ?line {ok,[{atom,1,foo},{white_space,1," "}],1} = + erl_scan:string("foo % bar", 1, return_white_spaces), + ?line {ok,[{atom,1,foo},{comment,1,"% bar"}],1} = + erl_scan:string("foo % bar", 1, return_comments), + ?line {ok,[{atom,17,foo}],17} = + erl_scan:string("foo % bar", 17), + ?line {'EXIT',{function_clause,_}} = + (catch {foo, + erl_scan:string("foo % bar", {a,1}, [])}), % type error + ?line {ok,[{atom,_,foo}],{17,18}} = + erl_scan:string("foo % bar", {17,9}, []), + ?line {'EXIT',{function_clause,_}} = + (catch {foo, + erl_scan:string("foo % bar", {1,0}, [])}), % type error + ?line {ok,[{foo,1}],1} = + erl_scan:string("foo % bar",1, [{reserved_word_fun, + fun(W) -> W =:= foo end}]), + ?line {'EXIT',{badarg,_}} = + (catch {foo, + erl_scan:string("foo % bar",1, % type error + [{reserved_word_fun, + fun(W,_) -> W =:= foo end}])}), + ok. + +more_options() -> + ?line {ok,[{atom,A1,foo}],{19,20}} = + erl_scan:string("foo", {19,17},[]), + ?line [{column,17},{line,19}] = erl_scan:attributes_info(A1), + ?line {done,{ok,[{atom,A2,foo},{dot,_}],{19,22}},[]} = + erl_scan:tokens([], "foo. ", {19,17}, [bad_opt]), % type error + ?line [{column,17},{line,19}] = erl_scan:attributes_info(A2), + ?line {ok,[{atom,A3,foo}],{19,20}} = + erl_scan:string("foo", {19,17},[text]), + ?line [{column,17},{length,3},{line,19},{text,"foo"}] = + erl_scan:attributes_info(A3), + + ?line {ok,[{atom,A4,foo}],1} = erl_scan:string("foo", 1, [text]), + ?line [{length,3},{line,1},{text,"foo"}] = erl_scan:attributes_info(A4), + + ok. + +token_info() -> + ?line {ok,[T1],_} = erl_scan:string("foo", {1,18}, [text]), + {'EXIT',{badarg,_}} = + (catch {foo, erl_scan:token_info(T1, foo)}), % type error + ?line {line,1} = erl_scan:token_info(T1, line), + ?line {column,18} = erl_scan:token_info(T1, column), + ?line {length,3} = erl_scan:token_info(T1, length), + ?line {text,"foo"} = erl_scan:token_info(T1, text), + ?line [{category,atom},{column,18},{length,3},{line,1}, + {symbol,foo},{text,"foo"}] = + erl_scan:token_info(T1), + ?line [{length,3},{column,18}] = + erl_scan:token_info(T1, [length, column]), + ?line [{location,{1,18}}] = + erl_scan:token_info(T1, [location]), + ?line {category,atom} = erl_scan:token_info(T1, category), + ?line [{symbol,foo}] = erl_scan:token_info(T1, [symbol]), + + ?line {ok,[T2],_} = erl_scan:string("foo", 1, []), + ?line {line,1} = erl_scan:token_info(T2, line), + ?line undefined = erl_scan:token_info(T2, column), + ?line undefined = erl_scan:token_info(T2, length), + ?line undefined = erl_scan:token_info(T2, text), + ?line {location,1} = erl_scan:token_info(T2, location), + ?line [{category,atom},{line,1},{symbol,foo}] = erl_scan:token_info(T2), + ?line [{line,1}] = erl_scan:token_info(T2, [length, line]), + + ?line {ok,[T3],_} = erl_scan:string("=", 1, []), + ?line [{line,1}] = erl_scan:token_info(T3, [column, line]), + ?line {category,'='} = erl_scan:token_info(T3, category), + ?line [{symbol,'='}] = erl_scan:token_info(T3, [symbol]), + ok. + +attributes_info() -> + ?line {'EXIT',_} = + (catch {foo,erl_scan:attributes_info(foo)}), % type error + ?line [{line,18}] = erl_scan:attributes_info(18), + ?line {location,19} = erl_scan:attributes_info(19, location), + ?line {ok,[{atom,A0,foo}],_} = erl_scan:string("foo", 19, [text]), + ?line {location,19} = erl_scan:attributes_info(A0, location), + + ?line {ok,[{atom,A3,foo}],_} = erl_scan:string("foo", {1,3}, [text]), + ?line {line,1} = erl_scan:attributes_info(A3, line), + ?line {column,3} = erl_scan:attributes_info(A3, column), + ?line {location,{1,3}} = erl_scan:attributes_info(A3, location), + ?line {text,"foo"} = erl_scan:attributes_info(A3, text), + + ?line {ok,[{atom,A4,foo}],_} = erl_scan:string("foo", 2, [text]), + ?line {line,2} = erl_scan:attributes_info(A4, line), + ?line undefined = erl_scan:attributes_info(A4, column), + ?line {location,2} = erl_scan:attributes_info(A4, location), + ?line {text,"foo"} = erl_scan:attributes_info(A4, text), + + ?line {ok,[{atom,A5,foo}],_} = erl_scan:string("foo", {1,3}, []), + ?line {line,1} = erl_scan:attributes_info(A5, line), + ?line {column,3} = erl_scan:attributes_info(A5, column), + ?line {location,{1,3}} = erl_scan:attributes_info(A5, location), + ?line undefined = erl_scan:attributes_info(A5, text), + + ?line undefined = erl_scan:attributes_info([], line), % type error + + ok. + +set_attribute() -> + F = fun(Line) -> -Line end, + ?line -2 = erl_scan:set_attribute(line, 2, F), + ?line {ok,[{atom,A1,foo}],_} = erl_scan:string("foo", {9,17}), + ?line A2 = erl_scan:set_attribute(line, A1, F), + ?line {line,-9} = erl_scan:attributes_info(A2, line), + ?line {location,{-9,17}} = erl_scan:attributes_info(A2, location), + ?line [{line,-9},{column,17}] = + erl_scan:attributes_info(A2, [line,column,text]), + + F2 = fun(Line) -> {17,Line} end, + ?line Attr1 = erl_scan:set_attribute(line, 2, F2), + ?line {line,{17,2}} = erl_scan:attributes_info(Attr1, line), + ?line undefined = erl_scan:attributes_info(Attr1, column), + ?line {location,{17,2}} = % a bit mixed up + erl_scan:attributes_info(Attr1, location), + + ?line A3 = erl_scan:set_attribute(line, A1, F2), + ?line {line,{17,9}} = erl_scan:attributes_info(A3, line), + ?line {location,{{17,9},17}} = erl_scan:attributes_info(A3, location), + ?line [{line,{17,9}},{column,17}] = + erl_scan:attributes_info(A3, [line,column,text]), + + ?line {ok,[{atom,A4,foo}],_} = erl_scan:string("foo", {9,17}, [text]), + ?line A5 = erl_scan:set_attribute(line, A4, F), + ?line {line,-9} = erl_scan:attributes_info(A5, line), + ?line {location,{-9,17}} = erl_scan:attributes_info(A5, location), + ?line [{line,-9},{column,17},{text,"foo"}] = + erl_scan:attributes_info(A5, [line,column,text]), + + ?line {ok,[{atom,A6,foo}],_} = erl_scan:string("foo", 11, [text]), + ?line A7 = erl_scan:set_attribute(line, A6, F2), + ?line {line,{17,11}} = erl_scan:attributes_info(A7, line), + ?line {location,{17,11}} = % mixed up + erl_scan:attributes_info(A7, location), + ?line [{line,{17,11}},{text,"foo"}] = + erl_scan:attributes_info(A7, [line,column,text]), + + ?line {'EXIT',_} = + (catch {foo, erl_scan:set_attribute(line, [], F2)}), % type error + ?line {'EXIT',{badarg,_}} = + (catch {foo, erl_scan:set_attribute(column, [], F2)}), % type error + ok. + +column_errors() -> + ?line {error,{{1,1},erl_scan,{string,$',""}},{1,3}} = % $' + erl_scan:string("'\\",{1,1}), + ?line {error,{{1,1},erl_scan,{string,$",""}},{1,3}} = % $" + erl_scan:string("\"\\",{1,1}), + + ?line {error,{{1,1},erl_scan,{string,$',""}},{1,2}} = % $' + erl_scan:string("'",{1,1}), + ?line {error,{{1,1},erl_scan,{string,$",""}},{1,2}} = % $" + erl_scan:string("\"",{1,1}), + + ?line {error,{{1,1},erl_scan,char},{1,2}} = + erl_scan:string("$",{1,1}), + + ?line {error,{{1,2},erl_scan,{string,$',"1234567890123456"}},{1,20}} = %' + erl_scan:string(" '12345678901234567", {1,1}), + ?line {error,{{1,2},erl_scan,{string,$',"123456789012345 "}}, {1,20}} = %' + erl_scan:string(" '123456789012345\\s", {1,1}), + ?line {error,{{1,2},erl_scan,{string,$","1234567890123456"}},{1,20}} = %" + erl_scan:string(" \"12345678901234567", {1,1}), + ?line {error,{{1,2},erl_scan,{string,$","123456789012345 "}}, {1,20}} = %" + erl_scan:string(" \"123456789012345\\s", {1,1}), + ?line {error,{{1,2},erl_scan,{string,$',"1234567890123456"}},{2,1}} = %' + erl_scan:string(" '12345678901234567\n", {1,1}), + ok. + +white_spaces() -> + ?line {ok,[{white_space,_,"\r"}, + {white_space,_," "}, + {atom,_,a}, + {white_space,_,"\n"}], + _} = erl_scan:string("\r a\n", {1,1}, return), + ?line test("\r a\n"), + L = "{\"a\nb\", \"a\\nb\",\nabc\r,def}.\n\n", + ?line {ok,[{'{',_}, + {string,_,"a\nb"}, + {',',_}, + {white_space,_," "}, + {string,_,"a\nb"}, + {',',_}, + {white_space,_,"\n"}, + {atom,_,abc}, + {white_space,_,"\r"}, + {',',_}, + {atom,_,def}, + {'}',_}, + {dot,_}, + {white_space,_,"\n"}], + _} = erl_scan:string(L, {1,1}, return), + ?line test(L), + ?line test("\"\n\"\n"), + ?line test("\n\r\n"), + ?line test("\n\r"), + ?line test("\r\n"), + ?line test("\n\f"), + ?line [test(lists:duplicate(N, $\t)) || N <- lists:seq(1, 20)], + ?line [test([$\n|lists:duplicate(N, $\t)]) || N <- lists:seq(1, 20)], + ?line [test(lists:duplicate(N, $\s)) || N <- lists:seq(1, 20)], + ?line [test([$\n|lists:duplicate(N, $\s)]) || N <- lists:seq(1, 20)], + ?line test("\v\f\n\v "), + ?line test("\n\e\n\b\f\n\da\n"), + ok. + +unicode() -> + ?line {ok,[{char,1,83},{integer,1,45}],1} = + erl_scan:string("$\\12345"), % not unicode + + ?line {error,{1,erl_scan,{illegal,character}},1} = + erl_scan:string([1089]), + ?line {error,{{1,1},erl_scan,{illegal,character}},{1,2}} = + erl_scan:string([1089], {1,1}), + ?line {error,{1,erl_scan,{illegal,character}},1} = + %% ?line {error,{1,erl_scan,{illegal,atom}},1} = + erl_scan:string("'a"++[1089]++"b'"), + ?line {error,{{1,3},erl_scan,{illegal,character}},{1,4}} = + erl_scan:string("'a"++[1089]++"b'", {1,1}), + ?line test("\"a"++[1089]++"b\""), + ?line {ok,[{char,1,1}],1} = erl_scan:string([$$,$\\,$^,1089]), + + ?line {error,{1,erl_scan,Error},1} = erl_scan:string("\"qa\x{aaa}"), + ?line "unterminated string starting with \"qa\\x{AAA}\"" = + erl_scan:format_error(Error), + ?line {error,{{1,1},erl_scan,_},{1,11}} = + erl_scan:string("\"qa\\x{aaa}",{1,1}), + ?line {error,{{1,4},erl_scan,{illegal,character}},{1,11}} = + erl_scan:string("'qa\\x{aaa}'",{1,1}), + + Tags = [category, column, length, line, symbol, text], + + %% Workaround. No character codes greater than 255! To be changed. + %% Note: don't remove these tests, just modify them! + + ?line {ok,[{integer,1,1089}],1} = erl_scan:string([$$,1089]), + ?line {ok,[{integer,1,1089}],1} = erl_scan:string([$$,$\\,1089]), + + Qs = "$\\x{aaa}", + ?line {ok,[{integer,1,16#aaa}],1} = erl_scan:string(Qs), + ?line {ok,[Q2],{1,9}} = erl_scan:string("$\\x{aaa}", {1,1}, text), + ?line [{category,integer},{column,1},{length,8}, + {line,1},{symbol,16#aaa},{text,Qs}] = + erl_scan:token_info(Q2), + + U1 = "\"\\x{aaa}\"", + ?line {ok,[T1,T2,T3],{1,10}} = erl_scan:string(U1, {1,1}, text), + ?line [{category,'['},{column,1},{length,1},{line,1}, + {symbol,'['},{text,"\""}] = erl_scan:token_info(T1, Tags), + ?line [{category,integer},{column,2},{length,7}, + {line,1},{symbol,16#aaa},{text,"\\x{aaa}"}] = + erl_scan:token_info(T2, Tags), + ?line [{category,']'},{column,9},{length,1},{line,1}, + {symbol,']'},{text,"\""}] = erl_scan:token_info(T3, Tags), + ?line {ok,[{'[',1},{integer,1,16#aaa},{']',1}],1} = + erl_scan:string(U1, 1), + + U2 = "\"\\x41\\x{fff}\\x42\"", + ?line {ok,[{'[',1},{char,1,16#41},{',',1},{integer,1,16#fff}, + {',',1},{char,1,16#42},{']',1}],1} = erl_scan:string(U2, 1), + + U3 = "\"a\n\\x{fff}\n\"", + ?line {ok,[{'[',1},{char,1,$a},{',',1},{char,1,$\n}, + {',',2},{integer,2,16#fff},{',',2},{char,2,$\n}, + {']',3}],3} = + erl_scan:string(U3, 1), + + U4 = "\"\\^\n\\x{aaa}\\^\n\"", + ?line {ok,[{'[',1},{char,1,$\n},{',',2},{integer,2,16#aaa}, + {',',2},{char,2,$\n},{']',3}],3} = erl_scan:string(U4, 1), + + %% Keep these tests: + ?line test(Qs), + ?line test(U1), + ?line test(U2), + ?line test(U3), + ?line test(U4), + + Str1 = "\"ab" ++ [1089] ++ "cd\"", + ?line {ok,[{'[',1},{char,1,$a},{',',1},{char,1,$b},{',',1}, + {integer,1,1089},{',',1},{char,1,$c},{',',1}, + {char,1,$d},{']',1}],1} = erl_scan:string(Str1), + ?line {ok,[{'[',_},{char,_,$a},{',',_},{char,_,$b},{',',_}, + {integer,_,1089},{',',_},{char,_,$c},{',',_}, + {char,_,$d},{']',_}],{1,8}} = erl_scan:string(Str1, {1,1}), + ?line test(Str1), + Comment = "%% "++[1089], + ?line {ok,[{comment,1,[$%,$%,$\s,1089]}],1} = + erl_scan:string(Comment, 1, return), + ?line {ok,[{comment,_,[$%,$%,$\s,1089]}],{1,5}} = + erl_scan:string(Comment, {1,1}, return), + ok. + +more_chars() -> + %% Due to unicode, the syntax has been incompatibly augmented: + %% $\x{...}, $\xHH + + %% All kinds of tests... + ?line {ok,[{char,_,123}],{1,4}} = + erl_scan:string("$\\{",{1,1}), + ?line {more, C1} = erl_scan:tokens([], "$\\{", {1,1}), + ?line {done,{ok,[{char,_,123}],{1,4}},eof} = + erl_scan:tokens(C1, eof, 1), + ?line {ok,[{char,1,123},{atom,1,a},{'}',1}],1} = + erl_scan:string("$\\{a}"), + + ?line {error,{{1,1},erl_scan,char},{1,4}} = + erl_scan:string("$\\x", {1,1}), + ?line {error,{{1,1},erl_scan,char},{1,5}} = + erl_scan:string("$\\x{",{1,1}), + ?line {more, C3} = erl_scan:tokens([], "$\\x", {1,1}), + ?line {done,{error,{{1,1},erl_scan,char},{1,4}},eof} = + erl_scan:tokens(C3, eof, 1), + ?line {error,{{1,1},erl_scan,char},{1,5}} = + erl_scan:string("$\\x{",{1,1}), + ?line {more, C2} = erl_scan:tokens([], "$\\x{", {1,1}), + ?line {done,{error,{{1,1},erl_scan,char},{1,5}},eof} = + erl_scan:tokens(C2, eof, 1), + ?line {error,{1,erl_scan,{illegal,character}},1} = + erl_scan:string("$\\x{g}"), + ?line {error,{{1,1},erl_scan,{illegal,character}},{1,5}} = + erl_scan:string("$\\x{g}", {1,1}), + ?line {error,{{1,1},erl_scan,{illegal,character}},{1,6}} = + erl_scan:string("$\\x{}",{1,1}), + + ?line test("\"\\{0}\""), + ?line test("\"\\x{0}\""), + ?line test("\'\\{0}\'"), + ?line test("\'\\x{0}\'"), + + ?line {error,{{2,3},erl_scan,{illegal,character}},{2,6}} = + erl_scan:string("\"ab \n $\\x{g}\"",{1,1}), + ?line {error,{{2,3},erl_scan,{illegal,character}},{2,6}} = + erl_scan:string("\'ab \n $\\x{g}\'",{1,1}), + + ?line test("$\\{34}"), + ?line test("$\\x{34}"), + ?line test("$\\{377}"), + ?line test("$\\x{FF}"), + ?line test("$\\{400}"), + ?line test("$\\x{100}"), + ?line test("$\\x{10FFFF}"), + ?line test("$\\x{10ffff}"), + ?line test("\"$\n \\{1}\""), + ?line {error,{1,erl_scan,{illegal,character}},1} = + erl_scan:string("$\\x{110000}"), + ?line {error,{{1,1},erl_scan,{illegal,character}},{1,12}} = + erl_scan:string("$\\x{110000}", {1,1}), + + ?line {error,{{1,1},erl_scan,{illegal,character}},{1,4}} = + erl_scan:string("$\\xfg", {1,1}), + + ?line test("$\\xffg"), + + ?line {error,{{1,1},erl_scan,{illegal,character}},{1,4}} = + erl_scan:string("$\\xg", {1,1}), + ok. + +test_string(String, Expected) -> + {ok, Expected, _End} = erl_scan:string(String), + test(String). + +%% test_string(String, Expected, StartLocation, Options) -> +%% {ok, Expected, _End} = erl_scan:string(String, StartLocation, Options), +%% test(String). + +%% There are no checks of the tags... +test(String) -> + %% io:format("Testing `~ts'~n", [String]), + [{Tokens, End}, + {Wtokens, Wend}, + {Ctokens, Cend}, + {CWtokens, CWend}, + {CWtokens2, _}] = + [scan_string_with_column(String, X) || + X <- [[], + [return_white_spaces], + [return_comments], + [return], + [return]]], % for white space compaction test + + {end1,End,Wend} = {end1,Wend,End}, + {end2,Wend,Cend} = {end2,Cend,Wend}, + {end3,Cend,CWend} = {end3,CWend,Cend}, + + %% Test that the tokens that are common to two token lists are identical. + {none,Tokens} = {none, filter_tokens(CWtokens, [white_space,comment])}, + {comments,Ctokens} = + {comments,filter_tokens(CWtokens, [white_space])}, + {white_spaces,Wtokens} = + {white_spaces,filter_tokens(CWtokens, [comment])}, + + %% Use token attributes to extract parts from the original string, + %% and check that the parts are identical to the token strings. + {Line,Column} = test_decorated_tokens(String, CWtokens), + {deco,{Line,Column},End} = {deco,End,{Line,Column}}, + + %% Almost the same again: concat texts to get the original: + Text = get_text(CWtokens), + {text,Text,String} = {text,String,Text}, + + %% Test that white spaces occupy less heap than the worst case. + ok = test_white_space_compaction(CWtokens, CWtokens2), + + %% Test that white newlines are always first in text: + WhiteTokens = select_tokens(CWtokens, [white_space]), + ok = newlines_first(WhiteTokens), + + %% Line attribute only: + [Simple,Wsimple,Csimple,WCsimple] = Simples = + [element(2, erl_scan:string(String, 1, Opts)) || + Opts <- [[], + [return_white_spaces], + [return_comments], + [return]]], + {consistent,true} = {consistent,consistent_attributes(Simples)}, + {simple_wc,WCsimple} = {simple_wc,simplify(CWtokens)}, + {simple,Simple} = {simple,filter_tokens(WCsimple, [white_space,comment])}, + {simple_c,Csimple} = {simple_c,filter_tokens(WCsimple, [white_space])}, + {simple_w,Wsimple} = {simple_w,filter_tokens(WCsimple, [comment])}, + + %% Line attribute only, with text: + [SimpleTxt,WsimpleTxt,CsimpleTxt,WCsimpleTxt] = SimplesTxt = + [element(2, erl_scan:string(String, 1, [text|Opts])) || + Opts <- [[], + [return_white_spaces], + [return_comments], + [return]]], + TextTxt = get_text(WCsimpleTxt), + {text_txt,TextTxt,String} = {text_txt,String,TextTxt}, + {consistent_txt,true} = + {consistent_txt,consistent_attributes(SimplesTxt)}, + {simple_txt,SimpleTxt} = + {simple_txt,filter_tokens(WCsimpleTxt, [white_space,comment])}, + {simple_c_txt,CsimpleTxt} = + {simple_c_txt,filter_tokens(WCsimpleTxt, [white_space])}, + {simple_w_txt,WsimpleTxt} = + {simple_w_txt,filter_tokens(WCsimpleTxt, [comment])}, + + ok. + +test_white_space_compaction(Tokens, Tokens2) when Tokens =:= Tokens2 -> + [WS, WS2] = [select_tokens(Ts, [white_space]) || Ts <- [Tokens, Tokens2]], + test_wsc(WS, WS2). + +test_wsc([], []) -> + ok; +test_wsc([Token|Tokens], [Token2|Tokens2]) -> + [Text, Text2] = [Text || + {text, Text} <- + [erl_scan:token_info(T, text) || + T <- [Token, Token2]]], + Sz = erts_debug:size(Text), + Sz2 = erts_debug:size({Text, Text2}), + IsCompacted = Sz2 < 2*Sz+erts_debug:size({a,a}), + ToBeCompacted = is_compacted(Text), + if + IsCompacted =:= ToBeCompacted -> + test_wsc(Tokens, Tokens2); + true -> + {compaction_error, Token} + end. + +is_compacted("\r") -> + true; +is_compacted("\n\r") -> + true; +is_compacted("\n\f") -> + true; +is_compacted([$\n|String]) -> + all_spaces(String) + orelse + all_tabs(String); +is_compacted(String) -> + all_spaces(String) + orelse + all_tabs(String). + +all_spaces(L) -> + all_same(L, $\s). + +all_tabs(L) -> + all_same(L, $\t). + +all_same(L, Char) -> + lists:all(fun(C) -> C =:= Char end, L). + +newlines_first([]) -> + ok; +newlines_first([Token|Tokens]) -> + {text,Text} = erl_scan:token_info(Token, text), + Nnls = length([C || C <- Text, C =:= $\n]), + OK = case Text of + [$\n|_] -> + Nnls =:= 1; + _ -> + Nnls =:= 0 + end, + if + OK -> newlines_first(Tokens); + true -> OK + end. + +filter_tokens(Tokens, Tags) -> + lists:filter(fun(T) -> not lists:member(element(1, T), Tags) end, Tokens). + +select_tokens(Tokens, Tags) -> + lists:filter(fun(T) -> lists:member(element(1, T), Tags) end, Tokens). + +simplify([Token|Tokens]) -> + {line,Line} = erl_scan:token_info(Token, line), + [setelement(2, Token, Line) | simplify(Tokens)]; +simplify([]) -> + []. + +get_text(Tokens) -> + lists:flatten( + [T || + Token <- Tokens, + ({text,T} = erl_scan:token_info(Token, text)) =/= []]). + +test_decorated_tokens(String, Tokens) -> + ToksAttrs = token_attrs(Tokens), + test_strings(ToksAttrs, String, 1, 1). + +token_attrs(Tokens) -> + [{L,C,Len,T} || + Token <- Tokens, + ([{line,L},{column,C},{length,Len},{text,T}] = + erl_scan:token_info(Token, [line,column,length,text])) =/= []]. + +test_strings([], _S, Line, Column) -> + {Line,Column}; +test_strings([{L,C,Len,T}=Attr|Attrs], String0, Line0, Column0) -> + {String1, Column1} = skip_newlines(String0, L, Line0, Column0), + String = skip_chars(String1, C-Column1), + {Str,Rest} = lists:split(Len, String), + if + Str =:= T -> + {Line,Column} = string_newlines(T, L, C), + test_strings(Attrs, Rest, Line, Column); + true -> + {token_error, Attr, Str} + end. + +skip_newlines(String, Line, Line, Column) -> + {String, Column}; +skip_newlines([$\n|String], L, Line, _Column) -> + skip_newlines(String, L, Line+1, 1); +skip_newlines([_|String], L, Line, Column) -> + skip_newlines(String, L, Line, Column+1). + +skip_chars(String, 0) -> + String; +skip_chars([_|String], N) -> + skip_chars(String, N-1). + +string_newlines([$\n|String], Line, _Column) -> + string_newlines(String, Line+1, 1); +string_newlines([], Line, Column) -> + {Line, Column}; +string_newlines([_|String], Line, Column) -> + string_newlines(String, Line, Column+1). + +scan_string_with_column(String, Options0) -> + Options = [text | Options0], + StartLoc = {1, 1}, + {ok, Ts1, End1} = erl_scan:string(String, StartLoc, Options), + TString = String ++ ". ", + {ok,Ts2,End2} = scan_tokens(TString, Options, [], StartLoc), + {ok, Ts3, End3} = + scan_tokens_1({more, []}, TString, Options, [], StartLoc), + {end_2,End2,End3} = {end_2,End3,End2}, + {EndLine1,EndColumn1} = End1, + End2 = {EndLine1,EndColumn1+2}, + {ts_1,Ts2,Ts3} = {ts_1,Ts3,Ts2}, + Ts2 = Ts1 ++ [lists:last(Ts2)], + + %% Attributes are keylists, but have no text. + {ok, Ts7, End7} = erl_scan:string(String, {1,1}, Options), + {ok, Ts8, End8} = scan_tokens(TString, Options, [], {1,1}), + {end1, End1} = {end1, End7}, + {end2, End2} = {end2, End8}, + Ts8 = Ts7 ++ [lists:last(Ts8)], + {cons,true} = {cons,consistent_attributes([Ts1,Ts2,Ts3,Ts7,Ts8])}, + + {Ts1, End1}. + +scan_tokens(String, Options, Rs, Location) -> + case erl_scan:tokens([], String, Location, Options) of + {done, {ok,Ts,End}, ""} -> + {ok, lists:append(lists:reverse([Ts|Rs])), End}; + {done, {ok,Ts,End}, Rest} -> + scan_tokens(Rest, Options, [Ts|Rs], End) + end. + +scan_tokens_1({done, {ok,Ts,End}, ""}, "", _Options, Rs, _Location) -> + {ok,lists:append(lists:reverse([Ts|Rs])),End}; +scan_tokens_1({done, {ok,Ts,End}, Rest}, Cs, Options, Rs, _Location) -> + scan_tokens_1({more,[]}, Rest++Cs, Options, [Ts|Rs], End); +scan_tokens_1({more, Cont}, [C | Cs], Options, Rs, Loc) -> + R = erl_scan:tokens(Cont, [C], Loc, Options), + scan_tokens_1(R, Cs, Options, Rs, Loc). + +consistent_attributes([]) -> + true; +consistent_attributes([Ts | TsL]) -> + L = [T || T <- Ts, is_integer(element(2, T))], + case L of + [] -> + TagsL = [[Tag || {Tag,_} <- + erl_scan:attributes_info(element(2, T))] || + T <- Ts], + case lists:usort(TagsL) of + [_] -> + consistent_attributes(TsL); + [] when Ts =:= [] -> + consistent_attributes(TsL); + _ -> + Ts + end; + Ts -> + consistent_attributes(TsL); + _ -> + Ts + end. + +family_list(L) -> + sofs:to_external(family(L)). + +family(L) -> + sofs:relation_to_family(sofs:relation(L)). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/error_logger_forwarder.erl erlang-13.b.3-dfsg/lib/stdlib/test/error_logger_forwarder.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/error_logger_forwarder.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/error_logger_forwarder.erl 2009-03-12 12:22:38.000000000 +0000 @@ -0,0 +1,48 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(error_logger_forwarder). + +%% API. +-export([register/0]). + +%% Internal export for error_logger. +-export([init/1, + handle_event/2, handle_call/2, handle_info/2, + terminate/2]). + +%% Any crash report messages generated will be forwarded +%% to the current process (the one doing the call to register/0). +%% +register() -> + error_logger:add_report_handler(?MODULE, self()). + +init(Tester) -> + {ok,Tester}. + +handle_event(Event, Tester) -> + Tester ! Event, + {ok,Tester}. + +handle_info(_, State) -> + {ok,State}. + +handle_call(_Query, State) -> {ok,{error,bad_query},State}. + +terminate(_Reason, State) -> + State. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/ebin/archive_script_dict.app erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/ebin/archive_script_dict.app --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/ebin/archive_script_dict.app 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/ebin/archive_script_dict.app 2009-03-12 12:22:00.000000000 +0000 @@ -0,0 +1,12 @@ +{application, archive_script_dict, + [{description, "archive_script_dict"}, + {vsn, "0.1"}, + {modules, [ + archive_script_dict, + archive_script_dict_sup + ]}, + {registered, [ + archive_script_dict_sup + ]}, + {applications, [kernel, stdlib]}, + {mod, {archive_script_dict_app, [[]]}}]}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/priv/archive_script_dict.txt erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/priv/archive_script_dict.txt --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/priv/archive_script_dict.txt 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/priv/archive_script_dict.txt 2009-03-12 12:22:01.000000000 +0000 @@ -0,0 +1 @@ +Some private data... diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict_app.erl erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict_app.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict_app.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict_app.erl 2009-11-20 13:32:47.000000000 +0000 @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(archive_script_dict_app). +-behaviour(application). + +%% Public +-export([start/2, stop/1]). + +start(_Type, Args) -> + archive_script_dict_sup:start_link(Args). + +stop(_State) -> + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict.erl erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict.erl 2009-11-20 13:32:47.000000000 +0000 @@ -0,0 +1,125 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(archive_script_dict). +-behaviour(sys). + +%% Public +-export([new/1, store/3, erase/2, find/2, foldl/3, erase/1]). + +%% Internal +-export([init/3, loop/3]). + +%% supervisor callback +-export([start_link/2]). + +%% sys callback functions +-export([ + system_continue/3, + system_terminate/4, + system_code_change/4 + ]). + +-define(SUPERVISOR, archive_script_dict_sup). + +start_link(Name, Debug) -> + proc_lib:start_link(?MODULE, init, [self(), Name, Debug], infinity, []). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Client + +new(Name) -> + supervisor:start_child(?SUPERVISOR, [Name]). + +store(Pid, Key, Val) -> + call(Pid, {store, Key, Val}). + +erase(Pid, Key) -> + call(Pid, {erase, Key}). + +find(Pid, Key) -> + call(Pid, {find, Key}). + +foldl(Pid, Fun, Acc) -> + call(Pid, {foldl, Fun, Acc}). + +erase(Pid) -> + call(Pid, stop). + +call(Name, Msg) when is_atom(Name) -> + call(whereis(Name), Msg); +call(Pid, Msg) when is_pid(Pid) -> + Ref = erlang:monitor(process, Pid), + Pid ! {self(), Ref, Msg}, + receive + {Ref, Reply} -> + erlang:demonitor(Ref, [flush]), + Reply; + {'DOWN', Ref, _, _, Reason} -> + {error, Reason} + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Server + +init(Parent, Name, Debug) -> + register(Name, self()), + Dict = dict:new(), + proc_lib:init_ack(Parent, {ok, self()}), + loop(Dict, Parent, Debug). + +loop(Dict, Parent, Debug) -> + receive + {system, From, Msg} -> + sys:handle_system_msg(Msg, From, Parent, ?MODULE, Debug, Dict); + {ReplyTo, Ref, {store, Key, Val}} -> + Dict2 = dict:store(Key, Val, Dict), + ReplyTo ! {Ref, ok}, + ?MODULE:loop(Dict2, Parent, Debug); + {ReplyTo, Ref, {erase, Key}} -> + Dict2 = dict:erase(Key, Dict), + ReplyTo ! {Ref, ok}, + ?MODULE:loop(Dict2, Parent, Debug); + {ReplyTo, Ref, {find, Key}} -> + Res = dict:find(Key, Dict), + ReplyTo ! {Ref, Res}, + ?MODULE:loop(Dict, Parent, Debug); + {ReplyTo, Ref, {foldl, Fun, Acc}} -> + Acc2 = dict:foldl(Fun, Acc, Dict), + ReplyTo ! {Ref, {ok, Acc2}}, + ?MODULE:loop(Dict, Parent, Debug); + {ReplyTo, Ref, stop} -> + ReplyTo ! {Ref, ok}, + exit(normal); + Msg -> + error_logger:format("~p got unexpected message: ~p\n", + [self(), Msg]), + ?MODULE:loop(Dict, Parent, Debug) + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% sys callbacks + +system_continue(Parent, Debug, Dict) -> + ?MODULE:loop(Dict, Parent, Debug). + +system_terminate(Reason, _Parent, _Debug, _Dict) -> + exit(Reason). + +system_code_change(Dict,_Module,_OldVsn,_Extra) -> + {ok, Dict}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict_sup.erl erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict_sup.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict_sup.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dict/src/archive_script_dict_sup.erl 2009-11-20 13:32:47.000000000 +0000 @@ -0,0 +1,39 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(archive_script_dict_sup). +-behaviour(supervisor). + +%% Public +-export([start_link/1]). + +%% Internal +-export([init/1, start_simple_child/2]). + +-define(CHILD_MOD, archive_script_dict). + +start_link(Debug) -> + supervisor:start_link({local, ?MODULE}, ?MODULE, [Debug]). + +init([Debug]) -> + Flags = {simple_one_for_one, 0, 3600}, + MFA = {?MODULE, start_simple_child, [Debug]}, + {ok, {Flags, [{?MODULE, MFA, transient, timer:seconds(3), worker, [?CHILD_MOD]}]}}. + +start_simple_child(Debug, Name) -> + ?CHILD_MOD:start_link(Name, Debug). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/ebin/archive_script_dummy.app erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/ebin/archive_script_dummy.app --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/ebin/archive_script_dummy.app 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/ebin/archive_script_dummy.app 2009-03-12 12:21:59.000000000 +0000 @@ -0,0 +1,10 @@ +{application, archive_script_dummy, + [{description, "archive_script_dummy"}, + {vsn, "0.1"}, + {modules, [ + archive_script_main, + archive_script_main2 + ]}, + {registered, []}, + {applications, [kernel, stdlib, archive_script_dict]}, + {mod, {archive_script_dummy_app, [[]]}}]}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy_app.erl erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy_app.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy_app.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy_app.erl 2009-11-20 13:32:47.000000000 +0000 @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(archive_script_dummy_app). +-behaviour(application). + +%% Public +-export([start/2, stop/1]). + +start(_Type, Args) -> + archive_script_dummy_sup:start_link(Args). + +stop(_State) -> + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy.erl erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy.erl 2009-11-20 13:32:46.000000000 +0000 @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(archive_script_dummy). +-behaviour(application). + +%% Public +-export([start/2, stop/1]). + +start(_Type, Args) -> + archive_script_main_sup:start_link(Args). + +stop(_State) -> + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy_sup.erl erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy_sup.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy_sup.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_dummy/src/archive_script_dummy_sup.erl 2009-11-20 13:32:47.000000000 +0000 @@ -0,0 +1,33 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(archive_script_dummy_sup). +-behaviour(supervisor). + +%% Public +-export([start_link/1]). + +%% Internal +-export([init/1]). + +start_link(Debug) -> + supervisor:start_link({local, ?MODULE}, ?MODULE, [Debug]). + +init([Debug]) -> + Flags = {one_for_one, 0, 3600}, + {ok, {Flags, []}}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_main2.erl erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_main2.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_main2.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_main2.erl 2009-11-20 13:32:46.000000000 +0000 @@ -0,0 +1,60 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(archive_script_main2). +-behaviour(escript). + +-export([main/1]). + +-define(DUMMY, archive_script_dummy). +-define(DICT, archive_script_dict). + +main(MainArgs) -> + %% Some printouts + io:format("main2:~p\n",[MainArgs]), + ErlArgs = init:get_arguments(), + io:format("dict:~p\n",[[E || E <- ErlArgs, element(1, E) =:= ?DICT]]), + io:format("dummy:~p\n",[[E || E <- ErlArgs, element(1, E) =:= ?DUMMY]]), + + %% Start the applications + {error, {not_started, ?DICT}} = application:start(archive_script_dummy), + ok = application:start(?DICT), + ok = application:start(?DUMMY), + + %% Access dict priv dir + PrivDir = code:priv_dir(?DICT), + PrivFile = filename:join([PrivDir, "archive_script_dict.txt"]), + case erl_prim_loader:get_file(PrivFile) of + {ok, Bin, _FullPath} -> + io:format("priv:~p\n", [{ok, Bin}]); + error -> + io:format("priv:~p\n", [{error, PrivFile}]) + end, + + %% Use the dict app + Tab = archive_script_main_tab, + Key = foo, + Val = bar, + {ok, _Pid} = ?DICT:new(Tab), + error = ?DICT:find(Tab, Key), + ok = ?DICT:store(Tab, Key, Val), + {ok, Val} = ?DICT:find(Tab, Key), + ok = ?DICT:erase(Tab, Key), + error = ?DICT:find(Tab, Key), + ok = ?DICT:erase(Tab), + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_main.erl erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_main.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_main.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/archive_script/archive_script_main.erl 2009-11-20 13:32:46.000000000 +0000 @@ -0,0 +1,61 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(archive_script_main). +-behaviour(escript). + +-export([main/1]). + +-define(DUMMY, archive_script_dummy). +-define(DICT, archive_script_dict). + +main(MainArgs) -> + %% Some printouts + io:format("main:~p\n",[MainArgs]), + ErlArgs = init:get_arguments(), + io:format("dict:~p\n",[[E || E <- ErlArgs, element(1, E) =:= ?DICT]]), + io:format("dummy:~p\n",[[E || E <- ErlArgs, element(1, E) =:= ?DUMMY]]), + + %% Start the applications + {error, {not_started, ?DICT}} = application:start(?DUMMY), + ok = application:start(?DICT), + ok = application:start(?DUMMY), + + %% Access dict priv dir + PrivDir = code:priv_dir(?DICT), + PrivFile = filename:join([PrivDir, "archive_script_dict.txt"]), + case erl_prim_loader:get_file(PrivFile) of + {ok, Bin, _FullPath} -> + io:format("priv:~p\n", [{ok, Bin}]); + error -> + io:format("priv:~p\n", [{error, PrivFile}]) + end, + + %% Use the dict app + Tab = archive_script_main_tab, + Key = foo, + Val = bar, + {ok, _Pid} = ?DICT:new(Tab), + error = ?DICT:find(Tab, Key), + ok = ?DICT:store(Tab, Key, Val), + {ok, Val} = ?DICT:find(Tab, Key), + ok = ?DICT:erase(Tab, Key), + error = ?DICT:find(Tab, Key), + ok = ?DICT:erase(Tab), + ok. + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/compile_error erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/compile_error --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/compile_error 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/compile_error 2007-11-26 19:01:39.000000000 +0000 @@ -0,0 +1,12 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +foo() -> + gurka ** nisse. + + +blurf() blarf(). + + + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/emulator_flags erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/emulator_flags --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/emulator_flags 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/emulator_flags 2009-09-18 15:09:28.000000000 +0100 @@ -0,0 +1,11 @@ +#! /usr/bin/env escript +%% -*- erlang -*- +%%! -nostick -mnesia dir a/directory -mnesia debug verbose + +main(MainArgs) -> + io:format("main:~p\n",[MainArgs]), + ErlArgs = init:get_arguments(), + io:format("nostick:~p\n",[[E || E <- ErlArgs, element(1, E) =:= nostick]]), + io:format("mnesia:~p\n", [[E || E <- ErlArgs, element(1, E) =:= mnesia]]), + io:format("ERL_FLAGS=~p\n", [os:getenv("ERL_FLAGS")]), + io:format("unknown:~p\n",[[E || E <- ErlArgs, element(1, E) =:= unknown]]). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/factorial erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/factorial --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/factorial 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/factorial 2007-11-26 19:01:38.000000000 +0000 @@ -0,0 +1,11 @@ +#!/usr/bin/env escript + +main([In]) -> + X = list_to_integer(In), + N = fac(X), + io:format("factorial ~w = ~w~n",[X, N]). + +fac(0) -> 1; +fac(N) -> + N * fac(N-1). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_compile erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_compile --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_compile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_compile 2007-11-26 19:01:38.000000000 +0000 @@ -0,0 +1,12 @@ +#!/usr/bin/env escript +-mode(compile). + +main([In]) -> + X = list_to_integer(In), + N = fac(X), + io:format("factorial ~w = ~w~n",[X, N]). + +fac(0) -> 1; +fac(N) -> + N * fac(N-1). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_compile_main erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_compile_main --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_compile_main 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_compile_main 2007-11-26 19:01:38.000000000 +0000 @@ -0,0 +1,13 @@ +#!/usr/bin/env escript +-mode(compile). +-export([main/1]). + +main([In]) -> + X = list_to_integer(In), + N = fac(X), + io:format("factorial ~w = ~w~n",[X, N]). + +fac(0) -> 1; +fac(N) -> + N * fac(N-1). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_epp erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_epp --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_epp 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_epp 2009-03-12 12:22:35.000000000 +0000 @@ -0,0 +1,17 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +-module(factorial). +-export([main/1]). + +-define(PREFIX, ?MODULE_STRING). + +main([In]) -> + X = list_to_integer(In), + N = fac(X), + io:format("~s ~w = ~w~n",[?PREFIX, X, N]). + +fac(0) -> 1; +fac(N) -> + N * fac(N-1). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_warning erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_warning --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_warning 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/factorial_warning 2007-11-26 19:01:39.000000000 +0000 @@ -0,0 +1,13 @@ +#!/usr/bin/env escript + +main([In]) -> + X = list_to_integer(In), + N = fac(X), + io:format("factorial ~w = ~w~n",[X, N]). + +fac(0) -> 1; +fac(N) -> + N * fac(N-1). + +bar() -> + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/filesize erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/filesize --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/filesize 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/filesize 2007-11-26 19:01:39.000000000 +0000 @@ -0,0 +1,11 @@ +#!/usr/bin/env escript +%% -*- erlang -*- +-include_lib("kernel/include/file.hrl"). + +main([Filename]) -> + {ok,#file_info{size=Size}} = file:read_file_info(Filename), + io:format("~p\n", [Size]). + +%% Deliberate warning follows so that we can check that line numbers +%% correct after an -include_lib directive. +id(I) -> I. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/lint_error erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/lint_error --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/lint_error 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/lint_error 2007-11-26 19:01:39.000000000 +0000 @@ -0,0 +1,14 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +main([]) -> + ok. +main(Args) -> + io:format("~p\n", [length(Args)]), + halt(ExitCode). + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/strange.name erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/strange.name --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/strange.name 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/strange.name 2009-09-18 15:10:18.000000000 +0100 @@ -0,0 +1,7 @@ +#! /usr/bin/env escript +%% -*- erlang -*- + +-mode(compile). + +main(MainArgs) -> + io:format("main:~p\n",[MainArgs]). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/tail_rec erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/tail_rec --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/tail_rec 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/tail_rec 2009-06-05 13:54:21.000000000 +0100 @@ -0,0 +1,25 @@ +#!/usr/bin/env escript +%% -*- erlang -*- +-mode(interpret). + +tail_rec(PrevSize, N) -> + {_, Size} = process_info(self(), stack_size), + if + N =< 0 -> + ok; + PrevSize =:= undefined -> + tail_rec(Size, N - 1); + PrevSize =:= Size -> + tail_rec(Size, N - 1); + true -> + io:format("Not tail recursive (~p): Stack size ~p should be ~p\n", + [N, Size, PrevSize]), + tail_rec(Size, N - 1) + end. + +main([Repetitions]) -> + tail_rec(undefined, list_to_integer(Repetitions)), + io:format("ok\n", []); +main(_) -> + io:format("Usage: ~s Repetitions\n", [escript:script_name()]), + init:stop(1). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/test_script_name erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/test_script_name --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/test_script_name 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/test_script_name 2007-11-26 19:01:43.000000000 +0000 @@ -0,0 +1,5 @@ +#!/usr/bin/env escript + +main(_) -> + io:format("~s\n", [escript:script_name()]). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/trap_exit erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/trap_exit --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE_data/trap_exit 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE_data/trap_exit 2009-03-12 12:21:56.000000000 +0000 @@ -0,0 +1,6 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +main(_) -> + {trap_exit,Bool} = process_info(self(), trap_exit), + io:format("~p\n", [Bool]). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/escript_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/escript_SUITE.erl 2009-11-20 13:32:31.000000000 +0000 @@ -0,0 +1,540 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(escript_SUITE). +-export([ + all/1, + init_per_testcase/2, + fin_per_testcase/2, + basic/1, + errors/1, + strange_name/1, + emulator_flags/1, + module_script/1, + beam_script/1, + archive_script/1, + epp/1 + ]). + +-include("test_server.hrl"). + +all(suite) -> + [ + basic, + errors, + strange_name, + emulator_flags, + module_script, + beam_script, + archive_script, + epp + ]. + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?t:minutes(1)), + [{watchdog,Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +basic(Config) when is_list(Config) -> + Data = ?config(data_dir, Config), + Dir = filename:absname(Data), %Get rid of trailing slash. + ?line run(Dir, "factorial 5", + <<"factorial 5 = 120\nExitCode:0">>), + ?line run(Dir, "factorial_compile 10", + <<"factorial 10 = 3628800\nExitCode:0">>), + ?line run(Dir, "factorial_compile_main 7", + <<"factorial 7 = 5040\nExitCode:0">>), + ?line run(Dir, "factorial_warning 20", + [data_dir,<<"factorial_warning:12: Warning: function bar/0 is unused\n" + "factorial 20 = 2432902008176640000\nExitCode:0">>]), + ?line run(Dir, "-s", "factorial_warning", + [data_dir,<<"factorial_warning:12: Warning: function bar/0 is unused\nExitCode:0">>]), + ?line run(Dir, "-s -i", "factorial_warning", + [data_dir,<<"factorial_warning:12: Warning: function bar/0 is unused\nExitCode:0">>]), + ?line run(Dir, "-c -s", "factorial_warning", + [data_dir,<<"factorial_warning:12: Warning: function bar/0 is unused\nExitCode:0">>]), + ?line run(Dir, "filesize "++filename:join(?config(data_dir, Config),"filesize"), + [data_dir,<<"filesize:11: Warning: function id/1 is unused\n324\nExitCode:0">>]), + ?line run(Dir, "test_script_name", + [data_dir,<<"test_script_name\nExitCode:0">>]), + ?line run(Dir, "tail_rec 1000", + [<<"ok\nExitCode:0">>]), + + %% We expect the trap_exit flag for the process to be false, + %% since that is the default state for newly spawned processes. + ?line run(Dir, "trap_exit", + <<"false\nExitCode:0">>), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +errors(Config) when is_list(Config) -> + Data = ?config(data_dir, Config), + Dir = filename:absname(Data), %Get rid of trailing slash. + ?line run(Dir, "compile_error", + [data_dir,<<"compile_error:5: syntax error before: '*'\n">>, + data_dir,<<"compile_error:8: syntax error before: blarf\n">>, + <<"escript: There were compilation errors.\nExitCode:127">>]), + ?line run(Dir, "lint_error", + [data_dir,<<"lint_error:6: function main/1 already defined\n">>, + data_dir,"lint_error:8: variable 'ExitCode' is unbound\n", + <<"escript: There were compilation errors.\nExitCode:127">>]), + ?line run(Dir, "-s", "lint_error", + [data_dir,<<"lint_error:6: function main/1 already defined\n">>, + data_dir,"lint_error:8: variable 'ExitCode' is unbound\n", + <<"escript: There were compilation errors.\nExitCode:127">>]), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +strange_name(Config) when is_list(Config) -> + Data = ?config(data_dir, Config), + Dir = filename:absname(Data), %Get rid of trailing slash. + ?line run(Dir, "strange.name -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "ExitCode:0">>]), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +emulator_flags(Config) when is_list(Config) -> + Data = ?config(data_dir, Config), + Dir = filename:absname(Data), %Get rid of trailing slash. + ?line run(Dir, "emulator_flags -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[{nostick,[]}]\n" + "mnesia:[{mnesia,[\"dir\",\"a/directory\"]},{mnesia,[\"debug\",\"verbose\"]}]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Pick the source code from the emulator_flags script +%% Generate a new escript with a module header + +module_script(Config) when is_list(Config) -> + %% Read orig file + Data = ?config(data_dir, Config), + OrigFile = filename:join([Data,"emulator_flags"]), + {ok, OrigBin} = file:read_file(OrigFile), + ?line [Shebang, Mode, Flags | Source] = string:tokens(binary_to_list(OrigBin), "\n"), + ?line {ok, OrigFI} = file:read_file_info(OrigFile), + + %% Write source file + Priv = ?config(priv_dir, Config), + Dir = filename:absname(Priv), % Get rid of trailing slash. + Base = "module_script", + ErlFile = filename:join([Priv, Base ++ ".erl"]), + ErlCode = ["-module(", Base, ").\n", + "-export([main/1]).\n\n", + string:join(Source, "\n"), + "\n"], + ?line ok = file:write_file(ErlFile, ErlCode), + + %%%%%%% + %% Create and run scripts without emulator flags + + %% With shebang + NoArgsBase = Base ++ "_no_args_with_shebang", + NoArgsFile = filename:join([Priv, NoArgsBase]), + ?line ok = file:write_file(NoArgsFile, + [Shebang, "\n", + ErlCode]), + ?line ok = file:write_file_info(NoArgsFile, OrigFI), + + ?line run(Dir, NoArgsBase ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[]\n" + "mnesia:[]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + + ?line run(Dir, "", NoArgsBase ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[]\n" + "mnesia:[]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + + %% Without shebang + NoArgsBase2 = Base ++ "_no_args_without_shebang", + NoArgsFile2 = filename:join([Priv, NoArgsBase2]), + ?line ok = file:write_file(NoArgsFile2, + ["Something else than shebang!!!", "\n", + ErlCode]), + ?line ok = file:write_file_info(NoArgsFile2, OrigFI), + + ?line run(Dir, "", NoArgsBase2 ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[]\n" + "mnesia:[]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + + %% Plain module without header + NoArgsBase3 = Base ++ "_no_args_without_header", + NoArgsFile3 = filename:join([Priv, NoArgsBase3]), + ?line ok = file:write_file(NoArgsFile3, [ErlCode]), + ?line ok = file:write_file_info(NoArgsFile3, OrigFI), + + ?line run(Dir, "", NoArgsBase3 ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[]\n" + "mnesia:[]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + + %%%%%%% + %% Create and run scripts with emulator flags + + %% With shebang + ArgsBase = Base ++ "_args_with_shebang", + ArgsFile = filename:join([Priv, ArgsBase]), + ?line ok = file:write_file(ArgsFile, + [Shebang, "\n", + Mode, "\n", + Flags, "\n", + ErlCode]), + ?line ok = file:write_file_info(ArgsFile, OrigFI), + + ?line run(Dir, ArgsBase ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[{nostick,[]}]\n" + "mnesia:[{mnesia,[\"dir\",\"a/directory\"]},{mnesia,[\"debug\",\"verbose\"]}]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Pick the source code from the emulator_flags script and compile it. +%% Generate a new escript containing the beam code and the escript header +beam_script(Config) when is_list(Config) -> + %% Read orig file + Data = ?config(data_dir, Config), + OrigFile = filename:join([Data,"emulator_flags"]), + {ok, OrigBin} = file:read_file(OrigFile), + ?line [Shebang, Mode, Flags | Source] = string:tokens(binary_to_list(OrigBin), "\n"), + ?line {ok, OrigFI} = file:read_file_info(OrigFile), + + %% Write source file + Priv = ?config(priv_dir, Config), + Dir = filename:absname(Priv), % Get rid of trailing slash. + Base = "beam_script", + ErlFile = filename:join([Priv, Base ++ ".erl"]), + ?line ok = file:write_file(ErlFile, + ["-module(", Base, ").\n", + "-export([main/1]).\n\n", + string:join(Source, "\n"), + "\n"]), + + %% Compile the code + ?line {ok, _Mod, BeamCode} = compile:file(ErlFile, [binary]), + + %%%%%%% + %% Create and run scripts without emulator flags + + %% With shebang + NoArgsBase = Base ++ "_no_args_with_shebang", + NoArgsFile = filename:join([Priv, NoArgsBase]), + ?line ok = file:write_file(NoArgsFile, + [Shebang, "\n", + BeamCode]), + ?line ok = file:write_file_info(NoArgsFile, OrigFI), + + ?line run(Dir, NoArgsBase ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[]\n" + "mnesia:[]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + + ?line run(Dir, "", NoArgsBase ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[]\n" + "mnesia:[]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + + %% Without shebang + NoArgsBase2 = Base ++ "_no_args_without_shebang", + NoArgsFile2 = filename:join([Priv, NoArgsBase2]), + ?line ok = file:write_file(NoArgsFile2, + ["Something else than shebang!!!", "\n", + BeamCode]), + ?line ok = file:write_file_info(NoArgsFile2, OrigFI), + + ?line run(Dir, "", NoArgsBase2 ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[]\n" + "mnesia:[]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + + %% Plain beam file without header + NoArgsBase3 = Base ++ "_no_args_without_header", + NoArgsFile3 = filename:join([Priv, NoArgsBase3]), + ?line ok = file:write_file(NoArgsFile3, [BeamCode]), + ?line ok = file:write_file_info(NoArgsFile3, OrigFI), + + ?line run(Dir, "", NoArgsBase3 ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[]\n" + "mnesia:[]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + + %%%%%%% + %% Create and run scripts with emulator flags + + %% With shebang + ArgsBase = Base ++ "_args", + ArgsFile = filename:join([Priv, ArgsBase]), + ?line ok = file:write_file(ArgsFile, + [Shebang, "\n", + Mode, "\n", + Flags, "\n", + BeamCode]), + ?line ok = file:write_file_info(ArgsFile, OrigFI), + + ?line run(Dir, ArgsBase ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "nostick:[{nostick,[]}]\n" + "mnesia:[{mnesia,[\"dir\",\"a/directory\"]},{mnesia,[\"debug\",\"verbose\"]}]\n" + "ERL_FLAGS=false\n" + "unknown:[]\n" + "ExitCode:0">>]), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Create an archive file containing two entire applications plus two +%% alternate main modules. Generate a new escript containing the archive +%% (with .app and .beam files and ) and the escript header. + +archive_script(Config) when is_list(Config) -> + %% Copy the orig files to priv_dir + DataDir = ?config(data_dir, Config), + PrivDir = ?config(priv_dir, Config), + Archive = filename:join([PrivDir, "archive_script.zip"]), + ?line {ok, _} = zip:create(Archive, ["archive_script"], + [{compress, []}, {cwd, DataDir}]), + ?line {ok, _} = zip:extract(Archive, [{cwd, PrivDir}]), + TopDir = filename:join([PrivDir, "archive_script"]), + + %% Compile the code + ?line ok = compile_app(TopDir, "archive_script_dict"), + ?line ok = compile_app(TopDir, "archive_script_dummy"), + ?line {ok, MainFiles} = file:list_dir(TopDir), + ?line ok = compile_files(MainFiles, TopDir, TopDir), + + %% Create the archive + {ok, TopFiles} = file:list_dir(TopDir), + ?line {ok, {_, ArchiveBin}} = zip:create(Archive, TopFiles, + [memory, {compress, []}, {cwd, TopDir}]), + + %% Read the source script + OrigFile = filename:join([DataDir, "emulator_flags"]), + {ok, OrigBin} = file:read_file(OrigFile), + ?line [Shebang, Mode, _Flags | _Source] = + string:tokens(binary_to_list(OrigBin), "\n"), + Flags = "%%! -archive_script_dict foo bar" + " -archive_script_dict foo" + " -archive_script_dummy bar", + ?line {ok, OrigFI} = file:read_file_info(OrigFile), + + %%%%%%% + %% Create and run scripts without emulator flags + MainBase = "archive_script_main", + MainScript = filename:join([PrivDir, MainBase]), + + %% With shebang + ?line ok = file:write_file(MainScript, + [Shebang, "\n", + Flags, "\n", + ArchiveBin]), + ?line ok = file:write_file_info(MainScript, OrigFI), + + ?line run(PrivDir, MainBase ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "dict:[{archive_script_dict,[\"foo\",\"bar\"]},{archive_script_dict,[\"foo\"]}]\n" + "dummy:[{archive_script_dummy,[\"bar\"]}]\n" + "priv:{ok,<<\"Some private data...\\n\">>}\n" + "ExitCode:0">>]), + + ?line run(PrivDir, "", MainBase ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "dict:[{archive_script_dict,[\"foo\",\"bar\"]},{archive_script_dict,[\"foo\"]}]\n" + "dummy:[{archive_script_dummy,[\"bar\"]}]\n" + "priv:{ok,<<\"Some private data...\\n\">>}\n" + "ExitCode:0">>]), + + ?line ok = file:rename(MainScript, MainScript ++ "_with_shebang"), + + %% Without shebang (no flags) + ?line ok = file:write_file(MainScript, + ["Something else than shebang!!!", "\n", + ArchiveBin]), + ?line ok = file:write_file_info(MainScript, OrigFI), + + ?line run(PrivDir, "", MainBase ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "dict:[]\n" + "dummy:[]\n" + "priv:{ok,<<\"Some private data...\\n\">>}\n" + "ExitCode:0">>]), + ?line ok = file:rename(MainScript, MainScript ++ "_without_shebang"), + + %% Plain archive without header (no flags) + + ?line ok = file:write_file(MainScript, [ArchiveBin]), + ?line ok = file:write_file_info(MainScript, OrigFI), + + ?line run(PrivDir, "", MainBase ++ " -arg1 arg2 arg3", + [<<"main:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "dict:[]\n" + "dummy:[]\n" + "priv:{ok,<<\"Some private data...\\n\">>}\n" + "ExitCode:0">>]), + ?line ok = file:rename(MainScript, MainScript ++ "_without_header"), + + %%%%%%% + %% Create and run scripts with emulator flags + AltBase = "archive_script_alternate_main", + AltScript = filename:join([PrivDir, AltBase]), + ?line ok = file:write_file(AltScript, + [Shebang, "\n", + Mode, "\n", + Flags, " -escript main archive_script_main2\n", + ArchiveBin]), + ?line ok = file:write_file_info(AltScript, OrigFI), + + ?line run(PrivDir, AltBase ++ " -arg1 arg2 arg3", + [<<"main2:[\"-arg1\",\"arg2\",\"arg3\"]\n" + "dict:[{archive_script_dict,[\"foo\",\"bar\"]},{archive_script_dict,[\"foo\"]}]\n" + "dummy:[{archive_script_dummy,[\"bar\"]}]\n" + "priv:{ok,<<\"Some private data...\\n\">>}\n" + "ExitCode:0">>]), + + ok. + +compile_app(TopDir, AppName) -> + AppDir = filename:join([TopDir, AppName]), + SrcDir = filename:join([AppDir, "src"]), + OutDir = filename:join([AppDir, "ebin"]), + ?line {ok, Files} = file:list_dir(SrcDir), + compile_files(Files, SrcDir, OutDir). + +compile_files([File | Files], SrcDir, OutDir) -> + case filename:extension(File) of + ".erl" -> + AbsFile = filename:join([SrcDir, File]), + case compile:file(AbsFile, [{outdir, OutDir}]) of + {ok, _Mod} -> + compile_files(Files, SrcDir, OutDir); + Error -> + {compilation_error, AbsFile, OutDir, Error} + end; + _ -> + compile_files(Files, SrcDir, OutDir) + end; +compile_files([], _, _) -> + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +epp(Config) when is_list(Config) -> + Data = ?config(data_dir, Config), + Dir = filename:absname(Data), %Get rid of trailing slash. + ?line run(Dir, "factorial_epp 5", + <<"factorial 5 = 120\nExitCode:0">>), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +run(Dir, Cmd0, Expected0) -> + Expected = iolist_to_binary(expected_output(Expected0, Dir)), + Cmd = case os:type() of + {win32,_} -> "escript " ++ filename:nativename(Dir) ++ "\\" ++ Cmd0; + _ -> Cmd0 + end, + do_run(Dir, Cmd, Expected). + +run(Dir, Opts, Cmd0, Expected) -> + Cmd = case os:type() of + {win32,_} -> "escript " ++ Opts ++ " " ++ filename:nativename(Dir) ++ "\\" ++ Cmd0; + _ -> "escript " ++ Opts ++ " " ++ Dir ++ "/" ++ Cmd0 + end, + do_run(Dir, Cmd, Expected). + +do_run(Dir, Cmd, Expected0) -> + io:format("Run: ~p\n", [Cmd]), + Expected = iolist_to_binary(expected_output(Expected0, Dir)), + + Env = [{"PATH",Dir++":"++os:getenv("PATH")}], + Port = open_port({spawn,Cmd}, [exit_status,eof,in,{env,Env}]), + Res = get_data(Port, []), + receive + {Port,{exit_status,ExitCode}} -> + case iolist_to_binary([Res,"ExitCode:"++integer_to_list(ExitCode)]) of + Expected -> + ok; + Actual -> + io:format("Expected: ~p\n", [Expected]), + io:format("Actual: ~p\n", [Actual]), + ?t:fail() + end + end. + +get_data(Port, SoFar) -> + receive + {Port,{data,Bytes}} -> + get_data(Port, [SoFar|Bytes]); + {Port,eof} -> + erlang:port_close(Port), + SoFar + end. + +expected_output([data_dir|T], Data) -> + Slash = case os:type() of + {win32,_} -> "\\"; + _ -> "/" + end, + [filename:nativename(Data)++Slash|expected_output(T, Data)]; +expected_output([H|T], Data) -> + [H|expected_output(T, Data)]; +expected_output([], _) -> + []; +expected_output(Bin, _) when is_binary(Bin) -> + Bin. + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/ets_SUITE_data/dummy.txt erlang-13.b.3-dfsg/lib/stdlib/test/ets_SUITE_data/dummy.txt --- erlang-13.b.1-dfsg/lib/stdlib/test/ets_SUITE_data/dummy.txt 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/ets_SUITE_data/dummy.txt 1999-06-14 12:10:44.000000000 +0100 @@ -0,0 +1 @@ +Dummy diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/ets_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/ets_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/ets_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/ets_SUITE.erl 2009-11-20 13:29:58.000000000 +0000 @@ -0,0 +1,5355 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(ets_SUITE). + +-export([all/1]). +-export([new/1,default/1,setbag/1,badnew/1,verybadnew/1,named/1,keypos2/1, + privacy/1,privacy_owner/2]). +-export([insert/1,empty/1,badinsert/1]). +-export([lookup/1,time_lookup/1,badlookup/1,lookup_order/1]). +-export([delete/1,delete_elem/1,delete_tab/1,delete_large_tab/1, + delete_large_named_table/1, + evil_delete/1,baddelete/1,match_delete/1,table_leak/1]). +-export([match_delete3/1]). +-export([firstnext/1,firstnext_concurrent/1]). +-export([slot/1]). +-export([match/1, match1/1, match2/1, match_object/1, match_object2/1]). +-export([misc/1, dups/1, misc1/1, safe_fixtable/1, info/1, tab2list/1]). +-export([files/1, tab2file/1, tab2file2/1, tab2file3/1, tabfile_ext1/1, + tabfile_ext2/1, tabfile_ext3/1, tabfile_ext4/1]). +-export([heavy/1, heavy_lookup/1, heavy_lookup_element/1]). +-export([lookup_element/1, lookup_element_mult/1]). +-export([fold/1]). +-export([foldl_ordered/1, foldr_ordered/1, foldl/1, foldr/1, fold_empty/1]). +-export([t_delete_object/1, t_init_table/1, t_whitebox/1, + t_delete_all_objects/1, t_insert_list/1, t_test_ms/1, + t_select_delete/1,t_ets_dets/1]). + +-export([do_lookup/2, do_lookup_element/3]). + +-export([ordered/1, ordered_match/1, interface_equality/1, + fixtable_next/1, fixtable_insert/1, rename/1, rename_unnamed/1, evil_rename/1, + update_element/1, update_counter/1, evil_update_counter/1, partly_bound/1, match_heavy/1]). +-export([member/1]). +-export([memory/1]). +-export([select_fail/1]). +-export([t_insert_new/1]). +-export([t_repair_continuation/1]). +-export([t_match_spec_run/1]). +-export([t_bucket_disappears/1]). +-export([otp_5340/1]). +-export([otp_6338/1]). +-export([otp_6842_select_1000/1]). +-export([otp_7665/1]). +-export([meta_wb/1]). +-export([grow_shrink/1, grow_pseudo_deleted/1, shrink_pseudo_deleted/1]). +-export([meta_smp/1, + meta_lookup_unnamed_read/1, meta_lookup_unnamed_write/1, + meta_lookup_named_read/1, meta_lookup_named_write/1, + meta_newdel_unnamed/1, meta_newdel_named/1]). +-export([smp_insert/1, smp_fixed_delete/1, smp_unfix_fix/1, smp_select_delete/1, otp_8166/1]). +-export([exit_large_table_owner/1, + exit_many_large_table_owner/1, + exit_many_tables_owner/1, + exit_many_many_tables_owner/1]). +-export([write_concurrency/1, heir/1, give_away/1, setopts/1]). +-export([bad_table/1]). + +-export([init_per_testcase/2, fin_per_testcase/2, end_per_suite/1]). +%% Convenience for manual testing +-export([random_test/0]). + +% internal exports +-export([dont_make_worse_sub/0, make_better_sub1/0, make_better_sub2/0]). +-export([t_repair_continuation_do/1, default_do/1, t_bucket_disappears_do/1, + select_fail_do/1, whitebox_1/1, whitebox_2/1, t_delete_all_objects_do/1, + t_delete_object_do/1, t_init_table_do/1, t_insert_list_do/1, + update_element_opts/1, update_element_opts/4, update_element/4, update_element_do/4, + update_element_neg/1, update_element_neg_do/1, update_counter_do/1, update_counter_neg/1, + evil_update_counter_do/1, fixtable_next_do/1, heir_do/1, give_away_do/1, setopts_do/1, + rename_do/1, rename_unnamed_do/1, interface_equality_do/1, ordered_match_do/1, + ordered_do/1, privacy_do/1, empty_do/1, badinsert_do/1, time_lookup_do/1, + lookup_order_do/1, lookup_element_mult_do/1, delete_tab_do/1, delete_elem_do/1, + match_delete_do/1, match_delete3_do/1, firstnext_do/1, + slot_do/1, match1_do/1, match2_do/1, match_object_do/1, match_object2_do/1, + misc1_do/1, safe_fixtable_do/1, info_do/1, dups_do/1, heavy_lookup_do/1, + heavy_lookup_element_do/1, member_do/1, otp_5340_do/1, otp_7665_do/1, meta_wb_do/1 + ]). + +-include("test_server.hrl"). + +init_per_testcase(Case, Config) -> + Seed = {S1,S2,S3} = random:seed0(), %now(), + random:seed(S1,S2,S3), + io:format("*** SEED: ~p ***\n", [Seed]), + start_spawn_logger(), + wait_for_test_procs(), %% Ensure previous case cleaned up + Dog=test_server:timetrap(test_server:minutes(20)), + [{watchdog, Dog}, {test_case, Case} | Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + wait_for_test_procs(true), + test_server:timetrap_cancel(Dog). + + +end_per_suite(_Config) -> + stop_spawn_logger(), + catch erts_debug:set_internal_state(available_internal_state, false). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +all(suite) -> + [ + new,insert,lookup,delete,firstnext,firstnext_concurrent,slot,match, + t_match_spec_run, + lookup_element, misc,files, heavy, + ordered, ordered_match, interface_equality, + fixtable_next, fixtable_insert, rename, rename_unnamed, evil_rename, + update_element, update_counter, evil_update_counter, partly_bound, + match_heavy, fold, member, + t_delete_object, t_init_table, t_whitebox, + t_delete_all_objects, t_insert_list, t_test_ms, + t_select_delete, t_ets_dets, memory, + t_bucket_disappears, + select_fail,t_insert_new, t_repair_continuation, otp_5340, otp_6338, + otp_6842_select_1000, otp_7665, + meta_wb, + grow_shrink, grow_pseudo_deleted, shrink_pseudo_deleted, + meta_smp, + smp_insert, smp_fixed_delete, smp_unfix_fix, smp_select_delete, otp_8166, + exit_large_table_owner, + exit_many_large_table_owner, + exit_many_tables_owner, + exit_many_many_tables_owner, + write_concurrency, heir, give_away, setopts, + bad_table + ]. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +t_bucket_disappears(suite) -> + []; +t_bucket_disappears(doc) -> + ["Test that a disappearing bucket during select of a non-fixed table works."]; +t_bucket_disappears(Config) when is_list(Config) -> + repeat_for_opts(t_bucket_disappears_do). + +t_bucket_disappears_do(Opts) -> + ?line EtsMem = etsmem(), + ?line ets:new(abcd, [named_table, public, {keypos, 2} | Opts]), + ?line ets:insert(abcd, {abcd,1,2}), + ?line ets:insert(abcd, {abcd,2,2}), + ?line ets:insert(abcd, {abcd,3,2}), + ?line {_, Cont} = ets:select(abcd, [{{'_', '$1', '_'}, + [{'<', '$1', {const, 10}}], + ['$1']}], 1), + ?line ets:delete(abcd, 2), + ?line ets:select(Cont), + ?line true = ets:delete(abcd), + ?line verify_etsmem(EtsMem). + + +t_match_spec_run(suite) -> + []; +t_match_spec_run(doc) -> + ["Check ets:match_spec_run/2."]; +t_match_spec_run(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line [2,3] = ets:match_spec_run([{1},{2},{3}], + ets:match_spec_compile( + [{{'$1'},[{'>','$1',1}],['$1']}])), + ?line Huge = [{X} || X <- lists:seq(1,2500)], + ?line L = lists:seq(2476,2500), + ?line L = ets:match_spec_run(Huge, + ets:match_spec_compile( + [{{'$1'},[{'>','$1',2475}],['$1']}])), + ?line L2 = [{X*16#FFFFFFF} || X <- L], + ?line L2 = ets:match_spec_run(Huge, + ets:match_spec_compile( + [{{'$1'}, + [{'>','$1',2475}], + [{{{'*','$1',16#FFFFFFF}}}]}])), + ?line [500,1000,1500,2000,2500] = + ets:match_spec_run(Huge, + ets:match_spec_compile( + [{{'$1'}, + [{'=:=',{'rem','$1',500},0}], + ['$1']}])), + ?line verify_etsmem(EtsMem). + + + +t_repair_continuation(suite) -> + []; +t_repair_continuation(doc) -> + ["Check ets:repair_continuation/2."]; +t_repair_continuation(Config) when is_list(Config) -> + repeat_for_opts(t_repair_continuation_do). + + +t_repair_continuation_do(Opts) -> + ?line EtsMem = etsmem(), + ?line MS = [{'_',[],[true]}], + ?line MS2 = [{{{'$1','_'},'_'},[],['$1']}], + (fun() -> + ?line T = ets:new(x,[ordered_set|Opts]), + ?line F = fun(0,_)->ok;(N,F) -> ets:insert(T,{N,N}), F(N-1,F) end, + ?line F(1000,F), + ?line {_,C} = ets:select(T,MS,5), + ?line C2 = erlang:setelement(5,C,<<>>), + ?line {'EXIT',{badarg,_}} = (catch ets:select(C2)), + ?line C3 = ets:repair_continuation(C2,MS), + ?line {[true,true,true,true,true],_} = ets:select(C3), + ?line {[true,true,true,true,true],_} = ets:select(C), + ?line true = ets:delete(T) + end)(), + (fun() -> + ?line T = ets:new(x,[ordered_set|Opts]), + ?line F = fun(0,_)->ok;(N,F) -> ets:insert(T,{N,N}), F(N-1,F) end, + ?line F(1000,F), + ?line {_,C} = ets:select(T,MS,1001), + ?line C = '$end_of_table', + ?line C3 = ets:repair_continuation(C,MS), + ?line '$end_of_table' = ets:select(C3), + ?line '$end_of_table' = ets:select(C), + ?line true = ets:delete(T) + end)(), + + (fun() -> + ?line T = ets:new(x,[ordered_set|Opts]), + ?line F = fun(0,_)->ok;(N,F) -> + ets:insert(T,{integer_to_list(N),N}), + F(N-1,F) + end, + ?line F(1000,F), + ?line {_,C} = ets:select(T,MS,5), + ?line C2 = erlang:setelement(5,C,<<>>), + ?line {'EXIT',{badarg,_}} = (catch ets:select(C2)), + ?line C3 = ets:repair_continuation(C2,MS), + ?line {[true,true,true,true,true],_} = ets:select(C3), + ?line {[true,true,true,true,true],_} = ets:select(C), + ?line true = ets:delete(T) + end)(), + (fun() -> + ?line T = ets:new(x,[ordered_set|Opts]), + ?line F = fun(0,_)->ok;(N,F) -> + ets:insert(T,{{integer_to_list(N),N},N}), + F(N-1,F) + end, + ?line F(1000,F), + ?line {_,C} = ets:select(T,MS2,5), + ?line C2 = erlang:setelement(5,C,<<>>), + ?line {'EXIT',{badarg,_}} = (catch ets:select(C2)), + ?line C3 = ets:repair_continuation(C2,MS2), + ?line {[_,_,_,_,_],_} = ets:select(C3), + ?line {[_,_,_,_,_],_} = ets:select(C), + ?line true = ets:delete(T) + end)(), + + (fun() -> + ?line T = ets:new(x,[set|Opts]), + ?line F = fun(0,_)->ok;(N,F) -> + ets:insert(T,{N,N}), + F(N-1,F) + end, + ?line F(1000,F), + ?line {_,C} = ets:select(T,MS,5), + ?line C2 = erlang:setelement(4,C,<<>>), + ?line {'EXIT',{badarg,_}} = (catch ets:select(C2)), + ?line C3 = ets:repair_continuation(C2,MS), + ?line {[true,true,true,true,true],_} = ets:select(C3), + ?line {[true,true,true,true,true],_} = ets:select(C), + ?line true = ets:delete(T) + end)(), + (fun() -> + ?line T = ets:new(x,[set|Opts]), + ?line F = fun(0,_)->ok;(N,F) -> + ets:insert(T,{integer_to_list(N),N}), + F(N-1,F) + end, + ?line F(1000,F), + ?line {_,C} = ets:select(T,MS,5), + ?line C2 = erlang:setelement(4,C,<<>>), + ?line {'EXIT',{badarg,_}} = (catch ets:select(C2)), + ?line C3 = ets:repair_continuation(C2,MS), + ?line {[true,true,true,true,true],_} = ets:select(C3), + ?line {[true,true,true,true,true],_} = ets:select(C), + ?line true = ets:delete(T) + end)(), + (fun() -> + ?line T = ets:new(x,[bag|Opts]), + ?line F = fun(0,_)->ok;(N,F) -> + ets:insert(T,{integer_to_list(N),N}), + F(N-1,F) + end, + ?line F(1000,F), + ?line {_,C} = ets:select(T,MS,5), + ?line C2 = erlang:setelement(4,C,<<>>), + ?line {'EXIT',{badarg,_}} = (catch ets:select(C2)), + ?line C3 = ets:repair_continuation(C2,MS), + ?line {[true,true,true,true,true],_} = ets:select(C3), + ?line {[true,true,true,true,true],_} = ets:select(C), + ?line true = ets:delete(T) + end)(), + (fun() -> + ?line T = ets:new(x,[duplicate_bag|Opts]), + ?line F = fun(0,_)->ok;(N,F) -> + ets:insert(T,{integer_to_list(N),N}), + F(N-1,F) + end, + ?line F(1000,F), + ?line {_,C} = ets:select(T,MS,5), + ?line C2 = erlang:setelement(4,C,<<>>), + ?line {'EXIT',{badarg,_}} = (catch ets:select(C2)), + ?line C3 = ets:repair_continuation(C2,MS), + ?line {[true,true,true,true,true],_} = ets:select(C3), + ?line {[true,true,true,true,true],_} = ets:select(C), + ?line true = ets:delete(T) + end)(), + ?line false = ets:is_compiled_ms(<<>>), + ?line true = ets:is_compiled_ms(ets:match_spec_compile(MS)), + ?line verify_etsmem(EtsMem). + +new(suite) -> [default,setbag,badnew,verybadnew,named,keypos2,privacy]. + +default(doc) -> + ["Test case to check that a new ets table is defined as a `set' and " + "`protected'"]; +default(suite) -> []; +default(Config) when is_list(Config) -> + %% Default should be set,protected + repeat_for_opts(default_do). + +default_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Def = ets:new(def,Opts), + ?line set = ets:info(Def,type), + ?line protected = ets:info(Def,protection), + ?line ets:delete(Def), + ?line verify_etsmem(EtsMem). + +select_fail(doc) -> + ["Test that select fails even if nothing can match"]; +select_fail(suite) -> + []; +select_fail(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + repeat_for_opts(select_fail_do, [all_types,write_concurrency]), + ?line verify_etsmem(EtsMem). + +select_fail_do(Opts) -> + ?line T = ets:new(x,Opts), + ?line ets:insert(T,{a,a}), + ?line case (catch + ets:select(T,[{{a,'_'},[],[{snuffla}]}])) of + {'EXIT',{badarg,_}} -> + ok; + Else0 -> + exit({type,ets:info(T,type), + expected,'EXIT',got,Else0}) + end, + ?line case (catch + ets:select(T,[{{b,'_'},[],[{snuffla}]}])) of + {'EXIT',{badarg,_}} -> + ok; + Else1 -> + exit({type,ets:info(T,type), + expected,'EXIT',got,Else1}) + end, + ?line ets:delete(T). + + +-define(S(T),ets:info(T,memory)). +-define(TAB_STRUCT_SZ, erts_debug:get_internal_state('DbTable_words')). +-define(NORMAL_TAB_STRUCT_SZ, 26). %% SunOS5.8, 32-bit, non smp, private heap +%% +%% The hardcoded expected memory sizes (in words) are the ones we expect on: +%% SunOS5.8, 32-bit, non smp, private heap +%% +memory(doc) -> + ["Whitebox test of ets:info(X,memory)"]; +memory(suite) -> + []; +memory(Config) when is_list(Config) -> + ?line erts_debug:set_internal_state(available_internal_state, true), + ?line ok = chk_normal_tab_struct_size(), + ?line L = [T1,T2,T3,T4] = fill_sets_int(1000), + ?line XRes1 = adjust_xmem(L, {16862,16072,16072,16078}), + ?line Res1 = {?S(T1),?S(T2),?S(T3),?S(T4)}, + ?line lists:foreach(fun(T) -> + Before = ets:info(T,size), + Key = 2, %894, %%ets:first(T), + Objs = ets:lookup(T,Key), + ?line ets:delete(T,Key), + io:format("deleted key ~p from ~p changed size ~p to ~p: ~p\n", + [Key, ets:info(T,type), Before, ets:info(T,size), Objs]) + end, + L), + ?line XRes2 = adjust_xmem(L, {16849,16060,16048,16054}), + ?line Res2 = {?S(T1),?S(T2),?S(T3),?S(T4)}, + ?line lists:foreach(fun(T) -> + Before = ets:info(T,size), + Key = 4, %802, %ets:first(T), + Objs = ets:lookup(T,Key), + ?line ets:match_delete(T,{Key,'_'}), + io:format("match_deleted key ~p from ~p changed size ~p to ~p: ~p\n", + [Key, ets:info(T,type), Before, ets:info(T,size), Objs]) + end, + L), + ?line XRes3 = adjust_xmem(L, {16836,16048,16024,16030}), + ?line Res3 = {?S(T1),?S(T2),?S(T3),?S(T4)}, + ?line lists:foreach(fun(T) -> + ?line ets:delete_all_objects(T) + end, + L), + ?line XRes4 = adjust_xmem(L, {76,286,286,286}), + ?line Res4 = {?S(T1),?S(T2),?S(T3),?S(T4)}, + lists:foreach(fun(T) -> + ?line ets:delete(T) + end, + L), + ?line L2 = [T11,T12,T13,T14] = fill_sets_int(1000), + ?line lists:foreach(fun(T) -> + ?line ets:select_delete(T,[{'_',[],[true]}]) + end, + L2), + ?line XRes5 = adjust_xmem(L2, {76,286,286,286}), + ?line Res5 = {?S(T11),?S(T12),?S(T13),?S(T14)}, + ?line ?t:format("XRes1 = ~p~n" + " Res1 = ~p~n~n" + "XRes2 = ~p~n" + " Res2 = ~p~n~n" + "XRes3 = ~p~n" + " Res3 = ~p~n~n" + "XRes4 = ~p~n" + " Res4 = ~p~n~n" + "XRes5 = ~p~n" + " Res5 = ~p~n~n", + [XRes1, Res1, + XRes2, Res2, + XRes3, Res3, + XRes4, Res4, + XRes5, Res5]), + ?line XRes1 = Res1, + ?line XRes2 = Res2, + ?line XRes3 = Res3, + ?line XRes4 = Res4, + ?line XRes5 = Res5, + ?line catch erts_debug:set_internal_state(available_internal_state, false), + ?line ok. + +chk_normal_tab_struct_size() -> + ?line System = {os:type(), + os:version(), + erlang:system_info(wordsize), + erlang:system_info(smp_support), + erlang:system_info(heap_type)}, + ?line ?t:format("System = ~p~n", [System]), + ?line ?t:format("?NORMAL_TAB_STRUCT_SZ=~p~n", [?NORMAL_TAB_STRUCT_SZ]), + ?line ?t:format("?TAB_STRUCT_SZ=~p~n", [?TAB_STRUCT_SZ]), + ?line case System of + {{unix, sunos}, {5, 8, 0}, 4, false, private} -> + ?line ?NORMAL_TAB_STRUCT_SZ = ?TAB_STRUCT_SZ, + ?line ok; + _ -> + ?line ok + end. + +adjust_xmem([T1,T2,T3,T4], {A0,B0,C0,D0} = Mem0) -> + %% Adjust for 64-bit, smp, and os: + %% Table struct size may differ. + Mem1 = case ?TAB_STRUCT_SZ of + ?NORMAL_TAB_STRUCT_SZ -> + Mem0; + TabStructSz -> + TabDiff = TabStructSz - ?NORMAL_TAB_STRUCT_SZ, + {A0+TabDiff, B0+TabDiff, C0+TabDiff, D0+TabDiff} + end, + %% Adjust for hybrid and shared heaps: + %% Each record is one word smaller. + Mem2 = case erlang:system_info(heap_type) of + private -> + Mem1; + _ -> + {A1,B1,C1,D1} = Mem1, + {A1-ets:info(T1, size),B1-ets:info(T2, size), + C1-ets:info(T3, size),D1-ets:info(T4, size)} + end, + %%{Mem2,{ets:info(T1,stats),ets:info(T2,stats),ets:info(T3,stats),ets:info(T4,stats)}}. + Mem2. + +t_whitebox(doc) -> + ["Diverse whitebox testes"]; +t_whitebox(suite) -> + []; +t_whitebox(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + repeat_for_opts(whitebox_1), + repeat_for_opts(whitebox_1), + repeat_for_opts(whitebox_1), + repeat_for_opts(whitebox_2), + repeat_for_opts(whitebox_2), + repeat_for_opts(whitebox_2), + ?line verify_etsmem(EtsMem). + +whitebox_1(Opts) -> + ?line T=ets:new(x,[bag | Opts]), + ?line ets:insert(T,[{du,glade},{ta,en}]), + ?line ets:insert(T,[{hej,hopp2},{du,glade2},{ta,en2}]), + ?line {_,C}=ets:match(T,{ta,'$1'},1), + ?line ets:select(C), + ?line ets:match(C), + ?line ets:delete(T), + ok. + +whitebox_2(Opts) -> + ?line T=ets:new(x,[ordered_set, {keypos,2} | Opts]), + ?line T2=ets:new(x,[set, {keypos,2}| Opts]), + ?line 0 = ets:select_delete(T,[{{hej},[],[true]}]), + ?line 0 = ets:select_delete(T,[{{hej,hopp},[],[true]}]), + ?line 0 = ets:select_delete(T2,[{{hej},[],[true]}]), + ?line 0 = ets:select_delete(T2,[{{hej,hopp},[],[true]}]), + ?line ets:delete(T), + ?line ets:delete(T2), + ok. + + +t_ets_dets(doc) -> + ["Test ets:to/from_dets"]; +t_ets_dets(suite) -> + []; +t_ets_dets(Config) when is_list(Config) -> + repeat_for_opts(fun(Opts) -> t_ets_dets(Config,Opts) end). + +t_ets_dets(Config, Opts) -> + ?line Fname = gen_dets_filename(Config,1), + ?line (catch file:delete(Fname)), + ?line {ok,DTab} = dets:open_file(testdets_1, + [{file, Fname}]), + ?line ETab = ets:new(x,Opts), + ?line filltabint(ETab,3000), + ?line DTab = ets:to_dets(ETab,DTab), + ?line ets:delete_all_objects(ETab), + ?line 0 = ets:info(ETab,size), + ?line true = ets:from_dets(ETab,DTab), + ?line 3000 = ets:info(ETab,size), + ?line ets:delete(ETab), + ?line {'EXIT',{badarg,[{ets,to_dets,[ETab,DTab]}|_]}} = + (catch ets:to_dets(ETab,DTab)), + ?line {'EXIT',{badarg,[{ets,from_dets,[ETab,DTab]}|_]}} = + (catch ets:from_dets(ETab,DTab)), + ?line ETab2 = ets:new(x,Opts), + ?line filltabint(ETab2,3000), + ?line dets:close(DTab), + ?line {'EXIT',{badarg,[{ets,to_dets,[ETab2,DTab]}|_]}} = + (catch ets:to_dets(ETab2,DTab)), + ?line {'EXIT',{badarg,[{ets,from_dets,[ETab2,DTab]}|_]}} = + (catch ets:from_dets(ETab2,DTab)), + ?line ets:delete(ETab2), + ?line (catch file:delete(Fname)), + ok. + +t_delete_all_objects(doc) -> + ["Test ets:delete_all_objects/1"]; +t_delete_all_objects(suite) -> + []; +t_delete_all_objects(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + repeat_for_opts(t_delete_all_objects_do), + ?line verify_etsmem(EtsMem). + +t_delete_all_objects_do(Opts) -> + ?line T=ets:new(x,Opts), + ?line filltabint(T,4000), + ?line O=ets:first(T), + ?line ets:next(T,O), + ?line ets:safe_fixtable(T,true), + ?line true = ets:delete_all_objects(T), + ?line '$end_of_table' = ets:next(T,O), + ?line 0 = ets:info(T,size), + ?line 4000 = ets:info(T,kept_objects), + ?line ets:safe_fixtable(T,false), + ?line 0 = ets:info(T,size), + ?line 0 = ets:info(T,kept_objects), + ?line filltabint(T,4000), + ?line 4000 = ets:info(T,size), + ?line true = ets:delete_all_objects(T), + ?line 0 = ets:info(T,size), + ?line ets:delete(T). + + +t_delete_object(doc) -> + ["Test ets:delete_object/2"]; +t_delete_object(suite) -> + []; +t_delete_object(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + repeat_for_opts(t_delete_object_do), + ?line verify_etsmem(EtsMem). + +t_delete_object_do(Opts) -> + ?line T = ets:new(x,Opts), + ?line filltabint(T,4000), + ?line del_one_by_one_set(T,1,4001), + ?line filltabint(T,4000), + ?line del_one_by_one_set(T,4000,0), + ?line filltabint(T,4000), + ?line First = ets:first(T), + ?line Next = ets:next(T,First), + ?line ets:safe_fixtable(T,true), + ?line ets:delete_object(T,{First, integer_to_list(First)}), + ?line Next = ets:next(T,First), + ?line 3999 = ets:info(T,size), + ?line 1 = ets:info(T,kept_objects), + ?line ets:safe_fixtable(T,false), + ?line 3999 = ets:info(T,size), + ?line 0 = ets:info(T,kept_objects), + ?line ets:delete(T), + ?line T1 = ets:new(x,[ordered_set | Opts]), + ?line filltabint(T1,4000), + ?line del_one_by_one_set(T1,1,4001), + ?line filltabint(T1,4000), + ?line del_one_by_one_set(T1,4000,0), + ?line ets:delete(T1), + ?line T2 = ets:new(x,[bag | Opts]), + ?line filltabint2(T2,4000), + ?line del_one_by_one_bag(T2,1,4001), + ?line filltabint2(T2,4000), + ?line del_one_by_one_bag(T2,4000,0), + ?line ets:delete(T2), + ?line T3 = ets:new(x,[duplicate_bag | Opts]), + ?line filltabint3(T3,4000), + ?line del_one_by_one_dbag_1(T3,1,4001), + ?line filltabint3(T3,4000), + ?line del_one_by_one_dbag_1(T3,4000,0), + ?line filltabint(T3,4000), + ?line filltabint3(T3,4000), + ?line del_one_by_one_dbag_2(T3,1,4001), + ?line filltabint(T3,4000), + ?line filltabint3(T3,4000), + ?line del_one_by_one_dbag_2(T3,4000,0), + + ?line filltabint2(T3,4000), + ?line filltabint(T3,4000), + ?line del_one_by_one_dbag_3(T3,4000,0), + ?line ets:delete(T3), + ok. + +make_init_fun(N) when N > 4000-> + fun(read) -> + end_of_input; + (close) -> + exit(close_not_expected) + end; +make_init_fun(N) -> + fun(read) -> + case N rem 2 of + 0 -> + {[{N, integer_to_list(N)}, {N, integer_to_list(N)}], + make_init_fun(N + 1)}; + 1 -> + {[], make_init_fun(N + 1)} + end; + (close) -> + exit(close_not_expected) + end. + +t_init_table(doc) -> + ["Test ets:init_table/2"]; +t_init_table(suite) -> + []; +t_init_table(Config) when is_list(Config)-> + ?line EtsMem = etsmem(), + repeat_for_opts(t_init_table_do), + ?line verify_etsmem(EtsMem). + +t_init_table_do(Opts) -> + ?line T = ets:new(x,[duplicate_bag | Opts]), + ?line filltabint(T,4000), + ?line ets:init_table(T, make_init_fun(1)), + ?line del_one_by_one_dbag_1(T,4000,0), + ?line ets:delete(T), + ok. + +do_fill_dbag_using_lists(T,0) -> + T; +do_fill_dbag_using_lists(T,N) -> + ets:insert(T,[{N,integer_to_list(N)}, + {N + N rem 2,integer_to_list(N + N rem 2)}]), + do_fill_dbag_using_lists(T,N - 1). + + +t_insert_new(doc) -> + ["Test the insert_new function"]; +t_insert_new(suite) -> + []; +t_insert_new(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line L = fill_sets_int(1000) ++ fill_sets_int(1000,[{write_concurrency,true}]), + lists:foreach(fun(Tab) -> + ?line false = ets:insert_new(Tab,{2,"2"}), + ?line true = ets:insert_new(Tab,{2002,"2002"}), + ?line false = ets:insert_new(Tab,{2002,"2002"}), + ?line true = ets:insert(Tab,{2002,"2002"}), + ?line false = ets:insert_new(Tab,[{2002,"2002"}]), + ?line false = ets:insert_new(Tab,[{2002,"2002"}, + {2003,"2003"}]), + ?line false = ets:insert_new(Tab,[{2001,"2001"}, + {2002,"2002"}, + {2003,"2003"}]), + ?line false = ets:insert_new(Tab,[{2001,"2001"}, + {2002,"2002"}]), + ?line true = ets:insert_new(Tab,[{2001,"2001"}, + {2003,"2003"}]), + ?line false = ets:insert_new(Tab,{2001,"2001"}), + ?line false = ets:insert_new(Tab,{2002,"2002"}), + ?line false = ets:insert_new(Tab,{2003,"2003"}), + ?line true = ets:insert_new(Tab,{2004,"2004"}), + ?line true = ets:insert_new(Tab,{2000,"2000"}), + ?line true = ets:insert_new(Tab,[{2005,"2005"}, + {2006,"2006"}, + {2007,"2007"}]), + ?line Num = + case ets:info(Tab,type) of + bag -> + ?line true = + ets:insert(Tab,{2004,"2004-2"}), + ?line false = + ets:insert_new(Tab,{2004,"2004-3"}), + 1009; + duplicate_bag -> + ?line true = + ets:insert(Tab,{2004,"2004"}), + ?line false = + ets:insert_new(Tab,{2004,"2004"}), + 1010; + _ -> + 1008 + end, + ?line Num = ets:info(Tab,size), + ?line List = ets:tab2list(Tab), + ?line ets:delete_all_objects(Tab), + ?line true = ets:insert_new(Tab,List), + ?line false = ets:insert_new(Tab,List), + ?line ets:delete(Tab) + end, + L), + ?line verify_etsmem(EtsMem). + +t_insert_list(doc) -> + ["Test ets:insert/2 with list of objects."]; +t_insert_list(suite) -> + []; +t_insert_list(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + repeat_for_opts(t_insert_list_do), + ?line verify_etsmem(EtsMem). + +t_insert_list_do(Opts) -> + ?line T = ets:new(x,[duplicate_bag | Opts]), + ?line do_fill_dbag_using_lists(T,4000), + ?line del_one_by_one_dbag_2(T,4000,0), + ?line ets:delete(T). + + +t_test_ms(doc) -> + ["Test interface of ets:test_ms/2"]; +t_test_ms(suite) -> + []; +t_test_ms(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line {ok,[a,b]} = ets:test_ms({a,b}, + [{{'$1','$2'},[{'<','$1','$2'}],['$$']}]), + ?line {ok,false} = ets:test_ms({a,b}, + [{{'$1','$2'},[{'>','$1','$2'}],['$$']}]), + ?line {error,[{error,String}]} = ets:test_ms({a,b}, + [{{'$1','$2'}, + [{'flurp','$1','$2'}], + ['$$']}]), + ?line true = (if is_list(String) -> true; true -> false end), + ?line verify_etsmem(EtsMem). + +t_select_delete(doc) -> + ["Test the ets:select_delete/2 and ets:select_count/2 BIF's"]; +t_select_delete(suite) -> + []; +t_select_delete(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line Tables = fill_sets_int(10000) ++ fill_sets_int(10000,[{write_concurrency,true}]), + lists:foreach + (fun(Table) -> + ?line 4000 = ets:select_count(Table,[{{'$1', '_'}, + [{'>', + {'rem', + '$1', 5}, + 2}], + [true]}]), + ?line 4000 = ets:select_delete(Table,[{{'$1', '_'}, + [{'>', + {'rem', + '$1', 5}, + 2}], + [true]}]), + ?line check(Table, + fun({N,_}) when (N rem 5) =< 2 -> + true; + (_) -> + false + end, + 6000) + + end, + Tables), + lists:foreach + (fun(Table) -> + ?line ets:select_delete(Table,[{'_',[],[true]}]), + ?line xfilltabint(Table,4000), + ?line successive_delete(Table,1,4001,bound), + ?line 0 = ets:info(Table,size), + ?line xfilltabint(Table,4000), + ?line successive_delete(Table,4000,0, bound), + ?line 0 = ets:info(Table,size), + ?line xfilltabint(Table,4000), + ?line successive_delete(Table,1,4001,unbound), + ?line 0 = ets:info(Table,size), + ?line xfilltabint(Table,4000), + ?line successive_delete(Table,4000,0, unbound), + ?line 0 = ets:info(Table,size) + + end, + Tables), + lists:foreach + (fun(Table) -> + F = case ets:info(Table,type) of + X when X == bag; X == duplicate_bag -> + 2; + _ -> + 1 + end, + ?line xfilltabstr(Table, 4000), + ?line 1000 = ets:select_count(Table, + [{{[$3 | '$1'], '_'}, + [{'==', + {'length', '$1'}, + 3}],[true]}]) div F, + ?line 1000 = ets:select_delete(Table, + [{{[$3 | '$1'], '_'}, + [{'==', + {'length', '$1'}, + 3}],[true]}]) div F, + ?line check(Table, fun({[3,_,_,_],_}) -> false; + (_) -> true + end, 3000*F), + ?line 8 = ets:select_count(Table, + [{{"7",'_'},[],[false]}, + {{['_'], '_'}, + [],[true]}]) div F, + ?line 8 = ets:select_delete(Table, + [{{"7",'_'},[],[false]}, + {{['_'], '_'}, + [],[true]}]) div F, + ?line check(Table, fun({"7",_}) -> true; + ({[_],_}) -> false; + (_) -> true + end, 2992*F), + ?line xfilltabstr(Table, 4000), + %% This happens to be interesting for other select types too + ?line 200 = length(ets:select(Table, + [{{[$3,'_','_'],'_'}, + [],[true]}, + {{[$1,'_','_'],'_'}, + [],[true]}])) div F, + ?line 200 = ets:select_count(Table, + [{{[$3,'_','_'],'_'}, + [],[true]}, + {{[$1,'_','_'],'_'}, + [],[true]}]) div F, + ?line 200 = length(element(1,ets:select(Table, + [{{[$3,'_','_'],'_'}, + [],[true]}, + {{[$1,'_','_'],'_'}, + [],[true]}], + 1000))) div F, + ?line 200 = length( + ets:select_reverse(Table, + [{{[$3,'_','_'],'_'}, + [],[true]}, + {{[$1,'_','_'],'_'}, + [],[true]}])) div F, + ?line 200 = length( + element(1, + ets:select_reverse + (Table, + [{{[$3,'_','_'],'_'}, + [],[true]}, + {{[$1,'_','_'],'_'}, + [],[true]}], + 1000))) div F, + ?line 200 = ets:select_delete(Table, + [{{[$3,'_','_'],'_'}, + [],[true]}, + {{[$1,'_','_'],'_'}, + [],[true]}]) div F, + ?line 0 = ets:select_count(Table, + [{{[$3,'_','_'],'_'}, + [],[true]}, + {{[$1,'_','_'],'_'}, + [],[true]}]) div F, + ?line check(Table, fun({[$3,_,_],_}) -> false; + ({[$1,_,_],_}) -> false; + (_) -> true + end, 3800*F) + end, + Tables), + lists:foreach(fun(Tab) -> ets:delete(Tab) end,Tables), + ?line verify_etsmem(EtsMem). + +partly_bound(doc) -> + ["Test that partly bound keys gives faster matches"]; +partly_bound(suite) -> + []; +partly_bound(Config) when is_list(Config) -> + case os:type() of + {win32,_} -> + {skip,"Inaccurate measurements on Windows"}; + _ -> + ?line EtsMem = etsmem(), + ?line dont_make_worse(), + ?line make_better(), + ?line verify_etsmem(EtsMem) + end. + +dont_make_worse() -> + seventyfive_percent_success({?MODULE,dont_make_worse_sub,[]},0,0,10). + +dont_make_worse_sub() -> + ?line T = build_table([a,b],[a,b],15000), + ?line T1 = time_match_object(T,{'_',a,a,1500}, [{{a,a,1500},a,a,1500}]), + ?line T2 = time_match_object(T,{{a,a,'_'},a,a,1500}, + [{{a,a,1500},a,a,1500}]), + ?line ets:delete(T), + ?line true = (T1 > T2), + ok. + +make_better() -> + fifty_percent_success({?MODULE,make_better_sub2,[]},0,0,10), + fifty_percent_success({?MODULE,make_better_sub1,[]},0,0,10). +make_better_sub1() -> + ?line T = build_table2([a,b],[a,b],15000), + ?line T1 = time_match_object(T,{'_',1500,a,a}, [{{1500,a,a},1500,a,a}]), + ?line T2 = time_match_object(T,{{1500,a,'_'},1500,a,a}, + [{{1500,a,a},1500,a,a}]), + ?line ets:delete(T), + ?line io:format("~p>~p~n",[(T1 / 100),T2]), + ?line true = ((T1 / 100) > T2), % More marginal than needed. + ok. + +make_better_sub2() -> + ?line T = build_table2([a,b],[a,b],15000), + ?line T1 = time_match(T,{'$1',1500,a,a}), + ?line T2 = time_match(T,{{1500,a,'$1'},1500,a,a}), + ?line ets:delete(T), + ?line io:format("~p>~p~n",[(T1 / 100),T2]), + ?line true = ((T1 / 100) > T2), % More marginal than needed. + ok. + + +match_heavy(doc) -> + ["Heavy random matching, comparing set with ordered_set."]; +match_heavy(suite) -> + []; +match_heavy(Config) when is_list(Config) -> + PrivDir = ?config(priv_dir,Config), + DataDir = ?config(data_dir, Config), + %% Easier to have in process dictionary when manually + %% running the test function. + put(where_to_read,DataDir), + put(where_to_write,PrivDir), + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + NewDog=test_server:timetrap(test_server:seconds(1000)), + NewConfig = [{watchdog, NewDog} | lists:keydelete(watchdog,1,Config)], + random_test(), + drop_match(), + NewConfig. + +%%% Extra safety for the very low probability that this is not +%%% caught by the random test (Statistically impossible???) +drop_match() -> + ?line EtsMem = etsmem(), + ?line T = build_table([a,b],[a],1500), + ?line [{{a,a,1},a,a,1},{{b,a,1},b,a,1}] = + ets:match_object(T, {'_','_','_',1}), + ?line true = ets:delete(T), + ?line verify_etsmem(EtsMem). + + + +ets_match(Tab,Expr) -> + case random:uniform(2) of + 1 -> + ets:match(Tab,Expr); + _ -> + match_chunked(Tab,Expr) + end. + +match_chunked(Tab,Expr) -> + match_chunked_collect(ets:match(Tab,Expr, + random:uniform(1999) + 1)). +match_chunked_collect('$end_of_table') -> + []; +match_chunked_collect({Results, Continuation}) -> + Results ++ match_chunked_collect(ets:match(Continuation)). + +ets_match_object(Tab,Expr) -> + case random:uniform(2) of + 1 -> + ets:match_object(Tab,Expr); + _ -> + match_object_chunked(Tab,Expr) + end. + +match_object_chunked(Tab,Expr) -> + match_object_chunked_collect(ets:match_object(Tab,Expr, + random:uniform(1999) + 1)). +match_object_chunked_collect('$end_of_table') -> + []; +match_object_chunked_collect({Results, Continuation}) -> + Results ++ match_object_chunked_collect(ets:match_object(Continuation)). + + + +random_test() -> + ?line ReadDir = get(where_to_read), + ?line WriteDir = get(where_to_write), + ?line (catch file:make_dir(WriteDir)), + ?line Seed = case file:consult(filename:join([ReadDir, + "preset_random_seed.txt"])) of + {ok,[X]} -> + X; + _ -> + {A,B,C} = erlang:now(), + random:seed(A,B,C), + get(random_seed) + end, + put(random_seed,Seed), + ?line {ok, F} = file:open(filename:join([WriteDir, + "last_random_seed.txt"]), + [write]), + io:format(F,"~p. ~n",[Seed]), + file:close(F), + io:format("Random seed ~p written to ~s, copy to ~s to rerun with " + "same seed.",[Seed, + filename:join([WriteDir, "last_random_seed.txt"]), + filename:join([ReadDir, + "preset_random_seed.txt"])]), + do_random_test(). + +do_random_test() -> + ?line EtsMem = etsmem(), + ?line OrdSet = ets:new(xxx,[ordered_set]), + ?line Set = ets:new(xxx,[]), + ?line do_n_times(fun() -> + ?line Key = create_random_string(25), + ?line Value = create_random_tuple(25), + ?line ets:insert(OrdSet,{Key,Value}), + ?line ets:insert(Set,{Key,Value}) + end, 5000), + ?line io:format("~nData inserted~n"), + ?line do_n_times(fun() -> + ?line I = random:uniform(25), + ?line Key = create_random_string(I) ++ '_', + ?line L1 = ets_match_object(OrdSet,{Key,'_'}), + ?line L2 = lists:sort(ets_match_object(Set,{Key,'_'})), + case L1 == L2 of + false -> + io:format("~p != ~p~n", + [L1,L2]), + ?line exit({not_eq, L1, L2}); + true -> + ok + end + end, + 2000), + ?line io:format("~nData matched~n"), + ?line ets:match_delete(OrdSet,'_'), + ?line ets:match_delete(Set,'_'), + ?line do_n_times(fun() -> + ?line Value = create_random_string(25), + ?line Key = create_random_tuple(25), + ?line ets:insert(OrdSet,{Key,Value}), + ?line ets:insert(Set,{Key,Value}) + end, 2000), + ?line io:format("~nData inserted~n"), + (fun() -> + ?line Key = list_to_tuple(lists:duplicate(25,'_')), + ?line L1 = ets_match_object(OrdSet,{Key,'_'}), + ?line L2 = lists:sort(ets_match_object(Set,{Key,'_'})), + ?line 2000 = length(L1), + case L1 == L2 of + false -> + io:format("~p != ~p~n", + [L1,L2]), + ?line exit({not_eq, L1, L2}); + true -> + ok + end + end)(), + (fun() -> + ?line Key = {'$1','$2','$3','$4', + '$5','$6','$7','$8', + '$9','$10','$11','$12', + '$13','$14','$15','$16', + '$17','$18','$19','$20', + '$21','$22','$23','$24', + '$25'}, + ?line L1 = ets_match_object(OrdSet,{Key,'_'}), + ?line L2 = lists:sort(ets_match_object(Set,{Key,'_'})), + ?line 2000 = length(L1), + case L1 == L2 of + false -> + io:format("~p != ~p~n", + [L1,L2]), + ?line exit({not_eq, L1, L2}); + true -> + ok + end + end)(), + (fun() -> + ?line Key = {'$1','$2','$3','$4', + '$5','$6','$7','$8', + '$9','$10','$11','$12', + '$13','$14','$15','$16', + '$17','$18','$19','$20', + '$21','$22','$23','$24', + '$25'}, + ?line L1 = ets_match(OrdSet,{Key,'_'}), + ?line L2 = lists:sort(ets_match(Set,{Key,'_'})), + ?line 2000 = length(L1), + case L1 == L2 of + false -> + io:format("~p != ~p~n", + [L1,L2]), + ?line exit({not_eq, L1, L2}); + true -> + ok + end + end)(), + ?line ets:match_delete(OrdSet,'_'), + ?line ets:match_delete(Set,'_'), + ?line do_n_times(fun() -> + ?line Value = create_random_string(25), + ?line Key = create_random_tuple(25), + ?line ets:insert(OrdSet,{Key,Value}), + ?line ets:insert(Set,{Key,Value}) + end, 2000), + ?line io:format("~nData inserted~n"), + do_n_times(fun() -> + ?line Key = create_partly_bound_tuple(25), + ?line L1 = ets_match_object(OrdSet,{Key,'_'}), + ?line L2 = lists:sort(ets_match_object(Set,{Key,'_'})), + case L1 == L2 of + false -> + io:format("~p != ~p~n", + [L1,L2]), + ?line exit({not_eq, L1, L2}); + true -> + ok + end + end, + 2000), + ?line do_n_times(fun() -> + ?line Key = create_partly_bound_tuple2(25), + ?line L1 = ets_match_object(OrdSet,{Key,'_'}), + ?line L2 = lists:sort(ets_match_object(Set,{Key,'_'})), + case L1 == L2 of + false -> + io:format("~p != ~p~n", + [L1,L2]), + ?line exit({not_eq, L1, L2}); + true -> + ok + end + end, + 2000), + do_n_times(fun() -> + ?line Key = create_partly_bound_tuple2(25), + ?line L1 = ets_match(OrdSet,{Key,'_'}), + ?line L2 = lists:sort(ets_match(Set,{Key,'_'})), + case L1 == L2 of + false -> + io:format("~p != ~p~n", + [L1,L2]), + ?line exit({not_eq, L1, L2}); + true -> + ok + end + end, + 2000), + io:format("~nData matched~n"), + ets:match_delete(OrdSet,'_'), + ets:match_delete(Set,'_'), + do_n_times(fun() -> + do_n_times(fun() -> + ?line Value = + create_random_string(25), + ?line Key = create_random_tuple(25), + ?line ets:insert(OrdSet,{Key,Value}), + ?line ets:insert(Set,{Key,Value}) + end, 500), + io:format("~nData inserted~n"), + do_n_times(fun() -> + ?line Key = + create_partly_bound_tuple(25), + ets:match_delete(OrdSet,{Key,'_'}), + ets:match_delete(Set,{Key,'_'}), + L1 = ets:info(OrdSet,size), + L2 = ets:info(Set,size), + [] = ets_match_object(OrdSet, + {Key,'_'}), + case L1 == L2 of + false -> + io:format("~p != ~p " + "(deleted ~p)~n", + [L1,L2,Key]), + exit({not_eq, L1, L2, + {deleted,Key}}); + true -> + ok + end + end, + 50), + io:format("~nData deleted~n") + end, + 10), + ets:delete(OrdSet), + ets:delete(Set), + ?line verify_etsmem(EtsMem). + +update_element(doc) -> + ["test various variants of update_element"]; +update_element(suite) -> + []; +update_element(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + repeat_for_opts(update_element_opts), + ?line verify_etsmem(EtsMem). + +update_element_opts(Opts) -> + TupleCases = [{{key,val}, 1 ,2}, + {{val,key}, 2, 1}, + {{key,val}, 1 ,[2]}, + {{key,val,val}, 1, [2,3]}, + {{val,key,val,val}, 2, [3,4,1]}, + {{val,val,key,val}, 3, [1,4,1,2]}, % update pos1 twice + {{val,val,val,key}, 4, [2,1,2,3]}],% update pos2 twice + + lists:foreach(fun({Tuple,KeyPos,UpdPos}) -> update_element_opts(Tuple,KeyPos,UpdPos,Opts) end, + TupleCases), + + update_element_neg(Opts). + + + +update_element_opts(Tuple,KeyPos,UpdPos,Opts) -> + Set = ets:new(set,[{keypos,KeyPos} | Opts]), + OrdSet = ets:new(ordered_set,[ordered_set,{keypos,KeyPos} | Opts]), + update_element(Set,Tuple,KeyPos,UpdPos), + update_element(OrdSet,Tuple,KeyPos,UpdPos), + true = ets:delete(Set), + true = ets:delete(OrdSet), + ok. + +update_element(T,Tuple,KeyPos,UpdPos) -> + KeyList = [Key || Key <- lists:seq(1,100)], + lists:foreach(fun(Key) -> + TupleWithKey = setelement(KeyPos,Tuple,Key), + update_element_do(T,TupleWithKey,Key,UpdPos) + end, + KeyList). + +update_element_do(Tab,Tuple,Key,UpdPos) -> + + % Strategy: Step around in Values array and call ets:update_element for the values. + % Take Length number of steps of size 1, then of size 2, ..., Length-1. + % This will try all combinations of {fromValue,toValue} + % + % IMPORTANT: size(Values) must be a prime number for this to work!!! + Big32 = 16#12345678, + Big64 = 16#123456789abcdef0, + Values = { 623, -27, 0, Big32, -Big32, Big64, -Big64, Big32*Big32, + -Big32*Big32, Big32*Big64, -Big32*Big64, Big64*Big64, -Big64*Big64, + "A", "Sverker", [], {12,-132}, {}, + <<45,232,0,12,133>>, <<234,12,23>>, list_to_binary(lists:seq(1,100)), + (fun(X) -> X*Big32 end), + make_ref(), make_ref(), self(), ok, update_element, 28, 29 }, + Length = size(Values), + + PosValArgF = fun(ToIx, ResList, [Pos | PosTail], Rand, MeF) -> + NextIx = (ToIx+Rand) rem Length, + MeF(NextIx, [{Pos,element(ToIx+1,Values)} | ResList], PosTail, Rand, MeF); + + (_ToIx, ResList, [], _Rand, _MeF) -> + ResList; + + (ToIx, [], Pos, _Rand, _MeF) -> + {Pos, element(ToIx+1,Values)} % single {pos,value} arg + end, + + NewTupleF = fun({Pos,Val}, Tpl, _MeF) -> + setelement(Pos, Tpl, Val); + ([{Pos,Val} | Tail], Tpl, MeF) -> + MeF(Tail,setelement(Pos, Tpl, Val),MeF); + ([], Tpl, _MeF) -> + Tpl + end, + + UpdateF = fun(ToIx,Rand) -> + PosValArg = PosValArgF(ToIx,[],UpdPos,Rand,PosValArgF), + %%io:format("update_element(~p)~n",[PosValArg]), + ArgHash = erlang:phash2({Tab,Key,PosValArg}), + ?line true = ets:update_element(Tab, Key, PosValArg), + ?line ArgHash = erlang:phash2({Tab,Key,PosValArg}), + NewTuple = NewTupleF(PosValArg,Tuple,NewTupleF), + ?line [NewTuple] = ets:lookup(Tab,Key) + end, + + LoopF = fun(_FromIx, Incr, _Times, Checksum, _MeF) when Incr >= Length -> + Checksum; % done + + (FromIx, Incr, 0, Checksum, MeF) -> + MeF(FromIx, Incr+1, Length, Checksum, MeF); + + (FromIx, Incr, Times, Checksum, MeF) -> + ToIx = (FromIx + Incr) rem Length, + UpdateF(ToIx,Checksum), + if + Incr =:= 0 -> UpdateF(ToIx,Checksum); % extra update to same value + true -> true + end, + MeF(ToIx, Incr, Times-1, Checksum+ToIx+1, MeF) + end, + + FirstTuple = Tuple, + ?line true = ets:insert(Tab,FirstTuple), + ?line [FirstTuple] = ets:lookup(Tab,Key), + + Checksum = LoopF(0, 1, Length, 0, LoopF), + ?line Checksum = (Length-1)*Length*(Length+1) div 2, % if Length is a prime + ok. + +update_element_neg(Opts) -> + Set = ets:new(set,Opts), + OrdSet = ets:new(ordered_set,[ordered_set | Opts]), + update_element_neg_do(Set), + update_element_neg_do(OrdSet), + ets:delete(Set), + ?line {'EXIT',{badarg,_}} = (catch ets:update_element(Set,key,{2,1})), + ets:delete(OrdSet), + ?line {'EXIT',{badarg,_}} = (catch ets:update_element(OrdSet,key,{2,1})), + + ?line Bag = ets:new(bag,[bag | Opts]), + ?line DBag = ets:new(duplicate_bag,[duplicate_bag | Opts]), + ?line {'EXIT',{badarg,_}} = (catch ets:update_element(Bag,key,{2,1})), + ?line {'EXIT',{badarg,_}} = (catch ets:update_element(DBag,key,{2,1})), + true = ets:delete(Bag), + true = ets:delete(DBag), + ok. + + +update_element_neg_do(T) -> + Object = {key, 0, "Hej"}, + ?line true = ets:insert(T,Object), + + UpdateF = fun(Arg3) -> + ArgHash = erlang:phash2({T,key,Arg3}), + ?line {'EXIT',{badarg,_}} = (catch ets:update_element(T,key,Arg3)), + ?line ArgHash = erlang:phash2({T,key,Arg3}), + ?line [Object] = ets:lookup(T,key) + end, + + %% List of invalid {Pos,Value} tuples + InvList = [false, {2}, {2,1,false}, {false,1}, {0,1}, {1,1}, {-1,1}, {4,1}], + + lists:foreach(UpdateF, InvList), + lists:foreach(fun(InvTpl) -> UpdateF([{2,1},InvTpl]) end, InvList), + lists:foreach(fun(InvTpl) -> UpdateF([InvTpl,{2,1}]) end, InvList), + lists:foreach(fun(InvTpl) -> UpdateF([{2,1},{3,"Hello"},InvTpl]) end, InvList), + lists:foreach(fun(InvTpl) -> UpdateF([{3,"Hello"},{2,1},InvTpl]) end, InvList), + lists:foreach(fun(InvTpl) -> UpdateF([{2,1},InvTpl,{3,"Hello"}]) end, InvList), + lists:foreach(fun(InvTpl) -> UpdateF([InvTpl,{3,"Hello"},{2,1}]) end, InvList), + UpdateF([{2,1} | {3,1}]), + lists:foreach(fun(InvTpl) -> UpdateF([{2,1} | InvTpl]) end, InvList), + + ?line true = ets:update_element(T,key,[]), + ?line false = ets:update_element(T,false,[]), + ?line false = ets:update_element(T,false,{2,1}), + ?line ets:delete(T,key), + ?line false = ets:update_element(T,key,{2,1}), + ok. + + +update_counter(doc) -> + ["test various variants of update_counter"]; +update_counter(suite) -> + []; +update_counter(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + repeat_for_opts(update_counter_do), + ?line verify_etsmem(EtsMem). + +update_counter_do(Opts) -> + Set = ets:new(set,Opts), + OrdSet = ets:new(ordered_set,[ordered_set | Opts]), + update_counter_for(Set), + update_counter_for(OrdSet), + ets:delete(Set), + ets:delete(OrdSet), + update_counter_neg(Opts). + +update_counter_for(T) -> + ?line ets:insert(T,{a,1,1}), + ?line 101 = ets:update_counter(T,a,100), + ?line [{a,101,1}] = ets:lookup(T,a), + ?line 101 = ets:update_counter(T,a,{3,100}), + ?line [{a,101,101}] = ets:lookup(T,a), + + + LooperF = fun(Obj, 0, _, _) -> + Obj; + + (Obj, Times, Arg3, Myself) -> + ?line {NewObj, Ret} = uc_mimic(Obj,Arg3), + ArgHash = erlang:phash2({T,a,Arg3}), + ?line Ret = ets:update_counter(T,a,Arg3), + ?line ArgHash = erlang:phash2({T,a,Arg3}), + %%io:format("NewObj=~p~n ",[NewObj]), + ?line [NewObj] = ets:lookup(T,a), + Myself(NewObj,Times-1,Arg3,Myself) + end, + + LoopF = fun(Obj, Times, Arg3) -> + %%io:format("Loop start:\nObj = ~p\nArg3=~p\n",[Obj,Arg3]), + LooperF(Obj,Times,Arg3,LooperF) + end, + + SmallMax32 = (1 bsl 27) - 1, + SmallMax64 = (1 bsl (27+32)) - 1, + Big1Max32 = (1 bsl 32) - 1, + Big1Max64 = (1 bsl 64) - 1, + + Steps = 100, + Obj0 = {a,0,0,0,0}, + ?line ets:insert(T,Obj0), + ?line Obj1 = LoopF(Obj0, Steps, {2,(SmallMax32 div Steps)*2}), + ?line Obj2 = LoopF(Obj1, Steps, {3,(SmallMax64 div Steps)*2}), + ?line Obj3 = LoopF(Obj2, Steps, {4,(Big1Max32 div Steps)*2}), + ?line Obj4 = LoopF(Obj3, Steps, {5,(Big1Max64 div Steps)*2}), + + ?line Obj5 = LoopF(Obj4, Steps, {2,-(SmallMax32 div Steps)*4}), + ?line Obj6 = LoopF(Obj5, Steps, {3,-(SmallMax64 div Steps)*4}), + ?line Obj7 = LoopF(Obj6, Steps, {4,-(Big1Max32 div Steps)*4}), + ?line Obj8 = LoopF(Obj7, Steps, {5,-(Big1Max64 div Steps)*4}), + + ?line Obj9 = LoopF(Obj8, Steps, {2,(SmallMax32 div Steps)*2}), + ?line ObjA = LoopF(Obj9, Steps, {3,(SmallMax64 div Steps)*2}), + ?line ObjB = LoopF(ObjA, Steps, {4,(Big1Max32 div Steps)*2}), + ?line Obj0 = LoopF(ObjB, Steps, {5,(Big1Max64 div Steps)*2}), + + %% back at zero, same trip again with lists + + ?line Obj4 = LoopF(Obj0,Steps,[{2, (SmallMax32 div Steps)*2}, + {3, (SmallMax64 div Steps)*2}, + {4, (Big1Max32 div Steps)*2}, + {5, (Big1Max64 div Steps)*2}]), + + ?line Obj8 = LoopF(Obj4,Steps,[{4, -(Big1Max32 div Steps)*4}, + {2, -(SmallMax32 div Steps)*4}, + {5, -(Big1Max64 div Steps)*4}, + {3, -(SmallMax64 div Steps)*4}]), + + ?line Obj0 = LoopF(Obj8,Steps,[{5, (Big1Max64 div Steps)*2}, + {2, (SmallMax32 div Steps)*2}, + {4, (Big1Max32 div Steps)*2}, + {3, (SmallMax64 div Steps)*2}]), + + %% make them shift size at the same time + ?line ObjC = LoopF(Obj0,Steps,[{5, (Big1Max64 div Steps)*2}, + {3, (Big1Max64 div Steps)*2 + 1}, + {2, -(Big1Max64 div Steps)*2}, + {4, -(Big1Max64 div Steps)*2 + 1}]), + + %% update twice in same list + ?line ObjD = LoopF(ObjC,Steps,[{5, -(Big1Max64 div Steps) + 1}, + {3, -(Big1Max64 div Steps)*2 - 1}, + {5, -(Big1Max64 div Steps) - 1}, + {4, (Big1Max64 div Steps)*2 - 1}]), + + ?line Obj0 = LoopF(ObjD,Steps,[{2, (Big1Max64 div Steps) - 1}, + {4, Big1Max64*2}, + {2, (Big1Max64 div Steps) + 1}, + {4, -Big1Max64*2}]), + + %% warping with list + ?line ObjE = LoopF(Obj0,1000, + [{3,SmallMax32*4 div 5,SmallMax32*2,-SmallMax32*2}, + {5,-SmallMax64*4 div 7,-SmallMax64*2,SmallMax64*2}, + {4,-Big1Max32*4 div 11,-Big1Max32*2,Big1Max32*2}, + {2,Big1Max64*4 div 13,Big1Max64*2,-Big1Max64*2}]), + + %% warping without list + ?line ObjF = LoopF(ObjE,1000,{3,SmallMax32*4 div 5,SmallMax32*2,-SmallMax32*2}), + ?line ObjG = LoopF(ObjF,1000,{5,-SmallMax64*4 div 7,-SmallMax64*2,SmallMax64*2}), + ?line ObjH = LoopF(ObjG,1000,{4,-Big1Max32*4 div 11,-Big1Max32*2,Big1Max32*2}), + ?line ObjI = LoopF(ObjH,1000,{2,Big1Max64*4 div 13,Big1Max64*2,-Big1Max64*2}), + + %% mixing it up + ?line LoopF(ObjI,1000, + [{3,SmallMax32*4 div 5,SmallMax32*2,-SmallMax32*2}, + {5,-SmallMax64*4 div 3}, + {3,-SmallMax32*4 div 11}, + {5,0}, + {4,1}, + {5,-SmallMax64*4 div 7,-SmallMax64*2,SmallMax64*2}, + {2,Big1Max64*4 div 13,Big1Max64*2,-Big1Max64*2}]), + ok. + +%% uc_mimic works kind of like the real ets:update_counter +%% Obj = Tuple in ets +%% Pits = {Pos,Incr} | {Pos,Incr,Thres,Warp} +%% Returns {Updated tuple in ets, Return value from update_counter} +uc_mimic(Obj, Pits) when is_tuple(Pits) -> + ?line Pos = element(1,Pits), + ?line NewObj = setelement(Pos, Obj, uc_adder(element(Pos,Obj),Pits)), + ?line {NewObj, element(Pos,NewObj)}; + +uc_mimic(Obj, PitsList) when is_list(PitsList) -> + ?line {NewObj,ValList} = uc_mimic(Obj,PitsList,[]), + ?line {NewObj,lists:reverse(ValList)}. + +uc_mimic(Obj, [], Acc) -> + ?line {Obj,Acc}; +uc_mimic(Obj, [Pits|Tail], Acc) -> + ?line {NewObj,NewVal} = uc_mimic(Obj,Pits), + ?line uc_mimic(NewObj,Tail,[NewVal|Acc]). + +uc_adder(Init, {_Pos, Add}) -> + Init + Add; +uc_adder(Init, {_Pos, Add, Thres, Warp}) -> + case Init + Add of + X when X > Thres, Add > 0 -> + Warp; + Y when Y < Thres, Add < 0 -> + Warp; + Z -> + Z + end. + +update_counter_neg(Opts) -> + Set = ets:new(set,Opts), + OrdSet = ets:new(ordered_set,[ordered_set | Opts]), + update_counter_neg_for(Set), + update_counter_neg_for(OrdSet), + ets:delete(Set), + ?line {'EXIT',{badarg,_}} = (catch ets:update_counter(Set,key,1)), + ets:delete(OrdSet), + ?line {'EXIT',{badarg,_}} = (catch ets:update_counter(OrdSet,key,1)), + + ?line Bag = ets:new(bag,[bag | Opts]), + ?line DBag = ets:new(duplicate_bag,[duplicate_bag | Opts]), + ?line {'EXIT',{badarg,_}} = (catch ets:update_counter(Bag,key,1)), + ?line {'EXIT',{badarg,_}} = (catch ets:update_counter(DBag,key,1)), + true = ets:delete(Bag), + true = ets:delete(DBag), + ok. + +update_counter_neg_for(T) -> + Object = {key,0,false,1}, + ?line true = ets:insert(T,Object), + + UpdateF = fun(Arg3) -> + ArgHash = erlang:phash2({T,key,Arg3}), + ?line {'EXIT',{badarg,_}} = (catch ets:update_counter(T,key,Arg3)), + ?line ArgHash = erlang:phash2({T,key,Arg3}), + ?line [Object] = ets:lookup(T,key) + end, + + %% List of invalid arg3-tuples + InvList = [false, {2}, {2,false}, {false,1}, + {0,1}, {-1,1}, % BUG < R12B-2 + {1,1}, {3,1}, {5,1}, {2,1,100}, {2,1,100,0,false}, {2,1,false,0}, {2,1,0,false}], + + lists:foreach(UpdateF, InvList), + lists:foreach(fun(Inv) -> UpdateF([{2,1},Inv]) end, InvList), + lists:foreach(fun(Inv) -> UpdateF([Inv,{2,1}]) end, InvList), + lists:foreach(fun(Inv) -> UpdateF([{2,1},{4,-100},Inv]) end, InvList), + lists:foreach(fun(Inv) -> UpdateF([{4,100,50,0},{2,1},Inv]) end, InvList), + lists:foreach(fun(Inv) -> UpdateF([{2,1},Inv,{4,100,50,0}]) end, InvList), + lists:foreach(fun(Inv) -> UpdateF([Inv,{4,100,50,0},{2,1}]) end, InvList), + UpdateF([{2,1} | {4,1}]), + lists:foreach(fun(Inv) -> UpdateF([{2,1} | Inv]) end, InvList), + + ?line {'EXIT',{badarg,_}} = (catch ets:update_counter(T,false,1)), + ?line ets:delete(T,key), + ?line {'EXIT',{badarg,_}} = (catch ets:update_counter(T,key,1)), + ok. + + +evil_update_counter(Config) when is_list(Config) -> + %% The code server uses ets table. Pre-load modules that might not be + %% already loaded. + gb_sets:module_info(), + math:module_info(), + ordsets:module_info(), + random:module_info(), + + repeat_for_opts(evil_update_counter_do). + +evil_update_counter_do(Opts) -> + ?line EtsMem = etsmem(), + ?line process_flag(trap_exit, true), + ?line Pids = [spawn_link(fun() -> evil_counter(I,Opts) end) || I <- lists:seq(1, 40)], + ?line wait_for_all(gb_sets:from_list(Pids)), + ?line verify_etsmem(EtsMem), + ok. + +wait_for_all(Pids0) -> + case gb_sets:is_empty(Pids0) of + true -> + ok; + false -> + receive + {'EXIT',Pid,normal} -> + ?line Pids = gb_sets:delete(Pid, Pids0), + wait_for_all(Pids); + Other -> + io:format("unexpected: ~p\n", [Other]), + ?line ?t:fail() + end + end. + +evil_counter(I,Opts) -> + T = ets:new(a, Opts), + Start0 = case I rem 3 of + 0 -> 16#12345678; + 1 -> 16#12345678FFFFFFFF; + 2 -> 16#7777777777FFFFFFFF863648726743 + end, + Start = Start0 + random:uniform(100000), + ets:insert(T, {dracula,Start}), + Iter = 90000, + End = Start + Iter, + End = evil_counter_1(Iter, T), + ets:delete(T). + +evil_counter_1(0, T) -> + [{dracula,Count}] = ets:lookup(T, dracula), + Count; +evil_counter_1(Iter, T) -> + ets:update_counter(T, dracula, 1), + evil_counter_1(Iter-1, T). + +fixtable_next(doc) -> + ["Check that a first-next sequence always works on a fixed table"]; +fixtable_next(suite) -> + []; +fixtable_next(Config) when is_list(Config) -> + repeat_for_opts(fixtable_next_do, [write_concurrency,all_types]). + +fixtable_next_do(Opts) -> + ?line EtsMem = etsmem(), + ?line do_fixtable_next(ets:new(set,[public | Opts])), + ?line verify_etsmem(EtsMem). + +do_fixtable_next(Tab) -> + ?line F = fun(X,T,FF) -> case X of + 0 -> true; + _ -> + ets:insert(T, {X, + integer_to_list(X), + X rem 10}), + FF(X-1,T,FF) + end + end, + ?line F(100,Tab,F), + ?line ets:safe_fixtable(Tab,true), + ?line First = ets:first(Tab), + ?line ets:delete(Tab, First), + ?line ets:next(Tab, First), + ?line ets:match_delete(Tab,{'_','_','_'}), + ?line '$end_of_table' = ets:next(Tab, First), + ?line true = ets:info(Tab, fixed), + ?line ets:safe_fixtable(Tab, false), + ?line false = ets:info(Tab, fixed), + ?line ets:delete(Tab). + +fixtable_insert(doc) -> + ["Check inserts of deleted keys in fixed bags"]; +fixtable_insert(suite) -> + []; +fixtable_insert(Config) when is_list(Config) -> + Combos = [[Type,{write_concurrency,WC}] || Type<- [bag,duplicate_bag], + WC <- [false,true]], + lists:foreach(fun(Opts) -> fixtable_insert_do(Opts) end, + Combos), + ok. + +fixtable_insert_do(Opts) -> + io:format("Opts = ~p\n",[Opts]), + Ets = make_table(ets, Opts, [{a,1}, {a,2}, {b,1}, {b,2}]), + ets:safe_fixtable(Ets,true), + ets:match_delete(Ets,{b,1}), + First = ets:first(Ets), + ?line Next = case First of + a -> b; + b -> a + end, + ?line Next = ets:next(Ets,First), + ets:delete(Ets,Next), + ?line '$end_of_table' = ets:next(Ets,First), + ets:insert(Ets, {Next,1}), + ?line false = ets:insert_new(Ets, {Next,1}), + ?line Next = ets:next(Ets,First), + ?line '$end_of_table' = ets:next(Ets,Next), + ets:delete(Ets,Next), + '$end_of_table' = ets:next(Ets,First), + ets:insert(Ets, {Next,2}), + ?line false = ets:insert_new(Ets, {Next,1}), + Next = ets:next(Ets,First), + '$end_of_table' = ets:next(Ets,Next), + ets:delete(Ets,First), + ?line Next = ets:first(Ets), + ?line '$end_of_table' = ets:next(Ets,Next), + ets:delete(Ets,Next), + ?line '$end_of_table' = ets:next(Ets,First), + ?line true = ets:insert_new(Ets,{Next,1}), + ?line false = ets:insert_new(Ets,{Next,2}), + ?line Next = ets:next(Ets,First), + ets:delete_object(Ets,{Next,1}), + ?line '$end_of_table' = ets:next(Ets,First), + ?line true = ets:insert_new(Ets,{Next,2}), + ?line false = ets:insert_new(Ets,{Next,1}), + ?line Next = ets:next(Ets,First), + ets:delete(Ets,First), + ets:safe_fixtable(Ets,false), + {'EXIT',{badarg,_}} = (catch ets:next(Ets,First)), + ok. + +write_concurrency(doc) -> ["The 'write_concurrency' option"]; +write_concurrency(suite) -> []; +write_concurrency(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + Yes1 = ets:new(foo,[public,{write_concurrency,true}]), + Yes2 = ets:new(foo,[protected,{write_concurrency,true}]), + No1 = ets:new(foo,[private,{write_concurrency,true}]), + + Yes3 = ets:new(foo,[bag,public,{write_concurrency,true}]), + Yes4 = ets:new(foo,[bag,protected,{write_concurrency,true}]), + No2 = ets:new(foo,[bag,private,{write_concurrency,true}]), + + Yes5 = ets:new(foo,[duplicate_bag,public,{write_concurrency,true}]), + Yes6 = ets:new(foo,[duplicate_bag,protected,{write_concurrency,true}]), + No3 = ets:new(foo,[duplicate_bag,private,{write_concurrency,true}]), + + No4 = ets:new(foo,[ordered_set,public,{write_concurrency,true}]), + No5 = ets:new(foo,[ordered_set,protected,{write_concurrency,true}]), + No6 = ets:new(foo,[ordered_set,private,{write_concurrency,true}]), + + No7 = ets:new(foo,[public,{write_concurrency,false}]), + No8 = ets:new(foo,[protected,{write_concurrency,false}]), + + ?line YesMem = ets:info(Yes1,memory), + ?line NoHashMem = ets:info(No1,memory), + ?line NoTreeMem = ets:info(No4,memory), + io:format("YesMem=~p NoHashMem=~p NoTreeMem=~p\n",[YesMem,NoHashMem,NoTreeMem]), + + ?line YesMem = ets:info(Yes2,memory), + ?line YesMem = ets:info(Yes3,memory), + ?line YesMem = ets:info(Yes4,memory), + ?line YesMem = ets:info(Yes5,memory), + ?line YesMem = ets:info(Yes6,memory), + ?line NoHashMem = ets:info(No2,memory), + ?line NoHashMem = ets:info(No3,memory), + ?line NoTreeMem = ets:info(No5,memory), + ?line NoTreeMem = ets:info(No6,memory), + ?line NoHashMem = ets:info(No7,memory), + ?line NoHashMem = ets:info(No8,memory), + + case erlang:system_info(smp_support) of + true -> + ?line true = YesMem > NoHashMem, + ?line true = YesMem > NoTreeMem; + false -> + ?line true = YesMem =:= NoHashMem + end, + + ?line {'EXIT',{badarg,_}} = (catch ets:new(foo,[public,{write_concurrency,foo}])), + ?line {'EXIT',{badarg,_}} = (catch ets:new(foo,[public,{write_concurrency}])), + ?line {'EXIT',{badarg,_}} = (catch ets:new(foo,[public,{write_concurrency,true,foo}])), + ?line {'EXIT',{badarg,_}} = (catch ets:new(foo,[public,write_concurrency])), + + lists:foreach(fun(T) -> ets:delete(T) end, + [Yes1,Yes2,Yes3,Yes4,Yes5,Yes6, + No1,No2,No3,No4,No5,No6,No7,No8]), + ?line verify_etsmem(EtsMem), + ok. + + +heir(doc) -> ["The 'heir' option"]; +heir(suite) -> []; +heir(Config) when is_list(Config) -> + repeat_for_opts(heir_do). + +heir_do(Opts) -> + ?line EtsMem = etsmem(), + Master = self(), + + %% Different types of heir data and link/monitor relations + TestFun = fun(Arg) -> {EtsMem,Arg} end, + Combos = [{Data,Mode} || Data<-[foo_data, <<"binary">>, + lists:seq(1,10), {17,TestFun,self()}, + "The busy heir"], + Mode<-[none,link,monitor]], + ?line lists:foreach(fun({Data,Mode})-> heir_1(Data,Mode,Opts) end, + Combos), + + %% No heir + {Founder1,MrefF1} = spawn_monitor(fun()->heir_founder(Master,foo_data,Opts)end), + Founder1 ! {go, none}, + ?line {"No heir",Founder1} = receive_any(), + ?line {'DOWN', MrefF1, process, Founder1, normal} = receive_any(), + ?line undefined = ets:info(foo), + + %% An already dead heir + {Heir2,MrefH2} = spawn_monitor(fun()->die end), + ?line {'DOWN', MrefH2, process, Heir2, normal} = receive_any(), + {Founder2,MrefF2} = spawn_monitor(fun()->heir_founder(Master,foo_data,Opts)end), + Founder2 ! {go, Heir2}, + ?line {"No heir",Founder2} = receive_any(), + ?line {'DOWN', MrefF2, process, Founder2, normal} = receive_any(), + ?line undefined = ets:info(foo), + + %% When heir dies before founder + {Founder3,MrefF3} = spawn_monitor(fun()->heir_founder(Master,"The dying heir",Opts)end), + {Heir3,MrefH3} = spawn_monitor(fun()->heir_heir(Founder3)end), + Founder3 ! {go, Heir3}, + ?line {'DOWN', MrefH3, process, Heir3, normal} = receive_any(), + Founder3 ! die_please, + ?line {'DOWN', MrefF3, process, Founder3, normal} = receive_any(), + ?line undefined = ets:info(foo), + + %% When heir dies and pid reused before founder dies + erts_debug:set_internal_state(available_internal_state,true), + NextPidIx = erts_debug:get_internal_state(next_pid), + {Founder4,MrefF4} = spawn_monitor(fun()->heir_founder(Master,"The dying heir",Opts)end), + {Heir4,MrefH4} = spawn_monitor(fun()->heir_heir(Founder4)end), + Founder4 ! {go, Heir4}, + ?line {'DOWN', MrefH4, process, Heir4, normal} = receive_any(), + erts_debug:set_internal_state(next_pid, NextPidIx), + erts_debug:set_internal_state(available_internal_state,false), + {Heir4,MrefH4_B} = spawn_monitor_with_pid(Heir4, + fun()-> ?line die_please = receive_any() end), + Founder4 ! die_please, + ?line {'DOWN', MrefF4, process, Founder4, normal} = receive_any(), + Heir4 ! die_please, + ?line {'DOWN', MrefH4_B, process, Heir4, normal} = receive_any(), + ?line undefined = ets:info(foo), + + ?line verify_etsmem(EtsMem). + +heir_founder(Master, HeirData, Opts) -> + ?line {go,Heir} = receive_any(), + HeirTpl = case Heir of + none -> {heir,none}; + _ -> {heir, Heir, HeirData} + end, + ?line T = ets:new(foo,[named_table, private, HeirTpl | Opts]), + ?line true = ets:insert(T,{key,1}), + ?line [{key,1}] = ets:lookup(T,key), + Self = self(), + ?line Self = ets:info(T,owner), + ?line case ets:info(T,heir) of + none -> + ?line true = (Heir =:= none) orelse (not is_process_alive(Heir)), + Master ! {"No heir",self()}; + + Heir -> + ?line true = is_process_alive(Heir), + Heir ! {table,T,HeirData}, + die_please = receive_any() + end. + + +heir_heir(Founder) -> + heir_heir(Founder, none). +heir_heir(Founder, Mode) -> + ?line {table,T,HeirData} = receive_any(), + ?line {'EXIT',{badarg,_}} = (catch ets:lookup(T,key)), + ?line case HeirData of + "The dying heir" -> exit(normal); + _ -> ok + end, + + ?line Mref = case Mode of + link -> process_flag(trap_exit, true), + link(Founder); + monitor -> erlang:monitor(process,Founder); + none -> ok + end, + ?line Founder ! die_please, + ?line Msg = case HeirData of + "The busy heir" -> receive_any_spinning(); + _ -> receive_any() + end, + ?line {'ETS-TRANSFER', T, Founder, HeirData} = Msg, + ?line foo = T, + ?line Self = self(), + ?line Self = ets:info(T,owner), + ?line Self = ets:info(T,heir), + ?line [{key,1}] = ets:lookup(T,key), + ?line true = ets:insert(T,{key,2}), + ?line [{key,2}] = ets:lookup(T,key), + ?line case Mode of % Verify that EXIT or DOWN comes after ETS-TRANSFER + link -> + {'EXIT',Founder,normal} = receive_any(), + process_flag(trap_exit, false); + monitor -> + {'DOWN', Mref, process, Founder, normal} = receive_any(); + none -> ok + end. + + +heir_1(HeirData,Mode,Opts) -> + io:format("test with heir_data = ~p\n", [HeirData]), + Master = self(), + ?line Founder = spawn_link(fun() -> heir_founder(Master,HeirData,Opts) end), + io:format("founder spawned = ~p\n", [Founder]), + ?line {Heir,Mref} = spawn_monitor(fun() -> heir_heir(Founder,Mode) end), + io:format("heir spawned = ~p\n", [{Heir,Mref}]), + ?line Founder ! {go, Heir}, + ?line {'DOWN', Mref, process, Heir, normal} = receive_any(). + +give_away(doc) -> ["ets:give_way/3"]; +give_away(suite) -> []; +give_away(Config) when is_list(Config) -> + repeat_for_opts(give_away_do). + +give_away_do(Opts) -> + ?line T = ets:new(foo,[named_table, private | Opts]), + ?line true = ets:insert(T,{key,1}), + ?line [{key,1}] = ets:lookup(T,key), + Parent = self(), + + %% Give and then give back + ?line {Receiver,Mref} = spawn_monitor(fun()-> give_away_receiver(T,Parent) end), + ?line give_me = receive_any(), + ?line true = ets:give_away(T,Receiver,here_you_are), + ?line {'EXIT',{badarg,_}} = (catch ets:lookup(T,key)), + ?line Receiver ! give_back, + ?line {'ETS-TRANSFER',T,Receiver,"Tillbakakaka"} = receive_any(), + ?line [{key,2}] = ets:lookup(T,key), + ?line {'DOWN', Mref, process, Receiver, normal} = receive_any(), + + %% Give and then let receiver keep it + ?line true = ets:insert(T,{key,1}), + ?line {Receiver3,Mref3} = spawn_monitor(fun()-> give_away_receiver(T,Parent) end), + ?line give_me = receive_any(), + ?line true = ets:give_away(T,Receiver3,here_you_are), + ?line {'EXIT',{badarg,_}} = (catch ets:lookup(T,key)), + ?line Receiver3 ! die_please, + ?line {'DOWN', Mref3, process, Receiver3, normal} = receive_any(), + ?line undefined = ets:info(T), + + %% Give and then kill receiver to get back + ?line T2 = ets:new(foo,[private | Opts]), + ?line true = ets:insert(T2,{key,1}), + ?line ets:setopts(T2,{heir,self(),"Som en gummiboll..."}), + ?line {Receiver2,Mref2} = spawn_monitor(fun()-> give_away_receiver(T2,Parent) end), + ?line give_me = receive_any(), + ?line true = ets:give_away(T2,Receiver2,here_you_are), + ?line {'EXIT',{badarg,_}} = (catch ets:lookup(T2,key)), + ?line Receiver2 ! die_please, + ?line {'ETS-TRANSFER',T2,Receiver2,"Som en gummiboll..."} = receive_any(), + ?line [{key,2}] = ets:lookup(T2,key), + ?line {'DOWN', Mref2, process, Receiver2, normal} = receive_any(), + + %% Some negative testing + ?line {'EXIT',{badarg,_}} = (catch ets:give_away(T2,Receiver,"To a dead one")), + ?line {'EXIT',{badarg,_}} = (catch ets:give_away(T2,self(),"To myself")), + ?line {'EXIT',{badarg,_}} = (catch ets:give_away(T2,"not a pid","To wrong type")), + + ?line true = ets:delete(T2), + ?line {ReceiverNeg,MrefNeg} = spawn_monitor(fun()-> give_away_receiver(T2,Parent) end), + ?line give_me = receive_any(), + ?line {'EXIT',{badarg,_}} = (catch ets:give_away(T2,ReceiverNeg,"A deleted table")), + + ?line T3 = ets:new(foo,[public | Opts]), + spawn_link(fun()-> {'EXIT',{badarg,_}} = (catch ets:give_away(T3,ReceiverNeg,"From non owner")), + Parent ! done + end), + ?line done = receive_any(), + ?line ReceiverNeg ! no_soup_for_you, + ?line {'DOWN', MrefNeg, process, ReceiverNeg, normal} = receive_any(), + ok. + +give_away_receiver(T, Giver) -> + ?line {'EXIT',{badarg,_}} = (catch ets:lookup(T,key)), + ?line Giver ! give_me, + ?line case receive_any() of + {'ETS-TRANSFER',T,Giver,here_you_are} -> + ?line [{key,1}] = ets:lookup(T,key), + ?line true = ets:insert(T,{key,2}), + ?line case receive_any() of + give_back -> + ?line true = ets:give_away(T,Giver,"Tillbakakaka"), + ?line {'EXIT',{badarg,_}} = (catch ets:lookup(T,key)); + die_please -> + ok + end; + no_soup_for_you -> + ok + end. + + +setopts(doc) -> ["ets:setopts/2"]; +setopts(suite) -> []; +setopts(Config) when is_list(Config) -> + repeat_for_opts(setopts_do,[write_concurrency,all_types]). + +setopts_do(Opts) -> + Self = self(), + ?line T = ets:new(foo,[named_table, private | Opts]), + ?line none = ets:info(T,heir), + Heir = spawn_link(fun()->heir_heir(Self) end), + ?line ets:setopts(T,{heir,Heir,"Data"}), + ?line Heir = ets:info(T,heir), + ?line ets:setopts(T,{heir,self(),"Data"}), + ?line Self = ets:info(T,heir), + ?line ets:setopts(T,[{heir,Heir,"Data"}]), + ?line Heir = ets:info(T,heir), + ?line ets:setopts(T,[{heir,none}]), + ?line none = ets:info(T,heir), + + ?line {'EXIT',{badarg,_}} = (catch ets:setopts(T,[{heir,self(),"Data"},false])), + ?line {'EXIT',{badarg,_}} = (catch ets:setopts(T,{heir,self()})), + ?line {'EXIT',{badarg,_}} = (catch ets:setopts(T,{heir,false})), + ?line {'EXIT',{badarg,_}} = (catch ets:setopts(T,heir)), + ?line {'EXIT',{badarg,_}} = (catch ets:setopts(T,{heir,false,"Data"})), + ?line {'EXIT',{badarg,_}} = (catch ets:setopts(T,{false,self(),"Data"})), + + ?line ets:setopts(T,{protection,protected}), + ?line ets:setopts(T,{protection,public}), + ?line ets:setopts(T,{protection,private}), + ?line ets:setopts(T,[{protection,protected}]), + ?line ets:setopts(T,[{protection,public}]), + ?line ets:setopts(T,[{protection,private}]), + + ?line {'EXIT',{badarg,_}} = (catch ets:setopts(T,{protection})), + ?line {'EXIT',{badarg,_}} = (catch ets:setopts(T,{protection,false})), + ?line {'EXIT',{badarg,_}} = (catch ets:setopts(T,{protection,private,false})), + ?line {'EXIT',{badarg,_}} = (catch ets:setopts(T,protection)), + ?line ets:delete(T), + ok. + +bad_table(doc) -> ["All kinds of operations with bad table argument"]; +bad_table(suite) -> []; +bad_table(Config) when is_list(Config) -> + + %% Open and close disk_log to stabilize etsmem. + Name = make_ref(), + ?line File = filename:join([?config(priv_dir, Config),"bad_table.dummy"]), + ?line {ok, Name} = disk_log:open([{name, Name}, {file, File}]), + ?line disk_log:close(Name), + file:delete(File), + + ?line EtsMem = etsmem(), + + repeat_for_opts(fun(Opts) -> bad_table_do(Opts,File) end, + [write_concurrency, all_types]), + ?line verify_etsmem(EtsMem), + ok. + +bad_table_do(Opts, DummyFile) -> + Parent = self(), + {Pid,Mref} = spawn_opt(fun()-> ets:new(priv,[private,named_table | Opts]), + Priv = ets:new(priv,[private | Opts]), + ets:new(prot,[protected,named_table | Opts]), + Prot = ets:new(prot,[protected | Opts]), + Parent ! {self(),Priv,Prot}, + die_please = receive_any() + end, + [link, monitor]), + {Pid,Priv,Prot} = receive_any(), + MatchSpec = {{key,'_'}, [], ['$$']}, + Fun = fun(X,_) -> X end, + OpList = [{delete,[key],update}, + {delete_all_objects,[],update}, + {delete_object,[{key,data}],update}, + {first,[],read}, + {foldl,[Fun, 0], read, tabarg_last}, + {foldr,[Fun, 0], read, tabarg_last}, + %%{from_dets,[DetsTab], update}, + {give_away,[Pid, data], update}, + %%{info, [], read}, + %%{info, [safe_fixed], read}, + %%{init_table,[Name, InitFun],update}, + {insert, [{key,data}], update}, + {insert_new, [{key,data}], update}, + {insert_new, [[{key,data},{other,data}]], update}, + {last, [], read}, + {lookup, [key], read}, + {lookup_element, [key, 2], read}, + {match, [{}], read}, + {match, [{},17], read}, + {match_delete, [{}], update}, + {match_object, [{}], read}, + {match_object, [{},17], read}, + {member,[key], read}, + {next, [key], read}, + {prev, [key], read}, + {rename, [new_name], update}, + {safe_fixtable, [true], read}, + {select,[MatchSpec], read}, + {select,[MatchSpec,17], read}, + {select_count,[MatchSpec], read}, + {select_delete,[MatchSpec], update}, + {setopts, [{heir,none}], update}, + {slot, [0], read}, + {tab2file, [DummyFile], read, {return,{error,badtab}}}, + {tab2file, [DummyFile,[]], read, {return,{error,badtab}}}, + {tab2list, [], read}, + %%{table,[], read}, + %%{to_dets, [DetsTab], read}, + {update_counter,[key,1], update}, + {update_element,[key,{2,new_data}], update} + ], + Info = {Opts, Priv, Prot}, + lists:foreach(fun(Op) -> bad_table_op(Info, Op) end, + OpList), + Pid ! die_please, + {'DOWN', Mref, process, Pid, normal} = receive_any(), + ok. + +bad_table_op({Opts,Priv,Prot}, Op) -> + %%io:format("Doing Op=~p on ~p's\n",[Op,Type]), + T1 = ets:new(noname,Opts), + bad_table_call(noname,Op), + ets:delete(T1), + bad_table_call(T1,Op), + T2 = ets:new(named,[named_table | Opts]), + ets:delete(T2), + bad_table_call(named,Op), + bad_table_call(T2,Op), + bad_table_call(priv,Op), + bad_table_call(Priv,Op), + case element(3,Op) of + update -> + bad_table_call(prot,Op), + bad_table_call(Prot,Op); + read -> ok + end. + +bad_table_call(T,{F,Args,_}) -> + ?line {'EXIT',{badarg,_}} = (catch apply(ets, F, [T|Args])); +bad_table_call(T,{F,Args,_,tabarg_last}) -> + ?line {'EXIT',{badarg,_}} = (catch apply(ets, F, Args++[T])); +bad_table_call(T,{F,Args,_,{return,Return}}) -> + try + ?line Return = apply(ets, F, [T|Args]) + catch + error:badarg -> ok + end. + + +rename(doc) -> + ["Check rename of ets tables"]; +rename(suite) -> + []; +rename(Config) when is_list(Config) -> + repeat_for_opts(rename_do, [write_concurrency, all_types]). + +rename_do(Opts) -> + ?line EtsMem = etsmem(), + ets:new(foobazz,[named_table, public | Opts]), + ets:insert(foobazz,{foo,bazz}), + ungermanbazz = ets:rename(foobazz,ungermanbazz), + {'EXIT',{badarg, _}} = (catch ets:lookup(foobazz,foo)), + [{foo,bazz}] = ets:lookup(ungermanbazz,foo), + {'EXIT',{badarg,_}} = (catch ets:rename(ungermanbazz,"no atom")), + ets:delete(ungermanbazz), + ?line verify_etsmem(EtsMem). + +rename_unnamed(doc) -> + ["Check rename of unnamed ets table"]; +rename_unnamed(suite) -> + []; +rename_unnamed(Config) when is_list(Config) -> + repeat_for_opts(rename_unnamed_do,[write_concurrency,all_types]). + +rename_unnamed_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(bonkz,[public | Opts]), + ?line {'EXIT',{badarg, _}} = (catch ets:insert(bonkz,{foo,bazz})), + ?line bonkz = ets:info(Tab, name), + ?line Tab = ets:rename(Tab, tjabonkz), + ?line {'EXIT',{badarg, _}} = (catch ets:insert(tjabonkz,{foo,bazz})), + ?line tjabonkz = ets:info(Tab, name), + ?line ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +evil_rename(doc) -> + "Rename a table with many fixations, and at the same time delete it."; +evil_rename(Config) when is_list(Config) -> + ?line evil_rename_1(old_hash, new_hash, [public,named_table]), + ?line EtsMem = etsmem(), + ?line evil_rename_1(old_tree, new_tree, [public,ordered_set,named_table]), + ?line verify_etsmem(EtsMem). + +evil_rename_1(Old, New, Flags) -> + ?line process_flag(trap_exit, true), + ?line Old = ets:new(Old, Flags), + ?line Fixer = fun() -> ets:safe_fixtable(Old, true) end, + ?line crazy_fixtable(15000, Fixer), + ?line erlang:yield(), + ?line New = ets:rename(Old, New), + ?line erlang:yield(), + ets:delete(New), + ok. + +crazy_fixtable(N, Fixer) -> + Dracula = ets:new(count_dracula, [public]), + ets:insert(Dracula, {count,0}), + SpawnFun = fun() -> + Fixer(), + case ets:update_counter(Dracula, count, 1) rem 15 of + 0 -> evil_creater_destroyer(); + _ -> erlang:hibernate(erlang, error, [dont_wake_me]) + end + end, + crazy_fixtable_1(N, SpawnFun), + crazy_fixtable_wait(N, Dracula), + Dracula. + +crazy_fixtable_wait(N, Dracula) -> + case ets:lookup(Dracula, count) of + [{count,N}] -> + ets:delete(Dracula); + Other -> + io:format("~p\n", [Other]), + receive after 10 -> ok end, + crazy_fixtable_wait(N, Dracula) + end. + +crazy_fixtable_1(0, _) -> + ok; +crazy_fixtable_1(N, Fun) -> + spawn_link(Fun), + crazy_fixtable_1(N-1, Fun). + +evil_creater_destroyer() -> + T1 = evil_create_fixed_tab(), + ets:delete(T1). + +evil_create_fixed_tab() -> + T = ets:new(arne, [public]), + ets:safe_fixtable(T, true), + T. + +interface_equality(doc) -> + ["Tests that the return values and errors are equal for set's and" + " ordered_set's where applicable"]; +interface_equality(suite) -> + []; +interface_equality(Config) when is_list(Config) -> + repeat_for_opts(interface_equality_do). + +interface_equality_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Set = ets:new(set,[set | Opts]), + ?line OrderedSet = ets:new(ordered_set,[ordered_set | Opts]), + ?line F = fun(X,T,FF) -> case X of + 0 -> true; + _ -> + ets:insert(T, {X, + integer_to_list(X), + X rem 10}), + FF(X-1,T,FF) + end + end, + ?line F(100,Set,F), + ?line F(100,OrderedSet,F), + ?line equal_results(ets, insert, Set, OrderedSet, [{a,"a"}]), + ?line equal_results(ets, insert, Set, OrderedSet, [{1,1,"1"}]), + ?line equal_results(ets, lookup, Set, OrderedSet, [10]), + ?line equal_results(ets, lookup, Set, OrderedSet, [1000]), + ?line equal_results(ets, delete, Set, OrderedSet, [10]), + ?line equal_results(ets, delete, Set, OrderedSet, [nott]), + ?line equal_results(ets, lookup, Set, OrderedSet, [1000]), + ?line equal_results(ets, insert, Set, OrderedSet, [10]), + ?line equal_results(ets, next, Set, OrderedSet, ['$end_of_table']), + ?line equal_results(ets, prev, Set, OrderedSet, ['$end_of_table']), + ?line equal_results(ets, match, Set, OrderedSet, [{'_','_','_'}]), + ?line equal_results(ets, match, Set, OrderedSet, [{'_','_','_','_'}]), + ?line equal_results(ets, match, Set, OrderedSet, [{$3,$2,2}]), + ?line equal_results(ets, match, Set, OrderedSet, ['_']), + ?line equal_results(ets, match, Set, OrderedSet, ['$1']), + ?line equal_results(ets, match, Set, OrderedSet, [{'_','$50',3}]), + ?line equal_results(ets, match, Set, OrderedSet, [['_','$50',3]]), + ?line equal_results(ets, match_delete, Set, OrderedSet, [{'_','_',4}]), + ?line equal_results(ets, match_delete, Set, OrderedSet, [{'_','_',4}]), + ?line equal_results(ets, match_object, Set, OrderedSet, [{'_','_',4}]), + ?line equal_results(ets, match_object, Set, OrderedSet, [{'_','_',5}]), + ?line equal_results(ets, match_object, Set, OrderedSet, [{'_','_',4}]), + ?line equal_results(ets, match_object, Set, OrderedSet, ['_']), + ?line equal_results(ets, match_object, Set, OrderedSet, ['$5011']), + ?line equal_results(ets, match_delete, Set, OrderedSet, ['$20']), + ?line equal_results(ets, lookup_element, Set, OrderedSet, [13,2]), + ?line equal_results(ets, lookup_element, Set, OrderedSet, [13,4]), + ?line equal_results(ets, lookup_element, Set, OrderedSet, [14,2]), + ?line equal_results(ets, delete, Set, OrderedSet, []), + ?line verify_etsmem(EtsMem). + +equal_results(M, F, FirstArg1, FirstArg2 ,ACommon) -> + Res = maybe_sort((catch apply(M,F, [FirstArg1 | ACommon]))), + Res = maybe_sort((catch apply(M,F,[FirstArg2 | ACommon]))). + +maybe_sort(L) when is_list(L) -> + lists:sort(L); +%maybe_sort({'EXIT',{Reason, [{Module, Function, _}|_]}}) -> +% {'EXIT',{Reason, [{Module, Function, '_'}]}}; +maybe_sort({'EXIT',{Reason, List}}) when is_list(List) -> + {'EXIT',{Reason, lists:map(fun({Module, Function, _}) -> + {Module, Function, '_'} + end, + List)}}; +maybe_sort(Any) -> + Any. + +ordered_match(doc) -> + ["Test match, match_object and match_delete in ordered set's"]; +ordered_match(suite) -> + []; +ordered_match(Config) when is_list(Config)-> + repeat_for_opts(ordered_match_do). + +ordered_match_do(Opts) -> + ?line EtsMem = etsmem(), + ?line F = fun(X,T,FF) -> case X of + 0 -> true; + _ -> + ets:insert(T, {X, + integer_to_list(X), + X rem 10, + X rem 100, + X rem 1000}), + FF(X-1,T,FF) + end + end, + ?line T1 = ets:new(xxx,[ordered_set| Opts]), + ?line F(3000,T1,F), + ?line [[3,3],[3,3],[3,3]] = ets:match(T1, {'_','_','$1','$2',3}), + ?line F2 = fun(X,Rem,Res,FF) -> case X of + 0 -> []; + _ -> + case X rem Rem of + Res -> + FF(X-1,Rem,Res,FF) ++ + [{X, + integer_to_list(X), + X rem 10, + X rem 100, + X rem 1000}]; + _ -> + FF(X-1,Rem,Res,FF) + end + end + end, + ?line OL1 = F2(3000,100,2,F2), + ?line OL1 = ets:match_object(T1, {'_','_','_',2,'_'}), + ?line true = ets:match_delete(T1,{'_','_','_',2,'_'}), + ?line [] = ets:match_object(T1, {'_','_','_',2,'_'}), + ?line OL2 = F2(3000,100,3,F2), + ?line OL2 = ets:match_object(T1, {'_','_','_',3,'_'}), + ?line ets:delete(T1), + ?line verify_etsmem(EtsMem). + + +ordered(doc) -> + ["Test basic functionality in ordered_set's."]; +ordered(suite) -> + []; +ordered(Config) when is_list(Config) -> + repeat_for_opts(ordered_do). + +ordered_do(Opts) -> + ?line EtsMem = etsmem(), + ?line T = ets:new(oset, [ordered_set | Opts]), + ?line InsList = [ + 25,26,27,28, + 5,6,7,8, + 21,22,23,24, + 9,10,11,12, + 1,2,3,4, + 17,18,19,20, + 13,14,15,16 + ], + ?line lists:foreach(fun(X) -> + ets:insert(T,{X,integer_to_list(X)}) + end, + InsList), + ?line IL2 = lists:map(fun(X) -> {X,integer_to_list(X)} end, InsList), + ?line L1 = pick_all_forward(T), + ?line L2 = pick_all_backwards(T), + ?line S1 = lists:sort(IL2), + ?line S2 = lists:reverse(lists:sort(IL2)), + ?line S1 = L1, + ?line S2 = L2, + ?line [{1,"1"}] = ets:slot(T,0), + ?line [{28,"28"}] = ets:slot(T,27), + ?line 27 = ets:prev(T,28), + ?line [{7,"7"}] = ets:slot(T,6), + ?line '$end_of_table' = ets:next(T,28), + ?line [{12,"12"}] = ets:slot(T,11), + ?line '$end_of_table' = ets:slot(T,28), + ?line [{1,"1"}] = ets:slot(T,0), + ?line 28 = ets:prev(T,29), + ?line 1 = ets:next(T,0), + ?line pick_all_forward(T), + ?line [{7,"7"}] = ets:slot(T,6), + ?line L2 = pick_all_backwards(T), + ?line [{7,"7"}] = ets:slot(T,6), + ?line ets:delete(T), + ?line verify_etsmem(EtsMem). + +pick_all(_T,'$end_of_table',_How) -> + []; +pick_all(T,Last,How) -> + ?line This = case How of + next -> + ?line ets:next(T,Last); + prev -> + ?line ets:prev(T,Last) + end, + ?line [LastObj] = ets:lookup(T,Last), + ?line [LastObj | pick_all(T,This,How)]. + +pick_all_forward(T) -> + ?line pick_all(T,ets:first(T),next). +pick_all_backwards(T) -> + ?line pick_all(T,ets:last(T),prev). + + + +setbag(doc) -> ["Small test case for both set and bag type ets tables."]; +setbag(suite) -> []; +setbag(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line Set = ets:new(set,[set]), + ?line Bag = ets:new(bag,[bag]), + ?line Key = {foo,bar}, + + %% insert some value + ?line ets:insert(Set,{Key,val1}), + ?line ets:insert(Bag,{Key,val1}), + + %% insert new value for same key again + ?line ets:insert(Set,{Key,val2}), + ?line ets:insert(Bag,{Key,val2}), + + %% check + ?line [{Key,val2}] = ets:lookup(Set,Key), + ?line [{Key,val1},{Key,val2}] = ets:lookup(Bag,Key), + + true = ets:delete(Set), + true = ets:delete(Bag), + ?line verify_etsmem(EtsMem). + +badnew(doc) -> + ["Test case to check proper return values for illegal ets:new() calls."]; +badnew(suite) -> []; +badnew(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line {'EXIT',{badarg,_}} = (catch ets:new(12,[])), + ?line {'EXIT',{badarg,_}} = (catch ets:new({a,b},[])), + ?line {'EXIT',{badarg,_}} = (catch ets:new(name,[foo])), + ?line {'EXIT',{badarg,_}} = (catch ets:new(name,{bag})), + ?line {'EXIT',{badarg,_}} = (catch ets:new(name,bag)), + ?line verify_etsmem(EtsMem). + +verybadnew(doc) -> + ["Test case to check that a not well formed list does not crash the " + "emulator. OTP-2314 "]; +verybadnew(suite) -> []; +verybadnew(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line {'EXIT',{badarg,_}} = (catch ets:new(verybad,[set|protected])), + ?line verify_etsmem(EtsMem). + +named(doc) -> ["Small check to see if named tables work."]; +named(suite) -> []; +named(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line Tab = make_table(foo, + [named_table], + [{key,val}]), + ?line [{key,val}] = ets:lookup(foo,key), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +keypos2(doc) -> ["Test case to check if specified keypos works."]; +keypos2(suite) -> []; +keypos2(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line Tab = make_table(foo, + [set,{keypos,2}], + [{val,key}, {val2,key}]), + ?line [{val2,key}] = ets:lookup(Tab,key), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +privacy(doc) -> + ["Privacy check. Check that a named(public/private/protected) table " + "cannot be read by", + "the wrong process(es)."]; +privacy(suite) -> []; +privacy(Config) when is_list(Config) -> + repeat_for_opts(privacy_do). + +privacy_do(Opts) -> + ?line EtsMem = etsmem(), + ?line process_flag(trap_exit,true), + ?line Owner = my_spawn_link(?MODULE,privacy_owner,[self(),Opts]), + receive + {'EXIT',Owner,Reason} -> + ?line exit({privacy_test,Reason}); + ok -> + ok + end, + + privacy_check(pub,prot,priv), + + Owner ! {shift,1,{pub,prot,priv}}, + receive {Pub1,Prot1,Priv1} -> ok end, + privacy_check(Pub1,Prot1,Priv1), + + Owner ! {shift,2,{Pub1,Prot1,Priv1}}, + receive {Pub2,Prot2,Priv2} -> ok end, + privacy_check(Pub2,Prot2,Priv2), + + Owner ! {shift,0,{Pub2,Prot2,Priv2}}, + receive {Pub2,Prot2,Priv2} -> ok end, + privacy_check(Pub2,Prot2,Priv2), + + Owner ! die, + receive {'EXIT',Owner,_} -> ok end, + ?line verify_etsmem(EtsMem). + +privacy_check(Pub,Prot,Priv) -> + %% check read rights + ?line [] = ets:lookup(Pub, foo), + ?line [] = ets:lookup(Prot,foo), + ?line {'EXIT',{badarg,_}} = (catch ets:lookup(Priv,foo)), + + %% check write rights + ?line true = ets:insert(Pub, {1,foo}), + ?line {'EXIT',{badarg,_}} = (catch ets:insert(Prot,{2,foo})), + ?line {'EXIT',{badarg,_}} = (catch ets:insert(Priv,{3,foo})), + + %% check that it really wasn't written, either + ?line [] = ets:lookup(Prot,foo). + +privacy_owner(Boss, Opts) -> + ets:new(pub, [public,named_table | Opts]), + ets:new(prot,[protected,named_table | Opts]), + ets:new(priv,[private,named_table | Opts]), + Boss ! ok, + privacy_owner_loop(Boss). + +privacy_owner_loop(Boss) -> + receive + {shift,N,Pub_Prot_Priv} -> + {Pub,Prot,Priv} = rotate_tuple(Pub_Prot_Priv, N), + + ets:setopts(Pub,{protection,public}), + ets:setopts(Prot,{protection,protected}), + ets:setopts(Priv,{protection,private}), + Boss ! {Pub,Prot,Priv}, + privacy_owner_loop(Boss); + + die -> ok + end. + +rotate_tuple(Tuple, 0) -> + Tuple; +rotate_tuple(Tuple, N) -> + [H|T] = tuple_to_list(Tuple), + rotate_tuple(list_to_tuple(T ++ [H]), N-1). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +insert(doc) -> ["Test proper and improper inserts into a table."]; +insert(suite) -> [empty,badinsert]. + +empty(doc) -> + ["Check lookup in an empty table and lookup of a non-existing key"]; +empty(suite) -> []; +empty(Config) when is_list(Config) -> + repeat_for_opts(empty_do). + +empty_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foo,Opts), + ?line [] = ets:lookup(Tab,key), + ?line true = ets:insert(Tab,{key2,val}), + ?line [] = ets:lookup(Tab,key), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +badinsert(doc) -> + ["Check proper return values for illegal insert operations."]; +badinsert(suite) -> []; +badinsert(Config) when is_list(Config) -> + repeat_for_opts(badinsert_do). + +badinsert_do(Opts) -> + ?line EtsMem = etsmem(), + ?line {'EXIT',{badarg,_}} = (catch ets:insert(foo,{key,val})), + + ?line Tab = ets:new(foo,Opts), + ?line {'EXIT',{badarg,_}} = (catch ets:insert(Tab,{})), + + ?line Tab3 = ets:new(foo,[{keypos,3}| Opts]), + ?line {'EXIT',{badarg,_}} = (catch ets:insert(Tab3,{a,b})), + + ?line {'EXIT',{badarg,_}} = (catch ets:insert(Tab,[key,val2])), + ?line true = ets:delete(Tab), + ?line true = ets:delete(Tab3), + ?line verify_etsmem(EtsMem). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +lookup(doc) -> ["Some tests for lookups (timing, bad lookups, etc.)."]; +lookup(suite) -> [time_lookup,badlookup,lookup_order]. + +time_lookup(doc) -> ["Lookup timing."]; +time_lookup(suite) -> []; +time_lookup(Config) when is_list(Config) -> + %% just for timing, really + ?line EtsMem = etsmem(), + Values = repeat_for_opts(time_lookup_do), + ?line verify_etsmem(EtsMem), + ?line {comment,lists:flatten(io_lib:format( + "~p ets lookups/s",[Values]))}. + +time_lookup_do(Opts) -> + ?line Tab = ets:new(foo,Opts), + ?line fill_tab(Tab,foo), + ?line ets:insert(Tab,{{a,key},foo}), + ?line {Time,_} = ?t:timecall(test_server,do_times, + [10000,ets,lookup,[Tab,{a,key}]]), + ?line true = ets:delete(Tab), + round(10000 / Time). % lookups/s + +badlookup(doc) -> + ["Check proper return values from bad lookups in existing/non existing " + " ets tables"]; +badlookup(suite) -> []; +badlookup(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line {'EXIT',{badarg,_}} = (catch ets:lookup(foo,key)), + ?line Tab = ets:new(foo,[]), + ?line ets:delete(Tab), + ?line {'EXIT',{badarg,_}} = (catch ets:lookup(Tab,key)), + ?line verify_etsmem(EtsMem). + +lookup_order(doc) -> ["Test that lookup returns objects in order of insertion for bag and dbag."]; +lookup_order(suite) -> []; +lookup_order(Config) when is_list(Config) -> + EtsMem = etsmem(), + repeat_for_opts(lookup_order_do, [write_concurrency,[bag,duplicate_bag]]), + ?line verify_etsmem(EtsMem), + ok. + +lookup_order_do(Opts) -> + lookup_order_2(Opts, false), + lookup_order_2(Opts, true). + +lookup_order_2(Opts, Fixed) -> + io:format("Opts=~p Fixed=~p\n",[Opts,Fixed]), + + A = 1, B = 2, C = 3, + ABC = [A,B,C], + Pair = [{A,B},{B,A},{A,C},{C,A},{B,C},{C,B}], + Combos = [{D1,D2,D3} || D1<-ABC, D2<-Pair, D3<-Pair], + lists:foreach(fun({D1,{D2a,D2b},{D3a,D3b}}) -> + T = ets:new(foo,Opts), + case Fixed of + true -> ets:safe_fixtable(T,true); + false -> ok + end, + S10 = {T,[],key}, + S20 = check_insert(S10,A), + S30 = check_insert(S20,B), + S40 = check_insert(S30,C), + S50 = check_delete(S40,D1), + S55 = check_insert(S50,D1), + S60 = check_insert(S55,D1), + S70 = check_delete(S60,D2a), + S80 = check_delete(S70,D2b), + S90 = check_insert(S80,D2a), + SA0 = check_delete(S90,D3a), + SB0 = check_delete(SA0,D3b), + check_insert_new(SB0,D3b), + + true = ets:delete(T) + end, + Combos). + + +check_insert({T,List0,Key},Val) -> + %%io:format("insert ~p into ~p\n",[Val,List0]), + ets:insert(T,{Key,Val}), + List1 = case (ets:info(T,type) =:= bag andalso + lists:member({Key,Val},List0)) of + true -> List0; + false -> [{Key,Val} | List0] + end, + check_check({T,List1,Key}). + +check_insert_new({T,List0,Key},Val) -> + %%io:format("insert_new ~p into ~p\n",[Val,List0]), + Ret = ets:insert_new(T,{Key,Val}), + ?line Ret = (List0 =:= []), + List1 = case Ret of + true -> [{Key,Val}]; + false -> List0 + end, + check_check({T,List1,Key}). + + +check_delete({T,List0,Key},Val) -> + %%io:format("delete ~p from ~p\n",[Val,List0]), + ets:delete_object(T,{Key,Val}), + List1 = lists:filter(fun(Obj) -> Obj =/= {Key,Val} end, + List0), + check_check({T,List1,Key}). + +check_check(S={T,List,Key}) -> + case lists:reverse(ets:lookup(T,Key)) of + List -> ok; + ETS -> io:format("check failed:\nETS: ~p\nCHK: ~p\n", [ETS,List]), + ?t:fail("Invalid return value from ets:lookup") + end, + ?line Items = ets:info(T,size), + ?line Items = length(List), + S. + + + +fill_tab(Tab,Val) -> + ?line ets:insert(Tab,{key,Val}), + ?line ets:insert(Tab,{{a,144},Val}), + ?line ets:insert(Tab,{{a,key2},Val}), + ?line ets:insert(Tab,{14,Val}), + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +lookup_element(doc) -> ["Some tests for lookup_element."]; +lookup_element(suite) -> [lookup_element_mult]. + +lookup_element_mult(doc) -> ["Multiple return elements (OTP-2386)"]; +lookup_element_mult(suite) -> []; +lookup_element_mult(Config) when is_list(Config) -> + repeat_for_opts(lookup_element_mult_do). + +lookup_element_mult_do(Opts) -> + ?line EtsMem = etsmem(), + ?line T = ets:new(service, [bag, {keypos, 2} | Opts]), + ?line D = lists:reverse(lem_data()), + ?line lists:foreach(fun(X) -> ets:insert(T, X) end, D), + ?line ok = lem_crash_3(T), + ?line true = ets:delete(T), + ?line verify_etsmem(EtsMem). + +lem_data() -> + [ + {service,'eddie2@boromir',{150,236,14,103},httpd88,self()}, + {service,'eddie2@boromir',{150,236,14,103},httpd80,self()}, + {service,'eddie3@boromir',{150,236,14,107},httpd88,self()}, + {service,'eddie3@boromir',{150,236,14,107},httpd80,self()}, + {service,'eddie4@boromir',{150,236,14,108},httpd88,self()} + ]. + +lem_crash(T) -> + L = ets:lookup_element(T, 'eddie2@boromir', 3), + {erlang:phash(L, 256), L}. + +lem_crash_3(T) -> + lem_crash(T), + io:format("Survived once~n"), + lem_crash(T), + io:format("Survived twice~n"), + lem_crash(T), + io:format("Survived all!~n"), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +delete(doc) -> + ["Check delete functionality (proper/improper deletes)"]; +delete(suite) -> + [delete_elem,delete_tab,delete_large_tab,delete_large_named_table,evil_delete, + table_leak,baddelete,match_delete,match_delete3]. + +delete_elem(doc) -> + ["Check delete of an element inserted in a `filled' table."]; +delete_elem(suite) -> []; +delete_elem(Config) when is_list(Config) -> + repeat_for_opts(delete_elem_do, [write_concurrency, all_types]). + +delete_elem_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foo,Opts), + ?line fill_tab(Tab,foo), + ?line ets:insert(Tab,{{b,key},foo}), + ?line ets:insert(Tab,{{c,key},foo}), + ?line true = ets:delete(Tab,{b,key}), + ?line [] = ets:lookup(Tab,{b,key}), + ?line [{{c,key},foo}] = ets:lookup(Tab,{c,key}), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +delete_tab(doc) -> + ["Check that ets:delete() works and releases the name of the deleted " + "table."]; +delete_tab(suite) -> []; +delete_tab(Config) when is_list(Config) -> + repeat_for_opts(delete_tab_do,[write_concurrency,all_types]). + +delete_tab_do(Opts) -> + Name = foo, + ?line EtsMem = etsmem(), + ?line Name = ets:new(Name, [named_table | Opts]), + ?line true = ets:delete(foo), + %% The name should be available again. + ?line Name = ets:new(Name, [named_table | Opts]), + ?line true = ets:delete(Name), + ?line verify_etsmem(EtsMem). + +delete_large_tab(doc) -> + "Check that ets:delete/1 works and that other processes can run."; +delete_large_tab(Config) when is_list(Config) -> + ?line Data = [{erlang:phash2(I, 16#ffffff),I} || I <- lists:seq(1, 500000)], + ?line EtsMem = etsmem(), + repeat_for_opts(fun(Opts) -> delete_large_tab_do(Opts,Data) end), + ?line verify_etsmem(EtsMem). + +delete_large_tab_do(Opts,Data) -> + ?line delete_large_tab_1(foo_hash, Opts, Data, false), + ?line delete_large_tab_1(foo_tree, [ordered_set | Opts], Data, false), + ?line delete_large_tab_1(foo_hash, Opts, Data, true). + + +delete_large_tab_1(Name, Flags, Data, Fix) -> + ?line Tab = ets:new(Name, Flags), + ?line ets:insert(Tab, Data), + + case Fix of + false -> ok; + true -> + ?line true = ets:safe_fixtable(Tab, true), + ?line lists:foreach(fun({K,_}) -> ets:delete(Tab, K) end, Data) + end, + + {priority, Prio} = process_info(self(), priority), + ?line Deleter = self(), + ?line [SchedTracer] + = start_loopers(1, + Prio, + fun (SC) -> + receive + {trace, Deleter, out, _} -> + undefined = ets:info(Tab), + SC+1; + {trace, + Deleter, + register, + delete_large_tab_done_marker}-> + Deleter ! {schedule_count, SC}, + exit(normal); + _ -> + SC + end + end, + 0), + ?line Loopers = start_loopers(erlang:system_info(schedulers), + Prio, + fun (_) -> erlang:yield() end, + ok), + ?line erlang:yield(), + ?line 1 = erlang:trace(self(),true,[running,procs,{tracer,SchedTracer}]), + ?line true = ets:delete(Tab), + %% The register stuff is just a trace marker + ?line true = register(delete_large_tab_done_marker, self()), + ?line true = unregister(delete_large_tab_done_marker), + ?line undefined = ets:info(Tab), + ?line ok = stop_loopers(Loopers), + ?line receive + {schedule_count, N} -> + ?line io:format("~s: context switches: ~p", [Name,N]), + if + N >= 5 -> ?line ok; + true -> ?line ?t:fail() + end + end. + +delete_large_named_table(doc) -> + "Delete a large name table and try to create a new table with the same name in another process."; +delete_large_named_table(Config) when is_list(Config) -> + ?line Data = [{erlang:phash2(I, 16#ffffff),I} || I <- lists:seq(1, 500000)], + ?line EtsMem = etsmem(), + repeat_for_opts(fun(Opts) -> delete_large_named_table_do(Opts,Data) end), + ?line verify_etsmem(EtsMem), + ok. + +delete_large_named_table_do(Opts,Data) -> + ?line delete_large_named_table_1(foo_hash, [named_table | Opts], Data, false), + ?line delete_large_named_table_1(foo_tree, [ordered_set,named_table | Opts], Data, false), + ?line delete_large_named_table_1(foo_hash, [named_table | Opts], Data, true). + +delete_large_named_table_1(Name, Flags, Data, Fix) -> + ?line Tab = ets:new(Name, Flags), + ?line ets:insert(Tab, Data), + + case Fix of + false -> ok; + true -> + ?line true = ets:safe_fixtable(Tab, true), + ?line lists:foreach(fun({K,_}) -> ets:delete(Tab, K) end, Data) + end, + Parent = self(), + Pid = spawn_link(fun() -> + receive + {trace,Parent,call,_} -> + ets:new(Name, [named_table]) + end + end), + ?line erlang:trace(self(), true, [call,{tracer,Pid}]), + ?line erlang:trace_pattern({ets,delete,1}, true, [global]), + ?line erlang:yield(), true = ets:delete(Tab), + ?line erlang:trace_pattern({ets,delete,1}, false, [global]), + ok. + +evil_delete(doc) -> + "Delete a large table, and kill the process during the delete."; +evil_delete(Config) when is_list(Config) -> + ?line Data = [{I,I*I} || I <- lists:seq(1, 100000)], + repeat_for_opts(fun(Opts) -> evil_delete_do(Opts,Data) end). + +evil_delete_do(Opts,Data) -> + ?line EtsMem = etsmem(), + ?line evil_delete_owner(foo_hash, Opts, Data, false), + ?line verify_etsmem(EtsMem), + ?line evil_delete_owner(foo_hash, Opts, Data, true), + ?line verify_etsmem(EtsMem), + ?line evil_delete_owner(foo_tree, [ordered_set | Opts], Data, false), + ?line verify_etsmem(EtsMem), + ?line TabA = evil_delete_not_owner(foo_hash, Opts, Data, false), + ?line verify_etsmem(EtsMem), + ?line TabB = evil_delete_not_owner(foo_hash, Opts, Data, true), + ?line verify_etsmem(EtsMem), + ?line TabC = evil_delete_not_owner(foo_tree, [ordered_set | Opts], Data, false), + ?line verify_etsmem(EtsMem), + ?line lists:foreach(fun(T) -> undefined = ets:info(T) end, + [TabA,TabB,TabC]). + +evil_delete_not_owner(Name, Flags, Data, Fix) -> + io:format("Not owner: ~p, fix = ~p", [Name,Fix]), + ?line Tab = ets:new(Name, [public|Flags]), + ?line ets:insert(Tab, Data), + case Fix of + false -> ok; + true -> + ?line true = ets:safe_fixtable(Tab, true), + ?line lists:foreach(fun({K,_}) -> ets:delete(Tab, K) end, Data) + end, + ?line Pid = my_spawn(fun() -> + P = my_spawn_link( + fun() -> + receive kill -> ok end, + erlang:yield(), + exit(kill_linked_processes_now) + end), + erlang:yield(), + P ! kill, + true = ets:delete(Tab) + end), + ?line Ref = erlang:monitor(process, Pid), + ?line receive {'DOWN',Ref,_,_,_} -> ok end, + Tab. + +evil_delete_owner(Name, Flags, Data, Fix) -> + ?line Fun = fun() -> + ?line Tab = ets:new(Name, [public|Flags]), + ?line ets:insert(Tab, Data), + case Fix of + false -> ok; + true -> + ?line true = ets:safe_fixtable(Tab, true), + ?line lists:foreach(fun({K,_}) -> + ets:delete(Tab, K) + end, Data) + end, + erlang:yield(), + my_spawn_link(fun() -> + erlang:yield(), + exit(kill_linked_processes_now) + end), + true = ets:delete(Tab) + end, + ?line Pid = my_spawn(Fun), + ?line Ref = erlang:monitor(process, Pid), + ?line receive {'DOWN',Ref,_,_,_} -> ok end. + + +exit_large_table_owner(doc) -> + []; +exit_large_table_owner(suite) -> + []; +exit_large_table_owner(Config) when is_list(Config) -> + ?line Data = [{erlang:phash2(I, 16#ffffff),I} || I <- lists:seq(1, 500000)], + ?line EtsMem = etsmem(), + repeat_for_opts(fun(Opts) -> exit_large_table_owner_do(Opts,Data,Config) end), + ?line verify_etsmem(EtsMem). + +exit_large_table_owner_do(Opts,Data,Config) -> + ?line verify_rescheduling_exit(Config, Data, [named_table | Opts], true, 1, 1), + ?line verify_rescheduling_exit(Config, Data, Opts, false, 1, 1). + +exit_many_large_table_owner(doc) -> []; +exit_many_large_table_owner(suite) -> []; +exit_many_large_table_owner(Config) when is_list(Config) -> + ?line Data = [{erlang:phash2(I, 16#ffffff),I} || I <- lists:seq(1, 500000)], + ?line EtsMem = etsmem(), + repeat_for_opts(fun(Opts) -> exit_many_large_table_owner_do(Opts,Data,Config) end), + ?line verify_etsmem(EtsMem). + +exit_many_large_table_owner_do(Opts,Data,Config) -> + ?line verify_rescheduling_exit(Config, Data, Opts, true, 1, 4), + ?line verify_rescheduling_exit(Config, Data, [named_table | Opts], false, 1, 4). + +exit_many_tables_owner(doc) -> []; +exit_many_tables_owner(suite) -> []; +exit_many_tables_owner(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line verify_rescheduling_exit(Config, [], [named_table], false, 1000, 1), + ?line verify_rescheduling_exit(Config, [], [named_table,{write_concurrency,true}], false, 1000, 1), + ?line verify_etsmem(EtsMem). + +exit_many_many_tables_owner(doc) -> []; +exit_many_many_tables_owner(suite) -> []; +exit_many_many_tables_owner(Config) when is_list(Config) -> + ?line Data = [{erlang:phash2(I, 16#ffffff),I} || I <- lists:seq(1, 50)], + repeat_for_opts(fun(Opts) -> exit_many_many_tables_owner_do(Opts,Data,Config) end). + +exit_many_many_tables_owner_do(Opts,Data,Config) -> + ?line verify_rescheduling_exit(Config, Data, [named_table | Opts], true, 200, 5), + ?line verify_rescheduling_exit(Config, Data, Opts, false, 200, 5), + ?line wait_for_test_procs(), + ?line EtsMem = etsmem(), + ?line verify_rescheduling_exit(Config, Data, Opts, true, 200, 5), + ?line verify_rescheduling_exit(Config, Data, [named_table | Opts], false, 200, 5), + ?line verify_etsmem(EtsMem). + + +count_exit_sched(TP) -> + receive + {trace, TP, in_exiting, 0} -> + count_exit_sched_out(TP, 1); + {trace, TP, out_exiting, 0} -> + count_exit_sched_in(TP, 1); + {trace, TP, out_exited, 0} -> + 0 + end. + +count_exit_sched_in(TP, N) -> + receive + {trace, TP, in_exiting, 0} -> + count_exit_sched_out(TP, N); + {trace, TP, _, _} = Msg -> + exit({unexpected_trace_msg, Msg}) + end. + +count_exit_sched_out(TP, N) -> + receive + {trace, TP, out_exiting, 0} -> + count_exit_sched_in(TP, N+1); + {trace, TP, out_exited, 0} -> + N; + {trace, TP, _, _} = Msg -> + exit({unexpected_trace_msg, Msg}) + end. + +vre_fix_tables(Tab) -> + Parent = self(), + Go = make_ref(), + my_spawn_link(fun () -> + true = ets:safe_fixtable(Tab, true), + Parent ! Go, + receive infinity -> ok end + end), + receive Go -> ok end, + ok. + +verify_rescheduling_exit(Config, Data, Flags, Fix, NOTabs, NOProcs) -> + ?line NoFix = 5, + ?line TestCase = atom_to_list(?config(test_case, Config)), + ?line Parent = self(), + ?line KillMe = make_ref(), + ?line PFun = + fun () -> + repeat( + fun () -> + {A, B, C} = now(), + ?line Name = list_to_atom( + TestCase + ++ "-" ++ integer_to_list(A) + ++ "-" ++ integer_to_list(B) + ++ "-" ++ integer_to_list(C)), + Tab = ets:new(Name, Flags), + ets:insert(Tab, Data), + case Fix of + false -> ok; + true -> + lists:foreach(fun (_) -> + vre_fix_tables(Tab) + end, + lists:seq(1,NoFix)), + lists:foreach(fun({K,_}) -> + ets:delete(Tab, K) + end, + Data) + end + end, + NOTabs), + Parent ! {KillMe, self()}, + receive after infinity -> ok end + end, + ?line TPs = lists:map(fun (_) -> + ?line TP = my_spawn_link(PFun), + ?line 1 = erlang:trace(TP, true, [exiting]), + TP + end, + lists:seq(1, NOProcs)), + ?line lists:foreach(fun (TP) -> + receive {KillMe, TP} -> ok end + end, + TPs), + ?line LPs = start_loopers(erlang:system_info(schedulers), + normal, + fun (_) -> + erlang:yield() + end, + ok), + ?line lists:foreach(fun (TP) -> + ?line unlink(TP), + ?line exit(TP, bang) + end, + TPs), + ?line lists:foreach(fun (TP) -> + ?line XScheds = count_exit_sched(TP), + ?line ?t:format("~p XScheds=~p~n", + [TP, XScheds]), + ?line true = XScheds >= 5 + end, + TPs), + ?line stop_loopers(LPs), + ?line ok. + + + +table_leak(doc) -> + "Make sure that slots for ets tables are cleared properly."; +table_leak(Config) when is_list(Config) -> + repeat_for_opts(fun(Opts) -> table_leak_1(Opts,20000) end). + +table_leak_1(_,0) -> ok; +table_leak_1(Opts,N) -> + ?line T = ets:new(fooflarf, Opts), + ?line true = ets:delete(T), + table_leak_1(Opts,N-1). + +baddelete(doc) -> + ["Check proper return values for illegal delete operations."]; +baddelete(suite) -> []; +baddelete(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line {'EXIT',{badarg,_}} = (catch ets:delete(foo)), + ?line Tab = ets:new(foo,[]), + ?line true = ets:delete(Tab), + ?line {'EXIT',{badarg,_}} = (catch ets:delete(Tab)), + ?line verify_etsmem(EtsMem). + +match_delete(doc) -> + ["Check that match_delete works. Also tests tab2list function."]; +match_delete(suite) -> []; +match_delete(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + repeat_for_opts(match_delete_do,[write_concurrency,all_types]), + ?line verify_etsmem(EtsMem). + +match_delete_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(kad,Opts), + ?line fill_tab(Tab,foo), + ?line ets:insert(Tab,{{c,key},bar}), + ?line _ = ets:match_delete(Tab,{'_',foo}), + ?line [{{c,key},bar}] = ets:tab2list(Tab), + ?line _ = ets:match_delete(Tab,'_'), + ?line [] = ets:tab2list(Tab), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +match_delete3(doc) -> + ["OTP-3005: check match_delete with constant argument."]; +match_delete3(suite) -> []; +match_delete3(Config) when is_list(Config) -> + repeat_for_opts(match_delete3_do). + +match_delete3_do(Opts) -> + ?line EtsMem = etsmem(), + T = make_table(test, + [duplicate_bag | Opts], + [{aa,17}, + {cA,1000}, + {cA,17}, + {cA,1000}, + {aa,17}]), + %% 'aa' and 'cA' have the same hash value in the current + %% implementation. This causes the aa's to precede the cA's, to make + %% the test more interesting. + [{cA,1000},{cA,1000}] = ets:match_object(T, {'_', 1000}), + ets:match_delete(T, {cA,1000}), + [] = ets:match_object(T, {'_', 1000}), + ets:delete(T), + ?line verify_etsmem(EtsMem). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +firstnext(doc) -> ["Tests ets:first/1 & ets:next/2."]; +firstnext(suite) -> []; +firstnext(Config) when is_list(Config) -> + repeat_for_opts(firstnext_do). + +firstnext_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foo,Opts), + ?line [] = firstnext_collect(Tab,ets:first(Tab),[]), + ?line fill_tab(Tab,foo), + ?line Len = length(ets:tab2list(Tab)), + ?line Len = length(firstnext_collect(Tab,ets:first(Tab),[])), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +firstnext_collect(_Tab,'$end_of_table',List) -> + ?line List; +firstnext_collect(Tab,Key,List) -> + ?line firstnext_collect(Tab,ets:next(Tab,Key),[Key|List]). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +firstnext_concurrent(doc) -> "Tests ets:first/1 & ets:next/2."; +firstnext_concurrent(Config) when is_list(Config) -> + register(master, self()), + ets_init(?MODULE, 20), + [dynamic_go() || _ <- lists:seq(1, 2)], + receive + after 5000 -> ok + end. + +ets_init(Tab, N) -> + ets:new(Tab, [named_table,public,ordered_set]), + cycle(Tab, lists:seq(1,N+1)). + +cycle(_Tab, [H|T]) when H > length(T)-> ok; +cycle(Tab, L) -> + ets:insert(Tab,list_to_tuple(L)), + cycle(Tab, tl(L)++[hd(L)]). + +dynamic_go() -> spawn_link(fun dynamic_init/0). + +dynamic_init() -> [dyn_lookup(?MODULE) || _ <- lists:seq(1, 10)]. + +dyn_lookup(T) -> dyn_lookup(T, ets:first(T)). + +dyn_lookup(_T, '$end_of_table') -> []; +dyn_lookup(T, K) -> + NextKey=ets:next(T,K), + case ets:next(T,K) of + NextKey -> + dyn_lookup(T, NextKey); + NK -> + io:fwrite("hmmm... ~p =/= ~p~n", [NextKey,NK]), + exit(failed) + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +slot(suite) -> []; +slot(Config) when is_list(Config) -> + repeat_for_opts(slot_do). + +slot_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foo,Opts), + ?line fill_tab(Tab,foo), + ?line Elts = ets:info(Tab,size), + ?line Elts = slot_loop(Tab,0,0), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +slot_loop(Tab,SlotNo,EltsSoFar) -> + ?line case ets:slot(Tab,SlotNo) of + '$end_of_table' -> + ?line {'EXIT',{badarg,_}} = + (catch ets:slot(Tab,SlotNo+1)), + ?line EltsSoFar; + Elts -> + ?line slot_loop(Tab,SlotNo+1,EltsSoFar+length(Elts)) + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +match(suite) -> [match1, match2, match_object, match_object2]. + +match1(suite) -> []; +match1(Config) when is_list(Config) -> + repeat_for_opts(match1_do). + +match1_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foo,Opts), + ?line fill_tab(Tab,foo), + ?line [] = ets:match(Tab,{}), + ?line ets:insert(Tab,{{one,4},4}), + ?line ets:insert(Tab,{{one,5},5}), + ?line ets:insert(Tab,{{two,4},4}), + ?line ets:insert(Tab,{{two,5},6}), + ?line case ets:match(Tab,{{one,'_'},'$0'}) of + [[4],[5]] -> ok; + [[5],[4]] -> ok + end, + ?line case ets:match(Tab,{{two,'$1'},'$0'}) of + [[4,4],[6,5]] -> ok; + [[6,5],[4,4]] -> ok + end, + ?line case ets:match(Tab,{{two,'$9'},'$4'}) of + [[4,4],[6,5]] -> ok; + [[6,5],[4,4]] -> ok + end, + ?line case ets:match(Tab,{{two,'$9'},'$22'}) of + [[4,4],[5,6]] -> ok; + [[5,6],[4,4]] -> ok + end, + ?line [[4]] = ets:match(Tab,{{two,'$0'},'$0'}), + ?line Len = length(ets:match(Tab,'$0')), + ?line Len = length(ets:match(Tab,'_')), + ?line if Len > 4 -> ok end, + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +match2(doc) -> ["Tests match with specified keypos bag table."]; +match2(suite) -> []; +match2(Config) when is_list(Config) -> + repeat_for_opts(match2_do). + +match2_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = make_table(foobar, + [bag, named_table, {keypos, 2} | Opts], + [{value1, key1}, + {value2_1, key2}, + {value2_2, key2}, + {value3_1, key3}, + {value3_2, key3}, + {value2_1, key2_wannabe}]), + ?line case length(ets:match(Tab, '$1')) of + 6 -> ok; + _ -> ?t:fail("Length of matched list is wrong.") + end, + ?line [[value3_1],[value3_2]] = ets:match(Tab, {'$1', key3}), + ?line [[key1]] = ets:match(Tab, {value1, '$1'}), + ?line [[key2_wannabe],[key2]] = ets:match(Tab, {value2_1, '$2'}), + ?line [] = ets:match(Tab,{'$1',nosuchkey}), + ?line [] = ets:match(Tab,{'$1',kgY2}), % same hash as key2 + ?line [] = ets:match(Tab,{nosuchvalue,'$1'}), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +match_object(doc) -> ["Some ets:match_object test."]; +match_object(suite) -> []; +match_object(Config) when is_list(Config) -> + repeat_for_opts(match_object_do). + +match_object_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foobar, Opts), + ?line fill_tab(Tab, foo), + ?line ets:insert(Tab, {{one, 4}, 4}), + ?line ets:insert(Tab,{{one,5},5}), + ?line ets:insert(Tab,{{two,4},4}), + ?line ets:insert(Tab,{{two,5},6}), + ?line case ets:match_object(Tab, {{one, '_'}, '$0'}) of + [{{one,5},5},{{one,4},4}] -> ok; + [{{one,4},4},{{one,5},5}] -> ok; + _ -> ?t:fail("ets:match_object() returned something funny.") + end, + ?line case ets:match_object(Tab, {{two, '$1'}, '$0'}) of + [{{two,5},6},{{two,4},4}] -> ok; + [{{two,4},4},{{two,5},6}] -> ok; + _ -> ?t:fail("ets:match_object() returned something funny.") + end, + ?line case ets:match_object(Tab, {{two, '$9'}, '$4'}) of + [{{two,5},6},{{two,4},4}] -> ok; + [{{two,4},4},{{two,5},6}] -> ok; + _ -> ?t:fail("ets:match_object() returned something funny.") + end, + ?line case ets:match_object(Tab, {{two, '$9'}, '$22'}) of + [{{two,5},6},{{two,4},4}] -> ok; + [{{two,4},4},{{two,5},6}] -> ok; + _ -> ?t:fail("ets:match_object() returned something funny.") + end, + % Check that unsucessful match returns an empty list. + ?line [] = ets:match_object(Tab, {{three,'$0'}, '$92'}), + % Check that '$0' equals '_'. + Len = length(ets:match_object(Tab, '$0')), + Len = length(ets:match_object(Tab, '_')), + ?line if Len > 4 -> ok end, + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +match_object2(suite) -> []; +match_object2(doc) -> ["Tests that db_match_object does not generate " + "a `badarg' when resuming a search with no " + "previous matches."]; +match_object2(Config) when is_list(Config) -> + repeat_for_opts(match_object2_do). + +match_object2_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foo, [bag, {keypos, 2} | Opts]), + ?line fill_tab2(Tab, 0, 13005), % match_db_object does 1000 + % elements per pass, might + % change in the future. + ?line case catch ets:match_object(Tab, {hej, '$1'}) of + {'EXIT', _} -> + ets:delete(Tab), + ?t:fail("match_object EXIT:ed"); + [] -> + io:format("Nothing matched."); + List -> + io:format("Matched:~p~n",[List]) + end, + ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +misc(suite) -> [misc1, safe_fixtable, info, dups, tab2list]. + +tab2list(doc) -> ["Tests tab2list (OTP-3319)"]; +tab2list(suite) -> []; +tab2list(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line Tab = make_table(foo, + [ordered_set], + [{a,b}, {c,b}, {b,b}, {a,c}]), + ?line [{a,c},{b,b},{c,b}] = ets:tab2list(Tab), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +misc1(doc) -> ["Simple general small test. ", + "If this fails, ets is in really bad shape."]; +misc1(suite) -> []; +misc1(Config) when is_list(Config) -> + repeat_for_opts(misc1_do). + +misc1_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foo,Opts), + ?line true = lists:member(Tab,ets:all()), + ?line ets:delete(Tab), + ?line false = lists:member(Tab,ets:all()), + ?line case catch ets:delete(Tab) of + {'EXIT',_Reason} -> + ?line verify_etsmem(EtsMem); + true -> + ?t:fail("Delete of nonexisting table returned `true'.") + end, + ok. + +safe_fixtable(doc) -> ["Check the safe_fixtable function."]; +safe_fixtable(suite) -> []; +safe_fixtable(Config) when is_list(Config) -> + repeat_for_opts(safe_fixtable_do). + +safe_fixtable_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foo, Opts), + ?line fill_tab(Tab, foobar), + ?line true = ets:safe_fixtable(Tab, true), + ?line receive after 1 -> ok end, + ?line true = ets:safe_fixtable(Tab, false), + ?line false = ets:info(Tab,safe_fixed), + ?line true = ets:safe_fixtable(Tab, true), + Self = self(), + ?line {{_,_,_},[{Self,1}]} = ets:info(Tab,safe_fixed), + %% Test that an unjustified 'unfix' is a no-op. + {Pid,MRef} = spawn_monitor(fun() -> true = ets:safe_fixtable(Tab,false) end), + {'DOWN', MRef, process, Pid, normal} = receive M -> M end, + ?line true = ets:info(Tab,fixed), + ?line {{_,_,_},[{Self,1}]} = ets:info(Tab,safe_fixed), + %% badarg's + ?line {'EXIT', {badarg, _}} = (catch ets:safe_fixtable(Tab, foobar)), + ?line true = ets:info(Tab,fixed), + ?line true = ets:safe_fixtable(Tab, false), + ?line false = ets:info(Tab,fixed), + ?line {'EXIT', {badarg, _}} = (catch ets:safe_fixtable(Tab, foobar)), + ?line false = ets:info(Tab,fixed), + ?line ets:delete(Tab), + ?line case catch ets:safe_fixtable(Tab, true) of + {'EXIT', _Reason} -> + ?line verify_etsmem(EtsMem); + _ -> + ?t:fail("Fixtable on nonexisting table returned `true'") + end, + ok. + +info(doc) -> ["Tests ets:info result for required tuples."]; +info(suite) -> []; +info(Config) when is_list(Config) -> + repeat_for_opts(info_do). + +info_do(Opts) -> + ?line EtsMem = etsmem(), + ?line MeMyselfI=self(), + ?line ThisNode=node(), + ?line Tab = ets:new(foobar, [{keypos, 2} | Opts]), + + %% Note: ets:info/1 used to return a tuple, but from R11B onwards it + %% returns a list. + ?line Res = ets:info(Tab), + ?line {value, {memory, _Mem}} = lists:keysearch(memory, 1, Res), + ?line {value, {owner, MeMyselfI}} = lists:keysearch(owner, 1, Res), + ?line {value, {name, foobar}} = lists:keysearch(name, 1, Res), + ?line {value, {size, 0}} = lists:keysearch(size, 1, Res), + ?line {value, {node, ThisNode}} = lists:keysearch(node, 1, Res), + ?line {value, {named_table, false}} = lists:keysearch(named_table, 1, Res), + ?line {value, {type, set}} = lists:keysearch(type, 1, Res), + ?line {value, {keypos, 2}} = lists:keysearch(keypos, 1, Res), + ?line {value, {protection, protected}} = + lists:keysearch(protection, 1, Res), + ?line true = ets:delete(Tab), + ?line undefined = ets:info(non_existing_table_xxyy), + ?line undefined = ets:info(non_existing_table_xxyy,type), + ?line undefined = ets:info(non_existing_table_xxyy,node), + ?line undefined = ets:info(non_existing_table_xxyy,named_table), + ?line undefined = ets:info(non_existing_table_xxyy,safe_fixed), + ?line verify_etsmem(EtsMem). + +dups(doc) -> ["Test various duplicate_bags stuff"]; +dups(suite) -> []; +dups(Config) when is_list(Config) -> + repeat_for_opts(dups_do). + +dups_do(Opts) -> + ?line EtsMem = etsmem(), + ?line T = make_table(funky, + [duplicate_bag | Opts], + [{1, 2}, {1, 2}]), + ?line 2 = length(ets:tab2list(T)), + ?line ets:delete(T, 1), + ?line [] = ets:lookup(T, 1), + + ?line ets:insert(T, {1, 2, 2}), + ?line ets:insert(T, {1, 2, 4}), + ?line ets:insert(T, {1, 2, 2}), + ?line ets:insert(T, {1, 2, 2}), + ?line ets:insert(T, {1, 2, 4}), + + ?line 5 = length(ets:tab2list(T)), + + ?line 5 = length(ets:match(T, {'$1', 2, '$2'})), + ?line 3 = length(ets:match(T, {'_', '$1', '$1'})), + ?line ets:match_delete(T, {'_', '$1', '$1'}), + ?line 0 = length(ets:match(T, {'_', '$1', '$1'})), + ?line ets:delete(T), + ?line verify_etsmem(EtsMem). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +files(suite) -> [tab2file, tab2file2, tab2file3, tabfile_ext1, tabfile_ext2, + tabfile_ext3, tabfile_ext4]. + +tab2file(doc) -> ["Check the ets:tab2file function on an empty " + "ets table."]; +tab2file(suite) -> []; +tab2file(Config) when is_list(Config) -> + %% Write an empty ets table to a file, read back and check properties. + ?line Tab = ets:new(ets_SUITE_foo_tab, [named_table, set, private, + {keypos, 2}]), + ?line FName = filename:join([?config(priv_dir, Config),"tab2file_case"]), + ?line ok = ets:tab2file(Tab, FName), + ?line true = ets:delete(Tab), + % + ?line EtsMem = etsmem(), + ?line {ok, Tab2} = ets:file2tab(FName), + ?line private = ets:info(Tab2, protection), + ?line true = ets:info(Tab2, named_table), + ?line 2 = ets:info(Tab2, keypos), + ?line set = ets:info(Tab2, type), + ?line true = ets:delete(Tab2), + ?line verify_etsmem(EtsMem). + +tab2file2(doc) -> ["Check the ets:tab2file function on a ", + "filled set type ets table."]; +tab2file2(suite) -> []; +tab2file2(Config) when is_list(Config) -> + %% Try the same on a filled set table. + ?line EtsMem = etsmem(), + ?line Tab = ets:new(ets_SUITE_foo_tab, [named_table, set, private, + {keypos, 2}]), + ?line FName = filename:join([?config(priv_dir, Config),"tab2file2_case"]), + ?line ok = fill_tab2(Tab, 0, 10000), % Fill up the table (grucho mucho!) + ?line Len = length(ets:tab2list(Tab)), + ?line ok = ets:tab2file(Tab, FName), + ?line true = ets:delete(Tab), + % + ?line {ok, Tab2} = ets:file2tab(FName), + ?line private = ets:info(Tab2, protection), + ?line true = ets:info(Tab2, named_table), + ?line 2 = ets:info(Tab2, keypos), + ?line set = ets:info(Tab2, type), + ?line Len = length(ets:tab2list(Tab2)), + ?line true = ets:delete(Tab2), + ?line verify_etsmem(EtsMem). + +tab2file3(doc) -> ["Check the ets:tab2file function on a ", + "filled bag type ets table."]; +tab2file3(suite) -> []; +tab2file3(Config) when is_list(Config) -> + %% Try the same on a filled bag table. + ?line EtsMem = etsmem(), + ?line Tab = ets:new(ets_SUITE_foo_tab, [named_table, bag, private, + {keypos, 2}]), + ?line FName = filename:join([?config(priv_dir, Config),"tab2file3_case"]), + ?line ok = fill_tab2(Tab, 0, 10000), % Fill up the table (grucho mucho!) + ?line Len = length(ets:tab2list(Tab)), + ?line Mem = ets:info(Tab, memory), + ?line ok = ets:tab2file(Tab, FName), + ?line true = ets:delete(Tab), + + ?line {ok, Tab2} = ets:file2tab(FName), + ?line private = ets:info(Tab2, protection), + ?line true = ets:info(Tab2, named_table), + ?line 2 = ets:info(Tab2, keypos), + ?line bag = ets:info(Tab2, type), + ?line Len = length(ets:tab2list(Tab2)), + ?line Mem = ets:info(Tab2, memory), + ?line true = ets:delete(Tab2), + ?line verify_etsmem(EtsMem). + +-define(test_list, [8,5,4,1,58,125,255, 250, 245, 240, 235, + 230, Num rem 255, 255, 125, 130, 135, 140, 145, + 150, 134, 12, 54, Val rem 255, 12, 3, 6, 9, 126]). +-define(big_test_list, [Num rem 256|lists:seq(1, 66)]). +-define(test_integer, 2846287468+Num). +-define(test_float, 187263.18236-Val). +-define(test_atom, some_crazy_atom). +-define(test_tuple, {just, 'Some', 'Tuple', 1, [list, item], Val+Num}). + +%% Insert different datatypes into a ets table. +fill_tab2(_Tab, _Val, 0) -> + ok; +fill_tab2(Tab, Val, Num) -> + ?line Item = + case Num rem 10 of + 0 -> "String"; + 1 -> ?line ?test_atom; + 2 -> ?line ?test_tuple; + 3 -> ?line ?test_integer; + 4 -> ?line ?test_float; + 5 -> ?line list_to_binary(?test_list); %Heap binary + 6 -> ?line list_to_binary(?big_test_list); %Refc binary + 7 -> ?line make_sub_binary(?test_list, Num); %Sub binary + 8 -> ?line ?test_list; + 9 -> ?line fun(X) -> {Tab,Val,X*Num} end + end, + ?line true=ets:insert(Tab, {Item, Val}), + ?line fill_tab2(Tab, Val+1, Num-1), + ok. + +tabfile_ext1(suite) -> + []; +tabfile_ext1(doc) -> + ["Tests verification of tables with object count extended_info"]; +tabfile_ext1(Config) when is_list(Config) -> + repeat_for_opts(fun(Opts) -> tabfile_ext1_do(Opts, Config) end). + +tabfile_ext1_do(Opts,Config) -> + ?line FName = filename:join([?config(priv_dir, Config),"nisse.dat"]), + ?line FName2 = filename:join([?config(priv_dir, Config),"countflip.dat"]), + L = lists:seq(1,10), + T = ets:new(x,Opts), + Name = make_ref(), + [ets:insert(T,{X,integer_to_list(X)}) || X <- L], + ok = ets:tab2file(T,FName,[{extended_info,[object_count]}]), + true = lists:sort(ets:tab2list(T)) =:= + lists:sort(ets:tab2list(element(2,ets:file2tab(FName)))), + true = lists:sort(ets:tab2list(T)) =:= + lists:sort(ets:tab2list( + element(2,ets:file2tab(FName,[{verify,true}])))), + {ok,Name} = disk_log:open([{name,Name},{file,FName}]), + {_,[H0|T0]} = disk_log:chunk(Name,start), + disk_log:close(Name), + LH0=tuple_to_list(H0), + {value,{size,N}}=lists:keysearch(size,1,LH0), + NewLH0 = lists:keyreplace(size,1,LH0,{size,N-1}), + NewH0 = list_to_tuple(NewLH0), + NewT0=lists:keydelete(8,1,T0), + file:delete(FName2), + disk_log:open([{name,Name},{file,FName2},{mode,read_write}]), + disk_log:log_terms(Name,[NewH0|NewT0]), + disk_log:close(Name), + 9 = length(ets:tab2list(element(2,ets:file2tab(FName2)))), + {error,invalid_object_count} = ets:file2tab(FName2,[{verify,true}]), + {ok, _} = ets:tabfile_info(FName2), + {ok, _} = ets:tabfile_info(FName), + file:delete(FName), + file:delete(FName2), + ok. + +tabfile_ext2(suite) -> + []; +tabfile_ext2(doc) -> + ["Tests verification of tables with md5sum extended_info"]; +tabfile_ext2(Config) when is_list(Config) -> + repeat_for_opts(fun(Opts) -> tabfile_ext2_do(Opts,Config) end). + +tabfile_ext2_do(Opts,Config) -> + ?line FName = filename:join([?config(priv_dir, Config),"olle.dat"]), + ?line FName2 = filename:join([?config(priv_dir, Config),"bitflip.dat"]), + L = lists:seq(1,10), + T = ets:new(x,Opts), + Name = make_ref(), + [ets:insert(T,{X,integer_to_list(X)}) || X <- L], + ok = ets:tab2file(T,FName,[{extended_info,[md5sum]}]), + true = lists:sort(ets:tab2list(T)) =:= + lists:sort(ets:tab2list(element(2,ets:file2tab(FName)))), + true = lists:sort(ets:tab2list(T)) =:= + lists:sort(ets:tab2list( + element(2,ets:file2tab(FName,[{verify,true}])))), + {ok, Name} = disk_log:open([{name,Name},{file,FName}]), + {_,[H1|T1]} = disk_log:chunk(Name,start), + disk_log:close(Name), + NewT1=lists:keyreplace(8,1,T1,{8,"9"}), + file:delete(FName2), + disk_log:open([{name,Name},{file,FName2},{mode,read_write}]), + disk_log:log_terms(Name,[H1|NewT1]), + disk_log:close(Name), + {value,{8,"9"}} = lists:keysearch(8,1, + ets:tab2list( + element(2,ets:file2tab(FName2)))), + {error,checksum_error} = ets:file2tab(FName2,[{verify,true}]), + {value,{extended_info,[md5sum]}} = + lists:keysearch(extended_info,1,element(2,ets:tabfile_info(FName2))), + {value,{extended_info,[md5sum]}} = + lists:keysearch(extended_info,1,element(2,ets:tabfile_info(FName))), + file:delete(FName), + file:delete(FName2), + ok. + +tabfile_ext3(suite) -> + []; +tabfile_ext3(doc) -> + ["Tests verification of (named) tables without extended info"]; +tabfile_ext3(Config) when is_list(Config) -> + ?line FName = filename:join([?config(priv_dir, Config),"namn.dat"]), + ?line FName2 = filename:join([?config(priv_dir, Config),"ncountflip.dat"]), + L = lists:seq(1,10), + Name = make_ref(), + ?MODULE = ets:new(?MODULE,[named_table]), + [ets:insert(?MODULE,{X,integer_to_list(X)}) || X <- L], + ets:tab2file(?MODULE,FName), + {error,cannot_create_table} = ets:file2tab(FName), + true = ets:delete(?MODULE), + {ok,?MODULE} = ets:file2tab(FName), + true = ets:delete(?MODULE), + disk_log:open([{name,Name},{file,FName}]), + {_,[H2|T2]} = disk_log:chunk(Name,start), + disk_log:close(Name), + NewT2=lists:keydelete(8,1,T2), + file:delete(FName2), + disk_log:open([{name,Name},{file,FName2},{mode,read_write}]), + disk_log:log_terms(Name,[H2|NewT2]), + disk_log:close(Name), + 9 = length(ets:tab2list(element(2,ets:file2tab(FName2)))), + true = ets:delete(?MODULE), + {error,invalid_object_count} = ets:file2tab(FName2,[{verify,true}]), + {'EXIT',_} = (catch ets:delete(?MODULE)), + {ok,_} = ets:tabfile_info(FName2), + {ok,_} = ets:tabfile_info(FName), + file:delete(FName), + file:delete(FName2), + ok. + +tabfile_ext4(suite) -> + []; +tabfile_ext4(doc) -> + ["Tests verification of large table with md5 sum"]; +tabfile_ext4(Config) when is_list(Config) -> + ?line FName = filename:join([?config(priv_dir, Config),"bauta.dat"]), + LL = lists:seq(1,10000), + TL = ets:new(x,[]), + Name2 = make_ref(), + [ets:insert(TL,{X,integer_to_list(X)}) || X <- LL], + ok = ets:tab2file(TL,FName,[{extended_info,[md5sum]}]), + {ok, Name2} = disk_log:open([{name, Name2}, {file, FName}, + {mode, read_only}]), + {C,[_|_]} = disk_log:chunk(Name2,start), + {_,[_|_]} = disk_log:chunk(Name2,C), + disk_log:close(Name2), + true = lists:sort(ets:tab2list(TL)) =:= + lists:sort(ets:tab2list(element(2,ets:file2tab(FName)))), + Res = [ + begin + {ok,FD} = file:open(FName,[binary,read,write]), + {ok, Bin} = file:pread(FD,0,1000), + <> = Bin, + Ch2 = (Ch + 1) rem 255, + Bin2 = <>, + ok = file:pwrite(FD,0,Bin2), + ok = file:close(FD), + X = case ets:file2tab(FName) of + {ok,TL2} -> + true = lists:sort(ets:tab2list(TL)) =/= + lists:sort(ets:tab2list(TL2)); + _ -> + totally_broken + end, + {error,Y} = ets:file2tab(FName,[{verify,true}]), + ets:tab2file(TL,FName,[{extended_info,[md5sum]}]), + {X,Y} + end || N <- lists:seq(400,500) ], + io:format("~p~n",[Res]), + file:delete(FName), + ok. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +make_sub_binary(List, Num) when is_list(List) -> + N = Num rem 23, + Bin = list_to_binary([lists:seq(0, N)|List]), + {_,B} = split_binary(Bin, N+1), + B. + +heavy(suite) -> [heavy_lookup, heavy_lookup_element]. + +%% Lookup stuff like crazy... +heavy_lookup(doc) -> ["Performs multiple lookups for every key ", + "in a large table."]; +heavy_lookup(suite) -> []; +heavy_lookup(Config) when is_list(Config) -> + repeat_for_opts(heavy_lookup_do). + +heavy_lookup_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foobar_table, [set, protected, {keypos, 2} | Opts]), + ?line ok = fill_tab2(Tab, 0, 7000), + ?line ?t:do_times(50, ?MODULE, do_lookup, [Tab, 6999]), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +do_lookup(_Tab, 0) -> ok; +do_lookup(Tab, N) -> + case ets:lookup(Tab, N) of + [] -> ?t:format("Set #~p was reported as empty. Not valid.", + [N]), + exit('Invalid lookup'); + _ -> do_lookup(Tab, N-1) + end. + +heavy_lookup_element(doc) -> ["Performs multiple lookups for ", + "every element in a large table."]; +heavy_lookup_element(suite) -> []; +heavy_lookup_element(Config) when is_list(Config) -> + repeat_for_opts(heavy_lookup_element_do). + +heavy_lookup_element_do(Opts) -> + ?line EtsMem = etsmem(), + ?line Tab = ets:new(foobar_table, [set, protected, {keypos, 2} | Opts]), + ?line ok = fill_tab2(Tab, 0, 7000), + case os:type() of + vxworks -> + ?line ?t:do_times(5, ?MODULE, do_lookup_element, + [Tab, 6999, 1]); + % lookup ALL elements 5 times. + _ -> + ?line ?t:do_times(50, ?MODULE, do_lookup_element, + [Tab, 6999, 1]) + % lookup ALL elements 50 times. + end, + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +do_lookup_element(_Tab, 0, _) -> ok; +do_lookup_element(Tab, N, M) -> + ?line case catch ets:lookup_element(Tab, N, M) of + {'EXIT', {badarg, _}} -> + case M of + 1 -> ?t:fail("Set #~p reported as empty. Not valid.", + [N]), + exit('Invalid lookup_element'); + _ -> ?line do_lookup_element(Tab, N-1, 1) + end; + _ -> ?line do_lookup_element(Tab, N, M+1) + end. + + +fold(suite) -> [foldl_ordered, foldr_ordered, + foldl, foldr, + fold_empty]. + +fold_empty(doc) -> + []; +fold_empty(suite) -> []; +fold_empty(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line Tab = make_table(a, [], []), + ?line [] = ets:foldl(fun(_X) -> exit(hej) end, [], Tab), + ?line [] = ets:foldr(fun(_X) -> exit(hej) end, [], Tab), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +foldl(doc) -> + []; +foldl(suite) -> []; +foldl(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line L = [{a,1}, {c,3}, {b,2}], + ?line LS = lists:sort(L), + ?line Tab = make_table(a, [bag], L), + ?line LS = lists:sort(ets:foldl(fun(E,A) -> [E|A] end, [], Tab)), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +foldr(doc) -> + []; +foldr(suite) -> []; +foldr(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line L = [{a,1}, {c,3}, {b,2}], + ?line LS = lists:sort(L), + ?line Tab = make_table(a, [bag], L), + ?line LS = lists:sort(ets:foldr(fun(E,A) -> [E|A] end, [], Tab)), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +foldl_ordered(doc) -> + []; +foldl_ordered(suite) -> []; +foldl_ordered(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line L = [{a,1}, {c,3}, {b,2}], + ?line LS = lists:sort(L), + ?line Tab = make_table(a, [ordered_set], L), + ?line LS = lists:reverse(ets:foldl(fun(E,A) -> [E|A] end, [], Tab)), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +foldr_ordered(doc) -> + []; +foldr_ordered(suite) -> []; +foldr_ordered(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line L = [{a,1}, {c,3}, {b,2}], + ?line LS = lists:sort(L), + ?line Tab = make_table(a, [ordered_set], L), + ?line LS = ets:foldr(fun(E,A) -> [E|A] end, [], Tab), + ?line true = ets:delete(Tab), + ?line verify_etsmem(EtsMem). + +member(suite) -> + []; +member(doc) -> + ["Tests ets:member BIF"]; +member(Config) when is_list(Config) -> + repeat_for_opts(member_do, [write_concurrency, all_types]). + +member_do(Opts) -> + ?line EtsMem = etsmem(), + ?line T = ets:new(xxx, Opts), + ?line false = ets:member(T,hej), + ?line E = fun(0,_F)->ok; + (N,F) -> + ?line ets:insert(T,{N,N rem 10}), + F(N-1,F) + end, + ?line E(10000,E), + ?line false = ets:member(T,hej), + ?line true = ets:member(T,1), + ?line false = ets:member(T,20000), + ?line ets:delete(T,5), + ?line false = ets:member(T,5), + ?line ets:safe_fixtable(T,true), + ?line ets:delete(T,6), + ?line false = ets:member(T,6), + ?line ets:safe_fixtable(T,false), + ?line false = ets:member(T,6), + ?line ets:delete(T), + ?line {'EXIT',{badarg,_}} = (catch ets:member(finnsinte, 23)), + ?line {'EXIT',{badarg,_}} = (catch ets:member(T, 23)), + ?line verify_etsmem(EtsMem). + + +build_table(L1,L2,Num) -> + T = ets:new(xxx, [ordered_set] + ), + lists:foreach( + fun(X1) -> + lists:foreach( + fun(X2) -> + F = fun(FF,N) -> + ets:insert(T,{{X1,X2,N}, + X1, X2, N}), + case N of + 0 -> + ok; + _ -> + FF(FF,N-1) + end + end, + F(F,Num) + end, L2) + end, L1), + T. + +build_table2(L1,L2,Num) -> + T = ets:new(xxx, [ordered_set] + ), + lists:foreach( + fun(X1) -> + lists:foreach( + fun(X2) -> + F = fun(FF,N) -> + ets:insert(T,{{N,X1,X2}, + N, X1, X2}), + case N of + 0 -> + ok; + _ -> + FF(FF,N-1) + end + end, + F(F,Num) + end, L2) + end, L1), + T. + +time_match_object(Tab,Match, Res) -> + T1 = erlang:now(), + Res = ets:match_object(Tab,Match), + T2 = erlang:now(), + nowdiff(T1,T2). + +time_match(Tab,Match) -> + T1 = erlang:now(), + ets:match(Tab,Match), + T2 = erlang:now(), + nowdiff(T1,T2). + +seventyfive_percent_success(_,S,Fa,0) -> + true = (S > ((S + Fa) * 0.75)); + +seventyfive_percent_success({M,F,A},S,Fa,N) -> + case (catch apply(M,F,A)) of + {'EXIT', _} -> + seventyfive_percent_success({M,F,A},S,Fa+1,N-1); + _ -> + seventyfive_percent_success({M,F,A},S+1,Fa,N-1) + end. + +fifty_percent_success(_,S,Fa,0) -> + true = (S > ((S + Fa) * 0.5)); + +fifty_percent_success({M,F,A},S,Fa,N) -> + case (catch apply(M,F,A)) of + {'EXIT', _} -> + fifty_percent_success({M,F,A},S,Fa+1,N-1); + _ -> + fifty_percent_success({M,F,A},S+1,Fa,N-1) + end. + + +nowtonumber({Mega, Secs, Milli}) -> + Milli + Secs * 1000000 + Mega * 1000000000000. +nowdiff(T1,T2) -> + nowtonumber(T2) - nowtonumber(T1). + +create_random_string(0) -> + []; + +create_random_string(OfLength) -> + C = case random:uniform(2) of + 1 -> + (random:uniform($Z - $A + 1) - 1) + $A; + _ -> + (random:uniform($z - $a + 1) - 1) + $a + end, + [C | create_random_string(OfLength - 1)]. + + +create_random_tuple(OfLength) -> + list_to_tuple(lists:map(fun(X) -> + list_to_atom([X]) + end,create_random_string(OfLength))). + +create_partly_bound_tuple(OfLength) -> + case random:uniform(2) of + 1 -> + create_partly_bound_tuple1(OfLength); + _ -> + create_partly_bound_tuple3(OfLength) + end. + +create_partly_bound_tuple1(OfLength) -> + T0 = create_random_tuple(OfLength), + I = random:uniform(OfLength), + setelement(I,T0,'$1'). + + +set_n_random_elements(T0,0,_,_) -> + T0; +set_n_random_elements(T0,N,OfLength,GenFun) -> + I = random:uniform(OfLength), + What = GenFun(I), + case element(I,T0) of + What -> + set_n_random_elements(T0,N,OfLength,GenFun); + _Else -> + set_n_random_elements(setelement(I,T0,What), + N-1,OfLength,GenFun) + end. + +make_dollar_atom(I) -> + list_to_atom([$$] ++ integer_to_list(I)). +create_partly_bound_tuple2(OfLength) -> + T0 = create_random_tuple(OfLength), + I = random:uniform(OfLength - 1), + set_n_random_elements(T0,I,OfLength,fun make_dollar_atom/1). + +create_partly_bound_tuple3(OfLength) -> + T0 = create_random_tuple(OfLength), + I = random:uniform(OfLength - 1), + set_n_random_elements(T0,I,OfLength,fun(_) -> '_' end). + +do_n_times(_,0) -> + ok; +do_n_times(Fun,N) -> + Fun(), + case N rem 1000 of + 0 -> + io:format("."); + _ -> + ok + end, + do_n_times(Fun,N-1). + +make_table(Name, Options, Elements) -> + T = ets:new(Name, Options), + lists:foreach(fun(E) -> ets:insert(T, E) end, Elements), + T. +filltabint(Tab,0) -> + Tab; +filltabint(Tab,N) -> + ets:insert(Tab,{N,integer_to_list(N)}), + filltabint(Tab,N-1). +filltabint2(Tab,0) -> + Tab; +filltabint2(Tab,N) -> + ets:insert(Tab,{N + N rem 2,integer_to_list(N)}), + filltabint2(Tab,N-1). +filltabint3(Tab,0) -> + Tab; +filltabint3(Tab,N) -> + ets:insert(Tab,{N + N rem 2,integer_to_list(N + N rem 2)}), + filltabint3(Tab,N-1). +xfilltabint(Tab,N) -> + case ets:info(Tab,type) of + bag -> + filltabint2(Tab,N); + duplicate_bag -> + ets:select_delete(Tab,[{'_',[],[true]}]), + filltabint3(Tab,N); + _ -> + filltabint(Tab,N) + end. + + +filltabstr(Tab,N) -> + filltabstr(Tab,0,N). +filltabstr(Tab,N,N) -> + Tab; +filltabstr(Tab,Floor,N) when N > Floor -> + ets:insert(Tab,{integer_to_list(N),N}), + filltabstr(Tab,Floor,N-1). + +filltabstr2(Tab,0) -> + Tab; +filltabstr2(Tab,N) -> + ets:insert(Tab,{integer_to_list(N),N}), + ets:insert(Tab,{integer_to_list(N),N+1}), + filltabstr2(Tab,N-1). +filltabstr3(Tab,0) -> + Tab; +filltabstr3(Tab,N) -> + ets:insert(Tab,{integer_to_list(N),N}), + ets:insert(Tab,{integer_to_list(N),N}), + filltabstr3(Tab,N-1). +xfilltabstr(Tab,N) -> + case ets:info(Tab,type) of + bag -> + filltabstr2(Tab,N); + duplicate_bag -> + ets:select_delete(Tab,[{'_',[],[true]}]), + filltabstr3(Tab,N); + _ -> + filltabstr(Tab,N) + end. + +fill_sets_int(N) -> + fill_sets_int(N,[]). +fill_sets_int(N,Opts) -> + Tab1 = ets:new(xxx, [ordered_set|Opts]), + filltabint(Tab1,N), + Tab2 = ets:new(xxx, [set|Opts]), + filltabint(Tab2,N), + Tab3 = ets:new(xxx, [bag|Opts]), + filltabint2(Tab3,N), + Tab4 = ets:new(xxx, [duplicate_bag|Opts]), + filltabint3(Tab4,N), + [Tab1,Tab2,Tab3,Tab4]. + +check_fun(_Tab,_Fun,'$end_of_table') -> + ok; +check_fun(Tab,Fun,Item) -> + lists:foreach(fun(Obj) -> + true = Fun(Obj) + end, + ets:lookup(Tab,Item)), + check_fun(Tab,Fun,ets:next(Tab,Item)). + +check(Tab,Fun,N) -> + N = ets:info(Tab, size), + check_fun(Tab,Fun,ets:first(Tab)). + + + +del_one_by_one_set(T,N,N) -> + 0 = ets:info(T,size), + ok; +del_one_by_one_set(T,From,To) -> + N = ets:info(T,size), + ets:delete_object(T,{From, integer_to_list(From)}), + N = (ets:info(T,size) + 1), + Next = if + From < To -> + From + 1; + true -> + From - 1 + end, + del_one_by_one_set(T,Next,To). + +del_one_by_one_bag(T,N,N) -> + 0 = ets:info(T,size), + ok; +del_one_by_one_bag(T,From,To) -> + N = ets:info(T,size), + ets:delete_object(T,{From + From rem 2, integer_to_list(From)}), + N = (ets:info(T,size) + 1), + Next = if + From < To -> + From + 1; + true -> + From - 1 + end, + del_one_by_one_bag(T,Next,To). + + +del_one_by_one_dbag_1(T,N,N) -> + 0 = ets:info(T,size), + ok; +del_one_by_one_dbag_1(T,From,To) -> + N = ets:info(T,size), + ets:delete_object(T,{From, integer_to_list(From)}), + case From rem 2 of + 0 -> + N = (ets:info(T,size) + 2); + 1 -> + N = ets:info(T,size) + end, + Next = if + From < To -> + From + 1; + true -> + From - 1 + end, + del_one_by_one_dbag_1(T,Next,To). + +del_one_by_one_dbag_2(T,N,N) -> + 0 = ets:info(T,size), + ok; +del_one_by_one_dbag_2(T,From,To) -> + N = ets:info(T,size), + ets:delete_object(T,{From, integer_to_list(From)}), + case From rem 2 of + 0 -> + N = (ets:info(T,size) + 3); + 1 -> + N = (ets:info(T,size) + 1) + end, + Next = if + From < To -> + From + 1; + true -> + From - 1 + end, + del_one_by_one_dbag_2(T,Next,To). + +del_one_by_one_dbag_3(T,N,N) -> + 0 = ets:info(T,size), + ok; +del_one_by_one_dbag_3(T,From,To) -> + N = ets:info(T,size), + Obj = {From + From rem 2, integer_to_list(From)}, + ets:delete_object(T,Obj), + case From rem 2 of + 0 -> + N = (ets:info(T,size) + 2); + 1 -> + N = (ets:info(T,size) + 1), + Obj2 = {From, integer_to_list(From)}, + ets:delete_object(T,Obj2), + N = (ets:info(T,size) + 2) + end, + Next = if + From < To -> + From + 1; + true -> + From - 1 + end, + del_one_by_one_dbag_3(T,Next,To). + + +successive_delete(Table,From,To,Type) -> + successive_delete(Table,From,To,Type,ets:info(Table,type)). + +successive_delete(_Table,N,N,_,_) -> + ok; +successive_delete(Table,From,To,Type,TType) -> + MS = case Type of + bound -> + [{{From,'_'},[],[true]}]; + unbound -> + [{{'$1','_'},[],[{'==', '$1', From}]}] + end, + case TType of + X when X == bag; X == duplicate_bag -> + %erlang:display(From), + case From rem 2 of + 0 -> + 2 = ets:select_delete(Table,MS); + _ -> + 0 = ets:select_delete(Table,MS) + end; + _ -> + 1 = ets:select_delete(Table,MS) + end, + Next = if + From < To -> + From + 1; + true -> + From - 1 + end, + successive_delete(Table, Next, To, Type,TType). + +gen_dets_filename(Config,N) -> + filename:join(?config(priv_dir,Config), + "testdets_" ++ integer_to_list(N) ++ ".dets"). + +otp_6842_select_1000(Config) when is_list(Config) -> + ?line Tab = ets:new(xxx,[ordered_set]), + ?line [ets:insert(Tab,{X,X}) || X <- lists:seq(1,10000)], + ?line AllTrue = lists:duplicate(10,true), + ?line AllTrue = + [ length( + element(1, + ets:select(Tab,[{'_',[],['$_']}],X*1000))) =:= + X*1000 || X <- lists:seq(1,10) ], + ?line Sequences = [[1000,1000,1000,1000,1000,1000,1000,1000,1000,1000], + [2000,2000,2000,2000,2000], + [3000,3000,3000,1000], + [4000,4000,2000], + [5000,5000], + [6000,4000], + [7000,3000], + [8000,2000], + [9000,1000], + [10000]], + ?line AllTrue = [ check_seq(Tab, ets:select(Tab,[{'_',[],['$_']}],hd(L)),L) || + L <- Sequences ], + ?line ets:delete(Tab), + ok. + +check_seq(_,'$end_of_table',[]) -> + true; +check_seq(Tab,{L,C},[H|T]) when length(L) =:= H -> + check_seq(Tab, ets:select(C),T); +check_seq(A,B,C) -> + erlang:display({A,B,C}), + false. + +otp_6338(Config) when is_list(Config) -> + L = binary_to_term(<<131,108,0,0,0,2,104,2,108,0,0,0,2,103,100,0,19,112,112,98,49,95,98,115,49,50,64,98,108,97,100,101,95,48,95,53,0,0,33,50,0,0,0,4,1,98,0,0,23,226,106,100,0,4,101,120,105,116,104,2,108,0,0,0,2,104,2,100,0,3,115,98,109,100,0,19,112,112,98,50,95,98,115,49,50,64,98,108,97,100,101,95,48,95,56,98,0,0,18,231,106,100,0,4,114,101,99,118,106>>), + T = ets:new(xxx,[ordered_set]), + lists:foreach(fun(X) -> ets:insert(T,X) end,L), + [[4839,recv]] = ets:match(T,{[{sbm,ppb2_bs12@blade_0_8},'$1'],'$2'}), + ets:delete(T). + +%% Elements could come in the wrong order in a bag if a rehash occurred. +otp_5340(Config) when is_list(Config) -> + repeat_for_opts(otp_5340_do). + +otp_5340_do(Opts) -> + N = 3000, + T = ets:new(otp_5340, [bag,public | Opts]), + Ids = [1,2,3,4,5], + [w(T, N, Id) || Id <- Ids], + verify(T, Ids), + ets:delete(T). + +w(_,0, _) -> ok; +w(T,N, Id) -> + ets:insert(T, {N, Id}), + w(T,N-1,Id). + +verify(T, Ids) -> + List = my_tab_to_list(T), + Errors = lists:filter(fun(Bucket) -> + verify2(Bucket, Ids) + end, List), + case Errors of + [] -> + ok; + _ -> + io:format("Failed:\n~p\n", [Errors]), + ?t:fail() + end. + +verify2([{_N,Id}|RL], [Id|R]) -> + verify2(RL,R); +verify2([],[]) -> false; +verify2(_Err, _) -> + true. + +otp_7665(doc) -> ["delete_object followed by delete on fixed bag failed to delete objects."]; +otp_7665(suite) -> []; +otp_7665(Config) when is_list(Config) -> + repeat_for_opts(otp_7665_do). + +otp_7665_do(Opts) -> + Tab = ets:new(otp_7665,[bag | Opts]), + Min = 0, + Max = 10, + lists:foreach(fun(N)-> otp_7665_act(Tab,Min,Max,N) end, + lists:seq(Min,Max)), + ?line true = ets:delete(Tab). + +otp_7665_act(Tab,Min,Max,DelNr) -> + List1 = [{key,N} || N <- lists:seq(Min,Max)], + ?line true = ets:insert(Tab, List1), + ?line true = ets:safe_fixtable(Tab, true), + ?line true = ets:delete_object(Tab, {key,DelNr}), + List2 = lists:delete({key,DelNr}, List1), + + %% Now verify that we find all remaining objects + ?line List2 = ets:lookup(Tab,key), + ?line EList2 = lists:map(fun({key,N})-> N end, + List2), + ?line EList2 = ets:lookup_element(Tab,key,2), + ?line true = ets:delete(Tab, key), + ?line [] = ets:lookup(Tab, key), + ?line true = ets:safe_fixtable(Tab, false), + ok. + +%% Whitebox testing of meta name table hashing. +meta_wb(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + ?line erts_debug:set_internal_state(available_internal_state, true), + try + repeat_for_opts(meta_wb_do) + after + erts_debug:set_internal_state(available_internal_state, false) + end, + ?line verify_etsmem(EtsMem). + + +meta_wb_do(Opts) -> + %% Do random new/delete/rename of colliding named tables + Names = [pioneer | colliding_names(pioneer)], + Len = length(Names), + OpFuns = {fun meta_wb_new/4, fun meta_wb_delete/4, fun meta_wb_rename/4}, + + io:format("Colliding names = ~p\n",[Names]), + F = fun(0,_,_) -> ok; + (N,Tabs,Me) -> Name1 = lists:nth(random:uniform(Len),Names), + Name2 = lists:nth(random:uniform(Len),Names), + Op = element(random:uniform(3),OpFuns), + NTabs = Op(Name1, Name2, Tabs, Opts), + Me(N-1,NTabs,Me) + end, + F(Len*100, [], F), + + % cleanup + lists:foreach(fun(Name)->catch ets:delete(Name) end, + Names). + +meta_wb_new(Name, _, Tabs, Opts) -> + case (catch ets:new(Name,[named_table|Opts])) of + Name -> + ?line false = lists:member(Name, Tabs), + [Name | Tabs]; + {'EXIT',{badarg,_}} -> + ?line true = lists:member(Name, Tabs), + Tabs + end. +meta_wb_delete(Name, _, Tabs, _) -> + case (catch ets:delete(Name)) of + true -> + ?line true = lists:member(Name, Tabs), + lists:delete(Name, Tabs); + {'EXIT',{badarg,_}} -> + ?line false = lists:member(Name, Tabs), + Tabs + end. +meta_wb_rename(Old, New, Tabs, _) -> + case (catch ets:rename(Old,New)) of + New -> + ?line true = lists:member(Old, Tabs) + andalso not lists:member(New, Tabs), + [New | lists:delete(Old, Tabs)]; + {'EXIT',{badarg,_}} -> + ?line true = not lists:member(Old, Tabs) + orelse lists:member(New,Tabs), + Tabs + end. + + +colliding_names(Name) -> + erts_debug:set_internal_state(colliding_names, {Name,5}). + + +%% OTP_6913: Grow and shrink. + +grow_shrink(Config) when is_list(Config) -> + ?line EtsMem = etsmem(), + grow_shrink_0(lists:seq(3071, 5000), EtsMem). + +grow_shrink_0([N|Ns], EtsMem) -> + ?line grow_shrink_1(N, [set]), + ?line grow_shrink_1(N, [ordered_set]), + ?line verify_etsmem(EtsMem), + grow_shrink_0(Ns, EtsMem); +grow_shrink_0([], _) -> ok. + +grow_shrink_1(N, Flags) -> + ?line T = ets:new(a, Flags), + ?line grow_shrink_2(N, N, T), + ?line ets:delete(T). + +grow_shrink_2(0, Orig, T) -> + List = [{I,a} || I <- lists:seq(1, Orig)], + List = lists:sort(ets:tab2list(T)), + grow_shrink_3(Orig, T); +grow_shrink_2(N, Orig, T) -> + true = ets:insert(T, {N,a}), + grow_shrink_2(N-1, Orig, T). + +grow_shrink_3(0, T) -> + [] = ets:tab2list(T); +grow_shrink_3(N, T) -> + true = ets:delete(T, N), + grow_shrink_3(N-1, T). + +grow_pseudo_deleted(doc) -> ["Grow a table that still contains pseudo-deleted objects"]; +grow_pseudo_deleted(suite) -> []; +grow_pseudo_deleted(Config) when is_list(Config) -> + only_if_smp(fun() -> grow_pseudo_deleted_do() end). + +grow_pseudo_deleted_do() -> + lists:foreach(fun(Type) -> grow_pseudo_deleted_do(Type) end, + [set,bag,duplicate_bag]). + +grow_pseudo_deleted_do(Type) -> + process_flag(scheduler,1), + Self = self(), + ?line T = ets:new(kalle,[Type,public,{write_concurrency,true}]), + Mod = 7, Mult = 10000, + filltabint(T,Mod*Mult), + ?line true = ets:safe_fixtable(T,true), + ?line Mult = ets:select_delete(T, + [{{'$1', '_'}, + [{'=:=', {'rem', '$1', Mod}, 0}], + [true]}]), + Left = Mult*(Mod-1), + ?line Left = ets:info(T,size), + ?line Mult = ets:info(T,kept_objects), + filltabstr(T,Mult), + spawn_opt(fun()-> ?line true = ets:info(T,fixed), + Self ! start, + io:format("Starting to filltabstr... ~p\n",[now()]), + filltabstr(T,Mult,Mult+10000), + io:format("Done with filltabstr. ~p\n",[now()]), + Self ! done + end, [link, {scheduler,2}]), + ?line start = receive_any(), + io:format("Unfixing table...~p nitems=~p\n",[now(),ets:info(T,size)]), + ?line true = ets:safe_fixtable(T,false), + io:format("Unfix table done. ~p nitems=~p\n",[now(),ets:info(T,size)]), + ?line false = ets:info(T,fixed), + ?line 0 = ets:info(T,kept_objects), + ?line done = receive_any(), + %%verify_table_load(T), % may fail if concurrency is poor (genny) + ets:delete(T), + process_flag(scheduler,0). + +shrink_pseudo_deleted(doc) -> ["Shrink a table that still contains pseudo-deleted objects"]; +shrink_pseudo_deleted(suite) -> []; +shrink_pseudo_deleted(Config) when is_list(Config) -> + only_if_smp(fun()->shrink_pseudo_deleted_do() end). + +shrink_pseudo_deleted_do() -> + lists:foreach(fun(Type) -> shrink_pseudo_deleted_do(Type) end, + [set,bag,duplicate_bag]). + +shrink_pseudo_deleted_do(Type) -> + process_flag(scheduler,1), + Self = self(), + ?line T = ets:new(kalle,[Type,public,{write_concurrency,true}]), + Half = 10000, + filltabint(T,Half*2), + ?line true = ets:safe_fixtable(T,true), + ?line Half = ets:select_delete(T, + [{{'$1', '_'}, + [{'>', '$1', Half}], + [true]}]), + ?line Half = ets:info(T,size), + ?line Half = ets:info(T,kept_objects), + spawn_opt(fun()-> ?line true = ets:info(T,fixed), + Self ! start, + io:format("Starting to delete... ~p\n",[now()]), + del_one_by_one_set(T,1,Half+1), + io:format("Done with delete. ~p\n",[now()]), + Self ! done + end, [link, {scheduler,2}]), + ?line start = receive_any(), + io:format("Unfixing table...~p nitems=~p\n",[now(),ets:info(T,size)]), + ?line true = ets:safe_fixtable(T,false), + io:format("Unfix table done. ~p nitems=~p\n",[now(),ets:info(T,size)]), + ?line false = ets:info(T,fixed), + ?line 0 = ets:info(T,kept_objects), + ?line done = receive_any(), + %%verify_table_load(T), % may fail if concurrency is poor (genny) + ets:delete(T), + process_flag(scheduler,0). + + +meta_smp(suite) -> + [meta_lookup_unnamed_read, + meta_lookup_unnamed_write, + meta_lookup_named_read, + meta_lookup_named_write, + meta_newdel_unnamed, + meta_newdel_named]. + +meta_lookup_unnamed_read(suite) -> []; +meta_lookup_unnamed_read(Config) when is_list(Config) -> + InitF = fun(_) -> Tab = ets:new(unnamed,[]), + true = ets:insert(Tab,{key,data}), + Tab + end, + ExecF = fun(Tab) -> [{key,data}] = ets:lookup(Tab,key), + Tab + end, + FiniF = fun(Tab) -> true = ets:delete(Tab) + end, + run_workers(InitF,ExecF,FiniF,10000). + +meta_lookup_unnamed_write(suite) -> []; +meta_lookup_unnamed_write(Config) when is_list(Config) -> + InitF = fun(_) -> Tab = ets:new(unnamed,[]), + {Tab,0} + end, + ExecF = fun({Tab,N}) -> true = ets:insert(Tab,{key,N}), + {Tab,N+1} + end, + FiniF = fun({Tab,_}) -> true = ets:delete(Tab) + end, + run_workers(InitF,ExecF,FiniF,10000). + +meta_lookup_named_read(suite) -> []; +meta_lookup_named_read(Config) when is_list(Config) -> + InitF = fun([ProcN|_]) -> Name = list_to_atom(integer_to_list(ProcN)), + Tab = ets:new(Name,[named_table]), + true = ets:insert(Tab,{key,data}), + Tab + end, + ExecF = fun(Tab) -> [{key,data}] = ets:lookup(Tab,key), + Tab + end, + FiniF = fun(Tab) -> true = ets:delete(Tab) + end, + run_workers(InitF,ExecF,FiniF,10000). + +meta_lookup_named_write(suite) -> []; +meta_lookup_named_write(Config) when is_list(Config) -> + InitF = fun([ProcN|_]) -> Name = list_to_atom(integer_to_list(ProcN)), + Tab = ets:new(Name,[named_table]), + {Tab,0} + end, + ExecF = fun({Tab,N}) -> true = ets:insert(Tab,{key,N}), + {Tab,N+1} + end, + FiniF = fun({Tab,_}) -> true = ets:delete(Tab) + end, + run_workers(InitF,ExecF,FiniF,10000). + +meta_newdel_unnamed(suite) -> []; +meta_newdel_unnamed(Config) when is_list(Config) -> + InitF = fun(_) -> ok end, + ExecF = fun(_) -> Tab = ets:new(unnamed,[]), + true = ets:delete(Tab) + end, + FiniF = fun(_) -> ok end, + run_workers(InitF,ExecF,FiniF,10000). + +meta_newdel_named(suite) -> []; +meta_newdel_named(Config) when is_list(Config) -> + InitF = fun([ProcN|_]) -> list_to_atom(integer_to_list(ProcN)) + end, + ExecF = fun(Name) -> Name = ets:new(Name,[named_table]), + true = ets:delete(Name), + Name + end, + FiniF = fun(_) -> ok end, + run_workers(InitF,ExecF,FiniF,10000). + +smp_insert(doc) -> ["Concurrent insert's on same table"]; +smp_insert(suite) -> []; +smp_insert(Config) when is_list(Config) -> + ets:new(smp_insert,[named_table,public,{write_concurrency,true}]), + InitF = fun(_) -> ok end, + ExecF = fun(_) -> true = ets:insert(smp_insert,{random:uniform(10000)}) + end, + FiniF = fun(_) -> ok end, + run_workers(InitF,ExecF,FiniF,100000), + verify_table_load(smp_insert), + ets:delete(smp_insert). + +smp_fixed_delete(doc) -> ["Concurrent delete's on same fixated table"]; +smp_fixed_delete(suite) -> []; +smp_fixed_delete(Config) when is_list(Config) -> + only_if_smp(fun()->smp_fixed_delete_do() end). + +smp_fixed_delete_do() -> + T = ets:new(foo,[public,{write_concurrency,true}]), + %%Mem = ets:info(T,memory), + NumOfObjs = 100000, + filltabint(T,NumOfObjs), + ets:safe_fixtable(T,true), + Buckets = num_of_buckets(T), + InitF = fun([ProcN,NumOfProcs|_]) -> {ProcN,NumOfProcs} end, + ExecF = fun({Key,_}) when Key > NumOfObjs -> + [end_of_work]; + ({Key,Increment}) -> + true = ets:delete(T,Key), + {Key+Increment,Increment} + end, + FiniF = fun(_) -> ok end, + run_workers_do(InitF,ExecF,FiniF,NumOfObjs), + ?line 0 = ets:info(T,size), + ?line true = ets:info(T,fixed), + ?line Buckets = num_of_buckets(T), + ?line NumOfObjs = ets:info(T,kept_objects), + ets:safe_fixtable(T,false), + %% Will fail as unfix does not shrink the table: + %%?line Mem = ets:info(T,memory), + %%verify_table_load(T), + ets:delete(T). + +num_of_buckets(T) -> + ?line element(1,ets:info(T,stats)). + +smp_unfix_fix(doc) -> ["Fixate hash table while other process is busy doing unfix"]; +smp_unfix_fix(suite) -> []; +smp_unfix_fix(Config) when is_list(Config) -> + only_if_smp(fun()-> smp_unfix_fix_do() end). + +smp_unfix_fix_do() -> + process_flag(scheduler,1), + Parent = self(), + T = ets:new(foo,[public,{write_concurrency,true}]), + %%Mem = ets:info(T,memory), + NumOfObjs = 100000, + Deleted = 50000, + filltabint(T,NumOfObjs), + ets:safe_fixtable(T,true), + Buckets = num_of_buckets(T), + ?line Deleted = ets:select_delete(T,[{{'$1', '_'}, + [{'=<','$1', Deleted}], + [true]}]), + ?line Buckets = num_of_buckets(T), + Left = NumOfObjs - Deleted, + ?line Left = ets:info(T,size), + ?line true = ets:info(T,fixed), + ?line Deleted = ets:info(T,kept_objects), + + {Child, Mref} = + spawn_opt(fun()-> ?line true = ets:info(T,fixed), + Parent ! start, + io:format("Child waiting for table to be unfixed... now=~p mem=~p\n", + [now(),ets:info(T,memory)]), + repeat_while(fun()-> ets:info(T,fixed) end), + io:format("Table unfixed. Child Fixating! now=~p mem=~p\n", + [now(),ets:info(T,memory)]), + ?line true = ets:safe_fixtable(T,true), + repeat_while(fun(Key) when Key =< NumOfObjs -> + ets:delete(T,Key), {true,Key+1}; + (Key) -> {false,Key} + end, + Deleted), + ?line 0 = ets:info(T,size), + ?line true = ets:info(T,kept_objects) >= Left, + ?line done = receive_any() + end, + [link, monitor, {scheduler,2}]), + + ?line start = receive_any(), + ?line true = ets:info(T,fixed), + io:format("Parent starting to unfix... ~p\n",[now()]), + ets:safe_fixtable(T,false), + io:format("Parent done with unfix. ~p\n",[now()]), + Child ! done, + {'DOWN', Mref, process, Child, normal} = receive_any(), + ?line false = ets:info(T,fixed), + ?line 0 = ets:info(T,kept_objects), + %%verify_table_load(T), + ets:delete(T), + process_flag(scheduler,0). + +otp_8166(doc) -> ["Unsafe unfix was done by trapping select/match"]; +otp_8166(suite) -> []; +otp_8166(Config) when is_list(Config) -> + only_if_smp(3, fun()-> otp_8166_do(false), + otp_8166_do(true) + end). + +otp_8166_do(WC) -> + %% Bug scenario: One process segv while reading the table because another + %% process is doing unfix without write-lock at the end of a trapping match_object. + process_flag(scheduler,1), + T = ets:new(foo,[public, {write_concurrency,WC}]), + NumOfObjs = 3000, %% Need more than 1000 live objects for match_object to trap one time + Deleted = NumOfObjs div 2, + filltabint(T,NumOfObjs), + {ReaderPid, ReaderMref} = + spawn_opt(fun()-> otp_8166_reader(T,NumOfObjs) end, + [link, monitor, {scheduler,2}]), + {ZombieCrPid, ZombieCrMref} = + spawn_opt(fun()-> otp_8166_zombie_creator(T,Deleted) end, + [link, monitor, {scheduler,3}]), + + repeat(fun() -> ZombieCrPid ! {loop, self()}, + zombies_created = receive_any(), + otp_8166_trapper(T, 10, ZombieCrPid) + end, + 100), + + ReaderPid ! quit, + {'DOWN', ReaderMref, process, ReaderPid, normal} = receive_any(), + ZombieCrPid ! quit, + {'DOWN', ZombieCrMref, process, ZombieCrPid, normal} = receive_any(), + ?line false = ets:info(T,fixed), + ?line 0 = ets:info(T,kept_objects), + %%verify_table_load(T), + ets:delete(T), + process_flag(scheduler,0). + +%% Keep reading the table +otp_8166_reader(T, NumOfObjs) -> + repeat_while(fun(0) -> + receive quit -> {false,done} + after 0 -> {true,NumOfObjs} + end; + (Key) -> + ets:lookup(T,Key), + {true, Key-1} + end, + NumOfObjs). + +%% Do a match_object that will trap and thereby fixate and then unfixate the table +otp_8166_trapper(T, Try, ZombieCrPid) -> + [] = ets:match_object(T,{'_',"Pink Unicorn"}), + case {ets:info(T,fixed),Try} of + {true,1} -> + io:format("failed to provoke unsafe unfix, give up...\n",[]), + ZombieCrPid ! unfix; + {true,_} -> + io:format("trapper too fast, trying again...\n",[]), + otp_8166_trapper(T, Try-1, ZombieCrPid); + {false,_} -> done + end. + + +%% Fixate table and create some pseudo-deleted objects (zombies) +%% Then wait for trapper to fixate before unfixing, as we want the trappers' +%% unfix to be the one that purges the zombies. +otp_8166_zombie_creator(T,Deleted) -> + case receive_any() of + quit -> done; + + {loop,Pid} -> + filltabint(T,Deleted), + ets:safe_fixtable(T,true), + ?line Deleted = ets:select_delete(T,[{{'$1', '_'}, + [{'=<','$1', Deleted}], + [true]}]), + Pid ! zombies_created, + repeat_while(fun() -> case ets:info(T,safe_fixed) of + {_,[_P1,_P2]} -> + false; + _ -> + receive unfix -> false + after 0 -> true + end + end + end), + ets:safe_fixtable(T,false), + otp_8166_zombie_creator(T,Deleted); + + unfix -> + io:format("ignore unfix in outer loop?\n",[]), + otp_8166_zombie_creator(T,Deleted) + end. + + + + +verify_table_load(T) -> + ?line Stats = ets:info(T,stats), + ?line {Buckets,AvgLen,StdDev,ExpSD,_MinLen,_MaxLen} = Stats, + ?line ok = if + AvgLen > 7 -> + io:format("Table overloaded: Stats=~p\n~p\n", + [Stats, ets:info(T)]), + false; + + Buckets>256, AvgLen < 6 -> + io:format("Table underloaded: Stats=~p\n~p\n", + [Stats, ets:info(T)]), + false; + + StdDev > ExpSD*2 -> + io:format("Too large standard deviation (poor hashing?)," + " stats=~p\n~p\n",[Stats, ets:info(T)]), + false; + + true -> + io:format("Stats = ~p\n",[Stats]), + ok + end. + + + + + +smp_select_delete(suite) -> []; +smp_select_delete(doc) -> + ["Run concurrent select_delete (and inserts) on same table."]; +smp_select_delete(Config) when is_list(Config) -> + T = ets:new(smp_select_delete,[named_table,public,{write_concurrency,true}]), + Mod = 17, + Zeros = erlang:make_tuple(Mod,0), + InitF = fun(_) -> Zeros end, + ExecF = fun(Diffs0) -> + case random:uniform(20) of + 1 -> + Mod = 17, + Eq = random:uniform(Mod) - 1, + Deleted = ets:select_delete(T, + [{{'_', '$1'}, + [{'=:=', {'rem', '$1', Mod}, Eq}], + [true]}]), + Diffs1 = setelement(Eq+1, Diffs0, + element(Eq+1,Diffs0) - Deleted), + Diffs1; + _ -> + Key = random:uniform(10000), + Eq = Key rem Mod, + ?line case ets:insert_new(T,{Key,Key}) of + true -> + Diffs1 = setelement(Eq+1, Diffs0, + element(Eq+1,Diffs0)+1), + Diffs1; + false -> Diffs0 + end + end + end, + FiniF = fun(Result) -> Result end, + Results = run_workers_do(InitF,ExecF,FiniF,20000), + ?line TotCnts = lists:foldl(fun(Diffs, Sum) -> add_lists(Sum,tuple_to_list(Diffs)) end, + lists:duplicate(Mod, 0), Results), + io:format("TotCnts = ~p\n",[TotCnts]), + ?line LeftInTab = lists:foldl(fun(N,Sum) -> Sum+N end, + 0, TotCnts), + io:format("LeftInTab = ~p\n",[LeftInTab]), + ?line LeftInTab = ets:info(T,size), + lists:foldl(fun(Cnt,Eq) -> + WasCnt = ets:select_count(T, + [{{'_', '$1'}, + [{'=:=', {'rem', '$1', Mod}, Eq}], + [true]}]), + io:format("~p: ~p =?= ~p\n",[Eq,Cnt,WasCnt]), + ?line Cnt = WasCnt, + Eq+1 + end, + 0, TotCnts), + verify_table_load(T), + ?line LeftInTab = ets:select_delete(T, [{{'$1','$1'}, [], [true]}]), + ?line 0 = ets:info(T,size), + ?line false = ets:info(T,fixed), + ets:delete(T). + +add_lists(L1,L2) -> + add_lists(L1,L2,[]). +add_lists([],[],Acc) -> + lists:reverse(Acc); +add_lists([E1|T1], [E2|T2], Acc) -> + add_lists(T1, T2, [E1+E2 | Acc]). + +run_workers(InitF,ExecF,FiniF,Laps) -> + case erlang:system_info(smp_support) of + true -> + run_workers_do(InitF,ExecF,FiniF,Laps); + false -> + {skipped,"No smp support"} + end. + +run_workers_do(InitF,ExecF,FiniF,Laps) -> + NumOfProcs = erlang:system_info(schedulers), + io:format("smp starting ~p workers\n",[NumOfProcs]), + Seeds = [{ProcN,random:uniform(9999)} || ProcN <- lists:seq(1,NumOfProcs)], + Parent = self(), + Pids = [spawn_link(fun()-> worker(Seed,InitF,ExecF,FiniF,Laps,Parent,NumOfProcs) end) + || Seed <- Seeds], + wait_pids(Pids). + +worker({ProcN,Seed}, InitF, ExecF, FiniF, Laps, Parent, NumOfProcs) -> + io:format("smp worker ~p, seed=~p~n",[self(),Seed]), + random:seed(Seed,Seed,Seed), + State1 = InitF([ProcN, NumOfProcs]), + State2 = worker_loop(Laps, ExecF, State1), + Result = FiniF(State2), + io:format("worker ~p done\n",[self()]), + Parent ! {self(), Result}. + +worker_loop(0, _, State) -> + State; +worker_loop(_, _, [end_of_work|State]) -> + State; +worker_loop(N, ExecF, State) -> + worker_loop(N-1,ExecF,ExecF(State)). + +wait_pids(Pids) -> + wait_pids(Pids,[]). +wait_pids([],Acc) -> + Acc; +wait_pids(Pids, Acc) -> + receive + {Pid,Result} -> + ?line true = lists:member(Pid,Pids), + Others = lists:delete(Pid,Pids), + io:format("wait_pid got ~p from ~p, still waiting for ~p\n",[Result,Pid,Others]), + wait_pids(Others,[Result | Acc]) + end. + + + + +my_tab_to_list(Ts) -> + Key = ets:first(Ts), + my_tab_to_list(Ts,ets:next(Ts,Key),[ets:lookup(Ts, Key)]). + +my_tab_to_list(_Ts,'$end_of_table', Acc) -> lists:reverse(Acc); +my_tab_to_list(Ts,Key, Acc) -> + my_tab_to_list(Ts,ets:next(Ts,Key),[ets:lookup(Ts, Key)| Acc]). + +etsmem() -> + {try erlang:memory(ets) catch error:notsup -> notsup end, + case erlang:system_info({allocator,ets_alloc}) of + false -> undefined; + MemInfo -> + MSBCS = lists:foldl( + fun ({instance, _, L}, Acc) -> + {value,{_,MBCS}} = lists:keysearch(mbcs, 1, L), + {value,{_,SBCS}} = lists:keysearch(sbcs, 1, L), + [MBCS,SBCS | Acc] + end, + [], + MemInfo), + lists:foldl( + fun(L, {Bl0,BlSz0}) -> + {value,{_,Bl,_,_}} = lists:keysearch(blocks, 1, L), + {value,{_,BlSz,_,_}} = lists:keysearch(blocks_size, 1, L), + {Bl0+Bl,BlSz0+BlSz} + end, {0,0}, MSBCS) + end}. + +verify_etsmem(MemInfo) -> + wait_for_test_procs(), + case etsmem() of + MemInfo -> + io:format("Ets mem info: ~p", [MemInfo]), + case MemInfo of + {ErlMem,EtsAlloc} when ErlMem == notsup; EtsAlloc == undefined -> + %% Use 'erl +Mea max' to do more complete memory leak testing. + {comment,"Incomplete or no mem leak testing"}; + _ -> + ok + end; + Other -> + io:format("Expected: ~p", [MemInfo]), + io:format("Actual: ~p", [Other]), + ?t:fail() + end. + +start_loopers(N, Prio, Fun, State) -> + lists:map(fun (_) -> + my_spawn_opt(fun () -> looper(Fun, State) end, + [{priority, Prio}, link]) + end, + lists:seq(1, N)). + +stop_loopers(Loopers) -> + lists:foreach(fun (P) -> + unlink(P), + exit(P, bang) + end, + Loopers), + ok. + +looper(Fun, State) -> + looper(Fun, Fun(State)). + +spawn_logger(Procs) -> + receive + {new_test_proc, Proc} -> + spawn_logger([Proc|Procs]); + {sync_test_procs, Kill, From} -> + lists:foreach(fun (Proc) when From == Proc -> + ok; + (Proc) -> + Mon = erlang:monitor(process, Proc), + receive + {'DOWN', Mon, _, _, _} -> + ok + after 0 -> + case Kill of + true -> exit(Proc, kill); + _ -> ok + end, + receive + {'DOWN', Mon, _, _, _} -> + ok + end + end + end, Procs), + From ! test_procs_synced, + spawn_logger([From]) + end. + +start_spawn_logger() -> + case whereis(ets_test_spawn_logger) of + Pid when is_pid(Pid) -> true; + _ -> register(ets_test_spawn_logger, + spawn_opt(fun () -> spawn_logger([]) end, + [{priority, max}])) + end. + +%% restart_spawn_logger() -> +%% stop_spawn_logger(), +%% start_spawn_logger(). + +stop_spawn_logger() -> + Mon = erlang:monitor(process, ets_test_spawn_logger), + (catch exit(whereis(ets_test_spawn_logger), kill)), + receive {'DOWN', Mon, _, _, _} -> ok end, + ok. + +wait_for_test_procs() -> + wait_for_test_procs(false). + +wait_for_test_procs(Kill) -> + ets_test_spawn_logger ! {sync_test_procs, Kill, self()}, + receive test_procs_synced -> ok end. + +log_test_proc(Proc) -> + ets_test_spawn_logger ! {new_test_proc, Proc}, + Proc. + +my_spawn(Fun) -> log_test_proc(spawn(Fun)). +%%my_spawn(M,F,A) -> log_test_proc(spawn(M,F,A)). +%%my_spawn(N,M,F,A) -> log_test_proc(spawn(N,M,F,A)). + +my_spawn_link(Fun) -> log_test_proc(spawn_link(Fun)). +my_spawn_link(M,F,A) -> log_test_proc(spawn_link(M,F,A)). +%%my_spawn_link(N,M,F,A) -> log_test_proc(spawn_link(N,M,F,A)). + +my_spawn_opt(Fun,Opts) -> log_test_proc(spawn_opt(Fun,Opts)). +%%my_spawn_opt(M,F,A,Opts) -> log_test_proc(spawn_opt(M,F,A,Opts)). +%%my_spawn_opt(N,M,F,A,Opts) -> log_test_proc(spawn_opt(N,M,F,A,Opts)). + +repeat(_Fun, 0) -> + ok; +repeat(Fun, N) -> + Fun(), + repeat(Fun, N-1). + +repeat_while(Fun) -> + case Fun() of + true -> repeat_while(Fun); + false -> false + end. + +repeat_while(Fun, Arg0) -> + case Fun(Arg0) of + {true,Arg1} -> repeat_while(Fun,Arg1); + {false,Ret} -> Ret + end. + +receive_any() -> + receive M -> + io:format("Process ~p got msg ~p\n", [self(),M]), + M + end. + +receive_any_spinning() -> + receive_any_spinning(1000000). +receive_any_spinning(Loops) -> + receive_any_spinning(Loops,Loops,1). +receive_any_spinning(Loops,0,Tries) -> + receive M -> + io:format("Spinning process ~p got msg ~p after ~p tries\n", [self(),M,Tries]), + M + after 0 -> + receive_any_spinning(Loops, Loops, Tries+1) + end; +receive_any_spinning(Loops, N, Tries) when N>0 -> + receive_any_spinning(Loops, N-1, Tries). + + + +spawn_monitor_with_pid(Pid, Fun) when is_pid(Pid) -> + spawn_monitor_with_pid(Pid, Fun, 1, 10). + +spawn_monitor_with_pid(Pid, Fun, N, M) when N > M*10 -> + spawn_monitor_with_pid(Pid, Fun, N, M*10); +spawn_monitor_with_pid(Pid, Fun, N, M) -> + ?line false = is_process_alive(Pid), + case spawn(fun()-> case self() of + Pid -> Fun(); + _ -> die + end + end) of + Pid -> + {Pid, erlang:monitor(process, Pid)}; + Other -> + case N rem M of + 0 -> io:format("Failed ~p times to get pid ~p (current = ~p)\n",[N,Pid,Other]); + _ -> ok + end, + spawn_monitor_with_pid(Pid,Fun,N+1,M) + end. + + +only_if_smp(Func) -> + only_if_smp(2, Func). +only_if_smp(Schedulers, Func) -> + case {erlang:system_info(smp_support), + erlang:system_info(schedulers_online)} of + {false,_} -> {skip,"No smp support"}; + {true,N} when N < Schedulers -> {skip,"Too few schedulers online"}; + {true,_} -> Func() + end. + + +%% Repeat test function with different combination of table options +%% +repeat_for_opts(F) -> + repeat_for_opts(F, [write_concurrency]). + +repeat_for_opts(F, OptGenList) when is_atom(F) -> + repeat_for_opts(fun(Opts) -> ?MODULE:F(Opts) end, OptGenList); +repeat_for_opts(F, OptGenList) -> + repeat_for_opts(F, OptGenList, []). + +repeat_for_opts(F, [], Acc) -> + lists:map(fun(Opts) -> + io:format("Calling with options ~p\n",[Opts]), + F(Opts) + end, Acc); +repeat_for_opts(F, [OptList | Tail], []) when is_list(OptList) -> + repeat_for_opts(F, Tail, [[Opt] || Opt <- OptList]); +repeat_for_opts(F, [OptList | Tail], AccList) when is_list(OptList) -> + repeat_for_opts(F, Tail, [[Opt|Acc] || Opt <- OptList, Acc <- AccList]); +repeat_for_opts(F, [Atom | Tail], AccList) when is_atom(Atom) -> + repeat_for_opts(F, [repeat_for_opts_atom2list(Atom) | Tail ], AccList). + +repeat_for_opts_atom2list(all_types) -> [set,ordered_set,bag,duplicate_bag]; +repeat_for_opts_atom2list(write_concurrency) -> [{write_concurrency,false},{write_concurrency,true}]. + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/ets_tough_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/ets_tough_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/ets_tough_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/ets_tough_SUITE.erl 2009-11-20 13:30:01.000000000 +0000 @@ -0,0 +1,1093 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(ets_tough_SUITE). +-export([all/1,ex1/1]). +-export([init/1,terminate/2,handle_call/3,handle_info/2]). +-export([init_per_testcase/2, fin_per_testcase/2]). +-compile([export_all]). +-include("test_server.hrl"). + +all(suite) -> [ex1]. + + +-define(DEBUG(X),debug_disabled). +%%-define(DEBUG(X),X). +-define(GLOBAL_PARAMS,ets_tough_SUITE_global_params). + +init_per_testcase(_Func, Config) -> + Dog=test_server:timetrap(test_server:seconds(300)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ets:delete(?GLOBAL_PARAMS). + + +ex1(Config) when list(Config) -> + ?line ets:new(?GLOBAL_PARAMS,[named_table,public]), + ?line ets:insert(?GLOBAL_PARAMS,{a,set}), + ?line ets:insert(?GLOBAL_PARAMS,{b,set}), + ?line ex1_sub(Config), + ?line ets:insert(?GLOBAL_PARAMS,{a,ordered_set}), + ?line ets:insert(?GLOBAL_PARAMS,{b,set}), + ?line ex1_sub(Config), + ?line ets:insert(?GLOBAL_PARAMS,{a,ordered_set}), + ?line ets:insert(?GLOBAL_PARAMS,{b,ordered_set}), + ?line ex1_sub(Config). + + + + +ex1_sub(Config) -> + {A,B} = prep(Config), + N = + case ?config(ets_tough_SUITE_iters,Config) of + undefined -> + 5000; + Other -> + Other + end, + {NewA,NewB} = run({A,B},N), + _Gurkor = lists:keysearch(gurka,1,ets:all()), + (catch stop(NewA)), + (catch stop(NewB)), + ok. + +prep(Config) -> + random:seed(), + put(dump_ticket,none), + DumpDir = filename:join(?config(priv_dir,Config), "ets_tough"), + file:make_dir(DumpDir), + put(dump_dir,DumpDir), + process_flag(trap_exit,true), + {ok, A} = start(a), + {ok, B} = start(b), + {A,B}. + +run({A,B},N) -> + run(A,B,0,N). + +run(A,B,N,N) -> + {A,B}; +run(A,B,N,M) -> + eat_msgs(), + Op = random_operation(), + ?DEBUG(io:format("~w: ",[N])), + case catch operate(Op,A,B) of + {'EXIT',Reason} -> + io:format("\nFAILURE on ~w: ~w, reason: ~w\n",[N,Op,Reason]), + exit(failed); + {new_a,NewA} -> + run(NewA,B,N+1,M); + _ -> + run(A,B,N+1,M) + end. + +eat_msgs() -> + receive + _Anything -> + eat_msgs() + after 0 -> + ok + end. + +operate(get,A,B) -> + case random_key() of + 1 -> + Class = random_class(), + AnsA = lists:sort(dget_class(A,Class,all)), + AnsB = lists:sort(dget_class(B,Class,all)), + ?DEBUG(io:format("get_class ~w (~w)\n",[Class,AnsA])), + AnsA = AnsB; + _Other -> + Class = random_class(), + Key = random_key(), + AnsA = dget(A,Class,Key), + AnsB = dget(B,Class,Key), + ?DEBUG(io:format("get ~w,~w (~w)\n",[Class,Key,AnsA])), + AnsA = AnsB + end; + +operate(put,A,B) -> + Class = random_class(), + Key = random_key(), + Value = random_value(), + AnsA = dput(A,Class,Key,Value), + AnsB = dput(B,Class,Key,Value), + ?DEBUG(io:format("put ~w,~w=~w (~w)\n",[Class,Key,Value,AnsA])), + AnsA = AnsB; + +operate(erase,A,B) -> + case random_key() of + 1 -> + Class = random_class(), + AnsA = derase_class(A,Class), + AnsB = derase_class(B,Class), + ?DEBUG(io:format("erase_class ~w\n",[Class])), + AnsA = AnsB; + _Other -> + Class = random_class(), + Key = random_key(), + AnsA = derase(A,Class,Key), + AnsB = derase(B,Class,Key), + ?DEBUG(io:format("erase ~w,~w (~w)\n",[Class,Key,AnsA])), + AnsA = AnsB + end; + +operate(dirty_get,A,_B) -> + Class = random_class(), + Key = random_key(), + %% only try dirty get on the b-side (which is never dumping) + AnsA = dget(A,Class,Key), + AnsB = dirty_dget(b,Class,Key), + ?DEBUG(io:format("dirty_get ~w,~w (~w)\n",[Class,Key,AnsA])), + AnsA = AnsB; + +operate(dump,A,_B) -> + case get(dump_ticket) of + {dump_more,Ticket} -> + Units = random_key(), + NewTicket = ddump_next(A,Units,Ticket), + put(dump_ticket,NewTicket), + _Result = case NewTicket of + done -> done; + _ -> dump_more + end, + ?DEBUG(io:format("dump ~w (~w)\n",[Units,_Result])); + _ -> + DumpDir = get(dump_dir), + case random_key() of + 1 -> + ?DEBUG(io:format("start_dump\n",[])), + NewTicket = ddump_first(A,DumpDir), + put(dump_ticket,NewTicket); + 2 -> + ?DEBUG(io:format("dump_and_restore\n",[])), + {dump_more,NewTicket} = ddump_first(A,DumpDir), + done = ddump_next(A,1000000,NewTicket), + stop(A), + {ok, NewA} = start(a,DumpDir), + {new_a,NewA}; + _ -> + ?DEBUG(io:format("idle\n",[])), + ok + end + end. + +random_operation() -> + Ops = {get,put,erase,dirty_get,dump}, + random_element(Ops). + +random_class() -> + Classes = {foo,bar,tomat,gurka}, + random_element(Classes). + +random_key() -> + random:uniform(8). + +random_value() -> + case random:uniform(5) of + 1 -> ok; + 2 -> {data,random_key()}; + 3 -> {foo,bar,random_class()}; + 4 -> random:uniform(1000); + 5 -> {recursive,random_value()} + end. + +random_element(T) -> + I = random:uniform(tuple_size(T)), + element(I,T). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +show_table(N) -> + FileName = ["etsdump.",integer_to_list(N)], + case file:open(FileName,read) of + {ok,Fd} -> + show_entries(Fd); + _ -> + error + end. + +show_entries(Fd) -> + case phys_read_len(Fd) of + {ok,Len} -> + case phys_read_entry(Fd,Len) of + {ok,ok} -> + ok; + {ok,{Key,Val}} -> + io:format("~w\n",[{Key,Val}]), + show_entries(Fd); + _ -> + error + end; + _ -> + error + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% DEFINITIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +-define(NAMED_TABLES,true). +-define(DB_NAME_KEY, {'$db_name'}). +-define(LIST_OF_CLASSES_KEY,{'$list_of_classes'}). +-define(DUMPING_FLAG_KEY,{'$dumping_flag'}). +-define(DUMP_DIRECTORY_KEY,{'$dump_directory'}). +-define(ERASE_MARK(Key),{{{'$erased'},Key}}). +-define(ets_new,ets:new). +-define(ets_lookup,ets:lookup). +-define(ets_insert,ets:insert). % erlang:db_put +-define(ets_delete,ets:delete). % erlang:db_erase +-define(ets_first,ets:first). % erlang:db_first +-define(ets_next,ets:next). % erlang:db_next_key +-define(ets_info,ets:info). % erlang:db_info + +%%% INTERFACE FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%% start(DbName) -> Pid | {error,Reason} +%%% +%%% Starts the ets table database with name DbName + +start(DbName) -> + case gen_server:start_link(ets_tough_SUITE,{DbName,no_dump_dir},[]) of + {ok,Pid} when pid(Pid) -> + {ok, Pid}; + Other -> + Other + end. + +%%% start(DbName,DumpDir) -> Pid | {error,Reason} +%%% +%%% Starts the ets table database with name DbName, and reads a dump +%%% from DumpDir when it starts. + +start(DbName,DumpDir) -> + case gen_server:start_link(ets_tough_SUITE, + {DbName,{dump_dir,DumpDir}},[]) of + {ok,Pid} when pid(Pid) -> + {ok, Pid}; + Other -> + Other + end. + +%%% stop(ServerPid) -> {'EXIT',shutdown} +%%% +%%% Shuts down the ets table database + +stop(ServerPid) -> + gen_server:call(ServerPid,stop). + +%%% dget(ServerPid,Class,Key) -> {value,Value} | undefined +%%% +%%% Returns a value identified by Class,Key from the database, or +%%% 'undefined' if there is no such value. + +dget(ServerPid,Class,Key) -> + gen_server:call(ServerPid,{handle_lookup,Class,Key}). + +%%% dirty_dget(DbName,Class,Key) -> {value,Value} | undefined +%%% +%%% This is looks up the value directly in the ets table +%%% to avoid message passing. Several databases may be started, +%%% so the admin table must be registered. + +dirty_dget(DbName,Class,Key) -> + Admin = admin_table_name(DbName), + case catch(?ets_lookup(Admin,Class)) of + [{_Class,[Tab|_Tabs]}] -> + case ?ets_lookup(Tab,Key) of + [{_Key,Value}] -> + {value,Value}; + _ -> + undefined + end; + _ -> + undefined + end. + +%%% dput(ServerPid,Class,Key,Value) -> undefined | {value,OldValue} +%%% +%%% Inserts the given Value to be identified by Class,Key. Any prevoius +%%% value is returned, or otherwise 'undefined'. + +dput(ServerPid,Class,Key,Value) -> + gen_server:call(ServerPid,{handle_insert,Class,Key,Value}). + +%%% derase(ServerPid,Class,Key) -> undefined | {value,OldValue} +%%% +%%% Erases any value identified by Class,Key + +derase(ServerPid,Class,Key) -> + gen_server:call(ServerPid,{handle_delete,Class,Key}). + +%%% dget_class(ServerPid,Class,Condition) -> KeyList +%%% +%%% Returns a list of keys where the instance match Condition. +%%% Condition = 'all' returns all keys in the class. +%%% The condition is supplied as Condition = {Mod, Fun, ExtraArgs}, +%%% where the instance will be prepended to ExtraArgs before each +%%% call is made. + +dget_class(ServerPid,Class,Condition) -> + gen_server:call(ServerPid, + {handle_get_class,Class,Condition},infinity). + +%%% derase_class(ServerPid,Class) -> ok +%%% +%%% Erases a whole class, identified by Class + +derase_class(ServerPid,Class) -> + gen_server:call(ServerPid,{handle_delete_class,Class}, infinity). + +%%% dmodify(ServerPid,Application) -> ok +%%% +%%% Applies a function on every instance in the database. +%%% The user provided function must always return one of the +%%% terms {ok,NewItem}, true, or false. +%%% Aug 96, this is only used to reset all timestamp values +%%% in the database. +%%% The function is supplied as Application = {Mod, Fun, ExtraArgs}, +%%% where the instance will be prepended to ExtraArgs before each +%%% call is made. + +dmodify(ServerPid,Application) -> + gen_server:call(ServerPid,{handle_dmodify,Application}, infinity). + +%%% ddump_first(ServerPid,DumpDir) -> {dump_more,Ticket} | already_dumping +%%% +%%% Starts dumping the database. This call redirects all database updates +%%% to temporary tables, so that exactly the same database image will be +%%% written to disk as is in memory when this function is called. +%%% The returned Ticket is to be used with ddump_next/2 + +ddump_first(ServerPid,DumpDir) -> + gen_server:call(ServerPid,{handle_dump_first,DumpDir}, infinity). + +%%% ddump_next(ServerPid,Count,Ticket) -> {dump_more,Ticket} | done +%%% +%%% Dumps the database. This function performs Count units of dump work. +%%% Higher value of Count makes the entire dump operation more efficient, +%%% but blocks the database for longer periods of time. +%%% If there is still more work to be done, a new Ticket is returned, +%%% or 'done' otherwise. + +ddump_next(ServerPid,Count,Ticket) -> + gen_server:call(ServerPid,{handle_dump_next,Ticket,Count},150000). + +%%% PRIVATE HANDLER FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%% Admin +%%% ----- +%%% +%%% The database has a main administrative table Admin. It always contains +%%% these four items: +%%% +%%% {{'$db_name'},Name} +%%% {{'$list_of_classes'},ListOfClasses} +%%% {{'$dumping_flag'},BoolDumping} +%%% {{'$dump_directory'},Dir} +%%% +%%% The ListOfClasses is simply a list of all Classes that has ever been +%%% inserted in the database. It's used to know which tables to dump. +%%% The dump flag is 'true' while dump is in progress, to make it +%%% impossible to start a new dump before an old dump is completed. +%%% +%%% For each class there is an entry of the form +%%% +%%% {Class,ListOfTables} +%%% +%%% Where the ListOfTables is the list of class tables (see below) +%%% +%%% Class Tables +%%% ------------ +%%% +%%% The class tables are common ets tables that have the actual user +%%% data stored in them. +%%% +%%% Normally there is only one class table, Mtab (main table). +%%% When dumping is initiated, each class is syncronously given a +%%% temporary table, Ttab, where all updates are stored. Reads are +%%% directed to the Ttab first, and only if not found there, Mtab is +%%% consulted. +%%% +%%% Writes always go to the first table in the table sequence. This +%%% ensures that the dump algorithm can enumerate the entries in the +%%% other tables, without risk of being disrupted. +%%% +%%% When the dumping to disk is completed, it's time to write back +%%% whatever updates that came into the Ttab to Mtab. To do this, a +%%% third table is needed, Utab, to handle all updates while Ttab is +%%% being copied to Mtab. When all of Ttab is copied, Ttab is thrown +%%% away, and the whole process is repeated with Utab as Ttab until +%%% eventually nobody wrote to Utab while Ttab was copied (clean run). +%%% +%%% There is no _guarantee_ that this will ever happen, but unless there +%%% is a constant (and quite high frequency) stream of updates to a +%%% particular class, this should work. +%%% +%%% (It is possible to make this failsafe, by copying the elements in +%%% Mtab to Ttab. This is probably a lot more expensive, though) +%%% +%%% Erasure during dump +%%% ------------------- +%%% +%%% Erasing need special attention when a single class has several +%%% tables. It really boils down to a number of cases: +%%% +%%% - element does not exist in Ttab. +%%% A special erase record is written, {{{'$erased'},Key}} which +%%% is hopefully different from all other keys used by the user. +%%% - element exists in Ttab +%%% The element is deleted, and erase record is written +%%% - element does not exist in Ttab, but there is an erase record +%%% fine, do nothing +%%% - element exist in Ttab, and there is an erase record +%%% This happens when a record is deleted from Ttab, then written +%%% back again. Erase records are not looked for when inserting +%%% new data (and that's not necessary) +%%% +%%% Then when Ttab should be copied to Mtab: +%%% +%%% - found an element +%%% Usual case, just copy +%%% - found erase record +%%% Check if there is an element with the same key as the erase +%%% record. If so it has been written later than the erasure, so +%%% the erasure is obsolete. Otherwise erase the record from Mtab. +%%% +%%% Delete Class +%%% ------------ +%%% +%%% A slight problem is deleting an entire class while dumping is in +%%% progress. For consitency, all user visible traces of the class must +%%% be deleted, while dumping must not be affected. On top of that, the +%%% deleted class may well be recreated while dumping is still going on, +%%% and entries added. +%%% +%%% This is solved by having the dump algorithm keep track of the table +%%% identifiers of the tables to dump, rather than asking the admin table +%%% (since the class might be deleted there). The dump algorithm will +%%% itself take care of deleting the tables used in the dumping, while the +%%% normal database interface deletes the "first table", the table that is +%%% currently accepting all write operations. + + +init({DbName,DumpDir}) -> + case DumpDir of + no_dump_dir -> + Admin = make_admin_table(DbName), + ?ets_insert(Admin,{?LIST_OF_CLASSES_KEY,[]}), + init2(DbName,Admin); + {dump_dir,Dir} -> + case load_dump(DbName,Dir) of + {ok,Admin} -> + ?ets_insert(Admin,{?DUMP_DIRECTORY_KEY,Dir}), + init2(DbName,Admin); + _ -> + cant_load_dump + end + end. + +init2(DbName,Admin) -> + ?ets_insert(Admin,{?DUMPING_FLAG_KEY,false}), + ?ets_insert(Admin,{?DB_NAME_KEY,DbName}), + {ok, Admin}. + +terminate(_Reason,_Admin) -> + ok. + +handle_call({handle_lookup,Class,Key},_From,Admin) -> + %% Lookup tables to search in + Reply = + case ?ets_lookup(Admin,Class) of + [] -> + undefined; %% no such class => no such record + [{_,TabList}] -> + {_,Ans} = table_lookup(TabList, Key), + Ans + end, + {reply,Reply,Admin}; + +handle_call({handle_insert,Class,Key,Value},_From,Admin) -> + %% Lookup in which table to write + Reply = + case ?ets_lookup(Admin,Class) of + [] -> + %% undefined class, let's create it + Mtab = make_db_table(db_name(Admin),Class), + ?ets_insert(Admin,{Class,[Mtab]}), + [{_,Classes}] = ?ets_lookup(Admin,?LIST_OF_CLASSES_KEY), + ?ets_insert(Admin,{?LIST_OF_CLASSES_KEY,[Class|Classes]}), + ?ets_insert(Mtab, {Key, Value}), + undefined; + [{_,[Tab|Tabs]}] -> + {_,Old} = table_lookup([Tab|Tabs], Key), + ?ets_insert(Tab, {Key, Value}), + Old + end, + {reply,Reply,Admin}; + +handle_call({handle_delete,Class,Key},_From,Admin) -> + %% Lookup in which table to write + Reply = + case ?ets_lookup(Admin, Class) of + [] -> + undefined; %% no such class, but delete is happy anyway + [{_,[Tab]}] -> + %% When there is only one table, simply deleting is enough + {_,Old} = table_lookup(Tab,Key), + ?ets_delete(Tab,Key), + Old; + [{_,[Tab|Tabs]}] -> + %% When there are more tables, we have to write a delete + %% record into the first one, so that nobody goes looking + %% for this entry in some other table + {_,Old} = table_lookup([Tab|Tabs],Key), + ?ets_insert(Tab, {?ERASE_MARK(Key), erased}), + ?ets_delete(Tab,Key), + Old + end, + {reply,Reply,Admin}; + +handle_call({handle_get_class,Class,Cond},_From,Admin) -> + Reply = + case ?ets_lookup(Admin,Class) of % Lookup tables to search in + [] -> + []; % no such class + [{_,TabList}] -> + table_lookup_batch(TabList, Class, Cond) % get class data + end, + {reply,Reply,Admin}; + +handle_call({handle_delete_class,Class},_From,Admin) -> + Reply = + case ?ets_lookup(Admin, Class) of + [] -> + ok; % no such class, but delete_class is happy anyway + [{_,[Tab|_Tabs]}] -> + %% Always delete the first table (the one we're writing into) + %% In case we're dumping, the rest of the tables will be + %% taken care of by the dump algorithm. + ?ets_delete(Tab), + [{_, Classes}] = ?ets_lookup(Admin, ?LIST_OF_CLASSES_KEY), + NewClasses = lists:delete(Class, Classes), + ?ets_insert(Admin, {?LIST_OF_CLASSES_KEY, NewClasses}), + ?ets_delete(Admin, Class), + ok + end, + {reply,Reply,Admin}; + +handle_call({handle_dmodify,Application},_From,Admin) -> + [{_, Classes}] = ?ets_lookup(Admin, ?LIST_OF_CLASSES_KEY), + modify(Application, Classes, Admin), + {reply,ok,Admin}; + +handle_call({handle_dump_first,DumpDir},_From,Admin) -> + case ?ets_lookup(Admin,?DUMPING_FLAG_KEY) of + [{_,true}] -> + {reply,already_dumping,Admin}; + _ -> + phys_remove_ok(DumpDir), + [{_,Classes}] = ?ets_lookup(Admin,?LIST_OF_CLASSES_KEY), + Tables = dump_prepare_classes(Classes,Admin), + ?ets_insert(Admin,{?DUMPING_FLAG_KEY,true}), + %% this is the new dir for dumping: + ?ets_insert(Admin,{?DUMP_DIRECTORY_KEY,DumpDir}), + handle_dump_next({[{admin,Classes}|Tables]},0,Admin) + end; + +%% All done, good work! +handle_call({handle_dump_next,Ticket,Count},_From,Admin) -> + handle_dump_next(Ticket,Count,Admin); + +handle_call(stop,_From,Admin) -> + ?ets_delete(Admin), % Make sure table is gone before reply is sent. + {stop, normal, ok, []}. + +handle_info({'EXIT',_Pid,_Reason},Admin) -> + {stop,normal,Admin}. + +handle_delete(Class, Key, Admin) -> + handle_call({handle_delete,Class,Key},from,Admin). + +handle_insert(Class, Key, Value, Admin) -> + handle_call({handle_insert,Class,Key,Value},from,Admin). + +handle_lookup(Class, Key, Admin) -> + handle_call({handle_lookup,Class,Key},from,Admin). + + +handle_dump_next({[]},_Count,Admin) -> + [{_Key,DumpDir}] = ?ets_lookup(Admin,?DUMP_DIRECTORY_KEY), + phys_ok_dump(DumpDir), + ?ets_insert(Admin,{?DUMPING_FLAG_KEY,false}), + {reply,done,Admin}; + +%% No more operations, return to user asking for more +handle_dump_next(Ticket,0,Admin) -> + {reply,{dump_more,Ticket},Admin}; + +%% Dump the admin table. Costs one dump-work unit. +handle_dump_next({[{admin,Classes}|Tables]},Count,Admin) -> + [{_Key,DumpDir}] = ?ets_lookup(Admin,?DUMP_DIRECTORY_KEY), + DumpData = phys_init_dump(admin,DumpDir,0), + phys_dump({?LIST_OF_CLASSES_KEY,Classes},DumpData), + phys_finish_dump(DumpData), + handle_dump_next({Tables},Count-1,Admin); + +%% Pick out a class and start dumping it +handle_dump_next({[{Class,Mtab}|Tables]},Count,Admin) -> + ?DEBUG(io:format("DUMP CLASS ~w\n",[Class])), + [{_Key,DumpDir}] = ?ets_lookup(Admin,?DUMP_DIRECTORY_KEY), + DumpData = phys_init_dump(Class,DumpDir,length(Tables)+1), + First = ?ets_first(Mtab), + handle_dump_next({Class,Tables,Mtab,First,DumpData},Count,Admin); + +%% All keys in this class have been written to disk, now we have to +%% copy all items from temporary Ttab to main Mtab +handle_dump_next({Class,Tables,Stab,'$end_of_table',DumpData},Count,Admin) -> + phys_finish_dump(DumpData), + ?DEBUG(io:format("Cleaning up temporary table in ~p\n",[Class])), + case ?ets_lookup(Admin,Class) of + [{Key,[Utab,Mtab]}] -> + Ttab = make_db_table(db_name(Admin),Class), + ?ets_insert(Admin,{Key,[Ttab,Utab,Mtab]}), + First = ?ets_first(Utab), + handle_dump_next({3,Class,Tables,Utab,First,Mtab},Count,Admin); + _Other -> + %% Class deleted (and maybe recreated) while dumping, no need to + %% bring this one up to date. Just discard late additions. + ?ets_delete(Stab), + handle_dump_next({Tables},Count,Admin) + end; + +%% Dumping one key to disk. Costs one dump-work unit. +handle_dump_next({Class,Tables,Tab,Key,DumpData},Count,Admin) -> + [KeyVal] = ?ets_lookup(Tab,Key), + phys_dump(KeyVal,DumpData), + NextKey = ?ets_next(Tab,Key), + handle_dump_next({Class,Tables,Tab,NextKey,DumpData},Count-1,Admin); + +%% Done copying elements from Ttab to Mtab +%% check if Utab is empty and go on with next class, or +%% make Utab the current Ttab, and run again +%% ... will this ever end? ;-) +handle_dump_next({3,Class,Tables,Stab,'$end_of_table',Dtab},Count,Admin) -> + case ?ets_lookup(Admin,Class) of + [{Key,[Ttab,Utab,Mtab]}] -> + case ?ets_info(Ttab,size) of + 0 -> + ?ets_insert(Admin,{Key,[Mtab]}), + ?ets_delete(Ttab), + ?ets_delete(Utab), + handle_dump_next({Tables},Count,Admin); + _Work -> + ?DEBUG(io:format("Switching direction in ~p\n",[Class])), + %% Which is faster, deleting all the entries + %% in a table, or deleting it and create a new? + ?ets_delete(Utab), + Ntab = make_db_table(db_name(Admin),Class), + ?ets_insert(Admin,{Key,[Ntab,Ttab,Mtab]}), + First = ?ets_first(Ttab), + handle_dump_next({3,Class,Tables,Ttab,First,Mtab}, + Count,Admin) + end; + _Other -> + %% Class deleted (and maybe recreated) while dumping, no need to + %% bring this one up to date. Just discard late additions. + ?ets_delete(Stab), + ?ets_delete(Dtab), + handle_dump_next({Tables},Count,Admin) + end; + +%% Copy one key from Ttab to Mtab +%% costs one dump-work unit +handle_dump_next({3,Class,Tables,Stab,Key,Dtab},Count,Admin) -> + copy_dump_entry(Stab,Key,Dtab), + NextKey = ?ets_next(Stab,Key), + handle_dump_next({3,Class,Tables,Stab,NextKey,Dtab},Count-1,Admin). + +%%% INTERNAL HELPER FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%% admin_table_name(DbName) -> Name +%%% +%%% Returns the name of the admin table of the table DbName + +admin_table_name(DbName) -> + list_to_atom(lists:append(atom_to_list(DbName),"#admin")). + +%%% make_admin_table(DbName) -> EtsAdminTable +%%% +%%% Creates and registers an ETS Admin table + +make_admin_table(DbName) -> + ?ets_new(admin_table_name(DbName),[named_table,protected,db_type(DbName)]). + +%%% make_db_table(DbName,Name) -> EtsTable +%%% +%%% Creates an ETS database table + +make_db_table(DbName, Name) -> + ?ets_new(Name,[protected,db_type(DbName)]). + +db_name(Admin) -> + ets:lookup_element(Admin,?DB_NAME_KEY,2). + +db_type(DbName) -> + case ets:lookup(?GLOBAL_PARAMS, DbName) of + [] -> + set; + [{DbName,X}] -> + X + end. + +%%% table_lookup(Table,Key) -> +%%% table_lookup(TableList,Key) -> +%%% {def,{value,Value}} | {undef,undefined} | (erased,undefined} +%%% +%%% Looks up key in the table and returns it value, or undefined +%%% if there is no such key. +%%% If a list of tables is given, they are searched one after another +%%% for a matching key, until one is found. The search is discontinued +%%% if a record telling that the key was deleted is found. + +table_lookup([], _Key) -> + {undef,undefined}; +table_lookup([Table|Tables], Key) -> + case table_lookup(Table,Key) of + {_,undefined} -> + case ?ets_lookup(Table,?ERASE_MARK(Key)) of + [] -> + table_lookup(Tables,Key); + _Definition -> + %% The element has been deleted, don't look further! + %% Pretend we never saw anything.. + {erased,undefined} + end; + Answer -> + Answer + end; +table_lookup(Table, Key) -> + case ?ets_lookup(Table,Key) of + [] -> + {undef,undefined}; + [{_Key,Value}] -> + {def,{value,Value}} + end. + +%%% table_lookup_batch(Tables, Class, Cond) -> KeyList +%%% +%%% Extract the keys from a table or a table group. +%%% If a condition is supplied, it is on the form {Mod, Fun, ExtraArgs} +%%% and returns {true,Key} or false when called using +%%% apply(Mod, Fun, [Instance|ExtraArgs]). +%%% Instance is, for historic reasons, {{Class, Key}, Value} when the function +%%% is called. Cond = 'all' can be used to get all keys from a class. + +table_lookup_batch([],_Class,_Cond) -> + []; +table_lookup_batch([Table|Tables],Class,Cond) -> + table_lookup_batch([],Tables,Table,ets:first(Table),Class,Cond,[]). + +table_lookup_batch(_Passed,[],_,'$end_of_table',_Class,_Cond,Ack) -> + Ack; +table_lookup_batch(Passed,[NewTable|Tables],Table,'$end_of_table', + Class,Cond,Ack) -> + table_lookup_batch(lists:append(Passed,[Table]),Tables, + NewTable,ets:first(NewTable),Class,Cond,Ack); +table_lookup_batch(Passed,Tables,Table,?ERASE_MARK(Key),Class,Cond,Ack) -> + table_lookup_batch(Passed,Tables,Table,?ets_next(Table,?ERASE_MARK(Key)), + Class,Cond,Ack); + +table_lookup_batch(Passed,Tables,Table,Key,Class,Cond,Ack) -> + NewAck = + case table_lookup(Passed,Key) of + {undef,undefined} -> + [{_Key,Value}] = ?ets_lookup(Table,Key), + case Cond of % are there any conditions? + all -> + [Key|Ack]; + {M, F, A} -> + %% apply the condition test. + %% Applications need keys to consist of + %% {class, primkey}, so we make it that way + case apply(M, F, [{{Class, Key}, Value}|A]) of + {true, Key} -> [Key|Ack]; + false -> Ack + end + end; + _Other -> + %% Already processed (or erased) key + %% {def,{value,Value}} -> + %% {erased,undefined} -> + Ack + end, + table_lookup_batch(Passed,Tables,Table,?ets_next(Table,Key), + Class,Cond,NewAck). + +%%% modify(Application, ClassList, Admin) -> ok. +%%% +%%% This function modifies each element of the classes + +modify(_Application, [], _Admin) -> + ok; +modify(Application, [Class|Classes], Admin) -> + ?DEBUG(io:format("modifying class ~p\n", [Class])), + [{_,Tables}] = ?ets_lookup(Admin, Class), + modify_class(Application, Class, table_lookup_batch(Tables, Class, all), + Admin), + modify(Application, Classes, Admin). + +modify_class(_Application, _Class, [], _Admin) -> + ok; +modify_class({Mod, Fun, ExtraArgs}, Class, [Key|Keys], Admin) -> + {ok, {{value, Value}, _Admin}} = handle_lookup(Class, Key, Admin), + %% The applications think that a key consists of {class, primkey}, + %% so let them. + case apply(Mod,Fun,[{{Class, Key}, Value}|ExtraArgs]) of + {ok,{{NewClass, NewKey}, NewValue}} -> % The item is modified. + %% remove old instance, insert new + %% JALI could be optimized (we don't care about previous values), + %% but ets_delete/insert is *not* enough + handle_delete(Class, Key, Admin), + handle_insert(NewClass, NewKey, NewValue, Admin); + true -> % The item should be left as it is. + ok; + false -> % The item should be removed! + %% JALI could be optimized (we don't care about previous values), + %% but ets_delete is *not* enough + handle_delete(Class, Key, Admin) + end, + modify_class({Mod, Fun, ExtraArgs}, Class, Keys, Admin). + +%%% dump_prepare_classes(Classes,Admin) -> ok +%%% +%%% Create a Ttab for each class, and insert +%%% the new table order in Admin + +dump_prepare_classes(Classes,Admin) -> + ?DEBUG(io:format("DUMP CLASSES ~w\n",[Classes])), + dump_prepare_classes(Classes,Admin,[]). + +dump_prepare_classes([],_Admin,Ack) -> + Ack; +dump_prepare_classes([Class|Classes],Admin,Ack) -> + [{_Class,[Mtab]}] = ?ets_lookup(Admin,Class), + %% Only one table => we can prepare for dumping + %% In case there are several tables defined, dumping is + %% already (still) in progress for this class (database inconsistent) + Ttab = make_db_table(db_name(Admin),Class), + ?ets_insert(Admin,{Class,[Ttab,Mtab]}), + dump_prepare_classes(Classes,Admin,lists:append(Ack,[{Class,Mtab}])). + +%%% copy_dump_entry(SourceTable,Key,DestinationTable) -> NobodyCares +%%% +%%% Copies Key from SourceTable to DestinationTable. +%%% If Key is an erase record, then the corresponding entry is deleted +%%% from DestinationTable, if it should be (see Erasure during dump, above) + +copy_dump_entry(Stab,Key,Dtab) -> + ?DEBUG(io:format("Copying key ~p\n",[Key])), + case ?ets_lookup(Stab,Key) of + [{?ERASE_MARK(RealKey),_}] -> + %% Only erase if the entry RealKey hasn't been written again + case ?ets_lookup(Stab,RealKey) of + [] -> + %% No, it hasn't: we should delete + ?DEBUG(io:format("Erasing: ~p\n",[RealKey])), + ?ets_delete(Dtab,RealKey); + _Definition -> + %% It has, don't erase. In this case the new value + %% has already or will soon be written to Dtab + ok + end; + [KeyVal] -> + ?DEBUG(io:format("Forwarding: ~p\n",[KeyVal])), + ?ets_insert(Dtab,KeyVal) + end. + +%%% DUMP LOADING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +load_dump(DbName,DumpDir) -> + case phys_load_dump_ok(DumpDir) of + ok -> + Admin = make_admin_table(DbName), + ?ets_insert(Admin,{?DB_NAME_KEY,DbName}), + case phys_load_table(DumpDir,0,Admin) of + ok -> + load_dump2(DumpDir,Admin); + Other -> + load_dump_failed(Admin,[]), + {error,{load_dump1,Other}} + end; + Other -> + {error,{load_dump2,Other}} + end. + +load_dump2(DumpDir,Admin) -> + case ?ets_lookup(Admin,?LIST_OF_CLASSES_KEY) of + [{_Key,Classes}] -> + case load_dump_tables(DumpDir,Admin,Classes) of + ok -> + {ok, Admin}; + Other -> + io:format("Dumping failed: ~p\n",[Other]), + load_dump_failed(Admin,Classes) + end; + Other -> + io:format("Dumping failed2: ~p\n",[Other]), + load_dump_failed(Admin,[]) + end. + +load_dump_failed(Admin,[]) -> + ?ets_delete(Admin), + {error,load_dump_failed}; +load_dump_failed(Admin,[Class|Classes]) -> + case ?ets_lookup(Admin,Class) of + [{_Key,[Tab]}] -> + ?ets_delete(Tab); + _ -> + ok + end, + load_dump_failed(Admin,Classes). + +load_dump_tables(_DumpDir,_Admin,[]) -> + ok; +load_dump_tables(DumpDir,Admin,[Class|Classes]) -> + Mtab = make_db_table(db_name(Admin),Class), + ?ets_insert(Admin,{Class,[Mtab]}), + Num = length(Classes)+1, + case phys_load_table(DumpDir,Num,Mtab) of + ok -> + load_dump_tables(DumpDir,Admin,Classes); + Other -> + {error,{load_dump_failed,Other}} + end. + +%%% FILE ACCESS LAYER %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%% phys_init_dump(Class,DumpDir) -> DumpData + +phys_init_dump(Class,DumpDir,Num) -> + ?DEBUG(io:format("Opened ~p for writing\n",[Class])), + FileName = [DumpDir,"/etsdump.",integer_to_list(Num)], + {tag1,{ok,Fd}} = {tag1,file:open(FileName,write)}, + {Class,Fd}. + +%%% phys_finish_dump(DumpData) -> NobodyCares + +phys_finish_dump({_Class,Fd}) -> + ?DEBUG(io:format("Closed ~p\n",[_Class])), + phys_dump_term(Fd,ok), + file:close(Fd), % JALI: OTP P1D returns true instead of ok, so no check + ok. + +%%% phys_dump(KeyVal,DumpData) -> NobodyCares + +phys_dump({Key,Val},{_Class,Fd}) -> + ?DEBUG(io:format("To disk (~p.dump): {~p,~p}\n",[_Class,Key,Val])), + phys_dump_term(Fd,{Key,Val}), + ok. + +phys_dump_term(Fd,Term) -> + Bin = binary_to_list(term_to_binary(Term)), + {tag2,ok} = {tag2,io:put_chars(Fd,encode32(length(Bin)))}, + {tag3,ok} = {tag3,io:put_chars(Fd,Bin)}. + +%%% phys_ok_dump(DumpDir) -> NobodyCares + +phys_ok_dump(DumpDir) -> + ?DEBUG(io:format("Ok:ing dump dir ~s\n",[DumpDir])), + FileName = [DumpDir,"/ok"], + {tag4,{ok,Fd}} = {tag4,file:open(FileName,write)}, + {tag5,ok} = {tag5,io:format(Fd,"ok.\n",[])}, + file:close(Fd), % JALI: OTP P1D returns true instead of ok, so no check + ok. + +phys_remove_ok(DumpDir) -> + ?DEBUG(io:format("Removing any Ok in dump dir ~s\n",[DumpDir])), + FileName = [DumpDir,"/ok"], + %% don't care if delete returns ok, file probably doesn't exist + file:delete(FileName), + ok. + +phys_load_dump_ok(DumpDir) -> + FileName = [DumpDir,"/ok"], + case file:consult(FileName) of + {ok,[ok]} -> + ok; + Other -> + {error,{consult_error,Other}} + end. + +phys_load_table(DumpDir,N,Tab) -> + ?DEBUG(io:format("LOAD TABLE ~w\n",[N])), + FileName = [DumpDir,"/etsdump.",integer_to_list(N)], + case file:open(FileName,read) of + {ok,Fd} -> + phys_load_entries(Fd,Tab); + Other -> + {error,{open_error,Other}} + end. + +phys_load_entries(Fd,Tab) -> + case phys_read_len(Fd) of + {ok,Len} -> + case phys_read_entry(Fd,Len) of + {ok,ok} -> + ok; + {ok,{Key,Val}} -> + ?ets_insert(Tab,{Key,Val}), + phys_load_entries(Fd,Tab); + Other -> + {error,{read_len,Other}} + end; + Other -> + {error,{read_len2,Other}} + end. + +phys_read_len(Fd) -> + case io:get_chars(Fd,'',4) of + [A,B,C,D] -> + {ok,decode32(A,B,C,D)}; + Other -> + {error,{decode,Other}} + end. + +phys_read_entry(Fd,Len) -> + case io:get_chars(Fd,'',Len) of + L when list(L), length(L) == Len -> + {ok,binary_to_term(list_to_binary(L))}; + Other -> + {error,{read_term,Other}} + end. + +encode32(N) -> + [(N bsr 24) band 255, + (N bsr 16) band 255, + (N bsr 8) band 255, + N band 255]. + +decode32(A,B,C,D) -> + (A bsl 24) bor (B bsl 16) bor (C bsl 8) bor D. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/filelib_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/filelib_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/filelib_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/filelib_SUITE.erl 2009-11-20 13:32:07.000000000 +0000 @@ -0,0 +1,241 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(filelib_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + wildcard_one/1,wildcard_two/1,wildcard_errors/1, + fold_files/1,otp_5960/1]). + +-import(lists, [foreach/2]). + +-include("test_server.hrl"). +-include_lib("kernel/include/file.hrl"). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?t:minutes(5)), + [{watchdog,Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + [wildcard_one,wildcard_two,wildcard_errors,fold_files,otp_5960]. + +wildcard_one(Config) when is_list(Config) -> + ?line {ok,OldCwd} = file:get_cwd(), + ?line Dir = filename:join(?config(priv_dir, Config), "wildcard_one"), + ?line ok = file:make_dir(Dir), + ?line file:set_cwd(Dir), + ?line do_wildcard_1(Dir, fun(Wc) -> filelib:wildcard(Wc) end), + ?line file:set_cwd(OldCwd), + ?line ok = file:del_dir(Dir), + ok. + +wildcard_two(Config) when is_list(Config) -> + ?line Dir = filename:join(?config(priv_dir, Config), "wildcard_two"), + ?line ok = file:make_dir(Dir), + ?line do_wildcard_1(Dir, fun(Wc) -> filelib:wildcard(Wc, Dir) end), + ?line do_wildcard_1(Dir, fun(Wc) -> filelib:wildcard(Wc, Dir++"/") end), + case os:type() of + {win32,_} -> + ok; + _ -> + ?line do_wildcard_1(Dir, fun(Wc) -> filelib:wildcard(Wc, "//"++Dir) end) + end, + ?line ok = file:del_dir(Dir), + ok. + +wildcard_errors(Config) when is_list(Config) -> + ?line wcc("{", missing_delimiter), + ?line wcc("{a", missing_delimiter), + ?line wcc("{a,", missing_delimiter), + ?line wcc("{a,b", missing_delimiter), + ok. + +wcc(Wc, Error) -> + {'EXIT',{{badpattern,Error}, + [{filelib,compile_wildcard,1}|_]}} = (catch filelib:compile_wildcard(Wc)), + {'EXIT',{{badpattern,Error}, + [{filelib,wildcard,1}|_]}} = (catch filelib:wildcard(Wc)), + {'EXIT',{{badpattern,Error}, + [{filelib,wildcard,2}|_]}} = (catch filelib:wildcard(Wc, ".")). + +do_wildcard_1(Dir, Wcf0) -> + do_wildcard_2(Dir, Wcf0), + Wcf = fun(Wc0) -> + Wc = filename:join(Dir, Wc0), + L = Wcf0(Wc), + [subtract_dir(N, Dir) || N <- L] + end, + do_wildcard_2(Dir, Wcf). + +subtract_dir([C|Cs], [C|Dir]) -> subtract_dir(Cs, Dir); +subtract_dir("/"++Cs, []) -> Cs. + +do_wildcard_2(Dir, Wcf) -> + %% Basic wildcards. + All = ["abc","abcdef","glurf"], + ?line Files = mkfiles(lists:reverse(All), Dir), + ?line All = Wcf("*"), + ?line ["abc","abcdef"] = Wcf("a*"), + ?line ["abc","abcdef"] = Wcf("abc*"), + ?line ["abcdef"] = Wcf("abc???"), + ?line ["abcdef"] = Wcf("abcd*"), + ?line ["abcdef"] = Wcf("*def"), + ?line ["abcdef","glurf"] = Wcf("{*def,gl*}"), + ?line ["abc","abcdef"] = Wcf("a*{def,}"), + ?line ["abc","abcdef"] = Wcf("a*{,def}"), + + %% Negative tests. + ?line [] = Wcf("b*"), + ?line [] = Wcf("bufflig"), + + ?line del(Files), + do_wildcard_3(Dir, Wcf). + +do_wildcard_3(Dir, Wcf) -> + %% Some character sets. + All = ["a01","a02","a03","b00","c02","d19"], + ?line Files = mkfiles(lists:reverse(All), Dir), + ?line All = Wcf("[a-z]*"), + ?line All = Wcf("[a-d]*"), + ?line All = Wcf("[adbc]*"), + ?line All = Wcf("?[0-9][0-9]"), + ?line All = Wcf("?[0-1][0-39]"), + ?line All = Wcf("[abcdefgh][10][01239]"), + ?line ["a01","a02","a03","b00","c02"] = Wcf("[a-z]0[0-3]"), + ?line [] = Wcf("?[a-z][0-39]"), + ?line del(Files), + do_wildcard_4(Dir, Wcf). + +do_wildcard_4(Dir, Wcf) -> + %% More character sets: tricky characters. + All = ["a-","aA","aB","aC","a[","a]"], + ?line Files = mkfiles(lists:reverse(All), Dir), + ?line All = Wcf("a[][A-C-]"), + ?line del(Files), + do_wildcard_5(Dir, Wcf). + +do_wildcard_5(Dir, Wcf) -> + Dirs = ["xa","blurf","yyy"], + ?line foreach(fun(D) -> ok = file:make_dir(filename:join(Dir, D)) end, Dirs), + All = ["blurf/nisse","xa/arne","xa/kalle","yyy/arne"], + ?line Files = mkfiles(lists:reverse(All), Dir), + + %% Test. + ?line All = Wcf("*/*"), + ?line ["blurf/nisse","xa/arne","xa/kalle"] = Wcf("{blurf,xa}/*"), + ?line ["xa/arne","yyy/arne"] = Wcf("*/arne"), + ?line ["blurf/nisse"] = Wcf("*/nisse"), + ?line [] = Wcf("mountain/*"), + ?line [] = Wcf("xa/gurka"), + + %% Cleanup + ?line del(Files), + ?line foreach(fun(D) -> ok = file:del_dir(filename:join(Dir, D)) end, Dirs). + + + +fold_files(Config) when is_list(Config) -> + ?line Dir = filename:join(?config(priv_dir, Config), "fold_files"), + ?line ok = file:make_dir(Dir), + ?line Dirs = [filename:join(Dir, D) || D <- ["blurf","blurf/blarf"]], + ?line foreach(fun(D) -> ok = file:make_dir(D) end, Dirs), + All = ["fb.txt","ko.txt", + "blurf/nisse.text","blurf/blarf/aaa.txt","blurf/blarf/urfa.txt"], + ?line Files = mkfiles(lists:reverse(All), Dir), + + %% Test. + ?line Files0 = filelib:fold_files(Dir, "^", false, + fun(H, T) -> [H|T] end, []), + ?line same_lists(["fb.txt","ko.txt"], Files0, Dir), + + ?line Files1 = filelib:fold_files(Dir, "^", true, + fun(H, T) -> [H|T] end, []), + ?line same_lists(All, Files1, Dir), + + ?line Files2 = filelib:fold_files(Dir, "[.]text$", true, + fun(H, T) -> [H|T] end, []), + ?line same_lists(["blurf/nisse.text"], Files2, Dir), + + + ?line Files3 = filelib:fold_files(Dir, "^..[.]", true, + fun(H, T) -> [H|T] end, []), + ?line same_lists(["fb.txt","ko.txt"], Files3, Dir), + + ?line Files4 = filelib:fold_files(Dir, "^ko[.]txt$", true, + fun(H, T) -> [H|T] end, []), + ?line same_lists(["ko.txt"], Files4, Dir), + ?line Files4 = filelib:fold_files(Dir, "^ko[.]txt$", false, + fun(H, T) -> [H|T] end, []), + + ?line [] = filelib:fold_files(Dir, "^$", true, + fun(H, T) -> [H|T] end, []), + + %% Cleanup + ?line del(Files), + ?line foreach(fun(D) -> ok = file:del_dir(D) end, lists:reverse(Dirs)), + ?line ok = file:del_dir(Dir). + +same_lists(Expected0, Actual0, BaseDir) -> + Expected = [filename:absname(N, BaseDir) || N <- lists:sort(Expected0)], + Actual = lists:sort(Actual0), + Expected = Actual. + +mkfiles([H|T], Dir) -> + Name = filename:join(Dir, H), + Garbage = [31+random:uniform(95) || _ <- lists:seq(1, random:uniform(1024))], + file:write_file(Name, Garbage), + [Name|mkfiles(T, Dir)]; +mkfiles([], _) -> []. + +del([H|T]) -> + ok = file:delete(H), + del(T); +del([]) -> ok. + +otp_5960(suite) -> + []; +otp_5960(doc) -> + ["Test that filelib:ensure_dir/1 returns ok or {error,Reason}"]; +otp_5960(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line Dir = filename:join(PrivDir, otp_5960_dir), + ?line Name1 = filename:join(Dir, name1), + ?line Name2 = filename:join(Dir, name2), + ?line ok = filelib:ensure_dir(Name1), % parent is created + ?line ok = filelib:ensure_dir(Name2), % parent already exists + ?line Name3 = filename:join(Name1, name3), + ?line {ok, FileInfo} = file:read_file_info(Dir), + case os:type() of + {win32,_} -> + %% Not possibly to write protect directories on Windows + %% (at least not using file:write_file_info/2). + ok; + _ -> + ?line Mode = FileInfo#file_info.mode, + ?line NoWriteMode = Mode - 8#00200 - 8#00020 - 8#00002, + ?line ok = file:write_file_info(Dir, #file_info{mode=NoWriteMode}), + ?line {error, _} = filelib:ensure_dir(Name3), + ?line ok = file:write_file_info(Dir, #file_info{mode=Mode}), + ok + end. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/filename_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/filename_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/filename_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/filename_SUITE.erl 2009-11-20 13:30:07.000000000 +0000 @@ -0,0 +1,459 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(filename_SUITE). +-export([all/1]). +-export([absname/1, absname_2/1, + basename_1/1, basename_2/1, + dirname/1, extension/1, join/1, t_nativename/1]). +-export([pathtype/1,rootname/1,split/1,find_src/1]). +-include("test_server.hrl"). + +all(suite) -> + [absname, absname_2, basename_1, basename_2, dirname, + extension, + join, pathtype, rootname, split, t_nativename, find_src]. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +absname(Config) when is_list(Config) -> + case os:type() of + {win32, _} -> + ?line [Drive|_] = ?config(priv_dir, Config), + ?line Temp = filename:join([Drive|":/"], "temp"), + ?line case file:make_dir(Temp) of + ok -> ok; + {error,eexist} -> ok + end, + ?line {ok,Cwd} = file:get_cwd(), + ?line ok = file:set_cwd(Temp), + ?line [Drive|":/temp/foo"] = filename:absname(foo), + ?line [Drive|":/temp/foo"] = filename:absname("foo"), + ?line [Drive|":/temp/../ebin"] = filename:absname("../ebin"), + ?line [Drive|":/erlang"] = filename:absname("/erlang"), + ?line [Drive|":/erlang/src"] = filename:absname("/erlang/src"), + ?line [Drive|":/erlang/src"] = filename:absname("\\erlang\\src"), + ?line [Drive|":/temp/erlang"] = filename:absname([Drive|":erlang"]), + ?line [Drive|":/temp/erlang/src"] = + filename:absname([Drive|":erlang/src"]), + ?line [Drive|":/temp/erlang/src"] = + filename:absname([Drive|":erlang\\src\\"]), + ?line "a:/erlang" = filename:absname("a:erlang"), + + ?line file:set_cwd([Drive|":/"]), + ?line [Drive|":/foo"] = filename:absname(foo), + ?line [Drive|":/foo"] = filename:absname("foo"), + ?line [Drive|":/../ebin"] = filename:absname("../ebin"), + ?line [Drive|":/erlang"] = filename:absname("/erlang"), + ?line [Drive|":/erlang/src"] = filename:absname("/erlang/src"), + ?line [Drive|":/erlang/src"] = filename:absname(["/erlang",'/src']), + ?line [Drive|":/erlang/src"] = filename:absname("\\erlang\\\\src"), + ?line [Drive|":/erlang"] = filename:absname([Drive|":erlang"]), + ?line [Drive|":/erlang/src"] = filename:absname([Drive|":erlang/src"]), + ?line "a:/erlang" = filename:absname("a:erlang"), + + ?line file:set_cwd(Cwd), + ok; + {unix, _} -> + ?line ok = file:set_cwd("/usr"), + ?line "/usr/foo" = filename:absname(foo), + ?line "/usr/foo" = filename:absname("foo"), + ?line "/usr/../ebin" = filename:absname("../ebin"), + + ?line file:set_cwd("/"), + ?line "/foo" = filename:absname(foo), + ?line "/foo" = filename:absname("foo"), + ?line "/../ebin" = filename:absname("../ebin"), + ?line "/erlang" = filename:absname("/erlang"), + ?line "/erlang/src" = filename:absname("/erlang/src"), + ?line "/erlang/src" = filename:absname(["/erl",'ang/s',"rc"]), + ?line "/erlang/src" = filename:absname(["/erl",'a','ng',"/",'s',"rc"]), + ?line "/erlang/src" = filename:absname("/erlang///src"), + ?line "/file_sorter.erl" = filename:absname([file_sorter|'.erl']), + ok; + vxworks -> + Test_dir = ?config(priv_dir, Config), + Test1 = Test_dir ++ "/foo", + Test2 = Test_dir ++ "/ebin", + ?line ok = file:set_cwd(Test_dir), + ?line Test1 = filename:absname(foo), + ?line Test1= filename:absname("foo"), + ?line Test2 = filename:absname("foo/../ebin"), + ?line "/erlang" = filename:absname("/erlang"), + ?line "/erlang/src" = filename:absname("/erlang/src"), + ?line "/erlang/src" = filename:absname(["/erlan",'g/s',"rc"]), + ?line "/erlang/src" = filename:absname("/erlang///src"), + ok + end. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +absname_2(Config) when is_list(Config) -> + case os:type() of + {win32, _} -> + ?line [Drive|_] = ?config(priv_dir, Config), + ?line [Drive|":/temp/foo"] = filename:absname(foo, [Drive|":/temp"]), + ?line [Drive|":/temp/foo"] = filename:absname("foo", [Drive|":/temp"]), + ?line [Drive|":/temp/../ebin"] = filename:absname("../ebin", + [Drive|":/temp"]), + ?line [Drive|":/erlang"] = filename:absname("/erlang", [Drive|":/temp"]), + ?line [Drive|":/erlang/src"] = filename:absname("/erlang/src", + [Drive|":/temp"]), + ?line [Drive|":/erlang/src"] = filename:absname("\\erlang\\src", + [Drive|":/temp"]), + ?line [Drive|":/temp/erlang"] = filename:absname([Drive|":erlang"], + [Drive|":/temp"]), + ?line [Drive|":/temp/erlang/src"] = filename:absname([Drive|":erlang/src"], + [Drive|":/temp"]), + ?line [Drive|":/temp/erlang/src"] = + filename:absname([Drive|":erlang\\src\\"], [Drive|":/temp"]), + ?line "a:/erlang" = filename:absname("a:erlang", [Drive|":/temp"]), + + ?line file:set_cwd([Drive|":/"]), + ?line [Drive|":/foo"] = filename:absname(foo, [Drive|":/"]), + ?line [Drive|":/foo"] = filename:absname("foo", [Drive|":/"]), + ?line [Drive|":/../ebin"] = filename:absname("../ebin", [Drive|":/"]), + ?line [Drive|":/erlang"] = filename:absname("/erlang", [Drive|":/"]), + ?line [Drive|":/erlang/src"] = filename:absname("/erlang/src", + [Drive|":/"]), + ?line [Drive|":/erlang/src"] = filename:absname("\\erlang\\\\src", + [Drive|":/"]), + ?line [Drive|":/erlang"] = filename:absname([Drive|":erlang"], + [Drive|":/"]), + ?line [Drive|":/erlang/src"] = filename:absname([Drive|":erlang/src"], + [Drive|":/"]), + ?line "a:/erlang" = filename:absname("a:erlang", [Drive|":/"]), + + ok; + {unix, _} -> + ?line "/usr/foo" = filename:absname(foo, "/usr"), + ?line "/usr/foo" = filename:absname("foo", "/usr"), + ?line "/usr/../ebin" = filename:absname("../ebin", "/usr"), + + ?line "/foo" = filename:absname(foo, "/"), + ?line "/foo" = filename:absname("foo", "/"), + ?line "/../ebin" = filename:absname("../ebin", "/"), + ?line "/erlang" = filename:absname("/erlang", "/"), + ?line "/erlang/src" = filename:absname("/erlang/src", "/"), + ?line "/erlang/src" = filename:absname("/erlang///src", "/"), + ok; + vxworks -> + ?line "/usr/foo" = filename:absname(foo, "/usr"), + ?line "/usr/foo" = filename:absname("foo", "/usr"), + ?line "/usr/ebin" = filename:absname("../ebin", "/usr"), + ?line "/usr/ebin" = filename:absname("../ebin", "/usr/src"), + ?line "/erlang" = filename:absname("/erlang", "/usr"), + ?line "/erlang/src" = filename:absname("/erlang/src", "/usr"), + ?line "/erlang/src" = filename:absname("/erlang///src", "/usr"), + ok + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +basename_1(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line "." = filename:basename("."), + ?line "foo" = filename:basename("foo"), + ?line "foo" = filename:basename("/usr/foo"), + ?line "foo.erl" = filename:basename("A:usr/foo.erl"), + ?line "foo" = filename:basename('/usr/foo'), + ?line "foo" = filename:basename(["/usr","/","f","o","o"]), + ?line "foo" = filename:basename(["/usr/",foo]), + ?line "foo" = filename:basename(["/usr/f",oo]), + ?line "foo" = filename:basename(["usr/", "foo"]), + ?line "foo" = filename:basename(["usr/"|foo]), + ?line "foo" = filename:basename(["usr/foo/"]), + ?line case os:type() of + {win32, _} -> + ?line "foo" = filename:basename(["usr\\foo\\"]), + ?line "foo" = filename:basename("A:\\usr\\foo"), + ?line "foo" = filename:basename("A:foo"); + {unix, _} -> + ?line "strange\\but\\true" = + filename:basename("strange\\but\\true"); + vxworks -> + ?line "foo" = filename:basename(["usr\\foo\\"]), + ?line "foo" = filename:basename("elrond:usr\\foo\\"), + ?line "foo" = filename:basename("disk:/foo") + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +basename_2(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + ?line "." = filename:basename(".", ".erl"), + ?line "foo" = filename:basename("foo.erl", ".erl"), + ?line "foo" = filename:basename('foo.erl', ".erl"), + ?line "foo" = filename:basename("foo.erl", '.erl'), + ?line "foo" = filename:basename(["/usr","/","f","oo"], ".erl"), + ?line "foo.erl" = filename:basename("/usr/foo.erl", ".hrl"), + ?line "foo.erl" = filename:basename("/usr.hrl/foo.erl", ".hrl"), + ?line "foo" = filename:basename("/usr.hrl/foo", ".hrl"), + ?line "foo" = filename:basename("usr/foo/", ".erl"), + ?line "foo.erl" = filename:basename("usr/foo.erl/", ".erl"), + ?line "foo.erl" = filename:basename("usr/foo.erl/", '.erl'), + ?line "foo" = filename:basename(["/usr",'/','f','oo'], ".erl"), + ?line "foo.erl" = filename:basename(["usr/foo.e",'rl/'], ".erl"), + ?line case os:type() of + {win32, _} -> + ?line "foo" = filename:basename("A:foo", ".erl"), + ?line "foo.erl" = filename:basename("a:\\usr\\foo.erl", + ".hrl"), + ?line "foo.erl" = filename:basename("c:\\usr.hrl\\foo.erl", + ".hrl"), + ?line "foo" = filename:basename("A:\\usr\\foo", ".hrl"); + {unix, _} -> + ?line "strange\\but\\true" = + filename:basename("strange\\but\\true.erl", ".erl"), + ?line "strange\\but\\true" = + filename:basename("strange\\but\\true", ".erl"); + vxworks -> + ?line "foo" = filename:basename("net:foo", ".erl"), + ?line "foo.erl" = filename:basename("net:\\usr\\foo.erl", + ".hrl"), + ?line "foo.erl" = + filename:basename("/disk0:\\usr.hrl\\foo.erl", + ".hrl"), + ?line "foo" = filename:basename("/home\\usr\\foo", ".hrl") + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +dirname(Config) when is_list(Config) -> + case os:type() of + {win32,_} -> + ?line "A:/usr" = filename:dirname("A:/usr/foo.erl"), + ?line "A:usr" = filename:dirname("A:usr/foo.erl"), + ?line "/usr" = filename:dirname("\\usr\\foo.erl"), + ?line "/" = filename:dirname("\\usr"), + ?line "A:" = filename:dirname("A:"); + vxworks -> + ?line "net:/usr" = filename:dirname("net:/usr/foo.erl"), + ?line "/disk0:/usr" = filename:dirname("/disk0:/usr/foo.erl"), + ?line "/usr" = filename:dirname("\\usr\\foo.erl"), + ?line "/usr" = filename:dirname("\\usr"), + ?line "net:" = filename:dirname("net:"); + _ -> true + end, + ?line "usr" = filename:dirname("usr///foo.erl"), + ?line "." = filename:dirname("foo.erl"), + ?line "." = filename:dirname("."), + ?line "usr" = filename:dirname('usr/foo.erl'), + ?line "usr" = filename:dirname(['usr','/foo.erl']), + ?line "usr" = filename:dirname(['us','r/foo.erl']), + ?line "usr" = filename:dirname(['usr/','/foo.erl']), + ?line "usr" = filename:dirname(['usr/','foo.erl']), + ?line "usr" = filename:dirname(['usr/'|'foo.erl']), + ?line "usr" = filename:dirname(['usr/f','oo.erl']), + case os:type() of + vxworks -> + ?line "/" = filename:dirname("/"), + ?line "/usr" = filename:dirname("/usr"); + _ -> + ?line "/" = filename:dirname("/"), + ?line "/" = filename:dirname("/usr") + end, + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +extension(Config) when is_list(Config) -> + ?line ".erl" = filename:extension("A:/usr/foo.erl"), + ?line ".erl" = filename:extension("A:/usr/foo.nisse.erl"), + ?line ".erl" = filename:extension(["A:/usr/", 'foo.ni', "sse.erl"]), + ?line ".erl" = filename:extension(["A:/usr/", 'foo.ni', "sse.e", 'rl']), + ?line ".erl" = filename:extension(["A:/usr/", 'foo.ni', "sse.e"|'rl']), + ?line ".erl" = filename:extension("A:/usr.bar/foo.nisse.erl"), + ?line "" = filename:extension("A:/usr.bar/foo"), + ?line "" = filename:extension("A:/usr/foo"), + ?line case os:type() of + {win32, _} -> + ?line "" = filename:extension("A:\\usr\\foo"), + ?line ".erl" = + filename:extension("A:/usr.bar/foo.nisse.erl"), + ?line "" = filename:extension("A:/usr.bar/foo"), + ok; + vxworks -> + ?line "" = filename:extension("/disk0:\\usr\\foo"), + ?line ".erl" = + filename:extension("net:/usr.bar/foo.nisse.erl"), + ?line "" = filename:extension("net:/usr.bar/foo"), + ok; + _ -> ok + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +join(Config) when is_list(Config) -> + ?line "/" = filename:join(["/"]), + ?line "/" = filename:join(["//"]), + ?line "usr/foo.erl" = filename:join("usr","foo.erl"), + ?line "/src/foo.erl" = filename:join(usr, "/src/foo.erl"), + ?line "/src/foo.erl" = filename:join(["/src/",'foo.erl']), + ?line "/src/foo.erl" = filename:join(usr, ["/sr", 'c/foo.erl']), + ?line "/src/foo.erl" = filename:join("usr", "/src/foo.erl"), + + %% Make sure that redundant slashes work too. + ?line "a/b/c/d/e/f/g" = filename:join(["a//b/c/////d//e/f/g"]), + ?line "a/b/c/d/e/f/g" = filename:join(["a//b/c/", "d//e/f/g"]), + ?line "a/b/c/d/e/f/g" = filename:join(["a//b/c", "d//e/f/g"]), + ?line "/d/e/f/g" = filename:join(["a//b/c", "/d//e/f/g"]), + ?line "/d/e/f/g" = filename:join(["a//b/c", "//d//e/f/g"]), + + ?line "foo/bar" = filename:join([$f,$o,$o,$/,[]], "bar"), + + ?line case os:type() of + {win32, _} -> + ?line "d:/" = filename:join(["D:/"]), + ?line "d:/" = filename:join(["D:\\"]), + ?line "d:/abc" = filename:join(["D:/", "abc"]), + ?line "d:abc" = filename:join(["D:", "abc"]), + ?line "a/b/c/d/e/f/g" = + filename:join(["a//b\\c//\\/\\d/\\e/f\\g"]), + ?line "a:usr/foo.erl" = + filename:join(["A:","usr","foo.erl"]), + ?line "/usr/foo.erl" = + filename:join(["A:","/usr","foo.erl"]), + ?line "c:usr" = filename:join("A:","C:usr"), + ?line "a:usr" = filename:join("A:","usr"), + ?line "c:/usr" = filename:join("A:", "C:/usr"), + ?line "c:/usr/foo.erl" = + filename:join(["A:","C:/usr","foo.erl"]), + ?line "c:usr/foo.erl" = + filename:join(["A:","C:usr","foo.erl"]), + ?line "d:/foo" = filename:join([$D, $:, $/, []], "foo"), + ok; + vxworks -> + ?line "Net:" = filename:join(["Net:/"]), + ?line "net:" = filename:join(["net:\\"]), + ?line "net:/abc" = filename:join(["net:/", "abc"]), + ?line "net:/abc" = filename:join(["net:", "abc"]), + ?line "a/b/c/d/e/f/g" = + filename:join(["a//b\\c//\\/\\d/\\e/f\\g"]), + ?line "net:/usr/foo.erl" = + filename:join(["net:","usr","foo.erl"]), + ?line "/usr/foo.erl" = + filename:join(["net:","/usr","foo.erl"]), + ?line "/target:usr" = filename:join("net:","/target:usr"), + ?line "kernel:/usr" = filename:join("net:", "kernel:/usr"), + ?line "foo:/usr/foo.erl" = + filename:join(["A:","foo:/usr","foo.erl"]), + ?line "/disk0:usr/foo.erl" = + filename:join(["kalle:","/disk0:usr","foo.erl"]), + ?line "D:/foo" = filename:join([$D, $:, $/, []], "foo"), + ok; + {unix, _} -> + ok + end. + +pathtype(Config) when is_list(Config) -> + ?line relative = filename:pathtype(".."), + ?line relative = filename:pathtype("foo"), + ?line relative = filename:pathtype("foo/bar"), + ?line relative = filename:pathtype('foo/bar'), + ?line relative = filename:pathtype(['f','oo',"/bar"]), + case os:type() of + {win32, _} -> + ?line volumerelative = filename:pathtype("/usr/local/bin"), + ?line volumerelative = filename:pathtype("A:usr/local/bin"), + ok; + {unix, _} -> + ?line absolute = filename:pathtype("/"), + ?line absolute = filename:pathtype("/usr/local/bin"), + ok; + vxworks -> + ?line absolute = filename:pathtype("/usr/local/bin"), + ?line absolute = filename:pathtype("net:usr/local/bin"), + ok + end. + +rootname(Config) when is_list(Config) -> + ?line "/jam.src/kalle" = filename:rootname("/jam.src/kalle"), + ?line "/jam.src/foo" = filename:rootname("/jam.src/foo.erl"), + ?line "/jam.src/foo" = filename:rootname(["/ja",'m.sr',"c/foo.erl"]), + ?line "/jam.src/foo" = filename:rootname("/jam.src/foo.erl", ".erl"), + ?line "/jam.src/foo.jam" = filename:rootname("/jam.src/foo.jam", ".erl"), + ?line "/jam.src/foo.jam" = filename:rootname(["/jam.sr",'c/foo.j',"am"],".erl"), + ?line "/jam.src/foo.jam" = filename:rootname(["/jam.sr",'c/foo.j'|am],".erl"), + ok. + +split(Config) when is_list(Config) -> + case os:type() of + vxworks -> + ?line ["/usr","local","bin"] = filename:split("/usr/local/bin"); + _ -> + ?line ["/","usr","local","bin"] = filename:split("/usr/local/bin") + end, + ?line ["foo","bar"]= filename:split("foo/bar"), + ?line ["foo", "bar", "hello"]= filename:split("foo////bar//hello"), + ?line ["foo", "bar", "hello"]= filename:split(["foo//",'//bar//h',"ello"]), + ?line ["foo", "bar", "hello"]= filename:split(["foo//",'//bar//h'|ello]), + case os:type() of + {win32,_} -> + ?line ["a:/","msdev","include"] = + filename:split("a:/msdev/include"), + ?line ["a:/","msdev","include"] = + filename:split("A:/msdev/include"), + ?line ["msdev","include"] = + filename:split("msdev\\include"), + ?line ["a:/","msdev","include"] = + filename:split("a:\\msdev\\include"), + ?line ["a:","msdev","include"] = + filename:split("a:msdev\\include"), + ok; + vxworks -> + ?line ["net:","msdev","include"] = + filename:split("net:/msdev/include"), + ?line ["Target:","msdev","include"] = + filename:split("Target:/msdev/include"), + ?line ["msdev","include"] = + filename:split("msdev\\include"), + ?line ["/disk0:","msdev","include"] = + filename:split("/disk0:\\msdev\\include"), + ?line ["a:","msdev","include"] = + filename:split("a:msdev\\include"), + ok; + _ -> + ok + end. + +t_nativename(Config) when is_list(Config) -> + ?line "abcedf" = filename:nativename(abcedf), + ?line "abcedf" = filename:nativename(["abc", "edf"]), + ?line "abcgluff" = filename:nativename(["abc", gluff]), + case os:type() of + {win32, _} -> + ?line "a:\\temp\\arne.exe" = + filename:nativename("A:/temp//arne.exe/"); + _ -> + ?line "/usr/tmp/arne" = + filename:nativename("/usr/tmp//arne/") + end. + +find_src(Config) when is_list(Config) -> + ?line {Source,_} = filename:find_src(file), + ?line ["file"|_] = lists:reverse(filename:split(Source)), + ?line {_,_} = filename:find_src(init, [{".","."}, {"ebin","src"}]), + + %% Try to find the source for a preloaded module. + ?line {error,{preloaded,init}} = filename:find_src(init), + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/file_sorter_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/file_sorter_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/file_sorter_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/file_sorter_SUITE.erl 2009-11-20 13:31:24.000000000 +0000 @@ -0,0 +1,1345 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(file_sorter_SUITE). + +%-define(debug, true). + +-ifdef(debug). +-define(format(S, A), io:format(S, A)). +-define(line, put(line, ?LINE), ). +-define(config(X,Y), foo). +-define(t,test_server). +-define(privdir(_), "./file_sorter_SUITE_priv"). +-else. +-include("test_server.hrl"). +-define(format(S, A), ok). +-define(privdir(Conf), ?config(priv_dir, Conf)). +-endif. + +-export([all/1, basic/1, badarg/1, + term_sort/1, term_keysort/1, + binary_term_sort/1, binary_term_keysort/1, + binary_sort/1, + term_merge/1, term_keymerge/1, + binary_term_merge/1, binary_term_keymerge/1, + binary_merge/1, + term_check/1, term_keycheck/1, + binary_term_check/1, binary_term_keycheck/1, + binary_check/1, + inout/1, misc/1, many/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +init_per_testcase(_Case, Config) -> + Dog=?t:timetrap(?t:minutes(2)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + {req,[stdlib,kernel], + [basic, badarg, + term_sort, term_keysort, + binary_term_sort, binary_term_keysort, + binary_sort, + term_merge, term_keymerge, + binary_term_merge, binary_term_keymerge, + binary_merge, + term_check, binary_term_keycheck, + binary_term_check, binary_term_keycheck, + binary_check, + inout, misc, many]}. + +basic(doc) -> + ["Basic test case."]; +basic(suite) -> + []; +basic(Config) when is_list(Config) -> + Fmt = binary, + Arg = {format,Fmt}, + Foo = outfile(foo, Config), + P0 = pps(), + + ?line F1s = [F1] = to_files([[]], Fmt, Config), + ?line ok = file_sorter:sort(F1), + ?line [] = from_files(F1, Fmt), + ?line ok = file_sorter:keysort(17, F1), + ?line [] = from_files(F1, Fmt), + ?line ok = file_sorter:merge(F1s, Foo), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line ok = file_sorter:keymerge(17, F1s, Foo), + ?line [] = from_files(Foo, Fmt), + ?line delete_files([Foo | F1s]), + + ?line [F2] = to_files([[foo,bar]], Fmt, Config), + ?line ok = file_sorter:sort([F2], F2, Arg), + ?line [bar,foo] = from_files(F2, Fmt), + ?line delete_files(F2), + + ?line Fs1 = to_files([[foo],[bar]], Fmt, Config), + ?line ok = file_sorter:sort(Fs1, Foo, Arg), + ?line [bar,foo] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line ok = file_sorter:merge(Fs1, Foo, Arg), + ?line [bar,foo] = from_files(Foo, Fmt), + ?line delete_files([Foo | Fs1]), + + ?line Fmt2 = binary_term, + ?line Arg2 = {format, Fmt2}, + ?line [F3] = to_files([[{foo,1},{bar,2}]], Fmt2, Config), + ?line ok = file_sorter:keysort([2], [F3], F3, Arg2), + ?line [{foo,1},{bar,2}] = from_files(F3, Fmt2), + ?line delete_files(F3), + + ?line Fs2 = to_files([[{foo,1}],[{bar,2}]], Fmt2, Config), + ?line ok = file_sorter:keysort(1, Fs2, Foo, Arg2), + ?line [{bar,2},{foo,1}] = from_files(Foo, Fmt2), + ?line delete_files(Foo), + ?line ok = file_sorter:keymerge(1, Fs2, Foo, Arg2), + ?line [{bar,2},{foo,1}] = from_files(Foo, Fmt2), + ?line delete_files([Foo | Fs2]), + + ?line true = P0 =:= pps(), + + ok. + +badarg(doc) -> + ["Call functions with bad arguments."]; +badarg(suite) -> + []; +badarg(Config) when is_list(Config) -> + PrivDir = ?privdir(Config), + BadFile = filename:join(PrivDir, "not_a_file"), + ABadFile = filename:absname(BadFile), + ?line file:delete(BadFile), + ?line {error,{file_error,ABadFile,enoent}} = + file_sorter:sort(BadFile), + ?line {'EXIT', {{badarg, {flipp}}, _}} = + (catch file_sorter:sort({flipp})), + ?line {error,{file_error,ABadFile,enoent}} = + file_sorter:keysort(1, BadFile), + ?line {'EXIT', {{badarg, {flipp}}, _}} = + (catch file_sorter:keysort(1, {flipp})), + + ?line {'EXIT', {{badarg, {flipp}}, _}} = + (catch file_sorter:merge([{flipp}],foo)), + ?line {error,{file_error,ABadFile,enoent}} = + file_sorter:keymerge(1,[BadFile],foo), + ?line {'EXIT', {{badarg, {flipp}}, _}} = + (catch file_sorter:keymerge(1,[{flipp}],foo)), + ?line {'EXIT', {{badarg, _}, _}} = + (catch file_sorter:merge(fun(X) -> X end, foo)), + ?line {'EXIT', {{badarg, _}, _}} = + (catch file_sorter:keymerge(1, fun(X) -> X end, foo)), + + ?line {error,{file_error,ABadFile,enoent}} = + file_sorter:check(BadFile), + ?line {'EXIT', {{badarg, {flipp}}, _}} = + (catch file_sorter:check({flipp})), + ?line {error,{file_error,ABadFile,enoent}} = + file_sorter:keycheck(1, BadFile), + ?line {'EXIT', {{badarg, {flipp}}, _}} = + (catch file_sorter:keycheck(1, {flipp})), + ?line {'EXIT', {{badarg, {flipp}}, _}} = + (catch file_sorter:check([{flipp}],foo)), + ?line {'EXIT', {{badarg, {flipp}}, _}} = + (catch file_sorter:keycheck(1,[{flipp}],foo)), + ?line {'EXIT', {{badarg, _}, _}} = + (catch file_sorter:check(fun(X) -> X end, foo)), + ?line {'EXIT', {{badarg, _}, _}} = + (catch file_sorter:keycheck(1, fun(X) -> X end, foo)), + + ?line Fs1 = to_files([[1,2,3]], binary_term, Config), + ?line {'EXIT', {{badarg, flipp}, _}} = + (catch file_sorter:check(Fs1 ++ flipp, [])), + [F1] = Fs1, + ?line {error,{file_error,_,_}} = + file_sorter:sort(Fs1, foo, [{tmpdir,F1},{size,0}]), + ?line delete_files(Fs1), + ?line Fs2 = to_files([[1,2,3]], binary_term, Config), + {error,{file_error,_,enoent}} = + file_sorter:sort(Fs2, foo, [{tmpdir,filename:absname(BadFile)}, + {size,0}]), + ?line delete_files(Fs2), + + ?line {'EXIT', {{badarg, bad}, _}} = + (catch file_sorter:check([], [{format,term} | bad])), + ?line {'EXIT', {{badarg, [{flipp}]}, _}} = + (catch file_sorter:check([{flipp}])), + ?line {'EXIT', {{badarg, {flipp}}, _}} = + (catch file_sorter:keycheck(1, {flipp})), + ?line {'EXIT', {{badarg, [{flipp}]}, _}} = + (catch file_sorter:keycheck(2, [{flipp}])), + ?line {error,{file_error,_,eisdir}} = file_sorter:keycheck(1, []), + ?line {'EXIT', {{badarg, kp}, _}} = (catch file_sorter:keycheck(kp, [])), + ?line {'EXIT', {{badarg, kp}, _}} = + (catch file_sorter:keycheck([1, kp], [])), + ?line {'EXIT', {{badarg, kp}, _}} = + (catch file_sorter:keycheck([1 | kp], [])), + ?line {'EXIT', {{badarg, []}, _}} = (catch file_sorter:keycheck([], [])), + ?line {'EXIT', {{badarg, {format, foo}}, _}} = + (catch file_sorter:check([], {format,foo})), + ?line {'EXIT', {{badarg, not_an_option}, _}} = + (catch file_sorter:keycheck(7, [], [not_an_option])), + ?line {'EXIT', {{badarg, format}, _}} = + (catch file_sorter:keycheck(1, [], [{format, binary}])), + ?line {'EXIT', {{badarg, order}, _}} = + (catch file_sorter:keycheck(1, [], [{order, fun compare/2}])), + + ?line do_badarg(fun(I, O) -> file_sorter:sort(I, O) end, + fun(Kp, I, O) -> file_sorter:keysort(Kp, I, O) end, + BadFile), + ?line do_badarg_opt(fun(I, O, X) -> file_sorter:sort(I, O, X) end, + fun(Kp, I, O, X) -> file_sorter:keysort(Kp, I, O, X) + end), + ?line do_badarg(fun(I, O) -> file_sorter:merge(I, O) end, + fun(Kp, I, O) -> file_sorter:keymerge(Kp, I, O) end, + BadFile), + ?line do_badarg_opt(fun(I, O, X) -> file_sorter:merge(I, O, X) end, + fun(Kp, I, O, X) -> file_sorter:keymerge(Kp, I, O, X) + end). + +do_badarg(F, KF, BadFile) -> + [Char | _] = BadFile, + AFlipp = filename:absname(flipp), + ?line {error,{file_error,AFlipp,enoent}} = F([flipp | flopp], foo), + ?line {'EXIT', {{badarg, {foo,bar}}, _}} = (catch F([], {foo,bar})), + ?line {'EXIT', {{badarg, Char}, _}} = (catch F(BadFile, [])), + ?line {'EXIT', {{badarg, {flipp}}, _}} = (catch F({flipp}, [])), + + ?line {'EXIT', {{badarg, Char}, _}} = (catch KF(1, BadFile, [])), + ?line {'EXIT', {{badarg, {flipp}}, _}} = (catch KF(1, {flipp}, [])), + ?line {error,{file_error,AFlipp,enoent}} = + KF(2, [flipp | flopp], foo), + ?line {'EXIT', {{badarg, {foo,bar}}, _}} = (catch KF(1, [], {foo,bar})), + ?line {'EXIT', {{badarg, kp}, _}} = (catch KF(kp, [], foo)), + ?line {'EXIT', {{badarg, kp}, _}} = (catch KF([1, kp], [], foo)), + ?line {'EXIT', {{badarg, kp}, _}} = (catch KF([1 | kp], [], foo)), + ?line {'EXIT', {{badarg, []}, _}} = (catch KF([], [], foo)), + ok. + +do_badarg_opt(F, KF) -> + AFlipp = filename:absname(flipp), + ?line {error,{file_error,AFlipp,enoent}} = + F([flipp | flopp], foo, []), + ?line {'EXIT', {{badarg, {flipp}}, _}} = (catch F([{flipp}], foo, [])), + ?line {'EXIT', {{badarg, {out,put}}, _}} = (catch F([], {out,put}, [])), + ?line {'EXIT', {{badarg, not_an_option}, _}} = + (catch F([], foo, [not_an_option])), + ?line {'EXIT', {{badarg, {format, foo}}, _}} = + (catch F([], foo, {format,foo})), + ?line {'EXIT', {{badarg, {size,foo}}, _}} = (catch F([], foo, {size,foo})), + + ?line {'EXIT', {{badarg, {size, -1}}, _}} = (catch F([], foo, {size,-1})), + ?line {'EXIT', {{badarg, {no_files, foo}}, _}} = + (catch F([], foo, {no_files,foo})), + ?line {'EXIT', {{badarg, {no_files, 1}}, _}} = + (catch F([], foo, {no_files,1})), + ?line {'EXIT', {{badarg, 1}, _}} = (catch F([], foo, {tmpdir,1})), + ?line {'EXIT', {{badarg, {order,1}}, _}} = (catch F([], foo, {order,1})), + ?line {'EXIT', {{badarg, {compressed, flopp}}, _}} = + (catch F([], foo, {compressed,flopp})), + ?line {'EXIT', {{badarg, {unique,flopp}}, _}} = + (catch F([], foo, {unique,flopp})), + ?line {'EXIT', {{badarg, {header,foo}}, _}} = + (catch F([], foo, {header,foo})), + ?line {'EXIT', {{badarg, {header, 0}}, _}} = + (catch F([], foo, {header,0})), + ?line {'EXIT', {{badarg, {header, 1 bsl 35}}, _}} = + (catch F([], foo, {header,1 bsl 35})), + ?line {'EXIT', {{badarg, header}, _}} = + (catch F([], foo, [{header,1},{format,term}])), + + ?line {'EXIT', {{badarg, not_an_option}, _}} = + (catch KF(7, [], foo, [not_an_option])), + ?line {'EXIT', {{badarg,format}, _}} = + (catch KF(1, [], foo, [{format, binary}])), + ?line {'EXIT', {{badarg, order}, _}} = + (catch KF(1, [], foo, [{order, fun compare/2}])), + ?line {'EXIT', {{badarg, {flipp}}, _}} = + (catch KF(2, [{flipp}], foo,[])), + ?line {error,{file_error,AFlipp,enoent}} = + KF(2, [flipp | flopp], foo,[]), + ?line {'EXIT', {{badarg, {out, put}}, _}} = + (catch KF(1, [], {out,put}, [])), + ?line {'EXIT', {{badarg, kp}, _}} = (catch KF(kp, [], foo, [])), + ?line {'EXIT', {{badarg, kp}, _}} = (catch KF([1, kp], [], foo, [])), + ?line {'EXIT', {{badarg, kp}, _}} = (catch KF([1 | kp], [], foo, [])), + ok. + +term_sort(doc) -> + ["Sort terms on files."]; +term_sort(suite) -> + []; +term_sort(Config) when is_list(Config) -> + ?line sort(term, [{compressed,false}], Config), + ?line sort(term, [{order, fun compare/2}], Config), + ?line sort(term, [{order, ascending}, {compressed,true}], Config), + ?line sort(term, [{order, descending}], Config), + ok. + +term_keysort(doc) -> + ["Keysort terms on files."]; +term_keysort(suite) -> + []; +term_keysort(Config) when is_list(Config) -> + ?line keysort(term, [{tmpdir, ""}], Config), + ?line keysort(term, [{order,descending}], Config), + ok. + +binary_term_sort(doc) -> + ["Sort binary terms on files."]; +binary_term_sort(suite) -> + []; +binary_term_sort(Config) when is_list(Config) -> + PrivDir = ?privdir(Config), + ?line sort({2, binary_term}, [], Config), + ?line sort(binary_term, [{tmpdir, list_to_atom(PrivDir)}], Config), + ?line sort(binary_term, [{tmpdir,PrivDir}], Config), + ?line sort({3,binary_term}, [{order, fun compare/2}], Config), + ?line sort(binary_term, [{order, fun compare/2}], Config), + ?line sort(binary_term, [{order,descending}], Config), + ok. + +binary_term_keysort(doc) -> + ["Keysort binary terms on files."]; +binary_term_keysort(suite) -> + []; +binary_term_keysort(Config) when is_list(Config) -> + ?line keysort({3, binary_term}, [], Config), + ?line keysort(binary_term, [], Config), + ?line keysort(binary_term, [{order,descending}], Config), + ok. + +binary_sort(doc) -> + ["Sort binaries on files."]; +binary_sort(suite) -> + []; +binary_sort(Config) when is_list(Config) -> + PrivDir = ?privdir(Config), + ?line sort({2, binary}, [], Config), + ?line sort(binary, [{tmpdir, list_to_atom(PrivDir)}], Config), + ?line sort(binary, [{tmpdir,PrivDir}], Config), + ?line sort({3,binary}, [{order, fun compare/2}], Config), + ?line sort(binary, [{order, fun compare/2}], Config), + ?line sort(binary, [{order,descending}], Config), + ok. + +term_merge(doc) -> + ["Merge terms on files."]; +term_merge(suite) -> + []; +term_merge(Config) when is_list(Config) -> + ?line merge(term, [{order, fun compare/2}], Config), + ?line merge(term, [{order, ascending}, {compressed,true}], Config), + ?line merge(term, [{order, descending}, {compressed,false}], Config), + ok. + +term_keymerge(doc) -> + ["Keymerge terms on files."]; +term_keymerge(suite) -> + []; +term_keymerge(Config) when is_list(Config) -> + ?line keymerge(term, [], Config), + ?line keymerge(term, [{order, descending}], Config), + ?line funmerge(term, [], Config), + ok. + +binary_term_merge(doc) -> + ["Merge binary terms on files."]; +binary_term_merge(suite) -> + []; +binary_term_merge(Config) when is_list(Config) -> + ?line merge(binary_term, [], Config), + ?line merge({7, binary_term}, [], Config), + ?line merge({3, binary_term}, [{order, fun compare/2}], Config), + ok. + +binary_term_keymerge(doc) -> + ["Keymerge binary terms on files."]; +binary_term_keymerge(suite) -> + []; +binary_term_keymerge(Config) when is_list(Config) -> + ?line keymerge({3, binary_term}, [], Config), + ?line keymerge(binary_term, [], Config), + ?line funmerge({3, binary_term}, [], Config), + ?line funmerge(binary_term, [], Config), + ok. + +binary_merge(doc) -> + ["Merge binaries on files."]; +binary_merge(suite) -> + []; +binary_merge(Config) when is_list(Config) -> + ?line merge(binary, [], Config), + ?line merge({7, binary}, [], Config), + ?line merge({3, binary}, [{order, fun compare/2}], Config), + ok. + +term_check(doc) -> + ["Check terms on files."]; +term_check(suite) -> + []; +term_check(Config) when is_list(Config) -> + ?line check(term, Config), + ok. + +binary_term_check(doc) -> + ["Check binary terms on files."]; +binary_term_check(suite) -> + []; +binary_term_check(Config) when is_list(Config) -> + ?line check(binary_term, Config), + ok. + +term_keycheck(doc) -> + ["Keycheck terms on files."]; +term_keycheck(suite) -> + []; +term_keycheck(Config) when is_list(Config) -> + ?line keycheck(term, Config), + ok. + +binary_term_keycheck(doc) -> + ["Keycheck binary terms on files."]; +binary_term_keycheck(suite) -> + []; +binary_term_keycheck(Config) when is_list(Config) -> + ?line keycheck(binary_term, Config), + ok. + +binary_check(doc) -> + ["Check binary terms on files."]; +binary_check(suite) -> + []; +binary_check(Config) when is_list(Config) -> + ?line check(binary, Config), + ok. + +inout(doc) -> + ["Funs as input or output."]; +inout(suite) -> + []; +inout(Config) when is_list(Config) -> + BTF = {format, binary_term}, + Foo = outfile(foo, Config), + + %% Input is fun. + End = fun(read) -> end_of_input end, + + IF1 = fun(read) -> {[1,7,5], End} end, + ?line ok = file_sorter:sort(IF1, Foo, [{format, term}]), + %% 'close' is called, but the return value is caught and ignored. + IF2 = fun(read) -> {[1,2,3], fun(close) -> throw(ignored) end} end, + ?line {error, bad_object} = file_sorter:sort(IF2, Foo, BTF), + + IF3 = fun(no_match) -> foo end, + ?line {'EXIT', {function_clause, _}} = + (catch file_sorter:sort(IF3, Foo)), + IF4 = fun(read) -> throw(my_message) end, + ?line my_message = (catch file_sorter:sort(IF4, Foo)), + IF5 = fun(read) -> {error, my_error} end, + ?line {error, my_error} = file_sorter:sort(IF5, Foo), + + %% Output is fun. + ?line {error, bad_object} = + file_sorter:sort(IF2, fun(close) -> ignored end, BTF), + Args = [{format, term}], + ?line {error, bad_object} = + file_sorter:keysort(1, IF2, fun(close) -> ignored end, Args), + OF1 = fun(close) -> fine; (L) when is_list(L) -> fun(close) -> nice end end, + ?line nice = file_sorter:sort(IF1, OF1, Args), + OF2 = fun(_) -> my_return end, + ?line my_return = file_sorter:sort(IF1, OF2, Args), + OF3 = fun(_) -> throw(my_message) end, + ?line my_message = (catch file_sorter:sort(IF1, OF3, Args)), + OF4 = fun(no_match) -> foo end, + ?line {'EXIT', {function_clause, _}} = + (catch file_sorter:sort(IF1, OF4, Args)), + + ?line P0 = pps(), + ?line Fs1 = to_files([[3,1,2,5,4], [8,3,10]], term, Config), + ?line error = file_sorter:sort(Fs1, fun(_) -> error end, Args), + ?line delete_files(Fs1), + + ?line true = P0 =:= pps(), + + %% Passing a value from the input functions to the output functions. + IFV1 = fun(read) -> {end_of_input, 17} end, + OFV1 = fun({value, Value}) -> ofv(Value, []) end, + ?line {17, []} = file_sorter:sort(IFV1, OFV1, Args), + + %% Output is not a fun. The value returned by input funs is ignored. + %% OTP-5009. + ?line ok = file_sorter:sort(IFV1, Foo, [{format,term}]), + ?line [] = from_files(Foo, term), + ?line delete_files(Foo), + + ok. + +ofv(Value, A) -> + fun(close) -> + {Value, lists:append(lists:reverse(A))}; + (L) when is_list(L) -> + ofv(Value, [L | A]) + end. + +many(doc) -> + ["Many temporary files."]; +many(suite) -> + []; +many(Config) when is_list(Config) -> + Foo = outfile(foo, Config), + PrivDir = ?privdir(Config), + P0 = pps(), + + Args = [{format, term}], + L1 = lists:map(fun(I) -> {one, two, three, I} end, lists:seq(1,1000)), + L2 = lists:map(fun(I) -> {four, five, six, I} end, lists:seq(1,1000)), + ?line Fs2 = to_files([L1, L2], term, Config), + ?line ok = file_sorter:sort(Fs2, Foo, [{size,1000} | Args]), + ?line R = lists:sort(L1++L2), + ?line R = from_files(Foo, term), + ?line 2000 = length(R), + ?line ok = file_sorter:sort(Fs2, Foo, [{no_files,4},{size,1000} | Args]), + ?line R = from_files(Foo, term), + ?line ok = + file_sorter:sort(Fs2, Foo, + [{no_files,4},{size,1000},{order,descending} | Args]), + ?line true = lists:reverse(R) =:= from_files(Foo, term), + ?line ok = + file_sorter:sort(Fs2, Foo, + [{no_files,4},{size,1000}, + {order,fun compare/2} | Args]), + ?line R = from_files(Foo, term), + ?line ok = file_sorter:keysort(4, Fs2, Foo, + [{no_files,4},{size,1000} | Args]), + ?line RK = lists:keysort(4, L1++L2), + ?line RK = from_files(Foo, term), + ?line delete_files(Foo), + ?line ok = + file_sorter:keysort(4, Fs2, Foo, + [{no_files,4},{size,1000},{order,descending} | Args]), + ?line true = lists:reverse(RK) =:= from_files(Foo, term), + ?line delete_files(Foo), + ?line ok = file_sorter:keysort(4, Fs2, Foo, + [{size,500},{order,descending} | Args]), + ?line true = lists:reverse(RK) =:= from_files(Foo, term), + ?line delete_files(Foo), + ?line error = file_sorter:sort(Fs2, fun(_) -> error end, + [{tmpdir, PrivDir}, {no_files,3}, + {size,10000} | Args]), + + TmpDir = filename:join(PrivDir, "tmpdir"), + file:del_dir(TmpDir), + ?line ok = file:make_dir(TmpDir), + ?line case os:type() of + {unix, _} -> + ?line ok = file:change_mode(TmpDir, 8#0000), + ?line {error, {file_error, _,_}} = + file_sorter:sort(Fs2, fun(_M) -> foo end, + [{no_files,3},{size,10000}, + {tmpdir,TmpDir} | Args]); + _ -> + true + end, + ?line ok = file:del_dir(TmpDir), + delete_files(Fs2), + ?line true = P0 =:= pps(), + ok. + +misc(doc) -> + ["Some other tests."]; +misc(suite) -> + []; +misc(Config) when is_list(Config) -> + BTF = {format, binary_term}, + Foo = outfile(foo, Config), + FFoo = filename:absname(Foo), + P0 = pps(), + + ?line [File] = Fs1 = to_files([[1,3,2]], term, Config), + ?line ok = file:write_file(Foo,<<>>), + ?line case os:type() of + {unix, _} -> + ok = file:change_mode(Foo, 8#0000), + {error,{file_error,FFoo,eacces}} = + file_sorter:sort(Fs1, Foo, {format,term}); + _ -> + true + end, + ?line file:delete(Foo), + ?line NoBytes = 16, % RAM memory will never get this big, or? + ?line ALot = (1 bsl (NoBytes*8)) - 1, + ?line ok = file:write_file(File, <>), + FFile = filename:absname(File), + ?line {error, {bad_object,FFile}} = + file_sorter:sort(Fs1, Foo, [BTF, {header, 20}]), + ?line ok = file:write_file(File, <<30:32,"foobar">>), + ?line {error, {premature_eof, FFile}} = file_sorter:sort(Fs1, Foo, BTF), + ?line ok = file:write_file(File, <<6:32,"foobar">>), + ?line {error, {bad_object,FFile}} = file_sorter:sort(Fs1, Foo, BTF), + ?line case os:type() of + {unix, _} -> + ok = file:change_mode(File, 8#0000), + {error, {file_error,FFile,eacces}} = + file_sorter:sort(Fs1, Foo), + {error, {file_error,FFile,eacces}} = + file_sorter:sort(Fs1, Foo, {format, binary_term}); + _ -> + true + end, + ?line delete_files(Fs1), + ?line true = P0 =:= pps(), + + %% bigger than chunksize + ?line E1 = <<32000:32, 10:256000>>, + ?line E2 = <<32000:32, 5:256000>>, + ?line E3 = <<32000:32, 8:256000>>, + ?line ok = file:write_file(Foo, [E1, E2, E3]), + ?line ok = file_sorter:sort([Foo], Foo, [{format,binary},{size,10000}]), + ?line ok = file_sorter:sort([Foo], Foo, [{format,fun(X) -> X end}, + {size,10000}]), + ?line Es = list_to_binary([E2,E3,E1]), + ?line {ok, Es} = file:read_file(Foo), + ?line delete_files(Foo), + ?line true = P0 =:= pps(), + + %% keysort more than one element + L = [{c,1,a},{c,2,b},{c,3,c},{b,1,c},{b,2,b},{b,3,a},{a,1,a},{a,2,b}, + {a,3,c}], + ?line Fs2 = to_files([L], binary_term, Config), + ?line ok = file_sorter:keysort([2,3], Fs2, Foo, {format, binary_term}), + ?line KS2_1 = from_files(Foo, binary_term), + ?line KS2_2 = lists:keysort(2,lists:keysort(3, L)), + ?line KS2_1 = KS2_2, + ?line ok = file_sorter:keysort([2,3], Fs2, Foo, + [{format, binary_term},{size,5}]), + ?line KS2_3 = from_files(Foo, binary_term), + ?line KS2_3 = KS2_2, + ?line ok = file_sorter:keysort([2,3,1], Fs2, Foo, {format, binary_term}), + ?line KS3_1 = from_files(Foo, binary_term), + ?line KS3_2 = lists:keysort(2, lists:keysort(3,lists:keysort(1, L))), + ?line KS3_1 = KS3_2, + ?line ok = file_sorter:keysort([2,3,1], Fs2, Foo, + [{format, binary_term},{size,5}]), + ?line KS3_3 = from_files(Foo, binary_term), + ?line KS3_3 = KS3_2, + ?line delete_files([Foo | Fs2]), + ?line true = P0 =:= pps(), + + %% bigger than chunksize + %% Assumes that CHUNKSIZE = 16384. Illustrates that the Last argument + %% of merge_files/5 is necessary. + ?line EP1 = erlang:make_tuple(2728,foo), + ?line EP2 = lists:duplicate(2729,qqq), + ?line LL = [EP1, EP2, EP1, EP2, EP1, EP2], + ?line Fs3 = to_files([LL], binary, Config), + ?line ok = file_sorter:sort(Fs3, Foo, [{format,binary}, {unique,true}]), + ?line [EP1,EP2] = from_files(Foo, binary), + ?line delete_files(Foo), + ?line ok = file_sorter:sort(Fs3, Foo, + [{format,binary_term}, {unique,true}, + {size,30000}]), + ?line [EP1,EP2] = from_files(Foo, binary_term), + ?line delete_files([Foo | Fs3]), + + ?line true = P0 =:= pps(), + + ?line BE1 = <<20000:32, 17:160000>>, + ?line BE2 = <<20000:32, 1717:160000>>, + ?line ok = file:write_file(Foo, [BE1,BE2,BE1,BE2]), + ?line ok = file_sorter:sort([Foo], Foo, [{format,binary}, + {size,10000}, + {unique,true}]), + ?line BEs = list_to_binary([BE1, BE2]), + ?line {ok, BEs} = file:read_file(Foo), + ?line delete_files(Foo), + ?line true = P0 =:= pps(), + + ?line Fs4 = to_files([[7,4,1]], binary_term, Config), + ?line {error, {bad_term, _}} = file_sorter:sort(Fs4, Foo, {format, term}), + ?line delete_files([Foo | Fs4]), + ?line true = P0 =:= pps(), + + ok. + +%%% +%%% Utilities. +%%% + +sort(Fmt, XArgs, Config) -> + Args = make_args(Fmt, [{size,5} | XArgs]), + TmpArgs = [{tmpdir,?privdir(Config)} | Args], + Foo = outfile(foo, Config), + + %% Input is a fun. Output is a fun. + ?line [] = file_sorter:sort(input([], 2, Fmt), output([], Fmt), Args), + ?line L1 = [3,1,2,5,4], + ?line S1 = file_sorter:sort(input(L1, 2, Fmt), output([], Fmt), TmpArgs), + ?line S1 = rev(lists:sort(L1), TmpArgs), + + %% Input is a file. Output is a fun. + ?line [] = file_sorter:sort([], output([], Fmt), Args), + ?line L2 = [3,1,2,5,4], + ?line Fs1 = to_files([L2], Fmt, Config), + ?line S2 = file_sorter:sort(Fs1, output([], Fmt), TmpArgs), + ?line S2 = rev(lists:sort(L2), TmpArgs), + ?line delete_files(Fs1), + + %% Input is a file. Output is a file + ?line ok = file_sorter:sort([], Foo, Args), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line ok = file_sorter:sort([], Foo, [{unique,true} | Args]), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line L3 = [3,1,2,5,4,6], + ?line Fs2 = to_files([L3], Fmt, Config), + ?line ok = file_sorter:sort(Fs2, Foo, Args), + ?line true = rev(lists:sort(L3), Args) =:= from_files(Foo, Fmt), + ?line delete_files([Foo | Fs2]), + ?line L4 = [1,3,4,1,2,5,4,5,6], + ?line Fs3 = to_files([L4], Fmt, Config), + ?line ok = file_sorter:sort(Fs3, Foo, Args++[{unique,true}, + {size,100000}]), + ?line true = rev(lists:usort(L4), Args) =:= from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line ok = file_sorter:sort(Fs3, Foo, Args++[{unique,true}]), + ?line true = rev(lists:usort(L4), Args) =:= from_files(Foo, Fmt), + ?line delete_files([Foo | Fs3]), + + %% Input is a fun. Output is a file. + ?line ok = file_sorter:sort(input([], 2, Fmt), Foo, Args), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line L5 = [3,1,2,5,4,7], + ?line ok = file_sorter:sort(input(L5, 2, Fmt), Foo, Args), + ?line true = rev(lists:sort(L5), Args) =:= from_files(Foo, Fmt), + ?line delete_files(Foo), + + %% Removing duplicate keys. + KFun = key_compare(2), + L6 = [{5,e},{2,b},{3,c},{1,a},{4,d}] ++ [{2,c},{1,b},{4,a}], + KUArgs = lists:keydelete(order, 1, Args) ++ + [{unique, true}, {order, KFun},{size,100000}], + ?line ok = file_sorter:sort(input(L6, 2, Fmt), Foo, KUArgs), + ?line true = rev(lists:ukeysort(2, L6), KUArgs) =:= from_files(Foo, Fmt), + KArgs = lists:keydelete(unique, 1, KUArgs), + ?line ok = file_sorter:sort(input(L6, 2, Fmt), Foo, KArgs), + ?line true = rev(lists:keysort(2, L6), KArgs) =:= from_files(Foo, Fmt), + + %% Removing duplicate keys. Again. + KUArgs2 = lists:keydelete(order, 1, Args) ++ + [{unique, true}, {order, KFun},{size,5}], + ?line ok = file_sorter:sort(input(L6, 2, Fmt), Foo, KUArgs2), + ?line true = rev(lists:ukeysort(2, L6), KUArgs2) =:= from_files(Foo, Fmt), + KArgs2 = lists:keydelete(unique, 1, KUArgs2), + ?line ok = file_sorter:sort(input(L6, 2, Fmt), Foo, KArgs2), + ?line true = rev(lists:keysort(2, L6), KArgs2) =:= from_files(Foo, Fmt), + ?line delete_files(Foo), + + ok. + +keysort(Fmt, XArgs, Config) -> + Args = make_args(Fmt, [{size,50}, {no_files, 2} | XArgs]), + TmpArgs = Args ++ [{tmpdir,?privdir(Config)}], + Foo = outfile(foo, Config), + + %% Input is files. Output is a file. + ?line ok = file_sorter:keysort(2, [], Foo, Args), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line ok = file_sorter:keysort(2, [], Foo, [{unique,true} | Args]), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line L0 = [{a,2},{a,1},{a,2},{a,2},{a,1},{a,2},{a,2},{a,3}], + ?line Fs0 = to_files([L0], Fmt, Config), + ?line S = rev(lists:ukeysort(1, L0), Args), + ?line ok = + file_sorter:keysort(1, Fs0, Foo, Args ++ [{unique,true}, + {size,100000}]), + ?line S = from_files(Foo, Fmt), + ?line ok = + file_sorter:keysort(1, Fs0, Foo, Args ++ [{unique,true}, + {size,5}]), + ?line S = from_files(Foo, Fmt), + ?line ok = file_sorter:keysort(1, Fs0, Foo, Args ++ [{unique,true}]), + ?line S = from_files(Foo, Fmt), + ?line delete_files([Foo | Fs0]), + ?line L11 = [{a,1,x4},{b,2,x4},{c,3,x4}], + ?line L21 = [{a,1,x3},{b,2,x3},{c,3,x3}], + ?line L31 = [{a,1,x2},{b,2,x2},{c,3,x2}], + ?line L41 = [{a,1,x1},{b,2,x1},{c,3,x1}], + ?line All = [L11, L21, L31, L41], + ?line AllFlat = lists:append(All), + ?line Sorted = rev(lists:keysort(2, AllFlat), Args), + ?line Fs1 = to_files(All, Fmt, Config), + ?line ok = file_sorter:keysort(2, Fs1, Foo, Args), + ?line Sorted = from_files(Foo, Fmt), + ?line delete_files(Foo), + + %% Input is files. Output is a fun. + ?line [] = file_sorter:keysort(2, [], output([], Fmt), Args), + ?line KS1 = file_sorter:keysort(2, Fs1, output([], Fmt), TmpArgs), + ?line Sorted = KS1, + ?line delete_files(Fs1), + + %% Input is a fun. Output is a file. + ?line ok = file_sorter:keysort(2, input([], 2, Fmt), Foo, Args), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line ok = file_sorter:keysort(2, input(AllFlat, 4, Fmt), Foo, Args), + ?line Sorted = from_files(Foo, Fmt), + ?line delete_files(Foo), + + %% Input is a fun. Output is a fun. + ?line [] = file_sorter:keysort(2, input([], 2, Fmt), output([], Fmt),Args), + ?line KS2 = + file_sorter:keysort(2, input(AllFlat, 4, Fmt), output([], Fmt), + TmpArgs), + ?line Sorted = KS2, + ok. + +merge(Fmt, XArgs, Config) -> + Args = make_args(Fmt, [{size,5} | XArgs]), + Foo = outfile(foo, Config), + + %% Input is a file. Output is a fun. + ?line [] = file_sorter:merge([], output([], Fmt), Args), + ?line L2 = [[1,3,5],[2,4,5]], + ?line Fs1 = to_files(L2, Fmt, Config), + ?line S2 = file_sorter:sort(Fs1, output([], Fmt), Args), + ?line S2 = rev(lists:sort(lists:append(L2)), Args), + ?line delete_files(Fs1), + + %% Input is a file. Output is a file + ?line ok = file_sorter:merge([], Foo, Args), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line ok = file_sorter:merge([], Foo, [{unique,true} | Args]), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line L31 = [1,2,3], + ?line L32 = [2,3,4], + ?line L33 = [4,5,6], + ?line L3r = [L31, L32, L33], + ?line L3 = [rev(L31,Args), rev(L32,Args), rev(L33,Args)], + ?line Fs2 = to_files(L3, Fmt, Config), + ?line ok = file_sorter:merge(Fs2, Foo, Args), + ?line true = rev(lists:merge(L3r), Args) =:= from_files(Foo, Fmt), + ?line ok = file_sorter:merge(Fs2, Foo, Args++[{unique,true}, + {size,100000}]), + ?line true = rev(lists:umerge(L3r), Args) =:= from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line ok = file_sorter:merge(Fs2, Foo, Args++[{unique,true}]), + ?line true = rev(lists:umerge(L3r), Args) =:= from_files(Foo, Fmt), + ?line delete_files([Foo | Fs2]), + + ok. + +keymerge(Fmt, XArgs, Config) -> + Args = make_args(Fmt, [{size,50}, {no_files, 2} | XArgs]), + Foo = outfile(foo, Config), + + %% Input is files. Output is a file. + ?line ok = file_sorter:keymerge(2, [], Foo, Args), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line ok = file_sorter:keymerge(2, [], Foo, [{unique,true} | Args]), + ?line [] = from_files(Foo, Fmt), + ?line delete_files(Foo), + ?line L0 = [rev([{a,1},{a,2}], Args), rev([{a,2},{a,1},{a,3}], Args)], + ?line Fs0 = to_files(L0, Fmt, Config), + ?line delete_files(Foo), + ?line ok = file_sorter:keymerge(1, Fs0, Foo, Args ++ [{unique,false}]), + ?line S2 = rev([{a,1},{a,2},{a,2},{a,1},{a,3}], Args), + ?line S2 = from_files(Foo, Fmt), + ?line delete_files([Foo | Fs0]), + ?line L11 = [{a,1,x4},{b,2,x4},{c,3,x4}], + ?line L21 = [{a,1,x3},{b,2,x3},{c,3,x3}], + ?line L31 = [{a,1,x2},{b,2,x2},{c,3,x2}], + ?line L41 = [{a,1,x1},{b,2,x1},{c,3,x1}], + ?line All = + [rev(L11, Args), rev(L21, Args), rev(L31, Args), rev(L41, Args)], + ?line Merged1 = lists:keymerge(2, L11, L21), + ?line Merged2 = lists:keymerge(2, L31, L41), + ?line Merged = rev(lists:keymerge(2, Merged1, Merged2), Args), + ?line Fs1 = to_files(All, Fmt, Config), + ?line ok = file_sorter:keymerge(2, Fs1, Foo, Args), + ?line Merged = from_files(Foo, Fmt), + + fun() -> + UArgs = [{unique,true} | Args], + ?line UMerged1 = lists:ukeymerge(2, L11, L21), + ?line UMerged2 = lists:ukeymerge(2, L31, L41), + ?line UMerged = rev(lists:ukeymerge(2, UMerged1, UMerged2), Args), + ?line ok = file_sorter:keymerge(2, Fs1, Foo, UArgs), + ?line UMerged = from_files(Foo, Fmt), + UArgs2 = make_args(Fmt, [{unique,true}, {size,50} | XArgs]), + ?line ok = file_sorter:keymerge(2, Fs1, Foo, UArgs2), + ?line UMerged = from_files(Foo, Fmt), + ?line List = rev([{a,1,x4},{b,2,x4},{c,3,x4}], Args), + ?line FsL = to_files([List], Fmt, Config), + ?line ok = file_sorter:keymerge(2, FsL, Foo, UArgs), + ?line List = from_files(Foo, Fmt), + ?line List1 = [{a,1,x4},{b,2,x4},{c,3,x4}], + ?line List2 = [{a,3,x4},{b,4,x4},{c,5,x4}], + ?line FsLL = to_files([rev(List1, Args), rev(List2, Args)], Fmt, Config), + ?line ok = file_sorter:keymerge(2, FsLL, Foo, UArgs), + ?line List1_2 = rev(lists:ukeymerge(2, List1, List2), Args), + ?line List1_2 = from_files(Foo, Fmt), + ?line delete_files(Foo) + end(), + + %% Input is files. Output is a fun. + ?line Fs3 = to_files(All, Fmt, Config), + ?line [] = file_sorter:keysort(2, [], output([], Fmt), Args), + ?line KS1 = file_sorter:keymerge(2, Fs3, output([], Fmt), Args), + ?line Merged = KS1, + ?line delete_files([Foo | Fs3]), + + ?line L2 = [[{a,1}],[{a,2}],[{a,3}],[{a,4}],[{a,5}],[{a,6}],[{a,7}]], + ?line Fs2 = to_files(L2, Fmt, Config), + ?line M = file_sorter:keymerge(1, Fs2, output([], Fmt), Args), + ?line M = rev(lists:append(L2), Args), + ?line delete_files(Fs2), + + ?line LL1 = [{d,4},{e,5},{f,6}], + ?line LL2 = [{a,1},{b,2},{c,3}], + ?line LL3 = [{j,10},{k,11},{l,12}], + ?line LL4 = [{g,7},{h,8},{i,9}], + ?line LL5 = [{p,16},{q,17},{r,18}], + ?line LL6 = [{m,13},{n,14},{o,15}], + ?line LLAll = [rev(LL1, Args),rev(LL2, Args),rev(LL3, Args), + rev(LL4, Args),rev(LL5, Args),rev(LL6, Args)], + ?line FsLL6 = to_files(LLAll, Fmt, Config), + ?line LL = rev(lists:sort(lists:append(LLAll)), Args), + ?line ok = file_sorter:keymerge(1, FsLL6, Foo, Args), + ?line LL = from_files(Foo, Fmt), + ?line ok = file_sorter:keymerge(1, FsLL6, Foo, [{unique,true} | Args]), + ?line LL = from_files(Foo, Fmt), + ?line delete_files([Foo | FsLL6]), + + ok. + +funmerge(Fmt, XArgs, Config) -> + KComp = key_compare(2), + Args = make_args(Fmt, [{order,KComp},{size,5}, {no_files, 5} | XArgs]), + UArgs = [{unique,true} | Args], + Foo = outfile(foo, Config), + + ?line EFs = to_files([[]], Fmt, Config), + ?line ok = file_sorter:merge(EFs, Foo, UArgs), + ?line [] = from_files(Foo, Fmt), + delete_files([Foo | EFs]), + + ?line L11 = [{a,1,x4},{b,2,x4},{c,3,x4}], + ?line L21 = [{a,1,x3},{b,2,x3},{c,3,x3}], + ?line L31 = [{a,1,x2},{b,2,x2},{c,3,x2}], + ?line L41 = [{a,1,x1},{b,2,x1},{c,3,x1}], + ?line CAll = [L11, L21, L31, L41], + ?line CMerged1 = lists:merge(KComp, L11, L21), + ?line CMerged2 = lists:merge(KComp, L31, L41), + ?line CMerged = lists:merge(KComp, CMerged1, CMerged2), + ?line CFs1 = to_files(CAll, Fmt, Config), + ?line ok = file_sorter:merge(CFs1, Foo, Args), + ?line CMerged = from_files(Foo, Fmt), + + Args4 = make_args(Fmt, [{size,50} | XArgs]), + ?line ok = file_sorter:merge(CFs1, Foo, [{order,KComp} | Args4]), + ?line CMerged = from_files(Foo, Fmt), + + ?line UMerged1 = lists:umerge(KComp, L11, L21), + ?line UMerged2 = lists:umerge(KComp, L31, L41), + ?line UMerged = lists:umerge(KComp, UMerged1, UMerged2), + ?line ok = file_sorter:merge(CFs1, Foo, [{order,KComp} | UArgs]), + ?line UMerged = from_files(Foo, Fmt), + UArgs2 = + lists:keydelete(order, 1, + make_args(Fmt, [{unique,true}, {size,50} | XArgs])), + ?line ok = file_sorter:merge(CFs1, Foo, [{order,KComp} | UArgs2]), + ?line UMerged = from_files(Foo, Fmt), + ?line delete_files(Foo), + + ?line List1 = [{a,1,x4},{b,2,x4},{c,3,x4}], + ?line List2 = [{a,3,x4},{b,4,x4},{c,5,x4}], + ?line List3 = [{a,5,x4},{b,6,x4},{c,7,x4}], + ?line FsLL = to_files([List1, List2, List3], Fmt, Config), + ?line ok = file_sorter:merge(FsLL, Foo, Args), + ?line List1_2 = lists:merge(KComp,lists:merge(KComp,List1,List2),List3), + ?line List1_2 = from_files(Foo, Fmt), + ?line ok = file_sorter:merge(FsLL, Foo, [{order,KComp} | UArgs]), + ?line UList1_2 = + lists:umerge(KComp,lists:umerge(KComp, List1, List2),List3), + ?line UList1_2 = from_files(Foo, Fmt), + ?line delete_files([Foo | CFs1]), + + fun() -> + ?line LL1 = [{d,4},{e,5},{f,6}], + ?line LL2 = [{a,1},{b,2},{c,3}], + ?line LL3 = [{j,10},{k,11},{l,12}], + ?line LL4 = [{g,7},{h,8},{i,9}], + ?line LL5 = [{p,16},{q,17},{r,18}], + ?line LL6 = [{m,13},{n,14},{o,15}], + ?line LLAll = [LL1,LL2,LL3,LL4,LL5,LL6], + ?line FsLL6 = to_files(LLAll, Fmt, Config), + ?line LL = lists:sort(lists:append(LLAll)), + ?line ok = file_sorter:merge(FsLL6, Foo, Args), + ?line LL = from_files(Foo, Fmt), + ?line ok = file_sorter:merge(FsLL6, Foo, UArgs), + ?line LL = from_files(Foo, Fmt), + ?line delete_files([Foo | FsLL6]) + end(), + + fun() -> + ?line RLL1 = [{b,2},{h,8},{n,14}], + ?line RLL2 = [{a,1},{g,7},{m,13}], + ?line RLL3 = [{d,4},{j,10},{p,16}], + ?line RLL4 = [{c,3},{i,9},{o,15}], + ?line RLL5 = [{f,6},{l,12},{r,18}], + ?line RLL6 = [{e,5},{k,11},{q,17}], + ?line RLLAll = [RLL1,RLL2,RLL3,RLL4,RLL5,RLL6], + ?line RFsLL6 = to_files(RLLAll, Fmt, Config), + ?line RLL = lists:sort(lists:append(RLLAll)), + ?line ok = file_sorter:merge(RFsLL6, Foo, Args), + ?line RLL = from_files(Foo, Fmt), + ?line ok = file_sorter:merge(RFsLL6, Foo, UArgs), + ?line RLL = from_files(Foo, Fmt), + ?line delete_files([Foo | RFsLL6]) + end(), + + ok. + +check(Fmt, Config) -> + Args0 = make_args(Fmt, [{size,5}]), + Args = Args0 ++ [{tmpdir,?privdir(Config)}], + + Fun = fun compare/2, + + L1 = [3,1,2,5,4], + [F1_0] = Fs1 = to_files([L1], Fmt, Config), + F1 = filename:absname(F1_0), + ?line {ok, [{F1,2,1}]} = file_sorter:check(Fs1, Args), + ?line {ok, [{F1,2,1}]} = file_sorter:check(Fs1, [{order,Fun} | Args]), + ?line {ok, [{F1,2,1}]} = file_sorter:check(Fs1, [{unique,true} | Args]), + ?line {ok, [{F1,2,1}]} = + file_sorter:check(Fs1, [{order,Fun},{unique,true} | Args]), + ?line {ok, [{F1,3,2}]} = + file_sorter:check(Fs1, [{order,descending} | Args]), + ?line {ok, [{F1,3,2}]} = + file_sorter:check(Fs1, [{unique,true},{order,descending} | Args]), + ?line delete_files(Fs1), + + L2 = [[1,2,2,3,3,4,5,5],[5,5,4,3,3,2,2,1]], + [F2_0,F3_0] = Fs2 = to_files(L2, Fmt, Config), + F2 = filename:absname(F2_0), + F3 = filename:absname(F3_0), + ?line {ok, [{F3,3,4}]} = file_sorter:check(Fs2, Args), + ?line {ok, [{F3,3,4}]} = file_sorter:check(Fs2, [{order,Fun} | Args]), + ?line {ok, [{F2,3,2},{F3,2,5}]} = + file_sorter:check(Fs2, [{unique, true} | Args]), + ?line {ok, [{F2,3,2},{F3,2,5}]} = + file_sorter:check(Fs2, [{order,Fun},{unique, true} | Args]), + ?line {ok, [{F2,2,2}]} = + file_sorter:check(Fs2, [{order,descending} | Args]), + ?line {ok, [{F2,2,2},{F3,2,5}]} = + file_sorter:check(Fs2, [{unique,true},{order,descending} | Args]), + ?line delete_files(Fs2), + + L3 = [1,2,3,4], + ?line Fs3 = to_files([L3], Fmt, Config), + ?line {ok, []} = file_sorter:check(Fs3, [{unique,true} | Args]), + ?line {ok, []} = + file_sorter:check(Fs3, [{unique,true},{order,Fun} | Args]), + ?line delete_files(Fs3), + + %% big objects + ?line T1 = erlang:make_tuple(10000,foo), + ?line T2 = erlang:make_tuple(10000,bar), + ?line L4 = [T1,T2], + ?line [FF_0] = Fs4 = to_files([L4], Fmt, Config), + FF = filename:absname(FF_0), + ?line {ok, [{FF,2,T2}]} = file_sorter:check(Fs4, [{unique,true} | Args]), + ?line delete_files(Fs4), + + CFun = key_compare(2), + L10 = [[{1,a},{2,b},T10_1={1,b},{3,c}], [{1,b},T10_2={2,a}]], + [F10_0,F11_0] = Fs10 = to_files(L10, Fmt, Config), + F10_1 = filename:absname(F10_0), + F11_1 = filename:absname(F11_0), + ?line {ok, [{F10_1,3,T10_1},{F11_1,2,T10_2}]} = + file_sorter:check(Fs10, [{unique,true},{order,CFun} | Args]), + ?line delete_files(Fs10), + + ok. + +keycheck(Fmt, Config) -> + Args0 = make_args(Fmt, [{size,5}]), + Args = Args0 ++ [{tmpdir,?privdir(Config)}], + + ?line L1 = [[{a,1},{b,2}], [{c,2},{b,1},{a,3}]], + ?line [F1_0,F2_0] = Fs1 = to_files(L1, Fmt, Config), + F1 = filename:absname(F1_0), + F2 = filename:absname(F2_0), + ?line {ok, [{F2,2,{b,1}}]} = file_sorter:keycheck(1, Fs1, Args), + ?line {ok, [{F2,2,{b,1}}]} = + file_sorter:keycheck(1, Fs1, [{unique,true} | Args]), + ?line {ok, [{F1,2,{b,2}}]} = + file_sorter:keycheck(1, Fs1, [{order,descending},{unique,true} | Args]), + ?line delete_files(Fs1), + + L2 = [[{a,1},{a,2},{a,2},{b,2}], [{c,2},{b,1},{b,2},{b,2},{a,3}]], + ?line [F3_0,F4_0] = Fs2 = to_files(L2, Fmt, Config), + F3 = filename:absname(F3_0), + F4 = filename:absname(F4_0), + ?line {ok, [{F4,2,{b,1}}]} = file_sorter:keycheck(1, Fs2, Args), + ?line {ok, [{F3,2,{a,2}},{F4,2,{b,1}}]} = + file_sorter:keycheck(1, Fs2, [{unique,true} | Args]), + ?line {ok, [{F3,4,{b,2}}]} = + file_sorter:keycheck(1, Fs2, [{order,descending} | Args]), + ?line {ok, [{F3,2,{a,2}},{F4,3,{b,2}}]} = + file_sorter:keycheck(1, Fs2, + [{order,descending},{unique,true} | Args]), + ?line delete_files(Fs2), + + ok. + +rev(L, Args) -> + case lists:member({order, descending}, Args) of + true -> + lists:reverse(L); + false -> + L + end. + +make_args({HL, Fmt}, Args) -> + make_args(Fmt, [{header, HL} | Args]); +make_args(Fmt, Args) -> + [{format, Fmt} | Args]. + +compare(X, Y) -> + X =< Y. + +key_compare(I) -> + fun(X, Y) -> + element(I, bin_to_term(X)) =< element(I, bin_to_term(Y)) + end. + +bin_to_term(B) when is_binary(B) -> binary_to_term(B); +bin_to_term(T) -> T. + +-define(CHUNKSIZE, 8096). + +pps() -> + erlang:ports(). + +input(L, N, term) -> + input(L, N); +input(L, N, {_HL, Format}) when Format =:= binary_term; Format =:= binary -> + binput(L, N); +input(L, N, Format) when Format =:= binary_term; Format =:= binary -> + binput(L, N). + +binput(L, N) -> + Bs = lists:map(fun(T) -> term_to_binary(T) end, L), + input(Bs, N). + +input(L, N) -> + fun(close) -> + ok; + (read) -> + case L of + [] -> end_of_input; + _ -> + R = lists:sublist(L, N), + NL = lists:nthtail(length(R), L), + {R, input(NL, N)} + end + end. + +output(L, term) -> + output(L); +output(L, {_HL, Format}) when Format =:= binary_term; Format =:= binary -> + boutput(L); +output(L, Format) when Format =:= binary_term; Format =:= binary -> + boutput(L). + +output(A) -> + fun(close) -> + lists:append(lists:reverse(A)); + (L) when is_list(L) -> + output([L | A]) + end. + +boutput(A) -> + fun(close) -> + Bs = lists:append(lists:reverse(A)), + lists:map(fun(B) -> binary_to_term(B) end, Bs); + (L) when is_list(L) -> + boutput([L | A]) + end. + +outfile(Name, Config) -> + list_to_atom(filename:join(?privdir(Config), Name)). + +%% [[term()]] -> [filename()] +to_files(Lists, term, Config) -> + terms_to_files(Lists, Config); +to_files(Lists, Format, Config) when Format =:= binary_term; + Format =:= binary -> + bins_to_files(Lists, 4, Config); +to_files(Lists, {HL, Format}, Config) when Format =:= binary_term; + Format =:= binary -> + bins_to_files(Lists, HL, Config). + +%% [[term()]] -> [filename()] +terms_to_files(Lists, Config) -> + PrivDir = ?privdir(Config), + terms_to_files(Lists, PrivDir, 1). + +terms_to_files([L | Ls], PrivDir, N) -> + F = lists:concat([?MODULE, '_', N]), + File = filename:join(PrivDir, F), + {ok, Fd} = file:open(File, [write]), + write_terms(Fd, L), + file:close(Fd), + [list_to_atom(File) | terms_to_files(Ls, PrivDir, N+1)]; +terms_to_files([], _PrivDir, _N) -> + []. + +write_terms(Fd, [T | Ts]) -> + io:format(Fd, "~p.~n", [T]), + write_terms(Fd, Ts); +write_terms(_Fd, []) -> + ok. + +%% [[term()]] -> [filename()] +bins_to_files(Lists, HL, Config) -> + PrivDir = ?privdir(Config), + bins_to_files(Lists, PrivDir, 1, HL). + +bins_to_files([L | Fs], PrivDir, N, HL) -> + F = lists:concat([?MODULE, '_', N]), + File = filename:join(PrivDir, F), + {ok, Fd} = file:open(File, [raw,binary,write]), + write_bins(Fd, L, HL), + file:close(Fd), + [list_to_atom(File) | bins_to_files(Fs, PrivDir, N+1, HL)]; +bins_to_files([], _PrivDir, _N, _HL) -> + []. + +write_bins(Fd, [T | Ts], HL) -> + B = term_to_binary(T), + Sz = byte_size(B), + ok = file:write(Fd, [<>, B]), + write_bins(Fd, Ts, HL); +write_bins(_Fd, [], _HL) -> + ok. + +%% [filename()] -> [[term()]] or filename() -> [term()] +from_files(Files, term) -> + terms_from_files(Files); +from_files(Files, Format) when Format =:= binary_term; Format =:= binary -> + bins_from_files(Files, 4); +from_files(Files, {HL, Format}) when Format =:= binary_term; + Format =:= binary -> + bins_from_files(Files, HL). + +%% [filename()] -> [[term()]] or filename() -> [term()] +terms_from_files(File) when is_atom(File) -> + [Terms] = terms_from_files([File]), + Terms; +terms_from_files(Files) -> + lists:map(fun(F) -> terms_from_file(F) end, Files). + +terms_from_file(File) -> + {ok, Fd} = file:open(File, [read,compressed]), + terms_from_file(Fd, []). + +terms_from_file(Fd, L) -> + case io:read(Fd, '') of + {ok, Term} -> + terms_from_file(Fd, [Term | L]); + eof -> + file:close(Fd), + lists:reverse(L) + end. + +%% [filename()] -> [[term()]] +bins_from_files(File, HL) when is_atom(File) -> + [Bins] = bins_from_files([File], HL), + Bins; +bins_from_files(Files, HL) -> + lists:map(fun(F) -> collect(F, HL) end, Files). + +delete_files(File) when is_atom(File) -> + file:delete(File); +delete_files(Files) -> + lists:foreach(fun(F) -> file:delete(F) end, Files). + +%%% +%%% Collects binaries converted to terms in a list. Not very efficient. +%%% +collect(F, HL) -> + {ok, Fd} = file:open(F, [read, binary, raw, compressed]), + R = (catch c(Fd, <<>>, 0, ?CHUNKSIZE, HL, [])), + file:close(Fd), + R. + +c(Fd, Bin0, Size0, NoBytes, HL, L) -> + case file:read(Fd, NoBytes) of + {ok, Bin} -> + Size = Size0 + byte_size(Bin), + NBin = list_to_binary([Bin0, Bin]), + c1(Fd, NBin, Size, HL, L); + eof when Size0 =:= 0 -> + lists:reverse(L); + eof -> + test_server:fail({error, premature_eof}); + Error -> + test_server:fail(Error) + end. + +c1(Fd, B, BinSize, HL, L) -> + case B of + <> -> + if + Size > BinSize - HL, Size > ?CHUNKSIZE -> + c(Fd, B, BinSize, Size + HL, HL, L); + Size > BinSize - HL -> + c(Fd, B, BinSize, ?CHUNKSIZE, HL, L); + true -> + <> = Bin, + E = case catch binary_to_term(BinTerm) of + {'EXIT', _} -> + test_server:fail({error, bad_object}); + Term -> + Term + end, + NBinSize = BinSize - HL - Size, + c1(Fd, R, NBinSize, HL, [E | L]) + end; + _ -> + c(Fd, B, BinSize, ?CHUNKSIZE, HL, L) + end. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/fixtable_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/fixtable_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/fixtable_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/fixtable_SUITE.erl 2009-11-20 13:30:50.000000000 +0000 @@ -0,0 +1,414 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%%---------------------------------------------------------------------- +%%% Purpose : Tests the safe_fixtable functions in both ets and dets. +%%%---------------------------------------------------------------------- + +-module(fixtable_SUITE). +-export([all/1]). +%%% Test cases +-export([multiple_fixes/1, multiple_processes/1, + other_process_deletes/1, owner_dies/1, + other_process_closes/1,insert_same_key/1]). +-export([fixbag/1]). +-export([init_per_testcase/2, fin_per_testcase/2]). +%%% Internal exports +-export([command_loop/0,start_commander/0]). + +all(suite) -> {req, [stdlib], + [multiple_fixes, multiple_processes, + other_process_deletes, owner_dies, + other_process_closes,insert_same_key,fixbag]}. + +-include("test_server.hrl"). + +%%% I wrote this thinking I would use more than one temporary at a time, but +%%% I wasn't... Well, maybe in the future... +-define(DETS_TEMPORARIES, [tmp1]). +-define(ETS_TEMPORARIES, [gurksmetsmedaljong]). +-define(DETS_TMP1,hd(?DETS_TEMPORARIES)). +-define(ETS_TMP1,hd(?ETS_TEMPORARIES)). + +-define(HELPER_NODE, (atom_to_list(?MODULE) ++ "_helper1")). + +init_per_testcase(_Func, Config) -> + PrivDir = ?config(priv_dir,Config), + file:make_dir(PrivDir), + Dog=test_server:timetrap(test_server:seconds(60)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + lists:foreach(fun(X) -> + (catch dets:close(X)), + (catch file:delete(dets_filename(X,Config))) + end, + ?DETS_TEMPORARIES), + lists:foreach(fun(X) -> + (catch ets:delete(X)) + end, + ?ETS_TEMPORARIES). + + +-ifdef(DEBUG). +-define(LOG(X), show(X,?LINE)). + +show(Term, Line) -> + io:format("~p: ~p~n", [Line,Term]), + Term. +-else. +-define(LOG(X),X). +-endif. + + +fixbag(doc) -> + ["Check for bug OTP-5087, safe_fixtable for bags could give " + "incorrect lookups"]; +fixbag(suite) -> + []; +fixbag(Config) when list(Config) -> + ?line T = ets:new(x,[bag]), + ?line ets:insert(T,{a,1}), + ?line ets:insert(T,{a,2}), + ?line ets:safe_fixtable(T,true), + ?line ets:match_delete(T,{a,2}), + ?line ets:insert(T,{a,3}), + ?line Res = ets:lookup(T,a), + ?line ets:safe_fixtable(T,false), + ?line Res = ets:lookup(T,a), + ok. + + + +insert_same_key(doc) -> + ["Check correct behaviour if a key is deleted and reinserted during fixation."]; +insert_same_key(suite) -> + []; +insert_same_key(Config) when list(Config) -> + ?line {ok,Dets1} = dets:open_file(?DETS_TMP1, + [{file, dets_filename(?DETS_TMP1,Config)}]), + ?line Ets1 = ets:new(ets,[]), + ?line insert_same_key(Dets1,dets,Config), + ?line insert_same_key(Ets1,ets,Config), + ?line ets:insert(Ets1,{1,2}), + ?line 1 = ets:info(Ets1,size), + ?line dets:insert(Dets1,{1,2}), + ?line 1 = dets:info(Dets1,size), + ?line dets:close(Dets1), + ?line (catch file:delete(dets_filename(Dets1,Config))), + ?line ets:delete(Ets1), + ?line {ok,Dets2} = dets:open_file(?DETS_TMP1, + [{type,bag},{file, dets_filename(?DETS_TMP1,Config)}]), + ?line Ets2 = ets:new(ets,[bag]), + ?line insert_same_key(Dets2,dets,Config), + ?line insert_same_key(Ets2,ets,Config), + ?line ets:insert(Ets2,{1,2}), + ?line 2 = ets:info(Ets2,size), + ?line ets:insert(Ets2,{1,2}), + ?line 2 = ets:info(Ets2,size), + ?line dets:insert(Dets2,{1,2}), + ?line 2 = dets:info(Dets2,size), + ?line dets:insert(Dets2,{1,2}), + ?line 2 = dets:info(Dets2,size), + ?line dets:close(Dets2), + ?line (catch file:delete(dets_filename(Dets2,Config))), + ?line ets:delete(Ets2), + ?line {ok,Dets3} = dets:open_file(?DETS_TMP1, + [{type,duplicate_bag}, + {file, dets_filename(?DETS_TMP1,Config)}]), + ?line Ets3 = ets:new(ets,[duplicate_bag]), + ?line insert_same_key(Dets3,dets,Config), + ?line insert_same_key(Ets3,ets,Config), + ?line ets:insert(Ets3,{1,2}), + ?line 2 = ets:info(Ets3,size), + ?line ets:insert(Ets3,{1,2}), + ?line 3 = ets:info(Ets3,size), + ?line dets:insert(Dets3,{1,2}), + ?line 2 = dets:info(Dets3,size), + ?line dets:insert(Dets3,{1,2}), + ?line 3 = dets:info(Dets3,size), + ?line dets:close(Dets3), + ?line (catch file:delete(dets_filename(Dets3,Config))), + ?line ets:delete(Ets3), + ok. + +insert_same_key(Tab,Mod,_Config) -> + ?line Mod:insert(Tab,{1,1}), + ?line Mod:insert(Tab,{1,2}), + ?line Mod:insert(Tab,{2,2}), + ?line Mod:insert(Tab,{2,2}), + ?line Mod:safe_fixtable(Tab,true), + ?line Mod:delete(Tab,1), + ?line Mod:insert(Tab,{1,1}), + ?line Expect = case Mod:info(Tab,type) of + bag -> + Mod:insert(Tab,{1,2}), + 2; + _ -> + 1 + end, + ?line Mod:delete(Tab,2), + ?line Mod:safe_fixtable(Tab,false), + ?line case Mod:info(Tab,size) of + Expect -> + ok; + _ -> + exit({size_field_wrong,{Mod,Mod:info(Tab)}}) + end. + + + + +owner_dies(doc) -> + ["Check correct behaviour if the table owner dies."]; +owner_dies(suite) -> + []; +owner_dies(Config) when list(Config) -> + ?line P1 = start_commander(), + ?line Ets1 = command(P1,{ets,new,[ets,[]]}), + ?line command(P1,{ets,safe_fixtable,[Ets1,true]}), + ?line {_,[{P1,1}]} = ets:info(Ets1, safe_fixed), + ?line stop_commander(P1), + ?line undefined = ets:info(Ets1, safe_fixed), + ?line P2 = start_commander(), + ?line Ets2 = command(P2,{ets,new,[ets,[public]]}), + ?line command(P2,{ets,safe_fixtable,[Ets2,true]}), + ?line ets:safe_fixtable(Ets2,true), + ?line true = ets:info(Ets2, fixed), + ?line {_,[{_,1},{_,1}]} = ets:info(Ets2, safe_fixed), + ?line stop_commander(P2), + ?line undefined = ets:info(Ets2, safe_fixed), + ?line undefined = ets:info(Ets2, fixed), + ?line P3 = start_commander(), + ?line {ok,Dets} = ?LOG(command(P3, {dets, open_file, + [?DETS_TMP1, + [{file, + dets_filename(?DETS_TMP1, + Config)}]]})), + ?line command(P3, {dets, safe_fixtable, [Dets, true]}), + ?line {_,[{P3,1}]} = dets:info(Dets, safe_fixed), + ?line true = dets:info(Dets, fixed), + ?line stop_commander(P3), + ?line undefined = dets:info(Dets, safe_fixed), + ?line undefined = dets:info(Dets, fixed), + ?line P4 = start_commander(), + ?line {ok,Dets} = command(P4, {dets, open_file, + [?DETS_TMP1, + [{file, dets_filename(?DETS_TMP1,Config)}]]}), + ?line {ok,Dets} = dets:open_file(?DETS_TMP1, + [{file, dets_filename(?DETS_TMP1,Config)}]), + ?line false = dets:info(Dets, safe_fixed), + ?line command(P4, {dets, safe_fixtable, [Dets, true]}), + ?line dets:safe_fixtable(Dets, true), + ?line {_,[{_,1},{_,1}]} = dets:info(Dets, safe_fixed), + ?line dets:safe_fixtable(Dets, true), + ?line stop_commander(P4), + ?line S = self(), + ?line {_,[{S,2}]} = dets:info(Dets, safe_fixed), + ?line true = dets:info(Dets, fixed), + ?line dets:close(Dets), + ?line undefined = dets:info(Dets, fixed), + ?line undefined = dets:info(Dets, safe_fixed), + ok. + + +other_process_closes(doc) -> + ["When another process closes an dets table, different " + "things should happen depending on if it has opened it before."]; + +other_process_closes(suite) -> + []; + +other_process_closes(Config) when list(Config) -> + ?line {ok,Dets} = dets:open_file(?DETS_TMP1, + [{file, dets_filename(tmp1,Config)}]), + ?line P2 = start_commander(), + ?line dets:safe_fixtable(Dets,true), + ?line S = self(), + ?line {_,[{S,1}]} = dets:info(Dets, safe_fixed), + ?line command(P2,{dets, safe_fixtable, [Dets, true]}), + ?line {_,[_,_]} = dets:info(Dets, safe_fixed), + ?line {error, not_owner} = command(P2,{dets, close, [Dets]}), + ?line {_,[_,_]} = dets:info(Dets, safe_fixed), + ?line command(P2,{dets, open_file,[?DETS_TMP1, + [{file, + dets_filename(?DETS_TMP1, Config)}]]}), + ?line {_,[_,_]} = dets:info(Dets, safe_fixed), + ?line command(P2,{dets, close, [Dets]}), + ?line stop_commander(P2), + ?line {_,[{S,1}]} = dets:info(Dets, safe_fixed), + ?line true = dets:info(Dets,fixed), + ?line dets:close(Dets), + ?line undefined = dets:info(Dets,fixed), + ?line undefined = dets:info(Dets, safe_fixed), + ok. + +other_process_deletes(doc) -> + ["Check that fixtable structures are cleaned up if another process " + "deletes an ets table"]; +other_process_deletes(suite) -> + []; +other_process_deletes(Config) when list(Config) -> + ?line Ets = ets:new(ets,[public]), + ?line P = start_commander(), + ?line ets:safe_fixtable(Ets,true), + ?line ets:safe_fixtable(Ets,true), + ?line true = ets:info(Ets, fixed), + ?line {_,_} = ets:info(Ets, safe_fixed), + ?line command(P,{ets,delete,[Ets]}), + ?line stop_commander(P), + ?line undefined = ets:info(Ets, fixed), + ?line undefined = ets:info(Ets, safe_fixed), + ok. + +multiple_fixes(doc) -> + ["Check that multiple safe_fixtable keeps the reference counter."]; +multiple_fixes(suite) -> + []; +multiple_fixes(Config) when list(Config) -> + ?line {ok,Dets} = dets:open_file(?DETS_TMP1, + [{file, dets_filename(?DETS_TMP1,Config)}]), + ?line Ets = ets:new(ets,[]), + ?line multiple_fixes(Dets,dets), + ?line multiple_fixes(Ets,ets), + ?line dets:close(Dets), + ok. + +multiple_fixes(Tab, Mod) -> + ?line false = Mod:info(Tab,fixed), + ?line false = Mod:info(Tab, safe_fixed), + ?line Mod:safe_fixtable(Tab, true), + ?line true = Mod:info(Tab,fixed), + ?line S = self(), + ?line {_,[{S,1}]} = Mod:info(Tab, safe_fixed), + ?line Mod:safe_fixtable(Tab, true), + ?line Mod:safe_fixtable(Tab, true), + ?line {_,[{S,3}]} = Mod:info(Tab, safe_fixed), + ?line true = Mod:info(Tab,fixed), + ?line Mod:safe_fixtable(Tab, false), + ?line {_,[{S,2}]} = Mod:info(Tab, safe_fixed), + ?line true = Mod:info(Tab,fixed), + ?line Mod:safe_fixtable(Tab, false), + ?line {_,[{S,1}]} = Mod:info(Tab, safe_fixed), + ?line true = Mod:info(Tab,fixed), + ?line Mod:safe_fixtable(Tab, false), + ?line false = Mod:info(Tab, safe_fixed), + ?line false = Mod:info(Tab,fixed). + +multiple_processes(doc) -> + ["Check that multiple safe_fixtable across processes are reference " + "counted OK"]; +multiple_processes(suite) -> + []; +multiple_processes(Config) when list(Config) -> + ?line {ok,Dets} = dets:open_file(?DETS_TMP1,[{file, + dets_filename(?DETS_TMP1, + Config)}]), + ?line Ets = ets:new(ets,[public]), + ?line multiple_processes(Dets,dets), + ?line multiple_processes(Ets,ets), + ok. + +multiple_processes(Tab, Mod) -> + ?line io:format("Mod = ~p\n", [Mod]), + ?line P1 = start_commander(), + ?line P2 = start_commander(), + ?line false = Mod:info(Tab,fixed), + ?line false = Mod:info(Tab, safe_fixed), + ?line command(P1, {Mod, safe_fixtable, [Tab,true]}), + ?line true = Mod:info(Tab,fixed), + ?line {_,[{P1,1}]} = Mod:info(Tab, safe_fixed), + ?line command(P2, {Mod, safe_fixtable, [Tab,true]}), + ?line true = Mod:info(Tab,fixed), + ?line {_,L} = Mod:info(Tab,safe_fixed), + ?line true = (lists:sort(L) == lists:sort([{P1,1},{P2,1}])), + ?line command(P2, {Mod, safe_fixtable, [Tab,true]}), + ?line {_,L2} = Mod:info(Tab,safe_fixed), + ?line true = (lists:sort(L2) == lists:sort([{P1,1},{P2,2}])), + ?line command(P2, {Mod, safe_fixtable, [Tab,false]}), + ?line true = Mod:info(Tab,fixed), + ?line {_,L3} = Mod:info(Tab,safe_fixed), + ?line true = (lists:sort(L3) == lists:sort([{P1,1},{P2,1}])), + ?line command(P2, {Mod, safe_fixtable, [Tab,false]}), + ?line true = Mod:info(Tab,fixed), + ?line {_,[{P1,1}]} = Mod:info(Tab, safe_fixed), + ?line stop_commander(P1), + ?line receive after 1000 -> ok end, + ?line false = Mod:info(Tab,fixed), + ?line false = Mod:info(Tab, safe_fixed), + ?line command(P2, {Mod, safe_fixtable, [Tab,true]}), + ?line true = Mod:info(Tab,fixed), + ?line {_,[{P2,1}]} = Mod:info(Tab, safe_fixed), + case Mod of + dets -> + ?line dets:close(Tab); + ets -> + ?line ets:delete(Tab) + end, + ?line stop_commander(P2), + ?line receive after 1000 -> ok end, + ?line undefined = Mod:info(Tab, safe_fixed), + ok. + + + +%%% Helpers +dets_filename(Base, Config) when atom(Base) -> + dets_filename(atom_to_list(Base) ++ ".dat", Config); +dets_filename(Basename, Config) -> + PrivDir = ?config(priv_dir,Config), + filename:join(PrivDir, Basename). + +command_loop() -> + receive + {From, command, {M,F,A}} -> + Res = (catch apply(M, F, A)), + From ! {self(), Res}, + command_loop(); + die -> + ok + end. + +start_commander() -> + spawn(?MODULE, command_loop, []). + +stop_commander(Pid) -> + process_flag(trap_exit, true), + link(Pid), + Pid ! die, + receive + {'EXIT',Pid,_} -> + timer:sleep(1), % let other processes handle the signal as well + true + after 5000 -> + exit(stop_timeout) + end. + +command(Pid,MFA) -> + Pid ! {self(), command, MFA}, + receive + {Pid, Res} -> + Res + after 20000 -> + exit(command_timeout) + end. + + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/format_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/format_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/format_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/format_SUITE.erl 2009-11-20 13:30:38.000000000 +0000 @@ -0,0 +1,51 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(format_SUITE). +-export([all/1]). + +-export([hang_1/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-include("test_server.hrl"). + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{watchdog, Dog} | Config]. +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(doc) -> + ["Test cases for io:format/[2,3]."]; +all(suite) -> + [hang_1]. + +hang_1(doc) -> + ["Bad args can hang (OTP-2400)"]; +hang_1(suite) -> + []; +hang_1(Config) when list(Config) -> + ?line _ = (catch io:format(a, "", [])), + ?line _ = (catch io:format({}, "", [])), + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/gen_event_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/gen_event_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/gen_event_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/gen_event_SUITE.erl 2009-11-20 13:29:57.000000000 +0000 @@ -0,0 +1,846 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(gen_event_SUITE). + +-include("test_server.hrl"). + +-export([all/1]). +-export([start/1, test_all/1, add_handler/1, add_sup_handler/1, + delete_handler/1, swap_handler/1, swap_sup_handler/1, + notify/1, sync_notify/1, call/1, info/1, hibernate/1]). + +all(suite) -> {req, [stdlib], [start, test_all, hibernate]}. + +%% -------------------------------------- +%% Start an event manager. +%% -------------------------------------- + +start(doc) -> []; +start(suite) -> []; +start(Config) when list(Config) -> + OldFl = process_flag(trap_exit, true), + + ?line {ok, Pid0} = gen_event:start(), %anonymous + ?line [] = gen_event:which_handlers(Pid0), + ?line ok = gen_event:stop(Pid0), + + ?line {ok, Pid1} = gen_event:start_link(), %anonymous + ?line [] = gen_event:which_handlers(Pid1), + ?line ok = gen_event:stop(Pid1), + + ?line {ok, Pid2} = gen_event:start({local, my_dummy_name}), + ?line [] = gen_event:which_handlers(my_dummy_name), + ?line [] = gen_event:which_handlers(Pid2), + ?line ok = gen_event:stop(my_dummy_name), + + ?line {ok, Pid3} = gen_event:start_link({local, my_dummy_name}), + ?line [] = gen_event:which_handlers(my_dummy_name), + ?line [] = gen_event:which_handlers(Pid3), + ?line ok = gen_event:stop(my_dummy_name), + + ?line {ok, Pid4} = gen_event:start_link({global, my_dummy_name}), + ?line [] = gen_event:which_handlers({global, my_dummy_name}), + ?line [] = gen_event:which_handlers(Pid4), + ?line ok = gen_event:stop({global, my_dummy_name}), + + ?line {ok, _} = gen_event:start_link({local, my_dummy_name}), + ?line {error, {already_started, _}} = + gen_event:start_link({local, my_dummy_name}), + ?line {error, {already_started, _}} = + gen_event:start({local, my_dummy_name}), + ?line ok = gen_event:stop(my_dummy_name), + + ?line {ok, Pid5} = gen_event:start_link({global, my_dummy_name}), + ?line {error, {already_started, _}} = + gen_event:start_link({global, my_dummy_name}), + ?line {error, {already_started, _}} = + gen_event:start({global, my_dummy_name}), + + exit(Pid5, shutdown), + receive + {'EXIT', Pid5, shutdown} -> ok + after 10000 -> + ?t:fail(exit_gen_event) + end, + + ?t:messages_get(), + process_flag(trap_exit, OldFl), + ok. + + +hibernate(suite) -> []; +hibernate(Config) when is_list(Config) -> + ?line {ok,Pid} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line true = gen_event:call(my_dummy_handler, dummy_h, hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line later = gen_event:call(my_dummy_handler, dummy_h, hibernate_later), + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line receive after 2000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line gen_event:notify(my_dummy_handler,hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line gen_event:notify(my_dummy_handler,wakeup), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line gen_event:notify(my_dummy_handler,hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line gen_event:sync_notify(my_dummy_handler,wakeup), + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line ok = gen_event:sync_notify(my_dummy_handler,hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy1_h, [self()]), + ?line [_,_] = gen_event:which_handlers(my_dummy_handler), + ?line gen_event:notify(my_dummy_handler,hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line gen_event:notify(my_dummy_handler,wakeup), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line Pid ! gnurf, + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! sleep, + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line ok = gen_event:stop(my_dummy_handler), + ?line {ok,Pid2} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self(),hibernate]), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid2,current_function), + ?line sys:suspend(my_dummy_handler), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid2,current_function), + ?line sys:resume(my_dummy_handler), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid2,current_function), + ?line Pid2 ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid2,current_function)), + + + ?line ok = gen_event:stop(my_dummy_handler), + + ok. + + +test_all(suite) -> [add_handler, add_sup_handler, delete_handler, + swap_handler, swap_sup_handler, notify, + sync_notify, call, info]. + +add_handler(doc) -> []; +add_handler(suite) -> []; +add_handler(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line {error, my_error} = + gen_event:add_handler(my_dummy_handler, dummy_h, make_error), + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + + ?line {error, my_error} = + gen_event:add_handler(my_dummy_handler, {dummy_h, self()}, make_error), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,self()}, + [self()]), + Self = self(), + ?line [{dummy_h, Self}, dummy_h] = + gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +add_sup_handler(doc) -> []; +add_sup_handler(suite) -> []; +add_sup_handler(Config) when list(Config) -> + ?line {ok,Pid} = gen_event:start({local, my_dummy_handler}), + ?line {error, my_error} = + gen_event:add_sup_handler(my_dummy_handler, dummy_h, make_error), + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line exit(Pid, sup_died), + ?t:sleep(1000), + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + + ?line {error, my_error} = + gen_event:add_handler(my_dummy_handler, {dummy_h, self()}, make_error), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_sup_handler(my_dummy_handler, {dummy_h,self()}, + [self()]), + Self = self(), + ?line [{dummy_h, Self}, dummy_h] = + gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:stop(my_dummy_handler), + + ?line receive + {gen_event_EXIT, dummy_h, shutdown} -> + ok + after 1000 -> + ?t:fail({no,{gen_event_EXIT, dummy_h, shutdown}}) + end, + + ?line receive + {gen_event_EXIT, {dummy_h,Self}, shutdown} -> + ok + after 1000 -> + ?t:fail({no,{gen_event_EXIT, {dummy_h,Self}, + shutdown}}) + end, + ok. + +delete_handler(doc) -> []; +delete_handler(suite) -> []; +delete_handler(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line {error, module_not_found} = + gen_event:delete_handler(my_dummy_handler, duuuuuuuuumy, []), + ?line return_hej = + gen_event:delete_handler(my_dummy_handler, dummy_h, return_hej), + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = + gen_event:delete_handler(my_dummy_handler, dummy_h, []), + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,1}, [self()]), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,2}, [self()]), + ?line {error, module_not_found} = + gen_event:delete_handler(my_dummy_handler, {duuuuuuuuumy,1}, []), + ?line return_hej = + gen_event:delete_handler(my_dummy_handler, {dummy_h,1}, return_hej), + ?line return_hej = + gen_event:delete_handler(my_dummy_handler, {dummy_h,2}, return_hej), + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,2}, [self()]), + ?line ok = + gen_event:delete_handler(my_dummy_handler, {dummy_h,2}, []), + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +swap_handler(doc) -> []; +swap_handler(suite) -> []; +swap_handler(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line {error, non_existing} = + gen_event:swap_handler(my_dummy_handler, {faulty_h, swap}, + {dummy1_h, []}), + ?line ok = + gen_event:swap_handler(my_dummy_handler, {dummy_h, swap}, + {dummy1_h, swap}), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:delete_handler(my_dummy_handler, dummy1_h, []), + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,3}, [self()]), + ?line {error, non_existing} = + gen_event:swap_handler(my_dummy_handler, {faulty_h, swap}, + {dummy1_h, []}), + ?line ok = + gen_event:swap_handler(my_dummy_handler, {{dummy_h,3}, swap}, + {{dummy1_h,4}, swap}), + ?line [{dummy1_h,4}] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:delete_handler(my_dummy_handler, {dummy1_h,4}, []), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +swap_sup_handler(doc) -> []; +swap_sup_handler(suite) -> []; +swap_sup_handler(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line {error, non_existing} = + gen_event:swap_handler(my_dummy_handler, {faulty_h, swap}, + {dummy1_h, []}), + ?line ok = + gen_event:swap_handler(my_dummy_handler, {dummy_h, swap}, + {dummy1_h, swap}), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:delete_handler(my_dummy_handler, dummy1_h, []), + ?line receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + after 1000 -> + ?t:fail({no,{gen_event_EXIT, dummy1_h, normal}}) + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, {dummy_h,3}, + [self()]), + ?line {error, non_existing} = + gen_event:swap_sup_handler(my_dummy_handler, {faulty_h, swap}, + {dummy1_h, []}), + ?line ok = + gen_event:swap_sup_handler(my_dummy_handler, {{dummy_h,3}, swap}, + {{dummy1_h,4}, swap}), + ?line [{dummy1_h,4}] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:delete_handler(my_dummy_handler, {dummy1_h,4}, []), + ?line receive + {gen_event_EXIT, {dummy1_h,4}, normal} -> + ok + after 1000 -> + ?t:fail({no,{gen_event_EXIT, {dummy1_h,4}, normal}}) + end, + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +notify(doc) -> []; +notify(suite) -> []; +notify(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + Event = {event, self()}, + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + ?line ok = gen_event:notify(my_dummy_handler, {swap_event,dummy1_h,swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:notify(my_dummy_handler, Event), + ?line receive + {dummy1_h, Event} -> + ok + end, + ?line ok = gen_event:notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ?line ok = gen_event:notify(my_dummy_handler, error_event), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Handler with id, {Mod,Id} + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,5}, [self()]), + ?line [{dummy_h,5}] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + ?line ok = gen_event:notify(my_dummy_handler, + {swap_event, {dummy1_h, 9}, swap}), + ?t:sleep(1000), + ?line [{dummy1_h,9}] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:notify(my_dummy_handler, Event), + ?line receive + {dummy1_h, Event} -> + ok + end, + ?line ok = gen_event:notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,a}, [self()]), + + ?line ok = gen_event:notify(my_dummy_handler, error_event), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Supervised handler. + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + + ?line ok = gen_event:notify(my_dummy_handler, do_crash), + ?line receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = gen_event:notify(my_dummy_handler, {swap_event,dummy1_h,swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:notify(my_dummy_handler, do_crash), + ?line receive + {gen_event_EXIT, dummy1_h, {'EXIT',_}} -> + ok + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = gen_event:notify(my_dummy_handler, {swap_event,dummy1_h,swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +sync_notify(doc) -> []; +sync_notify(suite) -> []; +sync_notify(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + Event = {event, self()}, + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:sync_notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + ?line ok = gen_event:sync_notify(my_dummy_handler, + {swap_event, dummy1_h, swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:sync_notify(my_dummy_handler, Event), + ?line receive + {dummy1_h, Event} -> + ok + end, + ?line ok = gen_event:sync_notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ?line ok = gen_event:sync_notify(my_dummy_handler, error_event), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Handler with id, {Mod,Id} + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,5}, [self()]), + ?line [{dummy_h,5}] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:sync_notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + ?line ok = gen_event:sync_notify(my_dummy_handler, + {swap_event, {dummy1_h, 9}, swap}), + ?t:sleep(1000), + ?line [{dummy1_h,9}] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:sync_notify(my_dummy_handler, Event), + ?line receive + {dummy1_h, Event} -> + ok + end, + ?line ok = gen_event:sync_notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,a}, [self()]), + + ?line ok = gen_event:sync_notify(my_dummy_handler, error_event), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Supervised handler. + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:sync_notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + + ?line ok = gen_event:sync_notify(my_dummy_handler, do_crash), + ?line receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = gen_event:sync_notify(my_dummy_handler, + {swap_event,dummy1_h,swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:sync_notify(my_dummy_handler, do_crash), + ?line receive + {gen_event_EXIT, dummy1_h, {'EXIT',_}} -> + ok + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = gen_event:sync_notify(my_dummy_handler, + {swap_event,dummy1_h,swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:sync_notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +call(doc) -> []; +call(suite) -> []; +call(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h, 1}, [self()]), + ?line [{dummy_h, 1}, dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line {'EXIT',_} = (catch gen_event:call(non_exist, dummy_h, hejsan)), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, bad_h, hejsan), + ?line {ok, hejhopp} = gen_event:call(my_dummy_handler, dummy_h, hejsan), + ?line {ok, hejhopp} = gen_event:call(my_dummy_handler, {dummy_h, 1}, + hejsan), + ?line {ok, hejhopp} = gen_event:call(my_dummy_handler, dummy_h, hejsan, + 10000), + ?line {'EXIT', {timeout, _}} = + (catch gen_event:call(my_dummy_handler, dummy_h, hejsan, 0)), + flush(), + ?line ok = gen_event:delete_handler(my_dummy_handler, {dummy_h, 1}, []), + ?line {ok, swapped} = gen_event:call(my_dummy_handler, dummy_h, + {swap_call,dummy1_h,swap}), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, dummy_h, hejsan), + ?line ok = gen_event:call(my_dummy_handler, dummy1_h, delete_call), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ?line {error, {return, faulty}} = + gen_event:call(my_dummy_handler, dummy_h, error_call), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ?line {error, {'EXIT', _}} = + gen_event:call(my_dummy_handler, dummy_h, exit_call), + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Handler with id, {Mod,Id} + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,1}, [self()]), + ?line [{dummy_h,1}] = gen_event:which_handlers(my_dummy_handler), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, bad_h, hejsan), + ?line {ok, hejhopp} = gen_event:call(my_dummy_handler, {dummy_h,1}, + hejsan), + ?line {ok, swapped} = gen_event:call(my_dummy_handler, {dummy_h,1}, + {swap_call,{dummy1_h,2},swap}), + ?line [{dummy1_h,2}] = gen_event:which_handlers(my_dummy_handler), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, dummy_h, hejsan), + ?line ok = gen_event:call(my_dummy_handler, {dummy1_h,2}, delete_call), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,3}, [self()]), + + ?line {error, {return, faulty}} = + gen_event:call(my_dummy_handler, {dummy_h,3}, error_call), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,4}, [self()]), + + ?line {error, {'EXIT', _}} = + gen_event:call(my_dummy_handler, {dummy_h,4}, exit_call), + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Supervised handler. + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, bad_h, hejsan), + ?line {ok, hejhopp} = gen_event:call(my_dummy_handler, dummy_h, hejsan), + ?line {ok, swapped} = gen_event:call(my_dummy_handler, dummy_h, + {swap_call,dummy1_h,swap}), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, dummy_h, hejsan), + ?line ok = gen_event:call(my_dummy_handler, dummy1_h, delete_call), + ?line receive + {dummy1_h, removed} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + + ?line {error, {return, faulty}} = + gen_event:call(my_dummy_handler, dummy_h, error_call), + ?line receive + {dummy_h, returned_error} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy_h, {return,faulty}} -> + ok + after 1000 -> + ?t:fail({no, {gen_event_EXIT, dummy_h, {return,faulty}}}) + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + + ?line {error, {'EXIT', _}} = + gen_event:call(my_dummy_handler, dummy_h, exit_call), + + ?line receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + after 1000 -> + ?t:fail({no, {gen_event_EXIT, dummy_h, {'EXIT','_'}}}) + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +flush() -> + receive _ -> flush() after 0 -> ok end. + +info(doc) -> []; +info(suite) -> []; +info(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + Info = {info, self()}, + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy_h, Info} -> + ok + end, + ?line my_dummy_handler ! {swap_info,dummy1_h,swap}, + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy1_h, Info} -> + ok + end, + ?line my_dummy_handler ! delete_info, + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ?line my_dummy_handler ! error_info, + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Handler with id, {Mod,Id} + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,1}, [self()]), + ?line [{dummy_h,1}] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy_h, Info} -> + ok + end, + ?line my_dummy_handler ! {swap_info,{dummy1_h,2},swap}, + ?t:sleep(1000), + ?line [{dummy1_h,2}] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy1_h, Info} -> + ok + end, + ?line my_dummy_handler ! delete_info, + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,3}, [self()]), + + ?line my_dummy_handler ! error_info, + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Supervised handler + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy_h, Info} -> + ok + end, + ?line my_dummy_handler ! {swap_info,dummy1_h,swap}, + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy1_h, Info} -> + ok + end, + ?line my_dummy_handler ! delete_info, + ?line receive + {dummy1_h, removed} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + after 1000 -> + ?t:fail({no, {gen_event_EXIT, dummy1_h, normal}}) + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + + ?line my_dummy_handler ! error_info, + ?line receive + {dummy_h, returned_error} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy_h, {return,faulty}} -> + ok + after 1000 -> + ?t:fail({no, {gen_event_EXIT, dummy_h, {return,faulty}}}) + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line my_dummy_handler ! do_crash, + + ?line receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + after 1000 -> + ?t:fail({no, {gen_event_EXIT, dummy_h, {'EXIT','_'}}}) + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/gen_fsm_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/gen_fsm_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/gen_fsm_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/gen_fsm_SUITE.erl 2009-03-12 12:18:50.000000000 +0000 @@ -0,0 +1,838 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(gen_fsm_SUITE). + +-include("test_server.hrl"). + +%% Test cases +-export([all/1]). + +-export([start/1, start1/1, start2/1, start3/1, start4/1 , start5/1, start6/1, + start7/1, start8/1, start9/1, start10/1, start11/1]). + +-export([abnormal/1, abnormal1/1, abnormal2/1]). + +-export([shutdown/1]). + +-export([sys/1, sys1/1]). + +-export([hibernate/1,hiber_idle/3,hiber_wakeup/3,hiber_idle/2,hiber_wakeup/2]). + +-export([enter_loop/1]). + +%% Exports for apply +-export([do_msg/1, do_sync_msg/1]). +-export([enter_loop/2]). + +% The gen_fsm behaviour +-export([init/1, handle_event/3, handle_sync_event/4, terminate/3, + handle_info/3]). +-export([idle/2, idle/3, + timeout/2, + wfor_conf/2, wfor_conf/3, + connected/2, connected/3]). +-export([state0/3]). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +all(suite) -> + [start, abnormal, shutdown, sys, hibernate, enter_loop]. + + + +start(suite) -> [start1, start2, start3, start4, start5, start6, start7, + start8, start9, start10, start11]. + +%% anonymous +start1(Config) when is_list(Config) -> + %%OldFl = process_flag(trap_exit, true), + + ?line {ok, Pid0} = gen_fsm:start_link(gen_fsm_SUITE, [], []), + ?line ok = do_func_test(Pid0), + ?line ok = do_sync_func_test(Pid0), + stop_it(Pid0), +%% ?line stopped = gen_fsm:sync_send_all_state_event(Pid0, stop), +%% ?line {'EXIT', {timeout,_}} = +%% (catch gen_fsm:sync_send_event(Pid0, hej)), + + ?line test_server:messages_get(), + %%process_flag(trap_exit, OldFl), + ok. + +%% anonymous w. shutdown +start2(Config) when is_list(Config) -> + %% Dont link when shutdown + ?line {ok, Pid0} = gen_fsm:start(gen_fsm_SUITE, [], []), + ?line ok = do_func_test(Pid0), + ?line ok = do_sync_func_test(Pid0), + ?line shutdown_stopped = + gen_fsm:sync_send_all_state_event(Pid0, stop_shutdown), + ?line {'EXIT', {noproc,_}} = + (catch gen_fsm:sync_send_event(Pid0, hej)), + + ?line test_server:messages_get(), + ok. + +%% anonymous with timeout +start3(Config) when is_list(Config) -> + %%OldFl = process_flag(trap_exit, true), + + ?line {ok, Pid0} = gen_fsm:start(gen_fsm_SUITE, [], [{timeout,5}]), + ?line ok = do_func_test(Pid0), + ?line ok = do_sync_func_test(Pid0), + ?line stop_it(Pid0), + + ?line {error, timeout} = gen_fsm:start(gen_fsm_SUITE, sleep, + [{timeout,5}]), + + test_server:messages_get(), + %%process_flag(trap_exit, OldFl), + ok. + +%% anonymous with ignore +start4(suite) -> []; +start4(Config) when is_list(Config) -> + OldFl = process_flag(trap_exit, true), + + ?line ignore = gen_fsm:start(gen_fsm_SUITE, ignore, []), + + test_server:messages_get(), + process_flag(trap_exit, OldFl), + ok. + +%% anonymous with stop +start5(suite) -> []; +start5(Config) when is_list(Config) -> + OldFl = process_flag(trap_exit, true), + + ?line {error, stopped} = gen_fsm:start(gen_fsm_SUITE, stop, []), + + test_server:messages_get(), + process_flag(trap_exit, OldFl), + ok. + +%% anonymous linked +start6(Config) when is_list(Config) -> + ?line {ok, Pid} = gen_fsm:start_link(gen_fsm_SUITE, [], []), + ?line ok = do_func_test(Pid), + ?line ok = do_sync_func_test(Pid), + ?line stop_it(Pid), + + test_server:messages_get(), + + ok. + +%% global register linked +start7(Config) when is_list(Config) -> + ?line {ok, Pid} = + gen_fsm:start_link({global, my_fsm}, gen_fsm_SUITE, [], []), + ?line {error, {already_started, Pid}} = + gen_fsm:start_link({global, my_fsm}, gen_fsm_SUITE, [], []), + ?line {error, {already_started, Pid}} = + gen_fsm:start({global, my_fsm}, gen_fsm_SUITE, [], []), + + ?line ok = do_func_test(Pid), + ?line ok = do_sync_func_test(Pid), + ?line ok = do_func_test({global, my_fsm}), + ?line ok = do_sync_func_test({global, my_fsm}), + ?line stop_it({global, my_fsm}), + + test_server:messages_get(), + ok. + + +%% local register +start8(Config) when is_list(Config) -> + %%OldFl = process_flag(trap_exit, true), + + ?line {ok, Pid} = + gen_fsm:start({local, my_fsm}, gen_fsm_SUITE, [], []), + ?line {error, {already_started, Pid}} = + gen_fsm:start({local, my_fsm}, gen_fsm_SUITE, [], []), + + ?line ok = do_func_test(Pid), + ?line ok = do_sync_func_test(Pid), + ?line ok = do_func_test(my_fsm), + ?line ok = do_sync_func_test(my_fsm), + ?line stop_it(Pid), + + test_server:messages_get(), + %%process_flag(trap_exit, OldFl), + ok. + +%% local register linked +start9(Config) when is_list(Config) -> + %%OldFl = process_flag(trap_exit, true), + + ?line {ok, Pid} = + gen_fsm:start_link({local, my_fsm}, gen_fsm_SUITE, [], []), + ?line {error, {already_started, Pid}} = + gen_fsm:start({local, my_fsm}, gen_fsm_SUITE, [], []), + + ?line ok = do_func_test(Pid), + ?line ok = do_sync_func_test(Pid), + ?line ok = do_func_test(my_fsm), + ?line ok = do_sync_func_test(my_fsm), + ?line stop_it(Pid), + + test_server:messages_get(), + %%process_flag(trap_exit, OldFl), + ok. + +%% global register +start10(Config) when is_list(Config) -> + ?line {ok, Pid} = + gen_fsm:start({global, my_fsm}, gen_fsm_SUITE, [], []), + ?line {error, {already_started, Pid}} = + gen_fsm:start({global, my_fsm}, gen_fsm_SUITE, [], []), + ?line {error, {already_started, Pid}} = + gen_fsm:start_link({global, my_fsm}, gen_fsm_SUITE, [], []), + + ?line ok = do_func_test(Pid), + ?line ok = do_sync_func_test(Pid), + ?line ok = do_func_test({global, my_fsm}), + ?line ok = do_sync_func_test({global, my_fsm}), + ?line stop_it({global, my_fsm}), + + test_server:messages_get(), + ok. + + +%% Stop registered processes +start11(Config) when is_list(Config) -> + ?line {ok, Pid} = + gen_fsm:start_link({local, my_fsm}, gen_fsm_SUITE, [], []), + ?line stop_it(Pid), + + ?line {ok, _Pid1} = + gen_fsm:start_link({local, my_fsm}, gen_fsm_SUITE, [], []), + ?line stop_it(my_fsm), + + ?line {ok, Pid2} = + gen_fsm:start({global, my_fsm}, gen_fsm_SUITE, [], []), + ?line stop_it(Pid2), + receive after 1 -> true end, + ?line Result = + gen_fsm:start({global, my_fsm}, gen_fsm_SUITE, [], []), + io:format("Result = ~p~n",[Result]), + ?line {ok, _Pid3} = Result, + ?line stop_it({global, my_fsm}), + + test_server:messages_get(), + ok. + +abnormal(suite) -> [abnormal1, abnormal2]. + +%% Check that time outs in calls work +abnormal1(suite) -> []; +abnormal1(Config) when is_list(Config) -> + ?line {ok, _Pid} = + gen_fsm:start({local, my_fsm}, gen_fsm_SUITE, [], []), + + %% timeout call. + case os:type() of + vxworks -> + %% timeout call for VxWorks must be in 16ms increments. + ?line delayed = gen_fsm:sync_send_event(my_fsm, {delayed_answer,1}, 17), + ?line {'EXIT',{timeout,_}} = + (catch gen_fsm:sync_send_event(my_fsm, {delayed_answer,17}, 1)); + _ -> + ?line delayed = gen_fsm:sync_send_event(my_fsm, {delayed_answer,1}, 100), + ?line {'EXIT',{timeout,_}} = + (catch gen_fsm:sync_send_event(my_fsm, {delayed_answer,10}, 1)) + end, + test_server:messages_get(), + ok. + +%% Check that bad return values makes the fsm crash. Note that we must +%% trap exit since we must link to get the real bad_return_ error +abnormal2(suite) -> []; +abnormal2(Config) when is_list(Config) -> + OldFl = process_flag(trap_exit, true), + ?line {ok, Pid} = + gen_fsm:start_link(gen_fsm_SUITE, [], []), + + %% bad return value in the gen_fsm loop + ?line {'EXIT',{{bad_return_value, badreturn},_}} = + (catch gen_fsm:sync_send_event(Pid, badreturn)), + + test_server:messages_get(), + process_flag(trap_exit, OldFl), + ok. + +shutdown(Config) when is_list(Config) -> + ?line error_logger_forwarder:register(), + + process_flag(trap_exit, true), + + ?line {ok,Pid0} = gen_fsm:start_link(gen_fsm_SUITE, [], []), + ?line ok = do_func_test(Pid0), + ?line ok = do_sync_func_test(Pid0), + ?line {shutdown,reason} = + gen_fsm:sync_send_all_state_event(Pid0, stop_shutdown_reason), + receive {'EXIT',Pid0,{shutdown,reason}} -> ok end, + process_flag(trap_exit, false), + + ?line {'EXIT', {noproc,_}} = + (catch gen_fsm:sync_send_event(Pid0, hej)), + + receive + Any -> + ?line io:format("Unexpected: ~p", [Any]), + ?line ?t:fail() + after 500 -> + ok + end, + + ok. + + +sys(suite) -> [sys1]. + +sys1(Config) when is_list(Config) -> + ?line {ok, Pid} = + gen_fsm:start(gen_fsm_SUITE, [], []), + ?line {status, Pid, {module,gen_fsm}, _} = sys:get_status(Pid), + ?line sys:suspend(Pid), + ?line {'EXIT', {timeout,_}} = + (catch gen_fsm:sync_send_event(Pid, hej)), + ?line sys:resume(Pid), + ?line stop_it(Pid). + + +%% Hibernation +hibernate(suite) -> []; +hibernate(Config) when is_list(Config) -> + OldFl = process_flag(trap_exit, true), + + ?line {ok, Pid0} = gen_fsm:start_link(?MODULE, hiber_now, []), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid0,current_function), + ?line stop_it(Pid0), + test_server:messages_get(), + + + ?line {ok, Pid} = gen_fsm:start_link(?MODULE, hiber, []), + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line hibernating = gen_fsm:sync_send_event(Pid,hibernate_sync), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line good_morning = gen_fsm:sync_send_event(Pid,wakeup_sync), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line hibernating = gen_fsm:sync_send_event(Pid,hibernate_sync), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line five_more = gen_fsm:sync_send_event(Pid,snooze_sync), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line good_morning = gen_fsm:sync_send_event(Pid,wakeup_sync), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line ok = gen_fsm:send_event(Pid,hibernate_async), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line ok = gen_fsm:send_event(Pid,wakeup_async), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line ok = gen_fsm:send_event(Pid,hibernate_async), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line ok = gen_fsm:send_event(Pid,snooze_async), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line ok = gen_fsm:send_event(Pid,wakeup_async), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line Pid ! hibernate_later, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line receive after 2000 -> ok end, + ?line ({current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function)), + ?line 'alive!' = gen_fsm:sync_send_event(Pid,'alive?'), + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line Pid ! hibernate_now, + ?line receive after 1000 -> ok end, + ?line ({current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function)), + ?line 'alive!' = gen_fsm:sync_send_event(Pid,'alive?'), + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + + + ?line hibernating = gen_fsm:sync_send_all_state_event(Pid,hibernate_sync), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line good_morning = gen_fsm:sync_send_all_state_event(Pid,wakeup_sync), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line hibernating = gen_fsm:sync_send_all_state_event(Pid,hibernate_sync), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line five_more = gen_fsm:sync_send_all_state_event(Pid,snooze_sync), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line good_morning = gen_fsm:sync_send_all_state_event(Pid,wakeup_sync), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line ok = gen_fsm:send_all_state_event(Pid,hibernate_async), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line ok = gen_fsm:send_all_state_event(Pid,wakeup_async), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line ok = gen_fsm:send_all_state_event(Pid,hibernate_async), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line ok = gen_fsm:send_all_state_event(Pid,snooze_async), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line ok = gen_fsm:send_all_state_event(Pid,wakeup_async), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + + ?line hibernating = gen_fsm:sync_send_all_state_event(Pid,hibernate_sync), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line sys:suspend(Pid), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line sys:resume(Pid), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = + erlang:process_info(Pid,current_function), + ?line good_morning = gen_fsm:sync_send_all_state_event(Pid,wakeup_sync), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line stop_it(Pid), + test_server:messages_get(), + process_flag(trap_exit, OldFl), + ok. + + + +%%sys1(suite) -> []; +%%sys1(_) -> + +enter_loop(suite) -> + []; +enter_loop(doc) -> + ["Test gen_fsm:enter_loop/4,5,6"]; +enter_loop(Config) when is_list(Config) -> + OldFlag = process_flag(trap_exit, true), + + %% Locally registered process + {local, Name} + ?line {ok, Pid1a} = + proc_lib:start_link(?MODULE, enter_loop, [local, local]), + ?line yes = gen_fsm:sync_send_event(Pid1a, 'alive?'), + ?line stopped = gen_fsm:sync_send_event(Pid1a, stop), + receive + {'EXIT', Pid1a, normal} -> + ok + after 5000 -> + ?line test_server:fail(gen_fsm_did_not_die) + end, + + %% Unregistered process + {local, Name} + ?line {ok, Pid1b} = + proc_lib:start_link(?MODULE, enter_loop, [anon, local]), + receive + {'EXIT', Pid1b, process_not_registered} -> + ok + after 5000 -> + ?line test_server:fail(gen_fsm_did_not_die) + end, + + %% Globally registered process + {global, Name} + ?line {ok, Pid2a} = + proc_lib:start_link(?MODULE, enter_loop, [global, global]), + ?line yes = gen_fsm:sync_send_event(Pid2a, 'alive?'), + ?line stopped = gen_fsm:sync_send_event(Pid2a, stop), + receive + {'EXIT', Pid2a, normal} -> + ok + after 5000 -> + ?line test_server:fail(gen_fsm_did_not_die) + end, + + %% Unregistered process + {global, Name} + ?line {ok, Pid2b} = + proc_lib:start_link(?MODULE, enter_loop, [anon, global]), + receive + {'EXIT', Pid2b, process_not_registered_globally} -> + ok + after 5000 -> + ?line test_server:fail(gen_fsm_did_not_die) + end, + + %% Unregistered process + no name + ?line {ok, Pid3} = + proc_lib:start_link(?MODULE, enter_loop, [anon, anon]), + ?line yes = gen_fsm:sync_send_event(Pid3, 'alive?'), + ?line stopped = gen_fsm:sync_send_event(Pid3, stop), + receive + {'EXIT', Pid3, normal} -> + ok + after 5000 -> + ?line test_server:fail(gen_fsm_did_not_die) + end, + + %% Process not started using proc_lib + ?line Pid4 = + spawn_link(gen_fsm, enter_loop, [?MODULE, [], state0, []]), + receive + {'EXIT', Pid4, process_was_not_started_by_proc_lib} -> + ok + after 5000 -> + ?line test_server:fail(gen_fsm_did_not_die) + end, + + %% Make sure I am the parent, ie that ordering a shutdown will + %% result in the process terminating with Reason==shutdown + ?line {ok, Pid5} = + proc_lib:start_link(?MODULE, enter_loop, [anon, anon]), + ?line yes = gen_fsm:sync_send_event(Pid5, 'alive?'), + ?line exit(Pid5, shutdown), + receive + {'EXIT', Pid5, shutdown} -> + ok + after 5000 -> + ?line test_server:fail(gen_fsm_did_not_die) + end, + + %% Make sure gen_fsm:enter_loop does not accept {local,Name} + %% when it's another process than the calling one which is + %% registered under that name + register(armitage, self()), + ?line {ok, Pid6a} = + proc_lib:start_link(?MODULE, enter_loop, [anon, local]), + receive + {'EXIT', Pid6a, process_not_registered} -> + ok + after 1000 -> + ?line test_server:fail(gen_fsm_started) + end, + unregister(armitage), + + %% Make sure gen_fsm:enter_loop does not accept {global,Name} + %% when it's another process than the calling one which is + %% registered under that name + global:register_name(armitage, self()), + ?line {ok, Pid6b} = + proc_lib:start_link(?MODULE, enter_loop, [anon, global]), + receive + {'EXIT', Pid6b, process_not_registered_globally} -> + ok + after 1000 -> + ?line test_server:fail(gen_server_started) + end, + global:unregister_name(armitage), + + process_flag(trap_exit, OldFlag), + ok. + +enter_loop(Reg1, Reg2) -> + process_flag(trap_exit, true), + case Reg1 of + local -> register(armitage, self()); + global -> global:register_name(armitage, self()); + anon -> ignore + end, + proc_lib:init_ack({ok, self()}), + case Reg2 of + local -> + gen_fsm:enter_loop(?MODULE, [], state0, [], {local,armitage}); + global -> + gen_fsm:enter_loop(?MODULE, [], state0, [], {global,armitage}); + anon -> + gen_fsm:enter_loop(?MODULE, [], state0, []) + end. + +%% +%% Functionality check +%% + +wfor(Msg) -> + receive + Msg -> ok + after 5000 -> + throw(timeout) + end. + + +stop_it(FSM) -> + ?line stopped = gen_fsm:sync_send_all_state_event(FSM, stop), + ?line {'EXIT',_} = (catch gen_fsm:sync_send_event(FSM, hej)), + ok. + + + +do_func_test(FSM) -> + ok = gen_fsm:send_all_state_event(FSM, {'alive?', self()}), + wfor(yes), + ok = do_connect(FSM), + ok = gen_fsm:send_all_state_event(FSM, {'alive?', self()}), + wfor(yes), + test_server:do_times(3, ?MODULE, do_msg, [FSM]), + ok = gen_fsm:send_all_state_event(FSM, {'alive?', self()}), + wfor(yes), + ok = do_disconnect(FSM), + ok = gen_fsm:send_all_state_event(FSM, {'alive?', self()}), + wfor(yes), + ok. + + +do_connect(FSM) -> + check_state(FSM, idle), + gen_fsm:send_event(FSM, {connect, self()}), + wfor(accept), + check_state(FSM, wfor_conf), + gen_fsm:send_event(FSM, confirmation), + check_state(FSM, connected), + ok. + +do_msg(FSM) -> + check_state(FSM, connected), + R = make_ref(), + ok = gen_fsm:send_event(FSM, {msg, R, self(), hej_pa_dig_quasimodo}), + wfor({ak, R}). + + +do_disconnect(FSM) -> + ok = gen_fsm:send_event(FSM, disconnect), + check_state(FSM, idle). + +check_state(FSM, State) -> + case gen_fsm:sync_send_all_state_event(FSM, {get, self()}) of + {state, State, _} -> ok + end. + +do_sync_func_test(FSM) -> + yes = gen_fsm:sync_send_all_state_event(FSM, 'alive?'), + ok = do_sync_connect(FSM), + yes = gen_fsm:sync_send_all_state_event(FSM, 'alive?'), + test_server:do_times(3, ?MODULE, do_sync_msg, [FSM]), + yes = gen_fsm:sync_send_all_state_event(FSM, 'alive?'), + ok = do_sync_disconnect(FSM), + yes = gen_fsm:sync_send_all_state_event(FSM, 'alive?'), + check_state(FSM, idle), + ok = gen_fsm:sync_send_event(FSM, {timeout,200}), + yes = gen_fsm:sync_send_all_state_event(FSM, 'alive?'), + check_state(FSM, idle), + ok. + + +do_sync_connect(FSM) -> + check_state(FSM, idle), + accept = gen_fsm:sync_send_event(FSM, {connect, self()}), + check_state(FSM, wfor_conf), + yes = gen_fsm:sync_send_event(FSM, confirmation), + check_state(FSM, connected), + ok. + +do_sync_msg(FSM) -> + check_state(FSM, connected), + R = make_ref(), + Res = gen_fsm:sync_send_event(FSM, {msg, R, self(), hej_pa_dig_quasimodo}), + if Res == {ak, R} -> + ok + end. + +do_sync_disconnect(FSM) -> + yes = gen_fsm:sync_send_event(FSM, disconnect), + check_state(FSM, idle). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% The Finite State Machine +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +init(ignore) -> + ignore; +init(stop) -> + {stop, stopped}; +init(stop_shutdown) -> + {stop, shutdown}; +init(sleep) -> + test_server:sleep(1000), + {ok, idle, data}; +init({timeout, T}) -> + {ok, idle, state, T}; +init(hiber) -> + {ok, hiber_idle, []}; +init(hiber_now) -> + {ok, hiber_idle, [], hibernate}; +init(_) -> + {ok, idle, state_data}. + + +terminate({From, stopped}, State, _Data) -> + From ! {self(), {stopped, State}}, + ok; +terminate(_Reason, _State, _Data) -> + ok. + + +idle({connect, Pid}, Data) -> + Pid ! accept, + {next_state, wfor_conf, Data}; +idle(badreturn, _Data) -> + badreturn; +idle(_, Data) -> + {next_state, idle, Data}. + +idle({connect, _Pid}, _From, Data) -> + {reply, accept, wfor_conf, Data}; +idle({delayed_answer, T}, _From, Data) -> + test_server:sleep(T), + {reply, delayed, idle, Data}; +idle(badreturn, _From, _Data) -> + badreturn; +idle({timeout,Time}, From, _Data) -> + gen_fsm:send_event_after(Time, {timeout,Time}), + {next_state, timeout, From}; +idle(_, _From, Data) -> + {reply, 'eh?', idle, Data}. + +timeout({timeout,Time}, From) -> + Ref = gen_fsm:start_timer(Time, {timeout,Time}), + {next_state, timeout, {From,Ref}}; +timeout({timeout,Ref,{timeout,Time}}, {From,Ref}) -> + Ref2 = gen_fsm:start_timer(Time, ok), + Cref = gen_fsm:start_timer(Time, cancel), + Time4 = Time*4, + receive after Time4 -> ok end, + gen_fsm:cancel_timer(Cref), + {next_state, timeout, {From,Ref2}}; +timeout({timeout,Ref2,ok},{From,Ref2}) -> + gen_fsm:reply(From, ok), + {next_state, idle, state}. + +wfor_conf(confirmation, Data) -> + {next_state, connected, Data}; +wfor_conf(_, Data) -> + {next_state, idle, Data}. + +wfor_conf(confirmation, _From, Data) -> + {reply, yes, connected, Data}; +wfor_conf(_, _From, Data) -> + {reply, 'eh?', idle, Data}. + +connected({msg, Ref, From, _Msg}, Data) -> + From ! {ak, Ref}, + {next_state, connected, Data}; +connected(disconnect, Data) -> + {next_state, idle, Data}; +connected(_, Data) -> + {next_state, connected, Data}. + +connected({msg, Ref, _From, _Msg}, _, Data) -> + {reply, {ak, Ref}, connected, Data}; +connected(disconnect, _From, Data) -> + {reply, yes, idle, Data}; +connected(_, _, Data) -> + {reply, 'eh?', connected, Data}. + +state0('alive?', _From, Data) -> + {reply, yes, state0, Data}; +state0(stop, _From, Data) -> + {stop, normal, stopped, Data}. + +hiber_idle('alive?', _From, Data) -> + {reply, 'alive!', hiber_idle, Data}; +hiber_idle(hibernate_sync, _From, Data) -> + {reply, hibernating, hiber_wakeup, Data,hibernate}. +hiber_idle(timeout, hibernate_me) -> % Arrive here from + % handle_info(hibernate_later,...) + {next_state, hiber_idle, [], hibernate}; +hiber_idle(hibernate_async, Data) -> + {next_state,hiber_wakeup, Data, hibernate}. + +hiber_wakeup(wakeup_sync,_From,Data) -> + {reply,good_morning,hiber_idle,Data}; +hiber_wakeup(snooze_sync,_From,Data) -> + {reply,five_more,hiber_wakeup,Data,hibernate}. +hiber_wakeup(wakeup_async,Data) -> + {next_state,hiber_idle,Data}; +hiber_wakeup(snooze_async,Data) -> + {next_state,hiber_wakeup,Data,hibernate}. + + +handle_info(hibernate_now, _SName, _State) -> % Arrive here from by direct ! from testcase + {next_state, hiber_idle, [], hibernate}; +handle_info(hibernate_later, _SName, _State) -> + {next_state, hiber_idle, hibernate_me, 1000}; + +handle_info(Info, _State, Data) -> + {stop, {unexpected,Info}, Data}. + +handle_event(hibernate_async, hiber_idle, Data) -> + {next_state,hiber_wakeup, Data, hibernate}; +handle_event(wakeup_async,hiber_wakeup,Data) -> + {next_state,hiber_idle,Data}; +handle_event(snooze_async,hiber_wakeup,Data) -> + {next_state,hiber_wakeup,Data,hibernate}; +handle_event({get, Pid}, State, Data) -> + Pid ! {state, State, Data}, + {next_state, State, Data}; +handle_event(stop, _State, Data) -> + {stop, normal, Data}; +handle_event(stop_shutdown, _State, Data) -> + {stop, shutdown, Data}; +handle_event(stop_shutdown_reason, _State, Data) -> + {stop, shutdown, Data}; +handle_event({'alive?', Pid}, State, Data) -> + Pid ! yes, + {next_state, State, Data}. + +handle_sync_event(hibernate_sync, _From, hiber_idle, Data) -> + {reply, hibernating, hiber_wakeup, Data, hibernate}; +handle_sync_event(wakeup_sync,_From,hiber_wakeup, Data) -> + {reply,good_morning,hiber_idle,Data}; +handle_sync_event(snooze_sync,_From,hiber_wakeup,Data) -> + {reply,five_more,hiber_wakeup,Data,hibernate}; +handle_sync_event('alive?', _From, State, Data) -> + {reply, yes, State, Data}; +handle_sync_event(stop, _From, _State, Data) -> + {stop, normal, stopped, Data}; +handle_sync_event(stop_shutdown, _From, _State, Data) -> + {stop, shutdown, shutdown_stopped, Data}; +handle_sync_event(stop_shutdown_reason, _From, _State, Data) -> + {stop, {shutdown,reason}, {shutdown,reason}, Data}; +handle_sync_event({get, _Pid}, _From, State, Data) -> + {reply, {state, State, Data}, State, Data}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/gen_server_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/gen_server_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/gen_server_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/gen_server_SUITE.erl 2009-03-12 12:18:50.000000000 +0000 @@ -0,0 +1,1049 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(gen_server_SUITE). + +-include("test_server.hrl"). +-include_lib("kernel/include/inet.hrl"). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-export([all/1]). +-export([start/1, crash/1, call/1, cast/1, cast_fast/1, + info/1, abcast/1, multicall/1, multicall_down/1, + call_remote1/1, call_remote2/1, call_remote3/1, + call_remote_n1/1, call_remote_n2/1, call_remote_n3/1, spec_init/1, + spec_init_local_registered_parent/1, + spec_init_global_registered_parent/1, + otp_5854/1, hibernate/1, otp_7669/1 + ]). + +% spawn export +-export([spec_init_local/2, spec_init_global/2, + spec_init_default_timeout/2, spec_init_anonymous/1, + spec_init_anonymous_default_timeout/1, + spec_init_not_proc_lib/1, cast_fast_messup/0]). + + +% The gen_server behaviour +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2]). + +all(suite) -> + [start, crash, call, cast, cast_fast, info, + abcast, multicall, multicall_down, call_remote1, + call_remote2, call_remote3, call_remote_n1, + call_remote_n2, call_remote_n3, spec_init, + spec_init_local_registered_parent, + spec_init_global_registered_parent, + otp_5854,hibernate,otp_7669]. + +-define(default_timeout, ?t:minutes(1)). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{watchdog, Dog} | Config]. +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + + +%% -------------------------------------- +%% Start and stop a gen_server. +%% -------------------------------------- + +start(suite) -> []; +start(Config) when is_list(Config) -> + OldFl = process_flag(trap_exit, true), + + %% anonymous + ?line {ok, Pid0} = gen_server:start(gen_server_SUITE, [], []), + ?line ok = gen_server:call(Pid0, started_p), + ?line ok = gen_server:call(Pid0, stop), + ?line busy_wait_for_process(Pid0,600), + ?line {'EXIT', {noproc,_}} = (catch gen_server:call(Pid0, started_p, 1)), + + %% anonymous with timeout + ?line {ok, Pid00} = gen_server:start(gen_server_SUITE, [], + [{timeout,1000}]), + ?line ok = gen_server:call(Pid00, started_p), + ?line ok = gen_server:call(Pid00, stop), + ?line {error, timeout} = gen_server:start(gen_server_SUITE, sleep, + [{timeout,100}]), + + %% anonymous with ignore + ?line ignore = gen_server:start(gen_server_SUITE, ignore, []), + + %% anonymous with stop + ?line {error, stopped} = gen_server:start(gen_server_SUITE, stop, []), + + %% anonymous linked + ?line {ok, Pid1} = + gen_server:start_link(gen_server_SUITE, [], []), + ?line ok = gen_server:call(Pid1, started_p), + ?line ok = gen_server:call(Pid1, stop), + ?line receive + {'EXIT', Pid1, stopped} -> + ok + after 5000 -> + test_server:fail(not_stopped) + end, + + %% local register + ?line {ok, Pid2} = + gen_server:start({local, my_test_name}, + gen_server_SUITE, [], []), + ?line ok = gen_server:call(my_test_name, started_p), + ?line {error, {already_started, Pid2}} = + gen_server:start({local, my_test_name}, + gen_server_SUITE, [], []), + ?line ok = gen_server:call(my_test_name, stop), + + ?line busy_wait_for_process(Pid2,600), + + ?line {'EXIT', {noproc,_}} = (catch gen_server:call(Pid2, started_p, 10)), + + %% local register linked + ?line {ok, Pid3} = + gen_server:start_link({local, my_test_name}, + gen_server_SUITE, [], []), + ?line ok = gen_server:call(my_test_name, started_p), + ?line {error, {already_started, Pid3}} = + gen_server:start({local, my_test_name}, + gen_server_SUITE, [], []), + ?line ok = gen_server:call(my_test_name, stop), + ?line receive + {'EXIT', Pid3, stopped} -> + ok + after 5000 -> + test_server:fail(not_stopped) + end, + + %% global register + ?line {ok, Pid4} = + gen_server:start({global, my_test_name}, + gen_server_SUITE, [], []), + ?line ok = gen_server:call({global, my_test_name}, started_p), + ?line {error, {already_started, Pid4}} = + gen_server:start({global, my_test_name}, + gen_server_SUITE, [], []), + ?line ok = gen_server:call({global, my_test_name}, stop), + test_server:sleep(1), + ?line {'EXIT', {noproc,_}} = (catch gen_server:call(Pid4, started_p, 10)), + + %% global register linked + ?line {ok, Pid5} = + gen_server:start_link({global, my_test_name}, + gen_server_SUITE, [], []), + ?line ok = gen_server:call({global, my_test_name}, started_p), + ?line {error, {already_started, Pid5}} = + gen_server:start({global, my_test_name}, + gen_server_SUITE, [], []), + ?line ok = gen_server:call({global, my_test_name}, stop), + ?line receive + {'EXIT', Pid5, stopped} -> + ok + after 5000 -> + test_server:fail(not_stopped) + end, + + test_server:messages_get(), + + %% Must wait for all error messages before going to next test. + %% (otherwise it interferes too much with real time characteristics). + case os:type() of + vxworks -> + receive after 5000 -> ok end; + _ -> + ok + end, + process_flag(trap_exit, OldFl), + ok. + +crash(Config) when is_list(Config) -> + ?line error_logger_forwarder:register(), + + process_flag(trap_exit, true), + + %% This crash should not generate a crash report. + ?line {ok,Pid0} = gen_server:start_link(?MODULE, [], []), + ?line {'EXIT',{{shutdown,reason},_}} = + (catch gen_server:call(Pid0, shutdown_reason)), + receive {'EXIT',Pid0,{shutdown,reason}} -> ok end, + + %% This crash should not generate a crash report. + ?line {ok,Pid1} = gen_server:start_link(?MODULE, {state,state1}, []), + ?line {'EXIT',{{shutdown,stop_reason},_}} = + (catch gen_server:call(Pid1, stop_shutdown_reason)), + receive {'EXIT',Pid1,{shutdown,stop_reason}} -> ok end, + + %% This crash should not generate a crash report. + ?line {ok,Pid2} = gen_server:start_link(?MODULE, [], []), + ?line {'EXIT',{shutdown,_}} = + (catch gen_server:call(Pid2, exit_shutdown)), + receive {'EXIT',Pid2,shutdown} -> ok end, + + %% This crash should not generate a crash report. + ?line {ok,Pid3} = gen_server:start_link(?MODULE, {state,state3}, []), + ?line {'EXIT',{shutdown,_}} = + (catch gen_server:call(Pid3, stop_shutdown)), + receive {'EXIT',Pid3,shutdown} -> ok end, + + process_flag(trap_exit, false), + + %% This crash should generate a crash report and a report + %% from gen_server. + ?line {ok,Pid4} = gen_server:start(?MODULE, {state,state4}, []), + ?line {'EXIT',{crashed,_}} = (catch gen_server:call(Pid4, crash)), + receive + {error,_GroupLeader4,{Pid4, + "** Generic server"++_, + [Pid4,crash,state4,crashed]}} -> + ok; + Other4a -> + ?line io:format("Unexpected: ~p", [Other4a]), + ?line ?t:fail() + end, + receive + {error_report,_,{Pid4,crash_report,[List4|_]}} -> + {exit,crashed,_} = proplists:get_value(error_info, List4), + Pid4 = proplists:get_value(pid, List4); + Other4 -> + ?line io:format("Unexpected: ~p", [Other4]), + ?line ?t:fail() + end, + + receive + Any -> + ?line io:format("Unexpected: ~p", [Any]), + ?line ?t:fail() + after 500 -> + ok + end, + + ok. + +%% -------------------------------------- +%% Test gen_server:call and handle_call. +%% Test all different return values from +%% handle_call. +%% -------------------------------------- + +call(suite) -> []; +call(Config) when is_list(Config) -> + OldFl = process_flag(trap_exit, true), + + ?line {ok, _Pid} = + gen_server:start_link({local, my_test_name}, + gen_server_SUITE, [], []), + + ?line ok = gen_server:call(my_test_name, started_p), + ?line delayed = gen_server:call(my_test_name, {delayed_answer,1}), + + %% two requests within a specified time. + ?line ok = gen_server:call(my_test_name, {call_within, 1000}), + test_server:sleep(500), + ?line ok = gen_server:call(my_test_name, next_call), + ?line ok = gen_server:call(my_test_name, {call_within, 1000}), + test_server:sleep(1500), + ?line false = gen_server:call(my_test_name, next_call), + + %% timeout call. + ?line delayed = gen_server:call(my_test_name, {delayed_answer,1}, 30), + ?line {'EXIT',{timeout,_}} = + (catch gen_server:call(my_test_name, {delayed_answer,30}, 1)), + + %% bad return value in the gen_server loop from handle_call. + ?line {'EXIT',{{bad_return_value, badreturn},_}} = + (catch gen_server:call(my_test_name, badreturn)), + + process_flag(trap_exit, OldFl), + ok. + +%% -------------------------------------- +%% Test call to nonexisting processes on remote nodes +%% -------------------------------------- + +start_node(Name) -> + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line N = test_server:start_node(Name, slave, [{args, " -pa " ++ Pa}]), + %% After starting a slave, it takes a little while until global knows + %% about it, even if nodes() includes it, so we make sure that global + %% knows about it before registering something on all nodes. + global:sync(), + N. + +call_remote1(suite) -> []; +call_remote1(Config) when is_list(Config) -> + ?line N = hubba, + ?line {ok, Node} = start_node(N), + ?line {ok, Pid} = rpc:call(Node, gen_server, start, + [{global, N}, ?MODULE, [], []]), + ?line ok = (catch gen_server:call({global, N}, started_p, infinity)), + ?line exit(Pid, boom), + ?line {'EXIT', {Reason, _}} = (catch gen_server:call({global, N}, + started_p, infinity)), + ?line true = (Reason == noproc) orelse (Reason == boom), + ok. + +call_remote2(suite) -> []; +call_remote2(Config) when is_list(Config) -> + ?line N = hubba, + ?line {ok, Node} = start_node(N), + + ?line {ok, Pid} = rpc:call(Node, gen_server, start, + [{global, N}, ?MODULE, [], []]), + ?line ok = (catch gen_server:call(Pid, started_p, infinity)), + ?line exit(Pid, boom), + ?line {'EXIT', {Reason, _}} = (catch gen_server:call(Pid, + started_p, infinity)), + ?line true = (Reason == noproc) orelse (Reason == boom), + ok. + +call_remote3(suite) -> []; +call_remote3(Config) when is_list(Config) -> + ?line N = hubba, + ?line {ok, Node} = start_node(N), + + ?line {ok, Pid} = rpc:call(Node, gen_server, start, + [{local, piller}, ?MODULE, [], []]), + ?line ok = (catch gen_server:call({piller, Node}, started_p, infinity)), + ?line exit(Pid, boom), + ?line {'EXIT', {Reason, _}} = (catch gen_server:call({piller, Node}, + started_p, infinity)), + ?line true = (Reason == noproc) orelse (Reason == boom), + ok. + +%% -------------------------------------- +%% Test call to nonexisting node +%% -------------------------------------- + +call_remote_n1(suite) -> []; +call_remote_n1(Config) when is_list(Config) -> + ?line N = hubba, + ?line {ok, Node} = start_node(N), + ?line {ok, _Pid} = rpc:call(Node, gen_server, start, + [{global, N}, ?MODULE, [], []]), + ?line _ = test_server:stop_node(Node), + ?line {'EXIT', {noproc, _}} = + (catch gen_server:call({global, N}, started_p, infinity)), + + ok. + +call_remote_n2(suite) -> []; +call_remote_n2(Config) when is_list(Config) -> + ?line N = hubba, + ?line {ok, Node} = start_node(N), + + ?line {ok, Pid} = rpc:call(Node, gen_server, start, + [{global, N}, ?MODULE, [], []]), + ?line _ = test_server:stop_node(Node), + ?line {'EXIT', {{nodedown, Node}, _}} = (catch gen_server:call(Pid, + started_p, infinity)), + + ok. + +call_remote_n3(suite) -> []; +call_remote_n3(Config) when is_list(Config) -> + ?line N = hubba, + ?line {ok, Node} = start_node(N), + + ?line {ok, _Pid} = rpc:call(Node, gen_server, start, + [{local, piller}, ?MODULE, [], []]), + ?line _ = test_server:stop_node(Node), + ?line {'EXIT', {{nodedown, Node}, _}} = (catch gen_server:call({piller, Node}, + started_p, infinity)), + + ok. + +%% -------------------------------------- +%% Test gen_server:cast and handle_cast. +%% Test all different return values from +%% handle_cast. +%% -------------------------------------- + +cast(suite) -> []; +cast(Config) when is_list(Config) -> + ?line {ok, Pid} = + gen_server:start({local, my_test_name}, + gen_server_SUITE, [], []), + + ?line ok = gen_server:call(my_test_name, started_p), + + ?line ok = gen_server:cast(my_test_name, {self(),handle_cast}), + ?line receive + {Pid, handled_cast} -> + ok + after 1000 -> + test_server:fail(handle_cast) + end, + + ?line ok = gen_server:cast(my_test_name, {self(),delayed_cast,1}), + ?line receive + {Pid, delayed} -> + ok + after 1000 -> + test_server:fail(delayed_cast) + end, + + ?line ok = gen_server:cast(my_test_name, {self(),stop}), + ?line receive + {Pid, stopped} -> + ok + after 1000 -> + test_server:fail(stop) + end, + ok. + +cast_fast(suite) -> []; +cast_fast(doc) -> ["Test that cast really return immediately"]; +cast_fast(Config) when is_list(Config) -> + ?line {ok,Node} = start_node(hubba), + ?line {_,"@"++Host} = lists:splitwith(fun ($@) -> false; (_) -> true end, + atom_to_list(Node)), + ?line FalseNode = list_to_atom("hopp@"++Host), + ?line true = rpc:cast(Node, ?MODULE, cast_fast_messup, []), +% ?line io:format("Nodes ~p~n", [rpc:call(N, ?MODULE, cast_fast_messup, [])]), + ?line test_server:sleep(1000), + ?line [Node] = nodes(), + ?line {Time,ok} = test_server:timecall(gen_server, cast, + [{hopp,FalseNode},hopp]), + ?line true = test_server:stop_node(Node), + ?line if Time > 1.0 -> % Default listen timeout is about 7.0 s + test_server:fail(hanging_cast); + true -> + ok + end. + +cast_fast_messup() -> + %% Register a false node: hopp@hostname + unregister(erl_epmd), + erl_epmd:start_link(), + {ok,S} = gen_tcp:listen(0, []), + {ok,P} = inet:port(S), + {ok,_Creation} = erl_epmd:register_node(hopp, P), + receive after infinity -> ok end. + +%% -------------------------------------- +%% Test handle_info. +%% -------------------------------------- + +info(suite) -> []; +info(Config) when is_list(Config) -> + ?line {ok, Pid} = + gen_server:start({local, my_test_name}, + gen_server_SUITE, [], []), + + ?line ok = gen_server:call(my_test_name, started_p), + + ?line Pid ! {self(),handle_info}, + ?line receive + {Pid, handled_info} -> + ok + after 1000 -> + test_server:fail(handle_info) + end, + + ?line Pid ! {self(),delayed_info,1}, + ?line receive + {Pid, delayed_info} -> + ok + after 1000 -> + test_server:fail(delayed_info) + end, + + ?line Pid ! {self(),stop}, + ?line receive + {Pid, stopped_info} -> + ok + after 1000 -> + test_server:fail(stop_info) + end, + ok. + +hibernate(suite) -> []; +hibernate(Config) when is_list(Config) -> + OldFl = process_flag(trap_exit, true), + ?line {ok, Pid0} = + gen_server:start_link({local, my_test_name_hibernate0}, + gen_server_SUITE, hibernate, []), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid0,current_function), + ?line ok = gen_server:call(my_test_name_hibernate0, stop), + receive + {'EXIT', Pid0, stopped} -> + ok + after 5000 -> + test_server:fail(gen_server_did_not_die) + end, + + ?line {ok, Pid} = + gen_server:start_link({local, my_test_name_hibernate}, + gen_server_SUITE, [], []), + + ?line ok = gen_server:call(my_test_name_hibernate, started_p), + ?line true = gen_server:call(my_test_name_hibernate, hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Parent = self(), + Fun = fun() -> + receive + go -> + ok + end, + receive + after 1000 -> + ok + end, + X = erlang:process_info(Pid,current_function), + Pid ! continue, + Parent ! {result,X} + end, + ?line Pid2 = spawn_link(Fun), + ?line true = gen_server:call(my_test_name_hibernate, {hibernate_noreply,Pid2}), + + ?line gen_server:cast(my_test_name_hibernate, hibernate_later), + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line receive after 2000 -> ok end, + ?line ({current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function)), + ?line ok = gen_server:call(my_test_name_hibernate, started_p), + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line gen_server:cast(my_test_name_hibernate, hibernate_now), + ?line receive after 1000 -> ok end, + ?line ({current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function)), + ?line ok = gen_server:call(my_test_name_hibernate, started_p), + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line Pid ! hibernate_later, + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line receive after 2000 -> ok end, + ?line ({current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function)), + ?line ok = gen_server:call(my_test_name_hibernate, started_p), + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line Pid ! hibernate_now, + ?line receive after 1000 -> ok end, + ?line ({current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function)), + ?line ok = gen_server:call(my_test_name_hibernate, started_p), + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + ?line receive + {result,R} -> + ?line {current_function,{erlang,hibernate,3}} = R + end, + ?line true = gen_server:call(my_test_name_hibernate, hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line sys:suspend(my_test_name_hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line sys:resume(my_test_name_hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line ok = gen_server:call(my_test_name_hibernate, started_p), + ?line true = ({current_function,{erlang,hibernate,3}} =/= erlang:process_info(Pid,current_function)), + + ?line ok = gen_server:call(my_test_name_hibernate, stop), + receive + {'EXIT', Pid, stopped} -> + ok + after 5000 -> + test_server:fail(gen_server_did_not_die) + end, + process_flag(trap_exit, OldFl), + ok. + +%% -------------------------------------- +%% Test gen_server:abcast and handle_cast. +%% Test all different return values from +%% handle_cast. +%% -------------------------------------- + +abcast(suite) -> []; +abcast(Config) when is_list(Config) -> + ?line {ok, Pid} = + gen_server:start({local, my_test_name}, + gen_server_SUITE, [], []), + + ?line ok = gen_server:call(my_test_name, started_p), + + ?line abcast = gen_server:abcast(my_test_name, {self(),handle_cast}), + ?line receive + {Pid, handled_cast} -> + ok + after 1000 -> + test_server:fail(abcast) + end, + + ?line abcast = gen_server:abcast([node()], my_test_name, + {self(),delayed_cast,1}), + ?line receive + {Pid, delayed} -> + ok + after 1000 -> + test_server:fail(delayed_abcast) + end, + + ?line abcast = gen_server:abcast(my_test_name, {self(),stop}), + ?line receive + {Pid, stopped} -> + ok + after 1000 -> + test_server:fail(abcast_stop) + end, + ok. + +%% -------------------------------------- +%% Test gen_server:multicall and handle_call. +%% Test all different return values from +%% handle_call. +%% -------------------------------------- + +multicall(suite) -> []; +multicall(Config) when is_list(Config) -> + OldFl = process_flag(trap_exit, true), + + ?line {ok, Pid} = + gen_server:start_link({local, my_test_name}, + gen_server_SUITE, [], []), + + ?line ok = gen_server:call(my_test_name, started_p), + Nodes = nodes(), + Node = node(), + ?line {[{Node,delayed}],Nodes} = + gen_server:multi_call(my_test_name, {delayed_answer,1}), + + %% two requests within a specified time. + ?line {[{Node,ok}],[]} = + gen_server:multi_call([Node], my_test_name, {call_within, 1000}), + test_server:sleep(500), + ?line {[{Node,ok}],[]} = + gen_server:multi_call([Node], my_test_name, next_call), + ?line {[{Node,ok}],[]} = + gen_server:multi_call([Node], my_test_name, {call_within, 1000}), + test_server:sleep(1500), + ?line {[{Node,false}],[]} = + gen_server:multi_call([Node],my_test_name, next_call), + + %% Stop the server. + ?line {[{Node,ok}],[]} = + gen_server:multi_call([Node],my_test_name, stop), + receive + {'EXIT', Pid, stopped} -> ok + after 1000 -> + test_server:fail(multicall_stop) + end, + + process_flag(trap_exit, OldFl), + + ok. + +%% OTP-3587 +multicall_down(suite) -> []; +multicall_down(Config) when is_list(Config) -> + %% We need a named host which is inaccessible. + ?line Name = node@test01, + + %% We use 'global' as a gen_server to call. + ?line {Good, Bad} = gen_server:multi_call([Name, node()], + global_name_server, + {whereis, gurkburk}, + 3000), + io:format("good = ~p, bad = ~p~n", [Good, Bad]), + ?line [Name] = Bad, + ok. + +busy_wait_for_process(Pid,N) -> + case erlang:is_process_alive(Pid) of + true -> + receive + after 100 -> + ok + end, + busy_wait_for_process(Pid,N-1); + _ -> + ok + end. +%%-------------------------------------------------------------- +spec_init(doc) -> + ["Test gen_server:enter_loop/[3,4,5]. Used when you want to write " + "your own special init-phase."]; +spec_init(suite) -> + []; +spec_init(Config) when is_list(Config) -> + + OldFlag = process_flag(trap_exit, true), + + ?line {ok, Pid0} = start_link(spec_init_local, [{ok, my_server}, []]), + ?line ok = gen_server:call(Pid0, started_p), + ?line ok = gen_server:call(Pid0, stop), + receive + {'EXIT', Pid0, stopped} -> + ok + after 5000 -> + test_server:fail(gen_server_did_not_die) + end, + + ?line {ok, Pid01} = start_link(spec_init_local, [{not_ok, my_server}, []]), + receive + {'EXIT', Pid01, process_not_registered} -> + ok + after 5000 -> + test_server:fail(gen_server_did_not_die) + end, + + ?line {ok, Pid1} = start_link(spec_init_global, [{ok, my_server}, []]), + ?line ok = gen_server:call(Pid1, started_p), + ?line ok = gen_server:call(Pid1, stop), + receive + {'EXIT', Pid1, stopped} -> + ok + after 5000 -> + test_server:fail(gen_server_did_not_die) + end, + + ?line {ok, Pid11} = + start_link(spec_init_global, [{not_ok, my_server}, []]), + + receive + {'EXIT', Pid11, process_not_registered_globally} -> + ok + after 5000 -> + test_server:fail(gen_server_did_not_die) + end, + + ?line {ok, Pid2} = start_link(spec_init_anonymous, [[]]), + ?line ok = gen_server:call(Pid2, started_p), + ?line ok = gen_server:call(Pid2, stop), + receive + {'EXIT', Pid2, stopped} -> + ok + after 5000 -> + test_server:fail(gen_server_did_not_die) + end, + + ?line {ok, Pid3} = start_link(spec_init_anonymous_default_timeout, [[]]), + ?line ok = gen_server:call(Pid3, started_p), + ?line ok = gen_server:call(Pid3, stop), + receive + {'EXIT', Pid3, stopped} -> + ok + after 5000 -> + test_server:fail(gen_server_did_not_die) + end, + + ?line {ok, Pid4} = + start_link(spec_init_default_timeout, [{ok, my_server}, []]), + ?line ok = gen_server:call(Pid4, started_p), + ?line ok = gen_server:call(Pid4, stop), + receive + {'EXIT', Pid4, stopped} -> + ok + after 5000 -> + test_server:fail(gen_server_did_not_die) + end, + + ?line Pid5 = + erlang:spawn_link(?MODULE, spec_init_not_proc_lib, [[]]), + receive + {'EXIT', Pid5, process_was_not_started_by_proc_lib} -> + ok + after 5000 -> + test_server:fail(gen_server_did_not_die) + end, + process_flag(trap_exit, OldFlag), + ok. + +%%-------------------------------------------------------------- +spec_init_local_registered_parent(doc) -> + ["Test that terminate is run when the parent is a locally registered " + "process OTP-4820"]; +spec_init_local_registered_parent(suite) -> []; +spec_init_local_registered_parent(Config) when is_list(Config) -> + + register(foobar, self()), + process_flag(trap_exit, true), + + ?line {ok, Pid} = start_link(spec_init_local, [{ok, my_server}, []]), + + ?line ok = gen_server:cast(my_server, {self(),stop}), + ?line receive + {Pid, stopped} -> + ok + after 1000 -> + test_server:fail(stop) + end, + unregister(foobar), + ok. +%%-------------------------------------------------------------- +spec_init_global_registered_parent(doc) -> + ["Test that terminate is run when the parent is a global registered " + "process OTP-4820"]; +spec_init_global_registered_parent(suite) -> []; +spec_init_global_registered_parent(Config) when is_list(Config) -> + + global:register_name(foobar, self()), + process_flag(trap_exit, true), + + ?line {ok, Pid} = start_link(spec_init_global, [{ok, my_server}, []]), + + ?line ok = gen_server:call(Pid, started_p), + ?line ok = gen_server:cast(Pid, {self(),stop}), + + ?line receive + {Pid, stopped} -> + ok + after 1000 -> + test_server:fail(stop) + end, + global:unregister_name(foobar), + ok. +%%-------------------------------------------------------------- +otp_5854(suite) -> + []; +otp_5854(doc) -> + ["Test check for registered name in enter_loop/3,4,5"]; +otp_5854(Config) when is_list(Config) -> + OldFlag = process_flag(trap_exit, true), + + %% Make sure gen_server:enter_loop does not accept {local,Name} + %% when it's another process than the calling one which is + %% registered under that name + register(armitage, self()), + ?line {ok, Pid1} = + start_link(spec_init_local, [{not_ok, armitage}, []]), + receive + {'EXIT', Pid1, process_not_registered} -> + ok + after 1000 -> + ?line test_server:fail(gen_server_started) + end, + unregister(armitage), + + %% Make sure gen_server:enter_loop does not accept {global,Name} + %% when it's another process than the calling one which is + %% registered under that name + global:register_name(armitage, self()), + ?line {ok, Pid2} = + start_link(spec_init_global, [{not_ok, armitage}, []]), + receive + {'EXIT', Pid2, process_not_registered_globally} -> + ok + after 1000 -> + ?line test_server:fail(gen_server_started) + end, + global:unregister_name(armitage), + + process_flag(trap_exit, OldFlag), + ok. + +%% If initialization fails (with ignore or {stop,Reason}), +%% make sure that the process is not registered when gen_sever:start() +%% returns. + +otp_7669(Config) when is_list(Config) -> + ?line ?t:do_times(100, fun do_otp_7669_local_ignore/0), + ?line ?t:do_times(100, fun do_otp_7669_global_ignore/0), + ?line ?t:do_times(10, fun do_otp_7669_stop/0), + ok. + +do_otp_7669_local_ignore() -> + %% The name should never be registered after the return + %% from gen_server:start/3. + ?line ignore = gen_server:start({local,?MODULE}, ?MODULE, ignore, []), + ?line undefined = whereis(?MODULE), + ?line ignore = gen_server:start({local,?MODULE}, ?MODULE, ignore, []), + ?line undefined = whereis(?MODULE), + ?line ignore = gen_server:start_link({local,?MODULE}, ?MODULE, ignore, []), + ?line undefined = whereis(?MODULE). + +do_otp_7669_global_ignore() -> + ?line ignore = gen_server:start({global,?MODULE}, ?MODULE, ignore, []), + ?line undefined = global:whereis_name(?MODULE), + ?line ignore = gen_server:start_link({global,?MODULE}, ?MODULE, ignore, []), + ?line undefined = global:whereis_name(?MODULE). + +do_otp_7669_stop() -> + %% The name should never be registered after the return + %% from gen_server:start/3. + ?line {error,stopped} = gen_server:start({local,?MODULE}, + ?MODULE, stop, []), + ?line undefined = whereis(?MODULE), + + ?line {error,stopped} = gen_server:start({global,?MODULE}, + ?MODULE, stop, []), + ?line undefined = global:whereis_name(?MODULE). + +%%-------------------------------------------------------------- +%% Help functions to spec_init_* +start_link(Init, Options) -> + proc_lib:start_link(?MODULE, Init, Options). + +spec_init_local({ok, Name}, Options) -> + process_flag(trap_exit, true), + register(Name, self()), + proc_lib:init_ack({ok, self()}), + %% Supervised init can occur here ... + gen_server:enter_loop(?MODULE, Options, {}, {local, Name}, infinity); + +spec_init_local({not_ok, Name}, Options) -> + process_flag(trap_exit, true), + proc_lib:init_ack({ok, self()}), + %% Supervised init can occur here ... + gen_server:enter_loop(?MODULE, Options, {}, {local, Name}, infinity). + +spec_init_global({ok, Name}, Options) -> + process_flag(trap_exit, true), + global:register_name(Name, self()), + proc_lib:init_ack({ok, self()}), + %% Supervised init can occur here ... + gen_server:enter_loop(?MODULE, Options, {}, {global, Name}, infinity); + +spec_init_global({not_ok, Name}, Options) -> + process_flag(trap_exit, true), + proc_lib:init_ack({ok, self()}), + %% Supervised init can occur here ... + gen_server:enter_loop(?MODULE, Options, {}, {global, Name}, infinity). + +spec_init_default_timeout({ok, Name}, Options) -> + process_flag(trap_exit, true), + register(Name, self()), + proc_lib:init_ack({ok, self()}), + %% Supervised init can occur here ... + gen_server:enter_loop(?MODULE, Options, {}, {local, Name}). + +spec_init_anonymous(Options) -> + process_flag(trap_exit, true), + proc_lib:init_ack({ok, self()}), + %% Supervised init can occur here ... + gen_server:enter_loop(?MODULE, Options, {}, infinity). + +spec_init_anonymous_default_timeout(Options) -> + process_flag(trap_exit, true), + proc_lib:init_ack({ok, self()}), + %% Supervised init can occur here ... + gen_server:enter_loop(?MODULE, Options, {}). + +spec_init_not_proc_lib(Options) -> + gen_server:enter_loop(?MODULE, Options, {}, infinity). + +%%% -------------------------------------------------------- +%%% Here is the tested gen_server behaviour. +%%% -------------------------------------------------------- + +init([]) -> + {ok, []}; +init(ignore) -> + ignore; +init(stop) -> + {stop, stopped}; +init(hibernate) -> + {ok,[],hibernate}; +init(sleep) -> + test_server:sleep(1000), + {ok, []}; +init({state,State}) -> + {ok, State}. + +handle_call(started_p, _From, State) -> + io:format("FROZ"), + {reply,ok,State}; +handle_call({delayed_answer, T}, From, _State) -> + {noreply,{reply_to,From},T}; +handle_call({call_within, T}, _From, _) -> + {reply,ok,call_within,T}; +handle_call(next_call, _From, call_within) -> + {reply,ok,[]}; +handle_call(next_call, _From, State) -> + {reply,false,State}; +handle_call(badreturn, _From, _State) -> + badreturn; +handle_call(hibernate, _From, _State) -> + {reply,true,[],hibernate}; +handle_call({hibernate_noreply,Pid}, From, _State) -> + Pid ! go, + {noreply,From,hibernate}; +handle_call(stop, _From, State) -> + {stop,stopped,ok,State}; +handle_call(crash, _From, _State) -> + exit(crashed); +handle_call(exit_shutdown, _From, _State) -> + exit(shutdown); +handle_call(stop_shutdown, _From, State) -> + {stop,shutdown,State}; +handle_call(shutdown_reason, _From, _State) -> + exit({shutdown,reason}); +handle_call(stop_shutdown_reason, _From, State) -> + {stop,{shutdown,stop_reason},State}. + +handle_cast({From,handle_cast}, State) -> + From ! {self(), handled_cast}, + {noreply, State}; +handle_cast({From,delayed_cast,T}, _State) -> + {noreply, {delayed_cast,From}, T}; +handle_cast(hibernate_now, _State) -> + {noreply, [], hibernate}; +handle_cast(hibernate_later, _State) -> + timer:send_after(1000,self(),hibernate_now), + {noreply, []}; +handle_cast({From, stop}, State) -> + io:format("BAZ"), + {stop, {From,stopped}, State}. + +handle_info(timeout, {reply_to, From}) -> + gen_server:reply(From, delayed), + {noreply, []}; +handle_info(timeout, hibernate_me) -> % Arrive here from + % handle_info(hibernate_later,...) + {noreply, [], hibernate}; +handle_info(hibernate_now, _State) -> % Arrive here from + % handle_cast({_,hibernate_later},...) + % and by direct ! from testcase + {noreply, [], hibernate}; +handle_info(hibernate_later, _State) -> + {noreply, hibernate_me, 1000}; +handle_info(timeout, call_within) -> + {noreply, []}; +handle_info(timeout, {delayed_cast, From}) -> + From ! {self(), delayed}, + {noreply, []}; +handle_info(timeout, {delayed_info, From}) -> + From ! {self(), delayed_info}, + {noreply, []}; +handle_info({From, handle_info}, _State) -> + From ! {self(), handled_info}, + {noreply, []}; +handle_info({From, delayed_info, T}, _State) -> + {noreply, {delayed_info, From}, T}; +handle_info(continue, From) -> + gen_server:reply(From,true), + {noreply, []}; +handle_info({From, stop}, State) -> + {stop, {From,stopped_info}, State}; +handle_info(_Info, State) -> + {noreply, State}. + +terminate({From, stopped}, _State) -> + io:format("FOOBAR"), + From ! {self(), stopped}, + ok; +terminate({From, stopped_info}, _State) -> + From ! {self(), stopped_info}, + ok; +terminate(_Reason, _State) -> + ok. + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/id_transform_SUITE_data/External.hrl erlang-13.b.3-dfsg/lib/stdlib/test/id_transform_SUITE_data/External.hrl --- erlang-13.b.1-dfsg/lib/stdlib/test/id_transform_SUITE_data/External.hrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/id_transform_SUITE_data/External.hrl 2009-11-20 13:31:40.000000000 +0000 @@ -0,0 +1,41 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% Generated by the Erlang ASN.1 compiler version:0.8.1 +%% Purpose: Erlang record definitions for each named and unnamed +%% SEQUENCE and SET in module External + +-record('XSeq1',{bool1, int1, seq1}). +-record('XSeqIn',{boolIn, intIn}). +-record('XSet1',{bool1, int1, set1}). +-record('XSetIn',{boolIn, intIn}). +-record('XSetExt1',{asn1_EXT}). +-record('XSetExt2',{bool, int, asn1_EXT}). +-record('XSetExt3',{asn1_EXT, bool, int}). +-record('XSetExt4',{bool, asn1_EXT, int}). +-record('XSeqExt1',{asn1_EXT}). +-record('XSeqExt2',{bool, int, asn1_EXT}). +-record('XSeqExt3',{asn1_EXT, bool, int}). +-record('XSeqExt4',{bool, asn1_EXT, int}). +-record('XSetNT',{os, bool}). +-record('XSetImp',{os, bool}). +-record('XSetExp',{os, bool}). +-record('XSeqNT',{os, bool}). +-record('XSeqImp',{os, bool}). +-record('XSeqExp',{os, bool}). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/id_transform_SUITE_data/m.hrl erlang-13.b.3-dfsg/lib/stdlib/test/id_transform_SUITE_data/m.hrl --- erlang-13.b.1-dfsg/lib/stdlib/test/id_transform_SUITE_data/m.hrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/id_transform_SUITE_data/m.hrl 2009-11-20 13:31:40.000000000 +0000 @@ -0,0 +1,30 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +-ifndef(M_HRL). +-define(M_HRL, true). + + +-record(m_NotAnInteger, {'OE_ID'="IDL:m/NotAnInteger:1.0"}). + + +-endif. + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/id_transform_SUITE_data/m_i.hrl erlang-13.b.3-dfsg/lib/stdlib/test/id_transform_SUITE_data/m_i.hrl --- erlang-13.b.1-dfsg/lib/stdlib/test/id_transform_SUITE_data/m_i.hrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/id_transform_SUITE_data/m_i.hrl 2009-11-20 13:31:41.000000000 +0000 @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +-ifndef(M_I_HRL). +-define(M_I_HRL, true). + + + + +-endif. + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/id_transform_SUITE_data/oe_ex.hrl erlang-13.b.3-dfsg/lib/stdlib/test/id_transform_SUITE_data/oe_ex.hrl --- erlang-13.b.1-dfsg/lib/stdlib/test/id_transform_SUITE_data/oe_ex.hrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/id_transform_SUITE_data/oe_ex.hrl 2009-11-20 13:31:41.000000000 +0000 @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +-ifndef(OE_EX_HRL). +-define(OE_EX_HRL, true). + + + + +-endif. + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/id_transform_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/id_transform_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/id_transform_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/id_transform_SUITE.erl 2009-11-20 13:31:40.000000000 +0000 @@ -0,0 +1,398 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(id_transform_SUITE). +-author('pan@erix.ericsson.se'). + +-include_lib("kernel/include/file.hrl"). + +-export([all/1, + id_transform/1]). + +-export([check/2,check2/1,g/0,f/1,t/1,t1/1,t2/1,t3/1,t4/1, + t5/1,t6/1,apa/1,new_fun/0]). + +% Serves as test... +-hej(hopp). +-include("test_server.hrl"). + +all(suite) -> [id_transform]. + +id_transform(doc) -> "Test erl_id_trans."; +id_transform(Config) when is_list(Config) -> + ?line File=filename:join([code:lib_dir(stdlib),"examples", + "erl_id_trans.erl"]), + ?line {ok,erl_id_trans,Bin}=compile:file(File,[binary]), + ?line {module,erl_id_trans}=code:load_binary(erl_id_trans,File,Bin), + ?line case test_server:purify_is_running() of + false -> + Dog = ?t:timetrap(?t:hours(1)), + ?line Res = run_in_test_suite(), + ?t:timetrap_cancel(Dog), + Res; + true -> + {skip,"Purify (too slow)"} + end. + +run_in_test_suite() -> + LibDir = code:lib_dir(), + SuperDir = filename:dirname(filename:dirname(code:which(?MODULE))), + TestDirs = filelib:wildcard(filename:join([SuperDir,"*_test"])), + {All,Res} = case LibDir of + "/clearcase/otp/erts/lib" -> + %% Only test_suites 'cause clearcase is too slow... + {false,run_list(TestDirs)}; + _ -> + {true,run_codepath_and(TestDirs)} + end, + Comment0 = case All of + true -> []; + false -> "Only testsuite directories traversed" + end, + case Res of + {error,Reason} when Comment0 =/= [] -> + {failed,Comment0++"; "++Reason}; + {error,Reason} -> + {failed,Reason}; + ok -> + {comment,Comment0} + end. + +run_codepath_and(DirList) -> + AbsDirs = [filename:absname(X) || X <- code:get_path()], + run_list(ordsets:from_list([X || X <- AbsDirs] ++ DirList)). + +run_list(PathL) -> + io:format("Where to search for beam files:\n~p\n", [PathL]), + io:format("Searching for beam files ...~n",[]), + Beams = collect_beams(PathL, []), + io:format("~p beam files\n", [length(Beams)]), + io:format("Applying erl_id_trans to found beam files...~n",[]), + Res = [do_trans(X) || X <- Beams], + io:format("...done~n",[]), + Successes = [X || {ok,X} <- Res], + SevereFailures = [{F,E} || {failed,{F,{transform,E}}} <- Res], + BeamLib = [{F,E} || {failed,{F,{beam_lib,E}}} <- Res], + io:format("~p files processed", [length(Res)]), + io:format("~p files successfully transformed", [length(Successes)]), + case length(SevereFailures) of + 0 -> ok; + SevLen -> + io:format("\n~p severe failures:\n~p", + [SevLen,SevereFailures]) + end, + case BeamLib of + [] -> ok; + _ -> io:format("\nbeam_lib failures:\n~p", [BeamLib]) + end, + case length(SevereFailures) of + 0 -> ok; + Len -> {error,integer_to_list(Len)++" failures"} + end. + + +collect_beams([P0|Ps], Acc) -> + Wc = filename:join(filename:absname(P0), "*.beam"), + collect_beams(Ps, filelib:wildcard(Wc)++Acc); +collect_beams([], Acc) -> Acc. + +do_trans(Beam) -> + case beam_lib:chunks(Beam, [abstract_code]) of + {ok,{_Mod,[{abstract_code,no_abstract_code}]}} -> + {failed,{Beam,{beam_lib,no_debug_info}}}; + {ok,{_Mod,[{abstract_code,{raw_abstract_v1,Abst}}]}} -> + do_trans_1(Beam, Abst); + {ok,{_Mod,[{abstract_code,{Tag,_}}]}} -> + {failed,{Beam,{beam_lib,{wrong_type_of_debug_info,Tag}}}}; + {ok,{_Mod,[{abstract_code,_}]}} -> + {failed,{Beam,{beam_lib,unknown_type_of_debug_info}}}; + {error,beam_lib,{missing_chunk,_,_}} -> + {failed,{Beam,{beam_lib,no_debug_info}}}; + Error -> + {failed,{Beam,{beam_lib,Error}}} + end. + +do_trans_1(File, Tree0) -> + case catch erl_id_trans:parse_transform(Tree0, []) of + Tree0 when is_list(Tree0) -> + {ok,File}; + Tree when is_list(Tree) -> + {failed,{File,{transform,output_not_same_as_input}}}; + {'EXIT', Reason} -> + {failed,{File,{transform,{crash,Reason}}}}; + Else -> + {failed,{File,{transform,{unknown,Else}}}} + end. + +% From here on there's only fake code to serve as test cases +% for the id_transform. +% They need to be exported. + +check(X,_Y) when X -> + true; +check(A,_) when atom(A) -> + atom; +check(A,_) when erlang:is_list(A) -> + list; +check(A,B) when erlang:'+'(A,B) -> + atom; +check(_,_) -> + false. + +check2(A) -> + case A of + "hej" ++ "hopp" -> + a; + [$l,$e,$k] ++ "hopp" -> + a; + [1] ++ [2] -> + b + end. + +-record(x,{x,y}). +-record(y,{x=1,y=0}). + +g() -> + #y.y. + +f(#y.y) -> + vansinne; + +f(X) when X =:= #y.y -> + {#y.y,_Y} = {X,hej}; +f(#x{_='_'}) -> + hopp; +f(#x{x=true,y=true}) -> + babba; +f(A) when A == #x{x=true,y=true} -> + true; +f(A) when A#x.x == 4 -> + #x{x = 1, _ = 2}; +f(X) -> + if X#x.y -> + ok; + element(3,X) -> + banan; + true -> + nok + end. + +% Stolen from erl_lint_SUITE.erl +-record(apa, {}). + +t(A) when atom(A) -> + atom; +t(A) when binary(A) -> + binary; +t(A) when float(A) -> + float; +t(A) when function(A) -> + function; +t(A) when integer(A) -> + integer; +t(A) when is_atom(A) -> + is_atom; +t(A) when is_binary(A) -> + is_binary; +t(A) when is_float(A) -> + is_float; +t(A) when is_function(A) -> + is_function; +t(A) when is_integer(A) -> + is_integer; +t(A) when is_list(A) -> + is_list; +t(A) when is_number(A) -> + is_number; +t(A) when is_pid(A) -> + is_pid; +t(A) when is_port(A) -> + is_port; +t(A) when is_record(A, apa) -> + is_record; +t(A) when is_reference(A) -> + is_reference; +t(A) when is_tuple(A) -> + is_tuple; +t(A) when list(A) -> + list; +t(A) when number(A) -> + number; +t(A) when pid(A) -> + pid; +t(A) when port(A) -> + port; +t(A) when record(A, apa) -> + record; +t(A) when reference(A) -> + reference; +t(A) when tuple(A) -> + tuple. + +t1(A) when atom(A), atom(A) -> + atom; +t1(A) when binary(A), binary(A) -> + binary; +t1(A) when float(A), float(A) -> + float; +t1(A) when function(A), function(A) -> + function; +t1(A) when integer(A), integer(A) -> + integer; +t1(A) when is_atom(A), is_atom(A) -> + is_atom; +t1(A) when is_binary(A), is_binary(A) -> + is_binary; +t1(A) when is_float(A), is_float(A) -> + is_float; +t1(A) when is_function(A), is_function(A) -> + is_function; +t1(A) when is_integer(A), is_integer(A) -> + is_integer; +t1(A) when is_list(A), is_list(A) -> + is_list; +t1(A) when is_number(A), is_number(A) -> + is_number; +t1(A) when is_pid(A), is_pid(A) -> + is_pid; +t1(A) when is_port(A), is_port(A) -> + is_port; +t1(A) when is_record(A, apa), is_record(A, apa) -> + is_record; +t1(A) when is_reference(A), is_reference(A) -> + is_reference; +t1(A) when is_tuple(A), is_tuple(A) -> + is_tuple; +t1(A) when list(A), list(A) -> + list; +t1(A) when number(A), number(A) -> + number; +t1(A) when pid(A), pid(A) -> + pid; +t1(A) when port(A), port(A) -> + port; +t1(A) when record(A, apa), record(A, apa) -> + record; +t1(A) when reference(A), reference(A) -> + reference; +t1(A) when tuple(A), tuple(A) -> + tuple. + +t2(A) when atom(A); atom(A) -> + atom; +t2(A) when binary(A); binary(A) -> + binary; +t2(A) when float(A); float(A) -> + float; +t2(A) when function(A); function(A) -> + function; +t2(A) when integer(A); integer(A) -> + integer; +t2(A) when is_atom(A); is_atom(A) -> + is_atom; +t2(A) when is_binary(A); is_binary(A) -> + is_binary; +t2(A) when is_float(A); is_float(A) -> + is_float; +t2(A) when is_function(A); is_function(A) -> + is_function; +t2(A) when is_integer(A); is_integer(A) -> + is_integer; +t2(A) when is_list(A); is_list(A) -> + is_list; +t2(A) when is_number(A); is_number(A) -> + is_number; +t2(A) when is_pid(A); is_pid(A) -> + is_pid; +t2(A) when is_port(A); is_port(A) -> + is_port; +t2(A) when is_record(A, apa); is_record(A, apa) -> + is_record; +t2(A) when is_reference(A); is_reference(A) -> + is_reference; +t2(A) when is_tuple(A); is_tuple(A) -> + is_tuple; +t2(A) when list(A); list(A) -> + list; +t2(A) when number(A); number(A) -> + number; +t2(A) when pid(A); pid(A) -> + pid; +t2(A) when port(A); port(A) -> + port; +t2(A) when record(A, apa); record(A, apa) -> + record; +t2(A) when reference(A); reference(A) -> + reference; +t2(A) when tuple(A); tuple(A) -> + tuple. + +t3(A) when is_atom(A) or is_atom(A) -> + is_atom; +t3(A) when is_binary(A) or is_binary(A) -> + is_binary; +t3(A) when is_float(A) or is_float(A) -> + is_float; +t3(A) when is_function(A) or is_function(A) -> + is_function; +t3(A) when is_integer(A) or is_integer(A) -> + is_integer; +t3(A) when is_list(A) or is_list(A) -> + is_list; +t3(A) when is_number(A) or is_number(A) -> + is_number; +t3(A) when is_pid(A) or is_pid(A) -> + is_pid; +t3(A) when is_port(A) or is_port(A) -> + is_port; +t3(A) when is_record(A, apa) or is_record(A, apa) -> + is_record; +t3(A) when is_reference(A) or is_reference(A) -> + is_reference; +t3(A) when is_tuple(A) or is_tuple(A) -> + is_tuple; +t3(A) when record(A, apa) -> + foo; +t3(A) when {erlang,is_record}(A, apa) -> + foo; +t3(A) when erlang:is_record(A, apa) -> + foo; +t3(A) when is_record(A, apa) -> + foo; +t3(A) when record({apa}, apa) -> + {A,foo}. + +t4(_) when {erlang,is_record}({apa}, apa) -> + foo. + +t5(A) when erlang:is_record({apa}, apa) -> + {A,foo}. + +t6(A) when is_record({apa}, apa) -> + {A,foo}. + +-record(apa2,{a=a,b=foo:bar()}). +apa(1) -> + [X || X <- [], #apa2{a = a} == {r,X,foo}]; +apa(2) -> + [X || X <- [], #apa2{b = b} == {r,X,foo}]; +apa(3) -> + [X || X <- [], 3 == X#apa2.a]. + +new_fun() -> + lists:map(fun erlang:abs/1, [-1,3,4]). Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/external_utf16_big_bom.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/external_utf16_big_bom.dat differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/external_utf16_little_bom.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/external_utf16_little_bom.dat differ diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/external_utf8_bom.dat erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/external_utf8_bom.dat --- erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/external_utf8_bom.dat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/external_utf8_bom.dat 2009-03-12 12:22:39.000000000 +0000 @@ -0,0 +1 @@ +Återerövra \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_latin1.dat erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_latin1.dat --- erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_latin1.dat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_latin1.dat 2009-03-12 12:22:40.000000000 +0000 @@ -0,0 +1,2 @@ +åäö +ÅÄÖ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf16_big_bom.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf16_big_bom.dat differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf16_big.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf16_big.dat differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf16_little_bom.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf16_little_bom.dat differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf16_little.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf16_little.dat differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf32_big_bom.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf32_big_bom.dat differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf32_big.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf32_big.dat differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf32_little_bom.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf32_little_bom.dat differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf32_little.dat and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf32_little.dat differ diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf8_bom.dat erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf8_bom.dat --- erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf8_bom.dat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf8_bom.dat 2009-03-12 12:22:40.000000000 +0000 @@ -0,0 +1 @@ +тхе биг ред фоь Ñ…Ð°Ñ Ñоь Τηε βιγ Ïεδ σοχ αÏε φοχεσ \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf8.dat erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf8.dat --- erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf8.dat 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE_data/testdata_utf8.dat 2009-03-12 12:22:40.000000000 +0000 @@ -0,0 +1 @@ +тхе биг ред фоь Ñ…Ð°Ñ Ñоь Τηε βιγ Ïεδ σοχ αÏε φοχεσ \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/io_proto_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/io_proto_SUITE.erl 2009-06-05 13:54:20.000000000 +0100 @@ -0,0 +1,1824 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(io_proto_SUITE). + +-export([all/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-export([setopts_getopts/1,unicode_options/1,unicode_options_gen/1, binary_options/1, bc_with_r12/1, + bc_with_r12_gl/1, read_modes_gl/1,bc_with_r12_ogl/1, read_modes_ogl/1, broken_unicode/1,eof_on_pipe/1]). + + +-export([io_server_proxy/1,start_io_server_proxy/0, proxy_getall/1, proxy_setnext/2, proxy_quit/1]). +%% For spawn +-export([toerl_server/3,hold_the_line/3,answering_machine1/3, + answering_machine2/3]). + +%-define(without_test_server, true). + +-ifdef(without_test_server). +-define(line, put(line, ?LINE), ). +-define(config(X,Y), foo). +-define(t, test_server). +-define(privdir(_), "./io_SUITE_priv"). +-else. +-include("test_server.hrl"). +-define(privdir(Conf), ?config(priv_dir, Conf)). +-endif. + +%-define(debug, true). + +-ifdef(debug). +-define(format(S, A), io:format(S, A)). +-define(dbg(Data),io:format(standard_error, "DBG: ~p\r\n",[Data])). +-else. +-define(format(S, A), ok). +-define(dbg(Data),noop). +-endif. + + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(20)). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + Term = case os:getenv("TERM") of + List when is_list(List) -> + List; + _ -> + "dumb" + end, + os:putenv("TERM","vt100"), + [{watchdog, Dog}, {term, Term} | Config]. +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + Term = ?config(term,Config), + os:putenv("TERM",Term), + test_server:timetrap_cancel(Dog), + ok. + +all(doc) -> + ["Test cases for the io_protocol."]; +all(suite) -> + [setopts_getopts, unicode_options, unicode_options_gen, binary_options, bc_with_r12, + bc_with_r12_gl,bc_with_r12_ogl, read_modes_gl, read_modes_ogl, + broken_unicode,eof_on_pipe]. + + +-record(state, { + q = [], + nxt = eof, + mode = list + }). + +setopts_getopts(suite) -> + []; +setopts_getopts(doc) -> + ["Check io:setopts and io:getopts functions"]; +setopts_getopts(Config) when is_list(Config) -> + ?line FileName = filename:join([?config(priv_dir,Config), + "io_proto_SUITE_setopts_getopts.dat"]), + ?line {ok,WFile} = file:open(FileName,[write]), + ?line Server = start_io_server_proxy(), + ?line [{binary, false}] = io:getopts(Server), + ?line [getopts] = proxy_getall(Server), + ?line [{binary,false},{encoding,latin1}] = lists:sort(io:getopts(WFile)), + ?line proxy_setnext(Server,"Hej"), + ?line "Hej" = io:get_line(Server,''), + ?line proxy_setnext(Server,"Hej"++[532]), + ?line [$H,$e,$j,532] = io:get_line(Server,''), + ?line ok = io:setopts(Server,[{binary,true}]), + ?line proxy_setnext(Server,"Hej"), + ?line <<"Hej">> = io:get_line(Server,''), + ?line proxy_setnext(Server,"Hej"++[532]), + ?line <<72,101,106,200,148>> = io:get_line(Server,''), + ?line [$H,$e,$j,532] = lists:flatten(io_lib:format("~ts",[<<72,101,106,200,148>>])), + ?line file:write(WFile,<<"HejA">>), + ?line file:write(WFile,unicode:characters_to_binary("Hej"++[532],unicode,unicode)), + ?line file:write(WFile,unicode:characters_to_binary("Hej"++[532],unicode,{utf16,big})), + ?line file:write(WFile,unicode:characters_to_binary("Hej"++[532],unicode,{utf16,little})), + ?line file:write(WFile,unicode:characters_to_binary("Hej"++[532],unicode,{utf32,big})), + ?line file:write(WFile,unicode:characters_to_binary("Hej"++[532],unicode,{utf32,little})), + ?line file:close(WFile), + ?line {ok,RFile} = file:open(FileName,[read]), + ?line [{binary,false},{encoding,latin1}] = lists:sort(io:getopts(RFile)), + ?line [$H,$e,$j,$A] = io:get_chars(RFile,'',4), + ?line io:setopts(RFile,[{encoding,unicode}]), + ?line [$H,$e,$j,532] = io:get_chars(RFile,'',4), + ?line [{binary,false},{encoding,unicode}] = lists:sort(io:getopts(RFile)), + ?line io:setopts(RFile,[{encoding,{utf16,big}}]), + ?line [$H,$e,$j,532] = io:get_chars(RFile,'',4), + ?line [{binary,false},{encoding,{utf16,big}}] = + lists:sort(io:getopts(RFile)), + ?line io:setopts(RFile,[{encoding,{utf16,little}}]), + ?line [$H,$e,$j,532] = io:get_chars(RFile,'',4), + ?line [{binary,false},{encoding,{utf16,little}}] = + lists:sort(io:getopts(RFile)), + ?line io:setopts(RFile,[{encoding,{utf32,big}}]), + ?line [$H,$e,$j,532] = io:get_chars(RFile,'',4), + ?line [{binary,false},{encoding,{utf32,big}}] = + lists:sort(io:getopts(RFile)), + ?line io:setopts(RFile,[{encoding,{utf32,little}}]), + ?line [$H,$e,$j,532] = io:get_chars(RFile,'',4), + ?line [{binary,false},{encoding,{utf32,little}}] = + lists:sort(io:getopts(RFile)), + ?line eof = io:get_line(RFile,''), + ?line file:position(RFile,0), + ?line io:setopts(RFile,[{binary,true},{encoding,latin1}]), + ?line <<$H,$e,$j,$A>> = io:get_chars(RFile,'',4), + ?line [{binary,true},{encoding,latin1}] = lists:sort(io:getopts(RFile)), + ?line io:setopts(RFile,[{encoding,unicode}]), + ?line <<$H,$e,$j,532/utf8>> = io:get_chars(RFile,'',4), + ?line [{binary,true},{encoding,unicode}] = lists:sort(io:getopts(RFile)), + ?line io:setopts(RFile,[{encoding,{utf16,big}}]), + ?line <<$H,$e,$j,532/utf8>> = io:get_chars(RFile,'',4), + ?line [{binary,true},{encoding,{utf16,big}}] = + lists:sort(io:getopts(RFile)), + ?line io:setopts(RFile,[{encoding,{utf16,little}}]), + ?line <<$H,$e,$j,532/utf8>> = io:get_chars(RFile,'',4), + ?line [{binary,true},{encoding,{utf16,little}}] = + lists:sort(io:getopts(RFile)), + ?line io:setopts(RFile,[{encoding,{utf32,big}}]), + ?line <<$H,$e,$j,532/utf8>> = io:get_chars(RFile,'',4), + ?line [{binary,true},{encoding,{utf32,big}}] = + lists:sort(io:getopts(RFile)), + ?line io:setopts(RFile,[{encoding,{utf32,little}}]), + ?line <<$H,$e,$j,532/utf8>> = io:get_chars(RFile,'',4), + ?line [{binary,true},{encoding,{utf32,little}}] = + lists:sort(io:getopts(RFile)), + ?line eof = io:get_line(RFile,''), + ?line file:close(RFile), + %% So, lets test another node with new interactive shell + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline, "2"}, + {putline, "lists:keyfind(binary,1,io:getopts())."}, + {getline, "{binary,false}"}, + {putline, "io:get_line('')."}, + {putline, "hej"}, + {getline, "\"hej\\n\""}, + {putline, "io:setopts([{binary,true}])."}, + {getline, "ok"}, + {putline, "io:get_line('')."}, + {putline, "hej"}, + {getline, "<<\"hej\\n\">>"} + ],[]), + %% And one with oldshell + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline_re, ".*2."}, + {getline, "2"}, + {putline, "lists:keyfind(binary,1,io:getopts())."}, + {getline_re, ".*{binary,false}"}, + {putline, "io:get_line('')."}, + {putline, "hej"}, + {getline_re, ".*\"hej\\\\n\""}, + {putline, "io:setopts([{binary,true}])."}, + {getline_re, ".*ok"}, + {putline, "io:get_line('')."}, + {putline, "hej"}, + {getline_re, ".*<<\"hej\\\\n\">>"} + ],[],[],"-oldshell"), + ok. + +unicode_options(suite) -> + []; +unicode_options(doc) -> + ["Tests various unicode options"]; +unicode_options(Config) when is_list(Config) -> + DataDir = ?config(data_dir,Config), + PrivDir = ?config(priv_dir,Config), + %% A string in both russian and greek characters, which is present + %% in all the internal test files (but in different formats of course)... + TestData = [1090,1093,1077,32,1073,1080,1075,32, + 1088,1077,1076,32,1092,1086,1100,32,1093, + 1072,1089,32,1089,1086,1100,32,932,951,949, + 32,946,953,947,32,961,949,948,32, + 963,959,967,32,945,961,949,32,966,959,967,949,963], + %% Testdata from Chinese open source customer, that triggered OTP-7974 + TestData2 = [46,46,46,12411,12370,12411,12370,44,12411,12370,12411,12370,44, + 12411,12370,12411,12370,44,12411,12370,12411,12370,44,12411,12370, + 12411,12370,44,44,44,12411,12370,12411,12370,44,44,12411,12370,12411, + 12370,44,12411,12370,12411,12370,44,12411,12370,12411,12370,44,12411, + 12370,12411,12370,44,12411,12370,12411,12370,44,44,44,10], + + %% The external test files are generated with a BOM writing + %% text editor. A shorter line is written (with two characters + %% larger than 127). + ExternalTestData = [197,116,101,114,101,114,246,118,114,97], + InternalBomFiles = ["testdata_utf8_bom.dat", + "testdata_utf16_big_bom.dat", + "testdata_utf16_little_bom.dat", + "testdata_utf32_big_bom.dat", + "testdata_utf32_little_bom.dat"], + AllNoBom = [{utf8,"testdata_utf8.dat"}, + {utf16,"testdata_utf16_big.dat"}, + {{utf16,big},"testdata_utf16_big.dat"}, + {{utf16,little},"testdata_utf16_little.dat"}, + {utf32,"testdata_utf32_big.dat"}, + {{utf32,big},"testdata_utf32_big.dat"}, + {{utf32,little},"testdata_utf32_little.dat"}], + ExternalBomFiles = ["external_utf8_bom.dat", + "external_utf16_little_bom.dat", + "external_utf16_big_bom.dat"], + ReadBomFile = fun(File,Dir) -> + %io:format(standard_error,"~s\r\n",[filename:join([Dir,File])]), + {ok,F} = file:open(filename:join([Dir,File]), + [read,binary]), + {ok,Bin} = file:read(F,4), + {Type,Bytes} = unicode:bom_to_encoding(Bin), + %io:format(standard_error,"~p\r\n",[{Type,Bytes}]), + + file:position(F,Bytes), + io:setopts(F,[{encoding,Type}]), + R = unicode:characters_to_list( + io:get_chars(F,'',length(TestData)),unicode), + file:close(F), + R + end, + ReadBomlessFile = fun({Type,File},DataLen,Dir) -> + {ok,F} = file:open(filename:join([Dir,File]), + [read,binary, + {encoding,Type}]), + R = unicode:characters_to_list( + io:get_chars(F,'',DataLen),unicode), + file:close(F), + R + end, + ReadBomlessFileList = fun({Type,File},DataLen,Dir) -> + {ok,F} = file:open(filename:join([Dir,File]), + [read, + {encoding,Type}]), + R = io:get_chars(F,'',DataLen), + file:close(F), + R + end, + ReadBomlessFileListLine = fun({Type,File},Dir) -> + {ok,F} = file:open(filename:join([Dir,File]), + [read, + {encoding,Type}]), + R = io:get_line(F,''), + file:close(F), + R + end, + ?line [TestData = ReadBomFile(F,DataDir) || F <- InternalBomFiles ], + ?line [ExternalTestData = ReadBomFile(F,DataDir) || F <- ExternalBomFiles ], + ?line [TestData = ReadBomlessFile(F,length(TestData),DataDir) || F <- AllNoBom ], + ?line [TestData = ReadBomlessFileList(F,length(TestData),DataDir) || F <- AllNoBom ], + ?line [TestData = ReadBomlessFileListLine(F,DataDir) || F <- AllNoBom ], + + BomDir = filename:join([PrivDir,"BOMDATA"]), + BomlessDir = filename:join([PrivDir,"BOMLESSDATA"]), + file:make_dir(BomDir), + file:make_dir(BomlessDir), + + WriteBomFile = fun({Enc,File},Dir) -> + {ok,F} = file:open(filename:join([Dir,File]), + [write,binary]), + file:write(F,unicode:encoding_to_bom(Enc)), + io:setopts(F,[{encoding,Enc}]), + io:put_chars(F,TestData), + file:close(F), + ok + end, + ?line [ ok = WriteBomFile(F,BomDir) || F <- AllNoBom ], + ?line [TestData = ReadBomFile(F,BomDir) || {_,F} <- AllNoBom ], + WriteBomlessFile = fun({Enc,File},TData,Dir) -> + {ok,F} = file:open( + filename:join([Dir,File]), + [write,binary,{encoding,Enc}]), + io:put_chars(F,TData), + file:close(F), + ok + end, + ?line [ ok = WriteBomlessFile(F,TestData,BomlessDir) || F <- AllNoBom ], + ?line [TestData = ReadBomlessFile(F,length(TestData),BomlessDir) || F <- AllNoBom ], + ?line [TestData = ReadBomlessFileList(F,length(TestData),BomlessDir) || F <- AllNoBom ], + ?line [TestData = ReadBomlessFileListLine(F,BomlessDir) || F <- AllNoBom ], + + CannotReadFile = fun({Enc,File},Dir) -> + %io:format(standard_error,"~s\r\n",[filename:join([Dir,File])]), + {ok,F} = file:open( + filename:join([Dir,File]), + [read,binary,{encoding,Enc}]), + Enc2 = case Enc of + utf8 -> + unicode; + Tpl when is_tuple(Tpl) -> + Tpl; + Atom when is_atom(Atom) -> + {Atom, big} + end, + {error, {no_translation,Enc2,latin1}} = + file:read(F,10), + {error,terminated} = io:get_chars(F,'',10), + ok + end, + ?line [ ok = CannotReadFile(F,DataDir) || F <- AllNoBom ], + ?line [ ok = CannotReadFile(F,BomlessDir) || F <- AllNoBom ], + ?line [ ok = CannotReadFile(F,BomDir) || F <- AllNoBom ], + + ?line [ ok = WriteBomlessFile(F,TestData2,BomlessDir) || F <- AllNoBom ], + ?line [TestData2 = ReadBomlessFile(F,length(TestData2),BomlessDir) || F <- AllNoBom ], + ?line [TestData2 = ReadBomlessFileList(F,length(TestData2),BomlessDir) || F <- AllNoBom ], + ?line [TestData2 = ReadBomlessFileListLine(F,BomlessDir) || F <- AllNoBom ], + + + FailDir = filename:join([PrivDir,"FAIL"]), + file:make_dir(FailDir), + + CannotWriteFile = fun({_Enc,File},Dir) -> + {ok,F} = file:open( + filename:join([Dir,File]), + [write,binary]), + ?line {'EXIT', {no_translation,_}} = + (catch io:put_chars(F,TestData)), + ?line {'EXIT', {terminated,_}} = (catch io:put_chars(F,TestData)), + ok + end, + ?line [ ok = CannotWriteFile(F,FailDir) || F <- AllNoBom ], + + %% OK, time for the group_leaders... + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline, "2"}, + {putline, "lists:keyfind(encoding,1,io:getopts())."}, + {getline, "{encoding,latin1}"}, + {putline, "io:format(\"~ts~n\",[[1024]])."}, + {getline, "\\x{400}"}, + {putline, "io:setopts([unicode])."}, + {getline, "ok"}, + {putline, "io:format(\"~ts~n\",[[1024]])."}, + {getline, + binary_to_list(unicode:characters_to_binary( + [1024],unicode,utf8))} + ],[],"LC_CTYPE=\"ISO-8859-1\"; export LC_CTYPE; "), + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline_re, ".*2."}, + {getline, "2"}, + {putline, "lists:keyfind(encoding,1,io:getopts())."}, + {getline_re, ".*{encoding,latin1}"}, + {putline, "io:format(\"~ts~n\",[[1024]])."}, + {getline_re, ".*\\\\x{400\\}"}, + {putline, "io:setopts([{encoding,unicode}])."}, + {getline_re, ".*ok"}, + {putline, "io:format(\"~ts~n\",[[1024]])."}, + {getline_re, + ".*"++binary_to_list(unicode:characters_to_binary( + [1024],unicode,utf8))} + ],[],"LC_CTYPE=\"ISO-8859-1\"; export LC_CTYPE; ", + " -oldshell "), + + ok. + +unicode_options_gen(suite) -> + []; +unicode_options_gen(doc) -> + ["Tests various unicode options on random generated files"]; +unicode_options_gen(Config) when is_list(Config) -> + ?line random:seed(1240,900586,553728), + ?line PrivDir = ?config(priv_dir,Config), + ?line AllModes = [utf8,utf16,{utf16,big},{utf16,little},utf32,{utf32,big},{utf32,little}], + ?line FSize = 17*1024, + ?line NumItersRead = 2, + ?line NumItersWrite = 2, + ?line Dir = filename:join([PrivDir,"GENDATA1"]), + ?line file:make_dir(Dir), + + %dbg:tracer(process,{fun(A,_) -> erlang:display(A) end,true}), + %dbg:tpl(file_io_server,x), + %dbg:ctpl(file_io_server,cafu), + %dbg:tp(unicode,x), + + DoOneFile1 = fun(Encoding,N,M) -> + ?dbg({Encoding,M,N}), + io:format("Read test: Encoding ~p, Chunk size ~p, Iteration ~p~n",[Encoding,M,N]), + io:format(standard_error,"Read test: Encoding ~p, Chunk size ~p, Iteration ~p\r\n",[Encoding,M,N]), + ?line Fname = filename:join([Dir,"genfile_"++enc2str(Encoding)++"_"++integer_to_list(N)]), + ?dbg(?LINE), + ?line Ulist = random_unicode(FSize), + ?dbg(?LINE), + ?line my_write_file(Fname,Ulist,Encoding), + ?dbg(?LINE), + ?line {ok,F1} = file:open(Fname,[read,{encoding,Encoding}]), + + ?dbg(?LINE), + ?line Res1 = read_whole_file(fun(FD) -> io:get_line(FD,'') end,F1), + ?dbg(?LINE), + ?line Ulist = unicode:characters_to_list(Res1,unicode), + ?dbg(?LINE), + ?line file:close(F1), + ?line {ok,F2} = file:open(Fname, [read,binary,{encoding,Encoding}]), + ?line Res2 = read_whole_file(fun(FD) -> io:get_chars(FD,'',M) end,F2), + ?line Ulist = unicode:characters_to_list(Res2,unicode), + ?dbg(?LINE), + ?line file:close(F2), + ?line {ok,F3} = file:open(Fname, [read,binary,{encoding,Encoding}]), + ?dbg(?LINE), +%% case {Encoding,M,N} of +%% {{utf16,little},10,2} -> +%% dbg:p(F3,call); +%% _ -> +%% ok +%% end, + + ?line Res3 = read_whole_file(fun(FD) -> case io:fread(FD,'',"~ts") of {ok,D} -> D; O -> O end end, F3), + ?dbg(?LINE), + ?line Ulist2 = [ X || X <- Ulist, + X =/= $\n, X =/= $ ], + ?dbg(?LINE), + ?line Ulist2 = unicode:characters_to_list(Res3,unicode), + ?dbg(?LINE), + ?line file:close(F3), + ?line {ok,F4} = file:open(Fname, [read,{encoding,Encoding}]), + ?line Res4 = read_whole_file(fun(FD) -> case io:fread(FD,'',"~tc") of {ok,D} -> D; O -> O end end,F4), + ?line Ulist3 = [ X || X <- Ulist, + X =/= $\n ], + ?line Ulist3 = unicode:characters_to_list(Res4,unicode), + ?dbg(?LINE), + ?line file:close(F4), + ?line file:delete(Fname) + end, + + [ [ [ DoOneFile1(E,N,M) || E <- AllModes ] || M <- [10,1000,128,1024,8192,8193] ] || N <- lists:seq(1,NumItersRead)], + DoOneFile2 = fun(Encoding,N,M) -> + ?dbg({Encoding,M,N}), + io:format("Write test: Encoding ~p, Chunk size ~p, Iteration ~p~n",[Encoding,M,N]), + io:format(standard_error,"Write test: Encoding ~p, Chunk size ~p, Iteration ~p\r\n",[Encoding,M,N]), + ?line Fname = filename:join([Dir,"genfile_"++enc2str(Encoding)++"_"++integer_to_list(N)]), + ?dbg(?LINE), + ?line Ulist = random_unicode(FSize), + ?dbg(?LINE), + ?line {ok,F1} = file:open(Fname,[write,{encoding,Encoding}]), + ?line io:put_chars(F1,Ulist), + ?line file:close(F1), + ?line Ulist = my_read_file(Fname,Encoding), + ?line file:delete(Fname), + ?line {ok,F2} = file:open(Fname,[write,binary,{encoding,Encoding}]), + ?line io:put_chars(F2,Ulist), + ?line file:close(F2), + ?line Ulist = my_read_file(Fname,Encoding), + ?line file:delete(Fname), + ?line {ok,F3} = file:open(Fname,[write,{encoding,Encoding}]), + ?line LL = string:tokens(Ulist,"\n"), + ?line Ulist2 = lists:flatten(LL), + ?line [ io:format(F3,"~ts",[L]) || L <- LL ], + ?line file:close(F3), + ?line Ulist2 = my_read_file(Fname,Encoding), + ?line file:delete(Fname), + ?line {ok,F4} = file:open(Fname,[write,{encoding,Encoding}]), + ?line [ io:format(F4,"~tc",[C]) || C <- Ulist ], + ?line file:close(F4), + ?line Ulist = my_read_file(Fname,Encoding), + ?line file:delete(Fname), + ?line {ok,F5} = file:open(Fname,[write,{encoding,Encoding}]), + ?line io:put_chars(F5,unicode:characters_to_binary(Ulist)), + ?line file:close(F5), + ?line Ulist = my_read_file(Fname,Encoding), + ?line file:delete(Fname), + ok + end, + [ [ [ DoOneFile2(E,N,M) || E <- AllModes ] || M <- [10,1000,128,1024,8192,8193] ] || N <- lists:seq(1,NumItersWrite)], + ok. + + + + +read_whole_file(Fun,F) -> + case Fun(F) of + eof -> + []; + {error,Error} -> + ?dbg(Error), + receive after 10000 -> ok end, + exit(Error); + Other -> + %?dbg(Other), + [Other | read_whole_file(Fun,F)] + end. + + +enc2str(Atom) when is_atom(Atom) -> + atom_to_list(Atom); +enc2str({A1,A2}) when is_atom(A1), is_atom(A2) -> + atom_to_list(A1)++"_"++atom_to_list(A2). + + + + +my_write_file(Filename,UniList,Encoding) -> + Bin = unicode:characters_to_binary(UniList,utf8,Encoding), + file:write_file(Filename,Bin). + +my_read_file(Filename,Encoding) -> + {ok,Bin} = file:read_file(Filename), + unicode:characters_to_list(Bin,Encoding). + +random_unicode(0) -> + []; +random_unicode(N) -> + % Favour large unicode and make linebreaks + X = case random:uniform(20) of + A when A =< 1 -> $\n; + A0 when A0 =< 3 -> random:uniform(16#10FFFF); + A1 when A1 =< 6 -> random:uniform(16#10FFFF - 16#7F) + 16#7F; + A2 when A2 =< 12 -> random:uniform(16#10FFFF - 16#7FF) + 16#7FF; + _ -> random:uniform(16#10FFFF - 16#FFFF) + 16#FFFF + end, + case X of + Inv1 when Inv1 >= 16#D800, Inv1 =< 16#DFFF; + Inv1 =:= 16#FFFE; + Inv1 =:= 16#FFFF -> + random_unicode(N); + _ -> + [X | random_unicode(N-1)] + end. + + +binary_options(suite) -> + []; +binary_options(doc) -> + ["Tests variants with binary option"]; +binary_options(Config) when is_list(Config) -> + DataDir = ?config(data_dir,Config), + PrivDir = ?config(priv_dir,Config), + TestData = unicode:characters_to_binary( + [1090,1093,1077,32,1073,1080,1075,32, + 1088,1077,1076,32,1092,1086,1100,32,1093, + 1072,1089,32,1089,1086,1100,32,932,951,949, + 32,946,953,947,32,961,949,948,32, + 963,959,967,32,945,961,949,32,966,959,967,949,963]), + <> = TestData, + First10List = binary_to_list(First10), + Second10List = binary_to_list(Second10), + TestFile = filename:join([DataDir, "testdata_utf8.dat"]), + ?line {ok, F} = file:open(TestFile,[read]), + ?line {ok, First10List} = file:read(F,10), + ?line io:setopts(F,[binary]), + ?line {ok, Second10} = file:read(F,10), + ?line file:close(F), + ?line {ok, F2} = file:open(TestFile,[read,binary]), + ?line {ok, First10} = file:read(F2,10), + ?line io:setopts(F2,[list]), + ?line {ok, Second10List} = file:read(F2,10), + ?line file:position(F2,0), + %dbg:tracer(),dbg:p(F2,call),dbg:tpl(file_io_server,x), + ?line First10List = io:get_chars(F2,'',10), + ?line io:setopts(F2,[binary]), + ?line Second10 = unicode:characters_to_binary(io:get_chars(F2,'',10),unicode,latin1), + ?line file:close(F2), + ?line LineBreakFileName = filename:join([PrivDir, "testdata.dat"]), + ?line LineBreakTestData = <>, + ?line LineBreakTestDataList = binary_to_list(LineBreakTestData), + ?line file:write_file(LineBreakFileName,[LineBreakTestData,LineBreakTestData,LineBreakTestData,TestData]), + ?line {ok, F3} = file:open(LineBreakFileName,[read]), + ?line LineBreakTestDataList = io:get_line(F3,''), + ?line io:setopts(F3,[binary]), + ?line LineBreakTestData = unicode:characters_to_binary(io:get_line(F3,''),unicode,latin1), + ?line io:setopts(F3,[list]), + ?line LineBreakTestDataList = io:get_line(F3,''), + ?line io:setopts(F3,[binary]), + %ok = io:format(standard_error,"TestData = ~w~n",[TestData]), + ?line TestData = unicode:characters_to_binary(io:get_line(F3,''),unicode,latin1), + ?line eof = io:get_line(F3,''), + ?line file:close(F3), + %% OK, time for the group_leaders... + %% io:format(standard_error,"Hmmm:~w~n",["<<\""++binary_to_list(<<"\345\344\366"/utf8>>)++"\\n\">>"]), + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline, "2"}, + {putline, "lists:keyfind(binary,1,io:getopts())."}, + {getline, "{binary,false}"}, + {putline, "io:get_line('')."}, + {putline, "hej"}, + {getline, "\"hej\\n\""}, + {putline, "io:setopts([{binary,true},unicode])."}, + {getline, "ok"}, + {putline, "io:get_line('')."}, + {putline, "hej"}, + {getline, "<<\"hej\\n\">>"}, + {putline, "io:get_line('')."}, + {putline, binary_to_list(<<"\345\344\366"/utf8>>)}, + {getline, "<<\""++binary_to_list(unicode:characters_to_binary(<<"\345\344\366"/utf8>>,latin1,utf8))++"\\n\">>"} + ],[]), + %% And one with oldshell + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline_re, ".*2."}, + {getline, "2"}, + {putline, "lists:keyfind(binary,1,io:getopts())."}, + {getline_re, ".*{binary,false}"}, + {putline, "io:get_line('')."}, + {putline, "hej"}, + {getline_re, ".*\"hej\\\\n\""}, + {putline, "io:setopts([{binary,true},unicode])."}, + {getline_re, ".*ok"}, + {putline, "io:get_line('')."}, + {putline, "hej"}, + {getline_re, ".*<<\"hej\\\\n\">>"}, + {putline, "io:get_line('')."}, + {putline, binary_to_list(<<"\345\344\366"/utf8>>)}, + {getline_re, ".*<<\""++binary_to_list(unicode:characters_to_binary(<<"\345\344\366"/utf8>>,latin1,utf8))++"\\\\n\">>"} + ],[],[],"-oldshell"), + ok. + +bc_with_r12(suite) -> + []; +bc_with_r12(doc) -> + ["Test io protocol compatibility with R12 nodes"]; +bc_with_r12(Config) when is_list(Config) -> + case ?t:is_release_available("r12b") of + true -> bc_with_r12_1(Config); + false -> {skip,"No R12B found"} + end. + +bc_with_r12_1(Config) -> + PA = filename:dirname(code:which(?MODULE)), + Name1 = io_proto_r12_1, + ?line N1 = list_to_atom(atom_to_list(Name1) ++ "@" ++ hostname()), + ?line ?t:start_node(Name1, peer, [{args, "-pz "++PA},{erl,[{release,"r12b"}]}]), + DataDir = ?config(data_dir,Config), + %PrivDir = ?config(priv_dir,Config), + FileName1 = filename:join([DataDir,"testdata_latin1.dat"]), + TestDataLine1 = [229,228,246], + TestDataLine2 = [197,196,214], + ?line SPid1 = rpc:call(N1,erlang,spawn,[?MODULE,hold_the_line,[self(),FileName1,[read]]]), + ?line {ok,F1} = receive + {SPid1,Res1} -> + Res1 + after 5000 -> + exit(timeout) + end, + ?line TestDataLine1 = chomp(io:get_line(F1,'')), + ?line SPid1 ! die, + receive after 1000 -> ok end, + ?line SPid2 = rpc:call(N1,erlang,spawn,[?MODULE,hold_the_line,[self(),FileName1,[read,binary]]]), + ?line {ok,F2} = receive + {SPid2,Res2} -> + Res2 + after 5000 -> + exit(timeout) + end, + TestDataLine1BinUtf = unicode:characters_to_binary(TestDataLine1), + TestDataLine1BinLatin = list_to_binary(TestDataLine1), + TestDataLine2BinUtf = unicode:characters_to_binary(TestDataLine2), + TestDataLine2BinLatin = list_to_binary(TestDataLine2), + ?line TestDataLine1BinUtf = chomp(io:get_line(F2,'')), + ?line TestDataLine2BinUtf = chomp(io:get_line(F2,'')), + %io:format(standard_error,"Exec:~s\r\n",[rpc:call(N1,os,find_executable,["erl"])]), + %io:format(standard_error,"Io:~s\r\n",[rpc:call(N1,code,which,[io])]), + %io:format(standard_error,"File_io_server:~s\r\n",[rpc:call(N1,code,which,[file_io_server])]), + ?line file:position(F2,0), + ?line TestDataLine1BinLatin = chomp(rpc:call(N1,io,get_line,[F2,''])), + ?line TestDataLine2BinUtf = chomp(io:get_line(F2,'')), + ?line file:position(F2,0), + ?line TestDataLine1BinUtf = chomp(io:get_line(F2,'')), + ?line TestDataLine2BinLatin = chomp(rpc:call(N1,io,get_line,[F2,''])), + ?line eof = chomp(rpc:call(N1,io,get_line,[F2,''])), + ?line file:position(F2,0), + ?line TestDataLine1BinLatin = rpc:call(N1,io,get_chars,[F2,'',3]), + io:get_chars(F2,'',1), + ?line TestDataLine2BinLatin = chomp(rpc:call(N1,io,get_line,[F2,''])), + ?line file:position(F2,0), + ?line {ok,[TestDataLine1]} = io:fread(F2,'',"~s"), + ?line {ok,[TestDataLine2]} = rpc:call(N1,io,fread,[F2,'',"~s"]), + + ?line DataLen1 = length(TestDataLine1), + ?line DataLen2 = length(TestDataLine2), + + ?line file:position(F2,0), + ?line {ok,TestDataLine1BinLatin} = file:read(F2,DataLen1), + ?line {ok,_} = file:read(F2,1), + ?line {ok,TestDataLine2BinLatin} = rpc:call(N1,file,read,[F2,DataLen2]), + ?line {ok,_} = file:read(F2,1), + ?line eof = rpc:call(N1,file,read,[F2,1]), + %% As r12 has a bug when setting options with setopts, we need + %% to reopen the file... + ?line SPid2 ! die, + receive after 1000 -> ok end, + ?line SPid3 = rpc:call(N1,erlang,spawn,[?MODULE,hold_the_line,[self(),FileName1,[read]]]), + ?line {ok,F3} = receive + {SPid3,Res3} -> + Res3 + after 5000 -> + exit(timeout) + end, + + ?line file:position(F3,0), + ?line {ok,[TestDataLine1]} = io:fread(F3,'',"~s"), + ?line {ok,[TestDataLine2]} = rpc:call(N1,io,fread,[F3,'',"~s"]), + + + ?line file:position(F3,0), + ?line {ok,TestDataLine1} = file:read(F3,DataLen1), + ?line {ok,_} = file:read(F3,1), + ?line {ok,TestDataLine2} = rpc:call(N1,file,read,[F3,DataLen2]), + ?line {ok,_} = file:read(F3,1), + ?line eof = rpc:call(N1,file,read,[F3,1]), + + + %% So, lets do it all again, but the other way around + {ok,F4} = file:open(FileName1,[read]), + ?line TestDataLine1 = chomp(io:get_line(F4,'')), + ?line file:position(F4,0), + ?line io:setopts(F4,[binary]), + ?line TestDataLine1BinUtf = chomp(io:get_line(F4,'')), + ?line TestDataLine2BinUtf = chomp(io:get_line(F4,'')), + ?line file:position(F4,0), + ?line TestDataLine1BinUtf = chomp(io:get_line(F4,'')), + ?line TestDataLine2BinUtf = chomp(io:get_line(F4,'')), + ?line file:position(F4,0), + %dbg:tracer(),dbg:p(F4,[call,m]),dbg:tpl(file_io_server,x),dbg:tpl(io_lib,x), + ?line TestDataLine1BinUtf = chomp(io:get_line(F4,'')), + ?line TestDataLine2BinLatin = chomp(rpc:call(N1,io,get_line,[F4,''])), + ?line file:position(F4,0), + ?line TestDataLine1BinLatin = chomp(rpc:call(N1,io,get_line,[F4,''])), + ?line TestDataLine2BinUtf = chomp(io:get_line(F4,'')), + ?line eof = chomp(rpc:call(N1,io,get_line,[F4,''])), + ?line file:position(F4,0), + ?line TestDataLine1BinLatin = rpc:call(N1,io,get_chars,[F4,'',3]), + io:get_chars(F4,'',1), + ?line TestDataLine2BinLatin = chomp(rpc:call(N1,io,get_line,[F4,''])), + ?line file:position(F4,0), + ?line {ok,[TestDataLine1]} = io:fread(F4,'',"~s"), + ?line {ok,[TestDataLine2]} = rpc:call(N1,io,fread,[F4,'',"~s"]), + ?line file:position(F4,0), + ?line {ok,TestDataLine1BinLatin} = file:read(F4,DataLen1), + ?line {ok,_} = file:read(F4,1), + ?line {ok,TestDataLine2BinLatin} = rpc:call(N1,file,read,[F4,DataLen2]), + ?line {ok,_} = file:read(F4,1), + ?line eof = rpc:call(N1,file,read,[F4,1]), + ?line io:setopts(F4,[list]), + + ?line file:position(F4,0), + ?line {ok,[TestDataLine1]} = io:fread(F4,'',"~s"), + ?line {ok,[TestDataLine2]} = rpc:call(N1,io,fread,[F4,'',"~s"]), + + + ?line file:position(F4,0), + ?line {ok,TestDataLine1} = file:read(F4,DataLen1), + ?line {ok,_} = file:read(F4,1), + ?line {ok,TestDataLine2} = rpc:call(N1,file,read,[F4,DataLen2]), + ?line {ok,_} = file:read(F4,1), + ?line eof = rpc:call(N1,file,read,[F4,1]), + + file:close(F4), + ?t:stop_node(N1), + ok. + +hold_the_line(Parent,Filename,Options) -> + Parent ! {self(), file:open(Filename,Options)}, + receive + die -> + ok + end. + + +bc_with_r12_gl(suite) -> + []; +bc_with_r12_gl(doc) -> + ["Test io protocol compatibility with R12 nodes (terminals)"]; +bc_with_r12_gl(Config) when is_list(Config) -> + case ?t:is_release_available("r12b") of + true -> + case get_progs() of + {error,Reason} -> + {skip, Reason}; + _ -> + bc_with_r12_gl_1(Config,answering_machine1) + end; + false -> + {skip,"No R12B found"} + end. + +bc_with_r12_ogl(suite) -> + []; +bc_with_r12_ogl(doc) -> + ["Test io protocol compatibility with R12 nodes (oldshell)"]; +bc_with_r12_ogl(Config) when is_list(Config) -> + case ?t:is_release_available("r12b") of + true -> + case get_progs() of + {error,Reason} -> + {skip, Reason}; + _ -> + bc_with_r12_gl_1(Config,answering_machine2) + end; + false -> + {skip,"No R12B found"} + end. + +bc_with_r12_gl_1(_Config,Machine) -> + PA = filename:dirname(code:which(?MODULE)), + Name1 = io_proto_r12_gl_1, + ?line N1 = list_to_atom(atom_to_list(Name1) ++ "@" ++ hostname()), + ?line ?t:start_node(Name1, peer, [{args, "-pz "++PA},{erl,[{release,"r12b"}]}]), + TestDataLine1 = [229,228,246], + TestDataLine1BinUtf = unicode:characters_to_binary(TestDataLine1), + TestDataLine1BinLatin = list_to_binary(TestDataLine1), + + N2List = create_nodename(), + MyNodeList = atom_to_list(node()), + register(io_proto_suite,self()), + AM1 = spawn(?MODULE,Machine, + [MyNodeList, "io_proto_suite", N2List]), + + ?line GL = receive X when is_pid(X) -> X end, + %% get_line + ?line "Hej\n" = rpc:call(N1,io,get_line,[GL,"Prompt\n"]), + ?line io:setopts(GL,[binary]), + ?line io:format(GL,"Okej~n",[]), + ?line <<"Hej\n">> = rpc:call(N1,io,get_line,[GL,"Prompt\n"]), + ?line io:setopts(GL,[{encoding,latin1}]), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinLatin = chomp(rpc:call(N1,io,get_line,[GL,"Prompt\n"])), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinUtf = chomp(io:get_line(GL,"Prompt\n")), + ?line io:setopts(GL,[{encoding,unicode}]), + + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinLatin = chomp(rpc:call(N1,io,get_line,[GL,"Prompt\n"])), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinUtf = chomp(io:get_line(GL,"Prompt\n")), + ?line io:setopts(GL,[list]), + ?line io:format(GL,"Okej~n",[]), + + %%get_chars + ?line "Hej" = rpc:call(N1,io,get_chars,[GL,"Prompt\n",3]), + ?line io:setopts(GL,[binary]), + ?line io:format(GL,"Okej~n",[]), + ?line <<"Hej">> = rpc:call(N1,io,get_chars,[GL,"Prompt\n",3]), + ?line io:setopts(GL,[{encoding,latin1}]), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinLatin = rpc:call(N1,io,get_chars,[GL,"Prompt\n",3]), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinUtf = io:get_chars(GL,"Prompt\n",3), + ?line io:setopts(GL,[{encoding,unicode}]), + + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinLatin = rpc:call(N1,io,get_chars,[GL,"Prompt\n",3]), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinUtf = io:get_chars(GL,"Prompt\n",3), + ?line io:setopts(GL,[list]), + ?line io:format(GL,"Okej~n",[]), + %%fread + ?line {ok,["Hej"]} = rpc:call(N1,io,fread,[GL,"Prompt\n","~s"]), + ?line io:setopts(GL,[binary]), + ?line io:format(GL,"Okej~n",[]), + ?line {ok,["Hej"]} = rpc:call(N1,io,fread,[GL,"Prompt\n","~s"]), + ?line io:setopts(GL,[{encoding,latin1}]), + ?line io:format(GL,"Okej~n",[]), + ?line {ok,[TestDataLine1]} = rpc:call(N1,io,fread,[GL,"Prompt\n","~s"]), + ?line io:format(GL,"Okej~n",[]), + ?line {ok,[TestDataLine1]} = io:fread(GL,"Prompt\n","~s"), + ?line io:setopts(GL,[{encoding,unicode}]), + ?line io:format(GL,"Okej~n",[]), + ?line {ok,[TestDataLine1]} = rpc:call(N1,io,fread,[GL,"Prompt\n","~s"]), + ?line io:format(GL,"Okej~n",[]), + ?line {ok,[TestDataLine1]} = io:fread(GL,"Prompt\n","~s"), + ?line io:setopts(GL,[list]), + ?line io:format(GL,"Okej~n",[]), + + + ?line receive + {AM1,done} -> + ok + after 5000 -> + exit(timeout) + end, + ?t:stop_node(N1), + ok. + + +answering_machine1(OthNode,OthReg,Me) -> + TestDataLine1 = [229,228,246], + TestDataUtf = binary_to_list(unicode:characters_to_binary(TestDataLine1)), + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline, "2"}, + {putline, "{"++OthReg++","++OthNode++"} ! group_leader()."}, + {getline, "<"}, + % get_line + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"}, + % get_chars + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"}, + % fread + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"} + + ],Me,"LC_CTYPE=\"ISO-8859-1\"; export LC_CTYPE; "), + O = list_to_atom(OthReg), + O ! {self(),done}, + ok. + +answering_machine2(OthNode,OthReg,Me) -> + TestDataLine1 = [229,228,246], + TestDataUtf = binary_to_list(unicode:characters_to_binary(TestDataLine1)), + ?line rtnode([{putline,""}, + {putline, "2."}, + {getline, "2"}, + {putline, "{"++OthReg++","++OthNode++"} ! group_leader()."}, + {getline_re, ".*<[0-9].*"}, + % get_line + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"}, + % get_chars + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"}, + % fread + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, "Hej"}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataLine1}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"}, + {getline_re, ".*Prompt"}, + {putline, TestDataUtf}, + {getline_re, ".*Okej"} + + ],Me,"LC_CTYPE=\"ISO-8859-1\"; export LC_CTYPE; "," -oldshell "), + O = list_to_atom(OthReg), + O ! {self(),done}, + ok. + + +read_modes_ogl(suite) -> + []; +read_modes_ogl(doc) -> + ["Test various modes when reading from the group leade from another machine"]; +read_modes_ogl(Config) when is_list(Config) -> + case get_progs() of + {error,Reason} -> + {skipped,Reason}; + _ -> + read_modes_gl_1(Config,answering_machine2) + end. + +read_modes_gl(suite) -> + []; +read_modes_gl(doc) -> + ["Test various modes when reading from the group leade from another machine"]; +read_modes_gl(Config) when is_list(Config) -> + case get_progs() of + {error,Reason} -> + {skipped,Reason}; + _ -> + read_modes_gl_1(Config,answering_machine1) + end. + +read_modes_gl_1(_Config,Machine) -> + TestDataLine1 = [229,228,246], + TestDataLine1BinUtf = unicode:characters_to_binary(TestDataLine1), + TestDataLine1BinLatin = list_to_binary(TestDataLine1), + + N2List = create_nodename(), + MyNodeList = atom_to_list(node()), + register(io_proto_suite,self()), + AM1 = spawn(?MODULE,Machine, + [MyNodeList, "io_proto_suite", N2List]), + + ?line GL = receive X when is_pid(X) -> X end, + %% get_line + ?line "Hej\n" = io:get_line(GL,"Prompt\n"), + ?line io:setopts(GL,[binary]), + ?line io:format(GL,"Okej~n",[]), + ?line <<"Hej\n">> = io:get_line(GL,"Prompt\n"), + ?line io:setopts(GL,[{encoding,latin1}]), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinLatin = chomp(io:request(GL,{get_line,latin1,"Prompt\n"})), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinUtf = chomp(io:get_line(GL,"Prompt\n")), + ?line io:setopts(GL,[{encoding,unicode}]), + + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinLatin = chomp(io:request(GL,{get_line,latin1,"Prompt\n"})), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinUtf = chomp(io:get_line(GL,"Prompt\n")), + ?line io:setopts(GL,[list]), + ?line io:format(GL,"Okej~n",[]), + + %%get_chars + ?line "Hej" = io:get_chars(GL,"Prompt\n",3), + ?line io:setopts(GL,[binary]), + ?line io:format(GL,"Okej~n",[]), + ?line <<"Hej">> = io:get_chars(GL,"Prompt\n",3), + ?line io:setopts(GL,[{encoding,latin1}]), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinLatin = io:request(GL,{get_chars,latin1,"Prompt\n",3}), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinUtf = io:get_chars(GL,"Prompt\n",3), + ?line io:setopts(GL,[{encoding,unicode}]), + + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinLatin = io:request(GL,{get_chars,latin1,"Prompt\n",3}), + ?line io:format(GL,"Okej~n",[]), + ?line TestDataLine1BinUtf = io:get_chars(GL,"Prompt\n",3), + ?line io:setopts(GL,[list]), + ?line io:format(GL,"Okej~n",[]), + %%fread + ?line {ok,["Hej"]} = io:fread(GL,"Prompt\n","~s"), + ?line io:setopts(GL,[binary]), + ?line io:format(GL,"Okej~n",[]), + ?line {ok,["Hej"]} = io:fread(GL,"Prompt\n","~s"), + ?line io:setopts(GL,[{encoding,latin1}]), + ?line io:format(GL,"Okej~n",[]), + ?line {ok,[TestDataLine1]} = io:fread(GL,"Prompt\n","~s"), + ?line io:format(GL,"Okej~n",[]), + ?line {ok,[TestDataLine1]} = io:fread(GL,"Prompt\n","~s"), + ?line io:setopts(GL,[{encoding,unicode}]), + ?line io:format(GL,"Okej~n",[]), + ?line {ok,[TestDataLine1]} = io:fread(GL,"Prompt\n","~s"), + ?line io:format(GL,"Okej~n",[]), + ?line {ok,[TestDataLine1]} = io:fread(GL,"Prompt\n","~s"), + ?line io:setopts(GL,[list]), + ?line io:format(GL,"Okej~n",[]), + + + ?line receive + {AM1,done} -> + ok + after 5000 -> + exit(timeout) + end, + ok. + + +broken_unicode(suite) -> + []; +broken_unicode(doc) -> + ["Test behaviour when reading broken Unicode files"]; +broken_unicode(Config) when is_list(Config) -> + Dir = ?config(priv_dir,Config), + Latin1Name = filename:join([Dir,"latin1_data_file.dat"]), + Utf8Name = filename:join([Dir,"utf8_data_file.dat"]), + Latin1Data = iolist_to_binary(lists:duplicate(10,lists:seq(0,255)++[255,255,255])), + Utf8Data = unicode:characters_to_binary( + lists:duplicate(10,lists:seq(0,255))), + file:write_file(Latin1Name,Latin1Data), + file:write_file(Utf8Name,Utf8Data), + ?line [ latin1 = heuristic_encoding_file2(Latin1Name,N,utf8) || N <- lists:seq(1,100)++[1024,2048,10000]], + ?line [ utf8 = heuristic_encoding_file2(Utf8Name,N,utf8) || N <- lists:seq(1,100)++[1024,2048,10000]], + ?line [ latin1 = heuristic_encoding_file2(Latin1Name,N,utf16) || N <- lists:seq(1,100)++[1024,2048,10000]], + ?line [ latin1 = heuristic_encoding_file2(Latin1Name,N,utf32) || N <- lists:seq(1,100)++[1024,2048,10000]], + ok. + + +%% +%% From the cookbook, more or less +heuristic_encoding_file2(FileName,Chunk,Enc) -> + {ok,F} = file:open(FileName,[read,binary,{encoding,Enc}]), + loop_through_file2(F,io:get_chars(F,'',Chunk),Chunk,Enc). + +loop_through_file2(_,eof,_,Enc) -> + Enc; +loop_through_file2(_,{error,_Err},_,_) -> + latin1; +loop_through_file2(F,Bin,Chunk,Enc) when is_binary(Bin) -> + loop_through_file2(F,io:get_chars(F,'',Chunk),Chunk,Enc). + + + +eof_on_pipe(suite) -> + []; +eof_on_pipe(doc) -> + ["tests eof before newline on stdin when erlang is in pipe"]; +eof_on_pipe(Config) when is_list(Config) -> + case {get_progs(),os:type()} of + {{error,Reason},_} -> + {skipped,Reason}; + {{_,_,Erl},{unix,linux}} -> + %% Not even Linux is reliable - echo can be both styles + try + EchoLine = case os:cmd("echo -ne \"test\\ntest\"") of + "test\ntest" -> + "echo -ne \"a\\nbu\" | "; + _ -> + case os:cmd("echo \"test\\ntest\\c\"") of + "test\ntest" -> + "echo \"a\\nbu\\c\" | "; + _ -> + throw(skip) + end + end, + CommandLine1 = EchoLine ++ + Erl++" -noshell -eval " + "'io:format(\"~p\",[io:get_line(\"\")])," + "io:format(\"~p\",[io:get_line(\"\")])," + "io:format(\"~p\",[io:get_line(\"\")]).' -run init stop", + case os:cmd(CommandLine1) of + "\"a\\n\"\"bu\"eof" -> + ok; + Other1 -> + exit({unexpected1,Other1}) + end, + CommandLine2 = EchoLine ++ + Erl++" -noshell -eval " + "'io:setopts([binary]),io:format(\"~p\",[io:get_line(\"\")])," + "io:format(\"~p\",[io:get_line(\"\")])," + "io:format(\"~p\",[io:get_line(\"\")]).' -run init stop", + case os:cmd(CommandLine2) of + "<<\"a\\n\">><<\"bu\">>eof" -> + ok; + Other2 -> + exit({unexpected2,Other2}) + end + catch + throw:skip -> + {skipped,"unsupported echo program"} + end; + {_,_} -> + {skipped,"Only on linux"} + end. + + +%% +%% Tool for running interactive shell (stolen from the kernel +%% test suite interactive_shell_SUITE) +%% +-undef(line). +-define(line,). +rtnode(C,N) -> + rtnode(C,N,[]). +rtnode(Commands,Nodename,ErlPrefix) -> + rtnode(Commands,Nodename,ErlPrefix,[]). +rtnode(Commands,Nodename,ErlPrefix,Extra) -> + ?line case get_progs() of + {error,_Reason} -> + ?line {skip,"No runerl present"}; + {RunErl,ToErl,Erl} -> + ?line case create_tempdir() of + {error, Reason2} -> + ?line {skip, Reason2}; + Tempdir -> + ?line SPid = + start_runerl_node(RunErl,ErlPrefix++Erl, + Tempdir,Nodename, Extra), + ?line CPid = start_toerl_server(ToErl,Tempdir), + ?line erase(getline_skipped), + ?line Res = + (catch get_and_put(CPid, Commands,1)), + ?line case stop_runerl_node(CPid) of + {error,_} -> + ?line CPid2 = + start_toerl_server + (ToErl,Tempdir), + ?line erase(getline_skipped), + ?line ok = get_and_put + (CPid2, + [{putline,[7]}, + {sleep, + timeout(short)}, + {putline,""}, + {getline," -->"}, + {putline,"s"}, + {putline,"c"}, + {putline,""}],1), + ?line stop_runerl_node(CPid2); + _ -> + ?line ok + end, + ?line wait_for_runerl_server(SPid), + ?line ok = rm_rf(Tempdir), + ?line ok = Res + end + end. + +timeout(long) -> + 2 * timeout(normal); +timeout(short) -> + timeout(normal) div 10; +timeout(normal) -> + 10000 * test_server:timetrap_scale_factor(). + + +%% start_noshell_node(Name) -> +%% PADir = filename:dirname(code:which(?MODULE)), +%% {ok, Node} = test_server:start_node(Name,slave,[{args," -noshell -pa "++ +%% PADir++" "}]), +%% Node. +%% stop_noshell_node(Node) -> +%% test_server:stop_node(Node). + + +rm_rf(Dir) -> + try + {ok,List} = file:list_dir(Dir), + Files = [filename:join([Dir,X]) || X <- List], + [case file:list_dir(Y) of + {error, enotdir} -> + ok = file:delete(Y); + _ -> + ok = rm_rf(Y) + end || Y <- Files], + ok = file:del_dir(Dir), + ok + catch + _:Exception -> {error, {Exception,Dir}} + end. + + +get_and_put(_CPid,[],_) -> + ok; +get_and_put(CPid, [{sleep, X}|T],N) -> + ?dbg({sleep, X}), + receive + after X -> + get_and_put(CPid,T,N+1) + end; +get_and_put(CPid, [{getline, Match}|T],N) -> + ?dbg({getline, Match}), + CPid ! {self(), {get_line, timeout(normal)}}, + receive + {get_line, timeout} -> + error_logger:error_msg("~p: getline timeout waiting for \"~s\" " + "(command number ~p, skipped: ~p)~n", + [?MODULE, Match,N,get(getline_skipped)]), + {error, timeout}; + {get_line, Data} -> + ?dbg({data,Data}), + case lists:prefix(Match, Data) of + true -> + erase(getline_skipped), + get_and_put(CPid, T,N+1); + false -> + case get(getline_skipped) of + undefined -> + put(getline_skipped,[Data]); + List -> + put(getline_skipped,List ++ [Data]) + end, + get_and_put(CPid, [{getline, Match}|T],N) + end + end; +get_and_put(CPid, [{getline_re, Match}|T],N) -> + ?dbg({getline_re, Match}), + CPid ! {self(), {get_line, timeout(normal)}}, + receive + {get_line, timeout} -> + error_logger:error_msg("~p: getline_re timeout waiting for \"~s\" " + "(command number ~p, skipped: ~p)~n", + [?MODULE, Match,N,get(getline_skipped)]), + {error, timeout}; + {get_line, Data} -> + ?dbg({data,Data}), + case re:run(Data, Match,[{capture,none}]) of + match -> + erase(getline_skipped), + get_and_put(CPid, T,N+1); + _ -> + case get(getline_skipped) of + undefined -> + put(getline_skipped,[Data]); + List -> + put(getline_skipped,List ++ [Data]) + end, + get_and_put(CPid, [{getline_re, Match}|T],N) + end + end; + +get_and_put(CPid, [{putline_raw, Line}|T],N) -> + ?dbg({putline_raw, Line}), + CPid ! {self(), {send_line, Line}}, + Timeout = timeout(normal), + receive + {send_line, ok} -> + get_and_put(CPid, T,N+1) + after Timeout -> + error_logger:error_msg("~p: putline_raw timeout (~p) sending " + "\"~s\" (command number ~p)~n", + [?MODULE, Timeout, Line, N]), + {error, timeout} + end; + +get_and_put(CPid, [{putline, Line}|T],N) -> + ?dbg({putline, Line}), + CPid ! {self(), {send_line, Line}}, + Timeout = timeout(normal), + receive + {send_line, ok} -> + get_and_put(CPid, [{getline, []}|T],N) + after Timeout -> + error_logger:error_msg("~p: putline timeout (~p) sending " + "\"~s\" (command number ~p)~n[~p]~n", + [?MODULE, Timeout, Line, N,get()]), + {error, timeout} + end. + +wait_for_runerl_server(SPid) -> + Ref = erlang:monitor(process, SPid), + Timeout = timeout(long), + receive + {'DOWN', Ref, process, SPid, _} -> + ok + after Timeout -> + {error, timeout} + end. + + + +stop_runerl_node(CPid) -> + Ref = erlang:monitor(process, CPid), + CPid ! {self(), kill_emulator}, + Timeout = timeout(long), + receive + {'DOWN', Ref, process, CPid, noproc} -> + ok; + {'DOWN', Ref, process, CPid, normal} -> + ok; + {'DOWN', Ref, process, CPid, {error, Reason}} -> + {error, Reason} + after Timeout -> + {error, timeout} + end. + +get_progs() -> + case os:type() of + {unix,freebsd} -> + {error,"cant use run_erl on freebsd"}; + {unix,openbsd} -> + {error,"cant use run_erl on openbsd"}; + {unix,_} -> + case os:find_executable("run_erl") of + RE when is_list(RE) -> + case os:find_executable("to_erl") of + TE when is_list(TE) -> + case os:find_executable("erl") of + E when is_list(E) -> + {RE,TE,E}; + _ -> + {error, "Could not find erl command"} + end; + _ -> + {error, "Could not find to_erl command"} + end; + _ -> + {error, "Could not find run_erl command"} + end; + _ -> + {error, "Not a unix OS"} + end. + +create_tempdir() -> + create_tempdir(filename:join(["/tmp","rtnode"++os:getpid()]),$A). + +create_tempdir(Dir,X) when X > $Z, X < $a -> + create_tempdir(Dir,$a); +create_tempdir(Dir,X) when X > $z -> + Estr = lists:flatten( + io_lib:format("Unable to create ~s, reason eexist", + [Dir++[$z]])), + {error, Estr}; +create_tempdir(Dir0, Ch) -> + % Expect fairly standard unix. + Dir = Dir0++[Ch], + case file:make_dir(Dir) of + {error, eexist} -> + create_tempdir(Dir0, Ch+1); + {error, Reason} -> + Estr = lists:flatten( + io_lib:format("Unable to create ~s, reason ~p", + [Dir,Reason])), + {error,Estr}; + ok -> + Dir + end. + +create_nodename() -> + create_nodename($A). + +create_nodename(X) when X > $Z, X < $a -> + create_nodename($a); +create_nodename(X) when X > $z -> + {error,out_of_nodenames}; +create_nodename(X) -> + NN = "rtnode"++os:getpid()++[X], + case file:read_file_info(filename:join(["/tmp",NN])) of + {error,enoent} -> + Host = lists:nth(2,string:tokens(atom_to_list(node()),"@")), + NN++"@"++Host; + _ -> + create_nodename(X+1) + end. + + +start_runerl_node(RunErl,Erl,Tempdir,Nodename,Extra) -> + XArg = case Nodename of + [] -> + []; + _ -> + " -sname "++(if is_atom(Nodename) -> atom_to_list(Nodename); + true -> Nodename + end)++ + " -setcookie "++atom_to_list(erlang:get_cookie()) + end, + XXArg = case Extra of + [] -> + []; + _ -> + " "++Extra + end, + spawn(fun() -> + os:cmd(RunErl++" "++Tempdir++"/ "++Tempdir++" \""++ + Erl++XArg++XXArg++"\"") + end). + +start_toerl_server(ToErl,Tempdir) -> + Pid = spawn(?MODULE,toerl_server,[self(),ToErl,Tempdir]), + receive + {Pid,started} -> + Pid; + {Pid,error,Reason} -> + {error,Reason} + end. + +try_to_erl(_Command, 0) -> + {error, cannot_to_erl}; +try_to_erl(Command, N) -> + ?dbg({?LINE,N}), + Port = open_port({spawn, Command},[eof,{line,1000}]), + Timeout = timeout(normal) div 2, + receive + {Port, eof} -> + receive after Timeout -> + ok + end, + try_to_erl(Command, N-1) + after Timeout -> + ?dbg(Port), + Port + end. + +toerl_server(Parent,ToErl,Tempdir) -> + Port = try_to_erl(ToErl++" "++Tempdir++"/ 2>/dev/null",8), + case Port of + P when is_port(P) -> + Parent ! {self(),started}; + {error,Other} -> + Parent ! {self(),error,Other}, + exit(Other) + end, + case toerl_loop(Port,[]) of + normal -> + ok; + {error, Reason} -> + error_logger:error_msg("toerl_server exit with reason ~p~n", + [Reason]), + exit(Reason) + end. + +toerl_loop(Port,Acc) -> + ?dbg({toerl_loop, Port, Acc}), + receive + {Port,{data,{Tag0,Data}}} when is_port(Port) -> + ?dbg({?LINE,Port,{data,{Tag0,Data}}}), + case Acc of + [{noeol,Data0}|T0] -> + toerl_loop(Port,[{Tag0, Data0++Data}|T0]); + _ -> + toerl_loop(Port,[{Tag0,Data}|Acc]) + end; + {Pid,{get_line,Timeout}} -> + case Acc of + [] -> + case get_data_within(Port,Timeout,[]) of + timeout -> + Pid ! {get_line, timeout}, + toerl_loop(Port,[]); + {noeol,Data1} -> + Pid ! {get_line, timeout}, + toerl_loop(Port,[{noeol,Data1}]); + {eol,Data2} -> + Pid ! {get_line, Data2}, + toerl_loop(Port,[]) + end; + [{noeol,Data3}] -> + case get_data_within(Port,Timeout,Data3) of + timeout -> + Pid ! {get_line, timeout}, + toerl_loop(Port,Acc); + {noeol,Data4} -> + Pid ! {get_line, timeout}, + toerl_loop(Port,[{noeol,Data4}]); + {eol,Data5} -> + Pid ! {get_line, Data5}, + toerl_loop(Port,[]) + end; + List -> + {NewAcc,[{eol,Data6}]} = lists:split(length(List)-1,List), + Pid ! {get_line,Data6}, + toerl_loop(Port,NewAcc) + end; + {Pid, {send_line, Data7}} -> + Port ! {self(),{command, Data7++"\n"}}, + Pid ! {send_line, ok}, + toerl_loop(Port,Acc); + {_Pid, kill_emulator} -> + Port ! {self(),{command, "init:stop().\n"}}, + Timeout1 = timeout(long), + receive + {Port,eof} -> + normal + after Timeout1 -> + {error, kill_timeout} + end; + {Port, eof} -> + {error, unexpected_eof}; + Other -> + {error, {unexpected, Other}} + end. + +millistamp() -> + {Mega, Secs, Micros} = erlang:now(), + (Micros div 1000) + Secs * 1000 + Mega * 1000000000. + +get_data_within(Port, X, Acc) when X =< 0 -> + ?dbg({get_data_within, X, Acc, ?LINE}), + receive + {Port,{data,{Tag0,Data}}} -> + ?dbg({?LINE,Port,{data,{Tag0,Data}}}), + {Tag0, Acc++Data} + after 0 -> + case Acc of + [] -> + timeout; + Noeol -> + {noeol,Noeol} + end + end; + + +get_data_within(Port, Timeout, Acc) -> + ?dbg({get_data_within, Timeout, Acc, ?LINE}), + T1 = millistamp(), + receive + {Port,{data,{noeol,Data}}} -> + ?dbg({?LINE,Port,{data,{noeol,Data}}}), + Elapsed = millistamp() - T1 + 1, + get_data_within(Port, Timeout - Elapsed, Acc ++ Data); + {Port,{data,{eol,Data1}}} -> + ?dbg({?LINE,Port,{data,{eol,Data1}}}), + {eol, Acc ++ Data1} + after Timeout -> + timeout + end. + +%% +%% Test I/O-server +%% + +start_io_server_proxy() -> + spawn_link(?MODULE,io_server_proxy,[#state{}]). + +proxy_getall(Pid) -> + req(Pid,{self(),getall}). +proxy_setnext(Pid,Data) when is_list(Data) -> + req(Pid,{self(),next,Data}). +proxy_quit(Pid) -> + req(Pid,{self(),quit}). + +req(Pid,Mess) -> + Pid ! Mess, + receive + {Pid, Answer} -> + Answer + after 5000 -> + exit(timeout) + end. + +io_server_proxy(State) -> + receive + {io_request, From, ReplyAs, Request} -> + case request(Request,State) of + {Tag, Reply, NewState} when Tag =:= ok; Tag =:= error -> + reply(From, ReplyAs, Reply), + io_server_proxy(NewState); + {stop, Reply, _NewState} -> + reply(From, ReplyAs, Reply), + exit(Reply) + end; + %% Private message + {From, next, Data} -> + From ! {self(), ok}, + io_server_proxy(State#state{nxt = Data}); + {From, getall} -> + From ! {self(), lists:reverse(State#state.q)}, + io_server_proxy(State#state{q=[]}); + {From, quit} -> + From ! {self(), lists:reverse(State#state.q)}, + ok; + _Unknown -> + io_server_proxy(State) + end. + +reply(From, ReplyAs, Reply) -> + From ! {io_reply, ReplyAs, Reply}. + +request({put_chars, Encoding, Chars}, State) -> + {ok, ok, State#state{q=[{put_chars, Encoding, Chars} | State#state.q ]}}; +request({put_chars, Encoding, Module, Function, Args}, State) -> + {ok, ok, State#state{q=[{put_chars, Encoding, Module, Function, Args} | + State#state.q ]}}; +request({put_chars,Chars}, State) -> + {ok, ok, State#state{q=[{put_chars, Chars} | State#state.q ]}}; +request({put_chars,M,F,As}, State) -> + {ok, ok, State#state{q=[{put_chars, M,F,As} | State#state.q ]}}; +request({get_until, Encoding, Prompt, M, F, As}, State) -> + {ok, convert(State#state.nxt, Encoding, State#state.mode), State#state{nxt = eof, q = [{get_until, Encoding, Prompt, M, F, As} | State#state.q]}}; +request({get_chars, Encoding, Prompt, N}, State) -> + {ok, convert(State#state.nxt, Encoding, State#state.mode), State#state{nxt = eof, + q = [{get_chars, Encoding, Prompt, N} | + State#state.q]}}; +request({get_line, Encoding, Prompt}, State) -> + {ok, convert(State#state.nxt, Encoding, State#state.mode), + State#state{nxt = eof, + q = [{get_line, Encoding, Prompt} | + State#state.q]}}; +request({get_until, Prompt, M, F, As}, State) -> + {ok, convert(State#state.nxt, latin1, State#state.mode), + State#state{nxt = eof, + q = [{get_until, Prompt, M, F, As} | State#state.q]}}; +request({get_chars, Prompt, N}, State) -> + {ok, convert(State#state.nxt, latin1, State#state.mode), + State#state{nxt = eof, + q = [{get_chars, Prompt, N} | + State#state.q]}}; +request({get_line, Prompt}, State) -> + {ok, convert(State#state.nxt, latin1, State#state.mode), + State#state{nxt = eof, + q = [{get_line, Prompt} | + State#state.q]}}; +request({get_geomentry,_}, State) -> + {error, {error,enotsup}, State}; +request({setopts, Opts}, State) when Opts =:= [{binary, false}]; Opts =:= [list] -> + {ok, ok, State#state{q=[{setopts, Opts} | State#state.q ], mode = list}}; +request({setopts, Opts}, State) when Opts =:= [{binary, true}]; Opts =:= [binary] -> + {ok, ok, State#state{q=[{setopts, Opts} | State#state.q ], mode = binary}}; +request(getopts, State) -> + {ok, case State#state.mode of + list -> [{binary,false}]; + binary -> [{binary, true}] + end, State#state{q=[getopts | State#state.q ]}}; +request({requests, Reqs}, State) -> + multi_request(Reqs, {ok, ok, State}). + +multi_request([R|Rs], {ok, _Res, State}) -> + multi_request(Rs, request(R, State)); +multi_request([_|_], Error) -> + Error; +multi_request([], State) -> + State. + +convert(Atom,_,_) when is_atom(Atom) -> + Atom; +convert(Data, unicode, list) -> + unicode:characters_to_list(Data,unicode); +convert(Data, latin1, list) -> + try + L = unicode:characters_to_list(Data, unicode), + [ true = Ch =< 255 || Ch <- L ], + L + catch + _:_ -> + {error, {cannot_convert, unicode, latin1}} + end; +convert(Data, unicode, binary) -> + unicode:characters_to_binary(Data,unicode,unicode); +convert(Data, latin1, binary) -> + case unicode:characters_to_binary(Data, unicode, latin1) of + Bin when is_binary(Bin) -> + Bin; + _ -> + {error, {cannot_convert, unicode, latin1}} + end. + +hostname() -> + from($@, atom_to_list(node())). + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(_, []) -> []. + +chomp([]) -> + []; +chomp([$\n]) -> + []; +chomp([H|T]) -> + [H|chomp(T)]; +chomp(<<>>) -> + <<>>; +chomp(<<$\n>>) -> + <<>>; +chomp(<>) -> + X = chomp(Rest), + <>; +chomp(Atom) -> + Atom. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/io_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/io_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/io_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/io_SUITE.erl 2009-11-20 13:30:57.000000000 +0000 @@ -0,0 +1,1900 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(io_SUITE). + +-export([all/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-export([error_1/1, float_g/1, otp_5403/1, otp_5813/1, otp_6230/1, + otp_6282/1, otp_6354/1, otp_6495/1, otp_6517/1, otp_6502/1, + manpage/1, otp_6708/1, otp_7084/1, otp_7421/1, + io_lib_collect_line_3_wb/1, cr_whitespace_in_string/1, + io_fread_newlines/1]). + +%-define(debug, true). + +-ifdef(debug). +-define(format(S, A), io:format(S, A)). +-define(line, put(line, ?LINE), ). +-define(config(X,Y), foo). +-define(t, test_server). +-define(privdir(_), "./io_SUITE_priv"). +-else. +-include("test_server.hrl"). +-define(format(S, A), ok). +-define(privdir(Conf), ?config(priv_dir, Conf)). +-endif. + + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{watchdog, Dog} | Config]. +fin_per_testcase(_Case, _Config) -> + Dog = ?config(watchdog, _Config), + test_server:timetrap_cancel(Dog), + ok. + +all(doc) -> + ["Test cases for io."]; +all(suite) -> + [error_1,float_g,otp_5403,otp_5813,otp_6230,otp_6282,otp_6354,otp_6495, + otp_6517,otp_6502,manpage,otp_6708,otp_7084,otp_7421, + io_lib_collect_line_3_wb,cr_whitespace_in_string,io_fread_newlines]. + +error_1(doc) -> + ["Error cases for output"]; +error_1(suite) -> + []; +error_1(Config) when is_list(Config) -> + %% We don't do erroneous output on stdout - the test server + %% seems to catch that somehow. + ?line PrivDir = ?privdir(Config), + ?line File = filename:join(PrivDir, "slask"), + ?line {ok, F1} = file:open(File, [write]), + ?line {'EXIT', _} = (catch io:format(muttru, "hej", [])), + ?line {'EXIT', _} = (catch io:format(F1, pelle, "hej")), + ?line {'EXIT', _} = (catch io:format(F1, 1, "hej")), + ?line {'EXIT', _} = (catch io:format(F1, "~p~", [kaka])), + ?line {'EXIT', _} = (catch io:format(F1, "~m~n", [kaka])), + + %% This causes the file process to die, and it is linked to us, + %% so we can't catch the error this easily. +% ?line {'EXIT', _} = (catch io:put_chars(F1, 666)), + + ?line file:close(F1), + ?line {'EXIT', _} = (catch io:format(F1, "~p", ["hej"])), + ok. + +float_g(Config) when is_list(Config) -> + ?line ["5.00000e-2", + "0.500000", + "5.00000", + "50.0000", + "500.000", + "5000.00", + "5.00000e+4", + "5.00000e+5"] = float_g_1("~g", 5.0, -2, 5), + + ?line ["-5.0000e-2", + "-0.50000", + "-5.0000", + "-50.000", + "-500.00", + "-5000.0", + "-5.0000e+4", + "-5.0000e+5"] = float_g_1("~.5g", -5.0, -2, 5), + + ?line ["5.000e-2", + "0.5000", + "5.000", + "50.00", + "500.0", + "5.000e+3", + "5.000e+4", + "5.000e+5"] = float_g_1("~.4g", 5.0, -2, 5), + + ?line ["-5.00e-2", + "-0.500", + "-5.00", + "-50.0", + "-5.00e+2", + "-5.00e+3", + "-5.00e+4", + "-5.00e+5"] = float_g_1("~.3g", -5.0, -2, 5), + + ?line ["5.0e-2", + "0.50", + "5.0", + "5.0e+1", + "5.0e+2", + "5.0e+3", + "5.0e+4", + "5.0e+5"] = float_g_1("~.2g", 5.0, -2, 5), + + ?line + case catch fmt("~.1g", [0.5]) of + "0.5" -> + ?line + ["5.0e-2", + "0.5", + "5.0e+0", + "5.0e+1", + "5.0e+2", + "5.0e+3", + "5.0e+4", + "5.0e+5"] = float_g_1("~.1g", 5.0, -2, 5); + {'EXIT',_} -> ok + end, + + ?line ["4.99999e-2", + "0.499999", + "4.99999", + "49.9999", + "499.999", + "4999.99", + "4.99999e+4", + "4.99999e+5"] = float_g_1("~g", 4.9999949999, -2, 5), + + ?line ["-5.00000e-2", + "-0.500000", + "-5.00000", + "-50.0000", + "-500.000", + "-5000.00", + "-5.00000e+4", + "-5.00000e+5"] = float_g_1("~g", -4.9999950001, -2, 5), + ok. + +float_g_1(Fmt, V, Min, Max) -> + [fmt(Fmt, [V*math:pow(10, E)]) || E <- lists:seq(Min, Max)]. + +otp_5403(doc) -> + ["OTP-5403. ~s formats I/O lists and a single binary."]; +otp_5403(suite) -> + []; +otp_5403(Config) when is_list(Config) -> + ?line "atom" = fmt("~s", [atom]), + ?line "binary" = fmt("~s", [<<"binary">>]), + ?line "atail" = fmt("~s", [["a" | <<"tail">>]]), + ?line "deepcharlist" = fmt("~s", [["deep",["char",["list"]]]]), + ?line "somebinaries" = fmt("~s", [[<<"some">>,[<<"binaries">>]]]), + ok. + +otp_5813(doc) -> + ["OTP-5813. read/3 is new."]; +otp_5813(suite) -> + []; +otp_5813(Config) when is_list(Config) -> + ?line PrivDir = ?privdir(Config), + ?line File = filename:join(PrivDir, "test"), + + ?line ok = file:write_file(File, <<"a. ">>), + ?line {ok, Fd} = file:open(File, [read]), + ?line {ok, a, 1} = io:read(Fd, '', 1), + ?line {eof,1} = io:read(Fd, '', 1), + ok = file:close(Fd), + + ?line ok = file:write_file(File, <<"[}.">>), + ?line {ok, Fd2} = file:open(File, [read]), + ?line {error,{1,_,_},1} = io:read(Fd2, '', 1), + ?line ok = file:close(Fd), + + file:delete(File), + ok. + +otp_6230(doc) -> + ["OTP-6230. ~p and ~P with (huge) binaries."]; +otp_6230(suite) -> + []; +otp_6230(Config) when is_list(Config) -> + %% The problem is actually huge binaries, but the small tests here + %% just run through most of the modified code. + ?line "<<>>" = fmt("~P", [<<"">>,-1]), + ?line "<<\"hej\">>" = fmt("~P", [<<"hej">>,-1]), + ?line "{hej,...}" = fmt("~P", [{hej,<<"hej">>},2]), + ?line "{hej,<<...>>}" = fmt("~P", [{hej,<<"hej">>},3]), + ?line "{hej,<<\"hejs\"...>>}" = fmt("~P", [{hej,<<"hejsan">>},4]), + ?line "{hej,<<\"hej\">>}" = fmt("~P", [{hej,<<"hej">>},6]), + ?line "<<...>>" = fmt("~P", [<<"hej">>,1]), + ?line "<<\"hejs\"...>>" = fmt("~P", [<<"hejsan">>,2]), + ?line "<<\"hej\">>" = fmt("~P", [<<"hej">>,4]), + ?line "{hej,<<127,...>>}" = + fmt("~P", [{hej,<<127:8,<<"hej">>/binary>>},4]), + ?line "{hej,<<127,104,101,...>>}" = + fmt("~P", [{hej,<<127:8,<<"hej">>/binary>>},6]), + + B = list_to_binary(lists:duplicate(30000, $a)), + ?line "<<\"aaaa"++_ = fmt("~P", [B, 20000]), + ok. + +otp_6282(doc) -> + ["OTP-6282. ~p truncates strings (like binaries) depending on depth."]; +otp_6282(suite) -> + []; +otp_6282(Config) when is_list(Config) -> + ?line "[]" = p("", 1, 20, 1), + ?line "[]" = p("", 1, 20, -1), + ?line "[...]" = p("a", 1, 20, 1), + ?line "\"a\"" = p("a", 1, 20, 2), + ?line "\"aa\"" = p("aa", 1, 20, 2), + ?line "\"aaa\"" = p("aaa", 1, 20, 2), + ?line "\"aaaa\"" = p("aaaa", 1, 20, 2), + % ?line "\"aaaa\"..." = p("aaaaaa", 1, 20, 2), + ?line "\"a\"" = p("a", 1, 20, -1), + % ?line "\"aa\"..." = p([$a,$a,1000], 1, 20, 2), + % ?line "\"aa\"..." = p([$a,$a,1000], 1, 20, 3), + ?line "[97,97,1000]" = p([$a,$a,1000], 1, 20, 4), + S1 = lists:duplicate(200,$a), + ?line "[...]" = p(S1, 1, 20, 1), + % ?line "\"aaaaaaaaaaaaaaaa\"\n \"aaaaaaaaaaaaaaaa\"\n \"aaaa\"..." = + % ?line "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"..." = + % p(S1, 1, 20, 10), + ?line true = "\"" ++ S1 ++ "\"" =:= p(S1, 1, 205, -1), + ?line "[97,97,1000|...]" = p([$a,$a,1000,1000], 1, 20, 4), + + ?line "[[]]" = p([""], 1, 20, 2), + ?line "[[]]" = p([""], 1, 20, -1), + ?line "[[...]]" = p(["a"], 1, 20, 2), + ?line "[\"a\"]" = p(["a"], 1, 20, 3), + ?line "[\"aa\"]" = p(["aa"], 1, 20, 3), + ?line "[\"aaa\"]" = p(["aaa"], 1, 20, 3), + ?line "[\"a\"]" = p(["a"], 1, 20, -1), + % ?line "[\"aa\"...]" = p([[$a,$a,1000]], 1, 20, 3), + % ?line "[\"aa\"...]" = p([[$a,$a,1000]], 1, 20, 4), + ?line "[[97,97,1000]]" = p([[$a,$a,1000]], 1, 20, 5), + ?line "[[...]]" = p([S1], 1, 20, 2), + % ?line "[\"aaaaaaaaaaaaaa\"\n \"aaaaaaaaaaaaaa\"\n \"aaaaaaaa\"...]" = + % ?line "[\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"...]" = + % p([S1], 1, 20, 11), + ?line true = "[\"" ++ S1 ++ "\"]" =:= p([S1], 1, 210, -1), + ?line "[[97,97,1000|...]]" = p([[$a,$a,1000,1000]], 1, 20, 5), + + % ?line "[\"aaaa\"...]" = p(["aaaaa"], 1, 10, 3), + ?line "[\"aaaaa\"]" = p(["aaaaa"], 1, 10, 6), + + ok. + +otp_6354(doc) -> + ["OTP-6354. io_lib_pretty rewritten."]; +otp_6354(suite) -> + []; +otp_6354(Config) when is_list(Config) -> + %% A few tuples: + ?line "{}" = p({}, 1, 20, -1), + ?line "..." = p({}, 1, 20, 0), + ?line "{}" = p({}, 1, 20, 1), + ?line "{}" = p({}, 1, 20, 2), + ?line "{a}" = p({a}, 1, 20, -1), + ?line "..." = p({a}, 1, 20, 0), + ?line "{...}" = p({a}, 1, 20, 1), + ?line "{a}" = p({a}, 1, 20, 2), + ?line "{a,b}" = p({a,b}, 1, 20, -1), + ?line "..." = p({a,b}, 1, 20, 0), + ?line "{...}" = p({a,b}, 1, 20, 1), + ?line "{a,...}" = p({a,b}, 1, 20, 2), + ?line "{a,b}" = p({a,b}, 1, 20, 3), + ?line "{}" = p({}, 1, 1, -1), + ?line "..." = p({}, 1, 1, 0), + ?line "{}" = p({}, 1, 1, 1), + ?line "{}" = p({}, 1, 1, 2), + ?line "{a}" = p({a}, 1, 1, -1), + ?line "..." = p({a}, 1, 1, 0), + ?line "{...}" = p({a}, 1, 1, 1), + ?line "{a}" = p({a}, 1, 1, 2), + ?line "{a,\n b}" = p({a,b}, 1, 1, -1), + ?line "{1,\n b}" = p({1,b}, 1, 1, -1), + ?line "..." = p({a,b}, 1, 1, 0), + ?line "{...}" = p({a,b}, 1, 1, 1), + ?line "{a,...}" = p({a,b}, 1, 1, 2), + ?line "{a,\n b}" = p({a,b}, 1, 1, 3), + ?line "{{}}" = p({{}}, 1, 1, 2), + ?line "{[]}" = p({[]}, 1, 1, 2), + ?line bt(<<"{1,2,a,b,{sfdsf,sdfdsfs},[sfsdf,sdfsdf]}">>, + p({1,2,a,b,{sfdsf,sdfdsfs},[sfsdf,sdfsdf]}, -1)), + ?line bt(<<"{abcd,ddddd,\n ddddd}">>, + p({abcd,ddddd,ddddd}, 1,16, -1)), + ?line bt(<<"{1,2,a,b,\n {sfdsf,sdfdsfs},\n [sfsdf,sdfsdf]}">>, + p({1,2,a,b,{sfdsf,sdfdsfs},[sfsdf,sdfsdf]}, 1, 35, 100)), + % With other terms than atomic ones on the same line: +% ?line bt(<<"{1,2,a,b,{sfdsf,sdfdsfs},\n [sfsdf,sdfsdf]}">>, +% p({1,2,a,b,{sfdsf,sdfdsfs},[sfsdf,sdfsdf]}, 1, 35, 100)), + % With line breaks: +% ?line bt(<<"{1,\n" +% " 2,\n" +% " a,\n" +% " b,\n" +% " {sfdsf,sdfdsfs},\n" +% " [sfsdf,sdfsdf]}">>, +% p({1,2,a,b,{sfdsf,sdfdsfs},[sfsdf,sdfsdf]}, 1, 35, 100)), + ?line "{1,{1,{2,3}}}" = p({1,{1,{2,3}}}, 1, 80, 100), + + ?line bt(<<"{wwwww,{wwwww,{wwwww,{wwwww,{wwwww,lkjsldfj,klsdjfjklds,\n" + " sdkfjdsl,sdakfjdsklj,sdkljfsdj}}}}}">>, + p({wwwww,{wwwww,{wwwww,{wwwww,{wwwww,lkjsldfj,klsdjfjklds, + sdkfjdsl,sdakfjdsklj,sdkljfsdj}}}}}, -1)), + + % With no restriction on number of characters per line: +% ?line bt(<<"{wwwww,{wwwww,{wwwww,{wwwww,{wwwww,lkjsldfj,klsdjfjklds," +% "sdkfjdsl,sdakfjdsklj,\n" +% " sdkljfsdj}}}}}">>, +% p({wwwww,{wwwww,{wwwww,{wwwww,{wwwww,lkjsldfj,klsdjfjklds, +% sdkfjdsl,sdakfjdsklj,sdkljfsdj}}}}}, -1)), + + % With line breaks: +% ?line bt(<<"{wwwww,{wwwww,{wwwww,{wwwww,{wwwww,lkjsldfj,\n" +% " klsdjfjklds,\n" +% " sdkfjdsl,\n" +% " sdakfjdsklj,\n" +% " sdkljfsdj}}}}}">>, +% p({wwwww,{wwwww,{wwwww,{wwwww,{wwwww,lkjsldfj,klsdjfjklds, +% sdkfjdsl,sdakfjdsklj,sdkljfsdj}}}}}, -1)), + ?line bt(<<"{wwwww,\n" + " {wwwww,\n" + " {wwwww,\n" + " {wwwww,\n" + " {wwwww,\n" + " {lkjsldfj,\n" + " {klsdjfjklds,\n" + " {klajsljls,\n" + " #aaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa{}}}}}}}}}">>, + p({wwwww,{wwwww,{wwwww,{wwwww,{wwwww,{lkjsldfj, + {klsdjfjklds,{klajsljls, + {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}}}}}}}}}, + -1)), + ?line "{{...},...}" = p({{a,b},{a,b,c},{d,e,f}},1,8,2), + %% Closing brackets and parentheses count: + ?line "{{a,b,c},\n {{1,2,\n 3}}}" = p({{a,b,c},{{1,2,3}}},1,11,-1), + % With line breaks: +% ?line "{{a,b,c},\n {{1,\n 2,\n 3}}}" = p({{a,b,c},{{1,2,3}}},1,11,-1), + ?line "{{a,b,c},\n [1,2,\n 3]}" = p({{a,b,c},[1,2,3]},1,10,-1), + % With line breaks: +% ?line "{{a,b,c},\n [1,\n 2,\n 3]}" = p({{a,b,c},[1,2,3]},1,10,-1), + ?line "[{{a,b,c},\n {1,2,\n 3}}]" = p([{{a,b,c},{1,2,3}}],1,12,-1), + % With line breaks: +% ?line "[{{a,b,c},\n {1,\n 2,\n 3}}]" = p([{{a,b,c},{1,2,3}}],1,12,-1), + + %% A few lists: + ?line "[]" = p([], 1, 20, -1), + ?line "..." = p([], 1, 20, 0), + ?line "[]" = p([], 1, 20, 1), + ?line "[]" = p([], 1, 20, 2), + ?line "[a]" = p([a], 1, 20, -1), + ?line "..." = p([a], 1, 20, 0), + ?line "[...]" = p([a], 1, 20, 1), + ?line "[a]" = p([a], 1, 20, 2), + ?line "[a,b]" = p([a,b], 1, 20, -1), + ?line "..." = p([a,b], 1, 20, 0), + ?line "[...]" = p([a,b], 1, 20, 1), + ?line "[a|...]" = p([a,b], 1, 20, 2), + ?line "[a,b]" = p([a,b], 1, 20, 3), + ?line "[a|b]" = p([a|b], 1, 20, -1), + ?line "..." = p([a|b], 1, 20, 0), + ?line "[...]" = p([a|b], 1, 20, 1), + ?line "[a|...]" = p([a|b], 1, 20, 2), + ?line "[a|b]" = p([a|b], 1, 20, 3), + ?line "[]" = p([], 1, 1, -1), + ?line "..." = p([], 1, 1, 0), + ?line "[]" = p([], 1, 1, 1), + ?line "[]" = p([], 1, 1, 2), + ?line "[a]" = p([a], 1, 1, -1), + ?line "..." = p([a], 1, 1, 0), + ?line "[...]" = p([a], 1, 1, 1), + ?line "[a]" = p([a], 1, 1, 2), + ?line "[a,\n b]" = p([a,b], 1, 1, -1), + ?line "..." = p([a,b], 1, 1, 0), + ?line "[...]" = p([a,b], 1, 1, 1), + ?line "[a|...]" = p([a,b], 1, 1, 2), + ?line "[a,\n b]" = p([a,b], 1, 1, 3), + ?line "[a|\n b]" = p([a|b], 1, 1, -1), + ?line "..." = p([a|b], 1, 1, 0), + ?line "[...]" = p([a|b], 1, 1, 1), + ?line "[a|...]" = p([a|b], 1, 1, 2), + ?line "[a|\n b]" = p([a|b], 1, 1, 3), + ?line "[{}]" = p([{}], 1, 1, 2), + ?line "[[]]" = p([[]], 1, 1, 2), + ?line bt(<<"[1,2,a,b,{sfdsf,sdfdsfs},[sfsdf,sdfsdf]]">>, + p([1,2,a,b,{sfdsf,sdfdsfs},[sfsdf,sdfsdf]], -1)), + ?line bt(<<"[1,2,a,b,\n {sfdsf,sdfdsfs},\n [sfsdf,sdfsdf]]">>, + p([1,2,a,b,{sfdsf,sdfdsfs},[sfsdf,sdfsdf]], 1, 35, 100)), + % With other terms than atomic ones on the same line: +% ?line bt(<<"[1,2,a,b,{sfdsf,sdfdsfs},\n [sfsdf,sdfsdf]]">>, +% p([1,2,a,b,{sfdsf,sdfdsfs},[sfsdf,sdfsdf]], 1, 35, 100)), + % With line breaks: +% ?line bt(<<"[1,\n" +% " 2,\n" +% " a,\n" +% " b,\n" +% " {sfdsf,sdfdsfs},\n" +% " [sfsdf,sdfsdf]]">>, +% p([1,2,a,b,{sfdsf,sdfdsfs},[sfsdf,sdfsdf]], 1, 35, 100)), + %% Element #8 is not printable: + ?line "[49," ++ _ = p("1234567"++[3,4,5,6,7], 1, 100, 9), + % ?line "\"1234567\"..." = p("1234567"++[3,4,5,6,7], 1, 100, 8), + + %% A few records: + %% -record(a, {}). + %% -record(a, {}). + ?line "..." = p({a}, 0), + ?line "{...}" = p({a}, 1), + ?line "#a{}" = p({a}, 2), + ?line "#a{}" = p({a}, -1), + %% -record(b, {f}). + ?line "{...}" = p({b}, 1), + ?line "..." = p({b,c}, 0), + ?line "{...}" = p({b,c}, 1), + ?line "#b{...}" = p({b,c}, 2), + ?line "#b{f = c}" = p({b,c}, 3), + ?line "#b{f = c}" = p({b,c}, -1), + ?line "..." = p({b,{c,d}}, 0), + ?line "{...}" = p({b,{c,d}}, 1), + ?line "#b{...}" = p({b,{c,d}}, 2), + ?line "#b{f = {...}}" = p({b,{c,d}}, 3), + ?line "#b{f = {c,...}}" = p({b,{c,d}}, 4), + ?line "#b{f = {c,d}}" = p({b,{c,d}}, 5), + ?line "#b{f = {...}}" = p({b,{b,c}}, 3), + ?line "#b{f = #b{...}}" = p({b,{b,c}}, 4), + ?line "#b{f = #b{f = c}}" = p({b,{b,c}}, 5), + %% -record(c, {f1, f2}). + ?line "#c{f1 = d,f2 = e}" = p({c,d,e}, -1), + ?line "..." = p({c,d,e}, 0), + ?line "{...}" = p({c,d,e}, 1), + ?line "#c{...}" = p({c,d,e}, 2), + ?line "#c{f1 = d,...}" = p({c,d,e}, 3), + ?line "#c{f1 = d,f2 = e}" = p({c,d,e}, 4), + %% -record(d, {a..., b..., c.., d...}). + ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,bbbbbbbbbbbbbbbbbbbb = 2,\n" + " cccccccccccccccccccc = 3,dddddddddddddddddddd = 4,\n" + " eeeeeeeeeeeeeeeeeeee = 5}">>, + p({d,1,2,3,4,5}, -1)), + % With no restriction on number of characters per line: +% ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,bbbbbbbbbbbbbbbbbbbb = 2," +% "cccccccccccccccccccc = 3,\n dddddddddddddddddddd = 4," +% "eeeeeeeeeeeeeeeeeeee = 5}">>, +% p({d,1,2,3,4,5}, -1)), + % With line breaks: +% ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,\n" +% " bbbbbbbbbbbbbbbbbbbb = 2,\n" +% " cccccccccccccccccccc = 3,\n" +% " dddddddddddddddddddd = 4,\n" +% " eeeeeeeeeeeeeeeeeeee = 5}">>, +% p({d,1,2,3,4,5}, -1)), + ?line "..." = p({d,1,2,3,4,5}, 0), + ?line "{...}" = p({d,1,2,3,4,5}, 1), + ?line "#d{...}" = p({d,1,2,3,4,5}, 2), + ?line "#d{aaaaaaaaaaaaaaaaaaaa = 1,...}" = p({d,1,2,3,4,5}, 3), + ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,bbbbbbbbbbbbbbbbbbbb = 2,...}">>, + p({d,1,2,3,4,5}, 4)), + ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,bbbbbbbbbbbbbbbbbbbb = 2,\n" + " cccccccccccccccccccc = 3,...}">>, + p({d,1,2,3,4,5}, 5)), % longer than 80 characters... + % With no restriction on number of characters per line: +% ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,bbbbbbbbbbbbbbbbbbbb = 2," +% "cccccccccccccccccccc = 3,...}">>, +% p({d,1,2,3,4,5}, 5)), % longer than 80 characters... + % With line breaks: +% ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,\n" +% " bbbbbbbbbbbbbbbbbbbb = 2,\n" +% " cccccccccccccccccccc = 3,...}">>, +% p({d,1,2,3,4,5}, 5)), + ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,bbbbbbbbbbbbbbbbbbbb = 2,\n" + " cccccccccccccccccccc = 3,dddddddddddddddddddd = 4,...}">>, + p({d,1,2,3,4,5}, 6)), + % With no restriction on number of characters per line: +% ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,bbbbbbbbbbbbbbbbbbbb = 2," +% "cccccccccccccccccccc = 3,\n dddddddddddddddddddd = 4,...}">>, +% p({d,1,2,3,4,5}, 6)), + % With line breaks: +% ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,\n" +% " bbbbbbbbbbbbbbbbbbbb = 2,\n" +% " cccccccccccccccccccc = 3,\n" +% " dddddddddddddddddddd = 4,...}">>, +% p({d,1,2,3,4,5}, 6)), + ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,bbbbbbbbbbbbbbbbbbbb = 2,\n" + " cccccccccccccccccccc = 3,dddddddddddddddddddd = 4,\n" + " eeeeeeeeeeeeeeeeeeee = 5}">>, + p({d,1,2,3,4,5}, 7)), + % With no restriction on number of characters per line: +% ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,bbbbbbbbbbbbbbbbbbbb = 2," +% "cccccccccccccccccccc = 3,\n dddddddddddddddddddd = 4," +% "eeeeeeeeeeeeeeeeeeee = 5}">>, +% p({d,1,2,3,4,5}, 7)), + % With line breaks: +% ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,\n" +% " bbbbbbbbbbbbbbbbbbbb = 2,\n" +% " cccccccccccccccccccc = 3,\n" +% " dddddddddddddddddddd = 4,\n" +% " eeeeeeeeeeeeeeeeeeee = 5}">>, +% p({d,1,2,3,4,5}, 7)), + ?line bt(<<"#rrrrr{\n" + " f1 = 1,\n" + " f2 = #rrrrr{f1 = a,f2 = b,f3 = c},\n" + " f3 = \n" + " #rrrrr{\n" + " f1 = h,f2 = i,\n" + " f3 = \n" + " #rrrrr{\n" + " f1 = aa,\n" + " f2 = \n" + " #rrrrr{\n" + " f1 = #rrrrr{f1 = a,f2 = b,f3 = c},\n" + " f2 = 2,f3 = 3},\n" + " f3 = bb}}}">>, + p({rrrrr,1,{rrrrr,a,b,c},{rrrrr,h,i, + {rrrrr,aa,{rrrrr,{rrrrr,a,b,c}, + 2,3},bb}}}, + -1)), + % With other terms than atomic ones on the same line: +% ?line bt(<<"#rrrrr{\n" +% " f1 = 1,f2 = #rrrrr{f1 = a,f2 = b,f3 = c},\n" +% " f3 = \n" +% " #rrrrr{\n" +% " f1 = h,f2 = i,\n" +% " f3 = \n" +% " #rrrrr{\n" +% " f1 = aa,\n" +% " f2 = \n" +% " #rrrrr{\n" +% " f1 = #rrrrr{f1 = a,f2 = b," +% "f3 = c},f2 = 2,f3 = 3},\n" +% " f3 = bb}}}">>, +% p({rrrrr,1,{rrrrr,a,b,c},{rrrrr,h,i, +% {rrrrr,aa,{rrrrr,{rrrrr,a,b,c}, +% 2,3},bb}}}, +% -1)), + % With line breaks: +% ?line bt(<<"#rrrrr{\n" +% " f1 = 1,\n" +% " f2 = #rrrrr{f1 = a,f2 = b,f3 = c},\n" +% " f3 = \n" +% " #rrrrr{\n" +% " f1 = h,\n" +% " f2 = i,\n" +% " f3 = \n" +% " #rrrrr{\n" +% " f1 = aa,\n" +% " f2 = \n" +% " #rrrrr{\n" +% " f1 = #rrrrr{f1 = a,f2 = b," +% "f3 = c},\n" +% " f2 = 2,\n" +% " f3 = 3},\n" +% " f3 = bb}}}">>, +% p({rrrrr,1,{rrrrr,a,b,c},{rrrrr,h,i, +% {rrrrr,aa,{rrrrr,{rrrrr,a,b,c}, +% 2,3},bb}}}, +% -1)), + ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,\n" + " bbbbbbbbbbbbbbbbbbbb = \n" + " #d{aaaaaaaaaaaaaaaaaaaa = a,bbbbbbbbbbbbbbbbbbbb = b,\n" + " cccccccccccccccccccc = c,dddddddddddddddddddd = d,\n" + " eeeeeeeeeeeeeeeeeeee = e},\n" + " cccccccccccccccccccc = 3,\n" + " dddddddddddddddddddd = \n" + " #d{aaaaaaaaaaaaaaaaaaaa = h,bbbbbbbbbbbbbbbbbbbb = i,\n" + " cccccccccccccccccccc = \n" + " #d{aaaaaaaaaaaaaaaaaaaa = aa," + "bbbbbbbbbbbbbbbbbbbb = bb,\n" + " cccccccccccccccccccc = \n" + " #d{aaaaaaaaaaaaaaaaaaaa = 1," + "bbbbbbbbbbbbbbbbbbbb = 2,\n" + " cccccccccccccccccccc = 3," + "dddddddddddddddddddd = 4,\n" + " eeeeeeeeeeeeeeeeeeee = 5},\n" + " dddddddddddddddddddd = dd," + "eeeeeeeeeeeeeeeeeeee = ee},\n" + " dddddddddddddddddddd = k," + "eeeeeeeeeeeeeeeeeeee = l},\n" + " eeeeeeeeeeeeeeeeeeee = 5}">>, + p({d,1,{d,a,b,c,d,e},3,{d,h,i,{d,aa,bb,{d,1,2,3,4,5},dd,ee}, + k,l},5}, -1)), + % With line breaks: +% ?line bt(<<"#d{aaaaaaaaaaaaaaaaaaaa = 1,\n" +% " bbbbbbbbbbbbbbbbbbbb = \n" +% " #d{aaaaaaaaaaaaaaaaaaaa = a,\n" +% " bbbbbbbbbbbbbbbbbbbb = b,\n" +% " cccccccccccccccccccc = c,\n" +% " dddddddddddddddddddd = d,\n" +% " eeeeeeeeeeeeeeeeeeee = e},\n" +% " cccccccccccccccccccc = 3,\n" +% " dddddddddddddddddddd = \n" +% " #d{aaaaaaaaaaaaaaaaaaaa = h,\n" +% " bbbbbbbbbbbbbbbbbbbb = i,\n" +% " cccccccccccccccccccc = \n" +% " #d{aaaaaaaaaaaaaaaaaaaa = aa,\n" +% " bbbbbbbbbbbbbbbbbbbb = bb,\n" +% " cccccccccccccccccccc = \n" +% " #d{aaaaaaaaaaaaaaaaaaaa = 1,\n" +% " bbbbbbbbbbbbbbbbbbbb = 2,\n" +% " cccccccccccccccccccc = 3,\n" +% " dddddddddddddddddddd = 4,\n" +% " eeeeeeeeeeeeeeeeeeee = 5},\n" +% " dddddddddddddddddddd = dd,\n" +% " eeeeeeeeeeeeeeeeeeee = ee},\n" +% " dddddddddddddddddddd = k,\n" +% " eeeeeeeeeeeeeeeeeeee = l},\n" +% " eeeeeeeeeeeeeeeeeeee = 5}">>, +% p({d,1,{d,a,b,c,d,e},3,{d,h,i,{d,aa,bb,{d,1,2,3,4,5},dd,ee}, +% k,l},5}, -1)), + + A = aaaaaaaaaaaaa, + %% Print the record with dots at the end of the line (Ll = 80). + ?line "{aaaaaaa" ++ _ = + p({A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A, + {A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A, + {A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A, + {A,{A,{ggg,{hhh,{ii,{jj,{kk,{ll,{mm,{nn,{oo,{d,1,2,3,4,5} + }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} + }}}}}}}}}}}}}}}}, 146), + ?line "{aaaaaaa" ++ _ = + p({A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A, + {A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A, + {A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{A, + {A,{A,{A,{A,{A,{ggg,{hhh,{ii,{jj,{kk,{ll,{mm,{nn,{oo,{a} + }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} + }}}}}}}}}}}}}}}}}}}, 152), + + ?line bt(<<"{aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {g,{h,{i,{j,{k,{l,{m,{n,{o,#" + "d{...}}}}}}}}}}}}}}}}">>, + p({A,{A,{A,{A,{A,{A, + {g,{h,{i,{j,{k,{l,{m,{n,{o,{d,1,2,3,4,5}}}}}}}}}}}}}}}}, 32)), + ?line bt(<<"{a,#b{f = {c,{d,{e,{f,...}}}}}}">>, + p({a,{b,{c,{d,{e,{f,g}}}}}}, 12)), + ?line bt(<<"{aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,#c{f1 = ddd," + "f2 = eee}}}}}}}}}}">>, + p({A,{A,{A,{A,{A,{A,{A,{A,{A,{c,ddd,eee}}}}}}}}}}, 100)), + ?line bt(<<"{aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,{aaaaaaaaaaaaa,{aaaaaaaaaaaaa,...}}}}">>, + p({A,{A,{A,{A,{b}}}}}, 8)), + % With no restriction on number of characters per line: +% ?line bt(<<"{aaaaaaaaaaaaa,{aaaaaaaaaaaaa,{aaaaaaaaaaaaa," +% "{aaaaaaaaaaaaa,...}}}}">>, +% p({A,{A,{A,{A,{b}}}}}, 8)), + ?line bt(<<"{aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,{aaaaaaaaaaaaa,{aaaaaaaaaaaaa,...}}}}}">>, + p({A,{A,{A,{A,{A,{b}}}}}}, 10)), + % With no restriction on number of characters per line: +% ?line bt(<<"{aaaaaaaaaaaaa,\n" +% " {aaaaaaaaaaaaa,{aaaaaaaaaaaaa,{aaaaaaaaaaaaa," +% "{aaaaaaaaaaaaa,...}}}}}">>, +% p({A,{A,{A,{A,{A,{b}}}}}}, 10)), + ?line bt(<<"{aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa," + "{aaaaaaaaaaaaa,#a{}}}}}}}}}}}">>, + p({A,{A,{A,{A,{A,{A,{A,{A,{A,{A,{a}}}}}}}}}}}, 23)), + ?line bt(<<"{aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n", + " #rrrrr{\n" + " f1 = kljlkjlksfdgkljlsdkjf," + "f2 = kljkljsdaflkjlkjsdf,...}}}}">>, + p({A,{A,{A,{rrrrr, kljlkjlksfdgkljlsdkjf, + kljkljsdaflkjlkjsdf, + asdfkldsjfklkljsdklfds}}}}, 10)), + % With no restriction on number of characters per line: +% ?line bt(<<"{aaaaaaaaaaaaa,\n" +% " {aaaaaaaaaaaaa,\n" +% " {aaaaaaaaaaaaa,\n", +% " #rrrrr{f1 = kljlkjlksfdgkljlsdkjf,f2 = " +% "kljkljsdaflkjlkjsdf,...}}}}">>, +% p({A,{A,{A,{rrrrr, kljlkjlksfdgkljlsdkjf, +% kljkljsdaflkjlkjsdf, +% asdfkldsjfklkljsdklfds}}}}, 10)), + ?line bt(<<"{aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {aaaaaaaaaaaaa,\n" + " {g,{h,{i,{j,{k,{l,{m,{n," + "{o,#a{}}}}}}}}}}}}}}}}}">>, + p({A,{A,{A,{A,{A,{A,{A, + {g,{h,{i,{j,{k,{l,{m,{n,{o,{a}}}}}}}}}}}}}}}}}, 100)), + ?line bt(<<"#c{\n" + " f1 = \n" + " #c{\n" + " f1 = \n" + " #c{\n" + " f1 = \n" + " #c{\n" + " f1 = \n" + " #c{\n" + " f1 = \n" + " #c{\n" + " f1 = \n" + " #c{\n" + " f1 = \n" + " #c{\n" + " f1 = \n" + " #c{\n" + " f1 = #c{f1 = #c{f1 = #c{f1 = a," + "f2 = b},f2 = b},f2 = b},\n" + " f2 = b},\n" + " f2 = b},\n" + " f2 = b},\n" + " f2 = b},\n" + " f2 = b},\n" + " f2 = b},\n" + " f2 = b},\n" + " f2 = b},\n" + " f2 = b}">>, + p({c,{c,{c,{c,{c,{c,{c,{c,{c,{c,{c,{c,a,b},b},b},b},b},b}, + b},b},b},b},b},b}, -1)), + ?line bt(<<"#rrrrr{\n" + " f1 = \n" + " #rrrrr{\n" + " f1 = \n" + " #rrrrr{\n" + " f1 = \n" + " #rrrrr{\n" + " f1 = \n" + " {rrrrr,{rrrrr,a,#rrrrr{f1 = {rrrrr,1,2},f2 = a," + "f3 = b}},b},\n" + " f2 = {rrrrr,c,d},\n" + " f3 = {rrrrr,1,2}},\n" + " f2 = 1,f3 = 2},\n" + " f2 = 3,f3 = 4},\n" + " f2 = 5,f3 = 6}">>, + p({rrrrr,{rrrrr,{rrrrr,{rrrrr,{rrrrr,{rrrrr,a,{rrrrr, + {rrrrr,1,2},a,b}},b},{rrrrr,c,d},{rrrrr,1,2}}, + 1,2},3,4},5,6}, -1)), + % With other terms than atomic ones on the same line: +% ?line bt(<<"#rrrrr{\n" +% " f1 = \n" +% " #rrrrr{\n" +% " f1 = \n" +% " #rrrrr{\n" +% " f1 = \n" +% " #rrrrr{\n" +% " f1 = \n" +% " {rrrrr,{rrrrr,a,#rrrrr{f1 = {rrrrr,1,2},f2 = a," +% "f3 = b}},b},\n" +% " f2 = {rrrrr,c,d},f3 = {rrrrr,1,2}},\n" +% " f2 = 1,f3 = 2},\n" +% " f2 = 3,f3 = 4},\n" +% " f2 = 5,f3 = 6}">>, +% p({rrrrr,{rrrrr,{rrrrr,{rrrrr,{rrrrr,{rrrrr,a,{rrrrr, +% {rrrrr,1,2},a,b}},b},{rrrrr,c,d},{rrrrr,1,2}}, +% 1,2},3,4},5,6}, -1)), + % With no restriction on number of characters per line: +% ?line bt(<<"#rrrrr{\n" +% " f1 = \n" +% " #rrrrr{\n" +% " f1 = \n" +% " #rrrrr{\n" +% " f1 = \n" +% " #rrrrr{\n" +% " f1 = {rrrrr,{rrrrr,a,#rrrrr{f1 = {rrrrr,1,2},f2 = a," +% "f3 = b}},b},\n" +% " f2 = {rrrrr,c,d},f3 = {rrrrr,1,2}},\n" +% " f2 = 1,f3 = 2},\n" +% " f2 = 3,f3 = 4},\n" +% " f2 = 5,f3 = 6}">>, +% p({rrrrr,{rrrrr,{rrrrr,{rrrrr,{rrrrr,{rrrrr,a,{rrrrr, +% {rrrrr,1,2},a,b}},b},{rrrrr,c,d},{rrrrr,1,2}}, +% 1,2},3,4},5,6}, -1)), + % With line breaks: +% ?line bt(<<"#rrrrr{\n" +% " f1 = \n" +% " #rrrrr{\n" +% " f1 = \n" +% " #rrrrr{\n" +% " f1 = \n" +% " #rrrrr{\n" +% " f1 = {rrrrr,{rrrrr,a,#rrrrr{f1 = {rrrrr,1,2},f2 = a," +% "f3 = b}},b},\n" +% " f2 = {rrrrr,c,d},\n" +% " f3 = {rrrrr,1,2}},\n" +% " f2 = 1,\n" +% " f3 = 2},\n" +% " f2 = 3,\n" +% " f3 = 4},\n" +% " f2 = 5,\n" +% " f3 = 6}">>, +% p({rrrrr,{rrrrr,{rrrrr,{rrrrr,{rrrrr,{rrrrr,a,{rrrrr, +% {rrrrr,1,2},a,b}},b},{rrrrr,c,d},{rrrrr,1,2}}, +% 1,2},3,4},5,6}, -1)), + ?line "{aaa,\n {aaa," ++ _ = + p({aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa, + {aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa, + {aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa, + {aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa,{aaa, + {aaa,a}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, + 1, 80, -1), + + %% A few other cases... + ?line "{a,#Fun<" ++ _ = lists:flatten(io_lib_pretty:print({a,fun fmt/2})), + ?line "#Fun<" ++ _ = io_lib_pretty:print(fun() -> foo end), + % ?line "[<<\"foobar\">>|<<\"barf\"...>>]" = + % p([<<"foobar">>|<<"barfoo">>], 1, 30, 4), + %% No support for negative columns any more: + ?line "[a,\n [b,\n c,\n d,\n [e,\n f]],\n c]" = + p([a,[b,c,d,[e,f]],c], -1, 2, 10), + ?line "[a,\n [b,\n c,\n d,\n [e,\n f]],\n c]" = + p([a,[b,c,d,[e,f]],c], 0, 2, 10), + %% 20 bytes are tried first, then the rest. Try 21 bytes: + L = lists:duplicate(20, $a), + % ?line bt(<<"<<\"aaaaaa\"\n \"aaaaaa\"\n \"aaaaaa\"\n \"aaa\">>">>, + ?line bt(<<"<<\"aaaaaaaaaaaaaaaaaaaaa\">>">>, + p(list_to_binary([$a | L]), 1, 10, -1)), + ?line "<<97," ++ _ = p(list_to_binary(L ++ [3]), 1, 10, -1), + % ?line "<<\"aaaa\"...>>" = p(list_to_binary(L ++ [3]), 1, 10, 2), + % ?line "<<\"aaaaaa\"\n \"aa\"...>>" = + % ?line "<<\"aaaaaaaa\"...>>" = + % p(list_to_binary(L ++ [3]), 1, 10, 3), + % ?line "<<\"aaaaaa\"\n \"aaaaaa\"\n \"aaaaaa\"\n \"aa\"...>>" = + % ?line "<<\"aaaaaaaaaaaaaaaaaaaa\"...>>" = + % p(list_to_binary(L ++ [3]), 1, 10, 21), + ?line "<<97," ++ _ = p(list_to_binary(L ++ [3]), 1, 10, 22), + + ?line "\"\\b\\t\\n\\v\\f\\r\\e\250\"" = + p([8,9,10,11,12,13,27,168], 1, 40, -1), + % ?line "\"\\b\\t\\n\"\n \"\\v\\f\\r\"\n \"\\e\250\"" = + ?line "\"\\b\\t\\n\\v\\f\\r\\e¨\"" = + p([8,9,10,11,12,13,27,168], 1, 10, -1), + ?line "\"\\b\\t\\n\\v\\f\\r\\e\250\"" = + p([8,9,10,11,12,13,27,168], 1, 40, 100), + % ?line "\"\\e\\t\\nab\"\n \"cd\"" = + ?line "\"\\e\\t\\nabcd\"" = + p("\e\t\nabcd", 1, 12, -1), + + %% DEL (127) is special... + ?line "[127]" = p("\d", 1, 10, -1), + ?line "[127]" = p([127], 1, 10, 100), + + ?line "<<\"\\b\\t\\n\\v\\f\\r\\e\250\">>" = + p(<<8,9,10,11,12,13,27,168>>, 1, 40, -1), + ?line "<<\"\\b\\t\\n\\v\\f\\r\\e\250\">>" = + p(<<8,9,10,11,12,13,27,168>>, 1, 10, -1), + ?line "<<127>>" = p(<<127>>, 1, 10, 100), + + %% "Partial" string binaries: + ?line "<<\"he\"...>>" = p(list_to_binary("he"++[3]), 1, 80, 2), + ?line "<<\"he\"...>>" = p(list_to_binary("he"++[3]), 1, 80, 3), + ?line "<<104,101,3>>" = p(list_to_binary("he"++[3]), 1, 80, 4), + ?line "<<...>>" = p(list_to_binary([3] ++ "he"), 1, 80, 1), + ?line "<<3,...>>" = p(list_to_binary([3] ++ "he"), 1, 80, 2), + ?line "<<3,104,...>>" = p(list_to_binary([3] ++ "he"), 1, 80, 3), + + ?line "<<\"12345678901234567890\"...>>" = + p(list_to_binary("12345678901234567890"++[3]), 1, 80, 8), + ?line "<<\"12345678901234567890\"...>>" = + p(list_to_binary("12345678901234567890"++[3]), 1, 80, 21), + ?line "<<49," ++ _ = + p(list_to_binary("12345678901234567890"++[3]), 1, 80, 22), + + ?line "{sdfsdfj,\n 23" ++ _ = + p({sdfsdfj,23423423342.23432423}, 1, 17, -1), + + ?line bt(<<"kljkljlksdjjlf kljalkjlsdajafasjdfj [kjljklasdf,kjlljsfd,sdfsdkjfsd,kjjsdf,jl, + lkjjlajsfd|jsdf]">>, + fmt("~w ~w ~p", + [kljkljlksdjjlf, + kljalkjlsdajafasjdfj, + [kjljklasdf,kjlljsfd,sdfsdkjfsd,kjjsdf,jl,lkjjlajsfd | + jsdf]])), + + %% Binaries are split as well: + ?line bt(<<"<<80,100,0,55,55,55,55,55,55,55,55,55,\n " + "55,55,55,55,55,55,55,...>>">>, + p(<<80,100,0,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55, + 55,55,55,55,55,55,55,55,55,55,55,55>>,1,40,20)), + ?line bt(<<"<<80,100,0,55,55,55,55,55,55,55,55,55,\n " + "55,55,55,55,55,55,55,55,55,55,55,55,\n 55,55,55,55,55,55>>">>, + p(<<80,100,0,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55, + 55,55,55,55,55,55,55,55,55,55,55,55>>,1,40,-1)), + ?line "<<0,0,0,\n ...>>" = p(<<0,0,0,0,0>>, 1, 10, 4), + + %% ~W now uses ",..." when printing tuples + ?line "[a,b|...]" = fmt("~W", [[a,b,c,d,e], 3]), + ?line "{a,b,...}" = fmt("~W", [{a,b,c,d,e}, 3]), + ok. + +otp_6495(doc) -> + ["OTP-6495. io_lib_pretty bugfix."]; +otp_6495(suite) -> + []; +otp_6495(Config) when is_list(Config) -> + ?line bt(<<"[120,120,120,120,120,120,120,120,120,120,120,120,120,120," + "120,120,120,120,120]<<1>>">>, + fmt("~w~p", ["xxxxxxxxxxxxxxxxxxx", <<1>>])), + ok. + +otp_6517(doc) -> + ["OTP-6517. The Format argument of fwrite can be a binary."]; +otp_6517(suite) -> + []; +otp_6517(Config) when is_list(Config) -> + ?line "string" = fmt(<<"~s">>, [<<"string">>]), + ok. + +otp_6502(doc) -> + ["OTP-6502. Bits."]; +otp_6502(suite) -> + []; +otp_6502(Config) when is_list(Config) -> + ?line bt(<< + "[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]" + "<<0,0,8,\n" + " " + " 1:1>>">>, + fmt("~w~p", [lists:seq(0, 25), <<17:25>>])), + ok. + +otp_7421(doc) -> + ["OTP-7421. Soft limit of 60 chars removed when pretty printing."]; +otp_7421(suite) -> + []; +otp_7421(Config) when is_list(Config) -> + bt(<<"{aa,bb,\n" + " c,dd,\n" + " eee,\n" + " fff}">>, + rp({aa,bb,c,dd,eee,fff}, 1, 80, -1, 5, none)), + bt(<<"{aa,bb,\n" + " c,\n" + " dd,\n" + " eee,\n" + " fff}">>, + rp({aa,bb,c,dd,eee,fff}, 1, 80, -1, 4, none)), + ok. + +bt(Bin, R) -> + R = binary_to_list(Bin). + +p(Term, D) -> + rp(Term, 1, 80, D). + +p(Term, Col, Ll, D) -> + rp(Term, Col, Ll, D, no_fun). + +rp(Term, Col, Ll, D) -> + rp(Term, Col, Ll, D, fun rfd/2). + +-define(MAXCS, 60). + +rp(Term, Col, Ll, D, RF) -> + rp(Term, Col, Ll, D, ?MAXCS, RF). + +rp(Term, Col, Ll, D, M, RF) -> + %% io:format("~n~n*** Col = ~p Ll = ~p D = ~p~n~p~n-->~n", + %% [Col, Ll, D, Term]), + R = io_lib_pretty:print(Term, Col, Ll, D, M, RF), + %% io:format("~s~n<--~n", [R]), + lists:flatten(io_lib:format("~s", [R])). + +fmt(Fmt, Args) -> + lists:flatten(io_lib:format(Fmt, Args)). + +rfd(a, 0) -> + []; +rfd(b, 1) -> + [f]; +rfd(c, 2) -> + [f1, f2]; +rfd(e, 3) -> + [f, g, h]; +rfd(d, 5) -> + [aaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbb, + cccccccccccccccccccc, dddddddddddddddddddd, + eeeeeeeeeeeeeeeeeeee]; +rfd(rrrrr, 3) -> + [f1, f2, f3]; +rfd(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0) -> + []; +rfd(_, _) -> + no. + +manpage(doc) -> + ["The examples in io(3) and io_lib(3)."]; +manpage(suite) -> + []; +manpage(Config) when is_list(Config) -> + %% The examples that write or print only, not the ones that read... + + ?line bt(<<"Hello world!\n">>, + fmt("Hello world!~n", [])), + ?line bt(<<"| aaaaa|bbbbb |ccccc|\n">>, % bugfix + fmt("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c])), + ?line bt(<<"|**********|\n">>, + fmt("|~10w|~n", [{hey, hey, hey}])), + ?line bt(<<"|{hey,hey,h|\n">>, + fmt("|~10s|~n", [io_lib:write({hey, hey, hey})])), + + T = [{attributes,[[{id,age,1.50000},{mode,explicit}, + {typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]}, + {typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}], + ?line bt(<<"[{attributes,[[{id,age,1.5},{mode,explicit},{typename," + "[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit}," + "{typename,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}}," + "{mode,implicit}]\n">>, + fmt("~w~n", [T])), + ?line bt(<<"[{attributes,[[{id,age,1.5},\n" + " {mode,explicit},\n" + " {typename,\"INTEGER\"}],\n" + " [{id,cho},{mode,explicit},{typename,'Cho'}]]},\n" + " {typename,'Person'},\n" + " {tag,{'PRIVATE',3}},\n" + " {mode,implicit}]\n">>, + fmt("~62p~n", [T])), + ?line bt(<<"Here T = [{attributes,[[{id,age,1.5},\n" + " {mode,explicit},\n" + " {typename,\"INTEGER\"}],\n" + " [{id,cho},\n" + " {mode,explicit},\n" + " {typename,'Cho'}]]},\n" + " {typename,'Person'},\n" + " {tag,{'PRIVATE',3}},\n" + " {mode,implicit}]\n">>, + fmt("Here T = ~62p~n", [T])), + ?line bt(<<"[{attributes,[[{id,age,1.5},{mode,explicit}," + "{typename,...}],[{id,cho},{mode,...},{...}]]}," + "{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}]\n">>, + fmt("~W~n", [T,9])), + ?line bt(<<"[{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}]," + "\n " + "[{id,cho},{mode,...},{...}]]},\n {typename,'Person'},\n " + "{tag,{'PRIVATE',3}},\n {mode,implicit}]\n">>, + fmt("~62P~n", [T,9])), + + ?line "1F\n" = fmt("~.16B~n", [31]), + ?line "-10011\n" = fmt("~.2B~n", [-19]), + ?line "5Z\n" = fmt("~.36B~n", [5*36+35]), + ?line "10#31\n" = fmt("~X~n", [31,"10#"]), + ?line "-0x1F\n" = fmt("~.16X~n", [-31,"0x"]), + ?line "10#31\n" = fmt("~.10#~n", [31]), + ?line "-16#1F\n" = fmt("~.16#~n", [-31]), + ?line "abc def 'abc def' {foo,1} A \n" = + fmt("~s ~w ~i ~w ~c ~n", + ['abc def', 'abc def', {foo, 1},{foo, 1}, 65]), + % fmt("~s", [65]), + + %% io_lib(3) + ?line bt(<<"{1,[2],[3],[...],...}">>, + lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5))), + ok. + +otp_6708(doc) -> + ["OTP-6708. Fewer newlines when pretty-printing."]; +otp_6708(suite) -> + []; +otp_6708(Config) when is_list(Config) -> + ?line bt(<<"[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,\n" + " 23,24,25,26,27,28,29|...]">>, + p(lists:seq(1,1000), 30)), + ?line bt(<<"{lkjasklfjsdak,mlkasjdflksj,klasdjfklasd,jklasdfjkl,\n" + " jklsdjfklsd,masdfjkkl}">>, + p({lkjasklfjsdak,mlkasjdflksj,klasdjfklasd,jklasdfjkl, + jklsdjfklsd, masdfjkkl}, -1)), + ?line bt(<<"#b{f = {lkjljalksdf,jklaskfjd,kljasdlf,kljasdf,kljsdlkf,\n" + " kjdd}}">>, + p({b, {lkjljalksdf,jklaskfjd,kljasdlf,kljasdf,kljsdlkf,kjdd}}, + -1)), + ?line bt(<<"#b{f = {lkjljalksdf,jklaskfjd,kljasdlf,kljasdf,kljsdlkf,\n" + " kdd}}">>, + p({b, {lkjljalksdf,jklaskfjd,kljasdlf,kljasdf,kljsdlkf,kdd}}, + -1)), + ?line bt(<<"#e{f = undefined,g = undefined,\n" + " h = #e{f = 11,g = 22,h = 333}}">>, + p({e,undefined,undefined,{e,11,22,333}}, -1)), + ?line bt(<<"[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21|\n" + " apa11]">>, + p(lists:seq(1,21) ++ apa11, -1)), + ?line bt(<<"[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,\n" + " 23,\n" + " {{abadalkjlasdjflksdajfksdklfsdjlkfdlskjflsdj" + "flsdjfldsdsdddd}}]">>, + p(lists:seq(1,23) ++ + [{{abadalkjlasdjflksdajfksdklfsdjlkfdlskjflsdjflsdjfldsdsdddd}}], + -1)), + ?line bt(<<"{lkjasdf,\n" + " {kjkjsd,\n" + " {kjsd,\n" + " {kljsdf,\n" + " {kjlsd,{dkjsdf,{kjlds,{kljsd,{kljs," + "{kljlkjsd}}}}}}}}}}">>, + p({lkjasdf,{kjkjsd,{kjsd, + {kljsdf, + {kjlsd, + {dkjsdf,{kjlds, + {kljsd,{kljs,{kljlkjsd}}}}}}}}}}, + -1)), + ?line bt(<<"{lkjasdf,\n" + " {kjkjsd,\n" + " {kjsd,{kljsdf,{kjlsd,{dkjsdf,{kjlds," + "{kljsd,{kljs}}}}}}}}}">>, + p({lkjasdf,{kjkjsd,{kjsd, + {kljsdf,{kjlsd,{dkjsdf, + {kjlds,{kljsd,{kljs}}}}}}}}}, + -1)), + ?line bt(<<"<<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,\n" + " 22,23>>">>, + p(list_to_binary(lists:seq(1,23)), -1)), + ?line bt(<<"<<100,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,\n" + " 27>>">>, + p(list_to_binary([100|lists:seq(10,27)]), -1)), + ?line bt(<<"<<100,101,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,\n" + " 26>>">>, + p(list_to_binary([100,101|lists:seq(10,26)]), -1)), + ?line bt(<<"{{<<100,101,102,10,11,12,13,14,15,16,17,18,19,20,21,22,\n" + " 23>>}}">>, + p({{list_to_binary([100,101,102|lists:seq(10,23)])}}, -1)), + ?line bt(<<"[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22|\n" + " ap]">>, + p(lists:seq(1,22) ++ ap, -1)), + ?line bt(<<"[1,2,3,4,5,6,7,8,9,10,{},[],\n <<>>,11,12,13,14,15]">>, + p(lists:seq(1,10) ++ [{},[],<<>>] ++ lists:seq(11,15),1,30,-1)), + ?line bt(<<"[ddd,ddd,\n" + " {1},\n" + " [1,2],\n" + " ddd,kdfd,\n" + " [[1,2],a,b,c],\n" + " <<\"foo\">>,<<\"bar\">>,1,\n" + " {2}]">>, + p([ddd,ddd,{1},[1,2],ddd,kdfd,[[1,2],a,b,c],<<"foo">>,<<"bar">>, + 1,{2}],1,50,-1)), + + ?line bt(<<"{dskljsadfkjsdlkjflksdjflksdjfklsdjklfjsdklfjlsdjfkl,jksd,\n" + " " + "lkjsdf,kljsdf,kljsf,kljsdf,kljsdf,jkldf,jklsdf,kljsdf,\n" + " " + "kljsdf,jklsdf,lkjfd,lkjsdf,kljsdf,kljsdf,lkjsdf,kljsdf,\n" + " " + "lkjsdfsd,kljsdf,kjsfj}">>, + p({dskljsadfkjsdlkjflksdjflksdjfklsdjklfjsdklfjlsdjfkl,jksd, + lkjsdf,kljsdf,kljsf,kljsdf,kljsdf,jkldf,jklsdf,kljsdf, + kljsdf,jklsdf,lkjfd,lkjsdf,kljsdf,kljsdf,lkjsdf,kljsdf, + lkjsdfsd,kljsdf,kjsfj}, 1, 110, -1)), + ?line bt(<<"{dskljsadfkjsdlkjflksdjflksdjfklsdjklfjsdklfjlsdjfkl," + "#d{aaaaaaaaaaaaaaaaaaaa = 1,\n" + " " + "bbbbbbbbbbbbbbbbbbbb = 2,cccccccccccccccccccc = 3,\n" + " " + "dddddddddddddddddddd = 4,eeeeeeeeeeeeeeeeeeee = 5}}">>, + rp({dskljsadfkjsdlkjflksdjflksdjfklsdjklfjsdklfjlsdjfkl, + {d,1,2,3,4,5}},1,200,-1)), + ok. + +-define(ONE(N), ((1 bsl N) - 1)). +-define(ALL_ONES, ((1 bsl 52) - 1)). + +otp_7084(doc) -> + ["OTP-7084. Printing floating point numbers nicely."]; +otp_7084(suite) -> + []; +otp_7084(Config) when is_list(Config) -> + OldDog=?config(watchdog, Config), + test_server:timetrap_cancel(OldDog), + Timeout = 180, + ?line Dog = test_server:timetrap({seconds,Timeout}), + L = [{g_warm_up, fun g_warm_up/0}, + {g_big_pos_float, fun g_big_pos_float/0}, + {g_small_neg_float, fun g_small_neg_float/0}, + {g_close_to_zero, fun g_close_to_zero/0}, + {g_denormalized, fun g_denormalized/0}, + {g_normalized, fun g_normalized/0}, + {g_choice, fun g_choice/0}, + {g_misc, fun g_misc/0}], + F = fun({M,T}) -> io:format("~p~n", [M]), T() end, + R = try + lists:foreach(fun(T) -> F(T) end, L), + ok + catch throw:Reason -> + Reason + end, + ?line test_server:timetrap_cancel(Dog), + R. + +g_warm_up() -> + g_t(0.5), + g_t(-0.5), + g_t((1 bsl 55) * 0.5), + g_t(-(1 bsl 55) * 0.5), + g_t(1.6799127650033296e+308), + g_t(pack(1, 0, 2#1010101010001100101000010111100101000000101100110001)), + g_t(pack(1, 0, 2#0001010000001001110100000101010101001110010001010110)), + g_t(234324324.23432432432432), + ok. + +g_big_pos_float() -> + %% The greatest positive float: + ft({{0,2046,?ONE(52)}, 100, 0}), + ok. + +g_small_neg_float() -> + %% The least negative float: + ft({{1,2046,?ONE(52)}, 0, 100}), + ok. + +g_close_to_zero() -> + %% A few denormalized floats close to zero: + ft({{0,0,0}, 100, 100}), + g_t(pack(1, 0, 0)), % -0.0 + ok. + +g_denormalized() -> + %% Denormalized floats (mantissa carry): +% D = 5, + %% Faster: + D = 1, + [ft({{S,0,?ONE(N)},D,D}) || S <- [0,1], N <- lists:seq(0, 52)], + ok. + +g_normalized() -> + %% Normalized floats (exponent carry): +% D = 5, + %% Faster: + D = 1, + [ft({{S,E,?ONE(52)},D,D}) || S <- [0,1], E <- lists:seq(0, 2045)], + ok. + +g_choice() -> + %% Exponent should be used when and only when the string is shorter. + %% (g_misc/0 checks this too, and probably more throughly). + L = [0.0003, 3.0e-5, 3.3e-5, 3.3e-4, + 314.0, 314.1, 310.0, 3.1e6, -100.0, + 3.34e4, 3.0e3, 3.34333e9, 3.3433323e10, 33433323700.0, + 0.00197963, 1.97963e-4], + lists:foreach(fun(V) -> g_t(V) end, L), + ok. + +g_misc() -> + L_0_308 = lists:seq(0, 308), + L_0_307 = lists:seq(0, 307), +% L_1_9 = lists:seq(1, 9), +% L_0_9 = lists:seq(0, 9), + %% Faster: + L_1_9 = [1,5,9], + L_0_9 = [0,1,5,9], + + %% 1.0,10.0, ... 2.0,20.0, ... 9.0,90.0, ... -1,-10, ... -2.0,-20.0... + [g_t(S*T*pow10(N)) || S <- [1.0, -1.0], T <- L_1_9, N <- L_0_307], + + %% 1.0,1.0/10,1.0/100,... 2.0,2.0/10,2.0/100, ... 9.0,9.0/10,9.0/100, + %% -1.0,-1.0/10,... -9.0,-9.0/10... + [g_t(S*T/pow10(N)) || S <- [1.0, -1.0], T <- L_1_9, N <- L_0_308], + + %% 0.0,1.0,2.0,...,9.0, 0.0,10.0,20.0,...,90.0,... + %% 0.0,-1.0,-2.0,...,-9.0, 0.0,-10.0,-20.0,...,-90.0,... + [g_t(S*list_to_float([D+$0]++lists:duplicate(N, $0)++".0")) || + S <- [1.0,-1.0], N <- lists:seq(0, 300), D <- L_0_9], + + %% 0.0,0.1,0.2,...0,9, 0.0,0.01,0.02,...,0.09, + %% 0.0,-0.1,-0.2,...-0,9, 0.0,-0.01,-0.02,...,-0.09, + [g_t(S*list_to_float("0."++lists:duplicate(N, $0)++[D+$0])) || + S <- [1.0,-1.0], N <- lists:seq(0, 300), D <- L_0_9], + ok. + +ft({{S,E,M}, L, G}) -> + ft({pack(S, E, M), L, G}); +ft({V, Less, Greater}) when is_float(V) -> + _ = g_t(V), + ft(V, fun inc/1, Greater), + ft(V, fun dec/1, Less). + +ft(V0, F, I) when I > 0, is_float(V0) -> + V = F(V0), + _ = g_t(V), + ft(V, F, I - 1); +ft(V, _F, 0) when is_float(V) -> + ok. + +g_t(V) when is_float(V) -> + %% io:format("Testing ~.17g~n", [V]), + Io = io_lib:format("~p", [V]), + Sv = binary_to_list(iolist_to_binary(Io)), + ok = g_t(V, Sv), + Sv. + +%% -> ok | THROW + +%% Checks that Sv is the shortest, correctly rounded string that +%% converts to V when read back with list_to_float/1. +%% Note: in a few cases the least significant digit has been +%% incremented by one, namely when the correctly rounded string +%% converts to another floating point number. +g_t(0.0, "0.0") -> + ok; +g_t(V, Sv) -> + try + g_t_1(V, Sv) + catch throw:Reason -> + throw({Reason, V, Sv}) + end. + +g_t_1(V, Sv) -> + %% Check that the least significant digit is correct. + %% If Sv is "3.14" then Sv- is "3.13" and Sv+ is "3.15". + %% Check that |V - Sv| =< (V - Sv-) and + %% that |V - Sv| =< (Sv+ - V) + Times = least_significant_digit(Sv), + case Times of + 0 -> throw(least_significant_digit_is_zero); + _ -> ok + end, + S = if V < 0 -> -1; true -> 1 end, + SvMinus = incr_lsd(Sv, -S), + SvPlus = incr_lsd(Sv, S), + Svr = s2r(Sv), + Svminusr = s2r(SvMinus), + Svplusr = s2r(SvPlus), + Vr = f2r(V), + + Abs_Sv_Vr = rat_abs(rat_minus(Svr, Vr)), + Svminus_Vr = rat_minus(Vr, Svminusr), + Svplus_Vr = rat_minus(Svplusr, Vr), + %% The are 45 (negative) floats where SvMinus (SvPlus) is closer + %% to V than Sv, but such that when reading SvMinus (SvPlus) wrong + %% float would be returned. + case rat_lte(Abs_Sv_Vr, Svminus_Vr) of + true -> + ok; + false -> + case list_to_float(SvMinus) of + V -> throw(vsminus_too_close_to_v); + _Vminus -> ok + end + end, + case rat_lte(Abs_Sv_Vr, Svplus_Vr) of + true -> + ok; + false -> + case list_to_float(SvPlus) of + V -> throw(vsplus_too_close_to_v); + _Vplus -> ok + end + end, + + %% Check that Sv is closer to V than to V- and V+. + %% Check that |V - Sv| =< (V - V-) and + %% that |V - Sv| =< (V+ - V) + %% (An alternative is V- + V =< 2*Sv =< V + V+.) + case inc(V) of + inf -> + ok; + Vplus -> + Vplusr = f2r(Vplus), + V_Vplusr = rat_minus(Vplusr, Vr), + case rat_lte(Abs_Sv_Vr, V_Vplusr) of + true -> ok; + false -> throw(vplus_too_close_to_sv) + end + end, + case dec(V) of + '-inf' -> + ok; + Vminus -> + Vminusr = f2r(Vminus), + V_Vminusr = rat_minus(Vr, Vminusr), + case rat_lte(Abs_Sv_Vr, V_Vminusr) of + true -> ok; + false -> throw(vminus_too_close_to_sv) + end + end, + + %% Check that no prefix of Sv yields V. + %% If Sv is "3.14" then Svlow is "3.1" and Svhigh is "3.2". + %% + %% This is just one way of getting Svlow and Svhigh: + if + V < 0 -> + SvHigh = step_lsd(Sv, -Times), + SvLow = step_lsd(Sv, 10 - Times); + true -> + SvHigh = step_lsd(Sv, 10 - Times), + SvLow = step_lsd(Sv, -Times) + end, + + case catch list_to_float(SvLow) of + V -> throw(low_is_v); + _ -> ok + end, + + case catch list_to_float(SvHigh) of + V -> throw(high_is_v); + _ -> ok + end, + + %% Check that Sv has enough digits. + case list_to_float(Sv) of + V -> ok; + _ -> throw(wrong_float) % cannot happen + end, + + g_choice(Sv), + + ok. + +%%% In "123450000.0", '5' is the lsd; +%%% in "1234.0000", (the last) '0' is the lsd; +%%% in "1234.0", '4' is the lsd (the Erlang syntax requires the final zero). + +%% Trailing zeroes are not significant ("3.0", "5.0e-324", "232000.0"). +least_significant_digit("-"++Ds) -> + least_significant_digit(Ds); +least_significant_digit("+"++Ds) -> + least_significant_digit(Ds); +least_significant_digit(Ds) -> + [MS|_E] = string:tokens(Ds, "eE"), + lsd0(lists:reverse(MS))-$0. + +lsd0("0."++Ds) -> + lsd1(Ds); +lsd0([D | _Ds]) -> + D. + +lsd1("0"++Ds) -> + lsd1(Ds); +lsd1([D | _Ds]) -> + D. + +step_lsd(Ds, 0) -> + Ds; +step_lsd(Ds, N) when N > 0 -> + NDs = incr_lsd(Ds, 1), + step_lsd(NDs, N - 1); +step_lsd(Ds, N) when N < 0 -> + NDs = incr_lsd(Ds, -1), + step_lsd(NDs, N + 1). + +%% Assumes Ds represents some other number than zero. +%% Increments or decrements the least significant digit. +incr_lsd("-"++Ds, I) -> + "-"++incr_lsd(Ds, I); +incr_lsd(Ds, I) when I =:= 1; I =:= -1 -> + [MS|E] = string:tokens(Ds, "eE"), + X = ["e" || true <- [E =/= []]], + lists:flatten([incr_lsd0(lists:reverse(MS), I, []), X, E]). + +incr_lsd0("0."++Ds, C, L) -> + incr_lsd1(Ds, C, [$., $0 | L]); +incr_lsd0(Ds, C, L) -> + incr_lsd2(Ds, C, L). + +incr_lsd1("0"++Ds, C, L) -> + incr_lsd1(Ds, C, [$0 | L]); +incr_lsd1(Ds, C, L) -> + incr_lsd2(Ds, C, L). + +incr_lsd2([], C, L) -> + [C + $0 | L]; +incr_lsd2("."++Ds, C, L) -> + incr_lsd2(Ds, C, [$. | L]); +incr_lsd2("9"++Ds, 1=C, L) -> + incr_lsd2(Ds, C, [$0 | L]); +incr_lsd2("0"++Ds, -1=C, L) -> + incr_lsd2(Ds, C, [$9 | L]); +incr_lsd2([D | Ds], C, L) -> + lists:reverse(Ds, [D + C | L]). + +s2r(S) when is_list(S) -> + case string:tokens(S, "eE") of + [MS] -> + s10(MS); + [MS, ES] -> + Mr = s10(MS), + E = list_to_integer(ES), + if + E < 0 -> + rat_multiply(Mr, {1,pow10(-E)}); + true -> + rat_multiply(Mr, {pow10(E), 1}) + end + end. + +s10("-"++S) -> + rat_multiply({-1,1},s10(S)); +s10(S) -> + [AS, BS] = string:tokens(S, "."), + Sc = length(BS), + A = list_to_integer(AS), + B = list_to_integer(BS), + F = pow10(Sc), + rat_multiply({1,1}, {A*F + B, F}). + +pow10(X) -> + int_pow(10, X). + +int_pow(X, 0) when is_integer(X) -> + 1; +int_pow(X, N) when is_integer(X), is_integer(N), N > 0 -> + int_pow(X, N, 1). + +int_pow(X, N, R) when N < 2 -> + R * X; +int_pow(X, N, R) -> + int_pow(X * X, N bsr 1, case N band 1 of 1 -> R * X; 0 -> R end). + +dec(F) when is_float(F) -> + <> = <>, + dec({S,BE,M}); +dec({1,2046,?ALL_ONES}) -> + '-inf'; +dec({S,BE,M}) when 0 =< S, S =< 1, + 0 =< BE, BE =< 2046, + 0 =< M, M =< ?ALL_ONES -> + {S1,BE1,M1} = dec1(S, BE, M), + <> = <>, + <> = <>, + true = F1 < F, + F1. + + +dec1(0, 0, 0) -> + dec1(1, 0, 0); +dec1(0, BE, 0) -> + {0,BE-1,?ALL_ONES}; +dec1(0, BE, M) -> + {0,BE,M-1}; +dec1(1, BE, ?ALL_ONES) -> + {1,BE+1,0}; +dec1(1, BE, M) -> + {1,BE,M+1}. + +inc(F) when is_float(F) -> + <> = <>, + inc({S,BE,M}); +inc({0,2046,?ALL_ONES}) -> + inf; +inc({S,BE,M}) when 0 =< S, S =< 1, + 0 =< BE, BE =< 2046, + 0 =< M, M =< ?ALL_ONES -> + {S1,BE1,M1} = inc1(S, BE, M), + <> = <>, + <> = <>, + true = F1 > F, + F1. + +inc1(0, BE, ?ALL_ONES) -> + {0,BE+1,0}; +inc1(0, BE, M) -> + {0,BE,M+1}; +inc1(1, 0, 0) -> + inc1(0, 0, 0); +inc1(1, BE, 0) -> + {1,BE-1,?ALL_ONES}; +inc1(1, BE, M) -> + {1,BE,M-1}. + +f2r(F) when is_float(F) -> + <> = <>, + f2r({S,BE,M}); +f2r({S,BE,M}) when 0 =< S, S =< 1, + 0 =< BE, BE =< 2046, + 0 =< M, M =< ?ALL_ONES -> + Vr = {T,N} = f2r1(S, BE, M), + <> = <>, + case catch T/N of + {'EXIT', _} -> ok; + TN -> true = F =:= TN + end, + Vr. + +f2r1(S, 0, M) -> + rat_multiply({sign(S),1}, {M, 1 bsl 1074}); +f2r1(S, BE, M) when BE - 1075 >= 0 -> + rat_multiply({sign(S),1}, {((1 bsl 52)+M) * (1 bsl (BE-1075)),1}); +f2r1(S, BE, M) -> + rat_multiply({sign(S),1}, {(1 bsl 52)+M, 1 bsl (1075-BE)}). + +sign(0) -> + 1; +sign(1) -> + -1. + +%%% Rational numbers (very scetchy). + +rat_abs({A,B}) when A < 0 -> + {-A,B}; +rat_abs({A,B}) -> + {A,B}. + +-ifdef(not_used). +rat_equal(R1, R2) -> + R1 =:= R2. + +rat_negate({A,B}) -> + {-A,B}. + +rat_divide({A,B},{C,D}) -> + rat_multiply({A,B},{D,C}). +-endif. + +rat_lte({A,B}, {C,D}) when B =/= 0, D =/= 0 -> + A*D =< C*B. + +rat_minus({A,B}, {C,D}) -> + rat_plus({A,B}, {-C,D}). + +rat_plus({A,B}, {C,D}) when B =/= 0, D =/= 0 -> + rat_normalize({A*D+B*C, B*D}). + +rat_multiply({A,B}, {C,D}) when B =/= 0, D =/= 0 -> + rat_normalize({A * C, B * D}). + +rat_normalize({T,N}) when N =/= 0 -> + G = gcd(T, N), + T2 = T div G, + N2 = N div G, + if + T2 < 0 -> + if + N2 < 0 -> {-T2,-N2}; + true -> {T2,N2} + end; + true -> + if + N2 < 0 -> {-T2,-N2}; + true -> {T2,N2} + end + end. + +gcd(A, 0) -> A; +gcd(A, B) -> gcd(B, A rem B). + +%%% End of rational numbers. + +%% Check that there is an exponent if and only if characters are +%% saved. Note: this assumes floating point numbers "Erlang style" +%% (with a single zero before and after the dot, and no extra leading +%% zero in the exponent). +g_choice(S) when is_list(S) -> + [MS | ES0] = string:tokens(S, "eE"), + [IS, FS] = string:tokens(MS, "."), + Il = length(IS), + Fl = length(FS), + Pre = z(MS), + Post = z(lists:reverse(MS)), + ES = lists:append(ES0), + El = length(ES), + I = list_to_integer(IS), + if + El =/= 0, ((I > 9) or (I < -9)) -> + throw(too_many_digits_before_the_dot); + El =/= 0, I =:= 0 -> + throw(zero_before_the_dot); + Pre =:= 0, Post > 0, El =:= 0 -> % DDDD0000.0 + Saving = if + I < 0, Il =:= Post + 2 -> + Post; + I > 0, Il =:= Post + 1 -> + Post; + I =/= 0, true -> + Post + 1 + end, + Cost = 1 + length(integer_to_list(Il - 1)), + if + Cost < Saving -> + throw(with_exponent_is_shorter); + true -> + ok + end; + Pre > 0, Post =:= 0, El =:= 0 -> % 0.000DDDD + Saving = if + Fl =:= Pre + 1 -> + Pre; + true -> + Pre + 1 + end, + Cost = 2 + length(integer_to_list(Pre + 1)), + if + Cost < Saving -> + throw(with_exponent_is_shorter); + true -> + ok + end; + Pre =:= 0, Post =:= 0, El > 0 -> % D.DDDeDD + E = list_to_integer(ES), + if + E >= 0 -> + Cost = E - (Fl - 1); + E < 0 -> + Cost = -E + end, + Saving = length(ES) + 1, + if + Cost =:= Saving -> + throw(draw_but_choose_form_without_exponent); + Cost < Saving -> + throw(without_exponent_is_shorter); + true -> + ok + end; + Pre =:= 0, Post =:= 0, El =:= 0 -> % DDD.DDD + ok; + true -> + throw(badly_formed_floating_point_string) + end. + +z("0."++Ds) -> + length(lists:takewhile(fun(D) -> D =:= $0 end, Ds)); +z(_Ds) -> + 0. + +pack(Sign, Exp, Frac) -> + <> = <>, + Float. + +%% Whitebox test of io_lib:collect_line/3. +io_lib_collect_line_3_wb(Config) when is_list(Config) -> + ?line do_collect_line(binary, "\n"), + ?line do_collect_line(binary, "\r\n"), + ?line do_collect_line(list, "\n"), + ?line do_collect_line(list, "\r\n"), + ok. + +do_collect_line(Mode, Eol) -> + First = "abcde", + FirstNL = First++"\n", + Second = "unterminated line", + Data0 = First ++ Eol ++ Second, + {Data1,Result0} = do_collect_line_combine(Mode, Data0, FirstNL, Second), + do_collect_line_1(Mode, Data1, Result0, []), + + {Data,Result} = do_collect_line_combine(Mode, "unterm", "unterm", eof), + do_collect_line_1(Mode, Data, Result, []). + +do_collect_line_combine(binary, Data0, FirstNL, eof) -> + {list_to_binary(Data0), + {stop,list_to_binary(FirstNL),eof}}; +do_collect_line_combine(binary, Data0, FirstNL, Second) -> + {list_to_binary(Data0), + {stop,list_to_binary(FirstNL),list_to_binary(Second)}}; +do_collect_line_combine(list, Data0, FirstNL, Second) -> + {Data0,{stop,FirstNL,Second}}. + +do_collect_line_1(Mode, [H|T], Result, Acc0) -> + Acc = [H|Acc0], + Result = do_collect_line_2(lists:reverse(Acc), T), + do_collect_line_1(Mode, T, Result, Acc); +do_collect_line_1(Mode, <>, Result, Acc0) -> + Acc = [H|Acc0], + Result = do_collect_line_2(list_to_binary(lists:reverse(Acc)), T), + do_collect_line_1(Mode, T, Result, Acc); +do_collect_line_1(_Mode, [], _Result, _Acc) -> + ok; +do_collect_line_1(_Mode, <<>>, _Result, _Acc) -> + ok. + +do_collect_line_2(Part1, Part2) -> + Dummy = make_ref(), + do_collect_line_3(start, [Part1,Part2,eof], Dummy). + +do_collect_line_3(State0, [H|T], Dummy) -> + case io_lib:collect_line(State0, H, Dummy) of + {stop,Line,Rest} -> + {stop,Line,do_collect_line_adjust_rest(Rest, T)}; + State -> + do_collect_line_3(State, T, Dummy) + end. + +do_collect_line_adjust_rest(eof, []) -> eof; +do_collect_line_adjust_rest(eof, <<>>) -> eof; +do_collect_line_adjust_rest(Rest, [eof]) -> Rest; +do_collect_line_adjust_rest(Rest, [Bin|T]) when is_binary(Bin) -> + do_collect_line_adjust_rest(<>, T); +do_collect_line_adjust_rest(Rest, [List|T]) when is_list(List) -> + do_collect_line_adjust_rest(Rest++List, T). + + + +cr_whitespace_in_string(Config) when is_list(Config) -> + ?line {ok,["abc"],[]} = io_lib:fread("~s", "\rabc"). + + + +io_fread_newlines(Config) when is_list(Config) -> + ?line PrivDir = ?privdir(Config), + ?line Fname = filename:join(PrivDir, "io_fread_newlines.txt"), + ?line F0 = [[0,1,2,3,4,5,6,7,8,9]], + ?line F1 = [[0,1,2,3,4,5,6,7,8],[9]], + ?line F2 = [[0,1,2,3,4,5,6,7],[8,9]], + ?line F3 = [[0,1,2,3,4,5,6],[7,8,9]], + ?line F4 = [[0,1,2,3,4,5],[6,7,8,9]], + ?line F5 = [[0,1,2,3,4],[5,6,7,8,9]], + ?line F6 = [[0,1,2,3],[4,5,6,7],[8,9]], + ?line F7 = [[0,1,2],[3,4,5],[6,7,8],[9]], + ?line F8 = [[0,1],[2,3],[4,5],[6,7],[8,9]], + ?line F9 = [[0],[1],[2],[3],[4],[5],[6],[7],[8],[9]], + ?line Newlines = ["\n", "\r\n", "\r"], + try + ?line io_fread_newlines_1([F0,F1,F2,F3,F4,F5,F6,F7,F8,F9], + Fname, Newlines) + after + file:delete(Fname) + end. + +io_fread_newlines_1(Fs, Fname, [Newline|Newlines]) -> + ?line ok = io_fread_newlines_2(Fs, Fname, Newline), + ?line io_fread_newlines_1(Fs, Fname, Newlines); +io_fread_newlines_1(_, _, []) -> ok. + +io_fread_newlines_2([F|Fs], Fname, Newline) -> + ?line N1 = write_newlines_file(Fname, F, Newline), + ?line {F2,N2} = read_newlines_file(Fname), + ?line io:format("~w ~p ~w~n~n", [N1,F,N2]), + ?line F2 = lists:flatten(F), + %% Intermediate newlines are not counted + ?line N2 = N1 - (length(F) - 1)*length(Newline), + ?line io_fread_newlines_2(Fs, Fname, Newline); +io_fread_newlines_2([], _, _) -> ok. + + +write_newlines_file(Fname, F, Newline) -> + Bytes = list_to_binary(digit_lines(F, Newline)), + io:format("Data: ~w~n~w~n", [Newline,Bytes]), + ok = file:write_file(Fname, Bytes), + size(Bytes). + +digit_lines([L], _) -> + digit_line(L); +digit_lines([L|Ls], Newline) -> + [digit_line(L),Newline|digit_lines(Ls, Newline)]. + +digit_line([D]) -> + integer_to_list(D); +digit_line([D|Ds]) -> + [integer_to_list(D), " ", digit_line(Ds)]. + +read_newlines_file(Fname) -> + {ok,Fd} = file:open(Fname, [read]), + try {L, N0} = R0 = read_newlines(Fd, [], 0), + case io:fread(Fd, "", "~*s~l") of + eof -> R0; + {ok,[N]} -> {L,N0+N} + end + after + file:close(Fd) + end. + + +read_newlines(Fd, Acc, N0) -> + case io:fread(Fd, "", "~d~l") of + {ok,[D,N]} -> + read_newlines(Fd, [D|Acc], N0+N); + eof -> + {lists:reverse(Acc),N0} + end. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/lists_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/lists_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/lists_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/lists_SUITE.erl 2009-03-12 12:19:17.000000000 +0000 @@ -0,0 +1,2657 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%%---------------------------------------------------------------- +%%% Purpose: Test suite for the 'lists' module. +%%%----------------------------------------------------------------- + +-module(lists_SUITE). +-include("test_server.hrl"). + + +% Default timetrap timeout (set in init_per_testcase). +% This should be set relatively high (10-15 times the expected +% max testcasetime). +-define(default_timeout, ?t:minutes(4)). + +% Test server specific exports +-export([all/1]). +-export([init_per_testcase/2, fin_per_testcase/2]). + +% Test cases must be exported. +-export([member/1, reverse/1, + keymember/1, keysearch_keyfind/1, + keystore/1, keytake/1, + append/1, append_1/1, append_2/1, + seq/1, seq_loop/1, seq_2/1, seq_3/1, seq_2_e/1, seq_3_e/1, + sublist/1, flatten/1, + sublist_2/1, sublist_3/1, sublist_2_e/1, sublist_3_e/1, + flatten_1/1, flatten_2/1, flatten_1_e/1, flatten_2_e/1, + dropwhile/1, + sort/1, sort_1/1, sort_stable/1, merge/1, rmerge/1, sort_rand/1, + usort/1, usort_1/1, usort_stable/1, umerge/1, rumerge/1,usort_rand/1, + keymerge/1, rkeymerge/1, + keysort/1, keysort_1/1, keysort_i/1, keysort_stable/1, + keysort_rand/1, keysort_error/1, + ukeymerge/1, rukeymerge/1, + ukeysort/1, ukeysort_1/1, ukeysort_i/1, ukeysort_stable/1, + ukeysort_rand/1, ukeysort_error/1, + funmerge/1, rfunmerge/1, + funsort/1, funsort_1/1, funsort_stable/1, funsort_rand/1, + funsort_error/1, + ufunmerge/1, rufunmerge/1, + ufunsort/1, ufunsort_1/1, ufunsort_stable/1, ufunsort_rand/1, + ufunsort_error/1, + zip_unzip/1, zip_unzip3/1, zipwith/1, zipwith3/1, + filter_partition/1, + tickets/1, otp_5939/1, otp_6023/1, otp_6606/1, otp_7230/1, + suffix/1, subtract/1]). + +%% Sort randomized lists until stopped. +%% +%% If you update some of the sort or merge functions, you should +%% definitely let sort_loop work for a couple of hours or days. Try +%% both sort_loop/0 and sort_loop/1 with a small argument (30-50 say). + +-export([sort_loop/0, sort_loop/1, sloop/1]). + +%% Internal export. +-export([make_fun/1]). + +%% +%% all/1 +%% +all(doc) -> + []; +all(suite) -> + [append, reverse, member, keymember, keysearch_keyfind, keystore, keytake, + dropwhile, + sort, usort, keysort, ukeysort, + funsort, ufunsort, sublist, flatten, seq, + zip_unzip, zip_unzip3, zipwith, zipwith3, + filter_partition, tickets, suffix, subtract]. + +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +% +% Test cases starts here. +% +append(doc) -> + ["Tests lists:append/1 & lists:append/2"]; +append(suite) -> + [append_1, append_2]. + +append_1(doc) -> []; +append_1(suite) -> []; +append_1(Config) when is_list(Config) -> + ?line "abcdef"=lists:append(["abc","def"]), + ?line [hej, du,[glade, [bagare]]]= + lists:append([[hej], [du], [[glade, [bagare]]]]), + ?line [10, [elem]]=lists:append([[10], [[elem]]]), + ok. + +append_2(doc) -> []; +append_2(suite) -> []; +append_2(Config) when is_list(Config) -> + ?line "abcdef"=lists:append("abc", "def"), + ?line [hej, du]=lists:append([hej], [du]), + ?line [10, [elem]]=lists:append([10], [[elem]]), + ok. + +reverse(suite) -> + []; +reverse(doc) -> + ["Tests the lists:reverse() implementation. The function is " + "`non-blocking', and only processes a fixed number of elements " + "at a time."]; +reverse(Config) when is_list(Config) -> + ?line reverse_test(0), + ?line reverse_test(1), + ?line reverse_test(2), + ?line reverse_test(128), + ?line reverse_test(256), + ?line reverse_test(1000), + ?line reverse_test(1998), + ?line reverse_test(1999), + ?line reverse_test(2000), + ?line reverse_test(2001), + ?line reverse_test(3998), + ?line reverse_test(3999), + ?line reverse_test(4000), + ?line reverse_test(4001), + ?line reverse_test(60001), + ?line reverse_test(100007), + ok. + +reverse_test(0) -> + case lists:reverse([]) of + [] -> + ok; + _Other -> + error + end; +reverse_test(Num) -> + List0 = ['The Element'|lists:duplicate(Num, 'Ele')], + List = lists:reverse(List0), + ['Ele'|_] = List, + 'The Element' = lists:last(List), + List0 = lists:reverse(List), + ok. + +member(doc) -> + ["Tests the lists:member() implementation." + "This test case depends on lists:reverse() to work, " + "wich is tested in a separate test case."]; +member(Config) when is_list(Config) -> + ?line {'EXIT',{badarg,_}} = (catch lists:member(45, {a,b,c})), + ?line {'EXIT',{badarg,_}} = (catch lists:member(45, [0|non_list_tail])), + ?line false = lists:member(4233, []), + ?line member_test(1), + ?line member_test(100), + ?line member_test(256), + ?line member_test(1000), + ?line member_test(1998), + ?line member_test(1999), + ?line member_test(2000), + ?line member_test(2001), + ?line member_test(3998), + ?line member_test(3999), + ?line member_test(4000), + ?line member_test(4001), + ?line member_test(100008), + ok. + +member_test(Num) -> + List0 = ['The Element'|lists:duplicate(Num, 'Elem')], + true = lists:member('The Element', List0), + true = lists:member('Elem', List0), + false = lists:member(arne_anka, List0), + false = lists:member({a,b,c}, List0), + List = lists:reverse(List0), + true = lists:member('The Element', List), + true = lists:member('Elem', List), + false = lists:member(arne_anka, List), + false = lists:member({a,b,c}, List). + +keymember(Config) when is_list(Config) -> + ?line false = lists:keymember(anything_goes, 1, []), + ?line {'EXIT',{badarg,_}} = (catch lists:keymember(anything_goes, -1, [])), + ?line {'EXIT',{badarg,_}} = (catch lists:keymember(anything_goes, 0, [])), + ?line {'EXIT',{badarg,_}} = (catch lists:keymember(anything_goes, 1, {1,2,3})), + List = [{52.0,a},{-19,b,c},{37.5,d},an_atom,42.0,{39},{45,{x,y,z}}], + + ?line false = lists:keymember(333, 5, List), + ?line false = lists:keymember(333, 999, List), + ?line false = lists:keymember(37, 1, List), + + ?line true = lists:keymember(52.0, 1, List), + ?line true = lists:keymember(52, 1, List), + ?line true = lists:keymember(-19, 1, List), + ?line true = lists:keymember(-19.0, 1, List), + ?line true = lists:keymember(37.5, 1, List), + ?line true = lists:keymember(39, 1, List), + ?line true = lists:keymember(39.0, 1, List), + ?line true = lists:keymember(45, 1, List), + ?line true = lists:keymember(45.0, 1, List), + + ?line true = lists:keymember(a, 2, List), + ?line true = lists:keymember(b, 2, List), + ?line true = lists:keymember(c, 3, List), + ?line true = lists:keymember(d, 2, List), + ?line true = lists:keymember({x,y,z}, 2, List), + + ?line Long0 = lists:seq(1, 100007), + ?line false = lists:keymember(kalle, 1, Long0), + ?line Long = lists:foldl(fun(E, A) -> [{1/E,E}|A] end, [], Long0), + ?line true = lists:keymember(1, 2, Long), + ?line true = lists:keymember(2, 2, Long), + ?line true = lists:keymember(1.0, 2, Long), + ?line true = lists:keymember(2.0, 2, Long), + ?line true = lists:keymember(100006, 2, Long), + ok. + +keysearch_keyfind(Config) when is_list(Config) -> + ?line false = key_search_find(anything_goes, 1, []), + ?line {'EXIT',{badarg,_}} = (catch key_search_find(anything_goes, -1, [])), + ?line {'EXIT',{badarg,_}} = (catch key_search_find(anything_goes, 0, [])), + ?line {'EXIT',{badarg,_}} = (catch key_search_find(anything_goes, 1, {1,2,3})), + + First = {x,42.0}, + Second = {y,-77}, + Third = {z,[a,b,c],{5.0}}, + List = [First,Second,Third], + + ?line false = key_search_find(333, 1, []), + ?line false = key_search_find(333, 5, List), + ?line false = key_search_find(333, 999, List), + ?line false = key_search_find(37, 1, List), + + ?line {value,First} = key_search_find(42, 2, List), + ?line {value,First} = key_search_find(42.0, 2, List), + + ?line {value,Second} = key_search_find(-77, 2, List), + ?line {value,Second} = key_search_find(-77.0, 2, List), + + ?line {value,Third} = key_search_find(z, 1, List), + ?line {value,Third} = key_search_find([a,b,c], 2, List), + ?line {value,Third} = key_search_find({5}, 3, List), + ?line {value,Third} = key_search_find({5.0}, 3, List), + + ?line Long0 = lists:seq(1, 100007), + ?line false = key_search_find(kalle, 1, Long0), + ?line Long = lists:foldl(fun(E, A) -> [{1/E,float(E)}|A] end, [], Long0), + ?line {value,{_,1.0}} = key_search_find(1, 2, Long), + ?line {value,{_,1.0}} = key_search_find(1.0, 2, Long), + ?line {value,{_,2.0}} = key_search_find(2, 2, Long), + ?line {value,{_,2.0}} = key_search_find(2.0, 2, Long), + ?line {value,{_,33988.0}} = key_search_find(33988, 2, Long), + ?line {value,{_,33988.0}} = key_search_find(33988.0, 2, Long), + ok. + +%% Test both lists:keysearch/3 and lists:keyfind/3. The only +%% difference between these two functions is that lists:keysearch/3 +%% wraps a successfully returned tuple in a value tuple. +%% +key_search_find(Key, Pos, List) -> + case lists:keyfind(Key, Pos, List) of + false -> + false = lists:keysearch(Key, Pos, List); + Tuple when is_tuple(Tuple) -> + {value,Tuple} = lists:keysearch(Key, Pos, List) + end. + +dropwhile(Config) when is_list(Config) -> + ?line F = fun(C) -> C =:= $@ end, + + ?line [] = lists:dropwhile(F, []), + ?line [a] = lists:dropwhile(F, [a]), + ?line [a,b] = lists:dropwhile(F, [a,b]), + ?line [a,b,c] = lists:dropwhile(F, [a,b,c]), + + ?line [] = lists:dropwhile(F, [$@]), + ?line [] = lists:dropwhile(F, [$@,$@]), + ?line [a,$@] = lists:dropwhile(F, [$@,a,$@]), + + ?line [$k] = lists:dropwhile(F, [$@,$k]), + ?line [$k,$l] = lists:dropwhile(F, [$@,$@,$k,$l]), + ?line [a] = lists:dropwhile(F, [$@,$@,$@,a]), + + ?line [a,$@,b] = lists:dropwhile(F, [$@,a,$@,b]), + ?line [a,$@,b] = lists:dropwhile(F, [$@,$@,a,$@,b]), + ?line [a,$@,b] = lists:dropwhile(F, [$@,$@,$@,a,$@,b]), + + Long = lists:seq(1, 1024), + Shorter = lists:seq(800, 1024), + + ?line Shorter = lists:dropwhile(fun(E) -> E < 800 end, Long), + + ok. + +keystore(doc) -> + ["OTP-XXX."]; +keystore(suite) -> []; +keystore(Config) when is_list(Config) -> + ?line {'EXIT',_} = (catch lists:keystore(key, 0, [], {1})), + ?line {'EXIT',_} = (catch lists:keystore(key, 1, {}, {})), + ?line {'EXIT',_} = (catch lists:keystore(key, 1, {a,b}, {})), + ?line {'EXIT', _} = (catch lists:keystore(a, 2, [{1,a}], b)), + T = {k,17}, + ?line [T] = lists:keystore(a, 2, [], T), + ?line [{1,a},{2,b},{k,17}] = lists:keystore(c, 2, [{1,a},{2,b}],T), + L = [{1,a},{2,b},{3,c}], + ?line [{k,17},{2,b},{3,c}] = lists:keystore(a, 2, L, T), + ?line [{1,a},{k,17},{3,c}] = lists:keystore(b, 2, L, T), + ?line [{1,a},{2,b},{k,17}] = lists:keystore(c, 2, L, T), + ?line [{2,b}] = lists:keystore(a, 2, [{1,a}], {2,b}), + ?line [{1,a}] = lists:keystore(foo, 1, [], {1,a}), + ok. + +keytake(doc) -> + ["OTP-XXX."]; +keytake(suite) -> []; +keytake(Config) when is_list(Config) -> + ?line {'EXIT',_} = (catch lists:keytake(key, 0, [])), + ?line {'EXIT',_} = (catch lists:keytake(key, 1, {})), + ?line {'EXIT',_} = (catch lists:keytake(key, 1, {a,b})), + ?line false = lists:keytake(key, 2, [{a}]), + ?line false = lists:keytake(key, 1, [a]), + ?line false = lists:keytake(k, 1, []), + ?line false = lists:keytake(k, 1, [{a},{b},{c}]), + L = [{a,1},{b,2},{c,3}], + ?line {value,{a,1},[{b,2},{c,3}]} = lists:keytake(1, 2, L), + ?line {value,{b,2},[{a,1},{c,3}]} = lists:keytake(2, 2, L), + ?line {value,{c,3},[{a,1},{b,2}]} = lists:keytake(3, 2, L), + ?line false = lists:keytake(4, 2, L), + ok. + +sort(doc) -> + ["Tests merge functions and lists:sort/1"]; +sort(suite) -> + %% [merge, rmerge, sort_1, sort_rand, sort_stable]. + [merge, rmerge, sort_1, sort_rand]. + +merge(doc) -> ["merge functions"]; +merge(suite) -> []; +merge(Config) when is_list(Config) -> + + %% merge list of lists + ?line [] = lists:merge([]), + ?line [] = lists:merge([[]]), + ?line [] = lists:merge([[],[]]), + ?line [] = lists:merge([[],[],[]]), + ?line [1] = lists:merge([[1]]), + ?line [1,1,2,2] = lists:merge([[1,2],[1,2]]), + ?line [1] = lists:merge([[1],[],[]]), + ?line [1] = lists:merge([[],[1],[]]), + ?line [1] = lists:merge([[],[],[1]]), + ?line [1,2] = lists:merge([[1],[2],[]]), + ?line [1,2] = lists:merge([[1],[],[2]]), + ?line [1,2] = lists:merge([[],[1],[2]]), + ?line [1,2,3,4,5,6] = lists:merge([[1,2],[],[5,6],[],[3,4],[]]), + ?line [1,2,3,4] = lists:merge([[4],[3],[2],[1]]), + ?line [1,2,3,4,5] = lists:merge([[1],[2],[3],[4],[5]]), + ?line [1,2,3,4,5,6] = lists:merge([[1],[2],[3],[4],[5],[6]]), + ?line [1,2,3,4,5,6,7,8,9] = + lists:merge([[1],[2],[3],[4],[5],[6],[7],[8],[9]]), + Seq = lists:seq(1,100), + ?line true = Seq == lists:merge(lists:map(fun(E) -> [E] end, Seq)), + + Two = [1,2], + Six = [1,2,3,4,5,6], + + %% 2-way merge + ?line [] = lists:merge([], []), + ?line Two = lists:merge(Two, []), + ?line Two = lists:merge([], Two), + ?line Six = lists:merge([1,3,5], [2,4,6]), + ?line Six = lists:merge([2,4,6], [1,3,5]), + ?line Six = lists:merge([1,2,3], [4,5,6]), + ?line Six = lists:merge([4,5,6], [1,2,3]), + ?line Six = lists:merge([1,2,5],[3,4,6]), + ?line [1,2,3,5,7] = lists:merge([1,3,5,7], [2]), + ?line [1,2,3,4,5,7] = lists:merge([1,3,5,7], [2,4]), + ?line [1,2,3,4,5,6,7] = lists:merge([1,3,5,7], [2,4,6]), + ?line [1,2,3,5,7] = lists:merge([2], [1,3,5,7]), + ?line [1,2,3,4,5,7] = lists:merge([2,4], [1,3,5,7]), + ?line [1,2,3,4,5,6,7] = lists:merge([2,4,6], [1,3,5,7]), + + %% 3-way merge + ?line [] = lists:merge3([], [], []), + ?line Two = lists:merge3([], [], Two), + ?line Two = lists:merge3([], Two, []), + ?line Two = lists:merge3(Two, [], []), + ?line Six = lists:merge3([], [1,3,5], [2,4,6]), + ?line Six = lists:merge3([1,3,5], [], [2,4,6]), + ?line Six = lists:merge3([1,3,5], [2,4,6], []), + ?line Nine = lists:merge3([1,4,7],[2,5,8],[3,6,9]), + ?line Nine = lists:merge3([1,4,7],[3,6,9],[2,5,8]), + ?line Nine = lists:merge3([3,6,9],[1,4,7],[2,5,8]), + ?line Nine = lists:merge3([4,5,6],[1,2,3],[7,8,9]), + ?line Nine = lists:merge3([1,2,3],[4,5,6],[7,8,9]), + ?line Nine = lists:merge3([7,8,9],[4,5,6],[1,2,3]), + ?line Nine = lists:merge3([4,5,6],[7,8,9],[1,2,3]), + + ok. + +rmerge(doc) -> ["reverse merge functions"]; +rmerge(suite) -> []; +rmerge(Config) when is_list(Config) -> + + Two = [2,1], + Six = [6,5,4,3,2,1], + + %% 2-way reversed merge + ?line [] = lists:rmerge([], []), + ?line Two = lists:rmerge(Two, []), + ?line Two = lists:rmerge([], Two), + ?line Six = lists:rmerge([5,3,1], [6,4,2]), + ?line Six = lists:rmerge([6,4,2], [5,3,1]), + ?line Six = lists:rmerge([3,2,1], [6,5,4]), + ?line Six = lists:rmerge([6,5,4], [3,2,1]), + ?line Six = lists:rmerge([4,3,2],[6,5,1]), + ?line [7,6,5,3,1] = lists:rmerge([7,5,3,1], [6]), + ?line [7,6,5,4,3,1] = lists:rmerge([7,5,3,1], [6,4]), + ?line [7,6,5,4,3,2,1] = lists:rmerge([7,5,3,1], [6,4,2]), + ?line [7,5,3,2,1] = lists:rmerge([2], [7,5,3,1]), + ?line [7,5,4,3,2,1] = lists:rmerge([4,2], [7,5,3,1]), + ?line [7,6,5,4,3,2,1] = lists:rmerge([6,4,2], [7,5,3,1]), + + Nine = [9,8,7,6,5,4,3,2,1], + + %% 3-way reversed merge + ?line [] = lists:rmerge3([], [], []), + ?line Two = lists:rmerge3([], [], Two), + ?line Two = lists:rmerge3([], Two, []), + ?line Two = lists:rmerge3(Two, [], []), + ?line Six = lists:rmerge3([], [5,3,1], [6,4,2]), + ?line Six = lists:rmerge3([5,3,1], [], [6,4,2]), + ?line Six = lists:rmerge3([5,3,1], [6,4,2], []), + ?line Nine = lists:rmerge3([7,4,1],[8,5,2],[9,6,3]), + ?line Nine = lists:rmerge3([7,4,1],[9,6,3],[8,5,2]), + ?line Nine = lists:rmerge3([9,6,3],[7,4,1],[8,5,2]), + ?line Nine = lists:rmerge3([6,5,4],[3,2,1],[9,8,7]), + ?line Nine = lists:rmerge3([3,2,1],[6,5,4],[9,8,7]), + ?line Nine = lists:rmerge3([9,8,7],[6,5,4],[3,2,1]), + ?line Nine = lists:rmerge3([6,5,4],[9,8,7],[3,2,1]), + + ok. + +sort_1(doc) -> ["sort/1"]; +sort_1(suite) -> []; +sort_1(Config) when is_list(Config) -> + ?line [] = lists:sort([]), + ?line [a] = lists:sort([a]), + ?line [a,a] = lists:sort([a,a]), + ?line [a,b] = lists:sort([a,b]), + ?line [a,b] = lists:sort([b,a]), + ?line [1,1] = lists:sort([1,1]), + ?line [1,1,2,3] = lists:sort([1,1,3,2]), + ?line [1,2,3,3] = lists:sort([3,3,1,2]), + ?line [1,1,1,1] = lists:sort([1,1,1,1]), + ?line [1,1,1,2,2,2,3,3,3] = lists:sort([3,3,3,2,2,2,1,1,1]), + ?line [1,1,1,2,2,2,3,3,3] = lists:sort([1,1,1,2,2,2,3,3,3]), + + ?line lists:foreach(fun check/1, perms([1,2,3])), + ?line lists:foreach(fun check/1, perms([1,2,3,4,5,6,7,8])), + ok. + +sort_rand(doc) -> ["sort/1 on big randomized lists"]; +sort_rand(suite) -> []; +sort_rand(Config) when is_list(Config) -> + ?line ok = check(biglist(10)), + ?line ok = check(biglist(100)), + ?line ok = check(biglist(1000)), + ?line ok = check(biglist(10000)), + ok. + +%% sort/1 was really stable for a while - the order of equal elements +%% was kept - but since the performance suffered a bit, this "feature" +%% was removed. +sort_stable(doc) -> ["sort/1 should be stable for equal terms."]; +sort_stable(suite) -> []; +sort_stable(Config) when is_list(Config) -> + ?line ok = check_stability(bigfunlist(10)), + ?line ok = check_stability(bigfunlist(100)), + ?line ok = check_stability(bigfunlist(1000)), + ?line case erlang:system_info(modified_timing_level) of + undefined -> ok = check_stability(bigfunlist(10000)); + _ -> ok + end, + ok. + +check([]) -> + ok; +check(L) -> + S = lists:sort(L), + case {length(L) == length(S), check(hd(S), tl(S))} of + {true,ok} -> + ok; + _ -> + io:format("~w~n", [L]), + erlang:error(check) + end. + +check(_A, []) -> + ok; +check(A, [B | L]) when A =< B -> + check(B, L); +check(_A, _L) -> + no. + +%% The check that sort/1 is stable is no longer used. +%% Equal elements are no longer always kept in order. +check_stability(L) -> + S = lists:sort(L), + LP = explicit_pid(L), + SP = explicit_pid(S), + check_sorted(1, 2, LP, SP). + +explicit_pid(L) -> + lists:reverse(expl_pid(L, [])). + +expl_pid([{I,F} | T], L) when is_function(F) -> + expl_pid(T, [{I,fun_pid(F)} | L]); +expl_pid([], L) -> + L. + +usort(doc) -> + ["Tests unique merge functions and lists:usort/1"]; +usort(suite) -> + [umerge, rumerge, usort_1, usort_rand, usort_stable]. + +usort_1(suite) -> []; +usort_1(doc) -> [""]; +usort_1(Conf) when is_list(Conf) -> + ?line [] = lists:usort([]), + ?line [1] = lists:usort([1]), + ?line [1] = lists:usort([1,1]), + ?line [1] = lists:usort([1,1,1,1,1]), + ?line [1,2] = lists:usort([1,2]), + ?line [1,2] = lists:usort([1,2,1]), + ?line [1,2] = lists:usort([1,2,2]), + ?line [1,2,3] = lists:usort([1,3,2]), + ?line [1,3] = lists:usort([3,1,3]), + ?line [0,1,3] = lists:usort([3,1,0]), + ?line [1,2,3] = lists:usort([3,1,2]), + ?line [1,2] = lists:usort([2,1,1]), + ?line [1,2] = lists:usort([2,1]), + ?line [0,3,4,8,9] = lists:usort([3,8,9,0,9,4]), + + ?line lists:foreach(fun ucheck/1, perms([1,2,3])), + ?line lists:foreach(fun ucheck/1, perms([1,2,3,4,5,6,2,1])), + + ok. + +umerge(suite) -> []; +umerge(doc) -> [""]; +umerge(Conf) when is_list(Conf) -> + %% merge list of lists + ?line [] = lists:umerge([]), + ?line [] = lists:umerge([[]]), + ?line [] = lists:umerge([[],[]]), + ?line [] = lists:umerge([[],[],[]]), + ?line [1] = lists:umerge([[1]]), + ?line [1,2] = lists:umerge([[1,2],[1,2]]), + ?line [1] = lists:umerge([[1],[],[]]), + ?line [1] = lists:umerge([[],[1],[]]), + ?line [1] = lists:umerge([[],[],[1]]), + ?line [1,2] = lists:umerge([[1],[2],[]]), + ?line [1,2] = lists:umerge([[1],[],[2]]), + ?line [1,2] = lists:umerge([[],[1],[2]]), + ?line [1,2,3,4,5,6] = lists:umerge([[1,2],[],[5,6],[],[3,4],[]]), + ?line [1,2,3,4] = lists:umerge([[4],[3],[2],[1]]), + ?line [1,2,3,4,5] = lists:umerge([[1],[2],[3],[4],[5]]), + ?line [1,2,3,4,5,6] = lists:umerge([[1],[2],[3],[4],[5],[6]]), + ?line [1,2,3,4,5,6,7,8,9] = + lists:umerge([[1],[2],[3],[4],[5],[6],[7],[8],[9]]), + ?line [1,2,4,6,8] = lists:umerge([[1,2],[2,4,6,8]]), + Seq = lists:seq(1,100), + ?line true = Seq == lists:umerge(lists:map(fun(E) -> [E] end, Seq)), + + Two = [1,2], + Six = [1,2,3,4,5,6], + + %% 2-way unique merge + ?line [] = lists:umerge([], []), + ?line Two = lists:umerge(Two, []), + ?line Two = lists:umerge([], Two), + ?line Six = lists:umerge([1,3,5], [2,4,6]), + ?line Six = lists:umerge([2,4,6], [1,3,5]), + ?line Six = lists:umerge([1,2,3], [4,5,6]), + ?line Six = lists:umerge([4,5,6], [1,2,3]), + ?line Six = lists:umerge([1,2,5],[3,4,6]), + ?line [1,2,3,5,7] = lists:umerge([1,3,5,7], [2]), + ?line [1,2,3,4,5,7] = lists:umerge([1,3,5,7], [2,4]), + ?line [1,2,3,4,5,6,7] = lists:umerge([1,3,5,7], [2,4,6]), + ?line [1,2,3,5,7] = lists:umerge([2], [1,3,5,7]), + ?line [1,2,3,4,5,7] = lists:umerge([2,4], [1,3,5,7]), + ?line [1,2,3,4,5,6,7] = lists:umerge([2,4,6], [1,3,5,7]), + + ?line [1,2,3,5,7] = lists:umerge([1,2,3,5,7], [2]), + ?line [1,2,3,4,5,7] = lists:umerge([1,2,3,4,5,7], [2,4]), + ?line [1,2,3,4,5,6,7] = lists:umerge([1,2,3,4,5,6,7], [2,4,6]), + ?line [1,2,3,5,7] = lists:umerge([2], [1,2,3,5,7]), + ?line [1,2,3,4,5,7] = lists:umerge([2,4], [1,2,3,4,5,7]), + ?line [1,2,3,4,5,6,7] = lists:umerge([2,4,6], [1,2,3,4,5,6,7]), + + %% 3-way unique merge + ?line [] = lists:umerge3([], [], []), + ?line Two = lists:umerge3([], [], Two), + ?line Two = lists:umerge3([], Two, []), + ?line Two = lists:umerge3(Two, [], []), + ?line Six = lists:umerge3([], [1,3,5], [2,4,6]), + ?line Six = lists:umerge3([1,3,5], [], [2,4,6]), + ?line Six = lists:umerge3([1,3,5], [2,4,6], []), + ?line Nine = lists:umerge3([1,4,7],[2,5,8],[3,6,9]), + ?line Nine = lists:umerge3([1,4,7],[3,6,9],[2,5,8]), + ?line Nine = lists:umerge3([3,6,9],[1,4,7],[2,5,8]), + ?line Nine = lists:umerge3([4,5,6],[1,2,3],[7,8,9]), + ?line Nine = lists:umerge3([1,2,3],[4,5,6],[7,8,9]), + ?line Nine = lists:umerge3([7,8,9],[4,5,6],[1,2,3]), + ?line Nine = lists:umerge3([4,5,6],[7,8,9],[1,2,3]), + + ?line [1,2,3] = lists:umerge3([1,2,3],[1,2,3],[1,2,3]), + ?line [1,2,3,4] = lists:umerge3([2,3,4],[1,2,3],[2,3,4]), + ?line [1,2,3] = lists:umerge3([1,2,3],[2,3],[1,2,3]), + ?line [1,2,3,4] = lists:umerge3([2,3,4],[3,4],[1,2,3]), + + ok. + +rumerge(suite) -> []; +rumerge(doc) -> [""]; +rumerge(Conf) when is_list(Conf) -> + Two = [2,1], + Six = [6,5,4,3,2,1], + + %% 2-way reversed unique merge + ?line [] = lists:rumerge([], []), + ?line Two = lists:rumerge(Two, []), + ?line Two = lists:rumerge([], Two), + ?line Six = lists:rumerge([5,3,1], [6,4,2]), + ?line Six = lists:rumerge([6,4,2], [5,3,1]), + ?line Six = lists:rumerge([3,2,1], [6,5,4]), + ?line Six = lists:rumerge([6,5,4], [3,2,1]), + ?line Six = lists:rumerge([4,3,2],[6,5,1]), + ?line [7,6,5,3,1] = lists:rumerge([7,5,3,1], [6]), + ?line [7,6,5,4,3,1] = lists:rumerge([7,5,3,1], [6,4]), + ?line [7,6,5,4,3,2,1] = lists:rumerge([7,5,3,1], [6,4,2]), + ?line [7,5,3,2,1] = lists:rumerge([2], [7,5,3,1]), + ?line [7,5,4,3,2,1] = lists:rumerge([4,2], [7,5,3,1]), + ?line [7,6,5,4,3,2,1] = lists:rumerge([6,4,2], [7,5,3,1]), + + ?line [7,6,5,3,1] = lists:rumerge([7,6,5,3,1], [6]), + ?line [7,6,5,4,3,1] = lists:rumerge([7,6,5,4,3,1], [6,4]), + ?line [7,6,5,4,3,2,1] = lists:rumerge([7,6,5,4,3,2,1], [6,4,2]), + ?line [7,5,3,2,1] = lists:rumerge([2], [7,5,3,2,1]), + ?line [7,5,4,3,2,1] = lists:rumerge([4,2], [7,5,4,3,2,1]), + ?line [7,6,5,4,3,2,1] = lists:rumerge([6,4,2], [7,6,5,4,3,2,1]), + + Nine = [9,8,7,6,5,4,3,2,1], + + %% 3-way reversed unique merge + ?line [] = lists:rumerge3([], [], []), + ?line Two = lists:rumerge3([], [], Two), + ?line Two = lists:rumerge3([], Two, []), + ?line Two = lists:rumerge3(Two, [], []), + ?line Six = lists:rumerge3([], [5,3,1], [6,4,2]), + ?line Six = lists:rumerge3([5,3,1], [], [6,4,2]), + ?line Six = lists:rumerge3([5,3,1], [6,4,2], []), + ?line Nine = lists:rumerge3([7,4,1],[8,5,2],[9,6,3]), + ?line Nine = lists:rumerge3([7,4,1],[9,6,3],[8,5,2]), + ?line Nine = lists:rumerge3([9,6,3],[7,4,1],[8,5,2]), + ?line Nine = lists:rumerge3([6,5,4],[3,2,1],[9,8,7]), + ?line Nine = lists:rumerge3([3,2,1],[6,5,4],[9,8,7]), + ?line Nine = lists:rumerge3([9,8,7],[6,5,4],[3,2,1]), + ?line Nine = lists:rumerge3([6,5,4],[9,8,7],[3,2,1]), + + ?line [3,2,1] = lists:rumerge3([3,2,1],[3,2,1],[3,2,1]), + ?line [4,3,2,1] = lists:rumerge3([4,3,2],[3,2,1],[3,2,1]), + ?line [5,4,3,2,1] = lists:rumerge3([4,3,2],[5,4,3,2],[5,4,3,2,1]), + ?line [6,5,4,3,2] = lists:rumerge3([4,3,2],[5,4,3,2],[6,5,4,3]), + + L1 = [c,d,e], + L2 = [b,c,d], + ?line true = + lists:umerge(L1, L2) == + lists:reverse(lists:rumerge(lists:reverse(L1), lists:reverse(L2))), + ok. + +usort_rand(doc) -> ["usort/1 on big randomized lists"]; +usort_rand(suite) -> []; +usort_rand(Config) when is_list(Config) -> + ?line ok = ucheck(biglist(10)), + ?line ok = ucheck(biglist(100)), + ?line ok = ucheck(biglist(1000)), + ?line ok = ucheck(biglist(10000)), + + ?line ok = ucheck(ubiglist(10)), + ?line ok = ucheck(ubiglist(100)), + ?line ok = ucheck(ubiglist(1000)), + ?line ok = ucheck(ubiglist(10000)), + ok. + +usort_stable(doc) -> ["usort/1 should keep the first duplicate."]; +usort_stable(suite) -> []; +usort_stable(Config) when is_list(Config) -> + ?line ok = ucheck_stability(bigfunlist(3)), + ?line ok = ucheck_stability(bigfunlist(10)), + ?line ok = ucheck_stability(bigfunlist(100)), + ?line ok = ucheck_stability(bigfunlist(1000)), + ?line case erlang:system_info(modified_timing_level) of + undefined -> ok = ucheck_stability(bigfunlist(10000)); + _ -> ok + end, + ok. + +ucheck([]) -> + ok; +ucheck(L) -> + S = lists:usort(L), + case ucheck(hd(S), tl(S)) of + ok -> + ok; + _ -> + io:format("~w~n", [L]), + erlang:error(ucheck) + end. + +ucheck(_A, []) -> + ok; +ucheck(A, [B | L]) when A < B -> + ucheck(B, L); +ucheck(_A, _L) -> + no. + +%% Check that usort/1 is stable and correct relative ukeysort/2. +ucheck_stability(L) -> + S = no_dups(lsort(L)), + U = lists:usort(L), + check_stab(L, U, S, "usort/1", "ukeysort/2"). + +keysort(doc) -> + ["Tests lists:keysort/2"]; +keysort(suite) -> + [keymerge, rkeymerge, + keysort_1, keysort_rand, keysort_i, keysort_stable, keysort_error]. + +keymerge(doc) -> ["Key merge two lists."]; +keymerge(suite) -> []; +keymerge(Config) when is_list(Config) -> + + Two = [{1,a},{2,b}], + Six = [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f}], + + %% 2-way keymerge + ?line [] = lists:keymerge(1, [], []), + ?line Two = lists:keymerge(1, Two, []), + ?line Two = lists:keymerge(1, [], Two), + ?line Six = lists:keymerge(1, [{1,a},{3,c},{5,e}], [{2,b},{4,d},{6,f}]), + ?line Six = lists:keymerge(1, [{2,b},{4,d},{6,f}], [{1,a},{3,c},{5,e}]), + ?line Six = lists:keymerge(1, [{1,a},{2,b},{3,c}], [{4,d},{5,e},{6,f}]), + ?line Six = lists:keymerge(1, [{4,d},{5,e},{6,f}], [{1,a},{2,b},{3,c}]), + ?line Six = lists:keymerge(1, [{1,a},{2,b},{5,e}],[{3,c},{4,d},{6,f}]), + ?line [{1,a},{2,b},{3,c},{5,e},{7,g}] = + lists:keymerge(1, [{1,a},{3,c},{5,e},{7,g}], [{2,b}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{7,g}] = + lists:keymerge(1, [{1,a},{3,c},{5,e},{7,g}], [{2,b},{4,d}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f},{7,g}] = + lists:keymerge(1, [{1,a},{3,c},{5,e},{7,g}], [{2,b},{4,d},{6,f}]), + ?line [{1,a},{2,b},{3,c},{5,e},{7,g}] = + lists:keymerge(1, [{2,b}], [{1,a},{3,c},{5,e},{7,g}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{7,g}] = + lists:keymerge(1, [{2,b},{4,d}], [{1,a},{3,c},{5,e},{7,g}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f},{7,g}] = + lists:keymerge(1, [{2,b},{4,d},{6,f}], [{1,a},{3,c},{5,e},{7,g}]), + + ?line [{b,2},{c,11},{c,12},{c,21},{c,22},{e,5}] = + lists:keymerge(1,[{c,11},{c,12},{e,5}], [{b,2},{c,21},{c,22}]), + + ok. + +rkeymerge(doc) -> ["Reverse key merge two lists."]; +rkeymerge(suite) -> []; +rkeymerge(Config) when is_list(Config) -> + + Two = [{2,b},{1,a}], + Six = [{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}], + + %% 2-way reversed keymerge + ?line [] = lists:rkeymerge(1, [], []), + ?line Two = lists:rkeymerge(1, Two, []), + ?line Two = lists:rkeymerge(1, [], Two), + ?line Six = lists:rkeymerge(1, [{5,e},{3,c},{1,a}], [{6,f},{4,d},{2,b}]), + ?line Six = lists:rkeymerge(1, [{6,f},{4,d},{2,b}], [{5,e},{3,c},{1,a}]), + ?line Six = lists:rkeymerge(1, [{3,c},{2,b},{1,a}], [{6,f},{5,e},{4,d}]), + ?line Six = lists:rkeymerge(1, [{6,f},{5,e},{4,d}], [{3,c},{2,b},{1,a}]), + ?line Six = lists:rkeymerge(1, [{4,d},{3,c},{2,b}],[{6,f},{5,e},{1,a}]), + ?line [{7,g},{6,f},{5,e},{3,c},{1,a}] = + lists:rkeymerge(1, [{7,g},{5,e},{3,c},{1,a}], [{6,f}]), + ?line [{7,g},{6,f},{5,e},{4,d},{3,c},{1,a}] = + lists:rkeymerge(1, [{7,g},{5,e},{3,c},{1,a}], [{6,f},{4,d}]), + ?line [{7,g},{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}] = + lists:rkeymerge(1, [{7,g},{5,e},{3,c},{1,a}], [{6,f},{4,d},{2,b}]), + ?line [{7,g},{5,e},{3,c},{2,b},{1,a}] = + lists:rkeymerge(1, [{2,b}], [{7,g},{5,e},{3,c},{1,a}]), + ?line [{7,g},{5,e},{4,d},{3,c},{2,b},{1,a}] = + lists:rkeymerge(1, [{4,d},{2,b}], [{7,g},{5,e},{3,c},{1,a}]), + ?line [{7,g},{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}] = + lists:rkeymerge(1, [{6,f},{4,d},{2,b}], [{7,g},{5,e},{3,c},{1,a}]), + + L1 = [{c,11},{c,12},{e,5}], + L2 = [{b,2},{c,21},{c,22}], + ?line true = + lists:keymerge(1, L1, L2) == + lists:reverse(lists:rkeymerge(1,lists:reverse(L1), + lists:reverse(L2))), + + ok. + +keysort_1(doc) -> ["keysort"]; +keysort_1(suite) -> []; +keysort_1(Config) when is_list(Config) -> + ?line ok = keysort_check(1, [], []), + ?line ok = keysort_check(1, [{a,b}], [{a,b}]), + ?line ok = keysort_check(1, [{a,b},{a,b}], [{a,b},{a,b}]), + ?line ok = keysort_check(1, [{a,b},{b,c}], [{a,b},{b,c}]), + ?line ok = keysort_check(1, [{b,c},{a,b}], [{a,b},{b,c}]), + ?line ok = keysort_check(1, + [{1,e},{3,f},{2,y},{0,z},{x,14}], + [{0,z},{1,e},{2,y},{3,f},{x,14}]), + ?line ok = keysort_check(1, + [{1,a},{1,a},{1,a},{1,a}], + [{1,a},{1,a},{1,a},{1,a}]), + + ?line [{b,1},{c,1}] = lists:keysort(1, [{c,1},{b,1}]), + ?line [{a,0},{b,2},{c,3},{d,4}] = + lists:keysort(1, [{d,4},{c,3},{b,2},{a,0}]), + ?line [{a,0},{b,1},{b,2},{c,1}] = + lists:keysort(1, [{c,1},{b,1},{b,2},{a,0}]), + ?line [{a,0},{b,1},{b,2},{c,1},{d,4}] = + lists:keysort(1, [{c,1},{b,1},{b,2},{a,0},{d,4}]), + + SFun = fun(L) -> fun(X) -> keysort_check(1, X, L) end end, + L1 = [{1,a},{2,b},{3,c}], + ?line lists:foreach(SFun(L1), perms(L1)), + L2 = [{1,a},{1,a},{2,b}], + ?line lists:foreach(SFun(L2), perms(L2)), + L3 = [{1,a},{1,a},{1,a},{2,b}], + ?line lists:foreach(SFun(L3), perms(L3)), + L4 = [{a,1},{a,1},{b,2},{b,2},{c,3},{d,4},{e,5},{f,6}], + ?line lists:foreach(SFun(L4), perms(L4)), + + ok. + +keysort_stable(doc) -> ["keysort should be stable"]; +keysort_stable(suite) -> []; +keysort_stable(Config) when is_list(Config) -> + ?line ok = keysort_check(1, [{1,b},{1,c}], [{1,b},{1,c}]), + ?line ok = keysort_check(1, [{1,c},{1,b}], [{1,c},{1,b}]), + ?line ok = keysort_check(1, + [{1,c},{1,b},{2,x},{3,p},{2,a}], + [{1,c},{1,b},{2,x},{2,a},{3,p}]), + ?line ok = keysort_check(1, + [{1,a},{1,b},{1,a},{1,a}], + [{1,a},{1,b},{1,a},{1,a}]), + ok. + +keysort_error(doc) -> ["keysort should exit when given bad arguments"]; +keysort_error(suite) -> []; +keysort_error(Config) when is_list(Config) -> + ?line {'EXIT', _} = (catch lists:keysort(0, [{1,b},{1,c}])), + ?line {'EXIT', _} = (catch lists:keysort(3, [{1,b},{1,c}])), + ?line {'EXIT', _} = (catch lists:keysort(1.5, [{1,b},{1,c}])), + ?line {'EXIT', _} = (catch lists:keysort(x, [{1,b},{1,c}])), + ?line {'EXIT', _} = (catch lists:keysort(x, [])), + ?line {'EXIT', _} = (catch lists:keysort(x, [{1,b}])), + ?line {'EXIT', _} = (catch lists:keysort(1, [a,b])), + ?line {'EXIT', _} = (catch lists:keysort(1, [{1,b} | {1,c}])), + ok. + +keysort_i(doc) -> ["keysort with other key than first element"]; +keysort_i(suite) -> []; +keysort_i(Config) when is_list(Config) -> + ?line ok = keysort_check(2, [{a,2},{b,1},{c,3}], [{b,1},{a,2},{c,3}]), + ok. + +keysort_rand(doc) -> ["keysort on big randomized lists"]; +keysort_rand(suite) -> []; +keysort_rand(Config) when is_list(Config) -> + ?line ok = keysort_check3(1, biglist(10)), + ?line ok = keysort_check3(1, biglist(100)), + ?line ok = keysort_check3(1, biglist(1000)), + ?line ok = keysort_check3(1, biglist(10000)), + + ?line ok = keysort_check3(2, biglist(10)), + ?line ok = keysort_check3(2, biglist(100)), + ?line ok = keysort_check3(2, biglist(1000)), + ?line ok = keysort_check3(2, biglist(10000)), + ok. + +%%% Keysort a list, check that the returned list is what we expected, +%%% and that it is actually sorted. +keysort_check(I, Input, Expected) -> + ?line Expected = lists:keysort(I, Input), + check_sorted(I, Input, Expected). + +keysort_check3(I, Input) -> + check_sorted(I, 3, Input, lists:keysort(I, Input)). + +check_sorted(I, Input, L) -> + check_sorted(I, I, Input, L). + +%%% Check that a list is keysorted by element I. Elements comparing equal +%%% should be sorted according to element J. +check_sorted(_I, _J, _Input, []) -> + ok; +check_sorted(I, J, Input, [A | Rest]) -> + case catch check_sorted1(I, J, A, Rest) of + {'EXIT', _} -> + io:format("~w~n", [Input]), + erlang:error(check_sorted); + Reply -> + Reply + end. + +check_sorted1(_I, _J, _A, []) -> + ok; +check_sorted1(I, J, A, [B | Rest]) -> + ok = keycompare(I, J, A, B), + check_sorted1(I, J, B, Rest). + +keycompare(I, _J, A, B) when element(I, A) < element(I, B) -> + ok; +keycompare(I, J, A, B) when element(I, A) == element(I, B), + element(J, A) =< element(J, B) -> + ok. + +ukeysort(doc) -> + ["Tests lists:ukeysort/2"]; +ukeysort(suite) -> + [ukeymerge, rukeymerge, + ukeysort_1, ukeysort_rand, ukeysort_i, ukeysort_stable, ukeysort_error]. + +ukeymerge(suite) -> []; +ukeymerge(doc) -> ["Merge two lists while removing duplicates."]; +ukeymerge(Conf) when is_list(Conf) -> + + Two = [{1,a},{2,b}], + Six = [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f}], + + %% 2-way unique keymerge + ?line [] = lists:ukeymerge(1, [], []), + ?line Two = lists:ukeymerge(1, Two, []), + ?line Two = lists:ukeymerge(1, [], Two), + ?line [] = lists:ukeymerge(1, [], []), + ?line Two = lists:ukeymerge(1, Two, []), + ?line Two = lists:ukeymerge(1, [], Two), + ?line Six = lists:ukeymerge(1, [{1,a},{3,c},{5,e}], [{2,b},{4,d},{6,f}]), + ?line Six = lists:ukeymerge(1, [{2,b},{4,d},{6,f}], [{1,a},{3,c},{5,e}]), + ?line Six = lists:ukeymerge(1, [{1,a},{2,b},{3,c}], [{4,d},{5,e},{6,f}]), + ?line Six = lists:ukeymerge(1, [{4,d},{5,e},{6,f}], [{1,a},{2,b},{3,c}]), + ?line Six = lists:ukeymerge(1, [{1,a},{2,b},{5,e}],[{3,c},{4,d},{6,f}]), + ?line [{1,a},{2,b},{3,c},{5,e},{7,g}] = + lists:ukeymerge(1, [{1,a},{3,c},{5,e},{7,g}], [{2,b}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{7,g}] = + lists:ukeymerge(1, [{1,a},{3,c},{5,e},{7,g}], [{2,b},{4,d}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f},{7,g}] = + lists:ukeymerge(1, [{1,a},{3,c},{5,e},{7,g}], [{2,b},{4,d},{6,f}]), + ?line [{1,a},{2,b},{3,c},{5,e},{7,g}] = + lists:ukeymerge(1, [{2,b}], [{1,a},{3,c},{5,e},{7,g}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{7,g}] = + lists:ukeymerge(1, [{2,b},{4,d}], [{1,a},{3,c},{5,e},{7,g}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f},{7,g}] = + lists:ukeymerge(1, [{2,b},{4,d},{6,f}], [{1,a},{3,c},{5,e},{7,g}]), + + ?line [{1,a},{2,b},{3,c},{5,e},{7,g}] = + lists:ukeymerge(1, [{1,a},{2,b},{3,c},{5,e},{7,g}], [{2,b}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{7,g}] = + lists:ukeymerge(1, [{1,a},{2,b},{3,c},{4,d},{5,e},{7,g}], + [{2,b},{4,d}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f},{7,g}] = + lists:ukeymerge(1, [{1,a},{3,c},{5,e},{6,f},{7,g}], + [{2,b},{4,d},{6,f}]), + ?line [{1,a},{2,b},{3,c},{5,e},{7,g}] = + lists:ukeymerge(1, [{2,b}], [{1,a},{2,b},{3,c},{5,e},{7,g}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{7,g}] = + lists:ukeymerge(1, [{2,b},{4,d}], + [{1,a},{2,b},{3,c},{4,d},{5,e},{7,g}]), + ?line [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f},{7,g}] = + lists:ukeymerge(1, [{2,b},{4,d},{6,f}], + [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f},{7,g}]), + + L1 = [{a,1},{a,3},{a,5},{a,7}], + L2 = [{b,1},{b,3},{b,5},{b,7}], + ?line L1 = lists:ukeymerge(2, L1, L2), + + ok. + +rukeymerge(suite) -> []; +rukeymerge(doc) -> + ["Reverse merge two lists while removing duplicates."]; +rukeymerge(Conf) when is_list(Conf) -> + + Two = [{2,b},{1,a}], + Six = [{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}], + + %% 2-way reversed unique keymerge + ?line [] = lists:rukeymerge(1, [], []), + ?line Two = lists:rukeymerge(1, Two, []), + ?line Two = lists:rukeymerge(1, [], Two), + ?line Six = lists:rukeymerge(1, [{5,e},{3,c},{1,a}], [{6,f},{4,d},{2,b}]), + ?line Six = lists:rukeymerge(1, [{6,f},{4,d},{2,b}], [{5,e},{3,c},{1,a}]), + ?line Six = lists:rukeymerge(1, [{3,c},{2,b},{1,a}], [{6,f},{5,e},{4,d}]), + ?line Six = lists:rukeymerge(1, [{6,f},{5,e},{4,d}], [{3,c},{2,b},{1,a}]), + ?line Six = lists:rukeymerge(1, [{4,d},{3,c},{2,b}],[{6,f},{5,e},{1,a}]), + ?line [{7,g},{6,f},{5,e},{3,c},{1,a}] = + lists:rukeymerge(1, [{7,g},{5,e},{3,c},{1,a}], [{6,f}]), + ?line [{7,g},{6,f},{5,e},{4,d},{3,c},{1,a}] = + lists:rukeymerge(1, [{7,g},{5,e},{3,c},{1,a}], [{6,f},{4,d}]), + ?line [{7,g},{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}] = + lists:rukeymerge(1, [{7,g},{5,e},{3,c},{1,a}], [{6,f},{4,d},{2,b}]), + ?line [{7,g},{5,e},{3,c},{2,b},{1,a}] = + lists:rukeymerge(1, [{2,b}], [{7,g},{5,e},{3,c},{1,a}]), + ?line [{7,g},{5,e},{4,d},{3,c},{2,b},{1,a}] = + lists:rukeymerge(1, [{4,d},{2,b}], [{7,g},{5,e},{3,c},{1,a}]), + ?line [{7,g},{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}] = + lists:rukeymerge(1, [{6,f},{4,d},{2,b}], [{7,g},{5,e},{3,c},{1,a}]), + + ?line [{7,g},{6,f},{5,e},{3,c},{1,a}] = + lists:rukeymerge(1, [{7,g},{6,f},{5,e},{3,c},{1,a}], [{6,f}]), + ?line [{7,g},{6,f},{5,e},{4,d},{3,c},{1,a}] = + lists:rukeymerge(1, [{7,g},{6,f},{5,e},{4,d},{3,c},{1,a}], + [{6,f},{4,d}]), + ?line [{7,g},{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}] = + lists:rukeymerge(1, [{7,g},{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}], + [{6,f},{4,d},{2,b}]), + ?line [{7,g},{5,e},{3,c},{2,b},{1,a}] = + lists:rukeymerge(1, [{2,b}], [{7,g},{5,e},{3,c},{2,b},{1,a}]), + ?line [{7,g},{5,e},{4,d},{3,c},{2,b},{1,a}] = + lists:rukeymerge(1, [{4,d},{2,b}], + [{7,g},{5,e},{4,d},{3,c},{2,b},{1,a}]), + ?line [{7,g},{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}] = + lists:rukeymerge(1, [{6,f},{4,d},{2,b}], + [{7,g},{6,f},{5,e},{4,d},{3,c},{2,b},{1,a}]), + + L1 = [{a,1},{a,3},{a,5},{a,7}], + L2 = [{b,1},{b,3},{b,5},{b,7}], + ?line true = + lists:ukeymerge(2, L1, L2) == + lists:reverse(lists:rukeymerge(2, lists:reverse(L1), + lists:reverse(L2))), + + ok. + +ukeysort_1(doc) -> ["ukeysort"]; +ukeysort_1(suite) -> []; +ukeysort_1(Config) when is_list(Config) -> + ?line ok = ukeysort_check(1, [], []), + ?line ok = ukeysort_check(1, [{a,b}], [{a,b}]), + ?line ok = ukeysort_check(1, [{a,b},{a,b}], [{a,b}]), + ?line ok = ukeysort_check(1, [{a,b},{b,c}], [{a,b},{b,c}]), + ?line ok = ukeysort_check(1, [{b,c},{a,b}], [{a,b},{b,c}]), + ?line ok = ukeysort_check(1, + [{1,e},{3,f},{2,y},{0,z},{x,14}], + [{0,z},{1,e},{2,y},{3,f},{x,14}]), + ?line ok = ukeysort_check(1, [{1,a},{1,a},{1,a},{1,a}], [{1,a}]), + + L1 = [{1,a},{1,b},{1,a}], + L1u = lists:ukeysort(1, L1), + L2 = [{1,a},{1,b},{1,a}], + L2u = lists:ukeysort(1, L2), + ?line ok = ukeysort_check(1, lists:keymerge(1, L1, L2), + lists:ukeymerge(1, L1u, L2u)), + L3 = [{1,a},{1,b},{1,a},{2,a}], + L3u = lists:ukeysort(1, L3), + ?line ok = ukeysort_check(1, lists:keymerge(1, L3, L2), + lists:ukeymerge(1, L3u, L2u)), + L4 = [{1,b},{1,a}], + L4u = lists:ukeysort(1, L4), + ?line ok = ukeysort_check(1, lists:keymerge(1, L1, L4), + lists:ukeymerge(1, L1u, L4u)), + L5 = [{1,a},{1,b},{1,a},{2,a}], + L5u = lists:ukeysort(1, L5), + ?line ok = ukeysort_check(1, lists:keymerge(1, [], L5), + lists:ukeymerge(1, [], L5u)), + ?line ok = ukeysort_check(1, lists:keymerge(1, L5, []), + lists:ukeymerge(1, L5u, [])), + L6 = [{3,a}], + L6u = lists:ukeysort(1, L6), + ?line ok = ukeysort_check(1, lists:keymerge(1, L5, L6), + lists:ukeymerge(1, L5u, L6u)), + + ?line [{b,1},{c,1}] = lists:ukeysort(1, [{c,1},{c,1},{c,1},{c,1},{b,1}]), + ?line [{a,0},{b,2},{c,3},{d,4}] = + lists:ukeysort(1, [{d,4},{c,3},{b,2},{b,2},{a,0}]), + ?line [{a,0},{b,1},{c,1}] = + lists:ukeysort(1, [{c,1},{b,1},{b,1},{b,2},{b,2},{a,0}]), + ?line [{a,0},{b,1},{c,1},{d,4}] = + lists:ukeysort(1, [{c,1},{b,1},{b,2},{a,0},{a,0},{d,4},{d,4}]), + + SFun = fun(L) -> fun(X) -> ukeysort_check(2, X, L) end end, + PL = [{a,1},{b,2},{c,3},{d,4},{e,5},{f,6}], + Ps = perms([{a,1},{b,2},{c,3},{d,4},{e,5},{f,6},{b,2},{a,1}]), + ?line lists:foreach(SFun(PL), Ps), + + M1L = [{1,a},{1,a},{2,b}], + M1s = [{1,a},{2,b}], + ?line lists:foreach(SFun(M1s), perms(M1L)), + M2L = [{1,a},{2,b},{2,b}], + M2s = [{1,a},{2,b}], + ?line lists:foreach(SFun(M2s), perms(M2L)), + M3 = [{1,a},{2,b},{3,c}], + ?line lists:foreach(SFun(M3), perms(M3)), + + ok. + +ukeysort_stable(doc) -> ["ukeysort should keep the first duplicate"]; +ukeysort_stable(suite) -> []; +ukeysort_stable(Config) when is_list(Config) -> + ?line ok = ukeysort_check(1, [{1,b},{1,c}], [{1,b}]), + ?line ok = ukeysort_check(1, [{1,c},{1,b}], [{1,c}]), + ?line ok = ukeysort_check(1, + [{1,c},{1,b},{2,x},{3,p},{2,a}], + [{1,c},{2,x},{3,p}]), + + ?line ok = ukeysort_check(1, [{1,a},{1,b},{1,b}], [{1,a}]), + ?line ok = ukeysort_check(1, [{2,a},{1,b},{2,a}], [{1,b},{2,a}]), + + ?line ok = ukeysort_check_stability(bigfunlist(3)), + ?line ok = ukeysort_check_stability(bigfunlist(10)), + ?line ok = ukeysort_check_stability(bigfunlist(100)), + ?line ok = ukeysort_check_stability(bigfunlist(1000)), + ?line case erlang:system_info(modified_timing_level) of + undefined -> ok = ukeysort_check_stability(bigfunlist(10000)); + _ -> ok + end, + ok. + +ukeysort_error(doc) -> ["ukeysort should exit when given bad arguments"]; +ukeysort_error(suite) -> []; +ukeysort_error(Config) when is_list(Config) -> + ?line {'EXIT', _} = (catch lists:ukeysort(0, [{1,b},{1,c}])), + ?line {'EXIT', _} = (catch lists:ukeysort(3, [{1,b},{1,c}])), + ?line {'EXIT', _} = (catch lists:ukeysort(1.5, [{1,b},{1,c}])), + ?line {'EXIT', _} = (catch lists:ukeysort(x, [{1,b},{1,c}])), + ?line {'EXIT', _} = (catch lists:ukeysort(x, [])), + ?line {'EXIT', _} = (catch lists:ukeysort(x, [{1,b}])), + ?line {'EXIT', _} = (catch lists:ukeysort(1, [a,b])), + ?line {'EXIT', _} = (catch lists:ukeysort(1, [{1,b} | {1,c}])), + ok. + +ukeysort_i(doc) -> ["ukeysort with other key than first element"]; +ukeysort_i(suite) -> []; +ukeysort_i(Config) when is_list(Config) -> + ?line ok = ukeysort_check(2, [{a,2},{b,1},{c,3}], [{b,1},{a,2},{c,3}]), + ok. + +ukeysort_rand(doc) -> ["ukeysort on big randomized lists"]; +ukeysort_rand(suite) -> []; +ukeysort_rand(Config) when is_list(Config) -> + ?line ok = ukeysort_check3(2, biglist(10)), + ?line ok = ukeysort_check3(2, biglist(100)), + ?line ok = ukeysort_check3(2, biglist(1000)), + ?line ok = ukeysort_check3(2, biglist(10000)), + + ?line ok = gen_ukeysort_check(1, ubiglist(10)), + ?line ok = gen_ukeysort_check(1, ubiglist(100)), + ?line ok = gen_ukeysort_check(1, ubiglist(1000)), + ?line ok = gen_ukeysort_check(1, ubiglist(10000)), + ok. + +%% Check that ukeysort/2 is stable and correct relative keysort/2. +%% (this is not affected by the fact that keysort/2 is no longer really +%% stable; ucheck_stability/1 checks ukeysort/2 (and usort/1, of course)) +gen_ukeysort_check(I, Input) -> + U = lists:ukeysort(I, Input), + S = lists:keysort(I, Input), + case U == no_dups_keys(S, I) of + true -> + ok; + false -> + io:format("~w~n", [Input]), + erlang:error(gen_ukeysort_check) + end. + +%% Used for checking that the first copy is kept. +ukeysort_check_stability(L) -> + I = 1, + U = lists:ukeysort(I, L), + S = no_dups_keys(lkeysort(I, L), I), + check_stab(L, U, S, "ukeysort/2", "usort/2"). + +%%% Uniquely keysort a list, check that the returned list is what we +%%% expected, and that it is actually sorted. +ukeysort_check(I, Input, Expected) -> + ?line Expected = lists:ukeysort(I, Input), + ucheck_sorted(I, Input, Expected). + +ukeysort_check3(I, Input) -> + ucheck_sorted(I, 3, Input, lists:ukeysort(I, Input)). + +ucheck_sorted(I, Input, L) -> + ucheck_sorted(I, I, Input, L). + +%%% Check that a list is ukeysorted by element I. Elements comparing +%%% equal should be sorted according to element J. +ucheck_sorted(_I, _J, _Input, []) -> + ok; +ucheck_sorted(I, J, Input, [A | Rest]) -> + case catch ucheck_sorted1(I, J, A, Rest) of + {'EXIT', _} -> + io:format("~w~n", [Input]), + erlang:error(ucheck_sorted); + Reply -> + Reply + end. + +ucheck_sorted1(_I, _J, _A, []) -> + ok; +ucheck_sorted1(I, J, A, [B | Rest]) -> + ok = ukeycompare(I, J, A, B), + ucheck_sorted1(I, J, B, Rest). + +ukeycompare(I, _J, A, B) when element(I, A) < element(I, B) -> + ok; +ukeycompare(I, J, A, B) when A =/= B, + element(I, A) == element(I, B), + element(J, A) =< element(J, B) -> + ok. + + +funsort(doc) -> + ["Tests lists:sort/2"]; +funsort(suite) -> + [funmerge, rfunmerge, + funsort_1, funsort_stable, funsort_error, funsort_rand]. + +funmerge(doc) -> ["Merge two lists using a fun."]; +funmerge(suite) -> []; +funmerge(Config) when is_list(Config) -> + + Two = [1,2], + Six = [1,2,3,4,5,6], + F = fun(X, Y) -> X =< Y end, + + %% 2-way merge + ?line [] = lists:merge(F, [], []), + ?line Two = lists:merge(F, Two, []), + ?line Two = lists:merge(F, [], Two), + ?line Six = lists:merge(F, [1,3,5], [2,4,6]), + ?line Six = lists:merge(F, [2,4,6], [1,3,5]), + ?line Six = lists:merge(F, [1,2,3], [4,5,6]), + ?line Six = lists:merge(F, [4,5,6], [1,2,3]), + ?line Six = lists:merge(F, [1,2,5],[3,4,6]), + ?line [1,2,3,5,7] = lists:merge(F, [1,3,5,7], [2]), + ?line [1,2,3,4,5,7] = lists:merge(F, [1,3,5,7], [2,4]), + ?line [1,2,3,4,5,6,7] = lists:merge(F, [1,3,5,7], [2,4,6]), + ?line [1,2,3,5,7] = lists:merge(F, [2], [1,3,5,7]), + ?line [1,2,3,4,5,7] = lists:merge(F, [2,4], [1,3,5,7]), + ?line [1,2,3,4,5,6,7] = lists:merge(F, [2,4,6], [1,3,5,7]), + + F2 = fun(X,Y) -> element(1,X) =< element(1,Y) end, + ?line [{b,2},{c,11},{c,12},{c,21},{c,22},{e,5}] = + lists:merge(F2,[{c,11},{c,12},{e,5}], [{b,2},{c,21},{c,22}]), + + ok. + +rfunmerge(doc) -> ["Reverse merge two lists using a fun."]; +rfunmerge(suite) -> []; +rfunmerge(Config) when is_list(Config) -> + + Two = [2,1], + Six = [6,5,4,3,2,1], + F = fun(X, Y) -> X =< Y end, + + %% 2-way reversed merge + ?line [] = lists:rmerge(F, [], []), + ?line Two = lists:rmerge(F, Two, []), + ?line Two = lists:rmerge(F, [], Two), + ?line Six = lists:rmerge(F, [5,3,1], [6,4,2]), + ?line Six = lists:rmerge(F, [6,4,2], [5,3,1]), + ?line Six = lists:rmerge(F, [3,2,1], [6,5,4]), + ?line Six = lists:rmerge(F, [6,5,4], [3,2,1]), + ?line Six = lists:rmerge(F, [4,3,2],[6,5,1]), + ?line [7,6,5,3,1] = lists:rmerge(F, [7,5,3,1], [6]), + ?line [7,6,5,4,3,1] = lists:rmerge(F, [7,5,3,1], [6,4]), + ?line [7,6,5,4,3,2,1] = lists:rmerge(F, [7,5,3,1], [6,4,2]), + ?line [7,5,3,2,1] = lists:rmerge(F, [2], [7,5,3,1]), + ?line [7,5,4,3,2,1] = lists:rmerge(F, [4,2], [7,5,3,1]), + ?line [7,6,5,4,3,2,1] = lists:rmerge(F, [6,4,2], [7,5,3,1]), + + F2 = fun(X,Y) -> element(1,X) =< element(1,Y) end, + L1 = [{c,11},{c,12},{e,5}], + L2 = [{b,2},{c,21},{c,22}], + ?line true = + lists:merge(F2, L1, L2) == + lists:reverse(lists:rmerge(F2,lists:reverse(L1), lists:reverse(L2))), + + ok. + + +funsort_1(doc) -> ["sort/2"]; +funsort_1(suite) -> []; +funsort_1(Config) when is_list(Config) -> + ?line ok = funsort_check(1, [], []), + ?line ok = funsort_check(1, [{a,b}], [{a,b}]), + ?line ok = funsort_check(1, [{a,b},{a,b}], [{a,b},{a,b}]), + ?line ok = funsort_check(1, [{a,b},{b,c}], [{a,b},{b,c}]), + ?line ok = funsort_check(1, [{b,c},{a,b}], [{a,b},{b,c}]), + ?line ok = funsort_check(1, + [{1,e},{3,f},{2,y},{0,z},{x,14}], + [{0,z},{1,e},{2,y},{3,f},{x,14}]), + F = funsort_fun(1), + + ?line [{b,1},{c,1}] = lists:sort(F, [{c,1},{b,1}]), + ?line [{a,0},{b,2},{c,3},{d,4}] = + lists:sort(F, [{d,4},{c,3},{b,2},{a,0}]), + ?line [{a,0},{b,1},{b,2},{c,1}] = + lists:sort(F, [{c,1},{b,1},{b,2},{a,0}]), + ?line [{a,0},{b,1},{b,2},{c,1},{d,4}] = + lists:sort(F, [{c,1},{b,1},{b,2},{a,0},{d,4}]), + + SFun = fun(L) -> fun(X) -> funsort_check(1, X, L) end end, + L1 = [{1,a},{1,a},{2,b},{2,b},{3,c},{4,d},{5,e},{6,f}], + ?line lists:foreach(SFun(L1), perms(L1)), + + ok. + +funsort_stable(doc) -> ["sort/2 should be stable"]; +funsort_stable(suite) -> []; +funsort_stable(Config) when is_list(Config) -> + ?line ok = funsort_check(1, [{1,b},{1,c}], [{1,b},{1,c}]), + ?line ok = funsort_check(1, [{1,c},{1,b}], [{1,c},{1,b}]), + ?line ok = funsort_check(1, + [{1,c},{1,b},{2,x},{3,p},{2,a}], + [{1,c},{1,b},{2,x},{2,a},{3,p}]), + ok. + +funsort_error(doc) -> ["sort/2 should exit when given bad arguments"]; +funsort_error(suite) -> []; +funsort_error(Config) when is_list(Config) -> + ?line {'EXIT', _} = (catch lists:sort(1, [{1,b} , {1,c}])), + ?line {'EXIT', _} = (catch lists:sort(fun(X,Y) -> X =< Y end, + [{1,b} | {1,c}])), + ok. + +funsort_rand(doc) -> ["sort/2 on big randomized lists"]; +funsort_rand(suite) -> []; +funsort_rand(Config) when is_list(Config) -> + ?line ok = funsort_check3(1, biglist(10)), + ?line ok = funsort_check3(1, biglist(100)), + ?line ok = funsort_check3(1, biglist(1000)), + ?line ok = funsort_check3(1, biglist(10000)), + ok. + +% Do a keysort +funsort(I, L) -> + lists:sort(funsort_fun(I), L). + +funsort_check3(I, Input) -> + check_sorted(I, 3, Input, funsort(I, Input)). + +%%% Keysort a list, check that the returned list is what we expected, +%%% and that it is actually sorted. +funsort_check(I, Input, Expected) -> + ?line Expected = funsort(I, Input), + check_sorted(I, Input, Expected). + +ufunsort(doc) -> + ["Tests lists:usort/2"]; +ufunsort(suite) -> + [ufunmerge, rufunmerge, + ufunsort_1, ufunsort_stable, ufunsort_error, ufunsort_rand]. + +ufunmerge(suite) -> []; +ufunmerge(doc) -> ["Merge two lists while removing duplicates using a fun."]; +ufunmerge(Conf) when is_list(Conf) -> + + Two = [1,2], + Six = [1,2,3,4,5,6], + F = fun(X, Y) -> X =< Y end, + + %% 2-way unique merge + ?line [] = lists:umerge(F, [], []), + ?line Two = lists:umerge(F, Two, []), + ?line Two = lists:umerge(F, [], Two), + ?line Six = lists:umerge(F, [1,3,5], [2,4,6]), + ?line Six = lists:umerge(F, [2,4,6], [1,3,5]), + ?line Six = lists:umerge(F, [1,2,3], [4,5,6]), + ?line Six = lists:umerge(F, [4,5,6], [1,2,3]), + ?line Six = lists:umerge(F, [1,2,5],[3,4,6]), + ?line [1,2,3,5,7] = lists:umerge(F, [1,3,5,7], [2]), + ?line [1,2,3,4,5,7] = lists:umerge(F, [1,3,5,7], [2,4]), + ?line [1,2,3,4,5,6,7] = lists:umerge(F, [1,3,5,7], [2,4,6]), + ?line [1,2,3,5,7] = lists:umerge(F, [2], [1,3,5,7]), + ?line [1,2,3,4,5,7] = lists:umerge(F, [2,4], [1,3,5,7]), + ?line [1,2,3,4,5,6,7] = lists:umerge(F, [2,4,6], [1,3,5,7]), + + ?line [1,2,3,5,7] = lists:umerge(F, [1,2,3,5,7], [2]), + ?line [1,2,3,4,5,7] = lists:umerge(F, [1,2,3,4,5,7], [2,4]), + ?line [1,2,3,4,5,6,7] = lists:umerge(F, [1,3,5,6,7], [2,4,6]), + ?line [1,2,3,5,7] = lists:umerge(F, [2], [1,2,3,5,7]), + ?line [1,2,3,4,5,7] = lists:umerge(F, [2,4], [1,2,3,4,5,7]), + ?line [1,2,3,4,5,6,7] = lists:umerge(F, [2,4,6], [1,2,3,4,5,6,7]), + + L1 = [{a,1},{a,3},{a,5},{a,7}], + L2 = [{b,1},{b,3},{b,5},{b,7}], + F2 = fun(X,Y) -> element(2,X) =< element(2,Y) end, + ?line L1 = lists:umerge(F2, L1, L2), + ?line [{b,2},{e,5},{c,11},{c,12},{c,21},{c,22}] = + lists:umerge(F2, [{e,5},{c,11},{c,12}], [{b,2},{c,21},{c,22}]), + + ok. + +rufunmerge(suite) -> []; +rufunmerge(doc) -> + ["Reverse merge two lists while removing duplicates using a fun."]; +rufunmerge(Conf) when is_list(Conf) -> + Two = [2,1], + Six = [6,5,4,3,2,1], + F = fun(X, Y) -> X =< Y end, + + %% 2-way reversed unique merge + ?line [] = lists:rumerge(F, [], []), + ?line Two = lists:rumerge(F, Two, []), + ?line Two = lists:rumerge(F, [], Two), + ?line Six = lists:rumerge(F, [5,3,1], [6,4,2]), + ?line Six = lists:rumerge(F, [6,4,2], [5,3,1]), + ?line Six = lists:rumerge(F, [3,2,1], [6,5,4]), + ?line Six = lists:rumerge(F, [6,5,4], [3,2,1]), + ?line Six = lists:rumerge(F, [4,3,2],[6,5,1]), + ?line [7,6,5,3,1] = lists:rumerge(F, [7,5,3,1], [6]), + ?line [7,6,5,4,3,1] = lists:rumerge(F, [7,5,3,1], [6,4]), + ?line [7,6,5,4,3,2,1] = lists:rumerge(F, [7,5,3,1], [6,4,2]), + ?line [7,5,3,2,1] = lists:rumerge(F, [2], [7,5,3,1]), + ?line [7,5,4,3,2,1] = lists:rumerge(F, [4,2], [7,5,3,1]), + ?line [7,6,5,4,3,2,1] = lists:rumerge(F, [6,4,2], [7,5,3,1]), + + ?line [7,6,5,3,1] = lists:rumerge(F, [7,6,5,3,1], [6]), + ?line [7,6,5,4,3,1] = lists:rumerge(F, [7,6,5,4,3,1], [6,4]), + ?line [7,6,5,4,3,2,1] = lists:rumerge(F, [7,6,5,4,3,2,1], [6,4,2]), + ?line [7,5,3,2,1] = lists:rumerge(F, [2], [7,5,3,2,1]), + ?line [7,5,4,3,2,1] = lists:rumerge(F, [4,2], [7,5,4,3,2,1]), + ?line [7,6,5,4,3,2,1] = lists:rumerge(F, [6,4,2], [7,6,5,4,3,2,1]), + + F2 = fun(X,Y) -> element(1,X) =< element(1,Y) end, + L1 = [{1,a},{1,b},{1,a}], + L2 = [{1,a},{1,b},{1,a}], + ?line true = lists:umerge(F2, L1, L2) == + lists:reverse(lists:rumerge(F, lists:reverse(L2), lists:reverse(L1))), + + L3 = [{c,11},{c,12},{e,5}], + L4 = [{b,2},{c,21},{c,22}], + ?line true = + lists:umerge(F2, L3, L4) == + lists:reverse(lists:rumerge(F2,lists:reverse(L3), lists:reverse(L4))), + + ok. + +ufunsort_1(doc) -> ["usort/2"]; +ufunsort_1(suite) -> []; +ufunsort_1(Config) when is_list(Config) -> + ?line ok = ufunsort_check(1, [], []), + ?line ok = ufunsort_check(1, [{a,b}], [{a,b}]), + ?line ok = ufunsort_check(1, [{a,b},{a,b}], [{a,b}]), + ?line ok = ufunsort_check(1, [{a,b},{b,c}], [{a,b},{b,c}]), + ?line ok = ufunsort_check(1, [{b,c},{a,b}], [{a,b},{b,c}]), + ?line ok = ufunsort_check(1, + [{1,e},{3,f},{2,y},{0,z},{x,14}], + [{0,z},{1,e},{2,y},{3,f},{x,14}]), + ?line ok = ufunsort_check(1, + [{1,a},{2,b},{3,c},{2,b},{1,a},{2,b},{3,c}, + {2,b},{1,a}], + [{1,a},{2,b},{3,c}]), + ?line ok = ufunsort_check(1, + [{1,a},{1,a},{1,b},{1,b},{1,a},{2,a}], + [{1,a},{2,a}]), + + F = funsort_fun(1), + L1 = [{1,a},{1,b},{1,a}], + L2 = [{1,a},{1,b},{1,a}], + ?line ok = ufunsort_check(1, lists:keymerge(1, L1, L2), + lists:umerge(F, lists:usort(F, L1), + lists:usort(F, L2))), + L3 = [{1,a},{1,b},{1,a},{2,a}], + ?line ok = ufunsort_check(1, lists:keymerge(1, L3, L2), + lists:umerge(F, lists:usort(F, L3), + lists:usort(F, L2))), + L4 = [{1,b},{1,a}], + ?line ok = ufunsort_check(1, lists:keymerge(1, L1, L4), + lists:umerge(F, lists:usort(F, L1), + lists:usort(F, L4))), + L5 = [{1,a},{1,b},{1,a},{2,a}], + ?line ok = ufunsort_check(1, lists:keymerge(1, L5, []), + lists:umerge(F, lists:usort(F, L5), [])), + L6 = [{3,a}], + ?line ok = ufunsort_check(1, lists:keymerge(1, L5, L6), + lists:umerge(F, lists:usort(F, L5), + lists:usort(F, L6))), + + ?line [{b,1},{c,1}] = lists:usort(F, [{c,1},{c,1},{b,1}]), + ?line [{a,0},{b,2},{c,3},{d,4}] = + lists:usort(F, [{d,4},{c,3},{b,2},{b,2},{a,0}]), + ?line [{a,0},{b,1},{c,1}] = + lists:usort(F, [{c,1},{b,1},{b,1},{b,2},{b,2},{a,0}]), + ?line [{a,0},{b,1},{c,1},{d,4}] = + lists:usort(F, [{c,1},{b,1},{b,2},{a,0},{a,0},{d,4},{d,4}]), + + SFun = fun(L) -> fun(X) -> ufunsort_check(1, X, L) end end, + PL = [{1,a},{2,b},{3,c},{4,d},{5,e},{6,f}], + Ps = perms([{1,a},{2,b},{3,c},{4,d},{5,e},{6,f},{2,b},{1,a}]), + ?line lists:foreach(SFun(PL), Ps), + + ok. + +ufunsort_stable(doc) -> ["usort/2 should be stable"]; +ufunsort_stable(suite) -> []; +ufunsort_stable(Config) when is_list(Config) -> + ?line ok = ufunsort_check(1, [{1,b},{1,c}], [{1,b}]), + ?line ok = ufunsort_check(1, [{1,c},{1,b}], [{1,c}]), + ?line ok = ufunsort_check(1, + [{1,c},{1,b},{2,x},{3,p},{2,a}], + [{1,c},{2,x},{3,p}]), + + ?line ok = ufunsort_check_stability(bigfunlist(10)), + ?line ok = ufunsort_check_stability(bigfunlist(100)), + ?line ok = ufunsort_check_stability(bigfunlist(1000)), + ?line case erlang:system_info(modified_timing_level) of + undefined -> ok = ufunsort_check_stability(bigfunlist(10000)); + _ -> ok + end, + ok. + +ufunsort_error(doc) -> ["usort/2 should exit when given bad arguments"]; +ufunsort_error(suite) -> []; +ufunsort_error(Config) when is_list(Config) -> + ?line {'EXIT', _} = (catch lists:usort(1, [{1,b} , {1,c}])), + ?line {'EXIT', _} = (catch lists:usort(fun(X,Y) -> X =< Y end, + [{1,b} | {1,c}])), + ok. + +ufunsort_rand(doc) -> ["usort/2 on big randomized lists"]; +ufunsort_rand(suite) -> []; +ufunsort_rand(Config) when is_list(Config) -> + ?line ok = ufunsort_check3(1, biglist(10)), + ?line ok = ufunsort_check3(1, biglist(100)), + ?line ok = ufunsort_check3(1, biglist(1000)), + ?line ok = ufunsort_check3(1, biglist(10000)), + + ?line ok = gen_ufunsort_check(1, ubiglist(100)), + ?line ok = gen_ufunsort_check(1, ubiglist(1000)), + ?line ok = gen_ufunsort_check(1, ubiglist(10000)), + ok. + +%% Check that usort/2 is stable and correct relative sort/2. +gen_ufunsort_check(I, Input) -> + U = ufunsort(I, Input), + S = funsort(I, Input), + case U == no_dups_keys(S, I) of + true -> + ok; + false -> + io:format("~w~n", [Input]), + erlang:error(gen_ufunsort_check) + end. + +%% Used for checking that the first copy is kept. +ufunsort_check_stability(L) -> + I = 1, + U = ufunsort(I, L), + S = no_dups(funsort(I, L)), + check_stab(L, U, S, "usort/2", "sort/2"). + +ufunsort_check3(I, Input) -> + ucheck_sorted(I, 3, Input, ufunsort(I, Input)). + +%%% Keysort a list, check that the returned list is what we expected, +%%% and that it is actually sorted. +ufunsort_check(I, Input, Expected) -> + ?line Expected = ufunsort(I, Input), + ucheck_sorted(I, Input, Expected). + +% Do a keysort +ufunsort(I, L) -> + lists:usort(funsort_fun(I), L). + +funsort_fun(I) -> + fun(A, B) when tuple_size(A) >= I, tuple_size(B) >= I -> + element(I, A) =< element(I, B) + end. + +check_stab(L, U, S, US, SS) -> + UP = explicit_pid(U), + SP = explicit_pid(S), + case UP == SP of + true -> + ok; + false -> + io:format("In: ~w~n", [explicit_pid(L)]), + io:format("~s: ~w~n", [US, UP]), + io:format("~s: ~w~n", [SS, SP]), + erlang:error(unstable) + end. + +%%%------------------------------------------------------------ +%%% Generate lists of given length, containing 3-tuples with +%%% random integer elements in the range 0..44 as elements 1 and 2. +%%% Element 3 in the tuple is the position of the tuple in the list. + +biglist(N) -> + {A, B, C} = get_seed(), + random:seed(A, B, C), + biglist(N, []). + +biglist(0, L) -> + L; +biglist(N, L) -> + E = random_tuple(45, N), + biglist(N-1, [E|L]). + +%%%------------------------------------------------------------ +%%% Generate lists of given length, containing 2-tuples with +%%% random integer elements in the range 0..10 as element 1. +%%% Element 2 in the tuple is a random integer in the range 0..5. +%%% No sequence number. + +ubiglist(N) -> + {A, B, C} = get_seed(), + random:seed(A, B, C), + ubiglist(N, []). + +ubiglist(0, L) -> + L; +ubiglist(N, L) -> + E = urandom_tuple(11, 6), + ubiglist(N-1, [E|L]). + +urandom_tuple(N, I) -> + R1 = randint(N), + R2 = randint(I), + {R1, R2}. + +%%%------------------------------------------------------------ +%%% Generate lists of given length, containing 2-tuples with random +%%% integer elements in the range 0..10 as elements 1. All tuples have +%%% the same function as element 2, but every function is created in a +%%% unique process. ==/2 will return 'true' for any pair of functions, +%%% but erlang:fun_info(Fun, pid) can be used for distinguishing +%%% functions created in different processes. The pid acts like a +%%% sequence number. + +bigfunlist(N) -> + {A, B, C} = get_seed(), + random:seed(A, B, C), + bigfunlist_1(N). + +bigfunlist_1(N) when N < 30000 -> % Now (R8) max 32000 different pids. + case catch bigfunlist(N, 0, []) of + {'EXIT', _} -> + bigfunlist_1(N); + Reply -> + Reply + end. + +bigfunlist(0, _P, L) -> + lists:reverse(L); +bigfunlist(N, P, L) -> + {E, NP} = random_funtuple(P, 11), + bigfunlist(N-1, NP, [E | L]). + +random_funtuple(P, N) -> + R = randint(N), + F = make_fun(), + NP = fun_pid(F), + true = NP > P, + {{R, F}, NP}. + +make_fun() -> + Pid = spawn(?MODULE, make_fun, [self()]), + receive {Pid, Fun} -> Fun end. + +make_fun(Pid) -> + Pid ! {self(), fun make_fun/1}. + +fun_pid(Fun) -> + erlang:fun_info(Fun, pid). + +get_seed() -> + case random:seed() of + undefined -> + now(); + Tuple -> + Tuple + end. + +random_tuple(N, Seq) -> + R1 = randint(N), + R2 = randint(N), + {R1, R2, Seq}. + +randint(N) -> + trunc(random:uniform() * N). + +%% The first "duplicate" is kept. +no_dups([]) -> + []; +no_dups([H | T]) -> + no_dups(H, T, []). + +no_dups(H, [H1 | T], L) when H == H1 -> + no_dups(H, T, L); +no_dups(H, [H1 | T], L) -> + no_dups(H1, T, [H | L]); +no_dups(H, [], L) -> + lists:reverse([H | L]). + +%% The first "duplicate" is kept. +no_dups_keys([], _I) -> + []; +no_dups_keys([H | T], I) -> + no_dups_keys(H, T, [], I). + +no_dups_keys(H, [H1 | T], L, I) when element(I, H) == element(I, H1) -> + no_dups_keys(H, T, L, I); +no_dups_keys(H, [H1 | T], L, I) -> + no_dups_keys(H1, T, [H | L], I); +no_dups_keys(H, [], L, _I) -> + lists:reverse([H | L]). + +perms([]) -> + [[]]; +perms(L) -> + [[H|T] || H <- L, T <- perms(L--[H])]. + +%%%------------------------------------------------------------ +%%% Test the sort routines with randomly generated lists. + +-record(state, {sort = 0, usort = 0, stable = 0}). + +%% Run it interactively. 'stop' or 'info' recognized commands. +sort_loop() -> + sort_loop(5000). + +sort_loop(N) when is_integer(N), N > 0 -> + Pid = spawn_link(?MODULE, sloop, [N]), + sort_loop_1(Pid). + +sort_loop_1(Pid) -> + case io:get_line('? ') of + eof -> + ok; + "stop\n" -> + Pid ! {self(), stop}, + receive {Pid, S} -> display_state(S) end; + "info\n" -> + Pid ! {self(), info}, + receive {Pid, S} -> display_state(S) end, + sort_loop_1(Pid); + _Other -> + sort_loop_1(Pid) + end. + +sloop(N) -> + {A, B, C} = get_seed(), + random:seed(A, B, C), + sloop(N, #state{}). + +sloop(N, S) -> + receive + {From, stop} -> + From ! {self(), S}; + {From, info} -> + From ! {self(), S}, + sloop(N, S) + after 0 -> + Len = randint(N), + NS = case randint(3) of + 0 -> + BL = biglist(Len, []), + ok = check(BL), + ok = keysort_check3(1, BL), + ok = funsort_check3(1, BL), + S#state{sort = S#state.sort + 1}; + 1 -> + BL = ubiglist(Len, []), + ok = ucheck(BL), + ok = gen_ukeysort_check(1, BL), + ok = gen_ufunsort_check(1, BL), + S#state{usort = S#state.usort + 1}; + 2 -> + BL = bigfunlist(Len), + %% ok = check_stability(BL), + ok = ucheck_stability(BL), + ok = ukeysort_check_stability(BL), + ok = ufunsort_check_stability(BL), + S#state{stable = S#state.stable + 1} + end, + sloop(N, NS) + end. + +display_state(S) -> + io:format("sort: ~p~n", [S#state.sort]), + io:format("usort: ~p~n", [S#state.usort]), + io:format("stable: ~p~n", [S#state.stable]). + +%% This version of sort/1 is really stable; the order of equal +%% elements is kept. It is used for checking the current +%% implementation of usort/1 etc. + +lsort([X, Y | L] = L0) when X =< Y -> + case L of + [] -> + L0; + [Z] when Y =< Z -> + L0; + [Z] when X =< Z -> + [X, Z, Y]; + [Z] -> + [Z, X, Y]; + _ -> + split_1(X, Y, L, [], []) + end; +lsort([X, Y | L]) -> + case L of + [] -> + [Y, X]; + [Z] when X =< Z -> + [Y, X | L]; + [Z] when Y =< Z -> + [Y, Z, X]; + [Z] -> + [Z, Y, X]; + _ -> + split_2(X, Y, L, [], []) + end; +lsort([_] = L) -> + L; +lsort([] = L) -> + L. + +split_1(X, Y, [Z | L], R, Rs) when Z >= Y -> + split_1(Y, Z, L, [X | R], Rs); +split_1(X, Y, [Z | L], R, Rs) when Z >= X -> + split_1(Z, Y, L, [X | R], Rs); +split_1(X, Y, [Z | L], [], Rs) -> + split_1(X, Y, L, [Z], Rs); +split_1(X, Y, [Z | L], R, Rs) -> + split_1_1(X, Y, L, R, Rs, Z); +split_1(X, Y, [], R, Rs) -> + rmergel([[Y, X | R] | Rs], [], asc). + +split_1_1(X, Y, [Z | L], R, Rs, S) when Z >= Y -> + split_1_1(Y, Z, L, [X | R], Rs, S); +split_1_1(X, Y, [Z | L], R, Rs, S) when Z >= X -> + split_1_1(Z, Y, L, [X | R], Rs, S); +split_1_1(X, Y, [Z | L], R, Rs, S) when S =< Z -> + split_1(S, Z, L, [], [[Y, X | R] | Rs]); +split_1_1(X, Y, [Z | L], R, Rs, S) -> + split_1(Z, S, L, [], [[Y, X | R] | Rs]); +split_1_1(X, Y, [], R, Rs, S) -> + rmergel([[S], [Y, X | R] | Rs], [], asc). + +split_2(X, Y, [Z | L], R, Rs) when Z < Y -> + split_2(Y, Z, L, [X | R], Rs); +split_2(X, Y, [Z | L], R, Rs) when Z < X -> + split_2(Z, Y, L, [X | R], Rs); +split_2(X, Y, [Z | L], [], Rs) -> + split_2(X, Y, L, [Z], Rs); +split_2(X, Y, [Z | L], R, Rs) -> + split_2_1(X, Y, L, R, Rs, Z); +split_2(X, Y, [], R, Rs) -> + mergel([[Y, X | R] | Rs], [], desc). + +split_2_1(X, Y, [Z | L], R, Rs, S) when Z < Y -> + split_2_1(Y, Z, L, [X | R], Rs, S); +split_2_1(X, Y, [Z | L], R, Rs, S) when Z < X -> + split_2_1(Z, Y, L, [X | R], Rs, S); +split_2_1(X, Y, [Z | L], R, Rs, S) when S > Z -> + split_2(S, Z, L, [], [[Y, X | R] | Rs]); +split_2_1(X, Y, [Z | L], R, Rs, S) -> + split_2(Z, S, L, [], [[Y, X | R] | Rs]); +split_2_1(X, Y, [], R, Rs, S) -> + mergel([[S], [Y, X | R] | Rs], [], desc). + +mergel([[] | L], Acc, O) -> + mergel(L, Acc, O); +mergel([T1, [H2 | T2] | L], Acc, asc) -> + mergel(L, [merge2_1(T1, H2, T2, []) | Acc], asc); +mergel([[H2 | T2], T1 | L], Acc, desc) -> + mergel(L, [merge2_1(T1, H2, T2, []) | Acc], desc); +mergel([L], [], _O) -> + L; +mergel([L], Acc, O) -> + rmergel([lists:reverse(L, []) | Acc], [], O); +mergel([], [], _O) -> + []; +mergel([], Acc, O) -> + rmergel(Acc, [], O); +mergel([A, [] | L], Acc, O) -> + mergel([A | L], Acc, O); +mergel([A, B, [] | L], Acc, O) -> + mergel([A, B | L], Acc, O). + +rmergel([[H2 | T2], T1 | L], Acc, asc) -> + rmergel(L, [rmerge2_1(T1, H2, T2, []) | Acc], asc); +rmergel([T1, [H2 | T2] | L], Acc, desc) -> + rmergel(L, [rmerge2_1(T1, H2, T2, []) | Acc], desc); +rmergel([L], Acc, O) -> + mergel([lists:reverse(L, []) | Acc], [], O); +rmergel([], Acc, O) -> + mergel(Acc, [], O). + +merge2_1([H1 | T1], H2, T2, M) when H1 =< H2 -> + merge2_1(T1, H2, T2, [H1 | M]); +merge2_1([H1 | T1], H2, T2, M) -> + merge2_2(T1, H1, T2, [H2 | M]); +merge2_1([], H2, T2, M) -> + lists:reverse(T2, [H2 | M]). + +merge2_2(T1, H1, [H2 | T2], M) when H1 =< H2 -> + merge2_1(T1, H2, T2, [H1 | M]); +merge2_2(T1, H1, [H2 | T2], M) -> + merge2_2(T1, H1, T2, [H2 | M]); +merge2_2(T1, H1, [], M) -> + lists:reverse(T1, [H1 | M]). + +rmerge2_1([H1 | T1], H2, T2, M) when H1 =< H2 -> + rmerge2_2(T1, H1, T2, [H2 | M]); +rmerge2_1([H1 | T1], H2, T2, M) -> + rmerge2_1(T1, H2, T2, [H1 | M]); +rmerge2_1([], H2, T2, M) -> + lists:reverse(T2, [H2 | M]). + +rmerge2_2(T1, H1, [H2 | T2], M) when H1 =< H2 -> + rmerge2_2(T1, H1, T2, [H2 | M]); +rmerge2_2(T1, H1, [H2 | T2], M) -> + rmerge2_1(T1, H2, T2, [H1 | M]); +rmerge2_2(T1, H1, [], M) -> + lists:reverse(T1, [H1 | M]). + + + +%% This version of keysort/2 is really stable; the order of equal +%% elements is kept. It is used for checking the current +%% implementation of ukeysort/2 etc. + +lkeysort(Index, L) when is_integer(Index), Index > 0 -> + case L of + [] -> L; + [_] -> L; + [X, Y | T] -> + EX = element(Index, X), + EY = element(Index, Y), + if + EX =< EY -> + keysplit_1(Index, X, EX, Y, EY, T, [], []); + true -> + keysplit_2(Index, Y, EY, T, [X]) + end + end. + +keysplit_1(I, X, EX, Y, EY, [Z | L], R, Rs) -> + EZ = element(I, Z), + if + EY =< EZ -> + keysplit_1(I, Y, EY, Z, EZ, L, [X | R], Rs); + EX =< EZ -> + keysplit_1(I, Z, EZ, Y, EY, L, [X | R], Rs); + true, R == [] -> + keysplit_1(I, X, EX, Y, EY, L, [Z], Rs); + true -> + keysplit_1_1(I, X, EX, Y, EY, L, R, Rs, Z, EZ) + end; +keysplit_1(I, X, _EX, Y, _EY, [], R, Rs) -> + rkeymergel(I, [[Y, X | R] | Rs], []). + +%% One out-of-order element, S. +keysplit_1_1(I, X, EX, Y, EY, [Z | L], R, Rs, S, ES) -> + EZ = element(I, Z), + if + EY =< EZ -> + keysplit_1_1(I, Y, EY, Z, EZ, L, [X | R], Rs, S, ES); + EX =< EZ -> + keysplit_1_1(I, Z, EZ, Y, EY, L, [X | R], Rs, S, ES); + ES =< EZ -> + keysplit_1(I, S, ES, Z, EZ, L, [], [[Y, X | R] | Rs]); + true -> + keysplit_1(I, Z, EZ, S, ES, L, [], [[Y, X | R] | Rs]) + end; +keysplit_1_1(I, X, _EX, Y, _EY, [], R, Rs, S, _ES) -> + rkeymergel(I, [[S], [Y, X | R] | Rs], []). + +%% Descending. +keysplit_2(I, Y, EY, [Z | L], R) -> + EZ = element(I, Z), + if + EY =< EZ -> + keysplit_1(I, Y, EY, Z, EZ, L, [], [lists:reverse(R, [])]); + true -> + keysplit_2(I, Z, EZ, L, [Y | R]) + end; +keysplit_2(_I, Y, _EY, [], R) -> + [Y | R]. + +keymergel(I, [T1, [H2 | T2] | L], Acc) -> + keymergel(I, L, [keymerge2_1(I, T1, element(I, H2), H2, T2, []) | Acc]); +keymergel(_I, [L], []) -> + L; +keymergel(I, [L], Acc) -> + rkeymergel(I, [lists:reverse(L, []) | Acc], []); +keymergel(I, [], Acc) -> + rkeymergel(I, Acc, []). + +rkeymergel(I, [[H2 | T2], T1 | L], Acc) -> + rkeymergel(I, L, [rkeymerge2_1(I, T1, element(I, H2), H2, T2, []) | Acc]); +rkeymergel(I, [L], Acc) -> + keymergel(I, [lists:reverse(L, []) | Acc], []); +rkeymergel(I, [], Acc) -> + keymergel(I, Acc, []). + +keymerge2_1(I, [H1 | T1], E2, H2, T2, M) -> + E1 = element(I, H1), + if + E1 =< E2 -> + keymerge2_1(I, T1, E2, H2, T2, [H1 | M]); + true -> + keymerge2_2(I, T1, E1, H1, T2, [H2 | M]) + end; +keymerge2_1(_I, [], _E2, H2, T2, M) -> + lists:reverse(T2, [H2 | M]). + +keymerge2_2(I, T1, E1, H1, [H2 | T2], M) -> + E2 = element(I, H2), + if + E1 =< E2 -> + keymerge2_1(I, T1, E2, H2, T2, [H1 | M]); + true -> + keymerge2_2(I, T1, E1, H1, T2, [H2 | M]) + end; +keymerge2_2(_I, T1, _E1, H1, [], M) -> + lists:reverse(T1, [H1 | M]). + +rkeymerge2_1(I, [H1 | T1], E2, H2, T2, M) -> + E1 = element(I, H1), + if + E1 =< E2 -> + rkeymerge2_2(I, T1, E1, T2, [H2 | M], H1); + true -> + rkeymerge2_1(I, T1, E2, H2, T2, [H1 | M]) + end; +rkeymerge2_1(_I, [], _E2, H2, T2, M) -> + lists:reverse(T2, [H2 | M]). + +rkeymerge2_2(I, T1, E1, [H2 | T2], M, H1) -> + E2 = element(I, H2), + if + E1 =< E2 -> + rkeymerge2_2(I, T1, E1, T2, [H2 | M], H1); + true -> + rkeymerge2_1(I, T1, E2, H2, T2, [H1 | M]) + end; +rkeymerge2_2(_I, T1, _E1, [], M, H1) -> + lists:reverse(T1, [H1 | M]). + + +%%%------------------------------------------------------------ + +seq(doc) -> + ["Tests lists:seq/3"]; +seq(suite) -> + [ + seq_loop, + seq_2, seq_3, seq_2_e, seq_3_e]. + +seq_loop(doc) -> + ["Test for infinite loop (OTP-2404)."]; +seq_loop(suite) -> + []; +seq_loop(Config) when is_list(Config) -> + ?line _ = (catch lists:seq(1, 5, -1)), + ok. + +seq_2(doc) -> + ["Non-error cases for seq/2"]; +seq_2(suite) -> + []; +seq_2(Config) when is_list(Config) -> + ?line [1,2,3] = lists:seq(1,3), + ?line [1] = lists:seq(1,1), + ?line Big = 748274827583793785928592859, + ?line Big1 = Big+1, + ?line Big2 = Big+2, + ?line [Big, Big1, Big2] = lists:seq(Big, Big+2), + ok. + +seq_2_e(doc) -> + ["Error cases for seq/2"]; +seq_2_e(suite) -> + []; +seq_2_e(Config) when is_list(Config) -> + ?line seq_error([4, 2]), + ?line seq_error([1, a]), + ?line seq_error([1.0, 2.0]), + ok. + +seq_error(Args) -> + {'EXIT', _} = (catch apply(lists, seq, Args)). + +seq_3(doc) -> + ["Non-error cases for seq/3"]; +seq_3(suite) -> + []; +seq_3(Config) when is_list(Config) -> + ?line [1,2,3] = lists:seq(1,3,1), + ?line [1] = lists:seq(1,1,1), + ?line Big = 748274827583793785928592859, + ?line Big1 = Big+1, + ?line Big2 = Big+2, + ?line [Big, Big1, Big2] = lists:seq(Big, Big+2,1), + + ?line [3,2,1] = lists:seq(3,1,-1), + ?line [1] = lists:seq(1,1,-1), + + ?line [3,1] = lists:seq(3,1,-2), + ?line [1] = lists:seq(1, 10, 10), + ?line [1, 4, 7, 10, 13, 16, 19] = lists:seq(1, 19, 3), + ?line [1, 4, 7, 10, 13, 16, 19] = lists:seq(1, 20, 3), + ?line [1, 4, 7, 10, 13, 16, 19] = lists:seq(1, 21, 3), + + ?line [1] = lists:seq(1, 1, 0), %OTP-2613 + ok. + +seq_3_e(doc) -> + ["Error cases for seq/3"]; +seq_3_e(suite) -> + []; +seq_3_e(Config) when is_list(Config) -> + ?line seq_error([4, 2, 1]), + ?line seq_error([3, 5, -1]), + ?line seq_error([1, a, 1]), + ?line seq_error([1.0, 2.0, 1]), + + ?line seq_error([1, 3, 1.0]), + ?line seq_error([1, 3, a]), + ?line seq_error([1, 3, 0]), + + ?line seq_error([a, a, 0]), + ok. + +otp_7230(doc) -> + ["OTP-7230. seq/1,2 returns the empty list"]; +otp_7230(suite) -> + []; +otp_7230(Config) when is_list(Config) -> + From = -10, + To = 10, + StepFrom = -10, + StepTo = 10, + + L = lists:seq(From, To), + SL = lists:seq(StepFrom, StepTo), + ?line [] = + [{F, T, S} || + F <- L, T <- L, S <- SL, + not check_seq(F, T, S, catch lists:seq(F, T, S)) + orelse + S =:= 1 andalso not check_seq(F, T, S, catch lists:seq(F, T)) + ]. + +check_seq(From, To, 0, R) -> + From =:= To andalso R =:= [From] + orelse + From =/= To andalso is_tuple(R) andalso element(1, R) =:= 'EXIT'; +check_seq(From, To, Step, []) when Step =/= 0 -> + 0 =:= property(From, To, Step) + andalso + ( + Step > 0 andalso To < From andalso From-To =< Step + orelse + Step < 0 andalso To > From andalso To-From =< -Step + ); +check_seq(From, To, Step, R) when R =/= [], To < From, Step > 0 -> + is_tuple(R) andalso element(1, R) =:= 'EXIT'; +check_seq(From, To, Step, R) when R =/= [], To > From, Step < 0 -> + is_tuple(R) andalso element(1, R) =:= 'EXIT'; +check_seq(From, To, Step, L) when is_list(L), L =/= [], Step =/= 0 -> + First = hd(L), + Last = lists:last(L), + Min = lists:min(L), + Max = lists:max(L), + + [] =:= [E || E <- L, not is_integer(E)] + andalso + %% The difference between two consecutive elements is Step: + begin + LS = [First-Step]++L, + LR = L++[Last+Step], + [Step] =:= lists:usort([B-A || {A,B} <- lists:zip(LS, LR)]) + end + andalso + %% The first element of L is From: + From =:= First + andalso + %% No element outside the given interval: + Min >= lists:min([From, To]) + andalso + Max =< lists:max([From, To]) + andalso + %% All elements are present: + abs(To-Last) < abs(Step) + andalso + length(L) =:= property(From, To, Step); +check_seq(_From, _To, _Step, _R) -> + false. + +property(From, To, Step) -> + ((To-From+Step) div Step). + +%%%------------------------------------------------------------ + +sublist(doc) -> + ["Tests lists:sublist/[2,3]"]; +sublist(suite) -> + [sublist_2, sublist_3, sublist_2_e, sublist_3_e]. + +-define(sublist_error2(X,Y), ?line {'EXIT', _} = (catch lists:sublist(X,Y))). +-define(sublist_error3(X,Y,Z), ?line {'EXIT', _} = (catch lists:sublist(X,Y,Z))). + +sublist_2(doc) -> ["sublist/2"]; +sublist_2(suite) -> []; +sublist_2(Config) when is_list(Config) -> + ?line [] = lists:sublist([], 0), + ?line [] = lists:sublist([], 1), + ?line [] = lists:sublist([a], 0), + ?line [a] = lists:sublist([a], 1), + ?line [a] = lists:sublist([a], 2), + ?line [a] = lists:sublist([a|b], 1), + + ?line [a,b] = lists:sublist([a,b|c], 2), + + ok. + +sublist_2_e(doc) -> ["sublist/2 error cases"]; +sublist_2_e(suite) -> []; +sublist_2_e(Config) when is_list(Config) -> + ?sublist_error2([], -1), + ?sublist_error2(a, -1), + ?sublist_error2(a, 0), + ?sublist_error2([a|b], 2), + ?sublist_error2([a], x), + ?sublist_error2([a], 1.5), + ?sublist_error2([], x), + ?sublist_error2([], 1.5), + ok. + +sublist_3(doc) -> ["sublist/3"]; +sublist_3(suite) -> []; +sublist_3(Config) when is_list(Config) -> + ?line [] = lists:sublist([], 1, 0), + ?line [] = lists:sublist([], 1, 1), + ?line [] = lists:sublist([a], 1, 0), + ?line [a] = lists:sublist([a], 1, 1), + ?line [a] = lists:sublist([a], 1, 2), + ?line [a] = lists:sublist([a|b], 1, 1), + + ?line [] = lists:sublist([], 1, 0), + ?line [] = lists:sublist([], 1, 1), + ?line [] = lists:sublist([a], 1, 0), + ?line [a] = lists:sublist([a], 1, 1), + ?line [a] = lists:sublist([a], 1, 2), + ?line [] = lists:sublist([a], 2, 1), + ?line [] = lists:sublist([a], 2, 2), + ?line [] = lists:sublist([a], 2, 79), + ?line [] = lists:sublist([a,b|c], 1, 0), + ?line [] = lists:sublist([a,b|c], 2, 0), + ?line [a] = lists:sublist([a,b|c], 1, 1), + ?line [b] = lists:sublist([a,b|c], 2, 1), + ?line [a,b] = lists:sublist([a,b|c], 1, 2), + + ?line [] = lists:sublist([a], 2, 0), + + ok. + +sublist_3_e(doc) -> ["sublist/3 error cases"]; +sublist_3_e(suite) -> []; +sublist_3_e(Config) when is_list(Config) -> + ?sublist_error3([], 1, -1), + ?sublist_error3(a, 1, -1), + ?sublist_error3(a, 1, 0), + ?sublist_error3([a|b], 1, 2), + ?sublist_error3([a], 1, x), + ?sublist_error3([a], 1, 1.5), + ?sublist_error3([], 1, x), + ?sublist_error3([], 1, 1.5), + + ?sublist_error3([], -1, 0), + ?sublist_error3(a, x, -1), + ?sublist_error3([a,b], 0.5, 1), + ?sublist_error3([a,b], 1.5, 1), + ?sublist_error3([a], 1, x), + ?sublist_error3([a], 1, 1.5), + ?sublist_error3([], 1, x), + ?sublist_error3([], 1, 1.5), + + ?sublist_error3([a], 0, -1), + ?sublist_error3([a], 1, -1), + ?sublist_error3([a], 2, -1), + ?sublist_error3([a], 0, 0), + ?sublist_error3([a], 0, 1), + + ?sublist_error3([a,b|c], 2, 2), + ?sublist_error3([a,b|c], 3, 0), + ?sublist_error3([a,b|c], 3, 1), + ok. + +%%%------------------------------------------------------------ + +flatten(doc) -> + ["Tests lists:flatten/[1,2]"]; +flatten(suite) -> + [flatten_1, flatten_2, flatten_1_e, flatten_2_e]. + +-define(flatten_error1(X), ?line {'EXIT', _} = (catch lists:flatten(X))). +-define(flatten_error2(X,Y), ?line {'EXIT', _} = (catch lists:flatten(X,Y))). + +flatten_1(doc) -> ["flatten/1"]; +flatten_1(suite) -> []; +flatten_1(Config) when is_list(Config) -> + ?line [] = lists:flatten([]), + ?line [1,2] = lists:flatten([1,2]), + ?line [1,2] = lists:flatten([1,[2]]), + ?line [1,2] = lists:flatten([[1],2]), + ?line [1,2] = lists:flatten([[1],[2]]), + ?line [1,2] = lists:flatten([[1,2]]), + ?line [a,b,c,d] = lists:flatten([[a],[b,c,[d]]]), + + ok. + +flatten_1_e(doc) -> ["flatten/1 error cases"]; +flatten_1_e(suite) -> []; +flatten_1_e(Config) when is_list(Config) -> + ?flatten_error1(a), + ?flatten_error1([a|b]), + ?flatten_error1([[a],[b|c],[d]]), + ok. + +%%% [arndt] What if second arg isn't a proper list? This issue isn't +%%% clear-cut. Right now, I think that any term should be allowed. +%%% But I also wish this function didn't exist at all. + +flatten_2(doc) -> ["flatten/2"]; +flatten_2(suite) -> []; +flatten_2(Config) when is_list(Config) -> + ?line [] = lists:flatten([]), + ?line [a] = lists:flatten([a]), + ok. + +flatten_2_e(doc) -> ["flatten/2 error cases"]; +flatten_2_e(suite) -> []; +flatten_2_e(Config) when is_list(Config) -> + ok. + +%% Test lists:zip/2, lists:unzip/1. +zip_unzip(Config) when is_list(Config) -> + ?line [] = lists:zip([], []), + ?line [{a,b}] = lists:zip([a], [b]), + ?line [{42.0,{kalle,nisse}},{a,b}] = lists:zip([42.0,a], [{kalle,nisse},b]), + + %% Longer lists. + ?line SeqA = lists:seq(45, 200), + ?line SeqB = [A*A || A <- SeqA], + ?line AB = lists:zip(SeqA, SeqB), + ?line SeqA = [A || {A,_} <- AB], + ?line SeqB = [B || {_,B} <- AB], + ?line {SeqA,SeqB} = lists:unzip(AB), + + %% Some more unzip/1. + ?line {[],[]} = lists:unzip([]), + ?line {[a],[b]} = lists:unzip([{a,b}]), + ?line {[a,c],[b,d]} = lists:unzip([{a,b},{c,d}]), + + %% Error cases. + ?line {'EXIT',{function_clause,_}} = (catch lists:zip([], [b])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zip([a], [])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zip([a], [b,c])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zip([a], [b,c])), + ok. + +%% Test lists:zip3/3, lists:unzip3/1. +zip_unzip3(Config) when is_list(Config) -> + ?line [] = lists:zip3([], [], []), + ?line [{a,b,c}] = lists:zip3([a], [b], [c]), + + %% Longer lists. + ?line SeqA = lists:seq(45, 200), + ?line SeqB = [2*A || A <- SeqA], + ?line SeqC = [A*A || A <- SeqA], + ?line ABC = lists:zip3(SeqA, SeqB, SeqC), + ?line SeqA = [A || {A,_,_} <- ABC], + ?line SeqB = [B || {_,B,_} <- ABC], + ?line SeqC = [C || {_,_,C} <- ABC], + ?line {SeqA,SeqB,SeqC} = lists:unzip3(ABC), + + %% Some more unzip3/1. + ?line {[],[],[]} = lists:unzip3([]), + ?line {[a],[b],[c]} = lists:unzip3([{a,b,c}]), + + %% Error cases. + ?line {'EXIT',{function_clause,_}} = (catch lists:zip3([], [], [c])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zip3([], [b], [])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zip3([a], [], [])), + + ok. + +%% Test lists:zipwith/3. +zipwith(Config) when is_list(Config) -> + Zip = fun(A, B) -> [A|B] end, + + ?line [] = lists:zipwith(Zip, [], []), + ?line [[a|b]] = lists:zipwith(Zip, [a], [b]), + + %% Longer lists. + ?line SeqA = lists:seq(77, 300), + ?line SeqB = [A*A || A <- SeqA], + ?line AB = lists:zipwith(Zip, SeqA, SeqB), + ?line SeqA = [A || [A|_] <- AB], + ?line SeqB = [B || [_|B] <- AB], + + %% Error cases. + ?line {'EXIT',{function_clause,_}} = (catch lists:zipwith(badfun, [], [])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zipwith(Zip, [], [b])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zipwith(Zip, [a], [])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zipwith(Zip, [a], [b,c])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zipwith(Zip, [a], [b,c])), + ok. + +%% Test lists:zipwith3/4. +zipwith3(Config) when is_list(Config) -> + Zip = fun(A, B, C) -> [A,B,C] end, + + ?line [] = lists:zipwith3(Zip, [], [], []), + ?line [[a,b,c]] = lists:zipwith3(Zip, [a], [b], [c]), + + %% Longer lists. + ?line SeqA = lists:seq(45, 200), + ?line SeqB = [2*A || A <- SeqA], + ?line SeqC = [A*A || A <- SeqA], + ?line ABC = lists:zipwith3(Zip, SeqA, SeqB, SeqC), + ?line SeqA = [A || [A,_,_] <- ABC], + ?line SeqB = [B || [_,B,_] <- ABC], + ?line SeqC = [C || [_,_,C] <- ABC], + + %% Error cases. + ?line {'EXIT',{function_clause,_}} = (catch lists:zipwith3(badfun, [], [], [])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zipwith3(Zip, [], [], [c])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zipwith3(Zip, [], [b], [])), + ?line {'EXIT',{function_clause,_}} = (catch lists:zipwith3(Zip, [a], [], [])), + + ok. + +%% Test lists:filter/2, lists:partition/2. +filter_partition(Config) when is_list(Config) -> + F = fun(I) -> I rem 2 =:= 0 end, + ?line filpart(F, [], []), + ?line filpart(F, [1], []), + ?line filpart(F, [1,3,17], []), + ?line filpart(F, [1,2,3,17], [2]), + ?line filpart(F, [6,8,1,2,3,17], [6,8,2]), + ?line filpart(F, [6,8,1,2,42,3,17], [6,8,2,42]), + + %% Error cases. + ?line {'EXIT',{function_clause,_}} = (catch lists:filter(badfun, [])), + ?line {'EXIT',{function_clause,_}} = (catch lists:partition(badfun, [])), + ok. + +filpart(F, All, Exp) -> + Exp = lists:filter(F, All), + Other = lists:filter(fun(E) -> not F(E) end, All), + {Exp,Other} = lists:partition(F, All). + +tickets(doc) -> + ["Ticktes."]; +tickets(suite) -> + [otp_5939, otp_6023, otp_6606, otp_7230]. + +otp_5939(doc) -> ["OTP-5939. Guard tests added."]; +otp_5939(suite) -> []; +otp_5939(Config) when is_list(Config) -> + Fun1 = fun(A) -> A end, + Fun2 = fun(A, B) -> {A,B} end, + Fun3 = fun(A, B, C) -> {A,B,C} end, + Pred = fun(_A) -> true end, + Fold = fun(_E, A) -> A end, + MapFold = fun(E, A) -> {E,A} end, + + ?line {'EXIT', _} = (catch lists:usort( [asd], [qwe])), + + ?line {'EXIT', _} = (catch lists:zipwith(func, [], [])), + ?line [] = lists:zipwith(Fun2, [], []), + ?line {'EXIT', _} = (catch lists:zipwith3(func, [], [], [])), + ?line [] = lists:zipwith3(Fun3, [], [], []), + ?line {'EXIT', _} = (catch lists:keymap(func, 1, [])), + ?line {'EXIT', _} = (catch lists:keymap(Fun1, 0, [])), + ?line [] = lists:keymap(Fun1, 1, []), + ?line {'EXIT', _} = (catch lists:merge(func, [], [1])), + ?line {'EXIT', _} = (catch lists:merge(func, [1], [])), + ?line [] = lists:merge(Fun2, [], []), + ?line {'EXIT', _} = (catch lists:rmerge(func, [], [1])), + ?line {'EXIT', _} = (catch lists:rmerge(func, [1], [])), + ?line [] = lists:rmerge(Fun2, [], []), + ?line {'EXIT', _} = (catch lists:usort(func, [])), + ?line {'EXIT', _} = (catch lists:usort(func, [a])), + ?line {'EXIT', _} = (catch lists:usort(func, [a, b])), + ?line [] = lists:usort(Fun2, []), + ?line {'EXIT', _} = (catch lists:umerge(func, [], [1])), + ?line {'EXIT', _} = (catch lists:merge(func, [1], [])), + ?line [] = lists:umerge(Fun2, [], []), + ?line {'EXIT', _} = (catch lists:rumerge(func, [], [1])), + ?line {'EXIT', _} = (catch lists:rumerge(func, [1], [])), + ?line [] = lists:rumerge(Fun2, [], []), + ?line {'EXIT', _} = (catch lists:all(func, [])), + ?line true = lists:all(Pred, []), + ?line {'EXIT', _} = (catch lists:any(func, [])), + ?line false = lists:any(Pred, []), + ?line {'EXIT', _} = (catch lists:map(func, [])), + ?line [] = lists:map(Fun1, []), + ?line {'EXIT', _} = (catch lists:flatmap(func, [])), + ?line [] = lists:flatmap(Fun1, []), + ?line {'EXIT', _} = (catch lists:foldl(func, [], [])), + ?line [] = lists:foldl(Fold, [], []), + ?line {'EXIT', _} = (catch lists:foldr(func, [], [])), + ?line [] = lists:foldr(Fold, [], []), + ?line {'EXIT', _} = (catch lists:filter(func, [])), + ?line [] = lists:filter(Pred, []), + ?line {'EXIT', _} = (catch lists:partition(func, [])), + ?line {[],[]} = lists:partition(Pred, []), + ?line {'EXIT', _} = (catch lists:zf(func, [])), + ?line [] = lists:zf(Fun1, []), + ?line {'EXIT', _} = (catch lists:foreach(func, [])), + ?line ok = lists:foreach(Fun1, []), + ?line {'EXIT', _} = (catch lists:mapfoldl(func, [], [])), + ?line {[],[]} = lists:mapfoldl(MapFold, [], []), + ?line {'EXIT', _} = (catch lists:mapfoldr(func, [], [])), + ?line {[],[]} = lists:mapfoldr(MapFold, [], []), + ?line {'EXIT', _} = (catch lists:takewhile(func, [])), + ?line [] = lists:takewhile(Pred, []), + ?line {'EXIT', _} = (catch lists:dropwhile(func, [])), + ?line [] = lists:dropwhile(Pred, []), + ?line {'EXIT', _} = (catch lists:splitwith(func, [])), + ?line {[],[]} = lists:splitwith(Pred, []), + + ok. + +otp_6023(doc) -> ["OTP-6023. lists:keyreplace/4, a typecheck."]; +otp_6023(suite) -> []; +otp_6023(Config) when is_list(Config) -> + ?line {'EXIT', _} = (catch lists:keyreplace(a, 2, [{1,a}], b)), + ?line [{2,b}] = lists:keyreplace(a, 2, [{1,a}], {2,b}), + + ok. + +otp_6606(doc) -> ["OTP-6606. sort and keysort bug"]; +otp_6606(suite) -> []; +otp_6606(Config) when is_list(Config) -> + I = 1, + F = float(1), + L1 = [{F,I},{F,F},{I,I},{I,F}], + ?line L1 = lists:keysort(1, L1), + ?line L1 = lists:sort(L1), + L2 = [{I,I},{I,F},{F,I},{F,F}], + ?line L2 = lists:keysort(1, L2), + ?line L2 = lists:sort(L2), + ok. + +%% Test lists:suffix/2. +suffix(Config) when is_list(Config) -> + ?line true = lists:suffix([], []), + ?line true = lists:suffix([], [a]), + ?line true = lists:suffix([], [a,b]), + ?line true = lists:suffix([], [a,b,c]), + ?line true = lists:suffix([a], lists:duplicate(200000, a)), + ?line true = lists:suffix(lists:seq(1, 1024), + lists:seq(2, 64000) ++ lists:seq(1, 1024)), + ?line true = lists:suffix(lists:duplicate(20000, a), + lists:duplicate(200000, a)), + ?line true = lists:suffix([2.0,3.0], [1.0,2.0,3.0]), + + %% False cases. + ?line false = lists:suffix([a], []), + ?line false = lists:suffix([a,b,c], []), + ?line false = lists:suffix([a,b,c], [b,c]), + ?line false = lists:suffix([a,b,c], [a,b,c,a,b]), + ?line false = lists:suffix(lists:duplicate(199999, a)++[b], + lists:duplicate(200000, a)), + ?line false = lists:suffix([2.0,3.0], [1,2,3]), + + %% Error cases. + ?line {'EXIT',_} = (catch lists:suffix({a,b,c}, [])), + ?line {'EXIT',_} = (catch lists:suffix([], {a,b})), + ?line {'EXIT',_} = (catch lists:suffix([a|b], [])), + ?line {'EXIT',_} = (catch lists:suffix([a,b|c], [a|b])), + ?line {'EXIT',_} = (catch lists:suffix([a|b], [a,b|c])), + ?line {'EXIT',_} = (catch lists:suffix([a|b], [a|b])), + + ok. + +%% Test lists:subtract/2 and the '--' operator. +subtract(Config) when is_list(Config) -> + ?line [] = sub([], []), + ?line [] = sub([], [a]), + ?line [] = sub([], lists:seq(1, 1024)), + ?line sub_non_matching([a], []), + ?line sub_non_matching([1,2], [make_ref()]), + ?line sub_non_matching(lists:seq(1, 1024), [make_ref(),make_ref()]), + + %% Matching subtracts. + ?line [] = sub([a], [a]), + ?line [a] = sub([a,b], [b]), + ?line [a] = sub([a,b], [b,c]), + ?line [a] = sub([a,b,c], [b,c]), + ?line [a] = sub([a,b,c], [b,c]), + ?line [d,a,a] = sub([a,b,c,d,a,a], [a,b,c]), + ?line [d,x,a] = sub([a,b,c,d,a,x,a], [a,b,c,a]), + ?line [1,2,3,4,5,6,7,8,9,9999,10000,20,21,22] = + sub(lists:seq(1, 10000)++[20,21,22], lists:seq(10, 9998)), + + %% Floats/integers. + ?line [42.0,42.0] = sub([42.0,42,42.0], [42,42,42]), + ?line [1,2,3,4,43.0] = sub([1,2,3,4,5,42.0,43.0], [42.0,5]), + + %% Crashing subtracts. + ?line {'EXIT',_} = (catch sub([], [a|b])), + ?line {'EXIT',_} = (catch sub([a], [a|b])), + ?line {'EXIT',_} = (catch sub([a|b], [])), + ?line {'EXIT',_} = (catch sub([a|b], [])), + ?line {'EXIT',_} = (catch sub([a|b], [a])), + + ok. + +sub_non_matching(A, B) -> + A = sub(A, B). + +sub(A, B) -> + Res = A -- B, + Res = lists:subtract(A, B). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/log_mf_h_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/log_mf_h_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/log_mf_h_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/log_mf_h_SUITE.erl 2009-11-20 13:30:03.000000000 +0000 @@ -0,0 +1,92 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(log_mf_h_SUITE). + +-include("test_server.hrl"). +-include_lib("kernel/include/file.hrl"). + +-export([all/1, test/1]). + +all(suite) -> [test]. + + +%%----------------------------------------------------------------- +%% This is actually very basic tests, maybe we could test some more +%% in the future... +%%----------------------------------------------------------------- + +test(Config) when is_list(Config) -> + ?line {ok, Pid} = gen_event:start_link(), + ?line PrivDir = ?config(priv_dir, Config), + Log1 = PrivDir ++ "/log1", + ?line ok = file:make_dir(Log1), + Args1 = log_mf_h:init(Log1, 500, 3), + gen_event:add_handler(Pid, log_mf_h, Args1), + generate(Pid, 200), + {ok, Files} = file:list_dir(Log1), + ?line true = lists:member("1", Files), + ?line true = lists:member("index", Files), + ?line false = lists:member("2", Files), + generate(Pid, 2500), + %% The documentation doesn't guarantee that syncing one request + %% causes all previous ones to be finished too, but that seems to + %% be the case. We need to be sure that the files exist when we + %% look for them with 'list_dir'. + gen_event:sync_notify(Pid, "end"), + {ok, Files2} = file:list_dir(Log1), + ?line true = lists:member("1", Files2), + ?line true = lists:member("2", Files2), + ?line true = lists:member("3", Files2), + ?line false = lists:member("4", Files2), + ?line true = lists:member("index", Files2), + ?line {ok, #file_info{size=Size1,type=regular}} = file:read_file_info(Log1 ++ "/1"), + ?line if Size1 > 500 -> test_server:fail({too_big, Size1}); + true -> ok end, + ?line {ok, #file_info{size=Size2,type=regular}} = file:read_file_info(Log1 ++ "/2"), + ?line if Size2 > 500 -> test_server:fail({too_big, Size2}); + true -> ok end, + ?line {ok, #file_info{size=Size3,type=regular}} = file:read_file_info(Log1 ++ "/3"), + ?line if Size3 > 500 -> test_server:fail({too_big, Size3}); + true -> ok end, + gen_event:delete_handler(Pid, log_mf_h, []), + ?line {ok, Index} = read_index_file(Log1), + gen_event:add_handler(Pid, log_mf_h, Args1), + X = if Index == 3 -> 1; true -> Index + 1 end, + ?line {ok, X} = read_index_file(Log1). + + +generate(Pid, Bytes) when Bytes > 32 -> + gen_event:notify(Pid, make_list(32, [])), + generate(Pid, Bytes - 32); +generate(_, _) -> ok. + +make_list(0, Res) -> Res; +make_list(N, Res) -> make_list(N-1, [67 | Res]). + + +read_index_file(Dir) -> + case file:open(Dir ++ "/index", [read,raw]) of + {ok, Fd} -> + case catch file:read(Fd, 1) of + {ok, [Index]} -> {ok, Index}; + _ -> error + end; + _ -> error + end. + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/Makefile erlang-13.b.3-dfsg/lib/stdlib/test/Makefile --- erlang-13.b.1-dfsg/lib/stdlib/test/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/Makefile 2009-03-12 12:18:53.000000000 +0000 @@ -0,0 +1,134 @@ +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + +MODULES= \ + array_SUITE \ + base64_SUITE \ + beam_lib_SUITE \ + c_SUITE \ + calendar_SUITE \ + dets_SUITE \ + dict_SUITE \ + dict_test_lib \ + digraph_SUITE \ + digraph_utils_SUITE \ + dummy1_h \ + dummy_h \ + epp_SUITE \ + erl_eval_helper \ + erl_eval_SUITE \ + erl_expand_records_SUITE \ + erl_internal_SUITE \ + erl_lint_SUITE \ + erl_pp_SUITE \ + erl_scan_SUITE \ + escript_SUITE \ + ets_SUITE \ + ets_tough_SUITE \ + filelib_SUITE \ + file_sorter_SUITE \ + filename_SUITE \ + fixtable_SUITE \ + format_SUITE \ + gen_event_SUITE \ + gen_fsm_SUITE \ + gen_server_SUITE \ + id_transform_SUITE \ + io_SUITE \ + io_proto_SUITE \ + lists_SUITE \ + log_mf_h_SUITE \ + ms_transform_SUITE \ + proc_lib_SUITE \ + qlc_SUITE \ + queue_SUITE \ + random_SUITE \ + re_SUITE \ + run_pcre_tests \ + re_testoutput1_replacement_test \ + re_testoutput1_split_test \ + slave_SUITE \ + sets_SUITE \ + sets_test_lib \ + sofs_SUITE \ + stdlib_SUITE \ + string_SUITE \ + supervisor_1 \ + naughty_child \ + shell_SUITE \ + supervisor_SUITE \ + supervisor_bridge_SUITE \ + sys_SUITE \ + tar_SUITE \ + timer_SUITE \ + timer_simple_SUITE \ + unicode_SUITE \ + win32reg_SUITE \ + y2k_SUITE \ + select_SUITE \ + zip_SUITE \ + random_unicode_list \ + random_iolist \ + error_logger_forwarder + +ERL_FILES= $(MODULES:%=%.erl) + +TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) + +INSTALL_PROGS= $(TARGET_FILES) + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/stdlib_test + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- + +ERL_MAKE_FLAGS += +ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/test_server/include \ + -I$(ERL_TOP)/lib/kernel/include + +EBIN = . + +EMAKEFILE=Emakefile +COVERFILE=stdlib.cover + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- + +make_emakefile: + $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES) \ + >> $(EMAKEFILE) + +tests debug opt: make_emakefile + erl $(ERL_MAKE_FLAGS) -make + +clean: + rm -f $(EMAKEFILE) + rm -f $(TARGET_FILES) + rm -f core + +docs: + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + +release_spec: opt + +release_tests_spec: make_emakefile + $(INSTALL_DIR) $(RELSYSDIR) + $(INSTALL_DATA) stdlib.spec stdlib.spec.vxworks $(EMAKEFILE) \ + $(ERL_FILES) $(COVERFILE) $(RELSYSDIR) + chmod -f -R u+w $(RELSYSDIR) + @tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -) + +release_docs_spec: diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/ms_transform_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/ms_transform_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/ms_transform_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/ms_transform_SUITE.erl 2009-11-20 13:31:43.000000000 +0000 @@ -0,0 +1,730 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(ms_transform_SUITE). +-author('pan@erix.ericsson.se'). + +-include("test_server.hrl"). + +-export([all/1]). +-export([basic_ets/1]). +-export([basic_dbg/1]). +-export([from_shell/1]). +-export([records/1]). +-export([record_index/1]). +-export([multipass/1]). +-export([top_match/1]). +-export([old_guards/1]). +-export([autoimported/1]). +-export([semicolon/1]). +-export([bitsyntax/1]). +-export([record_defaults/1]). +-export([andalso_orelse/1]). +-export([float_1_function/1]). +-export([action_function/1]). +-export([init_per_testcase/2, fin_per_testcase/2]). + +init_per_testcase(_Func, Config) -> + Dog=test_server:timetrap(test_server:seconds(360)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Func, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog). + +all(suite) -> [from_shell,basic_ets,basic_dbg,records,record_index,multipass, + bitsyntax, record_defaults, andalso_orelse, + float_1_function, action_function, + top_match, old_guards, autoimported, semicolon]. + +andalso_orelse(suite) -> + []; +andalso_orelse(doc) -> + ["Tests that andalso and orelse are allowed in guards."]; +andalso_orelse(Config) when list(Config) -> + ?line setup(Config), + ?line [{{'$1','$2'}, + [{'and',{is_integer,'$1'},{'>',{'+','$1',5},'$2'}}], + [{'andalso','$1','$2'}]}] = + compile_and_run(<<"ets:fun2ms(fun({A,B}) " + " when is_integer(A) and (A+5 > B) -> " + " A andalso B " + " end)">>), + ?line [{{'$1','$2'}, + [{'or',{is_atom,'$1'},{'>',{'+','$1',5},'$2'}}], + [{'orelse','$1','$2'}]}] = + compile_and_run(<<"ets:fun2ms(fun({A,B}) " + " when is_atom(A) or (A+5 > B) -> " + " A orelse B " + " end)">>), + ?line [{{'$1','$2'}, + [{'andalso',{is_integer,'$1'},{'>',{'+','$1',5},'$2'}}], + ['$1']}] = + compile_and_run( + <<"ets:fun2ms(fun({A,B}) when is_integer(A) andalso (A+5 > B) ->" + " A " + " end)">>), + ?line [{{'$1','$2'}, + [{'orelse',{is_atom,'$1'},{'>',{'+','$1',5},'$2'}}], + ['$1']}] = + compile_and_run( + <<"ets:fun2ms(fun({A,B}) when is_atom(A) orelse (A+5 > B) -> " + " A " + " end)">>), + ok. + + +bitsyntax(suite) -> + []; +bitsyntax(doc) -> + ["Tests that bitsyntax works and does not work where appropriate"]; +bitsyntax(Config) when list(Config) -> + ?line setup(Config), + ?line [{'_',[], + [<<0,27,0,27>>]}] = + compile_and_run(<<"A = 27, " + "ets:fun2ms(fun(_) -> <> end)">>), + ?line [{{<<15,47>>, + '$1', + '$2'}, + [{'=:=','$1', + <<0,27>>}, + {'=:=','$2', + <<27,28,19>>}], + [<<188,0,13>>]}] = + compile_and_run(<<"A = 27, " + "ets:fun2ms(" + " fun({<<15,47>>,B,C}) " + " when B =:= <>, C =:= <<27,28,19>> -> " + " <> " + " end)">>), + ?line expect_failure( + <<>>, + <<"ets:fun2ms(fun({<<15,47>>,B,C}) " + " when B =:= <<16>>, C =:= <<27,28,19>> -> " + " <> " + " end)">>), + ?line expect_failure( + <<>>, + <<"ets:fun2ms(fun({<>,B,C}) " + " when B =:= <<16>>, C =:= <<27,28,19>> -> " + " <> " + " end)">>), + ok. + +record_defaults(suite) -> + []; +record_defaults(doc) -> + ["Tests that record defaults works"]; +record_defaults(Config) when list(Config) -> + ?line setup(Config), + ?line [{{<<27>>,{a,5,'$1',hej,hej}}, + [], + [{{a,hej,{'*','$1',2},flurp,flurp}}]}] = + compile_and_run(<<"-record(a,{a,b,c,d=foppa}).">>, + <<"ets:fun2ms(fun({<<27>>,#a{a=5, b=B,_=hej}}) -> " + "#a{a=hej,b=B*2,_=flurp} " + "end)">>), + ok. + +basic_ets(suite) -> + []; +basic_ets(doc) -> + ["Tests basic ets:fun2ms"]; +basic_ets(Config) when list(Config) -> + ?line setup(Config), + ?line [{{a,b},[],[true]}] = compile_and_run( + <<"ets:fun2ms(fun({a,b}) -> true end)">>), + ?line [{{'$1',foo},[{is_list,'$1'}],[{{{hd,'$1'},'$_'}}]}, + {{'$1','$1'},[{is_tuple,'$1'}],[{{{element,1,'$1'},'$*'}}]}] = + compile_and_run(<<"ets:fun2ms(fun({X,foo}) when is_list(X) -> ", + "{hd(X),object()};", + "({X,X}) when is_tuple(X) ->", + "{element(1,X),bindings()}", + "end)">>), + ?line [{{'$1','$2'},[],[{{'$2','$1'}}]}] = + compile_and_run(<<"ets:fun2ms(fun({A,B}) -> {B,A} end)">>), + ?line [{{'$1','$2'},[],[['$2','$1']]}] = + compile_and_run(<<"ets:fun2ms(fun({A,B}) -> [B,A] end)">>), + ok. + +basic_dbg(suite) -> + []; +basic_dbg(doc) -> + ["Tests basic ets:fun2ms"]; +basic_dbg(Config) when list(Config) -> + ?line setup(Config), + ?line [{[a,b],[],[{message,banan},{return_trace}]}] = + compile_and_run(<<"dbg:fun2ms(fun([a,b]) -> message(banan), ", + "return_trace() end)">>), + ?line [{['$1','$2'],[],[{{'$2','$1'}}]}] = + compile_and_run(<<"dbg:fun2ms(fun([A,B]) -> {B,A} end)">>), + ?line [{['$1','$2'],[],[['$2','$1']]}] = + compile_and_run(<<"dbg:fun2ms(fun([A,B]) -> [B,A] end)">>), + ?line [{['$1','$2'],[],['$*']}] = + compile_and_run(<<"dbg:fun2ms(fun([A,B]) -> bindings() end)">>), + ?line [{['$1','$2'],[],['$_']}] = + compile_and_run(<<"dbg:fun2ms(fun([A,B]) -> object() end)">>), + ok. + +from_shell(suite) -> + []; +from_shell(doc) -> + ["Test calling of ets/dbg:fun2ms from the shell"]; +from_shell(Config) when list(Config) -> + ?line setup(Config), + ?line Fun = do_eval("fun({a,b}) -> true end"), + ?line [{{a,b},[],[true]}] = apply(ets,fun2ms,[Fun]), + ?line [{{a,b},[],[true]}] = do_eval("ets:fun2ms(fun({a,b}) -> true end)"), + ?line Fun2 = do_eval("fun([a,b]) -> message(banan), return_trace() end"), + ?line [{[a,b],[],[{message,banan},{return_trace}]}] + = apply(dbg,fun2ms,[Fun2]), + ?line [{[a,b],[],[{message,banan},{return_trace}]}] = + do_eval( + "dbg:fun2ms(fun([a,b]) -> message(banan), return_trace() end)"), + ok. + +records(suite) -> + []; +records(doc) -> + ["Tests expansion of records in fun2ms"]; +records(Config) when list(Config) -> + ?line setup(Config), + ?line RD = <<"-record(t, {" + "t1 = []," + "t2 = foo," + "t3," + "t4" + "}).">>, + ?line [{{t,'$1','$2',foo,'_'},[{is_list,'$1'}],[{{{hd,'$1'},'$_'}}]}, + {{t,'_','_','_','_'},[{'==',{element,2,'$_'},nisse}],[{{'$*'}}]}] = + compile_and_run(RD,<< + "ets:fun2ms(fun(#t{t1 = X, t2 = Y, t3 = foo}) when is_list(X) -> + {hd(X),object()}; + (#t{}) when (object())#t.t1 == nisse -> + {bindings()} + end)">>), + ?line [{{t,'$1','$2','_',foo}, + [{'==',{element,4,'$_'},7},{is_list,'$1'}], + [{{{hd,'$1'},'$_'}}]}, + {'$1',[{is_record,'$1',t,5}], + [{{{element,2,'$1'}, + {{t,'$1',foo,undefined,undefined}}, + {{t,{element,2,'$1'},{element,3,'$1'},{element,4,'$1'},boooo}}}}]}] = + compile_and_run(RD,<< + "ets:fun2ms(fun(#t{t1 = X, t2 = Y, t4 = foo}) when + (object())#t.t3==7,is_list(X) -> + {hd(X),object()}; + (A) when is_record(A,t) -> + {A#t.t1 + ,#t{t1=A} + ,A#t{t4=boooo} + } + end)" + >>), + ?line [{[{t,'$1','$2',foo,'_'}],[{is_list,'$1'}],[{{{hd,'$1'},'$_'}}]}, + {[{t,'_','_','_','_'}],[{'==',{element,2,{hd,'$_'}},nisse}],[{{'$*'}}]}]= + compile_and_run(RD,<< + "dbg:fun2ms(fun([#t{t1 = X, t2 = Y, t3 = foo}]) when is_list(X) -> + {hd(X),object()}; + ([#t{}]) when (hd(object()))#t.t1 == nisse -> + {bindings()} + end)" + >>), + ok. + + +record_index(suite) -> + []; +record_index(doc) -> + ["Tests expansion of records in fun2ms, part 2"]; +record_index(Config) when list(Config) -> + ?line setup(Config), + ?line RD = <<"-record(a,{a,b}).">>, + ?line [{{2},[],[true]}] = compile_and_run(RD, + <<"ets:fun2ms(fun({#a.a}) -> true end)">>), + ?line [{{2},[],[2]}] = compile_and_run(RD, + <<"ets:fun2ms(fun({#a.a}) -> #a.a end)">>), + ?line [{{2,'$1'},[{'>','$1',2}],[2]}] = compile_and_run(RD, + <<"ets:fun2ms(fun({#a.a,A}) when A > #a.a -> #a.a end)">>), + ok. + +top_match(suite) -> + []; +top_match(doc) -> + ["Tests matching on top level in head to give alias for object()"]; +top_match(Config) when list(Config) -> + ?line setup(Config), + ?line RD = <<"-record(a,{a,b}).">>, + ?line [{{a,3,'_'},[],['$_']}] = + compile_and_run(RD, + <<"ets:fun2ms(fun(A = #a{a=3}) -> A end)">>), + ?line [{{a,3,'_'},[],['$_']}] = + compile_and_run(RD, + <<"ets:fun2ms(fun(#a{a=3} = A) -> A end)">>), + ?line [{[a,b],[],['$_']}] = + compile_and_run(RD, + <<"dbg:fun2ms(fun(A = [a,b]) -> A end)">>), + ?line [{[a,b],[],['$_']}] = + compile_and_run(RD, + <<"dbg:fun2ms(fun([a,b] = A) -> A end)">>), + ?line expect_failure(RD, + <<"ets:fun2ms(fun({a,A = {_,b}}) -> A end)">>), + ?line expect_failure(RD, + <<"dbg:fun2ms(fun([a,A = {_,b}]) -> A end)">>), + ?line expect_failure(RD, + <<"ets:fun2ms(fun(A#a{a = 2}) -> A end)">>), + ok. + +multipass(suite) -> + []; +multipass(doc) -> + ["Tests that multi-defined fields in records give errors."]; +multipass(Config) when list(Config) -> + ?line setup(Config), + ?line RD = <<"-record(a,{a,b}).">>, + ?line expect_failure(RD,<<"ets:fun2ms(fun(A) -> #a{a=2,a=3} end)">>), + ?line expect_failure(RD,<<"ets:fun2ms(fun(A) -> A#a{a=2,a=3} end)">>), + ?line expect_failure(RD,<<"ets:fun2ms(fun(A) when A =:= #a{a=2,a=3} ->", + " true end)">>), + ?line expect_failure(RD,<<"ets:fun2ms(fun({A,B})when A =:= B#a{a=2,a=3}->", + "true end)">>), + ?line expect_failure(RD,<<"ets:fun2ms(fun(#a{a=3,a=3}) -> true end)">>), + ?line compile_and_run(RD,<<"ets:fun2ms(fun(A) -> #a{a=2,b=3} end)">>), + ?line compile_and_run(RD,<<"ets:fun2ms(fun(A) -> A#a{a=2,b=3} end)">>), + ?line compile_and_run(RD,<<"ets:fun2ms(fun(A) when A =:= #a{a=2,b=3} ->", + " true end)">>), + ?line compile_and_run(RD,<<"ets:fun2ms(fun({A,B})when A=:= B#a{a=2,b=3}->", + "true end)">>), + ?line compile_and_run(RD,<<"ets:fun2ms(fun(#a{a=3,b=3}) -> true end)">>), + ok. + + +old_guards(suite) -> + []; +old_guards(doc) -> + ["Tests that old type tests in guards are translated"]; +old_guards(Config) when list(Config) -> + ?line setup(Config), + Tests = [ + {atom,is_atom}, + {constant,is_constant}, + {float,is_float}, + {integer,is_integer}, + {list,is_list}, + {number,is_number}, + {pid,is_pid}, + {port,is_port}, + {reference,is_reference}, + {tuple,is_tuple}, + {binary,is_binary}, + {function,is_function}], + ?line lists:foreach( + fun({Old,New}) -> + Bin = list_to_binary([<<"ets:fun2ms(fun(X) when ">>, + atom_to_list(Old), + <<"(X) -> true end)">>]), + case compile_and_run(Bin) of + [{'$1',[{New,'$1'}],[true]}] -> + ok; + _ -> + exit({bad_result_for, binary_to_list(Bin)}) + end + end, + Tests), + ?line RD = <<"-record(a,{a,b}).">>, + ?line [{'$1',[{is_record,'$1',a,3}],[true]}] = + compile_and_run(RD, + <<"ets:fun2ms(fun(X) when record(X,a) -> true end)">>), + ?line expect_failure + (RD, + <<"ets:fun2ms(fun(X) when integer(X) and constant(X) -> " + "true end)">>), + ?line [{'$1',[{is_integer,'$1'}, + {is_float,'$1'}, + {is_atom,'$1'}, + {is_constant,'$1'}, + {is_list,'$1'}, + {is_number,'$1'}, + {is_pid,'$1'}, + {is_port,'$1'}, + {is_reference,'$1'}, + {is_tuple,'$1'}, + {is_binary,'$1'}, + {is_record,'$1',a,3}], + [true]}] = + compile_and_run(RD, << + "ets:fun2ms(fun(X) when integer(X)," + "float(X), atom(X), constant(X)," + "list(X), number(X), pid(X)," + "port(X), reference(X), tuple(X)," + "binary(X), record(X,a) -> true end)" + >>), + ok. + +autoimported(suite) -> + []; +autoimported(doc) -> + ["Tests use of autoimported bif's used like erlang:'+'(A,B) in guards" + " and body."]; +autoimported(Config) when list(Config) -> + ?line setup(Config), + Allowed = [ + {abs,1}, + {element,2}, + {hd,1}, + {length,1}, + {node,0}, + {node,1}, + {round,1}, + {size,1}, + {tl,1}, + {trunc,1}, + {self,0}, + %{float,1}, see float_1_function/1 + {is_atom,1}, + {is_constant,1}, + {is_float,1}, + {is_integer,1}, + {is_list,1}, + {is_number,1}, + {is_pid,1}, + {is_port,1}, + {is_reference,1}, + {is_tuple,1}, + {is_binary,1}, + {is_function,1}, + {is_record,2,magic}, + {'and',2,infix}, + {'or',2,infix}, + {'xor',2,infix}, + {'not',1}, + %{'andalso',2,infix}, + %{'orelse',2,infix}, + {'+',1}, + {'+',2,infix}, + {'-',1}, + {'-',2,infix}, + {'*',2,infix}, + {'/',2,infix}, + {'div',2,infix}, + {'rem',2,infix}, + {'band',2,infix}, + {'bor',2,infix}, + {'bxor',2,infix}, + {'bnot',1}, + {'bsl',2,infix}, + {'bsr',2,infix}, + {'>',2,infix}, + {'>=',2,infix}, + {'<',2,infix}, + {'=<',2,infix}, + {'==',2,infix}, + {'=:=',2,infix}, + {'/=',2,infix}, + {'=/=',2,infix}], + ?line RD = <<"-record(a,{a,b}).">>, + ?line lists:foreach( + fun({A,0}) -> + L = atom_to_list(A), + Bin1 = list_to_binary( + [ + <<"ets:fun2ms(fun(X) when ">>, + L,<<"() -> ">>, + L,<<"() end)">> + ]), + Bin2 = list_to_binary( + [ + <<"ets:fun2ms(fun(X) when erlang:'">>, + L,<<"'() -> erlang:'">>, + L,<<"'() end)">> + ]), + Res1 = compile_and_run(Bin1), + Res2 = compile_and_run(Bin2), + case Res1 =:= Res2 of + true -> + ok; + false -> + exit({not_equal,{Res1,Res2,A}}) + end; + ({A,1}) -> + L = atom_to_list(A), + Bin1 = list_to_binary( + [ + <<"ets:fun2ms(fun(X) when ">>, + L,<<"(X) -> ">>, + L,<<"(X) end)">> + ]), + Bin2 = list_to_binary( + [ + <<"ets:fun2ms(fun(X) when erlang:'">>, + L,<<"'(X) -> erlang:'">>, + L,<<"'(X) end)">> + ]), + Res1 = compile_and_run(Bin1), + Res2 = compile_and_run(Bin2), + case Res1 =:= Res2 of + true -> + ok; + false -> + exit({not_equal,{Res1,Res2,A}}) + end; + ({A,2}) -> + L = atom_to_list(A), + Bin1 = list_to_binary( + [ + <<"ets:fun2ms(fun({X,Y}) when ">>, + L,<<"(X,Y) -> ">>, + L,<<"(X,Y) end)">> + ]), + Bin2 = list_to_binary( + [ + <<"ets:fun2ms(fun({X,Y}) when erlang:'">>, + L,<<"'(X,Y) -> erlang:'">>, + L,<<"'(X,Y) end)">> + ]), + Res1 = compile_and_run(Bin1), + Res2 = compile_and_run(Bin2), + case Res1 =:= Res2 of + true -> + ok; + false -> + exit({not_equal,{Res1,Res2,A}}) + end; + ({A,2,infix}) -> + L = atom_to_list(A), + Bin1 = list_to_binary( + [ + <<"ets:fun2ms(fun({X,Y}) when X ">>, + L,<<" Y -> X ">>, + L,<<" Y end)">> + ]), + Bin2 = list_to_binary( + [ + <<"ets:fun2ms(fun({X,Y}) when erlang:'">>, + L,<<"'(X,Y) -> erlang:'">>, + L,<<"'(X,Y) end)">> + ]), + Res1 = compile_and_run(Bin1), + Res2 = compile_and_run(Bin2), + case Res1 =:= Res2 of + true -> + ok; + false -> + exit({not_equal,{Res1,Res2,A}}) + end; + ({A,2,magic}) -> %is_record + L = atom_to_list(A), + Bin1 = list_to_binary( + [ + <<"ets:fun2ms(fun(X) when ">>, + L,<<"(X,a) -> ">>, + L,<<"(X,a) end)">> + ]), + Bin2 = list_to_binary( + [ + <<"ets:fun2ms(fun(X) when erlang:'">>, + L,<<"'(X,a) -> erlang:'">>, + L,<<"'(X,a) end)">> + ]), + Res1 = compile_and_run(RD,Bin1), + Res2 = compile_and_run(RD,Bin2), + case Res1 =:= Res2 of + true -> + ok; + false -> + exit({not_equal,{Res1,Res2,A}}) + end + end, + Allowed), + ok. + +semicolon(suite) -> + []; +semicolon(doc) -> + ["Tests semicolon in guards of match_specs."]; +semicolon(Config) when is_list(Config) -> + ?line setup(Config), + ?line Res01 = compile_and_run + (<<"ets:fun2ms(fun(X) when is_integer(X); " + "is_float(X) -> true end)">>), + ?line Res02 = compile_and_run + (<<"ets:fun2ms(fun(X) when is_integer(X) -> true; " + "(X) when is_float(X) -> true end)">>), + ?line Res01 = Res02, + ?line Res11 = compile_and_run + (<<"ets:fun2ms(fun(X) when is_integer(X); " + "is_float(X); atom(X) -> true end)">>), + ?line Res12 = compile_and_run + (<<"ets:fun2ms(fun(X) when is_integer(X) -> true; " + "(X) when is_float(X) -> true; " + "(X) when is_atom(X) -> true end)">>), + ?line Res11 = Res12, + ok. + + +float_1_function(suite) -> + []; +float_1_function(doc) -> + ["OTP-5297. The function float/1."]; +float_1_function(Config) when list(Config) -> + ?line setup(Config), + RunMS = fun(L, MS) -> + ets:match_spec_run(L, ets:match_spec_compile(MS)) + end, + ?line MS1 = compile_and_run + (<<"ets:fun2ms(fun(X) -> float(X) end)">>), + ?line [F1] = RunMS([3], MS1), + ?line true = is_float(F1) and (F1 == 3), + + ?line MS1b = compile_and_run + (<<"dbg:fun2ms(fun(X) -> float(X) end)">>), + ?line [F2] = RunMS([3], MS1b), + ?line true = is_float(F2) and (F2 == 3), + + ?line MS2 = compile_and_run + (<<"ets:fun2ms(fun(X) when is_pid(X) or float(X) -> true end)">>), + ?line [] = RunMS([3.0], MS2), + + ?line MS3 = compile_and_run + (<<"dbg:fun2ms(fun(X) when is_pid(X); float(X) -> true end)">>), + ?line [true] = RunMS([3.0], MS3), + + ?line MS4 = compile_and_run + (<<"ets:fun2ms(fun(X) when erlang:float(X) > 1 -> big;" + " (_) -> small end)">>), + ?line [small,big] = RunMS([1.0, 3.0], MS4), + + ?line MS5 = compile_and_run + (<<"ets:fun2ms(fun(X) when float(X) > 1 -> big;" + " (_) -> small end)">>), + ?line [small,big] = RunMS([1.0, 3.0], MS5), + + %% This is the test from autoimported/1. + ?line [{'$1',[{is_float,'$1'}],[{float,'$1'}]}] = + compile_and_run + (<<"ets:fun2ms(fun(X) when float(X) -> float(X) end)">>), + ?line [{'$1',[{float,'$1'}],[{float,'$1'}]}] = + compile_and_run + (<<"ets:fun2ms(fun(X) when erlang:'float'(X) -> " + "erlang:'float'(X) end)">>), + ok. + + +action_function(suite) -> + []; +action_function(doc) -> + ["Test all 'action functions'."]; +action_function(Config) when is_list(Config) -> + ?line setup(Config), + ?line [{['$1','$2'],[], + [{set_seq_token,label,0}, + {get_seq_token}, + {message,'$1'}, + {return_trace}, + {exception_trace}]}] = + compile_and_run + (<<"dbg:fun2ms(fun([X,Y]) -> " + "set_seq_token(label, 0), " + "get_seq_token(), " + "message(X), " + "return_trace(), " + "exception_trace() end)">>), + ?line [{['$1','$2'],[], + [{process_dump}, + {enable_trace,send}, + {enable_trace,'$2',send}, + {disable_trace,procs}, + {disable_trace,'$2',procs}]}] = + compile_and_run + (<<"dbg:fun2ms(fun([X,Y]) -> " + "process_dump(), " + "enable_trace(send), " + "enable_trace(Y, send), " + "disable_trace(procs), " + "disable_trace(Y, procs) end)">>), + ?line [{['$1','$2'], + [], + [{display,'$1'}, + {caller}, + {set_tcw,{const,16}}, + {silent,true}, + {trace,[send],[procs]}, + {trace,'$2',[procs],[send]}]}] = + compile_and_run + (<<"A = 16, dbg:fun2ms(fun([X,Y]) -> " + "display(X), " + "caller(), " + "set_tcw(A), " + "silent(true), " + "trace([send], [procs]), " + "trace(Y, [procs], [send]) end)">>), + ok. + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Helpers +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +setup(Config) -> + put(mts_config,Config), + put(mts_tf_counter,0). + +temp_name() -> + Conf = get(mts_config), + C = get(mts_tf_counter), + put(mts_tf_counter,C+1), + filename:join([?config(priv_dir,Conf), + "tempfile"++integer_to_list(C)++".tmp"]). + + +expect_failure(Recs,Code) -> + case (catch compile_and_run(Recs,Code)) of + {'EXIT',_Foo} -> + %erlang:display(_Foo), + ok; + Other -> + exit({expected,failure,got,Other}) + end. + +compile_and_run(Expr) -> + compile_and_run(<<>>,Expr). +compile_and_run(Records,Expr) -> + Prog = << + "-module(tmp).\n", + "-include_lib(\"stdlib/include/ms_transform.hrl\").\n", + "-export([tmp/0]).\n", + Records/binary,"\n", + "tmp() ->\n", + Expr/binary,".\n">>, + FN=temp_name(), + file:write_file(FN,Prog), + {ok,Forms} = epp:parse_file(FN,"",""), + {ok,tmp,Bin} = compile:forms(Forms), + code:load_binary(tmp,FN,Bin), + tmp:tmp(). + +do_eval(String) -> + {done,{ok,T,_},[]} = erl_scan:tokens( + [], + String++".\n",1), + {ok,Tree} = erl_parse:parse_exprs(T), + {value,Res,[]} = erl_eval:exprs(Tree,[]), + Res. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/naughty_child.erl erlang-13.b.3-dfsg/lib/stdlib/test/naughty_child.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/naughty_child.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/naughty_child.erl 2009-11-20 13:31:34.000000000 +0000 @@ -0,0 +1,101 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%% DESCRIPTION: Implements a naughty child process that does unlink +%%% from its supervisor. Used by the supervisor test suite. + +-module(naughty_child). + +-behaviour(gen_server). +%%-------------------------------------------------------------------- +%% Include files +%%-------------------------------------------------------------------- + +%%-------------------------------------------------------------------- +%% External exports +-export([start_link/1]). + +%% gen_server callbacks +-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, + code_change/3]). + +-record(state, {}). + +%%==================================================================== +%% External functions +%%==================================================================== +%%-------------------------------------------------------------------- +%% Function: start_link/0 +%% Description: Starts the server +%%-------------------------------------------------------------------- +start_link(Pid) -> + gen_server:start_link({local, naughty_foo}, ?MODULE, [Pid], []). + +%%==================================================================== +%% Server functions +%%==================================================================== + +%%-------------------------------------------------------------------- +%% Function: init/1 +%% Description: Initiates the server +%%-------------------------------------------------------------------- +init([Pid]) -> + unlink(Pid), + {ok, #state{}}. + +%%-------------------------------------------------------------------- +%% Function: handle_call/3 +%% Description: Handling call messages +%%-------------------------------------------------------------------- +handle_call(_Request, _From, State) -> + Reply = ok, + {reply, Reply, State}. + +%%-------------------------------------------------------------------- +%% Function: handle_cast/2 +%% Description: Handling cast messages +%%-------------------------------------------------------------------- +handle_cast(_Msg, State) -> + {noreply, State}. + +%%-------------------------------------------------------------------- +%% Function: handle_info/2 +%% Description: Handling all non call/cast messages +%%-------------------------------------------------------------------- +handle_info(_Info, State) -> + {noreply, State}. + +%%-------------------------------------------------------------------- +%% Function: terminate/2 +%% Description: Shutdown the server +%%-------------------------------------------------------------------- +terminate(_Reason, _State) -> + ok. + +%%-------------------------------------------------------------------- +%% Func: code_change/3 +%% Purpose: Convert process state when code is changed +%%-------------------------------------------------------------------- +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%-------------------------------------------------------------------- +%%% Internal functions +%%-------------------------------------------------------------------- + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/proc_lib_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/proc_lib_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/proc_lib_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/proc_lib_SUITE.erl 2009-11-20 13:30:03.000000000 +0000 @@ -0,0 +1,344 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(proc_lib_SUITE). + +%% +%% Define to run outside of test server +%% +%%-define(STANDALONE,1). + +-export([all/1, crash/1, sync_start/1, sync_start_nolink/1, sync_start_link/1, + spawn_opt/1, sp1/0, sp2/0, sp3/1, sp4/2, sp5/1, + hibernate/1]). +-export([tickets/1, otp_6345/1]). + +-export([hib_loop/1, awaken/1]). + +-export([init/1, + handle_event/2, handle_call/2, handle_info/2, + terminate/2]). + +-export([otp_6345_init/1]). + + +-ifdef(STANDALONE). +-define(line, noop, ). +-else. +-include("test_server.hrl"). +-endif. + +all(suite) -> [crash, sync_start, spawn_opt, hibernate, tickets]. + +tickets(suite) -> [otp_6345]. + +%%----------------------------------------------------------------- +%% We don't have to test that spwn and spawn_link actually spawns +%% new processes - if they don't we can't run this suite! +%% But we want to test that start and start_link really is +%% synchronous, and we want to test that the crash report is ok. +%%----------------------------------------------------------------- +crash(Config) when is_list(Config) -> + error_logger:add_report_handler(?MODULE, self()), + + Pid = proc_lib:spawn(?MODULE, sp1, []), + Pid ! die, + ?line Report = receive + {crash_report, Pid, Report0} -> Report0 + after 2000 -> test_server:fail(no_crash_report) + end, + ?line proc_lib:format(Report), + ?line [PidRep, []] = Report, + ?line {value, {initial_call,{?MODULE,sp1,[]}}} = + lists:keysearch(initial_call, 1, PidRep), + Self = self(), + ?line {value, {ancestors,[Self]}} = + lists:keysearch(ancestors, 1, PidRep), + ?line {value, {error_info,{exit,die,_StackTrace1}}} = + lists:keysearch(error_info, 1, PidRep), + + F = fun sp1/0, + Pid1 = proc_lib:spawn(node(), F), + Pid1 ! die, + ?line [PidRep1, []] = receive + {crash_report, Pid1, Report1} -> Report1 + after 2000 -> test_server:fail(no_crash_report) + end, + ?line {value, {initial_call,{Fmod,Fname,[]}}} = + lists:keysearch(initial_call, 1, PidRep1), + ?line {module,Fmod} = erlang:fun_info(F, module), + ?line {name,Fname} = erlang:fun_info(F, name), + ?line {value, {ancestors,[Self]}} = + lists:keysearch(ancestors, 1, PidRep1), + ?line {value, {error_info,{exit,die,_StackTrace2}}} = + lists:keysearch(error_info, 1, PidRep1), + + Pid2 = proc_lib:spawn(?MODULE, sp2, []), + test_server:sleep(100), + ?line {?MODULE,sp2,[]} = proc_lib:initial_call(Pid2), + ?line {?MODULE,sp2,0} = proc_lib:translate_initial_call(Pid2), + Pid2 ! die, + ?line [Pid2Rep, [{neighbour, LinkRep}]] = + receive + {crash_report, Pid2, Report2} -> Report2 + after 2000 -> test_server:fail(no_crash_report) + end, + ?line {value, {initial_call,{?MODULE,sp2,[]}}} = + lists:keysearch(initial_call, 1, Pid2Rep), + ?line {value, {ancestors,[Self]}} = + lists:keysearch(ancestors, 1, Pid2Rep), + ?line {value, {error_info,{exit,die,_StackTrace3}}} = + lists:keysearch(error_info, 1, Pid2Rep), + ?line {value, {initial_call,{?MODULE,sp1,[]}}} = + lists:keysearch(initial_call, 1, LinkRep), + + %% Make sure that we don't get a crash report if a process + %% terminates with reason 'shutdown' or reason {shutdown,Reason}. + ?line process_flag(trap_exit, true), + ?line Pid3 = proc_lib:spawn_link(erlang, apply, + [fun() -> exit(shutdown) end,[]]), + + ?line Pid4 = proc_lib:spawn_link(erlang, apply, + [fun() -> exit({shutdown,{a,b,c}}) end,[]]), + + ?line receive {'EXIT',Pid3,shutdown} -> ok end, + ?line receive {'EXIT',Pid4,{shutdown,{a,b,c}}} -> ok end, + ?line process_flag(trap_exit, false), + + receive + Any -> + ?line ?t:fail({unexpected_message,Any}) + after 2000 -> + ok + end. + +sync_start(suite) -> [sync_start_nolink, sync_start_link]. + +sync_start_nolink(Config) when is_list(Config) -> + _Pid = spawn_link(?MODULE, sp5, [self()]), + receive + {sync_started, F} -> + exit(F, kill), + test_server:fail(async_start) + after 1000 -> ok + end, + receive + {Pid2, init} -> + Pid2 ! go_on + end, + receive + {sync_started, _} -> ok + after 1000 -> + exit(Pid2, kill), + test_server:fail(no_sync_start) + end, + ok. + +sync_start_link(Config) when is_list(Config) -> + _Pid = spawn_link(?MODULE, sp3, [self()]), + receive + {sync_started, _} -> test_server:fail(async_start) + after 1000 -> ok + end, + receive + {Pid2, init} -> + Pid2 ! go_on + end, + receive + {sync_started, _} -> ok + after 1000 -> test_server:fail(no_sync_start) + end, + ok. + +spawn_opt(Config) when is_list(Config) -> + F = fun sp1/0, + {name,Fname} = erlang:fun_info(F, name), + FunMFArgs = {?MODULE,Fname,[]}, + FunMFArity = {?MODULE,Fname,0}, + ?line Pid1 = proc_lib:spawn_opt(node(), F, [{priority,low}]), + ?line Pid = proc_lib:spawn_opt(F, [{priority,low}]), + ?line test_server:sleep(100), + ?line FunMFArgs = proc_lib:initial_call(Pid), + ?line FunMFArity = proc_lib:translate_initial_call(Pid), + ?line Pid ! die, + ?line FunMFArgs = proc_lib:initial_call(Pid1), + ?line FunMFArity = proc_lib:translate_initial_call(Pid1), + ?line Pid1 ! die, + ok. + + +sp1() -> + receive + die -> exit(die); + _ -> sp1() + end. + +sp2() -> + _Pid = proc_lib:spawn_link(?MODULE, sp1, []), + receive + die -> exit(die); + _ -> sp1() + end. + +sp3(Tester) -> + Pid = proc_lib:start_link(?MODULE, sp4, [self(), Tester]), + Tester ! {sync_started, Pid}. + +sp5(Tester) -> + Pid = proc_lib:start(?MODULE, sp4, [self(), Tester]), + Tester ! {sync_started, Pid}. + +sp4(Parent, Tester) -> + Tester ! {self(), init}, + receive + go_on -> ok + end, + proc_lib:init_ack(Parent, self()). + +hibernate(Config) when is_list(Config) -> + Ref = make_ref(), + Self = self(), + LoopData = {Ref,Self}, + ?line Pid = proc_lib:spawn_link(?MODULE, hib_loop, [LoopData]), + + %% Just check that the child process can process and answer messages. + ?line Pid ! {Self,loop_data}, + receive + {loop_data,LoopData} -> ok; + Unexpected0 -> + ?line io:format("Unexpected: ~p\n", [Unexpected0]), + ?line ?t:fail() + after 1000 -> + ?line io:format("Timeout"), + ?line ?t:fail() + end, + + %% Hibernate the process. + ?line Pid ! hibernate, + erlang:yield(), + io:format("~p\n", [process_info(Pid, heap_size)]), + + + %% Send a message to the process... + + ?line Pid ! {Self,loop_data}, + + %% ... expect first a wake up message from the process... + receive + {awaken,LoopData} -> ok; + Unexpected1 -> + ?line io:format("Unexpected: ~p\n", [Unexpected1]), + ?line ?t:fail() + after 1000 -> + ?line io:format("Timeout"), + ?line ?t:fail() + end, + + %% ... followed by the answer to the actual request. + receive + {loop_data,LoopData} -> ok; + Unexpected2 -> + ?line io:format("Unexpected: ~p\n", [Unexpected2]), + ?line ?t:fail() + after 1000 -> + ?line io:format("Timeout"), + ?line ?t:fail() + end, + + %% Test that errors are handled correctly after wake up from hibernation... + + ?line process_flag(trap_exit, true), + ?line error_logger:add_report_handler(?MODULE, self()), + ?line Pid ! crash, + + %% We should receive two messages. Especially in the SMP emulator, + %% we can't be sure of the message order, so sort the messages before + %% matching. + + Messages = lists:sort(hib_receive_messages(2)), + io:format("~p", [Messages]), + ?line [{'EXIT',Pid,i_crashed},{crash_report,Pid,[Report,[]]}] = Messages, + + %% Check that the initial_call has the expected format. + ?line {value,{initial_call,{?MODULE,hib_loop,[_]}}} = + lists:keysearch(initial_call, 1, Report), + + ok. + +hib_loop(LoopData) -> + receive + hibernate -> + proc_lib:hibernate(?MODULE, awaken, [LoopData]); + {Pid,loop_data} -> + Pid ! {loop_data,LoopData}; + crash -> + exit(i_crashed) + end, + hib_loop(LoopData). + +awaken({_,Parent}=LoopData) -> + Parent ! {awaken,LoopData}, + hib_loop(LoopData). + +hib_receive_messages(0) -> []; +hib_receive_messages(N) -> + receive + Any -> [Any|hib_receive_messages(N-1)] + end. + +otp_6345(suite) -> + []; +otp_6345(doc) -> + ["'monitor' spawn_opt option"]; +otp_6345(Config) when is_list(Config) -> + Opts = [link,monitor], + {'EXIT', {badarg,[{proc_lib,check_for_monitor,_}|_Stack]}} = + (catch proc_lib:start(?MODULE, otp_6345_init, [self()], + 1000, Opts)), + ok. + +otp_6345_init(Parent) -> + proc_lib:init_ack(Parent, {ok, self()}), + otp_6345_loop(). + +otp_6345_loop() -> + receive + _Msg -> + otp_6345_loop() + end. + +%%----------------------------------------------------------------- +%% The error_logger handler used. +%%----------------------------------------------------------------- +init(Tester) -> + {ok, Tester}. + +handle_event({error_report, _GL, {Pid, crash_report, Report}}, Tester) -> + io:format("~s\n", [proc_lib:format(Report)]), + Tester ! {crash_report, Pid, Report}, + {ok, Tester}; +handle_event(_Event, State) -> + {ok, State}. + +handle_info(_, State) -> + {ok, State}. + +handle_call(_Query, State) -> {ok, {error, bad_query}, State}. + +terminate(_Reason, State) -> + State. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/qlc_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/qlc_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/qlc_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/qlc_SUITE.erl 2009-11-20 13:31:52.000000000 +0000 @@ -0,0 +1,8179 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%%---------------------------------------------------------------- +%%% Purpose:Test Suite for the 'qlc' module. +%%%----------------------------------------------------------------- +-module(qlc_SUITE). + +-define(QLC, qlc). +-define(QLCs, "qlc"). + +%-define(debug, true). + +%% There are often many tests per testcase. Most tests are copied to a +%% module, a file. The file is compiled and the test run. Should the +%% test fail, the module file is not removed from ?privdir, but is +%% kept for inspection. The name of the file is +%% ?privdir/qlc_test_CASE.erl. +-define(TESTMODULE, qlc_test). +-define(TESTCASE, testcase_name). + +-ifdef(debug). +-define(line, put(line, ?LINE), ). +-define(config(X,Y), foo). +-define(datadir, ?QLCs ++ "_SUITE_data"). +-define(privdir, ?QLCs ++ "_SUITE_priv"). +-define(testcase, current_testcase). % don't know +-define(t, test_server). +-else. +-include("test_server.hrl"). +-define(datadir, ?config(data_dir, Config)). +-define(privdir, ?config(priv_dir, Config)). +-define(testcase, ?config(?TESTCASE, Config)). +-endif. + +-include_lib("stdlib/include/ms_transform.hrl"). + +-export([all/1, init_per_testcase/2, fin_per_testcase/2]). + +-export([parse_transform/1, + badarg/1, nested_qlc/1, unused_var/1, lc/1, fun_clauses/1, + filter_var/1, single/1, exported_var/1, generator_vars/1, + nomatch/1, errors/1, pattern/1, + + evaluation/1, + eval/1, cursor/1, fold/1, eval_unique/1, eval_cache/1, append/1, + evaluator/1, string_to_handle/1, table/1, process_dies/1, + sort/1, keysort/1, filesort/1, cache/1, cache_list/1, filter/1, + info/1, nested_info/1, lookup1/1, lookup2/1, lookup_rec/1, + indices/1, pre_fun/1, skip_filters/1, + + table_impls/1, + ets/1, dets/1, + + join/1, + join_option/1, join_filter/1, join_lookup/1, join_merge/1, + join_sort/1, join_complex/1, + + tickets/1, + otp_5644/1, otp_5195/1, otp_6038_bug/1, otp_6359/1, otp_6562/1, + otp_6590/1, otp_6673/1, otp_6964/1, otp_7114/1, otp_7238/1, + otp_7232/1, otp_7552/1, otp_6674/1, otp_7714/1, + + manpage/1, + + compat/1, + backward/1, forward/1]). + +%% Internal exports. +-export([bad_table_throw/1, bad_table_exit/1, default_table/1, bad_table/1, + bad_table_format/1, bad_table_format_arity/1, bad_table_traverse/1, + bad_table_post/1, bad_table_lookup/1, bad_table_max_lookup/1, + bad_table_info_arity/1, bad_table_info_fun_n_objects/1, + bad_table_info_fun_indices/1, bad_table_info_fun_keypos/1, + bad_table_key_equality/1]). +-export([evaluator_2/2]). +-export([prep_scratchdir/1, truncate_tmpfile/2, crash/2, crash_tmpfile/2]). +-export([etsc/2, etsc/3, create_ets/2, lookup_keys/1]). +-export([strip_qlc_call/1, join_info/1, join_info_count/1]). +-export([i/1, i/2, format_info/2]). + +-export([table_kill_parent/2, table_parent_throws/2, + table_parent_exits/2, table_bad_parent_fun/2]). +-export([table/2, table/3, stop_list/2, table_error/2, table_error/3, + table_lookup_error/1]). + +%% error_logger +-export([install_error_logger/0, uninstall_error_logger/0, + read_error_logger/0]). +-export([init/1, + handle_event/2, handle_call/2, handle_info/2, + terminate/2]). + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(5)). + +init_per_testcase(Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{?TESTCASE, Case}, {watchdog, Dog} | Config]. + +fin_per_testcase(_Case, _Config) -> + Dog = ?config(watchdog, _Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + [parse_transform, evaluation, table_impls, join, tickets, manpage, compat]. + +parse_transform(suite) -> + [badarg, nested_qlc, unused_var, lc, fun_clauses, filter_var, + single, exported_var, generator_vars, nomatch, errors, pattern]. + +badarg(doc) -> + "Badarg."; +badarg(suite) -> []; +badarg(Config) when is_list(Config) -> + Ts = + [{badarg, + <<"-import(qlc, [q/1, q/2]). + q(_, _, _) -> ok. + + badarg() -> + qlc:q(foo), + qlc:q(foo, cache_all), + qlc:q(foo, cache_all, extra), + q(bar), + q(bar, cache_all), + q(bar, cache_all, extra). + ">>, + [], + {errors,[{5,?QLC,not_a_query_list_comprehension}, + {6,?QLC,not_a_query_list_comprehension}, + {8,?QLC,not_a_query_list_comprehension}, + {9,?QLC,not_a_query_list_comprehension}], + []}}], + ?line [] = compile(Config, Ts), + ok. + +nested_qlc(doc) -> + "Nested qlc expressions."; +nested_qlc(suite) -> []; +nested_qlc(Config) when is_list(Config) -> + %% Nested QLC expressions. X is bound before the first one; Z and X + %% before the second one. + Ts = + [{nested_qlc1, + <<"nested_qlc() -> + X = 3, % X unused + Q = qlc:q([Y || + X <- % X shadowed + begin Z = 3, + qlc:q([Y || + Y <- [Z], + X <- [1,2,3], % X shadowed + X < Y]) + end, + Y <- + [y], + Y > X]), + [y, y] = qlc:e(Q), + ok. + ">>, + [warn_unused_vars], + {warnings,[{{2,15},erl_lint,{unused_var,'X'}}, + {{4,29},erl_lint,{shadowed_var,'X',generate}}, + {{8,49},erl_lint,{shadowed_var,'X',generate}}]}}, + + {nested_qlc2, + <<"nested_qlc() -> + H0 = qlc:append([a,b], [c,d]), + qlc:q([{X,Y} || + X <- H0, + Y <- qlc:q([{X,Y} || + X <- H0, % X shadowed + Y <- H0])]), + ok. + ">>, + [warn_unused_vars], + {warnings,[{{6,39},erl_lint,{shadowed_var,'X',generate}}]}} + ], + ?line [] = compile(Config, Ts), + ok. + +unused_var(doc) -> + "Unused variable with a name that should not be introduced."; +unused_var(suite) -> []; +unused_var(Config) when is_list(Config) -> + Ts = + [{unused_var, + <<"unused_var() -> + qlc:q([X || begin Y1 = 3, true end, % Y1 unused + Y <- [1,2,3], + X <- [a,b,c], + X < Y]). + ">>, + [warn_unused_vars], + {warnings,[{{2,33},erl_lint,{unused_var,'Y1'}}]}}], + ?line [] = compile(Config, Ts), + ok. + +lc(doc) -> + "Ordinary LC expression."; +lc(suite) -> []; +lc(Config) when is_list(Config) -> + Ts = + [{lc, + <<"lc() -> + [X || X <- [], X <- X]. % X shadowed + ">>, + [], + {warnings,[{{2,30},erl_lint,{shadowed_var,'X',generate}}]}}], + ?line [] = compile(Config, Ts), + ok. + +fun_clauses(doc) -> + "Fun with several clauses."; +fun_clauses(suite) -> []; +fun_clauses(Config) when is_list(Config) -> + Ts = + [{fun_clauses, + <<"fun_clauses() -> + {X,X1,X2} = {1,2,3}, + F = fun({X}) -> qlc:q([X || X <- X]); % X shadowed (fun, generate) + ([X]) -> qlc:q([X || X <- X]) % X shadowed (fun, generate) + end, + {F,X,X1,X2}. + ">>, + [], + {warnings,[{{3,22},erl_lint,{shadowed_var,'X','fun'}}, + {{3,41},erl_lint,{shadowed_var,'X',generate}}, + {{4,22},erl_lint,{shadowed_var,'X','fun'}}, + {{4,41},erl_lint,{shadowed_var,'X',generate}}]}}], + ?line [] = compile(Config, Ts), + ok. + +filter_var(doc) -> + "Variable introduced in filter."; +filter_var(suite) -> []; +filter_var(Config) when is_list(Config) -> + Ts = + [{filter_var, + <<"filter_var() -> + qlc:q([X || + Y <- [X || + X <- [1,2,3]], + begin X = Y, true end]). + ">>, + [], + []}, + + {unsafe_filter_var, + <<"unsafe_filter_var() -> + qlc:q([{X,V} || X <- [1,2], + case {a} of + {_} -> + true; + V -> + V + end]). + ">>, + [], + {errors,[{{2,25},erl_lint,{unsafe_var,'V',{'case',{3,19}}}}],[]}}], + ?line [] = compile(Config, Ts), + ok. + + +single(doc) -> + "Unused pattern variable."; +single(suite) -> []; +single(Config) when is_list(Config) -> + Ts = + [{single, + <<"single() -> + qlc:q([X || {X,Y} <- [{1,2}]]), % Y unused + qlc:q([[] || [] <- [[]]]). + ">>, + [warn_unused_vars], + {warnings,[{{2,30},erl_lint,{unused_var,'Y'}}]}}], + ?line [] = compile(Config, Ts), + ok. + +exported_var(doc) -> + "Exported variable in list expression (rhs of generator)."; +exported_var(suite) -> []; +exported_var(Config) when is_list(Config) -> + Ts = + [{exported_var, + <<"exported() -> + qlc:q([X || X <- begin + case foo:bar() of + 1 -> Z = a; + 2 -> Z = b + end, + [Z = 3, Z = 3] % Z exported (twice...) + end + ]). + ">>, + [warn_export_vars], + {warnings,[{{7,37},erl_lint,{exported_var,'Z',{'case',{3,36}}}}, + {{7,44},erl_lint,{exported_var,'Z',{'case',{3,36}}}}]}}], + ?line [] = compile(Config, Ts), + ok. + +generator_vars(doc) -> + "Errors for generator variable used in list expression."; +generator_vars(suite) -> []; +generator_vars(Config) when is_list(Config) -> + Ts = + [{generator_vars, + <<"generator_vars() -> + qlc:q([X || + Z <- [1,2], + X <- begin + case 1 of + 1 -> Z = a; % used_generator_variable + 2 -> Z = b % used_generator_variable + end, + [Z = 3, Z = 3] % used_generator_variable (2) + end + ]). + ">>, + [], + {errors,[{{6,41},?QLC,{used_generator_variable,'Z'}}, + {{7,41},?QLC,{used_generator_variable,'Z'}}, + {{9,33},?QLC,{used_generator_variable,'Z'}}, + {{9,40},?QLC,{used_generator_variable,'Z'}}], + []}}], + ?line [] = compile(Config, Ts), + ok. + +nomatch(doc) -> + "Unreachable clauses also found when compiling."; +nomatch(suite) -> []; +nomatch(Config) when is_list(Config) -> + Ts = + [{unreachable1, + <<"unreachable1() -> + qlc:q([X || X <- [1,2], + case X of + true -> false; + true -> true % clause cannot match + end]). + ">>, + [], + {warnings,[{5,v3_kernel,{nomatch_shadow,4}}]}}, + + {nomatch1, + <<"generator1() -> + qlc:q([3 || {3=4} <- []]). + ">>, + [], + {warnings,[{{2,27},qlc,nomatch_pattern}]}}, + + {nomatch2, + <<"nomatch() -> + etsc(fun(E) -> + Q = qlc:q([3 || {3=4} <- ets:table(E)]), + [] = qlc:eval(Q), + false = lookup_keys(Q) + end, [{1},{2}]). + ">>, + [], + {warnings,[{{3,33},qlc,nomatch_pattern}]}}, + + {nomatch3, + <<"nomatch() -> + etsc(fun(E) -> + Q = qlc:q([{A,B,C,D} || A=B={C=D}={_,_} <- + ets:table(E)]), + [] = qlc:eval(Q), + false = lookup_keys(Q) + end, [{1,2},{2,3}]). + ">>, + [], + {warnings,[{{3,52},qlc,nomatch_pattern}]}}, + + {nomatch4, + <<"nomatch() -> + etsc(fun(E) -> + Q = qlc:q([{X,Y} || {<>} = {<>} <- + ets:table(E)]), + [] = qlc:eval(Q), + false = lookup_keys(Q) + end, [{<<34>>},{<<40>>}]). + ">>, + [], + {errors,[{{3,48},erl_lint,illegal_bin_pattern}],[]}}, + + {nomatch5, + <<"nomatch() -> + etsc(fun(E) -> + Q = qlc:q([t || {\"a\"++\"b\"} = {\"ac\"} <- + ets:table(E)]), + [t] = qlc:eval(Q), + [\"ab\"] = lookup_keys(Q) + end, [{\"ab\"}]). + ">>, + [], + {warnings,[{3,v3_core,nomatch}]}} + + ], + ?line [] = compile(Config, Ts), + ok. + + +errors(doc) -> + "Errors within qlc expressions also found when compiling."; +errors(suite) -> []; +errors(Config) when is_list(Config) -> + Ts = + [{errors1, + <<"errors1() -> + qlc:q([X || X <- A]). % A unbound + ">>, + [], + {errors,[{{2,33},erl_lint,{unbound_var,'A'}}],[]}}], + ?line [] = compile(Config, Ts), + ok. + +pattern(doc) -> + "Patterns."; +pattern(suite) -> []; +pattern(Config) when is_list(Config) -> + Ts = [ + <<"%% Records in patterns. No lookup. + L = [#a{k=#k{v=91}}], + H = qlc:q([Q || Q = #a{k=#k{v=91}} <- qlc_SUITE:table(L, 2, [])]), + {qlc,_,[{generate,_,{table,{call,_,_,_}}}], []} = i(H), + L = qlc:e(H), + {call, _, _q, [{lc,_,{var,_,'Q'}, + [{generate,_, + {match,_,_,_}, + {call,_,_,_}}]}]} + = i(H, {format,abstract_code})">>, + + <<"%% No matchspec since there is a binary in the pattern. + etsc(fun(E) -> + Q = qlc:q([A || {<>} <- ets:table(E)]), + [_] = qlc:eval(Q), + {qlc,_,[{generate,_,{table,_}}], []} = i(Q) + end, [{<<\"hej\">>}])">> + + ], + ?line run(Config, <<"-record(a, {k,v}). + -record(k, {t,v}).\n">>, Ts), + ok. + +evaluation(suite) -> + [eval, cursor, fold, eval_unique, eval_cache, append, evaluator, + string_to_handle, table, process_dies, sort, keysort, filesort, cache, + cache_list, filter, info, nested_info, lookup1, lookup2, lookup_rec, + indices, pre_fun, skip_filters]. + +eval(doc) -> + "eval/2"; +eval(suite) -> []; +eval(Config) when is_list(Config) -> + ScratchDir = filename:join([?privdir, "scratch","."]), + + Ts = [<<"{'EXIT',{badarg,_}} = (catch qlc:eval(not_a_qlc)), + H = qlc:q([X || X <- [1,2]]), + {'EXIT',{{unsupported_qlc_handle,{qlc_handle,foo}},_}}= + (catch qlc:e({qlc_handle,foo})), + {'EXIT',{badarg,_}} = (catch qlc:eval(H, [{unique_all,badarg}])), + {'EXIT',{badarg,_}} = + (catch qlc:eval(H, [{spawn_options,badarg}])), + {'EXIT',{badarg,_}} = + (catch qlc:eval(H, [{unique_all,true},{bad,arg}])), + {throw,t} = + (catch {any_term,qlc:e(qlc:q([X || X <- throw({throw,t})]))}), + M = qlc, + {'EXIT',{badarg,_}} = (catch M:q(bad))">>, + + [<<"Dir = \"">>,ScratchDir,<<"\", + qlc_SUITE:prep_scratchdir(Dir), + + E = ets:new(foo, []), + [true || I <- lists:seq(1, 50000), not ets:insert(E, {I, I})], + H = qlc:q([{X,Y} || Y <- [1,2], + X <- qlc:sort(ets:table(E),{tmpdir,Dir}), + qlc_SUITE:truncate_tmpfile(Dir, 0)]), + R = qlc:eval(H), + ets:delete(E), + {error,_,{bad_object,_}} = R, + \"the tempo\" ++ _ = lists:flatten(qlc:format_error(R))">>], + + [<<"Dir = \"">>,ScratchDir,<<"\", + qlc_SUITE:prep_scratchdir(Dir), + + E = ets:new(foo, []), + Bin = term_to_binary(lists:seq(1,20000)), + [true || I <- lists:seq(1, 10), not ets:insert(E, {I, I, Bin})], + H = qlc:q([{X,Y} || Y <- [1,2], + X <- qlc:sort(ets:table(E),{tmpdir,Dir}), + qlc_SUITE:crash_tmpfile(Dir, 5)]), + R = qlc:eval(H), + ets:delete(E), + {error,_,{bad_object,_}} = R">>], + + <<"E = ets:new(test, []), + H = qlc:q([{X,Y} || X <- qlc_SUITE:bad_table_throw(E), + Y <- ets:table(E)]), + R1 = (catch {any_term,qlc:eval(H, {unique_all,false})}), + R2 = (catch {any_term,qlc:eval(H, {unique_all,true})}), + ets:delete(E), + true = {throw,bad_pre_fun} == R1, + true = {throw,bad_pre_fun} == R2">>, + + <<"E = ets:new(test, []), + H = qlc:q([{X,Y} || X <- qlc_SUITE:bad_table_exit(E), + Y <- ets:table(E)]), + R1 = (catch qlc:eval(H, {unique_all,false})), + R2 = (catch qlc:eval(H, {unique_all,true})), + ets:delete(E), + {'EXIT',{bad_pre_fun,_}} = R1, + {'EXIT',{bad_pre_fun,_}} = R2">>, + + <<"Q = qlc:q([X || X <- [4,3,2,1,0,-1], begin 3/X > 0 end]), + {'EXIT',{badarith,_}} = (catch qlc:eval(Q, {unique_all,false})), + {'EXIT',{badarith,_}} = (catch qlc:eval(Q, {unique_all,true})) + ">>, + + <<"[1,2] = qlc:eval(qlc:q([X || X <- [1,2]])), + [1,2,3,4] = qlc:eval(qlc:append([1,2],[3,4])), + [1,2] = qlc:eval(qlc:sort([2,1])), + E = ets:new(foo, []), + ets:insert(E, [{1},{2}]), + [{1},{2}] = lists:sort(qlc:eval(ets:table(E))), + true = ets:delete(E)">>, + + <<"H = qlc:q([X || X <- [1,2], + begin F = fun() -> + qlc:e(qlc:q([Y || Y <- [1,2]])) end, + F() == (fun f/0)() end]), + [1,2] = qlc:e(H), + ok. + + f() -> [1,2]. + foo() -> bar">>, + + <<"C1_0_1 = [1,2], + %% The PT cannot rename C to C1_0_1; another name is chosen. + [1,2] = qlc:eval(qlc:q([C || C <- C1_0_1]))">>, + + <<"H = qlc:q([X || {X,X} <- [{1,a},{2,2},{b,b},{3,4}]]), + [2,b] = qlc:e(H), + H1 = qlc:q([3 || {X,X} <- [{1,a},{2,2},{b,b},{3,4}]]), + [3,3] = qlc:e(H1)">>, + + %% Just to cover a certain line in qlc.erl (avoids returning []) + <<"E = ets:new(foo, []), + Bin = term_to_binary(lists:seq(1,20000)), + [true || I <- lists:seq(1, 10), not ets:insert(E, {I, I, Bin})], + H = qlc:q([{X,Y} || Y <- [1,2], X <- qlc:sort(ets:table(E))]), + R = qlc:eval(H), + ets:delete(E), + 20 = length(R)">>, + + <<"H = qlc:q([{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W} || + {A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W} <- + [{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w}]]), + [_] = qlc:e(H)">>, + + <<"H = qlc:q([Y || Y <- [1,2]], + {unique, begin [T] = qlc:e(qlc:q([X || X <- [true]], + cache)), + T end}), + [1,2] = qlc:e(H)">> + + ], + + ?line run(Config, Ts), + ok. + +cursor(doc) -> + "cursor/2"; +cursor(suite) -> []; +cursor(Config) when is_list(Config) -> + ScratchDir = filename:join([?privdir, "scratch","."]), + Ts = [<<"{'EXIT',{badarg,_}} = + (catch qlc:cursor(fun() -> not_a_cursor end)), + H0 = qlc:q([X || X <- throw({throw,t})]), + {throw,t} = (catch {any_term,qlc:cursor(H0)}), + H = qlc:q([X || X <- [1,2]]), + {'EXIT',{badarg,_}} = + (catch qlc:cursor(H,{spawn_options, [a|b]})), + {'EXIT',{badarg,_}} = + (catch qlc:cursor(H,{bad_option,true}))">>, + + <<"{'EXIT',{badarg,_}} = (catch qlc:delete_cursor(not_a_cursor))">>, + + [<<"Dir = \"">>,ScratchDir,<<"\", + qlc_SUITE:prep_scratchdir(Dir), % kludge + E = ets:new(foo, []), + [true || I <- lists:seq(1, 50000), not ets:insert(E, {I, I})], + H = qlc:q([{X,Y} || begin put('$qlc_tmpdir', true), true end, + Y <- [1,2], + X <- qlc:sort(ets:table(E),{tmpdir,Dir}), + qlc_SUITE:truncate_tmpfile(Dir, 0)]), + C = qlc:cursor(H), + R = qlc:next_answers(C, all_remaining), + qlc:delete_cursor(C), + erase('$qlc_tmpdir'), + ets:delete(E), + {error,_,{bad_object,_}} = R">>], + + <<"H1 = qlc:q([X || X <- [1,2]]), + C1 = qlc:cursor(H1), + [1,2] = qlc:next_answers(C1, all_remaining), + [] = qlc:next_answers(C1), + [] = qlc:next_answers(C1), + ok = qlc:delete_cursor(C1), + + H2 = qlc:append([1,2],[3,4]), + C2 = qlc:cursor(H2), + [1,2,3,4] = qlc:next_answers(C2, all_remaining), + ok = qlc:delete_cursor(C2), + + H3 = qlc:sort([2,1]), + C3 = qlc:cursor(H3), + [1,2] = qlc:next_answers(C3, all_remaining), + ok = qlc:delete_cursor(C3), + + E = ets:new(foo, []), + ets:insert(E, [{1},{2}]), + H4 = ets:table(E), + C4 = qlc:cursor(H4), + [{1},{2}] = lists:sort(qlc:next_answers(C4, all_remaining)), + ok = qlc:delete_cursor(C4), + true = ets:delete(E)">>, + + <<"H = qlc:q([{X,Y} || X <- [1,2], Y <- [a,b]]), + C = qlc:cursor(H, []), + [{1,a},{1,b}] = qlc:next_answers(C, 2), + [{2,a}] = qlc:next_answers(C, 1), + [{2,b}] = qlc:next_answers(C, all_remaining), + {'EXIT',{badarg,_}} = (catch qlc:next_answers(C, -1)), + P = self(), + Pid1 = spawn_link(fun() -> + {'EXIT',{not_cursor_owner,_}} = + (catch qlc:delete_cursor(C)), + P ! {self(), done} end), + Pid2 = spawn_link(fun() -> + {'EXIT',{not_cursor_owner,_}} = + (catch qlc:next_answers(C)), + P ! {self(), done} end), + receive {Pid1, done} -> ok end, + receive {Pid2, done} -> ok end, + ok = qlc:delete_cursor(C), + {'EXIT',{badarg,_}} = (catch qlc:next_answers(not_a_cursor)), + ok = qlc:delete_cursor(C)">>, + + <<"Q = qlc:q([X || X <- [1,2,1,2,1]]), + C1 = qlc:cursor(Q, [{unique_all,true}]), + [1,2] = qlc:next_answers(C1, all_remaining), + ok = qlc:delete_cursor(C1), + C2 = qlc:cursor(Q, [{unique_all,true}]), + [1,2] = qlc:next_answers(C2, all_remaining), + ok = qlc:delete_cursor(C2)">>, + + <<"Q = qlc:q([X || X <- [1,2,1,2,1]]), + C1 = qlc:cursor(Q, [{unique_all,true},{spawn_options, []}]), + [1,2] = qlc:next_answers(C1, all_remaining), + ok = qlc:delete_cursor(C1), + C2 = qlc:cursor(Q, [{unique_all,true},{spawn_options, default}]), + [1,2] = qlc:next_answers(C2, all_remaining), + ok = qlc:delete_cursor(C2)">>, + + <<"Q = qlc:q([X || X <- [1,2,1,2,1]]), + C1 = qlc:cursor(Q, [{unique_all,false},{spawn_options, []}]), + [1,2,1,2,1] = qlc:next_answers(C1, all_remaining), + ok = qlc:delete_cursor(C1), + C2 = qlc:cursor(Q, [{unique_all,false},{spawn_options, []}]), + [1,2,1,2,1] = qlc:next_answers(C2, all_remaining), + ok = qlc:delete_cursor(C2)">>, + + <<"Q = qlc:q([X || X <- [1,2,1,2,1]]), + C1 = qlc:cursor(Q, [{unique_all,false}]), + [1,2,1,2,1] = qlc:next_answers(C1, all_remaining), + ok = qlc:delete_cursor(C1), + C2 = qlc:cursor(Q, [{unique_all,false}]), + [1,2,1,2,1] = qlc:next_answers(C2, all_remaining), + ok = qlc:delete_cursor(C2)">> + + ], + ?line run(Config, Ts), + ok. + +fold(doc) -> + "fold/4"; +fold(suite) -> []; +fold(Config) when is_list(Config) -> + ScratchDir = filename:join([?privdir, "scratch","."]), + Ts = [<<"Q = qlc:q([X || X <- [1,2,1,2,1]]), + F = fun(Obj, A) -> A++[Obj] end, + {'EXIT',{badarg,_}} = (catch qlc:fold(F, [], Q, {bad,arg})), + {'EXIT',{badarg,_}} = (catch qlc:fold(F, [], badarg)), + {'EXIT',{badarg,_}} = + (catch qlc:fold(F, [], {spawn_options, [a|b]})), + H = qlc:q([X || X <- throw({throw,t})]), + {throw,t} = (catch {any_term,qlc:fold(F, [], H)}), + [1,2] = qlc:fold(F, [], Q, {unique_all,true}), + {'EXIT',{badarg,_}} = + (catch qlc:fold(F, [], Q, [{unique_all,bad}])), + [1,2,1,2,1] = + qlc:fold(F, [], Q, [{unique_all,false}])">>, + + [<<"Dir = \"">>,ScratchDir,<<"\", + qlc_SUITE:prep_scratchdir(Dir), + + E = ets:new(foo, []), + [true || I <- lists:seq(1, 50000), not ets:insert(E, {I, I})], + H = qlc:q([{X,Y} || Y <- [1,2], + X <- qlc:sort(ets:table(E),{tmpdir,Dir}), + qlc_SUITE:truncate_tmpfile(Dir, 0)]), + F = fun(Obj, A) -> A++[Obj] end, + R = qlc:fold(F, [], H), + ets:delete(E), + {error,_,{bad_object,_}} = R">>], + + <<"E = ets:new(test, []), + H = qlc:q([{X,Y} || X <- qlc_SUITE:bad_table_throw(E), + Y <- ets:table(E)]), + F = fun(Obj, A) -> A++[Obj] end, + R1 = (catch {any_term,qlc:fold(F, [], H, {unique_all,false})}), + R2 = (catch {any_term,qlc:fold(F, [], H, {unique_all,true})}), + ets:delete(E), + true = {throw,bad_pre_fun} == R1, + true = {throw,bad_pre_fun} == R2">>, + + <<"E = ets:new(test, []), + H = qlc:q([{X,Y} || X <- qlc_SUITE:bad_table_exit(E), + Y <- ets:table(E)]), + F = fun(Obj, A) -> A++[Obj] end, + R1 = (catch qlc:fold(F, [], H, {unique_all,false})), + R2 = (catch qlc:fold(F, [], H, {unique_all,true})), + ets:delete(E), + {'EXIT',{bad_pre_fun,_}} = R1, + {'EXIT',{bad_pre_fun,_}} = R2">>, + + <<"F = fun(Obj, A) -> A++[Obj] end, + Q = qlc:q([X || X <- [1,2,1,2,1], throw({throw,wrong})]), + {throw,wrong} = + (catch {any_term,qlc:fold(F, [], Q, {unique_all,true})}), + {throw,wrong} = + (catch {any_term,qlc:fold(F, [], Q)})">>, + + <<"F = fun(Obj, A) -> A++[Obj] end, + Q = qlc:q([X || X <- [4,3,2,1,0,-1], begin 3/X > 0 end]), + {'EXIT',{badarith,_}} = + (catch qlc:fold(F, [], Q, {unique_all,true})), + {'EXIT',{badarith,_}} = + (catch qlc:fold(F, [], Q, [{unique_all,false}])) + ">>, + + <<"F = fun(Obj, A) -> A++[Obj] end, + [1,2] = qlc:fold(F, [], qlc:q([X || X <- [1,2]])), + [1,2,3,4] = qlc:fold(F, [], qlc:append([1,2],[3,4])), + [1,2] = qlc:fold(F, [], qlc:sort([2,1])), + E = ets:new(foo, []), + ets:insert(E, [{1},{2}]), + [{1},{2}] = lists:sort(qlc:fold(F, [], ets:table(E))), + true = ets:delete(E)">>, + + <<"F = fun(_Obj, _A) -> throw({throw,fatal}) end, + Q = qlc:q([X || X <- [4,3,2]]), + {throw,fatal} = + (catch {any_term,qlc:fold(F, [], Q, {unique_all,true})}), + {throw,fatal} = + (catch {any_term,qlc:fold(F, [], Q, [{unique_all,false}])})">>, + + <<"G = fun(_Obj, _A, D) -> 17/D end, + F = fun(Obj, A) -> G(Obj, A, 0) end, + Q = qlc:q([X || X <- [4,3,2]]), + {'EXIT',{badarith,_}} = + (catch qlc:fold(F, [], Q, {unique_all,true})), + {'EXIT',{badarith,_}} = + (catch qlc:fold(F, [], Q, [{unique_all,false}])) + ">> + ], + ?line run(Config, Ts), + ok. + +eval_unique(doc) -> + "Test the unique_all option of eval."; +eval_unique(suite) -> []; +eval_unique(Config) when is_list(Config) -> + Ts = [<<"QLC1 = qlc:q([X || X <- qlc:append([[1,1,2], [1,2,3,2,3]])]), + [1,2,3] = qlc:eval(QLC1, {unique_all,true}), + QLC2 = qlc:q([X || X <- [1,2,1,2,1,2,1]]), + [1,2] = qlc:e(QLC2, {unique_all,true})">>, + + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([X || X <- qlc:append([ets:table(E), ets:table(E)])]), + R1 = qlc:e(H, {unique_all,false}), + R2 = qlc:e(H, {unique_all,true}), + ets:delete(E), + true = lists:sort(R1) == [{1,a},{1,a},{2,b},{2,b},{3,c},{3,c}], + true = lists:sort(R2) == [{1,a},{2,b},{3,c}] + ">>, + + <<"Q1 = qlc:q([{X,make_ref()} || X <- [1,2,1,2]]), + [_,_] = qlc:e(Q1, {unique_all,true}), + [_,_,_,_] = qlc:e(Q1, {unique_all,false}), + [_,_] = qlc:e(Q1, [{unique_all,true}]), + Q2 = qlc:q([{X,make_ref()} || X <- qlc:append([[1,2,1,2]])]), + [_,_] = qlc:e(Q2, {unique_all,true}), + [_,_,_,_] = qlc:e(Q2, {unique_all,false}), + [_,_] = qlc:e(Q2, [{unique_all,true}]) + ">>, + + <<"Q = qlc:q([{X,make_ref()} || X <- qlc:sort([1,2,1,2])]), + [_, _] = qlc:e(Q, {unique_all,true}), + Q1 = qlc:q([X || X <- [1,2,1,2]]), + Q2 = qlc:q([{X,make_ref()} || X <- qlc:sort(Q1)]), + [_, _] = qlc:e(Q2, {unique_all,true}) + ">>, + + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([X || X <- qlc:append([[1,2,1,2]])]), + [1,2,1,2] = qlc:e(H, {unique_all,false}), + [1,2] = qlc:e(H, {unique_all,true}), + ets:delete(E)">>, + + <<"E = ets:new(foo, [duplicate_bag]), + true = ets:insert(E, [{1,a},{1,a},{2,b},{3,c},{4,c},{4,d}]), + Q1 = qlc:q([{X,make_ref()} || {_, X} <- ets:table(E)]), + true = length(qlc:eval(Q1, {unique_all, true})) =:= 5, + Q2 = qlc:q([X || {_, X} <- ets:table(E)]), + true = length(qlc:eval(Q2, {unique_all, true})) =:= 4, + Q3 = qlc:q([element(2, X) || X <- ets:table(E)]), + true = length(qlc:eval(Q3, {unique_all, true})) =:= 4, + Q4 = qlc:q([1 || _X <- ets:table(E)]), + true = length(qlc:eval(Q4, {unique_all, true})) =:= 1, + true = ets:delete(E) + ">>, + + <<"Q1 = qlc:q([X || X <- qlc:append([[1], [2,1]])]), + Q2 = qlc:q([X || X <- qlc:append([[2,1], [2]])]), + Q3 = qlc:q([{X,Y} || X <- Q1, Y <- Q2]), + [{1,2},{1,1},{2,2},{2,1}] = qlc:e(Q3, {unique_all,true}), + Q4 = qlc:q([{X,Y,make_ref()} || X <- Q1, Y <- Q2]), + [{1,2,_},{1,1,_},{2,2,_},{2,1,_}] = qlc:e(Q4, {unique_all,true}) + ">>, + + <<"Q1 = qlc:q([X || X <- [1,2,1]]), + Q2 = qlc:q([X || X <- [2,1,2]]), + Q3 = qlc:q([{X,Y} || X <- Q1, Y <- Q2]), + [{1,2},{1,1},{2,2},{2,1}] = qlc:e(Q3,{unique_all,true}), + Q4 = qlc:q([{X,Y,make_ref()} || X <- Q1, Y <- Q2]), + [{1,2,_},{1,1,_},{2,2,_},{2,1,_}] = qlc:e(Q4, {unique_all,true}) + ">>, + + <<"Q1 = qlc:q([X || {X,_} <- [{1,a},{1,b}]]), + [1] = qlc:e(Q1, {unique_all, true}), + Q2 = qlc:q([a || _ <- [{1,a},{1,b}]]), + [a] = qlc:e(Q2, {unique_all, true}) + ">>, + + <<"Q = qlc:q([SQV || SQV <- qlc:q([X || X <- [1,2,1]],unique)], + unique), + {call,_,_,[{lc,_,{var,_,'X'},[{generate,_,{var,_,'X'},_}]},_]} = + qlc:info(Q, [{format,abstract_code},unique_all]), + [1,2] = qlc:e(Q)">>, + + <<"Q = qlc:q([X || X <- [1,2,1]]), + {call,_,_,[{lc,_,{var,_,'X'},[{generate,_,{var,_,'X'},_}]},_]} = + qlc:info(Q, [{format,abstract_code},unique_all]), + [1,2] = qlc:e(Q, unique_all)">>, + + <<"Q1 = qlc:sort([{1},{2},{3},{1}], [{unique,true}]), + Q = qlc:sort(Q1,[{unique,true}]), + {sort,{sort,{list,_},[{unique,true}]},[]} = i(Q)">> + + ], + ?line run(Config, Ts), + ok. + +eval_cache(doc) -> + "Test the cache_all and unique_all options of eval."; +eval_cache(suite) -> []; +eval_cache(Config) when is_list(Config) -> + Ts = [ + <<"E = ets:new(apa, [ordered_set]), + ets:insert(E, [{1},{2}]), + H = qlc:q([X || Y <- [3,4], + ets:insert(E, {Y}), + X <- ets:table(E)]), % already unique, no cache... + {qlc, _, + [{generate, _, {qlc, _, + [{generate, _, {list, [3,4]}}], + [{unique,true}]}}, + _, + {generate, _, {table,_}}], + [{unique,true}]} = i(H, [cache_all, unique_all]), + [{1},{2},{3},{4}] = qlc:e(H, [cache_all, unique_all]), + ets:delete(E)">>, + + <<"E = ets:new(apa, [ordered_set]), + ets:insert(E, [{1},{2}]), + H = qlc:q([X || Y <- [3,4], + ets:insert(E, {Y}), + X <- ets:table(E)]), % no cache... + {qlc, _, + [{generate, _,{list, [3,4]}}, + _, + {generate, _, {table,_}}], + []} = i(H, cache_all), + [{1},{2},{3},{1},{2},{3},{4}] = qlc:e(H, [cache_all]), + ets:delete(E)">>, + + <<"E = ets:new(apa, [ordered_set]), + ets:insert(E, [{1},{2}]), + H = qlc:q([X || Y <- [3,4], + ets:insert(E, {Y}), + X <- qlc:q([X || X <- ets:table(E)], cache)]), + {qlc, _, + [{generate, _, {list, [3,4]}}, + _, + {generate, _, {qlc, _, + [{generate, _, {table,_}}], + [{cache,ets}]}}], + []} = i(H, cache_all), + [{1},{2},{3},{1},{2},{3}] = qlc:e(H, [cache_all]), + ets:delete(E)">>, + + <<"%% {cache_all,no} does not override {cache,true}. + E = ets:new(apa, [ordered_set]), + ets:insert(E, [{1},{2}]), + H = qlc:q([X || Y <- [3,4], + ets:insert(E, {Y}), + X <- qlc:q([X || X <- ets:table(E)], cache)]), + {qlc, _, + [{generate, _, {list, [3,4]}}, + _, + {generate, _, {qlc, _, + [{generate, _, {table,_}}], + [{cache,ets}]}}], + []} = i(H, {cache_all,no}), + [{1},{2},{3},{1},{2},{3}] = qlc:e(H, [cache_all]), + ets:delete(E)">>, + + <<"E = ets:new(apa, [ordered_set]), + ets:insert(E, [{1},{2}]), + H = qlc:q([X || Y <- [3,4], + ets:insert(E, {Y}), + X <- ets:table(E)]), + {qlc, _, + [{generate, _, {qlc, _, [{generate, _,{list, [3,4]}}], + [{unique,true}]}}, + _, + {generate, _,{table,_}}], + [{unique,true}]} = i(H, unique_all), + [{1},{2},{3},{4}] = qlc:e(H, [unique_all]), + ets:delete(E)">>, + + %% cache_all is ignored + <<"E = ets:new(apa, [ordered_set]), + ets:insert(E, [{1},{2},{0}]), + H = qlc:q([X || X <- qlc:sort(ets:table(E))]), + {sort,_Table,[]} = i(H, cache_all), + [{0},{1},{2}] = qlc:e(H, cache_all), + ets:delete(E)">>, + + <<"F = fun(Obj, A) -> A++[Obj] end, + E = ets:new(apa, [duplicate_bag]), + true = ets:insert(E, [{1,a},{2,b},{1,a}]), + Q = qlc:q([X || X <- ets:table(E)], cache), + {table, _} = i(Q, []), + R = qlc:fold(F, [], Q, []), + ets:delete(E), + true = [{1,a},{1,a},{2,b}] == lists:sort(R)">>, + + <<"E = ets:new(apa, [ordered_set]), + ets:insert(E, [{1},{2},{0}]), + H = qlc:q([X || X <- ets:table(E)], cache), + {table, _} = i(H, cache_all), + [{0},{1},{2}]= qlc:e(H, cache_all), + ets:delete(E)">>, + + <<"E = ets:new(foo, []), + true = ets:insert(E, [{1}, {2}]), + Q1 = qlc:q([{X} || X <- ets:table(E)]), + Q2 = qlc:q([{X,Y} || {X} <- Q1, {Y} <- Q1]), + {qlc, _, [{generate, _, {table, _}}, + {generate, _, {qlc, _, [{generate, _, {table, _}}], + [{cache,ets}]}}], + []} = i(Q2, cache_all), + [{{1},{1}},{{1},{2}},{{2},{1}},{{2},{2}}] = + lists:sort(qlc:e(Q2, cache_all)), + ets:delete(E)">>, + + <<"L1 = [1,2,3], + L2 = [4,5,6], + Q1 = qlc:append(L1, L2), + Q2 = qlc:q([{X} || X <- Q1]), + {qlc, _,[{generate, _,{append, [{list, L1}, {list, L2}]}}], []} = + i(Q2, [cache_all]), + [{1},{2},{3},{4},{5},{6}] = qlc:e(Q2, [cache_all])">>, + + <<"H = qlc:sort(qlc:q([1 || _ <- [a,b]])), + {sort, {qlc, _, [{generate, _, {qlc, _, [{generate, _, + {list, [a,b]}}], + [{unique,true}]}}], + [{unique,true}]}, + []} = i(H, unique_all), + [1] = qlc:e(H, unique_all)">> + + ], + ?line run(Config, Ts), + ok. + +append(doc) -> + "Test the append function."; +append(suite) -> []; +append(Config) when is_list(Config) -> + Ts = [<<"C = qlc:cursor(qlc:q([X || X <- [0,1,2,3], begin 10/X > 0.0 end])), + R = (catch qlc:next_answers(C)), + {'EXIT',{badarith,_}} = R">>, + + <<"C = qlc:cursor(qlc:q([X || X <- [0 | fun() -> exit(bad) end]])), + R = (catch qlc:next_answers(C)), + {'EXIT',bad} = R">>, + + <<"{'EXIT',{badarg,_}} = (catch qlc:append([a], a)), + {'EXIT',{badarg,_}} = (catch qlc:append([[a],a]))">>, + + <<"C = qlc:cursor(qlc:q([X || X <- [0,1,2,3], + begin throw({throw,wrong}), true end])), + {throw,wrong} = (catch {any_term,qlc:next_answers(C)})">>, + + <<"QLC = qlc:q([X || X <- [0,1,2,3], + begin throw({throw,wrong}), true end]), + {throw,wrong} = (catch {any_term,qlc:eval(QLC)}), + {throw,wrong} = + (catch {any_term,qlc:e(QLC, {unique_all,true})})">>, + + <<"H1 = qlc:q([X || X <- [1,2,3]]), + H2 = qlc:q([X || X <- [4,5,6]]), + R = qlc:e(qlc:q([X || X <- qlc:append([H1, H2])])), + true = R == [1,2,3,4,5,6]">>, + + <<"H1 = [1,2,3], + H2 = qlc:q([X || X <- [4,5,6]]), + R = qlc:e(qlc:q([X || X <- qlc:append(H1, H2)])), + true = R == [1,2,3,4,5,6]">>, + + <<"H1 = qlc:q([X || X <- [1,2,3]]), + H2 = qlc:q([X || X <- [4,5,6]]), + R = qlc:e(qlc:q([X || X <- qlc:append(qlc:e(H1), H2)])), + true = R == [1,2,3,4,5,6]">>, + + <<"H1 = qlc:q([X || X <- [1,2,3]]), + H2 = [4,5,6], + R = qlc:e(qlc:q([X || X <- qlc:append(H1, H2)])), + true = R == [1,2,3,4,5,6]">>, + + <<"H1 = qlc:q([X || X <- [1,2,3]]), + H2 = qlc:q([X || X <- [4,5,6]]), + R = qlc:e(qlc:q([X || X <- qlc:append([H1, H2, H1]), X < 5])), + true = R == [1,2,3,4,1,2,3]">>, + + <<"R = qlc:e(qlc:q([X || X <- qlc:append([lista(), anrop()])])), + true = R == [a,b,1,2], + ok. + + lista() -> + [a,b]. + + anrop() -> + qlc:q([X || X <- [1,2]]). + foo() -> bar">>, + + %% Used to work up to R11B. + % <<"apa = qlc:e(qlc:q([X || X <- qlc:append([[1,2,3], ugly()])])), + % ok. + % + % ugly() -> + % [a | apa]. + % foo() -> bar">>, + + + %% Maybe this one should fail. + <<"[a|b] = qlc:e(qlc:q([X || X <- qlc:append([[a|b]])])), + ok">>, + + <<"17 = qlc:e(qlc:q([X || X <- qlc:append([[1,2,3],ugly2()])])), + ok. + + ugly2() -> + [a | fun() -> 17 end]. + foo() -> bar">>, + + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([X || X <- qlc:append([ets:table(E), apa])]), + {'EXIT',{badarg,_}} = (catch qlc:e(H)), + false = ets:info(E, safe_fixed), + {'EXIT',{badarg,_}} = (catch qlc:e(H)), + false = ets:info(E, safe_fixed), + {'EXIT',{badarg,_}} = (catch qlc:cursor(H)), + false = ets:info(E, safe_fixed), + F = fun(Obj, A) -> A++[Obj] end, + {'EXIT',{badarg,_}} = (catch qlc:fold(F, [], H)), + false = ets:info(E, safe_fixed), + ets:delete(E)">>, + + <<"H1 = qlc:q([X || X <- [1,2,3]]), + H2 = qlc:q([X || X <- [a,b,c]]), + R = qlc:e(qlc:q([X || X <- qlc:append(H1,qlc:append(H1,H2))])), + true = R == [1,2,3,1,2,3,a,b,c]">>, + + <<"H = qlc:q([X || X <- qlc:append([],qlc:append([[], []]))]), + [] = qlc:e(H)">>, + + <<"Q1 = qlc:q([X || X <- [3,4,4]]), + Q2 = qlc:q([X || X <- qlc:sort(qlc:append([[1,2], Q1]))]), + [1,2,3,4,4] = qlc:e(Q2), + [1,2,3,4] = qlc:e(Q2, {unique_all,true})">>, + + <<"[] = qlc:e(qlc:q([X || X <- qlc:append([])]))">>, + + <<"Q1 = qlc:q([X || X <- [a,b]]), + Q2 = qlc:q([X || X <- [1,2]]), + Q3 = qlc:append([Q1, Q2, qlc:sort([2,1])]), + Q = qlc:q([X || X <- Q3]), + {append, [{list, [a,b]}, + {list, [1,2]}, + {sort,{list, [2,1]},[]}]} = i(Q), + [a,b,1,2,1,2] = qlc:e(Q)">> + + ], + ?line run(Config, Ts), + ok. + +evaluator(doc) -> + "Simple call from evaluator."; +evaluator(suite) -> []; +evaluator(Config) when is_list(Config) -> + ?line true = is_alive(), + evaluator_2(Config, []), + ?line {ok, Node} = start_node(qlc_SUITE_evaluator), + ?line ok = rpc:call(Node, ?MODULE, evaluator_2, [Config, [compiler]]), + ?line ?t:stop_node(Node), + ok. + +evaluator_2(Config, Apps) -> + ?line lists:foreach(fun(App) -> true = code:del_path(App) end, Apps), + FileName = filename:join(?privdir, "eval"), + ?line ok = file:write_file(FileName, + <<"H = qlc:q([X || X <- L]), + [1,2,3] = qlc:e(H).">>), + ?line Bs = erl_eval:add_binding('L', [1,2,3], erl_eval:new_bindings()), + ?line ok = file:eval(FileName, Bs), + + %% The error message is "handled" a bit too much... + %% (no trace of erl_lint left) + ?line ok = file:write_file(FileName, + <<"H = qlc:q([X || X <- L]), qlc:e(H).">>), + ?line {error,_} = file:eval(FileName), + + %% Ugly error message; badarg is caught by file.erl. + ?line ok = file:write_file(FileName, + <<"H = qlc:q([Z || {X,Y} <- [{a,2}], Z <- [Y]]), qlc:e(H).">>), + ?line {error,_} = file:eval(FileName), + + _ = file:delete(FileName), + ok. + +start_node(Name) -> + ?line PA = filename:dirname(code:which(?MODULE)), + ?t:start_node(Name, slave, [{args, "-pa " ++ PA}]). + +string_to_handle(doc) -> + "string_to_handle/1,2."; +string_to_handle(suite) -> []; +string_to_handle(Config) when is_list(Config) -> + ?line {'EXIT',{badarg,_}} = (catch qlc:string_to_handle(14)), + ?line {'EXIT',{badarg,_}} = + (catch qlc:string_to_handle("[X || X <- [a].", unique_all)), + ?line R1 = {error, _, {_,erl_scan,_}} = qlc:string_to_handle("'"), + ?line "1: unterminated " ++ _ = lists:flatten(qlc:format_error(R1)), + ?line {error, _, {_,erl_parse,_}} = qlc:string_to_handle("foo"), + ?line {'EXIT',{badarg,_}} = (catch qlc:string_to_handle("foo, bar.")), + ?line R3 = {error, _, {_,?QLC,not_a_query_list_comprehension}} = + qlc:string_to_handle("bad."), + ?line "1: argument is not" ++ _ = lists:flatten(qlc:format_error(R3)), + ?line R4 = {error, _, {_,?QLC,{used_generator_variable,'Y'}}} = + qlc:string_to_handle("[X || begin Y = [1,2], true end, X <- Y]."), + ?line "1: generated variable 'Y'" ++ _ = + lists:flatten(qlc:format_error(R4)), + ?line {error, _, {_,erl_lint,_}} = qlc:string_to_handle("[X || X <- A]."), + ?line H1 = qlc:string_to_handle("[X || X <- [1,2]]."), + ?line [1,2] = qlc:e(H1), + ?line H2 = qlc:string_to_handle("[X || X <- qlc:append([a,b]," + "qlc:e(qlc:q([X || X <- [c,d,e]])))]."), + ?line [a,b,c,d,e] = qlc:e(H2), + %% The generated fun has many arguments (erl_eval has a maximum of 20). + ?line H3 = qlc:string_to_handle( + "[{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W} ||" + " {A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W} <- []]."), + ?line [] = qlc:e(H3), + ?line Bs1 = erl_eval:add_binding('L', [1,2,3], erl_eval:new_bindings()), + ?line H4 = qlc:string_to_handle("[X || X <- L].", [], Bs1), + ?line [1,2,3] = qlc:e(H4), + ?line H5 = qlc:string_to_handle("[X || X <- [1,2,1,2]].", [unique, cache]), + ?line [1,2] = qlc:e(H5), + + ?line Ets = ets:new(test, []), + ?line true = ets:insert(Ets, [{1}]), + ?line Bs2 = erl_eval:add_binding('E', Ets, erl_eval:new_bindings()), + ?line Q = "[X || {X} <- ets:table(E)].", + ?line [1] = qlc:e(qlc:string_to_handle(Q, [], Bs2)), + ?line [1] = qlc:e(qlc:string_to_handle(Q, {max_lookup,1000}, Bs2)), + ?line [1] = qlc:e(qlc:string_to_handle(Q, {max_lookup,infinity}, Bs2)), + ?line {'EXIT',{badarg,_}} = + (catch qlc:string_to_handle(Q, {max_lookup,-1}, Bs2)), + ?line {'EXIT', {no_lookup_to_carry_out, _}} = + (catch qlc:e(qlc:string_to_handle(Q, {lookup,true}, Bs2))), + ?line ets:delete(Ets), + ok. + +table(doc) -> + "table"; +table(suite) -> []; +table(Config) when is_list(Config) -> + dets:start(), + Ts = [ + <<"E = ets:new(test, []), + {'EXIT',{badarg,_}} = + (catch qlc:e(qlc:q([X || X <- ets:table(E, [badarg])]))), + [] = qlc:e(qlc:q([X || X <- ets:table(E)])), + ets:delete(E)">>, + + <<"{'EXIT',{badarg,_}} = (catch qlc:table(not_a_fun, []))">>, + + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([{X,Y} || X <- ets:table(E), Y <- ets:table(E)]), + R = qlc:e(H), + ets:delete(E), + [{{1,a},{1,a}},{{1,a},{2,b}},{{1,a},{3,c}}, + {{2,b},{1,a}},{{2,b},{2,b}},{{2,b},{3,c}}, + + {{3,c},{1,a}},{{3,c},{2,b}},{{3,c},{3,c}}] = lists:sort(R)">>, + + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([X || X <- qlc:append([ets:table(E), [a,b,c], + ets:table(E)])]), + R = qlc:e(H), + ets:delete(E), + [a,b,c,{1,a},{1,a},{2,b},{2,b},{3,c},{3,c}] = lists:sort(R)">>, + + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + false = ets:info(E, safe_fixed), + H = qlc:q([{X,Y} || X <- ets:table(E, {n_objects, default}), + Y <- ets:table(E, {n_objects, 2}), + false =/= ets:info(E, safe_fixed), + throw({throw,apa})]), + {throw,apa} = (catch {any_term,qlc:e(H)}), + false = ets:info(E, safe_fixed), + ets:delete(E)">>, + + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + false = ets:info(E, safe_fixed), + H = qlc:q([{X,Y} || X <- ets:table(E), Y <- ets:table(E), + false =/= ets:info(E, safe_fixed), exit(apa)]), + {'EXIT',apa} = (catch {any_term,qlc:e(H)}), + false = ets:info(E, safe_fixed), + ets:delete(E)">>, + + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([{X,Y} || X <- qlc_SUITE:bad_table_throw(E), + Y <- ets:table(E)]), + R = (catch {any_term,qlc:cursor(H)}), + false = ets:info(E, safe_fixed), + ets:delete(E), + {throw,bad_pre_fun} = R">>, + + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([{X,Y} || X <- qlc_SUITE:bad_table_exit(E), + Y <- ets:table(E)]), + R = (catch {any_term,qlc:cursor(H)}), + false = ets:info(E, safe_fixed), + ets:delete(E), + {'EXIT',{bad_pre_fun,_}} = R">>, + + <<"E = ets:new(test, [ordered_set]), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([X || X <- qlc_SUITE:default_table(E)]), + R = qlc:e(H), + ets:delete(E), + [{1,a},{2,b},{3,c}] = R">>, + + <<"E = ets:new(test, [ordered_set]), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([X || X <- qlc_SUITE:bad_table(E)]), + {'EXIT', {badarg, _}} = (catch qlc:e(H)), + ets:delete(E)">>, + + %% The info tag num_of_objects is currently not used. +% <<"E = ets:new(test, [ordered_set]), +% true = ets:insert(E, [{1,a},{2,b},{3,c}]), +% H = qlc:q([X || X <- qlc_SUITE:bad_table_info_fun_n_objects(E)]), +% {'EXIT', finito} = (catch {any_term,qlc:e(H)}), +% ets:delete(E)">>, + + <<"E = ets:new(test, [ordered_set]), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([Y || {X,Y} <- qlc_SUITE:bad_table_info_fun_indices(E), + X =:= a]), + %% This is due to lookup. If the table were traversed there + %% would be no failure. + {throw, apa} = (catch {any_term,qlc:e(H)}), + ets:delete(E)">>, + + <<"E = ets:new(test, [ordered_set]), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + H = qlc:q([Y || {X,Y} <- qlc_SUITE:bad_table_info_fun_keypos(E), + X =:= a]), + {'EXIT',{keypos,_}} = (catch {any_term,qlc:info(H)}), + {'EXIT',{keypos,_}} = (catch {any_term,qlc:e(H)}), + ets:delete(E)">>, + + begin + MS = ets:fun2ms(fun(X) when element(1, X) > 1 -> X end), + [<<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + MS = ">>, io_lib:format("~w", [MS]), <<", + H = qlc:q([{X,Y} || X <- ets:table(E,{traverse,{select, MS}}), + Y <- ets:table(E)]), + R = qlc:e(H), + ets:delete(E), + [{{2,b},{1,a}},{{2,b},{2,b}},{{2,b},{3,c}}, + {{3,c},{1,a}},{{3,c},{2,b}},{{3,c},{3,c}}] = lists:sort(R)">>] + end, + + begin % a short table + MS = ets:fun2ms(fun(X) when element(1, X) > 1 -> X end), + [<<"E = ets:new(test, []), + true = ets:insert(E, [{0,b}]), + MS = ">>, io_lib:format("~w", [MS]), <<", + H1 = qlc:q([X || X <- ets:table(E)]), + R1 = qlc:e(H1), + H2 = qlc:q([X || X <- ets:table(E, {traverse, {select, MS}})]), + R2 = qlc:e(H2), + ets:delete(E), + [_] = R1, + [] = R2">>] + end, + + begin + File = filename:join(?privdir, "detsfile"), + _ = file:delete(File), + [<<"{ok, Tab} = dets:open_file(apa, [{file,\"">>, File, <<"\"}, + {type,bag}]), + ok = dets:insert(Tab, [{1,a},{1,b}]), + R = qlc:e(qlc:q([X || X <- dets:table(Tab)])), + dets:close(Tab), + file:delete(\"">>, File, <<"\"), + R">>] + end, + + %% [T || P <- Table, F] turned into a match spec. + <<"E = ets:new(apa, [duplicate_bag]), + true = ets:insert(E, [{1,a},{2,b},{3,c},{4,d}]), + QH = qlc:q([X || {X,_} <- ets:table(E), X > 2], unique), + {qlc, _, [{generate, _, {table, _}}], [{unique,true}]} = i(QH), + [3,4] = lists:sort(qlc:e(QH)), + ets:delete(E)">>, + + <<"E = ets:new(apa, []), + true = ets:insert(E, [{1,a},{2,b}]), + {'EXIT', {badarg, _}} = (catch qlc_SUITE:bad_table_format(E)), + ets:delete(E)">>, + + <<"E = ets:new(apa, []), + true = ets:insert(E, [{1,a},{2,b}]), + {'EXIT', {badarg, _}} = (catch qlc_SUITE:bad_table_format_arity(E)), + ets:delete(E)">>, + + <<"E = ets:new(apa, []), + true = ets:insert(E, [{1,a},{2,b}]), + {'EXIT', {badarg, _}} = (catch qlc_SUITE:bad_table_info_arity(E)), + ets:delete(E)">>, + + <<"E = ets:new(apa, []), + true = ets:insert(E, [{1,a},{2,b}]), + {'EXIT', {badarg, _}} = (catch qlc_SUITE:bad_table_traverse(E)), + ets:delete(E)">>, + + <<"E = ets:new(apa, []), + true = ets:insert(E, [{1,a},{2,b}]), + {'EXIT', {badarg, _}} = (catch qlc_SUITE:bad_table_post(E)), + ets:delete(E)">>, + + <<"E = ets:new(apa, []), + true = ets:insert(E, [{1,a},{2,b}]), + {'EXIT', {badarg, _}} = (catch qlc_SUITE:bad_table_max_lookup(E)), + ets:delete(E)">>, + + <<"E = ets:new(apa, []), + true = ets:insert(E, [{1,a},{2,b}]), + {'EXIT', {badarg, _}} = (catch qlc_SUITE:bad_table_lookup(E)), + ets:delete(E)">>, + + <<"L = [{1,a},{2,b},{3,c}], + QH = qlc:q([element(2, X) || X <- qlc_SUITE:table(L, [2]), + (element(1, X) =:= 1) + or (2 =:= element(1, X))]), + [a,b] = lists:sort(qlc:e(QH))">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{A,B} || {A,B} <- + qlc:q([{B,A} || {A,B} <- ets:table(E), + (A =:= 1) or (A =:= 2), + math:sqrt(B) < A])]), + [{2,2}] = qlc:eval(Q), + [1,2] = lookup_keys(Q) + end, [{1,1},{2,2}])">> + ], + ?line run(Config, Ts), + + Ts2 = [ + %% [T || P <- Table, F] turned into a match spec. Records needed. + <<"E = ets:new(foo, [bag]), + ets:insert(E, [{a,1,2},#a{b=3,c=4},{a,3}]), + QH = qlc:q([X || X <- ets:table(E), is_record(X, a)]), + {list,{table,_}, _} = i(QH), + [{a,1,2},{a,3,4}] = lists:sort(qlc:eval(QH)), + ets:delete(E)">> + ], + ?line run(Config, <<"-record(a, {b,c}).\n">>, Ts2), + + ok. + +process_dies(doc) -> + "Caller or cursor process dies."; +process_dies(suite) -> []; +process_dies(Config) when is_list(Config) -> + Ts = [ + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + false = ets:info(E, safe_fixed), + Parent = self(), + F = fun() -> + H = qlc:q([X || X <- ets:table(E)]), + qlc:cursor(H), + Parent ! {self(),ok} + end, + Pid = spawn_link(F), + receive {Pid,ok} -> ok end, + timer:sleep(10), + false = ets:info(E, safe_fixed), + ets:delete(E)">>, + + <<"%% This is not nice. The cursor's monitor kicks in. + E = ets:new(test, []), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + false = ets:info(E, safe_fixed), + Parent = self(), + F = fun() -> + H = qlc:q([X || begin + process_flag(trap_exit, false), + {links, [Pid]} = + process_info(self(), links), + unlink(Pid), + timer:sleep(1), + {links, []} = + process_info(self(), links), + true + end, + X <- ets:table(E)]), + C = qlc:cursor(H), + qlc:next_answers(C), + Parent ! {self(),ok} + end, + Pid = spawn_link(F), + receive {Pid,ok} -> ok end, + timer:sleep(10), + false = ets:info(E, safe_fixed), + ets:delete(E)">>, + + <<"H = qlc:q([X || X <- [1,2]]), + {qlc_cursor, Term} = C = qlc:cursor(H), + PF = process_flag(trap_exit, true), + F = fun(T) -> not is_pid(T) end, + [Pid|_] = lists:dropwhile(F, tuple_to_list(Term)), + exit(Pid, kill), + timer:sleep(1), + {'EXIT', {{qlc_cursor_pid_no_longer_exists, Pid}, _}} = + (catch qlc:next_answers(C)), + process_flag(trap_exit, PF)">>, + <<"H = qlc:q([X || begin process_flag(trap_exit, true), true end, + X <- [1,2]]), + {qlc_cursor, Term} = C = qlc:cursor(H), + PF = process_flag(trap_exit, true), + F = fun(T) -> not is_pid(T) end, + [Pid|_] = lists:dropwhile(F, tuple_to_list(Term)), + [1] = qlc:next_answers(C, 1), + exit(Pid, stop), + timer:sleep(1), + {'EXIT', {{qlc_cursor_pid_no_longer_exists, Pid}, _}} = + (catch qlc:next_answers(C)), + process_flag(trap_exit, PF)">>, + <<"%% This is not nice. No cleanup is done... + H = qlc:q([X || begin process_flag(trap_exit, false), true end, + X <- [1,2]]), + {qlc_cursor, Term} = C = qlc:cursor(H), + PF = process_flag(trap_exit, true), + F = fun(T) -> not is_pid(T) end, + [Pid|_] = lists:dropwhile(F, tuple_to_list(Term)), + [1] = qlc:next_answers(C, 1), + exit(Pid, stop), + timer:sleep(1), + {'EXIT', {{qlc_cursor_pid_no_longer_exists, Pid}, _}} = + (catch qlc:next_answers(C)), + process_flag(trap_exit, PF)">>, + + <<"PF = process_flag(trap_exit, true), + E = ets:new(test, []), + %% Hard kill. No cleanup will be done. + H = qlc:q([X || begin exit(self(), kill), true end, + X <- ets:table(E)]), + C = qlc:cursor(H), + {'EXIT', {{qlc_cursor_pid_no_longer_exists, _}, _}} = + (catch qlc:next_answers(C)), + false = ets:info(E, safe_fixed), % - but Ets cleans up anyway. + true = ets:delete(E), + process_flag(trap_exit, PF)">>, + + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a}]), + %% The signal is caught by trap_exit. No process dies... + H = qlc:q([X || begin exit(self(), normal), true end, + X <- ets:table(E)]), + C = qlc:cursor(H, {spawn_options, []}), + [{1,a}] = qlc:next_answers(C), + qlc:delete_cursor(C), + false = ets:info(E, safe_fixed), + true = ets:delete(E)">>, + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a}]), + %% The same as last example. + H = qlc:q([X || begin + process_flag(trap_exit, true), + exit(self(), normal), true + end, + X <- ets:table(E)]), + C = qlc:cursor(H, {spawn_options, []}), + [{1,a}] = qlc:next_answers(C), + qlc:delete_cursor(C), + false = ets:info(E, safe_fixed), + true = ets:delete(E), ok">>, + <<"E = ets:new(test, []), + true = ets:insert(E, [{1,a}]), + H = qlc:q([X || X <- ets:table(E)]), + SpawnOpts = [link, monitor], % monitor is ignored + {qlc_cursor, Term} = C = qlc:cursor(H, {spawn_options, SpawnOpts}), + F = fun(T) -> not is_pid(T) end, + [Pid|_] = lists:dropwhile(F, tuple_to_list(Term)), + Me = self(), + qlc_SUITE:install_error_logger(), + Tuple = {this, tuple, is, writton, onto, the, error_logger}, + SP = spawn(fun() -> + Pid ! Tuple, + Me ! {self(), done} + end), + receive {SP, done} -> ok end, + [{1,a}] = qlc:next_answers(C), + qlc:delete_cursor(C), + {error, _Pid, Tuple} = qlc_SUITE:read_error_logger(), + qlc_SUITE:uninstall_error_logger(), + false = ets:info(E, safe_fixed), + true = ets:delete(E), ok">> + + ], + ?line run(Config, Ts), + ok. + +sort(doc) -> + "The sort option."; +sort(suite) -> []; +sort(Config) when is_list(Config) -> + Ts = [ + <<"H = qlc:q([X || X <- qlc:sort([1,2,3,2], {unique,true})]), + [1,2,3] = qlc:e(H), + C1 = qlc:cursor(H), + [1,2,3] = qlc:next_answers(C1, all_remaining), + qlc:delete_cursor(C1)">>, + + <<"H = qlc:q([{X,Y} || X <- qlc:sort(qlc:q([X || X <- [1,2,3,2]]), + {unique,true}), + Y <- [a,b]]), + [{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}] = qlc:e(H), + C = qlc:cursor(H), + [{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}] = + qlc:next_answers(C, all_remaining), + qlc:delete_cursor(C)">>, + + <<"H = qlc:q([X || X <- qlc:sort(qlc:q([X || X <- apa]))]), + {'EXIT',{badarg,_}} = (catch qlc:e(H))">>, + + %% An example with a side effect. The result may vary... + <<"E = ets:new(test, [duplicate_bag]), + true = ets:insert(E, [{1,17},{1,a}]), + H_1 = qlc:q([X || X <- ets:table(E)]), + H = qlc:q([X || X <- [1,2,3], ets:insert(E, {1,-X}), + {_,Y} <- H_1, + X > Y]), + true = lists:sort(qlc:e(H)) == [1,2,2,3,3,3], + true = ets:delete(E)">>, + + <<"E = ets:new(test, [duplicate_bag]), + true = ets:insert(E, [{1,17}]), + H_1 = qlc:q([X || X <- qlc:sort(ets:tab2list(E))]), + %% Note: side effect in filter! + H = qlc:q([X || X <- [1,2,3], ets:insert(E, {1,-X}), + {_,Y} <- H_1, X > Y]), + [] = qlc:e(H), + true = ets:delete(E)">>, + + <<"H = qlc:q([X || X <- qlc:sort([1,2,3], {fopp,la})]), + {'EXIT',{badarg,_}} = (catch qlc:e(H)), + {'EXIT',{badarg,_}} = (catch qlc:cursor(H)), + F = fun(Obj, A) -> A++[Obj] end, + {'EXIT',{badarg,_}} = (catch qlc:fold(F, [], H))">>, + + <<"Q1 = qlc:q([X || X <- [1,2]]), + AL = [Q1, [1,2,3]], + Q2 = qlc:q([X || X <- qlc:sort(qlc:append(AL))]), + [1,1,2,2,3] = qlc:e(Q2)">>, + + <<"H = qlc:q([{X,Y} || X <- qlc:sort(qlc:q([X || X <- [1,2,3,2]]), + {unique,true}), + Y <- [a,b]]), + {qlc, _, + [{generate, _, {sort, {qlc, _, [{generate, _, {list, [1,2,3,2]}}], + [{unique,true}]}, + []}}, + {generate, _, {qlc, _, [{generate, _, {list, [a,b]}}], + [{unique,true}]}}], + [{unique,true}]} = i(H, unique_all), + [{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}] = qlc:e(H, unique_all)">>, + + <<"L = [1,2,1,3,4,3,1], + true = lists:sort(L) == qlc:e(qlc:q([X || X <- qlc:sort(L)])), + true = lists:usort(L) == + qlc:e(qlc:q([X || X <- qlc:sort(L, {unique,true})])), + true = lists:reverse(lists:sort(L)) == + qlc:e(qlc:q([X || X <- qlc:sort(L, {order, descending})])), + true = lists:reverse(lists:usort(L)) == + qlc:e(qlc:q([X || X <- qlc:sort(L, [{order, descending}, + {unique, true}])])), + CF = fun(X, Y) -> X =< Y end, + true = lists:sort(L) == + qlc:e(qlc:q([X || X <- qlc:sort(L, {order, CF})])), + true = lists:usort(L) == + qlc:e(qlc:q([X || X <- qlc:sort(L, [{order, CF}, + {unique, true}])]))">>, + + <<"E = ets:new(foo, []), + [true || I <- lists:seq(1, 50000), not ets:insert(E, {I, I})], + H = qlc:q([{X,Y} || X <- [a,b], Y <- qlc:sort(ets:table(E))]), + 100000 = length(qlc:e(H)), + ets:delete(E)">>, + + begin + TmpDir = ?privdir, + [<<"TE = process_flag(trap_exit, true), + E = ets:new(foo, []), + [true || I <- lists:seq(1, 50000), not ets:insert(E, {I, I})], + Ports = erlang:ports(), + H = qlc:q([{X,Y} || X <- [a,b], + begin + [P] = erlang:ports() -- Ports, + exit(P, port_exit), + true + end, + Y <- qlc:sort(ets:table(E), + [{tmpdir,\"">>, + TmpDir, <<"\"}])]), + {error, qlc, {file_error, _, _}} = (catch qlc:e(H)), + receive {'EXIT', _, port_exit} -> ok end, + ets:delete(E), + process_flag(trap_exit, TE)">>] + end + + ], + ?line run(Config, Ts), + ok. + +keysort(doc) -> + "The sort option."; +keysort(suite) -> []; +keysort(Config) when is_list(Config) -> + + Ts = [ + <<"OF = fun(X, Y) -> X =< Y end, + F = fun(Obj, A) -> A++[Obj] end, + H = qlc:q([X || X <- qlc:keysort(1, [{2,a},{1,b}], {order,OF})]), + {'EXIT',{{badarg,order},_}} = (catch qlc:e(H)), + {'EXIT',{{badarg,order},_}} = (catch qlc:fold(F, [], H)), + {'EXIT',{{badarg,order},_}} = (catch qlc:cursor(H))">>, + + <<"E = create_ets(1, 2), + H = qlc:q([X || X <- qlc:keysort([1], ets:table(E), + [{size,1},{tmpdir,\"/a/b/c\"}])]), + H1 = qlc:q([X || {X,_} <- qlc:e(H), X < 4]), + {error,_,{file_error,_,_}} = qlc:info(H1), + {error,_,{file_error,_,_}} = qlc:e(H1), + ets:delete(E)">>, + + <<"L = [{1,a},{2,b},{3,c},{2,b}], + H = qlc:q([{X,Y} || {X,_} <- qlc:keysort(1, qlc:q([X || X <- L]), + {unique,true}), + Y <- [a,b]]), + [{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}] = qlc:e(H), + C = qlc:cursor(H), + [{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}] = + qlc:next_answers(C, all_remaining), + qlc:delete_cursor(C)">>, + + <<"H1 = qlc:q([X || X <- qlc:keysort(0, [])]), + {'EXIT',{badarg,_}} = (catch qlc:e(H1)), + H2 = qlc:q([X || X <- qlc:keysort(1, [], {bad,arg})]), + {'EXIT',{badarg,_}} = (catch qlc:e(H2)), + H3 = qlc:q([X || X <- qlc:keysort([], [])]), + {'EXIT',{badarg,_}} = (catch qlc:e(H3))">>, + + <<"H = qlc:q([X || X <- qlc:keysort(1, [{1,a},{2,b}], + [{order,descending}, + {compressed,true}])]), + [{2,b},{1,a}] = qlc:e(H), + H2 = qlc:q([X || X <- qlc:keysort(1, [{1},{2}], compressed)]), + {'EXIT', {badarg, _}} = (catch qlc:e(H2))">>, + + <<"H = qlc:q([X || X <- qlc:keysort(1, [{1,a},{2,b}], {compressed,false})]), + [{1,a},{2,b}] = qlc:e(H)">>, + + <<"E = create_ets(1, 2), + H = qlc:q([X || X <- qlc:keysort([1], ets:table(E), + [{size,1},{tmpdir,\"/a/b/c\"}])]), + F = fun(Obj, A) -> A++[Obj] end, + {error,_,{file_error,_,_}} = qlc:e(H), + \" \\\"no such\" ++ _ = lists:dropwhile(fun(A) -> A =/= $\s end, + lists:flatten(qlc:format_error(qlc:e(H)))), + {error,_,{file_error,_,_}} = qlc:e(H, {unique_all,true}), + {error,_,{file_error,_,_}} = qlc:cursor(H), + {error,_,{file_error,_,_}} = qlc:cursor(H, {unique_all,true}), + {error,_,{file_error,_,_}} = qlc:cursor(H, {spawn_options, []}), + {error,_,{file_error,_,_}} = qlc:cursor(H, {spawn_options,default}), + {error,_,{file_error,_,_}} = + qlc:cursor(H, [{unique_all,true},{spawn_options, []}]), + {error,_,{file_error,_,_}} = qlc:fold(F, [], H), + {error,_,{file_error,_,_}} = qlc:fold(F, [],H, {unique_all,true}), + ets:delete(E)">>, + + <<"L = [{1,b,a},{1,b,b},{1,a,a}], + H = qlc:q([X || X <- qlc:keysort([4,1], L)]), + {error,_,bad_object} = qlc:e(H), + \"the keys\" ++ _ = qlc:format_error(qlc:e(H))">>, + + begin + File = filename:join(?privdir, "afile"), + ok = file:write_file(File, <<>>), + [<<"H = qlc:q([X || X <- qlc:keysort([1], [{1},{2},{1}], + [{tmpdir,\"">>, File, <<"\"}, + {size,1}])]), + {error,_,{file_error,_,_}} = qlc:e(H), + file:delete(\"">>, File, <<"\")">>] + end, + + <<"H0 = qlc:q([X || X <- [1,2,3]]), + H = qlc:q([X || X <- qlc:sort(H0,{tmpdir,\".\"})]), + [1,2,3] = qlc:e(H)">>, + + %% The global option 'tmpdir' takes precedence. + begin + PrivDir = ?privdir, + [<<"L = [{1,a},{2,b}], + H = qlc:q([X || X <- qlc:keysort([1], L, {tmpdir,\"/a/b/c\"})]), + H1 = qlc:q([X || X <- H, X > 3]), + Dir = \"">>, PrivDir, <<"\", + Options = [{tmpdir, Dir}], + {qlc,_,[{generate,_,{keysort,{list,L},[1],[{tmpdir,Dir}]}},_],[]} = + i(H1, Options), + [{1,a},{2,b}] = qlc:e(H1, Options)">>] % no check of "/a/b/c" + end, + + <<"L = [{2,c},{1,b},{1,a},{3,a},{1,c},{2,b}], + true = lists:sort(L) == + qlc:e(qlc:q([X || X <- qlc:keysort([1,2], L)]))">>, + + <<"L = [{1,b},{2,c},{1,a},{3,e},{4,f},{3,d}], + true = lists:keysort(1, L) == + qlc:e(qlc:q([X || X <- qlc:keysort(1,L)])), + true = lists:ukeysort(1, L) == + qlc:e(qlc:q([X || X <- qlc:keysort(1, L, {unique,true})])), + true = lists:reverse(lists:keysort(1, L)) == + qlc:e(qlc:q([X || X <- qlc:keysort(1,L, + {order, descending})])), + true = lists:reverse(lists:ukeysort(1, L)) == + qlc:e(qlc:q([X || X <- qlc:keysort(1, L, [{unique,true}, + {order, descending}])]))">>, + + <<"L = [{X} || X <- lists:seq(1,100000)], + H1 = qlc:append([L,[{1,2},{2,3},{3,4}]]), + H = qlc:keysort([1], qlc:keysort([1], H1, [{compressed,true}])), + R = qlc:e(H), + 100003 = length(R)">> + + ], + ?line run(Config, Ts), + + ok. + +filesort(doc) -> + "keysort/1,2, using a file."; +filesort(suite) -> []; +filesort(Config) when is_list(Config) -> + Ts = [ + <<"Q = qlc:q([X || X <- [{3},{1},{2}]]), + Opts = [{size,10},{no_files,3}], + Q2 = qlc:q([{X,Y} || Y <- [1,2], X <- qlc:keysort([1],Q,Opts)]), + [{{1},1},{{2},1},{{3},1},{{1},2},{{2},2},{{3},2}] = qlc:e(Q2)">> + ], + ?line run(Config, Ts), + ok. + + +cache(doc) -> + "The cache option."; +cache(suite) -> []; +cache(Config) when is_list(Config) -> + Ts = [ + <<"{'EXIT', {badarg, _}} = (catch qlc:q([X || X <- [1,2]], badarg))">>, + + <<"Q1 = qlc:q([X || X <- [1,2,1,2,1]], {unique,true}), + [1,2] = qlc:e(Q1), + [1,2] = qlc:e(Q1, {unique_all,true}), + Q2 = qlc:q([X || X <- qlc:q([X || X <- [1,2,1,2,1]], + {unique,true})]), + [1,2] = qlc:e(Q2), + [1,2] = qlc:e(Q2, {unique_all,true}), + Q3 = qlc:q([X || X <- qlc:append([[1,2,3], [4,5,6]])]), + [1,2,3,4,5,6] = qlc:e(Q3)">>, + + <<"Q1 = qlc:q([X || {X,_} <- [{1,a},{2,a},{1,b},{2,b}]]), + Q2 = qlc:q([{X,make_ref()} || X <- Q1]), + [{1,_},{2,_},{1,_},{2,_}] = qlc:e(Q2, {unique_all,false}), + [{1,_},{2,_}] = qlc:e(Q2, {unique_all,true})">>, + + <<"E = ets:new(test, [duplicate_bag]), + true = ets:insert(E, [{1,a},{2,a},{1,b},{2,b}]), + Q1 = qlc:q([X || {X,_} <- ets:table(E)]), + Q2 = qlc:q([{X,make_ref()} || X <- Q1]), + [{1,_},{1,_},{2,_},{2,_}] = lists:sort(qlc:e(Q2, {unique_all,false})), + [{1,_},{2,_}] = lists:sort(qlc:e(Q2, {unique_all,true})), + ets:delete(E)">>, + + <<"Q1 = qlc:q([X || {X,_} <- [{1,a},{2,a},{1,b},{2,b}]]), + Q2 = qlc:q([{X,make_ref()} || X <- qlc:append([Q1, Q1])]), + [{1,_},{2,_},{1,_},{2,_},{1,_},{2,_},{1,_},{2,_}] = + qlc:e(Q2, {unique_all,false}), + [{1,_},{2,_}] = qlc:e(Q2, {unique_all,true})">>, + + <<"[] = qlc:e(qlc:q([X || X <- []], {unique, true})), + [] = qlc:e(qlc:q([X || X <- qlc:q([X || X <- qlc:append([])], + {unique,true})]))">>, + + <<"Q1 = qlc:q([{X,make_ref()} || {X,_} <- [{1,a},{1,b}]]), + [{1,_},{1,_}] = qlc:e(Q1, {unique_all, true}), + Q2 = qlc:q([Y || {X,_} <- [{1,a},{1,b}], + begin Y = {X,make_ref()}, true end]), + [{1,_},{1,_}] = qlc:e(Q2, {unique_all,true}), + Q3 = qlc:q([Y || X <- [{1,a},{2,a}], + begin {_,Z} = X, Y = {Z,make_ref()}, true end]), + [{a,_},{a,_}] = qlc:e(Q3, {unique_all, true})">>, + + <<"E = ets:new(apa, [duplicate_bag]), + ets:insert(E, [{1,a},{2,a},{1,a}]), + H1 = qlc:q([X || X <- qlc:append(ets:table(E),[7,3,5])], + {cache, true}), + [{_,a},{_,a},{_,a},7,3,5] = qlc:e(H1), + ets:delete(E)">>, + + <<"F = fun(Obj, A) -> A++[Obj] end, + H = qlc:q([X || X <- [1,3,2,4]], cache), + Q = qlc:q([X || X <- H]), + [1,3,2,4] = qlc:fold(F, [], Q, [])">>, + + <<"F = fun(Obj, A) -> A++[Obj] end, + E = ets:new(apa, [duplicate_bag]), + true = ets:insert(E, [{1,a},{2,b},{1,a}]), + Q1 = qlc:q([X || X <- ets:table(E)], [cache, unique]), + Q = qlc:q([X || X <- Q1], [cache, unique]), + {qlc, _, [{generate, _,{table,_}}], [{unique,true}]} = i(Q), + R = qlc:fold(F, [], Q, []), + ets:delete(E), + true = [{1,a},{2,b}] == lists:sort(R)">>, + + <<"E = ets:new(apa, [duplicate_bag]), + ets:insert(E, [{1,a},{2,b},{1,a}]), + H1 = qlc:q([X || X <- qlc:append(ets:table(E),[7,3])], cache), + H2 = qlc:q([{Y,X} || Y <- [2,1,3], X <- H1]), + [{2,_},{2,_},{2,_},{2,7},{2,3}, + {1,_},{1,_},{1,_},{1,7},{1,3}, + {3,_},{3,_},{3,_},{3,7},{3,3}] = qlc:e(H2), + ets:delete(E)">>, + + %% This case is not 100 percent determined. An Ets table + %% is updated in a filter and later used in a generator. + <<"E = ets:new(apa, [bag]), + true = ets:insert(E, [{1,a},{2,b}]), + H1 = qlc:q([Y || Y <- ets:table(E)], + [{cache, no}, {unique, true}]), + H = qlc:q([{X,Y} || X <- [{1,a},{2,d},{3,e}], + ets:insert(E, X), + Y <- H1]), + [{{1,a},_}, {{1,a},_}, {{2,d},_}, {{2,d},_}, {{2,d},_}, + {{3,e},_}, {{3,e},_}, {{3,e},_}, {{3,e},_}] = qlc:e(H), + ets:delete(E)">>, + + %% This case is not 100 percent determined. An Ets table + %% is updated in a filter and later used in a generator. + <<"E = ets:new(apa, [bag]), + true = ets:insert(E, [{1,a},{2,b}]), + H1 = qlc:q([Y || Y <- ets:table(E)], + [{cache, true}, {unique, true}]), + H = qlc:q([{X,Y} || X <- [{1,a},{2,d},{3,e}], + ets:insert(E, X), + Y <- H1]), + [{{1,a},_}, {{1,a},_}, {{2,d},_}, {{2,d},_}, {{3,e},_}, {{3,e},_}] = + qlc:e(H), + ets:delete(E)">>, + + <<"%% {5979} and {5549} are both hashed to 28244 by phash2/1 + E = ets:new(apa, [duplicate_bag]), + true = ets:insert(E, [{5979},{5549},{5979},{5549},{0}]), + H1 = qlc:q([X || X <- ets:table(E)], + [{cache, true}, {unique, true}]), + H = qlc:q([Y || _ <- [1,2], Y <- H1]), + {qlc, _, [{generate, _, {list, [1,2]}}, + {generate, _, {qlc, _, [{generate, _, {table,_}}], + [{cache,ets},{unique,true}]}}], + []} = i(H), + [{0},{0},{5549},{5549},{5979},{5979}] = lists:sort(qlc:e(H)), + ets:delete(E)">>, + + <<"E = ets:new(apa, [ordered_set]), + ets:insert(E, [{1},{2}]), + H1 = qlc:q([X || X <- ets:table(E)], [cache, unique]), + H2 = qlc:q([X || Y <- [3,4], ets:insert(E, {Y}), X <- H1]), + {qlc, _, [{generate, _, {list, [3,4]}}, _, + {generate, _, {qlc, _, [{generate, _, + {table, _}}], + [{cache, ets}]}}], + []} = i(H2), + [{1},{2},{3},{1},{2},{3}] = qlc:e(H2), + ets:delete(E)">>, + + <<"E = ets:new(apa, [ordered_set]), + ets:insert(E, [{1},{2}]), + H1 = qlc:q([X || X <- ets:table(E)], [unique]), + H2 = qlc:q([X || Y <- [3,4], ets:insert(E, {Y}), X <- H1]), + [{1},{2},{3},{1},{2},{3},{4}] = qlc:e(H2), + ets:delete(E)">>, + + <<"H0 = qlc:append([a,b], [c,d]), + H = qlc:q([{X,Y} || + X <- H0, + Y <- qlc:q([{X1,Y} || + X1 <- H0, + Y <- qlc:q([{X2,Y} || + X2 <- H0, + Y <- H0])])]), + {qlc, _, + [{generate, _,{append, [{list, [a,b]}, {list, [c,d]}]}}, + {generate, _, + {qlc, _, + [{generate, _, {append,[{list, [a,b]},{list, [c,d]}]}}, + {generate, _, + {qlc, _, + [{generate, _,{append,[{list, [a,b]}, {list, [c,d]}]}}, + {generate, _,{append,[{list, [a,b]}, {list, [c,d]}]}}], + [{cache,ets}]}}], + [{cache,ets}]}}], + []} = i(H, cache_all)">> + + ], + ?line run(Config, Ts), + ok. + +cache_list(doc) -> + "OTP-6038. The {cache,list} option."; +cache_list(suite) -> []; +cache_list(Config) when is_list(Config) -> + Ts = [ + begin + PrivDir = ?privdir, + [<<"%% unique, cache list. A simple qlc. + Options = [{cache,list}, unique], + L0 = [1,2,3,4,1,2,3,4], + L = qlc_SUITE:table(L0, []), + Q1 = qlc:q([X || X <- L], Options), + Q = qlc:q([{X,Y} || X <- [a,b], Y <- Q1]), + GOptions = [{tmpdir,\"">>, PrivDir, <<"\"}], + {qlc,_,[{generate,_,{list,[a,b]}}, + {generate,_,{qlc,_, + [{generate,_,{table,_}}], + [{cache,list},{unique,true}]}}], + []} = i(Q, GOptions), + true = [{X,Y} || X <- [a,b], Y <- [1,2,3,4]] =:= + qlc:e(Q, GOptions)">>] + end, + + begin + MS = ets:fun2ms(fun({X,_}) when X > 1 -> X end), + [<<"%% No cache, even if explicit match specification. + etsc(fun(E) -> + MS = ">>, io_lib:format("~w", [MS]), <<", + Options = [{cache,list}, unique], + Q = qlc:q([{X,Y} || + X <- ets:table(E, {traverse, {select, MS}}), + Y <- [1,2,3]], + Options), + {qlc,_,[{generate,_,{table,{ets,table,_}}}, + {generate,_,{list,[1,2,3]}}], + [{unique,true}]} = i(Q), + true = [{X,Y} || X <- lists:seq(2,10), Y <- [1,2,3]] =:= + lists:sort(qlc:e(Q)) + end, [{keypos,1}], [{I,a} || I <- lists:seq(1, 10)])">>] + end, + + <<"%% Temporary files. + %% Remove list expression caches when possible. (no visible effect) + T = lists:seq(1, 100000), % Huge terms on file + F = fun(C) -> + Q0 = qlc:q([{X} || X <- [T,T,T], begin X > 0 end], + {cache,C}), + Q1 = qlc:q([{X,Y,Z} || + X <- Q0, + Y <- Q0, + Z <- Q0], + {cache,C}), + qlc:q([{X, Y} || Y <- [1], X <- Q1]) + end, + Ql = F(list), + Rl = qlc:e(Ql, {max_list_size, 64*1024}), + Qe = F(ets), + Re = qlc:e(Qe), + Qf = F(no), + Rf = qlc:e(Qf), + Ri = qlc:e(Ql, {max_list_size, 1 bsl 35}), % heavy + {27,27,27,27,true,true,true} = + {length(Rl), length(Re), length(Rf), length(Ri), + Rl =:= Re, Re =:= Rf, Rf =:= Ri}">>, + + <<"%% File sorter. + T = lists:seq(1, 10000), + F = fun(C) -> + Q0 = qlc:q([{X} || X <- [T,T,T], begin X > 0 end], + [{cache,C},unique]), + Q1 = qlc:q([{X,Y,Z} || + X <- Q0, + Y <- Q0, + Z <- Q0], + [{cache,C},unique]), + qlc:q([{X, Y} || Y <- [1], X <- Q1]) + end, + GOpt = [{max_list_size, 10000}], + Ql = F(list), + Rl = qlc:e(Ql, GOpt), + Qe = F(ets), + Re = qlc:e(Qe, GOpt), + Qf = F(no), + Rf = qlc:e(Qf, GOpt), + {1,1,1,true,true} = + {length(Rl), length(Re), length(Rf), Rl =:= Re, Re =:= Rf}">>, + + <<"%% Remove list expression caches when possible. (no visible effect) + Q0 = qlc:q([{X} || X <- [1,2,3], begin X > 0 end], {cache,list}), + Q1 = qlc:q([{X,Y,Z} || + X <- Q0, + Y <- Q0, + Z <- Q0], + {cache,list}), + Q = qlc:q([{X, Y} || Y <- [1], X <- Q1]), + R = qlc:e(Q), + L0 = [{X} || X <- [1,2,3], begin X > 0 end], + L1 = [{X,Y,Z} || + X <- L0, + Y <- L0, + Z <- L0], + L = [{X, Y} || Y <- [1], X <- L1], + true = R =:= L">>, + + <<"%% No temporary file. + L = [{I,a} || I <- lists:seq(1, 10)], + Q0 = qlc:q([X || X <- qlc_SUITE:table_error(L, 1, err), + begin element(1, X) > 5 end], + {cache,list}), + Q = qlc:q([{X, element(1,Y)} || + X <- lists:seq(1, 5), + Y <- Q0]), + err = qlc:e(Q)">>, + + <<"%% Sort internally. + L = [{I,a} || I <- lists:seq(1, 10)], + Q0 = qlc:q([X || X <- qlc_SUITE:table_error(L, 1, err), + begin element(1, X) > 5 end], + [unique,{cache,list}]), + Q = qlc:q([{X, element(1,Y)} || + X <- lists:seq(1, 5), + Y <- Q0]), + err = qlc:e(Q, {max_list_size,0})">>, + + <<"%% No temporary file. + etsc(fun(E) -> + Q0 = qlc:q([X || X <- ets:table(E), + begin element(1, X) > 5 end], + {cache,list}), + Q = qlc:q([{X, element(1,Y)} || X <- lists:seq(1, 5), + Y <- Q0]), + R = [{X,Y} || X <- lists:seq(1, 5), + Y <- lists:seq(6, 10)], + R = lists:sort(qlc:e(Q)) + end, [{keypos,1}], [{I,a} || I <- lists:seq(1, 10)])">>, + + <<"%% Sort internally + etsc(fun(E) -> + Q0 = qlc:q([X || X <- ets:table(E), + begin element(1, X) > 5 end], + [{cache,list},unique]), + Q = qlc:q([{X, element(1,Y)} || X <- lists:seq(1, 5), + Y <- Q0]), + R = [{X,Y} || X <- lists:seq(1, 5), + Y <- lists:seq(6, 10)], + R = lists:sort(qlc:e(Q)) + end, [{keypos,1}], [{I,a} || I <- lists:seq(1, 10)])">>, + + <<"%% A few more tests of unique and {cache,list}. + F = fun(CU) -> + H1 = qlc:q([{X,Y} || + Y <- [a,b], + X <- [1,2]], + CU), + qlc:q([{X,Y,Z} || X <- [3,4], {Y,Z} <- H1]) + end, + Q1 = F([]), + Q2 = F([{cache,list}, unique]), + R1 = qlc:e(Q1), + R2 = qlc:e(Q2), + R3 = qlc:e(Q2, {max_list_size, 0}), % still in RAM + true = R1 =:= R2, + true = R2 =:= R3">>, + + <<"E = ets:new(t, [duplicate_bag]), + true = ets:insert(E, [{2},{1},{2}]), + H1 = qlc:q([{X,Y} || + Y <- [a,b], + {X} <- ets:table(E)], + [{cache,list}, unique]), + H2 = qlc:q([{X,Y,Z} || X <- [3,4], {Y,Z} <- H1]), + {qlc,_,[{generate,_,{list,[3,4]}}, + {generate,_,{qlc,_, + [{generate,_,{list,[a,b]}}, + {generate,_, + {qlc,_,[{generate,_,{table,{ets,table,_}}}], + [{cache,list},{unique,true}]}}], + [{cache,list},{unique,true}]}}], []} = i(H2), + L1s = [[{X,Y} || Y <- [a,b], X <- Xs] || Xs <- [[1,2], [2,1]]], + L2s = [[{X,Y,Z} || X <- [3,4], {Y,Z} <- L1] || L1 <- L1s], + R1 = qlc:e(H2), + R2 = qlc:e(H2, {max_list_size, 0}), % on temporary file + ets:delete(E), + true = lists:member(R1, L2s), + true = R1 =:= R2">>, + + <<"E = ets:new(t, [duplicate_bag]), + true = ets:insert(E, [{2},{1},{2}]), + H1 = qlc:q([{X,Y} || + Y <- [a,b], + {X} <- ets:table(E)], + [{cache,list}]), + H2 = qlc:q([{X,Y,Z} || X <- [3,4], {Y,Z} <- H1]), + L1s = [[{X,Y} || Y <- [a,b], X <- Xs] || Xs <- [[1,2,2], [2,2,1]]], + L2s = [[{X,Y,Z} || X <- [3,4], {Y,Z} <- L1] || L1 <- L1s], + R1 = qlc:e(H2), + R2 = qlc:e(H2, {max_list_size, 0}), % on temporary file + ets:delete(E), + true = lists:member(R1, L2s), + true = R1 =:= R2">>, + + <<"Q1 = qlc:q([{X,Y} || + Y <- [a,b], + {X,_} <- qlc_SUITE:table_error([{a,1}], 2, err)], + [{cache,list}, unique]), + Q = qlc:q([{X,Y,Z} || X <- [3,4], {Y,Z} <- Q1]), + {qlc,_,[{generate,_,{list,[3,4]}}, + {generate,_,{qlc,_, + [{generate,_,{list,[a,b]}}, + {generate,_,{table,_}}], + [{cache,list},{unique,true}]}}], + []} = i(Q), + err = qlc:e(Q,{max_list_size,0})">>, + + begin + Privdir = ?privdir, + [<<" + E = ets:new(t, [duplicate_bag]), + N = 17000, + true = ets:insert(E, [{X,X} || X <- lists:seq(1, N)]), + N = ets:info(E, size), + RF = fun(GOpts) -> + F = fun(CU) -> + H1 = qlc:q([{X,Y} || + Y <- [a,b], + {X,_} <- ets:table(E)], + CU), + qlc:q([{X,Y,Z} || X <- [3,4], {Y,Z} <- H1]) + end, + Q1 = F([{cache,list}, unique]), + _ = qlc:info(Q1, GOpts), + R1 = qlc:e(Q1, GOpts), + Q2 = F([unique]), + R2 = qlc:e(Q2, GOpts), + true = lists:sort(R1) =:= lists:sort(R2) + end, + GOpts = [{tmpdir,\"">>,Privdir,<<"\"}], + RF([{max_list_size, 1 bsl 35} | GOpts]), + RF(GOpts), + RF([{max_list_size, 40000} | GOpts]), + true = ets:insert(E, [{X,X} || X <- lists:seq(1, N)]), + true = N+N =:= ets:info(E, size), + RF([{max_list_size, 1 bsl 30} | GOpts]), + RF(GOpts), + RF([{max_list_size, 40000} | GOpts]), + ets:delete(E)">>] + end, + + <<"%% Temporary file employed. + etsc(fun(E) -> + Q0 = qlc:q([X || X <- ets:table(E), + begin element(1, X) > 5 end], + {cache,list}), + Q = qlc:q([{X, element(1,Y)} || X <- lists:seq(1, 5), + Y <- Q0]), + R = [{X,Y} || X <- lists:seq(1, 5), + Y <- lists:seq(6, 10)], + R = lists:sort(qlc:e(Q, {max_list_size, 100*1024})) + end, [{keypos,1}], [{I,a,lists:duplicate(100000,1)} || + I <- lists:seq(1, 10)])">>, + + <<"%% Temporary file employed. The file is removed after error. + L = [{I,a,lists:duplicate(100000,1)} || I <- lists:seq(1, 10)], + Q0 = qlc:q([X || X <- qlc_SUITE:table_error(L, 1, err), + begin element(1, X) > 5 end], + {cache,list}), + Q = qlc:q([{X, element(1,Y)} || + X <- lists:seq(1, 5), + Y <- Q0]), + err = qlc:e(Q)">>, + + <<"%% Temporary file employed. The file is removed after error. + L = [{I,a,lists:duplicate(100000,1)} || I <- lists:seq(1, 10)], + Q0 = qlc:q([X || X <- qlc_SUITE:table(L, 1, []), + begin element(1, X) > 5 end], + {cache,list}), + Q = qlc:q([{X, element(1,Y)} || + X <- lists:seq(1, 5), + Y <- Q0]), + {error, _, {file_error,_,_}} = qlc:e(Q, {tmpdir, \"/a/b/c\"})">>, + + <<"Q = qlc:q([X || X <- [1,2]]), + {'EXIT', {badarg, _}} = (catch qlc:e(Q, {max_list_size, -1}))">>, + + <<"Q = qlc:q([X || X <- [1,2]]), + {'EXIT', {badarg, _}} = (catch qlc:e(Q, {max_list_size, foo}))">> + + ], + ?line run(Config, Ts), + ok. + +filter(doc) -> + "Filters and match specs."; +filter(suite) -> []; +filter(Config) when is_list(Config) -> + Ts = [ + <<"L = [1,2,3,4,5], + QH1 = qlc:q([X || X <- L, X > 1, X < 4]), + [2,3] = qlc:e(QH1), + {list,{list,L},_MS} = i(QH1) + ">>, + + <<"L = [1,2,3,4,5], + QH2 = qlc:q([X || X <- L, X > 1, X < 4, X > 2]), + [3] = qlc:e(QH2), + {list,{list,L},_MS} = i(QH2) + ">>, + + %% "X > 1" is skipped since the matchspec does the job + <<"QH3 = qlc:q([X || X <- [1,2,3,4,5], X > 1, begin X < 4 end]), + [2,3] = qlc:e(QH3), + {qlc,_,[{generate,_,{list,{list,[1,2,3,4,5]},_MS}},_],[]} = i(QH3) + ">>, + + <<"QH4 = qlc:q([{X,Y} || X <- [1,2], Y <- [1,2]]), + [{1,1},{1,2},{2,1},{2,2}] = qlc:e(QH4), + {qlc,_,[{generate,_,{list,[1,2]}},{generate,_,{list,[1,2]}}],[]} = + i(QH4)">>, + + %% "X > 1" is skipped since the matchspec does the job + <<"QH5 = qlc:q([{X,Y} || X <- [1,2], X > 1, Y <- [1,2]]), + [{2,1},{2,2}] = qlc:e(QH5), + {qlc,_,[{generate,_,{list,{list,[1,2]},_MS}}, + {generate,_,{list,[1,2]}}],[]} = + i(QH5)">>, + + <<"%% Binaries are not handled at all when trying to find lookup values + etsc(fun(E) -> + A = 2, + Q = qlc:q([X || {X} <- ets:table(E), <> =:= <>]), + [2] = lists:sort(qlc:e(Q)), + false = lookup_keys(Q) + end, [{1},{2},{3}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X,_} <- ets:table(E), + qlc:e(qlc:q([Y || {Y,_} <- ets:table(E), + Y > X])) == []]), + [3] = qlc:e(Q) + end, [{1,a},{2,b},{3,c}])">>, + + <<"Q = qlc:q([X || {X} <- [], (false or (X/0 > 3))]), + \"[]\" = qlc:info(Q), + [] = qlc:e(Q)">>, + + <<"%% match spec + [] = qlc:e(qlc:q([X || {X} <- [{1},{2}], + (false orelse (X/0 > 3))])), + %% generated code + {'EXIT', {badarith, _}} = + (catch qlc:e(qlc:q([X || {X} <- [{1}], + begin (false orelse (X/0 > 3)) end])))">>, + + <<"%% Partial evaluation in filter. + etsc(fun(E) -> + QH = qlc:q([{X+1,Y} || {X,Y} <- ets:table(E), + X =:= 1-1+1+(+1)]), + [{3,2}] = qlc:e(QH), + [2] = lookup_keys(QH) + end, [{1,1},{2,2},{3,3}])">>, + + <<"%% =/2 in filters must not be recognized when 'badmatch' is + %% possible. + etsc(fun(E) -> + QH = qlc:q([{X,Y} || {X,Y} <- ets:table(E), + ((Y = X) =:= 3)]), + {'EXIT', {{badmatch,4},_}} = (catch qlc:e(QH)), + false = lookup_keys(QH) + end, [{3,3},{4,true}])">>, + + <<"%% One more of the same kind. + etsc(fun(E) -> + QH = qlc:q([{X,Y} || {X,_} <- ets:table(E), + (Y=X) =:= (Y=1+1)]), + {'EXIT', {{badmatch,2},_}} = (catch qlc:e(QH)), + false = lookup_keys(QH) + end, [{1,1},{2,2},{3,3}])">>, + + <<"%% OTP-5195. Used to return a value, but badarith is correct. + etsc(fun(E) -> + QH = qlc:q([X || {X,_} <- ets:table(E), + (X =:= 1) and + if X =:= 1 -> true; + true -> X/0 + end]), + {'EXIT',{badarith,_}} = (catch qlc:e(QH)), + false = lookup_keys(QH) + end, [{1,1},{2,2},{3,3}])">>, + + <<"fun(Z) -> + Q = qlc:q([X || Z < 2, X <- [1,2,3]]), + [] = qlc:e(Q) + end(3)">>, + + <<"H = qlc:q([{P1,A,P2,B,P3,C} || + P1={A,_} <- [{1,a},{2,b}], + {_,B}=P2 <- [{1,a},{2,b}], + C=P3 <- [1], + {[X,_],{_,X}} <- [{[1,2],{3,1}}, {[a,b],{3,4}}], + A > 0, + B =/= c, + C > 0]), + L = [{{1,a},1,{1,a},a,1,1}, {{1,a},1,{2,b},b,1,1}, + {{2,b},2,{1,a},a,1,1}, {{2,b},2,{2,b},b,1,1}], + L = qlc:e(H)">>, + + <<"H = qlc:q([{X,Y} || + X = _ <- [1,2,3], + _ = Y <- [a,b,c], + _ = _ <- [foo], + X > 1, + Y =/= a]), + [{2,b},{2,c},{3,b},{3,c}] = qlc:e(H)">> + + ], + ?line run(Config, Ts), + ok. + +info(doc) -> + "info/2."; +info(suite) -> []; +info(Config) when is_list(Config) -> + Ts = [ + <<"{list, [1,2]} = i(qlc:q([X || X <- [1,2]])), + {append,[{list, [1,2]}, {list, [3,4]}]} = + i(qlc:append([1,2],[3,4])), + {sort,{list, [1,2]},[]} = i(qlc:sort([1,2])), + E = ets:new(foo, []), + ets:insert(E, [{1},{2}]), + {table, _} = i(ets:table(E)), + true = ets:delete(E), + {list, [1,2]} = i([1,2]), + {append, [{list, [1,2]}, {list, [3,4]}]} = + i(qlc:q([X || X <- qlc:append([1,2],[3,4])])), + + H0 = qlc:q([X || X <- throw({throw,t})]), + {throw,t} = (catch {any_term,qlc:info(H0)}), + {'EXIT', {badarg, _}} = + (catch qlc:info(foobar)), + {'EXIT', {badarg, _}} = + (catch qlc:info(qlc:q([X || X <- [1,2]]), badarg))">>, + + <<"{'EXIT', {badarg, _}} = + (catch qlc:info([X || {X} <- []], {n_elements, 0})), + L = lists:seq(1, 1000), + \"[1,2,3,4,5,6,7,8,9,10|'...']\" = qlc:info(L, {n_elements, 10}), + {cons,1,{integer,1,1},{atom,1,'...'}} = + qlc:info(L, [{n_elements, 1},{format,abstract_code}]), + Q = qlc:q([{X} || X <- [a,b,c,d,e,f]]), + {call,_,_,[{cons,_,{atom,_,a},{cons,_,{atom,_,b},{cons,_,{atom,_,c}, + {atom,_,'...'}}}}, + {call,_,_,_}]} = + qlc:info(Q, [{n_elements, 3},{format,abstract_code}]), + \"ets:match_spec_run([a,b,c,d,e,f],\n\" + \" ets:match_spec_compile([{'$1',[true],\" + \"[{{'$1'}}]}]))\" = + qlc:info(Q, [{n_elements, infinity}])">>, + + <<"Q1 = qlc:q([{X} || X <- qlc:q([X || X <- [1,2]])]), + {qlc, _, [{generate, _, {list, [1,2]}}],[]} = i(Q1), + Q2 = qlc:q([X || X <- qlc:q([{X} || X <- [1,2]])]), + {list,{list,[1,2]},_} = i(Q2), + [{1},{2}] = qlc:eval(Q2), + Q3 = qlc:q([{X,Y} || X <- qlc:q([X || X <- [a,b]]), + Y <- qlc:q([Z || Z <- [a,b]])]), + {qlc, _, [{generate, _, {list, [a,b]}}, + {generate, _, {list, [a,b]}}], []} = i(Q3), + Q4 = qlc:q([X || X <- [a]]), + {list, [a]} = i(Q4), + Q5 = qlc:q([X || X <- qlc:q([Y || Y <- [a,b]], unique)]), + {qlc, _, [{generate, _, {list, [a,b]}}], [{unique,true}]} = + i(Q5)">>, + + <<"H = qlc:q([X || X <- qlc:append([qlc:q([X || X <- [1,2]]),[1,2]])]), + {append, [{list, [1,2]},{list, [1,2]}]} = i(H), + [1,2,1,2] = qlc:e(H)">>, + + <<"H = qlc:q([{X} || X <- [], X > 1]), + {list, []} = i(H), + [] = qlc:e(H)">>, + + <<"H1 = qlc:q([{X} || X <- [], X > 1]), + H = qlc:q([{X} || X <- H1, X < 10]), + {list, []} = i(H), + [] = qlc:e(H)">>, + + <<"L = [1,2,3], + QH1 = qlc:q([{X} || X <- L, X > 1]), + QH2 = qlc:q([{X} || X <- QH1]), + [{{2}},{{3}}] = qlc:e(QH2), + {list,{list,{list,L},_},_} = i(QH2)">>, + + <<"H = qlc:q([X || X <- qlc:q([Y || Y <- qlc:q([Z || Z <-[1,2,1]])])]), + {list, [1,2,1]} = i(H), + [1,2,1] = qlc:eval(H)">>, + + <<"%% Used to replace empty ETS tables with [], but that won't work. + E = ets:new(apa,[]), + QH1 = qlc:q([{X} || X <- ets:table(E), X > 1]), + QH2 = qlc:q([{X} || X <- QH1], cache), + [] = qlc:e(QH2), + {qlc,_,[{generate,_,{table,{ets,table,_}}}],[]} = i(QH2), + ets:delete(E)">>, + + <<"Q1 = qlc:q([W || W <- [a,b]]), + Q2 = qlc:q([Z || Z <- qlc:sort([1,2,300])], unique), + Q3 = qlc:q([{X,Y} || X <- qlc:keysort([2], [{1,a}]), + Y <- qlc:append([Q1, Q2]), + X > Y]), + {qlc, T1, + [{generate, P1, {list, [{1,a}]}}, + {generate, P2, {append, [{list, [a,b]}, + {qlc, T2, [{generate, P3, + {sort, {list,[1,2,300]},[]}}], + [{cache,ets},{unique,true}]}]}},F], + []} = i(Q3, cache_all), + {tuple, _, [{var,_,'X'}, {var,_,'Y'}]} = binary_to_term(T1), + {var, _, 'X'} = binary_to_term(P1), + {var, _, 'Y'} = binary_to_term(P2), + {var, _, 'Z'} = binary_to_term(P3), + {var, _, 'Z'} = binary_to_term(T2), + {op, _, '>', {var, _, 'X'}, {var, _, 'Y'}} = binary_to_term(F), + true = binary_to_list(<< + \"beginV1=qlc:q([Z||Z<-qlc:sort([1,2,300],[])],[{unique,true}]),\" + \"qlc:q([{X,Y}||X<-[{1,a}],Y<-qlc:append([[a,b],V1]),X>Y])end\" + >>) == format_info(Q3, true)">>, + + <<"Q1 = qlc:q([{X} || X <- qlc:q([X || X <- [a,b]])]), + {qlc, _, [{generate, _, {list, [a,b]}}], []} = i(Q1), + Q2 = qlc:q([X || X <- qlc:q([{X} || X <- [a,b]])]), + {list,{list,[a,b]},_} = i(Q2), + [{a},{b}] = qlc:eval(Q2)">>, + + <<"Q = qlc:keysort(2, [{1,a,b},{2,b,c},{3,4,c}]), + {keysort,{list,[{1,a,b},{2,b,c},{3,4,c}]},2,[]} = i(Q), + true = binary_to_list(<< + \"qlc:keysort(2,[{1,a,b},{2,b,c},{3,4,c}],[])\">>) + == format_info(Q, true), + [{3,4,c},{1,a,b},{2,b,c}] = qlc:e(Q)">>, + + <<"E = ets:new(foo, []), + ets:insert(E, [{1},{2}]), + Q = qlc_SUITE:default_table(E), + {table,{'$MOD','$FUN',[]}} = i(Q), + true = binary_to_list(<<\"'$MOD':'$FUN'()\">>) + == format_info(Q, true), + true = ets:delete(E)">>, + + <<"\"[]\" = qlc:info([], flat), + \"[]\" = qlc:info([]), + \"[]\" = qlc:info([], {flat, true})">>, + + <<"H = qlc:q([{X} || X <- [a,b]]), + \"ets:match_spec_run([a,b],ets:match_spec_compile(\" ++ _ = + format_info(H, true), + \"ets:match_spec_run([a,b],ets:match_spec_compile(\" ++ _ = + format_info(H, false)">>, + + <<"H = qlc:q([{X} || X <- [a,b], begin true end]), + true = binary_to_list(<<\"qlc:q([{X}||X<-[a,b],begintrueend])\">>) + == format_info(H, true), + true = binary_to_list(<<\"qlc:q([{X}||X<-[a,b],begintrueend])\">>) + == format_info(H, false)">>, + + <<"H = qlc:q([A || {A} <- [{1},{2}], (A =:= 2) andalso true]), + {call,_,{remote,_,{atom,_,ets},{atom,_,match_spec_run}},_} = + qlc:info(H, {format,abstract_code})">>, + + <<"H = qlc:q([{X} || X <- qlc:q([{X} || X <- [a,b], begin true end], + unique), + begin true end]), + true = binary_to_list(<< + \"beginV1=qlc:q([{X}||X<-[a,b],begintrueend],[{unique,true}]),\" + \"qlc:q([{X}||X<-V1,begintrueend])end\">>) == + format_info(H, true), + true = binary_to_list(<< + \"qlc:q([{X}||X<-qlc:q([{X}||X<-[a,b],begintrueend],\" + \"[{unique,true}]),begintrueend])\">>) == format_info(H, false)">>, + + <<"H0 = qlc:q([{V3} || V3 <- qlc:q([{V1} || V1 <- [a,b], + begin true end], unique), + begin true end]), + H = qlc:sort(H0), + true = binary_to_list(<< + \"qlc:sort(qlc:q([{V3}||V3<-qlc:q([{V1}||\" + \"V1<-[a,b],begintrueend],[{unique,true}]),begintrueend]),[])\">>) + == format_info(H, false), + true = binary_to_list(<< + \"beginV2=qlc:q([{V1}||V1<-[a,b],begintrueend],[{unique,true}]),\" + \"V4=qlc:q([{V3}||V3<-V2,begintrueend]),qlc:sort(V4,[])end\">>) + == format_info(H, true)">>, + + <<"H0 = qlc:q([X || X <- [true], begin true end]), + H1 = qlc:q([{X} || X <- [a,b], begin true end], + [{unique,begin [T] = qlc:e(H0), T end}]), + {call,_,{remote,_,{atom,_,qlc},{atom,_,q}}, + [{lc,_,{tuple,_,[{var,_,'X'}]}, + [{generate,_,{var,_,'X'}, + {cons,_,{atom,_,a},_}}, + {block, _, [{atom, _, true}]}]}, + {cons,_,_,_}]} = i(H1, {format, abstract_code})">>, + + <<"E = ets:new(apa, [duplicate_bag]), + true = ets:insert(E, [{1,a},{2,b},{3,c},{4,d}]), + QH = qlc:q([X || {X,_} <- ets:tab2list(E), X > 2], unique), + {qlc, _, [{generate, _, {list, _, _MS}}], [{unique, true}]} = + i(QH), + [3,4] = lists:sort(qlc:e(QH)), + ets:delete(E)">>, + + %% "Imported" variable. + <<"F = fun(U) -> qlc:q([{X} || X <- [1,2,3,4,5,6], X > U]) end, + QH = F(4), + {call, _ , + {remote, _, {atom, _, ets},{atom, _, match_spec_run}}, + [{string, _, [1,2,3,4,5,6]}, + {call, _, + _compile, + [{cons, _, + {tuple, _, + [{atom, _,'$1'}, + {cons, _, + {tuple, + _, + [{atom, _,'>'}, + {atom, _,'$1'}, + {tuple, + _, + [{atom, _,const}, + {integer, _,4}]}]}, + _}, + {cons, _, _, _}]}, + {nil,_}}]}]} = i(QH, {format, abstract_code}), + [{5},{6}] = qlc:e(QH), + [{4},{5},{6}] = qlc:e(F(3))">> + + ], + ?line run(Config, Ts), + ok. + +nested_info(doc) -> + "Nested QLC expressions. QLC expressions in filter and template."; +nested_info(suite) -> []; +nested_info(Config) when is_list(Config) -> + Ts = [ + <<"L = [{1,a},{2,b},{3,c}], + Q = qlc:q( + [{X,R} || + {X,_} <- qlc_SUITE:table(L, []), + begin % X imported + R = qlc:e(qlc:q([{X,Y} || {Y,_} + <- qlc_SUITE:table(L, []), + Y > X])), + true + end]), + true = binary_to_list(<< + \"qlc:q([{X,R}||{X,_}<-qlc_SUITE:the_list([{1,a},{2,b},{3,c}]),\" + \"beginR=qlc:e(qlc:q([{X,Y}||{Y,_}<-qlc_SUITE:table(L,[]),Y>X]))\" + \",trueend])\">>) == format_info(Q, true), + [{1,[{1,2},{1,3}]},{2,[{2,3}]},{3,[]}] = qlc:e(Q)">>, + + <<"L = [{1,a},{2,b},{3,c}], + Q = qlc:q( % X imported + [{X,qlc:e(qlc:q([{X,Y} || {Y,_} <- qlc_SUITE:table(L, []), + Y > X]))} || + {X,_} <- qlc_SUITE:table(L, [])]), + true = binary_to_list(<< + \"qlc:q([{X,qlc:e(qlc:q([{X,Y}||{Y,_}<-qlc_SUITE:table(L,[]),\" + \"Y>X]))}||{X,_}<-qlc_SUITE:the_list([{1,a},{2,b},{3,c}])])\">>) + == format_info(Q, true), + [{1,[{1,2},{1,3}]},{2,[{2,3}]},{3,[]}] = qlc:e(Q)">>, + + <<"L = [{1,a},{2,b},{3,c}], + Q = qlc:q( + [{X,R} || + {X,_} <- qlc_SUITE:table(L, []), + begin % X imported + R = qlc:e(qlc:q([{X,Y} || {Y,_} + <- qlc_SUITE:table(L, []), + Y =:= X])), + true + end]), + true = binary_to_list(<< + \"qlc:q([{X,R}||{X,_}<-qlc_SUITE:the_list([{1,a},{2,b},{3,c}]),\" + \"beginR=qlc:e(qlc:q([{X,Y}||{Y,_}<-qlc_SUITE:table(L,[]),\" + \"Y=:=X])),trueend])\">>) == format_info(Q, true), + [{1,[{1,1}]},{2,[{2,2}]},{3,[{3,3}]}] = qlc:e(Q)">>, + + <<"L = [{1,a},{2,b},{3,c}], + Q = qlc:q( + [{X, % X imported + qlc:e(qlc:q([{X,Y} || {Y,_} <- qlc_SUITE:table(L, []), + Y =:= X]))} || + {X,_} <- qlc_SUITE:table(L, [])]), + true = binary_to_list(<< + \"qlc:q([{X,qlc:e(qlc:q([{X,Y}||{Y,_}<-qlc_SUITE:table(L,[]),\" + \"Y=:=X]))}||{X,_}<-qlc_SUITE:the_list([{1,a},{2,b},{3,c}])])\">>) + == format_info(Q, true), + [{1,[{1,1}]},{2,[{2,2}]},{3,[{3,3}]}] = qlc:e(Q)">>, + + <<"L = [{1,a},{2,b},{3,c}], + Q = qlc:q( + [{X,R} || + {X,_} <- qlc_SUITE:table(L, []), + begin + R = qlc:e(qlc:q([Y || Y <- [X]])), + true + end]), + true = binary_to_list(<< + \"qlc:q([{X,R}||{X,_}<-qlc_SUITE:the_list([{1,a},{2,b},{3,c}]),\" + \"beginR=qlc:e(qlc:q([Y||Y<-[X]])),trueend])\">>) + == format_info(Q, true), + [{1,[1]},{2,[2]},{3,[3]}] = qlc:e(Q)">>, + + <<"L = [{1,a},{2,b},{3,c}], + Q = qlc:q( + [{X,qlc:e(qlc:q([Y || Y <- [X]]))} || + {X,_} <- qlc_SUITE:table(L, [])]), + true = binary_to_list(<< + \"qlc:q([{X,qlc:e(qlc:q([Y||Y<-[X]]))}||{X,_}<-qlc_SUITE:\" + \"the_list([{1,a},{2,b},{3,c}])])\">>) == format_info(Q, true), + [{1,[1]},{2,[2]},{3,[3]}] = qlc:e(Q)">>, + + <<"L = [{1,a},{2,b}], + Q = qlc:q( + [{X,Y} || + {X,_} <- qlc_SUITE:table(L, []), + {Y,_} <- qlc:q( + [{Z,V} || + {Z,_} <- qlc_SUITE:table(L, []), + {V} <- qlc:q( + [{W} || W + <- qlc_SUITE:table(L, [])]) + ]) + ]), + true = binary_to_list(<< + \"beginV1=qlc:q([{W}||W<-qlc_SUITE:the_list([{1,a},{2,b}])]),\" + \"V2=qlc:q([{Z,V}||{Z,_}<-qlc_SUITE:the_list([{1,a},{2,b}]),\" + \"{V}<-V1]),qlc:q([{X,Y}||{X,_}<-qlc_SUITE:the_list([{1,a},\" + \"{2,b}]),{Y,_}<-V2])end\">>) == format_info(Q, true), + [{1,1},{1,1},{1,2},{1,2},{2,1},{2,1},{2,2},{2,2}] = qlc:e(Q)">> + + ], + ?line run(Config, Ts), + ok. + + +lookup1(doc) -> + "Lookup keys. Mostly test of patterns."; +lookup1(suite) -> []; +lookup1(Config) when is_list(Config) -> + Ts = [ + <<"etsc(fun(E) -> + Q = qlc:q([A || {A=3} <- ets:table(E)]), + [3] = qlc:eval(Q), + [3] = lookup_keys(Q) + end, [{1},{2},{3},{4}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([A || {A=3} <- ets:table(E)],{max_lookup,0}), + [3] = qlc:eval(Q), + false = lookup_keys(Q) + end, [{1},{2},{3},{4}])">>, + + <<"%% The lookup and max_lookup options interact. + etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + (X =:= 1) or (X =:= 2)], + [{lookup,true},{max_lookup,1}]), + {'EXIT', {no_lookup_to_carry_out, _}} = (catch qlc:e(Q)) + end, [{1},{2}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{A,B,C,D} || {A,B}={C,D} <- ets:table(E)]), + [{1,2,1,2},{3,4,3,4}] = lists:sort(qlc:eval(Q)), + false = lookup_keys(Q) + end, [{1,2},{3,4}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{A,B,D} || {A,B}={D,A} <- ets:table(E)]), + [{1,1,1},{2,2,2}] = lists:sort(qlc:eval(Q)), + false = lookup_keys(Q) + end, [{1,2},{2,2},{1,1}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{A,B,D} || {A,B}={D,A} <- ets:table(E), + (D =:= 2) or (B =:= 1)], + {max_lookup,infinity}), + [{1,1,1},{2,2,2}] = qlc:eval(Q), + [1,2] = lookup_keys(Q) + end, [{1,2},{2,2},{1,1}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{A,B,D} || {A,B}={D,A} <- ets:table(E), + (D =:= 2) xor (B =:= 1)]), + [{1,1,1},{2,2,2}] = qlc:eval(Q), + [1,2] = lookup_keys(Q) + end, [{1,2},{2,2},{1,1}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([3 || {{[3,4],apa}} <- ets:table(E)]), + [3] = qlc:e(Q), + [{[3,4],apa}] = lookup_keys(Q) + end, [{{[4,3],foo}},{{[3,4],apa}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([3 || {3} <- ets:table(E)]), + [3] = qlc:e(Q), + [3] = lookup_keys(Q) + end, [{2},{3},{4}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{X,Y,Z} || {{X,_},Y,Y={_,Z},X,Y} <- ets:table(E)]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{{1,1},1,{1,1},1,1}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X,X=2} <- ets:table(E)]), + [2] = qlc:e(Q), + [2] = lookup_keys(Q) + end, [{2,2},{3,3}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {{_,3}={4,_}=X} <- ets:table(E)]), + [{4,3}] = qlc:e(Q), + [{4,3}] = lookup_keys(Q) + end, [{{2,3}},{{4,3}}])">>, + + <<"U = 17.0, + etsc(fun(E) -> + Q = qlc:q([X || {_=X=_} <- ets:table(E)]), + [U] = qlc:e(Q), + false = lookup_keys(Q) + end, [{U},{U+U,U}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{X,Y,Z,W} || {X=Y}=Z={V=W} <- ets:table(E), + V == {h,g}]), + [{{h,g},{h,g},{{h,g}},{h,g}}] = qlc:e(Q), + [{h,g}] = lookup_keys(Q) + end, [{h,g},{{h,g}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{C,Y,Z,X} || {{X=Y}=Z}={{A=B}=C} <- ets:table(E), + A == a, B =/= c]), + [{{a},a,{a},a}] = qlc:e(Q), + [{a}] = lookup_keys(Q) + end, [{{1}},{{a}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{A,D,Y,X} || + {{A={B=C}},{D={C}}} = {X,Y} <- ets:table(E), + [] == B]), + [{{[]},{[]},{{[]}},{{[]}}}] = qlc:e(Q), + [{{[]}}] = lookup_keys(Q) + end, [{{{[]}},{{[]}}}])">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X}=X <- ets:table(E)]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1},{a}])">>, + {warnings,[{{2,37},qlc,nomatch_pattern}]}}, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X=X,Y=Y}={Y=Y,X=X} <- ets:table(E), + {} == X]), + [{}] = qlc:e(Q), + [{}] = lookup_keys(Q) + end, [{{},{}},{[],[]}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {3+4=7,X} <- ets:table(E), + X =:= 3+997]), + [1000] = qlc:e(Q), + [7] = lookup_keys(Q) + end, [{7,1000},{8,1000}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{X, Y} || [X]=[Y] <- ets:table(E)]), + [] = qlc:eval(Q), + false = lookup_keys(Q) + end, [{a}])">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || X={1,2,3,X,5} <- ets:table(E)]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{a},{b}])">>, + {warnings,[{{2,35},qlc,nomatch_pattern}]}}, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || X=[1,2,3,X,5] <- ets:table(E)]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{a},{b}])">>, + {warnings,[{{2,35},qlc,nomatch_pattern}]}}, + + <<"etsc(fun(E) -> + Q = qlc:q([X || X = <> <- ets:table(E)]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{a},{b}])">>, + + <<"Tre = 3.0, + etsc(fun(E) -> + Q = qlc:q([{A,B} || {A,B}={{a,C},{a,C}} <- ets:table(E), + C =:= Tre]), + [] = qlc:e(Q), + [{a,Tre}] = lookup_keys(Q) + end, [{a,b}])">>, + + <<"A = 3, + etsc(fun(E) -> + Q = qlc:q([X || X <- ets:table(E), A =:= element(1, X)]), + [{3,3}] = qlc:e(Q), + [3] = lookup_keys(Q) + end, [{1,a},{3,3}])">>, + + <<"A = 3, + etsc(fun(E) -> + Q = qlc:q([X || X <- ets:table(E), A =:= erlang:element(1, X)]), + [{3,3}] = qlc:e(Q), + [3] = lookup_keys(Q) + end, [{1,a},{3,3}])">>, + + <<"A = 3, + etsc(fun(E) -> + Q = qlc:q([X || X <- ets:table(E), A =:= {erlang,element}(1, X)]), + [{3,3}] = qlc:e(Q), + [3] = lookup_keys(Q) + end, [{1,a},{3,3}])">>, + + <<"etsc(fun(E) -> + A = 3, + Q = qlc:q([X || X <- ets:table(E), + A == element(1,X), + element(1,X) =:= a]), + [] = qlc:e(Q), + [a] = lookup_keys(Q) + end, [{a},{b},{c}])">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X = {[a,Z]}, + Z = [foo, {[Y]}], + Y = {{foo,[X]}}} <- ets:table(E)]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{a,b,c},{d,e,f}])">>, + {warnings,[{{2,34},qlc,nomatch_pattern}]}} + + ], + ?line run(Config, Ts), + ok. + +lookup2(doc) -> + "Lookup keys. Mostly test of filters."; +lookup2(suite) -> []; +lookup2(Config) when is_list(Config) -> + Ts = [ + <<"%% Only guards are inspected. No lookup. + etsc(fun(E) -> + Q = qlc:q([{X,Y} || {X,Y} <- ets:table(E), + ((Y = X) =:= 3)]), + {'EXIT', {{badmatch,4},_}} = (catch qlc:e(Q)) + end, [{3,3},{4,true}])">>, + + <<"%% Only guards are inspected. No lookup. + etsc(fun(E) -> + Q = qlc:q([{X,Y} || {X,Y} <- ets:table(E), + Y = (X =:= 3)]), + {'EXIT', {{badmatch,false},_}} = (catch qlc:e(Q)) + end, [{false,3},{true,3}])">>, + + <<"%% Only guards are inspected. No lookup. + etsc(fun(E) -> + Q = qlc:q([{X,Y} || {X,Y} <- ets:table(E), + Y = (X =:= 3)]), + {'EXIT', {{badmatch,false},_}} = (catch qlc:e(Q)) + end, [{3,true},{4,true}])">>, + + <<"%% Only guards are inspected. No lookup. + E1 = create_ets(1, 10), + E2 = ets:new(join, []), + true = ets:insert(E2, [{true,1},{false,2}]), + Q = qlc:q([{X,Z} || {_,X} <- ets:table(E1), + {Y,Z} <- ets:table(E2), + Y = (X =:= 3)]), + {'EXIT', {{badmatch,false},_}} = (catch qlc:e(Q)), + ets:delete(E1), + ets:delete(E2)">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{A,B,D} || {A,B}={D,A} <- ets:table(E), + (A =:= 3) or (4 =:= D)]), + [{3,3,3},{4,4,4}] = lists:sort(qlc:e(Q)), + [3,4] = lookup_keys(Q) + end, [{2,2},{3,3},{4,4}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X,U} <- ets:table(E), X =:= U]), + [1] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1,1}])">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([{X,Y} || {X=Y} <- ets:table(E), + {[X],4} =:= {[3],X}]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1}, {2}])">>, + {warnings,[{{3,46},qlc,nomatch_filter}]}}, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + X == 1, X =:= 2]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1}, {2}])">>, + {warnings,[{{3,43},qlc,nomatch_filter}]}}, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([{X,Y} || {X=Y} <- ets:table(E), + {[X,Y],4} =:= {[3,X],X}]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1}, {2}])">>, + {warnings,[{{3,48},qlc,nomatch_filter}]}}, + + <<"etsc(fun(E) -> + Q = qlc:q([{X,Y} || {X,Y} <- ets:table(E), + ({X,3} =:= {Y,Y}) or (X =:= 4)]), + [{3,3},{4,4}] = lists:sort(qlc:e(Q)), + [3,4] = lookup_keys(Q) + end, [{2,2},{3,3},{4,4},{5,5}])">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), {[X]} =:= {[3,4]}]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{[3]},{[3,4]}])">>, + {warnings,[{{2,61},qlc,nomatch_filter}]}}, + + <<"etsc(fun(E) -> + U = 18, + Q = qlc:q([{X,Y} || {X=Y} <- ets:table(E), [X|a] =:= [3|U]]), + [] = qlc:e(Q), + [3] = lookup_keys(Q) + end, [{2}, {3}])">>, + + <<"etsc(fun(E) -> + U = 18, V = 19, + Q = qlc:q([{X,Y} || {X=Y} <- ets:table(E), + [X|V] =:= [3|U+1]]), + [{3,3}] = qlc:e(Q), + [3] = lookup_keys(Q) + end, [{2},{3}])">>, + + <<"%% Blocks are not handled. + etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), begin X == a end]), + [a] = qlc:e(Q), + false = lookup_keys(Q) + end, [{a},{b}])">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + (3 =:= X) or (X =:= 12), + (8 =:= X) or (X =:= 10)]), + [] = lists:sort(qlc:e(Q)), + false = lookup_keys(Q) + end, [{2},{3},{4},{8}])">>, + {warnings,[{{4,44},qlc,nomatch_filter}]}}, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + ((3 =:= X) or (X =:= 12)) + and ((8 =:= X) or (X =:= 10))]), + [] = lists:sort(qlc:e(Q)), + false = lookup_keys(Q) + end, [{2},{3},{4},{8}])">>, + {warnings,[{{4,35},qlc,nomatch_filter}]}}, + + <<"F = fun(U) -> + Q = qlc:q([X || {X} <- [a,b,c], + X =:= if U -> true; true -> false end]), + [] = qlc:eval(Q), + false = lookup_keys(Q) + end, + F(apa)">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X=1,X} <- ets:table(E), X =:= 2]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1,1},{2,1}])">>, + {warnings,[{{2,61},qlc,nomatch_filter}]}}, + + <<"Two = 2.0, + etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), X =:= Two]), + [Two] = qlc:e(Q), + [Two] = lookup_keys(Q) + end, [{2.0},{2}])">>, + + <<"etsc(fun(E) -> + %% This float is equal (==) to an integer. Not a constant! + Q = qlc:q([X || {X} <- ets:table(E), X == {a,b,c,[2.0]}]), + [_,_] = qlc:e(Q), + false = lookup_keys(Q) + end, [{{a,b,c,[2]}},{{a,b,c,[2.0]}}])">>, + + <<"%% Must _not_ regard floats as constants. Check imported variables + %% in runtime. + etsc(fun(E) -> + U = 3.0, + QH = qlc:q([X || {X,_} <- ets:table(E), X =:= U]), + [] = qlc:e(QH), + [U] = lookup_keys(QH) + end, [{1,a},{2,b},{3,c},{4,d}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + length(X) =:= 1]), + [[1]] = qlc:e(Q), + false = lookup_keys(Q) + end, [{[1]},{[2,3]}])">>, + + <<"etsc(fun(E) -> + A=3, + Q = qlc:q([X || {X,Y} <- ets:table(E), X =:= A, Y =:= 3]), + [3] = qlc:e(Q), + [3] = lookup_keys(Q) + end, [{3,3},{4,3}])">>, + + <<"etsc(fun(E) -> + A = 1, + Q = qlc:q([X || {X} <- ets:table(E), + X =:= 1, <> =:= <>]), + [1] = qlc:e(Q), + [1] = lookup_keys(Q) + end, [{1},{2}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), X == a]), + [a] = qlc:e(Q), + [a] = lookup_keys(Q) + end, [{a},{b},{c}])">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X}=Y <- ets:table(E), + element(2, Y) == b, + X =:= 1]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1,b},{2,3}])">>, + {warnings,[{{3,48},qlc,nomatch_filter}]}}, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), element(1,{X}) =:= 1]), + [1] = qlc:e(Q), + [1] = lookup_keys(Q) + end, [{1}, {2}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), 1 =:= element(1,{X})]), + [1] = qlc:e(Q), + [1] = lookup_keys(Q) + end, [{1}, {2}])">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + X =:= {1}, + element(1,X) =:= 2]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{{1}},{{2}}])">>, + {warnings,[{{4,47},qlc,nomatch_filter}]}}, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + X =:= {1}, + element(1,X) =:= element(1, {2})]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{{1}},{{2}}])">>, + {warnings,[{{4,47},qlc,nomatch_filter}]}}, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + element(1,X) =:= 1, X =:= {1}]), + [{1}] = qlc:e(Q), + [{1}] = lookup_keys(Q) + end, [{{1}},{{2}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + {{element(1,element(1,{{1}}))}} =:= {X}]), + [{1}] = qlc:e(Q), + [{1}] = lookup_keys(Q) + end, [{{1}},{{2}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || X <- ets:table(E), + {element(1,element(1, {{1}}))} =:= + {element(1,X)}]), + [{1}] = qlc:e(Q), + [1] = lookup_keys(Q) + end, [{1},{2}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {{X,Y}} <- ets:table(E), + (X =:= 1) and (Y =:= 2) + or (X =:= 3) and (Y =:= 4)]), + [1,3] = lists:sort(qlc:e(Q)), + [{1,2}, {3,4}] = lookup_keys(Q) + end, [{{1,2}}, {{3,4}}, {{2,3}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {{X,a}} <- ets:table(E), X =:= 3]), + [3] = qlc:e(Q), + [{3,a}] = lookup_keys(Q) + end, [{{3,a}},{{3,b}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {{X,Y},_Z} <- ets:table(E), + X =:= 3, Y =:= a]), + [3] = qlc:e(Q), + [{3,a}] = lookup_keys(Q) + end, [{{3,a},3}, {{4,a},3}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {{X,Y},_Z} <- ets:table(E), + (X =:= 3) and (Y =:= a) + or (X =:= 4) and (Y =:= a)]), + [3,4] = qlc:e(Q), + [{3,a}, {4,a}] = lookup_keys(Q) + end, [{{3,a},3}, {{4,a},3}])">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + (X =:= 3) and (X =:= a)]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{3}, {4}])">>, + {warnings,[{{3,44},qlc,nomatch_filter}]}}, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {{X,Y}} <- ets:table(E), + X =:= 3, ((Y =:= a) or (Y =:= b))]), + [3,3] = qlc:e(Q), + [{3,a},{3,b}] = lists:sort(lookup_keys(Q)) + end, [{{3,a}},{{2,b}},{{3,b}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X,Y} <- ets:table(E), + ((X =:= 3) or (Y =:= 4)) and (X == a)]), + [a] = qlc:e(Q), + [a] = lookup_keys(Q) + end, [{a,4},{3,3}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X,Y} <- ets:table(E), + (X =:= 3) or ((Y =:= 4) and (X == a))]), + [3,a] = lists:sort(qlc:e(Q)), + [3,a] = lookup_keys(Q) + end, [{a,4},{3,3}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {{X,Y}} <- ets:table(E), + (X =:= 3) or ((Y =:= 4) and (X == a))]), + [3,a] = lists:sort(qlc:e(Q)), + false = lookup_keys(Q) + end, [{{3,a}},{{2,b}},{{a,4}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {{X,Y}} <- ets:table(E), + ((X =:= 3) or (Y =:= 4)) and (X == a)]), + [a] = lists:sort(qlc:e(Q)), + [{a,4}] = lookup_keys(Q) + end, [{{3,a}},{{2,b}},{{a,4}}])">>, + + <<"etsc(fun(E) -> + NoAnswers = 3*3*3+2*2*2, + Q = qlc:q([{X,Y,Z} || + {{X,Y,Z}} <- ets:table(E), + (((X =:= 4) or (X =:= 5)) and + ((Y =:= 4) or (Y =:= 5)) and + ((Z =:= 4) or (Z =:= 5))) or + (((X =:= 1) or (X =:= 2) or (X =:= 3)) and + ((Y =:= 1) or (Y =:= 2) or (Y =:= 3)) and + ((Z =:= 1) or (Z =:= 2) or (Z =:= 3)))], + {max_lookup, NoAnswers}), + {list, {table, _}, _} = i(Q), + [{1,1,1},{2,2,2},{3,3,3}] = lists:sort(qlc:e(Q)), + true = NoAnswers =:= length(lookup_keys(Q)) + end, [{{1,1,1}},{{2,2,2}},{{3,3,3}},{{3,3,4}},{{4,1,1}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{X,Y,Z} || + {{X,Y,Z}} <- ets:table(E), + (((X =:= 4) or (X =:= 5)) and + ((Y =:= 4) or (Y =:= 5)) and + ((Z =:= 4) or (Z =:= 5))) or + (((X =:= 1) or (X =:= 2) or (X =:= 3)) and + ((Y =:= 1) or (Y =:= 2) or (Y =:= 3)) and + ((Z =:= 1) or (Z =:= 2) or (Z =:= 3)))], + {max_lookup, 10}), + [{1,1,1},{2,2,2},{3,3,3}] = lists:sort(qlc:e(Q)), + {table,{ets,table,[_,[{traverse,{select,_}}]]}} = i(Q) + end, [{{1,1,1}},{{2,2,2}},{{3,3,3}},{{3,3,4}},{{4,1,1}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || X={_,_,_} <- ets:table(E), + element(1, X) =:= 3, element(2, X) == a]), + [{3,a,s}] = qlc:e(Q), + [3] = lookup_keys(Q) + end, [{1,c,q},{2,b,r},{3,a,s}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || X <- ets:table(E), + element(0, X) =:= 3]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1},{2}])">>, + + <<"etsc(fun(E) -> + F = fun(_) -> 3 end, + %% No occurs check; X =:= F(X) is ignored. + Q = qlc:q([X || {X} <- ets:table(E), + X =:= 3, X =:= F(X)]), + {qlc,_,[{generate,_,{list,{table,_},_}},_],[]} = i(Q), + [3] = lists:sort(qlc:e(Q)), + [3] = lookup_keys(Q) + end, [{2},{3},{4}])">>, + + <<"etsc(fun(E) -> + A = a, B = a, + Q = qlc:q([X || {{X,Y}} <- ets:table(E), + ((X =:= A) and (Y =:= B)) + or ((X =:= B) and (Y =:= A))]), + [a] = qlc:e(Q), + %% keys are usorted, duplicate removed: + [{a,a}] = lookup_keys(Q) + end, [{{a,a}},{{b,b}}])">>, + + <<"etsc(fun(E) -> + A = a, B = b, + Q = qlc:q([X || {{X,Y}} <- ets:table(E), + ((X =:= A) and (Y =:= B)) + or ((X =:= B) and (Y =:= A))]), + [a,b] = lists:sort(qlc:e(Q)), + [{a,b},{b,a}] = lookup_keys(Q) + end, [{{a,b}},{{b,a}},{{c,a}},{{d,b}}])">>, + + %% The atom 'fail' is recognized - lookup. + <<"etsc(fun(E) -> + Q = qlc:q([A || {A} <- ets:table(E), + (A =:= 2) + orelse fail + ]), + [2] = lists:sort(qlc:e(Q)), + [2] = lookup_keys(Q) + end, [{1},{2}])">> + + ], + ?line run(Config, Ts), + + TsR = [ + %% is_record/2,3: + <<"etsc(fun(E) -> + Q = qlc:q([element(1, X) || X <- ets:table(E), + erlang:is_record(X, r, 2)]), + [r] = qlc:e(Q), + [r] = lookup_keys(Q) + end, [{keypos,1}], [#r{}])">>, + <<"etsc(fun(E) -> + Q = qlc:q([element(1, X) || X <- ets:table(E), + is_record(X, r, 2)]), + [r] = qlc:e(Q), + [r] = lookup_keys(Q) + end, [{keypos,1}], [#r{}])">>, + <<"etsc(fun(E) -> + Q = qlc:q([element(1, X) || X <- ets:table(E), + {erlang,is_record}(X, r, 2)]), + [r] = qlc:e(Q), + [r] = lookup_keys(Q) + end, [{keypos,1}], [#r{}])">>, + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([element(1, X) || X <- ets:table(E), + record(X, r)]), + [r] = qlc:e(Q), + [r] = lookup_keys(Q) + end, [{keypos,1}], [#r{}])">>, + {warnings,[{{4,45},erl_lint,{obsolete_guard,{record,2}}}]}}, + <<"etsc(fun(E) -> + Q = qlc:q([element(1, X) || X <- ets:table(E), + erlang:is_record(X, r)]), + [r] = qlc:e(Q), + [r] = lookup_keys(Q) + end, [{keypos,1}], [#r{}])">>, + <<"etsc(fun(E) -> + Q = qlc:q([element(1, X) || X <- ets:table(E), + is_record(X, r)]), + [r] = qlc:e(Q), + [r] = lookup_keys(Q) + end, [{keypos,1}], [#r{}])">>, + <<"etsc(fun(E) -> + Q = qlc:q([element(1, X) || X <- ets:table(E), + {erlang,is_record}(X, r)]), + [r] = qlc:e(Q), + [r] = lookup_keys(Q) + end, [{keypos,1}], [#r{}])">> + + ], + ?line run(Config, <<"-record(r, {a}).\n">>, TsR), + + Ts2 = [ + <<"etsc(fun(E) -> + Q0 = qlc:q([X || + X <- ets:table(E), + (element(1, X) =:= 1) or + (element(1, X) =:= 2)], + {cache,ets}), + Q = qlc:q([{X,Y} || + X <- [1,2], + Y <- Q0]), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{table,_}}], []} = i(Q), + [{1,{1}},{1,{2}},{2,{1}},{2,{2}}] = lists:sort(qlc:e(Q)), + [1,2] = lookup_keys(Q) + end, [{keypos,1}], [{1},{2}])">>, + + <<"etsc(fun(E) -> + Q0 = qlc:q([X || + X <- ets:table(E), + (element(1, X) =:= 1) or + (element(1, X) =:= 2)]), + Q = qlc:q([{X,Y} || + X <- [1,2], + Y <- Q0], + {cache,true}), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{table,_}}],[]} = i(Q), + [1,2] = lookup_keys(Q) + end, [{keypos,1}], [{1},{2}])">>, + + %% One introduced QLC expression (join, ms), and the cache option. + <<"%% Match spec and lookup. The lookup is done twice, which might + %% be confusing... + etsc(fun(E) -> + Q = qlc:q([{X,Y} || + X <- [1,2], + {Y} <- ets:table(E), + (Y =:= 1) or (Y =:= 2)], + []), + [{1,1},{1,2},{2,1},{2,2}] = qlc:e(Q), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{list,{table,_},_}}],[]} = i(Q), + [1,2] = lookup_keys(Q) + end, [{keypos,1}], [{1},{2},{3}])">>, + <<"%% The same as last example, but with cache. + %% No cache needed (always one lookup only). + etsc(fun(E) -> + Q = qlc:q([{X,Y} || + X <- [1,2], + {Y} <- ets:table(E), + (Y =:= 1) or (Y =:= 2)], + [cache]), + [{1,1},{1,2},{2,1},{2,2}] = qlc:e(Q), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{list,{table,_},_}}],[]} = i(Q), + [1,2] = lookup_keys(Q) + end, [{keypos,1}], [{1},{2},{3}])">>, + + <<"%% And again, this time only lookup, no mach spec. + etsc(fun(E) -> + Q = qlc:q([{X,Y} || + X <- [1,2], + Y <- ets:table(E), + (element(1, Y) =:= 1) + or (element(1, Y) =:= 2)], + []), + [{1,{1}},{1,{2}},{2,{1}},{2,{2}}] = qlc:e(Q), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{table,_}}],[]} = i(Q), + [1,2] = lookup_keys(Q) + end, [{keypos,1}], [{1},{2},{3}])">>, + <<"%% As last one, but with cache. + %% No cache needed (always one lookup only). + etsc(fun(E) -> + Q = qlc:q([{X,Y} || + X <- [1,2], + Y <- ets:table(E), + (element(1, Y) =:= 1) + or (element(1, Y) =:= 2)], + [cache]), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{table,_}}],[]} = i(Q), + [{1,{1}},{1,{2}},{2,{1}},{2,{2}}] = qlc:e(Q), + [1,2] = lookup_keys(Q) + end, [{keypos,1}], [{1},{2},{3}])">>, + + <<"%% Lookup only. No cache. + etsc(fun(E) -> + Q = qlc:q([{X,Y} || + X <- [1,2], + {Y=2} <- ets:table(E)], + []), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{table,_}}],[]} = i(Q), + [{1,2},{2,2}] = qlc:e(Q), + [2] = lookup_keys(Q) + end, [{keypos,1}], [{1},{2},{3}])">>, + <<"%% Lookup only. No cache. + etsc(fun(E) -> + Q = qlc:q([{X,Y} || + X <- [1,2], + {Y=2} <- ets:table(E)], + [cache]), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{table,_}}],[]} = i(Q), + [{1,2},{2,2}] = qlc:e(Q), + [2] = lookup_keys(Q) + end, [{keypos,1}], [{1},{2},{3}])">>, + + <<"%% Matchspec only. No cache. + etsc(fun(E) -> + Q = qlc:q([{X,Y} || + X <- [1,2], + {Y} <- ets:table(E), + Y > 1], + []), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_, + {table,{ets,_,[_,[{traverse,_}]]}}}],[]} = + i(Q), + [{1,2},{1,3},{2,2},{2,3}] = qlc:e(Q), + false = lookup_keys(Q) + end, [{keypos,1}], [{1},{2},{3}])">>, + <<"%% Matchspec only. Cache + etsc(fun(E) -> + Q = qlc:q([{X,Y} || + X <- [1,2], + {Y} <- ets:table(E), + Y > 1], + [cache]), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{qlc,_, + [{generate,_,{table,{ets,_,[_,[{traverse,_}]]}}}], + [{cache,ets}]}}],[]} = i(Q), + [{1,2},{1,3},{2,2},{2,3}] = qlc:e(Q), + false = lookup_keys(Q) + end, [{keypos,1}], [{1},{2},{3}])">>, + <<"%% An empty list. Always unique and cached. + Q = qlc:q([X || {X} <- [], X =:= 1, begin X > 0 end], + [{cache,true},{unique,true}]), + {qlc,_,[{generate,_,{list,[]}},_],[{unique,true}]} = i(Q), + _ = qlc:info(Q), + [] = qlc:e(Q)">>, + <<"%% A list is always cached. + Q = qlc:q([{X,Y} || Y <- [1,2], X <- [2,1,2]], + [cache]), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{list,[2,1,2]}}],[]} = i(Q), + [{2,1},{1,1},{2,1},{2,2},{1,2},{2,2}] = qlc:e(Q)">>, + <<"%% But a processed list is never cached. + Q = qlc:q([{X,Y} || Y <- [1,2], X <- [2,1,2], X > 1], + [cache]), + {qlc,_,[{generate,_, {list,[1,2]}}, + {generate,_,{qlc,_, + [{generate,_,{list,{list,[2,1,2]},_}}], + [{cache,ets}]}}],[]} = i(Q), + [{2,1},{2,1},{2,2},{2,2}] = qlc:e(Q)">>, + <<"%% A bug fixed in R11B-2: coalescing simple_qlc:s works now. + Q0 = qlc:q([X || {X} <- [{1},{2},{3}]], {cache, ets}), + Q1 = qlc:q([X || X <- Q0], {cache, list}), + Q = qlc:q([{Y,X} || Y <- [1,2], X <- Q1, X < 2], {cache, list}), + {qlc,_,[{generate,_,{list,_}}, + {generate,_,{qlc,_,[{generate,_,{list,{list,_},_}}], + [{cache,ets}]}},_],[]} = i(Q), + [{1,1},{2,1}] = qlc:e(Q)">>, + <<"Q = qlc:q([{X,Y} || Y <- [1,2], X <- [1,2], X > 1], + [cache,unique]), + {qlc,_,[{generate,_,{list,[1,2]}}, + {generate,_,{qlc,_, + [{generate,_,{list,{list,[1,2]},_}}], + [{cache,ets},{unique,true}]}}], + [{unique,true}]} = i(Q), + [{2,1},{2,2}] = qlc:e(Q)">>, + <<"L = [1,2,3], + QH1 = qlc:q([{X} || X <- L, X > 1]), + QH2 = qlc:q([{X} || X <- QH1, X > 0], [cache]), + [{{2}},{{3}}] = qlc:e(QH2), + {list,{list,{list,L},_},_} = i(QH2)">>, + <<"L = [1,2,3,1,2,3], + QH1 = qlc:q([{X} || X <- L, X > 1]), + QH2 = qlc:q([{X} || X <- QH1, X > 0], [cache,unique]), + [{{2}},{{3}}] = qlc:e(QH2), + {qlc,_,[{generate,_,{list,{list,{list,L},_},_}}], + [{unique,true}]} = i(QH2)">> + + ], + + ?line run(Config, Ts2), + + LTs = [ + <<"etsc(fun(E) -> + Q = qlc:q([X || X <- ets:table(E), + element(1, X) =:= 1], + {lookup,true}), + {table,L} = i(Q), + true = is_list(L), + [{1,a}] = qlc:e(Q), + [1] = lookup_keys(Q) + end, [{1,a},{2,b}])">>, + <<"%% No lookup, use the match spec for traversal instead. + etsc(fun(E) -> + Q = qlc:q([X || X <- ets:table(E), + element(1, X) =:= 1], + {lookup,false}), + {table,{ets,table,_}} = i(Q), + [{1,a}] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1,a},{2,b}])">>, + <<"%% As last one. {max_lookup,0} has the same effect. + etsc(fun(E) -> + Q = qlc:q([X || X <- ets:table(E), + element(1, X) =:= 1], + {max_lookup,0}), + {table,{ets,table,_}} = i(Q), + [{1,a}] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1,a},{2,b}])">> + + ], + ?line run(Config, LTs), + + ok. + +lookup_rec(doc) -> + "Lookup keys. With records."; +lookup_rec(suite) -> []; +lookup_rec(Config) when is_list(Config) -> + Ts = [ + <<"etsc(fun(E) -> + Q = qlc:q([A || #r{a = A} <- ets:table(E), + (A =:= 3) or (4 =:= A)]), + [3] = qlc:e(Q), + [3,4] = lookup_keys(Q) + end, [{keypos,2}], [#r{a = a}, #r{a = 3}, #r{a = 5}])">>, + + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([A || #r{a = 17 = A} <- ets:table(E), + (A =:= 3) or (4 =:= A)]), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{keypos,2}], [#r{a = 17}, #r{a = 3}, #r{a = 5}])">>, + {warnings,[{{4,44},qlc,nomatch_filter}]}}, + + <<"%% Compares an integer and a float. + etsc(fun(E) -> + Q = qlc:q([A || #r{a = 17 = A} <- ets:table(E), + (A == 17) or (17.0 == A)]), + [_] = qlc:e(Q), + [_] = lookup_keys(Q) + end, [{keypos,2}], [#r{a = 17}, #r{a = 3}, #r{a = 5}])">>, + + <<"%% Compares an integer and a float. + %% There is a test in qlc_pt.erl (Op =:= '=:=', C1 =:= C2), but + %% that case is handled in an earlier clause (unify ... E, E). + etsc(fun(E) -> + Q = qlc:q([A || #r{a = 17.0 = A} <- ets:table(E), + (A =:= 17) or (17.0 =:= A)]), + [_] = qlc:e(Q), + [_] = lookup_keys(Q) + end, [{keypos,2}], [#r{a = 17.0}, #r{a = 3}, #r{a = 5}])">>, + + <<"%% Matches an integer and a float. + etsc(fun(E) -> + Q = qlc:q([A || #r{a = 17 = A} <- ets:table(E), + (A =:= 17) or (17.0 =:= A)]), + [_] = qlc:e(Q), + [_] = lookup_keys(Q) + end, [{keypos,2}], [#r{a = 17}, #r{a = 3}, #r{a = 5}])">>, + + <<"etsc(fun(E) -> + F = fun(_) -> 17 end, + Q = qlc:q([A || #r{a = A} <- ets:table(E), + (F(A) =:= 3) and (A =:= 4)]), + [] = qlc:e(Q), + false = lookup_keys(Q) % F(A) could fail + end, [{keypos,2}], [#r{a = 4}, #r{a = 3}, #r{a = 5}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + #r{} == X]), + [#r{}] = lists:sort(qlc:e(Q)), + {call,_,_,[_,_]} = i(Q, {format, abstract_code}), + [#r{}] = lookup_keys(Q) + end, [{#r{}},{#r{a=foo}}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([R#r.a || R <- ets:table(E), R#r.a =:= foo]), + [foo] = qlc:e(Q), + [_] = lookup_keys(Q) + end, [{keypos,2}], [#r{a=foo}])">> + ], + ?line run(Config, <<"-record(r, {a}).\n">>, Ts), + ok. + +indices(doc) -> + "Using indices for lookup."; +indices(suite) -> []; +indices(Config) when is_list(Config) -> + Ts = [ + <<"L = [{1,a},{2,b},{3,c}], + QH = qlc:q([element(1, X) || X <- qlc_SUITE:table(L, [2]), + (element(2, X) =:= a) + or (b =:= element(2, X))]), + {list, {table,{qlc_SUITE,list_keys,[[a,b],2,L]}}, _MS} = i(QH), + [1,2] = qlc:eval(QH)">>, + + <<"L = [{1,a},{2,b},{3,c}], + QH = qlc:q([element(1, X) || X <- qlc_SUITE:table(L, [2]), + begin (element(2, X) =:= a) + or (b =:= element(2, X)) end]), + {qlc,_,[{generate,_,{table,{call,_, + {remote,_,_,{atom,_,the_list}},_}}},_],[]} + = i(QH), + [1,2] = qlc:eval(QH)">>, + + <<"L = [{1,a,q},{2,b,r},{3,c,s}], + QH = qlc:q([element(1, X) || X <- qlc_SUITE:table(L, [2,3]), + (element(3, X) =:= q) + or (r =:= element(3, X))]), + {list, {table,{qlc_SUITE,list_keys, [[q,r],3,L]}}, _MS} = i(QH), + [1,2] = qlc:eval(QH)">>, + + <<"L = [{1,a,q},{2,b,r},{3,c,s}], + QH = qlc:q([element(1, X) || X <- qlc_SUITE:table(L, 1, [2]), + (element(3, X) =:= q) + or (r =:= element(3, X))]), + {qlc,_,[{generate,_,{table,{call,_,_,_}}}, + _],[]} = i(QH), + [1,2] = qlc:eval(QH)">>, + + <<"L = [{a,1},{b,2},{c,3}], + QH = qlc:q([E || {K,I}=E <- qlc_SUITE:table(L, 1, [2]), + ((K =:= a) or (K =:= b) or (K =:= c)) + and ((I =:= 1) or (I =:= 2))], + {max_lookup, 3}), + {list, {table,{qlc_SUITE,list_keys,[[a,b,c],1,L]}}, _MS} = i(QH), + [{a,1},{b,2}] = qlc:eval(QH)">>, + + <<"L = [{a,1},{b,2},{c,3}], + QH = qlc:q([E || {K,I}=E <- qlc_SUITE:table(L, 1, [2]), + ((K =:= a) or (K =:= b) or (K =:= c)) + and ((I =:= 1) or (I =:= 2))], + {max_lookup, 2}), + {list, {table,{qlc_SUITE,list_keys, [[1,2],2,L]}}, _MS} = i(QH), + [{a,1},{b,2}] = qlc:eval(QH)">>, + + <<"L = [{a,1,x,u},{b,2,y,v},{c,3,z,w}], + QH = qlc:q([E || {K,I1,I2,I3}=E <- qlc_SUITE:table(L, 1, [2,3,4]), + ((K =/= a) or (K =/= b) or (K =/= c)) + and ((I1 =:= 1) or (I1 =:= 2) or + (I1 =:= 3) or (I1 =:= 4)) + and ((I2 =:= x) or (I2 =:= z)) + and ((I3 =:= v) or (I3 =:= w))], + {max_lookup, 5}), + {list, {table,{qlc_SUITE,list_keys, [[x,z],3,L]}}, _MS} = i(QH), + [{c,3,z,w}] = qlc:eval(QH)">> + + ], + ?line run(Config, <<"-record(r, {a}).\n">>, Ts), + ok. + +pre_fun(doc) -> + "Test the table/2 callback functions parent_fun and stop_fun."; +pre_fun(suite) -> []; +pre_fun(Config) when is_list(Config) -> + Ts = [ + <<"PF = process_flag(trap_exit, true), + %% cursor: table killing parent + L = [{1,a},{2,b},{3,c}], + F1 = fun() -> + QH = qlc:q([element(1, X) || + X <- qlc_SUITE:table_kill_parent(L, [2]), + (element(2, X) =:= a) + or (b =:= element(2, X))]), + _ = qlc:info(QH), + _ = qlc:cursor(QH) + end, + Pid1 = spawn_link(F1), + receive {'EXIT', Pid1, killed} -> + ok + end, + timer:sleep(1), + process_flag(trap_exit, PF)">>, + + <<"PF = process_flag(trap_exit, true), + %% eval without cursor: table killing parent + L = [{1,a},{2,b},{3,c}], + F2 = fun() -> + QH = qlc:q([element(1, X) || + X <- qlc_SUITE:table_kill_parent(L, [2]), + (element(2, X) =:= a) + or (b =:= element(2, X))]), + _ = qlc:eval(QH) + end, + Pid2 = spawn_link(F2), + receive {'EXIT', Pid2, killed} -> + ok + end, + process_flag(trap_exit, PF)">>, + + <<"L = [{1,a},{2,b},{3,c}], + QH = qlc:q([element(1, X) || + X <- qlc_SUITE:table_parent_throws(L, [2]), + (element(2, X) =:= a) + or (b =:= element(2, X))]), + _ = qlc:info(QH), + {throw,thrown} = (catch {any_term,qlc:cursor(QH)}), + {throw,thrown} = (catch {any_term,qlc:eval(QH)})">>, + + <<"L = [{1,a},{2,b},{3,c}], + QH = qlc:q([element(1, X) || + X <- qlc_SUITE:table_parent_exits(L, [2]), + (element(2, X) =:= a) + or (b =:= element(2, X))]), + _ = qlc:info(QH), + {'EXIT', {badarith,_}} = (catch qlc:cursor(QH)), + {'EXIT', {badarith,_}} = (catch qlc:eval(QH))">>, + + <<"L = [{1,a},{2,b},{3,c}], + QH = qlc:q([element(1, X) || + X <- qlc_SUITE:table_bad_parent_fun(L, [2]), + (element(2, X) =:= a) + or (b =:= element(2, X))]), + {'EXIT', {badarg,_}} = (catch qlc:cursor(QH)), + {'EXIT', {badarg,_}} = (catch qlc:eval(QH))">>, + + <<"%% Very simple test of stop_fun. + Ets = ets:new(apa, [public]), + L = [{1,a},{2,b},{3,c}], + H = qlc:q([X || {X,_} <- qlc_SUITE:stop_list(L, Ets)]), + C = qlc:cursor(H), + [{stop_fun,StopFun}] = ets:lookup(Ets, stop_fun), + StopFun(), + {'EXIT', {{qlc_cursor_pid_no_longer_exists, _}, _}} = + (catch qlc:next_answers(C, all_remaining)), + ets:delete(Ets)">> + + ], + + ?line run(Config, Ts), + ok. + +skip_filters(doc) -> + "Lookup keys. With records."; +skip_filters(suite) -> []; +skip_filters(Config) when is_list(Config) -> + %% Skipped filters + TsS = [ + %% Cannot skip the filter. + <<"etsc(fun(E) -> + H = qlc:q([X || X <- ets:table(E), + (element(1, X) =:= 1) xor (element(1, X) =:= 1)]), + [] = qlc:eval(H), + [1] = lookup_keys(H) + end, [{keypos,1}], [{1},{2}])">>, + + %% The filter can be skipped. Just a lookup remains. + <<"etsc(fun(E) -> + H = qlc:q([X || X <- ets:table(E), + (element(1, X) =:= 1) or (element(1, X) =:= 1)]), + [{1}] = qlc:eval(H), + {table, _} = i(H), + [1] = lookup_keys(H) + end, [{keypos,1}], [{1},{2}])">>, + + %% safe_unify fails on 3 and <> + <<"etsc(fun(E) -> + H = qlc:q([X || X <- ets:table(E), + (element(1, X) =:= 1) and (3 =:= <>)]), + [] = qlc:eval(H), + [1] = lookup_keys(H) + end, [{keypos,1}], [{1},{2}])">>, + + %% Two filters are skipped. + <<"etsc(fun(E) -> + Q = qlc:q([{B,C,D} || {A={C},B} <- ets:table(E), + (A =:= {1}) or (A =:= {2}), + (C =:= 1) or (C =:= 2), + D <- [1,2]]), + {qlc,_,[{generate,_,{table,_}},{generate,_,{list,[1,2]}}],[]} + = i(Q), + [{1,1,1},{1,1,2},{2,2,1},{2,2,2}] = lists:sort(qlc:eval(Q)), + [{1},{2}] = lookup_keys(Q) + end, [{{1},1},{{2},2},{{3},3}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{B,C} || {A={C},B} <- ets:table(E), + (A =:= {1}) or (A =:= {2}), + (C =:= 1) or (C =:= 2)]), + {qlc,_,[{generate,_,{table,_}}],[]} = i(Q), + [{1,1},{2,2}] = lists:sort(qlc:eval(Q)), + [{1},{2}] = lookup_keys(Q) + end, [{{1},1},{{2},2},{{3},3}])">>, + + %% Lookup. No match spec, no filter. + <<"etsc(fun(E) -> + Q = qlc:q([X || X <- ets:table(E), + element(1, X) =:= 1]), + {table, _} = i(Q), + [{1}] = qlc:e(Q), + [1] = lookup_keys(Q) + end, [{1},{2}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([{X,Y} || X <- ets:table(E), + element(1, X) =:= 1, + Y <- [1,2]]), + {qlc,_,[{generate,_,{table,_}},{generate,_,{list,_}}],[]} + = i(Q), + [{{1},1},{{1},2}] = lists:sort(qlc:e(Q)), + [1] = lookup_keys(Q) + end, [{1},{2}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X,Y} <- ets:table(E), + X =:= a, + X =:= Y]), + {list,{table,_},_} = i(Q), + [a] = qlc:e(Q), + [a] = lookup_keys(Q) + end, [{a,a},{b,c},{c,a}])">>, + + %% The imported variable (A) is never looked up in the current + %% implementation. This means that the first filter cannot be skipped; + %% the constant 'a' is looked up, and then the first filter evaluates + %% to false. + <<"etsc(fun(E) -> + A = 3, + Q = qlc:q([X || X <- ets:table(E), + A == element(1,X), + element(1,X) =:= a]), + [] = qlc:e(Q), + [a] = lookup_keys(Q) + end, [{a},{b},{c}])">>, + + %% No lookup. + {cres, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + X =:= 1, + X =:= 2]), + {table, _} = i(Q), + [] = qlc:e(Q), + false = lookup_keys(Q) + end, [{1,1},{2,0}])">>, + {warnings,[{{4,37},qlc,nomatch_filter}]}}, + + <<"etsc(fun(E) -> + Q = qlc:q([{A,B,C} || + {A} <- ets:table(E), + A =:= 1, + {B} <- ets:table(E), + B =:= 2, + {C} <- ets:table(E), + C =:= 3]), + {qlc,_,[{generate,_,{list,{table,_},_}}, + {generate,_,{list,{table,_},_}}, + {generate,_,{list,{table,_},_}}],[]} = i(Q), + [{1,2,3}] = qlc:e(Q), + [1,2,3] = lookup_keys(Q) + end, [{0},{1},{2},{3},{4}])">> + + ], + ?line run(Config, TsS), + + Ts = [ + <<"etsc(fun(E) -> + H = qlc:q([X || {X,_} <- ets:table(E), + X =:= 2]), + {list,{table,_},_} = i(H), + [2] = qlc:e(H) + end, [{1,a},{2,b}])">>, + + <<"etsc(fun(E) -> + H = qlc:q([X || {X,_} <- ets:table(E), + ((X =:= 2) or (X =:= 1)) and (X > 1)]), + {list,{table,_},_} = i(H), + [2] = qlc:e(H) + end, [{1,a},{2,b}])">>, + + <<"etsc(fun(E) -> + H = qlc:q([X || {X,Y} <- ets:table(E), + (X =:= 2) and (Y =:= b)]), + {list,{table,_},_} = i(H), + [2] = qlc:e(H) + end, [{1,a},{2,b}])">>, + + <<"etsc(fun(E) -> + H = qlc:q([X || X <- ets:table(E), + (element(1,X) =:= 2) and (X =:= {2,b})]), + {list,{table,_},_} = i(H), + [{2,b}] = qlc:e(H) + end, [{1,a},{2,b}])">>, + + <<"etsc(fun(E) -> + H = qlc:q([{X,Y,Z,W} || + {X,Y} <- ets:table(E), + {Z,W} <- ets:table(E), + (Y =:= 3) or (Y =:= 4)]), + {qlc,_,[{generate,_,{table,{ets,table,_}}}, + {generate,_,{table,{ets,table,_}}}],[]} = i(H), + [{a,3,a,3},{a,3,b,5}] = lists:sort(qlc:e(H)) + end, [{a,3},{b,5}])">>, + + <<"etsc(fun(E) -> + H = qlc:q([{X,Y} || + {X,Y=3} <- ets:table(E), % no matchspec + %% Two columns restricted, but lookup anyway + (X =:= a)]), + {qlc,_,[{generate,_,{table,_}}],[]} = i(H), + [{a,3}] = qlc:e(H) + end, [{a,3},{b,4}])">>, + + <<"etsc(fun(E) -> + V = 3, + H = qlc:q([{X,Y} || + {X,Y} <- ets:table(E), + (Y =:= V)]), % imported variable, no lookup + {table,{ets,table,_}} = i(H), + [{a,3}] = qlc:e(H) + end, [{a,3},{b,4}])">>, + + <<"etsc(fun(E) -> + V = b, + H = qlc:q([{X,Y} || + {X,Y} <- ets:table(E), + (X =:= V)]), % imported variable, lookup + {list,{table,_},_} = i(H), + [{b,4}] = qlc:e(H) + end, [{a,3},{b,4}])">>, + + <<"H = qlc:q([{A,B} || {{A,B}} <- [{{1,a}},{{2,b}}], + A =:= 1, + B =:= a]), + {list,{list,[_,_]},_} = i(H), + [{1,a}] = qlc:e(H)">>, + + <<"etsc(fun(E) -> + H = qlc:q([{A,B} || {{A,B}} <- ets:table(E), + A =:= 1, + B =:= a]), + {list,{table,_},_} = i(H), + [{1,a}] = qlc:e(H) + end, [{{1,a}},{{2,b}}])">>, + + %% The filters are skipped, and the guards of the match specifications + %% are skipped as well. Only the transformations of the matchspecs + %% are kept. + <<"etsc(fun(E1) -> + etsc(fun(E2) -> + H = qlc:q([{X,Y,Z,W} || + {X,_}=Z <- ets:table(E1), + W={Y} <- ets:table(E2), + (X =:= 1) or (X =:= 2), + (Y =:= a) or (Y =:= b)] + ,{lookup,true} + ), + {qlc,_,[{generate,_,{list,{table,_}, + [{{'$1','_'},[],['$_']}]}}, + {generate,_,{list,{table,_}, + [{{'$1'},[],['$_']}]}}],[]} + = i(H), + [{1,a,{1,a},{a}}, + {1,b,{1,a},{b}}, + {2,a,{2,b},{a}}, + {2,b,{2,b},{b}}] = qlc:e(H) + end, [{a},{b}]) + end, [{1,a},{2,b}])">>, + + %% The same example again, but this time no match specs are run. + <<"fun(Z) -> + etsc(fun(E1) -> + etsc(fun(E2) -> + H = qlc:q([{X,Y} || + Z > 2, + X <- ets:table(E1), + Y <- ets:table(E2), + (element(1, X) =:= 1) or + (element(1, X) =:= 2), + (element(1, Y) =:= a) or + (element(1, Y) =:= b)] + ,{lookup,true} + ), + {qlc,_,[_,{generate,_,{table,_}}, + {generate,_,{table,_}}],[]} = i(H), + [{{1,a},{a}}, + {{1,a},{b}}, + {{2,b},{a}}, + {{2,b},{b}}] = qlc:e(H) + end, [{a},{b}]) + end, [{1,a},{2,b}]) + end(4)">>, + + %% Once again, this time with a join. + <<"etsc(fun(E1) -> + etsc(fun(E2) -> + H = qlc:q([{X,Y,Z,W} || + {X,V}=Z <- ets:table(E1), + W={Y} <- ets:table(E2), + (X =:= 1) or (X =:= 2), + (Y =:= a) or (Y =:= b), + Y =:= V] + ,[{lookup,true},{join,merge}] + ), + {qlc,_,[{generate,_,{qlc,_, + [{generate,_,{qlc,_,[{generate,_, + {keysort,{list,{table,_},_},2,[]}}, + _C1,_C2],[]}}, + {generate,_, + {qlc,_,[{generate, _, + {keysort,{list,{table,_},_},1,[]}}, + _C3], + []}}, + _], + [{join,merge}]}},_],[]} = i(H), + [{1,a,{1,a},{a}},{2,b,{2,b},{b}}] = + lists:sort(qlc:e(H)) + end, [{a},{b}]) + end, [{1,a},{2,b}])">>, + + %% Filters 2 and 3 are not skipped. + %% (Only one filter at a time is tried by the parse transform.) + <<"etsc(fun(E) -> + H = qlc:q([X || {{A,B}=X,Y} <- ets:table(E), % no matchspec + Y =:= 3, + A =:= 1, + B =:= a]), + + {qlc,_,[{generate,_,{table,_}},_,_,_],[]}= i(H), + [{1,a}] = qlc:e(H) + end, [{{1,a},3},{{2,b},4}])">>, + + <<"etsc(fun(E) -> + H = qlc:q([X || {X=_,_} <- ets:table(E), % no matchspec + (X =:= 3) and (X > 3)]), + {qlc,_,[{generate,_,{table,_}},_],[]} = i(H), + [] = qlc:e(H) + end, [{3,a},{4,b}])">>, + + <<"etsc(fun(E) -> + H = qlc:q([X || {X=_,_} <- ets:table(E), % no matchspec + (X =:= 3) or true]), + {qlc,_,[{generate,_,{table,{ets,table,_}}},_],[]} = i(H), + [3,4] = lists:sort(qlc:e(H)) + end, [{3,a},{4,b}])">>, + + <<"etsc(fun(E) -> + H = qlc:q([X || {X=_,_} <- ets:table(E), % no matchspec + (X =:= 3) or false]), + {qlc,_,[{generate,_,{table,_}}],[]} = i(H), + [3] = lists:sort(qlc:e(H)) + end, [{3,a},{4,b}])">>, + + <<"etsc(fun(E) -> + H = qlc:q([X || {X=_,_} <- ets:table(E), % no matchspec + (X =:= X) and (X =:= 3)]), + {qlc,_,[{generate,_,{table,_}}],[]} = i(H), + [3] = lists:sort(qlc:e(H)) + end, [{3,a},{4,b}])">>, + + %% The order of filters matters. A guard filter cannot be used + %% unless there are no non-guard filter placed before the guard + %% filter that uses the guard filter's generator. There is + %% more examples in join_filter(). + <<"etsc(fun(E) -> + %% Lookup. + Q = qlc:q([{A,B,A} || + {A=_,B} <- ets:table(E), % no match spec + A =:= 1, + begin 1/B > 0 end]), + [{1,1,1}] = lists:sort(qlc:e(Q)) + end, [{1,1},{2,0}])">>, + <<"etsc(fun(E) -> + %% No lookup. + Q = qlc:q([{A,B,A} || + {A=_,B} <- ets:table(E), % no match spec + begin 1/B > 0 end, + A =:= 1]), + {'EXIT', _} = (catch qlc:e(Q)) + end, [{1,1},{2,0}])">>, + %% The same thing, with a match specification. + <<"etsc(fun(E) -> + Q = qlc:q([{A,B,A} || + {A,B} <- ets:table(E), % match spec + A < 2, + begin 1/B > 0 end]), + [{1,1,1}] = lists:sort(qlc:e(Q)) + end, [{1,1},{2,0}])">>, + <<"etsc(fun(E) -> + Q = qlc:q([{A,B,A} || + {A,B} <- ets:table(E), % match spec + begin 1/B > 0 end, + A < 2]), + {'EXIT', _} = (catch qlc:e(Q)) + end, [{1,1},{2,0}])">>, + %% More examples, this time two tables. + <<"etsc(fun(E) -> + Q = qlc:q([{A,B,C,D} || + {A,B} <- ets:table(E), % match spec + A < 2, + {C,D} <- ets:table(E), + begin 1/B > 0 end, %\"invalidates\" next filter + C =:= 1, + begin 1/D > 0 end]), + {qlc,_,[{generate,_,{table,{ets,table,_}}}, + {generate,_,{table,{ets,table,_}}}, + _,_,_],[]} = i(Q), + [{1,1,1,1}] = lists:sort(qlc:e(Q)) + end, [{1,1},{2,0}])">>, + <<"etsc(fun(E) -> + Q = qlc:q([{A,B,C,D} || + {A,B} <- ets:table(E), + {C,D} <- ets:table(E), + begin 1/B > 0 end, % \"invalidates\" two filters + A < 2, + C =:= 1, + begin 1/D > 0 end]), + {qlc,_,[{generate,_,{table,{ets,table,_}}}, + {generate,_,{table,{ets,table,_}}},_,_,_,_],[]} = i(Q), + {'EXIT', _} = (catch qlc:e(Q)) + end, [{1,1},{2,0}])">>, + <<"%% There are objects in the ETS table, but none passes the filter. + %% F() would not be run if it did not \"invalidate\" the following + %% guards. + etsc(fun(E) -> + F = fun() -> [foo || A <- [0], 1/A] end, + Q1 = qlc:q([X || {X} <- ets:table(E), + F(), % \"invalidates\" next guard + X =:= 17]), + {'EXIT', _} = (catch qlc:e(Q1)) + end, [{1},{2},{3}])">>, + <<"%% The last example works just like this one: + etsc(fun(E) -> + F = fun() -> [foo || A <- [0], 1/A] end, + Q1 = qlc:q([X || {X} <- ets:table(E), + F(), + begin X =:= 17 end]), + {'EXIT', _} = (catch qlc:e(Q1)) + end, [{1},{2},{3}])">> + + ], + ?line run(Config, Ts), + + ok. + +table_impls(suite) -> + [ets, dets]. + +ets(doc) -> + "ets:table/1,2."; +ets(suite) -> []; +ets(Config) when is_list(Config) -> + Ts = [ + <<"E = ets:new(t, [ordered_set]), + true = ets:insert(E, [{1},{2}]), + {'EXIT', _} = + (catch qlc:e(qlc:q([X || {X} <- ets:table(E, bad_option)]))), + {'EXIT', _} = + (catch qlc:e(qlc:q([X || {X} <- ets:table(E,{traverse,bad})]))), + All = [{'$1',[],['$1']}], + TravAll = {traverse,{select,All}}, + [_, _] = qlc:e(qlc:q([X || {X} <- ets:table(E, TravAll)])), + [_, _] = qlc:e(qlc:q([X || {X} <- ets:table(E,{traverse,select})])), + [1,2] = + qlc:e(qlc:q([X || {X} <- ets:table(E, {traverse, first_next})])), + [2,1] = + qlc:e(qlc:q([X || {X} <- ets:table(E, {traverse, last_prev})])), + {table,{ets,table,[_,[{traverse,{select,_}},{n_objects,1}]]}} = + i(qlc:q([X || {X} <- ets:table(E, {n_objects,1})])), + {qlc,_,[{generate,_,{table,{ets,table,[_,{n_objects,1}]}}},_],[]} = + i(qlc:q([X || {X} <- ets:table(E,{n_objects,1}), + begin (X >= 1) or (X < 1) end])), + {qlc,_,[{generate,_,{table,{ets,table,[_]}}},_],[]} = + i(qlc:q([X || {X} <- ets:table(E), + begin (X >= 1) or (X < 1) end])), + ets:delete(E)">>, + + begin + MS = ets:fun2ms(fun({X,Y}) when X > 1 -> {X,Y} end), + [<<"E = ets:new(apa,[]), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + MS = ">>, io_lib:format("~w", [MS]), <<", + Q = qlc:q([X || {X,_} <- ets:table(E, {traverse, {select, MS}}), + X =:= 1]), + R = qlc:e(Q), + ets:delete(E), + [] = R">>] + end + + ], + + ?line run(Config, Ts), + ok. + +dets(doc) -> + "dets:table/1,2."; +dets(suite) -> []; +dets(Config) when is_list(Config) -> + dets:start(), + T = t, + Fname = filename(T, Config), + Ts = [ + [<<"T = t, Fname = \"">>, Fname, <<"\", + file:delete(Fname), + {ok, _} = dets:open_file(T, [{file,Fname}]), + ok = dets:insert(T, [{1},{2}]), + {'EXIT', _} = + (catch qlc:e(qlc:q([X || {X} <- dets:table(T, bad_option)]))), + {'EXIT', _} = + (catch qlc:e(qlc:q([X || {X} <- dets:table(T,{traverse,bad})]))), + {'EXIT', _} = + (catch + qlc:e(qlc:q([X || {X} <- dets:table(T,{traverse,last_prev})]))), + All = [{'$1',[],['$1']}], + TravAll = {traverse,{select,All}}, + [_,_] = qlc:e(qlc:q([X || {X} <- dets:table(T, TravAll)])), + [_,_] = qlc:e(qlc:q([X || {X} <- dets:table(T,{traverse,select})])), + [_,_] = + qlc:e(qlc:q([X || {X} <- dets:table(T, {traverse, first_next})])), + {table,{dets,table,[T,[{traverse,{select,_}},{n_objects,1}]]}} = + i(qlc:q([X || {X} <- dets:table(T, {n_objects,1})])), + {qlc,_,[{generate,_,{table,{dets,table,[t,{n_objects,1}]}}},_],[]}= + i(qlc:q([X || {X} <- dets:table(T,{n_objects,1}), + begin (X >= 1) or (X < 1) end])), + {qlc,_,[{generate,_,{table,{dets,table,[_]}}},_],[]} = + i(qlc:q([X || {X} <- dets:table(T), + begin (X >= 1) or (X < 1) end])), + H = qlc:q([X || {X} <- dets:table(T, {n_objects, default}), + begin (X =:= 1) or (X =:= 2) or (X =:= 3) end]), + [1,2] = lists:sort(qlc:e(H)), + {qlc,_,[{generate,_,{table,_}},_],[]} = i(H), + + H2 = qlc:q([X || {X} <- dets:table(T), (X =:= 1) or (X =:= 2)]), + [1,2] = lists:sort(qlc:e(H2)), + {list,{table,_},_} = i(H2), + true = binary_to_list(<< + \"ets:match_spec_run(lists:flatmap(fun(V)->dets:lookup(t,V)end,\" + \"[1,2]),ets:match_spec_compile([{{'$1'},[],['$1']}]))\">>) + == format_info(H2, true), + + H3 = qlc:q([X || {X} <- dets:table(T), (X =:= 1)]), + [1] = qlc:e(H3), + {list,{table,_},_} = i(H3), + + ok = dets:close(T), + file:delete(\"">>, Fname, <<"\"), + ok">>], + + begin + MS = ets:fun2ms(fun({X,Y}) when X > 1 -> {X,Y} end), + [<<"T = t, Fname = \"">>, Fname, <<"\", + {ok, _} = dets:open_file(T, [{file,Fname}]), + MS = ">>, io_lib:format("~w", [MS]), <<", + ok = dets:insert(T, [{1,a},{2,b},{3,c}]), + Q = qlc:q([X || {X,_} <- dets:table(T, {traverse, {select, MS}}), + X =:= 1]), + R = qlc:e(Q), + ok = dets:close(T), + file:delete(\"">>, Fname, <<"\"), + [] = R">>] + end, + + [<<"T = t, Fname = \"">>, Fname, <<"\", + {ok, _} = dets:open_file(T, [{file,Fname}]), + Objs = [{X} || X <- lists:seq(1,10)], + ok = dets:insert(T, Objs), + {ok, Where} = dets:where(T, {2}), + ok = dets:close(T), + qlc_SUITE:crash(Fname, Where), + + {ok, _} = dets:open_file(T, [{file,Fname}]), + HT = qlc:q([X || {X} <- dets:table(T, {traverse, first_next})]), + {'EXIT',{error,{{bad_object,_},_}}} = (catch qlc:e(HT)), + _ = dets:close(T), + + {ok, _} = dets:open_file(T, [{file,Fname}]), + HMS = qlc:q([X || {X} <- dets:table(T, {traverse, select})]), + {error,{{bad_object,_},_}} = qlc:e(HMS), + _ = dets:close(T), + + {ok, _} = dets:open_file(T, [{file,Fname}]), + HLU = qlc:q([X || {X} <- dets:table(T), X =:= 2]), + {error,{{bad_object,_},_}} = qlc:e(HLU), + _ = dets:close(T), + + file:delete(Fname)">>] + + ], + + ?line run(Config, Ts), + _ = file:delete(Fname), + ok. + +join(suite) -> + [join_option, join_filter, join_lookup, join_merge, + join_sort, join_complex]. + +join_option(doc) -> + "The 'join' option (any, lookup, merge, nested_loop). Also cache/unique."; +join_option(suite) -> []; +join_option(Config) when is_list(Config) -> + Ts = [ + <<"Q1 = qlc:q([X || X <- [1,2,3]],{join,merge}), + {'EXIT', {no_join_to_carry_out,_}} = (catch {foo, qlc:info(Q1)}), + {'EXIT', {no_join_to_carry_out,_}} = (catch {foo, qlc:e(Q1)}), + + Q2 = qlc:q([X || X <- [1,2,3], X > 1],{join,merge}), + {'EXIT', {no_join_to_carry_out,_}} = (catch {foo, qlc:info(Q2)}), + {'EXIT', {no_join_to_carry_out,_}} = (catch {foo, qlc:e(Q2)}), + + Q3 = qlc:q([{X,Y} || + {X} <- [{1},{2},{3}], + {Y} <- [{a},{b},{c}], + X =:= Y], + {join, merge}), + + {1,0,0,2} = join_info(Q3), + [] = qlc:e(Q3), + + Q4 = qlc:q([{X,Y} || + {X} <- [{1},{2},{3}], + {Y} <- [{a},{b},{c}], + X > Y], + {join, lookup}), + {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:info(Q4)}), + {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:e(Q4)}), + + Q5 = qlc:q([{X,Y} || + {X} <- [{1},{2},{3}], + {Y} <- [{3},{4},{5}], + X == Y], + {join, merge}), + [{3,3}] = qlc:e(Q5), + + Q6 = qlc:q([{X,Y} || + {X} <- [{1},{2},{3}], + {Y} <- [{3},{4},{5}], + X == Y], + {join, lookup}), + {'EXIT', {cannot_carry_out_join, _}} = (catch {foo, qlc:info(Q6)}), + {'EXIT', {cannot_carry_out_join, _}} = (catch {foo, qlc:e(Q6)}), + + Q7 = qlc:q([{X,Y} || + {X} <- [{1},{2},{3}], + {Y} <- [{3},{4},{5}], + X == Y], + {join, nested_loop}), + {0,0,1,0} = join_info(Q7), + [{3,3}] = qlc:e(Q7), + + Q8 = qlc:q([{X,Y} || + {X} <- [{1},{2},{3}], + {Y} <- [{3},{4},{5}], + X =:= Y], + {join, nested_loop}), + {0,0,1,0} = join_info(Q8), + [{3,3}] = qlc:e(Q8), + + %% Only guards are inspected... + Q9 = qlc:q([{X,Y} || + {X} <- [{1},{2},{3}], + {Y} <- [{3},{4},{5}], + begin X =:= Y end], + {join, nested_loop}), + {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:info(Q9)}), + {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:e(Q9)}), + + Q10 = qlc:q([{X,Y} || + {X} <- [{1},{2},{3}], + {Y} <- [{3},{4},{5}], + X < Y], + {join, nested_loop}), + {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:info(Q10)}), + {'EXIT', {no_join_to_carry_out, _}} = (catch {foo, qlc:e(Q10)}), + + F = fun(J) -> qlc:q([X || X <- [1,2]], {join,J}) end, + {'EXIT', {no_join_to_carry_out, _}} = + (catch {foo, qlc:e(F(merge))}), + {'EXIT', {no_join_to_carry_out, _}} = + (catch {foo, qlc:e(F(lookup))}), + {'EXIT', {no_join_to_carry_out, _}} = + (catch {foo, qlc:e(F(nested_loop))}), + [1,2] = qlc:e(F(any)), + + %% No join of columns in the same table. + Q11 = qlc:q([{X,Y} || {a = X, X = Y} <- [{a,1},{a,a},{a,3},{a,a}]], + {join,merge}), + {'EXIT', {no_join_to_carry_out, _}} = (catch qlc:e(Q11)), + Q12 = qlc:q([{X,Y} || {X = a, X = Y} <- [{a,1},{a,a},{a,3},{a,a}]], + {join,merge}), + {'EXIT', {no_join_to_carry_out, _}} = (catch qlc:e(Q12)), + %% X and Y are \"equal\" (same constants), but must not be joined. + Q13 = qlc:q([{X,Y} || {X,_Z} <- [{a,1},{a,2},{b,1},{b,2}], + {Y} <- [{a}], + (X =:= a) and (Y =:= b) or + (X =:= b) and (Y =:= a)], + {join,merge}), + {'EXIT', {no_join_to_carry_out, _}} = (catch qlc:e(Q13)) + +">>, + + <<"Q1 = qlc:q([X || X <- [1,2,3]], {lookup,true}), + {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:info(Q1)}), + {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:e(Q1)}), + Q2 = qlc:q([{X,Y} || X <- [1,2,3], Y <- [x,y,z]], lookup), + {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:info(Q2)}), + {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:e(Q2)}), + Q3 = qlc:q([X || {X} <- [{1},{2},{3}]], {lookup,true}), + {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:e(Q3)}), + {'EXIT', {no_lookup_to_carry_out, _}} = (catch {foo, qlc:info(Q3)}), + + E1 = create_ets(1, 10), + Q4 = qlc:q([{X,Y} || {X,Y} <- ets:table(E1), X =:= 3], lookup), + {match_spec, _} = strip_qlc_call(Q4), + [{3,3}] = qlc:e(Q4), + Q5 = qlc:q([{X,Y} || {X,Y} <- ets:table(E1), X =:= 3], {lookup,false}), + {table, ets, _} = strip_qlc_call(Q5), + [{3,3}] = qlc:e(Q5), + Q6 = qlc:q([{X,Y} || {X,Y} <- ets:table(E1), X =:= 3], {lookup,any}), + {match_spec, _} = strip_qlc_call(Q6), + [{3,3}] = qlc:e(Q6), + ets:delete(E1)">> + + ], + ?line run(Config, Ts), + + %% The 'cache' and 'unique' options of qlc/2 affects join. + CUTs = [ + <<"L1 = [1,2], + L2 = [{1,a},{2,b}], + L3 = [{a,1},{b,2}], + Q = qlc:q([{X,Y,Z} || + Z <- L1, + {X,_} <- L2, + {_,Y} <- L3, + X =:= Y], + [cache, unique]), + {qlc,_, + [{generate,_,{list,L1}}, + {generate,_,{qlc,_,[{generate,_, + {qlc,_,[{generate,_,{keysort,{list,L2},1,[]}}],[]}}, + {generate,_,{qlc,_, + [{generate,_,{keysort,{list,L3},2,[]}}],[]}},_], + [{join,merge},{cache,ets},{unique,true}]}},_], + [{unique,true}]} = i(Q), + [{1,1,1},{2,2,1},{1,1,2},{2,2,2}] = qlc:e(Q)">>, + <<"L1 = [1,2], + L2 = [{1,a},{2,b}], + L3 = [{a,1},{b,2}], + Q = qlc:q([{X,Y,Z} || + Z <- L1, + {X,_} <- L2, + {_,Y} <- L3, + X =:= Y], + []), + Options = [{cache_all,ets}, unique_all], + {qlc,_,[{generate,_,{qlc,_,[{generate,_,{list,L1}}], + [{unique,true}]}}, + {generate,_,{qlc,_, + [{generate,_,{qlc,_,[{generate,_, + {keysort,{qlc,_,[{generate,_,{list,L2}}], + [{cache,ets},{unique,true}]}, + 1,[]}}],[]}}, + {generate,_,{qlc,_, + [{generate,_,{keysort, + {qlc,_,[{generate,_,{list,L3}}], + [{cache,ets},{unique,true}]}, + 2,[]}}],[]}},_], + [{join,merge},{cache,ets},{unique,true}]}}, + _],[{unique,true}]} = i(Q, Options), + [{1,1,1},{2,2,1},{1,1,2},{2,2,2}] = qlc:e(Q, Options)">> + ], + ?line run(Config, CUTs), + + ok. + +join_filter(doc) -> + "Various aspects of filters and join."; +join_filter(suite) -> []; +join_filter(Config) when is_list(Config) -> + Ts = [ + <<"E1 = create_ets(1, 10), + Q = qlc:q([X || {X,_} <- ets:table(E1), + begin A = X * X end, % ej true (?) + X >= A]), + {'EXIT', _} = (catch qlc:e(Q)), + ets:delete(E1)">>, + + %% The order of filters matters. See also skip_filters(). + <<"Q = qlc:q([{X,Y} || {X,Y} <- [{a,1},{b,2}], + {Z,W} <- [{a,1},{c,0}], + X =:= Z, + begin Y/W > 0 end]), + [{a,1}] = qlc:e(Q)">>, + <<"Q = qlc:q([{X,Y} || {X,Y} <- [{a,1},{b,2}], + {Z,W} <- [{a,1},{c,0}], + begin Y/W > 0 end, + X =:= Z]), + {'EXIT', _} = (catch qlc:e(Q))">>, + + <<"etsc(fun(E1) -> + etsc(fun(E2) -> + F = fun() -> [foo || A <- [0], 1/A] end, + Q1 = qlc:q([X || {X} <- ets:table(E1), + {Y} <- ets:table(E2), + F(), % invalidates next filter + X =:= Y]), + {qlc,_,[{generate,_,{table,{ets,table,_}}}, + {generate,_,{table,{ets,table,_}}},_,_], + []} = i(Q1), + {'EXIT', _} = (catch qlc:e(Q1)) + end, [{1},{2},{3}]) + end, [{a},{b},{c}])">> + + ], + ?line run(Config, Ts), + ok. + +join_lookup(doc) -> + "Lookup join."; +join_lookup(suite) -> []; +join_lookup(Config) when is_list(Config) -> + Ts = [ + <<"E1 = create_ets(1, 10), + E2 = create_ets(5, 15), + Q = qlc:q([{X,Y} || {_,Y} <- ets:table(E2), + {X,_} <- ets:table(E1), + X =:= Y], [{join,lookup}]), + {0,1,0,0} = join_info_count(Q), + R = qlc:e(Q), + ets:delete(E1), + ets:delete(E2), + [{5,5},{6,6},{7,7},{8,8},{9,9},{10,10}] = lists:sort(R)">>, + + <<"E1 = create_ets(1, 10), + E2 = create_ets(5, 15), + F = fun(J) -> qlc:q([{X,Y} || {X,_} <- ets:table(E1), + {_,Y} <- ets:table(E2), + X =:= Y], {join, J}) + end, + Q = F(lookup), + {0,1,0,0} = join_info_count(Q), + R = qlc:e(Q), + ets:delete(E1), + ets:delete(E2), + [{5,5},{6,6},{7,7},{8,8},{9,9},{10,10}] = lists:sort(R)">>, + + <<"etsc(fun(E1) -> + E2 = qlc_SUITE:table([{1,a},{a},{1,b},{b}], 2, []), + Q = qlc:q([{X,Y} || {X,Y} <- ets:table(E1), % (1) + {_,Z} <- E2, % (2) + (Z =:= Y) and (X =:= a) + or + (Z =:= Y) and (X =:= b)]), + %% Cannot look up in (1) (X is keypos). Can look up (2). + %% Lookup-join: traverse (1), look up in (2). + {0,1,0,0} = join_info_count(Q), + [{a,a},{b,a}] = qlc:e(Q) + end, [{a,a},{b,a},{c,3},{d,4}])">>, + + <<"%% The pattern {X,_} is used to filter out looked up objects. + etsc(fun(E) -> + Q = qlc:q([X || {X,_} <- ets:table(E), + Y <- [{a,b},{c,d},{1,2},{3,4}], + X =:= element(1, Y)]), + {0,1,0,0} = join_info_count(Q), + [1] = qlc:e(Q) + end, [{1,2},{3}])">>, + + <<"E = ets:new(e, [bag,{keypos,2}]), + L = lists:sort([{a,1},{b,1},{c,1},{d,1}, + {aa,2},{bb,2},{cc,2},{dd,2}]), + true = ets:insert(E, L ++ [{aaa,1,1},{bbb,2,2},{ccc,3,3}]), + Q = qlc:q([Z || {_,Y}=Z <- ets:table(E), + {X} <- [{X} || X <- lists:seq(0, 10)], + X =:= Y]), + {0,1,0,0} = join_info_count(Q), + R = qlc:e(Q), + ets:delete(E), + L = lists:sort(R)">>, + + <<"E = ets:new(e, [bag,{keypos,2}]), + L = lists:sort([{a,1},{b,1},{c,1},{d,1}, + {aa,2},{bb,2},{cc,2},{dd,2}]), + true = ets:insert(E, L ++ [{aaa,1,1},{bbb,2,2},{ccc,3,3}]), + Q = qlc:q([Z || {X} <- [{X} || X <- lists:seq(0, 10)], + {_,Y}=Z <- ets:table(E), + X =:= Y]), + {0,1,0,0} = join_info_count(Q), + R = qlc:e(Q), + ets:delete(E), + L = lists:sort(R)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{b,1},{c,3}], + {Y,YY} <- qlc_SUITE:table_lookup_error([{1,a}]), + X =:= Y], + {join,lookup}), + {error, lookup, failed} = qlc:e(Q)">>, + + <<"E = create_ets(1, 10), + Q = qlc:q([{X,Y} || + {X,_} <- ets:table(E), + {_,Y} <- qlc_SUITE:table_error([{a,1}], 1, err), + X =:= Y]), + {0,1,0,0} = join_info_count(Q), + err = qlc:e(Q), + ets:delete(E)">> + + ], + ?line run(Config, Ts), + ok. + +join_merge(doc) -> + "Merge join."; +join_merge(suite) -> []; +join_merge(Config) when is_list(Config) -> + Ts = [ + <<"Q = qlc:q([{X,Y} || {X} <- [], {Y} <- [{1}], X =:= Y], + {join,merge}), + [] = qlc:e(Q) + ">>, + + <<"Q = qlc:q([{X,Y} || {X} <- [{1}], {Y} <- [], X =:= Y], + {join,merge}), + [] = qlc:e(Q) + ">>, + + <<"Q = qlc:q([{X,Y} || {X} <- [{1},{1},{1}], + {Y} <- [{1},{1},{1}], X =:= Y], + {join,merge}), + 9 = length(qlc:e(Q)) + ">>, + + <<"%% Two merge joins possible. + Q = qlc:q([{X,Y,Z,W} || {X,Y} <- [{1,a},{1,b},{1,c}], + {Z,W} <- [{1,a},{1,b},{1,c}], + X =:= Z, + Y =:= W]), + {qlc,_,[{generate,_, + {qlc,_, + [{generate,_, + {qlc,_,[{generate,_,{keysort,{list,_},C,[]}}],[]}}, + {generate,_, + {qlc,_,[{generate,_,{keysort,{list,_},C,[]}}],[]}}, + _], + [{join,merge}]}}, + _,_],[]} = qlc:info(Q, {format,debug}), + [{1,a,1,a},{1,b,1,b},{1,c,1,c}] = qlc:e(Q)">>, + + <<"%% As the last one, but comparison. + Q = qlc:q([{X,Y,Z,W} || {X,Y} <- [{1,a},{1,b},{1,c}], + {Z,W} <- [{1,a},{1,b},{1,c}], + X == Z, % skipped + Y =:= W]), + {qlc,_,[{generate,_, + {qlc,_, + [{generate,_, + {qlc,_,[{generate,_,{keysort,{list,_},1,[]}}],[]}}, + {generate,_, + {qlc,_,[{generate,_,{keysort,{list,_},1,[]}}],[]}}, + _], + [{join,merge}]}}, + _],[]} = qlc:info(Q, {format,debug}), + [{1,a,1,a},{1,b,1,b},{1,c,1,c}] = qlc:e(Q)">>, + + <<"%% This is no join. + Q = qlc:q([{X,Y,Z,W} || {X,Y} <- [], {Z,W} <- [], + X =:= Y, Z =:= W]), + {0,0,0,0} = join_info_count(Q)">>, + + <<"%% Used to replace empty ETS tables with [], but that won't work. + E1 = ets:new(e1, []), + E2 = ets:new(e2, []), + Q = qlc:q([{X,Z,W} || + {X, Z} <- ets:table(E1), + {W, Y} <- ets:table(E2), + X =:= Y], + {join, lookup}), + [] = qlc:e(Q), + ets:delete(E1), + ets:delete(E2)">>, + + <<"Q = qlc:q([{X,Y} || {X} <- [{3},{1},{0}], + {Y} <- [{1},{2},{3}], + X =:= Y]), + {1,0,0,2} = join_info_count(Q), + [{1,1},{3,3}] = qlc:e(Q)">>, + + <<"QH = qlc:q([{X,Y,Z,W} || {X,Y} <- [{3,c},{2,b},{1,a}], + {Z,W} <- [{2,b},{4,d},{5,e},{3,c}], + X =:= Z, + Y =:= W]), + {1,0,0,2} = join_info_count(QH), + [{2,b,2,b},{3,c,3,c}] = qlc:e(QH)">>, + + <<"%% QLC finds no join column at run time... + QH = qlc:q([1 || X <- [{1,2,3},{4,5,6}], + Y <- [{1,2},{3,4}], + X =:= Y]), + {0,0,0,0} = join_info_count(QH), + [] = qlc:e(QH)">>, + + <<"QH = qlc:q([X || X <- [{1,2,3},{4,5,6}], + Y <- [{1,2},{3,4}], + element(1, X) =:= element(2, Y)]), + {1,0,0,2} = join_info_count(QH), + [{4,5,6}] = qlc:e(QH)">>, + + <<"Q = qlc:q([{A,X,Z,W} || + A <- [a,b,c], + {X,Z} <- [{a,1},{b,4},{c,6}], + {W,Y} <- [{2,a},{3,b},{4,c}], + X =:= Y], + {cache, list}), + _ = qlc:info(Q), + [{a,a,1,2},{a,b,4,3},{a,c,6,4},{b,a,1,2},{b,b,4,3}, + {b,c,6,4},{c,a,1,2},{c,b,4,3},{c,c,6,4}] = qlc:e(Q)">>, + + <<"Q = qlc:q([{X,Y} || + {X,Z} <- [{a,1},{b,4},{c,6}], + {W,Y} <- [{2,a},{3,b},{4,c}], + Z > W, + X =:= Y], + {join,merge}), + {qlc,_,[{generate,_,{qlc,_, + [{generate,_, + {qlc,_,[{generate,_,{keysort,_,1,[]}}],[]}}, + {generate,_, + {qlc,_,[{generate,_,{keysort,_,2,[]}}], + []}},_],[{join,merge}]}}, + _,_],[]} = i(Q), + [{b,b},{c,c}] = qlc:e(Q)">>, + + <<"E1 = create_ets(1, 10), + E2 = create_ets(5, 15), + %% A match spec.; Q does not see Q1 and Q2 as lookup-tables. + Q1 = qlc:q([X || X <- ets:table(E1)]), + Q2 = qlc:q([X || X <- ets:table(E2)]), + F = fun(J) -> qlc:q([{X,Y} || X <- Q1, + Y <- Q2, + element(1,X) =:= element(1,Y)], + [{join,J}]) + end, + {'EXIT',{cannot_carry_out_join,_}} = (catch qlc:e(F(lookup))), + Q = F(merge), + {1,0,0,2} = join_info(Q), + R = lists:sort(qlc:e(Q)), + ets:delete(E1), + ets:delete(E2), + true = [{Y,Y} || X <- lists:seq(5, 10), {} =/= (Y = {X,X})] =:= R + ">>, + + <<"E1 = create_ets(1, 10), + E2 = create_ets(5, 15), + Q = qlc:q([{X,Y} || X <- ets:table(E1), + Y <- ets:table(E2), + element(1,X) =:= element(1,Y)], + [{join,merge}]), + {1,0,0,2} = join_info(Q), + R = lists:sort(qlc:e(Q)), + ets:delete(E1), + ets:delete(E2), + true = [{Y,Y} || X <- lists:seq(5, 10), {} =/= (Y = {X,X})] =:= R + ">>, + + <<"E1 = create_ets(1, 10), + E2 = create_ets(5, 15), + Q1 = qlc:q([Y || X <- ets:table(E1), begin Y = {X}, true end]), + %% A match spec.; Q does not see Q2 as a lookup-table. + %% + %% OTP-6673: lookup join is considered but since there is no + %% filter that can do the job of Q2, lookup join is not an option.. + Q2 = qlc:q([{X} || X <- ets:table(E2)]), + F = fun(J) -> + qlc:q([{X,Y} || X <- Q1, + Y <- Q2, + element(1,X) =:= element(1,Y)], + [{join,J}]) + end, + {'EXIT',{cannot_carry_out_join,_}} = (catch qlc:e(F(lookup))), + Q = F(any), + {1,0,0,2} = join_info(Q), + R = lists:sort(qlc:e(Q)), + ets:delete(E1), + ets:delete(E2), + true = [{Y,Y} || X <- lists:seq(5, 10), {} =/= (Y = {{X,X}})] =:= R + ">>, + + <<"L1 = [{1,a},{2,a},{1,b},{2,b},{1,c},{2,c}], + L2 = [{b,Y} || Y <- lists:seq(1, 10000)], + F = fun(J) -> + Q = qlc:q([{XX,YY} || + {X,XX} <- L1, + {YY,Y} <- L2, + X == Y], + {join,J}), + qlc:q([{XX1,YY1,XX2,YY2} || + {XX1,YY1} <- Q, + {XX2,YY2} <- Q]) + end, + Qm = F(merge), + Qn = F(nested_loop), + true = lists:sort(qlc:e(Qm)) =:= lists:sort(qlc:e(Qn))">>, + + <<"L1 = [{{1,a},2},{{3,c},4}], + L2 = [{a,{1,a}},{c,{4,d}}], + Q = qlc:q([{X,Y} || {X,_} <- L1, + {_,{Y,Z}} <- L2, + X == {Y,Z} + ]), + {qlc,_,[{generate,_,{qlc,_, + [{generate,_, + {qlc,_,[{generate,_,{keysort,{list,L1},1,[]}}],[]}}, + {generate,_, + {qlc,_,[{generate,_,{keysort,{list,L2},2,[]}}],[]}}, + _], + [{join,merge}]}}],[]} = i(Q), + [{{1,a},1}] = qlc:e(Q)">>, + + <<"etsc(fun(E1) -> + etsc(fun(E2) -> + Q = qlc:q([{X,Y} || {X,Y} <- ets:table(E1), % (1) + {Z} <- ets:table(E2), % (2) + (Z =:= X) and + (Y =:= a) and + (X =:= Y) or + (Y =:= b) and + (Z =:= Y)]), + %% Cannot look up in (1) (X is keypos). Can look up (2). + %% Lookup join not possible (cannot look up in (1)). + %% Merge join is possible (after lookup in (2)). + {1,0,0,2} = join_info_count(Q), + {qlc,_, + [{generate,_, + {qlc,_,[{generate,_, + {qlc,_,[{generate,_, + {keysort, + {table,{ets,table,_}}, + 2,[]}},_C1],[]}}, + {generate,_, + {qlc,_,[{generate,_, + {keysort,{table,_},1,[]}},_C2], + []}}, + _],[{join,merge}]}},_],[]} = i(Q), + [{a,a}] = qlc:e(Q) + end, [{a}]) + end, [{a,1},{a,a},{b,1},{b,2}])">>, + + <<"Q = qlc:q([{G1,G2} || + G1<- [{1}], + G2 <- [{1}], + element(1, G1) =:= element(1, G2)]), + {1,0,0,2} = join_info(Q), + [{{1},{1}}] = qlc:e(Q)">>, + + <<"Q = qlc:q([{X,Y} || + X <- [{1}], + Y <- [{1}], + element(1, X) =:= element(1, Y)], + {join,merge}), + {1,0,0,2} = join_info(Q), + [{{1},{1}}] = qlc:e(Q)">>, + + <<"%% Generator after the join-filter. + Q = qlc:q([Z || + {X} <- [{1},{2},{3}], + {Y} <- [{2},{3},{4}], + X =:= Y, + Z <- [1,2]]), + {qlc,_, + [{generate,_,{qlc,_, + [{generate,_,{qlc,_, + [{generate,_,{keysort,{list,[{1},{2},{3}]},1,[]}}],[]}}, + {generate,_,{qlc,_, + [{generate,_,{keysort,{list,_},1,[]}}],[]}},_], + [{join,merge}]}}, _,{generate,_,{list,_}}],[]} = i(Q), + [1,2,1,2] = qlc:e(Q)">>, + + <<"%% X and W occur twice in the pattern of the extra join handle. + Q = qlc:q([{Z,W} || + {X,Z,X} <- [{1,2,1},{1,2,2}], + {W,Y,W} <- [{a,1,a}], + X =:= Y]), + [{2,a}] = qlc:e(Q)">> + + ], + ?line run(Config, Ts), + + %% Small examples. Returning an error term. + ETs = [ + <<"F = fun(M) -> + qlc:q([{XX,YY} || + {XX,X} <- [{a,1},{b,2},{bb,2},{c,3},{cc,3}], + {Y,YY} <- [{0,a},{1,a},{1,aa},{2,b},{2,bb},{2,bbb}, + {3,c},{3,cc}], + X =:= Y], + {join,M}) + end, + R = qlc:e(F(nested_loop)), + R = qlc:e(F(merge))">>, + + <<"F = fun(M) -> + qlc:q([{XX,YY} || + {XX,X} <- [{a,1},{b,2},{bb,2},{c,3},{cc,3}], + {Y,YY} <- [{0,a},{1,a},{1,aa},{2,b},{2,bb},{2,bbb}, + {4,d}], + X =:= Y], + {join,M}) + end, + R = qlc:e(F(nested_loop)), + R = qlc:e(F(merge))">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{b,1},{c,3}], + {Y,YY} <- [{1,a}], + X =:= Y], + {join,merge}), + [{b,a}] = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{b,1},{c,3}], + {Y,YY} <- qlc_SUITE:table_error([{1,a}], 1, err), + X =:= Y], + {join,merge}), + err = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{a,1},{aa,1}], + {Y,YY} <- [{1,a}], + X =:= Y], + {join,merge}), + [{a,a},{aa,a}] = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- qlc_SUITE:table_error([{a,1},{aa,1}], + 2, err), + {Y,YY} <- [{1,a}], + X =:= Y], + {join,merge}), + err = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{a,1}], + {Y,YY} <- [{1,a},{1,aa}], + X =:= Y], + {join,merge}), + [{a,a},{a,aa}]= qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- qlc_SUITE:table_error([{a,1}], 2, err), + {Y,YY} <- [{1,a},{1,aa}], + X =:= Y], + {join,merge}), + C = qlc:cursor(Q), + [{a,a}] = qlc:next_answers(C, 1), + qlc:delete_cursor(C), + err = qlc:e(Q)">>, + + <<"F = fun(M) -> + qlc:q([{XX,YY} || + {XX,X} <- [{a,1},{b,2},{bb,2},{c,3},{cc,3}], + {Y,YY} <- [{0,a},{1,a},{1,aa},{2,b}, + {2,bb},{2,bbb}], + X =:= Y], + {join,M}) + end, + %% [{a,a},{a,aa},{b,b},{b,bb},{b,bbb},{bb,b},{bb,bb},{bb,bbb}] + R = qlc:e(F(nested_loop)), + R = qlc:e(F(merge))">>, + + + <<"F = fun(M) -> + qlc:q([{XX,YY} || + {XX,X} <- [{a,1},{b,2},{bb,2},{c,3},{cc,3}], + {Y,YY} <- qlc_SUITE:table_error([{0,a},{1,a},{1,aa}, + {2,b},{2,bb}, + {2,bbb}], + 1, err), + X =:= Y], + {join,M}) + end, + %% [{a,a},{a,aa},{b,b},{b,bb},{b,bbb},{bb,b},{bb,bb},{bb,bbb}] + err = qlc:e(F(nested_loop)), + err = qlc:e(F(merge))">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- qlc_SUITE:table_error([], 2, err), + {Y,YY} <- [{2,b},{3,c}], + X =:= Y], + {join,merge}), + err = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{a,1},{c,3}], + {Y,YY} <- [{2,b},{3,c}], + X =:= Y], + {join,merge}), + [{c,c}] = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{a,1},{aa,1}], + {Y,YY} <- [{1,a},{1,aa}], + X =:= Y], + {join,merge}), + [{a,a},{a,aa},{aa,a},{aa,aa}] = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{a,1},{b,2}], + {Y,YY} <- [{1,a},{1,aa}], + X =:= Y], + {join,merge}), + [{a,a},{a,aa}] = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{a,1},{b,2}], + {Y,YY} <- qlc_SUITE:table_error([{1,a},{1,aa}], + 1, err), + X =:= Y], + {join,merge}), + err = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{a,1},{b,2}], + {Y,YY} <- [{1,a},{1,aa},{1,aaa},{1,aaaa}], + X =:= Y], + {join,merge}), + [{a,a},{a,aa},{a,aaa},{a,aaaa}]= qlc:e(Q)">>, + + <<"Q = qlc:q([{element(1, X), element(2, Y)} || + X <- [{a,1},{aa,1}], + Y <- [{1,a},{1,aa}], + element(2, X) =:= element(1, Y)], + {join,merge}), + [{a,a},{a,aa},{aa,a},{aa,aa}] = qlc:e(Q)">>, + + <<"Q = qlc:q([{element(1, X), element(2, Y)} || + X <- [{a,1},{aa,1}], + Y <- qlc_SUITE:table_error([], 1, err), + element(2, X) =:= element(1, Y)], + {join,merge}), + err = qlc:e(Q)">>, + + <<"Q = qlc:q([{element(1, X), element(2, Y)} || + X <- qlc_SUITE:table_error([{a,1}], 2, err), + Y <- [{2,b}], + element(2, X) =:= element(1, Y)], + {join,merge}), + err = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- [{1,a},{'1b',b},{2,b}], + {Y,YY} <- [{a,1},{b,'1b'},{c,1}], + X == Y], + {join,merge}), + [{1,1},{'1b','1b'},{2,'1b'}] = qlc:e(Q)">>, + + <<"Q = qlc:q([{XX,YY} || + {XX,X} <- qlc_SUITE:table_error([{1,a},{'1b',b},{2,b}], + 2, err), + {Y,YY} <- [{a,1},{b,'1b'},{c,1}], + X == Y], + {join,merge}), + err = qlc:e(Q)">> + + ], + ?line run(Config, ETs), + + %% Mostly examples where temporary files are needed while merging. + FTs = [ + <<"L1 = [{Y,a} || Y <- lists:seq(1, 2)], + L2 = [{a,Y} || Y <- lists:seq(1, 10000)], + F = fun(J) -> + qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y], + {join,J}) + end, + Qm = F(merge), + Qn = F(nested_loop), + true = qlc:e(Qm,{max_list_size, 0}) =:= qlc:e(Qn)">>, + + <<"L1 = [{Y,a} || Y <- lists:seq(1, 2)], + L2 = [{a,Y} || Y <- lists:seq(1, 10000)], + Q = qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y], + {join,merge}), + {error,_,{file_error,_,_}} = + qlc:e(Q, [{max_list_size,64*1024},{tmpdir,\"/a/b/c\"}])">>, + + <<"L1 = qlc_SUITE:table_error([{1,a},{2,a}], 2, err), + L2 = [{a,Y} || Y <- lists:seq(1, 10000)], + F = fun(J) -> + qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y], + {join,J}) + end, + Qm = F(merge), + Qn = F(nested_loop), + err = qlc:e(Qm, {max_list_size,64*1024}), + err = qlc:e(Qn)">>, + + <<"L1 = [{Y,a} || Y <- lists:seq(1, 2)], + L2 = qlc_SUITE:table_error([{a,Y} || Y <- lists:seq(1, 10000)], + 1, err), + F = fun(J) -> + qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y], + {join,J}) + end, + Qm = F(merge), + Qn = F(nested_loop), + err = qlc:e(Qm, {max_list_size,64*1024}), + err = qlc:e(Qn)">>, + + <<"L1 = [{Y,a} || Y <- lists:seq(1, 2)] ++ + [{'1b',b},{2,b}] ++ [{Y,d} || Y <- lists:seq(1, 2)], + L2 = [{a,Y} || Y <- lists:seq(1, 10000)] ++ + [{b,'1b'}] ++ [{c,1}] ++ [{d,Y} || Y <- lists:seq(1, 10000)], + F = fun(J) -> + qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y], + {join,J}) + end, + Qm = F(merge), + Qn = F(nested_loop), + true = lists:sort(qlc:e(Qm, {max_list_size,64*1024})) =:= + lists:sort(qlc:e(Qn))">>, + + <<"F = fun(J) -> + qlc:q([{XX,YY} || + {XX,X} <- [{Y,a} || Y <- lists:seq(1, 2)], + {Y,YY} <- [{a,Y} || Y <- lists:seq(1,100000)], + X == Y], + {join,J}) + end, + Qm = F(merge), + Qn = F(nested_loop), + true = qlc:e(Qm, {max_list_size,64*1024}) =:= qlc:e(Qn)">>, + + %% More than one join in one QLC expression. + <<"L1 = [{Y,a} || Y <- lists:seq(1, 2)], + L2 = [{a,Y} || Y <- lists:seq(1, 10000)], + F = fun(J) -> + Q = qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y, + begin XX > 1 end, + begin YY > 9999 end], + {join,J}), + qlc:q([{XX1,YY1,XX2,YY2} || + {XX1,YY1} <- Q, + {XX2,YY2} <- Q]) + end, + Qm = F(merge), + Qn = F(nested_loop), + R1 = lists:sort(qlc:e(Qm, {max_list_size,64*1024})), + R2 = lists:sort(qlc:e(Qm, {max_list_size,1 bsl 31})), + true = R1 =:= lists:sort(qlc:e(Qn)), + true = R1 =:= R2">>, + + <<"L1 = [{Y,a} || Y <- lists:seq(1, 2)], + L2 = [{a,Y} || Y <- lists:seq(1, 10000)], + F = fun(J) -> + Q = qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y, + begin XX > 1 end, + begin YY > 9999 end], + {join,J}), + qlc:q([{XX1,YY1,XX2,YY2} || + {XX1,YY1} <- Q, + {XX2,YY2} <- Q, + throw(thrown)]) + end, + Qm = F(merge), + thrown = (catch {any_term, qlc:e(Qm, {max_list_size,64*1024})})">>, + + <<"%% Bigger than 64*1024. + T1 = {1, lists:seq(1, 20000)}, + L1 = [{a,T1},{b,T1}], + L2 = [{T1,a},{T1,b}], + F = fun(J) -> + qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y], + {join,J}) + end, + Qm = F(merge), + Qn = F(nested_loop), + R = [{a,a},{a,b},{b,a},{b,b}], + R = qlc:e(Qm, {max_list_size,64*1024}), + R = qlc:e(Qn)">>, + + <<"%% Bigger than 64*1024. No temporary files. + T1 = {1, lists:seq(1, 20000)}, + L1 = [{a,T1},{b,T1}], + L2 = [{T1,a},{T1,b}], + F = fun(J) -> + qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y], + {join,J}) + end, + Qm = F(merge), + Qn = F(nested_loop), + R = [{a,a},{a,b},{b,a},{b,b}], + R = qlc:e(Qm, {max_list_size,1 bsl 31}), + R = qlc:e(Qn)">> + + + ], + ?line run(Config, FTs), + + ok. + +join_sort(doc) -> + "Merge join optimizations (avoid unnecessary sorting)."; +join_sort(suite) -> []; +join_sort(Config) when is_list(Config) -> + Ts = [ + <<"H1_1 = qlc:keysort(1, [{1,2,3},{4,5,6}]), + H1 = qlc:q([X || X <- H1_1], unique), + H2 = qlc:keysort(2, [{1,2},{3,4}]), + H3 = qlc:q([{X,Y} || {X,_,_} <- H1, + {_,Y} <- H2, + X =:= Y]), + {1,0,0,2} = join_info(H3), + [{4,4}] = qlc:e(H3)">>, + + <<"H1_1 = qlc:keysort(1, [{1,2,3},{4,5,6}]), + H1 = qlc:q([X || X <- H1_1], unique), % keeps the order + H2 = qlc:keysort(2, [{1,2},{3,4}]), + H3 = qlc:q([{X,Y} || {X,_,_} <- H1, % no extra keysort + {Y,_} <- H2, % an extra keysort + X =:= Y]), + {1,0,0,3} = join_info(H3), + [{1,1}] = qlc:e(H3)">>, + + <<"H1_1 = qlc:keysort(1, [{1,2,3},{4,5,6}], {tmpdir,\"\"}), + H1 = qlc:q([X || X <- H1_1], unique), + H2 = qlc:keysort(2, [{1,2},{3,4}]), + H3 = qlc:q([{X,Y} || {_,X,_} <- H1, + {_,Y} <- H2, + X =:= Y]), + {1,0,0,3} = join_info(H3), + [{2,2}] = qlc:e(H3)">>, + + <<"H1_1 = qlc:keysort(1, [{1,2,3},{4,5,6}], {tmpdir,\"\"}), + H1 = qlc:q([X || X <- H1_1], unique), + H2 = qlc:keysort(2, [{1,2},{3,4}]), + H3 = qlc:q([{X,Y} || {_,X,_} <- H1, + {_,Y} <- H2, + X =:= Y]), + {1,0,0,3} = join_info(H3), + [{2,2}] = qlc:e(H3)">>, + + <<"H1 = qlc:sort([{1,a},{2,b},{3,c}]), + %% Since H1 is sorted it is also keysorted on the first column. + Q = qlc:q([{X, Y} || {X,_} <- H1, + {Y} <- [{0},{1},{2}], + X == Y]), + {1,0,0,1} = join_info(Q), + [{1,1},{2,2}] = qlc:e(Q)">>, + + <<"H1 = qlc:sort([{r,a,1},{r,b,2},{r,c,3}]), + Q = qlc:q([{X, Y} || {r,_,X} <- H1, % needs keysort(3) + {Y} <- [{0},{1},{2}], + X == Y]), + {1,0,0,2} = join_info(Q), + [{1,1},{2,2}] = qlc:e(Q)">>, + + <<"QH = qlc:q([X || X <- [{1,2,3},{4,5,6}], + Y <- qlc:sort([{1,2},{3,4}]), + element(1, X) =:= element(2, Y)]), + {1,0,0,2} = join_info_count(QH), + [{4,5,6}] = qlc:e(QH)">>, + + <<"H1_1 = qlc:keysort(1, [{1,2,3},{4,5,6},{1,2,3}]), + H1 = qlc:q([X || X <- H1_1], unique), + H2 = qlc:keysort(2, [{2,1},{3,4}]), + H3 = qlc:q([{X,Y} || {X,_,_} <- H1, + {_,Y} <- H2, + X =:= Y]), + H4 = qlc:keysort(1, [{1,2},{3,4},{4,a}]), + H5 = qlc:q([{X,Y} || {X,_} <- H4, + {_,Y} <- H3, + X =:= Y]), + {2,0,0,3} = join_info_count(H5), + [{1,1},{4,4}]= qlc:e(H5)">>, + + <<" + H1 = qlc:keysort(2, [{1,a,u},{2,b,k},{3,c,l}]), + H2 = qlc:q([{a,X,Y,a} || {1,X,u} <- H1, + {2,Y,k} <- H1]), + %% Neither H1 nor H2 need to be key-sorted + %% (the columns are constant). + H3 = qlc:q([{A,B,C,D,E,F,G,H} || + {A,B,C,D} <- H2, + {E,F,G,H} <- H2, + A =:= H], + {join,merge}), + {1,0,0,4} = join_info_count(H3), + [{a,a,b,a,a,a,b,a}] = qlc:e(H3)">>, + + <<"%% Q1 is sorted on X or Y. + Q1 = qlc:q([{X,Y} || + {X,_} <- qlc:keysort(1, [{1,a},{2,b}]), + {_,Y} <- qlc:keysort(2, [{aa,11},{bb,22}]), + X < Y]), + [{1,11},{1,22},{2,11},{2,22}] = qlc:e(Q1), + Q = qlc:q([{X,Y} || + {X,_} <- Q1, % no need to sort Q1 + {Y} <- [{0},{1},{2},{3}], + X =:= Y]), + {1,0,0,3} = join_info_count(Q), + [{1,1},{1,1},{2,2},{2,2}] = qlc:e(Q)">>, + + <<"H1 = qlc:keysort([2], [{r,1},{r,2},{r,3}]), + %% H1 is actually sorted, but this info is not captured. + Q = qlc:q([{X, Y} || {r,X} <- H1, + {Y} <- [{0},{1},{2}], + X == Y]), + {1,0,0,2} = join_info_count(Q), + [{1,1},{2,2}] = qlc:e(Q)">>, + + <<"%% Two leading constants columns and sorted objects + %% implies keysorted on column 3. + H1 = qlc:sort(qlc:q([{a,X,Y} || {X,Y} <- [{1,2},{2,3},{3,3}]])), + H2 = qlc:q([{X,Y} || + {a,3,X} <- H1, + {a,2,Y} <- H1, + X =:= Y]), + {1,0,0,0} = join_info_count(H2), + [{3,3}] = qlc:e(H2)">>, + + <<"QH = qlc:q([{X,Y} || {X,Y} <- [{1,4},{1,3}], + {Z} <- [{1}], + X =:= Z, (Y =:= 3) or (Y =:= 4)]), + {1,0,0,1} = join_info_count(QH), + [{1,4},{1,3}] = qlc:e(QH)">>, + + <<"E = ets:new(join, [ordered_set]), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + Q = qlc:q([{X, Y} || {X,_} <- ets:table(E), % no need to sort + {Y} <- [{0},{1},{2}], + X == Y], {join,merge}), + {1,0,0,1} = join_info(Q), + [{1,1},{2,2}] = qlc:e(Q), + ets:delete(E)">>, + + <<"H1 = qlc:sort([{r,1,a},{r,2,b},{r,3,c}]), + Q = qlc:q([{X, Y} || {r,X,_} <- H1, % does not need keysort(3) + {Y} <- [{0},{1},{2}], + X == Y]), + {1,0,0,1} = join_info(Q), + [{1,1},{2,2}] = qlc:e(Q)">>, + + <<"H1 = qlc:keysort(2,[{r,1},{r,2},{r,3}]), + H2 = [{a},{b}], + %% Several columns in different qualifiers have initial + %% constant columns. + H3 = qlc:keysort(1,[{c1,c2,1},{foo,bar,2},{c1,c2,3},{c1,c2,2}]), + Q = qlc:q([{r,X,Y,Z} || {r,X} <- H1, + {Y} <- H2, + {c1,c2,Z} <- H3, + X =:= Z], {join,merge}), + {1,0,0,3} = join_info(Q), + [{r,1,a,1},{r,1,b,1},{r,2,a,2},{r,2,b,2},{r,3,a,3},{r,3,b,3}] = + qlc:e(Q)">>, + + <<"H1 = qlc:keysort(2,[{r,1},{r,2},{r,3}]), + H2 = [{a},{b}], + %% As the last one, but one keysort less. + H3 = qlc:keysort(3,[{c1,c2,1},{foo,bar,2},{c1,c2,3},{c1,c2,2}]), + Q = qlc:q([{r,X,Y,Z} || {r,X} <- H1, + {Y} <- H2, + {c1,c2,Z} <- H3, + X =:= Z], {join,merge}), + {1,0,0,2} = join_info(Q), + [{r,1,a,1},{r,1,b,1},{r,2,a,2},{r,2,b,2},{r,3,a,3},{r,3,b,3}] = + qlc:e(Q)">>, + + <<"H1 = qlc:keysort(2,[{r,1},{r,2},{r,3}]), + H2 = [{a},{b}], + H3 = qlc:keysort(1,[{c1,c2,1},{foo,bar,2},{c1,c2,3},{c1,c2,2}]), + %% One generator before the joined generators. + Q = qlc:q([{r,X,Y,Z} || {Y} <- H2, + {r,X} <- H1, + {c1,c2,Z} <- H3, + X =:= Z], {join,merge}), + {1,0,0,3} = join_info(Q), + [{r,1,a,1},{r,2,a,2},{r,3,a,3},{r,1,b,1},{r,2,b,2},{r,3,b,3}] = + qlc:e(Q)">>, + + <<"H1 = [{a,1},{b,2},{c,3},{d,4}], + H2 = [{a},{b}], + H3 = [{c1,c2,a},{foo,bar,b},{c1,c2,c},{c1,c2,d}], + %% A couple of \"extra\" filters and generators. + Q = qlc:q([{X,Y,Z} || {X,_} <- H1, + {Y} <- H2, + X > Y, + {c1,c2,Z} <- H3, + {W} <- [{a},{b}], + W > a, + X =:= Z]), + {1,0,0,2} = join_info(Q), + [{c,a,c},{c,b,c},{d,a,d},{d,b,d}] = qlc:e(Q)">>, + + <<"H1 = qlc:keysort(2,[{r,1},{r,2},{r,3}]), + H2 = qlc:sort([{c1,c2,1},{foo,bar,2},{c1,c2,3},{c1,c2,2}]), + %% H2 is sorted, no keysort necessary. + %% This example shows that the 'filter-part' of the pattern + %% ({c1,c2,Z}) should be evaluated _before_ the join. + %% Otherwise the objects cannot be assumed to be keysort:ed on the + %% third column (if merge join), and lookup-join would lookup + %% more keys than necessary. + Q = qlc:q([{r,X,Z} || {r,X} <- H1, + {c1,c2,Z} <- H2, + X =:= Z] ,{join,merge}), + {1,0,0,1} = join_info(Q), + [{r,1,1},{r,2,2},{r,3,3}] = qlc:e(Q)">>, + + <<"H1 = [{1,a},{2,b},{3,c}], + H2 = [{0,0},{1,1},{2,2}], + H3 = qlc:q([{A,C,D} || + {A,_B} <- H1, + {C,D} <- H2, + A == D, C == D]), + H4 = [{1,1},{2,2},{3,3}], + H5 = qlc:q([{X,Y} || + {X,_,_} <- H3, % no need to sort this one (merge join) + {_,Y} <- H4, + X == Y]), + Q = qlc:q([{X,Y} || + {X,_} <- H5, % no need to sort this one + {Y,_} <- H4, + X == Y]), + {{3,0,0,4},{3,0,0,6}} = join_info(Q), + [{1,1},{2,2}] = qlc:e(Q)">>, + + <<"%% There is an extra test (_C1, element(1, X) =:= 1) that is not + %% necessary since the match spec does the same check. This can be + %% improved upon. + Q = qlc:q([{X,Y} || + X <- [{2},{1}], + element(1, X) =:= 1, + Y=_ <- [{2},{1}], + element(1, X) =:= element(1, Y)]), + {qlc,_, + [{generate,_,{qlc,_, + [{generate,_,{qlc,_, + [{generate,_,{list,{list,_},_}}, + _C1],[]}}, + {generate,_,{qlc,_, + [{generate,_,{list,[{2},{1}]}}, + _C2],[]}},_], + [{join,merge}]}},_],[]} = i(Q), + {1,0,0,0} = join_info_count(Q), + [{{1},{1}}] = qlc:e(Q)">>, + + <<"etsc(fun(E) -> + L = [{a,b,a},{c,d,b},{1,2,a},{3,4,b}], + Q = qlc:q([P1 || {X,2,Z}=P1 <- ets:table(E), + Y <- L, + X =:= 1, + Z =:= a, + P1 =:= Y, + X =:= element(1, Y)]), + {1,0,0,0} = join_info_count(Q), + [{1,2,a}] = qlc:e(Q) + end, [{1,2,a},{3,4,b}])">>, + + %% Merge join on Z and element(3, Y). No need to sort! + <<"etsc(fun(E) -> + L = [{a,b,a},{c,d,b},{1,2,a},{3,4,b}], + Q = qlc:q([P1 || {X,2,Z}=P1 <- ets:table(E), + Y <- L, + (X =:= 1) or (X =:= 2), + Z =:= a, + P1 =:= Y, + X =:= element(1, Y)]), + {1,0,0,0} = join_info_count(Q), + [{1,2,a}] = qlc:e(Q) + end, [{1,2,a},{3,4,b}])">>, + + <<"%% Y is constant as well as X. No keysort, which means that + %% Y must be filtered before merge join. + etsc(fun(E) -> + Q = qlc:q([X || {1,2}=X <- ets:table(E), + Y <- [{a,b},{c,d},{1,2},{3,4}], + X =:= Y, + element(1, X) =:= element(1, Y)]), + {1,0,0,0} = join_info_count(Q), + [{1,2}] = qlc:e(Q) + end, [{1,2},{3,4}])">> + + ], + ?line run(Config, Ts), + ok. + +join_complex(doc) -> + "Join of more than two columns."; +join_complex(suite) -> []; +join_complex(Config) when is_list(Config) -> + Ts = [{three, + <<"three() -> + L = [], + Q = qlc:q([{X,Y,Z} || {X,_} <- L, + {_,Y} <- L, + {Z,_} <- L, + X =:= Y, Y == Z + ]), + qlc:e(Q).">>, + [], + {warnings,[{3,qlc,too_complex_join}]}}, + + {two, + <<"two() -> + Q = qlc:q([{X,Y,Z,W} || + {X} <- [], + {Y} <- [], + {Z} <- [], + {W} <- [], + X =:= Y, + Z =:= W],{join,merge}), + qlc:e(Q).">>, + [], + {warnings,[{2,qlc,too_many_joins}]}} + ], + + ?line compile(Config, Ts), + + Ts2 = [{three, + <<"three() -> + L = [], + Q = qlc:q([{X,Y,Z} || {X,_} <- L, + {_,Y} <- L, + {Z,_} <- L, + X =:= Y, Y == Z + ]), + qlc:e(Q).">>, + [], + {[], + ["cannot handle join of three or more generators efficiently"]}}, + + {two, + <<"two() -> + Q = qlc:q([{X,Y,Z,W} || + {X} <- [], + {Y} <- [], + {Z} <- [], + {W} <- [], + X =:= Y, + Z =:= W],{join,merge}), + qlc:e(Q).">>, + [], + {[],["cannot handle more than one join efficiently"]}} + ], + + ?line compile_format(Config, Ts2), + + ok. + +tickets(suite) -> + [otp_5644, otp_5195, otp_6038_bug, otp_6359, otp_6562, otp_6590, + otp_6673, otp_6964, otp_7114, otp_7232, otp_7238, otp_7552, otp_6674, + otp_7714]. + +otp_5644(doc) -> + "OTP-5644. Handle the new language element M:F/A."; +otp_5644(suite) -> []; +otp_5644(Config) when is_list(Config) -> + Ts = [ + <<"Q = qlc:q([fun modul:mfa/0 || _ <- [1,2], + is_function(fun modul:mfa/0, 0)]), + [_,_] = qlc:eval(Q)">> + ], + + ?line run(Config, Ts), + ok. + +otp_5195(doc) -> + "OTP-5195. Allow traverse functions returning terms."; +otp_5195(suite) -> []; +otp_5195(Config) when is_list(Config) -> + %% Several minor improvements have been implemented in OTP-5195. + %% The test cases are spread all over... except these. + %% + %% Traverse functions returning terms. + + Ts = [<<"L = [1,2,3], + Err = {error,modul,err}, + H = qlc:q([X || X <- qlc_SUITE:table_error(L, Err)]), + Err = qlc:e(H)">>, + + <<"Err = {error,modul,err}, + TravFun = fun() -> Err end, + H1 = qlc:sort(qlc:q([X || X <- qlc:table(TravFun, [])])), + H = qlc:q([{X} || X <- H1]), + Err = qlc:e(H)">>, + + <<"L = [1,2,3], + Err = {error,modul,err}, + H = qlc:q([X || X <- qlc_SUITE:table_error(L, Err)]), + C = qlc:cursor(H), + R = qlc:next_answers(C, all_remaining), + qlc:delete_cursor(C), + Err = R">>, + + <<"L = [1,2,3], + Err = {error,modul,err}, + H = qlc:q([X || X <- qlc_SUITE:table_error(L, Err)]), + F = fun(Obj, A) -> A++[Obj] end, + Err = qlc:fold(F, [], H)">>, + + <<"Err = {error,modul,err}, + TravFun = fun() -> Err end, + H1 = qlc:sort(qlc:q([X || X <- qlc:table(TravFun, [])])), + H = qlc:q([{X} || X <- H1]), + F = fun(Obj, A) -> A++[Obj] end, + Err = qlc:fold(F, [], H)">>, + + <<"Q1 = qlc:append([qlc:append([ugly()]),[3]]), + Q = qlc:q([X || X <- Q1]), + 42 = qlc:e(Q), + ok. + + ugly() -> + [apa | fun() -> 42 end]. + foo() -> bar">>, + + <<"L = [1,2,3], + Err = {error,modul,err}, + H = qlc:q([X || X <- qlc_SUITE:table_error(L, Err)]), + H1 = qlc:q([X || X <- H], unique), + Err = qlc:e(H1)">>, + + <<"Err = {error, module, err}, + L = [1,2,3], + H1 = qlc:q([{X} || X <- qlc_SUITE:table_error(L, Err)]), + H = qlc:q([{X,Y,Z} || X <- H1, Y <- H1, Z <- L], cache), + qlc:e(H, cache_all)">>, + + <<"Err = {error, module, err}, + L = [1,2,3], + H1 = qlc:q([X || X <- qlc_SUITE:table_error(L, Err)]), + H = qlc:q([{X,Y,Z} || X <- H1, Y <- H1, Z <- L], cache), + qlc:e(H, [cache_all,unique_all])">>, + + <<"L = [{1},{2},{3}], + H = qlc:q([X || {X} <- qlc_SUITE:table_lookup_error(L), + X =:= 2]), + {error, lookup, failed} = qlc:e(H)">>, + + %% The traverse function can return any value, but it must not + %% return an improper list. Improper lists must not be given anyway. + <<"{'EXIT', {{badfun,a},_}} = + (catch qlc:e(qlc:q([{X} || X <- [1 | a], begin true end])))">> + + ], + + ?line run(Config, Ts), + + Ts2 = [<<"Q = qlc:q([{X,Y} || {X} <- [{1},{2},{3}], + begin + %% Used to generate a badly formed file + Y = 3, true + end, + X =:= Y]), + [{3,3}] = qlc:e(Q)">>], + ?line run(Config, Ts2), + + ok. + +otp_6038_bug(doc) -> + "OTP-6038. Bug fixes: unique and keysort; cache."; +otp_6038_bug(suite) -> []; +otp_6038_bug(Config) when is_list(Config) -> + %% The 'unique' option can no longer be merged with the keysort options. + %% This used to return [{1,a},{1,c},{2,b},{2,d}], but since + %% file_sorter:keysort now removes duplicates based on keys, the + %% correct return value is [{1,a},{2,b}]. + Ts = [<<"H1 = qlc:q([X || X <- [{1,a},{2,b},{1,c},{2,d}]], unique), + H2 = qlc:keysort(1, H1, [{unique,true}]), + [{1,a},{2,b}] = qlc:e(H2)">>], + + ?line run(Config, Ts), + + %% Sometimes the cache options did not empty the correct tables. + CTs = [ + <<"Options = [cache,unique], + V1 = qlc:q([{X,Y} || X <- [1,2], Y <- [3]], Options), + V2 = qlc:q([{X,Y} || X <- [a,b], Y <- V1]), + V3 = qlc:q([{X,Y} || X <- [5,6], Y <- [7]], Options), + Q = qlc:q([{X,Y} || X <- V2, Y <- V3]), + R = qlc:e(Q), + L1 = [{X,Y} || X <- [1,2], Y <- [3]], + L2 = [{X,Y} || X <- [a,b], Y <- L1], + L3 = [{X,Y} || X <- [5,6], Y <- [7]], + L = [{X,Y} || X <- L2, Y <- L3], + true = R =:= L">>, + <<"Options = [cache,unique], + V1 = qlc:q([{X,Y} || X <- [1,2], Y <- [3]], Options), + V2 = qlc:q([{X,Y} || X <- [a,b], Y <- V1]), + V3 = qlc:q([{X,Y} || X <- [5,6], Y <- [7]], Options), + V4 = qlc:q([{X,Y} || X <- V2, Y <- V3], Options), + Q = qlc:q([{X,Y} || X <- [1,2], Y <- V4]), + R = qlc:e(Q), + L1 = [{X,Y} || X <- [1,2], Y <- [3]], + L2 = [{X,Y} || X <- [a,b], Y <- L1], + L3 = [{X,Y} || X <- [5,6], Y <- [7]], + L4 = [{X,Y} || X <- L2, Y <- L3], + L = [{X,Y} || X <- [1,2], Y <- L4], + true = R =:= L">> + ], + ?line run(Config, CTs), + + ok. + +otp_6359(doc) -> + "OTP-6359. dets:select() never returns the empty list."; +otp_6359(suite) -> []; +otp_6359(Config) when is_list(Config) -> + dets:start(), + T = luna, + Fname = filename(T, Config), + + Ts = [ + [<<"T = luna, Fname = \"">>, Fname, <<"\", + {ok, _} = dets:open_file(T, [{file,Fname}]), + Q = qlc:q([F || + F <- dets:table(T), + (F band ((1 bsl 0)) =/= 0), + true]), + [] = qlc:eval(Q), + ok = dets:close(T), + file:delete(\"">>, Fname, <<"\"), + ok">>] + ], + + ?line run(Config, Ts), + ok. + +otp_6562(doc) -> + "OTP-6562. compressed = false (should be []) when sorting before join."; +otp_6562(suite) -> []; +otp_6562(Config) when is_list(Config) -> + Bug = [ + %% This example uses a file to sort E2 on the second column. It is + %% not easy to verify that this happens; the file_sorter module's + %% size option cannot be set in this case. But it is not likely + %% that the default size (512 KiB) will ever change, so it should + %% be future safe. + <<"E1 = create_ets(1, 10), + E2 = create_ets(5, 150000), + Q = qlc:q([{XX,YY} || + {X,XX} <- ets:table(E1), + {YY,Y} <- ets:table(E2), + X == Y], + {join,merge}), + [{5,5},{6,6},{7,7},{8,8},{9,9},{10,10}] = qlc:e(Q), + ets:delete(E1), + ets:delete(E2)">> + ], + ?line run(Config, Bug), + + Bits = [ + {otp_6562_1, + <<"otp_6562_1() -> + Q = qlc:q([X || <> <= <<\"hej\">>]), + qlc:info(Q). + ">>, + [], + {errors,[{2,qlc,binary_generator}], + []}} + ], + ?line [] = compile(Config, Bits), + + ?line R1 = {error,qlc,{1,qlc,binary_generator}} + = qlc:string_to_handle("[X || <> <= <<\"hej\">>]."), + ?line "1: cannot handle binary generators\n" = + lists:flatten(qlc:format_error(R1)), + + ok. + +otp_6590(doc) -> + "OTP-6590. Bug fix (join info)."; +otp_6590(suite) -> []; +otp_6590(Config) when is_list(Config) -> + Ts = [<<"fun(Tab1Value) -> + Q = qlc:q([T1#tab1.id || T1 <- [#tab1{id = id1, + value = v, + tab2_id = id}], + T2 <- [#tab2{id = id}], + T1#tab1.value =:= Tab1Value, + T1#tab1.tab2_id =:= T2#tab2.id]), + [id1] = qlc:e(Q) + end(v)">>], + + ?line run(Config, <<"-record(tab1, {id, tab2_id, value}). + -record(tab2, {id, value}).\n">>, Ts), + ok. + +otp_6673(doc) -> + "OTP-6673. Optimizations and fixes."; +otp_6673(suite) -> []; +otp_6673(Config) when is_list(Config) -> + Ts_PT = + [<<"etsc(fun(E1) -> + etsc(fun(E2) -> + Q = qlc:q([{A,B,C,D} || + {A,B} <- ets:table(E1), + {C,D} <- ets:table(E2), + A =:= 2, % lookup + B =:= D, % join + C =:= g]), % lookup invalidated by join + {qlc,_,[{generate,_, + {qlc,_, + [{generate,_, + {qlc,_,[{generate,_, + {keysort, + {list,{table,_}, + [{{'$1','$2'},[],['$_']}]}, + 2,[]}},_],[]}}, + {generate,_,{qlc,_, + [{generate,_, + {keysort,{table,_},2,[]}}], + []}},_], + [{join,merge}]}},_,_],[]} = i(Q), + [{2,y,g,y}] = qlc:e(Q) + end, [{f,x},{g,y},{h,z}]) + end, + [{1,x},{2,y},{3,z}])">>, + <<"etsc(fun(E1) -> + etsc(fun(E2) -> + Q = qlc:q([{A,B,C,D} || + {A,B} <- ets:table(E1), + {C,D} <- ets:table(E2), + A =:= 2, % lookup + C =:= g, % lookup + B =:= D]), % join + {qlc,_,[{generate,_, + {qlc,_, + [{generate,_, + {qlc,_,[{generate,_, + {keysort, + {list,{table,_}, + [{{'$1','$2'},[],['$_']}]}, + 2,[]}},_],[]}}, + {generate,_,{qlc,_, + [{generate,_, + {keysort, + {list,{table,_}, + [{{'$1','$2'},[],['$_']}]}, + 2,[]}},_],[]}},_], + [{join,merge}]}},_],[]} = i(Q), + [{2,y,g,y}] = qlc:e(Q) + end, [{f,x},{g,y},{h,z}]) + end, + [{1,x},{2,y},{3,z}])">>], + + ?line run(Config, Ts_PT), + + MS = ets:fun2ms(fun({X,_Y}=T) when X > 1 -> T end), + Ts_RT = [ + [<<"%% Explicit match-spec. ets:table() ensures there is no lookup + %% function, which means that lookup join will not be considered. + MS = ">>, io_lib:format("~w", [MS]), <<", + etsc(fun(E) -> + F = fun(J) -> + qlc:q([{X,W} || + {X,_Y} <- + ets:table(E,{traverse, + {select,MS}}), + {Z,W} <- [{1,1},{2,2},{3,3}], + X =:= Z], {join,J}) + end, + Qm = F(any), + [{2,2},{3,3}] = qlc:e(Qm), + {'EXIT',{cannot_carry_out_join,_}} = + (catch qlc:e(F(lookup))) + end, [{1,a},{2,b},{3,c}])">>], + + <<"%% The filter 'A =< y' can be evaluated by traversing E1 using a + %% match specification, but then lookup join cannot use E1 for + %% looking up keys. This example shows that the filter is kept if + %% lookup join is employed (otherwise it is optimized away since + %% the match spec is used). + etsc(fun(E1) -> + Q = qlc:q([{A,B,C,D} || + {A,B} <- ets:table(E1), + {C,D} <- [{x,f},{y,g},{z,h}], + A =< y, % kept + A =:= C], {join,lookup}), + [{x,1,x,f},{y,2,y,g}] = lists:sort(qlc:e(Q)) + end, [{x,1},{y,2},{z,3}])">> + + ], + ?line run(Config, Ts_RT), + + %% Ulf Wiger provided a patch that makes QLC work with packages: + Dir = filename:join(?privdir, "p"), + ?line ok = filelib:ensure_dir(filename:join(Dir, ".")), + File = filename:join(Dir, "p.erl"), + ?line ok = file:write_file(File, + <<"-module(p.p).\n" + "-export([q/0]).\n" + "-include_lib(\"stdlib/include/qlc.hrl\").\n" + "q() ->\n" + " .qlc:q([X || X <- [1,2]]).">>), + ?line {ok, 'p.p'} = compile:file(File, [{outdir,Dir}]), + ?line code:purge('p.p'), + ?line {module, 'p.p'} = code:load_abs(filename:rootname(File), 'p.p'), + ?line [1,2] = qlc:e(p.p:q()), + + ok. + +otp_6964(doc) -> + "OTP-6964. New option 'tmpdir_usage'."; +otp_6964(suite) -> []; +otp_6964(Config) when is_list(Config) -> + T1 = [ + <<"Q1 = qlc:q([{X} || X <- [1,2]]), + {'EXIT', {badarg,_}} = (catch qlc:e(Q1, {tmpdir_usage,bad})), + %% merge join + F = fun(Use) -> + L1 = [{Y,a} || Y <- lists:seq(1, 2)], + L2 = [{a,Y} || Y <- lists:seq(1, 10000)], + Q = qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y], + {join,merge}), + qlc:e(Q, [{max_list_size,64*1024},{tmpdir_usage,Use}]) + end, + D = erlang:system_flag(backtrace_depth, 0), + 20000 = length(F(allowed)), + ErrReply = F(not_allowed), + {error, qlc, {tmpdir_usage,joining}} = ErrReply, + \"temporary file was needed for joining\n\" = + lists:flatten(qlc:format_error(ErrReply)), + qlc_SUITE:install_error_logger(), + 20000 = length(F(warning_msg)), + {error, joining} = qlc_SUITE:read_error_logger(), + 20000 = length(F(info_msg)), + {info, joining} = qlc_SUITE:read_error_logger(), + 20000 = length(F(error_msg)), + {error, joining} = qlc_SUITE:read_error_logger(), + _ = erlang:system_flag(backtrace_depth, D), + qlc_SUITE:uninstall_error_logger()">>], + ?line run(Config, T1), + + T2 = [ + <<"%% File sorter. + T = lists:seq(1, 10000), + Q0 = qlc:q([{X} || X <- [T,T,T], begin X > 0 end], + [{cache,list},unique]), + Q1 = qlc:q([{X,Y,Z} || + X <- Q0, + Y <- Q0, + Z <- Q0], + [{cache,list},unique]), + Q = qlc:q([{X, Y} || Y <- [1], X <- Q1]), + F = fun(Use) -> + qlc:e(Q, [{max_list_size,10000},{tmpdir_usage,Use}]) + end, + 1 = length(F(allowed)), + ErrReply = F(not_allowed), + {error, qlc, {tmpdir_usage,caching}} = ErrReply, + \"temporary file was needed for caching\n\" = + lists:flatten(qlc:format_error(ErrReply)), + qlc_SUITE:install_error_logger(), + 1 = length(F(error_msg)), + {error, caching} = qlc_SUITE:read_error_logger(), + {error, caching} = qlc_SUITE:read_error_logger(), + 1 = length(F(warning_msg)), + {error, caching} = qlc_SUITE:read_error_logger(), + {error, caching} = qlc_SUITE:read_error_logger(), + 1 = length(F(info_msg)), + {info, caching} = qlc_SUITE:read_error_logger(), + {info, caching} = qlc_SUITE:read_error_logger(), + qlc_SUITE:uninstall_error_logger()">>], + + ?line run(Config, T2), + + T3 = [ + <<"%% sort/keysort + E1 = create_ets(1, 10), + E2 = create_ets(5, 50000), + Q = qlc:q([{XX,YY} || + {X,XX} <- ets:table(E1), + {YY,Y} <- ets:table(E2), + X == Y], + {join,merge}), + F = fun(Use) -> + qlc:e(Q, {tmpdir_usage,Use}) + end, + ErrReply = F(not_allowed), + {error,qlc,{tmpdir_usage,sorting}} = ErrReply, + \"temporary file was needed for sorting\n\" = + lists:flatten(qlc:format_error(ErrReply)), + qlc_SUITE:install_error_logger(), + L = [{5,5},{6,6},{7,7},{8,8},{9,9},{10,10}], + L = F(allowed), + L = F(error_msg), + {error, sorting} = qlc_SUITE:read_error_logger(), + L = F(info_msg), + {info, sorting} = qlc_SUITE:read_error_logger(), + L = F(warning_msg), + {error, sorting} = qlc_SUITE:read_error_logger(), + qlc_SUITE:uninstall_error_logger(), + ets:delete(E1), + ets:delete(E2)">>], + ?line run(Config, T3), + + T4 = [ + <<"%% cache list + etsc(fun(E) -> + Q0 = qlc:q([X || X <- ets:table(E), + begin element(1, X) > 5 end], + {cache,list}), + Q = qlc:q([{X, element(1,Y)} || X <- lists:seq(1, 5), + Y <- Q0]), + R = [{X,Y} || X <- lists:seq(1, 5), + Y <- lists:seq(6, 10)], + F = fun(Use) -> + qlc:e(Q, [{max_list_size, 100*1024}, + {tmpdir_usage, Use}]) + end, + R = lists:sort(F(allowed)), + qlc_SUITE:install_error_logger(), + R = lists:sort(F(info_msg)), + {info, caching} = qlc_SUITE:read_error_logger(), + R = lists:sort(F(error_msg)), + {error, caching} = qlc_SUITE:read_error_logger(), + R = lists:sort(F(warning_msg)), + {error, caching} = qlc_SUITE:read_error_logger(), + qlc_SUITE:uninstall_error_logger(), + ErrReply = F(not_allowed), + {error,qlc,{tmpdir_usage,caching}} = ErrReply, + \"temporary file was needed for caching\n\" = + lists:flatten(qlc:format_error(ErrReply)) + end, [{keypos,1}], [{I,a,lists:duplicate(100000,1)} || + I <- lists:seq(1, 10)])">>], + ?line run(Config, T4), + ok. + +otp_7238(doc) -> + "OTP-7238. info-option 'depth', &c."; +otp_7238(suite) -> []; +otp_7238(Config) when is_list(Config) -> + dets:start(), + T = otp_7238, + Fname = filename(T, Config), + + ?line ok = compile_gb_table(Config), + + %% A few more warnings. + T1 = [ + %% The same error message string, but with different tags + %% (the strings are not compared :-( + {nomatch_1, + <<"nomatch_1() -> + {qlc:q([X || X={X} <- []]), [t || \"a\"=\"b\" <- []]}.">>, + [], + {warnings,[{{2,30},qlc,nomatch_pattern}, + {{2,44},v3_core,nomatch}]}}, + + %% Not found by qlc... + {nomatch_2, + <<"nomatch_2() -> + qlc:q([t || {\"a\"++\"b\"} = {\"ac\"} <- []]).">>, + [], + {warnings,[{{2,22},v3_core,nomatch}]}}, + + {nomatch_3, + <<"nomatch_3() -> + qlc:q([t || [$a, $b] = \"ba\" <- []]).">>, + [], + {warnings,[{{2,37},qlc,nomatch_pattern}]}}, + + %% Not found by qlc... + {nomatch_4, + <<"nomatch_4() -> + qlc:q([t || \"a\"++_=\"b\" <- []]).">>, + [], + {warnings,[{{2,22},v3_core,nomatch}]}}, + + %% Found neither by the compiler nor by qlc... + {nomatch_5, + <<"nomatch_5() -> + qlc:q([X || X = <> <- [3]]).">>, + [], + []}, + + {nomatch_6, + <<"nomatch_6() -> + qlc:q([X || X <- [], + X =:= {X}]).">>, + [], + {warnings,[{{3,30},qlc,nomatch_filter}]}}, + + {nomatch_7, + <<"nomatch_7() -> + qlc:q([X || {X=Y,{Y}=X} <- []]).">>, + [], + {warnings,[{{2,28},qlc,nomatch_pattern}]}}, + + {nomatch_8, + <<"nomatch_8() -> + qlc:q([X || {X={},X=[]} <- []]).">>, + [], + {warnings,[{{2,28},qlc,nomatch_pattern}]}}, + + {nomatch_9, + <<"nomatch_9() -> + qlc:q([X || X <- [], X =:= {}, X =:= []]).">>, + [], + {warnings,[{{2,49},qlc,nomatch_filter}]}}, + + {nomatch_10, + <<"nomatch_10() -> + qlc:q([X || X <- [], + ((X =:= 1) or (X =:= 2)) and (X =:= 3)]).">>, + [], + {warnings,[{{3,53},qlc,nomatch_filter}]}}, + + {nomatch_11, + <<"nomatch_11() -> + qlc:q([X || X <- [], x =:= []]).">>, + [], + {warnings,[{{2,39},qlc,nomatch_filter}]}}, + + {nomatch_12, + <<"nomatch_12() -> + qlc:q([X || X={} <- [], X =:= []]).">>, + [], + {warnings,[{{2,42},qlc,nomatch_filter}]}}, + + {nomatch_13, + <<"nomatch_13() -> + qlc:q([Z || Z <- [], + X={X} <- [], + Y={Y} <- []]).">>, + [], + {warnings,[{{3,29},qlc,nomatch_pattern}, + {{4,29},qlc,nomatch_pattern}]}}, + + {nomatch_14, + <<"nomatch_14() -> + qlc:q([X || X={X} <- [], + 1 > 0, + 1 > X]).">>, + [], + {warnings,[{{2,29},qlc,nomatch_pattern}]}}, + + {nomatch_15, + <<"nomatch_15() -> + qlc:q([{X,Y} || X={X} <- [1], + Y <- [1], + 1 > 0, + 1 > X]).">>, + [], + {warnings,[{{2,32},qlc,nomatch_pattern}]}}, + + %% Template warning. + {nomatch_template1, + <<"nomatch_template1() -> + qlc:q([{X} = {} || X <- []]).">>, + [], + {warnings,[{2,sys_core_fold,no_clause_match}]}} + ], + ?line [] = compile(Config, T1), + + %% 'depth' is a new option used by info() + T2 = [ + %% Firstly: lists + <<"L = [[a,b,c],{a,b,c},[],<<\"foobar\">>], + Q = qlc:q([{X} || X <- L]), + {call, _, + {remote,_,{atom,_,ets},{atom,_,match_spec_run}}, + [{cons,_,{atom,_,'...'}, + {cons,_,{atom,_,'...'}, + {cons,_,{nil,_},{cons,_,{atom,_,'...'},{nil,_}}}}}, + _]} = qlc:info(Q, [{format,abstract_code},{depth,0}]), + + {call,_,_, + [{cons,_,{cons,_,{atom,_,'...'},{nil,_}}, + {cons,_, + {tuple,_,[{atom,_,'...'}]}, + {cons,_,{nil,_}, + {cons,_, + {bin,_, + [{_,_,{_,_,$.},_,_}, + {_,_,{_,_,$.},_,_}, + {_,_,{_,_,$.},_,_}]}, + {nil,_}}}}}, + _]} = qlc:info(Q, [{format,abstract_code},{depth,1}]), + + {call,_, + _, + [{cons,_,{cons,_,{atom,_,a},{atom,_,'...'}}, + {cons,_, + {tuple,_,[{atom,_,a},{atom,_,'...'}]}, + {cons,_,{nil,_}, + {cons,_, + {bin,_, + [{_,_,{_,_,$f},_,_}, + {_,_,{_,_,$.},_,_}, + {_,_,{_,_,$.},_,_}, + {_,_,{_,_,$.},_,_}]}, + {nil,_}}}}}, + _]} = qlc:info(Q, [{format,abstract_code},{depth,2}]), + + {call,_,_, + [{cons,_, + {cons,_,{atom,_,a},{cons,_,{atom,_,b},{atom,_,'...'}}}, + {cons,_, + {tuple,_,[{atom,_,a},{atom,_,b},{atom,_,'...'}]}, + {cons,_,{nil,_}, + {cons,_, + {bin,_, + [{_,_,{_,_,$f},_,_}, + {_,_,{_,_,$o},_,_},_,_,_]}, + {nil,_}}}}}, + _]} = qlc:info(Q, [{format,abstract_code},{depth,3}]), + + {call,_,_, + [{cons,_, + {cons,_, + {atom,_,a},{cons,_,{atom,_,b},{cons,_,{atom,_,c},{nil,_}}}}, + {cons,_, + {tuple,_,[{atom,_,a},{atom,_,b},{atom,_,c}]}, + {cons,_,{nil,_}, + {cons,_, + {bin,_, + [{_,_,{_,_,$f},_,_}, + {_,_,{_,_,$o},_,_}, + {_,_,{_,_,$o},_,_}, + {_,_,{_,_,$b},_,_}, + {_,_,{_,_,$a},_,_}, + {_,_,{_,_,$r},_,_}]}, + {nil,_}}}}}, + _]} = qlc:info(Q, [{format,abstract_code},{depth,10}]), + + {call,_,_, + [{cons,_, + {cons,_, + {atom,_,a},{cons,_,{atom,_,b},{cons,_,{atom,_,c},{nil,_}}}}, + {cons,_, + {tuple,_,[{atom,_,a},{atom,_,b},{atom,_,c}]}, + {cons,_,{nil,_}, + {cons,_, + {bin,_, + [{_,_,{_,_,$f},_,_}, + {_,_,{_,_,$o},_,_}, + {_,_,{_,_,$o},_,_}, + {_,_,{_,_,$b},_,_}, + {_,_,{_,_,$a},_,_}, + {_,_,{_,_,$r},_,_}]}, + {nil,_}}}}}, + _]} = qlc:info(Q, [{format,abstract_code},{depth,infinity}])">>, + + %% Secondly: looked up keys + <<"F = fun(D) -> + etsc(fun(E) -> + Q = qlc:q([C || {N,C} <- ets:table(E), + (N =:= {2,2}) or (N =:= {3,3})]), + F = qlc:info(Q, [{format,abstract_code},{depth,D}]), + {call,_,_,[{call,_,_,[_Fun,Values]},_]} = F, + [b,c] = lists:sort(qlc:eval(Q)), + Values + end, [{{1,1},a},{{2,2},b},{{3,3},c},{{4,4},d}]) + end, + + [{cons,_,{atom,_,'...'},{cons,_,{atom,_,'...'},{nil,_}}}, + {cons,_, + {tuple,_,[{atom,_,'...'}]}, + {cons,_,{tuple,_,[{atom,_,'...'}]},{nil,_}}}, + {cons,_, + {tuple,_,[{integer,_,2},{atom,_,'...'}]}, + {cons,_,{tuple,_,[{integer,_,3},{atom,_,'...'}]},{nil,_}}}, + {cons,_, + {tuple,_,[{integer,_,2},{integer,_,2}]}, + {cons,_,{tuple,_,[{integer,_,3},{integer,_,3}]},{nil,_}}}, + {cons,_, + {tuple,_,[{integer,_,2},{integer,_,2}]}, + {cons,_,{tuple,_,[{integer,_,3},{integer,_,3}]},{nil,_}}}] = + lists:map(F, [0,1,2,3,infinity])">>, + [<<"T = otp_7238, Fname = \"">>, Fname, <<"\", + {ok, _} = dets:open_file(T, [{file,Fname}]), + ok = dets:insert(T, [{{1,1},a},{{2,2},b},{{3,3},c},{{4,4},d}]), + Q = qlc:q([C || {N,C} <- dets:table(T), + (N =:= {2,2}) or (N =:= {3,3})]), + F = qlc:info(Q, [{format,abstract_code},{depth,1}]), + [b,c] = lists:sort(qlc:eval(Q)), + {call,_,_, + [{call,_,_, + [_, + {cons,_, + {tuple,_,[{atom,_,'...'}]}, + {cons,_,{tuple,_,[{atom,_,'...'}]},{nil,_}}}]}, + _]} = F, + ok = dets:close(T), + file:delete(\"">>, Fname, <<"\")">>], + + %% Thirdly: format_fun has been extended (in particular: gb_table) + <<"T = gb_trees:from_orddict([{{1,a},w},{{2,b},v},{{3,c},u}]), + QH = qlc:q([X || {{X,Y},_} <- gb_table:table(T), + ((X =:= 1) or (X =:= 2)), + ((Y =:= a) or (Y =:= b) or (Y =:= c))]), + {call,_,_, + [{call,_,_, + [{'fun',_, + {clauses, + [{clause,_,_,[], + [{'case',_, + {call,_,_, + [_, + {call,_,_, + [{cons,_, + {tuple,_,[{atom,_,'...'}]}, + {cons,_, + {tuple,_,[{atom,_,'...'}]}, + {cons,_,{tuple,_,[{atom,_,'...'}]},{nil,_}}}}]}]}, + [_,_]}]}]}}, + {cons,_, + {tuple,_,[{atom,_,'...'}]}, + {cons,_, + {tuple,_,[{atom,_,'...'}]}, + {cons,_, + {tuple,_,[{atom,_,'...'}]}, + {cons,_, + {tuple,_,[{atom,_,'...'}]}, + {cons,_, + {tuple,_,[{atom,_,'...'}]}, + {cons,_,{tuple,_,[{atom,_,'...'}]},{nil,_}}}}}}}]}, + {call,_,_, + [{cons,_,{tuple,_,[{atom,_,'...'}]},{nil,_}}]}]} = + qlc:info(QH, [{format,abstract_code},{depth,1}])">>, + <<"T1 = [{1,1,a},{2,2,b},{3,3,c},{4,4,d}], + T2 = [{x,1},{y,1},{z,2}], + QH1 = T1, + T = gb_trees:from_orddict(T2), + QH2 = qlc:q([X || {_,X} <- gb_table:table(T)], cache), + Q = qlc:q([{X1,X2,X3} || {X1,X2,X3} <- QH1, + Y2 <- QH2, + X2 =:= Y2]), + {block,_, + [{match,_,_, + {call,_,_, + [{lc,_,_, + [{generate,_,_, + {call,_,_, + [{call,_,_, + [{cons,_, + {tuple,_,[{atom,_,'...'}]}, + {atom,_,'...'}}]}]}}]}, + _]}}, + {call,_,_, + [{lc,_,_, + [{generate,_,_, + {cons,_,{tuple,_,[{atom,_,'...'}]},{atom,_,'...'}}}, + _,_]}]}]} = + qlc:info(Q, [{format,abstract_code},{depth, 1}, + {n_elements,1}])">>, + <<"L = [{{key,1},a},{{key,2},b},{{key,3},c}], + T = gb_trees:from_orddict(orddict:from_list(L)), + Q = qlc:q([K || {K,_} <- gb_table:table(T), + (K =:= {key,1}) or (K =:= {key,2})]), +{call,_,_, + [{call,_,_, + [{'fun',_, + {clauses, + [{clause,_,_,[], + [{'case',_, + {call,_,_, + [_, + {call,_,_, + [{cons,_, + {tuple,_,[{tuple,_,[{atom,_,'...'}]},{atom,_,'...'}]}, + {cons,_, + {tuple,_,[{tuple,_,[{atom,_,'...'}]},{atom,_,'...'}]}, + {cons,_, + {tuple,_,[{tuple,_,[{atom,_,'...'}]},{atom,_,'...'}]}, + {nil,_}}}}]}]}, + _}]}]}}, + {cons,_, + {tuple,_,[{atom,_,key},{atom,_,'...'}]}, + {cons,_,{tuple,_,[{atom,_,key},{atom,_,'...'}]},{nil,_}}}]}, + {call,_, + {remote,_,{atom,_,ets},{atom,_,match_spec_compile}}, + [{cons,_, + {tuple,_,[{tuple,_,[{atom,_,'...'}]},{atom,_,'...'}]}, + {nil,_}}]}]} = + qlc:info(Q, [{format,abstract_code},{depth, 2}])">> + + ], + ?line run(Config, T2), + + T3 = [ + {nomatch_6, + <<"nomatch_6() -> + qlc:q([X || X <- [], + X =:= {X}]).">>, + [], + {[],["filter evaluates to 'false'"]}}, + + {nomatch_7, + <<"nomatch_7() -> + qlc:q([X || {X=Y,{Y}=X} <- []]).">>, + [], + {[],["pattern cannot possibly match"]}}], + ?line compile_format(Config, T3), + + %% *Very* simple test - just check that it doesn't crash. + Type = [{cres, + <<"Q = qlc:q([X || {X} <- []]), + {'EXIT',{{badfun,_},_}} = (catch qlc:e(Q))">>, + [type_checker], + []}], + ?line run(Config, Type), + + ok. + +otp_7114(doc) -> + "OTP-7114. Match spec, table and duplicated objects.."; +otp_7114(suite) -> []; +otp_7114(Config) when is_list(Config) -> + Ts = [<<"T = ets:new(t, [bag]), + [ets:insert(T, {t, I, I div 2}) || I <- lists:seq(1,10)], + Q1 = qlc:q([element(3, E) || E <- ets:table(T)]), + [0,1,1,2,2,3,3,4,4,5] = lists:sort(qlc:e(Q1)), + [0,1,2,3,4,5] = qlc:e(Q1, unique_all), + [0,1,2,3,4,5] = qlc:e(qlc:sort(Q1), unique_all), + [0,1,2,3,4,5] = qlc:e(qlc:sort(qlc:e(Q1)), unique_all), + ets:delete(T), + ok">>], + ?line run(Config, Ts). + +otp_7232(doc) -> + "OTP-7232. qlc:info() bug (pids, ports, refs, funs)."; +otp_7232(suite) -> []; +otp_7232(Config) when is_list(Config) -> + Ts = [<<"L = [fun math:sqrt/1, list_to_pid(\"<0.4.1>\"), + erlang:make_ref()], + \"[fun math:sqrt/1,<0.4.1>,#Ref<\" ++ _ = qlc:info(L), + {call,_, + {remote,_,{atom,_,qlc},{atom,_,sort}}, + [{cons,_, + {'fun',_,{function,math,sqrt,_}}, + {cons,_, + {string,_,\"<0.4.1>\"}, % could use list_to_pid.. + {cons,_,{string,_,\"#Ref<\"++_},{nil,_}}}}, + {nil,_}]} = + qlc:info(qlc:sort(L),{format,abstract_code})">>, + + <<"Q1 = qlc:q([X || X <- [1000,2000]]), + Q = qlc:sort(Q1, {order, fun(A,B)-> A>B end}), + \"qlc:sort([1000,2000],[{order,fun'-function/0-fun-2-'/2}])\" = + format_info(Q, true), + AC = qlc:info(Q, {format, abstract_code}), + \"qlc:sort([1000,2000], [{order,fun '-function/0-fun-2-'/2}])\" = + binary_to_list(iolist_to_binary(erl_pp:expr(AC)))">>, + + %% OTP-7234. erl_parse:abstract() handles bit strings + <<"Q = qlc:sort([<<17:9>>]), + \"[<<8,1:1>>]\" = qlc:info(Q)">> + + ], + ?line run(Config, Ts). + +otp_7552(doc) -> + "OTP-7552. Merge join bug."; +otp_7552(suite) -> []; +otp_7552(Config) when is_list(Config) -> + %% The poor performance cannot be observed unless the + %% (redundant) join filter is skipped. + Ts = [<<"Few = lists:seq(1, 2), + Many = lists:seq(1, 10), + S = [d,e], + L1 = [{Y,a} || Y <- Few] ++ [{'1b',b},{2,b}] ++ + [{Y,X} || X <- S, Y <- Few], + L2 = [{a,Y} || Y <- Many] ++ + [{b,'1b'}] ++ [{c,1}] ++ + [{X,Y} || X <- S, Y <- Many], + F = fun(J) -> + qlc:q([{XX,YY} || + {XX,X} <- L1, + {Y,YY} <- L2, + X == Y], + {join,J}) + end, + Qm = F(merge), + Qn = F(nested_loop), + true = lists:sort(qlc:e(Qm, {max_list_size,20})) =:= + lists:sort(qlc:e(Qn))">>], + ?line run(Config, Ts). + +otp_7714(doc) -> + "OTP-7714. Merge join bug."; +otp_7714(suite) -> []; +otp_7714(Config) when is_list(Config) -> + %% The original example uses Mnesia. This one does not. + Ts = [<<"E1 = ets:new(set,[]), + true = ets:insert(E1, {a,1}), + E2 = ets:new(set,[]), + _ = [true = ets:insert(E2, {I, 1}) || + I <- lists:seq(1, 3)], + Q = qlc:q([{A,B} || + {A,I1} <- ets:table(E1), + {B,I2} <- ets:table(E2), + I1 =:= I2],{join,merge}), + [{a,1},{a,2},{a,3}] = qlc:e(Q), + ets:delete(E1), + ets:delete(E2)">>], + ?line run(Config, Ts). + +otp_6674(doc) -> + "OTP-6674. match/comparison."; +otp_6674(suite) -> []; +otp_6674(Config) when is_list(Config) -> + + ?line ok = compile_gb_table(Config), + + Ts = [%% lookup join + <<"E = ets:new(join, [ordered_set]), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + Q = qlc:q([{X, Y} || {X,_} <- ets:table(E), + {Y} <- [{0},{1},{2}], + X == Y]), + {0,1,0,0} = join_info(Q), + [{1,1},{2,2}] = qlc:e(Q), + ets:delete(E)">>, + + <<"E = ets:new(join, [ordered_set]), + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + Q = qlc:q([{X, Y} || {X,_} <- ets:table(E), + {Y} <- [{0},{1},{2}], + X =:= Y]), + {0,1,0,0} = join_info(Q), + {block,_, + [_, + {match,_,_, + {call,_,_, + [{lc,_,_, + [_,_,{op,_,'==',_,_}]}, + {cons,_, + {tuple,_,[{atom,_,join},{atom,_,lookup}]},_}]}}, + _]} = qlc:info(Q, {format, abstract_code}), + [{1,1},{2,2}] = qlc:e(Q), + ets:delete(E)">>, + + <<"E = ets:new(join, [set]), + Q = qlc:q([{X, Y} || {X,_} <- ets:table(E), + {Y} <- [{0},{1},{2}], + X == Y], {join, lookup}), + {'EXIT',{cannot_carry_out_join,_}} = (catch qlc:e(Q)), + ets:delete(E)">>, + + %% Lookup join possible in both directions. + <<"E1 = ets:new(join, [ordered_set]), + E2 = ets:new(join, [set]), + true = ets:insert(E1, [{1.0,a},{2,b},{3,c}]), + true = ets:insert(E2, [{0},{1},{2}]), + Q = qlc:q([{X, Y} || {X,_} <- ets:table(E1), + {Y} <- ets:table(E2), + X == Y],{join,lookup}), % skipped + {qlc,_, + [{generate,_, + {qlc,_, + [{generate,_, + {qlc,_,[{generate,_,{table,{ets,table,[_]}}}],[]}}, + {generate,_,{table,{ets,table,[_]}}}, + _], + [{join,lookup}]}}], + []} = qlc:info(Q, {format,debug}), + {0,1,0,0} = join_info(Q), + [{1.0,1},{2,2}] = qlc:e(Q), + ets:delete(E1), + ets:delete(E2)">>, + <<"E1 = ets:new(join, [ordered_set]), + E2 = ets:new(join, [set]), + true = ets:insert(E1, [{1.0,a},{2,b},{3,c}]), + true = ets:insert(E2, [{0},{1},{2}]), + Q = qlc:q([{X, Y} || {X,_} <- ets:table(E1), + {Y} <- ets:table(E2), + X =:= Y],{join,merge}), % not skipped + {1,0,0,1} = join_info(Q), + [{2,2}] = qlc:e(Q), + ets:delete(E1), + ets:delete(E2)">>, + <<"E1 = ets:new(join, [ordered_set]), + E2 = ets:new(join, [set]), + true = ets:insert(E1, [{1.0,a},{2,b},{3,c}]), + true = ets:insert(E2, [{0},{1},{2}]), + Q = qlc:q([{X, Y} || {X,_} <- ets:table(E1), + {Y} <- ets:table(E2), + X =:= Y],{join,lookup}), % skipped + {qlc,_, + [{generate,_, + {qlc,_, + [{generate,_, + {qlc,_, + [{generate,_,{table,{ets,table,[_]}}}], + []}}, + {generate,_,{table,{ets,table,[_]}}}, + _], + [{join,lookup}]}}], + []} = qlc:info(Q, {format,debug}), + {0,1,0,0} = join_info(Q), + [{2,2}] = qlc:e(Q), + ets:delete(E1), + ets:delete(E2)">>, + <<"E1 = ets:new(join, [ordered_set]), + E2 = ets:new(join, [set]), + true = ets:insert(E1, [{1.0,a},{2,b},{3,c}]), + true = ets:insert(E2, [{0},{1},{2}]), + Q = qlc:q([{X, Y} || {X,_} <- ets:table(E1), + {Y} <- ets:table(E2), + %% Independent of term comparison: + X =:= Y, X == Y]), + {0,1,0,0} = join_info(Q), + [{2,2}] = qlc:e(Q), + ets:delete(E1), + ets:delete(E2)">>, + + <<"E = ets:new(join, [ordered_set]), + true = ets:insert(E, [{1,1},{2,2},{3,c}]), + Q = qlc:q([{X, Y} || {X,Z} <- ets:table(E), + {Y} <- [{0},{1},{2}], + X == Z, Y == Z]), % cannot skip (yet) + {qlc,_, + [{generate,_, + {qlc,_,[_,_,_],[{join,lookup}]}}, + _,_],[]} = qlc:info(Q,{format,debug}), + {0,1,0,0} = join_info(Q), + [{1,1},{2,2}] = qlc:e(Q), + ets:delete(E)">>, + + %% The following moved here from skip_filters. It was buggy! + <<"etsc(fun(E) -> + A = 3, + Q = qlc:q([X || X <- ets:table(E), + A == element(1,X)]), + {table, _} = i(Q), + case qlc:e(Q) of + [{3},{3.0}] -> ok; + [{3.0},{3}] -> ok + end, + false = lookup_keys(Q) + end, [{3},{3.0},{c}])">>, + <<"H1 = qlc:sort([{{192,192.0},1,a},{{192.0,192.0},2,b},{{192,192.0},3,c}]), + Q = qlc:q([{X, Y} || {{A,B},X,_} <- H1, % does not need keysort(3) + A == 192, B =:= 192.0, + {Y} <- [{0},{1},{2}], + X == Y]), + {block,0, + [{match,_,_, + {call,_,_, + [{lc,_,_, + [_, + %% Has to compare extra constant: + {op,_,'==', + {tuple,_,[{integer,_,192},{float,_,192.0}]}, + {call,_,{atom,_,element},[{integer,_,1},{var,_,'P0'}]}}]}]}}, + _,_, + {call,_,_, + [{lc,_,_, + [_, + %% The join filter has been skipped. + {op,_,'==',{var,_,'A'},{integer,_,192}}, + {op,_,'=:=',{var,_,'B'},{float,_,192.0}}]}]}]} + = qlc:info(Q, {format,abstract_code}), + {1,0,0,1} = join_info(Q), + [{1,1},{2,2}] = qlc:e(Q)">>, + + %% Does not handle more than one lookup value (conjunctive). + <<"T = gb_trees:from_orddict([{1,a},{2,b}]), + H = qlc:q([X || {X,_} <- gb_table:table(T), + X =:= 1 andalso X == 1.0]), + false = lookup_keys(H), + [1] = qlc:e(H)">>, + + %% EqualConstants... + <<"etsc(fun(E) -> + Q = qlc:q([{X,Y} || {X} <- ets:table(E), + {Y} <- [{{1}},{{2}},{{1.0}},{{2.0}}], + X =:= {1}, X == {1.0}, + X == Y], {join, merge}), + [{{1},{1}},{{1},{1.0}}] = lists:sort(qlc:e(Q)), + false = lookup_keys(Q) + end, [{{1}}, {{2}}])">>, + + <<"T = gb_trees:from_orddict([{foo,{1}}, {bar,{2}}]), + Q = qlc:q([{X,Y} || {_,X} <- gb_table:table(T), + {Y} <- [{{1}},{{2}},{{1.0}},{{2.0}}], + (X =:= {1}) or (X == {2}), + (X == {1.0}) or (X =:= {2.0}), + X == Y], {join, merge}), + [{{1},{1}},{{1},{1.0}}] = qlc:e(Q)">>, + + %% Compare key + <<"T = gb_trees:from_orddict([{1,a},{2,b}]), + H = qlc:q([X || {X,_} <- gb_table:table(T), + X == 1]), + [1] = lookup_keys(H), + [1] = qlc:e(H)">>, + <<"T = gb_trees:from_orddict([{1,a},{2,b}]), + H = qlc:q([X || {X,_} <- gb_table:table(T), + X == 1.0]), + [1.0] = lookup_keys(H), % this is how gb_table works... + [1.0] = qlc:e(H)">>, + <<"etsc(fun(E) -> + H = qlc:q([X || {X,_} <- ets:table(E), + X == 1.0]), + [1] = qlc:e(H), % and this is how ETS works. + [1.0] = lookup_keys(H) + end, [ordered_set], [{1,a},{2,b}])">>, + + <<"T = gb_trees:from_orddict([{1,a},{2,b}]), + H = qlc:q([X || {X,_} <- gb_table:table(T), + X =:= 2]), + [2] = lookup_keys(H), + %% Cannot (generally) remove the matching filter (the table + %% compares the key). But note that gb_table returns the given + %% term as key, so in this case the filter _could_ have been removed. + %% However, there is no callback to inform qlc about that. + {call,_,_, + [_,{call,_,_, + [{cons,_,{tuple,_, + [_,{cons,_, + {tuple,_,[{atom,_,'=:='},{atom,_,'$1'},{integer,_,2}]}, + _},_]},_}]}]} = qlc:info(H, {format,abstract_code}), + [2] = qlc:e(H)">>, + <<"T = gb_trees:from_orddict([{1,a},{2,b}]), + H = qlc:q([X || {X,_} <- gb_table:table(T), + X =:= 2.0]), + %% Just shows that the term (not the key) is returned. + [2.0] = lookup_keys(H), + [2.0] = qlc:e(H)">>, + + <<"I = 1, + T = gb_trees:from_orddict([{1,a},{2,b}]), + H = qlc:q([X || {X,_} <- gb_table:table(T), + X == I]), % imported variable + [1] = lookup_keys(H), + {call,_,_, + [_,{call,_,_, + [{cons,_, + {tuple,_, + [{tuple,_,[{atom,_,'$1'},{atom,_,'_'}]}, + {nil,_}, % the filter has been skipped + {cons,_,{atom,_,'$1'},_}]}, + _}]}]} = qlc:info(H, {format, abstract_code}), + [1] = qlc:e(H)">>, + <<"I = 2, + T = gb_trees:from_orddict([{1,a},{2,b}]), + H = qlc:q([X || {X,_} <- gb_table:table(T), + X =:= I]), + [2] = lookup_keys(H), + {call,_,_, + [_,{call,_,_, + [{cons,_,{tuple,_, + [_,{cons,_, + {tuple,_, + [{atom,_,'=:='}, + {atom,_,'$1'}, + {tuple,_,[{atom,_,const},{integer,_,2}]}]}, + _},_]}, + _}]}]} = qlc:info(H, {format, abstract_code}), + [2] = qlc:e(H)">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X,_} <- ets:table(E), + X =:= a]), % skipped + [a] = qlc:e(Q), + {list,{table,_},_} = i(Q), + [a] = lookup_keys(Q) + end, [ordered_set], [{a,1},{b,2},{3,c}])">>, + + %% Does not find that if for instance X =:= {1} then the filter + %% X == {1} can be removed. + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + X =:= {1}, X == {1.0}]), + [{1}] = qlc:e(Q), + [{1}] = lookup_keys(Q) + end, [{{1}}, {{2}}])">>, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + X =:= {1}, X == {1.0}]), + [{1}] = qlc:e(Q), + false = lookup_keys(Q) + end, [ordered_set], [{{1}}, {{2}}])">>, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + X == {1.0}, X =:= {1}]), + [{1}] = qlc:e(Q), + [{1}] = lookup_keys(Q) + end, [{{1}}, {{2}}])">>, + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + X == {1.0}, X =:= {1}]), + [{1}] = qlc:e(Q), + false = lookup_keys(Q) + end, [ordered_set], [{{1}}, {{2}}])">>, + + <<"E = ets:new(apa, []), + true = ets:insert(E, [{1,a},{2,b}]), + {'EXIT', {badarg, _}} = + (catch qlc_SUITE:bad_table_key_equality(E)), + ets:delete(E)">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X} <- ets:table(E), + X =:= 1, X =:= is_integer(X)]), + [] = qlc:e(Q), + [1] = lookup_keys(Q) + end, [{1}, {2}])">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X=1} <- ets:table(E), + X =:= is_integer(X)]), + {call,_,_, + [{lc,_,_, + [_, + {op,_,'=:=', + {var,_,'X'}, + {call,_, + {atom,_,is_integer}, + [{var,_,'X'}]}}]}]} = + qlc:info(Q, {format, abstract_code}), + [] = qlc:e(Q), + [1] = lookup_keys(Q) + end, [{1}, {2}])">>, + + <<"T = gb_trees:from_orddict([{1,a},{2,b}]), + H = qlc:q([X || {X,Y} <- gb_table:table(T), + Y =:= a, true, X =:= 1]), + [1] = lookup_keys(H), + [1] = qlc:e(H)">>, + + <<"T = gb_trees:from_orddict([{{1.0,1},a},{{2.0,2},b}]), + H = qlc:q([X || {{1.0,B}=X,_} <- gb_table:table(T), + B == 1]), % skipped + [{1.0, 1}] = qlc:e(H), + {qlc,_,[{generate,_,{table,_}}], []} = qlc:info(H, {format,debug})">>, + <<"T = gb_trees:from_orddict([{{1.0,1},a},{{2.0,2},b}]), + H = qlc:q([X || {{1.0,B}=X,_} <- gb_table:table(T), + B == 1.0]), % skipped + [{1.0, 1.0}] = qlc:e(H), % this is how gb_table works... + {qlc,_,[{generate,_,{table,_}}], []} = qlc:info(H, {format,debug})">>, + <<"T = gb_trees:from_orddict([{{1.0,1},a},{{2.0,2},b}]), + H = qlc:q([X || {{1.0,B}=X,_} <- gb_table:table(T), + B =:= 1.0]), % not skipped + [{1.0, 1.0}] = qlc:e(H), + {qlc,_,[{generate,_,{table,_}},_], []} = qlc:info(H,{format,debug})">>, + <<"T = gb_trees:from_orddict([{{1.0,1},a},{{2.0,2},b}]), + H = qlc:q([X || {{1.0,B}=X,_} <- gb_table:table(T), + B =:= 1]), % not skipped + [{1.0, 1}] = qlc:e(H), + {qlc,_,[{generate,_,{table,_}},_], []} = qlc:info(H,{format,debug})">>, + + <<"%% The imported variables do not interfere with join. + E = ets:new(join, [ordered_set]), + {A, B} = {1,1}, + true = ets:insert(E, [{1,a},{2,b},{3,c}]), + Q = qlc:q([{X, Y} || {X,_Z} <- ets:table(E), + {Y} <- [{0},{1},{2}], + X =:= A, Y =:= B, + Y == X], % skipped + {join, merge}), + [{1,1}] = qlc:e(Q), + {qlc,_, + [{generate,_, + {qlc,_, + [{generate,_, + {qlc,_,[{generate,_,{list,{table,_},_}},_],[]}}, + {generate,_, + {qlc,_,[{generate,_,{list,_,_}},_],[]}}, + _], + [{join,merge}]}}], + []} = qlc:info(Q, {format, debug}), + ets:delete(E)">>, + + <<"% An old bug: usort() should not be used when matching values + etsc(fun(E) -> + I = 1, + H = qlc:q([X || {X,_} <- ets:table(E), + X =:= 1.0 orelse X =:= I]), + [1] = qlc:e(H), + [1.0] = lookup_keys(H) % do not look up twice + end, [set], [{1,a},{2,b}])">>, + <<"etsc(fun(E) -> + H = qlc:q([X || {X,_} <- ets:table(E), + X =:= 1.0 orelse X == 1]), + [1] = qlc:e(H), + false = lookup_keys(H) % doesn't handle this case + end, [ordered_set], [{1,a},{2,b}])">>, + + <<"etsc(fun(E) -> + I1 = 1, I2 = 1, + H = qlc:q([X || {X,_} <- ets:table(E), + X =:= I1 orelse X == I2]), + [1] = qlc:e(H), % do not look up twice + [1] = lookup_keys(H) + end, [ordered_set], [{1,a},{2,b}])">>, + + <<"etsc(fun(E) -> + I1 = 1, I2 = 1, I3 = 1, + H = qlc:q([X || {X,_} <- ets:table(E), + I1 == I2, I1 =:= I3, I3 == I2, I2 =:= I3, + X =:= I1 orelse X == I2 + ]), + [1] = qlc:e(H), + [1] = lookup_keys(H) + end, [ordered_set], [{1,a},{2,b}])">>, + + <<"E = ets:new(join, [ordered_set]), + true = ets:insert(E, [{1,a},{2,b,x},{3,c}]), + Q = qlc:q([P || P <- ets:table(E), + P =:= {1,a} orelse P =:= {2,b,x}]), + [{1,a},{2,b,x}] = qlc:e(Q), + ets:delete(E)">>, + + <<"etsc(fun(E) -> + Q = qlc:q([X || {X,Y} <- ets:table(E), + ((X =:= 3) or (Y =:= 4)) and (X == a)]), + {list,{table,_},_} = i(Q), + [] = qlc:e(Q), % a is not an answer + [a] = lookup_keys(Q) + end, [{keypos,1},ordered_set], [{a,3},{b,4}])">>, + + <<"Q = qlc:q([{X,Y} || + {X} <- [{<<3:4>>}], + {Y} <- [{<<3:4>>}], + X =:= <<1:3,1:1>>, % <<3:4>> + Y =:= <<0:2,1:1,1:1>>, % <<3:4>> + X =:= Y]), + [{<<3:4>>,<<3:4>>}] = qlc:e(Q)">> + + + ], + + ?line run(Config, Ts). + +manpage(doc) -> + "Examples from qlc(3)."; +manpage(suite) -> []; +manpage(Config) when is_list(Config) -> + + ?line ok = compile_gb_table(Config), + + Ts = [ + <<"QH = qlc:q([{X,Y} || X <- [a,b], Y <- [1,2]]), + QC = qlc:cursor(QH), + [{a,1}] = qlc:next_answers(QC, 1), + [{a,2}] = qlc:next_answers(QC, 1), + [{b,1},{b,2}] = qlc:next_answers(QC, all_remaining), + ok = qlc:delete_cursor(QC)">>, + + <<"QH = qlc:q([{X,Y} || X <- [a,b], Y <- [1,2]]), + [{a,1},{a,2},{b,1},{b,2}] = qlc:eval(QH)">>, + + <<"QH = [1,2,3,4,5,6], + 21 = qlc:fold(fun(X, Sum) -> X + Sum end, 0, QH)">>, + + <<"QH = qlc:q([{X,Y} || X <- [x,y], Y <- [a,b]]), + B = \"begin\n\" + \" V1 =\n\" + \" qlc:q([ \n\" + \" SQV ||\n\" + \" SQV <- [x,y]\n\" + \" ],\n\" + \" [{unique,true}]),\n\" + \" V2 =\n\" + \" qlc:q([ \n\" + \" SQV ||\n\" + \" SQV <- [a,b]\n\" + \" ],\n\" + \" [{unique,true}]),\n\" + \" qlc:q([ \n\" + \" {X,Y} ||\n\" + \" X <- V1,\n\" + \" Y <- V2\n\" + \" ],\n\" + \" [{unique,true}])\n\" + \"end\", + true = B =:= qlc:info(QH, unique_all)">>, + + <<"E1 = ets:new(e1, []), + E2 = ets:new(e2, []), + true = ets:insert(E1, [{1,a},{2,b}]), + true = ets:insert(E2, [{a,1},{b,2}]), + Q = qlc:q([{X,Z,W} || + {X, Z} <- ets:table(E1), + {W, Y} <- ets:table(E2), + X =:= Y]), + L = \"begin\n\" + \" V1 =\n\" + \" qlc:q([ \n\" + \" P0 ||\n\" + \" P0 = {W,Y} <- ets:table(_)\n\" + \" ]),\n\" + \" V2 =\n\" + \" qlc:q([ \n\" + \" [G1|G2] ||\n\" + \" G2 <- V1,\n\" + \" G1 <- ets:table(_),\n\" + \" element(2, G1) =:= element(1, G2)\n\" + \" ],\n\" + \" [{join,lookup}]),\n\" + \" qlc:q([ \n\" + \" {X,Z,W} ||\n\" + \" [{X,Z}|{W,Y}] <- V2\n\" + \" ])\n\" + \"end\", + Info = + re:replace(qlc:info(Q), + \"table\\\\(-*[0-9]*\", + \"table(_\", [{return,list},global]), + L = Info, + ets:delete(E1), + ets:delete(E2)">>, + + <<"Q = qlc:q([{A,X,Z,W} || + A <- [a,b,c], + {X,Z} <- [{a,1},{b,4},{c,6}], + {W,Y} <- [{2,a},{3,b},{4,c}], + X =:= Y], + {cache, list}), + L = + \"begin\n\" + \" V1 =\n\" + \" qlc:q([ \n\" + \" P0 ||\n\" + \" P0 = {X,Z} <- qlc:keysort(1, [{a,1},{b,4},{c,6}], [])\n\" + \" ]),\n\" + \" V2 =\n\" + \" qlc:q([ \n\" + \" P0 ||\n\" + \" P0 = {W,Y} <- qlc:keysort(2, [{2,a},{3,b},{4,c}], [])\n\" + \" ]),\n\" + \" V3 =\n\" + \" qlc:q([ \n\" + \" [G1|G2] ||\n\" + \" G1 <- V1,\n\" + \" G2 <- V2,\n\" + \" element(1, G1) == element(2, G2)\n\" + \" ],\n\" + \" [{join,merge},{cache,list}]),\n\" + \" qlc:q([ \n\" + \" {A,X,Z,W} ||\n\" + \" A <- [a,b,c],\n\" + \" [{X,Z}|{W,Y}] <- V3,\n\" + \" X =:= Y\n\" + \" ])\n\" + \"end\", + L = qlc:info(Q)">>, + + <<"E1 = ets:new(t, [set]), % uses =:=/2 + Q1 = qlc:q([K || + {K} <- ets:table(E1), + K == 2.71 orelse K == a]), + {list,{table,_}, [{{'$1'},[],['$1']}]} = i(Q1), + true = ets:delete(E1)">>, + + <<"F = fun(E, I) -> + qlc:q([V || {K,V} <- ets:table(E), K == I]) + end, + E2 = ets:new(t, [set]), + true = ets:insert(E2, [{{2,2},a},{{2,2.0},b},{{2.0,2},c}]), + Q2 = F(E2, {2,2}), + {table,{ets,table,[_, + [{traverse,{select,[{{'$1','$2'}, + [{'==','$1',{const,{2,2}}}], + ['$2']}]}}]]}} = i(Q2), + [a,b,c] = lists:sort(qlc:e(Q2)), + true = ets:delete(E2), + + E3 = ets:new(t, [ordered_set]), % uses ==/2 + true = ets:insert(E3, [{{2,2.0},b}]), + Q3 = F(E3,{2,2}), + {list,{table,_},[{{'$1','$2'},[],['$2']}]} = i(Q3), + [b] = qlc:e(Q3), + true = ets:delete(E3)">>, + + <<"T = gb_trees:empty(), + QH = qlc:q([X || {{X,Y},_} <- gb_table:table(T), + ((X == 1) or (X == 2)) andalso + ((Y == a) or (Y == b) or (Y == c))]), + L = \"ets:match_spec_run(lists:flatmap(fun(K) -> + case + gb_trees:lookup(K, + gb_trees:from_orddict([])) + of + {value,V} -> + [{K,V}]; + none -> + [] + end + end, + [{1,a},{1,b},{1,c},{2,a},{2,b},{2,c}]), + ets:match_spec_compile([{{{'$1','$2'},'_'},[],['$1']}]))\", + L = qlc:info(QH)">> + ], + ?line run(Config, Ts), + + L = [1,2,3], + Bs = erl_eval:add_binding('L', L, erl_eval:new_bindings()), + QH = qlc:string_to_handle("[X+1 || X <- L].", [], Bs), + [2,3,4] = qlc:eval(QH), + + %% ets(3) + MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X < 5) -> {Y} end), + ETs = [ + [<<"true = ets:insert(Tab = ets:new(t, []),[{1,a},{2,b},{3,c},{4,d}]), + MS = ">>, io_lib:format("~w", [MS]), <<", + QH1 = ets:table(Tab, [{traverse, {select, MS}}]), + + QH2 = qlc:q([{Y} || {X,Y} <- ets:table(Tab), (X > 1) or (X < 5)]), + + true = qlc:info(QH1) =:= qlc:info(QH2), + true = ets:delete(Tab)">>]], + ?line run(Config, ETs), + + %% dets(3) + DTs = [ + [<<"{ok, T} = dets:open_file(t, []), + ok = dets:insert(T, [{1,a},{2,b},{3,c},{4,d}]), + MS = ">>, io_lib:format("~w", [MS]), <<", + QH1 = dets:table(T, [{traverse, {select, MS}}]), + + QH2 = qlc:q([{Y} || {X,Y} <- dets:table(t), (X > 1) or (X < 5)]), + + true = qlc:info(QH1) =:= qlc:info(QH2), + ok = dets:close(T)">>]], + ?line run(Config, DTs), + + ok. + +compile_gb_table(Config) -> + GB_table_file = filename("gb_table.erl", Config), + ?line ok = file:write_file(GB_table_file, gb_table()), + ?line {ok, gb_table} = compile:file(GB_table_file, [{outdir,?privdir}]), + ?line code:purge(gb_table), + ?line {module, gb_table} = + code:load_abs(filename:rootname(GB_table_file)), + ok. + +gb_table() -> + <<" +-module(gb_table). + +-export([table/1]). + +table(T) -> + TF = fun() -> qlc_next(gb_trees:next(gb_trees:iterator(T))) end, + InfoFun = fun(num_of_objects) -> gb_trees:size(T); + (keypos) -> 1; + (is_sorted_key) -> true; + (is_unique_objects) -> true; + (_) -> undefined + end, + LookupFun = + fun(1, Ks) -> + lists:flatmap(fun(K) -> + case gb_trees:lookup(K, T) of + {value, V} -> [{K,V}]; + none -> [] + end + end, Ks) + end, + FormatFun = + fun({all, NElements, ElementFun}) -> + ValsS = io_lib:format(\"gb_trees:from_orddict(~w)\", + [gb_nodes(T, NElements, ElementFun)]), + io_lib:format(\"gb_table:table(~s)\", [ValsS]); + ({lookup, 1, KeyValues, _NElements, ElementFun}) -> + ValsS = io_lib:format(\"gb_trees:from_orddict(~w)\", + [gb_nodes(T, infinity, ElementFun)]), + io_lib:format(\"lists:flatmap(fun(K) -> \" + \"case gb_trees:lookup(K, ~s) of \" + \"{value, V} -> [{K,V}];none -> [] end \" + \"end, ~w)\", + [ValsS, [ElementFun(KV) || KV <- KeyValues]]) + end, + qlc:table(TF, [{info_fun, InfoFun}, {format_fun, FormatFun}, + {lookup_fun, LookupFun},{key_equality,'=='}]). + +qlc_next({X, V, S}) -> + [{X,V} | fun() -> qlc_next(gb_trees:next(S)) end]; +qlc_next(none) -> + []. + +gb_nodes(T, infinity, ElementFun) -> + gb_nodes(T, -1, ElementFun); +gb_nodes(T, NElements, ElementFun) -> + gb_iter(gb_trees:iterator(T), NElements, ElementFun). + +gb_iter(_I, 0, _EFun) -> + '...'; +gb_iter(I0, N, EFun) -> + case gb_trees:next(I0) of + {X, V, I} -> + [EFun({X,V}) | gb_iter(I, N-1, EFun)]; + none -> + [] + end. + ">>. + +compat(suite) -> + [backward, forward]. + +backward(doc) -> + "OTP-6674. Join info and extra constants."; +backward(suite) -> []; +backward(Config) when is_list(Config) -> + case try_old_join_info(Config) of + ok -> + ok; + Reply -> + Reply + end. + +-ifdef(debug). +try_old_join_info(_Config) -> + ok. +-else. +try_old_join_info(Config) -> + case ?t:is_release_available("r12b") of + true -> + %% Check join info for handlers of extra constants. Start R12B-0. + ?line {ok, R12} = start_node_rel(r12, r12b, slave), + File = filename("handle.erl", Config), + ?line file:write_file(File, + <<"-module(handle).\n" + "-export([create_handle/0, lookup_handle/0]).\n" + "-include_lib(\"stdlib/include/qlc.hrl\").\n" + "create_handle() ->\n" + " H1 = qlc:sort([{192.0,1,a},{192.0,2,b},{192.0,3,c}]),\n" + " qlc:q([{X, Y} || {B,X,_} <- H1,\n" + " B =:= 192.0,\n" + " {Y} <- [{0},{1},{2}],\n" + " X == Y]).\n", + "\n", + "lookup_handle() ->\n" + " E = qlc_SUITE:table([{1,a},{2,b},{3,c}], 1, [1]),\n" + " qlc:q([{X, Y} || {X,_} <- E,\n" + " {Y} <- [{0},{1},{2}],\n" + " X =:= Y]).\n">>), + ?line {ok, handle} = rpc:call(R12, compile, file, + [File, [{outdir,?privdir}]]), + ?line {module, handle} = rpc:call(R12, code, load_abs, + [filename:rootname(File)]), + ?line H = rpc:call(R12, handle, create_handle, []), + ?line {module, handle} = code:load_abs(filename:rootname(File)), + ?line {block,0, + [{match,_,_, + {call,_,_, + [{lc,_,_, + [_, + {op,_,'=:=', + {float,_,192.0}, + {call,_,{atom,_,element},[{integer,_,1},_]}}]}]}}, + _,_, + {call,_,_, + [{lc,_,_, + [_, + {op,_,'=:=',{var,_,'B'},{float,_,192.0}}, + {op,_,'==',{var,_,'X'},{var,_,'Y'}}]}]}]} + = qlc:info(H,{format,abstract_code}), + ?line [{1,1},{2,2}] = qlc:e(H), + ?line H2 = rpc:call(R12, handle, lookup_handle, []), + ?line {qlc,_,[{generate,_,{qlc,_,_,[{join,lookup}]}},_],[]} = + qlc:info(H2, {format,debug}), + ?line [{1,1},{2,2}] = qlc:e(H2), + stop_node(R12); + false -> + ?line {skipped, "No support for old node"} + end. +-endif. + +forward(doc) -> + ""; +forward(suite) -> []; +forward(Config) when is_list(Config) -> + Ts = [ + %% LC_fun() returns something unknown. + <<"FakeH = {qlc_handle,{qlc_lc,fun() -> {foo,bar} end, + {qlc_opt,false,false,-1,any,[],any,524288}}}, + {'EXIT', {{unsupported_qlc_handle,_},_}} = (catch qlc:e(FakeH))">>, + +%% 'f1' should be used for new stuff that does not interfer with old behavior +% %% The unused element 'f1' of #qlc_table seems to be used. +% <<"DF = fun() -> foo end, +% FakeH = {qlc_handle,{qlc_table,DF, +% true,DF,DF,DF,DF,DF, +% undefined,not_undefined,undefined,no_match_spec}}, +% {'EXIT', {{unsupported_qlc_handle,_},_}} = (catch qlc:e(FakeH))">>, + + %% #qlc_opt has changed. + <<"H = qlc:q([X || X <- []]), + {qlc_handle, {qlc_lc, Fun, _Opt}} = H, + FakeH = {qlc_handle, {qlc_lc, Fun, {new_qlc_opt, a,b,c}}}, + {'EXIT', {{unsupported_qlc_handle,_},_}} = (catch qlc:e(FakeH))">> + + ], + ?line run(Config, Ts), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +bad_table_throw(Tab) -> + Limit = 1, + Select = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + PreFun = fun(_) -> throw({throw,bad_pre_fun}) end, + PostFun = fun() -> throw({throw,bad_post_fun}) end, + InfoFun = fun(Tag) -> info(Tab, Tag) end, + qlc:table(Select, [{pre_fun,PreFun}, {post_fun, PostFun}, + {info_fun, InfoFun}]). + +bad_table_exit(Tab) -> + Limit = 1, + Select = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + PreFun = fun(_) -> erlang:error(bad_pre_fun) end, + PostFun = fun() -> erlang:error(bad_post_fun) end, + InfoFun = fun(Tag) -> info(Tab, Tag) end, + qlc:table(Select, [{pre_fun,PreFun}, {post_fun, PostFun}, + {info_fun, InfoFun}]). + +info(_Tab, is_unique_objects) -> + false; +info(Tab, Tag) -> + try ets:info(Tab, Tag) catch _:_ -> undefined end. + +create_ets(S, E) -> + create_ets(lists:seq(S, E)). + +create_ets(L) -> + E1 = ets:new(e, []), + true = ets:insert(E1, [{X,X} || X <- L]), + E1. + +etsc(F, Objs) -> + etsc(F, [{keypos,1}], Objs). + +etsc(F, Opts, Objs) -> + E = ets:new(test, Opts), + true = ets:insert(E, Objs), + V = F(E), + ets:delete(E), + V. + +join_info(H) -> + {qlc, S, Options} = strip_qlc_call(H), + %% "Hide" the call to qlc_pt from the test in run_test(). + LoadedPT = code:is_loaded(qlc_pt), + QH = qlc:string_to_handle(S, Options), + _ = [unload_pt() || false <- [LoadedPT]], % doesn't take long... + case {join_info_count(H), join_info_count(QH)} of + {N, N} -> + N; + Ns -> + Ns + end. + +strip_qlc_call(H) -> + S = qlc:info(H, {flat, false}), + {ok, Tokens, _EndLine} = erl_scan:string(S++"."), + {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + case Expr of + {call,_,{remote,_,{atom,_,qlc},{atom,_,q}},[LC]} -> + {qlc, lists:flatten([erl_pp:expr(LC), "."]), []}; + {call,_,{remote,_,{atom,_,qlc},{atom,_,q}},[LC, Opts]} -> + {qlc, lists:flatten([erl_pp:expr(LC), "."]), + erl_parse:normalise(Opts)}; + {call,_,{remote,_,{atom,_,ets},{atom,_,match_spec_run}},_} -> + {match_spec, Expr}; + {call,_,{remote,_,{atom,_,M},{atom,_,table}},_} -> + {table, M, Expr}; + _ -> + [] + end. + +-record(ji, {nmerge = 0, nlookup = 0, nnested_loop = 0, nkeysort = 0}). + +%% Counts join options and (all) calls to qlc:keysort(). +join_info_count(H) -> + S = qlc:info(H, {flat, false}), + {ok, Tokens, _EndLine} = erl_scan:string(S++"."), + {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + #ji{nmerge = Nmerge, nlookup = Nlookup, + nkeysort = NKeysort, nnested_loop = Nnested_loop} = + ji(Expr, #ji{}), + {Nmerge, Nlookup, Nnested_loop, NKeysort}. + +ji({call,_,{remote,_,{atom,_,qlc},{atom,_,q}},[LC,Options]}, JI) -> + NJI = case lists:keysearch(join, 1, erl_parse:normalise(Options)) of + {value, {join, merge}} -> + JI#ji{nmerge = JI#ji.nmerge + 1}; + {value, {join, lookup}} -> + JI#ji{nlookup = JI#ji.nlookup + 1}; + {value, {join, nested_loop}} -> + JI#ji{nnested_loop = JI#ji.nnested_loop + 1}; + _ -> + JI + end, + ji(LC, NJI); +ji({call,_,{remote,_,{atom,_,qlc},{atom,_,keysort}},[_KP,H,_Options]}, JI) -> + ji(H, JI#ji{nkeysort = JI#ji.nkeysort + 1}); +ji(T, JI) when is_tuple(T) -> + ji(tuple_to_list(T), JI); +ji([E | Es], JI) -> + ji(Es, ji(E, JI)); +ji(_, JI) -> + JI. + +%% Designed for ETS' and gb_table's format funs. +lookup_keys(Q) -> + case lists:flatten(lookup_keys(i(Q), [])) of + [] -> false; + L -> lists:usort(L) + end. + +lookup_keys([Q | Qs], L) -> + lookup_keys(Qs, lookup_keys(Q, L)); +lookup_keys({qlc,_,Quals,_}, L) -> + lookup_keys(Quals, L); +lookup_keys({list,Q,_}, L) -> + lookup_keys(Q, L); +lookup_keys({generate,_,Q}, L) -> + lookup_keys(Q, L); +lookup_keys({table,Chars}, L) when is_list(Chars) -> + {ok, Tokens, _} = erl_scan:string(lists:flatten(Chars++".")), + {ok, [Expr]} = erl_parse:parse_exprs(Tokens), + case Expr of + {call,_,_,[_fun,AKs]} -> + case erl_parse:normalise(AKs) of + Ks when is_list(Ks) -> + [lists:sort(Ks) | L]; + K -> % assume keys are never lists (ets only) + [K | L] + end; + _ -> % gb_table + L + end; +lookup_keys(_Q, L) -> + L. + +bad_table_format(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + FormatFun = {is, no, good}, + qlc:table(SelectFun, [{format_fun, FormatFun}]). + +bad_table_format_arity(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + FormatFun = fun() -> {?MODULE, bad_table_format_arity, [Tab]} end, + qlc:table(SelectFun, [{format_fun, FormatFun}]). + +bad_table_traverse(Tab) -> + Limit = 1, + Select = fun(MS, _) -> cb(ets:select(Tab, MS, Limit)) end, + qlc:table(Select, []). + +bad_table_post(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + qlc:table(SelectFun, [{pre_fun,undefined}, + {post_fun, fun(X) -> X end}, + {info_fun, undefined}]). + +bad_table_lookup(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + qlc:table(SelectFun, {lookup_fun, fun(X) -> X end}). + +bad_table_max_lookup(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + qlc:table(SelectFun, {max_lookup, -2}). + +bad_table_info_arity(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + InfoFun = fun() -> {?MODULE, bad_table_info_arity, [Tab]} end, + qlc:table(SelectFun, [{info_fun, InfoFun}]). + +default_table(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + qlc:table(SelectFun, [{format_fun, undefined}, + {info_fun, undefined}, + {lookup_fun, undefined}, + {parent_fun, undefined}, + {pre_fun,undefined}, + {post_fun, undefined}]). + +bad_table(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + qlc:table(SelectFun, [{info, fun() -> ok end}]). + +bad_table_info_fun_n_objects(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + LookupFun = fun(_Pos, Ks) -> + lists:flatmap(fun(K) -> ets:lookup(Tab, K) end, Ks) + end, + InfoFun = fun(num_of_objects) -> exit(finito); + (_) -> undefined + end, + qlc:table(SelectFun, [{info_fun, InfoFun}, {lookup_fun, LookupFun}]). + +bad_table_info_fun_indices(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + LookupFun = fun(_Pos, Ks) -> + lists:flatmap(fun(K) -> ets:lookup(Tab, K) end, Ks) + end, + InfoFun = fun(indices) -> throw({throw,apa}); + (_) -> undefined + end, + qlc:table(SelectFun, [{info_fun, InfoFun}, {lookup_fun, LookupFun}]). + +bad_table_info_fun_keypos(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + LookupFun = fun(_Pos, Ks) -> + lists:flatmap(fun(K) -> ets:lookup(Tab, K) end, Ks) + end, + InfoFun = fun(indices) -> erlang:error(keypos); + (_) -> undefined + end, + qlc:table(SelectFun, [{info_fun, InfoFun}, {lookup_fun, LookupFun}]). + +bad_table_key_equality(Tab) -> + Limit = 1, + SelectFun = fun(MS) -> cb(ets:select(Tab, MS, Limit)) end, + LookupFun = fun(_Pos, Ks) -> + lists:flatmap(fun(K) -> ets:lookup(Tab, K) end, Ks) + end, + qlc:table(SelectFun, [{lookup_fun, LookupFun},{key_equality,'=/='}]). + +cb('$end_of_table') -> + []; +cb({Objects,Cont}) -> + Objects ++ fun() -> cb(ets:select(Cont)) end. + +i(H) -> + i(H, []). + +i(H, Options) when is_list(Options) -> + case has_format(Options) of + true -> qlc:info(H, Options); + false -> qlc:info(H, [{format, debug} | Options]) + end; +i(H, Option) -> + i(H, [Option]). + +has_format({format,_}) -> + true; +has_format([E | Es]) -> + has_format(E) or has_format(Es); +has_format(_) -> + false. + +format_info(H, Flat) -> + L = qlc:info(H, [{flat, Flat}, {format,string}]), + re:replace(L, "\s|\n|\t|\f|\r|\v", "", [{return,list},global]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% A list turned into a table... + +table_kill_parent(List, Indices) -> + ParentFun = fun() -> exit(self(), kill) end, + table_i(List, Indices, ParentFun). + +table_parent_throws(List, Indices) -> + ParentFun = fun() -> throw({throw,thrown}) end, + table_i(List, Indices, ParentFun). + +table_parent_exits(List, Indices) -> + ParentFun = fun() -> 1 + Indices end, + table_i(List, Indices, ParentFun). + +table_bad_parent_fun(List, Indices) -> + ParentFun = fun(X) -> X end, % parent_fun should be nullary + table_i(List, Indices, ParentFun). + +table(List, Indices) -> + ParentFun = fun() -> self() end, + table_i(List, Indices, ParentFun). + +table(List, KeyPos, Indices) -> + ParentFun = fun() -> self() end, + table(List, Indices, KeyPos, ParentFun). + +table_i(List, Indices, ParentFun) -> + table(List, Indices, undefined, ParentFun). + +table(List, Indices, KeyPos, ParentFun) -> + TraverseFun = fun() -> list_traverse(List) end, + PreFun = fun(PreArgs) -> + {value, {parent_value, Pid}} = + lists:keysearch(parent_value, 1, PreArgs), + true = is_pid(Pid) + end, + PostFun = fun() -> ok end, + InfoFun = fun(indices) -> + Indices; + (is_unique_objects) -> + undefined; + (keypos) -> + KeyPos; + (num_of_objects) -> + undefined; + (_) -> + undefined + end, + LookupFun = + fun(Column, Values) -> + lists:flatmap(fun(V) -> + case lists:keysearch(V, Column, List) of + false -> []; + {value,Val} -> [Val] + end + end, Values) + + end, + FormatFun = fun(all) -> + L = 17, + {call,L,{remote,L,{atom,1,?MODULE},{atom,L,the_list}}, + [erl_parse:abstract(List, 17)]}; + ({lookup, Column, Values}) -> + {?MODULE, list_keys, [Values, Column, List]} + end, + qlc:table(TraverseFun, [{info_fun,InfoFun}, {pre_fun, PreFun}, + {post_fun, PostFun}, {lookup_fun, LookupFun}, + {format_fun, FormatFun}, + {parent_fun, ParentFun}]). + +stop_list(List, Ets) -> + Traverse = fun() -> list_traverse(List) end, + PV = a_sample_parent_value, + ParentFun = fun() -> PV end, + Pre = fun(PreArgs) -> + {value, {parent_value, PV}} = + lists:keysearch(parent_value, 1, PreArgs), + {value, {stop_fun, Fun}} = + lists:keysearch(stop_fun, 1, PreArgs), + true = ets:insert(Ets, {stop_fun, Fun}) + end, + qlc:table(Traverse, [{pre_fun, Pre}, {parent_fun, ParentFun}]). + +list_traverse([]) -> + []; +list_traverse([E | Es]) -> + [E | fun() -> list_traverse(Es) end]. + +table_error(List, Error) -> + table_error(List, undefined, Error). + +table_error(List, KeyPos, Error) -> + TraverseFun = fun() -> list_traverse2(lists:sort(List), Error) end, + InfoFun = fun(is_sorted_key) -> true; + (keypos) -> KeyPos; + (_) -> undefined + end, + qlc:table(TraverseFun, [{info_fun,InfoFun}]). + +list_traverse2([], Err) -> + Err; +list_traverse2([E | Es], Err) -> + [E | fun() -> list_traverse2(Es, Err) end]. + +table_lookup_error(List) -> + TraverseFun = fun() -> list_traverse(List) end, + LookupFun = fun(_Column, _Values) -> {error,lookup,failed} end, + InfoFun = fun(keypos) -> 1; + (_) -> undefined + end, + qlc:table(TraverseFun, [{lookup_fun,LookupFun},{info_fun,InfoFun}]). + +prep_scratchdir(Dir) -> + put('$qlc_tmpdir', true), + _ = filelib:ensure_dir(Dir), + lists:foreach(fun(F) -> file:delete(F) + end, filelib:wildcard(filename:join(Dir, "*"))), + true. + +%% Truncate just once. +truncate_tmpfile(Dir, Where) -> + case get('$qlc_tmpdir') of + true -> + {ok, [TmpFile0 | _]} = file:list_dir(Dir), + TmpFile = filename:join(Dir, TmpFile0), + truncate(TmpFile, Where), + erase('$qlc_tmpdir'); + _ -> + true + end. + +truncate(File, Where) -> + {ok, Fd} = file:open(File, [read, write]), + {ok, _} = file:position(Fd, Where), + ok = file:truncate(Fd), + ok = file:close(Fd). + +%% Crash just once. +crash_tmpfile(Dir, Where) -> + case get('$qlc_tmpdir') of + true -> + {ok, [TmpFile0 | _]} = file:list_dir(Dir), + TmpFile = filename:join(Dir, TmpFile0), + crash(TmpFile, Where), + erase('$qlc_tmpdir'); + _ -> + true + end. + +crash(File, Where) -> + {ok, Fd} = file:open(File, [read, write]), + {ok, _} = file:position(Fd, Where), + ok = file:write(Fd, [10]), + ok = file:close(Fd). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +run(Config, Tests) -> + run(Config, [], Tests). + +run(Config, Extra, Tests) -> + lists:foreach(fun(Body) -> run_test(Config, Extra, Body) end, Tests). + +run_test(Config, Extra, {cres, Body, ExpectedCompileReturn}) -> + run_test(Config, Extra, {cres, Body, _Opts = [], ExpectedCompileReturn}); +run_test(Config, Extra, {cres, Body, Opts, ExpectedCompileReturn}) -> + {SourceFile, Mod} = compile_file_mod(Config), + P = [Extra,<<"function() -> ">>, Body, <<", ok. ">>], + CompileReturn = compile_file(Config, P, Opts), + case comp_compare(ExpectedCompileReturn, CompileReturn) of + true -> ok; + false -> expected(ExpectedCompileReturn, CompileReturn, SourceFile) + end, + AbsFile = filename:rootname(SourceFile, ".erl"), + _ = code:purge(Mod), + {module, _} = code:load_abs(AbsFile, Mod), + + Ms0 = erlang:process_info(self(),messages), + Before = {get(), pps(), ets:all(), Ms0}, + + %% Prepare the check that the qlc module does not call qlc_pt. + _ = [unload_pt() || {file, Name} <- [code:is_loaded(qlc_pt)], + Name =/= cover_compiled], + + R = case catch Mod:function() of + {'EXIT', _Reason} = Error -> + ?t:format("failed, got ~p~n", [Error]), + fail(SourceFile); + Reply -> + Reply + end, + + %% Check that the qlc module does not call qlc_pt: + case code:is_loaded(qlc_pt) of + {file, cover_compiled} -> + ok; + {file, _} -> + ?t:format("qlc_pt was loaded in runtime~n", []), + fail(SourceFile); + false -> + ok + end, + + Ms = erlang:process_info(self(),messages), + After = {get(), pps(), ets:all(), Ms}, + code:purge(Mod), + case {R, After} of + {ok, Before} -> ok; + _ -> expected({ok,Before}, {R,After}, SourceFile) + end; +run_test(Config, Extra, Body) -> + run_test(Config, Extra, {cres,Body,[]}). + +unload_pt() -> + erlang:garbage_collect(), % get rid of references to qlc_pt... + _ = code:purge(qlc_pt), + _ = code:delete(qlc_pt). + +compile_format(Config, Tests) -> + Fun = fun(Test, Opts) -> + Return = compile_file(Config, Test, Opts), + format_messages(Return) + end, + compile(Config, Tests, Fun). + +format_messages({warnings,Ws}) -> + format_messages({errors,[],Ws}); +format_messages({errors,Es,Ws}) -> + {[format_msg(E, Mod) || {_Line,Mod,E} <- Es], + [format_msg(W, Mod) || {_Line,Mod,W} <- Ws]}. + +format_msg(Msg, Mod) -> + IOlist = Mod:format_error(Msg), + binary_to_list(iolist_to_binary(IOlist)). + +compile(Config, Tests) -> + Fun = fun(Test, Opts) -> catch compile_file(Config, Test, Opts) end, + compile(Config, Tests, Fun). + +compile(Config, Tests, Fun) -> + F = fun({TestName,Test,Opts,Expected}, BadL) -> + Return = Fun(Test, Opts), + case comp_compare(Expected, Return) of + true -> + BadL; + false -> + {File, _Mod} = compile_file_mod(Config), + expected(TestName, Expected, Return, File) + end + end, + lists:foldl(F, [], Tests). + +%% Compiles a test module and returns the list of errors and warnings. + +compile_file(Config, Test0, Opts0) -> + {File, Mod} = compile_file_mod(Config), + Test = list_to_binary(["-module(", atom_to_list(Mod), "). " + "-compile(export_all). " + "-import(qlc_SUITE, [i/1,i/2,format_info/2]). " + "-import(qlc_SUITE, [etsc/2, etsc/3]). " + "-import(qlc_SUITE, [create_ets/2]). " + "-import(qlc_SUITE, [strip_qlc_call/1]). " + "-import(qlc_SUITE, [join_info/1]). " + "-import(qlc_SUITE, [join_info_count/1]). " + "-import(qlc_SUITE, [lookup_keys/1]). " + "-include_lib(\"stdlib/include/qlc.hrl\"). ", + Test0]), + Opts = [export_all,return,nowarn_unused_record,{outdir,?privdir}|Opts0], + ok = file:write_file(File, Test), + case compile:file(File, Opts) of + {ok, _M, Ws} -> warnings(File, Ws); + {error, [{File,Es}], []} -> {errors, Es, []}; + {error, [{File,Es}], [{File,Ws}]} -> {error, Es, Ws} + end. + +comp_compare(T, T) -> + true; +comp_compare(T1, T2_0) -> + T2 = wskip(T2_0), + T1 =:= T2 + %% This clause should eventually be removed. + orelse ln(T1) =:= T2 orelse T1 =:= ln(T2). + +wskip([]) -> + []; +wskip([{_,sys_core_fold,{eval_failure,badarg}}|L]) -> + wskip(L); +wskip([{{L,_C},sys_core_fold,M}|L]) -> + [{L,sys_core_fold,M}|wskip(L)]; +wskip({T,L}) -> + {T,wskip(L)}; +wskip([M|L]) -> + [M|wskip(L)]; +wskip(T) -> + T. + +%% Replaces locations like {Line,Column} with Line. +ln({warnings,L}) -> + {warnings,ln0(L)}; +ln({errors,EL,WL}) -> + {errors,ln0(EL),ln0(WL)}; +ln(L) -> + ln0(L). + +ln0(L) -> + lists:sort(ln1(L)). + +ln1([]) -> + []; +ln1([{File,Ms}|MsL]) when is_list(File) -> + [{File,ln0(Ms)}|ln1(MsL)]; +ln1([{{L,_C},Mod,Mess0}|Ms]) -> + Mess = case Mess0 of + {exported_var,V,{Where,{L1,_C1}}} -> + {exported_var,V,{Where,L1}}; + {unsafe_var,V,{Where,{L1,_C1}}} -> + {unsafe_var,V,{Where,L1}}; + %% There are more... + M -> + M + end, + [{L,Mod,Mess}|ln1(Ms)]; +ln1([M|Ms]) -> + [M|ln1(Ms)]. + +%% -> {FileName, Module}; {string(), atom()} +compile_file_mod(Config) -> + NameL = lists:concat([?TESTMODULE, "_", ?testcase]), + Name = list_to_atom(NameL), + File = filename(NameL ++ ".erl", Config), + {File, Name}. + +filename(Name, Config) when is_atom(Name) -> + filename(atom_to_list(Name), Config); +filename(Name, Config) -> + filename:join(?privdir, Name). + +pps() -> + {port_list(), process_list()}. + +port_list() -> + [{P,safe_second_element(erlang:port_info(P, name))} || + P <- erlang:ports()]. + +process_list() -> + [{P,process_info(P, registered_name), + safe_second_element(process_info(P, initial_call))} || + P <- processes(), is_process_alive(P)]. + +safe_second_element({_,Info}) -> Info; +safe_second_element(Other) -> Other. + +warnings(File, Ws) -> + case lists:append([W || {F, W} <- Ws, F =:= File]) of + [] -> []; + L -> {warnings, L} + end. + +expected(Test, Expected, Got, File) -> + ?t:format("~nTest ~p failed. ", [Test]), + expected(Expected, Got, File). + +expected(Expected, Got, File) -> + ?t:format("Expected~n ~p~n, but got~n ~p~n", [Expected, Got]), + fail(File). + +fail(Source) -> + io:format("failed~n"), + ?t:fail({failed,testcase,on,Source}). + +%% Copied from global_SUITE.erl. + +start_node_rel(Name, Rel, How) -> + {Release, Compat} = case Rel of + this -> + {[this], "+R8"}; + Rel when is_atom(Rel) -> + {[{release, atom_to_list(Rel)}], ""}; + RelList -> + {RelList, ""} + end, + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line Res = test_server:start_node(Name, How, + [{args, + Compat ++ + " -kernel net_setuptime 100 " + " -pa " ++ Pa}, + {erl, Release}]), + Res. + +stop_node(Node) -> + ?line ?t:stop_node(Node). + +install_error_logger() -> + error_logger:add_report_handler(?MODULE, self()). + +uninstall_error_logger() -> + error_logger:delete_report_handler(?MODULE). + +read_error_logger() -> + receive + {error, Why} -> + {error, Why}; + {info, Why} -> + {info, Why}; + {error, Pid, Tuple} -> + {error, Pid, Tuple} + after 1000 -> + ?line io:format("No reply after 1 s\n", []), + ?line ?t:fail() + end. + +%%----------------------------------------------------------------- +%% The error_logger handler used. +%% (Copied from stdlib/test/proc_lib_SUITE.erl.) +%%----------------------------------------------------------------- +init(Tester) -> + {ok, Tester}. + +handle_event({error, _GL, {_Pid, _Msg, [Why, _]}}, Tester) + when is_atom(Why) -> + Tester ! {error, Why}, + {ok, Tester}; +handle_event({error, _GL, {_Pid, _Msg, [P, T]}}, Tester) when is_pid(P) -> + Tester ! {error, P, T}, + {ok, Tester}; +handle_event({info_msg, _GL, {_Pid, _Msg, [Why, _]}}, Tester) -> + Tester ! {info, Why}, + {ok, Tester}; +handle_event(_Event, State) -> + {ok, State}. + +handle_info(_, State) -> + {ok, State}. + +handle_call(_Query, State) -> {ok, {error, bad_query}, State}. + +terminate(_Reason, State) -> + State. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/queue_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/queue_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/queue_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/queue_SUITE.erl 2009-11-20 13:30:48.000000000 +0000 @@ -0,0 +1,604 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(queue_SUITE). +-export([all/1]). + +-export([do/1, to_list/1, io_test/1, op_test/1, error/1, oops/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-include("test_server.hrl"). + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{watchdog, Dog} | Config]. +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(doc) -> + ["Test cases for queue."]; +all(suite) -> + [do, to_list, io_test, op_test, error, oops]. + +do(doc) -> + [""]; +do(suite) -> + []; +do(Config) when list(Config) -> + ?line L = [{in, 1}, + {in, 2}, + {out, {value, 1}}, + {in, 3}, + {out, {value, 2}}, + {out, {value, 3}}, + {out, empty} + ], + + ?line E = queue:new(), + ?line [] = queue:to_list(E), + ?line Q = do_queue(E, L), + ?line true = queue:is_empty(Q), + ?line 0 = queue:len(Q), + ok. + +to_list(doc) -> + ["OTP-2701"]; +to_list(suite) -> + []; +to_list(Config) when list(Config) -> + ?line E = queue:new(), + ?line Q = do_queue(E, [{in, 1}, + {in, 2}, + {in, 3}, + {out, {value, 1}}, + {in, 4}, + {in, 5}]), + ?line true = queue:is_queue(Q), + ?line 4 = queue:len(Q), + ?line case queue:to_list(Q) of + [2,3,4,5] -> + ok; + Other1 -> + test_server:fail(Other1) + end, + ok. + +do_queue(Q, []) -> + Q; +do_queue(Q, [E | Rest]) -> + do_queue(do_queue_1(E, Q), Rest). + +do_queue_1({in, E}, Q) -> + queue:in(E, Q); +do_queue_1({out, E}, Q) -> + case queue:out(Q) of + {E, Q1} -> + Q1; + Other -> + test_server:fail({"out failed", E, Q, Other}) + end. + + +io_test(doc) -> + "Test input and output"; +io_test(suite) -> + []; +io_test(Config) when list(Config) -> + E = queue:new(), + do_io_test(E), + ok. + +do_io_test(E) -> + ?line [4,3,5] = + io([snoc,snoc,head,head,head,cons,cons,snoc], E, 1), + ?line [5,3,4] = + io([cons,cons,daeh,daeh,daeh,snoc,snoc,cons], E, 1), + ?line [4,3,5] = + io([in,in,out,out,out,in_r,in_r,in], E, 1), + ?line [5,3,4] = + io([in_r,in_r,out_r,out_r,out_r,in,in,in_r], E, 1), + %% + ?line [] = + io([snoc,snoc,head,snoc,snoc,head,head,snoc,head,head], E, 1), + ?line [] = + io([cons,cons,daeh,cons,cons,daeh,daeh,cons,daeh,daeh], E, 1), + ?line [] = + io([in,in,out,in,in,out,out,in,out,out], E, 1), + ?line [] = + io([in_r,in_r,out_r,in_r,in_r,out_r,out_r,in_r,out_r,out_r], + E, 1), + %% + ?line [5,6] = + io([snoc,snoc,snoc,head,head,snoc,snoc,snoc,head,head], E, 1), + ?line [6,5] = + io([cons,cons,cons,daeh,daeh,cons,cons,cons,daeh,daeh], E, 1), + ?line [5,6] = + io([in,in,in,out,out,in,in,in,out,out], E, 1), + ?line [6,5] = + io([in_r,in_r,in_r,out_r,out_r,in_r,in_r,in_r,out_r,out_r], + E, 1), + %% + ?line [5] = + io([snoc,head,head,snoc,head,snoc,head,snoc,head,snoc], E, 1), + ?line [5] = + io([cons,daeh,daeh,cons,daeh,cons,daeh,cons,daeh,cons], E, 1), + ?line [5] = + io([in,out,out,in,out,in,out,in,out,in], E, 1), + ?line [5] = + io([in_r,out_r,out_r,in_r,out_r,in_r,out_r,in_r,out_r,in_r], + E, 1), + %% + ?line [] = + io([snoc,head,snoc,snoc,head,head,snoc,snoc,snoc,head,head,head], + E, 1), + ?line [] = + io([cons,daeh,cons,cons,daeh,daeh,cons,cons,cons,daeh,daeh,daeh], + E, 1), + ?line [] = + io([in,out,in,in,out,out,in,in,in,out,out,out], + E, 1), + ?line [] = + io([in_r,out_r,in_r,in_r,out_r,out_r,in_r,in_r,in_r,out_r,out_r,out_r], + E, 1), + %% + ?line [3] = io([cons,cons,cons,snoc,daeh,daeh,daeh], E, 1), + ?line [3] = io([snoc,snoc,snoc,cons,head,head,head], E, 1), + ?line [3] = io([in,in,in,in_r,out,out,out], E, 1), + ?line [3] = io([in_r,in_r,in_r,in,out_r,out_r,out_r], E, 1), + %% + ?line Q2 = queue:join(queue:cons(1, E),queue:cons(2, E)), + ?line Q1 = queue:reverse(Q2), + ?line [1] = io([head], Q1, 3), + ?line [1] = io([out], Q1, 3), + ?line [1] = io([daeh], Q2, 3), + ?line [1] = io([out_r], Q2, 3), +% ?line [2] = io([cons,cons,snoc,daeh,daeh], [], 1), +% ?line [2] = io([snoc,snoc,cons,head,head], [], 1), +% ?line [2] = io([in,in,in_r,out,out], [], 1), +% ?line [2] = io([in_r,in_r,in,out_r,out_r], [], 1), + %% + ?line [2] = + io([in,peek,peek_r,drop,in_r,peek,peek_r,in,peek,peek_r,drop_r], E, 1), + %% Malformed queues UGLY-GUTS-ALL-OVER-THE-PLACE + ?line [2,1] = io([peek], {[1,2],[]}, 1), + ?line [1,2] = io([peek_r], {[],[1,2]}, 1), + %% + ok. + +%% Perform a list of operations to a queue. +%% Keep a reference queue on the side; just a list. +%% Compare the read values between the queues. +%% Return the resulting queue as a list. +%% Inserted values are increments of the previously inserted. +io(Ops, Q, X) -> + io(Ops, Q, queue:to_list(Q), X). + +io([head | Tail], Q, [], X) -> + true = queue:is_empty(Q), + {'EXIT',{empty,_}} = (catch {ok,queue:head(Q)}), + {'EXIT',{empty,_}} = (catch {ok,queue:tail(Q)}), + io(Tail, Q, [], X); +io([head | Tail], Q, [H | T], X) -> + H = queue:head(Q), + false = queue:is_empty(Q), + io(Tail, queue:tail(Q), T, X); +io([daeh | Tail], Q, [], X) -> + true = queue:is_empty(Q), + {'EXIT',{empty,_}} = (catch {ok,queue:daeh(Q)}), + {'EXIT',{empty,_}} = (catch {ok,queue:liat(Q)}), + {'EXIT',{empty,_}} = (catch {ok,queue:lait(Q)}), + io(Tail, Q, [], X); +io([daeh | Tail], Q, QQ, X) -> + H = queue:daeh(Q), + false = queue:is_empty(Q), + [H | T] = lists:reverse(QQ), + io(Tail, queue:liat(Q), lists:reverse(T), X); +io([out | Tail], Q, [], X) -> + {empty, Q1} = queue:out(Q), + io(Tail, Q1, [], X); +io([out | Tail], Q, [H | T], X) -> + {{value,H}, Q1} = queue:out(Q), + io(Tail, Q1, T, X); +io([out_r | Tail], Q, [], X) -> + {empty, Q1} = queue:out_r(Q), + io(Tail, Q1, [], X); +io([out_r | Tail], Q, QQ, X) -> + {{value,H}, Q1} = queue:out_r(Q), + [H | T] = lists:reverse(QQ), + io(Tail, Q1, lists:reverse(T), X); +io([cons | Tail], Q, QQ, X) -> + io(Tail, queue:cons(X,Q), [X|QQ], X+1); +io([snoc | Tail], Q, QQ, X) -> + io(Tail, queue:snoc(Q,X), QQ++[X], X+1); +io([in_r | Tail], Q, QQ, X) -> + io(Tail, queue:in_r(X,Q), [X|QQ], X+1); +io([in | Tail], Q, QQ, X) -> + io(Tail, queue:in(X,Q), QQ++[X], X+1); +io([peek | Tail], Q, [], X) -> + empty = queue:peek(Q), + io(Tail, Q, [], X); +io([peek | Tail], Q, [H|_]=Q0, X) -> + {value,H} = queue:peek(Q), + io(Tail, Q, Q0, X); +io([peek_r | Tail], Q, [], X) -> + empty = queue:peek_r(Q), + io(Tail, Q, [], X); +io([peek_r | Tail], Q, Q0, X) -> + E = lists:last(Q0), + {value,E} = queue:peek_r(Q), + io(Tail, Q, Q0, X); +io([drop | Tail], Q, [], X) -> + try queue:drop(Q) of + V -> + test_server:fail({?MODULE,?LINE,V}) + catch + error:empty -> + io(Tail, Q, [], X) + end; +io([drop | Tail], Q, [_ | T], X) -> + Q1 = queue:drop(Q), + io(Tail, Q1, T, X); +io([drop_r | Tail], Q, [], X) -> + try queue:drop_r(Q) of + V -> + test_server:fail({?MODULE,?LINE,V}) + catch + error:empty -> + io(Tail, Q, [], X) + end; +io([drop_r | Tail], Q, L, X) -> + io:format("~p~n", [{drop_r,Tail,Q,L,X}]), + Q1 = queue:drop_r(Q), + [_ | T] = lists:reverse(L), + io:format("~p~n", [{drop_r,Q1,T}]), + io(Tail, Q1, lists:reverse(T), X); +io([], Q, QQ, _X) -> + QQ = queue:to_list(Q), + Length = length(QQ), + Length = queue:len(Q), + QQ. + + +op_test(doc) -> + "Test operations on whole queues"; +op_test(suite) -> + []; +op_test(Config) when list(Config) -> + do_op_test(fun id/1), + ok. + +do_op_test(F) -> + ?line Len = 50, + ?line Len2 = 2*Len, + ?line L1 = lists:seq(1, Len), + ?line L1r = lists:reverse(L1), + ?line L2 = lists:seq(Len+1, Len2), + ?line L2r = lists:reverse(L2), + ?line L3 = L1++L2, + ?line L3r = L2r++L1r, + ?line Q0 = F(queue:new()), + ?line [] = queue:to_list(Q0), + ?line Q0 = F(queue:from_list([])), + ?line Q1 = F(queue:from_list(L1)), + ?line Q2 = F(queue:from_list(L2)), + ?line Q3 = F(queue:from_list(L3)), + ?line Len = queue:len(Q1), + ?line Len = queue:len(Q2), + ?line Len2 = queue:len(Q3), + ?line L1 = queue:to_list(Q1), + ?line L2 = queue:to_list(Q2), + ?line L3 = queue:to_list(Q3), + ?line Q3b = queue:join(Q0, queue:join(queue:join(Q1, Q2), Q0)), + ?line L3 = queue:to_list(Q3b), + ?line {Q0, Q3New1} = queue:split(0, Q3), + ?line L3 = queue:to_list(Q3New1), + ?line {Q3New2, Q0} = queue:split(Len2, Q3), + ?line L3 = queue:to_list(Q3New2), + ?line {Q1a, Q2a} = queue:split(Len, Q3), + ?line L1 = queue:to_list(Q1a), + ?line L2 = queue:to_list(Q2a), + ?line {Q3c, Q3d} = queue:split(2, Q3), + ?line L3 = queue:to_list(Q3c) ++ queue:to_list(Q3d), + ?line {Q1b, Q2b} = queue:split(Len, Q3b), + ?line L1 = queue:to_list(Q1b), + ?line L2 = queue:to_list(Q2b), + ?line Len = queue:len(Q1b), + ?line Len = queue:len(Q2b), + ?line Len2 = queue:len(Q3b), + ?line Q1r = queue:reverse(Q1), + ?line Q2r = queue:reverse(Q2), + ?line Q1ar = queue:reverse(Q1a), + ?line Q2ar = queue:reverse(Q2a), + ?line Q1br = queue:reverse(Q1b), + ?line Q2br = queue:reverse(Q2b), + ?line Q3br = queue:reverse(Q3b), + ?line L1r = queue:to_list(Q1r), + ?line L1r = queue:to_list(Q1ar), + ?line L1r = queue:to_list(Q1br), + ?line L2r = queue:to_list(Q2r), + ?line L2r = queue:to_list(Q2ar), + ?line L2r = queue:to_list(Q2br), + ?line L3r = queue:to_list(Q3br), + ?line Len = queue:len(Q1br), + ?line Len = queue:len(Q2br), + ?line Len2 = queue:len(Q3br), + ?line false = queue:member([], Q0), + ?line false = queue:member(0, Q0), + ?line false = queue:member(0, Q1), + ?line false = queue:member([], Q1), + ?line true = queue:member(1, Q1), + ?line false = queue:member(1.0, Q1), + ?line true = queue:member(Len, Q1), + %% + %% Additional coverage. + ?line {MyL1r,MyL2r} = lists:split(Len-2, L1r), + ?line MyQ0r = queue:reverse(F(queue:from_list(L1))), + ?line {MyQ1r,MyQ2r} = queue:split(Len-2, MyQ0r), + ?line MyL1r = queue:to_list(MyQ1r), + ?line MyL2r = queue:to_list(MyQ2r), + ?line MyQ3r = queue:filter( + fun (X) when X rem 4 >= 2 -> false; + (X) when X rem 8 == 0 -> [float(X),{X}]; + (X) when X rem 2 >= 1 -> [{X}]; + (_) -> true + end, MyQ1r), + ?line MyL3r = lists:flatten( + [if X rem 8 == 0 -> [float(X),{X}]; + X rem 2 >= 1 -> {X}; + true -> X + end || X <- MyL1r, + X rem 4 < 2]), + ?line MyL3r = queue:to_list(MyQ3r), + ?line MyQ4 = F(queue:from_list([11,22,33,44])), + ?line [11,22] = queue:to_list(queue:filter(fun(X) when X < 27 -> true; + (_) -> [] end, MyQ4)), + ?line [33,44] = queue:to_list(queue:filter(fun(X) when X < 27 -> false; + (X) -> [X] end, MyQ4)), + %% + ok. + +error(doc) -> + "Test queue errors"; +error(suite) -> + []; +error(Config) when list(Config) -> + do_error(fun id/1, illegal_queue), + do_error(fun id/1, {[],illegal_queue}), + do_error(fun id/1, {illegal_queue,[17]}), + ok. + +trycatch(F, Args) -> + trycatch(queue, F, Args). + +trycatch(M, F, Args) -> + try apply(M, F, Args) of + V -> {value,V} + catch + C:R -> {C,R} + end. + +do_error(F, IQ) -> + ?line io:format("Illegal Queue: ~p~n", [IQ]), + %% + ?line {error,badarg} = trycatch(in, [1, IQ]), + ?line {error,badarg} = trycatch(out, [IQ]), + ?line {error,badarg} = trycatch(in_r ,[1, IQ]), + ?line {error,badarg} = trycatch(out_r ,[IQ]), + ?line {error,badarg} = trycatch(to_list ,[IQ]), + %% + ?line {error,badarg} = trycatch(from_list, [no_list]), + ?line {error,badarg} = trycatch(is_empty, [IQ]), + ?line {error,badarg} = trycatch(len, [IQ]), + %% + ?line {error,badarg} = trycatch(cons, [1, IQ]), + ?line {error,badarg} = trycatch(head, [IQ]), + ?line {error,badarg} = trycatch(tail, [IQ]), + %% + ?line {error,badarg} = trycatch(snoc, [IQ, 1]), + ?line {error,badarg} = trycatch(last, [IQ]), + ?line {error,badarg} = trycatch(daeh, [IQ]), + ?line {error,badarg} = trycatch(liat, [IQ]), + ?line {error,badarg} = trycatch(lait, [IQ]), + ?line {error,badarg} = trycatch(init, [IQ]), + %% + ?line {error,badarg} = trycatch(reverse, [IQ]), + ?line {error,badarg} = trycatch(join, [F(queue:new()), IQ]), + ?line {error,badarg} = trycatch(join, [IQ, F(queue:new())]), + ?line {error,badarg} = trycatch(split, [17, IQ]), + ?line {error,badarg} = trycatch(head, [IQ]), + %% + ?line Q0 = F(queue:new()), + ?line {error,badarg} = trycatch(split, [1, Q0]), + ?line {error,badarg} = trycatch(split, [2, queue:snoc(Q0, 1)]), + %% + ?line {value,false} = trycatch(is_queue, [IQ]), + ?line {error,badarg} = trycatch(get, [IQ]), + ?line {error,badarg} = trycatch(peek, [IQ]), + ?line {error,badarg} = trycatch(peek_r, [IQ]), + ?line {error,badarg} = trycatch(filter, [fun id/1, IQ]), + ?line {error,badarg} = trycatch(filter, [no_fun, Q0]), + %% + ?line {error,badarg} = trycatch(member, [1, IQ]), + ok. + +id(X) -> + X. + +oops(doc) -> + "Test queue errors"; +oops(suite) -> + []; +oops(Config) when list(Config) -> + ?line N = 3142, + ?line Optab = optab(), + ?line Seed0 = random:seed0(), + ?line {Is,Seed} = random_list(N, tuple_size(Optab), Seed0, []), + ?line io:format("~p ", [Is]), + ?line QA = queue:new(), + ?line QB = {[]}, + ?line emul([QA], [QB], Seed, [element(I, Optab) || I <- Is]). + +optab() -> + {{new,[], q, fun () -> {[]} end}, + {is_queue,[q], v, fun (_) -> true end}, + {is_empty,[q], v, fun (Q) -> + case Q of + {[]} -> true; + _ -> false + end end}, + {len,[q], v, fun ({L}) -> length(L) end}, + {to_list,[q], v, fun ({L}) -> L end}, + {from_list,[l], q, fun (L) -> {L} end}, + {in,[t,q], q, fun (X,{L}) -> {L++[X]} end}, + {in_r,[t,q], q, fun (X,{L}) -> {[X|L]} end}, + {out,[q], {v,q}, fun ({L}=Q) -> + case L of + [] -> {empty,Q}; + [X|T] -> {{value,X},{T}} + end + end}, + {out_r,[q], {v,q}, fun ({L}=Q) -> + case L of + [] -> {empty,Q}; + _ -> + [X|R] = lists:reverse(L), + T = lists:reverse(R), + {{value,X},{T}} + end + end}, + {get,[q], v, fun ({[]}) -> erlang:error(empty); + ({[H|_]}) -> H + end}, + {get_r,[q], v, fun ({[]}) -> erlang:error(empty); + ({L}) -> lists:last(L) + end}, + {peek,[q], v, fun ({[]}) -> empty; + ({[H|_]}) -> {value,H} + end}, + {peek_r,[q], v, fun ({[]}) -> empty; + ({L}) -> {value,lists:last(L)} + end}, + {drop,[q], q, fun ({[]}) -> erlang:error(empty); + ({[_|T]}) -> {T} + end}, + {drop_r,[q], q, fun ({[]}) -> erlang:error(empty); + ({L}) -> [_|R] = lists:reverse(L), + {lists:reverse(R)} + end}, + {reverse,[q], q, fun ({L}) -> {lists:reverse(L)} end}, + {join,[q,q], q, fun ({L1}, {L2}) -> {L1++L2} end}, + {split,[n,q], {q,q}, fun (N, {L}) -> {L1,L2} = lists:split(N, L), + {{L1},{L2}} end}, + {member,[t,q], v, fun (X, {L}) -> lists:member(X, L) end} + }. + +emul(_, _, _, []) -> + ok; +emul(QsA0, QsB0, Seed0, [{Op,Ts,S,Fun}|Ops]) -> + {AsA,Seed} = args(Ts, QsA0, Seed0, []), + {AsB,Seed} = args(Ts, QsB0, Seed0, []), + io:format("~n% ~w % ~p ", [Op,AsA]), + io:format("% ~p :", [AsB]), + XX = call({queue,Op}, AsA), + YY = call(Fun, AsB), + case {XX,YY} of + {{value,X},{value,Y}} -> + {[Qa|_]=QsA,[{Lb}|_]=QsB} = chk(QsA0, QsB0, S, X, Y), + case queue:to_list(Qa) of + Lb -> + io:format("|~p| ", [Lb]), + emul(QsA, QsB, Seed, Ops); + La -> + throw({to_list,[XX,YY,Op,AsA,AsB,La,Lb]}) + end; + {Exception,Exception} -> + io:format("!~p! ", [Exception]), + emul(QsA0, QsB0, Seed, Ops); + _ -> + throw({diff,[XX,YY,Op,AsA,AsB]}) + end. + +args([], _, Seed, R) -> + {lists:reverse(R),Seed}; +args([q|Ts], [Q|Qs]=Qss, Seed, R) -> + args(Ts, if Qs =:= [] -> Qss; true -> Qs end, Seed, [Q|R]); +args([l|Ts], Qs, Seed0, R) -> + {N,Seed1} = random:uniform_s(17, Seed0), + {L,Seed} = random_list(N, 4711, Seed1, []), + args(Ts, Qs, Seed, [L|R]); +args([t|Ts], Qs, Seed0, R) -> + {T,Seed} = random:uniform_s(4711, Seed0), + args(Ts, Qs, Seed, [T|R]); +args([n|Ts], Qs, Seed0, R) -> + {N,Seed} = random:uniform_s(17, Seed0), + args(Ts, Qs, Seed, [N|R]). + +random_list(0, _, Seed, R) -> + {R,Seed}; +random_list(N, M, Seed0, R) -> + {X,Seed} = random:uniform_s(M, Seed0), + random_list(N-1, M, Seed, [X|R]). + +call(Func, As) -> + try case Func of + {M,F} -> apply(M, F, As); + _ -> apply(Func, As) + end of + V -> + {value,V} + catch + Class:Reason -> + {Class,Reason} + end. + +chk(QsA, QsB, v, X, X) -> + io:format("<~p> ", [X]), + {QsA,QsB}; +chk(_, _, v, X, Y) -> + throw({diff,v,[X,Y]}); +chk(QsA, QsB, q, Qa, {Lb}=Qb) -> + case queue:to_list(Qa) of + Lb -> + io:format("|~p| ", [Lb]), + {[Qa|QsA],[Qb|QsB]}; + La -> + throw({diff,q,[Qa,La,Lb]}) + end; +chk(QsA, QsB, T, X, Y) + when tuple_size(T) =:= tuple_size(X), tuple_size(T) =:= tuple_size(Y) -> + io:format("{"), + try + chk_tuple(QsA, QsB, T, X, Y, 1) + after + io:format("}") + end; +chk(_, _, T, X, Y) + when is_tuple(T), is_tuple(X), is_tuple(Y) -> + throw({diff,T,[X,Y]}). + +chk_tuple(QsA, QsB, T, _, _, N) when N > tuple_size(T) -> + {QsA,QsB}; +chk_tuple(QsA0, QsB0, T, X, Y, N) -> + {QsA,QsB} = chk(QsA0, QsB0, element(N, T), element(N, X), element(N, Y)), + chk_tuple(QsA, QsB, T, X, Y, N+1). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/random_iolist.erl erlang-13.b.3-dfsg/lib/stdlib/test/random_iolist.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/random_iolist.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/random_iolist.erl 2009-11-20 13:33:04.000000000 +0000 @@ -0,0 +1,195 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% +%% Generate random iolists to be used by crypto_SUITE.erl +%% + +-module(random_iolist). + +-export([run/3, run2/3, standard_seed/0, compare/3, compare2/3, + random_iolist/1]). + +run(Iter,Fun1,Fun2) -> + standard_seed(), + compare(Iter,Fun1,Fun2). + +run2(Iter,Fun1,Fun2) -> + standard_seed(), + compare2(Iter,Fun1,Fun2). + +random_byte() -> + random:uniform(256) - 1. + +random_list(0,Acc) -> + Acc; +random_list(N,Acc) -> + random_list(N-1,[random_byte() | Acc]). + +random_binary(N) -> + B = list_to_binary(random_list(N,[])), + case {random:uniform(2),size(B)} of + {2,M} when M > 1 -> + S = M-1, + <<_:3,C:S/binary,_:5>> = B, + C; + _ -> + B + end. +random_list(N) -> + random_list(N,[]). + +front() -> + case random:uniform(10) of + 10 -> + false; + _ -> + true + end. + +any_type() -> + case random:uniform(10) of + 1 -> + list; + 2 -> + binary; + 3 -> + iolist; + _ -> + byte + end. + +tail_type() -> + case random:uniform(5) of + 1 -> + list; + 2 -> + iolist; + _ -> + binary + end. + +random_length(N) -> + UpperLimit = 255, + case N of + M when M > UpperLimit -> + random:uniform(UpperLimit+1) - 1; + _ -> + random:uniform(N+1) - 1 + end. + +random_iolist(0,Acc) -> + Acc; +random_iolist(N,Acc) -> + case front() of + true -> + case any_type() of + list -> + X = random_length(N), + L = random_list(X), + random_iolist(N-X,[L|Acc]); + binary -> + X = random_length(N), + B = random_binary(X), + random_iolist(N-X,[B|Acc]); + iolist -> + X = random_length(N), + B = random_iolist(X), + random_iolist(N-X,[B|Acc]); + byte -> + C = random_byte(), + random_iolist(N-1,[C|Acc]) + end; + false -> + case tail_type() of + list -> + X = random_length(N), + L = random_list(X), + random_iolist(N-X,[Acc|L]); + binary -> + X = random_length(N), + B = random_binary(X), + random_iolist(N-X,[Acc|B]); + iolist -> + X = random_length(N), + B = random_iolist(X), + random_iolist(N-X,[Acc|B]) + end + end. + +random_iolist(N) -> + random_iolist(N,[]). + + +standard_seed() -> + random:seed(1201,855653,380975). + +do_comp(List,F1,F2) -> + X = F1(List), + Y = F2(List), + case X =:= Y of + false -> + exit({not_matching,List,X,Y}); + _ -> + true + end. + +do_comp(List,List2,F1,F2) -> + X = F1(List,List2), + Y = F2(List,List2), + case X =:= Y of + false -> + exit({not_matching,List,List2,X,Y}); + _ -> + true + end. + +compare(0,Fun1,Fun2) -> + do_comp(<<>>,Fun1,Fun2), + do_comp([],Fun1,Fun2), + do_comp([[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],Fun1,Fun2), + true; + +compare(N,Fun1,Fun2) -> + L = random_iolist(N), + do_comp(L,Fun1,Fun2), + compare(N-1,Fun1,Fun2). + +compare2(0,Fun1,Fun2) -> + L = random_iolist(100), + do_comp(<<>>,L,Fun1,Fun2), + do_comp(L,<<>>,Fun1,Fun2), + do_comp(<<>>,<<>>,Fun1,Fun2), + do_comp([],L,Fun1,Fun2), + do_comp(L,[],Fun1,Fun2), + do_comp([],[],Fun1,Fun2), + do_comp([[]|<<>>],L,Fun1,Fun2), + do_comp(L,[[]|<<>>],Fun1,Fun2), + do_comp([[]|<<>>],[[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],L,Fun1,Fun2), + do_comp(L,[<<>>,[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],[<<>>,[]|<<>>],Fun1,Fun2), + true; + +compare2(N,Fun1,Fun2) -> + L = random_iolist(N), + L2 = random_iolist(N), + do_comp(L,L2,Fun1,Fun2), + compare2(N-1,Fun1,Fun2). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/random_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/random_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/random_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/random_SUITE.erl 2009-06-05 13:53:20.000000000 +0100 @@ -0,0 +1,110 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(random_SUITE). +-export([all/1]). + +-export([interval_1/1, seed0/1, seed/1]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-include("test_server.hrl"). + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + [{watchdog, Dog} | Config]. +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(doc) -> + ["Test cases for random."]; +all(suite) -> + [interval_1, seed0, seed]. + +seed0(doc) -> + ["Test that seed is set implicitly, and always the same."]; +seed0(suite) -> + []; +seed0(Config) when is_list(Config) -> + ?line Self = self(), + ?line _ = spawn(fun() -> Self ! random:uniform() end), + ?line F1 = receive + Fa -> Fa + end, + ?line _ = spawn(fun() -> random:seed(), + Self ! random:uniform() end), + ?line F2 = receive + Fb -> Fb + end, + ?line F1 = F2, + ok. + +seed(doc) -> + ["Test that seed/1 and seed/3 is equivalent."]; +seed(suite) -> + []; +seed(Config) when is_list(Config) -> + ?line Self = self(), + ?line Seed = {S1, S2, S3} = now(), + ?line _ = spawn(fun() -> + random:seed(S1,S2,S3), + Rands = lists:foldl(fun + (_, Out) -> [random:uniform(10000)|Out] + end, [], lists:seq(1,100)), + Self ! {seed_test, Rands} + end), + ?line Rands1 = receive {seed_test, R1s} -> R1s end, + ?line _ = spawn(fun() -> + random:seed(Seed), + Rands = lists:foldl(fun + (_, Out) -> [random:uniform(10000)|Out] + end, [], lists:seq(1,100)), + Self ! {seed_test, Rands} + end), + ?line Rands2 = receive {seed_test, R2s} -> R2s end, + ?line Rands1 = Rands2, + ok. + + +interval_1(doc) -> + ["Check that uniform/1 returns values within the proper interval."]; +interval_1(suite) -> + []; +interval_1(Config) when is_list(Config) -> + ?line Top = 7, + ?line N = 10, + ?line check_interval(N, Top), + ok. + +check_interval(0, _) -> ok; +check_interval(N, Top) -> + X = random:uniform(Top), + if + X < 1 -> + test_server:fail(too_small); + X > Top -> + test_server:fail(too_large); + true -> + ok + end, + check_interval(N-1, Top). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/random_unicode_list.erl erlang-13.b.3-dfsg/lib/stdlib/test/random_unicode_list.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/random_unicode_list.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/random_unicode_list.erl 2009-11-20 13:32:46.000000000 +0000 @@ -0,0 +1,270 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% +%% Generate random iolists to be used by crypto_SUITE.erl +%% + +-module(random_unicode_list). + +-export([run/3, run/4, run2/3, standard_seed/0, compare/4, compare2/3, + random_unicode_list/2]). + +run(I,F1,F2) -> + run(I,F1,F2,utf8). +run(Iter,Fun1,Fun2,Enc) -> + standard_seed(), + compare(Iter,Fun1,Fun2,Enc). + +run2(Iter,Fun1,Fun2) -> + standard_seed(), + compare2(Iter,Fun1,Fun2). + +int_to_utf8(I) when I =< 16#7F -> + <>; +int_to_utf8(I) when I =< 16#7FF -> + B2 = I, + B1 = (I bsr 6), + <<1:1,1:1,0:1,B1:5,1:1,0:1,B2:6>>; +int_to_utf8(I) when I =< 16#FFFF -> + B3 = I, + B2 = (I bsr 6), + B1 = (I bsr 12), + <<1:1,1:1,1:1,0:1,B1:4,1:1,0:1,B2:6,1:1,0:1,B3:6>>; +int_to_utf8(I) when I =< 16#3FFFFF -> + B4 = I, + B3 = (I bsr 6), + B2 = (I bsr 12), + B1 = (I bsr 18), + <<1:1,1:1,1:1,1:1,0:1,B1:3,1:1,0:1,B2:6,1:1,0:1,B3:6,1:1,0:1,B4:6>>; +int_to_utf8(I) when I =< 16#3FFFFFF -> + B5 = I, + B4 = (I bsr 6), + B3 = (I bsr 12), + B2 = (I bsr 18), + B1 = (I bsr 24), + <<1:1,1:1,1:1,1:1,1:1,0:1,B1:2,1:1,0:1,B2:6,1:1,0:1,B3:6,1:1,0:1,B4:6, + 1:1,0:1,B5:6>>. + +int_to_utf16_big(I) when I < 16#10000 -> + <>; +int_to_utf16_big(I) -> + I2 = I - 16#10000, + B1 = 16#D800 bor (I2 bsr 10), + B2 = 16#DC00 bor (I2 band 16#3FF), + <>. +int_to_utf16_little(I) when I < 16#10000 -> + <>; +int_to_utf16_little(I) -> + I2 = I - 16#10000, + B1 = 16#D800 bor (I2 bsr 10), + B2 = 16#DC00 bor (I2 band 16#3FF), + <>. +int_to_utf32_big(I) -> + <>. +int_to_utf32_little(I) -> + <>. + +id(I) -> I. + +random_char() -> + case random:uniform(16#10FFFF+1) - 1 of + X when X >= 16#D800, + X =< 16#DFFF -> + random_char(); + Y -> + Y + end. + +random_list(0,Acc) -> + Acc; +random_list(N,Acc) -> + random_list(N-1,[random_char() | Acc]). + +int_to(utf8,X) -> + int_to_utf8(X); +int_to({utf16,big},X) -> + int_to_utf16_big(X); +int_to({utf16,little},X) -> + int_to_utf16_little(X); +int_to({utf32,big},X) -> + int_to_utf32_big(X); +int_to({utf32,little},X) -> + int_to_utf32_little(X). + + +random_binary(N,Enc) -> + L = random_list(N,[]), + B = iolist_to_binary(lists:map(fun(X) -> + int_to(Enc,X) + end, + L)), + case {random:uniform(3),size(B)} of + {2,M} when M > 1 -> + B2 = id(<<1:3,B/binary,1:5>>), + <<_:3,C:M/binary,_:5>> = B2, + C; + {3,M} when M > 1 -> + X = random:uniform(M+1)-1, + <> = B, + [B1,B2]; + _ -> + B + end. +random_list(N) -> + random_list(N,[]). + +front() -> + case random:uniform(10) of + 10 -> + false; + _ -> + true + end. + +any_type() -> + case random:uniform(10) of + 1 -> + list; + 2 -> + binary; + 3 -> + iolist; + _ -> + char + end. + +tail_type() -> + case random:uniform(5) of + 1 -> + list; + 2 -> + iolist; + _ -> + binary + end. + +random_length(N) -> + UpperLimit = 255, + case N of + M when M > UpperLimit -> + random:uniform(UpperLimit+1) - 1; + _ -> + random:uniform(N+1) - 1 + end. + +random_unicode_list(0,Acc,_Enc) -> + Acc; +random_unicode_list(N,Acc,Enc) -> + case front() of + true -> + case any_type() of + list -> + X = random_length(N), + L = random_list(X), + random_unicode_list(N-X,[L|Acc],Enc); + binary -> + X = random_length(N), + B = random_binary(X,Enc), + random_unicode_list(N-X,[B|Acc],Enc); + iolist -> + X = random_length(N), + B = random_unicode_list(X,Enc), + random_unicode_list(N-X,[B|Acc],Enc); + char -> + C = random_char(), + random_unicode_list(N-1,[C|Acc],Enc) + end; + false -> + case tail_type() of + list -> + X = random_length(N), + L = random_list(X), + random_unicode_list(N-X,[Acc|L],Enc); + binary -> + X = random_length(N), + B = random_binary(X,Enc), + random_unicode_list(N-X,[Acc|B],Enc); + iolist -> + X = random_length(N), + B = random_unicode_list(X,Enc), + random_unicode_list(N-X,[Acc|B],Enc) + end + end. + +random_unicode_list(N,Enc) -> + random_unicode_list(N,[],Enc). + + +standard_seed() -> + random:seed(1201,855653,380975). + +do_comp(List,F1,F2) -> + X = F1(List), + Y = F2(List), + case X =:= Y of + false -> + exit({not_matching,List,X,Y}); + _ -> + true + end. + +do_comp(List,List2,F1,F2) -> + X = F1(List,List2), + Y = F2(List,List2), + case X =:= Y of + false -> + exit({not_matching,List,List2,X,Y}); + _ -> + true + end. + +compare(0,Fun1,Fun2,_Enc) -> + do_comp(<<>>,Fun1,Fun2), + do_comp([],Fun1,Fun2), + do_comp([[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],Fun1,Fun2), + true; + +compare(N,Fun1,Fun2,Enc) -> + L = random_unicode_list(N,Enc), + do_comp(L,Fun1,Fun2), + compare(N-1,Fun1,Fun2,Enc). + +compare2(0,Fun1,Fun2) -> + L = random_unicode_list(100,utf8), + do_comp(<<>>,L,Fun1,Fun2), + do_comp(L,<<>>,Fun1,Fun2), + do_comp(<<>>,<<>>,Fun1,Fun2), + do_comp([],L,Fun1,Fun2), + do_comp(L,[],Fun1,Fun2), + do_comp([],[],Fun1,Fun2), + do_comp([[]|<<>>],L,Fun1,Fun2), + do_comp(L,[[]|<<>>],Fun1,Fun2), + do_comp([[]|<<>>],[[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],L,Fun1,Fun2), + do_comp(L,[<<>>,[]|<<>>],Fun1,Fun2), + do_comp([<<>>,[]|<<>>],[<<>>,[]|<<>>],Fun1,Fun2), + true; + +compare2(N,Fun1,Fun2) -> + L = random_unicode_list(N,utf8), + L2 = random_unicode_list(N,utf8), + do_comp(L,L2,Fun1,Fun2), + compare2(N-1,Fun1,Fun2). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput1 erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput1 --- erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput1 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput1 2009-03-12 12:21:52.000000000 +0000 @@ -0,0 +1,6608 @@ +/the quick brown fox/ + the quick brown fox + 0: the quick brown fox + The quick brown FOX +No match + What do you know about the quick brown fox? + 0: the quick brown fox + What do you know about THE QUICK BROWN FOX? +No match + +/The quick brown fox/i + the quick brown fox + 0: the quick brown fox + The quick brown FOX + 0: The quick brown FOX + What do you know about the quick brown fox? + 0: the quick brown fox + What do you know about THE QUICK BROWN FOX? + 0: THE QUICK BROWN FOX + +/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ + abcd\t\n\r\f\a\e9;\$\\?caxyz + 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz + +/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ + abxyzpqrrrabbxyyyypqAzz + 0: abxyzpqrrrabbxyyyypqAzz + abxyzpqrrrabbxyyyypqAzz + 0: abxyzpqrrrabbxyyyypqAzz + aabxyzpqrrrabbxyyyypqAzz + 0: aabxyzpqrrrabbxyyyypqAzz + aaabxyzpqrrrabbxyyyypqAzz + 0: aaabxyzpqrrrabbxyyyypqAzz + aaaabxyzpqrrrabbxyyyypqAzz + 0: aaaabxyzpqrrrabbxyyyypqAzz + abcxyzpqrrrabbxyyyypqAzz + 0: abcxyzpqrrrabbxyyyypqAzz + aabcxyzpqrrrabbxyyyypqAzz + 0: aabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypAzz + 0: aaabcxyzpqrrrabbxyyyypAzz + aaabcxyzpqrrrabbxyyyypqAzz + 0: aaabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqAzz + aaabcxyzpqrrrabbxyyyypqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz + aaaabcxyzpqrrrabbxyyyypqAzz + 0: aaaabcxyzpqrrrabbxyyyypqAzz + abxyzzpqrrrabbxyyyypqAzz + 0: abxyzzpqrrrabbxyyyypqAzz + aabxyzzzpqrrrabbxyyyypqAzz + 0: aabxyzzzpqrrrabbxyyyypqAzz + aaabxyzzzzpqrrrabbxyyyypqAzz + 0: aaabxyzzzzpqrrrabbxyyyypqAzz + aaaabxyzzzzpqrrrabbxyyyypqAzz + 0: aaaabxyzzzzpqrrrabbxyyyypqAzz + abcxyzzpqrrrabbxyyyypqAzz + 0: abcxyzzpqrrrabbxyyyypqAzz + aabcxyzzzpqrrrabbxyyyypqAzz + 0: aabcxyzzzpqrrrabbxyyyypqAzz + aaabcxyzzzzpqrrrabbxyyyypqAzz + 0: aaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbxyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz + aaabcxyzpqrrrabbxyyyypABzz + 0: aaabcxyzpqrrrabbxyyyypABzz + aaabcxyzpqrrrabbxyyyypABBzz + 0: aaabcxyzpqrrrabbxyyyypABBzz + >>>aaabxyzpqrrrabbxyyyypqAzz + 0: aaabxyzpqrrrabbxyyyypqAzz + >aaaabxyzpqrrrabbxyyyypqAzz + 0: aaaabxyzpqrrrabbxyyyypqAzz + >>>>abcxyzpqrrrabbxyyyypqAzz + 0: abcxyzpqrrrabbxyyyypqAzz + *** Failers +No match + abxyzpqrrabbxyyyypqAzz +No match + abxyzpqrrrrabbxyyyypqAzz +No match + abxyzpqrrrabxyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyypqAzz +No match + aaabcxyzpqrrrabbxyyyypqqqqqqqAzz +No match + +/^(abc){1,2}zz/ + abczz + 0: abczz + 1: abc + abcabczz + 0: abcabczz + 1: abc + *** Failers +No match + zz +No match + abcabcabczz +No match + >>abczz +No match + +/^(b+?|a){1,2}?c/ + bc + 0: bc + 1: b + bbc + 0: bbc + 1: b + bbbc + 0: bbbc + 1: bb + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + aac + 0: aac + 1: a + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + 1: bbbbbbbbbbb + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + 1: a + *** Failers +No match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}c/ + bc + 0: bc + 1: b + bbc + 0: bbc + 1: bb + bbbc + 0: bbbc + 1: bbb + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + aac + 0: aac + 1: a + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + 1: bbbbbbbbbbb + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + 1: a + *** Failers +No match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}?bc/ + bbc + 0: bbc + 1: b + +/^(b*|ba){1,2}?bc/ + babc + 0: babc + 1: ba + bbabc + 0: bbabc + 1: ba + bababc + 0: bababc + 1: ba + *** Failers +No match + bababbc +No match + babababc +No match + +/^(ba|b*){1,2}?bc/ + babc + 0: babc + 1: ba + bbabc + 0: bbabc + 1: ba + bababc + 0: bababc + 1: ba + *** Failers +No match + bababbc +No match + babababc +No match + +/^\ca\cA\c[\c{\c:/ + \x01\x01\e;z + 0: \x01\x01\x1b;z + +/^[ab\]cde]/ + athing + 0: a + bthing + 0: b + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e + *** Failers +No match + fthing +No match + [thing +No match + \\thing +No match + +/^[]cde]/ + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e + *** Failers +No match + athing +No match + fthing +No match + +/^[^ab\]cde]/ + fthing + 0: f + [thing + 0: [ + \\thing + 0: \ + *** Failers + 0: * + athing +No match + bthing +No match + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^[^]cde]/ + athing + 0: a + fthing + 0: f + *** Failers + 0: * + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^\/ + + 0: \x81 + +/^ÿ/ + ÿ + 0: \xff + +/^[0-9]+$/ + 0 + 0: 0 + 1 + 0: 1 + 2 + 0: 2 + 3 + 0: 3 + 4 + 0: 4 + 5 + 0: 5 + 6 + 0: 6 + 7 + 0: 7 + 8 + 0: 8 + 9 + 0: 9 + 10 + 0: 10 + 100 + 0: 100 + *** Failers +No match + abc +No match + +/^.*nter/ + enter + 0: enter + inter + 0: inter + uponter + 0: uponter + +/^xxx[0-9]+$/ + xxx0 + 0: xxx0 + xxx1234 + 0: xxx1234 + *** Failers +No match + xxx +No match + +/^.+[0-9][0-9][0-9]$/ + x123 + 0: x123 + xx123 + 0: xx123 + 123456 + 0: 123456 + *** Failers +No match + 123 +No match + x1234 + 0: x1234 + +/^.+?[0-9][0-9][0-9]$/ + x123 + 0: x123 + xx123 + 0: xx123 + 123456 + 0: 123456 + *** Failers +No match + 123 +No match + x1234 + 0: x1234 + +/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ + abc!pqr=apquxz.ixr.zzz.ac.uk + 0: abc!pqr=apquxz.ixr.zzz.ac.uk + 1: abc + 2: pqr + *** Failers +No match + !pqr=apquxz.ixr.zzz.ac.uk +No match + abc!=apquxz.ixr.zzz.ac.uk +No match + abc!pqr=apquxz:ixr.zzz.ac.uk +No match + abc!pqr=apquxz.ixr.zzz.ac.ukk +No match + +/:/ + Well, we need a colon: somewhere + 0: : + *** Fail if we don't +No match + +/([\da-f:]+)$/i + 0abc + 0: 0abc + 1: 0abc + abc + 0: abc + 1: abc + fed + 0: fed + 1: fed + E + 0: E + 1: E + :: + 0: :: + 1: :: + 5f03:12C0::932e + 0: 5f03:12C0::932e + 1: 5f03:12C0::932e + fed def + 0: def + 1: def + Any old stuff + 0: ff + 1: ff + *** Failers +No match + 0zzz +No match + gzzz +No match + fed\x20 +No match + Any old rubbish +No match + +/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ + .1.2.3 + 0: .1.2.3 + 1: 1 + 2: 2 + 3: 3 + A.12.123.0 + 0: A.12.123.0 + 1: 12 + 2: 123 + 3: 0 + *** Failers +No match + .1.2.3333 +No match + 1.2.3 +No match + 1234.2.3 +No match + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 0: 1 IN SOA non-sp1 non-sp2( + 1: 1 + 2: non-sp1 + 3: non-sp2 + 1 IN SOA non-sp1 non-sp2 ( + 0: 1 IN SOA non-sp1 non-sp2 ( + 1: 1 + 2: non-sp1 + 3: non-sp2 + *** Failers +No match + 1IN SOA non-sp1 non-sp2( +No match + +/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ + a. + 0: a. + Z. + 0: Z. + 2. + 0: 2. + ab-c.pq-r. + 0: ab-c.pq-r. + 1: .pq-r + sxk.zzz.ac.uk. + 0: sxk.zzz.ac.uk. + 1: .uk + x-.y-. + 0: x-.y-. + 1: .y- + *** Failers +No match + -abc.peq. +No match + +/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ + *.a + 0: *.a + *.b0-a + 0: *.b0-a + 1: 0-a + *.c3-b.c + 0: *.c3-b.c + 1: 3-b + 2: .c + *.c-a.b-c + 0: *.c-a.b-c + 1: -a + 2: .b-c + 3: -c + *** Failers +No match + *.0 +No match + *.a- +No match + *.a-b.c- +No match + *.c-a.0-c +No match + +/^(?=ab(de))(abd)(e)/ + abde + 0: abde + 1: de + 2: abd + 3: e + +/^(?!(ab)de|x)(abd)(f)/ + abdf + 0: abdf + 1: + 2: abd + 3: f + +/^(?=(ab(cd)))(ab)/ + abcd + 0: ab + 1: abcd + 2: cd + 3: ab + +/^[\da-f](\.[\da-f])*$/i + a.b.c.d + 0: a.b.c.d + 1: .d + A.B.C.D + 0: A.B.C.D + 1: .D + a.b.c.1.2.3.C + 0: a.b.c.1.2.3.C + 1: .C + +/^\".*\"\s*(;.*)?$/ + \"1234\" + 0: "1234" + \"abcd\" ; + 0: "abcd" ; + 1: ; + \"\" ; rhubarb + 0: "" ; rhubarb + 1: ; rhubarb + *** Failers +No match + \"1234\" : things +No match + +/^$/ + \ + 0: + *** Failers +No match + +/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x + ab c + 0: ab c + *** Failers +No match + abc +No match + ab cde +No match + +/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ + ab c + 0: ab c + *** Failers +No match + abc +No match + ab cde +No match + +/^ a\ b[c ]d $/x + a bcd + 0: a bcd + a b d + 0: a b d + *** Failers +No match + abcd +No match + ab d +No match + +/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + 1: abc + 2: bc + 3: c + 4: def + 5: ef + 6: f + 7: hij + 8: ij + 9: j +10: klm +11: lm +12: m + +/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + 1: bc + 2: c + 3: ef + 4: f + 5: ij + 6: j + 7: lm + 8: m + +/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ + a+ Z0+\x08\n\x1d\x12 + 0: a+ Z0+\x08\x0a\x1d\x12 + +/^[.^$|()*+?{,}]+/ + .^\$(*+)|{?,?} + 0: .^$(*+)|{?,?} + +/^a*\w/ + z + 0: z + az + 0: az + aaaz + 0: aaaz + a + 0: a + aa + 0: aa + aaaa + 0: aaaa + a+ + 0: a + aa+ + 0: aa + +/^a*?\w/ + z + 0: z + az + 0: a + aaaz + 0: a + a + 0: a + aa + 0: a + aaaa + 0: a + a+ + 0: a + aa+ + 0: a + +/^a+\w/ + az + 0: az + aaaz + 0: aaaz + aa + 0: aa + aaaa + 0: aaaa + aa+ + 0: aa + +/^a+?\w/ + az + 0: az + aaaz + 0: aa + aa + 0: aa + aaaa + 0: aa + aa+ + 0: aa + +/^\d{8}\w{2,}/ + 1234567890 + 0: 1234567890 + 12345678ab + 0: 12345678ab + 12345678__ + 0: 12345678__ + *** Failers +No match + 1234567 +No match + +/^[aeiou\d]{4,5}$/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 12345 + aaaaa + 0: aaaaa + *** Failers +No match + 123456 +No match + +/^[aeiou\d]{4,5}?/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 1234 + aaaaa + 0: aaaa + 123456 + 0: 1234 + +/\A(abc|def)=(\1){2,3}\Z/ + abc=abcabc + 0: abc=abcabc + 1: abc + 2: abc + def=defdefdef + 0: def=defdefdef + 1: def + 2: def + *** Failers +No match + abc=defdef +No match + +/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ + abcdefghijkcda2 + 0: abcdefghijkcda2 + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: cd + abcdefghijkkkkcda2 + 0: abcdefghijkkkkcda2 + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: cd + +/(cat(a(ract|tonic)|erpillar)) \1()2(3)/ + cataract cataract23 + 0: cataract cataract23 + 1: cataract + 2: aract + 3: ract + 4: + 5: 3 + catatonic catatonic23 + 0: catatonic catatonic23 + 1: catatonic + 2: atonic + 3: tonic + 4: + 5: 3 + caterpillar caterpillar23 + 0: caterpillar caterpillar23 + 1: caterpillar + 2: erpillar + 3: + 4: + 5: 3 + + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + 1: abcd + +/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + 1: Sep + From abcd Mon Sep 1 12:33:02 1997 + 0: From abcd Mon Sep 1 12:33 + 1: Sep + *** Failers +No match + From abcd Sep 01 12:33:02 1997 +No match + +/^12.34/s + 12\n34 + 0: 12\x0a34 + 12\r34 + 0: 12\x0d34 + +/\w+(?=\t)/ + the quick brown\t fox + 0: brown + +/foo(?!bar)(.*)/ + foobar is foolish see? + 0: foolish see? + 1: lish see? + +/(?:(?!foo)...|^.{0,2})bar(.*)/ + foobar crowbar etc + 0: rowbar etc + 1: etc + barrel + 0: barrel + 1: rel + 2barrel + 0: 2barrel + 1: rel + A barrel + 0: A barrel + 1: rel + +/^(\D*)(?=\d)(?!123)/ + abc456 + 0: abc + 1: abc + *** Failers +No match + abc123 +No match + +/^1234(?# test newlines + inside)/ + 1234 + 0: 1234 + +/^1234 #comment in extended re + /x + 1234 + 0: 1234 + +/#rhubarb + abcd/x + abcd + 0: abcd + +/^abcd#rhubarb/x + abcd + 0: abcd + +/^(a)\1{2,3}(.)/ + aaab + 0: aaab + 1: a + 2: b + aaaab + 0: aaaab + 1: a + 2: b + aaaaab + 0: aaaaa + 1: a + 2: a + aaaaaab + 0: aaaaa + 1: a + 2: a + +/(?!^)abc/ + the abc + 0: abc + *** Failers +No match + abc +No match + +/(?=^)abc/ + abc + 0: abc + *** Failers +No match + the abc +No match + +/^[ab]{1,3}(ab*|b)/ + aabbbbb + 0: aabb + 1: b + +/^[ab]{1,3}?(ab*|b)/ + aabbbbb + 0: aabbbbb + 1: abbbbb + +/^[ab]{1,3}?(ab*?|b)/ + aabbbbb + 0: aa + 1: a + +/^[ab]{1,3}(ab*?|b)/ + aabbbbb + 0: aabb + 1: b + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + user\@dom.ain + 0: user@dom.ain + \"A. Other\" (a comment) + 0: "A. Other" (a comment) + A. Other (a comment) + 0: Other (a comment) + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +# leading word +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces +(?: +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +| +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +) # "special" comment or quoted string +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" +)* +< +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +) +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + user\@dom.ain + 0: user@dom.ain + \"A. Other\" (a comment) + 0: "A. Other" + A. Other (a comment) + 0: Other + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + A missing angle ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff + +/P[^*]TAIRE[^*]{1,6}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/P[^*]TAIRE[^*]{1,}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/(\.\d\d[1-9]?)\d+/ + 1.230003938 + 0: .230003938 + 1: .23 + 1.875000282 + 0: .875000282 + 1: .875 + 1.235 + 0: .235 + 1: .23 + +/(\.\d\d((?=0)|\d(?=\d)))/ + 1.230003938 + 0: .23 + 1: .23 + 2: + 1.875000282 + 0: .875 + 1: .875 + 2: 5 + *** Failers +No match + 1.235 +No match + +/a(?)b/ + ab + 0: ab + +/\b(foo)\s+(\w+)/i + Food is on the foo table + 0: foo table + 1: foo + 2: table + +/foo(.*)bar/ + The food is under the bar in the barn. + 0: food is under the bar in the bar + 1: d is under the bar in the + +/foo(.*?)bar/ + The food is under the bar in the barn. + 0: food is under the bar + 1: d is under the + +/(.*)(\d*)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 53147 + 2: + +/(.*)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: 7 + +/(.*?)(\d*)/ + I have 2 numbers: 53147 + 0: + 1: + 2: + +/(.*?)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 + 1: I have + 2: 2 + +/(.*)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: 7 + +/(.*?)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/(.*)\b(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/(.*\D)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/^\D*(?!123)/ + ABC123 + 0: AB + +/^(\D*)(?=\d)(?!123)/ + ABC445 + 0: ABC + 1: ABC + *** Failers +No match + ABC123 +No match + +/^[W-]46]/ + W46]789 + 0: W46] + -46]789 + 0: -46] + *** Failers +No match + Wall +No match + Zebra +No match + 42 +No match + [abcd] +No match + ]abcd[ +No match + +/^[W-\]46]/ + W46]789 + 0: W + Wall + 0: W + Zebra + 0: Z + Xylophone + 0: X + 42 + 0: 4 + [abcd] + 0: [ + ]abcd[ + 0: ] + \\backslash + 0: \ + *** Failers +No match + -46]789 +No match + well +No match + +/\d\d\/\d\d\/\d\d\d\d/ + 01/01/2000 + 0: 01/01/2000 + +/word (?:[a-zA-Z0-9]+ ){0,10}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?:[a-zA-Z0-9]+ ){0,300}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/^(a){0,0}/ + bcd + 0: + abc + 0: + aab + 0: + +/^(a){0,1}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: a + 1: a + +/^(a){0,2}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + +/^(a){0,3}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + +/^(a){0,}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + aaaaaaaa + 0: aaaaaaaa + 1: a + +/^(a){1,1}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: a + 1: a + +/^(a){1,2}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: aa + 1: a + +/^(a){1,3}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + +/^(a){1,}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + aaaaaaaa + 0: aaaaaaaa + 1: a + +/.*\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.{0,}\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/m + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*\.gif/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*$/ + borfle\nbib.gif\nno + 0: no + +/.*$/m + borfle\nbib.gif\nno + 0: borfle + +/.*$/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + +/.*$/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + +/.*$/ + borfle\nbib.gif\nno\n + 0: no + +/.*$/m + borfle\nbib.gif\nno\n + 0: borfle + +/.*$/s + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + +/.*$/ms + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + +/(.*X|^B)/ + abcde\n1234Xyz + 0: 1234X + 1: 1234X + BarFoo + 0: B + 1: B + *** Failers +No match + abcde\nBar +No match + +/(.*X|^B)/m + abcde\n1234Xyz + 0: 1234X + 1: 1234X + BarFoo + 0: B + 1: B + abcde\nBar + 0: B + 1: B + +/(.*X|^B)/s + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B + *** Failers +No match + abcde\nBar +No match + +/(.*X|^B)/ms + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B + abcde\nBar + 0: B + 1: B + +/(?s)(.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B + *** Failers +No match + abcde\nBar +No match + +/(?s:.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/^.*B/ + **** Failers +No match + abc\nB +No match + +/(?s)^.*B/ + abc\nB + 0: abc\x0aB + +/(?m)^.*B/ + abc\nB + 0: B + +/(?ms)^.*B/ + abc\nB + 0: abc\x0aB + +/(?ms)^B/ + abc\nB + 0: B + +/(?s)B$/ + B\n + 0: B + +/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ + 123456654321 + 0: 123456654321 + +/^\d\d\d\d\d\d\d\d\d\d\d\d/ + 123456654321 + 0: 123456654321 + +/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ + 123456654321 + 0: 123456654321 + +/^[abc]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^[a-c]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^(a|b|c){12}/ + abcabcabcabc + 0: abcabcabcabc + 1: c + +/^[abcdefghijklmnopqrstuvwxy0123456789]/ + n + 0: n + *** Failers +No match + z +No match + +/abcde{0,0}/ + abcd + 0: abcd + *** Failers +No match + abce +No match + +/ab[cd]{0,0}e/ + abe + 0: abe + *** Failers +No match + abcde +No match + +/ab(c){0,0}d/ + abd + 0: abd + *** Failers +No match + abcd +No match + +/a(b*)/ + a + 0: a + 1: + ab + 0: ab + 1: b + abbbb + 0: abbbb + 1: bbbb + *** Failers + 0: a + 1: + bbbbb +No match + +/ab\d{0}e/ + abe + 0: abe + *** Failers +No match + ab1e +No match + +/"([^\\"]+|\\.)*"/ + the \"quick\" brown fox + 0: "quick" + 1: quick + \"the \\\"quick\\\" brown fox\" + 0: "the \"quick\" brown fox" + 1: brown fox + +/.*?/g+ + abc + 0: + 0+ abc + 0: a + 0+ bc + 0: + 0+ bc + 0: b + 0+ c + 0: + 0+ c + 0: c + 0+ + 0: + 0+ + +/\b/g+ + abc + 0: + 0+ abc + 0: + 0+ + +/\b/+g + abc + 0: + 0+ abc + 0: + 0+ + +//g + abc + 0: + 0: + 0: + 0: + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
    ([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is +
    + 0: + 1: BGCOLOR='#DBE9E9' + 2: align=left valign=top + 3: 43. + 4: Word Processor
    (N-1286) + 5: + 6: + 7: + 8: align=left valign=top + 9: Lega lstaff.com +10: align=left valign=top +11: CA - Statewide + +/a[^a]b/ + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/ + acb + 0: acb + *** Failers +No match + a\nb +No match + +/a[^a]b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/^(b+?|a){1,2}?c/ + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + bbbac + 0: bbbac + 1: a + bbbbac + 0: bbbbac + 1: a + bbbbbac + 0: bbbbbac + 1: a + +/^(b+|a){1,2}?c/ + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + bbbac + 0: bbbac + 1: a + bbbbac + 0: bbbbac + 1: a + bbbbbac + 0: bbbbbac + 1: a + +/(?!\A)x/m + x\nb\n +No match + a\bx\n + 0: x + +/\x0{ab}/ + \0{ab} + 0: \x00{ab} + +/(A|B)*?CD/ + CD + 0: CD + +/(A|B)*CD/ + CD + 0: CD + +/(AB)*?\1/ + ABABAB + 0: ABAB + 1: AB + +/(AB)*\1/ + ABABAB + 0: ABABAB + 1: AB + +/(?.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ +No match + +"(?>.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + +/(?>(\.\d\d[1-9]?))\d+/ + 1.230003938 + 0: .230003938 + 1: .23 + 1.875000282 + 0: .875000282 + 1: .875 + *** Failers +No match + 1.235 +No match + +/^((?>\w+)|(?>\s+))*$/ + now is the time for all good men to come to the aid of the party + 0: now is the time for all good men to come to the aid of the party + 1: party + *** Failers +No match + this is not a line with only words and spaces! +No match + +/(\d+)(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: a + 12345+ + 0: 12345 + 1: 1234 + 2: 5 + +/((?>\d+))(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: a + *** Failers +No match + 12345+ +No match + +/(?>a+)b/ + aaab + 0: aaab + +/((?>a+)b)/ + aaab + 0: aaab + 1: aaab + +/(?>(a+))b/ + aaab + 0: aaab + 1: aaa + +/(?>b)+/ + aaabbbccc + 0: bbb + +/(?>a+|b+|c+)*c/ + aaabbbbccccd + 0: aaabbbbc + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/\(((?>[^()]+)|\([^()]+\))+\)/ + (abc) + 0: (abc) + 1: abc + (abc(def)xyz) + 0: (abc(def)xyz) + 1: xyz + *** Failers +No match + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/a(?-i)b/i + ab + 0: ab + Ab + 0: Ab + *** Failers +No match + aB +No match + AB +No match + +/(a (?x)b c)d e/ + a bcd e + 0: a bcd e + 1: a bc + *** Failers +No match + a b cd e +No match + abcd e +No match + a bcde +No match + +/(a b(?x)c d (?-x)e f)/ + a bcde f + 0: a bcde f + 1: a bcde f + *** Failers +No match + abcdef +No match + +/(a(?i)b)c/ + abc + 0: abc + 1: ab + aBc + 0: aBc + 1: aB + *** Failers +No match + abC +No match + aBC +No match + Abc +No match + ABc +No match + ABC +No match + AbC +No match + +/a(?i:b)c/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + ABC +No match + abC +No match + aBC +No match + +/a(?i:b)*c/ + aBc + 0: aBc + aBBc + 0: aBBc + *** Failers +No match + aBC +No match + aBBC +No match + +/a(?=b(?i)c)\w\wd/ + abcd + 0: abcd + abCd + 0: abCd + *** Failers +No match + aBCd +No match + abcD +No match + +/(?s-i:more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million + *** Failers +No match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?:(?s-i)more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million + *** Failers +No match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?>a(?i)b+)+c/ + abc + 0: abc + aBbc + 0: aBbc + aBBc + 0: aBBc + *** Failers +No match + Abc +No match + abAb +No match + abbC +No match + +/(?=a(?i)b)\w\wc/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + Ab +No match + abC +No match + aBC +No match + +/(?<=a(?i)b)(\w\w)c/ + abxxc + 0: xxc + 1: xx + aBxxc + 0: xxc + 1: xx + *** Failers +No match + Abxxc +No match + ABxxc +No match + abxxC +No match + +/(?:(a)|b)(?(1)A|B)/ + aA + 0: aA + 1: a + bB + 0: bB + *** Failers +No match + aB +No match + bA +No match + +/^(a)?(?(1)a|b)+$/ + aa + 0: aa + 1: a + b + 0: b + bb + 0: bb + *** Failers +No match + ab +No match + +/^(?(?=abc)\w{3}:|\d\d)$/ + abc: + 0: abc: + 12 + 0: 12 + *** Failers +No match + 123 +No match + xyz +No match + +/^(?(?!abc)\d\d|\w{3}:)$/ + abc: + 0: abc: + 12 + 0: 12 + *** Failers +No match + 123 +No match + xyz +No match + +/(?(?<=foo)bar|cat)/ + foobar + 0: bar + cat + 0: cat + fcat + 0: cat + focat + 0: cat + *** Failers +No match + foocat +No match + +/(?(?a*)*/ + a + 0: a + aa + 0: aa + aaaa + 0: aaaa + +/(abc|)+/ + abc + 0: abc + 1: + abcabc + 0: abcabc + 1: + abcabcabc + 0: abcabcabc + 1: + xyz + 0: + 1: + +/([a]*)*/ + a + 0: a + 1: + aaaaa + 0: aaaaa + 1: + +/([ab]*)*/ + a + 0: a + 1: + b + 0: b + 1: + ababab + 0: ababab + 1: + aaaabcde + 0: aaaab + 1: + bbbb + 0: bbbb + 1: + +/([^a]*)*/ + b + 0: b + 1: + bbbb + 0: bbbb + 1: + aaa + 0: + 1: + +/([^ab]*)*/ + cccc + 0: cccc + 1: + abab + 0: + 1: + +/([a]*?)*/ + a + 0: + 1: + aaaa + 0: + 1: + +/([ab]*?)*/ + a + 0: + 1: + b + 0: + 1: + abab + 0: + 1: + baba + 0: + 1: + +/([^a]*?)*/ + b + 0: + 1: + bbbb + 0: + 1: + aaa + 0: + 1: + +/([^ab]*?)*/ + c + 0: + 1: + cccc + 0: + 1: + baba + 0: + 1: + +/(?>a*)*/ + a + 0: a + aaabcde + 0: aaa + +/((?>a*))*/ + aaaaa + 0: aaaaa + 1: + aabbaa + 0: aa + 1: + +/((?>a*?))*/ + aaaaa + 0: + 1: + aabbaa + 0: + 1: + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x + 12-sep-98 + 0: 12-sep-98 + 12-09-98 + 0: 12-09-98 + *** Failers +No match + sep-12-98 +No match + +/(?<=(foo))bar\1/ + foobarfoo + 0: barfoo + 1: foo + foobarfootling + 0: barfoo + 1: foo + *** Failers +No match + foobar +No match + barfoo +No match + +/(?i:saturday|sunday)/ + saturday + 0: saturday + sunday + 0: sunday + Saturday + 0: Saturday + Sunday + 0: Sunday + SATURDAY + 0: SATURDAY + SUNDAY + 0: SUNDAY + SunDay + 0: SunDay + +/(a(?i)bc|BB)x/ + abcx + 0: abcx + 1: abc + aBCx + 0: aBCx + 1: aBC + bbx + 0: bbx + 1: bb + BBx + 0: BBx + 1: BB + *** Failers +No match + abcX +No match + aBCX +No match + bbX +No match + BBX +No match + +/^([ab](?i)[cd]|[ef])/ + ac + 0: ac + 1: ac + aC + 0: aC + 1: aC + bD + 0: bD + 1: bD + elephant + 0: e + 1: e + Europe + 0: E + 1: E + frog + 0: f + 1: f + France + 0: F + 1: F + *** Failers +No match + Africa +No match + +/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ + ab + 0: ab + 1: ab + aBd + 0: aBd + 1: aBd + xy + 0: xy + 1: xy + xY + 0: xY + 1: xY + zebra + 0: z + 1: z + Zambesi + 0: Z + 1: Z + *** Failers +No match + aCD +No match + XY +No match + +/(?<=foo\n)^bar/m + foo\nbar + 0: bar + *** Failers +No match + bar +No match + baz\nbar +No match + +/(?<=(?]&/ + <&OUT + 0: <& + +/^(a\1?){4}$/ + aaaaaaaaaa + 0: aaaaaaaaaa + 1: aaaa + *** Failers +No match + AB +No match + aaaaaaaaa +No match + aaaaaaaaaaa +No match + +/^(a(?(1)\1)){4}$/ + aaaaaaaaaa + 0: aaaaaaaaaa + 1: aaaa + *** Failers +No match + aaaaaaaaa +No match + aaaaaaaaaaa +No match + +/(?:(f)(o)(o)|(b)(a)(r))*/ + foobar + 0: foobar + 1: f + 2: o + 3: o + 4: b + 5: a + 6: r + +/(?<=a)b/ + ab + 0: b + *** Failers +No match + cb +No match + b +No match + +/(? + 2: abcd + xy:z:::abcd + 0: xy:z:::abcd + 1: xy:z::: + 2: abcd + +/^[^bcd]*(c+)/ + aexycd + 0: aexyc + 1: c + +/(a*)b+/ + caab + 0: aab + 1: aa + +/([\w:]+::)?(\w+)$/ + abcd + 0: abcd + 1: + 2: abcd + xy:z:::abcd + 0: xy:z:::abcd + 1: xy:z::: + 2: abcd + *** Failers + 0: Failers + 1: + 2: Failers + abcd: +No match + abcd: +No match + +/^[^bcd]*(c+)/ + aexycd + 0: aexyc + 1: c + +/(>a+)ab/ + +/(?>a+)b/ + aaab + 0: aaab + +/([[:]+)/ + a:[b]: + 0: :[ + 1: :[ + +/([[=]+)/ + a=[b]= + 0: =[ + 1: =[ + +/([[.]+)/ + a.[b]. + 0: .[ + 1: .[ + +/((?>a+)b)/ + aaab + 0: aaab + 1: aaab + +/(?>(a+))b/ + aaab + 0: aaab + 1: aaa + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/a\Z/ + *** Failers +No match + aaab +No match + a\nb\n +No match + +/b\Z/ + a\nb\n + 0: b + +/b\z/ + +/b\Z/ + a\nb + 0: b + +/b\z/ + a\nb + 0: b + *** Failers +No match + +/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ + a + 0: a + 1: + abc + 0: abc + 1: + a-b + 0: a-b + 1: + 0-9 + 0: 0-9 + 1: + a.b + 0: a.b + 1: + 5.6.7 + 0: 5.6.7 + 1: + the.quick.brown.fox + 0: the.quick.brown.fox + 1: + a100.b200.300c + 0: a100.b200.300c + 1: + 12-ab.1245 + 0: 12-ab.1245 + 1: + *** Failers +No match + \ +No match + .a +No match + -a +No match + a- +No match + a. +No match + a_b +No match + a.- +No match + a.. +No match + ab..bc +No match + the.quick.brown.fox- +No match + the.quick.brown.fox. +No match + the.quick.brown.fox_ +No match + the.quick.brown.fox+ +No match + +/(?>.*)(?<=(abcd|wxyz))/ + alphabetabcd + 0: alphabetabcd + 1: abcd + endingwxyz + 0: endingwxyz + 1: wxyz + *** Failers +No match + a rather long string that doesn't end with one of them +No match + +/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?>[a-zA-Z0-9]+ ){0,30}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/(?<=\d{3}(?!999))foo/ + 999foo + 0: foo + 123999foo + 0: foo + *** Failers +No match + 123abcfoo +No match + +/(?<=(?!...999)\d{3})foo/ + 999foo + 0: foo + 123999foo + 0: foo + *** Failers +No match + 123abcfoo +No match + +/(?<=\d{3}(?!999)...)foo/ + 123abcfoo + 0: foo + 123456foo + 0: foo + *** Failers +No match + 123999foo +No match + +/(?<=\d{3}...)(? + 2: + 3: abcd +
    + 2: + 3: abcd + \s*)=(?>\s*) # find + 2: + 3: abcd + Z)+|A)*/ + ZABCDEFG + 0: ZA + 1: A + +/((?>)+|A)*/ + ZABCDEFG + 0: + 1: + +/a*/g + abbab + 0: a + 0: + 0: + 0: a + 0: + 0: + +/^[a-\d]/ + abcde + 0: a + -things + 0: - + 0digit + 0: 0 + *** Failers +No match + bcdef +No match + +/^[\d-a]/ + abcde + 0: a + -things + 0: - + 0digit + 0: 0 + *** Failers +No match + bcdef +No match + +/[[:space:]]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d\x0b + +/[[:blank:]]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09 + +/[\s]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d + +/\s+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d + +/a b/x + ab +No match + +/(?!\A)x/m + a\nxb\n + 0: x + +/(?!^)x/m + a\nxb\n +No match + +/abc\Qabc\Eabc/ + abcabcabc + 0: abcabcabc + +/abc\Q(*+|\Eabc/ + abc(*+|abc + 0: abc(*+|abc + +/ abc\Q abc\Eabc/x + abc abcabc + 0: abc abcabc + *** Failers +No match + abcabcabc +No match + +/abc#comment + \Q#not comment + literal\E/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal\E #more comment + /x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal\E #more comment/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/\Qabc\$xyz\E/ + abc\\\$xyz + 0: abc\$xyz + +/\Qabc\E\$\Qxyz\E/ + abc\$xyz + 0: abc$xyz + +/\Gabc/ + abc + 0: abc + *** Failers +No match + xyzabc +No match + +/\Gabc./g + abc1abc2xyzabc3 + 0: abc1 + 0: abc2 + +/abc./g + abc1abc2xyzabc3 + 0: abc1 + 0: abc2 + 0: abc3 + +/a(?x: b c )d/ + XabcdY + 0: abcd + *** Failers +No match + Xa b c d Y +No match + +/((?x)x y z | a b c)/ + XabcY + 0: abc + 1: abc + AxyzB + 0: xyz + 1: xyz + +/(?i)AB(?-i)C/ + XabCY + 0: abC + *** Failers +No match + XabcY +No match + +/((?i)AB(?-i)C|D)E/ + abCE + 0: abCE + 1: abC + DE + 0: DE + 1: D + *** Failers +No match + abcE +No match + abCe +No match + dE +No match + De +No match + +/(.*)\d+\1/ + abc123abc + 0: abc123abc + 1: abc + abc123bc + 0: bc123bc + 1: bc + +/(.*)\d+\1/s + abc123abc + 0: abc123abc + 1: abc + abc123bc + 0: bc123bc + 1: bc + +/((.*))\d+\1/ + abc123abc + 0: abc123abc + 1: abc + 2: abc + abc123bc + 0: bc123bc + 1: bc + 2: bc + +/-- This tests for an IPv6 address in the form where it can have up to --/ +/-- eight components, one and only one of which is empty. This must be --/ +No match +/-- an internal component. --/ +No match + +/^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + /xi + a123::a123 + 0: a123::a123 + 1: + a123:b342::abcd + 0: a123:b342::abcd + 1: + a123:b342::324e:abcd + 0: a123:b342::324e:abcd + 1: + a123:ddde:b342::324e:abcd + 0: a123:ddde:b342::324e:abcd + 1: + a123:ddde:b342::324e:dcba:abcd + 0: a123:ddde:b342::324e:dcba:abcd + 1: + a123:ddde:9999:b342::324e:dcba:abcd + 0: a123:ddde:9999:b342::324e:dcba:abcd + 1: + *** Failers +No match + 1:2:3:4:5:6:7:8 +No match + a123:bce:ddde:9999:b342::324e:dcba:abcd +No match + a123::9999:b342::324e:dcba:abcd +No match + abcde:2:3:4:5:6:7:8 +No match + ::1 +No match + abcd:fee0:123:: +No match + :1 +No match + 1: +No match + +/[z\Qa-d]\E]/ + z + 0: z + a + 0: a + - + 0: - + d + 0: d + ] + 0: ] + *** Failers + 0: a + b +No match + +/[\z\C]/ + z + 0: z + C + 0: C + +/\M/ + M + 0: M + +/(a+)*b/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/(?i)reg(?:ul(?:[aä]|ae)r|ex)/ + REGular + 0: REGular + regulaer + 0: regulaer + Regex + 0: Regex + regulär + 0: regul\xe4r + +/Åæåä[à-ÿÀ-ß]+/ + Åæåäà + 0: \xc5\xe6\xe5\xe4\xe0 + Åæåäÿ + 0: \xc5\xe6\xe5\xe4\xff + ÅæåäÀ + 0: \xc5\xe6\xe5\xe4\xc0 + Åæåäß + 0: \xc5\xe6\xe5\xe4\xdf + +/(?<=Z)X./ + \x84XAZXB + 0: XB + +/ab cd (?x) de fg/ + ab cd defg + 0: ab cd defg + +/ab cd(?x) de fg/ + ab cddefg + 0: ab cddefg + ** Failers +No match + abcddefg +No match + +/(? + 2: + D + 0: D + 1: + 2: + +/(a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 1: + +/(?>a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/(?:a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/\Z/g + abc\n + 0: + 0: + +/^(?s)(?>.*)(?iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 826 +------------------------------------------------------------------ + 0 822 Bra + 3 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +821 \b +822 822 Ket +825 End +------------------------------------------------------------------ + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 816 +------------------------------------------------------------------ + 0 812 Bra + 3 $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +811 \b +812 812 Ket +815 End +------------------------------------------------------------------ + +/(a(?1)b)/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 24 Bra + 3 18 CBra 1 + 8 a + 10 6 Once + 13 3 Recurse + 16 6 Ket + 19 b + 21 18 Ket + 24 24 Ket + 27 End +------------------------------------------------------------------ + +/(a(?1)+b)/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 24 Bra + 3 18 CBra 1 + 8 a + 10 6 Once + 13 3 Recurse + 16 6 KetRmax + 19 b + 21 18 Ket + 24 24 Ket + 27 End +------------------------------------------------------------------ + +/a(?Pb|c)d(?Pe)/BM +Memory allocation (code space): 42 +------------------------------------------------------------------ + 0 32 Bra + 3 a + 5 7 CBra 1 + 10 b + 12 5 Alt + 15 c + 17 12 Ket + 20 d + 22 7 CBra 2 + 27 e + 29 7 Ket + 32 32 Ket + 35 End +------------------------------------------------------------------ + +/(?:a(?Pc(?Pd)))(?Pa)/BM +Memory allocation (code space): 54 +------------------------------------------------------------------ + 0 41 Bra + 3 25 Bra + 6 a + 8 17 CBra 1 + 13 c + 15 7 CBra 2 + 20 d + 22 7 Ket + 25 17 Ket + 28 25 Ket + 31 7 CBra 3 + 36 a + 38 7 Ket + 41 41 Ket + 44 End +------------------------------------------------------------------ + +/(?Pa)...(?P=a)bbb(?P>a)d/BM +Memory allocation (code space): 43 +------------------------------------------------------------------ + 0 36 Bra + 3 7 CBra 1 + 8 a + 10 7 Ket + 13 Any + 14 Any + 15 Any + 16 \1 + 19 bbb + 25 6 Once + 28 3 Recurse + 31 6 Ket + 34 d + 36 36 Ket + 39 End +------------------------------------------------------------------ + +/abc(?C255)de(?C)f/BM +Memory allocation (code space): 31 +------------------------------------------------------------------ + 0 27 Bra + 3 abc + 9 Callout 255 10 1 + 15 de + 19 Callout 0 16 1 + 25 f + 27 27 Ket + 30 End +------------------------------------------------------------------ + +/abcde/CBM +Memory allocation (code space): 53 +------------------------------------------------------------------ + 0 49 Bra + 3 Callout 255 0 1 + 9 a + 11 Callout 255 1 1 + 17 b + 19 Callout 255 2 1 + 25 c + 27 Callout 255 3 1 + 33 d + 35 Callout 255 4 1 + 41 e + 43 Callout 255 5 0 + 49 49 Ket + 52 End +------------------------------------------------------------------ + +/\x{100}/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{100} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\x{1000}/8BM +Memory allocation (code space): 11 +------------------------------------------------------------------ + 0 7 Bra + 3 \x{1000} + 7 7 Ket + 10 End +------------------------------------------------------------------ + +/\x{10000}/8BM +Memory allocation (code space): 12 +------------------------------------------------------------------ + 0 8 Bra + 3 \x{10000} + 8 8 Ket + 11 End +------------------------------------------------------------------ + +/\x{100000}/8BM +Memory allocation (code space): 12 +------------------------------------------------------------------ + 0 8 Bra + 3 \x{100000} + 8 8 Ket + 11 End +------------------------------------------------------------------ + +/\x{1000000}/8BM +Memory allocation (code space): 13 +------------------------------------------------------------------ + 0 9 Bra + 3 \x{1000000} + 9 9 Ket + 12 End +------------------------------------------------------------------ + +/\x{4000000}/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 10 Bra + 3 \x{4000000} + 10 10 Ket + 13 End +------------------------------------------------------------------ + +/\x{7fffFFFF}/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 10 Bra + 3 \x{7fffffff} + 10 10 Ket + 13 End +------------------------------------------------------------------ + +/[\x{ff}]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{ff} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/[\x{100}]/8BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\x{100}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/\x80/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{80} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\xff/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{ff} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8M +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 A\x{2262}\x{391}. + 14 14 Ket + 17 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 'A' +Need char = '.' + +/\x{D55c}\x{ad6d}\x{C5B4}/D8M +Memory allocation (code space): 19 +------------------------------------------------------------------ + 0 15 Bra + 3 \x{d55c}\x{ad6d}\x{c5b4} + 15 15 Ket + 18 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 237 +Need char = 180 + +/\x{65e5}\x{672c}\x{8a9e}/D8M +Memory allocation (code space): 19 +------------------------------------------------------------------ + 0 15 Bra + 3 \x{65e5}\x{672c}\x{8a9e} + 15 15 Ket + 18 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 230 +Need char = 158 + +/[\x{100}]/8BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\x{100}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[Z\x{100}]/8BM +Memory allocation (code space): 47 +------------------------------------------------------------------ + 0 43 Bra + 3 [Z\x{100}] + 43 43 Ket + 46 End +------------------------------------------------------------------ + +/^[\x{100}\E-\Q\E\x{150}]/B8M +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 ^ + 4 [\x{100}-\x{150}] + 14 14 Ket + 17 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E]/B8M +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 ^ + 4 [\x{100}-\x{150}] + 14 14 Ket + 17 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E/B8M +Failed: missing terminating ] for character class at offset 15 + +/[\p{L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\p{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\p{^L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\P{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\P{L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\P{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\P{^L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\p{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[abc\p{L}\x{0660}]/8BM +Memory allocation (code space): 50 +------------------------------------------------------------------ + 0 46 Bra + 3 [a-c\p{L}\x{660}] + 46 46 Ket + 49 End +------------------------------------------------------------------ + +/[\p{Nd}]/8BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\p{Nd}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\p{Nd}+-]+/8BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 44 Bra + 3 [+\-\p{Nd}]+ + 44 44 Ket + 47 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM +Memory allocation (code space): 25 +------------------------------------------------------------------ + 0 21 Bra + 3 NC A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 21 21 Ket + 24 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM +Memory allocation (code space): 25 +------------------------------------------------------------------ + 0 21 Bra + 3 A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 21 21 Ket + 24 End +------------------------------------------------------------------ + +/[\x{105}-\x{109}]/8iBM +Memory allocation (code space): 17 +------------------------------------------------------------------ + 0 13 Bra + 3 [\x{104}-\x{109}] + 13 13 Ket + 16 End +------------------------------------------------------------------ + +/( ( (?(1)0|) )* )/xBM +Memory allocation (code space): 38 +------------------------------------------------------------------ + 0 34 Bra + 3 28 CBra 1 + 8 Brazero + 9 19 SCBra 2 + 14 8 Cond + 17 1 Cond ref + 20 0 + 22 3 Alt + 25 11 Ket + 28 19 KetRmax + 31 28 Ket + 34 34 Ket + 37 End +------------------------------------------------------------------ + +/( (?(1)0|)* )/xBM +Memory allocation (code space): 30 +------------------------------------------------------------------ + 0 26 Bra + 3 20 CBra 1 + 8 Brazero + 9 8 SCond + 12 1 Cond ref + 15 0 + 17 3 Alt + 20 11 KetRmax + 23 20 Ket + 26 26 Ket + 29 End +------------------------------------------------------------------ + +/[a]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 a + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[a]/8BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 a + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[\xaa]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 \xaa + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[\xaa]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{aa} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/[^a]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 [^a] + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[^a]/8BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 [^a] + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[^\xaa]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 [^\xaa] + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[^\xaa]/8BM +Memory allocation (code space): 40 +------------------------------------------------------------------ + 0 36 Bra + 3 [\x00-\xa9\xab-\xff] (neg) + 36 36 Ket + 39 End +------------------------------------------------------------------ + +/ End of testinput10 / diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput2 erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput2 --- erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput2 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput2 2009-03-12 12:21:53.000000000 +0000 @@ -0,0 +1,9388 @@ +/(a)b|/I +Capturing subpattern count = 1 +No options +No first char +No need char + +/abc/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + abc + 0: abc + defabc + 0: abc + \Aabc + 0: abc + *** Failers +No match + \Adefabc +No match + ABC +No match + +/^abc/I +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + abc + 0: abc + \Aabc + 0: abc + *** Failers +No match + defabc +No match + \Adefabc +No match + +/a+bc/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +Need char = 'c' + +/a*bc/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +Need char = 'c' + +/a{3}bc/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +Need char = 'c' + +/(abc|a+z)/I +Capturing subpattern count = 1 +Partial matching not supported +No options +First char = 'a' +No need char + +/^abc$/I +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + abc + 0: abc + *** Failers +No match + def\nabc +No match + +/ab\idef/X +Failed: unrecognized character follows \ at offset 3 + +/(?X)ab\idef/X +Failed: unrecognized character follows \ at offset 7 + +/x{5,4}/ +Failed: numbers out of order in {} quantifier at offset 5 + +/z{65536}/ +Failed: number too big in {} quantifier at offset 7 + +/[abcd/ +Failed: missing terminating ] for character class at offset 5 + +/(?X)[\B]/ +Failed: invalid escape sequence in character class at offset 6 + +/[z-a]/ +Failed: range out of order in character class at offset 3 + +/^*/ +Failed: nothing to repeat at offset 1 + +/(abc/ +Failed: missing ) at offset 4 + +/(?# abc/ +Failed: missing ) after comment at offset 7 + +/(?z)abc/ +Failed: unrecognized character after (? or (?- at offset 2 + +/.*b/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char at start or follows newline +Need char = 'b' + +/.*?b/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char at start or follows newline +Need char = 'b' + +/cat|dog|elephant/I +Capturing subpattern count = 0 +No options +No first char +No need char + this sentence eventually mentions a cat + 0: cat + this sentences rambles on and on for a while and then reaches elephant + 0: elephant + +/cat|dog|elephant/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Starting byte set: c d e + this sentence eventually mentions a cat + 0: cat + this sentences rambles on and on for a while and then reaches elephant + 0: elephant + +/cat|dog|elephant/IiS +Capturing subpattern count = 0 +Options: caseless +No first char +No need char +Starting byte set: C D E c d e + this sentence eventually mentions a CAT cat + 0: CAT + this sentences rambles on and on for a while to elephant ElePhant + 0: elephant + +/a|[bcd]/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Starting byte set: a b c d + +/(a|[^\dZ])/IS +Capturing subpattern count = 1 +No options +No first char +No need char +Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a + \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 + \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / : ; < = > + ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y [ \ ] ^ _ ` a b c d + e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 + \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 + \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa0 \xa1 + \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 + \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf + \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce + \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd + \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec + \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb + \xfc \xfd \xfe \xff + +/(a|b)*[\s]/IS +Capturing subpattern count = 1 +No options +No first char +No need char +Starting byte set: \x09 \x0a \x0c \x0d \x20 a b + +/(ab\2)/ +Failed: reference to non-existent subpattern at offset 6 + +/{4,5}abc/ +Failed: nothing to repeat at offset 4 + +/(a)(b)(c)\2/I +Capturing subpattern count = 3 +Max back reference = 2 +No options +First char = 'a' +Need char = 'c' + abcb + 0: abcb + 1: a + 2: b + 3: c + \O0abcb +Matched, but too many substrings + \O3abcb +Matched, but too many substrings + 0: abcb + \O6abcb +Matched, but too many substrings + 0: abcb + 1: a + \O9abcb +Matched, but too many substrings + 0: abcb + 1: a + 2: b + \O12abcb + 0: abcb + 1: a + 2: b + 3: c + +/(a)bc|(a)(b)\2/I +Capturing subpattern count = 3 +Max back reference = 2 +No options +First char = 'a' +No need char + abc + 0: abc + 1: a + \O0abc +Matched, but too many substrings + \O3abc +Matched, but too many substrings + 0: abc + \O6abc + 0: abc + 1: a + aba + 0: aba + 1: + 2: a + 3: b + \O0aba +Matched, but too many substrings + \O3aba +Matched, but too many substrings + 0: aba + \O6aba +Matched, but too many substrings + 0: aba + 1: + \O9aba +Matched, but too many substrings + 0: aba + 1: + 2: a + \O12aba + 0: aba + 1: + 2: a + 3: b + +/abc$/IE +Capturing subpattern count = 0 +Options: dollar_endonly +First char = 'a' +Need char = 'c' + abc + 0: abc + *** Failers +No match + abc\n +No match + abc\ndef +No match + +/(a)(b)(c)(d)(e)\6/ +Failed: reference to non-existent subpattern at offset 17 + +/the quick brown fox/I +Capturing subpattern count = 0 +No options +First char = 't' +Need char = 'x' + the quick brown fox + 0: the quick brown fox + this is a line with the quick brown fox + 0: the quick brown fox + +/the quick brown fox/IA +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + the quick brown fox + 0: the quick brown fox + *** Failers +No match + this is a line with the quick brown fox +No match + +/ab(?z)cd/ +Failed: unrecognized character after (? or (?- at offset 4 + +/^abc|def/I +Capturing subpattern count = 0 +No options +No first char +No need char + abcdef + 0: abc + abcdef\B + 0: def + +/.*((abc)$|(def))/I +Capturing subpattern count = 3 +Partial matching not supported +No options +First char at start or follows newline +No need char + defabc + 0: defabc + 1: abc + 2: abc + \Zdefabc + 0: def + 1: def + 2: + 3: def + +/abc/IP + abc + 0: abc + *** Failers +No match: POSIX code 17: match failed + +/^abc|def/IP + abcdef + 0: abc + abcdef\B + 0: def + +/.*((abc)$|(def))/IP + defabc + 0: defabc + 1: abc + 2: abc + \Zdefabc + 0: def + 1: def + 3: def + +/the quick brown fox/IP + the quick brown fox + 0: the quick brown fox + *** Failers +No match: POSIX code 17: match failed + The Quick Brown Fox +No match: POSIX code 17: match failed + +/the quick brown fox/IPi + the quick brown fox + 0: the quick brown fox + The Quick Brown Fox + 0: The Quick Brown Fox + +/abc.def/IP + *** Failers +No match: POSIX code 17: match failed + abc\ndef +No match: POSIX code 17: match failed + +/abc$/IP + abc + 0: abc + abc\n + 0: abc + +/(abc)\2/IP +Failed: POSIX code 15: bad back reference at offset 7 + +/(abc\1)/IP + abc +No match: POSIX code 17: match failed + +/)/ +Failed: unmatched parentheses at offset 0 + +/a[]b/ +Failed: missing terminating ] for character class at offset 4 + +/[^aeiou ]{3,}/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + co-processors, and for + 0: -pr + +/<.*>/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = '<' +Need char = '>' + abcghinop + 0: ghi + +/<.*?>/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = '<' +Need char = '>' + abcghinop + 0: + +/<.*>/IU +Capturing subpattern count = 0 +Partial matching not supported +Options: ungreedy +First char = '<' +Need char = '>' + abcghinop + 0: + +/(?U)<.*>/I +Capturing subpattern count = 0 +Partial matching not supported +Options: ungreedy +First char = '<' +Need char = '>' + abcghinop + 0: + +/<.*?>/IU +Capturing subpattern count = 0 +Partial matching not supported +Options: ungreedy +First char = '<' +Need char = '>' + abcghinop + 0: ghi + +/={3,}/IU +Capturing subpattern count = 0 +Partial matching not supported +Options: ungreedy +First char = '=' +Need char = '=' + abc========def + 0: === + +/(?U)={3,}?/I +Capturing subpattern count = 0 +Partial matching not supported +Options: ungreedy +First char = '=' +Need char = '=' + abc========def + 0: ======== + +/(?^abc)/Im +Capturing subpattern count = 0 +Options: multiline +First char at start or follows newline +Need char = 'c' + abc + 0: abc + def\nabc + 0: abc + *** Failers +No match + defabc +No match + +/(?<=ab(c+)d)ef/ +Failed: lookbehind assertion is not fixed length at offset 11 + +/(?<=ab(?<=c+)d)ef/ +Failed: lookbehind assertion is not fixed length at offset 12 + +/(?<=ab(c|de)f)g/ +Failed: lookbehind assertion is not fixed length at offset 13 + +/The next three are in testinput2 because they have variable length branches/ + +/(?<=bullock|donkey)-cart/I +Capturing subpattern count = 0 +No options +First char = '-' +Need char = 't' + the bullock-cart + 0: -cart + a donkey-cart race + 0: -cart + *** Failers +No match + cart +No match + horse-and-cart +No match + +/(?<=ab(?i)x|y|z)/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/(?>.*)(?<=(abcd)|(xyz))/I +Capturing subpattern count = 2 +Partial matching not supported +No options +First char at start or follows newline +No need char + alphabetabcd + 0: alphabetabcd + 1: abcd + endingxyz + 0: endingxyz + 1: + 2: xyz + +/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/I +Capturing subpattern count = 0 +No options +First char = 'Z' +Need char = 'Z' + abxyZZ + 0: ZZ + abXyZZ + 0: ZZ + ZZZ + 0: ZZ + zZZ + 0: ZZ + bZZ + 0: ZZ + BZZ + 0: ZZ + *** Failers +No match + ZZ +No match + abXYZZ +No match + zzz +No match + bzz +No match + +/(? + 3: f + 1G a (1) + 2G (0) + 3G f (1) +get substring 4 failed -7 + 0L adef + 1L a + 2L + 3L f + bcdef\G1\G2\G3\G4\L + 0: bcdef + 1: bc + 2: bc + 3: f + 1G bc (2) + 2G bc (2) + 3G f (1) +get substring 4 failed -7 + 0L bcdef + 1L bc + 2L bc + 3L f + adefghijk\C0 + 0: adef + 1: a + 2: + 3: f + 0C adef (4) + +/^abc\00def/I +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + abc\00def\L\C0 + 0: abc\x00def + 0C abc (7) + 0L abc + +/word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ +)((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ +)?)?)?)?)?)?)?)?)?otherword/I +Capturing subpattern count = 8 +Partial matching not supported +Contains explicit CR or LF match +No options +First char = 'w' +Need char = 'd' + +/.*X/IDZ +------------------------------------------------------------------ + Bra + Any* + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +No options +First char at start or follows newline +Need char = 'X' + +/.*X/IDZs +------------------------------------------------------------------ + Bra + Any* + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: anchored dotall +No first char +Need char = 'X' + +/(.*X|^B)/IDZ +------------------------------------------------------------------ + Bra + CBra 1 + Any* + X + Alt + ^ + B + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Partial matching not supported +No options +First char at start or follows newline +No need char + +/(.*X|^B)/IDZs +------------------------------------------------------------------ + Bra + CBra 1 + Any* + X + Alt + ^ + B + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Partial matching not supported +Options: anchored dotall +No first char +No need char + +/(?s)(.*X|^B)/IDZ +------------------------------------------------------------------ + Bra + CBra 1 + Any* + X + Alt + ^ + B + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Partial matching not supported +Options: anchored dotall +No first char +No need char + +/(?s:.*X|^B)/IDZ +------------------------------------------------------------------ + Bra + Bra + 04 Opt + Any* + X + Alt + 04 Opt + ^ + B + Ket + 00 Opt + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +No options +First char at start or follows newline +No need char + +/\Biss\B/I+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + +/\Biss\B/I+P + Mississippi + 0: iss + 0+ issippi + +/iss/IG+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + 0: iss + 0+ ippi + +/\Biss\B/IG+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + +/\Biss\B/Ig+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + 0: iss + 0+ ippi + *** Failers +No match + Mississippi\A +No match + +/(?<=[Ms])iss/Ig+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + 0: iss + 0+ ippi + +/(?<=[Ms])iss/IG+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + +/^iss/Ig+ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + ississippi + 0: iss + 0+ issippi + +/.*iss/Ig+ +Capturing subpattern count = 0 +Partial matching not supported +No options +First char at start or follows newline +Need char = 's' + abciss\nxyzisspqr + 0: abciss + 0+ \x0axyzisspqr + 0: xyziss + 0+ pqr + +/.i./I+g +Capturing subpattern count = 0 +No options +No first char +Need char = 'i' + Mississippi + 0: Mis + 0+ sissippi + 0: sis + 0+ sippi + 0: sip + 0+ pi + Mississippi\A + 0: Mis + 0+ sissippi + 0: sis + 0+ sippi + 0: sip + 0+ pi + Missouri river + 0: Mis + 0+ souri river + 0: ri + 0+ river + 0: riv + 0+ er + Missouri river\A + 0: Mis + 0+ souri river + +/^.is/I+g +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + Mississippi + 0: Mis + 0+ sissippi + +/^ab\n/Ig+ +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: anchored +No first char +No need char + ab\nab\ncd + 0: ab\x0a + 0+ ab\x0acd + +/^ab\n/Img+ +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: multiline +First char at start or follows newline +Need char = 10 + ab\nab\ncd + 0: ab\x0a + 0+ ab\x0acd + 0: ab\x0a + 0+ cd + +/abc/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/abc|bac/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'c' + +/(abc|bac)/I +Capturing subpattern count = 1 +No options +No first char +Need char = 'c' + +/(abc|(c|dc))/I +Capturing subpattern count = 2 +No options +No first char +Need char = 'c' + +/(abc|(d|de)c)/I +Capturing subpattern count = 2 +No options +No first char +Need char = 'c' + +/a*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + +/a+/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +No need char + +/(baa|a+)/I +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +Need char = 'a' + +/a{0,3}/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + +/baa{3,}/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'b' +Need char = 'a' + +/"([^\\"]+|\\.)*"/I +Capturing subpattern count = 1 +Partial matching not supported +No options +First char = '"' +Need char = '"' + +/(abc|ab[cd])/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/(a|.)/I +Capturing subpattern count = 1 +No options +No first char +No need char + +/a|ba|\w/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/abc(?=pqr)/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'r' + +/...(?<=abc)/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/abc(?!pqr)/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/ab./I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/ab[xyz]/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/abc*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +Need char = 'b' + +/ab.c*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +Need char = 'b' + +/a.c*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +No need char + +/.c*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + +/ac*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +No need char + +/(a.c*|b.c*)/I +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +No need char + +/a.c*|aba/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +No need char + +/.+a/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +Need char = 'a' + +/(?=abcda)a.*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +Need char = 'a' + +/(?=a)a.*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +No need char + +/a(b)*/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/a\d*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +No need char + +/ab\d*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +Need char = 'b' + +/a(\d)*/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/abcde{0,0}/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'd' + +/ab\d+/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +Need char = 'b' + +/a(?(1)b)(.)/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/a(?(1)bag|big)(.)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'g' + +/a(?(1)bag|big)*(.)/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/a(?(1)bag|big)+(.)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'g' + +/a(?(1)b..|b..)(.)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'b' + +/ab\d{0}e/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'e' + +/a?b?/I +Capturing subpattern count = 0 +No options +No first char +No need char + a + 0: a + b + 0: b + ab + 0: ab + \ + 0: + *** Failers + 0: + \N +No match + +/|-/I +Capturing subpattern count = 0 +No options +No first char +No need char + abcd + 0: + -abc + 0: + \Nab-c + 0: - + *** Failers + 0: + \Nabc +No match + +/a*(b+)(z)(z)/IP + aaaabbbbzzzz + 0: aaaabbbbzz + 1: bbbb + 2: z + 3: z + aaaabbbbzzzz\O0 + aaaabbbbzzzz\O1 + 0: aaaabbbbzz + aaaabbbbzzzz\O2 + 0: aaaabbbbzz + 1: bbbb + aaaabbbbzzzz\O3 + 0: aaaabbbbzz + 1: bbbb + 2: z + aaaabbbbzzzz\O4 + 0: aaaabbbbzz + 1: bbbb + 2: z + 3: z + aaaabbbbzzzz\O5 + 0: aaaabbbbzz + 1: bbbb + 2: z + 3: z + +/^.?abcd/IS +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'd' +Study returned NULL + +/\( # ( at start + (?: # Non-capturing bracket + (?>[^()]+) # Either a sequence of non-brackets (no backtracking) + | # Or + (?R) # Recurse - i.e. nested bracketed string + )* # Zero or more contents + \) # Closing ) + /Ix +Capturing subpattern count = 0 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + (abcd) + 0: (abcd) + (abcd)xyz + 0: (abcd) + xyz(abcd) + 0: (abcd) + (ab(xy)cd)pqr + 0: (ab(xy)cd) + (ab(xycd)pqr + 0: (xycd) + () abc () + 0: () + 12(abcde(fsh)xyz(foo(bar))lmno)89 + 0: (abcde(fsh)xyz(foo(bar))lmno) + *** Failers +No match + abcd +No match + abcd) +No match + (abcd +No match + +/\( ( (?>[^()]+) | (?R) )* \) /Ixg +Capturing subpattern count = 1 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd)pqr + 0: (ab(xy)cd) + 1: cd + 1(abcd)(x(y)z)pqr + 0: (abcd) + 1: abcd + 0: (x(y)z) + 1: z + +/\( (?: (?>[^()]+) | (?R) ) \) /Ix +Capturing subpattern count = 0 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + (abcd) + 0: (abcd) + (ab(xy)cd) + 0: (xy) + (a(b(c)d)e) + 0: (c) + ((ab)) + 0: ((ab)) + *** Failers +No match + () +No match + +/\( (?: (?>[^()]+) | (?R) )? \) /Ix +Capturing subpattern count = 0 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + () + 0: () + 12(abcde(fsh)xyz(foo(bar))lmno)89 + 0: (fsh) + +/\( ( (?>[^()]+) | (?R) )* \) /Ix +Capturing subpattern count = 1 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: cd + +/\( ( ( (?>[^()]+) | (?R) )* ) \) /Ix +Capturing subpattern count = 2 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: ab(xy)cd + 2: cd + +/\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /Ix +Capturing subpattern count = 3 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: + 2: ab(xy)cd + 3: cd + (123ab(xy)cd) + 0: (123ab(xy)cd) + 1: 123 + 2: ab(xy)cd + 3: cd + +/\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /Ix +Capturing subpattern count = 3 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: ab(xy)cd + 2: + 3: cd + (123ab(xy)cd) + 0: (123ab(xy)cd) + 1: 123ab(xy)cd + 2: 123 + 3: cd + +/\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /Ix +Capturing subpattern count = 11 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: ab(xy)cd + 2: ab(xy)cd + 3: ab(xy)cd + 4: ab(xy)cd + 5: ab(xy)cd + 6: ab(xy)cd + 7: ab(xy)cd + 8: ab(xy)cd + 9: ab(xy)cd +10: ab(xy)cd +11: cd + +/\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /Ix +Capturing subpattern count = 3 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + (abcd(xyz

    qrs)123) + 0: (abcd(xyz

    qrs)123) + 1: abcd(xyz

    qrs)123 + 2: 123 + 3: + +/\( ( ( (?>[^()]+) | ((?R)) )* ) \) /Ix +Capturing subpattern count = 3 +Partial matching not supported +Options: extended +First char = '(' +Need char = ')' + (ab(cd)ef) + 0: (ab(cd)ef) + 1: ab(cd)ef + 2: ef + 3: (cd) + (ab(cd(ef)gh)ij) + 0: (ab(cd(ef)gh)ij) + 1: ab(cd(ef)gh)ij + 2: ij + 3: (cd(ef)gh) + +/^[[:alnum:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [0-9A-Za-z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^alnum:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-/:-@[-`{-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:alpha:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [A-Za-z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^alpha:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-@[-`{-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/[_[:alpha:]]/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Starting byte set: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + _ a b c d e f g h i j k l m n o p q r s t u v w x y z + +/^[[:ascii:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-\x7f] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^ascii:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x80-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:blank:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x09 ] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^blank:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-\x08\x0a-\x1f!-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/[\n\x0b\x0c\x0d[:blank:]]/IS +Capturing subpattern count = 0 +Contains explicit CR or LF match +No options +No first char +No need char +Starting byte set: \x09 \x0a \x0b \x0c \x0d \x20 + +/^[[:cntrl:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-\x1f\x7f] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:digit:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [0-9] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:graph:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [!-~] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:lower:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [a-z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:print:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [ -~] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:punct:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [!-/:-@[-`{-~] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:space:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x09-\x0d ] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:upper:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [A-Z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:xdigit:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [0-9A-Fa-f] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:word:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [0-9A-Z_a-z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^cntrl:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [ -~\x80-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[12[:^digit:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-/12:-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^blank:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-\x08\x0a-\x1f!-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/[01[:alpha:]%]/DZ +------------------------------------------------------------------ + Bra + [%01A-Za-z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[[.ch.]]/I +Failed: POSIX collating elements are not supported at offset 1 + +/[[=ch=]]/I +Failed: POSIX collating elements are not supported at offset 1 + +/[[:rhubarb:]]/I +Failed: unknown POSIX class name at offset 3 + +/[[:upper:]]/Ii +Capturing subpattern count = 0 +Options: caseless +No first char +No need char + A + 0: A + a + 0: a + +/[[:lower:]]/Ii +Capturing subpattern count = 0 +Options: caseless +No first char +No need char + A + 0: A + a + 0: a + +/((?-i)[[:lower:]])[[:lower:]]/Ii +Capturing subpattern count = 1 +Options: caseless +No first char +No need char + ab + 0: ab + 1: a + aB + 0: aB + 1: a + *** Failers + 0: ai + 1: a + Ab +No match + AB +No match + +/[\200-\110]/I +Failed: range out of order in character class at offset 9 + +/^(?(0)f|b)oo/I +Failed: invalid condition (?(0) at offset 6 + +/This one's here because of the large output vector needed/I +Capturing subpattern count = 0 +No options +First char = 'T' +Need char = 'd' + +/(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)/I +Capturing subpattern count = 271 +Max back reference = 270 +Partial matching not supported +No options +No first char +No need char + \O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC + 0: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + 6: 6 + 7: 7 + 8: 8 + 9: 9 +10: 10 +11: 11 +12: 12 +13: 13 +14: 14 +15: 15 +16: 16 +17: 17 +18: 18 +19: 19 +20: 20 +21: 21 +22: 22 +23: 23 +24: 24 +25: 25 +26: 26 +27: 27 +28: 28 +29: 29 +30: 30 +31: 31 +32: 32 +33: 33 +34: 34 +35: 35 +36: 36 +37: 37 +38: 38 +39: 39 +40: 40 +41: 41 +42: 42 +43: 43 +44: 44 +45: 45 +46: 46 +47: 47 +48: 48 +49: 49 +50: 50 +51: 51 +52: 52 +53: 53 +54: 54 +55: 55 +56: 56 +57: 57 +58: 58 +59: 59 +60: 60 +61: 61 +62: 62 +63: 63 +64: 64 +65: 65 +66: 66 +67: 67 +68: 68 +69: 69 +70: 70 +71: 71 +72: 72 +73: 73 +74: 74 +75: 75 +76: 76 +77: 77 +78: 78 +79: 79 +80: 80 +81: 81 +82: 82 +83: 83 +84: 84 +85: 85 +86: 86 +87: 87 +88: 88 +89: 89 +90: 90 +91: 91 +92: 92 +93: 93 +94: 94 +95: 95 +96: 96 +97: 97 +98: 98 +99: 99 +100: 100 +101: 101 +102: 102 +103: 103 +104: 104 +105: 105 +106: 106 +107: 107 +108: 108 +109: 109 +110: 110 +111: 111 +112: 112 +113: 113 +114: 114 +115: 115 +116: 116 +117: 117 +118: 118 +119: 119 +120: 120 +121: 121 +122: 122 +123: 123 +124: 124 +125: 125 +126: 126 +127: 127 +128: 128 +129: 129 +130: 130 +131: 131 +132: 132 +133: 133 +134: 134 +135: 135 +136: 136 +137: 137 +138: 138 +139: 139 +140: 140 +141: 141 +142: 142 +143: 143 +144: 144 +145: 145 +146: 146 +147: 147 +148: 148 +149: 149 +150: 150 +151: 151 +152: 152 +153: 153 +154: 154 +155: 155 +156: 156 +157: 157 +158: 158 +159: 159 +160: 160 +161: 161 +162: 162 +163: 163 +164: 164 +165: 165 +166: 166 +167: 167 +168: 168 +169: 169 +170: 170 +171: 171 +172: 172 +173: 173 +174: 174 +175: 175 +176: 176 +177: 177 +178: 178 +179: 179 +180: 180 +181: 181 +182: 182 +183: 183 +184: 184 +185: 185 +186: 186 +187: 187 +188: 188 +189: 189 +190: 190 +191: 191 +192: 192 +193: 193 +194: 194 +195: 195 +196: 196 +197: 197 +198: 198 +199: 199 +200: 200 +201: 201 +202: 202 +203: 203 +204: 204 +205: 205 +206: 206 +207: 207 +208: 208 +209: 209 +210: 210 +211: 211 +212: 212 +213: 213 +214: 214 +215: 215 +216: 216 +217: 217 +218: 218 +219: 219 +220: 220 +221: 221 +222: 222 +223: 223 +224: 224 +225: 225 +226: 226 +227: 227 +228: 228 +229: 229 +230: 230 +231: 231 +232: 232 +233: 233 +234: 234 +235: 235 +236: 236 +237: 237 +238: 238 +239: 239 +240: 240 +241: 241 +242: 242 +243: 243 +244: 244 +245: 245 +246: 246 +247: 247 +248: 248 +249: 249 +250: 250 +251: 251 +252: 252 +253: 253 +254: 254 +255: 255 +256: 256 +257: 257 +258: 258 +259: 259 +260: 260 +261: 261 +262: 262 +263: 263 +264: 264 +265: 265 +266: 266 +267: 267 +268: 268 +269: 269 +270: ABC +271: ABC + +/This one's here because Perl does this differently and PCRE can't at present/I +Capturing subpattern count = 0 +No options +First char = 'T' +Need char = 't' + +/(main(O)?)+/I +Capturing subpattern count = 2 +No options +First char = 'm' +Need char = 'n' + mainmain + 0: mainmain + 1: main + mainOmain + 0: mainOmain + 1: main + 2: O + +/These are all cases where Perl does it differently (nested captures)/I +Capturing subpattern count = 1 +No options +First char = 'T' +Need char = 's' + +/^(a(b)?)+$/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + aba + 0: aba + 1: a + 2: b + +/^(aa(bb)?)+$/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: aa + 2: bb + +/^(aa|aa(bb))+$/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: aa + 2: bb + +/^(aa(bb)??)+$/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: aa + 2: bb + +/^(?:aa(bb)?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: bb + +/^(aa(b(b))?)+$/I +Capturing subpattern count = 3 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: aa + 2: bb + 3: b + +/^(?:aa(b(b))?)+$/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: bb + 2: b + +/^(?:aa(b(?:b))?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: bb + +/^(?:aa(bb(?:b))?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbbaa + 0: aabbbaa + 1: bbb + +/^(?:aa(b(?:bb))?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbbaa + 0: aabbbaa + 1: bbb + +/^(?:aa(?:b(b))?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: b + +/^(?:aa(?:b(bb))?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbbaa + 0: aabbbaa + 1: bb + +/^(aa(b(bb))?)+$/I +Capturing subpattern count = 3 +Options: anchored +No first char +No need char + aabbbaa + 0: aabbbaa + 1: aa + 2: bbb + 3: bb + +/^(aa(bb(bb))?)+$/I +Capturing subpattern count = 3 +Options: anchored +No first char +No need char + aabbbbaa + 0: aabbbbaa + 1: aa + 2: bbbb + 3: bb + +/--------------------------------------------------------------------/I +Capturing subpattern count = 0 +No options +First char = '-' +Need char = '-' + +/#/IxDZ +------------------------------------------------------------------ + Bra + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +No first char +No need char + +/a#/IxDZ +------------------------------------------------------------------ + Bra + a + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +First char = 'a' +No need char + +/[\s]/DZ +------------------------------------------------------------------ + Bra + [\x09\x0a\x0c\x0d ] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\S]/DZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0b\x0e-\x1f!-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/a(?i)b/DZ +------------------------------------------------------------------ + Bra + a + 01 Opt + NC b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' (caseless) + ab + 0: ab + aB + 0: aB + *** Failers +No match + AB +No match + +/(a(?i)b)/DZ +------------------------------------------------------------------ + Bra + CBra 1 + a + 01 Opt + NC b + Ket + 00 Opt + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'b' (caseless) + ab + 0: ab + 1: ab + aB + 0: aB + 1: aB + *** Failers +No match + AB +No match + +/ (?i)abc/IxDZ +------------------------------------------------------------------ + Bra + NC abc + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless extended +First char = 'a' (caseless) +Need char = 'c' (caseless) + +/#this is a comment + (?i)abc/IxDZ +------------------------------------------------------------------ + Bra + NC abc + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless extended +First char = 'a' (caseless) +Need char = 'c' (caseless) + +/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ +------------------------------------------------------------------ + Bra + 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = '1' +Need char = '0' + +/\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ +------------------------------------------------------------------ + Bra + 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = '1' +Need char = '0' + +/\Q\E/DZ +------------------------------------------------------------------ + Bra + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + \ + 0: + +/\Q\Ex/DZ +------------------------------------------------------------------ + Bra + x + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'x' +No need char + +/ \Q\E/DZ +------------------------------------------------------------------ + Bra + + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = ' ' +No need char + +/a\Q\E/DZ +------------------------------------------------------------------ + Bra + a + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + abc + 0: a + bca + 0: a + bac + 0: a + +/a\Q\Eb/DZ +------------------------------------------------------------------ + Bra + ab + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + abc + 0: ab + +/\Q\Eabc/DZ +------------------------------------------------------------------ + Bra + abc + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/x*+\w/DZ +------------------------------------------------------------------ + Bra + x*+ + \w + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + *** Failers + 0: F + xxxxx +No match + +/x?+/DZ +------------------------------------------------------------------ + Bra + x?+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/x++/DZ +------------------------------------------------------------------ + Bra + x++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'x' +No need char + +/x{1,3}+/DZ +------------------------------------------------------------------ + Bra + Once + x + x{0,2} + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'x' +No need char + +/(x)*+/DZ +------------------------------------------------------------------ + Bra + Once + Brazero + CBra 1 + x + KetRmax + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +No options +No first char +No need char + +/^(\w++|\s++)*$/I +Capturing subpattern count = 1 +Partial matching not supported +Options: anchored +No first char +No need char + now is the time for all good men to come to the aid of the party + 0: now is the time for all good men to come to the aid of the party + 1: party + *** Failers +No match + this is not a line with only words and spaces! +No match + +/(\d++)(\w)/I +Capturing subpattern count = 2 +Partial matching not supported +No options +No first char +No need char + 12345a + 0: 12345a + 1: 12345 + 2: a + *** Failers +No match + 12345+ +No match + +/a++b/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +Need char = 'b' + aaab + 0: aaab + +/(a++b)/I +Capturing subpattern count = 1 +Partial matching not supported +No options +First char = 'a' +Need char = 'b' + aaab + 0: aaab + 1: aaab + +/(a++)b/I +Capturing subpattern count = 1 +Partial matching not supported +No options +First char = 'a' +Need char = 'b' + aaab + 0: aaab + 1: aaa + +/([^()]++|\([^()]*\))+/I +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +No need char + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/\(([^()]++|\([^()]+\))+\)/I +Capturing subpattern count = 1 +Partial matching not supported +No options +First char = '(' +Need char = ')' + (abc) + 0: (abc) + 1: abc + (abc(def)xyz) + 0: (abc(def)xyz) + 1: xyz + *** Failers +No match + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/(abc){1,3}+/DZ +------------------------------------------------------------------ + Bra + Once + CBra 1 + abc + Ket + Brazero + Bra + CBra 1 + abc + Ket + Brazero + CBra 1 + abc + Ket + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'c' + +/a+?+/I +Failed: nothing to repeat at offset 3 + +/a{2,3}?+b/I +Failed: nothing to repeat at offset 7 + +/(?U)a+?+/I +Failed: nothing to repeat at offset 7 + +/a{2,3}?+b/IU +Failed: nothing to repeat at offset 7 + +/x(?U)a++b/DZ +------------------------------------------------------------------ + Bra + x + a++ + b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'x' +Need char = 'b' + xaaaab + 0: xaaaab + +/(?U)xa++b/DZ +------------------------------------------------------------------ + Bra + x + a++ + b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: ungreedy +First char = 'x' +Need char = 'b' + xaaaab + 0: xaaaab + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/DZ +------------------------------------------------------------------ + Bra + ^ + CBra 1 + CBra 2 + a+ + Ket + CBra 3 + [ab]+? + Ket + CBra 4 + [bc]+ + Ket + CBra 5 + \w* + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 5 +Partial matching not supported +Options: anchored +No first char +No need char + +/^x(?U)a+b/DZ +------------------------------------------------------------------ + Bra + ^ + x + a++ + b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: anchored +No first char +Need char = 'b' + +/^x(?U)(a+)b/DZ +------------------------------------------------------------------ + Bra + ^ + x + CBra 1 + a+? + Ket + b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Partial matching not supported +Options: anchored +No first char +Need char = 'b' + +/[.x.]/I +Failed: POSIX collating elements are not supported at offset 0 + +/[=x=]/I +Failed: POSIX collating elements are not supported at offset 0 + +/[:x:]/I +Failed: POSIX named classes are supported only within a class at offset 0 + +/\l/I +Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1 + +/\L/I +Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1 + +/\N{name}/I +Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1 + +/\u/I +Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1 + +/\U/I +Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1 + +/[/I +Failed: missing terminating ] for character class at offset 1 + +/[a-/I +Failed: missing terminating ] for character class at offset 3 + +/[[:space:]/I +Failed: missing terminating ] for character class at offset 10 + +/[\s]/IDZ +------------------------------------------------------------------ + Bra + [\x09\x0a\x0c\x0d ] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[[:space:]]/IDZ +------------------------------------------------------------------ + Bra + [\x09-\x0d ] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[[:space:]abcde]/IDZ +------------------------------------------------------------------ + Bra + [\x09-\x0d a-e] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >/Ix +Capturing subpattern count = 0 +Partial matching not supported +Options: extended +First char = '<' +Need char = '>' + <> + 0: <> + + 0: + hij> + 0: hij> + hij> + 0: + def> + 0: def> + + 0: <> + *** Failers +No match + iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|IDZ +------------------------------------------------------------------ + Bra + 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X + \b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = '8' +Need char = 'X' + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|IDZ +------------------------------------------------------------------ + Bra + $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X + \b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = '$' +Need char = 'X' + +/(.*)\d+\1/I +Capturing subpattern count = 1 +Max back reference = 1 +Partial matching not supported +No options +No first char +No need char + +/(.*)\d+/I +Capturing subpattern count = 1 +Partial matching not supported +No options +First char at start or follows newline +No need char + +/(.*)\d+\1/Is +Capturing subpattern count = 1 +Max back reference = 1 +Partial matching not supported +Options: dotall +No first char +No need char + +/(.*)\d+/Is +Capturing subpattern count = 1 +Partial matching not supported +Options: anchored dotall +No first char +No need char + +/(.*(xyz))\d+\2/I +Capturing subpattern count = 2 +Max back reference = 2 +Partial matching not supported +No options +First char at start or follows newline +Need char = 'z' + +/((.*))\d+\1/I +Capturing subpattern count = 2 +Max back reference = 1 +Partial matching not supported +No options +No first char +No need char + abc123bc + 0: bc123bc + 1: bc + 2: bc + +/a[b]/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/(?=a).*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +First char = 'a' +No need char + +/(?=abc).xyz/IiI +Capturing subpattern count = 0 +Options: caseless +First char = 'a' (caseless) +Need char = 'z' (caseless) + +/(?=abc)(?i).xyz/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'z' (caseless) + +/(?=a)(?=b)/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/(?=.)a/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/((?=abcda)a)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'a' + +/((?=abcda)ab)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'b' + +/()a/I +Capturing subpattern count = 1 +No options +No first char +Need char = 'a' + +/(?(1)ab|ac)(.)/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/(?(1)abz|acz)(.)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'z' + +/(?(1)abz)(.)/I +Capturing subpattern count = 1 +No options +No first char +No need char + +/(?(1)abz)(1)23/I +Capturing subpattern count = 1 +No options +No first char +Need char = '3' + +/(a)+/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/(a){2,3}/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'a' + +/(a)*/I +Capturing subpattern count = 1 +No options +No first char +No need char + +/[a]/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/[ab]/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/[ab]/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Starting byte set: a b + +/[^a]/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/\d456/I +Capturing subpattern count = 0 +No options +No first char +Need char = '6' + +/\d456/IS +Capturing subpattern count = 0 +No options +No first char +Need char = '6' +Starting byte set: 0 1 2 3 4 5 6 7 8 9 + +/a^b/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/^a/Im +Capturing subpattern count = 0 +Options: multiline +First char at start or follows newline +Need char = 'a' + abcde + 0: a + xy\nabc + 0: a + *** Failers +No match + xyabc +No match + +/c|abc/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'c' + +/(?i)[ab]/IS +Capturing subpattern count = 0 +Options: caseless +No first char +No need char +Starting byte set: A B a b + +/[ab](?i)cd/IS +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' (caseless) +Starting byte set: a b + +/abc(?C)def/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'f' + abcdef +--->abcdef + 0 ^ ^ d + 0: abcdef + 1234abcdef +--->1234abcdef + 0 ^ ^ d + 0: abcdef + *** Failers +No match + abcxyz +No match + abcxyzf +--->abcxyzf + 0 ^ ^ d +No match + +/abc(?C)de(?C1)f/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'f' + 123abcdef +--->123abcdef + 0 ^ ^ d + 1 ^ ^ f + 0: abcdef + +/(?C1)\dabc(?C2)def/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'f' + 1234abcdef +--->1234abcdef + 1 ^ \d + 1 ^ \d + 1 ^ \d + 1 ^ \d + 2 ^ ^ d + 0: 4abcdef + *** Failers +No match + abcdef +--->abcdef + 1 ^ \d + 1 ^ \d + 1 ^ \d + 1 ^ \d + 1 ^ \d + 1 ^ \d +No match + +/(?C255)ab/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/(?C256)ab/I +Failed: number after (?C is > 255 at offset 6 + +/(?Cab)xx/I +Failed: closing ) for (?C expected at offset 3 + +/(?C12vr)x/I +Failed: closing ) for (?C expected at offset 5 + +/abc(?C)def/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'f' + *** Failers +No match + \x83\x0\x61bcdef +--->\x83\x00abcdef + 0 ^ ^ d + 0: abcdef + +/(abc)(?C)de(?C1)f/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'f' + 123abcdef +--->123abcdef + 0 ^ ^ d + 1 ^ ^ f + 0: abcdef + 1: abc + 123abcdef\C+ +Callout 0: last capture = 1 + 0: + 1: abc +--->123abcdef + ^ ^ d +Callout 1: last capture = 1 + 0: + 1: abc +--->123abcdef + ^ ^ f + 0: abcdef + 1: abc + 123abcdef\C- + 0: abcdef + 1: abc + *** Failers +No match + 123abcdef\C!1 +--->123abcdef + 0 ^ ^ d + 1 ^ ^ f +No match + +/(?C0)(abc(?C1))*/I +Capturing subpattern count = 1 +No options +No first char +No need char + abcabcabc +--->abcabcabc + 0 ^ (abc(?C1))* + 1 ^ ^ ) + 1 ^ ^ ) + 1 ^ ^ ) + 0: abcabcabc + 1: abc + abcabc\C!1!3 +--->abcabc + 0 ^ (abc(?C1))* + 1 ^ ^ ) + 1 ^ ^ ) + 0: abcabc + 1: abc + *** Failers +--->*** Failers + 0 ^ (abc(?C1))* + 0: + abcabcabc\C!1!3 +--->abcabcabc + 0 ^ (abc(?C1))* + 1 ^ ^ ) + 1 ^ ^ ) + 1 ^ ^ ) + 0: abcabc + 1: abc + +/(\d{3}(?C))*/I +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +No need char + 123\C+ +Callout 0: last capture = -1 + 0: +--->123 + ^ ^ ) + 0: 123 + 1: 123 + 123456\C+ +Callout 0: last capture = -1 + 0: +--->123456 + ^ ^ ) +Callout 0: last capture = 1 + 0: + 1: 123 +--->123456 + ^ ^ ) + 0: 123456 + 1: 456 + 123456789\C+ +Callout 0: last capture = -1 + 0: +--->123456789 + ^ ^ ) +Callout 0: last capture = 1 + 0: + 1: 123 +--->123456789 + ^ ^ ) +Callout 0: last capture = 1 + 0: + 1: 456 +--->123456789 + ^ ^ ) + 0: 123456789 + 1: 789 + +/((xyz)(?C)p|(?C1)xyzabc)/I +Capturing subpattern count = 2 +No options +First char = 'x' +No need char + xyzabc\C+ +Callout 0: last capture = 2 + 0: + 1: + 2: xyz +--->xyzabc + ^ ^ p +Callout 1: last capture = -1 + 0: +--->xyzabc + ^ x + 0: xyzabc + 1: xyzabc + +/(X)((xyz)(?C)p|(?C1)xyzabc)/I +Capturing subpattern count = 3 +No options +First char = 'X' +Need char = 'x' + Xxyzabc\C+ +Callout 0: last capture = 3 + 0: + 1: X + 2: + 3: xyz +--->Xxyzabc + ^ ^ p +Callout 1: last capture = 1 + 0: + 1: X +--->Xxyzabc + ^^ x + 0: Xxyzabc + 1: X + 2: xyzabc + +/(?=(abc))(?C)abcdef/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'f' + abcdef\C+ +Callout 0: last capture = 1 + 0: + 1: abc +--->abcdef + ^ a + 0: abcdef + 1: abc + +/(?!(abc)(?C1)d)(?C2)abcxyz/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'z' + abcxyz\C+ +Callout 1: last capture = 1 + 0: + 1: abc +--->abcxyz + ^ ^ d +Callout 2: last capture = -1 + 0: +--->abcxyz + ^ a + 0: abcxyz + +/(?<=(abc)(?C))xyz/I +Capturing subpattern count = 1 +No options +First char = 'x' +Need char = 'z' + abcxyz\C+ +Callout 0: last capture = 1 + 0: + 1: abc +--->abcxyz + ^ ) + 0: xyz + 1: abc + +/a(b+)(c*)(?C1)/I +Capturing subpattern count = 2 +Partial matching not supported +No options +First char = 'a' +Need char = 'b' + abbbbbccc\C*1 +--->abbbbbccc + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 +No match + +/a(b+?)(c*?)(?C1)/I +Capturing subpattern count = 2 +Partial matching not supported +No options +First char = 'a' +Need char = 'b' + abbbbbccc\C*1 +--->abbbbbccc + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 +No match + +/(?C)abc/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/(?C)^abc/I +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/(?C)a|b/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Starting byte set: a b + +/(?R)/I +Failed: recursive call could loop indefinitely at offset 3 + +/(a|(?R))/I +Failed: recursive call could loop indefinitely at offset 6 + +/(ab|(bc|(de|(?R))))/I +Failed: recursive call could loop indefinitely at offset 15 + +/x(ab|(bc|(de|(?R))))/I +Capturing subpattern count = 3 +No options +First char = 'x' +No need char + xab + 0: xab + 1: ab + xbc + 0: xbc + 1: bc + 2: bc + xde + 0: xde + 1: de + 2: de + 3: de + xxab + 0: xxab + 1: xab + 2: xab + 3: xab + xxxab + 0: xxxab + 1: xxab + 2: xxab + 3: xxab + *** Failers +No match + xyab +No match + +/(ab|(bc|(de|(?1))))/I +Failed: recursive call could loop indefinitely at offset 15 + +/x(ab|(bc|(de|(?1)x)x)x)/I +Failed: recursive call could loop indefinitely at offset 16 + +/^([^()]|\((?1)*\))*$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + abc + 0: abc + 1: c + a(b)c + 0: a(b)c + 1: c + a(b(c))d + 0: a(b(c))d + 1: d + *** Failers) +No match + a(b(c)d +No match + +/^>abc>([^()]|\((?1)*\))*abc>123abc>123abc>1(2)3abc>1(2)3abc>(1(2)3)abc>(1(2)3) + 2: + 3: Satan, oscillate my metallic sonatas + 4: S + A man, a plan, a canal: Panama! + 0: A man, a plan, a canal: Panama! + 1: + 2: + 3: A man, a plan, a canal: Panama + 4: A + Able was I ere I saw Elba. + 0: Able was I ere I saw Elba. + 1: + 2: + 3: Able was I ere I saw Elba + 4: A + *** Failers +No match + The quick brown fox +No match + +/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/I +Capturing subpattern count = 2 +Partial matching not supported +Options: anchored +No first char +No need char + 12 + 0: 12 + 1: 12 + (((2+2)*-3)-7) + 0: (((2+2)*-3)-7) + 1: (((2+2)*-3)-7) + 2: - + -12 + 0: -12 + 1: -12 + *** Failers +No match + ((2+2)*-3)-7) +No match + +/^(x(y|(?1){2})z)/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + xyz + 0: xyz + 1: xyz + 2: y + xxyzxyzz + 0: xxyzxyzz + 1: xxyzxyzz + 2: xyzxyz + *** Failers +No match + xxyzz +No match + xxyzxyzxyzz +No match + +/((< (?: (?(R) \d++ | [^<>]*+) | (?2)) * >))/Ix +Capturing subpattern count = 2 +Partial matching not supported +Options: extended +First char = '<' +Need char = '>' + <> + 0: <> + 1: <> + 2: <> + + 0: + 1: + 2: + hij> + 0: hij> + 1: hij> + 2: hij> + hij> + 0: + 1: + 2: + def> + 0: def> + 1: def> + 2: def> + + 0: <> + 1: <> + 2: <> + *** Failers +No match + b|c)d(?Pe)/DZ +------------------------------------------------------------------ + Bra + a + CBra 1 + b + Alt + c + Ket + d + CBra 2 + e + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + longername2 2 + name1 1 +No options +First char = 'a' +Need char = 'e' + abde + 0: abde + 1: b + 2: e + acde + 0: acde + 1: c + 2: e + +/(?:a(?Pc(?Pd)))(?Pa)/DZ +------------------------------------------------------------------ + Bra + Bra + a + CBra 1 + c + CBra 2 + d + Ket + Ket + Ket + CBra 3 + a + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 3 +Named capturing subpatterns: + a 3 + c 1 + d 2 +No options +First char = 'a' +Need char = 'a' + +/(?Pa)...(?P=a)bbb(?P>a)d/DZ +------------------------------------------------------------------ + Bra + CBra 1 + a + Ket + Any + Any + Any + \1 + bbb + Once + Recurse + Ket + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Max back reference = 1 +Named capturing subpatterns: + a 1 +No options +First char = 'a' +Need char = 'd' + +/^\W*(?:(?P(?P.)\W*(?P>one)\W*(?P=two)|)|(?P(?P.)\W*(?P>three)\W*(?P=four)|\W*.\W*))\W*$/Ii +Capturing subpattern count = 4 +Max back reference = 4 +Named capturing subpatterns: + four 4 + one 1 + three 3 + two 2 +Partial matching not supported +Options: anchored caseless +No first char +No need char + 1221 + 0: 1221 + 1: 1221 + 2: 1 + Satan, oscillate my metallic sonatas! + 0: Satan, oscillate my metallic sonatas! + 1: + 2: + 3: Satan, oscillate my metallic sonatas + 4: S + A man, a plan, a canal: Panama! + 0: A man, a plan, a canal: Panama! + 1: + 2: + 3: A man, a plan, a canal: Panama + 4: A + Able was I ere I saw Elba. + 0: Able was I ere I saw Elba. + 1: + 2: + 3: Able was I ere I saw Elba + 4: A + *** Failers +No match + The quick brown fox +No match + +/((?(R)a|b))\1(?1)?/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char + bb + 0: bb + 1: b + bbaa + 0: bba + 1: b + +/(.*)a/Is +Capturing subpattern count = 1 +Partial matching not supported +Options: anchored dotall +No first char +Need char = 'a' + +/(.*)a\1/Is +Capturing subpattern count = 1 +Max back reference = 1 +Partial matching not supported +Options: dotall +No first char +Need char = 'a' + +/(.*)a(b)\2/Is +Capturing subpattern count = 2 +Max back reference = 2 +Partial matching not supported +Options: anchored dotall +No first char +Need char = 'b' + +/((.*)a|(.*)b)z/Is +Capturing subpattern count = 3 +Partial matching not supported +Options: anchored dotall +No first char +Need char = 'z' + +/((.*)a|(.*)b)z\1/Is +Capturing subpattern count = 3 +Max back reference = 1 +Partial matching not supported +Options: dotall +No first char +Need char = 'z' + +/((.*)a|(.*)b)z\2/Is +Capturing subpattern count = 3 +Max back reference = 2 +Partial matching not supported +Options: dotall +No first char +Need char = 'z' + +/((.*)a|(.*)b)z\3/Is +Capturing subpattern count = 3 +Max back reference = 3 +Partial matching not supported +Options: dotall +No first char +Need char = 'z' + +/((.*)a|^(.*)b)z\3/Is +Capturing subpattern count = 3 +Max back reference = 3 +Partial matching not supported +Options: anchored dotall +No first char +Need char = 'z' + +/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is +Capturing subpattern count = 31 +Partial matching not supported +Options: anchored dotall +No first char +No need char + +/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/Is +Capturing subpattern count = 31 +Max back reference = 31 +Partial matching not supported +Options: dotall +No first char +No need char + +/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/Is +Capturing subpattern count = 32 +Max back reference = 32 +Partial matching not supported +Options: dotall +No first char +No need char + +/(a)(bc)/INDZ +------------------------------------------------------------------ + Bra + Bra + a + Ket + Bra + bc + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: no_auto_capture +First char = 'a' +Need char = 'c' + abc + 0: abc + +/(?Pa)(bc)/INDZ +------------------------------------------------------------------ + Bra + CBra 1 + a + Ket + Bra + bc + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Named capturing subpatterns: + one 1 +Options: no_auto_capture +First char = 'a' +Need char = 'c' + abc + 0: abc + 1: a + +/(a)(?Pbc)/INDZ +------------------------------------------------------------------ + Bra + Bra + a + Ket + CBra 1 + bc + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Named capturing subpatterns: + named 1 +Options: no_auto_capture +First char = 'a' +Need char = 'c' + +/(a+)*zz/I +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +Need char = 'z' + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\M +Minimum match() limit = 8 +Minimum match() recursion limit = 6 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazz + 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaz\M +Minimum match() limit = 32768 +Minimum match() recursion limit = 42 +No match + +/(aaa(?C1)bbb|ab)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'b' + aaabbb +--->aaabbb + 1 ^ ^ b + 0: aaabbb + 1: aaabbb + aaabbb\C*0 +--->aaabbb + 1 ^ ^ b + 0: aaabbb + 1: aaabbb + aaabbb\C*1 +--->aaabbb + 1 ^ ^ b +Callout data = 1 + 0: ab + 1: ab + aaabbb\C*-1 +--->aaabbb + 1 ^ ^ b +Callout data = -1 +No match + +/ab(?Pcd)ef(?Pgh)/I +Capturing subpattern count = 2 +Named capturing subpatterns: + one 1 + two 2 +No options +First char = 'a' +Need char = 'h' + abcdefgh + 0: abcdefgh + 1: cd + 2: gh + abcdefgh\C1\Gtwo + 0: abcdefgh + 1: cd + 2: gh + 1C cd (2) + G gh (2) two + abcdefgh\Cone\Ctwo + 0: abcdefgh + 1: cd + 2: gh + C cd (2) one + C gh (2) two + abcdefgh\Cthree +no parentheses with name "three" + 0: abcdefgh + 1: cd + 2: gh +copy substring three failed -7 + +/(?P)(?P)/DZ +------------------------------------------------------------------ + Bra + CBra 1 + Ket + CBra 2 + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + Tes 1 + Test 2 +No options +No first char +No need char + +/(?P)(?P)/DZ +------------------------------------------------------------------ + Bra + CBra 1 + Ket + CBra 2 + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + Tes 2 + Test 1 +No options +No first char +No need char + +/(?Pzz)(?Paa)/I +Capturing subpattern count = 2 +Named capturing subpatterns: + A 2 + Z 1 +No options +First char = 'z' +Need char = 'a' + zzaa\CZ + 0: zzaa + 1: zz + 2: aa + C zz (2) Z + zzaa\CA + 0: zzaa + 1: zz + 2: aa + C aa (2) A + +/(?Peks)(?Peccs)/I +Failed: two named subpatterns have the same name at offset 15 + +/(?Pabc(?Pdef)(?Pxyz))/I +Failed: two named subpatterns have the same name at offset 30 + +"\[((?P\d+)(,(?P>elem))*)\]"I +Capturing subpattern count = 3 +Named capturing subpatterns: + elem 2 +Partial matching not supported +No options +First char = '[' +Need char = ']' + [10,20,30,5,5,4,4,2,43,23,4234] + 0: [10,20,30,5,5,4,4,2,43,23,4234] + 1: 10,20,30,5,5,4,4,2,43,23,4234 + 2: 10 + 3: ,4234 + *** Failers +No match + [] +No match + +"\[((?P\d+)(,(?P>elem))*)?\]"I +Capturing subpattern count = 3 +Named capturing subpatterns: + elem 2 +Partial matching not supported +No options +First char = '[' +Need char = ']' + [10,20,30,5,5,4,4,2,43,23,4234] + 0: [10,20,30,5,5,4,4,2,43,23,4234] + 1: 10,20,30,5,5,4,4,2,43,23,4234 + 2: 10 + 3: ,4234 + [] + 0: [] + +/(a(b(?2)c))?/DZ +------------------------------------------------------------------ + Bra + Brazero + CBra 1 + a + CBra 2 + b + Once + Recurse + Ket + c + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +No options +No first char +No need char + +/(a(b(?2)c))*/DZ +------------------------------------------------------------------ + Bra + Brazero + CBra 1 + a + CBra 2 + b + Once + Recurse + Ket + c + Ket + KetRmax + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +No options +No first char +No need char + +/(a(b(?2)c)){0,2}/DZ +------------------------------------------------------------------ + Bra + Brazero + Bra + CBra 1 + a + CBra 2 + b + Once + Recurse + Ket + c + Ket + Ket + Brazero + CBra 1 + a + CBra 2 + b + Once + Recurse + Ket + c + Ket + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +No options +No first char +No need char + +/[ab]{1}+/DZ +------------------------------------------------------------------ + Bra + Once + [ab]{1,1} + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii +Capturing subpattern count = 3 +Partial matching not supported +Options: caseless +No first char +Need char = 'g' (caseless) + Baby Bjorn Active Carrier - With free SHIPPING!! + 0: Baby Bjorn Active Carrier - With free SHIPPING!! + 1: Baby Bjorn Active Carrier - With free SHIPPING!! + +/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/IiS +Capturing subpattern count = 3 +Partial matching not supported +Options: caseless +No first char +Need char = 'g' (caseless) +Study returned NULL + Baby Bjorn Active Carrier - With free SHIPPING!! + 0: Baby Bjorn Active Carrier - With free SHIPPING!! + 1: Baby Bjorn Active Carrier - With free SHIPPING!! + +/a*.*b/ISDZ +------------------------------------------------------------------ + Bra + a* + Any* + b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +Need char = 'b' +Study returned NULL + +/(a|b)*.?c/ISDZ +------------------------------------------------------------------ + Bra + Brazero + CBra 1 + a + Alt + b + KetRmax + Any? + c + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +No options +No first char +Need char = 'c' +Study returned NULL + +/abc(?C255)de(?C)f/DZ +------------------------------------------------------------------ + Bra + abc + Callout 255 10 1 + de + Callout 0 16 1 + f + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'f' + +/abcde/ICDZ +------------------------------------------------------------------ + Bra + Callout 255 0 1 + a + Callout 255 1 1 + b + Callout 255 2 1 + c + Callout 255 3 1 + d + Callout 255 4 1 + e + Callout 255 5 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: +First char = 'a' +Need char = 'e' + abcde +--->abcde + +0 ^ a + +1 ^^ b + +2 ^ ^ c + +3 ^ ^ d + +4 ^ ^ e + +5 ^ ^ + 0: abcde + abcdfe +--->abcdfe + +0 ^ a + +1 ^^ b + +2 ^ ^ c + +3 ^ ^ d + +4 ^ ^ e +No match + +/a*b/ICDZ +------------------------------------------------------------------ + Bra + Callout 255 0 2 + a*+ + Callout 255 2 1 + b + Callout 255 3 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: +No first char +Need char = 'b' + ab +--->ab + +0 ^ a* + +2 ^^ b + +3 ^ ^ + 0: ab + aaaab +--->aaaab + +0 ^ a* + +2 ^ ^ b + +3 ^ ^ + 0: aaaab + aaaacb +--->aaaacb + +0 ^ a* + +2 ^ ^ b + +0 ^ a* + +2 ^ ^ b + +0 ^ a* + +2 ^ ^ b + +0 ^ a* + +2 ^^ b + +0 ^ a* + +2 ^ b + +0 ^ a* + +2 ^ b + +3 ^^ + 0: b + +/a+b/ICDZ +------------------------------------------------------------------ + Bra + Callout 255 0 2 + a++ + Callout 255 2 1 + b + Callout 255 3 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: +First char = 'a' +Need char = 'b' + ab +--->ab + +0 ^ a+ + +2 ^^ b + +3 ^ ^ + 0: ab + aaaab +--->aaaab + +0 ^ a+ + +2 ^ ^ b + +3 ^ ^ + 0: aaaab + aaaacb +--->aaaacb + +0 ^ a+ + +2 ^ ^ b + +0 ^ a+ + +2 ^ ^ b + +0 ^ a+ + +2 ^ ^ b + +0 ^ a+ + +2 ^^ b +No match + +/(abc|def)x/ICDZ +------------------------------------------------------------------ + Bra + Callout 255 0 9 + CBra 1 + Callout 255 1 1 + a + Callout 255 2 1 + b + Callout 255 3 1 + c + Callout 255 4 0 + Alt + Callout 255 5 1 + d + Callout 255 6 1 + e + Callout 255 7 1 + f + Callout 255 8 0 + Ket + Callout 255 9 1 + x + Callout 255 10 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: +No first char +Need char = 'x' + abcx +--->abcx + +0 ^ (abc|def) + +1 ^ a + +2 ^^ b + +3 ^ ^ c + +4 ^ ^ | + +9 ^ ^ x ++10 ^ ^ + 0: abcx + 1: abc + defx +--->defx + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +6 ^^ e + +7 ^ ^ f + +8 ^ ^ ) + +9 ^ ^ x ++10 ^ ^ + 0: defx + 1: def + abcdefzx +--->abcdefzx + +0 ^ (abc|def) + +1 ^ a + +2 ^^ b + +3 ^ ^ c + +4 ^ ^ | + +9 ^ ^ x + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +6 ^^ e + +7 ^ ^ f + +8 ^ ^ ) + +9 ^ ^ x + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d +No match + +/(ab|cd){3,4}/IC +Capturing subpattern count = 1 +Options: +No first char +No need char + ababab +--->ababab + +0 ^ (ab|cd){3,4} + +1 ^ a + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +2 ^ ^ b + +3 ^ ^ | + +1 ^ ^ a + +2 ^ ^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c ++12 ^ ^ + 0: ababab + 1: ab + abcdabcd +--->abcdabcd + +0 ^ (ab|cd){3,4} + +1 ^ a + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) + +1 ^ ^ a + +2 ^ ^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) ++12 ^ ^ + 0: abcdabcd + 1: cd + abcdcdcdcdcd +--->abcdcdcdcdcd + +0 ^ (ab|cd){3,4} + +1 ^ a + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) ++12 ^ ^ + 0: abcdcdcd + 1: cd + +/([ab]{,4}c|xy)/ICDZ +------------------------------------------------------------------ + Bra + Callout 255 0 14 + CBra 1 + Callout 255 1 4 + [ab] + Callout 255 5 1 + { + Callout 255 6 1 + , + Callout 255 7 1 + 4 + Callout 255 8 1 + } + Callout 255 9 1 + c + Callout 255 10 0 + Alt + Callout 255 11 1 + x + Callout 255 12 1 + y + Callout 255 13 0 + Ket + Callout 255 14 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: +No first char +No need char + Note: that { does NOT introduce a quantifier +--->Note: that { does NOT introduce a quantifier + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] + +5 ^^ { ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] + +5 ^^ { ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] + +5 ^^ { ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x +No match + +/([ab]{1,4}c|xy){4,5}?123/ICDZ +------------------------------------------------------------------ + Bra + Callout 255 0 21 + CBra 1 + Callout 255 1 9 + [ab]{1,4} + Callout 255 10 1 + c + Callout 255 11 0 + Alt + Callout 255 12 1 + x + Callout 255 13 1 + y + Callout 255 14 0 + Ket + CBra 1 + Callout 255 1 9 + [ab]{1,4} + Callout 255 10 1 + c + Callout 255 11 0 + Alt + Callout 255 12 1 + x + Callout 255 13 1 + y + Callout 255 14 0 + Ket + CBra 1 + Callout 255 1 9 + [ab]{1,4} + Callout 255 10 1 + c + Callout 255 11 0 + Alt + Callout 255 12 1 + x + Callout 255 13 1 + y + Callout 255 14 0 + Ket + CBra 1 + Callout 255 1 9 + [ab]{1,4} + Callout 255 10 1 + c + Callout 255 11 0 + Alt + Callout 255 12 1 + x + Callout 255 13 1 + y + Callout 255 14 0 + Ket + Braminzero + CBra 1 + Callout 255 1 9 + [ab]{1,4} + Callout 255 10 1 + c + Callout 255 11 0 + Alt + Callout 255 12 1 + x + Callout 255 13 1 + y + Callout 255 14 0 + Ket + Callout 255 21 1 + 1 + Callout 255 22 1 + 2 + Callout 255 23 1 + 3 + Callout 255 24 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Partial matching not supported +Options: +No first char +Need char = '3' + aacaacaacaacaac123 +--->aacaacaacaacaac123 + +0 ^ ([ab]{1,4}c|xy){4,5}? + +1 ^ [ab]{1,4} ++10 ^ ^ c ++11 ^ ^ | + +1 ^ ^ [ab]{1,4} ++10 ^ ^ c ++11 ^ ^ | + +1 ^ ^ [ab]{1,4} ++10 ^ ^ c ++11 ^ ^ | + +1 ^ ^ [ab]{1,4} ++10 ^ ^ c ++11 ^ ^ | ++21 ^ ^ 1 + +1 ^ ^ [ab]{1,4} ++10 ^ ^ c ++11 ^ ^ | ++21 ^ ^ 1 ++22 ^ ^ 2 ++23 ^ ^ 3 ++24 ^ ^ + 0: aacaacaacaacaac123 + 1: aac + +/\b.*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + ab cd\>1 + 0: cd + +/\b.*/Is +Capturing subpattern count = 0 +Partial matching not supported +Options: dotall +No first char +No need char + ab cd\>1 + 0: cd + +/(?!.bcd).*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + Xbcd12345 + 0: bcd12345 + +/abcde/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'e' + ab\P +Partial match + abc\P +Partial match + abcd\P +Partial match + abcde\P + 0: abcde + the quick brown abc\P +Partial match + ** Failers\P +No match + the quick brown abxyz fox\P +No match + +"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\d\d$"I +Capturing subpattern count = 3 +Options: anchored +No first char +Need char = '/' + 13/05/04\P + 0: 13/05/04 + 1: 13 + 2: 05 + 13/5/2004\P + 0: 13/5/2004 + 1: 13 + 2: 5 + 3: 20 + 02/05/09\P + 0: 02/05/09 + 1: 02 + 2: 05 + 1\P +Partial match + 1/2\P +Partial match + 1/2/0\P +Partial match + 1/2/04\P + 0: 1/2/04 + 1: 1 + 2: 2 + 0\P +Partial match + 02/\P +Partial match + 02/0\P +Partial match + 02/1\P +Partial match + ** Failers\P +No match + \P +No match + 123\P +No match + 33/4/04\P +No match + 3/13/04\P +No match + 0/1/2003\P +No match + 0/\P +No match + 02/0/\P +No match + 02/13\P +No match + +/0{0,2}ABC/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +Need char = 'C' + +/\d{3,}ABC/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +Need char = 'C' + +/\d*ABC/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +Need char = 'C' + +/[abc]+DE/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +Need char = 'E' + +/[abc]?123/I +Capturing subpattern count = 0 +No options +No first char +Need char = '3' + 123\P + 0: 123 + a\P +Partial match + b\P +Partial match + c\P +Partial match + c12\P +Partial match + c123\P + 0: c123 + +/^(?:\d){3,5}X/I +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'X' + 1\P +Partial match + 123\P +Partial match + 123X + 0: 123X + 1234\P +Partial match + 1234X + 0: 1234X + 12345\P +Partial match + 12345X + 0: 12345X + *** Failers +No match + 1X +No match + 123456\P +No match + +/abc/I>testsavedregex +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Compiled regex written to testsavedregex +testsavedregex +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Compiled regex written to testsavedregex +testsavedregex +Capturing subpattern count = 1 +No options +No first char +No need char +Starting byte set: a b +Compiled regex written to testsavedregex +Study data written to testsavedregex +testsavedregex +Capturing subpattern count = 1 +No options +No first char +No need char +Starting byte set: a b +Compiled regex written to testsavedregex +Study data written to testsavedregex +(.)*~smgI +Capturing subpattern count = 3 +Max back reference = 1 +Partial matching not supported +Options: multiline dotall +First char = '<' +Need char = '>' + \n\n\nPartner der LCO\nde\nPartner der LINEAS Consulting\nGmbH\nLINEAS Consulting GmbH Hamburg\nPartnerfirmen\n30 days\nindex,follow\n\nja\n3\nPartner\n\n\nLCO\nLINEAS Consulting\n15.10.2003\n\n\n\n\nDie Partnerfirmen der LINEAS Consulting\nGmbH\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + 0: \x0a\x0aPartner der LCO\x0ade\x0aPartner der LINEAS Consulting\x0aGmbH\x0aLINEAS Consulting GmbH Hamburg\x0aPartnerfirmen\x0a30 days\x0aindex,follow\x0a\x0aja\x0a3\x0aPartner\x0a\x0a\x0aLCO\x0aLINEAS Consulting\x0a15.10.2003\x0a\x0a\x0a\x0a\x0aDie Partnerfirmen der LINEAS Consulting\x0aGmbH\x0a\x0a\x0a \x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a + 1: seite + 2: \x0a + 3: seite + +/^a/IF +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/line\nbreak/I +Capturing subpattern count = 0 +Contains explicit CR or LF match +No options +First char = 'l' +Need char = 'k' + this is a line\nbreak + 0: line\x0abreak + line one\nthis is a line\nbreak in the second line + 0: line\x0abreak + +/line\nbreak/If +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: firstline +First char = 'l' +Need char = 'k' + this is a line\nbreak + 0: line\x0abreak + ** Failers +No match + line one\nthis is a line\nbreak in the second line +No match + +/line\nbreak/Imf +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: multiline firstline +First char = 'l' +Need char = 'k' + this is a line\nbreak + 0: line\x0abreak + ** Failers +No match + line one\nthis is a line\nbreak in the second line +No match + +/ab.cd/IP + ab-cd + 0: ab-cd + ab=cd + 0: ab=cd + ** Failers +No match: POSIX code 17: match failed + ab\ncd +No match: POSIX code 17: match failed + +/ab.cd/IPs + ab-cd + 0: ab-cd + ab=cd + 0: ab=cd + ab\ncd + 0: ab\x0acd + +/(?i)(?-i)AbCd/I +Capturing subpattern count = 0 +No options +First char = 'A' +Need char = 'd' + AbCd + 0: AbCd + ** Failers +No match + abcd +No match + +/a{11111111111111111111}/I +Failed: number too big in {} quantifier at offset 22 + +/(){64294967295}/I +Failed: number too big in {} quantifier at offset 14 + +/(){2,4294967295}/I +Failed: number too big in {} quantifier at offset 15 + +"(?i:a)(?i:b)(?i:c)(?i:d)(?i:e)(?i:f)(?i:g)(?i:h)(?i:i)(?i:j)(k)(?i:l)A\1B"I +Capturing subpattern count = 1 +Max back reference = 1 +No options +First char = 'a' (caseless) +Need char = 'B' + abcdefghijklAkB + 0: abcdefghijklAkB + 1: k + +"(?Pa)(?Pb)(?Pc)(?Pd)(?Pe)(?Pf)(?Pg)(?Ph)(?Pi)(?Pj)(?Pk)(?Pl)A\11B"I +Capturing subpattern count = 12 +Max back reference = 11 +Named capturing subpatterns: + n0 1 + n1 2 + n10 11 + n11 12 + n2 3 + n3 4 + n4 5 + n5 6 + n6 7 + n7 8 + n8 9 + n9 10 +No options +First char = 'a' +Need char = 'B' + abcdefghijklAkB + 0: abcdefghijklAkB + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: l + +"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\11B"I +Capturing subpattern count = 12 +Max back reference = 11 +No options +First char = 'a' +Need char = 'B' + abcdefghijklAkB + 0: abcdefghijklAkB + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: l + +"(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)"I +Capturing subpattern count = 101 +Named capturing subpatterns: + name0 1 + name1 2 + name10 11 + name100 101 + name11 12 + name12 13 + name13 14 + name14 15 + name15 16 + name16 17 + name17 18 + name18 19 + name19 20 + name2 3 + name20 21 + name21 22 + name22 23 + name23 24 + name24 25 + name25 26 + name26 27 + name27 28 + name28 29 + name29 30 + name3 4 + name30 31 + name31 32 + name32 33 + name33 34 + name34 35 + name35 36 + name36 37 + name37 38 + name38 39 + name39 40 + name4 5 + name40 41 + name41 42 + name42 43 + name43 44 + name44 45 + name45 46 + name46 47 + name47 48 + name48 49 + name49 50 + name5 6 + name50 51 + name51 52 + name52 53 + name53 54 + name54 55 + name55 56 + name56 57 + name57 58 + name58 59 + name59 60 + name6 7 + name60 61 + name61 62 + name62 63 + name63 64 + name64 65 + name65 66 + name66 67 + name67 68 + name68 69 + name69 70 + name7 8 + name70 71 + name71 72 + name72 73 + name73 74 + name74 75 + name75 76 + name76 77 + name77 78 + name78 79 + name79 80 + name8 9 + name80 81 + name81 82 + name82 83 + name83 84 + name84 85 + name85 86 + name86 87 + name87 88 + name88 89 + name89 90 + name9 10 + name90 91 + name91 92 + name92 93 + name93 94 + name94 95 + name95 96 + name96 97 + name97 98 + name98 99 + name99 100 +No options +First char = 'a' +Need char = 'a' + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +Matched, but too many substrings + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 1: a + 2: a + 3: a + 4: a + 5: a + 6: a + 7: a + 8: a + 9: a +10: a +11: a +12: a +13: a +14: a + +"(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)"I +Capturing subpattern count = 101 +No options +First char = 'a' +Need char = 'a' + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +Matched, but too many substrings + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 1: a + 2: a + 3: a + 4: a + 5: a + 6: a + 7: a + 8: a + 9: a +10: a +11: a +12: a +13: a +14: a + +/[^()]*(?:\((?R)\)[^()]*)*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + (this(and)that + 0: + (this(and)that) + 0: (this(and)that) + (this(and)that)stuff + 0: (this(and)that)stuff + +/[^()]*(?:\((?>(?R))\)[^()]*)*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + (this(and)that + 0: + (this(and)that) + 0: (this(and)that) + +/[^()]*(?:\((?R)\))*[^()]*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + (this(and)that + 0: + (this(and)that) + 0: (this(and)that) + +/(?:\((?R)\))*[^()]*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + (this(and)that + 0: + (this(and)that) + 0: + ((this)) + 0: ((this)) + +/(?:\((?R)\))|[^()]*/I +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +No need char + (this(and)that + 0: + (this(and)that) + 0: + (this) + 0: (this) + ((this)) + 0: ((this)) + +/a(b)c/IPN + abc +Matched with REG_NOSUB + +/a(?Pb)c/IPN + abc +Matched with REG_NOSUB + +/\x{100}/I +Failed: character value in \x{...} sequence is too large at offset 6 + +/\x{0000ff}/I +Capturing subpattern count = 0 +No options +First char = 255 +No need char + +/^((?Pa1)|(?Pa2)b)/I +Failed: two named subpatterns have the same name at offset 17 + +/^((?Pa1)|(?Pa2)b)/IJ +Capturing subpattern count = 3 +Named capturing subpatterns: + A 2 + A 3 +Options: anchored dupnames +No first char +No need char + a1b\CA + 0: a1 + 1: a1 + 2: a1 + C a1 (2) A + a2b\CA + 0: a2b + 1: a2b + 2: + 3: a2 + C a2 (2) A + ** Failers +No match + a1b\CZ\CA +no parentheses with name "Z" + 0: a1 + 1: a1 + 2: a1 +copy substring Z failed -7 + C a1 (2) A + +/^(?Pa)(?Pb)/IJ +Capturing subpattern count = 2 +Named capturing subpatterns: + A 1 + A 2 +Options: anchored dupnames +No first char +No need char + ab\CA + 0: ab + 1: a + 2: b + C a (1) A + +/^(?Pa)(?Pb)|cd/IJ +Capturing subpattern count = 2 +Named capturing subpatterns: + A 1 + A 2 +Options: dupnames +No first char +No need char + ab\CA + 0: ab + 1: a + 2: b + C a (1) A + cd\CA + 0: cd +copy substring A failed -7 + +/^(?Pa)(?Pb)|cd(?Pef)(?Pgh)/IJ +Capturing subpattern count = 4 +Named capturing subpatterns: + A 1 + A 2 + A 3 + A 4 +Options: dupnames +No first char +No need char + cdefgh\CA + 0: cdefgh + 1: + 2: + 3: ef + 4: gh + C ef (2) A + +/^((?Pa1)|(?Pa2)b)/IJ +Capturing subpattern count = 3 +Named capturing subpatterns: + A 2 + A 3 +Options: anchored dupnames +No first char +No need char + a1b\GA + 0: a1 + 1: a1 + 2: a1 + G a1 (2) A + a2b\GA + 0: a2b + 1: a2b + 2: + 3: a2 + G a2 (2) A + ** Failers +No match + a1b\GZ\GA +no parentheses with name "Z" + 0: a1 + 1: a1 + 2: a1 +copy substring Z failed -7 + G a1 (2) A + +/^(?Pa)(?Pb)/IJ +Capturing subpattern count = 2 +Named capturing subpatterns: + A 1 + A 2 +Options: anchored dupnames +No first char +No need char + ab\GA + 0: ab + 1: a + 2: b + G a (1) A + +/^(?Pa)(?Pb)|cd/IJ +Capturing subpattern count = 2 +Named capturing subpatterns: + A 1 + A 2 +Options: dupnames +No first char +No need char + ab\GA + 0: ab + 1: a + 2: b + G a (1) A + cd\GA + 0: cd +copy substring A failed -7 + +/^(?Pa)(?Pb)|cd(?Pef)(?Pgh)/IJ +Capturing subpattern count = 4 +Named capturing subpatterns: + A 1 + A 2 + A 3 + A 4 +Options: dupnames +No first char +No need char + cdefgh\GA + 0: cdefgh + 1: + 2: + 3: ef + 4: gh + G ef (2) A + +/(?J)^((?Pa1)|(?Pa2)b)/I +Capturing subpattern count = 3 +Named capturing subpatterns: + A 2 + A 3 +Options: anchored dupnames +Duplicate name status changes +No first char +No need char + a1b\CA + 0: a1 + 1: a1 + 2: a1 + C a1 (2) A + a2b\CA + 0: a2b + 1: a2b + 2: + 3: a2 + C a2 (2) A + +/^(?Pa) (?J:(?Pb)(?Pc)) (?Pd)/I +Failed: two named subpatterns have the same name at offset 37 + +/ In this next test, J is not set at the outer level; consequently it isn't +set in the pattern's options; consequently pcre_get_named_substring() produces +a random value. /Ix +Capturing subpattern count = 1 +Options: extended +First char = 'I' +Need char = 'e' + +/^(?Pa) (?J:(?Pb)(?Pc)) (?Pd)/I +Capturing subpattern count = 4 +Named capturing subpatterns: + A 1 + B 2 + B 3 + C 4 +Options: anchored +Duplicate name status changes +No first char +No need char + a bc d\CA\CB\CC + 0: a bc d + 1: a + 2: b + 3: c + 4: d + C a (1) A + C b (1) B + C d (1) C + +/^(?Pa)?(?(A)a|b)/I +Capturing subpattern count = 1 +Named capturing subpatterns: + A 1 +Options: anchored +No first char +No need char + aabc + 0: aa + 1: a + bc + 0: b + ** Failers +No match + abc +No match + +/(?:(?(ZZ)a|b)(?PX))+/I +Capturing subpattern count = 1 +Named capturing subpatterns: + ZZ 1 +No options +No first char +Need char = 'X' + bXaX + 0: bXaX + 1: X + +/(?:(?(2y)a|b)(X))+/I +Failed: reference to non-existent subpattern at offset 9 + +/(?:(?(ZA)a|b)(?PX))+/I +Failed: reference to non-existent subpattern at offset 9 + +/(?:(?(ZZ)a|b)(?(ZZ)a|b)(?PX))+/I +Capturing subpattern count = 1 +Named capturing subpatterns: + ZZ 1 +No options +No first char +Need char = 'X' + bbXaaX + 0: bbXaaX + 1: X + +/(?:(?(ZZ)a|\(b\))\\(?PX))+/I +Capturing subpattern count = 1 +Named capturing subpatterns: + ZZ 1 +No options +No first char +Need char = 'X' + (b)\\Xa\\X + 0: (b)\Xa\X + 1: X + +/(?PX|Y))+/I +Capturing subpattern count = 1 +Max back reference = 1 +Named capturing subpatterns: + A 1 +No options +No first char +No need char + bXXaYYaY + 0: bXXaYYaY + 1: Y + bXYaXXaX + 0: bX + 1: X + +/()()()()()()()()()(?:(?(A)(?P=A)a|b)(?PX|Y))+/I +Capturing subpattern count = 10 +Max back reference = 10 +Named capturing subpatterns: + A 10 +No options +No first char +No need char + bXXaYYaY + 0: bXXaYYaY + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: +10: Y + +/\777/I +Failed: octal value is greater than \377 (not in UTF-8 mode) at offset 3 + +/\s*,\s*/IS +Capturing subpattern count = 0 +Partial matching not supported +No options +No first char +Need char = ',' +Starting byte set: \x09 \x0a \x0c \x0d \x20 , + \x0b,\x0b + 0: , + \x0c,\x0d + 0: \x0c,\x0d + +/^abc/Im +Capturing subpattern count = 0 +Options: multiline +First char at start or follows newline +Need char = 'c' + xyz\nabc + 0: abc + xyz\nabc\ + 0: abc + xyz\r\nabc\ + 0: abc + xyz\rabc\ + 0: abc + xyz\r\nabc\ + 0: abc + ** Failers +No match + xyz\nabc\ +No match + xyz\r\nabc\ +No match + xyz\nabc\ +No match + xyz\rabc\ +No match + xyz\rabc\ +No match + +/abc$/Im +Capturing subpattern count = 0 +Options: multiline +Forced newline sequence: LF +First char = 'a' +Need char = 'c' + xyzabc + 0: abc + xyzabc\n + 0: abc + xyzabc\npqr + 0: abc + xyzabc\r\ + 0: abc + xyzabc\rpqr\ + 0: abc + xyzabc\r\n\ + 0: abc + xyzabc\r\npqr\ + 0: abc + ** Failers +No match + xyzabc\r +No match + xyzabc\rpqr +No match + xyzabc\r\n +No match + xyzabc\r\npqr +No match + +/^abc/Im +Capturing subpattern count = 0 +Options: multiline +Forced newline sequence: CR +First char at start or follows newline +Need char = 'c' + xyz\rabcdef + 0: abc + xyz\nabcdef\ + 0: abc + ** Failers +No match + xyz\nabcdef +No match + +/^abc/Im +Capturing subpattern count = 0 +Options: multiline +Forced newline sequence: LF +First char at start or follows newline +Need char = 'c' + xyz\nabcdef + 0: abc + xyz\rabcdef\ + 0: abc + ** Failers +No match + xyz\rabcdef +No match + +/^abc/Im +Capturing subpattern count = 0 +Options: multiline +Forced newline sequence: CRLF +First char at start or follows newline +Need char = 'c' + xyz\r\nabcdef + 0: abc + xyz\rabcdef\ + 0: abc + ** Failers +No match + xyz\rabcdef +No match + +/^abc/Im +Unknown newline type at: + + +/abc/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + xyz\rabc\ +Unknown newline type at: + abc + 0: abc + +/.*/I +Capturing subpattern count = 0 +Partial matching not supported +Options: +Forced newline sequence: LF +First char at start or follows newline +No need char + abc\ndef + 0: abc + abc\rdef + 0: abc\x0ddef + abc\r\ndef + 0: abc\x0d + \abc\ndef + 0: abc\x0adef + \abc\rdef + 0: abc + \abc\r\ndef + 0: abc + \abc\ndef + 0: abc\x0adef + \abc\rdef + 0: abc\x0ddef + \abc\r\ndef + 0: abc + +/\w+(.)(.)?def/Is +Capturing subpattern count = 2 +Partial matching not supported +Options: dotall +No first char +Need char = 'f' + abc\ndef + 0: abc\x0adef + 1: \x0a + abc\rdef + 0: abc\x0ddef + 1: \x0d + abc\r\ndef + 0: abc\x0d\x0adef + 1: \x0d + 2: \x0a + ++((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)+I +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +No need char + /* this is a C style comment */\M +Minimum match() limit = 120 +Minimum match() recursion limit = 6 + 0: /* this is a C style comment */ + 1: /* this is a C style comment */ + +/(?P25[0-5]|2[0-4]\d|[01]?\d?\d)(?:\.(?P>B)){3}/I +Capturing subpattern count = 1 +Named capturing subpatterns: + B 1 +No options +No first char +Need char = '.' + +/()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + (.(.))/Ix +Capturing subpattern count = 102 +Options: extended +No first char +No need char + XY\O400 + 0: XY + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: +10: +11: +12: +13: +14: +15: +16: +17: +18: +19: +20: +21: +22: +23: +24: +25: +26: +27: +28: +29: +30: +31: +32: +33: +34: +35: +36: +37: +38: +39: +40: +41: +42: +43: +44: +45: +46: +47: +48: +49: +50: +51: +52: +53: +54: +55: +56: +57: +58: +59: +60: +61: +62: +63: +64: +65: +66: +67: +68: +69: +70: +71: +72: +73: +74: +75: +76: +77: +78: +79: +80: +81: +82: +83: +84: +85: +86: +87: +88: +89: +90: +91: +92: +93: +94: +95: +96: +97: +98: +99: +100: +101: XY +102: Y + +/(a*b|(?i:c*(?-i)d))/IS +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +No need char +Starting byte set: C a b c d + +/()[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Starting byte set: a b + +/(|)[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Starting byte set: a b + +/(|c)[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Starting byte set: a b c + +/(|c?)[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Starting byte set: a b c + +/(d?|c?)[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Starting byte set: a b c d + +/(d?|c)[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Starting byte set: a b c d + +/^a*b\d/DZ +------------------------------------------------------------------ + Bra + ^ + a*+ + b + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: anchored +No first char +Need char = 'b' + +/^a*+b\d/DZ +------------------------------------------------------------------ + Bra + ^ + a*+ + b + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: anchored +No first char +Need char = 'b' + +/^a*?b\d/DZ +------------------------------------------------------------------ + Bra + ^ + a*+ + b + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: anchored +No first char +Need char = 'b' + +/^a+A\d/DZ +------------------------------------------------------------------ + Bra + ^ + a++ + A + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: anchored +No first char +Need char = 'A' + aaaA5 + 0: aaaA5 + ** Failers +No match + aaaa5 +No match + +/^a*A\d/IiDZ +------------------------------------------------------------------ + Bra + ^ + a* + NC A + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: anchored caseless +No first char +Need char = 'A' (caseless) + aaaA5 + 0: aaaA5 + aaaa5 + 0: aaaa5 + +/(a*|b*)[cd]/IS +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +No need char +Starting byte set: a b c d + +/(a+|b*)[cd]/IS +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +No need char +Starting byte set: a b c d + +/(a*|b+)[cd]/IS +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +No need char +Starting byte set: a b c d + +/(a+|b+)[cd]/IS +Capturing subpattern count = 1 +Partial matching not supported +No options +No first char +No need char +Starting byte set: a b + +/(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( + (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( + ((( + a + )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + ))) +/Ix +Capturing subpattern count = 203 +Options: extended +First char = 'a' +No need char + large nest +Matched, but too many substrings + 0: a + 1: a + 2: a + 3: a + 4: a + 5: a + 6: a + 7: a + 8: a + 9: a +10: a +11: a +12: a +13: a +14: a + +/a*\d/BZ +------------------------------------------------------------------ + Bra + a*+ + \d + Ket + End +------------------------------------------------------------------ + +/a*\D/BZ +------------------------------------------------------------------ + Bra + a* + \D + Ket + End +------------------------------------------------------------------ + +/0*\d/BZ +------------------------------------------------------------------ + Bra + 0* + \d + Ket + End +------------------------------------------------------------------ + +/0*\D/BZ +------------------------------------------------------------------ + Bra + 0*+ + \D + Ket + End +------------------------------------------------------------------ + +/a*\s/BZ +------------------------------------------------------------------ + Bra + a*+ + \s + Ket + End +------------------------------------------------------------------ + +/a*\S/BZ +------------------------------------------------------------------ + Bra + a* + \S + Ket + End +------------------------------------------------------------------ + +/ *\s/BZ +------------------------------------------------------------------ + Bra + * + \s + Ket + End +------------------------------------------------------------------ + +/ *\S/BZ +------------------------------------------------------------------ + Bra + *+ + \S + Ket + End +------------------------------------------------------------------ + +/a*\w/BZ +------------------------------------------------------------------ + Bra + a* + \w + Ket + End +------------------------------------------------------------------ + +/a*\W/BZ +------------------------------------------------------------------ + Bra + a*+ + \W + Ket + End +------------------------------------------------------------------ + +/=*\w/BZ +------------------------------------------------------------------ + Bra + =*+ + \w + Ket + End +------------------------------------------------------------------ + +/=*\W/BZ +------------------------------------------------------------------ + Bra + =* + \W + Ket + End +------------------------------------------------------------------ + +/\d*a/BZ +------------------------------------------------------------------ + Bra + \d*+ + a + Ket + End +------------------------------------------------------------------ + +/\d*2/BZ +------------------------------------------------------------------ + Bra + \d* + 2 + Ket + End +------------------------------------------------------------------ + +/\d*\d/BZ +------------------------------------------------------------------ + Bra + \d* + \d + Ket + End +------------------------------------------------------------------ + +/\d*\D/BZ +------------------------------------------------------------------ + Bra + \d*+ + \D + Ket + End +------------------------------------------------------------------ + +/\d*\s/BZ +------------------------------------------------------------------ + Bra + \d*+ + \s + Ket + End +------------------------------------------------------------------ + +/\d*\S/BZ +------------------------------------------------------------------ + Bra + \d* + \S + Ket + End +------------------------------------------------------------------ + +/\d*\w/BZ +------------------------------------------------------------------ + Bra + \d* + \w + Ket + End +------------------------------------------------------------------ + +/\d*\W/BZ +------------------------------------------------------------------ + Bra + \d*+ + \W + Ket + End +------------------------------------------------------------------ + +/\D*a/BZ +------------------------------------------------------------------ + Bra + \D* + a + Ket + End +------------------------------------------------------------------ + +/\D*2/BZ +------------------------------------------------------------------ + Bra + \D*+ + 2 + Ket + End +------------------------------------------------------------------ + +/\D*\d/BZ +------------------------------------------------------------------ + Bra + \D*+ + \d + Ket + End +------------------------------------------------------------------ + +/\D*\D/BZ +------------------------------------------------------------------ + Bra + \D* + \D + Ket + End +------------------------------------------------------------------ + +/\D*\s/BZ +------------------------------------------------------------------ + Bra + \D* + \s + Ket + End +------------------------------------------------------------------ + +/\D*\S/BZ +------------------------------------------------------------------ + Bra + \D* + \S + Ket + End +------------------------------------------------------------------ + +/\D*\w/BZ +------------------------------------------------------------------ + Bra + \D* + \w + Ket + End +------------------------------------------------------------------ + +/\D*\W/BZ +------------------------------------------------------------------ + Bra + \D* + \W + Ket + End +------------------------------------------------------------------ + +/\s*a/BZ +------------------------------------------------------------------ + Bra + \s*+ + a + Ket + End +------------------------------------------------------------------ + +/\s*2/BZ +------------------------------------------------------------------ + Bra + \s*+ + 2 + Ket + End +------------------------------------------------------------------ + +/\s*\d/BZ +------------------------------------------------------------------ + Bra + \s*+ + \d + Ket + End +------------------------------------------------------------------ + +/\s*\D/BZ +------------------------------------------------------------------ + Bra + \s* + \D + Ket + End +------------------------------------------------------------------ + +/\s*\s/BZ +------------------------------------------------------------------ + Bra + \s* + \s + Ket + End +------------------------------------------------------------------ + +/\s*\S/BZ +------------------------------------------------------------------ + Bra + \s*+ + \S + Ket + End +------------------------------------------------------------------ + +/\s*\w/BZ +------------------------------------------------------------------ + Bra + \s*+ + \w + Ket + End +------------------------------------------------------------------ + +/\s*\W/BZ +------------------------------------------------------------------ + Bra + \s* + \W + Ket + End +------------------------------------------------------------------ + +/\S*a/BZ +------------------------------------------------------------------ + Bra + \S* + a + Ket + End +------------------------------------------------------------------ + +/\S*2/BZ +------------------------------------------------------------------ + Bra + \S* + 2 + Ket + End +------------------------------------------------------------------ + +/\S*\d/BZ +------------------------------------------------------------------ + Bra + \S* + \d + Ket + End +------------------------------------------------------------------ + +/\S*\D/BZ +------------------------------------------------------------------ + Bra + \S* + \D + Ket + End +------------------------------------------------------------------ + +/\S*\s/BZ +------------------------------------------------------------------ + Bra + \S*+ + \s + Ket + End +------------------------------------------------------------------ + +/\S*\S/BZ +------------------------------------------------------------------ + Bra + \S* + \S + Ket + End +------------------------------------------------------------------ + +/\S*\w/BZ +------------------------------------------------------------------ + Bra + \S* + \w + Ket + End +------------------------------------------------------------------ + +/\S*\W/BZ +------------------------------------------------------------------ + Bra + \S* + \W + Ket + End +------------------------------------------------------------------ + +/\w*a/BZ +------------------------------------------------------------------ + Bra + \w* + a + Ket + End +------------------------------------------------------------------ + +/\w*2/BZ +------------------------------------------------------------------ + Bra + \w* + 2 + Ket + End +------------------------------------------------------------------ + +/\w*\d/BZ +------------------------------------------------------------------ + Bra + \w* + \d + Ket + End +------------------------------------------------------------------ + +/\w*\D/BZ +------------------------------------------------------------------ + Bra + \w* + \D + Ket + End +------------------------------------------------------------------ + +/\w*\s/BZ +------------------------------------------------------------------ + Bra + \w*+ + \s + Ket + End +------------------------------------------------------------------ + +/\w*\S/BZ +------------------------------------------------------------------ + Bra + \w* + \S + Ket + End +------------------------------------------------------------------ + +/\w*\w/BZ +------------------------------------------------------------------ + Bra + \w* + \w + Ket + End +------------------------------------------------------------------ + +/\w*\W/BZ +------------------------------------------------------------------ + Bra + \w*+ + \W + Ket + End +------------------------------------------------------------------ + +/\W*a/BZ +------------------------------------------------------------------ + Bra + \W*+ + a + Ket + End +------------------------------------------------------------------ + +/\W*2/BZ +------------------------------------------------------------------ + Bra + \W*+ + 2 + Ket + End +------------------------------------------------------------------ + +/\W*\d/BZ +------------------------------------------------------------------ + Bra + \W*+ + \d + Ket + End +------------------------------------------------------------------ + +/\W*\D/BZ +------------------------------------------------------------------ + Bra + \W* + \D + Ket + End +------------------------------------------------------------------ + +/\W*\s/BZ +------------------------------------------------------------------ + Bra + \W* + \s + Ket + End +------------------------------------------------------------------ + +/\W*\S/BZ +------------------------------------------------------------------ + Bra + \W* + \S + Ket + End +------------------------------------------------------------------ + +/\W*\w/BZ +------------------------------------------------------------------ + Bra + \W*+ + \w + Ket + End +------------------------------------------------------------------ + +/\W*\W/BZ +------------------------------------------------------------------ + Bra + \W* + \W + Ket + End +------------------------------------------------------------------ + +/[^a]+a/BZ +------------------------------------------------------------------ + Bra + [^a]++ + a + Ket + End +------------------------------------------------------------------ + +/[^a]+a/BZi +------------------------------------------------------------------ + Bra + [^A]++ + NC a + Ket + End +------------------------------------------------------------------ + +/[^a]+A/BZi +------------------------------------------------------------------ + Bra + [^A]++ + NC A + Ket + End +------------------------------------------------------------------ + +/[^a]+b/BZ +------------------------------------------------------------------ + Bra + [^a]+ + b + Ket + End +------------------------------------------------------------------ + +/[^a]+\d/BZ +------------------------------------------------------------------ + Bra + [^a]+ + \d + Ket + End +------------------------------------------------------------------ + +/a*[^a]/BZ +------------------------------------------------------------------ + Bra + a* + [^a] + Ket + End +------------------------------------------------------------------ + +/(?Px)(?Py)/I +Capturing subpattern count = 2 +Named capturing subpatterns: + abc 1 + xyz 2 +No options +First char = 'x' +Need char = 'y' + xy\Cabc\Cxyz + 0: xy + 1: x + 2: y + C x (1) abc + C y (1) xyz + +/(?x)(?'xyz'y)/I +Capturing subpattern count = 2 +Named capturing subpatterns: + abc 1 + xyz 2 +No options +First char = 'x' +Need char = 'y' + xy\Cabc\Cxyz + 0: xy + 1: x + 2: y + C x (1) abc + C y (1) xyz + +/(?x)(?'xyz>y)/I +Failed: syntax error in subpattern name (missing terminator) at offset 15 + +/(?P'abc'x)(?Py)/I +Failed: unrecognized character after (?P at offset 3 + +/^(?:(?(ZZ)a|b)(?X))+/ + bXaX + 0: bXaX + 1: X + bXbX + 0: bX + 1: X + ** Failers +No match + aXaX +No match + aXbX +No match + +/^(?P>abc)(?xxx)/ +Failed: reference to non-existent subpattern at offset 8 + +/^(?P>abc)(?x|y)/ + xx + 0: xx + 1: x + xy + 0: xy + 1: y + yy + 0: yy + 1: y + yx + 0: yx + 1: x + +/^(?P>abc)(?Px|y)/ + xx + 0: xx + 1: x + xy + 0: xy + 1: y + yy + 0: yy + 1: y + yx + 0: yx + 1: x + +/^((?(abc)a|b)(?x|y))+/ + bxay + 0: bxay + 1: ay + 2: y + bxby + 0: bx + 1: bx + 2: x + ** Failers +No match + axby +No match + +/^(((?P=abc)|X)(?x|y))+/ + XxXxxx + 0: XxXxxx + 1: xx + 2: x + 3: x + XxXyyx + 0: XxXyyx + 1: yx + 2: y + 3: x + XxXyxx + 0: XxXy + 1: Xy + 2: X + 3: y + ** Failers +No match + x +No match + +/^(?1)(abc)/ + abcabc + 0: abcabc + 1: abc + +/^(?:(?:\1|X)(a|b))+/ + Xaaa + 0: Xaaa + 1: a + Xaba + 0: Xa + 1: a + +/^[\E\Qa\E-\Qz\E]+/BZ +------------------------------------------------------------------ + Bra + ^ + [a-z]+ + Ket + End +------------------------------------------------------------------ + +/^[a\Q]bc\E]/BZ +------------------------------------------------------------------ + Bra + ^ + [\]a-c] + Ket + End +------------------------------------------------------------------ + +/^[a-\Q\E]/BZ +------------------------------------------------------------------ + Bra + ^ + [\-a] + Ket + End +------------------------------------------------------------------ + +/^(?P>abc)[()](?)/BZ +------------------------------------------------------------------ + Bra + ^ + Once + Recurse + Ket + [()] + CBra 1 + Ket + Ket + End +------------------------------------------------------------------ + +/^((?(abc)y)[()](?Px))+/BZ +------------------------------------------------------------------ + Bra + ^ + CBra 1 + Cond + 2 Cond ref + y + Ket + [()] + CBra 2 + x + Ket + KetRmax + Ket + End +------------------------------------------------------------------ + (xy)x + 0: (xy)x + 1: y)x + 2: x + +/^(?P>abc)\Q()\E(?)/BZ +------------------------------------------------------------------ + Bra + ^ + Once + Recurse + Ket + () + CBra 1 + Ket + Ket + End +------------------------------------------------------------------ + +/^(?P>abc)[a\Q(]\E(](?)/BZ +------------------------------------------------------------------ + Bra + ^ + Once + Recurse + Ket + [(\]a] + CBra 1 + Ket + Ket + End +------------------------------------------------------------------ + +/^(?P>abc) # this is (a comment) + (?)/BZx +------------------------------------------------------------------ + Bra + ^ + Once + Recurse + Ket + CBra 1 + Ket + Ket + End +------------------------------------------------------------------ + +/^\W*(?:(?(?.)\W*(?&one)\W*\k|)|(?(?.)\W*(?&three)\W*\k'four'|\W*.\W*))\W*$/Ii +Capturing subpattern count = 4 +Max back reference = 4 +Named capturing subpatterns: + four 4 + one 1 + three 3 + two 2 +Partial matching not supported +Options: anchored caseless +No first char +No need char + 1221 + 0: 1221 + 1: 1221 + 2: 1 + Satan, oscillate my metallic sonatas! + 0: Satan, oscillate my metallic sonatas! + 1: + 2: + 3: Satan, oscillate my metallic sonatas + 4: S + A man, a plan, a canal: Panama! + 0: A man, a plan, a canal: Panama! + 1: + 2: + 3: A man, a plan, a canal: Panama + 4: A + Able was I ere I saw Elba. + 0: Able was I ere I saw Elba. + 1: + 2: + 3: Able was I ere I saw Elba + 4: A + *** Failers +No match + The quick brown fox +No match + +/(?=(\w+))\1:/I +Capturing subpattern count = 1 +Max back reference = 1 +Partial matching not supported +No options +No first char +Need char = ':' + abcd: + 0: abcd: + 1: abcd + +/(?=(?'abc'\w+))\k:/I +Capturing subpattern count = 1 +Max back reference = 1 +Named capturing subpatterns: + abc 1 +Partial matching not supported +No options +No first char +Need char = ':' + abcd: + 0: abcd: + 1: abcd + +/(?'abc'\w+):\k{2}/ + a:aaxyz + 0: a:aa + 1: a + ab:ababxyz + 0: ab:abab + 1: ab + ** Failers +No match + a:axyz +No match + ab:abxyz +No match + +/(?'abc'a|b)(?d|e)\k{2}/J + adaa + 0: adaa + 1: a + 2: d + ** Failers +No match + addd +No match + adbb +No match + +/(?'abc'a|b)(?d|e)(?&abc){2}/J + bdaa + 0: bdaa + 1: b + 2: d + bdab + 0: bdab + 1: b + 2: d + ** Failers +No match + bddd +No match + +/^(?a)? (?()b|c) (?('ab')d|e)/x + abd + 0: abd + 1: a + ce + 0: ce + +/(?( (?'B' abc (?(R) (?(R&A)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x + abcabc1Xabc2XabcXabcabc + 0: abcabc1Xabc2XabcX + 1: abcabc1Xabc2XabcX + 2: abcabc1Xabc2XabcX + +/(? (?'B' abc (?(R) (?(R&1)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x +Failed: reference to non-existent subpattern at offset 29 + +/(?<1> (?'B' abc (?(R) (?(R&1)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x + abcabc1Xabc2XabcXabcabc + 0: abcabc1Xabc2XabcX + 1: abcabc1Xabc2XabcX + 2: abcabc1Xabc2XabcX + +/^(?(DEFINE) (? a) (? b) ) (?&A) (?&B) /x + abcd + 0: ab + 1: + 2: + +/(?(?&NAME_PAT))\s+(?(?&ADDRESS_PAT)) + (?(DEFINE) + (?[a-z]+) + (?\d+) + )/x + metcalfe 33 + 0: metcalfe 33 + 1: metcalfe + 2: 33 + 3: + 4: + +/^(?(DEFINE) abc | xyz ) /x +Failed: DEFINE group contains more than one branch at offset 22 + +/(?(DEFINE) abc) xyz/xI +Capturing subpattern count = 0 +Options: extended +First char = 'x' +Need char = 'z' + +/(?(DEFINE) abc){3} xyz/x +Failed: repeating a DEFINE group is not allowed at offset 17 + +/(a|)*\d/ + \O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + \O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 +Matched, but too many substrings + +/^a.b/ + a\rb + 0: a\x0db + a\nb\ + 0: a\x0ab + a\x85b\ + 0: a\x85b + ** Failers +No match + a\nb +No match + a\nb\ +No match + a\rb\ +No match + a\rb\ +No match + a\x85b\ +No match + a\rb\ +No match + +/^abc./mgx + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 \x{2028}abc8 \x{2029}abc9 JUNK + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + +/abc.$/mgx + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc7\x{2028} abc8\x{2029} abc9 + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc9 + +/a/ + +/a/ +Failed: inconsistent NEWLINE options at offset 0 + +/^a\Rb/ + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + ** Failers +No match + a\n\rb +No match + +/^a\R*b/ + ab + 0: ab + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + a\n\rb + 0: a\x0a\x0db + a\n\r\x85\x0cb + 0: a\x0a\x0d\x85\x0cb + +/^a\R+b/ + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + a\n\rb + 0: a\x0a\x0db + a\n\r\x85\x0cb + 0: a\x0a\x0d\x85\x0cb + ** Failers +No match + ab +No match + +/^a\R{1,3}b/ + a\nb + 0: a\x0ab + a\n\rb + 0: a\x0a\x0db + a\n\r\x85b + 0: a\x0a\x0d\x85b + a\r\n\r\nb + 0: a\x0d\x0a\x0d\x0ab + a\r\n\r\n\r\nb + 0: a\x0d\x0a\x0d\x0a\x0d\x0ab + a\n\r\n\rb + 0: a\x0a\x0d\x0a\x0db + a\n\n\r\nb + 0: a\x0a\x0a\x0d\x0ab + ** Failers +No match + a\n\n\n\rb +No match + a\r +No match + +/^a[\R]b/ + aRb + 0: aRb + ** Failers +No match + a\nb +No match + +/(?&abc)X(?P)/I +Capturing subpattern count = 1 +Named capturing subpatterns: + abc 1 +No options +No first char +Need char = 'P' + abcPXP123 + 0: PXP + 1: P + +/(?1)X(?P)/I +Capturing subpattern count = 1 +Named capturing subpatterns: + abc 1 +No options +No first char +Need char = 'P' + abcPXP123 + 0: PXP + 1: P + +/(?(DEFINE)(?2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/ + 1.2.3.4 + 0: 1.2.3.4 + 1: + 2: .4 + 131.111.10.206 + 0: 131.111.10.206 + 1: + 2: .206 + 10.0.0.0 + 0: 10.0.0.0 + 1: + 2: .0 + ** Failers +No match + 10.6 +No match + 455.3.4.5 +No match + +/\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/ + 1.2.3.4 + 0: 1.2.3.4 + 1: .4 + 2: + 131.111.10.206 + 0: 131.111.10.206 + 1: .206 + 2: + 10.0.0.0 + 0: 10.0.0.0 + 1: .0 + 2: + ** Failers +No match + 10.6 +No match + 455.3.4.5 +No match + +/(?:a(?&abc)b)*(?x)/ + 123axbaxbaxbx456 + 0: axbaxbaxbx + 1: x + 123axbaxbaxb456 + 0: x + 1: x + +/(?:a(?&abc)b){1,5}(?x)/ + 123axbaxbaxbx456 + 0: axbaxbaxbx + 1: x + +/(?:a(?&abc)b){2,5}(?x)/ + 123axbaxbaxbx456 + 0: axbaxbaxbx + 1: x + +/(?:a(?&abc)b){2,}(?x)/ + 123axbaxbaxbx456 + 0: axbaxbaxbx + 1: x + +/(abc)(?i:(?1))/ + defabcabcxyz + 0: abcabc + 1: abc + DEFabcABCXYZ +No match + +/(abc)(?:(?i)(?1))/ + defabcabcxyz + 0: abcabc + 1: abc + DEFabcABCXYZ +No match + +/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/ + ababababbbabZXXXX + 0: ababababbbabZ + 1: ab + 2: b + +/^(a)\g-2/ +Failed: reference to non-existent subpattern at offset 7 + +/^(a)\g/ +Failed: \g is not followed by a braced name or an optionally braced non-zero number at offset 5 + +/^(a)\g{0}/ +Failed: \g is not followed by a braced name or an optionally braced non-zero number at offset 7 + +/^(a)\g{3/ +Failed: \g is not followed by a braced name or an optionally braced non-zero number at offset 8 + +/^(a)\g{4a}/ +Failed: reference to non-existent subpattern at offset 9 + +/^a.b/ + a\rb + 0: a\x0db + *** Failers +No match + a\nb +No match + +/.+foo/ + afoo + 0: afoo + ** Failers +No match + \r\nfoo +No match + \nfoo +No match + +/.+foo/ + afoo + 0: afoo + \nfoo + 0: \x0afoo + ** Failers +No match + \r\nfoo +No match + +/.+foo/ + afoo + 0: afoo + ** Failers +No match + \nfoo +No match + \r\nfoo +No match + +/.+foo/s + afoo + 0: afoo + \r\nfoo + 0: \x0d\x0afoo + \nfoo + 0: \x0afoo + +/^$/mg + abc\r\rxyz + 0: + abc\n\rxyz + 0: + ** Failers +No match + abc\r\nxyz +No match + +/(?m)^$/g+ + abc\r\n\r\n + 0: + 0+ \x0d\x0a + +/(?m)^$|^\r\n/g+ + abc\r\n\r\n + 0: + 0+ \x0d\x0a + 0: \x0d\x0a + 0+ + +/(?m)$/g+ + abc\r\n\r\n + 0: + 0+ \x0d\x0a\x0d\x0a + 0: + 0+ \x0d\x0a + 0: + 0+ + +/abc.$/mgx + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc7\x{2028} abc8\x{2029} abc9 + 0: abc1 + 0: abc4 + 0: abc5 + 0: abc9 + +/^X/m + XABC + 0: X + ** Failers +No match + XABC\B +No match + +/(ab|c)(?-1)/BZ +------------------------------------------------------------------ + Bra + CBra 1 + ab + Alt + c + Ket + Once + Recurse + Ket + Ket + End +------------------------------------------------------------------ + abc + 0: abc + 1: ab + +/xy(?+1)(abc)/BZ +------------------------------------------------------------------ + Bra + xy + Once + Recurse + Ket + CBra 1 + abc + Ket + Ket + End +------------------------------------------------------------------ + xyabcabc + 0: xyabcabc + 1: abc + ** Failers +No match + xyabc +No match + +/x(?-0)y/ +Failed: (?+ or (?- or (?(+ or (?(- must be followed by a non-zero number at offset 5 + +/x(?-1)y/ +Failed: reference to non-existent subpattern at offset 5 + +/x(?+0)y/ +Failed: (?+ or (?- or (?(+ or (?(- must be followed by a non-zero number at offset 5 + +/x(?+1)y/ +Failed: reference to non-existent subpattern at offset 5 + +/^(abc)?(?(-1)X|Y)/BZ +------------------------------------------------------------------ + Bra + ^ + Brazero + CBra 1 + abc + Ket + Cond + 1 Cond ref + X + Alt + Y + Ket + Ket + End +------------------------------------------------------------------ + abcX + 0: abcX + 1: abc + Y + 0: Y + ** Failers +No match + abcY +No match + +/^((?(+1)X|Y)(abc))+/BZ +------------------------------------------------------------------ + Bra + ^ + CBra 1 + Cond + 2 Cond ref + X + Alt + Y + Ket + CBra 2 + abc + Ket + KetRmax + Ket + End +------------------------------------------------------------------ + YabcXabc + 0: YabcXabc + 1: Xabc + 2: abc + YabcXabcXabc + 0: YabcXabcXabc + 1: Xabc + 2: abc + ** Failers +No match + XabcXabc +No match + +/(?(-1)a)/BZ +Failed: reference to non-existent subpattern at offset 6 + +/((?(-1)a))/BZ +------------------------------------------------------------------ + Bra + CBra 1 + Cond + 1 Cond ref + a + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/((?(-2)a))/BZ +Failed: reference to non-existent subpattern at offset 7 + +/^(?(+1)X|Y)(.)/BZ +------------------------------------------------------------------ + Bra + ^ + Cond + 1 Cond ref + X + Alt + Y + Ket + CBra 1 + Any + Ket + Ket + End +------------------------------------------------------------------ + Y! + 0: Y! + 1: ! + +/(foo)\Kbar/ + foobar + 0: bar + 1: foo + +/(foo)(\Kbar|baz)/ + foobar + 0: bar + 1: foo + 2: bar + foobaz + 0: foobaz + 1: foo + 2: baz + +/(foo\Kbar)baz/ + foobarbaz + 0: barbaz + 1: foobar + +/(?tom|bon)-\k{A}/ + tom-tom + 0: tom-tom + 1: tom + bon-bon + 0: bon-bon + 1: bon + ** Failers +No match + tom-bon +No match + +/(?tom|bon)-\g{A}/ + tom-tom + 0: tom-tom + 1: tom + bon-bon + 0: bon-bon + 1: bon + +/\g{A/ +Failed: syntax error in subpattern name (missing terminator) at offset 4 + +/(?|(abc)|(xyz))/BZ +------------------------------------------------------------------ + Bra + Bra + CBra 1 + abc + Ket + Alt + CBra 1 + xyz + Ket + Ket + Ket + End +------------------------------------------------------------------ + >abc< + 0: abc + 1: abc + >xyz< + 0: xyz + 1: xyz + +/(x)(?|(abc)|(xyz))(x)/BZ +------------------------------------------------------------------ + Bra + CBra 1 + x + Ket + Bra + CBra 2 + abc + Ket + Alt + CBra 2 + xyz + Ket + Ket + CBra 3 + x + Ket + Ket + End +------------------------------------------------------------------ + xabcx + 0: xabcx + 1: x + 2: abc + 3: x + xxyzx + 0: xxyzx + 1: x + 2: xyz + 3: x + +/(x)(?|(abc)(pqr)|(xyz))(x)/BZ +------------------------------------------------------------------ + Bra + CBra 1 + x + Ket + Bra + CBra 2 + abc + Ket + CBra 3 + pqr + Ket + Alt + CBra 2 + xyz + Ket + Ket + CBra 4 + x + Ket + Ket + End +------------------------------------------------------------------ + xabcpqrx + 0: xabcpqrx + 1: x + 2: abc + 3: pqr + 4: x + xxyzx + 0: xxyzx + 1: x + 2: xyz + 3: + 4: x + +/(?|(abc)|(xyz))\1/ + abcabc + 0: abcabc + 1: abc + xyzxyz + 0: xyzxyz + 1: xyz + ** Failers +No match + abcxyz +No match + xyzabc +No match + +/(?|(abc)|(xyz))(?1)/ + abcabc + 0: abcabc + 1: abc + xyzabc + 0: xyzabc + 1: xyz + ** Failers +No match + xyzxyz +No match + +/\H\h\V\v/ + X X\x0a + 0: X X\x0a + X\x09X\x0b + 0: X\x09X\x0b + ** Failers +No match + \xa0 X\x0a +No match + +/\H*\h+\V?\v{3,4}/ + \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a + 0: \x09 \xa0X\x0a\x0b\x0c\x0d + \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a + 0: \x09 \xa0\x0a\x0b\x0c\x0d + \x09\x20\xa0\x0a\x0b\x0c + 0: \x09 \xa0\x0a\x0b\x0c + ** Failers +No match + \x09\x20\xa0\x0a\x0b +No match + +/\H{3,4}/ + XY ABCDE + 0: ABCD + XY PQR ST + 0: PQR + +/.\h{3,4}./ + XY AB PQRS + 0: B P + +/\h*X\h?\H+Y\H?Z/ + >XNNNYZ + 0: XNNNYZ + > X NYQZ + 0: X NYQZ + ** Failers +No match + >XYZ +No match + > X NY Z +No match + +/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/ + >XY\x0aZ\x0aA\x0bNN\x0c + 0: XY\x0aZ\x0aA\x0bNN\x0c + >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c + 0: \x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c + +/[\h]/BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0] + Ket + End +------------------------------------------------------------------ + >\x09< + 0: \x09 + +/[\h]+/BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0]+ + Ket + End +------------------------------------------------------------------ + >\x09\x20\xa0< + 0: \x09 \xa0 + +/[\v]/BZ +------------------------------------------------------------------ + Bra + [\x0a-\x0d\x85] + Ket + End +------------------------------------------------------------------ + +/[\H]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff] + Ket + End +------------------------------------------------------------------ + +/[^\h]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff] (neg) + Ket + End +------------------------------------------------------------------ + +/[\V]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x09\x0e-\x84\x86-\xff] + Ket + End +------------------------------------------------------------------ + +/[\x0a\V]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x0a\x0e-\x84\x86-\xff] + Ket + End +------------------------------------------------------------------ + +/\H++X/BZ +------------------------------------------------------------------ + Bra + \H++ + X + Ket + End +------------------------------------------------------------------ + ** Failers +No match + XXXX +No match + +/\H+\hY/BZ +------------------------------------------------------------------ + Bra + \H++ + \h + Y + Ket + End +------------------------------------------------------------------ + XXXX Y + 0: XXXX Y + +/\H+ Y/BZ +------------------------------------------------------------------ + Bra + \H++ + Y + Ket + End +------------------------------------------------------------------ + +/\h+A/BZ +------------------------------------------------------------------ + Bra + \h++ + A + Ket + End +------------------------------------------------------------------ + +/\v*B/BZ +------------------------------------------------------------------ + Bra + \v*+ + B + Ket + End +------------------------------------------------------------------ + +/\V+\x0a/BZ +------------------------------------------------------------------ + Bra + \V++ + \x0a + Ket + End +------------------------------------------------------------------ + +/A+\h/BZ +------------------------------------------------------------------ + Bra + A++ + \h + Ket + End +------------------------------------------------------------------ + +/ *\H/BZ +------------------------------------------------------------------ + Bra + *+ + \H + Ket + End +------------------------------------------------------------------ + +/A*\v/BZ +------------------------------------------------------------------ + Bra + A*+ + \v + Ket + End +------------------------------------------------------------------ + +/\x0b*\V/BZ +------------------------------------------------------------------ + Bra + \x0b*+ + \V + Ket + End +------------------------------------------------------------------ + +/\d+\h/BZ +------------------------------------------------------------------ + Bra + \d++ + \h + Ket + End +------------------------------------------------------------------ + +/\d*\v/BZ +------------------------------------------------------------------ + Bra + \d*+ + \v + Ket + End +------------------------------------------------------------------ + +/S+\h\S+\v/BZ +------------------------------------------------------------------ + Bra + S++ + \h + \S++ + \v + Ket + End +------------------------------------------------------------------ + +/\w{3,}\h\w+\v/BZ +------------------------------------------------------------------ + Bra + \w{3} + \w*+ + \h + \w++ + \v + Ket + End +------------------------------------------------------------------ + +/\h+\d\h+\w\h+\S\h+\H/BZ +------------------------------------------------------------------ + Bra + \h++ + \d + \h++ + \w + \h++ + \S + \h++ + \H + Ket + End +------------------------------------------------------------------ + +/\v+\d\v+\w\v+\S\v+\V/BZ +------------------------------------------------------------------ + Bra + \v++ + \d + \v++ + \w + \v+ + \S + \v++ + \V + Ket + End +------------------------------------------------------------------ + +/\H+\h\H+\d/BZ +------------------------------------------------------------------ + Bra + \H++ + \h + \H+ + \d + Ket + End +------------------------------------------------------------------ + +/\V+\v\V+\w/BZ +------------------------------------------------------------------ + Bra + \V++ + \v + \V+ + \w + Ket + End +------------------------------------------------------------------ + +/\( (?: [^()]* | (?R) )* \)/x +(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0) + 0: (0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0) + +/[\E]AAA/ +Failed: missing terminating ] for character class at offset 7 + +/[\Q\E]AAA/ +Failed: missing terminating ] for character class at offset 9 + +/[^\E]AAA/ +Failed: missing terminating ] for character class at offset 8 + +/[^\Q\E]AAA/ +Failed: missing terminating ] for character class at offset 10 + +/[\E^]AAA/ +Failed: missing terminating ] for character class at offset 8 + +/[\Q\E^]AAA/ +Failed: missing terminating ] for character class at offset 10 + +/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/BZ +------------------------------------------------------------------ + Bra + A + *PRUNE + B + *SKIP + C + *THEN + D + *COMMIT + E + *FAIL + F + *FAIL + G + *FAIL + H + *ACCEPT + I + Ket + End +------------------------------------------------------------------ + +/^a+(*FAIL)/ + aaaaaa +No match + +/a+b?c+(*FAIL)/ + aaabccc +No match + +/a+b?(*PRUNE)c+(*FAIL)/ + aaabccc +No match + +/a+b?(*COMMIT)c+(*FAIL)/ + aaabccc +No match + +/a+b?(*SKIP)c+(*FAIL)/ + aaabcccaaabccc +No match + +/^(?:aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/ + aaaxxxxxx + 0: aaaxxxxxx + aaa++++++ + 0: aaa + bbbxxxxx + 0: bbbxxxxx + bbb+++++ + 0: bbb + cccxxxx + 0: cccxxxx + ccc++++ + 0: ccc + dddddddd + 0: ddd + +/^(aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/ + aaaxxxxxx + 0: aaaxxxxxx + 1: aaaxxxxxx + aaa++++++ + 0: aaa + 1: aaa + bbbxxxxx + 0: bbbxxxxx + 1: bbbxxxxx + bbb+++++ + 0: bbb + 1: bbb + cccxxxx + 0: cccxxxx + 1: cccxxxx + ccc++++ + 0: ccc + 1: ccc + dddddddd + 0: ddd + 1: ddd + +/a+b?(*THEN)c+(*FAIL)/ + aaabccc +No match + +/(A (A|B(*ACCEPT)|C) D)(E)/x + ABX + 0: AB + AADE + 0: AADE + 1: AAD + 2: A + 3: E + ACDE + 0: ACDE + 1: ACD + 2: C + 3: E + ** Failers +No match + AD +No match + +/^a+(*FAIL)/C + aaaaaa +--->aaaaaa + +0 ^ ^ + +1 ^ a+ + +3 ^ ^ (*FAIL) + +3 ^ ^ (*FAIL) + +3 ^ ^ (*FAIL) + +3 ^ ^ (*FAIL) + +3 ^ ^ (*FAIL) + +3 ^^ (*FAIL) +No match + +/a+b?c+(*FAIL)/C + aaabccc +--->aaabccc + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ c+ + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +4 ^ ^ c+ + +2 ^ ^ b? + +4 ^ ^ c+ + +2 ^^ b? + +4 ^^ c+ + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ c+ + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +4 ^ ^ c+ + +2 ^^ b? + +4 ^^ c+ + +0 ^ a+ + +2 ^^ b? + +4 ^ ^ c+ + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +4 ^^ c+ +No match + +/a+b?(*PRUNE)c+(*FAIL)/C + aaabccc +--->aaabccc + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*PRUNE) ++12 ^ ^ c+ ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*PRUNE) ++12 ^ ^ c+ ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^^ b? + +4 ^ ^ (*PRUNE) ++12 ^ ^ c+ ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) +No match + +/a+b?(*COMMIT)c+(*FAIL)/C + aaabccc +--->aaabccc + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*COMMIT) ++13 ^ ^ c+ ++15 ^ ^ (*FAIL) ++15 ^ ^ (*FAIL) ++15 ^ ^ (*FAIL) +No match + +/a+b?(*SKIP)c+(*FAIL)/C + aaabcccaaabccc +--->aaabcccaaabccc + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*SKIP) ++11 ^ ^ c+ ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*SKIP) ++11 ^ ^ c+ ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) +No match + +/a+b?(*THEN)c+(*FAIL)/C + aaabccc +--->aaabccc + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*THEN) ++11 ^ ^ c+ ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*THEN) ++11 ^ ^ c+ ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^^ b? + +4 ^ ^ (*THEN) ++11 ^ ^ c+ ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) +No match + +/a(*PRUNE:XXX)b/ +Failed: (*VERB) with an argument is not supported at offset 8 + +/a(*MARK)b/ +Failed: (*VERB) not recognized at offset 7 + +/(?i:A{1,}\6666666666)/ +Failed: number is too big at offset 19 + +/\g6666666666/ +Failed: number is too big at offset 11 + +/[\g6666666666]/ +Failed: number is too big at offset 12 + +/(?1)\c[/ +Failed: reference to non-existent subpattern at offset 3 + +/.+A/ + \r\nA +No match + +/\nA/ + \r\nA + 0: \x0aA + +/[\r\n]A/ + \r\nA + 0: \x0aA + +/(\r|\n)A/ + \r\nA + 0: \x0aA + 1: \x0a + +/a(*CR)b/ +Failed: (*VERB) not recognized at offset 5 + +/(*CR)a.b/ + a\nb + 0: a\x0ab + ** Failers +No match + a\rb +No match + +/(*CR)a.b/ + a\nb + 0: a\x0ab + ** Failers +No match + a\rb +No match + +/(*LF)a.b/ + a\rb + 0: a\x0db + ** Failers +No match + a\nb +No match + +/(*CRLF)a.b/ + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + ** Failers +No match + a\r\nb +No match + +/(*ANYCRLF)a.b/ + ** Failers +No match + a\rb +No match + a\nb +No match + a\r\nb +No match + +/(*ANY)a.b/ + ** Failers +No match + a\rb +No match + a\nb +No match + a\r\nb +No match + a\x85b +No match + +/a\Rb/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + ** Failers +No match + a\x85b +No match + a\x0bb +No match + +/a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + a\x85b + 0: a\x85b + a\x0bb + 0: a\x0bb + ** Failers +No match + a\x85b\ +No match + a\x0bb\ +No match + +/a\R?b/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + ** Failers +No match + a\x85b +No match + a\x0bb +No match + +/a\R?b/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + a\x85b + 0: a\x85b + a\x0bb + 0: a\x0bb + ** Failers +No match + a\x85b\ +No match + a\x0bb\ +No match + +/a\R{2,4}b/I +Capturing subpattern count = 0 +Partial matching not supported +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\r\n\nb + 0: a\x0d\x0a\x0ab + a\n\r\rb + 0: a\x0a\x0d\x0db + a\r\n\r\n\r\n\r\nb + 0: a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0ab + ** Failers +No match + a\x85\85b +No match + a\x0b\0bb +No match + +/a\R{2,4}b/I +Capturing subpattern count = 0 +Partial matching not supported +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\r\rb + 0: a\x0d\x0db + a\n\n\nb + 0: a\x0a\x0a\x0ab + a\r\n\n\r\rb + 0: a\x0d\x0a\x0a\x0d\x0db + a\x85\85b +No match + a\x0b\0bb +No match + ** Failers +No match + a\r\r\r\r\rb +No match + a\x85\85b\ +No match + a\x0b\0bb\ +No match + +/(*BSR_ANYCRLF)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + +/(*BSR_UNICODE)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\x85b + 0: a\x85b + +/(*BSR_ANYCRLF)(*CRLF)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +Forced newline sequence: CRLF +First char = 'a' +Need char = 'b' + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + +/(*CRLF)(*BSR_UNICODE)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode +Forced newline sequence: CRLF +First char = 'a' +Need char = 'b' + a\x85b + 0: a\x85b + +/(*CRLF)(*BSR_ANYCRLF)(*CR)ab/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +Forced newline sequence: CR +First char = 'a' +Need char = 'b' + +/(?)(?&)/ +Failed: subpattern name expected at offset 9 + +/(?)(?&a)/ +Failed: reference to non-existent subpattern at offset 12 + +/(?)(?&aaaaaaaaaaaaaaaaaaaaaaa)/ +Failed: reference to non-existent subpattern at offset 32 + +/(?+-a)/ +Failed: digit expected after (?+ at offset 3 + +/(?-+a)/ +Failed: unrecognized character after (? or (?- at offset 3 + +/(?(-1))/ +Failed: reference to non-existent subpattern at offset 6 + +/(?(+10))/ +Failed: reference to non-existent subpattern at offset 7 + +/(?(10))/ +Failed: reference to non-existent subpattern at offset 6 + +/(?(+2))()()/ + +/(?(2))()()/ + +/\k''/ +Failed: subpattern name expected at offset 3 + +/\k<>/ +Failed: subpattern name expected at offset 3 + +/\k{}/ +Failed: subpattern name expected at offset 3 + +/(?P=)/ +Failed: subpattern name expected at offset 4 + +/(?P>)/ +Failed: subpattern name expected at offset 4 + +/(?!\w)(?R)/ +Failed: recursive call could loop indefinitely at offset 9 + +/(?=\w)(?R)/ +Failed: recursive call could loop indefinitely at offset 9 + +/(?>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[\W]+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[^[:alpha:]]+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/\w+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[\w]+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]]+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR +------------------------------------------------------------------ + Bra + [A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff] + [a-z\xb5\xdf-\xf6\xf8-\xff] + [A-Z\xc0-\xd6\xd8-\xde] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/ End of testinput3 / diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput4 erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput4 --- erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput4 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput4 2009-03-12 12:21:53.000000000 +0000 @@ -0,0 +1,1074 @@ +/-- Do not use the \x{} construct except with patterns that have the --/ +/-- /8 option set, because PCRE doesn't recognize them as UTF-8 unless --/ +No match +/-- that option is set. However, the latest Perls recognize them always. --/ +No match + +/a.b/8 + acb + 0: acb + a\x7fb + 0: a\x{7f}b + a\x{100}b + 0: a\x{100}b + *** Failers +No match + a\nb +No match + +/a(.{3})b/8 + a\x{4000}xyb + 0: a\x{4000}xyb + 1: \x{4000}xy + a\x{4000}\x7fyb + 0: a\x{4000}\x{7f}yb + 1: \x{4000}\x{7f}y + a\x{4000}\x{100}yb + 0: a\x{4000}\x{100}yb + 1: \x{4000}\x{100}y + *** Failers +No match + a\x{4000}b +No match + ac\ncb +No match + +/a(.*?)(.)/ + a\xc0\x88b + 0: a\xc0 + 1: + 2: \xc0 + +/a(.*?)(.)/8 + a\x{100}b + 0: a\x{100} + 1: + 2: \x{100} + +/a(.*)(.)/ + a\xc0\x88b + 0: a\xc0\x88b + 1: \xc0\x88 + 2: b + +/a(.*)(.)/8 + a\x{100}b + 0: a\x{100}b + 1: \x{100} + 2: b + +/a(.)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + 1: \xc0 + 2: \x92 + +/a(.)(.)/8 + a\x{240}bcd + 0: a\x{240}b + 1: \x{240} + 2: b + +/a(.?)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + 1: \xc0 + 2: \x92 + +/a(.?)(.)/8 + a\x{240}bcd + 0: a\x{240}b + 1: \x{240} + 2: b + +/a(.??)(.)/ + a\xc0\x92bcd + 0: a\xc0 + 1: + 2: \xc0 + +/a(.??)(.)/8 + a\x{240}bcd + 0: a\x{240} + 1: + 2: \x{240} + +/a(.{3})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + *** Failers +No match + a\x{1234}b +No match + ac\ncb +No match + +/a(.{3,})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxbcdefghijb + 1: xxxxbcdefghij + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + *** Failers +No match + a\x{1234}b +No match + +/a(.{3,}?)b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxb + 1: xxxx + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + *** Failers +No match + a\x{1234}b +No match + +/a(.{3,5})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxb + 1: xxxx + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + axbxxbcdefghijb + 0: axbxxb + 1: xbxx + axxxxxbcdefghijb + 0: axxxxxb + 1: xxxxx + *** Failers +No match + a\x{1234}b +No match + axxxxxxbcdefghijb +No match + +/a(.{3,5}?)b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxb + 1: xxxx + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + axbxxbcdefghijb + 0: axbxxb + 1: xbxx + axxxxxbcdefghijb + 0: axxxxxb + 1: xxxxx + *** Failers +No match + a\x{1234}b +No match + axxxxxxbcdefghijb +No match + +/^[a\x{c0}]/8 + *** Failers +No match + \x{100} +No match + +/(?<=aXb)cd/8 + aXbcd + 0: cd + +/(?<=a\x{100}b)cd/8 + a\x{100}bcd + 0: cd + +/(?<=a\x{100000}b)cd/8 + a\x{100000}bcd + 0: cd + +/(?:\x{100}){3}b/8 + \x{100}\x{100}\x{100}b + 0: \x{100}\x{100}\x{100}b + *** Failers +No match + \x{100}\x{100}b +No match + +/\x{ab}/8 + \x{ab} + 0: \x{ab} + \xc2\xab + 0: \x{ab} + *** Failers +No match + \x00{ab} +No match + +/(?<=(.))X/8 + WXYZ + 0: X + 1: W + \x{256}XYZ + 0: X + 1: \x{256} + *** Failers +No match + XYZ +No match + +/X(\C{3})/8 + X\x{1234} + 0: X\x{1234} + 1: \x{1234} + +/X(\C{4})/8 + X\x{1234}YZ + 0: X\x{1234}Y + 1: \x{1234}Y + +/X\C*/8 + XYZabcdce + 0: XYZabcdce + +/X\C*?/8 + XYZabcde + 0: X + +/X\C{3,5}/8 + Xabcdefg + 0: Xabcde + X\x{1234} + 0: X\x{1234} + X\x{1234}YZ + 0: X\x{1234}YZ + X\x{1234}\x{512} + 0: X\x{1234}\x{512} + X\x{1234}\x{512}YZ + 0: X\x{1234}\x{512} + +/X\C{3,5}?/8 + Xabcdefg + 0: Xabc + X\x{1234} + 0: X\x{1234} + X\x{1234}YZ + 0: X\x{1234} + X\x{1234}\x{512} + 0: X\x{1234} + +/[^a]+/8g + bcd + 0: bcd + \x{100}aY\x{256}Z + 0: \x{100} + 0: Y\x{256}Z + +/^[^a]{2}/8 + \x{100}bc + 0: \x{100}b + +/^[^a]{2,}/8 + \x{100}bcAa + 0: \x{100}bcA + +/^[^a]{2,}?/8 + \x{100}bca + 0: \x{100}b + +/[^a]+/8ig + bcd + 0: bcd + \x{100}aY\x{256}Z + 0: \x{100} + 0: Y\x{256}Z + +/^[^a]{2}/8i + \x{100}bc + 0: \x{100}b + +/^[^a]{2,}/8i + \x{100}bcAa + 0: \x{100}bc + +/^[^a]{2,}?/8i + \x{100}bca + 0: \x{100}b + +/\x{100}{0,0}/8 + abcd + 0: + +/\x{100}?/8 + abcd + 0: + \x{100}\x{100} + 0: \x{100} + +/\x{100}{0,3}/8 + \x{100}\x{100} + 0: \x{100}\x{100} + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100} + +/\x{100}*/8 + abce + 0: + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + +/\x{100}{1,1}/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100} + +/\x{100}{1,3}/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100} + +/\x{100}+/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + +/\x{100}{3}/8 + abcd\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100} + +/\x{100}{3,5}/8 + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100}\x{100}\x{100} + +/\x{100}{3,}/8 + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + +/(?<=a\x{100}{2}b)X/8+ + Xyyya\x{100}\x{100}bXzzz + 0: X + 0+ zzz + +/\D*/8 + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/\D*/8 + \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + +/\D/8 + 1X2 + 0: X + 1\x{100}2 + 0: \x{100} + +/>\S/8 + > >X Y + 0: >X + > >\x{100} Y + 0: >\x{100} + +/\d/8 + \x{100}3 + 0: 3 + +/\s/8 + \x{100} X + 0: + +/\D+/8 + 12abcd34 + 0: abcd + *** Failers + 0: *** Failers + 1234 +No match + +/\D{2,3}/8 + 12abcd34 + 0: abc + 12ab34 + 0: ab + *** Failers + 0: *** + 1234 +No match + 12a34 +No match + +/\D{2,3}?/8 + 12abcd34 + 0: ab + 12ab34 + 0: ab + *** Failers + 0: ** + 1234 +No match + 12a34 +No match + +/\d+/8 + 12abcd34 + 0: 12 + *** Failers +No match + +/\d{2,3}/8 + 12abcd34 + 0: 12 + 1234abcd + 0: 123 + *** Failers +No match + 1.4 +No match + +/\d{2,3}?/8 + 12abcd34 + 0: 12 + 1234abcd + 0: 12 + *** Failers +No match + 1.4 +No match + +/\S+/8 + 12abcd34 + 0: 12abcd34 + *** Failers + 0: *** + \ \ +No match + +/\S{2,3}/8 + 12abcd34 + 0: 12a + 1234abcd + 0: 123 + *** Failers + 0: *** + \ \ +No match + +/\S{2,3}?/8 + 12abcd34 + 0: 12 + 1234abcd + 0: 12 + *** Failers + 0: ** + \ \ +No match + +/>\s+ <34 + 0: > < + 0+ 34 + *** Failers +No match + +/>\s{2,3} < + 0+ cd + ab> < + 0+ ce + *** Failers +No match + ab> \s{2,3}? < + 0+ cd + ab> < + 0+ ce + *** Failers +No match + ab> \xff< + 0: \xff + +/[\xff]/8 + >\x{ff}< + 0: \x{ff} + +/[^\xFF]/ + XYZ + 0: X + +/[^\xff]/8 + XYZ + 0: X + \x{123} + 0: \x{123} + +/^[ac]*b/8 + xb +No match + +/^[ac\x{100}]*b/8 + xb +No match + +/^[^x]*b/8i + xb +No match + +/^[^x]*b/8 + xb +No match + +/^\d*b/8 + xb +No match + +/(|a)/g8 + catac + 0: + 1: + 0: + 1: + 0: a + 1: a + 0: + 1: + 0: + 1: + 0: a + 1: a + 0: + 1: + 0: + 1: + a\x{256}a + 0: + 1: + 0: a + 1: a + 0: + 1: + 0: + 1: + 0: a + 1: a + 0: + 1: + +/^\x{85}$/8i + \x{85} + 0: \x{85} + +/^ሴ/8 + ሴ + 0: \x{1234} + +/^\ሴ/8 + ሴ + 0: \x{1234} + +"(?s)(.{1,5})"8 + abcdefg + 0: abcde + 1: abcde + ab + 0: ab + 1: ab + +/a*\x{100}*\w/8 + a + 0: a + +/\S\S/8g + A\x{a3}BC + 0: A\x{a3} + 0: BC + +/\S{2}/8g + A\x{a3}BC + 0: A\x{a3} + 0: BC + +/\W\W/8g + +\x{a3}== + 0: +\x{a3} + 0: == + +/\W{2}/8g + +\x{a3}== + 0: +\x{a3} + 0: == + +/\S/8g + \x{442}\x{435}\x{441}\x{442} + 0: \x{442} + 0: \x{435} + 0: \x{441} + 0: \x{442} + +/[\S]/8g + \x{442}\x{435}\x{441}\x{442} + 0: \x{442} + 0: \x{435} + 0: \x{441} + 0: \x{442} + +/\D/8g + \x{442}\x{435}\x{441}\x{442} + 0: \x{442} + 0: \x{435} + 0: \x{441} + 0: \x{442} + +/[\D]/8g + \x{442}\x{435}\x{441}\x{442} + 0: \x{442} + 0: \x{435} + 0: \x{441} + 0: \x{442} + +/\W/8g + \x{2442}\x{2435}\x{2441}\x{2442} + 0: \x{2442} + 0: \x{2435} + 0: \x{2441} + 0: \x{2442} + +/[\W]/8g + \x{2442}\x{2435}\x{2441}\x{2442} + 0: \x{2442} + 0: \x{2435} + 0: \x{2441} + 0: \x{2442} + +/[\S\s]*/8 + abc\n\r\x{442}\x{435}\x{441}\x{442}xyz + 0: abc\x{0a}\x{0d}\x{442}\x{435}\x{441}\x{442}xyz + +/[\x{41f}\S]/8g + \x{442}\x{435}\x{441}\x{442} + 0: \x{442} + 0: \x{435} + 0: \x{441} + 0: \x{442} + +/.[^\S]./8g + abc def\x{442}\x{443}xyz\npqr + 0: c d + 0: z\x{0a}p + +/.[^\S\n]./8g + abc def\x{442}\x{443}xyz\npqr + 0: c d + +/[[:^alnum:]]/8g + +\x{2442} + 0: + + 0: \x{2442} + +/[[:^alpha:]]/8g + +\x{2442} + 0: + + 0: \x{2442} + +/[[:^ascii:]]/8g + A\x{442} + 0: \x{442} + +/[[:^blank:]]/8g + A\x{442} + 0: A + 0: \x{442} + +/[[:^cntrl:]]/8g + A\x{442} + 0: A + 0: \x{442} + +/[[:^digit:]]/8g + A\x{442} + 0: A + 0: \x{442} + +/[[:^graph:]]/8g + \x19\x{e01ff} + 0: \x{19} + 0: \x{e01ff} + +/[[:^lower:]]/8g + A\x{422} + 0: A + 0: \x{422} + +/[[:^print:]]/8g + \x{19}\x{e01ff} + 0: \x{19} + 0: \x{e01ff} + +/[[:^punct:]]/8g + A\x{442} + 0: A + 0: \x{442} + +/[[:^space:]]/8g + A\x{442} + 0: A + 0: \x{442} + +/[[:^upper:]]/8g + a\x{442} + 0: a + 0: \x{442} + +/[[:^word:]]/8g + +\x{2442} + 0: + + 0: \x{2442} + +/[[:^xdigit:]]/8g + M\x{442} + 0: M + 0: \x{442} + +/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖØÙÚÛÜÃÞĀĂĄĆĈĊČĎÄĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿÅŃŅŇŊŌŎÅŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽÆƂƄƆƇƉƊƋƎÆÆƑƓƔƖƗƘƜÆƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJÇÇǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎÈȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾÉΆΈΉΊΌΎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀÐЂЃЄЅІЇЈЉЊЋЌÐÐŽÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎÒҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀÓÓƒÓ…Ó‡Ó‰Ó‹ÓÓӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀÕÕ‚ÕƒÕ„Õ…Õ†Õ‡ÕˆÕ‰ÕŠÕ‹ÕŒÕÕŽÕÕՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀáƒáƒ‚ჃჄჅḀḂḄḆḈḊḌḎá¸á¸’ḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎá¹á¹’ṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎáºáº’ẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎá»á»’ỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌá¼á¼Žá¼á¼˜á¼™á¼šá¼›á¼œá¼á¼¨á¼©á¼ªá¼«á¼¬á¼­á¼®á¼¯á¼¸á¼¹á¼ºá¼»á¼¼á¼½á¼¾á¼¿á½ˆá½‰á½Šá½‹á½Œá½á½™á½›á½á½Ÿá½¨á½©á½ªá½«á½¬á½­á½®á½¯á¾¸á¾¹á¾ºá¾»á¿ˆá¿‰á¿Šá¿‹á¿˜á¿™á¿šá¿›á¿¨á¿©á¿ªá¿«á¿¬á¿¸á¿¹á¿ºá¿»abcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿÄăąćĉċÄÄđēĕėęěÄğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋÅÅőœŕŗřśÅşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƃƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎÇǒǔǖǘǚǜÇǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿÈȃȅȇȉȋÈÈȑȓȕȗșțÈȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀÉɑɒɓɔɕɖɗɘəɚɛɜÉɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀÊʂʃʄʅʆʇʈʉʊʋʌÊÊŽÊÊʑʒʓʔʕʖʗʘʙʚʛʜÊʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯÎάέήίΰαβγδεζηθικλμνξοπÏςστυφχψωϊϋόÏÏŽÏϑϕϖϗϙϛÏϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑёђѓєѕіїјљњћќÑўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿÒÒ‹ÒÒÒ‘Ò“Ò•Ò—Ò™Ò›ÒҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛÓÓŸÓ¡Ó£Ó¥Ó§Ó©Ó«Ó­Ó¯Ó±Ó³ÓµÓ·Ó¹ÔÔƒÔ…Ô‡Ô‰Ô‹ÔÔÕ¡Õ¢Õ£Õ¤Õ¥Õ¦Õ§Õ¨Õ©ÕªÕ«Õ¬Õ­Õ®Õ¯Õ°Õ±Õ²Õ³Õ´ÕµÕ¶Õ·Õ¸Õ¹ÕºÕ»Õ¼Õ½Õ¾Õ¿Ö€Öւփքօֆևᴀá´á´‚ᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌá´á´Žá´á´á´‘ᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜá´á´žá´Ÿá´ á´¡á´¢á´£á´¤á´¥á´¦á´§á´¨á´©á´ªá´«áµ¢áµ£áµ¤áµ¥áµ¦áµ§áµ¨áµ©áµªáµ«áµ¬áµ­áµ®áµ¯áµ°áµ±áµ²áµ³áµ´áµµáµ¶áµ·áµ¹áµºáµ»áµ¼áµ½áµ¾áµ¿á¶€á¶á¶‚ᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌá¶á¶Žá¶á¶á¶‘ᶒᶓᶔᶕᶖᶗᶘᶙᶚá¸á¸ƒá¸…ḇḉḋá¸á¸á¸‘ḓḕḗḙḛá¸á¸Ÿá¸¡á¸£á¸¥á¸§á¸©á¸«á¸­á¸¯á¸±á¸³á¸µá¸·á¸¹á¸»á¸½á¸¿á¹á¹ƒá¹…ṇṉṋá¹á¹á¹‘ṓṕṗṙṛá¹á¹Ÿá¹¡á¹£á¹¥á¹§á¹©á¹«á¹­á¹¯á¹±á¹³á¹µá¹·á¹¹á¹»á¹½á¹¿áºáºƒáº…ẇẉẋáºáºáº‘ẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếá»á»ƒá»…ệỉịá»á»á»‘ồổỗộớá»á»Ÿá»¡á»£á»¥á»§á»©á»«á»­á»¯á»±á»³á»µá»·á»¹á¼€á¼á¼‚ἃἄἅἆἇá¼á¼‘ἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀá½á½‚ὃὄὅá½á½‘ὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀá¾á¾‚ᾃᾄᾅᾆᾇá¾á¾‘ᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇá¿á¿‘ῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷâ²â²ƒâ²…ⲇⲉⲋâ²â²â²‘ⲓⲕⲗⲙⲛâ²â²Ÿâ²¡â²£â²¥â²§â²©â²«â²­â²¯â²±â²³â²µâ²·â²¹â²»â²½â²¿â³â³ƒâ³…ⳇⳉⳋâ³â³â³‘ⳓⳕⳗⳙⳛâ³â³Ÿâ³¡â³£â³¤â´€â´â´‚ⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌâ´â´Žâ´â´â´‘ⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜâ´â´žâ´Ÿâ´ â´¡â´¢â´£â´¤â´¥ï¬€ï¬ï¬‚ffifflſtstﬓﬔﬕﬖﬗ\d-_^]/8 + +/ End of testinput4 / diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput5 erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput5 --- erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput5 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput5 2009-03-12 12:21:53.000000000 +0000 @@ -0,0 +1,1611 @@ +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 196 +Need char = 128 + +/\x{1000}/8DZ +------------------------------------------------------------------ + Bra + \x{1000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 225 +Need char = 128 + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 240 +Need char = 128 + +/\x{100000}/8DZ +------------------------------------------------------------------ + Bra + \x{100000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 244 +Need char = 128 + +/\x{1000000}/8DZ +------------------------------------------------------------------ + Bra + \x{1000000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 249 +Need char = 128 + +/\x{4000000}/8DZ +------------------------------------------------------------------ + Bra + \x{4000000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 252 +Need char = 128 + +/\x{7fffFFFF}/8DZ +------------------------------------------------------------------ + Bra + \x{7fffffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 253 +Need char = 191 + +/[\x{ff}]/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 195 +Need char = 191 + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + [\x{100}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +No first char +No need char + +/\x{ffffffff}/8 +Failed: character value in \x{...} sequence is too large at offset 11 + +/\x{100000000}/8 +Failed: character value in \x{...} sequence is too large at offset 12 + +/^\x{100}a\x{1234}/8 + \x{100}a\x{1234}bcd + 0: \x{100}a\x{1234} + +/\x80/8DZ +------------------------------------------------------------------ + Bra + \x{80} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 194 +Need char = 128 + +/\xff/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 195 +Need char = 191 + +/\x{0041}\x{2262}\x{0391}\x{002e}/DZ8 +------------------------------------------------------------------ + Bra + A\x{2262}\x{391}. + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 'A' +Need char = '.' + \x{0041}\x{2262}\x{0391}\x{002e} + 0: A\x{2262}\x{391}. + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 +------------------------------------------------------------------ + Bra + \x{d55c}\x{ad6d}\x{c5b4} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 237 +Need char = 180 + \x{D55c}\x{ad6d}\x{C5B4} + 0: \x{d55c}\x{ad6d}\x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 +------------------------------------------------------------------ + Bra + \x{65e5}\x{672c}\x{8a9e} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 230 +Need char = 158 + \x{65e5}\x{672c}\x{8a9e} + 0: \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 +------------------------------------------------------------------ + Bra + \x{80} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 194 +Need char = 128 + +/\x{084}/DZ8 +------------------------------------------------------------------ + Bra + \x{84} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 194 +Need char = 132 + +/\x{104}/DZ8 +------------------------------------------------------------------ + Bra + \x{104} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 196 +Need char = 132 + +/\x{861}/DZ8 +------------------------------------------------------------------ + Bra + \x{861} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 224 +Need char = 161 + +/\x{212ab}/DZ8 +------------------------------------------------------------------ + Bra + \x{212ab} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 240 +Need char = 171 + +/.{3,5}X/DZ8 +------------------------------------------------------------------ + Bra + Any{3} + Any{0,2} + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +Need char = 'X' + \x{212ab}\x{212ab}\x{212ab}\x{861}X + 0: \x{212ab}\x{212ab}\x{212ab}\x{861}X + + +/.{3,5}?/DZ8 +------------------------------------------------------------------ + Bra + Any{3} + Any{0,2}? + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +No need char + \x{212ab}\x{212ab}\x{212ab}\x{861} + 0: \x{212ab}\x{212ab}\x{212ab} + +/-- These tests are here rather than in testinput4 because Perl 5.6 has some +problems with UTF-8 support, in the area of \x{..} where the value is < 255. +It grumbles about invalid UTF-8 strings. --/ + +/^[a\x{c0}]b/8 + \x{c0}b + 0: \x{c0}b + +/^([a\x{c0}]*?)aa/8 + a\x{c0}aaaa/ + 0: a\x{c0}aa + 1: a\x{c0} + +/^([a\x{c0}]*?)aa/8 + a\x{c0}aaaa/ + 0: a\x{c0}aa + 1: a\x{c0} + a\x{c0}a\x{c0}aaa/ + 0: a\x{c0}a\x{c0}aa + 1: a\x{c0}a\x{c0} + +/^([a\x{c0}]*)aa/8 + a\x{c0}aaaa/ + 0: a\x{c0}aaaa + 1: a\x{c0}aa + a\x{c0}a\x{c0}aaa/ + 0: a\x{c0}a\x{c0}aaa + 1: a\x{c0}a\x{c0}a + +/^([a\x{c0}]*)a\x{c0}/8 + a\x{c0}aaaa/ + 0: a\x{c0} + 1: + a\x{c0}a\x{c0}aaa/ + 0: a\x{c0}a\x{c0} + 1: a\x{c0} + +/-- --/ + +/(?<=\C)X/8 +Failed: \C not allowed in lookbehind assertion at offset 6 + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + 0: X\x{1234} + 1: \xe1 + 2: \x88\xb4 + X\nabc + 0: X\x{0a}abc + 1: \x{0a} + 2: abc + +/^[ab]/8DZ +------------------------------------------------------------------ + Bra + ^ + [ab] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored utf8 +No first char +No need char + bar + 0: b + *** Failers +No match + c +No match + \x{ff} +No match + \x{100} +No match + +/^[^ab]/8DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-`c-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored utf8 +No first char +No need char + c + 0: c + \x{ff} + 0: \x{ff} + \x{100} + 0: \x{100} + *** Failers + 0: * + aaa +No match + +/[^ab\xC0-\xF0]/8SDZ +------------------------------------------------------------------ + Bra + [\x00-`c-\xbf\xf1-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +No first char +No need char +Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a + \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 + \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 + 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y + Z [ \ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f + \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 + \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf + \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee + \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd + \xfe \xff + \x{f1} + 0: \x{f1} + \x{bf} + 0: \x{bf} + \x{100} + 0: \x{100} + \x{1000} + 0: \x{1000} + *** Failers + 0: * + \x{c0} +No match + \x{f0} +No match + +/Ä€{3,4}/8SDZ +------------------------------------------------------------------ + Bra + \x{100}{3} + \x{100}? + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +First char = 196 +Need char = 128 +Study returned NULL + \x{100}\x{100}\x{100}\x{100\x{100} + 0: \x{100}\x{100}\x{100} + +/(\x{100}+|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}+ + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Partial matching not supported +Options: utf8 +No first char +No need char +Starting byte set: x \xc4 + +/(\x{100}*a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}*+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Partial matching not supported +Options: utf8 +No first char +No need char +Starting byte set: a x \xc4 + +/(\x{100}{0,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}{0,2} + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Partial matching not supported +Options: utf8 +No first char +No need char +Starting byte set: a x \xc4 + +/(\x{100}{1,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100} + \x{100}{0,1} + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Partial matching not supported +Options: utf8 +No first char +No need char +Starting byte set: x \xc4 + +/\x{100}*(\d+|"(?1)")/8 + 1234 + 0: 1234 + 1: 1234 + "1234" + 0: "1234" + 1: "1234" + \x{100}1234 + 0: \x{100}1234 + 1: 1234 + "\x{100}1234" + 0: \x{100}1234 + 1: 1234 + \x{100}\x{100}12ab + 0: \x{100}\x{100}12 + 1: 12 + \x{100}\x{100}"12" + 0: \x{100}\x{100}"12" + 1: "12" + *** Failers +No match + \x{100}\x{100}abcd +No match + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 196 +Need char = 128 + +/\x{100}*/8DZ +------------------------------------------------------------------ + Bra + \x{100}* + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +No need char + +/a\x{100}*/8DZ +------------------------------------------------------------------ + Bra + a + \x{100}* + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +First char = 'a' +No need char + +/ab\x{100}*/8DZ +------------------------------------------------------------------ + Bra + ab + \x{100}* + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +First char = 'a' +Need char = 'b' + +/a\x{100}\x{101}*/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}* + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +First char = 'a' +Need char = 128 + +/a\x{100}\x{101}+/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +First char = 'a' +Need char = 129 + +/\x{100}*A/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + A + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +Need char = 'A' + A + 0: A + +/\x{100}*\d(?R)/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + \d + Once + Recurse + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +No need char + +/[^\x{c4}]/DZ +------------------------------------------------------------------ + Bra + [^\xc4] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[^\x{c4}]/8DZ +------------------------------------------------------------------ + Bra + [\x00-\xc3\xc5-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +No first char +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + [\x{100}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +No first char +No need char + \x{100} + 0: \x{100} + Z\x{100} + 0: \x{100} + \x{100}Z + 0: \x{100} + *** Failers +No match + +/[Z\x{100}]/8DZ +------------------------------------------------------------------ + Bra + [Z\x{100}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +No first char +No need char + Z\x{100} + 0: Z + \x{100} + 0: \x{100} + \x{100}Z + 0: \x{100} + *** Failers +No match + +/[\x{200}-\x{100}]/8 +Failed: range out of order in character class at offset 15 + +/[Ä€-Ä„]/8 + \x{100} + 0: \x{100} + \x{104} + 0: \x{104} + *** Failers +No match + \x{105} +No match + \x{ff} +No match + +/[z-\x{100}]/8DZ +------------------------------------------------------------------ + Bra + [z-\x{100}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +No first char +No need char + +/[z\Qa-d]Ä€\E]/8DZ +------------------------------------------------------------------ + Bra + [\-\]adz\x{100}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +No first char +No need char + \x{100} + 0: \x{100} + Ä€ + 0: \x{100} + +/[\xFF]/DZ +------------------------------------------------------------------ + Bra + \xff + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 255 +No need char + >\xff< + 0: \xff + +/[\xff]/DZ8 +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 195 +Need char = 191 + >\x{ff}< + 0: \x{ff} + +/[^\xFF]/DZ +------------------------------------------------------------------ + Bra + [^\xff] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[^\xff]/8DZ +------------------------------------------------------------------ + Bra + [\x00-\xfe] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +No first char +No need char + +/[Ä-Ãœ]/8 + Ö # Matches without Study + 0: \x{d6} + \x{d6} + 0: \x{d6} + +/[Ä-Ãœ]/8S + Ö <-- Same with Study + 0: \x{d6} + \x{d6} + 0: \x{d6} + +/[\x{c4}-\x{dc}]/8 + Ö # Matches without Study + 0: \x{d6} + \x{d6} + 0: \x{d6} + +/[\x{c4}-\x{dc}]/8S + Ö <-- Same with Study + 0: \x{d6} + \x{d6} + 0: \x{d6} + +/[Ã]/8 +Failed: invalid UTF-8 string at offset 2 + +/Ã/8 +Failed: invalid UTF-8 string at offset 0 + +/ÃÃÃxxx/8 +Failed: invalid UTF-8 string at offset 1 + +/ÃÃÃxxx/8?DZ +------------------------------------------------------------------ + Bra + \X{c0}\X{c0}\X{c0}xxx + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 no_utf8_check +First char = 195 +Need char = 'x' + +/abc/8 + Ã] +Error -10 + à +Error -10 + ÃÃà +Error -10 + ÃÃÃ\? +No match + +/anything/8 + \xc0\x80 +Error -10 + \xc1\x8f +Error -10 + \xe0\x9f\x80 +Error -10 + \xf0\x8f\x80\x80 +Error -10 + \xf8\x87\x80\x80\x80 +Error -10 + \xfc\x83\x80\x80\x80\x80 +Error -10 + \xfe\x80\x80\x80\x80\x80 +Error -10 + \xff\x80\x80\x80\x80\x80 +Error -10 + \xc3\x8f +No match + \xe0\xaf\x80 +No match + \xe1\x80\x80 +No match + \xf0\x9f\x80\x80 +No match + \xf1\x8f\x80\x80 +No match + \xf8\x88\x80\x80\x80 +Error -10 + \xf9\x87\x80\x80\x80 +Error -10 + \xfc\x84\x80\x80\x80\x80 +Error -10 + \xfd\x83\x80\x80\x80\x80 +Error -10 + \?\xf8\x88\x80\x80\x80 +No match + \?\xf9\x87\x80\x80\x80 +No match + \?\xfc\x84\x80\x80\x80\x80 +No match + \?\xfd\x83\x80\x80\x80\x80 +No match + +/\x{100}abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + \x{100}abc + CBra 1 + xyz + Once + Recurse + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf8 +First char = 196 +Need char = 'z' + +/[^\x{100}]abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + [^\x{100}] + abc + CBra 1 + xyz + Once + Recurse + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf8 +No first char +Need char = 'z' + +/[ab\x{100}]abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + [ab\x{100}] + abc + CBra 1 + xyz + Once + Recurse + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf8 +No first char +Need char = 'z' + +/(\x{100}(b(?2)c))?/DZ8 +------------------------------------------------------------------ + Bra + Brazero + CBra 1 + \x{100} + CBra 2 + b + Once + Recurse + Ket + c + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Options: utf8 +No first char +No need char + +/(\x{100}(b(?2)c)){0,2}/DZ8 +------------------------------------------------------------------ + Bra + Brazero + Bra + CBra 1 + \x{100} + CBra 2 + b + Once + Recurse + Ket + c + Ket + Ket + Brazero + CBra 1 + \x{100} + CBra 2 + b + Once + Recurse + Ket + c + Ket + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Options: utf8 +No first char +No need char + +/(\x{100}(b(?1)c))?/DZ8 +------------------------------------------------------------------ + Bra + Brazero + CBra 1 + \x{100} + CBra 2 + b + Once + Recurse + Ket + c + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Options: utf8 +No first char +No need char + +/(\x{100}(b(?1)c)){0,2}/DZ8 +------------------------------------------------------------------ + Bra + Brazero + Bra + CBra 1 + \x{100} + CBra 2 + b + Once + Recurse + Ket + c + Ket + Ket + Brazero + CBra 1 + \x{100} + CBra 2 + b + Once + Recurse + Ket + c + Ket + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Options: utf8 +No first char +No need char + +/\W/8 + A.B + 0: . + A\x{100}B + 0: \x{100} + +/\w/8 + \x{100}X + 0: X + +/a\x{1234}b/P8 + a\x{1234}b + 0: a\x{1234}b + +/^\ሴ/8DZ +------------------------------------------------------------------ + Bra + ^ + \x{1234} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored utf8 +No first char +No need char + +/\777/I +Failed: octal value is greater than \377 (not in UTF-8 mode) at offset 3 + +/\777/8I +Capturing subpattern count = 0 +Options: utf8 +First char = 199 +Need char = 191 + \x{1ff} + 0: \x{1ff} + \777 + 0: \x{1ff} + +/\x{100}*\d/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +No need char + +/\x{100}*\s/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + \s + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +No need char + +/\x{100}*\w/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + \w + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +No need char + +/\x{100}*\D/8DZ +------------------------------------------------------------------ + Bra + \x{100}* + \D + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +No need char + +/\x{100}*\S/8DZ +------------------------------------------------------------------ + Bra + \x{100}* + \S + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +No need char + +/\x{100}*\W/8DZ +------------------------------------------------------------------ + Bra + \x{100}* + \W + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +No first char +No need char + +/\x{100}+\x{200}/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +First char = 196 +Need char = 128 + +/\x{100}+X/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +First char = 196 +Need char = 'X' + +/X+\x{200}/8DZ +------------------------------------------------------------------ + Bra + X++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Partial matching not supported +Options: utf8 +First char = 'X' +Need char = 128 + +/()()()()()()()()()() + ()()()()()()()()()() + ()()()()()()()()()() + ()()()()()()()()()() + A (x) (?41) B/8x + AxxB +Matched, but too many substrings + 0: AxxB + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: +10: +11: +12: +13: +14: + +/^[\x{100}\E-\Q\E\x{150}]/BZ8 +------------------------------------------------------------------ + Bra + ^ + [\x{100}-\x{150}] + Ket + End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E]/BZ8 +------------------------------------------------------------------ + Bra + ^ + [\x{100}-\x{150}] + Ket + End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E/BZ8 +Failed: missing terminating ] for character class at offset 15 + +/^abc./mgx8 + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x{0085}abc7 \x{2028}abc8 \x{2029}abc9 JUNK + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + 0: abc8 + 0: abc9 + +/abc.$/mgx8 + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x{0085} abc7\x{2028} abc8\x{2029} abc9 + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + 0: abc8 + 0: abc9 + +/^a\Rb/8 + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0cb + 0: a\x{0c}b + a\x{85}b + 0: a\x{85}b + a\x{2028}b + 0: a\x{2028}b + a\x{2029}b + 0: a\x{2029}b + ** Failers +No match + a\n\rb +No match + +/^a\R*b/8 + ab + 0: ab + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0c\x{2028}\x{2029}b + 0: a\x{0c}\x{2028}\x{2029}b + a\x{85}b + 0: a\x{85}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}\x0cb + 0: a\x{0a}\x{0d}\x{85}\x{0c}b + +/^a\R+b/8 + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0c\x{2028}\x{2029}b + 0: a\x{0c}\x{2028}\x{2029}b + a\x{85}b + 0: a\x{85}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}\x0cb + 0: a\x{0a}\x{0d}\x{85}\x{0c}b + ** Failers +No match + ab +No match + +/^a\R{1,3}b/8 + a\nb + 0: a\x{0a}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}b + 0: a\x{0a}\x{0d}\x{85}b + a\r\n\r\nb + 0: a\x{0d}\x{0a}\x{0d}\x{0a}b + a\r\n\r\n\r\nb + 0: a\x{0d}\x{0a}\x{0d}\x{0a}\x{0d}\x{0a}b + a\n\r\n\rb + 0: a\x{0a}\x{0d}\x{0a}\x{0d}b + a\n\n\r\nb + 0: a\x{0a}\x{0a}\x{0d}\x{0a}b + ** Failers +No match + a\n\n\n\rb +No match + a\r +No match + +/\H\h\V\v/8 + X X\x0a + 0: X X\x{0a} + X\x09X\x0b + 0: X\x{09}X\x{0b} + ** Failers +No match + \x{a0} X\x0a +No match + +/\H*\h+\V?\v{3,4}/8 + \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d} + \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a + 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c}\x{0d} + \x09\x20\x{a0}\x0a\x0b\x0c + 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c} + ** Failers +No match + \x09\x20\x{a0}\x0a\x0b +No match + +/\H\h\V\v/8 + \x{3001}\x{3000}\x{2030}\x{2028} + 0: \x{3001}\x{3000}\x{2030}\x{2028} + X\x{180e}X\x{85} + 0: X\x{180e}X\x{85} + ** Failers +No match + \x{2009} X\x0a +No match + +/\H*\h+\V?\v{3,4}/8 + \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a + 0: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c}\x{0d} + \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a + 0: \x{09}\x{205f}\x{a0}\x{0a}\x{2029}\x{0c}\x{2028} + \x09\x20\x{202f}\x0a\x0b\x0c + 0: \x{09} \x{202f}\x{0a}\x{0b}\x{0c} + ** Failers +No match + \x09\x{200a}\x{a0}\x{2028}\x0b +No match + +/[\h]/8BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}] + Ket + End +------------------------------------------------------------------ + >\x{1680} + 0: \x{1680} + +/[\h]{3,}/8BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]{3,} + Ket + End +------------------------------------------------------------------ + >\x{1680}\x{180e}\x{2000}\x{2003}\x{200a}\x{202f}\x{205f}\x{3000}< + 0: \x{1680}\x{180e}\x{2000}\x{2003}\x{200a}\x{202f}\x{205f}\x{3000} + +/[\v]/8BZ +------------------------------------------------------------------ + Bra + [\x0a-\x0d\x85\x{2028}-\x{2029}] + Ket + End +------------------------------------------------------------------ + +/[\H]/8BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff\x{100}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{7fffffff}] + Ket + End +------------------------------------------------------------------ + +/[\V]/8BZ +------------------------------------------------------------------ + Bra + [\x00-\x09\x0e-\x84\x86-\xff\x{100}-\x{2027}\x{2029}-\x{7fffffff}] + Ket + End +------------------------------------------------------------------ + +/.*$/8 + \x{1ec5} + 0: \x{1ec5} + +/-- This tests the stricter UTF-8 check according to RFC 3629. --/ + +/X/8 + \x{0}\x{d7ff}\x{e000}\x{10ffff} +No match + \x{d800} +Error -10 + \x{d800}\? +No match + \x{da00} +Error -10 + \x{da00}\? +No match + \x{dfff} +Error -10 + \x{dfff}\? +No match + \x{110000} +Error -10 + \x{110000}\? +No match + \x{2000000} +Error -10 + \x{2000000}\? +No match + \x{7fffffff} +Error -10 + \x{7fffffff}\? +No match + +/a\Rb/I8 +Capturing subpattern count = 0 +Options: bsr_anycrlf utf8 +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + ** Failers +No match + a\x{85}b +No match + a\x0bb +No match + +/a\Rb/I8 +Capturing subpattern count = 0 +Options: bsr_unicode utf8 +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x{85}b + 0: a\x{85}b + a\x0bb + 0: a\x{0b}b + ** Failers +No match + a\x{85}b\ +No match + a\x0bb\ +No match + +/a\R?b/I8 +Capturing subpattern count = 0 +Options: bsr_anycrlf utf8 +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + ** Failers +No match + a\x{85}b +No match + a\x0bb +No match + +/a\R?b/I8 +Capturing subpattern count = 0 +Options: bsr_unicode utf8 +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x{85}b + 0: a\x{85}b + a\x0bb + 0: a\x{0b}b + ** Failers +No match + a\x{85}b\ +No match + a\x0bb\ +No match + +/.*a.*=.b.*/8 + QQQ\x{2029}ABCaXYZ=!bPQR + 0: ABCaXYZ=!bPQR + ** Failers +No match + a\x{2029}b +No match + \x61\xe2\x80\xa9\x62 +No match + +/[[:a\x{100}b:]]/8 +Failed: unknown POSIX class name at offset 3 + +/ End of testinput5 / diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput6 erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput6 --- erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput6 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput6 2009-03-12 12:21:54.000000000 +0000 @@ -0,0 +1,1682 @@ +/^\pC\pL\pM\pN\pP\pS\pZ3 + 0: abc + *** Failers +No match + xyzabc +No match + xyzabc\>2 +No match + +/x\dy\Dz/ + x9yzz + 0: x9yzz + x0y+z + 0: x0y+z + *** Failers +No match + xyz +No match + xxy0z +No match + +/x\sy\Sz/ + x yzz + 0: x yzz + x y+z + 0: x y+z + *** Failers +No match + xyz +No match + xxyyz +No match + +/x\wy\Wz/ + xxy+z + 0: xxy+z + *** Failers +No match + xxy0z +No match + x+y+z +No match + +/x.y/ + x+y + 0: x+y + x-y + 0: x-y + *** Failers +No match + x\ny +No match + +/x.y/s + x+y + 0: x+y + x-y + 0: x-y + x\ny + 0: x\x0ay + +/(a.b(?s)c.d|x.y)p.q/ + a+bc+dp+q + 0: a+bc+dp+q + a+bc\ndp+q + 0: a+bc\x0adp+q + x\nyp+q + 0: x\x0ayp+q + *** Failers +No match + a\nbc\ndp+q +No match + a+bc\ndp\nq +No match + x\nyp\nq +No match + +/a\d\z/ + ba0 + 0: a0 + *** Failers +No match + ba0\n +No match + ba0\ncd +No match + +/a\d\z/m + ba0 + 0: a0 + *** Failers +No match + ba0\n +No match + ba0\ncd +No match + +/a\d\Z/ + ba0 + 0: a0 + ba0\n + 0: a0 + *** Failers +No match + ba0\ncd +No match + +/a\d\Z/m + ba0 + 0: a0 + ba0\n + 0: a0 + *** Failers +No match + ba0\ncd +No match + +/a\d$/ + ba0 + 0: a0 + ba0\n + 0: a0 + *** Failers +No match + ba0\ncd +No match + +/a\d$/m + ba0 + 0: a0 + ba0\n + 0: a0 + ba0\ncd + 0: a0 + *** Failers +No match + +/abc/i + abc + 0: abc + aBc + 0: aBc + ABC + 0: ABC + +/[^a]/ + abcd + 0: b + +/ab?\w/ + abz + 0: abz + 1: ab + abbz + 0: abb + 1: ab + azz + 0: az + +/x{0,3}yz/ + ayzq + 0: yz + axyzq + 0: xyz + axxyz + 0: xxyz + axxxyzq + 0: xxxyz + axxxxyzq + 0: xxxyz + *** Failers +No match + ax +No match + axx +No match + +/x{3}yz/ + axxxyzq + 0: xxxyz + axxxxyzq + 0: xxxyz + *** Failers +No match + ax +No match + axx +No match + ayzq +No match + axyzq +No match + axxyz +No match + +/x{2,3}yz/ + axxyz + 0: xxyz + axxxyzq + 0: xxxyz + axxxxyzq + 0: xxxyz + *** Failers +No match + ax +No match + axx +No match + ayzq +No match + axyzq +No match + +/[^a]+/ + bac + 0: b + bcdefax + 0: bcdef + 1: bcde + 2: bcd + 3: bc + 4: b + *** Failers + 0: *** F + 1: *** + 2: *** + 3: ** + 4: * + aaaaa +No match + +/[^a]*/ + bac + 0: b + 1: + bcdefax + 0: bcdef + 1: bcde + 2: bcd + 3: bc + 4: b + 5: + *** Failers + 0: *** F + 1: *** + 2: *** + 3: ** + 4: * + 5: + aaaaa + 0: + +/[^a]{3,5}/ + xyz + 0: xyz + awxyza + 0: wxyz + 1: wxy + abcdefa + 0: bcdef + 1: bcde + 2: bcd + abcdefghijk + 0: bcdef + 1: bcde + 2: bcd + *** Failers + 0: *** F + 1: *** + 2: *** + axya +No match + axa +No match + aaaaa +No match + +/\d*/ + 1234b567 + 0: 1234 + 1: 123 + 2: 12 + 3: 1 + 4: + xyz + 0: + +/\D*/ + a1234b567 + 0: a + 1: + xyz + 0: xyz + 1: xy + 2: x + 3: + +/\d+/ + ab1234c56 + 0: 1234 + 1: 123 + 2: 12 + 3: 1 + *** Failers +No match + xyz +No match + +/\D+/ + ab123c56 + 0: ab + 1: a + *** Failers + 0: *** Failers + 1: *** Failer + 2: *** Faile + 3: *** Fail + 4: *** Fai + 5: *** Fa + 6: *** F + 7: *** + 8: *** + 9: ** +10: * + 789 +No match + +/\d?A/ + 045ABC + 0: 5A + ABC + 0: A + *** Failers +No match + XYZ +No match + +/\D?A/ + ABC + 0: A + BAC + 0: BA + 9ABC + 0: A + *** Failers +No match + +/a+/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + +/^.*xyz/ + xyz + 0: xyz + ggggggggxyz + 0: ggggggggxyz + +/^.+xyz/ + abcdxyz + 0: abcdxyz + axyz + 0: axyz + *** Failers +No match + xyz +No match + +/^.?xyz/ + xyz + 0: xyz + cxyz + 0: cxyz + +/^\d{2,3}X/ + 12X + 0: 12X + 123X + 0: 123X + *** Failers +No match + X +No match + 1X +No match + 1234X +No match + +/^[abcd]\d/ + a45 + 0: a4 + b93 + 0: b9 + c99z + 0: c9 + d04 + 0: d0 + *** Failers +No match + e45 +No match + abcd +No match + abcd1234 +No match + 1234 +No match + +/^[abcd]*\d/ + a45 + 0: a4 + b93 + 0: b9 + c99z + 0: c9 + d04 + 0: d0 + abcd1234 + 0: abcd1 + 1234 + 0: 1 + *** Failers +No match + e45 +No match + abcd +No match + +/^[abcd]+\d/ + a45 + 0: a4 + b93 + 0: b9 + c99z + 0: c9 + d04 + 0: d0 + abcd1234 + 0: abcd1 + *** Failers +No match + 1234 +No match + e45 +No match + abcd +No match + +/^a+X/ + aX + 0: aX + aaX + 0: aaX + +/^[abcd]?\d/ + a45 + 0: a4 + b93 + 0: b9 + c99z + 0: c9 + d04 + 0: d0 + 1234 + 0: 1 + *** Failers +No match + abcd1234 +No match + e45 +No match + +/^[abcd]{2,3}\d/ + ab45 + 0: ab4 + bcd93 + 0: bcd9 + *** Failers +No match + 1234 +No match + a36 +No match + abcd1234 +No match + ee45 +No match + +/^(abc)*\d/ + abc45 + 0: abc4 + abcabcabc45 + 0: abcabcabc4 + 42xyz + 0: 4 + *** Failers +No match + +/^(abc)+\d/ + abc45 + 0: abc4 + abcabcabc45 + 0: abcabcabc4 + *** Failers +No match + 42xyz +No match + +/^(abc)?\d/ + abc45 + 0: abc4 + 42xyz + 0: 4 + *** Failers +No match + abcabcabc45 +No match + +/^(abc){2,3}\d/ + abcabc45 + 0: abcabc4 + abcabcabc45 + 0: abcabcabc4 + *** Failers +No match + abcabcabcabc45 +No match + abc45 +No match + 42xyz +No match + +/1(abc|xyz)2(?1)3/ + 1abc2abc3456 + 0: 1abc2abc3 + 1abc2xyz3456 + 0: 1abc2xyz3 + +/^(a*\w|ab)=(a*\w|ab)/ + ab=ab + 0: ab=ab + 1: ab=a + +/^(a*\w|ab)=(?1)/ + ab=ab + 0: ab=ab + +/^([^()]|\((?1)*\))*$/ + abc + 0: abc + a(b)c + 0: a(b)c + a(b(c))d + 0: a(b(c))d + *** Failers) +No match + a(b(c)d +No match + +/^>abc>([^()]|\((?1)*\))*abc>123abc>123abc>1(2)3abc>1(2)3abc>(1(2)3)abc>(1(2)3)a*)\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9 + *** Failers +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >/x + <> + 0: <> + + 0: + hij> + 0: hij> + hij> + 0: + def> + 0: def> + + 0: <> + *** Failers +No match + abcxyz + 1 ^ ^ x + 0: abcxyz + 123abcxyz999 +--->123abcxyz999 + 1 ^ ^ x + 0: abcxyz + +/(ab|cd){3,4}/C + ababab +--->ababab + +0 ^ (ab|cd){3,4} + +1 ^ a + +4 ^ c + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +2 ^ ^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +2 ^ ^ b + +3 ^ ^ | ++12 ^ ^ + +1 ^ ^ a + +4 ^ ^ c + 0: ababab + abcdabcd +--->abcdabcd + +0 ^ (ab|cd){3,4} + +1 ^ a + +4 ^ c + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) + +1 ^ ^ a + +4 ^ ^ c + +2 ^ ^ b + +3 ^ ^ | ++12 ^ ^ + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) ++12 ^ ^ + 0: abcdabcd + 1: abcdab + abcdcdcdcdcd +--->abcdcdcdcdcd + +0 ^ (ab|cd){3,4} + +1 ^ a + +4 ^ c + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) ++12 ^ ^ + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) ++12 ^ ^ + 0: abcdcdcd + 1: abcdcd + +/^abc/ + abcdef + 0: abc + *** Failers +No match + abcdef\B +No match + +/^(a*|xyz)/ + bcd + 0: + aaabcd + 0: aaa + 1: aa + 2: a + 3: + xyz + 0: xyz + 1: + xyz\N + 0: xyz + *** Failers + 0: + bcd\N +No match + +/xyz$/ + xyz + 0: xyz + xyz\n + 0: xyz + *** Failers +No match + xyz\Z +No match + xyz\n\Z +No match + +/xyz$/m + xyz + 0: xyz + xyz\n + 0: xyz + abcxyz\npqr + 0: xyz + abcxyz\npqr\Z + 0: xyz + xyz\n\Z + 0: xyz + *** Failers +No match + xyz\Z +No match + +/\Gabc/ + abcdef + 0: abc + defabcxyz\>3 + 0: abc + *** Failers +No match + defabcxyz +No match + +/^abcdef/ + ab\P +Partial match: ab + abcde\P +Partial match: abcde + abcdef\P + 0: abcdef + *** Failers +No match + abx\P +No match + +/^a{2,4}\d+z/ + a\P +Partial match: a + aa\P +Partial match: aa + aa2\P +Partial match: aa2 + aaa\P +Partial match: aaa + aaa23\P +Partial match: aaa23 + aaaa12345\P +Partial match: aaaa12345 + aa0z\P + 0: aa0z + aaaa4444444444444z\P + 0: aaaa4444444444444z + *** Failers +No match + az\P +No match + aaaaa\P +No match + a56\P +No match + +/^abcdef/ + abc\P +Partial match: abc + def\R + 0: def + +/(?<=foo)bar/ + xyzfo\P +No match + foob\P\>2 +Partial match: b + foobar...\R\P\>4 + 0: ar + xyzfo\P +No match + foobar\>2 + 0: bar + *** Failers +No match + xyzfo\P +No match + obar\R +No match + +/(ab*(cd|ef))+X/ + adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\P\Z +No match + lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\P\B\Z +Partial match: abbbbbbcdaefabbbbbbbefa + cdabbbbbbbb\P\R\B\Z +Partial match: cdabbbbbbbb + efabbbbbbbbbbbbbbbb\P\R\B\Z +Partial match: efabbbbbbbbbbbbbbbb + bbbbbbbbbbbbcdXyasdfadf\P\R\B\Z + 0: bbbbbbbbbbbbcdX + +/(a|b)/SF>testsavedregex +Compiled regex written to testsavedregex +Study data written to testsavedregex +>>aaabxyzpqrrrabbxyyyypqAzz + 0: aaabxyzpqrrrabbxyyyypqAzz + >aaaabxyzpqrrrabbxyyyypqAzz + 0: aaaabxyzpqrrrabbxyyyypqAzz + >>>>abcxyzpqrrrabbxyyyypqAzz + 0: abcxyzpqrrrabbxyyyypqAzz + *** Failers +No match + abxyzpqrrabbxyyyypqAzz +No match + abxyzpqrrrrabbxyyyypqAzz +No match + abxyzpqrrrabxyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyypqAzz +No match + aaabcxyzpqrrrabbxyyyypqqqqqqqAzz +No match + +/^(abc){1,2}zz/ + abczz + 0: abczz + abcabczz + 0: abcabczz + *** Failers +No match + zz +No match + abcabcabczz +No match + >>abczz +No match + +/^(b+?|a){1,2}?c/ + bc + 0: bc + bbc + 0: bbc + bbbc + 0: bbbc + bac + 0: bac + bbac + 0: bbac + aac + 0: aac + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + *** Failers +No match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}c/ + bc + 0: bc + bbc + 0: bbc + bbbc + 0: bbbc + bac + 0: bac + bbac + 0: bbac + aac + 0: aac + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + *** Failers +No match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}?bc/ + bbc + 0: bbc + +/^(b*|ba){1,2}?bc/ + babc + 0: babc + bbabc + 0: bbabc + bababc + 0: bababc + *** Failers +No match + bababbc +No match + babababc +No match + +/^(ba|b*){1,2}?bc/ + babc + 0: babc + bbabc + 0: bbabc + bababc + 0: bababc + *** Failers +No match + bababbc +No match + babababc +No match + +/^\ca\cA\c[\c{\c:/ + \x01\x01\e;z + 0: \x01\x01\x1b;z + +/^[ab\]cde]/ + athing + 0: a + bthing + 0: b + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e + *** Failers +No match + fthing +No match + [thing +No match + \\thing +No match + +/^[]cde]/ + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e + *** Failers +No match + athing +No match + fthing +No match + +/^[^ab\]cde]/ + fthing + 0: f + [thing + 0: [ + \\thing + 0: \ + *** Failers + 0: * + athing +No match + bthing +No match + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^[^]cde]/ + athing + 0: a + fthing + 0: f + *** Failers + 0: * + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^\/ + + 0: \x81 + +/^ÿ/ + ÿ + 0: \xff + +/^[0-9]+$/ + 0 + 0: 0 + 1 + 0: 1 + 2 + 0: 2 + 3 + 0: 3 + 4 + 0: 4 + 5 + 0: 5 + 6 + 0: 6 + 7 + 0: 7 + 8 + 0: 8 + 9 + 0: 9 + 10 + 0: 10 + 100 + 0: 100 + *** Failers +No match + abc +No match + +/^.*nter/ + enter + 0: enter + inter + 0: inter + uponter + 0: uponter + +/^xxx[0-9]+$/ + xxx0 + 0: xxx0 + xxx1234 + 0: xxx1234 + *** Failers +No match + xxx +No match + +/^.+[0-9][0-9][0-9]$/ + x123 + 0: x123 + xx123 + 0: xx123 + 123456 + 0: 123456 + *** Failers +No match + 123 +No match + x1234 + 0: x1234 + +/^.+?[0-9][0-9][0-9]$/ + x123 + 0: x123 + xx123 + 0: xx123 + 123456 + 0: 123456 + *** Failers +No match + 123 +No match + x1234 + 0: x1234 + +/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ + abc!pqr=apquxz.ixr.zzz.ac.uk + 0: abc!pqr=apquxz.ixr.zzz.ac.uk + *** Failers +No match + !pqr=apquxz.ixr.zzz.ac.uk +No match + abc!=apquxz.ixr.zzz.ac.uk +No match + abc!pqr=apquxz:ixr.zzz.ac.uk +No match + abc!pqr=apquxz.ixr.zzz.ac.ukk +No match + +/:/ + Well, we need a colon: somewhere + 0: : + *** Fail if we don't +No match + +/([\da-f:]+)$/i + 0abc + 0: 0abc + abc + 0: abc + fed + 0: fed + E + 0: E + :: + 0: :: + 5f03:12C0::932e + 0: 5f03:12C0::932e + fed def + 0: def + Any old stuff + 0: ff + *** Failers +No match + 0zzz +No match + gzzz +No match + fed\x20 +No match + Any old rubbish +No match + +/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ + .1.2.3 + 0: .1.2.3 + A.12.123.0 + 0: A.12.123.0 + *** Failers +No match + .1.2.3333 +No match + 1.2.3 +No match + 1234.2.3 +No match + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 0: 1 IN SOA non-sp1 non-sp2( + 1 IN SOA non-sp1 non-sp2 ( + 0: 1 IN SOA non-sp1 non-sp2 ( + *** Failers +No match + 1IN SOA non-sp1 non-sp2( +No match + +/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ + a. + 0: a. + Z. + 0: Z. + 2. + 0: 2. + ab-c.pq-r. + 0: ab-c.pq-r. + sxk.zzz.ac.uk. + 0: sxk.zzz.ac.uk. + x-.y-. + 0: x-.y-. + *** Failers +No match + -abc.peq. +No match + +/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ + *.a + 0: *.a + *.b0-a + 0: *.b0-a + *.c3-b.c + 0: *.c3-b.c + *.c-a.b-c + 0: *.c-a.b-c + *** Failers +No match + *.0 +No match + *.a- +No match + *.a-b.c- +No match + *.c-a.0-c +No match + +/^(?=ab(de))(abd)(e)/ + abde + 0: abde + +/^(?!(ab)de|x)(abd)(f)/ + abdf + 0: abdf + +/^(?=(ab(cd)))(ab)/ + abcd + 0: ab + +/^[\da-f](\.[\da-f])*$/i + a.b.c.d + 0: a.b.c.d + A.B.C.D + 0: A.B.C.D + a.b.c.1.2.3.C + 0: a.b.c.1.2.3.C + +/^\".*\"\s*(;.*)?$/ + \"1234\" + 0: "1234" + \"abcd\" ; + 0: "abcd" ; + \"\" ; rhubarb + 0: "" ; rhubarb + *** Failers +No match + \"1234\" : things +No match + +/^$/ + \ + 0: + *** Failers +No match + +/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x + ab c + 0: ab c + *** Failers +No match + abc +No match + ab cde +No match + +/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ + ab c + 0: ab c + *** Failers +No match + abc +No match + ab cde +No match + +/^ a\ b[c ]d $/x + a bcd + 0: a bcd + a b d + 0: a b d + *** Failers +No match + abcd +No match + ab d +No match + +/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + +/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + +/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ + a+ Z0+\x08\n\x1d\x12 + 0: a+ Z0+\x08\x0a\x1d\x12 + +/^[.^$|()*+?{,}]+/ + .^\$(*+)|{?,?} + 0: .^$(*+)|{?,?} + 1: .^$(*+)|{?,? + 2: .^$(*+)|{?, + 3: .^$(*+)|{? + 4: .^$(*+)|{ + 5: .^$(*+)| + 6: .^$(*+) + 7: .^$(*+ + 8: .^$(* + 9: .^$( +10: .^$ +11: .^ +12: . + +/^a*\w/ + z + 0: z + az + 0: az + 1: a + aaaz + 0: aaaz + 1: aaa + 2: aa + 3: a + a + 0: a + aa + 0: aa + 1: a + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + a+ + 0: a + aa+ + 0: aa + 1: a + +/^a*?\w/ + z + 0: z + az + 0: az + 1: a + aaaz + 0: aaaz + 1: aaa + 2: aa + 3: a + a + 0: a + aa + 0: aa + 1: a + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + a+ + 0: a + aa+ + 0: aa + 1: a + +/^a+\w/ + az + 0: az + aaaz + 0: aaaz + 1: aaa + 2: aa + aa + 0: aa + aaaa + 0: aaaa + 1: aaa + 2: aa + aa+ + 0: aa + +/^a+?\w/ + az + 0: az + aaaz + 0: aaaz + 1: aaa + 2: aa + aa + 0: aa + aaaa + 0: aaaa + 1: aaa + 2: aa + aa+ + 0: aa + +/^\d{8}\w{2,}/ + 1234567890 + 0: 1234567890 + 12345678ab + 0: 12345678ab + 12345678__ + 0: 12345678__ + *** Failers +No match + 1234567 +No match + +/^[aeiou\d]{4,5}$/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 12345 + aaaaa + 0: aaaaa + *** Failers +No match + 123456 +No match + +/^[aeiou\d]{4,5}?/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 12345 + 1: 1234 + aaaaa + 0: aaaaa + 1: aaaa + 123456 + 0: 12345 + 1: 1234 + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + +/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + From abcd Mon Sep 1 12:33:02 1997 + 0: From abcd Mon Sep 1 12:33 + *** Failers +No match + From abcd Sep 01 12:33:02 1997 +No match + +/^12.34/s + 12\n34 + 0: 12\x0a34 + 12\r34 + 0: 12\x0d34 + +/\w+(?=\t)/ + the quick brown\t fox + 0: brown + +/foo(?!bar)(.*)/ + foobar is foolish see? + 0: foolish see? + 1: foolish see + 2: foolish se + 3: foolish s + 4: foolish + 5: foolish + 6: foolis + 7: fooli + 8: fool + 9: foo + +/(?:(?!foo)...|^.{0,2})bar(.*)/ + foobar crowbar etc + 0: rowbar etc + 1: rowbar et + 2: rowbar e + 3: rowbar + 4: rowbar + barrel + 0: barrel + 1: barre + 2: barr + 3: bar + 2barrel + 0: 2barrel + 1: 2barre + 2: 2barr + 3: 2bar + A barrel + 0: A barrel + 1: A barre + 2: A barr + 3: A bar + +/^(\D*)(?=\d)(?!123)/ + abc456 + 0: abc + *** Failers +No match + abc123 +No match + +/^1234(?# test newlines + inside)/ + 1234 + 0: 1234 + +/^1234 #comment in extended re + /x + 1234 + 0: 1234 + +/#rhubarb + abcd/x + abcd + 0: abcd + +/^abcd#rhubarb/x + abcd + 0: abcd + +/(?!^)abc/ + the abc + 0: abc + *** Failers +No match + abc +No match + +/(?=^)abc/ + abc + 0: abc + *** Failers +No match + the abc +No match + +/^[ab]{1,3}(ab*|b)/ + aabbbbb + 0: aabbbbb + 1: aabbbb + 2: aabbb + 3: aabb + 4: aab + 5: aa + +/^[ab]{1,3}?(ab*|b)/ + aabbbbb + 0: aabbbbb + 1: aabbbb + 2: aabbb + 3: aabb + 4: aab + 5: aa + +/^[ab]{1,3}?(ab*?|b)/ + aabbbbb + 0: aabbbbb + 1: aabbbb + 2: aabbb + 3: aabb + 4: aab + 5: aa + +/^[ab]{1,3}(ab*?|b)/ + aabbbbb + 0: aabbbbb + 1: aabbbb + 2: aabbb + 3: aabb + 4: aab + 5: aa + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + 1: user@dom + user\@dom.ain + 0: user@dom.ain + 1: user@dom + \"A. Other\" (a comment) + 0: "A. Other" (a comment) + 1: "A. Other" + 2: "A. Other" + A. Other (a comment) + 0: Other (a comment) + 1: Other + 2: Other + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + 1: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re + A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +# leading word +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces +(?: +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +| +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +) # "special" comment or quoted string +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" +)* +< +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +) +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + 1: user@dom + user\@dom.ain + 0: user@dom.ain + 1: user@dom + \"A. Other\" (a comment) + 0: "A. Other" + A. Other (a comment) + 0: Other + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + 1: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re + A missing angle + a\rb + 0: a\x0db + *** Failers +No match + a\nb +No match + +/abc$/ + abc + 0: abc + abc\n + 0: abc + *** Failers +No match + abc\ndef +No match + +/(abc)\123/ + abc\x53 + 0: abcS + +/(abc)\223/ + abc\x93 + 0: abc\x93 + +/(abc)\323/ + abc\xd3 + 0: abc\xd3 + +/(abc)\100/ + abc\x40 + 0: abc@ + abc\100 + 0: abc@ + +/(abc)\1000/ + abc\x400 + 0: abc@0 + abc\x40\x30 + 0: abc@0 + abc\1000 + 0: abc@0 + abc\100\x30 + 0: abc@0 + abc\100\060 + 0: abc@0 + abc\100\60 + 0: abc@0 + +/abc\81/ + abc\081 + 0: abc\x0081 + abc\0\x38\x31 + 0: abc\x0081 + +/abc\91/ + abc\091 + 0: abc\x0091 + abc\0\x39\x31 + 0: abc\x0091 + +/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/ + abcdefghijk\12S + 0: abcdefghijk\x0aS + +/ab\idef/ + abidef + 0: abidef + +/a{0}bc/ + bc + 0: bc + +/(a|(bc)){0,0}?xyz/ + xyz + 0: xyz + +/abc[\10]de/ + abc\010de + 0: abc\x08de + +/abc[\1]de/ + abc\1de + 0: abc\x01de + +/(abc)[\1]de/ + abc\1de + 0: abc\x01de + +/(?s)a.b/ + a\nb + 0: a\x0ab + +/^([^a])([^\b])([^c]*)([^d]{3,4})/ + baNOTccccd + 0: baNOTcccc + 1: baNOTccc + 2: baNOTcc + 3: baNOTc + 4: baNOT + baNOTcccd + 0: baNOTccc + 1: baNOTcc + 2: baNOTc + 3: baNOT + baNOTccd + 0: baNOTcc + 1: baNOTc + 2: baNOT + bacccd + 0: baccc + *** Failers + 0: *** Failers + 1: *** Failer + 2: *** Faile + 3: *** Fail + 4: *** Fai + 5: *** Fa + 6: *** F + anything +No match + b\bc +No match + baccd +No match + +/[^a]/ + Abc + 0: A + +/[^a]/i + Abc + 0: b + +/[^a]+/ + AAAaAbc + 0: AAA + 1: AA + 2: A + +/[^a]+/i + AAAaAbc + 0: bc + 1: b + +/[^a]+/ + bbb\nccc + 0: bbb\x0accc + 1: bbb\x0acc + 2: bbb\x0ac + 3: bbb\x0a + 4: bbb + 5: bb + 6: b + +/[^k]$/ + abc + 0: c + *** Failers + 0: s + abk +No match + +/[^k]{2,3}$/ + abc + 0: abc + kbc + 0: bc + kabc + 0: abc + *** Failers + 0: ers + abk +No match + akb +No match + akk +No match + +/^\d{8,}\@.+[^k]$/ + 12345678\@a.b.c.d + 0: 12345678@a.b.c.d + 123456789\@x.y.z + 0: 123456789@x.y.z + *** Failers +No match + 12345678\@x.y.uk +No match + 1234567\@a.b.c.d +No match + +/[^a]/ + aaaabcd + 0: b + aaAabcd + 0: A + +/[^a]/i + aaaabcd + 0: b + aaAabcd + 0: b + +/[^az]/ + aaaabcd + 0: b + aaAabcd + 0: A + +/[^az]/i + aaaabcd + 0: b + aaAabcd + 0: b + +/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/ + \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377 + 0: \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff + +/P[^*]TAIRE[^*]{1,6}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/P[^*]TAIRE[^*]{1,}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/(\.\d\d[1-9]?)\d+/ + 1.230003938 + 0: .230003938 + 1: .23000393 + 2: .2300039 + 3: .230003 + 4: .23000 + 5: .2300 + 6: .230 + 1.875000282 + 0: .875000282 + 1: .87500028 + 2: .8750002 + 3: .875000 + 4: .87500 + 5: .8750 + 6: .875 + 1.235 + 0: .235 + +/(\.\d\d((?=0)|\d(?=\d)))/ + 1.230003938 + 0: .230 + 1: .23 + 1.875000282 + 0: .875 + *** Failers +No match + 1.235 +No match + +/a(?)b/ + ab + 0: ab + +/\b(foo)\s+(\w+)/i + Food is on the foo table + 0: foo table + 1: foo tabl + 2: foo tab + 3: foo ta + 4: foo t + +/foo(.*)bar/ + The food is under the bar in the barn. + 0: food is under the bar in the bar + 1: food is under the bar + +/foo(.*?)bar/ + The food is under the bar in the barn. + 0: food is under the bar in the bar + 1: food is under the bar + +/(.*)(\d*)/ + I have 2 numbers: 53147 +Matched, but too many subsidiary matches + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: I have 2 numbers: 531 + 3: I have 2 numbers: 53 + 4: I have 2 numbers: 5 + 5: I have 2 numbers: + 6: I have 2 numbers: + 7: I have 2 numbers + 8: I have 2 number + 9: I have 2 numbe +10: I have 2 numb +11: I have 2 num +12: I have 2 nu +13: I have 2 n +14: I have 2 +15: I have 2 +16: I have +17: I have +18: I hav +19: I ha +20: I h +21: I + +/(.*)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: I have 2 numbers: 531 + 3: I have 2 numbers: 53 + 4: I have 2 numbers: 5 + 5: I have 2 + +/(.*?)(\d*)/ + I have 2 numbers: 53147 +Matched, but too many subsidiary matches + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: I have 2 numbers: 531 + 3: I have 2 numbers: 53 + 4: I have 2 numbers: 5 + 5: I have 2 numbers: + 6: I have 2 numbers: + 7: I have 2 numbers + 8: I have 2 number + 9: I have 2 numbe +10: I have 2 numb +11: I have 2 num +12: I have 2 nu +13: I have 2 n +14: I have 2 +15: I have 2 +16: I have +17: I have +18: I hav +19: I ha +20: I h +21: I + +/(.*?)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: I have 2 numbers: 531 + 3: I have 2 numbers: 53 + 4: I have 2 numbers: 5 + 5: I have 2 + +/(.*)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + +/(.*?)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + +/(.*)\b(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + +/(.*\D)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + +/^\D*(?!123)/ + ABC123 + 0: AB + 1: A + 2: + +/^(\D*)(?=\d)(?!123)/ + ABC445 + 0: ABC + *** Failers +No match + ABC123 +No match + +/^[W-]46]/ + W46]789 + 0: W46] + -46]789 + 0: -46] + *** Failers +No match + Wall +No match + Zebra +No match + 42 +No match + [abcd] +No match + ]abcd[ +No match + +/^[W-\]46]/ + W46]789 + 0: W + Wall + 0: W + Zebra + 0: Z + Xylophone + 0: X + 42 + 0: 4 + [abcd] + 0: [ + ]abcd[ + 0: ] + \\backslash + 0: \ + *** Failers +No match + -46]789 +No match + well +No match + +/\d\d\/\d\d\/\d\d\d\d/ + 01/01/2000 + 0: 01/01/2000 + +/word (?:[a-zA-Z0-9]+ ){0,10}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?:[a-zA-Z0-9]+ ){0,300}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/^(a){0,0}/ + bcd + 0: + abc + 0: + aab + 0: + +/^(a){0,1}/ + bcd + 0: + abc + 0: a + 1: + aab + 0: a + 1: + +/^(a){0,2}/ + bcd + 0: + abc + 0: a + 1: + aab + 0: aa + 1: a + 2: + +/^(a){0,3}/ + bcd + 0: + abc + 0: a + 1: + aab + 0: aa + 1: a + 2: + aaa + 0: aaa + 1: aa + 2: a + 3: + +/^(a){0,}/ + bcd + 0: + abc + 0: a + 1: + aab + 0: aa + 1: a + 2: + aaa + 0: aaa + 1: aa + 2: a + 3: + aaaaaaaa + 0: aaaaaaaa + 1: aaaaaaa + 2: aaaaaa + 3: aaaaa + 4: aaaa + 5: aaa + 6: aa + 7: a + 8: + +/^(a){1,1}/ + bcd +No match + abc + 0: a + aab + 0: a + +/^(a){1,2}/ + bcd +No match + abc + 0: a + aab + 0: aa + 1: a + +/^(a){1,3}/ + bcd +No match + abc + 0: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: aa + 2: a + +/^(a){1,}/ + bcd +No match + abc + 0: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: aa + 2: a + aaaaaaaa + 0: aaaaaaaa + 1: aaaaaaa + 2: aaaaaa + 3: aaaaa + 4: aaaa + 5: aaa + 6: aa + 7: a + +/.*\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.{0,}\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/m + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*\.gif/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*$/ + borfle\nbib.gif\nno + 0: no + +/.*$/m + borfle\nbib.gif\nno + 0: borfle + +/.*$/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + +/.*$/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + 1: borfle\x0abib.gif + 2: borfle + +/.*$/ + borfle\nbib.gif\nno\n + 0: no + +/.*$/m + borfle\nbib.gif\nno\n + 0: borfle + +/.*$/s + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + 1: borfle\x0abib.gif\x0ano + +/.*$/ms + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + 1: borfle\x0abib.gif\x0ano + 2: borfle\x0abib.gif + 3: borfle + +/(.*X|^B)/ + abcde\n1234Xyz + 0: 1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/(.*X|^B)/m + abcde\n1234Xyz + 0: 1234X + BarFoo + 0: B + abcde\nBar + 0: B + +/(.*X|^B)/s + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/(.*X|^B)/ms + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + abcde\nBar + 0: B + +/(?s)(.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/(?s:.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/^.*B/ + **** Failers +No match + abc\nB +No match + +/(?s)^.*B/ + abc\nB + 0: abc\x0aB + +/(?m)^.*B/ + abc\nB + 0: B + +/(?ms)^.*B/ + abc\nB + 0: abc\x0aB + +/(?ms)^B/ + abc\nB + 0: B + +/(?s)B$/ + B\n + 0: B + +/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ + 123456654321 + 0: 123456654321 + +/^\d\d\d\d\d\d\d\d\d\d\d\d/ + 123456654321 + 0: 123456654321 + +/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ + 123456654321 + 0: 123456654321 + +/^[abc]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^[a-c]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^(a|b|c){12}/ + abcabcabcabc + 0: abcabcabcabc + +/^[abcdefghijklmnopqrstuvwxy0123456789]/ + n + 0: n + *** Failers +No match + z +No match + +/abcde{0,0}/ + abcd + 0: abcd + *** Failers +No match + abce +No match + +/ab[cd]{0,0}e/ + abe + 0: abe + *** Failers +No match + abcde +No match + +/ab(c){0,0}d/ + abd + 0: abd + *** Failers +No match + abcd +No match + +/a(b*)/ + a + 0: a + ab + 0: ab + 1: a + abbbb + 0: abbbb + 1: abbb + 2: abb + 3: ab + 4: a + *** Failers + 0: a + bbbbb +No match + +/ab\d{0}e/ + abe + 0: abe + *** Failers +No match + ab1e +No match + +/"([^\\"]+|\\.)*"/ + the \"quick\" brown fox + 0: "quick" + \"the \\\"quick\\\" brown fox\" + 0: "the \"quick\" brown fox" + +/.*?/g+ + abc + 0: abc + 0+ + 1: ab + 2: a + 3: + 0: + 0+ + +/\b/g+ + abc + 0: + 0+ abc + 0: + 0+ + +/\b/+g + abc + 0: + 0+ abc + 0: + 0+ + +//g + abc + 0: + 0: + 0: + 0: + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
    ([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is +

    + 0: + +/a[^a]b/ + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/ + acb + 0: acb + *** Failers +No match + a\nb +No match + +/a[^a]b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/^(b+?|a){1,2}?c/ + bac + 0: bac + bbac + 0: bbac + bbbac + 0: bbbac + bbbbac + 0: bbbbac + bbbbbac + 0: bbbbbac + +/^(b+|a){1,2}?c/ + bac + 0: bac + bbac + 0: bbac + bbbac + 0: bbbac + bbbbac + 0: bbbbac + bbbbbac + 0: bbbbbac + +/(?!\A)x/m + x\nb\n +No match + a\bx\n + 0: x + +/\x0{ab}/ + \0{ab} + 0: \x00{ab} + +/(A|B)*?CD/ + CD + 0: CD + +/(A|B)*CD/ + CD + 0: CD + +/(?.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ +No match + +"(?>.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + +/(?>(\.\d\d[1-9]?))\d+/ + 1.230003938 + 0: .230003938 + 1: .23000393 + 2: .2300039 + 3: .230003 + 4: .23000 + 5: .2300 + 6: .230 + 1.875000282 + 0: .875000282 + 1: .87500028 + 2: .8750002 + 3: .875000 + 4: .87500 + 5: .8750 + *** Failers +No match + 1.235 +No match + +/^((?>\w+)|(?>\s+))*$/ + now is the time for all good men to come to the aid of the party + 0: now is the time for all good men to come to the aid of the party + *** Failers +No match + this is not a line with only words and spaces! +No match + +/(\d+)(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: 1234 + 3: 123 + 4: 12 + 12345+ + 0: 12345 + 1: 1234 + 2: 123 + 3: 12 + +/((?>\d+))(\w)/ + 12345a + 0: 12345a + *** Failers +No match + 12345+ +No match + +/(?>a+)b/ + aaab + 0: aaab + +/((?>a+)b)/ + aaab + 0: aaab + +/(?>(a+))b/ + aaab + 0: aaab + +/(?>b)+/ + aaabbbccc + 0: bbb + 1: bb + 2: b + +/(?>a+|b+|c+)*c/ + aaabbbbccccd + 0: aaabbbbcccc + 1: aaabbbbc + +/(a+|b+|c+)*c/ + aaabbbbccccd + 0: aaabbbbcccc + 1: aaabbbbccc + 2: aaabbbbcc + 3: aaabbbbc + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: abc(ade)ufh()() + 2: abc(ade)ufh() + 3: abc(ade)ufh + 4: abc(ade) + 5: abc + +/\(((?>[^()]+)|\([^()]+\))+\)/ + (abc) + 0: (abc) + (abc(def)xyz) + 0: (abc(def)xyz) + *** Failers +No match + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/a(?-i)b/i + ab + 0: ab + Ab + 0: Ab + *** Failers +No match + aB +No match + AB +No match + +/(a (?x)b c)d e/ + a bcd e + 0: a bcd e + *** Failers +No match + a b cd e +No match + abcd e +No match + a bcde +No match + +/(a b(?x)c d (?-x)e f)/ + a bcde f + 0: a bcde f + *** Failers +No match + abcdef +No match + +/(a(?i)b)c/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + abC +No match + aBC +No match + Abc +No match + ABc +No match + ABC +No match + AbC +No match + +/a(?i:b)c/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + ABC +No match + abC +No match + aBC +No match + +/a(?i:b)*c/ + aBc + 0: aBc + aBBc + 0: aBBc + *** Failers +No match + aBC +No match + aBBC +No match + +/a(?=b(?i)c)\w\wd/ + abcd + 0: abcd + abCd + 0: abCd + *** Failers +No match + aBCd +No match + abcD +No match + +/(?s-i:more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million + *** Failers +No match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?:(?s-i)more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million + *** Failers +No match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?>a(?i)b+)+c/ + abc + 0: abc + aBbc + 0: aBbc + aBBc + 0: aBBc + *** Failers +No match + Abc +No match + abAb +No match + abbC +No match + +/(?=a(?i)b)\w\wc/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + Ab +No match + abC +No match + aBC +No match + +/(?<=a(?i)b)(\w\w)c/ + abxxc + 0: xxc + aBxxc + 0: xxc + *** Failers +No match + Abxxc +No match + ABxxc +No match + abxxC +No match + +/^(?(?=abc)\w{3}:|\d\d)$/ + abc: + 0: abc: + 12 + 0: 12 + *** Failers +No match + 123 +No match + xyz +No match + +/^(?(?!abc)\d\d|\w{3}:)$/ + abc: + 0: abc: + 12 + 0: 12 + *** Failers +No match + 123 +No match + xyz +No match + +/(?(?<=foo)bar|cat)/ + foobar + 0: bar + cat + 0: cat + fcat + 0: cat + focat + 0: cat + *** Failers +No match + foocat +No match + +/(?(?a*)*/ + a + 0: a + 1: + aa + 0: aa + 1: + aaaa + 0: aaaa + 1: + +/(abc|)+/ + abc + 0: abc + 1: + abcabc + 0: abcabc + 1: abc + 2: + abcabcabc + 0: abcabcabc + 1: abcabc + 2: abc + 3: + xyz + 0: + +/([a]*)*/ + a + 0: a + 1: + aaaaa + 0: aaaaa + 1: aaaa + 2: aaa + 3: aa + 4: a + 5: + +/([ab]*)*/ + a + 0: a + 1: + b + 0: b + 1: + ababab + 0: ababab + 1: ababa + 2: abab + 3: aba + 4: ab + 5: a + 6: + aaaabcde + 0: aaaab + 1: aaaa + 2: aaa + 3: aa + 4: a + 5: + bbbb + 0: bbbb + 1: bbb + 2: bb + 3: b + 4: + +/([^a]*)*/ + b + 0: b + 1: + bbbb + 0: bbbb + 1: bbb + 2: bb + 3: b + 4: + aaa + 0: + +/([^ab]*)*/ + cccc + 0: cccc + 1: ccc + 2: cc + 3: c + 4: + abab + 0: + +/([a]*?)*/ + a + 0: a + 1: + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + 4: + +/([ab]*?)*/ + a + 0: a + 1: + b + 0: b + 1: + abab + 0: abab + 1: aba + 2: ab + 3: a + 4: + baba + 0: baba + 1: bab + 2: ba + 3: b + 4: + +/([^a]*?)*/ + b + 0: b + 1: + bbbb + 0: bbbb + 1: bbb + 2: bb + 3: b + 4: + aaa + 0: + +/([^ab]*?)*/ + c + 0: c + 1: + cccc + 0: cccc + 1: ccc + 2: cc + 3: c + 4: + baba + 0: + +/(?>a*)*/ + a + 0: a + 1: + aaabcde + 0: aaa + 1: + +/((?>a*))*/ + aaaaa + 0: aaaaa + 1: + aabbaa + 0: aa + 1: + +/((?>a*?))*/ + aaaaa + 0: aaaaa + 1: + aabbaa + 0: aa + 1: + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x + 12-sep-98 + 0: 12-sep-98 + 12-09-98 + 0: 12-09-98 + *** Failers +No match + sep-12-98 +No match + +/(?i:saturday|sunday)/ + saturday + 0: saturday + sunday + 0: sunday + Saturday + 0: Saturday + Sunday + 0: Sunday + SATURDAY + 0: SATURDAY + SUNDAY + 0: SUNDAY + SunDay + 0: SunDay + +/(a(?i)bc|BB)x/ + abcx + 0: abcx + aBCx + 0: aBCx + bbx + 0: bbx + BBx + 0: BBx + *** Failers +No match + abcX +No match + aBCX +No match + bbX +No match + BBX +No match + +/^([ab](?i)[cd]|[ef])/ + ac + 0: ac + aC + 0: aC + bD + 0: bD + elephant + 0: e + Europe + 0: E + frog + 0: f + France + 0: F + *** Failers +No match + Africa +No match + +/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ + ab + 0: ab + aBd + 0: aBd + xy + 0: xy + xY + 0: xY + zebra + 0: z + Zambesi + 0: Z + *** Failers +No match + aCD +No match + XY +No match + +/(?<=foo\n)^bar/m + foo\nbar + 0: bar + *** Failers +No match + bar +No match + baz\nbar +No match + +/(?<=(?]&/ + <&OUT + 0: <& + +/(?:(f)(o)(o)|(b)(a)(r))*/ + foobar + 0: foobar + 1: foo + 2: + +/(?<=a)b/ + ab + 0: b + *** Failers +No match + cb +No match + b +No match + +/(?a+)ab/ + +/(?>a+)b/ + aaab + 0: aaab + +/([[:]+)/ + a:[b]: + 0: :[ + 1: : + +/([[=]+)/ + a=[b]= + 0: =[ + 1: = + +/([[.]+)/ + a.[b]. + 0: .[ + 1: . + +/((?>a+)b)/ + aaab + 0: aaab + +/(?>(a+))b/ + aaab + 0: aaab + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: abc(ade)ufh()() + 2: abc(ade)ufh() + 3: abc(ade)ufh + 4: abc(ade) + 5: abc + +/a\Z/ + *** Failers +No match + aaab +No match + a\nb\n +No match + +/b\Z/ + a\nb\n + 0: b + +/b\z/ + +/b\Z/ + a\nb + 0: b + +/b\z/ + a\nb + 0: b + *** Failers +No match + +/(?>.*)(?<=(abcd|wxyz))/ + alphabetabcd + 0: alphabetabcd + endingwxyz + 0: endingwxyz + *** Failers +No match + a rather long string that doesn't end with one of them +No match + +/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?>[a-zA-Z0-9]+ ){0,30}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/(?<=\d{3}(?!999))foo/ + 999foo + 0: foo + 123999foo + 0: foo + *** Failers +No match + 123abcfoo +No match + +/(?<=(?!...999)\d{3})foo/ + 999foo + 0: foo + 123999foo + 0: foo + *** Failers +No match + 123abcfoo +No match + +/(?<=\d{3}(?!999)...)foo/ + 123abcfoo + 0: foo + 123456foo + 0: foo + *** Failers +No match + 123999foo +No match + +/(?<=\d{3}...)(?Z)+|A)*/ + ZABCDEFG + 0: ZA + 1: Z + 2: + +/((?>)+|A)*/ + ZABCDEFG + 0: + +/a*/g + abbab + 0: a + 1: + 0: + 0: + 0: a + 1: + 0: + 0: + +/^[a-\d]/ + abcde + 0: a + -things + 0: - + 0digit + 0: 0 + *** Failers +No match + bcdef +No match + +/^[\d-a]/ + abcde + 0: a + -things + 0: - + 0digit + 0: 0 + *** Failers +No match + bcdef +No match + +/[[:space:]]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d\x0b + 1: \x09\x0a\x0c\x0d + 2: \x09\x0a\x0c + 3: \x09\x0a + 4: \x09 + 5: + +/[[:blank:]]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09 + 1: + +/[\s]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d + 1: \x09\x0a\x0c + 2: \x09\x0a + 3: \x09 + 4: + +/\s+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d + 1: \x09\x0a\x0c + 2: \x09\x0a + 3: \x09 + 4: + +/a b/x + ab +No match + +/(?!\A)x/m + a\nxb\n + 0: x + +/(?!^)x/m + a\nxb\n +No match + +/abc\Qabc\Eabc/ + abcabcabc + 0: abcabcabc + +/abc\Q(*+|\Eabc/ + abc(*+|abc + 0: abc(*+|abc + +/ abc\Q abc\Eabc/x + abc abcabc + 0: abc abcabc + *** Failers +No match + abcabcabc +No match + +/abc#comment + \Q#not comment + literal\E/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal\E #more comment + /x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal\E #more comment/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/\Qabc\$xyz\E/ + abc\\\$xyz + 0: abc\$xyz + +/\Qabc\E\$\Qxyz\E/ + abc\$xyz + 0: abc$xyz + +/\Gabc/ + abc + 0: abc + *** Failers +No match + xyzabc +No match + +/\Gabc./g + abc1abc2xyzabc3 + 0: abc1 + 0: abc2 + +/abc./g + abc1abc2xyzabc3 + 0: abc1 + 0: abc2 + 0: abc3 + +/a(?x: b c )d/ + XabcdY + 0: abcd + *** Failers +No match + Xa b c d Y +No match + +/((?x)x y z | a b c)/ + XabcY + 0: abc + AxyzB + 0: xyz + +/(?i)AB(?-i)C/ + XabCY + 0: abC + *** Failers +No match + XabcY +No match + +/((?i)AB(?-i)C|D)E/ + abCE + 0: abCE + DE + 0: DE + *** Failers +No match + abcE +No match + abCe +No match + dE +No match + De +No match + +/[z\Qa-d]\E]/ + z + 0: z + a + 0: a + - + 0: - + d + 0: d + ] + 0: ] + *** Failers + 0: a + b +No match + +/[\z\C]/ + z + 0: z + C + 0: C + +/\M/ + M + 0: M + +/(a+)*b/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/(?i)reg(?:ul(?:[aä]|ae)r|ex)/ + REGular + 0: REGular + regulaer + 0: regulaer + Regex + 0: Regex + regulär + 0: regul\xe4r + +/Åæåä[à-ÿÀ-ß]+/ + Åæåäà + 0: \xc5\xe6\xe5\xe4\xe0 + Åæåäÿ + 0: \xc5\xe6\xe5\xe4\xff + ÅæåäÀ + 0: \xc5\xe6\xe5\xe4\xc0 + Åæåäß + 0: \xc5\xe6\xe5\xe4\xdf + +/(?<=Z)X./ + \x84XAZXB + 0: XB + +/^(?(2)a|(1)(2))+$/ + 123a +Error -17 + +/(?<=a|bbbb)c/ + ac + 0: c + bbbbc + 0: c + +/abc/>testsavedregex +Compiled regex written to testsavedregex +testsavedregex +Compiled regex written to testsavedregex +testsavedregex +Compiled regex written to testsavedregex +Study data written to testsavedregex +testsavedregex +Compiled regex written to testsavedregex +Study data written to testsavedregex + + 0: abc + xyz\r\nabc\ + 0: abc + xyz\rabc\ + 0: abc + xyz\r\nabc\ + 0: abc + ** Failers +No match + xyz\nabc\ +No match + xyz\r\nabc\ +No match + xyz\nabc\ +No match + xyz\rabc\ +No match + xyz\rabc\ +No match + +/abc$/m + xyzabc + 0: abc + xyzabc\n + 0: abc + xyzabc\npqr + 0: abc + xyzabc\r\ + 0: abc + xyzabc\rpqr\ + 0: abc + xyzabc\r\n\ + 0: abc + xyzabc\r\npqr\ + 0: abc + ** Failers +No match + xyzabc\r +No match + xyzabc\rpqr +No match + xyzabc\r\n +No match + xyzabc\r\npqr +No match + +/^abc/m + xyz\rabcdef + 0: abc + xyz\nabcdef\ + 0: abc + ** Failers +No match + xyz\nabcdef +No match + +/^abc/m + xyz\nabcdef + 0: abc + xyz\rabcdef\ + 0: abc + ** Failers +No match + xyz\rabcdef +No match + +/^abc/m + xyz\r\nabcdef + 0: abc + xyz\rabcdef\ + 0: abc + ** Failers +No match + xyz\rabcdef +No match + +/.*/ + abc\ndef + 0: abc + 1: ab + 2: a + 3: + abc\rdef + 0: abc\x0ddef + 1: abc\x0dde + 2: abc\x0dd + 3: abc\x0d + 4: abc + 5: ab + 6: a + 7: + abc\r\ndef + 0: abc\x0d + 1: abc + 2: ab + 3: a + 4: + \abc\ndef + 0: abc\x0adef + 1: abc\x0ade + 2: abc\x0ad + 3: abc\x0a + 4: abc + 5: ab + 6: a + 7: + \abc\rdef + 0: abc + 1: ab + 2: a + 3: + \abc\r\ndef + 0: abc + 1: ab + 2: a + 3: + \abc\ndef + 0: abc\x0adef + 1: abc\x0ade + 2: abc\x0ad + 3: abc\x0a + 4: abc + 5: ab + 6: a + 7: + \abc\rdef + 0: abc\x0ddef + 1: abc\x0dde + 2: abc\x0dd + 3: abc\x0d + 4: abc + 5: ab + 6: a + 7: + \abc\r\ndef + 0: abc + 1: ab + 2: a + 3: + +/\w+(.)(.)?def/s + abc\ndef + 0: abc\x0adef + abc\rdef + 0: abc\x0ddef + abc\r\ndef + 0: abc\x0d\x0adef + +/^\w+=.*(\\\n.*)*/ + abc=xyz\\\npqr + 0: abc=xyz\\x0apqr + 1: abc=xyz\\x0apq + 2: abc=xyz\\x0ap + 3: abc=xyz\\x0a + 4: abc=xyz\ + 5: abc=xyz + 6: abc=xy + 7: abc=x + 8: abc= + +/^(a()*)*/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + 4: + +/^(?:a(?:(?:))*)*/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + 4: + +/^(a()+)+/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + +/^(?:a(?:(?:))+)+/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + +/(a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/(?>a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/(?:a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/^a.b/ + a\rb + 0: a\x0db + a\nb\ + 0: a\x0ab + ** Failers +No match + a\nb +No match + a\nb\ +No match + a\rb\ +No match + a\rb\ +No match + +/^abc./mgx + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 \x{2028}abc8 \x{2029}abc9 JUNK + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + +/abc.$/mgx + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc7\x{2028} abc8\x{2029} abc9 + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc9 + +/^a\Rb/ + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + ** Failers +No match + a\n\rb +No match + +/^a\R*b/ + ab + 0: ab + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + a\n\rb + 0: a\x0a\x0db + a\n\r\x85\x0cb + 0: a\x0a\x0d\x85\x0cb + +/^a\R+b/ + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + a\n\rb + 0: a\x0a\x0db + a\n\r\x85\x0cb + 0: a\x0a\x0d\x85\x0cb + ** Failers +No match + ab +No match + +/^a\R{1,3}b/ + a\nb + 0: a\x0ab + a\n\rb + 0: a\x0a\x0db + a\n\r\x85b + 0: a\x0a\x0d\x85b + a\r\n\r\nb + 0: a\x0d\x0a\x0d\x0ab + a\r\n\r\n\r\nb + 0: a\x0d\x0a\x0d\x0a\x0d\x0ab + a\n\r\n\rb + 0: a\x0a\x0d\x0a\x0db + a\n\n\r\nb + 0: a\x0a\x0a\x0d\x0ab + ** Failers +No match + a\n\n\n\rb +No match + a\r +No match + +/^a[\R]b/ + aRb + 0: aRb + ** Failers +No match + a\nb +No match + +/.+foo/ + afoo + 0: afoo + ** Failers +No match + \r\nfoo +No match + \nfoo +No match + +/.+foo/ + afoo + 0: afoo + \nfoo + 0: \x0afoo + ** Failers +No match + \r\nfoo +No match + +/.+foo/ + afoo + 0: afoo + ** Failers +No match + \nfoo +No match + \r\nfoo +No match + +/.+foo/s + afoo + 0: afoo + \r\nfoo + 0: \x0d\x0afoo + \nfoo + 0: \x0afoo + +/^$/mg + abc\r\rxyz + 0: + abc\n\rxyz + 0: + ** Failers +No match + abc\r\nxyz +No match + +/^X/m + XABC + 0: X + ** Failers +No match + XABC\B +No match + +/(?m)^$/g+ + abc\r\n\r\n + 0: + 0+ \x0d\x0a + +/(?m)^$|^\r\n/g+ + abc\r\n\r\n + 0: \x0d\x0a + 0+ + 1: + +/(?m)$/g+ + abc\r\n\r\n + 0: + 0+ \x0d\x0a\x0d\x0a + 0: + 0+ \x0d\x0a + 0: + 0+ + +/(?|(abc)|(xyz))/ + >abc< + 0: abc + >xyz< + 0: xyz + +/(x)(?|(abc)|(xyz))(x)/ + xabcx + 0: xabcx + xxyzx + 0: xxyzx + +/(x)(?|(abc)(pqr)|(xyz))(x)/ + xabcpqrx + 0: xabcpqrx + xxyzx + 0: xxyzx + +/(?|(abc)|(xyz))(?1)/ + abcabc + 0: abcabc + xyzabc + 0: xyzabc + ** Failers +No match + xyzxyz +No match + +/\H\h\V\v/ + X X\x0a + 0: X X\x0a + X\x09X\x0b + 0: X\x09X\x0b + ** Failers +No match + \xa0 X\x0a +No match + +/\H*\h+\V?\v{3,4}/ + \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a + 0: \x09 \xa0X\x0a\x0b\x0c\x0d + 1: \x09 \xa0X\x0a\x0b\x0c + \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a + 0: \x09 \xa0\x0a\x0b\x0c\x0d + 1: \x09 \xa0\x0a\x0b\x0c + \x09\x20\xa0\x0a\x0b\x0c + 0: \x09 \xa0\x0a\x0b\x0c + ** Failers +No match + \x09\x20\xa0\x0a\x0b +No match + +/\H{3,4}/ + XY ABCDE + 0: ABCD + 1: ABC + XY PQR ST + 0: PQR + +/.\h{3,4}./ + XY AB PQRS + 0: B P + 1: B + +/\h*X\h?\H+Y\H?Z/ + >XNNNYZ + 0: XNNNYZ + > X NYQZ + 0: X NYQZ + ** Failers +No match + >XYZ +No match + > X NY Z +No match + +/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/ + >XY\x0aZ\x0aA\x0bNN\x0c + 0: XY\x0aZ\x0aA\x0bNN\x0c + >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c + 0: \x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c + +/.+A/ + \r\nA +No match + +/\nA/ + \r\nA + 0: \x0aA + +/[\r\n]A/ + \r\nA + 0: \x0aA + +/(\r|\n)A/ + \r\nA + 0: \x0aA + +/a\Rb/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + ** Failers +No match + a\x85b +No match + a\x0bb +No match + +/a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + a\x85b + 0: a\x85b + a\x0bb + 0: a\x0bb + ** Failers +No match + a\x85b\ +No match + a\x0bb\ +No match + +/a\R?b/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + ** Failers +No match + a\x85b +No match + a\x0bb +No match + +/a\R?b/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + a\x85b + 0: a\x85b + a\x0bb + 0: a\x0bb + ** Failers +No match + a\x85b\ +No match + a\x0bb\ +No match + +/a\R{2,4}b/I +Capturing subpattern count = 0 +Partial matching not supported +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\r\n\nb + 0: a\x0d\x0a\x0ab + a\n\r\rb + 0: a\x0a\x0d\x0db + a\r\n\r\n\r\n\r\nb + 0: a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0ab + ** Failers +No match + a\x85\85b +No match + a\x0b\0bb +No match + +/a\R{2,4}b/I +Capturing subpattern count = 0 +Partial matching not supported +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\r\rb + 0: a\x0d\x0db + a\n\n\nb + 0: a\x0a\x0a\x0ab + a\r\n\n\r\rb + 0: a\x0d\x0a\x0a\x0d\x0db + a\x85\85b +No match + a\x0b\0bb +No match + ** Failers +No match + a\r\r\r\r\rb +No match + a\x85\85b\ +No match + a\x0b\0bb\ +No match + +/ End of testinput7 / diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput8 erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput8 --- erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput8 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput8 2009-03-12 12:21:54.000000000 +0000 @@ -0,0 +1,1287 @@ +/-- Do not use the \x{} construct except with patterns that have the --/ +/-- /8 option set, because PCRE doesn't recognize them as UTF-8 unless --/ +No match +/-- that option is set. However, the latest Perls recognize them always. --/ +No match + +/\x{100}ab/8 + \x{100}ab + 0: \x{100}ab + +/a\x{100}*b/8 + ab + 0: ab + a\x{100}b + 0: a\x{100}b + a\x{100}\x{100}b + 0: a\x{100}\x{100}b + +/a\x{100}+b/8 + a\x{100}b + 0: a\x{100}b + a\x{100}\x{100}b + 0: a\x{100}\x{100}b + *** Failers +No match + ab +No match + +/\bX/8 + Xoanon + 0: X + +Xoanon + 0: X + \x{300}Xoanon + 0: X + *** Failers +No match + YXoanon +No match + +/\BX/8 + YXoanon + 0: X + *** Failers +No match + Xoanon +No match + +Xoanon +No match + \x{300}Xoanon +No match + +/X\b/8 + X+oanon + 0: X + ZX\x{300}oanon + 0: X + FAX + 0: X + *** Failers +No match + Xoanon +No match + +/X\B/8 + Xoanon + 0: X + *** Failers +No match + X+oanon +No match + ZX\x{300}oanon +No match + FAX +No match + +/[^a]/8 + abcd + 0: b + a\x{100} + 0: \x{100} + +/^[abc\x{123}\x{400}-\x{402}]{2,3}\d/8 + ab99 + 0: ab9 + \x{123}\x{123}45 + 0: \x{123}\x{123}4 + \x{400}\x{401}\x{402}6 + 0: \x{400}\x{401}\x{402}6 + *** Failers +No match + d99 +No match + \x{123}\x{122}4 +No match + \x{400}\x{403}6 +No match + \x{400}\x{401}\x{402}\x{402}6 +No match + +/abc/8 + Ã] +Error -10 + à +Error -10 + ÃÃà +Error -10 + ÃÃÃ\? +No match + +/a.b/8 + acb + 0: acb + a\x7fb + 0: a\x{7f}b + a\x{100}b + 0: a\x{100}b + *** Failers +No match + a\nb +No match + +/a(.{3})b/8 + a\x{4000}xyb + 0: a\x{4000}xyb + a\x{4000}\x7fyb + 0: a\x{4000}\x{7f}yb + a\x{4000}\x{100}yb + 0: a\x{4000}\x{100}yb + *** Failers +No match + a\x{4000}b +No match + ac\ncb +No match + +/a(.*?)(.)/ + a\xc0\x88b + 0: a\xc0\x88b + 1: a\xc0\x88 + 2: a\xc0 + +/a(.*?)(.)/8 + a\x{100}b + 0: a\x{100}b + 1: a\x{100} + +/a(.*)(.)/ + a\xc0\x88b + 0: a\xc0\x88b + 1: a\xc0\x88 + 2: a\xc0 + +/a(.*)(.)/8 + a\x{100}b + 0: a\x{100}b + 1: a\x{100} + +/a(.)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + +/a(.)(.)/8 + a\x{240}bcd + 0: a\x{240}b + +/a(.?)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + 1: a\xc0 + +/a(.?)(.)/8 + a\x{240}bcd + 0: a\x{240}b + 1: a\x{240} + +/a(.??)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + 1: a\xc0 + +/a(.??)(.)/8 + a\x{240}bcd + 0: a\x{240}b + 1: a\x{240} + +/a(.{3})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + *** Failers +No match + a\x{1234}b +No match + ac\ncb +No match + +/a(.{3,})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + 0: axxxxbcdefghijb + 1: axxxxb + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + *** Failers +No match + a\x{1234}b +No match + +/a(.{3,}?)b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + 0: axxxxbcdefghijb + 1: axxxxb + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + *** Failers +No match + a\x{1234}b +No match + +/a(.{3,5})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + 0: axxxxb + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + axbxxbcdefghijb + 0: axbxxb + axxxxxbcdefghijb + 0: axxxxxb + *** Failers +No match + a\x{1234}b +No match + axxxxxxbcdefghijb +No match + +/a(.{3,5}?)b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + 0: axxxxb + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + axbxxbcdefghijb + 0: axbxxb + axxxxxbcdefghijb + 0: axxxxxb + *** Failers +No match + a\x{1234}b +No match + axxxxxxbcdefghijb +No match + +/^[a\x{c0}]/8 + *** Failers +No match + \x{100} +No match + +/(?<=aXb)cd/8 + aXbcd + 0: cd + +/(?<=a\x{100}b)cd/8 + a\x{100}bcd + 0: cd + +/(?<=a\x{100000}b)cd/8 + a\x{100000}bcd + 0: cd + +/(?:\x{100}){3}b/8 + \x{100}\x{100}\x{100}b + 0: \x{100}\x{100}\x{100}b + *** Failers +No match + \x{100}\x{100}b +No match + +/\x{ab}/8 + \x{ab} + 0: \x{ab} + \xc2\xab + 0: \x{ab} + *** Failers +No match + \x00{ab} +No match + +/(?<=(.))X/8 + WXYZ + 0: X + \x{256}XYZ + 0: X + *** Failers +No match + XYZ +No match + +/[^a]+/8g + bcd + 0: bcd + 1: bc + 2: b + \x{100}aY\x{256}Z + 0: \x{100} + 0: Y\x{256}Z + 1: Y\x{256} + 2: Y + +/^[^a]{2}/8 + \x{100}bc + 0: \x{100}b + +/^[^a]{2,}/8 + \x{100}bcAa + 0: \x{100}bcA + 1: \x{100}bc + 2: \x{100}b + +/^[^a]{2,}?/8 + \x{100}bca + 0: \x{100}bc + 1: \x{100}b + +/[^a]+/8ig + bcd + 0: bcd + 1: bc + 2: b + \x{100}aY\x{256}Z + 0: \x{100} + 0: Y\x{256}Z + 1: Y\x{256} + 2: Y + +/^[^a]{2}/8i + \x{100}bc + 0: \x{100}b + +/^[^a]{2,}/8i + \x{100}bcAa + 0: \x{100}bc + 1: \x{100}b + +/^[^a]{2,}?/8i + \x{100}bca + 0: \x{100}bc + 1: \x{100}b + +/\x{100}{0,0}/8 + abcd + 0: + +/\x{100}?/8 + abcd + 0: + \x{100}\x{100} + 0: \x{100} + 1: + +/\x{100}{0,3}/8 + \x{100}\x{100} + 0: \x{100}\x{100} + 1: \x{100} + 2: + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100} + 1: \x{100}\x{100} + 2: \x{100} + 3: + +/\x{100}*/8 + abce + 0: + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + 1: \x{100}\x{100}\x{100} + 2: \x{100}\x{100} + 3: \x{100} + 4: + +/\x{100}{1,1}/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100} + +/\x{100}{1,3}/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100} + 1: \x{100}\x{100} + 2: \x{100} + +/\x{100}+/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + 1: \x{100}\x{100}\x{100} + 2: \x{100}\x{100} + 3: \x{100} + +/\x{100}{3}/8 + abcd\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100} + +/\x{100}{3,5}/8 + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100}\x{100}\x{100} + 1: \x{100}\x{100}\x{100}\x{100} + 2: \x{100}\x{100}\x{100} + +/\x{100}{3,}/8 + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 1: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 2: \x{100}\x{100}\x{100}\x{100}\x{100} + 3: \x{100}\x{100}\x{100}\x{100} + 4: \x{100}\x{100}\x{100} + +/(?<=a\x{100}{2}b)X/8 + Xyyya\x{100}\x{100}bXzzz + 0: X + +/\D*/8 + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +Matched, but too many subsidiary matches + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/\D*/8 + \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +Matched, but too many subsidiary matches + 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 1: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 2: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 3: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 4: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 5: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 6: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 7: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 8: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 9: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +10: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +11: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +12: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +13: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +14: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +15: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +16: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +17: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +18: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +19: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +20: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +21: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + +/\D/8 + 1X2 + 0: X + 1\x{100}2 + 0: \x{100} + +/>\S/8 + > >X Y + 0: >X + > >\x{100} Y + 0: >\x{100} + +/\d/8 + \x{100}3 + 0: 3 + +/\s/8 + \x{100} X + 0: + +/\D+/8 + 12abcd34 + 0: abcd + 1: abc + 2: ab + 3: a + *** Failers + 0: *** Failers + 1: *** Failer + 2: *** Faile + 3: *** Fail + 4: *** Fai + 5: *** Fa + 6: *** F + 7: *** + 8: *** + 9: ** +10: * + 1234 +No match + +/\D{2,3}/8 + 12abcd34 + 0: abc + 1: ab + 12ab34 + 0: ab + *** Failers + 0: *** + 1: ** + 1234 +No match + 12a34 +No match + +/\D{2,3}?/8 + 12abcd34 + 0: abc + 1: ab + 12ab34 + 0: ab + *** Failers + 0: *** + 1: ** + 1234 +No match + 12a34 +No match + +/\d+/8 + 12abcd34 + 0: 12 + 1: 1 + *** Failers +No match + +/\d{2,3}/8 + 12abcd34 + 0: 12 + 1234abcd + 0: 123 + 1: 12 + *** Failers +No match + 1.4 +No match + +/\d{2,3}?/8 + 12abcd34 + 0: 12 + 1234abcd + 0: 123 + 1: 12 + *** Failers +No match + 1.4 +No match + +/\S+/8 + 12abcd34 + 0: 12abcd34 + 1: 12abcd3 + 2: 12abcd + 3: 12abc + 4: 12ab + 5: 12a + 6: 12 + 7: 1 + *** Failers + 0: *** + 1: ** + 2: * + \ \ +No match + +/\S{2,3}/8 + 12abcd34 + 0: 12a + 1: 12 + 1234abcd + 0: 123 + 1: 12 + *** Failers + 0: *** + 1: ** + \ \ +No match + +/\S{2,3}?/8 + 12abcd34 + 0: 12a + 1: 12 + 1234abcd + 0: 123 + 1: 12 + *** Failers + 0: *** + 1: ** + \ \ +No match + +/>\s+ <34 + 0: > < + *** Failers +No match + +/>\s{2,3} < + ab> < + *** Failers +No match + ab> \s{2,3}? < + ab> < + *** Failers +No match + ab> \xff< + 0: \xff + +/[\xff]/8 + >\x{ff}< + 0: \x{ff} + +/[^\xFF]/ + XYZ + 0: X + +/[^\xff]/8 + XYZ + 0: X + \x{123} + 0: \x{123} + +/^[ac]*b/8 + xb +No match + +/^[ac\x{100}]*b/8 + xb +No match + +/^[^x]*b/8i + xb +No match + +/^[^x]*b/8 + xb +No match + +/^\d*b/8 + xb +No match + +/(|a)/g8 + catac + 0: + 0: a + 1: + 0: + 0: a + 1: + 0: + 0: + a\x{256}a + 0: a + 1: + 0: + 0: a + 1: + 0: + +/^\x{85}$/8i + \x{85} + 0: \x{85} + +/^abc./mgx8 + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x{0085}abc7 \x{2028}abc8 \x{2029}abc9 JUNK + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + 0: abc8 + 0: abc9 + +/abc.$/mgx8 + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x{0085} abc7\x{2028} abc8\x{2029} abc9 + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + 0: abc8 + 0: abc9 + +/^a\Rb/8 + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0cb + 0: a\x{0c}b + a\x{85}b + 0: a\x{85}b + a\x{2028}b + 0: a\x{2028}b + a\x{2029}b + 0: a\x{2029}b + ** Failers +No match + a\n\rb +No match + +/^a\R*b/8 + ab + 0: ab + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0c\x{2028}\x{2029}b + 0: a\x{0c}\x{2028}\x{2029}b + a\x{85}b + 0: a\x{85}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}\x0cb + 0: a\x{0a}\x{0d}\x{85}\x{0c}b + +/^a\R+b/8 + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0c\x{2028}\x{2029}b + 0: a\x{0c}\x{2028}\x{2029}b + a\x{85}b + 0: a\x{85}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}\x0cb + 0: a\x{0a}\x{0d}\x{85}\x{0c}b + ** Failers +No match + ab +No match + +/^a\R{1,3}b/8 + a\nb + 0: a\x{0a}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}b + 0: a\x{0a}\x{0d}\x{85}b + a\r\n\r\nb + 0: a\x{0d}\x{0a}\x{0d}\x{0a}b + a\r\n\r\n\r\nb + 0: a\x{0d}\x{0a}\x{0d}\x{0a}\x{0d}\x{0a}b + a\n\r\n\rb + 0: a\x{0a}\x{0d}\x{0a}\x{0d}b + a\n\n\r\nb + 0: a\x{0a}\x{0a}\x{0d}\x{0a}b + ** Failers +No match + a\n\n\n\rb +No match + a\r +No match + +/\h+\V?\v{3,4}/8 + \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d} + 1: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c} + +/\V?\v{3,4}/8 + \x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + 0: X\x{0a}\x{0b}\x{0c}\x{0d} + 1: X\x{0a}\x{0b}\x{0c} + +/\h+\V?\v{3,4}/8 + >\x09\x20\x{a0}X\x0a\x0a\x0a< + 0: \x{09} \x{a0}X\x{0a}\x{0a}\x{0a} + +/\V?\v{3,4}/8 + >\x09\x20\x{a0}X\x0a\x0a\x0a< + 0: X\x{0a}\x{0a}\x{0a} + +/\H\h\V\v/8 + X X\x0a + 0: X X\x{0a} + X\x09X\x0b + 0: X\x{09}X\x{0b} + ** Failers +No match + \x{a0} X\x0a +No match + +/\H*\h+\V?\v{3,4}/8 + \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d} + 1: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c} + \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a + 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c}\x{0d} + 1: \x{09} \x{a0}\x{0a}\x{0b}\x{0c} + \x09\x20\x{a0}\x0a\x0b\x0c + 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c} + ** Failers +No match + \x09\x20\x{a0}\x0a\x0b +No match + +/\H\h\V\v/8 + \x{3001}\x{3000}\x{2030}\x{2028} + 0: \x{3001}\x{3000}\x{2030}\x{2028} + X\x{180e}X\x{85} + 0: X\x{180e}X\x{85} + ** Failers +No match + \x{2009} X\x0a +No match + +/\H*\h+\V?\v{3,4}/8 + \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a + 0: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c}\x{0d} + 1: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c} + \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a + 0: \x{09}\x{205f}\x{a0}\x{0a}\x{2029}\x{0c}\x{2028} + 1: \x{09}\x{205f}\x{a0}\x{0a}\x{2029}\x{0c} + \x09\x20\x{202f}\x0a\x0b\x0c + 0: \x{09} \x{202f}\x{0a}\x{0b}\x{0c} + ** Failers +No match + \x09\x{200a}\x{a0}\x{2028}\x0b +No match + +/a\Rb/I8 +Capturing subpattern count = 0 +Options: bsr_anycrlf utf8 +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + ** Failers +No match + a\x{85}b +No match + a\x0bb +No match + +/a\Rb/I8 +Capturing subpattern count = 0 +Options: bsr_unicode utf8 +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x{85}b + 0: a\x{85}b + a\x0bb + 0: a\x{0b}b + ** Failers +No match + a\x{85}b\ +No match + a\x0bb\ +No match + +/a\R?b/I8 +Capturing subpattern count = 0 +Options: bsr_anycrlf utf8 +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + ** Failers +No match + a\x{85}b +No match + a\x0bb +No match + +/a\R?b/I8 +Capturing subpattern count = 0 +Options: bsr_unicode utf8 +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x{85}b + 0: a\x{85}b + a\x0bb + 0: a\x{0b}b + ** Failers +No match + a\x{85}b\ +No match + a\x0bb\ +No match + +/ End of testinput 8 / diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput9 erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput9 --- erlang-13.b.1-dfsg/lib/stdlib/test/re_SUITE_data/testoutput9 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/re_SUITE_data/testoutput9 2009-03-12 12:21:54.000000000 +0000 @@ -0,0 +1,1643 @@ +/\pL\P{Nd}/8 + AB + 0: AB + *** Failers + 0: Fa + A0 +No match + 00 +No match + +/\X./8 + AB + 0: AB + A\x{300}BC + 0: A\x{300}B + A\x{300}\x{301}\x{302}BC + 0: A\x{300}\x{301}\x{302}B + *** Failers + 0: ** + \x{300} +No match + +/\X\X/8 + ABC + 0: AB + A\x{300}B\x{300}\x{301}C + 0: A\x{300}B\x{300}\x{301} + A\x{300}\x{301}\x{302}BC + 0: A\x{300}\x{301}\x{302}B + *** Failers + 0: ** + \x{300} +No match + +/^\pL+/8 + abcd + 0: abcd + 1: abc + 2: ab + 3: a + a + 0: a + *** Failers +No match + +/^\PL+/8 + 1234 + 0: 1234 + 1: 123 + 2: 12 + 3: 1 + = + 0: = + *** Failers + 0: *** + 1: *** + 2: ** + 3: * + abcd +No match + +/^\X+/8 + abcdA\x{300}\x{301}\x{302} + 0: abcdA\x{300}\x{301}\x{302} + 1: abcd + 2: abc + 3: ab + 4: a + A\x{300}\x{301}\x{302} + 0: A\x{300}\x{301}\x{302} + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302} + 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302} + 1: A\x{300}\x{301}\x{302} + a + 0: a + *** Failers + 0: *** Failers + 1: *** Failer + 2: *** Faile + 3: *** Fail + 4: *** Fai + 5: *** Fa + 6: *** F + 7: *** + 8: *** + 9: ** +10: * + \x{300}\x{301}\x{302} +No match + +/\X?abc/8 + abc + 0: abc + A\x{300}abc + 0: A\x{300}abc + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz + 0: A\x{300}abc + \x{300}abc + 0: abc + *** Failers +No match + +/^\X?abc/8 + abc + 0: abc + A\x{300}abc + 0: A\x{300}abc + *** Failers +No match + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz +No match + \x{300}abc +No match + +/\X*abc/8 + abc + 0: abc + A\x{300}abc + 0: A\x{300}abc + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz + 0: A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abc + \x{300}abc + 0: abc + *** Failers +No match + +/^\X*abc/8 + abc + 0: abc + A\x{300}abc + 0: A\x{300}abc + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz + 0: A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abc + *** Failers +No match + \x{300}abc +No match + +/^\pL?=./8 + A=b + 0: A=b + =c + 0: =c + *** Failers +No match + 1=2 +No match + AAAA=b +No match + +/^\pL*=./8 + AAAA=b + 0: AAAA=b + =c + 0: =c + *** Failers +No match + 1=2 +No match + +/^\X{2,3}X/8 + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + *** Failers +No match + X +No match + A\x{300}\x{301}\x{302}X +No match + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X +No match + +/^\pC\pL\pM\pN\pP\pS\pZ [pcre,compile_options,run_options,combined_options,replace_autogen,global_capture,replace_return,split_autogen,split_options,split_specials,error_handling]. + +pcre(doc) -> + ["Run all applicable tests from the PCRE testsuites."]; +pcre(Config) when is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(3)), + RootDir = ?config(data_dir, Config), + Res = run_pcre_tests:test(RootDir), + 0 = lists:sum([ X || {X,_,_} <- Res ]), + ?t:timetrap_cancel(Dog), + {comment,Res}. + +compile_options(doc) -> + ["Test all documented compile options"]; +compile_options(Config) when is_list(Config) -> + ?line ok = ctest("ABDabcdABCD","abcd",[],true,{match,[{3,4}]}), + ?line ok = ctest("ABDabcdABCD","abcd",[anchored],true,nomatch), + ?line ok = ctest("ABDabcdABCD",".*abcd",[anchored],true,{match,[{0,7}]}), + ?line ok = ctest("ABCabcdABC","ABCD",[],true,nomatch), + ?line ok = ctest("ABCabcdABC","ABCD",[caseless],true,{match,[{3,4}]}), + ?line ok = ctest("abcdABC\n","ABC$",[],true,{match,[{4,3}]}), + ?line ok = ctest("abcdABC\n","ABC$",[dollar_endonly],true,nomatch), + ?line ok = ctest("abcdABC\n","ABC.",[],true,nomatch), + ?line ok = ctest("abcdABC\n","ABC.",[dotall],true,{match,[{4,4}]}), + ?line ok = ctest("abcdABCD","ABC .",[],true,nomatch), + ?line ok = ctest("abcdABCD","ABC .",[extended],true,{match,[{4,4}]}), + ?line ok = ctest("abcd\nABCD","ABC",[],true,{match,[{5,3}]}), + ?line ok = ctest("abcd\nABCD","ABC",[firstline],true,nomatch), + ?line ok = ctest("abcd\nABCD","^ABC",[],true,nomatch), + ?line ok = ctest("abcd\nABCD","^ABC",[multiline],true,{match,[{5,3}]}), + ?line ok = ctest("abcdABCD","(ABC)",[],true,{match,[{4,3},{4,3}]}), + ?line ok = ctest("abcdABCD","(ABC)",[no_auto_capture],true,{match,[{4,3}]}), + ?line ok = ctest(notused,"(?ABC)|(?DEF)",[],false,notused), + ?line ok = ctest("abcdABCD","(?ABC)|(?DEF)",[dupnames],true,{match,[{4,3},{4,3}]}), + ?line ok = ctest("abcdABCDabcABCD","abcd.*D",[],true,{match,[{0,15}]}), + ?line ok = ctest("abcdABCDabcABCD","abcd.*D",[ungreedy],true,{match,[{0,8}]}), + ?line ok = ctest("abcdABCabcABC\nD","abcd.*D",[],true,nomatch), + ?line ok = ctest("abcdABCabcABC\nD","abcd.*D",[{newline,cr}],true,{match,[{0,15}]}), + ?line ok = ctest("abcdABCabcABC\rD","abcd.*D",[],true,{match,[{0,15}]}), + ?line ok = ctest("abcdABCabcABC\rD","abcd.*D",[{newline,lf}],true,{match,[{0,15}]}), + ?line ok = ctest("abcdABCabcd\r\n","abcd$",[{newline,lf}],true,nomatch), + ?line ok = ctest("abcdABCabcd\r\n","abcd$",[{newline,cr}],true,nomatch), + ?line ok = ctest("abcdABCabcd\r\n","abcd$",[{newline,crlf}],true,{match,[{7,4}]}), + + ?line ok = ctest("abcdABCabcd\r","abcd$",[{newline,crlf}],true,nomatch), + ?line ok = ctest("abcdABCabcd\n","abcd$",[{newline,crlf}],true,nomatch), + ?line ok = ctest("abcdABCabcd\r\n","abcd$",[{newline,anycrlf}],true,{match,[{7,4}]}), + + ?line ok = ctest("abcdABCabcd\r","abcd$",[{newline,anycrlf}],true,{match,[{7,4}]}), + ?line ok = ctest("abcdABCabcd\n","abcd$",[{newline,anycrlf}],true,{match,[{7,4}]}), + ok. + +run_options(doc) -> + ["Test all documented run specific options"]; +run_options(Config) when is_list(Config) -> + ?line rtest("ABCabcdABC","abc",[],[],true), + ?line rtest("ABCabcdABC","abc",[anchored],[],false), + % Anchored in run overrides unanchored in compilation + ?line rtest("ABCabcdABC","abc",[],[anchored],false), + + ?line rtest("","a?b?",[],[],true), + ?line rtest("","a?b?",[],[notempty],false), + + ?line rtest("abc","^a",[],[],true), + ?line rtest("abc","^a",[],[notbol],false), + ?line rtest("ab\nc","^a",[multiline],[],true), + ?line rtest("ab\nc","^a",[multiline],[notbol],false), + ?line rtest("ab\nc","^c",[multiline],[notbol],true), + + ?line rtest("abc","c$",[],[],true), + ?line rtest("abc","c$",[],[noteol],false), + + ?line rtest("ab\nc","b$",[multiline],[],true), + ?line rtest("ab\nc","c$",[multiline],[],true), + ?line rtest("ab\nc","b$",[multiline],[noteol],true), + ?line rtest("ab\nc","c$",[multiline],[noteol],false), + + ?line rtest("abc","ab",[],[{offset,0}],true), + ?line rtest("abc","ab",[],[{offset,1}],false), + + ?line rtest("abcdABCabcABC\nD","abcd.*D",[],[],false), + ?line rtest("abcdABCabcABC\nD","abcd.*D",[],[{newline,cr}],true), + ?line rtest("abcdABCabcABC\rD","abcd.*D",[],[],true), + ?line rtest("abcdABCabcABC\rD","abcd.*D",[{newline,cr}],[{newline,lf}],true), + ?line rtest("abcdABCabcd\r\n","abcd$",[],[{newline,lf}],false), + ?line rtest("abcdABCabcd\r\n","abcd$",[],[{newline,cr}],false), + ?line rtest("abcdABCabcd\r\n","abcd$",[],[{newline,crlf}],true), + + ?line rtest("abcdABCabcd\r","abcd$",[],[{newline,crlf}],false), + ?line rtest("abcdABCabcd\n","abcd$",[],[{newline,crlf}],false), + ?line rtest("abcdABCabcd\r\n","abcd$",[],[{newline,anycrlf}],true), + + ?line rtest("abcdABCabcd\r","abcd$",[],[{newline,anycrlf}],true), + ?line rtest("abcdABCabcd\n","abcd$",[],[{newline,anycrlf}],true), + + ?line {ok,MP} = re:compile(".*(abcd).*"), + ?line {match,[{0,10},{3,4}]} = re:run("ABCabcdABC",MP,[]), + ?line {match,[{0,10},{3,4}]} = re:run("ABCabcdABC",MP,[{capture,all}]), + ?line {match,[{0,10},{3,4}]} = re:run("ABCabcdABC",MP,[{capture,all,index}]), + ?line {match,["ABCabcdABC","abcd"]} = re:run("ABCabcdABC",MP,[{capture,all,list}]), + ?line {match,[<<"ABCabcdABC">>,<<"abcd">>]} = re:run("ABCabcdABC",MP,[{capture,all,binary}]), + ?line {match,[{0,10}]} = re:run("ABCabcdABC",MP,[{capture,first}]), + ?line {match,[{0,10}]} = re:run("ABCabcdABC",MP,[{capture,first,index}]), ?line {match,["ABCabcdABC"]} = re:run("ABCabcdABC",MP,[{capture,first,list}]), + ?line {match,[<<"ABCabcdABC">>]} = re:run("ABCabcdABC",MP,[{capture,first,binary}]), + + ?line {match,[{3,4}]} = re:run("ABCabcdABC",MP,[{capture,all_but_first}]), + ?line {match,[{3,4}]} = re:run("ABCabcdABC",MP,[{capture,all_but_first,index}]), + ?line {match,["abcd"]} = re:run("ABCabcdABC",MP,[{capture,all_but_first,list}]), + ?line {match,[<<"abcd">>]} = re:run("ABCabcdABC",MP,[{capture,all_but_first,binary}]), + + ?line match = re:run("ABCabcdABC",MP,[{capture,none}]), + ?line match = re:run("ABCabcdABC",MP,[{capture,none,index}]), + ?line match = re:run("ABCabcdABC",MP,[{capture,none,list}]), + ?line match = re:run("ABCabcdABC",MP,[{capture,none,binary}]), + + ?line {ok,MP2} = re:compile(".*(?abcd).*"), + ?line {match,[{3,4}]} = re:run("ABCabcdABC",MP2,[{capture,[1]}]), + ?line {match,[{3,4}]} = re:run("ABCabcdABC",MP2,[{capture,['FOO']}]), + ?line {match,[{3,4}]} = re:run("ABCabcdABC",MP2,[{capture,["FOO"]}]), + ?line {match,["abcd"]} = re:run("ABCabcdABC",MP2,[{capture,["FOO"],list}]), + ?line {match,[<<"abcd">>]} = re:run("ABCabcdABC",MP2,[{capture,["FOO"],binary}]), + + ?line {match,[{-1,0}]} = re:run("ABCabcdABC",MP2,[{capture,[200]}]), + ?line {match,[{-1,0}]} = re:run("ABCabcdABC",MP2,[{capture,['BAR']}]), + ?line {match,[""]} = re:run("ABCabcdABC",MP2,[{capture,[200],list}]), + ?line {match,[""]} = re:run("ABCabcdABC",MP2,[{capture,['BAR'],list}]), + ?line {match,[<<>>]} = re:run("ABCabcdABC",MP2,[{capture,[200],binary}]), + ?line {match,[<<>>]} = re:run("ABCabcdABC",MP2,[{capture,['BAR'],binary}]), + + ?line {ok, MP3} = re:compile(".*((?abdd)|a(..d)).*"), + ?line {match,[{0,10},{3,4},{-1,0},{4,3}]} = re:run("ABCabcdABC",MP3,[]), + ?line {match,[{0,10},{3,4},{-1,0},{4,3}]} = re:run("ABCabcdABC",MP3,[{capture,all,index}]), + ?line {match,[<<"ABCabcdABC">>,<<"abcd">>,<<>>,<<"bcd">>]} = re:run("ABCabcdABC",MP3,[{capture,all,binary}]), + ?line {match,["ABCabcdABC","abcd",[],"bcd"]} = re:run("ABCabcdABC",MP3,[{capture,all,list}]), + ok. + + + +combined_options(doc) -> + ["Test compile options given directly to run"]; +combined_options(Config) when is_list(Config) -> + ?line ok = crtest("ABDabcdABCD","abcd",[],true,{match,[{3,4}]}), + ?line ok = crtest("ABDabcdABCD","abcd",[anchored],true,nomatch), + ?line ok = crtest("ABDabcdABCD",".*abcd",[anchored],true,{match,[{0,7}]}), + ?line ok = crtest("ABCabcdABC","ABCD",[],true,nomatch), + ?line ok = crtest("ABCabcdABC","ABCD",[caseless],true,{match,[{3,4}]}), + ?line ok = crtest("abcdABC\n","ABC$",[],true,{match,[{4,3}]}), + ?line ok = crtest("abcdABC\n","ABC$",[dollar_endonly],true,nomatch), + ?line ok = crtest("abcdABC\n","ABC.",[],true,nomatch), + ?line ok = crtest("abcdABC\n","ABC.",[dotall],true,{match,[{4,4}]}), + ?line ok = crtest("abcdABCD","ABC .",[],true,nomatch), + ?line ok = crtest("abcdABCD","ABC .",[extended],true,{match,[{4,4}]}), + ?line ok = crtest("abcd\nABCD","ABC",[],true,{match,[{5,3}]}), + ?line ok = crtest("abcd\nABCD","ABC",[firstline],true,nomatch), + ?line ok = crtest("abcd\nABCD","^ABC",[],true,nomatch), + ?line ok = crtest("abcd\nABCD","^ABC",[multiline],true,{match,[{5,3}]}), + ?line ok = crtest("abcdABCD","(ABC)",[],true,{match,[{4,3},{4,3}]}), + ?line ok = crtest("abcdABCD","(ABC)",[no_auto_capture],true,{match,[{4,3}]}), + ?line ok = crtest(notused,"(?ABC)|(?DEF)",[],false,notused), + ?line ok = crtest("abcdABCD","(?ABC)|(?DEF)",[dupnames],true,{match,[{4,3},{4,3}]}), + ?line ok = crtest("abcdABCDabcABCD","abcd.*D",[],true,{match,[{0,15}]}), + ?line ok = crtest("abcdABCDabcABCD","abcd.*D",[ungreedy],true,{match,[{0,8}]}), + ?line ok = ctest("abcdABCabcABC\nD","abcd.*D",[],true,nomatch), + ?line ok = crtest("abcdABCabcABC\nD","abcd.*D",[{newline,cr}],true,{match,[{0,15}]}), + ?line ok = crtest("abcdABCabcABC\rD","abcd.*D",[],true,{match,[{0,15}]}), + ?line ok = crtest("abcdABCabcABC\rD","abcd.*D",[{newline,lf}],true,{match,[{0,15}]}), + ?line ok = crtest("abcdABCabcd\r\n","abcd$",[{newline,lf}],true,nomatch), + ?line ok = crtest("abcdABCabcd\r\n","abcd$",[{newline,cr}],true,nomatch), + ?line ok = crtest("abcdABCabcd\r\n","abcd$",[{newline,crlf}],true,{match,[{7,4}]}), + + ?line ok = crtest("abcdABCabcd\r","abcd$",[{newline,crlf}],true,nomatch), + ?line ok = crtest("abcdABCabcd\n","abcd$",[{newline,crlf}],true,nomatch), + ?line ok = crtest("abcdABCabcd\r\n","abcd$",[{newline,anycrlf}],true,{match,[{7,4}]}), + + ?line ok = crtest("abcdABCabcd\r","abcd$",[{newline,anycrlf}],true,{match,[{7,4}]}), + ?line ok = crtest("abcdABCabcd\n","abcd$",[{newline,anycrlf}],true,{match,[{7,4}]}), + + ?line ok = crtest("abcdABCabcd\r\n","abcd$",[{newline,anycrlf},{capture,all,list}],true,{match,["abcd"]}), + + ?line ok = crtest("abcdABCabcd\r","abcd$",[{newline,anycrlf},{capture,all,list}],true,{match,["abcd"]}), + + ?line ok = crtest("abcdABCabcd\n","abcd$",[{newline,anycrlf},{capture,all,list}],true,{match,["abcd"]}), + + ?line ok = crtest("abcdABCabcd\r\n","abcd$",[{newline,anycrlf},{capture,all,binary}],true,{match,[<<"abcd">>]}), + + ?line ok = crtest("abcdABCabcd\r","abcd$",[{newline,anycrlf},{capture,all,binary}],true,{match,[<<"abcd">>]}), + ?line ok = crtest("abcdABCabcd\n","abcd$",[{newline,anycrlf},{capture,all,binary}],true,{match,[<<"abcd">>]}), + + % Check that unique run-options fail in compile only case: + ?line {'EXIT',{badarg,_}} = (catch re:compile("abcd$",[{newline,anycrlf},{capture,all,binary}])), + ?line {'EXIT',{badarg,_}} = (catch re:compile("abcd$",[{newline,anycrlf},{offset,3}])), + ?line {'EXIT',{badarg,_}} = (catch re:compile("abcd$",[{newline,anycrlf},notempty])), + ?line {'EXIT',{badarg,_}} = (catch re:compile("abcd$",[{newline,anycrlf},notbol])), + ?line {'EXIT',{badarg,_}} = (catch re:compile("abcd$",[{newline,anycrlf},noteol])), + + + ?line {match,_} = re:run("abcdABCabcd\r\n","abcd$",[{newline,crlf}]), + ?line nomatch = re:run("abcdABCabcd\r\nefgh","abcd$",[{newline,crlf}]), + ?line {match,_} = re:run("abcdABCabcd\r\nefgh","abcd$",[{newline,crlf},multiline]), + ?line nomatch = re:run("abcdABCabcd\r\nefgh","efgh$",[{newline,crlf},multiline,noteol]), + ?line {match,_} = re:run("abcdABCabcd\r\nefgh","abcd$",[{newline,crlf},multiline,noteol]), + ?line {match,_} = re:run("abcdABCabcd\r\nefgh","^abcd",[{newline,crlf},multiline,noteol]), + ?line nomatch = re:run("abcdABCabcd\r\nefgh","^abcd",[{newline,crlf},multiline,notbol]), + ?line {match,_} = re:run("abcdABCabcd\r\nefgh","^efgh",[{newline,crlf},multiline,notbol]), + ?line {match,_} = re:run("ABC\nD","[a-z]*",[{newline,crlf}]), + ?line nomatch = re:run("ABC\nD","[a-z]*",[{newline,crlf},notempty]), + ok. + +replace_autogen(doc) -> + ["Test replace with autogenerated erlang module"]; +replace_autogen(Config) when is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(3)), + re_testoutput1_replacement_test:run(), + ?t:timetrap_cancel(Dog), + ok. + +global_capture(doc) -> + ["Tests capture options together with global searching"]; +global_capture(Config) when is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(3)), + ?line {match,[{3,4}]} = re:run("ABCabcdABC",".*(?abcd).*",[{capture,[1]}]), + ?line {match,[{10,4}]} = re:run("ABCabcdABCabcdA",".*(?abcd).*",[{capture,[1]}]), + ?line {match,[[{10,4}]]} = re:run("ABCabcdABCabcdA",".*(?abcd).*",[global,{capture,[1]}]), + ?line {match,[{3,4}]} = re:run("ABCabcdABC",".*(?abcd).*",[{capture,['FOO']}]), + ?line {match,[{10,4}]} = re:run("ABCabcdABCabcdA",".*(?abcd).*",[{capture,['FOO']}]), + ?line {match,[[{10,4}]]} = re:run("ABCabcdABCabcdA",".*(?abcd).*",[global,{capture,['FOO']}]), + ?line {match,[[{3,4},{3,4}],[{10,4},{10,4}]]} = re:run("ABCabcdABCabcdA","(?abcd)",[global]), + ?line {match,[[{3,4},{3,4}],[{10,4},{10,4}]]} = re:run("ABCabcdABCabcdA","(?abcd)",[global,{capture,all}]), + ?line {match,[[{3,4},{3,4}],[{10,4},{10,4}]]} = re:run("ABCabcdABCabcdA","(?abcd)",[global,{capture,all,index}]), + ?line {match,[[{3,4}],[{10,4}]]} = re:run("ABCabcdABCabcdA","(?abcd)",[global,{capture,first}]), + ?line {match,[[{3,4}],[{10,4}]]} = re:run("ABCabcdABCabcdA","(?abcd)",[global,{capture,all_but_first}]), + ?line {match,[[<<"bcd">>],[<<"bcd">>]]} = re:run("ABCabcdABCabcdA","a(?bcd)",[global,{capture,all_but_first,binary}]), + ?line {match,[["bcd"],["bcd"]]} = re:run("ABCabcdABCabcdA","a(?bcd)",[global,{capture,all_but_first,list}]), + ?line {match,[["abcd","bcd"],["abcd","bcd"]]} = re:run("ABCabcdABCabcdA","a(?bcd)",[global,{capture,all,list}]), + ?line {match,[[<<"abcd">>,<<"bcd">>],[<<"abcd">>,<<"bcd">>]]} = re:run("ABCabcdABCabcdA","a(?bcd)",[global,{capture,all,binary}]), + ?line {match,[[{3,4},{4,3}],[{10,4},{11,3}]]} = re:run("ABCabcdABCabcdA","a(?bcd)",[global,{capture,all,index}]), + ?line match = re:run("ABCabcdABCabcdA","a(?bcd)",[global,{capture,none,index}]), + ?line match = re:run("ABCabcdABCabcdA","a(?bcd)",[global,{capture,none,binary}]), + ?line match = re:run("ABCabcdABCabcdA","a(?bcd)",[global,{capture,none,list}]), + ?line {match,[[<<195,133,98,99,100>>,<<"bcd">>],[<<"abcd">>,<<"bcd">>]]} = re:run("ABCÅbcdABCabcdA",".(?bcd)",[global,{capture,all,binary},unicode]), + ?line {match,[["Åbcd","bcd"],["abcd","bcd"]]} = re:run(<<"ABC",8#303,8#205,"bcdABCabcdA">>,".(?bcd)",[global,{capture,all,list},unicode]), + ?line {match,[["Åbcd","bcd"],["abcd","bcd"]]} = re:run("ABCÅbcdABCabcdA",".(?bcd)",[global,{capture,all,list},unicode]), + ?line {match,[[{3,5},{5,3}],[{11,4},{12,3}]]} = re:run("ABCÅbcdABCabcdA",".(?bcd)",[global,{capture,all,index},unicode]), + ?t:timetrap_cancel(Dog), + ok. + +replace_return(doc) -> + ["Tests return options of replace together with global searching"]; +replace_return(Config) when is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(3)), + ?line {'EXIT',{badarg,_}} = (catch re:replace("na","(a","")), + ?line <<"nasse">> = re:replace(<<"nisse">>,"i","a",[{return,binary}]), + ?line <<"ABCÅXABCXA">> = re:replace("ABC\305abcdABCabcdA","a(?bcd)","X",[global,{return,binary}]), + + ?line [<<"ABCÅ">>, + <<"X">>, + <<"ABC">>, + <<"X">> | + <<"A">> ] = + re:replace("ABCÅabcdABCabcdA","a(?bcd)","X",[global,{return,iodata}]), + ?line "ABCÅXABCXA" = re:replace("ABCÅabcdABCabcdA","a(?bcd)","X",[global,{return,list},unicode]), + ?line <<65,66,67,195,133,88,65,66,67,88,65>> = re:replace("ABCÅabcdABCabcdA","a(?bcd)","X",[global,{return,binary},unicode]), + ?line <<65,66,67,195,133,88,65,66,67,97,98,99,100,65>> = re:replace("ABCÅabcdABCabcdA","a(?bcd)","X",[{return,binary},unicode]), + ?line <<"iXk">> = re:replace("abcdefghijk","(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)","\\9X",[{return,binary}]), + ?line <<"jXk">> = re:replace("abcdefghijk","(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)","\\10X",[{return,binary}]), + ?line <<"Xk">> = re:replace("abcdefghijk","(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)","\\11X",[{return,binary}]), + ?t:timetrap_cancel(Dog), + ok. + +rtest(Subj, RE, Copt, Ropt, true) -> + {ok,MP} = re:compile(RE,Copt), + {match,_} = re:run(Subj,MP,Ropt), + ok; +rtest(Subj, RE, Copt, Ropt, false) -> + {ok,MP} = re:compile(RE,Copt), + nomatch = re:run(Subj,MP,Ropt), + ok. + +ctest(_,RE,Options,false,_) -> + case re:compile(RE,Options) of + {ok,_} -> + error; + {error,_} -> + ok + end; +ctest(Subject,RE,Options,true,Result) -> + try + {ok, Prog} = re:compile(RE,Options), + Result = re:run(Subject,Prog,[]), + ok + catch + _:_ -> + error + end. +crtest(_,RE,Options,false,_) -> + case (catch re:run("",RE,Options)) of + {'EXIT',{badarg,_}} -> + ok; + _ -> + error + end; +crtest(Subject,RE,Options,true,Result) -> + try + Result = re:run(Subject,RE,Options), + ok + catch + _:_ -> + error + end. + +split_autogen(doc) -> + ["Test split with autogenerated erlang module"]; +split_autogen(Config) when is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(3)), + re_testoutput1_split_test:run(), + ?t:timetrap_cancel(Dog), + ok. + +split_options(doc) -> + ["Test special options to split."]; +split_options(Config) when is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(1)), + ?line [[<<"a">>,<<" ">>],[<<"b">>,<<" ">>],[<<"c">>,<<" ">>]] = re:split("a b c ","( )",[group,trim]), + ?line [[<<"a">>,<<" ">>],[<<"b">>,<<" ">>],[<<"c">>,<<" ">>]] = re:split("a b c ","( )",[group,{parts,0}]), + ?line [[<<"a">>,<<" ">>],[<<"b">>,<<" ">>],[<<"c">>,<<" ">>],[<<>>]] = + re:split("a b c ","( )",[{parts,infinity},group]), + ?line [[<<"a">>,<<" ">>],[<<"b">>,<<" ">>],[<<"c">>,<<" ">>],[<<>>]] = + re:split("a b c ","( )",[group]), + ?line [[<<>>,<<" ">>],[<<"a">>,<<" ">>],[<<"b">>,<<" ">>], + [<<"c">>,<<" ">>],[<<"d">>,<<" ">>]] = + re:split(" a b c d ","( +)",[group,trim]), + ?line [[<<>>,<<" ">>],[<<"a">>,<<" ">>],[<<"b">>,<<" ">>], + [<<"c">>,<<" ">>],[<<"d">>,<<" ">>]] = + re:split(" a b c d ","( +)",[{parts,0},group]), + ?line [[<<>>,<<" ">>],[<<"a">>,<<" ">>],[<<"b">>,<<" ">>], + [<<"c">>,<<" ">>],[<<"d">>,<<" ">>],[<<>>]] = + re:split(" a b c d ","( +)",[{parts,infinity},group]), + ?line [[<<"a">>,<<" ">>],[<<"b c d">>]] = + re:split("a b c d","( +)",[{parts,2},group]), + ?line [[[967]," "],["b c d"]] = + re:split([967]++" b c d","( +)", + [{parts,2},group,{return,list},unicode]), + ?line [[<<207,135>>,<<" ">>],[<<"b c d">>]] = + re:split([967]++" b c d","( +)", + [{parts,2},group,{return,binary},unicode]), + ?line {'EXIT',{badarg,_}} = + (catch re:split([967]++" b c d","( +)", + [{parts,2},group,{return,binary}])), + ?line {'EXIT',{badarg,_}} = + (catch re:split("a b c d","( +)",[{parts,-2}])), + ?line {'EXIT',{badarg,_}} = + (catch re:split("a b c d","( +)",[{parts,banan}])), + ?line {'EXIT',{badarg,_}} = + (catch re:split("a b c d","( +)",[{capture,all}])), + ?line {'EXIT',{badarg,_}} = + (catch re:split("a b c d","( +)",[{capture,[],binary}])), + % Parts 0 is equal to no parts specification (implicit strip) + ?line ["a"," ","b"," ","c"," ","d"] = + re:split("a b c d","( *)",[{parts,0},{return,list}]), + ?t:timetrap_cancel(Dog), + ok. + +join([]) -> []; +join([A]) -> [A]; +join([H|T]) -> [H,<<":">>|join(T)]. + +split_specials(doc) -> + ["Some special cases of split that are easy to get wrong."]; +split_specials(Config) when is_list(Config) -> + %% More or less just to remember these icky cases + Dog = ?t:timetrap(?t:minutes(1)), + ?line <<"::abd:f">> = + iolist_to_binary(join(re:split("abdf","^(?!(ab)de|x)(abd)(f)",[trim]))), + ?line <<":abc2xyzabc3">> = + iolist_to_binary(join(re:split("abc1abc2xyzabc3","\\Aabc.",[trim]))), + ?t:timetrap_cancel(Dog), + ok. + + +error_handling(doc) -> + ["Test that errors are handled correctly by the erlang code."]; +error_handling(Config) when is_list(Config) -> + % This test checks the exception tuples manufactured in the erlang + % code to hide the trapping from the user at least when it comes to errors + Dog = ?t:timetrap(?t:minutes(1)), + % The malformed precomiled RE is detected after + % the trap to re:grun from grun, in the grun function clause + % that handles precompiled expressions + ?line {'EXIT',{badarg,[{re,run,["apa",{1,2,3,4},[global]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:run("apa",{1,2,3,4},[global])), + % An invalid capture list will also cause a badarg late, + % but with a non pre compiled RE, the exception should be thrown by the + % grun function clause that handles RE's compiled implicitly by + % the run/3 BIF before trapping. + ?line {'EXIT',{badarg,[{re,run,["apa","p",[{capture,[1,{a}]},global]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:run("apa","p",[{capture,[1,{a}]},global])), + % And so the case of a precompiled expression together with + % a compile-option (binary and list subject): + ?line {ok,RE} = re:compile("(p)"), + ?line {match,[[{1,1},{1,1}]]} = re:run(<<"apa">>,RE,[global]), + ?line {match,[[{1,1},{1,1}]]} = re:run("apa",RE,[global]), + {'EXIT',{badarg,[{re,run, + [<<"apa">>, + {re_pattern,1,0,_}, + [global,unicode]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:run(<<"apa">>,RE,[global,unicode])), + {'EXIT',{badarg,[{re,run, + ["apa", + {re_pattern,1,0,_}, + [global,unicode]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:run("apa",RE,[global,unicode])), + ?line {'EXIT',{badarg,_}} = (catch re:run("apa","(p",[])), + ?line {'EXIT',{badarg,_}} = (catch re:run("apa","(p",[global])), + % The replace errors: + ?line {'EXIT',{badarg,[{re,replace,["apa",{1,2,3,4},"X",[]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:replace("apa",{1,2,3,4},"X",[])), + ?line {'EXIT',{badarg,[{re,replace,["apa",{1,2,3,4},"X",[global]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:replace("apa",{1,2,3,4},"X",[global])), + ?line {'EXIT',{badarg,[{re,replace, + ["apa", + {re_pattern,1,0,_}, + "X", + [unicode]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:replace("apa",RE,"X",[unicode])), + ?line <<"aXa">> = iolist_to_binary(re:replace("apa","p","X",[])), + ?line {'EXIT',{badarg,[{re,replace, + ["apa","p","X",[{capture,all,binary}]]}, + {?MODULE, error_handling,1} | _]}} = + (catch iolist_to_binary(re:replace("apa","p","X", + [{capture,all,binary}]))), + ?line {'EXIT',{badarg,[{re,replace, + ["apa","p","X",[{capture,all}]]}, + {?MODULE, error_handling,1} | _]}} = + (catch iolist_to_binary(re:replace("apa","p","X", + [{capture,all}]))), + ?line {'EXIT',{badarg,[{re,replace, + ["apa","p","X",[{return,banana}]]}, + {?MODULE, error_handling,1} | _]}} = + (catch iolist_to_binary(re:replace("apa","p","X", + [{return,banana}]))), + ?line {'EXIT',{badarg,_}} = (catch re:replace("apa","(p","X",[])), + % Badarg, not compile error. + ?line {'EXIT',{badarg,[{re,replace, + ["apa","(p","X",[{return,banana}]]}, + {?MODULE, error_handling,1} | _]}} = + (catch iolist_to_binary(re:replace("apa","(p","X", + [{return,banana}]))), + % And the split errors: + ?line [<<"a">>,<<"a">>] = (catch re:split("apa","p",[])), + ?line [<<"a">>,<<"p">>,<<"a">>] = (catch re:split("apa",RE,[])), + ?line {'EXIT',{badarg,[{re,split,["apa","p",[global]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:split("apa","p",[global])), + ?line {'EXIT',{badarg,[{re,split,["apa","p",[{capture,all}]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:split("apa","p",[{capture,all}])), + ?line {'EXIT',{badarg,[{re,split,["apa","p",[{capture,all,binary}]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:split("apa","p",[{capture,all,binary}])), + ?line {'EXIT',{badarg,[{re,split,["apa",{1,2,3,4},[]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:split("apa",{1,2,3,4})), + ?line {'EXIT',{badarg,[{re,split,["apa",{1,2,3,4},[]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:split("apa",{1,2,3,4},[])), + ?line {'EXIT',{badarg,[{re,split, + ["apa", + RE, + [unicode]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:split("apa",RE,[unicode])), + ?line {'EXIT',{badarg,[{re,split, + ["apa", + RE, + [{return,banana}]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:split("apa",RE,[{return,banana}])), + ?line {'EXIT',{badarg,[{re,split, + ["apa", + RE, + [banana]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:split("apa",RE,[banana])), + ?line {'EXIT',{badarg,_}} = (catch re:split("apa","(p")), + %Exception on bad argument, not compilation error + ?line {'EXIT',{badarg,[{re,split, + ["apa", + "(p", + [banana]]}, + {?MODULE, error_handling,1} | _]}} = + (catch re:split("apa","(p",[banana])), + ?t:timetrap_cancel(Dog), + ok. + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/re_testoutput1_replacement_test.erl erlang-13.b.3-dfsg/lib/stdlib/test/re_testoutput1_replacement_test.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/re_testoutput1_replacement_test.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/re_testoutput1_replacement_test.erl 2009-11-20 13:32:41.000000000 +0000 @@ -0,0 +1,18596 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(re_testoutput1_replacement_test). +-compile(export_all). +-include("test_server.hrl"). +%% This file is generated by running run_pcre_tests:gen_repl_test("re_SUITE_data/testoutput1") +run() -> +?line <<"WkCthe quick brown foxtthe quick brown foxjthe quick brown foxPpfmthe quick brown foxthe quick brown foxy">> = iolist_to_binary(re:replace("the quick brown fox","the quick brown fox","WkC&t\\1\\1&j&Ppfm&&y",[])), +?line <<"WkCthe quick brown foxtthe quick brown foxjthe quick brown foxPpfmthe quick brown foxthe quick brown foxy">> = iolist_to_binary(re:replace("the quick brown fox","the quick brown fox","WkC&t\\1\\1&j&Ppfm&&y",[global])), +?line <<"The quick brown FOX">> = iolist_to_binary(re:replace("The quick brown FOX","the quick brown fox","in&&CSwx",[])), +?line <<"The quick brown FOX">> = iolist_to_binary(re:replace("The quick brown FOX","the quick brown fox","in&&CSwx",[global])), +?line <<"What do you know about ORtMvuTRHtLthe quick brown foxiYthe quick brown foxGi?">> = iolist_to_binary(re:replace("What do you know about the quick brown fox?","the quick brown fox","ORtMvuTRHtL&iY&Gi",[])), +?line <<"What do you know about ORtMvuTRHtLthe quick brown foxiYthe quick brown foxGi?">> = iolist_to_binary(re:replace("What do you know about the quick brown fox?","the quick brown fox","ORtMvuTRHtL&iY&Gi",[global])), +?line <<"What do you know about THE QUICK BROWN FOX?">> = iolist_to_binary(re:replace("What do you know about THE QUICK BROWN FOX?","the quick brown fox","\\1nfTnvooMaxHdXgGO",[])), +?line <<"What do you know about THE QUICK BROWN FOX?">> = iolist_to_binary(re:replace("What do you know about THE QUICK BROWN FOX?","the quick brown fox","\\1nfTnvooMaxHdXgGO",[global])), +?line <<"hSniFQTqBU">> = iolist_to_binary(re:replace("the quick brown fox","The quick brown fox","hSniFQTqBU",[caseless])), +?line <<"hSniFQTqBU">> = iolist_to_binary(re:replace("the quick brown fox","The quick brown fox","hSniFQTqBU",[caseless, + global])), +?line <<"q">> = iolist_to_binary(re:replace("The quick brown FOX","The quick brown fox","q",[caseless])), +?line <<"q">> = iolist_to_binary(re:replace("The quick brown FOX","The quick brown fox","q",[caseless, + global])), +?line <<"What do you know about uJnke?">> = iolist_to_binary(re:replace("What do you know about the quick brown fox?","The quick brown fox","uJ\\1nke",[caseless])), +?line <<"What do you know about uJnke?">> = iolist_to_binary(re:replace("What do you know about the quick brown fox?","The quick brown fox","uJ\\1nke",[caseless, + global])), +?line <<"What do you know about VRUTHE QUICK BROWN FOXYgJqUVfiTHE QUICK BROWN FOXqb?">> = iolist_to_binary(re:replace("What do you know about THE QUICK BROWN FOX?","The quick brown fox","VRU&YgJqUVfi&\\1qb",[caseless])), +?line <<"What do you know about VRUTHE QUICK BROWN FOXYgJqUVfiTHE QUICK BROWN FOXqb?">> = iolist_to_binary(re:replace("What do you know about THE QUICK BROWN FOX?","The quick brown fox","VRU&YgJqUVfi&\\1qb",[caseless, + global])), +?line <<"jeUmEaUYOfHpPURCabcd + 9;$\\?caxyz">> = iolist_to_binary(re:replace("abcd + 9;$\\?caxyz","abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz","jeUmEaUYOfHpPURC&",[])), +?line <<"jeUmEaUYOfHpPURCabcd + 9;$\\?caxyz">> = iolist_to_binary(re:replace("abcd + 9;$\\?caxyz","abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz","jeUmEaUYOfHpPURC&",[global])), +?line <<"YVh">> = iolist_to_binary(re:replace("abxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","YVh",[])), +?line <<"YVh">> = iolist_to_binary(re:replace("abxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","YVh",[global])), +?line <<"wDCxbqXSqpabxyzpqrrrabbxyyyypqAzzX">> = iolist_to_binary(re:replace("abxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","wDCxbqXSqp&X",[])), +?line <<"wDCxbqXSqpabxyzpqrrrabbxyyyypqAzzX">> = iolist_to_binary(re:replace("abxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","wDCxbqXSqp&X",[global])), +?line <<"XOnDbhuPYPfGm">> = iolist_to_binary(re:replace("aabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1XOnDbhuP\\1Y\\1PfGm",[])), +?line <<"XOnDbhuPYPfGm">> = iolist_to_binary(re:replace("aabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1XOnDbhuP\\1Y\\1PfGm",[global])), +?line <<"vgswmIcA">> = iolist_to_binary(re:replace("aaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","vgswmI\\1cA",[])), +?line <<"vgswmIcA">> = iolist_to_binary(re:replace("aaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","vgswmI\\1cA",[global])), +?line <<"YaaaabxyzpqrrrabbxyyyypqAzzOXXRaa">> = iolist_to_binary(re:replace("aaaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","Y&OXXRaa",[])), +?line <<"YaaaabxyzpqrrrabbxyyyypqAzzOXXRaa">> = iolist_to_binary(re:replace("aaaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","Y&OXXRaa",[global])), +?line <<"CAeqsXe">> = iolist_to_binary(re:replace("abcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1CAeq\\1s\\1Xe",[])), +?line <<"CAeqsXe">> = iolist_to_binary(re:replace("abcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1CAeq\\1s\\1Xe",[global])), +?line <<"cDLaApdgW">> = iolist_to_binary(re:replace("aabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","cDLaApdgW",[])), +?line <<"cDLaApdgW">> = iolist_to_binary(re:replace("aabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","cDLaApdgW",[global])), +?line <<"aLfXiUYS">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","aLf\\1XiUYS",[])), +?line <<"aLfXiUYS">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","aLf\\1XiUYS",[global])), +?line <<"aaabcxyzpqrrrabbxyyyypqAzzBcaaabcxyzpqrrrabbxyyyypqAzzDAyoYqGn">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1&Bc&DAyoYqGn",[])), +?line <<"aaabcxyzpqrrrabbxyyyypqAzzBcaaabcxyzpqrrrabbxyyyypqAzzDAyoYqGn">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1&Bc&DAyoYqGn",[global])), +?line <<"aaabcxyzpqrrrabbxyyyypqqAzzijaaabcxyzpqrrrabbxyyyypqqAzzdIBcB">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","&ij&dI\\1BcB",[])), +?line <<"aaabcxyzpqrrrabbxyyyypqqAzzijaaabcxyzpqrrrabbxyyyypqqAzzdIBcB">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","&ij&dI\\1BcB",[global])), +?line <<"qrxTuPSgEjNvkaaabcxyzpqrrrabbxyyyypqqqAzz">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1qrx\\1\\1TuPSgEjNvk&",[])), +?line <<"qrxTuPSgEjNvkaaabcxyzpqrrrabbxyyyypqqqAzz">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1qrx\\1\\1TuPSgEjNvk&",[global])), +?line <<"oWxyrN">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1oWx\\1y\\1rN",[])), +?line <<"oWxyrN">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1oWx\\1y\\1rN",[global])), +?line <<"TPbeAcarX">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1T\\1PbeAcarX",[])), +?line <<"TPbeAcarX">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1T\\1PbeAcarX",[global])), +?line <<"xWhhgaaabcxyzpqrrrabbxyyyypqqqqqqAzzsHcQaaabcxyzpqrrrabbxyyyypqqqqqqAzzAeU">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","xWh\\1hg&sHcQ&AeU",[])), +?line <<"xWhhgaaabcxyzpqrrrabbxyyyypqqqqqqAzzsHcQaaabcxyzpqrrrabbxyyyypqqqqqqAzzAeU">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","xWh\\1hg&sHcQ&AeU",[global])), +?line <<"HasuDgVdEpaaaabcxyzpqrrrabbxyyyypqAzz">> = iolist_to_binary(re:replace("aaaabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","Hasu\\1\\1DgV\\1dEp&",[])), +?line <<"HasuDgVdEpaaaabcxyzpqrrrabbxyyyypqAzz">> = iolist_to_binary(re:replace("aaaabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","Hasu\\1\\1DgV\\1dEp&",[global])), +?line <<"XWMcabxyzzpqrrrabbxyyyypqAzzIUK">> = iolist_to_binary(re:replace("abxyzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","XWMc&\\1IUK",[])), +?line <<"XWMcabxyzzpqrrrabbxyyyypqAzzIUK">> = iolist_to_binary(re:replace("abxyzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","XWMc&\\1IUK",[global])), +?line <<"UBljDAPnposGdT">> = iolist_to_binary(re:replace("aabxyzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","UBljDAPnposGdT",[])), +?line <<"UBljDAPnposGdT">> = iolist_to_binary(re:replace("aabxyzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","UBljDAPnposGdT",[global])), +?line <<"boTxGt">> = iolist_to_binary(re:replace("aaabxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","boTxGt",[])), +?line <<"boTxGt">> = iolist_to_binary(re:replace("aaabxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","boTxGt",[global])), +?line <<"mnBWBx">> = iolist_to_binary(re:replace("aaaabxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","mnB\\1\\1WBx",[])), +?line <<"mnBWBx">> = iolist_to_binary(re:replace("aaaabxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","mnB\\1\\1WBx",[global])), +?line <<"lcgIVpnY">> = iolist_to_binary(re:replace("abcxyzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","lcgIVpnY\\1",[])), +?line <<"lcgIVpnY">> = iolist_to_binary(re:replace("abcxyzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","lcgIVpnY\\1",[global])), +?line <<"aabcxyzzzpqrrrabbxyyyypqAzznutiQsQaabcxyzzzpqrrrabbxyyyypqAzzokm">> = iolist_to_binary(re:replace("aabcxyzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","&n\\1\\1utiQsQ&o\\1km",[])), +?line <<"aabcxyzzzpqrrrabbxyyyypqAzznutiQsQaabcxyzzzpqrrrabbxyyyypqAzzokm">> = iolist_to_binary(re:replace("aabcxyzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","&n\\1\\1utiQsQ&o\\1km",[global])), +?line <<"rshbaaabcxyzzzzpqrrrabbxyyyypqAzzyCaaabcxyzzzzpqrrrabbxyyyypqAzzFuphTaaabcxyzzzzpqrrrabbxyyyypqAzzb">> = iolist_to_binary(re:replace("aaabcxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","rshb&yC&FuphT&b",[])), +?line <<"rshbaaabcxyzzzzpqrrrabbxyyyypqAzzyCaaabcxyzzzzpqrrrabbxyyyypqAzzFuphTaaabcxyzzzzpqrrrabbxyyyypqAzzb">> = iolist_to_binary(re:replace("aaabcxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","rshb&yC&FuphT&b",[global])), +?line <<"aaaabcxyzzzzpqrrrabbxyyyypqAzzDpUaaaabcxyzzzzpqrrrabbxyyyypqAzzWxWLwIQUnS">> = iolist_to_binary(re:replace("aaaabcxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","&DpU&WxW\\1LwIQUnS",[])), +?line <<"aaaabcxyzzzzpqrrrabbxyyyypqAzzDpUaaaabcxyzzzzpqrrrabbxyyyypqAzzWxWLwIQUnS">> = iolist_to_binary(re:replace("aaaabcxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","&DpU&WxW\\1LwIQUnS",[global])), +?line <<"maaaabcxyzzzzpqrrrabbbxyyyypqAzzaaaabcxyzzzzpqrrrabbbxyyyypqAzzdV">> = iolist_to_binary(re:replace("aaaabcxyzzzzpqrrrabbbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","m\\1&&dV",[])), +?line <<"maaaabcxyzzzzpqrrrabbbxyyyypqAzzaaaabcxyzzzzpqrrrabbbxyyyypqAzzdV">> = iolist_to_binary(re:replace("aaaabcxyzzzzpqrrrabbbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","m\\1&&dV",[global])), +?line <<"qABAquMpjbGrEQl">> = iolist_to_binary(re:replace("aaaabcxyzzzzpqrrrabbbxyyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","qAB\\1A\\1quMpjbGrEQl",[])), +?line <<"qABAquMpjbGrEQl">> = iolist_to_binary(re:replace("aaaabcxyzzzzpqrrrabbbxyyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","qAB\\1A\\1quMpjbGrEQl",[global])), +?line <<"XEmwtsQHVhnjgxANa">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypABzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","XEmw\\1tsQHVhn\\1jgx\\1ANa",[])), +?line <<"XEmwtsQHVhnjgxANa">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypABzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","XEmw\\1tsQHVhn\\1jgx\\1ANa",[global])), +?line <<"agMMGdMqblL">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypABBzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","agMMGdMq\\1blL\\1",[])), +?line <<"agMMGdMqblL">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypABBzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","agMMGdMq\\1blL\\1",[global])), +?line <<">>>EFCLJKUGJXH">> = iolist_to_binary(re:replace(">>>aaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","EFCLJKUGJXH",[])), +?line <<">>>EFCLJKUGJXH">> = iolist_to_binary(re:replace(">>>aaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","EFCLJKUGJXH",[global])), +?line <<">IW">> = iolist_to_binary(re:replace(">aaaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1IW",[])), +?line <<">IW">> = iolist_to_binary(re:replace(">aaaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1IW",[global])), +?line <<">>>>uiixDteuEA">> = iolist_to_binary(re:replace(">>>>abcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1uiixD\\1teuEA",[])), +?line <<">>>>uiixDteuEA">> = iolist_to_binary(re:replace(">>>>abcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","\\1uiixD\\1teuEA",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","vayXo\\1eo\\1H",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","vayXo\\1eo\\1H",[global])), +?line <<"abxyzpqrrabbxyyyypqAzz">> = iolist_to_binary(re:replace("abxyzpqrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","nJK",[])), +?line <<"abxyzpqrrabbxyyyypqAzz">> = iolist_to_binary(re:replace("abxyzpqrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","nJK",[global])), +?line <<"abxyzpqrrrrabbxyyyypqAzz">> = iolist_to_binary(re:replace("abxyzpqrrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","msrV\\1",[])), +?line <<"abxyzpqrrrrabbxyyyypqAzz">> = iolist_to_binary(re:replace("abxyzpqrrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","msrV\\1",[global])), +?line <<"abxyzpqrrrabxyyyypqAzz">> = iolist_to_binary(re:replace("abxyzpqrrrabxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","nVAVmEdY&rfTu",[])), +?line <<"abxyzpqrrrabxyyyypqAzz">> = iolist_to_binary(re:replace("abxyzpqrrrabxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","nVAVmEdY&rfTu",[global])), +?line <<"aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz">> = iolist_to_binary(re:replace("aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","&G&\\1eyiM",[])), +?line <<"aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz">> = iolist_to_binary(re:replace("aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","&G&\\1eyiM",[global])), +?line <<"aaaabcxyzzzzpqrrrabbbxyyypqAzz">> = iolist_to_binary(re:replace("aaaabcxyzzzzpqrrrabbbxyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","AIYq\\1nFUePr&s\\1s",[])), +?line <<"aaaabcxyzzzzpqrrrabbbxyyypqAzz">> = iolist_to_binary(re:replace("aaaabcxyzzzzpqrrrabbbxyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","AIYq\\1nFUePr&s\\1s",[global])), +?line <<"aaabcxyzpqrrrabbxyyyypqqqqqqqAzz">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","G\\1\\1XF\\1XcTk&D&Vd",[])), +?line <<"aaabcxyzpqrrrabbxyyyypqqqqqqqAzz">> = iolist_to_binary(re:replace("aaabcxyzpqrrrabbxyyyypqqqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz","G\\1\\1XF\\1XcTk&D&Vd",[global])), +?line <<"NMabcYpabcatqabczzabczzReBo">> = iolist_to_binary(re:replace("abczz","^(abc){1,2}zz","NM\\1Yp\\1atq&&ReBo",[])), +?line <<"NMabcYpabcatqabczzabczzReBo">> = iolist_to_binary(re:replace("abczz","^(abc){1,2}zz","NM\\1Yp\\1atq&&ReBo",[global])), +?line <<"PabcabczzabcsubxWpWrabcCabcabczzBDsb">> = iolist_to_binary(re:replace("abcabczz","^(abc){1,2}zz","P&\\1subxWpWr\\1C&BDsb",[])), +?line <<"PabcabczzabcsubxWpWrabcCabcabczzBDsb">> = iolist_to_binary(re:replace("abcabczz","^(abc){1,2}zz","P&\\1subxWpWr\\1C&BDsb",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(abc){1,2}zz","u&MSQ\\1MwaXNEFxKb\\1v\\1r",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(abc){1,2}zz","u&MSQ\\1MwaXNEFxKb\\1v\\1r",[global])), +?line <<"zz">> = iolist_to_binary(re:replace("zz","^(abc){1,2}zz","&XIfLMiKJsG&X",[])), +?line <<"zz">> = iolist_to_binary(re:replace("zz","^(abc){1,2}zz","&XIfLMiKJsG&X",[global])), +?line <<"abcabcabczz">> = iolist_to_binary(re:replace("abcabcabczz","^(abc){1,2}zz","k\\1S&UT&HR\\1\\1MHKIh&mv",[])), +?line <<"abcabcabczz">> = iolist_to_binary(re:replace("abcabcabczz","^(abc){1,2}zz","k\\1S&UT&HR\\1\\1MHKIh&mv",[global])), +?line <<">>abczz">> = iolist_to_binary(re:replace(">>abczz","^(abc){1,2}zz","R\\1GKCdWtC&\\1ULoV",[])), +?line <<">>abczz">> = iolist_to_binary(re:replace(">>abczz","^(abc){1,2}zz","R\\1GKCdWtC&\\1ULoV",[global])), +?line <<"bcbcvRuVbMbcbcOSuQfOJbc">> = iolist_to_binary(re:replace("bc","^(b+?|a){1,2}?c","&bcvRuV\\1M&&OSuQfOJ\\1c",[])), +?line <<"bcbcvRuVbMbcbcOSuQfOJbc">> = iolist_to_binary(re:replace("bc","^(b+?|a){1,2}?c","&bcvRuV\\1M&&OSuQfOJ\\1c",[global])), +?line <<"L">> = iolist_to_binary(re:replace("bbc","^(b+?|a){1,2}?c","L",[])), +?line <<"L">> = iolist_to_binary(re:replace("bbc","^(b+?|a){1,2}?c","L",[global])), +?line <<"pFFAeA">> = iolist_to_binary(re:replace("bbbc","^(b+?|a){1,2}?c","pFFAeA",[])), +?line <<"pFFAeA">> = iolist_to_binary(re:replace("bbbc","^(b+?|a){1,2}?c","pFFAeA",[global])), +?line <<"OpEK">> = iolist_to_binary(re:replace("bac","^(b+?|a){1,2}?c","OpEK",[])), +?line <<"OpEK">> = iolist_to_binary(re:replace("bac","^(b+?|a){1,2}?c","OpEK",[global])), +?line <<"bbacQeabbactAVaalybbacdBwbbac">> = iolist_to_binary(re:replace("bbac","^(b+?|a){1,2}?c","&Qe\\1&tAV\\1\\1ly&dBw&",[])), +?line <<"bbacQeabbactAVaalybbacdBwbbac">> = iolist_to_binary(re:replace("bbac","^(b+?|a){1,2}?c","&Qe\\1&tAV\\1\\1ly&dBw&",[global])), +?line <<"atVuxqLMNgBtlattKaT">> = iolist_to_binary(re:replace("aac","^(b+?|a){1,2}?c","\\1tVuxqLMNgBtl\\1ttKaT",[])), +?line <<"atVuxqLMNgBtlattKaT">> = iolist_to_binary(re:replace("aac","^(b+?|a){1,2}?c","\\1tVuxqLMNgBtl\\1ttKaT",[global])), +?line <<"Y">> = iolist_to_binary(re:replace("abbbbbbbbbbbc","^(b+?|a){1,2}?c","Y",[])), +?line <<"Y">> = iolist_to_binary(re:replace("abbbbbbbbbbbc","^(b+?|a){1,2}?c","Y",[global])), +?line <<"bbbbbbbbbbbactDhmKI">> = iolist_to_binary(re:replace("bbbbbbbbbbbac","^(b+?|a){1,2}?c","&tDhmKI",[])), +?line <<"bbbbbbbbbbbactDhmKI">> = iolist_to_binary(re:replace("bbbbbbbbbbbac","^(b+?|a){1,2}?c","&tDhmKI",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(b+?|a){1,2}?c","qVVVR&C\\1&etAsmWh",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(b+?|a){1,2}?c","qVVVR&C\\1&etAsmWh",[global])), +?line <<"aaac">> = iolist_to_binary(re:replace("aaac","^(b+?|a){1,2}?c","jD\\1&q&KCdV&RhT",[])), +?line <<"aaac">> = iolist_to_binary(re:replace("aaac","^(b+?|a){1,2}?c","jD\\1&q&KCdV&RhT",[global])), +?line <<"abbbbbbbbbbbac">> = iolist_to_binary(re:replace("abbbbbbbbbbbac","^(b+?|a){1,2}?c","\\1jT&nRG",[])), +?line <<"abbbbbbbbbbbac">> = iolist_to_binary(re:replace("abbbbbbbbbbbac","^(b+?|a){1,2}?c","\\1jT&nRG",[global])), +?line <<"bcXfvbIubUfhmIRev">> = iolist_to_binary(re:replace("bc","^(b+|a){1,2}c","&Xfv\\1IubUfhmIRev",[])), +?line <<"bcXfvbIubUfhmIRev">> = iolist_to_binary(re:replace("bc","^(b+|a){1,2}c","&Xfv\\1IubUfhmIRev",[global])), +?line <<"EbbbbcwbbWbbcVuAOqROLkbbcwbbc">> = iolist_to_binary(re:replace("bbc","^(b+|a){1,2}c","E\\1&w\\1W&VuAOqROLk&w&",[])), +?line <<"EbbbbcwbbWbbcVuAOqROLkbbcwbbc">> = iolist_to_binary(re:replace("bbc","^(b+|a){1,2}c","E\\1&w\\1W&VuAOqROLk&w&",[global])), +?line <<"I">> = iolist_to_binary(re:replace("bbbc","^(b+|a){1,2}c","I",[])), +?line <<"I">> = iolist_to_binary(re:replace("bbbc","^(b+|a){1,2}c","I",[global])), +?line <<"dctSELQIPb">> = iolist_to_binary(re:replace("bac","^(b+|a){1,2}c","dctSELQIPb",[])), +?line <<"dctSELQIPb">> = iolist_to_binary(re:replace("bac","^(b+|a){1,2}c","dctSELQIPb",[global])), +?line <<"kbdarKarpbbacbbacbDO">> = iolist_to_binary(re:replace("bbac","^(b+|a){1,2}c","kbd\\1rK\\1rp&&bDO",[])), +?line <<"kbdarKarpbbacbbacbDO">> = iolist_to_binary(re:replace("bbac","^(b+|a){1,2}c","kbd\\1rK\\1rp&&bDO",[global])), +?line <<"aFIlpaasKQWsFRadP">> = iolist_to_binary(re:replace("aac","^(b+|a){1,2}c","\\1FIlp\\1\\1sKQWsFR\\1dP",[])), +?line <<"aFIlpaasKQWsFRadP">> = iolist_to_binary(re:replace("aac","^(b+|a){1,2}c","\\1FIlp\\1\\1sKQWsFR\\1dP",[global])), +?line <<"bbbbbbbbbbbfbbbbbbbbbbbHo">> = iolist_to_binary(re:replace("abbbbbbbbbbbc","^(b+|a){1,2}c","\\1f\\1Ho",[])), +?line <<"bbbbbbbbbbbfbbbbbbbbbbbHo">> = iolist_to_binary(re:replace("abbbbbbbbbbbc","^(b+|a){1,2}c","\\1f\\1Ho",[global])), +?line <<"bbbbbbbbbbbacOuqvbbbbbbbbbbbaclVwIa">> = iolist_to_binary(re:replace("bbbbbbbbbbbac","^(b+|a){1,2}c","&Ouqv&lVwI\\1",[])), +?line <<"bbbbbbbbbbbacOuqvbbbbbbbbbbbaclVwIa">> = iolist_to_binary(re:replace("bbbbbbbbbbbac","^(b+|a){1,2}c","&Ouqv&lVwI\\1",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(b+|a){1,2}c","\\1sSSP\\1Tw&R&byI\\1TN",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(b+|a){1,2}c","\\1sSSP\\1Tw&R&byI\\1TN",[global])), +?line <<"aaac">> = iolist_to_binary(re:replace("aaac","^(b+|a){1,2}c","lBeqV\\1ygD\\1oXXqs",[])), +?line <<"aaac">> = iolist_to_binary(re:replace("aaac","^(b+|a){1,2}c","lBeqV\\1ygD\\1oXXqs",[global])), +?line <<"abbbbbbbbbbbac">> = iolist_to_binary(re:replace("abbbbbbbbbbbac","^(b+|a){1,2}c","HVL\\1kIEVrx\\1hyh\\1&eY\\1R",[])), +?line <<"abbbbbbbbbbbac">> = iolist_to_binary(re:replace("abbbbbbbbbbbac","^(b+|a){1,2}c","HVL\\1kIEVrx\\1hyh\\1&eY\\1R",[global])), +?line <<"ScHjJbbcrs">> = iolist_to_binary(re:replace("bbc","^(b+|a){1,2}?bc","ScHjJ&rs",[])), +?line <<"ScHjJbbcrs">> = iolist_to_binary(re:replace("bbc","^(b+|a){1,2}?bc","ScHjJ&rs",[global])), +?line <<"xbabcCeyVbabcbaXLUCoov">> = iolist_to_binary(re:replace("babc","^(b*|ba){1,2}?bc","x&CeyV&\\1XLUCoov",[])), +?line <<"xbabcCeyVbabcbaXLUCoov">> = iolist_to_binary(re:replace("babc","^(b*|ba){1,2}?bc","x&CeyV&\\1XLUCoov",[global])), +?line <<"HbPsbrWbbabcba">> = iolist_to_binary(re:replace("bbabc","^(b*|ba){1,2}?bc","HbPsbrW&\\1",[])), +?line <<"HbPsbrWbbabcba">> = iolist_to_binary(re:replace("bbabc","^(b*|ba){1,2}?bc","HbPsbrW&\\1",[global])), +?line <<"IpbababcRBSkmAw">> = iolist_to_binary(re:replace("bababc","^(b*|ba){1,2}?bc","Ip&RBSkmAw",[])), +?line <<"IpbababcRBSkmAw">> = iolist_to_binary(re:replace("bababc","^(b*|ba){1,2}?bc","Ip&RBSkmAw",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(b*|ba){1,2}?bc","e\\1\\1Tx",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(b*|ba){1,2}?bc","e\\1\\1Tx",[global])), +?line <<"bababbc">> = iolist_to_binary(re:replace("bababbc","^(b*|ba){1,2}?bc","llyNxYhfjNKiNYM\\1&Ko",[])), +?line <<"bababbc">> = iolist_to_binary(re:replace("bababbc","^(b*|ba){1,2}?bc","llyNxYhfjNKiNYM\\1&Ko",[global])), +?line <<"babababc">> = iolist_to_binary(re:replace("babababc","^(b*|ba){1,2}?bc","R&TKD\\1JpYJGqtjf",[])), +?line <<"babababc">> = iolist_to_binary(re:replace("babababc","^(b*|ba){1,2}?bc","R&TKD\\1JpYJGqtjf",[global])), +?line <<"babcfHFubaafbYLoJba">> = iolist_to_binary(re:replace("babc","^(ba|b*){1,2}?bc","&fHFu\\1afbYLoJ\\1",[])), +?line <<"babcfHFubaafbYLoJba">> = iolist_to_binary(re:replace("babc","^(ba|b*){1,2}?bc","&fHFu\\1afbYLoJ\\1",[global])), +?line <<"ewhbbabc">> = iolist_to_binary(re:replace("bbabc","^(ba|b*){1,2}?bc","ewh&",[])), +?line <<"ewhbbabc">> = iolist_to_binary(re:replace("bbabc","^(ba|b*){1,2}?bc","ewh&",[global])), +?line <<"L">> = iolist_to_binary(re:replace("bababc","^(ba|b*){1,2}?bc","L",[])), +?line <<"L">> = iolist_to_binary(re:replace("bababc","^(ba|b*){1,2}?bc","L",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(ba|b*){1,2}?bc","\\1wv",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(ba|b*){1,2}?bc","\\1wv",[global])), +?line <<"bababbc">> = iolist_to_binary(re:replace("bababbc","^(ba|b*){1,2}?bc","&F",[])), +?line <<"bababbc">> = iolist_to_binary(re:replace("bababbc","^(ba|b*){1,2}?bc","&F",[global])), +?line <<"babababc">> = iolist_to_binary(re:replace("babababc","^(ba|b*){1,2}?bc","Yk",[])), +?line <<"babababc">> = iolist_to_binary(re:replace("babababc","^(ba|b*){1,2}?bc","Yk",[global])), +?line <<"rdI;zTYuI;zcdx">> = iolist_to_binary(re:replace(";z","^\\ca\\cA\\c[\\c{\\c:","rdI&TYuI&cdx\\1",[])), +?line <<"rdI;zTYuI;zcdx">> = iolist_to_binary(re:replace(";z","^\\ca\\cA\\c[\\c{\\c:","rdI&TYuI&cdx\\1",[global])), +?line <<"XgOhHATXLthing">> = iolist_to_binary(re:replace("athing","^[ab\\]cde]","XgO\\1hHATXL",[])), +?line <<"XgOhHATXLthing">> = iolist_to_binary(re:replace("athing","^[ab\\]cde]","XgO\\1hHATXL",[global])), +?line <<"xIBYFthing">> = iolist_to_binary(re:replace("bthing","^[ab\\]cde]","xIBYF",[])), +?line <<"xIBYFthing">> = iolist_to_binary(re:replace("bthing","^[ab\\]cde]","xIBYF",[global])), +?line <<"]lthing">> = iolist_to_binary(re:replace("]thing","^[ab\\]cde]","&l",[])), +?line <<"]lthing">> = iolist_to_binary(re:replace("]thing","^[ab\\]cde]","&l",[global])), +?line <<"qbsthing">> = iolist_to_binary(re:replace("cthing","^[ab\\]cde]","\\1qbs",[])), +?line <<"qbsthing">> = iolist_to_binary(re:replace("cthing","^[ab\\]cde]","\\1qbs",[global])), +?line <<"gyOCYsthing">> = iolist_to_binary(re:replace("dthing","^[ab\\]cde]","gyOCYs",[])), +?line <<"gyOCYsthing">> = iolist_to_binary(re:replace("dthing","^[ab\\]cde]","gyOCYs",[global])), +?line <<"DrUmPIeSUthing">> = iolist_to_binary(re:replace("ething","^[ab\\]cde]","DrUmP\\1IeSU",[])), +?line <<"DrUmPIeSUthing">> = iolist_to_binary(re:replace("ething","^[ab\\]cde]","DrUmP\\1IeSU",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[ab\\]cde]","Xi\\1luACtdK",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[ab\\]cde]","Xi\\1luACtdK",[global])), +?line <<"fthing">> = iolist_to_binary(re:replace("fthing","^[ab\\]cde]","&u&Y\\1obNLU\\1tyonhH",[])), +?line <<"fthing">> = iolist_to_binary(re:replace("fthing","^[ab\\]cde]","&u&Y\\1obNLU\\1tyonhH",[global])), +?line <<"[thing">> = iolist_to_binary(re:replace("[thing","^[ab\\]cde]","TVEAE&ooeuGQJgKnrqW",[])), +?line <<"[thing">> = iolist_to_binary(re:replace("[thing","^[ab\\]cde]","TVEAE&ooeuGQJgKnrqW",[global])), +?line <<"\\thing">> = iolist_to_binary(re:replace("\\thing","^[ab\\]cde]","vRby\\1&",[])), +?line <<"\\thing">> = iolist_to_binary(re:replace("\\thing","^[ab\\]cde]","vRby\\1&",[global])), +?line <<"]n]ExaxasbKqYi]CHthing">> = iolist_to_binary(re:replace("]thing","^[]cde]","&n&Ex\\1axa\\1sbKqYi&CH",[])), +?line <<"]n]ExaxasbKqYi]CHthing">> = iolist_to_binary(re:replace("]thing","^[]cde]","&n&Ex\\1axa\\1sbKqYi&CH",[global])), +?line <<"nLnsthing">> = iolist_to_binary(re:replace("cthing","^[]cde]","nLns",[])), +?line <<"nLnsthing">> = iolist_to_binary(re:replace("cthing","^[]cde]","nLns",[global])), +?line <<"dOETLdnanQKLkkVthing">> = iolist_to_binary(re:replace("dthing","^[]cde]","\\1&OET\\1L&nanQKLkkV",[])), +?line <<"dOETLdnanQKLkkVthing">> = iolist_to_binary(re:replace("dthing","^[]cde]","\\1&OET\\1L&nanQKLkkV",[global])), +?line <<"UKthing">> = iolist_to_binary(re:replace("ething","^[]cde]","UK",[])), +?line <<"UKthing">> = iolist_to_binary(re:replace("ething","^[]cde]","UK",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[]cde]","OEN&h&RDky",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[]cde]","OEN&h&RDky",[global])), +?line <<"athing">> = iolist_to_binary(re:replace("athing","^[]cde]","ADIYuoD\\1PwBWBN",[])), +?line <<"athing">> = iolist_to_binary(re:replace("athing","^[]cde]","ADIYuoD\\1PwBWBN",[global])), +?line <<"fthing">> = iolist_to_binary(re:replace("fthing","^[]cde]","H&UGGJFd\\1Ys\\1xgEg",[])), +?line <<"fthing">> = iolist_to_binary(re:replace("fthing","^[]cde]","H&UGGJFd\\1Ys\\1xgEg",[global])), +?line <<"yipHChvHfthing">> = iolist_to_binary(re:replace("fthing","^[^ab\\]cde]","yi\\1pHC\\1hvH&",[])), +?line <<"yipHChvHfthing">> = iolist_to_binary(re:replace("fthing","^[^ab\\]cde]","yi\\1pHC\\1hvH&",[global])), +?line <<"pthing">> = iolist_to_binary(re:replace("[thing","^[^ab\\]cde]","p",[])), +?line <<"pthing">> = iolist_to_binary(re:replace("[thing","^[^ab\\]cde]","p",[global])), +?line <<"nvbthing">> = iolist_to_binary(re:replace("\\thing","^[^ab\\]cde]","n\\1v\\1b",[])), +?line <<"nvbthing">> = iolist_to_binary(re:replace("\\thing","^[^ab\\]cde]","n\\1v\\1b",[global])), +?line <<"o*r*CQayoALTVo** Failers">> = iolist_to_binary(re:replace("*** Failers","^[^ab\\]cde]","o&r&CQa\\1yoALTVo\\1",[])), +?line <<"o*r*CQayoALTVo** Failers">> = iolist_to_binary(re:replace("*** Failers","^[^ab\\]cde]","o&r&CQa\\1yoALTVo\\1",[global])), +?line <<"athing">> = iolist_to_binary(re:replace("athing","^[^ab\\]cde]","k\\1&MCQ",[])), +?line <<"athing">> = iolist_to_binary(re:replace("athing","^[^ab\\]cde]","k\\1&MCQ",[global])), +?line <<"bthing">> = iolist_to_binary(re:replace("bthing","^[^ab\\]cde]","XKeFQEPnv",[])), +?line <<"bthing">> = iolist_to_binary(re:replace("bthing","^[^ab\\]cde]","XKeFQEPnv",[global])), +?line <<"]thing">> = iolist_to_binary(re:replace("]thing","^[^ab\\]cde]","\\1",[])), +?line <<"]thing">> = iolist_to_binary(re:replace("]thing","^[^ab\\]cde]","\\1",[global])), +?line <<"cthing">> = iolist_to_binary(re:replace("cthing","^[^ab\\]cde]","NU",[])), +?line <<"cthing">> = iolist_to_binary(re:replace("cthing","^[^ab\\]cde]","NU",[global])), +?line <<"dthing">> = iolist_to_binary(re:replace("dthing","^[^ab\\]cde]","GVUo\\1m&I",[])), +?line <<"dthing">> = iolist_to_binary(re:replace("dthing","^[^ab\\]cde]","GVUo\\1m&I",[global])), +?line <<"ething">> = iolist_to_binary(re:replace("ething","^[^ab\\]cde]","Ms\\1&GwiawlCHng&EEX",[])), +?line <<"ething">> = iolist_to_binary(re:replace("ething","^[^ab\\]cde]","Ms\\1&GwiawlCHng&EEX",[global])), +?line <<"lqtFwcAYthing">> = iolist_to_binary(re:replace("athing","^[^]cde]","lqtFwcAY",[])), +?line <<"lqtFwcAYthing">> = iolist_to_binary(re:replace("athing","^[^]cde]","lqtFwcAY",[global])), +?line <<"Fxtpjthing">> = iolist_to_binary(re:replace("fthing","^[^]cde]","Fxt\\1pj",[])), +?line <<"Fxtpjthing">> = iolist_to_binary(re:replace("fthing","^[^]cde]","Fxt\\1pj",[global])), +?line <<"xT*oD*U** Failers">> = iolist_to_binary(re:replace("*** Failers","^[^]cde]","xT&oD\\1&U",[])), +?line <<"xT*oD*U** Failers">> = iolist_to_binary(re:replace("*** Failers","^[^]cde]","xT&oD\\1&U",[global])), +?line <<"]thing">> = iolist_to_binary(re:replace("]thing","^[^]cde]","R\\1M&\\1m",[])), +?line <<"]thing">> = iolist_to_binary(re:replace("]thing","^[^]cde]","R\\1M&\\1m",[global])), +?line <<"cthing">> = iolist_to_binary(re:replace("cthing","^[^]cde]","\\1tF\\1WOFN&fB",[])), +?line <<"cthing">> = iolist_to_binary(re:replace("cthing","^[^]cde]","\\1tF\\1WOFN&fB",[global])), +?line <<"dthing">> = iolist_to_binary(re:replace("dthing","^[^]cde]","y\\1I&MoqRPG&GQa\\1l",[])), +?line <<"dthing">> = iolist_to_binary(re:replace("dthing","^[^]cde]","y\\1I&MoqRPG&GQa\\1l",[global])), +?line <<"ething">> = iolist_to_binary(re:replace("ething","^[^]cde]","AsxwUn\\1GqkWNdgRJk",[])), +?line <<"ething">> = iolist_to_binary(re:replace("ething","^[^]cde]","AsxwUn\\1GqkWNdgRJk",[global])), +?line <<"RornKmOnaFrtWgtW">> = iolist_to_binary(re:replace("","^\\","R\\1o\\1r\\1nKmOnaFr&tWgtW",[])), +?line <<"RornKmOnaFrtWgtW">> = iolist_to_binary(re:replace("","^\\","R\\1o\\1r\\1nKmOnaFr&tWgtW",[global])), +?line <<"ufbmbfOYuKÿwfÿEÿdx">> = iolist_to_binary(re:replace("ÿ","^ÿ","ufbmbfOYuK&wf&E&\\1dx",[])), +?line <<"ufbmbfOYuKÿwfÿEÿdx">> = iolist_to_binary(re:replace("ÿ","^ÿ","ufbmbfOYuK&wf&E&\\1dx",[global])), +?line <<"oAdJme0jw">> = iolist_to_binary(re:replace("0","^[0-9]+$","oAdJme\\1&jw",[])), +?line <<"oAdJme0jw">> = iolist_to_binary(re:replace("0","^[0-9]+$","oAdJme\\1&jw",[global])), +?line <<"1aoKN">> = iolist_to_binary(re:replace("1","^[0-9]+$","&aoKN",[])), +?line <<"1aoKN">> = iolist_to_binary(re:replace("1","^[0-9]+$","&aoKN",[global])), +?line <<"tIHn">> = iolist_to_binary(re:replace("2","^[0-9]+$","tIHn\\1",[])), +?line <<"tIHn">> = iolist_to_binary(re:replace("2","^[0-9]+$","tIHn\\1",[global])), +?line <<"wgA3cJbrrCyMvMXM3">> = iolist_to_binary(re:replace("3","^[0-9]+$","wgA&cJbrrCyMv\\1M\\1XM&",[])), +?line <<"wgA3cJbrrCyMvMXM3">> = iolist_to_binary(re:replace("3","^[0-9]+$","wgA&cJbrrCyMv\\1M\\1XM&",[global])), +?line <<"huUpJ">> = iolist_to_binary(re:replace("4","^[0-9]+$","huUpJ",[])), +?line <<"huUpJ">> = iolist_to_binary(re:replace("4","^[0-9]+$","huUpJ",[global])), +?line <<"Fe5F5">> = iolist_to_binary(re:replace("5","^[0-9]+$","F\\1e&F&",[])), +?line <<"Fe5F5">> = iolist_to_binary(re:replace("5","^[0-9]+$","F\\1e&F&",[global])), +?line <<"HJ">> = iolist_to_binary(re:replace("6","^[0-9]+$","HJ",[])), +?line <<"HJ">> = iolist_to_binary(re:replace("6","^[0-9]+$","HJ",[global])), +?line <<"e">> = iolist_to_binary(re:replace("7","^[0-9]+$","e",[])), +?line <<"e">> = iolist_to_binary(re:replace("7","^[0-9]+$","e",[global])), +?line <<"Fmds88NtMX">> = iolist_to_binary(re:replace("8","^[0-9]+$","F\\1mds&&Nt\\1MX",[])), +?line <<"Fmds88NtMX">> = iolist_to_binary(re:replace("8","^[0-9]+$","F\\1mds&&Nt\\1MX",[global])), +?line <<"99cE9SqMch">> = iolist_to_binary(re:replace("9","^[0-9]+$","&&cE&\\1SqMch",[])), +?line <<"99cE9SqMch">> = iolist_to_binary(re:replace("9","^[0-9]+$","&&cE&\\1SqMch",[global])), +?line <<"xhR">> = iolist_to_binary(re:replace("10","^[0-9]+$","xhR",[])), +?line <<"xhR">> = iolist_to_binary(re:replace("10","^[0-9]+$","xhR",[global])), +?line <<"j100">> = iolist_to_binary(re:replace("100","^[0-9]+$","j&",[])), +?line <<"j100">> = iolist_to_binary(re:replace("100","^[0-9]+$","j&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[0-9]+$","SR&tOYsEgJid&hfCF",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[0-9]+$","SR&tOYsEgJid&hfCF",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","^[0-9]+$","JK&",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","^[0-9]+$","JK&",[global])), +?line <<"rXjkB">> = iolist_to_binary(re:replace("enter","^.*nter","rXjkB",[])), +?line <<"rXjkB">> = iolist_to_binary(re:replace("enter","^.*nter","rXjkB",[global])), +?line <<"oOEtqV">> = iolist_to_binary(re:replace("inter","^.*nter","oO\\1EtqV",[])), +?line <<"oOEtqV">> = iolist_to_binary(re:replace("inter","^.*nter","oO\\1EtqV",[global])), +?line <<"">> = iolist_to_binary(re:replace("uponter","^.*nter","\\1",[])), +?line <<"">> = iolist_to_binary(re:replace("uponter","^.*nter","\\1",[global])), +?line <<"SODUcOgFnbuQEN">> = iolist_to_binary(re:replace("xxx0","^xxx[0-9]+$","\\1\\1SODU\\1\\1cOgFnbuQEN",[])), +?line <<"SODUcOgFnbuQEN">> = iolist_to_binary(re:replace("xxx0","^xxx[0-9]+$","\\1\\1SODU\\1\\1cOgFnbuQEN",[global])), +?line <<"hsacOxxx1234kudxxx1234sEIrIdI">> = iolist_to_binary(re:replace("xxx1234","^xxx[0-9]+$","hsacO\\1&kud&s\\1EIrIdI\\1",[])), +?line <<"hsacOxxx1234kudxxx1234sEIrIdI">> = iolist_to_binary(re:replace("xxx1234","^xxx[0-9]+$","hsacO\\1&kud&s\\1EIrIdI\\1",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^xxx[0-9]+$","e",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^xxx[0-9]+$","e",[global])), +?line <<"xxx">> = iolist_to_binary(re:replace("xxx","^xxx[0-9]+$","oSBYD&M",[])), +?line <<"xxx">> = iolist_to_binary(re:replace("xxx","^xxx[0-9]+$","oSBYD&M",[global])), +?line <<"x123HgGUYCx123PowSBtYb">> = iolist_to_binary(re:replace("x123","^.+[0-9][0-9][0-9]$","&HgGUYC&PowSBtY\\1b",[])), +?line <<"x123HgGUYCx123PowSBtYb">> = iolist_to_binary(re:replace("x123","^.+[0-9][0-9][0-9]$","&HgGUYC&PowSBtY\\1b",[global])), +?line <<"mEVxx123SNuYPQIaJ">> = iolist_to_binary(re:replace("xx123","^.+[0-9][0-9][0-9]$","mE\\1V\\1&SNuYPQIa\\1J",[])), +?line <<"mEVxx123SNuYPQIaJ">> = iolist_to_binary(re:replace("xx123","^.+[0-9][0-9][0-9]$","mE\\1V\\1&SNuYPQIa\\1J",[global])), +?line <<"l123456O123456">> = iolist_to_binary(re:replace("123456","^.+[0-9][0-9][0-9]$","l&O&",[])), +?line <<"l123456O123456">> = iolist_to_binary(re:replace("123456","^.+[0-9][0-9][0-9]$","l&O&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^.+[0-9][0-9][0-9]$","MX&hxvs",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^.+[0-9][0-9][0-9]$","MX&hxvs",[global])), +?line <<"123">> = iolist_to_binary(re:replace("123","^.+[0-9][0-9][0-9]$","RBYgTXkgO&TLdWqjEUps",[])), +?line <<"123">> = iolist_to_binary(re:replace("123","^.+[0-9][0-9][0-9]$","RBYgTXkgO&TLdWqjEUps",[global])), +?line <<"fgx1234">> = iolist_to_binary(re:replace("x1234","^.+[0-9][0-9][0-9]$","fg&",[])), +?line <<"fgx1234">> = iolist_to_binary(re:replace("x1234","^.+[0-9][0-9][0-9]$","fg&",[global])), +?line <<"FLbkgx123RdPrD">> = iolist_to_binary(re:replace("x123","^.+?[0-9][0-9][0-9]$","FLbkg&R\\1dPrD",[])), +?line <<"FLbkgx123RdPrD">> = iolist_to_binary(re:replace("x123","^.+?[0-9][0-9][0-9]$","FLbkg&R\\1dPrD",[global])), +?line <<"C">> = iolist_to_binary(re:replace("xx123","^.+?[0-9][0-9][0-9]$","C",[])), +?line <<"C">> = iolist_to_binary(re:replace("xx123","^.+?[0-9][0-9][0-9]$","C",[global])), +?line <<"oWjVDKTAoaLU">> = iolist_to_binary(re:replace("123456","^.+?[0-9][0-9][0-9]$","oW\\1jVDK\\1TAoaLU",[])), +?line <<"oWjVDKTAoaLU">> = iolist_to_binary(re:replace("123456","^.+?[0-9][0-9][0-9]$","oW\\1jVDK\\1TAoaLU",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^.+?[0-9][0-9][0-9]$","xA&\\1sIV",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^.+?[0-9][0-9][0-9]$","xA&\\1sIV",[global])), +?line <<"123">> = iolist_to_binary(re:replace("123","^.+?[0-9][0-9][0-9]$","ONX&",[])), +?line <<"123">> = iolist_to_binary(re:replace("123","^.+?[0-9][0-9][0-9]$","ONX&",[global])), +?line <<"oLgQtiSmGx1234wqbuoRB">> = iolist_to_binary(re:replace("x1234","^.+?[0-9][0-9][0-9]$","\\1oLgQtiSm\\1\\1G&wqbuoRB",[])), +?line <<"oLgQtiSmGx1234wqbuoRB">> = iolist_to_binary(re:replace("x1234","^.+?[0-9][0-9][0-9]$","\\1oLgQtiSm\\1\\1G&wqbuoRB",[global])), +?line <<"mcpuCvaabc!pqr=apquxz.ixr.zzz.ac.ukgabc!pqr=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(re:replace("abc!pqr=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","mcpuCva&g&",[])), +?line <<"mcpuCvaabc!pqr=apquxz.ixr.zzz.ac.ukgabc!pqr=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(re:replace("abc!pqr=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","mcpuCva&g&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","J&a\\1HaapJjylMMyeA\\1e",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","J&a\\1HaapJjylMMyeA\\1e",[global])), +?line <<"!pqr=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(re:replace("!pqr=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","FOOFh&nQLU\\1c",[])), +?line <<"!pqr=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(re:replace("!pqr=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","FOOFh&nQLU\\1c",[global])), +?line <<"abc!=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(re:replace("abc!=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","H\\1G",[])), +?line <<"abc!=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(re:replace("abc!=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","H\\1G",[global])), +?line <<"abc!pqr=apquxz:ixr.zzz.ac.uk">> = iolist_to_binary(re:replace("abc!pqr=apquxz:ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","&tBS&",[])), +?line <<"abc!pqr=apquxz:ixr.zzz.ac.uk">> = iolist_to_binary(re:replace("abc!pqr=apquxz:ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","&tBS&",[global])), +?line <<"abc!pqr=apquxz.ixr.zzz.ac.ukk">> = iolist_to_binary(re:replace("abc!pqr=apquxz.ixr.zzz.ac.ukk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","Gd&\\1CN\\1",[])), +?line <<"abc!pqr=apquxz.ixr.zzz.ac.ukk">> = iolist_to_binary(re:replace("abc!pqr=apquxz.ixr.zzz.ac.ukk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$","Gd&\\1CN\\1",[global])), +?line <<"Well, we need a colonGTdcJbUips: somewhere">> = iolist_to_binary(re:replace("Well, we need a colon: somewhere",":","GTdc\\1J\\1bUips\\1&",[])), +?line <<"Well, we need a colonGTdcJbUips: somewhere">> = iolist_to_binary(re:replace("Well, we need a colon: somewhere",":","GTdc\\1J\\1bUips\\1&",[global])), +?line <<"*** Fail if we don't">> = iolist_to_binary(re:replace("*** Fail if we don't",":","d",[])), +?line <<"*** Fail if we don't">> = iolist_to_binary(re:replace("*** Fail if we don't",":","d",[global])), +?line <<"0abcDqVs0abc0abcptNR">> = iolist_to_binary(re:replace("0abc","([\\da-f:]+)$","\\1DqVs\\1\\1ptNR",[caseless])), +?line <<"0abcDqVs0abc0abcptNR">> = iolist_to_binary(re:replace("0abc","([\\da-f:]+)$","\\1DqVs\\1\\1ptNR",[caseless, + global])), +?line <<"abctJK">> = iolist_to_binary(re:replace("abc","([\\da-f:]+)$","&tJK",[caseless])), +?line <<"abctJK">> = iolist_to_binary(re:replace("abc","([\\da-f:]+)$","&tJK",[caseless, + global])), +?line <<"quighClnfedRB">> = iolist_to_binary(re:replace("fed","([\\da-f:]+)$","quighCln\\1RB",[caseless])), +?line <<"quighClnfedRB">> = iolist_to_binary(re:replace("fed","([\\da-f:]+)$","quighCln\\1RB",[caseless, + global])), +?line <<"ENd">> = iolist_to_binary(re:replace("E","([\\da-f:]+)$","\\1Nd",[caseless])), +?line <<"ENd">> = iolist_to_binary(re:replace("E","([\\da-f:]+)$","\\1Nd",[caseless, + global])), +?line <<"o::U::lkIj::XoRWPah::s">> = iolist_to_binary(re:replace("::","([\\da-f:]+)$","o&U&lkIj\\1XoRWPah&s",[caseless])), +?line <<"o::U::lkIj::XoRWPah::s">> = iolist_to_binary(re:replace("::","([\\da-f:]+)$","o&U&lkIj\\1XoRWPah&s",[caseless, + global])), +?line <<"ab5f03:12C0::932eONbt5f03:12C0::932ehnfLI5f03:12C0::932esqYx5f03:12C0::932e">> = iolist_to_binary(re:replace("5f03:12C0::932e","([\\da-f:]+)$","ab&ONbt\\1hnfLI\\1sqYx&",[caseless])), +?line <<"ab5f03:12C0::932eONbt5f03:12C0::932ehnfLI5f03:12C0::932esqYx5f03:12C0::932e">> = iolist_to_binary(re:replace("5f03:12C0::932e","([\\da-f:]+)$","ab&ONbt\\1hnfLI\\1sqYx&",[caseless, + global])), +?line <<"fed OAMdefijvdef">> = iolist_to_binary(re:replace("fed def","([\\da-f:]+)$","OAM\\1ijv&",[caseless])), +?line <<"fed OAMdefijvdef">> = iolist_to_binary(re:replace("fed def","([\\da-f:]+)$","OAM\\1ijv&",[caseless, + global])), +?line <<"Any old stuSVffaffeYffCjDlYffhWTMo">> = iolist_to_binary(re:replace("Any old stuff","([\\da-f:]+)$","SV&a\\1eY&CjDlY&hWTMo",[caseless])), +?line <<"Any old stuSVffaffeYffCjDlYffhWTMo">> = iolist_to_binary(re:replace("Any old stuff","([\\da-f:]+)$","SV&a\\1eY&CjDlY&hWTMo",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","([\\da-f:]+)$","j&R\\1oXiR",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","([\\da-f:]+)$","j&R\\1oXiR",[caseless, + global])), +?line <<"0zzz">> = iolist_to_binary(re:replace("0zzz","([\\da-f:]+)$","&HUuWH\\1&VEg",[caseless])), +?line <<"0zzz">> = iolist_to_binary(re:replace("0zzz","([\\da-f:]+)$","&HUuWH\\1&VEg",[caseless, + global])), +?line <<"gzzz">> = iolist_to_binary(re:replace("gzzz","([\\da-f:]+)$","l&n&p&DKUsLBFC",[caseless])), +?line <<"gzzz">> = iolist_to_binary(re:replace("gzzz","([\\da-f:]+)$","l&n&p&DKUsLBFC",[caseless, + global])), +?line <<"fed ">> = iolist_to_binary(re:replace("fed ","([\\da-f:]+)$","KuLffd&Y",[caseless])), +?line <<"fed ">> = iolist_to_binary(re:replace("fed ","([\\da-f:]+)$","KuLffd&Y",[caseless, + global])), +?line <<"Any old rubbish">> = iolist_to_binary(re:replace("Any old rubbish","([\\da-f:]+)$","Mid\\1",[caseless])), +?line <<"Any old rubbish">> = iolist_to_binary(re:replace("Any old rubbish","([\\da-f:]+)$","Mid\\1",[caseless, + global])), +?line <<"g.1.2.3WLxQ1s">> = iolist_to_binary(re:replace(".1.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","g&WLxQ\\1s",[])), +?line <<"g.1.2.3WLxQ1s">> = iolist_to_binary(re:replace(".1.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","g&WLxQ\\1s",[global])), +?line <<"12Oy">> = iolist_to_binary(re:replace("A.12.123.0","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","\\1Oy",[])), +?line <<"12Oy">> = iolist_to_binary(re:replace("A.12.123.0","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","\\1Oy",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","eX\\1nRbXcnyEu",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","eX\\1nRbXcnyEu",[global])), +?line <<".1.2.3333">> = iolist_to_binary(re:replace(".1.2.3333","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","&iIBylLhNq",[])), +?line <<".1.2.3333">> = iolist_to_binary(re:replace(".1.2.3333","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","&iIBylLhNq",[global])), +?line <<"1.2.3">> = iolist_to_binary(re:replace("1.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","\\1G&pFELr\\1\\1&\\1HPX",[])), +?line <<"1.2.3">> = iolist_to_binary(re:replace("1.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","\\1G&pFELr\\1\\1&\\1HPX",[global])), +?line <<"1234.2.3">> = iolist_to_binary(re:replace("1234.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","&qtoJnh\\1h",[])), +?line <<"1234.2.3">> = iolist_to_binary(re:replace("1234.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$","&qtoJnh\\1h",[global])), +?line <<"eaSBc111LbN">> = iolist_to_binary(re:replace("1 IN SOA non-sp1 non-sp2(","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$","eaSBc\\1\\1\\1LbN",[])), +?line <<"eaSBc111LbN">> = iolist_to_binary(re:replace("1 IN SOA non-sp1 non-sp2(","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$","eaSBc\\1\\1\\1LbN",[global])), +?line <<"1 IN SOA non-sp1 non-sp2 (yranl1 IN SOA non-sp1 non-sp2 (kU">> = iolist_to_binary(re:replace("1 IN SOA non-sp1 non-sp2 (","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$","&yranl&kU",[])), +?line <<"1 IN SOA non-sp1 non-sp2 (yranl1 IN SOA non-sp1 non-sp2 (kU">> = iolist_to_binary(re:replace("1 IN SOA non-sp1 non-sp2 (","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$","&yranl&kU",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$","W",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$","W",[global])), +?line <<"1IN SOA non-sp1 non-sp2(">> = iolist_to_binary(re:replace("1IN SOA non-sp1 non-sp2(","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$","UyNVyrR",[])), +?line <<"1IN SOA non-sp1 non-sp2(">> = iolist_to_binary(re:replace("1IN SOA non-sp1 non-sp2(","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$","UyNVyrR",[global])), +?line <<"pbeGIhIlhvhv">> = iolist_to_binary(re:replace("a.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","pbeGIhIl\\1hvhv",[])), +?line <<"pbeGIhIlhvhv">> = iolist_to_binary(re:replace("a.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","pbeGIhIl\\1hvhv",[global])), +?line <<"gFDyTxSYOppWiRv">> = iolist_to_binary(re:replace("Z.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","gFDyTxSYOppWiR\\1v",[])), +?line <<"gFDyTxSYOppWiRv">> = iolist_to_binary(re:replace("Z.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","gFDyTxSYOppWiR\\1v",[global])), +?line <<"HSc2.vOMD">> = iolist_to_binary(re:replace("2.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","HSc&\\1vO\\1MD\\1",[])), +?line <<"HSc2.vOMD">> = iolist_to_binary(re:replace("2.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","HSc&\\1vO\\1MD\\1",[global])), +?line <<".pq-rd.pq-rG.pq-rUab-c.pq-r.HCGaTI">> = iolist_to_binary(re:replace("ab-c.pq-r.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","\\1d\\1G\\1U&HCGaTI",[])), +?line <<".pq-rd.pq-rG.pq-rUab-c.pq-r.HCGaTI">> = iolist_to_binary(re:replace("ab-c.pq-r.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","\\1d\\1G\\1U&HCGaTI",[global])), +?line <<"RwF">> = iolist_to_binary(re:replace("sxk.zzz.ac.uk.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","RwF",[])), +?line <<"RwF">> = iolist_to_binary(re:replace("sxk.zzz.ac.uk.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","RwF",[global])), +?line <<"oAJdUx-.y-.GMx-.y-.iBCRNx-.y-.wBW">> = iolist_to_binary(re:replace("x-.y-.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","oAJdU&GM&iBCRN&wBW",[])), +?line <<"oAJdUx-.y-.GMx-.y-.iBCRNx-.y-.wBW">> = iolist_to_binary(re:replace("x-.y-.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","oAJdU&GM&iBCRN&wBW",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","wwA&\\1snkRSCcfnG&S",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","wwA&\\1snkRSCcfnG&S",[global])), +?line <<"-abc.peq.">> = iolist_to_binary(re:replace("-abc.peq.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","YaFu&cvVYqVy",[])), +?line <<"-abc.peq.">> = iolist_to_binary(re:replace("-abc.peq.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$","YaFu&cvVYqVy",[global])), +?line <<"*.aXojEWCW">> = iolist_to_binary(re:replace("*.a","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","&\\1XojEWCW",[])), +?line <<"*.aXojEWCW">> = iolist_to_binary(re:replace("*.a","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","&\\1XojEWCW",[global])), +?line <<"djXR0-a0-aFXv*.b0-awEtv">> = iolist_to_binary(re:replace("*.b0-a","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","djXR\\1\\1FXv&wEtv",[])), +?line <<"djXR0-a0-aFXv*.b0-awEtv">> = iolist_to_binary(re:replace("*.b0-a","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","djXR\\1\\1FXv&wEtv",[global])), +?line <<"*.c3-b.cregb">> = iolist_to_binary(re:replace("*.c3-b.c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","®b",[])), +?line <<"*.c3-b.cregb">> = iolist_to_binary(re:replace("*.c3-b.c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","®b",[global])), +?line <<"Vlm">> = iolist_to_binary(re:replace("*.c-a.b-c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","Vlm",[])), +?line <<"Vlm">> = iolist_to_binary(re:replace("*.c-a.b-c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","Vlm",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","Vxm\\1SKnM",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","Vxm\\1SKnM",[global])), +?line <<"*.0">> = iolist_to_binary(re:replace("*.0","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","n\\1",[])), +?line <<"*.0">> = iolist_to_binary(re:replace("*.0","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","n\\1",[global])), +?line <<"*.a-">> = iolist_to_binary(re:replace("*.a-","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","SbmRQSxio",[])), +?line <<"*.a-">> = iolist_to_binary(re:replace("*.a-","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","SbmRQSxio",[global])), +?line <<"*.a-b.c-">> = iolist_to_binary(re:replace("*.a-b.c-","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","xINKaLRww\\1&\\1",[])), +?line <<"*.a-b.c-">> = iolist_to_binary(re:replace("*.a-b.c-","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","xINKaLRww\\1&\\1",[global])), +?line <<"*.c-a.0-c">> = iolist_to_binary(re:replace("*.c-a.0-c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","akuY\\1pMWNGWjJ\\1oFTV\\1t",[])), +?line <<"*.c-a.0-c">> = iolist_to_binary(re:replace("*.c-a.0-c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$","akuY\\1pMWNGWjJ\\1oFTV\\1t",[global])), +?line <<"Dy">> = iolist_to_binary(re:replace("abde","^(?=ab(de))(abd)(e)","Dy",[])), +?line <<"Dy">> = iolist_to_binary(re:replace("abde","^(?=ab(de))(abd)(e)","Dy",[global])), +?line <<"Sf">> = iolist_to_binary(re:replace("abdf","^(?!(ab)de|x)(abd)(f)","Sf",[])), +?line <<"Sf">> = iolist_to_binary(re:replace("abdf","^(?!(ab)de|x)(abd)(f)","Sf",[global])), +?line <<"IabcdJcd">> = iolist_to_binary(re:replace("abcd","^(?=(ab(cd)))(ab)","I\\1J",[])), +?line <<"IabcdJcd">> = iolist_to_binary(re:replace("abcd","^(?=(ab(cd)))(ab)","I\\1J",[global])), +?line <<"rvnE.d">> = iolist_to_binary(re:replace("a.b.c.d","^[\\da-f](\\.[\\da-f])*$","rvnE\\1",[caseless])), +?line <<"rvnE.d">> = iolist_to_binary(re:replace("a.b.c.d","^[\\da-f](\\.[\\da-f])*$","rvnE\\1",[caseless, + global])), +?line <<"niA.B.C.DL.DCGxjcuA.B.C.DhA.B.C.DT.DA.B.C.D.DM">> = iolist_to_binary(re:replace("A.B.C.D","^[\\da-f](\\.[\\da-f])*$","ni&L\\1CGxjcu&h&T\\1&\\1M",[caseless])), +?line <<"niA.B.C.DL.DCGxjcuA.B.C.DhA.B.C.DT.DA.B.C.D.DM">> = iolist_to_binary(re:replace("A.B.C.D","^[\\da-f](\\.[\\da-f])*$","ni&L\\1CGxjcu&h&T\\1&\\1M",[caseless, + global])), +?line <<"wARa.b.c.1.2.3.Ca.b.c.1.2.3.C.CpUAa.b.c.1.2.3.Cg">> = iolist_to_binary(re:replace("a.b.c.1.2.3.C","^[\\da-f](\\.[\\da-f])*$","wAR&&\\1pUA&g",[caseless])), +?line <<"wARa.b.c.1.2.3.Ca.b.c.1.2.3.C.CpUAa.b.c.1.2.3.Cg">> = iolist_to_binary(re:replace("a.b.c.1.2.3.C","^[\\da-f](\\.[\\da-f])*$","wAR&&\\1pUA&g",[caseless, + global])), +?line <<"a">> = iolist_to_binary(re:replace("\"1234\"","^\\\".*\\\"\\s*(;.*)?$","\\1a",[])), +?line <<"a">> = iolist_to_binary(re:replace("\"1234\"","^\\\".*\\\"\\s*(;.*)?$","\\1a",[global])), +?line <<"CIv">> = iolist_to_binary(re:replace("\"abcd\" ;","^\\\".*\\\"\\s*(;.*)?$","CIv",[])), +?line <<"CIv">> = iolist_to_binary(re:replace("\"abcd\" ;","^\\\".*\\\"\\s*(;.*)?$","CIv",[global])), +?line <<"; rhubarbK">> = iolist_to_binary(re:replace("\"\" ; rhubarb","^\\\".*\\\"\\s*(;.*)?$","\\1K",[])), +?line <<"; rhubarbK">> = iolist_to_binary(re:replace("\"\" ; rhubarb","^\\\".*\\\"\\s*(;.*)?$","\\1K",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^\\\".*\\\"\\s*(;.*)?$","aWrdsUS\\1QSjQ&dFoGfF",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^\\\".*\\\"\\s*(;.*)?$","aWrdsUS\\1QSjQ&dFoGfF",[global])), +?line <<"\"1234\" : things">> = iolist_to_binary(re:replace("\"1234\" : things","^\\\".*\\\"\\s*(;.*)?$","khMGlmiUM&d\\1\\1GGb",[])), +?line <<"\"1234\" : things">> = iolist_to_binary(re:replace("\"1234\" : things","^\\\".*\\\"\\s*(;.*)?$","khMGlmiUM&d\\1\\1GGb",[global])), +?line <<"ddsaVnvP">> = iolist_to_binary(re:replace("","^$","ddsaVnvP",[])), +?line <<"ddsaVnvP">> = iolist_to_binary(re:replace("","^$","ddsaVnvP",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^$","d\\1yl\\1chv&DYUrRBp",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^$","d\\1yl\\1chv&DYUrRBp",[global])), +?line <<"ubIEeu">> = iolist_to_binary(re:replace("ab c"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","ubIEeu",[extended])), +?line <<"ubIEeu">> = iolist_to_binary(re:replace("ab c"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","ubIEeu",[extended, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","hTyFd&e\\1&PttRSXjwggW",[extended])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","hTyFd&e\\1&PttRSXjwggW",[extended, + global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","RUKr",[extended])), +?line <<"abc">> = iolist_to_binary(re:replace("abc"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","RUKr",[extended, + global])), +?line <<"ab cde">> = iolist_to_binary(re:replace("ab cde"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","&wELTyPo&oJqp&vLg\\1T",[extended])), +?line <<"ab cde">> = iolist_to_binary(re:replace("ab cde"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","&wELTyPo&oJqp&vLg\\1T",[extended, + global])), +?line <<"NNDSkqab cNfQkVqmWj">> = iolist_to_binary(re:replace("ab c","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","NN\\1DSk\\1q&NfQkVqmWj",[])), +?line <<"NNDSkqab cNfQkVqmWj">> = iolist_to_binary(re:replace("ab c","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","NN\\1DSk\\1q&NfQkVqmWj",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","vkwk\\1js\\1pepFK\\1\\1Wa&g",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","vkwk\\1js\\1pepFK\\1\\1Wa&g",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","\\1&fYSPEB",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","\\1&fYSPEB",[global])), +?line <<"ab cde">> = iolist_to_binary(re:replace("ab cde","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","\\1D\\1\\1\\1by&lUP\\1jTlVc",[])), +?line <<"ab cde">> = iolist_to_binary(re:replace("ab cde","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)","\\1D\\1\\1\\1by&lUP\\1jTlVc",[global])), +?line <<"Pca bcdDXLbDTDa bcdja bcdTa bcdX">> = iolist_to_binary(re:replace("a bcd","^ a\\ b[c ]d $","Pc&DXLbDTD&j&T&X\\1",[extended])), +?line <<"Pca bcdDXLbDTDa bcdja bcdTa bcdX">> = iolist_to_binary(re:replace("a bcd","^ a\\ b[c ]d $","Pc&DXLbDTD&j&T&X\\1",[extended, + global])), +?line <<"cbruWa b dWvF">> = iolist_to_binary(re:replace("a b d","^ a\\ b[c ]d $","cbruW&WvF\\1",[extended])), +?line <<"cbruWa b dWvF">> = iolist_to_binary(re:replace("a b d","^ a\\ b[c ]d $","cbruW&WvF\\1",[extended, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^ a\\ b[c ]d $","xLsLvmNGGbWjEqU\\1q",[extended])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^ a\\ b[c ]d $","xLsLvmNGGbWjEqU\\1q",[extended, + global])), +?line <<"abcd">> = iolist_to_binary(re:replace("abcd","^ a\\ b[c ]d $","QvID",[extended])), +?line <<"abcd">> = iolist_to_binary(re:replace("abcd","^ a\\ b[c ]d $","QvID",[extended, + global])), +?line <<"ab d">> = iolist_to_binary(re:replace("ab d","^ a\\ b[c ]d $","CEUu&Jt",[extended])), +?line <<"ab d">> = iolist_to_binary(re:replace("ab d","^ a\\ b[c ]d $","CEUu&Jt",[extended, + global])), +?line <<"ohu">> = iolist_to_binary(re:replace("abcdefhijklm","^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$","ohu",[])), +?line <<"ohu">> = iolist_to_binary(re:replace("abcdefhijklm","^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$","ohu",[global])), +?line <<"rbcmNabcdefhijklmabcdefhijklmNGkLNbcabcdefhijklmxnbclO">> = iolist_to_binary(re:replace("abcdefhijklm","^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$","r\\1mN&&NGkLN\\1&xn\\1lO",[])), +?line <<"rbcmNabcdefhijklmabcdefhijklmNGkLNbcabcdefhijklmxnbclO">> = iolist_to_binary(re:replace("abcdefhijklm","^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$","r\\1mN&&NGkLN\\1&xn\\1lO",[global])), +?line <<"I">> = iolist_to_binary(re:replace("a+ Z0+ +","^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]","I",[])), +?line <<"I">> = iolist_to_binary(re:replace("a+ Z0+ +","^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]","I",[global])), +?line <<"ANdwkyHnc">> = iolist_to_binary(re:replace(".^$(*+)|{?,?}","^[.^$|()*+?{,}]+","ANdwkyHnc",[])), +?line <<"ANdwkyHnc">> = iolist_to_binary(re:replace(".^$(*+)|{?,?}","^[.^$|()*+?{,}]+","ANdwkyHnc",[global])), +?line <<"Dx">> = iolist_to_binary(re:replace("z","^a*\\w","Dx",[])), +?line <<"Dx">> = iolist_to_binary(re:replace("z","^a*\\w","Dx",[global])), +?line <<"OpVTjQkTaz">> = iolist_to_binary(re:replace("az","^a*\\w","OpVTjQkT&",[])), +?line <<"OpVTjQkTaz">> = iolist_to_binary(re:replace("az","^a*\\w","OpVTjQkT&",[global])), +?line <<"LexbuooAmFDifW">> = iolist_to_binary(re:replace("aaaz","^a*\\w","LexbuooAm\\1FDifW",[])), +?line <<"LexbuooAmFDifW">> = iolist_to_binary(re:replace("aaaz","^a*\\w","LexbuooAm\\1FDifW",[global])), +?line <<"arpLCDAadYpPkb">> = iolist_to_binary(re:replace("a","^a*\\w","arpLCDAadYpPk\\1b",[])), +?line <<"arpLCDAadYpPkb">> = iolist_to_binary(re:replace("a","^a*\\w","arpLCDAadYpPk\\1b",[global])), +?line <<"CyElaaTHfV">> = iolist_to_binary(re:replace("aa","^a*\\w","CyEl&T\\1HfV",[])), +?line <<"CyElaaTHfV">> = iolist_to_binary(re:replace("aa","^a*\\w","CyEl&T\\1HfV",[global])), +?line <<"v">> = iolist_to_binary(re:replace("aaaa","^a*\\w","v\\1\\1",[])), +?line <<"v">> = iolist_to_binary(re:replace("aaaa","^a*\\w","v\\1\\1",[global])), +?line <<"COSWtMTXCLic+">> = iolist_to_binary(re:replace("a+","^a*\\w","COSWtMTXCLic",[])), +?line <<"COSWtMTXCLic+">> = iolist_to_binary(re:replace("a+","^a*\\w","COSWtMTXCLic",[global])), +?line <<"kaaDuaauKGaaIaaFUK+">> = iolist_to_binary(re:replace("aa+","^a*\\w","k&Du&uKG\\1&I&FU\\1\\1K\\1",[])), +?line <<"kaaDuaauKGaaIaaFUK+">> = iolist_to_binary(re:replace("aa+","^a*\\w","k&Du&uKG\\1&I&FU\\1\\1K\\1",[global])), +?line <<"Pttz">> = iolist_to_binary(re:replace("z","^a*?\\w","Ptt&",[])), +?line <<"Pttz">> = iolist_to_binary(re:replace("z","^a*?\\w","Ptt&",[global])), +?line <<"QEHxyFSkkaz">> = iolist_to_binary(re:replace("az","^a*?\\w","QEHxyFSkk&",[])), +?line <<"QEHxyFSkkaz">> = iolist_to_binary(re:replace("az","^a*?\\w","QEHxyFSkk&",[global])), +?line <<"atHEjpaKrKaaz">> = iolist_to_binary(re:replace("aaaz","^a*?\\w","&tHE\\1jp&KrK",[])), +?line <<"atHEjpaKrKaaz">> = iolist_to_binary(re:replace("aaaz","^a*?\\w","&tHE\\1jp&KrK",[global])), +?line <<"YaSeqaaeBiLO">> = iolist_to_binary(re:replace("a","^a*?\\w","Y&Seq\\1&&eBiLO",[])), +?line <<"YaSeqaaeBiLO">> = iolist_to_binary(re:replace("a","^a*?\\w","Y&Seq\\1&&eBiLO",[global])), +?line <<"UlaGeGnImSoQaHibARka">> = iolist_to_binary(re:replace("aa","^a*?\\w","Ul&GeGnImSoQ&HibARk",[])), +?line <<"UlaGeGnImSoQaHibARka">> = iolist_to_binary(re:replace("aa","^a*?\\w","Ul&GeGnImSoQ&HibARk",[global])), +?line <<"upDbxncvqbwvaaa">> = iolist_to_binary(re:replace("aaaa","^a*?\\w","upDbxncvqb\\1wv",[])), +?line <<"upDbxncvqbwvaaa">> = iolist_to_binary(re:replace("aaaa","^a*?\\w","upDbxncvqb\\1wv",[global])), +?line <<"MalqdUPrj+">> = iolist_to_binary(re:replace("a+","^a*?\\w","M&\\1lqdUPr\\1j\\1\\1",[])), +?line <<"MalqdUPrj+">> = iolist_to_binary(re:replace("a+","^a*?\\w","M&\\1lqdUPr\\1j\\1\\1",[global])), +?line <<"JTa+">> = iolist_to_binary(re:replace("aa+","^a*?\\w","JT",[])), +?line <<"JTa+">> = iolist_to_binary(re:replace("aa+","^a*?\\w","JT",[global])), +?line <<"nnvJUazdlV">> = iolist_to_binary(re:replace("az","^a+\\w","\\1nnvJU&dlV",[])), +?line <<"nnvJUazdlV">> = iolist_to_binary(re:replace("az","^a+\\w","\\1nnvJU&dlV",[global])), +?line <<"aaaz">> = iolist_to_binary(re:replace("aaaz","^a+\\w","\\1&",[])), +?line <<"aaaz">> = iolist_to_binary(re:replace("aaaz","^a+\\w","\\1&",[global])), +?line <<"daaRBaauOlL">> = iolist_to_binary(re:replace("aa","^a+\\w","d&RB&uO\\1lL",[])), +?line <<"daaRBaauOlL">> = iolist_to_binary(re:replace("aa","^a+\\w","d&RB&uO\\1lL",[global])), +?line <<"uaaaajkPXJqfBddNNYaaaa">> = iolist_to_binary(re:replace("aaaa","^a+\\w","u&jkPXJqfBddNNY&",[])), +?line <<"uaaaajkPXJqfBddNNYaaaa">> = iolist_to_binary(re:replace("aaaa","^a+\\w","u&jkPXJqfBddNNY&",[global])), +?line <<"YAJlePYgQb+">> = iolist_to_binary(re:replace("aa+","^a+\\w","YAJlePYgQb",[])), +?line <<"YAJlePYgQb+">> = iolist_to_binary(re:replace("aa+","^a+\\w","YAJlePYgQb",[global])), +?line <<"MXsW">> = iolist_to_binary(re:replace("az","^a+?\\w","MXsW",[])), +?line <<"MXsW">> = iolist_to_binary(re:replace("az","^a+?\\w","MXsW",[global])), +?line <<"GaaMGsaaPiMScaz">> = iolist_to_binary(re:replace("aaaz","^a+?\\w","G&MGs&P\\1i\\1MSc",[])), +?line <<"GaaMGsaaPiMScaz">> = iolist_to_binary(re:replace("aaaz","^a+?\\w","G&MGs&P\\1i\\1MSc",[global])), +?line <<"aaYUHgT">> = iolist_to_binary(re:replace("aa","^a+?\\w","&YUHgT",[])), +?line <<"aaYUHgT">> = iolist_to_binary(re:replace("aa","^a+?\\w","&YUHgT",[global])), +?line <<"ePknVhaa">> = iolist_to_binary(re:replace("aaaa","^a+?\\w","ePknVh\\1",[])), +?line <<"ePknVhaa">> = iolist_to_binary(re:replace("aaaa","^a+?\\w","ePknVh\\1",[global])), +?line <<"+">> = iolist_to_binary(re:replace("aa+","^a+?\\w","\\1",[])), +?line <<"+">> = iolist_to_binary(re:replace("aa+","^a+?\\w","\\1",[global])), +?line <<"AFRGuhtn1234567890rEtjU">> = iolist_to_binary(re:replace("1234567890","^\\d{8}\\w{2,}","\\1AFRGuhtn&rEtjU",[])), +?line <<"AFRGuhtn1234567890rEtjU">> = iolist_to_binary(re:replace("1234567890","^\\d{8}\\w{2,}","\\1AFRGuhtn&rEtjU",[global])), +?line <<"nNSL12345678abRY">> = iolist_to_binary(re:replace("12345678ab","^\\d{8}\\w{2,}","nNSL&RY",[])), +?line <<"nNSL12345678abRY">> = iolist_to_binary(re:replace("12345678ab","^\\d{8}\\w{2,}","nNSL&RY",[global])), +?line <<"12345678__JUDy">> = iolist_to_binary(re:replace("12345678__","^\\d{8}\\w{2,}","&JUDy",[])), +?line <<"12345678__JUDy">> = iolist_to_binary(re:replace("12345678__","^\\d{8}\\w{2,}","&JUDy",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^\\d{8}\\w{2,}","&OcK\\1P&XNvgrP",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^\\d{8}\\w{2,}","&OcK\\1P&XNvgrP",[global])), +?line <<"1234567">> = iolist_to_binary(re:replace("1234567","^\\d{8}\\w{2,}","&Mo",[])), +?line <<"1234567">> = iolist_to_binary(re:replace("1234567","^\\d{8}\\w{2,}","&Mo",[global])), +?line <<"O">> = iolist_to_binary(re:replace("uoie","^[aeiou\\d]{4,5}$","O",[])), +?line <<"O">> = iolist_to_binary(re:replace("uoie","^[aeiou\\d]{4,5}$","O",[global])), +?line <<"1234b1234n">> = iolist_to_binary(re:replace("1234","^[aeiou\\d]{4,5}$","&b&n",[])), +?line <<"1234b1234n">> = iolist_to_binary(re:replace("1234","^[aeiou\\d]{4,5}$","&b&n",[global])), +?line <<"YBp12345Ul">> = iolist_to_binary(re:replace("12345","^[aeiou\\d]{4,5}$","YBp&Ul",[])), +?line <<"YBp12345Ul">> = iolist_to_binary(re:replace("12345","^[aeiou\\d]{4,5}$","YBp&Ul",[global])), +?line <<"SVHQqBtcrMAtQxy">> = iolist_to_binary(re:replace("aaaaa","^[aeiou\\d]{4,5}$","SVHQqBtcrMAtQxy\\1",[])), +?line <<"SVHQqBtcrMAtQxy">> = iolist_to_binary(re:replace("aaaaa","^[aeiou\\d]{4,5}$","SVHQqBtcrMAtQxy\\1",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[aeiou\\d]{4,5}$","ne",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[aeiou\\d]{4,5}$","ne",[global])), +?line <<"123456">> = iolist_to_binary(re:replace("123456","^[aeiou\\d]{4,5}$","QA&F\\1LJ",[])), +?line <<"123456">> = iolist_to_binary(re:replace("123456","^[aeiou\\d]{4,5}$","QA&F\\1LJ",[global])), +?line <<"gKGpFvTeUK">> = iolist_to_binary(re:replace("uoie","^[aeiou\\d]{4,5}?","gKGpFvTeUK",[])), +?line <<"gKGpFvTeUK">> = iolist_to_binary(re:replace("uoie","^[aeiou\\d]{4,5}?","gKGpFvTeUK",[global])), +?line <<"LCEqvLxHGWXWrexD">> = iolist_to_binary(re:replace("1234","^[aeiou\\d]{4,5}?","LCE\\1qvL\\1xHGWXWrexD",[])), +?line <<"LCEqvLxHGWXWrexD">> = iolist_to_binary(re:replace("1234","^[aeiou\\d]{4,5}?","LCE\\1qvL\\1xHGWXWrexD",[global])), +?line <<"QWV1234vhndnkkT1234l5">> = iolist_to_binary(re:replace("12345","^[aeiou\\d]{4,5}?","\\1QWV&\\1vhndnkk\\1T&l",[])), +?line <<"QWV1234vhndnkkT1234l5">> = iolist_to_binary(re:replace("12345","^[aeiou\\d]{4,5}?","\\1QWV&\\1vhndnkk\\1T&l",[global])), +?line <<"aaaaIaaaayaaaaEoAPYra">> = iolist_to_binary(re:replace("aaaaa","^[aeiou\\d]{4,5}?","&I&y&E\\1oAPYr",[])), +?line <<"aaaaIaaaayaaaaEoAPYra">> = iolist_to_binary(re:replace("aaaaa","^[aeiou\\d]{4,5}?","&I&y&E\\1oAPYr",[global])), +?line <<"xKUWgRs56">> = iolist_to_binary(re:replace("123456","^[aeiou\\d]{4,5}?","xKUWgRs",[])), +?line <<"xKUWgRs56">> = iolist_to_binary(re:replace("123456","^[aeiou\\d]{4,5}?","xKUWgRs",[global])), +?line <<"JlUywcabcvRabcPFPabcYSXE">> = iolist_to_binary(re:replace("abc=abcabc","\\A(abc|def)=(\\1){2,3}\\Z","JlUywc\\1vR\\1PFP\\1YSXE",[])), +?line <<"JlUywcabcvRabcPFPabcYSXE">> = iolist_to_binary(re:replace("abc=abcabc","\\A(abc|def)=(\\1){2,3}\\Z","JlUywc\\1vR\\1PFP\\1YSXE",[global])), +?line <<"def=defdefdefbucdef=defdefdef">> = iolist_to_binary(re:replace("def=defdefdef","\\A(abc|def)=(\\1){2,3}\\Z","&buc&",[])), +?line <<"def=defdefdefbucdef=defdefdef">> = iolist_to_binary(re:replace("def=defdefdef","\\A(abc|def)=(\\1){2,3}\\Z","&buc&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\A(abc|def)=(\\1){2,3}\\Z","AYuyHUCDlwjQc\\1OS",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\A(abc|def)=(\\1){2,3}\\Z","AYuyHUCDlwjQc\\1OS",[global])), +?line <<"abc=defdef">> = iolist_to_binary(re:replace("abc=defdef","\\A(abc|def)=(\\1){2,3}\\Z","PM&h\\1\\1xD\\1&",[])), +?line <<"abc=defdef">> = iolist_to_binary(re:replace("abc=defdef","\\A(abc|def)=(\\1){2,3}\\Z","PM&h\\1\\1xD\\1&",[global])), +?line <<"UFhaagoHObvFc">> = iolist_to_binary(re:replace("abcdefghijkcda2","^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$","UFh\\1\\1goHObvFc",[])), +?line <<"UFhaagoHObvFc">> = iolist_to_binary(re:replace("abcdefghijkcda2","^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$","UFh\\1\\1goHObvFc",[global])), +?line <<"aabcdefghijkkkkcda2abcdefghijkkkkcda2abcdefghijkkkkcda2vuYabcdefghijkkkkcda2xdabcdefghijkkkkcda2njaJQEF">> = iolist_to_binary(re:replace("abcdefghijkkkkcda2","^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$","\\1&&&vuY&xd&nj\\1JQEF",[])), +?line <<"aabcdefghijkkkkcda2abcdefghijkkkkcda2abcdefghijkkkkcda2vuYabcdefghijkkkkcda2xdabcdefghijkkkkcda2njaJQEF">> = iolist_to_binary(re:replace("abcdefghijkkkkcda2","^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$","\\1&&&vuY&xd&nj\\1JQEF",[global])), +?line <<"mcataractcataract cataract23YTkMcataract cataract23">> = iolist_to_binary(re:replace("cataract cataract23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)","m\\1&YTkM&",[])), +?line <<"mcataractcataract cataract23YTkMcataract cataract23">> = iolist_to_binary(re:replace("cataract cataract23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)","m\\1&YTkM&",[global])), +?line <<"OXcatatonicoHKaXHQpryKFyhVcatatonic">> = iolist_to_binary(re:replace("catatonic catatonic23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)","OX\\1oHKaXHQpryKFyhV\\1",[])), +?line <<"OXcatatonicoHKaXHQpryKFyhVcatatonic">> = iolist_to_binary(re:replace("catatonic catatonic23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)","OX\\1oHKaXHQpryKFyhV\\1",[global])), +?line <<"caterpillarcaterpillar caterpillar23foVlhvplLSebcaterpillar">> = iolist_to_binary(re:replace("caterpillar caterpillar23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)","\\1&foVlhvplLSeb\\1",[])), +?line <<"caterpillarcaterpillar caterpillar23foVlhvplLSebcaterpillar">> = iolist_to_binary(re:replace("caterpillar caterpillar23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)","\\1&foVlhvplLSeb\\1",[global])), +?line <<"From abcd Mon Sep 01 12:33TNVlANgYabcdabcdFrom abcd Mon Sep 01 12:33aIFrom abcd Mon Sep 01 12:33TqsabcdQ:02 1997">> = iolist_to_binary(re:replace("From abcd Mon Sep 01 12:33:02 1997","^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]","&TNVlANgY\\1\\1&aI&Tqs\\1Q",[])), +?line <<"From abcd Mon Sep 01 12:33TNVlANgYabcdabcdFrom abcd Mon Sep 01 12:33aIFrom abcd Mon Sep 01 12:33TqsabcdQ:02 1997">> = iolist_to_binary(re:replace("From abcd Mon Sep 01 12:33:02 1997","^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]","&TNVlANgY\\1\\1&aI&Tqs\\1Q",[global])), +?line <<"isKrFrom abcd Mon Sep 01 12:33:02 1997">> = iolist_to_binary(re:replace("From abcd Mon Sep 01 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d","isKr&",[])), +?line <<"isKrFrom abcd Mon Sep 01 12:33:02 1997">> = iolist_to_binary(re:replace("From abcd Mon Sep 01 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d","isKr&",[global])), +?line <<"lNtEJS:02 1997">> = iolist_to_binary(re:replace("From abcd Mon Sep 1 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d","lNtEJS",[])), +?line <<"lNtEJS:02 1997">> = iolist_to_binary(re:replace("From abcd Mon Sep 1 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d","lNtEJS",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d","aR\\1i&Fxe",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d","aR\\1i&Fxe",[global])), +?line <<"From abcd Sep 01 12:33:02 1997">> = iolist_to_binary(re:replace("From abcd Sep 01 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d","\\1NsrJ&\\1&PtWlXT",[])), +?line <<"From abcd Sep 01 12:33:02 1997">> = iolist_to_binary(re:replace("From abcd Sep 01 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d","\\1NsrJ&\\1&PtWlXT",[global])), +?line <<"nGixKixjMO12 +34BhoReSp">> = iolist_to_binary(re:replace("12 +34","^12.34","nGixKixjMO&BhoReSp",[dotall])), +?line <<"nGixKixjMO12 +34BhoReSp">> = iolist_to_binary(re:replace("12 +34","^12.34","nGixKixjMO&BhoReSp",[dotall,global])), +?line <<"12 34OBfpF12 3412 34fh">> = iolist_to_binary(re:replace("12 34","^12.34","&OBfpF&&fh",[dotall])), +?line <<"12 34OBfpF12 3412 34fh">> = iolist_to_binary(re:replace("12 34","^12.34","&OBfpF&&fh",[dotall, + global])), +?line <<"the quick brownhubrownbrownubrownQ fox">> = iolist_to_binary(re:replace("the quick brown fox","\\w+(?=\\t)","&hu&&u&Q",[])), +?line <<"the quick brownhubrownbrownubrownQ fox">> = iolist_to_binary(re:replace("the quick brown fox","\\w+(?=\\t)","&hu&&u&Q",[global])), +?line <<"foobar is uqH">> = iolist_to_binary(re:replace("foobar is foolish see?","foo(?!bar)(.*)","uqH",[])), +?line <<"foobar is uqH">> = iolist_to_binary(re:replace("foobar is foolish see?","foo(?!bar)(.*)","uqH",[global])), +?line <<"foobar cn">> = iolist_to_binary(re:replace("foobar crowbar etc","(?:(?!foo)...|^.{0,2})bar(.*)","n",[])), +?line <<"foobar cn">> = iolist_to_binary(re:replace("foobar crowbar etc","(?:(?!foo)...|^.{0,2})bar(.*)","n",[global])), +?line <<"CpDjibh">> = iolist_to_binary(re:replace("barrel","(?:(?!foo)...|^.{0,2})bar(.*)","CpDjibh",[])), +?line <<"CpDjibh">> = iolist_to_binary(re:replace("barrel","(?:(?!foo)...|^.{0,2})bar(.*)","CpDjibh",[global])), +?line <<"wlcfLrelprelgrelD">> = iolist_to_binary(re:replace("2barrel","(?:(?!foo)...|^.{0,2})bar(.*)","wlcfL\\1p\\1g\\1D",[])), +?line <<"wlcfLrelprelgrelD">> = iolist_to_binary(re:replace("2barrel","(?:(?!foo)...|^.{0,2})bar(.*)","wlcfL\\1p\\1g\\1D",[global])), +?line <<"wbDA barrelYA barrelcQA barrelplrelA barrelXPrel">> = iolist_to_binary(re:replace("A barrel","(?:(?!foo)...|^.{0,2})bar(.*)","wbD&Y&cQ&pl\\1&XP\\1",[])), +?line <<"wbDA barrelYA barrelcQA barrelplrelA barrelXPrel">> = iolist_to_binary(re:replace("A barrel","(?:(?!foo)...|^.{0,2})bar(.*)","wbD&Y&cQ&pl\\1&XP\\1",[global])), +?line <<"PJMqUabctmoSPC456">> = iolist_to_binary(re:replace("abc456","^(\\D*)(?=\\d)(?!123)","PJMqU\\1tmoSPC",[])), +?line <<"PJMqUabctmoSPC456">> = iolist_to_binary(re:replace("abc456","^(\\D*)(?=\\d)(?!123)","PJMqU\\1tmoSPC",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(\\D*)(?=\\d)(?!123)","k\\1&lgXOi",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(\\D*)(?=\\d)(?!123)","k\\1&lgXOi",[global])), +?line <<"abc123">> = iolist_to_binary(re:replace("abc123","^(\\D*)(?=\\d)(?!123)","UgE&XTVNX&ygyaQdYO&",[])), +?line <<"abc123">> = iolist_to_binary(re:replace("abc123","^(\\D*)(?=\\d)(?!123)","UgE&XTVNX&ygyaQdYO&",[global])), +?line <<"CByu1234Oj12341234">> = iolist_to_binary(re:replace("1234","^1234(?# test newlines + inside)","CByu&Oj&&",[])), +?line <<"CByu1234Oj12341234">> = iolist_to_binary(re:replace("1234","^1234(?# test newlines + inside)","CByu&Oj&&",[global])), +?line <<"AVF1234DSEvHi">> = iolist_to_binary(re:replace("1234","^1234 #comment in extended re + ","AVF&DSEvHi",[extended])), +?line <<"AVF1234DSEvHi">> = iolist_to_binary(re:replace("1234","^1234 #comment in extended re + ","AVF&DSEvHi",[extended,global])), +?line <<"wiUNsYJdROkkkabcdSabcdjvS">> = iolist_to_binary(re:replace("abcd","#rhubarb + abcd","wiUNsYJdROkkk&S&jvS",[extended])), +?line <<"wiUNsYJdROkkkabcdSabcdjvS">> = iolist_to_binary(re:replace("abcd","#rhubarb + abcd","wiUNsYJdROkkk&S&jvS",[extended,global])), +?line <<"wxabcdyOpSDe">> = iolist_to_binary(re:replace("abcd","^abcd#rhubarb","wx&yOpSDe",[extended])), +?line <<"wxabcdyOpSDe">> = iolist_to_binary(re:replace("abcd","^abcd#rhubarb","wx&yOpSDe",[extended, + global])), +?line <<"aqfaaaab">> = iolist_to_binary(re:replace("aaab","^(a)\\1{2,3}(.)","\\1qf\\1&",[])), +?line <<"aqfaaaab">> = iolist_to_binary(re:replace("aaab","^(a)\\1{2,3}(.)","\\1qf\\1&",[global])), +?line <<"aLGaaaabhavaLLxaIaaaabJaaaabidaaaab">> = iolist_to_binary(re:replace("aaaab","^(a)\\1{2,3}(.)","\\1LG&h\\1v\\1LLx\\1I&J&id&",[])), +?line <<"aLGaaaabhavaLLxaIaaaabJaaaabidaaaab">> = iolist_to_binary(re:replace("aaaab","^(a)\\1{2,3}(.)","\\1LG&h\\1v\\1LLx\\1I&J&id&",[global])), +?line <<"aaaaaEaaaaagaawPOaNaaaaab">> = iolist_to_binary(re:replace("aaaaab","^(a)\\1{2,3}(.)","&E&g\\1\\1wPO\\1N&",[])), +?line <<"aaaaaEaaaaagaawPOaNaaaaab">> = iolist_to_binary(re:replace("aaaaab","^(a)\\1{2,3}(.)","&E&g\\1\\1wPO\\1N&",[global])), +?line <<"QwegtaHxecVVVaaaaaab">> = iolist_to_binary(re:replace("aaaaaab","^(a)\\1{2,3}(.)","QwegtaHxecVVV&",[])), +?line <<"QwegtaHxecVVVaaaaaab">> = iolist_to_binary(re:replace("aaaaaab","^(a)\\1{2,3}(.)","QwegtaHxecVVV&",[global])), +?line <<"the EcabcmU">> = iolist_to_binary(re:replace("the abc","(?!^)abc","Ec&mU",[])), +?line <<"the EcabcmU">> = iolist_to_binary(re:replace("the abc","(?!^)abc","Ec&mU",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?!^)abc","NA",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?!^)abc","NA",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(?!^)abc","yjhaoMMFW\\1",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(?!^)abc","yjhaoMMFW\\1",[global])), +?line <<"PKCfTNYlWMooD">> = iolist_to_binary(re:replace("abc","(?=^)abc","\\1PK\\1CfTNYlWMooD",[])), +?line <<"PKCfTNYlWMooD">> = iolist_to_binary(re:replace("abc","(?=^)abc","\\1PK\\1CfTNYlWMooD",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?=^)abc","fR\\1ltffBHNVYixMX",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?=^)abc","fR\\1ltffBHNVYixMX",[global])), +?line <<"the abc">> = iolist_to_binary(re:replace("the abc","(?=^)abc","L\\1JJFtgfU&l",[])), +?line <<"the abc">> = iolist_to_binary(re:replace("the abc","(?=^)abc","L\\1JJFtgfU&l",[global])), +?line <<"aabbvbOdaabbyVtUjIbqObbbb">> = iolist_to_binary(re:replace("aabbbbb","^[ab]{1,3}(ab*|b)","&v\\1Od&yVtUjI\\1qO\\1",[])), +?line <<"aabbvbOdaabbyVtUjIbqObbbb">> = iolist_to_binary(re:replace("aabbbbb","^[ab]{1,3}(ab*|b)","&v\\1Od&yVtUjI\\1qO\\1",[global])), +?line <<"PLPJVxaabbbbbYrEOEywwHFp">> = iolist_to_binary(re:replace("aabbbbb","^[ab]{1,3}?(ab*|b)","PLPJVxa\\1YrEOEywwHFp",[])), +?line <<"PLPJVxaabbbbbYrEOEywwHFp">> = iolist_to_binary(re:replace("aabbbbb","^[ab]{1,3}?(ab*|b)","PLPJVxa\\1YrEOEywwHFp",[global])), +?line <<"VmghaaMBBitDaaaRnWKaaaAbbbbb">> = iolist_to_binary(re:replace("aabbbbb","^[ab]{1,3}?(ab*?|b)","Vmgh&MBBitD&\\1RnWK&\\1A",[])), +?line <<"VmghaaMBBitDaaaRnWKaaaAbbbbb">> = iolist_to_binary(re:replace("aabbbbb","^[ab]{1,3}?(ab*?|b)","Vmgh&MBBitD&\\1RnWK&\\1A",[global])), +?line <<"baabblNbbLhaabbtbbb">> = iolist_to_binary(re:replace("aabbbbb","^[ab]{1,3}(ab*?|b)","\\1&lNb\\1Lh&t",[])), +?line <<"baabblNbbLhaabbtbbb">> = iolist_to_binary(re:replace("aabbbbb","^[ab]{1,3}(ab*?|b)","\\1&lNb\\1Lh&t",[global])), +?line <<"Alan Other ">> = iolist_to_binary(re:replace("Alan Other "," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","Ag",[extended])), +?line <<"Alan Other ">> = iolist_to_binary(re:replace("Alan Other "," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","Ag",[extended, + global])), +?line <<"">> = iolist_to_binary(re:replace(""," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","OcN\\1",[extended])), +?line <<"">> = iolist_to_binary(re:replace(""," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","OcN\\1",[extended, + global])), +?line <<"user.ain">> = iolist_to_binary(re:replace("user.ain"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","P\\1\\1",[extended])), +?line <<"user.ain">> = iolist_to_binary(re:replace("user.ain"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","P\\1\\1",[extended, + global])), +?line <<"\"A. Other\" (a comment)">> = iolist_to_binary(re:replace("\"A. Other\" (a comment)"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","tFTD&XMAPNeq",[extended])), +?line <<"\"A. Other\" (a comment)">> = iolist_to_binary(re:replace("\"A. Other\" (a comment)"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","tFTD&XMAPNeq",[extended, + global])), +?line <<"A. Other (a comment)">> = iolist_to_binary(re:replace("A. Other (a comment)"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","c\\1&C&YTXnfnhWs\\1g",[extended])), +?line <<"A. Other (a comment)">> = iolist_to_binary(re:replace("A. Other (a comment)"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","c\\1&C&YTXnfnhWs\\1g",[extended, + global])), +?line <<"\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay">> = iolist_to_binary(re:replace("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","\\1R&P&\\1aCnlgH",[extended])), +?line <<"\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay">> = iolist_to_binary(re:replace("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","\\1R&P&\\1aCnlgH",[extended, + global])), +?line <<"A missing angle > = iolist_to_binary(re:replace("A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","p\\1u\\1REy&",[extended])), +?line <<"A missing angle > = iolist_to_binary(re:replace("A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","p\\1u\\1REy&",[extended, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","qytCjuWj\\1fpNNv\\1&ya",[extended])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","qytCjuWj\\1fpNNv\\1&ya",[extended, + global])), +?line <<"The quick brown fox">> = iolist_to_binary(re:replace("The quick brown fox"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","L",[extended])), +?line <<"The quick brown fox">> = iolist_to_binary(re:replace("The quick brown fox"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment","L",[extended, + global])), +?line <<"Alan Other ">> = iolist_to_binary(re:replace("Alan Other ","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","\\1",[extended])), +?line <<"Alan Other ">> = iolist_to_binary(re:replace("Alan Other ","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","\\1",[extended,global])), +?line <<"">> = iolist_to_binary(re:replace("","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","On",[extended])), +?line <<"">> = iolist_to_binary(re:replace("","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","On",[extended,global])), +?line <<"user.ain">> = iolist_to_binary(re:replace("user.ain","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","OLL\\1TqepmsD\\1V\\1\\1h\\1DsD",[extended])), +?line <<"user.ain">> = iolist_to_binary(re:replace("user.ain","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","OLL\\1TqepmsD\\1V\\1\\1h\\1DsD",[extended,global])), +?line <<"\"A. Other\" (a comment)">> = iolist_to_binary(re:replace("\"A. Other\" (a comment)","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","SHuKuC\\1Td",[extended])), +?line <<"\"A. Other\" (a comment)">> = iolist_to_binary(re:replace("\"A. Other\" (a comment)","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","SHuKuC\\1Td",[extended,global])), +?line <<"A. Other (a comment)">> = iolist_to_binary(re:replace("A. Other (a comment)","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","D&t&LSQGMfQpSXj",[extended])), +?line <<"A. Other (a comment)">> = iolist_to_binary(re:replace("A. Other (a comment)","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","D&t&LSQGMfQpSXj",[extended,global])), +?line <<"\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay">> = iolist_to_binary(re:replace("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","qDSGw",[extended])), +?line <<"\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay">> = iolist_to_binary(re:replace("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","qDSGw",[extended,global])), +?line <<"A missing angle > = iolist_to_binary(re:replace("A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","SOYovQniOUVJIil\\1",[extended])), +?line <<"A missing angle > = iolist_to_binary(re:replace("A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","SOYovQniOUVJIil\\1",[extended,global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","D\\1",[extended])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","D\\1",[extended,global])), +?line <<"The quick brown fox">> = iolist_to_binary(re:replace("The quick brown fox","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","X&ayUGYrNMDenjwrkvT",[extended])), +?line <<"The quick brown fox">> = iolist_to_binary(re:replace("The quick brown fox","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)","X&ayUGYrNMDenjwrkvT",[extended,global])), +?line <<"abcdefpqrxyz0AB">> = iolist_to_binary(re:replace("abcdefpqrxyz0AB","abc\\0def\\00pqr\\000xyz\\0000AB","bYVVTfV",[])), +?line <<"abcdefpqrxyz0AB">> = iolist_to_binary(re:replace("abcdefpqrxyz0AB","abc\\0def\\00pqr\\000xyz\\0000AB","bYVVTfV",[global])), +?line <<"abc456 abcdefpqrxyz0ABCDE">> = iolist_to_binary(re:replace("abc456 abcdefpqrxyz0ABCDE","abc\\0def\\00pqr\\000xyz\\0000AB","ALc",[])), +?line <<"abc456 abcdefpqrxyz0ABCDE">> = iolist_to_binary(re:replace("abc456 abcdefpqrxyz0ABCDE","abc\\0def\\00pqr\\000xyz\\0000AB","ALc",[global])), +?line <<"abc efpqr0xyz00AB">> = iolist_to_binary(re:replace("abc efpqr0xyz00AB","abc\\x0def\\x00pqr\\x000xyz\\x0000AB","FJjJa&MUN",[])), +?line <<"abc efpqr0xyz00AB">> = iolist_to_binary(re:replace("abc efpqr0xyz00AB","abc\\x0def\\x00pqr\\x000xyz\\x0000AB","FJjJa&MUN",[global])), +?line <<"abc456 abc efpqr0xyz00ABCDE">> = iolist_to_binary(re:replace("abc456 abc efpqr0xyz00ABCDE","abc\\x0def\\x00pqr\\x000xyz\\x0000AB","IsJK",[])), +?line <<"abc456 abc efpqr0xyz00ABCDE">> = iolist_to_binary(re:replace("abc456 abc efpqr0xyz00ABCDE","abc\\x0def\\x00pqr\\x000xyz\\x0000AB","IsJK",[global])), +?line <<"A">> = iolist_to_binary(re:replace("A","^[\\000-\\037]","&&&l&oFiYRb&dwnRVIB",[])), +?line <<"A">> = iolist_to_binary(re:replace("A","^[\\000-\\037]","&&&l&oFiYRb&dwnRVIB",[global])), +?line <<"pJINBIVHkbsQpNB">> = iolist_to_binary(re:replace("B","^[\\000-\\037]","p\\1JINBIVHkbs&QpN",[])), +?line <<"pJINBIVHkbsQpNB">> = iolist_to_binary(re:replace("B","^[\\000-\\037]","p\\1JINBIVHkbs&QpN",[global])), +?line <<"qnaxlKtxgBKMC">> = iolist_to_binary(re:replace("C","^[\\000-\\037]","qnax&lKtxgB&KM",[])), +?line <<"qnaxlKtxgBKMC">> = iolist_to_binary(re:replace("C","^[\\000-\\037]","qnax&lKtxgB&KM",[global])), +?line <<"WuuRxIy">> = iolist_to_binary(re:replace("","\\0*","Wu&uRxIy",[])), +?line <<"WuuRxIy">> = iolist_to_binary(re:replace("","\\0*","Wu&uRxIy",[global])), +?line <<"The AZ">> = iolist_to_binary(re:replace("The AZ","A\\x0{2,3}Z","ggJSniphIbt",[])), +?line <<"The AZ">> = iolist_to_binary(re:replace("The AZ","A\\x0{2,3}Z","ggJSniphIbt",[global])), +?line <<"An AZ">> = iolist_to_binary(re:replace("An AZ","A\\x0{2,3}Z","s&\\1Bwkjj",[])), +?line <<"An AZ">> = iolist_to_binary(re:replace("An AZ","A\\x0{2,3}Z","s&\\1Bwkjj",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","A\\x0{2,3}Z","\\1eJyYpl",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","A\\x0{2,3}Z","\\1eJyYpl",[global])), +?line <<"AZ">> = iolist_to_binary(re:replace("AZ","A\\x0{2,3}Z","aK\\1qVDC\\1uB",[])), +?line <<"AZ">> = iolist_to_binary(re:replace("AZ","A\\x0{2,3}Z","aK\\1qVDC\\1uB",[global])), +?line <<"AZ">> = iolist_to_binary(re:replace("AZ","A\\x0{2,3}Z","DMN&CNdjTe",[])), +?line <<"AZ">> = iolist_to_binary(re:replace("AZ","A\\x0{2,3}Z","DMN&CNdjTe",[global])), +?line <<"cowcowbelldrlcowNSbcowcowbelladivdcowcowbell">> = iolist_to_binary(re:replace("cowcowbell","^(cow|)\\1(bell)","&drl\\1NSb&adivd&",[])), +?line <<"cowcowbelldrlcowNSbcowcowbelladivdcowcowbell">> = iolist_to_binary(re:replace("cowcowbell","^(cow|)\\1(bell)","&drl\\1NSb&adivd&",[global])), +?line <<"UUUBpbellPtC">> = iolist_to_binary(re:replace("bell","^(cow|)\\1(bell)","UUUBp&P\\1tC",[])), +?line <<"UUUBpbellPtC">> = iolist_to_binary(re:replace("bell","^(cow|)\\1(bell)","UUUBp&P\\1tC",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(cow|)\\1(bell)","\\1\\1L\\1foe&LDaKY",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(cow|)\\1(bell)","\\1\\1L\\1foe&LDaKY",[global])), +?line <<"cowbell">> = iolist_to_binary(re:replace("cowbell","^(cow|)\\1(bell)","&pE",[])), +?line <<"cowbell">> = iolist_to_binary(re:replace("cowbell","^(cow|)\\1(bell)","&pE",[global])), +?line <<"KEPMMarMefAQoabc">> = iolist_to_binary(re:replace(" abc","^\\s","KEP\\1MMa\\1rMefAQ\\1\\1\\1o",[])), +?line <<"KEPMMarMefAQoabc">> = iolist_to_binary(re:replace(" abc","^\\s","KEP\\1MMa\\1rMefAQ\\1\\1\\1o",[global])), +?line <<"mdPwbKbGabc">> = iolist_to_binary(re:replace(" abc","^\\s","mdPwbKbG",[])), +?line <<"mdPwbKbGabc">> = iolist_to_binary(re:replace(" abc","^\\s","mdPwbKbG",[global])), +?line <<"Ed +FNgfabc">> = iolist_to_binary(re:replace(" +abc","^\\s","Ed&FNgf",[])), +?line <<"Ed +FNgfabc">> = iolist_to_binary(re:replace(" +abc","^\\s","Ed&FNgf",[global])), +?line <<"iYCabc">> = iolist_to_binary(re:replace(" abc","^\\s","iYC",[])), +?line <<"iYCabc">> = iolist_to_binary(re:replace(" abc","^\\s","iYC",[global])), +?line <<"Y KyKjBtWUscEoeabc">> = iolist_to_binary(re:replace(" abc","^\\s","Y\\1&\\1KyKjBtWUscEoe",[])), +?line <<"Y KyKjBtWUscEoeabc">> = iolist_to_binary(re:replace(" abc","^\\s","Y\\1&\\1KyKjBtWUscEoe",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^\\s","fMXHNBeT",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^\\s","fMXHNBeT",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","^\\s","GF\\1s&cS\\1yGC",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","^\\s","GF\\1s&cS\\1yGC",[global])), +?line <<"Ur">> = iolist_to_binary(re:replace("abc","^a b + c","Ur",[extended])), +?line <<"Ur">> = iolist_to_binary(re:replace("abc","^a b + c","Ur",[extended,global])), +?line <<"UQqfOFVevBwaga">> = iolist_to_binary(re:replace("ab","^(a|)\\1*b","UQqfOFVevBwag\\1",[])), +?line <<"UQqfOFVevBwaga">> = iolist_to_binary(re:replace("ab","^(a|)\\1*b","UQqfOFVevBwag\\1",[global])), +?line <<"cAc">> = iolist_to_binary(re:replace("aaaab","^(a|)\\1*b","cAc",[])), +?line <<"cAc">> = iolist_to_binary(re:replace("aaaab","^(a|)\\1*b","cAc",[global])), +?line <<"QGbTLPFbbYYwpIhdW">> = iolist_to_binary(re:replace("b","^(a|)\\1*b","QG&TLPF&&YYwp\\1Ih\\1dW",[])), +?line <<"QGbTLPFbbYYwpIhdW">> = iolist_to_binary(re:replace("b","^(a|)\\1*b","QG&TLPF&&YYwp\\1Ih\\1dW",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a|)\\1*b","wY",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a|)\\1*b","wY",[global])), +?line <<"acb">> = iolist_to_binary(re:replace("acb","^(a|)\\1*b","IpD\\1tRUS",[])), +?line <<"acb">> = iolist_to_binary(re:replace("acb","^(a|)\\1*b","IpD\\1tRUS",[global])), +?line <<"PMaabaRKsKVgnxCiJtgp">> = iolist_to_binary(re:replace("aab","^(a|)\\1+b","PM&\\1RKsKVgnxCiJtgp",[])), +?line <<"PMaabaRKsKVgnxCiJtgp">> = iolist_to_binary(re:replace("aab","^(a|)\\1+b","PM&\\1RKsKVgnxCiJtgp",[global])), +?line <<"quaJPXxLfMHlVxH">> = iolist_to_binary(re:replace("aaaab","^(a|)\\1+b","qu\\1JPXxLfMHlVxH",[])), +?line <<"quaJPXxLfMHlVxH">> = iolist_to_binary(re:replace("aaaab","^(a|)\\1+b","qu\\1JPXxLfMHlVxH",[global])), +?line <<"b">> = iolist_to_binary(re:replace("b","^(a|)\\1+b","&",[])), +?line <<"b">> = iolist_to_binary(re:replace("b","^(a|)\\1+b","&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a|)\\1+b","ywXwC",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a|)\\1+b","ywXwC",[global])), +?line <<"ab">> = iolist_to_binary(re:replace("ab","^(a|)\\1+b","hwwbvhOrVEaVOsD\\1",[])), +?line <<"ab">> = iolist_to_binary(re:replace("ab","^(a|)\\1+b","hwwbvhOrVEaVOsD\\1",[global])), +?line <<"tNvaWAg">> = iolist_to_binary(re:replace("ab","^(a|)\\1?b","tNv\\1WAg",[])), +?line <<"tNvaWAg">> = iolist_to_binary(re:replace("ab","^(a|)\\1?b","tNv\\1WAg",[global])), +?line <<"K">> = iolist_to_binary(re:replace("aab","^(a|)\\1?b","K",[])), +?line <<"K">> = iolist_to_binary(re:replace("aab","^(a|)\\1?b","K",[global])), +?line <<"bRibsTbLcleUeb">> = iolist_to_binary(re:replace("b","^(a|)\\1?b","&Ri\\1&sT&L\\1cl\\1e\\1Ue&",[])), +?line <<"bRibsTbLcleUeb">> = iolist_to_binary(re:replace("b","^(a|)\\1?b","&Ri\\1&sT&L\\1cl\\1e\\1Ue&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a|)\\1?b","&CGRslcRfjatPWbOMT",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a|)\\1?b","&CGRslcRfjatPWbOMT",[global])), +?line <<"acb">> = iolist_to_binary(re:replace("acb","^(a|)\\1?b","&k\\1aoVMtug&hJsI",[])), +?line <<"acb">> = iolist_to_binary(re:replace("acb","^(a|)\\1?b","&k\\1aoVMtug&hJsI",[global])), +?line <<"gaaabFGtJRckPahi">> = iolist_to_binary(re:replace("aaab","^(a|)\\1{2}b","g&FGtJRckP\\1hi",[])), +?line <<"gaaabFGtJRckPahi">> = iolist_to_binary(re:replace("aaab","^(a|)\\1{2}b","g&FGtJRckP\\1hi",[global])), +?line <<"bINnRM">> = iolist_to_binary(re:replace("b","^(a|)\\1{2}b","bINnR\\1M",[])), +?line <<"bINnRM">> = iolist_to_binary(re:replace("b","^(a|)\\1{2}b","bINnR\\1M",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a|)\\1{2}b","cm",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a|)\\1{2}b","cm",[global])), +?line <<"ab">> = iolist_to_binary(re:replace("ab","^(a|)\\1{2}b","yT\\1\\1NlFQVleuHkXnE\\1",[])), +?line <<"ab">> = iolist_to_binary(re:replace("ab","^(a|)\\1{2}b","yT\\1\\1NlFQVleuHkXnE\\1",[global])), +?line <<"aab">> = iolist_to_binary(re:replace("aab","^(a|)\\1{2}b","PwBRhyP\\1txXQhbjE\\1a",[])), +?line <<"aab">> = iolist_to_binary(re:replace("aab","^(a|)\\1{2}b","PwBRhyP\\1txXQhbjE\\1a",[global])), +?line <<"aaaab">> = iolist_to_binary(re:replace("aaaab","^(a|)\\1{2}b","cxo",[])), +?line <<"aaaab">> = iolist_to_binary(re:replace("aaaab","^(a|)\\1{2}b","cxo",[global])), +?line <<"aaabXaaabMaaabdHhnqsiti">> = iolist_to_binary(re:replace("aaab","^(a|)\\1{2,3}b","&X&M&dHhnqsiti",[])), +?line <<"aaabXaaabMaaabdHhnqsiti">> = iolist_to_binary(re:replace("aaab","^(a|)\\1{2,3}b","&X&M&dHhnqsiti",[global])), +?line <<"QaaaablaaaabNnVdaaaabpaQEaaaaab">> = iolist_to_binary(re:replace("aaaab","^(a|)\\1{2,3}b","Q&l&NnVd&p\\1QE\\1&",[])), +?line <<"QaaaablaaaabNnVdaaaabpaQEaaaaab">> = iolist_to_binary(re:replace("aaaab","^(a|)\\1{2,3}b","Q&l&NnVd&p\\1QE\\1&",[global])), +?line <<"bCw">> = iolist_to_binary(re:replace("b","^(a|)\\1{2,3}b","&Cw",[])), +?line <<"bCw">> = iolist_to_binary(re:replace("b","^(a|)\\1{2,3}b","&Cw",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a|)\\1{2,3}b","\\1&puY",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a|)\\1{2,3}b","\\1&puY",[global])), +?line <<"ab">> = iolist_to_binary(re:replace("ab","^(a|)\\1{2,3}b","pbextvQnRWgXs",[])), +?line <<"ab">> = iolist_to_binary(re:replace("ab","^(a|)\\1{2,3}b","pbextvQnRWgXs",[global])), +?line <<"aab">> = iolist_to_binary(re:replace("aab","^(a|)\\1{2,3}b","fHRaaYYIr\\1l\\1",[])), +?line <<"aab">> = iolist_to_binary(re:replace("aab","^(a|)\\1{2,3}b","fHRaaYYIr\\1l\\1",[global])), +?line <<"aaaaab">> = iolist_to_binary(re:replace("aaaaab","^(a|)\\1{2,3}b","nXt&Aw\\1XCfLg\\1GGPmN",[])), +?line <<"aaaaab">> = iolist_to_binary(re:replace("aaaaab","^(a|)\\1{2,3}b","nXt&Aw\\1XCfLg\\1GGPmN",[global])), +?line <<"eRwvgLU">> = iolist_to_binary(re:replace("abbbbc","ab{1,3}bc","eRwvgLU",[])), +?line <<"eRwvgLU">> = iolist_to_binary(re:replace("abbbbc","ab{1,3}bc","eRwvgLU",[global])), +?line <<"mDnlkabbbcfTJ">> = iolist_to_binary(re:replace("abbbc","ab{1,3}bc","m\\1Dnl\\1k&fTJ",[])), +?line <<"mDnlkabbbcfTJ">> = iolist_to_binary(re:replace("abbbc","ab{1,3}bc","m\\1Dnl\\1k&fTJ",[global])), +?line <<"QabbcqIjjWabbchabbcBrTp">> = iolist_to_binary(re:replace("abbc","ab{1,3}bc","Q&qIjjW&h\\1&BrTp",[])), +?line <<"QabbcqIjjWabbchabbcBrTp">> = iolist_to_binary(re:replace("abbc","ab{1,3}bc","Q&qIjjW&h\\1&BrTp",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab{1,3}bc","\\1Wj&Y&ML\\1RBiGiweww",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab{1,3}bc","\\1Wj&Y&ML\\1RBiGiweww",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","ab{1,3}bc","HmlRU&NUwwokL",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","ab{1,3}bc","HmlRU&NUwwokL",[global])), +?line <<"abbbbbc">> = iolist_to_binary(re:replace("abbbbbc","ab{1,3}bc","FUyCCDShGVXhEHX\\1V\\1bK",[])), +?line <<"abbbbbc">> = iolist_to_binary(re:replace("abbbbbc","ab{1,3}bc","FUyCCDShGVXhEHX\\1V\\1bK",[global])), +?line <<"track1astrack1track1tIDhtrack1.title:TBlah blah blahiA">> = iolist_to_binary(re:replace("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[T ]+(.*)","\\1as\\1\\1tIDh&iA",[])), +?line <<"track1astrack1track1tIDhtrack1.title:TBlah blah blahiA">> = iolist_to_binary(re:replace("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[T ]+(.*)","\\1as\\1\\1tIDh&iA",[global])), +?line <<"wUVSR">> = iolist_to_binary(re:replace("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[T ]+(.*)","wUVSR",[caseless])), +?line <<"wUVSR">> = iolist_to_binary(re:replace("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[T ]+(.*)","wUVSR",[caseless, + global])), +?line <<"htrack1TCNtrack1.title:TBlah blah blahpLtrack1.title:TBlah blah blahtrack1.title:TBlah blah blahFnNtrack1jOBdd">> = iolist_to_binary(re:replace("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[t ]+(.*)","h\\1TCN&pL&&FnN\\1jOBdd",[caseless])), +?line <<"htrack1TCNtrack1.title:TBlah blah blahpLtrack1.title:TBlah blah blahtrack1.title:TBlah blah blahFnNtrack1jOBdd">> = iolist_to_binary(re:replace("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[t ]+(.*)","h\\1TCN&pL&&FnN\\1jOBdd",[caseless, + global])), +?line <<"OKnYPU">> = iolist_to_binary(re:replace("WXY_^abc","^[W-c]+$","OKnYPU",[])), +?line <<"OKnYPU">> = iolist_to_binary(re:replace("WXY_^abc","^[W-c]+$","OKnYPU",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[W-c]+$","\\1GX\\1YVV&\\1WF",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[W-c]+$","\\1GX\\1YVV&\\1WF",[global])), +?line <<"wxy">> = iolist_to_binary(re:replace("wxy","^[W-c]+$","Uax\\1F",[])), +?line <<"wxy">> = iolist_to_binary(re:replace("wxy","^[W-c]+$","Uax\\1F",[global])), +?line <<"WXY_^abcARKQ">> = iolist_to_binary(re:replace("WXY_^abc","^[W-c]+$","&ARK\\1Q",[caseless])), +?line <<"WXY_^abcARKQ">> = iolist_to_binary(re:replace("WXY_^abc","^[W-c]+$","&ARK\\1Q",[caseless, + global])), +?line <<"fIwxy_^ABCwxy_^ABCGwxy_^ABCwAHLMA">> = iolist_to_binary(re:replace("wxy_^ABC","^[W-c]+$","fI&&G&w\\1AHL\\1MA",[caseless])), +?line <<"fIwxy_^ABCwxy_^ABCGwxy_^ABCwAHLMA">> = iolist_to_binary(re:replace("wxy_^ABC","^[W-c]+$","fI&&G&w\\1AHL\\1MA",[caseless, + global])), +?line <<"WXY_^abcrgsgXuYrmtfAuS">> = iolist_to_binary(re:replace("WXY_^abc","^[\\x3f-\\x5F]+$","&rgsgXuYrmtfAuS",[caseless])), +?line <<"WXY_^abcrgsgXuYrmtfAuS">> = iolist_to_binary(re:replace("WXY_^abc","^[\\x3f-\\x5F]+$","&rgsgXuYrmtfAuS",[caseless, + global])), +?line <<"FmwJKwxy_^ABCyluQcjQVnwQ">> = iolist_to_binary(re:replace("wxy_^ABC","^[\\x3f-\\x5F]+$","FmwJK&yluQcjQVnwQ",[caseless])), +?line <<"FmwJKwxy_^ABCyluQcjQVnwQ">> = iolist_to_binary(re:replace("wxy_^ABC","^[\\x3f-\\x5F]+$","FmwJK&yluQcjQVnwQ",[caseless, + global])), +?line <<"abcabcMObxlD">> = iolist_to_binary(re:replace("abc","^abc$","&\\1&MObxlD",[multiline])), +?line <<"abcabcMObxlD">> = iolist_to_binary(re:replace("abc","^abc$","&\\1&MObxlD",[multiline, + global])), +?line <<"qqq +wgabc">> = iolist_to_binary(re:replace("qqq +abc","^abc$","wg&",[multiline])), +?line <<"qqq +wgabc">> = iolist_to_binary(re:replace("qqq +abc","^abc$","wg&",[multiline,global])), +?line <<"abcwXeRgabcKmklKpYiE +zzz">> = iolist_to_binary(re:replace("abc +zzz","^abc$","&wXe\\1Rg&K\\1mklKpYiE",[multiline])), +?line <<"abcwXeRgabcKmklKpYiE +zzz">> = iolist_to_binary(re:replace("abc +zzz","^abc$","&wXe\\1Rg&K\\1mklKpYiE",[multiline,global])), +?line <<"qqq +CabcCKxlJamS +zzz">> = iolist_to_binary(re:replace("qqq +abc +zzz","^abc$","C&CKxlJam\\1S",[multiline])), +?line <<"qqq +CabcCKxlJamS +zzz">> = iolist_to_binary(re:replace("qqq +abc +zzz","^abc$","C&CKxlJam\\1S",[multiline,global])), +?line <<"MLKPlabcY">> = iolist_to_binary(re:replace("abc","^abc$","MLKPl&\\1Y",[])), +?line <<"MLKPlabcY">> = iolist_to_binary(re:replace("abc","^abc$","MLKPl&\\1Y",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^abc$","\\1uRnMNc&\\1",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^abc$","\\1uRnMNc&\\1",[global])), +?line <<"qqq +abc">> = iolist_to_binary(re:replace("qqq +abc","^abc$","b\\1",[])), +?line <<"qqq +abc">> = iolist_to_binary(re:replace("qqq +abc","^abc$","b\\1",[global])), +?line <<"abc +zzz">> = iolist_to_binary(re:replace("abc +zzz","^abc$","RAJ\\1a&Mvoue\\1d",[])), +?line <<"abc +zzz">> = iolist_to_binary(re:replace("abc +zzz","^abc$","RAJ\\1a&Mvoue\\1d",[global])), +?line <<"qqq +abc +zzz">> = iolist_to_binary(re:replace("qqq +abc +zzz","^abc$","\\1NghvSn\\1GSQvu&&grYN",[])), +?line <<"qqq +abc +zzz">> = iolist_to_binary(re:replace("qqq +abc +zzz","^abc$","\\1NghvSn\\1GSQvu&&grYN",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","\\Aabc\\Z","&",[multiline])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","\\Aabc\\Z","&",[multiline, + global])), +?line <<"XQevmabcHXD">> = iolist_to_binary(re:replace("abc","\\Aabc\\Z","XQevm&HXD",[multiline])), +?line <<"XQevmabcHXD">> = iolist_to_binary(re:replace("abc","\\Aabc\\Z","XQevm&HXD",[multiline, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\Aabc\\Z","plNA&&\\1Myw&e",[multiline])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\Aabc\\Z","plNA&&\\1Myw&e",[multiline, + global])), +?line <<"qqq +abc">> = iolist_to_binary(re:replace("qqq +abc","\\Aabc\\Z","tActj",[multiline])), +?line <<"qqq +abc">> = iolist_to_binary(re:replace("qqq +abc","\\Aabc\\Z","tActj",[multiline,global])), +?line <<"abc +zzz">> = iolist_to_binary(re:replace("abc +zzz","\\Aabc\\Z","&PAnUmSADdk",[multiline])), +?line <<"abc +zzz">> = iolist_to_binary(re:replace("abc +zzz","\\Aabc\\Z","&PAnUmSADdk",[multiline,global])), +?line <<"qqq +abc +zzz">> = iolist_to_binary(re:replace("qqq +abc +zzz","\\Aabc\\Z","O&&GYJA",[multiline])), +?line <<"qqq +abc +zzz">> = iolist_to_binary(re:replace("qqq +abc +zzz","\\Aabc\\Z","O&&GYJA",[multiline,global])), +?line <<"ejfGpamjOGidXfWabc +defiXJg">> = iolist_to_binary(re:replace("abc +def","\\A(.)*\\Z","ej\\1GpamjOGidX\\1W&iXJg",[dotall])), +?line <<"ejfGpamjOGidXfWabc +defiXJg">> = iolist_to_binary(re:replace("abc +def","\\A(.)*\\Z","ej\\1GpamjOGidX\\1W&iXJg",[dotall,global])), +?line <<"UTI*** FailersagVgtIFYe*** Failerss*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\A(.)*\\Z","UTI&agVgtIFYe&\\1&",[multiline])), +?line <<"UTI*** FailersagVgtIFYe*** Failerss*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\A(.)*\\Z","UTI&agVgtIFYe&\\1&",[multiline, + global])), +?line <<"abc +def">> = iolist_to_binary(re:replace("abc +def","\\A(.)*\\Z","&PHW&rh&xcxs\\1Cy&Chhd",[multiline])), +?line <<"abc +def">> = iolist_to_binary(re:replace("abc +def","\\A(.)*\\Z","&PHW&rh&xcxs\\1Cy&Chhd",[multiline,global])), +?line <<"cjOwaTTW::c">> = iolist_to_binary(re:replace("b::c","(?:b)|(?::+)","cjOwaTTW",[])), +?line <<"cjOwaTTWcjOwaTTWc">> = iolist_to_binary(re:replace("b::c","(?:b)|(?::+)","cjOwaTTW",[global])), +?line <<"c::ReJbWufqTUdDqlXQb">> = iolist_to_binary(re:replace("c::b","(?:b)|(?::+)","\\1&ReJbWufqTUdDqlXQ",[])), +?line <<"c::ReJbWufqTUdDqlXQbReJbWufqTUdDqlXQ">> = iolist_to_binary(re:replace("c::b","(?:b)|(?::+)","\\1&ReJbWufqTUdDqlXQ",[global])), +?line <<"az-uaz-obYOlaz-DVbrqaz-y">> = iolist_to_binary(re:replace("az-","[-az]+","&u&obYOl&DVbrq&y",[])), +?line <<"az-uaz-obYOlaz-DVbrqaz-y">> = iolist_to_binary(re:replace("az-","[-az]+","&u&obYOl&DVbrq&y",[global])), +?line <<"*** FAlNlPvDnUXilers">> = iolist_to_binary(re:replace("*** Failers","[-az]+","AlNlPvDn\\1UX",[])), +?line <<"*** FAlNlPvDnUXilers">> = iolist_to_binary(re:replace("*** Failers","[-az]+","AlNlPvDn\\1UX",[global])), +?line <<"b">> = iolist_to_binary(re:replace("b","[-az]+","&xa\\1Q\\1BSaQG",[])), +?line <<"b">> = iolist_to_binary(re:replace("b","[-az]+","&xa\\1Q\\1BSaQG",[global])), +?line <<"rJXv">> = iolist_to_binary(re:replace("za-","[az-]+","\\1rJXv",[])), +?line <<"rJXv">> = iolist_to_binary(re:replace("za-","[az-]+","\\1rJXv",[global])), +?line <<"*** FIQWDsCilers">> = iolist_to_binary(re:replace("*** Failers","[az-]+","IQWD\\1\\1sC",[])), +?line <<"*** FIQWDsCilers">> = iolist_to_binary(re:replace("*** Failers","[az-]+","IQWD\\1\\1sC",[global])), +?line <<"b">> = iolist_to_binary(re:replace("b","[az-]+","G\\1TcEO\\1EAeKKLc&eOBg",[])), +?line <<"b">> = iolist_to_binary(re:replace("b","[az-]+","G\\1TcEO\\1EAeKKLc&eOBg",[global])), +?line <<"DsdWoREvsWCDpa-z">> = iolist_to_binary(re:replace("a-z","[a\\-z]+","Dsd\\1WoREvsWCD\\1p&",[])), +?line <<"DsdWoREvsWCDpa-z">> = iolist_to_binary(re:replace("a-z","[a\\-z]+","Dsd\\1WoREvsWCD\\1p&",[global])), +?line <<"*** FaUqEUvbeKTpilers">> = iolist_to_binary(re:replace("*** Failers","[a\\-z]+","&U\\1qEUvbeKTp",[])), +?line <<"*** FaUqEUvbeKTpilers">> = iolist_to_binary(re:replace("*** Failers","[a\\-z]+","&U\\1qEUvbeKTp",[global])), +?line <<"b">> = iolist_to_binary(re:replace("b","[a\\-z]+","IdIH&",[])), +?line <<"b">> = iolist_to_binary(re:replace("b","[a\\-z]+","IdIH&",[global])), +?line <<"CHIiEabcdxyzAXhIPVabcdxyz">> = iolist_to_binary(re:replace("abcdxyz","[a-z]+","CHIiE&AXhIPV&",[])), +?line <<"CHIiEabcdxyzAXhIPVabcdxyz">> = iolist_to_binary(re:replace("abcdxyz","[a-z]+","CHIiE&AXhIPV&",[global])), +?line <<"Tk12-34ptREc12-34dF">> = iolist_to_binary(re:replace("12-34","[\\d-]+","Tk&ptREc&dF\\1",[])), +?line <<"Tk12-34ptREc12-34dF">> = iolist_to_binary(re:replace("12-34","[\\d-]+","Tk&ptREc&dF\\1",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","[\\d-]+","PO\\1\\1HuRnqA\\1miVVsKv",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","[\\d-]+","PO\\1\\1HuRnqA\\1miVVsKv",[global])), +?line <<"aaa">> = iolist_to_binary(re:replace("aaa","[\\d-]+","QMUbdeC\\1fKgUg",[])), +?line <<"aaa">> = iolist_to_binary(re:replace("aaa","[\\d-]+","QMUbdeC\\1fKgUg",[global])), +?line <<"YypJ">> = iolist_to_binary(re:replace("12-34z","[\\d-z]+","YypJ",[])), +?line <<"YypJ">> = iolist_to_binary(re:replace("12-34z","[\\d-z]+","YypJ",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","[\\d-z]+","d&ErDHl\\1&GDjyQy",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","[\\d-z]+","d&ErDHl\\1&GDjyQy",[global])), +?line <<"aaa">> = iolist_to_binary(re:replace("aaa","[\\d-z]+","EVkS",[])), +?line <<"aaa">> = iolist_to_binary(re:replace("aaa","[\\d-z]+","EVkS",[global])), +?line <<"cHd\\ltkGr\\BqrhP ">> = iolist_to_binary(re:replace("\\ ","\\x5c","cHd<kGr&Bqr\\1hP",[])), +?line <<"cHd\\ltkGr\\BqrhP ">> = iolist_to_binary(re:replace("\\ ","\\x5c","cHd<kGr&Bqr\\1hP",[global])), +?line <<"the Z Z ZciyfJLvoo">> = iolist_to_binary(re:replace("the Zoo","\\x20Z","&&&ciyf\\1JLv",[])), +?line <<"the Z Z ZciyfJLvoo">> = iolist_to_binary(re:replace("the Zoo","\\x20Z","&&&ciyf\\1JLv",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\x20Z","ry\\1S\\1&\\1\\1MkYc",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\x20Z","ry\\1S\\1&\\1\\1MkYc",[global])), +?line <<"Zulu">> = iolist_to_binary(re:replace("Zulu","\\x20Z","b\\1Wc&RB\\1&&pO&Dd\\1&A",[])), +?line <<"Zulu">> = iolist_to_binary(re:replace("Zulu","\\x20Z","b\\1Wc&RB\\1&&pO&Dd\\1&A",[global])), +?line <<"aabcabcUxryabcAPabcabcDGgL">> = iolist_to_binary(re:replace("abcabc","(abc)\\1","a&Uxry\\1AP&DGgL",[caseless])), +?line <<"aabcabcUxryabcAPabcabcDGgL">> = iolist_to_binary(re:replace("abcabc","(abc)\\1","a&Uxry\\1AP&DGgL",[caseless, + global])), +?line <<"oStOWABCvVHVfFqojojfABC">> = iolist_to_binary(re:replace("ABCabc","(abc)\\1","oStOW\\1vVHVfFqojojf\\1",[caseless])), +?line <<"oStOWABCvVHVfFqojojfABC">> = iolist_to_binary(re:replace("ABCabc","(abc)\\1","oStOW\\1vVHVfFqojojf\\1",[caseless, + global])), +?line <<"GabcABCrGLdSabcABCWnHabcabcABCP">> = iolist_to_binary(re:replace("abcABC","(abc)\\1","G&rGLdS&WnH\\1&P",[caseless])), +?line <<"GabcABCrGLdSabcABCWnHabcabcABCP">> = iolist_to_binary(re:replace("abcABC","(abc)\\1","G&rGLdS&WnH\\1&P",[caseless, + global])), +?line <<"KVwWyab{3cdEWMab{3cdPr">> = iolist_to_binary(re:replace("ab{3cd","ab{3cd","KVwWy&\\1EWM&Pr",[])), +?line <<"KVwWyab{3cdEWMab{3cdPr">> = iolist_to_binary(re:replace("ab{3cd","ab{3cd","KVwWy&\\1EWM&Pr",[global])), +?line <<"KuJab{3,cd">> = iolist_to_binary(re:replace("ab{3,cd","ab{3,cd","KuJ&",[])), +?line <<"KuJab{3,cd">> = iolist_to_binary(re:replace("ab{3,cd","ab{3,cd","KuJ&",[global])), +?line <<"squJfab{3,4a}cd">> = iolist_to_binary(re:replace("ab{3,4a}cd","ab{3,4a}cd","squ\\1Jf&",[])), +?line <<"squJfab{3,4a}cd">> = iolist_to_binary(re:replace("ab{3,4a}cd","ab{3,4a}cd","squ\\1Jf&",[global])), +?line <<"{4,5a}bc{4,5a}bcH">> = iolist_to_binary(re:replace("{4,5a}bc","{4,5a}bc","&&H",[])), +?line <<"{4,5a}bc{4,5a}bcH">> = iolist_to_binary(re:replace("{4,5a}bc","{4,5a}bc","&&H",[global])), +?line <<"nb">> = iolist_to_binary(re:replace("abc","abc$","nb",[])), +?line <<"nb">> = iolist_to_binary(re:replace("abc","abc$","nb",[global])), +?line <<"aabcTslrEK">> = iolist_to_binary(re:replace("abc","abc$","a&TslrEK",[])), +?line <<"aabcTslrEK">> = iolist_to_binary(re:replace("abc","abc$","a&TslrEK",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abc$","rVkXRL&nq&w\\1NDuHM\\1dj",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abc$","rVkXRL&nq&w\\1NDuHM\\1dj",[global])), +?line <<"abc +def">> = iolist_to_binary(re:replace("abc +def","abc$","M",[])), +?line <<"abc +def">> = iolist_to_binary(re:replace("abc +def","abc$","M",[global])), +?line <<"abcWCabcSYXGPjRugTabcVGabcSX">> = iolist_to_binary(re:replace("abcS","(abc)\\123","\\1WC&YXGPjRugT\\1VG&X",[])), +?line <<"abcWCabcSYXGPjRugTabcVGabcSX">> = iolist_to_binary(re:replace("abcS","(abc)\\123","\\1WC&YXGPjRugT\\1VG&X",[global])), +?line <<"fabc“Uabc“UmiqabceCsabcabc“">> = iolist_to_binary(re:replace("abc“","(abc)\\223","f&U&Umiq\\1eCs\\1&",[])), +?line <<"fabc“Uabc“UmiqabceCsabcabc“">> = iolist_to_binary(re:replace("abc“","(abc)\\223","f&U&Umiq\\1eCs\\1&",[global])), +?line <<"JRFabcxnbabcÓVkabcÓfWigQMuaY">> = iolist_to_binary(re:replace("abcÓ","(abc)\\323","JRF\\1xnb&Vk&fWigQMuaY",[])), +?line <<"JRFabcxnbabcÓVkabcÓfWigQMuaY">> = iolist_to_binary(re:replace("abcÓ","(abc)\\323","JRF\\1xnb&Vk&fWigQMuaY",[global])), +?line <<"vgabc@QQ">> = iolist_to_binary(re:replace("abc@","(abc)\\100","vg&QQ",[])), +?line <<"vgabc@QQ">> = iolist_to_binary(re:replace("abc@","(abc)\\100","vg&QQ",[global])), +?line <<"abc@OkvNytabc@abcabc@a">> = iolist_to_binary(re:replace("abc@","(abc)\\100","&OkvNyt&\\1&a",[])), +?line <<"abc@OkvNytabc@abcabc@a">> = iolist_to_binary(re:replace("abc@","(abc)\\100","&OkvNyt&\\1&a",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","P&kRot\\1ILA",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","P&kRot\\1ILA",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","iULjBTiVDW&K\\1p&bj",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","iULjBTiVDW&K\\1p&bj",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","cplYw\\1iuv\\1Okstb\\1p",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","cplYw\\1iuv\\1Okstb\\1p",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","LDaRV&lAu\\1i",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","LDaRV&lAu\\1i",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","K\\1",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","K\\1",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","cXHTTaJLMXvR&\\1",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","(abc)\\1000","cXHTTaJLMXvR&\\1",[global])), +?line <<"abc81">> = iolist_to_binary(re:replace("abc81","abc\\81","\\1kB&oGS\\1\\1lPn",[])), +?line <<"abc81">> = iolist_to_binary(re:replace("abc81","abc\\81","\\1kB&oGS\\1\\1lPn",[global])), +?line <<"abc81">> = iolist_to_binary(re:replace("abc81","abc\\81","\\1",[])), +?line <<"abc81">> = iolist_to_binary(re:replace("abc81","abc\\81","\\1",[global])), +?line <<"abc91">> = iolist_to_binary(re:replace("abc91","abc\\91","\\1GKLIQYEGVpGIxagx&&",[])), +?line <<"abc91">> = iolist_to_binary(re:replace("abc91","abc\\91","\\1GKLIQYEGVpGIxagx&&",[global])), +?line <<"abc91">> = iolist_to_binary(re:replace("abc91","abc\\91","og&&Tlj&jCLkmrllagN",[])), +?line <<"abc91">> = iolist_to_binary(re:replace("abc91","abc\\91","og&&Tlj&jCLkmrllagN",[global])), +?line <<"xMFEgabcdefghijkllSDGabcdefghijkllSN">> = iolist_to_binary(re:replace("abcdefghijkllS","(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123","xMFEg&DG&N",[])), +?line <<"xMFEgabcdefghijkllSDGabcdefghijkllSN">> = iolist_to_binary(re:replace("abcdefghijkllS","(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123","xMFEg&DG&N",[global])), +?line <<"WyroFQabcdefghijk +SNfabcdefghijk +SahyoPabcdefghijk +Sqfbs">> = iolist_to_binary(re:replace("abcdefghijk +S","(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123","WyroFQ&Nf&ahyoP&qfbs",[])), +?line <<"WyroFQabcdefghijk +SNfabcdefghijk +SahyoPabcdefghijk +Sqfbs">> = iolist_to_binary(re:replace("abcdefghijk +S","(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123","WyroFQ&Nf&ahyoP&qfbs",[global])), +?line <<"fCnqsFE">> = iolist_to_binary(re:replace("abidef","ab\\idef","fCnqs\\1FE",[])), +?line <<"fCnqsFE">> = iolist_to_binary(re:replace("abidef","ab\\idef","fCnqs\\1FE",[global])), +?line <<"QFATItqr">> = iolist_to_binary(re:replace("bc","a{0}bc","Q\\1FAT\\1Itqr",[])), +?line <<"QFATItqr">> = iolist_to_binary(re:replace("bc","a{0}bc","Q\\1FAT\\1Itqr",[global])), +?line <<"DnNn">> = iolist_to_binary(re:replace("xyz","(a|(bc)){0,0}?xyz","DnNn",[])), +?line <<"DnNn">> = iolist_to_binary(re:replace("xyz","(a|(bc)){0,0}?xyz","DnNn",[global])), +?line <<"GlvWIgK">> = iolist_to_binary(re:replace("abcde","abc[\\10]de","GlvW\\1\\1IgK",[])), +?line <<"GlvWIgK">> = iolist_to_binary(re:replace("abcde","abc[\\10]de","GlvW\\1\\1IgK",[global])), +?line <<"KDyabcdeXgxxbvI">> = iolist_to_binary(re:replace("abcde","abc[\\1]de","KDy&XgxxbvI",[])), +?line <<"KDyabcdeXgxxbvI">> = iolist_to_binary(re:replace("abcde","abc[\\1]de","KDy&XgxxbvI",[global])), +?line <<"abcSYuXabcUabckewfJS">> = iolist_to_binary(re:replace("abcde","(abc)[\\1]de","\\1SYuX\\1U\\1kewfJS",[])), +?line <<"abcSYuXabcUabckewfJS">> = iolist_to_binary(re:replace("abcde","(abc)[\\1]de","\\1SYuX\\1U\\1kewfJS",[global])), +?line <<"a +b">> = iolist_to_binary(re:replace("a +b","(?s)a.b","&",[])), +?line <<"a +b">> = iolist_to_binary(re:replace("a +b","(?s)a.b","&",[global])), +?line <<"sILYgbGPUbaNOTcccceynxed">> = iolist_to_binary(re:replace("baNOTccccd","^([^a])([^\\b])([^c]*)([^d]{3,4})","sILYg\\1GPU&eynxe",[])), +?line <<"sILYgbGPUbaNOTcccceynxed">> = iolist_to_binary(re:replace("baNOTccccd","^([^a])([^\\b])([^c]*)([^d]{3,4})","sILYg\\1GPU&eynxe",[global])), +?line <<"bURwd">> = iolist_to_binary(re:replace("baNOTcccd","^([^a])([^\\b])([^c]*)([^d]{3,4})","\\1URw",[])), +?line <<"bURwd">> = iolist_to_binary(re:replace("baNOTcccd","^([^a])([^\\b])([^c]*)([^d]{3,4})","\\1URw",[global])), +?line <<"rRcqtdVUmd">> = iolist_to_binary(re:replace("baNOTccd","^([^a])([^\\b])([^c]*)([^d]{3,4})","rRcqtdVUm",[])), +?line <<"rRcqtdVUmd">> = iolist_to_binary(re:replace("baNOTccd","^([^a])([^\\b])([^c]*)([^d]{3,4})","rRcqtdVUm",[global])), +?line <<"lYsStJbdoraarRd">> = iolist_to_binary(re:replace("bacccd","^([^a])([^\\b])([^c]*)([^d]{3,4})","lYsStJ\\1doraarR",[])), +?line <<"lYsStJbdoraarRd">> = iolist_to_binary(re:replace("bacccd","^([^a])([^\\b])([^c]*)([^d]{3,4})","lYsStJ\\1doraarR",[global])), +?line <<"*** Failersyu**c*** Failers*KH">> = iolist_to_binary(re:replace("*** Failers","^([^a])([^\\b])([^c]*)([^d]{3,4})","&yu\\1\\1c&\\1KH",[])), +?line <<"*** Failersyu**c*** Failers*KH">> = iolist_to_binary(re:replace("*** Failers","^([^a])([^\\b])([^c]*)([^d]{3,4})","&yu\\1\\1c&\\1KH",[global])), +?line <<"anything">> = iolist_to_binary(re:replace("anything","^([^a])([^\\b])([^c]*)([^d]{3,4})","&xLcPYkjD\\1YuJHCYWAIc",[])), +?line <<"anything">> = iolist_to_binary(re:replace("anything","^([^a])([^\\b])([^c]*)([^d]{3,4})","&xLcPYkjD\\1YuJHCYWAIc",[global])), +?line <<"bc">> = iolist_to_binary(re:replace("bc","^([^a])([^\\b])([^c]*)([^d]{3,4})","l\\1RIA&evjlHaNPGsYSx",[])), +?line <<"bc">> = iolist_to_binary(re:replace("bc","^([^a])([^\\b])([^c]*)([^d]{3,4})","l\\1RIA&evjlHaNPGsYSx",[global])), +?line <<"baccd">> = iolist_to_binary(re:replace("baccd","^([^a])([^\\b])([^c]*)([^d]{3,4})","SfTsSTMDCrU",[])), +?line <<"baccd">> = iolist_to_binary(re:replace("baccd","^([^a])([^\\b])([^c]*)([^d]{3,4})","SfTsSTMDCrU",[global])), +?line <<"KqAssSsdXronRAsbc">> = iolist_to_binary(re:replace("Abc","[^a]","Kq&s\\1sSsdXronR&s\\1",[])), +?line <<"KqAssSsdXronRAsKqbssSsdXronRbsKqcssSsdXronRcs">> = iolist_to_binary(re:replace("Abc","[^a]","Kq&s\\1sSsdXronR&s\\1",[global])), +?line <<"AXxbehbnMtJMOjc">> = iolist_to_binary(re:replace("Abc","[^a]","Xx&eh&nMtJMOj",[caseless])), +?line <<"AXxbehbnMtJMOjXxcehcnMtJMOj">> = iolist_to_binary(re:replace("Abc","[^a]","Xx&eh&nMtJMOj",[caseless, + global])), +?line <<"owGHnKmdtjnrJgSkEfaAbc">> = iolist_to_binary(re:replace("AAAaAbc","[^a]+","owGHnKmdtjnrJgSkEf",[])), +?line <<"owGHnKmdtjnrJgSkEfaowGHnKmdtjnrJgSkEf">> = iolist_to_binary(re:replace("AAAaAbc","[^a]+","owGHnKmdtjnrJgSkEf",[global])), +?line <<"AAAaAkm">> = iolist_to_binary(re:replace("AAAaAbc","[^a]+","\\1km",[caseless])), +?line <<"AAAaAkm">> = iolist_to_binary(re:replace("AAAaAbc","[^a]+","\\1km",[caseless, + global])), +?line <<"iBIdW">> = iolist_to_binary(re:replace("bbb +ccc","[^a]+","iB\\1I\\1d\\1\\1W",[])), +?line <<"iBIdW">> = iolist_to_binary(re:replace("bbb +ccc","[^a]+","iB\\1I\\1d\\1\\1W",[global])), +?line <<"abDIvvGgnrbcKkaSCbuiv">> = iolist_to_binary(re:replace("abc","[^k]$","DIvvGgnrb&KkaSCbuiv\\1",[])), +?line <<"abDIvvGgnrbcKkaSCbuiv">> = iolist_to_binary(re:replace("abc","[^k]$","DIvvGgnrb&KkaSCbuiv\\1",[global])), +?line <<"*** FailerbswvPHxEss">> = iolist_to_binary(re:replace("*** Failers","[^k]$","b&wvPH\\1xE&&",[])), +?line <<"*** FailerbswvPHxEss">> = iolist_to_binary(re:replace("*** Failers","[^k]$","b&wvPH\\1xE&&",[global])), +?line <<"abk">> = iolist_to_binary(re:replace("abk","[^k]$","nWvCPNUa\\1iDnbay",[])), +?line <<"abk">> = iolist_to_binary(re:replace("abk","[^k]$","nWvCPNUa\\1iDnbay",[global])), +?line <<"HWSo">> = iolist_to_binary(re:replace("abc","[^k]{2,3}$","HWSo\\1",[])), +?line <<"HWSo">> = iolist_to_binary(re:replace("abc","[^k]{2,3}$","HWSo\\1",[global])), +?line <<"kNKYkjbsvgnUOybcsuN">> = iolist_to_binary(re:replace("kbc","[^k]{2,3}$","NKYkjbsvgn\\1UO\\1y&suN",[])), +?line <<"kNKYkjbsvgnUOybcsuN">> = iolist_to_binary(re:replace("kbc","[^k]{2,3}$","NKYkjbsvgn\\1UO\\1y&suN",[global])), +?line <<"kDhBIRhnabc">> = iolist_to_binary(re:replace("kabc","[^k]{2,3}$","DhBIRhn&",[])), +?line <<"kDhBIRhnabc">> = iolist_to_binary(re:replace("kabc","[^k]{2,3}$","DhBIRhn&",[global])), +?line <<"*** FailQmVy">> = iolist_to_binary(re:replace("*** Failers","[^k]{2,3}$","QmVy",[])), +?line <<"*** FailQmVy">> = iolist_to_binary(re:replace("*** Failers","[^k]{2,3}$","QmVy",[global])), +?line <<"abk">> = iolist_to_binary(re:replace("abk","[^k]{2,3}$","L&e",[])), +?line <<"abk">> = iolist_to_binary(re:replace("abk","[^k]{2,3}$","L&e",[global])), +?line <<"akb">> = iolist_to_binary(re:replace("akb","[^k]{2,3}$","\\1aD\\1u&",[])), +?line <<"akb">> = iolist_to_binary(re:replace("akb","[^k]{2,3}$","\\1aD\\1u&",[global])), +?line <<"akk">> = iolist_to_binary(re:replace("akk","[^k]{2,3}$","lPwfbQvWcRAypQ&",[])), +?line <<"akk">> = iolist_to_binary(re:replace("akk","[^k]{2,3}$","lPwfbQvWcRAypQ&",[global])), +?line <<"12345678.b.c.d">> = iolist_to_binary(re:replace("12345678.b.c.d","^\\d{8,}\\@.+[^k]$","VKe&\\1iCfITU\\1&nqEh",[])), +?line <<"12345678.b.c.d">> = iolist_to_binary(re:replace("12345678.b.c.d","^\\d{8,}\\@.+[^k]$","VKe&\\1iCfITU\\1&nqEh",[global])), +?line <<"123456789.y.z">> = iolist_to_binary(re:replace("123456789.y.z","^\\d{8,}\\@.+[^k]$","aW\\1Jg&g",[])), +?line <<"123456789.y.z">> = iolist_to_binary(re:replace("123456789.y.z","^\\d{8,}\\@.+[^k]$","aW\\1Jg&g",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^\\d{8,}\\@.+[^k]$","lHO",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^\\d{8,}\\@.+[^k]$","lHO",[global])), +?line <<"12345678.y.uk">> = iolist_to_binary(re:replace("12345678.y.uk","^\\d{8,}\\@.+[^k]$","uVLRBqgT\\1c&\\1",[])), +?line <<"12345678.y.uk">> = iolist_to_binary(re:replace("12345678.y.uk","^\\d{8,}\\@.+[^k]$","uVLRBqgT\\1c&\\1",[global])), +?line <<"1234567.b.c.d">> = iolist_to_binary(re:replace("1234567.b.c.d","^\\d{8,}\\@.+[^k]$","VRE&uJDdtsECL",[])), +?line <<"1234567.b.c.d">> = iolist_to_binary(re:replace("1234567.b.c.d","^\\d{8,}\\@.+[^k]$","VRE&uJDdtsECL",[global])), +?line <<"XJnEEHYdC">> = iolist_to_binary(re:replace("aaaaaaaaa","(a)\\1{8,}","XJnEEHYdC",[])), +?line <<"XJnEEHYdC">> = iolist_to_binary(re:replace("aaaaaaaaa","(a)\\1{8,}","XJnEEHYdC",[global])), +?line <<"eviBaaaaaaaaaaaKMfaysHkyJyKi">> = iolist_to_binary(re:replace("aaaaaaaaaa","(a)\\1{8,}","eviB\\1&KMfaysHkyJyKi",[])), +?line <<"eviBaaaaaaaaaaaKMfaysHkyJyKi">> = iolist_to_binary(re:replace("aaaaaaaaaa","(a)\\1{8,}","eviB\\1&KMfaysHkyJyKi",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(a)\\1{8,}","DjllScfItkb&J&&Nv\\1\\1C",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(a)\\1{8,}","DjllScfItkb&J&&Nv\\1\\1C",[global])), +?line <<"aaaaaaa">> = iolist_to_binary(re:replace("aaaaaaa","(a)\\1{8,}","W&Bp\\1Bem",[])), +?line <<"aaaaaaa">> = iolist_to_binary(re:replace("aaaaaaa","(a)\\1{8,}","W&Bp\\1Bem",[global])), +?line <<"aaaaIEWbcd">> = iolist_to_binary(re:replace("aaaabcd","[^a]","IEW\\1&",[])), +?line <<"aaaaIEWbIEWcIEWd">> = iolist_to_binary(re:replace("aaaabcd","[^a]","IEW\\1&",[global])), +?line <<"aarhjHFaNDBbwVabcd">> = iolist_to_binary(re:replace("aaAabcd","[^a]","r\\1hjHFaNDBbwV",[])), +?line <<"aarhjHFaNDBbwVarhjHFaNDBbwVrhjHFaNDBbwVrhjHFaNDBbwV">> = iolist_to_binary(re:replace("aaAabcd","[^a]","r\\1hjHFaNDBbwV",[global])), +?line <<"aaaaUVFcd">> = iolist_to_binary(re:replace("aaaabcd","[^a]","U\\1V\\1F",[caseless])), +?line <<"aaaaUVFUVFUVF">> = iolist_to_binary(re:replace("aaaabcd","[^a]","U\\1V\\1F",[caseless, + global])), +?line <<"aaAacbLmqbDepcd">> = iolist_to_binary(re:replace("aaAabcd","[^a]","c&Lmq&De\\1p",[caseless])), +?line <<"aaAacbLmqbDepccLmqcDepcdLmqdDep">> = iolist_to_binary(re:replace("aaAabcd","[^a]","c&Lmq&De\\1p",[caseless, + global])), +?line <<"aaaaFtrLcd">> = iolist_to_binary(re:replace("aaaabcd","[^az]","Ftr\\1L",[])), +?line <<"aaaaFtrLFtrLFtrL">> = iolist_to_binary(re:replace("aaaabcd","[^az]","Ftr\\1L",[global])), +?line <<"aaxQoACFyabcd">> = iolist_to_binary(re:replace("aaAabcd","[^az]","xQo&C\\1Fy",[])), +?line <<"aaxQoACFyaxQobCFyxQocCFyxQodCFy">> = iolist_to_binary(re:replace("aaAabcd","[^az]","xQo&C\\1Fy",[global])), +?line <<"aaaawiJAqfcd">> = iolist_to_binary(re:replace("aaaabcd","[^az]","wiJ\\1Aq\\1f",[caseless])), +?line <<"aaaawiJAqfwiJAqfwiJAqf">> = iolist_to_binary(re:replace("aaaabcd","[^az]","wiJ\\1Aq\\1f",[caseless, + global])), +?line <<"aaAabheGsmSFcd">> = iolist_to_binary(re:replace("aaAabcd","[^az]","bheGsmSF",[caseless])), +?line <<"aaAabheGsmSFbheGsmSFbheGsmSF">> = iolist_to_binary(re:replace("aaAabcd","[^az]","bheGsmSF",[caseless, + global])), +?line <<"xxxxxxxxxxxINrCehGlgxfQWogKhXjxxxxxxxxx">> = iolist_to_binary(re:replace("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx","P[^*]TAIRE[^*]{1,6}?LL","INrCe\\1hGlgxfQWogKhXj",[])), +?line <<"xxxxxxxxxxxINrCehGlgxfQWogKhXjxxxxxxxxx">> = iolist_to_binary(re:replace("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx","P[^*]TAIRE[^*]{1,6}?LL","INrCe\\1hGlgxfQWogKhXj",[global])), +?line <<"xxxxxxxxxxxSxxxxxxxxx">> = iolist_to_binary(re:replace("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx","P[^*]TAIRE[^*]{1,}?LL","S",[])), +?line <<"xxxxxxxxxxxSxxxxxxxxx">> = iolist_to_binary(re:replace("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx","P[^*]TAIRE[^*]{1,}?LL","S",[global])), +?line <<"1yO.230003938DJNUSE">> = iolist_to_binary(re:replace("1.230003938","(\\.\\d\\d[1-9]?)\\d+","yO&DJNUSE",[])), +?line <<"1yO.230003938DJNUSE">> = iolist_to_binary(re:replace("1.230003938","(\\.\\d\\d[1-9]?)\\d+","yO&DJNUSE",[global])), +?line <<"1J.875RCmc.875000282SWmWrLgf">> = iolist_to_binary(re:replace("1.875000282","(\\.\\d\\d[1-9]?)\\d+","J\\1RCmc&SWmWrLgf",[])), +?line <<"1J.875RCmc.875000282SWmWrLgf">> = iolist_to_binary(re:replace("1.875000282","(\\.\\d\\d[1-9]?)\\d+","J\\1RCmc&SWmWrLgf",[global])), +?line <<"1QhH.23A.235j">> = iolist_to_binary(re:replace("1.235","(\\.\\d\\d[1-9]?)\\d+","QhH\\1A&j",[])), +?line <<"1QhH.23A.235j">> = iolist_to_binary(re:replace("1.235","(\\.\\d\\d[1-9]?)\\d+","QhH\\1A&j",[global])), +?line <<"1ASoXGLgq.23gkJkohg.23pCC0003938">> = iolist_to_binary(re:replace("1.230003938","(\\.\\d\\d((?=0)|\\d(?=\\d)))","ASoXGLgq\\1gkJkohg\\1pCC",[])), +?line <<"1ASoXGLgq.23gkJkohg.23pCC0003938">> = iolist_to_binary(re:replace("1.230003938","(\\.\\d\\d((?=0)|\\d(?=\\d)))","ASoXGLgq\\1gkJkohg\\1pCC",[global])), +?line <<"1rmMcAlqV000282">> = iolist_to_binary(re:replace("1.875000282","(\\.\\d\\d((?=0)|\\d(?=\\d)))","rmMcAlqV",[])), +?line <<"1rmMcAlqV000282">> = iolist_to_binary(re:replace("1.875000282","(\\.\\d\\d((?=0)|\\d(?=\\d)))","rmMcAlqV",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(\\.\\d\\d((?=0)|\\d(?=\\d)))","wpfYj&AA",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(\\.\\d\\d((?=0)|\\d(?=\\d)))","wpfYj&AA",[global])), +?line <<"1.235">> = iolist_to_binary(re:replace("1.235","(\\.\\d\\d((?=0)|\\d(?=\\d)))","Kq&VgFL",[])), +?line <<"1.235">> = iolist_to_binary(re:replace("1.235","(\\.\\d\\d((?=0)|\\d(?=\\d)))","Kq&VgFL",[global])), +?line <<"JabwbScGoababcabE">> = iolist_to_binary(re:replace("ab","a(?)b","J&wbSc\\1Go&\\1\\1&c&E",[])), +?line <<"JabwbScGoababcabE">> = iolist_to_binary(re:replace("ab","a(?)b","J&wbSc\\1Go&\\1\\1&c&E",[global])), +?line <<"Food is on the Qfoo tableygvPjujxbaDigfoo tablegCefoo table">> = iolist_to_binary(re:replace("Food is on the foo table","\\b(foo)\\s+(\\w+)","Q&ygvPjujxbaDig&gCe&",[caseless])), +?line <<"Food is on the Qfoo tableygvPjujxbaDigfoo tablegCefoo table">> = iolist_to_binary(re:replace("Food is on the foo table","\\b(foo)\\s+(\\w+)","Q&ygvPjujxbaDig&gCe&",[caseless, + global])), +?line <<"The pBETCXLfood is under the bar in the barWwWn.">> = iolist_to_binary(re:replace("The food is under the bar in the barn.","foo(.*)bar","pBETCXL&WwW",[])), +?line <<"The pBETCXLfood is under the bar in the barWwWn.">> = iolist_to_binary(re:replace("The food is under the bar in the barn.","foo(.*)bar","pBETCXL&WwW",[global])), +?line <<"The nfood is under the barnSrtWBfood is under the barXapfood is under the barr in the barn.">> = iolist_to_binary(re:replace("The food is under the bar in the barn.","foo(.*?)bar","n&nSrtWB&Xap&r",[])), +?line <<"The nfood is under the barnSrtWBfood is under the barXapfood is under the barr in the barn.">> = iolist_to_binary(re:replace("The food is under the bar in the barn.","foo(.*?)bar","n&nSrtWB&Xap&r",[global])), +?line <<"GI have 2 numbers: 53147mNBu">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*)(\\d*)","G&mNBu",[])), +?line <<"GI have 2 numbers: 53147mNBuGmNBu">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*)(\\d*)","G&mNBu",[global])), +?line <<"SI have 2 numbers: 53147">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*)(\\d+)","S&",[])), +?line <<"SI have 2 numbers: 53147">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*)(\\d+)","S&",[global])), +?line <<"bGeEvMOYIVDQHJHuI have 2 numbers: 53147">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*?)(\\d*)","bGeEvMO\\1YIVDQ&HJHu",[])), +?line <<"bGeEvMOYIVDQHJHubGeEvMOIYIVDQIHJHubGeEvMOYIVDQHJHubGeEvMO YIVDQ HJHubGeEvMOYIVDQHJHubGeEvMOhYIVDQhHJHubGeEvMOYIVDQHJHubGeEvMOaYIVDQaHJHubGeEvMOYIVDQHJHubGeEvMOvYIVDQvHJHubGeEvMOYIVDQHJHubGeEvMOeYIVDQeHJHubGeEvMOYIVDQHJHubGeEvMO YIVDQ 2HJHubGeEvMOYIVDQHJHubGeEvMO YIVDQ HJHubGeEvMOYIVDQHJHubGeEvMOnYIVDQnHJHubGeEvMOYIVDQHJHubGeEvMOuYIVDQuHJHubGeEvMOYIVDQHJHubGeEvMOmYIVDQmHJHubGeEvMOYIVDQHJHubGeEvMObYIVDQbHJHubGeEvMOYIVDQHJHubGeEvMOeYIVDQeHJHubGeEvMOYIVDQHJHubGeEvMOrYIVDQrHJHubGeEvMOYIVDQHJHubGeEvMOsYIVDQsHJHubGeEvMOYIVDQHJHubGeEvMO:YIVDQ:HJHubGeEvMOYIVDQHJHubGeEvMO YIVDQ 53147HJHubGeEvMOYIVDQHJHu">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*?)(\\d*)","bGeEvMO\\1YIVDQ&HJHu",[global])), +?line <<"I have tsI have cgpNHsI have I have U numbers: 53147">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*?)(\\d+)","\\1ts\\1cgpNHs\\1\\1U",[])), +?line <<"I have tsI have cgpNHsI have I have U numbers: ts numbers: cgpNHs numbers: numbers: U">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*?)(\\d+)","\\1ts\\1cgpNHs\\1\\1U",[global])), +?line <<"mwinCVPlFdkqGucU">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*)(\\d+)$","mwinCVPlFdkqGucU",[])), +?line <<"mwinCVPlFdkqGucU">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*)(\\d+)$","mwinCVPlFdkqGucU",[global])), +?line <<"I have 2 numbers: 53147I have 2 numbers: 53147I have 2 numbers: 53147pEI have 2 numbers: 53147o">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*?)(\\d+)$","&&&pE&o",[])), +?line <<"I have 2 numbers: 53147I have 2 numbers: 53147I have 2 numbers: 53147pEI have 2 numbers: 53147o">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*?)(\\d+)$","&&&pE&o",[global])), +?line <<"ym">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*)\\b(\\d+)$","ym",[])), +?line <<"ym">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*)\\b(\\d+)$","ym",[global])), +?line <<"FI have 2 numbers: 53147QSb">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*\\D)(\\d+)$","F&QSb",[])), +?line <<"FI have 2 numbers: 53147QSb">> = iolist_to_binary(re:replace("I have 2 numbers: 53147","(.*\\D)(\\d+)$","F&QSb",[global])), +?line <<"ABDGFHjyNAtuJTC123">> = iolist_to_binary(re:replace("ABC123","^\\D*(?!123)","&DGFHjyNAtu\\1JT",[])), +?line <<"ABDGFHjyNAtuJTC123">> = iolist_to_binary(re:replace("ABC123","^\\D*(?!123)","&DGFHjyNAtu\\1JT",[global])), +?line <<"ABCUxCRnmWFAQVrawlJ445">> = iolist_to_binary(re:replace("ABC445","^(\\D*)(?=\\d)(?!123)","\\1UxCRnmWFAQVrawlJ",[])), +?line <<"ABCUxCRnmWFAQVrawlJ445">> = iolist_to_binary(re:replace("ABC445","^(\\D*)(?=\\d)(?!123)","\\1UxCRnmWFAQVrawlJ",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(\\D*)(?=\\d)(?!123)","X\\1uOv\\1PUbsw&IOcqB",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(\\D*)(?=\\d)(?!123)","X\\1uOv\\1PUbsw&IOcqB",[global])), +?line <<"ABC123">> = iolist_to_binary(re:replace("ABC123","^(\\D*)(?=\\d)(?!123)","&efpcH\\1vtp",[])), +?line <<"ABC123">> = iolist_to_binary(re:replace("ABC123","^(\\D*)(?=\\d)(?!123)","&efpcH\\1vtp",[global])), +?line <<"X789">> = iolist_to_binary(re:replace("W46]789","^[W-]46]","X",[])), +?line <<"X789">> = iolist_to_binary(re:replace("W46]789","^[W-]46]","X",[global])), +?line <<"-46]GqowvnKBMivOCTQ789">> = iolist_to_binary(re:replace("-46]789","^[W-]46]","&GqowvnKBMiv\\1\\1OCTQ",[])), +?line <<"-46]GqowvnKBMivOCTQ789">> = iolist_to_binary(re:replace("-46]789","^[W-]46]","&GqowvnKBMiv\\1\\1OCTQ",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[W-]46]","VkkVbQHsQJe\\1Oqgp",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[W-]46]","VkkVbQHsQJe\\1Oqgp",[global])), +?line <<"Wall">> = iolist_to_binary(re:replace("Wall","^[W-]46]","A\\1",[])), +?line <<"Wall">> = iolist_to_binary(re:replace("Wall","^[W-]46]","A\\1",[global])), +?line <<"Zebra">> = iolist_to_binary(re:replace("Zebra","^[W-]46]","D\\1Gh&rRMY",[])), +?line <<"Zebra">> = iolist_to_binary(re:replace("Zebra","^[W-]46]","D\\1Gh&rRMY",[global])), +?line <<"42">> = iolist_to_binary(re:replace("42","^[W-]46]","&NkVKe",[])), +?line <<"42">> = iolist_to_binary(re:replace("42","^[W-]46]","&NkVKe",[global])), +?line <<"[abcd]">> = iolist_to_binary(re:replace("[abcd]","^[W-]46]","UhUNReBRM\\1AIyjJpNT",[])), +?line <<"[abcd]">> = iolist_to_binary(re:replace("[abcd]","^[W-]46]","UhUNReBRM\\1AIyjJpNT",[global])), +?line <<"]abcd[">> = iolist_to_binary(re:replace("]abcd[","^[W-]46]","&GSivk\\1PUgboDgD\\1Q&\\1",[])), +?line <<"]abcd[">> = iolist_to_binary(re:replace("]abcd[","^[W-]46]","&GSivk\\1PUgboDgD\\1Q&\\1",[global])), +?line <<"CiPKWjJuYp46]789">> = iolist_to_binary(re:replace("W46]789","^[W-\\]46]","CiPK&jJuYp",[])), +?line <<"CiPKWjJuYp46]789">> = iolist_to_binary(re:replace("W46]789","^[W-\\]46]","CiPK&jJuYp",[global])), +?line <<"WWGQUxNBall">> = iolist_to_binary(re:replace("Wall","^[W-\\]46]","&&G\\1QUxN\\1\\1B",[])), +?line <<"WWGQUxNBall">> = iolist_to_binary(re:replace("Wall","^[W-\\]46]","&&G\\1QUxN\\1\\1B",[global])), +?line <<"BBmKOIEOebra">> = iolist_to_binary(re:replace("Zebra","^[W-\\]46]","BBmKOI\\1E\\1O",[])), +?line <<"BBmKOIEOebra">> = iolist_to_binary(re:replace("Zebra","^[W-\\]46]","BBmKOI\\1E\\1O",[global])), +?line <<"fsXBGOoQmDJroEwPIXEylophone">> = iolist_to_binary(re:replace("Xylophone","^[W-\\]46]","f\\1s&BGOoQmDJroEwPI&E",[])), +?line <<"fsXBGOoQmDJroEwPIXEylophone">> = iolist_to_binary(re:replace("Xylophone","^[W-\\]46]","f\\1s&BGOoQmDJroEwPI&E",[global])), +?line <<"rtkSPUv4c2">> = iolist_to_binary(re:replace("42","^[W-\\]46]","rtkSPUv&c",[])), +?line <<"rtkSPUv4c2">> = iolist_to_binary(re:replace("42","^[W-\\]46]","rtkSPUv&c",[global])), +?line <<"AqCR[dTqabcd]">> = iolist_to_binary(re:replace("[abcd]","^[W-\\]46]","AqCR\\1&dTq",[])), +?line <<"AqCR[dTqabcd]">> = iolist_to_binary(re:replace("[abcd]","^[W-\\]46]","AqCR\\1&dTq",[global])), +?line <<"XG]JRsPEtL]eoabcd[">> = iolist_to_binary(re:replace("]abcd[","^[W-\\]46]","XG&JRsPEtL&e\\1o",[])), +?line <<"XG]JRsPEtL]eoabcd[">> = iolist_to_binary(re:replace("]abcd[","^[W-\\]46]","XG&JRsPEtL&e\\1o",[global])), +?line <<"YrokgJhnnbackslash">> = iolist_to_binary(re:replace("\\backslash","^[W-\\]46]","YrokgJhnn\\1",[])), +?line <<"YrokgJhnnbackslash">> = iolist_to_binary(re:replace("\\backslash","^[W-\\]46]","YrokgJhnn\\1",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[W-\\]46]","\\1l",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[W-\\]46]","\\1l",[global])), +?line <<"-46]789">> = iolist_to_binary(re:replace("-46]789","^[W-\\]46]","lUctT",[])), +?line <<"-46]789">> = iolist_to_binary(re:replace("-46]789","^[W-\\]46]","lUctT",[global])), +?line <<"well">> = iolist_to_binary(re:replace("well","^[W-\\]46]","xELX&QH\\1AsnFr&SH",[])), +?line <<"well">> = iolist_to_binary(re:replace("well","^[W-\\]46]","xELX&QH\\1AsnFr&SH",[global])), +?line <<"vword cat dog elephant mussel cow horse canary baboon snake shark otherwordword cat dog elephant mussel cow horse canary baboon snake shark otherwordKteyKVE">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark otherword","word (?:[a-zA-Z0-9]+ ){0,10}otherword","v&&KteyKVE\\1",[])), +?line <<"vword cat dog elephant mussel cow horse canary baboon snake shark otherwordword cat dog elephant mussel cow horse canary baboon snake shark otherwordKteyKVE">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark otherword","word (?:[a-zA-Z0-9]+ ){0,10}otherword","v&&KteyKVE\\1",[global])), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark","word (?:[a-zA-Z0-9]+ ){0,10}otherword","wUEYJgw",[])), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark","word (?:[a-zA-Z0-9]+ ){0,10}otherword","wUEYJgw",[global])), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope","word (?:[a-zA-Z0-9]+ ){0,300}otherword","ABdTK\\1Y\\1",[])), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope","word (?:[a-zA-Z0-9]+ ){0,300}otherword","ABdTK\\1Y\\1",[global])), +?line <<"CahYoKbcd">> = iolist_to_binary(re:replace("bcd","^(a){0,0}","\\1CahYoK",[])), +?line <<"CahYoKbcd">> = iolist_to_binary(re:replace("bcd","^(a){0,0}","\\1CahYoK",[global])), +?line <<"QcFabc">> = iolist_to_binary(re:replace("abc","^(a){0,0}","&QcF",[])), +?line <<"QcFabc">> = iolist_to_binary(re:replace("abc","^(a){0,0}","&QcF",[global])), +?line <<"BvdvcHaab">> = iolist_to_binary(re:replace("aab","^(a){0,0}","BvdvcH",[])), +?line <<"BvdvcHaab">> = iolist_to_binary(re:replace("aab","^(a){0,0}","BvdvcH",[global])), +?line <<"mtLIyIhdbcd">> = iolist_to_binary(re:replace("bcd","^(a){0,1}","mtL\\1IyIhd",[])), +?line <<"mtLIyIhdbcd">> = iolist_to_binary(re:replace("bcd","^(a){0,1}","mtL\\1IyIhd",[global])), +?line <<"oaDoeSPhHaNhncDqkiabc">> = iolist_to_binary(re:replace("abc","^(a){0,1}","o\\1DoeSPhH&NhncDqki\\1",[])), +?line <<"oaDoeSPhHaNhncDqkiabc">> = iolist_to_binary(re:replace("abc","^(a){0,1}","o\\1DoeSPhH&NhncDqki\\1",[global])), +?line <<"ahaXsxVhaFHSKPhapJQab">> = iolist_to_binary(re:replace("aab","^(a){0,1}","\\1h\\1XsxVh\\1FHSKPhapJQ",[])), +?line <<"ahaXsxVhaFHSKPhapJQab">> = iolist_to_binary(re:replace("aab","^(a){0,1}","\\1h\\1XsxVh\\1FHSKPhapJQ",[global])), +?line <<"iMdtvIhKruTIdObcd">> = iolist_to_binary(re:replace("bcd","^(a){0,2}","iMd\\1\\1\\1tvIhK&r\\1uTIdO",[])), +?line <<"iMdtvIhKruTIdObcd">> = iolist_to_binary(re:replace("bcd","^(a){0,2}","iMd\\1\\1\\1tvIhK&r\\1uTIdO",[global])), +?line <<"WYRQMjbc">> = iolist_to_binary(re:replace("abc","^(a){0,2}","WYRQMj",[])), +?line <<"WYRQMjbc">> = iolist_to_binary(re:replace("abc","^(a){0,2}","WYRQMj",[global])), +?line <<"XaKbiaaaEub">> = iolist_to_binary(re:replace("aab","^(a){0,2}","XaKbi\\1&Eu",[])), +?line <<"XaKbiaaaEub">> = iolist_to_binary(re:replace("aab","^(a){0,2}","XaKbi\\1&Eu",[global])), +?line <<"cFVbcd">> = iolist_to_binary(re:replace("bcd","^(a){0,3}","&c&&FV&",[])), +?line <<"cFVbcd">> = iolist_to_binary(re:replace("bcd","^(a){0,3}","&c&&FV&",[global])), +?line <<"gEwbc">> = iolist_to_binary(re:replace("abc","^(a){0,3}","gEw",[])), +?line <<"gEwbc">> = iolist_to_binary(re:replace("abc","^(a){0,3}","gEw",[global])), +?line <<"aaSuagMaaaaIaaKb">> = iolist_to_binary(re:replace("aab","^(a){0,3}","&Su\\1gM&&I&K",[])), +?line <<"aaSuagMaaaaIaaKb">> = iolist_to_binary(re:replace("aab","^(a){0,3}","&Su\\1gM&&I&K",[global])), +?line <<"GaaahIAJLaMaaaaaSBlaaaTU">> = iolist_to_binary(re:replace("aaa","^(a){0,3}","G&hIAJL\\1M\\1&aSBl&TU",[])), +?line <<"GaaahIAJLaMaaaaaSBlaaaTU">> = iolist_to_binary(re:replace("aaa","^(a){0,3}","G&hIAJL\\1M\\1&aSBl&TU",[global])), +?line <<"gcHyvqMebtbcd">> = iolist_to_binary(re:replace("bcd","^(a){0,}","g&cHyvqMebt",[])), +?line <<"gcHyvqMebtbcd">> = iolist_to_binary(re:replace("bcd","^(a){0,}","g&cHyvqMebt",[global])), +?line <<"atJaOxHRjOnDbc">> = iolist_to_binary(re:replace("abc","^(a){0,}","\\1tJaOxHRjOnD",[])), +?line <<"atJaOxHRjOnDbc">> = iolist_to_binary(re:replace("abc","^(a){0,}","\\1tJaOxHRjOnD",[global])), +?line <<"RlAewSMFrb">> = iolist_to_binary(re:replace("aab","^(a){0,}","RlAewSMFr",[])), +?line <<"RlAewSMFrb">> = iolist_to_binary(re:replace("aab","^(a){0,}","RlAewSMFr",[global])), +?line <<"FaaaBoIPaaaLaaaYfapavgA">> = iolist_to_binary(re:replace("aaa","^(a){0,}","F&BoIP&L&Yf\\1p\\1vgA",[])), +?line <<"FaaaBoIPaaaLaaaYfapavgA">> = iolist_to_binary(re:replace("aaa","^(a){0,}","F&BoIP&L&Yf\\1p\\1vgA",[global])), +?line <<"baaaaaaaacUvaaaaaaaaCgeDoaRaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaa","^(a){0,}","b&cUv&CgeDo\\1R&",[])), +?line <<"baaaaaaaacUvaaaaaaaaCgeDoaRaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaa","^(a){0,}","b&cUv&CgeDo\\1R&",[global])), +?line <<"bcd">> = iolist_to_binary(re:replace("bcd","^(a){1,1}","F&vqwCbrndilc&Wb\\1LRH",[])), +?line <<"bcd">> = iolist_to_binary(re:replace("bcd","^(a){1,1}","F&vqwCbrndilc&Wb\\1LRH",[global])), +?line <<"BaaYanfjPxbaabc">> = iolist_to_binary(re:replace("abc","^(a){1,1}","B\\1\\1Y\\1nfjPxb\\1&",[])), +?line <<"BaaYanfjPxbaabc">> = iolist_to_binary(re:replace("abc","^(a){1,1}","B\\1\\1Y\\1nfjPxb\\1&",[global])), +?line <<"Pab">> = iolist_to_binary(re:replace("aab","^(a){1,1}","P",[])), +?line <<"Pab">> = iolist_to_binary(re:replace("aab","^(a){1,1}","P",[global])), +?line <<"bcd">> = iolist_to_binary(re:replace("bcd","^(a){1,2}","eK\\1B&ypECvCJqtlr&",[])), +?line <<"bcd">> = iolist_to_binary(re:replace("bcd","^(a){1,2}","eK\\1B&ypECvCJqtlr&",[global])), +?line <<"QYbc">> = iolist_to_binary(re:replace("abc","^(a){1,2}","QY",[])), +?line <<"QYbc">> = iolist_to_binary(re:replace("abc","^(a){1,2}","QY",[global])), +?line <<"MbnVXaaaXhaab">> = iolist_to_binary(re:replace("aab","^(a){1,2}","MbnVX&\\1Xh&",[])), +?line <<"MbnVXaaaXhaab">> = iolist_to_binary(re:replace("aab","^(a){1,2}","MbnVX&\\1Xh&",[global])), +?line <<"bcd">> = iolist_to_binary(re:replace("bcd","^(a){1,3}","UKOH",[])), +?line <<"bcd">> = iolist_to_binary(re:replace("bcd","^(a){1,3}","UKOH",[global])), +?line <<"TJxKYHFmaaadWlbc">> = iolist_to_binary(re:replace("abc","^(a){1,3}","TJxKYHFm&&\\1dWl",[])), +?line <<"TJxKYHFmaaadWlbc">> = iolist_to_binary(re:replace("abc","^(a){1,3}","TJxKYHFm&&\\1dWl",[global])), +?line <<"ub">> = iolist_to_binary(re:replace("aab","^(a){1,3}","u",[])), +?line <<"ub">> = iolist_to_binary(re:replace("aab","^(a){1,3}","u",[global])), +?line <<"FOX">> = iolist_to_binary(re:replace("aaa","^(a){1,3}","FOX",[])), +?line <<"FOX">> = iolist_to_binary(re:replace("aaa","^(a){1,3}","FOX",[global])), +?line <<"bcd">> = iolist_to_binary(re:replace("bcd","^(a){1,}","W\\1Urn\\1O",[])), +?line <<"bcd">> = iolist_to_binary(re:replace("bcd","^(a){1,}","W\\1Urn\\1O",[global])), +?line <<"awalKDgaLeMbc">> = iolist_to_binary(re:replace("abc","^(a){1,}","\\1w\\1lKDg&LeM",[])), +?line <<"awalKDgaLeMbc">> = iolist_to_binary(re:replace("abc","^(a){1,}","\\1w\\1lKDg&LeM",[global])), +?line <<"qHVYNjismoeaasSpb">> = iolist_to_binary(re:replace("aab","^(a){1,}","qHVYNjismoe&sSp",[])), +?line <<"qHVYNjismoeaasSpb">> = iolist_to_binary(re:replace("aab","^(a){1,}","qHVYNjismoe&sSp",[global])), +?line <<"laa">> = iolist_to_binary(re:replace("aaa","^(a){1,}","la\\1",[])), +?line <<"laa">> = iolist_to_binary(re:replace("aaa","^(a){1,}","la\\1",[global])), +?line <<"UJqaaaaaaaarcaaaaaaaaQHavwaGaaaaaaaaoX">> = iolist_to_binary(re:replace("aaaaaaaa","^(a){1,}","UJq&rc&QH\\1vw\\1G&oX",[])), +?line <<"UJqaaaaaaaarcaaaaaaaaQHavwaGaaaaaaaaoX">> = iolist_to_binary(re:replace("aaaaaaaa","^(a){1,}","UJq&rc&QH\\1vw\\1G&oX",[global])), +?line <<"borfle +bib.gifs +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*\\.gif","&s",[])), +?line <<"borfle +bib.gifs +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*\\.gif","&s",[global])), +?line <<"borfle +BD +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".{0,}\\.gif","BD",[])), +?line <<"borfle +BD +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".{0,}\\.gif","BD",[global])), +?line <<"borfle +vDNsbib.gif +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*\\.gif","vDNs&",[multiline])), +?line <<"borfle +vDNsbib.gif +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*\\.gif","vDNs&",[multiline,global])), +?line <<"dPgeQVbGVD +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*\\.gif","dPge\\1QVbGVD",[dotall])), +?line <<"dPgeQVbGVD +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*\\.gif","dPge\\1QVbGVD",[dotall,global])), +?line <<"SGyevborfle +bib.gifCborfle +bib.gifWUWborfle +bib.gifHd +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*\\.gif","SGyev&C\\1&\\1\\1WUW&Hd\\1",[multiline,dotall])), +?line <<"SGyevborfle +bib.gifCborfle +bib.gifWUWborfle +bib.gifHd +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*\\.gif","SGyev&C\\1&\\1\\1WUW&Hd\\1",[multiline,dotall, + global])), +?line <<"borfle +bib.gif +BKNYIMcbaV">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","BKNYIMcbaV",[])), +?line <<"borfle +bib.gif +BKNYIMcbaVBKNYIMcbaV">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","BKNYIMcbaV",[global])), +?line <<"borflevLMilNh +bib.gif +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","&vLM\\1ilNh\\1",[multiline])), +?line <<"borflevLMilNhvLMilNh +bib.gifvLMilNhvLMilNh +novLMilNhvLMilNh">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","&vLM\\1ilNh\\1",[multiline,global])), +?line <<"borfle +bib.gif +noMtTxgborfle +bib.gif +noXborfle +bib.gif +noqKCRborfle +bib.gif +noRFb">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","&MtTxg&X&qKCR&RFb",[dotall])), +?line <<"borfle +bib.gif +noMtTxgborfle +bib.gif +noXborfle +bib.gif +noqKCRborfle +bib.gif +noRFbMtTxgXqKCRRFb">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","&MtTxg&X&qKCR&RFb",[dotall,global])), +?line <<"rb">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","rb",[multiline,dotall])), +?line <<"rbrb">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","rb",[multiline,dotall,global])), +?line <<"borfle +bib.gif +dTAVnoxiWSnoiuGHA">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","dTAV&xiWS&iuGH\\1A\\1",[])), +?line <<"borfle +bib.gif +dTAVnoxiWSnoiuGHAdTAVxiWSiuGHA">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","dTAV&xiWS&iuGH\\1A\\1",[global])), +?line <<"bcnFLv +bib.gif +no">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","bc\\1nFLv",[multiline])), +?line <<"bcnFLvbcnFLv +bcnFLvbcnFLv +bcnFLvbcnFLv">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","bc\\1nFLv",[multiline,global])), +?line <<"LIQosdWborfle +bib.gif +nogcg">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","L\\1IQosd\\1W&gcg",[dotall])), +?line <<"LIQosdWborfle +bib.gif +nogcgLIQosdWgcg">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","L\\1IQosd\\1W&gcg",[dotall,global])), +?line <<"EcPBKTVborfle +bib.gif +noPrborfle +bib.gif +noXxQSc">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","EcPBKTV&Pr&XxQSc",[multiline,dotall])), +?line <<"EcPBKTVborfle +bib.gif +noPrborfle +bib.gif +noXxQScEcPBKTVPrXxQSc">> = iolist_to_binary(re:replace("borfle +bib.gif +no",".*$","EcPBKTV&Pr&XxQSc",[multiline,dotall,global])), +?line <<"abcde +uhjjD1234XGTHcATIgH1234X1234XfbByz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(.*X|^B)","uhjjD>HcATIgH\\1\\1fbB",[])), +?line <<"abcde +uhjjD1234XGTHcATIgH1234X1234XfbByz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(.*X|^B)","uhjjD>HcATIgH\\1\\1fbB",[global])), +?line <<"dbqarFoo">> = iolist_to_binary(re:replace("BarFoo","(.*X|^B)","dbq",[])), +?line <<"dbqarFoo">> = iolist_to_binary(re:replace("BarFoo","(.*X|^B)","dbq",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(.*X|^B)","tdwOa\\1DQul",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(.*X|^B)","tdwOa\\1DQul",[global])), +?line <<"abcde +Bar">> = iolist_to_binary(re:replace("abcde +Bar","(.*X|^B)","j\\1&fFKu\\1tLJjDOmjkU",[])), +?line <<"abcde +Bar">> = iolist_to_binary(re:replace("abcde +Bar","(.*X|^B)","j\\1&fFKu\\1tLJjDOmjkU",[global])), +?line <<"abcde +cKv1234XFUwb1234XTPoWrycn1234XO1234Xyz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(.*X|^B)","cKv&FUwb&TPoWrycn&O&",[multiline])), +?line <<"abcde +cKv1234XFUwb1234XTPoWrycn1234XO1234Xyz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(.*X|^B)","cKv&FUwb&TPoWrycn&O&",[multiline,global])), +?line <<"FBHWgBBNiGBkIarFoo">> = iolist_to_binary(re:replace("BarFoo","(.*X|^B)","F&HWgB\\1NiG\\1kI",[multiline])), +?line <<"FBHWgBBNiGBkIarFoo">> = iolist_to_binary(re:replace("BarFoo","(.*X|^B)","F&HWgB\\1NiG\\1kI",[multiline, + global])), +?line <<"abcde +oArar">> = iolist_to_binary(re:replace("abcde +Bar","(.*X|^B)","oAr",[multiline])), +?line <<"abcde +oArar">> = iolist_to_binary(re:replace("abcde +Bar","(.*X|^B)","oAr",[multiline,global])), +?line <<"abcde +1234XpqJuWOcKJabcde +1234XyXyvjQwPyz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(.*X|^B)","\\1pqJuWOcKJ&yXyvjQwP",[dotall])), +?line <<"abcde +1234XpqJuWOcKJabcde +1234XyXyvjQwPyz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(.*X|^B)","\\1pqJuWOcKJ&yXyvjQwP",[dotall,global])), +?line <<"BHBBBLbBBgBBoarFoo">> = iolist_to_binary(re:replace("BarFoo","(.*X|^B)","BH\\1&&Lb&&g\\1&o",[dotall])), +?line <<"BHBBBLbBBgBBoarFoo">> = iolist_to_binary(re:replace("BarFoo","(.*X|^B)","BH\\1&&Lb&&g\\1&o",[dotall, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(.*X|^B)","&LH",[dotall])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(.*X|^B)","&LH",[dotall, + global])), +?line <<"abcde +Bar">> = iolist_to_binary(re:replace("abcde +Bar","(.*X|^B)","HvNOg&qrhICiO",[dotall])), +?line <<"abcde +Bar">> = iolist_to_binary(re:replace("abcde +Bar","(.*X|^B)","HvNOg&qrhICiO",[dotall,global])), +?line <<"eabcde +1234Xabcde +1234XIRtabcde +1234Xabcde +1234XCMGsyz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(.*X|^B)","e\\1&IRt\\1\\1CMGs",[multiline,dotall])), +?line <<"eabcde +1234Xabcde +1234XIRtabcde +1234Xabcde +1234XCMGsyz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(.*X|^B)","e\\1&IRt\\1\\1CMGs",[multiline,dotall,global])), +?line <<"MBMpwYiMLarFoo">> = iolist_to_binary(re:replace("BarFoo","(.*X|^B)","M\\1MpwYiML",[multiline, + dotall])), +?line <<"MBMpwYiMLarFoo">> = iolist_to_binary(re:replace("BarFoo","(.*X|^B)","M\\1MpwYiML",[multiline, + dotall, + global])), +?line <<"abcde +SOfar">> = iolist_to_binary(re:replace("abcde +Bar","(.*X|^B)","SOf",[multiline,dotall])), +?line <<"abcde +SOfar">> = iolist_to_binary(re:replace("abcde +Bar","(.*X|^B)","SOf",[multiline,dotall,global])), +?line <<"Xabcde +1234XIabcde +1234XJyz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(?s)(.*X|^B)","X\\1I\\1J",[])), +?line <<"Xabcde +1234XIabcde +1234XJyz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(?s)(.*X|^B)","X\\1I\\1J",[global])), +?line <<"ckBBgDwBNcECcmswBGrarFoo">> = iolist_to_binary(re:replace("BarFoo","(?s)(.*X|^B)","ck\\1&gDw\\1NcECcmsw\\1Gr",[])), +?line <<"ckBBgDwBNcECcmswBGrarFoo">> = iolist_to_binary(re:replace("BarFoo","(?s)(.*X|^B)","ck\\1&gDw\\1NcECcmsw\\1Gr",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?s)(.*X|^B)","dC\\1SBGDJPgKye\\1iTO",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?s)(.*X|^B)","dC\\1SBGDJPgKye\\1iTO",[global])), +?line <<"abcde +Bar">> = iolist_to_binary(re:replace("abcde +Bar","(?s)(.*X|^B)","hL&HrGi&",[])), +?line <<"abcde +Bar">> = iolist_to_binary(re:replace("abcde +Bar","(?s)(.*X|^B)","hL&HrGi&",[global])), +?line <<"abcde +1234Xabcde +1234XBpOYYilckyz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(?s:.*X|^B)","&&\\1BpOYYilck",[])), +?line <<"abcde +1234Xabcde +1234XBpOYYilckyz">> = iolist_to_binary(re:replace("abcde +1234Xyz","(?s:.*X|^B)","&&\\1BpOYYilck",[global])), +?line <<"ThDpSQKkSSwHarFoo">> = iolist_to_binary(re:replace("BarFoo","(?s:.*X|^B)","ThDpSQ\\1KkSSwH",[])), +?line <<"ThDpSQKkSSwHarFoo">> = iolist_to_binary(re:replace("BarFoo","(?s:.*X|^B)","ThDpSQ\\1KkSSwH",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?s:.*X|^B)","H&KaW\\1iKok\\1x&gEh&",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?s:.*X|^B)","H&KaW\\1iKok\\1x&gEh&",[global])), +?line <<"abcde +Bar">> = iolist_to_binary(re:replace("abcde +Bar","(?s:.*X|^B)","DFJoEUQUCdLTM\\1ETp",[])), +?line <<"abcde +Bar">> = iolist_to_binary(re:replace("abcde +Bar","(?s:.*X|^B)","DFJoEUQUCdLTM\\1ETp",[global])), +?line <<"**** Failers">> = iolist_to_binary(re:replace("**** Failers","^.*B","N&QUc\\1IX&",[])), +?line <<"**** Failers">> = iolist_to_binary(re:replace("**** Failers","^.*B","N&QUc\\1IX&",[global])), +?line <<"abc +B">> = iolist_to_binary(re:replace("abc +B","^.*B","XtHO\\1dFCGIat\\1\\1A\\1yj\\1",[])), +?line <<"abc +B">> = iolist_to_binary(re:replace("abc +B","^.*B","XtHO\\1dFCGIat\\1\\1A\\1yj\\1",[global])), +?line <<"yKkFabc +B">> = iolist_to_binary(re:replace("abc +B","(?s)^.*B","yKkF&",[])), +?line <<"yKkFabc +B">> = iolist_to_binary(re:replace("abc +B","(?s)^.*B","yKkF&",[global])), +?line <<"abc +AQ">> = iolist_to_binary(re:replace("abc +B","(?m)^.*B","AQ",[])), +?line <<"abc +AQ">> = iolist_to_binary(re:replace("abc +B","(?m)^.*B","AQ",[global])), +?line <<"abc +BDabc +BNabc +BxoUHHabc +Bo">> = iolist_to_binary(re:replace("abc +B","(?ms)^.*B","\\1&D&N&xoUHH&o",[])), +?line <<"abc +BDabc +BNabc +BxoUHHabc +Bo">> = iolist_to_binary(re:replace("abc +B","(?ms)^.*B","\\1&D&N&xoUHH&o",[global])), +?line <<"abc +GHgiVrjlVxqskBLR">> = iolist_to_binary(re:replace("abc +B","(?ms)^B","GHgiVrj\\1lVxqsk&LR",[])), +?line <<"abc +GHgiVrjlVxqskBLR">> = iolist_to_binary(re:replace("abc +B","(?ms)^B","GHgiVrj\\1lVxqsk&LR",[global])), +?line <<"RBtqaBce">> = iolist_to_binary(re:replace("B","(?s)B$","R&tqaBce",[])), +?line <<"RBtqaBce">> = iolist_to_binary(re:replace("B","(?s)B$","R&tqaBce",[global])), +?line <<"kG">> = iolist_to_binary(re:replace("123456654321","^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]","kG",[])), +?line <<"kG">> = iolist_to_binary(re:replace("123456654321","^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]","kG",[global])), +?line <<"Tx">> = iolist_to_binary(re:replace("123456654321","^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d","Tx",[])), +?line <<"Tx">> = iolist_to_binary(re:replace("123456654321","^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d","Tx",[global])), +?line <<"xB">> = iolist_to_binary(re:replace("123456654321","^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]","xB",[])), +?line <<"xB">> = iolist_to_binary(re:replace("123456654321","^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]","xB",[global])), +?line <<"OpPIBabcabcabcabcDcxDvlIdSoa">> = iolist_to_binary(re:replace("abcabcabcabc","^[abc]{12}","OpPIB&DcxDvlIdSoa",[])), +?line <<"OpPIBabcabcabcabcDcxDvlIdSoa">> = iolist_to_binary(re:replace("abcabcabcabc","^[abc]{12}","OpPIB&DcxDvlIdSoa",[global])), +?line <<"LGEMfnjAabcabcabcabcuAotOabcabcabcabcs">> = iolist_to_binary(re:replace("abcabcabcabc","^[a-c]{12}","LGEMfnj\\1A&uAotO&s",[])), +?line <<"LGEMfnjAabcabcabcabcuAotOabcabcabcabcs">> = iolist_to_binary(re:replace("abcabcabcabc","^[a-c]{12}","LGEMfnj\\1A&uAotO&s",[global])), +?line <<"PNcwcmOyx">> = iolist_to_binary(re:replace("abcabcabcabc","^(a|b|c){12}","PN\\1w\\1mOyx",[])), +?line <<"PNcwcmOyx">> = iolist_to_binary(re:replace("abcabcabcabc","^(a|b|c){12}","PN\\1w\\1mOyx",[global])), +?line <<"hVfRbFrAh">> = iolist_to_binary(re:replace("n","^[abcdefghijklmnopqrstuvwxy0123456789]","hVfRbFrAh",[])), +?line <<"hVfRbFrAh">> = iolist_to_binary(re:replace("n","^[abcdefghijklmnopqrstuvwxy0123456789]","hVfRbFrAh",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[abcdefghijklmnopqrstuvwxy0123456789]","R\\1gE\\1TmOo&B&\\1EaaIWLL",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[abcdefghijklmnopqrstuvwxy0123456789]","R\\1gE\\1TmOo&B&\\1EaaIWLL",[global])), +?line <<"z">> = iolist_to_binary(re:replace("z","^[abcdefghijklmnopqrstuvwxy0123456789]","dPAGng",[])), +?line <<"z">> = iolist_to_binary(re:replace("z","^[abcdefghijklmnopqrstuvwxy0123456789]","dPAGng",[global])), +?line <<"GalPHuLJkabcdJ">> = iolist_to_binary(re:replace("abcd","abcde{0,0}","Gal\\1PHu\\1LJk&J",[])), +?line <<"GalPHuLJkabcdJ">> = iolist_to_binary(re:replace("abcd","abcde{0,0}","Gal\\1PHu\\1LJk&J",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abcde{0,0}","nRSqklns\\1RNQ",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abcde{0,0}","nRSqklns\\1RNQ",[global])), +?line <<"abce">> = iolist_to_binary(re:replace("abce","abcde{0,0}","aYgl\\1WJ",[])), +?line <<"abce">> = iolist_to_binary(re:replace("abce","abcde{0,0}","aYgl\\1WJ",[global])), +?line <<"JSDhTpxGUy">> = iolist_to_binary(re:replace("abe","ab[cd]{0,0}e","J\\1SDhT\\1pxGUy",[])), +?line <<"JSDhTpxGUy">> = iolist_to_binary(re:replace("abe","ab[cd]{0,0}e","J\\1SDhT\\1pxGUy",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab[cd]{0,0}e","K\\1VVqQdlOY\\1IFC",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab[cd]{0,0}e","K\\1VVqQdlOY\\1IFC",[global])), +?line <<"abcde">> = iolist_to_binary(re:replace("abcde","ab[cd]{0,0}e","CBmXc&",[])), +?line <<"abcde">> = iolist_to_binary(re:replace("abcde","ab[cd]{0,0}e","CBmXc&",[global])), +?line <<"YKTMKcsKabd">> = iolist_to_binary(re:replace("abd","ab(c){0,0}d","YKT\\1MKcsK&",[])), +?line <<"YKTMKcsKabd">> = iolist_to_binary(re:replace("abd","ab(c){0,0}d","YKT\\1MKcsK&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab(c){0,0}d","&j&dtuA\\1A&vS",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab(c){0,0}d","&j&dtuA\\1A&vS",[global])), +?line <<"abcd">> = iolist_to_binary(re:replace("abcd","ab(c){0,0}d","&ceeJC\\1HRtWmI",[])), +?line <<"abcd">> = iolist_to_binary(re:replace("abcd","ab(c){0,0}d","&ceeJC\\1HRtWmI",[global])), +?line <<"k">> = iolist_to_binary(re:replace("a","a(b*)","\\1k",[])), +?line <<"k">> = iolist_to_binary(re:replace("a","a(b*)","\\1k",[global])), +?line <<"abnwnAb">> = iolist_to_binary(re:replace("ab","a(b*)","&nwnA\\1",[])), +?line <<"abnwnAb">> = iolist_to_binary(re:replace("ab","a(b*)","&nwnA\\1",[global])), +?line <<"nLIbbbbd">> = iolist_to_binary(re:replace("abbbb","a(b*)","nLI\\1d",[])), +?line <<"nLIbbbbd">> = iolist_to_binary(re:replace("abbbb","a(b*)","nLI\\1d",[global])), +?line <<"*** FMxgxBanxQaNgAilers">> = iolist_to_binary(re:replace("*** Failers","a(b*)","Mxgx\\1\\1B&nxQ&NgA",[])), +?line <<"*** FMxgxBanxQaNgAilers">> = iolist_to_binary(re:replace("*** Failers","a(b*)","Mxgx\\1\\1B&nxQ&NgA",[global])), +?line <<"bbbbb">> = iolist_to_binary(re:replace("bbbbb","a(b*)","Yho\\1QKp",[])), +?line <<"bbbbb">> = iolist_to_binary(re:replace("bbbbb","a(b*)","Yho\\1QKp",[global])), +?line <<"c">> = iolist_to_binary(re:replace("abe","ab\\d{0}e","c",[])), +?line <<"c">> = iolist_to_binary(re:replace("abe","ab\\d{0}e","c",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab\\d{0}e","e\\1Nu\\1BSg\\1Rxb",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab\\d{0}e","e\\1Nu\\1BSg\\1Rxb",[global])), +?line <<"ab1e">> = iolist_to_binary(re:replace("ab1e","ab\\d{0}e","C\\1xDlVAxYcYUK\\1fMs",[])), +?line <<"ab1e">> = iolist_to_binary(re:replace("ab1e","ab\\d{0}e","C\\1xDlVAxYcYUK\\1fMs",[global])), +?line <<"the MipoEquickBcm brown fox">> = iolist_to_binary(re:replace("the \"quick\" brown fox","\"([^\\\\\"]+|\\\\.)*\"","MipoE\\1Bcm",[])), +?line <<"the MipoEquickBcm brown fox">> = iolist_to_binary(re:replace("the \"quick\" brown fox","\"([^\\\\\"]+|\\\\.)*\"","MipoE\\1Bcm",[global])), +?line <<"\"the \\\"quick\\\" brown fox\"\"the \\\"quick\\\" brown fox\"K brown fox\"the \\\"quick\\\" brown fox\"twdFEi\"the \\\"quick\\\" brown fox\"Tf">> = iolist_to_binary(re:replace("\"the \\\"quick\\\" brown fox\"","\"([^\\\\\"]+|\\\\.)*\"","&&K\\1&twdFEi&Tf",[])), +?line <<"\"the \\\"quick\\\" brown fox\"\"the \\\"quick\\\" brown fox\"K brown fox\"the \\\"quick\\\" brown fox\"twdFEi\"the \\\"quick\\\" brown fox\"Tf">> = iolist_to_binary(re:replace("\"the \\\"quick\\\" brown fox\"","\"([^\\\\\"]+|\\\\.)*\"","&&K\\1&twdFEi&Tf",[global])), +?line <<"uOiYpObvYvnabc">> = iolist_to_binary(re:replace("abc","","uOiYp&\\1Obv&Yvn",[])), +?line <<"uOiYpObvYvnauOiYpObvYvnbuOiYpObvYvncuOiYpObvYvn">> = iolist_to_binary(re:replace("abc","","uOiYp&\\1Obv&Yvn",[global])), +?line <<"cacbJUVL">> = iolist_to_binary(re:replace("acb","a[^a]b","c&JUVL",[])), +?line <<"cacbJUVL">> = iolist_to_binary(re:replace("acb","a[^a]b","c&JUVL",[global])), +?line <<"a +bnnciOUFa +bttqb">> = iolist_to_binary(re:replace("a +b","a[^a]b","&nnciOUF&ttq\\1b",[])), +?line <<"a +bnnciOUFa +bttqb">> = iolist_to_binary(re:replace("a +b","a[^a]b","&nnciOUF&ttq\\1b",[global])), +?line <<"acbrJrBLmacbnacb">> = iolist_to_binary(re:replace("acb","a.b","&rJrBLm&n&",[])), +?line <<"acbrJrBLmacbnacb">> = iolist_to_binary(re:replace("acb","a.b","&rJrBLm&n&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a.b","lUyaU",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a.b","lUyaU",[global])), +?line <<"a +b">> = iolist_to_binary(re:replace("a +b","a.b","&etys",[])), +?line <<"a +b">> = iolist_to_binary(re:replace("a +b","a.b","&etys",[global])), +?line <<"BRCBYDDacbacbacbLfVw">> = iolist_to_binary(re:replace("acb","a[^a]b","BRCBY\\1D\\1D&&\\1&LfVw",[dotall])), +?line <<"BRCBYDDacbacbacbLfVw">> = iolist_to_binary(re:replace("acb","a[^a]b","BRCBY\\1D\\1D&&\\1&LfVw",[dotall, + global])), +?line <<"a +bQkfhPqa +bka +byK">> = iolist_to_binary(re:replace("a +b","a[^a]b","&Qk\\1fhPq&k&yK",[dotall])), +?line <<"a +bQkfhPqa +bka +byK">> = iolist_to_binary(re:replace("a +b","a[^a]b","&Qk\\1fhPq&k&yK",[dotall,global])), +?line <<"nKFpFMMacbmxur">> = iolist_to_binary(re:replace("acb","a.b","\\1nKF\\1\\1pF\\1MM\\1&mxur",[dotall])), +?line <<"nKFpFMMacbmxur">> = iolist_to_binary(re:replace("acb","a.b","\\1nKF\\1\\1pF\\1MM\\1&mxur",[dotall, + global])), +?line <<"RESrDVpIxqsoAT">> = iolist_to_binary(re:replace("a +b","a.b","\\1RES\\1rDVpIxqso\\1AT",[dotall])), +?line <<"RESrDVpIxqsoAT">> = iolist_to_binary(re:replace("a +b","a.b","\\1RES\\1rDVpIxqso\\1AT",[dotall,global])), +?line <<"aNchRRBHywejNvbacE">> = iolist_to_binary(re:replace("bac","^(b+?|a){1,2}?c","\\1NchRRBHywejNv&E",[])), +?line <<"aNchRRBHywejNvbacE">> = iolist_to_binary(re:replace("bac","^(b+?|a){1,2}?c","\\1NchRRBHywejNv&E",[global])), +?line <<"tOamCbbacgsmxbbac">> = iolist_to_binary(re:replace("bbac","^(b+?|a){1,2}?c","tO\\1mC&gsmx&",[])), +?line <<"tOamCbbacgsmxbbac">> = iolist_to_binary(re:replace("bbac","^(b+?|a){1,2}?c","tO\\1mC&gsmx&",[global])), +?line <<"xHTFdauecabbbacGpaol">> = iolist_to_binary(re:replace("bbbac","^(b+?|a){1,2}?c","xHTFd\\1uec\\1&Gp\\1ol",[])), +?line <<"xHTFdauecabbbacGpaol">> = iolist_to_binary(re:replace("bbbac","^(b+?|a){1,2}?c","xHTFd\\1uec\\1&Gp\\1ol",[global])), +?line <<"baapjPEIagYbbbbacvbbbbacUPkPJ">> = iolist_to_binary(re:replace("bbbbac","^(b+?|a){1,2}?c","b\\1\\1pjPEI\\1gY&v&UPkPJ",[])), +?line <<"baapjPEIagYbbbbacvbbbbacUPkPJ">> = iolist_to_binary(re:replace("bbbbac","^(b+?|a){1,2}?c","b\\1\\1pjPEI\\1gY&v&UPkPJ",[global])), +?line <<"atqCLSTaKnviKn">> = iolist_to_binary(re:replace("bbbbbac","^(b+?|a){1,2}?c","\\1tqCLST\\1KnviKn",[])), +?line <<"atqCLSTaKnviKn">> = iolist_to_binary(re:replace("bbbbbac","^(b+?|a){1,2}?c","\\1tqCLST\\1KnviKn",[global])), +?line <<"x">> = iolist_to_binary(re:replace("bac","^(b+|a){1,2}?c","x",[])), +?line <<"x">> = iolist_to_binary(re:replace("bac","^(b+|a){1,2}?c","x",[global])), +?line <<"ysaxGbbachYTP">> = iolist_to_binary(re:replace("bbac","^(b+|a){1,2}?c","ysaxG&hYTP",[])), +?line <<"ysaxGbbachYTP">> = iolist_to_binary(re:replace("bbac","^(b+|a){1,2}?c","ysaxG&hYTP",[global])), +?line <<"IxpOsaoUxbbbacCEcBow">> = iolist_to_binary(re:replace("bbbac","^(b+|a){1,2}?c","IxpOs\\1oUx&CEcBow",[])), +?line <<"IxpOsaoUxbbbacCEcBow">> = iolist_to_binary(re:replace("bbbac","^(b+|a){1,2}?c","IxpOs\\1oUx&CEcBow",[global])), +?line <<"bbbbacDeITf">> = iolist_to_binary(re:replace("bbbbac","^(b+|a){1,2}?c","&DeITf",[])), +?line <<"bbbbacDeITf">> = iolist_to_binary(re:replace("bbbbac","^(b+|a){1,2}?c","&DeITf",[global])), +?line <<"XlWabAqKnj">> = iolist_to_binary(re:replace("bbbbbac","^(b+|a){1,2}?c","XlW\\1bAqKnj",[])), +?line <<"XlWabAqKnj">> = iolist_to_binary(re:replace("bbbbbac","^(b+|a){1,2}?c","XlW\\1bAqKnj",[global])), +?line <<"x +b">> = iolist_to_binary(re:replace("x +b","(?!\\A)x","DxdEs\\1&\\1LKts&",[multiline])), +?line <<"x +b">> = iolist_to_binary(re:replace("x +b","(?!\\A)x","DxdEs\\1&\\1LKts&",[multiline,global])), +?line <<"aAx">> = iolist_to_binary(re:replace("ax","(?!\\A)x","Ax",[multiline])), +?line <<"aAx">> = iolist_to_binary(re:replace("ax","(?!\\A)x","Ax",[multiline, + global])), +?line <<"{ab}">> = iolist_to_binary(re:replace("{ab}","\\x0{ab}","aOVgpiCu\\1P\\1xjYe\\1",[])), +?line <<"{ab}">> = iolist_to_binary(re:replace("{ab}","\\x0{ab}","aOVgpiCu\\1P\\1xjYe\\1",[global])), +?line <<"PilCDnyDeI">> = iolist_to_binary(re:replace("CD","(A|B)*?CD","Pil&\\1nyDeI",[])), +?line <<"PilCDnyDeI">> = iolist_to_binary(re:replace("CD","(A|B)*?CD","Pil&\\1nyDeI",[global])), +?line <<"WrpDiffmnCDPINGCDSe">> = iolist_to_binary(re:replace("CD","(A|B)*CD","WrpDiffmn&PING&Se",[])), +?line <<"WrpDiffmnCDPINGCDSe">> = iolist_to_binary(re:replace("CD","(A|B)*CD","WrpDiffmn&PING&Se",[global])), +?line <<"mIeAB">> = iolist_to_binary(re:replace("ABABAB","(AB)*?\\1","mIe",[])), +?line <<"mIeAB">> = iolist_to_binary(re:replace("ABABAB","(AB)*?\\1","mIe",[global])), +?line <<"JThaowd">> = iolist_to_binary(re:replace("ABABAB","(AB)*\\1","JThaowd",[])), +?line <<"JThaowd">> = iolist_to_binary(re:replace("ABABAB","(AB)*\\1","JThaowd",[global])), +?line <<"mxivbdfooiW">> = iolist_to_binary(re:replace("foo","(?> = iolist_to_binary(re:replace("foo","(?> = iolist_to_binary(re:replace("catfood","(?> = iolist_to_binary(re:replace("catfood","(?> = iolist_to_binary(re:replace("arfootle","(?> = iolist_to_binary(re:replace("arfootle","(?> = iolist_to_binary(re:replace("rfoosh","(?> = iolist_to_binary(re:replace("rfoosh","(?> = iolist_to_binary(re:replace("*** Failers","(?> = iolist_to_binary(re:replace("*** Failers","(?> = iolist_to_binary(re:replace("barfoo","(?> = iolist_to_binary(re:replace("barfoo","(?> = iolist_to_binary(re:replace("towbarfoo","(?> = iolist_to_binary(re:replace("towbarfoo","(?> = iolist_to_binary(re:replace("catfood","\\w{3}(?> = iolist_to_binary(re:replace("catfood","\\w{3}(?> = iolist_to_binary(re:replace("*** Failers","\\w{3}(?> = iolist_to_binary(re:replace("*** Failers","\\w{3}(?> = iolist_to_binary(re:replace("foo","\\w{3}(?> = iolist_to_binary(re:replace("foo","\\w{3}(?> = iolist_to_binary(re:replace("barfoo","\\w{3}(?> = iolist_to_binary(re:replace("barfoo","\\w{3}(?> = iolist_to_binary(re:replace("towbarfoo","\\w{3}(?> = iolist_to_binary(re:replace("towbarfoo","\\w{3}(?> = iolist_to_binary(re:replace("fooabar","(?<=(foo)a)bar","&SW\\1&",[])), +?line <<"fooabarSWfoobar">> = iolist_to_binary(re:replace("fooabar","(?<=(foo)a)bar","&SW\\1&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=(foo)a)bar","&ShYlKf",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=(foo)a)bar","&ShYlKf",[global])), +?line <<"bar">> = iolist_to_binary(re:replace("bar","(?<=(foo)a)bar","Usk\\1PJ&",[])), +?line <<"bar">> = iolist_to_binary(re:replace("bar","(?<=(foo)a)bar","Usk\\1PJ&",[global])), +?line <<"foobbar">> = iolist_to_binary(re:replace("foobbar","(?<=(foo)a)bar","\\1pXSA",[])), +?line <<"foobbar">> = iolist_to_binary(re:replace("foobbar","(?<=(foo)a)bar","\\1pXSA",[global])), +?line <<"gWabcqJMuvLrGqnPLJK">> = iolist_to_binary(re:replace("abc","\\Aabc\\z","gW&qJ\\1MuvLrGqnPLJK",[multiline])), +?line <<"gWabcqJMuvLrGqnPLJK">> = iolist_to_binary(re:replace("abc","\\Aabc\\z","gW&qJ\\1MuvLrGqnPLJK",[multiline, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\Aabc\\z","tcIt&YpWtGEy\\1p",[multiline])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\Aabc\\z","tcIt&YpWtGEy\\1p",[multiline, + global])), +?line <<"abcM">> = iolist_to_binary(re:replace("abc","\\Aabc\\z","&M",[multiline])), +?line <<"abcM">> = iolist_to_binary(re:replace("abc","\\Aabc\\z","&M",[multiline, + global])), +?line <<"qqq +abc">> = iolist_to_binary(re:replace("qqq +abc","\\Aabc\\z","B\\1B\\1fqK\\1nocSHwGCCiM",[multiline])), +?line <<"qqq +abc">> = iolist_to_binary(re:replace("qqq +abc","\\Aabc\\z","B\\1B\\1fqK\\1nocSHwGCCiM",[multiline,global])), +?line <<"abc +zzz">> = iolist_to_binary(re:replace("abc +zzz","\\Aabc\\z","P",[multiline])), +?line <<"abc +zzz">> = iolist_to_binary(re:replace("abc +zzz","\\Aabc\\z","P",[multiline,global])), +?line <<"qqq +abc +zzz">> = iolist_to_binary(re:replace("qqq +abc +zzz","\\Aabc\\z","\\1adD\\1",[multiline])), +?line <<"qqq +abc +zzz">> = iolist_to_binary(re:replace("qqq +abc +zzz","\\Aabc\\z","\\1adD\\1",[multiline,global])), +?line <<"1U">> = iolist_to_binary(re:replace("1.230003938","(?>(\\.\\d\\d[1-9]?))\\d+","U",[])), +?line <<"1U">> = iolist_to_binary(re:replace("1.230003938","(?>(\\.\\d\\d[1-9]?))\\d+","U",[global])), +?line <<"1bJ.875fwFYOodDWXyr.875tm.875000282.875000282">> = iolist_to_binary(re:replace("1.875000282","(?>(\\.\\d\\d[1-9]?))\\d+","bJ\\1fwFYOodDWXyr\\1tm&&",[])), +?line <<"1bJ.875fwFYOodDWXyr.875tm.875000282.875000282">> = iolist_to_binary(re:replace("1.875000282","(?>(\\.\\d\\d[1-9]?))\\d+","bJ\\1fwFYOodDWXyr\\1tm&&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?>(\\.\\d\\d[1-9]?))\\d+","e\\1JPFf&",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?>(\\.\\d\\d[1-9]?))\\d+","e\\1JPFf&",[global])), +?line <<"1.235">> = iolist_to_binary(re:replace("1.235","(?>(\\.\\d\\d[1-9]?))\\d+","yOPhp&Vy&fKXLBmiJx\\1a",[])), +?line <<"1.235">> = iolist_to_binary(re:replace("1.235","(?>(\\.\\d\\d[1-9]?))\\d+","yOPhp&Vy&fKXLBmiJx\\1a",[global])), +?line <<"partynow is the time for all good men to come to the aid of the partycnow is the time for all good men to come to the aid of the partynow is the time for all good men to come to the aid of the partypartyyecj">> = iolist_to_binary(re:replace("now is the time for all good men to come to the aid of the party","^((?>\\w+)|(?>\\s+))*$","\\1&c&&\\1yecj",[])), +?line <<"partynow is the time for all good men to come to the aid of the partycnow is the time for all good men to come to the aid of the partynow is the time for all good men to come to the aid of the partypartyyecj">> = iolist_to_binary(re:replace("now is the time for all good men to come to the aid of the party","^((?>\\w+)|(?>\\s+))*$","\\1&c&&\\1yecj",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^((?>\\w+)|(?>\\s+))*$","\\1u",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^((?>\\w+)|(?>\\s+))*$","\\1u",[global])), +?line <<"this is not a line with only words and spaces!">> = iolist_to_binary(re:replace("this is not a line with only words and spaces!","^((?>\\w+)|(?>\\s+))*$","gH&CX\\1&vnufnGXYAun",[])), +?line <<"this is not a line with only words and spaces!">> = iolist_to_binary(re:replace("this is not a line with only words and spaces!","^((?>\\w+)|(?>\\s+))*$","gH&CX\\1&vnufnGXYAun",[global])), +?line <<"K1234512345aH12345a">> = iolist_to_binary(re:replace("12345a","(\\d+)(\\w)","K\\1&H&",[])), +?line <<"K1234512345aH12345a">> = iolist_to_binary(re:replace("12345a","(\\d+)(\\w)","K\\1&H&",[global])), +?line <<"IdNK+">> = iolist_to_binary(re:replace("12345+","(\\d+)(\\w)","IdNK",[])), +?line <<"IdNK+">> = iolist_to_binary(re:replace("12345+","(\\d+)(\\w)","IdNK",[global])), +?line <<"jvjjhmthsl">> = iolist_to_binary(re:replace("12345a","((?>\\d+))(\\w)","jvjjhmthsl",[])), +?line <<"jvjjhmthsl">> = iolist_to_binary(re:replace("12345a","((?>\\d+))(\\w)","jvjjhmthsl",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","((?>\\d+))(\\w)","eK&NTn&\\1T",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","((?>\\d+))(\\w)","eK&NTn&\\1T",[global])), +?line <<"12345+">> = iolist_to_binary(re:replace("12345+","((?>\\d+))(\\w)","&&TXSquRgMqkDs&K&",[])), +?line <<"12345+">> = iolist_to_binary(re:replace("12345+","((?>\\d+))(\\w)","&&TXSquRgMqkDs&K&",[global])), +?line <<"NeYcvQCaaabtbOkx">> = iolist_to_binary(re:replace("aaab","(?>a+)b","NeYcvQC&tbOkx\\1",[])), +?line <<"NeYcvQCaaabtbOkx">> = iolist_to_binary(re:replace("aaab","(?>a+)b","NeYcvQC&tbOkx\\1",[global])), +?line <<"aaabbaaabFOSaaabKKtRUNaaabLDTCH">> = iolist_to_binary(re:replace("aaab","((?>a+)b)","&b&FOS&KKtRUN\\1LDTCH",[])), +?line <<"aaabbaaabFOSaaabKKtRUNaaabLDTCH">> = iolist_to_binary(re:replace("aaab","((?>a+)b)","&b&FOS&KKtRUN\\1LDTCH",[global])), +?line <<"xaaabaaabaaaiaaabCaGaaaaaabaaaaaaaaabaaabaaaF">> = iolist_to_binary(re:replace("aaab","(?>(a+))b","x\\1b&\\1i&CaG\\1&\\1\\1&&\\1F",[])), +?line <<"xaaabaaabaaaiaaabCaGaaaaaabaaaaaaaaabaaabaaaF">> = iolist_to_binary(re:replace("aaab","(?>(a+))b","x\\1b&\\1i&CaG\\1&\\1\\1&&\\1F",[global])), +?line <<"aaaLDSAYvgtbbbotccc">> = iolist_to_binary(re:replace("aaabbbccc","(?>b)+","LDSAYvgt&ot",[])), +?line <<"aaaLDSAYvgtbbbotccc">> = iolist_to_binary(re:replace("aaabbbccc","(?>b)+","LDSAYvgt&ot",[global])), +?line <<"ABQFhQjYaaabbbbcAcccd">> = iolist_to_binary(re:replace("aaabbbbccccd","(?>a+|b+|c+)*c","ABQ\\1Fh\\1QjY&A",[])), +?line <<"ABQFhQjYaaabbbbcAABQFhQjYcAABQFhQjYcAABQFhQjYcAd">> = iolist_to_binary(re:replace("aaabbbbccccd","(?>a+|b+|c+)*c","ABQ\\1Fh\\1QjY&A",[global])), +?line <<"((xiabc(ade)ufh()()xpJf">> = iolist_to_binary(re:replace("((abc(ade)ufh()()x","((?>[^()]+)|\\([^()]*\\))+","\\1i&pJf",[])), +?line <<"((xiabc(ade)ufh()()xpJf">> = iolist_to_binary(re:replace("((abc(ade)ufh()()x","((?>[^()]+)|\\([^()]*\\))+","\\1i&pJf",[global])), +?line <<"NBF">> = iolist_to_binary(re:replace("(abc)","\\(((?>[^()]+)|\\([^()]+\\))+\\)","NBF",[])), +?line <<"NBF">> = iolist_to_binary(re:replace("(abc)","\\(((?>[^()]+)|\\([^()]+\\))+\\)","NBF",[global])), +?line <<"(abc(def)xyz)AFLTv">> = iolist_to_binary(re:replace("(abc(def)xyz)","\\(((?>[^()]+)|\\([^()]+\\))+\\)","&AFLTv",[])), +?line <<"(abc(def)xyz)AFLTv">> = iolist_to_binary(re:replace("(abc(def)xyz)","\\(((?>[^()]+)|\\([^()]+\\))+\\)","&AFLTv",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\(((?>[^()]+)|\\([^()]+\\))+\\)","P\\1OC",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\(((?>[^()]+)|\\([^()]+\\))+\\)","P\\1OC",[global])), +?line <<"((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","\\(((?>[^()]+)|\\([^()]+\\))+\\)","u\\1\\1H\\1TOt\\1fVI&X",[])), +?line <<"((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","\\(((?>[^()]+)|\\([^()]+\\))+\\)","u\\1\\1H\\1TOt\\1fVI&X",[global])), +?line <<"E">> = iolist_to_binary(re:replace("ab","a(?-i)b","E",[caseless])), +?line <<"E">> = iolist_to_binary(re:replace("ab","a(?-i)b","E",[caseless, + global])), +?line <<"hAboOovpk">> = iolist_to_binary(re:replace("Ab","a(?-i)b","h&oOovpk",[caseless])), +?line <<"hAboOovpk">> = iolist_to_binary(re:replace("Ab","a(?-i)b","h&oOovpk",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a(?-i)b","liOu",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a(?-i)b","liOu",[caseless, + global])), +?line <<"aB">> = iolist_to_binary(re:replace("aB","a(?-i)b","P",[caseless])), +?line <<"aB">> = iolist_to_binary(re:replace("aB","a(?-i)b","P",[caseless, + global])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","a(?-i)b","GdSF&e&",[caseless])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","a(?-i)b","GdSF&e&",[caseless, + global])), +?line <<"a bcd eSPWrUhOwa">> = iolist_to_binary(re:replace("a bcd e","(a (?x)b c)d e","&SPWrUhOwa",[])), +?line <<"a bcd eSPWrUhOwa">> = iolist_to_binary(re:replace("a bcd e","(a (?x)b c)d e","&SPWrUhOwa",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(a (?x)b c)d e","IgDGvOUoEIi",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(a (?x)b c)d e","IgDGvOUoEIi",[global])), +?line <<"a b cd e">> = iolist_to_binary(re:replace("a b cd e","(a (?x)b c)d e","C\\1Lora&uj\\1nePq",[])), +?line <<"a b cd e">> = iolist_to_binary(re:replace("a b cd e","(a (?x)b c)d e","C\\1Lora&uj\\1nePq",[global])), +?line <<"abcd e">> = iolist_to_binary(re:replace("abcd e","(a (?x)b c)d e","M",[])), +?line <<"abcd e">> = iolist_to_binary(re:replace("abcd e","(a (?x)b c)d e","M",[global])), +?line <<"a bcde">> = iolist_to_binary(re:replace("a bcde","(a (?x)b c)d e","mNwUc&",[])), +?line <<"a bcde">> = iolist_to_binary(re:replace("a bcde","(a (?x)b c)d e","mNwUc&",[global])), +?line <<"a bcde fTra bcde fnDatbuPn">> = iolist_to_binary(re:replace("a bcde f","(a b(?x)c d (?-x)e f)","&Tr\\1nDatbuPn",[])), +?line <<"a bcde fTra bcde fnDatbuPn">> = iolist_to_binary(re:replace("a bcde f","(a b(?x)c d (?-x)e f)","&Tr\\1nDatbuPn",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(a b(?x)c d (?-x)e f)","\\1AXE&qrGnJBeg",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(a b(?x)c d (?-x)e f)","\\1AXE&qrGnJBeg",[global])), +?line <<"abcdef">> = iolist_to_binary(re:replace("abcdef","(a b(?x)c d (?-x)e f)","YXaHuSXEMrxHLIUXuNu\\1",[])), +?line <<"abcdef">> = iolist_to_binary(re:replace("abcdef","(a b(?x)c d (?-x)e f)","YXaHuSXEMrxHLIUXuNu\\1",[global])), +?line <<"AmT">> = iolist_to_binary(re:replace("abc","(a(?i)b)c","AmT",[])), +?line <<"AmT">> = iolist_to_binary(re:replace("abc","(a(?i)b)c","AmT",[global])), +?line <<"CYjrwVi">> = iolist_to_binary(re:replace("aBc","(a(?i)b)c","CYjrwVi",[])), +?line <<"CYjrwVi">> = iolist_to_binary(re:replace("aBc","(a(?i)b)c","CYjrwVi",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(a(?i)b)c","STYFgfjhE&dcc",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(a(?i)b)c","STYFgfjhE&dcc",[global])), +?line <<"abC">> = iolist_to_binary(re:replace("abC","(a(?i)b)c","BAcmfc\\1fAfr&o",[])), +?line <<"abC">> = iolist_to_binary(re:replace("abC","(a(?i)b)c","BAcmfc\\1fAfr&o",[global])), +?line <<"aBC">> = iolist_to_binary(re:replace("aBC","(a(?i)b)c","NGkAgBCJxbCgR",[])), +?line <<"aBC">> = iolist_to_binary(re:replace("aBC","(a(?i)b)c","NGkAgBCJxbCgR",[global])), +?line <<"Abc">> = iolist_to_binary(re:replace("Abc","(a(?i)b)c","aS&kKYGwkOB&YhadhLX",[])), +?line <<"Abc">> = iolist_to_binary(re:replace("Abc","(a(?i)b)c","aS&kKYGwkOB&YhadhLX",[global])), +?line <<"ABc">> = iolist_to_binary(re:replace("ABc","(a(?i)b)c","hP\\1RiAIeDp",[])), +?line <<"ABc">> = iolist_to_binary(re:replace("ABc","(a(?i)b)c","hP\\1RiAIeDp",[global])), +?line <<"ABC">> = iolist_to_binary(re:replace("ABC","(a(?i)b)c","Jj&j\\1&I&\\1&CR\\1qDG",[])), +?line <<"ABC">> = iolist_to_binary(re:replace("ABC","(a(?i)b)c","Jj&j\\1&I&\\1&CR\\1qDG",[global])), +?line <<"AbC">> = iolist_to_binary(re:replace("AbC","(a(?i)b)c","\\1h\\1XCNuqcxa",[])), +?line <<"AbC">> = iolist_to_binary(re:replace("AbC","(a(?i)b)c","\\1h\\1XCNuqcxa",[global])), +?line <<"hsDxrqJjHQabc">> = iolist_to_binary(re:replace("abc","a(?i:b)c","hsDxrqJjHQ&",[])), +?line <<"hsDxrqJjHQabc">> = iolist_to_binary(re:replace("abc","a(?i:b)c","hsDxrqJjHQ&",[global])), +?line <<"QltXULOSWaBcFaBcS">> = iolist_to_binary(re:replace("aBc","a(?i:b)c","Qlt\\1XU\\1L\\1OSW&F&S",[])), +?line <<"QltXULOSWaBcFaBcS">> = iolist_to_binary(re:replace("aBc","a(?i:b)c","Qlt\\1XU\\1L\\1OSW&F&S",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a(?i:b)c","owyoniUsut",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a(?i:b)c","owyoniUsut",[global])), +?line <<"ABC">> = iolist_to_binary(re:replace("ABC","a(?i:b)c","unB&TlphDWAD",[])), +?line <<"ABC">> = iolist_to_binary(re:replace("ABC","a(?i:b)c","unB&TlphDWAD",[global])), +?line <<"abC">> = iolist_to_binary(re:replace("abC","a(?i:b)c","\\1XaX&kAbe&\\1V",[])), +?line <<"abC">> = iolist_to_binary(re:replace("abC","a(?i:b)c","\\1XaX&kAbe&\\1V",[global])), +?line <<"aBC">> = iolist_to_binary(re:replace("aBC","a(?i:b)c","IY\\1aQ&tM\\1",[])), +?line <<"aBC">> = iolist_to_binary(re:replace("aBC","a(?i:b)c","IY\\1aQ&tM\\1",[global])), +?line <<"aBcOHQouBOaBc">> = iolist_to_binary(re:replace("aBc","a(?i:b)*c","&O\\1HQo\\1uBO&",[])), +?line <<"aBcOHQouBOaBc">> = iolist_to_binary(re:replace("aBc","a(?i:b)*c","&O\\1HQo\\1uBO&",[global])), +?line <<"lvjhpFaBBceaBBciWQNaBBcr">> = iolist_to_binary(re:replace("aBBc","a(?i:b)*c","lvjhpF&e&i\\1WQN\\1&r",[])), +?line <<"lvjhpFaBBceaBBciWQNaBBcr">> = iolist_to_binary(re:replace("aBBc","a(?i:b)*c","lvjhpF&e&i\\1WQN\\1&r",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a(?i:b)*c","\\1",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a(?i:b)*c","\\1",[global])), +?line <<"aBC">> = iolist_to_binary(re:replace("aBC","a(?i:b)*c","OaR&&ytX",[])), +?line <<"aBC">> = iolist_to_binary(re:replace("aBC","a(?i:b)*c","OaR&&ytX",[global])), +?line <<"aBBC">> = iolist_to_binary(re:replace("aBBC","a(?i:b)*c","Su",[])), +?line <<"aBBC">> = iolist_to_binary(re:replace("aBBC","a(?i:b)*c","Su",[global])), +?line <<"abcdabcdalFfabcdsPxC">> = iolist_to_binary(re:replace("abcd","a(?=b(?i)c)\\w\\wd","&&alFf&sPxC",[])), +?line <<"abcdabcdalFfabcdsPxC">> = iolist_to_binary(re:replace("abcd","a(?=b(?i)c)\\w\\wd","&&alFf&sPxC",[global])), +?line <<"hNuQEFvcSEabCdQTlwEabCd">> = iolist_to_binary(re:replace("abCd","a(?=b(?i)c)\\w\\wd","hNuQEFvcSE\\1&QTlwE&",[])), +?line <<"hNuQEFvcSEabCdQTlwEabCd">> = iolist_to_binary(re:replace("abCd","a(?=b(?i)c)\\w\\wd","hNuQEFvcSE\\1&QTlwE&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a(?=b(?i)c)\\w\\wd","YLT",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a(?=b(?i)c)\\w\\wd","YLT",[global])), +?line <<"aBCd">> = iolist_to_binary(re:replace("aBCd","a(?=b(?i)c)\\w\\wd","u",[])), +?line <<"aBCd">> = iolist_to_binary(re:replace("aBCd","a(?=b(?i)c)\\w\\wd","u",[global])), +?line <<"abcD">> = iolist_to_binary(re:replace("abcD","a(?=b(?i)c)\\w\\wd","PIaL\\1rCHujWQjtBluw",[])), +?line <<"abcD">> = iolist_to_binary(re:replace("abcD","a(?=b(?i)c)\\w\\wd","PIaL\\1rCHujWQjtBluw",[global])), +?line <<"JklClgvcUHdcbpmore than million">> = iolist_to_binary(re:replace("more than million","(?s-i:more.*than).*million","JklCl\\1gvc\\1UHdcbp&",[caseless])), +?line <<"JklClgvcUHdcbpmore than million">> = iolist_to_binary(re:replace("more than million","(?s-i:more.*than).*million","JklCl\\1gvc\\1UHdcbp&",[caseless, + global])), +?line <<"RaiCEcYVVcTj">> = iolist_to_binary(re:replace("more than MILLION","(?s-i:more.*than).*million","R\\1\\1\\1aiCEcYVVcTj",[caseless])), +?line <<"RaiCEcYVVcTj">> = iolist_to_binary(re:replace("more than MILLION","(?s-i:more.*than).*million","R\\1\\1\\1aiCEcYVVcTj",[caseless, + global])), +?line <<"AGtSe">> = iolist_to_binary(re:replace("more + than Million","(?s-i:more.*than).*million","AGtSe",[caseless])), +?line <<"AGtSe">> = iolist_to_binary(re:replace("more + than Million","(?s-i:more.*than).*million","AGtSe",[caseless,global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?s-i:more.*than).*million","vIAbYe&Vw\\1&VD",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?s-i:more.*than).*million","vIAbYe&Vw\\1&VD",[caseless, + global])), +?line <<"MORE THAN MILLION">> = iolist_to_binary(re:replace("MORE THAN MILLION","(?s-i:more.*than).*million","LhBYPjwD\\1kJ\\1",[caseless])), +?line <<"MORE THAN MILLION">> = iolist_to_binary(re:replace("MORE THAN MILLION","(?s-i:more.*than).*million","LhBYPjwD\\1kJ\\1",[caseless, + global])), +?line <<"more + than + million">> = iolist_to_binary(re:replace("more + than + million","(?s-i:more.*than).*million","SSp\\1ttOwEGO&H",[caseless])), +?line <<"more + than + million">> = iolist_to_binary(re:replace("more + than + million","(?s-i:more.*than).*million","SSp\\1ttOwEGO&H",[caseless, + global])), +?line <<"dmore than millionhFexWTaTmclBHK">> = iolist_to_binary(re:replace("more than million","(?:(?s-i)more.*than).*million","d&hFexWTaT\\1\\1mc\\1\\1lBHK",[caseless])), +?line <<"dmore than millionhFexWTaTmclBHK">> = iolist_to_binary(re:replace("more than million","(?:(?s-i)more.*than).*million","d&hFexWTaT\\1\\1mc\\1\\1lBHK",[caseless, + global])), +?line <<"wcVAikDmore than MILLIONFsmore than MILLIONIceKiuDm">> = iolist_to_binary(re:replace("more than MILLION","(?:(?s-i)more.*than).*million","wcVAikD&Fs&Ice\\1KiuDm",[caseless])), +?line <<"wcVAikDmore than MILLIONFsmore than MILLIONIceKiuDm">> = iolist_to_binary(re:replace("more than MILLION","(?:(?s-i)more.*than).*million","wcVAikD&Fs&Ice\\1KiuDm",[caseless, + global])), +?line <<"BMxnsX">> = iolist_to_binary(re:replace("more + than Million","(?:(?s-i)more.*than).*million","BMx\\1nsX",[caseless])), +?line <<"BMxnsX">> = iolist_to_binary(re:replace("more + than Million","(?:(?s-i)more.*than).*million","BMx\\1nsX",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?:(?s-i)more.*than).*million","e\\1KeC\\1LrMA",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?:(?s-i)more.*than).*million","e\\1KeC\\1LrMA",[caseless, + global])), +?line <<"MORE THAN MILLION">> = iolist_to_binary(re:replace("MORE THAN MILLION","(?:(?s-i)more.*than).*million","Oo&U&\\1O\\1royLyh\\1Uj\\1&e",[caseless])), +?line <<"MORE THAN MILLION">> = iolist_to_binary(re:replace("MORE THAN MILLION","(?:(?s-i)more.*than).*million","Oo&U&\\1O\\1royLyh\\1Uj\\1&e",[caseless, + global])), +?line <<"more + than + million">> = iolist_to_binary(re:replace("more + than + million","(?:(?s-i)more.*than).*million","rsd\\1UhwpU\\1&S",[caseless])), +?line <<"more + than + million">> = iolist_to_binary(re:replace("more + than + million","(?:(?s-i)more.*than).*million","rsd\\1UhwpU\\1&S",[caseless, + global])), +?line <<"rTdtycUabcoabcVaVEt">> = iolist_to_binary(re:replace("abc","(?>a(?i)b+)+c","r\\1\\1T\\1dtycU&o&V\\1aV\\1Et",[])), +?line <<"rTdtycUabcoabcVaVEt">> = iolist_to_binary(re:replace("abc","(?>a(?i)b+)+c","r\\1\\1T\\1dtycU&o&V\\1aV\\1Et",[global])), +?line <<"geFTAcqhWJc">> = iolist_to_binary(re:replace("aBbc","(?>a(?i)b+)+c","geFTAc\\1qhWJ\\1c",[])), +?line <<"geFTAcqhWJc">> = iolist_to_binary(re:replace("aBbc","(?>a(?i)b+)+c","geFTAc\\1qhWJ\\1c",[global])), +?line <<"lHStMaBBcnaBBcjCaBBcgdfm">> = iolist_to_binary(re:replace("aBBc","(?>a(?i)b+)+c","lHStM&n&jC&g\\1df\\1m",[])), +?line <<"lHStMaBBcnaBBcjCaBBcgdfm">> = iolist_to_binary(re:replace("aBBc","(?>a(?i)b+)+c","lHStM&n&jC&g\\1df\\1m",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?>a(?i)b+)+c","U\\1pOiN&FCXl",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?>a(?i)b+)+c","U\\1pOiN&FCXl",[global])), +?line <<"Abc">> = iolist_to_binary(re:replace("Abc","(?>a(?i)b+)+c","h",[])), +?line <<"Abc">> = iolist_to_binary(re:replace("Abc","(?>a(?i)b+)+c","h",[global])), +?line <<"abAb">> = iolist_to_binary(re:replace("abAb","(?>a(?i)b+)+c","f\\1\\1DwX\\1Y&y\\1dgv&A\\1",[])), +?line <<"abAb">> = iolist_to_binary(re:replace("abAb","(?>a(?i)b+)+c","f\\1\\1DwX\\1Y&y\\1dgv&A\\1",[global])), +?line <<"abbC">> = iolist_to_binary(re:replace("abbC","(?>a(?i)b+)+c","&\\1Gd&r\\1shP",[])), +?line <<"abbC">> = iolist_to_binary(re:replace("abbC","(?>a(?i)b+)+c","&\\1Gd&r\\1shP",[global])), +?line <<"VIaLabcabcCabcyvwsI">> = iolist_to_binary(re:replace("abc","(?=a(?i)b)\\w\\wc","VIaL&&C&yvwsI",[])), +?line <<"VIaLabcabcCabcyvwsI">> = iolist_to_binary(re:replace("abc","(?=a(?i)b)\\w\\wc","VIaL&&C&yvwsI",[global])), +?line <<"gaBcaBc">> = iolist_to_binary(re:replace("aBc","(?=a(?i)b)\\w\\wc","g&&",[])), +?line <<"gaBcaBc">> = iolist_to_binary(re:replace("aBc","(?=a(?i)b)\\w\\wc","g&&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?=a(?i)b)\\w\\wc","RMcFr&",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?=a(?i)b)\\w\\wc","RMcFr&",[global])), +?line <<"Ab">> = iolist_to_binary(re:replace("Ab","(?=a(?i)b)\\w\\wc","y\\1&kD&os\\1E",[])), +?line <<"Ab">> = iolist_to_binary(re:replace("Ab","(?=a(?i)b)\\w\\wc","y\\1&kD&os\\1E",[global])), +?line <<"abC">> = iolist_to_binary(re:replace("abC","(?=a(?i)b)\\w\\wc","ms\\1m",[])), +?line <<"abC">> = iolist_to_binary(re:replace("abC","(?=a(?i)b)\\w\\wc","ms\\1m",[global])), +?line <<"aBC">> = iolist_to_binary(re:replace("aBC","(?=a(?i)b)\\w\\wc","lD&&vcs",[])), +?line <<"aBC">> = iolist_to_binary(re:replace("aBC","(?=a(?i)b)\\w\\wc","lD&&vcs",[global])), +?line <<"abxqXfVViuPuvfMxxcvcj">> = iolist_to_binary(re:replace("abxxc","(?<=a(?i)b)(\\w\\w)c","xqXfVViuPuvfM&vcj",[])), +?line <<"abxqXfVViuPuvfMxxcvcj">> = iolist_to_binary(re:replace("abxxc","(?<=a(?i)b)(\\w\\w)c","xqXfVViuPuvfM&vcj",[global])), +?line <<"aBXoxxcXtiuxxXqWYfixxKxxcxxUs">> = iolist_to_binary(re:replace("aBxxc","(?<=a(?i)b)(\\w\\w)c","Xo&Xtiu\\1XqWYfi\\1K&\\1Us",[])), +?line <<"aBXoxxcXtiuxxXqWYfixxKxxcxxUs">> = iolist_to_binary(re:replace("aBxxc","(?<=a(?i)b)(\\w\\w)c","Xo&Xtiu\\1XqWYfi\\1K&\\1Us",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=a(?i)b)(\\w\\w)c","cGWOK&O&A\\1Xq&&aF\\1G",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=a(?i)b)(\\w\\w)c","cGWOK&O&A\\1Xq&&aF\\1G",[global])), +?line <<"Abxxc">> = iolist_to_binary(re:replace("Abxxc","(?<=a(?i)b)(\\w\\w)c","uosfXS&Drr&Nsg",[])), +?line <<"Abxxc">> = iolist_to_binary(re:replace("Abxxc","(?<=a(?i)b)(\\w\\w)c","uosfXS&Drr&Nsg",[global])), +?line <<"ABxxc">> = iolist_to_binary(re:replace("ABxxc","(?<=a(?i)b)(\\w\\w)c","mKjv&im",[])), +?line <<"ABxxc">> = iolist_to_binary(re:replace("ABxxc","(?<=a(?i)b)(\\w\\w)c","mKjv&im",[global])), +?line <<"abxxC">> = iolist_to_binary(re:replace("abxxC","(?<=a(?i)b)(\\w\\w)c","ferUg\\1J\\1T\\1kWcDAY\\1jM",[])), +?line <<"abxxC">> = iolist_to_binary(re:replace("abxxC","(?<=a(?i)b)(\\w\\w)c","ferUg\\1J\\1T\\1kWcDAY\\1jM",[global])), +?line <<"a">> = iolist_to_binary(re:replace("aA","(?:(a)|b)(?(1)A|B)","\\1",[])), +?line <<"a">> = iolist_to_binary(re:replace("aA","(?:(a)|b)(?(1)A|B)","\\1",[global])), +?line <<"YdvbBbBsFnnbBKbB">> = iolist_to_binary(re:replace("bB","(?:(a)|b)(?(1)A|B)","Y\\1\\1dv&&\\1sFnn&K&",[])), +?line <<"YdvbBbBsFnnbBKbB">> = iolist_to_binary(re:replace("bB","(?:(a)|b)(?(1)A|B)","Y\\1\\1dv&&\\1sFnn&K&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?:(a)|b)(?(1)A|B)","\\1\\1",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?:(a)|b)(?(1)A|B)","\\1\\1",[global])), +?line <<"aB">> = iolist_to_binary(re:replace("aB","(?:(a)|b)(?(1)A|B)","\\1To",[])), +?line <<"aB">> = iolist_to_binary(re:replace("aB","(?:(a)|b)(?(1)A|B)","\\1To",[global])), +?line <<"bA">> = iolist_to_binary(re:replace("bA","(?:(a)|b)(?(1)A|B)","K\\1UMD",[])), +?line <<"bA">> = iolist_to_binary(re:replace("bA","(?:(a)|b)(?(1)A|B)","K\\1UMD",[global])), +?line <<"mLbykSwT">> = iolist_to_binary(re:replace("aa","^(a)?(?(1)a|b)+$","mLbykSwT",[])), +?line <<"mLbykSwT">> = iolist_to_binary(re:replace("aa","^(a)?(?(1)a|b)+$","mLbykSwT",[global])), +?line <<"br">> = iolist_to_binary(re:replace("b","^(a)?(?(1)a|b)+$","&r",[])), +?line <<"br">> = iolist_to_binary(re:replace("b","^(a)?(?(1)a|b)+$","&r",[global])), +?line <<"yaAboE">> = iolist_to_binary(re:replace("bb","^(a)?(?(1)a|b)+$","yaAb\\1o\\1E",[])), +?line <<"yaAboE">> = iolist_to_binary(re:replace("bb","^(a)?(?(1)a|b)+$","yaAb\\1o\\1E",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a)?(?(1)a|b)+$","QkLpQarHEu\\1Fi",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a)?(?(1)a|b)+$","QkLpQarHEu\\1Fi",[global])), +?line <<"ab">> = iolist_to_binary(re:replace("ab","^(a)?(?(1)a|b)+$","U",[])), +?line <<"ab">> = iolist_to_binary(re:replace("ab","^(a)?(?(1)a|b)+$","U",[global])), +?line <<"MoTyD">> = iolist_to_binary(re:replace("abc:","^(?(?=abc)\\w{3}:|\\d\\d)$","M\\1oTyD",[])), +?line <<"MoTyD">> = iolist_to_binary(re:replace("abc:","^(?(?=abc)\\w{3}:|\\d\\d)$","M\\1oTyD",[global])), +?line <<"kawc12B">> = iolist_to_binary(re:replace("12","^(?(?=abc)\\w{3}:|\\d\\d)$","k\\1awc&B\\1",[])), +?line <<"kawc12B">> = iolist_to_binary(re:replace("12","^(?(?=abc)\\w{3}:|\\d\\d)$","k\\1awc&B\\1",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?(?=abc)\\w{3}:|\\d\\d)$","TAqA",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?(?=abc)\\w{3}:|\\d\\d)$","TAqA",[global])), +?line <<"123">> = iolist_to_binary(re:replace("123","^(?(?=abc)\\w{3}:|\\d\\d)$","WlKxg",[])), +?line <<"123">> = iolist_to_binary(re:replace("123","^(?(?=abc)\\w{3}:|\\d\\d)$","WlKxg",[global])), +?line <<"xyz">> = iolist_to_binary(re:replace("xyz","^(?(?=abc)\\w{3}:|\\d\\d)$","O",[])), +?line <<"xyz">> = iolist_to_binary(re:replace("xyz","^(?(?=abc)\\w{3}:|\\d\\d)$","O",[global])), +?line <<"kNqQd">> = iolist_to_binary(re:replace("abc:","^(?(?!abc)\\d\\d|\\w{3}:)$","kNq\\1Q\\1d",[])), +?line <<"kNqQd">> = iolist_to_binary(re:replace("abc:","^(?(?!abc)\\d\\d|\\w{3}:)$","kNq\\1Q\\1d",[global])), +?line <<"Cr">> = iolist_to_binary(re:replace("12","^(?(?!abc)\\d\\d|\\w{3}:)$","\\1C\\1r",[])), +?line <<"Cr">> = iolist_to_binary(re:replace("12","^(?(?!abc)\\d\\d|\\w{3}:)$","\\1C\\1r",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?(?!abc)\\d\\d|\\w{3}:)$","&\\1\\1RHBBR",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?(?!abc)\\d\\d|\\w{3}:)$","&\\1\\1RHBBR",[global])), +?line <<"123">> = iolist_to_binary(re:replace("123","^(?(?!abc)\\d\\d|\\w{3}:)$","P",[])), +?line <<"123">> = iolist_to_binary(re:replace("123","^(?(?!abc)\\d\\d|\\w{3}:)$","P",[global])), +?line <<"xyz">> = iolist_to_binary(re:replace("xyz","^(?(?!abc)\\d\\d|\\w{3}:)$","&awfl",[])), +?line <<"xyz">> = iolist_to_binary(re:replace("xyz","^(?(?!abc)\\d\\d|\\w{3}:)$","&awfl",[global])), +?line <<"fooHSXSjJapIqY">> = iolist_to_binary(re:replace("foobar","(?(?<=foo)bar|cat)","HSXSjJ\\1apIqY",[])), +?line <<"fooHSXSjJapIqY">> = iolist_to_binary(re:replace("foobar","(?(?<=foo)bar|cat)","HSXSjJ\\1apIqY",[global])), +?line <<"IouuQfOcatNN">> = iolist_to_binary(re:replace("cat","(?(?<=foo)bar|cat)","Iouu\\1QfO&NN\\1",[])), +?line <<"IouuQfOcatNN">> = iolist_to_binary(re:replace("cat","(?(?<=foo)bar|cat)","Iouu\\1QfO&NN\\1",[global])), +?line <<"fcatxAWTu">> = iolist_to_binary(re:replace("fcat","(?(?<=foo)bar|cat)","&\\1xAWTu",[])), +?line <<"fcatxAWTu">> = iolist_to_binary(re:replace("fcat","(?(?<=foo)bar|cat)","&\\1xAWTu",[global])), +?line <<"fodYcNREMccatAcatyvscatidk">> = iolist_to_binary(re:replace("focat","(?(?<=foo)bar|cat)","dYc\\1N\\1REMc&A&yvs&idk",[])), +?line <<"fodYcNREMccatAcatyvscatidk">> = iolist_to_binary(re:replace("focat","(?(?<=foo)bar|cat)","dYc\\1N\\1REMc&A&yvs&idk",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?(?<=foo)bar|cat)","FmDOEt&",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?(?<=foo)bar|cat)","FmDOEt&",[global])), +?line <<"foocat">> = iolist_to_binary(re:replace("foocat","(?(?<=foo)bar|cat)","Jj&OFdGEDut\\1HjNDH",[])), +?line <<"foocat">> = iolist_to_binary(re:replace("foocat","(?(?<=foo)bar|cat)","Jj&OFdGEDut\\1HjNDH",[global])), +?line <<"fooEGbarEwDYbarCNxYJbarbD">> = iolist_to_binary(re:replace("foobar","(?(?> = iolist_to_binary(re:replace("foobar","(?(?> = iolist_to_binary(re:replace("cat","(?(?> = iolist_to_binary(re:replace("cat","(?(?> = iolist_to_binary(re:replace("fcat","(?(?> = iolist_to_binary(re:replace("fcat","(?(?> = iolist_to_binary(re:replace("focat","(?(?> = iolist_to_binary(re:replace("focat","(?(?> = iolist_to_binary(re:replace("*** Failers","(?(?> = iolist_to_binary(re:replace("*** Failers","(?(?> = iolist_to_binary(re:replace("foocat","(?(?> = iolist_to_binary(re:replace("foocat","(?(?> = iolist_to_binary(re:replace("abcd","( \\( )? [^()]+ (?(1) \\) |) ","T\\1\\1QK\\1e\\1RLoqn",[extended])), +?line <<"TQKeRLoqn">> = iolist_to_binary(re:replace("abcd","( \\( )? [^()]+ (?(1) \\) |) ","T\\1\\1QK\\1e\\1RLoqn",[extended, + global])), +?line <<"Qd(ovEgf(pkOYCuPDq(R">> = iolist_to_binary(re:replace("(abcd)","( \\( )? [^()]+ (?(1) \\) |) ","Qd\\1ovEgf\\1pkOYCuPDq\\1R",[extended])), +?line <<"Qd(ovEgf(pkOYCuPDq(R">> = iolist_to_binary(re:replace("(abcd)","( \\( )? [^()]+ (?(1) \\) |) ","Qd\\1ovEgf\\1pkOYCuPDq\\1R",[extended, + global])), +?line <<"Dmthe quick QWSbgBeLthe quick E(abcd) fox">> = iolist_to_binary(re:replace("the quick (abcd) fox","( \\( )? [^()]+ (?(1) \\) |) ","Dm\\1&QWSbgBeL&E",[extended])), +?line <<"Dmthe quick QWSbgBeLthe quick EDm((abcd)QWSbgBeL(abcd)EDm foxQWSbgBeL foxE">> = iolist_to_binary(re:replace("the quick (abcd) fox","( \\( )? [^()]+ (?(1) \\) |) ","Dm\\1&QWSbgBeL&E",[extended, + global])), +?line <<"(Ld">> = iolist_to_binary(re:replace("(abcd","( \\( )? [^()]+ (?(1) \\) |) ","Ld",[extended])), +?line <<"(Ld">> = iolist_to_binary(re:replace("(abcd","( \\( )? [^()]+ (?(1) \\) |) ","Ld",[extended, + global])), +?line <<"abcdiCLfuabcdkd">> = iolist_to_binary(re:replace("abcd","( \\( )? [^()]+ (?(1) \\) ) ","&iCLfu&kd",[extended])), +?line <<"abcdiCLfuabcdkd">> = iolist_to_binary(re:replace("abcd","( \\( )? [^()]+ (?(1) \\) ) ","&iCLfu&kd",[extended, + global])), +?line <<"uXgnII((abcd)SMj">> = iolist_to_binary(re:replace("(abcd)","( \\( )? [^()]+ (?(1) \\) ) ","uXgnII\\1&SMj",[extended])), +?line <<"uXgnII((abcd)SMj">> = iolist_to_binary(re:replace("(abcd)","( \\( )? [^()]+ (?(1) \\) ) ","uXgnII\\1&SMj",[extended, + global])), +?line <<"the quick the quick the quick xjaBhsFamkEL(abcd) fox">> = iolist_to_binary(re:replace("the quick (abcd) fox","( \\( )? [^()]+ (?(1) \\) ) ","&&&xjaBhsFa\\1mkEL\\1",[extended])), +?line <<"the quick the quick the quick xjaBhsFamkEL(abcd)(abcd)(abcd)xjaBhsFa(mkEL( fox fox foxxjaBhsFamkEL">> = iolist_to_binary(re:replace("the quick (abcd) fox","( \\( )? [^()]+ (?(1) \\) ) ","&&&xjaBhsFa\\1mkEL\\1",[extended, + global])), +?line <<"(KuH">> = iolist_to_binary(re:replace("(abcd","( \\( )? [^()]+ (?(1) \\) ) ","K\\1uH",[extended])), +?line <<"(KuH">> = iolist_to_binary(re:replace("(abcd","( \\( )? [^()]+ (?(1) \\) ) ","K\\1uH",[extended, + global])), +?line <<"IMNCUvkRpMGDtA">> = iolist_to_binary(re:replace("12","^(?(2)a|(1)(2))+$","IMNCUvkRpMGDtA",[])), +?line <<"IMNCUvkRpMGDtA">> = iolist_to_binary(re:replace("12","^(?(2)a|(1)(2))+$","IMNCUvkRpMGDtA",[global])), +?line <<"YQQcCpqUaDwGin12a1he">> = iolist_to_binary(re:replace("12a","^(?(2)a|(1)(2))+$","YQQcCpqUaDwGin&\\1he",[])), +?line <<"YQQcCpqUaDwGin12a1he">> = iolist_to_binary(re:replace("12a","^(?(2)a|(1)(2))+$","YQQcCpqUaDwGin&\\1he",[global])), +?line <<"LiJWEQyka">> = iolist_to_binary(re:replace("12aa","^(?(2)a|(1)(2))+$","LiJWEQyka",[])), +?line <<"LiJWEQyka">> = iolist_to_binary(re:replace("12aa","^(?(2)a|(1)(2))+$","LiJWEQyka",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?(2)a|(1)(2))+$","jNpGudmNvPautj\\1\\1rc",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?(2)a|(1)(2))+$","jNpGudmNvPautj\\1\\1rc",[global])), +?line <<"1234">> = iolist_to_binary(re:replace("1234","^(?(2)a|(1)(2))+$","TKb&DSqQCtNBSjto\\1",[])), +?line <<"1234">> = iolist_to_binary(re:replace("1234","^(?(2)a|(1)(2))+$","TKb&DSqQCtNBSjto\\1",[global])), +?line <<"OKbblah blahmEblah blahcAEblah">> = iolist_to_binary(re:replace("blah blah","((?i)blah)\\s+\\1","OKb&mE&cAE\\1",[])), +?line <<"OKbblah blahmEblah blahcAEblah">> = iolist_to_binary(re:replace("blah blah","((?i)blah)\\s+\\1","OKb&mE&cAE\\1",[global])), +?line <<"sHRABLAH BLAHDBLAH BLAHofBLAHMonBF">> = iolist_to_binary(re:replace("BLAH BLAH","((?i)blah)\\s+\\1","sHRA&D&of\\1MonBF",[])), +?line <<"sHRABLAH BLAHDBLAH BLAHofBLAHMonBF">> = iolist_to_binary(re:replace("BLAH BLAH","((?i)blah)\\s+\\1","sHRA&D&of\\1MonBF",[global])), +?line <<"rBlah BlahowtRMgXJKNBlah Blah">> = iolist_to_binary(re:replace("Blah Blah","((?i)blah)\\s+\\1","r&owtRMgXJKN&",[])), +?line <<"rBlah BlahowtRMgXJKNBlah Blah">> = iolist_to_binary(re:replace("Blah Blah","((?i)blah)\\s+\\1","r&owtRMgXJKN&",[global])), +?line <<"JblaHeNvblaHaSeblaHblaH blaHg">> = iolist_to_binary(re:replace("blaH blaH","((?i)blah)\\s+\\1","J\\1eNv\\1aSe\\1&g",[])), +?line <<"JblaHeNvblaHaSeblaHblaH blaHg">> = iolist_to_binary(re:replace("blaH blaH","((?i)blah)\\s+\\1","J\\1eNv\\1aSe\\1&g",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","((?i)blah)\\s+\\1","\\1LVUknDVfgj\\1ij\\1eDhAE",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","((?i)blah)\\s+\\1","\\1LVUknDVfgj\\1ij\\1eDhAE",[global])), +?line <<"blah BLAH">> = iolist_to_binary(re:replace("blah BLAH","((?i)blah)\\s+\\1","auAYHQ\\1S&PKut",[])), +?line <<"blah BLAH">> = iolist_to_binary(re:replace("blah BLAH","((?i)blah)\\s+\\1","auAYHQ\\1S&PKut",[global])), +?line <<"Blah blah">> = iolist_to_binary(re:replace("Blah blah","((?i)blah)\\s+\\1","\\1&N\\1tNui&w&CgfgFCbPk",[])), +?line <<"Blah blah">> = iolist_to_binary(re:replace("Blah blah","((?i)blah)\\s+\\1","\\1&N\\1tNui&w&CgfgFCbPk",[global])), +?line <<"blaH blah">> = iolist_to_binary(re:replace("blaH blah","((?i)blah)\\s+\\1","rLouaVXAOeWe",[])), +?line <<"blaH blah">> = iolist_to_binary(re:replace("blaH blah","((?i)blah)\\s+\\1","rLouaVXAOeWe",[global])), +?line <<"CXblahSqUjfblah blahblah blahblah">> = iolist_to_binary(re:replace("blah blah","((?i)blah)\\s+(?i:\\1)","CX\\1SqUjf&&\\1",[])), +?line <<"CXblahSqUjfblah blahblah blahblah">> = iolist_to_binary(re:replace("blah blah","((?i)blah)\\s+(?i:\\1)","CX\\1SqUjf&&\\1",[global])), +?line <<"XBLAHTkBLAHXUjMhbiRBLAH BLAHgXxxti">> = iolist_to_binary(re:replace("BLAH BLAH","((?i)blah)\\s+(?i:\\1)","X\\1Tk\\1XUjMhbiR&gXxxti",[])), +?line <<"XBLAHTkBLAHXUjMhbiRBLAH BLAHgXxxti">> = iolist_to_binary(re:replace("BLAH BLAH","((?i)blah)\\s+(?i:\\1)","X\\1Tk\\1XUjMhbiR&gXxxti",[global])), +?line <<"SBlahlpSqiBlah BlahLvYBlahJBlahxSbx">> = iolist_to_binary(re:replace("Blah Blah","((?i)blah)\\s+(?i:\\1)","S\\1lpSqi&LvY\\1J\\1xSbx",[])), +?line <<"SBlahlpSqiBlah BlahLvYBlahJBlahxSbx">> = iolist_to_binary(re:replace("Blah Blah","((?i)blah)\\s+(?i:\\1)","S\\1lpSqi&LvY\\1J\\1xSbx",[global])), +?line <<"oIFblaHCV">> = iolist_to_binary(re:replace("blaH blaH","((?i)blah)\\s+(?i:\\1)","oIF\\1CV",[])), +?line <<"oIFblaHCV">> = iolist_to_binary(re:replace("blaH blaH","((?i)blah)\\s+(?i:\\1)","oIF\\1CV",[global])), +?line <<"blahblah BLAHnOGRLblahgvVwkgjq">> = iolist_to_binary(re:replace("blah BLAH","((?i)blah)\\s+(?i:\\1)","\\1&nOGRL\\1gvVwkgjq",[])), +?line <<"blahblah BLAHnOGRLblahgvVwkgjq">> = iolist_to_binary(re:replace("blah BLAH","((?i)blah)\\s+(?i:\\1)","\\1&nOGRL\\1gvVwkgjq",[global])), +?line <<"PrLBlahTtgBlah blahpNNDBlah blahBlah blahBlah blah">> = iolist_to_binary(re:replace("Blah blah","((?i)blah)\\s+(?i:\\1)","PrL\\1Ttg&pNND&&&",[])), +?line <<"PrLBlahTtgBlah blahpNNDBlah blahBlah blahBlah blah">> = iolist_to_binary(re:replace("Blah blah","((?i)blah)\\s+(?i:\\1)","PrL\\1Ttg&pNND&&&",[global])), +?line <<"blaH blahGnDblaHFhNOIOmBhblaH blahfblaH blahKt">> = iolist_to_binary(re:replace("blaH blah","((?i)blah)\\s+(?i:\\1)","&GnD\\1FhNOIOmBh&f&Kt",[])), +?line <<"blaH blahGnDblaHFhNOIOmBhblaH blahfblaH blahKt">> = iolist_to_binary(re:replace("blaH blah","((?i)blah)\\s+(?i:\\1)","&GnD\\1FhNOIOmBh&f&Kt",[global])), +?line <<"aW">> = iolist_to_binary(re:replace("a","(?>a*)*","&W",[])), +?line <<"aWW">> = iolist_to_binary(re:replace("a","(?>a*)*","&W",[global])), +?line <<"Seaa">> = iolist_to_binary(re:replace("aa","(?>a*)*","Se&",[])), +?line <<"SeaaSe">> = iolist_to_binary(re:replace("aa","(?>a*)*","Se&",[global])), +?line <<"itILgCmaaaaioxBkDkO">> = iolist_to_binary(re:replace("aaaa","(?>a*)*","itIL\\1gCm&ioxBkDkO",[])), +?line <<"itILgCmaaaaioxBkDkOitILgCmioxBkDkO">> = iolist_to_binary(re:replace("aaaa","(?>a*)*","itIL\\1gCm&ioxBkDkO",[global])), +?line <<"aqm">> = iolist_to_binary(re:replace("abc","(abc|)+","\\1aqm",[])), +?line <<"aqmaqm">> = iolist_to_binary(re:replace("abc","(abc|)+","\\1aqm",[global])), +?line <<"tSWTMOLPTnvvJTwabcabcJwE">> = iolist_to_binary(re:replace("abcabc","(abc|)+","tSWTMOLPTnvvJTw\\1&JwE",[])), +?line <<"tSWTMOLPTnvvJTwabcabcJwEtSWTMOLPTnvvJTwJwE">> = iolist_to_binary(re:replace("abcabc","(abc|)+","tSWTMOLPTnvvJTw\\1&JwE",[global])), +?line <<"eMhIJbMyp">> = iolist_to_binary(re:replace("abcabcabc","(abc|)+","\\1eMh\\1\\1IJb\\1Myp",[])), +?line <<"eMhIJbMypeMhIJbMyp">> = iolist_to_binary(re:replace("abcabcabc","(abc|)+","\\1eMh\\1\\1IJb\\1Myp",[global])), +?line <<"dBxyz">> = iolist_to_binary(re:replace("xyz","(abc|)+","dB",[])), +?line <<"dBxdBydBzdB">> = iolist_to_binary(re:replace("xyz","(abc|)+","dB",[global])), +?line <<"wCrHnihkSygW">> = iolist_to_binary(re:replace("a","([a]*)*","wCrHnihkSygW",[])), +?line <<"wCrHnihkSygWwCrHnihkSygW">> = iolist_to_binary(re:replace("a","([a]*)*","wCrHnihkSygW",[global])), +?line <<"GjjjYNVefTgBaaaaafMw">> = iolist_to_binary(re:replace("aaaaa","([a]*)*","\\1Gjj\\1jYNVefTgB&fMw",[])), +?line <<"GjjjYNVefTgBaaaaafMwGjjjYNVefTgBfMw">> = iolist_to_binary(re:replace("aaaaa","([a]*)*","\\1Gjj\\1jYNVefTgB&fMw",[global])), +?line <<"pXFqCJUNaNU">> = iolist_to_binary(re:replace("a","([ab]*)*","pXFqCJUN&NU",[])), +?line <<"pXFqCJUNaNUpXFqCJUNNU">> = iolist_to_binary(re:replace("a","([ab]*)*","pXFqCJUN&NU",[global])), +?line <<"qbGbaTAUHHibHnl">> = iolist_to_binary(re:replace("b","([ab]*)*","q&\\1GbaTAUHHi&Hn\\1l",[])), +?line <<"qbGbaTAUHHibHnlqGbaTAUHHiHnl">> = iolist_to_binary(re:replace("b","([ab]*)*","q&\\1GbaTAUHHi&Hn\\1l",[global])), +?line <<"l">> = iolist_to_binary(re:replace("ababab","([ab]*)*","\\1l",[])), +?line <<"ll">> = iolist_to_binary(re:replace("ababab","([ab]*)*","\\1l",[global])), +?line <<"scde">> = iolist_to_binary(re:replace("aaaabcde","([ab]*)*","s\\1\\1",[])), +?line <<"sscsdses">> = iolist_to_binary(re:replace("aaaabcde","([ab]*)*","s\\1\\1",[global])), +?line <<"cLbwWRDkdHt">> = iolist_to_binary(re:replace("bbbb","([ab]*)*","cL\\1bwWRDkdHt",[])), +?line <<"cLbwWRDkdHtcLbwWRDkdHt">> = iolist_to_binary(re:replace("bbbb","([ab]*)*","cL\\1bwWRDkdHt",[global])), +?line <<"nmytevammko">> = iolist_to_binary(re:replace("b","([^a]*)*","nmytevammk\\1o",[])), +?line <<"nmytevammkonmytevammko">> = iolist_to_binary(re:replace("b","([^a]*)*","nmytevammk\\1o",[global])), +?line <<"bbbbqIbAMyI">> = iolist_to_binary(re:replace("bbbb","([^a]*)*","&qIbAMyI",[])), +?line <<"bbbbqIbAMyIqIbAMyI">> = iolist_to_binary(re:replace("bbbb","([^a]*)*","&qIbAMyI",[global])), +?line <<"ItRSFsauaaa">> = iolist_to_binary(re:replace("aaa","([^a]*)*","ItRS\\1Fs&a&&u",[])), +?line <<"ItRSFsauaItRSFsauaItRSFsauaItRSFsau">> = iolist_to_binary(re:replace("aaa","([^a]*)*","ItRS\\1Fs&a&&u",[global])), +?line <<"PKlYUFjsxy">> = iolist_to_binary(re:replace("cccc","([^ab]*)*","PKlYUFjsxy",[])), +?line <<"PKlYUFjsxyPKlYUFjsxy">> = iolist_to_binary(re:replace("cccc","([^ab]*)*","PKlYUFjsxy",[global])), +?line <<"eBumQabab">> = iolist_to_binary(re:replace("abab","([^ab]*)*","e\\1BumQ",[])), +?line <<"eBumQaeBumQbeBumQaeBumQbeBumQ">> = iolist_to_binary(re:replace("abab","([^ab]*)*","e\\1BumQ",[global])), +?line <<"VsNPa">> = iolist_to_binary(re:replace("a","([a]*?)*","&Vs\\1N&P",[])), +?line <<"VsNPaVsNaPVsNP">> = iolist_to_binary(re:replace("a","([a]*?)*","&Vs\\1N&P",[global])), +?line <<"oJTmjRIMESSEdaaaa">> = iolist_to_binary(re:replace("aaaa","([a]*?)*","o&JT\\1\\1\\1&m&jR&IMESSEd",[])), +?line <<"oJTmjRIMESSEdoaJTamajRaIMESSEdoJTmjRIMESSEdoaJTamajRaIMESSEdoJTmjRIMESSEdoaJTamajRaIMESSEdoJTmjRIMESSEdoaJTamajRaIMESSEdoJTmjRIMESSEd">> = iolist_to_binary(re:replace("aaaa","([a]*?)*","o&JT\\1\\1\\1&m&jR&IMESSEd",[global])), +?line <<"uSOa">> = iolist_to_binary(re:replace("a","([ab]*?)*","&\\1&u&SO",[])), +?line <<"uSOaauaSOuSO">> = iolist_to_binary(re:replace("a","([ab]*?)*","&\\1&u&SO",[global])), +?line <<"BfDNwUAfjUb">> = iolist_to_binary(re:replace("b","([ab]*?)*","B&fDNwU\\1Af&j\\1U\\1",[])), +?line <<"BfDNwUAfjUBbfDNwUAfbjUBfDNwUAfjU">> = iolist_to_binary(re:replace("b","([ab]*?)*","B&fDNwU\\1Af&j\\1U\\1",[global])), +?line <<"kTOkbSeRnabab">> = iolist_to_binary(re:replace("abab","([ab]*?)*","k&TOkb\\1\\1S&eR&n&",[])), +?line <<"kTOkbSeRnkaTOkbSaeRanakTOkbSeRnkbTOkbSbeRbnbkTOkbSeRnkaTOkbSaeRanakTOkbSeRnkbTOkbSbeRbnbkTOkbSeRn">> = iolist_to_binary(re:replace("abab","([ab]*?)*","k&TOkb\\1\\1S&eR&n&",[global])), +?line <<"Sbaba">> = iolist_to_binary(re:replace("baba","([ab]*?)*","S",[])), +?line <<"SSSSSSSSS">> = iolist_to_binary(re:replace("baba","([ab]*?)*","S",[global])), +?line <<"Aotb">> = iolist_to_binary(re:replace("b","([^a]*?)*","A\\1ot",[])), +?line <<"AotAotAot">> = iolist_to_binary(re:replace("b","([^a]*?)*","A\\1ot",[global])), +?line <<"CbPnbbbb">> = iolist_to_binary(re:replace("bbbb","([^a]*?)*","CbPn&&",[])), +?line <<"CbPnCbPnbbCbPnCbPnbbCbPnCbPnbbCbPnCbPnbbCbPn">> = iolist_to_binary(re:replace("bbbb","([^a]*?)*","CbPn&&",[global])), +?line <<"DUteaaa">> = iolist_to_binary(re:replace("aaa","([^a]*?)*","D\\1\\1Ute",[])), +?line <<"DUteaDUteaDUteaDUte">> = iolist_to_binary(re:replace("aaa","([^a]*?)*","D\\1\\1Ute",[global])), +?line <<"ATgsBhAkPic">> = iolist_to_binary(re:replace("c","([^ab]*?)*","ATg\\1sB\\1hAkP&i",[])), +?line <<"ATgsBhAkPiATgsBhAkPciATgsBhAkPi">> = iolist_to_binary(re:replace("c","([^ab]*?)*","ATg\\1sB\\1hAkP&i",[global])), +?line <<"lwFoWkRIxUcccc">> = iolist_to_binary(re:replace("cccc","([^ab]*?)*","l&wFoWk\\1RIxU",[])), +?line <<"lwFoWkRIxUlcwFoWkRIxUlwFoWkRIxUlcwFoWkRIxUlwFoWkRIxUlcwFoWkRIxUlwFoWkRIxUlcwFoWkRIxUlwFoWkRIxU">> = iolist_to_binary(re:replace("cccc","([^ab]*?)*","l&wFoWk\\1RIxU",[global])), +?line <<"QXSXCbaba">> = iolist_to_binary(re:replace("baba","([^ab]*?)*","&QXSXC",[])), +?line <<"QXSXCbQXSXCaQXSXCbQXSXCaQXSXC">> = iolist_to_binary(re:replace("baba","([^ab]*?)*","&QXSXC",[global])), +?line <<"epgEBpyDja">> = iolist_to_binary(re:replace("a","(?>a*)*","e\\1\\1pgEB\\1\\1pyD\\1j&",[])), +?line <<"epgEBpyDjaepgEBpyDj">> = iolist_to_binary(re:replace("a","(?>a*)*","e\\1\\1pgEB\\1\\1pyD\\1j&",[global])), +?line <<"SekThCelBbcde">> = iolist_to_binary(re:replace("aaabcde","(?>a*)*","SekT\\1hC\\1\\1elB",[])), +?line <<"SekThCelBSekThCelBbSekThCelBcSekThCelBdSekThCelBeSekThCelB">> = iolist_to_binary(re:replace("aaabcde","(?>a*)*","SekT\\1hC\\1\\1elB",[global])), +?line <<"goPCaaaaawO">> = iolist_to_binary(re:replace("aaaaa","((?>a*))*","go\\1PC\\1&\\1wO",[])), +?line <<"goPCaaaaawOgoPCwO">> = iolist_to_binary(re:replace("aaaaa","((?>a*))*","go\\1PC\\1&\\1wO",[global])), +?line <<"SCaadJliaaKfxRbbbaa">> = iolist_to_binary(re:replace("aabbaa","((?>a*))*","\\1S\\1C&\\1dJ\\1\\1li&KfxR\\1b",[])), +?line <<"SCaadJliaaKfxRbSCdJliKfxRbbSCdJliKfxRbbSCaadJliaaKfxRbSCdJliKfxRb">> = iolist_to_binary(re:replace("aabbaa","((?>a*))*","\\1S\\1C&\\1dJ\\1\\1li&KfxR\\1b",[global])), +?line <<"ssMfBjQEIebjdsmPRaaaaa">> = iolist_to_binary(re:replace("aaaaa","((?>a*?))*","s&s&MfBjQEIebjdsmPR",[])), +?line <<"ssMfBjQEIebjdsmPRassMfBjQEIebjdsmPRassMfBjQEIebjdsmPRassMfBjQEIebjdsmPRassMfBjQEIebjdsmPRassMfBjQEIebjdsmPR">> = iolist_to_binary(re:replace("aaaaa","((?>a*?))*","s&s&MfBjQEIebjdsmPR",[global])), +?line <<"VQJGaabbaa">> = iolist_to_binary(re:replace("aabbaa","((?>a*?))*","VQ\\1&J\\1G",[])), +?line <<"VQJGaVQJGaVQJGbVQJGbVQJGaVQJGaVQJG">> = iolist_to_binary(re:replace("aabbaa","((?>a*?))*","VQ\\1&J\\1G",[global])), +?line <<"t">> = iolist_to_binary(re:replace("12-sep-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ","t",[extended])), +?line <<"t">> = iolist_to_binary(re:replace("12-sep-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ","t",[extended, + global])), +?line <<"EIgEQmDKuIoMFts">> = iolist_to_binary(re:replace("12-09-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ","EIgEQmDKuIoMFts",[extended])), +?line <<"EIgEQmDKuIoMFts">> = iolist_to_binary(re:replace("12-09-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ","EIgEQmDKuIoMFts",[extended, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ","M\\1K\\1N",[extended])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ","M\\1K\\1N",[extended, + global])), +?line <<"sep-12-98">> = iolist_to_binary(re:replace("sep-12-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ","Xby\\1g&vVVPgw\\1",[extended])), +?line <<"sep-12-98">> = iolist_to_binary(re:replace("sep-12-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ","Xby\\1g&vVVPgw\\1",[extended, + global])), +?line <<"foonfoobJpbIfooAbKhpTIXfoofooEN">> = iolist_to_binary(re:replace("foobarfoo","(?<=(foo))bar\\1","n\\1bJpbI\\1AbKhpTIX\\1\\1EN",[])), +?line <<"foonfoobJpbIfooAbKhpTIXfoofooEN">> = iolist_to_binary(re:replace("foobarfoo","(?<=(foo))bar\\1","n\\1bJpbI\\1AbKhpTIX\\1\\1EN",[global])), +?line <<"foobarfoofooUWdHfoofoocfifXWQdmKgtling">> = iolist_to_binary(re:replace("foobarfootling","(?<=(foo))bar\\1","&\\1UWdH\\1\\1cfifXWQdmKg",[])), +?line <<"foobarfoofooUWdHfoofoocfifXWQdmKgtling">> = iolist_to_binary(re:replace("foobarfootling","(?<=(foo))bar\\1","&\\1UWdH\\1\\1cfifXWQdmKg",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=(foo))bar\\1","\\1A\\1Do\\1roQX",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=(foo))bar\\1","\\1A\\1Do\\1roQX",[global])), +?line <<"foobar">> = iolist_to_binary(re:replace("foobar","(?<=(foo))bar\\1","WqywQ",[])), +?line <<"foobar">> = iolist_to_binary(re:replace("foobar","(?<=(foo))bar\\1","WqywQ",[global])), +?line <<"barfoo">> = iolist_to_binary(re:replace("barfoo","(?<=(foo))bar\\1","g&dx",[])), +?line <<"barfoo">> = iolist_to_binary(re:replace("barfoo","(?<=(foo))bar\\1","g&dx",[global])), +?line <<"EqLnXCi">> = iolist_to_binary(re:replace("saturday","(?i:saturday|sunday)","EqLnX\\1Ci\\1",[])), +?line <<"EqLnXCi">> = iolist_to_binary(re:replace("saturday","(?i:saturday|sunday)","EqLnX\\1Ci\\1",[global])), +?line <<"rXiCVoMssundayWVsundayg">> = iolist_to_binary(re:replace("sunday","(?i:saturday|sunday)","rXiCVoMs&WV&\\1g",[])), +?line <<"rXiCVoMssundayWVsundayg">> = iolist_to_binary(re:replace("sunday","(?i:saturday|sunday)","rXiCVoMs&WV&\\1g",[global])), +?line <<"DCML">> = iolist_to_binary(re:replace("Saturday","(?i:saturday|sunday)","D\\1CML",[])), +?line <<"DCML">> = iolist_to_binary(re:replace("Saturday","(?i:saturday|sunday)","D\\1CML",[global])), +?line <<"caYSundaylQsqBJmDFf">> = iolist_to_binary(re:replace("Sunday","(?i:saturday|sunday)","caY&l\\1Q\\1\\1sq\\1BJmD\\1Ff",[])), +?line <<"caYSundaylQsqBJmDFf">> = iolist_to_binary(re:replace("Sunday","(?i:saturday|sunday)","caY&l\\1Q\\1\\1sq\\1BJmD\\1Ff",[global])), +?line <<"LSATURDAYSATURDAYb">> = iolist_to_binary(re:replace("SATURDAY","(?i:saturday|sunday)","L&&b",[])), +?line <<"LSATURDAYSATURDAYb">> = iolist_to_binary(re:replace("SATURDAY","(?i:saturday|sunday)","L&&b",[global])), +?line <<"J">> = iolist_to_binary(re:replace("SUNDAY","(?i:saturday|sunday)","J",[])), +?line <<"J">> = iolist_to_binary(re:replace("SUNDAY","(?i:saturday|sunday)","J",[global])), +?line <<"cCHUgeqmaSunDaySunDayQSunDayHUJ">> = iolist_to_binary(re:replace("SunDay","(?i:saturday|sunday)","c\\1CHUgeqma&&Q&HUJ",[])), +?line <<"cCHUgeqmaSunDaySunDayQSunDayHUJ">> = iolist_to_binary(re:replace("SunDay","(?i:saturday|sunday)","c\\1CHUgeqma&&Q&HUJ",[global])), +?line <<"abcEbXpYQWabcxNabcxabcxVrPLd">> = iolist_to_binary(re:replace("abcx","(a(?i)bc|BB)x","\\1EbXpYQW&N&&VrPLd",[])), +?line <<"abcEbXpYQWabcxNabcxabcxVrPLd">> = iolist_to_binary(re:replace("abcx","(a(?i)bc|BB)x","\\1EbXpYQW&N&&VrPLd",[global])), +?line <<"jBMIviaBCvaBCxTRLe">> = iolist_to_binary(re:replace("aBCx","(a(?i)bc|BB)x","jBMIvi\\1v&TRLe",[])), +?line <<"jBMIviaBCvaBCxTRLe">> = iolist_to_binary(re:replace("aBCx","(a(?i)bc|BB)x","jBMIvi\\1v&TRLe",[global])), +?line <<"wDnyUbbxDgOUSgpsDtqV">> = iolist_to_binary(re:replace("bbx","(a(?i)bc|BB)x","wDnyU&DgOUSgpsDtqV",[])), +?line <<"wDnyUbbxDgOUSgpsDtqV">> = iolist_to_binary(re:replace("bbx","(a(?i)bc|BB)x","wDnyU&DgOUSgpsDtqV",[global])), +?line <<"Vx">> = iolist_to_binary(re:replace("BBx","(a(?i)bc|BB)x","Vx",[])), +?line <<"Vx">> = iolist_to_binary(re:replace("BBx","(a(?i)bc|BB)x","Vx",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(a(?i)bc|BB)x","vuaWcgIs\\1SRUcqMEb",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(a(?i)bc|BB)x","vuaWcgIs\\1SRUcqMEb",[global])), +?line <<"abcX">> = iolist_to_binary(re:replace("abcX","(a(?i)bc|BB)x","V\\1",[])), +?line <<"abcX">> = iolist_to_binary(re:replace("abcX","(a(?i)bc|BB)x","V\\1",[global])), +?line <<"aBCX">> = iolist_to_binary(re:replace("aBCX","(a(?i)bc|BB)x","kcaH&mISces&gy\\1Mv",[])), +?line <<"aBCX">> = iolist_to_binary(re:replace("aBCX","(a(?i)bc|BB)x","kcaH&mISces&gy\\1Mv",[global])), +?line <<"bbX">> = iolist_to_binary(re:replace("bbX","(a(?i)bc|BB)x","hfQHW",[])), +?line <<"bbX">> = iolist_to_binary(re:replace("bbX","(a(?i)bc|BB)x","hfQHW",[global])), +?line <<"BBX">> = iolist_to_binary(re:replace("BBX","(a(?i)bc|BB)x","QWSdgANNG&a&hUuhv&T",[])), +?line <<"BBX">> = iolist_to_binary(re:replace("BBX","(a(?i)bc|BB)x","QWSdgANNG&a&hUuhv&T",[global])), +?line <<"tEacrW">> = iolist_to_binary(re:replace("ac","^([ab](?i)[cd]|[ef])","tE\\1rW",[])), +?line <<"tEacrW">> = iolist_to_binary(re:replace("ac","^([ab](?i)[cd]|[ef])","tE\\1rW",[global])), +?line <<"jjqwaCaCyaCpaCPWnSv">> = iolist_to_binary(re:replace("aC","^([ab](?i)[cd]|[ef])","jjqw\\1\\1y\\1p&PWnSv",[])), +?line <<"jjqwaCaCyaCpaCPWnSv">> = iolist_to_binary(re:replace("aC","^([ab](?i)[cd]|[ef])","jjqw\\1\\1y\\1p&PWnSv",[global])), +?line <<"pbDoK">> = iolist_to_binary(re:replace("bD","^([ab](?i)[cd]|[ef])","p&oK",[])), +?line <<"pbDoK">> = iolist_to_binary(re:replace("bD","^([ab](?i)[cd]|[ef])","p&oK",[global])), +?line <<"hOUSaMTfcPejGlephant">> = iolist_to_binary(re:replace("elephant","^([ab](?i)[cd]|[ef])","hOUSaMTfcP&jG",[])), +?line <<"hOUSaMTfcPejGlephant">> = iolist_to_binary(re:replace("elephant","^([ab](?i)[cd]|[ef])","hOUSaMTfcP&jG",[global])), +?line <<"EOnTdEESsrQXxRPurope">> = iolist_to_binary(re:replace("Europe","^([ab](?i)[cd]|[ef])","\\1OnTd&&SsrQXxRP",[])), +?line <<"EOnTdEESsrQXxRPurope">> = iolist_to_binary(re:replace("Europe","^([ab](?i)[cd]|[ef])","\\1OnTd&&SsrQXxRP",[global])), +?line <<"fhfBHfIDHldAwNfEfqrog">> = iolist_to_binary(re:replace("frog","^([ab](?i)[cd]|[ef])","\\1h&BH\\1IDHldAwN&E\\1q",[])), +?line <<"fhfBHfIDHldAwNfEfqrog">> = iolist_to_binary(re:replace("frog","^([ab](?i)[cd]|[ef])","\\1h&BH\\1IDHldAwN&E\\1q",[global])), +?line <<"FFFxSuhnFwrance">> = iolist_to_binary(re:replace("France","^([ab](?i)[cd]|[ef])","\\1&FxSuhn&w",[])), +?line <<"FFFxSuhnFwrance">> = iolist_to_binary(re:replace("France","^([ab](?i)[cd]|[ef])","\\1&FxSuhn&w",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^([ab](?i)[cd]|[ef])","&ff\\1J\\1I",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^([ab](?i)[cd]|[ef])","&ff\\1J\\1I",[global])), +?line <<"Africa">> = iolist_to_binary(re:replace("Africa","^([ab](?i)[cd]|[ef])","nEbgaPXOn\\1",[])), +?line <<"Africa">> = iolist_to_binary(re:replace("Africa","^([ab](?i)[cd]|[ef])","nEbgaPXOn\\1",[global])), +?line <<"abcabDXAiaSg">> = iolist_to_binary(re:replace("ab","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","&c&DXAiaSg",[])), +?line <<"abcabDXAiaSg">> = iolist_to_binary(re:replace("ab","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","&c&DXAiaSg",[global])), +?line <<"aBdqaBdmLoaaBdEb">> = iolist_to_binary(re:replace("aBd","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","&q&mLoa&Eb",[])), +?line <<"aBdqaBdmLoaaBdEb">> = iolist_to_binary(re:replace("aBd","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","&q&mLoa&Eb",[global])), +?line <<"xxyvFo">> = iolist_to_binary(re:replace("xy","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","x&vFo",[])), +?line <<"xxyvFo">> = iolist_to_binary(re:replace("xy","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","x&vFo",[global])), +?line <<"eWy">> = iolist_to_binary(re:replace("xY","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","eWy",[])), +?line <<"eWy">> = iolist_to_binary(re:replace("xY","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","eWy",[global])), +?line <<"bzVONndeqzaVKebra">> = iolist_to_binary(re:replace("zebra","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","b&VONndeq\\1aVK",[])), +?line <<"bzVONndeqzaVKebra">> = iolist_to_binary(re:replace("zebra","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","b&VONndeq\\1aVK",[global])), +?line <<"ZNZZjZVZJeZnZZCXZambesi">> = iolist_to_binary(re:replace("Zambesi","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","&N&&j&V&Je\\1n&\\1CX&",[])), +?line <<"ZNZZjZVZJeZnZZCXZambesi">> = iolist_to_binary(re:replace("Zambesi","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","&N&&j&V&Je\\1n&\\1CX&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","vJ\\1\\1",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","vJ\\1\\1",[global])), +?line <<"aCD">> = iolist_to_binary(re:replace("aCD","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","\\1FKPhO&",[])), +?line <<"aCD">> = iolist_to_binary(re:replace("aCD","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","\\1FKPhO&",[global])), +?line <<"XY">> = iolist_to_binary(re:replace("XY","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","SEE",[])), +?line <<"XY">> = iolist_to_binary(re:replace("XY","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)","SEE",[global])), +?line <<"foo +rwHxBqDqeLQ">> = iolist_to_binary(re:replace("foo +bar","(?<=foo\\n)^bar","rwHxBqDq\\1eLQ",[multiline])), +?line <<"foo +rwHxBqDqeLQ">> = iolist_to_binary(re:replace("foo +bar","(?<=foo\\n)^bar","rwHxBqDq\\1eLQ",[multiline,global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=foo\\n)^bar","\\1P&&W&\\1oN",[multiline])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=foo\\n)^bar","\\1P&&W&\\1oN",[multiline, + global])), +?line <<"bar">> = iolist_to_binary(re:replace("bar","(?<=foo\\n)^bar","rk\\1SSPj&JPOE",[multiline])), +?line <<"bar">> = iolist_to_binary(re:replace("bar","(?<=foo\\n)^bar","rk\\1SSPj&JPOE",[multiline, + global])), +?line <<"baz +bar">> = iolist_to_binary(re:replace("baz +bar","(?<=foo\\n)^bar","&JIhqO&Da",[multiline])), +?line <<"baz +bar">> = iolist_to_binary(re:replace("baz +bar","(?<=foo\\n)^bar","&JIhqO&Da",[multiline,global])), +?line <<"baruQUCmWhYKFBWj">> = iolist_to_binary(re:replace("barbaz","(?<=(?> = iolist_to_binary(re:replace("barbaz","(?<=(?> = iolist_to_binary(re:replace("barbarbaz","(?<=(?> = iolist_to_binary(re:replace("barbarbaz","(?<=(?> = iolist_to_binary(re:replace("koobarbaz","(?<=(?> = iolist_to_binary(re:replace("koobarbaz","(?<=(?> = iolist_to_binary(re:replace("*** Failers","(?<=(?> = iolist_to_binary(re:replace("*** Failers","(?<=(?> = iolist_to_binary(re:replace("baz","(?<=(?> = iolist_to_binary(re:replace("baz","(?<=(?> = iolist_to_binary(re:replace("foobarbaz","(?<=(?> = iolist_to_binary(re:replace("foobarbaz","(?<=(?> = iolist_to_binary(re:replace("a","^(a\\1?){4}$","N\\1&Psi",[])), +?line <<"a">> = iolist_to_binary(re:replace("a","^(a\\1?){4}$","N\\1&Psi",[global])), +?line <<"aa">> = iolist_to_binary(re:replace("aa","^(a\\1?){4}$","&",[])), +?line <<"aa">> = iolist_to_binary(re:replace("aa","^(a\\1?){4}$","&",[global])), +?line <<"aaa">> = iolist_to_binary(re:replace("aaa","^(a\\1?){4}$","\\1OPhpdjl&J&F&j",[])), +?line <<"aaa">> = iolist_to_binary(re:replace("aaa","^(a\\1?){4}$","\\1OPhpdjl&J&F&j",[global])), +?line <<"oEaaPaaaaFyHMpKbNxCqlyG">> = iolist_to_binary(re:replace("aaaa","^(a\\1?){4}$","oE\\1\\1P&FyHMpKbNxCqlyG",[])), +?line <<"oEaaPaaaaFyHMpKbNxCqlyG">> = iolist_to_binary(re:replace("aaaa","^(a\\1?){4}$","oE\\1\\1P&FyHMpKbNxCqlyG",[global])), +?line <<"aaaaaawR">> = iolist_to_binary(re:replace("aaaaa","^(a\\1?){4}$","\\1&wR",[])), +?line <<"aaaaaawR">> = iolist_to_binary(re:replace("aaaaa","^(a\\1?){4}$","\\1&wR",[global])), +?line <<"SaWUrMlNUaaaaaaaaaaaaaan">> = iolist_to_binary(re:replace("aaaaaaa","^(a\\1?){4}$","S\\1WUrMlNU&&n",[])), +?line <<"SaWUrMlNUaaaaaaaaaaaaaan">> = iolist_to_binary(re:replace("aaaaaaa","^(a\\1?){4}$","S\\1WUrMlNU&&n",[global])), +?line <<"aaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaa","^(a\\1?){4}$","Vk&&RgxI\\1\\1pJ&&",[])), +?line <<"aaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaa","^(a\\1?){4}$","Vk&&RgxI\\1\\1pJ&&",[global])), +?line <<"aaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaa","^(a\\1?){4}$","x",[])), +?line <<"aaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaa","^(a\\1?){4}$","x",[global])), +?line <<"FEkJCFraaaaaaaaaaaaaaaaaaaaMlwosy">> = iolist_to_binary(re:replace("aaaaaaaaaa","^(a\\1?){4}$","FEkJCFr&&Mlwosy",[])), +?line <<"FEkJCFraaaaaaaaaaaaaaaaaaaaMlwosy">> = iolist_to_binary(re:replace("aaaaaaaaaa","^(a\\1?){4}$","FEkJCFr&&Mlwosy",[global])), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaa","^(a\\1?){4}$","&IO",[])), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaa","^(a\\1?){4}$","&IO",[global])), +?line <<"aaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaa","^(a\\1?){4}$","lKw",[])), +?line <<"aaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaa","^(a\\1?){4}$","lKw",[global])), +?line <<"aaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaa","^(a\\1?){4}$","nN&bSVJh\\1J\\1d&Ko",[])), +?line <<"aaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaa","^(a\\1?){4}$","nN&bSVJh\\1J\\1d&Ko",[global])), +?line <<"aaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaa","^(a\\1?){4}$","Fut\\1X\\1",[])), +?line <<"aaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaa","^(a\\1?){4}$","Fut\\1X\\1",[global])), +?line <<"aaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaa","^(a\\1?){4}$","v",[])), +?line <<"aaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaa","^(a\\1?){4}$","v",[global])), +?line <<"aaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaa","^(a\\1?){4}$","b",[])), +?line <<"aaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaa","^(a\\1?){4}$","b",[global])), +?line <<"a">> = iolist_to_binary(re:replace("a","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","VC",[])), +?line <<"a">> = iolist_to_binary(re:replace("a","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","VC",[global])), +?line <<"aa">> = iolist_to_binary(re:replace("aa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","&&mKsMkXfPP",[])), +?line <<"aa">> = iolist_to_binary(re:replace("aa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","&&mKsMkXfPP",[global])), +?line <<"aaa">> = iolist_to_binary(re:replace("aaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","c\\1HhkFrF&vy&\\1bmNHPw",[])), +?line <<"aaa">> = iolist_to_binary(re:replace("aaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","c\\1HhkFrF&vy&\\1bmNHPw",[global])), +?line <<"SnJcTQRFQiat">> = iolist_to_binary(re:replace("aaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","SnJcTQRFQi\\1t",[])), +?line <<"SnJcTQRFQiat">> = iolist_to_binary(re:replace("aaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","SnJcTQRFQi\\1t",[global])), +?line <<"MaaaaakiYfFeaaaaaetD">> = iolist_to_binary(re:replace("aaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","M&kiYfFe&etD",[])), +?line <<"MaaaaakiYfFeaaaaaetD">> = iolist_to_binary(re:replace("aaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","M&kiYfFe&etD",[global])), +?line <<"WDaaaaaasEn">> = iolist_to_binary(re:replace("aaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","WD&sEn",[])), +?line <<"WDaaaaaasEn">> = iolist_to_binary(re:replace("aaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","WD&sEn",[global])), +?line <<"sauvrqyMaaaaaaaEvrD">> = iolist_to_binary(re:replace("aaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","s\\1uvrqyM&EvrD",[])), +?line <<"sauvrqyMaaaaaaaEvrD">> = iolist_to_binary(re:replace("aaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","s\\1uvrqyM&EvrD",[global])), +?line <<"aaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","WyhxEMLFTAGuL&Hymc",[])), +?line <<"aaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","WyhxEMLFTAGuL&Hymc",[global])), +?line <<"aaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","\\1WXGI&T&rPigX\\1IAQu",[])), +?line <<"aaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","\\1WXGI&T&rPigX\\1IAQu",[global])), +?line <<"HaaaaaaaaaajHUn">> = iolist_to_binary(re:replace("aaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","H&jHUn",[])), +?line <<"HaaaaaaaaaajHUn">> = iolist_to_binary(re:replace("aaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","H&jHUn",[global])), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","e",[])), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","e",[global])), +?line <<"aaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","dSM\\1GGkyX&xNUIVG&",[])), +?line <<"aaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","dSM\\1GGkyX&xNUIVG&",[global])), +?line <<"aaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","p\\1T",[])), +?line <<"aaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","p\\1T",[global])), +?line <<"aaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","wOWcxD\\1e&",[])), +?line <<"aaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","wOWcxD\\1e&",[global])), +?line <<"aaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","C&CWw&kAen&",[])), +?line <<"aaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","C&CWw&kAen&",[global])), +?line <<"aaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","rkiiFEQ&WDahG&lSqR",[])), +?line <<"aaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$","rkiiFEQ&WDahG&lSqR",[global])), +?line <<"babcoabcabcESPlWKsDDog">> = iolist_to_binary(re:replace("abc","abc","b&o&&\\1ES\\1\\1PlWKsD\\1Dog",[])), +?line <<"babcoabcabcESPlWKsDDog">> = iolist_to_binary(re:replace("abc","abc","b&o&&\\1ES\\1\\1PlWKsD\\1Dog",[global])), +?line <<"xFfvcJy">> = iolist_to_binary(re:replace("xabcy","abc","FfvcJ",[])), +?line <<"xFfvcJy">> = iolist_to_binary(re:replace("xabcy","abc","FfvcJ",[global])), +?line <<"abaGvHrWEIIXoI">> = iolist_to_binary(re:replace("ababc","abc","a\\1\\1G\\1v\\1HrWEIIXoI\\1",[])), +?line <<"abaGvHrWEIIXoI">> = iolist_to_binary(re:replace("ababc","abc","a\\1\\1G\\1v\\1HrWEIIXoI\\1",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abc","DOtxCgk&UIBKmk\\1",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abc","DOtxCgk&UIBKmk\\1",[global])), +?line <<"xbc">> = iolist_to_binary(re:replace("xbc","abc","qmfvVTE\\1aHl\\1BT&U",[])), +?line <<"xbc">> = iolist_to_binary(re:replace("xbc","abc","qmfvVTE\\1aHl\\1BT&U",[global])), +?line <<"axc">> = iolist_to_binary(re:replace("axc","abc","uN&yFKoX\\1pBswe\\1HLf",[])), +?line <<"axc">> = iolist_to_binary(re:replace("axc","abc","uN&yFKoX\\1pBswe\\1HLf",[global])), +?line <<"abx">> = iolist_to_binary(re:replace("abx","abc","&v\\1\\1QwMhqY",[])), +?line <<"abx">> = iolist_to_binary(re:replace("abx","abc","&v\\1\\1QwMhqY",[global])), +?line <<"FIOGpcHeabcNHJ">> = iolist_to_binary(re:replace("abc","ab*c","FIOGpcHe&NHJ",[])), +?line <<"FIOGpcHeabcNHJ">> = iolist_to_binary(re:replace("abc","ab*c","FIOGpcHe&NHJ",[global])), +?line <<"abcbnCUabcnxKKHabcXVaO">> = iolist_to_binary(re:replace("abc","ab*bc","&bnCU&n\\1xKKH&\\1XVaO",[])), +?line <<"abcbnCUabcnxKKHabcXVaO">> = iolist_to_binary(re:replace("abc","ab*bc","&bnCU&n\\1xKKH&\\1XVaO",[global])), +?line <<"bFtejUbnDA">> = iolist_to_binary(re:replace("abbc","ab*bc","bFtejUbn\\1DA",[])), +?line <<"bFtejUbnDA">> = iolist_to_binary(re:replace("abbc","ab*bc","bFtejUbn\\1DA",[global])), +?line <<"W">> = iolist_to_binary(re:replace("abbbbc","ab*bc","W",[])), +?line <<"W">> = iolist_to_binary(re:replace("abbbbc","ab*bc","W",[global])), +?line <<"BlaEararHKSGaabbbbc">> = iolist_to_binary(re:replace("abbbbc",".{1}","Bl&E&r&r\\1HKSG&&\\1",[])), +?line <<"BlaEararHKSGaaBlbEbrbrHKSGbbBlbEbrbrHKSGbbBlbEbrbrHKSGbbBlbEbrbrHKSGbbBlcEcrcrHKSGcc">> = iolist_to_binary(re:replace("abbbbc",".{1}","Bl&E&r&r\\1HKSG&&\\1",[global])), +?line <<"pabbbcRXxcEabbbIabbbXTbc">> = iolist_to_binary(re:replace("abbbbc",".{3,4}","p&cRXxcE&I&XT",[])), +?line <<"pabbbcRXxcEabbbIabbbXTbc">> = iolist_to_binary(re:replace("abbbbc",".{3,4}","p&cRXxcE&I&XT",[global])), +?line <<"HkIFCqCBaabbbbcyHm">> = iolist_to_binary(re:replace("abbbbc","ab{0,}bc","Hk\\1IFCq\\1CBa&yHm",[])), +?line <<"HkIFCqCBaabbbbcyHm">> = iolist_to_binary(re:replace("abbbbc","ab{0,}bc","Hk\\1IFCq\\1CBa&yHm",[global])), +?line <<"HBKHabbcHxdabbciuxleGabbc">> = iolist_to_binary(re:replace("abbc","ab+bc","HBKH&\\1Hx\\1d&iuxleG&",[])), +?line <<"HBKHabbcHxdabbciuxleGabbc">> = iolist_to_binary(re:replace("abbc","ab+bc","HBKH&\\1Hx\\1d&iuxleG&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab+bc","&Pm&sRjS",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab+bc","&Pm&sRjS",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","ab+bc","IiWLkYFrIIhMk\\1D\\1vagP",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","ab+bc","IiWLkYFrIIhMk\\1D\\1vagP",[global])), +?line <<"abq">> = iolist_to_binary(re:replace("abq","ab+bc","&\\1\\1UiX\\1&MgPB",[])), +?line <<"abq">> = iolist_to_binary(re:replace("abq","ab+bc","&\\1\\1UiX\\1&MgPB",[global])), +?line <<"WLvlqVMuiA">> = iolist_to_binary(re:replace("abbbbc","ab+bc","WLvlqVMuiA",[])), +?line <<"WLvlqVMuiA">> = iolist_to_binary(re:replace("abbbbc","ab+bc","WLvlqVMuiA",[global])), +?line <<"qQ">> = iolist_to_binary(re:replace("abbbbc","ab{1,}bc","qQ",[])), +?line <<"qQ">> = iolist_to_binary(re:replace("abbbbc","ab{1,}bc","qQ",[global])), +?line <<"ALwvHVhFGH">> = iolist_to_binary(re:replace("abbbbc","ab{1,3}bc","A\\1LwvHVhFGH",[])), +?line <<"ALwvHVhFGH">> = iolist_to_binary(re:replace("abbbbc","ab{1,3}bc","A\\1LwvHVhFGH",[global])), +?line <<"ORLsuabbbbc">> = iolist_to_binary(re:replace("abbbbc","ab{3,4}bc","ORL\\1su&",[])), +?line <<"ORLsuabbbbc">> = iolist_to_binary(re:replace("abbbbc","ab{3,4}bc","ORL\\1su&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab{4,5}bc","APwPKjxS\\1Di&\\1",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab{4,5}bc","APwPKjxS\\1Di&\\1",[global])), +?line <<"abq">> = iolist_to_binary(re:replace("abq","ab{4,5}bc","FVk",[])), +?line <<"abq">> = iolist_to_binary(re:replace("abq","ab{4,5}bc","FVk",[global])), +?line <<"abbbbc">> = iolist_to_binary(re:replace("abbbbc","ab{4,5}bc","PO&t",[])), +?line <<"abbbbc">> = iolist_to_binary(re:replace("abbbbc","ab{4,5}bc","PO&t",[global])), +?line <<"EHtIXyQbabbclaCBg">> = iolist_to_binary(re:replace("abbc","ab?bc","EHtIXyQb&laCBg",[])), +?line <<"EHtIXyQbabbclaCBg">> = iolist_to_binary(re:replace("abbc","ab?bc","EHtIXyQb&laCBg",[global])), +?line <<"SVx">> = iolist_to_binary(re:replace("abc","ab?bc","SVx",[])), +?line <<"SVx">> = iolist_to_binary(re:replace("abc","ab?bc","SVx",[global])), +?line <<"KJabcWtBNRX">> = iolist_to_binary(re:replace("abc","ab{0,1}bc","KJ&WtBNRX",[])), +?line <<"KJabcWtBNRX">> = iolist_to_binary(re:replace("abc","ab{0,1}bc","KJ&WtBNRX",[global])), +?line <<"oabcQlOwmmeXxTySSV">> = iolist_to_binary(re:replace("abc","ab?c","o&Q\\1lOwmmeXx\\1TySSV",[])), +?line <<"oabcQlOwmmeXxTySSV">> = iolist_to_binary(re:replace("abc","ab?c","o&Q\\1lOwmmeXx\\1TySSV",[global])), +?line <<"abcQpPYPtQcFabcCDEcWOl">> = iolist_to_binary(re:replace("abc","ab{0,1}c","&QpPY\\1PtQcF&CDEcWOl",[])), +?line <<"abcQpPYPtQcFabcCDEcWOl">> = iolist_to_binary(re:replace("abc","ab{0,1}c","&QpPY\\1PtQcF&CDEcWOl",[global])), +?line <<"YbB">> = iolist_to_binary(re:replace("abc","^abc$","YbB",[])), +?line <<"YbB">> = iolist_to_binary(re:replace("abc","^abc$","YbB",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^abc$","r&t\\1OLYfC",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^abc$","r&t\\1OLYfC",[global])), +?line <<"abbbbc">> = iolist_to_binary(re:replace("abbbbc","^abc$","P&QwAxc\\1vYfQF",[])), +?line <<"abbbbc">> = iolist_to_binary(re:replace("abbbbc","^abc$","P&QwAxc\\1vYfQF",[global])), +?line <<"abcc">> = iolist_to_binary(re:replace("abcc","^abc$","d\\1j&LhAN\\1JvojhyCmSwU",[])), +?line <<"abcc">> = iolist_to_binary(re:replace("abcc","^abc$","d\\1j&LhAN\\1JvojhyCmSwU",[global])), +?line <<"yabcxAc">> = iolist_to_binary(re:replace("abcc","^abc","y\\1&xA",[])), +?line <<"yabcxAc">> = iolist_to_binary(re:replace("abcc","^abc","y\\1&xA",[global])), +?line <<"awrOx">> = iolist_to_binary(re:replace("aabc","abc$","wrOx",[])), +?line <<"awrOx">> = iolist_to_binary(re:replace("aabc","abc$","wrOx",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abc$","XLe",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abc$","XLe",[global])), +?line <<"aRthCinfyGSJTg">> = iolist_to_binary(re:replace("aabc","abc$","\\1RthCi\\1nfyGSJTg",[])), +?line <<"aRthCinfyGSJTg">> = iolist_to_binary(re:replace("aabc","abc$","\\1RthCi\\1nfyGSJTg",[global])), +?line <<"aabcd">> = iolist_to_binary(re:replace("aabcd","abc$","UT&CPLaUA\\1nluQPA",[])), +?line <<"aabcd">> = iolist_to_binary(re:replace("aabcd","abc$","UT&CPLaUA\\1nluQPA",[global])), +?line <<"hYaxcodDoHwNTLtDQoabc">> = iolist_to_binary(re:replace("abc","^","hYaxc&o&dDoHwNTLtDQo",[])), +?line <<"hYaxcodDoHwNTLtDQoabc">> = iolist_to_binary(re:replace("abc","^","hYaxc&o&dDoHwNTLtDQo",[global])), +?line <<"abcepxRqYNdJMdQeRKr">> = iolist_to_binary(re:replace("abc","$","epxRqYNdJ&MdQeR&Kr",[])), +?line <<"abcepxRqYNdJMdQeRKr">> = iolist_to_binary(re:replace("abc","$","epxRqYNdJ&MdQeR&Kr",[global])), +?line <<"vnabcXvSRrFjWv">> = iolist_to_binary(re:replace("abc","a.c","\\1vn&X\\1vSRrFj\\1Wv",[])), +?line <<"vnabcXvSRrFjWv">> = iolist_to_binary(re:replace("abc","a.c","\\1vn&X\\1vSRrFj\\1Wv",[global])), +?line <<"YSYAvHCLl">> = iolist_to_binary(re:replace("axc","a.c","Y\\1\\1SYAvHCLl",[])), +?line <<"YSYAvHCLl">> = iolist_to_binary(re:replace("axc","a.c","Y\\1\\1SYAvHCLl",[global])), +?line <<"oTi">> = iolist_to_binary(re:replace("axyzc","a.*c","oTi",[])), +?line <<"oTi">> = iolist_to_binary(re:replace("axyzc","a.*c","oTi",[global])), +?line <<"abdd">> = iolist_to_binary(re:replace("abd","a[bc]d","&d",[])), +?line <<"abdd">> = iolist_to_binary(re:replace("abd","a[bc]d","&d",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[bc]d","m",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[bc]d","m",[global])), +?line <<"axyzd">> = iolist_to_binary(re:replace("axyzd","a[bc]d","xw\\1kClblo&A&pX",[])), +?line <<"axyzd">> = iolist_to_binary(re:replace("axyzd","a[bc]d","xw\\1kClblo&A&pX",[global])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","a[bc]d","DXVJBfd&&nWiQKDXx&p",[])), +?line <<"abc">> = iolist_to_binary(re:replace("abc","a[bc]d","DXVJBfd&&nWiQKDXx&p",[global])), +?line <<"qgcyq">> = iolist_to_binary(re:replace("ace","a[b-d]e","qgcyq\\1",[])), +?line <<"qgcyq">> = iolist_to_binary(re:replace("ace","a[b-d]e","qgcyq\\1",[global])), +?line <<"aSo">> = iolist_to_binary(re:replace("aac","a[b-d]","S\\1o",[])), +?line <<"aSo">> = iolist_to_binary(re:replace("aac","a[b-d]","S\\1o",[global])), +?line <<"FalJiLh">> = iolist_to_binary(re:replace("a-","a[-b]","FalJ\\1iL\\1h",[])), +?line <<"FalJiLh">> = iolist_to_binary(re:replace("a-","a[-b]","FalJ\\1iL\\1h",[global])), +?line <<"aea-">> = iolist_to_binary(re:replace("a-","a[b-]","ae&",[])), +?line <<"aea-">> = iolist_to_binary(re:replace("a-","a[b-]","ae&",[global])), +?line <<"Uxci">> = iolist_to_binary(re:replace("a]","a]","Uxci",[])), +?line <<"Uxci">> = iolist_to_binary(re:replace("a]","a]","Uxci",[global])), +?line <<"fuDs">> = iolist_to_binary(re:replace("a]b","a[]]b","fu\\1Ds",[])), +?line <<"fuDs">> = iolist_to_binary(re:replace("a]b","a[]]b","fu\\1Ds",[global])), +?line <<"S">> = iolist_to_binary(re:replace("aed","a[^bc]d","\\1S",[])), +?line <<"S">> = iolist_to_binary(re:replace("aed","a[^bc]d","\\1S",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[^bc]d","q\\1c",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[^bc]d","q\\1c",[global])), +?line <<"abd">> = iolist_to_binary(re:replace("abd","a[^bc]d","CwigRG\\1",[])), +?line <<"abd">> = iolist_to_binary(re:replace("abd","a[^bc]d","CwigRG\\1",[global])), +?line <<"abd">> = iolist_to_binary(re:replace("abd","a[^bc]d","G&sOiYoXxtvjC\\1C",[])), +?line <<"abd">> = iolist_to_binary(re:replace("abd","a[^bc]d","G&sOiYoXxtvjC\\1C",[global])), +?line <<"WjwradcGadcGdiadcJadcadc">> = iolist_to_binary(re:replace("adc","a[^-b]c","Wjwr&G&Gdi&J&&",[])), +?line <<"WjwradcGadcGdiadcJadcadc">> = iolist_to_binary(re:replace("adc","a[^-b]c","Wjwr&G&Gdi&J&&",[global])), +?line <<"sXuNQuSoADXQHaadcc">> = iolist_to_binary(re:replace("adc","a[^]b]c","sXuNQuS\\1oAD\\1XQH\\1a&c",[])), +?line <<"sXuNQuSoADXQHaadcc">> = iolist_to_binary(re:replace("adc","a[^]b]c","sXuNQuS\\1oAD\\1XQH\\1a&c",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[^]b]c","\\1WTVFfqlY\\1I",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[^]b]c","\\1WTVFfqlY\\1I",[global])), +?line <<"a-c">> = iolist_to_binary(re:replace("a-c","a[^]b]c","&",[])), +?line <<"a-c">> = iolist_to_binary(re:replace("a-c","a[^]b]c","&",[global])), +?line <<"a]c">> = iolist_to_binary(re:replace("a]c","a[^]b]c","U\\1ASb",[])), +?line <<"a]c">> = iolist_to_binary(re:replace("a]c","a[^]b]c","U\\1ASb",[global])), +?line <<"FhmTxP-">> = iolist_to_binary(re:replace("a-","\\ba\\b","FhmTxP",[])), +?line <<"FhmTxP-">> = iolist_to_binary(re:replace("a-","\\ba\\b","FhmTxP",[global])), +?line <<"-sIgAwOVeaIs">> = iolist_to_binary(re:replace("-a","\\ba\\b","sIgAwOVe&Is",[])), +?line <<"-sIgAwOVeaIs">> = iolist_to_binary(re:replace("-a","\\ba\\b","sIgAwOVe&Is",[global])), +?line <<"-K-">> = iolist_to_binary(re:replace("-a-","\\ba\\b","K",[])), +?line <<"-K-">> = iolist_to_binary(re:replace("-a-","\\ba\\b","K",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\by\\b","NFs\\1N&no&v&LBhrfD",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\by\\b","NFs\\1N&no&v&LBhrfD",[global])), +?line <<"xy">> = iolist_to_binary(re:replace("xy","\\by\\b","\\1&WFL&q",[])), +?line <<"xy">> = iolist_to_binary(re:replace("xy","\\by\\b","\\1&WFL&q",[global])), +?line <<"yz">> = iolist_to_binary(re:replace("yz","\\by\\b","pjeKdgSu&&",[])), +?line <<"yz">> = iolist_to_binary(re:replace("yz","\\by\\b","pjeKdgSu&&",[global])), +?line <<"xyz">> = iolist_to_binary(re:replace("xyz","\\by\\b","hyG",[])), +?line <<"xyz">> = iolist_to_binary(re:replace("xyz","\\by\\b","hyG",[global])), +?line <<"*** FCasopdebailers">> = iolist_to_binary(re:replace("*** Failers","\\Ba\\B","C\\1&sopdeb&",[])), +?line <<"*** FCasopdebailers">> = iolist_to_binary(re:replace("*** Failers","\\Ba\\B","C\\1&sopdeb&",[global])), +?line <<"a-">> = iolist_to_binary(re:replace("a-","\\Ba\\B","mnLWav",[])), +?line <<"a-">> = iolist_to_binary(re:replace("a-","\\Ba\\B","mnLWav",[global])), +?line <<"-a">> = iolist_to_binary(re:replace("-a","\\Ba\\B","X&NpSD\\1If",[])), +?line <<"-a">> = iolist_to_binary(re:replace("-a","\\Ba\\B","X&NpSD\\1If",[global])), +?line <<"-a-">> = iolist_to_binary(re:replace("-a-","\\Ba\\B","loFA&cpicKF&FLSfj&",[])), +?line <<"-a-">> = iolist_to_binary(re:replace("-a-","\\Ba\\B","loFA&cpicKF&FLSfj&",[global])), +?line <<"xyTAT">> = iolist_to_binary(re:replace("xy","\\By\\b","&TAT",[])), +?line <<"xyTAT">> = iolist_to_binary(re:replace("xy","\\By\\b","&TAT",[global])), +?line <<"fxz">> = iolist_to_binary(re:replace("yz","\\by\\B","fx\\1\\1",[])), +?line <<"fxz">> = iolist_to_binary(re:replace("yz","\\by\\B","fx\\1\\1",[global])), +?line <<"xKryOdAEz">> = iolist_to_binary(re:replace("xyz","\\By\\B","Kr&OdAE",[])), +?line <<"xKryOdAEz">> = iolist_to_binary(re:replace("xyz","\\By\\B","Kr&OdAE",[global])), +?line <<"IRVtaAqLDh">> = iolist_to_binary(re:replace("a","\\w","IRVt&AqLDh\\1",[])), +?line <<"IRVtaAqLDh">> = iolist_to_binary(re:replace("a","\\w","IRVt&AqLDh\\1",[global])), +?line <<"EckncnNqwHO">> = iolist_to_binary(re:replace("-","\\W","EckncnNq\\1wHO\\1",[])), +?line <<"EckncnNqwHO">> = iolist_to_binary(re:replace("-","\\W","EckncnNq\\1wHO\\1",[global])), +?line <<"Yf*VvjLGbD*h** Failers">> = iolist_to_binary(re:replace("*** Failers","\\W","Yf&VvjLGbD&h",[])), +?line <<"Yf*VvjLGbD*hYf*VvjLGbD*hYf*VvjLGbD*hYf VvjLGbD hFailers">> = iolist_to_binary(re:replace("*** Failers","\\W","Yf&VvjLGbD&h",[global])), +?line <<"GBjpbjk">> = iolist_to_binary(re:replace("-","\\W","GBjpbjk",[])), +?line <<"GBjpbjk">> = iolist_to_binary(re:replace("-","\\W","GBjpbjk",[global])), +?line <<"a">> = iolist_to_binary(re:replace("a","\\W","j",[])), +?line <<"a">> = iolist_to_binary(re:replace("a","\\W","j",[global])), +?line <<"VAiCYGiBXpa bumnbi">> = iolist_to_binary(re:replace("a b","a\\sb","VAiCYGiBX\\1p&umn\\1bi",[])), +?line <<"VAiCYGiBXpa bumnbi">> = iolist_to_binary(re:replace("a b","a\\sb","VAiCYGiBX\\1p&umn\\1bi",[global])), +?line <<"Etv">> = iolist_to_binary(re:replace("a-b","a\\Sb","Etv",[])), +?line <<"Etv">> = iolist_to_binary(re:replace("a-b","a\\Sb","Etv",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a\\Sb","EbhHjGSDvEtLT\\1cSURa",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a\\Sb","EbhHjGSDvEtLT\\1cSURa",[global])), +?line <<"uD">> = iolist_to_binary(re:replace("a-b","a\\Sb","uD",[])), +?line <<"uD">> = iolist_to_binary(re:replace("a-b","a\\Sb","uD",[global])), +?line <<"a b">> = iolist_to_binary(re:replace("a b","a\\Sb","fQm&D&nJmqrWl",[])), +?line <<"a b">> = iolist_to_binary(re:replace("a b","a\\Sb","fQm&D&nJmqrWl",[global])), +?line <<"jti">> = iolist_to_binary(re:replace("1","\\d","jti",[])), +?line <<"jti">> = iolist_to_binary(re:replace("1","\\d","jti",[global])), +?line <<"-m">> = iolist_to_binary(re:replace("-","\\D","&m",[])), +?line <<"-m">> = iolist_to_binary(re:replace("-","\\D","&m",[global])), +?line <<"Tw** Failers">> = iolist_to_binary(re:replace("*** Failers","\\D","\\1Tw",[])), +?line <<"TwTwTwTwTwTwTwTwTwTwTw">> = iolist_to_binary(re:replace("*** Failers","\\D","\\1Tw",[global])), +?line <<"T">> = iolist_to_binary(re:replace("-","\\D","T",[])), +?line <<"T">> = iolist_to_binary(re:replace("-","\\D","T",[global])), +?line <<"1">> = iolist_to_binary(re:replace("1","\\D","QkyGdjVcibs",[])), +?line <<"1">> = iolist_to_binary(re:replace("1","\\D","QkyGdjVcibs",[global])), +?line <<"Vsg">> = iolist_to_binary(re:replace("a","[\\w]","Vsg",[])), +?line <<"Vsg">> = iolist_to_binary(re:replace("a","[\\w]","Vsg",[global])), +?line <<"AeUjdVITmvExYR">> = iolist_to_binary(re:replace("-","[\\W]","AeU\\1jdVITmvExYR\\1",[])), +?line <<"AeUjdVITmvExYR">> = iolist_to_binary(re:replace("-","[\\W]","AeU\\1jdVITmvExYR\\1",[global])), +?line <<"WhGTRj*eDnCm** Failers">> = iolist_to_binary(re:replace("*** Failers","[\\W]","WhGTRj&eDnCm",[])), +?line <<"WhGTRj*eDnCmWhGTRj*eDnCmWhGTRj*eDnCmWhGTRj eDnCmFailers">> = iolist_to_binary(re:replace("*** Failers","[\\W]","WhGTRj&eDnCm",[global])), +?line <<"c-aqg-Be">> = iolist_to_binary(re:replace("-","[\\W]","c&aqg&Be",[])), +?line <<"c-aqg-Be">> = iolist_to_binary(re:replace("-","[\\W]","c&aqg&Be",[global])), +?line <<"a">> = iolist_to_binary(re:replace("a","[\\W]","lS",[])), +?line <<"a">> = iolist_to_binary(re:replace("a","[\\W]","lS",[global])), +?line <<"aTa bLH">> = iolist_to_binary(re:replace("a b","a[\\s]b","aT&LH\\1",[])), +?line <<"aTa bLH">> = iolist_to_binary(re:replace("a b","a[\\s]b","aT&LH\\1",[global])), +?line <<"a">> = iolist_to_binary(re:replace("a-b","a[\\S]b","a",[])), +?line <<"a">> = iolist_to_binary(re:replace("a-b","a[\\S]b","a",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[\\S]b","b\\1E&yC\\1kT&CwD",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[\\S]b","b\\1E&yC\\1kT&CwD",[global])), +?line <<"a-bfLEHcwVqa-bwEar">> = iolist_to_binary(re:replace("a-b","a[\\S]b","&fLE\\1\\1Hcw\\1V\\1q&wEar",[])), +?line <<"a-bfLEHcwVqa-bwEar">> = iolist_to_binary(re:replace("a-b","a[\\S]b","&fLE\\1\\1Hcw\\1V\\1q&wEar",[global])), +?line <<"a b">> = iolist_to_binary(re:replace("a b","a[\\S]b","E\\1NcSC&l",[])), +?line <<"a b">> = iolist_to_binary(re:replace("a b","a[\\S]b","E\\1NcSC&l",[global])), +?line <<"U1LgIwNodaqkLmOQ">> = iolist_to_binary(re:replace("1","[\\d]","U\\1&LgIwNo\\1daqkL\\1mOQ",[])), +?line <<"U1LgIwNodaqkLmOQ">> = iolist_to_binary(re:replace("1","[\\d]","U\\1&LgIwNo\\1daqkL\\1mOQ",[global])), +?line <<"XTGOaAL-XOENvmW">> = iolist_to_binary(re:replace("-","[\\D]","XTGOa\\1AL&XOE\\1NvmW",[])), +?line <<"XTGOaAL-XOENvmW">> = iolist_to_binary(re:replace("-","[\\D]","XTGOa\\1AL&XOE\\1NvmW",[global])), +?line <<"*rIhW*QnqjR*** Failers">> = iolist_to_binary(re:replace("*** Failers","[\\D]","&\\1r\\1I\\1h\\1W&Q\\1n\\1qjR&",[])), +?line <<"*rIhW*QnqjR**rIhW*QnqjR**rIhW*QnqjR* rIhW QnqjR FrIhWFQnqjRFarIhWaQnqjRairIhWiQnqjRilrIhWlQnqjRlerIhWeQnqjRerrIhWrQnqjRrsrIhWsQnqjRs">> = iolist_to_binary(re:replace("*** Failers","[\\D]","&\\1r\\1I\\1h\\1W&Q\\1n\\1qjR&",[global])), +?line <<"TEOmg-mrq">> = iolist_to_binary(re:replace("-","[\\D]","TE\\1Omg&\\1mrq",[])), +?line <<"TEOmg-mrq">> = iolist_to_binary(re:replace("-","[\\D]","TE\\1Omg&\\1mrq",[global])), +?line <<"1">> = iolist_to_binary(re:replace("1","[\\D]","YI\\1o&\\1IwvchJgD&&",[])), +?line <<"1">> = iolist_to_binary(re:replace("1","[\\D]","YI\\1o&\\1IwvchJgD&&",[global])), +?line <<"DKXoAolSGIabc">> = iolist_to_binary(re:replace("abc","ab|cd","DKXoAolSGI&",[])), +?line <<"DKXoAolSGIabc">> = iolist_to_binary(re:replace("abc","ab|cd","DKXoAolSGI&",[global])), +?line <<"tFHUIrVcd">> = iolist_to_binary(re:replace("abcd","ab|cd","tFHUIrV\\1",[])), +?line <<"tFHUIrVtFHUIrV">> = iolist_to_binary(re:replace("abcd","ab|cd","tFHUIrV\\1",[global])), +?line <<"doeAAefCeUJ">> = iolist_to_binary(re:replace("def","()ef","oeAA&CeUJ",[])), +?line <<"doeAAefCeUJ">> = iolist_to_binary(re:replace("def","()ef","oeAA&CeUJ",[global])), +?line <<"B">> = iolist_to_binary(re:replace("a(b","a\\(b","B",[])), +?line <<"B">> = iolist_to_binary(re:replace("a(b","a\\(b","B",[global])), +?line <<"sFcBhj">> = iolist_to_binary(re:replace("ab","a\\(*b","sFcBhj",[])), +?line <<"sFcBhj">> = iolist_to_binary(re:replace("ab","a\\(*b","sFcBhj",[global])), +?line <<"iTla((bUcHSjwja((ba((b">> = iolist_to_binary(re:replace("a((b","a\\(*b","iTl&UcHSjwj\\1&&",[])), +?line <<"iTla((bUcHSjwja((ba((b">> = iolist_to_binary(re:replace("a((b","a\\(*b","iTl&UcHSjwj\\1&&",[global])), +?line <<"a">> = iolist_to_binary(re:replace("a","a\\\\b","AkoMVU&",[])), +?line <<"a">> = iolist_to_binary(re:replace("a","a\\\\b","AkoMVU&",[global])), +?line <<"Gbc">> = iolist_to_binary(re:replace("abc","((a))","G",[])), +?line <<"Gbc">> = iolist_to_binary(re:replace("abc","((a))","G",[global])), +?line <<"aaabcTualQ">> = iolist_to_binary(re:replace("abc","(a)b(c)","\\1\\1&Tu\\1lQ",[])), +?line <<"aaabcTualQ">> = iolist_to_binary(re:replace("abc","(a)b(c)","\\1\\1&Tu\\1lQ",[global])), +?line <<"aabbCivt">> = iolist_to_binary(re:replace("aabbabc","a+b+c","\\1Civt",[])), +?line <<"aabbCivt">> = iolist_to_binary(re:replace("aabbabc","a+b+c","\\1Civt",[global])), +?line <<"aabbT">> = iolist_to_binary(re:replace("aabbabc","a{1,}b{1,}c","T",[])), +?line <<"aabbT">> = iolist_to_binary(re:replace("aabbabc","a{1,}b{1,}c","T",[global])), +?line <<"VxJHThVabcketabcebWabc">> = iolist_to_binary(re:replace("abcabc","a.+?c","VxJHThV&ket&ebW",[])), +?line <<"VxJHThVabcketabcebWVxJHThVabcketabcebW">> = iolist_to_binary(re:replace("abcabc","a.+?c","VxJHThV&ket&ebW",[global])), +?line <<"LXfabNabCqMabHb">> = iolist_to_binary(re:replace("ab","(a+|b)*","LXf&N&CqM&H\\1",[])), +?line <<"LXfabNabCqMabHbLXfNCqMH">> = iolist_to_binary(re:replace("ab","(a+|b)*","LXf&N&CqM&H\\1",[global])), +?line <<"NNopapyUJpabVxnQ">> = iolist_to_binary(re:replace("ab","(a+|b){0,}","NNopapyUJpa\\1VxnQ",[])), +?line <<"NNopapyUJpabVxnQNNopapyUJpaVxnQ">> = iolist_to_binary(re:replace("ab","(a+|b){0,}","NNopapyUJpa\\1VxnQ",[global])), +?line <<"cejhccpabbAd">> = iolist_to_binary(re:replace("ab","(a+|b)+","cejhccp&\\1Ad",[])), +?line <<"cejhccpabbAd">> = iolist_to_binary(re:replace("ab","(a+|b)+","cejhccp&\\1Ad",[global])), +?line <<"uMqbbBaYPvPbkabNdlb">> = iolist_to_binary(re:replace("ab","(a+|b){1,}","uMqb\\1BaYPvP\\1k&Ndl\\1",[])), +?line <<"uMqbbBaYPvPbkabNdlb">> = iolist_to_binary(re:replace("ab","(a+|b){1,}","uMqb\\1BaYPvP\\1k&Ndl\\1",[global])), +?line <<"cyKMb">> = iolist_to_binary(re:replace("ab","(a+|b)?","cyKM",[])), +?line <<"cyKMcyKMcyKM">> = iolist_to_binary(re:replace("ab","(a+|b)?","cyKM",[global])), +?line <<"uaaPjgxb">> = iolist_to_binary(re:replace("ab","(a+|b){0,1}","u\\1\\1Pjgx",[])), +?line <<"uaaPjgxubbPjgxuPjgx">> = iolist_to_binary(re:replace("ab","(a+|b){0,1}","u\\1\\1Pjgx",[global])), +?line <<"JsG">> = iolist_to_binary(re:replace("cde","[^ab]*","\\1J\\1sG",[])), +?line <<"JsGJsG">> = iolist_to_binary(re:replace("cde","[^ab]*","\\1J\\1sG",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abc","NyHCvfJjxj\\1SrM&BdF",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abc","NyHCvfJjxj\\1SrM&BdF",[global])), +?line <<"b">> = iolist_to_binary(re:replace("b","abc","T&\\1Jd\\1tQxU\\1&\\1\\1bp",[])), +?line <<"b">> = iolist_to_binary(re:replace("b","abc","T&\\1Jd\\1tQxU\\1&\\1\\1bp",[global])), +?line <<"AHcabbbcdabbbcdabbbcdSCcNR">> = iolist_to_binary(re:replace("abbbcd","([abc])*d","AH\\1&&&SC\\1NR",[])), +?line <<"AHcabbbcdabbbcdabbbcdSCcNR">> = iolist_to_binary(re:replace("abbbcd","([abc])*d","AH\\1&&&SC\\1NR",[global])), +?line <<"jDJabcdqabcdgNaaNoyaGm">> = iolist_to_binary(re:replace("abcd","([abc])*bcd","jDJ&q&gN\\1\\1Noy\\1Gm",[])), +?line <<"jDJabcdqabcdgNaaNoyaGm">> = iolist_to_binary(re:replace("abcd","([abc])*bcd","jDJ&q&gN\\1\\1Noy\\1Gm",[global])), +?line <<"IHdxtFuTeF">> = iolist_to_binary(re:replace("e","a|b|c|d|e","IHdxtFuT&F",[])), +?line <<"IHdxtFuTeF">> = iolist_to_binary(re:replace("e","a|b|c|d|e","IHdxtFuT&F",[global])), +?line <<"RjceNtss">> = iolist_to_binary(re:replace("ef","(a|b|c|d|e)f","Rjc\\1Ntss",[])), +?line <<"RjceNtss">> = iolist_to_binary(re:replace("ef","(a|b|c|d|e)f","Rjc\\1Ntss",[global])), +?line <<"nViLDabcdefg">> = iolist_to_binary(re:replace("abcdefg","abcd*efg","nViL\\1D&\\1",[])), +?line <<"nViLDabcdefg">> = iolist_to_binary(re:replace("abcdefg","abcd*efg","nViL\\1D&\\1",[global])), +?line <<"xoJUabyHFyabbbz">> = iolist_to_binary(re:replace("xabyabbbz","ab*","oJ\\1U&yHF",[])), +?line <<"xoJUabyHFyoJUabbbyHFz">> = iolist_to_binary(re:replace("xabyabbbz","ab*","oJ\\1U&yHF",[global])), +?line <<"xbaEdBayabbbz">> = iolist_to_binary(re:replace("xayabbbz","ab*","b&EdBa",[])), +?line <<"xbaEdBaybabbbEdBaz">> = iolist_to_binary(re:replace("xayabbbz","ab*","b&EdBa",[global])), +?line <<"abHqcde">> = iolist_to_binary(re:replace("abcde","(ab|cd)e","Hq&",[])), +?line <<"abHqcde">> = iolist_to_binary(re:replace("abcde","(ab|cd)e","Hq&",[global])), +?line <<"lrrKIUARhij">> = iolist_to_binary(re:replace("hij","[abhgefdc]ij","l\\1\\1r\\1rKIUAR&",[])), +?line <<"lrrKIUARhij">> = iolist_to_binary(re:replace("hij","[abhgefdc]ij","l\\1\\1r\\1rKIUAR&",[global])), +?line <<"abcdWfgkefnnefNPAQ">> = iolist_to_binary(re:replace("abcdef","(abc|)ef","\\1Wfgk&nn&\\1NPAQ\\1",[])), +?line <<"abcdWfgkefnnefNPAQ">> = iolist_to_binary(re:replace("abcdef","(abc|)ef","\\1Wfgk&nn&\\1NPAQ\\1",[global])), +?line <<"aUbGqmbcdWXLMCpYbbcd">> = iolist_to_binary(re:replace("abcd","(a|b)c*d","U\\1Gqm&WXLMCpY\\1&",[])), +?line <<"aUbGqmbcdWXLMCpYbbcd">> = iolist_to_binary(re:replace("abcd","(a|b)c*d","U\\1Gqm&WXLMCpY\\1&",[global])), +?line <<"vYALaabcfgsaUfyDabcjOtcQ">> = iolist_to_binary(re:replace("abc","(ab|ab*)bc","vYAL\\1&fgs\\1UfyD&jOtcQ",[])), +?line <<"vYALaabcfgsaUfyDabcjOtcQ">> = iolist_to_binary(re:replace("abc","(ab|ab*)bc","vYAL\\1&fgs\\1UfyD&jOtcQ",[global])), +?line <<"uyabcabcp">> = iolist_to_binary(re:replace("abc","a([bc]*)c*","uy&&p",[])), +?line <<"uyabcabcp">> = iolist_to_binary(re:replace("abc","a([bc]*)c*","uy&&p",[global])), +?line <<"iAyJUbcM">> = iolist_to_binary(re:replace("abcd","a([bc]*)(c*d)","iAyJU\\1M",[])), +?line <<"iAyJUbcM">> = iolist_to_binary(re:replace("abcd","a([bc]*)(c*d)","iAyJU\\1M",[global])), +?line <<"abcdabcdabcd">> = iolist_to_binary(re:replace("abcd","a([bc]+)(c*d)","&&&",[])), +?line <<"abcdabcdabcd">> = iolist_to_binary(re:replace("abcd","a([bc]+)(c*d)","&&&",[global])), +?line <<"UgwJmKabcddNBBm">> = iolist_to_binary(re:replace("abcd","a([bc]*)(c+d)","UgwJmK&dNBBm",[])), +?line <<"UgwJmKabcddNBBm">> = iolist_to_binary(re:replace("abcd","a([bc]*)(c+d)","UgwJmK&dNBBm",[global])), +?line <<"glXDRFe">> = iolist_to_binary(re:replace("adcdcde","a[bcd]*dcdcde","glXDRFe\\1",[])), +?line <<"glXDRFe">> = iolist_to_binary(re:replace("adcdcde","a[bcd]*dcdcde","glXDRFe\\1",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[bcd]+dcdcde","&\\1Tw",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[bcd]+dcdcde","&\\1Tw",[global])), +?line <<"abcde">> = iolist_to_binary(re:replace("abcde","a[bcd]+dcdcde","OaFcNB\\1AbGk\\1RcX&\\1hU",[])), +?line <<"abcde">> = iolist_to_binary(re:replace("abcde","a[bcd]+dcdcde","OaFcNB\\1AbGk\\1RcX&\\1hU",[global])), +?line <<"adcdcde">> = iolist_to_binary(re:replace("adcdcde","a[bcd]+dcdcde","LRCnDGeISr",[])), +?line <<"adcdcde">> = iolist_to_binary(re:replace("adcdcde","a[bcd]+dcdcde","LRCnDGeISr",[global])), +?line <<"ab">> = iolist_to_binary(re:replace("abc","(ab|a)b*c","\\1",[])), +?line <<"ab">> = iolist_to_binary(re:replace("abc","(ab|a)b*c","\\1",[global])), +?line <<"abcdYujfprabcdqmHBi">> = iolist_to_binary(re:replace("abcd","((a)(b)c)(d)","&Yujfpr&qmHBi",[])), +?line <<"abcdYujfprabcdqmHBi">> = iolist_to_binary(re:replace("abcd","((a)(b)c)(d)","&Yujfpr&qmHBi",[global])), +?line <<"HSalphaw">> = iolist_to_binary(re:replace("alpha","[a-zA-Z_][a-zA-Z0-9_]*","HS&w",[])), +?line <<"HSalphaw">> = iolist_to_binary(re:replace("alpha","[a-zA-Z_][a-zA-Z0-9_]*","HS&w",[global])), +?line <<"amKrkJTTmWxwbhbhVXebhD">> = iolist_to_binary(re:replace("abh","^a(bc+|b[eh])g|.h$","mKrkJTT\\1mWxw&&VXe&D",[])), +?line <<"amKrkJTTmWxwbhbhVXebhD">> = iolist_to_binary(re:replace("abh","^a(bc+|b[eh])g|.h$","mKrkJTT\\1mWxw&&VXe&D",[global])), +?line <<"gkglaeffgzeffgzwvwD">> = iolist_to_binary(re:replace("effgz","(bc+d$|ef*g.|h?i(j|k))","gkgla\\1&wvwD",[])), +?line <<"gkglaeffgzeffgzwvwD">> = iolist_to_binary(re:replace("effgz","(bc+d$|ef*g.|h?i(j|k))","gkgla\\1&wvwD",[global])), +?line <<"ivMGijUoGoijri">> = iolist_to_binary(re:replace("ij","(bc+d$|ef*g.|h?i(j|k))","ivMG\\1UoGo\\1ri",[])), +?line <<"ivMGijUoGoijri">> = iolist_to_binary(re:replace("ij","(bc+d$|ef*g.|h?i(j|k))","ivMG\\1UoGo\\1ri",[global])), +?line <<"reffgzWeffgzJeffgzeffgzFUK">> = iolist_to_binary(re:replace("reffgz","(bc+d$|ef*g.|h?i(j|k))","&W\\1J\\1&FUK",[])), +?line <<"reffgzWeffgzJeffgzeffgzFUK">> = iolist_to_binary(re:replace("reffgz","(bc+d$|ef*g.|h?i(j|k))","&W\\1J\\1&FUK",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(bc+d$|ef*g.|h?i(j|k))","qoREgh&sKvuYfqcVSQ",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(bc+d$|ef*g.|h?i(j|k))","qoREgh&sKvuYfqcVSQ",[global])), +?line <<"effg">> = iolist_to_binary(re:replace("effg","(bc+d$|ef*g.|h?i(j|k))","OSMK&kVLNnI",[])), +?line <<"effg">> = iolist_to_binary(re:replace("effg","(bc+d$|ef*g.|h?i(j|k))","OSMK&kVLNnI",[global])), +?line <<"bcdd">> = iolist_to_binary(re:replace("bcdd","(bc+d$|ef*g.|h?i(j|k))","l\\1SFH&\\1WG\\1N&\\1WpNv",[])), +?line <<"bcdd">> = iolist_to_binary(re:replace("bcdd","(bc+d$|ef*g.|h?i(j|k))","l\\1SFH&\\1WG\\1N&\\1WpNv",[global])), +?line <<"uCcLk">> = iolist_to_binary(re:replace("a","((((((((((a))))))))))","uCcLk",[])), +?line <<"uCcLk">> = iolist_to_binary(re:replace("a","((((((((((a))))))))))","uCcLk",[global])), +?line <<"VCUvbvxORiulavLRaFa">> = iolist_to_binary(re:replace("aa","((((((((((a))))))))))\\10","VCUvbvxORiul\\1vLR\\1F\\1",[])), +?line <<"VCUvbvxORiulavLRaFa">> = iolist_to_binary(re:replace("aa","((((((((((a))))))))))\\10","VCUvbvxORiul\\1vLR\\1F\\1",[global])), +?line <<"vFhEaarfaQfeLfaFGiV">> = iolist_to_binary(re:replace("a","(((((((((a)))))))))","vFhE\\1&rf&QfeLf\\1FGiV",[])), +?line <<"vFhEaarfaQfeLfaFGiV">> = iolist_to_binary(re:replace("a","(((((((((a)))))))))","vFhE\\1&rf&QfeLf\\1FGiV",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","multiple words of text","jlWax\\1&H",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","multiple words of text","jlWax\\1&H",[global])), +?line <<"aa">> = iolist_to_binary(re:replace("aa","multiple words of text","hsUw",[])), +?line <<"aa">> = iolist_to_binary(re:replace("aa","multiple words of text","hsUw",[global])), +?line <<"uh-uh">> = iolist_to_binary(re:replace("uh-uh","multiple words of text","ASEw\\1gOsB",[])), +?line <<"uh-uh">> = iolist_to_binary(re:replace("uh-uh","multiple words of text","ASEw\\1gOsB",[global])), +?line <<"dmultiple wordsxkMtmultiple words, yeah">> = iolist_to_binary(re:replace("multiple words, yeah","multiple words","d&x\\1\\1kMt&",[])), +?line <<"dmultiple wordsxkMtmultiple words, yeah">> = iolist_to_binary(re:replace("multiple words, yeah","multiple words","d&x\\1\\1kMt&",[global])), +?line <<"ykkVabcdefmldQabUjIJjw">> = iolist_to_binary(re:replace("abcde","(.*)c(.*)","ykkV&fmldQ\\1UjIJjw",[])), +?line <<"ykkVabcdefmldQabUjIJjw">> = iolist_to_binary(re:replace("abcde","(.*)c(.*)","ykkV&fmldQ\\1UjIJjw",[global])), +?line <<"efWBSCaa(a, b)Q">> = iolist_to_binary(re:replace("(a, b)","\\((.*), (.*)\\)","efWBSC\\1\\1&Q",[])), +?line <<"efWBSCaa(a, b)Q">> = iolist_to_binary(re:replace("(a, b)","\\((.*), (.*)\\)","efWBSC\\1\\1&Q",[global])), +?line <<"abcdBdXhwHpBabcdPC">> = iolist_to_binary(re:replace("abcd","abcd","&Bd\\1XhwHp\\1B&PC",[])), +?line <<"abcdBdXhwHpBabcdPC">> = iolist_to_binary(re:replace("abcd","abcd","&Bd\\1XhwHp\\1B&PC",[global])), +?line <<"SbsAruCoIPbckBgbcSyqva">> = iolist_to_binary(re:replace("abcd","a(bc)d","SbsAruCoIP\\1kBg\\1Syqva",[])), +?line <<"SbsAruCoIPbckBgbcSyqva">> = iolist_to_binary(re:replace("abcd","a(bc)d","SbsAruCoIP\\1kBg\\1Syqva",[global])), +?line <<"XiUVfmkDnpfY">> = iolist_to_binary(re:replace("ac","a[-]?c","XiUVfmkDnpfY",[])), +?line <<"XiUVfmkDnpfY">> = iolist_to_binary(re:replace("ac","a[-]?c","XiUVfmkDnpfY",[global])), +?line <<"GYmabcndabcabcabcabcCjabcabcabcabctjmn">> = iolist_to_binary(re:replace("abcabc","(abc)\\1","GYm\\1nd&&Cj&\\1\\1tjmn",[])), +?line <<"GYmabcndabcabcabcabcCjabcabcabcabctjmn">> = iolist_to_binary(re:replace("abcabc","(abc)\\1","GYm\\1nd&&Cj&\\1\\1tjmn",[global])), +?line <<"AabcFabcabcOw">> = iolist_to_binary(re:replace("abcabc","([a-c]*)\\1","A\\1F&Ow",[])), +?line <<"AabcFabcabcOwAFOw">> = iolist_to_binary(re:replace("abcabc","([a-c]*)\\1","A\\1F&Ow",[global])), +?line <<"savneuiFiA">> = iolist_to_binary(re:replace("a","(a)|\\1","s&vneuiFiA",[])), +?line <<"savneuiFiA">> = iolist_to_binary(re:replace("a","(a)|\\1","s&vneuiFiA",[global])), +?line <<"*** FatXvbwaxGeTrgahaailers">> = iolist_to_binary(re:replace("*** Failers","(a)|\\1","\\1tXvbw&xGeTrg\\1h&\\1",[])), +?line <<"*** FatXvbwaxGeTrgahaailers">> = iolist_to_binary(re:replace("*** Failers","(a)|\\1","\\1tXvbw&xGeTrg\\1h&\\1",[global])), +?line <<"ShaaIOaiKrRarjaTFxavb">> = iolist_to_binary(re:replace("ab","(a)|\\1","Sh\\1\\1IO&iKrR\\1rj\\1TFx&v",[])), +?line <<"ShaaIOaiKrRarjaTFxavb">> = iolist_to_binary(re:replace("ab","(a)|\\1","Sh\\1\\1IO&iKrR\\1rj\\1TFx&v",[global])), +?line <<"x">> = iolist_to_binary(re:replace("x","(a)|\\1","wG&OmupsBaCA&ULU&br",[])), +?line <<"x">> = iolist_to_binary(re:replace("x","(a)|\\1","wG&OmupsBaCA&ULU&br",[global])), +?line <<"ababbsaHOnababbDlUpRwMMqlababbCbbbcbc">> = iolist_to_binary(re:replace("ababbbcbc","(([a-c])b*?\\2)*","&saHOn&DlUpRwMMql&C\\1",[])), +?line <<"ababbsaHOnababbDlUpRwMMqlababbCbbsaHOnDlUpRwMMqlCbcbcsaHOncbcDlUpRwMMqlcbcCcbcsaHOnDlUpRwMMqlC">> = iolist_to_binary(re:replace("ababbbcbc","(([a-c])b*?\\2)*","&saHOn&DlUpRwMMql&C\\1",[global])), +?line <<"YdAFYmyyababbbcbcHpJCababbbcbcQa">> = iolist_to_binary(re:replace("ababbbcbc","(([a-c])b*?\\2){3}","YdAFYmyy&HpJC&Qa",[])), +?line <<"YdAFYmyyababbbcbcHpJCababbbcbcQa">> = iolist_to_binary(re:replace("ababbbcbc","(([a-c])b*?\\2){3}","YdAFYmyy&HpJC&Qa",[global])), +?line <<"aaaxabaxbaaxabbax">> = iolist_to_binary(re:replace("aaaxabaxbaaxbbax","((\\3|b)\\2(a)x)+","a\\1",[])), +?line <<"aaaxabaxbaaxabbax">> = iolist_to_binary(re:replace("aaaxabaxbaaxbbax","((\\3|b)\\2(a)x)+","a\\1",[global])), +?line <<"bbaababbabaaaaaoh">> = iolist_to_binary(re:replace("bbaababbabaaaaabbaaaabba","((\\3|b)\\2(a)){2,}","oh",[])), +?line <<"bbaababbabaaaaaoh">> = iolist_to_binary(re:replace("bbaababbabaaaaabbaaaabba","((\\3|b)\\2(a)){2,}","oh",[global])), +?line <<"fABCaeUgIABCDABCNFvst">> = iolist_to_binary(re:replace("ABC","abc","f&aeUgI&D&\\1NFvst",[caseless])), +?line <<"fABCaeUgIABCDABCNFvst">> = iolist_to_binary(re:replace("ABC","abc","f&aeUgI&D&\\1NFvst",[caseless, + global])), +?line <<"XgOY">> = iolist_to_binary(re:replace("XABCY","abc","gO",[caseless])), +?line <<"XgOY">> = iolist_to_binary(re:replace("XABCY","abc","gO",[caseless, + global])), +?line <<"ABnpaQvR">> = iolist_to_binary(re:replace("ABABC","abc","npaQvR",[caseless])), +?line <<"ABnpaQvR">> = iolist_to_binary(re:replace("ABABC","abc","npaQvR",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abc","E&beuUX&&",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","abc","E&beuUX&&",[caseless, + global])), +?line <<"aaxabxbaxbbx">> = iolist_to_binary(re:replace("aaxabxbaxbbx","abc","\\1hAU\\1hg&Pk",[caseless])), +?line <<"aaxabxbaxbbx">> = iolist_to_binary(re:replace("aaxabxbaxbbx","abc","\\1hAU\\1hg&Pk",[caseless, + global])), +?line <<"XBC">> = iolist_to_binary(re:replace("XBC","abc","yqsG",[caseless])), +?line <<"XBC">> = iolist_to_binary(re:replace("XBC","abc","yqsG",[caseless, + global])), +?line <<"AXC">> = iolist_to_binary(re:replace("AXC","abc","\\1bi&Ff\\1kGVy&V",[caseless])), +?line <<"AXC">> = iolist_to_binary(re:replace("AXC","abc","\\1bi&Ff\\1kGVy&V",[caseless, + global])), +?line <<"ABX">> = iolist_to_binary(re:replace("ABX","abc","x&m\\1jtf&ptFxBd",[caseless])), +?line <<"ABX">> = iolist_to_binary(re:replace("ABX","abc","x&m\\1jtf&ptFxBd",[caseless, + global])), +?line <<"VOTkukABC">> = iolist_to_binary(re:replace("ABC","ab*c","V\\1OTkuk&\\1",[caseless])), +?line <<"VOTkukABC">> = iolist_to_binary(re:replace("ABC","ab*c","V\\1OTkuk&\\1",[caseless, + global])), +?line <<"gkYiABCuYNOFDNc">> = iolist_to_binary(re:replace("ABC","ab*bc","g\\1kYi&uYNOFDNc",[caseless])), +?line <<"gkYiABCuYNOFDNc">> = iolist_to_binary(re:replace("ABC","ab*bc","g\\1kYi&uYNOFDNc",[caseless, + global])), +?line <<"GHfaNWh">> = iolist_to_binary(re:replace("ABBC","ab*bc","G\\1HfaNWh",[caseless])), +?line <<"GHfaNWh">> = iolist_to_binary(re:replace("ABBC","ab*bc","G\\1HfaNWh",[caseless, + global])), +?line <<"IJJBqWcABBBBCmU">> = iolist_to_binary(re:replace("ABBBBC","ab*?bc","I\\1JJB\\1\\1qWc&mU",[caseless])), +?line <<"IJJBqWcABBBBCmU">> = iolist_to_binary(re:replace("ABBBBC","ab*?bc","I\\1JJB\\1\\1qWc&mU",[caseless, + global])), +?line <<"YOCTcABBBBCABBBBCbVDCpABBBBChP">> = iolist_to_binary(re:replace("ABBBBC","ab{0,}?bc","YOCTc&&bVDCp&hP",[caseless])), +?line <<"YOCTcABBBBCABBBBCbVDCpABBBBChP">> = iolist_to_binary(re:replace("ABBBBC","ab{0,}?bc","YOCTc&&bVDCp&hP",[caseless, + global])), +?line <<"j">> = iolist_to_binary(re:replace("ABBC","ab+?bc","j",[caseless])), +?line <<"j">> = iolist_to_binary(re:replace("ABBC","ab+?bc","j",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab+bc","vLfo&Q\\1&uXHE",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab+bc","vLfo&Q\\1&uXHE",[caseless, + global])), +?line <<"ABC">> = iolist_to_binary(re:replace("ABC","ab+bc","hPVKmARvLrX&l",[caseless])), +?line <<"ABC">> = iolist_to_binary(re:replace("ABC","ab+bc","hPVKmARvLrX&l",[caseless, + global])), +?line <<"ABQ">> = iolist_to_binary(re:replace("ABQ","ab+bc","&\\1OP&EAg",[caseless])), +?line <<"ABQ">> = iolist_to_binary(re:replace("ABQ","ab+bc","&\\1OP&EAg",[caseless, + global])), +?line <<"PElq">> = iolist_to_binary(re:replace("ABBBBC","ab+bc","PElq",[caseless])), +?line <<"PElq">> = iolist_to_binary(re:replace("ABBBBC","ab+bc","PElq",[caseless, + global])), +?line <<"aqDjyRpvS">> = iolist_to_binary(re:replace("ABBBBC","ab{1,}?bc","\\1a\\1\\1q\\1DjyRpvS\\1",[caseless])), +?line <<"aqDjyRpvS">> = iolist_to_binary(re:replace("ABBBBC","ab{1,}?bc","\\1a\\1\\1q\\1DjyRpvS\\1",[caseless, + global])), +?line <<"aTWqxABBBBCInABBBBCpRFpO">> = iolist_to_binary(re:replace("ABBBBC","ab{1,3}?bc","aTW\\1qx&In&\\1pRFpO",[caseless])), +?line <<"aTWqxABBBBCInABBBBCpRFpO">> = iolist_to_binary(re:replace("ABBBBC","ab{1,3}?bc","aTW\\1qx&In&\\1pRFpO",[caseless, + global])), +?line <<"ABBBBCTlrABBBBCJOlJvqwgABBBBCh">> = iolist_to_binary(re:replace("ABBBBC","ab{3,4}?bc","&T\\1lr&JOl\\1Jvqwg&h",[caseless])), +?line <<"ABBBBCTlrABBBBCJOlJvqwgABBBBCh">> = iolist_to_binary(re:replace("ABBBBC","ab{3,4}?bc","&T\\1lr&JOl\\1Jvqwg&h",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab{4,5}?bc","QBVMd\\1eBP&j\\1Y\\1\\1",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","ab{4,5}?bc","QBVMd\\1eBP&j\\1Y\\1\\1",[caseless, + global])), +?line <<"ABQ">> = iolist_to_binary(re:replace("ABQ","ab{4,5}?bc","pvlNJ\\1o\\1yAcNJhSec\\1",[caseless])), +?line <<"ABQ">> = iolist_to_binary(re:replace("ABQ","ab{4,5}?bc","pvlNJ\\1o\\1yAcNJhSec\\1",[caseless, + global])), +?line <<"ABBBBC">> = iolist_to_binary(re:replace("ABBBBC","ab{4,5}?bc","dGdgiMqW\\1X",[caseless])), +?line <<"ABBBBC">> = iolist_to_binary(re:replace("ABBBBC","ab{4,5}?bc","dGdgiMqW\\1X",[caseless, + global])), +?line <<"eqlxxIffIhfLhL">> = iolist_to_binary(re:replace("ABBC","ab??bc","eqlxxIffIhfLhL",[caseless])), +?line <<"eqlxxIffIhfLhL">> = iolist_to_binary(re:replace("ABBC","ab??bc","eqlxxIffIhfLhL",[caseless, + global])), +?line <<"bQqNAjyKOqhMXyoABC">> = iolist_to_binary(re:replace("ABC","ab??bc","b\\1QqNAjyKOqhMXyo&",[caseless])), +?line <<"bQqNAjyKOqhMXyoABC">> = iolist_to_binary(re:replace("ABC","ab??bc","b\\1QqNAjyKOqhMXyo&",[caseless, + global])), +?line <<"jJQGABCIRM">> = iolist_to_binary(re:replace("ABC","ab{0,1}?bc","jJQG&IR\\1M",[caseless])), +?line <<"jJQGABCIRM">> = iolist_to_binary(re:replace("ABC","ab{0,1}?bc","jJQG&IR\\1M",[caseless, + global])), +?line <<"gPABCCho">> = iolist_to_binary(re:replace("ABC","ab??c","gP&Cho",[caseless])), +?line <<"gPABCCho">> = iolist_to_binary(re:replace("ABC","ab??c","gP&Cho",[caseless, + global])), +?line <<"iNBxUabjwtTABCLABCvXhABC">> = iolist_to_binary(re:replace("ABC","ab{0,1}?c","iNBxUabjw\\1tT&L&vXh&",[caseless])), +?line <<"iNBxUabjwtTABCLABCvXhABC">> = iolist_to_binary(re:replace("ABC","ab{0,1}?c","iNBxUabjw\\1tT&L&vXh&",[caseless, + global])), +?line <<"iBkpxqXNa">> = iolist_to_binary(re:replace("ABC","^abc$","iBkpxqXNa",[caseless])), +?line <<"iBkpxqXNa">> = iolist_to_binary(re:replace("ABC","^abc$","iBkpxqXNa",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^abc$","OhTwUeW&yJtn",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^abc$","OhTwUeW&yJtn",[caseless, + global])), +?line <<"ABBBBC">> = iolist_to_binary(re:replace("ABBBBC","^abc$","LoawT&xKl\\1&",[caseless])), +?line <<"ABBBBC">> = iolist_to_binary(re:replace("ABBBBC","^abc$","LoawT&xKl\\1&",[caseless, + global])), +?line <<"ABCC">> = iolist_to_binary(re:replace("ABCC","^abc$","iVcopu",[caseless])), +?line <<"ABCC">> = iolist_to_binary(re:replace("ABCC","^abc$","iVcopu",[caseless, + global])), +?line <<"ABCtC">> = iolist_to_binary(re:replace("ABCC","^abc","&t",[caseless])), +?line <<"ABCtC">> = iolist_to_binary(re:replace("ABCC","^abc","&t",[caseless, + global])), +?line <<"AABCWBABCtLipJGm">> = iolist_to_binary(re:replace("AABC","abc$","&W\\1B&tLipJGm",[caseless])), +?line <<"AABCWBABCtLipJGm">> = iolist_to_binary(re:replace("AABC","abc$","&W\\1B&tLipJGm",[caseless, + global])), +?line <<"wDvJtREmkCGdgtGtgABC">> = iolist_to_binary(re:replace("ABC","^","wDvJt\\1REmk\\1CGdgtGtg",[caseless])), +?line <<"wDvJtREmkCGdgtGtgABC">> = iolist_to_binary(re:replace("ABC","^","wDvJt\\1REmk\\1CGdgtGtg",[caseless, + global])), +?line <<"ABCWiqpRnpqRRBAD">> = iolist_to_binary(re:replace("ABC","$","W\\1iqpRnpq\\1RRB&\\1AD",[caseless])), +?line <<"ABCWiqpRnpqRRBAD">> = iolist_to_binary(re:replace("ABC","$","W\\1iqpRnpq\\1RRB&\\1AD",[caseless, + global])), +?line <<"FOABCHABCuJ">> = iolist_to_binary(re:replace("ABC","a.c","FO&H&uJ",[caseless])), +?line <<"FOABCHABCuJ">> = iolist_to_binary(re:replace("ABC","a.c","FO&H&uJ",[caseless, + global])), +?line <<"mmAXCwHQUmyij">> = iolist_to_binary(re:replace("AXC","a.c","m\\1m&\\1wHQUmyi\\1j",[caseless])), +?line <<"mmAXCwHQUmyij">> = iolist_to_binary(re:replace("AXC","a.c","m\\1m&\\1wHQUmyi\\1j",[caseless, + global])), +?line <<"vKLhT">> = iolist_to_binary(re:replace("AXYZC","a.*?c","vKLhT",[caseless])), +?line <<"vKLhT">> = iolist_to_binary(re:replace("AXYZC","a.*?c","vKLhT",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a.*c","TrBPBlhlCyS&oLwXCYxT",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a.*c","TrBPBlhlCyS&oLwXCYxT",[caseless, + global])), +?line <<"oNBAABC">> = iolist_to_binary(re:replace("AABC","a.*c","oNB&",[caseless])), +?line <<"oNBAABC">> = iolist_to_binary(re:replace("AABC","a.*c","oNB&",[caseless, + global])), +?line <<"AXYZD">> = iolist_to_binary(re:replace("AXYZD","a.*c","v\\1byeTHd&vaDRL\\1",[caseless])), +?line <<"AXYZD">> = iolist_to_binary(re:replace("AXYZD","a.*c","v\\1byeTHd&vaDRL\\1",[caseless, + global])), +?line <<"puCobgfLFWkTABD">> = iolist_to_binary(re:replace("ABD","a[bc]d","puCobgf\\1LF\\1W\\1kT&",[caseless])), +?line <<"puCobgfLFWkTABD">> = iolist_to_binary(re:replace("ABD","a[bc]d","puCobgf\\1LF\\1W\\1kT&",[caseless, + global])), +?line <<"ACELM">> = iolist_to_binary(re:replace("ACE","a[b-d]e","&LM",[caseless])), +?line <<"ACELM">> = iolist_to_binary(re:replace("ACE","a[b-d]e","&LM",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[b-d]e","YsqxG&B&NxQkv\\1RY",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[b-d]e","YsqxG&B&NxQkv\\1RY",[caseless, + global])), +?line <<"ABC">> = iolist_to_binary(re:replace("ABC","a[b-d]e","o&WeiJHAt\\1vpj",[caseless])), +?line <<"ABC">> = iolist_to_binary(re:replace("ABC","a[b-d]e","o&WeiJHAt\\1vpj",[caseless, + global])), +?line <<"ABD">> = iolist_to_binary(re:replace("ABD","a[b-d]e","S",[caseless])), +?line <<"ABD">> = iolist_to_binary(re:replace("ABD","a[b-d]e","S",[caseless, + global])), +?line <<"AgdndBWDnHACACACVgB">> = iolist_to_binary(re:replace("AAC","a[b-d]","gdndBWDnH&&&VgB",[caseless])), +?line <<"AgdndBWDnHACACACVgB">> = iolist_to_binary(re:replace("AAC","a[b-d]","gdndBWDnH&&&VgB",[caseless, + global])), +?line <<"lpIqxA-sQA-">> = iolist_to_binary(re:replace("A-","a[-b]","lpIqx&sQ&",[caseless])), +?line <<"lpIqxA-sQA-">> = iolist_to_binary(re:replace("A-","a[-b]","lpIqx&sQ&",[caseless, + global])), +?line <<"NJrfcO">> = iolist_to_binary(re:replace("A-","a[b-]","NJrfc\\1O",[caseless])), +?line <<"NJrfcO">> = iolist_to_binary(re:replace("A-","a[b-]","NJrfc\\1O",[caseless, + global])), +?line <<"eA]OcbkaA]qQEbtfTQD">> = iolist_to_binary(re:replace("A]","a]","e&Oc\\1bka&qQEbtfTQD",[caseless])), +?line <<"eA]OcbkaA]qQEbtfTQD">> = iolist_to_binary(re:replace("A]","a]","e&Oc\\1bka&qQEbtfTQD",[caseless, + global])), +?line <<"GqJU">> = iolist_to_binary(re:replace("A]B","a[]]b","GqJU",[caseless])), +?line <<"GqJU">> = iolist_to_binary(re:replace("A]B","a[]]b","GqJU",[caseless, + global])), +?line <<"AEDdAEDiIAEDCTAEDj">> = iolist_to_binary(re:replace("AED","a[^bc]d","&d&iI&CT&j",[caseless])), +?line <<"AEDdAEDiIAEDCTAEDj">> = iolist_to_binary(re:replace("AED","a[^bc]d","&d&iI&CT&j",[caseless, + global])), +?line <<"MOKnvQDsS">> = iolist_to_binary(re:replace("ADC","a[^-b]c","MOKn\\1\\1vQDsS\\1",[caseless])), +?line <<"MOKnvQDsS">> = iolist_to_binary(re:replace("ADC","a[^-b]c","MOKn\\1\\1vQDsS\\1",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[^-b]c","dr",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a[^-b]c","dr",[caseless, + global])), +?line <<"ABD">> = iolist_to_binary(re:replace("ABD","a[^-b]c","IMKcT&fF&WXbjs\\1\\1",[caseless])), +?line <<"ABD">> = iolist_to_binary(re:replace("ABD","a[^-b]c","IMKcT&fF&WXbjs\\1\\1",[caseless, + global])), +?line <<"A-C">> = iolist_to_binary(re:replace("A-C","a[^-b]c","M&xDIfNL\\1W",[caseless])), +?line <<"A-C">> = iolist_to_binary(re:replace("A-C","a[^-b]c","M&xDIfNL\\1W",[caseless, + global])), +?line <<"wR">> = iolist_to_binary(re:replace("ADC","a[^]b]c","wR",[caseless])), +?line <<"wR">> = iolist_to_binary(re:replace("ADC","a[^]b]c","wR",[caseless, + global])), +?line <<"HKTAABllCQjRABEnXDqjC">> = iolist_to_binary(re:replace("ABC","ab|cd","HKTA&llCQjR&EnXDqj",[caseless])), +?line <<"HKTAABllCQjRABEnXDqjC">> = iolist_to_binary(re:replace("ABC","ab|cd","HKTA&llCQjR&EnXDqj",[caseless, + global])), +?line <<"ABCD">> = iolist_to_binary(re:replace("ABCD","ab|cd","&",[caseless])), +?line <<"ABCD">> = iolist_to_binary(re:replace("ABCD","ab|cd","&",[caseless, + global])), +?line <<"DmgTYsxtpkrXgnoJ">> = iolist_to_binary(re:replace("DEF","()ef","mgTYsxtpkrXgnoJ",[caseless])), +?line <<"DmgTYsxtpkrXgnoJ">> = iolist_to_binary(re:replace("DEF","()ef","mgTYsxtpkrXgnoJ",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","$b","KN\\1&V",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","$b","KN\\1&V",[caseless, + global])), +?line <<"A]C">> = iolist_to_binary(re:replace("A]C","$b","jtB&",[caseless])), +?line <<"A]C">> = iolist_to_binary(re:replace("A]C","$b","jtB&",[caseless, + global])), +?line <<"B">> = iolist_to_binary(re:replace("B","$b","&pRb",[caseless])), +?line <<"B">> = iolist_to_binary(re:replace("B","$b","&pRb",[caseless, + global])), +?line <<"lBUQxBtA(BtBeKAEeJq">> = iolist_to_binary(re:replace("A(B","a\\(b","lBUQ\\1xBt&tBeK\\1AEeJq",[caseless])), +?line <<"lBUQxBtA(BtBeKAEeJq">> = iolist_to_binary(re:replace("A(B","a\\(b","lBUQ\\1xBt&tBeK\\1AEeJq",[caseless, + global])), +?line <<"oXCRABKrhGnMTcHtq">> = iolist_to_binary(re:replace("AB","a\\(*b","oXCR&\\1KrhGnMTcHtq",[caseless])), +?line <<"oXCRABKrhGnMTcHtq">> = iolist_to_binary(re:replace("AB","a\\(*b","oXCR&\\1KrhGnMTcHtq",[caseless, + global])), +?line <<"VyDjHkfygiNMHC">> = iolist_to_binary(re:replace("A((B","a\\(*b","Vy\\1DjH\\1kfygi\\1NM\\1H\\1C",[caseless])), +?line <<"VyDjHkfygiNMHC">> = iolist_to_binary(re:replace("A((B","a\\(*b","Vy\\1DjH\\1kfygi\\1NM\\1H\\1C",[caseless, + global])), +?line <<"A">> = iolist_to_binary(re:replace("A","a\\\\b","DhmiARyCBuVi",[caseless, + notbol])), +?line <<"A">> = iolist_to_binary(re:replace("A","a\\\\b","DhmiARyCBuVi",[caseless, + notbol, + global])), +?line <<"FArKeEijRRtjoEBC">> = iolist_to_binary(re:replace("ABC","((a))","F\\1rKeEijRRtjoE",[caseless])), +?line <<"FArKeEijRRtjoEBC">> = iolist_to_binary(re:replace("ABC","((a))","F\\1rKeEijRRtjoE",[caseless, + global])), +?line <<"shGABCXUFAQfAABCy">> = iolist_to_binary(re:replace("ABC","(a)b(c)","shG&XUF\\1Qf\\1&y",[caseless])), +?line <<"shGABCXUFAQfAABCy">> = iolist_to_binary(re:replace("ABC","(a)b(c)","shG&XUF\\1Qf\\1&y",[caseless, + global])), +?line <<"AABBABCmqnIoEABCugfABCNVyK">> = iolist_to_binary(re:replace("AABBABC","a+b+c","&m\\1qnIoE&\\1ug\\1f&NVyK",[caseless])), +?line <<"AABBABCmqnIoEABCugfABCNVyK">> = iolist_to_binary(re:replace("AABBABC","a+b+c","&m\\1qnIoE&\\1ug\\1f&NVyK",[caseless, + global])), +?line <<"AABByABCrABC">> = iolist_to_binary(re:replace("AABBABC","a{1,}b{1,}c","y&r\\1&",[caseless])), +?line <<"AABByABCrABC">> = iolist_to_binary(re:replace("AABBABC","a{1,}b{1,}c","y&r\\1&",[caseless, + global])), +?line <<"tABC">> = iolist_to_binary(re:replace("ABCABC","a.+?c","t",[caseless])), +?line <<"tt">> = iolist_to_binary(re:replace("ABCABC","a.+?c","t",[caseless, + global])), +?line <<"UABC">> = iolist_to_binary(re:replace("ABCABC","a.*?c","\\1U",[caseless])), +?line <<"UU">> = iolist_to_binary(re:replace("ABCABC","a.*?c","\\1U",[caseless, + global])), +?line <<"EfjDOiBAosuABC">> = iolist_to_binary(re:replace("ABCABC","a.{0,5}?c","EfjDOiBAosu",[caseless])), +?line <<"EfjDOiBAosuEfjDOiBAosu">> = iolist_to_binary(re:replace("ABCABC","a.{0,5}?c","EfjDOiBAosu",[caseless, + global])), +?line <<"CBBliVcPcv">> = iolist_to_binary(re:replace("AB","(a+|b)*","C\\1\\1liVcPcv",[caseless])), +?line <<"CBBliVcPcvCliVcPcv">> = iolist_to_binary(re:replace("AB","(a+|b)*","C\\1\\1liVcPcv",[caseless, + global])), +?line <<"fSc">> = iolist_to_binary(re:replace("AB","(a+|b){0,}","fSc",[caseless])), +?line <<"fScfSc">> = iolist_to_binary(re:replace("AB","(a+|b){0,}","fSc",[caseless, + global])), +?line <<"sABpDnVVBAB">> = iolist_to_binary(re:replace("AB","(a+|b)+","s&pDnVV\\1&",[caseless])), +?line <<"sABpDnVVBAB">> = iolist_to_binary(re:replace("AB","(a+|b)+","s&pDnVV\\1&",[caseless, + global])), +?line <<"bnGKKf">> = iolist_to_binary(re:replace("AB","(a+|b){1,}","bnGKKf",[caseless])), +?line <<"bnGKKf">> = iolist_to_binary(re:replace("AB","(a+|b){1,}","bnGKKf",[caseless, + global])), +?line <<"LpFAjhAtClIGSIAdYAB">> = iolist_to_binary(re:replace("AB","(a+|b)?","LpF&jhAtClIGSI\\1dY\\1",[caseless])), +?line <<"LpFAjhAtClIGSIAdYALpFBjhAtClIGSIBdYBLpFjhAtClIGSIdY">> = iolist_to_binary(re:replace("AB","(a+|b)?","LpF&jhAtClIGSI\\1dY\\1",[caseless, + global])), +?line <<"qbB">> = iolist_to_binary(re:replace("AB","(a+|b){0,1}","qb",[caseless])), +?line <<"qbqbqb">> = iolist_to_binary(re:replace("AB","(a+|b){0,1}","qb",[caseless, + global])), +?line <<"vLbrTRIJAB">> = iolist_to_binary(re:replace("AB","(a+|b){0,1}?","v&L\\1brTRIJ\\1\\1",[caseless])), +?line <<"vLbrTRIJvALAbrTRIJAAvLbrTRIJvBLBbrTRIJBBvLbrTRIJ">> = iolist_to_binary(re:replace("AB","(a+|b){0,1}?","v&L\\1brTRIJ\\1\\1",[caseless, + global])), +?line <<"HtbhHKCDEwOT">> = iolist_to_binary(re:replace("CDE","[^ab]*","Ht\\1\\1bhHK&wOT",[caseless])), +?line <<"HtbhHKCDEwOTHtbhHKwOT">> = iolist_to_binary(re:replace("CDE","[^ab]*","Ht\\1\\1bhHK&wOT",[caseless, + global])), +?line <<"vOowROtABBBCD">> = iolist_to_binary(re:replace("ABBBCD","([abc])*d","vOowROt&",[caseless])), +?line <<"vOowROtABBBCD">> = iolist_to_binary(re:replace("ABBBCD","([abc])*d","vOowROt&",[caseless, + global])), +?line <<"TBIuDTLoAqOaABCDMcvVABCDPm">> = iolist_to_binary(re:replace("ABCD","([abc])*bcd","TBIuDTLo\\1qOa&McvV&Pm",[caseless])), +?line <<"TBIuDTLoAqOaABCDMcvVABCDPm">> = iolist_to_binary(re:replace("ABCD","([abc])*bcd","TBIuDTLo\\1qOa&McvV&Pm",[caseless, + global])), +?line <<"EUpqELAv">> = iolist_to_binary(re:replace("E","a|b|c|d|e","&Upq&LAv",[caseless])), +?line <<"EUpqELAv">> = iolist_to_binary(re:replace("E","a|b|c|d|e","&Upq&LAv",[caseless, + global])), +?line <<"oViRJMyEkEPtcEFEM">> = iolist_to_binary(re:replace("EF","(a|b|c|d|e)f","oViRJMy\\1k\\1Ptc&\\1M",[caseless])), +?line <<"oViRJMyEkEPtcEFEM">> = iolist_to_binary(re:replace("EF","(a|b|c|d|e)f","oViRJMy\\1k\\1Ptc&\\1M",[caseless, + global])), +?line <<"ABCDEFGeumABCDEFGxRcjHuSABCDEFGOABCDEFG">> = iolist_to_binary(re:replace("ABCDEFG","abcd*efg","&eum&xRcjHuS&O&",[caseless])), +?line <<"ABCDEFGeumABCDEFGxRcjHuSABCDEFGOABCDEFG">> = iolist_to_binary(re:replace("ABCDEFG","abcd*efg","&eum&xRcjHuS&O&",[caseless, + global])), +?line <<"XOvpxKbYuFMwABVhYABBBZ">> = iolist_to_binary(re:replace("XABYABBBZ","ab*","OvpxKbYuFMw&Vh",[caseless])), +?line <<"XOvpxKbYuFMwABVhYOvpxKbYuFMwABBBVhZ">> = iolist_to_binary(re:replace("XABYABBBZ","ab*","OvpxKbYuFMw&Vh",[caseless, + global])), +?line <<"XXbAAHhcmmXVwkYABBBZ">> = iolist_to_binary(re:replace("XAYABBBZ","ab*","Xb&&Hhcmm\\1XVwk",[caseless])), +?line <<"XXbAAHhcmmXVwkYXbABBBABBBHhcmmXVwkZ">> = iolist_to_binary(re:replace("XAYABBBZ","ab*","Xb&&Hhcmm\\1XVwk",[caseless, + global])), +?line <<"ABPWMPmhUsCDEo">> = iolist_to_binary(re:replace("ABCDE","(ab|cd)e","PWMPmhUs&o",[caseless])), +?line <<"ABPWMPmhUsCDEo">> = iolist_to_binary(re:replace("ABCDE","(ab|cd)e","PWMPmhUs&o",[caseless, + global])), +?line <<"jHIJ">> = iolist_to_binary(re:replace("HIJ","[abhgefdc]ij","j&",[caseless])), +?line <<"jHIJ">> = iolist_to_binary(re:replace("HIJ","[abhgefdc]ij","j&",[caseless, + global])), +?line <<"ABCDE">> = iolist_to_binary(re:replace("ABCDE","^(ab|cd)e","Dc&hlOsc\\1EL\\1Vl",[caseless])), +?line <<"ABCDE">> = iolist_to_binary(re:replace("ABCDE","^(ab|cd)e","Dc&hlOsc\\1EL\\1Vl",[caseless, + global])), +?line <<"ABCDBRPmLBtJGwEFEF">> = iolist_to_binary(re:replace("ABCDEF","(abc|)ef","\\1BRPmLBtJGw\\1&&",[caseless])), +?line <<"ABCDBRPmLBtJGwEFEF">> = iolist_to_binary(re:replace("ABCDEF","(abc|)ef","\\1BRPmLBtJGw\\1&&",[caseless, + global])), +?line <<"ABdnvuIvc">> = iolist_to_binary(re:replace("ABCD","(a|b)c*d","\\1dnvuIvc",[caseless])), +?line <<"ABdnvuIvc">> = iolist_to_binary(re:replace("ABCD","(a|b)c*d","\\1dnvuIvc",[caseless, + global])), +?line <<"ACKWkV">> = iolist_to_binary(re:replace("ABC","(ab|ab*)bc","ACKWkV",[caseless])), +?line <<"ACKWkV">> = iolist_to_binary(re:replace("ABC","(ab|ab*)bc","ACKWkV",[caseless, + global])), +?line <<"LepuBCXf">> = iolist_to_binary(re:replace("ABC","a([bc]*)c*","Lepu\\1Xf",[caseless])), +?line <<"LepuBCXf">> = iolist_to_binary(re:replace("ABC","a([bc]*)c*","Lepu\\1Xf",[caseless, + global])), +?line <<"NDABCDxHBMEtfBGtV">> = iolist_to_binary(re:replace("ABCD","a([bc]*)(c*d)","ND&xHBMEtfBGtV",[caseless])), +?line <<"NDABCDxHBMEtfBGtV">> = iolist_to_binary(re:replace("ABCD","a([bc]*)(c*d)","ND&xHBMEtfBGtV",[caseless, + global])), +?line <<"eIDCKdi">> = iolist_to_binary(re:replace("ABCD","a([bc]+)(c*d)","eIDCKdi",[caseless])), +?line <<"eIDCKdi">> = iolist_to_binary(re:replace("ABCD","a([bc]+)(c*d)","eIDCKdi",[caseless, + global])), +?line <<"fKBQepABCDABCDhHYaRKHjS">> = iolist_to_binary(re:replace("ABCD","a([bc]*)(c+d)","fK\\1Qep&&hHYaRKHjS",[caseless])), +?line <<"fKBQepABCDABCDhHYaRKHjS">> = iolist_to_binary(re:replace("ABCD","a([bc]*)(c+d)","fK\\1Qep&&hHYaRKHjS",[caseless, + global])), +?line <<"yYx">> = iolist_to_binary(re:replace("ADCDCDE","a[bcd]*dcdcde","yYx",[caseless])), +?line <<"yYx">> = iolist_to_binary(re:replace("ADCDCDE","a[bcd]*dcdcde","yYx",[caseless, + global])), +?line <<"gCGlfM">> = iolist_to_binary(re:replace("ABC","(ab|a)b*c","gCGlfM",[caseless])), +?line <<"gCGlfM">> = iolist_to_binary(re:replace("ABC","(ab|a)b*c","gCGlfM",[caseless, + global])), +?line <<"GJGaABCEwhSGeABC">> = iolist_to_binary(re:replace("ABCD","((a)(b)c)(d)","GJGa\\1EwhSGe\\1",[caseless])), +?line <<"GJGaABCEwhSGeABC">> = iolist_to_binary(re:replace("ABCD","((a)(b)c)(d)","GJGa\\1EwhSGe\\1",[caseless, + global])), +?line <<"GwdBxNJCuOfALPHADSnt">> = iolist_to_binary(re:replace("ALPHA","[a-zA-Z_][a-zA-Z0-9_]*","GwdBxNJCuOf&DSnt",[caseless])), +?line <<"GwdBxNJCuOfALPHADSnt">> = iolist_to_binary(re:replace("ALPHA","[a-zA-Z_][a-zA-Z0-9_]*","GwdBxNJCuOf&DSnt",[caseless, + global])), +?line <<"AMcmNBHqwYsXdABHJTBH">> = iolist_to_binary(re:replace("ABH","^a(bc+|b[eh])g|.h$","McmN&qwYsX\\1dA&JT&",[caseless])), +?line <<"AMcmNBHqwYsXdABHJTBH">> = iolist_to_binary(re:replace("ABH","^a(bc+|b[eh])g|.h$","McmN&qwYsX\\1dA&JT&",[caseless, + global])), +?line <<"JEFFGZWDujiGKchTEFFGZd">> = iolist_to_binary(re:replace("EFFGZ","(bc+d$|ef*g.|h?i(j|k))","J&WDujiGKchT&d",[caseless])), +?line <<"JEFFGZWDujiGKchTEFFGZd">> = iolist_to_binary(re:replace("EFFGZ","(bc+d$|ef*g.|h?i(j|k))","J&WDujiGKchT&d",[caseless, + global])), +?line <<"JIJIJVbIJOWIJT">> = iolist_to_binary(re:replace("IJ","(bc+d$|ef*g.|h?i(j|k))","J\\1\\1Vb\\1OW\\1T",[caseless])), +?line <<"JIJIJVbIJOWIJT">> = iolist_to_binary(re:replace("IJ","(bc+d$|ef*g.|h?i(j|k))","J\\1\\1Vb\\1OW\\1T",[caseless, + global])), +?line <<"REnKX">> = iolist_to_binary(re:replace("REFFGZ","(bc+d$|ef*g.|h?i(j|k))","EnKX",[caseless])), +?line <<"REnKX">> = iolist_to_binary(re:replace("REFFGZ","(bc+d$|ef*g.|h?i(j|k))","EnKX",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(bc+d$|ef*g.|h?i(j|k))","&bQK&gYPqvKo\\1Dxq&&&",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(bc+d$|ef*g.|h?i(j|k))","&bQK&gYPqvKo\\1Dxq&&&",[caseless, + global])), +?line <<"ADCDCDE">> = iolist_to_binary(re:replace("ADCDCDE","(bc+d$|ef*g.|h?i(j|k))","\\1D&uYGYYB\\1mXY",[caseless])), +?line <<"ADCDCDE">> = iolist_to_binary(re:replace("ADCDCDE","(bc+d$|ef*g.|h?i(j|k))","\\1D&uYGYYB\\1mXY",[caseless, + global])), +?line <<"EFFG">> = iolist_to_binary(re:replace("EFFG","(bc+d$|ef*g.|h?i(j|k))","bqLaCGT&\\1\\1StNeJTj",[caseless])), +?line <<"EFFG">> = iolist_to_binary(re:replace("EFFG","(bc+d$|ef*g.|h?i(j|k))","bqLaCGT&\\1\\1StNeJTj",[caseless, + global])), +?line <<"BCDD">> = iolist_to_binary(re:replace("BCDD","(bc+d$|ef*g.|h?i(j|k))","M\\1v\\1T\\1H&OCM\\1",[caseless])), +?line <<"BCDD">> = iolist_to_binary(re:replace("BCDD","(bc+d$|ef*g.|h?i(j|k))","M\\1v\\1T\\1H&OCM\\1",[caseless, + global])), +?line <<"teSxBAbRcV">> = iolist_to_binary(re:replace("A","((((((((((a))))))))))","teSxB\\1bRcV",[caseless])), +?line <<"teSxBAbRcV">> = iolist_to_binary(re:replace("A","((((((((((a))))))))))","teSxB\\1bRcV",[caseless, + global])), +?line <<"AAAAA">> = iolist_to_binary(re:replace("AA","((((((((((a))))))))))\\10","&&\\1",[caseless])), +?line <<"AAAAA">> = iolist_to_binary(re:replace("AA","((((((((((a))))))))))\\10","&&\\1",[caseless, + global])), +?line <<"AAPBpi">> = iolist_to_binary(re:replace("A","(((((((((a)))))))))","&\\1PBpi",[caseless])), +?line <<"AAPBpi">> = iolist_to_binary(re:replace("A","(((((((((a)))))))))","&\\1PBpi",[caseless, + global])), +?line <<"htagTvaaMIaAkgtdgA">> = iolist_to_binary(re:replace("A","(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))","htagTvaaMIaAkgtdg&",[caseless])), +?line <<"htagTvaaMIaAkgtdgA">> = iolist_to_binary(re:replace("A","(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))","htagTvaaMIaAkgtdg&",[caseless, + global])), +?line <<"iVCeGCCLesCClCCD">> = iolist_to_binary(re:replace("C","(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))","iV&eG\\1CLesC&l&\\1D",[caseless])), +?line <<"iVCeGCCLesCClCCD">> = iolist_to_binary(re:replace("C","(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))","iV&eG\\1CLesC&l&\\1D",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","multiple words of text","hKB&NgvvVpXbuP",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","multiple words of text","hKB&NgvvVpXbuP",[caseless, + global])), +?line <<"AA">> = iolist_to_binary(re:replace("AA","multiple words of text","V&\\1e&n\\1",[caseless])), +?line <<"AA">> = iolist_to_binary(re:replace("AA","multiple words of text","V&\\1e&n\\1",[caseless, + global])), +?line <<"UH-UH">> = iolist_to_binary(re:replace("UH-UH","multiple words of text","w\\1JcoWUQlAryay\\1",[caseless])), +?line <<"UH-UH">> = iolist_to_binary(re:replace("UH-UH","multiple words of text","w\\1JcoWUQlAryay\\1",[caseless, + global])), +?line <<"Ee, YEAH">> = iolist_to_binary(re:replace("MULTIPLE WORDS, YEAH","multiple words","Ee",[caseless])), +?line <<"Ee, YEAH">> = iolist_to_binary(re:replace("MULTIPLE WORDS, YEAH","multiple words","Ee",[caseless, + global])), +?line <<"uTrQvyABCDEABCDEACeABCDE">> = iolist_to_binary(re:replace("ABCDE","(.*)c(.*)","uTrQvy&&ACe&",[caseless])), +?line <<"uTrQvyABCDEABCDEACeABCDE">> = iolist_to_binary(re:replace("ABCDE","(.*)c(.*)","uTrQvy&&ACe&",[caseless, + global])), +?line <<"ba(A, B)owqjAHEJ(A, B)qP">> = iolist_to_binary(re:replace("(A, B)","\\((.*), (.*)\\)","ba&owqj\\1HEJ&qP",[caseless])), +?line <<"ba(A, B)owqjAHEJ(A, B)qP">> = iolist_to_binary(re:replace("(A, B)","\\((.*), (.*)\\)","ba&owqj\\1HEJ&qP",[caseless, + global])), +?line <<"ABCDRIpLJwyEwDArCpanW">> = iolist_to_binary(re:replace("ABCD","abcd","&RIpLJwyEwDA\\1rCpan\\1W",[caseless])), +?line <<"ABCDRIpLJwyEwDArCpanW">> = iolist_to_binary(re:replace("ABCD","abcd","&RIpLJwyEwDA\\1rCpan\\1W",[caseless, + global])), +?line <<"xykYBC">> = iolist_to_binary(re:replace("ABCD","a(bc)d","xykY\\1",[caseless])), +?line <<"xykYBC">> = iolist_to_binary(re:replace("ABCD","a(bc)d","xykY\\1",[caseless, + global])), +?line <<"UMfPSTJEqdeS">> = iolist_to_binary(re:replace("AC","a[-]?c","U\\1M\\1\\1fPSTJEqdeS",[caseless])), +?line <<"UMfPSTJEqdeS">> = iolist_to_binary(re:replace("AC","a[-]?c","U\\1M\\1\\1fPSTJEqdeS",[caseless, + global])), +?line <<"ITABCABCABCnxfDlABCpYAXQvxABCABCE">> = iolist_to_binary(re:replace("ABCABC","(abc)\\1","IT\\1&nxfDl\\1pYAXQvx\\1\\1E",[caseless])), +?line <<"ITABCABCABCnxfDlABCpYAXQvxABCABCE">> = iolist_to_binary(re:replace("ABCABC","(abc)\\1","IT\\1&nxfDl\\1pYAXQvx\\1\\1E",[caseless, + global])), +?line <<"JXRRQqcKbpvOgISABCT">> = iolist_to_binary(re:replace("ABCABC","([a-c]*)\\1","JXRRQqcKbpvOgIS\\1T",[caseless])), +?line <<"JXRRQqcKbpvOgISABCTJXRRQqcKbpvOgIST">> = iolist_to_binary(re:replace("ABCABC","([a-c]*)\\1","JXRRQqcKbpvOgIS\\1T",[caseless, + global])), +?line <<"abxuiiVt">> = iolist_to_binary(re:replace("abad","a(?!b).","xuiiVt",[])), +?line <<"abxuiiVt">> = iolist_to_binary(re:replace("abad","a(?!b).","xuiiVt",[global])), +?line <<"abMdtNqPOC">> = iolist_to_binary(re:replace("abad","a(?=d).","MdtNqPOC",[])), +?line <<"abMdtNqPOC">> = iolist_to_binary(re:replace("abad","a(?=d).","MdtNqPOC",[global])), +?line <<"abmkrHu">> = iolist_to_binary(re:replace("abad","a(?=c|d).","mkrHu",[])), +?line <<"abmkrHu">> = iolist_to_binary(re:replace("abad","a(?=c|d).","mkrHu",[global])), +?line <<"JfimtGueeaceUlTKvht">> = iolist_to_binary(re:replace("ace","a(?:b|c|d)(.)","JfimtGu\\1\\1&UlTKvht",[])), +?line <<"JfimtGueeaceUlTKvht">> = iolist_to_binary(re:replace("ace","a(?:b|c|d)(.)","JfimtGu\\1\\1&UlTKvht",[global])), +?line <<"IdKeqIicacekGQCace">> = iolist_to_binary(re:replace("ace","a(?:b|c|d)*(.)","IdK\\1qIic&kGQC&",[])), +?line <<"IdKeqIicacekGQCace">> = iolist_to_binary(re:replace("ace","a(?:b|c|d)*(.)","IdK\\1qIic&kGQC&",[global])), +?line <<"ovgdwiKdYGGace">> = iolist_to_binary(re:replace("ace","a(?:b|c|d)+?(.)","ovgdwiKdYGG&",[])), +?line <<"ovgdwiKdYGGace">> = iolist_to_binary(re:replace("ace","a(?:b|c|d)+?(.)","ovgdwiKdYGG&",[global])), +?line <<"uJgdlOhWXUJpEBdwSbcdbe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d)+?(.)","uJg\\1lOhWXUJpEB\\1wS",[])), +?line <<"uJgdlOhWXUJpEBdwSbcdbe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d)+?(.)","uJg\\1lOhWXUJpEB\\1wS",[global])), +?line <<"UMpmieMJkQH">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d)+(.)","UMpmi\\1MJkQH",[])), +?line <<"UMpmieMJkQH">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d)+(.)","UMpmi\\1MJkQH",[global])), +?line <<"pCjGheRqYfSacdbhlDAvcdbe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){2}(.)","pCjGheRqYfS&hlDAv",[])), +?line <<"pCjGheRqYfSacdbhlDAvcdbe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){2}(.)","pCjGheRqYfS&hlDAv",[global])), +?line <<"yxwYmacdbcdbbAbacdbcdbbGABe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){4,5}(.)","yxwYm&\\1A\\1&bGAB",[])), +?line <<"yxwYmacdbcdbbAbacdbcdbbGABe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){4,5}(.)","yxwYm&\\1A\\1&bGAB",[global])), +?line <<"dkoReacdbcdhXacdbcdacdbcdcakNJbe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){4,5}?(.)","\\1koRe&hX&&cakNJ",[])), +?line <<"dkoReacdbcdhXacdbcdacdbcdcakNJbe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){4,5}?(.)","\\1koRe&hX&&cakNJ",[global])), +?line <<"nVjVDfoobarOjfoobarfoobareL">> = iolist_to_binary(re:replace("foobar","((foo)|(bar))*","nVjVD&Oj&&eL",[])), +?line <<"nVjVDfoobarOjfoobarfoobareLnVjVDOjeL">> = iolist_to_binary(re:replace("foobar","((foo)|(bar))*","nVjVD&Oj&&eL",[global])), +?line <<"bJacdbcdbeMVacdbcdbeFAiPYieyEAI">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){6,7}(.)","bJ&MV&FAiPYi\\1yEAI",[])), +?line <<"bJacdbcdbeMVacdbcdbeFAiPYieyEAI">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){6,7}(.)","bJ&MV&FAiPYi\\1yEAI",[global])), +?line <<"cW">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){6,7}?(.)","cW",[])), +?line <<"cW">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){6,7}?(.)","cW",[global])), +?line <<"EnymbYybacdbcdbeQeCacdbcdbeacdbcdbe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){5,6}(.)","EnymbYyb&Q\\1C&&",[])), +?line <<"EnymbYybacdbcdbeQeCacdbcdbeacdbcdbe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){5,6}(.)","EnymbYyb&Q\\1C&&",[global])), +?line <<"XCacdbcdbVjuGQacdbcdbBqmsUJe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){5,6}?(.)","XC&VjuGQ&BqmsUJ",[])), +?line <<"XCacdbcdbVjuGQacdbcdbBqmsUJe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){5,6}?(.)","XC&VjuGQ&BqmsUJ",[global])), +?line <<"OacdbcdbeCSMacdbcdbensheuoDP">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){5,7}(.)","O&CSM&nsh\\1uoDP",[])), +?line <<"OacdbcdbeCSMacdbcdbensheuoDP">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){5,7}(.)","O&CSM&nsh\\1uoDP",[global])), +?line <<"YReNTbe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){5,7}?(.)","YReNT\\1",[])), +?line <<"YReNTbe">> = iolist_to_binary(re:replace("acdbcdbe","a(?:b|c|d){5,7}?(.)","YReNT\\1",[global])), +?line <<"IJoaceaceHEIicnaaceaceacecq">> = iolist_to_binary(re:replace("ace","a(?:b|(c|e){1,2}?|d)+?(.)","IJo&&HEIi\\1na&&&\\1q",[])), +?line <<"IJoaceaceHEIicnaaceaceacecq">> = iolist_to_binary(re:replace("ace","a(?:b|(c|e){1,2}?|d)+?(.)","IJo&&HEIi\\1na&&&\\1q",[global])), +?line <<"PqnTibAldgKNACABm">> = iolist_to_binary(re:replace("AB","^(.+)?B","PqnTib\\1ldgKN\\1C&m",[])), +?line <<"PqnTibAldgKNACABm">> = iolist_to_binary(re:replace("AB","^(.+)?B","PqnTib\\1ldgKN\\1C&m",[global])), +?line <<"n.toDyHxNwuj.d.n..l">> = iolist_to_binary(re:replace(".","^([^a-z])|(\\^)$","n\\1toDyHxNwuj\\1d&n\\1\\1l",[])), +?line <<"n.toDyHxNwuj.d.n..l">> = iolist_to_binary(re:replace(".","^([^a-z])|(\\^)$","n\\1toDyHxNwuj\\1d&n\\1\\1l",[global])), +?line <<"GOUT">> = iolist_to_binary(re:replace("<&OUT","^[<>]&","G",[])), +?line <<"GOUT">> = iolist_to_binary(re:replace("<&OUT","^[<>]&","G",[global])), +?line <<"eQPwy">> = iolist_to_binary(re:replace("aaaaaaaaaa","^(a\\1?){4}$","eQPwy",[])), +?line <<"eQPwy">> = iolist_to_binary(re:replace("aaaaaaaaaa","^(a\\1?){4}$","eQPwy",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a\\1?){4}$","fpysabFs",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a\\1?){4}$","fpysabFs",[global])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","^(a\\1?){4}$","iySaXMmSpF\\1wGu&i&",[])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","^(a\\1?){4}$","iySaXMmSpF\\1wGu&i&",[global])), +?line <<"aaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaa","^(a\\1?){4}$","&E&t",[])), +?line <<"aaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaa","^(a\\1?){4}$","&E&t",[global])), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaa","^(a\\1?){4}$","rv\\1nEUYoTcup\\1",[])), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaa","^(a\\1?){4}$","rv\\1nEUYoTcup\\1",[global])), +?line <<"Grouf">> = iolist_to_binary(re:replace("aaaaaaaaaa","^(a(?(1)\\1)){4}$","Grouf",[])), +?line <<"Grouf">> = iolist_to_binary(re:replace("aaaaaaaaaa","^(a(?(1)\\1)){4}$","Grouf",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a(?(1)\\1)){4}$","xJ\\1D",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(a(?(1)\\1)){4}$","xJ\\1D",[global])), +?line <<"aaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaa","^(a(?(1)\\1)){4}$","w&PQ&n&C",[])), +?line <<"aaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaa","^(a(?(1)\\1)){4}$","w&PQ&n&C",[global])), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaa","^(a(?(1)\\1)){4}$","fXiC",[])), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaa","^(a(?(1)\\1)){4}$","fXiC",[global])), +?line <<"fEfoobarodvfoobarmohu">> = iolist_to_binary(re:replace("foobar","(?:(f)(o)(o)|(b)(a)(r))*","\\1E&odv&mohu",[])), +?line <<"fEfoobarodvfoobarmohuEodvmohu">> = iolist_to_binary(re:replace("foobar","(?:(f)(o)(o)|(b)(a)(r))*","\\1E&odv&mohu",[global])), +?line <<"aaHgXnnrbsEWfBvCB">> = iolist_to_binary(re:replace("ab","(?<=a)b","aHgXnnr&sEWfBv\\1CB",[])), +?line <<"aaHgXnnrbsEWfBvCB">> = iolist_to_binary(re:replace("ab","(?<=a)b","aHgXnnr&sEWfBv\\1CB",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=a)b","&\\1J\\1qs\\1\\1",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=a)b","&\\1J\\1qs\\1\\1",[global])), +?line <<"cb">> = iolist_to_binary(re:replace("cb","(?<=a)b","PBhSDEP\\1&fa&&FAQ",[])), +?line <<"cb">> = iolist_to_binary(re:replace("cb","(?<=a)b","PBhSDEP\\1&fa&&FAQ",[global])), +?line <<"b">> = iolist_to_binary(re:replace("b","(?<=a)b","VGBLJTb\\1",[])), +?line <<"b">> = iolist_to_binary(re:replace("b","(?<=a)b","VGBLJTb\\1",[global])), +?line <<"aAjOnQvFo">> = iolist_to_binary(re:replace("ab","(?> = iolist_to_binary(re:replace("ab","(?> = iolist_to_binary(re:replace("b","(?> = iolist_to_binary(re:replace("b","(?> = iolist_to_binary(re:replace("b","(?> = iolist_to_binary(re:replace("b","(?> = iolist_to_binary(re:replace("aba","(?:..)*a","Yn&nkVVRQtUI",[])), +?line <<"YnabankVVRQtUI">> = iolist_to_binary(re:replace("aba","(?:..)*a","Yn&nkVVRQtUI",[global])), +?line <<"dtatllgba">> = iolist_to_binary(re:replace("aba","(?:..)*?a","dt&tllg",[])), +?line <<"dtatllgbdtatllg">> = iolist_to_binary(re:replace("aba","(?:..)*?a","dt&tllg",[global])), +?line <<"abKyOHc">> = iolist_to_binary(re:replace("abc","^(?:b|a(?=(.)))*\\1","&KyOH",[])), +?line <<"abKyOHc">> = iolist_to_binary(re:replace("abc","^(?:b|a(?=(.)))*\\1","&KyOH",[global])), +?line <<"olabc">> = iolist_to_binary(re:replace("abc","^(){3,5}","ol",[])), +?line <<"olabc">> = iolist_to_binary(re:replace("abc","^(){3,5}","ol",[global])), +?line <<"tQmIRuA">> = iolist_to_binary(re:replace("aax","^(a+)*ax","tQmIRuA",[])), +?line <<"tQmIRuA">> = iolist_to_binary(re:replace("aax","^(a+)*ax","tQmIRuA",[global])), +?line <<"RaaxLDgyKaII">> = iolist_to_binary(re:replace("aax","^((a|b)+)*ax","R&LDgyK\\1II",[])), +?line <<"RaaxLDgyKaII">> = iolist_to_binary(re:replace("aax","^((a|b)+)*ax","R&LDgyK\\1II",[global])), +?line <<"jxJdaCNaaxAUxaofKF">> = iolist_to_binary(re:replace("aax","^((a|bc)+)*ax","jxJd\\1CN&AUx\\1ofKF",[])), +?line <<"jxJdaCNaaxAUxaofKF">> = iolist_to_binary(re:replace("aax","^((a|bc)+)*ax","jxJd\\1CN&AUx\\1ofKF",[global])), +?line <<"cxMJiMAGvYS">> = iolist_to_binary(re:replace("cab","(a|x)*ab","xMJiMA\\1G\\1vYS",[])), +?line <<"cxMJiMAGvYS">> = iolist_to_binary(re:replace("cab","(a|x)*ab","xMJiMA\\1G\\1vYS",[global])), +?line <<"cwXU">> = iolist_to_binary(re:replace("cab","(a)*ab","wXU\\1",[])), +?line <<"cwXU">> = iolist_to_binary(re:replace("cab","(a)*ab","wXU\\1",[global])), +?line <<"y">> = iolist_to_binary(re:replace("ab","(?:(?i)a)b","y",[])), +?line <<"y">> = iolist_to_binary(re:replace("ab","(?:(?i)a)b","y",[global])), +?line <<"xNpTab">> = iolist_to_binary(re:replace("ab","((?i)a)b","xNpT&",[])), +?line <<"xNpTab">> = iolist_to_binary(re:replace("ab","((?i)a)b","xNpT&",[global])), +?line <<"UUhQk">> = iolist_to_binary(re:replace("Ab","(?:(?i)a)b","UU\\1\\1h\\1Qk",[])), +?line <<"UUhQk">> = iolist_to_binary(re:replace("Ab","(?:(?i)a)b","UU\\1\\1h\\1Qk",[global])), +?line <<"To">> = iolist_to_binary(re:replace("Ab","((?i)a)b","To",[])), +?line <<"To">> = iolist_to_binary(re:replace("Ab","((?i)a)b","To",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?:(?i)a)b","Iog\\1kPwXTNA\\1u",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?:(?i)a)b","Iog\\1kPwXTNA\\1u",[global])), +?line <<"cb">> = iolist_to_binary(re:replace("cb","(?:(?i)a)b","\\1eeor\\1PcpHdMT&rFUGQX",[])), +?line <<"cb">> = iolist_to_binary(re:replace("cb","(?:(?i)a)b","\\1eeor\\1PcpHdMT&rFUGQX",[global])), +?line <<"aB">> = iolist_to_binary(re:replace("aB","(?:(?i)a)b","f&&\\1Fnb&nOyDHT&Trng",[])), +?line <<"aB">> = iolist_to_binary(re:replace("aB","(?:(?i)a)b","f&&\\1Fnb&nOyDHT&Trng",[global])), +?line <<"SCyJabaabEDejJdabuabG">> = iolist_to_binary(re:replace("ab","(?i:a)b","SCyJ\\1&a&EDejJd&\\1u\\1&G",[])), +?line <<"SCyJabaabEDejJdabuabG">> = iolist_to_binary(re:replace("ab","(?i:a)b","SCyJ\\1&a&EDejJd&\\1u\\1&G",[global])), +?line <<"nabMYvlVqabaabvabp">> = iolist_to_binary(re:replace("ab","((?i:a))b","n&MYvlVq&\\1&v&p",[])), +?line <<"nabMYvlVqabaabvabp">> = iolist_to_binary(re:replace("ab","((?i:a))b","n&MYvlVq&\\1&v&p",[global])), +?line <<"hQhGlGrAbAbxEKrc">> = iolist_to_binary(re:replace("Ab","(?i:a)b","hQhGlGr&&xEKrc\\1",[])), +?line <<"hQhGlGrAbAbxEKrc">> = iolist_to_binary(re:replace("Ab","(?i:a)b","hQhGlGr&&xEKrc\\1",[global])), +?line <<"fSgsAnoYq">> = iolist_to_binary(re:replace("Ab","((?i:a))b","fSgs\\1noYq",[])), +?line <<"fSgsAnoYq">> = iolist_to_binary(re:replace("Ab","((?i:a))b","fSgs\\1noYq",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?i:a)b","Lsa",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?i:a)b","Lsa",[global])), +?line <<"aB">> = iolist_to_binary(re:replace("aB","(?i:a)b","&MKfO&mRWgP&yU",[])), +?line <<"aB">> = iolist_to_binary(re:replace("aB","(?i:a)b","&MKfO&mRWgP&yU",[global])), +?line <<"aB">> = iolist_to_binary(re:replace("aB","(?i:a)b","S",[])), +?line <<"aB">> = iolist_to_binary(re:replace("aB","(?i:a)b","S",[global])), +?line <<"QTabISRDlbwogmSuiJ">> = iolist_to_binary(re:replace("ab","(?:(?-i)a)b","QT&ISRDlbwogmSuiJ",[caseless])), +?line <<"QTabISRDlbwogmSuiJ">> = iolist_to_binary(re:replace("ab","(?:(?-i)a)b","QT&ISRDlbwogmSuiJ",[caseless, + global])), +?line <<"VabWOeTSwSGwOkyIabf">> = iolist_to_binary(re:replace("ab","((?-i)a)b","V&WOeTSwSGwOkyI&f",[caseless])), +?line <<"VabWOeTSwSGwOkyIabf">> = iolist_to_binary(re:replace("ab","((?-i)a)b","V&WOeTSwSGwOkyI&f",[caseless, + global])), +?line <<"pNtk">> = iolist_to_binary(re:replace("aB","(?:(?-i)a)b","\\1pNtk",[caseless])), +?line <<"pNtk">> = iolist_to_binary(re:replace("aB","(?:(?-i)a)b","\\1pNtk",[caseless, + global])), +?line <<"MpdRBTE">> = iolist_to_binary(re:replace("aB","((?-i)a)b","MpdRBTE",[caseless])), +?line <<"MpdRBTE">> = iolist_to_binary(re:replace("aB","((?-i)a)b","MpdRBTE",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?:(?-i)a)b","RiV",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?:(?-i)a)b","RiV",[caseless, + global])), +?line <<"tjEITLaBaBtD">> = iolist_to_binary(re:replace("aB","(?:(?-i)a)b","t\\1jEITL&&tD",[caseless])), +?line <<"tjEITLaBaBtD">> = iolist_to_binary(re:replace("aB","(?:(?-i)a)b","t\\1jEITL&&tD",[caseless, + global])), +?line <<"Ab">> = iolist_to_binary(re:replace("Ab","(?:(?-i)a)b","hbvOWn",[caseless])), +?line <<"Ab">> = iolist_to_binary(re:replace("Ab","(?:(?-i)a)b","hbvOWn",[caseless, + global])), +?line <<"s">> = iolist_to_binary(re:replace("aB","(?:(?-i)a)b","s",[caseless])), +?line <<"s">> = iolist_to_binary(re:replace("aB","(?:(?-i)a)b","s",[caseless, + global])), +?line <<"yfQaBvLFJJQMhKGx">> = iolist_to_binary(re:replace("aB","((?-i)a)b","yfQ&vLFJJQMhKGx",[caseless])), +?line <<"yfQaBvLFJJQMhKGx">> = iolist_to_binary(re:replace("aB","((?-i)a)b","yfQ&vLFJJQMhKGx",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?:(?-i)a)b","QM&L",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?:(?-i)a)b","QM&L",[caseless, + global])), +?line <<"Ab">> = iolist_to_binary(re:replace("Ab","(?:(?-i)a)b","aVF\\1dL&\\1",[caseless])), +?line <<"Ab">> = iolist_to_binary(re:replace("Ab","(?:(?-i)a)b","aVF\\1dL&\\1",[caseless, + global])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","(?:(?-i)a)b","GSb\\1bvleJ",[caseless])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","(?:(?-i)a)b","GSb\\1bvleJ",[caseless, + global])), +?line <<"wAW">> = iolist_to_binary(re:replace("ab","(?-i:a)b","wAW",[caseless])), +?line <<"wAW">> = iolist_to_binary(re:replace("ab","(?-i:a)b","wAW",[caseless, + global])), +?line <<"Atl">> = iolist_to_binary(re:replace("ab","((?-i:a))b","Atl",[caseless])), +?line <<"Atl">> = iolist_to_binary(re:replace("ab","((?-i:a))b","Atl",[caseless, + global])), +?line <<"gP">> = iolist_to_binary(re:replace("aB","(?-i:a)b","gP\\1",[caseless])), +?line <<"gP">> = iolist_to_binary(re:replace("aB","(?-i:a)b","gP\\1",[caseless, + global])), +?line <<"LFcaNaJixv">> = iolist_to_binary(re:replace("aB","((?-i:a))b","LFc\\1N\\1Jixv",[caseless])), +?line <<"LFcaNaJixv">> = iolist_to_binary(re:replace("aB","((?-i:a))b","LFc\\1N\\1Jixv",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?-i:a)b","FRPuPJIi\\1",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?-i:a)b","FRPuPJIi\\1",[caseless, + global])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","(?-i:a)b","TYBp\\1aMFRUwXYyGS\\1&tH",[caseless])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","(?-i:a)b","TYBp\\1aMFRUwXYyGS\\1&tH",[caseless, + global])), +?line <<"Ab">> = iolist_to_binary(re:replace("Ab","(?-i:a)b","s",[caseless])), +?line <<"Ab">> = iolist_to_binary(re:replace("Ab","(?-i:a)b","s",[caseless, + global])), +?line <<"XBBaBVaBHwVHaBtFl">> = iolist_to_binary(re:replace("aB","(?-i:a)b","XBB\\1&V&H\\1wVH&t\\1Fl",[caseless])), +?line <<"XBBaBVaBHwVHaBtFl">> = iolist_to_binary(re:replace("aB","(?-i:a)b","XBB\\1&V&H\\1wVH&t\\1Fl",[caseless, + global])), +?line <<"TfbKaBvxl">> = iolist_to_binary(re:replace("aB","((?-i:a))b","TfbK&vxl",[caseless])), +?line <<"TfbKaBvxl">> = iolist_to_binary(re:replace("aB","((?-i:a))b","TfbK&vxl",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?-i:a)b","\\1B\\1v&LjNSAy",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?-i:a)b","\\1B\\1v&LjNSAy",[caseless, + global])), +?line <<"Ab">> = iolist_to_binary(re:replace("Ab","(?-i:a)b","HQTW",[caseless])), +?line <<"Ab">> = iolist_to_binary(re:replace("Ab","(?-i:a)b","HQTW",[caseless, + global])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","(?-i:a)b","pG",[caseless])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","(?-i:a)b","pG",[caseless, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","((?-i:a.))b","U",[caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","((?-i:a.))b","U",[caseless, + global])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","((?-i:a.))b","\\1uBjM&tv&\\1tD\\1UO\\1gVY",[caseless])), +?line <<"AB">> = iolist_to_binary(re:replace("AB","((?-i:a.))b","\\1uBjM&tv&\\1tD\\1UO\\1gVY",[caseless, + global])), +?line <<"a +B">> = iolist_to_binary(re:replace("a +B","((?-i:a.))b","SAx&Io",[caseless])), +?line <<"a +B">> = iolist_to_binary(re:replace("a +B","((?-i:a.))b","SAx&Io",[caseless,global])), +?line <<"LPyepkdfnqsa +oa +a +Ba +M">> = iolist_to_binary(re:replace("a +B","((?s-i:a.))b","LPyepkdfnqs\\1o\\1&\\1M",[caseless])), +?line <<"LPyepkdfnqsa +oa +a +Ba +M">> = iolist_to_binary(re:replace("a +B","((?s-i:a.))b","LPyepkdfnqs\\1o\\1&\\1M",[caseless,global])), +?line <<"RG">> = iolist_to_binary(re:replace("cabbbb","(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))","RG",[])), +?line <<"RG">> = iolist_to_binary(re:replace("cabbbb","(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))","RG",[global])), +?line <<"SiMB">> = iolist_to_binary(re:replace("caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))","\\1SiMB",[])), +?line <<"SiMB">> = iolist_to_binary(re:replace("caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))","\\1SiMB",[global])), +?line <<"HNBAb4abYAb4abecqBPfYYBF">> = iolist_to_binary(re:replace("Ab4ab","(ab)\\d\\1","HNB&Y&ecqBPfYYBF",[caseless])), +?line <<"HNBAb4abYAb4abecqBPfYYBF">> = iolist_to_binary(re:replace("Ab4ab","(ab)\\d\\1","HNB&Y&ecqBPfYYBF",[caseless, + global])), +?line <<"eqbVWgJEcab4Ababe">> = iolist_to_binary(re:replace("ab4Ab","(ab)\\d\\1","eqbVWgJEc&\\1e",[caseless])), +?line <<"eqbVWgJEcab4Ababe">> = iolist_to_binary(re:replace("ab4Ab","(ab)\\d\\1","eqbVWgJEc&\\1e",[caseless, + global])), +?line <<"HvsmPfoobar1234bazCYfoobar1234bazqih">> = iolist_to_binary(re:replace("foobar1234baz","foo\\w*\\d{4}baz","HvsmP&CY&qih",[])), +?line <<"HvsmPfoobar1234bazCYfoobar1234bazqih">> = iolist_to_binary(re:replace("foobar1234baz","foo\\w*\\d{4}baz","HvsmP&CY&qih",[global])), +?line <<"x~~lsTkD~~qWUPtx~~wj~~R">> = iolist_to_binary(re:replace("x~~","x(~~)*(?:(?:F)?)?","&lsTkD\\1qWUPt&wj\\1R",[])), +?line <<"x~~lsTkD~~qWUPtx~~wj~~R">> = iolist_to_binary(re:replace("x~~","x(~~)*(?:(?:F)?)?","&lsTkD\\1qWUPt&wj\\1R",[global])), +?line <<"aaacPnBOLPeN">> = iolist_to_binary(re:replace("aaac","^a(?#xxx){3}c","&P\\1n\\1BOLPeN",[])), +?line <<"aaacPnBOLPeN">> = iolist_to_binary(re:replace("aaac","^a(?#xxx){3}c","&P\\1n\\1BOLPeN",[global])), +?line <<"Uh">> = iolist_to_binary(re:replace("aaac","^a (?#xxx) (?#yyy) {3}c","Uh",[extended])), +?line <<"Uh">> = iolist_to_binary(re:replace("aaac","^a (?#xxx) (?#yyy) {3}c","Uh",[extended, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?> = iolist_to_binary(re:replace("*** Failers","(?> = iolist_to_binary(re:replace("B +B","(?> = iolist_to_binary(re:replace("B +B","(?> = iolist_to_binary(re:replace("dbcb","(?> = iolist_to_binary(re:replace("dbcb","(?> = iolist_to_binary(re:replace("dbaacb","(?> = iolist_to_binary(re:replace("dbaacb","(?> = iolist_to_binary(re:replace("dbaacb","(?> = iolist_to_binary(re:replace("dbaacb","(?> = iolist_to_binary(re:replace("cdaccb","(?> = iolist_to_binary(re:replace("cdaccb","(?> = iolist_to_binary(re:replace("","^(?:a?b?)*$","s",[])), +?line <<"s">> = iolist_to_binary(re:replace("","^(?:a?b?)*$","s",[global])), +?line <<"odRhXAvKP">> = iolist_to_binary(re:replace("a","^(?:a?b?)*$","odRhXAvKP",[])), +?line <<"odRhXAvKP">> = iolist_to_binary(re:replace("a","^(?:a?b?)*$","odRhXAvKP",[global])), +?line <<"o">> = iolist_to_binary(re:replace("ab","^(?:a?b?)*$","\\1o",[])), +?line <<"o">> = iolist_to_binary(re:replace("ab","^(?:a?b?)*$","\\1o",[global])), +?line <<"d">> = iolist_to_binary(re:replace("aaa","^(?:a?b?)*$","d",[])), +?line <<"d">> = iolist_to_binary(re:replace("aaa","^(?:a?b?)*$","d",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?:a?b?)*$","fX&M\\1FCCOYOMH\\1lR&ISP",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?:a?b?)*$","fX&M\\1FCCOYOMH\\1lR&ISP",[global])), +?line <<"dbcb">> = iolist_to_binary(re:replace("dbcb","^(?:a?b?)*$","d\\1aeAWVouRdylpC",[])), +?line <<"dbcb">> = iolist_to_binary(re:replace("dbcb","^(?:a?b?)*$","d\\1aeAWVouRdylpC",[global])), +?line <<"a--">> = iolist_to_binary(re:replace("a--","^(?:a?b?)*$","uM",[])), +?line <<"a--">> = iolist_to_binary(re:replace("a--","^(?:a?b?)*$","uM",[global])), +?line <<"aa--">> = iolist_to_binary(re:replace("aa--","^(?:a?b?)*$","EhSvb&jryIv\\1O&oeR",[])), +?line <<"aa--">> = iolist_to_binary(re:replace("aa--","^(?:a?b?)*$","EhSvb&jryIv\\1O&oeR",[global])), +?line <<"yobOa +ba +ca +bcItPS +c">> = iolist_to_binary(re:replace("a +b +c","((?s)^a(.))((?m)^b$)","yobO&\\1c&cItPS",[])), +?line <<"yobOa +ba +ca +bcItPS +c">> = iolist_to_binary(re:replace("a +b +c","((?s)^a(.))((?m)^b$)","yobO&\\1c&cItPS",[global])), +?line <<"a +EBbPgb +c">> = iolist_to_binary(re:replace("a +b +c","((?m)^b$)","EB\\1Pg\\1",[])), +?line <<"a +EBbPgb +c">> = iolist_to_binary(re:replace("a +b +c","((?m)^b$)","EB\\1Pg\\1",[global])), +?line <<"a +AybVFSWPOkP">> = iolist_to_binary(re:replace("a +b","(?m)^b","Ay\\1&VF\\1SWPOkP\\1",[])), +?line <<"a +AybVFSWPOkP">> = iolist_to_binary(re:replace("a +b","(?m)^b","Ay\\1&VF\\1SWPOkP\\1",[global])), +?line <<"a +bbTbKbl">> = iolist_to_binary(re:replace("a +b","(?m)^(b)","b\\1T&K\\1l",[])), +?line <<"a +bbTbKbl">> = iolist_to_binary(re:replace("a +b","(?m)^(b)","b\\1T&K\\1l",[global])), +?line <<"a +bsyUb">> = iolist_to_binary(re:replace("a +b","((?m)^b)","&syU\\1",[])), +?line <<"a +bsyUb">> = iolist_to_binary(re:replace("a +b","((?m)^b)","&syU\\1",[global])), +?line <<"abh">> = iolist_to_binary(re:replace("a +b","\\n((?m)^b)","\\1h",[])), +?line <<"abh">> = iolist_to_binary(re:replace("a +b","\\n((?m)^b)","\\1h",[global])), +?line <<"a +bEu">> = iolist_to_binary(re:replace("a +b +c","((?s).)c(?!.)","Eu",[])), +?line <<"a +bEu">> = iolist_to_binary(re:replace("a +b +c","((?s).)c(?!.)","Eu",[global])), +?line <<"a +bvKqN +cF +r +n">> = iolist_to_binary(re:replace("a +b +c","((?s).)c(?!.)","vKqN&F\\1r\\1n",[])), +?line <<"a +bvKqN +cF +r +n">> = iolist_to_binary(re:replace("a +b +c","((?s).)c(?!.)","vKqN&F\\1r\\1n",[global])), +?line <<"a +ctWb +Kb +cinb +FvJ">> = iolist_to_binary(re:replace("a +b +c","((?s)b.)c(?!.)","ctW\\1K&in\\1FvJ",[])), +?line <<"a +ctWb +Kb +cinb +FvJ">> = iolist_to_binary(re:replace("a +b +c","((?s)b.)c(?!.)","ctW\\1K&in\\1FvJ",[global])), +?line <<"a +Tb +cnVEJvb +Bb +yG">> = iolist_to_binary(re:replace("a +b +c","((?s)b.)c(?!.)","T&nVEJv\\1B\\1yG",[])), +?line <<"a +Tb +cnVEJvb +Bb +yG">> = iolist_to_binary(re:replace("a +b +c","((?s)b.)c(?!.)","T&nVEJv\\1B\\1yG",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","()^b","&\\1",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","()^b","&\\1",[global])), +?line <<"a +b +c">> = iolist_to_binary(re:replace("a +b +c","()^b","ikT\\1",[])), +?line <<"a +b +c">> = iolist_to_binary(re:replace("a +b +c","()^b","ikT\\1",[global])), +?line <<"a +b +c">> = iolist_to_binary(re:replace("a +b +c","()^b","&i&frU",[])), +?line <<"a +b +c">> = iolist_to_binary(re:replace("a +b +c","()^b","&i&frU",[global])), +?line <<"a +bDbfDWKbixbSbxsSN +c">> = iolist_to_binary(re:replace("a +b +c","((?m)^b)","bD\\1fDWK\\1ix\\1S\\1xsSN",[])), +?line <<"a +bDbfDWKbixbSbxsSN +c">> = iolist_to_binary(re:replace("a +b +c","((?m)^b)","bD\\1fDWK\\1ix\\1S\\1xsSN",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(x)?(?(1)a|b)","s&Rt",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(x)?(?(1)a|b)","s&Rt",[global])), +?line <<"a">> = iolist_to_binary(re:replace("a","(x)?(?(1)a|b)","S\\1EQcXTxxFE",[])), +?line <<"a">> = iolist_to_binary(re:replace("a","(x)?(?(1)a|b)","S\\1EQcXTxxFE",[global])), +?line <<"a">> = iolist_to_binary(re:replace("a","(x)?(?(1)a|b)","JRHc\\1hvpt&&",[])), +?line <<"a">> = iolist_to_binary(re:replace("a","(x)?(?(1)a|b)","JRHc\\1hvpt&&",[global])), +?line <<"bQs">> = iolist_to_binary(re:replace("a","(x)?(?(1)b|a)","bQs",[])), +?line <<"bQs">> = iolist_to_binary(re:replace("a","(x)?(?(1)b|a)","bQs",[global])), +?line <<"PQeYprqargqfYkWQsJ">> = iolist_to_binary(re:replace("a","()?(?(1)b|a)","PQeY\\1prq&rgqfYk\\1WQsJ",[])), +?line <<"PQeYprqargqfYkWQsJ">> = iolist_to_binary(re:replace("a","()?(?(1)b|a)","PQeY\\1prq&rgqfYk\\1WQsJ",[global])), +?line <<"HafNdwOXAFq">> = iolist_to_binary(re:replace("a","()?(?(1)a|b)","H&\\1f\\1NdwOXA\\1Fq",[])), +?line <<"HafNdwOXAFq">> = iolist_to_binary(re:replace("a","()?(?(1)a|b)","H&\\1f\\1NdwOXA\\1Fq",[global])), +?line <<"m">> = iolist_to_binary(re:replace("(blah)","^(\\()?blah(?(1)(\\)))$","m",[])), +?line <<"m">> = iolist_to_binary(re:replace("(blah)","^(\\()?blah(?(1)(\\)))$","m",[global])), +?line <<"elEwHf">> = iolist_to_binary(re:replace("blah","^(\\()?blah(?(1)(\\)))$","elEwHf",[])), +?line <<"elEwHf">> = iolist_to_binary(re:replace("blah","^(\\()?blah(?(1)(\\)))$","elEwHf",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(\\()?blah(?(1)(\\)))$","IGewW&v&qpGlghCJe\\1Y",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(\\()?blah(?(1)(\\)))$","IGewW&v&qpGlghCJe\\1Y",[global])), +?line <<"a">> = iolist_to_binary(re:replace("a","^(\\()?blah(?(1)(\\)))$","mxf",[])), +?line <<"a">> = iolist_to_binary(re:replace("a","^(\\()?blah(?(1)(\\)))$","mxf",[global])), +?line <<"blah)">> = iolist_to_binary(re:replace("blah)","^(\\()?blah(?(1)(\\)))$","LxtdV",[])), +?line <<"blah)">> = iolist_to_binary(re:replace("blah)","^(\\()?blah(?(1)(\\)))$","LxtdV",[global])), +?line <<"(blah">> = iolist_to_binary(re:replace("(blah","^(\\()?blah(?(1)(\\)))$","Ni\\1CkEtaxcXXYB\\1",[])), +?line <<"(blah">> = iolist_to_binary(re:replace("(blah","^(\\()?blah(?(1)(\\)))$","Ni\\1CkEtaxcXXYB\\1",[global])), +?line <<"UaAfN(ELb">> = iolist_to_binary(re:replace("(blah)","^(\\(+)?blah(?(1)(\\)))$","UaAfN\\1ELb",[])), +?line <<"UaAfN(ELb">> = iolist_to_binary(re:replace("(blah)","^(\\(+)?blah(?(1)(\\)))$","UaAfN\\1ELb",[global])), +?line <<"XrxQosMn">> = iolist_to_binary(re:replace("blah","^(\\(+)?blah(?(1)(\\)))$","Xrx\\1QosMn\\1",[])), +?line <<"XrxQosMn">> = iolist_to_binary(re:replace("blah","^(\\(+)?blah(?(1)(\\)))$","Xrx\\1QosMn\\1",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(\\(+)?blah(?(1)(\\)))$","QGGpmf",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(\\(+)?blah(?(1)(\\)))$","QGGpmf",[global])), +?line <<"blah)">> = iolist_to_binary(re:replace("blah)","^(\\(+)?blah(?(1)(\\)))$","HDFROCUS",[])), +?line <<"blah)">> = iolist_to_binary(re:replace("blah)","^(\\(+)?blah(?(1)(\\)))$","HDFROCUS",[global])), +?line <<"(blah">> = iolist_to_binary(re:replace("(blah","^(\\(+)?blah(?(1)(\\)))$","AVrY",[])), +?line <<"(blah">> = iolist_to_binary(re:replace("(blah","^(\\(+)?blah(?(1)(\\)))$","AVrY",[global])), +?line <<"HlgBXckVbhp">> = iolist_to_binary(re:replace("a","(?(?!a)b|a)","HlgBXckV\\1bhp",[])), +?line <<"HlgBXckVbhp">> = iolist_to_binary(re:replace("a","(?(?!a)b|a)","HlgBXckV\\1bhp",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?(?=a)b|a)","&&PIwfc\\1cckXSEYaB",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?(?=a)b|a)","&&PIwfc\\1cckXSEYaB",[global])), +?line <<"a">> = iolist_to_binary(re:replace("a","(?(?=a)b|a)","vKjGNVI&ySCYE",[])), +?line <<"a">> = iolist_to_binary(re:replace("a","(?(?=a)b|a)","vKjGNVI&ySCYE",[global])), +?line <<"a">> = iolist_to_binary(re:replace("a","(?(?=a)b|a)","lAvpym&eEJad\\1RMs\\1CLu",[])), +?line <<"a">> = iolist_to_binary(re:replace("a","(?(?=a)b|a)","lAvpym&eEJad\\1RMs\\1CLu",[global])), +?line <<"kHAy">> = iolist_to_binary(re:replace("a","(?(?=a)a|b)","kHAy",[])), +?line <<"kHAy">> = iolist_to_binary(re:replace("a","(?(?=a)a|b)","kHAy",[global])), +?line <<"amAyaheaaTPJaVdTAyU">> = iolist_to_binary(re:replace("aaab","(?=(a+?))(\\1ab)","mAyahe\\1\\1TPJ\\1VdTAyU",[])), +?line <<"amAyaheaaTPJaVdTAyU">> = iolist_to_binary(re:replace("aaab","(?=(a+?))(\\1ab)","mAyahe\\1\\1TPJ\\1VdTAyU",[global])), +?line <<"pEvYFTwEOhhryoVdG">> = iolist_to_binary(re:replace("one:","(\\w+:)+","pEvYFTwEOhhryoVdG",[])), +?line <<"pEvYFTwEOhhryoVdG">> = iolist_to_binary(re:replace("one:","(\\w+:)+","pEvYFTwEOhhryoVdG",[global])), +?line <<"aHho">> = iolist_to_binary(re:replace("a","$(?<=^(a))","Hho",[])), +?line <<"aHho">> = iolist_to_binary(re:replace("a","$(?<=^(a))","Hho",[global])), +?line <<"ajuOkagipUraRpaQiaabv">> = iolist_to_binary(re:replace("aaab","(?=(a+?))(\\1ab)","juOk\\1gipUr\\1Rp\\1Qi&v",[])), +?line <<"ajuOkagipUraRpaQiaabv">> = iolist_to_binary(re:replace("aaab","(?=(a+?))(\\1ab)","juOk\\1gipUr\\1Rp\\1Qi&v",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?=(a+?))\\1ab","g\\1\\1\\1v",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?=(a+?))\\1ab","g\\1\\1\\1v",[global])), +?line <<"aaab">> = iolist_to_binary(re:replace("aaab","^(?=(a+?))\\1ab","dj\\1E&",[])), +?line <<"aaab">> = iolist_to_binary(re:replace("aaab","^(?=(a+?))\\1ab","dj\\1E&",[global])), +?line <<"aaab">> = iolist_to_binary(re:replace("aaab","^(?=(a+?))\\1ab","\\1UllJHtwTvaUdSmur",[])), +?line <<"aaab">> = iolist_to_binary(re:replace("aaab","^(?=(a+?))\\1ab","\\1UllJHtwTvaUdSmur",[global])), +?line <<"juabcdvJAqaNxcabcdrDs">> = iolist_to_binary(re:replace("abcd","([\\w:]+::)?(\\w+)$","ju&vJAqaNxc&rDs\\1",[])), +?line <<"juabcdvJAqaNxcabcdrDs">> = iolist_to_binary(re:replace("abcd","([\\w:]+::)?(\\w+)$","ju&vJAqaNxc&rDs\\1",[global])), +?line <<"unOWEMklEbRjSO">> = iolist_to_binary(re:replace("xy:z:::abcd","([\\w:]+::)?(\\w+)$","unOWEMklEbRjSO",[])), +?line <<"unOWEMklEbRjSO">> = iolist_to_binary(re:replace("xy:z:::abcd","([\\w:]+::)?(\\w+)$","unOWEMklEbRjSO",[global])), +?line <<"nGqSeaexycfAmCxmxEaexycd">> = iolist_to_binary(re:replace("aexycd","^[^bcd]*(c+)","nGqSe&fAmCxmxE&",[])), +?line <<"nGqSeaexycfAmCxmxEaexycd">> = iolist_to_binary(re:replace("aexycd","^[^bcd]*(c+)","nGqSe&fAmCxmxE&",[global])), +?line <<"cwK">> = iolist_to_binary(re:replace("caab","(a*)b+","wK",[])), +?line <<"cwK">> = iolist_to_binary(re:replace("caab","(a*)b+","wK",[global])), +?line <<"VKunDTpabcd">> = iolist_to_binary(re:replace("abcd","([\\w:]+::)?(\\w+)$","VKunD\\1Tp&",[])), +?line <<"VKunDTpabcd">> = iolist_to_binary(re:replace("abcd","([\\w:]+::)?(\\w+)$","VKunD\\1Tp&",[global])), +?line <<"xy:z:::SXxy:z:::cMHreuKxy:z:::">> = iolist_to_binary(re:replace("xy:z:::abcd","([\\w:]+::)?(\\w+)$","\\1SX\\1cMHreuK\\1",[])), +?line <<"xy:z:::SXxy:z:::cMHreuKxy:z:::">> = iolist_to_binary(re:replace("xy:z:::abcd","([\\w:]+::)?(\\w+)$","\\1SX\\1cMHreuK\\1",[global])), +?line <<"*** FhLAjVJbYFailersvFailersQgrO">> = iolist_to_binary(re:replace("*** Failers","([\\w:]+::)?(\\w+)$","FhLAjVJbY&v&QgrO\\1\\1",[])), +?line <<"*** FhLAjVJbYFailersvFailersQgrO">> = iolist_to_binary(re:replace("*** Failers","([\\w:]+::)?(\\w+)$","FhLAjVJbY&v&QgrO\\1\\1",[global])), +?line <<"abcd:">> = iolist_to_binary(re:replace("abcd:","([\\w:]+::)?(\\w+)$","cwV&UpGIKN",[])), +?line <<"abcd:">> = iolist_to_binary(re:replace("abcd:","([\\w:]+::)?(\\w+)$","cwV&UpGIKN",[global])), +?line <<"abcd:">> = iolist_to_binary(re:replace("abcd:","([\\w:]+::)?(\\w+)$","S",[])), +?line <<"abcd:">> = iolist_to_binary(re:replace("abcd:","([\\w:]+::)?(\\w+)$","S",[global])), +?line <<"Fd">> = iolist_to_binary(re:replace("aexycd","^[^bcd]*(c+)","F",[])), +?line <<"Fd">> = iolist_to_binary(re:replace("aexycd","^[^bcd]*(c+)","F",[global])), +?line <<"jBpBHQR">> = iolist_to_binary(re:replace("aaab","(?>a+)b","jBpBHQR",[])), +?line <<"jBpBHQR">> = iolist_to_binary(re:replace("aaab","(?>a+)b","jBpBHQR",[global])), +?line <<"a:[J:[:[UyJMIwrPUq:[b]:">> = iolist_to_binary(re:replace("a:[b]:","([[:]+)","\\1J&\\1UyJMIwrPUq\\1",[])), +?line <<"a:[J:[:[UyJMIwrPUq:[b]:J::UyJMIwrPUq:">> = iolist_to_binary(re:replace("a:[b]:","([[:]+)","\\1J&\\1UyJMIwrPUq\\1",[global])), +?line <<"asI=[vo=[d=[Y=[nMpb]=">> = iolist_to_binary(re:replace("a=[b]=","([[=]+)","sI\\1vo\\1d\\1Y&nMp",[])), +?line <<"asI=[vo=[d=[Y=[nMpb]sI=vo=d=Y=nMp">> = iolist_to_binary(re:replace("a=[b]=","([[=]+)","sI\\1vo\\1d\\1Y&nMp",[global])), +?line <<"aChCrrVW.[ed.[eo.[h.[SYkIb].">> = iolist_to_binary(re:replace("a.[b].","([[.]+)","ChCrrVW\\1ed&eo\\1h\\1SYkI",[])), +?line <<"aChCrrVW.[ed.[eo.[h.[SYkIb]ChCrrVW.ed.eo.h.SYkI">> = iolist_to_binary(re:replace("a.[b].","([[.]+)","ChCrrVW\\1ed&eo\\1h\\1SYkI",[global])), +?line <<"BaaabaaabGBaaabJDn">> = iolist_to_binary(re:replace("aaab","((?>a+)b)","B&\\1GB&JDn",[])), +?line <<"BaaabaaabGBaaabJDn">> = iolist_to_binary(re:replace("aaab","((?>a+)b)","B&\\1GB&JDn",[global])), +?line <<"kaaabsaaXdPWUBV">> = iolist_to_binary(re:replace("aaab","(?>(a+))b","k&saaXdPWUBV",[])), +?line <<"kaaabsaaXdPWUBV">> = iolist_to_binary(re:replace("aaab","(?>(a+))b","k&saaXdPWUBV",[global])), +?line <<"((xpOHCg">> = iolist_to_binary(re:replace("((abc(ade)ufh()()x","((?>[^()]+)|\\([^()]*\\))+","\\1pOHCg",[])), +?line <<"((xpOHCg">> = iolist_to_binary(re:replace("((abc(ade)ufh()()x","((?>[^()]+)|\\([^()]*\\))+","\\1pOHCg",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a\\Z","swCtIfMPh&\\1Yr",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a\\Z","swCtIfMPh&\\1Yr",[global])), +?line <<"aaab">> = iolist_to_binary(re:replace("aaab","a\\Z","ysA\\1",[])), +?line <<"aaab">> = iolist_to_binary(re:replace("aaab","a\\Z","ysA\\1",[global])), +?line <<"a +b">> = iolist_to_binary(re:replace("a +b","a\\Z","&ajAlqYVsnk",[])), +?line <<"a +b">> = iolist_to_binary(re:replace("a +b","a\\Z","&ajAlqYVsnk",[global])), +?line <<"a +lKbbBrmbgrOVeW">> = iolist_to_binary(re:replace("a +b","b\\Z","l\\1Kb&Brm&gr\\1OVeW",[])), +?line <<"a +lKbbBrmbgrOVeW">> = iolist_to_binary(re:replace("a +b","b\\Z","l\\1Kb&Brm&gr\\1OVeW",[global])), +?line <<"a +gnI">> = iolist_to_binary(re:replace("a +b","b\\Z","g\\1nI",[])), +?line <<"a +gnI">> = iolist_to_binary(re:replace("a +b","b\\Z","g\\1nI",[global])), +?line <<"a +bcbdqlbVGu">> = iolist_to_binary(re:replace("a +b","b\\z","bc&dql&VGu\\1",[])), +?line <<"a +bcbdqlbVGu">> = iolist_to_binary(re:replace("a +b","b\\z","bc&dql&VGu\\1",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","b\\z","e\\1yg",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","b\\z","e\\1yg",[global])), +?line <<"ad">> = iolist_to_binary(re:replace("a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","&d",[])), +?line <<"ad">> = iolist_to_binary(re:replace("a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","&d",[global])), +?line <<"Aq">> = iolist_to_binary(re:replace("abc","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","Aq",[])), +?line <<"Aq">> = iolist_to_binary(re:replace("abc","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","Aq",[global])), +?line <<"ca-ba-bhLfWdPLa-boe">> = iolist_to_binary(re:replace("a-b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","c&&hLfWdPL&oe",[])), +?line <<"ca-ba-bhLfWdPLa-boe">> = iolist_to_binary(re:replace("a-b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","c&&hLfWdPL&oe",[global])), +?line <<"0-90-9YeqrpXMpBjK">> = iolist_to_binary(re:replace("0-9","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","&\\1&YeqrpXMpBjK",[])), +?line <<"0-90-9YeqrpXMpBjK">> = iolist_to_binary(re:replace("0-9","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","&\\1&YeqrpXMpBjK",[global])), +?line <<"fa.bPwKXcUgqjJm">> = iolist_to_binary(re:replace("a.b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","\\1f&PwKX\\1cUgqjJm",[])), +?line <<"fa.bPwKXcUgqjJm">> = iolist_to_binary(re:replace("a.b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","\\1f&PwKX\\1cUgqjJm",[global])), +?line <<"um5.6.7cFpS">> = iolist_to_binary(re:replace("5.6.7","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","um&cFpS\\1",[])), +?line <<"um5.6.7cFpS">> = iolist_to_binary(re:replace("5.6.7","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","um&cFpS\\1",[global])), +?line <<"xqtEI">> = iolist_to_binary(re:replace("the.quick.brown.fox","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","xqtEI",[])), +?line <<"xqtEI">> = iolist_to_binary(re:replace("the.quick.brown.fox","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","xqtEI",[global])), +?line <<"sga100.b200.300cdqqwa100.b200.300cqSJINVa100.b200.300cOyeI">> = iolist_to_binary(re:replace("a100.b200.300c","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","sg&dqqw&qSJINV&OyeI",[])), +?line <<"sga100.b200.300cdqqwa100.b200.300cqSJINVa100.b200.300cOyeI">> = iolist_to_binary(re:replace("a100.b200.300c","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","sg&dqqw&qSJINV&OyeI",[global])), +?line <<"rabe12-ab.1245NInvoPCLW12-ab.1245">> = iolist_to_binary(re:replace("12-ab.1245","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","rabe&NI\\1nvo\\1PCLW&",[])), +?line <<"rabe12-ab.1245NInvoPCLW12-ab.1245">> = iolist_to_binary(re:replace("12-ab.1245","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","rabe&NI\\1nvo\\1PCLW&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","jhvaoUW\\1Wye\\1Qkrj",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","jhvaoUW\\1Wye\\1Qkrj",[global])), +?line <<"">> = iolist_to_binary(re:replace("","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","Q&L\\1qk&QWuvQ\\1o",[])), +?line <<"">> = iolist_to_binary(re:replace("","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","Q&L\\1qk&QWuvQ\\1o",[global])), +?line <<".a">> = iolist_to_binary(re:replace(".a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","j&I&\\1&myXAKjyO&Mw",[])), +?line <<".a">> = iolist_to_binary(re:replace(".a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","j&I&\\1&myXAKjyO&Mw",[global])), +?line <<"-a">> = iolist_to_binary(re:replace("-a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","yyHkNcANJB",[])), +?line <<"-a">> = iolist_to_binary(re:replace("-a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","yyHkNcANJB",[global])), +?line <<"a-">> = iolist_to_binary(re:replace("a-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","&\\1tGDVOXc&&\\1aF\\1",[])), +?line <<"a-">> = iolist_to_binary(re:replace("a-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","&\\1tGDVOXc&&\\1aF\\1",[global])), +?line <<"a.">> = iolist_to_binary(re:replace("a.","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","\\1\\1PTJg\\1\\1x",[])), +?line <<"a.">> = iolist_to_binary(re:replace("a.","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","\\1\\1PTJg\\1\\1x",[global])), +?line <<"a_b">> = iolist_to_binary(re:replace("a_b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","w&",[])), +?line <<"a_b">> = iolist_to_binary(re:replace("a_b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","w&",[global])), +?line <<"a.-">> = iolist_to_binary(re:replace("a.-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","EYTDvAw&\\1hAJjtxh",[])), +?line <<"a.-">> = iolist_to_binary(re:replace("a.-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","EYTDvAw&\\1hAJjtxh",[global])), +?line <<"a..">> = iolist_to_binary(re:replace("a..","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","v&",[])), +?line <<"a..">> = iolist_to_binary(re:replace("a..","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","v&",[global])), +?line <<"ab..bc">> = iolist_to_binary(re:replace("ab..bc","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","xi\\1TmyKwF&sc",[])), +?line <<"ab..bc">> = iolist_to_binary(re:replace("ab..bc","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","xi\\1TmyKwF&sc",[global])), +?line <<"the.quick.brown.fox-">> = iolist_to_binary(re:replace("the.quick.brown.fox-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","qbJylT\\1",[])), +?line <<"the.quick.brown.fox-">> = iolist_to_binary(re:replace("the.quick.brown.fox-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","qbJylT\\1",[global])), +?line <<"the.quick.brown.fox.">> = iolist_to_binary(re:replace("the.quick.brown.fox.","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","P&\\1dGVbFGwNJ",[])), +?line <<"the.quick.brown.fox.">> = iolist_to_binary(re:replace("the.quick.brown.fox.","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","P&\\1dGVbFGwNJ",[global])), +?line <<"the.quick.brown.fox_">> = iolist_to_binary(re:replace("the.quick.brown.fox_","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","V&e",[])), +?line <<"the.quick.brown.fox_">> = iolist_to_binary(re:replace("the.quick.brown.fox_","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","V&e",[global])), +?line <<"the.quick.brown.fox+">> = iolist_to_binary(re:replace("the.quick.brown.fox+","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","\\1",[])), +?line <<"the.quick.brown.fox+">> = iolist_to_binary(re:replace("the.quick.brown.fox+","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$","\\1",[global])), +?line <<"alphabetabcdlJabcdabcdabcdWqGabcd">> = iolist_to_binary(re:replace("alphabetabcd","(?>.*)(?<=(abcd|wxyz))","&lJ\\1\\1\\1WqG\\1",[])), +?line <<"alphabetabcdlJabcdabcdabcdWqGabcdlJabcdabcdabcdWqGabcd">> = iolist_to_binary(re:replace("alphabetabcd","(?>.*)(?<=(abcd|wxyz))","&lJ\\1\\1\\1WqG\\1",[global])), +?line <<"Q">> = iolist_to_binary(re:replace("endingwxyz","(?>.*)(?<=(abcd|wxyz))","Q",[])), +?line <<"QQ">> = iolist_to_binary(re:replace("endingwxyz","(?>.*)(?<=(abcd|wxyz))","Q",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?>.*)(?<=(abcd|wxyz))","qTAxLBxW",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?>.*)(?<=(abcd|wxyz))","qTAxLBxW",[global])), +?line <<"a rather long string that doesn't end with one of them">> = iolist_to_binary(re:replace("a rather long string that doesn't end with one of them","(?>.*)(?<=(abcd|wxyz))","HY\\1",[])), +?line <<"a rather long string that doesn't end with one of them">> = iolist_to_binary(re:replace("a rather long string that doesn't end with one of them","(?>.*)(?<=(abcd|wxyz))","HY\\1",[global])), +?line <<"KxMJnKmSMrA">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark otherword","word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword","\\1KxMJnKmSMrA",[])), +?line <<"KxMJnKmSMrA">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark otherword","word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword","\\1KxMJnKmSMrA",[global])), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark","word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword","TgCuE\\1Jnjdu",[])), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark","word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword","TgCuE\\1Jnjdu",[global])), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope","word (?>[a-zA-Z0-9]+ ){0,30}otherword","HJa&S&CWDAtFOINp\\1a",[])), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope">> = iolist_to_binary(re:replace("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope","word (?>[a-zA-Z0-9]+ ){0,30}otherword","HJa&S&CWDAtFOINp\\1a",[global])), +?line <<"999GSL">> = iolist_to_binary(re:replace("999foo","(?<=\\d{3}(?!999))foo","GSL",[])), +?line <<"999GSL">> = iolist_to_binary(re:replace("999foo","(?<=\\d{3}(?!999))foo","GSL",[global])), +?line <<"123999Lxthrb">> = iolist_to_binary(re:replace("123999foo","(?<=\\d{3}(?!999))foo","Lxthrb",[])), +?line <<"123999Lxthrb">> = iolist_to_binary(re:replace("123999foo","(?<=\\d{3}(?!999))foo","Lxthrb",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=\\d{3}(?!999))foo","K&j&h&\\1&&&nJDCN",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=\\d{3}(?!999))foo","K&j&h&\\1&&&nJDCN",[global])), +?line <<"123abcfoo">> = iolist_to_binary(re:replace("123abcfoo","(?<=\\d{3}(?!999))foo","Y&X\\1Oe",[])), +?line <<"123abcfoo">> = iolist_to_binary(re:replace("123abcfoo","(?<=\\d{3}(?!999))foo","Y&X\\1Oe",[global])), +?line <<"999lwxfoov">> = iolist_to_binary(re:replace("999foo","(?<=(?!...999)\\d{3})foo","lwx&v",[])), +?line <<"999lwxfoov">> = iolist_to_binary(re:replace("999foo","(?<=(?!...999)\\d{3})foo","lwx&v",[global])), +?line <<"123999MgNvfoofooIVfoo">> = iolist_to_binary(re:replace("123999foo","(?<=(?!...999)\\d{3})foo","MgNv\\1&&IV&",[])), +?line <<"123999MgNvfoofooIVfoo">> = iolist_to_binary(re:replace("123999foo","(?<=(?!...999)\\d{3})foo","MgNv\\1&&IV&",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=(?!...999)\\d{3})foo","Iv&\\1uOjnSDBEaj",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=(?!...999)\\d{3})foo","Iv&\\1uOjnSDBEaj",[global])), +?line <<"123abcfoo">> = iolist_to_binary(re:replace("123abcfoo","(?<=(?!...999)\\d{3})foo","sanP",[])), +?line <<"123abcfoo">> = iolist_to_binary(re:replace("123abcfoo","(?<=(?!...999)\\d{3})foo","sanP",[global])), +?line <<"123abclcAPWfoouwtMfoofDv">> = iolist_to_binary(re:replace("123abcfoo","(?<=\\d{3}(?!999)...)foo","lcAPW&uwtM&fDv",[])), +?line <<"123abclcAPWfoouwtMfoofDv">> = iolist_to_binary(re:replace("123abcfoo","(?<=\\d{3}(?!999)...)foo","lcAPW&uwtM&fDv",[global])), +?line <<"123456nRFsuNto">> = iolist_to_binary(re:replace("123456foo","(?<=\\d{3}(?!999)...)foo","nR\\1FsuNto",[])), +?line <<"123456nRFsuNto">> = iolist_to_binary(re:replace("123456foo","(?<=\\d{3}(?!999)...)foo","nR\\1FsuNto",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=\\d{3}(?!999)...)foo","P&",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?<=\\d{3}(?!999)...)foo","P&",[global])), +?line <<"123999foo">> = iolist_to_binary(re:replace("123999foo","(?<=\\d{3}(?!999)...)foo","BdprjW\\1hk\\1K\\1",[])), +?line <<"123999foo">> = iolist_to_binary(re:replace("123999foo","(?<=\\d{3}(?!999)...)foo","BdprjW\\1hk\\1K\\1",[global])), +?line <<"123abcCB">> = iolist_to_binary(re:replace("123abcfoo","(?<=\\d{3}...)(?> = iolist_to_binary(re:replace("123abcfoo","(?<=\\d{3}...)(?> = iolist_to_binary(re:replace("123456foo","(?<=\\d{3}...)(?> = iolist_to_binary(re:replace("123456foo","(?<=\\d{3}...)(?> = iolist_to_binary(re:replace("*** Failers","(?<=\\d{3}...)(?> = iolist_to_binary(re:replace("*** Failers","(?<=\\d{3}...)(?> = iolist_to_binary(re:replace("123999foo","(?<=\\d{3}...)(?> = iolist_to_binary(re:replace("123999foo","(?<=\\d{3}...)(?> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("> = iolist_to_binary(re:replace("\\s*)=(?>\\s*) # find > = iolist_to_binary(re:replace("\\s*)=(?>\\s*) # find > = iolist_to_binary(re:replace("\\s*)=(?>\\s*) # find > = iolist_to_binary(re:replace("\\s*)=(?>\\s*) # find > = iolist_to_binary(re:replace("\\s*)=(?>\\s*) # find > = iolist_to_binary(re:replace("\\s*)=(?>\\s*) # find > = iolist_to_binary(re:replace("ZABCDEFG","((Z)+|A)*","E&DCywAYhL",[])), +?line <<"EZADCywAYhLEDCywAYhLBEDCywAYhLCEDCywAYhLDEDCywAYhLEEDCywAYhLFEDCywAYhLGEDCywAYhL">> = iolist_to_binary(re:replace("ZABCDEFG","((Z)+|A)*","E&DCywAYhL",[global])), +?line <<"nyATkLcbFTgYpAunmMXBCDEFG">> = iolist_to_binary(re:replace("ZABCDEFG","(Z()|A)*","ny\\1TkLcbFTgYp\\1unmMX",[])), +?line <<"nyATkLcbFTgYpAunmMXnyTkLcbFTgYpunmMXBnyTkLcbFTgYpunmMXCnyTkLcbFTgYpunmMXDnyTkLcbFTgYpunmMXEnyTkLcbFTgYpunmMXFnyTkLcbFTgYpunmMXGnyTkLcbFTgYpunmMX">> = iolist_to_binary(re:replace("ZABCDEFG","(Z()|A)*","ny\\1TkLcbFTgYp\\1unmMX",[global])), +?line <<"YiJonwVPQAqACHABCDEFG">> = iolist_to_binary(re:replace("ZABCDEFG","(Z(())|A)*","YiJonwVPQ\\1q\\1CH\\1",[])), +?line <<"YiJonwVPQAqACHAYiJonwVPQqCHBYiJonwVPQqCHCYiJonwVPQqCHDYiJonwVPQqCHEYiJonwVPQqCHFYiJonwVPQqCHGYiJonwVPQqCH">> = iolist_to_binary(re:replace("ZABCDEFG","(Z(())|A)*","YiJonwVPQ\\1q\\1CH\\1",[global])), +?line <<"bZAEAXcNeNwfBCDEFG">> = iolist_to_binary(re:replace("ZABCDEFG","((?>Z)+|A)*","b&E\\1XcNeNwf",[])), +?line <<"bZAEAXcNeNwfbEXcNeNwfBbEXcNeNwfCbEXcNeNwfDbEXcNeNwfEbEXcNeNwfFbEXcNeNwfGbEXcNeNwf">> = iolist_to_binary(re:replace("ZABCDEFG","((?>Z)+|A)*","b&E\\1XcNeNwf",[global])), +?line <<"UeIRbNvamSaniIQYPZABCDEFG">> = iolist_to_binary(re:replace("ZABCDEFG","((?>)+|A)*","UeIRbNv&amSaniIQYP",[])), +?line <<"UeIRbNvamSaniIQYPZUeIRbNvamSaniIQYPUeIRbNvAamSaniIQYPUeIRbNvamSaniIQYPBUeIRbNvamSaniIQYPCUeIRbNvamSaniIQYPDUeIRbNvamSaniIQYPEUeIRbNvamSaniIQYPFUeIRbNvamSaniIQYPGUeIRbNvamSaniIQYP">> = iolist_to_binary(re:replace("ZABCDEFG","((?>)+|A)*","UeIRbNv&amSaniIQYP",[global])), +?line <<"AnyTcLbbab">> = iolist_to_binary(re:replace("abbab","a*","AnyTcL",[])), +?line <<"AnyTcLAnyTcLbAnyTcLbAnyTcLAnyTcLbAnyTcL">> = iolist_to_binary(re:replace("abbab","a*","AnyTcL",[global])), +?line <<"EfoRdQVibcde">> = iolist_to_binary(re:replace("abcde","^[a-\\d]","EfoRdQVi",[])), +?line <<"EfoRdQVibcde">> = iolist_to_binary(re:replace("abcde","^[a-\\d]","EfoRdQVi",[global])), +?line <<"cCcyoUi-GT--drpjthings">> = iolist_to_binary(re:replace("-things","^[a-\\d]","cCcy\\1o\\1Ui>&&drpj",[])), +?line <<"cCcyoUi-GT--drpjthings">> = iolist_to_binary(re:replace("-things","^[a-\\d]","cCcy\\1o\\1Ui>&&drpj",[global])), +?line <<"eddigit">> = iolist_to_binary(re:replace("0digit","^[a-\\d]","ed",[])), +?line <<"eddigit">> = iolist_to_binary(re:replace("0digit","^[a-\\d]","ed",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[a-\\d]","\\1wCjwyJQB&COO&&Vyp\\1M",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[a-\\d]","\\1wCjwyJQB&COO&&Vyp\\1M",[global])), +?line <<"bcdef">> = iolist_to_binary(re:replace("bcdef","^[a-\\d]","EofOaus",[])), +?line <<"bcdef">> = iolist_to_binary(re:replace("bcdef","^[a-\\d]","EofOaus",[global])), +?line <<"kpGVaTiadJVwJbcde">> = iolist_to_binary(re:replace("abcde","^[\\d-a]","kpG\\1V&Ti&dJVwJ",[])), +?line <<"kpGVaTiadJVwJbcde">> = iolist_to_binary(re:replace("abcde","^[\\d-a]","kpG\\1V&Ti&dJVwJ",[global])), +?line <<"Chuymdqthings">> = iolist_to_binary(re:replace("-things","^[\\d-a]","Chu\\1ymdq",[])), +?line <<"Chuymdqthings">> = iolist_to_binary(re:replace("-things","^[\\d-a]","Chu\\1ymdq",[global])), +?line <<"TpWPVwVtHJWAdigit">> = iolist_to_binary(re:replace("0digit","^[\\d-a]","TpWPVwV\\1tHJWA",[])), +?line <<"TpWPVwVtHJWAdigit">> = iolist_to_binary(re:replace("0digit","^[\\d-a]","TpWPVwV\\1tHJWA",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[\\d-a]","WYnxbwypPj",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^[\\d-a]","WYnxbwypPj",[global])), +?line <<"bcdef">> = iolist_to_binary(re:replace("bcdef","^[\\d-a]","bnUSwwhPJ",[])), +?line <<"bcdef">> = iolist_to_binary(re:replace("bcdef","^[\\d-a]","bnUSwwhPJ",[global])), +?line <<">mnfN + FbS + ghxwsq<">> = iolist_to_binary(re:replace("> + <","[[:space:]]+","mnfN&FbS\\1&ghxwsq",[])), +?line <<">mnfN + FbS + ghxwsq<">> = iolist_to_binary(re:replace("> + <","[[:space:]]+","mnfN&FbS\\1&ghxwsq",[global])), +?line <<">R + <">> = iolist_to_binary(re:replace("> + <","[[:blank:]]+","R",[])), +?line <<">R + <">> = iolist_to_binary(re:replace("> + <","[[:blank:]]+","R",[global])), +?line <<">PjX + <">> = iolist_to_binary(re:replace("> + <","[\\s]+","PjX&",[])), +?line <<">PjX + <">> = iolist_to_binary(re:replace("> + <","[\\s]+","PjX&",[global])), +?line <<">EO + + g + + DMTFYSd + <">> = iolist_to_binary(re:replace("> + <","\\s+","EO&&g&&DMT\\1FY\\1Sd&",[])), +?line <<">EO + + g + + DMTFYSd + <">> = iolist_to_binary(re:replace("> + <","\\s+","EO&&g&&DMT\\1FY\\1Sd&",[global])), +?line <<"ab">> = iolist_to_binary(re:replace("ab","a b","qihC&Vy",[extended])), +?line <<"ab">> = iolist_to_binary(re:replace("ab","a b","qihC&Vy",[extended, + global])), +?line <<"a +dxmjb">> = iolist_to_binary(re:replace("a +xb","(?!\\A)x","dxmj",[multiline])), +?line <<"a +dxmjb">> = iolist_to_binary(re:replace("a +xb","(?!\\A)x","dxmj",[multiline,global])), +?line <<"a +xb">> = iolist_to_binary(re:replace("a +xb","(?!^)x","\\1tysI\\1v\\1BVwx\\1FOWG\\1&C",[multiline])), +?line <<"a +xb">> = iolist_to_binary(re:replace("a +xb","(?!^)x","\\1tysI\\1v\\1BVwx\\1FOWG\\1&C",[multiline, + global])), +?line <<"MYdx">> = iolist_to_binary(re:replace("abcabcabc","abc\\Qabc\\Eabc","MYdx",[])), +?line <<"MYdx">> = iolist_to_binary(re:replace("abcabcabc","abc\\Qabc\\Eabc","MYdx",[global])), +?line <<"abc(*+|abc">> = iolist_to_binary(re:replace("abc(*+|abc","abc\\Q(*+|\\Eabc","&",[])), +?line <<"abc(*+|abc">> = iolist_to_binary(re:replace("abc(*+|abc","abc\\Q(*+|\\Eabc","&",[global])), +?line <<"abc abcabcbMSm">> = iolist_to_binary(re:replace("abc abcabc"," abc\\Q abc\\Eabc","&bM\\1Sm",[extended])), +?line <<"abc abcabcbMSm">> = iolist_to_binary(re:replace("abc abcabc"," abc\\Q abc\\Eabc","&bM\\1Sm",[extended, + global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers"," abc\\Q abc\\Eabc","X\\1\\1&",[extended])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers"," abc\\Q abc\\Eabc","X\\1\\1&",[extended, + global])), +?line <<"abcabcabc">> = iolist_to_binary(re:replace("abcabcabc"," abc\\Q abc\\Eabc","qbvwJpk",[extended])), +?line <<"abcabcabc">> = iolist_to_binary(re:replace("abcabcabc"," abc\\Q abc\\Eabc","qbvwJpk",[extended, + global])), +?line <<"UwGaabc#not comment + literal">> = iolist_to_binary(re:replace("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E","UwGa&",[extended])), +?line <<"UwGaabc#not comment + literal">> = iolist_to_binary(re:replace("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E","UwGa&",[extended,global])), +?line <<"abc#not comment + literalSCWsV">> = iolist_to_binary(re:replace("abc#not comment + literal","abc#comment + \\Q#not comment + literal","&\\1SCWsV",[extended])), +?line <<"abc#not comment + literalSCWsV">> = iolist_to_binary(re:replace("abc#not comment + literal","abc#comment + \\Q#not comment + literal","&\\1SCWsV",[extended,global])), +?line <<"T">> = iolist_to_binary(re:replace("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E #more comment + ","T",[extended])), +?line <<"T">> = iolist_to_binary(re:replace("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E #more comment + ","T",[extended,global])), +?line <<"abc#not comment + literalDFMabc#not comment + literaliRRuHyq">> = iolist_to_binary(re:replace("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E #more comment","&DFM&\\1\\1iR\\1RuHy\\1q",[extended])), +?line <<"abc#not comment + literalDFMabc#not comment + literaliRRuHyq">> = iolist_to_binary(re:replace("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E #more comment","&DFM&\\1\\1iR\\1RuHy\\1q",[extended, + global])), +?line <<"DkSX">> = iolist_to_binary(re:replace("abc\\$xyz","\\Qabc\\$xyz\\E","DkSX",[])), +?line <<"DkSX">> = iolist_to_binary(re:replace("abc\\$xyz","\\Qabc\\$xyz\\E","DkSX",[global])), +?line <<"EOaWuCabc$xyzeabc$xyzDrvLP">> = iolist_to_binary(re:replace("abc$xyz","\\Qabc\\E\\$\\Qxyz\\E","EOaWuC&e&DrvLP",[])), +?line <<"EOaWuCabc$xyzeabc$xyzDrvLP">> = iolist_to_binary(re:replace("abc$xyz","\\Qabc\\E\\$\\Qxyz\\E","EOaWuC&e&DrvLP",[global])), +?line <<"PUGabcRXWXakpQfboabcw">> = iolist_to_binary(re:replace("abc","\\Gabc","P\\1UG&R\\1XWXakpQfbo&w",[])), +?line <<"PUGabcRXWXakpQfboabcw">> = iolist_to_binary(re:replace("abc","\\Gabc","P\\1UG&R\\1XWXakpQfbo&w",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\Gabc","sssS\\1AVaXM&Is&c",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","\\Gabc","sssS\\1AVaXM&Is&c",[global])), +?line <<"xyzabc">> = iolist_to_binary(re:replace("xyzabc","\\Gabc","r",[])), +?line <<"xyzabc">> = iolist_to_binary(re:replace("xyzabc","\\Gabc","r",[global])), +?line <<"tScabc2xyzabc3">> = iolist_to_binary(re:replace("abc1abc2xyzabc3","\\Gabc.","tSc",[])), +?line <<"tSctScxyzabc3">> = iolist_to_binary(re:replace("abc1abc2xyzabc3","\\Gabc.","tSc",[global])), +?line <<"HcJuuopHFgbabc2xyzabc3">> = iolist_to_binary(re:replace("abc1abc2xyzabc3","abc.","HcJuuopHFgb",[])), +?line <<"HcJuuopHFgbHcJuuopHFgbxyzHcJuuopHFgb">> = iolist_to_binary(re:replace("abc1abc2xyzabc3","abc.","HcJuuopHFgb",[global])), +?line <<"XMSabcdaDVucwrGDirY">> = iolist_to_binary(re:replace("XabcdY","a(?x: b c )d","MS&aDVucwrGDir",[])), +?line <<"XMSabcdaDVucwrGDirY">> = iolist_to_binary(re:replace("XabcdY","a(?x: b c )d","MS&aDVucwrGDir",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a(?x: b c )d","paXT\\1iPxaNPv",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","a(?x: b c )d","paXT\\1iPxaNPv",[global])), +?line <<"Xa b c d Y">> = iolist_to_binary(re:replace("Xa b c d Y","a(?x: b c )d","FRHntJTvUtt&w\\1Mhj",[])), +?line <<"Xa b c d Y">> = iolist_to_binary(re:replace("Xa b c d Y","a(?x: b c )d","FRHntJTvUtt&w\\1Mhj",[global])), +?line <<"XabcY">> = iolist_to_binary(re:replace("XabcY","((?x)x y z | a b c)","\\1",[])), +?line <<"XabcY">> = iolist_to_binary(re:replace("XabcY","((?x)x y z | a b c)","\\1",[global])), +?line <<"AxyznocmxyzxyzxyzfWlBxyzPEB">> = iolist_to_binary(re:replace("AxyzB","((?x)x y z | a b c)","&nocm\\1&&fWlB&PE",[])), +?line <<"AxyznocmxyzxyzxyzfWlBxyzPEB">> = iolist_to_binary(re:replace("AxyzB","((?x)x y z | a b c)","&nocm\\1&&fWlB&PE",[global])), +?line <<"XqabCRwY">> = iolist_to_binary(re:replace("XabCY","(?i)AB(?-i)C","q&Rw",[])), +?line <<"XqabCRwY">> = iolist_to_binary(re:replace("XabCY","(?i)AB(?-i)C","q&Rw",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?i)AB(?-i)C","b&Qx",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","(?i)AB(?-i)C","b&Qx",[global])), +?line <<"XabcY">> = iolist_to_binary(re:replace("XabcY","(?i)AB(?-i)C","VjuCQPxKgGiffeGDHugc",[])), +?line <<"XabcY">> = iolist_to_binary(re:replace("XabcY","(?i)AB(?-i)C","VjuCQPxKgGiffeGDHugc",[global])), +?line <<"abCEApGxObicabCaHXabCib">> = iolist_to_binary(re:replace("abCE","((?i)AB(?-i)C|D)E","&ApGxObic\\1aHX\\1ib",[])), +?line <<"abCEApGxObicabCaHXabCib">> = iolist_to_binary(re:replace("abCE","((?i)AB(?-i)C|D)E","&ApGxObic\\1aHX\\1ib",[global])), +?line <<"uLoeOQwJDEyFGS">> = iolist_to_binary(re:replace("DE","((?i)AB(?-i)C|D)E","uLoeOQwJ&yFGS",[])), +?line <<"uLoeOQwJDEyFGS">> = iolist_to_binary(re:replace("DE","((?i)AB(?-i)C|D)E","uLoeOQwJ&yFGS",[global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","((?i)AB(?-i)C|D)E","LUuqtYqP\\1RCe",[])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","((?i)AB(?-i)C|D)E","LUuqtYqP\\1RCe",[global])), +?line <<"abcE">> = iolist_to_binary(re:replace("abcE","((?i)AB(?-i)C|D)E","\\1sXBxu\\1",[])), +?line <<"abcE">> = iolist_to_binary(re:replace("abcE","((?i)AB(?-i)C|D)E","\\1sXBxu\\1",[global])), +?line <<"abCe">> = iolist_to_binary(re:replace("abCe","((?i)AB(?-i)C|D)E","Y\\1Rgo\\1Ican\\1",[])), +?line <<"abCe">> = iolist_to_binary(re:replace("abCe","((?i)AB(?-i)C|D)E","Y\\1Rgo\\1Ican\\1",[global])), +?line <<"dE">> = iolist_to_binary(re:replace("dE","((?i)AB(?-i)C|D)E","XvslPbYV&&PG",[])), +?line <<"dE">> = iolist_to_binary(re:replace("dE","((?i)AB(?-i)C|D)E","XvslPbYV&&PG",[global])), +?line <<"De">> = iolist_to_binary(re:replace("De","((?i)AB(?-i)C|D)E","Ry\\1rxj\\1\\1dTXtld&\\1D&&",[])), +?line <<"De">> = iolist_to_binary(re:replace("De","((?i)AB(?-i)C|D)E","Ry\\1rxj\\1\\1dTXtld&\\1D&&",[global])), +?line <<"vyabc">> = iolist_to_binary(re:replace("abc123abc","(.*)\\d+\\1","vy\\1",[])), +?line <<"vyabc">> = iolist_to_binary(re:replace("abc123abc","(.*)\\d+\\1","vy\\1",[global])), +?line <<"aLB">> = iolist_to_binary(re:replace("abc123bc","(.*)\\d+\\1","LB",[])), +?line <<"aLB">> = iolist_to_binary(re:replace("abc123bc","(.*)\\d+\\1","LB",[global])), +?line <<"HXjXabc123abcabc123abcabc123abcfUay">> = iolist_to_binary(re:replace("abc123abc","(.*)\\d+\\1","HXjX&&&fUay",[dotall])), +?line <<"HXjXabc123abcabc123abcabc123abcfUay">> = iolist_to_binary(re:replace("abc123abc","(.*)\\d+\\1","HXjX&&&fUay",[dotall, + global])), +?line <<"aCRabcRSbc123bcbcokUUyuMbc123bcm">> = iolist_to_binary(re:replace("abc123bc","(.*)\\d+\\1","CRa\\1RS&\\1okUUyuM&m",[dotall])), +?line <<"aCRabcRSbc123bcbcokUUyuMbc123bcm">> = iolist_to_binary(re:replace("abc123bc","(.*)\\d+\\1","CRa\\1RS&\\1okUUyuM&m",[dotall, + global])), +?line <<"RvRabcJIYH">> = iolist_to_binary(re:replace("abc123abc","((.*))\\d+\\1","RvR\\1JIYH",[])), +?line <<"RvRabcJIYH">> = iolist_to_binary(re:replace("abc123abc","((.*))\\d+\\1","RvR\\1JIYH",[global])), +?line <<"aRbc123bcmb">> = iolist_to_binary(re:replace("abc123bc","((.*))\\d+\\1","R&mb",[])), +?line <<"aRbc123bcmb">> = iolist_to_binary(re:replace("abc123bc","((.*))\\d+\\1","R&mb",[global])), +?line <<"ET">> = iolist_to_binary(re:replace("a123::a123","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","ET",[extended,caseless])), +?line <<"ET">> = iolist_to_binary(re:replace("a123::a123","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","ET",[extended,caseless,global])), +?line <<"nYalhKtcGgINbn">> = iolist_to_binary(re:replace("a123:b342::abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","nY\\1a\\1lhKtcGgINbn",[extended,caseless])), +?line <<"nYalhKtcGgINbn">> = iolist_to_binary(re:replace("a123:b342::abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","nY\\1a\\1lhKtcGgINbn",[extended,caseless,global])), +?line <<"xeKa123:b342::324e:abcdRvTn">> = iolist_to_binary(re:replace("a123:b342::324e:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","xeK&RvTn",[extended,caseless])), +?line <<"xeKa123:b342::324e:abcdRvTn">> = iolist_to_binary(re:replace("a123:b342::324e:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","xeK&RvTn",[extended,caseless,global])), +?line <<"JHrQJuCtAvAt">> = iolist_to_binary(re:replace("a123:ddde:b342::324e:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","JHrQJuCtAvAt",[extended,caseless])), +?line <<"JHrQJuCtAvAt">> = iolist_to_binary(re:replace("a123:ddde:b342::324e:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","JHrQJuCtAvAt",[extended,caseless,global])), +?line <<"IphCja">> = iolist_to_binary(re:replace("a123:ddde:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","Ip\\1hCj\\1a",[extended,caseless])), +?line <<"IphCja">> = iolist_to_binary(re:replace("a123:ddde:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","Ip\\1hCj\\1a",[extended,caseless,global])), +?line <<"xAGmJctxEa123:ddde:9999:b342::324e:dcba:abcdjhClw">> = iolist_to_binary(re:replace("a123:ddde:9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","xAGmJctxE&jhClw",[extended,caseless])), +?line <<"xAGmJctxEa123:ddde:9999:b342::324e:dcba:abcdjhClw">> = iolist_to_binary(re:replace("a123:ddde:9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","xAGmJctxE&jhClw",[extended,caseless,global])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","&jc&",[extended,caseless])), +?line <<"*** Failers">> = iolist_to_binary(re:replace("*** Failers","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","&jc&",[extended,caseless,global])), +?line <<"1:2:3:4:5:6:7:8">> = iolist_to_binary(re:replace("1:2:3:4:5:6:7:8","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","xjuUU",[extended,caseless])), +?line <<"1:2:3:4:5:6:7:8">> = iolist_to_binary(re:replace("1:2:3:4:5:6:7:8","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","xjuUU",[extended,caseless,global])), +?line <<"a123:bce:ddde:9999:b342::324e:dcba:abcd">> = iolist_to_binary(re:replace("a123:bce:ddde:9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","&\\1gJElxfvxu\\1ly",[extended,caseless])), +?line <<"a123:bce:ddde:9999:b342::324e:dcba:abcd">> = iolist_to_binary(re:replace("a123:bce:ddde:9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","&\\1gJElxfvxu\\1ly",[extended,caseless,global])), +?line <<"a123::9999:b342::324e:dcba:abcd">> = iolist_to_binary(re:replace("a123::9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","r",[extended,caseless])), +?line <<"a123::9999:b342::324e:dcba:abcd">> = iolist_to_binary(re:replace("a123::9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","r",[extended,caseless,global])), +?line <<"abcde:2:3:4:5:6:7:8">> = iolist_to_binary(re:replace("abcde:2:3:4:5:6:7:8","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","\\1",[extended,caseless])), +?line <<"abcde:2:3:4:5:6:7:8">> = iolist_to_binary(re:replace("abcde:2:3:4:5:6:7:8","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","\\1",[extended,caseless,global])), +?line <<"::1">> = iolist_to_binary(re:replace("::1","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","ymau\\1\\1NVl\\1WdO\\1",[extended,caseless])), +?line <<"::1">> = iolist_to_binary(re:replace("::1","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","ymau\\1\\1NVl\\1WdO\\1",[extended,caseless,global])), +?line <<"abcd:fee0:123::">> = iolist_to_binary(re:replace("abcd:fee0:123::","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","KUuIBK&Px&",[extended,caseless])), +?line <<"abcd:fee0:123::">> = iolist_to_binary(re:replace("abcd:fee0:123::","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","KUuIBK&Px&",[extended,caseless,global])), +?line <<":1">> = iolist_to_binary(re:replace(":1","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","&BwNOmaJ\\1M&\\1TUCr",[extended,caseless])), +?line <<":1">> = iolist_to_binary(re:replace(":1","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","&BwNOmaJ\\1M&\\1TUCr",[extended,caseless,global])), +?line <<"1:">> = iolist_to_binary(re:replace("1:","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","J\\1e\\1",[extended,caseless])), +?line <<"1:">> = iolist_to_binary(re:replace("1:","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ","J\\1e\\1",[extended,caseless,global])), +?line <<"XpmPL">> = iolist_to_binary(re:replace("z","[z\\Qa-d]\\E]","\\1X\\1pmPL",[])), +?line <<"XpmPL">> = iolist_to_binary(re:replace("z","[z\\Qa-d]\\E]","\\1X\\1pmPL",[global])), +?line <<"WrMTefTPBbaVhaDwab">> = iolist_to_binary(re:replace("a","[z\\Qa-d]\\E]","WrMTefTPBb&V\\1\\1h&Dwab",[])), +?line <<"WrMTefTPBbaVhaDwab">> = iolist_to_binary(re:replace("a","[z\\Qa-d]\\E]","WrMTefTPBb&V\\1\\1h&Dwab",[global])), +?line <<"uFU-rQ-">> = iolist_to_binary(re:replace("-","[z\\Qa-d]\\E]","uFU\\1\\1&rQ&",[])), +?line <<"uFU-rQ-">> = iolist_to_binary(re:replace("-","[z\\Qa-d]\\E]","uFU\\1\\1&rQ&",[global])), +?line <<"QliOKMpfH">> = iolist_to_binary(re:replace("d","[z\\Qa-d]\\E]","QliOKMpfH",[])), +?line <<"QliOKMpfH">> = iolist_to_binary(re:replace("d","[z\\Qa-d]\\E]","QliOKMpfH",[global])), +?line <<"t]KdBE">> = iolist_to_binary(re:replace("]","[z\\Qa-d]\\E]","t\\1&KdBE",[])), +?line <<"t]KdBE">> = iolist_to_binary(re:replace("]","[z\\Qa-d]\\E]","t\\1&KdBE",[global])), +?line <<"*** FNavaiaOJGqPkBilers">> = iolist_to_binary(re:replace("*** Failers","[z\\Qa-d]\\E]","N&v&i\\1&OJGqPkB",[])), +?line <<"*** FNavaiaOJGqPkBilers">> = iolist_to_binary(re:replace("*** Failers","[z\\Qa-d]\\E]","N&v&i\\1&OJGqPkB",[global])), +?line <<"b">> = iolist_to_binary(re:replace("b","[z\\Qa-d]\\E]","R&ba",[])), +?line <<"b">> = iolist_to_binary(re:replace("b","[z\\Qa-d]\\E]","R&ba",[global])), +?line <<"sjzSKziFAAJiTVWC">> = iolist_to_binary(re:replace("z","[\\z\\C]","sj&SK&iFAAJiTVWC",[])), +?line <<"sjzSKziFAAJiTVWC">> = iolist_to_binary(re:replace("z","[\\z\\C]","sj&SK&iFAAJiTVWC",[global])), +?line <<"DDSbIgCmsBKCTmEuitn">> = iolist_to_binary(re:replace("C","[\\z\\C]","D\\1DSbIg&msBK&TmEuitn",[])), +?line <<"DDSbIgCmsBKCTmEuitn">> = iolist_to_binary(re:replace("C","[\\z\\C]","D\\1DSbIg&msBK&TmEuitn",[global])), +?line <<"cY">> = iolist_to_binary(re:replace("M","\\M","cY\\1",[])), +?line <<"cY">> = iolist_to_binary(re:replace("M","\\M","cY\\1",[global])), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(a+)*b","yWOTIFhIX\\1H",[])), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(a+)*b","yWOTIFhIX\\1H",[global])), +?line <<"NREGularsRREGularWEYrVRr">> = iolist_to_binary(re:replace("REGular","(?i)reg(?:ul(?:[aä]|ae)r|ex)","N&\\1sR&WEYrVRr",[])), +?line <<"NREGularsRREGularWEYrVRr">> = iolist_to_binary(re:replace("REGular","(?i)reg(?:ul(?:[aä]|ae)r|ex)","N&\\1sR&WEYrVRr",[global])), +?line <<"G">> = iolist_to_binary(re:replace("regulaer","(?i)reg(?:ul(?:[aä]|ae)r|ex)","G",[])), +?line <<"G">> = iolist_to_binary(re:replace("regulaer","(?i)reg(?:ul(?:[aä]|ae)r|ex)","G",[global])), +?line <<"PSsXtwlmy">> = iolist_to_binary(re:replace("Regex","(?i)reg(?:ul(?:[aä]|ae)r|ex)","PSsXtwlmy",[])), +?line <<"PSsXtwlmy">> = iolist_to_binary(re:replace("Regex","(?i)reg(?:ul(?:[aä]|ae)r|ex)","PSsXtwlmy",[global])), +?line <<"regulärmiYTi">> = iolist_to_binary(re:replace("regulär","(?i)reg(?:ul(?:[aä]|ae)r|ex)","&miYTi\\1\\1",[])), +?line <<"regulärmiYTi">> = iolist_to_binary(re:replace("regulär","(?i)reg(?:ul(?:[aä]|ae)r|ex)","&miYTi\\1\\1",[global])), +?line <<"WÅæåäàrxhÅæåäàyUoaLOIegmSA">> = iolist_to_binary(re:replace("Åæåäà","Åæåä[à-ÿÀ-ß]+","W&rxh&yUoaL\\1OIegmS\\1A",[])), +?line <<"WÅæåäàrxhÅæåäàyUoaLOIegmSA">> = iolist_to_binary(re:replace("Åæåäà","Åæåä[à-ÿÀ-ß]+","W&rxh&yUoaL\\1OIegmS\\1A",[global])), +?line <<"FÅæåäÿgnWPyHehÅæåäÿtXTQ">> = iolist_to_binary(re:replace("Åæåäÿ","Åæåä[à-ÿÀ-ß]+","F&gnWPyHe\\1h&tXTQ",[])), +?line <<"FÅæåäÿgnWPyHehÅæåäÿtXTQ">> = iolist_to_binary(re:replace("Åæåäÿ","Åæåä[à-ÿÀ-ß]+","F&gnWPyHe\\1h&tXTQ",[global])), +?line <<"sHerHnAhAdx">> = iolist_to_binary(re:replace("ÅæåäÀ","Åæåä[à-ÿÀ-ß]+","sHer\\1HnA\\1h\\1Adx",[])), +?line <<"sHerHnAhAdx">> = iolist_to_binary(re:replace("ÅæåäÀ","Åæåä[à-ÿÀ-ß]+","sHer\\1HnA\\1h\\1Adx",[global])), +?line <<"trobAQoUÅæåäßn">> = iolist_to_binary(re:replace("Åæåäß","Åæåä[à-ÿÀ-ß]+","tr\\1obAQoU&n",[])), +?line <<"trobAQoUÅæåäßn">> = iolist_to_binary(re:replace("Åæåäß","Åæåä[à-ÿÀ-ß]+","tr\\1obAQoU&n",[global])), +?line <<"„XAZSd">> = iolist_to_binary(re:replace("„XAZXB","(?<=Z)X.","Sd",[])), +?line <<"„XAZSd">> = iolist_to_binary(re:replace("„XAZXB","(?<=Z)X.","Sd",[global])), +?line <<"A">> = iolist_to_binary(re:replace("ab cd defg","ab cd (?x) de fg","\\1A\\1",[])), +?line <<"A">> = iolist_to_binary(re:replace("ab cd defg","ab cd (?x) de fg","\\1A\\1",[global])), +?line <<"fab cddefgLdtKCtPab cddefgxvVUHDah">> = iolist_to_binary(re:replace("ab cddefg","ab cd(?x) de fg","f&LdtKC\\1\\1tP&xvVUHDah",[])), +?line <<"fab cddefgLdtKCtPab cddefgxvVUHDah">> = iolist_to_binary(re:replace("ab cddefg","ab cd(?x) de fg","f&LdtKC\\1\\1tP&xvVUHDah",[global])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","ab cd(?x) de fg","BkO\\1dl&WNuvnGhG&Qkl",[])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","ab cd(?x) de fg","BkO\\1dl&WNuvnGhG&Qkl",[global])), +?line <<"abcddefg">> = iolist_to_binary(re:replace("abcddefg","ab cd(?x) de fg","SCJx&",[])), +?line <<"abcddefg">> = iolist_to_binary(re:replace("abcddefg","ab cd(?x) de fg","SCJx&",[global])), +?line <<"foobarLvX">> = iolist_to_binary(re:replace("foobarX","(?> = iolist_to_binary(re:replace("foobarX","(?> = iolist_to_binary(re:replace("** Failers","(?> = iolist_to_binary(re:replace("** Failers","(?> = iolist_to_binary(re:replace("boobarX","(?> = iolist_to_binary(re:replace("boobarX","(?> = iolist_to_binary(re:replace("offX","(?> = iolist_to_binary(re:replace("offX","(?> = iolist_to_binary(re:replace("** Failers","(?> = iolist_to_binary(re:replace("** Failers","(?> = iolist_to_binary(re:replace("onyX","(?> = iolist_to_binary(re:replace("onyX","(?> = iolist_to_binary(re:replace("onyX","(?<=[^f])X","\\1N&N",[])), +?line <<"onyNXN">> = iolist_to_binary(re:replace("onyX","(?<=[^f])X","\\1N&N",[global])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","(?<=[^f])X","kt&SCnnaVhTlQMnFltwd",[])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","(?<=[^f])X","kt&SCnnaVhTlQMnFltwd",[global])), +?line <<"offX">> = iolist_to_binary(re:replace("offX","(?<=[^f])X","UsgnsEG\\1LX&DB",[])), +?line <<"offX">> = iolist_to_binary(re:replace("offX","(?<=[^f])X","UsgnsEG\\1LX&DB",[global])), +?line <<"FOjOAeQxFFXja +b +c">> = iolist_to_binary(re:replace("a +b +c","^","FOjO&AeQx&FFXj",[multiline])), +?line <<"FOjOAeQxFFXja +FOjOAeQxFFXjb +FOjOAeQxFFXjc">> = iolist_to_binary(re:replace("a +b +c","^","FOjO&AeQx&FFXj",[multiline,global])), +?line <<"jwIVfrtVCpnVwNgju">> = iolist_to_binary(re:replace("","^","jwIVfrtVCpnVwNgju",[multiline])), +?line <<"jwIVfrtVCpnVwNgju">> = iolist_to_binary(re:replace("","^","jwIVfrtVCpnVwNgju",[multiline, + global])), +?line <<"A +C +sugWOwdKBC">> = iolist_to_binary(re:replace("A +C +C","(?<=C\\n)^","sugW&&\\1OwdKB",[multiline])), +?line <<"A +C +sugWOwdKBC">> = iolist_to_binary(re:replace("A +C +C","(?<=C\\n)^","sugW&&\\1OwdKB",[multiline,global])), +?line <<"dIXQXEThebXaXXcLjA">> = iolist_to_binary(re:replace("bXaX","(?:(?(1)a|b)(X))+","dI\\1Q\\1EThe&\\1cLjA",[])), +?line <<"dIXQXEThebXaXXcLjA">> = iolist_to_binary(re:replace("bXaX","(?:(?(1)a|b)(X))+","dI\\1Q\\1EThe&\\1cLjA",[global])), +?line <<"AvB">> = iolist_to_binary(re:replace("bXXaYYaY","(?:(?(1)\\1a|b)(X|Y))+","AvB",[])), +?line <<"AvB">> = iolist_to_binary(re:replace("bXXaYYaY","(?:(?(1)\\1a|b)(X|Y))+","AvB",[global])), +?line <<"EHtFjtbXESMPhXXYaXXaX">> = iolist_to_binary(re:replace("bXYaXXaX","(?:(?(1)\\1a|b)(X|Y))+","EHtFjt&ESMPh\\1\\1",[])), +?line <<"EHtFjtbXESMPhXXYaXXaX">> = iolist_to_binary(re:replace("bXYaXXaX","(?:(?(1)\\1a|b)(X|Y))+","EHtFjt&ESMPh\\1\\1",[global])), +?line <<"bXnIbjbXebXpecwXaYYaY">> = iolist_to_binary(re:replace("bXXaYYaY","()()()()()()()()()(?:(?(10)\\10a|b)(X|Y))+","&nIbj&\\1e&p\\1ecw",[])), +?line <<"bXnIbjbXebXpecwXaYYaY">> = iolist_to_binary(re:replace("bXXaYYaY","()()()()()()()()()(?:(?(10)\\10a|b)(X|Y))+","&nIbj&\\1e&p\\1ecw",[global])), +?line <<"Fv">> = iolist_to_binary(re:replace("abc]","[[,abc,]+]","Fv",[])), +?line <<"Fv">> = iolist_to_binary(re:replace("abc]","[[,abc,]+]","Fv",[global])), +?line <<"enGFFPGa,b]Vq">> = iolist_to_binary(re:replace("a,b]","[[,abc,]+]","enGFFPG&V\\1q",[])), +?line <<"enGFFPGa,b]Vq">> = iolist_to_binary(re:replace("a,b]","[[,abc,]+]","enGFFPG&V\\1q",[global])), +?line <<"SLU[a,b,c]KDFqnru[a,b,c]">> = iolist_to_binary(re:replace("[a,b,c]","[[,abc,]+]","SLU&KDFqnru&",[])), +?line <<"SLU[a,b,c]KDFqnru[a,b,c]">> = iolist_to_binary(re:replace("[a,b,c]","[[,abc,]+]","SLU&KDFqnru&",[global])), +?line <<"AFHpB">> = iolist_to_binary(re:replace("A B","(?-x: )","FHp",[extended])), +?line <<"AFHpB">> = iolist_to_binary(re:replace("A B","(?-x: )","FHp",[extended, + global])), +?line <<"ALptWSVme # # # B">> = iolist_to_binary(re:replace("A # B","(?x)(?-x: \\s*#\\s*)","LptWSVme&\\1&&",[])), +?line <<"ALptWSVme # # # B">> = iolist_to_binary(re:replace("A # B","(?x)(?-x: \\s*#\\s*)","LptWSVme&\\1&&",[global])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","(?x)(?-x: \\s*#\\s*)","enBY&\\1vE&\\1I\\1IhttjD\\1",[])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","(?x)(?-x: \\s*#\\s*)","enBY&\\1vE&\\1I\\1IhttjD\\1",[global])), +?line <<"#">> = iolist_to_binary(re:replace("#","(?x)(?-x: \\s*#\\s*)","c\\1cwAsih",[])), +?line <<"#">> = iolist_to_binary(re:replace("#","(?x)(?-x: \\s*#\\s*)","c\\1cwAsih",[global])), +?line <<"ARtjg #includeDy #includeg">> = iolist_to_binary(re:replace("A #include","(?x-is)(?:(?-ixs) \\s*#\\s*) include","Rtjg&Dy\\1&g",[])), +?line <<"ARtjg #includeDy #includeg">> = iolist_to_binary(re:replace("A #include","(?x-is)(?:(?-ixs) \\s*#\\s*) include","Rtjg&Dy\\1&g",[global])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","(?x-is)(?:(?-ixs) \\s*#\\s*) include","tYbpFaHd\\1GjcqHIWx\\1a",[])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","(?x-is)(?:(?-ixs) \\s*#\\s*) include","tYbpFaHd\\1GjcqHIWx\\1a",[global])), +?line <<"A#include">> = iolist_to_binary(re:replace("A#include","(?x-is)(?:(?-ixs) \\s*#\\s*) include","nv\\1tgvlSHVHyKOMPNXVF",[])), +?line <<"A#include">> = iolist_to_binary(re:replace("A#include","(?x-is)(?:(?-ixs) \\s*#\\s*) include","nv\\1tgvlSHVHyKOMPNXVF",[global])), +?line <<"A #Include">> = iolist_to_binary(re:replace("A #Include","(?x-is)(?:(?-ixs) \\s*#\\s*) include","kQdv",[])), +?line <<"A #Include">> = iolist_to_binary(re:replace("A #Include","(?x-is)(?:(?-ixs) \\s*#\\s*) include","kQdv",[global])), +?line <<"k">> = iolist_to_binary(re:replace("aaabbbb","a*b*\\w","k",[])), +?line <<"k">> = iolist_to_binary(re:replace("aaabbbb","a*b*\\w","k",[global])), +?line <<"xaaaa">> = iolist_to_binary(re:replace("aaaa","a*b*\\w","x&",[])), +?line <<"xaaaa">> = iolist_to_binary(re:replace("aaaa","a*b*\\w","x&",[global])), +?line <<"pOagbKtJauauHwjM">> = iolist_to_binary(re:replace("a","a*b*\\w","pOagbKtJ&uauHwjM",[])), +?line <<"pOagbKtJauauHwjM">> = iolist_to_binary(re:replace("a","a*b*\\w","pOagbKtJ&uauHwjM",[global])), +?line <<"tuaaabbPhWfMuDrCJEUabb">> = iolist_to_binary(re:replace("aaabbbb","a*b?\\w","tu&P\\1h\\1WfMu\\1Dr\\1CJEUa",[])), +?line <<"tuaaabbPhWfMuDrCJEUatubbPhWfMuDrCJEUa">> = iolist_to_binary(re:replace("aaabbbb","a*b?\\w","tu&P\\1h\\1WfMu\\1Dr\\1CJEUa",[global])), +?line <<"heEGaaaabPJaaaaaaaakUYNXaaaasNCaaaa">> = iolist_to_binary(re:replace("aaaa","a*b?\\w","heEG&bPJ&&kUYNX&sNC&",[])), +?line <<"heEGaaaabPJaaaaaaaakUYNXaaaasNCaaaa">> = iolist_to_binary(re:replace("aaaa","a*b?\\w","heEG&bPJ&&kUYNX&sNC&",[global])), +?line <<"cjDPFiqs">> = iolist_to_binary(re:replace("a","a*b?\\w","cjDPFiq\\1s",[])), +?line <<"cjDPFiqs">> = iolist_to_binary(re:replace("a","a*b?\\w","cjDPFiq\\1s",[global])), +?line <<"aaabbbbU">> = iolist_to_binary(re:replace("aaabbbb","a*b{0,4}\\w","&U",[])), +?line <<"aaabbbbU">> = iolist_to_binary(re:replace("aaabbbb","a*b{0,4}\\w","&U",[global])), +?line <<"kaaaavgaaaaFaaaa">> = iolist_to_binary(re:replace("aaaa","a*b{0,4}\\w","k&vg&F&",[])), +?line <<"kaaaavgaaaaFaaaa">> = iolist_to_binary(re:replace("aaaa","a*b{0,4}\\w","k&vg&F&",[global])), +?line <<"ahHM">> = iolist_to_binary(re:replace("a","a*b{0,4}\\w","&hHM",[])), +?line <<"ahHM">> = iolist_to_binary(re:replace("a","a*b{0,4}\\w","&hHM",[global])), +?line <<"aaabbbbkVyXSBUXNHaaabbbbSC">> = iolist_to_binary(re:replace("aaabbbb","a*b{0,}\\w","\\1&kVyXSBUXNH&SC\\1",[])), +?line <<"aaabbbbkVyXSBUXNHaaabbbbSC">> = iolist_to_binary(re:replace("aaabbbb","a*b{0,}\\w","\\1&kVyXSBUXNH&SC\\1",[global])), +?line <<"JsaaaaARjP">> = iolist_to_binary(re:replace("aaaa","a*b{0,}\\w","Js&ARjP",[])), +?line <<"JsaaaaARjP">> = iolist_to_binary(re:replace("aaaa","a*b{0,}\\w","Js&ARjP",[global])), +?line <<"safA">> = iolist_to_binary(re:replace("a","a*b{0,}\\w","s\\1&fA",[])), +?line <<"safA">> = iolist_to_binary(re:replace("a","a*b{0,}\\w","s\\1&fA",[global])), +?line <<"0aGcgVV0aXhLIJ">> = iolist_to_binary(re:replace("0a","a*\\d*\\w","&GcgVV&XhLIJ",[])), +?line <<"0aGcgVV0aXhLIJ">> = iolist_to_binary(re:replace("0a","a*\\d*\\w","&GcgVV&XhLIJ",[global])), +?line <<"OWJamuSoHvWtdO">> = iolist_to_binary(re:replace("a","a*\\d*\\w","OWJ&muSoHvWtdO",[])), +?line <<"OWJamuSoHvWtdO">> = iolist_to_binary(re:replace("a","a*\\d*\\w","OWJ&muSoHvWtdO",[global])), +?line <<"jLLQBsEdhgm">> = iolist_to_binary(re:replace("a","a*b *\\w","jLLQ\\1BsE\\1dhgm",[extended])), +?line <<"jLLQBsEdhgm">> = iolist_to_binary(re:replace("a","a*b *\\w","jLLQ\\1BsE\\1dhgm",[extended, + global])), +?line <<"JFKdkakQmYFCpg">> = iolist_to_binary(re:replace("a","a*b#comment + *\\w","JFKdk&kQmYFCpg",[extended])), +?line <<"JFKdkakQmYFCpg">> = iolist_to_binary(re:replace("a","a*b#comment + *\\w","JFKdk&kQmYFCpg",[extended,global])), +?line <<"UeHUaDNFkPaoa">> = iolist_to_binary(re:replace("a","a* b *\\w","UeHU&DNFkP&o&\\1",[extended])), +?line <<"UeHUaDNFkPaoa">> = iolist_to_binary(re:replace("a","a* b *\\w","UeHU&DNFkP&o&\\1",[extended, + global])), +?line <<"Qomltkg +pqr">> = iolist_to_binary(re:replace("abc=xyz\\ +pqr","^\\w+=.*(\\\\\\n.*)*","\\1Qomltkg",[])), +?line <<"Qomltkg +pqr">> = iolist_to_binary(re:replace("abc=xyz\\ +pqr","^\\w+=.*(\\\\\\n.*)*","\\1Qomltkg",[global])), +?line <<"abcdVXTDna">> = iolist_to_binary(re:replace("abcd:","(?=(\\w+))\\1:","\\1VXTDna",[])), +?line <<"abcdVXTDna">> = iolist_to_binary(re:replace("abcd:","(?=(\\w+))\\1:","\\1VXTDna",[global])), +?line <<"dxHUL">> = iolist_to_binary(re:replace("abcd:","^(?=(\\w+))\\1:","dxHUL",[])), +?line <<"dxHUL">> = iolist_to_binary(re:replace("abcd:","^(?=(\\w+))\\1:","dxHUL",[global])), +?line <<"HsivTabcLabcC">> = iolist_to_binary(re:replace("abc","^\\Eabc","H\\1\\1sivT&L&C\\1",[])), +?line <<"HsivTabcLabcC">> = iolist_to_binary(re:replace("abc","^\\Eabc","H\\1\\1sivT&L&C\\1",[global])), +?line <<"HaCuWiasgghyJxOoaVMR">> = iolist_to_binary(re:replace("a","^[\\Eabc]","HaCuWi&sgghyJxOo&VMR",[])), +?line <<"HaCuWiasgghyJxOoaVMR">> = iolist_to_binary(re:replace("a","^[\\Eabc]","HaCuWi&sgghyJxOo&VMR",[global])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","^[\\Eabc]","Lc&Jjl&YLfuY",[])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","^[\\Eabc]","Lc&Jjl&YLfuY",[global])), +?line <<"E">> = iolist_to_binary(re:replace("E","^[\\Eabc]","MS\\1e",[])), +?line <<"E">> = iolist_to_binary(re:replace("E","^[\\Eabc]","MS\\1e",[global])), +?line <<"rtpBWkcLbtGo">> = iolist_to_binary(re:replace("b","^[a-\\Ec]","rtpBWkcL&\\1tGo",[])), +?line <<"rtpBWkcLbtGo">> = iolist_to_binary(re:replace("b","^[a-\\Ec]","rtpBWkcL&\\1tGo",[global])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","^[a-\\Ec]","IC&T\\1r",[])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","^[a-\\Ec]","IC&T\\1r",[global])), +?line <<"-">> = iolist_to_binary(re:replace("-","^[a-\\Ec]","CoL\\1S\\1d",[])), +?line <<"-">> = iolist_to_binary(re:replace("-","^[a-\\Ec]","CoL\\1S\\1d",[global])), +?line <<"E">> = iolist_to_binary(re:replace("E","^[a-\\Ec]","\\1T",[])), +?line <<"E">> = iolist_to_binary(re:replace("E","^[a-\\Ec]","\\1T",[global])), +?line <<"nbUnfwIYbbDEgCj">> = iolist_to_binary(re:replace("b","^[a\\E\\E-\\Ec]","n&Un\\1fwIY\\1&&DEgCj",[])), +?line <<"nbUnfwIYbbDEgCj">> = iolist_to_binary(re:replace("b","^[a\\E\\E-\\Ec]","n&Un\\1fwIY\\1&&DEgCj",[global])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","^[a\\E\\E-\\Ec]","P\\1VvOTyOaT",[])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","^[a\\E\\E-\\Ec]","P\\1VvOTyOaT",[global])), +?line <<"-">> = iolist_to_binary(re:replace("-","^[a\\E\\E-\\Ec]","XYUeR",[])), +?line <<"-">> = iolist_to_binary(re:replace("-","^[a\\E\\E-\\Ec]","XYUeR",[global])), +?line <<"E">> = iolist_to_binary(re:replace("E","^[a\\E\\E-\\Ec]","PeFBbxifgd",[])), +?line <<"E">> = iolist_to_binary(re:replace("E","^[a\\E\\E-\\Ec]","PeFBbxifgd",[global])), +?line <<"pdeFkRdPoflblrWho">> = iolist_to_binary(re:replace("b","^[\\E\\Qa\\E-\\Qz\\E]+","pdeFkRdPofl&lrWho\\1",[])), +?line <<"pdeFkRdPoflblrWho">> = iolist_to_binary(re:replace("b","^[\\E\\Qa\\E-\\Qz\\E]+","pdeFkRdPofl&lrWho\\1",[global])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","^[\\E\\Qa\\E-\\Qz\\E]+","mXYgE\\1\\1",[])), +?line <<"** Failers">> = iolist_to_binary(re:replace("** Failers","^[\\E\\Qa\\E-\\Qz\\E]+","mXYgE\\1\\1",[global])), +?line <<"-">> = iolist_to_binary(re:replace("-","^[\\E\\Qa\\E-\\Qz\\E]+","KLdkiRi",[])), +?line <<"-">> = iolist_to_binary(re:replace("-","^[\\E\\Qa\\E-\\Qz\\E]+","KLdkiRi",[global])), +?line <<"CAXhbVsbB">> = iolist_to_binary(re:replace("a","^[a\\Q]bc\\E]","CAXh\\1bVsbB",[])), +?line <<"CAXhbVsbB">> = iolist_to_binary(re:replace("a","^[a\\Q]bc\\E]","CAXh\\1bVsbB",[global])), +?line <<"YFgJL]GhQVUD]Pbp">> = iolist_to_binary(re:replace("]","^[a\\Q]bc\\E]","YFgJL&GhQVU\\1D&Pbp",[])), +?line <<"YFgJL]GhQVUD]Pbp">> = iolist_to_binary(re:replace("]","^[a\\Q]bc\\E]","YFgJL&GhQVU\\1D&Pbp",[global])), +?line <<"waUcGiVGxIcKiccYmjc">> = iolist_to_binary(re:replace("c","^[a\\Q]bc\\E]","waU&GiVGxI&Ki&cYmj&",[])), +?line <<"waUcGiVGxIcKiccYmjc">> = iolist_to_binary(re:replace("c","^[a\\Q]bc\\E]","waU&GiVGxI&Ki&cYmj&",[global])), +?line <<"yfaacSB">> = iolist_to_binary(re:replace("a","^[a-\\Q\\E]","yf&\\1acSB",[])), +?line <<"yfaacSB">> = iolist_to_binary(re:replace("a","^[a-\\Q\\E]","yf&\\1acSB",[global])), +?line <<"f">> = iolist_to_binary(re:replace("-","^[a-\\Q\\E]","f",[])), +?line <<"f">> = iolist_to_binary(re:replace("-","^[a-\\Q\\E]","f",[global])), +?line <<"S">> = iolist_to_binary(re:replace("aaaa","^(a()*)*","S",[])), +?line <<"S">> = iolist_to_binary(re:replace("aaaa","^(a()*)*","S",[global])), +?line <<"BPPbuaaaaufIV">> = iolist_to_binary(re:replace("aaaa","^(?:a(?:(?:))*)*","BPPbu&ufIV",[])), +?line <<"BPPbuaaaaufIV">> = iolist_to_binary(re:replace("aaaa","^(?:a(?:(?:))*)*","BPPbu&ufIV",[global])), +?line <<"HBMaaaafDaRVOv">> = iolist_to_binary(re:replace("aaaa","^(a()+)+","HBM&fD\\1RVOv",[])), +?line <<"HBMaaaafDaRVOv">> = iolist_to_binary(re:replace("aaaa","^(a()+)+","HBM&fD\\1RVOv",[global])), +?line <<"JvvaaaaaaaaXGaaaawkPaaaaNqM">> = iolist_to_binary(re:replace("aaaa","^(?:a(?:(?:))+)+","J\\1vv\\1\\1&&XG&w\\1kP&N\\1qM",[])), +?line <<"JvvaaaaaaaaXGaaaawkPaaaaNqM">> = iolist_to_binary(re:replace("aaaa","^(?:a(?:(?:))+)+","J\\1vv\\1\\1&&XG&w\\1kP&N\\1qM",[global])), +?line <<"GlQPoT">> = iolist_to_binary(re:replace("abbD","(a){0,3}(?(1)b|(c|))*D","GlQPoT",[])), +?line <<"GlQPoT">> = iolist_to_binary(re:replace("abbD","(a){0,3}(?(1)b|(c|))*D","GlQPoT",[global])), +?line <<"ApBccccD">> = iolist_to_binary(re:replace("ccccD","(a){0,3}(?(1)b|(c|))*D","\\1\\1ApB&",[])), +?line <<"ApBccccD">> = iolist_to_binary(re:replace("ccccD","(a){0,3}(?(1)b|(c|))*D","\\1\\1ApB&",[global])), +?line <<"BC">> = iolist_to_binary(re:replace("D","(a){0,3}(?(1)b|(c|))*D","BC",[])), +?line <<"BC">> = iolist_to_binary(re:replace("D","(a){0,3}(?(1)b|(c|))*D","BC",[global])), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(a|)*\\d","gsB\\1",[])), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(a|)*\\d","gsB\\1",[global])), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4FVLiMHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4hlau">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(a|)*\\d","&F\\1VLiMH&hlau",[])), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4FVLiMHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4hlau">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(a|)*\\d","&F\\1VLiMH&hlau",[global])), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(?>a|)*\\d","PkrWG&pe\\1uUD&sBHqm",[])), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(?>a|)*\\d","PkrWG&pe\\1uUD&sBHqm",[global])), +?line <<"KmL">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(?>a|)*\\d","KmL",[])), +?line <<"KmL">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(?>a|)*\\d","KmL",[global])), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(?:a|)*\\d","&HUPIn&&&uUmDmrCoAY",[])), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(?:a|)*\\d","&HUPIn&&&uUmDmrCoAY",[global])), +?line <<"Q">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(?:a|)*\\d","Q",[])), +?line <<"Q">> = iolist_to_binary(re:replace("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(?:a|)*\\d","Q",[global])), +?line <<"abcR">> = iolist_to_binary(re:replace("abc","\\Z","R",[])), +?line <<"abcR">> = iolist_to_binary(re:replace("abc","\\Z","R",[global])), +?line <<"GwfabcD">> = iolist_to_binary(re:replace("abc","^(?s)(?>.*)(?> = iolist_to_binary(re:replace("abc","^(?s)(?>.*)(?> = iolist_to_binary(re:replace("abc","^(?s)(?>.*)(?> = iolist_to_binary(re:replace("abc","^(?s)(?>.*)(?> = iolist_to_binary(re:replace("abc","^(?![^\\n]*\\n\\z)","f",[])), +?line <<"fabc">> = iolist_to_binary(re:replace("abc","^(?![^\\n]*\\n\\z)","f",[global])), +?line <<"cKyLyGabc">> = iolist_to_binary(re:replace("abc","^(?![^\\n]*\\n\\z)","cKyL\\1yG",[])), +?line <<"cKyLyGabc">> = iolist_to_binary(re:replace("abc","^(?![^\\n]*\\n\\z)","cKyL\\1yG",[global])), +?line <<"abcKoYH">> = iolist_to_binary(re:replace("abc","\\z(?> = iolist_to_binary(re:replace("abc","\\z(?> = iolist_to_binary(re:replace("abc","\\z(?> = iolist_to_binary(re:replace("abc","\\z(?> = iolist_to_binary(re:replace("abcd","(.*(.)?)*","l&J\\1&NUhUnH",[])), +?line <<"labcdJabcdNUhUnHlJNUhUnH">> = iolist_to_binary(re:replace("abcd","(.*(.)?)*","l&J\\1&NUhUnH",[global])), +?line <<"onfTbTLJLVnabcd">> = iolist_to_binary(re:replace("abcd","( (A | (?(1)0|) )* )","onfTbTLJLVn",[extended])), +?line <<"onfTbTLJLVnaonfTbTLJLVnbonfTbTLJLVnconfTbTLJLVndonfTbTLJLVn">> = iolist_to_binary(re:replace("abcd","( (A | (?(1)0|) )* )","onfTbTLJLVn",[extended, + global])), +?line <<"rilgPabcd">> = iolist_to_binary(re:replace("abcd","( ( (?(1)0|) )* )","ri\\1&lgP",[extended])), +?line <<"rilgParilgPbrilgPcrilgPdrilgP">> = iolist_to_binary(re:replace("abcd","( ( (?(1)0|) )* )","ri\\1&lgP",[extended, + global])), +?line <<"LjAUxSNabcd">> = iolist_to_binary(re:replace("abcd","( (?(1)0|)* )","L\\1jAUxSN\\1",[extended])), +?line <<"LjAUxSNaLjAUxSNbLjAUxSNcLjAUxSNdLjAUxSN">> = iolist_to_binary(re:replace("abcd","( (?(1)0|)* )","L\\1jAUxSN\\1",[extended, + global])), +?line <<"xYgnYjja]Bgw">> = iolist_to_binary(re:replace("a]","[[:abcd:xyz]]","\\1xYgnYjj&Bgw",[])), +?line <<"xYgnYjja]Bgw">> = iolist_to_binary(re:replace("a]","[[:abcd:xyz]]","\\1xYgnYjj&Bgw",[global])), +?line <<"K:]Y:]tTEIHHPgm">> = iolist_to_binary(re:replace(":]","[[:abcd:xyz]]","K\\1&Y&tT\\1EI\\1H\\1HP\\1gm",[])), +?line <<"K:]Y:]tTEIHHPgm">> = iolist_to_binary(re:replace(":]","[[:abcd:xyz]]","K\\1&Y&tT\\1EI\\1H\\1HP\\1gm",[global])), +?line <<"pcaYhpF">> = iolist_to_binary(re:replace("a","[abc[:x\\]pqr]","pc&Y\\1hpF",[])), +?line <<"pcaYhpF">> = iolist_to_binary(re:replace("a","[abc[:x\\]pqr]","pc&Y\\1hpF",[global])), +?line <<"I[">> = iolist_to_binary(re:replace("[","[abc[:x\\]pqr]","I\\1&",[])), +?line <<"I[">> = iolist_to_binary(re:replace("[","[abc[:x\\]pqr]","I\\1&",[global])), +?line <<"SYn:iPpASU">> = iolist_to_binary(re:replace(":","[abc[:x\\]pqr]","SY\\1n&iP\\1pAS\\1U",[])), +?line <<"SYn:iPpASU">> = iolist_to_binary(re:replace(":","[abc[:x\\]pqr]","SY\\1n&iP\\1pAS\\1U",[global])), +?line <<"VwLRsMyuKqCwx">> = iolist_to_binary(re:replace("]","[abc[:x\\]pqr]","VwLRsMyuKqCwx",[])), +?line <<"VwLRsMyuKqCwx">> = iolist_to_binary(re:replace("]","[abc[:x\\]pqr]","VwLRsMyuKqCwx",[global])), +?line <<"YqUufuU">> = iolist_to_binary(re:replace("p","[abc[:x\\]pqr]","YqU\\1ufuU",[])), +?line <<"YqUufuU">> = iolist_to_binary(re:replace("p","[abc[:x\\]pqr]","YqU\\1ufuU",[global])), +ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/re_testoutput1_split_test.erl erlang-13.b.3-dfsg/lib/stdlib/test/re_testoutput1_split_test.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/re_testoutput1_split_test.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/re_testoutput1_split_test.erl 2009-11-20 13:32:42.000000000 +0000 @@ -0,0 +1,29418 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(re_testoutput1_split_test). +-compile(export_all). +-include("test_server.hrl"). +%% This file is generated by running run_pcre_tests:gen_split_test("re_SUITE_data/testoutput1") +join([]) -> []; +join([A]) -> [A]; +join([H|T]) -> [H,<<":">>|join(T)]. +run() -> +?line <<"">> = iolist_to_binary(join(re:split("the quick brown fox","the quick brown fox",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("the quick brown fox","the quick brown fox",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("the quick brown fox","the quick brown fox",[]))), +?line <<"The quick brown FOX">> = iolist_to_binary(join(re:split("The quick brown FOX","the quick brown fox",[trim]))), +?line <<"The quick brown FOX">> = iolist_to_binary(join(re:split("The quick brown FOX","the quick brown fox",[{parts, + 2}]))), +?line <<"The quick brown FOX">> = iolist_to_binary(join(re:split("The quick brown FOX","the quick brown fox",[]))), +?line <<"What do you know about :?">> = iolist_to_binary(join(re:split("What do you know about the quick brown fox?","the quick brown fox",[trim]))), +?line <<"What do you know about :?">> = iolist_to_binary(join(re:split("What do you know about the quick brown fox?","the quick brown fox",[{parts, + 2}]))), +?line <<"What do you know about :?">> = iolist_to_binary(join(re:split("What do you know about the quick brown fox?","the quick brown fox",[]))), +?line <<"What do you know about THE QUICK BROWN FOX?">> = iolist_to_binary(join(re:split("What do you know about THE QUICK BROWN FOX?","the quick brown fox",[trim]))), +?line <<"What do you know about THE QUICK BROWN FOX?">> = iolist_to_binary(join(re:split("What do you know about THE QUICK BROWN FOX?","the quick brown fox",[{parts, + 2}]))), +?line <<"What do you know about THE QUICK BROWN FOX?">> = iolist_to_binary(join(re:split("What do you know about THE QUICK BROWN FOX?","the quick brown fox",[]))), +?line <<"">> = iolist_to_binary(join(re:split("the quick brown fox","The quick brown fox",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("the quick brown fox","The quick brown fox",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("the quick brown fox","The quick brown fox",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("The quick brown FOX","The quick brown fox",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("The quick brown FOX","The quick brown fox",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("The quick brown FOX","The quick brown fox",[caseless]))), +?line <<"What do you know about :?">> = iolist_to_binary(join(re:split("What do you know about the quick brown fox?","The quick brown fox",[caseless, + trim]))), +?line <<"What do you know about :?">> = iolist_to_binary(join(re:split("What do you know about the quick brown fox?","The quick brown fox",[caseless, + {parts, + 2}]))), +?line <<"What do you know about :?">> = iolist_to_binary(join(re:split("What do you know about the quick brown fox?","The quick brown fox",[caseless]))), +?line <<"What do you know about :?">> = iolist_to_binary(join(re:split("What do you know about THE QUICK BROWN FOX?","The quick brown fox",[caseless, + trim]))), +?line <<"What do you know about :?">> = iolist_to_binary(join(re:split("What do you know about THE QUICK BROWN FOX?","The quick brown fox",[caseless, + {parts, + 2}]))), +?line <<"What do you know about :?">> = iolist_to_binary(join(re:split("What do you know about THE QUICK BROWN FOX?","The quick brown fox",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("abcd + 9;$\\?caxyz","abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd + 9;$\\?caxyz","abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd + 9;$\\?caxyz","abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abxyzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abxyzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abxyzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aabxyzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aabxyzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aabxyzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaabxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcxyzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcxyzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcxyzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aabcxyzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aabcxyzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aabcxyzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabcxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypABzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypABzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypABzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypABBzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypABBzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypABBzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<">>>">> = iolist_to_binary(join(re:split(">>>aaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<">>>:">> = iolist_to_binary(join(re:split(">>>aaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<">>>:">> = iolist_to_binary(join(re:split(">>>aaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<">">> = iolist_to_binary(join(re:split(">aaaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<">:">> = iolist_to_binary(join(re:split(">aaaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<">:">> = iolist_to_binary(join(re:split(">aaaabxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<">>>>">> = iolist_to_binary(join(re:split(">>>>abcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<">>>>:">> = iolist_to_binary(join(re:split(">>>>abcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<">>>>:">> = iolist_to_binary(join(re:split(">>>>abcxyzpqrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"abxyzpqrrabbxyyyypqAzz">> = iolist_to_binary(join(re:split("abxyzpqrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<"abxyzpqrrabbxyyyypqAzz">> = iolist_to_binary(join(re:split("abxyzpqrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<"abxyzpqrrabbxyyyypqAzz">> = iolist_to_binary(join(re:split("abxyzpqrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"abxyzpqrrrrabbxyyyypqAzz">> = iolist_to_binary(join(re:split("abxyzpqrrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<"abxyzpqrrrrabbxyyyypqAzz">> = iolist_to_binary(join(re:split("abxyzpqrrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<"abxyzpqrrrrabbxyyyypqAzz">> = iolist_to_binary(join(re:split("abxyzpqrrrrabbxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"abxyzpqrrrabxyyyypqAzz">> = iolist_to_binary(join(re:split("abxyzpqrrrabxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<"abxyzpqrrrabxyyyypqAzz">> = iolist_to_binary(join(re:split("abxyzpqrrrabxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<"abxyzpqrrrabxyyyypqAzz">> = iolist_to_binary(join(re:split("abxyzpqrrrabxyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<"aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<"aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"aaaabcxyzzzzpqrrrabbbxyyypqAzz">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<"aaaabcxyzzzzpqrrrabbbxyyypqAzz">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<"aaaabcxyzzzzpqrrrabbbxyyypqAzz">> = iolist_to_binary(join(re:split("aaaabcxyzzzzpqrrrabbbxyyypqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<"aaabcxyzpqrrrabbxyyyypqqqqqqqAzz">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[trim]))), +?line <<"aaabcxyzpqrrrabbxyyyypqqqqqqqAzz">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[{parts, + 2}]))), +?line <<"aaabcxyzpqrrrabbxyyyypqqqqqqqAzz">> = iolist_to_binary(join(re:split("aaabcxyzpqrrrabbxyyyypqqqqqqqAzz","a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abczz","^(abc){1,2}zz",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abczz","^(abc){1,2}zz",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abczz","^(abc){1,2}zz",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abcabczz","^(abc){1,2}zz",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcabczz","^(abc){1,2}zz",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcabczz","^(abc){1,2}zz",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(abc){1,2}zz",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(abc){1,2}zz",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(abc){1,2}zz",[]))), +?line <<"zz">> = iolist_to_binary(join(re:split("zz","^(abc){1,2}zz",[trim]))), +?line <<"zz">> = iolist_to_binary(join(re:split("zz","^(abc){1,2}zz",[{parts, + 2}]))), +?line <<"zz">> = iolist_to_binary(join(re:split("zz","^(abc){1,2}zz",[]))), +?line <<"abcabcabczz">> = iolist_to_binary(join(re:split("abcabcabczz","^(abc){1,2}zz",[trim]))), +?line <<"abcabcabczz">> = iolist_to_binary(join(re:split("abcabcabczz","^(abc){1,2}zz",[{parts, + 2}]))), +?line <<"abcabcabczz">> = iolist_to_binary(join(re:split("abcabcabczz","^(abc){1,2}zz",[]))), +?line <<">>abczz">> = iolist_to_binary(join(re:split(">>abczz","^(abc){1,2}zz",[trim]))), +?line <<">>abczz">> = iolist_to_binary(join(re:split(">>abczz","^(abc){1,2}zz",[{parts, + 2}]))), +?line <<">>abczz">> = iolist_to_binary(join(re:split(">>abczz","^(abc){1,2}zz",[]))), +?line <<":b">> = iolist_to_binary(join(re:split("bc","^(b+?|a){1,2}?c",[trim]))), +?line <<":b:">> = iolist_to_binary(join(re:split("bc","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":b:">> = iolist_to_binary(join(re:split("bc","^(b+?|a){1,2}?c",[]))), +?line <<":b">> = iolist_to_binary(join(re:split("bbc","^(b+?|a){1,2}?c",[trim]))), +?line <<":b:">> = iolist_to_binary(join(re:split("bbc","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":b:">> = iolist_to_binary(join(re:split("bbc","^(b+?|a){1,2}?c",[]))), +?line <<":bb">> = iolist_to_binary(join(re:split("bbbc","^(b+?|a){1,2}?c",[trim]))), +?line <<":bb:">> = iolist_to_binary(join(re:split("bbbc","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":bb:">> = iolist_to_binary(join(re:split("bbbc","^(b+?|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bac","^(b+?|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bac","^(b+?|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbac","^(b+?|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbac","^(b+?|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aac","^(b+?|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aac","^(b+?|a){1,2}?c",[]))), +?line <<":bbbbbbbbbbb">> = iolist_to_binary(join(re:split("abbbbbbbbbbbc","^(b+?|a){1,2}?c",[trim]))), +?line <<":bbbbbbbbbbb:">> = iolist_to_binary(join(re:split("abbbbbbbbbbbc","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":bbbbbbbbbbb:">> = iolist_to_binary(join(re:split("abbbbbbbbbbbc","^(b+?|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbbbbbbbbbbac","^(b+?|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbbbbbbbbac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbbbbbbbbac","^(b+?|a){1,2}?c",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(b+?|a){1,2}?c",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(b+?|a){1,2}?c",[]))), +?line <<"aaac">> = iolist_to_binary(join(re:split("aaac","^(b+?|a){1,2}?c",[trim]))), +?line <<"aaac">> = iolist_to_binary(join(re:split("aaac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<"aaac">> = iolist_to_binary(join(re:split("aaac","^(b+?|a){1,2}?c",[]))), +?line <<"abbbbbbbbbbbac">> = iolist_to_binary(join(re:split("abbbbbbbbbbbac","^(b+?|a){1,2}?c",[trim]))), +?line <<"abbbbbbbbbbbac">> = iolist_to_binary(join(re:split("abbbbbbbbbbbac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<"abbbbbbbbbbbac">> = iolist_to_binary(join(re:split("abbbbbbbbbbbac","^(b+?|a){1,2}?c",[]))), +?line <<":b">> = iolist_to_binary(join(re:split("bc","^(b+|a){1,2}c",[trim]))), +?line <<":b:">> = iolist_to_binary(join(re:split("bc","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<":b:">> = iolist_to_binary(join(re:split("bc","^(b+|a){1,2}c",[]))), +?line <<":bb">> = iolist_to_binary(join(re:split("bbc","^(b+|a){1,2}c",[trim]))), +?line <<":bb:">> = iolist_to_binary(join(re:split("bbc","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<":bb:">> = iolist_to_binary(join(re:split("bbc","^(b+|a){1,2}c",[]))), +?line <<":bbb">> = iolist_to_binary(join(re:split("bbbc","^(b+|a){1,2}c",[trim]))), +?line <<":bbb:">> = iolist_to_binary(join(re:split("bbbc","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<":bbb:">> = iolist_to_binary(join(re:split("bbbc","^(b+|a){1,2}c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bac","^(b+|a){1,2}c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bac","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bac","^(b+|a){1,2}c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbac","^(b+|a){1,2}c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbac","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbac","^(b+|a){1,2}c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aac","^(b+|a){1,2}c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aac","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aac","^(b+|a){1,2}c",[]))), +?line <<":bbbbbbbbbbb">> = iolist_to_binary(join(re:split("abbbbbbbbbbbc","^(b+|a){1,2}c",[trim]))), +?line <<":bbbbbbbbbbb:">> = iolist_to_binary(join(re:split("abbbbbbbbbbbc","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<":bbbbbbbbbbb:">> = iolist_to_binary(join(re:split("abbbbbbbbbbbc","^(b+|a){1,2}c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbbbbbbbbbbac","^(b+|a){1,2}c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbbbbbbbbac","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbbbbbbbbac","^(b+|a){1,2}c",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(b+|a){1,2}c",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(b+|a){1,2}c",[]))), +?line <<"aaac">> = iolist_to_binary(join(re:split("aaac","^(b+|a){1,2}c",[trim]))), +?line <<"aaac">> = iolist_to_binary(join(re:split("aaac","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<"aaac">> = iolist_to_binary(join(re:split("aaac","^(b+|a){1,2}c",[]))), +?line <<"abbbbbbbbbbbac">> = iolist_to_binary(join(re:split("abbbbbbbbbbbac","^(b+|a){1,2}c",[trim]))), +?line <<"abbbbbbbbbbbac">> = iolist_to_binary(join(re:split("abbbbbbbbbbbac","^(b+|a){1,2}c",[{parts, + 2}]))), +?line <<"abbbbbbbbbbbac">> = iolist_to_binary(join(re:split("abbbbbbbbbbbac","^(b+|a){1,2}c",[]))), +?line <<":b">> = iolist_to_binary(join(re:split("bbc","^(b+|a){1,2}?bc",[trim]))), +?line <<":b:">> = iolist_to_binary(join(re:split("bbc","^(b+|a){1,2}?bc",[{parts, + 2}]))), +?line <<":b:">> = iolist_to_binary(join(re:split("bbc","^(b+|a){1,2}?bc",[]))), +?line <<":ba">> = iolist_to_binary(join(re:split("babc","^(b*|ba){1,2}?bc",[trim]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("babc","^(b*|ba){1,2}?bc",[{parts, + 2}]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("babc","^(b*|ba){1,2}?bc",[]))), +?line <<":ba">> = iolist_to_binary(join(re:split("bbabc","^(b*|ba){1,2}?bc",[trim]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("bbabc","^(b*|ba){1,2}?bc",[{parts, + 2}]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("bbabc","^(b*|ba){1,2}?bc",[]))), +?line <<":ba">> = iolist_to_binary(join(re:split("bababc","^(b*|ba){1,2}?bc",[trim]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("bababc","^(b*|ba){1,2}?bc",[{parts, + 2}]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("bababc","^(b*|ba){1,2}?bc",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(b*|ba){1,2}?bc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(b*|ba){1,2}?bc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(b*|ba){1,2}?bc",[]))), +?line <<"bababbc">> = iolist_to_binary(join(re:split("bababbc","^(b*|ba){1,2}?bc",[trim]))), +?line <<"bababbc">> = iolist_to_binary(join(re:split("bababbc","^(b*|ba){1,2}?bc",[{parts, + 2}]))), +?line <<"bababbc">> = iolist_to_binary(join(re:split("bababbc","^(b*|ba){1,2}?bc",[]))), +?line <<"babababc">> = iolist_to_binary(join(re:split("babababc","^(b*|ba){1,2}?bc",[trim]))), +?line <<"babababc">> = iolist_to_binary(join(re:split("babababc","^(b*|ba){1,2}?bc",[{parts, + 2}]))), +?line <<"babababc">> = iolist_to_binary(join(re:split("babababc","^(b*|ba){1,2}?bc",[]))), +?line <<":ba">> = iolist_to_binary(join(re:split("babc","^(ba|b*){1,2}?bc",[trim]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("babc","^(ba|b*){1,2}?bc",[{parts, + 2}]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("babc","^(ba|b*){1,2}?bc",[]))), +?line <<":ba">> = iolist_to_binary(join(re:split("bbabc","^(ba|b*){1,2}?bc",[trim]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("bbabc","^(ba|b*){1,2}?bc",[{parts, + 2}]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("bbabc","^(ba|b*){1,2}?bc",[]))), +?line <<":ba">> = iolist_to_binary(join(re:split("bababc","^(ba|b*){1,2}?bc",[trim]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("bababc","^(ba|b*){1,2}?bc",[{parts, + 2}]))), +?line <<":ba:">> = iolist_to_binary(join(re:split("bababc","^(ba|b*){1,2}?bc",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(ba|b*){1,2}?bc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(ba|b*){1,2}?bc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(ba|b*){1,2}?bc",[]))), +?line <<"bababbc">> = iolist_to_binary(join(re:split("bababbc","^(ba|b*){1,2}?bc",[trim]))), +?line <<"bababbc">> = iolist_to_binary(join(re:split("bababbc","^(ba|b*){1,2}?bc",[{parts, + 2}]))), +?line <<"bababbc">> = iolist_to_binary(join(re:split("bababbc","^(ba|b*){1,2}?bc",[]))), +?line <<"babababc">> = iolist_to_binary(join(re:split("babababc","^(ba|b*){1,2}?bc",[trim]))), +?line <<"babababc">> = iolist_to_binary(join(re:split("babababc","^(ba|b*){1,2}?bc",[{parts, + 2}]))), +?line <<"babababc">> = iolist_to_binary(join(re:split("babababc","^(ba|b*){1,2}?bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split(";z","^\\ca\\cA\\c[\\c{\\c:",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split(";z","^\\ca\\cA\\c[\\c{\\c:",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split(";z","^\\ca\\cA\\c[\\c{\\c:",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("athing","^[ab\\]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("athing","^[ab\\]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("athing","^[ab\\]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("bthing","^[ab\\]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("bthing","^[ab\\]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("bthing","^[ab\\]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("]thing","^[ab\\]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("]thing","^[ab\\]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("]thing","^[ab\\]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("cthing","^[ab\\]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("cthing","^[ab\\]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("cthing","^[ab\\]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("dthing","^[ab\\]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("dthing","^[ab\\]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("dthing","^[ab\\]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("ething","^[ab\\]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("ething","^[ab\\]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("ething","^[ab\\]cde]",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[ab\\]cde]",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[ab\\]cde]",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[ab\\]cde]",[]))), +?line <<"fthing">> = iolist_to_binary(join(re:split("fthing","^[ab\\]cde]",[trim]))), +?line <<"fthing">> = iolist_to_binary(join(re:split("fthing","^[ab\\]cde]",[{parts, + 2}]))), +?line <<"fthing">> = iolist_to_binary(join(re:split("fthing","^[ab\\]cde]",[]))), +?line <<"[thing">> = iolist_to_binary(join(re:split("[thing","^[ab\\]cde]",[trim]))), +?line <<"[thing">> = iolist_to_binary(join(re:split("[thing","^[ab\\]cde]",[{parts, + 2}]))), +?line <<"[thing">> = iolist_to_binary(join(re:split("[thing","^[ab\\]cde]",[]))), +?line <<"\\thing">> = iolist_to_binary(join(re:split("\\thing","^[ab\\]cde]",[trim]))), +?line <<"\\thing">> = iolist_to_binary(join(re:split("\\thing","^[ab\\]cde]",[{parts, + 2}]))), +?line <<"\\thing">> = iolist_to_binary(join(re:split("\\thing","^[ab\\]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("]thing","^[]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("]thing","^[]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("]thing","^[]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("cthing","^[]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("cthing","^[]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("cthing","^[]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("dthing","^[]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("dthing","^[]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("dthing","^[]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("ething","^[]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("ething","^[]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("ething","^[]cde]",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[]cde]",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[]cde]",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[]cde]",[]))), +?line <<"athing">> = iolist_to_binary(join(re:split("athing","^[]cde]",[trim]))), +?line <<"athing">> = iolist_to_binary(join(re:split("athing","^[]cde]",[{parts, + 2}]))), +?line <<"athing">> = iolist_to_binary(join(re:split("athing","^[]cde]",[]))), +?line <<"fthing">> = iolist_to_binary(join(re:split("fthing","^[]cde]",[trim]))), +?line <<"fthing">> = iolist_to_binary(join(re:split("fthing","^[]cde]",[{parts, + 2}]))), +?line <<"fthing">> = iolist_to_binary(join(re:split("fthing","^[]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("fthing","^[^ab\\]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("fthing","^[^ab\\]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("fthing","^[^ab\\]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("[thing","^[^ab\\]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("[thing","^[^ab\\]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("[thing","^[^ab\\]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("\\thing","^[^ab\\]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("\\thing","^[^ab\\]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("\\thing","^[^ab\\]cde]",[]))), +?line <<":** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[^ab\\]cde]",[trim]))), +?line <<":** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[^ab\\]cde]",[{parts, + 2}]))), +?line <<":** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[^ab\\]cde]",[]))), +?line <<"athing">> = iolist_to_binary(join(re:split("athing","^[^ab\\]cde]",[trim]))), +?line <<"athing">> = iolist_to_binary(join(re:split("athing","^[^ab\\]cde]",[{parts, + 2}]))), +?line <<"athing">> = iolist_to_binary(join(re:split("athing","^[^ab\\]cde]",[]))), +?line <<"bthing">> = iolist_to_binary(join(re:split("bthing","^[^ab\\]cde]",[trim]))), +?line <<"bthing">> = iolist_to_binary(join(re:split("bthing","^[^ab\\]cde]",[{parts, + 2}]))), +?line <<"bthing">> = iolist_to_binary(join(re:split("bthing","^[^ab\\]cde]",[]))), +?line <<"]thing">> = iolist_to_binary(join(re:split("]thing","^[^ab\\]cde]",[trim]))), +?line <<"]thing">> = iolist_to_binary(join(re:split("]thing","^[^ab\\]cde]",[{parts, + 2}]))), +?line <<"]thing">> = iolist_to_binary(join(re:split("]thing","^[^ab\\]cde]",[]))), +?line <<"cthing">> = iolist_to_binary(join(re:split("cthing","^[^ab\\]cde]",[trim]))), +?line <<"cthing">> = iolist_to_binary(join(re:split("cthing","^[^ab\\]cde]",[{parts, + 2}]))), +?line <<"cthing">> = iolist_to_binary(join(re:split("cthing","^[^ab\\]cde]",[]))), +?line <<"dthing">> = iolist_to_binary(join(re:split("dthing","^[^ab\\]cde]",[trim]))), +?line <<"dthing">> = iolist_to_binary(join(re:split("dthing","^[^ab\\]cde]",[{parts, + 2}]))), +?line <<"dthing">> = iolist_to_binary(join(re:split("dthing","^[^ab\\]cde]",[]))), +?line <<"ething">> = iolist_to_binary(join(re:split("ething","^[^ab\\]cde]",[trim]))), +?line <<"ething">> = iolist_to_binary(join(re:split("ething","^[^ab\\]cde]",[{parts, + 2}]))), +?line <<"ething">> = iolist_to_binary(join(re:split("ething","^[^ab\\]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("athing","^[^]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("athing","^[^]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("athing","^[^]cde]",[]))), +?line <<":thing">> = iolist_to_binary(join(re:split("fthing","^[^]cde]",[trim]))), +?line <<":thing">> = iolist_to_binary(join(re:split("fthing","^[^]cde]",[{parts, + 2}]))), +?line <<":thing">> = iolist_to_binary(join(re:split("fthing","^[^]cde]",[]))), +?line <<":** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[^]cde]",[trim]))), +?line <<":** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[^]cde]",[{parts, + 2}]))), +?line <<":** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[^]cde]",[]))), +?line <<"]thing">> = iolist_to_binary(join(re:split("]thing","^[^]cde]",[trim]))), +?line <<"]thing">> = iolist_to_binary(join(re:split("]thing","^[^]cde]",[{parts, + 2}]))), +?line <<"]thing">> = iolist_to_binary(join(re:split("]thing","^[^]cde]",[]))), +?line <<"cthing">> = iolist_to_binary(join(re:split("cthing","^[^]cde]",[trim]))), +?line <<"cthing">> = iolist_to_binary(join(re:split("cthing","^[^]cde]",[{parts, + 2}]))), +?line <<"cthing">> = iolist_to_binary(join(re:split("cthing","^[^]cde]",[]))), +?line <<"dthing">> = iolist_to_binary(join(re:split("dthing","^[^]cde]",[trim]))), +?line <<"dthing">> = iolist_to_binary(join(re:split("dthing","^[^]cde]",[{parts, + 2}]))), +?line <<"dthing">> = iolist_to_binary(join(re:split("dthing","^[^]cde]",[]))), +?line <<"ething">> = iolist_to_binary(join(re:split("ething","^[^]cde]",[trim]))), +?line <<"ething">> = iolist_to_binary(join(re:split("ething","^[^]cde]",[{parts, + 2}]))), +?line <<"ething">> = iolist_to_binary(join(re:split("ething","^[^]cde]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("","^\\",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("","^\\",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("","^\\",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ÿ","^ÿ",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ÿ","^ÿ",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ÿ","^ÿ",[]))), +?line <<"">> = iolist_to_binary(join(re:split("0","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("0","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("0","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("1","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("1","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("1","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("2","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("2","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("2","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("3","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("3","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("3","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("4","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("4","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("4","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("5","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("5","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("5","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("6","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("6","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("6","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("7","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("7","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("7","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("8","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("8","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("8","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("9","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("9","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("9","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("10","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("10","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("10","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("100","^[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("100","^[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("100","^[0-9]+$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[0-9]+$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[0-9]+$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[0-9]+$",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^[0-9]+$",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^[0-9]+$",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("enter","^.*nter",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("enter","^.*nter",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("enter","^.*nter",[]))), +?line <<"">> = iolist_to_binary(join(re:split("inter","^.*nter",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("inter","^.*nter",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("inter","^.*nter",[]))), +?line <<"">> = iolist_to_binary(join(re:split("uponter","^.*nter",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("uponter","^.*nter",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("uponter","^.*nter",[]))), +?line <<"">> = iolist_to_binary(join(re:split("xxx0","^xxx[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("xxx0","^xxx[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("xxx0","^xxx[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("xxx1234","^xxx[0-9]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("xxx1234","^xxx[0-9]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("xxx1234","^xxx[0-9]+$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^xxx[0-9]+$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^xxx[0-9]+$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^xxx[0-9]+$",[]))), +?line <<"xxx">> = iolist_to_binary(join(re:split("xxx","^xxx[0-9]+$",[trim]))), +?line <<"xxx">> = iolist_to_binary(join(re:split("xxx","^xxx[0-9]+$",[{parts, + 2}]))), +?line <<"xxx">> = iolist_to_binary(join(re:split("xxx","^xxx[0-9]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("x123","^.+[0-9][0-9][0-9]$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("x123","^.+[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("x123","^.+[0-9][0-9][0-9]$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("xx123","^.+[0-9][0-9][0-9]$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("xx123","^.+[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("xx123","^.+[0-9][0-9][0-9]$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("123456","^.+[0-9][0-9][0-9]$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("123456","^.+[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("123456","^.+[0-9][0-9][0-9]$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^.+[0-9][0-9][0-9]$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^.+[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^.+[0-9][0-9][0-9]$",[]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^.+[0-9][0-9][0-9]$",[trim]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^.+[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^.+[0-9][0-9][0-9]$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("x1234","^.+[0-9][0-9][0-9]$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("x1234","^.+[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("x1234","^.+[0-9][0-9][0-9]$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("x123","^.+?[0-9][0-9][0-9]$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("x123","^.+?[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("x123","^.+?[0-9][0-9][0-9]$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("xx123","^.+?[0-9][0-9][0-9]$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("xx123","^.+?[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("xx123","^.+?[0-9][0-9][0-9]$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("123456","^.+?[0-9][0-9][0-9]$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("123456","^.+?[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("123456","^.+?[0-9][0-9][0-9]$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^.+?[0-9][0-9][0-9]$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^.+?[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^.+?[0-9][0-9][0-9]$",[]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^.+?[0-9][0-9][0-9]$",[trim]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^.+?[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^.+?[0-9][0-9][0-9]$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("x1234","^.+?[0-9][0-9][0-9]$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("x1234","^.+?[0-9][0-9][0-9]$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("x1234","^.+?[0-9][0-9][0-9]$",[]))), +?line <<":abc:pqr">> = iolist_to_binary(join(re:split("abc!pqr=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[trim]))), +?line <<":abc:pqr:">> = iolist_to_binary(join(re:split("abc!pqr=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[{parts, + 2}]))), +?line <<":abc:pqr:">> = iolist_to_binary(join(re:split("abc!pqr=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[]))), +?line <<"!pqr=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(join(re:split("!pqr=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[trim]))), +?line <<"!pqr=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(join(re:split("!pqr=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[{parts, + 2}]))), +?line <<"!pqr=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(join(re:split("!pqr=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[]))), +?line <<"abc!=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(join(re:split("abc!=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[trim]))), +?line <<"abc!=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(join(re:split("abc!=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[{parts, + 2}]))), +?line <<"abc!=apquxz.ixr.zzz.ac.uk">> = iolist_to_binary(join(re:split("abc!=apquxz.ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[]))), +?line <<"abc!pqr=apquxz:ixr.zzz.ac.uk">> = iolist_to_binary(join(re:split("abc!pqr=apquxz:ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[trim]))), +?line <<"abc!pqr=apquxz:ixr.zzz.ac.uk">> = iolist_to_binary(join(re:split("abc!pqr=apquxz:ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[{parts, + 2}]))), +?line <<"abc!pqr=apquxz:ixr.zzz.ac.uk">> = iolist_to_binary(join(re:split("abc!pqr=apquxz:ixr.zzz.ac.uk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[]))), +?line <<"abc!pqr=apquxz.ixr.zzz.ac.ukk">> = iolist_to_binary(join(re:split("abc!pqr=apquxz.ixr.zzz.ac.ukk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[trim]))), +?line <<"abc!pqr=apquxz.ixr.zzz.ac.ukk">> = iolist_to_binary(join(re:split("abc!pqr=apquxz.ixr.zzz.ac.ukk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[{parts, + 2}]))), +?line <<"abc!pqr=apquxz.ixr.zzz.ac.ukk">> = iolist_to_binary(join(re:split("abc!pqr=apquxz.ixr.zzz.ac.ukk","^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$",[]))), +?line <<"Well, we need a colon: somewhere">> = iolist_to_binary(join(re:split("Well, we need a colon: somewhere",":",[trim]))), +?line <<"Well, we need a colon: somewhere">> = iolist_to_binary(join(re:split("Well, we need a colon: somewhere",":",[{parts, + 2}]))), +?line <<"Well, we need a colon: somewhere">> = iolist_to_binary(join(re:split("Well, we need a colon: somewhere",":",[]))), +?line <<"*** Fail if we don't">> = iolist_to_binary(join(re:split("*** Fail if we don't",":",[trim]))), +?line <<"*** Fail if we don't">> = iolist_to_binary(join(re:split("*** Fail if we don't",":",[{parts, + 2}]))), +?line <<"*** Fail if we don't">> = iolist_to_binary(join(re:split("*** Fail if we don't",":",[]))), +?line <<":0abc">> = iolist_to_binary(join(re:split("0abc","([\\da-f:]+)$",[caseless, + trim]))), +?line <<":0abc:">> = iolist_to_binary(join(re:split("0abc","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<":0abc:">> = iolist_to_binary(join(re:split("0abc","([\\da-f:]+)$",[caseless]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abc","([\\da-f:]+)$",[caseless, + trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc","([\\da-f:]+)$",[caseless]))), +?line <<":fed">> = iolist_to_binary(join(re:split("fed","([\\da-f:]+)$",[caseless, + trim]))), +?line <<":fed:">> = iolist_to_binary(join(re:split("fed","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<":fed:">> = iolist_to_binary(join(re:split("fed","([\\da-f:]+)$",[caseless]))), +?line <<":E">> = iolist_to_binary(join(re:split("E","([\\da-f:]+)$",[caseless, + trim]))), +?line <<":E:">> = iolist_to_binary(join(re:split("E","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<":E:">> = iolist_to_binary(join(re:split("E","([\\da-f:]+)$",[caseless]))), +?line <<":::">> = iolist_to_binary(join(re:split("::","([\\da-f:]+)$",[caseless, + trim]))), +?line <<"::::">> = iolist_to_binary(join(re:split("::","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<"::::">> = iolist_to_binary(join(re:split("::","([\\da-f:]+)$",[caseless]))), +?line <<":5f03:12C0::932e">> = iolist_to_binary(join(re:split("5f03:12C0::932e","([\\da-f:]+)$",[caseless, + trim]))), +?line <<":5f03:12C0::932e:">> = iolist_to_binary(join(re:split("5f03:12C0::932e","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<":5f03:12C0::932e:">> = iolist_to_binary(join(re:split("5f03:12C0::932e","([\\da-f:]+)$",[caseless]))), +?line <<"fed :def">> = iolist_to_binary(join(re:split("fed def","([\\da-f:]+)$",[caseless, + trim]))), +?line <<"fed :def:">> = iolist_to_binary(join(re:split("fed def","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<"fed :def:">> = iolist_to_binary(join(re:split("fed def","([\\da-f:]+)$",[caseless]))), +?line <<"Any old stu:ff">> = iolist_to_binary(join(re:split("Any old stuff","([\\da-f:]+)$",[caseless, + trim]))), +?line <<"Any old stu:ff:">> = iolist_to_binary(join(re:split("Any old stuff","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<"Any old stu:ff:">> = iolist_to_binary(join(re:split("Any old stuff","([\\da-f:]+)$",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","([\\da-f:]+)$",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","([\\da-f:]+)$",[caseless]))), +?line <<"0zzz">> = iolist_to_binary(join(re:split("0zzz","([\\da-f:]+)$",[caseless, + trim]))), +?line <<"0zzz">> = iolist_to_binary(join(re:split("0zzz","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<"0zzz">> = iolist_to_binary(join(re:split("0zzz","([\\da-f:]+)$",[caseless]))), +?line <<"gzzz">> = iolist_to_binary(join(re:split("gzzz","([\\da-f:]+)$",[caseless, + trim]))), +?line <<"gzzz">> = iolist_to_binary(join(re:split("gzzz","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<"gzzz">> = iolist_to_binary(join(re:split("gzzz","([\\da-f:]+)$",[caseless]))), +?line <<"fed ">> = iolist_to_binary(join(re:split("fed ","([\\da-f:]+)$",[caseless, + trim]))), +?line <<"fed ">> = iolist_to_binary(join(re:split("fed ","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<"fed ">> = iolist_to_binary(join(re:split("fed ","([\\da-f:]+)$",[caseless]))), +?line <<"Any old rubbish">> = iolist_to_binary(join(re:split("Any old rubbish","([\\da-f:]+)$",[caseless, + trim]))), +?line <<"Any old rubbish">> = iolist_to_binary(join(re:split("Any old rubbish","([\\da-f:]+)$",[caseless, + {parts, + 2}]))), +?line <<"Any old rubbish">> = iolist_to_binary(join(re:split("Any old rubbish","([\\da-f:]+)$",[caseless]))), +?line <<":1:2:3">> = iolist_to_binary(join(re:split(".1.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[trim]))), +?line <<":1:2:3:">> = iolist_to_binary(join(re:split(".1.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[{parts, + 2}]))), +?line <<":1:2:3:">> = iolist_to_binary(join(re:split(".1.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[]))), +?line <<":12:123:0">> = iolist_to_binary(join(re:split("A.12.123.0","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[trim]))), +?line <<":12:123:0:">> = iolist_to_binary(join(re:split("A.12.123.0","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[{parts, + 2}]))), +?line <<":12:123:0:">> = iolist_to_binary(join(re:split("A.12.123.0","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[]))), +?line <<".1.2.3333">> = iolist_to_binary(join(re:split(".1.2.3333","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[trim]))), +?line <<".1.2.3333">> = iolist_to_binary(join(re:split(".1.2.3333","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[{parts, + 2}]))), +?line <<".1.2.3333">> = iolist_to_binary(join(re:split(".1.2.3333","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[]))), +?line <<"1.2.3">> = iolist_to_binary(join(re:split("1.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[trim]))), +?line <<"1.2.3">> = iolist_to_binary(join(re:split("1.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[{parts, + 2}]))), +?line <<"1.2.3">> = iolist_to_binary(join(re:split("1.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[]))), +?line <<"1234.2.3">> = iolist_to_binary(join(re:split("1234.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[trim]))), +?line <<"1234.2.3">> = iolist_to_binary(join(re:split("1234.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[{parts, + 2}]))), +?line <<"1234.2.3">> = iolist_to_binary(join(re:split("1234.2.3","^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$",[]))), +?line <<":1:non-sp1:non-sp2">> = iolist_to_binary(join(re:split("1 IN SOA non-sp1 non-sp2(","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[trim]))), +?line <<":1:non-sp1:non-sp2:">> = iolist_to_binary(join(re:split("1 IN SOA non-sp1 non-sp2(","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[{parts, + 2}]))), +?line <<":1:non-sp1:non-sp2:">> = iolist_to_binary(join(re:split("1 IN SOA non-sp1 non-sp2(","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[]))), +?line <<":1:non-sp1:non-sp2">> = iolist_to_binary(join(re:split("1 IN SOA non-sp1 non-sp2 (","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[trim]))), +?line <<":1:non-sp1:non-sp2:">> = iolist_to_binary(join(re:split("1 IN SOA non-sp1 non-sp2 (","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[{parts, + 2}]))), +?line <<":1:non-sp1:non-sp2:">> = iolist_to_binary(join(re:split("1 IN SOA non-sp1 non-sp2 (","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[]))), +?line <<"1IN SOA non-sp1 non-sp2(">> = iolist_to_binary(join(re:split("1IN SOA non-sp1 non-sp2(","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[trim]))), +?line <<"1IN SOA non-sp1 non-sp2(">> = iolist_to_binary(join(re:split("1IN SOA non-sp1 non-sp2(","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[{parts, + 2}]))), +?line <<"1IN SOA non-sp1 non-sp2(">> = iolist_to_binary(join(re:split("1IN SOA non-sp1 non-sp2(","^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("Z.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("Z.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("Z.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("2.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("2.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("2.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[]))), +?line <<":.pq-r">> = iolist_to_binary(join(re:split("ab-c.pq-r.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[trim]))), +?line <<":.pq-r:">> = iolist_to_binary(join(re:split("ab-c.pq-r.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[{parts, + 2}]))), +?line <<":.pq-r:">> = iolist_to_binary(join(re:split("ab-c.pq-r.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[]))), +?line <<":.uk">> = iolist_to_binary(join(re:split("sxk.zzz.ac.uk.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[trim]))), +?line <<":.uk:">> = iolist_to_binary(join(re:split("sxk.zzz.ac.uk.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[{parts, + 2}]))), +?line <<":.uk:">> = iolist_to_binary(join(re:split("sxk.zzz.ac.uk.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[]))), +?line <<":.y-">> = iolist_to_binary(join(re:split("x-.y-.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[trim]))), +?line <<":.y-:">> = iolist_to_binary(join(re:split("x-.y-.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[{parts, + 2}]))), +?line <<":.y-:">> = iolist_to_binary(join(re:split("x-.y-.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[]))), +?line <<"-abc.peq.">> = iolist_to_binary(join(re:split("-abc.peq.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[trim]))), +?line <<"-abc.peq.">> = iolist_to_binary(join(re:split("-abc.peq.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[{parts, + 2}]))), +?line <<"-abc.peq.">> = iolist_to_binary(join(re:split("-abc.peq.","^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("*.a","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[trim]))), +?line <<"::::">> = iolist_to_binary(join(re:split("*.a","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[{parts, + 2}]))), +?line <<"::::">> = iolist_to_binary(join(re:split("*.a","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[]))), +?line <<":0-a">> = iolist_to_binary(join(re:split("*.b0-a","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[trim]))), +?line <<":0-a:::">> = iolist_to_binary(join(re:split("*.b0-a","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[{parts, + 2}]))), +?line <<":0-a:::">> = iolist_to_binary(join(re:split("*.b0-a","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[]))), +?line <<":3-b:.c">> = iolist_to_binary(join(re:split("*.c3-b.c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[trim]))), +?line <<":3-b:.c::">> = iolist_to_binary(join(re:split("*.c3-b.c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[{parts, + 2}]))), +?line <<":3-b:.c::">> = iolist_to_binary(join(re:split("*.c3-b.c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[]))), +?line <<":-a:.b-c:-c">> = iolist_to_binary(join(re:split("*.c-a.b-c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[trim]))), +?line <<":-a:.b-c:-c:">> = iolist_to_binary(join(re:split("*.c-a.b-c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[{parts, + 2}]))), +?line <<":-a:.b-c:-c:">> = iolist_to_binary(join(re:split("*.c-a.b-c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[]))), +?line <<"*.0">> = iolist_to_binary(join(re:split("*.0","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[trim]))), +?line <<"*.0">> = iolist_to_binary(join(re:split("*.0","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[{parts, + 2}]))), +?line <<"*.0">> = iolist_to_binary(join(re:split("*.0","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[]))), +?line <<"*.a-">> = iolist_to_binary(join(re:split("*.a-","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[trim]))), +?line <<"*.a-">> = iolist_to_binary(join(re:split("*.a-","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[{parts, + 2}]))), +?line <<"*.a-">> = iolist_to_binary(join(re:split("*.a-","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[]))), +?line <<"*.a-b.c-">> = iolist_to_binary(join(re:split("*.a-b.c-","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[trim]))), +?line <<"*.a-b.c-">> = iolist_to_binary(join(re:split("*.a-b.c-","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[{parts, + 2}]))), +?line <<"*.a-b.c-">> = iolist_to_binary(join(re:split("*.a-b.c-","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[]))), +?line <<"*.c-a.0-c">> = iolist_to_binary(join(re:split("*.c-a.0-c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[trim]))), +?line <<"*.c-a.0-c">> = iolist_to_binary(join(re:split("*.c-a.0-c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[{parts, + 2}]))), +?line <<"*.c-a.0-c">> = iolist_to_binary(join(re:split("*.c-a.0-c","^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$",[]))), +?line <<":de:abd:e">> = iolist_to_binary(join(re:split("abde","^(?=ab(de))(abd)(e)",[trim]))), +?line <<":de:abd:e:">> = iolist_to_binary(join(re:split("abde","^(?=ab(de))(abd)(e)",[{parts, + 2}]))), +?line <<":de:abd:e:">> = iolist_to_binary(join(re:split("abde","^(?=ab(de))(abd)(e)",[]))), +?line <<"::abd:f">> = iolist_to_binary(join(re:split("abdf","^(?!(ab)de|x)(abd)(f)",[trim]))), +?line <<"::abd:f:">> = iolist_to_binary(join(re:split("abdf","^(?!(ab)de|x)(abd)(f)",[{parts, + 2}]))), +?line <<"::abd:f:">> = iolist_to_binary(join(re:split("abdf","^(?!(ab)de|x)(abd)(f)",[]))), +?line <<":abcd:cd:ab:cd">> = iolist_to_binary(join(re:split("abcd","^(?=(ab(cd)))(ab)",[trim]))), +?line <<":abcd:cd:ab:cd">> = iolist_to_binary(join(re:split("abcd","^(?=(ab(cd)))(ab)",[{parts, + 2}]))), +?line <<":abcd:cd:ab:cd">> = iolist_to_binary(join(re:split("abcd","^(?=(ab(cd)))(ab)",[]))), +?line <<":.d">> = iolist_to_binary(join(re:split("a.b.c.d","^[\\da-f](\\.[\\da-f])*$",[caseless, + trim]))), +?line <<":.d:">> = iolist_to_binary(join(re:split("a.b.c.d","^[\\da-f](\\.[\\da-f])*$",[caseless, + {parts, + 2}]))), +?line <<":.d:">> = iolist_to_binary(join(re:split("a.b.c.d","^[\\da-f](\\.[\\da-f])*$",[caseless]))), +?line <<":.D">> = iolist_to_binary(join(re:split("A.B.C.D","^[\\da-f](\\.[\\da-f])*$",[caseless, + trim]))), +?line <<":.D:">> = iolist_to_binary(join(re:split("A.B.C.D","^[\\da-f](\\.[\\da-f])*$",[caseless, + {parts, + 2}]))), +?line <<":.D:">> = iolist_to_binary(join(re:split("A.B.C.D","^[\\da-f](\\.[\\da-f])*$",[caseless]))), +?line <<":.C">> = iolist_to_binary(join(re:split("a.b.c.1.2.3.C","^[\\da-f](\\.[\\da-f])*$",[caseless, + trim]))), +?line <<":.C:">> = iolist_to_binary(join(re:split("a.b.c.1.2.3.C","^[\\da-f](\\.[\\da-f])*$",[caseless, + {parts, + 2}]))), +?line <<":.C:">> = iolist_to_binary(join(re:split("a.b.c.1.2.3.C","^[\\da-f](\\.[\\da-f])*$",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("\"1234\"","^\\\".*\\\"\\s*(;.*)?$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("\"1234\"","^\\\".*\\\"\\s*(;.*)?$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("\"1234\"","^\\\".*\\\"\\s*(;.*)?$",[]))), +?line <<":;">> = iolist_to_binary(join(re:split("\"abcd\" ;","^\\\".*\\\"\\s*(;.*)?$",[trim]))), +?line <<":;:">> = iolist_to_binary(join(re:split("\"abcd\" ;","^\\\".*\\\"\\s*(;.*)?$",[{parts, + 2}]))), +?line <<":;:">> = iolist_to_binary(join(re:split("\"abcd\" ;","^\\\".*\\\"\\s*(;.*)?$",[]))), +?line <<":; rhubarb">> = iolist_to_binary(join(re:split("\"\" ; rhubarb","^\\\".*\\\"\\s*(;.*)?$",[trim]))), +?line <<":; rhubarb:">> = iolist_to_binary(join(re:split("\"\" ; rhubarb","^\\\".*\\\"\\s*(;.*)?$",[{parts, + 2}]))), +?line <<":; rhubarb:">> = iolist_to_binary(join(re:split("\"\" ; rhubarb","^\\\".*\\\"\\s*(;.*)?$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\\".*\\\"\\s*(;.*)?$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\\".*\\\"\\s*(;.*)?$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\\".*\\\"\\s*(;.*)?$",[]))), +?line <<"\"1234\" : things">> = iolist_to_binary(join(re:split("\"1234\" : things","^\\\".*\\\"\\s*(;.*)?$",[trim]))), +?line <<"\"1234\" : things">> = iolist_to_binary(join(re:split("\"1234\" : things","^\\\".*\\\"\\s*(;.*)?$",[{parts, + 2}]))), +?line <<"\"1234\" : things">> = iolist_to_binary(join(re:split("\"1234\" : things","^\\\".*\\\"\\s*(;.*)?$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("","^$",[trim]))), +?line <<"">> = iolist_to_binary(join(re:split("","^$",[{parts, + 2}]))), +?line <<"">> = iolist_to_binary(join(re:split("","^$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab c"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab c"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab c"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended, + trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended, + {parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended]))), +?line <<"ab cde">> = iolist_to_binary(join(re:split("ab cde"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended, + trim]))), +?line <<"ab cde">> = iolist_to_binary(join(re:split("ab cde"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended, + {parts, + 2}]))), +?line <<"ab cde">> = iolist_to_binary(join(re:split("ab cde"," ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("ab c","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab c","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab c","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[]))), +?line <<"ab cde">> = iolist_to_binary(join(re:split("ab cde","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[trim]))), +?line <<"ab cde">> = iolist_to_binary(join(re:split("ab cde","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[{parts, + 2}]))), +?line <<"ab cde">> = iolist_to_binary(join(re:split("ab cde","(?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a bcd","^ a\\ b[c ]d $",[extended, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a bcd","^ a\\ b[c ]d $",[extended, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a bcd","^ a\\ b[c ]d $",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("a b d","^ a\\ b[c ]d $",[extended, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a b d","^ a\\ b[c ]d $",[extended, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a b d","^ a\\ b[c ]d $",[extended]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^ a\\ b[c ]d $",[extended, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^ a\\ b[c ]d $",[extended, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^ a\\ b[c ]d $",[extended]))), +?line <<"abcd">> = iolist_to_binary(join(re:split("abcd","^ a\\ b[c ]d $",[extended, + trim]))), +?line <<"abcd">> = iolist_to_binary(join(re:split("abcd","^ a\\ b[c ]d $",[extended, + {parts, + 2}]))), +?line <<"abcd">> = iolist_to_binary(join(re:split("abcd","^ a\\ b[c ]d $",[extended]))), +?line <<"ab d">> = iolist_to_binary(join(re:split("ab d","^ a\\ b[c ]d $",[extended, + trim]))), +?line <<"ab d">> = iolist_to_binary(join(re:split("ab d","^ a\\ b[c ]d $",[extended, + {parts, + 2}]))), +?line <<"ab d">> = iolist_to_binary(join(re:split("ab d","^ a\\ b[c ]d $",[extended]))), +?line <<":abc:bc:c:def:ef:f:hij:ij:j:klm:lm:m">> = iolist_to_binary(join(re:split("abcdefhijklm","^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$",[trim]))), +?line <<":abc:bc:c:def:ef:f:hij:ij:j:klm:lm:m:">> = iolist_to_binary(join(re:split("abcdefhijklm","^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$",[{parts, + 2}]))), +?line <<":abc:bc:c:def:ef:f:hij:ij:j:klm:lm:m:">> = iolist_to_binary(join(re:split("abcdefhijklm","^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$",[]))), +?line <<":bc:c:ef:f:ij:j:lm:m">> = iolist_to_binary(join(re:split("abcdefhijklm","^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$",[trim]))), +?line <<":bc:c:ef:f:ij:j:lm:m:">> = iolist_to_binary(join(re:split("abcdefhijklm","^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$",[{parts, + 2}]))), +?line <<":bc:c:ef:f:ij:j:lm:m:">> = iolist_to_binary(join(re:split("abcdefhijklm","^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a+ Z0+ +","^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a+ Z0+ +","^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a+ Z0+ +","^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]",[]))), +?line <<"">> = iolist_to_binary(join(re:split(".^$(*+)|{?,?}","^[.^$|()*+?{,}]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split(".^$(*+)|{?,?}","^[.^$|()*+?{,}]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split(".^$(*+)|{?,?}","^[.^$|()*+?{,}]+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("z","^a*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("z","^a*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("z","^a*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("az","^a*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("az","^a*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("az","^a*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaz","^a*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaz","^a*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaz","^a*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","^a*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^a*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^a*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aa","^a*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aa","^a*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aa","^a*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaa","^a*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","^a*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","^a*\\w",[]))), +?line <<":+">> = iolist_to_binary(join(re:split("a+","^a*\\w",[trim]))), +?line <<":+">> = iolist_to_binary(join(re:split("a+","^a*\\w",[{parts, + 2}]))), +?line <<":+">> = iolist_to_binary(join(re:split("a+","^a*\\w",[]))), +?line <<":+">> = iolist_to_binary(join(re:split("aa+","^a*\\w",[trim]))), +?line <<":+">> = iolist_to_binary(join(re:split("aa+","^a*\\w",[{parts, + 2}]))), +?line <<":+">> = iolist_to_binary(join(re:split("aa+","^a*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("z","^a*?\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("z","^a*?\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("z","^a*?\\w",[]))), +?line <<":z">> = iolist_to_binary(join(re:split("az","^a*?\\w",[trim]))), +?line <<":z">> = iolist_to_binary(join(re:split("az","^a*?\\w",[{parts, + 2}]))), +?line <<":z">> = iolist_to_binary(join(re:split("az","^a*?\\w",[]))), +?line <<":aaz">> = iolist_to_binary(join(re:split("aaaz","^a*?\\w",[trim]))), +?line <<":aaz">> = iolist_to_binary(join(re:split("aaaz","^a*?\\w",[{parts, + 2}]))), +?line <<":aaz">> = iolist_to_binary(join(re:split("aaaz","^a*?\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","^a*?\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^a*?\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^a*?\\w",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aa","^a*?\\w",[trim]))), +?line <<":a">> = iolist_to_binary(join(re:split("aa","^a*?\\w",[{parts, + 2}]))), +?line <<":a">> = iolist_to_binary(join(re:split("aa","^a*?\\w",[]))), +?line <<":aaa">> = iolist_to_binary(join(re:split("aaaa","^a*?\\w",[trim]))), +?line <<":aaa">> = iolist_to_binary(join(re:split("aaaa","^a*?\\w",[{parts, + 2}]))), +?line <<":aaa">> = iolist_to_binary(join(re:split("aaaa","^a*?\\w",[]))), +?line <<":+">> = iolist_to_binary(join(re:split("a+","^a*?\\w",[trim]))), +?line <<":+">> = iolist_to_binary(join(re:split("a+","^a*?\\w",[{parts, + 2}]))), +?line <<":+">> = iolist_to_binary(join(re:split("a+","^a*?\\w",[]))), +?line <<":a+">> = iolist_to_binary(join(re:split("aa+","^a*?\\w",[trim]))), +?line <<":a+">> = iolist_to_binary(join(re:split("aa+","^a*?\\w",[{parts, + 2}]))), +?line <<":a+">> = iolist_to_binary(join(re:split("aa+","^a*?\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("az","^a+\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("az","^a+\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("az","^a+\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaz","^a+\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaz","^a+\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaz","^a+\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aa","^a+\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aa","^a+\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aa","^a+\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaa","^a+\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","^a+\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","^a+\\w",[]))), +?line <<":+">> = iolist_to_binary(join(re:split("aa+","^a+\\w",[trim]))), +?line <<":+">> = iolist_to_binary(join(re:split("aa+","^a+\\w",[{parts, + 2}]))), +?line <<":+">> = iolist_to_binary(join(re:split("aa+","^a+\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("az","^a+?\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("az","^a+?\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("az","^a+?\\w",[]))), +?line <<":az">> = iolist_to_binary(join(re:split("aaaz","^a+?\\w",[trim]))), +?line <<":az">> = iolist_to_binary(join(re:split("aaaz","^a+?\\w",[{parts, + 2}]))), +?line <<":az">> = iolist_to_binary(join(re:split("aaaz","^a+?\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aa","^a+?\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aa","^a+?\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aa","^a+?\\w",[]))), +?line <<":aa">> = iolist_to_binary(join(re:split("aaaa","^a+?\\w",[trim]))), +?line <<":aa">> = iolist_to_binary(join(re:split("aaaa","^a+?\\w",[{parts, + 2}]))), +?line <<":aa">> = iolist_to_binary(join(re:split("aaaa","^a+?\\w",[]))), +?line <<":+">> = iolist_to_binary(join(re:split("aa+","^a+?\\w",[trim]))), +?line <<":+">> = iolist_to_binary(join(re:split("aa+","^a+?\\w",[{parts, + 2}]))), +?line <<":+">> = iolist_to_binary(join(re:split("aa+","^a+?\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("1234567890","^\\d{8}\\w{2,}",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("1234567890","^\\d{8}\\w{2,}",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("1234567890","^\\d{8}\\w{2,}",[]))), +?line <<"">> = iolist_to_binary(join(re:split("12345678ab","^\\d{8}\\w{2,}",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12345678ab","^\\d{8}\\w{2,}",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12345678ab","^\\d{8}\\w{2,}",[]))), +?line <<"">> = iolist_to_binary(join(re:split("12345678__","^\\d{8}\\w{2,}",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12345678__","^\\d{8}\\w{2,}",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12345678__","^\\d{8}\\w{2,}",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\d{8}\\w{2,}",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\d{8}\\w{2,}",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\d{8}\\w{2,}",[]))), +?line <<"1234567">> = iolist_to_binary(join(re:split("1234567","^\\d{8}\\w{2,}",[trim]))), +?line <<"1234567">> = iolist_to_binary(join(re:split("1234567","^\\d{8}\\w{2,}",[{parts, + 2}]))), +?line <<"1234567">> = iolist_to_binary(join(re:split("1234567","^\\d{8}\\w{2,}",[]))), +?line <<"">> = iolist_to_binary(join(re:split("uoie","^[aeiou\\d]{4,5}$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("uoie","^[aeiou\\d]{4,5}$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("uoie","^[aeiou\\d]{4,5}$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("1234","^[aeiou\\d]{4,5}$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("1234","^[aeiou\\d]{4,5}$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("1234","^[aeiou\\d]{4,5}$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("12345","^[aeiou\\d]{4,5}$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12345","^[aeiou\\d]{4,5}$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12345","^[aeiou\\d]{4,5}$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaaa","^[aeiou\\d]{4,5}$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaaa","^[aeiou\\d]{4,5}$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaaa","^[aeiou\\d]{4,5}$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[aeiou\\d]{4,5}$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[aeiou\\d]{4,5}$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[aeiou\\d]{4,5}$",[]))), +?line <<"123456">> = iolist_to_binary(join(re:split("123456","^[aeiou\\d]{4,5}$",[trim]))), +?line <<"123456">> = iolist_to_binary(join(re:split("123456","^[aeiou\\d]{4,5}$",[{parts, + 2}]))), +?line <<"123456">> = iolist_to_binary(join(re:split("123456","^[aeiou\\d]{4,5}$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("uoie","^[aeiou\\d]{4,5}?",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("uoie","^[aeiou\\d]{4,5}?",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("uoie","^[aeiou\\d]{4,5}?",[]))), +?line <<"">> = iolist_to_binary(join(re:split("1234","^[aeiou\\d]{4,5}?",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("1234","^[aeiou\\d]{4,5}?",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("1234","^[aeiou\\d]{4,5}?",[]))), +?line <<":5">> = iolist_to_binary(join(re:split("12345","^[aeiou\\d]{4,5}?",[trim]))), +?line <<":5">> = iolist_to_binary(join(re:split("12345","^[aeiou\\d]{4,5}?",[{parts, + 2}]))), +?line <<":5">> = iolist_to_binary(join(re:split("12345","^[aeiou\\d]{4,5}?",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaaa","^[aeiou\\d]{4,5}?",[trim]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaaa","^[aeiou\\d]{4,5}?",[{parts, + 2}]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaaa","^[aeiou\\d]{4,5}?",[]))), +?line <<":56">> = iolist_to_binary(join(re:split("123456","^[aeiou\\d]{4,5}?",[trim]))), +?line <<":56">> = iolist_to_binary(join(re:split("123456","^[aeiou\\d]{4,5}?",[{parts, + 2}]))), +?line <<":56">> = iolist_to_binary(join(re:split("123456","^[aeiou\\d]{4,5}?",[]))), +?line <<":abc:abc">> = iolist_to_binary(join(re:split("abc=abcabc","\\A(abc|def)=(\\1){2,3}\\Z",[trim]))), +?line <<":abc:abc:">> = iolist_to_binary(join(re:split("abc=abcabc","\\A(abc|def)=(\\1){2,3}\\Z",[{parts, + 2}]))), +?line <<":abc:abc:">> = iolist_to_binary(join(re:split("abc=abcabc","\\A(abc|def)=(\\1){2,3}\\Z",[]))), +?line <<":def:def">> = iolist_to_binary(join(re:split("def=defdefdef","\\A(abc|def)=(\\1){2,3}\\Z",[trim]))), +?line <<":def:def:">> = iolist_to_binary(join(re:split("def=defdefdef","\\A(abc|def)=(\\1){2,3}\\Z",[{parts, + 2}]))), +?line <<":def:def:">> = iolist_to_binary(join(re:split("def=defdefdef","\\A(abc|def)=(\\1){2,3}\\Z",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\A(abc|def)=(\\1){2,3}\\Z",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\A(abc|def)=(\\1){2,3}\\Z",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\A(abc|def)=(\\1){2,3}\\Z",[]))), +?line <<"abc=defdef">> = iolist_to_binary(join(re:split("abc=defdef","\\A(abc|def)=(\\1){2,3}\\Z",[trim]))), +?line <<"abc=defdef">> = iolist_to_binary(join(re:split("abc=defdef","\\A(abc|def)=(\\1){2,3}\\Z",[{parts, + 2}]))), +?line <<"abc=defdef">> = iolist_to_binary(join(re:split("abc=defdef","\\A(abc|def)=(\\1){2,3}\\Z",[]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:cd">> = iolist_to_binary(join(re:split("abcdefghijkcda2","^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$",[trim]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:cd:">> = iolist_to_binary(join(re:split("abcdefghijkcda2","^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$",[{parts, + 2}]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:cd:">> = iolist_to_binary(join(re:split("abcdefghijkcda2","^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$",[]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:cd">> = iolist_to_binary(join(re:split("abcdefghijkkkkcda2","^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$",[trim]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:cd:">> = iolist_to_binary(join(re:split("abcdefghijkkkkcda2","^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$",[{parts, + 2}]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:cd:">> = iolist_to_binary(join(re:split("abcdefghijkkkkcda2","^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$",[]))), +?line <<":cataract:aract:ract::3">> = iolist_to_binary(join(re:split("cataract cataract23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)",[trim]))), +?line <<":cataract:aract:ract::3:">> = iolist_to_binary(join(re:split("cataract cataract23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)",[{parts, + 2}]))), +?line <<":cataract:aract:ract::3:">> = iolist_to_binary(join(re:split("cataract cataract23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)",[]))), +?line <<":catatonic:atonic:tonic::3">> = iolist_to_binary(join(re:split("catatonic catatonic23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)",[trim]))), +?line <<":catatonic:atonic:tonic::3:">> = iolist_to_binary(join(re:split("catatonic catatonic23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)",[{parts, + 2}]))), +?line <<":catatonic:atonic:tonic::3:">> = iolist_to_binary(join(re:split("catatonic catatonic23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)",[]))), +?line <<":caterpillar:erpillar:::3">> = iolist_to_binary(join(re:split("caterpillar caterpillar23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)",[trim]))), +?line <<":caterpillar:erpillar:::3:">> = iolist_to_binary(join(re:split("caterpillar caterpillar23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)",[{parts, + 2}]))), +?line <<":caterpillar:erpillar:::3:">> = iolist_to_binary(join(re:split("caterpillar caterpillar23","(cat(a(ract|tonic)|erpillar)) \\1()2(3)",[]))), +?line <<":abcd::02 1997">> = iolist_to_binary(join(re:split("From abcd Mon Sep 01 12:33:02 1997","^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]",[trim]))), +?line <<":abcd::02 1997">> = iolist_to_binary(join(re:split("From abcd Mon Sep 01 12:33:02 1997","^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]",[{parts, + 2}]))), +?line <<":abcd::02 1997">> = iolist_to_binary(join(re:split("From abcd Mon Sep 01 12:33:02 1997","^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]",[]))), +?line <<":Sep ::02 1997">> = iolist_to_binary(join(re:split("From abcd Mon Sep 01 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[trim]))), +?line <<":Sep ::02 1997">> = iolist_to_binary(join(re:split("From abcd Mon Sep 01 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[{parts, + 2}]))), +?line <<":Sep ::02 1997">> = iolist_to_binary(join(re:split("From abcd Mon Sep 01 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[]))), +?line <<":Sep ::02 1997">> = iolist_to_binary(join(re:split("From abcd Mon Sep 1 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[trim]))), +?line <<":Sep ::02 1997">> = iolist_to_binary(join(re:split("From abcd Mon Sep 1 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[{parts, + 2}]))), +?line <<":Sep ::02 1997">> = iolist_to_binary(join(re:split("From abcd Mon Sep 1 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[]))), +?line <<"From abcd Sep 01 12:33:02 1997">> = iolist_to_binary(join(re:split("From abcd Sep 01 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[trim]))), +?line <<"From abcd Sep 01 12:33:02 1997">> = iolist_to_binary(join(re:split("From abcd Sep 01 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[{parts, + 2}]))), +?line <<"From abcd Sep 01 12:33:02 1997">> = iolist_to_binary(join(re:split("From abcd Sep 01 12:33:02 1997","^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d",[]))), +?line <<"">> = iolist_to_binary(join(re:split("12 +34","^12.34",[dotall,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12 +34","^12.34",[dotall,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12 +34","^12.34",[dotall]))), +?line <<"">> = iolist_to_binary(join(re:split("12 34","^12.34",[dotall, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12 34","^12.34",[dotall, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12 34","^12.34",[dotall]))), +?line <<"the quick : fox">> = iolist_to_binary(join(re:split("the quick brown fox","\\w+(?=\\t)",[trim]))), +?line <<"the quick : fox">> = iolist_to_binary(join(re:split("the quick brown fox","\\w+(?=\\t)",[{parts, + 2}]))), +?line <<"the quick : fox">> = iolist_to_binary(join(re:split("the quick brown fox","\\w+(?=\\t)",[]))), +?line <<"foobar is :lish see?">> = iolist_to_binary(join(re:split("foobar is foolish see?","foo(?!bar)(.*)",[trim]))), +?line <<"foobar is :lish see?:">> = iolist_to_binary(join(re:split("foobar is foolish see?","foo(?!bar)(.*)",[{parts, + 2}]))), +?line <<"foobar is :lish see?:">> = iolist_to_binary(join(re:split("foobar is foolish see?","foo(?!bar)(.*)",[]))), +?line <<"foobar c: etc">> = iolist_to_binary(join(re:split("foobar crowbar etc","(?:(?!foo)...|^.{0,2})bar(.*)",[trim]))), +?line <<"foobar c: etc:">> = iolist_to_binary(join(re:split("foobar crowbar etc","(?:(?!foo)...|^.{0,2})bar(.*)",[{parts, + 2}]))), +?line <<"foobar c: etc:">> = iolist_to_binary(join(re:split("foobar crowbar etc","(?:(?!foo)...|^.{0,2})bar(.*)",[]))), +?line <<":rel">> = iolist_to_binary(join(re:split("barrel","(?:(?!foo)...|^.{0,2})bar(.*)",[trim]))), +?line <<":rel:">> = iolist_to_binary(join(re:split("barrel","(?:(?!foo)...|^.{0,2})bar(.*)",[{parts, + 2}]))), +?line <<":rel:">> = iolist_to_binary(join(re:split("barrel","(?:(?!foo)...|^.{0,2})bar(.*)",[]))), +?line <<":rel">> = iolist_to_binary(join(re:split("2barrel","(?:(?!foo)...|^.{0,2})bar(.*)",[trim]))), +?line <<":rel:">> = iolist_to_binary(join(re:split("2barrel","(?:(?!foo)...|^.{0,2})bar(.*)",[{parts, + 2}]))), +?line <<":rel:">> = iolist_to_binary(join(re:split("2barrel","(?:(?!foo)...|^.{0,2})bar(.*)",[]))), +?line <<":rel">> = iolist_to_binary(join(re:split("A barrel","(?:(?!foo)...|^.{0,2})bar(.*)",[trim]))), +?line <<":rel:">> = iolist_to_binary(join(re:split("A barrel","(?:(?!foo)...|^.{0,2})bar(.*)",[{parts, + 2}]))), +?line <<":rel:">> = iolist_to_binary(join(re:split("A barrel","(?:(?!foo)...|^.{0,2})bar(.*)",[]))), +?line <<":abc:456">> = iolist_to_binary(join(re:split("abc456","^(\\D*)(?=\\d)(?!123)",[trim]))), +?line <<":abc:456">> = iolist_to_binary(join(re:split("abc456","^(\\D*)(?=\\d)(?!123)",[{parts, + 2}]))), +?line <<":abc:456">> = iolist_to_binary(join(re:split("abc456","^(\\D*)(?=\\d)(?!123)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\D*)(?=\\d)(?!123)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\D*)(?=\\d)(?!123)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\D*)(?=\\d)(?!123)",[]))), +?line <<"abc123">> = iolist_to_binary(join(re:split("abc123","^(\\D*)(?=\\d)(?!123)",[trim]))), +?line <<"abc123">> = iolist_to_binary(join(re:split("abc123","^(\\D*)(?=\\d)(?!123)",[{parts, + 2}]))), +?line <<"abc123">> = iolist_to_binary(join(re:split("abc123","^(\\D*)(?=\\d)(?!123)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("1234","^1234(?# test newlines + inside)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("1234","^1234(?# test newlines + inside)",[{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("1234","^1234(?# test newlines + inside)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("1234","^1234 #comment in extended re + ",[extended,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("1234","^1234 #comment in extended re + ",[extended,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("1234","^1234 #comment in extended re + ",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("abcd","#rhubarb + abcd",[extended,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd","#rhubarb + abcd",[extended,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd","#rhubarb + abcd",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("abcd","^abcd#rhubarb",[extended, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd","^abcd#rhubarb",[extended, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd","^abcd#rhubarb",[extended]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aaab","^(a)\\1{2,3}(.)",[trim]))), +?line <<":a:b:">> = iolist_to_binary(join(re:split("aaab","^(a)\\1{2,3}(.)",[{parts, + 2}]))), +?line <<":a:b:">> = iolist_to_binary(join(re:split("aaab","^(a)\\1{2,3}(.)",[]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aaaab","^(a)\\1{2,3}(.)",[trim]))), +?line <<":a:b:">> = iolist_to_binary(join(re:split("aaaab","^(a)\\1{2,3}(.)",[{parts, + 2}]))), +?line <<":a:b:">> = iolist_to_binary(join(re:split("aaaab","^(a)\\1{2,3}(.)",[]))), +?line <<":a:a:b">> = iolist_to_binary(join(re:split("aaaaab","^(a)\\1{2,3}(.)",[trim]))), +?line <<":a:a:b">> = iolist_to_binary(join(re:split("aaaaab","^(a)\\1{2,3}(.)",[{parts, + 2}]))), +?line <<":a:a:b">> = iolist_to_binary(join(re:split("aaaaab","^(a)\\1{2,3}(.)",[]))), +?line <<":a:a:ab">> = iolist_to_binary(join(re:split("aaaaaab","^(a)\\1{2,3}(.)",[trim]))), +?line <<":a:a:ab">> = iolist_to_binary(join(re:split("aaaaaab","^(a)\\1{2,3}(.)",[{parts, + 2}]))), +?line <<":a:a:ab">> = iolist_to_binary(join(re:split("aaaaaab","^(a)\\1{2,3}(.)",[]))), +?line <<"the ">> = iolist_to_binary(join(re:split("the abc","(?!^)abc",[trim]))), +?line <<"the :">> = iolist_to_binary(join(re:split("the abc","(?!^)abc",[{parts, + 2}]))), +?line <<"the :">> = iolist_to_binary(join(re:split("the abc","(?!^)abc",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?!^)abc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?!^)abc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?!^)abc",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(?!^)abc",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(?!^)abc",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(?!^)abc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","(?=^)abc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","(?=^)abc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","(?=^)abc",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?=^)abc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?=^)abc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?=^)abc",[]))), +?line <<"the abc">> = iolist_to_binary(join(re:split("the abc","(?=^)abc",[trim]))), +?line <<"the abc">> = iolist_to_binary(join(re:split("the abc","(?=^)abc",[{parts, + 2}]))), +?line <<"the abc">> = iolist_to_binary(join(re:split("the abc","(?=^)abc",[]))), +?line <<":b:bbb">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}(ab*|b)",[trim]))), +?line <<":b:bbb">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}(ab*|b)",[{parts, + 2}]))), +?line <<":b:bbb">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}(ab*|b)",[]))), +?line <<":abbbbb">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}?(ab*|b)",[trim]))), +?line <<":abbbbb:">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}?(ab*|b)",[{parts, + 2}]))), +?line <<":abbbbb:">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}?(ab*|b)",[]))), +?line <<":a:bbbbb">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}?(ab*?|b)",[trim]))), +?line <<":a:bbbbb">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}?(ab*?|b)",[{parts, + 2}]))), +?line <<":a:bbbbb">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}?(ab*?|b)",[]))), +?line <<":b:bbb">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}(ab*?|b)",[trim]))), +?line <<":b:bbb">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}(ab*?|b)",[{parts, + 2}]))), +?line <<":b:bbb">> = iolist_to_binary(join(re:split("aabbbbb","^[ab]{1,3}(ab*?|b)",[]))), +?line <<"Alan Other ">> = iolist_to_binary(join(re:split("Alan Other "," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended,trim]))), +?line <<"Alan Other ">> = iolist_to_binary(join(re:split("Alan Other "," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended, + {parts,2}]))), +?line <<"Alan Other ">> = iolist_to_binary(join(re:split("Alan Other "," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split(""," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended,trim]))), +?line <<"">> = iolist_to_binary(join(re:split(""," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended, + {parts,2}]))), +?line <<"">> = iolist_to_binary(join(re:split(""," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended]))), +?line <<"user.ain">> = iolist_to_binary(join(re:split("user.ain"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended,trim]))), +?line <<"user.ain">> = iolist_to_binary(join(re:split("user.ain"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended, + {parts,2}]))), +?line <<"user.ain">> = iolist_to_binary(join(re:split("user.ain"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended]))), +?line <<"\"A. Other\" (a comment)">> = iolist_to_binary(join(re:split("\"A. Other\" (a comment)"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended,trim]))), +?line <<"\"A. Other\" (a comment)">> = iolist_to_binary(join(re:split("\"A. Other\" (a comment)"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended, + {parts,2}]))), +?line <<"\"A. Other\" (a comment)">> = iolist_to_binary(join(re:split("\"A. Other\" (a comment)"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended]))), +?line <<"A. Other (a comment)">> = iolist_to_binary(join(re:split("A. Other (a comment)"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended,trim]))), +?line <<"A. Other (a comment)">> = iolist_to_binary(join(re:split("A. Other (a comment)"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended, + {parts,2}]))), +?line <<"A. Other (a comment)">> = iolist_to_binary(join(re:split("A. Other (a comment)"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended]))), +?line <<"\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay">> = iolist_to_binary(join(re:split("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended,trim]))), +?line <<"\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay">> = iolist_to_binary(join(re:split("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended, + {parts,2}]))), +?line <<"\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay">> = iolist_to_binary(join(re:split("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended]))), +?line <<"A missing angle > = iolist_to_binary(join(re:split("A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended,trim]))), +?line <<"A missing angle > = iolist_to_binary(join(re:split("A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended, + {parts,2}]))), +?line <<"A missing angle > = iolist_to_binary(join(re:split("A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended,trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended, + {parts,2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended]))), +?line <<"The quick brown fox">> = iolist_to_binary(join(re:split("The quick brown fox"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended,trim]))), +?line <<"The quick brown fox">> = iolist_to_binary(join(re:split("The quick brown fox"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended, + {parts,2}]))), +?line <<"The quick brown fox">> = iolist_to_binary(join(re:split("The quick brown fox"," (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional leading comment +(?: (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or... +\\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) | # comments, or... + +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +# quoted strings +)* +< (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # leading < +(?: @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* + +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* , (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* )? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) # initial word +(?: (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\" (?: # opening quote... +[^\\\\\\x80-\\xff\\n\\015\"] # Anything except backslash and quote +| # or +\\\\ [^\\x80-\\xff] # Escaped something (something != CR) +)* \" # closing quote +) )* # further okay, if led by a period +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* @ (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # initial subdomain +(?: # +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* \\. # if led by a period... +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* (?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| \\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) # ...further okay +)* +# address spec +(?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* > # trailing > +# name and address +) (?: [\\040\\t] | \\( +(?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )* +\\) )* # optional trailing comment",[extended]))), +?line <<"Alan Other ">> = iolist_to_binary(join(re:split("Alan Other ","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,trim]))), +?line <<"Alan Other ">> = iolist_to_binary(join(re:split("Alan Other ","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,{parts,2}]))), +?line <<"Alan Other ">> = iolist_to_binary(join(re:split("Alan Other ","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,trim]))), +?line <<"">> = iolist_to_binary(join(re:split("","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,{parts,2}]))), +?line <<"">> = iolist_to_binary(join(re:split("","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended]))), +?line <<"user.ain">> = iolist_to_binary(join(re:split("user.ain","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,trim]))), +?line <<"user.ain">> = iolist_to_binary(join(re:split("user.ain","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,{parts,2}]))), +?line <<"user.ain">> = iolist_to_binary(join(re:split("user.ain","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended]))), +?line <<"\"A. Other\" (a comment)">> = iolist_to_binary(join(re:split("\"A. Other\" (a comment)","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,trim]))), +?line <<"\"A. Other\" (a comment)">> = iolist_to_binary(join(re:split("\"A. Other\" (a comment)","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,{parts,2}]))), +?line <<"\"A. Other\" (a comment)">> = iolist_to_binary(join(re:split("\"A. Other\" (a comment)","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended]))), +?line <<"A. Other (a comment)">> = iolist_to_binary(join(re:split("A. Other (a comment)","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,trim]))), +?line <<"A. Other (a comment)">> = iolist_to_binary(join(re:split("A. Other (a comment)","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,{parts,2}]))), +?line <<"A. Other (a comment)">> = iolist_to_binary(join(re:split("A. Other (a comment)","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended]))), +?line <<"\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay">> = iolist_to_binary(join(re:split("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,trim]))), +?line <<"\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay">> = iolist_to_binary(join(re:split("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,{parts,2}]))), +?line <<"\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay">> = iolist_to_binary(join(re:split("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"-re.lay","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended]))), +?line <<"A missing angle > = iolist_to_binary(join(re:split("A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,trim]))), +?line <<"A missing angle > = iolist_to_binary(join(re:split("A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,{parts,2}]))), +?line <<"A missing angle > = iolist_to_binary(join(re:split("A missing angle @,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,{parts,2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended]))), +?line <<"The quick brown fox">> = iolist_to_binary(join(re:split("The quick brown fox","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,trim]))), +?line <<"The quick brown fox">> = iolist_to_binary(join(re:split("The quick brown fox","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended,{parts,2}]))), +?line <<"The quick brown fox">> = iolist_to_binary(join(re:split("The quick brown fox","[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional leading comment +(?: +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +# leading word +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # \"normal\" atoms and or spaces +(?: +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +| +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +) # \"special\" comment or quoted string +[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more \"normal\" +)* +< +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +\" # \" +[^\\\\\\x80-\\xff\\n\\015\"] * # normal +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015\"] * )* # ( special normal* )* +\" # \" +# Quoted string +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\\. +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +(?: +[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters... +(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom +| +\\[ # [ +(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff +\\] # ] +) +[\\040\\t]* # Nab whitespace. +(?: +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: # ( +(?: \\\\ [^\\x80-\\xff] | +\\( # ( +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +(?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)* +\\) # ) +) # special +[^\\\\\\x80-\\xff\\n\\015()] * # normal* +)* # )* +\\) # ) +[\\040\\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +)",[extended]))), +?line <<"abcdefpqrxyz0AB">> = iolist_to_binary(join(re:split("abcdefpqrxyz0AB","abc\\0def\\00pqr\\000xyz\\0000AB",[trim]))), +?line <<"abcdefpqrxyz0AB">> = iolist_to_binary(join(re:split("abcdefpqrxyz0AB","abc\\0def\\00pqr\\000xyz\\0000AB",[{parts, + 2}]))), +?line <<"abcdefpqrxyz0AB">> = iolist_to_binary(join(re:split("abcdefpqrxyz0AB","abc\\0def\\00pqr\\000xyz\\0000AB",[]))), +?line <<"abc456 abcdefpqrxyz0ABCDE">> = iolist_to_binary(join(re:split("abc456 abcdefpqrxyz0ABCDE","abc\\0def\\00pqr\\000xyz\\0000AB",[trim]))), +?line <<"abc456 abcdefpqrxyz0ABCDE">> = iolist_to_binary(join(re:split("abc456 abcdefpqrxyz0ABCDE","abc\\0def\\00pqr\\000xyz\\0000AB",[{parts, + 2}]))), +?line <<"abc456 abcdefpqrxyz0ABCDE">> = iolist_to_binary(join(re:split("abc456 abcdefpqrxyz0ABCDE","abc\\0def\\00pqr\\000xyz\\0000AB",[]))), +?line <<"abc efpqr0xyz00AB">> = iolist_to_binary(join(re:split("abc efpqr0xyz00AB","abc\\x0def\\x00pqr\\x000xyz\\x0000AB",[trim]))), +?line <<"abc efpqr0xyz00AB">> = iolist_to_binary(join(re:split("abc efpqr0xyz00AB","abc\\x0def\\x00pqr\\x000xyz\\x0000AB",[{parts, + 2}]))), +?line <<"abc efpqr0xyz00AB">> = iolist_to_binary(join(re:split("abc efpqr0xyz00AB","abc\\x0def\\x00pqr\\x000xyz\\x0000AB",[]))), +?line <<"abc456 abc efpqr0xyz00ABCDE">> = iolist_to_binary(join(re:split("abc456 abc efpqr0xyz00ABCDE","abc\\x0def\\x00pqr\\x000xyz\\x0000AB",[trim]))), +?line <<"abc456 abc efpqr0xyz00ABCDE">> = iolist_to_binary(join(re:split("abc456 abc efpqr0xyz00ABCDE","abc\\x0def\\x00pqr\\x000xyz\\x0000AB",[{parts, + 2}]))), +?line <<"abc456 abc efpqr0xyz00ABCDE">> = iolist_to_binary(join(re:split("abc456 abc efpqr0xyz00ABCDE","abc\\x0def\\x00pqr\\x000xyz\\x0000AB",[]))), +?line <<"A">> = iolist_to_binary(join(re:split("A","^[\\000-\\037]",[trim]))), +?line <<"A">> = iolist_to_binary(join(re:split("A","^[\\000-\\037]",[{parts, + 2}]))), +?line <<"A">> = iolist_to_binary(join(re:split("A","^[\\000-\\037]",[]))), +?line <<":B">> = iolist_to_binary(join(re:split("B","^[\\000-\\037]",[trim]))), +?line <<":B">> = iolist_to_binary(join(re:split("B","^[\\000-\\037]",[{parts, + 2}]))), +?line <<":B">> = iolist_to_binary(join(re:split("B","^[\\000-\\037]",[]))), +?line <<":C">> = iolist_to_binary(join(re:split("C","^[\\000-\\037]",[trim]))), +?line <<":C">> = iolist_to_binary(join(re:split("C","^[\\000-\\037]",[{parts, + 2}]))), +?line <<":C">> = iolist_to_binary(join(re:split("C","^[\\000-\\037]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("","\\0*",[trim]))), +?line <<"">> = iolist_to_binary(join(re:split("","\\0*",[{parts, + 2}]))), +?line <<"">> = iolist_to_binary(join(re:split("","\\0*",[]))), +?line <<"The AZ">> = iolist_to_binary(join(re:split("The AZ","A\\x0{2,3}Z",[trim]))), +?line <<"The AZ">> = iolist_to_binary(join(re:split("The AZ","A\\x0{2,3}Z",[{parts, + 2}]))), +?line <<"The AZ">> = iolist_to_binary(join(re:split("The AZ","A\\x0{2,3}Z",[]))), +?line <<"An AZ">> = iolist_to_binary(join(re:split("An AZ","A\\x0{2,3}Z",[trim]))), +?line <<"An AZ">> = iolist_to_binary(join(re:split("An AZ","A\\x0{2,3}Z",[{parts, + 2}]))), +?line <<"An AZ">> = iolist_to_binary(join(re:split("An AZ","A\\x0{2,3}Z",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","A\\x0{2,3}Z",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","A\\x0{2,3}Z",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","A\\x0{2,3}Z",[]))), +?line <<"AZ">> = iolist_to_binary(join(re:split("AZ","A\\x0{2,3}Z",[trim]))), +?line <<"AZ">> = iolist_to_binary(join(re:split("AZ","A\\x0{2,3}Z",[{parts, + 2}]))), +?line <<"AZ">> = iolist_to_binary(join(re:split("AZ","A\\x0{2,3}Z",[]))), +?line <<"AZ">> = iolist_to_binary(join(re:split("AZ","A\\x0{2,3}Z",[trim]))), +?line <<"AZ">> = iolist_to_binary(join(re:split("AZ","A\\x0{2,3}Z",[{parts, + 2}]))), +?line <<"AZ">> = iolist_to_binary(join(re:split("AZ","A\\x0{2,3}Z",[]))), +?line <<":cow:bell">> = iolist_to_binary(join(re:split("cowcowbell","^(cow|)\\1(bell)",[trim]))), +?line <<":cow:bell:">> = iolist_to_binary(join(re:split("cowcowbell","^(cow|)\\1(bell)",[{parts, + 2}]))), +?line <<":cow:bell:">> = iolist_to_binary(join(re:split("cowcowbell","^(cow|)\\1(bell)",[]))), +?line <<"::bell">> = iolist_to_binary(join(re:split("bell","^(cow|)\\1(bell)",[trim]))), +?line <<"::bell:">> = iolist_to_binary(join(re:split("bell","^(cow|)\\1(bell)",[{parts, + 2}]))), +?line <<"::bell:">> = iolist_to_binary(join(re:split("bell","^(cow|)\\1(bell)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(cow|)\\1(bell)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(cow|)\\1(bell)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(cow|)\\1(bell)",[]))), +?line <<"cowbell">> = iolist_to_binary(join(re:split("cowbell","^(cow|)\\1(bell)",[trim]))), +?line <<"cowbell">> = iolist_to_binary(join(re:split("cowbell","^(cow|)\\1(bell)",[{parts, + 2}]))), +?line <<"cowbell">> = iolist_to_binary(join(re:split("cowbell","^(cow|)\\1(bell)",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[trim]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[{parts, + 2}]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[trim]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[{parts, + 2}]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" +abc","^\\s",[trim]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" +abc","^\\s",[{parts,2}]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" +abc","^\\s",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[trim]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[{parts, + 2}]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[trim]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[{parts, + 2}]))), +?line <<":abc">> = iolist_to_binary(join(re:split(" abc","^\\s",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\s",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\s",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\s",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^\\s",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^\\s",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^\\s",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","^a b + c",[extended,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","^a b + c",[extended,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","^a b + c",[extended]))), +?line <<":a">> = iolist_to_binary(join(re:split("ab","^(a|)\\1*b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","^(a|)\\1*b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","^(a|)\\1*b",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1*b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1*b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1*b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","^(a|)\\1*b",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a|)\\1*b",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a|)\\1*b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1*b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1*b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1*b",[]))), +?line <<"acb">> = iolist_to_binary(join(re:split("acb","^(a|)\\1*b",[trim]))), +?line <<"acb">> = iolist_to_binary(join(re:split("acb","^(a|)\\1*b",[{parts, + 2}]))), +?line <<"acb">> = iolist_to_binary(join(re:split("acb","^(a|)\\1*b",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aab","^(a|)\\1+b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aab","^(a|)\\1+b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aab","^(a|)\\1+b",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1+b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1+b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1+b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","^(a|)\\1+b",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a|)\\1+b",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a|)\\1+b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1+b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1+b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1+b",[]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a|)\\1+b",[trim]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a|)\\1+b",[{parts, + 2}]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a|)\\1+b",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("ab","^(a|)\\1?b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","^(a|)\\1?b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","^(a|)\\1?b",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aab","^(a|)\\1?b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aab","^(a|)\\1?b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aab","^(a|)\\1?b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","^(a|)\\1?b",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a|)\\1?b",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a|)\\1?b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1?b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1?b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1?b",[]))), +?line <<"acb">> = iolist_to_binary(join(re:split("acb","^(a|)\\1?b",[trim]))), +?line <<"acb">> = iolist_to_binary(join(re:split("acb","^(a|)\\1?b",[{parts, + 2}]))), +?line <<"acb">> = iolist_to_binary(join(re:split("acb","^(a|)\\1?b",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaab","^(a|)\\1{2}b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaab","^(a|)\\1{2}b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaab","^(a|)\\1{2}b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","^(a|)\\1{2}b",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a|)\\1{2}b",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a|)\\1{2}b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1{2}b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1{2}b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1{2}b",[]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a|)\\1{2}b",[trim]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a|)\\1{2}b",[{parts, + 2}]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a|)\\1{2}b",[]))), +?line <<"aab">> = iolist_to_binary(join(re:split("aab","^(a|)\\1{2}b",[trim]))), +?line <<"aab">> = iolist_to_binary(join(re:split("aab","^(a|)\\1{2}b",[{parts, + 2}]))), +?line <<"aab">> = iolist_to_binary(join(re:split("aab","^(a|)\\1{2}b",[]))), +?line <<"aaaab">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1{2}b",[trim]))), +?line <<"aaaab">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1{2}b",[{parts, + 2}]))), +?line <<"aaaab">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1{2}b",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaab","^(a|)\\1{2,3}b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaab","^(a|)\\1{2,3}b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaab","^(a|)\\1{2,3}b",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1{2,3}b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1{2,3}b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaab","^(a|)\\1{2,3}b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","^(a|)\\1{2,3}b",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a|)\\1{2,3}b",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a|)\\1{2,3}b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1{2,3}b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1{2,3}b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a|)\\1{2,3}b",[]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a|)\\1{2,3}b",[trim]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a|)\\1{2,3}b",[{parts, + 2}]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a|)\\1{2,3}b",[]))), +?line <<"aab">> = iolist_to_binary(join(re:split("aab","^(a|)\\1{2,3}b",[trim]))), +?line <<"aab">> = iolist_to_binary(join(re:split("aab","^(a|)\\1{2,3}b",[{parts, + 2}]))), +?line <<"aab">> = iolist_to_binary(join(re:split("aab","^(a|)\\1{2,3}b",[]))), +?line <<"aaaaab">> = iolist_to_binary(join(re:split("aaaaab","^(a|)\\1{2,3}b",[trim]))), +?line <<"aaaaab">> = iolist_to_binary(join(re:split("aaaaab","^(a|)\\1{2,3}b",[{parts, + 2}]))), +?line <<"aaaaab">> = iolist_to_binary(join(re:split("aaaaab","^(a|)\\1{2,3}b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbbbc","ab{1,3}bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab{1,3}bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab{1,3}bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbbc","ab{1,3}bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbc","ab{1,3}bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbc","ab{1,3}bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbc","ab{1,3}bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbc","ab{1,3}bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbc","ab{1,3}bc",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab{1,3}bc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab{1,3}bc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab{1,3}bc",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","ab{1,3}bc",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","ab{1,3}bc",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","ab{1,3}bc",[]))), +?line <<"abbbbbc">> = iolist_to_binary(join(re:split("abbbbbc","ab{1,3}bc",[trim]))), +?line <<"abbbbbc">> = iolist_to_binary(join(re:split("abbbbbc","ab{1,3}bc",[{parts, + 2}]))), +?line <<"abbbbbc">> = iolist_to_binary(join(re:split("abbbbbc","ab{1,3}bc",[]))), +?line <<":track1:title:Blah blah blah">> = iolist_to_binary(join(re:split("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[T ]+(.*)",[trim]))), +?line <<":track1:title:Blah blah blah:">> = iolist_to_binary(join(re:split("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[T ]+(.*)",[{parts, + 2}]))), +?line <<":track1:title:Blah blah blah:">> = iolist_to_binary(join(re:split("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[T ]+(.*)",[]))), +?line <<":track1:title:Blah blah blah">> = iolist_to_binary(join(re:split("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[T ]+(.*)",[caseless, + trim]))), +?line <<":track1:title:Blah blah blah:">> = iolist_to_binary(join(re:split("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[T ]+(.*)",[caseless, + {parts, + 2}]))), +?line <<":track1:title:Blah blah blah:">> = iolist_to_binary(join(re:split("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[T ]+(.*)",[caseless]))), +?line <<":track1:title:Blah blah blah">> = iolist_to_binary(join(re:split("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[t ]+(.*)",[caseless, + trim]))), +?line <<":track1:title:Blah blah blah:">> = iolist_to_binary(join(re:split("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[t ]+(.*)",[caseless, + {parts, + 2}]))), +?line <<":track1:title:Blah blah blah:">> = iolist_to_binary(join(re:split("track1.title:TBlah blah blah","([^.]*)\\.([^:]*):[t ]+(.*)",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("WXY_^abc","^[W-c]+$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("WXY_^abc","^[W-c]+$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("WXY_^abc","^[W-c]+$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[W-c]+$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[W-c]+$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[W-c]+$",[]))), +?line <<"wxy">> = iolist_to_binary(join(re:split("wxy","^[W-c]+$",[trim]))), +?line <<"wxy">> = iolist_to_binary(join(re:split("wxy","^[W-c]+$",[{parts, + 2}]))), +?line <<"wxy">> = iolist_to_binary(join(re:split("wxy","^[W-c]+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("WXY_^abc","^[W-c]+$",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("WXY_^abc","^[W-c]+$",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("WXY_^abc","^[W-c]+$",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("wxy_^ABC","^[W-c]+$",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("wxy_^ABC","^[W-c]+$",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("wxy_^ABC","^[W-c]+$",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("WXY_^abc","^[\\x3f-\\x5F]+$",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("WXY_^abc","^[\\x3f-\\x5F]+$",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("WXY_^abc","^[\\x3f-\\x5F]+$",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("wxy_^ABC","^[\\x3f-\\x5F]+$",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("wxy_^ABC","^[\\x3f-\\x5F]+$",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("wxy_^ABC","^[\\x3f-\\x5F]+$",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","^abc$",[multiline, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","^abc$",[multiline, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","^abc$",[multiline]))), +?line <<"qqq +">> = iolist_to_binary(join(re:split("qqq +abc","^abc$",[multiline,trim]))), +?line <<"qqq +:">> = iolist_to_binary(join(re:split("qqq +abc","^abc$",[multiline,{parts,2}]))), +?line <<"qqq +:">> = iolist_to_binary(join(re:split("qqq +abc","^abc$",[multiline]))), +?line <<": +zzz">> = iolist_to_binary(join(re:split("abc +zzz","^abc$",[multiline,trim]))), +?line <<": +zzz">> = iolist_to_binary(join(re:split("abc +zzz","^abc$",[multiline,{parts,2}]))), +?line <<": +zzz">> = iolist_to_binary(join(re:split("abc +zzz","^abc$",[multiline]))), +?line <<"qqq +: +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","^abc$",[multiline,trim]))), +?line <<"qqq +: +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","^abc$",[multiline,{parts,2}]))), +?line <<"qqq +: +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","^abc$",[multiline]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","^abc$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","^abc$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","^abc$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^abc$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^abc$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^abc$",[]))), +?line <<"qqq +abc">> = iolist_to_binary(join(re:split("qqq +abc","^abc$",[trim]))), +?line <<"qqq +abc">> = iolist_to_binary(join(re:split("qqq +abc","^abc$",[{parts,2}]))), +?line <<"qqq +abc">> = iolist_to_binary(join(re:split("qqq +abc","^abc$",[]))), +?line <<"abc +zzz">> = iolist_to_binary(join(re:split("abc +zzz","^abc$",[trim]))), +?line <<"abc +zzz">> = iolist_to_binary(join(re:split("abc +zzz","^abc$",[{parts,2}]))), +?line <<"abc +zzz">> = iolist_to_binary(join(re:split("abc +zzz","^abc$",[]))), +?line <<"qqq +abc +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","^abc$",[trim]))), +?line <<"qqq +abc +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","^abc$",[{parts,2}]))), +?line <<"qqq +abc +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","^abc$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","\\Aabc\\Z",[multiline, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","\\Aabc\\Z",[multiline, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","\\Aabc\\Z",[multiline]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","\\Aabc\\Z",[multiline, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","\\Aabc\\Z",[multiline, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","\\Aabc\\Z",[multiline]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\Aabc\\Z",[multiline, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\Aabc\\Z",[multiline, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\Aabc\\Z",[multiline]))), +?line <<"qqq +abc">> = iolist_to_binary(join(re:split("qqq +abc","\\Aabc\\Z",[multiline,trim]))), +?line <<"qqq +abc">> = iolist_to_binary(join(re:split("qqq +abc","\\Aabc\\Z",[multiline,{parts,2}]))), +?line <<"qqq +abc">> = iolist_to_binary(join(re:split("qqq +abc","\\Aabc\\Z",[multiline]))), +?line <<"abc +zzz">> = iolist_to_binary(join(re:split("abc +zzz","\\Aabc\\Z",[multiline,trim]))), +?line <<"abc +zzz">> = iolist_to_binary(join(re:split("abc +zzz","\\Aabc\\Z",[multiline,{parts,2}]))), +?line <<"abc +zzz">> = iolist_to_binary(join(re:split("abc +zzz","\\Aabc\\Z",[multiline]))), +?line <<"qqq +abc +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","\\Aabc\\Z",[multiline,trim]))), +?line <<"qqq +abc +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","\\Aabc\\Z",[multiline,{parts,2}]))), +?line <<"qqq +abc +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","\\Aabc\\Z",[multiline]))), +?line <<":f">> = iolist_to_binary(join(re:split("abc +def","\\A(.)*\\Z",[dotall,trim]))), +?line <<":f:">> = iolist_to_binary(join(re:split("abc +def","\\A(.)*\\Z",[dotall,{parts,2}]))), +?line <<":f:">> = iolist_to_binary(join(re:split("abc +def","\\A(.)*\\Z",[dotall]))), +?line <<":s">> = iolist_to_binary(join(re:split("*** Failers","\\A(.)*\\Z",[multiline, + trim]))), +?line <<":s:">> = iolist_to_binary(join(re:split("*** Failers","\\A(.)*\\Z",[multiline, + {parts, + 2}]))), +?line <<":s:">> = iolist_to_binary(join(re:split("*** Failers","\\A(.)*\\Z",[multiline]))), +?line <<"abc +def">> = iolist_to_binary(join(re:split("abc +def","\\A(.)*\\Z",[multiline,trim]))), +?line <<"abc +def">> = iolist_to_binary(join(re:split("abc +def","\\A(.)*\\Z",[multiline,{parts,2}]))), +?line <<"abc +def">> = iolist_to_binary(join(re:split("abc +def","\\A(.)*\\Z",[multiline]))), +?line <<"::c">> = iolist_to_binary(join(re:split("b::c","(?:b)|(?::+)",[trim]))), +?line <<":::c">> = iolist_to_binary(join(re:split("b::c","(?:b)|(?::+)",[{parts, + 2}]))), +?line <<"::c">> = iolist_to_binary(join(re:split("b::c","(?:b)|(?::+)",[]))), +?line <<"c">> = iolist_to_binary(join(re:split("c::b","(?:b)|(?::+)",[trim]))), +?line <<"c:b">> = iolist_to_binary(join(re:split("c::b","(?:b)|(?::+)",[{parts, + 2}]))), +?line <<"c::">> = iolist_to_binary(join(re:split("c::b","(?:b)|(?::+)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("az-","[-az]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("az-","[-az]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("az-","[-az]+",[]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[-az]+",[trim]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[-az]+",[{parts, + 2}]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[-az]+",[]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[-az]+",[trim]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[-az]+",[{parts, + 2}]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[-az]+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("za-","[az-]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("za-","[az-]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("za-","[az-]+",[]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[az-]+",[trim]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[az-]+",[{parts, + 2}]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[az-]+",[]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[az-]+",[trim]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[az-]+",[{parts, + 2}]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[az-]+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a-z","[a\\-z]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a-z","[a\\-z]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a-z","[a\\-z]+",[]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[a\\-z]+",[trim]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[a\\-z]+",[{parts, + 2}]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[a\\-z]+",[]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[a\\-z]+",[trim]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[a\\-z]+",[{parts, + 2}]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[a\\-z]+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcdxyz","[a-z]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcdxyz","[a-z]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcdxyz","[a-z]+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("12-34","[\\d-]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12-34","[\\d-]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12-34","[\\d-]+",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\d-]+",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\d-]+",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\d-]+",[]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","[\\d-]+",[trim]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","[\\d-]+",[{parts, + 2}]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","[\\d-]+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("12-34z","[\\d-z]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12-34z","[\\d-z]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12-34z","[\\d-z]+",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\d-z]+",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\d-z]+",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\d-z]+",[]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","[\\d-z]+",[trim]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","[\\d-z]+",[{parts, + 2}]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","[\\d-z]+",[]))), +?line <<": ">> = iolist_to_binary(join(re:split("\\ ","\\x5c",[trim]))), +?line <<": ">> = iolist_to_binary(join(re:split("\\ ","\\x5c",[{parts, + 2}]))), +?line <<": ">> = iolist_to_binary(join(re:split("\\ ","\\x5c",[]))), +?line <<"the:oo">> = iolist_to_binary(join(re:split("the Zoo","\\x20Z",[trim]))), +?line <<"the:oo">> = iolist_to_binary(join(re:split("the Zoo","\\x20Z",[{parts, + 2}]))), +?line <<"the:oo">> = iolist_to_binary(join(re:split("the Zoo","\\x20Z",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\x20Z",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\x20Z",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\x20Z",[]))), +?line <<"Zulu">> = iolist_to_binary(join(re:split("Zulu","\\x20Z",[trim]))), +?line <<"Zulu">> = iolist_to_binary(join(re:split("Zulu","\\x20Z",[{parts, + 2}]))), +?line <<"Zulu">> = iolist_to_binary(join(re:split("Zulu","\\x20Z",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abcabc","(abc)\\1",[caseless, + trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcabc","(abc)\\1",[caseless, + {parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcabc","(abc)\\1",[caseless]))), +?line <<":ABC">> = iolist_to_binary(join(re:split("ABCabc","(abc)\\1",[caseless, + trim]))), +?line <<":ABC:">> = iolist_to_binary(join(re:split("ABCabc","(abc)\\1",[caseless, + {parts, + 2}]))), +?line <<":ABC:">> = iolist_to_binary(join(re:split("ABCabc","(abc)\\1",[caseless]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abcABC","(abc)\\1",[caseless, + trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcABC","(abc)\\1",[caseless, + {parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcABC","(abc)\\1",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ab{3cd","ab{3cd",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab{3cd","ab{3cd",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab{3cd","ab{3cd",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab{3,cd","ab{3,cd",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab{3,cd","ab{3,cd",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab{3,cd","ab{3,cd",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab{3,4a}cd","ab{3,4a}cd",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab{3,4a}cd","ab{3,4a}cd",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab{3,4a}cd","ab{3,4a}cd",[]))), +?line <<"">> = iolist_to_binary(join(re:split("{4,5a}bc","{4,5a}bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("{4,5a}bc","{4,5a}bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("{4,5a}bc","{4,5a}bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","abc$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","abc$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","abc$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","abc$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","abc$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","abc$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc$",[]))), +?line <<"abc +def">> = iolist_to_binary(join(re:split("abc +def","abc$",[trim]))), +?line <<"abc +def">> = iolist_to_binary(join(re:split("abc +def","abc$",[{parts,2}]))), +?line <<"abc +def">> = iolist_to_binary(join(re:split("abc +def","abc$",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abcS","(abc)\\123",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcS","(abc)\\123",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcS","(abc)\\123",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abc“","(abc)\\223",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc“","(abc)\\223",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc“","(abc)\\223",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abcÓ","(abc)\\323",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcÓ","(abc)\\323",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcÓ","(abc)\\323",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abc@","(abc)\\100",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc@","(abc)\\100",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc@","(abc)\\100",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abc@","(abc)\\100",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc@","(abc)\\100",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc@","(abc)\\100",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","(abc)\\1000",[]))), +?line <<"abc81">> = iolist_to_binary(join(re:split("abc81","abc\\81",[trim]))), +?line <<"abc81">> = iolist_to_binary(join(re:split("abc81","abc\\81",[{parts, + 2}]))), +?line <<"abc81">> = iolist_to_binary(join(re:split("abc81","abc\\81",[]))), +?line <<"abc81">> = iolist_to_binary(join(re:split("abc81","abc\\81",[trim]))), +?line <<"abc81">> = iolist_to_binary(join(re:split("abc81","abc\\81",[{parts, + 2}]))), +?line <<"abc81">> = iolist_to_binary(join(re:split("abc81","abc\\81",[]))), +?line <<"abc91">> = iolist_to_binary(join(re:split("abc91","abc\\91",[trim]))), +?line <<"abc91">> = iolist_to_binary(join(re:split("abc91","abc\\91",[{parts, + 2}]))), +?line <<"abc91">> = iolist_to_binary(join(re:split("abc91","abc\\91",[]))), +?line <<"abc91">> = iolist_to_binary(join(re:split("abc91","abc\\91",[trim]))), +?line <<"abc91">> = iolist_to_binary(join(re:split("abc91","abc\\91",[{parts, + 2}]))), +?line <<"abc91">> = iolist_to_binary(join(re:split("abc91","abc\\91",[]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:l">> = iolist_to_binary(join(re:split("abcdefghijkllS","(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123",[trim]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:l:">> = iolist_to_binary(join(re:split("abcdefghijkllS","(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123",[{parts, + 2}]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:l:">> = iolist_to_binary(join(re:split("abcdefghijkllS","(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123",[]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k">> = iolist_to_binary(join(re:split("abcdefghijk +S","(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123",[trim]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:">> = iolist_to_binary(join(re:split("abcdefghijk +S","(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123",[{parts,2}]))), +?line <<":a:b:c:d:e:f:g:h:i:j:k:">> = iolist_to_binary(join(re:split("abcdefghijk +S","(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abidef","ab\\idef",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abidef","ab\\idef",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abidef","ab\\idef",[]))), +?line <<"">> = iolist_to_binary(join(re:split("bc","a{0}bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("bc","a{0}bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("bc","a{0}bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("xyz","(a|(bc)){0,0}?xyz",[trim]))), +?line <<":::">> = iolist_to_binary(join(re:split("xyz","(a|(bc)){0,0}?xyz",[{parts, + 2}]))), +?line <<":::">> = iolist_to_binary(join(re:split("xyz","(a|(bc)){0,0}?xyz",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcde","abc[\\10]de",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcde","abc[\\10]de",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcde","abc[\\10]de",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcde","abc[\\1]de",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcde","abc[\\1]de",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcde","abc[\\1]de",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abcde","(abc)[\\1]de",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcde","(abc)[\\1]de",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcde","(abc)[\\1]de",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a +b","(?s)a.b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a +b","(?s)a.b",[{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a +b","(?s)a.b",[]))), +?line <<":b:a:NOT:cccc:d">> = iolist_to_binary(join(re:split("baNOTccccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[trim]))), +?line <<":b:a:NOT:cccc:d">> = iolist_to_binary(join(re:split("baNOTccccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[{parts, + 2}]))), +?line <<":b:a:NOT:cccc:d">> = iolist_to_binary(join(re:split("baNOTccccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[]))), +?line <<":b:a:NOT:ccc:d">> = iolist_to_binary(join(re:split("baNOTcccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[trim]))), +?line <<":b:a:NOT:ccc:d">> = iolist_to_binary(join(re:split("baNOTcccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[{parts, + 2}]))), +?line <<":b:a:NOT:ccc:d">> = iolist_to_binary(join(re:split("baNOTcccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[]))), +?line <<":b:a:NO:Tcc:d">> = iolist_to_binary(join(re:split("baNOTccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[trim]))), +?line <<":b:a:NO:Tcc:d">> = iolist_to_binary(join(re:split("baNOTccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[{parts, + 2}]))), +?line <<":b:a:NO:Tcc:d">> = iolist_to_binary(join(re:split("baNOTccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[]))), +?line <<":b:a::ccc:d">> = iolist_to_binary(join(re:split("bacccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[trim]))), +?line <<":b:a::ccc:d">> = iolist_to_binary(join(re:split("bacccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[{parts, + 2}]))), +?line <<":b:a::ccc:d">> = iolist_to_binary(join(re:split("bacccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[]))), +?line <<":*:*:* Fail:ers">> = iolist_to_binary(join(re:split("*** Failers","^([^a])([^\\b])([^c]*)([^d]{3,4})",[trim]))), +?line <<":*:*:* Fail:ers:">> = iolist_to_binary(join(re:split("*** Failers","^([^a])([^\\b])([^c]*)([^d]{3,4})",[{parts, + 2}]))), +?line <<":*:*:* Fail:ers:">> = iolist_to_binary(join(re:split("*** Failers","^([^a])([^\\b])([^c]*)([^d]{3,4})",[]))), +?line <<"anything">> = iolist_to_binary(join(re:split("anything","^([^a])([^\\b])([^c]*)([^d]{3,4})",[trim]))), +?line <<"anything">> = iolist_to_binary(join(re:split("anything","^([^a])([^\\b])([^c]*)([^d]{3,4})",[{parts, + 2}]))), +?line <<"anything">> = iolist_to_binary(join(re:split("anything","^([^a])([^\\b])([^c]*)([^d]{3,4})",[]))), +?line <<"bc">> = iolist_to_binary(join(re:split("bc","^([^a])([^\\b])([^c]*)([^d]{3,4})",[trim]))), +?line <<"bc">> = iolist_to_binary(join(re:split("bc","^([^a])([^\\b])([^c]*)([^d]{3,4})",[{parts, + 2}]))), +?line <<"bc">> = iolist_to_binary(join(re:split("bc","^([^a])([^\\b])([^c]*)([^d]{3,4})",[]))), +?line <<"baccd">> = iolist_to_binary(join(re:split("baccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[trim]))), +?line <<"baccd">> = iolist_to_binary(join(re:split("baccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[{parts, + 2}]))), +?line <<"baccd">> = iolist_to_binary(join(re:split("baccd","^([^a])([^\\b])([^c]*)([^d]{3,4})",[]))), +?line <<"">> = iolist_to_binary(join(re:split("Abc","[^a]",[trim]))), +?line <<":bc">> = iolist_to_binary(join(re:split("Abc","[^a]",[{parts, + 2}]))), +?line <<":::">> = iolist_to_binary(join(re:split("Abc","[^a]",[]))), +?line <<"A">> = iolist_to_binary(join(re:split("Abc","[^a]",[caseless, + trim]))), +?line <<"A:c">> = iolist_to_binary(join(re:split("Abc","[^a]",[caseless, + {parts, + 2}]))), +?line <<"A::">> = iolist_to_binary(join(re:split("Abc","[^a]",[caseless]))), +?line <<":a">> = iolist_to_binary(join(re:split("AAAaAbc","[^a]+",[trim]))), +?line <<":aAbc">> = iolist_to_binary(join(re:split("AAAaAbc","[^a]+",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("AAAaAbc","[^a]+",[]))), +?line <<"AAAaA">> = iolist_to_binary(join(re:split("AAAaAbc","[^a]+",[caseless, + trim]))), +?line <<"AAAaA:">> = iolist_to_binary(join(re:split("AAAaAbc","[^a]+",[caseless, + {parts, + 2}]))), +?line <<"AAAaA:">> = iolist_to_binary(join(re:split("AAAaAbc","[^a]+",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("bbb +ccc","[^a]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("bbb +ccc","[^a]+",[{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("bbb +ccc","[^a]+",[]))), +?line <<"ab">> = iolist_to_binary(join(re:split("abc","[^k]$",[trim]))), +?line <<"ab:">> = iolist_to_binary(join(re:split("abc","[^k]$",[{parts, + 2}]))), +?line <<"ab:">> = iolist_to_binary(join(re:split("abc","[^k]$",[]))), +?line <<"*** Failer">> = iolist_to_binary(join(re:split("*** Failers","[^k]$",[trim]))), +?line <<"*** Failer:">> = iolist_to_binary(join(re:split("*** Failers","[^k]$",[{parts, + 2}]))), +?line <<"*** Failer:">> = iolist_to_binary(join(re:split("*** Failers","[^k]$",[]))), +?line <<"abk">> = iolist_to_binary(join(re:split("abk","[^k]$",[trim]))), +?line <<"abk">> = iolist_to_binary(join(re:split("abk","[^k]$",[{parts, + 2}]))), +?line <<"abk">> = iolist_to_binary(join(re:split("abk","[^k]$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","[^k]{2,3}$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","[^k]{2,3}$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","[^k]{2,3}$",[]))), +?line <<"k">> = iolist_to_binary(join(re:split("kbc","[^k]{2,3}$",[trim]))), +?line <<"k:">> = iolist_to_binary(join(re:split("kbc","[^k]{2,3}$",[{parts, + 2}]))), +?line <<"k:">> = iolist_to_binary(join(re:split("kbc","[^k]{2,3}$",[]))), +?line <<"k">> = iolist_to_binary(join(re:split("kabc","[^k]{2,3}$",[trim]))), +?line <<"k:">> = iolist_to_binary(join(re:split("kabc","[^k]{2,3}$",[{parts, + 2}]))), +?line <<"k:">> = iolist_to_binary(join(re:split("kabc","[^k]{2,3}$",[]))), +?line <<"*** Fail">> = iolist_to_binary(join(re:split("*** Failers","[^k]{2,3}$",[trim]))), +?line <<"*** Fail:">> = iolist_to_binary(join(re:split("*** Failers","[^k]{2,3}$",[{parts, + 2}]))), +?line <<"*** Fail:">> = iolist_to_binary(join(re:split("*** Failers","[^k]{2,3}$",[]))), +?line <<"abk">> = iolist_to_binary(join(re:split("abk","[^k]{2,3}$",[trim]))), +?line <<"abk">> = iolist_to_binary(join(re:split("abk","[^k]{2,3}$",[{parts, + 2}]))), +?line <<"abk">> = iolist_to_binary(join(re:split("abk","[^k]{2,3}$",[]))), +?line <<"akb">> = iolist_to_binary(join(re:split("akb","[^k]{2,3}$",[trim]))), +?line <<"akb">> = iolist_to_binary(join(re:split("akb","[^k]{2,3}$",[{parts, + 2}]))), +?line <<"akb">> = iolist_to_binary(join(re:split("akb","[^k]{2,3}$",[]))), +?line <<"akk">> = iolist_to_binary(join(re:split("akk","[^k]{2,3}$",[trim]))), +?line <<"akk">> = iolist_to_binary(join(re:split("akk","[^k]{2,3}$",[{parts, + 2}]))), +?line <<"akk">> = iolist_to_binary(join(re:split("akk","[^k]{2,3}$",[]))), +?line <<"12345678.b.c.d">> = iolist_to_binary(join(re:split("12345678.b.c.d","^\\d{8,}\\@.+[^k]$",[trim]))), +?line <<"12345678.b.c.d">> = iolist_to_binary(join(re:split("12345678.b.c.d","^\\d{8,}\\@.+[^k]$",[{parts, + 2}]))), +?line <<"12345678.b.c.d">> = iolist_to_binary(join(re:split("12345678.b.c.d","^\\d{8,}\\@.+[^k]$",[]))), +?line <<"123456789.y.z">> = iolist_to_binary(join(re:split("123456789.y.z","^\\d{8,}\\@.+[^k]$",[trim]))), +?line <<"123456789.y.z">> = iolist_to_binary(join(re:split("123456789.y.z","^\\d{8,}\\@.+[^k]$",[{parts, + 2}]))), +?line <<"123456789.y.z">> = iolist_to_binary(join(re:split("123456789.y.z","^\\d{8,}\\@.+[^k]$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\d{8,}\\@.+[^k]$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\d{8,}\\@.+[^k]$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^\\d{8,}\\@.+[^k]$",[]))), +?line <<"12345678.y.uk">> = iolist_to_binary(join(re:split("12345678.y.uk","^\\d{8,}\\@.+[^k]$",[trim]))), +?line <<"12345678.y.uk">> = iolist_to_binary(join(re:split("12345678.y.uk","^\\d{8,}\\@.+[^k]$",[{parts, + 2}]))), +?line <<"12345678.y.uk">> = iolist_to_binary(join(re:split("12345678.y.uk","^\\d{8,}\\@.+[^k]$",[]))), +?line <<"1234567.b.c.d">> = iolist_to_binary(join(re:split("1234567.b.c.d","^\\d{8,}\\@.+[^k]$",[trim]))), +?line <<"1234567.b.c.d">> = iolist_to_binary(join(re:split("1234567.b.c.d","^\\d{8,}\\@.+[^k]$",[{parts, + 2}]))), +?line <<"1234567.b.c.d">> = iolist_to_binary(join(re:split("1234567.b.c.d","^\\d{8,}\\@.+[^k]$",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaaaaaaa","(a)\\1{8,}",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaaaaaa","(a)\\1{8,}",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaaaaaa","(a)\\1{8,}",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaaaaaaaa","(a)\\1{8,}",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaaaaaaa","(a)\\1{8,}",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaaaaaaa","(a)\\1{8,}",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a)\\1{8,}",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a)\\1{8,}",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a)\\1{8,}",[]))), +?line <<"aaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaa","(a)\\1{8,}",[trim]))), +?line <<"aaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaa","(a)\\1{8,}",[{parts, + 2}]))), +?line <<"aaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaa","(a)\\1{8,}",[]))), +?line <<"aaaa">> = iolist_to_binary(join(re:split("aaaabcd","[^a]",[trim]))), +?line <<"aaaa:cd">> = iolist_to_binary(join(re:split("aaaabcd","[^a]",[{parts, + 2}]))), +?line <<"aaaa:::">> = iolist_to_binary(join(re:split("aaaabcd","[^a]",[]))), +?line <<"aa:a">> = iolist_to_binary(join(re:split("aaAabcd","[^a]",[trim]))), +?line <<"aa:abcd">> = iolist_to_binary(join(re:split("aaAabcd","[^a]",[{parts, + 2}]))), +?line <<"aa:a:::">> = iolist_to_binary(join(re:split("aaAabcd","[^a]",[]))), +?line <<"aaaa">> = iolist_to_binary(join(re:split("aaaabcd","[^a]",[caseless, + trim]))), +?line <<"aaaa:cd">> = iolist_to_binary(join(re:split("aaaabcd","[^a]",[caseless, + {parts, + 2}]))), +?line <<"aaaa:::">> = iolist_to_binary(join(re:split("aaaabcd","[^a]",[caseless]))), +?line <<"aaAa">> = iolist_to_binary(join(re:split("aaAabcd","[^a]",[caseless, + trim]))), +?line <<"aaAa:cd">> = iolist_to_binary(join(re:split("aaAabcd","[^a]",[caseless, + {parts, + 2}]))), +?line <<"aaAa:::">> = iolist_to_binary(join(re:split("aaAabcd","[^a]",[caseless]))), +?line <<"aaaa">> = iolist_to_binary(join(re:split("aaaabcd","[^az]",[trim]))), +?line <<"aaaa:cd">> = iolist_to_binary(join(re:split("aaaabcd","[^az]",[{parts, + 2}]))), +?line <<"aaaa:::">> = iolist_to_binary(join(re:split("aaaabcd","[^az]",[]))), +?line <<"aa:a">> = iolist_to_binary(join(re:split("aaAabcd","[^az]",[trim]))), +?line <<"aa:abcd">> = iolist_to_binary(join(re:split("aaAabcd","[^az]",[{parts, + 2}]))), +?line <<"aa:a:::">> = iolist_to_binary(join(re:split("aaAabcd","[^az]",[]))), +?line <<"aaaa">> = iolist_to_binary(join(re:split("aaaabcd","[^az]",[caseless, + trim]))), +?line <<"aaaa:cd">> = iolist_to_binary(join(re:split("aaaabcd","[^az]",[caseless, + {parts, + 2}]))), +?line <<"aaaa:::">> = iolist_to_binary(join(re:split("aaaabcd","[^az]",[caseless]))), +?line <<"aaAa">> = iolist_to_binary(join(re:split("aaAabcd","[^az]",[caseless, + trim]))), +?line <<"aaAa:cd">> = iolist_to_binary(join(re:split("aaAabcd","[^az]",[caseless, + {parts, + 2}]))), +?line <<"aaAa:::">> = iolist_to_binary(join(re:split("aaAabcd","[^az]",[caseless]))), +?line <<"xxxxxxxxxxx:xxxxxxxxx">> = iolist_to_binary(join(re:split("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx","P[^*]TAIRE[^*]{1,6}?LL",[trim]))), +?line <<"xxxxxxxxxxx:xxxxxxxxx">> = iolist_to_binary(join(re:split("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx","P[^*]TAIRE[^*]{1,6}?LL",[{parts, + 2}]))), +?line <<"xxxxxxxxxxx:xxxxxxxxx">> = iolist_to_binary(join(re:split("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx","P[^*]TAIRE[^*]{1,6}?LL",[]))), +?line <<"xxxxxxxxxxx:xxxxxxxxx">> = iolist_to_binary(join(re:split("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx","P[^*]TAIRE[^*]{1,}?LL",[trim]))), +?line <<"xxxxxxxxxxx:xxxxxxxxx">> = iolist_to_binary(join(re:split("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx","P[^*]TAIRE[^*]{1,}?LL",[{parts, + 2}]))), +?line <<"xxxxxxxxxxx:xxxxxxxxx">> = iolist_to_binary(join(re:split("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx","P[^*]TAIRE[^*]{1,}?LL",[]))), +?line <<"1:.23">> = iolist_to_binary(join(re:split("1.230003938","(\\.\\d\\d[1-9]?)\\d+",[trim]))), +?line <<"1:.23:">> = iolist_to_binary(join(re:split("1.230003938","(\\.\\d\\d[1-9]?)\\d+",[{parts, + 2}]))), +?line <<"1:.23:">> = iolist_to_binary(join(re:split("1.230003938","(\\.\\d\\d[1-9]?)\\d+",[]))), +?line <<"1:.875">> = iolist_to_binary(join(re:split("1.875000282","(\\.\\d\\d[1-9]?)\\d+",[trim]))), +?line <<"1:.875:">> = iolist_to_binary(join(re:split("1.875000282","(\\.\\d\\d[1-9]?)\\d+",[{parts, + 2}]))), +?line <<"1:.875:">> = iolist_to_binary(join(re:split("1.875000282","(\\.\\d\\d[1-9]?)\\d+",[]))), +?line <<"1:.23">> = iolist_to_binary(join(re:split("1.235","(\\.\\d\\d[1-9]?)\\d+",[trim]))), +?line <<"1:.23:">> = iolist_to_binary(join(re:split("1.235","(\\.\\d\\d[1-9]?)\\d+",[{parts, + 2}]))), +?line <<"1:.23:">> = iolist_to_binary(join(re:split("1.235","(\\.\\d\\d[1-9]?)\\d+",[]))), +?line <<"1:.23::0003938">> = iolist_to_binary(join(re:split("1.230003938","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[trim]))), +?line <<"1:.23::0003938">> = iolist_to_binary(join(re:split("1.230003938","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[{parts, + 2}]))), +?line <<"1:.23::0003938">> = iolist_to_binary(join(re:split("1.230003938","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[]))), +?line <<"1:.875:5:000282">> = iolist_to_binary(join(re:split("1.875000282","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[trim]))), +?line <<"1:.875:5:000282">> = iolist_to_binary(join(re:split("1.875000282","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[{parts, + 2}]))), +?line <<"1:.875:5:000282">> = iolist_to_binary(join(re:split("1.875000282","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[]))), +?line <<"1.235">> = iolist_to_binary(join(re:split("1.235","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[trim]))), +?line <<"1.235">> = iolist_to_binary(join(re:split("1.235","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[{parts, + 2}]))), +?line <<"1.235">> = iolist_to_binary(join(re:split("1.235","(\\.\\d\\d((?=0)|\\d(?=\\d)))",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab","a(?)b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","a(?)b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","a(?)b",[]))), +?line <<"Food is on the :foo:table">> = iolist_to_binary(join(re:split("Food is on the foo table","\\b(foo)\\s+(\\w+)",[caseless, + trim]))), +?line <<"Food is on the :foo:table:">> = iolist_to_binary(join(re:split("Food is on the foo table","\\b(foo)\\s+(\\w+)",[caseless, + {parts, + 2}]))), +?line <<"Food is on the :foo:table:">> = iolist_to_binary(join(re:split("Food is on the foo table","\\b(foo)\\s+(\\w+)",[caseless]))), +?line <<"The :d is under the bar in the :n.">> = iolist_to_binary(join(re:split("The food is under the bar in the barn.","foo(.*)bar",[trim]))), +?line <<"The :d is under the bar in the :n.">> = iolist_to_binary(join(re:split("The food is under the bar in the barn.","foo(.*)bar",[{parts, + 2}]))), +?line <<"The :d is under the bar in the :n.">> = iolist_to_binary(join(re:split("The food is under the bar in the barn.","foo(.*)bar",[]))), +?line <<"The :d is under the : in the barn.">> = iolist_to_binary(join(re:split("The food is under the bar in the barn.","foo(.*?)bar",[trim]))), +?line <<"The :d is under the : in the barn.">> = iolist_to_binary(join(re:split("The food is under the bar in the barn.","foo(.*?)bar",[{parts, + 2}]))), +?line <<"The :d is under the : in the barn.">> = iolist_to_binary(join(re:split("The food is under the bar in the barn.","foo(.*?)bar",[]))), +?line <<":I have 2 numbers: 53147">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)(\\d*)",[trim]))), +?line <<":I have 2 numbers: 53147::">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)(\\d*)",[{parts, + 2}]))), +?line <<":I have 2 numbers: 53147::">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)(\\d*)",[]))), +?line <<":I have 2 numbers: 5314:7">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)(\\d+)",[trim]))), +?line <<":I have 2 numbers: 5314:7:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)(\\d+)",[{parts, + 2}]))), +?line <<":I have 2 numbers: 5314:7:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)(\\d+)",[]))), +?line <<":I::: :::h:::a:::v:::e::: :2:: :::n:::u:::m:::b:::e:::r:::s::::::: :53147">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*?)(\\d*)",[trim]))), +?line <<":I:: have 2 numbers: 53147">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*?)(\\d*)",[{parts, + 2}]))), +?line <<":I::: :::h:::a:::v:::e::: :2:: :::n:::u:::m:::b:::e:::r:::s::::::: :53147:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*?)(\\d*)",[]))), +?line <<":I have :2:: numbers: :53147">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*?)(\\d+)",[trim]))), +?line <<":I have :2: numbers: 53147">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*?)(\\d+)",[{parts, + 2}]))), +?line <<":I have :2:: numbers: :53147:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*?)(\\d+)",[]))), +?line <<":I have 2 numbers: 5314:7">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)(\\d+)$",[trim]))), +?line <<":I have 2 numbers: 5314:7:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)(\\d+)$",[{parts, + 2}]))), +?line <<":I have 2 numbers: 5314:7:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)(\\d+)$",[]))), +?line <<":I have 2 numbers: :53147">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*?)(\\d+)$",[trim]))), +?line <<":I have 2 numbers: :53147:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*?)(\\d+)$",[{parts, + 2}]))), +?line <<":I have 2 numbers: :53147:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*?)(\\d+)$",[]))), +?line <<":I have 2 numbers: :53147">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)\\b(\\d+)$",[trim]))), +?line <<":I have 2 numbers: :53147:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)\\b(\\d+)$",[{parts, + 2}]))), +?line <<":I have 2 numbers: :53147:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*)\\b(\\d+)$",[]))), +?line <<":I have 2 numbers: :53147">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*\\D)(\\d+)$",[trim]))), +?line <<":I have 2 numbers: :53147:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*\\D)(\\d+)$",[{parts, + 2}]))), +?line <<":I have 2 numbers: :53147:">> = iolist_to_binary(join(re:split("I have 2 numbers: 53147","(.*\\D)(\\d+)$",[]))), +?line <<":C123">> = iolist_to_binary(join(re:split("ABC123","^\\D*(?!123)",[trim]))), +?line <<":C123">> = iolist_to_binary(join(re:split("ABC123","^\\D*(?!123)",[{parts, + 2}]))), +?line <<":C123">> = iolist_to_binary(join(re:split("ABC123","^\\D*(?!123)",[]))), +?line <<":ABC:445">> = iolist_to_binary(join(re:split("ABC445","^(\\D*)(?=\\d)(?!123)",[trim]))), +?line <<":ABC:445">> = iolist_to_binary(join(re:split("ABC445","^(\\D*)(?=\\d)(?!123)",[{parts, + 2}]))), +?line <<":ABC:445">> = iolist_to_binary(join(re:split("ABC445","^(\\D*)(?=\\d)(?!123)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\D*)(?=\\d)(?!123)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\D*)(?=\\d)(?!123)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\D*)(?=\\d)(?!123)",[]))), +?line <<"ABC123">> = iolist_to_binary(join(re:split("ABC123","^(\\D*)(?=\\d)(?!123)",[trim]))), +?line <<"ABC123">> = iolist_to_binary(join(re:split("ABC123","^(\\D*)(?=\\d)(?!123)",[{parts, + 2}]))), +?line <<"ABC123">> = iolist_to_binary(join(re:split("ABC123","^(\\D*)(?=\\d)(?!123)",[]))), +?line <<":789">> = iolist_to_binary(join(re:split("W46]789","^[W-]46]",[trim]))), +?line <<":789">> = iolist_to_binary(join(re:split("W46]789","^[W-]46]",[{parts, + 2}]))), +?line <<":789">> = iolist_to_binary(join(re:split("W46]789","^[W-]46]",[]))), +?line <<":789">> = iolist_to_binary(join(re:split("-46]789","^[W-]46]",[trim]))), +?line <<":789">> = iolist_to_binary(join(re:split("-46]789","^[W-]46]",[{parts, + 2}]))), +?line <<":789">> = iolist_to_binary(join(re:split("-46]789","^[W-]46]",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[W-]46]",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[W-]46]",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[W-]46]",[]))), +?line <<"Wall">> = iolist_to_binary(join(re:split("Wall","^[W-]46]",[trim]))), +?line <<"Wall">> = iolist_to_binary(join(re:split("Wall","^[W-]46]",[{parts, + 2}]))), +?line <<"Wall">> = iolist_to_binary(join(re:split("Wall","^[W-]46]",[]))), +?line <<"Zebra">> = iolist_to_binary(join(re:split("Zebra","^[W-]46]",[trim]))), +?line <<"Zebra">> = iolist_to_binary(join(re:split("Zebra","^[W-]46]",[{parts, + 2}]))), +?line <<"Zebra">> = iolist_to_binary(join(re:split("Zebra","^[W-]46]",[]))), +?line <<"42">> = iolist_to_binary(join(re:split("42","^[W-]46]",[trim]))), +?line <<"42">> = iolist_to_binary(join(re:split("42","^[W-]46]",[{parts, + 2}]))), +?line <<"42">> = iolist_to_binary(join(re:split("42","^[W-]46]",[]))), +?line <<"[abcd]">> = iolist_to_binary(join(re:split("[abcd]","^[W-]46]",[trim]))), +?line <<"[abcd]">> = iolist_to_binary(join(re:split("[abcd]","^[W-]46]",[{parts, + 2}]))), +?line <<"[abcd]">> = iolist_to_binary(join(re:split("[abcd]","^[W-]46]",[]))), +?line <<"]abcd[">> = iolist_to_binary(join(re:split("]abcd[","^[W-]46]",[trim]))), +?line <<"]abcd[">> = iolist_to_binary(join(re:split("]abcd[","^[W-]46]",[{parts, + 2}]))), +?line <<"]abcd[">> = iolist_to_binary(join(re:split("]abcd[","^[W-]46]",[]))), +?line <<":46]789">> = iolist_to_binary(join(re:split("W46]789","^[W-\\]46]",[trim]))), +?line <<":46]789">> = iolist_to_binary(join(re:split("W46]789","^[W-\\]46]",[{parts, + 2}]))), +?line <<":46]789">> = iolist_to_binary(join(re:split("W46]789","^[W-\\]46]",[]))), +?line <<":all">> = iolist_to_binary(join(re:split("Wall","^[W-\\]46]",[trim]))), +?line <<":all">> = iolist_to_binary(join(re:split("Wall","^[W-\\]46]",[{parts, + 2}]))), +?line <<":all">> = iolist_to_binary(join(re:split("Wall","^[W-\\]46]",[]))), +?line <<":ebra">> = iolist_to_binary(join(re:split("Zebra","^[W-\\]46]",[trim]))), +?line <<":ebra">> = iolist_to_binary(join(re:split("Zebra","^[W-\\]46]",[{parts, + 2}]))), +?line <<":ebra">> = iolist_to_binary(join(re:split("Zebra","^[W-\\]46]",[]))), +?line <<":ylophone">> = iolist_to_binary(join(re:split("Xylophone","^[W-\\]46]",[trim]))), +?line <<":ylophone">> = iolist_to_binary(join(re:split("Xylophone","^[W-\\]46]",[{parts, + 2}]))), +?line <<":ylophone">> = iolist_to_binary(join(re:split("Xylophone","^[W-\\]46]",[]))), +?line <<":2">> = iolist_to_binary(join(re:split("42","^[W-\\]46]",[trim]))), +?line <<":2">> = iolist_to_binary(join(re:split("42","^[W-\\]46]",[{parts, + 2}]))), +?line <<":2">> = iolist_to_binary(join(re:split("42","^[W-\\]46]",[]))), +?line <<":abcd]">> = iolist_to_binary(join(re:split("[abcd]","^[W-\\]46]",[trim]))), +?line <<":abcd]">> = iolist_to_binary(join(re:split("[abcd]","^[W-\\]46]",[{parts, + 2}]))), +?line <<":abcd]">> = iolist_to_binary(join(re:split("[abcd]","^[W-\\]46]",[]))), +?line <<":abcd[">> = iolist_to_binary(join(re:split("]abcd[","^[W-\\]46]",[trim]))), +?line <<":abcd[">> = iolist_to_binary(join(re:split("]abcd[","^[W-\\]46]",[{parts, + 2}]))), +?line <<":abcd[">> = iolist_to_binary(join(re:split("]abcd[","^[W-\\]46]",[]))), +?line <<":backslash">> = iolist_to_binary(join(re:split("\\backslash","^[W-\\]46]",[trim]))), +?line <<":backslash">> = iolist_to_binary(join(re:split("\\backslash","^[W-\\]46]",[{parts, + 2}]))), +?line <<":backslash">> = iolist_to_binary(join(re:split("\\backslash","^[W-\\]46]",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[W-\\]46]",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[W-\\]46]",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[W-\\]46]",[]))), +?line <<"-46]789">> = iolist_to_binary(join(re:split("-46]789","^[W-\\]46]",[trim]))), +?line <<"-46]789">> = iolist_to_binary(join(re:split("-46]789","^[W-\\]46]",[{parts, + 2}]))), +?line <<"-46]789">> = iolist_to_binary(join(re:split("-46]789","^[W-\\]46]",[]))), +?line <<"well">> = iolist_to_binary(join(re:split("well","^[W-\\]46]",[trim]))), +?line <<"well">> = iolist_to_binary(join(re:split("well","^[W-\\]46]",[{parts, + 2}]))), +?line <<"well">> = iolist_to_binary(join(re:split("well","^[W-\\]46]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark otherword","word (?:[a-zA-Z0-9]+ ){0,10}otherword",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark otherword","word (?:[a-zA-Z0-9]+ ){0,10}otherword",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark otherword","word (?:[a-zA-Z0-9]+ ){0,10}otherword",[]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark","word (?:[a-zA-Z0-9]+ ){0,10}otherword",[trim]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark","word (?:[a-zA-Z0-9]+ ){0,10}otherword",[{parts, + 2}]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark","word (?:[a-zA-Z0-9]+ ){0,10}otherword",[]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope","word (?:[a-zA-Z0-9]+ ){0,300}otherword",[trim]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope","word (?:[a-zA-Z0-9]+ ){0,300}otherword",[{parts, + 2}]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope","word (?:[a-zA-Z0-9]+ ){0,300}otherword",[]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,0}",[trim]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,0}",[{parts, + 2}]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,0}",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(a){0,0}",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(a){0,0}",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(a){0,0}",[]))), +?line <<"aab">> = iolist_to_binary(join(re:split("aab","^(a){0,0}",[trim]))), +?line <<"aab">> = iolist_to_binary(join(re:split("aab","^(a){0,0}",[{parts, + 2}]))), +?line <<"aab">> = iolist_to_binary(join(re:split("aab","^(a){0,0}",[]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,1}",[trim]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,1}",[{parts, + 2}]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,1}",[]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,1}",[trim]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,1}",[{parts, + 2}]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,1}",[]))), +?line <<":a:ab">> = iolist_to_binary(join(re:split("aab","^(a){0,1}",[trim]))), +?line <<":a:ab">> = iolist_to_binary(join(re:split("aab","^(a){0,1}",[{parts, + 2}]))), +?line <<":a:ab">> = iolist_to_binary(join(re:split("aab","^(a){0,1}",[]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,2}",[trim]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,2}",[{parts, + 2}]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,2}",[]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,2}",[trim]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,2}",[{parts, + 2}]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,2}",[]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){0,2}",[trim]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){0,2}",[{parts, + 2}]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){0,2}",[]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,3}",[trim]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,3}",[{parts, + 2}]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,3}",[]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,3}",[trim]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,3}",[{parts, + 2}]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,3}",[]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){0,3}",[trim]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){0,3}",[{parts, + 2}]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){0,3}",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaa","^(a){0,3}",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaa","^(a){0,3}",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaa","^(a){0,3}",[]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,}",[trim]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,}",[{parts, + 2}]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){0,}",[]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,}",[trim]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,}",[{parts, + 2}]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){0,}",[]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){0,}",[trim]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){0,}",[{parts, + 2}]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){0,}",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaa","^(a){0,}",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaa","^(a){0,}",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaa","^(a){0,}",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a){0,}",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a){0,}",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a){0,}",[]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,1}",[trim]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,1}",[{parts, + 2}]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,1}",[]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,1}",[trim]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,1}",[{parts, + 2}]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,1}",[]))), +?line <<":a:ab">> = iolist_to_binary(join(re:split("aab","^(a){1,1}",[trim]))), +?line <<":a:ab">> = iolist_to_binary(join(re:split("aab","^(a){1,1}",[{parts, + 2}]))), +?line <<":a:ab">> = iolist_to_binary(join(re:split("aab","^(a){1,1}",[]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,2}",[trim]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,2}",[{parts, + 2}]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,2}",[]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,2}",[trim]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,2}",[{parts, + 2}]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,2}",[]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){1,2}",[trim]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){1,2}",[{parts, + 2}]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){1,2}",[]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,3}",[trim]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,3}",[{parts, + 2}]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,3}",[]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,3}",[trim]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,3}",[{parts, + 2}]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,3}",[]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){1,3}",[trim]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){1,3}",[{parts, + 2}]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){1,3}",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaa","^(a){1,3}",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaa","^(a){1,3}",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaa","^(a){1,3}",[]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,}",[trim]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,}",[{parts, + 2}]))), +?line <<"bcd">> = iolist_to_binary(join(re:split("bcd","^(a){1,}",[]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,}",[trim]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,}",[{parts, + 2}]))), +?line <<":a:bc">> = iolist_to_binary(join(re:split("abc","^(a){1,}",[]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){1,}",[trim]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){1,}",[{parts, + 2}]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("aab","^(a){1,}",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaa","^(a){1,}",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaa","^(a){1,}",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaa","^(a){1,}",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a){1,}",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a){1,}",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a){1,}",[]))), +?line <<"borfle +: +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[trim]))), +?line <<"borfle +: +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[{parts,2}]))), +?line <<"borfle +: +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[]))), +?line <<"borfle +: +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".{0,}\\.gif",[trim]))), +?line <<"borfle +: +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".{0,}\\.gif",[{parts,2}]))), +?line <<"borfle +: +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".{0,}\\.gif",[]))), +?line <<"borfle +: +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[multiline,trim]))), +?line <<"borfle +: +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[multiline,{parts,2}]))), +?line <<"borfle +: +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[multiline]))), +?line <<": +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[dotall,trim]))), +?line <<": +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[dotall,{parts,2}]))), +?line <<": +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[dotall]))), +?line <<": +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[multiline,dotall,trim]))), +?line <<": +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[multiline,dotall,{parts,2}]))), +?line <<": +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*\\.gif",[multiline,dotall]))), +?line <<"borfle +bib.gif +">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[trim]))), +?line <<"borfle +bib.gif +:">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[{parts,2}]))), +?line <<"borfle +bib.gif +:">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[]))), +?line <<": +: +">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline,trim]))), +?line <<": +bib.gif +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline,{parts,2}]))), +?line <<": +: +:">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline]))), +?line <<"">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[dotall,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[dotall,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[dotall]))), +?line <<"">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline,dotall,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline,dotall,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline,dotall]))), +?line <<"borfle +bib.gif +">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[trim]))), +?line <<"borfle +bib.gif +:">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[{parts,2}]))), +?line <<"borfle +bib.gif +:">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[]))), +?line <<": +: +">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline,trim]))), +?line <<": +bib.gif +no">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline,{parts,2}]))), +?line <<": +: +:">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline]))), +?line <<"">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[dotall,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[dotall,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[dotall]))), +?line <<"">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline,dotall,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline,dotall,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("borfle +bib.gif +no",".*$",[multiline,dotall]))), +?line <<"abcde +:1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[trim]))), +?line <<"abcde +:1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[{parts,2}]))), +?line <<"abcde +:1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[trim]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[{parts, + 2}]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(.*X|^B)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(.*X|^B)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(.*X|^B)",[]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[trim]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[{parts,2}]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[]))), +?line <<"abcde +:1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[multiline,trim]))), +?line <<"abcde +:1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[multiline,{parts,2}]))), +?line <<"abcde +:1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[multiline]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[multiline, + trim]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[multiline, + {parts, + 2}]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[multiline]))), +?line <<"abcde +:B:ar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[multiline,trim]))), +?line <<"abcde +:B:ar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[multiline,{parts,2}]))), +?line <<"abcde +:B:ar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[multiline]))), +?line <<":abcde +1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[dotall,trim]))), +?line <<":abcde +1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[dotall,{parts,2}]))), +?line <<":abcde +1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[dotall]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[dotall, + trim]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[dotall, + {parts, + 2}]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[dotall]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(.*X|^B)",[dotall, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(.*X|^B)",[dotall, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(.*X|^B)",[dotall]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[dotall,trim]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[dotall,{parts,2}]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[dotall]))), +?line <<":abcde +1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[multiline,dotall,trim]))), +?line <<":abcde +1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[multiline,dotall,{parts,2}]))), +?line <<":abcde +1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(.*X|^B)",[multiline,dotall]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[multiline, + dotall, + trim]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[multiline, + dotall, + {parts, + 2}]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(.*X|^B)",[multiline, + dotall]))), +?line <<"abcde +:B:ar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[multiline,dotall,trim]))), +?line <<"abcde +:B:ar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[multiline,dotall,{parts,2}]))), +?line <<"abcde +:B:ar">> = iolist_to_binary(join(re:split("abcde +Bar","(.*X|^B)",[multiline,dotall]))), +?line <<":abcde +1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(?s)(.*X|^B)",[trim]))), +?line <<":abcde +1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(?s)(.*X|^B)",[{parts,2}]))), +?line <<":abcde +1234X:yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(?s)(.*X|^B)",[]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(?s)(.*X|^B)",[trim]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(?s)(.*X|^B)",[{parts, + 2}]))), +?line <<":B:arFoo">> = iolist_to_binary(join(re:split("BarFoo","(?s)(.*X|^B)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?s)(.*X|^B)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?s)(.*X|^B)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?s)(.*X|^B)",[]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(?s)(.*X|^B)",[trim]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(?s)(.*X|^B)",[{parts,2}]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(?s)(.*X|^B)",[]))), +?line <<":yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(?s:.*X|^B)",[trim]))), +?line <<":yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(?s:.*X|^B)",[{parts,2}]))), +?line <<":yz">> = iolist_to_binary(join(re:split("abcde +1234Xyz","(?s:.*X|^B)",[]))), +?line <<":arFoo">> = iolist_to_binary(join(re:split("BarFoo","(?s:.*X|^B)",[trim]))), +?line <<":arFoo">> = iolist_to_binary(join(re:split("BarFoo","(?s:.*X|^B)",[{parts, + 2}]))), +?line <<":arFoo">> = iolist_to_binary(join(re:split("BarFoo","(?s:.*X|^B)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?s:.*X|^B)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?s:.*X|^B)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?s:.*X|^B)",[]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(?s:.*X|^B)",[trim]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(?s:.*X|^B)",[{parts,2}]))), +?line <<"abcde +Bar">> = iolist_to_binary(join(re:split("abcde +Bar","(?s:.*X|^B)",[]))), +?line <<"**** Failers">> = iolist_to_binary(join(re:split("**** Failers","^.*B",[trim]))), +?line <<"**** Failers">> = iolist_to_binary(join(re:split("**** Failers","^.*B",[{parts, + 2}]))), +?line <<"**** Failers">> = iolist_to_binary(join(re:split("**** Failers","^.*B",[]))), +?line <<"abc +B">> = iolist_to_binary(join(re:split("abc +B","^.*B",[trim]))), +?line <<"abc +B">> = iolist_to_binary(join(re:split("abc +B","^.*B",[{parts,2}]))), +?line <<"abc +B">> = iolist_to_binary(join(re:split("abc +B","^.*B",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc +B","(?s)^.*B",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc +B","(?s)^.*B",[{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc +B","(?s)^.*B",[]))), +?line <<"abc +">> = iolist_to_binary(join(re:split("abc +B","(?m)^.*B",[trim]))), +?line <<"abc +:">> = iolist_to_binary(join(re:split("abc +B","(?m)^.*B",[{parts,2}]))), +?line <<"abc +:">> = iolist_to_binary(join(re:split("abc +B","(?m)^.*B",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc +B","(?ms)^.*B",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc +B","(?ms)^.*B",[{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc +B","(?ms)^.*B",[]))), +?line <<"abc +">> = iolist_to_binary(join(re:split("abc +B","(?ms)^B",[trim]))), +?line <<"abc +:">> = iolist_to_binary(join(re:split("abc +B","(?ms)^B",[{parts,2}]))), +?line <<"abc +:">> = iolist_to_binary(join(re:split("abc +B","(?ms)^B",[]))), +?line <<"">> = iolist_to_binary(join(re:split("B","(?s)B$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("B","(?s)B$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("B","(?s)B$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("123456654321","^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("123456654321","^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("123456654321","^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("123456654321","^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("123456654321","^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("123456654321","^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d",[]))), +?line <<"">> = iolist_to_binary(join(re:split("123456654321","^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("123456654321","^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("123456654321","^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcabcabcabc","^[abc]{12}",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcabcabcabc","^[abc]{12}",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcabcabcabc","^[abc]{12}",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcabcabcabc","^[a-c]{12}",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcabcabcabc","^[a-c]{12}",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcabcabcabc","^[a-c]{12}",[]))), +?line <<":c">> = iolist_to_binary(join(re:split("abcabcabcabc","^(a|b|c){12}",[trim]))), +?line <<":c:">> = iolist_to_binary(join(re:split("abcabcabcabc","^(a|b|c){12}",[{parts, + 2}]))), +?line <<":c:">> = iolist_to_binary(join(re:split("abcabcabcabc","^(a|b|c){12}",[]))), +?line <<"">> = iolist_to_binary(join(re:split("n","^[abcdefghijklmnopqrstuvwxy0123456789]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("n","^[abcdefghijklmnopqrstuvwxy0123456789]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("n","^[abcdefghijklmnopqrstuvwxy0123456789]",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[abcdefghijklmnopqrstuvwxy0123456789]",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[abcdefghijklmnopqrstuvwxy0123456789]",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[abcdefghijklmnopqrstuvwxy0123456789]",[]))), +?line <<"z">> = iolist_to_binary(join(re:split("z","^[abcdefghijklmnopqrstuvwxy0123456789]",[trim]))), +?line <<"z">> = iolist_to_binary(join(re:split("z","^[abcdefghijklmnopqrstuvwxy0123456789]",[{parts, + 2}]))), +?line <<"z">> = iolist_to_binary(join(re:split("z","^[abcdefghijklmnopqrstuvwxy0123456789]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcd","abcde{0,0}",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd","abcde{0,0}",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd","abcde{0,0}",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abcde{0,0}",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abcde{0,0}",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abcde{0,0}",[]))), +?line <<"abce">> = iolist_to_binary(join(re:split("abce","abcde{0,0}",[trim]))), +?line <<"abce">> = iolist_to_binary(join(re:split("abce","abcde{0,0}",[{parts, + 2}]))), +?line <<"abce">> = iolist_to_binary(join(re:split("abce","abcde{0,0}",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abe","ab[cd]{0,0}e",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abe","ab[cd]{0,0}e",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abe","ab[cd]{0,0}e",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab[cd]{0,0}e",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab[cd]{0,0}e",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab[cd]{0,0}e",[]))), +?line <<"abcde">> = iolist_to_binary(join(re:split("abcde","ab[cd]{0,0}e",[trim]))), +?line <<"abcde">> = iolist_to_binary(join(re:split("abcde","ab[cd]{0,0}e",[{parts, + 2}]))), +?line <<"abcde">> = iolist_to_binary(join(re:split("abcde","ab[cd]{0,0}e",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abd","ab(c){0,0}d",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("abd","ab(c){0,0}d",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("abd","ab(c){0,0}d",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab(c){0,0}d",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab(c){0,0}d",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab(c){0,0}d",[]))), +?line <<"abcd">> = iolist_to_binary(join(re:split("abcd","ab(c){0,0}d",[trim]))), +?line <<"abcd">> = iolist_to_binary(join(re:split("abcd","ab(c){0,0}d",[{parts, + 2}]))), +?line <<"abcd">> = iolist_to_binary(join(re:split("abcd","ab(c){0,0}d",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","a(b*)",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","a(b*)",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","a(b*)",[]))), +?line <<":b">> = iolist_to_binary(join(re:split("ab","a(b*)",[trim]))), +?line <<":b:">> = iolist_to_binary(join(re:split("ab","a(b*)",[{parts, + 2}]))), +?line <<":b:">> = iolist_to_binary(join(re:split("ab","a(b*)",[]))), +?line <<":bbbb">> = iolist_to_binary(join(re:split("abbbb","a(b*)",[trim]))), +?line <<":bbbb:">> = iolist_to_binary(join(re:split("abbbb","a(b*)",[{parts, + 2}]))), +?line <<":bbbb:">> = iolist_to_binary(join(re:split("abbbb","a(b*)",[]))), +?line <<"*** F::ilers">> = iolist_to_binary(join(re:split("*** Failers","a(b*)",[trim]))), +?line <<"*** F::ilers">> = iolist_to_binary(join(re:split("*** Failers","a(b*)",[{parts, + 2}]))), +?line <<"*** F::ilers">> = iolist_to_binary(join(re:split("*** Failers","a(b*)",[]))), +?line <<"bbbbb">> = iolist_to_binary(join(re:split("bbbbb","a(b*)",[trim]))), +?line <<"bbbbb">> = iolist_to_binary(join(re:split("bbbbb","a(b*)",[{parts, + 2}]))), +?line <<"bbbbb">> = iolist_to_binary(join(re:split("bbbbb","a(b*)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abe","ab\\d{0}e",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abe","ab\\d{0}e",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abe","ab\\d{0}e",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab\\d{0}e",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab\\d{0}e",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab\\d{0}e",[]))), +?line <<"ab1e">> = iolist_to_binary(join(re:split("ab1e","ab\\d{0}e",[trim]))), +?line <<"ab1e">> = iolist_to_binary(join(re:split("ab1e","ab\\d{0}e",[{parts, + 2}]))), +?line <<"ab1e">> = iolist_to_binary(join(re:split("ab1e","ab\\d{0}e",[]))), +?line <<"the :quick: brown fox">> = iolist_to_binary(join(re:split("the \"quick\" brown fox","\"([^\\\\\"]+|\\\\.)*\"",[trim]))), +?line <<"the :quick: brown fox">> = iolist_to_binary(join(re:split("the \"quick\" brown fox","\"([^\\\\\"]+|\\\\.)*\"",[{parts, + 2}]))), +?line <<"the :quick: brown fox">> = iolist_to_binary(join(re:split("the \"quick\" brown fox","\"([^\\\\\"]+|\\\\.)*\"",[]))), +?line <<": brown fox">> = iolist_to_binary(join(re:split("\"the \\\"quick\\\" brown fox\"","\"([^\\\\\"]+|\\\\.)*\"",[trim]))), +?line <<": brown fox:">> = iolist_to_binary(join(re:split("\"the \\\"quick\\\" brown fox\"","\"([^\\\\\"]+|\\\\.)*\"",[{parts, + 2}]))), +?line <<": brown fox:">> = iolist_to_binary(join(re:split("\"the \\\"quick\\\" brown fox\"","\"([^\\\\\"]+|\\\\.)*\"",[]))), +?line <<"a:b:c">> = iolist_to_binary(join(re:split("abc","",[trim]))), +?line <<"a:bc">> = iolist_to_binary(join(re:split("abc","",[{parts, + 2}]))), +?line <<"a:b:c:">> = iolist_to_binary(join(re:split("abc","",[]))), +?line <<"">> = iolist_to_binary(join(re:split("acb","a[^a]b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("acb","a[^a]b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("acb","a[^a]b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a +b","a[^a]b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a +b","a[^a]b",[{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a +b","a[^a]b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("acb","a.b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("acb","a.b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("acb","a.b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a.b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a.b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a.b",[]))), +?line <<"a +b">> = iolist_to_binary(join(re:split("a +b","a.b",[trim]))), +?line <<"a +b">> = iolist_to_binary(join(re:split("a +b","a.b",[{parts,2}]))), +?line <<"a +b">> = iolist_to_binary(join(re:split("a +b","a.b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("acb","a[^a]b",[dotall, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("acb","a[^a]b",[dotall, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("acb","a[^a]b",[dotall]))), +?line <<"">> = iolist_to_binary(join(re:split("a +b","a[^a]b",[dotall,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a +b","a[^a]b",[dotall,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a +b","a[^a]b",[dotall]))), +?line <<"">> = iolist_to_binary(join(re:split("acb","a.b",[dotall, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("acb","a.b",[dotall, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("acb","a.b",[dotall]))), +?line <<"">> = iolist_to_binary(join(re:split("a +b","a.b",[dotall,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a +b","a.b",[dotall,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a +b","a.b",[dotall]))), +?line <<":a">> = iolist_to_binary(join(re:split("bac","^(b+?|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bac","^(b+?|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbac","^(b+?|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbac","^(b+?|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbbac","^(b+?|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbac","^(b+?|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbbbac","^(b+?|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbac","^(b+?|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbbbbac","^(b+?|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbbac","^(b+?|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbbac","^(b+?|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bac","^(b+|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bac","^(b+|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bac","^(b+|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbac","^(b+|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbac","^(b+|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbac","^(b+|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbbac","^(b+|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbac","^(b+|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbac","^(b+|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbbbac","^(b+|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbac","^(b+|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbac","^(b+|a){1,2}?c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("bbbbbac","^(b+|a){1,2}?c",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbbac","^(b+|a){1,2}?c",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("bbbbbac","^(b+|a){1,2}?c",[]))), +?line <<"x +b">> = iolist_to_binary(join(re:split("x +b","(?!\\A)x",[multiline,trim]))), +?line <<"x +b">> = iolist_to_binary(join(re:split("x +b","(?!\\A)x",[multiline,{parts,2}]))), +?line <<"x +b">> = iolist_to_binary(join(re:split("x +b","(?!\\A)x",[multiline]))), +?line <<"a">> = iolist_to_binary(join(re:split("ax","(?!\\A)x",[multiline, + trim]))), +?line <<"a:">> = iolist_to_binary(join(re:split("ax","(?!\\A)x",[multiline, + {parts, + 2}]))), +?line <<"a:">> = iolist_to_binary(join(re:split("ax","(?!\\A)x",[multiline]))), +?line <<"{ab}">> = iolist_to_binary(join(re:split("{ab}","\\x0{ab}",[trim]))), +?line <<"{ab}">> = iolist_to_binary(join(re:split("{ab}","\\x0{ab}",[{parts, + 2}]))), +?line <<"{ab}">> = iolist_to_binary(join(re:split("{ab}","\\x0{ab}",[]))), +?line <<"">> = iolist_to_binary(join(re:split("CD","(A|B)*?CD",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("CD","(A|B)*?CD",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("CD","(A|B)*?CD",[]))), +?line <<"">> = iolist_to_binary(join(re:split("CD","(A|B)*CD",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("CD","(A|B)*CD",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("CD","(A|B)*CD",[]))), +?line <<":AB:AB">> = iolist_to_binary(join(re:split("ABABAB","(AB)*?\\1",[trim]))), +?line <<":AB:AB">> = iolist_to_binary(join(re:split("ABABAB","(AB)*?\\1",[{parts, + 2}]))), +?line <<":AB:AB">> = iolist_to_binary(join(re:split("ABABAB","(AB)*?\\1",[]))), +?line <<":AB">> = iolist_to_binary(join(re:split("ABABAB","(AB)*\\1",[trim]))), +?line <<":AB:">> = iolist_to_binary(join(re:split("ABABAB","(AB)*\\1",[{parts, + 2}]))), +?line <<":AB:">> = iolist_to_binary(join(re:split("ABABAB","(AB)*\\1",[]))), +?line <<"">> = iolist_to_binary(join(re:split("foo","(?> = iolist_to_binary(join(re:split("foo","(?> = iolist_to_binary(join(re:split("foo","(?> = iolist_to_binary(join(re:split("catfood","(?> = iolist_to_binary(join(re:split("catfood","(?> = iolist_to_binary(join(re:split("catfood","(?> = iolist_to_binary(join(re:split("arfootle","(?> = iolist_to_binary(join(re:split("arfootle","(?> = iolist_to_binary(join(re:split("arfootle","(?> = iolist_to_binary(join(re:split("rfoosh","(?> = iolist_to_binary(join(re:split("rfoosh","(?> = iolist_to_binary(join(re:split("rfoosh","(?> = iolist_to_binary(join(re:split("*** Failers","(?> = iolist_to_binary(join(re:split("*** Failers","(?> = iolist_to_binary(join(re:split("*** Failers","(?> = iolist_to_binary(join(re:split("barfoo","(?> = iolist_to_binary(join(re:split("barfoo","(?> = iolist_to_binary(join(re:split("barfoo","(?> = iolist_to_binary(join(re:split("towbarfoo","(?> = iolist_to_binary(join(re:split("towbarfoo","(?> = iolist_to_binary(join(re:split("towbarfoo","(?> = iolist_to_binary(join(re:split("catfood","\\w{3}(?> = iolist_to_binary(join(re:split("catfood","\\w{3}(?> = iolist_to_binary(join(re:split("catfood","\\w{3}(?> = iolist_to_binary(join(re:split("*** Failers","\\w{3}(?> = iolist_to_binary(join(re:split("*** Failers","\\w{3}(?> = iolist_to_binary(join(re:split("*** Failers","\\w{3}(?> = iolist_to_binary(join(re:split("foo","\\w{3}(?> = iolist_to_binary(join(re:split("foo","\\w{3}(?> = iolist_to_binary(join(re:split("foo","\\w{3}(?> = iolist_to_binary(join(re:split("barfoo","\\w{3}(?> = iolist_to_binary(join(re:split("barfoo","\\w{3}(?> = iolist_to_binary(join(re:split("barfoo","\\w{3}(?> = iolist_to_binary(join(re:split("towbarfoo","\\w{3}(?> = iolist_to_binary(join(re:split("towbarfoo","\\w{3}(?> = iolist_to_binary(join(re:split("towbarfoo","\\w{3}(?> = iolist_to_binary(join(re:split("fooabar","(?<=(foo)a)bar",[trim]))), +?line <<"fooa:foo:">> = iolist_to_binary(join(re:split("fooabar","(?<=(foo)a)bar",[{parts, + 2}]))), +?line <<"fooa:foo:">> = iolist_to_binary(join(re:split("fooabar","(?<=(foo)a)bar",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=(foo)a)bar",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=(foo)a)bar",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=(foo)a)bar",[]))), +?line <<"bar">> = iolist_to_binary(join(re:split("bar","(?<=(foo)a)bar",[trim]))), +?line <<"bar">> = iolist_to_binary(join(re:split("bar","(?<=(foo)a)bar",[{parts, + 2}]))), +?line <<"bar">> = iolist_to_binary(join(re:split("bar","(?<=(foo)a)bar",[]))), +?line <<"foobbar">> = iolist_to_binary(join(re:split("foobbar","(?<=(foo)a)bar",[trim]))), +?line <<"foobbar">> = iolist_to_binary(join(re:split("foobbar","(?<=(foo)a)bar",[{parts, + 2}]))), +?line <<"foobbar">> = iolist_to_binary(join(re:split("foobbar","(?<=(foo)a)bar",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","\\Aabc\\z",[multiline, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","\\Aabc\\z",[multiline, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","\\Aabc\\z",[multiline]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\Aabc\\z",[multiline, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\Aabc\\z",[multiline, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\Aabc\\z",[multiline]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","\\Aabc\\z",[multiline, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","\\Aabc\\z",[multiline, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","\\Aabc\\z",[multiline]))), +?line <<"qqq +abc">> = iolist_to_binary(join(re:split("qqq +abc","\\Aabc\\z",[multiline,trim]))), +?line <<"qqq +abc">> = iolist_to_binary(join(re:split("qqq +abc","\\Aabc\\z",[multiline,{parts,2}]))), +?line <<"qqq +abc">> = iolist_to_binary(join(re:split("qqq +abc","\\Aabc\\z",[multiline]))), +?line <<"abc +zzz">> = iolist_to_binary(join(re:split("abc +zzz","\\Aabc\\z",[multiline,trim]))), +?line <<"abc +zzz">> = iolist_to_binary(join(re:split("abc +zzz","\\Aabc\\z",[multiline,{parts,2}]))), +?line <<"abc +zzz">> = iolist_to_binary(join(re:split("abc +zzz","\\Aabc\\z",[multiline]))), +?line <<"qqq +abc +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","\\Aabc\\z",[multiline,trim]))), +?line <<"qqq +abc +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","\\Aabc\\z",[multiline,{parts,2}]))), +?line <<"qqq +abc +zzz">> = iolist_to_binary(join(re:split("qqq +abc +zzz","\\Aabc\\z",[multiline]))), +?line <<"1:.23">> = iolist_to_binary(join(re:split("1.230003938","(?>(\\.\\d\\d[1-9]?))\\d+",[trim]))), +?line <<"1:.23:">> = iolist_to_binary(join(re:split("1.230003938","(?>(\\.\\d\\d[1-9]?))\\d+",[{parts, + 2}]))), +?line <<"1:.23:">> = iolist_to_binary(join(re:split("1.230003938","(?>(\\.\\d\\d[1-9]?))\\d+",[]))), +?line <<"1:.875">> = iolist_to_binary(join(re:split("1.875000282","(?>(\\.\\d\\d[1-9]?))\\d+",[trim]))), +?line <<"1:.875:">> = iolist_to_binary(join(re:split("1.875000282","(?>(\\.\\d\\d[1-9]?))\\d+",[{parts, + 2}]))), +?line <<"1:.875:">> = iolist_to_binary(join(re:split("1.875000282","(?>(\\.\\d\\d[1-9]?))\\d+",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?>(\\.\\d\\d[1-9]?))\\d+",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?>(\\.\\d\\d[1-9]?))\\d+",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?>(\\.\\d\\d[1-9]?))\\d+",[]))), +?line <<"1.235">> = iolist_to_binary(join(re:split("1.235","(?>(\\.\\d\\d[1-9]?))\\d+",[trim]))), +?line <<"1.235">> = iolist_to_binary(join(re:split("1.235","(?>(\\.\\d\\d[1-9]?))\\d+",[{parts, + 2}]))), +?line <<"1.235">> = iolist_to_binary(join(re:split("1.235","(?>(\\.\\d\\d[1-9]?))\\d+",[]))), +?line <<":party">> = iolist_to_binary(join(re:split("now is the time for all good men to come to the aid of the party","^((?>\\w+)|(?>\\s+))*$",[trim]))), +?line <<":party:">> = iolist_to_binary(join(re:split("now is the time for all good men to come to the aid of the party","^((?>\\w+)|(?>\\s+))*$",[{parts, + 2}]))), +?line <<":party:">> = iolist_to_binary(join(re:split("now is the time for all good men to come to the aid of the party","^((?>\\w+)|(?>\\s+))*$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^((?>\\w+)|(?>\\s+))*$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^((?>\\w+)|(?>\\s+))*$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^((?>\\w+)|(?>\\s+))*$",[]))), +?line <<"this is not a line with only words and spaces!">> = iolist_to_binary(join(re:split("this is not a line with only words and spaces!","^((?>\\w+)|(?>\\s+))*$",[trim]))), +?line <<"this is not a line with only words and spaces!">> = iolist_to_binary(join(re:split("this is not a line with only words and spaces!","^((?>\\w+)|(?>\\s+))*$",[{parts, + 2}]))), +?line <<"this is not a line with only words and spaces!">> = iolist_to_binary(join(re:split("this is not a line with only words and spaces!","^((?>\\w+)|(?>\\s+))*$",[]))), +?line <<":12345:a">> = iolist_to_binary(join(re:split("12345a","(\\d+)(\\w)",[trim]))), +?line <<":12345:a:">> = iolist_to_binary(join(re:split("12345a","(\\d+)(\\w)",[{parts, + 2}]))), +?line <<":12345:a:">> = iolist_to_binary(join(re:split("12345a","(\\d+)(\\w)",[]))), +?line <<":1234:5:+">> = iolist_to_binary(join(re:split("12345+","(\\d+)(\\w)",[trim]))), +?line <<":1234:5:+">> = iolist_to_binary(join(re:split("12345+","(\\d+)(\\w)",[{parts, + 2}]))), +?line <<":1234:5:+">> = iolist_to_binary(join(re:split("12345+","(\\d+)(\\w)",[]))), +?line <<":12345:a">> = iolist_to_binary(join(re:split("12345a","((?>\\d+))(\\w)",[trim]))), +?line <<":12345:a:">> = iolist_to_binary(join(re:split("12345a","((?>\\d+))(\\w)",[{parts, + 2}]))), +?line <<":12345:a:">> = iolist_to_binary(join(re:split("12345a","((?>\\d+))(\\w)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?>\\d+))(\\w)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?>\\d+))(\\w)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?>\\d+))(\\w)",[]))), +?line <<"12345+">> = iolist_to_binary(join(re:split("12345+","((?>\\d+))(\\w)",[trim]))), +?line <<"12345+">> = iolist_to_binary(join(re:split("12345+","((?>\\d+))(\\w)",[{parts, + 2}]))), +?line <<"12345+">> = iolist_to_binary(join(re:split("12345+","((?>\\d+))(\\w)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaab","(?>a+)b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaab","(?>a+)b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaab","(?>a+)b",[]))), +?line <<":aaab">> = iolist_to_binary(join(re:split("aaab","((?>a+)b)",[trim]))), +?line <<":aaab:">> = iolist_to_binary(join(re:split("aaab","((?>a+)b)",[{parts, + 2}]))), +?line <<":aaab:">> = iolist_to_binary(join(re:split("aaab","((?>a+)b)",[]))), +?line <<":aaa">> = iolist_to_binary(join(re:split("aaab","(?>(a+))b",[trim]))), +?line <<":aaa:">> = iolist_to_binary(join(re:split("aaab","(?>(a+))b",[{parts, + 2}]))), +?line <<":aaa:">> = iolist_to_binary(join(re:split("aaab","(?>(a+))b",[]))), +?line <<"aaa:ccc">> = iolist_to_binary(join(re:split("aaabbbccc","(?>b)+",[trim]))), +?line <<"aaa:ccc">> = iolist_to_binary(join(re:split("aaabbbccc","(?>b)+",[{parts, + 2}]))), +?line <<"aaa:ccc">> = iolist_to_binary(join(re:split("aaabbbccc","(?>b)+",[]))), +?line <<"::::d">> = iolist_to_binary(join(re:split("aaabbbbccccd","(?>a+|b+|c+)*c",[trim]))), +?line <<":cccd">> = iolist_to_binary(join(re:split("aaabbbbccccd","(?>a+|b+|c+)*c",[{parts, + 2}]))), +?line <<"::::d">> = iolist_to_binary(join(re:split("aaabbbbccccd","(?>a+|b+|c+)*c",[]))), +?line <<"((:x">> = iolist_to_binary(join(re:split("((abc(ade)ufh()()x","((?>[^()]+)|\\([^()]*\\))+",[trim]))), +?line <<"((:x:">> = iolist_to_binary(join(re:split("((abc(ade)ufh()()x","((?>[^()]+)|\\([^()]*\\))+",[{parts, + 2}]))), +?line <<"((:x:">> = iolist_to_binary(join(re:split("((abc(ade)ufh()()x","((?>[^()]+)|\\([^()]*\\))+",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("(abc)","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("(abc)","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("(abc)","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[]))), +?line <<":xyz">> = iolist_to_binary(join(re:split("(abc(def)xyz)","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[trim]))), +?line <<":xyz:">> = iolist_to_binary(join(re:split("(abc(def)xyz)","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[{parts, + 2}]))), +?line <<":xyz:">> = iolist_to_binary(join(re:split("(abc(def)xyz)","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[]))), +?line <<"((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[trim]))), +?line <<"((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[{parts, + 2}]))), +?line <<"((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","\\(((?>[^()]+)|\\([^()]+\\))+\\)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab","a(?-i)b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","a(?-i)b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","a(?-i)b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("Ab","a(?-i)b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("Ab","a(?-i)b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("Ab","a(?-i)b",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?-i)b",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?-i)b",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?-i)b",[caseless]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","a(?-i)b",[caseless, + trim]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","a(?-i)b",[caseless, + {parts, + 2}]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","a(?-i)b",[caseless]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","a(?-i)b",[caseless, + trim]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","a(?-i)b",[caseless, + {parts, + 2}]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","a(?-i)b",[caseless]))), +?line <<":a bc">> = iolist_to_binary(join(re:split("a bcd e","(a (?x)b c)d e",[trim]))), +?line <<":a bc:">> = iolist_to_binary(join(re:split("a bcd e","(a (?x)b c)d e",[{parts, + 2}]))), +?line <<":a bc:">> = iolist_to_binary(join(re:split("a bcd e","(a (?x)b c)d e",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a (?x)b c)d e",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a (?x)b c)d e",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a (?x)b c)d e",[]))), +?line <<"a b cd e">> = iolist_to_binary(join(re:split("a b cd e","(a (?x)b c)d e",[trim]))), +?line <<"a b cd e">> = iolist_to_binary(join(re:split("a b cd e","(a (?x)b c)d e",[{parts, + 2}]))), +?line <<"a b cd e">> = iolist_to_binary(join(re:split("a b cd e","(a (?x)b c)d e",[]))), +?line <<"abcd e">> = iolist_to_binary(join(re:split("abcd e","(a (?x)b c)d e",[trim]))), +?line <<"abcd e">> = iolist_to_binary(join(re:split("abcd e","(a (?x)b c)d e",[{parts, + 2}]))), +?line <<"abcd e">> = iolist_to_binary(join(re:split("abcd e","(a (?x)b c)d e",[]))), +?line <<"a bcde">> = iolist_to_binary(join(re:split("a bcde","(a (?x)b c)d e",[trim]))), +?line <<"a bcde">> = iolist_to_binary(join(re:split("a bcde","(a (?x)b c)d e",[{parts, + 2}]))), +?line <<"a bcde">> = iolist_to_binary(join(re:split("a bcde","(a (?x)b c)d e",[]))), +?line <<":a bcde f">> = iolist_to_binary(join(re:split("a bcde f","(a b(?x)c d (?-x)e f)",[trim]))), +?line <<":a bcde f:">> = iolist_to_binary(join(re:split("a bcde f","(a b(?x)c d (?-x)e f)",[{parts, + 2}]))), +?line <<":a bcde f:">> = iolist_to_binary(join(re:split("a bcde f","(a b(?x)c d (?-x)e f)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a b(?x)c d (?-x)e f)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a b(?x)c d (?-x)e f)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a b(?x)c d (?-x)e f)",[]))), +?line <<"abcdef">> = iolist_to_binary(join(re:split("abcdef","(a b(?x)c d (?-x)e f)",[trim]))), +?line <<"abcdef">> = iolist_to_binary(join(re:split("abcdef","(a b(?x)c d (?-x)e f)",[{parts, + 2}]))), +?line <<"abcdef">> = iolist_to_binary(join(re:split("abcdef","(a b(?x)c d (?-x)e f)",[]))), +?line <<":ab">> = iolist_to_binary(join(re:split("abc","(a(?i)b)c",[trim]))), +?line <<":ab:">> = iolist_to_binary(join(re:split("abc","(a(?i)b)c",[{parts, + 2}]))), +?line <<":ab:">> = iolist_to_binary(join(re:split("abc","(a(?i)b)c",[]))), +?line <<":aB">> = iolist_to_binary(join(re:split("aBc","(a(?i)b)c",[trim]))), +?line <<":aB:">> = iolist_to_binary(join(re:split("aBc","(a(?i)b)c",[{parts, + 2}]))), +?line <<":aB:">> = iolist_to_binary(join(re:split("aBc","(a(?i)b)c",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a(?i)b)c",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a(?i)b)c",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a(?i)b)c",[]))), +?line <<"abC">> = iolist_to_binary(join(re:split("abC","(a(?i)b)c",[trim]))), +?line <<"abC">> = iolist_to_binary(join(re:split("abC","(a(?i)b)c",[{parts, + 2}]))), +?line <<"abC">> = iolist_to_binary(join(re:split("abC","(a(?i)b)c",[]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","(a(?i)b)c",[trim]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","(a(?i)b)c",[{parts, + 2}]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","(a(?i)b)c",[]))), +?line <<"Abc">> = iolist_to_binary(join(re:split("Abc","(a(?i)b)c",[trim]))), +?line <<"Abc">> = iolist_to_binary(join(re:split("Abc","(a(?i)b)c",[{parts, + 2}]))), +?line <<"Abc">> = iolist_to_binary(join(re:split("Abc","(a(?i)b)c",[]))), +?line <<"ABc">> = iolist_to_binary(join(re:split("ABc","(a(?i)b)c",[trim]))), +?line <<"ABc">> = iolist_to_binary(join(re:split("ABc","(a(?i)b)c",[{parts, + 2}]))), +?line <<"ABc">> = iolist_to_binary(join(re:split("ABc","(a(?i)b)c",[]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","(a(?i)b)c",[trim]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","(a(?i)b)c",[{parts, + 2}]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","(a(?i)b)c",[]))), +?line <<"AbC">> = iolist_to_binary(join(re:split("AbC","(a(?i)b)c",[trim]))), +?line <<"AbC">> = iolist_to_binary(join(re:split("AbC","(a(?i)b)c",[{parts, + 2}]))), +?line <<"AbC">> = iolist_to_binary(join(re:split("AbC","(a(?i)b)c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","a(?i:b)c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","a(?i:b)c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","a(?i:b)c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aBc","a(?i:b)c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aBc","a(?i:b)c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aBc","a(?i:b)c",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?i:b)c",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?i:b)c",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?i:b)c",[]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","a(?i:b)c",[trim]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","a(?i:b)c",[{parts, + 2}]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","a(?i:b)c",[]))), +?line <<"abC">> = iolist_to_binary(join(re:split("abC","a(?i:b)c",[trim]))), +?line <<"abC">> = iolist_to_binary(join(re:split("abC","a(?i:b)c",[{parts, + 2}]))), +?line <<"abC">> = iolist_to_binary(join(re:split("abC","a(?i:b)c",[]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","a(?i:b)c",[trim]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","a(?i:b)c",[{parts, + 2}]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","a(?i:b)c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aBc","a(?i:b)*c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aBc","a(?i:b)*c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aBc","a(?i:b)*c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aBBc","a(?i:b)*c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aBBc","a(?i:b)*c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aBBc","a(?i:b)*c",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?i:b)*c",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?i:b)*c",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?i:b)*c",[]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","a(?i:b)*c",[trim]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","a(?i:b)*c",[{parts, + 2}]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","a(?i:b)*c",[]))), +?line <<"aBBC">> = iolist_to_binary(join(re:split("aBBC","a(?i:b)*c",[trim]))), +?line <<"aBBC">> = iolist_to_binary(join(re:split("aBBC","a(?i:b)*c",[{parts, + 2}]))), +?line <<"aBBC">> = iolist_to_binary(join(re:split("aBBC","a(?i:b)*c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcd","a(?=b(?i)c)\\w\\wd",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd","a(?=b(?i)c)\\w\\wd",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd","a(?=b(?i)c)\\w\\wd",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abCd","a(?=b(?i)c)\\w\\wd",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abCd","a(?=b(?i)c)\\w\\wd",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abCd","a(?=b(?i)c)\\w\\wd",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?=b(?i)c)\\w\\wd",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?=b(?i)c)\\w\\wd",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?=b(?i)c)\\w\\wd",[]))), +?line <<"aBCd">> = iolist_to_binary(join(re:split("aBCd","a(?=b(?i)c)\\w\\wd",[trim]))), +?line <<"aBCd">> = iolist_to_binary(join(re:split("aBCd","a(?=b(?i)c)\\w\\wd",[{parts, + 2}]))), +?line <<"aBCd">> = iolist_to_binary(join(re:split("aBCd","a(?=b(?i)c)\\w\\wd",[]))), +?line <<"abcD">> = iolist_to_binary(join(re:split("abcD","a(?=b(?i)c)\\w\\wd",[trim]))), +?line <<"abcD">> = iolist_to_binary(join(re:split("abcD","a(?=b(?i)c)\\w\\wd",[{parts, + 2}]))), +?line <<"abcD">> = iolist_to_binary(join(re:split("abcD","a(?=b(?i)c)\\w\\wd",[]))), +?line <<"">> = iolist_to_binary(join(re:split("more than million","(?s-i:more.*than).*million",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("more than million","(?s-i:more.*than).*million",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("more than million","(?s-i:more.*than).*million",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("more than MILLION","(?s-i:more.*than).*million",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("more than MILLION","(?s-i:more.*than).*million",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("more than MILLION","(?s-i:more.*than).*million",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("more + than Million","(?s-i:more.*than).*million",[caseless,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("more + than Million","(?s-i:more.*than).*million",[caseless,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("more + than Million","(?s-i:more.*than).*million",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?s-i:more.*than).*million",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?s-i:more.*than).*million",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?s-i:more.*than).*million",[caseless]))), +?line <<"MORE THAN MILLION">> = iolist_to_binary(join(re:split("MORE THAN MILLION","(?s-i:more.*than).*million",[caseless, + trim]))), +?line <<"MORE THAN MILLION">> = iolist_to_binary(join(re:split("MORE THAN MILLION","(?s-i:more.*than).*million",[caseless, + {parts, + 2}]))), +?line <<"MORE THAN MILLION">> = iolist_to_binary(join(re:split("MORE THAN MILLION","(?s-i:more.*than).*million",[caseless]))), +?line <<"more + than + million">> = iolist_to_binary(join(re:split("more + than + million","(?s-i:more.*than).*million",[caseless,trim]))), +?line <<"more + than + million">> = iolist_to_binary(join(re:split("more + than + million","(?s-i:more.*than).*million",[caseless,{parts,2}]))), +?line <<"more + than + million">> = iolist_to_binary(join(re:split("more + than + million","(?s-i:more.*than).*million",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("more than million","(?:(?s-i)more.*than).*million",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("more than million","(?:(?s-i)more.*than).*million",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("more than million","(?:(?s-i)more.*than).*million",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("more than MILLION","(?:(?s-i)more.*than).*million",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("more than MILLION","(?:(?s-i)more.*than).*million",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("more than MILLION","(?:(?s-i)more.*than).*million",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("more + than Million","(?:(?s-i)more.*than).*million",[caseless,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("more + than Million","(?:(?s-i)more.*than).*million",[caseless,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("more + than Million","(?:(?s-i)more.*than).*million",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?s-i)more.*than).*million",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?s-i)more.*than).*million",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?s-i)more.*than).*million",[caseless]))), +?line <<"MORE THAN MILLION">> = iolist_to_binary(join(re:split("MORE THAN MILLION","(?:(?s-i)more.*than).*million",[caseless, + trim]))), +?line <<"MORE THAN MILLION">> = iolist_to_binary(join(re:split("MORE THAN MILLION","(?:(?s-i)more.*than).*million",[caseless, + {parts, + 2}]))), +?line <<"MORE THAN MILLION">> = iolist_to_binary(join(re:split("MORE THAN MILLION","(?:(?s-i)more.*than).*million",[caseless]))), +?line <<"more + than + million">> = iolist_to_binary(join(re:split("more + than + million","(?:(?s-i)more.*than).*million",[caseless,trim]))), +?line <<"more + than + million">> = iolist_to_binary(join(re:split("more + than + million","(?:(?s-i)more.*than).*million",[caseless,{parts,2}]))), +?line <<"more + than + million">> = iolist_to_binary(join(re:split("more + than + million","(?:(?s-i)more.*than).*million",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","(?>a(?i)b+)+c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","(?>a(?i)b+)+c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","(?>a(?i)b+)+c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aBbc","(?>a(?i)b+)+c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aBbc","(?>a(?i)b+)+c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aBbc","(?>a(?i)b+)+c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aBBc","(?>a(?i)b+)+c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aBBc","(?>a(?i)b+)+c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aBBc","(?>a(?i)b+)+c",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?>a(?i)b+)+c",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?>a(?i)b+)+c",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?>a(?i)b+)+c",[]))), +?line <<"Abc">> = iolist_to_binary(join(re:split("Abc","(?>a(?i)b+)+c",[trim]))), +?line <<"Abc">> = iolist_to_binary(join(re:split("Abc","(?>a(?i)b+)+c",[{parts, + 2}]))), +?line <<"Abc">> = iolist_to_binary(join(re:split("Abc","(?>a(?i)b+)+c",[]))), +?line <<"abAb">> = iolist_to_binary(join(re:split("abAb","(?>a(?i)b+)+c",[trim]))), +?line <<"abAb">> = iolist_to_binary(join(re:split("abAb","(?>a(?i)b+)+c",[{parts, + 2}]))), +?line <<"abAb">> = iolist_to_binary(join(re:split("abAb","(?>a(?i)b+)+c",[]))), +?line <<"abbC">> = iolist_to_binary(join(re:split("abbC","(?>a(?i)b+)+c",[trim]))), +?line <<"abbC">> = iolist_to_binary(join(re:split("abbC","(?>a(?i)b+)+c",[{parts, + 2}]))), +?line <<"abbC">> = iolist_to_binary(join(re:split("abbC","(?>a(?i)b+)+c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","(?=a(?i)b)\\w\\wc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","(?=a(?i)b)\\w\\wc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","(?=a(?i)b)\\w\\wc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aBc","(?=a(?i)b)\\w\\wc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aBc","(?=a(?i)b)\\w\\wc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aBc","(?=a(?i)b)\\w\\wc",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?=a(?i)b)\\w\\wc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?=a(?i)b)\\w\\wc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?=a(?i)b)\\w\\wc",[]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?=a(?i)b)\\w\\wc",[trim]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?=a(?i)b)\\w\\wc",[{parts, + 2}]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?=a(?i)b)\\w\\wc",[]))), +?line <<"abC">> = iolist_to_binary(join(re:split("abC","(?=a(?i)b)\\w\\wc",[trim]))), +?line <<"abC">> = iolist_to_binary(join(re:split("abC","(?=a(?i)b)\\w\\wc",[{parts, + 2}]))), +?line <<"abC">> = iolist_to_binary(join(re:split("abC","(?=a(?i)b)\\w\\wc",[]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","(?=a(?i)b)\\w\\wc",[trim]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","(?=a(?i)b)\\w\\wc",[{parts, + 2}]))), +?line <<"aBC">> = iolist_to_binary(join(re:split("aBC","(?=a(?i)b)\\w\\wc",[]))), +?line <<"ab:xx">> = iolist_to_binary(join(re:split("abxxc","(?<=a(?i)b)(\\w\\w)c",[trim]))), +?line <<"ab:xx:">> = iolist_to_binary(join(re:split("abxxc","(?<=a(?i)b)(\\w\\w)c",[{parts, + 2}]))), +?line <<"ab:xx:">> = iolist_to_binary(join(re:split("abxxc","(?<=a(?i)b)(\\w\\w)c",[]))), +?line <<"aB:xx">> = iolist_to_binary(join(re:split("aBxxc","(?<=a(?i)b)(\\w\\w)c",[trim]))), +?line <<"aB:xx:">> = iolist_to_binary(join(re:split("aBxxc","(?<=a(?i)b)(\\w\\w)c",[{parts, + 2}]))), +?line <<"aB:xx:">> = iolist_to_binary(join(re:split("aBxxc","(?<=a(?i)b)(\\w\\w)c",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=a(?i)b)(\\w\\w)c",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=a(?i)b)(\\w\\w)c",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=a(?i)b)(\\w\\w)c",[]))), +?line <<"Abxxc">> = iolist_to_binary(join(re:split("Abxxc","(?<=a(?i)b)(\\w\\w)c",[trim]))), +?line <<"Abxxc">> = iolist_to_binary(join(re:split("Abxxc","(?<=a(?i)b)(\\w\\w)c",[{parts, + 2}]))), +?line <<"Abxxc">> = iolist_to_binary(join(re:split("Abxxc","(?<=a(?i)b)(\\w\\w)c",[]))), +?line <<"ABxxc">> = iolist_to_binary(join(re:split("ABxxc","(?<=a(?i)b)(\\w\\w)c",[trim]))), +?line <<"ABxxc">> = iolist_to_binary(join(re:split("ABxxc","(?<=a(?i)b)(\\w\\w)c",[{parts, + 2}]))), +?line <<"ABxxc">> = iolist_to_binary(join(re:split("ABxxc","(?<=a(?i)b)(\\w\\w)c",[]))), +?line <<"abxxC">> = iolist_to_binary(join(re:split("abxxC","(?<=a(?i)b)(\\w\\w)c",[trim]))), +?line <<"abxxC">> = iolist_to_binary(join(re:split("abxxC","(?<=a(?i)b)(\\w\\w)c",[{parts, + 2}]))), +?line <<"abxxC">> = iolist_to_binary(join(re:split("abxxC","(?<=a(?i)b)(\\w\\w)c",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aA","(?:(a)|b)(?(1)A|B)",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aA","(?:(a)|b)(?(1)A|B)",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aA","(?:(a)|b)(?(1)A|B)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("bB","(?:(a)|b)(?(1)A|B)",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("bB","(?:(a)|b)(?(1)A|B)",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("bB","(?:(a)|b)(?(1)A|B)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(a)|b)(?(1)A|B)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(a)|b)(?(1)A|B)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(a)|b)(?(1)A|B)",[]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?:(a)|b)(?(1)A|B)",[trim]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?:(a)|b)(?(1)A|B)",[{parts, + 2}]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?:(a)|b)(?(1)A|B)",[]))), +?line <<"bA">> = iolist_to_binary(join(re:split("bA","(?:(a)|b)(?(1)A|B)",[trim]))), +?line <<"bA">> = iolist_to_binary(join(re:split("bA","(?:(a)|b)(?(1)A|B)",[{parts, + 2}]))), +?line <<"bA">> = iolist_to_binary(join(re:split("bA","(?:(a)|b)(?(1)A|B)",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aa","^(a)?(?(1)a|b)+$",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aa","^(a)?(?(1)a|b)+$",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aa","^(a)?(?(1)a|b)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","^(a)?(?(1)a|b)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a)?(?(1)a|b)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","^(a)?(?(1)a|b)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("bb","^(a)?(?(1)a|b)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("bb","^(a)?(?(1)a|b)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("bb","^(a)?(?(1)a|b)+$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a)?(?(1)a|b)+$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a)?(?(1)a|b)+$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a)?(?(1)a|b)+$",[]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a)?(?(1)a|b)+$",[trim]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a)?(?(1)a|b)+$",[{parts, + 2}]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","^(a)?(?(1)a|b)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc:","^(?(?=abc)\\w{3}:|\\d\\d)$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc:","^(?(?=abc)\\w{3}:|\\d\\d)$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc:","^(?(?=abc)\\w{3}:|\\d\\d)$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("12","^(?(?=abc)\\w{3}:|\\d\\d)$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12","^(?(?=abc)\\w{3}:|\\d\\d)$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12","^(?(?=abc)\\w{3}:|\\d\\d)$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?(?=abc)\\w{3}:|\\d\\d)$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?(?=abc)\\w{3}:|\\d\\d)$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?(?=abc)\\w{3}:|\\d\\d)$",[]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^(?(?=abc)\\w{3}:|\\d\\d)$",[trim]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^(?(?=abc)\\w{3}:|\\d\\d)$",[{parts, + 2}]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^(?(?=abc)\\w{3}:|\\d\\d)$",[]))), +?line <<"xyz">> = iolist_to_binary(join(re:split("xyz","^(?(?=abc)\\w{3}:|\\d\\d)$",[trim]))), +?line <<"xyz">> = iolist_to_binary(join(re:split("xyz","^(?(?=abc)\\w{3}:|\\d\\d)$",[{parts, + 2}]))), +?line <<"xyz">> = iolist_to_binary(join(re:split("xyz","^(?(?=abc)\\w{3}:|\\d\\d)$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc:","^(?(?!abc)\\d\\d|\\w{3}:)$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc:","^(?(?!abc)\\d\\d|\\w{3}:)$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc:","^(?(?!abc)\\d\\d|\\w{3}:)$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("12","^(?(?!abc)\\d\\d|\\w{3}:)$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12","^(?(?!abc)\\d\\d|\\w{3}:)$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12","^(?(?!abc)\\d\\d|\\w{3}:)$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?(?!abc)\\d\\d|\\w{3}:)$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?(?!abc)\\d\\d|\\w{3}:)$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?(?!abc)\\d\\d|\\w{3}:)$",[]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^(?(?!abc)\\d\\d|\\w{3}:)$",[trim]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^(?(?!abc)\\d\\d|\\w{3}:)$",[{parts, + 2}]))), +?line <<"123">> = iolist_to_binary(join(re:split("123","^(?(?!abc)\\d\\d|\\w{3}:)$",[]))), +?line <<"xyz">> = iolist_to_binary(join(re:split("xyz","^(?(?!abc)\\d\\d|\\w{3}:)$",[trim]))), +?line <<"xyz">> = iolist_to_binary(join(re:split("xyz","^(?(?!abc)\\d\\d|\\w{3}:)$",[{parts, + 2}]))), +?line <<"xyz">> = iolist_to_binary(join(re:split("xyz","^(?(?!abc)\\d\\d|\\w{3}:)$",[]))), +?line <<"foo">> = iolist_to_binary(join(re:split("foobar","(?(?<=foo)bar|cat)",[trim]))), +?line <<"foo:">> = iolist_to_binary(join(re:split("foobar","(?(?<=foo)bar|cat)",[{parts, + 2}]))), +?line <<"foo:">> = iolist_to_binary(join(re:split("foobar","(?(?<=foo)bar|cat)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("cat","(?(?<=foo)bar|cat)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("cat","(?(?<=foo)bar|cat)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("cat","(?(?<=foo)bar|cat)",[]))), +?line <<"f">> = iolist_to_binary(join(re:split("fcat","(?(?<=foo)bar|cat)",[trim]))), +?line <<"f:">> = iolist_to_binary(join(re:split("fcat","(?(?<=foo)bar|cat)",[{parts, + 2}]))), +?line <<"f:">> = iolist_to_binary(join(re:split("fcat","(?(?<=foo)bar|cat)",[]))), +?line <<"fo">> = iolist_to_binary(join(re:split("focat","(?(?<=foo)bar|cat)",[trim]))), +?line <<"fo:">> = iolist_to_binary(join(re:split("focat","(?(?<=foo)bar|cat)",[{parts, + 2}]))), +?line <<"fo:">> = iolist_to_binary(join(re:split("focat","(?(?<=foo)bar|cat)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?(?<=foo)bar|cat)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?(?<=foo)bar|cat)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?(?<=foo)bar|cat)",[]))), +?line <<"foocat">> = iolist_to_binary(join(re:split("foocat","(?(?<=foo)bar|cat)",[trim]))), +?line <<"foocat">> = iolist_to_binary(join(re:split("foocat","(?(?<=foo)bar|cat)",[{parts, + 2}]))), +?line <<"foocat">> = iolist_to_binary(join(re:split("foocat","(?(?<=foo)bar|cat)",[]))), +?line <<"foo">> = iolist_to_binary(join(re:split("foobar","(?(?> = iolist_to_binary(join(re:split("foobar","(?(?> = iolist_to_binary(join(re:split("foobar","(?(?> = iolist_to_binary(join(re:split("cat","(?(?> = iolist_to_binary(join(re:split("cat","(?(?> = iolist_to_binary(join(re:split("cat","(?(?> = iolist_to_binary(join(re:split("fcat","(?(?> = iolist_to_binary(join(re:split("fcat","(?(?> = iolist_to_binary(join(re:split("fcat","(?(?> = iolist_to_binary(join(re:split("focat","(?(?> = iolist_to_binary(join(re:split("focat","(?(?> = iolist_to_binary(join(re:split("focat","(?(?> = iolist_to_binary(join(re:split("*** Failers","(?(?> = iolist_to_binary(join(re:split("*** Failers","(?(?> = iolist_to_binary(join(re:split("*** Failers","(?(?> = iolist_to_binary(join(re:split("foocat","(?(?> = iolist_to_binary(join(re:split("foocat","(?(?> = iolist_to_binary(join(re:split("foocat","(?(?> = iolist_to_binary(join(re:split("abcd","( \\( )? [^()]+ (?(1) \\) |) ",[extended, + trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("abcd","( \\( )? [^()]+ (?(1) \\) |) ",[extended, + {parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("abcd","( \\( )? [^()]+ (?(1) \\) |) ",[extended]))), +?line <<":(">> = iolist_to_binary(join(re:split("(abcd)","( \\( )? [^()]+ (?(1) \\) |) ",[extended, + trim]))), +?line <<":(:">> = iolist_to_binary(join(re:split("(abcd)","( \\( )? [^()]+ (?(1) \\) |) ",[extended, + {parts, + 2}]))), +?line <<":(:">> = iolist_to_binary(join(re:split("(abcd)","( \\( )? [^()]+ (?(1) \\) |) ",[extended]))), +?line <<":::(">> = iolist_to_binary(join(re:split("the quick (abcd) fox","( \\( )? [^()]+ (?(1) \\) |) ",[extended, + trim]))), +?line <<"::(abcd) fox">> = iolist_to_binary(join(re:split("the quick (abcd) fox","( \\( )? [^()]+ (?(1) \\) |) ",[extended, + {parts, + 2}]))), +?line <<":::(:::">> = iolist_to_binary(join(re:split("the quick (abcd) fox","( \\( )? [^()]+ (?(1) \\) |) ",[extended]))), +?line <<"(">> = iolist_to_binary(join(re:split("(abcd","( \\( )? [^()]+ (?(1) \\) |) ",[extended, + trim]))), +?line <<"(::">> = iolist_to_binary(join(re:split("(abcd","( \\( )? [^()]+ (?(1) \\) |) ",[extended, + {parts, + 2}]))), +?line <<"(::">> = iolist_to_binary(join(re:split("(abcd","( \\( )? [^()]+ (?(1) \\) |) ",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("abcd","( \\( )? [^()]+ (?(1) \\) ) ",[extended, + trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("abcd","( \\( )? [^()]+ (?(1) \\) ) ",[extended, + {parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("abcd","( \\( )? [^()]+ (?(1) \\) ) ",[extended]))), +?line <<":(">> = iolist_to_binary(join(re:split("(abcd)","( \\( )? [^()]+ (?(1) \\) ) ",[extended, + trim]))), +?line <<":(:">> = iolist_to_binary(join(re:split("(abcd)","( \\( )? [^()]+ (?(1) \\) ) ",[extended, + {parts, + 2}]))), +?line <<":(:">> = iolist_to_binary(join(re:split("(abcd)","( \\( )? [^()]+ (?(1) \\) ) ",[extended]))), +?line <<":::(">> = iolist_to_binary(join(re:split("the quick (abcd) fox","( \\( )? [^()]+ (?(1) \\) ) ",[extended, + trim]))), +?line <<"::(abcd) fox">> = iolist_to_binary(join(re:split("the quick (abcd) fox","( \\( )? [^()]+ (?(1) \\) ) ",[extended, + {parts, + 2}]))), +?line <<":::(:::">> = iolist_to_binary(join(re:split("the quick (abcd) fox","( \\( )? [^()]+ (?(1) \\) ) ",[extended]))), +?line <<"(">> = iolist_to_binary(join(re:split("(abcd","( \\( )? [^()]+ (?(1) \\) ) ",[extended, + trim]))), +?line <<"(::">> = iolist_to_binary(join(re:split("(abcd","( \\( )? [^()]+ (?(1) \\) ) ",[extended, + {parts, + 2}]))), +?line <<"(::">> = iolist_to_binary(join(re:split("(abcd","( \\( )? [^()]+ (?(1) \\) ) ",[extended]))), +?line <<":1:2">> = iolist_to_binary(join(re:split("12","^(?(2)a|(1)(2))+$",[trim]))), +?line <<":1:2:">> = iolist_to_binary(join(re:split("12","^(?(2)a|(1)(2))+$",[{parts, + 2}]))), +?line <<":1:2:">> = iolist_to_binary(join(re:split("12","^(?(2)a|(1)(2))+$",[]))), +?line <<":1:2">> = iolist_to_binary(join(re:split("12a","^(?(2)a|(1)(2))+$",[trim]))), +?line <<":1:2:">> = iolist_to_binary(join(re:split("12a","^(?(2)a|(1)(2))+$",[{parts, + 2}]))), +?line <<":1:2:">> = iolist_to_binary(join(re:split("12a","^(?(2)a|(1)(2))+$",[]))), +?line <<":1:2">> = iolist_to_binary(join(re:split("12aa","^(?(2)a|(1)(2))+$",[trim]))), +?line <<":1:2:">> = iolist_to_binary(join(re:split("12aa","^(?(2)a|(1)(2))+$",[{parts, + 2}]))), +?line <<":1:2:">> = iolist_to_binary(join(re:split("12aa","^(?(2)a|(1)(2))+$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?(2)a|(1)(2))+$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?(2)a|(1)(2))+$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?(2)a|(1)(2))+$",[]))), +?line <<"1234">> = iolist_to_binary(join(re:split("1234","^(?(2)a|(1)(2))+$",[trim]))), +?line <<"1234">> = iolist_to_binary(join(re:split("1234","^(?(2)a|(1)(2))+$",[{parts, + 2}]))), +?line <<"1234">> = iolist_to_binary(join(re:split("1234","^(?(2)a|(1)(2))+$",[]))), +?line <<":blah">> = iolist_to_binary(join(re:split("blah blah","((?i)blah)\\s+\\1",[trim]))), +?line <<":blah:">> = iolist_to_binary(join(re:split("blah blah","((?i)blah)\\s+\\1",[{parts, + 2}]))), +?line <<":blah:">> = iolist_to_binary(join(re:split("blah blah","((?i)blah)\\s+\\1",[]))), +?line <<":BLAH">> = iolist_to_binary(join(re:split("BLAH BLAH","((?i)blah)\\s+\\1",[trim]))), +?line <<":BLAH:">> = iolist_to_binary(join(re:split("BLAH BLAH","((?i)blah)\\s+\\1",[{parts, + 2}]))), +?line <<":BLAH:">> = iolist_to_binary(join(re:split("BLAH BLAH","((?i)blah)\\s+\\1",[]))), +?line <<":Blah">> = iolist_to_binary(join(re:split("Blah Blah","((?i)blah)\\s+\\1",[trim]))), +?line <<":Blah:">> = iolist_to_binary(join(re:split("Blah Blah","((?i)blah)\\s+\\1",[{parts, + 2}]))), +?line <<":Blah:">> = iolist_to_binary(join(re:split("Blah Blah","((?i)blah)\\s+\\1",[]))), +?line <<":blaH">> = iolist_to_binary(join(re:split("blaH blaH","((?i)blah)\\s+\\1",[trim]))), +?line <<":blaH:">> = iolist_to_binary(join(re:split("blaH blaH","((?i)blah)\\s+\\1",[{parts, + 2}]))), +?line <<":blaH:">> = iolist_to_binary(join(re:split("blaH blaH","((?i)blah)\\s+\\1",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?i)blah)\\s+\\1",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?i)blah)\\s+\\1",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?i)blah)\\s+\\1",[]))), +?line <<"blah BLAH">> = iolist_to_binary(join(re:split("blah BLAH","((?i)blah)\\s+\\1",[trim]))), +?line <<"blah BLAH">> = iolist_to_binary(join(re:split("blah BLAH","((?i)blah)\\s+\\1",[{parts, + 2}]))), +?line <<"blah BLAH">> = iolist_to_binary(join(re:split("blah BLAH","((?i)blah)\\s+\\1",[]))), +?line <<"Blah blah">> = iolist_to_binary(join(re:split("Blah blah","((?i)blah)\\s+\\1",[trim]))), +?line <<"Blah blah">> = iolist_to_binary(join(re:split("Blah blah","((?i)blah)\\s+\\1",[{parts, + 2}]))), +?line <<"Blah blah">> = iolist_to_binary(join(re:split("Blah blah","((?i)blah)\\s+\\1",[]))), +?line <<"blaH blah">> = iolist_to_binary(join(re:split("blaH blah","((?i)blah)\\s+\\1",[trim]))), +?line <<"blaH blah">> = iolist_to_binary(join(re:split("blaH blah","((?i)blah)\\s+\\1",[{parts, + 2}]))), +?line <<"blaH blah">> = iolist_to_binary(join(re:split("blaH blah","((?i)blah)\\s+\\1",[]))), +?line <<":blah">> = iolist_to_binary(join(re:split("blah blah","((?i)blah)\\s+(?i:\\1)",[trim]))), +?line <<":blah:">> = iolist_to_binary(join(re:split("blah blah","((?i)blah)\\s+(?i:\\1)",[{parts, + 2}]))), +?line <<":blah:">> = iolist_to_binary(join(re:split("blah blah","((?i)blah)\\s+(?i:\\1)",[]))), +?line <<":BLAH">> = iolist_to_binary(join(re:split("BLAH BLAH","((?i)blah)\\s+(?i:\\1)",[trim]))), +?line <<":BLAH:">> = iolist_to_binary(join(re:split("BLAH BLAH","((?i)blah)\\s+(?i:\\1)",[{parts, + 2}]))), +?line <<":BLAH:">> = iolist_to_binary(join(re:split("BLAH BLAH","((?i)blah)\\s+(?i:\\1)",[]))), +?line <<":Blah">> = iolist_to_binary(join(re:split("Blah Blah","((?i)blah)\\s+(?i:\\1)",[trim]))), +?line <<":Blah:">> = iolist_to_binary(join(re:split("Blah Blah","((?i)blah)\\s+(?i:\\1)",[{parts, + 2}]))), +?line <<":Blah:">> = iolist_to_binary(join(re:split("Blah Blah","((?i)blah)\\s+(?i:\\1)",[]))), +?line <<":blaH">> = iolist_to_binary(join(re:split("blaH blaH","((?i)blah)\\s+(?i:\\1)",[trim]))), +?line <<":blaH:">> = iolist_to_binary(join(re:split("blaH blaH","((?i)blah)\\s+(?i:\\1)",[{parts, + 2}]))), +?line <<":blaH:">> = iolist_to_binary(join(re:split("blaH blaH","((?i)blah)\\s+(?i:\\1)",[]))), +?line <<":blah">> = iolist_to_binary(join(re:split("blah BLAH","((?i)blah)\\s+(?i:\\1)",[trim]))), +?line <<":blah:">> = iolist_to_binary(join(re:split("blah BLAH","((?i)blah)\\s+(?i:\\1)",[{parts, + 2}]))), +?line <<":blah:">> = iolist_to_binary(join(re:split("blah BLAH","((?i)blah)\\s+(?i:\\1)",[]))), +?line <<":Blah">> = iolist_to_binary(join(re:split("Blah blah","((?i)blah)\\s+(?i:\\1)",[trim]))), +?line <<":Blah:">> = iolist_to_binary(join(re:split("Blah blah","((?i)blah)\\s+(?i:\\1)",[{parts, + 2}]))), +?line <<":Blah:">> = iolist_to_binary(join(re:split("Blah blah","((?i)blah)\\s+(?i:\\1)",[]))), +?line <<":blaH">> = iolist_to_binary(join(re:split("blaH blah","((?i)blah)\\s+(?i:\\1)",[trim]))), +?line <<":blaH:">> = iolist_to_binary(join(re:split("blaH blah","((?i)blah)\\s+(?i:\\1)",[{parts, + 2}]))), +?line <<":blaH:">> = iolist_to_binary(join(re:split("blaH blah","((?i)blah)\\s+(?i:\\1)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","(?>a*)*",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","(?>a*)*",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","(?>a*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aa","(?>a*)*",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aa","(?>a*)*",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aa","(?>a*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaa","(?>a*)*",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","(?>a*)*",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","(?>a*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","(abc|)+",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("abc","(abc|)+",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("abc","(abc|)+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcabc","(abc|)+",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("abcabc","(abc|)+",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("abcabc","(abc|)+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcabcabc","(abc|)+",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("abcabcabc","(abc|)+",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("abcabcabc","(abc|)+",[]))), +?line <<"x::y::z">> = iolist_to_binary(join(re:split("xyz","(abc|)+",[trim]))), +?line <<"x::yz">> = iolist_to_binary(join(re:split("xyz","(abc|)+",[{parts, + 2}]))), +?line <<"x::y::z::">> = iolist_to_binary(join(re:split("xyz","(abc|)+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","([a]*)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","([a]*)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","([a]*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaaa","([a]*)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("aaaaa","([a]*)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("aaaaa","([a]*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","([ab]*)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","([ab]*)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","([ab]*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","([ab]*)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","([ab]*)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","([ab]*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ababab","([ab]*)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("ababab","([ab]*)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("ababab","([ab]*)*",[]))), +?line <<"::c::d::e">> = iolist_to_binary(join(re:split("aaaabcde","([ab]*)*",[trim]))), +?line <<"::cde">> = iolist_to_binary(join(re:split("aaaabcde","([ab]*)*",[{parts, + 2}]))), +?line <<"::c::d::e::">> = iolist_to_binary(join(re:split("aaaabcde","([ab]*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("bbbb","([ab]*)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("bbbb","([ab]*)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("bbbb","([ab]*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","([^a]*)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","([^a]*)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","([^a]*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("bbbb","([^a]*)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("bbbb","([^a]*)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("bbbb","([^a]*)*",[]))), +?line <<"a::a::a">> = iolist_to_binary(join(re:split("aaa","([^a]*)*",[trim]))), +?line <<"a::aa">> = iolist_to_binary(join(re:split("aaa","([^a]*)*",[{parts, + 2}]))), +?line <<"a::a::a::">> = iolist_to_binary(join(re:split("aaa","([^a]*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("cccc","([^ab]*)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("cccc","([^ab]*)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("cccc","([^ab]*)*",[]))), +?line <<"a::b::a::b">> = iolist_to_binary(join(re:split("abab","([^ab]*)*",[trim]))), +?line <<"a::bab">> = iolist_to_binary(join(re:split("abab","([^ab]*)*",[{parts, + 2}]))), +?line <<"a::b::a::b::">> = iolist_to_binary(join(re:split("abab","([^ab]*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","([a]*?)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","([a]*?)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","([a]*?)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaa","([a]*?)*",[trim]))), +?line <<"::aaa">> = iolist_to_binary(join(re:split("aaaa","([a]*?)*",[{parts, + 2}]))), +?line <<"::::::::">> = iolist_to_binary(join(re:split("aaaa","([a]*?)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","([ab]*?)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","([ab]*?)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","([ab]*?)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","([ab]*?)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","([ab]*?)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","([ab]*?)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abab","([ab]*?)*",[trim]))), +?line <<"::bab">> = iolist_to_binary(join(re:split("abab","([ab]*?)*",[{parts, + 2}]))), +?line <<"::::::::">> = iolist_to_binary(join(re:split("abab","([ab]*?)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("baba","([ab]*?)*",[trim]))), +?line <<"::aba">> = iolist_to_binary(join(re:split("baba","([ab]*?)*",[{parts, + 2}]))), +?line <<"::::::::">> = iolist_to_binary(join(re:split("baba","([ab]*?)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","([^a]*?)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","([^a]*?)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("b","([^a]*?)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("bbbb","([^a]*?)*",[trim]))), +?line <<"::bbb">> = iolist_to_binary(join(re:split("bbbb","([^a]*?)*",[{parts, + 2}]))), +?line <<"::::::::">> = iolist_to_binary(join(re:split("bbbb","([^a]*?)*",[]))), +?line <<"a::a::a">> = iolist_to_binary(join(re:split("aaa","([^a]*?)*",[trim]))), +?line <<"a::aa">> = iolist_to_binary(join(re:split("aaa","([^a]*?)*",[{parts, + 2}]))), +?line <<"a::a::a::">> = iolist_to_binary(join(re:split("aaa","([^a]*?)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("c","([^ab]*?)*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("c","([^ab]*?)*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("c","([^ab]*?)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("cccc","([^ab]*?)*",[trim]))), +?line <<"::ccc">> = iolist_to_binary(join(re:split("cccc","([^ab]*?)*",[{parts, + 2}]))), +?line <<"::::::::">> = iolist_to_binary(join(re:split("cccc","([^ab]*?)*",[]))), +?line <<"b::a::b::a">> = iolist_to_binary(join(re:split("baba","([^ab]*?)*",[trim]))), +?line <<"b::aba">> = iolist_to_binary(join(re:split("baba","([^ab]*?)*",[{parts, + 2}]))), +?line <<"b::a::b::a::">> = iolist_to_binary(join(re:split("baba","([^ab]*?)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","(?>a*)*",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","(?>a*)*",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","(?>a*)*",[]))), +?line <<":b:c:d:e">> = iolist_to_binary(join(re:split("aaabcde","(?>a*)*",[trim]))), +?line <<":bcde">> = iolist_to_binary(join(re:split("aaabcde","(?>a*)*",[{parts, + 2}]))), +?line <<":b:c:d:e:">> = iolist_to_binary(join(re:split("aaabcde","(?>a*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaaa","((?>a*))*",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("aaaaa","((?>a*))*",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("aaaaa","((?>a*))*",[]))), +?line <<"::b::b">> = iolist_to_binary(join(re:split("aabbaa","((?>a*))*",[trim]))), +?line <<"::bbaa">> = iolist_to_binary(join(re:split("aabbaa","((?>a*))*",[{parts, + 2}]))), +?line <<"::b::b::">> = iolist_to_binary(join(re:split("aabbaa","((?>a*))*",[]))), +?line <<"a::a::a::a::a">> = iolist_to_binary(join(re:split("aaaaa","((?>a*?))*",[trim]))), +?line <<"a::aaaa">> = iolist_to_binary(join(re:split("aaaaa","((?>a*?))*",[{parts, + 2}]))), +?line <<"a::a::a::a::a::">> = iolist_to_binary(join(re:split("aaaaa","((?>a*?))*",[]))), +?line <<"a::a::b::b::a::a">> = iolist_to_binary(join(re:split("aabbaa","((?>a*?))*",[trim]))), +?line <<"a::abbaa">> = iolist_to_binary(join(re:split("aabbaa","((?>a*?))*",[{parts, + 2}]))), +?line <<"a::a::b::b::a::a::">> = iolist_to_binary(join(re:split("aabbaa","((?>a*?))*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("12-sep-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12-sep-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12-sep-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("12-09-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("12-09-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("12-09-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended]))), +?line <<"sep-12-98">> = iolist_to_binary(join(re:split("sep-12-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended, + trim]))), +?line <<"sep-12-98">> = iolist_to_binary(join(re:split("sep-12-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended, + {parts, + 2}]))), +?line <<"sep-12-98">> = iolist_to_binary(join(re:split("sep-12-98","(?(?=[^a-z]+[a-z]) \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) ",[extended]))), +?line <<"foo:foo">> = iolist_to_binary(join(re:split("foobarfoo","(?<=(foo))bar\\1",[trim]))), +?line <<"foo:foo:">> = iolist_to_binary(join(re:split("foobarfoo","(?<=(foo))bar\\1",[{parts, + 2}]))), +?line <<"foo:foo:">> = iolist_to_binary(join(re:split("foobarfoo","(?<=(foo))bar\\1",[]))), +?line <<"foo:foo:tling">> = iolist_to_binary(join(re:split("foobarfootling","(?<=(foo))bar\\1",[trim]))), +?line <<"foo:foo:tling">> = iolist_to_binary(join(re:split("foobarfootling","(?<=(foo))bar\\1",[{parts, + 2}]))), +?line <<"foo:foo:tling">> = iolist_to_binary(join(re:split("foobarfootling","(?<=(foo))bar\\1",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=(foo))bar\\1",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=(foo))bar\\1",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=(foo))bar\\1",[]))), +?line <<"foobar">> = iolist_to_binary(join(re:split("foobar","(?<=(foo))bar\\1",[trim]))), +?line <<"foobar">> = iolist_to_binary(join(re:split("foobar","(?<=(foo))bar\\1",[{parts, + 2}]))), +?line <<"foobar">> = iolist_to_binary(join(re:split("foobar","(?<=(foo))bar\\1",[]))), +?line <<"barfoo">> = iolist_to_binary(join(re:split("barfoo","(?<=(foo))bar\\1",[trim]))), +?line <<"barfoo">> = iolist_to_binary(join(re:split("barfoo","(?<=(foo))bar\\1",[{parts, + 2}]))), +?line <<"barfoo">> = iolist_to_binary(join(re:split("barfoo","(?<=(foo))bar\\1",[]))), +?line <<"">> = iolist_to_binary(join(re:split("saturday","(?i:saturday|sunday)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("saturday","(?i:saturday|sunday)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("saturday","(?i:saturday|sunday)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("sunday","(?i:saturday|sunday)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("sunday","(?i:saturday|sunday)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("sunday","(?i:saturday|sunday)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("Saturday","(?i:saturday|sunday)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("Saturday","(?i:saturday|sunday)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("Saturday","(?i:saturday|sunday)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("Sunday","(?i:saturday|sunday)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("Sunday","(?i:saturday|sunday)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("Sunday","(?i:saturday|sunday)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("SATURDAY","(?i:saturday|sunday)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("SATURDAY","(?i:saturday|sunday)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("SATURDAY","(?i:saturday|sunday)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("SUNDAY","(?i:saturday|sunday)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("SUNDAY","(?i:saturday|sunday)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("SUNDAY","(?i:saturday|sunday)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("SunDay","(?i:saturday|sunday)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("SunDay","(?i:saturday|sunday)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("SunDay","(?i:saturday|sunday)",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abcx","(a(?i)bc|BB)x",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcx","(a(?i)bc|BB)x",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcx","(a(?i)bc|BB)x",[]))), +?line <<":aBC">> = iolist_to_binary(join(re:split("aBCx","(a(?i)bc|BB)x",[trim]))), +?line <<":aBC:">> = iolist_to_binary(join(re:split("aBCx","(a(?i)bc|BB)x",[{parts, + 2}]))), +?line <<":aBC:">> = iolist_to_binary(join(re:split("aBCx","(a(?i)bc|BB)x",[]))), +?line <<":bb">> = iolist_to_binary(join(re:split("bbx","(a(?i)bc|BB)x",[trim]))), +?line <<":bb:">> = iolist_to_binary(join(re:split("bbx","(a(?i)bc|BB)x",[{parts, + 2}]))), +?line <<":bb:">> = iolist_to_binary(join(re:split("bbx","(a(?i)bc|BB)x",[]))), +?line <<":BB">> = iolist_to_binary(join(re:split("BBx","(a(?i)bc|BB)x",[trim]))), +?line <<":BB:">> = iolist_to_binary(join(re:split("BBx","(a(?i)bc|BB)x",[{parts, + 2}]))), +?line <<":BB:">> = iolist_to_binary(join(re:split("BBx","(a(?i)bc|BB)x",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a(?i)bc|BB)x",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a(?i)bc|BB)x",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(a(?i)bc|BB)x",[]))), +?line <<"abcX">> = iolist_to_binary(join(re:split("abcX","(a(?i)bc|BB)x",[trim]))), +?line <<"abcX">> = iolist_to_binary(join(re:split("abcX","(a(?i)bc|BB)x",[{parts, + 2}]))), +?line <<"abcX">> = iolist_to_binary(join(re:split("abcX","(a(?i)bc|BB)x",[]))), +?line <<"aBCX">> = iolist_to_binary(join(re:split("aBCX","(a(?i)bc|BB)x",[trim]))), +?line <<"aBCX">> = iolist_to_binary(join(re:split("aBCX","(a(?i)bc|BB)x",[{parts, + 2}]))), +?line <<"aBCX">> = iolist_to_binary(join(re:split("aBCX","(a(?i)bc|BB)x",[]))), +?line <<"bbX">> = iolist_to_binary(join(re:split("bbX","(a(?i)bc|BB)x",[trim]))), +?line <<"bbX">> = iolist_to_binary(join(re:split("bbX","(a(?i)bc|BB)x",[{parts, + 2}]))), +?line <<"bbX">> = iolist_to_binary(join(re:split("bbX","(a(?i)bc|BB)x",[]))), +?line <<"BBX">> = iolist_to_binary(join(re:split("BBX","(a(?i)bc|BB)x",[trim]))), +?line <<"BBX">> = iolist_to_binary(join(re:split("BBX","(a(?i)bc|BB)x",[{parts, + 2}]))), +?line <<"BBX">> = iolist_to_binary(join(re:split("BBX","(a(?i)bc|BB)x",[]))), +?line <<":ac">> = iolist_to_binary(join(re:split("ac","^([ab](?i)[cd]|[ef])",[trim]))), +?line <<":ac:">> = iolist_to_binary(join(re:split("ac","^([ab](?i)[cd]|[ef])",[{parts, + 2}]))), +?line <<":ac:">> = iolist_to_binary(join(re:split("ac","^([ab](?i)[cd]|[ef])",[]))), +?line <<":aC">> = iolist_to_binary(join(re:split("aC","^([ab](?i)[cd]|[ef])",[trim]))), +?line <<":aC:">> = iolist_to_binary(join(re:split("aC","^([ab](?i)[cd]|[ef])",[{parts, + 2}]))), +?line <<":aC:">> = iolist_to_binary(join(re:split("aC","^([ab](?i)[cd]|[ef])",[]))), +?line <<":bD">> = iolist_to_binary(join(re:split("bD","^([ab](?i)[cd]|[ef])",[trim]))), +?line <<":bD:">> = iolist_to_binary(join(re:split("bD","^([ab](?i)[cd]|[ef])",[{parts, + 2}]))), +?line <<":bD:">> = iolist_to_binary(join(re:split("bD","^([ab](?i)[cd]|[ef])",[]))), +?line <<":e:lephant">> = iolist_to_binary(join(re:split("elephant","^([ab](?i)[cd]|[ef])",[trim]))), +?line <<":e:lephant">> = iolist_to_binary(join(re:split("elephant","^([ab](?i)[cd]|[ef])",[{parts, + 2}]))), +?line <<":e:lephant">> = iolist_to_binary(join(re:split("elephant","^([ab](?i)[cd]|[ef])",[]))), +?line <<":E:urope">> = iolist_to_binary(join(re:split("Europe","^([ab](?i)[cd]|[ef])",[trim]))), +?line <<":E:urope">> = iolist_to_binary(join(re:split("Europe","^([ab](?i)[cd]|[ef])",[{parts, + 2}]))), +?line <<":E:urope">> = iolist_to_binary(join(re:split("Europe","^([ab](?i)[cd]|[ef])",[]))), +?line <<":f:rog">> = iolist_to_binary(join(re:split("frog","^([ab](?i)[cd]|[ef])",[trim]))), +?line <<":f:rog">> = iolist_to_binary(join(re:split("frog","^([ab](?i)[cd]|[ef])",[{parts, + 2}]))), +?line <<":f:rog">> = iolist_to_binary(join(re:split("frog","^([ab](?i)[cd]|[ef])",[]))), +?line <<":F:rance">> = iolist_to_binary(join(re:split("France","^([ab](?i)[cd]|[ef])",[trim]))), +?line <<":F:rance">> = iolist_to_binary(join(re:split("France","^([ab](?i)[cd]|[ef])",[{parts, + 2}]))), +?line <<":F:rance">> = iolist_to_binary(join(re:split("France","^([ab](?i)[cd]|[ef])",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^([ab](?i)[cd]|[ef])",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^([ab](?i)[cd]|[ef])",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^([ab](?i)[cd]|[ef])",[]))), +?line <<"Africa">> = iolist_to_binary(join(re:split("Africa","^([ab](?i)[cd]|[ef])",[trim]))), +?line <<"Africa">> = iolist_to_binary(join(re:split("Africa","^([ab](?i)[cd]|[ef])",[{parts, + 2}]))), +?line <<"Africa">> = iolist_to_binary(join(re:split("Africa","^([ab](?i)[cd]|[ef])",[]))), +?line <<":ab">> = iolist_to_binary(join(re:split("ab","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[trim]))), +?line <<":ab:">> = iolist_to_binary(join(re:split("ab","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[{parts, + 2}]))), +?line <<":ab:">> = iolist_to_binary(join(re:split("ab","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[]))), +?line <<":aBd">> = iolist_to_binary(join(re:split("aBd","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[trim]))), +?line <<":aBd:">> = iolist_to_binary(join(re:split("aBd","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[{parts, + 2}]))), +?line <<":aBd:">> = iolist_to_binary(join(re:split("aBd","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[]))), +?line <<":xy">> = iolist_to_binary(join(re:split("xy","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[trim]))), +?line <<":xy:">> = iolist_to_binary(join(re:split("xy","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[{parts, + 2}]))), +?line <<":xy:">> = iolist_to_binary(join(re:split("xy","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[]))), +?line <<":xY">> = iolist_to_binary(join(re:split("xY","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[trim]))), +?line <<":xY:">> = iolist_to_binary(join(re:split("xY","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[{parts, + 2}]))), +?line <<":xY:">> = iolist_to_binary(join(re:split("xY","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[]))), +?line <<":z:ebra">> = iolist_to_binary(join(re:split("zebra","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[trim]))), +?line <<":z:ebra">> = iolist_to_binary(join(re:split("zebra","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[{parts, + 2}]))), +?line <<":z:ebra">> = iolist_to_binary(join(re:split("zebra","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[]))), +?line <<":Z:ambesi">> = iolist_to_binary(join(re:split("Zambesi","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[trim]))), +?line <<":Z:ambesi">> = iolist_to_binary(join(re:split("Zambesi","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[{parts, + 2}]))), +?line <<":Z:ambesi">> = iolist_to_binary(join(re:split("Zambesi","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[]))), +?line <<"aCD">> = iolist_to_binary(join(re:split("aCD","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[trim]))), +?line <<"aCD">> = iolist_to_binary(join(re:split("aCD","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[{parts, + 2}]))), +?line <<"aCD">> = iolist_to_binary(join(re:split("aCD","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[]))), +?line <<"XY">> = iolist_to_binary(join(re:split("XY","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[trim]))), +?line <<"XY">> = iolist_to_binary(join(re:split("XY","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[{parts, + 2}]))), +?line <<"XY">> = iolist_to_binary(join(re:split("XY","^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)",[]))), +?line <<"foo +">> = iolist_to_binary(join(re:split("foo +bar","(?<=foo\\n)^bar",[multiline,trim]))), +?line <<"foo +:">> = iolist_to_binary(join(re:split("foo +bar","(?<=foo\\n)^bar",[multiline,{parts,2}]))), +?line <<"foo +:">> = iolist_to_binary(join(re:split("foo +bar","(?<=foo\\n)^bar",[multiline]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=foo\\n)^bar",[multiline, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=foo\\n)^bar",[multiline, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=foo\\n)^bar",[multiline]))), +?line <<"bar">> = iolist_to_binary(join(re:split("bar","(?<=foo\\n)^bar",[multiline, + trim]))), +?line <<"bar">> = iolist_to_binary(join(re:split("bar","(?<=foo\\n)^bar",[multiline, + {parts, + 2}]))), +?line <<"bar">> = iolist_to_binary(join(re:split("bar","(?<=foo\\n)^bar",[multiline]))), +?line <<"baz +bar">> = iolist_to_binary(join(re:split("baz +bar","(?<=foo\\n)^bar",[multiline,trim]))), +?line <<"baz +bar">> = iolist_to_binary(join(re:split("baz +bar","(?<=foo\\n)^bar",[multiline,{parts,2}]))), +?line <<"baz +bar">> = iolist_to_binary(join(re:split("baz +bar","(?<=foo\\n)^bar",[multiline]))), +?line <<"bar">> = iolist_to_binary(join(re:split("barbaz","(?<=(?> = iolist_to_binary(join(re:split("barbaz","(?<=(?> = iolist_to_binary(join(re:split("barbaz","(?<=(?> = iolist_to_binary(join(re:split("barbarbaz","(?<=(?> = iolist_to_binary(join(re:split("barbarbaz","(?<=(?> = iolist_to_binary(join(re:split("barbarbaz","(?<=(?> = iolist_to_binary(join(re:split("koobarbaz","(?<=(?> = iolist_to_binary(join(re:split("koobarbaz","(?<=(?> = iolist_to_binary(join(re:split("koobarbaz","(?<=(?> = iolist_to_binary(join(re:split("*** Failers","(?<=(?> = iolist_to_binary(join(re:split("*** Failers","(?<=(?> = iolist_to_binary(join(re:split("*** Failers","(?<=(?> = iolist_to_binary(join(re:split("baz","(?<=(?> = iolist_to_binary(join(re:split("baz","(?<=(?> = iolist_to_binary(join(re:split("baz","(?<=(?> = iolist_to_binary(join(re:split("foobarbaz","(?<=(?> = iolist_to_binary(join(re:split("foobarbaz","(?<=(?> = iolist_to_binary(join(re:split("foobarbaz","(?<=(?> = iolist_to_binary(join(re:split("a","^(a\\1?){4}$",[trim]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","^(a\\1?){4}$",[]))), +?line <<"aa">> = iolist_to_binary(join(re:split("aa","^(a\\1?){4}$",[trim]))), +?line <<"aa">> = iolist_to_binary(join(re:split("aa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aa">> = iolist_to_binary(join(re:split("aa","^(a\\1?){4}$",[]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","^(a\\1?){4}$",[trim]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","^(a\\1?){4}$",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaa","^(a\\1?){4}$",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaa","^(a\\1?){4}$",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaaa","^(a\\1?){4}$",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaa","^(a\\1?){4}$",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aaaaaaa","^(a\\1?){4}$",[]))), +?line <<"aaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<"aaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a\\1?){4}$",[]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<":aaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<":aaaa:">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<":aaaa:">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<"aaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<"aaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<"aaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<"aaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<"aaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<"aaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<"aaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<"aaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<"aaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<"aaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"aa">> = iolist_to_binary(join(re:split("aa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"aa">> = iolist_to_binary(join(re:split("aa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"aa">> = iolist_to_binary(join(re:split("aa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"aaa">> = iolist_to_binary(join(re:split("aaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<":a:a:a:a">> = iolist_to_binary(join(re:split("aaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<":a:a:a:a:">> = iolist_to_binary(join(re:split("aaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<":a:a:a:a:">> = iolist_to_binary(join(re:split("aaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<":a:aa:a:a">> = iolist_to_binary(join(re:split("aaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<":a:aa:a:a:">> = iolist_to_binary(join(re:split("aaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<":a:aa:a:a:">> = iolist_to_binary(join(re:split("aaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<":a:aa:a:aa">> = iolist_to_binary(join(re:split("aaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<":a:aa:a:aa:">> = iolist_to_binary(join(re:split("aaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<":a:aa:a:aa:">> = iolist_to_binary(join(re:split("aaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<":a:aa:aaa:a">> = iolist_to_binary(join(re:split("aaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<":a:aa:aaa:a:">> = iolist_to_binary(join(re:split("aaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<":a:aa:aaa:a:">> = iolist_to_binary(join(re:split("aaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"aaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"aaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"aaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<":a:aa:aaa:aaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<":a:aa:aaa:aaaa:">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<":a:aa:aaa:aaaa:">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"aaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"aaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"aaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"aaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"aaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"aaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"aaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"aaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"aaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[trim]))), +?line <<"aaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaa","^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","abc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","abc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","abc",[]))), +?line <<"x:y">> = iolist_to_binary(join(re:split("xabcy","abc",[trim]))), +?line <<"x:y">> = iolist_to_binary(join(re:split("xabcy","abc",[{parts, + 2}]))), +?line <<"x:y">> = iolist_to_binary(join(re:split("xabcy","abc",[]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ababc","abc",[trim]))), +?line <<"ab:">> = iolist_to_binary(join(re:split("ababc","abc",[{parts, + 2}]))), +?line <<"ab:">> = iolist_to_binary(join(re:split("ababc","abc",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc",[]))), +?line <<"xbc">> = iolist_to_binary(join(re:split("xbc","abc",[trim]))), +?line <<"xbc">> = iolist_to_binary(join(re:split("xbc","abc",[{parts, + 2}]))), +?line <<"xbc">> = iolist_to_binary(join(re:split("xbc","abc",[]))), +?line <<"axc">> = iolist_to_binary(join(re:split("axc","abc",[trim]))), +?line <<"axc">> = iolist_to_binary(join(re:split("axc","abc",[{parts, + 2}]))), +?line <<"axc">> = iolist_to_binary(join(re:split("axc","abc",[]))), +?line <<"abx">> = iolist_to_binary(join(re:split("abx","abc",[trim]))), +?line <<"abx">> = iolist_to_binary(join(re:split("abx","abc",[{parts, + 2}]))), +?line <<"abx">> = iolist_to_binary(join(re:split("abx","abc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","ab*c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab*c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab*c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","ab*bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab*bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab*bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbc","ab*bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbc","ab*bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbc","ab*bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbbbc","ab*bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab*bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab*bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbbbc",".{1}",[trim]))), +?line <<":bbbbc">> = iolist_to_binary(join(re:split("abbbbc",".{1}",[{parts, + 2}]))), +?line <<"::::::">> = iolist_to_binary(join(re:split("abbbbc",".{1}",[]))), +?line <<":bc">> = iolist_to_binary(join(re:split("abbbbc",".{3,4}",[trim]))), +?line <<":bc">> = iolist_to_binary(join(re:split("abbbbc",".{3,4}",[{parts, + 2}]))), +?line <<":bc">> = iolist_to_binary(join(re:split("abbbbc",".{3,4}",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbbbc","ab{0,}bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab{0,}bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab{0,}bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbc","ab+bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbc","ab+bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbc","ab+bc",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab+bc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab+bc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab+bc",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","ab+bc",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","ab+bc",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","ab+bc",[]))), +?line <<"abq">> = iolist_to_binary(join(re:split("abq","ab+bc",[trim]))), +?line <<"abq">> = iolist_to_binary(join(re:split("abq","ab+bc",[{parts, + 2}]))), +?line <<"abq">> = iolist_to_binary(join(re:split("abq","ab+bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbbbc","ab+bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab+bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab+bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbbbc","ab{1,}bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab{1,}bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab{1,}bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbbbc","ab{1,3}bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab{1,3}bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab{1,3}bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbbbc","ab{3,4}bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab{3,4}bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbbbc","ab{3,4}bc",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab{4,5}bc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab{4,5}bc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab{4,5}bc",[]))), +?line <<"abq">> = iolist_to_binary(join(re:split("abq","ab{4,5}bc",[trim]))), +?line <<"abq">> = iolist_to_binary(join(re:split("abq","ab{4,5}bc",[{parts, + 2}]))), +?line <<"abq">> = iolist_to_binary(join(re:split("abq","ab{4,5}bc",[]))), +?line <<"abbbbc">> = iolist_to_binary(join(re:split("abbbbc","ab{4,5}bc",[trim]))), +?line <<"abbbbc">> = iolist_to_binary(join(re:split("abbbbc","ab{4,5}bc",[{parts, + 2}]))), +?line <<"abbbbc">> = iolist_to_binary(join(re:split("abbbbc","ab{4,5}bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abbc","ab?bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abbc","ab?bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abbc","ab?bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","ab?bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab?bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab?bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","ab{0,1}bc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab{0,1}bc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab{0,1}bc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","ab?c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab?c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab?c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","ab{0,1}c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab{0,1}c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","ab{0,1}c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","^abc$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","^abc$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","^abc$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^abc$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^abc$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^abc$",[]))), +?line <<"abbbbc">> = iolist_to_binary(join(re:split("abbbbc","^abc$",[trim]))), +?line <<"abbbbc">> = iolist_to_binary(join(re:split("abbbbc","^abc$",[{parts, + 2}]))), +?line <<"abbbbc">> = iolist_to_binary(join(re:split("abbbbc","^abc$",[]))), +?line <<"abcc">> = iolist_to_binary(join(re:split("abcc","^abc$",[trim]))), +?line <<"abcc">> = iolist_to_binary(join(re:split("abcc","^abc$",[{parts, + 2}]))), +?line <<"abcc">> = iolist_to_binary(join(re:split("abcc","^abc$",[]))), +?line <<":c">> = iolist_to_binary(join(re:split("abcc","^abc",[trim]))), +?line <<":c">> = iolist_to_binary(join(re:split("abcc","^abc",[{parts, + 2}]))), +?line <<":c">> = iolist_to_binary(join(re:split("abcc","^abc",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("aabc","abc$",[trim]))), +?line <<"a:">> = iolist_to_binary(join(re:split("aabc","abc$",[{parts, + 2}]))), +?line <<"a:">> = iolist_to_binary(join(re:split("aabc","abc$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc$",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("aabc","abc$",[trim]))), +?line <<"a:">> = iolist_to_binary(join(re:split("aabc","abc$",[{parts, + 2}]))), +?line <<"a:">> = iolist_to_binary(join(re:split("aabc","abc$",[]))), +?line <<"aabcd">> = iolist_to_binary(join(re:split("aabcd","abc$",[trim]))), +?line <<"aabcd">> = iolist_to_binary(join(re:split("aabcd","abc$",[{parts, + 2}]))), +?line <<"aabcd">> = iolist_to_binary(join(re:split("aabcd","abc$",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","$",[trim]))), +?line <<"abc:">> = iolist_to_binary(join(re:split("abc","$",[{parts, + 2}]))), +?line <<"abc:">> = iolist_to_binary(join(re:split("abc","$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","a.c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","a.c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","a.c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("axc","a.c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("axc","a.c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("axc","a.c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("axyzc","a.*c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("axyzc","a.*c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("axyzc","a.*c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abd","a[bc]d",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abd","a[bc]d",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abd","a[bc]d",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[bc]d",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[bc]d",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[bc]d",[]))), +?line <<"axyzd">> = iolist_to_binary(join(re:split("axyzd","a[bc]d",[trim]))), +?line <<"axyzd">> = iolist_to_binary(join(re:split("axyzd","a[bc]d",[{parts, + 2}]))), +?line <<"axyzd">> = iolist_to_binary(join(re:split("axyzd","a[bc]d",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","a[bc]d",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","a[bc]d",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","a[bc]d",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ace","a[b-d]e",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ace","a[b-d]e",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ace","a[b-d]e",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("aac","a[b-d]",[trim]))), +?line <<"a:">> = iolist_to_binary(join(re:split("aac","a[b-d]",[{parts, + 2}]))), +?line <<"a:">> = iolist_to_binary(join(re:split("aac","a[b-d]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a-","a[-b]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a-","a[-b]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a-","a[-b]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a-","a[b-]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a-","a[b-]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a-","a[b-]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a]","a]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a]","a]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a]","a]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a]b","a[]]b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a]b","a[]]b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a]b","a[]]b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aed","a[^bc]d",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aed","a[^bc]d",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aed","a[^bc]d",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[^bc]d",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[^bc]d",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[^bc]d",[]))), +?line <<"abd">> = iolist_to_binary(join(re:split("abd","a[^bc]d",[trim]))), +?line <<"abd">> = iolist_to_binary(join(re:split("abd","a[^bc]d",[{parts, + 2}]))), +?line <<"abd">> = iolist_to_binary(join(re:split("abd","a[^bc]d",[]))), +?line <<"abd">> = iolist_to_binary(join(re:split("abd","a[^bc]d",[trim]))), +?line <<"abd">> = iolist_to_binary(join(re:split("abd","a[^bc]d",[{parts, + 2}]))), +?line <<"abd">> = iolist_to_binary(join(re:split("abd","a[^bc]d",[]))), +?line <<"">> = iolist_to_binary(join(re:split("adc","a[^-b]c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("adc","a[^-b]c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("adc","a[^-b]c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("adc","a[^]b]c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("adc","a[^]b]c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("adc","a[^]b]c",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[^]b]c",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[^]b]c",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[^]b]c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a-c","a[^]b]c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a-c","a[^]b]c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a-c","a[^]b]c",[]))), +?line <<"a]c">> = iolist_to_binary(join(re:split("a]c","a[^]b]c",[trim]))), +?line <<"a]c">> = iolist_to_binary(join(re:split("a]c","a[^]b]c",[{parts, + 2}]))), +?line <<"a]c">> = iolist_to_binary(join(re:split("a]c","a[^]b]c",[]))), +?line <<":-">> = iolist_to_binary(join(re:split("a-","\\ba\\b",[trim]))), +?line <<":-">> = iolist_to_binary(join(re:split("a-","\\ba\\b",[{parts, + 2}]))), +?line <<":-">> = iolist_to_binary(join(re:split("a-","\\ba\\b",[]))), +?line <<"-">> = iolist_to_binary(join(re:split("-a","\\ba\\b",[trim]))), +?line <<"-:">> = iolist_to_binary(join(re:split("-a","\\ba\\b",[{parts, + 2}]))), +?line <<"-:">> = iolist_to_binary(join(re:split("-a","\\ba\\b",[]))), +?line <<"-:-">> = iolist_to_binary(join(re:split("-a-","\\ba\\b",[trim]))), +?line <<"-:-">> = iolist_to_binary(join(re:split("-a-","\\ba\\b",[{parts, + 2}]))), +?line <<"-:-">> = iolist_to_binary(join(re:split("-a-","\\ba\\b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\by\\b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\by\\b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\by\\b",[]))), +?line <<"xy">> = iolist_to_binary(join(re:split("xy","\\by\\b",[trim]))), +?line <<"xy">> = iolist_to_binary(join(re:split("xy","\\by\\b",[{parts, + 2}]))), +?line <<"xy">> = iolist_to_binary(join(re:split("xy","\\by\\b",[]))), +?line <<"yz">> = iolist_to_binary(join(re:split("yz","\\by\\b",[trim]))), +?line <<"yz">> = iolist_to_binary(join(re:split("yz","\\by\\b",[{parts, + 2}]))), +?line <<"yz">> = iolist_to_binary(join(re:split("yz","\\by\\b",[]))), +?line <<"xyz">> = iolist_to_binary(join(re:split("xyz","\\by\\b",[trim]))), +?line <<"xyz">> = iolist_to_binary(join(re:split("xyz","\\by\\b",[{parts, + 2}]))), +?line <<"xyz">> = iolist_to_binary(join(re:split("xyz","\\by\\b",[]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","\\Ba\\B",[trim]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","\\Ba\\B",[{parts, + 2}]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","\\Ba\\B",[]))), +?line <<"a-">> = iolist_to_binary(join(re:split("a-","\\Ba\\B",[trim]))), +?line <<"a-">> = iolist_to_binary(join(re:split("a-","\\Ba\\B",[{parts, + 2}]))), +?line <<"a-">> = iolist_to_binary(join(re:split("a-","\\Ba\\B",[]))), +?line <<"-a">> = iolist_to_binary(join(re:split("-a","\\Ba\\B",[trim]))), +?line <<"-a">> = iolist_to_binary(join(re:split("-a","\\Ba\\B",[{parts, + 2}]))), +?line <<"-a">> = iolist_to_binary(join(re:split("-a","\\Ba\\B",[]))), +?line <<"-a-">> = iolist_to_binary(join(re:split("-a-","\\Ba\\B",[trim]))), +?line <<"-a-">> = iolist_to_binary(join(re:split("-a-","\\Ba\\B",[{parts, + 2}]))), +?line <<"-a-">> = iolist_to_binary(join(re:split("-a-","\\Ba\\B",[]))), +?line <<"x">> = iolist_to_binary(join(re:split("xy","\\By\\b",[trim]))), +?line <<"x:">> = iolist_to_binary(join(re:split("xy","\\By\\b",[{parts, + 2}]))), +?line <<"x:">> = iolist_to_binary(join(re:split("xy","\\By\\b",[]))), +?line <<":z">> = iolist_to_binary(join(re:split("yz","\\by\\B",[trim]))), +?line <<":z">> = iolist_to_binary(join(re:split("yz","\\by\\B",[{parts, + 2}]))), +?line <<":z">> = iolist_to_binary(join(re:split("yz","\\by\\B",[]))), +?line <<"x:z">> = iolist_to_binary(join(re:split("xyz","\\By\\B",[trim]))), +?line <<"x:z">> = iolist_to_binary(join(re:split("xyz","\\By\\B",[{parts, + 2}]))), +?line <<"x:z">> = iolist_to_binary(join(re:split("xyz","\\By\\B",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("-","\\W",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("-","\\W",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("-","\\W",[]))), +?line <<"::::Failers">> = iolist_to_binary(join(re:split("*** Failers","\\W",[trim]))), +?line <<":** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\W",[{parts, + 2}]))), +?line <<"::::Failers">> = iolist_to_binary(join(re:split("*** Failers","\\W",[]))), +?line <<"">> = iolist_to_binary(join(re:split("-","\\W",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("-","\\W",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("-","\\W",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","\\W",[trim]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","\\W",[{parts, + 2}]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","\\W",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a b","a\\sb",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a b","a\\sb",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a b","a\\sb",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a-b","a\\Sb",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a-b","a\\Sb",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a-b","a\\Sb",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a\\Sb",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a\\Sb",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a\\Sb",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a-b","a\\Sb",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a-b","a\\Sb",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a-b","a\\Sb",[]))), +?line <<"a b">> = iolist_to_binary(join(re:split("a b","a\\Sb",[trim]))), +?line <<"a b">> = iolist_to_binary(join(re:split("a b","a\\Sb",[{parts, + 2}]))), +?line <<"a b">> = iolist_to_binary(join(re:split("a b","a\\Sb",[]))), +?line <<"">> = iolist_to_binary(join(re:split("1","\\d",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("1","\\d",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("1","\\d",[]))), +?line <<"">> = iolist_to_binary(join(re:split("-","\\D",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("-","\\D",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("-","\\D",[]))), +?line <<"">> = iolist_to_binary(join(re:split("*** Failers","\\D",[trim]))), +?line <<":** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\D",[{parts, + 2}]))), +?line <<":::::::::::">> = iolist_to_binary(join(re:split("*** Failers","\\D",[]))), +?line <<"">> = iolist_to_binary(join(re:split("-","\\D",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("-","\\D",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("-","\\D",[]))), +?line <<"1">> = iolist_to_binary(join(re:split("1","\\D",[trim]))), +?line <<"1">> = iolist_to_binary(join(re:split("1","\\D",[{parts, + 2}]))), +?line <<"1">> = iolist_to_binary(join(re:split("1","\\D",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","[\\w]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","[\\w]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","[\\w]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("-","[\\W]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("-","[\\W]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("-","[\\W]",[]))), +?line <<"::::Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\W]",[trim]))), +?line <<":** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\W]",[{parts, + 2}]))), +?line <<"::::Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\W]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("-","[\\W]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("-","[\\W]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("-","[\\W]",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","[\\W]",[trim]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","[\\W]",[{parts, + 2}]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","[\\W]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a b","a[\\s]b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a b","a[\\s]b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a b","a[\\s]b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a-b","a[\\S]b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a-b","a[\\S]b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a-b","a[\\S]b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[\\S]b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[\\S]b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[\\S]b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a-b","a[\\S]b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a-b","a[\\S]b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a-b","a[\\S]b",[]))), +?line <<"a b">> = iolist_to_binary(join(re:split("a b","a[\\S]b",[trim]))), +?line <<"a b">> = iolist_to_binary(join(re:split("a b","a[\\S]b",[{parts, + 2}]))), +?line <<"a b">> = iolist_to_binary(join(re:split("a b","a[\\S]b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("1","[\\d]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("1","[\\d]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("1","[\\d]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("-","[\\D]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("-","[\\D]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("-","[\\D]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("*** Failers","[\\D]",[trim]))), +?line <<":** Failers">> = iolist_to_binary(join(re:split("*** Failers","[\\D]",[{parts, + 2}]))), +?line <<":::::::::::">> = iolist_to_binary(join(re:split("*** Failers","[\\D]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("-","[\\D]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("-","[\\D]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("-","[\\D]",[]))), +?line <<"1">> = iolist_to_binary(join(re:split("1","[\\D]",[trim]))), +?line <<"1">> = iolist_to_binary(join(re:split("1","[\\D]",[{parts, + 2}]))), +?line <<"1">> = iolist_to_binary(join(re:split("1","[\\D]",[]))), +?line <<":c">> = iolist_to_binary(join(re:split("abc","ab|cd",[trim]))), +?line <<":c">> = iolist_to_binary(join(re:split("abc","ab|cd",[{parts, + 2}]))), +?line <<":c">> = iolist_to_binary(join(re:split("abc","ab|cd",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcd","ab|cd",[trim]))), +?line <<":cd">> = iolist_to_binary(join(re:split("abcd","ab|cd",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("abcd","ab|cd",[]))), +?line <<"d">> = iolist_to_binary(join(re:split("def","()ef",[trim]))), +?line <<"d::">> = iolist_to_binary(join(re:split("def","()ef",[{parts, + 2}]))), +?line <<"d::">> = iolist_to_binary(join(re:split("def","()ef",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a(b","a\\(b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a(b","a\\(b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a(b","a\\(b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab","a\\(*b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","a\\(*b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","a\\(*b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a((b","a\\(*b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a((b","a\\(*b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a((b","a\\(*b",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","a\\\\b",[trim]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","a\\\\b",[{parts, + 2}]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","a\\\\b",[]))), +?line <<":a:a:bc">> = iolist_to_binary(join(re:split("abc","((a))",[trim]))), +?line <<":a:a:bc">> = iolist_to_binary(join(re:split("abc","((a))",[{parts, + 2}]))), +?line <<":a:a:bc">> = iolist_to_binary(join(re:split("abc","((a))",[]))), +?line <<":a:c">> = iolist_to_binary(join(re:split("abc","(a)b(c)",[trim]))), +?line <<":a:c:">> = iolist_to_binary(join(re:split("abc","(a)b(c)",[{parts, + 2}]))), +?line <<":a:c:">> = iolist_to_binary(join(re:split("abc","(a)b(c)",[]))), +?line <<"aabb">> = iolist_to_binary(join(re:split("aabbabc","a+b+c",[trim]))), +?line <<"aabb:">> = iolist_to_binary(join(re:split("aabbabc","a+b+c",[{parts, + 2}]))), +?line <<"aabb:">> = iolist_to_binary(join(re:split("aabbabc","a+b+c",[]))), +?line <<"aabb">> = iolist_to_binary(join(re:split("aabbabc","a{1,}b{1,}c",[trim]))), +?line <<"aabb:">> = iolist_to_binary(join(re:split("aabbabc","a{1,}b{1,}c",[{parts, + 2}]))), +?line <<"aabb:">> = iolist_to_binary(join(re:split("aabbabc","a{1,}b{1,}c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcabc","a.+?c",[trim]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abcabc","a.+?c",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("abcabc","a.+?c",[]))), +?line <<":b">> = iolist_to_binary(join(re:split("ab","(a+|b)*",[trim]))), +?line <<":b:">> = iolist_to_binary(join(re:split("ab","(a+|b)*",[{parts, + 2}]))), +?line <<":b:">> = iolist_to_binary(join(re:split("ab","(a+|b)*",[]))), +?line <<":b">> = iolist_to_binary(join(re:split("ab","(a+|b){0,}",[trim]))), +?line <<":b:">> = iolist_to_binary(join(re:split("ab","(a+|b){0,}",[{parts, + 2}]))), +?line <<":b:">> = iolist_to_binary(join(re:split("ab","(a+|b){0,}",[]))), +?line <<":b">> = iolist_to_binary(join(re:split("ab","(a+|b)+",[trim]))), +?line <<":b:">> = iolist_to_binary(join(re:split("ab","(a+|b)+",[{parts, + 2}]))), +?line <<":b:">> = iolist_to_binary(join(re:split("ab","(a+|b)+",[]))), +?line <<":b">> = iolist_to_binary(join(re:split("ab","(a+|b){1,}",[trim]))), +?line <<":b:">> = iolist_to_binary(join(re:split("ab","(a+|b){1,}",[{parts, + 2}]))), +?line <<":b:">> = iolist_to_binary(join(re:split("ab","(a+|b){1,}",[]))), +?line <<":a::b">> = iolist_to_binary(join(re:split("ab","(a+|b)?",[trim]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("ab","(a+|b)?",[{parts, + 2}]))), +?line <<":a::b:">> = iolist_to_binary(join(re:split("ab","(a+|b)?",[]))), +?line <<":a::b">> = iolist_to_binary(join(re:split("ab","(a+|b){0,1}",[trim]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("ab","(a+|b){0,1}",[{parts, + 2}]))), +?line <<":a::b:">> = iolist_to_binary(join(re:split("ab","(a+|b){0,1}",[]))), +?line <<"">> = iolist_to_binary(join(re:split("cde","[^ab]*",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("cde","[^ab]*",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("cde","[^ab]*",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc",[]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","abc",[trim]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","abc",[{parts, + 2}]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","abc",[]))), +?line <<":c">> = iolist_to_binary(join(re:split("abbbcd","([abc])*d",[trim]))), +?line <<":c:">> = iolist_to_binary(join(re:split("abbbcd","([abc])*d",[{parts, + 2}]))), +?line <<":c:">> = iolist_to_binary(join(re:split("abbbcd","([abc])*d",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("abcd","([abc])*bcd",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("abcd","([abc])*bcd",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("abcd","([abc])*bcd",[]))), +?line <<"">> = iolist_to_binary(join(re:split("e","a|b|c|d|e",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("e","a|b|c|d|e",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("e","a|b|c|d|e",[]))), +?line <<":e">> = iolist_to_binary(join(re:split("ef","(a|b|c|d|e)f",[trim]))), +?line <<":e:">> = iolist_to_binary(join(re:split("ef","(a|b|c|d|e)f",[{parts, + 2}]))), +?line <<":e:">> = iolist_to_binary(join(re:split("ef","(a|b|c|d|e)f",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcdefg","abcd*efg",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcdefg","abcd*efg",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcdefg","abcd*efg",[]))), +?line <<"x:y:z">> = iolist_to_binary(join(re:split("xabyabbbz","ab*",[trim]))), +?line <<"x:yabbbz">> = iolist_to_binary(join(re:split("xabyabbbz","ab*",[{parts, + 2}]))), +?line <<"x:y:z">> = iolist_to_binary(join(re:split("xabyabbbz","ab*",[]))), +?line <<"x:y:z">> = iolist_to_binary(join(re:split("xayabbbz","ab*",[trim]))), +?line <<"x:yabbbz">> = iolist_to_binary(join(re:split("xayabbbz","ab*",[{parts, + 2}]))), +?line <<"x:y:z">> = iolist_to_binary(join(re:split("xayabbbz","ab*",[]))), +?line <<"ab:cd">> = iolist_to_binary(join(re:split("abcde","(ab|cd)e",[trim]))), +?line <<"ab:cd:">> = iolist_to_binary(join(re:split("abcde","(ab|cd)e",[{parts, + 2}]))), +?line <<"ab:cd:">> = iolist_to_binary(join(re:split("abcde","(ab|cd)e",[]))), +?line <<"">> = iolist_to_binary(join(re:split("hij","[abhgefdc]ij",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("hij","[abhgefdc]ij",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("hij","[abhgefdc]ij",[]))), +?line <<"abcd">> = iolist_to_binary(join(re:split("abcdef","(abc|)ef",[trim]))), +?line <<"abcd::">> = iolist_to_binary(join(re:split("abcdef","(abc|)ef",[{parts, + 2}]))), +?line <<"abcd::">> = iolist_to_binary(join(re:split("abcdef","(abc|)ef",[]))), +?line <<"a:b">> = iolist_to_binary(join(re:split("abcd","(a|b)c*d",[trim]))), +?line <<"a:b:">> = iolist_to_binary(join(re:split("abcd","(a|b)c*d",[{parts, + 2}]))), +?line <<"a:b:">> = iolist_to_binary(join(re:split("abcd","(a|b)c*d",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("abc","(ab|ab*)bc",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("abc","(ab|ab*)bc",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("abc","(ab|ab*)bc",[]))), +?line <<":bc">> = iolist_to_binary(join(re:split("abc","a([bc]*)c*",[trim]))), +?line <<":bc:">> = iolist_to_binary(join(re:split("abc","a([bc]*)c*",[{parts, + 2}]))), +?line <<":bc:">> = iolist_to_binary(join(re:split("abc","a([bc]*)c*",[]))), +?line <<":bc:d">> = iolist_to_binary(join(re:split("abcd","a([bc]*)(c*d)",[trim]))), +?line <<":bc:d:">> = iolist_to_binary(join(re:split("abcd","a([bc]*)(c*d)",[{parts, + 2}]))), +?line <<":bc:d:">> = iolist_to_binary(join(re:split("abcd","a([bc]*)(c*d)",[]))), +?line <<":bc:d">> = iolist_to_binary(join(re:split("abcd","a([bc]+)(c*d)",[trim]))), +?line <<":bc:d:">> = iolist_to_binary(join(re:split("abcd","a([bc]+)(c*d)",[{parts, + 2}]))), +?line <<":bc:d:">> = iolist_to_binary(join(re:split("abcd","a([bc]+)(c*d)",[]))), +?line <<":b:cd">> = iolist_to_binary(join(re:split("abcd","a([bc]*)(c+d)",[trim]))), +?line <<":b:cd:">> = iolist_to_binary(join(re:split("abcd","a([bc]*)(c+d)",[{parts, + 2}]))), +?line <<":b:cd:">> = iolist_to_binary(join(re:split("abcd","a([bc]*)(c+d)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("adcdcde","a[bcd]*dcdcde",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("adcdcde","a[bcd]*dcdcde",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("adcdcde","a[bcd]*dcdcde",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[bcd]+dcdcde",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[bcd]+dcdcde",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[bcd]+dcdcde",[]))), +?line <<"abcde">> = iolist_to_binary(join(re:split("abcde","a[bcd]+dcdcde",[trim]))), +?line <<"abcde">> = iolist_to_binary(join(re:split("abcde","a[bcd]+dcdcde",[{parts, + 2}]))), +?line <<"abcde">> = iolist_to_binary(join(re:split("abcde","a[bcd]+dcdcde",[]))), +?line <<"adcdcde">> = iolist_to_binary(join(re:split("adcdcde","a[bcd]+dcdcde",[trim]))), +?line <<"adcdcde">> = iolist_to_binary(join(re:split("adcdcde","a[bcd]+dcdcde",[{parts, + 2}]))), +?line <<"adcdcde">> = iolist_to_binary(join(re:split("adcdcde","a[bcd]+dcdcde",[]))), +?line <<":ab">> = iolist_to_binary(join(re:split("abc","(ab|a)b*c",[trim]))), +?line <<":ab:">> = iolist_to_binary(join(re:split("abc","(ab|a)b*c",[{parts, + 2}]))), +?line <<":ab:">> = iolist_to_binary(join(re:split("abc","(ab|a)b*c",[]))), +?line <<":abc:a:b:d">> = iolist_to_binary(join(re:split("abcd","((a)(b)c)(d)",[trim]))), +?line <<":abc:a:b:d:">> = iolist_to_binary(join(re:split("abcd","((a)(b)c)(d)",[{parts, + 2}]))), +?line <<":abc:a:b:d:">> = iolist_to_binary(join(re:split("abcd","((a)(b)c)(d)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("alpha","[a-zA-Z_][a-zA-Z0-9_]*",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("alpha","[a-zA-Z_][a-zA-Z0-9_]*",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("alpha","[a-zA-Z_][a-zA-Z0-9_]*",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("abh","^a(bc+|b[eh])g|.h$",[trim]))), +?line <<"a::">> = iolist_to_binary(join(re:split("abh","^a(bc+|b[eh])g|.h$",[{parts, + 2}]))), +?line <<"a::">> = iolist_to_binary(join(re:split("abh","^a(bc+|b[eh])g|.h$",[]))), +?line <<":effgz">> = iolist_to_binary(join(re:split("effgz","(bc+d$|ef*g.|h?i(j|k))",[trim]))), +?line <<":effgz::">> = iolist_to_binary(join(re:split("effgz","(bc+d$|ef*g.|h?i(j|k))",[{parts, + 2}]))), +?line <<":effgz::">> = iolist_to_binary(join(re:split("effgz","(bc+d$|ef*g.|h?i(j|k))",[]))), +?line <<":ij:j">> = iolist_to_binary(join(re:split("ij","(bc+d$|ef*g.|h?i(j|k))",[trim]))), +?line <<":ij:j:">> = iolist_to_binary(join(re:split("ij","(bc+d$|ef*g.|h?i(j|k))",[{parts, + 2}]))), +?line <<":ij:j:">> = iolist_to_binary(join(re:split("ij","(bc+d$|ef*g.|h?i(j|k))",[]))), +?line <<"r:effgz">> = iolist_to_binary(join(re:split("reffgz","(bc+d$|ef*g.|h?i(j|k))",[trim]))), +?line <<"r:effgz::">> = iolist_to_binary(join(re:split("reffgz","(bc+d$|ef*g.|h?i(j|k))",[{parts, + 2}]))), +?line <<"r:effgz::">> = iolist_to_binary(join(re:split("reffgz","(bc+d$|ef*g.|h?i(j|k))",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(bc+d$|ef*g.|h?i(j|k))",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(bc+d$|ef*g.|h?i(j|k))",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(bc+d$|ef*g.|h?i(j|k))",[]))), +?line <<"effg">> = iolist_to_binary(join(re:split("effg","(bc+d$|ef*g.|h?i(j|k))",[trim]))), +?line <<"effg">> = iolist_to_binary(join(re:split("effg","(bc+d$|ef*g.|h?i(j|k))",[{parts, + 2}]))), +?line <<"effg">> = iolist_to_binary(join(re:split("effg","(bc+d$|ef*g.|h?i(j|k))",[]))), +?line <<"bcdd">> = iolist_to_binary(join(re:split("bcdd","(bc+d$|ef*g.|h?i(j|k))",[trim]))), +?line <<"bcdd">> = iolist_to_binary(join(re:split("bcdd","(bc+d$|ef*g.|h?i(j|k))",[{parts, + 2}]))), +?line <<"bcdd">> = iolist_to_binary(join(re:split("bcdd","(bc+d$|ef*g.|h?i(j|k))",[]))), +?line <<":a:a:a:a:a:a:a:a:a:a">> = iolist_to_binary(join(re:split("a","((((((((((a))))))))))",[trim]))), +?line <<":a:a:a:a:a:a:a:a:a:a:">> = iolist_to_binary(join(re:split("a","((((((((((a))))))))))",[{parts, + 2}]))), +?line <<":a:a:a:a:a:a:a:a:a:a:">> = iolist_to_binary(join(re:split("a","((((((((((a))))))))))",[]))), +?line <<":a:a:a:a:a:a:a:a:a:a">> = iolist_to_binary(join(re:split("aa","((((((((((a))))))))))\\10",[trim]))), +?line <<":a:a:a:a:a:a:a:a:a:a:">> = iolist_to_binary(join(re:split("aa","((((((((((a))))))))))\\10",[{parts, + 2}]))), +?line <<":a:a:a:a:a:a:a:a:a:a:">> = iolist_to_binary(join(re:split("aa","((((((((((a))))))))))\\10",[]))), +?line <<":a:a:a:a:a:a:a:a:a">> = iolist_to_binary(join(re:split("a","(((((((((a)))))))))",[trim]))), +?line <<":a:a:a:a:a:a:a:a:a:">> = iolist_to_binary(join(re:split("a","(((((((((a)))))))))",[{parts, + 2}]))), +?line <<":a:a:a:a:a:a:a:a:a:">> = iolist_to_binary(join(re:split("a","(((((((((a)))))))))",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","multiple words of text",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","multiple words of text",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","multiple words of text",[]))), +?line <<"aa">> = iolist_to_binary(join(re:split("aa","multiple words of text",[trim]))), +?line <<"aa">> = iolist_to_binary(join(re:split("aa","multiple words of text",[{parts, + 2}]))), +?line <<"aa">> = iolist_to_binary(join(re:split("aa","multiple words of text",[]))), +?line <<"uh-uh">> = iolist_to_binary(join(re:split("uh-uh","multiple words of text",[trim]))), +?line <<"uh-uh">> = iolist_to_binary(join(re:split("uh-uh","multiple words of text",[{parts, + 2}]))), +?line <<"uh-uh">> = iolist_to_binary(join(re:split("uh-uh","multiple words of text",[]))), +?line <<":, yeah">> = iolist_to_binary(join(re:split("multiple words, yeah","multiple words",[trim]))), +?line <<":, yeah">> = iolist_to_binary(join(re:split("multiple words, yeah","multiple words",[{parts, + 2}]))), +?line <<":, yeah">> = iolist_to_binary(join(re:split("multiple words, yeah","multiple words",[]))), +?line <<":ab:de">> = iolist_to_binary(join(re:split("abcde","(.*)c(.*)",[trim]))), +?line <<":ab:de:">> = iolist_to_binary(join(re:split("abcde","(.*)c(.*)",[{parts, + 2}]))), +?line <<":ab:de:">> = iolist_to_binary(join(re:split("abcde","(.*)c(.*)",[]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("(a, b)","\\((.*), (.*)\\)",[trim]))), +?line <<":a:b:">> = iolist_to_binary(join(re:split("(a, b)","\\((.*), (.*)\\)",[{parts, + 2}]))), +?line <<":a:b:">> = iolist_to_binary(join(re:split("(a, b)","\\((.*), (.*)\\)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abcd","abcd",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd","abcd",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcd","abcd",[]))), +?line <<":bc">> = iolist_to_binary(join(re:split("abcd","a(bc)d",[trim]))), +?line <<":bc:">> = iolist_to_binary(join(re:split("abcd","a(bc)d",[{parts, + 2}]))), +?line <<":bc:">> = iolist_to_binary(join(re:split("abcd","a(bc)d",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ac","a[-]?c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ac","a[-]?c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ac","a[-]?c",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abcabc","(abc)\\1",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcabc","(abc)\\1",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcabc","(abc)\\1",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abcabc","([a-c]*)\\1",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcabc","([a-c]*)\\1",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abcabc","([a-c]*)\\1",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("a","(a)|\\1",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("a","(a)|\\1",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("a","(a)|\\1",[]))), +?line <<"*** F:a:ilers">> = iolist_to_binary(join(re:split("*** Failers","(a)|\\1",[trim]))), +?line <<"*** F:a:ilers">> = iolist_to_binary(join(re:split("*** Failers","(a)|\\1",[{parts, + 2}]))), +?line <<"*** F:a:ilers">> = iolist_to_binary(join(re:split("*** Failers","(a)|\\1",[]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("ab","(a)|\\1",[trim]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("ab","(a)|\\1",[{parts, + 2}]))), +?line <<":a:b">> = iolist_to_binary(join(re:split("ab","(a)|\\1",[]))), +?line <<"x">> = iolist_to_binary(join(re:split("x","(a)|\\1",[trim]))), +?line <<"x">> = iolist_to_binary(join(re:split("x","(a)|\\1",[{parts, + 2}]))), +?line <<"x">> = iolist_to_binary(join(re:split("x","(a)|\\1",[]))), +?line <<":bb:b:b:cbc:c">> = iolist_to_binary(join(re:split("ababbbcbc","(([a-c])b*?\\2)*",[trim]))), +?line <<":bb:b:bcbc">> = iolist_to_binary(join(re:split("ababbbcbc","(([a-c])b*?\\2)*",[{parts, + 2}]))), +?line <<":bb:b:b:cbc:c:">> = iolist_to_binary(join(re:split("ababbbcbc","(([a-c])b*?\\2)*",[]))), +?line <<":cbc:c">> = iolist_to_binary(join(re:split("ababbbcbc","(([a-c])b*?\\2){3}",[trim]))), +?line <<":cbc:c:">> = iolist_to_binary(join(re:split("ababbbcbc","(([a-c])b*?\\2){3}",[{parts, + 2}]))), +?line <<":cbc:c:">> = iolist_to_binary(join(re:split("ababbbcbc","(([a-c])b*?\\2){3}",[]))), +?line <<"aaaxabaxbaax:bbax:b:a">> = iolist_to_binary(join(re:split("aaaxabaxbaaxbbax","((\\3|b)\\2(a)x)+",[trim]))), +?line <<"aaaxabaxbaax:bbax:b:a:">> = iolist_to_binary(join(re:split("aaaxabaxbaaxbbax","((\\3|b)\\2(a)x)+",[{parts, + 2}]))), +?line <<"aaaxabaxbaax:bbax:b:a:">> = iolist_to_binary(join(re:split("aaaxabaxbaaxbbax","((\\3|b)\\2(a)x)+",[]))), +?line <<"bbaababbabaaaaa:bba:b:a">> = iolist_to_binary(join(re:split("bbaababbabaaaaabbaaaabba","((\\3|b)\\2(a)){2,}",[trim]))), +?line <<"bbaababbabaaaaa:bba:b:a:">> = iolist_to_binary(join(re:split("bbaababbabaaaaabbaaaabba","((\\3|b)\\2(a)){2,}",[{parts, + 2}]))), +?line <<"bbaababbabaaaaa:bba:b:a:">> = iolist_to_binary(join(re:split("bbaababbabaaaaabbaaaabba","((\\3|b)\\2(a)){2,}",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ABC","abc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","abc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","abc",[caseless]))), +?line <<"X:Y">> = iolist_to_binary(join(re:split("XABCY","abc",[caseless, + trim]))), +?line <<"X:Y">> = iolist_to_binary(join(re:split("XABCY","abc",[caseless, + {parts, + 2}]))), +?line <<"X:Y">> = iolist_to_binary(join(re:split("XABCY","abc",[caseless]))), +?line <<"AB">> = iolist_to_binary(join(re:split("ABABC","abc",[caseless, + trim]))), +?line <<"AB:">> = iolist_to_binary(join(re:split("ABABC","abc",[caseless, + {parts, + 2}]))), +?line <<"AB:">> = iolist_to_binary(join(re:split("ABABC","abc",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","abc",[caseless]))), +?line <<"aaxabxbaxbbx">> = iolist_to_binary(join(re:split("aaxabxbaxbbx","abc",[caseless, + trim]))), +?line <<"aaxabxbaxbbx">> = iolist_to_binary(join(re:split("aaxabxbaxbbx","abc",[caseless, + {parts, + 2}]))), +?line <<"aaxabxbaxbbx">> = iolist_to_binary(join(re:split("aaxabxbaxbbx","abc",[caseless]))), +?line <<"XBC">> = iolist_to_binary(join(re:split("XBC","abc",[caseless, + trim]))), +?line <<"XBC">> = iolist_to_binary(join(re:split("XBC","abc",[caseless, + {parts, + 2}]))), +?line <<"XBC">> = iolist_to_binary(join(re:split("XBC","abc",[caseless]))), +?line <<"AXC">> = iolist_to_binary(join(re:split("AXC","abc",[caseless, + trim]))), +?line <<"AXC">> = iolist_to_binary(join(re:split("AXC","abc",[caseless, + {parts, + 2}]))), +?line <<"AXC">> = iolist_to_binary(join(re:split("AXC","abc",[caseless]))), +?line <<"ABX">> = iolist_to_binary(join(re:split("ABX","abc",[caseless, + trim]))), +?line <<"ABX">> = iolist_to_binary(join(re:split("ABX","abc",[caseless, + {parts, + 2}]))), +?line <<"ABX">> = iolist_to_binary(join(re:split("ABX","abc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABC","ab*c",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab*c",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab*c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABC","ab*bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab*bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab*bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABBC","ab*bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBC","ab*bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBC","ab*bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABBBBC","ab*?bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab*?bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab*?bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABBBBC","ab{0,}?bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab{0,}?bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab{0,}?bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABBC","ab+?bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBC","ab+?bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBC","ab+?bc",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab+bc",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab+bc",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab+bc",[caseless]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","ab+bc",[caseless, + trim]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","ab+bc",[caseless, + {parts, + 2}]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","ab+bc",[caseless]))), +?line <<"ABQ">> = iolist_to_binary(join(re:split("ABQ","ab+bc",[caseless, + trim]))), +?line <<"ABQ">> = iolist_to_binary(join(re:split("ABQ","ab+bc",[caseless, + {parts, + 2}]))), +?line <<"ABQ">> = iolist_to_binary(join(re:split("ABQ","ab+bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABBBBC","ab+bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab+bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab+bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABBBBC","ab{1,}?bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab{1,}?bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab{1,}?bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABBBBC","ab{1,3}?bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab{1,3}?bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab{1,3}?bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABBBBC","ab{3,4}?bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab{3,4}?bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBBBC","ab{3,4}?bc",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab{4,5}?bc",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab{4,5}?bc",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","ab{4,5}?bc",[caseless]))), +?line <<"ABQ">> = iolist_to_binary(join(re:split("ABQ","ab{4,5}?bc",[caseless, + trim]))), +?line <<"ABQ">> = iolist_to_binary(join(re:split("ABQ","ab{4,5}?bc",[caseless, + {parts, + 2}]))), +?line <<"ABQ">> = iolist_to_binary(join(re:split("ABQ","ab{4,5}?bc",[caseless]))), +?line <<"ABBBBC">> = iolist_to_binary(join(re:split("ABBBBC","ab{4,5}?bc",[caseless, + trim]))), +?line <<"ABBBBC">> = iolist_to_binary(join(re:split("ABBBBC","ab{4,5}?bc",[caseless, + {parts, + 2}]))), +?line <<"ABBBBC">> = iolist_to_binary(join(re:split("ABBBBC","ab{4,5}?bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABBC","ab??bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBC","ab??bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABBC","ab??bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABC","ab??bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab??bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab??bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABC","ab{0,1}?bc",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab{0,1}?bc",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab{0,1}?bc",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABC","ab??c",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab??c",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab??c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABC","ab{0,1}?c",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab{0,1}?c",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","ab{0,1}?c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABC","^abc$",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","^abc$",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","^abc$",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^abc$",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^abc$",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^abc$",[caseless]))), +?line <<"ABBBBC">> = iolist_to_binary(join(re:split("ABBBBC","^abc$",[caseless, + trim]))), +?line <<"ABBBBC">> = iolist_to_binary(join(re:split("ABBBBC","^abc$",[caseless, + {parts, + 2}]))), +?line <<"ABBBBC">> = iolist_to_binary(join(re:split("ABBBBC","^abc$",[caseless]))), +?line <<"ABCC">> = iolist_to_binary(join(re:split("ABCC","^abc$",[caseless, + trim]))), +?line <<"ABCC">> = iolist_to_binary(join(re:split("ABCC","^abc$",[caseless, + {parts, + 2}]))), +?line <<"ABCC">> = iolist_to_binary(join(re:split("ABCC","^abc$",[caseless]))), +?line <<":C">> = iolist_to_binary(join(re:split("ABCC","^abc",[caseless, + trim]))), +?line <<":C">> = iolist_to_binary(join(re:split("ABCC","^abc",[caseless, + {parts, + 2}]))), +?line <<":C">> = iolist_to_binary(join(re:split("ABCC","^abc",[caseless]))), +?line <<"A">> = iolist_to_binary(join(re:split("AABC","abc$",[caseless, + trim]))), +?line <<"A:">> = iolist_to_binary(join(re:split("AABC","abc$",[caseless, + {parts, + 2}]))), +?line <<"A:">> = iolist_to_binary(join(re:split("AABC","abc$",[caseless]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","^",[caseless, + trim]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","^",[caseless, + {parts, + 2}]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","^",[caseless]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","$",[caseless, + trim]))), +?line <<"ABC:">> = iolist_to_binary(join(re:split("ABC","$",[caseless, + {parts, + 2}]))), +?line <<"ABC:">> = iolist_to_binary(join(re:split("ABC","$",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABC","a.c",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","a.c",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABC","a.c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("AXC","a.c",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("AXC","a.c",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("AXC","a.c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("AXYZC","a.*?c",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("AXYZC","a.*?c",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("AXYZC","a.*?c",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a.*c",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a.*c",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a.*c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("AABC","a.*c",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("AABC","a.*c",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("AABC","a.*c",[caseless]))), +?line <<"AXYZD">> = iolist_to_binary(join(re:split("AXYZD","a.*c",[caseless, + trim]))), +?line <<"AXYZD">> = iolist_to_binary(join(re:split("AXYZD","a.*c",[caseless, + {parts, + 2}]))), +?line <<"AXYZD">> = iolist_to_binary(join(re:split("AXYZD","a.*c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABD","a[bc]d",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABD","a[bc]d",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABD","a[bc]d",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ACE","a[b-d]e",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ACE","a[b-d]e",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ACE","a[b-d]e",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[b-d]e",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[b-d]e",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[b-d]e",[caseless]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","a[b-d]e",[caseless, + trim]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","a[b-d]e",[caseless, + {parts, + 2}]))), +?line <<"ABC">> = iolist_to_binary(join(re:split("ABC","a[b-d]e",[caseless]))), +?line <<"ABD">> = iolist_to_binary(join(re:split("ABD","a[b-d]e",[caseless, + trim]))), +?line <<"ABD">> = iolist_to_binary(join(re:split("ABD","a[b-d]e",[caseless, + {parts, + 2}]))), +?line <<"ABD">> = iolist_to_binary(join(re:split("ABD","a[b-d]e",[caseless]))), +?line <<"A">> = iolist_to_binary(join(re:split("AAC","a[b-d]",[caseless, + trim]))), +?line <<"A:">> = iolist_to_binary(join(re:split("AAC","a[b-d]",[caseless, + {parts, + 2}]))), +?line <<"A:">> = iolist_to_binary(join(re:split("AAC","a[b-d]",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("A-","a[-b]",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("A-","a[-b]",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("A-","a[-b]",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("A-","a[b-]",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("A-","a[b-]",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("A-","a[b-]",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("A]","a]",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("A]","a]",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("A]","a]",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("A]B","a[]]b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("A]B","a[]]b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("A]B","a[]]b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("AED","a[^bc]d",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("AED","a[^bc]d",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("AED","a[^bc]d",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ADC","a[^-b]c",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ADC","a[^-b]c",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ADC","a[^-b]c",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[^-b]c",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[^-b]c",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a[^-b]c",[caseless]))), +?line <<"ABD">> = iolist_to_binary(join(re:split("ABD","a[^-b]c",[caseless, + trim]))), +?line <<"ABD">> = iolist_to_binary(join(re:split("ABD","a[^-b]c",[caseless, + {parts, + 2}]))), +?line <<"ABD">> = iolist_to_binary(join(re:split("ABD","a[^-b]c",[caseless]))), +?line <<"A-C">> = iolist_to_binary(join(re:split("A-C","a[^-b]c",[caseless, + trim]))), +?line <<"A-C">> = iolist_to_binary(join(re:split("A-C","a[^-b]c",[caseless, + {parts, + 2}]))), +?line <<"A-C">> = iolist_to_binary(join(re:split("A-C","a[^-b]c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ADC","a[^]b]c",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ADC","a[^]b]c",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ADC","a[^]b]c",[caseless]))), +?line <<":C">> = iolist_to_binary(join(re:split("ABC","ab|cd",[caseless, + trim]))), +?line <<":C">> = iolist_to_binary(join(re:split("ABC","ab|cd",[caseless, + {parts, + 2}]))), +?line <<":C">> = iolist_to_binary(join(re:split("ABC","ab|cd",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABCD","ab|cd",[caseless, + trim]))), +?line <<":CD">> = iolist_to_binary(join(re:split("ABCD","ab|cd",[caseless, + {parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("ABCD","ab|cd",[caseless]))), +?line <<"D">> = iolist_to_binary(join(re:split("DEF","()ef",[caseless, + trim]))), +?line <<"D::">> = iolist_to_binary(join(re:split("DEF","()ef",[caseless, + {parts, + 2}]))), +?line <<"D::">> = iolist_to_binary(join(re:split("DEF","()ef",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","$b",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","$b",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","$b",[caseless]))), +?line <<"A]C">> = iolist_to_binary(join(re:split("A]C","$b",[caseless, + trim]))), +?line <<"A]C">> = iolist_to_binary(join(re:split("A]C","$b",[caseless, + {parts, + 2}]))), +?line <<"A]C">> = iolist_to_binary(join(re:split("A]C","$b",[caseless]))), +?line <<"B">> = iolist_to_binary(join(re:split("B","$b",[caseless, + trim]))), +?line <<"B">> = iolist_to_binary(join(re:split("B","$b",[caseless, + {parts, + 2}]))), +?line <<"B">> = iolist_to_binary(join(re:split("B","$b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("A(B","a\\(b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("A(B","a\\(b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("A(B","a\\(b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("AB","a\\(*b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("AB","a\\(*b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("AB","a\\(*b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("A((B","a\\(*b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("A((B","a\\(*b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("A((B","a\\(*b",[caseless]))), +?line <<"A">> = iolist_to_binary(join(re:split("A","a\\\\b",[caseless, + notbol, + trim]))), +?line <<"A">> = iolist_to_binary(join(re:split("A","a\\\\b",[caseless, + notbol, + {parts, + 2}]))), +?line <<"A">> = iolist_to_binary(join(re:split("A","a\\\\b",[caseless, + notbol]))), +?line <<":A:A:BC">> = iolist_to_binary(join(re:split("ABC","((a))",[caseless, + trim]))), +?line <<":A:A:BC">> = iolist_to_binary(join(re:split("ABC","((a))",[caseless, + {parts, + 2}]))), +?line <<":A:A:BC">> = iolist_to_binary(join(re:split("ABC","((a))",[caseless]))), +?line <<":A:C">> = iolist_to_binary(join(re:split("ABC","(a)b(c)",[caseless, + trim]))), +?line <<":A:C:">> = iolist_to_binary(join(re:split("ABC","(a)b(c)",[caseless, + {parts, + 2}]))), +?line <<":A:C:">> = iolist_to_binary(join(re:split("ABC","(a)b(c)",[caseless]))), +?line <<"AABB">> = iolist_to_binary(join(re:split("AABBABC","a+b+c",[caseless, + trim]))), +?line <<"AABB:">> = iolist_to_binary(join(re:split("AABBABC","a+b+c",[caseless, + {parts, + 2}]))), +?line <<"AABB:">> = iolist_to_binary(join(re:split("AABBABC","a+b+c",[caseless]))), +?line <<"AABB">> = iolist_to_binary(join(re:split("AABBABC","a{1,}b{1,}c",[caseless, + trim]))), +?line <<"AABB:">> = iolist_to_binary(join(re:split("AABBABC","a{1,}b{1,}c",[caseless, + {parts, + 2}]))), +?line <<"AABB:">> = iolist_to_binary(join(re:split("AABBABC","a{1,}b{1,}c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABCABC","a.+?c",[caseless, + trim]))), +?line <<":ABC">> = iolist_to_binary(join(re:split("ABCABC","a.+?c",[caseless, + {parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("ABCABC","a.+?c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABCABC","a.*?c",[caseless, + trim]))), +?line <<":ABC">> = iolist_to_binary(join(re:split("ABCABC","a.*?c",[caseless, + {parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("ABCABC","a.*?c",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABCABC","a.{0,5}?c",[caseless, + trim]))), +?line <<":ABC">> = iolist_to_binary(join(re:split("ABCABC","a.{0,5}?c",[caseless, + {parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("ABCABC","a.{0,5}?c",[caseless]))), +?line <<":B">> = iolist_to_binary(join(re:split("AB","(a+|b)*",[caseless, + trim]))), +?line <<":B:">> = iolist_to_binary(join(re:split("AB","(a+|b)*",[caseless, + {parts, + 2}]))), +?line <<":B:">> = iolist_to_binary(join(re:split("AB","(a+|b)*",[caseless]))), +?line <<":B">> = iolist_to_binary(join(re:split("AB","(a+|b){0,}",[caseless, + trim]))), +?line <<":B:">> = iolist_to_binary(join(re:split("AB","(a+|b){0,}",[caseless, + {parts, + 2}]))), +?line <<":B:">> = iolist_to_binary(join(re:split("AB","(a+|b){0,}",[caseless]))), +?line <<":B">> = iolist_to_binary(join(re:split("AB","(a+|b)+",[caseless, + trim]))), +?line <<":B:">> = iolist_to_binary(join(re:split("AB","(a+|b)+",[caseless, + {parts, + 2}]))), +?line <<":B:">> = iolist_to_binary(join(re:split("AB","(a+|b)+",[caseless]))), +?line <<":B">> = iolist_to_binary(join(re:split("AB","(a+|b){1,}",[caseless, + trim]))), +?line <<":B:">> = iolist_to_binary(join(re:split("AB","(a+|b){1,}",[caseless, + {parts, + 2}]))), +?line <<":B:">> = iolist_to_binary(join(re:split("AB","(a+|b){1,}",[caseless]))), +?line <<":A::B">> = iolist_to_binary(join(re:split("AB","(a+|b)?",[caseless, + trim]))), +?line <<":A:B">> = iolist_to_binary(join(re:split("AB","(a+|b)?",[caseless, + {parts, + 2}]))), +?line <<":A::B:">> = iolist_to_binary(join(re:split("AB","(a+|b)?",[caseless]))), +?line <<":A::B">> = iolist_to_binary(join(re:split("AB","(a+|b){0,1}",[caseless, + trim]))), +?line <<":A:B">> = iolist_to_binary(join(re:split("AB","(a+|b){0,1}",[caseless, + {parts, + 2}]))), +?line <<":A::B:">> = iolist_to_binary(join(re:split("AB","(a+|b){0,1}",[caseless]))), +?line <<":A::B">> = iolist_to_binary(join(re:split("AB","(a+|b){0,1}?",[caseless, + trim]))), +?line <<":A:B">> = iolist_to_binary(join(re:split("AB","(a+|b){0,1}?",[caseless, + {parts, + 2}]))), +?line <<":A::B:">> = iolist_to_binary(join(re:split("AB","(a+|b){0,1}?",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("CDE","[^ab]*",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("CDE","[^ab]*",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("CDE","[^ab]*",[caseless]))), +?line <<":C">> = iolist_to_binary(join(re:split("ABBBCD","([abc])*d",[caseless, + trim]))), +?line <<":C:">> = iolist_to_binary(join(re:split("ABBBCD","([abc])*d",[caseless, + {parts, + 2}]))), +?line <<":C:">> = iolist_to_binary(join(re:split("ABBBCD","([abc])*d",[caseless]))), +?line <<":A">> = iolist_to_binary(join(re:split("ABCD","([abc])*bcd",[caseless, + trim]))), +?line <<":A:">> = iolist_to_binary(join(re:split("ABCD","([abc])*bcd",[caseless, + {parts, + 2}]))), +?line <<":A:">> = iolist_to_binary(join(re:split("ABCD","([abc])*bcd",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("E","a|b|c|d|e",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("E","a|b|c|d|e",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("E","a|b|c|d|e",[caseless]))), +?line <<":E">> = iolist_to_binary(join(re:split("EF","(a|b|c|d|e)f",[caseless, + trim]))), +?line <<":E:">> = iolist_to_binary(join(re:split("EF","(a|b|c|d|e)f",[caseless, + {parts, + 2}]))), +?line <<":E:">> = iolist_to_binary(join(re:split("EF","(a|b|c|d|e)f",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABCDEFG","abcd*efg",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABCDEFG","abcd*efg",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABCDEFG","abcd*efg",[caseless]))), +?line <<"X:Y:Z">> = iolist_to_binary(join(re:split("XABYABBBZ","ab*",[caseless, + trim]))), +?line <<"X:YABBBZ">> = iolist_to_binary(join(re:split("XABYABBBZ","ab*",[caseless, + {parts, + 2}]))), +?line <<"X:Y:Z">> = iolist_to_binary(join(re:split("XABYABBBZ","ab*",[caseless]))), +?line <<"X:Y:Z">> = iolist_to_binary(join(re:split("XAYABBBZ","ab*",[caseless, + trim]))), +?line <<"X:YABBBZ">> = iolist_to_binary(join(re:split("XAYABBBZ","ab*",[caseless, + {parts, + 2}]))), +?line <<"X:Y:Z">> = iolist_to_binary(join(re:split("XAYABBBZ","ab*",[caseless]))), +?line <<"AB:CD">> = iolist_to_binary(join(re:split("ABCDE","(ab|cd)e",[caseless, + trim]))), +?line <<"AB:CD:">> = iolist_to_binary(join(re:split("ABCDE","(ab|cd)e",[caseless, + {parts, + 2}]))), +?line <<"AB:CD:">> = iolist_to_binary(join(re:split("ABCDE","(ab|cd)e",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("HIJ","[abhgefdc]ij",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("HIJ","[abhgefdc]ij",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("HIJ","[abhgefdc]ij",[caseless]))), +?line <<"ABCDE">> = iolist_to_binary(join(re:split("ABCDE","^(ab|cd)e",[caseless, + trim]))), +?line <<"ABCDE">> = iolist_to_binary(join(re:split("ABCDE","^(ab|cd)e",[caseless, + {parts, + 2}]))), +?line <<"ABCDE">> = iolist_to_binary(join(re:split("ABCDE","^(ab|cd)e",[caseless]))), +?line <<"ABCD">> = iolist_to_binary(join(re:split("ABCDEF","(abc|)ef",[caseless, + trim]))), +?line <<"ABCD::">> = iolist_to_binary(join(re:split("ABCDEF","(abc|)ef",[caseless, + {parts, + 2}]))), +?line <<"ABCD::">> = iolist_to_binary(join(re:split("ABCDEF","(abc|)ef",[caseless]))), +?line <<"A:B">> = iolist_to_binary(join(re:split("ABCD","(a|b)c*d",[caseless, + trim]))), +?line <<"A:B:">> = iolist_to_binary(join(re:split("ABCD","(a|b)c*d",[caseless, + {parts, + 2}]))), +?line <<"A:B:">> = iolist_to_binary(join(re:split("ABCD","(a|b)c*d",[caseless]))), +?line <<":A">> = iolist_to_binary(join(re:split("ABC","(ab|ab*)bc",[caseless, + trim]))), +?line <<":A:">> = iolist_to_binary(join(re:split("ABC","(ab|ab*)bc",[caseless, + {parts, + 2}]))), +?line <<":A:">> = iolist_to_binary(join(re:split("ABC","(ab|ab*)bc",[caseless]))), +?line <<":BC">> = iolist_to_binary(join(re:split("ABC","a([bc]*)c*",[caseless, + trim]))), +?line <<":BC:">> = iolist_to_binary(join(re:split("ABC","a([bc]*)c*",[caseless, + {parts, + 2}]))), +?line <<":BC:">> = iolist_to_binary(join(re:split("ABC","a([bc]*)c*",[caseless]))), +?line <<":BC:D">> = iolist_to_binary(join(re:split("ABCD","a([bc]*)(c*d)",[caseless, + trim]))), +?line <<":BC:D:">> = iolist_to_binary(join(re:split("ABCD","a([bc]*)(c*d)",[caseless, + {parts, + 2}]))), +?line <<":BC:D:">> = iolist_to_binary(join(re:split("ABCD","a([bc]*)(c*d)",[caseless]))), +?line <<":BC:D">> = iolist_to_binary(join(re:split("ABCD","a([bc]+)(c*d)",[caseless, + trim]))), +?line <<":BC:D:">> = iolist_to_binary(join(re:split("ABCD","a([bc]+)(c*d)",[caseless, + {parts, + 2}]))), +?line <<":BC:D:">> = iolist_to_binary(join(re:split("ABCD","a([bc]+)(c*d)",[caseless]))), +?line <<":B:CD">> = iolist_to_binary(join(re:split("ABCD","a([bc]*)(c+d)",[caseless, + trim]))), +?line <<":B:CD:">> = iolist_to_binary(join(re:split("ABCD","a([bc]*)(c+d)",[caseless, + {parts, + 2}]))), +?line <<":B:CD:">> = iolist_to_binary(join(re:split("ABCD","a([bc]*)(c+d)",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ADCDCDE","a[bcd]*dcdcde",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ADCDCDE","a[bcd]*dcdcde",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ADCDCDE","a[bcd]*dcdcde",[caseless]))), +?line <<":AB">> = iolist_to_binary(join(re:split("ABC","(ab|a)b*c",[caseless, + trim]))), +?line <<":AB:">> = iolist_to_binary(join(re:split("ABC","(ab|a)b*c",[caseless, + {parts, + 2}]))), +?line <<":AB:">> = iolist_to_binary(join(re:split("ABC","(ab|a)b*c",[caseless]))), +?line <<":ABC:A:B:D">> = iolist_to_binary(join(re:split("ABCD","((a)(b)c)(d)",[caseless, + trim]))), +?line <<":ABC:A:B:D:">> = iolist_to_binary(join(re:split("ABCD","((a)(b)c)(d)",[caseless, + {parts, + 2}]))), +?line <<":ABC:A:B:D:">> = iolist_to_binary(join(re:split("ABCD","((a)(b)c)(d)",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ALPHA","[a-zA-Z_][a-zA-Z0-9_]*",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ALPHA","[a-zA-Z_][a-zA-Z0-9_]*",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ALPHA","[a-zA-Z_][a-zA-Z0-9_]*",[caseless]))), +?line <<"A">> = iolist_to_binary(join(re:split("ABH","^a(bc+|b[eh])g|.h$",[caseless, + trim]))), +?line <<"A::">> = iolist_to_binary(join(re:split("ABH","^a(bc+|b[eh])g|.h$",[caseless, + {parts, + 2}]))), +?line <<"A::">> = iolist_to_binary(join(re:split("ABH","^a(bc+|b[eh])g|.h$",[caseless]))), +?line <<":EFFGZ">> = iolist_to_binary(join(re:split("EFFGZ","(bc+d$|ef*g.|h?i(j|k))",[caseless, + trim]))), +?line <<":EFFGZ::">> = iolist_to_binary(join(re:split("EFFGZ","(bc+d$|ef*g.|h?i(j|k))",[caseless, + {parts, + 2}]))), +?line <<":EFFGZ::">> = iolist_to_binary(join(re:split("EFFGZ","(bc+d$|ef*g.|h?i(j|k))",[caseless]))), +?line <<":IJ:J">> = iolist_to_binary(join(re:split("IJ","(bc+d$|ef*g.|h?i(j|k))",[caseless, + trim]))), +?line <<":IJ:J:">> = iolist_to_binary(join(re:split("IJ","(bc+d$|ef*g.|h?i(j|k))",[caseless, + {parts, + 2}]))), +?line <<":IJ:J:">> = iolist_to_binary(join(re:split("IJ","(bc+d$|ef*g.|h?i(j|k))",[caseless]))), +?line <<"R:EFFGZ">> = iolist_to_binary(join(re:split("REFFGZ","(bc+d$|ef*g.|h?i(j|k))",[caseless, + trim]))), +?line <<"R:EFFGZ::">> = iolist_to_binary(join(re:split("REFFGZ","(bc+d$|ef*g.|h?i(j|k))",[caseless, + {parts, + 2}]))), +?line <<"R:EFFGZ::">> = iolist_to_binary(join(re:split("REFFGZ","(bc+d$|ef*g.|h?i(j|k))",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(bc+d$|ef*g.|h?i(j|k))",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(bc+d$|ef*g.|h?i(j|k))",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(bc+d$|ef*g.|h?i(j|k))",[caseless]))), +?line <<"ADCDCDE">> = iolist_to_binary(join(re:split("ADCDCDE","(bc+d$|ef*g.|h?i(j|k))",[caseless, + trim]))), +?line <<"ADCDCDE">> = iolist_to_binary(join(re:split("ADCDCDE","(bc+d$|ef*g.|h?i(j|k))",[caseless, + {parts, + 2}]))), +?line <<"ADCDCDE">> = iolist_to_binary(join(re:split("ADCDCDE","(bc+d$|ef*g.|h?i(j|k))",[caseless]))), +?line <<"EFFG">> = iolist_to_binary(join(re:split("EFFG","(bc+d$|ef*g.|h?i(j|k))",[caseless, + trim]))), +?line <<"EFFG">> = iolist_to_binary(join(re:split("EFFG","(bc+d$|ef*g.|h?i(j|k))",[caseless, + {parts, + 2}]))), +?line <<"EFFG">> = iolist_to_binary(join(re:split("EFFG","(bc+d$|ef*g.|h?i(j|k))",[caseless]))), +?line <<"BCDD">> = iolist_to_binary(join(re:split("BCDD","(bc+d$|ef*g.|h?i(j|k))",[caseless, + trim]))), +?line <<"BCDD">> = iolist_to_binary(join(re:split("BCDD","(bc+d$|ef*g.|h?i(j|k))",[caseless, + {parts, + 2}]))), +?line <<"BCDD">> = iolist_to_binary(join(re:split("BCDD","(bc+d$|ef*g.|h?i(j|k))",[caseless]))), +?line <<":A:A:A:A:A:A:A:A:A:A">> = iolist_to_binary(join(re:split("A","((((((((((a))))))))))",[caseless, + trim]))), +?line <<":A:A:A:A:A:A:A:A:A:A:">> = iolist_to_binary(join(re:split("A","((((((((((a))))))))))",[caseless, + {parts, + 2}]))), +?line <<":A:A:A:A:A:A:A:A:A:A:">> = iolist_to_binary(join(re:split("A","((((((((((a))))))))))",[caseless]))), +?line <<":A:A:A:A:A:A:A:A:A:A">> = iolist_to_binary(join(re:split("AA","((((((((((a))))))))))\\10",[caseless, + trim]))), +?line <<":A:A:A:A:A:A:A:A:A:A:">> = iolist_to_binary(join(re:split("AA","((((((((((a))))))))))\\10",[caseless, + {parts, + 2}]))), +?line <<":A:A:A:A:A:A:A:A:A:A:">> = iolist_to_binary(join(re:split("AA","((((((((((a))))))))))\\10",[caseless]))), +?line <<":A:A:A:A:A:A:A:A:A">> = iolist_to_binary(join(re:split("A","(((((((((a)))))))))",[caseless, + trim]))), +?line <<":A:A:A:A:A:A:A:A:A:">> = iolist_to_binary(join(re:split("A","(((((((((a)))))))))",[caseless, + {parts, + 2}]))), +?line <<":A:A:A:A:A:A:A:A:A:">> = iolist_to_binary(join(re:split("A","(((((((((a)))))))))",[caseless]))), +?line <<":A">> = iolist_to_binary(join(re:split("A","(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))",[caseless, + trim]))), +?line <<":A:">> = iolist_to_binary(join(re:split("A","(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))",[caseless, + {parts, + 2}]))), +?line <<":A:">> = iolist_to_binary(join(re:split("A","(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))",[caseless]))), +?line <<":C">> = iolist_to_binary(join(re:split("C","(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))",[caseless, + trim]))), +?line <<":C:">> = iolist_to_binary(join(re:split("C","(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))",[caseless, + {parts, + 2}]))), +?line <<":C:">> = iolist_to_binary(join(re:split("C","(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","multiple words of text",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","multiple words of text",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","multiple words of text",[caseless]))), +?line <<"AA">> = iolist_to_binary(join(re:split("AA","multiple words of text",[caseless, + trim]))), +?line <<"AA">> = iolist_to_binary(join(re:split("AA","multiple words of text",[caseless, + {parts, + 2}]))), +?line <<"AA">> = iolist_to_binary(join(re:split("AA","multiple words of text",[caseless]))), +?line <<"UH-UH">> = iolist_to_binary(join(re:split("UH-UH","multiple words of text",[caseless, + trim]))), +?line <<"UH-UH">> = iolist_to_binary(join(re:split("UH-UH","multiple words of text",[caseless, + {parts, + 2}]))), +?line <<"UH-UH">> = iolist_to_binary(join(re:split("UH-UH","multiple words of text",[caseless]))), +?line <<":, YEAH">> = iolist_to_binary(join(re:split("MULTIPLE WORDS, YEAH","multiple words",[caseless, + trim]))), +?line <<":, YEAH">> = iolist_to_binary(join(re:split("MULTIPLE WORDS, YEAH","multiple words",[caseless, + {parts, + 2}]))), +?line <<":, YEAH">> = iolist_to_binary(join(re:split("MULTIPLE WORDS, YEAH","multiple words",[caseless]))), +?line <<":AB:DE">> = iolist_to_binary(join(re:split("ABCDE","(.*)c(.*)",[caseless, + trim]))), +?line <<":AB:DE:">> = iolist_to_binary(join(re:split("ABCDE","(.*)c(.*)",[caseless, + {parts, + 2}]))), +?line <<":AB:DE:">> = iolist_to_binary(join(re:split("ABCDE","(.*)c(.*)",[caseless]))), +?line <<":A:B">> = iolist_to_binary(join(re:split("(A, B)","\\((.*), (.*)\\)",[caseless, + trim]))), +?line <<":A:B:">> = iolist_to_binary(join(re:split("(A, B)","\\((.*), (.*)\\)",[caseless, + {parts, + 2}]))), +?line <<":A:B:">> = iolist_to_binary(join(re:split("(A, B)","\\((.*), (.*)\\)",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ABCD","abcd",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ABCD","abcd",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ABCD","abcd",[caseless]))), +?line <<":BC">> = iolist_to_binary(join(re:split("ABCD","a(bc)d",[caseless, + trim]))), +?line <<":BC:">> = iolist_to_binary(join(re:split("ABCD","a(bc)d",[caseless, + {parts, + 2}]))), +?line <<":BC:">> = iolist_to_binary(join(re:split("ABCD","a(bc)d",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("AC","a[-]?c",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("AC","a[-]?c",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("AC","a[-]?c",[caseless]))), +?line <<":ABC">> = iolist_to_binary(join(re:split("ABCABC","(abc)\\1",[caseless, + trim]))), +?line <<":ABC:">> = iolist_to_binary(join(re:split("ABCABC","(abc)\\1",[caseless, + {parts, + 2}]))), +?line <<":ABC:">> = iolist_to_binary(join(re:split("ABCABC","(abc)\\1",[caseless]))), +?line <<":ABC">> = iolist_to_binary(join(re:split("ABCABC","([a-c]*)\\1",[caseless, + trim]))), +?line <<":ABC:">> = iolist_to_binary(join(re:split("ABCABC","([a-c]*)\\1",[caseless, + {parts, + 2}]))), +?line <<":ABC:">> = iolist_to_binary(join(re:split("ABCABC","([a-c]*)\\1",[caseless]))), +?line <<"ab">> = iolist_to_binary(join(re:split("abad","a(?!b).",[trim]))), +?line <<"ab:">> = iolist_to_binary(join(re:split("abad","a(?!b).",[{parts, + 2}]))), +?line <<"ab:">> = iolist_to_binary(join(re:split("abad","a(?!b).",[]))), +?line <<"ab">> = iolist_to_binary(join(re:split("abad","a(?=d).",[trim]))), +?line <<"ab:">> = iolist_to_binary(join(re:split("abad","a(?=d).",[{parts, + 2}]))), +?line <<"ab:">> = iolist_to_binary(join(re:split("abad","a(?=d).",[]))), +?line <<"ab">> = iolist_to_binary(join(re:split("abad","a(?=c|d).",[trim]))), +?line <<"ab:">> = iolist_to_binary(join(re:split("abad","a(?=c|d).",[{parts, + 2}]))), +?line <<"ab:">> = iolist_to_binary(join(re:split("abad","a(?=c|d).",[]))), +?line <<":e">> = iolist_to_binary(join(re:split("ace","a(?:b|c|d)(.)",[trim]))), +?line <<":e:">> = iolist_to_binary(join(re:split("ace","a(?:b|c|d)(.)",[{parts, + 2}]))), +?line <<":e:">> = iolist_to_binary(join(re:split("ace","a(?:b|c|d)(.)",[]))), +?line <<":e">> = iolist_to_binary(join(re:split("ace","a(?:b|c|d)*(.)",[trim]))), +?line <<":e:">> = iolist_to_binary(join(re:split("ace","a(?:b|c|d)*(.)",[{parts, + 2}]))), +?line <<":e:">> = iolist_to_binary(join(re:split("ace","a(?:b|c|d)*(.)",[]))), +?line <<":e">> = iolist_to_binary(join(re:split("ace","a(?:b|c|d)+?(.)",[trim]))), +?line <<":e:">> = iolist_to_binary(join(re:split("ace","a(?:b|c|d)+?(.)",[{parts, + 2}]))), +?line <<":e:">> = iolist_to_binary(join(re:split("ace","a(?:b|c|d)+?(.)",[]))), +?line <<":d:bcdbe">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d)+?(.)",[trim]))), +?line <<":d:bcdbe">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d)+?(.)",[{parts, + 2}]))), +?line <<":d:bcdbe">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d)+?(.)",[]))), +?line <<":e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d)+(.)",[trim]))), +?line <<":e:">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d)+(.)",[{parts, + 2}]))), +?line <<":e:">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d)+(.)",[]))), +?line <<":b:cdbe">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){2}(.)",[trim]))), +?line <<":b:cdbe">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){2}(.)",[{parts, + 2}]))), +?line <<":b:cdbe">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){2}(.)",[]))), +?line <<":b:e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){4,5}(.)",[trim]))), +?line <<":b:e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){4,5}(.)",[{parts, + 2}]))), +?line <<":b:e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){4,5}(.)",[]))), +?line <<":d:be">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){4,5}?(.)",[trim]))), +?line <<":d:be">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){4,5}?(.)",[{parts, + 2}]))), +?line <<":d:be">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){4,5}?(.)",[]))), +?line <<":bar:foo:bar">> = iolist_to_binary(join(re:split("foobar","((foo)|(bar))*",[trim]))), +?line <<":bar:foo:bar:">> = iolist_to_binary(join(re:split("foobar","((foo)|(bar))*",[{parts, + 2}]))), +?line <<":bar:foo:bar:">> = iolist_to_binary(join(re:split("foobar","((foo)|(bar))*",[]))), +?line <<":e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){6,7}(.)",[trim]))), +?line <<":e:">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){6,7}(.)",[{parts, + 2}]))), +?line <<":e:">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){6,7}(.)",[]))), +?line <<":e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){6,7}?(.)",[trim]))), +?line <<":e:">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){6,7}?(.)",[{parts, + 2}]))), +?line <<":e:">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){6,7}?(.)",[]))), +?line <<":e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,6}(.)",[trim]))), +?line <<":e:">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,6}(.)",[{parts, + 2}]))), +?line <<":e:">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,6}(.)",[]))), +?line <<":b:e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,6}?(.)",[trim]))), +?line <<":b:e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,6}?(.)",[{parts, + 2}]))), +?line <<":b:e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,6}?(.)",[]))), +?line <<":e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,7}(.)",[trim]))), +?line <<":e:">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,7}(.)",[{parts, + 2}]))), +?line <<":e:">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,7}(.)",[]))), +?line <<":b:e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,7}?(.)",[trim]))), +?line <<":b:e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,7}?(.)",[{parts, + 2}]))), +?line <<":b:e">> = iolist_to_binary(join(re:split("acdbcdbe","a(?:b|c|d){5,7}?(.)",[]))), +?line <<":c:e">> = iolist_to_binary(join(re:split("ace","a(?:b|(c|e){1,2}?|d)+?(.)",[trim]))), +?line <<":c:e:">> = iolist_to_binary(join(re:split("ace","a(?:b|(c|e){1,2}?|d)+?(.)",[{parts, + 2}]))), +?line <<":c:e:">> = iolist_to_binary(join(re:split("ace","a(?:b|(c|e){1,2}?|d)+?(.)",[]))), +?line <<":A">> = iolist_to_binary(join(re:split("AB","^(.+)?B",[trim]))), +?line <<":A:">> = iolist_to_binary(join(re:split("AB","^(.+)?B",[{parts, + 2}]))), +?line <<":A:">> = iolist_to_binary(join(re:split("AB","^(.+)?B",[]))), +?line <<":.">> = iolist_to_binary(join(re:split(".","^([^a-z])|(\\^)$",[trim]))), +?line <<":.::">> = iolist_to_binary(join(re:split(".","^([^a-z])|(\\^)$",[{parts, + 2}]))), +?line <<":.::">> = iolist_to_binary(join(re:split(".","^([^a-z])|(\\^)$",[]))), +?line <<":OUT">> = iolist_to_binary(join(re:split("<&OUT","^[<>]&",[trim]))), +?line <<":OUT">> = iolist_to_binary(join(re:split("<&OUT","^[<>]&",[{parts, + 2}]))), +?line <<":OUT">> = iolist_to_binary(join(re:split("<&OUT","^[<>]&",[]))), +?line <<":aaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<":aaaa:">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<":aaaa:">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a\\1?){4}$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a\\1?){4}$",[]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","^(a\\1?){4}$",[trim]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","^(a\\1?){4}$",[]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a\\1?){4}$",[trim]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a\\1?){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a\\1?){4}$",[]))), +?line <<":aaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a(?(1)\\1)){4}$",[trim]))), +?line <<":aaaa:">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a(?(1)\\1)){4}$",[{parts, + 2}]))), +?line <<":aaaa:">> = iolist_to_binary(join(re:split("aaaaaaaaaa","^(a(?(1)\\1)){4}$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a(?(1)\\1)){4}$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a(?(1)\\1)){4}$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(a(?(1)\\1)){4}$",[]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a(?(1)\\1)){4}$",[trim]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a(?(1)\\1)){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaa","^(a(?(1)\\1)){4}$",[]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a(?(1)\\1)){4}$",[trim]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a(?(1)\\1)){4}$",[{parts, + 2}]))), +?line <<"aaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaa","^(a(?(1)\\1)){4}$",[]))), +?line <<":f:o:o:b:a:r">> = iolist_to_binary(join(re:split("foobar","(?:(f)(o)(o)|(b)(a)(r))*",[trim]))), +?line <<":f:o:o:b:a:r:">> = iolist_to_binary(join(re:split("foobar","(?:(f)(o)(o)|(b)(a)(r))*",[{parts, + 2}]))), +?line <<":f:o:o:b:a:r:">> = iolist_to_binary(join(re:split("foobar","(?:(f)(o)(o)|(b)(a)(r))*",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("ab","(?<=a)b",[trim]))), +?line <<"a:">> = iolist_to_binary(join(re:split("ab","(?<=a)b",[{parts, + 2}]))), +?line <<"a:">> = iolist_to_binary(join(re:split("ab","(?<=a)b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=a)b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=a)b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=a)b",[]))), +?line <<"cb">> = iolist_to_binary(join(re:split("cb","(?<=a)b",[trim]))), +?line <<"cb">> = iolist_to_binary(join(re:split("cb","(?<=a)b",[{parts, + 2}]))), +?line <<"cb">> = iolist_to_binary(join(re:split("cb","(?<=a)b",[]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","(?<=a)b",[trim]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","(?<=a)b",[{parts, + 2}]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","(?<=a)b",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("ab","(?> = iolist_to_binary(join(re:split("ab","(?> = iolist_to_binary(join(re:split("ab","(?> = iolist_to_binary(join(re:split("b","(?> = iolist_to_binary(join(re:split("b","(?> = iolist_to_binary(join(re:split("b","(?> = iolist_to_binary(join(re:split("b","(?> = iolist_to_binary(join(re:split("b","(?> = iolist_to_binary(join(re:split("b","(?> = iolist_to_binary(join(re:split("aba","(?:..)*a",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aba","(?:..)*a",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aba","(?:..)*a",[]))), +?line <<":b">> = iolist_to_binary(join(re:split("aba","(?:..)*?a",[trim]))), +?line <<":ba">> = iolist_to_binary(join(re:split("aba","(?:..)*?a",[{parts, + 2}]))), +?line <<":b:">> = iolist_to_binary(join(re:split("aba","(?:..)*?a",[]))), +?line <<":b:c">> = iolist_to_binary(join(re:split("abc","^(?:b|a(?=(.)))*\\1",[trim]))), +?line <<":b:c">> = iolist_to_binary(join(re:split("abc","^(?:b|a(?=(.)))*\\1",[{parts, + 2}]))), +?line <<":b:c">> = iolist_to_binary(join(re:split("abc","^(?:b|a(?=(.)))*\\1",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(){3,5}",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(){3,5}",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(){3,5}",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aax","^(a+)*ax",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aax","^(a+)*ax",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aax","^(a+)*ax",[]))), +?line <<":a:a">> = iolist_to_binary(join(re:split("aax","^((a|b)+)*ax",[trim]))), +?line <<":a:a:">> = iolist_to_binary(join(re:split("aax","^((a|b)+)*ax",[{parts, + 2}]))), +?line <<":a:a:">> = iolist_to_binary(join(re:split("aax","^((a|b)+)*ax",[]))), +?line <<":a:a">> = iolist_to_binary(join(re:split("aax","^((a|bc)+)*ax",[trim]))), +?line <<":a:a:">> = iolist_to_binary(join(re:split("aax","^((a|bc)+)*ax",[{parts, + 2}]))), +?line <<":a:a:">> = iolist_to_binary(join(re:split("aax","^((a|bc)+)*ax",[]))), +?line <<"c">> = iolist_to_binary(join(re:split("cab","(a|x)*ab",[trim]))), +?line <<"c::">> = iolist_to_binary(join(re:split("cab","(a|x)*ab",[{parts, + 2}]))), +?line <<"c::">> = iolist_to_binary(join(re:split("cab","(a|x)*ab",[]))), +?line <<"c">> = iolist_to_binary(join(re:split("cab","(a)*ab",[trim]))), +?line <<"c::">> = iolist_to_binary(join(re:split("cab","(a)*ab",[{parts, + 2}]))), +?line <<"c::">> = iolist_to_binary(join(re:split("cab","(a)*ab",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab","(?:(?i)a)b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","(?:(?i)a)b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","(?:(?i)a)b",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("ab","((?i)a)b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","((?i)a)b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","((?i)a)b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("Ab","(?:(?i)a)b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("Ab","(?:(?i)a)b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("Ab","(?:(?i)a)b",[]))), +?line <<":A">> = iolist_to_binary(join(re:split("Ab","((?i)a)b",[trim]))), +?line <<":A:">> = iolist_to_binary(join(re:split("Ab","((?i)a)b",[{parts, + 2}]))), +?line <<":A:">> = iolist_to_binary(join(re:split("Ab","((?i)a)b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?i)a)b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?i)a)b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?i)a)b",[]))), +?line <<"cb">> = iolist_to_binary(join(re:split("cb","(?:(?i)a)b",[trim]))), +?line <<"cb">> = iolist_to_binary(join(re:split("cb","(?:(?i)a)b",[{parts, + 2}]))), +?line <<"cb">> = iolist_to_binary(join(re:split("cb","(?:(?i)a)b",[]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?:(?i)a)b",[trim]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?:(?i)a)b",[{parts, + 2}]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?:(?i)a)b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab","(?i:a)b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","(?i:a)b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","(?i:a)b",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("ab","((?i:a))b",[trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","((?i:a))b",[{parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","((?i:a))b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("Ab","(?i:a)b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("Ab","(?i:a)b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("Ab","(?i:a)b",[]))), +?line <<":A">> = iolist_to_binary(join(re:split("Ab","((?i:a))b",[trim]))), +?line <<":A:">> = iolist_to_binary(join(re:split("Ab","((?i:a))b",[{parts, + 2}]))), +?line <<":A:">> = iolist_to_binary(join(re:split("Ab","((?i:a))b",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?i:a)b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?i:a)b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?i:a)b",[]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?i:a)b",[trim]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?i:a)b",[{parts, + 2}]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?i:a)b",[]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?i:a)b",[trim]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?i:a)b",[{parts, + 2}]))), +?line <<"aB">> = iolist_to_binary(join(re:split("aB","(?i:a)b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab","(?:(?-i)a)b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","(?:(?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","(?:(?-i)a)b",[caseless]))), +?line <<":a">> = iolist_to_binary(join(re:split("ab","((?-i)a)b",[caseless, + trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","((?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","((?-i)a)b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("aB","(?:(?-i)a)b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aB","(?:(?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aB","(?:(?-i)a)b",[caseless]))), +?line <<":a">> = iolist_to_binary(join(re:split("aB","((?-i)a)b",[caseless, + trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aB","((?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aB","((?-i)a)b",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?-i)a)b",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?-i)a)b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("aB","(?:(?-i)a)b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aB","(?:(?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aB","(?:(?-i)a)b",[caseless]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?:(?-i)a)b",[caseless, + trim]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?:(?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?:(?-i)a)b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("aB","(?:(?-i)a)b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aB","(?:(?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aB","(?:(?-i)a)b",[caseless]))), +?line <<":a">> = iolist_to_binary(join(re:split("aB","((?-i)a)b",[caseless, + trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aB","((?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aB","((?-i)a)b",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?-i)a)b",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?:(?-i)a)b",[caseless]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?:(?-i)a)b",[caseless, + trim]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?:(?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?:(?-i)a)b",[caseless]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","(?:(?-i)a)b",[caseless, + trim]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","(?:(?-i)a)b",[caseless, + {parts, + 2}]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","(?:(?-i)a)b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("ab","(?-i:a)b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","(?-i:a)b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","(?-i:a)b",[caseless]))), +?line <<":a">> = iolist_to_binary(join(re:split("ab","((?-i:a))b",[caseless, + trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","((?-i:a))b",[caseless, + {parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("ab","((?-i:a))b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("aB","(?-i:a)b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aB","(?-i:a)b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aB","(?-i:a)b",[caseless]))), +?line <<":a">> = iolist_to_binary(join(re:split("aB","((?-i:a))b",[caseless, + trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aB","((?-i:a))b",[caseless, + {parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aB","((?-i:a))b",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?-i:a)b",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?-i:a)b",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?-i:a)b",[caseless]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","(?-i:a)b",[caseless, + trim]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","(?-i:a)b",[caseless, + {parts, + 2}]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","(?-i:a)b",[caseless]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?-i:a)b",[caseless, + trim]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?-i:a)b",[caseless, + {parts, + 2}]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?-i:a)b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("aB","(?-i:a)b",[caseless, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aB","(?-i:a)b",[caseless, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aB","(?-i:a)b",[caseless]))), +?line <<":a">> = iolist_to_binary(join(re:split("aB","((?-i:a))b",[caseless, + trim]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aB","((?-i:a))b",[caseless, + {parts, + 2}]))), +?line <<":a:">> = iolist_to_binary(join(re:split("aB","((?-i:a))b",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?-i:a)b",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?-i:a)b",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?-i:a)b",[caseless]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?-i:a)b",[caseless, + trim]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?-i:a)b",[caseless, + {parts, + 2}]))), +?line <<"Ab">> = iolist_to_binary(join(re:split("Ab","(?-i:a)b",[caseless]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","(?-i:a)b",[caseless, + trim]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","(?-i:a)b",[caseless, + {parts, + 2}]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","(?-i:a)b",[caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?-i:a.))b",[caseless, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?-i:a.))b",[caseless, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?-i:a.))b",[caseless]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","((?-i:a.))b",[caseless, + trim]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","((?-i:a.))b",[caseless, + {parts, + 2}]))), +?line <<"AB">> = iolist_to_binary(join(re:split("AB","((?-i:a.))b",[caseless]))), +?line <<"a +B">> = iolist_to_binary(join(re:split("a +B","((?-i:a.))b",[caseless,trim]))), +?line <<"a +B">> = iolist_to_binary(join(re:split("a +B","((?-i:a.))b",[caseless,{parts,2}]))), +?line <<"a +B">> = iolist_to_binary(join(re:split("a +B","((?-i:a.))b",[caseless]))), +?line <<":a +">> = iolist_to_binary(join(re:split("a +B","((?s-i:a.))b",[caseless,trim]))), +?line <<":a +:">> = iolist_to_binary(join(re:split("a +B","((?s-i:a.))b",[caseless,{parts,2}]))), +?line <<":a +:">> = iolist_to_binary(join(re:split("a +B","((?s-i:a.))b",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("cabbbb","(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("cabbbb","(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("cabbbb","(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))",[]))), +?line <<"">> = iolist_to_binary(join(re:split("caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))",[]))), +?line <<":Ab">> = iolist_to_binary(join(re:split("Ab4ab","(ab)\\d\\1",[caseless, + trim]))), +?line <<":Ab:">> = iolist_to_binary(join(re:split("Ab4ab","(ab)\\d\\1",[caseless, + {parts, + 2}]))), +?line <<":Ab:">> = iolist_to_binary(join(re:split("Ab4ab","(ab)\\d\\1",[caseless]))), +?line <<":ab">> = iolist_to_binary(join(re:split("ab4Ab","(ab)\\d\\1",[caseless, + trim]))), +?line <<":ab:">> = iolist_to_binary(join(re:split("ab4Ab","(ab)\\d\\1",[caseless, + {parts, + 2}]))), +?line <<":ab:">> = iolist_to_binary(join(re:split("ab4Ab","(ab)\\d\\1",[caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("foobar1234baz","foo\\w*\\d{4}baz",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("foobar1234baz","foo\\w*\\d{4}baz",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("foobar1234baz","foo\\w*\\d{4}baz",[]))), +?line <<":~~">> = iolist_to_binary(join(re:split("x~~","x(~~)*(?:(?:F)?)?",[trim]))), +?line <<":~~:">> = iolist_to_binary(join(re:split("x~~","x(~~)*(?:(?:F)?)?",[{parts, + 2}]))), +?line <<":~~:">> = iolist_to_binary(join(re:split("x~~","x(~~)*(?:(?:F)?)?",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaac","^a(?#xxx){3}c",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaac","^a(?#xxx){3}c",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaac","^a(?#xxx){3}c",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaac","^a (?#xxx) (?#yyy) {3}c",[extended, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaac","^a (?#xxx) (?#yyy) {3}c",[extended, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaac","^a (?#xxx) (?#yyy) {3}c",[extended]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?> = iolist_to_binary(join(re:split("*** Failers","(?> = iolist_to_binary(join(re:split("*** Failers","(?> = iolist_to_binary(join(re:split("B +B","(?> = iolist_to_binary(join(re:split("B +B","(?> = iolist_to_binary(join(re:split("B +B","(?> = iolist_to_binary(join(re:split("dbcb","(?> = iolist_to_binary(join(re:split("dbcb","(?> = iolist_to_binary(join(re:split("dbcb","(?> = iolist_to_binary(join(re:split("dbaacb","(?> = iolist_to_binary(join(re:split("dbaacb","(?> = iolist_to_binary(join(re:split("dbaacb","(?> = iolist_to_binary(join(re:split("dbaacb","(?> = iolist_to_binary(join(re:split("dbaacb","(?> = iolist_to_binary(join(re:split("dbaacb","(?> = iolist_to_binary(join(re:split("cdaccb","(?> = iolist_to_binary(join(re:split("cdaccb","(?> = iolist_to_binary(join(re:split("cdaccb","(?> = iolist_to_binary(join(re:split("","^(?:a?b?)*$",[trim]))), +?line <<"">> = iolist_to_binary(join(re:split("","^(?:a?b?)*$",[{parts, + 2}]))), +?line <<"">> = iolist_to_binary(join(re:split("","^(?:a?b?)*$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","^(?:a?b?)*$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^(?:a?b?)*$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^(?:a?b?)*$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab","^(?:a?b?)*$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","^(?:a?b?)*$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab","^(?:a?b?)*$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaa","^(?:a?b?)*$",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaa","^(?:a?b?)*$",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaa","^(?:a?b?)*$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?:a?b?)*$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?:a?b?)*$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?:a?b?)*$",[]))), +?line <<"dbcb">> = iolist_to_binary(join(re:split("dbcb","^(?:a?b?)*$",[trim]))), +?line <<"dbcb">> = iolist_to_binary(join(re:split("dbcb","^(?:a?b?)*$",[{parts, + 2}]))), +?line <<"dbcb">> = iolist_to_binary(join(re:split("dbcb","^(?:a?b?)*$",[]))), +?line <<"a--">> = iolist_to_binary(join(re:split("a--","^(?:a?b?)*$",[trim]))), +?line <<"a--">> = iolist_to_binary(join(re:split("a--","^(?:a?b?)*$",[{parts, + 2}]))), +?line <<"a--">> = iolist_to_binary(join(re:split("a--","^(?:a?b?)*$",[]))), +?line <<"aa--">> = iolist_to_binary(join(re:split("aa--","^(?:a?b?)*$",[trim]))), +?line <<"aa--">> = iolist_to_binary(join(re:split("aa--","^(?:a?b?)*$",[{parts, + 2}]))), +?line <<"aa--">> = iolist_to_binary(join(re:split("aa--","^(?:a?b?)*$",[]))), +?line <<":a +: +:b: +c">> = iolist_to_binary(join(re:split("a +b +c","((?s)^a(.))((?m)^b$)",[trim]))), +?line <<":a +: +:b: +c">> = iolist_to_binary(join(re:split("a +b +c","((?s)^a(.))((?m)^b$)",[{parts,2}]))), +?line <<":a +: +:b: +c">> = iolist_to_binary(join(re:split("a +b +c","((?s)^a(.))((?m)^b$)",[]))), +?line <<"a +:b: +c">> = iolist_to_binary(join(re:split("a +b +c","((?m)^b$)",[trim]))), +?line <<"a +:b: +c">> = iolist_to_binary(join(re:split("a +b +c","((?m)^b$)",[{parts,2}]))), +?line <<"a +:b: +c">> = iolist_to_binary(join(re:split("a +b +c","((?m)^b$)",[]))), +?line <<"a +">> = iolist_to_binary(join(re:split("a +b","(?m)^b",[trim]))), +?line <<"a +:">> = iolist_to_binary(join(re:split("a +b","(?m)^b",[{parts,2}]))), +?line <<"a +:">> = iolist_to_binary(join(re:split("a +b","(?m)^b",[]))), +?line <<"a +:b">> = iolist_to_binary(join(re:split("a +b","(?m)^(b)",[trim]))), +?line <<"a +:b:">> = iolist_to_binary(join(re:split("a +b","(?m)^(b)",[{parts,2}]))), +?line <<"a +:b:">> = iolist_to_binary(join(re:split("a +b","(?m)^(b)",[]))), +?line <<"a +:b">> = iolist_to_binary(join(re:split("a +b","((?m)^b)",[trim]))), +?line <<"a +:b:">> = iolist_to_binary(join(re:split("a +b","((?m)^b)",[{parts,2}]))), +?line <<"a +:b:">> = iolist_to_binary(join(re:split("a +b","((?m)^b)",[]))), +?line <<"a:b">> = iolist_to_binary(join(re:split("a +b","\\n((?m)^b)",[trim]))), +?line <<"a:b:">> = iolist_to_binary(join(re:split("a +b","\\n((?m)^b)",[{parts,2}]))), +?line <<"a:b:">> = iolist_to_binary(join(re:split("a +b","\\n((?m)^b)",[]))), +?line <<"a +b: +">> = iolist_to_binary(join(re:split("a +b +c","((?s).)c(?!.)",[trim]))), +?line <<"a +b: +:">> = iolist_to_binary(join(re:split("a +b +c","((?s).)c(?!.)",[{parts,2}]))), +?line <<"a +b: +:">> = iolist_to_binary(join(re:split("a +b +c","((?s).)c(?!.)",[]))), +?line <<"a +b: +">> = iolist_to_binary(join(re:split("a +b +c","((?s).)c(?!.)",[trim]))), +?line <<"a +b: +:">> = iolist_to_binary(join(re:split("a +b +c","((?s).)c(?!.)",[{parts,2}]))), +?line <<"a +b: +:">> = iolist_to_binary(join(re:split("a +b +c","((?s).)c(?!.)",[]))), +?line <<"a +:b +">> = iolist_to_binary(join(re:split("a +b +c","((?s)b.)c(?!.)",[trim]))), +?line <<"a +:b +:">> = iolist_to_binary(join(re:split("a +b +c","((?s)b.)c(?!.)",[{parts,2}]))), +?line <<"a +:b +:">> = iolist_to_binary(join(re:split("a +b +c","((?s)b.)c(?!.)",[]))), +?line <<"a +:b +">> = iolist_to_binary(join(re:split("a +b +c","((?s)b.)c(?!.)",[trim]))), +?line <<"a +:b +:">> = iolist_to_binary(join(re:split("a +b +c","((?s)b.)c(?!.)",[{parts,2}]))), +?line <<"a +:b +:">> = iolist_to_binary(join(re:split("a +b +c","((?s)b.)c(?!.)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","()^b",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","()^b",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","()^b",[]))), +?line <<"a +b +c">> = iolist_to_binary(join(re:split("a +b +c","()^b",[trim]))), +?line <<"a +b +c">> = iolist_to_binary(join(re:split("a +b +c","()^b",[{parts,2}]))), +?line <<"a +b +c">> = iolist_to_binary(join(re:split("a +b +c","()^b",[]))), +?line <<"a +b +c">> = iolist_to_binary(join(re:split("a +b +c","()^b",[trim]))), +?line <<"a +b +c">> = iolist_to_binary(join(re:split("a +b +c","()^b",[{parts,2}]))), +?line <<"a +b +c">> = iolist_to_binary(join(re:split("a +b +c","()^b",[]))), +?line <<"a +:b: +c">> = iolist_to_binary(join(re:split("a +b +c","((?m)^b)",[trim]))), +?line <<"a +:b: +c">> = iolist_to_binary(join(re:split("a +b +c","((?m)^b)",[{parts,2}]))), +?line <<"a +:b: +c">> = iolist_to_binary(join(re:split("a +b +c","((?m)^b)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(x)?(?(1)a|b)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(x)?(?(1)a|b)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(x)?(?(1)a|b)",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(x)?(?(1)a|b)",[trim]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(x)?(?(1)a|b)",[{parts, + 2}]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(x)?(?(1)a|b)",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(x)?(?(1)a|b)",[trim]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(x)?(?(1)a|b)",[{parts, + 2}]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(x)?(?(1)a|b)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","(x)?(?(1)b|a)",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","(x)?(?(1)b|a)",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","(x)?(?(1)b|a)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","()?(?(1)b|a)",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","()?(?(1)b|a)",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","()?(?(1)b|a)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","()?(?(1)a|b)",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","()?(?(1)a|b)",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","()?(?(1)a|b)",[]))), +?line <<":(:)">> = iolist_to_binary(join(re:split("(blah)","^(\\()?blah(?(1)(\\)))$",[trim]))), +?line <<":(:):">> = iolist_to_binary(join(re:split("(blah)","^(\\()?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<":(:):">> = iolist_to_binary(join(re:split("(blah)","^(\\()?blah(?(1)(\\)))$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("blah","^(\\()?blah(?(1)(\\)))$",[trim]))), +?line <<":::">> = iolist_to_binary(join(re:split("blah","^(\\()?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<":::">> = iolist_to_binary(join(re:split("blah","^(\\()?blah(?(1)(\\)))$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\()?blah(?(1)(\\)))$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\()?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\()?blah(?(1)(\\)))$",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","^(\\()?blah(?(1)(\\)))$",[trim]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","^(\\()?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","^(\\()?blah(?(1)(\\)))$",[]))), +?line <<"blah)">> = iolist_to_binary(join(re:split("blah)","^(\\()?blah(?(1)(\\)))$",[trim]))), +?line <<"blah)">> = iolist_to_binary(join(re:split("blah)","^(\\()?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<"blah)">> = iolist_to_binary(join(re:split("blah)","^(\\()?blah(?(1)(\\)))$",[]))), +?line <<"(blah">> = iolist_to_binary(join(re:split("(blah","^(\\()?blah(?(1)(\\)))$",[trim]))), +?line <<"(blah">> = iolist_to_binary(join(re:split("(blah","^(\\()?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<"(blah">> = iolist_to_binary(join(re:split("(blah","^(\\()?blah(?(1)(\\)))$",[]))), +?line <<":(:)">> = iolist_to_binary(join(re:split("(blah)","^(\\(+)?blah(?(1)(\\)))$",[trim]))), +?line <<":(:):">> = iolist_to_binary(join(re:split("(blah)","^(\\(+)?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<":(:):">> = iolist_to_binary(join(re:split("(blah)","^(\\(+)?blah(?(1)(\\)))$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("blah","^(\\(+)?blah(?(1)(\\)))$",[trim]))), +?line <<":::">> = iolist_to_binary(join(re:split("blah","^(\\(+)?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<":::">> = iolist_to_binary(join(re:split("blah","^(\\(+)?blah(?(1)(\\)))$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\(+)?blah(?(1)(\\)))$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\(+)?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(\\(+)?blah(?(1)(\\)))$",[]))), +?line <<"blah)">> = iolist_to_binary(join(re:split("blah)","^(\\(+)?blah(?(1)(\\)))$",[trim]))), +?line <<"blah)">> = iolist_to_binary(join(re:split("blah)","^(\\(+)?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<"blah)">> = iolist_to_binary(join(re:split("blah)","^(\\(+)?blah(?(1)(\\)))$",[]))), +?line <<"(blah">> = iolist_to_binary(join(re:split("(blah","^(\\(+)?blah(?(1)(\\)))$",[trim]))), +?line <<"(blah">> = iolist_to_binary(join(re:split("(blah","^(\\(+)?blah(?(1)(\\)))$",[{parts, + 2}]))), +?line <<"(blah">> = iolist_to_binary(join(re:split("(blah","^(\\(+)?blah(?(1)(\\)))$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","(?(?!a)b|a)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","(?(?!a)b|a)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","(?(?!a)b|a)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?(?=a)b|a)",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?(?=a)b|a)",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?(?=a)b|a)",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(?(?=a)b|a)",[trim]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(?(?=a)b|a)",[{parts, + 2}]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(?(?=a)b|a)",[]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(?(?=a)b|a)",[trim]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(?(?=a)b|a)",[{parts, + 2}]))), +?line <<"a">> = iolist_to_binary(join(re:split("a","(?(?=a)b|a)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","(?(?=a)a|b)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","(?(?=a)a|b)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","(?(?=a)a|b)",[]))), +?line <<"a:a:aab">> = iolist_to_binary(join(re:split("aaab","(?=(a+?))(\\1ab)",[trim]))), +?line <<"a:a:aab:">> = iolist_to_binary(join(re:split("aaab","(?=(a+?))(\\1ab)",[{parts, + 2}]))), +?line <<"a:a:aab:">> = iolist_to_binary(join(re:split("aaab","(?=(a+?))(\\1ab)",[]))), +?line <<":one:">> = iolist_to_binary(join(re:split("one:","(\\w+:)+",[trim]))), +?line <<":one::">> = iolist_to_binary(join(re:split("one:","(\\w+:)+",[{parts, + 2}]))), +?line <<":one::">> = iolist_to_binary(join(re:split("one:","(\\w+:)+",[]))), +?line <<"a:a">> = iolist_to_binary(join(re:split("a","$(?<=^(a))",[trim]))), +?line <<"a:a:">> = iolist_to_binary(join(re:split("a","$(?<=^(a))",[{parts, + 2}]))), +?line <<"a:a:">> = iolist_to_binary(join(re:split("a","$(?<=^(a))",[]))), +?line <<"a:a:aab">> = iolist_to_binary(join(re:split("aaab","(?=(a+?))(\\1ab)",[trim]))), +?line <<"a:a:aab:">> = iolist_to_binary(join(re:split("aaab","(?=(a+?))(\\1ab)",[{parts, + 2}]))), +?line <<"a:a:aab:">> = iolist_to_binary(join(re:split("aaab","(?=(a+?))(\\1ab)",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?=(a+?))\\1ab",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?=(a+?))\\1ab",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?=(a+?))\\1ab",[]))), +?line <<"aaab">> = iolist_to_binary(join(re:split("aaab","^(?=(a+?))\\1ab",[trim]))), +?line <<"aaab">> = iolist_to_binary(join(re:split("aaab","^(?=(a+?))\\1ab",[{parts, + 2}]))), +?line <<"aaab">> = iolist_to_binary(join(re:split("aaab","^(?=(a+?))\\1ab",[]))), +?line <<"aaab">> = iolist_to_binary(join(re:split("aaab","^(?=(a+?))\\1ab",[trim]))), +?line <<"aaab">> = iolist_to_binary(join(re:split("aaab","^(?=(a+?))\\1ab",[{parts, + 2}]))), +?line <<"aaab">> = iolist_to_binary(join(re:split("aaab","^(?=(a+?))\\1ab",[]))), +?line <<"::abcd">> = iolist_to_binary(join(re:split("abcd","([\\w:]+::)?(\\w+)$",[trim]))), +?line <<"::abcd:">> = iolist_to_binary(join(re:split("abcd","([\\w:]+::)?(\\w+)$",[{parts, + 2}]))), +?line <<"::abcd:">> = iolist_to_binary(join(re:split("abcd","([\\w:]+::)?(\\w+)$",[]))), +?line <<":xy:z::::abcd">> = iolist_to_binary(join(re:split("xy:z:::abcd","([\\w:]+::)?(\\w+)$",[trim]))), +?line <<":xy:z::::abcd:">> = iolist_to_binary(join(re:split("xy:z:::abcd","([\\w:]+::)?(\\w+)$",[{parts, + 2}]))), +?line <<":xy:z::::abcd:">> = iolist_to_binary(join(re:split("xy:z:::abcd","([\\w:]+::)?(\\w+)$",[]))), +?line <<":c:d">> = iolist_to_binary(join(re:split("aexycd","^[^bcd]*(c+)",[trim]))), +?line <<":c:d">> = iolist_to_binary(join(re:split("aexycd","^[^bcd]*(c+)",[{parts, + 2}]))), +?line <<":c:d">> = iolist_to_binary(join(re:split("aexycd","^[^bcd]*(c+)",[]))), +?line <<"c:aa">> = iolist_to_binary(join(re:split("caab","(a*)b+",[trim]))), +?line <<"c:aa:">> = iolist_to_binary(join(re:split("caab","(a*)b+",[{parts, + 2}]))), +?line <<"c:aa:">> = iolist_to_binary(join(re:split("caab","(a*)b+",[]))), +?line <<"::abcd">> = iolist_to_binary(join(re:split("abcd","([\\w:]+::)?(\\w+)$",[trim]))), +?line <<"::abcd:">> = iolist_to_binary(join(re:split("abcd","([\\w:]+::)?(\\w+)$",[{parts, + 2}]))), +?line <<"::abcd:">> = iolist_to_binary(join(re:split("abcd","([\\w:]+::)?(\\w+)$",[]))), +?line <<":xy:z::::abcd">> = iolist_to_binary(join(re:split("xy:z:::abcd","([\\w:]+::)?(\\w+)$",[trim]))), +?line <<":xy:z::::abcd:">> = iolist_to_binary(join(re:split("xy:z:::abcd","([\\w:]+::)?(\\w+)$",[{parts, + 2}]))), +?line <<":xy:z::::abcd:">> = iolist_to_binary(join(re:split("xy:z:::abcd","([\\w:]+::)?(\\w+)$",[]))), +?line <<"*** ::Failers">> = iolist_to_binary(join(re:split("*** Failers","([\\w:]+::)?(\\w+)$",[trim]))), +?line <<"*** ::Failers:">> = iolist_to_binary(join(re:split("*** Failers","([\\w:]+::)?(\\w+)$",[{parts, + 2}]))), +?line <<"*** ::Failers:">> = iolist_to_binary(join(re:split("*** Failers","([\\w:]+::)?(\\w+)$",[]))), +?line <<"abcd:">> = iolist_to_binary(join(re:split("abcd:","([\\w:]+::)?(\\w+)$",[trim]))), +?line <<"abcd:">> = iolist_to_binary(join(re:split("abcd:","([\\w:]+::)?(\\w+)$",[{parts, + 2}]))), +?line <<"abcd:">> = iolist_to_binary(join(re:split("abcd:","([\\w:]+::)?(\\w+)$",[]))), +?line <<"abcd:">> = iolist_to_binary(join(re:split("abcd:","([\\w:]+::)?(\\w+)$",[trim]))), +?line <<"abcd:">> = iolist_to_binary(join(re:split("abcd:","([\\w:]+::)?(\\w+)$",[{parts, + 2}]))), +?line <<"abcd:">> = iolist_to_binary(join(re:split("abcd:","([\\w:]+::)?(\\w+)$",[]))), +?line <<":c:d">> = iolist_to_binary(join(re:split("aexycd","^[^bcd]*(c+)",[trim]))), +?line <<":c:d">> = iolist_to_binary(join(re:split("aexycd","^[^bcd]*(c+)",[{parts, + 2}]))), +?line <<":c:d">> = iolist_to_binary(join(re:split("aexycd","^[^bcd]*(c+)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaab","(?>a+)b",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaab","(?>a+)b",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaab","(?>a+)b",[]))), +?line <<"a::[:b]::">> = iolist_to_binary(join(re:split("a:[b]:","([[:]+)",[trim]))), +?line <<"a::[:b]:">> = iolist_to_binary(join(re:split("a:[b]:","([[:]+)",[{parts, + 2}]))), +?line <<"a::[:b]:::">> = iolist_to_binary(join(re:split("a:[b]:","([[:]+)",[]))), +?line <<"a:=[:b]:=">> = iolist_to_binary(join(re:split("a=[b]=","([[=]+)",[trim]))), +?line <<"a:=[:b]=">> = iolist_to_binary(join(re:split("a=[b]=","([[=]+)",[{parts, + 2}]))), +?line <<"a:=[:b]:=:">> = iolist_to_binary(join(re:split("a=[b]=","([[=]+)",[]))), +?line <<"a:.[:b]:.">> = iolist_to_binary(join(re:split("a.[b].","([[.]+)",[trim]))), +?line <<"a:.[:b].">> = iolist_to_binary(join(re:split("a.[b].","([[.]+)",[{parts, + 2}]))), +?line <<"a:.[:b]:.:">> = iolist_to_binary(join(re:split("a.[b].","([[.]+)",[]))), +?line <<":aaab">> = iolist_to_binary(join(re:split("aaab","((?>a+)b)",[trim]))), +?line <<":aaab:">> = iolist_to_binary(join(re:split("aaab","((?>a+)b)",[{parts, + 2}]))), +?line <<":aaab:">> = iolist_to_binary(join(re:split("aaab","((?>a+)b)",[]))), +?line <<":aaa">> = iolist_to_binary(join(re:split("aaab","(?>(a+))b",[trim]))), +?line <<":aaa:">> = iolist_to_binary(join(re:split("aaab","(?>(a+))b",[{parts, + 2}]))), +?line <<":aaa:">> = iolist_to_binary(join(re:split("aaab","(?>(a+))b",[]))), +?line <<"((:x">> = iolist_to_binary(join(re:split("((abc(ade)ufh()()x","((?>[^()]+)|\\([^()]*\\))+",[trim]))), +?line <<"((:x:">> = iolist_to_binary(join(re:split("((abc(ade)ufh()()x","((?>[^()]+)|\\([^()]*\\))+",[{parts, + 2}]))), +?line <<"((:x:">> = iolist_to_binary(join(re:split("((abc(ade)ufh()()x","((?>[^()]+)|\\([^()]*\\))+",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a\\Z",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a\\Z",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a\\Z",[]))), +?line <<"aaab">> = iolist_to_binary(join(re:split("aaab","a\\Z",[trim]))), +?line <<"aaab">> = iolist_to_binary(join(re:split("aaab","a\\Z",[{parts, + 2}]))), +?line <<"aaab">> = iolist_to_binary(join(re:split("aaab","a\\Z",[]))), +?line <<"a +b">> = iolist_to_binary(join(re:split("a +b","a\\Z",[trim]))), +?line <<"a +b">> = iolist_to_binary(join(re:split("a +b","a\\Z",[{parts,2}]))), +?line <<"a +b">> = iolist_to_binary(join(re:split("a +b","a\\Z",[]))), +?line <<"a +">> = iolist_to_binary(join(re:split("a +b","b\\Z",[trim]))), +?line <<"a +:">> = iolist_to_binary(join(re:split("a +b","b\\Z",[{parts,2}]))), +?line <<"a +:">> = iolist_to_binary(join(re:split("a +b","b\\Z",[]))), +?line <<"a +">> = iolist_to_binary(join(re:split("a +b","b\\Z",[trim]))), +?line <<"a +:">> = iolist_to_binary(join(re:split("a +b","b\\Z",[{parts,2}]))), +?line <<"a +:">> = iolist_to_binary(join(re:split("a +b","b\\Z",[]))), +?line <<"a +">> = iolist_to_binary(join(re:split("a +b","b\\z",[trim]))), +?line <<"a +:">> = iolist_to_binary(join(re:split("a +b","b\\z",[{parts,2}]))), +?line <<"a +:">> = iolist_to_binary(join(re:split("a +b","b\\z",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","b\\z",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","b\\z",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","b\\z",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("abc","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("abc","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a-b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a-b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a-b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("0-9","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("0-9","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("0-9","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a.b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a.b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a.b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("5.6.7","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("5.6.7","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("5.6.7","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("the.quick.brown.fox","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("the.quick.brown.fox","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("the.quick.brown.fox","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a100.b200.300c","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a100.b200.300c","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a100.b200.300c","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("12-ab.1245","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("12-ab.1245","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("12-ab.1245","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"">> = iolist_to_binary(join(re:split("","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"">> = iolist_to_binary(join(re:split("","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"">> = iolist_to_binary(join(re:split("","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<".a">> = iolist_to_binary(join(re:split(".a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<".a">> = iolist_to_binary(join(re:split(".a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<".a">> = iolist_to_binary(join(re:split(".a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"-a">> = iolist_to_binary(join(re:split("-a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"-a">> = iolist_to_binary(join(re:split("-a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"-a">> = iolist_to_binary(join(re:split("-a","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"a-">> = iolist_to_binary(join(re:split("a-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"a-">> = iolist_to_binary(join(re:split("a-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"a-">> = iolist_to_binary(join(re:split("a-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"a.">> = iolist_to_binary(join(re:split("a.","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"a.">> = iolist_to_binary(join(re:split("a.","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"a.">> = iolist_to_binary(join(re:split("a.","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"a_b">> = iolist_to_binary(join(re:split("a_b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"a_b">> = iolist_to_binary(join(re:split("a_b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"a_b">> = iolist_to_binary(join(re:split("a_b","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"a.-">> = iolist_to_binary(join(re:split("a.-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"a.-">> = iolist_to_binary(join(re:split("a.-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"a.-">> = iolist_to_binary(join(re:split("a.-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"a..">> = iolist_to_binary(join(re:split("a..","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"a..">> = iolist_to_binary(join(re:split("a..","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"a..">> = iolist_to_binary(join(re:split("a..","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"ab..bc">> = iolist_to_binary(join(re:split("ab..bc","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"ab..bc">> = iolist_to_binary(join(re:split("ab..bc","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"ab..bc">> = iolist_to_binary(join(re:split("ab..bc","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"the.quick.brown.fox-">> = iolist_to_binary(join(re:split("the.quick.brown.fox-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"the.quick.brown.fox-">> = iolist_to_binary(join(re:split("the.quick.brown.fox-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"the.quick.brown.fox-">> = iolist_to_binary(join(re:split("the.quick.brown.fox-","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"the.quick.brown.fox.">> = iolist_to_binary(join(re:split("the.quick.brown.fox.","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"the.quick.brown.fox.">> = iolist_to_binary(join(re:split("the.quick.brown.fox.","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"the.quick.brown.fox.">> = iolist_to_binary(join(re:split("the.quick.brown.fox.","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"the.quick.brown.fox_">> = iolist_to_binary(join(re:split("the.quick.brown.fox_","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"the.quick.brown.fox_">> = iolist_to_binary(join(re:split("the.quick.brown.fox_","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"the.quick.brown.fox_">> = iolist_to_binary(join(re:split("the.quick.brown.fox_","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<"the.quick.brown.fox+">> = iolist_to_binary(join(re:split("the.quick.brown.fox+","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[trim]))), +?line <<"the.quick.brown.fox+">> = iolist_to_binary(join(re:split("the.quick.brown.fox+","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[{parts, + 2}]))), +?line <<"the.quick.brown.fox+">> = iolist_to_binary(join(re:split("the.quick.brown.fox+","^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$",[]))), +?line <<":abcd">> = iolist_to_binary(join(re:split("alphabetabcd","(?>.*)(?<=(abcd|wxyz))",[trim]))), +?line <<":abcd:">> = iolist_to_binary(join(re:split("alphabetabcd","(?>.*)(?<=(abcd|wxyz))",[{parts, + 2}]))), +?line <<":abcd:">> = iolist_to_binary(join(re:split("alphabetabcd","(?>.*)(?<=(abcd|wxyz))",[]))), +?line <<":wxyz">> = iolist_to_binary(join(re:split("endingwxyz","(?>.*)(?<=(abcd|wxyz))",[trim]))), +?line <<":wxyz:">> = iolist_to_binary(join(re:split("endingwxyz","(?>.*)(?<=(abcd|wxyz))",[{parts, + 2}]))), +?line <<":wxyz:">> = iolist_to_binary(join(re:split("endingwxyz","(?>.*)(?<=(abcd|wxyz))",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?>.*)(?<=(abcd|wxyz))",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?>.*)(?<=(abcd|wxyz))",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?>.*)(?<=(abcd|wxyz))",[]))), +?line <<"a rather long string that doesn't end with one of them">> = iolist_to_binary(join(re:split("a rather long string that doesn't end with one of them","(?>.*)(?<=(abcd|wxyz))",[trim]))), +?line <<"a rather long string that doesn't end with one of them">> = iolist_to_binary(join(re:split("a rather long string that doesn't end with one of them","(?>.*)(?<=(abcd|wxyz))",[{parts, + 2}]))), +?line <<"a rather long string that doesn't end with one of them">> = iolist_to_binary(join(re:split("a rather long string that doesn't end with one of them","(?>.*)(?<=(abcd|wxyz))",[]))), +?line <<"">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark otherword","word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark otherword","word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark otherword","word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword",[]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark","word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword",[trim]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark","word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword",[{parts, + 2}]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark","word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword",[]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope","word (?>[a-zA-Z0-9]+ ){0,30}otherword",[trim]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope","word (?>[a-zA-Z0-9]+ ){0,30}otherword",[{parts, + 2}]))), +?line <<"word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope">> = iolist_to_binary(join(re:split("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope","word (?>[a-zA-Z0-9]+ ){0,30}otherword",[]))), +?line <<"999">> = iolist_to_binary(join(re:split("999foo","(?<=\\d{3}(?!999))foo",[trim]))), +?line <<"999:">> = iolist_to_binary(join(re:split("999foo","(?<=\\d{3}(?!999))foo",[{parts, + 2}]))), +?line <<"999:">> = iolist_to_binary(join(re:split("999foo","(?<=\\d{3}(?!999))foo",[]))), +?line <<"123999">> = iolist_to_binary(join(re:split("123999foo","(?<=\\d{3}(?!999))foo",[trim]))), +?line <<"123999:">> = iolist_to_binary(join(re:split("123999foo","(?<=\\d{3}(?!999))foo",[{parts, + 2}]))), +?line <<"123999:">> = iolist_to_binary(join(re:split("123999foo","(?<=\\d{3}(?!999))foo",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=\\d{3}(?!999))foo",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=\\d{3}(?!999))foo",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=\\d{3}(?!999))foo",[]))), +?line <<"123abcfoo">> = iolist_to_binary(join(re:split("123abcfoo","(?<=\\d{3}(?!999))foo",[trim]))), +?line <<"123abcfoo">> = iolist_to_binary(join(re:split("123abcfoo","(?<=\\d{3}(?!999))foo",[{parts, + 2}]))), +?line <<"123abcfoo">> = iolist_to_binary(join(re:split("123abcfoo","(?<=\\d{3}(?!999))foo",[]))), +?line <<"999">> = iolist_to_binary(join(re:split("999foo","(?<=(?!...999)\\d{3})foo",[trim]))), +?line <<"999:">> = iolist_to_binary(join(re:split("999foo","(?<=(?!...999)\\d{3})foo",[{parts, + 2}]))), +?line <<"999:">> = iolist_to_binary(join(re:split("999foo","(?<=(?!...999)\\d{3})foo",[]))), +?line <<"123999">> = iolist_to_binary(join(re:split("123999foo","(?<=(?!...999)\\d{3})foo",[trim]))), +?line <<"123999:">> = iolist_to_binary(join(re:split("123999foo","(?<=(?!...999)\\d{3})foo",[{parts, + 2}]))), +?line <<"123999:">> = iolist_to_binary(join(re:split("123999foo","(?<=(?!...999)\\d{3})foo",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=(?!...999)\\d{3})foo",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=(?!...999)\\d{3})foo",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=(?!...999)\\d{3})foo",[]))), +?line <<"123abcfoo">> = iolist_to_binary(join(re:split("123abcfoo","(?<=(?!...999)\\d{3})foo",[trim]))), +?line <<"123abcfoo">> = iolist_to_binary(join(re:split("123abcfoo","(?<=(?!...999)\\d{3})foo",[{parts, + 2}]))), +?line <<"123abcfoo">> = iolist_to_binary(join(re:split("123abcfoo","(?<=(?!...999)\\d{3})foo",[]))), +?line <<"123abc">> = iolist_to_binary(join(re:split("123abcfoo","(?<=\\d{3}(?!999)...)foo",[trim]))), +?line <<"123abc:">> = iolist_to_binary(join(re:split("123abcfoo","(?<=\\d{3}(?!999)...)foo",[{parts, + 2}]))), +?line <<"123abc:">> = iolist_to_binary(join(re:split("123abcfoo","(?<=\\d{3}(?!999)...)foo",[]))), +?line <<"123456">> = iolist_to_binary(join(re:split("123456foo","(?<=\\d{3}(?!999)...)foo",[trim]))), +?line <<"123456:">> = iolist_to_binary(join(re:split("123456foo","(?<=\\d{3}(?!999)...)foo",[{parts, + 2}]))), +?line <<"123456:">> = iolist_to_binary(join(re:split("123456foo","(?<=\\d{3}(?!999)...)foo",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=\\d{3}(?!999)...)foo",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=\\d{3}(?!999)...)foo",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?<=\\d{3}(?!999)...)foo",[]))), +?line <<"123999foo">> = iolist_to_binary(join(re:split("123999foo","(?<=\\d{3}(?!999)...)foo",[trim]))), +?line <<"123999foo">> = iolist_to_binary(join(re:split("123999foo","(?<=\\d{3}(?!999)...)foo",[{parts, + 2}]))), +?line <<"123999foo">> = iolist_to_binary(join(re:split("123999foo","(?<=\\d{3}(?!999)...)foo",[]))), +?line <<"123abc">> = iolist_to_binary(join(re:split("123abcfoo","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("123abcfoo","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("123abcfoo","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("123456foo","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("123456foo","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("123456foo","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("*** Failers","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("*** Failers","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("*** Failers","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("123999foo","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("123999foo","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("123999foo","(?<=\\d{3}...)(?> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("> = iolist_to_binary(join(re:split("\\s*)=(?>\\s*) # find > = iolist_to_binary(join(re:split("\\s*)=(?>\\s*) # find > = iolist_to_binary(join(re:split("\\s*)=(?>\\s*) # find > = iolist_to_binary(join(re:split("\\s*)=(?>\\s*) # find > = iolist_to_binary(join(re:split("\\s*)=(?>\\s*) # find > = iolist_to_binary(join(re:split("\\s*)=(?>\\s*) # find > = iolist_to_binary(join(re:split("\\s*)=(?>\\s*) # find > = iolist_to_binary(join(re:split("\\s*)=(?>\\s*) # find > = iolist_to_binary(join(re:split("\\s*)=(?>\\s*) # find > = iolist_to_binary(join(re:split("ZABCDEFG","((Z)+|A)*",[trim]))), +?line <<":A:Z:BCDEFG">> = iolist_to_binary(join(re:split("ZABCDEFG","((Z)+|A)*",[{parts, + 2}]))), +?line <<":A:Z:B:::C:::D:::E:::F:::G:::">> = iolist_to_binary(join(re:split("ZABCDEFG","((Z)+|A)*",[]))), +?line <<":A::B:::C:::D:::E:::F:::G">> = iolist_to_binary(join(re:split("ZABCDEFG","(Z()|A)*",[trim]))), +?line <<":A::BCDEFG">> = iolist_to_binary(join(re:split("ZABCDEFG","(Z()|A)*",[{parts, + 2}]))), +?line <<":A::B:::C:::D:::E:::F:::G:::">> = iolist_to_binary(join(re:split("ZABCDEFG","(Z()|A)*",[]))), +?line <<":A:::B::::C::::D::::E::::F::::G">> = iolist_to_binary(join(re:split("ZABCDEFG","(Z(())|A)*",[trim]))), +?line <<":A:::BCDEFG">> = iolist_to_binary(join(re:split("ZABCDEFG","(Z(())|A)*",[{parts, + 2}]))), +?line <<":A:::B::::C::::D::::E::::F::::G::::">> = iolist_to_binary(join(re:split("ZABCDEFG","(Z(())|A)*",[]))), +?line <<":A:B::C::D::E::F::G">> = iolist_to_binary(join(re:split("ZABCDEFG","((?>Z)+|A)*",[trim]))), +?line <<":A:BCDEFG">> = iolist_to_binary(join(re:split("ZABCDEFG","((?>Z)+|A)*",[{parts, + 2}]))), +?line <<":A:B::C::D::E::F::G::">> = iolist_to_binary(join(re:split("ZABCDEFG","((?>Z)+|A)*",[]))), +?line <<"Z::::B::C::D::E::F::G">> = iolist_to_binary(join(re:split("ZABCDEFG","((?>)+|A)*",[trim]))), +?line <<"Z::ABCDEFG">> = iolist_to_binary(join(re:split("ZABCDEFG","((?>)+|A)*",[{parts, + 2}]))), +?line <<"Z::::B::C::D::E::F::G::">> = iolist_to_binary(join(re:split("ZABCDEFG","((?>)+|A)*",[]))), +?line <<":b:b:b">> = iolist_to_binary(join(re:split("abbab","a*",[trim]))), +?line <<":bbab">> = iolist_to_binary(join(re:split("abbab","a*",[{parts, + 2}]))), +?line <<":b:b:b:">> = iolist_to_binary(join(re:split("abbab","a*",[]))), +?line <<":bcde">> = iolist_to_binary(join(re:split("abcde","^[a-\\d]",[trim]))), +?line <<":bcde">> = iolist_to_binary(join(re:split("abcde","^[a-\\d]",[{parts, + 2}]))), +?line <<":bcde">> = iolist_to_binary(join(re:split("abcde","^[a-\\d]",[]))), +?line <<":things">> = iolist_to_binary(join(re:split("-things","^[a-\\d]",[trim]))), +?line <<":things">> = iolist_to_binary(join(re:split("-things","^[a-\\d]",[{parts, + 2}]))), +?line <<":things">> = iolist_to_binary(join(re:split("-things","^[a-\\d]",[]))), +?line <<":digit">> = iolist_to_binary(join(re:split("0digit","^[a-\\d]",[trim]))), +?line <<":digit">> = iolist_to_binary(join(re:split("0digit","^[a-\\d]",[{parts, + 2}]))), +?line <<":digit">> = iolist_to_binary(join(re:split("0digit","^[a-\\d]",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[a-\\d]",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[a-\\d]",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[a-\\d]",[]))), +?line <<"bcdef">> = iolist_to_binary(join(re:split("bcdef","^[a-\\d]",[trim]))), +?line <<"bcdef">> = iolist_to_binary(join(re:split("bcdef","^[a-\\d]",[{parts, + 2}]))), +?line <<"bcdef">> = iolist_to_binary(join(re:split("bcdef","^[a-\\d]",[]))), +?line <<":bcde">> = iolist_to_binary(join(re:split("abcde","^[\\d-a]",[trim]))), +?line <<":bcde">> = iolist_to_binary(join(re:split("abcde","^[\\d-a]",[{parts, + 2}]))), +?line <<":bcde">> = iolist_to_binary(join(re:split("abcde","^[\\d-a]",[]))), +?line <<":things">> = iolist_to_binary(join(re:split("-things","^[\\d-a]",[trim]))), +?line <<":things">> = iolist_to_binary(join(re:split("-things","^[\\d-a]",[{parts, + 2}]))), +?line <<":things">> = iolist_to_binary(join(re:split("-things","^[\\d-a]",[]))), +?line <<":digit">> = iolist_to_binary(join(re:split("0digit","^[\\d-a]",[trim]))), +?line <<":digit">> = iolist_to_binary(join(re:split("0digit","^[\\d-a]",[{parts, + 2}]))), +?line <<":digit">> = iolist_to_binary(join(re:split("0digit","^[\\d-a]",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[\\d-a]",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[\\d-a]",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^[\\d-a]",[]))), +?line <<"bcdef">> = iolist_to_binary(join(re:split("bcdef","^[\\d-a]",[trim]))), +?line <<"bcdef">> = iolist_to_binary(join(re:split("bcdef","^[\\d-a]",[{parts, + 2}]))), +?line <<"bcdef">> = iolist_to_binary(join(re:split("bcdef","^[\\d-a]",[]))), +?line <<">:<">> = iolist_to_binary(join(re:split("> + <","[[:space:]]+",[trim]))), +?line <<">:<">> = iolist_to_binary(join(re:split("> + <","[[:space:]]+",[{parts,2}]))), +?line <<">:<">> = iolist_to_binary(join(re:split("> + <","[[:space:]]+",[]))), +?line <<">: + <">> = iolist_to_binary(join(re:split("> + <","[[:blank:]]+",[trim]))), +?line <<">: + <">> = iolist_to_binary(join(re:split("> + <","[[:blank:]]+",[{parts,2}]))), +?line <<">: + <">> = iolist_to_binary(join(re:split("> + <","[[:blank:]]+",[]))), +?line <<">: <">> = iolist_to_binary(join(re:split("> + <","[\\s]+",[trim]))), +?line <<">: <">> = iolist_to_binary(join(re:split("> + <","[\\s]+",[{parts,2}]))), +?line <<">: <">> = iolist_to_binary(join(re:split("> + <","[\\s]+",[]))), +?line <<">: <">> = iolist_to_binary(join(re:split("> + <","\\s+",[trim]))), +?line <<">: <">> = iolist_to_binary(join(re:split("> + <","\\s+",[{parts,2}]))), +?line <<">: <">> = iolist_to_binary(join(re:split("> + <","\\s+",[]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","a b",[extended, + trim]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","a b",[extended, + {parts, + 2}]))), +?line <<"ab">> = iolist_to_binary(join(re:split("ab","a b",[extended]))), +?line <<"a +:b">> = iolist_to_binary(join(re:split("a +xb","(?!\\A)x",[multiline,trim]))), +?line <<"a +:b">> = iolist_to_binary(join(re:split("a +xb","(?!\\A)x",[multiline,{parts,2}]))), +?line <<"a +:b">> = iolist_to_binary(join(re:split("a +xb","(?!\\A)x",[multiline]))), +?line <<"a +xb">> = iolist_to_binary(join(re:split("a +xb","(?!^)x",[multiline,trim]))), +?line <<"a +xb">> = iolist_to_binary(join(re:split("a +xb","(?!^)x",[multiline,{parts,2}]))), +?line <<"a +xb">> = iolist_to_binary(join(re:split("a +xb","(?!^)x",[multiline]))), +?line <<"">> = iolist_to_binary(join(re:split("abcabcabc","abc\\Qabc\\Eabc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abcabcabc","abc\\Qabc\\Eabc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abcabcabc","abc\\Qabc\\Eabc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc(*+|abc","abc\\Q(*+|\\Eabc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc(*+|abc","abc\\Q(*+|\\Eabc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc(*+|abc","abc\\Q(*+|\\Eabc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc abcabc"," abc\\Q abc\\Eabc",[extended, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc abcabc"," abc\\Q abc\\Eabc",[extended, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc abcabc"," abc\\Q abc\\Eabc",[extended]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers"," abc\\Q abc\\Eabc",[extended, + trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers"," abc\\Q abc\\Eabc",[extended, + {parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers"," abc\\Q abc\\Eabc",[extended]))), +?line <<"abcabcabc">> = iolist_to_binary(join(re:split("abcabcabc"," abc\\Q abc\\Eabc",[extended, + trim]))), +?line <<"abcabcabc">> = iolist_to_binary(join(re:split("abcabcabc"," abc\\Q abc\\Eabc",[extended, + {parts, + 2}]))), +?line <<"abcabcabc">> = iolist_to_binary(join(re:split("abcabcabc"," abc\\Q abc\\Eabc",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E",[extended,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E",[extended,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal",[extended,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal",[extended,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E #more comment + ",[extended,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E #more comment + ",[extended,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E #more comment + ",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E #more comment",[extended,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E #more comment",[extended,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc#not comment + literal","abc#comment + \\Q#not comment + literal\\E #more comment",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("abc\\$xyz","\\Qabc\\$xyz\\E",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc\\$xyz","\\Qabc\\$xyz\\E",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc\\$xyz","\\Qabc\\$xyz\\E",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc$xyz","\\Qabc\\E\\$\\Qxyz\\E",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc$xyz","\\Qabc\\E\\$\\Qxyz\\E",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc$xyz","\\Qabc\\E\\$\\Qxyz\\E",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","\\Aabc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","\\Aabc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","\\Aabc",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\Aabc",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\Aabc",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","\\Aabc",[]))), +?line <<"xyzabc">> = iolist_to_binary(join(re:split("xyzabc","\\Aabc",[trim]))), +?line <<"xyzabc">> = iolist_to_binary(join(re:split("xyzabc","\\Aabc",[{parts, + 2}]))), +?line <<"xyzabc">> = iolist_to_binary(join(re:split("xyzabc","\\Aabc",[]))), +?line <<":abc2xyzabc3">> = iolist_to_binary(join(re:split("abc1abc2xyzabc3","\\Aabc.",[trim]))), +?line <<":abc2xyzabc3">> = iolist_to_binary(join(re:split("abc1abc2xyzabc3","\\Aabc.",[{parts, + 2}]))), +?line <<":abc2xyzabc3">> = iolist_to_binary(join(re:split("abc1abc2xyzabc3","\\Aabc.",[]))), +?line <<"::xyz">> = iolist_to_binary(join(re:split("abc1abc2xyzabc3","abc.",[trim]))), +?line <<":abc2xyzabc3">> = iolist_to_binary(join(re:split("abc1abc2xyzabc3","abc.",[{parts, + 2}]))), +?line <<"::xyz:">> = iolist_to_binary(join(re:split("abc1abc2xyzabc3","abc.",[]))), +?line <<"X:Y">> = iolist_to_binary(join(re:split("XabcdY","a(?x: b c )d",[trim]))), +?line <<"X:Y">> = iolist_to_binary(join(re:split("XabcdY","a(?x: b c )d",[{parts, + 2}]))), +?line <<"X:Y">> = iolist_to_binary(join(re:split("XabcdY","a(?x: b c )d",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?x: b c )d",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?x: b c )d",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","a(?x: b c )d",[]))), +?line <<"Xa b c d Y">> = iolist_to_binary(join(re:split("Xa b c d Y","a(?x: b c )d",[trim]))), +?line <<"Xa b c d Y">> = iolist_to_binary(join(re:split("Xa b c d Y","a(?x: b c )d",[{parts, + 2}]))), +?line <<"Xa b c d Y">> = iolist_to_binary(join(re:split("Xa b c d Y","a(?x: b c )d",[]))), +?line <<"X:abc:Y">> = iolist_to_binary(join(re:split("XabcY","((?x)x y z | a b c)",[trim]))), +?line <<"X:abc:Y">> = iolist_to_binary(join(re:split("XabcY","((?x)x y z | a b c)",[{parts, + 2}]))), +?line <<"X:abc:Y">> = iolist_to_binary(join(re:split("XabcY","((?x)x y z | a b c)",[]))), +?line <<"A:xyz:B">> = iolist_to_binary(join(re:split("AxyzB","((?x)x y z | a b c)",[trim]))), +?line <<"A:xyz:B">> = iolist_to_binary(join(re:split("AxyzB","((?x)x y z | a b c)",[{parts, + 2}]))), +?line <<"A:xyz:B">> = iolist_to_binary(join(re:split("AxyzB","((?x)x y z | a b c)",[]))), +?line <<"X:Y">> = iolist_to_binary(join(re:split("XabCY","(?i)AB(?-i)C",[trim]))), +?line <<"X:Y">> = iolist_to_binary(join(re:split("XabCY","(?i)AB(?-i)C",[{parts, + 2}]))), +?line <<"X:Y">> = iolist_to_binary(join(re:split("XabCY","(?i)AB(?-i)C",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?i)AB(?-i)C",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?i)AB(?-i)C",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","(?i)AB(?-i)C",[]))), +?line <<"XabcY">> = iolist_to_binary(join(re:split("XabcY","(?i)AB(?-i)C",[trim]))), +?line <<"XabcY">> = iolist_to_binary(join(re:split("XabcY","(?i)AB(?-i)C",[{parts, + 2}]))), +?line <<"XabcY">> = iolist_to_binary(join(re:split("XabcY","(?i)AB(?-i)C",[]))), +?line <<":abC">> = iolist_to_binary(join(re:split("abCE","((?i)AB(?-i)C|D)E",[trim]))), +?line <<":abC:">> = iolist_to_binary(join(re:split("abCE","((?i)AB(?-i)C|D)E",[{parts, + 2}]))), +?line <<":abC:">> = iolist_to_binary(join(re:split("abCE","((?i)AB(?-i)C|D)E",[]))), +?line <<":D">> = iolist_to_binary(join(re:split("DE","((?i)AB(?-i)C|D)E",[trim]))), +?line <<":D:">> = iolist_to_binary(join(re:split("DE","((?i)AB(?-i)C|D)E",[{parts, + 2}]))), +?line <<":D:">> = iolist_to_binary(join(re:split("DE","((?i)AB(?-i)C|D)E",[]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?i)AB(?-i)C|D)E",[trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?i)AB(?-i)C|D)E",[{parts, + 2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","((?i)AB(?-i)C|D)E",[]))), +?line <<"abcE">> = iolist_to_binary(join(re:split("abcE","((?i)AB(?-i)C|D)E",[trim]))), +?line <<"abcE">> = iolist_to_binary(join(re:split("abcE","((?i)AB(?-i)C|D)E",[{parts, + 2}]))), +?line <<"abcE">> = iolist_to_binary(join(re:split("abcE","((?i)AB(?-i)C|D)E",[]))), +?line <<"abCe">> = iolist_to_binary(join(re:split("abCe","((?i)AB(?-i)C|D)E",[trim]))), +?line <<"abCe">> = iolist_to_binary(join(re:split("abCe","((?i)AB(?-i)C|D)E",[{parts, + 2}]))), +?line <<"abCe">> = iolist_to_binary(join(re:split("abCe","((?i)AB(?-i)C|D)E",[]))), +?line <<"dE">> = iolist_to_binary(join(re:split("dE","((?i)AB(?-i)C|D)E",[trim]))), +?line <<"dE">> = iolist_to_binary(join(re:split("dE","((?i)AB(?-i)C|D)E",[{parts, + 2}]))), +?line <<"dE">> = iolist_to_binary(join(re:split("dE","((?i)AB(?-i)C|D)E",[]))), +?line <<"De">> = iolist_to_binary(join(re:split("De","((?i)AB(?-i)C|D)E",[trim]))), +?line <<"De">> = iolist_to_binary(join(re:split("De","((?i)AB(?-i)C|D)E",[{parts, + 2}]))), +?line <<"De">> = iolist_to_binary(join(re:split("De","((?i)AB(?-i)C|D)E",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abc123abc","(.*)\\d+\\1",[trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc123abc","(.*)\\d+\\1",[{parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc123abc","(.*)\\d+\\1",[]))), +?line <<"a:bc">> = iolist_to_binary(join(re:split("abc123bc","(.*)\\d+\\1",[trim]))), +?line <<"a:bc:">> = iolist_to_binary(join(re:split("abc123bc","(.*)\\d+\\1",[{parts, + 2}]))), +?line <<"a:bc:">> = iolist_to_binary(join(re:split("abc123bc","(.*)\\d+\\1",[]))), +?line <<":abc">> = iolist_to_binary(join(re:split("abc123abc","(.*)\\d+\\1",[dotall, + trim]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc123abc","(.*)\\d+\\1",[dotall, + {parts, + 2}]))), +?line <<":abc:">> = iolist_to_binary(join(re:split("abc123abc","(.*)\\d+\\1",[dotall]))), +?line <<"a:bc">> = iolist_to_binary(join(re:split("abc123bc","(.*)\\d+\\1",[dotall, + trim]))), +?line <<"a:bc:">> = iolist_to_binary(join(re:split("abc123bc","(.*)\\d+\\1",[dotall, + {parts, + 2}]))), +?line <<"a:bc:">> = iolist_to_binary(join(re:split("abc123bc","(.*)\\d+\\1",[dotall]))), +?line <<":abc:abc">> = iolist_to_binary(join(re:split("abc123abc","((.*))\\d+\\1",[trim]))), +?line <<":abc:abc:">> = iolist_to_binary(join(re:split("abc123abc","((.*))\\d+\\1",[{parts, + 2}]))), +?line <<":abc:abc:">> = iolist_to_binary(join(re:split("abc123abc","((.*))\\d+\\1",[]))), +?line <<"a:bc:bc">> = iolist_to_binary(join(re:split("abc123bc","((.*))\\d+\\1",[trim]))), +?line <<"a:bc:bc:">> = iolist_to_binary(join(re:split("abc123bc","((.*))\\d+\\1",[{parts, + 2}]))), +?line <<"a:bc:bc:">> = iolist_to_binary(join(re:split("abc123bc","((.*))\\d+\\1",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a123::a123","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123::a123","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123::a123","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("a123:b342::abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123:b342::abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123:b342::abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("a123:b342::324e:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123:b342::324e:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123:b342::324e:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("a123:ddde:b342::324e:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123:ddde:b342::324e:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123:ddde:b342::324e:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("a123:ddde:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123:ddde:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123:ddde:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("a123:ddde:9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123:ddde:9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("a123:ddde:9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"*** Failers">> = iolist_to_binary(join(re:split("*** Failers","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"1:2:3:4:5:6:7:8">> = iolist_to_binary(join(re:split("1:2:3:4:5:6:7:8","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"1:2:3:4:5:6:7:8">> = iolist_to_binary(join(re:split("1:2:3:4:5:6:7:8","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"1:2:3:4:5:6:7:8">> = iolist_to_binary(join(re:split("1:2:3:4:5:6:7:8","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"a123:bce:ddde:9999:b342::324e:dcba:abcd">> = iolist_to_binary(join(re:split("a123:bce:ddde:9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"a123:bce:ddde:9999:b342::324e:dcba:abcd">> = iolist_to_binary(join(re:split("a123:bce:ddde:9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"a123:bce:ddde:9999:b342::324e:dcba:abcd">> = iolist_to_binary(join(re:split("a123:bce:ddde:9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"a123::9999:b342::324e:dcba:abcd">> = iolist_to_binary(join(re:split("a123::9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"a123::9999:b342::324e:dcba:abcd">> = iolist_to_binary(join(re:split("a123::9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"a123::9999:b342::324e:dcba:abcd">> = iolist_to_binary(join(re:split("a123::9999:b342::324e:dcba:abcd","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"abcde:2:3:4:5:6:7:8">> = iolist_to_binary(join(re:split("abcde:2:3:4:5:6:7:8","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"abcde:2:3:4:5:6:7:8">> = iolist_to_binary(join(re:split("abcde:2:3:4:5:6:7:8","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"abcde:2:3:4:5:6:7:8">> = iolist_to_binary(join(re:split("abcde:2:3:4:5:6:7:8","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"::1">> = iolist_to_binary(join(re:split("::1","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"::1">> = iolist_to_binary(join(re:split("::1","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"::1">> = iolist_to_binary(join(re:split("::1","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"abcd:fee0:123::">> = iolist_to_binary(join(re:split("abcd:fee0:123::","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"abcd:fee0:123::">> = iolist_to_binary(join(re:split("abcd:fee0:123::","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"abcd:fee0:123::">> = iolist_to_binary(join(re:split("abcd:fee0:123::","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<":1">> = iolist_to_binary(join(re:split(":1","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<":1">> = iolist_to_binary(join(re:split(":1","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<":1">> = iolist_to_binary(join(re:split(":1","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"1:">> = iolist_to_binary(join(re:split("1:","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,trim]))), +?line <<"1:">> = iolist_to_binary(join(re:split("1:","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless,{parts,2}]))), +?line <<"1:">> = iolist_to_binary(join(re:split("1:","^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + ",[extended,caseless]))), +?line <<"">> = iolist_to_binary(join(re:split("z","[z\\Qa-d]\\E]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("z","[z\\Qa-d]\\E]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("z","[z\\Qa-d]\\E]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","[z\\Qa-d]\\E]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","[z\\Qa-d]\\E]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","[z\\Qa-d]\\E]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("-","[z\\Qa-d]\\E]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("-","[z\\Qa-d]\\E]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("-","[z\\Qa-d]\\E]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("d","[z\\Qa-d]\\E]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("d","[z\\Qa-d]\\E]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("d","[z\\Qa-d]\\E]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("]","[z\\Qa-d]\\E]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("]","[z\\Qa-d]\\E]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("]","[z\\Qa-d]\\E]",[]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[z\\Qa-d]\\E]",[trim]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[z\\Qa-d]\\E]",[{parts, + 2}]))), +?line <<"*** F:ilers">> = iolist_to_binary(join(re:split("*** Failers","[z\\Qa-d]\\E]",[]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[z\\Qa-d]\\E]",[trim]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[z\\Qa-d]\\E]",[{parts, + 2}]))), +?line <<"b">> = iolist_to_binary(join(re:split("b","[z\\Qa-d]\\E]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("z","[\\z\\C]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("z","[\\z\\C]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("z","[\\z\\C]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("C","[\\z\\C]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("C","[\\z\\C]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("C","[\\z\\C]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("M","\\M",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("M","\\M",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("M","\\M",[]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(a+)*b",[trim]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(a+)*b",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(a+)*b",[]))), +?line <<"">> = iolist_to_binary(join(re:split("REGular","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("REGular","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("REGular","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("regulaer","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("regulaer","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("regulaer","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("Regex","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("Regex","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("Regex","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("regulär","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("regulär","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("regulär","(?i)reg(?:ul(?:[aä]|ae)r|ex)",[]))), +?line <<"">> = iolist_to_binary(join(re:split("Åæåäà","Åæåä[à-ÿÀ-ß]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("Åæåäà","Åæåä[à-ÿÀ-ß]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("Åæåäà","Åæåä[à-ÿÀ-ß]+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("Åæåäÿ","Åæåä[à-ÿÀ-ß]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("Åæåäÿ","Åæåä[à-ÿÀ-ß]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("Åæåäÿ","Åæåä[à-ÿÀ-ß]+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ÅæåäÀ","Åæåä[à-ÿÀ-ß]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ÅæåäÀ","Åæåä[à-ÿÀ-ß]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ÅæåäÀ","Åæåä[à-ÿÀ-ß]+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("Åæåäß","Åæåä[à-ÿÀ-ß]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("Åæåäß","Åæåä[à-ÿÀ-ß]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("Åæåäß","Åæåä[à-ÿÀ-ß]+",[]))), +?line <<"„XAZ">> = iolist_to_binary(join(re:split("„XAZXB","(?<=Z)X.",[trim]))), +?line <<"„XAZ:">> = iolist_to_binary(join(re:split("„XAZXB","(?<=Z)X.",[{parts, + 2}]))), +?line <<"„XAZ:">> = iolist_to_binary(join(re:split("„XAZXB","(?<=Z)X.",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab cd defg","ab cd (?x) de fg",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab cd defg","ab cd (?x) de fg",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab cd defg","ab cd (?x) de fg",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ab cddefg","ab cd(?x) de fg",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("ab cddefg","ab cd(?x) de fg",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("ab cddefg","ab cd(?x) de fg",[]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","ab cd(?x) de fg",[trim]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","ab cd(?x) de fg",[{parts, + 2}]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","ab cd(?x) de fg",[]))), +?line <<"abcddefg">> = iolist_to_binary(join(re:split("abcddefg","ab cd(?x) de fg",[trim]))), +?line <<"abcddefg">> = iolist_to_binary(join(re:split("abcddefg","ab cd(?x) de fg",[{parts, + 2}]))), +?line <<"abcddefg">> = iolist_to_binary(join(re:split("abcddefg","ab cd(?x) de fg",[]))), +?line <<"foo:bar:X">> = iolist_to_binary(join(re:split("foobarX","(?> = iolist_to_binary(join(re:split("foobarX","(?> = iolist_to_binary(join(re:split("foobarX","(?> = iolist_to_binary(join(re:split("** Failers","(?> = iolist_to_binary(join(re:split("** Failers","(?> = iolist_to_binary(join(re:split("** Failers","(?> = iolist_to_binary(join(re:split("boobarX","(?> = iolist_to_binary(join(re:split("boobarX","(?> = iolist_to_binary(join(re:split("boobarX","(?> = iolist_to_binary(join(re:split("offX","(?> = iolist_to_binary(join(re:split("offX","(?> = iolist_to_binary(join(re:split("offX","(?> = iolist_to_binary(join(re:split("** Failers","(?> = iolist_to_binary(join(re:split("** Failers","(?> = iolist_to_binary(join(re:split("** Failers","(?> = iolist_to_binary(join(re:split("onyX","(?> = iolist_to_binary(join(re:split("onyX","(?> = iolist_to_binary(join(re:split("onyX","(?> = iolist_to_binary(join(re:split("onyX","(?<=[^f])X",[trim]))), +?line <<"ony:">> = iolist_to_binary(join(re:split("onyX","(?<=[^f])X",[{parts, + 2}]))), +?line <<"ony:">> = iolist_to_binary(join(re:split("onyX","(?<=[^f])X",[]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","(?<=[^f])X",[trim]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","(?<=[^f])X",[{parts, + 2}]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","(?<=[^f])X",[]))), +?line <<"offX">> = iolist_to_binary(join(re:split("offX","(?<=[^f])X",[trim]))), +?line <<"offX">> = iolist_to_binary(join(re:split("offX","(?<=[^f])X",[{parts, + 2}]))), +?line <<"offX">> = iolist_to_binary(join(re:split("offX","(?<=[^f])X",[]))), +?line <<"a +:b +:c">> = iolist_to_binary(join(re:split("a +b +c","^",[multiline,trim]))), +?line <<"a +:b +c">> = iolist_to_binary(join(re:split("a +b +c","^",[multiline,{parts,2}]))), +?line <<"a +:b +:c">> = iolist_to_binary(join(re:split("a +b +c","^",[multiline]))), +?line <<"">> = iolist_to_binary(join(re:split("","^",[multiline, + trim]))), +?line <<"">> = iolist_to_binary(join(re:split("","^",[multiline, + {parts, + 2}]))), +?line <<"">> = iolist_to_binary(join(re:split("","^",[multiline]))), +?line <<"A +C +:C">> = iolist_to_binary(join(re:split("A +C +C","(?<=C\\n)^",[multiline,trim]))), +?line <<"A +C +:C">> = iolist_to_binary(join(re:split("A +C +C","(?<=C\\n)^",[multiline,{parts,2}]))), +?line <<"A +C +:C">> = iolist_to_binary(join(re:split("A +C +C","(?<=C\\n)^",[multiline]))), +?line <<":X">> = iolist_to_binary(join(re:split("bXaX","(?:(?(1)a|b)(X))+",[trim]))), +?line <<":X:">> = iolist_to_binary(join(re:split("bXaX","(?:(?(1)a|b)(X))+",[{parts, + 2}]))), +?line <<":X:">> = iolist_to_binary(join(re:split("bXaX","(?:(?(1)a|b)(X))+",[]))), +?line <<":Y">> = iolist_to_binary(join(re:split("bXXaYYaY","(?:(?(1)\\1a|b)(X|Y))+",[trim]))), +?line <<":Y:">> = iolist_to_binary(join(re:split("bXXaYYaY","(?:(?(1)\\1a|b)(X|Y))+",[{parts, + 2}]))), +?line <<":Y:">> = iolist_to_binary(join(re:split("bXXaYYaY","(?:(?(1)\\1a|b)(X|Y))+",[]))), +?line <<":X:YaXXaX">> = iolist_to_binary(join(re:split("bXYaXXaX","(?:(?(1)\\1a|b)(X|Y))+",[trim]))), +?line <<":X:YaXXaX">> = iolist_to_binary(join(re:split("bXYaXXaX","(?:(?(1)\\1a|b)(X|Y))+",[{parts, + 2}]))), +?line <<":X:YaXXaX">> = iolist_to_binary(join(re:split("bXYaXXaX","(?:(?(1)\\1a|b)(X|Y))+",[]))), +?line <<"::::::::::X:XaYYaY">> = iolist_to_binary(join(re:split("bXXaYYaY","()()()()()()()()()(?:(?(10)\\10a|b)(X|Y))+",[trim]))), +?line <<"::::::::::X:XaYYaY">> = iolist_to_binary(join(re:split("bXXaYYaY","()()()()()()()()()(?:(?(10)\\10a|b)(X|Y))+",[{parts, + 2}]))), +?line <<"::::::::::X:XaYYaY">> = iolist_to_binary(join(re:split("bXXaYYaY","()()()()()()()()()(?:(?(10)\\10a|b)(X|Y))+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc]","[[,abc,]+]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc]","[[,abc,]+]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc]","[[,abc,]+]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a,b]","[[,abc,]+]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a,b]","[[,abc,]+]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a,b]","[[,abc,]+]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("[a,b,c]","[[,abc,]+]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("[a,b,c]","[[,abc,]+]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("[a,b,c]","[[,abc,]+]",[]))), +?line <<"A:B">> = iolist_to_binary(join(re:split("A B","(?-x: )",[extended, + trim]))), +?line <<"A:B">> = iolist_to_binary(join(re:split("A B","(?-x: )",[extended, + {parts, + 2}]))), +?line <<"A:B">> = iolist_to_binary(join(re:split("A B","(?-x: )",[extended]))), +?line <<"A:B">> = iolist_to_binary(join(re:split("A # B","(?x)(?-x: \\s*#\\s*)",[trim]))), +?line <<"A:B">> = iolist_to_binary(join(re:split("A # B","(?x)(?-x: \\s*#\\s*)",[{parts, + 2}]))), +?line <<"A:B">> = iolist_to_binary(join(re:split("A # B","(?x)(?-x: \\s*#\\s*)",[]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","(?x)(?-x: \\s*#\\s*)",[trim]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","(?x)(?-x: \\s*#\\s*)",[{parts, + 2}]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","(?x)(?-x: \\s*#\\s*)",[]))), +?line <<"#">> = iolist_to_binary(join(re:split("#","(?x)(?-x: \\s*#\\s*)",[trim]))), +?line <<"#">> = iolist_to_binary(join(re:split("#","(?x)(?-x: \\s*#\\s*)",[{parts, + 2}]))), +?line <<"#">> = iolist_to_binary(join(re:split("#","(?x)(?-x: \\s*#\\s*)",[]))), +?line <<"A">> = iolist_to_binary(join(re:split("A #include","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[trim]))), +?line <<"A:">> = iolist_to_binary(join(re:split("A #include","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[{parts, + 2}]))), +?line <<"A:">> = iolist_to_binary(join(re:split("A #include","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[trim]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[{parts, + 2}]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[]))), +?line <<"A#include">> = iolist_to_binary(join(re:split("A#include","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[trim]))), +?line <<"A#include">> = iolist_to_binary(join(re:split("A#include","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[{parts, + 2}]))), +?line <<"A#include">> = iolist_to_binary(join(re:split("A#include","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[]))), +?line <<"A #Include">> = iolist_to_binary(join(re:split("A #Include","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[trim]))), +?line <<"A #Include">> = iolist_to_binary(join(re:split("A #Include","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[{parts, + 2}]))), +?line <<"A #Include">> = iolist_to_binary(join(re:split("A #Include","(?x-is)(?:(?-ixs) \\s*#\\s*) include",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabbbb","a*b*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabbbb","a*b*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabbbb","a*b*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaa","a*b*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","a*b*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","a*b*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","a*b*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabbbb","a*b?\\w",[trim]))), +?line <<":bb">> = iolist_to_binary(join(re:split("aaabbbb","a*b?\\w",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("aaabbbb","a*b?\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaa","a*b?\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","a*b?\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","a*b?\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","a*b?\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b?\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b?\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabbbb","a*b{0,4}\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabbbb","a*b{0,4}\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabbbb","a*b{0,4}\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaa","a*b{0,4}\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","a*b{0,4}\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","a*b{0,4}\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","a*b{0,4}\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b{0,4}\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b{0,4}\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaabbbb","a*b{0,}\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabbbb","a*b{0,}\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaabbbb","a*b{0,}\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaa","a*b{0,}\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","a*b{0,}\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","a*b{0,}\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","a*b{0,}\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b{0,}\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b{0,}\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("0a","a*\\d*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("0a","a*\\d*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("0a","a*\\d*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","a*\\d*\\w",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*\\d*\\w",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*\\d*\\w",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","a*b *\\w",[extended, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b *\\w",[extended, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b *\\w",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("a","a*b#comment + *\\w",[extended,trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b#comment + *\\w",[extended,{parts,2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a*b#comment + *\\w",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("a","a* b *\\w",[extended, + trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a* b *\\w",[extended, + {parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","a* b *\\w",[extended]))), +?line <<":: +pqr">> = iolist_to_binary(join(re:split("abc=xyz\\ +pqr","^\\w+=.*(\\\\\\n.*)*",[trim]))), +?line <<":: +pqr">> = iolist_to_binary(join(re:split("abc=xyz\\ +pqr","^\\w+=.*(\\\\\\n.*)*",[{parts,2}]))), +?line <<":: +pqr">> = iolist_to_binary(join(re:split("abc=xyz\\ +pqr","^\\w+=.*(\\\\\\n.*)*",[]))), +?line <<":abcd">> = iolist_to_binary(join(re:split("abcd:","(?=(\\w+))\\1:",[trim]))), +?line <<":abcd:">> = iolist_to_binary(join(re:split("abcd:","(?=(\\w+))\\1:",[{parts, + 2}]))), +?line <<":abcd:">> = iolist_to_binary(join(re:split("abcd:","(?=(\\w+))\\1:",[]))), +?line <<":abcd">> = iolist_to_binary(join(re:split("abcd:","^(?=(\\w+))\\1:",[trim]))), +?line <<":abcd:">> = iolist_to_binary(join(re:split("abcd:","^(?=(\\w+))\\1:",[{parts, + 2}]))), +?line <<":abcd:">> = iolist_to_binary(join(re:split("abcd:","^(?=(\\w+))\\1:",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","^\\Eabc",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","^\\Eabc",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("abc","^\\Eabc",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","^[\\Eabc]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^[\\Eabc]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^[\\Eabc]",[]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[\\Eabc]",[trim]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[\\Eabc]",[{parts, + 2}]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[\\Eabc]",[]))), +?line <<"E">> = iolist_to_binary(join(re:split("E","^[\\Eabc]",[trim]))), +?line <<"E">> = iolist_to_binary(join(re:split("E","^[\\Eabc]",[{parts, + 2}]))), +?line <<"E">> = iolist_to_binary(join(re:split("E","^[\\Eabc]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","^[a-\\Ec]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("b","^[a-\\Ec]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("b","^[a-\\Ec]",[]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[a-\\Ec]",[trim]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[a-\\Ec]",[{parts, + 2}]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[a-\\Ec]",[]))), +?line <<"-">> = iolist_to_binary(join(re:split("-","^[a-\\Ec]",[trim]))), +?line <<"-">> = iolist_to_binary(join(re:split("-","^[a-\\Ec]",[{parts, + 2}]))), +?line <<"-">> = iolist_to_binary(join(re:split("-","^[a-\\Ec]",[]))), +?line <<"E">> = iolist_to_binary(join(re:split("E","^[a-\\Ec]",[trim]))), +?line <<"E">> = iolist_to_binary(join(re:split("E","^[a-\\Ec]",[{parts, + 2}]))), +?line <<"E">> = iolist_to_binary(join(re:split("E","^[a-\\Ec]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","^[a\\E\\E-\\Ec]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("b","^[a\\E\\E-\\Ec]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("b","^[a\\E\\E-\\Ec]",[]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[a\\E\\E-\\Ec]",[trim]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[a\\E\\E-\\Ec]",[{parts, + 2}]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[a\\E\\E-\\Ec]",[]))), +?line <<"-">> = iolist_to_binary(join(re:split("-","^[a\\E\\E-\\Ec]",[trim]))), +?line <<"-">> = iolist_to_binary(join(re:split("-","^[a\\E\\E-\\Ec]",[{parts, + 2}]))), +?line <<"-">> = iolist_to_binary(join(re:split("-","^[a\\E\\E-\\Ec]",[]))), +?line <<"E">> = iolist_to_binary(join(re:split("E","^[a\\E\\E-\\Ec]",[trim]))), +?line <<"E">> = iolist_to_binary(join(re:split("E","^[a\\E\\E-\\Ec]",[{parts, + 2}]))), +?line <<"E">> = iolist_to_binary(join(re:split("E","^[a\\E\\E-\\Ec]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("b","^[\\E\\Qa\\E-\\Qz\\E]+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("b","^[\\E\\Qa\\E-\\Qz\\E]+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("b","^[\\E\\Qa\\E-\\Qz\\E]+",[]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[\\E\\Qa\\E-\\Qz\\E]+",[trim]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[\\E\\Qa\\E-\\Qz\\E]+",[{parts, + 2}]))), +?line <<"** Failers">> = iolist_to_binary(join(re:split("** Failers","^[\\E\\Qa\\E-\\Qz\\E]+",[]))), +?line <<"-">> = iolist_to_binary(join(re:split("-","^[\\E\\Qa\\E-\\Qz\\E]+",[trim]))), +?line <<"-">> = iolist_to_binary(join(re:split("-","^[\\E\\Qa\\E-\\Qz\\E]+",[{parts, + 2}]))), +?line <<"-">> = iolist_to_binary(join(re:split("-","^[\\E\\Qa\\E-\\Qz\\E]+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","^[a\\Q]bc\\E]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^[a\\Q]bc\\E]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^[a\\Q]bc\\E]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("]","^[a\\Q]bc\\E]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("]","^[a\\Q]bc\\E]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("]","^[a\\Q]bc\\E]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("c","^[a\\Q]bc\\E]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("c","^[a\\Q]bc\\E]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("c","^[a\\Q]bc\\E]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","^[a-\\Q\\E]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^[a-\\Q\\E]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","^[a-\\Q\\E]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("-","^[a-\\Q\\E]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("-","^[a-\\Q\\E]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("-","^[a-\\Q\\E]",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaa","^(a()*)*",[trim]))), +?line <<":a::">> = iolist_to_binary(join(re:split("aaaa","^(a()*)*",[{parts, + 2}]))), +?line <<":a::">> = iolist_to_binary(join(re:split("aaaa","^(a()*)*",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaa","^(?:a(?:(?:))*)*",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","^(?:a(?:(?:))*)*",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","^(?:a(?:(?:))*)*",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("aaaa","^(a()+)+",[trim]))), +?line <<":a::">> = iolist_to_binary(join(re:split("aaaa","^(a()+)+",[{parts, + 2}]))), +?line <<":a::">> = iolist_to_binary(join(re:split("aaaa","^(a()+)+",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaa","^(?:a(?:(?:))+)+",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","^(?:a(?:(?:))+)+",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaa","^(?:a(?:(?:))+)+",[]))), +?line <<":a">> = iolist_to_binary(join(re:split("abbD","(a){0,3}(?(1)b|(c|))*D",[trim]))), +?line <<":a::">> = iolist_to_binary(join(re:split("abbD","(a){0,3}(?(1)b|(c|))*D",[{parts, + 2}]))), +?line <<":a::">> = iolist_to_binary(join(re:split("abbD","(a){0,3}(?(1)b|(c|))*D",[]))), +?line <<"">> = iolist_to_binary(join(re:split("ccccD","(a){0,3}(?(1)b|(c|))*D",[trim]))), +?line <<":::">> = iolist_to_binary(join(re:split("ccccD","(a){0,3}(?(1)b|(c|))*D",[{parts, + 2}]))), +?line <<":::">> = iolist_to_binary(join(re:split("ccccD","(a){0,3}(?(1)b|(c|))*D",[]))), +?line <<"">> = iolist_to_binary(join(re:split("D","(a){0,3}(?(1)b|(c|))*D",[trim]))), +?line <<":::">> = iolist_to_binary(join(re:split("D","(a){0,3}(?(1)b|(c|))*D",[{parts, + 2}]))), +?line <<":::">> = iolist_to_binary(join(re:split("D","(a){0,3}(?(1)b|(c|))*D",[]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(a|)*\\d",[trim]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(a|)*\\d",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(a|)*\\d",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(a|)*\\d",[trim]))), +?line <<"::">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(a|)*\\d",[{parts, + 2}]))), +?line <<"::">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(a|)*\\d",[]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(?>a|)*\\d",[trim]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(?>a|)*\\d",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(?>a|)*\\d",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(?>a|)*\\d",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(?>a|)*\\d",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(?>a|)*\\d",[]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(?:a|)*\\d",[trim]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(?:a|)*\\d",[{parts, + 2}]))), +?line <<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","(?:a|)*\\d",[]))), +?line <<"">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(?:a|)*\\d",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(?:a|)*\\d",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4","(?:a|)*\\d",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","\\Z",[trim]))), +?line <<"abc:">> = iolist_to_binary(join(re:split("abc","\\Z",[{parts, + 2}]))), +?line <<"abc:">> = iolist_to_binary(join(re:split("abc","\\Z",[]))), +?line <<"">> = iolist_to_binary(join(re:split("abc","^(?s)(?>.*)(?> = iolist_to_binary(join(re:split("abc","^(?s)(?>.*)(?> = iolist_to_binary(join(re:split("abc","^(?s)(?>.*)(?> = iolist_to_binary(join(re:split("abc","^(?s)(?>.*)(?> = iolist_to_binary(join(re:split("abc","^(?s)(?>.*)(?> = iolist_to_binary(join(re:split("abc","^(?s)(?>.*)(?> = iolist_to_binary(join(re:split("abc","^(?![^\\n]*\\n\\z)",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(?![^\\n]*\\n\\z)",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(?![^\\n]*\\n\\z)",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(?![^\\n]*\\n\\z)",[trim]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(?![^\\n]*\\n\\z)",[{parts, + 2}]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","^(?![^\\n]*\\n\\z)",[]))), +?line <<"abc">> = iolist_to_binary(join(re:split("abc","\\z(?> = iolist_to_binary(join(re:split("abc","\\z(?> = iolist_to_binary(join(re:split("abc","\\z(?> = iolist_to_binary(join(re:split("abc","\\z(?> = iolist_to_binary(join(re:split("abc","\\z(?> = iolist_to_binary(join(re:split("abc","\\z(?> = iolist_to_binary(join(re:split("abcd","(.*(.)?)*",[trim]))), +?line <<":::">> = iolist_to_binary(join(re:split("abcd","(.*(.)?)*",[{parts, + 2}]))), +?line <<":::">> = iolist_to_binary(join(re:split("abcd","(.*(.)?)*",[]))), +?line <<"a:::b:::c:::d">> = iolist_to_binary(join(re:split("abcd","( (A | (?(1)0|) )* )",[extended, + trim]))), +?line <<"a:::bcd">> = iolist_to_binary(join(re:split("abcd","( (A | (?(1)0|) )* )",[extended, + {parts, + 2}]))), +?line <<"a:::b:::c:::d:::">> = iolist_to_binary(join(re:split("abcd","( (A | (?(1)0|) )* )",[extended]))), +?line <<"a:::b:::c:::d">> = iolist_to_binary(join(re:split("abcd","( ( (?(1)0|) )* )",[extended, + trim]))), +?line <<"a:::bcd">> = iolist_to_binary(join(re:split("abcd","( ( (?(1)0|) )* )",[extended, + {parts, + 2}]))), +?line <<"a:::b:::c:::d:::">> = iolist_to_binary(join(re:split("abcd","( ( (?(1)0|) )* )",[extended]))), +?line <<"a::b::c::d">> = iolist_to_binary(join(re:split("abcd","( (?(1)0|)* )",[extended, + trim]))), +?line <<"a::bcd">> = iolist_to_binary(join(re:split("abcd","( (?(1)0|)* )",[extended, + {parts, + 2}]))), +?line <<"a::b::c::d::">> = iolist_to_binary(join(re:split("abcd","( (?(1)0|)* )",[extended]))), +?line <<"">> = iolist_to_binary(join(re:split("a]","[[:abcd:xyz]]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a]","[[:abcd:xyz]]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a]","[[:abcd:xyz]]",[]))), +?line <<"">> = iolist_to_binary(join(re:split(":]","[[:abcd:xyz]]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split(":]","[[:abcd:xyz]]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split(":]","[[:abcd:xyz]]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("a","[abc[:x\\]pqr]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("a","[abc[:x\\]pqr]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("a","[abc[:x\\]pqr]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("[","[abc[:x\\]pqr]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("[","[abc[:x\\]pqr]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("[","[abc[:x\\]pqr]",[]))), +?line <<"">> = iolist_to_binary(join(re:split(":","[abc[:x\\]pqr]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split(":","[abc[:x\\]pqr]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split(":","[abc[:x\\]pqr]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("]","[abc[:x\\]pqr]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("]","[abc[:x\\]pqr]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("]","[abc[:x\\]pqr]",[]))), +?line <<"">> = iolist_to_binary(join(re:split("p","[abc[:x\\]pqr]",[trim]))), +?line <<":">> = iolist_to_binary(join(re:split("p","[abc[:x\\]pqr]",[{parts, + 2}]))), +?line <<":">> = iolist_to_binary(join(re:split("p","[abc[:x\\]pqr]",[]))), +ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/run_pcre_tests.erl erlang-13.b.3-dfsg/lib/stdlib/test/run_pcre_tests.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/run_pcre_tests.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/run_pcre_tests.erl 2009-11-20 13:32:40.000000000 +0000 @@ -0,0 +1,1201 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(run_pcre_tests). + +-compile(export_all). + +test(RootDir) -> + put(verbose,false), + erts_debug:set_internal_state(available_internal_state,true), + io:format("oldlimit: ~p~n",[ erts_debug:set_internal_state(re_loop_limit,10)]), + Testfiles0 = ["testoutput1", "testoutput2", "testoutput3", "testoutput4", + "testoutput5", "testoutput6", "testoutput10"], + Testfiles = [ filename:join([RootDir,FN]) || FN <- Testfiles0 ], + Res = [ begin io:format("~s~n",[X]), t(X) end || X <- Testfiles ], + io:format("limit was: ~p~n",[ erts_debug:set_internal_state(re_loop_limit,default)]), + Res2 = Res ++ [ begin io:format("~s~n",[X]), t(X) end || X <- Testfiles ], + erts_debug:set_internal_state(available_internal_state,false), + put(verbose,true), + Res2. +t(OneFile) -> + t(OneFile,infinite). +t(OneFile,Num) -> + {ok,Bin} = file:read_file(OneFile), + Lines = splitfile(0,Bin,1), + Structured = stru(Lines), + put(error_limit,Num), + put(skipped,0), + Res = + [test(Structured,true,index), + test(Structured,false,index), + test(Structured,true,binary), + test(Structured,false,binary), + test(Structured,true,list), + test(Structured,false,list)], + {lists:sum(Res),length(Structured)*6,get(skipped)}. + + +pick_exec_options([{exec_option,Opt}|T]) -> + {O,E} = pick_exec_options(T), + {O,[Opt|E]}; +pick_exec_options([unicode|T]) -> + {O,E} = pick_exec_options(T), + {[unicode|O],[unicode|E]}; +pick_exec_options([Opt|T]) -> + {O,E} = pick_exec_options(T), + {[Opt|O],E}; +pick_exec_options([]) -> + {[],[]}. + +test([],_,_) -> + 0; +test([{RE,Line,Options0,Tests}|T],PreCompile,XMode) -> + %io:format("."), + %case RE of <<>> -> io:format("Empty re:~w~n",[Line]); _ -> ok end, + {Options,ExecOptions} = pick_exec_options(Options0), + {Cres, Xopt} = case PreCompile of + true -> + {re:compile(RE,Options),[]}; + _ -> + {{ok,RE},Options} + end, + case Cres of + {ok,P} -> + %erlang:display({testrun,RE,P,Tests,ExecOptions,Xopt,XMode}), + case (catch testrun(RE,P,Tests,ExecOptions,Xopt,XMode)) of + N when is_integer(N) -> + N + test(T,PreCompile,XMode); + limit -> + io:format("Error limit reached.~n"), + 1; + skip -> + case get(skipped) of + N when is_integer(N) -> + put(skipped,N+1); + _ -> + put(skipped,1) + end, + test(T,PreCompile,XMode) + end; + {error,Err} -> + io:format("Compile error(~w): ~w~n",[Line,Err]), + case get(error_limit) of + infinite -> 1 + test(T,PreCompile,XMode); + X -> + case X-1 of + Y when Y =< 0 -> + io:format("Error limit reached.~n"), + 1; + Y -> + put(error_limit,Y), + 1 + test(T,PreCompile,XMode) + end + end + end. + +loopexec(_,_,X,Y,_,_) when X > Y -> + {match,[]}; +loopexec(P,Chal,X,Y,Unicode,Xopt) -> + %io:format("~p~n",[X]), + case re:run(Chal,P,[{offset,X}]++Xopt) of + nomatch -> + %io:format(" re:exec(~p,~p,[{offset,~p}]) -> ~p~n", + % [P,Chal,X,no]), + {match,[]}; + %loopexec(P,Chal,X+1,Y); + {match,[{A,B}|More]} -> + %io:format(" re:exec(~p,~p,[{offset,~p}]) -> ~p~n", + % [P,Chal,X,{match,[{A,B}|More]}]), + {match,Rest} = + case B>0 of + true -> + loopexec(P,Chal,A+B,Y,Unicode,Xopt); + false -> + {match,M} = case re:run(Chal,P,[{offset,X},notempty,anchored]++Xopt) of + nomatch -> + {match,[]}; + {match,Other} -> + {match,fixup(Chal,Other,0)} + end, + NewA = forward(Chal,A,1,Unicode), + {match,MM} = loopexec(P,Chal,NewA,Y,Unicode,Xopt), + {match,M ++ MM} + end, + {match,fixup(Chal,[{A,B}|More],0)++Rest} + end. + +forward(_Chal,A,0,_) -> + A; +forward(_Chal,A,N,false) -> + A+N; +forward(Chal,A,N,true) -> + <<_:A/binary,Tl/binary>> = Chal, + Forw = case Tl of + <<1:1,1:1,0:1,_:5,_/binary>> -> + 2; + <<1:1,1:1,1:1,0:1,_:4,_/binary>> -> + 3; + <<1:1,1:1,1:1,1:1,0:1,_:3,_/binary>> -> + 4; + _ -> + 1 + end, + %io:format("Forward ~p~n",[Forw]), + forward(Chal,A+Forw,N-1,true). + +contains_eightbit(<<>>) -> + false; +contains_eightbit(<>) when X >= 128 -> + true; +contains_eightbit(<<_,R/binary>>) -> + contains_eightbit(R). + +clean_duplicates([],_) -> + []; +clean_duplicates([{X,Y}|T],L) -> + case lists:keymember(X,1,L) of + true -> + clean_duplicates(T,L); + false -> + [{X,Y}|clean_duplicates(T,L)] + end; +clean_duplicates([bsr_anycrlf|T],L) -> + case (lists:member(bsr_anycrlf,L) orelse lists:member(bsr_unicode,L)) of + true -> + clean_duplicates(T,L); + false -> + [bsr_anycrlf|clean_duplicates(T,L)] + end; +clean_duplicates([bsr_unicode|T],L) -> + case (lists:member(bsr_anycrlf,L) orelse lists:member(bsr_unicode,L)) of + true -> + clean_duplicates(T,L); + false -> + [bsr_unicode|clean_duplicates(T,L)] + end; +clean_duplicates([X|T],L) -> + case lists:member(X,L) of + true -> + clean_duplicates(T,L); + false -> + [X|clean_duplicates(T,L)] + end. + + +global_fixup(_,nomatch) -> + nomatch; +global_fixup(P,{match,M}) -> + {match,lists:flatten(global_fixup2(P,M))}. + +global_fixup2(_,[]) -> + []; +global_fixup2(P,[H|T]) -> + [gfixup_one(P,0,H)|global_fixup2(P,T)]. + +gfixup_one(_,_,[]) -> + []; +gfixup_one(P,I,[{Start,Len}|T]) -> + <<_:Start/binary,R:Len/binary,_/binary>> = P, + [{I,R}|gfixup_one(P,I+1,T)]. + + +press([]) -> + []; +press([H|T]) -> + H++press(T). + +testrun(_,_,[],_,_,_) -> + 0; +testrun(RE,P,[{Chal,Line,ExecOpt,Responses}|T],EO,Xopt0,XMode) -> + Xopt = clean_duplicates(Xopt0,ExecOpt), + + case lists:keymember(newline,1,Xopt) of + true -> + info("skipping inconsistent newlines " + "when compiling and running in one go (~p)~n", + [Line]), + throw(skip); + false -> + ok + end, + + Res = + case lists:member(g,EO) of + true -> + case XMode of + binary -> + case re:run(Chal,P,ExecOpt++Xopt++ + [global,{capture,all,binary}]) of + nomatch -> + nomatch; + {match, Reslist} -> + {match,press([bfix(R)|| R <- Reslist])} + end; + list -> + case re:run(Chal,P,ExecOpt++Xopt++ + [global,{capture,all,list}]) of + nomatch -> + nomatch; + {match, Reslist} -> + UFix = lists:member(unicode,EO), + {match,press([bfix([if UFix =:= true -> list_to_utf8(L); true -> list_to_binary(L) end || L <- R]) || R <- Reslist])} + end; + index -> + case re:run(Chal,P,ExecOpt++Xopt++[global]) of + nomatch -> + nomatch; + {match, Reslist} -> + {match,press([fixup(Chal,R,0) || R <- Reslist])} + end + end; + false -> + case EO -- [accept_nonascii] of + EO -> + case contains_eightbit(Chal) of + true -> + info("skipping 8bit without LANG (~p)~n", + [Line]), + throw(skip); + false -> + ok + end, + + case XMode of + binary -> + case re:run(Chal,P,ExecOpt++Xopt++ + [{capture,all,binary}]) of + nomatch -> + nomatch; + {match, Reslist} -> + {match,bfix(Reslist)} + end; + list -> + case re:run(Chal,P,ExecOpt++Xopt++ + [{capture,all,list}]) of + nomatch -> + nomatch; + {match, Reslist} -> + UFix = lists:member(unicode,EO), + {match,bfix([if + UFix =:= true -> list_to_utf8(L); + true -> list_to_binary(L) + end || L <- Reslist])} + end; + index -> + case re:run(Chal,P,ExecOpt++Xopt) of + nomatch -> + nomatch; + {match, Reslist} -> + {match,fixup(Chal,Reslist,0)} + end + end; + _LesserOpt -> + case XMode of + binary -> + case re:run(Chal,P,ExecOpt++Xopt++ + [{capture,all,binary}]) of + nomatch -> + nomatch; + {match, Reslist} -> + {match,bfix(Reslist)} + end; + list -> + case re:run(Chal,P,ExecOpt++Xopt++ + [{capture,all,list}]) of + nomatch -> + nomatch; + {match, Reslist} -> + %io:format("re:run(~w,~w,~w) -> ~w~n",[Chal,P,ExecOpt++Xopt++ + % [{capture,all,list}],Reslist]), + UFix = lists:member(unicode,EO), + {match,bfix([if + UFix =:= true -> list_to_utf8(L); + true -> list_to_binary(L) + end || L <- Reslist])} + end; + index -> + case re:run(Chal,P,ExecOpt++Xopt) of + nomatch -> + nomatch; + {match, Reslist} -> + {match,fixup(Chal,Reslist,0)} + end + end + end + end, + case compare_sloppy(Res,Responses) of + true -> + testrun(RE,P,T,EO,Xopt0,XMode); + false -> + io:format("FAIL(~w): re = ~p, ~nmatched against = ~p(~w), ~nwith options = ~p. ~nexpected = ~p, ~ngot = ~p~n", + [Line,RE,Chal,binary_to_list(Chal),{ExecOpt,EO,Xopt},Responses,Res]), + case get(error_limit) of + infinite -> ok; + X -> + case X-1 of + Y when Y =< 0 -> + throw(limit); + Y -> + put(error_limit,Y) + end + end, + 1 + end. +compare_sloppy({A,L1},{A,L2}) -> + compare_sloppy(L1,L2); +compare_sloppy(A,A) -> + true; +compare_sloppy([{X,Y}|T1],[{X,Y}|T2]) -> + compare_sloppy(T1,T2); +compare_sloppy([{X,[Y,_]}|T1],[{X,Y}|T2]) -> + compare_sloppy(T1,T2); +compare_sloppy([{X,[_,Y]}|T1],[{X,Y}|T2]) -> + compare_sloppy(T1,T2); +compare_sloppy(_,_) -> + false. + +bfix(RL) -> + bfix(RL,0). +bfix([],_) -> + []; +bfix([<<>>|T],N) -> + [{N,[<<>>,<<"">>]}|bfix(T,N+1)]; % indeterminable +bfix([H|T],N) -> + [{N,H}|bfix(T,N+1)]. + +fixup(List,Any,Any2) when is_list(List)-> + fixup(unicode:characters_to_binary(List,unicode,unicode),Any,Any2); +fixup(_,[],_) -> + []; +fixup(Bin,[{-1,0}|T],N) -> + [{N,<<"">>}|fixup(Bin,T,N+1)]; +fixup(Bin,[{X,Y}|T],N) -> + <<_:X/binary,Res:Y/binary,_/binary>> = Bin, + [{N,Res}|fixup(Bin,T,N+1)]. + +splitfile(N,Bin,_Line) when N >= size(Bin) -> + []; +splitfile(N,Bin,Line) -> + {Res,NewN} = pickline(N,N,Bin), + case emptyline(Res) of + true -> + [{Line,<<>>}|splitfile(NewN,Bin,Line+1)]; + false -> + [{Line,Res}|splitfile(NewN,Bin,Line+1)] + end. + +emptyline(<<>>) -> + true; +emptyline(<<$ ,R/binary>>) -> + emptyline(R); +emptyline(_) -> + false. +pickline(Start,Stop,Bin) when Stop >= size(Bin) -> + Len = Stop - Start - 1, + <<_:Start/binary,Res:Len/binary,_/binary>> = Bin, + {Res,Stop}; + +pickline(Start,Stop,Bin) -> + %erlang:display({Start,Stop,size(Bin)}), + <<_:Stop/binary,Ch,_/binary>> = Bin, + case Ch of + $\n -> + Len = Stop - Start, + <<_:Start/binary,Res:Len/binary,_/binary>> = Bin, + {Res,Stop+1}; + _ -> + pickline(Start,Stop+1,Bin) + end. + +skip_until_empty([]) -> + []; +skip_until_empty([{_,<<>>}|T]) -> + T; +skip_until_empty([{_,_}|T]) -> + skip_until_empty(T). + +skip_debug([{_,<<$-,_/binary>>}|Con]) -> + Con; +skip_debug([_|T]) -> + skip_debug(T); +skip_debug([]) -> + []. + +skip_extra_info([{_,<<$ ,$ ,$ ,_/binary>>}=H|Con]) -> + [H|Con]; +skip_extra_info([{_,<<>>}|Con]) -> + Con; +skip_extra_info([_|T]) -> + skip_extra_info(T); +skip_extra_info([]) -> + []. + +stru([]) -> + []; +stru([{_,<<>>}|T]) -> + stru(T); +stru([{Line,<>}|T0]) -> + {T,Re} = find_rest_re(Ch,[{Line,Re0}|T0]), + %io:format("DBG: ~p~n",[Re]), + {NewRe,<< Ch, Options/binary >>} = end_of_re(Ch,Re), + case interpret_options_x(backstrip(frontstrip(Options)),NewRe) of + {Olist,<<>>} -> + case T of + [{_,<<$-,_/binary>>}|Con] -> + %Debug output, we skip those + %io:format("Skipping debug (~w)~n",[Line]), + TmpT = skip_debug(Con), + {NewT,Matches} = stru2(TmpT), + [{NewRe,Line,Olist,Matches}|stru(NewT)]; + [{_,<<$C,$a,$p,$t,$u,$r,$i,$n,$g,_/binary>>}|_] -> + NewT0 = skip_extra_info(T), + {NewT,Matches} = stru2(NewT0), + [{NewRe,Line,Olist,Matches}|stru(NewT)]; + [{_,<>}|_] when Bla =/= $ -> + %io:format("Skipping blabla (~w)~n",[Line]), + NewT = skip_until_empty(T), + stru(NewT); + _ -> + {NewT,Matches} = stru2(T), + %erlang:display({NewRe,Line,Olist,Matches}), + Matches1 = case lists:member(unicode,Olist) of + true -> + Matches ++ + [ {unicode:characters_to_list(E1,unicode),E2,E3,E4} || + {E1,E2,E3,E4} <- Matches]; + false -> + Matches + end, + %erlang:display({NewRe,Line,Olist,Matches1}), + [{NewRe,Line,Olist,Matches1}|stru(NewT)] + end; + {_,Rest} -> +%% case T of +%% [{_,<>}|_] when Bla =/= $ -> +%% io:format("Skipping blabla (~w)~n",[Line]); +%% _ -> +%% ok +%% end, + NewT = skip_until_empty(T), + %{NewT,_Matches} = stru2(T), + info("Skipping options ~s for now (~w)~n",[binary_to_list(Rest),Line]), + case NewT of + [{Li,_}|_] -> + info("Skip to line ~p~n",[Li]); + _ -> + ok + end, + stru(NewT) + end. + +contains_lang_sens(<<>>) -> + false; +contains_lang_sens(<<$\\,$W,_/binary>>) -> + true; +contains_lang_sens(<<$\\,$w,_/binary>>) -> + true; +contains_lang_sens(<<$\\,$b,_/binary>>) -> + true; +contains_lang_sens(<<_,R/binary>>) -> + contains_lang_sens(R). + + +interpret_options_x(Options,RE) -> + {O,R} = interpret_options(Options), + case (contains_lang_sens(RE) or lists:member(caseless,O)) of + false -> + {[{exec_option,accept_nonascii}|O],R}; + true -> + case lists:member(unicode,O) of + true -> + {[{exec_option,accept_nonascii}|O],R}; + false -> + {O,R} + end + end. +tr_option($i) -> + [caseless]; +tr_option($I) -> + []; +tr_option($B) -> + []; +tr_option($Z) -> + []; +tr_option($x) -> + [extended]; +tr_option($s) -> + [dotall]; +tr_option($m) -> + [multiline]; +tr_option($J) -> + [dupnames]; +tr_option($N) -> + [no_auto_capture]; +tr_option($8) -> + [unicode]; +tr_option($g) -> + [{exec_option,g}]; +tr_option(_) -> + false. + +interpret_options(<<$<,Rest0/binary>>) -> + {Option,Rest} = pinch_cr(Rest0), + {Olist,NRest} = interpret_options(Rest), + {[Option | Olist], NRest}; +interpret_options(<<$L,$f,$r,$_,$F,$R,Rest/binary>>) -> + info("Accepting (and ignoring) french locale~n",[]), + {Olist,NRest} = interpret_options(Rest), + {[{exec_option, accept_nonascii}|Olist],NRest}; +interpret_options(<>) -> + {Olist,NRest} = interpret_options(Rest), + case tr_option(Ch) of + false -> + {Olist,<>}; + Option -> + {Option ++ Olist, NRest} + end; +interpret_options(<<>>) -> + {[],<<>>}. + +find_unsupported([{not_supported,X}|T]) -> + [X | find_unsupported(T)]; +find_unsupported([_|T]) -> + find_unsupported(T); +find_unsupported([]) -> + []. + +backslash_end(<<>>) -> + false; +backslash_end(<<$\\>>) -> + true; +backslash_end(<<_>>) -> + false; +backslash_end(<<_,R/binary>>) -> + backslash_end(R). + +%stru2([<<$ ,$ ,$ ,$ , $*,$*,$*,$ ,_/binary>> | T]) -> +% stru2(T); +stru2([{Line,<<$ ,Rest/binary>>} | T]) -> + % A challenge + case (catch responses(T)) of + {NewT,Rlist} -> + {NewNewT,StrList} = stru2(NewT), + %% Hack... + FS = case backstrip(frontstrip(Rest)) of + <<"\\">> -> + %% Single backslash is to be considered + %% an empty line in challenge + <<>>; + OFS -> + case backslash_end(OFS) of + true -> + <>; + _ -> + OFS + end + end, + {ExecOpts,NFS} = escape(FS), + case find_unsupported(ExecOpts) of + [] -> + {NewNewT,[{NFS,Line,ExecOpts, + case + Rlist of nomatch -> nomatch; + RR -> {match,RR} + end} | StrList]}; + UList -> + info("WARNING(~w): the exec-option(s) ~p are unsupported, skipping challenge.~n",[Line,UList]), + {NewNewT,StrList} + end; + fail -> + NewT = skip_until_empty(T), + {NewT,[]} + end; + +stru2(X) -> + {X,[]}. +%responses([<< $ ,$ ,$ ,$ ,$*,$*,$*,$ ,_/binary>>|T]) -> +% responses(T); +responses([{_Line,<< X:2/binary,$:,$ ,Resp/binary>>}|T]) -> + {NT,R2} = responses(T), + NX=list_to_integer(binary_to_list(frontstrip(X))), + {NT,[{NX,escape2(Resp)} | R2]}; +responses([{_Line,<< X:3/binary,$:,$ ,Resp/binary>>}|T]) -> + {NT,R2} = responses(T), + NX=list_to_integer(binary_to_list(frontstrip(X))), + {NT,[{NX,escape2(Resp)} | R2]}; +responses([{_Line,<<$N,$o,$ ,$m,$a,$t,$c,$h,_/binary>>}|T]) -> + {T,nomatch}; +responses([{Line,<<$ ,No,Ch,_/binary>>}|T]) when No >= $0, No =< $9, Ch >= $A, Ch =< $Z -> + info("Skipping strange debug response at line ~p~n",[Line]), + responses(T); +responses([{Line,<<$ ,$ ,Ch,_/binary>>}|T]) when Ch =:= $G; Ch =:= $C -> + info("Skipping stranger debug response at line ~p~n",[Line]), + responses(T); +responses([{Line,<>=X}|_]) when C =/= $ -> + info("Offending response line(~w)! ~p~n",[Line,X]), + throw(fail); +responses(X) -> + {X,[]}. + + +end_of_re(_,<<>>) -> + {<<>>,<<>>}; +end_of_re(C,<> = R) -> + {<<>>,R}; +end_of_re(C,<<$\\,C,Rest/binary>>) -> + {Sub,Rest2} = end_of_re(C,Rest), + {<>,Rest2}; +end_of_re(C,<>) -> + {Sub,Rest2} = end_of_re(C,Rest), + {<>,Rest2}. + +frontstrip(<<>>) -> + <<>>; +frontstrip(<< $ ,Rest/binary>>) -> + frontstrip(Rest); +frontstrip(Bin) -> + Bin. + +backstrip(<<>>) -> + <<>>; +backstrip(<<$ >>) -> + <<>>; +backstrip(<>) -> + case backstrip(Rest) of + Rest -> + <>; + Other -> + NRest = backstrip(Other), + <> + end. + +find_rest_re(_,[]) -> + {<<>>,<<>>}; +find_rest_re(Ch,[{_,H}|T]) -> + case end_of_re(Ch,H) of + {_,<<>>} -> + {NewT,Rest} = find_rest_re(Ch,T), + {NewT,<>}; + {_,_} -> + {T,H} + end. + +eopt($A) -> + [anchored]; +eopt($B) -> + [notbol]; +eopt(X) -> + [{not_supported,X}]. + +pinch_cr(<<$c,$r,$>,Rest/binary>>) -> + {{newline,cr},Rest}; +pinch_cr(<<$l,$f,$>,Rest/binary>>) -> + {{newline,lf},Rest}; +pinch_cr(<<$c,$r,$l,$f,$>,Rest/binary>>) -> + {{newline,crlf},Rest}; +pinch_cr(<<$C,$R,$>,Rest/binary>>) -> + {{newline,cr},Rest}; +pinch_cr(<<$L,$F,$>,Rest/binary>>) -> + {{newline,lf},Rest}; +pinch_cr(<<$C,$R,$L,$F,$>,Rest/binary>>) -> + {{newline,crlf},Rest}; +pinch_cr(<<$a,$n,$y,$c,$r,$l,$f,$>,Rest/binary>>) -> + {{newline,anycrlf},Rest}; +pinch_cr(<<$b,$s,$r,$_,$a,$n,$y,$c,$r,$l,$f,$>,Rest/binary>>) -> + {bsr_anycrlf,Rest}; +pinch_cr(<<$b,$s,$r,$_,$u,$n,$i,$c,$o,$d,$e,$>,Rest/binary>>) -> + {bsr_unicode,Rest}; +pinch_cr(<<$a,$n,$y,$>,Rest/binary>>) -> + {{newline,any},Rest}; +pinch_cr(<<$A,$N,$Y,$>,Rest/binary>>) -> + {{newline,any},Rest}; +pinch_cr(Other) -> + case splitby($>,Other,<<>>) of + {Unk,Rest} -> + {{not_supported,{newline,Unk}},Rest}; + no -> + {{not_supported,$<},Other} + end. + +splitby(_,<<>>,_) -> + no; +splitby(Ch,<>,Acc) -> + {Acc,Rest}; +splitby(Ch,<>,Acc) -> + splitby(Ch,Rest,<>). + + +escape(<<>>) -> + {[],<<>>}; +escape(<<$\\, Ch, Rest/binary>>) when Ch >= $A, Ch =< $Z; Ch =:= $? -> + %Options in the string... + NewOpts = eopt(Ch), + {MoreOpts,Tail} = escape(Rest), + {NewOpts ++ MoreOpts,Tail}; +escape(<<$\\, $<, Rest/binary>>) -> + %CR Options in the string... + {NewOpt,NewRest} = pinch_cr(Rest), + {MoreOpts,Tail} = escape(NewRest), + {[NewOpt|MoreOpts],Tail}; +escape(<<$\\, Ch, Rest/binary>>) -> + {C,NR} = case single_esc(Ch) of + no -> + case multi_esc(<>) of + {CharBin,NewRest} -> + {CharBin,NewRest}; + no -> + {<<$\\>>,<>} + end; + CCC -> + %erlang:display({escape,CCC}), + {<>,Rest} + end, + {MoreOpts,Tail} = escape(NR), + {MoreOpts,<>}; +%escape(<<$\\,Rest/binary>>) -> +% escape(<>); +escape(<>) -> + {X,RR} = escape(<>), + {X,<>}; +escape(Any) -> + {[],Any}. +escape2(<<>>) -> + <<>>; +escape2(<<$\\, Ch, Rest/binary>>) -> + {C,NR} = case multi_esc(<>) of + {CharBin,NewRest} -> + {CharBin,NewRest}; + no -> + {<<$\\>>,<>} + end, + Tail = escape2(NR), + <>; +escape2(<>) -> + RR = escape2(<>), + <>; +escape2(Any) -> + Any. + + +trx(N) when ((N >= $0) and (N =< $9)) -> + N - $0; +trx($A) -> 10; +trx($B) -> 11; +trx($C) -> 12; +trx($D) -> 13; +trx($E) -> 14; +trx($F) -> 15; +trx($a) -> 10; +trx($b) -> 11; +trx($c) -> 12; +trx($d) -> 13; +trx($e) -> 14; +trx($f) -> 15. + + +int_to_utf8(I) when I =< 16#7F -> + <>; +int_to_utf8(I) when I =< 16#7FF -> + B2 = I band 16#3f, + B1 = (I bsr 6) band 16#1f, + <<1:1,1:1,0:1,B1:5,1:1,0:1,B2:6>>; +int_to_utf8(I) when I =< 16#FFFF -> + B3 = I band 16#3f, + B2 = (I bsr 6) band 16#3f, + B1 = (I bsr 12) band 16#f, + <<1:1,1:1,1:1,0:1,B1:4,1:1,0:1,B2:6,1:1,0:1,B3:6>>; +int_to_utf8(I) when I =< 16#10FFFF -> + B4 = I band 16#3f, + B3 = (I bsr 6) band 16#3f, + B2 = (I bsr 12) band 16#3f, + B1 = (I bsr 18) band 16#7, + <<1:1,1:1,1:1,1:1,0:1,B1:3,1:1,0:1,B2:6,1:1,0:1,B3:6,1:1,0:1,B4:6>>; +int_to_utf8(_) -> + exit(unsupported_utf8). + +list_to_utf8(L) when is_list(L); is_binary(L) -> + iolist_to_binary([int_to_utf8(I) || I <- L]); +list_to_utf8({Tag,_,_}) when Tag =:= incomplete ; Tag =:= error -> + throw(skip). + +multi_esc(<>) + when M >= $0, M =< $7, N >= $0, N =< $7, O >= $0, O =< $7 -> + Cha = ((M - $0) bsl 6) bor ((N - $0) bsl 3) bor (O - $0), + {<>,Rest}; +multi_esc(<>) + when N >= $0, N =< $7, O >= $0, O =< $7 -> + Cha = ((N - $0) bsl 3) bor (O - $0), + {<>,Rest}; +multi_esc(<>) + when O >= $0, O =< $7 -> + Cha = (O - $0), + {<>,Rest}; + + +multi_esc(<<$x,${,N,O,$},Rest/binary>>) + when ((((N >= $0) and (N =< $9)) or ((N >= $A) and (N =< $F)) or + ((N >= $a) and (N =< $f))) and + (((O >= $0) and (O =< $9)) or ((O >= $A) and (O =< $F)) or + ((O >= $a) and (O =< $f)))) -> + Cha = (trx(N) bsl 4) bor trx(O), + {int_to_utf8(Cha),Rest}; +multi_esc(<<$x,${,N,O,P,$},Rest/binary>>) + when ((((N >= $0) and (N =< $9)) or ((N >= $A) and (N =< $F)) or + ((N >= $a) and (N =< $f))) and + (((O >= $0) and (O =< $9)) or ((O >= $A) and (O =< $F)) or + ((O >= $a) and (O =< $f)))and + (((P >= $0) and (P =< $9)) or ((P >= $A) and (P =< $F)) or + ((P >= $a) and (P =< $f)))) -> + Cha = (trx(N) bsl 8) bor (trx(O) bsl 4) bor trx(P), + {int_to_utf8(Cha),Rest}; +multi_esc(<<$x,${,N,O,P,Q,$},Rest/binary>>) + when ((((N >= $0) and (N =< $9)) or ((N >= $A) and (N =< $F)) or + ((N >= $a) and (N =< $f))) and + (((O >= $0) and (O =< $9)) or ((O >= $A) and (O =< $F)) or + ((O >= $a) and (O =< $f))) and + (((P >= $0) and (P =< $9)) or ((P >= $A) and (P =< $F)) or + ((P >= $a) and (P =< $f))) and + (((Q >= $0) and (Q =< $9)) or ((Q >= $A) and (Q =< $F)) or + ((Q >= $a) and (Q =< $f)))) -> + Cha = (trx(N) bsl 12) bor (trx(O) bsl 8) bor (trx(P) bsl 4) bor trx(Q), + {int_to_utf8(Cha),Rest}; +multi_esc(<<$x,${,N,O,P,Q,R,$},Rest/binary>>) + when ((((N >= $0) and (N =< $9)) or ((N >= $A) and (N =< $F)) or + ((N >= $a) and (N =< $f))) and + (((O >= $0) and (O =< $9)) or ((O >= $A) and (O =< $F)) or + ((O >= $a) and (O =< $f))) and + (((P >= $0) and (P =< $9)) or ((P >= $A) and (P =< $F)) or + ((P >= $a) and (P =< $f))) and + (((Q >= $0) and (Q =< $9)) or ((Q >= $A) and (Q =< $F)) or + ((Q >= $a) and (Q =< $f))) and + (((R >= $0) and (R =< $9)) or ((R >= $A) and (R =< $F)) or + ((R >= $a) and (R =< $f)))) -> + Cha = (trx(N) bsl 16) bor (trx(O) bsl 12) bor (trx(P) bsl 8) bor (trx(Q) bsl 4) bor trx(R), + {int_to_utf8(Cha),Rest}; +multi_esc(<<$x,${,N,O,P,Q,R,S,$},Rest/binary>>) + when ((((N >= $0) and (N =< $9)) or ((N >= $A) and (N =< $F)) or + ((N >= $a) and (N =< $f))) and + (((O >= $0) and (O =< $9)) or ((O >= $A) and (O =< $F)) or + ((O >= $a) and (O =< $f))) and + (((P >= $0) and (P =< $9)) or ((P >= $A) and (P =< $F)) or + ((P >= $a) and (P =< $f))) and + (((Q >= $0) and (Q =< $9)) or ((Q >= $A) and (Q =< $F)) or + ((Q >= $a) and (Q =< $f))) and + (((R >= $0) and (R =< $9)) or ((R >= $A) and (R =< $F)) or + ((R >= $a) and (R =< $f))) and + (((S >= $0) and (S =< $9)) or ((S >= $A) and (S =< $F)) or + ((S >= $a) and (S =< $f)))) -> + Cha = (trx(N) bsl 20) bor (trx(O) bsl 16) bor (trx(P) bsl 12) bor (trx(Q) bsl 8) bor (trx(R) bsl 4) bor trx(S), + {int_to_utf8(Cha),Rest}; +multi_esc(<<$x,N,O,Rest/binary>>) + when ((((N >= $0) and (N =< $9)) or ((N >= $A) and (N =< $F)) or + ((N >= $a) and (N =< $f))) and + (((O >= $0) and (O =< $9)) or ((O >= $A) and (O =< $F)) or + ((O >= $a) and (O =< $f)))) -> + Cha = (trx(N) bsl 4) bor trx(O), + {<>,Rest}; +multi_esc(<<$x,N,Rest/binary>>) + when (((N >= $0) and (N =< $9)) or ((N >= $A) and (N =< $F)) or + ((N >= $a) and (N =< $f))) -> + Cha = trx(N), + {<>,Rest}; +multi_esc(_) -> + no. + +single_esc($") -> + $"; +single_esc($ ) -> + $ ; +single_esc($') -> + $'; +single_esc($@) -> + $@; +single_esc($t) -> + $\t; +single_esc($n) -> + $\n; +single_esc($r) -> + $\r; +single_esc($f) -> + $\f; +single_esc($e) -> + $\e; +single_esc($b) -> + $\b; +single_esc($$) -> + $$; +single_esc($\\) -> + $\\; +single_esc($a) -> + 7; +%single_esc(Ch) when Ch >= $A, Ch =< $Z -> % eh? +% Ch; + +single_esc(_) -> + no. + +info(Str,Lst) -> + case get(verbose) of + true -> + io:format(Str,Lst); + _ -> + ok + end. + + +%% Generate split tests from indatafile, +%% you will need perl on the machine +gen_split_test(OneFile) -> + {ok,Bin} = file:read_file(OneFile), + Lines = splitfile(0,Bin,1), + Structured = stru(Lines), + PerlShellScript = OneFile++"_split_test_gen.sh", + dumpsplit(Structured,PerlShellScript), + PerlShellScript, + ErlModule = "re_"++filename:basename(OneFile)++"_split_test", + ErlFileName = ErlModule++".erl", + {ok,F}= file:open(ErlFileName,[write]), + io:format(F,"-module(~s).~n",[ErlModule]), + io:format(F,"-compile(export_all).~n",[]), + io:format(F,"-include(\"test_server.hrl\").~n",[]), + %io:format(F,"-define(line,erlang:display(?LINE),).~n",[]), + io:format(F,"%% This file is generated by running ~w:gen_split_test(~p)~n", + [?MODULE,OneFile]), + io:format(F,"join([]) -> [];~n",[]), + io:format(F,"join([A]) -> [A];~n",[]), + io:format(F,"join([H|T]) -> [H,<<\":\">>|join(T)].~n",[]), + io:format(F,"run() ->~n",[]), + file:close(F), + os:cmd("sh "++ PerlShellScript++" 2>/dev/null >> "++ErlFileName), + {ok,F2}= file:open(ErlFileName,[append]), + io:format(F2,"ok.~n",[]), + file:close(F2), + io:format("~s~n",[os:cmd("wc -l "++ErlFileName)]), + ok. + +dumpsplit(S,Fname) -> + {ok,F}= file:open(Fname,[write]), + dodumpsplit(F,S), + file:close(F). + +dodumpsplit(_,[]) -> + ok; +dodumpsplit(F,[H|T]) -> + dumponesplit(F,H), + dodumpsplit(F,T). + +dumponesplit(F,{RE,_,O,TS}) -> + [begin + {NO,_} = pick_exec_options(O++Op), + SSS = opt_to_string(NO), + io:format(F,"perl -e '$x = join(\":\",split(/~s/~s,\"~s\")); " + "$x =~~ s/\\\\/\\\\\\\\/g; $x =~~ s/\\\"/\\\\\"/g; " + "print \"?line <<\\\"$x\\\">> = " + "iolist_to_binary(join(re:split(\\\"~s\\\"," + "\\\"~s\\\",~p))), \\n\";'~n", + [zsafe(safe(RE)), + SSS, + ysafe(safe(Str)), + dsafe(safe(Str)), + dsafe2(safe(RE)), + NO++[trim]]), + io:format(F,"perl -e '$x = join(\":\",split(/~s/~s,\"~s\",2)); " + "$x =~~ s/\\\\/\\\\\\\\/g; $x =~~ s/\\\"/\\\\\"/g; " + "print \"?line <<\\\"$x\\\">> = " + "iolist_to_binary(join(re:split(\\\"~s\\\"," + "\\\"~s\\\",~p))), \\n\";'~n", + [zsafe(safe(RE)), + SSS, + ysafe(safe(Str)), + dsafe(safe(Str)), + dsafe2(safe(RE)), + NO++[{parts,2}]]), + io:format(F,"perl -e '$x = join(\":\",split(/~s/~s,\"~s\",-1)); " + "$x =~~ s/\\\\/\\\\\\\\/g; $x =~~ s/\\\"/\\\\\"/g; " + "print \"?line <<\\\"$x\\\">> = " + "iolist_to_binary(join(re:split(\\\"~s\\\"," + "\\\"~s\\\",~p))), \\n\";'~n", + [zsafe(safe(RE)), + SSS, + ysafe(safe(Str)), + dsafe(safe(Str)), + dsafe2(safe(RE)), + NO]) + end || + {Str,_,Op,_} <- TS]. + +%% Generate replacement tests from indatafile, +%% you will need perl on the machine +gen_repl_test(OneFile) -> + random:seed(1219,687731,62804), + {ok,Bin} = file:read_file(OneFile), + Lines = splitfile(0,Bin,1), + Structured = stru(Lines), + PerlShellScript = OneFile++"_replacement_test_gen.sh", + dump(Structured,PerlShellScript), + ErlModule = "re_"++filename:basename(OneFile)++"_replacement_test", + ErlFileName = ErlModule++".erl", + {ok,F}= file:open(ErlFileName,[write]), + io:format(F,"-module(~s).~n",[ErlModule]), + io:format(F,"-compile(export_all).~n",[]), + io:format(F,"-include(\"test_server.hrl\").~n",[]), + io:format(F,"%% This file is generated by running ~w:gen_repl_test(~p)~n", + [?MODULE,OneFile]), + io:format(F,"run() ->~n",[]), + file:close(F), + os:cmd("sh "++ PerlShellScript++" 2>/dev/null >> "++ErlFileName), + {ok,F2}= file:open(ErlFileName,[append]), + io:format(F2,"ok.~n",[]), + file:close(F2), + io:format("~s~n",[os:cmd("wc -l "++ErlFileName)]), + ok. +dump(S,Fname) -> + {ok,F}= file:open(Fname,[write]), + dodump(F,S), + file:close(F). + +dodump(_,[]) -> + ok; +dodump(F,[H|T]) -> + dumpone(F,H), + dodump(F,T). + +dumpone(F,{RE,_,O,TS}) -> + [begin + {NO,_} = pick_exec_options(O++Op), + SSS = opt_to_string(NO), + RS = ranstring(), + io:format(F,"perl -e '$x = \"~s\"; $x =~~ s/~s/~s/~s; $x =~~ s/\\\\/\\\\\\\\/g; $x =~~ s/\\\"/\\\\\"/g; print \"?line <<\\\"$x\\\">> = iolist_to_binary(re:replace(\\\"~s\\\",\\\"~s\\\",\\\"~s\\\",~p)), \\n\";'~n",[ysafe(safe(Str)),zsafe(safe(RE)),perlify(binary_to_list(RS)),SSS,dsafe(safe(Str)),dsafe(safe(RE)),xsafe(RS),NO]), + io:format(F,"perl -e '$x = \"~s\"; $x =~~ s/~s/~s/g~s; $x =~~ s/\\\\/\\\\\\\\/g; $x =~~ s/\\\"/\\\\\"/g; print \"?line <<\\\"$x\\\">> = iolist_to_binary(re:replace(\\\"~s\\\",\\\"~s\\\",\\\"~s\\\",~p)), \\n\";'~n",[ysafe(safe(Str)),zsafe(safe(RE)),perlify(binary_to_list(RS)),SSS,dsafe(safe(Str)),dsafe(safe(RE)),xsafe(RS),NO++[global]]) + end || + {Str,_,Op,_} <- TS]. + +dsafe2([]) -> + []; +dsafe2([$\',$\",$\',$\",$\'|T]) -> + [$\',$\",$\',$\",$\' |dsafe2(T)]; +dsafe2([$\"|T]) -> + [$\\,$\\,$\\,$\" |dsafe2(T)]; +dsafe2([$\\, $G|T]) -> + [$\\,$\\,$\\,$\\,$A |dsafe2(T)]; +dsafe2([$\\|T]) -> + [$\\,$\\,$\\,$\\ |dsafe2(T)]; +dsafe2([$$|T]) -> + [$\\,$$|dsafe2(T)]; +dsafe2([H|T]) -> + [H|dsafe2(T)]. + +dsafe([]) -> + []; +dsafe([$\',$\",$\',$\",$\'|T]) -> + [$\',$\",$\',$\",$\' |dsafe(T)]; +dsafe([$\"|T]) -> + [$\\,$\\,$\\,$\" |dsafe(T)]; +dsafe([$\\|T]) -> + [$\\,$\\,$\\,$\\ |dsafe(T)]; +dsafe([$$|T]) -> + [$\\,$$|dsafe(T)]; +dsafe([H|T]) -> + [H|dsafe(T)]. + +xsafe(<<>>) -> + []; +xsafe(<<$\\,R/binary>>) -> + [$\\,$\\,$\\,$\\ | xsafe(R)]; +xsafe(<>) -> + [X|xsafe(R)]. + +zsafe([]) -> + []; +zsafe([$$, $b|T]) -> + [$\\,$$, $b | zsafe(T)]; +zsafe([X|R]) -> + [X|zsafe(R)]. + +ysafe([]) -> + []; +ysafe([$\',$\",$\',$\",$\'|T]) -> + [$\',$\",$\',$\",$\' |ysafe(T)]; +ysafe([$\"|T]) -> + [$\\,$\" |ysafe(T)]; +ysafe([$\\|T]) -> + [$\\,$\\ |ysafe(T)]; +ysafe([$$|T]) -> + [$\\,$$|ysafe(T)]; +ysafe([H|T]) -> + [H|ysafe(T)]. + +safe(<<>>) -> + []; +safe(<<$\n>>) -> %chomp + []; +safe(<<$\',R/binary>>) -> + [$\',$\",$\',$\",$\' | safe(R)]; +safe(<>) -> + [X|safe(R)]. +perlify([$\\,N|Rest]) when N >= $0, N =< $9 -> + [$$,N|perlify(Rest)]; +perlify([$& | Rest]) -> + [$$,$& | perlify(Rest)]; +perlify([H|T]) -> + [H|perlify(T)]; +perlify([]) -> + []. + +opt_to_string([]) -> + []; +opt_to_string([A|T]) -> + case btr(A) of + false -> + opt_to_string(T); + Ch -> + [Ch | opt_to_string(T)] + end. + +btr(caseless) -> + $i; +btr(extended) -> + $x; +btr(dotall) -> + $s; +btr(multiline) -> + $m; +btr(dupnames) -> + $J; +btr(no_auto_capture) -> + $N; +btr(unicode) -> + $8; +btr(_) -> + false. + + +ranchar() -> + case random:uniform(10) of + 9 -> $&; + 10 -> <<"\\1">>; + N when N < 5 -> + random:uniform($Z-$A)+$A-1; + M when M < 9 -> + random:uniform($z-$a)+$a-1 + end. + +ranstring() -> + iolist_to_binary([ranchar() || _ <- lists:duplicate(random:uniform(20),0) ]). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/select_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/select_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/select_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/select_SUITE.erl 2009-11-20 13:31:05.000000000 +0000 @@ -0,0 +1,804 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(select_SUITE). +-author('pan@erix.ericsson.se'). + +-export([test/0]). + +%% +%% Define to run outside of test server +%% +%%-define(STANDALONE,1). + +%% +%% Define for debug output +%% +%%-define(debug,1). + +-ifdef(STANDALONE). +-define(config(A,B),config(A,B)). +-export([config/2]). +-define(fmt(A,B),io:format(A,B)). +-else. +-include("test_server.hrl"). +-define(fmt(A,B),test_server:format(A,B)). +-endif. + +-ifdef(debug). +-ifdef(STANDALONE). +-define(line, erlang:display({?MODULE,?LINE}), ). +-endif. +-define(dbgformat(A,B),io:format(A,B)). +-else. +-ifdef(STANDALONE). +-define(line, noop, ). +-endif. +-define(dbgformat(A,B),noop). +-endif. + +-ifdef(STANDALONE). +config(priv_dir,_) -> + ".". +-else. +%% When run in test server. +-export([all/1,select_test/1,init_per_testcase/2, fin_per_testcase/2, + return_values/1]). + +init_per_testcase(_Case, Config) when is_list(Config) -> + ?line Dog=test_server:timetrap(test_server:seconds(1200)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(doc) -> + ["Test ets:select"]; +all(suite) -> + [return_values, select_test]. + +select_test(suite) -> + []; +select_test(doc) -> + ["Tests select in numerous ways"]; +select_test(Config) when list(Config) -> + do_test(Config). + +return_values(suite) -> + []; +return_values(doc) -> + ["Tests return values in specific situations for select/3 and select/1"]; +return_values(Config) when list(Config) -> + do_return_values(). + +-endif. + + +table_factor({dets,_}) -> + 1; +table_factor({ets,_}) -> + 100. + +gen_dets_filename(Config,N) -> + filename:join(?config(priv_dir,Config), + "testdets_" ++ integer_to_list(N) ++ ".dets"). + +create_tables(Config) -> + Hash = ets:new(xxx, []), + Tree = ets:new(yyy, [ordered_set]), + Bag = ets:new(yyy, [bag]), + DBag = ets:new(yyy, [duplicate_bag]), + F1 = gen_dets_filename(Config,1), + (catch file:delete(F1)), + {ok,DetsPlain} = dets:open_file(testdets_1, + [{file, F1}]), + F3 = gen_dets_filename(Config,3), + (catch file:delete(F3)), + {ok,DetsBag} = dets:open_file(testdets_3, + [{file, F3},{type, bag}]), + F4 = gen_dets_filename(Config,4), + (catch file:delete(F4)), + {ok,DetsDBag} = dets:open_file(testdets_4, + [{file, F4},{type, duplicate_bag}]), + [{ets,Hash}, {ets,Tree}, {ets,Bag}, {ets,DBag}, + {dets, DetsPlain}, {dets, DetsBag}, {dets, DetsDBag}]. + + +gen_key(N,list) -> + [N,N+1,N+2]; +gen_key(N,tuple) -> + {N,N+1,N+2}; +gen_key(N,complex) -> + {[N,N+1],N+2}. + +gen_fun(N) -> + fun() -> + N + end. + +gen_bin(N) -> + list_to_binary(integer_to_list(N)). + +gen_object(N,Type) -> + L = integer_to_list(N), + A = list_to_atom("a" ++ L), + {gen_key(N,Type), L, A, gen_fun(N), gen_bin(N)}. +gen_object1(N,Type) -> + L = integer_to_list(N), + A = list_to_atom("a" ++ L), + {gen_key(N,Type), A, L, gen_fun(N), gen_bin(N)}. + +fill_table(_,0,_) -> + ok; +fill_table({Mod,Tab},N,Type) -> + Obj1 = gen_object1(N,Type), + Obj = gen_object(N,Type), + Mod:insert(Tab, Obj1), + case Mod:info(Tab,type) of + bag -> + Mod:insert(Tab, Obj); + duplicate_bag -> + Mod:insert(Tab, Obj), + Mod:insert(Tab, Obj1); + _ -> + ok + end, + fill_table({Mod,Tab},N-1,Type). + +table_size(Tab) -> + 15 *table_factor(Tab). + +build_tables(Config,Type) -> + L = create_tables(Config), + ?dbgformat("Tables: ~p~n",[L]), + lists:foreach(fun(TD) -> + fill_table(TD,table_size(TD),Type) + end, + L), + L. + +destroy_tables([]) -> + ok; +destroy_tables([{ets,Tab}|T]) -> + ets:delete(Tab), + destroy_tables(T); +destroy_tables([{dets,Tab}|T]) -> + dets:close(Tab), + destroy_tables(T). + + +init_random(Config) -> + WriteDir = ReadDir = ?config(priv_dir,Config), + (catch file:make_dir(WriteDir)), + Seed = case file:consult(filename:join([ReadDir, + "preset_random_seed2.txt"])) of + {ok,[X]} -> + X; + _ -> + {A,B,C} = erlang:now(), + random:seed(A,B,C), + get(random_seed) + end, + put(random_seed,Seed), + {ok, F} = file:open(filename:join([WriteDir, "last_random_seed2.txt"]), + [write]), + io:format(F,"~p. ~n",[Seed]), + file:close(F), + ok. + +create_random_key(N,Type) -> + gen_key(random:uniform(N),Type). + +create_pb_key(N,list) -> + X = random:uniform(N), + case random:uniform(4) of + 3 -> {[X, X+1, '_'], fun([Z,Z1,P1]) -> + [Z,Z1,P1] =:= [X,X+1,P1] end}; + 2 -> {[X, '_', '_'], fun([Z,P1,P2]) -> [Z,P1,P2] =:= [X,P1,P2] end}; + 1 -> {[X, X+1, '$1'], fun([Z,Z1,P1]) -> + [Z,Z1,P1] =:= [X,X+1,P1] end}; + _ -> {[X, '$1', '$2'], fun([Z,P1,P2]) -> [Z,P1,P2] =:= [X,P1,P2] end} + end; +create_pb_key(N, tuple) -> + X = random:uniform(N), + case random:uniform(2) of + 1 -> {{X, X+1, '$1'},fun({Z,Z1,P1}) -> {Z,Z1,P1} =:= {X,X+1,P1} end}; + _ -> {{X, '$1', '$2'},fun({Z,P1,P2}) -> {Z,P1,P2} =:= {X,P1,P2} end} + end; +create_pb_key(N, complex) -> + X = random:uniform(N), + case random:uniform(2) of + 1 -> {{[X, X+1], '$1'}, fun({[Z,Z1],P1}) -> + {[Z,Z1],P1} =:= {[X,X+1],P1} end}; + _ -> {{[X, '$1'], '$2'},fun({[Z,P1],P2}) -> + {[Z,P1],P2} =:= {[X,P1],P2} end} + end. +table_foldl(_Fun, Acc,{_Mod,_Tab},'$end_of_table') -> + Acc; +table_foldl(Fun, Acc,{Mod,Tab},Key) -> + Objs = Mod:lookup(Tab,Key), + Acc2 = lists:foldl(Fun,Acc,Objs), + ?dbgformat("Objs: ~p, Acc2: ~p~n",[Objs,Acc2]), + table_foldl(Fun, Acc2, {Mod,Tab}, Mod:next(Tab,Key)). +table_foldl(Fun, Acc,{Mod,Tab}) -> + table_foldl(Fun, Acc,{Mod,Tab},Mod:first(Tab)). + +chunked_select(Mod,Tab,MS,0) -> + Mod:select(Tab,MS); +chunked_select(Mod,Tab,MS,Chunk) when Chunk > 0-> + do_chunk_select(Mod, Mod:select(Tab,MS,Chunk),[]); +chunked_select(Mod,Tab,MS,Chunk) when Chunk < 0-> + case Mod of + ets -> + do_chunk_select_reverse(Mod, + Mod:select_reverse(Tab,MS,-Chunk),[]); + _ -> + chunked_select(Mod,Tab,MS,-Chunk) + end. + + +do_chunk_select_reverse(_Mod, '$end_of_table',Acc) -> + %% OK, all this reversing is only needed for ordered_set, but + %% this is only testcases, right? + erlang:display(did_chunked_select_reverse), + Acc; +do_chunk_select_reverse(Mod, {L,C},Acc) -> + NewAcc = lists:reverse(L)++Acc, + do_chunk_select(Mod, Mod:select(C), NewAcc). + +do_chunk_select(_Mod, '$end_of_table',Acc) -> + %% OK, all this reversing is only needed for ordered_set, but + %% this is only testcases, right? + lists:reverse(Acc); +do_chunk_select(Mod, {L,C},Acc) -> + NewAcc = lists:reverse(L)++Acc, + do_chunk_select(Mod, Mod:select(C), NewAcc). + +cmp_ms_to_fun({Mod,Tab}, MS, Fun1, Fun2) -> + cmp_ms_to_fun({Mod,Tab}, MS, Fun1, Fun2, 0). + +cmp_ms_to_fun({Mod,Tab}, MS, Fun1, Fun2, ChunkSize) -> + MSRes = lists:sort(chunked_select(Mod,Tab,MS,ChunkSize)), + FunRes0 = table_foldl(Fun1,[],{Mod,Tab}), + FunRes = case Fun2 of + F when function(F) -> + FunRes1 = table_foldl(F,[],{Mod,Tab}), + lists:merge(FunRes0,FunRes1); + [] -> + lists:sort(FunRes0) + end, + case MSRes =:= FunRes of + true -> + true; + false -> + ?fmt("Match_spec result differs from fun result:~n",[]), + ?fmt("Parameters: ~p,~p,~p,~p~n", + [{Mod,Tab}, MS, Fun1, Fun2]), + ?fmt("Match_spec Result: ~p~n", [MSRes]), + ?fmt("Fun Result: ~p~n", [FunRes]), + Info = (catch Mod:info(Tab)), + ?fmt("Table info:~p~n", [Info]), + {'EXIT', {hej, ST}} = (catch erlang:error(hej)), + ?fmt("Stack backtrace: ~p~n", [ST]), + erlang:error(badmatch) + end. + +do_n(0,_) -> ok; +do_n(N,Fun) -> + Fun(), + do_n(N-1,Fun). + +%% +%% We want some misses too, so pretend the tables are slightly +%% larger than they really are. +%% +num_els(Tab) -> + 16 * table_factor(Tab). + + +test() -> + do_return_values(), + do_test([]). + +do_test(Config) -> + init_random(Config), + whitebox(), + lists:foreach(fun(Type) -> + Tabs = build_tables(Config,Type), + basic_key(Tabs,Type), + ?fmt("basic_key done for type ~w~n",[Type]), + basic_pb_key(Tabs,Type), + ?fmt("basic_pb_key done for type ~w~n",[Type]), + double_pb_key(Tabs,Type), + ?fmt("double_pb_key done for type ~w~n",[Type]), + multi_key(Tabs,Type), + ?fmt("multi_key done for type ~w~n",[Type]), + multi_mixed_key(Tabs,Type), + ?fmt("multi_mixed_key done for type ~w~n", + [Type]), + destroy_tables(Tabs) + end, + [tuple, list, complex]), + ok. + +basic_key(Tabs,Type) -> + Fun = fun() -> + lists:map(fun(Tab) -> + ?line Key = + create_random_key(num_els(Tab),Type), + ?line MS = + [{{Key,'_','_','_','_'},[],['$_']}], + MF = fun({Key0,A,B,F,Bi},Acc) -> + case Key =:= Key0 of + true -> + [{Key0,A,B,F,Bi} | + Acc]; + _ -> + Acc + end + end, + ?line cmp_ms_to_fun(Tab,MS,MF,[]) + end, + Tabs) + end, + ?line do_n(50,Fun), + ok. + +basic_pb_key(Tabs,Type) -> + InnerFun = fun(Tab) -> + ?line {Key,KeyFun} = + create_pb_key(num_els(Tab),Type), + ?line MS = [{{Key,'_','_','_','_'},[],['$_']}], + MF = fun({Key0,A,B,F,Bi},Acc) -> + case KeyFun(Key0) of + true -> + [{Key0,A,B,F,Bi} | + Acc]; + _ -> + Acc + end + end, + ?line cmp_ms_to_fun(Tab,MS,MF,[]) + end, + ?line {Etses, Detses} = split_by_type(Tabs), + + ?line FunEts = fun() -> + ?line lists:foreach(InnerFun, + Etses) + end, + ?line FunDets = fun() -> + ?line lists:foreach(InnerFun, + Detses) + end, + ?line do_n(table_factor(hd(Etses)) div 2,FunEts), + ?line do_n(10,FunDets), + ok. + +double_pb_key(Tabs,Type) -> + InnerFun = fun(Tab) -> + ?line {KeyA,KeyFunA} = + create_pb_key(num_els(Tab),Type), + ?line {KeyB,KeyFunB} = + create_pb_key(num_els(Tab),Type), + MS = [{{KeyA,'_','_','_','_'},[],['$_']}, + {{KeyB,'_','_','_','_'},[],['$_']}], + ?dbgformat("Tab: ~p, MS: ~p~n", + [Tab,MS]), + MF = fun({Key0,A,B,F,Bi},Acc) -> + case KeyFunA(Key0) of + true -> + ?dbgformat + ("FunMatched:" + " ~p~n", + [{Key0,A, + B,F,Bi}]), + [{Key0,A,B,F,Bi} | + Acc]; + _ -> + case KeyFunB(Key0) of + true -> + ?dbgformat + ("Fun" + "Matched:" + " ~p~n", + [{Key0,A, + B,F, + Bi}]), + [{Key0,A,B, + F,Bi} | + Acc]; + _ -> + Acc + end + end + end, + ?line cmp_ms_to_fun(Tab,MS,MF,[]) + end, + ?line {Etses, Detses} = split_by_type(Tabs), + + ?line FunEts = fun() -> + ?line lists:foreach(InnerFun, + Etses) + end, + ?line FunDets = fun() -> + ?line lists:foreach(InnerFun, + Detses) + end, + ?line do_n(table_factor(hd(Etses)) div 2,FunEts), + ?line do_n(10,FunDets), + ok. + + +multi_key(Tabs,Type) -> + Fun = fun() -> + lists:map(fun(Tab) -> + ?line KeyA = + create_random_key(num_els(Tab),Type), + ?line KeyB = + create_random_key(num_els(Tab),Type), + ?line KeyC = + create_random_key(num_els(Tab),Type), + ?line KeyD = + create_random_key(num_els(Tab),Type), + ?line KeyE = + create_random_key(num_els(Tab),Type), + ?line KeyF = + create_random_key(num_els(Tab),Type), + ?line KeyG = + create_random_key(num_els(Tab),Type), + ?line KeyH = + create_random_key(num_els(Tab),Type), + ?line KeyI = + create_random_key(num_els(Tab),Type), + ?line KeyJ = + create_random_key(num_els(Tab),Type), + ?line KeyK = + create_random_key(num_els(Tab),Type), + ?line KeyL = + create_random_key(num_els(Tab),Type), + + MS = [{{KeyA,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyB,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyC,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyD,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyE,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyF,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyG,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyH,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyI,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyJ,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyK,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyL,'$1','_','$2','_'},[], + [{{'$1','$2'}}]} + ], + ?dbgformat("Tab: ~p, MS: ~p~n", + [Tab,MS]), + MF = fun({Key0,A,_B,F,_Bi},Acc) -> + case Key0 of + KeyA -> + [ {A,F} | + Acc]; + KeyB -> + [ {A,F} | + Acc]; + KeyC -> + [ {A,F} | + Acc]; + KeyD -> + [ {A,F} | + Acc]; + KeyE -> + [ {A,F} | + Acc]; + KeyF -> + [ {A,F} | + Acc]; + KeyG -> + [ {A,F} | + Acc]; + KeyH -> + [ {A,F} | + Acc]; + KeyI -> + [ {A,F} | + Acc]; + KeyJ -> + [ {A,F} | + Acc]; + KeyK -> + [ {A,F} | + Acc]; + KeyL -> + [ {A,F} | + Acc]; + _ -> + Acc + end + end, + ?line cmp_ms_to_fun(Tab,MS,MF,[]) + end, + Tabs) + end, + ?line do_n(33,Fun), + ok. + +multi_mixed_key(Tabs,Type) -> + InnerFun = fun(Tab) -> + ?line KeyA = + create_random_key(num_els(Tab),Type), + ?line KeyB = + create_random_key(num_els(Tab),Type), + ?line KeyC = + create_random_key(num_els(Tab),Type), + ?line KeyD = + create_random_key(num_els(Tab),Type), + ?line {KeyE, FunE} = + create_pb_key(num_els(Tab),Type), + ?line KeyF = + create_random_key(num_els(Tab),Type), + ?line {KeyG, FunG} = + create_pb_key(num_els(Tab),Type), + ?line KeyH = + create_random_key(num_els(Tab),Type), + ?line KeyI = + create_random_key(num_els(Tab),Type), + ?line {KeyJ, FunJ} = + create_pb_key(num_els(Tab),Type), + ?line KeyK = + create_random_key(num_els(Tab),Type), + ?line KeyL = + create_random_key(num_els(Tab),Type), + + MS = [{{KeyA,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyB,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyC,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyD,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyE,'$100','_','$200','_'},[], + [{{'$100','$200'}}]}, + {{KeyF,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyG,'$100','_','$200','_'},[], + [{{'$100','$200'}}]}, + {{KeyH,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyI,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyJ,'$100','_','$200','_'},[], + [{{'$100','$200'}}]}, + {{KeyK,'$1','_','$2','_'},[], + [{{'$1','$2'}}]}, + {{KeyL,'$1','_','$2','_'},[], + [{{'$1','$2'}}]} + ], + ?dbgformat("Tab: ~p, MS: ~p~n", + [Tab,MS]), + MF = fun({Key0,A,_B,F,_Bi},Acc) -> + case Key0 of + KeyA -> + [ {A,F} | + Acc]; + KeyB -> + [ {A,F} | + Acc]; + KeyC -> + [ {A,F} | + Acc]; + KeyD -> + [ {A,F} | + Acc]; + KeyF -> + [ {A,F} | + Acc]; + KeyH -> + [ {A,F} | + Acc]; + KeyI -> + [ {A,F} | + Acc]; + KeyK -> + [ {A,F} | + Acc]; + KeyL -> + [ {A,F} | + Acc]; + Else -> + case FunE(Else) or + FunG(Else) or + FunJ(Else) of + true -> + [ {A,F} | + Acc]; + _ -> + Acc + end + end + end, + ?line cmp_ms_to_fun(Tab,MS,MF,[]), + ?line case Tab of + {ets,_} -> + ?line cmp_ms_to_fun(Tab,MS,MF,[],1), + ?line cmp_ms_to_fun(Tab,MS,MF,[],10), + ?line cmp_ms_to_fun(Tab,MS,MF,[],1000000), + ?line cmp_ms_to_fun(Tab,MS,MF,[],-1), + ?line cmp_ms_to_fun(Tab,MS,MF,[],-10), + ?line cmp_ms_to_fun(Tab,MS,MF,[],-1000000); + _ -> + ok + end + end, + ?line {Etses, Detses} = split_by_type(Tabs), + + ?line FunEts = fun() -> + ?line lists:foreach(InnerFun, + Etses) + end, + ?line FunDets = fun() -> + ?line lists:foreach(InnerFun, + Detses) + end, + ?line do_n(table_factor(hd(Etses)) div 2,FunEts), + ?line do_n(table_factor(hd(Detses)) div 2,FunDets), + ok. + + +split_by_type(List) -> + split_by_type(List,[],[]). +split_by_type([],AccEts,AccDets) -> + {AccEts,AccDets}; +split_by_type([{dets,Tab}|T],AccEts,AccDets) -> + split_by_type(T,AccEts,[{dets,Tab}|AccDets]); +split_by_type([{ets,Tab}|T],AccEts,AccDets) -> + split_by_type(T,[{ets,Tab}|AccEts],AccDets). + +whitebox() -> + ?line ets:new(xxx,[named_table, ordered_set]), + ?line ets:new(yyy,[named_table]), + ?line E = fun(0,_)->ok; + (N,F) -> + ?line ets:insert(xxx,{N,N rem 10}), + ?line ets:insert(yyy,{N,N rem 10}), + F(N-1,F) + end, + ?line E(10000,E), + + ?line G = fun(F,C,A) -> + ?line case ets:select(C) of + {L,C2} -> + ?line F(F,C2,A+length(L)); + '$end_of_table' -> + ?line A + end + end, + ?line H=fun({L,C}) -> + ?line G(G,C,length(L)) + end, + + ?line 1 = H(ets:select(xxx,[{{'$1','$2'},[{'<','$1',2}],['$_']}],7)), + ?line 10000 = H(ets:select(xxx,[{{'$1','$2'},[],['$_']}],1)), + ?line 1 = H(ets:select(yyy,[{{'$1','$2'},[{'<','$1',2}],['$_']}],7)), + ?line 10000 = H(ets:select(yyy,[{{'$1','$2'},[],['$_']}],1)), + + ?line {[{5,5}],_} = ets:select(xxx,[{{5,'$2'},[],['$_']}],1), + ?line {[{5,5}],_} = ets:select(yyy,[{{5,'$2'},[],['$_']}],1), + + ?line I = fun(_,0) -> + ok; + (I,N) -> + ?line 10000 = + H(ets:select(xxx,[{{'$1','$2'},[],['$_']}],N)), + I(I,N-1) + end, + ?line I(I,2000), + ?line J = fun(F,C,A) -> + ?line case ets:select(C) of + {L,C2} -> + ?line F(F,C2,lists:reverse(L)++A); + '$end_of_table' -> + ?line lists:reverse(A) + end + end, + ?line K = fun({L,C}) -> + ?line J(J,C,lists:reverse(L)) + end, + ?line M = fun(_, _, 0) -> + ok; + (F, What, N) -> + ?line What = + K(ets:select(xxx,[{{'$1','$2'},[],['$_']}],N)), + F(F, What, N-1) + end, + ?line N = fun(HM) -> + ?line What = ets:select(xxx,[{{'$1','$2'},[],['$_']}]), + ?line What = lists:sort(What), + M(M, What, HM) + end, + ?line N(2000), + ?line ets:delete(xxx), + ?line ets:delete(yyy). + + +do_return_values() -> + ?line T = ets:new(xxx,[ordered_set]), + ?line U = ets:new(xxx,[]), + ?line '$end_of_table' = ets:select(T,[{'_',[],['$_']}],1), + ?line '$end_of_table' = ets:select(U,[{'_',[],['$_']}],1), + ?line ets:insert(T,{ett,1}), + ?line ets:insert(U,{ett,1}), + ?line {[{ett,1}],C1} = ets:select(T,[{'_',[],['$_']}],1), + ?line '$end_of_table' = ets:select(C1), + ?line {[{ett,1}],C2} = ets:select(U,[{'_',[],['$_']}],1), + ?line '$end_of_table' = ets:select(C2), + ?line {[{ett,1}],C3} = ets:select(T,[{'_',[],['$_']}],2), + ?line '$end_of_table' = ets:select(C3), + ?line {[{ett,1}],C4} = ets:select(U,[{'_',[],['$_']}],2), + ?line '$end_of_table' = ets:select(C4), + ?line E = fun(0,_)->ok; + (N,F) -> + ?line ets:insert(T,{N,N rem 10}), + ?line ets:insert(U,{N,N rem 10}), + F(N-1,F) + end, + ?line E(10000,E), + ?line '$end_of_table' = ets:select(T,[{{hej, hopp},[],['$_']}],1), + ?line '$end_of_table' = ets:select(U,[{{hej,hopp},[],['$_']}],1), + ?line {[{ett,1}],CC1} = ets:select(T,[{{'$1','_'},[{is_atom, '$1'}], + ['$_']}],1), + ?line '$end_of_table' = ets:select(CC1), + ?line {[{ett,1}],CC2} = ets:select(U,[{{'$1','_'},[{is_atom, '$1'}], + ['$_']}],1), + ?line '$end_of_table' = ets:select(CC2), + ?line {[{ett,1}],CC3} = ets:select(T,[{{'$1','_'},[{is_atom, '$1'}], + ['$_']}],2), + ?line '$end_of_table' = ets:select(CC3), + ?line {[{ett,1}],CC4} = ets:select(U,[{{'$1','_'},[{is_atom, '$1'}], + ['$_']}],2), + ?line '$end_of_table' = ets:select(CC4), + ?line ets:delete(T), + ?line ets:delete(U), + ?line V = ets:new(xxx,[{keypos, 4}]), + ?line X = ets:new(xxx,[ordered_set, {keypos, 4}]), + ?line ets:insert(V,{1,1,1,ett}), + ?line ets:insert(X,{1,1,1,ett}), + ?line '$end_of_table' = ets:select(V,[{{1,1,1},[],['$_']}],1), + ?line '$end_of_table' = ets:select(X,[{{1,1,1},[],['$_']}],1), + ?line ets:delete(V), + ?line ets:delete(X), + ok. + + + + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/sets_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/sets_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/sets_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/sets_SUITE.erl 2009-11-20 13:32:03.000000000 +0000 @@ -0,0 +1,495 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%% This module tests the ordsets, sets, and gb_sets modules. +%% + +-module(sets_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + create/1,add_element/1,del_element/1, + subtract/1,intersection/1,union/1,is_subset/1, + is_set/1,fold/1,filter/1, + take_smallest/1,take_largest/1]). + +-include("test_server.hrl"). + +-import(lists, [foldl/3,reverse/1]). + +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?t:minutes(5)), + [{watchdog,Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + [create,add_element,del_element,subtract, + intersection,union,is_subset,is_set,fold,filter, + take_smallest,take_largest]. + +create(Config) when is_list(Config) -> + test_all(fun create_1/1). + +create_1(M) -> + ?line S0 = M:empty(), + ?line [] = M:to_list(S0), + ?line 0 = M:size(S0), + ?line true = M:is_empty(S0), + E = make_ref(), + ?line One = M:singleton(E), + ?line 1 = M:size(One), + ?line false = M:is_empty(One), + [E] = M:to_list(One), + S0. + +add_element(Config) when is_list(Config) -> + test_all([{0,132},{253,258},{510,514}], fun add_element_1/2). + +add_element_1(List, M) -> + ?line S = M:from_list(List), + ?line SortedSet = lists:usort(List), + ?line SortedSet = lists:sort(M:to_list(S)), + + %% Make sure that we get the same result by inserting + %% elements one at the time. + ?line S2 = foldl(fun(El, Set) -> M:add_element(El, Set) end, + M:empty(), List), + ?line true = M:equal(S, S2), + + %% Insert elements, randomly delete inserted elements, + %% and re-inserted all deleted elements at the end. + ?line S3 = add_element_del(List, M, M:empty(), [], []), + ?line true = M:equal(S2, S3), + ?line true = M:equal(S, S3), + S. + +add_element_del([H|T], M, S, Del, []) -> + add_element_del(T, M, M:add_element(H, S), Del, [H]); +add_element_del([H|T], M, S0, Del, Inserted) -> + S1 = M:add_element(H, S0), + case random:uniform(3) of + 1 -> + OldEl = lists:nth(random:uniform(length(Inserted)), Inserted), + S = M:del_element(OldEl, S1), + add_element_del(T, M, S, [OldEl|Del], [H|Inserted]); + _ -> + add_element_del(T, M, S1, Del, [H|Inserted]) + end; +add_element_del([], M, S, Del, _) -> + M:union(S, M:from_list(Del)). + +del_element(Config) when is_list(Config) -> + test_all([{0,132},{253,258},{510,514},{1022,1026}], fun del_element_1/2). + +del_element_1(List, M) -> + ?line S0 = M:from_list(List), + ?line Empty = foldl(fun(El, Set) -> M:del_element(El, Set) end, S0, List), + ?line Empty = M:empty(), + ?line M:is_empty(Empty), + ?line S1 = foldl(fun(El, Set) -> + M:add_element(El, Set) + end, S0, reverse(List)), + ?line true = M:equal(S0, S1), + S1. + +subtract(Config) when is_list(Config) -> + test_all(fun subtract_empty/1), + + %% Note: No empty set. + test_all([{2,69},{126,130},{253,258},511,512,{1023,1030}], fun subtract_1/2). + +subtract_empty(M) -> + ?line Empty = M:empty(), + ?line true = M:is_empty(M:subtract(Empty, Empty)), + M:subtract(Empty, Empty). + +subtract_1(List, M) -> + ?line S0 = M:from_list(List), + ?line Empty = M:empty(), + + %% Trivial cases. + ?line true = M:is_empty(M:subtract(Empty, S0)), + ?line true = M:equal(S0, M:subtract(S0, Empty)), + + %% Not so trivial. + ?line subtract_check(List, mutate_some(remove_some(List, 0.4)), M), + ?line subtract_check(List, rnd_list(length(List) div 2 + 5), M), + ?line subtract_check(List, rnd_list(length(List) div 7 + 9), M), + ?line subtract_check(List, mutate_some(List), M). + +subtract_check(A, B, M) -> + one_subtract_check(B, A, M), + one_subtract_check(A, B, M). + +one_subtract_check(A, B, M) -> + ASorted = lists:usort(A), + BSorted = lists:usort(B), + ASet = M:from_list(A), + BSet = M:from_list(B), + DiffSet = M:subtract(ASet, BSet), + Diff = ASorted -- BSorted, + true = M:equal(DiffSet, M:from_list(Diff)), + Diff = lists:sort(M:to_list(DiffSet)), + DiffSet. + +intersection(Config) when is_list(Config) -> + %% Note: No empty set. + test_all([{1,65},{126,130},{253,259},{499,513},{1023,1025}], fun intersection_1/2). + +intersection_1(List, M) -> + ?line S0 = M:from_list(List), + + %% Intersection with self. + ?line true = M:equal(S0, M:intersection(S0, S0)), + ?line true = M:equal(S0, M:intersection([S0,S0])), + ?line true = M:equal(S0, M:intersection([S0,S0,S0])), + ?line true = M:equal(S0, M:intersection([S0])), + + %% Intersection with empty. + ?line Empty = M:empty(), + ?line true = M:equal(Empty, M:intersection(S0, Empty)), + ?line true = M:equal(Empty, M:intersection([S0,Empty,S0,Empty])), + + %% The intersection of no sets is undefined. + ?line {'EXIT',_} = (catch M:intersection([])), + + %% Disjoint sets. + ?line Disjoint = [{El} || El <- List], + ?line DisjointSet = M:from_list(Disjoint), + ?line M:is_empty(M:intersection(S0, DisjointSet)), + + %% Disjoint, different sizes. + ?line M:is_empty(M:intersection(S0, M:from_list(remove_some(Disjoint, 0.3)))), + ?line M:is_empty(M:intersection(S0, M:from_list(remove_some(Disjoint, 0.7)))), + ?line M:is_empty(M:intersection(S0, M:from_list(remove_some(Disjoint, 0.9)))), + ?line M:is_empty(M:intersection(M:from_list(remove_some(List, 0.3)), DisjointSet)), + ?line M:is_empty(M:intersection(M:from_list(remove_some(List, 0.5)), DisjointSet)), + ?line M:is_empty(M:intersection(M:from_list(remove_some(List, 0.9)), DisjointSet)), + + %% Partial overlap (one or more elements in result set). + %% The sets have almost the same size. (Almost because a duplicated + %% element in the original list could be mutated and not mutated + %% at the same time.) + ?line PartialOverlap = mutate_some(List, []), + ?line IntersectionSet = check_intersection(List, PartialOverlap, M), + ?line false = M:is_empty(IntersectionSet), + + %% Partial overlap, different set sizes. (Intersection possibly empty.) + ?line check_intersection(List, remove_some(PartialOverlap, 0.1), M), + ?line check_intersection(List, remove_some(PartialOverlap, 0.3), M), + ?line check_intersection(List, remove_some(PartialOverlap, 0.5), M), + ?line check_intersection(List, remove_some(PartialOverlap, 0.7), M), + ?line check_intersection(List, remove_some(PartialOverlap, 0.9), M), + + IntersectionSet. + +check_intersection(Orig, Mutated, M) -> + OrigSet = M:from_list(Orig), + MutatedSet = M:from_list(Mutated), + Intersection = [El || El <- Mutated, not is_tuple(El)], + SortedIntersection = lists:usort(Intersection), + IntersectionSet = M:intersection(OrigSet, MutatedSet), + true = M:equal(IntersectionSet, M:from_list(SortedIntersection)), + SortedIntersection = lists:sort(M:to_list(IntersectionSet)), + + IntersectionSet. + + +union(Config) when is_list(Config) -> + %% Note: No empty set. + test_all([{1,71},{125,129},{254,259},{510,513},{1023,1025}], fun union_1/2). + +union_1(List, M) -> + ?line S = M:from_list(List), + + %% Union with self and empty. + ?line Empty = M:empty(), + ?line true = M:equal(S, M:union(S, S)), + ?line true = M:equal(S, M:union([S,S])), + ?line true = M:equal(S, M:union([S,S,Empty])), + ?line true = M:equal(S, M:union([S,Empty,S])), + ?line true = M:equal(S, M:union(S, Empty)), + ?line true = M:equal(S, M:union([S])), + ?line true = M:is_empty(M:union([])), + + %% Partial overlap. + ?line check_union(List, remove_some(mutate_some(List), 0.9), M), + ?line check_union(List, remove_some(mutate_some(List), 0.7), M), + ?line check_union(List, remove_some(mutate_some(List), 0.5), M), + ?line check_union(List, remove_some(mutate_some(List), 0.3), M), + ?line check_union(List, remove_some(mutate_some(List), 0.1), M), + + ?line check_union(List, mutate_some(remove_some(List, 0.9)), M), + ?line check_union(List, mutate_some(remove_some(List, 0.7)), M), + ?line check_union(List, mutate_some(remove_some(List, 0.5)), M), + ?line check_union(List, mutate_some(remove_some(List, 0.3)), M), + ?line check_union(List, mutate_some(remove_some(List, 0.1)), M). + +check_union(Orig, Other, M) -> + OrigSet = M:from_list(Orig), + OtherSet = M:from_list(Other), + Union = Orig++Other, + SortedUnion = lists:usort(Union), + UnionSet = M:union(OrigSet, OtherSet), + SortedUnion = lists:sort(M:to_list(UnionSet)), + M:equal(UnionSet, M:from_list(Union)), + UnionSet. + +is_subset(Config) when is_list(Config) -> + test_all([{1,132},{253,270},{299,311}], fun is_subset_1/2). + +is_subset_1(List, M) -> + ?line S = M:from_list(List), + ?line Empty = M:empty(), + + %% Subset of empty and self. + ?line true = M:is_subset(Empty, Empty), + ?line true = M:is_subset(Empty, S), + ?line false = M:is_subset(S, Empty), + ?line true = M:is_subset(S, S), + + %% Other cases. + Res = [?line false = M:is_subset(M:singleton(make_ref()), S), + ?line true = M:is_subset(M:singleton(hd(List)), S), + ?line true = check_subset(remove_some(List, 0.1), List, M), + ?line true = check_subset(remove_some(List, 0.5), List, M), + ?line true = check_subset(remove_some(List, 0.9), List, M), + ?line check_subset(mutate_some(List), List, M), + ?line check_subset(rnd_list(length(List) div 2 + 5), List, M), + ?line subtract_check(List, rnd_list(length(List) div 7 + 9), M) + ], + res_to_set(Res, M, 0, []). + +check_subset(X, Y, M) -> + check_one_subset(Y, X, M), + check_one_subset(X, Y, M). + +check_one_subset(X, Y, M) -> + XSet = M:from_list(X), + YSet = M:from_list(Y), + SortedX = lists:usort(X), + SortedY = lists:usort(Y), + IsSubSet = length(SortedY--SortedX) =:= length(SortedY) - length(SortedX), + IsSubSet = M:is_subset(XSet, YSet), + IsSubSet. + +%% Encode all test results as a set to return. +res_to_set([true|T], M, I, Acc) -> + res_to_set(T, M, I+1, [I|Acc]); +res_to_set([_|T], M, I, Acc) -> + res_to_set(T, M, I+1, Acc); +res_to_set([], M, _, Acc) -> M:from_list(Acc). + +is_set(Config) when is_list(Config) -> + %% is_set/1 is tested in the other test cases when its argument + %% is a set. Here test some arguments that makes it return false. + + ?line false = gb_sets:is_set([a,b]), + ?line false = gb_sets:is_set({a,very,bad,tuple}), + + ?line false = sets:is_set([a,b]), + ?line false = sets:is_set({a,very,bad,tuple}), + + ?line false = ordsets:is_set([b,a]), + ?line false = ordsets:is_set({bad,tuple}), + + %% Now test values that are known to be bad for all set representations. + test_all(fun is_set_1/1). + +is_set_1(M) -> + ?line false = M:is_set(self()), + ?line false = M:is_set(blurf), + ?line false = M:is_set(make_ref()), + ?line false = M:is_set(<<1,2,3>>), + ?line false = M:is_set(42), + ?line false = M:is_set(math:pi()), + ?line false = M:is_set({}), + M:empty(). + +fold(Config) when is_list(Config) -> + test_all([{0,71},{125,129},{254,259},{510,513},{1023,1025},{9999,10001}], + fun fold_1/2). + +fold_1(List, M) -> + ?line S = M:from_list(List), + ?line L = M:fold(fun(E, A) -> [E|A] end, [], S), + ?line true = lists:sort(L) =:= lists:usort(List), + M:empty(). + +filter(Config) when is_list(Config) -> + test_all([{0,69},{126,130},{254,259},{510,513},{1023,1025},{7999,8000}], + fun filter_1/2). + +filter_1(List, M) -> + ?line S = M:from_list(List), + IsNumber = fun(X) -> is_number(X) end, + ?line M:equal(M:from_list(lists:filter(IsNumber, List)), + M:filter(IsNumber, S)), + ?line M:filter(fun(X) -> is_atom(X) end, S). + +%%% +%%% Test specifics for gb_sets. +%%% + +take_smallest(Config) when is_list(Config) -> + test_all([{1,71},{125,129},{254,259},{510,513},{1023,1025}], + fun take_smallest_1/2). + +take_smallest_1(List, M) -> + case M:module() of + gb_sets -> take_smallest_2(List, M); + _ -> ok + end, + M:empty(). + +take_smallest_2(List0, M) -> + ?line List = lists:usort(List0), + ?line S = M:from_list(List0), + take_smallest_3(S, List, M). + +take_smallest_3(S0, List0, M) -> + case M:is_empty(S0) of + true -> ok; + false -> + ?line Smallest = hd(List0), + ?line Smallest = gb_sets:smallest(S0), + ?line {Smallest,S} = gb_sets:take_smallest(S0), + ?line List = tl(List0), + ?line true = gb_sets:to_list(S) =:= List, + take_smallest_3(S, List, M) + end. + +take_largest(Config) when is_list(Config) -> + test_all([{1,71},{125,129},{254,259},{510,513},{1023,1025}], + fun take_largest_1/2). + +take_largest_1(List, M) -> + case M:module() of + gb_sets -> take_largest_2(List, M); + _ -> ok + end, + M:empty(). + +take_largest_2(List0, M) -> + ?line List = reverse(lists:usort(List0)), + ?line S = M:from_list(List0), + take_largest_3(S, List, M). + +take_largest_3(S0, List0, M) -> + case M:is_empty(S0) of + true -> ok; + false -> + ?line Largest = hd(List0), + ?line Largest = gb_sets:largest(S0), + ?line {Largest,S} = gb_sets:take_largest(S0), + ?line List = tl(List0), + ?line true = gb_sets:to_list(S) =:= reverse(List), + take_largest_3(S, List, M) + end. + +%%% +%%% Helper functions. +%%% + +sets_mods() -> + Ordsets = sets_test_lib:new(ordsets, fun(X, Y) -> X == Y end), + Sets = sets_test_lib:new(sets, fun(X, Y) -> + lists:sort(sets:to_list(X)) == + lists:sort(sets:to_list(Y)) end), + Gb = sets_test_lib:new(gb_sets, fun(X, Y) -> + gb_sets:to_list(X) == + gb_sets:to_list(Y) end), + [Ordsets,Sets,Gb]. + +test_all(Tester) -> + ?line Res = [begin + random:seed(1, 2, 42), + S = Tester(M), + {M:size(S),lists:sort(M:to_list(S))} + end || M <- sets_mods()], + ?line all_same(Res). + +test_all([{Low,High}|T], Tester) -> + test_all(lists:seq(Low, High)++T, Tester); +test_all([Sz|T], Tester) when is_integer(Sz) -> + List = rnd_list(Sz), + ?line Res = [begin + random:seed(19, 2, Sz), + S = Tester(List, M), + {M:size(S),lists:sort(M:to_list(S))} + end || M <- sets_mods()], + ?line all_same(Res), + test_all(T, Tester); +test_all([], _) -> ok. + + +all_same([H|T]) -> + all_same_1(T, H). + +all_same_1([H|T], H) -> + all_same_1(T, H); +all_same_1([], _) -> ok. + +rnd_list(Sz) -> + rnd_list_1(Sz, []). + +atomic_rnd_term() -> + case random:uniform(3) of + 1 -> list_to_atom(integer_to_list($\s+random:uniform(94))++"rnd"); + 2 -> random:uniform(); + 3 -> random:uniform(50)-37 + end. + +rnd_list_1(0, Acc) -> Acc; +rnd_list_1(N, Acc) -> rnd_list_1(N-1, [atomic_rnd_term()|Acc]). + +mutate_some(List) -> + mutate_some(List, []). + +mutate_some([X,Y,Z|T], Acc) -> + %% Intentionally change order. (Order should not matter.) + mutate_some(T, [{X},Z,Y|Acc]); +mutate_some([H|T], Acc) -> + mutate_some(T, [H|Acc]); +mutate_some([], Acc) -> + %% Intentionally not reversing. + Acc. + +%% Removes at least one element. +remove_some(List0, P) -> + case remove_some(List0, P, []) of + List when length(List0) =:= length(List) -> + tl(List); + List -> + List + end. + +remove_some([H|T], P, Acc) -> + case random:uniform() of + F when F < P -> %Remove. + remove_some(T, P, Acc); + _ -> + remove_some(T, P, [H|Acc]) + end; +remove_some([], _, Acc) -> + %% Intentionally no reverse. Order should not matter. + Acc. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/sets_test_lib.erl erlang-13.b.3-dfsg/lib/stdlib/test/sets_test_lib.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/sets_test_lib.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/sets_test_lib.erl 2009-11-20 13:32:04.000000000 +0000 @@ -0,0 +1,124 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +-module(sets_test_lib, [Mod,Equal]). + +-export([module/0,equal/2,empty/0,from_list/1,to_list/1,singleton/1, + add_element/2,del_element/2,size/1,is_empty/1,is_set/1, + intersection/1,intersection/2,subtract/2, + union/1,union/2,is_subset/2,fold/3,filter/2]). + +module() -> + Mod. + +equal(X, Y) -> + Equal(X, Y). + +empty() -> + Mod:new(). + +from_list(L) -> + Mod:from_list(L). + +to_list(S) -> + Mod:to_list(S). + +singleton(E) -> + case erlang:function_exported(Mod, singleton, 1) of + true -> Mod:singleton(E); + false -> from_list([E]) + end. + +add_element(El, S0) -> + S = Mod:add_element(El, S0), + true = Mod:is_element(El, S), + false = is_empty(S), + true = Mod:is_set(S), + S. + +del_element(El, S0) -> + S = Mod:del_element(El, S0), + false = Mod:is_element(El, S), + true = Mod:is_set(S), + S. + +size(S) -> + Mod:size(S). + +is_empty(S) -> + true = Mod:is_set(S), + case erlang:function_exported(Mod, is_empty, 1) of + true -> Mod:is_empty(S); + false -> Mod:size(S) == 0 + end. + +is_set(S) -> + Mod:is_set(S). + +intersection(S1, S2) -> + S = Mod:intersection(S1, S2), + true = Equal(S, Mod:intersection(S2, S1)), + Disjoint = is_empty(S), + Disjoint = Mod:is_disjoint(S1, S2), + Disjoint = Mod:is_disjoint(S2, S1), + S. + +intersection(Ss) -> + S = Mod:intersection(Ss), + true = Equal(S, Mod:intersection(lists:reverse(Ss))), + S. + +subtract(S1, S2) -> + S = Mod:subtract(S1, S2), + true = Mod:is_set(S), + true = Mod:size(S) =< Mod:size(S1), + S. + +union(S1, S2) -> + S = Mod:union(S1, S2), + true = Equal(S, Mod:union(S2, S1)), + true = Mod:is_set(S), + S. + +union(Ss) -> + S = Mod:union(Ss), + true = Equal(S, Mod:union(lists:reverse(Ss))), + S. + +is_subset(S, Set) -> + case Mod:is_subset(S, Set) of + false -> false; + true -> + case Mod:is_subset(Set, S) of + false -> ok; + true -> + %% The sets are subsets of each other. + %% They must be equal. + true = Equal(S, Set) + end, + true + end. + +fold(F, A, S) -> + true = Mod:is_set(S), + Mod:fold(F, A, S). + +filter(F, S) -> + true = Mod:is_set(S), + Mod:filter(F, S). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/shell_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/shell_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/shell_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/shell_SUITE.erl 2009-11-20 13:31:50.000000000 +0000 @@ -0,0 +1,2822 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(shell_SUITE). +-export([all/1]). + +-export([forget/1, records/1, known_bugs/1, otp_5226/1, otp_5327/1, + otp_5435/1, otp_5195/1, otp_5915/1, otp_5916/1, + bits/1, bs_match_misc_SUITE/1, bs_match_int_SUITE/1, + bs_match_tail_SUITE/1, bs_match_bin_SUITE/1, + bs_construct_SUITE/1, + refman/1, refman_bit_syntax/1, + progex/1, progex_bit_syntax/1, progex_records/1, + progex_lc/1, progex_funs/1, + tickets/1, otp_5990/1, otp_6166/1, otp_6554/1, otp_6785/1, + otp_7184/1, otp_7232/1]). + +-export([restricted/1, start_restricted_from_shell/1, + start_restricted_on_command_line/1,restricted_local/1]). + +%% Internal export. +-export([otp_5435_2/0]). + +%% +%% Define to run outside of test server +%% +%% -define(STANDALONE,1). + +-ifdef(STANDALONE). +-define(config(A,B),config(A,B)). +-define(t,test_server). +-export([config/2]). +-define(line, noop, ). +config(priv_dir,_) -> + ".". +-else. +-include("test_server.hrl"). +-export([init_per_testcase/2, fin_per_testcase/2]). +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(2)). +init_per_testcase(_Case, Config) -> + ?line Dog = ?t:timetrap(?default_timeout), + ?line OrigPath = code:get_path(), + ?line code:add_patha(?config(priv_dir,Config)), + [{orig_path,OrigPath}, {watchdog, Dog} | Config]. + +fin_per_testcase(_Case, Config) -> + ?line Dog = ?config(watchdog, Config), + ?line test_server:timetrap_cancel(Dog), + ?line OrigPath = ?config(orig_path,Config), + ?line code:set_path(OrigPath), + ?line application:unset_env(stdlib, restricted_shell), + ?line (catch code:purge(user_default)), + ?line (catch code:delete(user_default)), + ok. +-endif. + +all(doc) -> + ["Test cases for the 'shell' module."]; +all(suite) -> + [forget, records, known_bugs, otp_5226, otp_5327, otp_5435, otp_5195, + otp_5915, otp_5916, bits, refman, progex, tickets, restricted]. + +-record(state, {bin, reply, leader}). + +restricted(doc) -> + ["Test restricted_shell"]; +restricted(suite) -> + [start_restricted_from_shell,start_restricted_on_command_line,restricted_local]. + +start_restricted_from_shell(doc) -> + ["Test that a restricted shell can be started from the normal shell"]; +start_restricted_from_shell(suite) -> + []; +start_restricted_from_shell(Config) when is_list(Config) -> + ?line [{error,nofile}] = scan(<<"begin shell:start_restricted(" + "nonexisting_module) end.">>), + ?line Test = filename:join(?config(priv_dir, Config), + "test_restricted.erl"), + Contents = <<"-module(test_restricted). + -export([local_allowed/3, non_local_allowed/3]). + local_allowed(i,[],State) -> + {true,State}; + local_allowed(ugly,[],_State) -> + non_conforming_reply; + local_allowed(_,_,State) -> + {false,State}. + + non_local_allowed({shell,stop_restricted},[],State) -> + {true,State}; + non_local_allowed({erlang,'+'},[_],State) -> + {true,State}; + non_local_allowed({erlang,'-'},[_,_],_State) -> + non_conforming_reply; + non_local_allowed({h, d}, [Arg], S) -> + {{redirect, {erlang,hd}, [Arg]}, S}; + non_local_allowed(_,_,State) -> + {false,State}. + ">>, + ?line ok = compile_file(Config, Test, Contents, []), + ?line "exception exit: restricted shell starts now" = + comm_err(<<"begin shell:start_restricted(" + "test_restricted) end.">>), + ?line {ok, test_restricted} = + application:get_env(stdlib, restricted_shell), + ?line "Pid" ++ _ = t(<<"begin i() end.">>), + ?line "exception exit: restricted shell does not allow c(foo)" = + comm_err(<<"begin c(foo) end.">>), + ?line "exception exit: restricted shell does not allow init:stop()" = + comm_err(<<"begin init:stop() end.">>), + ?line "exception exit: restricted shell does not allow init:stop()" = + comm_err(<<"begin F = fun() -> init:stop() end, F() end.">>), + ?line "exception error: bad argument in an arithmetic expression" = + comm_err(<<"begin +a end.">>), + ?line "exception exit: restricted shell does not allow a + b" = + comm_err(<<"begin a+b end.">>), + ?line "exception exit: restricted shell does not allow - b" = + comm_err(<<"begin -b end.">>), + ?line "exception exit: restricted shell does not allow 1 + 2" = + comm_err(<<"begin if atom(1 + 2> 0) -> 1; true -> 2 end end.">>), + ?line "exception exit: restricted shell does not allow 1 + 2" = + comm_err(<<"begin if is_atom(1 + 2> 0) -> 1; true -> 2 end end.">>), + ?line "exception exit: restricted shell does not allow - 2" = + comm_err(<<"begin if - 2 -> 1; true -> 2 end end.">>), + ?line "exception exit: restricted shell does not allow - 2" = + comm_err(<<"begin if (- 2 > 0) andalso true -> 1; true -> 2 end end.">>), + ?line "exception exit: restricted shell does not allow - 2" = + comm_err(<<"begin if (- 2 > 0) orelse true -> 1; true -> 2 end end.">>), + ?line "exception exit: restricted shell does not allow 1 + 2" = + comm_err(<<"begin if 1 + 2 > 0 -> 1; true -> 2 end end.">>), + ?line "exception exit: restricted shell does not allow 1 + 2" = + comm_err(<<"begin if erlang:is_atom(1 + 2> 0) -> 1; true -> 2 end end.">>), + ?line "exception exit: restricted shell does not allow is_integer(1)" = + comm_err(<<"begin if is_integer(1) -> 1; true -> 2 end end.">>), + ?line "exception exit: restricted shell does not allow is_integer(1)" = + comm_err(<<"begin if integer(1) -> 1; true -> 2 end end.">>), + ?line "exception exit: " + "restricted shell module returned bad value non_conforming_reply" = + comm_err(<<"ugly().">>), + ?line [one] = scan(<<"h:d([one,two]).">>), + ?line "exception exit: " + "restricted shell module returned bad value non_conforming_reply" = + comm_err(<<"1 - 2.">>), + ?line "exception exit: restricted shell stopped"= + comm_err(<<"begin shell:stop_restricted() end.">>), + ?line undefined = + application:get_env(stdlib, restricted_shell), + ok. + +start_restricted_on_command_line(doc) -> + ["Check restricted shell when started from the command line"]; +start_restricted_on_command_line(suite) -> + []; +start_restricted_on_command_line(Config) when is_list(Config) -> + ?line {ok,Node} = start_node(shell_suite_helper_1, + "-pa "++?config(priv_dir,Config)++ + " -stdlib restricted_shell foo"), + ?line "Warning! Restricted shell module foo not found: nofile"++_ = + t({Node, <<"begin i() end.">>}), + ?line "exception exit: restricted shell does not allow i()" = + comm_err({Node, <<"begin i() end.">>}), + ?line [ok] = + (catch scan({Node, <<"begin q() end.">>})), + ?line test_server:stop_node(Node), + ?line Test = filename:join(?config(priv_dir, Config), + "test_restricted2.erl"), + Contents = <<"-module(test_restricted2). + -export([local_allowed/3, non_local_allowed/3]). + local_allowed(i,[],State) -> + {true,State}; + local_allowed(_,_,State) -> + {false,State}. + + non_local_allowed({shell,stop_restricted},[],State) -> + {true,State}; + non_local_allowed({erlang,node},[],State) -> + {true,State}; + non_local_allowed(_,_,State) -> + {false,State}. + ">>, + ?line ok = compile_file(Config, Test, Contents, []), + ?line {ok,Node2} = start_node(shell_suite_helper_2, + "-pa "++?config(priv_dir,Config)++ + " -stdlib restricted_shell test_restricted2"), + ?line "Pid" ++ _ = t({Node2,<<"begin i() end.">>}), + ?line "exception exit: restricted shell does not allow c(foo)" = + comm_err({Node2,<<"begin c(foo) end.">>}), + ?line "exception exit: restricted shell does not allow init:stop()" = + comm_err({Node2,<<"begin init:stop() end.">>}), + ?line "exception exit: restricted shell does not allow init:stop()" = + comm_err({Node2,<<"begin F = fun() -> init:stop() end, F() end.">>}), + ?line [Node2] = + scan({Node2, <<"begin erlang:node() end.">>}), + ?line [Node2] = + scan({Node2, <<"begin node() end.">>}), + ?line "exception exit: restricted shell stopped"= + comm_err({Node2,<<"begin shell:stop_restricted() end.">>}), + ?line [ok] = + scan({Node2, <<"begin q() end.">>}), + ?line test_server:stop_node(Node2), + ok. + +restricted_local(suite) -> + []; +restricted_local(doc) -> + ["Tests calling local shell functions with spectacular arguments in restricted shell"]; +restricted_local(Config) when is_list(Config) -> + ?line [{error,nofile}] = scan(<<"begin shell:start_restricted(" + "nonexisting_module) end.">>), + ?line Test = filename:join(?config(priv_dir, Config), + "test_restricted_local.erl"), + Contents = <<"-module(test_restricted_local). + -export([local_allowed/3, non_local_allowed/3]). + local_allowed(i,[],State) -> + {true,State}; + local_allowed(banan,_,State) -> + {true,State}; + local_allowed(funkis,_,State) -> + {true,State}; + local_allowed(c,_,State) -> + {true,State}; + local_allowed(_,_,State) -> + {false,State}. + + non_local_allowed({shell,stop_restricted},[],State) -> + {true,State}; + non_local_allowed(_,_,State) -> + {false,State}. + ">>, + ?line ok = compile_file(Config, Test, Contents, []), + ?line Test2 = filename:join(?config(priv_dir, Config), + "user_default.erl"), + Contents2 = <<"-module(user_default). + -export([funkis/1,apple/1]). + funkis(F) when is_function(F) -> + funkis; + funkis(_) -> + nofunkis. + apple(_) -> + apple. + ">>, + ?line ok = compile_file(Config, Test2, Contents2, []), + ?line "exception exit: restricted shell starts now" = + comm_err(<<"begin shell:start_restricted(" + "test_restricted_local) end.">>), + ?line {ok, test_restricted_local} = + application:get_env(stdlib, restricted_shell), + ?line "exception exit: restricted shell does not allow foo(" ++ _ = + comm_err(<<"begin F=fun() -> hello end, foo(F) end.">>), + ?line "exception error: undefined shell command banan/1" = + comm_err(<<"begin F=fun() -> hello end, banan(F) end.">>), + ?line "{error,"++_ = t(<<"begin F=fun() -> hello end, c(F) end.">>), + ?line "exception exit: restricted shell does not allow l(" ++ _ = + comm_err(<<"begin F=fun() -> hello end, l(F) end.">>), + ?line "exception error: variable 'F' is unbound" = + comm_err(<<"begin F=fun() -> hello end, f(F), F end.">>), + ?line [funkis] = + scan(<<"begin F=fun() -> hello end, funkis(F) end.">>), + ?line "exception exit: restricted shell does not allow apple(" ++ _ = + comm_err(<<"begin F=fun() -> hello end, apple(F) end.">>), + ?line "exception exit: restricted shell stopped"= + comm_err(<<"begin shell:stop_restricted() end.">>), + ?line undefined = + application:get_env(stdlib, restricted_shell), + ?line (catch code:purge(user_default)), + ?line true = (catch code:delete(user_default)), + ok. + + +forget(doc) -> + ["f/0 and f/1"]; +forget(suite) -> + []; +forget(Config) when is_list(Config) -> + %% f/0 + ?line [ok] = scan(<<"begin f() end.">>), + ?line "1: variable 'A' is unbound" = + comm_err(<<"A = 3, f(), A.">>), + ?line [ok] = scan(<<"A = 3, A = f(), A.">>), + + %% f/1 + ?line [ok] = scan(<<"begin f(A) end.">>), + ?line "1: variable 'A' is unbound" = + comm_err(<<"A = 3, f(A), A.">>), + ?line [ok] = scan(<<"A = 3, A = f(A), A.">>), + ?line "exception error: no function clause matching call to f/1" = + comm_err(<<"f(a).">>), + ok. + +records(doc) -> + ["Test of the record support. OTP-5063."]; +records(suite) -> + []; +records(Config) when is_list(Config) -> + %% rd/2 + ?line [{attribute,_,record,{bar,_}},ok] = + scan(<<"rd(foo,{bar}), + rd(bar,{foo = (#foo{})#foo.bar}), + rl(bar).">>), + ?line "variable 'R' is unbound" = % used to work (before OTP-5878, R11B) + exit_string(<<"rd(foo,{bar}), + R = #foo{}, + rd(bar,{foo = R#foo.bar}).">>), + ?line "exception error: no function clause matching call to rd/2" = + comm_err(<<"rd({foo},{bar}).">>), + ?line "bad record declaration" = exit_string(<<"A = bar, rd(foo,A).">>), + ?line [foo] = scan(<<"begin rd(foo,{bar}) end.">>), + ?line "1: record foo undefined" = + comm_err(<<"begin rd(foo,{bar}), #foo{} end.">>), + ?line ['f o o'] = scan(<<"rd('f o o', {bar}).">>), + ?line [foo] = scan(<<"rd(foo,{bar}), rd(foo,{foo = #foo{}}).">>), + + %% rf/0,1 + ?line [_, {attribute,_,record,{foo,_}},ok] = + scan(<<"rf('_'). rd(foo,{bar}),rl().">>), + ?line "1: record foo undefined" = + comm_err(<<"rd(foo,{bar}), #foo{}, rf(foo), #foo{}.">>), + ?line [ok,{foo,undefined}] = + scan(<<"rd(foo,{bar}), A = #foo{}, rf(foo). A.">>), + ?line [_] = scan(<<"begin rf() end.">>), + ?line [ok] = scan(<<"begin rf(foo) end.">>), + + %% rp/1 + ?line "#foo{bar = undefined}.\nok.\n" = + t(<<"rd(foo,{bar}), rp(#foo{}).">>), + ?line [{foo,3,4,3},ok] = scan(<<"rd(foo,{a = 3, b}), rp({foo,3,4,3}).">>), + ?line "#foo{a = 12}.\nok.\n" = t(<<"rd(foo,{a = 3}), rp({foo,12}).">>), + ?line [{[{foo}],12},ok] = scan(<<"rd(foo,{a = 3}), rp({[{foo}],12}).">>), + + %% rr/1,2,3 + MS = ?MODULE_STRING, + RR1 = "rr(" ++ MS ++ "). #state{}.", + ?line "[state]\n" + "#state{bin = undefined,reply = undefined,leader = undefined}.\n" = + t(RR1), + RR2 = "rr(" ++ MS ++ ",[state]). #state{}.", + ?line "[state]\n" + "#state{bin = undefined,reply = undefined,leader = undefined}.\n" = + t(RR2), + RR3 = "rr(" ++ MS ++ ",'_'). #state{}.", + ?line "[state]\n" + "#state{bin = undefined,reply = undefined,leader = undefined}.\n" = + t(RR3), + RR4 = "rr(" ++ MS ++ ", '_', {d,test1}).", + ?line [[state]] = scan(RR4), + + Test = filename:join(?config(priv_dir, Config), "test.erl"), + Contents = <<"-module(test). + -record(state, {bin, reply, leader}). + + -ifdef(test1). + -record(test1, {f}). + -endif. + + -ifdef(test2). + -record(test2, {g}). + -endif.">>, + ?line ok = file:write_file(Test, Contents), + + RR5 = "rr(\"" ++ Test ++ "\", '_', {d,test1}), rl([test1,test2]).", + ?line [{attribute,1,record,{test1,_}},ok] = scan(RR5), + RR6 = "rr(\"" ++ Test ++ "\", '_', {d,test2}), rl([test1,test2]).", + ?line [{attribute,1,record,{test2,_}},ok] = scan(RR6), + RR7 = "rr(\"" ++ Test ++ + "\", '_', [{d,test1},{d,test2,17}]), rl([test1,test2]).", + ?line [{attribute,1,record,{test1,_}},{attribute,1,record,{test2,_}}, + ok] = scan(RR7), + ?line PreReply = scan(<<"rr(prim_file).">>), % preloaded... + ?line true = is_list(PreReply), + ?line Dir = filename:join(?config(priv_dir, Config), "*.erl"), + ?line RR8 = "rp(rr(\"" ++ Dir ++ "\")).", + ?line [_,ok] = scan(RR8), + file:delete(Test), + + RR1000 = "begin rr(" ++ MS ++ ") end.", + ?line [_] = scan(RR1000), + RR1001 = "begin rr(" ++ MS ++ ", state) end.", + ?line [_] = scan(RR1001), + RR1002 = "begin rr(" ++ MS ++ ", state,{i,'.'}) end.", + ?line [_] = scan(RR1002), + + ?line [{error,nofile}] = scan(<<"rr(not_a_module).">>), + ?line [{error,invalid_filename}] = scan(<<"rr({foo}).">>), + ?line [[]] = scan(<<"rr(\"not_a_file\").">>), + + %% using records + ?line [2] = scan(<<"rd(foo,{bar}), record_info(size, foo).">>), + ?line [true] = scan(<<"rd(foo,{bar}), is_record(#foo{}, foo).">>), + ?line [true] = scan(<<"rd(foo,{bar}), erlang:is_record(#foo{}, foo).">>), + ?line [true] = scan(<<"rd(foo,{bar}), + fun() when record(#foo{},foo) -> true end().">>), + ?line [2] = scan(<<"rd(foo,{bar}), #foo.bar.">>), + ?line "#foo{bar = 17}.\n" = + t(<<"rd(foo,{bar}), A = #foo{}, A#foo{bar = 17}.">>), + + %% test of is_record/2 in lc + ?line "[#foo{bar = 3}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "is_record(X, foo)].">>), + ?line "[x,[],{a,b}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "not is_record(X, foo)].">>), + ?line "[#foo{bar = 3}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "begin is_record(X, foo) end].">>), + ?line "[x,[],{a,b}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "begin not is_record(X, foo) end].">>), + + ?line "[#foo{bar = 3},x,[],{a,b}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "is_record(X, foo) or not is_binary(X)].">>), + ?line "[#foo{bar = 3},x,[],{a,b}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "not is_record(X, foo) or not is_binary(X)].">>), + ?line "[#foo{bar = 3}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "is_record(X, foo) or is_reference(X)].">>), + ?line "[x,[],{a,b}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "not is_record(X, foo) or is_reference(X)].">>), + + ?line "[#foo{bar = 3},x,[],{a,b}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "begin is_record(X, foo) or not is_binary(X) end].">>), + ?line "[#foo{bar = 3},x,[],{a,b}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "begin not is_record(X, foo) or not is_binary(X) end].">>), + ?line "[#foo{bar = 3}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "begin is_record(X, foo) or is_reference(X) end].">>), + ?line "[x,[],{a,b}].\n" = + t(<<"rd(foo,{bar}), [X || X <- [#foo{bar=3},x,[],{a,b}]," + "begin not is_record(X, foo) or is_reference(X) end].">>), + + ?line [ok] = + scan(<<"rd(a,{}), is_record({a},a) andalso true, b().">>), + + %% nested record defs + ?line "#b{a = #a{}}.\n" = t(<<"rd(a,{}), rd(b, {a = #a{}}), #b{}.">>), + + ?line [ok,ok,ok] = scan(<<"rf('_'), rp(rp(rl(rf(rf(rf(rl())))))).">>), + + ok. + +known_bugs(doc) -> + ["Known bugs."]; +known_bugs(suite) -> + []; +known_bugs(Config) when is_list(Config) -> + %% erl_eval:merge_bindings/2 cannot handle _removal_ of bindings. + ?line [3] = scan(<<"A = 3, length(begin f(A), [3] end), A.">>), + ok. + +otp_5226(doc) -> + ["OTP-5226. Wildcards accepted when reading BEAM files using rr/1,2,3."]; +otp_5226(suite) -> + []; +otp_5226(Config) when is_list(Config) -> + Test1 = <<"-module(test1). + -record('_test1', {a,b}).">>, + Test2 = <<"-module(test2). + -record('_test2', {c,d}).">>, + ?line File1 = filename("test1.erl", Config), + ?line File2 = filename("test2.erl", Config), + ?line Beam = filename("*.beam", Config), + ?line ok = compile_file(Config, File1, Test1, [no_debug_info]), + ?line ok = compile_file(Config, File2, Test2, [no_debug_info]), + RR = "rr(\"" ++ Beam ++ "\").", + ?line [Recs] = scan(RR), + ?line true = lists:member('_test1', Recs), + ?line true = lists:member('_test2', Recs), + file:delete(filename("test1.beam", Config)), + file:delete(filename("test2.beam", Config)), + file:delete(File1), + file:delete(File2), + ok. + +otp_5327(doc) -> + ["OTP-5226. Test of eval_bits, mostly."]; +otp_5327(suite) -> + []; +otp_5327(Config) when is_list(Config) -> + ?line "exception error: bad argument" = + comm_err(<<"<<\"hej\":default>>.">>), + ?line <<"abc">> = + erl_parse:normalise({bin,1,[{bin_element,1,{string,1,"abc"}, + default,default}]}), + ?line [<<"abc">>] = scan(<<"<<(<<\"abc\">>):3/binary>>.">>), + ?line [<<"abc">>] = scan(<<"<<(<<\"abc\">>)/binary>>.">>), + ?line "exception error: bad argument" = + comm_err(<<"<<(<<\"abc\">>):4/binary>>.">>), + ?line true = byte_size(hd(scan("<<3.14:64/float>>."))) =:= 8, + ?line true = byte_size(hd(scan("<<3.14:32/float>>."))) =:= 4, + ?line "exception error: bad argument" = + comm_err(<<"<<3.14:128/float>>.">>), + ?line "exception error: bad argument" = + comm_err(<<"<<10:default>>.">>), + ?line [<<98,1:1>>] = scan(<<"<<3:3,5:6>>.">>), + ?line {'EXIT',{badarg,_}} = + (catch erl_parse:normalise({bin,1,[{bin_element,1,{integer,1,17}, + {atom,1,all}, + default}]})), + ?line [<<-20/signed>>] = scan(<<"<<-20/signed>> = <<-20>>.">>), + ?line [<<-300:16/signed>>] = + scan(<<"<<-300:16/signed>> = <<-300:16>>.">>), + ?line [<<-1000:24/signed>>] = + scan(<<"<<-1000:24/signed>> = <<-1000:24>>.">>), + ?line [<<-(1 bsl 29):32/signed>>] = + scan(<<"<<-(1 bsl 29):32/signed>> = <<-(1 bsl 29):32>>.">>), + + ?line "exception error: no match of right hand side value <<0,0,0>>" = + comm_err(<<"<> = <<0:24>>.">>), + ?line true = [<<103133:64/float>>] =:= + scan(<<"<<103133:64/float>> = <<103133:64/float>>.">>), + ?line true = [<<103133.0:64/float>>] =:= + scan(<<"<<103133.0:64/float>> = <<103133:64/float>>.">>), + ?line true = [<<103133:64/float>>] =:= scan(<<"<<103133:64/float>>.">>), + Int = 17, + ?line true = [<>] =:= scan(<<"Int = 17, <>.">>), + ?line "exception error: no match of right hand side value" ++ _ = + comm_err(<<"<<103133:64/binary>> = <<103133:64/float>>.">>), + ?line "exception error: interpreted function with arity 1 called with two arguments" = + comm_err(<<"(fun(X) -> X end)(a,b).">>), + ?line {'EXIT', {{illegal_pattern,_}, _}} = + (catch evaluate("<> = <<17:32>>.", [])), + C = <<" + <> = <<\"hej\">>, + case <<7:4,A:4,B:4,C:4,D:4,E:4,F:4,3:4>> of + <<_:4,\"hej\",3:4>> -> 1; + _ -> 2 + end. + ">>, + ?line 1 = evaluate(C, []), + %% unbound_var would be nicer... + ?line {'EXIT',{{illegal_pattern,_},_}} = + (catch evaluate(<<"<> = <<17:32>>.">>, [])), + %% undefined_bittype is turned into badmatch: + ?line {'EXIT',{{badmatch,<<17:32>>},_}} = + (catch evaluate(<<"<> = <<17:32>>.">>, [])), + ?line {'EXIT',_} = + (catch evaluate(<<"<<17/binary-unit:8-unit:16>>.">>, [])), + ?line {'EXIT',_} = + (catch evaluate(<<"<<17:32/unsigned-signed>> = <<17:32>>.">>, [])), + ?line {'EXIT',_} = + (catch evaluate(<<"<<17:32/unsigned-signed>>.">>, [])), + ?line <<17:32>> = evaluate(<<"<<17:32/signed-signed>>.">>, []), + ?line {'EXIT',_} = + (catch evaluate(<<"<<32/unit:8>>.">>, [])), + ok. + +otp_5435(doc) -> + ["OTP-5435. sys_pre_expand not in the path."]; +otp_5435(suite) -> + []; +otp_5435(Config) when is_list(Config) -> + ?line true = <<103133:64/float>> =:= + evaluate(<<"<<103133:64/float>> = <<103133:64/float>>.">>, []), + ?line true = <<103133.0:64/float>> =:= + evaluate(<<"<<103133.0:64/float>> = <<103133:64/float>>.">>, []), + ?line true = is_alive(), + ?line {ok, Node} = start_node(shell_SUITE_otp_5435), + ?line ok = rpc:call(Node, ?MODULE, otp_5435_2, []), + ?line ?t:stop_node(Node), + ok. + +start_node(Name) -> + ?line PA = filename:dirname(code:which(?MODULE)), + ?t:start_node(Name, slave, [{args, "-pa " ++ PA}]). + +otp_5435_2() -> + ?line true = code:del_path(compiler), + %% sys_pre_expand can no longer be found + %% OTP-5876. But erl_expand_records can! + ?line [{attribute,_,record,{bar,_}},ok] = + scan(<<"rd(foo,{bar}), + rd(bar,{foo = (#foo{})#foo.bar}), + rl(bar).">>), + ok. + +otp_5195(doc) -> + ["OTP-5195. QLC, mostly."]; +otp_5195(suite) -> + []; +otp_5195(Config) when is_list(Config) -> + %% QLC. It was easier to put these cases here than in qlc_SUITE. + ?line "[#a{b = undefined}].\n" = + t(<<"rd(a,{b}), qlc:e(qlc:q([X || X <- [#a{}],is_record(X, a)])).">>), + + %% An experimental shell used to translate error tuples: + %% "(qlc) \"1: generated variable 'X' must not be used in " + %% "list expression\".\n" = + %% t(<<"qlc:q([X || X <- [{a}], Y <- [X]]).">>), + %% Same as last one (if the shell does not translate error tuples): + ?line [{error,qlc,{1,qlc,{used_generator_variable,'X'}}}] = + scan(<<"qlc:q([X || X <- [{a}], Y <- [X]]).">>), + ?line {error,qlc,{1,qlc,{used_generator_variable,'X'}}} = + evaluate(<<"qlc:q([X || X <- [{a}], Y <- [X]]).">>, []), + Ugly = <<"qlc:e(qlc:q([X || X <- qlc:append([[1,2,3],ugly()])])).">>, + ?line "undefined shell command ugly/0" = error_string(Ugly), + ?line {'EXIT',{undef,_}} = (catch evaluate(Ugly, [])), + + V_1 = <<"qlc:e(qlc:q([X || X <- qlc:append([[1,2,3],v(-1)])])).">>, + ?line "- 1: command not found" = comm_err(V_1), + ?line {'EXIT', {undef,_}} = (catch evaluate(V_1, [])), + + ?line "1\n2\n3\n3.\n" = + t(<<"1. 2. 3. 3 = fun(A) when A =:= 2 -> v(3) end(v(2)).">>), + + ?line List4 = t(<<"[a,list]. A = [1,2]. " + "qlc:q([X || X <- qlc:append(A, v(1))]). " + "[1,2,a,list] = qlc:e(v(-1)).">>), + ?line "[1,2,a,list].\n" = string:substr(List4, string:len(List4)-13), + + ok. + +otp_5915(doc) -> + ["OTP-5915. Strict record tests in guards."]; +otp_5915(suite) -> + []; +otp_5915(Config) when is_list(Config) -> + C = <<" + rd(r, {a = 4,b}), + rd(r1, {a,b}), + rd(r2, {a = #r1{},b,c=length([1,2,3])}), + rd(r3, {a = fun(_) -> #r1{} end(1), b}), + + foo = fun(A) when A#r1.a > A#r1.b -> foo end(#r1{b = 2}), + 0 = fun(A) when A#r2.a -> 0 end(#r2{a = true}), + 1 = fun(A) when (#r1{a = A})#r1.a > 2 -> 1 end(3), + 2 = fun(N) when ((#r2{a = #r{a = 4}, b = length([a,b,c])})#r2.a)#r.a > N -> + 2 end(2), + 3 = fun(A) when (A#r2.a)#r1.a =:= 3 -> 3 end(#r2{a = #r1{a = 3}}), + ok = fun() -> + F = fun(A) when record(A#r.a, r1) -> 4; + (A) when record(A#r1.a, r1) -> 5 + end, + 5 = F(#r1{a = #r1{}}), + 4 = F(#r{a = #r1{}}), + ok + end(), + 3 = fun(A) when record(A#r1.a, r), + (A#r1.a)#r.a > 3 -> 3 + end(#r1{a = #r{a = 4}}), + 7 = fun(A) when record(A#r3.a, r1) -> 7 end(#r3{}), + [#r1{a = 2,b = 1}] = + fun() -> + [A || A <- [#r1{a = 1, b = 3}, + #r2{a = 2,b = 1}, + #r1{a = 2, b = 1}], + A#r1.a > + A#r1.b] + end(), + {[_],b} = + fun(L) -> + %% A is checked only once: + R1 = [{A,B} || A <- L, A#r1.a, B <- L, A#r1.b], + A = #r2{a = true}, + %% A is checked again: + B = if A#r1.a -> a; true -> b end, + {R1,B} + end([#r1{a = true, b = true}]), + + p = fun(A) when (A#r1.a =:= 2) or (A#r2.a =:= 1) -> o; + (_) -> p + end(#r1{a = 2}), + + o = fun(A) when (A#r1.a =:= 2) orelse (A#r2.a =:= 1) -> o; + (_) -> p + end(#r1{a = 2}), + + 3 = fun(A) when A#r1.a > 3, + record(A, r1) -> 3 + end(#r1{a = 5}), + + ok = fun() -> + F = fun(A) when (A#r2.a =:= 1) orelse (A#r2.a) -> 2; + (A) when (A#r1.a =:= 1) orelse (A#r1.a) -> 1; + (A) when (A#r2.a =:= 2) andalso (A#r2.b) -> 3 + end, + 1 = F(#r1{a = 1}), + 2 = F(#r2{a = true}), + 3 = F(#r2{a = 2, b = true}), + ok + end(), + + b = fun(A) when false or not (A#r.a =:= 1) -> a; + (_) -> b + end(#r1{a = 1}), + b = fun(A) when not (A#r.a =:= 1) or false -> a; + (_) -> b + end(#r1{a = 1}), + + ok = fun() -> + F = fun(A) when not (A#r.a =:= 1) -> yes; + (_) -> no + end, + no = F(#r1{a = 2}), + yes = F(#r{a = 2}), + no = F(#r{a = 1}), + ok + end(), + + a = fun(A) when record(A, r), + A#r.a =:= 1, + A#r.b =:= 2 ->a + end(#r{a = 1, b = 2}), + a = fun(A) when erlang:is_record(A, r), + A#r.a =:= 1, + A#r.b =:= 2 -> a + end(#r{a = 1, b = 2}), + a = fun(A) when is_record(A, r), + A#r.a =:= 1, + A#r.b =:= 2 -> a + end(#r{a = 1, b = 2}), + + nop = fun(A) when (is_record(A, r1) and (A#r1.a > 3)) or (A#r2.a < 1) -> + japp; + (_) -> + nop + end(#r2{a = 0}), + nop = fun(A) when (A#r1.a > 3) or (A#r2.a < 1) -> japp; + (_) -> + nop + end(#r2{a = 0}), + + ok = fun() -> + F = fun(A) when (A#r1.a =:= 2) or (A#r2.a =:= 1) -> o; + (_) -> p + end, + p = F(#r2{a = 1}), + p = F(#r1{a = 2}), + ok + end(), + + ok = fun() -> + F = fun(A) when fail, A#r1.a; A#r1.a -> ab; + (_) -> bu + end, + ab = F(#r1{a = true}), + bu = F(#r2{a = true}), + ok + end(), + + both = fun(A) when A#r.a, A#r.b -> both + end(#r{a = true, b = true}), + + ok = fun() -> + F = fun(A, B) when ((A#r1.a) orelse (B#r2.a)) + or (B#r2.b) or (A#r1.b) -> true; + (_, _) -> false + end, + true = F(#r1{a = false, b = false}, #r2{a = false, b = true}), + false = F(#r1{a = true, b = true}, #r1{a = false, b = true}), + ok + end(), + + ok.">>, + [ok] = scan(C), + ok. + +otp_5916(doc) -> + ["OTP-5916. erlang:is_record/3 allowed in guards."]; +otp_5916(suite) -> + []; +otp_5916(Config) when is_list(Config) -> + C = <<" + rd(r1, {a,b}), + rd(r2, {a,b}), + + true = if erlang:is_record(#r1{},r1,3) -> true; true -> false end, + false = if erlang:is_record(#r2{},r1,3) -> true; true -> false end, + + true = if is_record(#r1{},r1,3) -> true; true -> false end, + false = if is_record(#r2{},r1,3) -> true; true -> false end, + + true = if {erlang,is_record}(#r1{},r1,3) -> true; true -> false end, + false = if {erlang,is_record}(#r2{},r1,3) -> true; true -> false end, + + ok.">>, + [ok] = scan(C), + ok. + +bits(suite) -> + [bs_match_misc_SUITE, % bs_match_int_SUITE/, + bs_match_tail_SUITE, bs_match_bin_SUITE, bs_construct_SUITE]. + +bs_match_misc_SUITE(doc) -> + ["OTP-5327. Adopted from parts of emulator/test/bs_match_misc_SUITE.erl."]; +bs_match_misc_SUITE(suite) -> + []; +bs_match_misc_SUITE(Config) when is_list(Config) -> + C = <<" + F1 = fun() -> 3.1415 end, + + FOne = fun() -> 1.0 end, + + Fcmp = fun(F1, F2) when (F1 - F2) / F2 < 0.0000001 -> ok end, + + MakeSubBin = fun(Bin0) -> + Sz = size(Bin0), + Bin1 = <<37,Bin0/binary,38,39>>, + <<_:8,Bin:Sz/binary,_:8,_:8>> = Bin1, + Bin + end, + + MatchFloat = + fun(Bin0, Fsz, I) -> + Bin = MakeSubBin(Bin0), + Bsz = size(Bin) * 8, + Tsz = Bsz - Fsz - I, + <<_:I,F:Fsz/float,_:Tsz>> = Bin, + F + end, + + TFloat = fun() -> + F = F1(), + G = FOne(), + + G = MatchFloat(<<63,128,0,0>>, 32, 0), + G = MatchFloat(<<63,240,0,0,0,0,0,0>>, 64, 0), + + Fcmp(F, MatchFloat(<>, 32, 0)), + Fcmp(F, MatchFloat(<>, 64, 0)), + Fcmp(F, MatchFloat(<<1:1,F:32/float,127:7>>, 32, 1)), + Fcmp(F, MatchFloat(<<1:1,F:64/float,127:7>>, 64, 1)), + Fcmp(F, MatchFloat(<<1:13,F:32/float,127:3>>, 32, 13)), + Fcmp(F, MatchFloat(<<1:13,F:64/float,127:3>>, 64, 13)) + end, + TFloat(), + + F2 = fun() -> 2.7133 end, + + MatchFloatLittle = fun(Bin0, Fsz, I) -> + Bin = MakeSubBin(Bin0), + Bsz = size(Bin) * 8, + Tsz = Bsz - Fsz - I, + <<_:I,F:Fsz/float-little,_:Tsz>> = Bin, + F + end, + + LittleFloat = fun() -> + F = F2(), + G = FOne(), + + G = MatchFloatLittle(<<0,0,0,0,0,0,240,63>>, 64, 0), + G = MatchFloatLittle(<<0,0,128,63>>, 32, 0), + + Fcmp(F, MatchFloatLittle(<>, 32, 0)), + Fcmp(F, MatchFloatLittle(<>, 64, 0)), + Fcmp(F, MatchFloatLittle(<<1:1,F:32/float-little,127:7>>, 32, 1)), + Fcmp(F, MatchFloatLittle(<<1:1,F:64/float-little,127:7>>, 64, 1)), + Fcmp(F, MatchFloatLittle(<<1:13,F:32/float-little,127:3>>, 32, 13)), + Fcmp(F, MatchFloatLittle(<<1:13,F:64/float-little,127:3>>, 64, 13)) + end, + LittleFloat(), + + Sean1 = fun(<>) when size(B) < 4 -> small; + (<<1, _B/binary>>) -> large + end, + + Sean = fun() -> + small = Sean1(<<>>), + small = Sean1(<<1>>), + small = Sean1(<<1,2>>), + small = Sean1(<<1,2,3>>), + large = Sean1(<<1,2,3,4>>), + + small = Sean1(<<4>>), + small = Sean1(<<4,5>>), + small = Sean1(<<4,5,6>>), + {'EXIT',{function_clause,_}} = (catch Sean1(<<4,5,6,7>>)) + end, + Sean(), + + NativeBig = fun() -> + <<37.33:64/native-float>> = <<37.33:64/big-float>>, + <<3974:16/native-integer>> = <<3974:16/big-integer>> + end, + + NativeLittle = fun() -> + <<37869.32343:64/native-float>> = <<37869.32343:64/little-float>>, + <<7974:16/native-integer>> = <<7974:16/little-integer>> + end, + + Native = fun() -> + <<3.14:64/native-float>> = <<3.14:64/native-float>>, + <<333:16/native>> = <<333:16/native>>, + <<38658345:32/native>> = <<38658345:32/native>>, + case <<1:16/native>> of + <<0,1>> -> NativeBig(); + <<1,0>> -> NativeLittle() + end + end, + Native(), + + Split = fun(<>) -> {B,T} end, + + Split2 = fun(N, <>) -> {B,T} end, + + Split_2 = fun(<>) -> {B,T} end, + + Skip = fun(<>) -> T end, + + SizeVar = fun() -> + {<<45>>,<<>>} = Split(<<1:16,45>>), + {<<45>>,<<46,47>>} = Split(<<1:16,45,46,47>>), + {<<45,46>>,<<47>>} = Split(<<2:16,45,46,47>>), + + {<<45,46,47>>,<<48>>} = Split_2(<<16:8,3:16,45,46,47,48>>), + + {<<45,46>>,<<47>>} = Split2(2, <<2:16,45,46,47>>), + {'EXIT',{function_clause,_}} = + (catch Split2(42, <<2:16,45,46,47>>)), + + <<\"cdef\">> = Skip(<<2:8,\"abcdef\">>) + end, + SizeVar(), + + Wcheck = fun(<>) when A==3-> ok1; + (<<_,_:2/binary>>) -> ok2; + (<<_>>) -> ok3; + (Other) -> {error,Other} + end, + + Wiger = fun() -> + ok1 = Wcheck(<<3>>), + ok2 = Wcheck(<<1,2,3>>), + ok3 = Wcheck(<<4>>), + {error,<<1,2,3,4>>} = Wcheck(<<1,2,3,4>>), + {error,<<>>} = Wcheck(<<>>) + end, + Wiger(), + + ok. + ">>, + [ok] = scan(C), + ok = evaluate(C, []). + +%% This one is not run during night builds since it takes several minutes. +bs_match_int_SUITE(doc) -> + ["OTP-5327. Adopted from emulator/test/bs_match_int_SUITE.erl."]; +bs_match_int_SUITE(suite) -> + []; +bs_match_int_SUITE(Config) when is_list(Config) -> + C = <<" + FunClause = fun({'EXIT',{function_clause,_}}) -> ok end, + + Mkbin = fun(L) when list(L) -> list_to_binary(L) end, + + GetInt1 = fun(<>) -> I; + (<>) -> I; + (<>) -> I; + (<>) -> I; + (<>) -> I + end, + + GetInt2 = fun(Bin0, I, F) when size(Bin0) < 4 -> + Bin = <<0,Bin0/binary>>, + I = GetInt1(Bin), + F(Bin, I, F); + (_, I, _F) -> I + end, + + GetInt = fun(Bin) -> + I = GetInt1(Bin), + GetInt2(Bin, I, GetInt2) + end, + + + Cmp128 = fun(<>, I) -> equal; + (_, _) -> not_equal + end, + + Uint2 = fun([H|T], Acc, F) -> F(T, Acc bsl 8 bor H, F); + ([], Acc, _F) -> Acc + end, + + Uint = fun(L) -> Uint2(L, 0, Uint2) end, + + Integer = fun() -> + 0 = GetInt(Mkbin([])), + 0 = GetInt(Mkbin([0])), + 42 = GetInt(Mkbin([42])), + 255 = GetInt(Mkbin([255])), + 256 = GetInt(Mkbin([1,0])), + 257 = GetInt(Mkbin([1,1])), + 258 = GetInt(Mkbin([1,2])), + 258 = GetInt(Mkbin([1,2])), + 65534 = GetInt(Mkbin([255,254])), + 16776455 = GetInt(Mkbin([255,253,7])), + 4245492555 = GetInt(Mkbin([253,13,19,75])), + 4294967294 = GetInt(Mkbin([255,255,255,254])), + 4294967295 = GetInt(Mkbin([255,255,255,255])), + Eight = [200,1,19,128,222,42,97,111], + Cmp128(Eight, Uint(Eight)), + FunClause(catch GetInt(Mkbin(lists:seq(1,5)))) + end, + Integer(), + + Sint = fun(Bin) -> + case Bin of + <> -> I; + <> -> I; + Other -> {no_match,Other} + end + end, + + SignedInteger = fun() -> + {no_match,_} = Sint(Mkbin([])), + {no_match,_} = Sint(Mkbin([1,2,3])), + 127 = Sint(Mkbin([127])), + -1 = Sint(Mkbin([255])), + -128 = Sint(Mkbin([128])), + 42 = Sint(Mkbin([42,255])), + 127 = Sint(Mkbin([127,255])) + end, + SignedInteger(), + + Dynamic5 = fun(Bin, S1, S2, A, B) -> + case Bin of + <> -> + % io:format(\"~p ~p ~p ~p~n\", [S1,S2,A,B]), + ok; + _Other -> erlang:error(badmatch, [Bin,S1,S2,A,B]) + end + end, + + Dynamic2 = fun(Bin, S1, F) when S1 >= 0 -> + S2 = size(Bin) * 8 - S1, + Dynamic5(Bin, S1, S2, (1 bsl S1) - 1, (1 bsl S2) - 1), + F(Bin, S1-1, F); + (_, _, _) -> ok + end, + + Dynamic = fun(Bin, S1) -> + Dynamic2(Bin, S1, Dynamic2) + end, + + Dynamic(Mkbin([255]), 8), + Dynamic(Mkbin([255,255]), 16), + Dynamic(Mkbin([255,255,255]), 24), + Dynamic(Mkbin([255,255,255,255]), 32), + + BigToLittle4 = + fun([B0,B1,B2,B3,B4,B5,B6,B7|T], N, Acc, F) when N >= 8 -> + F(T, N-8, [B0,B1,B2,B3,B4,B5,B6,B7|Acc], F); + (List, N, Acc, _F) -> lists:sublist(List, 1, N) ++ Acc + end, + + BigToLittle = + fun(List, N) -> BigToLittle4(List, N, [], BigToLittle4) end, + + ReversedSublist = + fun(_List, 0, Acc, _F) -> Acc; + ([H|T], N, Acc, F) -> F(T, N-1, [H|Acc], F) + end, + + TwoComplementAndReverse = + fun([H|T], Carry, Acc, F) -> + Sum = 1-H+Carry, + F(T, Sum div 2, [Sum rem 2|Acc], F); + ([], Carry, Acc, _F) -> [Carry|Acc] + end, + + MakeInt = fun(_List, 0, Acc, _F) -> Acc; + ([H|T], N, Acc, F) -> F(T, N-1, Acc bsl 1 bor H, F) + end, + + MakeSignedInt = + fun(_List, 0) -> 0; + ([0|_]=List, N) -> MakeInt(List, N, 0, MakeInt); + ([1|_]=List0, N) -> + List1 = ReversedSublist(List0, N, [], ReversedSublist), + List2 = TwoComplementAndReverse(List1, 1, [], + TwoComplementAndReverse), + -MakeInt(List2, length(List2), 0, MakeInt) + end, + + BitsToList = + fun([H|T], 0, F) -> F(T, 16#80, F); + ([H|_]=List, Mask, F) -> + [case H band Mask of + 0 -> 0; + _ -> 1 + end | F(List, Mask bsr 1, F)]; + ([], _, _F) -> [] + end, + + MoreDynamic3 = + fun(Action, Bin, List, Bef, Aft, F) when Bef =< Aft -> + Action(Bin, List, Bef, Aft-Bef), + F(Action, Bin, List, Bef, Aft-1, F); + (_, _, _, _, _, _) -> ok + end, + + MoreDynamic2 = + fun(Action, Bin, [_|T]=List, Bef, F) -> + MoreDynamic3(Action, Bin, List, Bef, size(Bin)*8, + MoreDynamic3), + F(Action, Bin, T, Bef+1, F); + (_, _, [], _, _F) -> ok + end, + + MoreDynamic1 = + fun(Action, Bin) -> + BitList = BitsToList(binary_to_list(Bin),16#80,BitsToList), + MoreDynamic2(Action, Bin, BitList, 0, MoreDynamic2) + end, + + MoreDynamic = fun() -> + % Unsigned big-endian numbers. + Unsigned = fun(Bin, List, SkipBef, N) -> + SkipAft = 8*size(Bin) - N - SkipBef, + <<_:SkipBef,Int:N,_:SkipAft>> = Bin, + Int = MakeInt(List, N, 0, MakeInt) + end, + MoreDynamic1(Unsigned, erlang:md5(Mkbin([42]))), + + %% Signed big-endian numbers. + Signed = fun(Bin, List, SkipBef, N) -> + SkipAft = 8*size(Bin) - N - SkipBef, + <<_:SkipBef,Int:N/signed,_:SkipAft>> = Bin, + case MakeSignedInt(List, N) of + Int -> ok; + Other -> + io:format(\"Bin = ~p,\", [Bin]), + io:format(\"SkipBef = ~p, N = ~p\", + [SkipBef,N]), + io:format(\"Expected ~p, got ~p\", + [Int,Other]) + end + end, + MoreDynamic1(Signed, erlang:md5(Mkbin([43]))), + + %% Unsigned little-endian numbers. + UnsLittle = fun(Bin, List, SkipBef, N) -> + SkipAft = 8*size(Bin) - N - SkipBef, + <<_:SkipBef,Int:N/little,_:SkipAft>> = Bin, + Int = MakeInt(BigToLittle(List, N), N, 0, + MakeInt) + end, + MoreDynamic1(UnsLittle, erlang:md5(Mkbin([44]))), + + %% Signed little-endian numbers. + SignLittle = fun(Bin, List, SkipBef, N) -> + SkipAft = 8*size(Bin) - N - SkipBef, + <<_:SkipBef,Int:N/signed-little,_:SkipAft>> = Bin, + Little = BigToLittle(List, N), + Int = MakeSignedInt(Little, N) + end, + MoreDynamic1(SignLittle, erlang:md5(Mkbin([45]))) + end, + MoreDynamic(), + + ok. + ">>, + [ok] = scan(C), + ok = evaluate(C, []). + +bs_match_tail_SUITE(doc) -> + ["OTP-5327. Adopted from emulator/test/bs_match_tail_SUITE.erl."]; +bs_match_tail_SUITE(suite) -> + []; +bs_match_tail_SUITE(Config) when is_list(Config) -> + C = <<" + GetTailUsed = fun(<>) -> {A,T} end, + + GetTailUnused = fun(<>) -> A end, + + GetDynTailUsed = fun(Bin, Sz) -> + <> = Bin, + {A,T} + end, + + GetDynTailUnused = fun(Bin, Sz) -> + <> = Bin, + A + end, + + Mkbin = fun(L) when list(L) -> list_to_binary(L) end, + + TestZeroTail = fun(<>) -> A end, + + TestZeroTail2 = fun(<<_A:4,_B:4>>) -> ok end, + + ZeroTail = fun() -> + 7 = (catch TestZeroTail(Mkbin([7]))), + {'EXIT',{function_clause,_}} = + (catch TestZeroTail(Mkbin([1,2]))), + {'EXIT',{function_clause,_}} = + (catch TestZeroTail2(Mkbin([1,2,3]))) + end, + ZeroTail(), + + AlGetTailUsed = fun(<>) -> {A,T} end, + + AlGetTailUnused = fun(<>) -> A end, + + Aligned = fun() -> + Tail1 = Mkbin([]), + {258,Tail1} = AlGetTailUsed(Mkbin([1,2])), + Tail2 = Mkbin(lists:seq(1, 127)), + {35091,Tail2} = AlGetTailUsed(Mkbin([137,19|Tail2])), + + 64896 = AlGetTailUnused(Mkbin([253,128])), + 64895 = AlGetTailUnused(Mkbin([253,127|lists:seq(42, 255)])), + + Tail3 = Mkbin(lists:seq(0, 19)), + {0,Tail1} = GetDynTailUsed(Tail1, 0), + {0,Tail3} = GetDynTailUsed(Mkbin([Tail3]), 0), + {73,Tail3} = GetDynTailUsed(Mkbin([73|Tail3]), 8), + + 0 = GetDynTailUnused(Mkbin([]), 0), + 233 = GetDynTailUnused(Mkbin([233]), 8), + 23 = GetDynTailUnused(Mkbin([23,22,2]), 8) + end, + Aligned(), + + UnAligned = fun() -> + {'EXIT',{function_clause,_}} = + (catch GetTailUsed(Mkbin([42]))), + {'EXIT',{{badmatch,_},_}} = + (catch GetDynTailUsed(Mkbin([137]), 3)), + {'EXIT',{function_clause,_}} = + (catch GetTailUnused(Mkbin([42,33]))), + {'EXIT',{{badmatch,_},_}} = + (catch GetDynTailUnused(Mkbin([44]), 7)) + end, + UnAligned(), + ok. + ">>, + [ok] = scan(C), + ok = evaluate(C, []). + +bs_match_bin_SUITE(doc) -> + ["OTP-5327. Adopted from emulator/test/bs_match_bin_SUITE.erl."]; +bs_match_bin_SUITE(suite) -> + []; +bs_match_bin_SUITE(Config) when is_list(Config) -> + ByteSplitBinary = + <<"ByteSplit = + fun(L, B, Pos, Fun) when Pos >= 0 -> + Sz1 = Pos, + Sz2 = size(B) - Pos, + <> = B, + B1 = list_to_binary(lists:sublist(L, 1, Pos)), + B2 = list_to_binary(lists:nthtail(Pos, L)), + Fun(L, B, Pos-1, Fun); + (L, B, _, _Fun) -> ok + end, + Mkbin = fun(L) when list(L) -> list_to_binary(L) end, + L = lists:seq(0, 57), + B = Mkbin(L), + ByteSplit(L, B, size(B), ByteSplit), + Id = fun(I) -> I end, + MakeUnalignedSubBinary = + fun(Bin0) -> + Bin1 = <<0:3,Bin0/binary,31:5>>, + Sz = size(Bin0), + <<0:3,Bin:Sz/binary,31:5>> = Id(Bin1), + Bin + end, + Unaligned = MakeUnalignedSubBinary(B), + ByteSplit(L, Unaligned, size(Unaligned), ByteSplit), + ok. + ">>, + [ok] = scan(ByteSplitBinary), + ok = evaluate(ByteSplitBinary, []), + BitSplitBinary = + <<"Mkbin = fun(L) when list(L) -> list_to_binary(L) end, + + MakeInt = + fun(List, 0, Acc, _F) -> Acc; + ([H|T], N, Acc, F) -> F(T, N-1, Acc bsl 1 bor H, F) + end, + + MakeBinFromList = + fun(List, 0, _F) -> Mkbin([]); + (List, N, F) -> + list_to_binary([MakeInt(List, 8, 0, MakeInt), + F(lists:nthtail(8, List), N-8, F)]) + end, + + BitSplitBinary3 = + fun(Action, Bin, List, Bef, Aft, F) when Bef =< Aft -> + Action(Bin, List, Bef, (Aft-Bef) div 8 * 8), + F(Action, Bin, List, Bef, Aft-8, F); + (_, _, _, _, _, _) -> ok + end, + + BitSplitBinary2 = + fun(Action, Bin, [_|T]=List, Bef, F) -> + BitSplitBinary3(Action, Bin, List, Bef, size(Bin)*8, + BitSplitBinary3), + F(Action, Bin, T, Bef+1, F); + (Action, Bin, [], Bef, F) -> ok + end, + + BitsToList = + fun([H|T], 0, F) -> F(T, 16#80, F); + ([H|_]=List, Mask, F) -> + [case H band Mask of + 0 -> 0; + _ -> 1 + end | F(List, Mask bsr 1, F)]; + ([], _, _F) -> [] + end, + + BitSplitBinary1 = + fun(Action, Bin) -> + BitList = BitsToList(binary_to_list(Bin), 16#80, + BitsToList), + BitSplitBinary2(Action, Bin, BitList, 0, BitSplitBinary2) + end, + + Fun = fun(Bin, List, SkipBef, N) -> + SkipAft = 8*size(Bin) - N - SkipBef, + <> = Bin, + OutBin = MakeBinFromList(List, N, MakeBinFromList) + end, + + BitSplitBinary1(Fun, erlang:md5(<<1,2,3>>)), + Id = fun(I) -> I end, + MakeUnalignedSubBinary = + fun(Bin0) -> + Bin1 = <<0:3,Bin0/binary,31:5>>, + Sz = size(Bin0), + <<0:3,Bin:Sz/binary,31:5>> = Id(Bin1), + Bin + end, + BitSplitBinary1(Fun, MakeUnalignedSubBinary(erlang:md5(<<1,2,3>>))), + ok. + ">>, + [ok] = scan(BitSplitBinary), + ok = evaluate(BitSplitBinary, []). + +-define(FAIL(Expr), "{'EXIT',{badarg,_}} = (catch " ??Expr ")"). + +-define(COF(Int0), + "(fun(Int) -> + true = <> =:= <<(float(Int)):32/float>>, + true = <> =:= <<(float(Int)):64/float>> + end)(Nonliteral(" ??Int0 ")), + true = <<" ??Int0 ":32/float>> =:= <<(float("??Int0")):32/float>>, + true = <<" ??Int0 ":64/float>> =:= <<(float("??Int0")):64/float>>"). + +-define(COF64(Int0), + "(fun(Int) -> + true = <> =:= <<(float(Int)):64/float>> + end)(Nonliteral(" ??Int0 ")), + true = <<" ??Int0 ":64/float>> =:= <<(float("??Int0")):64/float>>"). + +bs_construct_SUITE(doc) -> + ["OTP-5327. Adopted from parts of emulator/test/bs_construct_SUITE.erl."]; +bs_construct_SUITE(suite) -> + []; +bs_construct_SUITE(Config) when is_list(Config) -> + C1 = <<" + + Testf_1 = fun(W, B) -> " + ?FAIL(<<42:W>>) "," + ?FAIL(<<3.14:W/float>>) "," + ?FAIL(<>) " + end, + + TestF = fun() -> " + ?FAIL(<<3.14>>) "," + ?FAIL(<<<<1,2>>>>) "," + + ?FAIL(<<2.71/binary>>) "," + ?FAIL(<<24334/binary>>) "," + ?FAIL(<<24334344294788947129487129487219847/binary>>) "," + + ?FAIL(<<<<1,2,3>>/float>>) ", + + %% Negative field widths. + Testf_1(-8, <<1,2,3,4,5>>)," + + ?FAIL(<<42:(-16)>>) "," + ?FAIL(<<3.14:(-8)/float>>) "," + ?FAIL(<<<<23,56,0,2>>:(-16)/binary>>) "," + ?FAIL(<<<<23,56,0,2>>:(2.5)/binary>>) "," + ?FAIL(<<<<23,56,0,2>>:(anka)>>) " + end, + TestF(), + + NotUsed1 = fun(I, BinString) -> <>, ok end, + + NotUsed2 = fun(I, Sz) -> <>, ok end, + + NotUsed3 = fun(I) -><>, ok end, + + NotUsed = fun() -> + ok = NotUsed1(3, <<\"dum\">>), + {'EXIT',{badarg,_}} = (catch NotUsed1(3, \"dum\")), " + ?FAIL(NotUsed2(444, -2)) "," + ?FAIL(NotUsed2(444, anka)) "," + ?FAIL(NotUsed3(444)) " + end, + NotUsed(), + + InGuard3 = fun(Bin, A, B) when <> == Bin -> 1; + (Bin, A, B) when <> == Bin -> 2; + (Bin, A, B) when <> == Bin -> 3; + (Bin, A, B) when {a,b,<>} == Bin -> + cant_happen; + (_, _, _) -> nope + end, + + InGuard = fun() -> + 1 = InGuard3(<<16#74ad:16>>, 16#e95, 5), + 2 = InGuard3(<<16#3A,16#F7,\"hello\">>, 16#3AF7, <<\"hello\">>), + 3 = InGuard3(<<16#FBCD:14,3.1415/float,3:2>>, 16#FBCD, 3.1415), + nope = InGuard3(<<1>>, 42, b), + nope = InGuard3(<<1>>, a, b), + nope = InGuard3(<<1,2>>, 1, 1), + nope = InGuard3(<<4,5>>, 1, 2.71), + nope = InGuard3(<<4,5>>, 1, <<12,13>>) + end, + InGuard(), + + Nonliteral = fun(X) -> X end, + + CoerceToFloat = fun() -> " + ?COF(0) "," + ?COF(-1) "," + ?COF(1) "," + ?COF(42) "," + ?COF(255) "," + ?COF(-255) "," + ?COF64(298748888888888888888888888883478264866528467367364766666666666666663) "," + ?COF64(-367546729879999999999947826486652846736736476555566666663) " + end, + CoerceToFloat(), + ok. + ">>, + [ok] = scan(C1), + ok = evaluate(C1, []), + + %% There is another one, lib/compiler/test/bs_construct_SUITE.erl... + C2 = <<" + I = fun(X) -> X end, + + Fail = fun() -> + + I_minus_777 = I(-777), + I_minus_2047 = I(-2047), + + %% One negative field size, but the sum of field sizes will be 1 byte. + %% Make sure that we reject that properly. + + {'EXIT',{badarg,_}} = (catch <>), + + %% Same thing, but use literals. + {'EXIT',{badarg,_}} = (catch <>), + + %% Bad alignment. + I_one = I(1), + <<1:1>> = <<2375:I_one>>, + <<3:2>> = <<45:1,2375:I_one>>, + <<14:4>> = <<45:1,2375:I_one,918:2>>, + <<118:7>> = <<45:1,2375:I_one,918:5>>, + + %% Not numbers. + {'EXIT',{badarg,_}} = (catch <<45:(I(not_a_number))>>), + {'EXIT',{badarg,_}} = (catch <<13:8,45:(I(not_a_number))>>), + + %% Unaligned sizes. + BadSz = I(7), + <<2:4>> = <<34:4>>, + <<34:7>> = <<34:BadSz>>, + + [] = [X || {X} <- [], X == <<3:BadSz>>], + [] = [X || {X} <- [], X == <<3:4>>] + end, + Fail(), + + FloatBin1 = fun(F) -> + {<<1,2,3>>,F+3.0} + end, + + FloatBin = fun() -> + %% Some more coverage. + {<<1,2,3>>,7.0} = FloatBin1(4) + end, + FloatBin(), + + ok. + ">>, + [ok] = scan(C2), + ok = evaluate(C2, []). + +evaluate(B, Vars) when is_binary(B) -> + evaluate(binary_to_list(B), Vars); +evaluate(Str, Vars) -> + {ok,Tokens,_} = + erl_scan:string(Str), + {ok, Exprs} = erl_parse:parse_exprs(Tokens), + case erl_eval:exprs(Exprs, Vars, none) of + {value, Result, _} -> + Result + end. + +refman(suite) -> + [refman_bit_syntax]. + +refman_bit_syntax(doc) -> + ["Bit syntax examples from the Reference Manual. OTP-5237."]; +refman_bit_syntax(suite) -> + []; +refman_bit_syntax(Config) when is_list(Config) -> + %% Reference Manual "Bit Syntax Expressions" + ?line Bin1 = <<1,17,42>>, + ?line true = [1,17,42] =:= binary_to_list(Bin1), + ?line Bin2 = <<"abc">>, + ?line true = "abc" =:= binary_to_list(Bin2), + ?line Bin3 = <<1,17,42:16>>, + ?line true = [1,17,0,42] =:= binary_to_list(Bin3), + ?line <<_A,_B,C:16>> = <<1,17,42:16>>, + ?line true = C =:= 42, + ?line <> = <<1,17,42:16>>, + ?line true = D =:= 273, + ?line true = F =:= 42, + <<_G,H/binary>> = <<1,17,42:16>>, + ?line true = H =:= <<17,0,42>>, + + ?line [ok] = + scan(<<"Bin1 = <<1,17,42>>, + true = [1,17,42] =:= binary_to_list(Bin1), + Bin2 = <<\"abc\">>, + true = \"abc\" =:= binary_to_list(Bin2), + Bin3 = <<1,17,42:16>>, + true = + [1,17,0,42] =:= binary_to_list(Bin3), + <> = <<1,17,42:16>>, + true = C =:= 42, + <> = <<1,17,42:16>>, + true = D =:= 273, + true = F =:= 42, + <> = <<1,17,42:16>>, + true = H =:= <<17,0,42>>, + ok.">>), + + %% Binary comprehensions. + ?line <<2,4,6>> = << << (X*2) >> || <> <= << 1,2,3 >> >>, + ok. + +progex(suite) -> + [progex_bit_syntax, progex_records, progex_lc, progex_funs]. + +-define(IP_VERSION, 4). +-define(IP_MIN_HDR_LEN, 5). +progex_bit_syntax(doc) -> + ["Bit syntax examples from Programming Examples. OTP-5237."]; +progex_bit_syntax(suite) -> + []; +progex_bit_syntax(Config) when is_list(Config) -> + Bin11 = <<1, 17, 42>>, + true = [1, 17, 42] =:= binary_to_list(Bin11), + Bin12 = <<"abc">>, + true = [97, 98, 99] =:= binary_to_list(Bin12), + + A = 1, B = 17, C = 42, + Bin2 = <>, + true = [1, 17, 00, 42] =:= binary_to_list(Bin2), + <> = Bin2, + true = D =:= 273, + true = E =:= 00, + true = [42] =:= binary_to_list(F), + + Fun4 = fun(Dgram) -> + DgramSize = byte_size(Dgram), + case Dgram of + <> when HLen>=5, 4*HLen= + OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN), + <> = RestDgram, + {SrvcType, TotLen, Flgs, FragOff, ID, HdrChkSum, + Proto, TTL, SrcIP, DestIP, Data, Opts}; + _ -> + not_ok + end + end, + true = Fun4(<<>>) =:= not_ok, + true = is_tuple(Fun4(list_to_binary([<>, + list_to_binary(lists:seq(1,255))]))), + + X = 23432324, Y = 24324234, + <<10:7>> = <>, + Z = 234324324, + XYZ = <>, + true = [20] =:= binary_to_list(XYZ), + Hello1 = <<"hello">>, + Hello2 = <<$h,$e,$l,$l,$o>>, + true = "hello" =:= binary_to_list(Hello1), + true = "hello" =:= binary_to_list(Hello2), + + FunM1 = fun(<>) -> {X1,Y1} end, + true = {<<"1234567">>,<<"8">>} =:= FunM1(<<"12345678">>), + + FunM2 = fun(<<_X1:7/binary-unit:7, _Y1:1/binary-unit:1>>) -> ok; + (_) -> not_ok end, + true = not_ok =:= FunM2(<<"1">>), + + BL = [{3,4,5},{6,7,8}], + Lst = [0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8], + B1 = triples_to_bin1(BL), + true = Lst =:= binary_to_list(B1), + B2 = triples_to_bin2(BL), + true = Lst =:= binary_to_list(B2), + + ?line [ok] = scan( + <<"Bin11 = <<1, 17, 42>>, + true = [1, 17, 42] =:= binary_to_list(Bin11), + Bin12 = <<\"abc\">>, + true = [97, 98, 99] =:= binary_to_list(Bin12), + + A = 1, B = 17, C = 42, + Bin2 = <>, + true = [1, 17, 00, 42] =:= binary_to_list(Bin2), + <> = Bin2, + true = D =:= 273, + true = E =:= 00, + true = [42] =:= binary_to_list(F), + + Fun4 = fun(Dgram) -> + DgramSize = byte_size(Dgram), + case Dgram of + <<4:4, HLen:4, SrvcType:8, TotLen:16, + ID:16, Flgs:3, FragOff:13, + TTL:8, Proto:8, HdrChkSum:16, + SrcIP:32, DestIP:32, + RestDgram/binary>> when HLen>=5, + 4*HLen= + OptsLen = 4*(HLen - 5), + <> = RestDgram, + {SrvcType, TotLen, Flgs, FragOff, ID, HdrChkSum, + Proto, TTL, SrcIP, DestIP, Data, Opts}; + _ -> + not_ok + end + end, + true = Fun4(<<>>) =:= not_ok, + true = is_tuple(Fun4(list_to_binary + ([<<4:4,5:4>>,list_to_binary(lists:seq(1,255))]))), + + X = 23432324, Y = 24324234, + <<10:7>> = <>, + Z = 234324324, + XYZ = <>, + true = [20] =:= binary_to_list(XYZ), + Hello1 = <<\"hello\">>, + Hello2 = <<$h,$e,$l,$l,$o>>, + true = \"hello\" =:= binary_to_list(Hello1), + true = \"hello\" =:= binary_to_list(Hello2), + + FunM1 = fun(<>) -> {X1,Y1} end, + true = {<<\"1234567\">>,<<\"8\">>} =:= FunM1(<<\"12345678\">>), + + FunM2 = fun(<<_X1:7/binary-unit:7, _Y1:1/binary-unit:1>>) -> ok; + (_) -> not_ok end, + true = not_ok =:= FunM2(<<\"1\">>), + ok.">>), + + ok. + +triples_to_bin1(T) -> + triples_to_bin1(T, <<>>). + +triples_to_bin1([{X,Y,Z} | T], Acc) -> + triples_to_bin1(T, <>); % inefficient +triples_to_bin1([], Acc) -> + Acc. + +triples_to_bin2(T) -> + triples_to_bin2(T, []). + +triples_to_bin2([{X,Y,Z} | T], Acc) -> + triples_to_bin2(T, [<> | Acc]); +triples_to_bin2([], Acc) -> + list_to_binary(lists:reverse(Acc)). + +progex_records(doc) -> + ["Record examples from Programming Examples. OTP-5237."]; +progex_records(suite) -> + []; +progex_records(Config) when is_list(Config) -> + Test1 = + <<"-module(recs). + -record(person, {name = \"\", phone = [], address}). + -record(name, {first = \"Robert\", last = \"Ericsson\"}). + -record(person2, {name = #name{}, phone}). + -export([t/0]). + + t() -> + _P1 = #person{phone=[0,8,2,3,4,3,1,2], name=\"Robert\"}, + \"Robert\" = _P1#person.name, + [0,8,2,3,4,3,1,2] = _P1#person.phone, + undefined = _P1#person.address, + + _P2 = #person{name = \"Jakob\", _ = '_'}, + \"Jakob\" = _P2#person.name, + '_' = _P2#person.phone, + '_' = _P2#person.address, + + P = #person{name = \"Joe\", phone = [0,8,2,3,4,3,1,2]}, + \"Joe\" = P#person.name, + [0,8,2,3,4,3,1,2] = P#person.phone, + undefined = P#person.address, + + P1 = #person{name=\"Joe\", phone=[1,2,3], address=\"A street\"}, + P2 = P1#person{name=\"Robert\"}, + \"Robert\" = P2#person.name, + [1,2,3] = P2#person.phone, + \"A street\" = P2#person.address, + a_person = foo(P1), + + {found, [1,2,3]} = + find_phone([#person{name = a}, + #person{name = b, phone = [3,2,1]}, + #person{name = c, phone = [1,2,3]}], + c), + + P3 = #person{name=\"Joe\", phone=[0,0,7], address=\"A street\"}, + #person{name = Name} = P3, + \"Joe\" = Name, + + \"Robert\" = demo(), + ok. + + foo(P) when is_record(P, person) -> a_person; + foo(_) -> not_a_person. + + find_phone([#person{name=Name, phone=Phone} | _], Name) -> + {found, Phone}; + find_phone([_| T], Name) -> + find_phone(T, Name); + find_phone([], _Name) -> + not_found. + + demo() -> + P = #person2{name= #name{first=\"Robert\",last=\"Virding\"}, + phone=123}, + _First = (P#person2.name)#name.first. + ">>, + ?line ok = run_file(Config, recs, Test1), + + Test1_shell = + <<"rd(person, {name = \"\", phone = [], address}), + rd(name, {first = \"Robert\", last = \"Ericsson\"}), + rd(person2, {name = #name{}, phone}), + + _P1 = #person{phone=[0,8,2,3,4,3,1,2], name=\"Robert\"}, + \"Robert\" = _P1#person.name, + [0,8,2,3,4,3,1,2] = _P1#person.phone, + undefined = _P1#person.address, + + _P2 = #person{name = \"Jakob\", _ = '_'}, + \"Jakob\" = _P2#person.name, + '_' = _P2#person.phone, + '_' = _P2#person.address, + + P = #person{name = \"Joe\", phone = [0,8,2,3,4,3,1,2]}, + \"Joe\" = P#person.name, + [0,8,2,3,4,3,1,2] = P#person.phone, + undefined = P#person.address, + + P1 = #person{name=\"Joe\", phone=[1,2,3], address=\"A street\"}, + P2 = P1#person{name=\"Robert\"}, + \"Robert\" = P2#person.name, + [1,2,3] = P2#person.phone, + \"A street\" = P2#person.address, + Foo = fun(P) when is_record(P, person) -> a_person; + (_) -> not_a_person + end, + a_person = Foo(P1), + + Find = fun([#person{name=Name, phone=Phone} | _], Name, Fn) -> + {found, Phone}; + ([_| T], Name, Fn) -> + Fn(T, Name, Fn); + ([], _Name, _Fn) -> + not_found + end, + + {found, [1,2,3]} = Find([#person{name = a}, + #person{name = b, phone = [3,2,1]}, + #person{name = c, phone = [1,2,3]}], + c, + Find), + + P3 = #person{name=\"Joe\", phone=[0,0,7], address=\"A street\"}, + #person{name = Name} = P3, + \"Joe\" = Name, + + Demo = fun() -> + P17 = #person2{name= #name{first=\"Robert\",last=\"Virding\"}, + phone=123}, + _First = (P17#person2.name)#name.first + end, + + \"Robert\" = Demo(), + ok. + ">>, + ?line [ok] = scan(Test1_shell), + + Test2 = + <<"-module(recs). + -record(person, {name, age, phone = [], dict = []}). + -compile(export_all). + + t() -> ok. + + make_hacker_without_phone(Name, Age) -> + #person{name = Name, age = Age, + dict = [{computer_knowledge, excellent}, + {drinks, coke}]}. + print(#person{name = Name, age = Age, + phone = Phone, dict = Dict}) -> + io:format(\"Name: ~s, Age: ~w, Phone: ~w ~n\" + \"Dictionary: ~w.~n\", [Name, Age, Phone, Dict]). + + birthday(P) when record(P, person) -> + P#person{age = P#person.age + 1}. + + register_two_hackers() -> + Hacker1 = make_hacker_without_phone(\"Joe\", 29), + OldHacker = birthday(Hacker1), + % The central_register_server should have + % an interface function for this. + central_register_server ! {register_person, Hacker1}, + central_register_server ! {register_person, + OldHacker#person{name = \"Robert\", + phone = [0,8,3,2,4,5,3,1]}}. + ">>, + ?line ok = run_file(Config, recs, Test2), + ok. + +progex_lc(doc) -> + ["List comprehension examples from Programming Examples. OTP-5237."]; +progex_lc(suite) -> + []; +progex_lc(Config) when is_list(Config) -> + Test1 = + <<"-module(lc). + -export([t/0]). + + t() -> + [a,4,b,5,6] = [X || X <- [1,2,a,3,4,b,5,6], X > 3], + [4,5,6] = [X || X <- [1,2,a,3,4,b,5,6], integer(X), X > 3], + [{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}] = + [{X, Y} || X <- [1,2,3], Y <- [a,b]], + + [1,2,3,4,5,6,7,8] = sort([4,5,1,8,3,6,7,2]), + [[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]] = + perms([b,u,g]), + [] = pyth(11), + [{3,4,5},{4,3,5}] = pyth(12), + [{3,4,5},{4,3,5},{5,12,13},{6,8,10},{8,6,10},{8,15,17}, + {9,12,15},{12,5,13},{12,9,15},{12,16,20},{15,8,17}, + {16,12,20}] = pyth(50), + [] = pyth1(11), + [{3,4,5},{4,3,5}] = pyth1(12), + [{3,4,5},{4,3,5},{5,12,13},{6,8,10},{8,6,10},{8,15,17}, + {9,12,15},{12,5,13},{12,9,15},{12,16,20},{15,8,17}, + {16,12,20}] = pyth1(50), + [1,2,3,4,5] = append([[1,2,3],[4,5]]), + [2,3,4] = map(fun(X) -> X + 1 end, [1,2,3]), + [2,4] = filter(fun(X) -> X > 1 end, [0,2,4]), + [1,2,3,7] = select(b,[{a,1},{b,2},{c,3},{b,7}]), + [2,7] = select2(b,[{a,1},{b,2},{c,3},{b,7}]), + ok. + + sort([Pivot|T]) -> + sort([ X || X <- T, X < Pivot]) ++ + [Pivot] ++ + sort([ X || X <- T, X >= Pivot]); + sort([]) -> []. + + perms([]) -> [[]]; + perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])]. + + pyth(N) -> + [ {A,B,C} || + A <- lists:seq(1,N), + B <- lists:seq(1,N), + C <- lists:seq(1,N), + A+B+C =< N, + A*A+B*B == C*C + ]. + + pyth1(N) -> + [{A,B,C} || + A <- lists:seq(1,N), + B <- lists:seq(1,N-A+1), + C <- lists:seq(1,N-A-B+2), + A+B+C =< N, + A*A+B*B == C*C ]. + + append(L) -> [X || L1 <- L, X <- L1]. + map(Fun, L) -> [Fun(X) || X <- L]. + filter(Pred, L) -> [X || X <- L, Pred(X)]. + + select(X, L) -> [Y || {X, Y} <- L]. + select2(X, L) -> [Y || {X1, Y} <- L, X == X1]. + ">>, + ?line ok = run_file(Config, lc, Test1), + + Test1_shell = + <<"[a,4,b,5,6] = [X || X <- [1,2,a,3,4,b,5,6], X > 3], + [4,5,6] = [X || X <- [1,2,a,3,4,b,5,6], integer(X), X > 3], + [{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}] = + [{X, Y} || X <- [1,2,3], Y <- [a,b]], + + Sort = fun([Pivot|T], Fn) -> + Fn([ X || X <- T, X < Pivot], Fn) ++ + [Pivot] ++ + Fn([ X || X <- T, X >= Pivot], Fn); + ([], _Fn) -> [] + end, + + [1,2,3,4,5,6,7,8] = Sort([4,5,1,8,3,6,7,2], Sort), + Perms = fun([], _Fn) -> [[]]; + (L, Fn) -> [[H|T] || H <- L, T <- Fn(L--[H], Fn)] + end, + [[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]] = + Perms([b,u,g], Perms), + + Pyth = fun(N) -> + [ {A,B,C} || + A <- lists:seq(1,N), + B <- lists:seq(1,N), + C <- lists:seq(1,N), + A+B+C =< N, + A*A+B*B == C*C + ] + end, + + [] = Pyth(11), + [{3,4,5},{4,3,5}] = Pyth(12), + %[{3,4,5},{4,3,5},{5,12,13},{6,8,10},{8,6,10},{8,15,17}, + % {9,12,15},{12,5,13},{12,9,15},{12,16,20},{15,8,17}, + % {16,12,20}] = Pyth(50), + + Pyth1 = fun(N) -> + [{A,B,C} || + A <- lists:seq(1,N), + B <- lists:seq(1,N-A+1), + C <- lists:seq(1,N-A-B+2), + A+B+C =< N, + A*A+B*B == C*C ] + end, + + [] = Pyth1(11), + [{3,4,5},{4,3,5}] = Pyth1(12), + [{3,4,5},{4,3,5},{5,12,13},{6,8,10},{8,6,10},{8,15,17}, + {9,12,15},{12,5,13},{12,9,15},{12,16,20},{15,8,17}, + {16,12,20}] = Pyth1(50), + + Append = fun(L) -> [X || L1 <- L, X <- L1] end, + [1,2,3,4,5] = Append([[1,2,3],[4,5]]), + Map = fun(Fun, L) -> [Fun(X) || X <- L] end, + [2,3,4] = Map(fun(X) -> X + 1 end, [1,2,3]), + Filter = fun(Pred, L) -> [X || X <- L, Pred(X)] end, + [2,4] = Filter(fun(X) -> X > 1 end, [0,2,4]), + + Select = fun(X, L) -> [Y || {X, Y} <- L] end, + [1,2,3,7] = Select(b,[{a,1},{b,2},{c,3},{b,7}]), + Select2 = fun(X, L) -> [Y || {X1, Y} <- L, X == X1] end, + [2,7] = Select2(b,[{a,1},{b,2},{c,3},{b,7}]), + ok. + ">>, + ?line [ok] = scan(Test1_shell), + ok. + +progex_funs(doc) -> + ["Funs examples from Programming Examples. OTP-5237."]; +progex_funs(suite) -> + []; +progex_funs(Config) when is_list(Config) -> + Test1 = + <<"-module(funs). + -compile(export_all). + + double([H|T]) -> [2*H|double(T)]; + double([]) -> []. + + add_one([H|T]) -> [H+1|add_one(T)]; + add_one([]) -> []. + + map(F, [H|T]) -> [F(H)|map(F, T)]; + map(F, []) -> []. + + double2(L) -> map(fun(X) -> 2*X end, L). + add_one2(L) -> map(fun(X) -> 1 + X end, L). + + print_list(Stream, [H|T]) -> + io:format(Stream, \"~p~n\", [H]), + print_list(Stream, T); + print_list(Stream, []) -> + true. + + broadcast(Msg, [Pid|Pids]) -> + Pid ! Msg, + broadcast(Msg, Pids); + broadcast(_, []) -> + true. + + foreach(F, [H|T]) -> + F(H), + foreach(F, T); + foreach(F, []) -> + ok. + + print_list2(S, L) -> + foreach(fun(H) -> io:format(S, \"~p~n\",[H]) end, L). + + broadcast2(M, L) -> foreach(fun(Pid) -> Pid ! M end, L). + + t1() -> map(fun(X) -> 2 * X end, [1,2,3,4,5]). + + t2() -> map(fun double/1, [1,2,3,4,5]). + + t3() -> map({?MODULE, double3}, [1,2,3,4,5]). + + double3(X) -> X * 2. + + f(F, Args) when function(F) -> + apply(F, Args); + f(N, _) when integer(N) -> + N. + + print_list3(File, List) -> + {ok, Stream} = file:open(File, write), + foreach(fun(X) -> io:format(Stream,\"~p~n\",[X]) end, List), + file:close(Stream). + + print_list4(File, List) -> + {ok, Stream} = file:open(File, write), + foreach(fun(File) -> + io:format(Stream,\"~p~n\",[File]) + end, List), + file:close(Stream). + + any(Pred, [H|T]) -> + case Pred(H) of + true -> true; + false -> any(Pred, T) + end; + any(Pred, []) -> + false. + + all(Pred, [H|T]) -> + case Pred(H) of + true -> all(Pred, T); + false -> false + end; + all(Pred, []) -> + true. + + foldl(F, Accu, [Hd|Tail]) -> + foldl(F, F(Hd, Accu), Tail); + foldl(F, Accu, []) -> Accu. + + mapfoldl(F, Accu0, [Hd|Tail]) -> + {R,Accu1} = F(Hd, Accu0), + {Rs,Accu2} = mapfoldl(F, Accu1, Tail), + {[R|Rs], Accu2}; + mapfoldl(F, Accu, []) -> {[], Accu}. + + filter(F, [H|T]) -> + case F(H) of + true -> [H|filter(F, T)]; + false -> filter(F, T) + end; + filter(F, []) -> []. + + diff(L1, L2) -> + filter(fun(X) -> not lists:member(X, L2) end, L1). + + intersection(L1,L2) -> filter(fun(X) -> lists:member(X,L1) end, L2). + + takewhile(Pred, [H|T]) -> + case Pred(H) of + true -> [H|takewhile(Pred, T)]; + false -> [] + end; + takewhile(Pred, []) -> + []. + + dropwhile(Pred, [H|T]) -> + case Pred(H) of + true -> dropwhile(Pred, T); + false -> [H|T] + end; + dropwhile(Pred, []) -> + []. + + splitlist(Pred, L) -> + splitlist(Pred, L, []). + + splitlist(Pred, [H|T], L) -> + case Pred(H) of + true -> splitlist(Pred, T, [H|L]); + false -> {lists:reverse(L), [H|T]} + end; + splitlist(Pred, [], L) -> + {lists:reverse(L), []}. + + first(Pred, [H|T]) -> + case Pred(H) of + true -> + {true, H}; + false -> + first(Pred, T) + end; + first(Pred, []) -> + false. + + ints_from(N) -> + fun() -> + [N|ints_from(N+1)] + end. + + pconst(X) -> + fun (T) -> + case T of + [X|T1] -> {ok, {const, X}, T1}; + _ -> fail + end + end. + + pand(P1, P2) -> + fun (T) -> + case P1(T) of + {ok, R1, T1} -> + case P2(T1) of + {ok, R2, T2} -> + {ok, {'and', R1, R2}}; + fail -> + fail + end; + fail -> + fail + end + end. + + por(P1, P2) -> + fun (T) -> + case P1(T) of + {ok, R, T1} -> + {ok, {'or',1,R}, T1}; + fail -> + case P2(T) of + {ok, R1, T1} -> + {ok, {'or',2,R1}, T1}; + fail -> + fail + end + end + end. + + grammar() -> + pand( + por(pconst(a), pconst(b)), + por(pconst(c), pconst(d))). + + parse(List) -> + (grammar())(List). + + + t() -> + [2,4,6,8] = double([1,2,3,4]), + [2,3,4,5] = add_one([1,2,3,4]), + [2,4,6,8] = double2([1,2,3,4]), + [2,3,4,5] = add_one2([1,2,3,4]), + XX = ints_from(1), + [1 | _] = XX(), + 1 = hd(XX()), + Y = tl(XX()), + 2 = hd(Y()), + + P1 = pconst(a), + {ok,{const,a},[b,c]} = P1([a,b,c]), + fail = P1([x,y,z]), + + {ok,{'and',{'or',1,{const,a}},{'or',1,{const,c}}}} = + parse([a,c]), + {ok,{'and',{'or',1,{const,a}},{'or',2,{const,d}}}} = + parse([a,d]), + {ok,{'and',{'or',2,{const,b}},{'or',1,{const,c}}}} = + parse([b,c]), + {ok,{'and',{'or',2,{const,b}},{'or',2,{const,d}}}} = + parse([b,d]), + fail = parse([a,b]), + ok. + ">>, + ?line ok = run_file(Config, funs, Test1), + + Test2_shell = + <<"Double = fun(X) -> 2 * X end, + [2,4,6,8,10] = lists:map(Double, [1,2,3,4,5]), + + Big = fun(X) -> if X > 10 -> true; true -> false end end, + false = lists:any(Big, [1,2,3,4]), + true = lists:any(Big, [1,2,3,12,5]), + false = lists:all(Big, [1,2,3,4,12,6]), + true = lists:all(Big, [12,13,14,15]), + L = [\"I\",\"like\",\"Erlang\"], + 11 = lists:foldl(fun(X, Sum) -> length(X) + Sum end, 0, L), + Upcase = fun(X) when $a =< X, X =< $z -> X + $A - $a; + (X) -> X + end, + Upcase_word = fun(X) -> lists:map(Upcase, X) end, + \"ERLANG\" = Upcase_word(\"Erlang\"), + [\"I\",\"LIKE\",\"ERLANG\"] = lists:map(Upcase_word, L), + {[\"I\",\"LIKE\",\"ERLANG\"],11} = + lists:mapfoldl(fun(Word, Sum) -> + {Upcase_word(Word), Sum + length(Word)} + end, 0, L), + [500,12,45] = lists:filter(Big, [500,12,2,45,6,7]), + [200,500,45] = lists:takewhile(Big, [200,500,45,5,3,45,6]), + [5,3,45,6] = lists:dropwhile(Big, [200,500,45,5,3,45,6]), + {[200,500,45],[5,3,45,6]} = + lists:splitwith(Big, [200,500,45,5,3,45,6]), + %% {true,45} = lists:first(Big, [1,2,45,6,123]), + %% false = lists:first(Big, [1,2,4,5]), + + Adder = fun(X) -> fun(Y) -> X + Y end end, + Add6 = Adder(6), + 16 = Add6(10), + ok. + ">>, + ?line [ok] = scan(Test2_shell), + ok. + +tickets(suite) -> + [otp_5990, otp_6166, otp_6554, otp_6785, otp_7184, otp_7232]. + +otp_5990(doc) -> + "OTP-5990. {erlang,is_record}."; +otp_5990(suite) -> []; +otp_5990(Config) when is_list(Config) -> + ?line [true] = + scan(<<"rd(foo,{bar}), {erlang,is_record}(#foo{}, foo).">>), + ?line [3] = + scan(<<"rd(foo,{bar}), A = #foo{}, " + "{if {erlang,is_record}(A, foo) -> erlang; " + "true -> not_a_module end, length}([1,2,3]).">>), + ?line [true] = + scan(<<"rd('OrdSet', {orddata = {},ordtype = type}), " + "S = #'OrdSet'{ordtype = {}}, " + "if tuple(S#'OrdSet'.ordtype) -> true; true -> false end.">>), + ok. + +otp_6166(doc) -> + "OTP-6166. Order of record definitions."; +otp_6166(suite) -> []; +otp_6166(Config) when is_list(Config) -> + Test1 = filename:join(?config(priv_dir, Config), "test1.hrl"), + Contents1 = <<"-module(test1). + -record(r5, {f}). -record(r3, {f = #r5{}}). " + "-record(r1, {f = #r3{}}). -record(r4, {f = #r1{}}). " + "-record(r2, {f = #r4{}}).">>, + ?line ok = file:write_file(Test1, Contents1), + + Test2 = filename:join(?config(priv_dir, Config), "test2.hrl"), + Contents2 = <<"-module(test2). + -record(r5, {f}). -record(r3, {f = #r5{}}). " + "-record(r1, {f = #r3{}}). -record(r4, {f = #r1{}}). " + "-record(r2, {f = #r4{}}). + -record(r6, {f = #r5{}}). % r6 > r0 + -record(r0, {f = #r5{}, g = #r5{}}). % r0 < r5">>, + ?line ok = file:write_file(Test2, Contents2), + + RR12 = "[r1,r2,r3,r4,r5] = rr(\"" ++ Test1 ++ "\"), + [r0,r1,r2,r3,r4,r5,r6] = rr(\"" ++ Test2 ++ "\"), + R0 = #r0{}, R6 = #r6{}, + true = is_record(R0, r0), + true = is_record(R6, r6), + ok. ", + ?line [ok] = scan(RR12), + + file:delete(Test1), + file:delete(Test2), + ok. + +otp_6554(doc) -> + "OTP-6554. Formatted exits and error messages."; +otp_6554(suite) -> []; +otp_6554(Config) when is_list(Config) -> + %% Should check the stacktrace as well... + ?line "exception error: bad argument" = + comm_err(<<"math:sqrt(a).">>), + ?line "exception error: bad argument" = + comm_err(<<"fun(X, Y) -> X ++ Y end(a, b).">>), + ?line "exception error: bad argument" = + comm_err(<<"math:sqrt(lists:seq(1,40)).">>), + ?line "exception error: bad argument" = + comm_err(<<"math:sqrt(lists:seq(1,10)).">>), + ?line "exception error: bad argument" = + comm_err(<<"a ++ b.">>), + ?line "exception error: bad argument" = + comm_err(<<"I = {file_info,undefined,undefined,undefined,undefined, + undefined,undefined,undefined,undefined,undefined, + undefined,undefined,undefined,undefined}, + aa ++ I.">>), + ?line "exception error: bad argument" = + comm_err(<<"I = {file_info,undefined,undefined,undefined,undefined, + undefined,undefined,undefined,undefined,undefined, + undefined,undefined,undefined,undefined}, + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ++ I.">>), + ?line "exception error: bad argument" = + comm_err(<<"I = {file_info,undefined,undefined,undefined,undefined, + undefined,undefined,undefined,undefined,undefined, + undefined,undefined,undefined,undefined}, + I ++ I.">>), + ?line "exception error: bad argument" = + comm_err(<<"fun(X) -> not X end(a).">>), + ?line "exception error: bad argument: a" = + comm_err(<<"fun(A, B) -> A orelse B end(a, b).">>), + ?line "exception error: bad argument in an arithmetic expression" = + comm_err(<<"math:sqrt(2)/round(math:sqrt(0)).">>), + ?line "exception error: interpreted function with arity 1 called with no arguments" = + comm_err(<<"fun(V) -> V end().">>), + ?line "exception error: interpreted function with arity 1 called with two arguments" = + comm_err(<<"fun(V) -> V end(1,2).">>), + ?line "exception error: interpreted function with arity 0 called with one argument" = + comm_err(<<"fun() -> v end(1).">>), + ?line "exception error: interpreted function with arity 0 called with 4 arguments" = + comm_err(<<"fun() -> v end(1,2,3,4).">>), + ?line "exception error: math:sqrt/1 called with two arguments" = + comm_err(<<"fun math:sqrt/1(1,2).">>), + ?line "exception error: bad function 1." ++ _ = + comm_err(<<"(math:sqrt(2))().">>), + ?line "exception error: bad function [1," ++ _ = + comm_err(<<"(lists:seq(1, 100))().">>), + ?line "exception error: no match of right hand side value 1" ++ _ = + comm_err(<<"a = math:sqrt(2).">>), + ?line "exception error: no match of right hand side value" ++ _ = + comm_err(<<"I = {file_info,undefined,undefined,undefined,undefined, + undefined,undefined,undefined,undefined,undefined, + undefined,undefined,undefined,undefined}, + a = I.">>), + ?line "exception error: no case clause matching 1" ++ _ = + comm_err(<<"case math:sqrt(2) of a -> ok end.">>), + ?line "exception error: no case clause matching [1," ++ _ = + comm_err(<<"V = lists:seq(1, 20), case V of a -> ok end.">>), + ?line "exception error: no function clause matching" = + comm_err(<<"fun(P) when is_pid(P) -> true end(a).">>), + ?line "exception error: {function_clause,[{erl_eval,do_apply,[unproper|list]}"++_ = + comm_err(<<"erlang:error(function_clause, [unproper | list]).">>), + ?line "exception error: function_clause" = + comm_err(<<"erlang:error(function_clause, 4).">>), + %% Cheating: + ?line "exception error: no function clause matching erl_eval:do_apply(4)" = + comm_err(<<"erlang:error(function_clause, [4]).">>), + ?line "exception error: no function clause matching" ++ _ = + comm_err(<<"fun(a, b, c, d) -> foo end" + " (lists:seq(1,17)," + " lists:seq(1, 18)," + " lists:seq(1, 40)," + " lists:seq(1, 5)).">>), + + ?line "exception error: no function clause matching" = + comm_err(<<"fun(P, q) when is_pid(P) -> true end(a, b).">>), + ?line "exception error: no function clause matching lists:reverse(" ++ _ = + comm_err(<<"F=fun() -> hello end, lists:reverse(F).">>), + ?line "exception error: no function clause matching lists:reverse(34)" = + comm_err(<<"lists:reverse(34).">>), + ?line "exception error: no true branch found when evaluating an if expression" = + comm_err(<<"if length([a,b]) > 17 -> a end.">>), + ?line "exception error: no such process or port" = + comm_err(<<"Pid = spawn(fun() -> a end)," + "timer:sleep(1)," + "link(Pid).">>), + ?line "exception error: a system limit has been reached" = + comm_err(<<"list_to_atom(lists:duplicate(300,$a)).">>), + ?line "exception error: bad receive timeout value" = + comm_err(<<"receive after a -> foo end.">>), + ?line "exception error: no try clause matching 1" ++ _ = + comm_err(<<"try math:sqrt(2) of bar -> yes after 3 end.">>), + ?line "exception error: no try clause matching [1" ++ _ = + comm_err(<<"V = lists:seq(1, 20)," + "try V of bar -> yes after 3 end.">>), + ?line "exception error: undefined function math:sqrt/2" = + comm_err(<<"math:sqrt(2, 2).">>), + ?line "exception error: limit of number of arguments to interpreted function " + "exceeded" = + comm_err(<<"fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U) ->" + " a end().">>), + ?line "exception error: bad filter a" = + comm_err(<<"[b || begin a end].">>), + ?line "exception error: bad generator a" = + comm_err(<<"[X || X <- a].">>), + ?line "exception throw: undef" = comm_err(<<"throw(undef).">>), + ?line "exception exit: undef" = comm_err(<<"exit(undef).">>), + + ?line "exception exit: foo" = + comm_err(<<"catch spawn_link(fun() ->" + " timer:sleep(300), exit(foo) " + " end)," + "timer:sleep(500).">>), + ?line [ok] = scan( + <<"begin process_flag(trap_exit, true)," + " Pid = spawn_link(fun() ->" + " timer:sleep(300), exit(foo) " + " end)," + " timer:sleep(500)," + " receive {'EXIT', Pid, foo} -> ok end end.">>), + ?line "exception exit: badarith" = + comm_err(<<"catch spawn_link(fun() ->" + " timer:sleep(300), 1/0 " + " end)," + "timer:sleep(500).">>), + ?line "exception exit: {nocatch,foo}" = + comm_err(<<"catch spawn_link(fun() ->" + " timer:sleep(300), throw(foo) " + " end)," + "timer:sleep(500).">>), + ?line [ok] = scan( + <<"begin process_flag(trap_exit, true)," + " Pid = spawn_link(fun() ->" + " timer:sleep(300), throw(foo) " + " end)," + " timer:sleep(500)," + " receive {'EXIT', Pid, {{nocatch,foo},_}} -> ok end " + "end.">>), + + ?line "exception error: bad argument in an arithmetic expression" = + comm_err(<<"begin catch_exception(true), 1/0 end.">>), + ?line "exception error: bad argument in an arithmetic expression" = + comm_err(<<"begin catch_exception(false), 1/0 end.">>), + ?line "exception error: no function clause matching call to catch_exception/1" = + comm_err(<<"catch_exception(1).">>), + + %% A bug was corrected (expansion of 'try'): + ?line "2: command not found" = + comm_err(<<"try 1 of 1 -> v(2) after 3 end.">>), + %% Cover a few lines: + ?line "3: command not found" = + comm_err(<<"receive foo -> foo after 0 -> v(3) end.">>), + ?line "3: command not found" = + comm_err(<<"receive foo -> foo after 0 -> e(3) end.">>), + ?line "1 / 0: command not found" = comm_err(<<"v(1/0).">>), + ?line "1\n1.\n" = t(<<"1. e(1).">>), + ?line [ok] = scan(<<"h().">>), + ?line "exception exit: normal" = comm_err(<<"exit(normal).">>), + ?line [foo] = scan(<<"begin history(0), foo end.">>), + ?line application:unset_env(stdlib, shell_history_length), + ?line [true] = scan(<<"begin <<10:(1024*1024*10)>>," + "<<10:(1024*1024*10)>>, garbage_collect() end.">>), + ?line "1: syntax error before: '.'" = comm_err("1-."), + %% ?line comm_err(<<"exit().">>), % would hang + ?line "exception error: no function clause matching call to history/1" = + comm_err(<<"history(foo).">>), + ?line "exception error: no function clause matching call to results/1" = + comm_err(<<"results(foo).">>), + + ?line Test = filename:join(?config(priv_dir, Config), + "otp_6554.erl"), + Contents = <<"-module(otp_6554). + -export([local_allowed/3, non_local_allowed/3]). + local_allowed(_,_,State) -> + {true,State}. + + non_local_allowed(_,_,State) -> + {true,State}. + ">>, + ?line ok = compile_file(Config, Test, Contents, []), + ?line "exception exit: restricted shell starts now" = + comm_err(<<"begin shell:start_restricted(otp_6554) end.">>), + ?line "-record(r,{}).\n1.\nok.\n" = + t(<<"f(), f(B), h(), b(), history(20), results(20)," + "rd(r, {}), rl(r), rf('_'), rl(), rf()," + "rp(1), _ = rr({foo}), _ = rr({foo}, [])," + "rr({foo}, [], []), ok.">>), + ?line "false.\n" = t(<<"catch_exception(true).">>), + ?line "exception exit: restricted shell stopped"= + comm_err(<<"begin shell:stop_restricted() end.">>), + ?line "true.\n" = t(<<"catch_exception(false).">>), + + ?line "20\n1\n1\n1: results(2)\n2: 1\n-> 1\n3: v(2)\n-> 1.\nok.\n" = + t(<<"results(2). 1. v(2). h().">>), + ?line application:unset_env(stdlib, shell_saved_results), + ?line "1\nfoo\n17\nB = foo\nC = 17\nF = fun() ->\n foo" + "\n end.\nok.\n" = + t(<<"begin F = fun() -> foo end, 1 end. B = F(). C = 17. b().">>), + + %% Tests I'd like to do: (you should try them manually) + %% "catch spawn_link(fun() -> timer:sleep(1000), exit(foo) end)." + %% "** exception error: foo" should be output after 1 second + %% "catch spawn_link(fun() -> timer:sleep(1000), 1/0 end)." + %% "** exception error: bad argument..." should be output after 1 second + %% "1/0", "exit(foo)", "throw(foo)". + %% "h()." should show {'EXIT', {badarith,..}}, {'EXIT',{foo,...}}, + %% and {'EXIT',{{nocatch,foo},...}}. + + ok. + +otp_6785(doc) -> + "OTP-6785. Parameterized modules."; +otp_6785(suite) -> []; +otp_6785(Config) when is_list(Config) -> + MFile = filename:join(?config(priv_dir, Config), "parameterized.erl"), + Contents = <<"-module(parameterized, [A]). " + "-export([test/0]). " + "test() -> A. ">>, + ?line ok = compile_file(Config, MFile, Contents, []), + ?line (parameterized:new(adsf)):test(), + file:delete(MFile), + ok. + +otp_7184(doc) -> + "OTP-7184. Propagate exit signals from dying evaluator process."; +otp_7184(suite) -> []; +otp_7184(Config) when is_list(Config) -> + register(otp_7184, self()), + ?line catch + t(<<"P = self(), + spawn_link(fun() -> process_flag(trap_exit,true), + P ! up, + receive X -> + otp_7184 ! {otp_7184, X} + end + end), + receive up -> ok end, + erlang:raise(throw, thrown, []).">>), + receive {otp_7184,{'EXIT',_,{{nocatch,thrown},[]}}} -> ok end, + + ?line catch + t(<<"P = self(), + spawn_link(fun() -> process_flag(trap_exit,true), + P ! up, + receive X -> + otp_7184 ! {otp_7184, X} + end + end), + receive up -> ok end, + erlang:raise(exit, fini, []).">>), + receive {otp_7184,{'EXIT',_,{fini,[]}}} -> ok end, + + ?line catch + t(<<"P = self(), + spawn_link(fun() -> process_flag(trap_exit,true), + P ! up, + receive X -> + otp_7184 ! {otp_7184,X} + end + end), + receive up -> ok end, + erlang:raise(error, bad, []).">>), + receive {otp_7184,{'EXIT',_,{bad,[]}}} -> ok end, + + unregister(otp_7184), + + %% v/1, a few missed cases + ?line "17\n<<0,0,0,64>>.\nok.\n" = + t(<<"17. " + "<<64:32>>. " + "<<64>> = << << X >> || << X >> <= v(2), X > v(1) >>, ok.">>), + + ?line "17\n<<0,17>>.\n" =t(<<"17. <<(v(1)):16>>.">>), + + ok. + +otp_7232(doc) -> + "OTP-7232. qlc:info() bug."; +otp_7232(suite) -> []; +otp_7232(Config) when is_list(Config) -> + Info = <<"qlc:info(qlc:sort(qlc:q([X || X <- [1000,2000]]), " + "{order, fun(A,B)-> A>B end})).">>, + "qlc:sort([1000,2000],\n" + " [{order,\n" + " fun(A, B) ->\n" + " A > B\n" + " end}])" = evaluate(Info, []), + ok. + +-ifdef(not_used). +exit_term(B) -> + "** exception exit:" ++ Reply = t(B), + S0 = string:left(Reply, string:chr(Reply, $\n)-1), + S = string:strip(S0, right, $*), + {ok,Ts,_} = erl_scan:string(S), + {ok,Term} = erl_parse:parse_term(Ts), + Term. +-endif. + +error_string(B) -> + "** exception error:" ++ Reply = t(B), + caught_string(Reply). + +exit_string(B) -> + "** exception exit:" ++ Reply = t(B), + caught_string(Reply). + +caught_string(Reply) -> + S0 = string:left(Reply, string:chr(Reply, $\n)-1), + S1 = string:strip(S0, right, $.), + S2 = string:strip(S1, left, $*), + S = string:strip(S2, both, $ ), + string:strip(S, both, $"). + +comm_err(B) -> + Reply = t(B), + S0 = string:left(Reply, string:chr(Reply, $\n)-1), + S1 = string:strip(S0, left, $*), + S2 = string:strip(S1, both, $ ), + S = string:strip(S2, both, $"), + string:strip(S, right, $.). + +scan(B) -> + F = fun(Ts) -> + case erl_parse:parse_term(Ts) of + {ok,Term} -> + Term; + _Error -> + {ok,Form} = erl_parse:parse_form(Ts), + Form + end + end, + scan(t(B), F). + +scan(S0, F) -> + case erl_scan:tokens([], S0, 1) of + {done,{ok,Ts,_},S} -> + [F(Ts) | scan(S, F)]; + _Else -> + [] + end. + +t({Node,Bin}) when is_atom(Node),is_binary(Bin) -> + t0(Bin, fun() -> start_new_shell(Node) end); +t(Bin) when is_binary(Bin) -> + t0(Bin, fun() -> start_new_shell() end); +t(L) -> + t(list_to_binary(L)). + +t0(Bin, F) -> + %% Spawn a process so that io_request messages do not interfer. + P = self(), + C = spawn(fun() -> t1(P, Bin, F) end), + receive {C, R} -> R end. + +t1(Parent, Bin, F) -> + %% io:format("*** Testing ~s~n", [binary_to_list(Bin)]), + S = #state{bin = Bin, reply = [], leader = group_leader()}, + group_leader(self(), self()), + _Shell = F(), + try + server_loop(S) + catch exit:R -> Parent ! {self(), R}; + throw:{?MODULE,LoopReply} -> + L0 = binary_to_list(list_to_binary(LoopReply)), + [$\n | L1] = lists:dropwhile(fun(X) -> X =/= $\n end, L0), + Parent ! {self(), dotify(L1)} + after group_leader(S#state.leader, self()) + end. + +dotify([$., $\n | L]) -> + [$., $\n | dotify(L)]; +dotify([$,, $\n | L]) -> + [$,, $\n | dotify(L)]; +dotify("ok\n" ++ L) -> + "ok.\n" ++ dotify(L); +dotify("\nok\n" ++ L) -> + ".\nok.\n" ++ dotify(L); +dotify([$\n]) -> + [$., $\n]; +dotify([C | L]) -> + [C | dotify(L)]; +dotify([]) -> + []. + +start_new_shell() -> + Shell = shell:start(), + link(Shell), + Shell. + +start_new_shell(Node) -> + Shell = rpc:call(Node,shell,start,[]), + link(Shell), + Shell. + +%% This is a very minimal implementation of the IO protocol... + +server_loop(S) -> + receive + {io_request, From, ReplyAs, Request} when is_pid(From) -> + server_loop(do_io_request(Request, From, S, ReplyAs)); + NotExpected -> + exit(NotExpected) + end. + +do_io_request(Req, From, S, ReplyAs) -> + case io_requests([Req], [], S) of + {_Status,{eof,_},S1} -> + io_reply(From, ReplyAs, {error,terminated}), + throw({?MODULE,S1#state.reply}); + {_Status,Reply,S1} -> + io_reply(From, ReplyAs, Reply), + S1 + end. + +io_reply(From, ReplyAs, Reply) -> + From ! {io_reply, ReplyAs, Reply}. + +io_requests([{requests, Rs1} | Rs], Cont, S) -> + io_requests(Rs1, [Rs | Cont], S); +io_requests([R | Rs], Cont, S) -> + case io_request(R, S) of + {ok, ok, S1} -> + io_requests(Rs, Cont, S1); + Reply -> + Reply + end; +io_requests([], [Rs|Cont], S) -> + io_requests(Rs, Cont, S); +io_requests([], [], S) -> + {ok,ok,S}. + +io_request({get_geometry,columns}, S) -> + {ok,80,S}; +io_request({get_geometry,rows}, S) -> + {ok,24,S}; +io_request({put_chars,Chars}, S) -> + {ok,ok,S#state{reply = [S#state.reply | Chars]}}; +io_request({put_chars,_,Chars}, S) -> + {ok,ok,S#state{reply = [S#state.reply | Chars]}}; +io_request({put_chars,Mod,Func,Args}, S) -> + case catch apply(Mod, Func, Args) of + Chars when is_list(Chars) -> + io_request({put_chars,Chars}, S) + end; +io_request({put_chars,Enc,Mod,Func,Args}, S) -> + case catch apply(Mod, Func, Args) of + Chars when is_list(Chars) -> + io_request({put_chars,Enc,Chars}, S) + end; +io_request({get_until,_Prompt,Mod,Func,ExtraArgs}, S) -> + get_until(Mod, Func, ExtraArgs, S, latin1); +io_request({get_until,Enc,_Prompt,Mod,Func,ExtraArgs}, S) -> + get_until(Mod, Func, ExtraArgs, S, Enc). + +get_until(Mod, Func, ExtraArgs, S, Enc) -> + get_until_loop(Mod, Func, ExtraArgs, S, {more,[]}, Enc). + +get_until_loop(M, F, As, S, {more,Cont}, Enc) -> + Bin = S#state.bin, + case byte_size(Bin) of + 0 -> + get_until_loop(M, F, As, S, + catch apply(M, F, [Cont,eof|As]), Enc); + _ -> + get_until_loop(M, F, As, S#state{bin = <<>>}, + catch apply(M, F, [Cont,binary_to_list(Bin)|As]), Enc) + end; +get_until_loop(_M, _F, _As, S, {done,Res,Buf}, Enc) -> + {ok,Res,S#state{bin = buf2bin(Buf, Enc)}}; +get_until_loop(_M, F, _As, S, _Other, _Enc) -> + {error,{error,F},S}. + +buf2bin(eof,_) -> + <<>>; +buf2bin(Buf,latin1) -> + list_to_binary(Buf); +buf2bin(Buf,unicode) -> + unicode:characters_to_binary(Buf,unicode,unicode). + +run_file(Config, Module, Test) -> + FileName = filename(lists:concat([Module, ".erl"]), Config), + BeamFile = filename(lists:concat([Module, ".beam"]), Config), + LoadBeamFile = filename(Module, Config), + ok = file:write_file(FileName, Test), + ok = compile_file(Config, FileName, Test, []), + code:purge(Module), + {module, Module} = code:load_abs(LoadBeamFile), + ok = Module:t(), + file:delete(FileName), + file:delete(BeamFile), + ok. + +compile_file(Config, File, Test, Opts0) -> + ?line Opts = [export_all,return,{outdir,?config(priv_dir, Config)}|Opts0], + ?line ok = file:write_file(File, Test), + ?line case compile:file(File, Opts) of + {ok, _M, _Ws} -> ok; + _ -> error + end. + +filename(Name, Config) when is_atom(Name) -> + filename(atom_to_list(Name), Config); +filename(Name, Config) -> + filename:join(?config(priv_dir, Config), Name). + +start_node(Name, Xargs) -> + ?line N = test_server:start_node(Name, slave, [{args, " " ++ Xargs}]), + global:sync(), + N. + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/slave_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/slave_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/slave_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/slave_SUITE.erl 2009-11-20 13:30:20.000000000 +0000 @@ -0,0 +1,261 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(slave_SUITE). + +-include("test_server.hrl"). + +-export([all/1, t_start/1, t_start_link/1, + start_link_nodedown/1, errors/1]). + +%% Internal exports. +-export([fun_init/1, test_errors/1]). +-export([timeout_test/1, auth_test/1, rsh_test/1, start_a_slave/3]). + +all(suite) -> + [t_start_link, start_link_nodedown, t_start, errors]. + +t_start_link(suite) -> []; +t_start_link(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(20)), + + %% Define useful variables. + + ?line Host = host(), + ?line Slave1 = node_name(Host, slave1), + ?line Slave2 = node_name(Host, slave2), + + %% Test slave:start_link() with one, two, and three arguments. + + ?line ThisNode = node(), + ?line {error, {already_running, ThisNode}} = slave:start_link(Host), + ?line {ok, Slave1} = slave:start_link(Host, slave1), + ?line {ok, Slave2} = slave:start_link(Host, slave2, "-my_option 42"), + ?line {ok, [["42"]]} = rpc:call(Slave2, init, get_argument, [my_option]), + + %% Kill the two slave nodes and verify that they are dead. + + ?line rpc:cast(Slave1, erlang, halt, []), + ?line rpc:cast(Slave2, erlang, halt, []), + ?line is_dead(Slave1), + ?line is_dead(Slave2), + + %% Start two slave nodes from another process and verify that + %% the slaves die when that process terminates. + + Parent = self(), + Pid = fun_spawn(fun () -> + {ok, Slave1} = slave:start_link(Host, slave1), + {ok, Slave2} = slave:start_link(Host, slave2), + Parent ! slaves_started, + receive never -> ok end + end), + ?line receive slaves_started -> ok end, + ?line process_flag(trap_exit, true), + ?line wait_alive(Slave1), + ?line wait_alive(Slave2), + ?line exit(Pid, kill), + ?line receive {'EXIT', Pid, killed} -> ok end, + ?line test_server:sleep(250), + ?line is_dead(Slave1), + ?line is_dead(Slave2), + + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Test that slave:start_link() works when the master exits. + +start_link_nodedown(suite) -> []; +start_link_nodedown(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(20)), + + %% Define useful variables. + + ?line Host = host(), + ?line Master = node_name(Host, my_master), + ?line Slave = node_name(Host, my_slave), + + ?line Pa = "-pa " ++ filename:dirname(code:which(?MODULE)), + ?line {ok, Master} = slave:start_link(Host, my_master, Pa), + ?line spawn(Master, ?MODULE, start_a_slave, [self(), Host, my_slave]), + ?line {reply, {ok, _Node}} = receive Any -> Any end, + + ?line rpc:call(Master, erlang, halt, []), + ?line receive after 200 -> ok end, + ?line pang = net_adm:ping(Slave), + + ?line test_server:timetrap_cancel(Dog), + ok. + +start_a_slave(ReplyTo, Host, Name) -> + ReplyTo ! {reply, slave:start_link(Host, Name)}, + receive never -> ok end. + +%% Test slave:start(). + +t_start(suite) -> []; +t_start(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(20)), + + %% Define useful variables. + + ?line Host = host(), + ?line Slave1 = node_name(Host, slave1), + ?line Slave2 = node_name(Host, slave2), + + %% By running all tests from this master node which is linked + %% to this test case, we ensure that all slaves are killed + %% if this test case fails. (If they are not, and therefore further + %% test cases fail, there is a bug in slave.) + + ?line {ok, Master} = slave:start_link(Host, master), + + %% Test slave:start() with one, two, and three arguments. + + ?line ThisNode = node(), + ?line {error, {already_running, ThisNode}} = slave:start(Host), + ?line {ok, Slave1} = rpc:call(Master, slave, start, [Host, slave1]), + ?line {ok, Slave2} = rpc:call(Master, slave, start, + [Host, slave2, "-my_option 42"]), + ?line {ok, [["42"]]} = rpc:call(Slave2, init, get_argument, [my_option]), + + %% Test that a slave terminates when its master node terminates. + + ?line ok = slave:stop(Slave2), + ?line is_dead(Slave2), + ?line {ok, Slave2} = rpc:call(Slave1, slave, start, [Host, slave2]), + ?line is_alive(Slave2), + ?line rpc:call(Slave1, erlang, halt, []), % Kill master. + receive after 1000 -> ok end, % Make sure slaves have noticed + % their dead master. + ?line is_dead(Slave1), + ?line is_dead(Slave2), % Slave should be dead, too. + + %% Kill all slaves and verify that they are dead. + + ?line ok = slave:stop(Slave1), + ?line ok = slave:stop(Slave2), + ?line is_dead(Slave1), + ?line is_dead(Slave2), + + ?line test_server:timetrap_cancel(Dog), + ok. + +%% Test the various error conditions in parallell (since the timeout +%% in slave is 32 seconds). + +errors(suite) -> []; +errors(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(50)), + + ?line process_flag(trap_exit, true), + ?line Pa = filename:dirname(code:which(?MODULE)), + ?line {ok, Master} = slave_start_link(host(), master, + "-rsh no_rsh_program -pa "++Pa++ + " -env ERL_CRASH_DUMP erl_crash_dump.master"), + ?line Pids = rpc:call(Master, ?MODULE, test_errors, [self()]), + ?line wait_for_result(Pids), + + ?line test_server:timetrap_cancel(Dog), + ok. + +wait_for_result([]) -> + ok; +wait_for_result(Pids) -> + ?line receive + {'EXIT', Pid, normal} -> + io:format("Process ~p terminated", [Pid]), + wait_for_result(lists:delete(Pid, Pids)); + {'EXIT', _, Reason} -> + exit(Reason) + end. + +show_process_info(Pid) -> + io:format("~p: ~p", [Pid, catch process_info(Pid, initial_call)]). + +test_errors(ResultTo) -> + %% Sigh! We use ordinary spawn instead of fun_spawn/1 to be able + %% identify the processes by their initial call. + ?line P1 = spawn(?MODULE, timeout_test, [ResultTo]), + ?line P2 = spawn(?MODULE, auth_test, [ResultTo]), + ?line P3 = spawn(?MODULE, rsh_test, [ResultTo]), + Pids =[P1, P2, P3], + ?line lists:foreach(fun show_process_info/1, Pids), + Pids. + +timeout_test(ResultTo) -> + link(ResultTo), + ?line {error, timeout} = slave:start(host(), slave1, "-boot no_boot_script"). + +auth_test(ResultTo) -> + link(ResultTo), + ?line {error, timeout} = slave:start(host(), slave2, + "-setcookie definitely_not_a_cookie"). + +rsh_test(ResultTo) -> + link(ResultTo), + ?line {error, no_rsh} = slave:start(super, slave3). + + +%%% Utilities. + + +wait_alive(Node) -> + wait_alive_1(10, Node). + +wait_alive_1(0, Node) -> + ?t:fail({still_not_alive,Node}); +wait_alive_1(N, Node) -> + case rpc:call(Node, init, get_status, []) of + {started,_} -> + ok; + {starting,_} -> + receive after 1 -> ok end, + wait_alive_1(N-1, Node) + end. + +is_alive(Node) -> + {started, _} = rpc:call(Node, init, get_status, []). + +is_dead(Node) -> + {badrpc, nodedown} = rpc:call(Node, init, get_status, []). + +node_name(Host, Name) -> + list_to_atom(lists:concat([Name, "@", Host])). + +host() -> + from($@, atom_to_list(node())). + +from(H, [H | T]) -> T; +from(H, [_ | T]) -> from(H, T); +from(_H, []) -> []. + +slave_start_link(Host, Name, Args) -> + case slave:start_link(Host, Name, Args) of + {ok, Node} -> + {ok, Node}; + Other -> + io:format("slave:start_link(~p, ~p, ~p) -> ~p", + [Host, Name, Args, Other]) + end. + +fun_spawn(Fun) -> + spawn_link(?MODULE, fun_init, [Fun]). + +fun_init(Fun) -> + Fun(). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/sofs_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/sofs_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/sofs_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/sofs_SUITE.erl 2009-11-20 13:31:16.000000000 +0000 @@ -0,0 +1,2374 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(sofs_SUITE). + +%-define(debug, true). + +-ifdef(debug). +-define(format(S, A), io:format(S, A)). +-define(line, put(line, ?LINE), ). +-define(config(X,Y), foo). +-define(t, test_server). +-else. +-include("test_server.hrl"). +-define(format(S, A), ok). +-endif. + +-export([all/1]). + +-export([sofs/1, from_term_1/1, set_1/1, from_sets_1/1, relation_1/1, + a_function_1/1, family_1/1, projection/1, + relation_to_family_1/1, domain_1/1, range_1/1, image/1, + inverse_image/1, inverse_1/1, converse_1/1, no_elements_1/1, + substitution/1, restriction/1, drestriction/1, + strict_relation_1/1, extension/1, weak_relation_1/1, + to_sets_1/1, specification/1, union_1/1, intersection_1/1, + difference/1, symdiff/1, symmetric_partition/1, + is_sofs_set_1/1, is_set_1/1, is_equal/1, is_subset/1, + is_a_function_1/1, is_disjoint/1, join/1, canonical/1, + composite_1/1, relative_product_1/1, relative_product_2/1, + product_1/1, partition_1/1, partition_3/1, + multiple_relative_product/1, digraph/1, constant_function/1, + misc/1]). + +-export([sofs_family/1, family_specification/1, + family_domain_1/1, family_range_1/1, + family_to_relation_1/1, + union_of_family_1/1, intersection_of_family_1/1, + family_projection/1, family_difference/1, + family_intersection_1/1, family_union_1/1, + family_intersection_2/1, family_union_2/1, + partition_family/1]). + +-import(sofs, + [a_function/1, a_function/2, constant_function/2, + canonical_relation/1, composite/2, + converse/1, extension/3, from_term/1, from_term/2, + difference/2, domain/1, empty_set/0, family_difference/2, + family_intersection/1, family_intersection/2, family_union/1, + family_union/2, family/1, family/2, family_specification/2, + family_domain/1, family_range/1, family_field/1, + family_projection/2, family_to_relation/1, union_of_family/1, + field/1, from_external/2, image/2, intersection/1, + intersection/2, intersection_of_family/1, inverse/1, + inverse_image/2, is_disjoint/2, is_empty_set/1, is_equal/2, + is_a_function/1, is_set/1, is_sofs_set/1, is_subset/2, + join/4, from_sets/1, multiple_relative_product/2, + no_elements/1, partition/1, partition/2, partition/3, + partition_family/2, product/1, product/2, projection/2, + range/1, relation/1, relation/2, relation_to_family/1, + relative_product/1, relative_product/2, relative_product1/2, + strict_relation/1, weak_relation/1, restriction/2, + restriction/3, drestriction/2, drestriction/3, to_sets/1, + is_type/1, set/1, set/2, specification/2, substitution/2, + symdiff/2, symmetric_partition/2, to_external/1, type/1, + union/1, union/2, family_to_digraph/1, family_to_digraph/2, + digraph_to_family/1, digraph_to_family/2]). + +-export([init_per_testcase/2, fin_per_testcase/2]). + +-compile({inline,[{eval,2}]}). + +all(suite) -> + [sofs, sofs_family]. + +init_per_testcase(_Case, Config) -> + Dog=?t:timetrap(?t:minutes(2)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +%% [{2,b},{1,a,b}] == lists:sort([{2,b},{1,a,b}]) +%% [{1,a,b},{2,b}] == lists:keysort(1,[{2,b},{1,a,b}]) + +sofs(suite) -> + [from_term_1, set_1, from_sets_1, relation_1, a_function_1, + family_1, relation_to_family_1, domain_1, range_1, image, + inverse_image, inverse_1, converse_1, no_elements_1, + substitution, restriction, drestriction, projection, + strict_relation_1, extension, weak_relation_1, to_sets_1, + specification, union_1, intersection_1, difference, symdiff, + symmetric_partition, is_sofs_set_1, is_set_1, is_equal, + is_subset, is_a_function_1, is_disjoint, join, canonical, + composite_1, relative_product_1, relative_product_2, product_1, + partition_1, partition_3, multiple_relative_product, digraph, + constant_function, misc]. + +from_term_1(suite) -> []; +from_term_1(doc) -> [""]; +from_term_1(Conf) when list(Conf) -> + %% would go wrong: projection(1,from_term([{2,b},{1,a,b}])), + + ?line {'EXIT', {badarg, _}} = (catch from_term([], {atom,'_',atom})), + ?line {'EXIT', {badarg, _}} = (catch from_term([], [])), + ?line {'EXIT', {badarg, _}} = (catch from_term([], [atom,atom])), + + ?line [] = to_external(from_term([])), + ?line eval(from_term([]), empty_set()), + ?line [] = to_external(from_term([], ['_'])), + ?line eval(from_term([], ['_']), empty_set()), + ?line [[]] = to_external(from_term([[]])), + ?line [[['_']]] = type(from_term([[],[[]]])), + ?line [[],[[]]] = to_external(from_term([[],[[]]])), + ?line [[['_']]] = type(from_term([[],[[]]])), + ?line eval(from_term([a],['_']), set([a])), + ?line [[],[a]] = to_external(from_term([[],[a]])), + ?line [[],[{a}]] = to_external(from_term([[{a}],[]])), + ?line [{[],[{a,b,[d]}]},{[{a,b}],[]}] = + to_external(from_term([{[],[{a,b,[d]}]},{[{a,b}],[]}])), + + ?line [{[a,b],[c,d]}] = to_external(from_term([{[a,b],[c,d]}])), + ?line [{{a,b},[a,b],{{a},{b}}}] = + to_external(from_term([{{a,b},[a,b],{{a},{b}}}])), + ?line [{{a,{[a,b]},a}},{{z,{[y,z]},z}}] = + to_external(from_term([{{a,{[a,b,a]},a}},{{z,{[y,y,z]},z}}])), + ?line {'EXIT', {badarg, _}} = + (catch from_term([{m1,[{m1,f1,1},{m1,f2,2}]},{m2,[]},{m3,[a]}])), + ?line MS1 = [{m1,[{m1,f1,1},{m1,f2,2}]},{m2,[]},{m3,[{m3,f3,3}]}], + ?line eval(to_external(from_term(MS1)), MS1), + + ?line eval(to_external(from_term(a)), a), + ?line eval(to_external(from_term({a})), {a}), + + ?line eval(to_external(from_term([[a],[{b,c}]],[[atomic]])), + [[a],[{b,c}]]), + ?line eval(type(from_term([[a],[{b,c}]],[[atomic]])), + [[atomic]]), + + ?line {'EXIT', {badarg, _}} = (catch from_term([[],[],a])), + ?line {'EXIT', {badarg, _}} = (catch from_term([{[a,b],[c,{d}]}])), + ?line {'EXIT', {badarg, _}} = (catch from_term([[],[a],[{a}]])), + ?line {'EXIT', {badarg, _}} = (catch from_term([a,{a,b}])), + ?line {'EXIT', {badarg, _}} = (catch from_term([[a],[{b,c}]],[['_']])), + ?line {'EXIT', {badarg, _}} = (catch from_term([a | {a,b}])), + ?line {'EXIT', {badarg, _}} = + (catch from_term([{{a},b,c},{d,e,f}],[{{atom},atom,atom}])), + ?line {'EXIT', {badarg, _}} = + (catch from_term([{a,{b,c}} | tail], [{atom,{atom,atom}}])), + ?line {'EXIT', {badarg, _}} = (catch from_term({})), + ?line {'EXIT', {badarg, _}} = (catch from_term([{}])), + + ?line [{foo,bar},[b,a]] = + to_external(from_term([[b,a],{foo,bar},[b,a]], [atom])), + ?line [{[atom],{atom,atom}}] = + type(from_term([{[], {a,b}},{[a,b],{e,f}}])), + ?line [{[atom],{atom,atom}}] = + type(from_term([{[], {a,b}},{[a,b],{e,f}}], [{[atom],{atom,atom}}])), + ?line [[atom]] = type(from_term([[a],[{b,c}]],[[atom]])), + + ?line {atom, atom} = type(from_term({a,b}, {atom, atom})), + ?line atom = type(from_term(a, atom)), + ?line {'EXIT', {badarg, _}} = (catch from_term({a,b},{atom})), + ?line [{{a},b,c},{{d},e,f}] = + to_external(from_term([{{a},b,c},{{a},b,c},{{d},e,f}], + [{{atom},atom,atom}])), + + %% from_external too... + ?line e = to_external(from_external(e, atom)), + ?line {e} = to_external(from_external({e}, {atom})), + ?line [e] = to_external(from_external([e], [atom])), + + %% and is_type... + ?line true = is_type(['_']), + ?line false = is_type('_'), + ?line true = is_type([['_']]), + ?line false = is_type({atom,[],atom}), + ?line false = is_type({atom,'_',atom}), + ?line true = is_type({atom,atomic,atom}), + ?line true = is_type({atom,atom}), + ?line true = is_type(atom), + ?line true = is_type([atom]), + ?line true = is_type(type), + + ok. + +set_1(suite) -> []; +set_1(doc) -> [""]; +set_1(Conf) when list(Conf) -> + %% set/1 + ?line {'EXIT', {badarg, _}} = (catch set(a)), + ?line {'EXIT', {badarg, _}} = (catch set({a})), + ?line eval(set([]), from_term([],[atom])), + ?line eval(set([a,b,c]), from_term([a,b,c])), + ?line eval(set([a,b,a,a,b]), from_term([a,b])), + ?line eval(set([a,b,c,a,d,d,c,1]), from_term([1,a,b,c,d])), + ?line eval(set([a,b,d,a,c]), from_term([a,b,c,d])), + ?line eval(set([f,e,d,c,d]), from_term([c,d,e,f])), + ?line eval(set([h,f,d,g,g,d,c]), from_term([c,d,f,g,h])), + ?line eval(set([h,e,d,k,l]), from_term([d,e,h,k,l])), + ?line eval(set([h,e,c,k,d]), from_term([c,d,e,h,k])), + + %% set/2 + ?line {'EXIT', {badarg, _}} = (catch set(a, [a])), + ?line {'EXIT', {badarg, _}} = (catch set({a}, [a])), + ?line {'EXIT', {badarg, _}} = (catch set([a], {a})), + ?line {'EXIT', {badarg, _}} = (catch set([a], a)), + ?line {'EXIT', {badarg, _}} = (catch set([a], [a,b])), + ?line {'EXIT', {badarg, _}} = (catch set([a | b],[foo])), + ?line {'EXIT', {badarg, _}} = (catch set([a | b],['_'])), + ?line {'EXIT', {badarg, _}} = (catch set([a | b],[[atom]])), + ?line {'EXIT', {badarg, _}} = (catch set([{}],[{}])), + ?line eval(set([a],['_']), from_term([a],['_'])), + ?line eval(set([], ['_']), empty_set()), + ?line eval(set([a,b,a,b],[foo]), from_term([a,b],[foo])), + + ok. + +from_sets_1(suite) -> []; +from_sets_1(doc) -> [""]; +from_sets_1(Conf) when list(Conf) -> + ?line E = empty_set(), + + %% unordered + ?line eval(from_sets([]), E), + ?line {'EXIT', {type_mismatch, _}} = + (catch from_sets([from_term([{a,b}]), + E, + from_term([{a,b,c}])])), + ?line eval(from_sets([from_term([{a,b}]), E]), + from_term([[],[{a,b}]])), + + ?line eval(from_sets([from_term({a,b},{atom,atom}), + from_term({b,c},{atom,atom})]), + relation([{a,b}, {b,c}])), + ?line {'EXIT', {type_mismatch, _}} = + (catch from_sets([from_term({a,b},{atom,atom}), + from_term({a,b,c},{atom,atom,atom})])), + ?line {'EXIT', {badarg, _}} = (catch from_sets(foo)), + ?line eval(from_sets([E]), from_term([[]])), + ?line eval(from_sets([E,E]), from_term([[]])), + ?line eval(from_sets([E,set([a])]), from_term([[],[a]])), + ?line {'EXIT', {badarg, _}} = (catch from_sets([E,{a}])), + ?line {'EXIT', {type_mismatch, _}} = + (catch from_sets([E,from_term({a}),E])), + ?line {'EXIT', {type_mismatch, _}} = (catch from_sets([from_term({a}),E])), + + %% ordered + ?line O = {from_term(a,atom), from_term({b}, {atom}), set([c,d])}, + ?line eval(from_sets(O), from_term({a,{b},[c,d]}, {atom,{atom},[atom]})), + ?line {'EXIT', {badarg, _}} = (catch from_sets([a,b])), + ?line {'EXIT', {badarg, _}} = (catch from_sets({a,b})), + ?line eval(from_sets({from_term({a}),E}), from_term({{a},[]})), + ok. + +relation_1(suite) -> []; +relation_1(doc) -> [""]; +relation_1(Conf) when list(Conf) -> + %% relation/1 + ?line eval(relation([]), from_term([], [{atom,atom}])), + ?line eval(from_term([{a}]), relation([{a}])), + ?line {'EXIT', {badarg, _}} = (catch relation(a)), + ?line {'EXIT', {badarg, _}} = (catch relation([{a} | a])), + ?line {'EXIT', {badarg, _}} = (catch relation([{}])), + ?line {'EXIT', {badarg, _}} = (catch relation([],0)), + ?line {'EXIT', {badarg, _}} = (catch relation([{a}],a)), + + %% relation/2 + ?line eval(relation([{a},{b}], 1), from_term([{a},{b}])), + ?line eval(relation([{1,a},{2,b},{1,a}], [{x,y}]), + from_term([{1,a},{2,b}], [{x,y}])), + ?line eval(relation([{[1,2],a},{[2,1],b},{[2,1],a}], [{[x],y}]), + from_term([{[1,2],a},{[1,2],b}], [{[x],y}])), + ?line {'EXIT', {badarg, _}} = (catch relation([{1,a},{2,b}], [{[x],y}])), + ?line {'EXIT', {badarg, _}} = (catch relation([{1,a},{1,a,b}], [{x,y}])), + ?line {'EXIT', {badarg, _}} = (catch relation([{a}], 2)), + ?line {'EXIT', {badarg, _}} = (catch relation([{a},{b},{c,d}], 1)), + ?line eval(relation([{{a},[{foo,bar}]}], ['_']), + from_term([{{a},[{foo,bar}]}], ['_'])), + ?line eval(relation([], ['_']), from_term([], ['_'])), + ?line {'EXIT', {badarg, _}} = (catch relation([[a]],['_'])), + ?line eval(relation([{[a,b,a]}], [{[atom]}]), from_term([{[a,b,a]}])), + ?line eval(relation([{[a,b,a],[[d,e,d]]}], [{[atom],[[atom]]}]), + from_term([{[a,b,a],[[d,e,d]]}])), + ?line eval(relation([{[a,b,a],[[d,e,d]]}], [{atom,[[atom]]}]), + from_term([{[a,b,a],[[d,e,d]]}], [{atom,[[atom]]}])), + ok. + +a_function_1(suite) -> []; +a_function_1(doc) -> [""]; +a_function_1(Conf) when list(Conf) -> + %% a_function/1 + ?line eval(a_function([]), from_term([], [{atom,atom}])), + ?line eval(a_function([{a,b},{a,b},{b,c}]), from_term([{a,b},{b,c}])), + ?line {'EXIT', {badarg, _}} = (catch a_function([{a}])), + ?line {'EXIT', {badarg, _}} = (catch a_function([{a},{b},{c,d}])), + ?line {'EXIT', {badarg, _}} = (catch a_function(a)), + ?line {'EXIT', {badarg, _}} = (catch a_function([{a,b} | a])), + ?line {'EXIT', {bad_function, _}} = + (catch a_function([{a,b},{b,c},{a,c}])), + F = 0.0, I = round(F), + if + F == I -> % term ordering + ?line {'EXIT', {bad_function, _}} = + (catch a_function([{I,a},{F,b}])), + ?line {'EXIT', {bad_function, _}} = + (catch a_function([{[I],a},{[F],b}],[{[a],b}])); + true -> + ?line 2 = no_elements(a_function([{I,a},{F,b}])), + ?line 2 = no_elements(a_function([{[I],a},{[F],b}],[{[a],b}])) + end, + + %% a_function/2 + FT = [{atom,atom}], + ?line eval(a_function([], FT), from_term([], FT)), + ?line eval(a_function([{a,b},{b,c},{b,c}], FT), + from_term([{a,b},{b,c}], FT)), + ?line {'EXIT', {badarg, _}} = (catch a_function([{a,b}], [{a}])), + ?line {'EXIT', {badarg, _}} = (catch a_function([{a,b}], [{a,[b,c]}])), + ?line {'EXIT', {badarg, _}} = (catch a_function([{a}], FT)), + ?line {'EXIT', {badarg, _}} = (catch a_function([{a},{b},{c,d}], FT)), + ?line {'EXIT', {badarg, _}} = (catch a_function(a, FT)), + ?line {'EXIT', {badarg, _}} = (catch a_function([{a,b} | a], FT)), + ?line eval(a_function([{{a},[{foo,bar}]}], ['_']), + from_term([{{a},[{foo,bar}]}], ['_'])), + ?line eval(a_function([], ['_']), from_term([], ['_'])), + ?line {'EXIT', {badarg, _}} = (catch a_function([[a]],['_'])), + ?line {'EXIT', {bad_function, _}} = + (catch a_function([{a,b},{b,c},{a,c}], FT)), + ?line eval(a_function([{a,[a]},{a,[a,a]}], [{atom,[atom]}]), + from_term([{a,[a]}])), + ?line eval(a_function([{[b,a],c},{[a,b],c}], [{[atom],atom}]), + from_term([{[a,b],c}])), + ok. + +family_1(suite) -> []; +family_1(doc) -> [""]; +family_1(Conf) when list(Conf) -> + %% family/1 + ?line eval(family([]), from_term([],[{atom,[atom]}])), + ?line {'EXIT', {badarg, _}} = (catch family(a)), + ?line {'EXIT', {badarg, _}} = (catch family([a])), + ?line {'EXIT', {badarg, _}} = (catch family([{a,b}])), + ?line {'EXIT', {badarg, _}} = (catch family([{a,[]} | a])), + ?line {'EXIT', {badarg, _}} = (catch family([{a,[a|b]}])), + ?line {'EXIT', {bad_function, _}} = + (catch family([{a,[a]},{a,[]}])), + ?line {'EXIT', {bad_function, _}} = + (catch family([{a,[]},{b,[]},{a,[a]}])), + F = 0.0, I = round(F), + if + F == I -> % term ordering + ?line {'EXIT', {bad_function, _}} = + (catch family([{I,[a]},{F,[b]}])), + ?line true = (1 =:= no_elements(family([{a,[I]},{a,[F]}]))); + true -> + ?line {'EXIT', {bad_function, _}} = + (catch family([{a,[I]},{a,[F]}])) + end, + ?line eval(family([{a,[]},{b,[b]},{a,[]}]), from_term([{a,[]},{b,[b]}])), + ?line eval(to_external(family([{b,[{hej,san},tjo]},{a,[]}])), + [{a,[]},{b,[tjo,{hej,san}]}]), + ?line eval(family([{a,[a]},{a,[a,a]}]), family([{a,[a]}])), + + %% family/2 + FT = [{a,[a]}], + ?line eval(family([], FT), from_term([],FT)), + ?line {'EXIT', {badarg, _}} = (catch family(a,FT)), + ?line {'EXIT', {badarg, _}} = (catch family([a],FT)), + ?line {'EXIT', {badarg, _}} = (catch family([{a,b}],FT)), + ?line {'EXIT', {badarg, _}} = (catch family([{a,[]} | a],FT)), + ?line {'EXIT', {badarg, _}} = (catch family([{a,[a|b]}], FT)), + ?line {'EXIT', {bad_function, _}} = + (catch family([{a,[a]},{a,[]}], FT)), + ?line {'EXIT', {bad_function, _}} = + (catch family([{a,[]},{b,[]},{a,[a]}], FT)), + ?line eval(family([{a,[]},{b,[b,b]},{a,[]}], FT), + from_term([{a,[]},{b,[b]}], FT)), + ?line eval(to_external(family([{b,[{hej,san},tjo]},{a,[]}], FT)), + [{a,[]},{b,[tjo,{hej,san}]}]), + + ?line eval(family([{{a},[{foo,bar}]}], ['_']), + from_term([{{a},[{foo,bar}]}], ['_'])), + ?line eval(family([], ['_']), from_term([], ['_'])), + ?line {'EXIT', {badarg, _}} = (catch family([[a]],['_'])), + ?line {'EXIT', {badarg, _}} = (catch family([{a,b}],['_'])), + ?line {'EXIT', {badarg, _}} = + (catch family([{a,[foo]}], [{atom,atom}])), + ?line eval(family([{{a},[{foo,bar}]}], [{{dt},[{r1,t2}]}]), + from_term([{{a},[{foo,bar}]}], [{{dt},[{r1,t2}]}])), + ?line eval(family([{a,[a]},{a,[a,a]}],[{atom,[atom]}]), + family([{a,[a]}])), + ?line eval(family([{[a,b],[a]},{[b,a],[a,a]}],[{[atom],[atom]}]), + from_term([{[a,b],[a]},{[b,a],[a,a]}])), + ok. + +projection(suite) -> []; +projection(doc) -> [""]; +projection(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + + %% set of ordered sets + ?line S1 = relation([{a,1},{b,2},{b,22},{c,0}]), + ?line S2 = relation([{a,1},{a,2},{a,3},{b,4},{b,5},{b,6}]), + + ?line eval(projection(1, E), E), + ?line eval(projection(1, ER), set([])), + ?line eval(projection(1, relation([{a,1}])), set([a])), + ?line eval(projection(1, S1), set([a,b,c])), + ?line eval(projection(1, S2), set([a,b])), + ?line eval(projection(2, S1), set([0,1,2,22])), + ?line eval(projection(2, relation([{1,a},{2,a},{3,b}])), set([a,b])), + ?line eval(projection(1, relation([{a},{b},{c}])), set([a,b,c])), + + Fun1 = {external, fun({A,B,C}) -> {A,{B,C}} end}, + ?line eval(projection(Fun1, E), E), + %% No check here: + ?line eval(projection(3, projection(Fun1, empty_set())), E), + ?line E2 = relation([], 3), + ?line eval(projection(Fun1, E2), from_term([], [{atom,{atom,atom}}])), + + Fun2 = {external, fun({A,_B}) -> {A} end}, + ?line eval(projection(Fun2, ER), from_term([], [{atom}])), + ?line eval(projection(Fun2, relation([{a,1}])), relation([{a}])), + ?line eval(projection(Fun2, relation([{a,1},{b,3},{a,2}])), + relation([{a},{b}])), + Fun3 = {external, fun({A,_B,C}) -> {C,{A},C} end}, + ?line eval(projection(Fun3, relation([{a,1,x},{b,3,y},{a,2,z}])), + from_term([{x,{a},x},{y,{b},y},{z,{a},z}])), + Fun4 = {external, fun(A={B,_C,_D}) -> {B, A} end}, + ?line eval(projection(Fun4, relation([{a,1,x},{b,3,y},{a,2,z}])), + from_term([{a,{a,1,x}},{b,{b,3,y}},{a,{a,2,z}}])), + + ?line eval(projection({external, fun({A,B,_C,D}) -> {A,B,A,D} end}, + relation([{1,1,1,2}, {1,1,3,1}])), + relation([{1,1,1,1}, {1,1,1,2}])), + + ?line {'EXIT', {badarg, _}} = (catch projection(1, set([]))), + ?line {'EXIT', {function_clause, _}} = + (catch projection({external, fun({A}) -> A end}, S1)), + ?line {'EXIT', {badarg, _}} = + (catch projection({external, fun({A,_}) -> {A,0} end}, + from_term([{1,a}]))), + + %% {} is not an ordered set + ?line {'EXIT', {badarg, _}} = + (catch projection({external, fun(_) -> {} end}, ER)), + ?line {'EXIT', {badarg, _}} = + (catch projection({external, fun(_) -> {{}} end}, ER)), + ?line eval(projection({external, fun({T,_}) -> T end}, + relation([{{},a},{{},b}])), + set([{}])), + ?line eval(projection({external, fun({T}) -> T end}, relation([{{}}])), + set([{}])), + + ?line eval(projection({external, fun(A) -> {A} end}, + relation([{1,a},{2,b}])), + from_term([{{1,a}},{{2,b}}])), + ?line eval(projection({external, fun({A,B}) -> {B,A} end}, + relation([{1,a},{2,b}])), + relation([{a,1},{b,2}])), + ?line eval(projection({external, fun(X=Y=A) -> {X,Y,A} end}, set([a,b,c])), + relation([{a,a,a},{b,b,b},{c,c,c}])), + + ?line eval(projection({external, fun({A,{_},B}) -> {A,B} end}, + from_term([{a,{a},b},{a,{b},c}])), + relation([{a,b},{a,c}])), + ?line eval(projection({external, fun({A,_,B}) -> {A,B} end}, + relation([{a,{},b},{a,{},c}])), + relation([{a,b},{a,c}])), + Fun5 = fun(S) -> from_term({to_external(S),0}, {type(S),atom}) end, + ?line eval(projection(Fun5, E), E), + ?line eval(projection(Fun5, set([a,b])), from_term([{a,0},{b,0}])), + ?line eval(projection(Fun5, relation([{a,1},{b,2}])), + from_term([{{a,1},0},{{b,2},0}])), + ?line eval(projection(Fun5, from_term([[a],[b]])), + from_term([{[a],0},{[b],0}])), + + F = 0.0, I = round(F), + ?line FR = relation([{I},{F}]), + if + F == I -> % term ordering + true = (no_elements(projection(1, FR)) =:= 1); + true -> + eval(projection(1, FR), set([I,F])) + end, + + %% set of sets + ?line {'EXIT', {badarg, _}} = + (catch projection({external, fun(X) -> X end}, + from_term([], [[atom]]))), + ?line {'EXIT', {badarg, _}} = + (catch projection({external, fun(X) -> X end}, from_term([[a]]))), + ?line eval(projection({sofs,union}, + from_term([[[1,2],[2,3]], [[a,b],[b,c]]])), + from_term([[1,2,3], [a,b,c]])), + ?line eval(projection(fun(_) -> from_term([a]) end, + from_term([[b]], [[a]])), + from_term([[a]])), + ?line eval(projection(fun(_) -> from_term([a]) end, + from_term([[1,2],[3,4]])), + from_term([[a]])), + Fun10 = fun(S) -> + %% Cheating a lot... + case to_external(S) of + [1] -> from_term({1,1}); + _ -> S + end + end, + ?line eval(projection(Fun10, from_term([[1]])), from_term([{1,1}])), + ?line eval(projection(fun(_) -> from_term({a}) end, from_term([[a]])), + from_term([{a}])), + ?line {'EXIT', {badarg, _}} = + (catch projection(fun(_) -> {a} end, from_term([[a]]))), + + ok. + +substitution(suite) -> []; +substitution(doc) -> [""]; +substitution(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + + %% set of ordered sets + ?line S1 = relation([{a,1},{b,2},{b,22},{c,0}]), + ?line S2 = relation([{a,1},{a,2},{a,3},{b,4},{b,5},{b,6}]), + + ?line eval(substitution(1, E), E), + %% No check here: + Fun0 = {external, fun({A,B,C}) -> {A,{B,C}} end}, + ?line eval(substitution(3, substitution(Fun0, empty_set())), E), + ?line eval(substitution(1, ER), from_term([],[{{atom,atom},atom}])), + ?line eval(substitution(1, relation([{a,1}])), from_term([{{a,1},a}])), + ?line eval(substitution(1, S1), + from_term([{{a,1},a},{{b,2},b},{{b,22},b},{{c,0},c}])), + ?line eval(substitution(1, S2), + from_term([{{a,1},a},{{a,2},a},{{a,3},a},{{b,4},b}, + {{b,5},b},{{b,6},b}])), + ?line eval(substitution(2, S1), + from_term([{{a,1},1},{{b,2},2},{{b,22},22},{{c,0},0}])), + + Fun1 = fun({A,_B}) -> {A} end, + XFun1 = {external, Fun1}, + ?line eval(substitution(XFun1, E), E), + ?line eval(substitution(Fun1, E), E), + ?line eval(substitution(XFun1, ER), from_term([], [{{atom,atom},{atom}}])), + ?line eval(substitution(XFun1, relation([{a,1}])), + from_term([{{a,1},{a}}])), + ?line eval(substitution(XFun1, relation([{a,1},{b,3},{a,2}])), + from_term([{{a,1},{a}},{{a,2},{a}},{{b,3},{b}}])), + ?line eval(substitution({external, fun({A,_B,C}) -> {C,A,C} end}, + relation([{a,1,x},{b,3,y},{a,2,z}])), + from_term([{{a,1,x},{x,a,x}},{{a,2,z},{z,a,z}}, + {{b,3,y},{y,b,y}}])), + Fun2 = fun(S) -> {A,_B} = to_external(S), from_term({A}) end, + ?line eval(substitution(Fun2, ER), E), + ?line eval(substitution(Fun2, relation([{a,1}])), + from_term([{{a,1},{a}}])), + Fun3 = fun(S) -> from_term({to_external(S),0}, {type(S),atom}) end, + ?line eval(substitution(Fun3, E), E), + ?line eval(substitution(Fun3, set([a,b])), + from_term([{a,{a,0}},{b,{b,0}}])), + ?line eval(substitution(Fun3, relation([{a,1},{b,2}])), + from_term([{{a,1},{{a,1},0}},{{b,2},{{b,2},0}}])), + ?line eval(substitution(Fun3, from_term([[a],[b]])), + from_term([{[a],{[a],0}},{[b],{[b],0}}])), + + ?line eval(substitution(fun(_) -> E end, from_term([[a],[b]])), + from_term([{[a],[]},{[b],[]}])), + + ?line {'EXIT', {badarg, _}} = (catch substitution(1, set([]))), + ?line eval(substitution(1, ER), from_term([], [{{atom,atom},atom}])), + ?line {'EXIT', {function_clause, _}} = + (catch substitution({external, fun({A,_}) -> A end}, set([]))), + ?line {'EXIT', {badarg, _}} = + (catch substitution({external, fun({A,_}) -> {A,0} end}, + from_term([{1,a}]))), + + %% set of sets + ?line {'EXIT', {badarg, _}} = + (catch substitution({external, fun(X) -> X end}, + from_term([], [[atom]]))), + ?line {'EXIT', {badarg, _}} = + (catch substitution({external, fun(X) -> X end}, from_term([[a]]))), + ?line eval(substitution(fun(X) -> X end, from_term([], [[atom]])), E), + ?line eval(substitution({sofs,union}, + from_term([[[1,2],[2,3]], [[a,b],[b,c]]])), + from_term([{[[1,2],[2,3]],[1,2,3]}, {[[a,b],[b,c]],[a,b,c]}])), + ?line eval(substitution(fun(_) -> from_term([a]) end, + from_term([[b]], [[a]])), + from_term([{[b],[a]}], [{[a],[atom]}])), + ?line eval(substitution(fun(_) -> from_term([a]) end, + from_term([[1,2],[3,4]])), + from_term([{[1,2],[a]},{[3,4],[a]}])), + Fun10 = fun(S) -> + %% Cheating a lot... + case to_external(S) of + [1] -> from_term({1,1}); + _ -> S + end + end, + ?line eval(substitution(Fun10, from_term([[1]])), + from_term([{[1],{1,1}}])), + ?line {'EXIT', {type_mismatch, _}} = + (catch substitution(Fun10, from_term([[1],[2]]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch substitution(Fun10, from_term([[1],[0]]))), + + ?line eval(substitution(fun(_) -> from_term({a}) end, from_term([[a]])), + from_term([{[a],{a}}])), + ?line {'EXIT', {badarg, _}} = + (catch substitution(fun(_) -> {a} end, from_term([[a]]))), + + ok. + +restriction(suite) -> []; +restriction(doc) -> [""]; +restriction(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([], 2), + + %% set of ordered sets + ?line S1 = relation([{a,1},{b,2},{b,22},{c,0}]), + ?line eval(restriction(S1, set([a,b])), + relation([{a,1},{b,2},{b,22}])), + ?line eval(restriction(2, S1, set([1,2])), + relation([{a,1},{b,2}])), + ?line eval(restriction(S1, set([a,b,c])), S1), + ?line eval(restriction(1, S1, set([0,1,d,e])), ER), + ?line eval(restriction(1, S1, E), ER), + ?line eval(restriction({external, fun({_A,B,C}) -> {B,C} end}, + relation([{a,aa,1},{b,bb,2},{c,cc,3}]), + relation([{bb,2},{cc,3}])), + relation([{b,bb,2},{c,cc,3}])), + R1 = relation([],[{a,b}]), + ?line eval(restriction(2, R1,sofs:set([],[b])), R1), + Id = fun(X) -> X end, + XId = {external, Id}, + ?line eval(restriction(XId, relation([{a,b}]), E), ER), + ?line eval(restriction(XId, E, relation([{b,d}])), E), + Fun1 = fun(S) -> {_A,B,C} = to_external(S), from_term({B,C}) end, + ?line eval(restriction(Fun1, + relation([{a,aa,1},{b,bb,2},{c,cc,3}]), + relation([{bb,2},{cc,3}])), + relation([{b,bb,2},{c,cc,3}])), + ?line eval(restriction({external, fun({_,{A},B}) -> {A,B} end}, + from_term([{a,{aa},1},{b,{bb},2},{c,{cc},3}]), + from_term([{bb,2},{cc,3}])), + from_term([{b,{bb},2},{c,{cc},3}])), + S5 = relation([{1,a},{2,b},{3,c}]), + ?line eval(restriction(2, S5, set([b,c])), relation([{2,b},{3,c}])), + S4 = relation([{a,1},{b,2},{b,27},{c,0}]), + ?line eval(restriction(2, S4, E), ER), + S6 = relation([{1,a},{2,c},{3,b}]), + ?line eval(restriction(2, S6, set([d,e])), ER), + ?line eval(restriction(2, + relation([{1,d},{2,c},{3,b},{4,a},{5,e}]), + set([c])), + relation([{2,c}])), + ?line eval(restriction(XId, + relation([{1,a},{3,b},{4,c},{4,d}]), + relation([{2,a},{2,c},{4,c}])), + relation([{4,c}])), + ?line eval(restriction(2, relation([{a,b}]), E), ER), + ?line eval(restriction(2, E, relation([{b,d}])), E), + ?line eval(restriction(2, relation([{b,d}]), E), ER), + ?line eval(restriction(XId, E, set([a])), E), + ?line eval(restriction(1, S1, E), ER), + ?line {'EXIT', {badarg, _}} = + (catch restriction(3, relation([{a,b}]), E)), + ?line {'EXIT', {badarg, _}} = + (catch restriction(3, relation([{a,b}]), relation([{b,d}]))), + ?line {'EXIT', {badarg, _}} = + (catch restriction(3, relation([{a,b}]), set([{b,d}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch restriction(2, relation([{a,b}]), relation([{b,d}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch restriction({external, fun({A,_B}) -> A end}, + relation([{a,b}]), relation([{b,d}]))), + ?line {'EXIT', {badarg, _}} = + (catch restriction({external, fun({A,_}) -> {A,0} end}, + from_term([{1,a}]), + from_term([{1,0}]))), + ?line eval(restriction(2, relation([{a,d},{b,e},{c,b},{d,c}]), set([b,d])), + relation([{a,d},{c,b}])), + ?line {'EXIT', {function_clause, _}} = + (catch restriction({external, fun({A,_B}) -> A end}, set([]), E)), + + Fun3 = fun(S) -> from_term({to_external(S),0}, {type(S),atom}) end, + ?line eval(restriction(Fun3, set([1,2]), from_term([{1,0}])), + from_term([1])), + + %% set of sets + ?line {'EXIT', {badarg, _}} = + (catch restriction({external, fun(X) -> X end}, + from_term([], [[atom]]), set([a]))), + S2 = from_term([], [[atom]]), + ?line eval(restriction(Id, S2, E), E), + S3 = from_term([[a],[b]], [[atom]]), + ?line eval(restriction(Id, S3, E), E), + ?line eval(restriction(Id, from_term([], [[atom]]), set([a])), + from_term([], [[atom]])), + ?line eval(restriction({sofs,union}, + from_term([[[a],[b]], [[b],[c]], + [[], [a,b]], [[1],[2]]]), + from_term([[a,b],[1,2,3],[b,c]])), + from_term([[[],[a,b]], [[a],[b]],[[b],[c]]])), + ?line eval(restriction(fun(_) -> from_term([a]) end, + from_term([], [[atom]]), + from_term([], [[a]])), + from_term([], [[atom]])), + ?line {'EXIT', {type_mismatch, _}} = + (catch restriction(fun(_) -> from_term([a]) end, + from_term([[1,2],[3,4]]), + from_term([], [atom]))), + Fun10 = fun(S) -> + %% Cheating a lot... + case to_external(S) of + [1] -> from_term({1,1}); + _ -> S + end + end, + ?line {'EXIT', {type_mismatch, _}} = + (catch restriction(Fun10, from_term([[1]]), from_term([], [[atom]]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch restriction(fun(_) -> from_term({a}) end, + from_term([[a]]), + from_term([], [atom]))), + ?line {'EXIT', {badarg, _}} = + (catch restriction(fun(_) -> {a} end, + from_term([[a]]), + from_term([], [atom]))), + ok. + +drestriction(suite) -> []; +drestriction(doc) -> [""]; +drestriction(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([], 2), + + %% set of ordered sets + ?line S1 = relation([{a,1},{b,2},{b,22},{c,0}]), + ?line eval(drestriction(S1, set([a,b])), relation([{c,0}])), + ?line eval(drestriction(2, S1, set([1,2])), + relation([{b,22},{c,0}])), + ?line eval(drestriction(S1, set([a,b,c])), ER), + ?line eval(drestriction(2, ER, set([a,b])), ER), + ?line eval(drestriction(1, S1, set([0,1,d,e])), S1), + ?line eval(drestriction(1, S1, E), S1), + ?line eval(drestriction({external, fun({_A,B,C}) -> {B,C} end}, + relation([{a,aa,1},{b,bb,2},{c,cc,3}]), + relation([{bb,2},{cc,3}])), + relation([{a,aa,1}])), + Id = fun(X) -> X end, + XId = {external, Id}, + ?line eval(drestriction(XId, relation([{a,b}]), E), relation([{a,b}])), + ?line eval(drestriction(XId, E, relation([{b,d}])), E), + Fun1 = fun(S) -> {_A,B,C} = to_external(S), from_term({B,C}) end, + ?line eval(drestriction(Fun1, + relation([{a,aa,1},{b,bb,2},{c,cc,3}]), + relation([{bb,2},{cc,3}])), + relation([{a,aa,1}])), + ?line eval(drestriction({external, fun({_,{A},B}) -> {A,B} end}, + from_term([{a,{aa},1},{b,{bb},2},{c,{cc},3}]), + from_term([{bb,2},{cc,3}])), + from_term([{a,{aa},1}])), + S5 = relation([{1,a},{2,b},{3,c}]), + ?line eval(drestriction(2, S5, set([b,c])), relation([{1,a}])), + S4 = relation([{a,1},{b,2},{b,27},{c,0}]), + ?line eval(drestriction(2, S4, set([])), S4), + S6 = relation([{1,a},{2,c},{3,b}]), + ?line eval(drestriction(2, S6, set([d,e])), S6), + ?line eval(drestriction(2, + relation([{1,d},{2,c},{3,b},{4,a},{5,e}]), + set([c])), + relation([{1,d},{3,b},{4,a},{5,e}])), + ?line eval(drestriction(XId, + relation([{1,a},{3,b},{4,c},{4,d}]), + relation([{2,a},{2,c},{4,c}])), + relation([{1,a},{3,b},{4,d}])), + ?line eval(drestriction(2, relation([{a,b}]), E), relation([{a,b}])), + ?line eval(drestriction(2, E, relation([{b,d}])), E), + ?line eval(drestriction(2, relation([{b,d}]), E), relation([{b,d}])), + ?line eval(drestriction(XId, E, set([a])), E), + ?line eval(drestriction(1, S1, E), S1), + ?line {'EXIT', {badarg, _}} = + (catch drestriction(3, relation([{a,b}]), E)), + ?line {'EXIT', {badarg, _}} = + (catch drestriction(3, relation([{a,b}]), relation([{b,d}]))), + ?line {'EXIT', {badarg, _}} = + (catch drestriction(3, relation([{a,b}]), set([{b,d}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch drestriction(2, relation([{a,b}]), relation([{b,d}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch drestriction({external, fun({A,_B}) -> A end}, + relation([{a,b}]), relation([{b,d}]))), + ?line {'EXIT', {badarg, _}} = + (catch drestriction({external, fun({A,_}) -> {A,0} end}, + from_term([{1,a}]), + from_term([{1,0}]))), + ?line eval(drestriction(2, relation([{a,d},{b,e},{c,b},{d,c}]), set([b,d])), + relation([{b,e},{d,c}])), + ?line {'EXIT', {function_clause, _}} = + (catch drestriction({external, fun({A,_B}) -> A end}, set([]), E)), + + Fun3 = fun(S) -> from_term({to_external(S),0}, {type(S),atom}) end, + ?line eval(drestriction(Fun3, set([1,2]), from_term([{1,0}])), + from_term([2])), + + %% set of sets + ?line {'EXIT', {badarg, _}} = + (catch drestriction({external, fun(X) -> X end}, + from_term([], [[atom]]), set([a]))), + S2 = from_term([], [[atom]]), + ?line eval(drestriction(Id, S2, E), S2), + S3 = from_term([[a],[b]], [[atom]]), + ?line eval(drestriction(Id, S3, E), S3), + ?line eval(drestriction(Id, from_term([], [[atom]]), set([a])), + from_term([], [[atom]])), + ?line eval(drestriction({sofs,union}, + from_term([[[a],[b]], [[b],[c]], + [[], [a,b]], [[1],[2]]]), + from_term([[a,b],[1,2,3],[b,c]])), + from_term([[[1],[2]]])), + ?line eval(drestriction(fun(_) -> from_term([a]) end, + from_term([], [[atom]]), + from_term([], [[a]])), + from_term([], [[atom]])), + ?line {'EXIT', {type_mismatch, _}} = + (catch drestriction(fun(_) -> from_term([a]) end, + from_term([[1,2],[3,4]]), + from_term([], [atom]))), + Fun10 = fun(S) -> + %% Cheating a lot... + case to_external(S) of + [1] -> from_term({1,1}); + _ -> S + end + end, + ?line {'EXIT', {type_mismatch, _}} = + (catch drestriction(Fun10, from_term([[1]]), from_term([], [[atom]]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch drestriction(fun(_) -> from_term({a}) end, + from_term([[a]]), + from_term([], [atom]))), + ?line {'EXIT', {badarg, _}} = + (catch drestriction(fun(_) -> {a} end, + from_term([[a]]), + from_term([], [atom]))), + ok. + +strict_relation_1(suite) -> []; +strict_relation_1(doc) -> [""]; +strict_relation_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([], 2), + ?line eval(strict_relation(E), E), + ?line eval(strict_relation(ER), ER), + ?line eval(strict_relation(relation([{1,a},{a,a},{2,b}])), + relation([{1,a},{2,b}])), + ?line {'EXIT', {badarg, _}} = + (catch strict_relation(relation([{1,2,3}]))), + F = 0.0, I = round(F), + ?line FR = relation([{F,I}]), + if + F == I -> % term ordering + eval(strict_relation(FR), ER); + true -> + eval(strict_relation(FR), FR) + end, + ok. + +extension(suite) -> []; +extension(doc) -> [""]; +extension(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([], 2), + ?line EF = family([]), + ?line C1 = from_term(3), + ?line C2 = from_term([3]), + ?line {'EXIT', {function_clause, _}} = (catch extension(foo, E, C1)), + ?line {'EXIT', {function_clause, _}} = (catch extension(ER, foo, C1)), + ?line {'EXIT', {{case_clause, _},_}} = (catch extension(ER, E, foo)), + ?line {'EXIT', {type_mismatch, _}} = (catch extension(ER, E, E)), + ?line {'EXIT', {badarg, _}} = (catch extension(C2, E, E)), + ?line eval(E, extension(E, E, E)), + ?line eval(EF, extension(EF, E, E)), + ?line eval(family([{3,[]}]), extension(EF, set([3]), E)), + ?line eval(ER, extension(ER, E, C1)), + ?line eval(E, extension(E, ER, E)), + ?line eval(from_term([],[{{atom,atom},type(ER)}]), extension(E, ER, ER)), + + ?line R1 = relation([{c,7},{c,9},{c,11},{d,17},{f,20}]), + ?line S1 = set([a,c,d,e]), + ?line eval(extension(R1, S1, C1), lextension(R1, S1, C1)), + + ?line S2 = set([1,2,3]), + ?line eval(extension(ER, S2, C1), lextension(ER, S2, C1)), + + ?line R3 = relation([{4,a},{8,b}]), + ?line S3 = set([1,2,3,4,5,6,7,8,9,10,11]), + ?line eval(extension(R3, S3, C1), lextension(R3, S3, C1)), + + ?line R4 = relation([{2,b},{4,d},{6,f}]), + ?line S4 = set([1,3,5,7]), + ?line eval(extension(R4, S4, C1), lextension(R4, S4, C1)), + + ?line F1 = family([{a,[1]},{c,[2]}]), + ?line S5 = set([a,b,c,d]), + ?line eval(extension(F1, S5, C2), lextension(F1, S5, C2)), + ok. + +lextension(R, S, C) -> + union(R, drestriction(1, constant_function(S, C), domain(R))). + +weak_relation_1(suite) -> []; +weak_relation_1(doc) -> [""]; +weak_relation_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([], 2), + ?line eval(weak_relation(E), E), + ?line eval(weak_relation(ER), ER), + ?line eval(weak_relation(relation([{a,1},{a,2},{b,2},{c,c}])), + relation([{1,1},{2,2},{a,1},{a,2},{a,a},{b,2},{b,b},{c,c}])), + ?line eval(weak_relation(relation([{a,1},{a,a},{a,b}])), + relation([{1,1},{a,1},{a,a},{a,b},{b,b}])), + ?line eval(weak_relation(relation([{a,1},{a,b},{7,w}])), + relation([{1,1},{7,7},{7,w},{a,1},{a,a},{a,b},{b,b},{w,w}])), + ?line {'EXIT', {badarg, _}} = + (catch weak_relation(from_term([{{a},a}]))), + ?line {'EXIT', {badarg, _}} = + (catch weak_relation(from_term([{a,a}],[{d,r}]))), + ?line {'EXIT', {badarg, _}} = (catch weak_relation(relation([{1,2,3}]))), + + F = 0.0, I = round(F), + if + F == I -> % term ordering + ?line FR1 = relation([{F,I}]), + eval(weak_relation(FR1), FR1), + ?line FR2 = relation([{F,2},{I,1}]), + true = no_elements(weak_relation(FR2)) =:= 5, + ?line FR3 = relation([{1,0},{1.0,1}]), + true = no_elements(weak_relation(FR3)) =:= 3; + true -> + ok + end, + ok. + +to_sets_1(suite) -> []; +to_sets_1(doc) -> [""]; +to_sets_1(Conf) when list(Conf) -> + ?line {'EXIT', {badarg, _}} = (catch to_sets(from_term(a))), + ?line {'EXIT', {function_clause, _}} = (catch to_sets(a)), + %% unordered + ?line [] = to_sets(empty_set()), + ?line eval(to_sets(from_term([a])), [from_term(a)]), + ?line eval(to_sets(from_term([[]],[[atom]])), [set([])]), + + ?line L = [from_term([a,b]),from_term([c,d])], + ?line eval(to_sets(from_sets(L)), L), + + ?line eval(to_sets(relation([{a,1},{b,2}])), + [from_term({a,1},{atom,atom}), from_term({b,2},{atom,atom})]), + + %% ordered + ?line O = {from_term(a,atom), from_term({b}, {atom}), set([c,d])}, + ?line eval(to_sets(from_sets(O)), O), + ok. + + +specification(suite) -> []; +specification(doc) -> [""]; +specification(Conf) when list(Conf) -> + Fun = {external, fun(I) when integer(I) -> true; (_) -> false end}, + ?line [1,2,3] = to_external(specification(Fun, set([a,1,b,2,c,3]))), + + Fun2 = fun(S) -> is_subset(S, set([1,3,5,7,9])) end, + S2 = from_term([[1],[2],[3],[4],[5],[6],[7]]), + ?line eval(specification(Fun2, S2), from_term([[1],[3],[5],[7]])), + Fun2x = fun([1]) -> true; + ([3]) -> true; + (_) -> false + end, + ?line eval(specification({external,Fun2x}, S2), from_term([[1],[3]])), + + Fun3 = fun(_) -> neither_true_or_false end, + ?line {'EXIT', {badarg, _}} = + (catch specification(Fun3, set([a]))), + ?line {'EXIT', {badarg, _}} = + (catch specification({external, Fun3}, set([a]))), + ?line {'EXIT', {badarg, _}} = + (catch specification(Fun3, from_term([[a]]))), + ?line {'EXIT', {function_clause, _}} = + (catch specification(Fun, a)), + ok. + +union_1(suite) -> []; +union_1(doc) -> [""]; +union_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([], 2), + ?line {'EXIT', {badarg, _}} = (catch union(ER)), + ?line {'EXIT', {type_mismatch, _}} = + (catch union(relation([{a,b}]), relation([{a,b,c}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch union(from_term([{a,b}]), from_term([{c,[x]}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch union(from_term([{a,b}]), from_term([{c,d}], [{d,r}]))), + ?line {'EXIT', {badarg, _}} = (catch union(set([a,b,c]))), + ?line eval(union(E), E), + ?line eval(union(from_term([[]],[[atom]])), set([])), + ?line eval(union(from_term([[{a,b},{b,c}],[{b,c}]])), + relation([{a,b},{b,c}])), + ?line eval(union(from_term([[1,2,3],[2,3,4],[3,4,5]])), + set([1,2,3,4,5])), + + ?line eval(union(from_term([{[a],[],c}]), from_term([{[],[],q}])), + from_term([{[a],[],c},{[],[],q}])), + + ?line eval(union(E, E), E), + ?line eval(union(set([a,b]), E), set([a,b])), + ?line eval(union(E, set([a,b])), set([a,b])), + + ?line eval(union(from_term([[a,b]])), from_term([a,b])), + ok. + +intersection_1(suite) -> []; +intersection_1(doc) -> [""]; +intersection_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line {'EXIT', {badarg, _}} = (catch intersection(from_term([a,b]))), + ?line {'EXIT', {badarg, _}} = (catch intersection(E)), + ?line {'EXIT', {type_mismatch, _}} = + (catch intersection(relation([{a,b}]), relation([{a,b,c}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch intersection(relation([{a,b}]), from_term([{a,b}],[{d,r}]))), + + ?line eval(intersection(from_term([[a,b,c],[d,e,f],[g,h,i]])), set([])), + + ?line eval(intersection(E, E), E), + ?line eval(intersection(set([a,b,c]),set([0,b,q])), + set([b])), + ?line eval(intersection(set([0,b,q]),set([a,b,c])), + set([b])), + ?line eval(intersection(set([a,b,c]),set([a,b,c])), + set([a,b,c])), + ?line eval(intersection(set([a,b,d]),set([c,d])), + set([d])), + ok. + +difference(suite) -> []; +difference(doc) -> [""]; +difference(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line {'EXIT', {type_mismatch, _}} = + (catch difference(relation([{a,b}]), relation([{a,b,c}]))), + ?line eval(difference(E, E), E), + ?line {'EXIT', {type_mismatch, _}} = + (catch difference(relation([{a,b}]), from_term([{a,c}],[{d,r}]))), + ?line eval(difference(set([a,b,c,d,f]), set([a,d,e,g])), + set([b,c,f])), + ?line eval(difference(set([a,b,c]), set([d,e,f])), + set([a,b,c])), + ?line eval(difference(set([a,b,c]), set([a,b,c,d,e,f])), + set([])), + ?line eval(difference(set([e,f,g]), set([a,b,c,e])), + set([f,g])), + ?line eval(difference(set([a,b,d,e,f]), set([c])), + set([a,b,d,e,f])), + ok. + +symdiff(suite) -> []; +symdiff(doc) -> [""]; +symdiff(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line {'EXIT', {type_mismatch, _}} = + (catch symdiff(relation([{a,b}]), relation([{a,b,c}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch symdiff(relation([{a,b}]), from_term([{a,b}], [{d,r}]))), + ?line eval(symdiff(E, E), E), + ?line eval(symdiff(set([a,b,c,d,e,f]), set([0,1,a,c])), + union(set([b,d,e,f]), set([0,1]))), + ?line eval(symdiff(set([a,b,c]), set([q,v,w,x,y])), + union(set([a,b,c]), set([q,v,w,x,y]))), + ?line eval(symdiff(set([a,b,c,d,e,f]), set([a,b,c])), + set([d,e,f])), + ?line eval(symdiff(set([c,e,g,h,i]), set([b,d,f])), + union(set([c,e,g,h,i]), set([b,d,f]))), + ?line eval(symdiff(set([c,d,g,h,k,l]), + set([a,b,e,f,i,j,m,n])), + union(set([c,d,g,h,k,l]), set([a,b,e,f,i,j,m,n]))), + ?line eval(symdiff(set([c,d,g,h,k,l]), + set([d,e,h,i,l,m,n,o,p])), + union(set([c,g,k]), set([e,i,m,n,o,p]))), + ok. + +symmetric_partition(suite) -> []; +symmetric_partition(doc) -> [""]; +symmetric_partition(Conf) when list(Conf) -> + ?line E = set([]), + ?line S1 = set([1,2,3,4]), + ?line S2 = set([3,4,5,6]), + ?line S3 = set([3,4]), + ?line S4 = set([1,2,3,4,5,6]), + ?line T1 = set([1,2]), + ?line T2 = set([3,4]), + ?line T3 = set([5,6]), + ?line T4 = set([1,2,5,6]), + ?line {'EXIT', {type_mismatch, _}} = + (catch symmetric_partition(relation([{a,b}]), relation([{a,b,c}]))), + ?line {E, E, E} = symmetric_partition(E, E), + ?line {'EXIT', {type_mismatch, _}} = + (catch symmetric_partition(relation([{a,b}]), + from_term([{a,c}],[{d,r}]))), + ?line {E, E, S1} = symmetric_partition(E, S1), + ?line {S1, E, E} = symmetric_partition(S1, E), + ?line {T1, T2, T3} = symmetric_partition(S1, S2), + ?line {T3, T2, T1} = symmetric_partition(S2, S1), + ?line {E, T2, T4} = symmetric_partition(S3, S4), + ?line {T4, T2, E} = symmetric_partition(S4, S3), + + ?line S5 = set([1,3,5]), + ?line S6 = set([2,4,6,7,8]), + ?line {S5, E, S6} = symmetric_partition(S5, S6), + ?line {S6, E, S5} = symmetric_partition(S6, S5), + ?line EE = empty_set(), + ?line {EE, EE, EE} = symmetric_partition(EE, EE), + + ok. + +is_sofs_set_1(suite) -> []; +is_sofs_set_1(doc) -> [""]; +is_sofs_set_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line true = is_sofs_set(E), + ?line true = is_sofs_set(from_term([a])), + ?line true = is_sofs_set(from_term({a})), + ?line true = is_sofs_set(from_term(a)), + ?line false = is_sofs_set(a), + ok. + +is_set_1(suite) -> []; +is_set_1(doc) -> [""]; +is_set_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line true = is_set(E), + ?line true = is_set(from_term([a])), + ?line false = is_set(from_term({a})), + ?line false = is_set(from_term(a)), + ?line {'EXIT', _} = (catch is_set(a)), + + ?line true = is_empty_set(E), + ?line false = is_empty_set(from_term([a])), + ?line false = is_empty_set(from_term({a})), + ?line false = is_empty_set(from_term(a)), + ?line {'EXIT', _} = (catch is_empty_set(a)), + + ok. + +is_equal(suite) -> []; +is_equal(doc) -> [""]; +is_equal(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line true = is_equal(E, E), + ?line false = is_equal(from_term([a]), E), + ?line {'EXIT', {type_mismatch, _}} = + (catch is_equal(intersection(set([a]), set([b])), + intersection(from_term([{a}]), from_term([{b}])))), + ?line {'EXIT', {type_mismatch, _}} = + (catch is_equal(from_term([],[{[atom],atom,[atom]}]), + from_term([],[{[atom],{atom},[atom]}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch is_equal(set([a]), from_term([a],[type]))), + + ?line E2 = from_sets({from_term(a,atom)}), + ?line true = is_equal(E2, E2), + ?line true = is_equal(from_term({a}, {atom}), E2), + ?line false = is_equal(from_term([{[a],[],c}]), + from_term([{[],[],q}])), + + ?line {'EXIT', {type_mismatch, _}} = + (catch is_equal(E, E2)), + ?line {'EXIT', {type_mismatch, _}} = + (catch is_equal(E2, E)), + ?line true = is_equal(from_term({[],a,[]},{[atom],atom,[atom]}), + from_term({[],a,[]},{[atom],atom,[atom]})), + ?line {'EXIT', {type_mismatch, _}} = + (catch is_equal(from_term({[],a,[]},{[atom],atom,[atom]}), + from_term({[],{a},[]},{[atom],{atom},[atom]}))), + ?line {'EXIT', {type_mismatch, _}} = + (catch is_equal(from_term({a}), from_term({a},{type}))), + + ok. + +is_subset(suite) -> []; +is_subset(doc) -> [""]; +is_subset(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line true = is_subset(E, E), + ?line true = is_subset(set([a,c,e]), set([a,b,c,d,e])), + ?line false = is_subset(set([a,b]), E), + ?line false = is_subset(set([d,e,f]), set([b,c,d,e])), + ?line false = is_subset(set([a,b,c]), set([b,c])), + ?line false = is_subset(set([b,c]), set([a,c])), + ?line false = is_subset(set([d,e]), set([a,b])), + ?line {'EXIT', {type_mismatch, _}} = + (catch is_subset(intersection(set([a]), set([b])), + intersection(from_term([{a}]), from_term([{b}])))), + ?line {'EXIT', {type_mismatch, _}} = + (catch is_subset(set([a]), from_term([a,b], [at]))), + ok. + +is_a_function_1(suite) -> []; +is_a_function_1(doc) -> [""]; +is_a_function_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([], 2), + ?line {'EXIT', {badarg, _}} = (catch is_a_function(set([a,b]))), + ?line true = is_a_function(E), + ?line true = is_a_function(ER), + ?line true = is_a_function(relation([])), + ?line true = is_a_function(relation([],2)), + ?line true = is_a_function(relation([{a,b},{b,c}])), + ?line false = is_a_function(relation([{a,b},{b,c},{b,d},{e,f}])), + ?line IS = relation([{{a,b},c},{{a,b},d}]), + ?line false = is_a_function(IS), + F = 0.0, I = round(F), + ?line FR = relation([{I,F},{F,1}]), + if + F == I -> % term ordering + false = is_a_function(FR); + true -> + true = is_a_function(FR) + end, + ok. + +is_disjoint(suite) -> []; +is_disjoint(doc) -> [""]; +is_disjoint(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line {'EXIT', {type_mismatch, _}} = + (catch is_disjoint(relation([{a,1}]), set([a,b]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch is_disjoint(set([a]), from_term([a],[mota]))), + ?line true = is_disjoint(E, E), + ?line false = is_disjoint(set([a,b,c]),set([b,c,d])), + ?line false = is_disjoint(set([b,c,d]),set([a,b,c])), + ?line true = is_disjoint(set([a,c,e]),set([b,d,f])), + ok. + +join(suite) -> []; +join(doc) -> [""]; +join(Conf) when list(Conf) -> + ?line E = empty_set(), + + ?line {'EXIT', {badarg, _}} = (catch join(relation([{a,1}]), 3, E, 5)), + ?line {'EXIT', {badarg, _}} = (catch join(E, 1, relation([{a,1}]), 3)), + ?line {'EXIT', {badarg, _}} = (catch join(E, 1, from_term([a]), 1)), + + ?line eval(join(E, 1, E, 2), E), + ?line eval(join(E, 1, from_term([{{a},b}]), 2), E), + ?line eval(join(from_term([{{a},b}]), 2, E, 1), E), + ?line eval(join(from_term([{{a},b,e}]), 2, from_term([{c,{d}}]), 1), + from_term([], [{{atom},atom,atom,{atom}}])), + ?line eval(join(relation([{a}]), 1, relation([{1,a},{2,a}]), 2), + relation([{a,1},{a,2}])), + ?line eval(join(relation([{a,b,c},{b,c,d}]), 2, + relation([{1,b},{2,a},{3,c}]), 2), + relation([{a,b,c,1},{b,c,d,3}])), + ?line eval(join(relation([{1,a,aa},{1,b,bb},{1,c,cc},{2,a,aa},{2,b,bb}]), + 1, + relation([{1,c,cc},{1,d,dd},{1,e,ee},{2,c,cc},{2,d,dd}]), + 1), + relation([{1,a,aa,c,cc},{1,a,aa,d,dd},{1,a,aa,e,ee},{1,b,bb,c,cc}, + {1,b,bb,d,dd},{1,b,bb,e,ee},{1,c,cc,c,cc},{1,c,cc,d,dd}, + {1,c,cc,e,ee},{2,a,aa,c,cc},{2,a,aa,d,dd},{2,b,bb,c,cc}, + {2,b,bb,d,dd}])), + + R1 = relation([{a,b},{b,c}]), + R2 = relation([{b,1},{a,2},{c,3},{c,4}]), + ?line eval(join(R1, 1, R2, 1), from_term([{a,b,2},{b,c,1}])), + ?line eval(join(R1, 2, R2, 1), from_term([{a,b,1},{b,c,3},{b,c,4}])), + ?line eval(join(R1, 1, converse(R2), 2), + from_term([{a,b,2},{b,c,1}])), + ?line eval(join(R1, 2, converse(R2), 2), + from_term([{a,b,1},{b,c,3},{b,c,4}])), + ok. + +canonical(suite) -> []; +canonical(doc) -> [""]; +canonical(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line {'EXIT', {badarg, _}} = + (catch canonical_relation(set([a,b]))), + ?line eval(canonical_relation(E), E), + ?line eval(canonical_relation(from_term([[]])), E), + ?line eval(canonical_relation(from_term([[a,b,c]])), + from_term([{a,[a,b,c]},{b,[a,b,c]},{c,[a,b,c]}])), + ok. + +relation_to_family_1(suite) -> []; +relation_to_family_1(doc) -> [""]; +relation_to_family_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line EF = family([]), + ?line eval(relation_to_family(E), E), + ?line eval(relation_to_family(relation([])), EF), + ?line eval(relation_to_family(relation([], 2)), EF), + ?line R = relation([{b,1},{c,7},{c,9},{c,11}]), + ?line F = family([{b,[1]},{c,[7,9,11]}]), + ?line eval(relation_to_family(R), F), + ?line eval(sofs:rel2fam(R), F), + ?line {'EXIT', {badarg, _}} = (catch relation_to_family(set([a]))), + ok. + +domain_1(suite) -> []; +domain_1(doc) -> [""]; +domain_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + ?line {'EXIT', {badarg, _}} = (catch domain(relation([],3))), + ?line eval(domain(E), E), + ?line eval(domain(ER), set([])), + ?line eval(domain(relation([{1,a},{1,b},{2,a},{2,b}])), set([1,2])), + ?line eval(domain(relation([{a,1},{b,2},{c,3}])), set([a,b,c])), + ?line eval(field(relation([{a,1},{b,2},{c,3}])), + set([a,b,c,1,2,3])), + F = 0.0, I = round(F), + ?line FR = relation([{I,a},{F,b}]), + if + F == I -> % term ordering + ?line true = (1 =:= no_elements(domain(FR))); + true -> + ?line true = (2 =:= no_elements(domain(FR))) + end, + ok. + +range_1(suite) -> []; +range_1(doc) -> [""]; +range_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + ?line {'EXIT', {badarg, _}} = (catch range(relation([],3))), + ?line eval(range(E), E), + ?line eval(range(ER), set([])), + ?line eval(range(relation([{1,a},{1,b},{2,a},{2,b}])), set([a,b])), + ?line eval(range(relation([{a,1},{b,2},{c,3}])), set([1,2,3])), + ok. + +inverse_1(suite) -> []; +inverse_1(doc) -> [""]; +inverse_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + ?line {'EXIT', {badarg, _}} = (catch inverse(relation([],3))), + ?line {'EXIT', {bad_function, _}} = + (catch inverse(relation([{1,a},{1,b}]))), + ?line {'EXIT', {bad_function, _}} = + (catch inverse(relation([{1,a},{2,a}]))), + ?line eval(inverse(E), E), + ?line eval(inverse(ER), ER), + ?line eval(inverse(relation([{a,1},{b,2},{c,3}])), + relation([{1,a},{2,b},{3,c}])), + F = 0.0, I = round(F), + ?line FR = relation([{I,a},{F,b}]), + if + F == I -> % term ordering + ?line {'EXIT', {bad_function, _}} = (catch inverse(FR)); + true -> + ?line eval(inverse(FR), relation([{a,I},{b,F}])) + end, + ok. + +converse_1(suite) -> []; +converse_1(doc) -> [""]; +converse_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + ?line {'EXIT', {badarg, _}} = (catch converse(relation([],3))), + ?line eval(converse(ER), ER), + ?line eval(converse(E), E), + ?line eval(converse(relation([{a,1},{b,2},{c,3}])), + relation([{1,a},{2,b},{3,c}])), + ?line eval(converse(relation([{1,a},{1,b}])), + relation([{a,1},{b,1}])), + ?line eval(converse(relation([{1,a},{2,a}])), + relation([{a,1},{a,2}])), + ok. + +no_elements_1(suite) -> []; +no_elements_1(doc) -> [""]; +no_elements_1(Conf) when list(Conf) -> + ?line 0 = no_elements(empty_set()), + ?line 0 = no_elements(set([])), + ?line 1 = no_elements(from_term([a])), + ?line 10 = no_elements(from_term(lists:seq(1,10))), + ?line 3 = no_elements(from_term({a,b,c},{atom,atom,atom})), + ?line {'EXIT', {badarg, _}} = (catch no_elements(from_term(a))), + ?line {'EXIT', {function_clause, _}} = (catch no_elements(a)), + ok. + +image(suite) -> []; +image(doc) -> [""]; +image(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + ?line eval(image(E, E), E), + ?line eval(image(ER, E), set([])), + ?line eval(image(relation([{a,1},{b,2},{c,3},{f,6}]), set([a,b,c,d,f])), + set([1,2,3,6])), + ?line eval(image(relation([{a,1},{b,2},{c,3},{d,4},{r,17}]), + set([b,c,q,r])), + set([2,3,17])), + ?line eval(image(from_term([{[a],{1}},{[b],{2}}]), from_term([[a]])), + from_term([{1}])), + ?line eval(image(relation([{1,a},{2,a},{3,a},{4,b},{2,b}]), set([1,2,4])), + set([a,b])), + ?line {'EXIT', {badarg, _}} = + (catch image(from_term([a,b]), E)), + ?line {'EXIT', {type_mismatch, _}} = + (catch image(from_term([{[a],1}]), set([[a]]))), + ok. + +inverse_image(suite) -> []; +inverse_image(doc) -> [""]; +inverse_image(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + ?line eval(inverse_image(E, E), E), + ?line eval(inverse_image(ER, E), set([])), + ?line eval(inverse_image(converse(relation([{a,1},{b,2},{c,3},{f,6}])), + set([a,b,c,d,f])), + set([1,2,3,6])), + ?line eval(inverse_image(converse(relation([{a,1},{b,2},{c,3}, + {d,4},{r,17}])), + set([b,c,q,r])), + set([2,3,17])), + ?line eval(inverse_image(converse(from_term([{[a],{1}},{[b],{2}}])), + from_term([[a]])), + from_term([{1}])), + ?line eval(inverse_image(converse(relation([{1,a},{2,a}, + {3,a},{4,b},{2,b}])), + set([1,2,4])), + set([a,b])), + ?line {'EXIT', {badarg, _}} = + (catch inverse_image(from_term([a,b]), E)), + ?line {'EXIT', {type_mismatch, _}} = + (catch inverse_image(converse(from_term([{[a],1}])), set([[a]]))), + ok. + +composite_1(suite) -> []; +composite_1(doc) -> [""]; +composite_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line EF = a_function([]), + ?line eval(composite(E, E), E), + ?line eval(composite(E, a_function([{a,b}])), E), + ?line eval(composite(relation([{a,b}]), E), E), + ?line {'EXIT', {bad_function, _}} = + (catch composite(EF, relation([{a,b},{a,c}]))), + ?line {'EXIT', {bad_function, _}} = + (catch composite(a_function([{b,a}]), EF)), + ?line {'EXIT', {bad_function, _}} = + (catch composite(relation([{1,a},{2,b},{2,a}]), + a_function([{a,1},{b,3}]))), + ?line {'EXIT', {bad_function, _}} = + (catch composite(a_function([{1,a},{2,b}]), a_function([{b,3}]))), + ?line eval(composite(EF, EF), EF), + ?line eval(composite(a_function([{b,a}]), from_term([{a,{b,c}}])), + from_term([{b,{b,c}}])), + ?line eval(composite(a_function([{q,1},{z,2}]), + a_function([{1,a},{2,a}])), + a_function([{q,a},{z,a}])), + ?line eval(composite(a_function([{a,0},{b,0},{c,1},{d,1},{e,2},{f,3}]), + a_function([{0,p},{1,q},{2,r},{3,w},{4,aa}])), + a_function([{c,q},{d,q},{f,w},{e,r},{a,p},{b,p}])), + ?line eval(composite(a_function([{1,c}]), + a_function([{a,1},{b,3},{c,4}])), + a_function([{1,4}])), + ?line {'EXIT', {bad_function, _}} = + (catch composite(a_function([{1,a},{2,b}]), + a_function([{a,1},{c,3}]))), + ?line {'EXIT', {badarg, _}} = + (catch composite(from_term([a,b]), E)), + ?line {'EXIT', {badarg, _}} = + (catch composite(E, from_term([a,b]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch composite(from_term([{a,b}]), from_term([{{a},b}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch composite(from_term([{a,b}]), + from_term([{b,c}], [{d,r}]))), + F = 0.0, I = round(F), + ?line FR1 = relation([{1,c}]), + ?line FR2 = relation([{I,1},{F,3},{c,4}]), + if + F == I -> % term ordering + ?line {'EXIT', {bad_function, _}} = (catch composite(FR1, FR2)); + true -> + ?line eval(composite(FR1, FR2), a_function([{1,4}])) + end, + ok. + +relative_product_1(suite) -> []; +relative_product_1(doc) -> [""]; +relative_product_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + ?line eval(relative_product1(E, E), E), + ?line eval(relative_product1(E, relation([{a,b}])), E), + ?line eval(relative_product1(relation([{a,b}]), E), E), + ?line eval(relative_product1(relation([{a,b}]), from_term([{a,{b,c}}])), + from_term([{b,{b,c}}])), + ?line eval(relative_product1(relation([{1,z},{1,q},{2,z}]), + relation([{1,a},{1,b},{2,a}])), + relation([{q,a},{q,b},{z,a},{z,b}])), + ?line eval(relative_product1(relation([{0,a},{0,b},{1,c}, + {1,d},{2,e},{3,f}]), + relation([{1,q},{3,w}])), + relation([{c,q},{d,q},{f,w}])), + ?line {'EXIT', {badarg, _}} = + (catch relative_product1(from_term([a,b]), ER)), + ?line {'EXIT', {badarg, _}} = + (catch relative_product1(ER, from_term([a,b]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch relative_product1(from_term([{a,b}]), from_term([{{a},b}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch relative_product1(from_term([{a,b}]), + from_term([{b,c}], [{d,r}]))), + ok. + +relative_product_2(suite) -> []; +relative_product_2(doc) -> [""]; +relative_product_2(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + + ?line {'EXIT', {badarg, _}} = (catch relative_product({from_term([a,b])})), + ?line {'EXIT', {type_mismatch, _}} = + (catch relative_product({from_term([{a,b}]), from_term([{{a},b}])})), + ?line {'EXIT', {badarg, _}} = (catch relative_product({})), + ?line true = is_equal(relative_product({ER}), + from_term([], [{atom,{atom}}])), + ?line eval(relative_product({relation([{a,b},{c,a}]), + relation([{a,1},{a,2}]), + relation([{a,aa},{c,1}])}), + from_term([{a,{b,1,aa}},{a,{b,2,aa}}])), + ?line eval(relative_product({relation([{a,b}])}, E), E), + ?line eval(relative_product({E}, relation([{a,b}])), E), + ?line eval(relative_product({E,from_term([], [{{atom,atom,atom},atom}])}), + E), + ?line {'EXIT', {badarg, _}} = + (catch relative_product({from_term([a,b])}, E)), + ?line {'EXIT', {badarg, _}} = + (catch relative_product({relation([])}, set([]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch relative_product({from_term([{a,b}]), + from_term([{{a},b}])}, ER)), + + ?line {'EXIT', {badarg, _}} = (catch relative_product({}, ER)), + ?line eval(relative_product({relation([{a,b}])}, + from_term([],[{{atom},atom}])), + ER), + ?line eval(relative_product({relation([{a,b}]),relation([{a,1}])}, + from_term([{{b,1},{tjo,hej,sa}}])), + from_term([{a,{tjo,hej,sa}}])), + ?line eval(relative_product({relation([{a,b}]), ER}, + from_term([{{a,b},b}])), + ER), + ?line eval(relative_product({relation([{a,b},{c,a}]), + relation([{a,1},{a,2}])}, + from_term([{{b,1},b1},{{b,2},b2}])), + relation([{a,b1},{a,b2}])), + ?line eval(relative_product({relation([{a,b}]), ER}), + from_term([],[{atom,{atom,atom}}])), + ?line eval(relative_product({from_term([{{a,[a,b]},[a]}]), + from_term([{{a,[a,b]},[[a,b]]}])}), + from_term([{{a,[a,b]},{[a],[[a,b]]}}])), + ok. + +product_1(suite) -> []; +product_1(doc) -> [""]; +product_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line eval(product(E, E), E), + ?line eval(product(relation([]), E), E), + ?line eval(product(E, relation([])), E), + ?line eval(product(relation([{a,b}]),relation([{c,d}])), + from_term([{{a,b},{c,d}}],[{{atom,atom},{atom,atom}}])), + + ?line eval(product({E, set([a,b,c])}), E), + ?line eval(product({set([a,b,c]), E}), E), + ?line eval(product({set([a,b,c]), E, E}), E), + ?line eval(product({E,E}), E), + ?line eval(product({set([a,b]),set([1,2])}), + relation([{a,1},{a,2},{b,1},{b,2}])), + ?line eval(product({from_term([a,b]), from_term([{a,b},{c,d}]), + from_term([1])}), + from_term([{a,{a,b},1},{a,{c,d},1},{b,{a,b},1},{b,{c,d},1}])), + ?line {'EXIT', {badarg, _}} = (catch product({})), + ?line {'EXIT', {badarg, _}} = (catch product({foo})), + ?line eval(product({E}), E), + ?line eval(product({E, E}), E), + ?line eval(product(set([a,b]), set([1,2])), + relation([{a,1},{a,2},{b,1},{b,2}])), + ?line eval(product({relation([]), E}), E), + ok. + +partition_1(suite) -> []; +partition_1(doc) -> [""]; +partition_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + ?line Id = fun(A) -> A end, + ?line S1 = relation([{a,1},{b,2},{b,22},{c,0}]), + ?line eval(partition(1, E), E), + ?line eval(partition(2, E), E), + ?line eval(partition(1, ER), from_term([], [type(ER)])), + ?line eval(partition(2, ER), from_term([], [type(ER)])), + ?line eval(partition(1, relation([{1,a},{1,b},{2,c},{2,d}])), + from_term([[{1,a},{1,b}],[{2,c},{2,d}]])), + ?line eval(partition(2, relation([{1,a},{1,b},{2,a},{2,b},{3,c}])), + from_term([[{1,a},{2,a}],[{1,b},{2,b}],[{3,c}]])), + ?line eval(partition(2, relation([{1,a}])), from_term([[{1,a}]])), + ?line eval(partition(2, relation([{1,a},{2,b}])), + from_term([[{1,a}],[{2,b}]])), + ?line eval(partition(2, relation([{1,a},{2,a},{3,a}])), + from_term([[{1,a},{2,a},{3,a}]])), + ?line eval(partition(2, relation([{1,b},{2,a}])), % OTP-4516 + from_term([[{1,b}],[{2,a}]])), + ?line eval(union(partition(Id, S1)), S1), + ?line eval(partition({external, fun({A,{B,_}}) -> {A,B} end}, + from_term([{a,{b,c}},{b,{c,d}},{a,{b,f}}])), + from_term([[{a,{b,c}},{a,{b,f}}],[{b,{c,d}}]])), + F = 0.0, I = round(F), + ?line FR = relation([{I,a},{F,b}]), + if + F == I -> % term ordering + ?line eval(partition(1, FR), from_term([[{I,a},{F,b}]])); + true -> + ?line eval(partition(1, FR), from_term([[{I,a}],[{F,b}]])) + end, + ?line {'EXIT', {badarg, _}} = (catch partition(2, set([a]))), + ?line {'EXIT', {badarg, _}} = (catch partition(1, set([a]))), + ?line eval(partition(Id, set([a])), from_term([[a]])), + + ?line eval(partition(E), E), + ?line P1 = from_term([[a,b,c],[d,e,f],[g,h]]), + ?line P2 = from_term([[a,d],[b,c,e,f,q,v]]), + ?line eval(partition(union(P1, P2)), + from_term([[a],[b,c],[d],[e,f],[g,h],[q,v]])), + ?line {'EXIT', {badarg, _}} = (catch partition(from_term([a]))), + ok. + +partition_3(suite) -> []; +partition_3(doc) -> [""]; +partition_3(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + + %% set of ordered sets + ?line S1 = relation([{a,1},{b,2},{b,22},{c,0}]), + ?line eval(partition(1, S1, set([0,1,d,e])), + lpartition(1, S1, set([0,1,d,e]))), + ?line eval(partition(1, S1, E), lpartition(1, S1, E)), + ?line eval(partition(2, ER, set([a,b])), lpartition(2, ER, set([a,b]))), + + XFun1 = {external, fun({_A,B,C}) -> {B,C} end}, + R1a = relation([{a,aa,1},{b,bb,2},{c,cc,3}]), + R1b = relation([{bb,2},{cc,3}]), + ?line eval(partition(XFun1, R1a, R1b), lpartition(XFun1, R1a, R1b)), + + Id = fun(X) -> X end, + XId = {external, Id}, + R2 = relation([{a,b}]), + ?line eval(partition(XId, R2, E), lpartition(XId, R2, E)), + + R3 = relation([{b,d}]), + ?line eval(partition(XId, E, R3), lpartition(XId, E, R3)), + + Fun1 = fun(S) -> {_A,B,C} = to_external(S), from_term({B,C}) end, + R4a = relation([{a,aa,1},{b,bb,2},{c,cc,3}]), + R4b = relation([{bb,2},{cc,3}]), + ?line eval(partition(Fun1,R4a,R4b), lpartition(Fun1,R4a,R4b)), + + XFun2 = {external, fun({_,{A},B}) -> {A,B} end}, + R5a = from_term([{a,{aa},1},{b,{bb},2},{c,{cc},3}]), + R5b = from_term([{bb,2},{cc,3}]), + ?line eval(partition(XFun2,R5a, R5b), lpartition(XFun2,R5a, R5b)), + + R6 = relation([{a,b}]), + ?line eval(partition(2, R6, E), lpartition(2, R6, E)), + + R7 = relation([{b,d}]), + ?line eval(partition(2, E, R7), lpartition(2, E, R7)), + + S2 = set([a]), + ?line eval(partition(XId, E, S2), lpartition(XId, E, S2)), + ?line eval(partition(XId, S1, E), lpartition(XId, S1, E)), + ?line {'EXIT', {badarg, _}} = + (catch partition(3, relation([{a,b}]), E)), + ?line {'EXIT', {badarg, _}} = + (catch partition(3, relation([{a,b}]), relation([{b,d}]))), + ?line {'EXIT', {badarg, _}} = + (catch partition(3, relation([{a,b}]), set([{b,d}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch partition(2, relation([{a,b}]), relation([{b,d}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch partition({external, fun({A,_B}) -> A end}, + relation([{a,b}]), relation([{b,d}]))), + ?line {'EXIT', {badarg, _}} = + (catch partition({external, fun({A,_}) -> {A,0} end}, + from_term([{1,a}]), + from_term([{1,0}]))), + + S18a = relation([{1,e},{2,b},{3,c},{4,b},{5,a},{6,0}]), + S18b = set([b,d,f]), + ?line eval(partition({external,fun({_,X}) -> X end}, S18a, S18b), + lpartition({external,fun({_,X}) -> X end}, S18a, S18b)), + S19a = sofs:relation([{3,a},{8,b}]), + S19b = set([2,6,7]), + ?line eval(partition({external,fun({X,_}) -> X end}, S19a, S19b), + lpartition({external,fun({X,_}) -> X end}, S19a, S19b)), + + R8a = relation([{a,d},{b,e},{c,b},{d,c}]), + S8 = set([b,d]), + ?line eval(partition(2, R8a, S8), lpartition(2, R8a, S8)), + + S16a = relation([{1,e},{2,b},{3,c},{4,b},{5,a},{6,0}]), + S16b = set([b,c,d]), + ?line eval(partition(2, S16a, S16b), lpartition(2, S16a, S16b)), + S17a = relation([{e,1},{b,2},{c,3},{b,4},{a,5},{0,6}]), + S17b = set([b,c,d]), + ?line eval(partition(1, S17a, S17b), lpartition(1, S17a, S17b)), + + ?line {'EXIT', {function_clause, _}} = + (catch partition({external, fun({A,_B}) -> A end}, set([]), E)), + + Fun3 = fun(S) -> from_term({to_external(S),0}, {type(S),atom}) end, + S9a = set([1,2]), + S9b = from_term([{1,0}]), + ?line eval(partition(Fun3, S9a, S9b), lpartition(Fun3, S9a, S9b)), + + S14a = relation([{1,a},{2,b},{3,c},{0,0}]), + S14b = set([b,c]), + ?line eval(partition(2, S14a, S14b), lpartition(2, S14a, S14b)), + S15a = relation([{a,1},{b,2},{c,3},{0,0}]), + S15b = set([b,c]), + ?line eval(partition(1, S15a, S15b), lpartition(1, S15a, S15b)), + + %% set of sets + ?line {'EXIT', {badarg, _}} = + (catch partition({external, fun(X) -> X end}, + from_term([], [[atom]]), set([a]))), + + S10 = from_term([], [[atom]]), + ?line eval(partition(Id, S10, E), lpartition(Id, S10, E)), + + S10e = from_term([[a],[b]], [[atom]]), + ?line eval(partition(Id, S10e, E), lpartition(Id, S10e, E)), + + S11a = from_term([], [[atom]]), + S11b = set([a]), + ?line eval(partition(Id, S11a, S11b), lpartition(Id, S11a, S11b)), + + S12a = from_term([[[a],[b]], [[b],[c]], [[], [a,b]], [[1],[2]]]), + S12b = from_term([[a,b],[1,2,3],[b,c]]), + ?line eval(partition({sofs,union}, S12a, S12b), + lpartition({sofs,union}, S12a, S12b)), + + Fun13 = fun(_) -> from_term([a]) end, + S13a = from_term([], [[atom]]), + S13b = from_term([], [[a]]), + ?line eval(partition(Fun13, S13a, S13b), lpartition(Fun13, S13a, S13b)), + + ?line {'EXIT', {type_mismatch, _}} = + (catch partition(fun(_) -> from_term([a]) end, + from_term([[1,2],[3,4]]), + from_term([], [atom]))), + Fun10 = fun(S) -> + %% Cheating a lot... + case to_external(S) of + [1] -> from_term({1,1}); + _ -> S + end + end, + ?line {'EXIT', {type_mismatch, _}} = + (catch partition(Fun10, from_term([[1]]), from_term([], [[atom]]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch partition(fun(_) -> from_term({a}) end, + from_term([[a]]), + from_term([], [atom]))), + ?line {'EXIT', {badarg, _}} = + (catch partition(fun(_) -> {a} end, + from_term([[a]]), + from_term([], [atom]))), + ok. + +lpartition(F, S1, S2) -> + {restriction(F, S1, S2), drestriction(F, S1, S2)}. + +multiple_relative_product(suite) -> []; +multiple_relative_product(doc) -> [""]; +multiple_relative_product(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + ?line T = relation([{a,1},{a,11},{b,2},{c,3},{c,33},{d,4}]), + ?line {'EXIT', {badarg, _}} = + (catch multiple_relative_product({}, ER)), + ?line {'EXIT', {badarg, _}} = + (catch multiple_relative_product({}, relation([{a,b}]))), + ?line eval(multiple_relative_product({E,T,T}, relation([], 3)), E), + ?line eval(multiple_relative_product({T,T,T}, E), E), + ?line eval(multiple_relative_product({T,T,T}, relation([],3)), + from_term([],[{{atom,atom,atom},{atom,atom,atom}}])), + ?line eval(multiple_relative_product({T,T,T}, + relation([{a,b,c},{c,d,a}])), + from_term([{{a,b,c},{1,2,3}}, {{a,b,c},{1,2,33}}, + {{a,b,c},{11,2,3}}, {{a,b,c},{11,2,33}}, + {{c,d,a},{3,4,1}}, {{c,d,a},{3,4,11}}, + {{c,d,a},{33,4,1}}, {{c,d,a},{33,4,11}}])), + ?line {'EXIT', {type_mismatch, _}} = + (catch multiple_relative_product({T}, from_term([{{a}}]))), + ok. + +digraph(suite) -> []; +digraph(doc) -> [""]; +digraph(Conf) when list(Conf) -> + ?line T0 = ets:all(), + ?line E = empty_set(), + ?line R = relation([{a,b},{b,c},{c,d},{d,a}]), + ?line F = relation_to_family(R), + Type = type(F), + + ?line {'EXIT', {badarg, _}} = + (catch family_to_digraph(set([a]))), + ?line {'EXIT', {badarg, [{sofs,family_to_digraph,[_,_]}|_]}} = + (catch family_to_digraph(set([a]), [foo])), + ?line {'EXIT', {badarg, [{sofs,family_to_digraph,[_,_]}|_]}} = + (catch family_to_digraph(F, [foo])), + ?line {'EXIT', {cyclic, [{sofs,family_to_digraph,[_,_]}|_]}} = + (catch family_to_digraph(family([{a,[a]}]),[acyclic])), + + ?line G1 = family_to_digraph(E), + ?line {'EXIT', {badarg, _}} = (catch digraph_to_family(G1, foo)), + ?line {'EXIT', {badarg, _}} = (catch digraph_to_family(G1, atom)), + ?line true = [] == to_external(digraph_to_family(G1)), + ?line true = [] == to_external(digraph_to_family(G1, Type)), + ?line true = digraph:delete(G1), + + ?line G1a = family_to_digraph(E, [protected]), + ?line true = [] == to_external(digraph_to_family(G1a)), + ?line true = [] == to_external(digraph_to_family(G1a, Type)), + ?line true = digraph:delete(G1a), + + ?line G2 = family_to_digraph(F), + ?line true = F == digraph_to_family(G2), + ?line true = F == digraph_to_family(G2, type(F)), + ?line true = digraph:delete(G2), + + ?line R2 = from_term([{{a},b},{{c},d}]), + ?line F2 = relation_to_family(R2), + ?line Type2 = type(F2), + ?line G3 = family_to_digraph(F2, [protected]), + ?line true = is_subset(F2, digraph_to_family(G3, Type2)), + ?line true = digraph:delete(G3), + + Fl = 0.0, I = round(Fl), + if + Fl == I -> % term ordering + ?line G4 = digraph:new(), + digraph:add_vertex(G4, Fl), + digraph:add_vertex(G4, I), + ?line {'EXIT', {badarg, _}} = + (catch digraph_to_family(G4, Type)), + ?line {'EXIT', {badarg, _}} = + (catch digraph_to_family(G4)), + ?line true = digraph:delete(G4); + true -> ok + end, + + ?line true = T0 == ets:all(), + ok. + +constant_function(suite) -> []; +constant_function(doc) -> [""]; +constant_function(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line C = from_term(3), + ?line eval(constant_function(E, C), E), + ?line eval(constant_function(set([a,b]), E), from_term([{a,[]},{b,[]}])), + ?line eval(constant_function(set([a,b]), C), from_term([{a,3},{b,3}])), + ?line {'EXIT', {badarg, _}} = (catch constant_function(C, C)), + ?line {'EXIT', {badarg, _}} = (catch constant_function(set([]), foo)), + ok. + +misc(suite) -> []; +misc(doc) -> [""]; +misc(Conf) when list(Conf) -> + % find "relational" part of relation: + ?line S = relation([{a,b},{b,c},{b,d},{c,d}]), + Id = fun(A) -> A end, + ?line RR = relational_restriction(S), + ?line eval(union(difference(partition(Id,S), partition(1,S))), RR), + ?line eval(union(difference(partition(1,S), partition(Id,S))), RR), + + % the "functional" part: + ?line eval(union(intersection(partition(1,S), partition(Id,S))), + difference(S, RR)), + + %% The function external:foo/1 is undefined. + ?line {'EXIT', {undef, _}} = + (catch projection({external,foo}, set([a,b,c]))), + ok. + +relational_restriction(R) -> + Fun = fun(S) -> no_elements(S) > 1 end, + family_to_relation(family_specification(Fun, relation_to_family(R))). + +sofs_family(suite) -> + [family_specification, family_domain_1, family_range_1, + family_to_relation_1, union_of_family_1, intersection_of_family_1, + family_projection, family_difference, + family_intersection_1, family_intersection_2, + family_union_1, family_union_2, partition_family]. + +family_specification(suite) -> []; +family_specification(doc) -> [""]; +family_specification(Conf) when list(Conf) -> + E = empty_set(), + %% internal + ?line eval(family_specification({sofs, is_set}, E), E), + ?line {'EXIT', {badarg, _}} = + (catch family_specification({sofs,is_set}, set([]))), + ?line F1 = from_term([{1,[1]}]), + ?line eval(family_specification({sofs,is_set}, F1), F1), + Fun = fun(S) -> is_subset(S, set([0,1,2,3,4])) end, + ?line F2 = family([{a,[1,2]},{b,[3,4,5]}]), + ?line eval(family_specification(Fun, F2), family([{a,[1,2]}])), + ?line F3 = from_term([{a,[]},{b,[]}]), + ?line eval(family_specification({sofs,is_set}, F3), F3), + Fun2 = fun(_) -> throw(fippla) end, + ?line fippla = (catch family_specification(Fun2, family([{a,[1]}]))), + Fun3 = fun(_) -> neither_true_or_false end, + ?line {'EXIT', {badarg, _}} = + (catch family_specification(Fun3, F3)), + + %% external + IsList = {external, fun(L) when list(L) -> true; (_) -> false end}, + ?line eval(family_specification(IsList, E), E), + ?line eval(family_specification(IsList, F1), F1), + MF = {external, fun(L) -> lists:member(3, L) end}, + ?line eval(family_specification(MF, F2), family([{b,[3,4,5]}])), + ?line fippla = (catch family_specification(Fun2, family([{a,[1]}]))), + ?line {'EXIT', {badarg, _}} = + (catch family_specification({external, Fun3}, F3)), + ok. + +family_domain_1(suite) -> []; +family_domain_1(doc) -> [""]; +family_domain_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = from_term([{a,[]},{b,[]}],[{atom,[{atom,atom}]}]), + ?line EF = from_term([{a,[]},{b,[]}],[{atom,[atom]}]), + ?line eval(family_domain(E), E), + ?line eval(family_domain(ER), EF), + ?line FR = from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]), + ?line eval(family_domain(FR), from_term([{a,[1,2,3]},{b,[]},{c,[4,5]}])), + ?line eval(family_field(E), E), + ?line eval(family_field(FR), + from_term([{a,[a,b,c,1,2,3]},{b,[]},{c,[d,e,4,5]}])), + ?line eval(family_domain(from_term([{{a},[{{1,[]},c}]}])), + from_term([{{a},[{1,[]}]}])), + ?line eval(family_domain(from_term([{{a},[{{1,[a]},c}]}])), + from_term([{{a},[{1,[a]}]}])), + ?line eval(family_domain(from_term([{{a},[]}])), + from_term([{{a},[]}])), + ?line eval(family_domain(from_term([], type(FR))), + from_term([], [{atom,[atom]}])), + ?line {'EXIT', {badarg, _}} = (catch family_domain(set([a]))), + ?line {'EXIT', {badarg, _}} = (catch family_field(set([a]))), + ?line {'EXIT', {badarg, _}} = (catch family_domain(set([{a,[b]}]))), + ok. + +family_range_1(suite) -> []; +family_range_1(doc) -> [""]; +family_range_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = from_term([{a,[]},{b,[]}],[{atom,[{atom,atom}]}]), + ?line EF = from_term([{a,[]},{b,[]}],[{atom,[atom]}]), + ?line eval(family_range(E), E), + ?line eval(family_range(ER), EF), + ?line FR = from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]), + ?line eval(family_range(FR), from_term([{a,[a,b,c]},{b,[]},{c,[d,e]}])), + ?line eval(family_range(from_term([{{a},[{c,{1,[a]}}]}])), + from_term([{{a},[{1,[a]}]}])), + ?line eval(family_range(from_term([{{a},[{c,{1,[]}}]}])), + from_term([{{a},[{1,[]}]}])), + ?line eval(family_range(from_term([{{a},[]}])), + from_term([{{a},[]}])), + ?line eval(family_range(from_term([], type(FR))), + from_term([], [{atom,[atom]}])), + ?line {'EXIT', {badarg, _}} = (catch family_range(set([a]))), + ?line {'EXIT', {badarg, _}} = (catch family_range(set([{a,[b]}]))), + ok. + +family_to_relation_1(suite) -> []; +family_to_relation_1(doc) -> [""]; +family_to_relation_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line ER = relation([]), + ?line EF = family([]), + ?line eval(family_to_relation(E), E), + ?line eval(family_to_relation(EF), ER), + ?line eval(sofs:fam2rel(EF), ER), + ?line F = family([{a,[]},{b,[1]},{c,[7,9,11]}]), + ?line eval(family_to_relation(F), relation([{b,1},{c,7},{c,9},{c,11}])), + ?line {'EXIT', {badarg, _}} = (catch family_to_relation(set([a]))), + ok. + +union_of_family_1(suite) -> []; +union_of_family_1(doc) -> [""]; +union_of_family_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line EF = from_term([{a,[]},{b,[]}],[{atom,[atom]}]), + ?line eval(union_of_family(E), E), + ?line eval(union_of_family(EF), set([])), + ?line eval(union_of_family(family([])), set([])), + ?line FR = from_term([{a,[1,2,3]},{b,[]},{c,[4,5]}]), + ?line eval(union_of_family(FR), set([1,2,3,4,5])), + ?line eval(union_of_family(sofs:family([{a,[1,2]},{b,[1,2]}])), + set([1,2])), + ?line {'EXIT', {badarg, _}} = (catch union_of_family(set([a]))), + ok. + +intersection_of_family_1(suite) -> []; +intersection_of_family_1(doc) -> [""]; +intersection_of_family_1(Conf) when list(Conf) -> + ?line EF = from_term([{a,[]},{b,[]}],[{atom,[atom]}]), + ?line eval(intersection_of_family(EF), set([])), + ?line FR = from_term([{a,[1,2,3]},{b,[2,3]},{c,[3,4,5]}]), + ?line eval(intersection_of_family(FR), set([3])), + ?line {'EXIT', {badarg, _}} = + (catch intersection_of_family(family([]))), + ?line EE = from_term([], [[atom]]), + ?line {'EXIT', {badarg, _}} = (catch intersection_of_family(EE)), + ?line {'EXIT', {badarg, _}} = (catch intersection_of_family(set([a]))), + ok. + +family_projection(suite) -> []; +family_projection(doc) -> [""]; +family_projection(Conf) when list(Conf) -> + SSType = [{atom,[[atom]]}], + SRType = [{atom,[{atom,atom}]}], + ?line E = empty_set(), + + ?line eval(family_projection(fun(X) -> X end, family([])), E), + ?line L1 = [{a,[]}], + ?line eval(family_projection({sofs,union}, E), E), + ?line eval(family_projection({sofs,union}, from_term(L1, SSType)), + family(L1)), + ?line {'EXIT', {badarg, _}} = + (catch family_projection({sofs,union}, set([]))), + ?line {'EXIT', {badarg, _}} = + (catch family_projection({sofs,union}, from_term([{1,[1]}]))), + + ?line F2 = from_term([{a,[[1],[2]]},{b,[[3,4],[5]]}], SSType), + ?line eval(family_projection({sofs,union}, F2), + family_union(F2)), + + ?line F3 = from_term([{1,[{a,b},{b,c},{c,d}]},{3,[]},{5,[{3,5}]}], + SRType), + ?line eval(family_projection({sofs,domain}, F3), family_domain(F3)), + ?line eval(family_projection({sofs,range}, F3), family_range(F3)), + + ?line eval(family_projection(fun(_) -> E end, family([{a,[b,c]}])), + from_term([{a,[]}])), + + Fun1 = fun(S) -> + case to_external(S) of + [1] -> from_term({1,1}); + _ -> S + end + end, + ?line eval(family_projection(Fun1, family([{a,[1]}])), + from_term([{a,{1,1}}])), + Fun2 = fun(_) -> throw(fippla) end, + ?line fippla = + (catch family_projection(Fun2, family([{a,[1]}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch family_projection(Fun1, from_term([{1,[1]},{2,[2]}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch family_projection(Fun1, from_term([{1,[1]},{0,[0]}]))), + + ?line eval(family_projection(fun(_) -> E end, from_term([{a,[]}])), + from_term([{a,[]}])), + F4 = from_term([{a,[{1,2,3}]},{b,[{4,5,6}]},{c,[]},{m3,[]}]), + Z = from_term(0), + ?line eval(family_projection(fun(S) -> local_adjoin(S, Z) end, F4), + from_term([{a,[{{1,2,3},0}]},{b,[{{4,5,6},0}]},{c,[]},{m3,[]}])), + ?line {'EXIT', {badarg, _}} = + (catch family_projection({external, fun(X) -> X end}, + from_term([{1,[1]}]))), + + %% ordered set element + ?line eval(family_projection(fun(_) -> from_term(a, atom) end, + from_term([{1,[a]}])), + from_term([{1,a}])), + ok. + +family_difference(suite) -> []; +family_difference(doc) -> [""]; +family_difference(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line EF = family([]), + ?line F9 = from_term([{b,[b,c]}]), + ?line F10 = from_term([{a,[b,c]}]), + ?line eval(family_difference(E, E), E), + ?line eval(family_difference(E, F10), from_term([], type(F10))), + ?line eval(family_difference(F10, E), F10), + ?line eval(family_difference(F9, F10), F9), + ?line eval(family_difference(F10, F10), family([{a,[]}])), + ?line F20 = from_term([{a,[1,2,3]},{b,[1,2,3]},{c,[1,2,3]}]), + ?line F21 = from_term([{b,[1,2,3]},{c,[1,2,3]}]), + ?line eval(family_difference(F20, from_term([{a,[2]}])), + from_term([{a,[1,3]},{b,[1,2,3]},{c,[1,2,3]}])), + ?line eval(family_difference(F20, from_term([{0,[2]},{q,[1,2]}])), F20), + ?line eval(family_difference(F20, F21), + from_term([{a,[1,2,3]},{b,[]},{c,[]}])), + + ?line eval(family_difference(from_term([{e,[f,g]}]), family([])), + from_term([{e,[f,g]}])), + ?line eval(family_difference(from_term([{e,[f,g]}]), EF), + from_term([{e,[f,g]}])), + ?line eval(family_difference(from_term([{a,[a,b,c,d]},{c,[b,c]}]), + from_term([{a,[b,c]},{b,[d]},{d,[e,f]}])), + from_term([{a,[a,d]},{c,[b,c]}])), + ?line {'EXIT', {badarg, _}} = + (catch family_difference(set([]), set([]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch family_difference(from_term([{a,[b,c]}]), + from_term([{e,[{f}]}]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch family_difference(from_term([{a,[b]}]), + from_term([{c,[d]}], [{i,[s]}]))), + ok. + +family_intersection_1(suite) -> []; +family_intersection_1(doc) -> [""]; +family_intersection_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line EF = family([]), + ?line ES = from_term([], [{atom,[[atom]]}]), + ?line eval(family_intersection(E), E), + ?line {'EXIT', {badarg, _}} = (catch family_intersection(EF)), + ?line eval(family_intersection(ES), EF), + ?line {'EXIT', {badarg, _}} = (catch family_intersection(set([]))), + ?line {'EXIT', {badarg, _}} = + (catch family_intersection(from_term([{a,[1,2]}]))), + ?line F1 = from_term([{a,[[1],[2],[2,3]]},{b,[]},{c,[[4]]}]), + ?line {'EXIT', {badarg, _}} = (catch family_intersection(F1)), + ?line F2 = from_term([{b,[[1],[2],[2,3]]},{a,[]},{c,[[4]]}]), + ?line {'EXIT', {badarg, _}} = (catch family_intersection(F2)), + ?line F3 = from_term([{a,[[1,2,3],[2],[2,3]]},{c,[[4,5,6],[5,6,7]]}]), + ?line eval(family_intersection(F3), family([{a,[2]},{c,[5,6]}])), + ok. + +family_intersection_2(suite) -> []; +family_intersection_2(doc) -> [""]; +family_intersection_2(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line EF = family([]), + ?line F1 = from_term([{a,[1,2]},{b,[4,5]},{c,[7,8]},{d,[10,11]}]), + ?line F2 = from_term([{c,[6,7]},{d,[9,10,11]},{q,[1]}]), + ?line F3 = from_term([{a,[1,2]},{b,[4,5]},{c,[6,7,8]},{d,[9,10,11]}, + {q,[1]}]), + + ?line eval(family_intersection(E, E), E), + ?line eval(family_intersection(EF, EF), EF), + ?line eval(family_intersection(F1, F2), + from_term([{c,[7]},{d,[10,11]}])), + ?line eval(family_intersection(F1, F3), F1), + ?line eval(family_intersection(F2, F3), F2), + + ?line eval(family_intersection(EF, from_term([{e,[f,g]}])), EF), + ?line eval(family_intersection(E, from_term([{e,[f,g]}])), EF), + ?line eval(family_intersection(from_term([{e,[f,g]}]), EF), EF), + ?line eval(family_intersection(from_term([{e,[f,g]}]), E), EF), + ?line {'EXIT', {type_mismatch, _}} = + (catch family_intersection(from_term([{a,[b,c]}]), + from_term([{e,[{f}]}]))), + + ?line F11 = family([{a,[1,2,3]},{b,[0,2,4]},{c,[0,3,6,9]}]), + ?line eval(union_of_family(F11), set([0,1,2,3,4,6,9])), + ?line F12 = from_term([{a,[1,2,3,4]},{b,[0,2,4]},{c,[2,3,4,5]}]), + ?line eval(intersection_of_family(F12), set([2,4])), + ok. + +family_union_1(suite) -> []; +family_union_1(doc) -> [""]; +family_union_1(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line EF = family([]), + ?line ES = from_term([], [{atom,[[atom]]}]), + ?line eval(family_union(E), E), + ?line eval(family_union(ES), EF), + ?line {'EXIT', {badarg, _}} = (catch family_union(set([]))), + ?line {'EXIT', {badarg, _}} = + (catch family_union(from_term([{a,[1,2]}]))), + ?line eval(family_union(from_term([{a,[[1],[2],[2,3]]},{b,[]},{c,[[4]]}])), + family([{a,[1,2,3]},{b,[]},{c,[4]}])), + ok. + +family_union_2(suite) -> []; +family_union_2(doc) -> [""]; +family_union_2(Conf) when list(Conf) -> + ?line E = empty_set(), + ?line EF = family([]), + ?line F1 = from_term([{a,[1,2]},{b,[4,5]},{c,[7,8]},{d,[10,11]}]), + ?line F2 = from_term([{c,[6,7]},{d,[9,10,11]},{q,[1]}]), + ?line F3 = from_term([{a,[1,2]},{b,[4,5]},{c,[6,7,8]},{d,[9,10,11]}, + {q,[1]}]), + + ?line eval(family_union(E, E), E), + ?line eval(family_union(F1, E), F1), + ?line eval(family_union(E, F2), F2), + ?line eval(family_union(F1, F2), F3), + ?line eval(family_union(F2, F1), F3), + + ?line eval(family_union(E, from_term([{e,[f,g]}])), + from_term([{e,[f,g]}])), + ?line eval(family_union(EF, from_term([{e,[f,g]}])), + from_term([{e,[f,g]}])), + ?line eval(family_union(from_term([{e,[f,g]}]), E), + from_term([{e,[f,g]}])), + ?line {'EXIT', {badarg, _}} = + (catch family_union(set([]),set([]))), + ?line {'EXIT', {type_mismatch, _}} = + (catch family_union(from_term([{a,[b,c]}]), + from_term([{e,[{f}]}]))), + ok. + +partition_family(suite) -> []; +partition_family(doc) -> [""]; +partition_family(Conf) when list(Conf) -> + ?line E = empty_set(), + + %% set of ordered sets + ?line ER = relation([]), + ?line EF = from_term([], [{atom,[{atom,atom}]}]), + + ?line eval(partition_family(1, E), E), + ?line eval(partition_family(2, E), E), + ?line eval(partition_family({sofs,union}, E), E), + ?line eval(partition_family(1, ER), EF), + ?line eval(partition_family(2, ER), EF), + ?line {'EXIT', {badarg, _}} = (catch partition_family(1, set([]))), + ?line {'EXIT', {badarg, _}} = (catch partition_family(2, set([]))), + ?line {'EXIT', {function_clause, _}} = + (catch partition_family(fun({_A,B}) -> {B} end, from_term([{1}]))), + ?line eval(partition_family(1, relation([{1,a},{1,b},{2,c},{2,d}])), + from_term([{1,[{1,a},{1,b}]},{2,[{2,c},{2,d}]}])), + ?line eval(partition_family(1, relation([{1,a},{2,b}])), + from_term([{1,[{1,a}]},{2,[{2,b}]}])), + ?line eval(partition_family(2, relation([{1,a},{1,b},{2,a},{2,b},{3,c}])), + from_term([{a,[{1,a},{2,a}]},{b,[{1,b},{2,b}]},{c,[{3,c}]}])), + ?line eval(partition_family(2, relation([{1,a}])), + from_term([{a,[{1,a}]}])), + ?line eval(partition_family(2, relation([{1,a},{2,a},{3,a}])), + from_term([{a,[{1,a},{2,a},{3,a}]}])), + ?line eval(partition_family(2, relation([{1,a},{2,b}])), + from_term([{a,[{1,a}]},{b,[{2,b}]}])), + ?line F13 = from_term([{a,b,c},{a,b,d},{b,b,c},{a,c,c},{a,c,d},{b,c,c}]), + ?line eval(partition_family(2, F13), + from_term([{b,[{a,b,c},{a,b,d},{b,b,c}]}, + {c,[{a,c,c},{a,c,d},{b,c,c}]}])), + + Fun1 = {external, fun({A,_B}) -> {A} end}, + ?line eval(partition_family(Fun1, relation([{a,1},{a,2},{b,3}])), + from_term([{{a},[{a,1},{a,2}]},{{b},[{b,3}]}])), + Fun2 = fun(S) -> {A,_B} = to_external(S), from_term({A}) end, + ?line eval(partition_family(Fun2, relation([{a,1},{a,2},{b,3}])), + from_term([{{a},[{a,1},{a,2}]},{{b},[{b,3}]}])), + + ?line {'EXIT', {badarg, _}} = + (catch partition_family({external, fun({A,_}) -> {A,0} end}, + from_term([{1,a}]))), + ?line [{{atom,atom},[{atom,atom,atom,atom}]}] = + type(partition_family({external, fun({A,_B,C,_D}) -> {C,A} end}, + relation([],4))), + + Fun3 = fun(S) -> from_term({to_external(S),0}, {type(S),atom}) end, + ?line eval(partition_family(Fun3, E), E), + ?line eval(partition_family(Fun3, set([a,b])), + from_term([{{a,0},[a]}, {{b,0},[b]}])), + ?line eval(partition_family(Fun3, relation([{a,1},{b,2}])), + from_term([{{{a,1},0},[{a,1}]},{{{b,2},0},[{b,2}]}])), + ?line eval(partition_family(Fun3, from_term([[a],[b]])), + from_term([{{[a],0},[[a]]}, {{[b],0},[[b]]}])), + ?line partition_family({external, fun(X) -> X end}, E), + + F = 0.0, I = round(F), + ?line FR = relation([{I,a},{F,b}]), + if + F == I -> % term ordering + ?line true = (1 =:= no_elements(partition_family(1, FR))); + true -> + ?line eval(partition_family(1, FR), + from_term([{I,[{I,a}]},{F,[{F,b}]}])) + end, + %% set of sets + ?line {'EXIT', {badarg, _}} = + (catch partition_family({external, fun(X) -> X end}, + from_term([], [[atom]]))), + ?line {'EXIT', {badarg, _}} = + (catch partition_family({external, fun(X) -> X end}, + from_term([[a]]))), + ?line eval(partition_family({sofs,union}, + from_term([[[1],[1,2]], [[1,2]]])), + from_term([{[1,2], [[[1],[1,2]],[[1,2]]]}])), + ?line eval(partition_family(fun(X) -> X end, + from_term([[1],[1,2],[1,2,3]])), + from_term([{[1],[[1]]},{[1,2],[[1,2]]},{[1,2,3],[[1,2,3]]}])), + + ?line eval(partition_family(fun(_) -> from_term([a]) end, + from_term([], [[atom]])), + E), + Fun10 = fun(S) -> + %% Cheating a lot... + case to_external(S) of + [1] -> from_term({1,1}); + _ -> S + end + end, + + ?line eval(partition_family(Fun10, from_term([[1]])), + from_term([{{1,1},[[1]]}])), + ?line eval(partition_family(fun(_) -> from_term({a}) end, + from_term([[a]])), + from_term([{{a},[[a]]}])), + ?line {'EXIT', {badarg, _}} = + (catch partition_family(fun(_) -> {a} end, from_term([[a]]))), + ok. + +%% Not meant to be efficient... +local_adjoin(S, C) -> + X = to_external(C), + T = type(C), + F = fun(Y) -> from_term({to_external(Y),X}, {type(Y),T}) end, + projection(F, S). + +eval(R, E) when R == E -> + R; +eval(R, E) -> + io:format("expected ~p~n got ~p~n", [E, R]), + exit({R,E}). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/stdlib.cover erlang-13.b.3-dfsg/lib/stdlib/test/stdlib.cover --- erlang-13.b.1-dfsg/lib/stdlib/test/stdlib.cover 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/stdlib.cover 2007-11-26 18:59:34.000000000 +0000 @@ -0,0 +1,10 @@ +%% -*- erlang -*- +{exclude, + [erl_parse, + ets, + filename, + gen_event, + gen_server, + gen, + lists, + proc_lib]}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/stdlib.spec erlang-13.b.3-dfsg/lib/stdlib/test/stdlib.spec --- erlang-13.b.1-dfsg/lib/stdlib/test/stdlib.spec 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/stdlib.spec 2001-10-08 09:39:58.000000000 +0100 @@ -0,0 +1,4 @@ +{topcase, {dir, "../stdlib_test"}}. +%{skip,{dets_SUITE,open_file_1,"Crashes Windows tests"}}. +%{skip,{dets_SUITE,fold,"Crashes Windows tests"}}. +%{skip,{dets_SUITE,match,"Crashes Windows tests"}}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/stdlib.spec.vxworks erlang-13.b.3-dfsg/lib/stdlib/test/stdlib.spec.vxworks --- erlang-13.b.1-dfsg/lib/stdlib/test/stdlib.spec.vxworks 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/stdlib.spec.vxworks 2003-07-07 13:11:52.000000000 +0100 @@ -0,0 +1,8 @@ +{topcase, {dir, "../stdlib_test"}}. +{skip,{dets_SUITE,"Not runnable VxWorks/NFS"}}. +{skip,{slave_SUITE,"VxWorks: slave nodes are not supported"}}. +{skip,{tar_SUITE,errors,"VxWorks filesystem too primitive"}}. +{skip,{tar_SUITE,create_long_names,"VxWorks names too short"}}. +{skip,{epp_SUITE,"Test not adopted to VxWorks"}}. +{skip,{select_SUITE,"Test too memory consuming for VxWorks"}}. +{skip,{beam_lib_SUITE,error,"All sections not present in stripped beam files"}}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/stdlib_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/stdlib_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/stdlib_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/stdlib_SUITE.erl 2009-11-20 13:30:28.000000000 +0000 @@ -0,0 +1,64 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%%---------------------------------------------------------------- +%%% Purpose:Stdlib application test suite. +%%%----------------------------------------------------------------- +-module(stdlib_SUITE). +-include("test_server.hrl"). + + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). +-define(application, stdlib). + +% Test server specific exports +-export([all/1]). +-export([init_per_testcase/2, fin_per_testcase/2]). + +% Test cases must be exported. +-export([app_test/1]). +-define(cases, [app_test]). + +%% +%% all/1 +%% +all(doc) -> + []; +all(suite) -> + [?cases]. + +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +% +% Test cases starts here. +% +app_test(suite) -> + []; +app_test(doc) -> + ["Application consistency test."]; +app_test(Config) when list(Config) -> + ?t:app_test(stdlib), + ok. + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/string_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/string_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/string_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/string_SUITE.erl 2009-11-20 13:32:00.000000000 +0000 @@ -0,0 +1,511 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%%---------------------------------------------------------------- +%%% Purpose: string test suite. +%%%----------------------------------------------------------------- +-module(string_SUITE). +-include("test_server.hrl"). + + +% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +% Test server specific exports +-export([all/1]). +-export([init_per_testcase/2, fin_per_testcase/2]). + +% Test cases must be exported. +-export([len/1,equal/1,concat/1,chr_rchr/1,str_rstr/1]). +-export([span_cspan/1,substr/1,tokens/1,chars/1]). +-export([copies/1,words/1,strip/1,sub_word/1,left_right/1]). +-export([sub_string/1,centre/1, join/1]). +-export([to_integer/1,to_float/1]). +-export([to_upper_to_lower/1]). +%% +%% all/1 +%% +all(doc) -> + []; +all(suite) -> + [len,equal,concat,chr_rchr,str_rstr, + span_cspan,substr,tokens,chars, + copies,words,strip,sub_word,left_right, + sub_string,centre, join, + to_integer,to_float,to_upper_to_lower]. + +init_per_testcase(_Case, Config) -> + ?line Dog=test_server:timetrap(?default_timeout), + [{watchdog, Dog}|Config]. +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +% +% Test cases starts here. +% + +len(suite) -> + []; +len(doc) -> + []; +len(Config) when is_list(Config) -> + ?line 0 = string:len(""), + ?line L = tuple_size(list_to_tuple(atom_to_list(?MODULE))), + ?line L = string:len(atom_to_list(?MODULE)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:len({})), + ok. + +equal(suite) -> + []; +equal(doc) -> + []; +equal(Config) when is_list(Config) -> + ?line true = string:equal("", ""), + ?line false = string:equal("", " "), + ?line true = string:equal("laban", "laban"), + ?line false = string:equal("skvimp", "skvump"), + %% invalid arg type + ?line true = string:equal(2, 2), % not good, should crash + ok. + +concat(suite) -> + []; +concat(doc) -> + []; +concat(Config) when is_list(Config) -> + ?line "erlang rules" = string:concat("erlang ", "rules"), + ?line "" = string:concat("", ""), + ?line "x" = string:concat("x", ""), + ?line "y" = string:concat("", "y"), + %% invalid arg type + ?line {'EXIT',_} = (catch string:concat(hello, please)), + ok. + +chr_rchr(suite) -> + []; +chr_rchr(doc) -> + []; +chr_rchr(Config) when is_list(Config) -> + ?line {_,_,X} = now(), + ?line 0 = string:chr("", (X rem (255-32)) + 32), + ?line 0 = string:rchr("", (X rem (255-32)) + 32), + ?line 1 = string:chr("x", $x), + ?line 1 = string:rchr("x", $x), + ?line 1 = string:chr("xx", $x), + ?line 2 = string:rchr("xx", $x), + ?line 3 = string:chr("xyzyx", $z), + ?line 3 = string:rchr("xyzyx", $z), + %% invalid arg type + ?line {'EXIT',_} = (catch string:chr(hello, $h)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:chr("hello", h)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:rchr(hello, $h)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:rchr("hello", h)), + ok. + +str_rstr(suite) -> + []; +str_rstr(doc) -> + []; +str_rstr(Config) when is_list(Config) -> + ?line {_,_,X} = now(), + ?line 0 = string:str("", [(X rem (255-32)) + 32]), + ?line 0 = string:rstr("", [(X rem (255-32)) + 32]), + ?line 1 = string:str("x", "x"), + ?line 1 = string:rstr("x", "x"), + ?line 0 = string:str("hello", ""), + ?line 0 = string:rstr("hello", ""), + ?line 1 = string:str("xxxx", "xx"), + ?line 3 = string:rstr("xxxx", "xx"), + ?line 3 = string:str("xy z yx", " z"), + ?line 3 = string:rstr("xy z yx", " z"), + %% invalid arg type + ?line {'EXIT',_} = (catch string:str(hello, "he")), + %% invalid arg type + ?line {'EXIT',_} = (catch string:str("hello", he)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:rstr(hello, "he")), + %% invalid arg type + ?line {'EXIT',_} = (catch string:rstr("hello", he)), + ok. + +span_cspan(suite) -> + []; +span_cspan(doc) -> + []; +span_cspan(Config) when is_list(Config) -> + ?line 0 = string:span("", "1"), + ?line 0 = string:span("1", ""), + ?line 0 = string:cspan("", "1"), + ?line 1 = string:cspan("1", ""), + ?line 1 = string:span("1 ", "1"), + ?line 5 = string:span(" 1 ", "12 "), + ?line 6 = string:span("1231234", "123"), + ?line 0 = string:cspan("1 ", "1"), + ?line 1 = string:cspan("3 ", "12 "), + ?line 6 = string:cspan("1231234", "4"), + %% invalid arg type + ?line {'EXIT',_} = (catch string:span(1234, "1")), + %% invalid arg type + ?line {'EXIT',_} = (catch string:span(1234, "1")), + %% invalid arg type + ?line {'EXIT',_} = (catch string:cspan("1234", 1)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:cspan("1234", 4)), + ok. + + +substr(suite) -> + []; +substr(doc) -> + []; +substr(Config) when is_list(Config) -> + ?line {'EXIT',_} = (catch string:substr("", 0)), + ?line [] = string:substr("", 1), + ?line {'EXIT',_} = (catch string:substr("", 2)), + ?line [] = string:substr("1", 2), + ?line {'EXIT',_} = (catch string:substr("", 0, 1)), + ?line [] = string:substr("", 1, 1), + ?line [] = string:substr("", 1, 2), + ?line {'EXIT',_} = (catch string:substr("", 2, 2)), + ?line "1234" = string:substr("1234", 1), + ?line "1234" = string:substr("1234", 1, 4), + ?line "1234" = string:substr("1234", 1, 5), + ?line "23" = string:substr("1234", 2, 2), + ?line "4" = string:substr("1234", 4), + ?line "" = string:substr("1234", 4, 0), + ?line "4" = string:substr("1234", 4, 1), + %% invalid arg type + ?line {'EXIT',_} = (catch string:substr(1234, 1)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:substr("1234", "1")), + ok. + +tokens(suite) -> + []; +tokens(doc) -> + []; +tokens(Config) when is_list(Config) -> + ?line [] = string:tokens("",""), + ?line [] = string:tokens("abc","abc"), + ?line ["abc"] = string:tokens("abc", ""), + ?line ["1","2 34","4","5"] = string:tokens("1,2 34,4;5", ";,"), + %% invalid arg type + ?line {'EXIT',_} = (catch string:tokens('x,y', ",")), + %% invalid arg type + ?line {'EXIT',_} = (catch string:tokens("x,y", ',')), + ok. + + +chars(suite) -> + []; +chars(doc) -> + []; +chars(Config) when is_list(Config) -> + ?line [] = string:chars($., 0), + ?line [] = string:chars($., 0, []), + ?line 10 = length(string:chars(32, 10, [])), + ?line "aaargh" = string:chars($a, 3, "rgh"), + %% invalid arg type + ?line {'EXIT',_} = (catch string:chars($x, [])), + ok. + +copies(suite) -> + []; +copies(doc) -> + []; +copies(Config) when is_list(Config) -> + ?line "" = string:copies("", 10), + ?line "" = string:copies(".", 0), + ?line "." = string:copies(".", 1), + ?line 30 = length(string:copies("123", 10)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:chars("hej", -1)), + ok. + +words(suite) -> + []; +words(doc) -> + []; +words(Config) when is_list(Config) -> + ?line 1 = string:words(""), + ?line 1 = string:words("", $,), + ?line 1 = string:words("hello"), + ?line 1 = string:words("hello", $,), + ?line 1 = string:words("...", $.), + ?line 2 = string:words("2.35", $.), + ?line 100 = string:words(string:copies(". ", 100)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:chars(hej)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:chars("hej", " ")), + ok. + + +strip(suite) -> + []; +strip(doc) -> + []; +strip(Config) when is_list(Config) -> + ?line "" = string:strip(""), + ?line "" = string:strip("", both), + ?line "" = string:strip("", both, $.), + ?line "hej" = string:strip(" hej "), + ?line "hej " = string:strip(" hej ", left), + ?line " hej" = string:strip(" hej ", right), + ?line " hej " = string:strip(" hej ", right, $.), + ?line "hej hopp" = string:strip(" hej hopp ", both), + %% invalid arg type + ?line {'EXIT',_} = (catch string:strip(hej)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:strip(" hej", up)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:strip(" hej", left, " ")), % not good + ok. + +sub_word(suite) -> + []; +sub_word(doc) -> + []; +sub_word(Config) when is_list(Config) -> + ?line "" = string:sub_word("", 1), + ?line "" = string:sub_word("", 1, $,), + ?line {'EXIT',_} = (catch string:sub_word("1 2 3", 0)), + ?line "" = string:sub_word("1 2 3", 4), + ?line "llo th" = string:sub_word("but hello there", 2, $e), + %% invalid arg type + ?line {'EXIT',_} = (catch string:sub_word('hello there', 1)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:sub_word("hello there", 1, "e")), + ok. + +left_right(suite) -> + []; +left_right(doc) -> + []; +left_right(Config) when is_list(Config) -> + ?line "" = string:left("", 0), + ?line "" = string:left("hej", 0), + ?line "" = string:left("hej", 0, $.), + ?line "" = string:right("", 0), + ?line "" = string:right("hej", 0), + ?line "" = string:right("hej", 0, $.), + ?line "123 " = string:left("123 ", 5), + ?line " 123" = string:right(" 123", 5), + ?line "123!!" = string:left("123!", 5, $!), + ?line "==123" = string:right("=123", 5, $=), + ?line "1" = string:left("123", 1, $.), + ?line "3" = string:right("123", 1, $.), + %% invalid arg type + ?line {'EXIT',_} = (catch string:left(hello, 5)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:right(hello, 5)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:left("hello", 5, ".")), + %% invalid arg type + ?line {'EXIT',_} = (catch string:right("hello", 5, ".")), + ok. + +sub_string(suite) -> + []; +sub_string(doc) -> + []; +sub_string(Config) when is_list(Config) -> + ?line {'EXIT',_} = (catch string:sub_string("", 0)), + ?line [] = string:sub_string("", 1), + ?line {'EXIT',_} = (catch string:sub_string("", 2)), + ?line [] = string:sub_string("1", 2), + ?line {'EXIT',_} = (catch string:sub_string("", 0, 1)), + ?line [] = string:sub_string("", 1, 1), + ?line [] = string:sub_string("", 1, 2), + ?line {'EXIT',_} = (catch string:sub_string("", 2, 2)), + ?line "1234" = string:sub_string("1234", 1), + ?line "1234" = string:sub_string("1234", 1, 4), + ?line "1234" = string:sub_string("1234", 1, 5), + ?line "23" = string:sub_string("1234", 2, 3), + ?line "4" = string:sub_string("1234", 4), + ?line "4" = string:sub_string("1234", 4, 4), + ?line "4" = string:sub_string("1234", 4, 5), + %% invalid arg type + ?line {'EXIT',_} = (catch string:sub_string(1234, 1)), + %% invalid arg type + ?line {'EXIT',_} = (catch string:sub_string("1234", "1")), + ok. + +centre(suite) -> + []; +centre(doc) -> + []; +centre(Config) when is_list(Config) -> + ?line "" = string:centre("", 0), + ?line "" = string:centre("1", 0), + ?line "" = string:centre("", 0, $-), + ?line "" = string:centre("1", 0, $-), + ?line "gd" = string:centre("agda", 2), + ?line "agda " = string:centre("agda", 5), + ?line " agda " = string:centre("agda", 6), + ?line "agda." = string:centre("agda", 5, $.), + ?line "--agda--" = string:centre("agda", 8, $-), + ?line "agda" = string:centre("agda", 4), + %% invalid arg type + ?line {'EXIT',_} = (catch string:centre(hello, 10)), + ok. + +to_integer(suite) -> + []; +to_integer(doc) -> + []; +to_integer(Config) when is_list(Config) -> + ?line {1,""} = test_to_integer("1"), + ?line {1,""} = test_to_integer("+1"), + ?line {-1,""} = test_to_integer("-1"), + ?line {1,"="} = test_to_integer("1="), + ?line {7,"F"} = test_to_integer("7F"), + ?line {709,""} = test_to_integer("709"), + ?line {709,"*2"} = test_to_integer("709*2"), + ?line {0,"xAB"} = test_to_integer("0xAB"), + ?line {16,"#FF"} = test_to_integer("16#FF"), + ?line {error,no_integer} = test_to_integer(""), + ?line {error,no_integer} = test_to_integer("!1"), + ?line {error,no_integer} = test_to_integer("F1"), + ?line {error,not_a_list} = test_to_integer('23'), + ?line {3,[[]]} = test_to_integer([$3,[]]), + ?line {3,[hello]} = test_to_integer([$3,hello]), + ok. + +test_to_integer(Str) -> + io:format("Checking ~p~n", [Str]), + case string:to_integer(Str) of + {error,_Reason} = Bad -> + ?line {'EXIT',_} = (catch list_to_integer(Str)), + Bad; + {F,_Rest} = Res -> + ?line _ = integer_to_list(F), + Res + end. + +to_float(suite) -> + []; +to_float(doc) -> + []; +to_float(Config) when is_list(Config) -> + ?line {1.2,""} = test_to_float("1.2"), + ?line {1.2,""} = test_to_float("1,2"), + ?line {120.0,""} = test_to_float("1.2e2"), + ?line {120.0,""} = test_to_float("+1,2e2"), + ?line {-120.0,""} = test_to_float("-1.2e2"), + ?line {-120.0,""} = test_to_float("-1,2e+2"), + ?line {-1.2e-2,""} = test_to_float("-1.2e-2"), + ?line {1.2,"="} = test_to_float("1.2="), + ?line {7.9,"e"} = test_to_float("7.9e"), + ?line {7.9,"ee"} = test_to_float("7.9ee"), + ?line {7.9,"e+"} = test_to_float("7.9e+"), + ?line {7.9,"e-"} = test_to_float("7.9e-"), + ?line {7.9,"e++"} = test_to_float("7.9e++"), + ?line {7.9,"e--"} = test_to_float("7.9e--"), + ?line {7.9,"e+e"} = test_to_float("7.9e+e"), + ?line {7.9,"e-e"} = test_to_float("7.9e-e"), + ?line {7.9,"e+."} = test_to_float("7.9e+."), + ?line {7.9,"e-."} = test_to_float("7.9e-."), + ?line {7.9,"e+,"} = test_to_float("7.9e+,"), + ?line {7.9,"e-,"} = test_to_float("7.9e-,"), + ?line {error,no_float} = test_to_float(""), + ?line {error,no_float} = test_to_float("e1,0"), + ?line {error,no_float} = test_to_float("1;0"), + ?line {error,no_float} = test_to_float("1"), + ?line {error,no_float} = test_to_float("1e"), + ?line {error,no_float} = test_to_float("2."), + ?line {error,not_a_list} = test_to_float('2.3'), + ?line {2.3,[[]]} = test_to_float([$2,$.,$3,[]]), + ?line {2.3,[hello]} = test_to_float([$2,$.,$3,hello]), + ok. + +test_to_float(Str) -> + io:format("Checking ~p~n", [Str]), + case string:to_float(Str) of + {error,_Reason} = Bad -> + ?line {'EXIT',_} = (catch list_to_float(Str)), + Bad; + {F,_Rest} = Res -> + ?line _ = float_to_list(F), + Res + end. + +to_upper_to_lower(suite) -> + []; +to_upper_to_lower(doc) -> + []; +to_upper_to_lower(Config) when is_list(Config) -> + ?line "1234ABCDEFÅÄÖ=" = string:to_upper("1234abcdefåäö="), + ?line "éèíúùòóåäöabc()" = string:to_lower("ÉÈÍÚÙÒÓÅÄÖabc()"), + ?line All = lists:seq(0, 255), + + ?line UC = string:to_upper(All), + ?line 256 = length(UC), + ?line all_upper_latin1(UC, 0), + + ?line LC = string:to_lower(All), + ?line all_lower_latin1(LC, 0), + + ?line LC = string:to_lower(string:to_upper(LC)), + ?line LC = string:to_lower(string:to_upper(UC)), + ?line UC = string:to_upper(string:to_lower(LC)), + ?line UC = string:to_upper(string:to_lower(UC)), + ok. + +all_upper_latin1([C|T], C) when 0 =< C, C < $a; + $z < C, C < 16#E0; + C =:= 16#F7; C =:= 16#FF -> + all_upper_latin1(T, C+1); +all_upper_latin1([H|T], C) when $a =< C, C =< $z; + 16#E0 =< C, C =< 16#F6; + 16#F8 =< C, C =< 16#FE -> + H = C - 32, + all_upper_latin1(T, C+1); +all_upper_latin1([], 256) -> ok. + +all_lower_latin1([C|T], C) when 0 =< C, C < $A; + $Z < C, C < 16#C0; + C =:= 16#D7; + 16#DF =< C, C =< 255 -> + all_lower_latin1(T, C+1); +all_lower_latin1([H|T], C) when $A =< C, C =< $Z; + 16#C0 =< C, C =< 16#F6; + 16#C8 =< C, C =< 16#DE -> + io:format("~p\n", [{H,C}]), + H = C + 32, + all_lower_latin1(T, C+1); +all_lower_latin1([], 256) -> ok. + +join(suite) -> + []; +join(doc) -> + []; +join(Config) when is_list(Config) -> + ?line "erlang rules" = string:join(["erlang", "rules"], " "), + ?line "a,-,b,-,c" = string:join(["a", "b", "c"], ",-,"), + ?line "1234" = string:join(["1", "2", "3", "4"], ""), + ?line [] = string:join([], ""), % OTP-7231 + %% invalid arg type + ?line {'EXIT',_} = (catch string:join([apa], "")), + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/suite_release.exclude erlang-13.b.3-dfsg/lib/stdlib/test/suite_release.exclude --- erlang-13.b.1-dfsg/lib/stdlib/test/suite_release.exclude 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/suite_release.exclude 2004-09-14 12:57:20.000000000 +0100 @@ -0,0 +1,4 @@ +tar_SUITE.erl +tar_SUITE_data +{skip,{ets_SUITE,partly_bound,"System dependent"}}. +{skip,{gen_server_SUITE,multicall_down,"Network dependent"}}. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/supervisor_1.erl erlang-13.b.3-dfsg/lib/stdlib/test/supervisor_1.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/supervisor_1.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/supervisor_1.erl 2009-11-20 13:29:57.000000000 +0000 @@ -0,0 +1,79 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% Description: Simulates the behaviour that a child process may have. +%% Is used by the supervisor_SUITE test suite. +-module(supervisor_1). + +-export([start_child/0, start_child/1, init/1]). + +-export([handle_call/3, handle_info/2, terminate/2]). + +start_child(ignore) -> + case get(child_ignored) of + true -> + start_child(); + _ -> + put(child_ignored, true), + ignore + end; + +start_child(error) -> + case get(start_child_error) of + undefined -> + put(start_child_error, set), + start_child(); + set -> gen_server:start_link(?MODULE, error, []) + end; + + +start_child(Extra) -> + {ok, Pid} = gen_server:start_link(?MODULE, normal, []), + {ok, Pid, Extra}. + +start_child() -> + gen_server:start_link(?MODULE, normal, []). + +init(normal) -> + process_flag(trap_exit, true), + {ok, {}}. + +handle_call(Req, _From, State) -> + {reply, Req, State}. + +handle_info(die, State) -> + {stop, died, State}; + +handle_info(stop, State) -> + {stop, normal, State}; + +handle_info({sleep, Time}, State) -> + io:format("FOO: ~p~n", [Time]), + timer:sleep(Time), + io:format("FOO: sleept~n", []), + handle_info({sleep, Time}, State); + +handle_info(_, State) -> + {noreply, State}. + +terminate(_Reason, _State) -> + ok. + + + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/supervisor_bridge_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/supervisor_bridge_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/supervisor_bridge_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/supervisor_bridge_SUITE.erl 2009-11-20 13:29:58.000000000 +0000 @@ -0,0 +1,178 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(supervisor_bridge_SUITE). +-export([all/1,starting/1,mini_terminate/1,mini_die/1,badstart/1]). +-export([client/1,init/1,internal_loop_init/1,terminate/2]). + +-include("test_server.hrl"). +-define(bridge_name,supervisor_bridge_SUITE_server). +-define(work_bridge_name,work_supervisor_bridge_SUITE_server). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +all(suite) -> [starting,mini_terminate,mini_die,badstart]. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +starting(suite) -> []; +starting(Config) when is_list(Config) -> + process_flag(trap_exit,true), + + ?line ignore = start(1), + ?line {error,testing} = start(2), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +mini_terminate(suite) -> []; +mini_terminate(Config) when is_list(Config) -> + miniappl(1), + ok. + +mini_die(suite) -> []; +mini_die(Config) when is_list(Config) -> + miniappl(2), + ok. + +miniappl(N) -> + process_flag(trap_exit,true), + ?line {ok,Server} = start(3), + ?line Client = spawn_link(?MODULE,client,[N]), + ?line Handle = test_server:timetrap(2000), + ?line miniappl_loop(Client,Server), + ?line test_server:timetrap_cancel(Handle). + +miniappl_loop([],[]) -> + ok; +miniappl_loop(Client,Server) -> + io:format("Client ~p, Server ~p\n",[Client,Server]), + receive + {'EXIT',Client,_} -> + ?line miniappl_loop([],Server); + {'EXIT',Server,killed} -> %% terminate + ?line miniappl_loop(Client,[]); + {'EXIT',Server,died} -> %% die + ?line miniappl_loop(Client,[]); + {dying,_Reason} -> + ?line miniappl_loop(Client, Server); + Other -> + ?line exit({failed,Other}) + end. + +%%%%%%%%%%%%%%%%%%%% +% Client + +client(N) -> + io:format("Client starting...\n"), + ok = public_request(), + case N of + 1 -> public_kill(); + 2 -> ?work_bridge_name ! die + end, + io:format("Killed server, terminating client...\n"), + exit(fine). + +%%%%%%%%%%%%%%%%%%%% +% Non compliant server + +start(N) -> + supervisor_bridge:start_link({local,?bridge_name},?MODULE,N). + +public_request() -> + ?work_bridge_name ! {non_compliant_message,self()}, + io:format("Client waiting for answer...\n"), + receive + non_compliant_answer -> + ok + end, + io:format("Client got answer...\n"). + +public_kill() -> + %% This func knows about supervisor_bridge + exit(whereis(?work_bridge_name),kill). + +init(1) -> + ignore; +init(2) -> + {error,testing}; +init(3) -> + %% This func knows about supervisor_bridge + InternalPid = spawn_link(?MODULE,internal_loop_init,[self()]), + receive + {InternalPid,init_done} -> + {ok,InternalPid,self()} + end. + +internal_loop_init(Parent) -> + register(?work_bridge_name, self()), + Parent ! {self(),init_done}, + internal_loop({Parent,self()}). + +internal_loop(State) -> + receive + {non_compliant_message,From} -> + io:format("Got request from ~p\n",[From]), + From ! non_compliant_answer, + internal_loop(State); + die -> + exit(died) + end. + +terminate(Reason,{Parent,Worker}) -> + %% This func knows about supervisor_bridge + io:format("Terminating bridge...\n"), + exit(kill,Worker), + Parent ! {dying,Reason}, + anything. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +badstart(suite) -> []; +badstart(doc) -> "Test various bad ways of starting a supervisor bridge."; +badstart(Config) when is_list(Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(1)), + + %% Various bad arguments. + + ?line {'EXIT',_} = + (catch supervisor_bridge:start_link({xxx,?bridge_name},?MODULE,1)), + ?line {'EXIT',_} = + (catch supervisor_bridge:start_link({local,"foo"},?MODULE,1)), + ?line {'EXIT',_} = + (catch supervisor_bridge:start_link(?bridge_name,?MODULE,1)), + ?line [] = test_server:messages_get(), % No messages waiting + + %% Already started. + + ?line process_flag(trap_exit, true), + ?line {ok,Pid} = + supervisor_bridge:start_link({local,?bridge_name},?MODULE,3), + ?line {error,{already_started,Pid}} = + supervisor_bridge:start_link({local,?bridge_name},?MODULE,3), + ?line public_kill(), + + %% We used to wait 1 ms before retrieving the message queue, + %% but that might not always be enough if the machine is overloaded. + ?line receive + {'EXIT', Pid, killed} -> ok + end, + ?line test_server:timetrap_cancel(Dog), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/supervisor_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/supervisor_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/supervisor_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/supervisor_SUITE.erl 2009-11-20 13:29:57.000000000 +0000 @@ -0,0 +1,1203 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% Description: Tests supervisor.erl + +-module(supervisor_SUITE). + +-include("test_server.hrl"). + +%% Testserver specific export +-export([all/1]). + +%% Indirect spawn export +-export([init/1]). + +%% API tests +-export([sup_start/1, sup_start_normal/1, sup_start_ignore_init/1, + sup_start_ignore_child/1, sup_start_error_return/1, + sup_start_fail/1, sup_stop/1, sup_stop_infinity/1, + sup_stop_timeout/1, sup_stop_brutal_kill/1, child_adm/1, + child_adm_simple/1, child_specs/1, extra_return/1]). + +%% Tests concept permanent, transient and temporary +-export([normal_termination/1, permanent_normal/1, transient_normal/1, + temporary_normal/1, abnormal_termination/1, + permanent_abnormal/1, transient_abnormal/1, + temporary_abnormal/1]). + +%% Restart strategy tests +-export([restart_one_for_one/1, one_for_one/1, + one_for_one_escalation/1, restart_one_for_all/1, one_for_all/1, + one_for_all_escalation/1, restart_simple_one_for_one/1, + simple_one_for_one/1, simple_one_for_one_escalation/1, + restart_rest_for_one/1, rest_for_one/1, rest_for_one_escalation/1, + simple_one_for_one_extra/1]). + +%% Misc tests +-export([child_unlink/1, tree/1]). + +%------------------------------------------------------------------------- + +all(suite) -> + {req,[stdlib], + [sup_start, sup_stop, child_adm, + child_adm_simple, extra_return, child_specs, + restart_one_for_one, restart_one_for_all, + restart_simple_one_for_one, restart_rest_for_one, + normal_termination, abnormal_termination, child_unlink, tree]}. + + +start(InitResult) -> + supervisor:start_link({local, sup_test}, ?MODULE, InitResult). + +%% Simulate different supervisors callback. +init(fail) -> + erlang:error({badmatch,2}); +init(InitResult) -> + InitResult. + +%------------------------------------------------------------------------- +% +% Test cases starts here. +% +%------------------------------------------------------------------------- + +sup_start(doc) -> + ["Test start of a supervisor."]; +sup_start(suite) -> + [sup_start_normal, sup_start_ignore_init, sup_start_ignore_child, + sup_start_error_return, sup_start_fail]. + +%------------------------------------------------------------------------- +sup_start_normal(doc) -> + ["Tests that the supervisor process starts correctly and that it " + "can be terminated gracefully."]; +sup_start_normal(suite) -> []; +sup_start_normal(Config) when list(Config) -> + process_flag(trap_exit, true), + ?line {ok, Pid} = start({ok, {{one_for_one, 2, 3600}, []}}), + ?line exit(Pid, shutdown), + receive + {'EXIT', Pid, shutdown} -> + ok; + {'EXIT', Pid, Else} -> + ?line test_server:fail({bad_exit_reason, Else}) + after + 2000 -> + ?line test_server:fail(no_exit_reason) + end, + ok. +%------------------------------------------------------------------------- +sup_start_ignore_init(doc) -> + ["Tests what happens if init-callback returns ignore"]; +sup_start_ignore_init(suite) -> []; +sup_start_ignore_init(Config) when list(Config) -> + process_flag(trap_exit, true), + ?line ignore = start(ignore), + + receive + {'EXIT', _Pid, normal} -> + ok; + {'EXIT', _Pid, Else} -> + ?line test_server:fail({bad_exit_reason, Else}) + after + 2000 -> + ?line test_server:fail(no_exit_reason) + end, + ok. + + +%------------------------------------------------------------------------- +sup_start_ignore_child(doc) -> + ["Tests what happens if init-callback returns ignore"]; +sup_start_ignore_child(suite) -> []; +sup_start_ignore_child(Config) when list(Config) -> + process_flag(trap_exit, true), + ?line {ok, _Pid} = start({ok, {{one_for_one, 2, 3600}, []}}), + Child1 = {child1, {supervisor_1, start_child, [ignore]}, + permanent, 1000, worker, []}, + Child2 = {child2, {supervisor_1, start_child, []}, permanent, + 1000, worker, []}, + + ?line {ok, undefined} = supervisor:start_child(sup_test, Child1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2), + + ?line [{child2, CPid2, worker, []},{child1, undefined, worker, []}] + = supervisor:which_children(sup_test), + ok. + +%------------------------------------------------------------------------- +sup_start_error_return(doc) -> + ["Tests what happens if init-callback returns a invalid value"]; +sup_start_error_return(suite) -> []; +sup_start_error_return(Config) when list(Config) -> + process_flag(trap_exit, true), + ?line {error, Term} = start(invalid), + + receive + {'EXIT', _Pid, Term} -> + ok; + {'EXIT', _Pid, Else} -> + ?line test_server:fail({bad_exit_reason, Else}) + after + 2000 -> + ?line test_server:fail(no_exit_reason) + end, + ok. + +%------------------------------------------------------------------------- +sup_start_fail(doc) -> + ["Tests what happens if init-callback fails"]; +sup_start_fail(suite) -> []; +sup_start_fail(Config) when list(Config) -> + process_flag(trap_exit, true), + ?line {error, Term} = start(fail), + + receive + {'EXIT', _Pid, Term} -> + ok; + {'EXIT', _Pid, Else} -> + ?line test_server:fail({bad_exit_reason, Else}) + after + 2000 -> + ?line test_server:fail(no_exit_reason) + end, + ok. +%------------------------------------------------------------------------- +sup_stop(doc) -> + ["Tests that the supervisor shoutdowns its children if it is " + "shutdown itself."]; +sup_stop(suite) -> [sup_stop_infinity, sup_stop_timeout, sup_stop_brutal_kill]. + +%------------------------------------------------------------------------- + +sup_stop_infinity(doc) -> + ["See sup_stop/1 when Shutdown = infinity, this walue is only allowed " + "for children of type supervisor"]; +sup_stop_infinity(suite) -> []; + +sup_stop_infinity(Config) when list(Config) -> + process_flag(trap_exit, true), + ?line {ok, Pid} = start({ok, {{one_for_one, 2, 3600}, []}}), + Child1 = {child1, {supervisor_1, start_child, []}, + permanent, infinity, supervisor, []}, + Child2 = {child2, {supervisor_1, start_child, []}, permanent, + infinity, worker, []}, + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + link(CPid1), + ?line {error, {invalid_shutdown,infinity}} = + supervisor:start_child(sup_test, Child2), + + ?line exit(Pid, shutdown), + + receive + {'EXIT', Pid, shutdown} -> + ok; + {'EXIT', Pid, Else} -> + ?line test_server:fail({bad_exit_reason, Else}) + after + 5000 -> + ?line test_server:fail(no_exit_reason) + end, + receive + {'EXIT', CPid1, shutdown} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + after + 2000 -> ?line test_server:fail(no_exit_reason) + end, + ok. + +%------------------------------------------------------------------------- + +sup_stop_timeout(doc) -> + ["See sup_stop/1 when Shutdown = 1000"]; +sup_stop_timeout(suite) -> []; + +sup_stop_timeout(Config) when list(Config) -> + process_flag(trap_exit, true), + ?line {ok, Pid} = start({ok, {{one_for_one, 2, 3600}, []}}), + Child1 = {child1, {supervisor_1, start_child, []}, + permanent, 1000, worker, []}, + Child2 = {child2, {supervisor_1, start_child, []}, permanent, + 1000, worker, []}, + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + link(CPid1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2), + link(CPid2), + + CPid2 ! {sleep, 200000}, + + ?line exit(Pid, shutdown), + + receive + {'EXIT', Pid, shutdown} -> + ok; + {'EXIT', Pid, Else} -> + ?line test_server:fail({bad_exit_reason, Else}) + after + 5000 -> + ?line test_server:fail(no_exit_reason) + end, + + receive + {'EXIT', CPid1, shutdown} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason,Reason}) + after + 2000 -> ?line test_server:fail(no_exit_reason) + end, + + receive + {'EXIT', CPid2, killed} -> ok; + {'EXIT', CPid2, Reason2} -> + ?line test_server:fail({bad_exit_reason, Reason2}) + after + 2000 -> ?line test_server:fail(no_exit_reason) + end, + ok. + +%------------------------------------------------------------------------- +sup_stop_brutal_kill(doc) -> + ["See sup_stop/1 when Shutdown = brutal_kill"]; +sup_stop_brutal_kill(suite) -> []; + +sup_stop_brutal_kill(Config) when list(Config) -> + process_flag(trap_exit, true), + ?line {ok, Pid} = start({ok, {{one_for_one, 2, 3600}, []}}), + Child1 = {child1, {supervisor_1, start_child, []}, + permanent, 1000, worker, []}, + Child2 = {child2, {supervisor_1, start_child, []}, permanent, + brutal_kill, worker, []}, + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + link(CPid1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2), + link(CPid2), + + ?line exit(Pid, shutdown), + + receive + {'EXIT', Pid, shutdown} -> + ok; + {'EXIT', Pid, Else} -> + ?line test_server:fail({bad_exit_reason, Else}) + after + 5000 -> + ?line test_server:fail(no_exit_reason) + end, + + receive + {'EXIT', CPid1, shutdown} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + after + 2000 -> ?line test_server:fail(no_exit_reason) + end, + receive + {'EXIT', CPid2, killed} -> ok; + {'EXIT', CPid2, Reason2} -> + ?line test_server:fail({bad_exit_reason, Reason2}) + after + 2000 -> ?line test_server:fail(no_exit_reason) + end, + ok. + +%------------------------------------------------------------------------- +extra_return(doc) -> + ["The start function provided to start a child may " + "return {ok, Pid} or {ok, Pid, Info}, if it returns " + "the later check that the supervisor ignores the Info, " + "and includes it unchanged in return from start_child/2 " + "and restart_child/2"]; +extra_return(suite) -> []; + +extra_return(Config) when list(Config) -> + process_flag(trap_exit, true), + Child = {child1, {supervisor_1, start_child, [extra_return]}, + permanent, 1000, + worker, []}, + ?line {ok, _Pid} = start({ok, {{one_for_one, 2, 3600}, [Child]}}), + ?line [{child1, CPid, worker, []}] = supervisor:which_children(sup_test), + link(CPid), + ?line {error, not_found} = supervisor:terminate_child(sup_test, hej), + ?line {error, not_found} = supervisor:delete_child(sup_test, hej), + ?line {error, not_found} = supervisor:restart_child(sup_test, hej), + ?line {error, running} = supervisor:delete_child(sup_test, child1), + ?line {error, running} = supervisor:restart_child(sup_test, child1), + ?line [{child1, CPid, worker, []}] = supervisor:which_children(sup_test), + ?line ok = supervisor:terminate_child(sup_test, child1), + receive + {'EXIT', CPid, shutdown} -> ok; + {'EXIT', CPid, Reason} -> + ?line test_server:fail({bad_reason, Reason}) + after 1000 -> + ?line test_server:fail(no_child_termination) + end, + ?line [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test), + ?line {ok, CPid2,extra_return} = + supervisor:restart_child(sup_test, child1), + ?line [{child1, CPid2, worker, []}] = supervisor:which_children(sup_test), + ?line ok = supervisor:terminate_child(sup_test, child1), + ?line ok = supervisor:terminate_child(sup_test, child1), + ?line ok = supervisor:delete_child(sup_test, child1), + ?line {error, not_found} = supervisor:restart_child(sup_test, child1), + ?line [] = supervisor:which_children(sup_test), + ?line {ok, CPid3, extra_return} = supervisor:start_child(sup_test, Child), + ?line [{child1, CPid3, worker, []}] = supervisor:which_children(sup_test), + ok. +%------------------------------------------------------------------------- +child_adm(doc)-> + ["Test API functions start_child/2, terminate_child/2, delete_child/2 " + "restart_child/2, which_children/1. Only correct childspecs are used, " + "handling of incorrect childspecs is tested in child_specs/1"]; +child_adm(suite) -> []; +child_adm(Config) when list(Config) -> + process_flag(trap_exit, true), + Child = {child1, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + ?line {ok, _Pid} = start({ok, {{one_for_one, 2, 3600}, [Child]}}), + ?line [{child1, CPid, worker, []}] = supervisor:which_children(sup_test), + link(CPid), + + %% Start of an already runnig process + ?line {error,{already_started, CPid}} = + supervisor:start_child(sup_test, Child), + + %% Termination + ?line {error, not_found} = supervisor:terminate_child(sup_test, hej), + ?line {'EXIT',{noproc,{gen_server,call, _}}} = + (catch supervisor:terminate_child(foo, child1)), + ?line ok = supervisor:terminate_child(sup_test, child1), + receive + {'EXIT', CPid, shutdown} -> ok; + {'EXIT', CPid, Reason} -> + ?line test_server:fail({bad_reason, Reason}) + after 1000 -> + ?line test_server:fail(no_child_termination) + end, + ?line [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test), + %% Like deleting something that does not exist, it will succeed! + ?line ok = supervisor:terminate_child(sup_test, child1), + + %% Start of already existing but not running process + ?line {error,already_present} = + supervisor:start_child(sup_test, Child), + + %% Restart + ?line {ok, CPid2} = supervisor:restart_child(sup_test, child1), + ?line [{child1, CPid2, worker, []}] = supervisor:which_children(sup_test), + ?line {error, running} = supervisor:restart_child(sup_test, child1), + ?line {error, not_found} = supervisor:restart_child(sup_test, child2), + + %% Deletion + ?line {error, running} = supervisor:delete_child(sup_test, child1), + ?line {error, not_found} = supervisor:delete_child(sup_test, hej), + ?line {'EXIT',{noproc,{gen_server,call, _}}} = + (catch supervisor:delete_child(foo, child1)), + ?line ok = supervisor:terminate_child(sup_test, child1), + ?line ok = supervisor:delete_child(sup_test, child1), + ?line {error, not_found} = supervisor:restart_child(sup_test, child1), + ?line [] = supervisor:which_children(sup_test), + + %% Start + ?line {'EXIT',{noproc,{gen_server,call, _}}} = + (catch supervisor:start_child(foo, Child)), + ?line {ok, CPid3} = supervisor:start_child(sup_test, Child), + ?line [{child1, CPid3, worker, []}] = supervisor:which_children(sup_test), + + ?line {'EXIT',{noproc,{gen_server,call,[foo,which_children,infinity]}}} + = (catch supervisor:which_children(foo)), + ok. +%------------------------------------------------------------------------- +child_adm_simple(doc) -> + ["The API functions terminate_child/2, delete_child/2 " + "restart_child/2 are not valid for a simple_one_for_one supervisor " + "check that the correct error message is returned."]; +child_adm_simple(suite) -> []; +child_adm_simple(Config) when list(Config) -> + Child = {child, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + ?line {ok, _Pid} = start({ok, {{simple_one_for_one, 2, 3600}, [Child]}}), + %% In simple_one_for_one all children are added dynamically + ?line [] = supervisor:which_children(sup_test), + + %% Start + ?line {'EXIT',{noproc,{gen_server,call, _}}} = + (catch supervisor:start_child(foo, [])), + ?line {ok, CPid1} = supervisor:start_child(sup_test, []), + ?line [{undefined, CPid1, worker, []}] = + supervisor:which_children(sup_test), + + ?line {ok, CPid2} = supervisor:start_child(sup_test, []), + ?line Children = supervisor:which_children(sup_test), + ?line 2 = length(Children), + ?line true = lists:member({undefined, CPid2, worker, []}, Children), + ?line true = lists:member({undefined, CPid1, worker, []}, Children), + + %% Termination + ?line {error, simple_one_for_one} = + supervisor:terminate_child(sup_test, child1), + + %% Restart + ?line {error, simple_one_for_one} = + supervisor:restart_child(sup_test, child1), + + %% Deletion + ?line {error, simple_one_for_one} = + supervisor:delete_child(sup_test, child1), + ok. + +%------------------------------------------------------------------------- +child_specs(doc) -> + ["Tests child specs, invalid formats should be rejected."]; +child_specs(suite) -> []; +child_specs(Config) when list(Config) -> + process_flag(trap_exit, true), + ?line {ok, _Pid} = start({ok, {{one_for_one, 2, 3600}, []}}), + ?line {error, _} = supervisor:start_child(sup_test, hej), + + %% Bad child specs + B1 = {child, mfa, permanent, 1000, worker, []}, + B2 = {child, {m,f,[a]}, prmanent, 1000, worker, []}, + B3 = {child, {m,f,[a]}, permanent, -10, worker, []}, + B4 = {child, {m,f,[a]}, permanent, 10, wrker, []}, + B5 = {child, {m,f,[a]}, permanent, infinity, worker, []}, + B6 = {child, {m,f,[a]}, permanent, 1000, worker, dy}, + B7 = {child, {m,f,[a]}, permanent, 1000, worker, [1,2,3]}, + + %% Correct child specs! + %% (last parameter in a child spec) can be [] as we do + %% not test code upgrade here. + C1 = {child, {m,f,[a]}, permanent, infinity, supervisor, []}, + C2 = {child, {m,f,[a]}, permanent, 1000, supervisor, []}, + C3 = {child, {m,f,[a]}, temporary, 1000, worker, dynamic}, + C4 = {child, {m,f,[a]}, transient, 1000, worker, [m]}, + + ?line {error, {invalid_mfa,mfa}} = supervisor:start_child(sup_test, B1), + ?line {error, {invalid_restart_type, prmanent}} = + supervisor:start_child(sup_test, B2), + ?line {error, {invalid_shutdown,-10}} + = supervisor:start_child(sup_test, B3), + ?line {error, {invalid_child_type,wrker}} + = supervisor:start_child(sup_test, B4), + ?line {error, _} = supervisor:start_child(sup_test, B5), + ?line {error, {invalid_modules,dy}} + = supervisor:start_child(sup_test, B6), + + ?line {error, {invalid_mfa,mfa}} = supervisor:check_childspecs([B1]), + ?line {error, {invalid_restart_type,prmanent}} = + supervisor:check_childspecs([B2]), + ?line {error, {invalid_shutdown,-10}} = supervisor:check_childspecs([B3]), + ?line {error, {invalid_child_type,wrker}} + = supervisor:check_childspecs([B4]), + ?line {error, _} = supervisor:check_childspecs([B5]), + ?line {error, {invalid_modules,dy}} = supervisor:check_childspecs([B6]), + ?line {error, {invalid_module, 1}} = + supervisor:check_childspecs([B7]), + + ?line ok = supervisor:check_childspecs([C1]), + ?line ok = supervisor:check_childspecs([C2]), + ?line ok = supervisor:check_childspecs([C3]), + ?line ok = supervisor:check_childspecs([C4]), + ok. +%------------------------------------------------------------------------- +normal_termination(doc) -> + ["Testes the supervisors behaviour if a child dies with reason normal"]; +normal_termination(suite) -> + [permanent_normal, transient_normal, temporary_normal]. + +%------------------------------------------------------------------------- +permanent_normal(doc) -> + ["A permanent child should always be restarted"]; +permanent_normal(suite) -> []; +permanent_normal(Config) when list(Config) -> + ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}), + Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + + CPid1 ! stop, + test_server:sleep(100), + ?line [{child1, Pid ,worker,[]}] = supervisor:which_children(sup_test), + case is_pid(Pid) of + true -> + ok; + false -> + ?line test_server:fail({permanent_child_not_restarted, Child1}) + end. + +%------------------------------------------------------------------------- +transient_normal(doc) -> + ["A transient child should not be restarted if it exits with " + "reason normal"]; +transient_normal(suite) -> []; +transient_normal(Config) when list(Config) -> + ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}), + Child1 = {child1, {supervisor_1, start_child, []}, transient, 1000, + worker, []}, + + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + + CPid1 ! stop, + test_server:sleep(100), + + ?line [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test). + +%------------------------------------------------------------------------- +temporary_normal(doc) -> + ["A temporary process should never be restarted"]; +temporary_normal(suite) -> []; +temporary_normal(Config) when list(Config) -> + ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}), + Child1 = {child1, {supervisor_1, start_child, []}, temporary, 1000, + worker, []}, + + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + + CPid1 ! stop, + test_server:sleep(100), + + ?line [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test). + +%------------------------------------------------------------------------- +abnormal_termination(doc) -> + ["Testes the supervisors behaviour if a child dies with reason abnormal"]; +abnormal_termination(suite) -> + [permanent_abnormal, transient_abnormal, temporary_abnormal]. + +%------------------------------------------------------------------------- +permanent_abnormal(doc) -> + ["A permanent child should always be restarted"]; +permanent_abnormal(suite) -> []; +permanent_abnormal(Config) when list(Config) -> + ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}), + Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + + CPid1 ! die, + test_server:sleep(100), + ?line [{child1, Pid ,worker,[]}] = supervisor:which_children(sup_test), + case is_pid(Pid) of + true -> + ok; + false -> + ?line test_server:fail({permanent_child_not_restarted, Child1}) + end. + +%------------------------------------------------------------------------- +transient_abnormal(doc) -> + ["A transient child should be restarted if it exits with " + "reason abnormal"]; +transient_abnormal(suite) -> []; +transient_abnormal(Config) when list(Config) -> + ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}), + Child1 = {child1, {supervisor_1, start_child, []}, transient, 1000, + worker, []}, + + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + + CPid1 ! die, + test_server:sleep(100), + + ?line [{child1, Pid ,worker,[]}] = supervisor:which_children(sup_test), + case is_pid(Pid) of + true -> + ok; + false -> + ?line test_server:fail({transient_child_not_restarted, Child1}) + end. + + +%------------------------------------------------------------------------- +temporary_abnormal(doc) -> + ["A temporary process should never be restarted"]; +temporary_abnormal(suite) -> []; +temporary_abnormal(Config) when list(Config) -> + ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}), + Child1 = {child1, {supervisor_1, start_child, []}, temporary, 1000, + worker, []}, + + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + + CPid1 ! die, + test_server:sleep(100), + + ?line [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test). + +%------------------------------------------------------------------------- +restart_one_for_one(doc) -> + ["Test that the one_for_one strategy works."]; + +restart_one_for_one(suite) -> [one_for_one, one_for_one_escalation]. + +%------------------------------------------------------------------------- +one_for_one(doc) -> + ["Test the one_for_one base case."]; +one_for_one(suite) -> []; +one_for_one(Config) when list(Config) -> + process_flag(trap_exit, true), + Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + Child2 = {child2, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + ?line {ok, Pid} = start({ok, {{one_for_one, 2, 3600}, []}}), + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + link(CPid1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2), + link(CPid2), + CPid1 ! die, + receive + {'EXIT', CPid1, died} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + end, + test_server:sleep(100), + Children = supervisor:which_children(sup_test), + if length(Children) == 2 -> + case lists:keysearch(CPid2, 2, Children) of + {value, _} -> ok; + _ -> ?line test_server:fail(bad_child) + end; + true -> ?line test_server:fail({bad_child_list, Children}) + end, + + %% Test restart frequency property + CPid2 ! die, + receive + {'EXIT', CPid2, _} -> ok + end, + test_server:sleep(100), + [{_, Pid4, _, _}|_] = supervisor:which_children(sup_test), + Pid4 ! die, + receive + {'EXIT', Pid, _} -> ok + after 3000 -> ?line test_server:fail(restart_failed) + end, + ok. +%------------------------------------------------------------------------- +one_for_one_escalation(doc) -> + ["Test restart escalation on a one_for_one supervisor."]; +one_for_one_escalation(suite) -> []; +one_for_one_escalation(Config) when list(Config) -> + process_flag(trap_exit, true), + Child1 = {child1, {supervisor_1, start_child, [error]}, + permanent, 1000, + worker, []}, + Child2 = {child2, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + ?line {ok, Pid} = start({ok, {{one_for_one, 4, 3600}, []}}), + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + link(CPid1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2), + link(CPid2), + CPid1 ! die, + receive + {'EXIT', CPid1, died} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + end, + receive + {'EXIT', Pid, _} -> ok + after + 2000 -> ?line test_server:fail(supervisor_alive) + end, + receive + {'EXIT', CPid2, _} -> ok + after + 4000 -> ?line test_server:fail(all_not_terminated) + end, + ok. +%------------------------------------------------------------------------- +restart_one_for_all(doc) -> + ["Test that the one_for_all strategy works."]; + +restart_one_for_all(suite) -> + [one_for_all, one_for_all_escalation]. + +%------------------------------------------------------------------------- +one_for_all(doc) -> + ["Test the one_for_all base case."]; +one_for_all(suite) -> []; +one_for_all(Config) when list(Config) -> + process_flag(trap_exit, true), + Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + Child2 = {child2, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + ?line {ok, Pid} = start({ok, {{one_for_all, 2, 3600}, []}}), + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + link(CPid1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2), + link(CPid2), + CPid1 ! die, + receive + {'EXIT', CPid1, died} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + end, + receive + {'EXIT', CPid2, _} -> ok + end, + test_server:sleep(100), + Children = supervisor:which_children(sup_test), + if length(Children) == 2 -> ok; + true -> ?line test_server:fail({bad_child_list, Children}) + end, + %% Test that no old children is still alive + SCh = lists:map(fun({_,P,_,_}) -> P end, Children), + case lists:member(CPid1, SCh) of + true -> ?line test_server:fail(bad_child); + false -> ok + end, + case lists:member(CPid2, SCh) of + true -> ?line test_server:fail(bad_child); + false -> ok + end, + %%% Test restart frequency property + [{_, Pid3, _, _}|_] = supervisor:which_children(sup_test), + Pid3 ! die, + test_server:sleep(100), + [{_, Pid4, _, _}|_] = supervisor:which_children(sup_test), + Pid4 ! die, + receive + {'EXIT', Pid, _} -> ok + after 3000 -> ?line test_server:fail(restart_failed) + end, + exit(Pid, shutdown). + +%------------------------------------------------------------------------- +one_for_all_escalation(doc) -> + ["Test restart escalation on a one_for_all supervisor."]; +one_for_all_escalation(suite) -> []; +one_for_all_escalation(Config) when list(Config) -> + process_flag(trap_exit, true), + Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + Child2 = {child2, {supervisor_1, start_child, [error]}, + permanent, 1000, + worker, []}, + ?line {ok, Pid} = start({ok, {{one_for_all, 4, 3600}, []}}), + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + link(CPid1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2), + link(CPid2), + CPid1 ! die, + receive + {'EXIT', CPid1, died} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + end, + receive + {'EXIT', CPid2, _} -> ok + after + 2000 -> ?line test_server:fail(all_not_terminated) + end, + receive + {'EXIT', Pid, _} -> ok + after + 4000 -> ?line test_server:fail(supervisor_alive) + end, + ok. + +%------------------------------------------------------------------------- +restart_simple_one_for_one(doc) -> + ["Test that the simple_one_for_one strategy works."]; + +restart_simple_one_for_one(suite) -> + [simple_one_for_one, simple_one_for_one_extra, + simple_one_for_one_escalation]. + +%------------------------------------------------------------------------- +simple_one_for_one(doc) -> + ["Test the simple_one_for_one base case."]; +simple_one_for_one(suite) -> []; +simple_one_for_one(Config) when list(Config) -> + process_flag(trap_exit, true), + Child = {child, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + ?line {ok, Pid} = start({ok, {{simple_one_for_one, 2, 3600}, [Child]}}), + ?line {ok, CPid1} = supervisor:start_child(sup_test, []), + link(CPid1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, []), + link(CPid2), + CPid1 ! die, + receive + {'EXIT', CPid1, died} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + end, + test_server:sleep(100), + Children = supervisor:which_children(sup_test), + if length(Children) == 2 -> + case lists:keysearch(CPid2, 2, Children) of + {value, _} -> ok; + _ -> ?line test_server:fail(bad_child) + end; + true -> ?line test_server:fail({bad_child_list, Children}) + end, + %% Test restart frequency property + CPid2 ! die, + receive + {'EXIT', CPid2, _} -> ok + end, + test_server:sleep(100), + [{_, Pid4, _, _}|_] = supervisor:which_children(sup_test), + Pid4 ! die, + receive + {'EXIT', Pid, _} -> ok + after 3000 -> ?line test_server:fail(restart_failed) + end, + ok. +%------------------------------------------------------------------------- +simple_one_for_one_extra(doc) -> + ["Tests automatic restart of children " + "who's start function return extra info."]; +simple_one_for_one_extra(suite) -> []; +simple_one_for_one_extra(Config) when list(Config) -> + process_flag(trap_exit, true), + Child = {child, {supervisor_1, start_child, [extra_info]}, + permanent, 1000, worker, []}, + ?line {ok, Pid} = start({ok, {{simple_one_for_one, 2, 3600}, [Child]}}), + ?line {ok, CPid1, extra_info} = supervisor:start_child(sup_test, []), + link(CPid1), + ?line {ok, CPid2, extra_info} = supervisor:start_child(sup_test, []), + link(CPid2), + CPid1 ! die, + receive + {'EXIT', CPid1, died} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + end, + test_server:sleep(100), + Children = supervisor:which_children(sup_test), + if length(Children) == 2 -> + case lists:keysearch(CPid2, 2, Children) of + {value, _} -> ok; + _ -> ?line test_server:fail(bad_child) + end; + true -> ?line test_server:fail({bad_child_list, Children}) + end, + CPid2 ! die, + receive + {'EXIT', CPid2, _} -> ok + end, + test_server:sleep(100), + [{_, Pid4, _, _}|_] = supervisor:which_children(sup_test), + Pid4 ! die, + receive + {'EXIT', Pid, _} -> ok + after 3000 -> ?line test_server:fail(restart_failed) + end, + ok. +%------------------------------------------------------------------------- +simple_one_for_one_escalation(doc) -> + ["Test restart escalation on a simple_one_for_one supervisor."]; +simple_one_for_one_escalation(suite) -> []; +simple_one_for_one_escalation(Config) when list(Config) -> + process_flag(trap_exit, true), + Child = {child, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + ?line {ok, Pid} = start({ok, {{simple_one_for_one, 4, 3600}, [Child]}}), + ?line {ok, CPid1} = supervisor:start_child(sup_test, [error]), + link(CPid1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, []), + link(CPid2), + CPid1 ! die, + receive + {'EXIT', CPid1, died} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + end, + receive + {'EXIT', Pid, _} -> ok + after + 2000 -> ?line test_server:fail(supervisor_alive) + end, + receive + {'EXIT', CPid2, _} -> ok + after + 2000 -> ?line test_server:fail(all_not_terminated) + end, + ok. +%------------------------------------------------------------------------- +restart_rest_for_one(doc) -> + ["Test that the rest_for_one strategy works."]; +restart_rest_for_one(suite) -> [rest_for_one, rest_for_one_escalation]. + +%------------------------------------------------------------------------- +rest_for_one(doc) -> + ["Test the rest_for_one base case."]; +rest_for_one(suite) -> []; +rest_for_one(Config) when list(Config) -> + process_flag(trap_exit, true), + Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + Child2 = {child2, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + Child3 = {child3, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + ?line {ok, Pid} = start({ok, {{rest_for_one, 2, 3600}, []}}), + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + link(CPid1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2), + link(CPid2), + ?line {ok, CPid3} = supervisor:start_child(sup_test, Child3), + link(CPid3), + CPid2 ! die, + receive + {'EXIT', CPid2, died} -> ok; + {'EXIT', CPid2, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + after 2000 -> + ?line test_server:fail(no_exit) + end, + %% Check that Cpid3 did die + receive + {'EXIT', CPid3, _} -> ok + after 2000 -> + ?line test_server:fail(no_exit) + end, + %% Check that Cpid1 didn't die + receive + {'EXIT', CPid1, _} -> + ?line test_server:fail(bad_exit) + after + 100 -> ok + end, + Children = supervisor:which_children(sup_test), + if length(Children) == 3 -> ok; + true -> ?line test_server:fail({bad_child_list, Children}) + end, + %% Test that no old children is still alive + SCh = lists:map(fun({_,P,_,_}) -> P end, Children), + case lists:member(CPid1, SCh) of + true -> ok; + false -> ?line test_server:fail(bad_child) + end, + case lists:member(CPid2, SCh) of + true -> ?line test_server:fail(bad_child); + false -> ok + end, + case lists:member(CPid3, SCh) of + true -> ?line test_server:fail(bad_child); + false -> ok + end, + + %% Test restart frequency property + [{child3, Pid3, _, _}|_] = supervisor:which_children(sup_test), + Pid3 ! die, + test_server:sleep(100), + [_,{child2, Pid4, _, _}|_] = supervisor:which_children(sup_test), + Pid4 ! die, + receive + {'EXIT', Pid, _} -> ok + after 3000 -> ?line test_server:fail(restart_failed) + end, + exit(Pid, shutdown). + +%------------------------------------------------------------------------- +rest_for_one_escalation(doc) -> + ["Test restart escalation on a rest_for_one supervisor."]; +rest_for_one_escalation(suite) -> []; +rest_for_one_escalation(Config) when list(Config) -> + process_flag(trap_exit, true), + Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000, + worker, []}, + Child2 = {child2, {supervisor_1, start_child, [error]}, + permanent, 1000, + worker, []}, + ?line {ok, Pid} = start({ok, {{rest_for_one, 4, 3600}, []}}), + ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1), + link(CPid1), + ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2), + link(CPid2), + CPid1 ! die, + receive + {'EXIT', CPid1, died} -> ok; + {'EXIT', CPid1, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + end, + receive + {'EXIT', CPid2, _} -> ok + after + 2000 -> ?line test_server:fail(not_terminated) + end, + receive + {'EXIT', Pid, _} -> ok + after + 4000 -> ?line test_server:fail(supervisor_alive) + end, + ok. + +%------------------------------------------------------------------------- +child_unlink(doc)-> ["Test that the supervisor does not hang forever if " + "the child unliks and then is terminated by the supervisor."]; +child_unlink(suite) -> []; +child_unlink(Config) when list(Config) -> + + ?line {ok, SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}), + + Child = {naughty_child, {naughty_child, + start_link, [SupPid]}, permanent, + 1000, worker, [supervisor_SUITE]}, + + ?line {ok, _ChildPid} = supervisor:start_child(sup_test, Child), + + Pid = spawn(supervisor, terminate_child, [SupPid, naughty_child]), + + SupPid ! foo, + timer:sleep(5000), + %% If the supervisor did not hang it will have got rid of the + %% foo message that we sent. + case erlang:process_info(SupPid, message_queue_len) of + {message_queue_len, 0}-> + ok; + _ -> + exit(Pid, kill), + ?line test_server:fail(supervisor_hangs) + end. +%------------------------------------------------------------------------- + +tree(doc) -> + ["Test a basic supervison tree."]; +tree(suite) -> + []; +tree(Config) when list(Config) -> + process_flag(trap_exit, true), + + Child1 = {child1, {supervisor_1, start_child, []}, + permanent, 1000, + worker, []}, + Child2 = {child2, {supervisor_1, start_child, []}, + permanent, 1000, + worker, []}, + Child3 = {child3, {supervisor_1, start_child, [error]}, + permanent, 1000, + worker, []}, + Child4 = {child4, {supervisor_1, start_child, []}, + permanent, 1000, + worker, []}, + + ChildSup1 = {supchild1, + {supervisor, start_link, + [?MODULE, {ok, {{one_for_one, 4, 3600}, [Child1, Child2]}}]}, + permanent, infinity, + supervisor, []}, + ChildSup2 = {supchild2, + {supervisor, start_link, + [?MODULE, {ok, {{one_for_one, 4, 3600}, []}}]}, + permanent, infinity, + supervisor, []}, + + %% Top supervisor + ?line {ok, Pid} = start({ok, {{one_for_all, 4, 3600}, []}}), + + %% Child supervisors + ?line {ok, Sup1} = supervisor:start_child(Pid, ChildSup1), + ?line {ok, Sup2} = supervisor:start_child(Pid, ChildSup2), + + %% Workers + + ?line [{_, CPid2, _, _},{_, CPid1, _, _}] = + supervisor:which_children(Sup1), + + %% Dynamic children + ?line {ok, CPid3} = supervisor:start_child(Sup2, Child3), + ?line {ok, CPid4} = supervisor:start_child(Sup2, Child4), + + link(Sup1), + link(Sup2), + link(CPid1), + link(CPid2), + link(CPid3), + link(CPid4), + + %% Test that the only the process that dies is restarted + CPid4 ! die, + + receive + {'EXIT', CPid4, _} -> ?line ok + after 10000 -> + ?line test_server:fail(child_was_not_killed) + end, + + test_server:sleep(100), + + ?line [{_, CPid2, _, _},{_, CPid1, _, _}] = + supervisor:which_children(Sup1), + + ?line [{_, NewCPid4, _, _},{_, CPid3, _, _}] = + supervisor:which_children(Sup2), + + link(NewCPid4), + + %% Test that supervisor tree is restarted, but not dynamic children. + CPid3 ! die, + + receive + {'EXIT', CPid3, died} -> ?line ok; + {'EXIT', CPid3, Reason} -> + ?line test_server:fail({bad_exit_reason, Reason}) + after 1000 -> + ?line test_server:fail(child_was_not_killed) + end, + + test_server:sleep(1000), + + receive + {'EXIT', NewCPid4, _} -> ?line ok + after 1000 -> + ?line test_server:fail(child_was_not_killed) + end, + + receive + {'EXIT', Sup2, _} -> ?line ok + after 1000 -> + ?line test_server:fail(child_was_not_killed) + end, + + receive + {'EXIT', CPid1, _} -> ?line ok + after 1000 -> + ?line test_server:fail(child_was_not_killed) + end, + + receive + {'EXIT', CPid2, _} -> ?line ok + after 1000 -> + ?line test_server:fail(child_was_not_killed) + end, + + receive + {'EXIT', Sup1, _} -> ?line ok + after 1000 -> + ?line test_server:fail(child_was_not_killed) + end, + + ?line [{supchild2, NewSup2, _, _},{supchild1, NewSup1, _, _}] = + supervisor:which_children(Pid), + + ?line [{child2, _, _, _},{child1, _, _, _}] = + supervisor:which_children(NewSup1), + ?line [] = supervisor:which_children(NewSup2), + + ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/sys_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/sys_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/sys_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/sys_SUITE.erl 2009-11-20 13:29:59.000000000 +0000 @@ -0,0 +1,173 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(sys_SUITE). +-export([all/1,log/1,log_to_file/1,stats/1,trace/1,suspend/1,install/1]). +-export([handle_call/3,terminate/2,init/1]). +-include("test_server.hrl"). + +-define(server,sys_SUITE_server). + + +%% Doesn't look into change_code at all +%% Doesn't address writing your own process that understands +%% system messages at all. + + +all(suite) -> [log,log_to_file,stats,trace,suspend,install]. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +log(suite) -> []; +log(Config) when is_list(Config) -> + ?line {ok,_Server} = start(), + ?line ok = sys:log(?server,true), + ?line {ok,-44} = public_call(44), + ?line ok = sys:log(?server,false), + ?line ok = sys:log(?server,print), + ?line stop(), + ok. + +log_to_file(suite) -> []; +log_to_file(Config) when is_list(Config) -> + TempName = test_server:temp_name(?config(priv_dir,Config) ++ "sys."), + ?line {ok,_Server} = start(), + ?line ok = sys:log_to_file(?server,TempName), + ?line {ok,-44} = public_call(44), + ?line ok = sys:log_to_file(?server,false), + ?line {ok,Fd} = file:open(TempName,read), + ?line Msg1 = io:get_line(Fd,''), + ?line Msg2 = io:get_line(Fd,''), + ?line file:close(Fd), + ?line lists:prefix("*DBG* sys_SUITE_server got call {req,44} from ",Msg1), + ?line lists:prefix("*DBG* sys_SUITE_server sent {ok,-44} to ",Msg2), + ?line stop(), + ok. + +stats(suite) -> []; +stats(Config) when is_list(Config) -> + ?line Self = self(), + ?line {ok,_Server} = start(), + ?line ok = sys:statistics(?server,true), + ?line {ok,-44} = public_call(44), + ?line {ok,Stats} = sys:statistics(?server,get), + ?line lists:member({messages_in,1},Stats), + ?line lists:member({messages_out,1},Stats), + ?line ok = sys:statistics(?server,false), + ?line {status,_Pid,{module,_Mod},[_PDict,running,Self,_,_]} = + sys:get_status(?server), + ?line {ok,no_statistics} = sys:statistics(?server,get), + ?line stop(), + ok. + +trace(suite) -> []; +trace(Config) when is_list(Config) -> + ?line {ok,_Server} = start(), + case os:type() of + vxworks -> + ?line test_server:sleep(20000); + _ -> + ?line test_server:sleep(2000) + end, + ?line test_server:capture_start(), + ?line sys:trace(?server,true), + ?line {ok,-44} = public_call(44), + %% ho, hum, allow for the io to reach us.. + case os:type() of + vxworks -> + ?line test_server:sleep(10000); + _ -> + ?line test_server:sleep(1000) + end, + ?line test_server:capture_stop(), + ?line [Msg1,Msg2] = test_server:capture_get(), + ?line lists:prefix("*DBG* sys_SUITE_server got call {req,44} from ",Msg1), + ?line lists:prefix("*DBG* sys_SUITE_server sent {ok,-44} to ",Msg2), + ?line stop(), + ok. + +suspend(suite) -> []; +suspend(Config) when is_list(Config) -> + ?line {ok,_Server} = start(), + ?line sys:suspend(?server,1000), + ?line {'EXIT',_} = (catch public_call(48)), + ?line {status,_,_,[_,suspended,_,_,_]} = sys:get_status(?server), + ?line sys:suspend(?server,1000), %% doing it twice is no error + ?line {'EXIT',_} = (catch public_call(48)), + ?line sys:resume(?server), + ?line {status,_,_,[_,running,_,_,_]} = sys:get_status(?server), + ?line {ok,-48} = (catch public_call(48)), + ?line sys:resume(?server), %% doing it twice is no error + ?line {ok,-48} = (catch public_call(48)), + ?line stop(), + ok. + +install(suite) -> []; +install(Config) when is_list(Config) -> + ?line {ok,_Server} = start(), + ?line Master = self(), + ?line SpyFun = + fun(func_state,Event,ProcState) -> + case Event of + {in,{'$gen_call',_From,{req,Arg}}} -> + io:format("Trigged\n"), + Master ! {spy_got,{request,Arg},ProcState}; + Other -> + io:format("Trigged other=~p\n",[Other]) + end + end, + ?line sys:install(?server,{SpyFun,func_state}), + ?line {ok,-1} = (catch public_call(1)), + ?line sys:no_debug(?server), + ?line {ok,-2} = (catch public_call(2)), + ?line sys:install(?server,{SpyFun,func_state}), + ?line sys:install(?server,{SpyFun,func_state}), + ?line {ok,-3} = (catch public_call(3)), + ?line sys:remove(?server,SpyFun), + ?line {ok,-4} = (catch public_call(4)), + ?line Msgs = test_server:messages_get(), + ?line [{spy_got,{request,1},sys_SUITE_server}, + {spy_got,{request,3},sys_SUITE_server}] = Msgs, + ?line stop(), + ok. + +%%%%%%%%%%%%%%%%%%%% +%% Dummy server + +public_call(Arg) -> + gen_server:call(?server,{req,Arg},1000). + +start() -> + gen_server:start_link({local,?server},?MODULE,[],[]). + +stop() -> + gen_server:call(?server,stop,1000). + +init([]) -> + {ok,0}. + +handle_call({req,Arg},_From,State) -> + NewState = State+1, + {reply,{ok,-Arg},NewState}; +handle_call(stop,_From,State) -> + {stop,normal,ok,State}. + +terminate(_Reason, _State) -> + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE_data/bad_checksum.tar and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE_data/bad_checksum.tar differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE_data/bad_even_shorter.tar and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE_data/bad_even_shorter.tar differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE_data/bad_octal.tar and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE_data/bad_octal.tar differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE_data/bad_too_short.tar and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE_data/bad_too_short.tar differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE_data/cooked_tar_problem.tar.gz and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE_data/cooked_tar_problem.tar.gz differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE_data/long_names.tar and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE_data/long_names.tar differ diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE_data/make_tar erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE_data/make_tar --- erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE_data/make_tar 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE_data/make_tar 1997-11-09 23:03:39.000000000 +0000 @@ -0,0 +1,21 @@ +#! /bin/sh + +# +# This script creates the test tar file in this directory. +# Not needed for running any test case, but useful if you need +# to update the test cases and create a new tar file. +# + +first=original_software/written_by/a_bunch_of_hackers/spending_all_their_nights +second=still/not_long_enough/but_soon_it_will_be +base=$first/$second + +mkdir -p $base + +mkdir $base/empty_directory + +echo "Here is the first file." > $base/first_file +echo "And here is the second file." > $base/second_file + +tar cf long_names.tar original_software +rm -rf original_software Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE_data/no_fancy_stuff.tar and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE_data/no_fancy_stuff.tar differ diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/tar_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/tar_SUITE.erl 2009-11-20 13:30:12.000000000 +0000 @@ -0,0 +1,718 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(tar_SUITE). + +-export([all/1, borderline/1, atomic/1, long_names/1, + create_long_names/1, bad_tar/1, errors/1, extract_from_binary/1, + extract_from_binary_compressed/1, + extract_from_open_file/1, symlinks/1, open_add_close/1, cooked_compressed/1, + memory/1]). + +-include("test_server.hrl"). +-include_lib("kernel/include/file.hrl"). + +all(suite) -> [borderline, atomic, long_names, create_long_names, + bad_tar, errors, + extract_from_binary, extract_from_binary_compressed, + extract_from_open_file, + symlinks, open_add_close, cooked_compressed, + memory]. + +borderline(doc) -> + ["Test creating, listing and extracting one file from an archive", + "multiple times with different file sizes. ", + "Also check that the file attributes of the extracted file has survived."]; +borderline(Config) when is_list(Config) -> + + %% Note: We cannot use absolute paths, because the pathnames will be + %% too long for the limit allowed in tar files (100 characters). + %% Therefore, strip off the current working directory from the front + %% of the private directory path. + + ?line {ok, Cwd} = file:get_cwd(), + ?line RootDir = ?config(priv_dir, Config), + ?line TempDir = remove_prefix(Cwd++"/", filename:join(RootDir, borderline)), + ?line ok = file:make_dir(TempDir), + + ?line Record = 512, + ?line Block = 20 * Record, + + ?line lists:foreach(fun(Size) -> borderline_test(Size, TempDir) end, + [0, 1, 10, 13, 127, 333, Record-1, Record, Record+1, + Block-Record-1, Block-Record, Block-Record+1, + Block-1, Block, Block+1, + Block+Record-1, Block+Record, Block+Record+1]), + + %% Clean up. + ?line delete_files([TempDir]), + + ok. + +borderline_test(Size, TempDir) -> + ?line Archive = filename:join(TempDir, "ar_"++integer_to_list(Size)++".tar"), + ?line Name = filename:join(TempDir, "file_"++integer_to_list(Size)), + ?line io:format("Testing size ~p", [Size]), + + %% Create a file and archive it. + ?line {_, _, X0} = erlang:now(), + ?line file:write_file(Name, random_byte_list(X0, Size)), + ?line ok = erl_tar:create(Archive, [Name]), + ?line ok = file:delete(Name), + + %% Verify listing and extracting. + ?line {ok, [Name]} = erl_tar:table(Archive), + ?line ok = erl_tar:extract(Archive, [verbose]), + + %% Verify contents of extracted file. + ?line {ok, Bin} = file:read_file(Name), + ?line true = match_byte_list(X0, binary_to_list(Bin)), + + %% Verify that Unix tar can read it. + ?line tar_tf(Archive, Name), + + ok. + +tar_tf(Archive, Name) -> + case os:type() of + {unix, _} -> + tar_tf1(Archive, Name); + _ -> + ok + end. + +tar_tf1(Archive, Name) -> + ?line Expect = Name ++ "\n", + ?line cmd_expect("tar tf " ++ Archive, Expect). + +%% We can't use os:cmd/1, because Unix 'tar tf Name' on Solaris never +%% terminates when given an archive of a size it doesn't like. + +cmd_expect(Cmd, Expect) -> + ?line Port = open_port({spawn, make_cmd(Cmd)}, [stream, in, eof]), + ?line get_data(Port, Expect). + +get_data(Port, Expect) -> + receive + {Port, {data, Bytes}} -> + ?line get_data(Port, match_output(Bytes, Expect, Port)); + {Port, eof} -> + Port ! {self(), close}, + receive + {Port, closed} -> + true + end, + receive + {'EXIT', Port, _} -> + ok + after 1 -> % force context switch + ok + end, + ?line match_output(eof, Expect, Port) + end. + +match_output([C|Output], [C|Expect], Port) -> + ?line match_output(Output, Expect, Port); +match_output([_|_], [_|_], Port) -> + ?line kill_port_and_fail(Port, badmatch); +match_output([X|Output], [], Port) -> + ?line kill_port_and_fail(Port, {too_much_data, [X|Output]}); +match_output([], Expect, _Port) -> + Expect; +match_output(eof, [], _Port) -> + []; +match_output(eof, _Expect, Port) -> + ?line kill_port_and_fail(Port, unexpected_end_of_input). + +kill_port_and_fail(Port, Reason) -> + unlink(Port), + exit(Port, die), + test_server:fail(Reason). + +make_cmd(Cmd) -> + case os:type() of + {win32, _} -> lists:concat(["cmd /c", Cmd]); + {unix, _} -> lists:concat(["sh -c '", Cmd, "'"]) + end. + +%% Verifies a random byte list. + +match_byte_list(X0, [Byte|Rest]) -> + X = next_random(X0), + case (X bsr 26) band 16#ff of + Byte -> match_byte_list(X, Rest); + _ -> false + end; +match_byte_list(_, []) -> + true. + +%% Generates a random byte list. + +random_byte_list(X0, Count) -> + random_byte_list(X0, Count, []). + +random_byte_list(X0, Count, Result) when Count > 0-> + X = next_random(X0), + random_byte_list(X, Count-1, [(X bsr 26) band 16#ff|Result]); +random_byte_list(_X, 0, Result) -> + lists:reverse(Result). + +%% This RNG is from line 21 on page 102 in Knuth: The Art of Computer Programming, +%% Volume II, Seminumerical Algorithms. + +next_random(X) -> + (X*17059465+1) band 16#fffffffff. + +atomic(doc) -> + ["Test the 'atomic' operations: create/extract/table, on compressed " + "and uncompressed archives." + "Also test the 'cooked' option."]; +atomic(suite) -> []; +atomic(Config) when list(Config) -> + ?line ok = file:set_cwd(?config(priv_dir, Config)), + ?line DataFiles = data_files(), + ?line Names = [Name || {Name,_,_} <- DataFiles], + io:format("Names: ~p", [Names]), + + %% Create an uncompressed archive. The compressed flag should still be + %% allowed when listing contents or extracting. + + ?line Tar1 = "uncompressed.tar", + ?line erl_tar:create(Tar1, Names, []), + ?line {ok, Names} = erl_tar:table(Tar1, []), + ?line {ok, Names} = erl_tar:table(Tar1, [compressed]), + ?line {ok, Names} = erl_tar:table(Tar1, [cooked]), + ?line {ok, Names} = erl_tar:table(Tar1, [compressed,cooked]), + + %% Create a compressed archive. + + ?line Tar2 = "compressed.tar", + ?line erl_tar:create(Tar2, Names, [compressed]), + ?line {ok, Names} = erl_tar:table(Tar2, [compressed]), + ?line {error, Reason} = erl_tar:table(Tar2, []), + ?line {ok, Names} = erl_tar:table(Tar2, [compressed,cooked]), + ?line {error, Reason} = erl_tar:table(Tar2, [cooked]), + ?line ok = io:format("No compressed option: ~p, ~s", + [Reason, erl_tar:format_error(Reason)]), + + %% Same test again, but this time created with 'cooked' + + ?line Tar3 = "uncompressed_cooked.tar", + ?line erl_tar:create(Tar3, Names, [cooked]), + ?line {ok, Names} = erl_tar:table(Tar3, []), + ?line {ok, Names} = erl_tar:table(Tar3, [compressed]), + ?line {ok, Names} = erl_tar:table(Tar3, [cooked]), + ?line {ok, Names} = erl_tar:table(Tar3, [compressed,cooked]), + + ?line Tar4 = "compressed_cooked.tar", + ?line erl_tar:create(Tar4, Names, [compressed,cooked]), + ?line {ok, Names} = erl_tar:table(Tar4, [compressed]), + ?line {error, Reason} = erl_tar:table(Tar4, []), + ?line {ok, Names} = erl_tar:table(Tar4, [compressed,cooked]), + ?line {error, Reason} = erl_tar:table(Tar4, [cooked]), + ?line ok = io:format("No compressed option: ~p, ~s", + [Reason, erl_tar:format_error(Reason)]), + + %% Clean up. + ?line delete_files([Tar1,Tar2,Tar3,Tar4|Names]), + + ok. + +%% Returns a sequence of characters. + +char_seq(N, First) -> + char_seq(N, First, []). + +char_seq(0, _, Result) -> + Result; +char_seq(N, C, Result) when C < 127 -> + char_seq(N-1, C+1, [C|Result]); +char_seq(N, _, Result) -> + char_seq(N, $!, Result). + +data_files() -> + Files = [{"first_file", 1555, $a}, + {"small_file", 7, $d}, + {"big_file", 23875, $e}, + {"last_file", 7500, $g}], + create_files(Files), + Files. + +create_files([{Name, Size, First}|Rest]) -> + ok = file:write_file(Name, char_seq(Size, First)), + create_files(Rest); +create_files([]) -> + ok. + +long_names(doc) -> + ["Test to extract an Unix tar file containing filenames longer than 100 ", + "characters and empty directories."]; +long_names(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line Long = filename:join(DataDir, "long_names.tar"), + + %% Try table/2 and extract/2. + ?line case erl_tar:table(Long, [verbose]) of + {ok,List} when is_list(List) -> + ?line io:format("~p\n", [List]) + end, + + + %% To avoid getting too long paths for Windows to handle, extract into + %% the current directory (which is the test_server directory). Its path + %% is quite a bit shorter than the path to priv_dir. + ?line {ok,Cwd} = file:get_cwd(), + ?line ok = erl_tar:extract(Long), + ?line Base = filename:join([Cwd, "original_software", "written_by", + "a_bunch_of_hackers", + "spending_all_their_nights", + "still", "not_long_enough", + "but_soon_it_will_be"]), + + %% Verify that the empty directory was created. + ?line EmptyDir = filename:join(Base, "empty_directory"), + ?line {ok, #file_info{type=directory}} = file:read_file_info(EmptyDir), + + %% Verify that the files were created. + ?line {ok,First} = file:read_file(filename:join(Base, "first_file")), + ?line {ok,Second} = file:read_file(filename:join(Base, "second_file")), + ?line "Here"++_ = binary_to_list(First), + ?line "And"++_ = binary_to_list(Second), + + %% Clean up. + ?line delete_files([filename:join(Cwd, "original_software"),EmptyDir]), + + ok. + +create_long_names(doc) -> + ["Creates a tar file from a deep directory structure (filenames are ", + "longer than 100 characters)."]; +create_long_names(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line ok = file:set_cwd(PrivDir), + Dirs = [aslfjkshjkhliuf, + asdhjfehnbfsky, + sahajfskdfhsz, + asldfkdlfy4y8rchg, + f7nafhjgffagkhsfkhsjk, + dfjasldkfjsdkfjashbv], + + ?line DeepDir = make_dirs(Dirs, []), + ?line AFile = filename:join(DeepDir, "a_file"), + ?line Hello = "hello, world\n", + ?line ok = file:write_file(AFile, Hello), + ?line TarName = filename:join(PrivDir, "my_tar_with_long_names.tar"), + ?line ok = erl_tar:create(TarName, [AFile]), + + %% Print contents. + ?line ok = erl_tar:tt(TarName), + + %% Extract and verify. + ?line ExtractDir = "extract_dir", + ?line ok = file:make_dir(ExtractDir), + ?line ok = erl_tar:extract(TarName, [{cwd,ExtractDir}]), + ?line {ok, Bin} = file:read_file(filename:join(ExtractDir, AFile)), + ?line Hello = binary_to_list(Bin), + + %% Clean up. + ?line delete_files([ExtractDir,TarName,hd(Dirs)]), + + ok. + +make_dirs([Dir|Rest], []) -> + ?line ok = file:make_dir(Dir), + ?line make_dirs(Rest, Dir); +make_dirs([Dir|Rest], Parent) -> + ?line Name = filename:join(Parent, Dir), + ?line ok = file:make_dir(Name), + ?line make_dirs(Rest, Name); +make_dirs([], Dir) -> + Dir. + +bad_tar(doc) -> + ["Try erl_tar:table/2 and erl_tar:extract/2 on some corrupted tar files."]; +bad_tar(Config) when is_list(Config) -> + ?line try_bad("bad_checksum", bad_header, Config), + ?line try_bad("bad_octal", bad_header, Config), + ?line try_bad("bad_too_short", eof, Config), + ?line try_bad("bad_even_shorter", eof, Config), + ok. + +try_bad(Name0, Reason, Config) -> + %% Intentionally no ?line macros here. + + DataDir = ?config(data_dir, Config), + PrivDir = ?config(priv_dir, Config), + Name = Name0 ++ ".tar", + io:format("~nTrying ~s", [Name]), + Full = filename:join(DataDir, Name), + Opts = [verbose, {cwd, PrivDir}], + Expected = {error, Reason}, + case {erl_tar:table(Full, Opts), erl_tar:extract(Full, Opts)} of + {Expected, Expected} -> + io:format("Result: ~p", [Expected]), + case catch erl_tar:format_error(Reason) of + {'EXIT', CrashReason} -> + test_server:fail({format_error, crashed, CrashReason}); + String when list(String) -> + io:format("format_error(~p) -> ~s", [Reason, String]); + Other -> + test_server:fail({format_error, returned, Other}) + end; + {Other1, Other2} -> + io:format("table/2 returned ~p", [Other1]), + io:format("extract/2 returned ~p", [Other2]), + test_server:fail({bad_return_value, Other1, Other2}) + end. + +errors(doc) -> + ["Tests that some common errors return correct error codes ", + "and that format_error/1 handles them correctly."]; +errors(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + + %% Give the tar file the same name as a directory. + ?line BadTar = filename:join(PrivDir, "bad_tarfile.tar"), + ?line ok = file:make_dir(BadTar), + ?line try_error(erl_tar, create, [BadTar, []], {BadTar, eisdir}), + + %% Try including non-existent files in the tar file. + ?line NonExistent = "non_existent_file", + ?line GoodTar = filename:join(PrivDir, "a_good_tarfile.tar"), + ?line try_error(erl_tar, create, [GoodTar, [NonExistent]], + {NonExistent, enoent}), + + %% Clean up. + ?line delete_files([GoodTar,BadTar]), + + ok. + +try_error(M, F, A, Error) -> + io:format("Trying ~p:~p(~p)", [M, F, A]), + case catch apply(M, F, A) of + {'EXIT', Reason} -> + exit(Reason); + ok -> + test_server:fail(unexpected_success); + {error, Error} -> + case catch erl_tar:format_error(Error) of + {'EXIT', FReason} -> + test_server:fail({format_error, crashed, FReason}); + String when list(String) -> + io:format("format_error(~p) -> ~s", [Error, String]); + Other -> + test_server:fail({format_error, returned, Other}) + end; + Other -> + test_server:fail({expected, {error, Error}, actual, Other}) + end. + +%% remove_prefix(Prefix, List) -> ListWithoutPrefix. + +remove_prefix([C|Rest1], [C|Rest2]) -> + remove_prefix(Rest1, Rest2); +remove_prefix(_, Result) -> + Result. + +extract_from_binary(doc) -> + "Test extracting a tar archive from a binary."; +extract_from_binary(Config) when list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line PrivDir = ?config(priv_dir, Config), + ?line Long = filename:join(DataDir, "no_fancy_stuff.tar"), + ?line ExtractDir = filename:join(PrivDir, "extract_from_binary"), + ?line ok = file:make_dir(ExtractDir), + + %% Read a tar file into a binary and extract from the binary. + ?line {ok, Bin} = file:read_file(Long), + ?line ok = erl_tar:extract({binary, Bin}, [{cwd,ExtractDir}]), + + %% Verify. + Dir = filename:join(ExtractDir, "no_fancy_stuff"), + ?line true = filelib:is_dir(Dir), + ?line true = filelib:is_file(filename:join(Dir, "a_dir_list")), + ?line true = filelib:is_file(filename:join(Dir, "EPLICENCE")), + + %% Clean up. + ?line delete_files([ExtractDir]), + + ok. + +extract_from_binary_compressed(Config) when is_list(Config) -> + %% Test extracting a compressed tar archive from a binary. + ?line DataDir = ?config(data_dir, Config), + ?line PrivDir = ?config(priv_dir, Config), + ?line Name = filename:join(DataDir, "cooked_tar_problem.tar.gz"), + ?line ExtractDir = filename:join(PrivDir, "extract_from_binary_compressed"), + ?line ok = file:make_dir(ExtractDir), + ?line {ok,Bin} = file:read_file(Name), + + %% Try taking contents. + ?line {ok,Files} = erl_tar:table({binary,Bin}, [compressed]), + ?line io:format("~p\n", [Files]), + ?line 19 = length(Files), + + %% Trying extracting from a binary. + ?line ok = erl_tar:extract({binary,Bin}, [compressed,{cwd,ExtractDir}]), + ?line {ok,List} = file:list_dir(filename:join(ExtractDir, ddll_SUITE_data)), + ?line io:format("~p\n", [List]), + ?line 19 = length(List), + + %% Clean up while at the same time testing that all file + %% were extracted as expected. + lists:foreach(fun(N) -> + File = filename:join(ExtractDir, N), + io:format("Deleting: ~p\n", [File]), + ?line ok = file:delete(File) + end, Files), + + %% Clean up the rest. + ?line delete_files([ExtractDir]), + + ok. + +extract_from_open_file(doc) -> + "Test extracting a tar archive from an open file."; +extract_from_open_file(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + ?line PrivDir = ?config(priv_dir, Config), + ?line Long = filename:join(DataDir, "no_fancy_stuff.tar"), + ?line ExtractDir = filename:join(PrivDir, "extract_from_open_file"), + ?line ok = file:make_dir(ExtractDir), + + ?line {ok, File} = file:open(Long, [read]), + ?line ok = erl_tar:extract({file, File}, [{cwd,ExtractDir}]), + + %% Verify. + Dir = filename:join(ExtractDir, "no_fancy_stuff"), + ?line true = filelib:is_dir(Dir), + ?line true = filelib:is_file(filename:join(Dir, "a_dir_list")), + ?line true = filelib:is_file(filename:join(Dir, "EPLICENCE")), + + %% Close open file. + ?line ok = file:close(File), + + %% Clean up. + ?line delete_files([ExtractDir]), + + ok. + +symlinks(doc) -> + "Test that archives containing symlinks can be created and extracted."; +symlinks(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line Dir = filename:join(PrivDir, "symlinks"), + ?line ok = file:make_dir(Dir), + ?line ABadSymlink = filename:join(Dir, "bad_symlink"), + ?line PointsTo = "/a/definitely/non_existing/path", + ?line Res = case file:make_symlink("/a/definitely/non_existing/path", ABadSymlink) of + {error, enotsup} -> + {skip, "Symbolic links not supported on this platform"}; + ok -> + symlinks(Dir, "bad_symlink", PointsTo), + long_symlink(Dir) + end, + + %% Clean up. + ?line delete_files([Dir]), + Res. + +symlinks(Dir, BadSymlink, PointsTo) -> + ?line Tar = filename:join(Dir, "symlink.tar"), + ?line DerefTar = filename:join(Dir, "dereference.tar"), + + %% Create the archive. + + ?line ok = file:set_cwd(Dir), + ?line GoodSymlink = "good_symlink", + ?line AFile = "a_good_file", + ?line ALine = "A line of text for a file.", + ?line ok = file:write_file(AFile, ALine), + ?line ok = file:make_symlink(AFile, GoodSymlink), + ?line ok = erl_tar:create(Tar, [BadSymlink, GoodSymlink, AFile], [verbose]), + + %% List contents of tar file. + + ?line ok = erl_tar:tt(Tar), + + %% Also create another archive with the dereference flag. + + ?line ok = erl_tar:create(DerefTar, [AFile, GoodSymlink], [dereference, verbose]), + + %% Extract files to a new directory. + + ?line NewDir = filename:join(Dir, "extracted"), + ?line ok = file:make_dir(NewDir), + ?line ok = erl_tar:extract(Tar, [{cwd, NewDir}, verbose]), + + %% Verify that the files are there. + + ?line ok = file:set_cwd(NewDir), + ?line {ok, #file_info{type=symlink}} = file:read_link_info(BadSymlink), + ?line {ok, PointsTo} = file:read_link(BadSymlink), + ?line {ok, #file_info{type=symlink}} = file:read_link_info(GoodSymlink), + ?line {ok, AFile} = file:read_link(GoodSymlink), + ?line Expected = list_to_binary(ALine), + ?line {ok, Expected} = file:read_file(GoodSymlink), + + %% Extract the "dereferenced archive" to a new directory. + + ?line NewDirDeref = filename:join(Dir, "extracted_deref"), + ?line ok = file:make_dir(NewDirDeref), + ?line ok = erl_tar:extract(DerefTar, [{cwd, NewDirDeref}, verbose]), + + %% Verify that the files are there. + + ?line ok = file:set_cwd(NewDirDeref), + ?line {ok, #file_info{type=regular}} = file:read_link_info(GoodSymlink), + ?line {ok, #file_info{type=regular}} = file:read_link_info(AFile), + ?line {ok, Expected} = file:read_file(GoodSymlink), + ?line {ok, Expected} = file:read_file(AFile), + + ok. + +long_symlink(Dir) -> + ?line Tar = filename:join(Dir, "long_symlink.tar"), + ?line ok = file:set_cwd(Dir), + + ?line AFile = "long_symlink", + ?line FarTooLong = "/tmp/aarrghh/this/path/is/far/longer/than/one/hundred/characters/which/is/the/maximum/number/of/characters/allowed", + ?line ok = file:make_symlink(FarTooLong, AFile), + ?line {error,Error} = erl_tar:create(Tar, [AFile], [verbose]), + ?line io:format("Error: ~s\n", [erl_tar:format_error(Error)]), + ?line {FarTooLong,symbolic_link_too_long} = Error, + ok. + +open_add_close(Config) when is_list(Config) -> + ?line PrivDir = ?config(priv_dir, Config), + ?line ok = file:set_cwd(PrivDir), + ?line Dir = filename:join(PrivDir, "open_add_close"), + ?line ok = file:make_dir(Dir), + + ?line [{FileOne,_,_},{FileTwo,_,_},{FileThree,_,_}] = oac_files(), + ?line ADir = "empty_dir", + ?line AnotherDir = "another_dir", + ?line SomeContent = filename:join(AnotherDir, "some_content"), + ?line ok = file:make_dir(ADir), + ?line ok = file:make_dir(AnotherDir), + ?line ok = file:make_dir(SomeContent), + + ?line TarOne = filename:join(Dir, "archive1.tar"), + ?line {ok,AD} = erl_tar:open(TarOne, [write]), + ?line ok = erl_tar:add(AD, FileOne, []), + ?line ok = erl_tar:add(AD, FileTwo, "second file", []), + ?line ok = erl_tar:add(AD, FileThree, [verbose]), + ?line ok = erl_tar:add(AD, ADir, [verbose]), + ?line ok = erl_tar:add(AD, AnotherDir, [verbose]), + ?line ok = erl_tar:close(AD), + + ?line ok = erl_tar:t(TarOne), + ?line ok = erl_tar:tt(TarOne), + + ?line {ok,[FileOne,"second file",FileThree,ADir,SomeContent]} = erl_tar:table(TarOne), + + ?line delete_files(["oac_file","oac_small","oac_big",Dir,AnotherDir,ADir]), + + ok. + +oac_files() -> + Files = [{"oac_file", 1459, $x}, + {"oac_small", 99, $w}, + {"oac_big", 33896, $A}], + create_files(Files), + Files. + +cooked_compressed(Config) when is_list(Config) -> + %% Test that a compressed archive can be read in cooked mode. + ?line DataDir = ?config(data_dir, Config), + ?line PrivDir = ?config(priv_dir, Config), + ?line Name = filename:join(DataDir, "cooked_tar_problem.tar.gz"), + + %% Try table/2 and extract/2. + ?line {ok,List} = erl_tar:table(Name, [cooked,compressed]), + ?line io:format("~p\n", [List]), + ?line 19 = length(List), + ?line ok = erl_tar:extract(Name, [cooked,compressed,{cwd,PrivDir}]), + + %% Clean up while at the same time testing that all file + %% were extracted as expected. + lists:foreach(fun(N) -> + File = filename:join(PrivDir, N), + io:format("Deleting: ~p\n", [File]), + ?line ok = file:delete(File) + end, List), + + %% Clean up. + ?line delete_files([filename:join(PrivDir, ddll_SUITE_data)]), + ok. + +memory(doc) -> + ["Test that an archive can be created directly from binaries and " + "that an archive can be extracted into binaries."]; +memory(Config) when is_list(Config) -> + ?line DataDir = ?config(data_dir, Config), + + ?line FileBins = [{"bar/fum", <<"BARFUM">>},{"foo", <<"FOO">>}], + ?line Name1 = filename:join(DataDir, "memory.tar"), + ?line ok = erl_tar:create(Name1, FileBins, [write,verbose]), + ?line {ok,Extracted1} = erl_tar:extract(Name1, [memory,verbose]), + ?line FileBins1 = lists:sort(Extracted1), + + ?line io:format("FileBins: ~p\n", [FileBins]), + ?line io:format("FileBins1: ~p\n", [FileBins1]), + ?line FileBins = FileBins1, + + ?line Name2 = filename:join(DataDir, "memory2.tar"), + ?line {ok,Fd} = erl_tar:open(Name2, [write]), + ?line [ok,ok] = [erl_tar:add(Fd, B, N, [write,verbose]) || {N,B} <- FileBins], + ?line ok = erl_tar:close(Fd), + ?line {ok,Extracted2} = erl_tar:extract(Name2, [memory,verbose]), + ?line FileBins2 = lists:sort(Extracted2), + ?line io:format("FileBins2: ~p\n", [FileBins2]), + ?line FileBins = FileBins2, + + %% Clean up. + ?line ok = delete_files([Name1,Name2]), + ok. + +%% Delete the given list of files. +delete_files([]) -> ok; +delete_files([Item|Rest]) -> + case file:delete(Item) of + ok -> + delete_files(Rest); + {error,eperm} -> + file:change_mode(Item, 8#777), + delete_files(filelib:wildcard(filename:join(Item, "*"))), + file:del_dir(Item), + ok; + {error,eacces} -> + %% We'll see about that! + file:change_mode(Item, 8#777), + case file:delete(Item) of + ok -> ok; + {error,_} -> + erlang:yield(), + file:change_mode(Item, 8#777), + file:delete(Item), + ok + end; + {error,_} -> ok + end, + delete_files(Rest). + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/timer_simple_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/timer_simple_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/timer_simple_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/timer_simple_SUITE.erl 2009-11-20 13:30:24.000000000 +0000 @@ -0,0 +1,551 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%% Purpose : Test the timer module a simpler/faster test than timer_SUITE + +-module(timer_simple_SUITE). + +%% external +-export([all/1, + init_per_testcase/2, + apply_after/1, + send_after1/1, + send_after2/1, + send_after3/1, + exit_after1/1, + exit_after2/1, + kill_after1/1, + kill_after2/1, + apply_interval/1, + send_interval1/1, + send_interval2/1, + send_interval3/1, + send_interval4/1, + cancel1/1, + cancel2/1, + tc/1, + unique_refs/1, + timer_perf/1]). + +%% internal +-export([forever/0, + do_nrev/2, + send/2, + timer/4, + timer/5]). + +-include("test_server.hrl"). + +-define(MAXREF, (1 bsl 18)). +-define(REFMARG, 30). + +all(doc) -> "Test of the timer module."; +all(suite) -> + [apply_after, + send_after1, + send_after2, + send_after3, + exit_after1, + exit_after2, + kill_after1, + kill_after2, + apply_interval, + send_interval1, + send_interval2, + send_interval3, + send_interval4, + cancel1, + cancel2, + tc, + unique_refs, + timer_perf]. + +init_per_testcase(_, Config) when is_list(Config) -> + timer:start(), + Config. + +%% Testing timer interface!! + +apply_after(doc) -> "Test of apply_after, with sending of message."; +apply_after(suite) -> []; +apply_after(Config) when is_list(Config) -> + ?line timer:apply_after(500, ?MODULE, send, [self(), ok_apply]), + ?line ok = get_mess(1000, ok_apply). + +send_after1(doc) -> "Test of send_after with time = 0."; +send_after1(suite) -> []; +send_after1(Config) when is_list(Config) -> + ?line timer:send_after(0, ok_send1), + ?line ok = get_mess(1000, ok_send1). + +send_after2(doc) -> "Test of send_after with time = 500."; +send_after2(suite) -> []; +send_after2(Config) when is_list(Config) -> + ?line timer:send_after(500, self(), ok_send2), + ?line ok = get_mess(2000, ok_send2). + +send_after3(doc) -> "Test of send_after with time = 500, with receiver " + "a registered process. [OTP-2735]"; +send_after3(suite) -> []; +send_after3(Config) when is_list(Config) -> + ?line Name = list_to_atom(pid_to_list(self())), + ?line register(Name, self()), + ?line timer:send_after(500, Name, ok_send3), + ?line ok = get_mess(2000, ok_send3), + ?line unregister(Name). + +exit_after1(doc) -> "Test of exit_after with time = 1000."; +exit_after1(suite) -> []; +exit_after1(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Pid = spawn_link(?MODULE, forever, []), + ?line timer:exit_after(1000, Pid, exit_test1), + ?line ok = get_mess(5000, {'EXIT', Pid, exit_test1}). + +exit_after2(doc) -> "Test of exit_after with time = 1000. The process to " + "exit is the name of a registered process. " + "[OTP-2735]"; +exit_after2(suite) -> []; +exit_after2(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Pid = spawn_link(?MODULE, forever, []), + ?line Name = list_to_atom(pid_to_list(Pid)), + ?line register(Name, Pid), + ?line timer:exit_after(1000, Name, exit_test2), + ?line ok = get_mess(2000, {'EXIT', Pid, exit_test2}). + +kill_after1(doc) -> "Test of kill_after with time = 1000."; +kill_after1(suite) -> []; +kill_after1(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Pid = spawn_link(?MODULE, forever, []), + ?line timer:kill_after(1000, Pid), + ?line ok = get_mess(2000, {'EXIT', Pid, killed}). + +kill_after2(doc) -> "Test of kill_after with time = 1000. The process to " + "exit is the name of a registered process. " + "[OTP-2735]"; +kill_after2(suite) -> []; +kill_after2(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Pid = spawn_link(?MODULE, forever, []), + ?line Name = list_to_atom(pid_to_list(Pid)), + ?line register(Name, Pid), + ?line timer:kill_after(1000, Name), + ?line ok = get_mess(2000, {'EXIT', Pid, killed}). + +apply_interval(doc) -> "Test of apply_interval by sending messages. Receive " + "3 messages, cancel the timer, and check that we do " + "not get any more messages."; +apply_interval(suite) -> []; +apply_interval(Config) when is_list(Config) -> + ?line {ok, Ref} = timer:apply_interval(1000, ?MODULE, send, + [self(), apply_int]), + ?line ok = get_mess(1500, apply_int, 3), + ?line timer:cancel(Ref), + ?line nor = get_mess(1000, apply_int). + +send_interval1(doc) -> "Test of send_interval/2. Receive 5 messages, cancel " + "the timer, and check that we do not get any more " + "messages."; +send_interval1(suite) -> []; +send_interval1(Config) when is_list(Config) -> + {ok, Ref} = timer:send_interval(1000, send_int), + ?line ok = get_mess(1500, send_int, 5), + timer:cancel(Ref), + ?line nor = get_mess(1000, send_int). % We should receive only five + +send_interval2(doc) -> "Test of send_interval/3. Receive 2 messages, cancel " + "the timer, and check that we do not get any more " + "messages."; +send_interval2(suite) -> []; +send_interval2(Config) when is_list(Config) -> + {ok, Ref} = timer:send_interval(1000, self(), send_int2), + ?line ok = get_mess(1500, send_int2, 2), + timer:cancel(Ref), + ?line nor = get_mess(1000, send_int2). % We should receive only two + +send_interval3(doc) -> "Test of send_interval/3. Receive 2 messages, cancel " + "the timer, and check that we do not get any more " + "messages. The receiver is the name of a registered " + "process. [OTP-2735]"; +send_interval3(suite) -> []; +send_interval3(Config) when is_list(Config) -> + ?line process_flag(trap_exit, true), + ?line Name = list_to_atom(pid_to_list(self())), + ?line register(Name, self()), + ?line {ok, Ref} = timer:send_interval(1000, Name, send_int3), + ?line ok = get_mess(1500, send_int3, 2), + timer:cancel(Ref), + ?line nor = get_mess(1000, send_int3), % We should receive only two + ?line unregister(Name). + +send_interval4(doc) -> "Test that send interval stops sending msg when the " + "receiving process terminates."; +send_interval4(suite) -> []; +send_interval4(Config) when is_list(Config) -> + ?line timer:send_interval(500, one_time_only), + receive + one_time_only -> ok + end, + ?line timer_server ! {'EXIT', self(), normal}, % Should remove the timer + ?line timer:send_after(600, send_intv_ok), + ?line send_intv_ok = receive + Msg -> Msg + end. + +cancel1(doc) -> "Test that we can cancel a timer."; +cancel1(suite) -> []; +cancel1(Config) when is_list(Config) -> + ?line {ok, Ref} = timer:send_after(1000, this_should_be_canceled), + ?line timer:cancel(Ref), + ?line nor = get_mess(2000, this_should_be_canceled). % We should rec 0 msgs + +cancel2(doc) -> "Test cancel/1 with bad argument."; +cancel2(suite) -> []; +cancel2(Config) when is_list(Config) -> + ?line {error, badarg} = timer:cancel(no_reference). + +tc(doc) -> "Test sleep/1 and tc/3."; +tc(suite) -> []; +tc(Config) when is_list(Config) -> + % This should both sleep and tc + ?line {Res, ok} = timer:tc(timer, sleep, [500]), + ?line ok = if + Res < 500*1000 -> {too_early, Res}; % Too early + Res > 800*1000 -> {too_late, Res}; % Too much time + true -> ok + end, + + ?line Sec = timer:seconds(4), + ?line Min = timer:minutes(4), + ?line Hour = timer:hours(4), + ?line MyRes = 4*1000 + 4*60*1000 + 4*60*60*1000, + ?line if MyRes == Sec + Min + Hour -> ok end, + ?line TimerRes = timer:hms(4,4,4), + ?line if MyRes == TimerRes -> ok end, + ok. + +unique_refs(doc) -> + "Tests that cancellations of one-shot timers do not accidentally " + "cancel interval timers [OTP-2771]."; +unique_refs(suite) -> + []; +unique_refs(Config) when is_list(Config) -> + ?line ITimers = repeat_send_interval(10), % 10 interval timers + ?line eat_refs(?MAXREF - ?REFMARG), + ?line set_and_cancel_one_shots(?REFMARG), + ?line NumLeft = num_timers(), + ?line io:format("~w timers left, should be 10\n", [NumLeft]), + ?line cancel(ITimers), + ?line receive_nisse(), + ?line 10 = NumLeft. + + +repeat_send_interval(0) -> + []; +repeat_send_interval(M) -> + ?line {ok, Ref} = timer:send_interval(6000,self(), nisse), + ?line [Ref| repeat_send_interval(M - 1)]. + +eat_refs(0) -> + 0; +eat_refs(N) -> + _ = make_ref(), + eat_refs(N-1). + +set_and_cancel_one_shots(0) -> + 0; +set_and_cancel_one_shots(N) -> + {ok, Ref} = timer:send_after(7000, self(), kalle), + %% Cancel twice + timer:cancel(Ref), + timer:cancel(Ref), + set_and_cancel_one_shots(N-1). + +cancel([T| Ts]) -> + ?line timer:cancel(T), + ?line cancel(Ts); +cancel([]) -> + ok. + +num_timers() -> + {{_, TotalTimers},{_, _IntervalTimers}} = timer:get_status(), + TotalTimers. + +receive_nisse() -> + receive + nisse -> + receive_nisse() + after 0 -> + ok + end. + + +get_mess(Time, Mess) -> get_mess(Time, Mess, 1). +get_mess(_, _, 0) -> ok; % Received +get_mess(Time, Mess, N) -> + receive + Mess -> get_mess(Time, Mess, N-1) + after Time + -> nor % Not Received + end. + +forever() -> + timer:sleep(1000), + forever(). + + +% +% Testing for performance (on different implementations) of timers +% + +timer_perf(suite) -> []; +timer_perf(Config) when is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(10)), + Res = performance(timer), + ?t:timetrap_cancel(Dog), + Res. + +performance(Mod) -> + process_flag(trap_exit, true), + {Y,Mo,D} = date(), + {H,M,S} = time(), + io:format("Testing module '~p' Date: ~w/~w/~w ~w:~w:~w~n", + [Mod,Y,Mo,D,H,M,S]), + Result = big_test(Mod), + report_result(Result). + +big_test(M) -> + Load_Pids = start_nrev(20, M), % Increase if more load wanted :) + + apply(M, sleep, [9000]), + LPids = spawn_timers(5, M, 10000, 5), + + apply(M, sleep, [4000]), + MPids = spawn_timers(10, M, 1000, 6), + + apply(M, sleep, [3500]), + SPids = spawn_timers(15, M, 100, 3), + + Res = wait(SPids ++ MPids ++ LPids, [], 0, M), + + lists:foreach(fun(Pid) -> exit(Pid, kill) end, Load_Pids), + Res. + +wait([], Res, N, _) -> + {Res, N}; +wait(Pids, ResList, N, M) -> + receive + {Pid, ok, Res, T} -> + wait(lists:delete(Pid, Pids), [{T, Res} | ResList], N, M); + {Pid, Error}-> + ?line test_server:fail(Error), + wait(lists:delete(Pid, Pids), ResList, N+1, M); + {'EXIT', Pid, normal} -> + wait(lists:delete(Pid, Pids), ResList, N, M); + {'EXIT', Pid, Reason} -> + ?line test_server:fail({Pid,Reason}) + end. + +spawn_timers(0, _, _, _) -> + []; +spawn_timers(N, M, T, NumIter) -> + apply(M, sleep, [120*N]), + Pid1 = spawn_link(?MODULE, timer, [apply, M, T, self()]), + Pid2 = spawn_link(?MODULE, timer, [interval, M, T, self(), NumIter]), + [Pid1, Pid2 | spawn_timers(N-1, M, T, NumIter)]. + +timer(apply, Mod, T, Pid) -> + Before = system_time(), + {ok, Ref} = apply(Mod, apply_after, [T, ?MODULE, send, [self(), done]]), + receive + done -> + After = system_time(), + Pid ! {self(), ok, (After-Before) div 1000, T} + after T*3 + 300 -> % Watch dog + io:format("WARNING TIMER WATCHDOG timed out: ~w ~n", [T]), + timer:cancel(Ref), + Pid ! {self(), watch_dog_timed_out} + end. + +timer(interval, Mod, T, Pid, NumIter) -> + Before = system_time(), + {ok, Ref} = apply(Mod, apply_interval, [T, ?MODULE, send, [self(), done]]), + timer_irec(Before, T, {0, NumIter}, [], {Pid, Mod, Ref}). + +timer_irec(_Start, T, {N, N}, Res, {Pid, Mod, Ref}) -> + apply(Mod, cancel, [Ref]), + Min = lists:min(Res), + Max = lists:max(Res), + Tot = lists:sum(Res), + Pid ! {self(), ok, {N, Tot, Tot div N, Min, Max}, T}; +timer_irec(Start, T, {N, Max}, Res, {Pid, Mod, Ref}) -> + receive + done -> + Now = system_time(), + Elapsed = (Now - (Start + (N*T*1000))) div 1000, +% io:format("~w Now ~w Started ~w Elap ~w~n", [T,Now,Start,Elapsed]), + timer_irec(Start, T, + {N+1, Max}, + [Elapsed | Res], + {Pid, Mod, Ref}) + after T*3 + 300 -> + apply(Mod, cancel, [Ref]), + io:format("WARNING: TIMER WATCHDOG timed out ~w~n",[T]), + Pid ! {self(), timer_watchdog_timed_out_in_interlval_test} + end. + +%% ------------------------------------------------------- %% +%% Small last generator + +start_nrev(0, _) -> + []; + +start_nrev(N, M) -> + Pid = spawn_link(?MODULE, do_nrev, [N, M]), + [Pid | start_nrev(N-1, M)]. + +do_nrev(Sleep, Mod) -> + apply(Mod, sleep, [50 * Sleep]), + test(1000,"abcdefghijklmnopqrstuvxyz1234"), + ok. + +test(0,_) -> + true; +test(N,L) -> + nrev(L), + test(N - 1, L). + +nrev([]) -> + []; +nrev([H|T]) -> + append(nrev(T), [H]). + +append([H|T],Z) -> + [H|append(T,Z)]; +append([],X) -> + X. + +system_time() -> + {M,S,U} = erlang:now(), + 1000000*(M*1000000 + S) + U. + +%% ------------------------------------------------------- %% + +report_result({Res, 0}) -> +% io:format("DEBUG0 all ~p ~n", [Res]), + {A_List, I_List} = split_list(Res, [], []), + A_val = calc_a_val(A_List), + I_val = calc_i_val(I_List), + print_report(A_val, I_val), + ok; + +report_result({Head, N}) -> + io:format("Test Failed: Number of internal tmo ~w~n", [N]), + ?line test_server:fail({Head, N}). + +split_list([], AL, IL) -> + {AL, IL}; +split_list([{T, {N, Tot, A, Min, Max}} | Rest], AL, IL) -> + split_list(Rest, AL, [{T, {N, Tot, A, Min, Max}} | IL]); +split_list([Head | Rest], AL, IL) -> + split_list(Rest, [Head | AL], IL). + +split([{T, Res} | R]) -> + split(R, {{T,[Res]}, {T*10,[]}, {T*100,[]}}). + +split([{T, Res} | R], {{T,S}, M, L}) -> + split(R, {{T,[Res|S]}, M, L}); + +split([{T, Res} | R], {S, {T,M}, L}) -> + split(R, {S, {T, [Res|M]}, L}); + +split([{T, Res} | R], {S, M, {T,L}}) -> + split(R, {S, M, {T, [Res|L]}}); + +split(_Done, Vals) -> + Vals. + +calc_a_val(List) -> + New = lists:sort(List), + {{T1, S}, {T2, M}, {T3, L}} = split(New), + S2 = {length(S), lists:max(S), lists:min(S), + lists:sum(S) div length(S)}, + M2 = {length(M), lists:max(M), lists:min(M), + lists:sum(M) div length(M)}, + L2 = {length(L), lists:max(L), lists:min(L), + lists:sum(L) div length(L)}, + [{T1, S2}, {T2, M2}, {T3, L2}]. + +calc_i_val(List) -> + New = lists:sort(List), + {{T1, S}, {T2, M}, {T3, L}} = split(New), + S2 = get_ivals(S), + M2 = get_ivals(M), + L2 = get_ivals(L), + [{T1, S2}, {T2, M2}, {T3, L2}]. + +get_ivals(List) -> + Len = length(List), + Num = element(1, hd(List)), % Number of iterations + + LTot = lists:map(fun(X) -> element(2, X) end, List), + LMin = lists:map(fun(X) -> element(4, X) end, List), + LMax = lists:map(fun(X) -> element(5, X) end, List), + + MaxTot = lists:max(LTot), + MinTot = lists:min(LTot), + AverTot = lists:sum(LTot) div Len, + + IterMax = lists:max(LMax), + IterMin = lists:min(LMin), + IterAver= AverTot div Num, + + {Len, Num, + {MaxTot, MinTot, AverTot}, + {IterMax, IterMin, IterAver}}. + + +print_report(A_L, I_L) -> + io:format("~nRESULTS from timer test~n~n",[]), + io:format("Time out times for send_after~n~n", []), + io:format("Time No of tests Max Min Average~n",[]), + print_aval(A_L), + io:format("Time out times for send_interval~n~n", []), + io:format("Time No.tests No.intvals TotMax TotMin TotAver MaxI MinI AverI~n", []), + print_ival(I_L). + +print_aval([]) -> + io:format("~n~n", []); +print_aval([{T, {L, Max, Min, Aver}}|R]) -> + io:format("~5w ~8w ~6w ~6w ~8w ~n", + [T,L,Max,Min,Aver]), + print_aval(R). + +print_ival([]) -> + io:format("~n", []); +print_ival([{T, {Len, Num, + {MaxT, MinT, AverT}, + {MaxI, MinI, AverI}}}|R]) -> + io:format("~5w ~6w ~10w ~8w ~6w ~6w ~6w ~6w ~6w~n", + [T,Len,Num,MaxT,MinT,AverT, MaxI, MinI, AverI]), + print_ival(R). + +send(Pid, Msg) -> + Pid ! Msg. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/timer_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/timer_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/timer_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/timer_SUITE.erl 2009-11-20 13:30:03.000000000 +0000 @@ -0,0 +1,391 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(timer_SUITE). + +-export([all/1]). +-export([do_big_test/1]). +-export([big_test/1, collect/3, i_t/3, a_t/2]). +-export([do_nrev/1, internal_watchdog/2]). + +-include("test_server.hrl"). + +%% Test suite for timer module. This is a really nasty test it runs a +%% lot of timeouts and then checks in the end if any of them was +%% trigggered too early or if any late timeouts was much too +%% late. What should be added is more testing of the interface +%% functions I guess. But I don't have time for that now. +%% +%% Expect it to run for at least 5-10 minutes! +%% Except for VxWorks of course, where a couple of hours is more apropriate... + + +%% The main test case in this module is "do_big_test", which +%% orders a large number of timeouts and measures how +%% exact the timeouts arrives. To simulate a system under load there is +%% also a number of other concurrent processes running "nrev" at the same +%% time. The result is analyzed afterwards by trying to check if the +%% measured values are reasonable. It is hard to determine what is +%% reasonable on different machines therefore the test can sometimes +%% fail, even though the timer module is ok. I have checked against +%% previous versions of the timer module (which contained bugs) and it +%% seems it fails every time when running the buggy timer modules. +%% +%% The solution is to rewrite the test suite. Possible strategies for a +%% rewrite: smarter math on the measuring data, test cases with varying +%% amount of load. The test suite should also include tests that test the +%% interface of the timer module. + +all(suite) -> [do_big_test]. + +%% ------------------------------------------------------- %% + +do_big_test(TConfig) when is_list(TConfig) -> + Dog = ?t:timetrap(?t:minutes(20)), + Save = process_flag(trap_exit, true), + Result = case os:type() of + vxworks -> + big_test(10); + _ -> + big_test(200) + end, + process_flag(trap_exit, Save), + ?t:timetrap_cancel(Dog), + report_result(Result). + +report_result(ok) -> ok; +report_result(Error) -> ?line test_server:fail(Error). + +%% ------------------------------------------------------- %% + +big_test(N) -> + C = start_collect(), + system_time(), system_time(), system_time(), + A1 = element(2, erlang:now()), + A2 = A1 * 3, + A3 = element(3, erlang:now()), + random:seed(A1, A2, A3), + random:uniform(100),random:uniform(100),random:uniform(100), + + big_loop(C, N, []), + + %%C ! print_report, + C ! {self(), get_report}, + Report = receive + {report, R} -> + R + end, + C ! stop, + receive + {'EXIT', C, normal} -> + ok + end, + print_report(Report), + Result = analyze_report(Report), + %%io:format("big_test is done: ~w~n", [Result]), + Result. + +big_loop(_C, 0, []) -> + %%io:format("All processes are done!~n", []), + ok; +big_loop(C, 0, Pids) -> + %%ok = io:format("Loop done, ~w processes remaining~n", [length(Pids)]), + %% wait for remaining processes + receive + {'EXIT', Pid, done} -> + big_loop(C, 0, lists:delete(Pid, Pids)); + {'EXIT', Pid, Error} -> + ?line ok = io:format("XXX Pid ~w died with reason ~p~n", + [Pid, Error]), + big_loop(C, 0, lists:delete(Pid, Pids)) + end; +big_loop(C, N, Pids) -> + %% First reap any processes that are done. + receive + {'EXIT', Pid, done} -> + big_loop(C, N, lists:delete(Pid, Pids)); + {'EXIT', Pid, Error} -> + ?line ok =io:format("XXX Internal error: Pid ~w died, reason ~p~n", + [Pid, Error]), + big_loop(C, N, lists:delete(Pid, Pids)) + after 0 -> + + %% maybe start an interval timer test + Pids1 = maybe_start_i_test(Pids, C, random:uniform(4)), + + %% start 1-4 "after" tests + Pids2 = start_after_test(Pids1, C, random:uniform(4)), + %%Pids2=Pids1, + + %% wait a little while + timer:sleep(random:uniform(200)*10), + + %% spawn zero, one or two nrev to get some load ;-/ + Pids3 = start_nrev(Pids2, random:uniform(100)), + + big_loop(C, N-1, Pids3) + end. + + +start_nrev(Pids, N) when N < 25 -> + Pids; +start_nrev(Pids, N) when N < 75 -> + [spawn_link(timer_SUITE, do_nrev, [1])|Pids]; +start_nrev(Pids, _N) -> + NrevPid1 = spawn_link(timer_SUITE, do_nrev, [random:uniform(1000)*10]), + NrevPid2 = spawn_link(timer_SUITE, do_nrev, [1]), + [NrevPid1,NrevPid2|Pids]. + + +start_after_test(Pids, C, 1) -> + TO1 = random:uniform(100)*100, + [s_a_t(C, TO1)|Pids]; +start_after_test(Pids, C, 2) -> + TO1 = random:uniform(100)*100, + TO2 = TO1 div random:uniform(3) + 200, + [s_a_t(C, TO1),s_a_t(C, TO2)|Pids]; +start_after_test(Pids, C, N) -> + TO1 = random:uniform(100)*100, + start_after_test([s_a_t(C, TO1)|Pids], C, N-1). + +s_a_t(C, TimeOut) -> + spawn_link(timer_SUITE, a_t, [C, TimeOut]). + +a_t(C, TimeOut) -> + start_watchdog(self(), TimeOut), + Start = system_time(), + timer:send_after(TimeOut, self(), now), + receive + now -> + Stop = system_time(), + report(C, Start,Stop,TimeOut), + exit(done); + watchdog -> + Stop = system_time(), + report(C, Start,Stop,TimeOut), + ?line ok = io:format("Internal watchdog timeout (a), not good!!~n", + []), + exit(done) + end. + + +maybe_start_i_test(Pids, C, 1) -> + %% ok do it + TOI = random:uniform(100)*100, + CountI = random:uniform(10) + 3, % at least 4 times + [spawn_link(timer_SUITE, i_t, [C, TOI, CountI])|Pids]; +maybe_start_i_test(Pids, _C, _) -> + Pids. + +i_t(C, TimeOut, Times) -> + start_watchdog(self(), TimeOut*Times), + Start = system_time(), + {ok, Ref} = timer:send_interval(TimeOut, interval), + i_wait(Start, Start, 1, TimeOut, Times, Ref, C). + +i_wait(Start, Prev, Times, TimeOut, Times, Ref, C) -> + receive + interval -> + Now = system_time(), + report_interval(C, {final,Times}, Start, Prev, Now, TimeOut), + timer:cancel(Ref), + exit(done); + watchdog -> + Now = system_time(), + report_interval(C, {final,Times}, Start, Prev, Now, TimeOut), + timer:cancel(Ref), + ?line ok = io:format("Internal watchdog timeout (i), not good!!~n", + []), + exit(done) + end; +i_wait(Start, Prev, Count, TimeOut, Times, Ref, C) -> + receive + interval -> + Now = system_time(), + report_interval(C, Count, Start, Prev, Now, TimeOut), + i_wait(Start, Now, Count+1, TimeOut, Times, Ref, C); + watchdog -> + Now = system_time(), + report_interval(C, {final,Count}, Start, Prev, Now, TimeOut), + ?line ok = io:format("Internal watchdog timeout (j), not good!!~n", + []), + exit(done) + end. + +report(C, Start, Stop, Time) -> + C ! {a_sample, Start, Stop, Time}. +report_interval(C, Count, Start, Prev, Now, TimeOut) -> + C ! {i_sample, Count, Start, Prev, Now, TimeOut}. + +%% ------------------------------------------------------- %% + +%% internal watchdog +start_watchdog(Pid, TimeOut) -> + spawn_link(timer_SUITE, internal_watchdog, [Pid, 3*TimeOut+1000]). + +internal_watchdog(Pid, TimeOut) -> + receive + after TimeOut -> + Pid ! watchdog, + exit(normal) + end. + +%% ------------------------------------------------------- %% + +-record(stat, {n=0,max=0,min=min,avg=0}). + +start_collect() -> + spawn_link(timer_SUITE, collect, [0,{0,new_update(),new_update()},[]]). + +collect(N, {E,A,B}, I) -> + receive + {a_sample, Start, Stop, Time} when Stop - Start > Time -> + collect(N+1, {E,update(Stop-Start-Time,A),B}, I); + {a_sample, Start, Stop, Time} when Stop - Start < Time -> + collect(N+1, {E,A,update(Time-Stop+Start,B)}, I); + {a_sample, _Start, _Stop, _Time} -> + collect(N+1, {E+1,A,B}, I); + {i_sample, {final,Count}, Start, Prev, Now, TimeOut} -> + IntervDiff = Now - Prev - TimeOut, + Drift = Now - (Count*TimeOut) - Start, + collect(N, {E,A,B}, [{{final,Count},IntervDiff,Drift}|I]); + {i_sample, Count, Start, Prev, Now, TimeOut} -> + IntervDiff = Now - Prev - TimeOut, + Drift = Now - (Count*TimeOut) - Start, + collect(N, {E,A,B}, [{Count,IntervDiff,Drift}|I]); + print_report -> + print_report({E,A,B,I}), + collect(N,{E,A,B}, I); + {Pid, get_report} when pid(Pid) -> + Pid ! {report, {E, A, B, I}}, + collect(N,{E,A,B}, I); + reset -> + collect(0, {0,new_update(),new_update()}, []); + stop -> + exit(normal); + _Other -> + collect(N, {E,A,B}, I) + end. + +new_update() -> #stat{}. +update(New, Stat) when New > Stat#stat.max -> + Stat#stat{n=Stat#stat.n + 1, max=New, avg=(New+Stat#stat.avg) div 2}; +update(New, Stat) when New < Stat#stat.min -> + Stat#stat{n=Stat#stat.n + 1, min=New, avg=(New+Stat#stat.avg) div 2}; +update(New, Stat) -> + Stat#stat{n=Stat#stat.n + 1, avg=(New+Stat#stat.avg) div 2}. + +%update(New, {N,Max,Min,Avg}) when New>Max -> +% {N+1,New,Min,(New+Avg) div 2}; +%update(New, {N,Max,Min,Avg}) when New +% {N+1,Max,New,(New+Avg) div 2}; +%update(New, {N,Max,Min,Avg}) -> +% {N+1,Max,Min,(New+Avg) div 2}. + +print_report({E,LateS,EarlyS,I}) -> + Early = EarlyS#stat.n, Late = LateS#stat.n, + Total = E + Early + Late, + io:format("~nOn total of ~w timeouts, there were ~w exact, ~w " + "late and ~w early.~n", [Total, E, Late, Early]), + io:format("Late stats (N,Max,Min,Avg): ~w~nEarly stats: ~w~n", + [LateS, EarlyS]), + IntervS = collect_interval_final_stats(I), + io:format("Interval stats (Max,Min,Avg): ~w~n", [IntervS]), + ok. + +collect_interval_final_stats(I) -> + collect_interval_final_stats(I, 0, min, 0). +collect_interval_final_stats([], Max, Min, Avg) -> + {Max, Min, Avg}; +collect_interval_final_stats([{{final,_Count},_,Dev}|T], Max, Min, Avg) -> + NMax = if Dev>Max -> Dev; true -> Max end, + NMin = if Dev Dev; true -> Min end, + collect_interval_final_stats(T, NMax, NMin, (Dev+Avg) div 2); +collect_interval_final_stats([_|T], Max, Min, Avg) -> + collect_interval_final_stats(T, Max, Min, Avg). + +analyze_report({E,LateS,EarlyS,I}) -> + Early = EarlyS#stat.n, Late = LateS#stat.n, + IntervS = collect_interval_final_stats(I), + Res1 = min_and_early_check(E, Early, Late, element(2,IntervS)), + Res2 = abnormal_max_check(LateS#stat.max, element(1,IntervS)), + res_combine(ok, [Res1, Res2]). + +-define(ok_i_min, -100). +-define(ok_max, 8000). +-define(ok_i_max, 4000). + +%% ok as long as Early == 0 and IntervMin >= ok_interv_min +min_and_early_check(_Exact, 0, _Late, IntervMin) when IntervMin >= ?ok_i_min -> + ok; +min_and_early_check(_Exact, Early, _Late, IntervMin) when IntervMin >= ?ok_i_min -> + {error, {early_timeouts, Early}}; +min_and_early_check(_Exact, 0, _Late, _IntervMin) -> + {error, early_interval_timeout}; +min_and_early_check(_Exact, Early, _Late, _IntervMin) -> + {error, [{early_timeouts, Early},{error, early_interval_timeout}]}. + +abnormal_max_check(LateMax, IntMax) when LateMax < ?ok_max, + IntMax < ?ok_i_max -> + ok; +abnormal_max_check(LateMax, IntMax) when IntMax < ?ok_i_max -> + {error, {big_late_max, LateMax}}; +abnormal_max_check(LateMax, IntMax) when LateMax < ?ok_max -> + {error, {big_interval_max, IntMax}}; +abnormal_max_check(LateMax, IntMax) -> + {error, [{big_late_max, LateMax},{big_interval_max, IntMax}]}. + +res_combine(Res, []) -> + Res; +res_combine(Res, [ok|T]) -> + res_combine(Res, T); +res_combine(ok, [{error,What}|T]) -> + res_combine({error,What}, T); +res_combine({error,Es}, [{error,E}|T]) -> + res_combine({error,lists:flatten([E,Es])}, T). + + +system_time() -> + %%element(1, statistics(wall_clock)). + {M,S,U} = erlang:now(), + 1000000000 * M + 1000 * S + (U div 1000). + +%% ------------------------------------------------------- %% + +do_nrev(Sleep) -> + timer:sleep(Sleep), + test(1000,"abcdefghijklmnopqrstuvxyz1234"), + exit(done). + +test(0,_) -> + true; +test(N,L) -> + nrev(L), + test(N - 1, L). + +nrev([]) -> + []; +nrev([H|T]) -> + append(nrev(T), [H]). + +append([H|T],Z) -> + [H|append(T,Z)]; +append([],X) -> + X. + +%% ------------------------------------------------------- %% diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/unicode_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/unicode_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/unicode_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/unicode_SUITE.erl 2009-11-20 13:32:45.000000000 +0000 @@ -0,0 +1,1241 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(unicode_SUITE). + +-include("test_server.hrl"). + +-export([all/1, + init_per_testcase/2, + fin_per_testcase/2, + utf8_illegal_sequences_bif/1, + utf16_illegal_sequences_bif/1, + random_lists/1, + roundtrips/1, + latin1/1, + exceptions/1]). + +init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) -> + Dog=?t:timetrap(?t:minutes(20)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog = ?config(watchdog, Config), + ?t:timetrap_cancel(Dog). + +all(suite) -> + [utf8_illegal_sequences_bif,utf16_illegal_sequences_bif,random_lists,roundtrips,latin1,exceptions]. + + +exceptions(Config) when is_list(Config) -> + setlimit(10), + ex_exceptions(Config), + setlimit(default), + ex_exceptions(Config). + +ex_exceptions(Config) when is_list(Config) -> + ?line L = lists:seq(0,255), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L++255,unicode)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary({1,2,3},unicode)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(1,unicode)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(1.0,unicode)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary('1',unicode)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary([1,2,3,apa],unicode)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary([1,2,3,4.0],unicode)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L++255,latin1)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary({1,2,3},latin1)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(1,latin1)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(1.0,latin1)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary('1',latin1)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary([1,2,3,apa],latin1)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary([1,2,3,4.0],latin1)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,gnarfl)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,L)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,{latin1})), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,[latin1])), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,1)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,1.0)), + Encodings = [unicode, utf8,utf16,utf32,{utf16,big}, + {utf16,little},{utf32,big},{utf32,little}], + [ begin + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L++255,unicode,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary({1,2,3},unicode,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(1,unicode,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(1.0,unicode,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary('1',unicode,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary([1,2,3,apa],unicode, + Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary([1,2,3,4.0],unicode, + Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L++255,latin1,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary({1,2,3},latin1,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(1,latin1,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(1.0,latin1,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary('1',latin1,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary([1,2,3,apa],latin1, + Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary([1,2,3,4.0],latin1, + Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,gnarfl,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,L,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,{latin1},Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,[latin1],Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,1,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_binary(L,1.0,Enc)) + end || Enc <- Encodings ], + + + Encodings2 = [latin1, unicode, utf8,utf16,utf32,{utf16,big}, + {utf16,little},{utf32,big},{utf32,little}], + [ begin + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list(L++255,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list({1,2,3},Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list(1,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list(1.0,Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list('1',Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list([1,2,3,apa],Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list([1,2,3,4.0],Enc)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list(L,{Enc})), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list(L,[Enc])) + end || Enc <- Encodings2 ], + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list(L,gnarfl)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list(L,L)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list(L,1)), + ?line {'EXIT',{badarg,_}} = (catch unicode:characters_to_list(L,1.0)), + [ begin + ?line Bx = unicode:characters_to_binary(L,latin1, Enc), + ?line L = unicode:characters_to_list(Bx,Enc) + end || Enc <- Encodings ], + ?line B = unicode:characters_to_binary(L,latin1), + ?line L = unicode:characters_to_list(B,unicode), + ?line L = unicode:characters_to_list(list_to_binary(L),latin1), + ?line More = <>, + ?line B2 = list_to_binary([254,255]), + ?line B3 = list_to_binary([0,1,2,254,255]), + ?line {error,B,Rest1} = unicode:characters_to_binary([L,B2],unicode), + ?line B2 = iolist_to_binary(Rest1), + ?line {error,More,Rest2} = unicode:characters_to_binary([L,B3],unicode), + [ begin ?line {error,_,_} = unicode:characters_to_binary([L,B2],unicode,Enc) end + || Enc <- Encodings ], + ?line Valid0 = unicode:characters_to_binary([L,254,255],unicode), + ?line Valid1 = unicode:characters_to_binary([L,254,255],latin1), + ?line Valid2 = unicode:characters_to_binary([L,254,255,256,257],unicode), + ?line Valid3 = unicode:characters_to_binary([L,B2],latin1), + ?line true = is_binary(Valid0), + ?line true = is_binary(Valid1), + ?line true = is_binary(Valid2), + ?line true = is_binary(Valid3), + ?line Valid4 = unicode:characters_to_binary([L,B3],latin1), + ?line true = is_binary(Valid4), + ?line B2 = iolist_to_binary(Rest2), + ?line true = (L ++ [254,255] =:= unicode:characters_to_list(Valid0,unicode)), + ?line true = (L ++ [254,255,256,257] =:= unicode:characters_to_list(Valid2,unicode)), + lists:foreach(fun(Enco) -> + ?line Valid0x = unicode:characters_to_binary([L,254,255],unicode,Enco), + ?line Valid1x = unicode:characters_to_binary([L,254,255],latin1,Enco), + ?line Valid2x = unicode:characters_to_binary([L,254,255,256,257],unicode,Enco), + ?line Valid3x = unicode:characters_to_binary([L,B2],latin1,Enco), + ?line true = is_binary(Valid0x), + ?line true = is_binary(Valid1x), + ?line true = is_binary(Valid2x), + ?line true = is_binary(Valid3x) + + end, Encodings), + ok. + + +latin1(Config) when is_list(Config) -> + setlimit(10), + ex_latin1(Config), + setlimit(default), + ex_latin1(Config). + +ex_latin1(Config) when is_list(Config) -> + ?line All = lists:seq(0,255), + ?line AllBin = list_to_binary(All), + ?line AllUtf8 = unicode:characters_to_binary(All,latin1), + ?line AllUtf8 = unicode:characters_to_binary(AllBin,latin1), + ?line AllUtf8 = unicode:characters_to_binary([AllBin],latin1), + ?line AllUtf8 = unicode:characters_to_binary(make_unaligned(AllBin),latin1), + ?line AllUtf8 = unicode:characters_to_binary([make_unaligned(AllBin)],latin1), + ?line AllUtf8 = list_to_utf8_bsyntax([AllBin],latin1), + ?line AllUtf8 = list_to_utf8_bsyntax([make_unaligned(AllBin)],latin1), + ?line AllUtf8 = unicode_mixed_to_utf8_1(All), + + ?line AllUtf16_Big = unicode:characters_to_binary(All,latin1,utf16), + ?line AllUtf16_Big = unicode:characters_to_binary(AllBin,latin1,utf16), + ?line AllUtf16_Big = unicode:characters_to_binary([AllBin],latin1,utf16), + ?line AllUtf16_Big = unicode:characters_to_binary(make_unaligned(AllBin),latin1,utf16), + ?line AllUtf16_Big = unicode:characters_to_binary([make_unaligned(AllBin)],latin1,utf16), + ?line AllUtf16_Big = list_to_utf16_big_bsyntax([AllBin],latin1), + ?line AllUtf16_Big = list_to_utf16_big_bsyntax([make_unaligned(AllBin)],latin1), + + ?line AllUtf16_Little = unicode:characters_to_binary(All,latin1,{utf16,little}), + ?line AllUtf16_Little = unicode:characters_to_binary(AllBin,latin1,{utf16,little}), + ?line AllUtf16_Little = unicode:characters_to_binary([AllBin],latin1,{utf16,little}), + ?line AllUtf16_Little = unicode:characters_to_binary(make_unaligned(AllBin),latin1, + {utf16,little}), + ?line AllUtf16_Little = unicode:characters_to_binary([make_unaligned(AllBin)],latin1, + {utf16,little}), + ?line AllUtf16_Little = list_to_utf16_little_bsyntax([AllBin],latin1), + ?line AllUtf16_Little = list_to_utf16_little_bsyntax([make_unaligned(AllBin)],latin1), + + ?line AllUtf32_Big = unicode:characters_to_binary(All,latin1,utf32), + ?line AllUtf32_Big = unicode:characters_to_binary(AllBin,latin1,utf32), + ?line AllUtf32_Big = unicode:characters_to_binary([AllBin],latin1,utf32), + ?line AllUtf32_Big = unicode:characters_to_binary(make_unaligned(AllBin),latin1,utf32), + ?line AllUtf32_Big = unicode:characters_to_binary([make_unaligned(AllBin)],latin1,utf32), + ?line AllUtf32_Big = list_to_utf32_big_bsyntax([AllBin],latin1), + ?line AllUtf32_Big = list_to_utf32_big_bsyntax([make_unaligned(AllBin)],latin1), + + ?line AllUtf32_Little = unicode:characters_to_binary(All,latin1,{utf32,little}), + ?line AllUtf32_Little = unicode:characters_to_binary(AllBin,latin1,{utf32,little}), + ?line AllUtf32_Little = unicode:characters_to_binary([AllBin],latin1,{utf32,little}), + ?line AllUtf32_Little = unicode:characters_to_binary(make_unaligned(AllBin),latin1, + {utf32,little}), + ?line AllUtf32_Little = unicode:characters_to_binary([make_unaligned(AllBin)],latin1, + {utf32,little}), + ?line AllUtf32_Little = list_to_utf32_little_bsyntax([AllBin],latin1), + ?line AllUtf32_Little = list_to_utf32_little_bsyntax([make_unaligned(AllBin)],latin1), + + ?line DoubleUtf8 = <>, + ?line DoubleUtf8 = unicode:characters_to_binary([All,AllBin],latin1), + ?line DoubleUtf8 = + unicode:characters_to_binary([All,make_unaligned(AllBin)],latin1), + ?line DoubleUtf8 = unicode:characters_to_binary([All|AllBin],latin1), + ?line DoubleUtf8 = + unicode:characters_to_binary([All|make_unaligned(AllBin)],latin1), + ?line DoubleUtf8 = unicode:characters_to_binary([AllBin,All],latin1), + ?line DoubleUtf8 = unicode:characters_to_binary([AllBin|All],latin1), + ?line DoubleUtf8 = list_to_utf8_bsyntax([AllBin|All],latin1), + + ?line DoubleUtf16 = <>, + ?line DoubleUtf16 = unicode:characters_to_binary([All,AllBin],latin1,{utf16,big}), + ?line DoubleUtf16 = + unicode:characters_to_binary([All,make_unaligned(AllBin)],latin1,{utf16,big}), + ?line DoubleUtf16 = unicode:characters_to_binary([All|AllBin],latin1,{utf16,big}), + ?line DoubleUtf16 = + unicode:characters_to_binary([All|make_unaligned(AllBin)],latin1,{utf16,big}), + ?line DoubleUtf16 = unicode:characters_to_binary([AllBin,All],latin1,{utf16,big}), + ?line DoubleUtf16 = unicode:characters_to_binary([AllBin|All],latin1,{utf16,big}), + ?line DoubleUtf16 = list_to_utf16_big_bsyntax([AllBin|All],latin1), + + ?line All = unicode:characters_to_list(AllUtf8,unicode), + ?line All = unicode:characters_to_list(make_unaligned(AllUtf8),unicode), + ?line All = utf8_to_list_bsyntax(AllUtf8), + ?line AllAll = All ++ All, + ?line AllAll = unicode:characters_to_list(DoubleUtf8,unicode), + ?line AllAll = unicode:characters_to_list(make_unaligned(DoubleUtf8),unicode), + ?line AllAll = utf8_to_list_bsyntax(DoubleUtf8), + ?line {error,AllUtf8,Rest1} = unicode:characters_to_binary(All++[16#FFF],latin1), + ?line [16#FFF] = lists:flatten(Rest1), + ?line {error,DoubleUtf8,Rest2} = + unicode:characters_to_binary([All,AllBin,16#FFF],latin1), + ?line {error,DoubleUtf16,Rest2x} = + unicode:characters_to_binary([All,AllBin,16#FFF],latin1,utf16), + ?line [16#FFF] = lists:flatten(Rest2), + ?line [16#FFF] = lists:flatten(Rest2x), + ?line {error,AllUtf8,Rest3} = + unicode:characters_to_binary([All,16#FFF,AllBin,16#FFF], + latin1), + ?line {error,AllUtf8,Rest3} = + unicode:characters_to_binary([All,16#FFF,make_unaligned(AllBin),16#FFF], + latin1), + ?line {error,AllUtf16_Big,Rest3x} = + unicode:characters_to_binary([All,16#FFF,AllBin,16#FFF], + latin1,{utf16,big}), + ?line {error,AllUtf16_Big,Rest3x} = + unicode:characters_to_binary([All,16#FFF,make_unaligned(AllBin),16#FFF], + latin1,{utf16,big}), + ?line [16#FFF,AllBin,16#FFF] = lists:flatten(Rest3), + ?line [16#FFF,AllBin,16#FFF] = lists:flatten(Rest3x), + ?line DoubleSize = byte_size(DoubleUtf8), + ?line AllBut1 = DoubleSize - 1, + ?line AllBut2 = DoubleSize - 2, + ?line <> = DoubleUtf8, + ?line <<_:AllBut2/binary,MissingStart:1/binary,_>> = DoubleUtf8, + ?line {ChompedList,_} = lists:split(length(AllAll) - 1,AllAll), + ?line {incomplete,ChompedList,MissingStart} = + unicode:characters_to_list(MissingLastByte,unicode), + ?line {incomplete,ChompedList,MissingStart} = + unicode:characters_to_list(make_unaligned(MissingLastByte),unicode), + + ?line DoubleSize16 = byte_size(DoubleUtf16), + ?line DoubleUtf16_2 = erlang:concat_binary([DoubleUtf16,<<16#FFFFF/utf16-big>>]), + ?line DoubleSize16_2 = byte_size(DoubleUtf16_2), + ?line AllBut1_16 = DoubleSize16 - 1, + ?line AllBut2_16_2 = DoubleSize16_2 - 2, + ?line <> = DoubleUtf16_2, + ?line <> = DoubleUtf16, + ?line {incomplete,AllAll,_} = + unicode:characters_to_list(MissingLastBytes16,utf16), + ?line {incomplete,AllAll,_} = + unicode:characters_to_list(make_unaligned(MissingLastBytes16),utf16), + ?line {incomplete,ChompedList,_} = + unicode:characters_to_list(MissingLastByte16,utf16), + ?line {incomplete,ChompedList,_} = + unicode:characters_to_list(make_unaligned(MissingLastByte16),utf16), + ok. + +roundtrips(Config) when is_list(Config) -> + setlimit(10), + ex_roundtrips(Config), + setlimit(default), + ex_roundtrips(Config). + +ex_roundtrips(Config) when is_list(Config) -> + ?line L1 = ranges(0, 16#D800 - 1, + erlang:system_info(context_reductions) * 11), + ?line L2 = ranges(16#DFFF + 1, 16#FFFE - 1, + erlang:system_info(context_reductions) * 11), + %?line L3 = ranges(16#FFFF + 1, 16#10FFFF, + % erlang:system_info(context_reductions) * 11), + ?line L3 = ranges(16#FFFFF, 16#10FFFF, + erlang:system_info(context_reductions) * 11), + ?line L = L1 ++ L2 ++ L3, + ?line LLen = length(L), + ?line Parts = erlang:system_info(schedulers), + ?line Lists = splitup(L,LLen,Parts), + ?line PidRefs = [spawn_monitor(fun() -> + do_roundtrips(MyPart) + end) || MyPart <- Lists], + ?line [receive {'DOWN',Ref,process,Pid,Reason} -> normal=Reason end || + {Pid,Ref} <- PidRefs], + ok. + +do_roundtrips([]) -> + ok; +do_roundtrips([{Start,Stop}|T]) -> + erlang:display({Start,Stop}), + List = lists:seq(Start,Stop), + Utf = unicode:characters_to_binary(List,unicode), + Utf16_Big = unicode:characters_to_binary(List,unicode,{utf16,big}), + Utf16_Little = unicode:characters_to_binary(List,unicode,{utf16,little}), + Utf32_Big = unicode:characters_to_binary(List,unicode,{utf32,big}), + Utf32_Little = unicode:characters_to_binary(List,unicode,{utf32,little}), + + Utf = unicode:characters_to_binary([Utf],unicode), + Utf16_Big = unicode:characters_to_binary([Utf16_Big],{utf16,big},{utf16,big}), + Utf16_Little = unicode:characters_to_binary([Utf16_Little],{utf16,little},{utf16,little}), + Utf32_Big = unicode:characters_to_binary([Utf32_Big],{utf32,big},{utf32,big}), + Utf32_Little = unicode:characters_to_binary([Utf32_Little],{utf32,little},{utf32,little}), + + Utf = list_to_utf8_bsyntax(List,unicode), + Utf16_Big = list_to_utf16_big_bsyntax(List,{utf16,big}), + Utf16_Little = list_to_utf16_little_bsyntax(List,{utf16,little}), + Utf32_Big = list_to_utf32_big_bsyntax(List,{utf32,big}), + Utf32_Little = list_to_utf32_little_bsyntax(List,{utf32,little}), + + Utf = unicode_mixed_to_utf8_1(List), + + List = unicode:characters_to_list(Utf,unicode), + List = unicode:characters_to_list(Utf16_Big,{utf16,big}), + List = unicode:characters_to_list(Utf16_Little,{utf16,little}), + List = unicode:characters_to_list(Utf32_Big,{utf32,big}), + List = unicode:characters_to_list(Utf32_Little,{utf32,little}), + List = utf8_to_list_bsyntax(Utf), + List = utf16_big_to_list_bsyntax(Utf16_Big), + List = utf16_little_to_list_bsyntax(Utf16_Little), + List = utf32_big_to_list_bsyntax(Utf32_Big), + List = utf32_little_to_list_bsyntax(Utf32_Little), + List = utf8_to_list(Utf), + List = utf16_big_to_list(Utf16_Big), + List = utf16_little_to_list(Utf16_Little), + List = utf32_big_to_list(Utf32_Big), + List = utf32_little_to_list(Utf32_Little), + do_roundtrips(T). + + +random_lists(Config) when is_list(Config) -> + setlimit(10), + ex_random_lists(Config), + setlimit(default), + ex_random_lists(Config). +ex_random_lists(Config) when is_list(Config) -> + PlainFlatten1 = fun(L) -> + unicode:characters_to_binary(flat(L),latin1) + end, + PlainFlatten2 = fun(L) -> + unicode:characters_to_binary(L,latin1) + end, + PlainFlatten3 = fun(L) -> + unicode:characters_to_binary(flatb(L),latin1) + end, + PlainFlatten4 = fun(L) -> + iolist_to_binary([int_to_utf8(X) || X <- unicode:characters_to_list(flatb(L),latin1)]) + end, + ?line random_iolist:run(150, PlainFlatten1, PlainFlatten3), + ?line random_iolist:run(150, PlainFlatten2, PlainFlatten3), + ?line random_iolist:run(150, PlainFlatten1, PlainFlatten2), + ?line random_iolist:run(150, PlainFlatten1, PlainFlatten4), + SelfMade = fun(L) -> + iolist_to_binary(lists:map(fun(X) -> + int_to_utf8(X) + end, + flatb(L))) + end, + SelfMadeA = fun(L) -> + case (catch list_to_utf8_bsyntax(L,latin1)) of + {'EXIT', Reason} -> + io:format("Exit: ~p (~w)~n",[Reason,L]), + exit(Reason); + Other -> + Other + end + end, + ?line random_iolist:run(150, PlainFlatten1, SelfMade), + ?line random_iolist:run(150, PlainFlatten2, SelfMadeA), + + RoundTrip11 = fun(L) -> + unicode:characters_to_list(unicode:characters_to_binary(L,latin1),unicode) + end, + RoundTrip21 = fun(L) -> + utf8_to_list_bsyntax(unicode:characters_to_binary(L,latin1)) + end, + RoundTrip31 = fun(L) -> + unicode:characters_to_list(list_to_utf8_bsyntax(L,latin1),unicode) + end, + RoundTrip41 = fun(L) -> + utf8_to_list_bsyntax(list_to_utf8_bsyntax(L,latin1)) + end, + RoundTrip51 = fun(L) -> + unicode:characters_to_list(L,latin1) + end, + ?line random_iolist:run(150, RoundTrip11,RoundTrip21), + ?line random_iolist:run(150, RoundTrip21,RoundTrip31), + ?line random_iolist:run(150, RoundTrip31,RoundTrip41), + ?line random_iolist:run(150, RoundTrip11,RoundTrip41), + ?line random_iolist:run(150, RoundTrip21,RoundTrip41), + ?line random_iolist:run(150, RoundTrip11,RoundTrip31), + ?line random_iolist:run(150, RoundTrip11,RoundTrip51), + + + UniFlatten1 = fun(L) -> + unicode:characters_to_binary(flat(L),unicode) + end, + UniFlatten2 = fun(L) -> + unicode:characters_to_binary(L,unicode) + end, + UniFlatten3 = fun(L) -> + unicode:characters_to_binary(flatx(L),unicode) + end, + UniFlatten4 = fun(L) -> + unicode:characters_to_binary(unicode:characters_to_list(L,unicode),unicode) + end, + ?line random_unicode_list:run(150, UniFlatten1,UniFlatten2), + ?line random_unicode_list:run(150, UniFlatten1,UniFlatten3), + ?line random_unicode_list:run(150, UniFlatten2,UniFlatten4), + ?line random_unicode_list:run(150, UniFlatten2,UniFlatten3), + + ?line Encodings = [utf8,{utf16,big}, + {utf16,little},{utf32,big},{utf32,little}], + lists:foreach(fun(OutEnc1) -> + lists:foreach(fun(InEnc1) -> + Uni16BigFlatten1 = fun(L) -> + unicode:characters_to_binary(flat(L),InEnc1,OutEnc1) + end, + Uni16BigFlatten2 = fun(L) -> + unicode:characters_to_binary(L,InEnc1,OutEnc1) + end, + Uni16BigFlatten3 = fun(L) -> + unicode:characters_to_binary(flatx(L),InEnc1,OutEnc1) + end, + Uni16BigFlatten4 = fun(L) -> + unicode:characters_to_binary(unicode:characters_to_list(L,InEnc1),InEnc1,OutEnc1) + end, + %erlang:display({InEnc1,OutEnc1}), + ?line random_unicode_list:run(150, Uni16BigFlatten1,Uni16BigFlatten2,InEnc1), + ?line random_unicode_list:run(150, Uni16BigFlatten1,Uni16BigFlatten3,InEnc1), + ?line random_unicode_list:run(150, Uni16BigFlatten2,Uni16BigFlatten4,InEnc1), + ?line random_unicode_list:run(150, Uni16BigFlatten2,Uni16BigFlatten3,InEnc1) + end, Encodings) + end, Encodings), + SelfMade1 = fun(L) -> + unicode_mixed_to_utf8_1(L) + end, + SelfMade2 = fun(L) -> + unicode_mixed_to_utf8_2(L) + end, + SelfMade3 = fun(L) -> + list_to_utf8_bsyntax(L,unicode) + end, + ?line random_unicode_list:run(150, SelfMade1,SelfMade2), + ?line random_unicode_list:run(150, UniFlatten2, SelfMade1), + ?line random_unicode_list:run(150, UniFlatten2, SelfMade2), + ?line random_unicode_list:run(150, UniFlatten2, SelfMade3), + RoundTrip1 = fun(L) -> + unicode:characters_to_list(unicode:characters_to_binary(L,unicode),unicode) + end, + RoundTrip2 = fun(L) -> + utf8_to_list_bsyntax(unicode:characters_to_binary(L,unicode)) + end, + RoundTrip3 = fun(L) -> + unicode:characters_to_list(list_to_utf8_bsyntax(L,unicode),unicode) + end, + RoundTrip4 = fun(L) -> + utf8_to_list_bsyntax(list_to_utf8_bsyntax(L,unicode)) + end, + ?line random_unicode_list:run(150, RoundTrip1,RoundTrip2), + ?line random_unicode_list:run(150, RoundTrip2,RoundTrip3), + ?line random_unicode_list:run(150, RoundTrip3,RoundTrip4), + ?line random_unicode_list:run(150, RoundTrip1,RoundTrip4), + ?line random_unicode_list:run(150, RoundTrip2,RoundTrip4), + ?line random_unicode_list:run(150, RoundTrip1,RoundTrip3), + lists:foreach(fun(OutEnc2) -> + lists:foreach(fun(InEnc2) -> + RoundTripUtf16_Big_1 = fun(L) -> + unicode:characters_to_list(unicode:characters_to_binary(L,InEnc2,OutEnc2),OutEnc2) + end, + RoundTripUtf16_Big_2 = fun(L) -> + x_to_list_bsyntax(OutEnc2,unicode:characters_to_binary(L,InEnc2,OutEnc2)) + end, + RoundTripUtf16_Big_3 = fun(L) -> + unicode:characters_to_list(list_to_x_bsyntax(InEnc2,L,InEnc2),InEnc2) + end, + RoundTripUtf16_Big_4 = fun(L) -> + x_to_list_bsyntax(InEnc2,list_to_x_bsyntax(InEnc2,L,InEnc2)) + end, + ?line random_unicode_list:run(150, RoundTripUtf16_Big_1,RoundTripUtf16_Big_2,InEnc2), + ?line random_unicode_list:run(150, RoundTripUtf16_Big_2,RoundTripUtf16_Big_3,InEnc2), + ?line random_unicode_list:run(150, RoundTripUtf16_Big_3,RoundTripUtf16_Big_4,InEnc2), + ?line random_unicode_list:run(150, RoundTripUtf16_Big_1,RoundTripUtf16_Big_4,InEnc2), + ?line random_unicode_list:run(150, RoundTripUtf16_Big_2,RoundTripUtf16_Big_4,InEnc2), + ?line random_unicode_list:run(150, RoundTripUtf16_Big_1,RoundTripUtf16_Big_3,InEnc2) + end, Encodings) + end, Encodings), + ToList1 = fun(L) -> + unicode:characters_to_list(L,unicode) + end, + ToList2 = fun(L) -> + unicode:characters_to_list(unicode:characters_to_binary(L,unicode),unicode) + end, + ToList3 = fun(L) -> + unicode:characters_to_list(unicode_mixed_to_utf8_2(L),unicode) + end, + ToList4 = fun(L) -> + utf8_to_list(unicode_mixed_to_utf8_2(L)) + end, + ?line random_unicode_list:run(150, ToList1,ToList2), + ?line random_unicode_list:run(150, ToList2,ToList3), + ?line random_unicode_list:run(150, ToList3,ToList4), + ?line random_unicode_list:run(150, ToList1,ToList4), + ?line random_unicode_list:run(150, ToList2,ToList4), + ?line random_unicode_list:run(150, ToList1,ToList3), + + ok. + +utf16_illegal_sequences_bif(Config) when is_list(Config) -> + setlimit(10), + ex_utf16_illegal_sequences_bif(Config), + setlimit(default), + ex_utf16_illegal_sequences_bif(Config). + +ex_utf16_illegal_sequences_bif(Config) when is_list(Config) -> + ?line utf16_fail_range_bif_simple(16#10FFFF+1, 16#10FFFF+512), %Too large. + ?line utf16_fail_range_bif(16#D800, 16#DFFF), %Reserved for UTF-16. + ?line utf16_fail_range_bif(16#FFFE, 16#FFFF), %Non-characters. + + ?line lonely_hi_surrogate_bif(16#D800, 16#DBFF,incomplete), + ?line lonely_hi_surrogate_bif(16#DC00, 16#DFFF,error), + ?line leading_lo_surrogate_bif(16#DC00, 16#DFFF), + + ok. + +utf16_fail_range_bif(Char, End) when Char =< End -> + {error,_,_} = unicode:characters_to_binary([Char],{utf16,big}), + BigBin = int_to_utf16_big(Char), + fail_bif(BigBin,{utf16,big}), + {error,_,_} = unicode:characters_to_binary([Char],{utf16,little}), + LittleBin = int_to_utf16_little(Char), + fail_bif(LittleBin,{utf16,little}), + utf16_fail_range_bif(Char+1, End); +utf16_fail_range_bif(_, _) -> ok. + +utf16_fail_range_bif_simple(Char, End) when Char =< End -> + {error,_,_} = unicode:characters_to_binary([Char],{utf16,big}), + {error,_,_} = unicode:characters_to_binary([Char],{utf16,little}), + utf16_fail_range_bif_simple(Char+1, End); +utf16_fail_range_bif_simple(_, _) -> ok. + + +lonely_hi_surrogate_bif(Char, End, EType) when Char =< End -> + BinBig = <>, + BinLittle = <>, + case unicode:characters_to_binary(BinBig,{utf16,big}) of + {EType,_,_} -> + ok; + Other -> + exit({lonely_hi_surrogate_accepted,BinBig,{utf16,big},Other}) + end, + case unicode:characters_to_binary(BinLittle,{utf16,little}) of + {EType,_,_} -> + ok; + Other2 -> + exit({lonely_hi_surrogate_accepted,BinLittle,{utf16,little},Other2}) + end, + lonely_hi_surrogate_bif(Char+1, End, EType); +lonely_hi_surrogate_bif(_, _, _) -> ok. + +leading_lo_surrogate_bif(Char, End) when Char =< End -> + leading_lo_surrogate_bif(Char, 16#D800, 16#DFFF), + leading_lo_surrogate_bif(Char+1, End); +leading_lo_surrogate_bif(_, _) -> ok. + +leading_lo_surrogate_bif(HiSurr, LoSurr, End) when LoSurr =< End -> + BinBig = <>, + BinLittle = <>, + case unicode:characters_to_binary(BinBig,{utf16,big}) of + {error,_,_} -> + ok; + Other -> + exit({leading_lo_surrogate_accepted,BinBig,{utf16,big},Other}) + end, + case unicode:characters_to_binary(BinLittle,{utf16,little}) of + {error,_,_} -> + ok; + Other2 -> + exit({leading_lo_surrogate_accepted,BinLittle,{utf16,little},Other2}) + end, + leading_lo_surrogate_bif(HiSurr, LoSurr+1, End); +leading_lo_surrogate_bif(_, _, _) -> ok. + +utf8_illegal_sequences_bif(Config) when is_list(Config) -> + setlimit(10), + ex_utf8_illegal_sequences_bif(Config), + setlimit(default), + ex_utf8_illegal_sequences_bif(Config). + +ex_utf8_illegal_sequences_bif(Config) when is_list(Config) -> + ?line fail_range_bif(16#10FFFF+1, 16#10FFFF+512), %Too large. + ?line fail_range_bif(16#D800, 16#DFFF), %Reserved for UTF-16. + ?line fail_range_bif(16#FFFE, 16#FFFF), %Reserved (BOM). + + %% Illegal first character. + ?line [fail_bif(<>,unicode) || I <- lists:seq(16#80, 16#BF)], + + %% Short sequences. + ?line short_sequences_bif(16#80, 16#10FFFF), + + %% Overlong sequences. (Using more bytes than necessary + %% is not allowed.) + ?line overlong_bif(0, 127, 2), + ?line overlong_bif(128, 16#7FF, 3), + ?line overlong_bif(16#800, 16#FFFF, 4), + ok. + +fail_range_bif(Char, End) when Char =< End -> + {error,_,_} = unicode:characters_to_binary([Char],unicode), + {error,_,_} = unicode:characters_to_binary([Char],unicode,utf16), + {error,_,_} = unicode:characters_to_binary([Char],unicode,utf32), + Bin = int_to_utf8(Char), + fail_bif(Bin,unicode), + fail_range_bif(Char+1, End); +fail_range_bif(_, _) -> ok. + +short_sequences_bif(Char, End) -> + Step = (End - Char) div erlang:system_info(schedulers) + 1, +% Step = (End - Char) + 1, + PidRefs = short_sequences_bif_1(Char, Step, End), + [receive {'DOWN',Ref,process,Pid,Reason} -> normal=Reason end || + {Pid,Ref} <- PidRefs], + ok. + +short_sequences_bif_1(Char, Step, End) when Char =< End -> + CharEnd = lists:min([Char+Step-1,End]), + [spawn_monitor(fun() -> + io:format("~p - ~p\n", [Char,CharEnd]), + do_short_sequences_bif(Char, CharEnd) + end)|short_sequences_bif_1(Char+Step, Step, End)]; +short_sequences_bif_1(_, _, _) -> []. + +do_short_sequences_bif(Char, End) when Char =< End -> + short_sequence_bif(Char), + do_short_sequences_bif(Char+1, End); +do_short_sequences_bif(_, _) -> ok. + +short_sequence_bif(I) -> + case int_to_utf8(I) of + <> -> + <> = S0, + <> = S1, + incomplete_bif(S0,S0), + incomplete_bif(S1,S1), + incomplete_bif(S2,S2), + only_fail_bif(<>,unicode), + only_fail_bif(<>,unicode), + only_fail_bif(<>,unicode); + <> -> + <> = S0, + incomplete_bif(S0,S0), + incomplete_bif(S1,S1), + only_fail_bif(<>,unicode), + only_fail_bif(<>,unicode), + only_fail_bif(<>,unicode); + <> -> + incomplete_bif(S,S), + only_fail_bif(<>,unicode) + end. + + +overlong_bif(Char, Last, NumBytes) when Char =< Last -> + overlong_bif(Char, NumBytes), + overlong_bif(Char+1, Last, NumBytes); +overlong_bif(_, _, _) -> ok. + +overlong_bif(Char, NumBytes) when NumBytes < 5 -> + case unicode:characters_to_binary([int_to_utf8(Char, NumBytes)],unicode) of + {error,_,_} -> + ok; + Other-> + exit({illegal_encoding_accepted,Char,NumBytes,Other}) + end, + overlong_bif(Char, NumBytes+1); +overlong_bif(_, _) -> ok. + +incomplete_bif(Bin,Tail) -> + incomplete_bif_1(Bin,Tail), + incomplete_bif_1(make_unaligned(Bin),Tail), + incomplete_bif_r_1(Bin,Tail), + incomplete_bif_r_1(make_unaligned(Bin),Tail), + ok. + +incomplete_bif_1(Bin,Tail) -> + case unicode:characters_to_binary([Bin],unicode) of + {incomplete,_,Tail} -> + case unicode:characters_to_binary(Bin,unicode) of + {incomplete,_,Tail} -> + ok; + Other0 -> + exit({incomplete_encoding_accepted,Bin,Other0}) + end; + Other -> + exit({incomplete_encoding_accepted,[Bin],Other}) + end. +incomplete_bif_r_1(Bin,Tail) -> + case unicode:characters_to_list([Bin],unicode) of + {incomplete,_,Tail} -> + case unicode:characters_to_list(Bin,unicode) of + {incomplete,_,Tail} -> + ok; + Other -> + exit({incomplete_encoding_accepted_r,[Bin],Other}) + end; + Other -> + exit({incomplete_encoding_accepted_r,[Bin],Other}) + end. + +only_fail_bif(Bin,Coding) -> + only_fail_bif_1(Bin,Coding), + only_fail_bif_1(make_unaligned(Bin),Coding), + only_fail_bif_r_1(Bin,Coding), + only_fail_bif_r_1(make_unaligned(Bin),Coding), + ok. + +only_fail_bif_r_1(Bin,Coding) -> + case unicode:characters_to_list([Bin],Coding) of + {error,_,_} -> + case unicode:characters_to_list(Bin,Coding) of + {error,_,_} -> + ok; + Other -> + exit({faulty_encoding_accepted_r,Bin,Coding,Other}) + end; + Other -> + exit({faulty_encoding_accepted_r,Bin,Coding,Other}) + end. +only_fail_bif_1(Bin,Coding) -> + case unicode:characters_to_binary([Bin],Coding) of + {error,_,_} -> + case unicode:characters_to_binary(Bin,Coding) of + {error,_,_} -> + ok; + Other0 -> + exit({faulty_encoding_accepted,Bin,Coding,Other0}) + end; + Other -> + exit({faulty_encoding_accepted,[Bin],Coding,Other}) + end. + + + + +fail_bif(Bin,Coding) -> + fail_bif_1(Bin,Coding), + fail_bif_1(make_unaligned(Bin),Coding), + fail_bif_r_1(Bin,Coding), + fail_bif_r_1(make_unaligned(Bin),Coding), + ok. +fail_bif_r_1(Bin,Coding) -> + case unicode:characters_to_list(Bin,Coding) of + L when is_list(L) -> + exit({illegal_encoding_accepted,Bin,Coding}); + _ -> + ok + end. + +fail_bif_1(Bin,Coding) -> + case unicode:characters_to_binary([Bin],Coding) of + Bin2 when is_binary(Bin2) -> + exit({illegal_encoding_accepted,Bin,Coding}); + _ -> + ok + end. + +%% +%% Diverse utilities +%% + +ranges(X,Y,_N) when X >= Y -> + []; +ranges(X,Y,N) when X + N > Y -> + [{X,Y}]; +ranges(X,Y,N) -> + Upper = X+N, + [{X,Upper}|ranges(Upper+1,Y,N)]. + +splitup(L,_Len,1) -> + [L]; +splitup(L,Len,Parts) -> + Num = Len div Parts, + {A,B} = lists:split(Num,L), + [A| splitup(B,Len - Num,Parts - 1)]. + +flat(List) -> + lists:reverse(flat(List,[])). + +flat([H|T],Acc) -> + NewAcc = flat(H,Acc), + flat(T,NewAcc); +flat([],Acc) -> + Acc; +flat(X,Acc) -> + [X|Acc]. + +flatb(List) -> + lists:reverse(flatb(List,[])). + +flatb(<>,Acc) -> + flatb(Rest,[X|Acc]); +flatb(<<>>,Acc) -> + Acc; +flatb([H|T],Acc) -> + NewAcc = flatb(H,Acc), + flatb(T,NewAcc); +flatb([],Acc) -> + Acc; +flatb(X,Acc) -> + [X|Acc]. +flatx(List) -> + lists:reverse(flatx(List,[])). + +flatx([B1,B2|T],Acc) when is_binary(B1), is_binary(B2) -> + flatx([<>|T],Acc); +flatx([H|T],Acc) -> + NewAcc = flatx(H,Acc), + flatx(T,NewAcc); +flatx([],Acc) -> + Acc; +flatx(X,Acc) -> + [X|Acc]. + + +unicode_mixed_to_utf8_1(L) -> + Flist = flatx([L]), + ExpList = [ case is_binary(E) of + true -> + utf8_to_list(E); + false -> + E + end || E <- Flist ], + iolist_to_binary([int_to_utf8(I) || I <- flat(ExpList)]). + +unicode_mixed_to_utf8_2(L) -> + Flist = flatx([L]), + ExpList = [ case is_binary(E) of + true -> + E; + false -> + int_to_utf8(E) + end || E <- Flist ], + iolist_to_binary([ExpList]). + + + + +utf8_to_list_bsyntax(<<>>) -> + []; +utf8_to_list_bsyntax(<>) -> + [C|utf8_to_list_bsyntax(R)]. + +list_to_utf8_bsyntax(List,unicode) -> + FList = flatx(List), + erlang:concat_binary([ if + is_binary(E) -> + E; + true -> + <> + end || E <- FList ]); +list_to_utf8_bsyntax(List,latin1) -> + FList = flatb(List), + erlang:concat_binary([ <> || E <- FList ]). + + + + + +%% +%% Conversion utilities +%% + +int_to_utf16_big(U) when U < 16#10000 -> + <>; +int_to_utf16_big(U) when U >= 16#10000, U =< 16#10FFFF -> + UPrim = U - 16#10000, + HI = (16#D800 bor (UPrim bsr 10)), + LO = (16#DC00 bor (UPrim band 16#3FF)), + <>. + +int_to_utf16_little(U) when U < 16#10000 -> + <>; +int_to_utf16_little(U) when U >= 16#10000, U =< 16#10FFFF -> + UPrim = U - 16#10000, + HI = (16#D800 bor (UPrim bsr 10)), + LO = (16#DC00 bor (UPrim band 16#3FF)), + <>. + + +%% This function intentionally allows construction of +%% UTF-8 sequence in illegal ranges. +int_to_utf8(I) when I =< 16#7F -> + <>; +int_to_utf8(I) when I =< 16#7FF -> + B2 = I, + B1 = (I bsr 6), + <<1:1,1:1,0:1,B1:5,1:1,0:1,B2:6>>; +int_to_utf8(I) when I =< 16#FFFF -> + B3 = I, + B2 = (I bsr 6), + B1 = (I bsr 12), + <<1:1,1:1,1:1,0:1,B1:4,1:1,0:1,B2:6,1:1,0:1,B3:6>>; +int_to_utf8(I) when I =< 16#3FFFFF -> + B4 = I, + B3 = (I bsr 6), + B2 = (I bsr 12), + B1 = (I bsr 18), + <<1:1,1:1,1:1,1:1,0:1,B1:3,1:1,0:1,B2:6,1:1,0:1,B3:6,1:1,0:1,B4:6>>; +int_to_utf8(I) when I =< 16#3FFFFFF -> + B5 = I, + B4 = (I bsr 6), + B3 = (I bsr 12), + B2 = (I bsr 18), + B1 = (I bsr 24), + <<1:1,1:1,1:1,1:1,1:1,0:1,B1:2,1:1,0:1,B2:6,1:1,0:1,B3:6,1:1,0:1,B4:6, + 1:1,0:1,B5:6>>. + +utf16_big_to_list_bsyntax(<<>>) -> + []; +utf16_big_to_list_bsyntax(<>) -> + [C|utf16_big_to_list_bsyntax(R)]. + +list_to_utf16_big_bsyntax(List,{utf16,big}) -> + FList = flatx(List), + erlang:concat_binary([ if + is_binary(E) -> + E; + true -> + <> + end || E <- FList ]); +list_to_utf16_big_bsyntax(List,latin1) -> + FList = flatb(List), + erlang:concat_binary([ <> || E <- FList ]). + + +utf16_little_to_list_bsyntax(<<>>) -> + []; +utf16_little_to_list_bsyntax(<>) -> + [C|utf16_little_to_list_bsyntax(R)]. + +list_to_utf16_little_bsyntax(List,{utf16,little}) -> + FList = flatx(List), + erlang:concat_binary([ if + is_binary(E) -> + E; + true -> + <> + end || E <- FList ]); +list_to_utf16_little_bsyntax(List,latin1) -> + FList = flatb(List), + erlang:concat_binary([ <> || E <- FList ]). + + + +utf32_big_to_list_bsyntax(<<>>) -> + []; +utf32_big_to_list_bsyntax(<>) -> + [C|utf32_big_to_list_bsyntax(R)]. + +list_to_utf32_big_bsyntax(List,{utf32,big}) -> + FList = flatx(List), + erlang:concat_binary([ if + is_binary(E) -> + E; + true -> + <> + end || E <- FList ]); +list_to_utf32_big_bsyntax(List,latin1) -> + FList = flatb(List), + erlang:concat_binary([ <> || E <- FList ]). + + +utf32_little_to_list_bsyntax(<<>>) -> + []; +utf32_little_to_list_bsyntax(<>) -> + [C|utf32_little_to_list_bsyntax(R)]. + +list_to_utf32_little_bsyntax(List,{utf32,little}) -> + FList = flatx(List), + erlang:concat_binary([ if + is_binary(E) -> + E; + true -> + <> + end || E <- FList ]); +list_to_utf32_little_bsyntax(List,latin1) -> + FList = flatb(List), + erlang:concat_binary([ <> || E <- FList ]). + + + +%% int_to_utf8(I, NumberOfBytes) -> Binary. +%% This function can be used to construct overlong sequences. +int_to_utf8(I, 1) -> + <>; +int_to_utf8(I, 2) -> + B2 = I, + B1 = (I bsr 6), + <<1:1,1:1,0:1,B1:5,1:1,0:1,B2:6>>; +int_to_utf8(I, 3) -> + B3 = I, + B2 = (I bsr 6), + B1 = (I bsr 12), + <<1:1,1:1,1:1,0:1,B1:4,1:1,0:1,B2:6,1:1,0:1,B3:6>>; +int_to_utf8(I, 4) -> + B4 = I, + B3 = (I bsr 6), + B2 = (I bsr 12), + B1 = (I bsr 18), + <<1:1,1:1,1:1,1:1,0:1,B1:3,1:1,0:1,B2:6,1:1,0:1,B3:6,1:1,0:1,B4:6>>. + +utf8_to_list(<<>>) -> + []; +utf8_to_list(Bin) -> + N = utf8_siz(Bin), + <> = Bin, + [utf8_to_int(X) | utf8_to_list(Rest)]. +utf8_siz(<<0:1,_:7,_/binary>>) -> + 1; +utf8_siz(<<1:1,1:1,0:1,_:5,_/binary>>) -> + 2; +utf8_siz(<<1:1,1:1,1:1,0:1,_:4,_/binary>>) -> + 3; +utf8_siz(<<1:1,1:1,1:1,1:1,0:1,_:3,_/binary>>) -> + 4. + +utf8_to_int(<<0:1,B:7>>) -> + B; +utf8_to_int(<<1:1,1:1,0:1,B1:5,1:1,0:1,B2:6>>) -> + (B1 bsl 6) bor B2; +utf8_to_int(<<1:1,1:1,1:1,0:1,B1:4,1:1,0:1,B2:6,1:1,0:1,B3:6>>) -> + (B1 bsl 12) bor (B2 bsl 6) bor B3; +utf8_to_int(<<1:1,1:1,1:1,1:1,0:1,B1:3,1:1,0:1, + B2:6,1:1,0:1,B3:6,1:1,0:1,B4:6>>) -> + Res = (B1 bsl 18) bor (B2 bsl 12) bor (B3 bsl 6) bor B4, + case Res of + X when X > 16#10FFFF -> + exit(unsupported_utf8); + Other -> + Other + end; +utf8_to_int(_) -> + exit(unsupported_utf8). + + +utf16_big_to_list(<<>>) -> + []; +utf16_big_to_list(Bin) -> + N = utf16_big_siz(Bin), + <> = Bin, + [utf16_big_to_int(X) | utf16_big_to_list(Rest)]. + +utf16_big_siz(<<1:1,1:1,0:1,1:1,1:1,0:1,_:1,_:1,_/binary>>) -> + 4; +utf16_big_siz(_) -> + 2. + +utf16_big_to_int(<<1:1,1:1,0:1,1:1,1:1,0:1,W1:10,1:1,1:1,0:1,1:1,1:1,1:1,W2:10>>) -> + ((W1 bsl 10) bor W2) + 16#10000; +utf16_big_to_int(<>) -> + W; +utf16_big_to_int(_) -> + exit(unsupported_utf16_big). + +utf16_little_to_list(<<>>) -> + []; +utf16_little_to_list(Bin) -> + N = utf16_little_siz(Bin), + <> = Bin, + [utf16_little_to_int(X) | utf16_little_to_list(Rest)]. +utf16_little_siz(<<_:8,1:1,1:1,0:1,1:1,1:1,0:1,_:1,_:1,_/binary>>) -> + 4; +utf16_little_siz(_) -> + 2. + +utf16_little_to_int(<>) -> + W1 = (W1A bsl 8) bor W1B, + W2 = (W2A bsl 8) bor W2B, + ((W1 bsl 10) bor W2) + 16#10000; +utf16_little_to_int(<>) -> + W; +utf16_little_to_int(_) -> + exit(unsupported_utf16_little). + +utf32_big_to_list(<<>>) -> + []; +utf32_big_to_list(<>) -> + [ I | utf32_big_to_list(Rest)]. +utf32_little_to_list(<<>>) -> + []; +utf32_little_to_list(<>) -> + [ I | utf32_little_to_list(Rest)]. + + +x_to_list_bsyntax(utf8,Bin) -> + utf8_to_list_bsyntax(Bin); +x_to_list_bsyntax({utf16,big},Bin) -> + utf16_big_to_list_bsyntax(Bin); +x_to_list_bsyntax({utf16,little},Bin) -> + utf16_little_to_list_bsyntax(Bin); +x_to_list_bsyntax({utf32,big},Bin) -> + utf32_big_to_list_bsyntax(Bin); +x_to_list_bsyntax({utf32,little},Bin) -> + utf32_little_to_list_bsyntax(Bin). + +list_to_x_bsyntax(utf8,L,utf8) -> + list_to_utf8_bsyntax(L,unicode); +list_to_x_bsyntax(utf8,L,Enc) -> + list_to_utf8_bsyntax(L,Enc); +list_to_x_bsyntax({utf16,big},L,Enc) -> + list_to_utf16_big_bsyntax(L,Enc); +list_to_x_bsyntax({utf16,little},L,Enc) -> + list_to_utf16_little_bsyntax(L,Enc); +list_to_x_bsyntax({utf32,big},L,Enc) -> + list_to_utf32_big_bsyntax(L,Enc); +list_to_x_bsyntax({utf32,little},L,Enc) -> + list_to_utf32_little_bsyntax(L,Enc). + + +make_unaligned(Bin0) when is_binary(Bin0) -> +% put(c_count,get(c_count)+1), + Bin1 = <<0:3,Bin0/binary,31:5>>, + Sz = byte_size(Bin0), + <<0:3,Bin:Sz/binary,31:5>> = id(Bin1), + Bin. + +id(I) -> I. + +setlimit(X) -> + erts_debug:set_internal_state(available_internal_state,true), + io:format("Setting loop limit, old: ~p, now set to ~p~n", + [erts_debug:set_internal_state(unicode_loop_limit,X),X]). + + +%% +%% Tracing utility +%% + +%% tr_dump() -> +%% erlang:display(lists:sort(ets:tab2list(values))). + +%% tr_off(Pid) -> +%% receive after 10000 -> ok end, +%% tr_dump(), +%% Ref = erlang:monitor(process,Pid), +%% exit(Pid,kill), +%% receive +%% {'DOWN',Ref,_,_,_} -> ok +%% end, +%% ok. + +%% tr_on() -> +%% catch ets:delete(values), +%% ets:new(values,[named_table,public]), +%% ets:insert(values,{traps,0}), +%% catch ets:delete(state), +%% ets:new(state,[named_table,public]), +%% Pid = spawn(?MODULE,trace_recv,[values,state]), +%% erlang:trace(new,true,[garbage_collection,{tracer,Pid},timestamp,call]), +%% erlang:trace_pattern({erlang,list_to_utf8,2},[{'_',[],[{return_trace}]}],[global]), +%% Pid. + +%% ts_to_int({Mega,Sec,Micro}) -> +%% ((Mega * 1000000) + Sec) * 1000000 + Micro. + +%% trace_recv(Values,State) -> +%% receive +%% {trace_ts,Pid,call,_,TS} -> +%% case ets:lookup(State,{call,Pid}) of +%% [{{call,Pid},_}] -> +%% ets:update_counter(values,traps,1); +%% _ -> +%% ok +%% end, +%% ets:insert(State,{{call,Pid},ts_to_int(TS)}); +%% {trace_ts,Pid,return_from,_,_,TS} -> +%% case ets:lookup(State,{call,Pid}) of +%% [{{call,Pid},TS2}] -> +%% ets:delete(State,{call,Pid}), +%% Elapsed = ts_to_int(TS) - TS2, +%% case ets:lookup(Values,Pid) of +%% [{Pid,GCNum,CallNum,GCTime,CallTime}] -> +%% ets:insert(Values,{Pid,GCNum,CallNum+1,GCTime,CallTime+Elapsed}); +%% [] -> +%% ets:insert(Values,{Pid,0,1,0,Elapsed}) +%% end; +%% _Other -> +%% erlang:display({what2,Pid}) +%% end; +%% {trace_ts,Pid,gc_start,_,TS} -> +%% ets:insert(State,{{gc,Pid},ts_to_int(TS)}); +%% {trace_ts,Pid,gc_end,_,TS} -> +%% case ets:lookup(State,{gc,Pid}) of +%% [{{gc,Pid},TS2}] -> +%% ets:delete(State,{gc,Pid}), +%% Elapsed = ts_to_int(TS) - TS2, +%% case ets:lookup(Values,Pid) of +%% [{Pid,Num,CNum,Time,CTime}] -> +%% ets:insert(Values,{Pid,Num+1,CNum,Time+Elapsed,CTime}); +%% [] -> +%% ets:insert(Values,{Pid,1,0,Elapsed,0}) +%% end; +%% _Other -> +%% erlang:display({what,Pid}) +%% end; +%% X -> +%% erlang:display({trace_recv,X}) +%% end, +%% trace_recv(Values,State). diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/win32reg_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/win32reg_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/win32reg_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/win32reg_SUITE.erl 2009-11-20 13:30:24.000000000 +0000 @@ -0,0 +1,89 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(win32reg_SUITE). + +-export([all/1,long/1,evil_write/1]). +-export([ostype/1,fini/1]). + +-include("test_server.hrl"). + +all(suite) -> + [{conf,ostype,[long,evil_write],fini}]. + +ostype(Config) when is_list(Config) -> + case os:type() of + {win32, _} -> + Config; + _ -> + {skip,"Doesn't run on UNIX."} + end. +fini(Config) when is_list(Config) -> + Config. + +long(doc) -> "Test long keys and entries (OTP-3446)."; +long(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + + ?line LongKey = "software\\" ++ + lists:flatten(lists:duplicate(10, "..\\software\\")) ++ + "Ericsson\\Erlang", + ?line {ok,Reg} = win32reg:open([read,write]), + ?line ok = win32reg:change_key(Reg, "\\hklm"), + ?line ok = win32reg:change_key(Reg, LongKey), + ?line {ok,ErlangKey} = win32reg:current_key(Reg), + io:format("Erlang key: ~s", [ErlangKey]), + + %% Write a long value and read it back. + ?line TestKey = "test_key", + ?line LongValue = lists:concat(["This is a long value generated by the test case ",?MODULE,":long/1. "|lists:duplicate(128, "a")]), + ?line ok = win32reg:set_value(Reg, TestKey, LongValue), + ?line {ok,LongValue} = win32reg:value(Reg, TestKey), + + %% Done. + + ?line ok = win32reg:close(Reg), + ?line test_server:timetrap_cancel(Dog), + ok. + +evil_write(Config) when list(Config) -> + ?line Dog = test_server:timetrap(test_server:seconds(10)), + + ?line Key = "Software\\Ericsson\\Erlang", + ?line {ok,Reg} = win32reg:open([read,write]), + ?line ok = win32reg:change_key(Reg, "\\hklm"), + ?line ok = win32reg:change_key(Reg, Key), + ?line {ok,ErlangKey} = win32reg:current_key(Reg), + io:format("Erlang key: ~s", [ErlangKey]), + + %% Write keys with different length and read it back. + ?line TestKey = "test_key " ++ lists:duplicate(128, $a), + evil_write_1(Reg, TestKey), + + %% Done. + ?line ok = win32reg:close(Reg), + ?line test_server:timetrap_cancel(Dog), + ok. + +evil_write_1(Reg, [_|[_|_]=Key]=Key0) -> + ?line io:format("Key = ~p\n", [Key0]), + ?line ok = win32reg:set_value(Reg, Key0, "A good value for me"), + ?line {ok,_Val} = win32reg:value(Reg, Key0), + ?line ok = win32reg:delete_value(Reg, Key0), + evil_write_1(Reg, Key); +evil_write_1(_, [_]) -> ok. diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/y2k_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/y2k_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/y2k_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/y2k_SUITE.erl 2009-11-20 13:30:45.000000000 +0000 @@ -0,0 +1,185 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% File: y2k_SUITE.erl +%% Purpose: Year 2000 tests. + +-module(y2k_SUITE). + +-include("test_server.hrl"). + +-export([all/1, + date_1999_01_01/1, date_1999_02_28/1, + date_1999_09_09/1, date_2000_01_01/1, + date_2000_02_29/1, date_2001_01_01/1, + date_2001_02_29/1, date_2004_02_29/1 + ]). + +all(doc) -> + "This is the test suite for year 2000. Eight dates according " + "to Ericsson Corporate Millennium Test Specification " + "(LME/DT-98:1097 are tested."; + +all(suite) -> + [date_1999_01_01, + date_1999_02_28, + date_1999_09_09, + date_2000_01_01, + date_2000_02_29, + date_2001_01_01, + date_2001_02_29, + date_2004_02_29 + ]. + +date_1999_01_01(doc) -> + "#1 : 1999-01-01: test roll-over from 1998-12-31 to 1999-01-01."; +date_1999_01_01(suite) -> + []; +date_1999_01_01(Config) when is_list(Config) -> + ?line Date = {1998, 12, 31}, NextDate = {1999, 1, 1}, + ?line match(next_date(Date), NextDate), + TZD = tzd(Date), + if + TZD > 0 -> + ?line Time = {24 - TZD, 0, 0}, + ?line {NDate, _NTime} = + erlang:localtime_to_universaltime({Date, Time}), + ?line match(NDate, NextDate); + TZD < 0 -> + ?line Time = {24 + TZD, 0, 0}, + ?line {NDate, _NTime} = + erlang:universaltime_to_localtime({Date, Time}), + ?line match(NDate, NextDate); + true -> + ok + end. + +date_1999_02_28(doc) -> + "#2 : 1999-02-28: test roll-over from 1999-02-28 to 1999-03-01."; +date_1999_02_28(suite) -> + []; +date_1999_02_28(Config) when is_list(Config) -> + ?line Date = {1999, 2, 28}, NextDate = {1999, 3, 1}, + ?line match(next_date(Date), NextDate), + ?line match(tz_next_date(Date), NextDate). + +date_1999_09_09(doc) -> + "#3 : 1999-09-09: test roll-over from 1999-09-08 to 1999-09-09."; +date_1999_09_09(suite) -> + []; +date_1999_09_09(Config) when is_list(Config) -> + ?line Date = {1999, 9, 8}, NextDate = {1999, 9, 9}, + ?line match(next_date(Date), NextDate), + ?line match(tz_next_date(Date), NextDate). + +date_2000_01_01(doc) -> + "#4 : 2000-01-01: test roll-over from 1999-12-31 to 2000-01-01 to " + "2000-01-02."; +date_2000_01_01(suite) -> + []; +date_2000_01_01(Config) when is_list(Config) -> + ?line Date = {1999, 12, 31}, NextDate = {2000, 1, 1}, + ?line match(next_date(Date), NextDate), + ?line match(tz_next_date(Date), NextDate), + ?line NextDate1 = {2000, 1, 2}, + ?line match(next_date(NextDate), NextDate1), + ?line match(tz_next_date(NextDate), NextDate1). + +date_2000_02_29(doc) -> + "#5 : 2000-02-29: test roll-over from 2000-02-28 to 2000-02-29 to " + "2000-03-01."; +date_2000_02_29(suite) -> + []; +date_2000_02_29(Config) when is_list(Config) -> + ?line Date = {2000, 2, 28}, NextDate = {2000, 2, 29}, + ?line match(next_date(Date), NextDate), + ?line match(tz_next_date(Date), NextDate), + ?line NextDate1 = {2000, 3, 1}, + ?line match(next_date(NextDate), NextDate1), + ?line match(tz_next_date(NextDate), NextDate1). + +date_2001_01_01(doc) -> + "#6 : 2001-01-01: test roll-over from 2000-12-31 to 2001-01-01."; +date_2001_01_01(suite) -> + []; +date_2001_01_01(Config) when is_list(Config) -> + ?line Date = {2000, 12, 31}, NextDate = {2001, 1, 1}, + ?line match(next_date(Date), NextDate), + ?line match(tz_next_date(Date), NextDate). + +date_2001_02_29(doc) -> + "#7 : 2001-02-29: test roll-over from 2001-02-28 to 2001-03-01."; +date_2001_02_29(suite) -> + []; +date_2001_02_29(Config) when is_list(Config) -> + ?line Date = {2001, 2, 28}, NextDate = {2001, 3, 1}, + ?line match(next_date(Date), NextDate), + ?line match(tz_next_date(Date), NextDate). + +date_2004_02_29(doc) -> + "#8 : 2004-02-29: test roll-over from 2004-02-28 to 2004-02-29 to " + "2004-03-01."; +date_2004_02_29(suite) -> + []; +date_2004_02_29(Config) when is_list(Config) -> + ?line Date = {2004, 2, 28}, NextDate = {2004, 2, 29}, + ?line match(next_date(Date), NextDate), + ?line match(tz_next_date(Date), NextDate), + ?line NextDate1 = {2004, 3, 1}, + ?line match(next_date(NextDate), NextDate1), + ?line match(tz_next_date(NextDate), NextDate1). + +%% +%% Local functions +%% +next_date(Date) -> + calendar:gregorian_days_to_date(calendar:date_to_gregorian_days(Date) + 1). +%% +%% timezonediff +%% +tzd(Date) -> + ?line {_LDate, {LH, _LM, _LS}} = + erlang:universaltime_to_localtime({Date, {12, 0, 0}}), + 12 - LH. + +tz_next_date(Date) -> + TZD = tzd(Date), + if + TZD > 0 -> + ?line Time = {24 - TZD, 0, 0}, + ?line {NDate, _NTime} = + erlang:localtime_to_universaltime({Date, Time}), + ?line NDate; + TZD < 0 -> + ?line Time = {24 + TZD, 0, 0}, + ?line {NDate, _NTime} = + erlang:universaltime_to_localtime({Date, Time}), + ?line NDate; + true -> + Date + end. + +%% +%% match({X, X}) -> +%% ok. + +match(X, X) -> + ok. + + + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/abc.txt erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/abc.txt --- erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/abc.txt 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/abc.txt 2006-05-03 09:14:10.000000000 +0100 @@ -0,0 +1,23 @@ +Introduction + +abc is a language designed to notate tunes in an ascii +format. It was designed primarily for folk and traditional tunes of +Western European origin (such as English, Irish and Scottish) which +can be written on one stave in standard classical notation. However, +it is extendible to many other types of music and recently Steve Allen +has coded Beethoven's Symphony No. 7, Movement 2 in abc! Since its +introduction at the end of 1991 it has become very popular and there +now exist several Windows, Mac, Palmtop and UNIX based tools which can +read abc notation and either process it into staff notation or play it +through the speakers of a computer. + +One of the most important aims of abc notation, and perhaps one that +distinguishes it from most, if not all, computer-readable musical +languages is that it can be easily read by humans. In other words, +with a little practice, it is possible to play a tune directly from +the abc notation without having to process and print it out. Even if +this isn't of interest, the resulting clarity of the notation makes it +fairly easy to notate tunes. In addition, the ability to write music +in abc notation means that it can be easily and portably stored or +transported electronically hence enabling the discussion and +dissemination of music via email. \ No newline at end of file Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/abc.zip and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/abc.zip differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/bad_central_directory.zip and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/bad_central_directory.zip differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/bad_crc.zip and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/bad_crc.zip differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/bad_eocd.zip and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/bad_eocd.zip differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/bad_file_header.zip and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/bad_file_header.zip differ diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/META-INF/MANIFEST.MF erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/META-INF/MANIFEST.MF --- erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/META-INF/MANIFEST.MF 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/META-INF/MANIFEST.MF 2009-03-12 12:21:55.000000000 +0000 @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.4.2_08 (Sun Microsystems Inc.) + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/quotes/rain.txt erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/quotes/rain.txt --- erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/quotes/rain.txt 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/quotes/rain.txt 2009-03-12 12:21:51.000000000 +0000 @@ -0,0 +1 @@ +The rain in Spain stays mainly in the plain Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/test.jar and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/test.jar differ diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/test.txt erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/test.txt --- erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/test.txt 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/test.txt 2009-03-12 12:21:55.000000000 +0000 @@ -0,0 +1 @@ +Lorem Ipsum osv osv \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/wikipedia.txt erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/wikipedia.txt --- erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE_data/wikipedia.txt 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE_data/wikipedia.txt 2009-03-12 12:21:51.000000000 +0000 @@ -0,0 +1,30 @@ +The ZIP file format is a popular lossless data compression and +archival format. A ZIP file contains one or more files that have been +compressed, to reduce their file size, or stored as-is. A number of +compression algorithms are permitted in zip files but as of 2008 only +DEFLATE is widely used and supported. + +The format was originally evolved by Phil Katz for PKZIP from the +previous ARC compression format by Thom Henderson. However, many +software utilities other than PKZIP itself are now available to +create, modify, or open (unzip, decompress) ZIP files, notably WinZip, +BOMArchiveHelper, KGB Archiver, PicoZip, Info-ZIP, WinRAR, IZArc, +7-Zip, ALZip, TUGZip, PeaZip, Universal Extractor and Zip +Genius. Microsoft has included built-in ZIP support (under the name +"compressed folders") in later versions of its Windows operating +system. Apple has included built-in ZIP support in Mac OS X 10.3 and +later via the BOMArchiveHelper utility. + +ZIP files generally use the file extensions ".zip" or ".ZIP" and the +MIME media type application/zip. Some software uses the ZIP file +format as a wrapper for a large number of small items in a specific +structure. Generally when this is done a different file extension is +used. Examples of this usage are Java JAR files, id Software .pk3/.pk4 +files, package files for StepMania and Winamp/Windows Media Player +skins, XPInstall, as well as OpenDocument and Office Open XML office +formats. Both OpenDocument and Office Open XML formats use the JAR +file format internally, so files can be easily uncompressed and +compressed using tools for ZIP files. Google Earth makes use of KMZ +files, which are just KML files in ZIP format. Mozilla Firefox Add-ons +are zip files with extension "xpi". Nokia's mobile phone themes are +zipped with extension "nth". diff -Nru erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE.erl erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE.erl --- erlang-13.b.1-dfsg/lib/stdlib/test/zip_SUITE.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/test/zip_SUITE.erl 2009-11-20 13:32:19.000000000 +0000 @@ -0,0 +1,759 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(zip_SUITE). + +-export([all/1, borderline/1, atomic/1, + bad_zip/1, unzip_from_binary/1, unzip_to_binary/1, + zip_to_binary/1, + unzip_options/1, zip_options/1, list_dir_options/1, aliases/1, + openzip_api/1, zip_api/1, unzip_jar/1, + compress_control/1]). + +-include("test_server.hrl"). +-include("test_server_line.hrl"). +-include_lib("kernel/include/file.hrl"). +-include_lib("stdlib/include/zip.hrl"). + +all(suite) -> [borderline, atomic, bad_zip, + unzip_from_binary, unzip_to_binary, + zip_to_binary, + unzip_options, zip_options, list_dir_options, aliases, + openzip_api, zip_api, unzip_jar, + compress_control]. + +borderline(doc) -> + ["Test creating, listing and extracting one file from an archive " + "multiple times with different file sizes. Also check that the " + "modification date of the extracted file has survived."]; +borderline(Config) when is_list(Config) -> + RootDir = ?config(priv_dir, Config), + TempDir = filename:join(RootDir, "borderline"), + ok = file:make_dir(TempDir), + + Record = 512, + Block = 20 * Record, + + lists:foreach(fun(Size) -> borderline_test(Size, TempDir) end, + [0, 1, 10, 13, 127, 333, Record-1, Record, Record+1, + Block-Record-1, Block-Record, Block-Record+1, + Block-1, Block, Block+1, + Block+Record-1, Block+Record, Block+Record+1]), + + %% Clean up. + delete_files([TempDir]), + ok. + +borderline_test(Size, TempDir) -> + Archive = filename:join(TempDir, "ar_"++integer_to_list(Size)++".zip"), + Name = filename:join(TempDir, "file_"++integer_to_list(Size)), + io:format("Testing size ~p", [Size]), + + %% Create a file and archive it. + {_, _, X0} = erlang:now(), + file:write_file(Name, random_byte_list(X0, Size)), + {ok, Archive} = zip:zip(Archive, [Name]), + ok = file:delete(Name), + + %% Verify listing and extracting. + {ok, [#zip_comment{comment = []}, + #zip_file{name = Name, + info = Info, + offset = 0, + comp_size = _}]} = zip:list_dir(Archive), + Size = Info#file_info.size, + {ok, [Name]} = zip:extract(Archive, [verbose]), + + %% Verify contents of extracted file. + {ok, Bin} = file:read_file(Name), + true = match_byte_list(X0, binary_to_list(Bin)), + + + %% Verify that Unix zip can read it. (if we have a unix zip that is!) + unzip_list(Archive, Name), + + ok. + +unzip_list(Archive, Name) -> + case os:find_executable("unzip") of + Unzip when is_list(Unzip) -> + unzip_list1(Archive, Name); + _ -> + ok + end. + +unzip_list1(Archive, Name) -> + Expect = Name ++ "\n", + cmd_expect("unzip -Z -1 " ++ Archive, Expect). + +cmd_expect(Cmd, Expect) -> + Port = open_port({spawn, make_cmd(Cmd)}, [stream, in, eof]), + get_data(Port, Expect). + +get_data(Port, Expect) -> + receive + {Port, {data, Bytes}} -> + get_data(Port, match_output(Bytes, Expect, Port)); + {Port, eof} -> + Port ! {self(), close}, + receive + {Port, closed} -> + true + end, + receive + {'EXIT', Port, _} -> + ok + after 1 -> % force context switch + ok + end, + match_output(eof, Expect, Port) + end. + +match_output([C|Output], [C|Expect], Port) -> + match_output(Output, Expect, Port); +match_output([_|_], [_|_], Port) -> + kill_port_and_fail(Port, badmatch); +match_output([X|Output], [], Port) -> + kill_port_and_fail(Port, {too_much_data, [X|Output]}); +match_output([], Expect, _Port) -> + Expect; +match_output(eof, [], _Port) -> + []; +match_output(eof, Expect, Port) -> + kill_port_and_fail(Port, {unexpected_end_of_input, Expect}). + +kill_port_and_fail(Port, Reason) -> + unlink(Port), + exit(Port, die), + test_server:fail(Reason). + +make_cmd(Cmd) -> + Cmd. +%% case os:type() of +%% {win32, _} -> lists:concat(["cmd /c", Cmd]); +%% {unix, _} -> lists:concat(["sh -c '", Cmd, "'"]) +%% end. + +%% Verifies a random byte list. + +match_byte_list(X0, [Byte|Rest]) -> + X = next_random(X0), + case (X bsr 26) band 16#ff of + Byte -> match_byte_list(X, Rest); + _ -> false + end; +match_byte_list(_, []) -> + true. + +%% Generates a random byte list. + +random_byte_list(X0, Count) -> + random_byte_list(X0, Count, []). + +random_byte_list(X0, Count, Result) when Count > 0-> + X = next_random(X0), + random_byte_list(X, Count-1, [(X bsr 26) band 16#ff|Result]); +random_byte_list(_X, 0, Result) -> + lists:reverse(Result). + +%% This RNG is from line 21 on page 102 in Knuth: The Art of Computer Programming, +%% Volume II, Seminumerical Algorithms. + +next_random(X) -> + (X*17059465+1) band 16#fffffffff. + +atomic(doc) -> + ["Test the 'atomic' operations: zip/unzip/list_dir, on archives." + "Also test the 'cooked' option."]; +atomic(suite) -> []; +atomic(Config) when list(Config) -> + ok = file:set_cwd(?config(priv_dir, Config)), + DataFiles = data_files(), + Names = [Name || {Name,_,_} <- DataFiles], + io:format("Names: ~p", [Names]), + + %% Create a zip archive. + + Zip2 = "zip.zip", + {ok, Zip2} = zip:zip(Zip2, Names, []), + Names = names_from_list_dir(zip:list_dir(Zip2)), + + %% Same test again, but this time created with 'cooked' + + Zip3 = "cooked.zip", + {ok, Zip3} = zip:zip(Zip3, Names, [cooked]), + Names = names_from_list_dir(zip:list_dir(Zip3)), + Names = names_from_list_dir(zip:list_dir(Zip3, [cooked])), + + %% Clean up. + delete_files([Zip2,Zip3|Names]), + + ok. + +openzip_api(doc) -> + ["Test the openzip_open/2, openzip_get/1, openzip_get/2, openzip_close/1 " + "and openzip_list_dir/1 functions."]; +openzip_api(suite) -> []; +openzip_api(Config) when list(Config) -> + ok = file:set_cwd(?config(priv_dir, Config)), + DataFiles = data_files(), + Names = [Name || {Name, _, _} <- DataFiles], + io:format("Names: ~p", [Names]), + + %% Create a zip archive + + Zip = "zip.zip", + {ok, Zip} = zip:zip(Zip, Names, []), + + %% Open archive + {ok, OpenZip} = zip:openzip_open(Zip, [memory]), + + %% List dir + Names = names_from_list_dir(zip:openzip_list_dir(OpenZip)), + + %% Get a file + Name1 = hd(Names), + {ok, Data1} = file:read_file(Name1), + {ok, {Name1, Data1}} = zip:openzip_get(Name1, OpenZip), + + %% Get all files + FilesDatas = lists:map(fun(Name) -> {ok, B} = file:read_file(Name), + {Name, B} end, Names), + {ok, FilesDatas} = zip:openzip_get(OpenZip), + + %% Close + ok = zip:openzip_close(OpenZip), + + %% Clean up. + delete_files([Names]), + + ok. + +zip_api(doc) -> + ["Test the zip_open/2, zip_get/1, zip_get/2, zip_close/1 " + "and zip_list_dir/1 functions."]; +zip_api(suite) -> []; +zip_api(Config) when list(Config) -> + ok = file:set_cwd(?config(priv_dir, Config)), + DataFiles = data_files(), + Names = [Name || {Name, _, _} <- DataFiles], + io:format("Names: ~p", [Names]), + + %% Create a zip archive + Zip = "zip.zip", + {ok, Zip} = zip:zip(Zip, Names, []), + + %% Open archive + {ok, ZipSrv} = zip:zip_open(Zip, [memory]), + + %% List dir + Names = names_from_list_dir(zip:zip_list_dir(ZipSrv)), + + %% Get a file + Name1 = hd(Names), + {ok, Data1} = file:read_file(Name1), + {ok, {Name1, Data1}} = zip:zip_get(Name1, ZipSrv), + + %% Get all files + FilesDatas = lists:map(fun(Name) -> {ok, B} = file:read_file(Name), + {Name, B} end, Names), + {ok, FilesDatas} = zip:zip_get(ZipSrv), + + %% Close + ok = zip:zip_close(ZipSrv), + + %% Clean up. + delete_files([Names]), + + ok. + +unzip_options(doc) -> + ["Test options for unzip, only cwd and file_list currently"]; +unzip_options(suite) -> + []; +unzip_options(Config) when is_list(Config) -> + DataDir = ?config(data_dir, Config), + PrivDir = ?config(priv_dir, Config), + Long = filename:join(DataDir, "abc.zip"), + + %% create a temp directory + Subdir = filename:join(PrivDir, "t"), + ok = file:make_dir(Subdir), + + FList = ["quotes/rain.txt","wikipedia.txt"], + + %% Unzip a zip file in Subdir + ?line {ok, RetList} = zip:unzip(Long, [{cwd, Subdir}, + {file_list, FList}]), + + %% Verify. + ?line true = (length(FList) =:= length(RetList)), + ?line lists:foreach(fun(F)-> {ok,B} = file:read_file(filename:join(DataDir, F)), + {ok,B} = file:read_file(filename:join(Subdir, F)) end, + FList), + ?line lists:foreach(fun(F)-> ok = file:delete(F) end, + RetList), + + %% Clean up and verify no more files. + ?line 0 = delete_files([Subdir]), + ok. + +unzip_jar(doc) -> + ["Test unzip a jar file (OTP-7382)"]; +unzip_jar(suite) -> + []; +unzip_jar(Config) when is_list(Config) -> + DataDir = ?config(data_dir, Config), + PrivDir = ?config(priv_dir, Config), + JarFile = filename:join(DataDir, "test.jar"), + + %% create a temp directory + Subdir = filename:join(PrivDir, "jartest"), + ok = file:make_dir(Subdir), + ok = file:set_cwd(Subdir), + + FList = ["META-INF/MANIFEST.MF","test.txt"], + + {ok, RetList} = zip:unzip(JarFile), + + %% Verify. + ?line lists:foreach(fun(F)-> {ok,B} = file:read_file(filename:join(DataDir, F)), + {ok,B} = file:read_file(filename:join(Subdir, F)) end, + FList), + ?line lists:foreach(fun(F)-> ok = file:delete(F) end, + RetList), + + %% Clean up and verify no more files. + ?line 0 = delete_files([Subdir]), + ok. + +zip_options(doc) -> + ["Test the options for unzip, only cwd currently"]; +zip_options(suite) -> + []; +zip_options(Config) when is_list(Config) -> + PrivDir = ?config(priv_dir, Config), + ok = file:set_cwd(PrivDir), + DataFiles = data_files(), + Names = [Name || {Name, _, _} <- DataFiles], + + %% Make sure cwd is not where we get the files + ok = file:set_cwd(?config(data_dir, Config)), + + %% Create a zip archive + {ok, Zip} = zip:zip("filename_not_used.zip", Names, [memory, {cwd, PrivDir}]), + + %% Open archive + {ok, ZipSrv} = zip:zip_open(Zip, [memory]), + + %% List dir + Names = names_from_list_dir(zip:zip_list_dir(ZipSrv)), + + %% Get a file + Name1 = hd(Names), + {ok, Data1} = file:read_file(filename:join(PrivDir, Name1)), + {ok, {Name1, Data1}} = zip:zip_get(Name1, ZipSrv), + + %% Get all files + FilesDatas = lists:map(fun(Name) -> {ok, B} = file:read_file(filename:join(PrivDir, Name)), + {Name, B} end, Names), + {ok, FilesDatas} = zip:zip_get(ZipSrv), + + %% Close + ok = zip:zip_close(ZipSrv), + + %% Clean up. + delete_files([Names]), + + ok. + +list_dir_options(doc) -> + ["Test the options for list_dir... one day"]; +list_dir_options(suite) -> + []; +list_dir_options(Config) when is_list(Config) -> + ok. + + + + +%% convert zip_info as returned from list_dir to a list of names +names_from_list_dir({ok, Info}) -> + names_from_list_dir(Info); +names_from_list_dir(Info) -> + tl(lists:map(fun(#zip_file{name = Name}) -> Name; + (_) -> ok end, Info)). + +%% Returns a sequence of characters. +char_seq(N, First) -> + char_seq(N, First, []). + +char_seq(0, _, Result) -> + Result; +char_seq(N, C, Result) when C < 127 -> + char_seq(N-1, C+1, [C|Result]); +char_seq(N, _, Result) -> + char_seq(N, $!, Result). + +data_files() -> + Files = [{"first_file", 1555, $a}, + {"small_file", 7, $d}, + {"big_file", 23875, $e}, + {"last_file", 7500, $g}], + create_files(Files), + Files. + +create_files([{Name, dir, _First}|Rest]) -> + ok = file:make_dir(Name), + create_files(Rest); +create_files([{Name, Size, First}|Rest]) when is_integer(Size) -> + ok = file:write_file(Name, char_seq(Size, First)), + create_files(Rest); +create_files([]) -> + ok. + +%% make_dirs([Dir|Rest], []) -> +%% ok = file:make_dir(Dir), +%% make_dirs(Rest, Dir); +%% make_dirs([Dir|Rest], Parent) -> +%% Name = filename:join(Parent, Dir), +%% ok = file:make_dir(Name), +%% make_dirs(Rest, Name); +%% make_dirs([], Dir) -> +%% Dir. + +bad_zip(doc) -> + ["Try zip:unzip/1 on some corrupted zip files."]; +bad_zip(Config) when is_list(Config) -> + ok = file:set_cwd(?config(priv_dir, Config)), + try_bad("bad_crc", {bad_crc, "abc.txt"}, Config), + try_bad("bad_central_directory", bad_central_directory, Config), + try_bad("bad_file_header", bad_file_header, Config), + try_bad("bad_eocd", bad_eocd, Config), + try_bad("enoent", enoent, Config), + GetNotFound = fun(A) -> + {ok, O} = zip:openzip_open(A, []), + zip:openzip_get("not_here", O) + end, + try_bad("abc", file_not_found, GetNotFound, Config), + ok. + +try_bad(N, R, Config) -> + try_bad(N, R, fun(A) -> io:format("name : ~p\n", [A]), + zip:unzip(A, [verbose]) end, Config). + +try_bad(Name0, Reason, What, Config) -> + %% Intentionally no macros here. + + DataDir = ?config(data_dir, Config), + Name = Name0 ++ ".zip", + io:format("~nTrying ~s", [Name]), + Full = filename:join(DataDir, Name), + Expected = {error, Reason}, + case What(Full) of + Expected -> + io:format("Result: ~p\n", [Expected]); + Other -> + io:format("unzip/2 returned ~p (expected ~p)\n", [Other, Expected]), + test_server:fail({bad_return_value, Other}) + end. + +unzip_to_binary(doc) -> + ["Test extracting to binary with memory option."]; +unzip_to_binary(Config) when is_list(Config) -> + DataDir = ?config(data_dir, Config), + PrivDir = ?config(priv_dir, Config), + + delete_all_in(PrivDir), + file:set_cwd(PrivDir), + Long = filename:join(DataDir, "abc.zip"), + + %% Unzip a zip file into a binary + {ok, FBList} = zip:unzip(Long, [memory]), + + %% Verify. + lists:foreach(fun({F,B}) -> {ok,B}=file:read_file(filename:join(DataDir, F)) + end, FBList), + + %% Make sure no files created in cwd + {ok,[]} = file:list_dir(PrivDir), + + ok. + +zip_to_binary(doc) -> + ["Test compressing to binary with memory option."]; +zip_to_binary(Config) when is_list(Config) -> + DataDir = ?config(data_dir, Config), + PrivDir = ?config(priv_dir, Config), + delete_all_in(PrivDir), + file:set_cwd(PrivDir), + FileName = "abc.txt", + ZipName = "t.zip", + FilePath = filename:join(DataDir, FileName), + {ok, _Size} = file:copy(FilePath, FileName), + + %% Zip to a binary archive + {ok, {ZipName, ZipB}} = zip:zip(ZipName, [FileName], [memory]), + + %% Make sure no files created in cwd + {ok,[FileName]} = file:list_dir(PrivDir), + + %% Zip to a file + {ok, ZipName} = zip:zip(ZipName, [FileName]), + + %% Verify. + {ok, ZipB} = file:read_file(ZipName), + {ok, FData} = file:read_file(FileName), + {ok, [{FileName, FData}]} = zip:unzip(ZipB, [memory]), + + %% Clean up. + delete_files([FileName, ZipName]), + + ok. + +aliases(doc) -> + ["Test using the aliases, extract/2, table/2 and create/3"]; +aliases(Config) when is_list(Config) -> + {_, _, X0} = erlang:now(), + Size = 100, + B = list_to_binary(random_byte_list(X0, Size)), + %% create + {ok, {"z.zip", ZArchive}} = zip:create("z.zip", [{"b", B}], [memory]), + %% extract + {ok, [{"b", B}]} = zip:extract(ZArchive, [memory]), + %% table + {ok, [#zip_comment{comment = _}, #zip_file{name = "b", + info = FI, + comp_size = _, + offset = 0}]} = + zip:table(ZArchive), + Size = FI#file_info.size, + + ok. + + + +unzip_from_binary(doc) -> + ["Test extracting a zip archive from a binary."]; +unzip_from_binary(Config) when list(Config) -> + DataDir = ?config(data_dir, Config), + PrivDir = ?config(priv_dir, Config), + ExtractDir = filename:join(PrivDir, "extract_from_binary"), + ok = file:make_dir(ExtractDir), + Archive = filename:join(ExtractDir, "abc.zip"), + {ok, _Size} = file:copy(filename:join(DataDir, "abc.zip"), Archive), + FileName = "abc.txt", + Quote = "quotes/rain.txt", + Wikipedia = "wikipedia.txt", + EmptyFile = "emptyFile", + file:set_cwd(ExtractDir), + + %% Read a zip file into a binary and extract from the binary. + {ok, Bin} = file:read_file(Archive), + {ok, [FileName,Quote,Wikipedia,EmptyFile]} = zip:unzip(Bin), + + %% Verify. + DestFilename = filename:join(ExtractDir, "abc.txt"), + {ok, Data} = file:read_file(filename:join(DataDir, FileName)), + {ok, Data} = file:read_file(DestFilename), + + DestQuote = filename:join([ExtractDir, "quotes", "rain.txt"]), + {ok, QuoteData} = file:read_file(filename:join(DataDir, Quote)), + {ok, QuoteData} = file:read_file(DestQuote), + + %% Clean up. + delete_files([DestFilename, DestQuote, Archive, ExtractDir]), + ok. + +%% oac_files() -> +%% Files = [{"oac_file", 1459, $x}, +%% {"oac_small", 99, $w}, +%% {"oac_big", 33896, $A}], +%% create_files(Files), +%% Files. + +%% Delete the given list of files and directories. +%% Return total number of deleted files (not directories) +delete_files(List) -> + do_delete_files(List, 0). +do_delete_files([],Cnt) -> + Cnt; +do_delete_files([Item|Rest], Cnt) -> + case file:delete(Item) of + ok -> + DelCnt = 1; + {error,eperm} -> + file:change_mode(Item, 8#777), + DelCnt = delete_files(filelib:wildcard(filename:join(Item, "*"))), + file:del_dir(Item); + {error,eacces} -> + %% We'll see about that! + file:change_mode(Item, 8#777), + case file:delete(Item) of + ok -> + DelCnt = 1; + {error,_} -> + erlang:yield(), + file:change_mode(Item, 8#777), + file:delete(Item), + DelCnt = 1 + end; + {error,_} -> + DelCnt = 0 + end, + do_delete_files(Rest, Cnt + DelCnt). + +delete_all_in(Dir) -> + {ok, Files} = file:list_dir(Dir), + delete_files(lists:map(fun(F) -> filename:join(Dir,F) end, + Files)). + +compress_control(doc) -> + ["Test control of which files that should be compressed"]; +compress_control(suite) -> []; +compress_control(Config) when list(Config) -> + ok = file:set_cwd(?config(priv_dir, Config)), + Dir = "compress_control", + Files = [ + {Dir, dir, $d}, + {filename:join([Dir, "first_file.txt"]), 10000, $f}, + {filename:join([Dir, "a_dir"]), dir, $d}, + {filename:join([Dir, "a_dir", "zzz.zip"]), 10000, $z}, + {filename:join([Dir, "a_dir", "lll.lzh"]), 10000, $l}, + {filename:join([Dir, "a_dir", "eee.exe"]), 10000, $e}, + {filename:join([Dir, "a_dir", "ggg.arj"]), 10000, $g}, + {filename:join([Dir, "a_dir", "b_dir"]), dir, $d}, + {filename:join([Dir, "a_dir", "b_dir", "ggg.arj"]), 10000, $a}, + {filename:join([Dir, "last_file.txt"]), 10000, $l} + ], + + test_compress_control(Dir, + Files, + [{compress, []}], + []), + + test_compress_control(Dir, + Files, + [{uncompress, all}], + []), + + test_compress_control(Dir, + Files, + [{uncompress, []}], + [".txt", ".exe", ".zip", ".lzh", ".arj"]), + + test_compress_control(Dir, + Files, + [], + [".txt", ".exe"]), + + test_compress_control(Dir, + Files, + [{uncompress, {add, [".exe"]}}, + {uncompress, {del, [".zip", "arj"]}}], + [".txt", ".zip", "arj"]), + + test_compress_control(Dir, + Files, + [{uncompress, []}, + {uncompress, {add, [".exe"]}}, + {uncompress, {del, [".zip", "arj"]}}], + [".txt", ".zip", ".lzh", ".arj"]), + + ok. + +test_compress_control(Dir, Files, ZipOptions, Expected) -> + %% Cleanup + Zip = "zip.zip", + Names = [N || {N, _, _} <- Files], + delete_files([Zip]), + delete_files(lists:reverse(Names)), + + create_files(Files), + {ok, Zip} = zip:create(Zip, [Dir], ZipOptions), + + {ok, OpenZip} = zip:openzip_open(Zip, [memory]), + {ok,[#zip_comment{comment = ""} | ZipList]} = zip:openzip_list_dir(OpenZip), + io:format("compress_control: -> ~p -> ~p\n -> ~pn", [Expected, ZipOptions, ZipList]), + verify_compression(Files, ZipList, OpenZip, ZipOptions, Expected), + ok = zip:openzip_close(OpenZip), + + %% Cleanup + delete_files([Zip]), + delete_files(lists:reverse(Names)), % Remove plain files before directories + + ok. + +verify_compression([{Name, Kind, _Filler} | Files], ZipList, OpenZip, ZipOptions, Expected) -> + {Name2, BinSz} = + case Kind of + dir -> + {Name ++ "/", 0}; + _ -> + {ok, {Name, Bin}} = zip:openzip_get(Name, OpenZip), + {Name, size(Bin)} + end, + {Name2, {value, ZipFile}} = {Name2, lists:keysearch(Name2, #zip_file.name, ZipList)}, + #zip_file{info = #file_info{size = InfoSz, type = InfoType}, comp_size = InfoCompSz} = ZipFile, + + Ext = filename:extension(Name), + IsComp = is_compressed(Ext, Kind, ZipOptions), + ExpComp = lists:member(Ext, Expected), + case {Name, Kind, InfoType, IsComp, ExpComp, BinSz, InfoSz, InfoCompSz} of + {_, dir, directory, false, _, Sz, Sz, Sz} when Sz =:= BinSz -> ok; + {_, Sz, regular, false, false, Sz, Sz, Sz} when Sz =:= BinSz -> ok; + {_, Sz, regular, true, true, Sz, Sz, OtherSz} when Sz =:= BinSz, OtherSz =/= BinSz -> ok + end, + verify_compression(Files, ZipList -- [ZipFile], OpenZip, ZipOptions, Expected); +verify_compression([], [], _OpenZip, _ZipOptions, _Expected) -> + ok. + +is_compressed(_Ext, dir, _Options) -> + false; +is_compressed(Ext, _Sz, Options) -> + CompressOpt = + case [What || {compress, What} <- Options] of + [] -> all; + CompressOpts-> extensions(CompressOpts, all) + end, + DoCompress = (CompressOpt =:= all) orelse lists:member(Ext, CompressOpt), + Default = [".Z", ".zip", ".zoo", ".arc", ".lzh", ".arj"], + UncompressOpt = + case [What || {uncompress, What} <- Options] of + [] -> Default; + UncompressOpts-> extensions(UncompressOpts, Default) + end, + DoUncompress = (UncompressOpt =:= all) orelse lists:member(Ext, UncompressOpt), + DoCompress andalso not DoUncompress. + +extensions([H | T], Old) -> + case H of + all -> + extensions(T, H); + H when is_list(H) -> + extensions(T, H); + {add, New} when is_list(New), is_list(Old) -> + extensions(T, Old ++ New); + {del, New} when is_list(New), is_list(Old) -> + extensions(T, Old -- New); + _ -> + extensions(T, Old) + end; +extensions([], Old) -> + Old. + diff -Nru erlang-13.b.1-dfsg/lib/stdlib/vsn.mk erlang-13.b.3-dfsg/lib/stdlib/vsn.mk --- erlang-13.b.1-dfsg/lib/stdlib/vsn.mk 2009-06-05 13:53:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/stdlib/vsn.mk 2009-11-20 13:30:05.000000000 +0000 @@ -1,2 +1,2 @@ -STDLIB_VSN = 1.16.2 +STDLIB_VSN = 1.16.4 diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/book.xml erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/book.xml 2007-11-26 19:05:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/book.xml 2009-11-20 13:35:21.000000000 +0000 @@ -1,29 +1,27 @@ - +
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - Syntax_Tools Application + Syntax_Tools @@ -31,16 +29,19 @@
    - Syntax_Tools Application + Syntax_Tools - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/Makefile erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/Makefile 2007-11-26 19:05:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/Makefile 2009-11-20 13:35:20.000000000 +0000 @@ -1,19 +1,20 @@ -# ``The contents of this file are subject to the Erlang Public License, +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2006-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in # compliance with the License. You should have received a copy of the # Erlang Public License along with this software. If not, it can be -# retrieved via the world wide web at http://www.erlang.org/. +# retrieved online at http://www.erlang.org/. # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # -# The Initial Developer of the Original Code is Ericsson Utvecklings AB. -# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings -# AB. All Rights Reserved.'' -# -# $Id$ +# %CopyrightEnd% # include $(ERL_TOP)/make/target.mk include $(ERL_TOP)/make/$(TARGET)/otp.mk @@ -23,16 +24,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(SYNTAX_TOOLS_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- -include make.dep +APPLICATION=syntax_tools # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/syntax_tools-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Man page source directory (with .erl files) @@ -61,6 +58,12 @@ BOOK_FILES = book.xml + +XML_FILES=\ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) \ + $(XML_NOTES_FILES) + # ---------------------------------------------------- INFO_FILE = ../../info @@ -68,30 +71,12 @@ $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_NOTES_FILES:%.xml=$(HTMLDIR)/%.html) - MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = syntax_tools-$(VSN).pdf -TOP_PS_FILE = syntax_tools-$(VSN).ps -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -102,67 +87,51 @@ # ---------------------------------------------------- # Targets # ---------------------------------------------------- -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +$(HTMLDIR)/%.gif: %.gif + $(INSTALL_DATA) $< $@ -$(XML_REF3_FILES): - docb_gen $(SRC_DIR)/$(@:%.xml=%.erl) - -$(XML_CHAPTER_FILES): - docb_gen -chapter -def vsn $(VSN) ../overview.edoc +docs: pdf html man -pdf: xml $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: xml $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: xml $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) +$(XML_REF3_FILES): + docb_gen $(SRC_DIR)/$(@:%.xml=%.erl) + +$(XML_CHAPTER_FILES): + docb_gen -chapter -def vsn $(VSN) ../overview.edoc + gifs: $(GIF_FILES:%=$(HTMLDIR)/%) xml: $(XML_REF3_FILES) $(XML_CHAPTER_FILES) debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) - rm -f ref_man.kwc min_head.gif part.tex +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* rm -f $(XML_REF3_FILES) $(XML_CHAPTER_FILES) *.html + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 release_spec: diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/notes.xml erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/notes.xml 2009-06-05 13:54:48.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/notes.xml 2009-11-20 13:35:22.000000000 +0000 @@ -26,10 +26,43 @@ nil nil nil + notes.xml

    This document describes the changes made to the Syntax_Tools application.

    +
    Syntax_Tools 1.6.4 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    + +
    Syntax_Tools 1.6.3 + +
    Improvements and New Features + + +

    + Miscellaneous updates.

    +

    + Own Id: OTP-8190

    +
    +
    +
    + +
    +
    Syntax_Tools 1.6.2
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/part_notes.xml 2007-11-26 19:05:24.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/part_notes.xml 2009-11-20 13:35:22.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2007 - 2007 - Ericsson AB, All Rights Reserved + 20072009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Syntax_Tools Release Notes @@ -38,6 +36,6 @@ merger and renamer called Igor, as well as an automatic code-cleaner.

    - + diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/part.xml erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/part.xml 2007-11-26 19:05:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/part.xml 2009-11-20 13:35:21.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Syntax_Tools User's Guide @@ -38,6 +36,6 @@ merger and renamer called Igor, as well as an automatic code-cleaner.

    - + diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/syntax_tools/doc/src/ref_man.xml 2007-11-26 19:05:22.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/syntax_tools/doc/src/ref_man.xml 2009-11-20 13:35:21.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2006 - 2007 - Ericsson AB, All Rights Reserved + 20062009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Syntax_Tools Reference Manual @@ -38,14 +36,14 @@ merger and renamer called Igor, as well as an automatic code-cleaner.

    - - - - - - - - - + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/src/epp_dodger.erl erlang-13.b.3-dfsg/lib/syntax_tools/src/epp_dodger.erl --- erlang-13.b.1-dfsg/lib/syntax_tools/src/epp_dodger.erl 2009-06-05 13:54:44.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/syntax_tools/src/epp_dodger.erl 2009-09-18 15:11:46.000000000 +0100 @@ -117,13 +117,13 @@ %% %% Options: %%
    -%%
    {@type {no_fail, bool()@}}
    +%%
    {@type {no_fail, boolean()@}}
    %%
    If `true', this makes `epp_dodger' replace any program forms %% that could not be parsed with nodes of type `text' (see {@link %% erl_syntax:text/1}), representing the raw token sequence of the %% form, instead of reporting a parse error. The default value is %% `false'.
    -%%
    {@type {clever, bool()@}}
    +%%
    {@type {clever, boolean()@}}
    %%
    If set to `true', this makes `epp_dodger' try to repair the %% source code as it seems fit, in certain cases where parsing would %% otherwise fail. Currently, it inserts `++'-operators between string @@ -350,7 +350,7 @@ quick_parse_form(Dev, L0, Options) -> parse_form(Dev, L0, fun quick_parser/2, Options). --record(opt, {clever = false :: bool()}). +-record(opt, {clever = false :: boolean()}). parse_form(Dev, L0, Parser, Options) -> NoFail = proplists:get_bool(no_fail, Options), diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/src/erl_syntax.erl erlang-13.b.3-dfsg/lib/syntax_tools/src/erl_syntax.erl --- erlang-13.b.1-dfsg/lib/syntax_tools/src/erl_syntax.erl 2009-06-05 13:54:44.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/syntax_tools/src/erl_syntax.erl 2009-09-18 15:11:46.000000000 +0100 @@ -372,7 +372,7 @@ %% is_tree(Tree) = true -record(tree, {type, - attr = #attr{}, + attr = #attr{} :: #attr{}, data}). %% `wrapper' records are used for attaching new-form node information to @@ -387,7 +387,7 @@ %% is_tree(Wrapper) = false -record(wrapper, {type, - attr = #attr{}, + attr = #attr{} :: #attr{}, tree}). @@ -648,11 +648,7 @@ operator -> true; % nonstandard type string -> true; text -> true; % nonstandard type - tuple -> - case tuple_elements(Node) of - [] -> true; - _ -> false - end; + tuple -> tuple_elements(Node) =:= []; underscore -> true; variable -> true; warning_marker -> true; @@ -1861,7 +1857,7 @@ %% ===================================================================== -%% @spec atom_value(syntaxTree())-> atom() +%% @spec atom_value(syntaxTree()) -> atom() %% %% @doc Returns the value represented by an atom node. %% @@ -3813,7 +3809,7 @@ %% ===================================================================== -%% @spec operator_name(syntaxTree())-> atom() +%% @spec operator_name(syntaxTree()) -> atom() %% %% @doc Returns the name of an operator node. Note that %% the name is returned as an atom. @@ -3825,7 +3821,7 @@ %% ===================================================================== -%% @spec operator_literal(syntaxTree())-> string() +%% @spec operator_literal(syntaxTree()) -> string() %% %% @doc Returns the literal string represented by an %% operator node. This is simply the operator name as a @@ -6007,12 +6003,7 @@ nil -> true; list -> - case is_literal(list_head(T)) of - true -> - is_literal(list_tail(T)); - false -> - false - end; + is_literal(list_head(T)) andalso is_literal(list_tail(T)); tuple -> lists:all(fun is_literal/1, tuple_elements(T)); _ -> @@ -6867,10 +6858,7 @@ %% associative, so folding should nest on the left. is_qualified_name({record_field, _, L, R}) -> - case is_qualified_name(L) of - true -> is_qualified_name(R); - false -> false - end; + is_qualified_name(L) andalso is_qualified_name(R); is_qualified_name({atom, _, _}) -> true; is_qualified_name(_) -> false. diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/src/erl_tidy.erl erlang-13.b.3-dfsg/lib/syntax_tools/src/erl_tidy.erl --- erlang-13.b.1-dfsg/lib/syntax_tools/src/erl_tidy.erl 2009-06-05 13:54:45.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/syntax_tools/src/erl_tidy.erl 2009-09-18 15:11:47.000000000 +0100 @@ -51,7 +51,6 @@ %% ===================================================================== --type filename() :: string(). -type options() :: [atom() | {atom(), any()}]. %% ===================================================================== @@ -74,7 +73,7 @@ %% @spec dir(Dir) -> ok %% @equiv dir(Dir, []) --spec dir(filename()) -> 'ok'. +-spec dir(file:filename()) -> 'ok'. dir(Dir) -> dir(Dir, []). @@ -87,13 +86,13 @@ %% %% Available options: %%
    -%%
    {follow_links, bool()}
    +%%
    {follow_links, boolean()}
    %% %%
    If the value is `true', symbolic directory %% links will be followed. The default value is %% `false'.
    %% -%%
    {recursive, bool()}
    +%%
    {recursive, boolean()}
    %% %%
    If the value is `true', subdirectories will be %% visited recursively. The default value is @@ -107,12 +106,12 @@ %% value is `".*\\.erl$"', which matches normal %% Erlang source file names.
    %% -%%
    {test, bool()}
    +%%
    {test, boolean()}
    %% %%
    If the value is `true', no files will be %% modified. The default value is `false'.
    %% -%%
    {verbose, bool()}
    +%%
    {verbose, boolean()}
    %% %%
    If the value is `true', progress messages will %% be output while the program is running, unless the @@ -126,11 +125,11 @@ %% @see //stdlib/regexp %% @see file/2 --record(dir, {follow_links = false :: bool(), - recursive = true :: bool(), +-record(dir, {follow_links = false :: boolean(), + recursive = true :: boolean(), options :: options()}). --spec dir(filename(), options()) -> 'ok'. +-spec dir(file:filename(), options()) -> 'ok'. dir(Dir, Opts) -> Opts1 = Opts ++ dir__defaults(), Env = #dir{follow_links = proplists:get_bool(follow_links, Opts1), @@ -212,7 +211,7 @@ %% @spec file(Name) -> ok %% @equiv file(Name, []) --spec file(filename()) -> 'ok'. +-spec file(file:filename()) -> 'ok'. file(Name) -> file(Name, []). @@ -229,7 +228,7 @@ %% file is created; the default value is `".bak"' %% (cf. the `backups' option).
    %% -%%
    {backups, bool()}
    +%%
    {backups, boolean()}
    %% %%
    If the value is `true', existing files will be %% renamed before new files are opened for writing. The new @@ -262,7 +261,7 @@ %% The default formatting function calls %% `erl_prettypr:format/2'.
    %% -%%
    {test, bool()}
    +%%
    {test, boolean()}
    %% %%
    If the value is `true', no files will be modified; this %% is typically most useful if the `verbose' flag is enabled, to @@ -275,7 +274,7 @@ %% @see erl_prettypr:format/2 %% @see module/2 --spec file(filename(), options()) -> 'ok'. +-spec file(file:filename(), options()) -> 'ok'. file(Name, Opts) -> Parent = self(), Child = spawn_link(fun () -> file_1(Parent, Name, Opts) end), @@ -399,7 +398,7 @@ io:put_chars(FD, Printer(Tree, Opts)), io:nl(FD). -%% file_type(filename()) -> {value, Type} | none +%% file_type(file:filename()) -> {value, Type} | none file_type(Name) -> file_type(Name, false). @@ -504,7 +503,7 @@ %% %% Available options are: %%
    -%%
    {auto_export_vars, bool()}
    +%%
    {auto_export_vars, boolean()}
    %% %%
    If the value is `true', all matches %% "`{V1, ..., Vn} = E'" where `E' is a @@ -528,7 +527,7 @@ %% end %%
    %% -%%
    {auto_list_comp, bool()}
    +%%
    {auto_list_comp, boolean()}
    %% %%
    If the value is `true', calls to `lists:map/2' and %% `lists:filter/2' will be rewritten using list comprehensions. @@ -540,7 +539,7 @@ %% was taken. This is only used for generation of error %% reports. The default value is the empty string.
    %% -%%
    {idem, bool()}
    +%%
    {idem, boolean()}
    %% %%
    If the value is `true', all options that affect how the %% code is modified are set to "no changes". For example, to @@ -548,26 +547,26 @@ %% `[new_guard_tests, idem]'. (Recall that options closer to the %% beginning of the list have higher precedence.)
    %% -%%
    {keep_unused, bool()}
    +%%
    {keep_unused, boolean()}
    %% %%
    If the value is `true', unused functions will %% not be removed from the code. The default value is %% `false'.
    %% -%%
    {new_guard_tests, bool()}
    +%%
    {new_guard_tests, boolean()}
    %% %%
    If the value is `true', guard tests will be updated to %% use the new names, e.g. "`is_integer(X)'" instead of %% "`integer(X)'". The default value is `true'. See also %% `old_guard_tests'.
    %% -%%
    {no_imports, bool()}
    +%%
    {no_imports, boolean()}
    %% %%
    If the value is `true', all import statements will be %% removed and calls to imported functions will be expanded to %% explicit remote calls. The default value is `false'.
    %% -%%
    {old_guard_tests, bool()}
    +%%
    {old_guard_tests, boolean()}
    %% %%
    If the value is `true', guard tests will be changed to %% use the old names instead of the new ones, e.g. @@ -575,7 +574,7 @@ %% value is `false'. This option overrides the `new_guard_tests' %% option.
    %% -%%
    {quiet, bool()}
    +%%
    {quiet, boolean()}
    %% %%
    If the value is `true', all information %% messages and warning messages will be suppressed. The default @@ -602,7 +601,7 @@ %% This option can also be used to override the default %% renaming of calls which use obsolete function names.
    %% -%%
    {verbose, bool()}
    +%%
    {verbose, boolean()}
    %% %%
    If the value is `true', progress messages will be output %% while the program is running, unless the `quiet' option is @@ -736,7 +735,7 @@ end end. --spec check_imports_1([{atom(), atom()}]) -> bool(). +-spec check_imports_1([{atom(), atom()}]) -> boolean(). check_imports_1([{F1, M1}, {F2, M2} | _Is]) when F1 =:= F2, M1 =/= M2 -> false; check_imports_1([_ | Is]) -> @@ -929,19 +928,19 @@ -type context() :: 'guard_expr' | 'guard_test' | 'normal'. --record(env, {file :: filename(), +-record(env, {file :: file:filename(), module, current, imports, context = normal :: context(), verbosity = 1 :: 0 | 1 | 2, - quiet = false :: bool(), - no_imports = false :: bool(), - spawn_funs = false :: bool(), - auto_list_comp = true :: bool(), - auto_export_vars = false :: bool(), - new_guard_tests = true :: bool(), - old_guard_tests = false :: bool()}). + quiet = false :: boolean(), + no_imports = false :: boolean(), + spawn_funs = false :: boolean(), + auto_list_comp = true :: boolean(), + auto_export_vars = false :: boolean(), + new_guard_tests = true :: boolean(), + old_guard_tests = false :: boolean()}). -record(st, {varc, used, imported, vars, functions, new_forms, rename}). @@ -1395,7 +1394,7 @@ end end. --spec auto_expand_import(mfa(), #st{}) -> bool(). +-spec auto_expand_import(mfa(), #st{}) -> boolean(). auto_expand_import({lists, append, 2}, _St) -> true; auto_expand_import({lists, subtract, 2}, _St) -> true; diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/src/prettypr.erl erlang-13.b.3-dfsg/lib/syntax_tools/src/prettypr.erl --- erlang-13.b.1-dfsg/lib/syntax_tools/src/prettypr.erl 2009-06-05 13:54:45.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/syntax_tools/src/prettypr.erl 2009-11-20 13:35:14.000000000 +0000 @@ -48,11 +48,30 @@ nest/2, par/1, par/2, sep/1, text/1, null_text/1, text_par/1, text_par/2]). --record(text, {s}). --record(nest, {n, d}). --record(beside, {d1, d2}). --record(above, {d1, d2}). --record(sep, {ds, i = 0 :: integer(), p = false :: bool()}). +%% --------------------------------------------------------------------- + +%% XXX: just an approximation +-type deep_string() :: [char() | [_]]. + +%% XXX: poor man's document() until recursive data types are supported +-type doc() :: 'null' + | {'text' | 'fit', _} + | {'nest' | 'beside' | 'above' | 'union', _, _} + | {'sep' | 'float', _, _, _}. + +%% Document structures fully implemented and available to the user: +-record(text, {s :: deep_string()}). +-record(nest, {n :: integer(), d :: doc()}). +-record(beside, {d1 :: doc(), d2 :: doc()}). +-record(above, {d1 :: doc(), d2 :: doc()}). +-record(sep, {ds :: [doc()], i = 0 :: integer(), p = false :: boolean()}). + +%% Document structure which is not clear whether it is fully implemented: +-record(float, {d :: doc(), h :: integer(), v :: integer()}). + +%% Document structures not available to the user: +-record(union, {d1 :: doc(), d2 :: doc()}). +-record(fit, {d :: doc()}). %% --------------------------------------------------------------------- @@ -90,6 +109,8 @@ %% often represents a larger number of possible layouts than just the %% sum of the components. +-type document() :: 'null' | #text{} | #nest{} | #beside{} + | #above{} | #sep{} | #float{} | #union{} | #fit{}. %% ===================================================================== %% @spec text(Characters::string()) -> document() @@ -105,6 +126,8 @@ %% @see null_text/1 %% @see text_par/2 +-spec text(string()) -> #text{}. + text(S) -> mktext(string(S)). % convert to internal representation @@ -133,6 +156,8 @@ %% @see text/1 %% @see empty/0 +-spec null_text(string()) -> #text{}. + null_text(S) -> mktext(null_string(S)). % convert to internal representation @@ -141,6 +166,8 @@ %% @spec text_par(Text::string()) -> document() %% @equiv text_par(Text, 0) +-spec text_par(string()) -> document(). + text_par(S) -> text_par(S, 0). @@ -175,6 +202,8 @@ %% @see text/1 %% @see par/2 +-spec text_par(string(), integer()) -> document(). + text_par(S, 0) -> par(words(S)); text_par(S, N) when N > 0 -> @@ -213,6 +242,8 @@ %% %% @see text/1 +-spec empty() -> 'null'. + empty() -> null. @@ -223,6 +254,8 @@ %% @doc Forces a line break at the end of the given document. This is a %% utility function; see {@link empty/0} for details. +-spec break(document()) -> #above{}. + break(D) -> above(D, empty()). @@ -234,6 +267,8 @@ %% Note that `N' may be negative, shifting the text to the left, or %% zero, in which case `D' is returned unchanged. +-spec nest(integer(), document()) -> document(). + nest(N, D) -> if N =:= 0 -> D; @@ -258,6 +293,8 @@ %% cd gh => cdef %% gh''' +-spec beside(document(), document()) -> #beside{}. + beside(D1, D2) -> #beside{d1 = D1, d2 = D2}. @@ -280,6 +317,8 @@ %% de ij fgh %% ij''' +-spec above(document(), document()) -> #above{}. + above(D1, D2) -> #above{d1 = D1, d2 = D2}. @@ -308,6 +347,8 @@ %% %% @see par/2 +-spec sep([document()]) -> #sep{}. + sep(Ds) -> #sep{ds = Ds}. @@ -316,6 +357,8 @@ %% @spec par(Docs::[document()]) -> document() %% @equiv par(Ds, 0) +-spec par([document()]) -> #sep{}. + par(Ds) -> par(Ds, 0). @@ -365,6 +408,8 @@ %% @see par/1 %% @see text_par/2 +-spec par([document()], integer()) -> #sep{}. + par(Ds, N) -> mksep(Ds, N, true). @@ -378,6 +423,8 @@ %% @spec follow(D1::document(), D2::document()) -> document() %% @equiv follow(D1, D2, 0) +-spec follow(document(), document()) -> #beside{}. + follow(D1, D2) -> follow(D1, D2, 0). @@ -399,6 +446,8 @@ %% %% @see follow/2 +-spec follow(document(), document(), integer()) -> #beside{}. + follow(D1, D2, N) when is_integer(N) -> beside(par([D1, nil()], N), D2). @@ -407,6 +456,8 @@ %% @spec floating(document()) -> document() %% @equiv floating(D, 0, 0) +-spec floating(document()) -> #float{}. + floating(D) -> floating(D, 0, 0). @@ -430,7 +481,7 @@ %% documents amounts to a "bubblesort", so don't expect it to be able to %% sort large sequences of floating documents quickly. --record(float, {d, h, v}). +-spec floating(document(), integer(), integer()) -> #float{}. floating(D, H, V) when is_integer(H), is_integer(V) -> #float{d = D, h = H, v = V}. @@ -440,6 +491,8 @@ %% @spec format(D::document()) -> string() %% @equiv format(D, 80) +-spec format(document()) -> string(). + format(D) -> format(D, 80). @@ -448,6 +501,8 @@ %% @spec format(D::document(), PaperWidth::integer()) -> string() %% @equiv format(D, PaperWidth, 65) +-spec format(document(), integer()) -> string(). + format(D, W) -> format(D, W, 65). @@ -471,6 +526,8 @@ %% %% @see best/3 +-spec format(document(), integer(), integer()) -> string(). + format(D, W, R) -> case best(D, W, R) of empty -> @@ -486,7 +543,7 @@ %% | #nest{n = integer(), d = document()} %% | #beside{d1 = document(), d2 = document()} %% | #above{d1 = document(), d2 = document()} -%% | #sep{ds = [document()], i = integer(), p = bool()} +%% | #sep{ds = [document()], i = integer(), p = boolean()} %% | null %% %% A `text' node simply represents a string (which should not contain @@ -583,7 +640,7 @@ %% #c_above_nest{d = doc(), i = integer(), c = ctxt()} %% #c_beside{d = doc(), c = ctxt()} %% #c_text_beside{s = string(), c = ctxt()} -%% #c_sep_nest{ds = [doc()], i = integer(), p = bool(), +%% #c_sep_nest{ds = [doc()], i = integer(), p = boolean(), %% c = ctxt()} %% #c_best_nest_or{w = integer(), r = integer(), i = integer(), %% d = doc()} @@ -630,13 +687,10 @@ %% c_float_beside float (c_beside) %% c_float_above_nest float (c_above_nest) -%% Document structures not available to the user: - --record(union, {d1, d2}). --record(fit, {d}). - %% Entry point for the layout algorithm: +-spec best(document(), integer(), integer()) -> 'empty' | document(). + best(D, W, R) -> rewrite(D, #c_best_nest{w = W, r = R, i = 0}). diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/test/Makefile erlang-13.b.3-dfsg/lib/syntax_tools/test/Makefile --- erlang-13.b.1-dfsg/lib/syntax_tools/test/Makefile 2007-11-26 19:06:25.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/syntax_tools/test/Makefile 2009-11-20 13:35:26.000000000 +0000 @@ -61,6 +61,5 @@ $(INSTALL_DATA) $(EMAKEFILE) $(ERL_FILES) $(RELSYSDIR) $(INSTALL_DATA) syntax_tools.dynspec $(RELSYSDIR) chmod -f -R u+w $(RELSYSDIR) - @tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -) release_docs_spec: diff -Nru erlang-13.b.1-dfsg/lib/syntax_tools/vsn.mk erlang-13.b.3-dfsg/lib/syntax_tools/vsn.mk --- erlang-13.b.1-dfsg/lib/syntax_tools/vsn.mk 2009-06-05 13:54:46.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/syntax_tools/vsn.mk 2009-11-20 13:35:16.000000000 +0000 @@ -1 +1 @@ -SYNTAX_TOOLS_VSN = 1.6.2 +SYNTAX_TOOLS_VSN = 1.6.4 diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/basics_chapter.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/basics_chapter.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/basics_chapter.xml 2009-03-16 18:35:01.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/basics_chapter.xml 2009-11-20 13:35:06.000000000 +0000 @@ -26,6 +26,7 @@ + basics_chapter.xml
    @@ -98,7 +99,7 @@ which is created for each test run. Every test case gets one row in a table presenting total time, whether the case was successful or not, if it was skipped, and possibly also a comment. The HTML - file has links to each test case's logfile, wich may be viewed + file has links to each test case's logfile, which may be viewed from e.g. Netscape or any other HTML capable browser.

    The Test Server consists of three parts: diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/book.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/book.xml 2009-03-12 12:26:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/book.xml 2009-11-20 13:35:05.000000000 +0000 @@ -1,7 +1,7 @@ - +

    20022009 @@ -35,11 +35,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/example_chapter.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/example_chapter.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/example_chapter.xml 2009-03-12 12:26:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/example_chapter.xml 2009-11-20 13:35:08.000000000 +0000 @@ -26,6 +26,7 @@ + example_chapter.xml
    diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/Makefile erlang-13.b.3-dfsg/lib/test_server/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/test_server/doc/src/Makefile 2009-03-12 12:26:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/Makefile 2009-11-20 13:35:06.000000000 +0000 @@ -25,11 +25,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(TEST_SERVER_VSN) +APPLICATION=test_server # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/test_server-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -69,33 +70,14 @@ HTML_INTERNAL = $(XML_REF3_INTERNAL:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN3_INTERNAL = $(XML_REF3_INTERNAL:%.xml=$(MAN3DIR)/%.3) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PDF_FILE = test_server-$(VSN).pdf -TOP_PS_FILE = test_server-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/test_server-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -106,63 +88,44 @@ # ---------------------------------------------------- # Targets # ---------------------------------------------------- -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif - $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -pdf: $(TOP_PDF_FILE) +docs: pdf html man -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) $(HTML_INTERNAL) +html: gifs $(HTML_REF_MAN_FILE) -man: $(MAN3_FILES) $(MAN6_FILES) +man: $(MAN3_FILES) $(MAN3_INTERNAL) $(MAN6_FILES) gifs: $(GIF_FILES:%=$(HTMLDIR)/%) debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) $(MAN3_INTERNAL) $(MAN6_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(MAN6DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6 -endif -endif release_spec: diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/notes.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/notes.xml 2009-06-05 14:02:55.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/notes.xml 2009-11-20 13:35:16.000000000 +0000 @@ -32,6 +32,110 @@ notes.xml
    +
    Test_Server 3.3.5 + +
    Fixed Bugs and Malfunctions + + +

    + If the init_per_testcase/2 function fails, the test case + now gets marked and counted as auto skipped, not user + skipped (which would previously happen).

    +

    + Own Id: OTP-8289

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    + +

    + It is now possible to fail a test case from the + end_per_testcase/2 function, by returning {fail,Reason}.

    +

    + Own Id: OTP-8284

    +
    + +

    + It is now possible to fail a test case by having the + end_tc/3 framework function return {fail,Reason} for the + test case.

    +

    + Own Id: OTP-8285

    +
    + +

    + The test_server framework API (e.g. the end_tc/3 + function) has been modified. See the test_server_ctrl + documentation for details.

    +

    + Own Id: OTP-8286 Aux Id: OTP-8285, OTP-8287

    +
    +
    +
    + +
    + +
    Test_Server 3.3.4 + +
    Fixed Bugs and Malfunctions + + +

    + When running a suite starting with a test case group, + Test Server crashed if init_per_suite/1 exited or + returned skip. This has been fixed.

    +

    + Own Id: OTP-8105 Aux Id: OTP-8089

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + Various updates and fixes in Common Test and Test Server.

    +

    + Own Id: OTP-8045 Aux Id: OTP-8089,OTP-8105,OTP-8163

    +
    + +

    + Errors in coverage data collection and analysis were + difficult to detect. The logging has been improved so + that more information about e.g. imported and missing + modules is printed to the html log files.

    +

    + Own Id: OTP-8163 Aux Id: seq11374

    +
    + +

    + The Common Test HTML overview pages have been improved. + It is now possible to see if a test case has been skipped + explicitly or because a configuration function has + failed. Also, the history page (all_runs.html) now has + scrolling text displaying the test names. The old format + (showing names as a truncated string) can still be + generated by means of the flag/option 'basic_html'.

    +

    + Own Id: OTP-8177

    +
    +
    +
    + +
    +
    Test_Server 3.3.2
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/part_notes.xml 2009-03-12 12:27:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/part_notes.xml 2009-11-20 13:35:17.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20042009 @@ -35,6 +35,6 @@

    For information about older versions, see Release Notes History.

    - + diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/part.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/part.xml 2009-03-12 12:26:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/part.xml 2009-11-20 13:35:05.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20022009 @@ -35,11 +35,11 @@ inside customized test tools. A callback interface for such framework applications is provided.

    - - - - - - + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/ref_man.xml 2009-03-12 12:26:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/ref_man.xml 2009-11-20 13:35:05.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20022009 @@ -36,8 +36,8 @@ inside customized test tools. A callback interface for such framework applications is provided.

    - - - + + + diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/run_test_chapter.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/run_test_chapter.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/run_test_chapter.xml 2009-03-12 12:26:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/run_test_chapter.xml 2009-11-20 13:35:06.000000000 +0000 @@ -26,6 +26,7 @@ + run_test_chapter.xml
    diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/test_server_app.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/test_server_app.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/test_server_app.xml 2009-03-12 12:26:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/test_server_app.xml 2009-11-20 13:35:07.000000000 +0000 @@ -29,9 +29,9 @@ 2002-07-12 PA1 - test_server_app.sgml + test_server_app.xml
    - Test Server Application + test_server Test Server for manual or automatic testing of Erlang code

    Test Server is a portable test server for diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/test_server_ctrl.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/test_server_ctrl.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/test_server_ctrl.xml 2009-03-12 12:27:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/test_server_ctrl.xml 2009-11-21 16:51:02.000000000 +0000 @@ -24,7 +24,7 @@ The Test Server Controller - Siri Hansen + Siri Hansen, Peter Andersson @@ -370,7 +370,7 @@

    This function should be called before a test is started - which requires extended timetraps, e.g. if extensivie tracing + which requires extended timetraps, e.g. if extensive tracing is used. All timetraps started after this call will be multiplied by N.

    @@ -417,7 +417,7 @@ compiled.

    Analyse indicates the detail level of the cover - anlysis. If Analyse = details, each cover compiled + analysis. If Analyse = details, each cover compiled module will be analysed with cover:analyse_to_file/1. If Analyse = overview an overview of all cover compiled modules is created, listing @@ -618,7 +618,7 @@ COVER app cover_file analyse Indicates that the test should be run with cover - alanysis. app, cover_file and analyse + analysis. app, cover_file and analyse corresponds to the parameters to test_server_ctrl:cover/3. If no cover file is used, the atom none should be given. @@ -649,8 +649,13 @@ Get subcases. Mod = atom() + Test suite name. Func = atom() - TestCaseList = [,SubCase] + Name of test case. + TestCaseList = [SubCase] + List of test cases. + SubCase = atom() + Name of a case.

    This function is called before a test case is started. The @@ -660,36 +665,72 @@ - init_tc(Mod,Func,Args) -> {ok,Args} - Preparation for a test case. + init_tc(Mod,Func,Args0) -> {ok,Args1} | {skip,ReasonToSkip} | {auto_skip,ReasonToSkip} | {fail,ReasonToFail} + Preparation for a test case or configuration function. Mod = atom() + Test suite name. Func = atom() - Args = [tuple()] - Normally Args = [Config] - - -

    This function is called when a test case is started. It is - called on the process executing the test case function - (Mod:Func). Typical use of this function can be to alter - the input parameters to the test case function (Args) or - to set properties for the executing process.

    + Name of test case or configuration function. + Args0 = Args1 = [tuple()] + Normally Args = [Config] + ReasonToSkip = term() + Reason to skip the test case or configuration function. + ReasonToFail = term() + Reason to fail the test case or configuration function. + + +

    This function is called before a test case or configuration + function starts. It is called on the process executing the function + Mod:Func. Typical use of this function can be to alter + the input parameters to the test case function (Args) or + to set properties for the executing process.

    +

    By returning {skip,Reason}, Func gets skipped. + Func also gets skipped if {auto_skip,Reason} is returned, + but then gets an auto skipped status (rather than user skipped).

    +

    To fail Func immediately instead of executing it, return + {fail,ReasonToFail}.

    - end_tc(Mod,Func,Args) -> ok - Cleanup after a test case. + end_tc(Mod,Func,Status) -> ok | {fail,ReasonToFail} + Cleanup after a test case or configuration function. Mod = atom() + Test suite name. Func = atom() + Name of test case or configuration function. + Status = {Result,Args} | {TCPid,Result,Args} + The status of the test case or configuration function. + ReasonToFail = term() + Reason to fail the test case or configuration function. + Result = ok | Skip | Fail + The final result of the test case or configuration function. + TCPid = pid() + Pid of the process executing Func + Skip = {skip,SkipReason} + SkipReason = term() | {failed,{Mod,init_per_testcase,term()}} + Reason why the function was skipped. + Fail = {error,term()} | {'EXIT',term()} | {timetrap_timeout,integer()} | + {testcase_aborted,term()} | testcase_aborted_or_killed | + {failed,term()} | {failed,{Mod,end_per_testcase,term()}} + Reason why the function failed. Args = [tuple()] - Normally Args = [Config] + Normally Args = [Config] -

    This function is called when a test case is completed. It is - called on the process where the test case function - (Mod:Func) was executed. Typical use of this function can - be to clean up stuff done by init_tc/3.

    +

    This function is called when a test case, or a configuration function, + is finished. It is normally called on the process where the function + Mod:Func has been executing, but if not, the pid of the test + case process is passed with the Status argument.

    +

    Typical use of the end_tc/3 function can be to clean up + after init_tc/3.

    +

    If Func is a test case, it is possible to analyse the value of + Result to verify that init_per_testcase/2 and + end_per_testcase/2 executed successfully.

    +

    It is possible with end_tc/3 to fail an otherwise successful + test case, by returning {fail,ReasonToFail}. The test case Func + will be logged as failed with the provided term as reason.

    @@ -700,37 +741,39 @@ Data = term() -

    This function is called in order to keep the framework upto - date about the progress of the test. This is useful e.g. if the - framework implements a GUI where the progress information is - constantly updated. The following can be reported: -

    -

    What = tests_start, Data = {Name,NumCases}

    -What = tests_done, Data = {Ok,Failed,Skipped}

    -What = tc_start, Data = {Mod,Func}

    -What = tc_done, Data = {Mod,Func,Result}

    +

    This function is called in order to keep the framework up-to-date with + the progress of the test. This is useful e.g. if the + framework implements a GUI where the progress information is + constantly updated. The following can be reported: +

    +

    What = tests_start, Data = {Name,NumCases}

    + What = tests_done, Data = {Ok,Failed,{UserSkipped,AutoSkipped}}

    + What = tc_start, Data = {Mod,Func}

    + What = tc_done, Data = {Mod,Func,Result}

    + What = tc_user_skip, Data = {Mod,Func,Comment}

    + What = tc_auto_skip, Data = {Mod,Func,Comment}

    - error_notification(Mod, Case, Args, Error) -> ok - Inform framework of crashing testcase. + error_notification(Mod, Func, Args, Error) -> ok + Inform framework of crashing testcase or configuration function. Mod = atom() Test suite name. - Case = atom() - Name of test case function. + Func = atom() + Name of test case or configuration function. Args = [tuple()] Normally Args = [Config] Error = {Reason,Location} Reason = term() Reason for termination. - Location = unknown | [{Mod,Case,Line}] + Location = unknown | [{Mod,Func,Line}] Last known position in Mod before termination. Line = integer() Line number in file Mod.erl. -

    This function is called as the result of testcase Mod:Case failing +

    This function is called as the result of function Mod:Func failing with Reason at Location. The function is intended mainly to aid specific logging or error handling in the framework application. Note that for Location to have relevant values (i.e. other than unknown), diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/test_server.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/test_server.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/test_server.xml 2009-03-16 18:35:03.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/test_server.xml 2009-11-20 13:35:25.000000000 +0000 @@ -161,7 +161,7 @@ supplied number of milliseconds. There are two major reasons why you should use this function instead of timer:sleep, the first being that the module - timer may be unavaliable at the time the test suite is + timer may be unavailable at the time the test suite is run, and the second that it also accepts floating point numbers.

    @@ -205,7 +205,7 @@

    Typically, the test person don't want to see everything a test suite outputs, but is merely interested in if the test - cases succeeded or not, wich the test server tells him. If he + cases succeeded or not, which the test server tells him. If he would like to see more, he could manually change the threshold values by using the test_server_ctrl:set_levels/3 function.

    @@ -239,7 +239,7 @@ F = atom() The name of the function to call in the module. A = list() - The arguments to supplu the called function. + The arguments to supply the called function. Time = integer() The number of seconds it took to call the function. Value = term() @@ -397,7 +397,7 @@ a shield node). If Fun is successfully executed, the result is returned. A peer node (see start_node/3) started from the shielded node will be shielded from test server node, i.e. - they will not be aware of eachother. This is useful when you want + they will not be aware of each other. This is useful when you want to start nodes from earlier OTP releases than the OTP release of the test server node.

    Nodes from an earlier OTP release can normally not be started @@ -443,7 +443,7 @@

    peer means that the new node is an independent node with no master.

    -

    Options is a tuplelist wich can contain one or more +

    Options is a tuplelist which can contain one or more of

    @@ -453,7 +453,7 @@ exceptions, as for the case of VxWorks, where all nodes are started on a remote host). Test cases that require a remote host will fail with a reasonable comment if - no remote hosts are availiable at the time they are run. + no remote hosts are available at the time they are run. {args, Arguments} Arguments passed directly to the node. This is @@ -488,7 +488,7 @@



    - When specififying this option to run a previous release, use + When specifying this option to run a previous release, use is_release_available/1 function to test if the given release is available and skip the test case if not.

    @@ -560,13 +560,13 @@
    is_native(Mod) -> bool() - Checks wether the module is natively compiled or not + Checks whether the module is natively compiled or not Mod = atom() A module name -

    Checks wether the module is natively compiled or not

    +

    Checks whether the module is natively compiled or not

    @@ -725,7 +725,7 @@ only called if the specification clause returns an empty list. The execution clause is the real test case. Here you must call the functions you want to test, and do whatever you need to - check the result. If someting fails, make sure the process + check the result. If something fails, make sure the process crashes or call test_server:fail/0/1 (which also will cause the process to crash).

    @@ -785,7 +785,7 @@ transform. This is necessary e.g. for functions that are executed on old (i.e. <R10B) OTP releases. FuncList = [{Func,Arity}].

    -

    If both the line macro and the parse tranform is used in +

    If both the line macro and the parse transform is used in the same module, the parse transform will overrule the macro.

    @@ -827,7 +827,7 @@ called.

    The line_trace macro can also be used together with the - test_server_line parse tranform described above. A + test_server_line parse transform described above. A timestamp will then be written for each line in the suite, except for functions stated in the -no_lines attribute.

    diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/test_spec_chapter.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/test_spec_chapter.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/test_spec_chapter.xml 2009-04-16 10:26:01.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/test_spec_chapter.xml 2009-11-20 13:35:08.000000000 +0000 @@ -26,6 +26,7 @@ + test_spec_chapter.xml
    @@ -91,7 +92,7 @@ {make, Init, TestSpec, Fin} This is a special version of a conf case which is only - used by the test server framwork ts. Init and + used by the test server framework ts. Init and Fin are make and unmake functions for a data directory. TestSpec is the test specification for the test suite owning the data directory in question. If the make @@ -143,7 +144,7 @@ {require_nodenames, Num} Specifies how many nodenames the test suite will - need. Theese will be automaticly generated and inserted into the + need. Theese will be automatically generated and inserted into the Config argument to all test cases. Num is an integer. @@ -158,7 +159,7 @@ {diskless, true} Adds {diskless, true} to the Config argument - to all test cases. This is kept for backwards compatiblilty and + to all test cases. This is kept for backwards compatibility and should not be used. Use a configuration case instead. {ipv6_hosts, Hosts} @@ -169,7 +170,7 @@ ".spec". If special test specification files are needed for Windows or VxWorks platforms, additional files with the extension ".spec.win" and ".spec.vxworks" shall be - used. This is useful e.g. if some test cases shall be skippped on + used. This is useful e.g. if some test cases shall be skipped on these platforms.

    Some examples for test specification files can be found in the @@ -343,7 +344,7 @@ know beforehand that a specific test case fails. This might be functionality which isn't yet implemented, a bug that is known but not yet fixed or some functionality which doesn't work or isn't - applicable on a spesific platform. + applicable on a specific platform.

    There are several different ways to state that a test case should be skipped:

    diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/ts.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/ts.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/ts.xml 2009-03-12 12:27:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/ts.xml 2009-11-20 13:35:26.000000000 +0000 @@ -40,9 +40,9 @@ implements the interface to all the functionality in the framework.

    -

    The framwork is built on top of the Test Server Controller, +

    The framework is built on top of the Test Server Controller, test_server_ctrl, and provides a high level operator - interface. The main fatures added by the framework are: + interface. The main features added by the framework are:

    Automatic compilation of test suites and data directories @@ -92,7 +92,7 @@ ts:install/0/1/2.

    Some of the common variables in the 'variables' file are - discribed below. Do not make any assumptions as of what is found + described below. Do not make any assumptions as of what is found in this file, as it may change at any time.

    @@ -368,7 +368,7 @@ cases in that module will be run, and to run a specified test case, specify the name of the test case using the Case argument. If called with no argument, all test specifications - availiable will be run. Use ts:tests/0 to see the available + available will be run. Use ts:tests/0 to see the available test specifications.

    If the batch option is not given, a new xterm is @@ -438,7 +438,7 @@

    The trace option is used to turn on call trace on target and on slave or peer nodes started with test_server:start_node/3. TraceSpec can be the - name of a trace information file, or a list of elememnts like + name of a trace information file, or a list of elements like the ones in a trace information file. Please turn to the reference manual for test_server_ctrl:trc/1 for details about the trace information file. @@ -546,7 +546,7 @@

    The reason for generating the makefile is that you can use variables from the variables file which was generated by - ts:install/0/1/2. All occurencies of @Key@ in + ts:install/0/1/2. All occurrences of @Key@ in Makefile.src is substituted by the Value from {Key,Value} found in the variables file. Example:

    @@ -582,10 +582,10 @@ all: $(PROGS) nfs_check@exe@: nfs_check@obj@ -\011 $(LD) $(CROSSLDFLAGS) -o nfs_check nfs_check@obj@ @LIBS@ + $(LD) $(CROSSLDFLAGS) -o nfs_check nfs_check@obj@ @LIBS@ nfs_check@obj@: nfs_check.c -\011 $(CC) -c -o nfs_check@obj@ $(CFLAGS) nfs_check.c + $(CC) -c -o nfs_check@obj@ $(CFLAGS) nfs_check.c
    diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/write_framework_chapter.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/write_framework_chapter.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/write_framework_chapter.xml 2009-03-12 12:26:45.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/write_framework_chapter.xml 2009-11-20 13:35:08.000000000 +0000 @@ -26,6 +26,7 @@ + write_framework_chapter.xml
    diff -Nru erlang-13.b.1-dfsg/lib/test_server/doc/src/write_test_chapter.xml erlang-13.b.3-dfsg/lib/test_server/doc/src/write_test_chapter.xml --- erlang-13.b.1-dfsg/lib/test_server/doc/src/write_test_chapter.xml 2009-03-12 12:26:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/doc/src/write_test_chapter.xml 2009-11-20 13:35:07.000000000 +0000 @@ -26,6 +26,7 @@ + write_test_chapter.xml
    @@ -39,7 +40,7 @@ Retrieving and flushing process message queue Watchdog timers Checking that a function crashes - Checking that a function succeds at least m out of n times + Checking that a function succeeds at least m out of n times Checking .app files

    Please turn to the reference manual for the test_server @@ -139,7 +140,7 @@ nodenames key, if requested by the require_nodenames command in the test suite specification file. All Config items should be extracted using the ?config macro. This is - to ensure future compability if the Config format + to ensure future compatibility if the Config format changes. See the reference manual for test_server for details about this macro.

    diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/configure.in erlang-13.b.3-dfsg/lib/test_server/src/configure.in --- erlang-13.b.1-dfsg/lib/test_server/src/configure.in 2009-03-12 12:26:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/src/configure.in 2009-11-20 13:35:00.000000000 +0000 @@ -27,7 +27,7 @@ DEBUG_FLAGS="-g -DDEBUG" if test "$GCC" = yes; then - DEBUG_FLAGS="$DEBUG_FLAGS -Wall" + DEBUG_FLAGS="$DEBUG_FLAGS -Wall $CFLAGS" fi AC_SUBST(DEBUG_FLAGS) @@ -127,7 +127,7 @@ SHLIB_SUFFIX=".so" if test "$have_dl" = yes; then SHLIB_LD="${CC}" - SHLIB_LDFLAGS="-shared" + SHLIB_LDFLAGS="$LDFLAGS -shared" LD_FLAGS="-rdynamic" else AC_CHECK_HEADER(dld.h, [ @@ -141,13 +141,13 @@ AC_CHECK_HEADER(dlfcn.h, [ SHLIB_CFLAGS="-fpic" SHLIB_LD="ld" - SHLIB_LDFLAGS="-Bshareable -x" + SHLIB_LDFLAGS="$LDFLAGS -Bshareable -x" SHLIB_SUFFIX=".so" ], [ # No dynamic loading. SHLIB_CFLAGS="" SHLIB_LD="ld" - SHLIB_LDFLAGS="" + SHLIB_LDFLAGS="$LDFLAGS" SHLIB_SUFFIX="" AC_MSG_ERROR(don't know how to compile and link dynamic drivers) ]) @@ -156,34 +156,35 @@ SunOS-4*) SHLIB_CFLAGS="-PIC" SHLIB_LD="ld" - SHLIB_LDFLAGS="" + SHLIB_LDFLAGS="$LDFLAGS" SHLIB_SUFFIX=".so" SHLIB_EXTRACT_ALL="" ;; SunOS-5*|UNIX_SV-4.2*) SHLIB_CFLAGS="-KPIC" SHLIB_LD="/usr/ccs/bin/ld" - SHLIB_LDFLAGS="-G -z text" + SHLIB_LDFLAGS="$LDFLAGS -G -z text" SHLIB_SUFFIX=".so" SHLIB_EXTRACT_ALL="-z allextract" ;; Darwin*) SHLIB_CFLAGS="-fno-common" SHLIB_LD="cc" - SHLIB_LDFLAGS="-bundle -flat_namespace -undefined suppress" + SHLIB_LDFLAGS="$LDFLAGS -bundle -flat_namespace -undefined suppress" SHLIB_SUFFIX=".so" SHLIB_EXTRACT_ALL="" ;; OSF1*) SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld" - SHLIB_LDFLAGS="-shared" + SHLIB_LDFLAGS="$LDFLAGS -shared" SHLIB_SUFFIX=".so" SHLIB_EXTRACT_ALL="" ;; *osf5*) SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" + SHLIB_LDFLAGS="$LDFLAGS" SHLIB_SUFFIX=".so" SHLIB_EXTRACT_ALL="" ;; diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/test_server.app.src erlang-13.b.3-dfsg/lib/test_server/src/test_server.app.src --- erlang-13.b.1-dfsg/lib/test_server/src/test_server.app.src 2009-06-05 14:02:57.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/test_server/src/test_server.app.src 2009-09-18 13:47:30.000000000 +0100 @@ -30,7 +30,7 @@ ]}, {registered, [test_server_ctrl, test_server, - test_server_break_process]} + test_server_break_process]}, {applications, [kernel,stdlib]}, {env, []}]}. diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/test_server_ctrl.erl erlang-13.b.3-dfsg/lib/test_server/src/test_server_ctrl.erl --- erlang-13.b.1-dfsg/lib/test_server/src/test_server_ctrl.erl 2009-06-05 14:02:53.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/test_server/src/test_server_ctrl.erl 2009-11-20 13:35:04.000000000 +0000 @@ -164,6 +164,7 @@ -export([multiply_timetraps/1]). -export([cover/2, cover/3, cover/7, cross_cover_analyse/1, cross_cover_analyse/2, trc/1, stop_trace/0]). +-export([testcase_callback/1]). -export([set_random_seed/1]). %%% TEST_SERVER INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -206,11 +207,14 @@ -define(pl2a(M), test_server_sup:package_atom(M)). -define(void_fun, fun() -> ok end). --define(mod_result(X), if X == skip -> skipped; true -> X end). +-define(mod_result(X), if X == skip -> skipped; + X == auto_skip -> skipped; + true -> X end). -record(state,{jobs=[],levels={1,19,10},multiply_timetraps=1,finish=false, target_info, trc=false, cover=false, wait_for_node=[], - idle_notify=[], get_totals=false, random_seed=undefined}). + testcase_callback=undefined, idle_notify=[], + get_totals=false, random_seed=undefined}). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% OPERATOR INTERFACE @@ -305,54 +309,57 @@ %% COMMAND LINE INTERFACE parse_cmd_line(Cmds) -> - parse_cmd_line(Cmds, [], [], local, false, false). + parse_cmd_line(Cmds, [], [], local, false, false, undefined). -parse_cmd_line(['SPEC',Spec|Cmds], SpecList, Names, Param, Trc, Cov) -> +parse_cmd_line(['SPEC',Spec|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) -> case file:consult(Spec) of {ok, TermList} -> Name = filename:rootname(Spec), - parse_cmd_line(Cmds, TermList++SpecList, [Name|Names], Param, Trc, Cov); + parse_cmd_line(Cmds, TermList++SpecList, [Name|Names], Param, + Trc, Cov, TCCB); {error,Reason} -> io:format("Can't open ~s: ~p\n", [cast_to_list(Spec), file:format_error(Reason)]), - parse_cmd_line(Cmds, SpecList, Names, Param, Trc, Cov) + parse_cmd_line(Cmds, SpecList, Names, Param, Trc, Cov, TCCB) end; -parse_cmd_line(['NAME',Name|Cmds], SpecList, Names, Param, Trc, Cov) -> - parse_cmd_line(Cmds, SpecList, [{name,Name}|Names], Param, Trc, Cov); -parse_cmd_line(['SKIPMOD',Mod|Cmds], SpecList, Names, Param, Trc, Cov) -> +parse_cmd_line(['NAME',Name|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) -> + parse_cmd_line(Cmds, SpecList, [{name,Name}|Names], Param, Trc, Cov, TCCB); +parse_cmd_line(['SKIPMOD',Mod|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) -> parse_cmd_line(Cmds, [{skip,{Mod,"by command line"}}|SpecList], Names, - Param, Trc, Cov); -parse_cmd_line(['SKIPCASE',Mod,Case|Cmds], SpecList, Names, Param, Trc, Cov) -> + Param, Trc, Cov, TCCB); +parse_cmd_line(['SKIPCASE',Mod,Case|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) -> parse_cmd_line(Cmds, [{skip,{Mod,Case,"by command line"}}|SpecList], Names, - Param, Trc, Cov); -parse_cmd_line(['DIR',Dir|Cmds], SpecList, Names, Param, Trc, Cov) -> + Param, Trc, Cov, TCCB); +parse_cmd_line(['DIR',Dir|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) -> Name = cast_to_list(filename:basename(Dir)), parse_cmd_line(Cmds, [{topcase,{dir,Name}}|SpecList], [Name|Names], - Param, Trc, Cov); -parse_cmd_line(['MODULE',Mod|Cmds], SpecList, Names, Param, Trc, Cov) -> + Param, Trc, Cov, TCCB); +parse_cmd_line(['MODULE',Mod|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) -> parse_cmd_line(Cmds, [{topcase,{Mod,all}}|SpecList], [Mod|Names], - Param, Trc, Cov); -parse_cmd_line(['CASE',Mod,Case|Cmds], SpecList, Names, Param, Trc, Cov) -> + Param, Trc, Cov, TCCB); +parse_cmd_line(['CASE',Mod,Case|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) -> parse_cmd_line(Cmds, [{topcase,{Mod,Case}}|SpecList], [Mod|Names], - Param, Trc, Cov); -parse_cmd_line(['PARAMETERS',Param|Cmds], SpecList, Names, _Param, Trc, Cov) -> - parse_cmd_line(Cmds, SpecList, Names, Param, Trc, Cov); -parse_cmd_line(['TRACE',Trc|Cmds], SpecList, Names, Param, _Trc, Cov) -> - parse_cmd_line(Cmds, SpecList, Names, Param, Trc, Cov); -parse_cmd_line(['COVER',App,CF,Analyse|Cmds], SpecList, Names, Param, Trc, _Cov) -> - parse_cmd_line(Cmds, SpecList, Names, Param, Trc, {{App,CF}, Analyse}); -parse_cmd_line([Obj|_Cmds], _SpecList, _Names, _Param, _Trc, _Cov) -> + Param, Trc, Cov, TCCB); +parse_cmd_line(['PARAMETERS',Param|Cmds], SpecList, Names, _Param, Trc, Cov, TCCB) -> + parse_cmd_line(Cmds, SpecList, Names, Param, Trc, Cov, TCCB); +parse_cmd_line(['TRACE',Trc|Cmds], SpecList, Names, Param, _Trc, Cov, TCCB) -> + parse_cmd_line(Cmds, SpecList, Names, Param, Trc, Cov, TCCB); +parse_cmd_line(['COVER',App,CF,Analyse|Cmds], SpecList, Names, Param, Trc, _Cov, TCCB) -> + parse_cmd_line(Cmds, SpecList, Names, Param, Trc, {{App,CF}, Analyse}, TCCB); +parse_cmd_line(['TESTCASE_CALLBACK',Mod,Func|Cmds], SpecList, Names, Param, Trc, Cov, _) -> + parse_cmd_line(Cmds, SpecList, Names, Param, Trc, Cov, {Mod,Func}); +parse_cmd_line([Obj|_Cmds], _SpecList, _Names, _Param, _Trc, _Cov, _TCCB) -> io:format("~p: Bad argument: ~p\n", [?MODULE,Obj]), io:format(" Use the `ts' module to start tests.\n", []), io:format(" (If you ARE using `ts', there is a bug in `ts'.)\n", []), halt(1); -parse_cmd_line([], SpecList, Names, Param, Trc, Cov) -> +parse_cmd_line([], SpecList, Names, Param, Trc, Cov, TCCB) -> NameList = lists:reverse(Names, [suite]), Name = case lists:keysearch(name, 1, NameList) of {value,{name,N}} -> N; false -> hd(NameList) end, - {lists:reverse(SpecList), cast_to_list(Name), Param, Trc, Cov}. + {lists:reverse(SpecList), cast_to_list(Name), Param, Trc, Cov, TCCB}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% cast_to_list(X) -> string() @@ -387,7 +394,7 @@ run_test(CommandLine) -> process_flag(trap_exit,true), - {SpecList,Name,Param,Trc,Cov} = parse_cmd_line(CommandLine), + {SpecList,Name,Param,Trc,Cov,TCCB} = parse_cmd_line(CommandLine), {ok,_TSPid} = start_link(Param), case Trc of false -> ok; @@ -397,6 +404,7 @@ false -> ok; {{App,CoverFile},Analyse} -> cover(App, maybe_file(CoverFile), Analyse) end, + testcase_callback(TCCB), add_job(Name, {command_line,SpecList}), %% adding of jobs involves file i/o which may take long time @@ -489,6 +497,9 @@ cover(App, CoverFile, Exclude, Include, Cross, Export, Analyse) -> controller_call({cover,{App,{CoverFile,Exclude,Include,Cross,Export}},Analyse}). +testcase_callback(ModFunc) -> + controller_call({testcase_callback,ModFunc}). + set_random_seed(Seed) -> controller_call({set_random_seed,Seed}). @@ -766,14 +777,16 @@ Pid = spawn_tester( ?MODULE, do_spec, [SpecName,State#state.multiply_timetraps], - LogDir, Name, State#state.levels, ExtraTools1), + LogDir, Name, State#state.levels, + State#state.testcase_callback, ExtraTools1), NewJobs = [{Name,Pid}|State#state.jobs], {reply, ok, State#state{jobs=NewJobs}}; {command_line,SpecList} -> Pid = spawn_tester( ?MODULE, do_spec_list, [SpecList,State#state.multiply_timetraps], - LogDir, Name, State#state.levels, ExtraTools1), + LogDir, Name, State#state.levels, + State#state.testcase_callback, ExtraTools1), NewJobs = [{Name,Pid}|State#state.jobs], {reply, ok, State#state{jobs=NewJobs}}; TopCase -> @@ -788,7 +801,8 @@ ?MODULE, do_test_cases, [TopCase,Skip,Cfg, State#state.multiply_timetraps], - LogDir, Name, State#state.levels, ExtraTools1), + LogDir, Name, State#state.levels, + State#state.testcase_callback, ExtraTools1), NewJobs = [{Name,Pid}|State#state.jobs], {reply, ok, State#state{jobs=NewJobs}} end @@ -976,6 +990,38 @@ {reply,ok,State#state{cover={App,Analyse}}}; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% handle_call({testcase_callback,{Mod,Func}}, _, State) -> ok | {error,Reason} +%% +%% Add a callback function that will be called before and after every +%% test case (on the test case process): +%% +%% Mod:Func(Suite,TestCase,InitOrEnd,Config) +%% +%% InitOrEnd = init | 'end'. + +handle_call({testcase_callback,ModFunc}, _From, State) -> + case ModFunc of + {Mod,Func} -> + case code:is_loaded(Mod) of + {file,_} -> + ok; + false -> + code:load_file(Mod) + end, + case erlang:function_exported(Mod,Func,4) of + true -> + ok; + false -> + io:format(user, + "WARNING! Callback function ~w:~w/4 undefined.~n~n", + [Mod,Func]) + end; + _ -> + ok + end, + {reply,ok,State#state{testcase_callback=ModFunc}}; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% handle_call({set_random_seed,Seed}, _, State) -> ok | {error,Reason} %% %% Let operator set a random seed value to be used e.g. for shuffling @@ -1214,13 +1260,15 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% spawn_tester(Mod, Func, Args, Dir, Name, Levels, ExtraTools) -> Pid +%% spawn_tester(Mod, Func, Args, Dir, Name, Levels, +%% TestCaseCallback, ExtraTools) -> Pid %% Mod = atom() %% Func = atom() %% Args = [term(),...] %% Dir = string() %% Name = string() %% Levels = {integer(),integer(),integer()} +%% TestCaseCallback = {CBMod,CBFunc} | undefined %% ExtraTools = [ExtraTool,...] %% ExtraTool = CoverInfo | TraceInfo | RandomSeed %% @@ -1230,23 +1278,26 @@ %% When the named function is done executing, a summary of the results %% is printed to the log files. -spawn_tester(Mod, Func, Args, Dir, Name, Levels, ExtraTools) -> +spawn_tester(Mod, Func, Args, Dir, Name, Levels, TCCallback, ExtraTools) -> spawn_link( - fun() -> init_tester(Mod, Func, Args, Dir, Name, Levels, ExtraTools) + fun() -> init_tester(Mod, Func, Args, Dir, Name, Levels, + TCCallback, ExtraTools) end). -init_tester(Mod, Func, Args, Dir, Name, {SumLev,MajLev,MinLev}, ExtraTools) -> +init_tester(Mod, Func, Args, Dir, Name, {SumLev,MajLev,MinLev}, + TCCallback, ExtraTools) -> process_flag(trap_exit, true), put(test_server_name, Name), put(test_server_dir, Dir), put(test_server_total_time, 0), put(test_server_ok, 0), put(test_server_failed, 0), - put(test_server_skipped, 0), + put(test_server_skipped, {0,0}), put(test_server_summary_level, SumLev), put(test_server_major_level, MajLev), put(test_server_minor_level, MinLev), put(test_server_random_seed, proplists:get_value(random_seed, ExtraTools)), + put(test_server_testcase_callback, TCCallback), StartedExtraTools = start_extra_tools(ExtraTools), {TimeMy,Result} = ts_tc(Mod, Func, Args), put(test_server_common_io_handler, undefined), @@ -1269,8 +1320,8 @@ end, {SkippedN,SkipStr} = case get(test_server_skipped) of - 0 -> {0,""}; - Skipped -> {Skipped,io_lib:format(", ~p Skipped", [Skipped])} + {0,_} -> {0,""}; + {Skipped,_} -> {Skipped,io_lib:format(", ~p Skipped", [Skipped])} end, OkN = get(test_server_ok), FailedN = get(test_server_failed), @@ -1965,22 +2016,22 @@ maybe_get_privdir(), - Skipped = get(test_server_skipped), - {SkippedN,SkipStr} = - case Skipped of - 0 -> {0,""}; - Skipped -> {Skipped,io_lib:format(", ~w skipped", [Skipped])} + {AllSkippedN,UserSkipN,AutoSkipN,SkipStr} = + case get(test_server_skipped) of + {0,0} -> {0,0,0,""}; + {US,AS} -> {US+AS,US,AS,io_lib:format(", ~w skipped", [US+AS])} end, OkN = get(test_server_ok), FailedN = get(test_server_failed), print(1, "TEST COMPLETE, ~w ok, ~w failed~s of ~w test cases\n", - [OkN,FailedN,SkipStr,OkN+FailedN+SkippedN]), + [OkN,FailedN,SkipStr,OkN+FailedN+AllSkippedN]), test_server_sup:framework_call(report, [tests_done, - {OkN,FailedN,SkippedN}]), + {OkN,FailedN,{UserSkipN,AutoSkipN}}]), print(major, "=finished ~s", [lists:flatten(timestamp_get(""))]), print(major, "=failed ~p", [FailedN]), print(major, "=successful ~p", [OkN]), - print(major, "=skipped ~p", [SkippedN]), + print(major, "=user_skipped ~p", [UserSkipN]), + print(major, "=auto_skipped ~p", [AutoSkipN]), exit(test_suites_done). %% If the test is run at a remote target, this function sets up a socket @@ -2487,8 +2538,8 @@ Bad -> print(minor, "~n*** ~p returned bad elements in Config: ~p.~n", [Func,Bad]), - Cases2 = skip_cases_upto(Ref, Cases, "init_per_suite_bad_return", - conf, CurrMode), + Reason = {failed,{Mod,init_per_suite,bad_return}}, + Cases2 = skip_cases_upto(Ref, Cases, Reason, conf, CurrMode), set_io_buffering(IOHandler), stop_minor_log_file(), run_test_cases_loop(Cases2, Config, MultiplyTimetrap, Mode, @@ -2503,16 +2554,15 @@ print(minor, "~n*** ~p failed in ~p. Reason: ~p~n", [FwMod,FwFunc,Reason]), print(1, "~p failed in ~p. Reason: ~p~n", [FwMod,FwFunc,Reason]), exit(framework_error); - {_,Fail,_} when element(1,Fail)=='EXIT'; - element(1,Fail)==timetrap_timeout; - element(1,Fail)==failed -> + {_,Fail,_} when element(1,Fail) == 'EXIT'; + element(1,Fail) == timetrap_timeout; + element(1,Fail) == failed -> {Cases2,Config1} = if StartConf -> ReportAbortRepeat(failed), print(minor, "~n*** ~p failed.~n" - " Skipping all other cases.", [Func]), - Reason = lists:flatten(io_lib:format("~p:~p/1 failed", - [Mod,Func])), + " Skipping all cases.", [Func]), + Reason = {failed,{Mod,Func,Fail}}, {skip_cases_upto(Ref, Cases, Reason, conf, CurrMode),Config}; not StartConf -> ReportRepeatStop(), @@ -2523,26 +2573,18 @@ stop_minor_log_file(), run_test_cases_loop(Cases2, Config1, MultiplyTimetrap, Mode, delete_status(Ref, Status2)); - {died,_Why,_} when Func == init_per_suite -> + {died,Why,_} when Func == init_per_suite -> print(minor, "~n*** Unexpected exit during init_per_suite.~n", []), - Cases2 = skip_cases_upto(Ref, Cases, "init_per_suite_crashed", - conf, CurrMode), + Reason = {failed,{Mod,init_per_suite,Why}}, + Cases2 = skip_cases_upto(Ref, Cases, Reason, conf, CurrMode), set_io_buffering(IOHandler), stop_minor_log_file(), run_test_cases_loop(Cases2, Config, MultiplyTimetrap, Mode, delete_status(Ref, Status2)); - {_,_Other,_} when Func == init_per_suite -> - print(minor, "~n*** init_per_suite failed to return a Config list.~n", []), - Cases2 = skip_cases_upto(Ref, Cases, "init_per_suite_bad_return", - conf, CurrMode), - set_io_buffering(IOHandler), - stop_minor_log_file(), - run_test_cases_loop(Cases2, Config, MultiplyTimetrap, Mode, - delete_status(Ref, Status2)); {_,{Skip,Reason},_} when StartConf and ((Skip==skip) or (Skip==skipped)) -> ReportAbortRepeat(skipped), print(minor, "~n*** ~p skipped.~n" - " Skipping all other cases.", [Func]), + " Skipping all cases.", [Func]), set_io_buffering(IOHandler), stop_minor_log_file(), run_test_cases_loop(skip_cases_upto(Ref, Cases, Reason, conf, CurrMode), @@ -2551,12 +2593,20 @@ {_,{skip_and_save,Reason,_SavedConfig},_} when StartConf -> ReportAbortRepeat(skipped), print(minor, "~n*** ~p skipped.~n" - " Skipping all other cases.", [Func]), + " Skipping all cases.", [Func]), set_io_buffering(IOHandler), stop_minor_log_file(), run_test_cases_loop(skip_cases_upto(Ref, Cases, Reason, conf, CurrMode), Config, MultiplyTimetrap, Mode, delete_status(Ref, Status2)); + {_,_Other,_} when Func == init_per_suite -> + print(minor, "~n*** init_per_suite failed to return a Config list.~n", []), + Reason = {failed,{Mod,init_per_suite,bad_return}}, + Cases2 = skip_cases_upto(Ref, Cases, Reason, conf, CurrMode), + set_io_buffering(IOHandler), + stop_minor_log_file(), + run_test_cases_loop(Cases2, Config, MultiplyTimetrap, Mode, + delete_status(Ref, Status2)); {_,_Other,_} when StartConf -> print_conf_time(ConfTime), set_io_buffering(IOHandler), @@ -2586,10 +2636,10 @@ run_test_cases_loop([{make,Ref,{Mod,Func,Args}}|Cases0], Config, MultiplyTimetrap, Mode, Status) -> case run_test_case(Ref, 0, Mod, Func, Args, skip_init, host, MultiplyTimetrap) of - {_,{'EXIT',_},_} -> + {_,Why={'EXIT',_},_} -> print(minor, "~n*** ~p failed.~n" - " Skipping all other cases.", [Func]), - Reason = lists:flatten(io_lib:format("~p:~p/1 failed", [Mod,Func])), + " Skipping all cases.", [Func]), + Reason = {failed,{Mod,Func,Why}}, Cases = skip_cases_upto(Ref, Cases0, Reason, conf, Mode), stop_minor_log_file(), run_test_cases_loop(Cases, Config, MultiplyTimetrap, Mode, Status); @@ -2665,8 +2715,7 @@ true -> % skip rest of cases in sequence print(minor, "~n*** ~p failed.~n" " Skipping all other cases in sequence.", [Func]), - Reason = lists:flatten(io_lib:format("~p:~p/1 failed", - [Mod,Func])), + Reason = {failed,{Mod,Func}}, Cases2 = skip_cases_upto(Ref, Cases, Reason, tc, Mode), stop_minor_log_file(), run_test_cases_loop(Cases2, Config, MultiplyTimetrap, Mode, Status1) @@ -2926,10 +2975,13 @@ {{Col0,Col1},_} = get_font_style((CaseNum > 0), Mode), ResultCol = if Type == auto -> "#ffcc99"; Type == user -> "#ff9933" - end, + end, + + Comment1 = reason_to_string(Comment), + print(major, "~n=case ~p:~p", [Mod,Func]), print(major, "=started ~s", [lists:flatten(timestamp_get(""))]), - print(major, "=result skipped: ~s", [Comment]), + print(major, "=result skipped: ~s", [Comment1]), print(2,"*** Skipping test case #~w ~p ***", [CaseNum,{Mod,Func}]), print(html, "
    " @@ -2940,9 +2992,13 @@ "" "" "\n", - [num2str(CaseNum),Mod,Func,ResultCol,Comment]), + [num2str(CaseNum),Mod,Func,ResultCol,Comment1]), if CaseNum > 0 -> - put(test_server_skipped, get(test_server_skipped)+1), + {US,AS} = get(test_server_skipped), + case Type of + user -> put(test_server_skipped, {US+1,AS}); + auto -> put(test_server_skipped, {US,AS+1}) + end, put(test_server_case_num, CaseNum); true -> % conf ok @@ -2978,18 +3034,15 @@ %% the modified versions of these elements and the remaining (untouched) %% cases. -modify_cases_upto(Ref, AltOp, Cases) -> - {Original,Altered,Rest} = modify_cases_upto(Ref, AltOp, Cases, [], []), +modify_cases_upto(Ref, ModOp, Cases) -> + {Original,Altered,Rest} = modify_cases_upto(Ref, ModOp, Cases, [], []), {lists:reverse(Original),lists:reverse(Altered),Rest}. %% first case of a copy operation is the start conf modify_cases_upto(Ref, {copy,NewRef}=Op, [{conf,Ref,Props,MF}=C|T], Orig, Alt) -> modify_cases_upto(Ref, Op, T, [C|Orig], [{conf,NewRef,update_repeat(Props),MF}|Alt]); -%% next case is a conf with new ref (Origin was an end conf) = we're done already -modify_cases_upto(Ref, {skip,_,conf,_}, [{conf,Ref1,_,_}|_]=Cs, _, _) when Ref/=Ref1 -> - {[],[],Cs}; -modify_cases_upto(Ref, AltOp, Cases, Orig, Alt) -> +modify_cases_upto(Ref, ModOp, Cases, Orig, Alt) -> %% we need to check if there's an end conf case with the %% same ref in the list, if not, this *is* an end conf case case lists:any(fun({_,R,_,_}) when R == Ref -> true; @@ -2998,7 +3051,7 @@ (_) -> false end, Cases) of true -> - modify_cases_upto1(Ref, AltOp, Cases, Orig, Alt); + modify_cases_upto1(Ref, ModOp, Cases, Orig, Alt); false -> {[],[],Cases} end. @@ -3226,14 +3279,16 @@ {finished,_,Main,CaseNum,Mod,Func,Result,_RetVal} -> {Result,{Mod,Func}}; %% end of io session from test case executed by parallel process - {finished,_,CurrPid,CaseNum,Mod,Func,Result,_RetVal} -> + {finished,_,CurrPid,CaseNum,Mod,Func,Result,RetVal} -> case Result of ok -> put(test_server_ok, get(test_server_ok)+1); failed -> put(test_server_failed, get(test_server_failed)+1); skipped -> - put(test_server_skipped, get(test_server_skipped)+1) + SkipCounters = + update_skip_counters(RetVal, get(test_server_skipped)), + put(test_server_skipped, SkipCounters) end, {Result,{Mod,Func}}; @@ -3297,8 +3352,8 @@ Main = self(), {dictionary,State} = process_info(self(), dictionary), spawn_link(fun() -> - run_test_case1(Ref, Num, Mod, Func, Args, RunInit, Where, - MultiplyTimetrap, State, Mode, Main) + run_test_case1(Ref, Num, Mod, Func, Args, RunInit, Where, + MultiplyTimetrap, State, Mode, Main) end) end. @@ -3353,7 +3408,8 @@ print_timestamp(minor, "Ended at "), print(major, "=ended ~s", [lists:flatten(timestamp_get(""))]), - do_if_parallel(Main, ok, fun() -> file:set_cwd(filename:dirname(TSDir)) end), + do_if_parallel(Main, ok, fun() -> file:set_cwd(filename:dirname(TSDir)) end), + %% call the appropriate progress function clause to print the results to log Status = case {Time,RetVal} of @@ -3403,7 +3459,11 @@ {_,failed} -> put(test_server_failed, get(test_server_failed)+1); {_,skip} -> - put(test_server_skipped, get(test_server_skipped)+1) + {US,AS} = get(test_server_skipped), + put(test_server_skipped, {US+1,AS}); + {_,auto_skip} -> + {US,AS} = get(test_server_skipped), + put(test_server_skipped, {US,AS+1}) end, %% only if test case execution is sequential do we care about the %% remaining processes and slave nodes count @@ -3598,12 +3658,15 @@ progress(skip, CaseNum, Mod, Func, Loc, Reason, Time, Comment, {St0,St1}) -> - ReasonStr = cast_to_list(Reason), + {Reason1,{Color,Ret}} = if_auto_skip(Reason, + fun() -> {"#ffcc99",auto_skip} end, + fun() -> {"#ff9933",skip} end), print(major, "=result skipped", []), print(1, "*** SKIPPED *** ~s", [get_info_str(Func, CaseNum, get(test_server_cases))]), test_server_sup:framework_call(report, [tc_done,{?pl2a(Mod),Func, - {skipped,ReasonStr}}]), + {skipped,Reason1}}]), + ReasonStr = reason_to_string(Reason1), ReasonStr1 = lists:flatten([string:strip(S,left) || S <- string:tokens(ReasonStr,[$\n])]), ReasonStr2 = @@ -3614,17 +3677,17 @@ end, Comment1 = case Comment of "" -> ""; - _ -> "
    (" ++ Comment ++ ")" + _ -> "
    (" ++ to_string(Comment) ++ ")" end, print(html, "" - "" + "" "\n", - [Time,ReasonStr2,Comment1]), + [Time,Color,ReasonStr2,Comment1]), FormatLoc = test_server_sup:format_loc(Loc), print(minor, "=== location ~s", [FormatLoc]), print(minor, "=== reason = ~s", [ReasonStr1]), - skip; + Ret; progress(failed, CaseNum, Mod, Func, Loc, timetrap_timeout, T, Comment0, {St0,St1}) -> @@ -3640,7 +3703,7 @@ case Comment0 of "" -> "" ++ ErrorReason ++ ""; _ -> "" ++ ErrorReason ++ "
    " ++ - Comment0 + to_string(Comment0) end, print(html, "" @@ -3666,7 +3729,7 @@ case Comment0 of "" -> "" ++ ErrorReason ++ ""; _ -> "" ++ ErrorReason ++ "
    " ++ - Comment0 + to_string(Comment0) end, print(html, "" @@ -3701,7 +3764,7 @@ case Comment0 of "" -> "" ++ ErrorReason2 ++ ""; _ -> "" ++ ErrorReason2 ++ "
    " ++ - Comment0 + to_string(Comment0) end, print(html, "" @@ -3726,7 +3789,7 @@ Comment = case Comment0 of "" -> ""; - _ -> "
    " ++ Comment0 + _ -> "
    " ++ to_string(Comment0) end, FormatLastLoc = test_server_sup:format_loc(get_last_loc(Loc)), print(html, @@ -3754,7 +3817,7 @@ print(major, "=result ok", []), case Comment0 of "" -> ""; - _ -> "" + _ -> "" end end, print(major, "=elapsed ~p", [Time]), @@ -3769,6 +3832,21 @@ %%-------------------------------------------------------------------- %% various help functions +if_auto_skip(Reason={failed,{_,init_per_testcase,_}}, True, _False) -> + {Reason,True()}; +if_auto_skip({_T,{skip,Reason={failed,{_,init_per_testcase,_}}},_Opts}, True, _False) -> + {Reason,True()}; +if_auto_skip({fw_auto_skip,Reason}, True, _False) -> + {Reason,True()}; +if_auto_skip({_T,{skip,{fw_auto_skip,Reason}},_Opts}, True, _False) -> + {Reason,True()}; +if_auto_skip(Reason, _True, False) -> + {Reason,False()}. + +update_skip_counters(RetVal, {US,AS}) -> + {_,Result} = if_auto_skip(RetVal, fun() -> {US,AS+1} end, fun() -> {US+1,AS} end), + Result. + get_info_str(Func, 0, _Cases) -> atom_to_list(Func); get_info_str(_Func, CaseNum, unknown) -> @@ -3786,10 +3864,10 @@ to_string(Term) when is_list(Term) -> case (catch io_lib:format("~s", [Term])) of {'EXIT',_} -> io_lib:format("~p", [Term]); - String -> String + String -> lists:flatten(String) end; to_string(Term) -> - io_lib:format("~p", [Term]). + lists:flatten(io_lib:format("~p", [Term])). get_last_loc(Loc) when is_tuple(Loc) -> Loc; @@ -3798,6 +3876,17 @@ get_last_loc(Loc) -> Loc. +reason_to_string({failed,{_,FailFunc,bad_return}}) -> + atom_to_list(FailFunc) ++ " bad return value"; +reason_to_string({failed,{_,FailFunc,{timetrap_timeout,_}}}) -> + atom_to_list(FailFunc) ++ " timed out"; +reason_to_string(FWInitFail = {failed,{_CB,init_tc,_Reason}}) -> + to_string(FWInitFail); +reason_to_string({failed,{_,FailFunc,_}}) -> + atom_to_list(FailFunc) ++ " failed"; +reason_to_string(Other) -> + to_string(Other). + %get_font_style(Prop) -> % {Col,St0,St1} = get_font_style1(Prop), % {{"",""}, @@ -4849,18 +4938,40 @@ "

    Coverdata collected over all tests

    ", [?cross_coverlog_name]), - {CoverFile,Excluded} = + {CoverFile,_Included,Excluded} = case CoverInfo of - {File,Excl,_Incl,_Cross,Export} -> + {File,Excl,Incl,_Cross,Export} -> cover:export(Export), - {File,Excl}; + {File,Incl,Excl}; File -> - {Excl,_} = read_cover_file(File), - {File,Excl} + {Excl,Incl} = read_cover_file(File), + {File,Incl,Excl} end, - io:fwrite(CoverLog, "

    CoverFile: ~p\n", [CoverFile]), - io:fwrite(CoverLog, "

    Excluded modules: ~p\n", [Excluded]), + io:fwrite(CoverLog, "

    CoverFile: ~p\n", [CoverFile]), + + case length(cover:imported_modules()) of + Imps when Imps > 0 -> + io:fwrite(CoverLog, "

    Analysis includes data from ~w imported module(s).\n", + [Imps]); + _ -> + ok + end, + + io:fwrite(CoverLog, "

    Excluded module(s): ~p\n", [Excluded]), + Coverage = cover_analyse(Analyse, AnalyseMods), + + case lists:filter(fun({_M,{_,_,_}}) -> false; + (_) -> true + end, Coverage) of + [] -> + ok; + Bad -> + io:fwrite(CoverLog, "

    Analysis failed for ~w module(s): " + "~w\n", + [length(Bad),[BadM || {BadM,{_,_Why}} <- Bad]]) + end, + TotPercent = write_cover_result_table(CoverLog, Coverage), file:write_file(filename:join(TestDir, ?cover_total), term_to_binary(TotPercent)). diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/test_server.erl erlang-13.b.3-dfsg/lib/test_server/src/test_server.erl --- erlang-13.b.1-dfsg/lib/test_server/src/test_server.erl 2009-06-05 14:02:52.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/test_server/src/test_server.erl 2009-11-20 13:34:52.000000000 +0000 @@ -431,7 +431,7 @@ %% Also, if a Dir exists, cover data will be exported to a file called %% all.coverdata in that directory. cover_analyse(Analyse,Modules) -> - io:fwrite("Cover analysing... ",[]), + io:fwrite("Cover analysing...\n",[]), DetailsFun = case Analyse of {details,Dir} -> @@ -476,13 +476,14 @@ {ok,{M,{Cov,NotCov}}} -> {M,{Cov,NotCov,DetailsFun(M)}}; Err -> + io:fwrite("WARNING: Analysis failed for ~w. Reason: ~p\n", + [M,Err]), {M,Err} end end, Modules), Sticky = unstick_all_sticky(node()), cover:stop(), stick_all_sticky(node(),Sticky), - io:fwrite("done\n\n",[]), R. @@ -508,7 +509,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% run_test_case_apply(Mod,Func,Args,Name,Run_init,MultiplyTimetrap) -> +%% run_test_case_apply(Mod,Func,Args,Name,RunInit,MultiplyTimetrap) -> %% {Time,Value,Loc,Opts,Comment} | {died,Reason,unknown,Comment} %% %% Time = float() (seconds) @@ -541,7 +542,7 @@ %% Timetraps will be multiplied by this integer. If it is infinity, no %% timetraps will be started at all. -run_test_case_apply({CaseNum,Mod,Func,Args,Name,Run_init,MultiplyTimetrap}) -> +run_test_case_apply({CaseNum,Mod,Func,Args,Name,RunInit,MultiplyTimetrap}) -> purify_format("Test case #~w ~w:~w/1", [CaseNum, Mod, Func]), case os:getenv("TS_RUN_VALGRIND") of false -> @@ -552,17 +553,17 @@ end, test_server_h:testcase({Mod,Func,1}), ProcBef = erlang:system_info(process_count), - Result = run_test_case_apply(Mod, Func, Args, Name, Run_init, MultiplyTimetrap), + Result = run_test_case_apply(Mod, Func, Args, Name, RunInit, MultiplyTimetrap), ProcAft = erlang:system_info(process_count), purify_new_leaks(), DetFail = get(test_server_detected_fail), {Result,DetFail,ProcBef,ProcAft}. -run_test_case_apply(Mod, Func, Args, Name, Run_init, MultiplyTimetrap) -> +run_test_case_apply(Mod, Func, Args, Name, RunInit, MultiplyTimetrap) -> case get(test_server_job_dir) of undefined -> %% i'm a local target - do_run_test_case_apply(Mod, Func, Args, Name, Run_init, MultiplyTimetrap); + do_run_test_case_apply(Mod, Func, Args, Name, RunInit, MultiplyTimetrap); JobDir -> %% i'm a remote target case Args of @@ -576,14 +577,14 @@ TargetPrivDir = filename:join(JobDir, ?priv_dir), Config2 = lists:keyreplace(priv_dir, 1, Config1, {priv_dir,TargetPrivDir}), - do_run_test_case_apply(Mod, Func, [Config2], Name, Run_init, + do_run_test_case_apply(Mod, Func, [Config2], Name, RunInit, MultiplyTimetrap); _other -> - do_run_test_case_apply(Mod, Func, Args, Name, Run_init, + do_run_test_case_apply(Mod, Func, Args, Name, RunInit, MultiplyTimetrap) end end. -do_run_test_case_apply(Mod, Func, Args, Name, Run_init, MultiplyTimetrap) -> +do_run_test_case_apply(Mod, Func, Args, Name, RunInit, MultiplyTimetrap) -> {ok,Cwd} = file:get_cwd(), Args2Print = case Args of [Args1] when is_list(Args1) -> @@ -594,6 +595,7 @@ print(minor, "Test case started with:\n~s:~s(~p)\n", [Mod,Func,Args2Print]), print(minor, "Current directory is ~p\n", [Cwd]), print_timestamp(minor,"Started at "), + TCCallback = get(test_server_testcase_callback), Ref = make_ref(), OldGLeader = group_leader(), %% Set ourself to group leader for the spawned process @@ -601,7 +603,9 @@ Pid = spawn_link( fun() -> - run_test_case_eval(Mod, Func, Args, Name, Ref, Run_init, MultiplyTimetrap) + run_test_case_eval(Mod, Func, Args, Name, Ref, + RunInit, MultiplyTimetrap, + TCCallback) end), group_leader(OldGLeader, self()), put(test_server_detected_fail, []), @@ -621,8 +625,8 @@ %% are made in this function! {Timeout,ReturnValue} = case Terminate of - {true, RetVal} -> - {20, RetVal}; + {true, ReturnVal} -> + {20, ReturnVal}; false -> {infinity, should_never_appear} end, @@ -722,8 +726,8 @@ end, run_test_case_msgloop(Ref,Pid,CaptureStdout,Terminate1,NewComment); {'EXIT',Pid,{Ref,Time,Value,Loc,Opts}} -> - ReturVal = {Time/1000000,Value,mod_loc(Loc),Opts,Comment}, - run_test_case_msgloop(Ref,Pid,CaptureStdout,{true,ReturVal},Comment); + RetVal = {Time/1000000,Value,mod_loc(Loc),Opts,Comment}, + run_test_case_msgloop(Ref,Pid,CaptureStdout,{true,RetVal},Comment); {'EXIT',Pid,Reason} -> case Reason of {timetrap_timeout,TVal,Loc} -> @@ -734,30 +738,38 @@ %% group leader process or io will cause deadlock, %% so we spawn a dedicated process for the operation %% and let the group leader go back to handle io. - spawn_fw_call(Mod,Func,Pid,{timetrap_timeout,TVal},Loc1,self()), + spawn_fw_call(Mod,Func,Pid,{timetrap_timeout,TVal}, + Loc1,self(),Comment), run_test_case_msgloop(Ref,Pid,CaptureStdout,Terminate,Comment); + {timetrap_timeout,TVal,Loc,InitOrEnd} -> + Loc1 = mod_loc(Loc), + {Mod,_Func} = get_mf(Loc1), + spawn_fw_call(Mod,InitOrEnd,Pid,{timetrap_timeout,TVal}, + Loc1,self(),Comment), + run_test_case_msgloop(Ref,Pid,CaptureStdout,Terminate,Comment); {testcase_aborted,Reason,Loc} -> Loc1 = mod_loc(Loc), {Mod,Func} = get_mf(Loc1), - spawn_fw_call(Mod,Func,Pid,{testcase_aborted,Reason},Loc1,self()), + spawn_fw_call(Mod,Func,Pid,{testcase_aborted,Reason}, + Loc1,self(),Comment), run_test_case_msgloop(Ref,Pid,CaptureStdout,Terminate,Comment); killed -> %% result of an exit(TestCase,kill) call, which is the %% only way to abort a testcase process that traps exits %% (see abort_current_testcase) spawn_fw_call(undefined,undefined,Pid,testcase_aborted_or_killed, - unknown,self()), + unknown,self(),Comment), run_test_case_msgloop(Ref,Pid,CaptureStdout,Terminate,Comment); _ -> %% the testcase has terminated because of Reason (e.g. an exit %% because a linked process failed) - spawn_fw_call(undefined,undefined,Pid,Reason,unknown,self()), + spawn_fw_call(undefined,undefined,Pid,Reason, + unknown,self(),Comment), run_test_case_msgloop(Ref,Pid,CaptureStdout,Terminate,Comment) end; - {_FwCallPid,fw_notify_done,Error,Loc} -> + {_FwCallPid,fw_notify_done,RetVal} -> %% the framework has been notified, we're finished - ReturVal = {died,Error,Loc,Comment}, - run_test_case_msgloop(Ref,Pid,CaptureStdout,{true,ReturVal},Comment); + run_test_case_msgloop(Ref,Pid,CaptureStdout,{true,RetVal},Comment); {'EXIT',_FwCallPid,{fw_notify_done,Func,Error}} -> %% a framework function failed CB = os:getenv("TEST_SERVER_FRAMEWORK"), @@ -767,8 +779,8 @@ _ -> {list_to_atom(CB),Func} end, - ReturVal = {died,{framework_error,Loc,Error},Loc,"Framework error"}, - run_test_case_msgloop(Ref,Pid,CaptureStdout,{true,ReturVal},Comment); + RetVal = {died,{framework_error,Loc,Error},Loc,"Framework error"}, + run_test_case_msgloop(Ref,Pid,CaptureStdout,{true,RetVal},Comment); {failed,File,Line} -> put(test_server_detected_fail, [{File, Line}| get(test_server_detected_fail)]), @@ -803,7 +815,51 @@ output(Msg,Sender) -> local_or_remote_apply({test_server_ctrl,output,[Msg,Sender]}). -spawn_fw_call(Mod,Func,Pid,Error,Loc,SendTo) -> +spawn_fw_call(Mod,{init_per_testcase,Func},Pid,{timetrap_timeout,TVal}=Why, + Loc,SendTo,Comment) -> + FwCall = + fun() -> + Skip = {skip,{failed,{Mod,init_per_testcase,Why}}}, + %% if init_per_testcase fails, the test case + %% should be skipped + case catch test_server_sup:framework_call( + end_tc,[?pl2a(Mod),Func,{Pid,Skip,[[]]}]) of + {'EXIT',FwEndTCErr} -> + exit({fw_notify_done,end_tc,FwEndTCErr}); + _ -> + ok + end, + %% finished, report back + SendTo ! {self(),fw_notify_done, + {TVal/1000,Skip,Loc,[],Comment}} + end, + spawn_link(FwCall); +spawn_fw_call(Mod,{end_per_testcase,Func},Pid,{timetrap_timeout,TVal}=Why, + Loc,SendTo,_Comment) -> + FwCall = + fun() -> + Conf = [{tc_status,ok}], + %% if end_per_testcase fails, the test case should be + %% reported successful with a warning printed as comment + case catch test_server_sup:framework_call(end_tc, + [?pl2a(Mod),Func, + {Pid, + {failed,{Mod,end_per_testcase,Why}}, + [Conf]}]) of + {'EXIT',FwEndTCErr} -> + exit({fw_notify_done,end_tc,FwEndTCErr}); + _ -> + ok + end, + %% finished, report back + SendTo ! {self(),fw_notify_done, + {TVal/1000,{error,{Mod,end_per_testcase,Why}},Loc,[], + ["" + "WARNING: end_per_testcase timed out!" + ""]}} + end, + spawn_link(FwCall); +spawn_fw_call(Mod,Func,Pid,Error,Loc,SendTo,Comment) -> FwCall = fun() -> case catch fw_error_notify(Mod,Func,[], @@ -814,7 +870,7 @@ _ -> ok end, - Conf = [{tc_status,{failed,timetrap}}], + Conf = [{tc_status,{failed,timetrap_timeout}}], case catch test_server_sup:framework_call(end_tc, [?pl2a(Mod),Func, {Pid,Error,[Conf]}]) of @@ -824,7 +880,7 @@ ok end, %% finished, report back - SendTo ! {self(),fw_notify_done,Error,Loc} + SendTo ! {self(),fw_notify_done,{died,Error,Loc,Comment}} end, spawn_link(FwCall). @@ -877,34 +933,42 @@ %% A test case is known to have failed if it returns {'EXIT', _} tuple, %% or sends a message {failed, File, Line} to it's group_leader -run_test_case_eval(Mod, Func, Args0, Name, Ref, Run_init, MultiplyTimetrap) -> +run_test_case_eval(Mod, Func, Args0, Name, Ref, RunInit, + MultiplyTimetrap, TCCallback) -> put(test_server_multiply_timetraps,MultiplyTimetrap), {{Time,Value},Loc,Opts} = case test_server_sup:framework_call(init_tc,[?pl2a(Mod),Func,Args0], {ok,Args0}) of {ok,Args} -> - run_test_case_eval1(Mod, Func, Args, Name, Run_init); - Error = {error,Reason} -> - CB = os:getenv("TEST_SERVER_FRAMEWORK"), - SkipReason = io_lib:format("{init_tc_failed,~s,~p}", - [CB,Reason]), - Return = {{0,{skip,SkipReason}},{list_to_atom(CB),init_tc},[]}, + run_test_case_eval1(Mod, Func, Args, Name, RunInit, TCCallback); + Error = {error,_Reason} -> test_server_sup:framework_call(end_tc,[?pl2a(Mod),Func,{Error,Args0}]), - Return; - Skip = {skip,Reason} -> - SkipReason = io_lib:format("~p",[Reason]), - Return = {{0,{skip,SkipReason}},{Mod,Func},[]}, + {{0,{skip,{failed,Error}}},{Mod,Func},[]}; + {fail,Reason} -> + [Conf] = Args0, + Conf1 = [{tc_status,{failed,Reason}} | Conf], + fw_error_notify(Mod, Func, Conf, Reason), + test_server_sup:framework_call(end_tc,[?pl2a(Mod),Func, + {{error,Reason},[Conf1]}]), + {{0,{failed,Reason}},{Mod,Func},[]}; + Skip = {skip,_Reason} -> test_server_sup:framework_call(end_tc,[?pl2a(Mod),Func,{Skip,Args0}]), - Return + {{0,Skip},{Mod,Func},[]}; + {auto_skip,Reason} -> + test_server_sup:framework_call(end_tc,[?pl2a(Mod), + Func, + {{skip,Reason},Args0}]), + {{0,{skip,{fw_auto_skip,Reason}}},{Mod,Func},[]} end, exit({Ref,Time,Value,Loc,Opts}). -run_test_case_eval1(Mod, Func, Args, Name, Run_init) -> - case Run_init of +run_test_case_eval1(Mod, Func, Args, Name, RunInit, TCCallback) -> + case RunInit of run_init -> + put(test_server_init_or_end_conf,{init_per_testcase,Func}), put(test_server_loc, {Mod,{init_per_testcase,Func}}), ensure_timetrap(Args), - case init_per_testcase(Mod,Func,Args) of + case init_per_testcase(Mod, Func, Args) of Skip = {skip,Reason} -> Line = get_loc(), Conf = [{tc_status,{skipped,Reason}}], @@ -916,60 +980,71 @@ test_server_sup:framework_call(end_tc,[?pl2a(Mod),Func, {{skip,Reason},[Conf]}]), {{0,{skip,Reason}},Line,[]}; - {ok,New_conf} -> - %% init_per_testcase defined, - %% returns new configuration + {ok,NewConf} -> + put(test_server_init_or_end_conf,undefined), + %% call user callback function if defined + NewConf1 = user_callback(TCCallback, Mod, Func, init, NewConf), put(test_server_loc, {Mod,Func}), %% execute the test case - {{T,Return},Loc} = {ts_tc(Mod, Func, [New_conf]),get_loc()}, - {End_conf,TSReturn,FWReturn} = + {{T,Return},Loc} = {ts_tc(Mod, Func, [NewConf1]),get_loc()}, + {EndConf,TSReturn,FWReturn} = case Return of {E,TCError} when E=='EXIT' ; E==failed -> - fw_error_notify(Mod,Func,New_conf, - TCError,mod_loc(Loc)), - {[{tc_status,{failed,TCError}}|New_conf], + fw_error_notify(Mod, Func, NewConf1, + TCError, mod_loc(Loc)), + {[{tc_status,{failed,TCError}}|NewConf1], Return,{error,TCError}}; SaveCfg={save_config,_} -> - {[{tc_status,ok},SaveCfg|New_conf],Return,ok}; + {[{tc_status,ok},SaveCfg|NewConf1],Return,ok}; {skip_and_save,Why,SaveCfg} -> Skip = {skip,Why}, - {[{tc_status,{skipped,Why}},{save_config,SaveCfg}|New_conf], + {[{tc_status,{skipped,Why}},{save_config,SaveCfg}|NewConf1], Skip,Skip}; {skip,Why} -> - {[{tc_status,{skipped,Why}}|New_conf],Return,Return}; + {[{tc_status,{skipped,Why}}|NewConf1],Return,Return}; _ -> - {[{tc_status,ok}|New_conf],Return,ok} + {[{tc_status,ok}|NewConf1],Return,ok} end, - End_conf1 = - case end_per_testcase(Mod,Func,End_conf) of + %% call user callback function if defined + EndConf1 = user_callback(TCCallback, Mod, Func, 'end', EndConf), + {FWReturn1,TSReturn1,EndConf2} = + case end_per_testcase(Mod, Func, EndConf1) of SaveCfg1={save_config,_} -> - [SaveCfg1|lists:keydelete(save_config,1,End_conf)]; + {FWReturn,TSReturn,[SaveCfg1|lists:keydelete(save_config, 1, EndConf1)]}; + {fail,ReasonToFail} -> % user has failed the testcase + fw_error_notify(Mod, Func, EndConf1, ReasonToFail), + {{error,ReasonToFail},{failed,ReasonToFail},EndConf1}; + {failed,{_,end_per_testcase,_}} = Failure -> % unexpected termination + {Failure,TSReturn,EndConf1}; _ -> - End_conf + {FWReturn,TSReturn,EndConf1} end, - case test_server_sup:framework_call(end_tc, [?pl2a(Mod),Func, - {FWReturn,[End_conf1]}]) of + case test_server_sup:framework_call(end_tc, [?pl2a(Mod), Func, + {FWReturn1,[EndConf2]}]) of {fail,Reason} -> - FW = list_to_atom(os:getenv("TEST_SERVER_FRAMEWORK")), - fw_error_notify(Mod, Func, End_conf1, Reason), - {{T,{'EXIT',Reason}},FW,[]}; + fw_error_notify(Mod, Func, EndConf2, Reason), + {{T,{failed,Reason}},{Mod,Func},[]}; _ -> - {{T,TSReturn},Loc,[]} + {{T,TSReturn1},Loc,[]} end end; skip_init -> - ensure_timetrap(Args), + %% call user callback function if defined + Args1 = user_callback(TCCallback, Mod, Func, init, Args), + ensure_timetrap(Args1), %% ts_tc does a catch put(test_server_loc, {Mod,Func}), %% if this is a named conf group, the test case (init or end conf) %% should be called with the name as the first argument - Args1 = if Name == undefined -> Args; - true -> [Name | Args] + Args2 = if Name == undefined -> Args1; + true -> [Name | Args1] end, %% execute the conf test case - {{T,Return},Loc} = {ts_tc(Mod, Func, Args1),get_loc()}, - {Return1,Opts} = process_return_val([Return], Mod,Func,Args, Loc, Return), - {{T,Return1},Loc,Opts} + {{T,Return},Loc} = {ts_tc(Mod, Func, Args2),get_loc()}, + %% call user callback function if defined + Return1 = user_callback(TCCallback, Mod, Func, 'end', Return), + {Return2,Opts} = process_return_val([Return1], Mod,Func,Args1, Loc, Return1), + {{T,Return2},Loc,Opts} end. %% the return value is a list and we have to check if it contains @@ -1017,11 +1092,29 @@ test_server_sup:framework_call(end_tc, [?pl2a(M),F,{Final,A}]), {Final,lists:reverse(SaveOpts)}. -init_per_testcase(Mod,Func,Args) -> +user_callback(undefined, _, _, _, Args) -> + Args; +user_callback({CBMod,CBFunc}, Mod, Func, InitOrEnd, [Args]) when is_list(Args) -> + case catch apply(CBMod, CBFunc, [InitOrEnd,Mod,Func,Args]) of + Args1 when is_list(Args1) -> + [Args1]; + _ -> + [Args] + end; +user_callback({CBMod,CBFunc}, Mod, Func, InitOrEnd, Args) -> + case catch apply(CBMod, CBFunc, [InitOrEnd,Mod,Func,Args]) of + Args1 when is_list(Args1) -> + Args1; + _ -> + Args + end. + +init_per_testcase(Mod, Func, Args) -> case code:is_loaded(Mod) of false -> code:load_file(Mod); _ -> ok end, + %% init_per_testcase defined, returns new configuration case erlang:function_exported(Mod,init_per_testcase,2) of true -> case catch my_apply(Mod, init_per_testcase, [Func|Args]) of @@ -1039,22 +1132,21 @@ group_leader() ! {printout,12, "ERROR! init_per_testcase has returned " "bad elements in Config: ~p\n",[Bad]}, - {skip,init_per_testcase_bad_return} + {skip,{failed,{Mod,init_per_testcase,bad_return}}} end; {'$test_server_ok',_Other} -> group_leader() ! {printout,12, "ERROR! init_per_testcase did not return " "a Config list.\n",[]}, - {skip,init_per_testcase_bad_return}; - {'EXIT', Reason} -> + {skip,{failed,{Mod,init_per_testcase,bad_return}}}; + {'EXIT',Reason} -> Line = get_loc(), FormattedLoc = test_server_sup:format_loc(mod_loc(Line)), group_leader() ! {printout,12, "ERROR! init_per_testcase crashed!\n" "\tLocation: ~s\n\tReason: ~p\n", - [FormattedLoc, Reason]}, - SkipReason = {init_per_testcase_failed,Reason}, - {skip,SkipReason}; + [FormattedLoc,Reason]}, + {skip,{failed,{Mod,init_per_testcase,Reason}}}; Other -> Line = get_loc(), FormattedLoc = test_server_sup:format_loc(mod_loc(Line)), @@ -1062,8 +1154,7 @@ "ERROR! init_per_testcase thrown!\n" "\tLocation: ~s\n\tReason: ~p\n", [FormattedLoc, Other]}, - SkipReason = {init_per_testcase_thrown,Other}, - {skip,SkipReason} + {skip,{failed,{Mod,init_per_testcase,Other}}} end; false -> %% Optional init_per_testcase not defined @@ -1072,29 +1163,34 @@ {ok, Config} end. -end_per_testcase(Mod,Func,Conf) -> +end_per_testcase(Mod, Func, Conf) -> case erlang:function_exported(Mod,end_per_testcase,2) of true -> - do_end_per_testcase(Mod, end_per_testcase, Func, Conf); + do_end_per_testcase(Mod,end_per_testcase,Func,Conf); false -> %% Backwards compatibility! case erlang:function_exported(Mod,fin_per_testcase,2) of true -> - do_end_per_testcase(Mod, fin_per_testcase, Func, Conf); + do_end_per_testcase(Mod,fin_per_testcase,Func,Conf); false -> ok end end. do_end_per_testcase(Mod,EndFunc,Func,Conf) -> + put(test_server_init_or_end_conf,{EndFunc,Func}), put(test_server_loc, {Mod,{EndFunc,Func}}), case catch my_apply(Mod, EndFunc, [Func,Conf]) of {'$test_server_ok',SaveCfg={save_config,_}} -> SaveCfg; + {'$test_server_ok',{fail,_}=Fail} -> + Fail; {'$test_server_ok',_} -> ok; - {'EXIT',Reason} -> - comment(io_lib:format("WARNING: ~w crashed!\n",[EndFunc])), + {'EXIT',Reason} = Why -> + comment(io_lib:format("" + "WARNING: ~w crashed!" + "\n",[EndFunc])), group_leader() ! {printout,12, "WARNING: ~w crashed!\n" "Reason: ~p\n" @@ -1102,9 +1198,11 @@ [EndFunc, Reason, test_server_sup:format_loc( mod_loc(get_loc()))]}, - ok; + {failed,{Mod,end_per_testcase,Why}}; Other -> - comment(io_lib:format("WARNING: ~w thrown!\n",[EndFunc])), + comment(io_lib:format("" + "WARNING: ~w thrown!" + "\n",[EndFunc])), group_leader() ! {printout,12, "WARNING: ~w thrown!\n" "Reason: ~p\n" @@ -1112,10 +1210,9 @@ [EndFunc, Other, test_server_sup:format_loc( mod_loc(get_loc()))]}, - ok + {failed,{Mod,end_per_testcase,Other}} end. - get_loc() -> case catch test_server_line:get_lines() of [] -> diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/test_server_sup.erl erlang-13.b.3-dfsg/lib/test_server/src/test_server_sup.erl --- erlang-13.b.1-dfsg/lib/test_server/src/test_server_sup.erl 2009-06-05 14:02:53.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/test_server/src/test_server_sup.erl 2009-11-20 13:35:01.000000000 +0000 @@ -48,7 +48,13 @@ after trunc(Timeout) -> Line = test_server:get_loc(Pid), Mon = erlang:monitor(process, Pid), - Trap = {timetrap_timeout, trunc(Timeout), Line}, + Trap = + case get(test_server_init_or_end_conf) of + undefined -> + {timetrap_timeout,trunc(Timeout),Line}; + InitOrEnd -> + {timetrap_timeout,trunc(Timeout),Line,InitOrEnd} + end, exit(Pid,Trap), receive {'DOWN', Mon, process, Pid, _} -> diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/ts.config erlang-13.b.3-dfsg/lib/test_server/src/ts.config --- erlang-13.b.1-dfsg/lib/test_server/src/ts.config 2009-03-12 12:27:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/src/ts.config 2009-09-18 15:11:50.000000000 +0100 @@ -5,17 +5,17 @@ %%% test_hosts are looked up using "ypmatch xx yy zz hosts" {test_hosts, [bingo, hurin, turin, gandalf, super, - merry, nenya, sam, elrond, strider]}. + merry, nenya, sam, elrond, isildur]}. %% IPv4 host only - no ipv6 entry must exist! {test_host_ipv4_only, - {"strider", %Short hostname - "strider.du.uab.ericsson.se", %Long hostname - "134.138.177.74", %IP string - {134,138,177,74}, %IP tuple - ["strider"], %Any aliases - "::ffff:134.138.177.74", %IPv6 string (compatibilty addr) - {0,0,0,0,0,65535,34442,45386} %IPv6 tuple + {"isildur", %Short hostname + "isildur.du.uab.ericsson.se", %Long hostname + "134.138.177.24", %IP string + {134,138,177,24}, %IP tuple + ["isildur"], %Any aliases + "::ffff:134.138.177.24", %IPv6 string (compatibilty addr) + {0,0,0,0,0,65535,34442,45336} %IPv6 tuple }}. {test_host_ipv6_only, diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/ts.erl erlang-13.b.3-dfsg/lib/test_server/src/ts.erl --- erlang-13.b.1-dfsg/lib/test_server/src/ts.erl 2009-04-16 10:25:58.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/test_server/src/ts.erl 2009-09-18 15:11:35.000000000 +0100 @@ -355,30 +355,47 @@ case lists:keysearch(vars, 1, Config) of {value, {vars, List}} -> List0 = special_vars(Config), - {vars, [List0|List]}; + Key = fun(T) -> element(1,T) end, + DelDupList = + lists:filter(fun(V) -> + case lists:keysearch(Key(V),1,List0) of + {value,_} -> false; + _ -> true + end + end, List), + {vars, [List0|DelDupList]}; _ -> {vars, special_vars(Config)} end. %% Allow some shortcuts in the Options... special_vars(Config) -> - Verbose= + SpecVars = case lists:member(verbose, Config) of true -> - {verbose, 1}; + [{verbose, 1}]; false -> case lists:keysearch(verbose, 1, Config) of {value, {verbose, Lvl}} -> - {verbose, Lvl}; + [{verbose, Lvl}]; _ -> - {verbose, 0} + [{verbose, 0}] end end, - case lists:keysearch(diskless, 1, Config) of - {value,{diskless, true}} -> - [Verbose,{diskless, true}]; + SpecVars1 = + case lists:keysearch(diskless, 1, Config) of + {value,{diskless, true}} -> + [{diskless, true} | SpecVars]; + _ -> + SpecVars + end, + case lists:keysearch(testcase_callback, 1, Config) of + {value,{testcase_callback, CBM, CBF}} -> + [{ts_testcase_callback, {CBM,CBF}} | SpecVars1]; + {value,{testcase_callback, CB}} -> + [{ts_testcase_callback, CB} | SpecVars1]; _ -> - [Verbose] + SpecVars1 end. configtrace(Config) -> @@ -626,9 +643,9 @@ {value, {_, CaseNum}} = lists:keysearch(test_server_case_num, 1, PI), {value, {_, Cases}} = lists:keysearch(test_server_cases, 1, PI), {value, {_, Failed}} = lists:keysearch(test_server_failed, 1, PI), - {value, {_, Skipped}} = lists:keysearch(test_server_skipped, 1, PI), + {value, {_, {UserSkipped,AutoSkipped}}} = lists:keysearch(test_server_skipped, 1, PI), {value, {_, Ok}} = lists:keysearch(test_server_ok, 1, PI), - nformat(Name, CaseNum, Cases, Ok, Failed, Skipped), + nformat(Name, CaseNum, Cases, Ok, Failed, UserSkipped+AutoSkipped), i(Rest); i([]) -> ok. diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/ts_install.erl erlang-13.b.3-dfsg/lib/test_server/src/ts_install.erl --- erlang-13.b.1-dfsg/lib/test_server/src/ts_install.erl 2009-06-05 13:54:41.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/test_server/src/ts_install.erl 2009-11-20 13:35:01.000000000 +0000 @@ -104,12 +104,26 @@ end, case filelib:is_file(Configure) of true -> - Port = open_port({spawn, Configure ++ Args}, [stream, eof]), + Env = macosx_cflags(), + Port = open_port({spawn, Configure ++ Args}, + [stream, eof, {env,Env}]), ts_lib:print_data(Port); false -> {error, no_configure_script} end. +macosx_cflags() -> + case os:type() of + {unix, darwin} -> + %% To ensure that the drivers we build can be loaded + %% by the emulator, add either -m32 or -m64 to CFLAGS. + WordSize = erlang:system_info(wordsize), + Mflag = "-m" ++ integer_to_list(8*WordSize), + [{"CFLAGS", Mflag},{"LDFLAGS", Mflag}]; + _ -> + [] + end. + write_terms(Name, Terms) -> case file:open(Name, [write]) of {ok, Fd} -> @@ -142,7 +156,22 @@ {rsh_name, get_rsh_name()}, {platform_label, PlatformLabel}, {erl_flags, []}, - {erl_release, Version}|Vars0]}. + {erl_release, Version}, + {ts_testcase_callback, get_testcase_callback()} | Vars0]}. + +get_testcase_callback() -> + case os:getenv("TS_TESTCASE_CALLBACK") of + ModFunc when is_list(ModFunc), ModFunc /= "" -> + case string:tokens(ModFunc, " ") of + [_Mod,_Func] -> ModFunc; + _ -> "" + end; + _ -> + case init:get_argument(ts_testcase_callback) of + {ok,[[Mod,Func]]} -> Mod ++ " " ++ Func; + _ -> "" + end + end. get_rsh_name() -> case os:getenv("ERL_RSH") of diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/ts_reports.erl erlang-13.b.3-dfsg/lib/test_server/src/ts_reports.erl --- erlang-13.b.1-dfsg/lib/test_server/src/ts_reports.erl 2009-03-12 12:26:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/src/ts_reports.erl 2009-09-18 15:11:36.000000000 +0100 @@ -116,14 +116,28 @@ erlang:error({bad_installation,file:format_error(Reason)}, [Dir]) end. -make_master_index(Platform, Dirname, {Succ, Fail, Skip}, Result) -> +make_master_index(Platform, Dirname, {Succ, Fail, UserSkip,AutoSkip}, Result) -> Link = filename:join(filename:basename(Dirname), "index.html"), + FailStr = + if Fail > 0 -> + ["", + integer_to_list(Fail),""]; + true -> + integer_to_list(Fail) + end, + AutoSkipStr = + if AutoSkip > 0 -> + ["", + integer_to_list(AutoSkip),""]; + true -> integer_to_list(AutoSkip) + end, [Result, "

    \n", "", "\n", make_row(integer_to_list(Succ), false), - make_row(integer_to_list(Fail), false), - make_row(integer_to_list(Skip), false), + make_row(FailStr, false), + make_row(integer_to_list(UserSkip), false), + make_row(AutoSkipStr, false), "\n"]. %% Make index page which points out individual test suites for a single platform. @@ -161,7 +175,7 @@ true -> add_last_name(Logs0); false -> Logs0 end, - {ok, {Index0, Summary}} = make_index(Logs, header(Vars), 0, 0, 0, 0), + {ok, {Index0, Summary}} = make_index(Logs, header(Vars), 0, 0, 0, 0, 0), Index = [Index0|footer()], case ts_lib:force_write_file(IndexName, Index) of ok -> @@ -170,14 +184,14 @@ error({index_write_error, Reason}) end. -make_index([Name|Rest], Result, TotSucc, TotFail, TotSkip, TotNotBuilt) -> +make_index([Name|Rest], Result, TotSucc, TotFail, UserSkip, AutoSkip, TotNotBuilt) -> case ts_lib:last_test(Name) of false -> %% Silently skip. - make_index(Rest, Result, TotSucc, TotFail, TotSkip, TotNotBuilt); + make_index(Rest, Result, TotSucc, TotFail, UserSkip, AutoSkip, TotNotBuilt); Last -> case count_cases(Last) of - {Succ, Fail, Skip} -> + {Succ, Fail, USkip, ASkip} -> Cov = case file:read_file(filename:join(Last,?cover_total)) of {ok,Bin} -> @@ -190,22 +204,36 @@ JustTheName = rootname(basename(Name)), NotBuilt = not_built(JustTheName), NewResult = [Result, make_index1(JustTheName, - Link, Succ, Fail, Skip, + Link, Succ, Fail, USkip, ASkip, NotBuilt, Cov, false)], make_index(Rest, NewResult, TotSucc+Succ, TotFail+Fail, - TotSkip+Skip, TotNotBuilt+NotBuilt ); + UserSkip+USkip, AutoSkip+ASkip, TotNotBuilt+NotBuilt); error -> - make_index(Rest, Result, TotSucc, TotFail, TotSkip, + make_index(Rest, Result, TotSucc, TotFail, UserSkip, AutoSkip, TotNotBuilt) end end; -make_index([], Result, TotSucc, TotFail, TotSkip, TotNotBuilt) -> +make_index([], Result, TotSucc, TotFail, UserSkip, AutoSkip, TotNotBuilt) -> {ok, {[Result|make_index1("Total", no_link, - TotSucc, TotFail, TotSkip, TotNotBuilt, "", true)], - {TotSucc, TotFail, TotSkip}}}. + TotSucc, TotFail, UserSkip, AutoSkip, + TotNotBuilt, "", true)], + {TotSucc, TotFail, UserSkip, AutoSkip}}}. -make_index1(SuiteName, Link, Success, Fail, Skipped, NotBuilt, Coverage, Bold) -> +make_index1(SuiteName, Link, Success, Fail, UserSkip, AutoSkip, NotBuilt, Coverage, Bold) -> Name = test_suite_name(SuiteName), + FailStr = + if Fail > 0 -> + ["", + integer_to_list(Fail),""]; + true -> + integer_to_list(Fail) + end, + AutoSkipStr = + if AutoSkip > 0 -> + ["", + integer_to_list(AutoSkip),""]; + true -> integer_to_list(AutoSkip) + end, ["\n", "\n"] end, make_row(integer_to_list(Success), Bold), - make_row(integer_to_list(Fail), Bold), - make_row(integer_to_list(Skipped), Bold), + make_row(FailStr, Bold), + make_row(integer_to_list(UserSkip), Bold), + make_row(AutoSkipStr, Bold), make_row(integer_to_list(NotBuilt), Bold), make_row(Coverage, Bold), "\n"]. @@ -297,7 +326,8 @@ "\n", "\n", "\n", - "\n" + "\n" + "\n" "\n" "\n" "\n"]. @@ -374,7 +404,8 @@ "\n", "\n", "\n", - "\n" + "\n" + "\n" "\n"]. master_footer() -> @@ -432,13 +463,15 @@ count_cases(Dir) -> SumFile = filename:join(Dir, ?run_summary), case read_summary(SumFile, [summary]) of + {ok, [{Succ,Fail,Skip}]} -> + {Succ,Fail,Skip,0}; {ok, [Summary]} -> Summary; {error, _} -> LogFile = filename:join(Dir, ?suitelog_name), case file:read_file(LogFile) of {ok, Bin} -> - Summary = count_cases1(binary_to_list(Bin), {0, 0, 0}), + Summary = count_cases1(binary_to_list(Bin), {0, 0, 0, 0}), write_summary(SumFile, Summary), Summary; {error, _Reason} -> @@ -470,15 +503,21 @@ {error, Reason} end. -count_cases1("=failed" ++ Rest, {Success, _Fail, Skipped}) -> +count_cases1("=failed" ++ Rest, {Success, _Fail, UserSkip,AutoSkip}) -> + {NextLine, Count} = get_number(Rest), + count_cases1(NextLine, {Success, Count, UserSkip,AutoSkip}); +count_cases1("=successful" ++ Rest, {_Success, Fail, UserSkip,AutoSkip}) -> + {NextLine, Count} = get_number(Rest), + count_cases1(NextLine, {Count, Fail, UserSkip,AutoSkip}); +count_cases1("=skipped" ++ Rest, {Success, Fail, _UserSkip,AutoSkip}) -> {NextLine, Count} = get_number(Rest), - count_cases1(NextLine, {Success, Count, Skipped}); -count_cases1("=successful" ++ Rest, {_Success, Fail, Skipped}) -> + count_cases1(NextLine, {Success, Fail, Count,AutoSkip}); +count_cases1("=user_skipped" ++ Rest, {Success, Fail, _UserSkip,AutoSkip}) -> {NextLine, Count} = get_number(Rest), - count_cases1(NextLine, {Count, Fail, Skipped}); -count_cases1("=skipped" ++ Rest, {Success, Fail, _Skipped}) -> + count_cases1(NextLine, {Success, Fail, Count,AutoSkip}); +count_cases1("=auto_skipped" ++ Rest, {Success, Fail, UserSkip,_AutoSkip}) -> {NextLine, Count} = get_number(Rest), - count_cases1(NextLine, {Success, Fail, Count}); + count_cases1(NextLine, {Success, Fail, UserSkip,Count}); count_cases1([], Counters) -> Counters; count_cases1(Other, Counters) -> diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/ts_run.erl erlang-13.b.3-dfsg/lib/test_server/src/ts_run.erl --- erlang-13.b.1-dfsg/lib/test_server/src/ts_run.erl 2009-04-16 10:25:59.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/test_server/src/ts_run.erl 2009-09-18 15:11:36.000000000 +0100 @@ -655,7 +655,23 @@ false -> "" end, - Args0 ++ Parameters ++ Trace ++ Cover. + TCCallback = + case ts_lib:var(ts_testcase_callback, Vars) of + "" -> + ""; + {Mod,Func} -> + io:format("Function ~w:~w/4 will be called before and " + "after each test case.\n", [Mod,Func]), + " TESTCASE_CALLBACK " ++ to_list(Mod) ++ " " ++ to_list(Func); + ModFunc when is_list(ModFunc) -> + [Mod,Func]=string:tokens(ModFunc," "), + io:format("Function ~s:~s/4 will be called before and " + "after each test case.\n", [Mod,Func]), + " TESTCASE_CALLBACK " ++ ModFunc; + _ -> + "" + end, + Args0 ++ Parameters ++ Trace ++ Cover ++ TCCallback. to_list(X) when is_atom(X) -> atom_to_list(X); diff -Nru erlang-13.b.1-dfsg/lib/test_server/src/ts.win32.config erlang-13.b.3-dfsg/lib/test_server/src/ts.win32.config --- erlang-13.b.1-dfsg/lib/test_server/src/ts.win32.config 2009-03-12 12:27:07.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/test_server/src/ts.win32.config 2009-09-18 15:11:50.000000000 +0100 @@ -2,7 +2,7 @@ %%% There is no equivalent command to ypmatch on Win32... :-( {hardcoded_hosts, - [{"134.138.177.74","strider"}, + [{"134.138.177.24","isildur"}, {"134.138.177.72", "elrond"}, {"134.138.176.215", "nenya"}, {"134.138.176.192", "merry"}, diff -Nru erlang-13.b.1-dfsg/lib/test_server/vsn.mk erlang-13.b.3-dfsg/lib/test_server/vsn.mk --- erlang-13.b.1-dfsg/lib/test_server/vsn.mk 2009-06-05 14:02:52.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/test_server/vsn.mk 2009-11-20 13:34:53.000000000 +0000 @@ -1,2 +1,2 @@ -TEST_SERVER_VSN = 3.3.2 +TEST_SERVER_VSN = 3.3.5 diff -Nru erlang-13.b.1-dfsg/lib/toolbar/doc/src/book.xml erlang-13.b.3-dfsg/lib/toolbar/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/toolbar/doc/src/book.xml 2007-11-26 19:03:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/toolbar/doc/src/book.xml 2009-11-20 13:33:56.000000000 +0000 @@ -1,29 +1,27 @@ - +>
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - Toolbar Application (TOOLBAR) + Toolbar Joakim Grebenö 1997-05-02 @@ -32,16 +30,19 @@
    - Toolbar Application (TOOLBAR) + Toolbar - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/toolbar/doc/src/Makefile erlang-13.b.3-dfsg/lib/toolbar/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/toolbar/doc/src/Makefile 2007-11-26 19:03:13.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/toolbar/doc/src/Makefile 2009-11-20 13:33:56.000000000 +0000 @@ -1,19 +1,20 @@ -# ``The contents of this file are subject to the Erlang Public License, +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in # compliance with the License. You should have received a copy of the # Erlang Public License along with this software. If not, it can be -# retrieved via the world wide web at http://www.erlang.org/. +# retrieved online at http://www.erlang.org/. # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # -# The Initial Developer of the Original Code is Ericsson Utvecklings AB. -# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings -# AB. All Rights Reserved.'' -# -# $Id$ +# %CopyrightEnd% # include $(ERL_TOP)/make/target.mk include $(ERL_TOP)/make/$(TARGET)/otp.mk @@ -23,17 +24,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(TOOLBAR_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=toolbar # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/toolbar-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -46,6 +42,10 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + GIF_FILES = \ bar.gif \ create_tool.gif \ @@ -57,29 +57,12 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = toolbar-$(VSN).pdf -TOP_PS_FILE = toolbar-$(VSN).ps +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -93,21 +76,13 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) @@ -115,36 +90,26 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 release_spec: diff -Nru erlang-13.b.1-dfsg/lib/toolbar/doc/src/notes.xml erlang-13.b.3-dfsg/lib/toolbar/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/toolbar/doc/src/notes.xml 2009-03-12 15:27:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/toolbar/doc/src/notes.xml 2009-11-20 13:34:18.000000000 +0000 @@ -26,10 +26,28 @@ nil nil nil + notes.xml

    This document describes the changes made to the Toolbar application.

    +
    Toolbar 1.4.1 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    +
    Toolbar 1.4
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/toolbar/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/toolbar/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/toolbar/doc/src/part_notes.xml 2007-11-26 19:03:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/toolbar/doc/src/part_notes.xml 2009-11-20 13:34:21.000000000 +0000 @@ -1,26 +1,24 @@ - +>
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Toolbar Release Notes @@ -35,6 +33,6 @@ the Erlang/OTP tools. It consists of a number of power buttons, one for each available tool.

    - + diff -Nru erlang-13.b.1-dfsg/lib/toolbar/doc/src/part.xml erlang-13.b.3-dfsg/lib/toolbar/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/toolbar/doc/src/part.xml 2007-11-26 19:03:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/toolbar/doc/src/part.xml 2009-11-20 13:33:50.000000000 +0000 @@ -1,26 +1,24 @@ - +>
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Toolbar User's Guide @@ -35,6 +33,6 @@ the Erlang/OTP tools. It consists of a number of power buttons, one for each available tool.

    - + diff -Nru erlang-13.b.1-dfsg/lib/toolbar/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/toolbar/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/toolbar/doc/src/ref_man.xml 2007-11-26 19:03:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/toolbar/doc/src/ref_man.xml 2009-11-20 13:33:50.000000000 +0000 @@ -1,26 +1,24 @@ - +>
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Toolbar Reference Manual @@ -35,6 +33,6 @@ the Erlang/OTP tools. It consists of a number of power buttons, one for each available tool.

    - + diff -Nru erlang-13.b.1-dfsg/lib/toolbar/doc/src/toolbar_chapter.xml erlang-13.b.3-dfsg/lib/toolbar/doc/src/toolbar_chapter.xml --- erlang-13.b.1-dfsg/lib/toolbar/doc/src/toolbar_chapter.xml 2007-11-26 19:02:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/toolbar/doc/src/toolbar_chapter.xml 2009-11-20 13:33:47.000000000 +0000 @@ -4,23 +4,21 @@
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Toolbar @@ -28,7 +26,7 @@ 1997-04-21 A - ch5toolb.ae + toolbar_chapter.xml

    Toolbar provides an interface to the various Erlang tools which are available. Toolbar can also provide access to user supplied tools which are included with the Erlang software release. These tools are called GS Contributions.

    All tools included in Toolbar must have a configuration file which contains information about the tool, such as its start function and the location of help information. The name of a configuration file must include the suffix .tool. @@ -49,7 +47,7 @@

    The following illustration shows The Toolbar Window.

    - + The Toolbar Window

    Each icon on Toolbar represents a separate tool, which is started by clicking on the icon. You can also display place the mouse pointer over an icon to display the name of the tool at the bottom of Toolbar window. @@ -94,7 +92,7 @@

    This window is displayed when you select Create Tool File from the Tools menu. The following illustration shows The Create Tool File Window.

    - + The Create Tool File Window

    Follow these steps to create a new tool file, or to edit an existing tool file:

    diff -Nru erlang-13.b.1-dfsg/lib/toolbar/vsn.mk erlang-13.b.3-dfsg/lib/toolbar/vsn.mk --- erlang-13.b.1-dfsg/lib/toolbar/vsn.mk 2009-03-12 12:23:19.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/toolbar/vsn.mk 2009-11-20 13:33:52.000000000 +0000 @@ -1,4 +1,4 @@ -TOOLBAR_VSN = 1.4 +TOOLBAR_VSN = 1.4.1 diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/book.xml erlang-13.b.3-dfsg/lib/tools/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/book.xml 2007-11-26 19:03:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/book.xml 2009-11-20 13:33:58.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Tools @@ -35,11 +33,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/cover_chapter.xml erlang-13.b.3-dfsg/lib/tools/doc/src/cover_chapter.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/cover_chapter.xml 2009-03-12 12:24:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/cover_chapter.xml 2009-11-20 13:34:11.000000000 +0000 @@ -26,6 +26,7 @@ + cover_chapter.xml
    diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/cprof_chapter.xml erlang-13.b.3-dfsg/lib/tools/doc/src/cprof_chapter.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/cprof_chapter.xml 2009-03-12 12:24:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/cprof_chapter.xml 2009-11-20 13:34:16.000000000 +0000 @@ -29,7 +29,7 @@ no 2002-09-11 PA1 - cprof_chapter.sgml + cprof_chapter.xml

    cprof is a profiling tool that can be used to get a picture of how often different functions in the system are called. diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/eprof.xml erlang-13.b.3-dfsg/lib/tools/doc/src/eprof.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/eprof.xml 2007-11-26 19:02:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/eprof.xml 2009-11-20 13:33:44.000000000 +0000 @@ -4,23 +4,21 @@

    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + eprof @@ -35,7 +33,7 @@

    The module eprof provides a set of functions for time profiling of Erlang programs to find out how the execution time is used. The profiling is done using the Erlang trace BIFs. Tracing of - local function calls for a specfied set of processes is enabled when + local function calls for a specified set of processes is enabled when profiling is begun, and disabled when profiling is stopped.

    When using Eprof, expect a significant slowdown in program execution, in most cases at least 100 percent.

    diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/erlang_mode_chapter.xml erlang-13.b.3-dfsg/lib/tools/doc/src/erlang_mode_chapter.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/erlang_mode_chapter.xml 2009-03-12 12:24:51.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/erlang_mode_chapter.xml 2009-11-20 13:34:18.000000000 +0000 @@ -26,13 +26,14 @@ + erlang_mode_chapter.xml
    Purpose

    The purpose of this user guide is to introduce you to the Erlang mode for Emacs and gives some relevant background - information of the functions and features. See also Erlang mode reference manual The + information of the functions and features. See also Erlang mode reference manual The purpose of the Erlang mode itself is to facilitate the developing process for the Erlang programmer.

    @@ -196,7 +197,7 @@ Emacs yet (well, what are you waiting around here for? Off you go and upgrade!) -- etags associate the file extensions .erl and .hrl with Erlang.

    -

    Basically, the etags utility is runed using the following form:

    +

    Basically, the etags utility is ran using the following form:

    etags file1.erl file2.erl

    This will create a file named TAGS in the current directory.

    diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/erlang_mode.xml erlang-13.b.3-dfsg/lib/tools/doc/src/erlang_mode.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/erlang_mode.xml 2009-03-12 12:24:50.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/erlang_mode.xml 2009-11-20 13:34:17.000000000 +0000 @@ -28,7 +28,7 @@
    - erlang.el + erlang.el Erlang mode for Emacs

    Possibly the most important feature of an editor designed for @@ -99,9 +99,9 @@

    Edit - Comment/Uncomment Region -

    C-c C-c will put comment charachters at the - begining of all lines in a marked region. If you want to have - two comment charachters instead of one you can do C-u 2 C-c C-c

    +

    C-c C-c will put comment characters at the + beginning of all lines in a marked region. If you want to have + two comment characters instead of one you can do C-u 2 C-c C-c

    C-c C-u will undo a comment-region command.

    @@ -117,7 +117,7 @@ function below the current function. M-C-a (erlang-beginning-of-clause) - As above but move point to the beginning of the current or - precqeding Erlang clause. + preceding Erlang clause. C-a M-e (erlang-end-of-function) - Move to the end of the current or following Erlang function. With an numeric argument (ex C-u 2 C-a M-e) the function @@ -163,17 +163,17 @@

    C-c C-a (erlang-align-arrows) - aligns arrows after clauses inside a region.

    -\011Example: -\011 -\011sum(L) -> sum(L, 0). -\011sum([H|T], Sum) -> sum(T, Sum + H); -\011sum([], Sum) -> Sum. -\011 -\011becomes: -\011 -\011sum(L) -> sum(L, 0). -\011sum([H|T], Sum) -> sum(T, Sum + H); -\011sum([], Sum) -> Sum." + Example: + + sum(L) -> sum(L, 0). + sum([H|T], Sum) -> sum(T, Sum + H); + sum([], Sum) -> Sum. + + becomes: + + sum(L) -> sum(L, 0). + sum([H|T], Sum) -> sum(T, Sum + H); + sum([], Sum) -> Sum."
    @@ -198,7 +198,7 @@
    Tags -

    For the tag commands to work it requiers that you have +

    For the tag commands to work it requires that you have generated a tag file. See Erlang mode users guide

    @@ -206,7 +206,7 @@ Find a function definition. The default value is the function name under the point. Find Tag (erlang-find-tag) - Like the Elisp-function - `find-tag'. Capable of retreiving Erlang modules. Tags can be + `find-tag'. Capable of retrieving Erlang modules. Tags can be given on the forms `tag', `module:', `module:tag'. M-+ (erlang-find-next-tag) - Find the next occurrence of tag. @@ -233,7 +233,7 @@ Simple skeletons: If, Case, Receive, Receive After, Receive Loop - Basic code constructs. - Header elementes: Module, Author - These commands inserts + Header elements: Module, Author - These commands insert lines on the form -module(xxx). and -author('my@home').. They can be used directly, but are also used as part of the full headers described below. diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/fprof_chapter.xml erlang-13.b.3-dfsg/lib/tools/doc/src/fprof_chapter.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/fprof_chapter.xml 2009-03-12 12:24:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/fprof_chapter.xml 2009-11-20 13:34:12.000000000 +0000 @@ -29,7 +29,7 @@ no 2001-08-14 PA1 - fprof_chapter.sgml + fprof_chapter.xml

    fprof is a profiling tool that can be used to get a picture of how much processing time different functions consumes and in which diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/fprof.xml erlang-13.b.3-dfsg/lib/tools/doc/src/fprof.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/fprof.xml 2009-03-12 12:24:33.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/fprof.xml 2009-11-20 13:34:11.000000000 +0000 @@ -58,7 +58,7 @@

    If, however, the profiling time is short, and the host machine OS does not support high resolution cpu time measurements, some - few OS schedulings may show up as ridicously long execution + few OS schedulings may show up as ridiculously long execution times for functions doing practically nothing. An example of a function more or less just composing a tuple in about 100 times the normal execution time has been seen, and when the tracing @@ -585,7 +585,7 @@ internals in this example are very version dependent.

    As an example, we will use the following function, that you may - recogise as a slightly modified benchmark function from the + recognise as a slightly modified benchmark function from the manpage file(3):

    -

    The columns are: CNT - the number of times the funcion +

    The columns are: CNT - the number of times the function has been called, ACC - the time spent in the function including called functions, and OWN - the time spent in the function not including called @@ -734,7 +734,7 @@ receive or erlang:yield/0 in the code, it must be Erlang scheduling suspensions, or the trace file driver compensating for large file write operations (these are regarded - as a shedule out followed by a shedule in to the same process). + as a schedule out followed by a schedule in to the same process).

    Let us find the suspend entry:

    @@ -769,7 +769,7 @@ including time in suspension. Whether suspend time is really ACC or OWN time is more of a philosophical question.

    -

    Now we look at another interesting pesudo function, +

    Now we look at another interesting pseudo function, garbage_collect:

     {[{{prim_file,drv_command,4},            25,    0.873,    0.873},      
    @@ -817,7 +817,7 @@
      [{suspend,                              15,    1.713,    0.000}]}.    

    This is 86 % of the total run time, and as we saw before it is the close operation the absolutely biggest contributor. We - find a comparision ratio a little bit up in the call stack:

    + find a comparison ratio a little bit up in the call stack:

     {[{{prim_file,close,1},                   1, 1398.748,    0.024},      
       {{prim_file,write,2},                 769,  174.672,   12.810},      
    @@ -834,7 +834,7 @@
         

    The unsleeping reader may notice that the ACC times for prim_file:drv_command/2 and prim_file:drv_command/4 is not equal between the - paragraphs above, even though it is easy to beleive that + paragraphs above, even though it is easy to believe that prim_file:drv_command/2 is just a passthrough function.

    The missing time can be found in the paragraph diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/instrument.xml erlang-13.b.3-dfsg/lib/tools/doc/src/instrument.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/instrument.xml 2007-11-26 19:03:23.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/instrument.xml 2009-11-20 13:34:03.000000000 +0000 @@ -4,23 +4,21 @@

    - 1998 - 2007 - Ericsson AB, All Rights Reserved + 19982009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + instrument @@ -52,7 +50,7 @@ allocation map. A memory allocation map contains a list of descriptors for each allocated memory block. Currently, a descriptor is a 4-tuple

    -\011{TypeNo, Address, Size, PidDesc}    
    + {TypeNo, Address, Size, PidDesc}

    where TypeNo is the memory block type number, Address is its place in memory, and Size is its size, in bytes. PidDesc is either a tuple {X,Y,Z} identifying the @@ -344,7 +342,7 @@

    Stores the current memory allocation map on the file File. Returns true if the emulator has been started with the "+Mim true" command-line argument, and - the map was successfully stored; otherwise, false. The + the map was successfuly stored; otherwise, false. The contents of the file can later be read using read_memory_data/1. NOTE:store_memory_data/0 blocks execution of @@ -362,7 +360,7 @@

    Stores the current memory status on the file File. Returns true if the emulator has been started with the "+Mis true", or "+Mim true" - command-line arguments, and the data was successfully stored; + command-line arguments, and the data was successfuly stored; otherwise, false. The contents of the file can later be read using read_memory_status/1.

    diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/Makefile erlang-13.b.3-dfsg/lib/tools/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/tools/doc/src/Makefile 2007-11-26 19:03:14.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/Makefile 2009-11-20 13:33:57.000000000 +0000 @@ -1,19 +1,20 @@ -# ``The contents of this file are subject to the Erlang Public License, +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in # compliance with the License. You should have received a copy of the # Erlang Public License along with this software. If not, it can be -# retrieved via the world wide web at http://www.erlang.org/. +# retrieved online at http://www.erlang.org/. # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # -# The Initial Developer of the Original Code is Ericsson Utvecklings AB. -# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings -# AB. All Rights Reserved.'' -# -# $Id$ +# %CopyrightEnd% # include $(ERL_TOP)/make/target.mk include $(ERL_TOP)/make/$(TARGET)/otp.mk @@ -23,17 +24,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(TOOLS_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=tools # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/tools-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -65,9 +61,11 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + GIF_FILES = \ - warning.gif \ - note.gif \ venn1.gif \ venn2.gif @@ -77,35 +75,17 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = tools-$(VSN).pdf -TOP_PS_FILE = tools-$(VSN).ps +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- XML_FLAGS += -DVIPS_FLAGS += # ---------------------------------------------------- # Targets @@ -113,21 +93,13 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man -pdf: $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) @@ -135,36 +107,26 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 release_spec: diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/notes.xml erlang-13.b.3-dfsg/lib/tools/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/notes.xml 2009-04-16 10:25:08.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/notes.xml 2009-11-20 13:34:19.000000000 +0000 @@ -26,9 +26,43 @@ + notes.xml

    This document describes the changes made to the Tools application.

    +
    Tools 2.6.5 + +
    Fixed Bugs and Malfunctions + + +

    The coverage analysis tool cover has been + improved when it comes to handling list and bit string + comprehensions (a counter for each qualifier), bit syntax + expressions (the Value and Size expressions), and try + expressions (the body called Exprs in the Reference + Manual). A few (not all) situations where several + expressions are put on the same line are also handled + better than before.

    +

    Own Id: OTP-8188 Aux Id: seq11397

    +
    + +

    When loading Cover compiled code on remote nodes + running code in the loaded module, a badarg + failure was sometimes the result. This bug has been fixed.

    +

    Own Id: OTP-8270 Aux Id: seq11423

    +
    + +

    The short-circuit operators andalso and + orelse are now handled correctly by the coverage + analysis tool cover (it is no longer checked + that the second argument returns a Boolean value.)

    +

    Own Id: OTP-8273

    +
    +
    +
    + +
    +
    Tools 2.6.4
    Fixed Bugs and Malfunctions @@ -138,14 +172,14 @@

    Missing buffer-local declaration in erlang.el has been - added. Before this fix there could araise problems in + added. Before this fix there could arise problems in other emacs modes after visiting a buffer using the erlang mode.

    Own Id: OTP-6721

    Key-map for 'backward-delete-char-untabif updated to work - proparly with Xemacs.

    + properly with Xemacs.

    Own Id: OTP-6723

    @@ -373,7 +407,7 @@

    The cover tool did not escape '<' and '>' not - beeing part of HTML tags in HTML log files.

    + being part of HTML tags in HTML log files.

    Own Id: OTP-5588

    diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/tools/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/part_notes.xml 2007-11-26 19:03:53.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/part_notes.xml 2009-11-20 13:34:21.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Tools Release Notes @@ -35,6 +33,6 @@

    For information about older versions, see Release Notes History.

    - + diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/part.xml erlang-13.b.3-dfsg/lib/tools/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/part.xml 2007-11-26 19:03:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/part.xml 2009-11-20 13:33:48.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Tools User's Guide @@ -67,10 +65,10 @@ between functions, modules, applications and releases. - - - - - + + + + + diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/tools/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/ref_man.xml 2007-11-26 19:02:58.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/ref_man.xml 2009-11-20 13:33:45.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1996 - 2007 - Ericsson AB, All Rights Reserved + 19962009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Tools Reference Manual @@ -66,14 +64,14 @@ between functions, modules, applications and releases. - - - - - - - - - + + + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/tools/doc/src/xref_chapter.xml erlang-13.b.3-dfsg/lib/tools/doc/src/xref_chapter.xml --- erlang-13.b.1-dfsg/lib/tools/doc/src/xref_chapter.xml 2007-11-26 19:03:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/doc/src/xref_chapter.xml 2009-11-20 13:34:08.000000000 +0000 @@ -4,23 +4,21 @@
    - 2000 - 2007 - Ericsson AB, All Rights Reserved + 20002009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Xref - The Cross Reference Tool @@ -31,7 +29,7 @@ no 2000-08-18 PA1 - xref_chapter.sgml + xref_chapter.xml

    Xref is a cross reference tool that can be used for finding dependencies between functions, modules, applications @@ -64,10 +62,10 @@ -export([t/1]). t(A) -> -\011my_module:t2(A). + my_module:t2(A). t2(_) -> -\011true. + true.

    Cross reference data are read from BEAM files, so the first step when checking an edited module is to compile it:

    @@ -199,7 +197,7 @@

    Using these facts, the two small circles in the picture below can be combined.

    - + Definition and use of functions

    It is often clarifying to mark the variables of a query in such @@ -208,7 +206,7 @@ functions only are not marked in the locals_not_used circle.

    - + Some predefined analyses as subsets of all functions
    @@ -265,7 +263,7 @@ debugger, if there is such a chain, otherwise false. The chain of calls is represented by a list of modules, toolbar being the first element and - debugger\011the last element. + debuggerthe last element. xref:q(s, "closure E | toolbar:Mod || debugger:Mod"). All (in)direct calls from functions in toolbar to functions in debugger. @@ -321,10 +319,10 @@ {ok, _} = xref:q(S, "Eplus := closure E"), {ok, Ms} = xref:q(S, "AM"), Fun = fun(M, N) -> -\011\011 Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]), -\011\011 {ok, N0} = xref:q(S, lists:flatten(Q)), -\011\011 N + N0 -\011 end, + Q = io_lib:format("# (Mod) (Eplus | ~p : Mod)", [M]), + {ok, N0} = xref:q(S, lists:flatten(Q)), + N + N0 + end, Sum = lists:foldl(Fun, 0, Ms), ok = xref:forget(S, 'Eplus'), {ok, Tot} = xref:q(S, "# (closure ME | AM)"), diff -Nru erlang-13.b.1-dfsg/lib/tools/emacs/AUTHORS erlang-13.b.3-dfsg/lib/tools/emacs/AUTHORS --- erlang-13.b.1-dfsg/lib/tools/emacs/AUTHORS 2004-09-14 13:14:05.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/tools/emacs/AUTHORS 2009-11-20 13:34:05.000000000 +0000 @@ -12,3 +12,4 @@ Currently maintained by: Ingela Anderton Andin +Dan Gudmundsson \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/tools/emacs/erlang.el erlang-13.b.3-dfsg/lib/tools/emacs/erlang.el --- erlang-13.b.1-dfsg/lib/tools/emacs/erlang.el 2009-03-12 12:23:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tools/emacs/erlang.el 2009-11-20 13:33:43.000000000 +0000 @@ -1,33 +1,28 @@ ;; erlang.el --- Major modes for editing and running Erlang - -;; Copyright (C) 1995-1998,2000 Ericsson Telecom AB -;; Copyright (C) 2004 Free Software Foundation, Inc. -;; Author: Anders Lindgren -;; Version: 2.5.4 -;; Keywords: erlang, languages, processes -;; Date: 2000-09-11 - +;; %CopyrightBegin% +;; +;; Copyright Ericsson AB 1996-2009. All Rights Reserved. +;; ;; The contents of this file are subject to the Erlang Public License, ;; Version 1.1, (the "License"); you may not use this file except in ;; compliance with the License. You should have received a copy of the ;; Erlang Public License along with this software. If not, it can be -;; retrieved via the world wide web at http://www.erlang.org/. - +;; retrieved online at http://www.erlang.org/. +;; ;; Software distributed under the License is distributed on an "AS IS" ;; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See ;; the License for the specific language governing rights and limitations ;; under the License. - -;; The Initial Developer of the Original Code is Ericsson Utvecklings AB. -;; All Rights Reserved. +;; +;; %CopyrightEnd% +;; +;; Copyright (C) 2004 Free Software Foundation, Inc. +;; Author: Anders Lindgren +;; Keywords: erlang, languages, processes ;; Lars Thorsén's modifications of 2000-06-07 included. - ;; The original version of this package was written by Robert Virding. ;; -;; Most skeletons have been written at Ericsson Telecom by -;; magnus@erix.ericsson.se and janne@erix.ericsson.se - ;;; Commentary: ;; Introduction: @@ -77,7 +72,7 @@ ;; Variables: -(defconst erlang-version "2.5.4" +(defconst erlang-version "2.6.1" "The version number of Erlang mode.") (defvar erlang-root-dir nil @@ -87,6 +82,36 @@ Should this variable be nil, no manual pages will show up in the Erlang mode menu.") +(eval-and-compile + (defconst erlang-emacs-major-version + (if (boundp 'emacs-major-version) + emacs-major-version + (string-match "\\([0-9]+\\)\\.\\([0-9]+\\)" emacs-version) + (erlang-string-to-int (substring emacs-version + (match-beginning 1) (match-end 1)))) + "Major version number of Emacs.")) + +(eval-and-compile + (defconst erlang-emacs-minor-version + (if (boundp 'emacs-minor-version) + emacs-minor-version + (string-match "\\([0-9]+\\)\\.\\([0-9]+\\)" emacs-version) + (erlang-string-to-int (substring emacs-version + (match-beginning 2) (match-end 2)))) + "Minor version number of Emacs.")) + +(defconst erlang-xemacs-p (string-match "Lucid\\|XEmacs" emacs-version) + "Non-nil when running under XEmacs or Lucid Emacs.") + +(defvar erlang-xemacs-popup-menu '("Erlang Mode Commands" . nil) + "Common popup menu for all buffers in Erlang mode. + +This variable is destructively modified every time the Erlang menu +is modified. The effect is that all changes take effect in all +buffers in Erlang mode, just like under GNU Emacs. + +Never EVER set this variable!") + (defvar erlang-menu-items '(erlang-menu-base-items erlang-menu-skel-items erlang-menu-shell-items @@ -131,7 +156,8 @@ nil ("Align Arrows" erlang-align-arrows))) ("Syntax Highlighting" - (("Level 3" erlang-font-lock-level-3) + (("Level 4" erlang-font-lock-level-4) + ("Level 3" erlang-font-lock-level-3) ("Level 2" erlang-font-lock-level-2) ("Level 1" erlang-font-lock-level-1) ("Off" erlang-font-lock-level-0))) @@ -343,6 +369,7 @@ erlang-stop-when-at-guard erlang-next-lines-empty-p erlang-at-keyword-end-p + erlang-at-end-of-clause-p erlang-at-end-of-function-p) "*List of functions controlling `erlang-electric-comma'. The functions in this list are called, in order, whenever a comma @@ -474,7 +501,7 @@ Should the flag the nil, the directory is absolute, should it be non-nil the directory is relative to the variable `erlang-root-dir'.") -(defvar erlang-man-max-menu-size 20 +(defvar erlang-man-max-menu-size 35 "*The maximum number of menu items in one menu allowed.") (defvar erlang-man-display-function 'erlang-man-display @@ -484,26 +511,357 @@ containing the man page. Use this variable when the default function, `erlang-man-display', does not work on your system.") +(defvar erlang-compile-extra-opts '() + "*Additional options to the compilation command. +This is an elisp list of options. Each option can be either: +- an atom +- a dotted pair +- a string +Example: '(bin_opt_info (i . \"/path1/include\") (i . \"/path2/include\"))") + (eval-and-compile -(defconst erlang-atom-regexp "\\([a-z][a-zA-Z0-9_]*\\|'[^\n']*[^\\]'\\)" - "Regexp which should match an Erlang atom. + (defvar erlang-regexp-modern-p + (if (> erlang-emacs-major-version 21) t nil) + "Non-nil when this version of Emacs uses a modern version of regexp. +Supporting \_< and \_> This is determined by checking the version of Emacs used.")) -The regexp must be surrounded with a pair of regexp parentheses.")) -(defconst erlang-atom-regexp-matches 1 - "Number of regexp parenthesis pairs in `erlang-atom-regexp'. +(eval-and-compile + (defconst erlang-atom-quoted-regexp + "'\\(?:[^\\']\\|\\(?:\\\\.\\)\\)*'" + "Regexp describing a single-quoted atom")) + +(eval-and-compile + (defconst erlang-atom-regular-regexp + (if erlang-regexp-modern-p + "\\_<[[:lower:]]\\(?:\\sw\\|\\s_\\)*\\_>" + "\\<[[:lower:]]\\(?:\\sw\\|\\s_\\)*\\>") + "Regexp describing a regular (non-quoted) atom")) + +(eval-and-compile + (defconst erlang-atom-regexp + (concat "\\(" erlang-atom-quoted-regexp "\\|" + erlang-atom-regular-regexp "\\)") + "Regexp describing an Erlang atom.")) +(eval-and-compile + (defconst erlang-atom-regexp-matches 1 + "Number of regexp parenthesis pairs in `erlang-atom-regexp'. + This is used to determine parenthesis matches in complex regexps which -contains `erlang-atom-regexp'.") +contains `erlang-atom-regexp'.")) + -(defconst erlang-variable-regexp "\\([A-Z_][a-zA-Z0-9_]*\\)" - "Regexp which should match an Erlang variable. +(eval-and-compile + (defconst erlang-variable-regexp + (if erlang-regexp-modern-p + "\\_<\\([[:upper:]_]\\(?:\\sw\\|\\s_\\)*\\)\\_>" + "\\<\\([[:upper:]_]\\(?:\\sw\\|\\s_\\)*\\)\\>") + "Regexp which should match an Erlang variable. + +The regexp must be surrounded with a pair of regexp parentheses.")) -The regexp must be surrounded with a pair of regexp parentheses.") -(defconst erlang-variable-regexp-matches 1 - "Number of regexp parenthesis pairs in `erlang-variable-regexp'. +(eval-and-compile + (defconst erlang-variable-regexp-matches 1 + "Number of regexp parenthesis pairs in `erlang-variable-regexp'. This is used to determine matches in complex regexps which contains -`erlang-variable-regexp'.") +`erlang-variable-regexp'.")) + + +(eval-and-compile + (defun erlang-regexp-opt (strings &optional paren) + "Like `regexp-opt', except if PAREN is `symbols', then the +resulting regexp is surrounded by \\_< and \\_>." + (if (eq paren 'symbols) + (if erlang-regexp-modern-p + (concat "\\_<" (regexp-opt strings t) "\\_>") + (concat "\\<" (regexp-opt strings t) "\\>")) + (regexp-opt strings paren)))) + + +(eval-and-compile + (defvar erlang-keywords + '("after" + "begin" + "catch" + "case" + "cond" + "end" + "fun" + "if" + "let" + "of" + "query" + "receive" + "try" + "when") + "Erlang reserved keywords")) + +(eval-and-compile + (defconst erlang-keywords-regexp (erlang-regexp-opt erlang-keywords 'symbols))) + +(eval-and-compile + (defvar erlang-operators + '("and" + "andalso" + "band" + "bnot" + "bor" + "bsl" + "bsr" + "bxor" + "div" + "not" + "or" + "orelse" + "rem" + "xor") + "Erlang operators")) +;; What about these? +;; '+' '-' '*' '/' '>', '>=', '<', '=<', '=:=', '==', '=/=', '/=' + +(eval-and-compile + (defconst erlang-operators-regexp (erlang-regexp-opt erlang-operators 'symbols))) + + +(eval-and-compile + (defvar erlang-guards + '("is_atom" + "is_binary" + "is_bitstring" + "is_boolean" + "is_float" + "is_function" + "is_integer" + "is_list" + "is_number" + "is_pid" + "is_port" + "is_record" + "is_reference" + "is_tuple" + "atom" + "binary" + "bitstring" + "boolean" + ;;"float" ; Not included to avoid clashes with the bif float/1 + "function" + "integer" + "list" + "number" + "pid" + "port" + "record" + "reference" + "tuple") + "Erlang guards")) + +(eval-and-compile + (defconst erlang-guards-regexp (erlang-regexp-opt erlang-guards 'symbols))) + + +(eval-and-compile + (defvar erlang-predefined-types + '("any" + "arity" + "byte" + "char" + "cons" + "deep_string" + "maybe_improper_list" + "mfa" + "nil" + "none" + "non_neg_integer" + "nonempty_list" + "nonempty_improper_list" + "nonempty_maybe_improper_list" + "string" + "timeout") + "Erlang type specs types")) + +(eval-and-compile + (defconst erlang-predefined-types-regexp + (erlang-regexp-opt erlang-predefined-types 'symbols))) + + +(eval-and-compile + (defvar erlang-int-bifs + '("abs" + "adler32" + "adler32_combine" + "alive" + "apply" + "atom_to_binary" + "atom_to_list" + "binary_to_atom" + "binary_to_existing_atom" + "binary_to_list" + "binary_to_term" + "bit_size" + "bitstring_to_list" + "byte_size" + "check_process_code" + "contact_binary" + "crc32" + "crc32_combine" + "date" + "decode_packet" + "delete_module" + "disconnect_node" + "element" + "erase" + "exit" + "float" + "float_to_list" + "garbage_collect" + "get" + "get_keys" + "group_leader" + "halt" + "hd" + "integer_to_list" + "internal_bif" + "iolist_size" + "iolist_to_binary" + "is_alive" + "is_atom" + "is_binary" + "is_bitstring" + "is_boolean" + "is_float" + "is_function" + "is_integer" + "is_list" + "is_number" + "is_pid" + "is_port" + "is_process_alive" + "is_record" + "is_reference" + "is_tuple" + "length" + "link" + "list_to_atom" + "list_to_binary" + "list_to_bitstring" + "list_to_existing_atom" + "list_to_float" + "list_to_integer" + "list_to_pid" + "list_to_tuple" + "load_module" + "make_ref" + "module_loaded" + "monitor_node" + "node" + "node_link" + "node_unlink" + "nodes" + "notalive" + "now" + "open_port" + "pid_to_list" + "port_close" + "port_command" + "port_connect" + "port_control" + "pre_loaded" + "process_flag" + "process_info" + "processes" + "purge_module" + "put" + "register" + "registered" + "round" + "self" + "setelement" + "size" + "spawn" + "spawn_link" + "spawn_monitor" + "spawn_opt" + "split_binary" + "statistics" + "term_to_binary" + "time" + "throw" + "tl" + "trunc" + "tuple_size" + "tuple_to_list" + "unlink" + "unregister" + "whereis") + "Erlang built-in functions (BIFs)")) + +(eval-and-compile + (defconst erlang-int-bif-regexp (erlang-regexp-opt erlang-int-bifs 'symbols))) + + +(eval-and-compile + (defvar erlang-ext-bifs + '("append_element" + "bump_reductions" + "cancel_timer" + "demonitor" + "display" + "fun_info" + "fun_to_list" + "function_exported" + "get_cookie" + "get_stacktrace" + "hash" + "integer_to_list" + "is_builtin" + "list_to_integer" + "loaded" + "localtime" + "localtime_to_universaltime" + "make_tuple" + "max" + "md5" + "md5_final" + "md5_init" + "md5_update" + "memory" + "min" + "monitor" + "monitor_node" + "phash" + "phash2" + "port_call" + "port_info" + "port_to_list" + "ports" + "process_display" + "read_timer" + "ref_to_list" + "resume_process" + "send" + "send_after" + "send_nosuspend" + "set_cookie" + "start_timer" + "suspend_process" + "system_flag" + "system_info" + "system_monitor" + "system_profile" + "trace" + "trace_delivered" + "trace_info" + "trace_pattern" + "universaltime" + "universaltime_to_localtime" + "yield") + "Erlang built-in functions (BIFs) that needs erlang: prefix")) + +(eval-and-compile + (defconst erlang-ext-bif-regexp + (erlang-regexp-opt (append erlang-int-bifs erlang-ext-bifs) 'symbols))) + (defvar erlang-defun-prompt-regexp (concat "^" erlang-atom-regexp "\\s *(") "Regexp which should match beginning of a clause.") @@ -522,6 +880,11 @@ tags system should interpret tags on the form `module:tag' for files written in other languages than Erlang.") +(defvar erlang-inferior-shell-split-window t + "*If non-nil, when starting an inferior shell, split windows. +If nil, the inferior shell replaces the window. This is the traditional +behaviour.") + (defvar erlang-mode-map nil "*Keymap used in Erlang mode.") (defvar erlang-mode-abbrev-table nil @@ -529,39 +892,14 @@ (defvar erlang-mode-syntax-table nil "Syntax table in use in Erlang-mode buffers.") -(defconst erlang-emacs-major-version - (if (boundp 'emacs-major-version) - emacs-major-version - (string-match "\\([0-9]+\\)\\.\\([0-9]+\\)" emacs-version) - (string-to-int (substring emacs-version - (match-beginning 1) (match-end 1)))) - "Major version number of Emacs.") - -(defconst erlang-emacs-minor-version - (if (boundp 'emacs-minor-version) - emacs-minor-version - (string-match "\\([0-9]+\\)\\.\\([0-9]+\\)" emacs-version) - (string-to-int (substring emacs-version - (match-beginning 2) (match-end 2)))) - "Minor version number of Emacs.") - -(defconst erlang-xemacs-p (string-match "Lucid\\|XEmacs" emacs-version) - "Non-nil when running under XEmacs or Lucid Emacs.") - -(defvar erlang-xemacs-popup-menu '("Erlang Mode Commands" . nil) - "Common popup menu for all buffers in Erlang mode. - -This variable is destructively modified every time the Erlang menu -is modified. The effect is that all changes take effect in all -buffers in Erlang mode, just like under GNU Emacs. - -Never EVER set this variable!") - (defconst inferior-erlang-use-cmm (boundp 'minor-mode-overriding-map-alist) "Non-nil means use `compilation-minor-mode' in Erlang shell.") ;; Tempo skeleton templates: +(defvar erlang-tempo-tags nil + "Tempo tags for erlang mode") + (defvar erlang-skel '(("If" "if" erlang-skel-if) ("Case" "case" erlang-skel-case) @@ -1594,12 +1932,14 @@ (erlang-skel-separator 2) "%% Function: end_per_testcase(TestCase, Config0) ->" n - "%% void() | {save_config,Config1}" n + "%% void() | {save_config,Config1} | {fail,Reason}" n "%%" n "%% TestCase = atom()" n "%% Name of the test case that is finished." n "%% Config0 = Config1 = [tuple()]" n "%% A list of key/value pairs, holding the test case configuration." n + "%% Reason = term()" n + "%% The reason for failing the test case." n "%%" n "%% Description: Cleanup after each test case." n (erlang-skel-separator 2) @@ -1750,9 +2090,10 @@ (erlang-skel-separator 2) "%% Function: end_per_testcase(TestCase, Config0) ->" n - "%% void() | {save_config,Config1}" n + "%% void() | {save_config,Config1} | {fail,Reason}" n "%% TestCase = atom()" n "%% Config0 = Config1 = [tuple()]" n + "%% Reason = term()" n (erlang-skel-separator 2) "end_per_testcase(_TestCase, _Config) ->" n > "ok." n n @@ -1805,17 +2146,6 @@ ;; Font-lock variables -(defvar erlang-font-lock-modern-p - (cond ((>= erlang-emacs-major-version 20) t) - (erlang-xemacs-p (>= erlang-emacs-minor-version 14)) - ((= erlang-emacs-major-version 19) (>= erlang-emacs-minor-version 29)) - (t nil)) - "Non-nil when this version of Emacs uses a modern version of Font Lock. - -This is determined by checking the version of Emacs used, the actual -font-lock code is not loaded.") - - ;; The next few variables define different Erlang font-lock patterns. ;; They could be appended to form a custom font-lock appearance. ;; @@ -1825,151 +2155,146 @@ ;; Note that Erlang strings and atoms are highlighted with using ;; syntactic analysis. -(defvar erlang-font-lock-keywords-func +(defvar erlang-font-lock-keywords-function-header (list - (list (concat "^" erlang-atom-regexp "\\s *(") + (list (concat "^" erlang-atom-regexp "\\s-*(") 1 'font-lock-function-name-face t)) "Font lock keyword highlighting a function header.") +(defvar erlang-font-lock-keywords-int-bifs + (list + (list (concat erlang-int-bif-regexp "\\s-*(") + 1 'font-lock-builtin-face)) + "Font lock keyword highlighting built in functions.") + +(defvar erlang-font-lock-keywords-ext-bifs + (list + (list (concat "\\<\\(erlang\\)\\s-*:\\s-*" erlang-ext-bif-regexp "\\s-*(") + '(1 'font-lock-builtin-face) + '(2 'font-lock-builtin-face))) + "Font lock keyword highlighting built in functions.") + +(defvar erlang-font-lock-keywords-int-function-calls + (list + (list (concat erlang-atom-regexp "\\s-*(") + 1 'font-lock-type-face)) + "Font lock keyword highlighting an internal function call.") + +(defvar erlang-font-lock-keywords-ext-function-calls + (list + (list (concat erlang-atom-regexp "\\s-*:\\s-*" + erlang-atom-regexp "\\s-*(") + '(1 'font-lock-type-face) + '(2 'font-lock-type-face))) + "Font lock keyword highlighting an external function call.") + +(defvar erlang-font-lock-keywords-fun-n + (list + (list (concat "\\(" erlang-atom-regexp "/[0-9]+\\)") + 1 'font-lock-type-face)) + "Font lock keyword highlighting a fun descriptor in F/N format.") + +(defvar erlang-font-lock-keywords-operators + (list + (list erlang-operators-regexp + 1 'font-lock-builtin-face)) + "Font lock keyword highlighting Erlang operators.") + (defvar erlang-font-lock-keywords-dollar (list (list "\\(\\$\\([^\\]\\|\\\\\\([^0-7^\n]\\|[0-7]+\\|\\^[a-zA-Z]\\)\\)\\)" - 1 'font-lock-string-face)) + 1 'font-lock-constant-face)) "Font lock keyword highlighting numbers in ASCII form (e.g. $A).") (defvar erlang-font-lock-keywords-arrow (list - (list "\\(->\\|:-\\)\\(\\s \\|$\\)" 2 'font-lock-function-name-face)) + (list "->\\(\\s \\|$\\)" 1 'font-lock-function-name-face)) "Font lock keyword highlighting clause arrow.") (defvar erlang-font-lock-keywords-lc (list - (list "\\(<-\\)\\(\\s \\|$\\)" 1 'font-lock-keyword-face) - (list "\\(||\\)\\(\\s \\|$\\)" 1 'font-lock-keyword-face)) + (list "\\(<-\\|<=\\|||\\)\\(\\s \\|$\\)" 1 'font-lock-keyword-face)) "Font lock keyword highlighting list comprehension operators.") (defvar erlang-font-lock-keywords-keywords (list - (list (concat "\\<\\(a\\(fter\\|ndalso\\)\\|begin\\|c\\(atch\\|ase\\)" - "\\|end\\|fun\\|if\\|o\\(f\\|relse\\)\\|receive\\|try\\|when" - "\\|query\\)\\([^a-zA-Z0-9_]\\|$\\)") - 1 'font-lock-keyword-face)) + (list erlang-keywords-regexp 1 'font-lock-keyword-face)) "Font lock keyword highlighting Erlang keywords.") (defvar erlang-font-lock-keywords-attr (list - (list (concat "^\\(-" erlang-atom-regexp "\\)\\s *\\(\\.\\|(\\)") - 1 'font-lock-function-name-face)) + (list (concat "^\\(-" erlang-atom-regexp "\\)\\(\\s-\\|\\.\\|(\\)") + 1 (if (boundp 'font-lock-preprocessor-face) + 'font-lock-preprocessor-face + 'font-lock-function-name-face))) "Font lock keyword highlighting attributes.") (defvar erlang-font-lock-keywords-quotes (list (list "`\\([-+a-zA-Z0-9_:*][-+a-zA-Z0-9_:*]+\\)'" 1 - (if erlang-font-lock-modern-p - 'font-lock-reference-face - 'font-lock-keyword-face) + 'font-lock-keyword-face t)) "Font lock keyword highlighting words in single quotes in comments. This is not the highlighting of Erlang strings and atoms, which are highlighted by syntactic analysis.") -;; Note: The guard `float' collides with the bif `float'. (defvar erlang-font-lock-keywords-guards (list - (list - (concat "\\<\\(" - "\\(is_\\)*\\(atom\\|boolean\\|function\\|binary\\|constant" - "\\|float\\|integer\\|list\\|number\\|p\\(id\\|ort\\)\\|" - "re\\(ference\\|cord\\)\\|tuple" - "\\)\\)\\s *(") - - 1 - (if erlang-font-lock-modern-p - 'font-lock-reference-face - 'font-lock-keyword-face))) + (list (concat "[^:]" erlang-guards-regexp "\\s-*(") + 1 'font-lock-builtin-face)) "Font lock keyword highlighting guards.") -(defvar erlang-font-lock-keywords-bifs +(defvar erlang-font-lock-keywords-predefined-types (list - (list - (concat - "\\<\\(" - "a\\(bs\\|live\\|pply\\|tom_to_list\\)\\|" - "binary_to_\\(list\\|term\\)\\|" - "concat_binary\\|d\\(ate\\|isconnect_node\\)\\|" - "e\\(lement\\|rase\\|xit\\)\\|" - "float\\(\\|_to_list\\)\\|" - "g\\(arbage_collect\\|et\\(\\|_keys\\)\\|roup_leader\\)\\|" - "h\\(alt\\|d\\)\\|" - "i\\(nte\\(ger_to_list\\|rnal_bif\\)\\|s_alive\\)\\|" - "l\\(ength\\|i\\(nk\\|st_to_\\(atom\\|binary\\|float\\|integer" - "\\|pid\\|tuple\\)\\)\\)\\|" - "make_ref\\|no\\(de\\(\\|_\\(link\\|unlink\\)\\|s\\)\\|talive\\)\\|" - "open_port\\|" - "p\\(id_to_list\\|rocess\\(_\\(flag\\|info\\)\\|es\\)\\|ut\\)\\|" - "r\\(egister\\(\\|ed\\)\\|ound\\)\\|" - "s\\(e\\(lf\\|telement\\)\\|ize\\|" - "p\\(awn\\(\\|_link\\)\\|lit_binary\\)\\|tatistics\\)\\|" - "t\\(erm_to_binary\\|hrow\\|ime\\|l\\|" - "r\\(ace\\|unc\\)\\|uple_to_list\\)\\|" - "un\\(link\\|register\\)\\|whereis" - "\\)\\s *(") - 1 - 'font-lock-keyword-face)) - "Font lock keyword highlighting built in functions.") + (list (concat "[^:]" erlang-predefined-types-regexp "\\s-*(") + 1 'font-lock-builtin-face)) + "Font lock keyword highlighting predefined types.") + (defvar erlang-font-lock-keywords-macros (list - (list (concat "?\\s *\\(" erlang-atom-regexp - "\\|" erlang-variable-regexp "\\)\\>") - 1 (if erlang-font-lock-modern-p - 'font-lock-reference-face - 'font-lock-type-face)) - (list (concat "^-\\(define\\|ifn?def\\)\\s *(\\s *\\(" erlang-atom-regexp - "\\|" erlang-variable-regexp "\\)\\>") - 2 (if erlang-font-lock-modern-p - 'font-lock-reference-face - 'font-lock-type-face))) + (list (concat "?\\s-*\\(" erlang-atom-regexp + "\\|" erlang-variable-regexp "\\)") + 1 'font-lock-type-face) + (list (concat "^\\(-\\(?:define\\|ifn?def\\)\\)\\s-*(\\s-*\\(" erlang-atom-regexp + "\\|" erlang-variable-regexp "\\)") + (list 1 'font-lock-preprocessor-face t) + (list 3 'font-lock-type-face t t)) + (list "^-e\\(lse\\|ndif\\)\\>" 0 'font-lock-preprocessor-face t)) "Font lock keyword highlighting macros. This must be placed in front of `erlang-font-lock-keywords-vars'.") (defvar erlang-font-lock-keywords-records (list - (list (concat "#\\s *" erlang-atom-regexp "\\>") - 1 'font-lock-type-face) + (list (concat "#\\s *" erlang-atom-regexp) + 1 'font-lock-type-face) ;; Don't highlight numerical constants. - (list "\\<[0-9][0-9]?#\\([0-9a-fA_F]+\\)\\>" - 1 nil t) - (list (concat "^-record(\\s *" erlang-atom-regexp "\\>") - 1 'font-lock-type-face)) + (list (if erlang-regexp-modern-p + "\\_<[0-9]+#\\([0-9a-zA-Z]+\\)" + "\\<[0-9]+#\\([0-9a-zA-Z]+\\)") + 1 nil t) + (list (concat "^-record\\s-*(\\s-*" erlang-atom-regexp) + 1 'font-lock-type-face)) "Font lock keyword highlighting Erlang records. This must be placed in front of `erlang-font-lock-keywords-vars'.") (defvar erlang-font-lock-keywords-vars (list - (list (concat "\\<" erlang-variable-regexp "\\>") - 1 (if erlang-font-lock-modern-p - 'font-lock-variable-name-face - 'font-lock-type-face))) + (list (concat "[^#]" erlang-variable-regexp) ; no numerical constants + 1 'font-lock-variable-name-face)) "Font lock keyword highlighting Erlang variables. -Must be preceded by `erlang-font-lock-keywords-macros' and `-records' -to work properly.") +Must be preceded by `erlang-font-lock-keywords-macros' to work properly.") - -(defvar erlang-font-lock-keywords-1 - (append erlang-font-lock-keywords-func - erlang-font-lock-keywords-dollar - erlang-font-lock-keywords-arrow - erlang-font-lock-keywords-keywords) - ;; DocStringOrig: erlang-font-lock-keywords +(defvar erlang-font-lock-descr-string "Font-lock keywords used by Erlang Mode. There exists three levels of Font Lock keywords for Erlang: `erlang-font-lock-keywords-1' - Function headers and reserved keywords. `erlang-font-lock-keywords-2' - Bifs, guards and `single quotes'. `erlang-font-lock-keywords-3' - Variables, macros and records. + `erlang-font-lock-keywords-4' - Function names, Funs, LCs (not Atoms) To use a specific level, please set the variable `font-lock-maximum-decoration' to the appropriate level. Note that the @@ -1978,66 +2303,50 @@ Example: (setq font-lock-maximum-decoration 2)") +(defvar erlang-font-lock-keywords-1 + (append erlang-font-lock-keywords-function-header + erlang-font-lock-keywords-dollar + erlang-font-lock-keywords-arrow + erlang-font-lock-keywords-keywords + ) + ;; DocStringOrig: erlang-font-lock-keywords + erlang-font-lock-descr-string) (defvar erlang-font-lock-keywords-2 (append erlang-font-lock-keywords-1 + erlang-font-lock-keywords-int-bifs + erlang-font-lock-keywords-ext-bifs erlang-font-lock-keywords-attr erlang-font-lock-keywords-quotes erlang-font-lock-keywords-guards - erlang-font-lock-keywords-bifs) + ) ;; DocStringCopy: erlang-font-lock-keywords - "Font-lock keywords used by Erlang Mode. - -There exists three levels of Font Lock keywords for Erlang: - `erlang-font-lock-keywords-1' - Function headers and reserved keywords. - `erlang-font-lock-keywords-2' - Bifs, guards and `single quotes'. - `erlang-font-lock-keywords-3' - Variables, macros and records. - -To use a specific level, please set the variable -`font-lock-maximum-decoration' to the appropriate level. Note that the -variable must be set before Erlang mode is activated. - -Example: - (setq font-lock-maximum-decoration 2)") - + erlang-font-lock-descr-string) (defvar erlang-font-lock-keywords-3 (append erlang-font-lock-keywords-2 + erlang-font-lock-keywords-operators erlang-font-lock-keywords-macros erlang-font-lock-keywords-records - erlang-font-lock-keywords-vars) + erlang-font-lock-keywords-vars + erlang-font-lock-keywords-predefined-types + ) ;; DocStringCopy: erlang-font-lock-keywords - "Font-lock keywords used by Erlang Mode. + erlang-font-lock-descr-string) -There exists three levels of Font Lock keywords for Erlang: - `erlang-font-lock-keywords-1' - Function headers and reserved keywords. - `erlang-font-lock-keywords-2' - Bifs, guards and `single quotes'. - `erlang-font-lock-keywords-3' - Variables, macros and records. - -To use a specific level, please set the variable -`font-lock-maximum-decoration' to the appropriate level. Note that the -variable must be set before Erlang mode is activated. - -Example: - (setq font-lock-maximum-decoration 2)") - - -(defvar erlang-font-lock-keywords erlang-font-lock-keywords-3 +(defvar erlang-font-lock-keywords-4 + (append erlang-font-lock-keywords-3 + erlang-font-lock-keywords-int-function-calls + erlang-font-lock-keywords-ext-function-calls + erlang-font-lock-keywords-fun-n + erlang-font-lock-keywords-lc + ) ;; DocStringCopy: erlang-font-lock-keywords - "Font-lock keywords used by Erlang Mode. - -There exists three levels of Font Lock keywords for Erlang: - `erlang-font-lock-keywords-1' - Function headers and reserved keywords. - `erlang-font-lock-keywords-2' - Bifs, guards and `single quotes'. - `erlang-font-lock-keywords-3' - Variables, macros and records. - -To use a specific level, please set the variable -`font-lock-maximum-decoration' to the appropriate level. Note that the -variable must be set before Erlang mode is activated. - -Example: - (setq font-lock-maximum-decoration 2)") + erlang-font-lock-descr-string) +(defvar erlang-font-lock-keywords erlang-font-lock-keywords-4 + ;; DocStringCopy: erlang-font-lock-keywords + erlang-font-lock-descr-string) (defvar erlang-font-lock-syntax-table nil "Syntax table used by Font Lock mode. @@ -2064,21 +2373,26 @@ (or (fboundp 'unless) (defmacro unless (condition &rest body) "(unless CONDITION BODY...): If CONDITION is false, do BODY, else return nil." - (` (if (, condition) - nil - (,@ body))))) + `((if (, condition) nil ,@body)))) (or (fboundp 'when) (defmacro when (condition &rest body) "(when CONDITION BODY...): If CONDITION is true, do BODY, else return nil." - (` (if (, condition) - (progn (,@ body)) - nil)))) + `((if (, condition) (progn ,@body) nil)))) (or (fboundp 'char-before) (defmacro char-before (&optional pos) "Return the character in the current buffer just before POS." - (` (char-after (1- (or (, pos) (point))))))) + `( (char-after (1- (or ,pos (point))))))) + +;; defvar some obsolete variables, which we still support for +;; backwardscompatibility reasons. +(eval-when-compile + (defvar comment-indent-hook) + (defvar dabbrev-case-fold-search) + (defvar tempo-match-finder) + (defvar compilation-menu-map) + (defvar next-error-last-buffer)) (eval-when-compile (if (or (featurep 'bytecomp) @@ -2091,6 +2405,7 @@ (setq byte-compile-warnings '(free-vars unresolved callargs redefine)))) (require 'comint) + (require 'tempo) (require 'compile)))) @@ -2178,9 +2493,13 @@ (erlang-tags-init) (erlang-font-lock-init) (erlang-skel-init) + (tempo-use-tag-list 'erlang-tempo-tags) (run-hooks 'erlang-mode-hook) (if (zerop (buffer-size)) - (run-hooks 'erlang-new-file-hook))) + (run-hooks 'erlang-new-file-hook)) + ;; Doesn't exist in Emacs v21.4; required by Emacs v23. + (if (boundp 'after-change-major-mode-hook) + (run-hooks 'after-change-major-mode-hook))) (defun erlang-syntax-table-init () @@ -2189,7 +2508,11 @@ (modify-syntax-entry ?\n ">" table) (modify-syntax-entry ?\" "\"" table) (modify-syntax-entry ?# "." table) - (modify-syntax-entry ?$ "'" table) +;; (modify-syntax-entry ?$ "\\" table) ;; Creates problems with indention afterwards +;; (modify-syntax-entry ?$ "'" table) ;; Creates syntax highlighting and indention problems + (modify-syntax-entry ?$ "/" table) ;; Misses the corner case "string that ends with $" + ;; we have to live with that for now..it is the best alternative + ;; that can be worked around with "string hat ends with \$" (modify-syntax-entry ?% "<" table) (modify-syntax-entry ?& "." table) (modify-syntax-entry ?\' "\"" table) @@ -2231,15 +2554,15 @@ (define-key map "<" 'erlang-electric-lt) (define-key map ">" 'erlang-electric-gt) (define-key map "\C-m" 'erlang-electric-newline) - (if erlang-xemacs-p - (define-key map [(backspace)] 'backward-delete-char-untabify) - (define-key map "\177" 'backward-delete-char-untabify)) + (if (not (boundp 'delete-key-deletes-forward)) + (define-key map "\177" 'backward-delete-char-untabify) + (define-key map [(backspace)] 'backward-delete-char-untabify)) ;;(unless (boundp 'fill-paragraph-function) (define-key map "\M-q" 'erlang-fill-paragraph) (unless (boundp 'beginning-of-defun-function) (define-key map "\M-\C-a" 'erlang-beginning-of-function) (define-key map "\M-\C-e" 'erlang-end-of-function) - (define-key map "\M-\C-h" 'erlang-mark-function)) + (define-key map '(meta control h) 'erlang-mark-function)) ; Xemacs (define-key map "\M-\t" 'erlang-complete-tag) (define-key map "\C-c\M-\t" 'tempo-complete-tag) (define-key map "\M-+" 'erlang-find-next-tag) @@ -2266,13 +2589,13 @@ ;; Set up electric character functions to work with ;; delsel/pending-del mode. Also, set up text properties for bit ;; syntax handling. - (mapcar #'(lambda (cmd) - (put cmd 'delete-selection t) ;for delsel (Emacs) - (put cmd 'pending-delete t)) ;for pending-del (XEmacs) - '(erlang-electric-semicolon - erlang-electric-comma - erlang-electric-gt)) - + (mapc #'(lambda (cmd) + (put cmd 'delete-selection t) ;for delsel (Emacs) + (put cmd 'pending-delete t)) ;for pending-del (XEmacs) + '(erlang-electric-semicolon + erlang-electric-comma + erlang-electric-gt)) + (put 'bitsyntax-open-outer 'syntax-table '(4 . ?>)) (put 'bitsyntax-open-outer 'rear-nonsticky '(category)) (put 'bitsyntax-open-inner 'rear-nonsticky '(category)) @@ -2384,13 +2707,17 @@ (set 'font-lock-keywords erlang-font-lock-keywords-1)) ((eq level 2) (set 'font-lock-keywords erlang-font-lock-keywords-2)) - (t - (set 'font-lock-keywords erlang-font-lock-keywords-3)))) + ((eq level 3) + (set 'font-lock-keywords erlang-font-lock-keywords-3)) + (t + (set 'font-lock-keywords erlang-font-lock-keywords-4)))) ;; Modern font-locks can handle the above much more elegantly: (set (make-local-variable 'font-lock-defaults) '((erlang-font-lock-keywords erlang-font-lock-keywords-1 - erlang-font-lock-keywords-2 erlang-font-lock-keywords-3) + erlang-font-lock-keywords-2 + erlang-font-lock-keywords-3 + erlang-font-lock-keywords-4) nil nil ((?_ . "w")) erlang-beginning-of-clause (font-lock-mark-block-function . erlang-mark-clause)))) @@ -2422,7 +2749,7 @@ This could be used when defining your own special font-lock setup, e.g: \(setq my-font-lock-keywords - (append erlang-font-lock-keywords-func + (append erlang-font-lock-keywords-function-header erlang-font-lock-keywords-dollar (erlang-font-lock-set-face erlang-font-lock-keywords-macros 'my-neon-green-face) @@ -2490,6 +2817,17 @@ (font-lock-mode 1) (funcall (symbol-function 'font-lock-fontify-buffer))) +(defun erlang-font-lock-level-4 () + ;; DocStringCopy: font-cmd + "Fontify current buffer at level 4. +This highlights level 3 features (see `erlang-font-lock-level-2') +plus variables, macros and records." + (interactive) + (require 'font-lock) + (set 'font-lock-keywords erlang-font-lock-keywords-4) + (font-lock-mode 1) + (funcall (symbol-function 'font-lock-fontify-buffer))) + (defun erlang-menu-init () "Init menus for Erlang mode. @@ -2819,7 +3157,7 @@ (defun erlang-man-make-menu-item (file) "Create a menu item containing the name of the man page." - (and (string-match ".*/\\([^/]+\\)\\.[^.]$" file) + (and (string-match ".+/\\([^/]+\\)\\.\\([124-9]\\|3\\(erl\\)?\\)\\(\\.gz\\)?$" file) (let ((page (substring file (match-beginning 1) (match-end 1)))) (list (capitalize page) (list 'lambda '() @@ -2830,7 +3168,7 @@ (defun erlang-man-get-files (dir) "Return files in directory DIR." - (directory-files dir t ".*\\.[0-9]\\'")) + (directory-files dir t ".+\\.\\([124-9]\\|3\\(erl\\)?\\)\\(\\.gz\\)?\\'")) (defun erlang-man-module (&optional module) @@ -2850,7 +3188,7 @@ (if (or (null module) (string= module "")) (error "No Erlang module name given")) (let ((dir-list erlang-man-dirs) - (pat (concat "/" (regexp-quote module) "\\.[^.]$")) + (pat (concat "/" (regexp-quote module) "\\.\\([124-9]\\|3\\(erl\\)?\\)\\(\\.gz\\)?$")) (file nil) file-list) (while (and dir-list (null file)) @@ -2991,7 +3329,7 @@ (error nil)) (if file (let ((process-environment (copy-sequence process-environment))) - (if (string-match "\\(.*\\)/man[^/]*/\\([^/]+\\)\\.[^.]$" file) + (if (string-match "\\(.*\\)/man[^/]*/\\([^.]+\\)\\.\\([124-9]\\|3\\(erl\\)?\\)\\(\\.gz\\)?$" file) (let ((dir (substring file (match-beginning 1) (match-end 1))) (page (substring file (match-beginning 2) (match-end 2)))) (if (fboundp 'setenv) @@ -3063,7 +3401,9 @@ ;; variables describing the templates take effect ;; immdiately. (list (list 'erlang-skel-include (nth 2 (car skel)))) - (nth 1 (car skel))) + (nth 1 (car skel)) + (car (car skel)) + 'erlang-tempo-tags) (setq menu (cons (erlang-skel-make-menu-item (car skel)) menu)))) (setq skel (cdr skel))) @@ -3127,18 +3467,20 @@ (setq args (cdr args))) (cons 'l (nreverse res)))) +(defvar erlang-skel-separator-length 70) + (defun erlang-skel-separator (&optional percent) "Return a comment separator." (let ((percent (or percent 3))) (concat (make-string percent ?%) - (make-string (- 70 percent) ?-) + (make-string (- erlang-skel-separator-length percent) ?-) "\n"))) (defun erlang-skel-double-separator (&optional percent) "Return a comment separator." (let ((percent (or percent 3))) (concat (make-string percent ?%) - (make-string (- 70 percent) ?=) + (make-string (- erlang-skel-separator-length percent) ?=) "\n"))) (defun erlang-skel-dd-mmm-yyyy () @@ -3146,7 +3488,7 @@ The first character of DD is space if the value is less than 10." (let ((date (current-time-string))) (format "%2d %s %s" - (string-to-int (substring date 8 10)) + (erlang-string-to-int (substring date 8 10)) (substring date 4 7) (substring date -4)))) @@ -3200,8 +3542,9 @@ ((eq indent t) ;; This should never occur here. (error "Erlang mode error")) - ((= (char-syntax (following-char)) ?\)) - (setq indent (1- indent)))) + ;;((= (char-syntax (following-char)) ?\)) + ;; (setq indent (1- indent))) + ) (setq shift-amt (- indent (current-column))))) (if (zerop shift-amt) nil @@ -3254,8 +3597,9 @@ ((eq indent t) ;; This should never occur here. (error "Erlang mode error")) - ((= (char-syntax (following-char)) ?\)) - (setq indent (1- indent)))))) + ;;((= (char-syntax (following-char)) ?\)) + ;; (setq indent (1- indent))) + ))) (if (zerop (- indent (current-column))) nil (delete-region indent-point (point)) @@ -3359,67 +3703,59 @@ (progn (while (and stack (eq (car (car stack)) '->)) (erlang-pop stack)) - (if (and stack (memq (car (car stack)) '(icr begin))) + (if (and stack (memq (car (car stack)) '(icr begin fun try))) (erlang-pop stack)))) - ((looking-at "catch[^,\n\\of]*\n") + ((looking-at "catch.*of") + t) + ((looking-at "catch\\s *\\($\\|%\\|.*->\\)") ;; Must pop top icr layer, `catch' in try/catch ;;will push a new layer next. (progn (while (and stack (eq (car (car stack)) '->)) (erlang-pop stack)) - (if (and stack (memq (car (car stack)) '(icr begin))) + (if (and stack (memq (car (car stack)) '(icr begin try))) (erlang-pop stack)))) - ;;((looking-at "^of$") - ;; Must pop top icr layer, `of' in try/catch - ;;will push a new layer next. - ;; (progn - ;; (while (and stack (eq (car (car stack)) '->)) - ;; (erlang-pop stack)) - ;; (if (and stack (memq (car (car stack)) '(icr begin))) - ;; (erlang-pop stack)))) ) - (cond ((looking-at "\\(if\\|case\\|receive\\|try\\)[^_a-zA-Z0-9]") + (cond ((looking-at "\\(if\\|case\\|receive\\)[^_a-zA-Z0-9]") ;; Must push a new icr (if/case/receive) layer. (erlang-push (list 'icr token (current-column)) stack)) + ((looking-at "\\(try\\|after\\)[^_a-zA-Z0-9]") + ;; Must handle separately, try catch or try X of -> catch + ;; same for `after', it could be + ;; receive after Time -> X end, or + ;; try after X end + (erlang-push (list 'try token (current-column)) stack)) + ((looking-at "\\(of\\)[^_a-zA-Z0-9]") + ;; Must handle separately, try X of -> catch + (if (and stack (eq (car (car stack)) 'try)) + (let ((try-column (nth 2 (car stack)))) + (erlang-pop stack) + (erlang-push (list 'icr token try-column) stack)))) + ((looking-at "\\(fun\\)[^_a-zA-Z0-9]") - ;; Push a new icr layer if we are defining a `fun' + ;; Push a new layer if we are defining a `fun' ;; expression, not when we are refering an existing - ;; function. + ;; function. 'fun's defines are only indented one level now. (if (save-excursion (goto-char (match-end 1)) (erlang-skip-blank to) (eq (following-char) ?\()) - (erlang-push (list 'icr token (current-column)) stack))) + (erlang-push (list 'fun token (current-column)) stack))) ((looking-at "\\(begin\\|query\\)[^_a-zA-Z0-9]") (erlang-push (list 'begin token (current-column)) stack)) - ;; In test suites you may want to do something like - ;; ?match(Mem when integer(Mem), mnesia:table_info(Tab, - ;; memory)), and then the following if/case/receive - ;; statement will mess up the indentation by fooling the - ;; erlang mode to think the 'when' in the argument is a - ;; "real" when. The following three clauses will avoid - ;; this problem. - ((looking-at "when[^->\.]*if[^->\.]*->")) - ((looking-at "when[^->\.]*case[^->\.]*->")) - ((looking-at "when[^->\.]*receive[^->\.]*->")) ;; Normal when case - ((looking-at "when [^->\.]*->") + ;;((looking-at "when\\s ") + ;;((looking-at "when\\s *\\($\\|%\\)") + ((looking-at "when[^_a-zA-Z0-9]") (erlang-push (list 'when token (current-column)) stack)) - ((looking-at "after[.]+->") + ((looking-at "catch.*of") + t) + ((looking-at "catch\\s *\\($\\|%\\|.*->\\)") (erlang-push (list 'icr token (current-column)) stack)) - ((looking-at "after[^_a-zA-Z0-9->]") - ;; Probably in try-statment, fake "->" to get right - ;; indentation in erlang-calculate-stack-indent. If it - ;; was an ordinary catch without try, these entries will - ;; be popped of the stack at a later ocaccion. - (erlang-push (list 'icr token (current-column)) stack) - (erlang-push (list '-> token (current-column)) stack)) - ((looking-at "catch[^,\n\\of]*\n") - (erlang-push (list 'icr token (current-column)) stack) - (erlang-push (list '-> token (current-column)) stack)) + ;;(erlang-push (list '-> token (current-column)) stack)) ;;((looking-at "^of$") ;; (erlang-push (list 'icr token (current-column)) stack) - ;;(erlang-push (list '-> token (current-column)) stack)) + ;;(erlang-push (list '-> token (current-column)) stack)) ) (forward-sexp 1)) ;; String: Try to skip over it. (Catch error if not complete.) @@ -3456,57 +3792,49 @@ ;; Clause end ((= (following-char) ?\;) + (if (and stack (and (eq (car (car stack)) 'when) + (eq (car (car (cdr (cdr stack)))) 'spec))) + (erlang-pop stack)) (if (and stack (eq (car (car stack)) '->)) (erlang-pop stack)) (forward-char 1)) + ;; Parameter separator + ((looking-at ",") + (forward-char 1) + (if (and stack (eq (car (car stack)) '::)) + ;; Type or spec + (erlang-pop stack))) + ;; Function end ((looking-at "\\.\\(\\s \\|\n\\|\\s<\\)") (setq stack nil) (forward-char 1)) ;; Function head - ((looking-at "->\\|:-") - (save-excursion - (back-to-indentation) - (cond ((looking-at "after[^_a-zA-Z0-9]") - (erlang-pop stack)))) + ((looking-at "->") (if (and stack (eq (car (car stack)) 'when)) (erlang-pop stack)) (erlang-push (list '-> token (current-column)) stack) - (forward-char 2)) + (forward-char 2)) ;; List-comprehension divider ((looking-at "||") (erlang-push (list '|| token (current-column)) stack) (forward-char 2)) - ;;((looking-at ",$") - ;; Normal catch not try-catch have caused icr - ;; and then incr and faked "->" should be removed -;; (save-excursion - ;; (back-to-indentation) - ;; (cond ((looking-at "catch[^_a-zA-Z0-9]") - ;; (erlang-pop stack) - ;; (erlang-pop stack)))) - ;;(forward-char 1)) - - ;; Parameter separator - ((looking-at ",") - (forward-char 1)) - ;; Bit-syntax open paren ((looking-at "<<") - (erlang-push (list '\( token (current-column)) stack) + (erlang-push (list '<< token (current-column)) stack) (forward-char 2)) ;; Bbit-syntax close paren ((looking-at ">>") (while (memq (car (car stack)) '(|| ->)) (erlang-pop stack)) - (cond ((eq (car (car stack)) '\() + (cond ((eq (car (car stack)) '<<) (erlang-pop stack)) - ((memq (car (car stack)) '(icr begin)) + ((memq (car (car stack)) '(icr begin fun)) (error "Missing `end'")) (t (error "Unbalanced parentheses"))) @@ -3517,6 +3845,30 @@ ;; Skip over the ? (forward-char 1) ) + + ;; Type spec's + ((looking-at "-type\\s \\|-opaque\\s ") + (if stack + (forward-char 1) + (erlang-push (list 'icr token (current-column)) stack) + (forward-char 6))) + ((looking-at "-spec\\s ") + (if stack + (forward-char 1) + (forward-char 6) + (skip-chars-forward "^(\n") + (erlang-push (list 'spec (point) (current-column)) stack) + )) + + ;; Type spec delimiter + ((looking-at "::") + (erlang-push (list ':: token (current-column)) stack) + (forward-char 2)) + + ;; Don't follow through in the clause below + ;; '|' don't need spaces around it + ((looking-at "|") + (forward-char 1)) ;; Other punctuation: Skip over it and any following punctuation ((= cs ?.) @@ -3534,26 +3886,29 @@ ;; Close parenthesis ((= cs ?\)) - (while (memq (car (car stack)) '(|| ->)) + (while (memq (car (car stack)) '(|| -> :: when)) (erlang-pop stack)) (cond ((eq (car (car stack)) '\() - (erlang-pop stack)) + (erlang-pop stack) + (if (and (eq (car (car stack)) 'fun) + (eq (car (car (cdr stack))) '::)) + ;; Inside fun type def ') closes fun definition + (erlang-pop stack))) ((eq (car (car stack)) 'icr) (erlang-pop stack) ;; Normal catch not try-catch might have caused icr ;; and then incr should be removed and is not an error. (if (eq (car (car stack)) '\() (erlang-pop stack) - (else - (error "Missing `end'")) - )) + (error "Missing `end'") + )) ((eq (car (car stack)) 'begin) - (error "Missing `end'") - (t - (error "Unbalanced parenthesis")) - )) - (forward-char 1)) - + (error "Missing `end'")) + (t + (error "Unbalanced parenthesis")) + ) + (forward-char 1)) + ;; Character quote: Skip it and the quoted char. ((= cs ?/) (forward-char 2)) @@ -3562,7 +3917,7 @@ ((= cs ?\\) (forward-char 1) (skip-syntax-forward "w")) - + ;; Everything else (t (forward-char 1))) @@ -3572,132 +3927,198 @@ "From the given last position and state (stack) calculate indentation. Return nil if inside string, t if in a comment." (let* ((stack (and state (car state))) - (token (nth 1 state)) - (stack-top (and stack (car stack)))) - (cond ((null state) ;No state - 0) - ((nth 3 state) - ;; Return nil or t. - (eq (nth 3 state) 'comment)) - ((null stack) - (if (looking-at "when[^_a-zA-Z0-9]") - erlang-indent-guard - 0)) - ((eq (car stack-top) '\() - ;; Element of list, tuple or part of an expression, - (if (null erlang-argument-indent) - ;; indent to next column. - (1+ (nth 2 stack-top)) - (goto-char (nth 1 stack-top)) - (cond ((looking-at "[({]\\s *\\($\\|%\\)") - ;; Line ends with parenthesis. - (+ (erlang-indent-find-preceding-expr) - erlang-argument-indent)) - (t - ;; Indent to the same column as the first - ;; argument. - (goto-char (1+ (nth 1 stack-top))) - (skip-chars-forward " \t") - (current-column))))) - ((eq (car stack-top) 'icr) - ;; The default indentation is the column of the option - ;; directly following the keyword. (This does not apply to - ;; `case'.) Should no option be on the same line, the - ;; indentation is the indentation of the keyword + - ;; `erlang-indent-level'. - ;; - ;; `after' should be indented to the save level as the - ;; corresponding receive. - (if (looking-at "after[^_a-zA-Z0-9]") - (nth 2 stack-top) - (save-excursion - (goto-char (nth 1 stack-top)) - (if (looking-at "case[^_a-zA-Z0-9]") - (+ (nth 2 stack-top) erlang-indent-level) - (skip-chars-forward "a-z") - (skip-chars-forward " \t") - (if (memq (following-char) '(?% ?\n)) - (+ (nth 2 stack-top) erlang-indent-level) - (current-column))))) - (if (looking-at "catch[^_a-zA-Z0-9]") + (token (nth 1 state)) + (stack-top (and stack (car stack)))) + (cond ((null state) ;No state + 0) + ((nth 3 state) + ;; Return nil or t. + (eq (nth 3 state) 'comment)) + ((null stack) + (if (looking-at "when[^_a-zA-Z0-9]") + erlang-indent-guard + 0)) + ((eq (car stack-top) '\() + ;; Element of list, tuple or part of an expression, + (cond ((null erlang-argument-indent) + ;; indent to next column. + (1+ (nth 2 stack-top))) + ((= (char-syntax (following-char)) ?\)) + (goto-char (nth 1 stack-top)) + (cond ((looking-at "[({]\\s *\\($\\|%\\)") + ;; Line ends with parenthesis. + (let ((previous (erlang-indent-find-preceding-expr)) + (stack-pos (nth 2 stack-top))) + (if (>= previous stack-pos) stack-pos + (- (+ previous erlang-argument-indent) 1)))) + (t + (nth 2 stack-top)))) + (t + (goto-char (nth 1 stack-top)) + (cond ((looking-at "[({]\\s *\\($\\|%\\)") + ;; Line ends with parenthesis. + (erlang-indent-parenthesis (nth 2 stack-top))) + (t + ;; Indent to the same column as the first + ;; argument. + (goto-char (1+ (nth 1 stack-top))) + (skip-chars-forward " \t") + (current-column)))))) + ;; + ((eq (car stack-top) '<<) + ;; Element of binary (possible comprehension) expression, + (cond ((null erlang-argument-indent) + ;; indent to next column. + (+ 2 (nth 2 stack-top))) + ((looking-at "\\(>>\\)[^_a-zA-Z0-9]") + (nth 2 stack-top)) + (t + (goto-char (nth 1 stack-top)) + ;; Indent to the same column as the first + ;; argument. + (goto-char (+ 2 (nth 1 stack-top))) + (skip-chars-forward " \t") + (current-column)))) + + ((memq (car stack-top) '(icr fun spec)) + ;; The default indentation is the column of the option + ;; directly following the keyword. (This does not apply to + ;; `case'.) Should no option be on the same line, the + ;; indentation is the indentation of the keyword + + ;; `erlang-indent-level'. + ;; + ;; `after' should be indented to the same level as the + ;; corresponding receive. + (cond ((looking-at "\\(after\\|catch\\|of\\)\\($\\|[^_a-zA-Z0-9]\\)") + (nth 2 stack-top)) + ((looking-at "when[^_a-zA-Z0-9]") + ;; Handling one when part + (+ (nth 2 stack-top) erlang-indent-level erlang-indent-guard)) + (t + (save-excursion + (goto-char (nth 1 stack-top)) + (if (looking-at "case[^_a-zA-Z0-9]") + (+ (nth 2 stack-top) erlang-indent-level) + (skip-chars-forward "a-z") + (skip-chars-forward " \t") + (if (memq (following-char) '(?% ?\n)) + (+ (nth 2 stack-top) erlang-indent-level) + (current-column)))))) + ) + ((and (eq (car stack-top) '||) (looking-at "\\(]\\|>>\\)[^_a-zA-Z0-9]")) + (nth 2 (car (cdr stack)))) + ;; Real indentation, where operators create extra indentation etc. + ((memq (car stack-top) '(-> || begin try)) + (if (looking-at "\\(of\\)[^_a-zA-Z0-9]") (nth 2 stack-top) - (save-excursion - (goto-char (nth 1 stack-top)) - (if (looking-at "case[^_a-zA-Z0-9]") - (+ (nth 2 stack-top) erlang-indent-level) - (skip-chars-forward "a-z") - (skip-chars-forward " \t") - (if (memq (following-char) '(?% ?\n)) - (+ (nth 2 stack-top) erlang-indent-level) - (current-column))))) - ) - ;; Real indentation, where operators create extra indentation etc. - ((memq (car stack-top) '(-> || begin)) - (goto-char (nth 1 stack-top)) - ;; Check if there is more code after the '->' on the - ;; same line. If so use this indentation as base, else - ;; use parent indentation + 2 * level as base. - (let ((off erlang-indent-level) - (skip 2)) - (cond ((null (cdr stack))) ; Top level in function. - ((eq (car stack-top) 'begin) - (setq skip 5)) - ((eq (car stack-top) '->) - (setq off (* 2 erlang-indent-level)))) - (let ((base (erlang-indent-find-base stack indent-point off skip))) - ;; Look at last thing to see how we are to move relative - ;; to the base. - (goto-char token) - (cond ((looking-at "||\\|,\\|->\\|:-") - base) - ((erlang-at-keyword) - (+ (current-column) erlang-indent-level)) - ((or (= (char-syntax (following-char)) ?.) - (erlang-at-operator)) - (+ base erlang-indent-level)) - (t - (goto-char indent-point) - (cond ((memq (following-char) '(?\( ?{)) - ;; Function application or record. - (+ (erlang-indent-find-preceding-expr) - erlang-argument-indent)) - ;; Empty line, or end; treat it as the end of - ;; the block. (Here we have a choice: should - ;; the user be forced to reindent continued - ;; lines, or should the "end" be reindented?) - ((looking-at "\\(end\\|after\\|catch\\)[^_a-zA-Z0-9]\\|$") - (if (eq (car (car stack)) '->) - (erlang-pop stack)) - (if stack - (erlang-caddr (car stack)) - 0)) - ;; Avoid treating comments a continued line. - ((= (following-char) ?%) - base) - ;; Continued line (e.g. line beginning - ;; with an operator.) - (t (+ base erlang-indent-level))))))) - ) + (goto-char (nth 1 stack-top)) + ;; Check if there is more code after the '->' on the + ;; same line. If so use this indentation as base, else + ;; use parent indentation + 2 * level as base. + (let ((off erlang-indent-level) + (skip 2)) + (cond ((null (cdr stack))) ; Top level in function. + ((eq (car stack-top) 'begin) + (setq skip 5)) + ((eq (car stack-top) 'try) + (setq skip 5)) + ((eq (car stack-top) '->) + ;; If in fun definition use standard indent level not double + ;;(if (not (eq (car (car (cdr stack))) 'fun)) + ;; Removed it made multi clause fun's look to bad + (setq off (* 2 erlang-indent-level)))) ;; ) + (let ((base (erlang-indent-find-base stack indent-point off skip))) + ;; Special cases + (goto-char indent-point) + (cond ((looking-at "\\(end\\|after\\)\\($\\|[^_a-zA-Z0-9]\\)") + (if (eq (car stack-top) '->) + (erlang-pop stack)) + (if stack + (erlang-caddr (car stack)) + 0)) + ((looking-at "catch\\($\\|[^_a-zA-Z0-9]\\)") + (if (or (eq (car stack-top) 'try) + (eq (car (car (cdr stack))) 'icr)) + (progn + (if (eq (car stack-top) '->) + (erlang-pop stack)) + (if stack + (erlang-caddr (car stack)) + 0)) + base)) ;; old catch + (t + ;; Look at last thing to see how we are to move relative + ;; to the base. + (goto-char token) + (cond ((looking-at "||\\|,\\|->") + base) + ((erlang-at-keyword) + (+ (current-column) erlang-indent-level)) + ((or (= (char-syntax (following-char)) ?.) + (erlang-at-operator)) + (+ base erlang-indent-level)) + (t + (goto-char indent-point) + (cond ((memq (following-char) '(?\( ?{)) + ;; Function application or record. + (+ (erlang-indent-find-preceding-expr) + erlang-argument-indent)) + ;; Empty line, or end; treat it as the end of + ;; the block. (Here we have a choice: should + ;; the user be forced to reindent continued + ;; lines, or should the "end" be reindented?) + + ;; Avoid treating comments a continued line. + ((= (following-char) ?%) + base) + ;; Continued line (e.g. line beginning + ;; with an operator.) + (t (+ base erlang-indent-level))))))))) + )) ((eq (car stack-top) 'when) (goto-char (nth 1 stack-top)) (if (looking-at "when\\s *\\($\\|%\\)") (progn (erlang-pop stack) - (if (and stack (eq (nth 0 (car stack)) 'icr)) + (if (and stack (memq (nth 0 (car stack)) '(icr fun))) (progn (goto-char (nth 1 (car stack))) (+ (nth 2 (car stack)) erlang-indent-guard ;; receive XYZ or receive ;; XYZ - (if (looking-at "[a-z]+\\s *\\($\\|%\\)") - erlang-indent-level - (* 2 erlang-indent-level)))) - erlang-indent-guard)) - ;; "when" is followed by code, let's indent to the same - ;; column. - (forward-char 4) ; Skip "when" - (skip-chars-forward " \t") - (current-column)))))) + ;; This if thing does not seem to be needed + ;;(if (looking-at "[a-z]+\\s *\\($\\|%\\)") + ;; erlang-indent-level + ;; (* 2 erlang-indent-level)))) + (* 2 erlang-indent-level))) + ;;erlang-indent-level)) + (+ erlang-indent-level erlang-indent-guard))) + ;; "when" is followed by code, let's indent to the same + ;; column. + (forward-char 4) ; Skip "when" + (skip-chars-forward " \t") + (current-column))) + ;; Type and Spec indentation + ((eq (car stack-top) '::) + (cond ((null erlang-argument-indent) + ;; indent to next column. + (+ 2 (nth 2 stack-top))) + ((looking-at "::[^_a-zA-Z0-9]") + (nth 2 stack-top)) + (t + (goto-char (nth 1 stack-top)) + (cond ((looking-at "::\\s *\\($\\|%\\)") + ;; Line ends with :: + (+ (erlang-indent-find-preceding-expr 2) + erlang-argument-indent)) + ;; (* 2 erlang-indent-level)) + (t + ;; Indent to the same column as the first + ;; argument. + (goto-char (+ 2 (nth 1 stack-top))) + (skip-chars-forward " \t") + (current-column)))))) + ))) (defun erlang-indent-find-base (stack indent-point &optional offset skip) @@ -3707,28 +4128,32 @@ (save-excursion (let* ((stack-top (car stack))) (goto-char (nth 1 stack-top)) - (forward-char skip) - (if (looking-at "\\s *\\($\\|%\\)") - (progn - (if (memq (car stack-top) '(-> ||)) - (erlang-pop stack)) - ;; Take parent identation + offset, - ;; else just erlang-indent-level if no parent - (if stack - (+ (erlang-caddr (car stack)) - offset) - erlang-indent-level)) - (erlang-skip-blank indent-point) - (current-column))))) + (if (< skip (- (point-max) (point))) + (progn + (forward-char skip) + (if (looking-at "\\s *\\($\\|%\\)") + (progn + (if (memq (car stack-top) '(-> ||)) + (erlang-pop stack)) + ;; Take parent identation + offset, + ;; else just erlang-indent-level if no parent + (if stack + (+ (erlang-caddr (car stack)) + offset) + erlang-indent-level)) + (erlang-skip-blank indent-point) + (current-column))) + (+ (current-column) skip))))) ;; Does not handle `begin' .. `end'. -(defun erlang-indent-find-preceding-expr () +(defun erlang-indent-find-preceding-expr (&optional arg) "Return the first column of the preceding expression. This assumes that the preceding expression is either simple \(i.e. an atom) or parenthesized." (save-excursion - (forward-sexp -1) + (or arg (setq arg 1)) + (forward-sexp (- arg)) (let ((col (current-column))) (skip-chars-backward " \t") ;; Needed to match the colon in "'foo':'bar'". @@ -3738,6 +4163,11 @@ (forward-sexp -1) (current-column))))) +(defun erlang-indent-parenthesis (stack-position) + (let ((previous (erlang-indent-find-preceding-expr))) + (if (> previous stack-position) + (+ stack-position erlang-argument-indent) + (+ previous erlang-argument-indent)))) (defun erlang-skip-blank (&optional lim) "Skip over whitespace and comments until limit reached." @@ -3758,7 +4188,7 @@ (defun erlang-at-keyword () "Are we looking at an Erlang keyword which will increase indentation?" (looking-at (concat "\\(when\\|if\\|fun\\|case\\|begin\\|query\\|" - "of\\|receive\\|after\\|catch\\)[^_a-zA-Z0-9]"))) + "of\\|receive\\|after\\|catch\\|try\\)[^_a-zA-Z0-9]"))) (defun erlang-at-operator () "Are we looking at an Erlang operator?" @@ -3813,7 +4243,7 @@ (forward-char 1)))) ;; The regexp matches a function header that isn't ;; included in a string. - (and (re-search-forward "\\(\\`\\|\\`\n\\|[^\\]\n\\)\\([a-z]\\|'\\|-\\)" + (and (re-search-forward "\\(\\`\\|\\`\n\\|[^\\]\n\\)\\(-?[a-z]\\|'\\|-\\)" nil 'move (- arg)) (let ((beg (match-beginning 2))) (and beg (goto-char beg)) @@ -4046,7 +4476,7 @@ (defun erlang-uncomment-region (beg end) "Uncomment all commented lines in the region." (interactive "r") - (comment-region beg end -1)) + (uncomment-region beg end)) (defun erlang-generate-new-clause () @@ -4176,7 +4606,7 @@ (erlang-remove-quotes (erlang-buffer-substring (match-beginning 1) (match-end 1))) - (string-to-int + (erlang-string-to-int (erlang-buffer-substring (match-beginning (+ 1 erlang-atom-regexp-matches)) @@ -4261,9 +4691,7 @@ (defun erlang-get-function-arrow () - "Return arrow of current function, could be \"->\", \":-\" or nil. - -The \":-\" arrow is used by mnesia queries. + "Return arrow of current function, could be \"->\" or nil. Normally used in conjunction with `erlang-beginning-of-clause', e.g.: (save-excursion @@ -4363,13 +4791,14 @@ ;; replace-regexp-in-string. (defun erlang-add-quotes-if-needed (str) "Return STR, possibly with quotes." - (if (and (stringp str) - (not (string-match (eval-when-compile - (concat "\\`" erlang-atom-regexp "\\'")) str))) - (progn (if (fboundp 'replace-regexp-in-string) - (setq str (replace-regexp-in-string "'" "\\'" str t t ))) - (concat "'" str "'")) - str)) + (let ((case-fold-search nil)) ; force string matching to be case sensitive + (if (and (stringp str) + (not (string-match (eval-when-compile + (concat "\\`" erlang-atom-regexp "\\'")) str))) + (progn (if (fboundp 'replace-regexp-in-string) + (setq str (replace-regexp-in-string "'" "\\'" str t t ))) + (concat "'" str "'")) + str))) (defun erlang-remove-quotes (str) @@ -4417,8 +4846,10 @@ This function is normally placed in the hook `local-write-file-hooks'." (if erlang-check-module-name - (let ((mn (erlang-get-module)) - (fn (erlang-get-module-from-file-name (buffer-file-name)))) + (let ((mn (erlang-add-quotes-if-needed + (erlang-get-module))) + (fn (erlang-add-quotes-if-needed + (erlang-get-module-from-file-name (buffer-file-name))))) (if (and (stringp mn) (stringp fn)) (or (string-equal mn fn) (if (or (eq erlang-check-module-name t) @@ -4729,7 +5160,7 @@ (erlang-beginning-of-clause) (point)))) (state (if (fboundp 'syntax-ppss) ; post Emacs 21.3 - (syntax-ppss) + (funcall (symbol-function 'syntax-ppss)) (parse-partial-sexp lim (point))))) (cond ((eq (nth 3 state) ?') 'atom) @@ -4747,6 +5178,15 @@ (erlang-beginning-of-function -1) (point)))) +(defun erlang-at-end-of-clause-p () + "Test if point is at end of an Erlang clause. + +This function is designed to be a member of a criteria list." + (eq (save-excursion (erlang-skip-blank) (point)) + (save-excursion + (erlang-beginning-of-clause -1) (point)))) + + (defun erlang-stop-when-inside-argument-list () "Return `stop' if inside parenthesis list, nil otherwise. @@ -4782,7 +5222,7 @@ (concat "^" erlang-atom-regexp "\\s *("))) (not (looking-at (eval-when-compile - (concat "^" erlang-atom-regexp ".*\\(->\\|:-\\)"))))) + (concat "^" erlang-atom-regexp ".*->"))))) 'stop nil))) @@ -5138,22 +5578,22 @@ ;; Make sure our functions are installed in TAGS files loaded ;; into Emacs while searching. (cond - (( >= erlang-emacs-major-version 20) + ((>= erlang-emacs-major-version 20) (setq erlang-tags-orig-format-functions - (symbol-value 'tags-table-format-functions)) + (symbol-value 'tags-table-format-functions)) (funcall (symbol-function 'set) 'tags-table-format-functions - (cons 'erlang-tags-recognize-tags-table - erlang-tags-orig-format-functions)) + (cons 'erlang-tags-recognize-tags-table + erlang-tags-orig-format-functions)) (setq erlang-tags-buffer-list '()) ) (t (setq erlang-tags-orig-format-hooks - (symbol-value 'tags-table-format-hooks))) - (funcall (symbol-function 'set) 'tags-table-format-hooks - (cons 'erlang-tags-recognize-tags-table - erlang-tags-orig-format-hooks)) - (setq erlang-tags-buffer-list '()) - ) + (symbol-value 'tags-table-format-hooks)) + (funcall (symbol-function 'set) 'tags-table-format-hooks + (cons 'erlang-tags-recognize-tags-table + erlang-tags-orig-format-hooks)) + (setq erlang-tags-buffer-list '()) + )) ;; Install our functions in the TAGS files already resident. (save-excursion @@ -5443,6 +5883,9 @@ Change this variable to use your favorite Erlang compilation package.") +(defvar erlang-compile-erlang-function "c" + "Erlang function to call to compile an erlang file.") + (defvar erlang-compile-display-function 'inferior-erlang-run-or-select "Command to execute to view last compilation. @@ -5512,11 +5955,6 @@ (defvar erlang-shell-buffer-name "*erlang*" "The name of the Erlang link shell buffer.") -;;(when (boundp 'same-window-buffer-names) - ;; (unless (member "*Python*" same-window-buffer-names) - ;; (push "*Python*" same-window-buffer-names))) - - (defvar erlang-shell-mode-map nil "Keymap used by Erlang shells.") @@ -5577,12 +6015,13 @@ ;; the call fails, just call the normal `add-hook'. (condition-case nil (progn - (make-local-hook 'comint-output-filter-functions) ; obsolete after Emacs 21.3 - (add-hook 'comint-output-filter-functions - 'inferior-erlang-strip-delete nil t) - (add-hook 'comint-output-filter-functions - 'inferior-erlang-strip-ctrl-m nil t)) + (add-hook 'comint-output-filter-functions + 'inferior-erlang-strip-delete nil t) + (add-hook 'comint-output-filter-functions + 'inferior-erlang-strip-ctrl-m nil t)) (error + (funcall (symbol-function 'make-local-hook) + 'comint-output-filter-functions) ; obsolete as of Emacs 21.1 (add-hook 'comint-output-filter-functions 'inferior-erlang-strip-delete) (add-hook 'comint-output-filter-functions 'inferior-erlang-strip-ctrl-m))) ;; Some older versions of comint don't have an input ring. @@ -5714,8 +6153,13 @@ nil opts))) (setq inferior-erlang-process (get-buffer-process inferior-erlang-buffer)) - (process-kill-without-query inferior-erlang-process) - (switch-to-buffer inferior-erlang-buffer) + (if (> 21 erlang-emacs-major-version) ; funcalls to avoid compiler warnings + (funcall (symbol-function 'set-process-query-on-exit-flag) + inferior-erlang-process nil) + (funcall (symbol-function 'process-kill-without-query) inferior-erlang-process)) + (if erlang-inferior-shell-split-window + (switch-to-buffer-other-window inferior-erlang-buffer) + (switch-to-buffer inferior-erlang-buffer)) (if (and (not (eq system-type 'windows-nt)) (eq inferior-erlang-shell-type 'newshell)) (setq comint-process-echoes t)) @@ -5811,6 +6255,21 @@ (error "No Erlang shell prompt before timeout"))) (if msg (message "")))))) +(defun inferior-erlang-send-empty-cmd-unless-already-at-prompt () + "If not already at a prompt, try to send an empty cmd to get a prompt. +The empty command resembles hitting RET. This is useful in some +situations, for instance if a crash or error report from sasl +has been printed after the last prompt." + (save-excursion + (set-buffer inferior-erlang-buffer) + (if (> (point-max) 1) + ;; make sure we get a prompt if buffer contains data + (if (save-excursion + (goto-char (process-mark inferior-erlang-process)) + (forward-line 0) + (not (looking-at comint-prompt-regexp))) + (inferior-erlang-send-command ""))))) + (autoload 'comint-send-input "comint") (defun inferior-erlang-send-command (cmd &optional hist) @@ -5843,7 +6302,10 @@ ;; has been sorted out in Emacs 21. -- fx (let ((comint-eol-on-send nil) (comint-input-filter (if hist comint-input-filter 'ignore))) - (comint-send-input)) + (if (and (not erlang-xemacs-p) + (>= emacs-major-version 22)) + (comint-send-input nil t) + (comint-send-input))) ;; Adjust all windows whose points are incorrect. (if (null comint-process-echoes) (walk-windows @@ -5909,36 +6371,22 @@ (setq erlang-compile-use-outdir nil)" (interactive "P") (save-some-buffers) - (or (inferior-erlang-running-p) - (save-excursion - (inferior-erlang))) - (or (inferior-erlang-running-p) - (error "Error starting inferior Erlang shell")) - (let ((dir (file-name-directory (buffer-file-name))) + (inferior-erlang-prepare-for-input) + (let* ((dir (inferior-erlang-compile-outdir)) ;;; (file (file-name-nondirectory (buffer-file-name))) - (noext (substring (buffer-file-name) 0 -4)) - ;; Hopefully, noone else will ever use these... - (tmpvar "Tmp7236") - (tmpvar2 "Tmp8742") - end) - (inferior-erlang-display-buffer) - (inferior-erlang-wait-prompt) + (noext (substring (buffer-file-name) 0 -4)) + (opts (append (list (cons 'outdir dir)) + (if current-prefix-arg + (list 'debug_info 'export_all)) + erlang-compile-extra-opts)) + end) + (save-excursion + (set-buffer inferior-erlang-buffer) + (compilation-forget-errors)) (setq end (inferior-erlang-send-command - (if erlang-compile-use-outdir - (if current-prefix-arg - (format "c(\"%s\", [{outdir, \"%s\"}, debug_info, export_all])." noext dir) - (format "c(\"%s\", [{outdir, \"%s\"}])." noext dir)) - (format - (concat - "f(%s), {ok, %s} = file:get_cwd(), " - "file:set_cwd(\"%s\"), " - (if current-prefix-arg - "%s = c(\"%s\", [debug_info, export_all]), file:set_cwd(%s), f(%s), %s." - "%s = c(\"%s\"), file:set_cwd(%s), f(%s), %s.")) - tmpvar2 tmpvar - dir - tmpvar2 noext tmpvar tmpvar tmpvar2)) + (inferior-erlang-compute-compile-command noext opts) nil)) + (sit-for 0) (inferior-erlang-wait-prompt) (save-excursion (set-buffer inferior-erlang-buffer) @@ -5946,6 +6394,89 @@ (set-marker compilation-parsing-end end)) (setq compilation-last-buffer inferior-erlang-buffer))) +(defun inferior-erlang-prepare-for-input (&optional no-display) + "Create an inferior erlang buffer if needed and ready it for input. +The buffer is displayed, according to `inferior-erlang-display-buffer' +unless the optional NO-DISPLAY is non-nil." + (or (inferior-erlang-running-p) + (save-excursion + (inferior-erlang))) + (or (inferior-erlang-running-p) + (error "Error starting inferior Erlang shell")) + (if (not no-display) + (inferior-erlang-display-buffer)) + (inferior-erlang-send-empty-cmd-unless-already-at-prompt) + (sit-for 0) + (inferior-erlang-wait-prompt)) + +(defun inferior-erlang-compile-outdir () + "Return the directory to compile the current buffer into." + (let* ((buffer-dir (directory-file-name + (file-name-directory (buffer-file-name)))) + (parent-dir (directory-file-name + (file-name-directory buffer-dir))) + (ebin-dir (concat (file-name-as-directory parent-dir) "ebin")) + (buffer-dir-base-name (file-name-nondirectory + (expand-file-name + (concat (file-name-as-directory buffer-dir) + "."))))) + (if (and (string= buffer-dir-base-name "src") + (file-directory-p ebin-dir)) + (file-name-as-directory ebin-dir) + (file-name-as-directory buffer-dir)))) + +(defun inferior-erlang-compute-compile-command (module-name opts) + (let* ((out-dir-opt (assoc 'outdir opts)) + (out-dir (cdr out-dir-opt))) + (if erlang-compile-use-outdir + (format "%s(\"%s\"%s)." + erlang-compile-erlang-function + module-name + (inferior-erlang-format-comma-opts opts)) + (let (;; Hopefully, noone else will ever use these... + (tmpvar "Tmp7236") + (tmpvar2 "Tmp8742")) + (format + (concat + "f(%s), {ok, %s} = file:get_cwd(), " + "file:set_cwd(\"%s\"), " + "%s = %s(\"%s\"%s), file:set_cwd(%s), f(%s), %s.") + tmpvar2 tmpvar + out-dir + tmpvar2 + erlang-compile-erlang-function + module-name (inferior-erlang-format-comma-opts + (remq out-dir-opt opts)) + tmpvar tmpvar tmpvar2))))) + +(defun inferior-erlang-format-comma-opts (opts) + (if (null opts) + "" + (concat ", " (inferior-erlang-format-opts opts)))) + +(defun inferior-erlang-format-opts (opts) + (concat "[" (inferior-erlang-string-join (mapcar 'inferior-erlang-format-opt + opts) + ", ") + "]")) + +(defun inferior-erlang-format-opt (opt) + (cond ((stringp opt) (concat "\"" opt "\"")) + ((atom opt) (format "%s" opt)) + ((consp opt) (concat "{" (inferior-erlang-string-join + (mapcar 'inferior-erlang-format-opt + (list (car opt) (cdr opt))) + ", ") + "}")) + (t (error (format "Unexpected opt %s" opt))))) + +(defun inferior-erlang-string-join (strs sep) + (let ((result (or (car strs) ""))) + (setq strs (cdr strs)) + (while strs + (setq result (concat result sep (car strs))) + (setq strs (cdr strs))) + result)) ;; `next-error' only accepts buffers with major mode `compilation-mode' ;; or with the minor mode `compilation-minor-mode' activated. @@ -5957,8 +6488,10 @@ Capable of finding error messages in an inferior Erlang buffer." (interactive "P") (let ((done nil) - (buf (and (boundp 'compilation-last-buffer) - compilation-last-buffer))) + (buf (or (and (boundp 'next-error-last-buffer) + next-error-last-buffer) + (and (boundp 'compilation-last-buffer) + compilation-last-buffer)))) (if (and (bufferp buf) (save-excursion (set-buffer buf) @@ -5983,6 +6516,7 @@ (or (inferior-erlang-running-p) (error "No inferior Erlang is running")) (inferior-erlang-display-buffer) + (inferior-erlang-send-empty-cmd-unless-already-at-prompt) (inferior-erlang-wait-prompt) (inferior-erlang-send-command (format "cd('%s')." dir) nil)) @@ -6040,12 +6574,12 @@ ;; equal. This is done last-to-first by buffer position, so that ;; inserting spaces before one arrow doesn't change the ;; positions of the next ones. - (mapcar (lambda (arrow-pos) - (goto-char arrow-pos) - (let* ((pad (- most-indent (erlang-column-number)))) - (when (> pad 0) - (insert-char ?\ pad)))) - arrow-positions)))) + (mapc (lambda (arrow-pos) + (goto-char arrow-pos) + (let* ((pad (- most-indent (erlang-column-number)))) + (when (> pad 0) + (insert-char ?\ pad)))) + arrow-positions)))) (defun erlang-column-number () "Return the column number of the current position in the buffer. @@ -6098,6 +6632,12 @@ (ad-unadvise 'Man-notify-when-ready) (ad-unadvise 'set-visited-file-name))))) + +(defun erlang-string-to-int (string) + (if (fboundp 'string-to-number) + (string-to-number string) + (funcall (symbol-function 'string-to-int) string))) + ;; The end... (provide 'erlang) diff -Nru erlang-13.b.1-dfsg/lib/tools/emacs/erlang-eunit.el erlang-13.b.3-dfsg/lib/tools/emacs/erlang-eunit.el --- erlang-13.b.1-dfsg/lib/tools/emacs/erlang-eunit.el 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/tools/emacs/erlang-eunit.el 2009-11-20 13:34:52.000000000 +0000 @@ -0,0 +1,254 @@ +;; +;; %CopyrightBegin% +;; +;; Copyright Ericsson AB 2009. All Rights Reserved. +;; +;; The contents of this file are subject to the Erlang Public License, +;; Version 1.1, (the "License"); you may not use this file except in +;; compliance with the License. You should have received a copy of the +;; Erlang Public License along with this software. If not, it can be +;; retrieved online at http://www.erlang.org/. +;; +;; Software distributed under the License is distributed on an "AS IS" +;; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +;; the License for the specific language governing rights and limitations +;; under the License. +;; +;; %CopyrightEnd% +;;; +;;; Purpose: Provide EUnit utilities. +;;; +;;; Author: Klas Johansson + +(defvar erlang-eunit-separate-src-and-test-directories t + "*Whether or not to keep source and EUnit test files in separate directories") + +;;; +;;; Switch between src/EUnit test buffers +;;; +(defun erlang-eunit-toggle-src-and-test-file-other-window () + "Switch to the src file if the EUnit test file is the current +buffer and vice versa" + (interactive) + (if (erlang-eunit-test-file-p buffer-file-name) + (erlang-eunit-open-src-file-other-window buffer-file-name) + (erlang-eunit-open-test-file-other-window buffer-file-name))) + +;;; +;;; Open the EUnit test file which corresponds to a src file +;;; +(defun erlang-eunit-open-test-file-other-window (src-file-path) + "Open the EUnit test file which corresponds to a src file" + (find-file-other-window (erlang-eunit-test-filename src-file-path))) + + +;;; +;;; Open the src file which corresponds to the an EUnit test file +;;; +(defun erlang-eunit-open-src-file-other-window (test-file-path) + "Open the src file which corresponds to the an EUnit test file" + (find-file-other-window (erlang-eunit-src-filename test-file-path))) + +;;; Return the name and path of the EUnit test file +;;, (input may be either the source filename itself or the EUnit test filename) +(defun erlang-eunit-test-filename (file-path) + (erlang-eunit-rewrite-filename file-path "test" "_tests")) + +;;; Return the name and path of the source file +;;, (input may be either the source filename itself or the EUnit test filename) +(defun erlang-eunit-src-filename (file-path) + (erlang-eunit-rewrite-filename file-path "src" "")) + +;;; Rewrite a filename from the src or test filename to the other +(defun erlang-eunit-rewrite-filename (orig-file-path dest-dirname dest-suffix) + (let* ((root-dir-name (erlang-eunit-file-root-dir-name orig-file-path)) + (src-module-name (erlang-eunit-source-module-name orig-file-path)) + (dest-base-name (concat src-module-name dest-suffix ".erl")) + (dest-dir-name-1 (file-name-directory orig-file-path)) + (dest-dir-name-2 (filename-join root-dir-name dest-dirname)) + (dest-file-name-1 (filename-join dest-dir-name-1 dest-base-name)) + (dest-file-name-2 (filename-join dest-dir-name-2 dest-base-name))) + ;; This function tries to be a bit intelligent: + ;; * if there already is a test (or source) file in the same + ;; directory as a source (or test) file, it'll be picked + ;; * if there already is a test (or source) file in a separate + ;; test (or src) directory, it'll be picked + ;; * otherwise it'll resort to whatever alternative (same or + ;; separate directories) that the user has chosen + (cond ((file-readable-p dest-file-name-1) + dest-file-name-1) + ((file-readable-p dest-file-name-2) + dest-file-name-2) + (erlang-eunit-separate-src-and-test-directories + dest-file-name-2) + (t + dest-file-name-1)))) + +;;; Checks whether a file is a EUnit test file or not +(defun erlang-eunit-test-file-p (file-path) + (erlang-eunit-string-match-p "^\\(.+\\)_tests.erl$" file-path)) + +;;; Return the module name of the source file +;;; /tmp/foo/src/x.erl --> x +;;; /tmp/foo/test/x_tests.erl --> x +(defun erlang-eunit-source-module-name (file-path) + (interactive) + (let* ((file-name (file-name-nondirectory file-path)) + (base-name (file-name-sans-extension file-name))) + (if (string-match "^\\(.+\\)_tests$" base-name) + (substring base-name (match-beginning 1) (match-end 1)) + base-name))) + +;;; Return the directory name which is common to both src and test +;;; /tmp/foo/src/x.erl --> /tmp/foo +;;; /tmp/foo/test/x_tests.erl --> /tmp/foo +(defun erlang-eunit-file-root-dir-name (file-path) + (erlang-eunit-dir-parent-dirname (file-name-directory file-path))) + +;;; Return the parent directory name of a directory +;;; /tmp/foo/ --> /tmp +;;; /tmp/foo --> /tmp +(defun erlang-eunit-dir-parent-dirname (dir-name) + (file-name-directory (directory-file-name dir-name))) + +;;; Older emacsen don't have string-match-p. +(defun erlang-eunit-string-match-p (regexp string &optional start) + (if (fboundp 'string-match-p) ;; appeared in emacs 23 + (string-match-p regexp string start) + (save-match-data ;; fallback for earlier versions of emacs + (string-match regexp string start)))) + +;;; Join filenames +(defun filename-join (dir file) + (if (or (= (elt file 0) ?/) + (= (car (last (append dir nil))) ?/)) + (concat dir file) + (concat dir "/" file))) + +;;; Run EUnit tests for the current module +(defun erlang-eunit-run-tests () + "Run the EUnit test suite for the current module. + +With prefix arg, runs tests with the verbose flag set." + (interactive) + (let* ((module-name (erlang-add-quotes-if-needed + (erlang-eunit-source-module-name buffer-file-name))) + (opts (if current-prefix-arg ", [verbose]" "")) + (command (format "eunit:test(%s%s)." module-name opts))) + (erlang-eunit-inferior-erlang-send-command command))) + +;;; Compile source and EUnit test file and finally run EUnit tests for +;;; the current module +(defun erlang-eunit-compile-and-run-tests () + "Compile the source and test files and run the EUnit test suite. + +With prefix arg, compiles for debug and runs tests with the verbose flag set." + (interactive) + (let ((src-filename (erlang-eunit-src-filename buffer-file-name)) + (test-filename (erlang-eunit-test-filename buffer-file-name))) + + ;; The purpose of out-maneuvering `save-some-buffers', as is done + ;; below, is to ask the question about saving buffers only once, + ;; instead of possibly several: one for each file to compile, + ;; for instance for both x.erl and x_tests.erl. + (save-some-buffers) + (flet ((save-some-buffers (&optional any) nil)) + + ;; Compilation of the source file is mandatory (the file must + ;; exist, otherwise the procedure is aborted). Compilation of the + ;; test file on the other hand, is optional, since eunit tests may + ;; be placed in the source file instead. Any compilation error + ;; will prevent the subsequent steps to be run (hence the `and') + (and (erlang-eunit-compile-file src-filename) + (if (file-readable-p test-filename) + (erlang-eunit-compile-file test-filename) + t) + (erlang-eunit-run-tests))))) + +(defun erlang-eunit-compile-file (file-path) + (if (file-readable-p file-path) + (save-excursion + (set-buffer (find-file-noselect file-path)) + (erlang-compile) + (erlang-eunit-last-compilation-successful-p)) + (let ((msg (format "Could not read %s" file-path))) + (erlang-eunit-inferior-erlang-send-command + (format "%% WARNING: %s" msg)) + (error msg)))) + +(defun erlang-eunit-last-compilation-successful-p () + (save-excursion + (set-buffer inferior-erlang-buffer) + (goto-char compilation-parsing-end) + (erlang-eunit-all-list-elems-fulfill-p + (lambda (re) (let ((continue t) + (result t)) + (while continue ; ignore warnings, stop at errors + (if (re-search-forward re (point-max) t) + (if (erlang-eunit-is-compilation-warning) + t + (setq result nil) + (setq continue nil)) + (setq result t) + (setq continue nil))) + result)) + (mapcar (lambda (e) (car e)) erlang-error-regexp-alist)))) + +(defun erlang-eunit-is-compilation-warning () + (erlang-eunit-string-match-p + "[0-9]+: Warning:" + (buffer-substring (line-beginning-position) (line-end-position)))) + +(defun erlang-eunit-all-list-elems-fulfill-p (pred list) + (let ((matches-p t)) + (while (and list matches-p) + (if (not (funcall pred (car list))) + (setq matches-p nil)) + (setq list (cdr list))) + matches-p)) + +;;; Evaluate a command in an erlang buffer +(defun erlang-eunit-inferior-erlang-send-command (command) + "Evaluate a command in an erlang buffer." + (interactive "P") + (inferior-erlang-prepare-for-input) + (inferior-erlang-send-command command) + (sit-for 0) ;; redisplay + (inferior-erlang-wait-prompt)) + + +;;;==================================================================== +;;; Key bindings +;;;==================================================================== + +(defvar erlang-eunit-toggle-src-and-test-file-other-window-key "\C-c\C-et" + "*Key to which the `erlang-eunit-toggle-src-and-test-file-other-window' +function will be bound.") +(defvar erlang-eunit-compile-and-run-tests-key "\C-c\C-ek" + "*Key to which the `erlang-eunit-compile-and-run-tests' +function will be bound.") + +(defun erlang-eunit-add-key-bindings () + (erlang-eunit-ensure-keymap-for-key + erlang-eunit-toggle-src-and-test-file-other-window-key) + (local-set-key erlang-eunit-toggle-src-and-test-file-other-window-key + 'erlang-eunit-toggle-src-and-test-file-other-window) + (erlang-eunit-ensure-keymap-for-key + erlang-eunit-compile-and-run-tests-key) + (local-set-key erlang-eunit-compile-and-run-tests-key + 'erlang-eunit-compile-and-run-tests)) + +(defun erlang-eunit-ensure-keymap-for-key (key-seq) + (let ((prefix-keys (butlast (append key-seq nil))) + (prefix-seq "")) + (while prefix-keys + (setq prefix-seq (concat prefix-seq (make-string 1 (car prefix-keys)))) + (setq prefix-keys (cdr prefix-keys)) + (if (not (keymapp (lookup-key (current-local-map) prefix-seq))) + (local-set-key prefix-seq (make-sparse-keymap)))))) + +(add-hook 'erlang-mode-hook 'erlang-eunit-add-key-bindings) + + +(provide 'erlang-eunit) +;; erlang-eunit ends here diff -Nru erlang-13.b.1-dfsg/lib/tools/emacs/Makefile erlang-13.b.3-dfsg/lib/tools/emacs/Makefile --- erlang-13.b.1-dfsg/lib/tools/emacs/Makefile 2002-10-02 23:27:07.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/tools/emacs/Makefile 2009-11-20 13:33:43.000000000 +0000 @@ -38,6 +38,7 @@ EMACS_FILES= \ erlang-start \ + erlang-eunit \ erlang README_FILES= README @@ -46,6 +47,8 @@ ELC_FILES = $(EMACS_FILES:%=%.elc) +TEST_FILES = test.erl.indented test.erl.orig + # ---------------------------------------------------- # Targets # ---------------------------------------------------- @@ -65,7 +68,7 @@ release_spec: opt $(INSTALL_DIR) $(RELSYSDIR)/emacs - $(INSTALL_DATA) $(EL_FILES) $(README_FILES) \ + $(INSTALL_DATA) $(EL_FILES) $(README_FILES) $(TEST_FILES) \ $(RELSYSDIR)/emacs ifeq ($(DOCTYPE),pdf) diff -Nru erlang-13.b.1-dfsg/lib/tools/emacs/test.erl.indented erlang-13.b.3-dfsg/lib/tools/emacs/test.erl.indented --- erlang-13.b.1-dfsg/lib/tools/emacs/test.erl.indented 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/tools/emacs/test.erl.indented 2009-11-20 13:34:49.000000000 +0000 @@ -0,0 +1,536 @@ +%% -*- erlang -*- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +%%%------------------------------------------------------------------- +%%% File : test.erl +%%% Author : Dan Gudmundsson +%%% Description : Test emacs mode indention and font-locking +%%% this file is intentionally not indented. +%%% Copy the file and indent it and you should end up with test.erl.indented +%%% Created : 6 Oct 2009 by Dan Gudmundsson +%%%------------------------------------------------------------------- + +%% Start off with syntax highlighting you have to verify this by looking here +%% and see that the code looks alright + +-module(test). +-compile(export_all). + +%% Module attributes should be highlighted + +-export([t/1]). +-record(record1, {a, + b, + c + }). +-record(record2, { + a, + b + }). + +-define(MACRO_1, macro). +-define(MACRO_2(_), macro). + +-spec t(integer()) -> any(). + +-type ann() :: Var :: integer(). +-type ann2() :: Var :: + 'return' | 'return_white_spaces' | 'return_comments' + | 'text' | ann(). +-type paren() :: + (ann2()). +-type t1() :: atom(). +-type t2() :: [t1()]. +-type t3(Atom) :: integer(Atom). +-type t4() :: t3(foobar). +-type t5() :: {t1(), t3(foo)}. +-type t6() :: 1 | 2 | 3 | + 'foo' | 'bar'. +-type t7() :: []. +-type t71() :: [_]. +-type t8() :: {any(),none(),pid(),port(), + reference(),float()}. +-type t9() :: [1|2|3|foo|bar] | + list(a | b | c) | t71(). +-type t10() :: {1|2|3|foo|t9()} | {}. +-type t11() :: 1..2. +-type t13() :: maybe_improper_list(integer(), t11()). +-type t14() :: [erl_scan:foo() | + %% Should be highlighted + non_neg_integer() | nonempty_list() | + nonempty_improper_list() | nonempty_maybe_improper_list() | + %% Should not be highlighted + nonempty_() | nonlist() | + erl_scan:bar(34, 92) | t13() | m:f(integer() | <<_:_*16>>)]. +-type t15() :: {binary(),<<>>,<<_:34>>,<<_:_*42>>, + <<_:3,_:_*14>>,<<>>} | [<<>>|<<_:34>>|<<_:16>>| + <<_:3,_:_*1472>>|<<_:19,_:_*14>>| <<_:34>>| + <<_:34>>|<<_:34>>|<<_:34>>]. +-type t16() :: fun(). +-type t17() :: fun((...) -> paren()). +-type t18() :: fun(() -> t17() | t16()). +-type t19() :: fun((t18()) -> t16()) | + fun((nonempty_maybe_improper_list('integer', any())| + 1|2|3|a|b|<<_:3,_:_*14>>|integer()) -> + nonempty_maybe_improper_list('integer', any())| + 1|2|3|a|b|<<_:3,_:_*14>>|integer()). +-type t20() :: [t19(), ...]. +-type t21() :: tuple(). +-type t21(A) :: A. +-type t22() :: t21(integer()). +-type t23() :: #rec1{}. +-type t24() :: #rec2{a :: t23(), b :: [atom()]}. +-type t25() :: #rec3{f123 :: [t24() | + 1|2|3|4|a|b|c|d| + nonempty_maybe_improper_list(integer, any())]}. +-type t99() :: + {t2(),t4(),t5(),t6(),t7(),t8(),t10(),t14(), + t15(),t20(),t21(), t22(),t25()}. +-spec t1(FooBar :: t99()) -> t99(); + (t2()) -> t2(); + (t4()) -> t4() when is_subtype(t4(), t24); + (t23()) -> t23() when is_subtype(t23(), atom()), + is_subtype(t23(), t14()); + (t24()) -> t24() when is_subtype(t24(), atom()), + is_subtype(t24(), t14()), + is_subtype(t24(), t4()). +-spec mod:t2() -> any(). +-opaque attributes_data() :: + [{'column', column()} | {'line', info_line()} | + {'text', string()}] | {line(),column()}. +-record(r,{ + f1 :: attributes_data(), + f222 = foo:bar(34, #rec3{}, 234234234423, + aassdsfsdfsdf, 2234242323) :: + [t24() | 1|2|3|4|a|b|c|d| + nonempty_maybe_improper_list(integer, any())], + f333 :: [t24() | 1|2|3|4|a|b|c|d| + nonempty_maybe_improper_list(integer, any())], + f3 = x:y(), + f4 = x:z() :: t99(), + f17 :: 'undefined', + f18 :: 1 | 2 | 'undefined', + f19 = 3 :: integer()|undefined, + f5 = 3 :: undefined|integer()}). + + + +highlighting(X) % Function definitions should be highlighted + when is_integer(X) -> % and so should `when' and `is_integer' be + %% Highlighting + %% Various characters (we keep an `atom' after to see that highlighting ends) + $a,atom, % Characters should be marked + "string",atom, % and strings + 'asdasd',atom, % quote should be atoms?? + 'VaV',atom, + 'aVa',atom, + '\'atom',atom, + 'atom\'',atom, + 'at\'om',atom, + '#1',atom, + + $", atom, % atom should be ok + $', atom, + + "string$", atom, "string$", atom, % currently buggy I know... + "string\$", atom, % workaround for bug above + + "char $in string", atom, + + $[, ${, $\\, atom, + ?MACRO_1, + ?MACRO_2(foo), + + %% Numerical constants + 16#DD, % AD Should not be highlighted + 32#dd, % AD Should not be highlighted + 32#ddAB, % AD Should not be highlighted + 32#101, % AD Should not be highlighted + 32#ABTR, % AD Should not be highlighted + + %% Variables + Variables = lists:foo(), + _Variables = lists:foo(), % AD + AppSpec = Xyz/2, + Module42 = Xyz(foo, bar), + Module:foo(), + _Module:foo(), % AD + FooÃ…Ã… = lists:reverse([tl,hd,tl,hd]), % AD Should highlight FooÃ…Ã… + _FooÃ…Ã… = 42, % AD Should highlight _FooÃ…Ã… + + %% Bifs + erlang:registered(), + registered(), + hd(tl(tl(hd([a,b,c])))), + erlang:anything(lists), + %% Guards + is_atom(foo), is_float(2.3), is_integer(32), is_number(4323.3), + is_function(Fun), is_pid(self()), + not_a_guard:is_list([]), + %% Other Types + + atom, % not (currently) hightlighted + 234234, + 234.43, + + [list, are, not, higlighted], + {nor, is, tuple}, + ok. + +%%% +%%% Indentation +%%% + +%%% Left + +%% Indented + + % Right + + +indent_basics(X, Y, Z) + when X > 42, + Z < 13; + Y =:= 4711 -> + %% comments + % right comments + case lists:filter(fun(_, AlongName, + B, + C) -> + true + end, + [a,v,b]) + of + [] -> + Y = 5 * 43, + ok; + [_|_] -> + Y = 5 * 43, + ok + end, + Y, + %% List, tuples and binaries + [a, + b, c + ], + [ a, + b, c + ], + + [ + a, + b + ], + {a, + b,c + }, + { a, + b,c + }, + + { + a, + b + }, + + <<1:8, + 2:8 + >>, + << + 1:8, + 2:8 + >>, + << 1:8, + 2:8 + >>, + + (a, + b, + c + ), + + ( a, + b, + c + ), + + + ( + a, + b, + c + ), + + + ok; +indent_basics(Xlongname, + #struct{a=Foo, + b=Bar}, + [X| + Y]) -> + testing_next_clause, + ok; +indent_basics( % AD added clause + X, % not sure how this should look + Y, + Z) + when + X < 42, Z > 13; + Y =:= 4711 -> + foo; +indent_basics(X, Y, Z) when % AD added clause + X < 42, Z > 13; % testing when indentation + Y =:= 4711 -> + foo; +indent_basics(X, Y, Z) % AD added clause + when % testing when indentation + X < 42, Z > 13; % unsure about this one + Y =:= 4711 -> + foo. + + +indent_icr(Z) -> % icr = if case receive + %% If + if Z >= 0 -> + X = 43 div 4, + foo(X); + Z =< 10 -> + X = 43 div 4, + foo(X); + Z == 5 orelse + Z == 7 -> + X = 43 div 4, + foo(X); + true -> + if_works + end, + %% Case + case {Z, foo, bar} of + {Z,_,_} -> + X = 43 div 4, + foo(X); + {Z,_,_} when + Z =:= 42 -> % AD line should be indented as a when + X = 43 div 4, + foo(X); + {Z,_,_} + when Z < 10 -> % AD when should be indented + X = 43 div 4, + foo(X); + {Z,_,_} + when % AD when should be indented + Z < 10 % and the guards should follow when + andalso % unsure about how though + true -> + X = 43 div 4, + foo(X) + end, + %% begin + begin + sune, + X = 74234 + foo(8456) + + 345 div 43, + ok + end, + + + %% receive + receive + {Z,_,_} -> + X = 43 div 4, + foo(X); + Z -> + X = 43 div 4, + foo(X) + end, + receive + {Z,_,_} -> + X = 43 div 4, + foo(X); + Z % AD added clause + when Z =:= 1 -> % This line should be indented by 2 + X = 43 div 4, + foo(X); + Z when % AD added clause + Z =:= 2 -> % This line should be indented by 2 + X = 43 div 4, + foo(X); + Z -> + X = 43 div 4, + foo(X) + after infinity -> + foo(X), + asd(X), + 5*43 + end, + receive + after 10 -> + foo(X), + asd(X), + 5*43 + end, + ok. + +indent_fun() -> + %% Changed fun to one indention level + Var = spawn(fun(X) + when X == 2; + X > 10 -> + hello, + case Hello() of + true when is_atom(X) -> + foo; + false -> + bar + end; + (Foo) when is_atom(Foo), + is_integer(X) -> + X = 6* 45, + Y = true andalso + kalle + end), + ok. + +indent_try_catch() -> + try + io:format(stdout, "Parsing file ~s, ", + [St0#leex.xfile]), + {ok,Line3,REAs,Actions,St3} = + parse_rules(Xfile, Line2, Macs, St2) + catch + exit:{badarg,R} -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R); + error:R % AD added clause + when R =:= 42 -> % when should be indented + foo(R); + error:R % AD added clause + when % when should be indented + R =:= 42 -> % but unsure about this (maybe 2 more) + foo(R); + error:R when % AD added clause + R =:= foo -> % line should be 2 indented (works) + foo(R); + error:R -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R) + after + foo('after'), + file:close(Xfile) + end; +indent_try_catch() -> + try foo(bar) of + X when true andalso + kalle -> + io:format(stdout, "Parsing file ~s, ", + [St0#leex.xfile]), + {ok,Line3,REAs,Actions,St3} = + parse_rules(Xfile, Line2, Macs, St2); + X % AD added clause + when false andalso % when should be 2 indented + bengt -> + gurka(); + X when % AD added clause + false andalso % line should be 2 indented + not bengt -> + gurka(); + X -> + io:format(stdout, "Parsing file ~s, ", + [St0#leex.xfile]), + {ok,Line3,REAs,Actions,St3} = + parse_rules(Xfile, Line2, Macs, St2) + catch + exit:{badarg,R} -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R); + error:R -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R) + after + foo('after'), + file:close(Xfile), + bar(with_long_arg, + with_second_arg) + end; +indent_try_catch() -> + try foo() + after + foo(), + bar(with_long_arg, + with_second_arg) + end. + +indent_catch() -> + D = B + + float(43.1), + + B = catch oskar(X), + + A = catch (baz + + bax), + catch foo(), + + C = catch B + + float(43.1), + + case catch (X) of + A -> + B + end, + try sune of + _ -> foo + catch _:_ -> baf + end. + +indent_binary() -> + X = lists:foldr(fun(M) -> + <> + end, [], A), + A = <>, + B. + + +indent_comprehensions() -> + %% I don't have a good idea how we want to handle this + %% but they are here to show how they are indented today. + Result1 = [X || + #record{a=X} <- lists:seq(1, 10), + true = (X rem 2) + ], + Result2 = [X || <> <= <<0:512>>, + true = (X rem 2) + ], + + Binary1 = << <> || + #record{a=X} <- lists:seq(1, 10), + true = (X rem 2) + >>, + + Binary2 = << <> || <> <= <<0:512>>, + true = (X rem 2) + >>, + ok. diff -Nru erlang-13.b.1-dfsg/lib/tools/emacs/test.erl.orig erlang-13.b.3-dfsg/lib/tools/emacs/test.erl.orig --- erlang-13.b.1-dfsg/lib/tools/emacs/test.erl.orig 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/tools/emacs/test.erl.orig 2009-11-20 13:34:49.000000000 +0000 @@ -0,0 +1,536 @@ +%% -*- erlang -*- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +%%%------------------------------------------------------------------- +%%% File : test.erl +%%% Author : Dan Gudmundsson +%%% Description : Test emacs mode indention and font-locking +%%% this file is intentionally not indented. +%%% Copy the file and indent it and you should end up with test.erl.indented +%%% Created : 6 Oct 2009 by Dan Gudmundsson +%%%------------------------------------------------------------------- + +%% Start off with syntax highlighting you have to verify this by looking here +%% and see that the code looks alright + +-module(test). +-compile(export_all). + +%% Module attributes should be highlighted + +-export([t/1]). +-record(record1, {a, + b, + c +}). +-record(record2, { + a, + b + }). + +-define(MACRO_1, macro). +-define(MACRO_2(_), macro). + +-spec t(integer()) -> any(). + +-type ann() :: Var :: integer(). +-type ann2() :: Var :: + 'return' | 'return_white_spaces' | 'return_comments' + | 'text' | ann(). +-type paren() :: + (ann2()). +-type t1() :: atom(). +-type t2() :: [t1()]. +-type t3(Atom) :: integer(Atom). +-type t4() :: t3(foobar). +-type t5() :: {t1(), t3(foo)}. +-type t6() :: 1 | 2 | 3 | + 'foo' | 'bar'. +-type t7() :: []. +-type t71() :: [_]. +-type t8() :: {any(),none(),pid(),port(), + reference(),float()}. +-type t9() :: [1|2|3|foo|bar] | + list(a | b | c) | t71(). +-type t10() :: {1|2|3|foo|t9()} | {}. +-type t11() :: 1..2. +-type t13() :: maybe_improper_list(integer(), t11()). +-type t14() :: [erl_scan:foo() | + %% Should be highlighted + non_neg_integer() | nonempty_list() | + nonempty_improper_list() | nonempty_maybe_improper_list() | + %% Should not be highlighted + nonempty_() | nonlist() | +erl_scan:bar(34, 92) | t13() | m:f(integer() | <<_:_*16>>)]. +-type t15() :: {binary(),<<>>,<<_:34>>,<<_:_*42>>, + <<_:3,_:_*14>>,<<>>} | [<<>>|<<_:34>>|<<_:16>>| +<<_:3,_:_*1472>>|<<_:19,_:_*14>>| <<_:34>>| +<<_:34>>|<<_:34>>|<<_:34>>]. +-type t16() :: fun(). +-type t17() :: fun((...) -> paren()). +-type t18() :: fun(() -> t17() | t16()). +-type t19() :: fun((t18()) -> t16()) | + fun((nonempty_maybe_improper_list('integer', any())| + 1|2|3|a|b|<<_:3,_:_*14>>|integer()) -> +nonempty_maybe_improper_list('integer', any())| +1|2|3|a|b|<<_:3,_:_*14>>|integer()). +-type t20() :: [t19(), ...]. +-type t21() :: tuple(). +-type t21(A) :: A. +-type t22() :: t21(integer()). +-type t23() :: #rec1{}. +-type t24() :: #rec2{a :: t23(), b :: [atom()]}. +-type t25() :: #rec3{f123 :: [t24() | +1|2|3|4|a|b|c|d| +nonempty_maybe_improper_list(integer, any())]}. +-type t99() :: +{t2(),t4(),t5(),t6(),t7(),t8(),t10(),t14(), +t15(),t20(),t21(), t22(),t25()}. +-spec t1(FooBar :: t99()) -> t99(); +(t2()) -> t2(); + (t4()) -> t4() when is_subtype(t4(), t24); +(t23()) -> t23() when is_subtype(t23(), atom()), + is_subtype(t23(), t14()); +(t24()) -> t24() when is_subtype(t24(), atom()), + is_subtype(t24(), t14()), + is_subtype(t24(), t4()). +-spec mod:t2() -> any(). +-opaque attributes_data() :: +[{'column', column()} | {'line', info_line()} | + {'text', string()}] | {line(),column()}. +-record(r,{ + f1 :: attributes_data(), +f222 = foo:bar(34, #rec3{}, 234234234423, + aassdsfsdfsdf, 2234242323) :: +[t24() | 1|2|3|4|a|b|c|d| + nonempty_maybe_improper_list(integer, any())], +f333 :: [t24() | 1|2|3|4|a|b|c|d| + nonempty_maybe_improper_list(integer, any())], +f3 = x:y(), +f4 = x:z() :: t99(), +f17 :: 'undefined', +f18 :: 1 | 2 | 'undefined', +f19 = 3 :: integer()|undefined, +f5 = 3 :: undefined|integer()}). + + + +highlighting(X) % Function definitions should be highlighted + when is_integer(X) -> % and so should `when' and `is_integer' be + %% Highlighting + %% Various characters (we keep an `atom' after to see that highlighting ends) + $a,atom, % Characters should be marked + "string",atom, % and strings + 'asdasd',atom, % quote should be atoms?? + 'VaV',atom, + 'aVa',atom, + '\'atom',atom, + 'atom\'',atom, + 'at\'om',atom, + '#1',atom, + + $", atom, % atom should be ok + $', atom, + + "string$", atom, "string$", atom, % currently buggy I know... + "string\$", atom, % workaround for bug above + + "char $in string", atom, + + $[, ${, $\\, atom, + ?MACRO_1, + ?MACRO_2(foo), + + %% Numerical constants + 16#DD, % AD Should not be highlighted + 32#dd, % AD Should not be highlighted + 32#ddAB, % AD Should not be highlighted + 32#101, % AD Should not be highlighted + 32#ABTR, % AD Should not be highlighted + + %% Variables + Variables = lists:foo(), + _Variables = lists:foo(), % AD + AppSpec = Xyz/2, + Module42 = Xyz(foo, bar), + Module:foo(), + _Module:foo(), % AD + FooÃ…Ã… = lists:reverse([tl,hd,tl,hd]), % AD Should highlight FooÃ…Ã… + _FooÃ…Ã… = 42, % AD Should highlight _FooÃ…Ã… + + %% Bifs + erlang:registered(), + registered(), + hd(tl(tl(hd([a,b,c])))), + erlang:anything(lists), + %% Guards + is_atom(foo), is_float(2.3), is_integer(32), is_number(4323.3), + is_function(Fun), is_pid(self()), + not_a_guard:is_list([]), + %% Other Types + + atom, % not (currently) hightlighted + 234234, + 234.43, + + [list, are, not, higlighted], + {nor, is, tuple}, + ok. + +%%% +%%% Indentation +%%% + +%%% Left + +%% Indented + +% Right + + +indent_basics(X, Y, Z) + when X > 42, +Z < 13; +Y =:= 4711 -> + %% comments + % right comments + case lists:filter(fun(_, AlongName, + B, + C) -> + true + end, + [a,v,b]) + of + [] -> + Y = 5 * 43, + ok; + [_|_] -> + Y = 5 * 43, + ok + end, + Y, + %% List, tuples and binaries + [a, + b, c + ], + [ a, + b, c + ], + + [ + a, + b +], + {a, + b,c + }, + { a, + b,c + }, + + { + a, + b + }, + +<<1:8, + 2:8 + >>, + << + 1:8, + 2:8 + >>, + << 1:8, + 2:8 + >>, + + (a, + b, + c + ), + + ( a, + b, + c + ), + + + ( + a, + b, + c + ), + + + ok; +indent_basics(Xlongname, + #struct{a=Foo, + b=Bar}, + [X| + Y]) -> + testing_next_clause, + ok; +indent_basics( % AD added clause + X, % not sure how this should look + Y, + Z) + when + X < 42, Z > 13; + Y =:= 4711 -> + foo; +indent_basics(X, Y, Z) when % AD added clause + X < 42, Z > 13; % testing when indentation + Y =:= 4711 -> + foo; +indent_basics(X, Y, Z) % AD added clause + when % testing when indentation + X < 42, Z > 13; % unsure about this one + Y =:= 4711 -> + foo. + + +indent_icr(Z) -> % icr = if case receive + %% If + if Z >= 0 -> + X = 43 div 4, + foo(X); + Z =< 10 -> + X = 43 div 4, + foo(X); + Z == 5 orelse + Z == 7 -> + X = 43 div 4, + foo(X); + true -> + if_works + end, + %% Case + case {Z, foo, bar} of + {Z,_,_} -> + X = 43 div 4, + foo(X); + {Z,_,_} when + Z =:= 42 -> % AD line should be indented as a when + X = 43 div 4, + foo(X); + {Z,_,_} + when Z < 10 -> % AD when should be indented + X = 43 div 4, + foo(X); + {Z,_,_} + when % AD when should be indented + Z < 10 % and the guards should follow when + andalso % unsure about how though + true -> + X = 43 div 4, + foo(X) + end, + %% begin + begin + sune, + X = 74234 + foo(8456) + + 345 div 43, + ok + end, + + + %% receive + receive + {Z,_,_} -> + X = 43 div 4, + foo(X); + Z -> + X = 43 div 4, + foo(X) + end, + receive + {Z,_,_} -> + X = 43 div 4, + foo(X); + Z % AD added clause + when Z =:= 1 -> % This line should be indented by 2 + X = 43 div 4, + foo(X); + Z when % AD added clause + Z =:= 2 -> % This line should be indented by 2 + X = 43 div 4, + foo(X); + Z -> + X = 43 div 4, + foo(X) + after infinity -> + foo(X), + asd(X), + 5*43 + end, + receive + after 10 -> + foo(X), + asd(X), + 5*43 + end, + ok. + +indent_fun() -> + %% Changed fun to one indention level +Var = spawn(fun(X) + when X == 2; + X > 10 -> + hello, + case Hello() of + true when is_atom(X) -> + foo; + false -> + bar + end; + (Foo) when is_atom(Foo), + is_integer(X) -> + X = 6* 45, + Y = true andalso + kalle + end), + ok. + +indent_try_catch() -> + try + io:format(stdout, "Parsing file ~s, ", + [St0#leex.xfile]), + {ok,Line3,REAs,Actions,St3} = + parse_rules(Xfile, Line2, Macs, St2) + catch + exit:{badarg,R} -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R); + error:R % AD added clause + when R =:= 42 -> % when should be indented + foo(R); + error:R % AD added clause + when % when should be indented + R =:= 42 -> % but unsure about this (maybe 2 more) + foo(R); + error:R when % AD added clause + R =:= foo -> % line should be 2 indented (works) + foo(R); + error:R -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R) + after + foo('after'), + file:close(Xfile) + end; +indent_try_catch() -> + try foo(bar) of + X when true andalso + kalle -> + io:format(stdout, "Parsing file ~s, ", + [St0#leex.xfile]), + {ok,Line3,REAs,Actions,St3} = + parse_rules(Xfile, Line2, Macs, St2); + X % AD added clause + when false andalso % when should be 2 indented + bengt -> + gurka(); + X when % AD added clause + false andalso % line should be 2 indented + not bengt -> + gurka(); + X -> + io:format(stdout, "Parsing file ~s, ", + [St0#leex.xfile]), + {ok,Line3,REAs,Actions,St3} = + parse_rules(Xfile, Line2, Macs, St2) + catch + exit:{badarg,R} -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R); + error:R -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R) + after + foo('after'), + file:close(Xfile), + bar(with_long_arg, + with_second_arg) + end; + indent_try_catch() -> + try foo() + after + foo(), + bar(with_long_arg, + with_second_arg) + end. + +indent_catch() -> + D = B + + float(43.1), + + B = catch oskar(X), + + A = catch (baz + + bax), + catch foo(), + + C = catch B + + float(43.1), + + case catch (X) of + A -> + B + end, + try sune of + _ -> foo + catch _:_ -> baf + end. + +indent_binary() -> + X = lists:foldr(fun(M) -> + <> + end, [], A), + A = <>, + B. + + +indent_comprehensions() -> +%% I don't have a good idea how we want to handle this +%% but they are here to show how they are indented today. +Result1 = [X || + #record{a=X} <- lists:seq(1, 10), + true = (X rem 2) + ], +Result2 = [X || <> <= <<0:512>>, + true = (X rem 2) + ], + +Binary1 = << <> || + #record{a=X} <- lists:seq(1, 10), + true = (X rem 2) + >>, + +Binary2 = << <> || <> <= <<0:512>>, + true = (X rem 2) + >>, +ok. diff -Nru erlang-13.b.1-dfsg/lib/tools/src/cover.erl erlang-13.b.3-dfsg/lib/tools/src/cover.erl --- erlang-13.b.1-dfsg/lib/tools/src/cover.erl 2009-04-16 10:25:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/tools/src/cover.erl 2009-11-20 13:34:10.000000000 +0000 @@ -94,6 +94,7 @@ arity, % int() clause, % int() lines, % [int()] + no_bump_lines, % [int()] depth, % int() is_guard=false % boolean }). @@ -104,6 +105,15 @@ -define(TAG, cover_compiled). -define(SERVER, cover_server). +%% Line doesn't matter. +-define(BLOCK(Expr), {block,0,[Expr]}). +-define(BLOCK1(Expr), + if + element(1, Expr) =:= block -> + Expr; + true -> ?BLOCK(Expr) + end). + -include_lib("stdlib/include/ms_transform.hrl"). %%%---------------------------------------------------------------------- @@ -905,12 +915,15 @@ end. load_compiled([{Module,File,Binary,InitialTable}|Compiled],Acc) -> + %% Make sure the #bump{} records are available *before* the + %% module is loaded. + insert_initial_data(InitialTable), NewAcc = case code:load_binary(Module, ?TAG, Binary) of {module,Module} -> - insert_initial_data(InitialTable), add_compiled(Module, File, Acc); _ -> + do_clear(Module), Acc end, load_compiled(Compiled,NewAcc); @@ -1213,7 +1226,6 @@ case compile:file(File, Options) of {ok, Module, Binary} -> do_compile_beam(Module,Binary); - error -> error end. @@ -1323,28 +1335,20 @@ {ExpandedExprL,N2} = expand(ExprL, Vs, N), {ExpandedExprR,N3} = expand(ExprR, Vs, N2), LineL = element(2, ExpandedExprL), - LineR = element(2, ExpandedExprR), {bool_switch(ExpandedExprL, - bool_switch(ExpandedExprR, - {atom,LineR,true}, - {atom,LineR,false}, - Vs, N3), + ExpandedExprR, {atom,LineL,false}, - Vs, N3 + 1), - N3 + 2}; + Vs, N3), + N3 + 1}; expand({op,_Line,'orelse',ExprL,ExprR}, Vs, N) -> {ExpandedExprL,N2} = expand(ExprL, Vs, N), {ExpandedExprR,N3} = expand(ExprR, Vs, N2), LineL = element(2, ExpandedExprL), - LineR = element(2, ExpandedExprR), {bool_switch(ExpandedExprL, {atom,LineL,true}, - bool_switch(ExpandedExprR, - {atom,LineR,true}, - {atom,LineR,false}, - Vs, N3), - Vs, N3 + 1), - N3 + 2}; + ExpandedExprR, + Vs, N3), + N3 + 1}; expand(T, Vs, N) when is_tuple(T) -> {TL,N2} = expand(tuple_to_list(T), Vs, N), {list_to_tuple(TL),N2}; @@ -1402,8 +1406,9 @@ arity=Arity, clause=1, lines=[], + no_bump_lines=[], depth=1}, - {MungedClauses, Vars3} = munge_clauses(Clauses, Vars2, []), + {MungedClauses, Vars3} = munge_clauses(Clauses, Vars2), {{function,Line,Function,Arity,MungedClauses},Vars3,on}; munge(Form={attribute,_,file,{MainFile,_}},Vars,MainFile,_Switch) -> {Form,Vars,on}; % Switch on tranformation! @@ -1415,43 +1420,63 @@ munge(Form,Vars,_MainFile,Switch) -> % Other attributes and skipped includes. {Form,Vars,Switch}. -munge_clauses([{clause,Line,Pattern,Guards,Body}|Clauses], Vars, MClauses) -> +munge_clauses(Clauses, Vars) -> + munge_clauses(Clauses, Vars, Vars#vars.lines, []). + +munge_clauses([Clause|Clauses], Vars, Lines, MClauses) -> + {clause,Line,Pattern,Guards,Body} = Clause, {MungedGuards, _Vars} = munge_exprs(Guards, Vars#vars{is_guard=true},[]), case Vars#vars.depth of 1 -> % function clause - {MungedBody, Vars2} = munge_body(Body, Vars#vars{depth=2}, []), + {MungedBody, Vars2} = munge_body(Body, Vars#vars{depth=2}), ClauseInfo = {Vars2#vars.module, Vars2#vars.function, Vars2#vars.arity, Vars2#vars.clause, - length(Vars2#vars.lines)}, + length(Vars2#vars.lines)}, % Not used? InitInfo = [ClauseInfo | Vars2#vars.init_info], Vars3 = Vars2#vars{init_info=InitInfo, clause=(Vars2#vars.clause)+1, lines=[], + no_bump_lines=[], depth=1}, - munge_clauses(Clauses, Vars3, + NewBumps = Vars2#vars.lines, + NewLines = NewBumps ++ Lines, + munge_clauses(Clauses, Vars3, NewLines, [{clause,Line,Pattern,MungedGuards,MungedBody}| MClauses]); - 2 -> % receive-, case- or if clause - {MungedBody, Vars2} = munge_body(Body, Vars, []), - munge_clauses(Clauses, Vars2, + 2 -> % receive-, case-, if-, or try-clause + Lines0 = Vars#vars.lines, + {MungedBody, Vars2} = munge_body(Body, Vars), + NewBumps = new_bumps(Vars2, Vars), + NewLines = NewBumps ++ Lines, + munge_clauses(Clauses, Vars2#vars{lines=Lines0}, + NewLines, [{clause,Line,Pattern,MungedGuards,MungedBody}| MClauses]) end; -munge_clauses([], Vars, MungedClauses) -> - {reverse(MungedClauses), Vars}. +munge_clauses([], Vars, Lines, MungedClauses) -> + {reverse(MungedClauses), Vars#vars{lines = Lines}}. + +munge_body(Expr, Vars) -> + munge_body(Expr, Vars, [], []). -munge_body([Expr|Body], Vars, MungedBody) -> +munge_body([Expr|Body], Vars, MungedBody, LastExprBumpLines) -> %% Here is the place to add a call to cover:bump/6! Line = element(2, Expr), Lines = Vars#vars.lines, case lists:member(Line,Lines) of - true -> % already a bump at this line! + true -> % already a bump at this line {MungedExpr, Vars2} = munge_expr(Expr, Vars), - munge_body(Body, Vars2, [MungedExpr|MungedBody]); + NewBumps = new_bumps(Vars2, Vars), + NoBumpLines = [Line|Vars#vars.no_bump_lines], + Vars3 = Vars2#vars{no_bump_lines = NoBumpLines}, + MungedBody1 = + maybe_fix_last_expr(MungedBody, Vars3, LastExprBumpLines), + MungedExprs1 = [MungedExpr|MungedBody1], + munge_body(Body, Vars3, MungedExprs1, NewBumps); false -> ets:insert(?COVER_TABLE, {#bump{module = Vars#vars.module, function = Vars#vars.function, @@ -1459,15 +1484,7 @@ clause = Vars#vars.clause, line = Line}, 0}), - Bump={call,0,{remote,0,{atom,0,ets},{atom,0,update_counter}}, - [{atom,0,?COVER_TABLE}, - {tuple,0,[{atom,0,?BUMP_REC_NAME}, - {atom,0,Vars#vars.module}, - {atom,0,Vars#vars.function}, - {integer,0,Vars#vars.arity}, - {integer,0,Vars#vars.clause}, - {integer,0,Line}]}, - {integer,0,1}]}, + Bump = bump_call(Vars, Line), % Bump = {call, 0, {remote, 0, {atom,0,cover}, {atom,0,bump}}, % [{atom, 0, Vars#vars.module}, % {atom, 0, Vars#vars.function}, @@ -1475,13 +1492,147 @@ % {integer, 0, Vars#vars.clause}, % {integer, 0, Line}]}, Lines2 = [Line|Lines], - {MungedExpr, Vars2} = munge_expr(Expr, Vars#vars{lines=Lines2}), - munge_body(Body, Vars2, [MungedExpr,Bump|MungedBody]) + NewBumps = new_bumps(Vars2, Vars), + NoBumpLines = subtract(Vars2#vars.no_bump_lines, NewBumps), + Vars3 = Vars2#vars{no_bump_lines = NoBumpLines}, + MungedBody1 = + maybe_fix_last_expr(MungedBody, Vars3, LastExprBumpLines), + MungedExprs1 = [MungedExpr,Bump|MungedBody1], + munge_body(Body, Vars3, MungedExprs1, NewBumps) end; -munge_body([], Vars, MungedBody) -> +munge_body([], Vars, MungedBody, _LastExprBumpLines) -> {reverse(MungedBody), Vars}. +%%% Fix last expression (OTP-8188). A typical example: +%%% +%%% 3: case X of +%%% 4: 1 -> a; % Bump line 5 after "a" has been evaluated! +%%% 5: 2 -> b; 3 -> c end, F() +%%% +%%% Line 5 wasn't bumped just before "F()" since it was already bumped +%%% before "b" (and before "c") (one mustn't bump a line more than +%%% once in a single "evaluation"). The expression "case X ... end" is +%%% now traversed again ("fixed"), this time adding bumps of line 5 +%%% where appropriate, in this case when X matches 1. +%%% +%%% This doesn't solve all problems with expressions on the same line, +%%% though. 'case' and 'try' are tricky. An example: +%%% +%%% 7: case case X of 1 -> foo(); % ? +%%% 8: 2 -> bar() end of a -> 1; +%%% 9: b -> 2 end. +%%% +%%% If X matches 1 and foo() evaluates to a then line 8 should be +%%% bumped, but not if foo() evaluates to b. In other words, line 8 +%%% cannot be bumped after "foo()" on line 7, so one has to bump line +%%% 8 before "begin 1 end". But if X matches 2 and bar evaluates to a +%%% then line 8 would be bumped twice (there has to be a bump before +%%% "bar()". It is like one would have to have two copies of the inner +%%% clauses, one for each outer clause. Maybe the munging should be +%%% done on some of the compiler's "lower level" format. +%%% +%%% 'fun' is also problematic since a bump inside the body "shadows" +%%% the rest of the line. + +maybe_fix_last_expr(MungedExprs, Vars, LastExprBumpLines) -> + case last_expr_needs_fixing(Vars, LastExprBumpLines) of + {yes, Line} -> + fix_last_expr(MungedExprs, Line, Vars); + no -> + MungedExprs + end. + +last_expr_needs_fixing(Vars, LastExprBumpLines) -> + case common_elems(Vars#vars.no_bump_lines, LastExprBumpLines) of + [Line] -> {yes, Line}; + _ -> no + end. + +fix_last_expr([MungedExpr|MungedExprs], Line, Vars) -> + %% No need to update ?COVER_TABLE. + Bump = bump_call(Vars, Line), + [fix_expr(MungedExpr, Line, Bump)|MungedExprs]. + +fix_expr({'if',L,Clauses}, Line, Bump) -> + FixedClauses = fix_clauses(Clauses, Line, Bump), + {'if',L,FixedClauses}; +fix_expr({'case',L,Expr,Clauses}, Line, Bump) -> + FixedExpr = fix_expr(Expr, Line, Bump), + FixedClauses = fix_clauses(Clauses, Line, Bump), + {'case',L,FixedExpr,FixedClauses}; +fix_expr({'receive',L,Clauses}, Line, Bump) -> + FixedClauses = fix_clauses(Clauses, Line, Bump), + {'receive',L,FixedClauses}; +fix_expr({'receive',L,Clauses,Expr,Body}, Line, Bump) -> + FixedClauses = fix_clauses(Clauses, Line, Bump), + FixedExpr = fix_expr(Expr, Line, Bump), + FixedBody = fix_expr(Body, Line, Bump), + {'receive',L,FixedClauses,FixedExpr,FixedBody}; +fix_expr({'try',L,Exprs,Clauses,CatchClauses,After}, Line, Bump) -> + FixedExprs = fix_expr(Exprs, Line, Bump), + FixedClauses = fix_clauses(Clauses, Line, Bump), + FixedCatchClauses = fix_clauses(CatchClauses, Line, Bump), + FixedAfter = fix_expr(After, Line, Bump), + {'try',L,FixedExprs,FixedClauses,FixedCatchClauses,FixedAfter}; +fix_expr([E | Es], Line, Bump) -> + [fix_expr(E, Line, Bump) | fix_expr(Es, Line, Bump)]; +fix_expr(T, Line, Bump) when is_tuple(T) -> + list_to_tuple(fix_expr(tuple_to_list(T), Line, Bump)); +fix_expr(E, _Line, _Bump) -> + E. + +fix_clauses(Cs, Line, Bump) -> + case bumps_line(lists:last(Cs), Line) of + true -> + fix_cls(Cs, Line, Bump); + false -> + Cs + end. + +fix_cls([], _Line, _Bump) -> + []; +fix_cls([Cl | Cls], Line, Bump) -> + case bumps_line(Cl, Line) of + true -> + [fix_expr(C, Line, Bump) || C <- [Cl | Cls]]; + false -> + {clause,CL,P,G,Body} = Cl, + UniqueVarName = list_to_atom(lists:concat(["$cover$ ",Line])), + V = {var,0,UniqueVarName}, + [Last|Rest] = lists:reverse(Body), + Body1 = lists:reverse(Rest, [{match,0,V,Last},Bump,V]), + [{clause,CL,P,G,Body1} | fix_cls(Cls, Line, Bump)] + end. + +bumps_line(E, L) -> + try bumps_line1(E, L) catch true -> true end. + +bumps_line1({call,0,{remote,0,{atom,0,ets},{atom,0,update_counter}}, + [{atom,0,?COVER_TABLE},{tuple,0,[_,_,_,_,_,{integer,0,Line}]},_]}, + Line) -> + throw(true); +bumps_line1([E | Es], Line) -> + bumps_line1(E, Line), + bumps_line1(Es, Line); +bumps_line1(T, Line) when is_tuple(T) -> + bumps_line1(tuple_to_list(T), Line); +bumps_line1(_, _) -> + false. + +%%% End of fix of last expression. + +bump_call(Vars, Line) -> + {call,0,{remote,0,{atom,0,ets},{atom,0,update_counter}}, + [{atom,0,?COVER_TABLE}, + {tuple,0,[{atom,0,?BUMP_REC_NAME}, + {atom,0,Vars#vars.module}, + {atom,0,Vars#vars.function}, + {integer,0,Vars#vars.arity}, + {integer,0,Vars#vars.clause}, + {integer,0,Line}]}, + {integer,0,1}]}. + munge_expr({match,Line,ExprL,ExprR}, Vars) -> {MungedExprL, Vars2} = munge_expr(ExprL, Vars), {MungedExprR, Vars3} = munge_expr(ExprR, Vars2), @@ -1529,34 +1680,42 @@ {MungedExpr, Vars2} = munge_expr(Expr, Vars), {MungedExprs, Vars3} = munge_exprs(Exprs, Vars2, []), {{call,Line,MungedExpr,MungedExprs}, Vars3}; -munge_expr({lc,Line,Expr,LC}, Vars) -> - {MungedExpr, Vars2} = munge_expr(Expr, Vars), - {MungedLC, Vars3} = munge_lc(LC, Vars2, []), - {{lc,Line,MungedExpr,MungedLC}, Vars3}; +munge_expr({lc,Line,Expr,Qs}, Vars) -> + {MungedExpr, Vars2} = munge_expr(?BLOCK1(Expr), Vars), + {MungedQs, Vars3} = munge_qualifiers(Qs, Vars2), + {{lc,Line,MungedExpr,MungedQs}, Vars3}; +munge_expr({bc,Line,Expr,Qs}, Vars) -> + {bin,BLine,[{bin_element,EL,Val,Sz,TSL}]} = Expr, + Expr2 = {bin,BLine,[{bin_element,EL,?BLOCK1(Val),Sz,TSL}]}, + {MungedExpr,Vars2} = munge_expr(Expr2, Vars), + {MungedQs, Vars3} = munge_qualifiers(Qs, Vars2), + {{bc,Line,MungedExpr,MungedQs}, Vars3}; munge_expr({block,Line,Body}, Vars) -> - {MungedBody, Vars2} = munge_body(Body, Vars, []), + {MungedBody, Vars2} = munge_body(Body, Vars), {{block,Line,MungedBody}, Vars2}; munge_expr({'if',Line,Clauses}, Vars) -> - {MungedClauses,Vars2} = munge_clauses(Clauses, Vars, []), + {MungedClauses,Vars2} = munge_clauses(Clauses, Vars), {{'if',Line,MungedClauses}, Vars2}; munge_expr({'case',Line,Expr,Clauses}, Vars) -> - {MungedExpr,Vars2} = munge_expr(Expr,Vars), - {MungedClauses,Vars3} = munge_clauses(Clauses, Vars2, []), + {MungedExpr,Vars2} = munge_expr(Expr, Vars), + {MungedClauses,Vars3} = munge_clauses(Clauses, Vars2), {{'case',Line,MungedExpr,MungedClauses}, Vars3}; munge_expr({'receive',Line,Clauses}, Vars) -> - {MungedClauses,Vars2} = munge_clauses(Clauses, Vars, []), + {MungedClauses,Vars2} = munge_clauses(Clauses, Vars), {{'receive',Line,MungedClauses}, Vars2}; munge_expr({'receive',Line,Clauses,Expr,Body}, Vars) -> - {MungedClauses,Vars2} = munge_clauses(Clauses, Vars, []), - {MungedExpr, Vars3} = munge_expr(Expr, Vars2), - {MungedBody, Vars4} = munge_body(Body, Vars3, []), + {MungedExpr, Vars1} = munge_expr(Expr, Vars), + {MungedClauses,Vars2} = munge_clauses(Clauses, Vars1), + {MungedBody,Vars3} = + munge_body(Body, Vars2#vars{lines = Vars1#vars.lines}), + Vars4 = Vars3#vars{lines = Vars2#vars.lines ++ new_bumps(Vars3, Vars2)}, {{'receive',Line,MungedClauses,MungedExpr,MungedBody}, Vars4}; -munge_expr({'try',Line,Exprs,Clauses,CatchClauses,After}, Vars) -> - {MungedExprs, Vars1} = munge_exprs(Exprs, Vars, []), - {MungedClauses, Vars2} = munge_clauses(Clauses, Vars1, []), - {MungedCatchClauses, Vars3} = munge_clauses(CatchClauses, Vars2, []), - {MungedAfter, Vars4} = munge_body(After, Vars3, []), - {{'try',Line,MungedExprs,MungedClauses,MungedCatchClauses,MungedAfter}, +munge_expr({'try',Line,Body,Clauses,CatchClauses,After}, Vars) -> + {MungedBody, Vars1} = munge_body(Body, Vars), + {MungedClauses, Vars2} = munge_clauses(Clauses, Vars1), + {MungedCatchClauses, Vars3} = munge_clauses(CatchClauses, Vars2), + {MungedAfter, Vars4} = munge_body(After, Vars3), + {{'try',Line,MungedBody,MungedClauses,MungedCatchClauses,MungedAfter}, Vars4}; %% Difference in abstract format after preprocessing: Funs get an extra %% element Extra. @@ -1564,13 +1723,20 @@ munge_expr({'fun',Line,{function,Name,Arity},_Extra}, Vars) -> {{'fun',Line,{function,Name,Arity}}, Vars}; munge_expr({'fun',Line,{clauses,Clauses},_Extra}, Vars) -> - {MungedClauses,Vars2}=munge_clauses(Clauses, Vars, []), + {MungedClauses,Vars2}=munge_clauses(Clauses, Vars), {{'fun',Line,{clauses,MungedClauses}}, Vars2}; munge_expr({'fun',Line,{clauses,Clauses}}, Vars) -> %% Only for Vsn=raw_abstract_v1 - {MungedClauses,Vars2}=munge_clauses(Clauses, Vars, []), + {MungedClauses,Vars2}=munge_clauses(Clauses, Vars), {{'fun',Line,{clauses,MungedClauses}}, Vars2}; -munge_expr(Form, Vars) -> % var|char|integer|float|string|atom|nil|bin|eof +munge_expr({bin,Line,BinElements}, Vars) -> + {MungedBinElements,Vars2} = munge_exprs(BinElements, Vars, []), + {{bin,Line,MungedBinElements}, Vars2}; +munge_expr({bin_element,Line,Value,Size,TypeSpecifierList}, Vars) -> + {MungedValue,Vars2} = munge_expr(Value, Vars), + {MungedSize,Vars3} = munge_expr(Size, Vars2), + {{bin_element,Line,MungedValue,MungedSize,TypeSpecifierList},Vars3}; +munge_expr(Form, Vars) -> % var|char|integer|float|string|atom|nil|eof|default {Form, Vars}. munge_exprs([Expr|Exprs], Vars, MungedExprs) when Vars#vars.is_guard=:=true, @@ -1583,14 +1749,42 @@ munge_exprs([], Vars, MungedExprs) -> {reverse(MungedExprs), Vars}. -munge_lc([{generate,Line,Pattern,Expr}|LC], Vars, MungedLC) -> +%% Every qualifier is decorated with a counter. +munge_qualifiers(Qualifiers, Vars) -> + munge_qs(Qualifiers, Vars, []). + +munge_qs([{generate,Line,Pattern,Expr}|Qs], Vars, MQs) -> + L = element(2, Expr), {MungedExpr, Vars2} = munge_expr(Expr, Vars), - munge_lc(LC, Vars2, [{generate,Line,Pattern,MungedExpr}|MungedLC]); -munge_lc([Expr|LC], Vars, MungedLC) -> + munge_qs1(Qs, L, {generate,Line,Pattern,MungedExpr}, Vars, Vars2, MQs); +munge_qs([{b_generate,Line,Pattern,Expr}|Qs], Vars, MQs) -> + L = element(2, Expr), + {MExpr, Vars2} = munge_expr(Expr, Vars), + munge_qs1(Qs, L, {b_generate,Line,Pattern,MExpr}, Vars, Vars2, MQs); +munge_qs([Expr|Qs], Vars, MQs) -> + L = element(2, Expr), {MungedExpr, Vars2} = munge_expr(Expr, Vars), - munge_lc(LC, Vars2, [MungedExpr|MungedLC]); -munge_lc([], Vars, MungedLC) -> - {reverse(MungedLC), Vars}. + munge_qs1(Qs, L, MungedExpr, Vars, Vars2, MQs); +munge_qs([], Vars, MQs) -> + {reverse(MQs), Vars}. + +munge_qs1(Qs, Line, NQ, Vars, Vars2, MQs) -> + case new_bumps(Vars2, Vars) of + [_] -> + munge_qs(Qs, Vars2, [NQ | MQs]); + _ -> + {MungedTrue, Vars3} = munge_expr(?BLOCK({atom,Line,true}), Vars2), + munge_qs(Qs, Vars3, [NQ, MungedTrue | MQs]) + end. + +new_bumps(#vars{lines = New}, #vars{lines = Old}) -> + subtract(New, Old). + +subtract(L1, L2) -> + [E || E <- L1, not lists:member(E, L2)]. + +common_elems(L1, L2) -> + [E || E <- L1, lists:member(E, L2)]. %%%--Analysis------------------------------------------------------------ diff -Nru erlang-13.b.1-dfsg/lib/tools/vsn.mk erlang-13.b.3-dfsg/lib/tools/vsn.mk --- erlang-13.b.1-dfsg/lib/tools/vsn.mk 2009-04-16 10:25:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/tools/vsn.mk 2009-11-20 13:33:52.000000000 +0000 @@ -16,4 +16,4 @@ # # %CopyrightEnd% -TOOLS_VSN = 2.6.4 +TOOLS_VSN = 2.6.5 diff -Nru erlang-13.b.1-dfsg/lib/tv/doc/src/book.xml erlang-13.b.3-dfsg/lib/tv/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/tv/doc/src/book.xml 2007-11-26 19:03:15.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tv/doc/src/book.xml 2009-11-20 13:33:58.000000000 +0000 @@ -1,29 +1,27 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - Table Visualizer Application (TV) + Table Visualizer (TV) @@ -31,15 +29,18 @@
    - Table Visualizer Application (TV) + Table Visualizer (TV) - + - + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/tv/doc/src/Makefile erlang-13.b.3-dfsg/lib/tv/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/tv/doc/src/Makefile 2009-03-12 12:23:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tv/doc/src/Makefile 2009-11-20 13:33:58.000000000 +0000 @@ -23,17 +23,20 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(TV_VSN) +APPLICATION=tv # ---------------------------------------------------- # Include dependency # ---------------------------------------------------- +ifndef DOCSUPPORT include make.dep +endif # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/tv-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -51,6 +54,10 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + GIF_FILES = tv_start.gif \ tv_start_mnesia.gif \ tv_start_system.gif \ @@ -82,6 +89,14 @@ MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + TEX_FILES_BOOK = \ $(BOOK_FILES:%.xml=%.tex) TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ @@ -98,6 +113,8 @@ $(TOP_PS_FILE): book.dvi ../../vsn.mk $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +endif + # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- @@ -110,6 +127,25 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ +ifdef DOCSUPPORT + +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ + +else + ifeq ($(DOCTYPE),pdf) docs: pdf else @@ -126,23 +162,39 @@ html: $(HTML_FILES) gifs +clean clean_docs clean_tex: + rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) + rm -f $(HTML_FILES) $(MAN3_FILES) + rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) + rm -f errs core *~ $(LATEX_CLEAN) +endif + man: $(MAN3_FILES) gifs: $(GIF_FILES:%=$(HTMLDIR)/%) debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + +else + ifeq ($(DOCTYPE),pdf) release_docs_spec: pdf $(INSTALL_DIR) $(RELEASE_PATH)/pdf @@ -163,5 +215,7 @@ endif endif +endif + release_spec: diff -Nru erlang-13.b.1-dfsg/lib/tv/doc/src/notes.xml erlang-13.b.3-dfsg/lib/tv/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/tv/doc/src/notes.xml 2009-03-12 12:24:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tv/doc/src/notes.xml 2009-11-20 13:34:20.000000000 +0000 @@ -26,9 +26,27 @@ nil nil nil + notes.xml

    This document describes the changes made to the TV application.

    +
    TV 2.1.4.4 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    +
    TV 2.1.4.3
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/tv/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/tv/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/tv/doc/src/part_notes.xml 2007-11-26 19:03:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tv/doc/src/part_notes.xml 2009-11-20 13:34:22.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + TV Release Notes @@ -36,7 +34,7 @@ opened in the tool, the content may be viewed in various levels of detail.

    - + diff -Nru erlang-13.b.1-dfsg/lib/tv/doc/src/part.xml erlang-13.b.3-dfsg/lib/tv/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/tv/doc/src/part.xml 2007-11-26 19:03:12.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tv/doc/src/part.xml 2009-11-20 13:33:55.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + TV User's Guide @@ -28,7 +26,7 @@ 1997-06-04 1.0.1 - part.sgml + part.xml

    The Table Visualizer application, TV, enables the user @@ -36,7 +34,7 @@ opened in the tool, the content may be viewed in various levels of detail.

    - +
    diff -Nru erlang-13.b.1-dfsg/lib/tv/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/tv/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/tv/doc/src/ref_man.xml 2007-11-26 19:03:12.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tv/doc/src/ref_man.xml 2009-11-20 13:33:55.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + TV Reference Manual @@ -36,7 +34,7 @@ opened in the tool, the content may be viewed in various levels of detail.

    - + diff -Nru erlang-13.b.1-dfsg/lib/tv/doc/src/table_visualizer_chapter.xml erlang-13.b.3-dfsg/lib/tv/doc/src/table_visualizer_chapter.xml --- erlang-13.b.1-dfsg/lib/tv/doc/src/table_visualizer_chapter.xml 2007-11-26 19:03:12.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tv/doc/src/table_visualizer_chapter.xml 2009-11-20 13:33:55.000000000 +0000 @@ -4,23 +4,21 @@
    - 1997 - 2007 - Ericsson AB, All Rights Reserved + 19972009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + The Table Visualizer @@ -31,7 +29,7 @@ 1998-01-19 C - table_visualizer.sgml + table_visualizer.xml

    The TV, TV, is a tool that enables the user to examine ETS and Mnesia tables on any (connected) node in the currently running Erlang @@ -85,7 +83,7 @@ the current node is shown. Each square in the grid is called a cell.

    - + The TV Main Window at startup.

    For each table, the following information is shown, in order: @@ -120,21 +118,21 @@ but the user may easily switch to a Mnesia table view, by choosing the Mnesia Tables option in the View menu:

    - + The TV Main Window, showing Mnesia tables.

    Normally, system tables (i.e., tables used by system applications) and unreadable tables are not shown. The menu option System Tables, in the Options menu, makes the system tables visible:

    - + The TV Main Window, showing readable user and system tables.

    Still unreadable tables are hidden, but the menu option Unreadable Tables, also in the Options menu, makes even those tables visible. It shall be noted that rows containing unreadable tables are shaded, using a grey colour:

    - + The TV Main Window, showing both readable and unreadable user and system tables.

    Once a table view has been opened, the user may choose how to view it: it may be sorted @@ -142,7 +140,7 @@ processes, or by the names of the owning processes. These sorting options are found in the Options menu.

    - + The TV Main Window, tables sorted by owner PID.
    @@ -155,7 +153,7 @@ all connected nodes will appear. Clicking on any of the nodes in the list will cause the main window to immediately show the tables residing on the specified node:

    - + The Connected Nodes window, and the TV Main Window, showing tables on the selected node.
    @@ -197,7 +195,7 @@ opened table will be shown. (As above, each square in the grid is called a cell.

    - + The Table Browser Window.

    The successful appearance of the Table Browser window means that an image of @@ -220,7 +218,7 @@ When an object has been deleted, the colour of the corresponding vertical button turns to black. The next time the table is polled, the object will be removed from the grid.

    - + The Table Browser Window, with new, changed, and deleted objects.

    Normally, new objects are placed at the end of the grid, while all other objects @@ -253,7 +251,7 @@ Options menu, which causes the Set Poll Interval window to appear.

    In the Set Poll Interval window the user selects whether manual or automatic polling shall be used, and, in the automatic polling case, the poll interval.

    - + The Set Poll Interval Window.

    It shall be noted that, in the case of a large table (or a slow computer/operating @@ -291,7 +289,7 @@ When the editing is finished, the OK button may be clicked, or 'Return' pressed. The TV will then try to insert the new object.

    - + The Record Editor (shown for a Mnesia table).

    To change an already existing object, the corresponding row, or a single cell @@ -314,7 +312,7 @@

    It shall also be noted that it may be more or less confusing to edit the table, depending on whether the table type is set, bag, or duplicate_bag, i.e., depending on whether or not objects having the - same key (or even duplicate objetcts) are allowed. Please study the ETS or Mnesia + same key (or even duplicate objects) are allowed. Please study the ETS or Mnesia manual pages, should confusion arise!

    @@ -327,13 +325,13 @@ Erlang term or regular expression may be entered, whereupon all objects containing (or consisting of) this term, or matching the regular expression, will be shown.

    - + The Search Object Window.

    In the search result list, by clicking on any object, the Table Browser will immediately scroll to the corresponding row in the table shown. This enables the user to in a very powerful way quickly find the objects he's interested in.

    - + The Search Object Window interworking with the Table Browser.
    @@ -345,7 +343,7 @@ rows and columns may be marked; an empty cell cannot be marked - on the contrary, by clicking on an empty cell, all marks are removed.

    Marks are indicated by a cyan blue colour.

    - + The TV Main Window: a row has been marked.

    When a row or a cell has been marked, the content will be shown in the content field, @@ -355,7 +353,7 @@ edit field, a pop-up content field will be shown, where the whole marked object may be viewed. The content of this pop-up field may be marked and copied to other windows; however, this field cannot be edited.

    - + The Table Browser: the pop-up content field.

    It shall be noted that the user may choose whether lists shall be shown as @@ -392,7 +390,7 @@ Table Info toolbar button). The information is printed in a separate window, with similar pieces of information grouped together on "flap cards" of their own. By clicking on a flap, the information on the corresponding card is made visible.

    - + The Table Information Window, showing information about a Mnesia table.

    The Table Information window may also be opened from the TV Main @@ -445,7 +443,7 @@ Lists As Lists -

    Causes lists in the table to be shwon as lists.

    +

    Causes lists in the table to be shown as lists.

    Lists As Strings @@ -533,7 +531,7 @@ This process will not be affected by any termination of the TV, i.e., the ETS tables created will live on until they are explicitly killed.

    - + The New Table Window, enabling easy creation of ETS tables.

    Note: the tv_table_owner is local to each node, meaning diff -Nru erlang-13.b.1-dfsg/lib/tv/vsn.mk erlang-13.b.3-dfsg/lib/tv/vsn.mk --- erlang-13.b.1-dfsg/lib/tv/vsn.mk 2009-03-12 12:23:30.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/tv/vsn.mk 2009-11-20 13:33:55.000000000 +0000 @@ -15,6 +15,6 @@ # under the License. # # %CopyrightEnd% -TV_VSN = 2.1.4.3 +# -TICKETS = OTP-7851 +TV_VSN = 2.1.4.4 diff -Nru erlang-13.b.1-dfsg/lib/typer/src/Makefile erlang-13.b.3-dfsg/lib/typer/src/Makefile --- erlang-13.b.1-dfsg/lib/typer/src/Makefile 2009-04-16 10:24:28.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/typer/src/Makefile 2009-09-18 15:09:16.000000000 +0100 @@ -69,7 +69,7 @@ # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- -ERL_COMPILE_FLAGS += -I$(DIALYZER_DIR)/src +warn_exported_vars +warn_untyped_record +warn_missing_spec +ERL_COMPILE_FLAGS += +warn_exported_vars +warn_untyped_record +warn_missing_spec # ---------------------------------------------------- # Targets @@ -100,11 +100,11 @@ # dependencies -- I wish they were somehow automatically generated # --------------------------------------------------------------------- -$(EBIN)/typer.beam: typer.hrl $(DIALYZER_DIR)/src/dialyzer.hrl -$(EBIN)/typer_annotator.beam: typer.hrl $(DIALYZER_DIR)/src/dialyzer.hrl -$(EBIN)/typer_info.beam: typer.hrl $(DIALYZER_DIR)/src/dialyzer.hrl -$(EBIN)/typer_options.beam: typer.hrl $(DIALYZER_DIR)/src/dialyzer.hrl -$(EBIN)/typer_preprocess.beam: typer.hrl $(DIALYZER_DIR)/src/dialyzer.hrl +$(EBIN)/typer.beam: typer.hrl +$(EBIN)/typer_annotator.beam: typer.hrl +$(EBIN)/typer_info.beam: typer.hrl +$(EBIN)/typer_options.beam: typer.hrl +$(EBIN)/typer_preprocess.beam: typer.hrl # ---------------------------------------------------- # Release Target diff -Nru erlang-13.b.1-dfsg/lib/typer/src/typer_annotator.erl erlang-13.b.3-dfsg/lib/typer/src/typer_annotator.erl --- erlang-13.b.1-dfsg/lib/typer/src/typer_annotator.erl 2009-06-05 13:53:46.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/typer/src/typer_annotator.erl 2009-09-18 15:09:25.000000000 +0100 @@ -43,7 +43,7 @@ -record(info, {recMap = typer_map:new() :: dict(), funcs = [] :: [func_info()], typeMap :: dict(), - contracts :: bool()}). + contracts :: boolean()}). -record(inc, {map = typer_map:new() :: dict(), filter = [] :: [string()]}). @@ -200,7 +200,7 @@ normalize_obj(TmpInc) -> Fun = fun(Key, Val, Inc) -> NewVal = [{{Line,F,A},Type} || {{F,A},{Line,Type}} <- Val], - typer_map:insert({Key,NewVal},Inc) + typer_map:insert({Key,NewVal}, Inc) end, NewMap = typer_map:fold(Fun, typer_map:new(), TmpInc#inc.map), TmpInc#inc{map = NewMap}. @@ -219,14 +219,16 @@ TypeInfoList = [get_type(I, CodeServer, RecMap) || I <- TypeInfo], typer_map:from_list(TypeInfoList). -get_type({MFA = {M,F,A}, Range, Arg}, CodeServer, RecMap) -> - case dialyzer_codeserver:lookup_contract(MFA, CodeServer) of - {ok, {_Line, C}} -> +get_type({{M, F, A} = MFA, Range, Arg}, CodeServer, RecMap) -> + case dialyzer_codeserver:lookup_mfa_contract(MFA, CodeServer) of + error -> + {{F, A}, {Range, Arg}}; + {ok, {_FileLine, Contract}} -> Sig = erl_types:t_fun(Arg, Range), - case dialyzer_contracts:check_contract(C, Sig) of - ok -> {{F, A}, {contract, C}}; + case dialyzer_contracts:check_contract(Contract, Sig) of + ok -> {{F, A}, {contract, Contract}}; {error, invalid_contract} -> - CString = dialyzer_contracts:contract_to_string(C), + CString = dialyzer_contracts:contract_to_string(Contract), SigString = dialyzer_utils:format_sig(Sig, RecMap), typer:error( io_lib:format("Error in contract of function ~w:~w/~w\n" @@ -237,9 +239,7 @@ typer:error( io_lib:format("Error in contract of function ~w:~w/~w: ~s", [M, F, A, Msg])) - end; - error -> - {{F, A}, {Range, Arg}} + end end. get_functions(File, Analysis) -> @@ -259,7 +259,7 @@ end. normalize_incFuncs(Funcs) -> - [FuncInfo || {_FileName,FuncInfo} <- Funcs]. + [FuncInfo || {_FileName, FuncInfo} <- Funcs]. -spec remove_module_info([func_info()]) -> [func_info()]. @@ -373,7 +373,7 @@ case typer_map:lookup(Func, TypeMap) of none -> %% Note: Typeinfo of any function should exist in - %% the result offered by Dialyzer, otherwise there + %% the result offered by dialyzer, otherwise there %% *must* be something wrong with the analysis io:format("No type info for function: ~p\n", [Func]), halt(); diff -Nru erlang-13.b.1-dfsg/lib/typer/src/typer.erl erlang-13.b.3-dfsg/lib/typer/src/typer.erl --- erlang-13.b.1-dfsg/lib/typer/src/typer.erl 2009-03-12 12:21:35.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/typer/src/typer.erl 2009-11-20 13:32:28.000000000 +0000 @@ -56,51 +56,75 @@ -spec extract(#typer_analysis{}) -> #typer_analysis{}. -extract(Analysis = #typer_analysis{macros = Macros, includes = Includes, - t_files = TFiles, trust_plt = TrustPLT}) -> +extract(#typer_analysis{macros = Macros, includes = Includes, + t_files = TFiles, trust_plt = TrustPLT} = Analysis) -> %% io:format("--- Extracting trusted typer_info... "), Ds = [{d, Name, Value} || {Name, Value} <- Macros], + CodeServer = dialyzer_codeserver:new(), Fun = - fun(File, TmpPlt) -> + fun(File, CS) -> %% We include one more dir; the one above the one we are trusting %% E.g, for /home/tests/typer_ann/test.ann.erl, we should include %% /home/tests/ rather than /home/tests/typer_ann/ AllIncludes = [filename:dirname(filename:dirname(File)) | Includes], Is = [{i, Dir} || Dir <- AllIncludes], - CompOpts = ?SRC_COMPILE_OPTS ++ Is ++ Ds, - SpecInfo = - case dialyzer_utils:get_abstract_code_from_src(File, CompOpts) of - {error, Reason} -> compile_error(Reason); - {ok, AbstractCode} -> - case dialyzer_utils:get_record_and_type_info(AbstractCode) of - {error, Reason} -> compile_error([Reason]); - {ok, RecDict} -> - case dialyzer_utils:get_spec_info(AbstractCode, RecDict) of - {error, Reason} -> compile_error([Reason]); - {ok, Ans} -> Ans - end - end - end, + CompOpts = dialyzer_utils:src_compiler_opts() ++ Is ++ Ds, + case dialyzer_utils:get_abstract_code_from_src(File, CompOpts) of + {ok, AbstractCode} -> + case dialyzer_utils:get_record_and_type_info(AbstractCode) of + {ok, RecDict} -> + Mod = list_to_atom(filename:basename(File, ".erl")), + case dialyzer_utils:get_spec_info(Mod, AbstractCode, RecDict) of + {ok, SpecDict} -> + CS1 = dialyzer_codeserver:store_temp_records(Mod, RecDict, CS), + dialyzer_codeserver:store_temp_contracts(Mod, SpecDict, CS1); + {error, Reason} -> compile_error([Reason]) + end; + {error, Reason} -> compile_error([Reason]) + end; + {error, Reason} -> compile_error(Reason) + end + end, + CodeServer1 = lists:foldl(Fun, CodeServer, TFiles), + %% Process remote types + NewCodeServer = + try + NewRecords = dialyzer_codeserver:get_temp_records(CodeServer1), + OldRecords = dialyzer_plt:get_types(TrustPLT), % XXX change to the PLT? + MergedRecords = dialyzer_utils:merge_records(NewRecords, OldRecords), + CodeServer2 = dialyzer_codeserver:set_temp_records(MergedRecords, CodeServer1), + CodeServer3 = dialyzer_utils:process_record_remote_types(CodeServer2), + dialyzer_contracts:process_contract_remote_types(CodeServer3) + catch + throw:{error, ErrorMsg} -> + compile_error(ErrorMsg) + end, + %% Create TrustPLT + Contracts = dialyzer_codeserver:get_contracts(NewCodeServer), + Modules = dict:fetch_keys(Contracts), + FoldFun = + fun(Module, TmpPlt) -> + {ok, ModuleContracts} = dict:find(Module, Contracts), SpecList = [{MFA, Contract} - || {MFA, {_FileLine, Contract}} <- dict:to_list(SpecInfo)], + || {MFA, {_FileLine, Contract}} <- dict:to_list(ModuleContracts)], dialyzer_plt:insert_contract_list(TmpPlt, SpecList) end, - NewTrustPLT = lists:foldl(Fun, TrustPLT, TFiles), + NewTrustPLT = lists:foldl(FoldFun, TrustPLT, Modules), Analysis#typer_analysis{trust_plt = NewTrustPLT}. %%-------------------------------------------------------------------- -spec get_type_info(#typer_analysis{}) -> #typer_analysis{}. -get_type_info(Analysis = #typer_analysis{callgraph = CallGraph, - trust_plt = TrustPLT, - code_server = CodeServer}) -> +get_type_info(#typer_analysis{callgraph = CallGraph, + trust_plt = TrustPLT, + code_server = CodeServer} = Analysis) -> StrippedCallGraph = remove_external(CallGraph, TrustPLT), %% io:format("--- Analyzing callgraph... "), try NewPlt = dialyzer_succ_typings:analyze_callgraph(StrippedCallGraph, TrustPLT, CodeServer), - Analysis#typer_analysis{callgraph=StrippedCallGraph, trust_plt=NewPlt} + Analysis#typer_analysis{callgraph = StrippedCallGraph, trust_plt = NewPlt} catch error:What -> error(io_lib:format("Analysis failed with message: ~p", @@ -109,7 +133,7 @@ error(io_lib:format("Analysis failed with message: ~s", [Msg])) end. --spec remove_external(#dialyzer_callgraph{}, #dialyzer_plt{}) -> #dialyzer_callgraph{}. +-spec remove_external(dialyzer_callgraph:callgraph(), dialyzer_plt:plt()) -> dialyzer_callgraph:callgraph(). remove_external(CallGraph, PLT) -> {StrippedCG0, Ext} = dialyzer_callgraph:remove_external(CallGraph), @@ -121,7 +145,7 @@ end, StrippedCG. --spec get_external([{mfa(), mfa()}], #dialyzer_plt{}) -> [mfa()]. +-spec get_external([{mfa(), mfa()}], dialyzer_plt:plt()) -> [mfa()]. get_external(Exts, Plt) -> Fun = fun ({_From, To = {M, F, A}}, Acc) -> diff -Nru erlang-13.b.1-dfsg/lib/typer/src/typer.hrl erlang-13.b.3-dfsg/lib/typer/src/typer.hrl --- erlang-13.b.1-dfsg/lib/typer/src/typer.hrl 2009-03-12 12:21:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/typer/src/typer.hrl 2009-09-18 15:09:17.000000000 +0100 @@ -25,16 +25,6 @@ -type mode() :: ?SHOW | ?SHOW_EXPORTED | ?ANNOTATE | ?ANNOTATE_INC_FILES. -%% -%% The following are needed for some dialyzer records below -%% --include("dialyzer.hrl"). --include("dialyzer_callgraph.hrl"). - -%% XXX: The following appear here only temporarily --type dialyzer_plt() :: tuple(). --type dialyzer_codeserver() :: tuple(). - -record(typer_analysis, {mode :: mode(), macros = [] :: [{atom(), _}], % {macro_name, value} @@ -42,8 +32,8 @@ %% Esp for Dialyzer %% ---------------------- - code_server = dialyzer_codeserver:new():: dialyzer_codeserver(), - callgraph = dialyzer_callgraph:new() :: #dialyzer_callgraph{}, + code_server = dialyzer_codeserver:new():: dialyzer_codeserver:codeserver(), + callgraph = dialyzer_callgraph:new() :: dialyzer_callgraph:callgraph(), ana_files = [] :: [string()], % absolute filenames plt = none :: 'none' | string(), @@ -52,7 +42,7 @@ t_files = [] :: [string()], %% For choosing between contracts or comments - contracts = true :: bool(), + contracts = true :: boolean(), %% Any file in 'final_files' is compilable. %% And we need to keep it as {FileName,ModuleName} @@ -66,7 +56,7 @@ %% should be kept as well func = typer_map:new() :: dict(), inc_func = typer_map:new() :: dict(), - trust_plt = dialyzer_plt:new() :: #dialyzer_plt{}}). + trust_plt = dialyzer_plt:new() :: dialyzer_plt:plt()}). -record(args, {analyze = [] :: [string()], diff -Nru erlang-13.b.1-dfsg/lib/typer/src/typer_info.erl erlang-13.b.3-dfsg/lib/typer/src/typer_info.erl --- erlang-13.b.1-dfsg/lib/typer/src/typer_info.erl 2009-04-16 10:24:28.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/typer/src/typer_info.erl 2009-11-20 13:32:28.000000000 +0000 @@ -44,16 +44,32 @@ throw:{dialyzer_error,_Reason} -> typer:error("Dialyzer's PLT is missing or is not up-to-date; please (re)create it") end, - lists:foldl(fun collect_one_file_info/2, - Analysis#typer_analysis{trust_plt=NewPlt}, - Analysis#typer_analysis.ana_files). + NewAnalysis = lists:foldl(fun collect_one_file_info/2, + Analysis#typer_analysis{trust_plt = NewPlt}, + Analysis#typer_analysis.ana_files), + %% Process Remote Types + TmpCServer = NewAnalysis#typer_analysis.code_server, + NewCServer = + try + NewRecords = dialyzer_codeserver:get_temp_records(TmpCServer), + OldRecords = dialyzer_plt:get_types(NewPlt), + MergedRecords = dialyzer_utils:merge_records(NewRecords, OldRecords), + %% io:format("Merged Records ~p",[MergedRecords]), + TmpCServer1 = dialyzer_codeserver:set_temp_records(MergedRecords, TmpCServer), + TmpCServer2 = dialyzer_utils:process_record_remote_types(TmpCServer1), + dialyzer_contracts:process_contract_remote_types(TmpCServer2) + catch + throw:{error, ErrorMsg} -> + typer:error(ErrorMsg) + end, + NewAnalysis#typer_analysis{code_server = NewCServer}. collect_one_file_info(File, Analysis) -> Ds = [{d,Name,Val} || {Name,Val} <- Analysis#typer_analysis.macros], %% Current directory should also be included in "Includes". Includes = [filename:dirname(File)|Analysis#typer_analysis.includes], Is = [{i,Dir} || Dir <- Includes], - Options = ?SRC_COMPILE_OPTS ++ Is ++ Ds, + Options = dialyzer_utils:src_compiler_opts() ++ Is ++ Ds, case dialyzer_utils:get_abstract_code_from_src(File, Options) of {error, Reason} -> %% io:format("File=~p\n,Options=~p\n,Error=~p\n", [File,Options,Reason]), @@ -65,7 +81,8 @@ case dialyzer_utils:get_record_and_type_info(AbstractCode) of {error, Reason} -> typer:compile_error([Reason]); {ok, Records} -> - case dialyzer_utils:get_spec_info(AbstractCode, Records) of + Mod = list_to_atom(filename:basename(File, ".erl")), + case dialyzer_utils:get_spec_info(Mod, AbstractCode, Records) of {error, Reason} -> typer:compile_error([Reason]); {ok, SpecInfo} -> analyze_core_tree(Core, Records, SpecInfo, Analysis, File) @@ -78,12 +95,12 @@ Module = list_to_atom(filename:basename(File, ".erl")), TmpTree = cerl:from_records(Core), CS1 = Analysis#typer_analysis.code_server, - NextLabel = dialyzer_codeserver:next_core_label(CS1), + NextLabel = dialyzer_codeserver:get_next_core_label(CS1), {Tree, NewLabel} = cerl_trees:label(TmpTree, NextLabel), - CS2 = dialyzer_codeserver:insert([{Module, Tree}], CS1), - CS3 = dialyzer_codeserver:update_next_core_label(NewLabel, CS2), - CS4 = dialyzer_codeserver:store_records(Module, Records, CS3), - CS5 = dialyzer_codeserver:store_contracts(Module, SpecInfo, CS4), + CS2 = dialyzer_codeserver:insert(Module, Tree, CS1), + CS3 = dialyzer_codeserver:set_next_core_label(NewLabel, CS2), + CS4 = dialyzer_codeserver:store_temp_records(Module, Records, CS3), + CS5 = dialyzer_codeserver:store_temp_contracts(Module, SpecInfo, CS4), Ex_Funcs = [{0,F,A} || {_,_,{F,A}} <- cerl:module_exports(Tree)], TmpCG = Analysis#typer_analysis.callgraph, CG = dialyzer_callgraph:scan_core_tree(Tree, TmpCG), diff -Nru erlang-13.b.1-dfsg/lib/typer/src/typer_preprocess.erl erlang-13.b.3-dfsg/lib/typer/src/typer_preprocess.erl --- erlang-13.b.1-dfsg/lib/typer/src/typer_preprocess.erl 2009-03-12 12:21:36.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/typer/src/typer_preprocess.erl 2009-11-20 13:32:29.000000000 +0000 @@ -38,7 +38,7 @@ get_all_files(Args, trust) -> internal_get_all_files(Args#args.trust, [], fun test_erl_file/1). --spec test_erl_file_exclude_ann(string()) -> bool(). +-spec test_erl_file_exclude_ann(string()) -> boolean(). test_erl_file_exclude_ann(File) -> case filename:extension(File) of @@ -50,13 +50,13 @@ _ -> false end. --spec test_erl_file(string()) -> bool(). +-spec test_erl_file(string()) -> boolean(). test_erl_file(File) -> filename:extension(File) =:= ".erl". -spec internal_get_all_files([string()], [string()], - fun((string()) -> bool())) -> [string()]. + fun((string()) -> boolean())) -> [string()]. internal_get_all_files(File_Dir, Dir_R, Fun) -> All_File_1 = process_file_and_dir(File_Dir, Fun), @@ -64,7 +64,7 @@ remove_dup(All_File_1 ++ All_File_2). -spec process_file_and_dir([string()], - fun((string()) -> bool())) -> [string()]. + fun((string()) -> boolean())) -> [string()]. process_file_and_dir(File_Dir, TestFun) -> Fun = @@ -77,7 +77,7 @@ lists:foldl(Fun, [], File_Dir). -spec process_dir_recursively([string()], - fun((string()) -> bool())) -> [string()]. + fun((string()) -> boolean())) -> [string()]. process_dir_recursively(Dirs, TestFun) -> Fun = fun (Dir, Acc) -> @@ -88,7 +88,7 @@ -spec check_dir(string(), 'non_recursive' | 'recursive', [string()], - fun((string()) -> bool())) -> [string()]. + fun((string()) -> boolean())) -> [string()]. check_dir(Dir, Mode, Acc, Fun) -> case file:list_dir(Dir) of @@ -112,7 +112,7 @@ end. %% Same order as the input list --spec process_file(string(), fun((string()) -> bool()), string()) -> [string()]. +-spec process_file(string(), fun((string()) -> boolean()), string()) -> [string()]. process_file(File, TestFun, Acc) -> case TestFun(File) of @@ -124,7 +124,7 @@ -spec split_dirs_and_files([string()], string()) -> {[string()], [string()]}. split_dirs_and_files(Elems, Dir) -> - Test_Fun = + Test_Fun = fun (Elem, {DirAcc, FileAcc}) -> File = filename:join(Dir, Elem), case filelib:is_regular(File) of @@ -132,7 +132,7 @@ true -> {DirAcc, [File|FileAcc]} end end, - {Dirs,Files} = lists:foldl(Test_Fun, {[],[]}, Elems), + {Dirs, Files} = lists:foldl(Test_Fun, {[], []}, Elems), {lists:reverse(Dirs), lists:reverse(Files)}. %%----------------------------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/lib/typer/vsn.mk erlang-13.b.3-dfsg/lib/typer/vsn.mk --- erlang-13.b.1-dfsg/lib/typer/vsn.mk 2009-06-05 13:53:43.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/typer/vsn.mk 2009-11-20 13:32:29.000000000 +0000 @@ -1 +1 @@ -TYPER_VSN = 0.1.7.1 +TYPER_VSN = 0.1.7.3 diff -Nru erlang-13.b.1-dfsg/lib/webtool/doc/src/book.xml erlang-13.b.3-dfsg/lib/webtool/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/webtool/doc/src/book.xml 2007-11-26 19:03:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/webtool/doc/src/book.xml 2009-11-20 13:34:13.000000000 +0000 @@ -1,26 +1,24 @@ - +

    - 2001 - 2007 - Ericsson AB, All Rights Reserved + 20012009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + WebTool @@ -35,11 +33,14 @@ - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/webtool/doc/src/Makefile erlang-13.b.3-dfsg/lib/webtool/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/webtool/doc/src/Makefile 2007-11-26 19:03:38.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/webtool/doc/src/Makefile 2009-11-20 13:34:12.000000000 +0000 @@ -23,17 +23,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(WEBTOOL_VSN) - -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- - -include make.dep +APPLICATION=webtool # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/webtool-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Target Specs @@ -56,6 +51,11 @@ BOOK_FILES = book.xml +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) \ + $(XML_REF1_FILES) $(XML_APPLICATION_FILES) + GIF_FILES = # ---------------------------------------------------- @@ -64,35 +64,13 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) INFO_FILE = ../../info -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF1_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) MAN1_FILES = $(XML_REF1_FILES:%.xml=$(MAN1DIR)/%.1) MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_PART = \ - $(XML_PART_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = \ - $(XML_REF1_FILES:%.xml=%.tex) \ - $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -TOP_PDF_FILE = webtool-$(VSN).pdf -TOP_PS_FILE = webtool-$(VSN).ps - -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -106,21 +84,21 @@ $(HTMLDIR)/%.gif: %.gif $(INSTALL_DATA) $< $@ -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) pdf: $(TOP_PDF_FILE) -ps: $(TOP_PS_FILE) +html: gifs $(HTML_REF_MAN_FILE) -html: $(HTML_FILES) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN1DIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ man: $(MAN1_FILES) $(MAN3_FILES) @@ -128,39 +106,22 @@ debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) - rm -f $(TEX_FILES_BOOK) $(TEX_FILES_PART) - rm -f $(EXTRA_FILES) $(HTML_FILES) $(MAN1_FILES) $(MAN3_FILES) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ $(LATEX_CLEAN) - # ---------------------------------------------------- # Release Target # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man1 $(INSTALL_DATA) $(MAN1_FILES) $(RELEASE_PATH)/man/man1 $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif release_spec: diff -Nru erlang-13.b.1-dfsg/lib/webtool/doc/src/notes.xml erlang-13.b.3-dfsg/lib/webtool/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/webtool/doc/src/notes.xml 2009-03-12 15:27:16.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/webtool/doc/src/notes.xml 2009-11-20 13:34:19.000000000 +0000 @@ -26,10 +26,28 @@ nil nil nil + notes.xml

    This document describes the changes made to the Webtool application.

    +
    WebTool 0.8.5 + +
    Improvements and New Features + + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8201

    +
    +
    +
    + +
    +
    WebTool 0.8.4
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/webtool/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/webtool/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/webtool/doc/src/part_notes.xml 2007-11-26 19:03:54.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/webtool/doc/src/part_notes.xml 2009-11-20 13:34:22.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + WebTool Release Notes @@ -36,6 +34,6 @@

    For information about older versions, see Release Notes History.

    - + diff -Nru erlang-13.b.1-dfsg/lib/webtool/doc/src/part.xml erlang-13.b.3-dfsg/lib/webtool/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/webtool/doc/src/part.xml 2007-11-26 19:03:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/webtool/doc/src/part.xml 2009-11-20 13:34:13.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2001 - 2007 - Ericsson AB, All Rights Reserved + 20012009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + WebTool User's Guide @@ -34,6 +32,6 @@ Erlang/OTP. It configures and starts a webserver as well as all available tools.

    - + diff -Nru erlang-13.b.1-dfsg/lib/webtool/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/webtool/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/webtool/doc/src/ref_man.xml 2007-11-26 19:03:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/webtool/doc/src/ref_man.xml 2009-11-20 13:34:12.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2001 - 2007 - Ericsson AB, All Rights Reserved + 20012009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + WebTool Reference Manual @@ -34,7 +32,7 @@ Erlang/OTP. It configures and starts a webserver as well as all available tools.

    - - + + diff -Nru erlang-13.b.1-dfsg/lib/webtool/doc/src/start_webtool.xml erlang-13.b.3-dfsg/lib/webtool/doc/src/start_webtool.xml --- erlang-13.b.1-dfsg/lib/webtool/doc/src/start_webtool.xml 2007-11-26 19:03:50.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/webtool/doc/src/start_webtool.xml 2009-11-20 13:34:17.000000000 +0000 @@ -4,23 +4,21 @@
    - 2003 - 2007 - Ericsson AB, All Rights Reserved + 20032009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + start_webtool @@ -69,7 +67,7 @@ Starting webcover... Sending URL to netscape...done

    The WebTool application WebCover is then started and the - default browser is used. The default broser is Internet + default browser is used. The default browser is Internet Explorer on Windows or else Netscape.

    To use another browser, give the browser's start command diff -Nru erlang-13.b.1-dfsg/lib/webtool/doc/src/webtool_chapter.xml erlang-13.b.3-dfsg/lib/webtool/doc/src/webtool_chapter.xml --- erlang-13.b.1-dfsg/lib/webtool/doc/src/webtool_chapter.xml 2007-11-26 19:03:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/webtool/doc/src/webtool_chapter.xml 2009-11-20 13:34:13.000000000 +0000 @@ -4,23 +4,21 @@

    - 2001 - 2007 - Ericsson AB, All Rights Reserved + 20012009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + WebTool User Guide @@ -28,6 +26,7 @@ + webtool_chapter.xml
    @@ -77,7 +76,7 @@

    Click on the link labeled WebTool in the topmost frame, select the checkbox for each tool to start and click on the button labeled Start. A link to each tool - that WebTool succeded to start will appear in the topmost frame.

    + that WebTool succeeded to start will appear in the topmost frame.

    @@ -198,37 +197,37 @@

    helloworld.erl:

             -module(helloworld).
    -\011-export([config_data/0]).
    -\011-export([helloworld/2]).
    -\011
    -\011config_data()->
    -\011    {testtool,
    -\011     [{web_data,{"TestTool","/testtool/helloworld/helloworld"}},
    -\011      {alias,{erl_alias,"/testtool",[helloworld]}}]}.
    -\011
    -\011helloworld(_Env,_Input)->
    -\011    [header(),html_header(),helloworld_body(),html_end()].
    +        -export([config_data/0]).
    +        -export([helloworld/2]).
    +        
    +        config_data()->
    +            {testtool,
    +             [{web_data,{"TestTool","/testtool/helloworld/helloworld"}},
    +              {alias,{erl_alias,"/testtool",[helloworld]}}]}.
    +        
    +        helloworld(_Env,_Input)->
    +            [header(),html_header(),helloworld_body(),html_end()].
     
    -\011header() ->
    -\011    header("text/html").
    +        header() ->
    +            header("text/html").
     
    -\011header(MimeType) ->
    -\011    "Content-type: " ++ MimeType ++ "\\r\
    +        header(MimeType) ->
    +            "Content-type: " ++ MimeType ++ "\\r\
     \\r\
     ".
     
    -\011html_header() ->    
    -\011    "<HTML>
    -\011       <HEAD>
    -\011          <TITLE>Hello world Example </TITLE>
    -\011       </HEAD>\
    +        html_header() ->    
    +            "<HTML>
    +               <HEAD>
    +                  <TITLE>Hello world Example </TITLE>
    +               </HEAD>\
     ".
     
    -\011helloworld_body()->
    -\011    "<BODY>Hello World</BODY>".
    +        helloworld_body()->
    +            "<BODY>Hello World</BODY>".
     
    -\011html_end()->
    -\011    "</HTML>".
    +        html_end()->
    +            "</HTML>".
           

    To use this example with WebTool a *.tool file must be created and added to a directory in the current path, e.g. the same diff -Nru erlang-13.b.1-dfsg/lib/webtool/vsn.mk erlang-13.b.3-dfsg/lib/webtool/vsn.mk --- erlang-13.b.1-dfsg/lib/webtool/vsn.mk 2009-03-12 12:24:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/webtool/vsn.mk 2009-11-20 13:34:13.000000000 +0000 @@ -1,2 +1,2 @@ -WEBTOOL_VSN=0.8.4 +WEBTOOL_VSN=0.8.5 diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/gen_util.erl erlang-13.b.3-dfsg/lib/wx/api_gen/gen_util.erl --- erlang-13.b.1-dfsg/lib/wx/api_gen/gen_util.erl 2009-06-05 13:54:27.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/gen_util.erl 2009-09-18 15:10:47.000000000 +0100 @@ -58,7 +58,10 @@ [] -> ok = file:delete(File ++ ".temp"), %% So that make understands that we have made this - %% os:cmd("touch " ++ File), + case os:getenv("CLEARCASE_ROOT") of + false -> os:cmd("touch " ++ File); + _ -> ignore + end, ok; Diff -> case check_diff(Diff) of @@ -90,7 +93,11 @@ copyright catch throw:_ -> diff; - error:{badmatch,_} -> diff + error:{badmatch,_} -> + diff; + _:What -> + io:format("~p:~p: ~p ~p~n", [?MODULE,?LINE, What, erlang:get_stacktrace()]), + diff end. w(Str) -> @@ -168,6 +175,10 @@ replace_and_remove(R, ["|"|Acc]); replace_and_remove([$* | R], Acc) -> replace_and_remove(R, ["*"|Acc]); +replace_and_remove([$& | R], Acc) -> + replace_and_remove(R, [$&|Acc]); +replace_and_remove([$<,$< | R], Acc) -> + replace_and_remove(R, ["<<"|Acc]); replace_and_remove([$, | R], Acc) -> replace_and_remove(R, [cont|Acc]); replace_and_remove([$; | R], Acc) -> diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/glapi.conf erlang-13.b.3-dfsg/lib/wx/api_gen/glapi.conf --- erlang-13.b.1-dfsg/lib/wx/api_gen/glapi.conf 2009-06-05 13:54:28.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/glapi.conf 2009-09-18 15:10:48.000000000 +0100 @@ -5,14 +5,14 @@ [ %%% GLU "glu", %% The ones we want is specified in keep -%% "gluQuad", -%% "gluTess", -%% "gluBegin", -%% "gluEnd", -%% "gluNew", -%% "gluDelete", -%% "gluGetNurbs", -%% "gluGetTess", + "gluQuad", + "gluBegin", + "gluEnd", + "gluNew", + "gluDelete", +%% "gluTess", +%% "gluGetNurbs", +%% "gluGetTess", %%% GL "glProgramCallbackMESA", @@ -29,12 +29,12 @@ "glMatrixIndexPointerARB", "glPixelTransformParameter", %% OpengGL 3.0 - "glGetTransformFeedbackVarying", %% These two doesn't match header and spec?? - "glTransformFeedbackVaryings", + %"glGetTransformFeedbackVarying", %% Jobbiga + %"glTransformFeedbackVaryings", %% EXT %% By default skip these extensions - "SGIX","SGIS","NV","ATI","SUN","SUNX", "GREMEDY", + "SGIX","SGIS","NV","ATI","AMD","SUN","SUNX","GREMEDY", "HP","IBM","INTEL","APPLE","3DFX","PGI","EXT"]}. %% Exceptions to the above @@ -71,11 +71,17 @@ "glBlitFramebufferEXT", %% GL_EXT_framebuffer_multisample "glRenderbufferStorageMultisampleEXT", + "gluBuild", % mipmaps* "gluCheckExtension", "gluErrorString", "gluGetString", "gluLookAt", "gluOrtho2D", "gluPerspective", "gluPickMatrix", - "gluProject", %% "gluScaleImage", - "gluUnProject" + "gluScaleImage", + + "gluNewQuadric", "gluDeleteQuadric", + "gluQuadricTexture", "gluQuadricOrientation", "gluQuadricNormals", "gluQuadricDrawStyle", + "gluDisk", "gluCylinder", "gluPartialDisk", "gluSphere", + + "gluProject", "gluUnProject" ]}. {vector, [{"glMultiTexCoord",1}, {"glConvolutionParameter",2},{"glVertexAttrib",1}, {"glVertexAttribI",1}]}. @@ -87,8 +93,8 @@ {"glGetPolygonStipple", [{"mask", [{binary, 128},out, {single,true}]}]}. {"glClipPlane", {"equation", {single,{tuple,4}}}}. {"glGetClipPlane", {"equation", {single,{tuple,4}}}}. -{"glLoadMatrix", {"m", {single,{tuple,16}}}}. -{"glMultMatrix", {"m", {single,{tuple,16}}}}. +{"glLoadMatrix", {"m", {single,{tuple,matrix}}}}. +{"glMultMatrix", {"m", {single,{tuple,matrix}}}}. {"glCallLists", [{"n", {c_only, {length, "lists"}}}, {"type", {c_only, {constant, "GL_UNSIGNED_INT"}}}, {"lists", [{single,list},{type,"GLuint"}, {base,int}]}]}. @@ -118,12 +124,12 @@ {"glGetMap", {"v", [{base,memory},in]}}. {"glFog", {"params", {single,{tuple,undefined}}}}. {"glColorTableParameter", {"params",{single,{tuple,4}}}}. -{"glGetColorTableParameter", {"params", {single,{tuple,4}}}}. {"glGetColorTable", {"table", [{base,memory},in]}}. -{"glGetHistogramParameter", {"params", {single,{tuple,1}}}}. +{"glGetColorTableParameter", {"params", {single,{tuple,4}}}}. {"glGetHistogram", {"values", [{base,memory}, in]}}. -{"glGetMinmaxParameter", {"params", {single,{tuple,1}}}}. +{"glGetHistogramParameter", {"params", {single,{tuple,1}}}}. {"glGetMinmax", {"values", [{base,memory}, in]}}. +{"glGetMinmaxParameter", {"params", {single,{tuple,1}}}}. {"glGetConvolutionFilter", {"image", [{base,memory}, in]}}. {"glConvolutionParameter", {"params", {single,{tuple,undefined}} }}. {"glGetConvolutionParameter", {"params", {single,{tuple,4}}}}. @@ -142,8 +148,8 @@ {"glGetTexImage", {"pixels", [{base,memory}, in]}}. {"glGetCompressedTexImage", {"img", [{base,memory}, in]}}. -{"glLoadTransposeMatrix", {"m", {single,{tuple,16}}}}. -{"glMultTransposeMatrix", {"m",{single,{tuple,16}}}}. +{"glLoadTransposeMatrix", {"m", {single,{tuple,matrix}}}}. +{"glMultTransposeMatrix", {"m",{single,{tuple,matrix}}}}. {"glMultiDrawArrays", [{"first", [in,{single,list}]}, {"count", [in,{single,list}]}, @@ -259,41 +265,69 @@ {"glGenFramebuffersEXT", {"framebuffers",{single,{list,"n","n"}}}}. {"gluPickMatrix", {"viewport", [in, {single, {tuple, 4}}]}}. -{"gluProject", [{"model", {single, {tuple, 16}}}, - {"proj", {single, {tuple, 16}}}, +{"gluProject", [{"model", {single, {tuple, matrix}}}, + {"proj", {single, {tuple, matrix}}}, {"view", {single, {tuple, 4}}}, {"winX", [{single,true},out]}, {"winY", [{single,true},out]}, {"winZ", [{single,true},out]}]}. -{"gluUnProject", [{"model", {single, {tuple, 16}}}, - {"proj", {single, {tuple, 16}}}, +{"gluUnProject", [{"model", {single, {tuple, matrix}}}, + {"proj", {single, {tuple, matrix}}}, {"view", {single, {tuple, 4}}}, {"objX",[{single,true},out]}, {"objY",[{single,true},out]}, {"objZ",[{single,true},out]}, {"objW",[{single,true},out]}]}. {"gluBuild", {"data", [binary]}}. -%%{"gluScaleimage", {"data", [binary]}}. +{"gluScaleImage", [{"dataIn", [in, binary]}, {"dataOut", [in, {base, memory}]}]}. {"gluCheckExtension", [{"extName", {single, list}}, {"extString", {single, list}}]}. {"gluErrorString", {"result", {single, {list,null}}}}. {"gluGetString", {"result", {single, {list,null}}}}. +{"gluDeleteQuadric", {"quad", in}}. +{"gluQuadric", {"quad", in}}. +{"gluSphere", {"quad", in}}. +{"gluPartialDisk", {"quad", in}}. +{"gluDisk", {"quad", in}}. +{"gluCylinder", {"quad", in}}. + %% OpenGL 3.0 {"glGetBooleani_v", {"data", {single,{list,16}}}}. {"glGetIntegeri_v", {"data", {single,{list,16}}}}. -%%{"glGetTransformFeedbackVarying", {"location", }}. +{"glTransformFeedbackVaryings", [{"count", {c_only,{length,"varyings"}}}, + {"varyings", [{base,string}, {single,list}]}]}. +{"glGetTransformFeedbackVarying", [{"size", {single, true}},{"type", {single, true}}, + {"length", [skip, {single, true}]}, + {"name", {single, {list,"bufSize","length"}}}]}. + + {"glGenRenderbuffers", {"renderbuffers", {single,{list,"n","n"}}}}. {"glGenFramebuffers", {"framebuffers",{single,{list,"n","n"}}}}. {"glGetRenderbufferParameteriv", {"params", {single,true}}}. {"glGetFramebufferAttachmentParameteriv", {"params",{single,true}}}. {"glGenVertexArrays", {"arrays", {single, {list,"n","n"}}}}. {"glGenRenderbuffers", {"renderbuffers", {single,{list,"n","n"}}}}. -{"glDeleteRenderbuffers",[{"n",{c_only,{length,"renderbuffers"}}},{"renderbuffers",{single,list}}]}. -{"glDeleteFramebuffers", [{"n",{c_only,{length,"framebuffers"}}},{"framebuffers",{single,list}}]}. +{"glDeleteRenderbuffers",[{"n",{c_only,{length,"renderbuffers"}}}, + {"renderbuffers",{single,list}}]}. +{"glDeleteFramebuffers", [{"n",{c_only,{length,"framebuffers"}}}, + {"framebuffers",{single,list}}]}. {"glVertexAttribI4", {"v", {single, {tuple,4}}}}. %% {"glVertexAttribI4", {"v", }}. %% {"glVertexAttribI4ubv", {"v", }}. %% {"glVertexAttribI4usv", {"v", }}. {"glClearBuffer", {"value", {single, {tuple, undefined}}}}. {"glDeleteVertexArrays", [{"n",{c_only,{length,"arrays"}}},{"arrays", {single, list}}]}. + +{"glGetUniformIndices", [{"uniformCount", {c_only, {length, "uniformNames"}}}, + {"uniformNames", [{base,string}, {single,list}]}, + {"uniformIndices", [out, {single,{list, "uniformNamesLen", "uniformNamesLen"}}]}]}. +{"glGetActiveUniformsiv", [{"uniformCount", {c_only, {length, "uniformIndices"}}}, + {"uniformIndices", {single,list}}, + {"params", [out, {single, {list, "uniformIndicesLen", "uniformIndicesLen"}}]}]}. + +{"glGetActiveUniformName", [{"length",[skip,{single, true}]}, + {"uniformName", {single, {list,"bufSize","length"}}}]}. +{"glGetActiveUniformBlockName", [{"length",[skip,{single, true}]}, + {"uniformBlockName", {single, {list,"bufSize","length"}}}]}. +{"glGetActiveUniformBlockiv", {"params", [in, {base,memory}]}}. diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/gl_gen_c.erl erlang-13.b.3-dfsg/lib/wx/api_gen/gl_gen_c.erl --- erlang-13.b.1-dfsg/lib/wx/api_gen/gl_gen_c.erl 2009-06-05 13:54:28.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/gl_gen_c.erl 2009-09-18 15:10:49.000000000 +0100 @@ -68,7 +68,9 @@ " return ;~n }~n };~n~n", []), w(" switch(op) ~n{~n",[]), - w(" case 5000: {~n wxe_tess_impl(bp, caller); ~n}; break;~n", []), + w(" case 5000: ~n wxe_tess_impl(bp, caller); ~n break;~n", []), + w(" case WXE_BIN_INCR:~n driver_binary_inc_refc(bins[0]->bin);~n break;~n",[]), + w(" case WXE_BIN_DECR:~n driver_binary_dec_refc(bins[0]->bin);~n break;~n",[]), [funcs(F) || F <- GLUFuncs], [funcs(F) || F <- GLFuncs], @@ -117,20 +119,6 @@ declare_var(A=#arg{where=erl}) -> A; -%% declare_var(A=#arg{name=Name,type=#type{name=Type,single=list}}) -> -%% w(" ~s *~s;~n", [Type,Name]), -%% w(" ~s *~sLen;~n", [Type,Name]), -%% A; -%% declare_var(A=#arg{name=Name,type=#type{name=Type,single={tuple,undefined}}}) -> -%% w(" ~s *~s;~n", [Type,Name]), -%% w(" ~s *~sLen;~n", [Type,Name]), -%% A; -%% declare_var(A=#arg{name=Name,in=In,type=#type{name=Type,ref=undefined}}) -> -%% w(" ~s *~s;~n", [Name,Type]), -%% A; -%% declare_var(A=#arg{name=Name,type=#type{name=Type}}) -> -%% w(" ~s *~s;~n", [Type,Name]), -%% A. declare_var(A=#arg{name=N,in=false,type=#type{name=T,base=B,single={tuple,Sz}}}) -> true = is_number(Sz), %% Assert w(" ~s ~s[~p] = {~s};~n", [T,N,Sz,args(fun zero/1,",",lists:duplicate(Sz,B))]), @@ -149,6 +137,9 @@ w(" ~s ~s[~p];~n", [T,N,Sz]), A; declare_var(A=#arg{name=N,in=false, + type=#type{name=T="GLUquadric",base=B,by_val=false,single=true}}) -> + A; +declare_var(A=#arg{name=N,in=false, type=#type{name=T,base=B,by_val=false,single=true}}) -> w(" ~s ~s[1] = {~s};~n", [T,N,zero(B)]), A; @@ -237,6 +228,10 @@ A = align(8,A0), w(" ~s ~s = (~s) * (GLuint64EXT *) bp; bp += 8;~n", [Type,Name,Type]), {P, A}; +decode_arg(P=#arg{name=Name,type=#type{name=Type="GLUquadric",size=8,base=int}},A0) -> + A = align(8,A0), + w(" ~s * ~s = (~s *) * (GLuint64EXT *) bp; bp += 8;~n", [Type,Name,Type]), + {P, A}; decode_arg(P=#arg{name=Name, type=#type{name=Type,size=Sz,by_val=true,ref=undefined}},A0) -> A = align(Sz,A0), @@ -310,12 +305,14 @@ Name; call_arg(#arg{name=Name,type=#type{base=string,ref={pointer,2},mod=[const]}}) -> "(const GLchar **) " ++ Name; +call_arg(#arg{name=Name,type=#type{size=8,base=int,ref={pointer,1}}}) -> + Name; call_arg(#arg{name=Name,type=#type{}}) -> Name. build_return_vals(Type,As) -> case calc_sizes(Type,As) of - {0,none} -> %% Sync memory access functions + {0,none,0} -> %% Sync memory access functions Any = fun(#arg{type=#type{base=B}}) -> B =:= memory end, case lists:any(Any, As) of false -> ok; @@ -329,13 +326,14 @@ w(" driver_send_term(WXE_DRV_PORT,caller,rt,AP);~n",[]), ok end; - {Val, Vars} -> + {Val,Vars,Cnt} -> + ExtraTuple = if Cnt > 1 -> 2; true -> 0 end, CSize = if Vars =:= none -> - Sz = integer_to_list(Val+4), + Sz = integer_to_list(Val+4+ExtraTuple), w(" int AP = 0; ErlDrvTermData rt[~s];~n",[Sz]), Sz; true -> - Sz = integer_to_list(Val+4) ++ " + " ++ Vars, + Sz = integer_to_list(Val+4+ExtraTuple) ++ " + " ++ Vars, w(" int AP = 0; ErlDrvTermData *rt;~n",[]), w(" rt = (ErlDrvTermData *) " "driver_alloc(sizeof(ErlDrvTermData)*(~s));~n", [Sz]), @@ -343,6 +341,11 @@ end, w(" rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) \"_wxe_result_\");~n",[]), FreeList = build_ret_types(Type,As), + case Cnt of + 1 -> ok; + _ -> + w(" rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = ~p;~n",[Cnt]) + end, w(" rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;~n",[]), w(" if (AP != ~s ) fprintf(stderr, \"%d: ERROR AP mismatch %d %d\\r\\n\",__LINE__,AP,~s);~n", [CSize,CSize]), @@ -357,15 +360,20 @@ end. calc_sizes(Type,As) -> - TSz = return_size("result", Type), - Calc = fun(#arg{name=N,in=False,where=W,type=T},{Sz,Vars}) + TSz = case return_size("result", Type) of + {0, none} -> + {0, none, 0}; + {Sz,Vars} -> + {Sz,Vars, 1} + end, + Calc = fun(#arg{name=N,in=False,where=W,type=T},{Sz,Vars, Cnt}) when False =/= true, W=/= c -> case return_size(N, T) of - {Val, none} -> {Sz+Val, Vars}; + {Val, none} -> {Sz+Val, Vars, Cnt+1}; {Val, Var} when Vars =:= none -> - {Sz+Val, Var}; + {Sz+Val, Var,Cnt+1}; {Val, Var} when Vars =:= none -> - {Sz+Val, Var ++ " + " ++ Vars} + {Sz+Val, Var ++ " + " ++ Vars,Cnt+1} end; (_,Acc) -> Acc end, @@ -407,6 +415,8 @@ w(" rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) ~s;~n", [Name]); build_ret(Name,_Q,#type{name=_T,base=bool,single=true,by_val=true}) -> w(" rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) ~s;~n", [Name]); +build_ret(Name,_Q,#type{name="GLUquadric",base=int}) -> + w(" rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) ~s;~n", [Name]); build_ret(Name,_Q,#type{name=_T,base=int,single=true,by_val=false}) -> w(" rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *~s;~n", [Name]); build_ret(Name,_Q,#type{name=_T,base=bool,single=true,by_val=false}) -> diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/gl_gen.erl erlang-13.b.3-dfsg/lib/wx/api_gen/gl_gen.erl --- erlang-13.b.1-dfsg/lib/wx/api_gen/gl_gen.erl 2009-06-05 13:54:28.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/gl_gen.erl 2009-09-18 15:10:50.000000000 +0100 @@ -287,7 +287,7 @@ case lookup(Method,AllOpts,undefined) of undefined -> P; What -> - %%io:format("~p ~p => ~p", [Method, ArgName, What]), + %% io:format("~p ~p => ~p~n", [Method, ArgName, What]), case What of {ArgName,Fopt} when is_list(Fopt) -> foldl(fun handle_arg_opt/2,P,Fopt); @@ -391,10 +391,12 @@ parse_type2(R,T#type{name=N, size=4,base=float},Opts); parse_type2([N="GLclampd"|R],T,Opts) -> parse_type2(R,T#type{name=N, size=8,base=float},Opts); -parse_type2([N="GLhandleARB"|R],T,Opts) -> %% unsigned int normally (in glext.h) but - parse_type2(R,T#type{name=N, size=8,base=int},Opts); %% is void * on Mac!! FIXME +parse_type2([N="GLhandleARB"|R],T,Opts) -> + parse_type2(R,T#type{name=N, size=8,base=int},Opts); parse_type2(["GLchar" ++ _ARB|R],T,Opts) -> parse_type2(R,T#type{name="GLchar",size=1,base=string},Opts); +parse_type2(["GLUquadric"|R],T,Opts) -> + parse_type2(R,T#type{name="GLUquadric",size=8,base=int},Opts); parse_type2(["GLintptr" ++ _ARB|R],T,Opts) -> parse_type2(R,T#type{name="GLintptr",size=8,base=int},Opts); parse_type2(["GLsizeiptr" ++ _ARB|R],T,Opts) -> @@ -521,18 +523,18 @@ lookup(Name,[{Vector, VecPos}|R],Def) when is_list(Vector) -> case lists:prefix(Vector,Name) of - true -> + true -> + %% VecPos; %%io:format("~s ~s => ~p ~n", [Vector,Name,VecPos]), -%% case Vector == Name of -%% true -> -%% VecPos; -%% false -> %% Look for exactly the correct Name -%% case lookup(Name,R,Def) of -%% Def -> VecPos; -%% Other -> Other -%% end -%% end; - VecPos; + case Vector == Name of + true -> + VecPos; + false -> %% Look for exactly the correct Name + case lookup(Name,R,Def) of + Def -> VecPos; + Other -> Other + end + end; false -> lookup(Name,R, Def) end; lookup(Name,[_|R],Def) -> @@ -547,6 +549,7 @@ %% Ok warn if single is undefined lists:foreach(fun(#arg{type=#type{base=memory}}) -> ok; (#arg{type=#type{base=idx_binary}}) -> ok; + (#arg{type=#type{name="GLUquadric"}}) -> ok; (A=#arg{type=#type{single=undefined}}) -> ?warning("~p Unknown size of~n ~p~n", [get(current_func),A]), @@ -560,10 +563,15 @@ ignore -> put(FuncName, Func#func{id=Id}), Name++Ext; - {A1,A2} -> + {bin, A1,A2} -> put(FuncName, Func#func{id=Id,params=A1}), Extra = FuncName++"Bin", put(Extra, Func#func{params=A2, id=next_id(function)}), + [FuncName,Extra]; + {matrix, A1,A2} -> + put(FuncName, Func#func{id=Id,params=A2}), + Extra = FuncName++"Matrix", + put(Extra, Func#func{where=erl, params=A1, id=Id}), [FuncName,Extra] end. @@ -573,9 +581,19 @@ Head = reverse(Acc), case setup_idx_binary(R, []) of ignore -> - {Head ++ [A1|R], Head ++ [A2|R]}; - {R1,R2} -> - {Head ++ [A1|R1], Head ++ [A2|R2]} + {bin, Head ++ [A1|R], Head ++ [A2|R]}; + {bin, R1,R2} -> + {bin, Head ++ [A1|R1], Head ++ [A2|R2]} + end; +setup_idx_binary([A=#arg{in=true,type=T=#type{single={tuple,matrix}}}|R], Acc) -> + A1 = A#arg{type=T#type{single={tuple, matrix12}}}, + A2 = A#arg{type=T#type{single={tuple, 16}}}, + Head = reverse(Acc), + case setup_idx_binary(R, []) of + ignore -> + {matrix, Head ++ [A1|R], Head ++ [A2|R]}; + {matrix, R1,R2} -> + {matrix, Head ++ [A1|R1], Head ++ [A2|R2]} end; setup_idx_binary([H|R],Acc) -> setup_idx_binary(R,[H|Acc]); @@ -586,6 +604,7 @@ case Equal of true -> ok; false -> + %% io:format("A1: ~p~nA2: ~p~n",[A1,A2]), ?warning("Skipped Ext Not Equal ~p ~p~n", [F1#func.name,F2#func.name]) end, @@ -607,6 +626,7 @@ is_equal_type(#type{name="GLenum"},#type{name="GLint"}) -> true; is_equal_type(#type{base=idx_binary},#type{base=guard_int}) -> true; is_equal_type(#type{base=idx_binary},#type{base=memory}) -> true; +is_equal_type(#type{single={tuple,matrix}},#type{single={tuple,matrix12}}) -> true; is_equal_type(#type{base=B,single=S,name=N,size=Sz}, #type{base=B,single=S,name=N,size=Sz}) -> true; is_equal_type(_,_) -> false. @@ -625,6 +645,7 @@ "TXE" ++ Name -> {reverse(Name),"EXT"}; "ASEM" ++ Name -> {reverse(Name),"MESA"}; "ITA" ++ Name -> {reverse(Name),"ATI"}; + "DMA" ++ Name -> {reverse(Name),"AMD"}; "VN" ++ Name -> {reverse(Name),"NV"}; %Nvidia "ELPPA"++ Name -> {reverse(Name),"APPLE"}; "LETNI"++ Name -> {reverse(Name),"INTEL"}; @@ -659,7 +680,7 @@ next_id(What) -> Next = case get(What) of - undefined -> 5001; %% Opengl + undefined -> 5010; %% Opengl N -> N+1 end, put(What, Next), diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/gl_gen_erl.erl erlang-13.b.3-dfsg/lib/wx/api_gen/gl_gen_erl.erl --- erlang-13.b.1-dfsg/lib/wx/api_gen/gl_gen_erl.erl 2009-06-05 13:54:28.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/gl_gen_erl.erl 2009-09-18 15:10:51.000000000 +0100 @@ -76,7 +76,8 @@ {"GLdouble", "64/native-float"}, % double precision float {"GLclampd", "64/native-float"}, % double precision float in [0,1] {"GLsizeiptr","64/native-unsigned"}, % 64 bits int, convert on c-side - {"GLintptr", "64/native-unsigned"}, % 64 bits int, convert on c-side + {"GLintptr", "64/native-unsigned"}, % 64 bits int, convert on c-sidew + {"GLUquadric", "64/native-unsigned"},% Handle 32bits aargh 64bits on mac64 {"GLhandleARB","64/native-unsigned"} % Handle 32bits aargh 64bits on mac64 ]. @@ -119,14 +120,14 @@ w("%% See www.opengl.org~n",[]), w("%%~n", []), w("%% Booleans are represented by integers 0 and 1. ~n~n", []), -%% w("%% @type wx_mem(). see wx.erl on memory allocation functions~n", []), + w("%% @type wx_mem(). see wx.erl on memory allocation functions~n", []), w("%% @type enum(). An integer defined in gl.hrl~n", []), w("%% @type offset(). An integer which is an offset in an array~n", []), w("%% @type clamp(). A float clamped between 0.0 - 1.0 ~n~n", []), w("-module(glu).~n",[]), w("-compile(inline).~n", []), -%% w("-include(\"wxe.hrl\").~n", []), + w("-include(\"wxe.hrl\").~n", []), [w("-define(~s,~s).~n", [GL,Erl]) || {GL,Erl} <- types()], Exp = fun(F) -> gen_export(F) end, @@ -229,7 +230,10 @@ func_arg(#arg{in=In,where=W,name=Name,type=Type}) when In =/= false, W =/= c -> case Type of - #type{single={tuple,TSz}} when is_integer(TSz) -> + #type{single={tuple,TSz0}} when TSz0 =/= undefined -> + TSz = if is_integer(TSz0) -> TSz0; + TSz0 =:= matrix12 -> 12 + end, [NameId|_] = erl_arg_name(Name), Names = [[NameId|integer_to_list(Id)] || Id <- lists:seq(1,TSz)], "{" ++ args(fun(ElName) -> ElName end, ",", Names) ++ "}"; @@ -255,7 +259,12 @@ "{" ++ doc_arg_type2(T) ++ "," ++ args(fun doc_arg_type/1,",",Ps) ++ "}". doc_arg_type(#arg{name=Name,type=T}) -> - erl_arg_name(Name) ++ "::" ++ doc_arg_type2(T). + try + erl_arg_name(Name) ++ "::" ++ doc_arg_type2(T) + catch _:Error -> + io:format("Error: ~p ~p~n~p~n",[Name, Error, erlang:get_stacktrace()]), + exit(error) + end. doc_arg_type2(T=#type{single=true}) -> doc_arg_type3(T); @@ -349,6 +358,16 @@ All = args(fun(ElName) -> ElName ++ ":?" ++ Type end, ",", Names), align(BSz,TSz,A0,All); +marshal_arg(#type{size=BSz,name=Type,single={tuple,matrix12}},Name,A0) -> + NameId = hd(Name), + Ns0 = [[NameId|integer_to_list(Id)] || Id <- lists:seq(1,3)], + Ns1 = [[NameId|integer_to_list(Id)] || Id <- lists:seq(4,6)], + Ns2 = [[NameId|integer_to_list(Id)] || Id <- lists:seq(7,9)], + Ns3 = [[NameId|integer_to_list(Id)] || Id <- lists:seq(10,12)], + All = args(fun(ElName) -> ElName ++ ":?" ++ Type end, ",", + Ns0 ++ ["0"] ++ Ns1 ++ ["0"] ++ Ns2 ++ ["0"] ++ Ns3 ++ ["1"]), + align(BSz,16,A0,All); + marshal_arg(#type{size=Sz,name=Type,base=Base,single=list},Name,A0) when Base =:= float; Base =:= int -> KeepA = case Sz of 8 -> "0:32,"; _ -> "" end, @@ -364,6 +383,9 @@ by_val=true,ref=undefined},Name,A0) -> align(Sz,A0,Name ++ ":?" ++ Type); +marshal_arg(#type{size=8,name="GLUquadric"=Type},Name,A0) -> + align(8,A0,Name ++ ":?" ++ Type); + marshal_arg(#type{base=string,single=true,ref={pointer,1}},Name,A0) -> Str = "(list_to_binary(["++Name++"|[0]]))/binary", % Null terminate align_after(1,A0,1,1,Name,Str); @@ -560,17 +582,8 @@ erl_copyright(), w("%% This file is generated DO NOT EDIT~n~n", []), w("gldebug_table() -> ~n[~n", []), - P = fun(F, Mod) -> - case get(F) of - #func{alt={vector,_VecPos,_Vec}} -> ok; - #func{id=Id, name=Method} -> - w(" {~p, {~s, ~s, 0}},~n", [Id, Mod, erl_func_name(Method)]); - _Other -> - io:format("F= ~p => ~p~n", [F, _Other]) - end - end, [printd(F,gl) || F <- GL], - [P(F,glu) || F <- GLU], + [printd(F,glu) || F <- GLU], w(" {-1, {mod, func, -1}}~n",[]), w("].~n~n", []), close(). @@ -582,6 +595,7 @@ printd(F,Mod) -> case get(F) of #func{alt={vector,_VecPos,_Vec}} -> ok; + #func{where=erl} -> ok; #func{id=Id, name=Method} -> w(" {~p, {~s, ~s, 0}},~n", [Id, Mod, erl_func_name(Method)]); _Other -> diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/Makefile erlang-13.b.3-dfsg/lib/wx/api_gen/Makefile --- erlang-13.b.1-dfsg/lib/wx/api_gen/Makefile 2009-03-12 12:25:34.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/Makefile 2009-09-18 15:10:46.000000000 +0100 @@ -45,10 +45,10 @@ opt: $(WX) $(GL) -$(WX): wxxml_generated $(COMPILER_T) wxapi.conf +$(WX): wxxml_generated $(COMPILER_T) wxapi.conf $(wildcard wx_extra/wx*.c_src) $(wildcard wx_extra/wx*.erl) erl -noshell -run wx_gen code -wxxml_generated: wx_doxygen.conf +wxxml_generated: wx_doxygen.conf wx_extra/bugs.h wx_extra/wxe_evth.h sed -e 's|@WXGTK_DIR@|$(WXGTK_DIR)|g' wx_doxygen.conf > wx_doxygen doxygen wx_doxygen && touch wxxml_generated @@ -71,5 +71,4 @@ clean: rm -f *~ rm -f $(COMPILER_T) $(GL_COMP_T) - #rm -f code_generated rm -f wx_extra/*~ diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/wxapi.conf erlang-13.b.3-dfsg/lib/wx/api_gen/wxapi.conf --- erlang-13.b.1-dfsg/lib/wx/api_gen/wxapi.conf 2009-06-05 13:54:27.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/wxapi.conf 2009-11-20 13:34:32.000000000 +0000 @@ -270,14 +270,38 @@ 'SetSelectionForeground','SetSelectionMode',%'SetTable', 'ShowCellEditControl','XToCol','XToEdgeOfCol','YToEdgeOfRow','YToRow']}. -{class, wxGridCellRenderer, root, [], ['Draw','GetBestSize']}. +{class, wxGridCellRenderer, root, [], + ['Draw','GetBestSize']}. {class, wxGridCellEditor, root, [], - [%'wxGridCellEditor', 'Create', + ['Create', 'IsCreated', 'SetSize', 'Show', 'PaintBackground', 'BeginEdit', 'EndEdit', 'Reset', 'StartingKey', - 'StartingClick', 'HandleReturn' %'Destroy','Clone','~wxGridCellEditor', + 'StartingClick', 'HandleReturn' + %'Destroy','Clone','~wxGridCellEditor', ]}. +{class, wxGridCellBoolRenderer, wxGridCellRenderer, [], + ['wxGridCellBoolRenderer']}. +{class, wxGridCellBoolEditor, wxGridCellEditor, [], + ['wxGridCellBoolEditor', 'IsTrueValue', 'UseStringValues']}. + +{class, wxGridCellFloatRenderer, wxGridCellStringRenderer, [], + ['wxGridCellFloatRenderer', 'GetPrecision', 'GetWidth', + 'SetParameters', 'SetPrecision', 'SetWidth']}. +{class, wxGridCellFloatEditor, wxGridCellEditor, [], + ['wxGridCellFloatEditor', 'SetParameters' ]}. + +{class, wxGridCellStringRenderer, wxGridCellRenderer, [], ['wxGridCellStringRenderer']}. +{class, wxGridCellTextEditor, wxGridCellEditor, [], + ['wxGridCellTextEditor','SetParameters']}. +{class, wxGridCellChoiceEditor, wxGridCellEditor, [{skip, [{'wxGridCellChoiceEditor', 3}]}], + ['wxGridCellChoiceEditor','SetParameters']}. + +{class, wxGridCellNumberRenderer, wxGridCellStringRenderer, [], + ['wxGridCellNumberRenderer']}. +{class, wxGridCellNumberEditor, wxGridCellTextEditor, [], + ['wxGridCellNumberEditor','GetValue','SetParameters']}. + {class, wxGridCellAttr, root, [], [%'wxGridCellAttr','Clone','IncRef','DecRef', 'SetTextColour','SetBackgroundColour','SetFont','SetAlignment','SetReadOnly', @@ -746,7 +770,7 @@ 'SetItemBackgroundColour','SetItemCount','SetItemData','SetItemFont', 'SetItemImage','SetItemColumnImage','SetItemPosition','SetItemState', 'SetItemText','SetItemTextColour','SetSingleStyle','SetTextColour', - 'SetWindowStyleFlag'%,'SortItems' + 'SetWindowStyleFlag',{'SortItems', [{where, taylormade}]} ]}. {class, wxListView, wxControl, [], ['ClearColumnImage','Focus','GetFirstSelected','GetFocusedItem', @@ -905,7 +929,7 @@ ['wxStaticBitmap','Create','GetBitmap','SetBitmap' %%wxStaticIcon::GetIcon wxStaticIcon::SetIcon ]}. -{class, wxRadioBox, wxControlWithItems, [], +{class, wxRadioBox, wxControl, [], [{'wxRadioBox',9},'~wxRadioBox',{'Create',9},'Enable', 'GetSelection','GetString', 'SetSelection','Show', 'GetColumnCount','GetItemHelpText','GetItemToolTip','GetItemFromPoint', @@ -1130,9 +1154,9 @@ 'ShowHint','UnInit','Update']}. {class, wxAuiPaneInfo, root, [{ifdef, wxUSE_AUI}], -%%wxAuiPaneInfo::wxAuiPaneInfo -%%wxAuiPaneInfo::~wxAuiPaneInfo - ['BestSize','Bottom','BottomDockable','Caption','CaptionVisible', + [ + wxAuiPaneInfo,'~wxAuiPaneInfo', + 'BestSize','Bottom','BottomDockable','Caption','CaptionVisible', 'Centre','CentrePane','CloseButton','DefaultPane','DestroyOnClose', 'Direction','Dock',%'DockFixed', 'Dockable','Fixed','Float', @@ -1667,4 +1691,87 @@ ]}. +{class, wxHtmlWindow, wxScrolledWindow, [], + [ + 'wxHtmlWindow',%'AddFilter', + 'AppendToPage', + %%'GetInternalRepresentation', + 'GetOpenedAnchor', + 'GetOpenedPage','GetOpenedPageTitle','GetRelatedFrame', + 'HistoryBack', 'HistoryCanBack','HistoryCanForward','HistoryClear','HistoryForward', + 'LoadFile','LoadPage', + %%'OnCellClicked','OnCellMouseHover','OnLinkClicked',OnOpeningURL, OnSetTitle + %'ReadCustomization', + 'SelectAll','SelectionToText','SelectLine','SelectWord', + 'SetBorders','SetFonts','SetPage','SetRelatedFrame','SetRelatedStatusBar', + 'ToText' + %%'WriteCustomization' + ]}. + + +{class, wxHtmlLinkEvent, wxCommandEvent, + [{acc, [{m_linkInfo, "GetLinkInfo()"}]}, + {event, [wxEVT_COMMAND_HTML_LINK_CLICKED]}], + ['GetLinkInfo']}. + +%% New No wxAuiToolBar yet..add when documentation exists +%% {class, wxAuiToolBarEvent, wxNotifyEvent, +%% [{acc, [{is_dropdown_clicked, "IsDropDownClicked()"}, +%% {click_pt, "GetClickPoint()"}, +%% {rect, "GetItemRect()"}, +%% {tool_id, "GetToolId()"}]}, +%% {event, [wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, +%% wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, +%% wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, +%% wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG +%% ]}], +%% ['IsDropDownClicked', 'SetDropDownClicked', 'SetClickPoint', +%% 'GetItemRect', 'SetItemRect', 'GetToolId', 'SetToolId' +%% ]}. + +{class, wxAuiNotebookEvent, wxNotifyEvent, + [{acc, [{old_selection, "GetOldSelection()"}, + {selection, "GetSelection()"}, + {drag_source, "GetDragSource()"}]}, + {event, [wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, + wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, + wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, + wxEVT_COMMAND_AUINOTEBOOK_BUTTON, + wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, + wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, + wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, + wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, + {wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, {test_if, "wxCHECK_VERSION(2,8,5)"}}, + {wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, {test_if, "wxCHECK_VERSION(2,8,5)"}}, + {wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, {test_if, "wxCHECK_VERSION(2,8,5)"}}, + {wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, {test_if, "wxCHECK_VERSION(2,8,5)"}}, + {wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, {test_if, "wxCHECK_VERSION(2,8,5)"}}, + {wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, {test_if, "wxCHECK_VERSION(2,8,5)"}}, + {wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, {test_if, "wxCHECK_VERSION(2,8,5)"}} + ]}], + ['SetSelection', 'GetSelection', 'SetOldSelection', 'GetOldSelection', + 'SetDragSource', 'GetDragSource' + ]}. + + +{class, wxAuiManagerEvent, wxEvent, + [{acc, [{button, "GetButton()"}, + {dc, "GetDC()"}, + {pane, "GetPane()"}, + {manager, "GetManager()"} + ]}, + {event, [wxEVT_AUI_PANE_BUTTON, + wxEVT_AUI_PANE_CLOSE, + wxEVT_AUI_PANE_MAXIMIZE, + wxEVT_AUI_PANE_RESTORE, + wxEVT_AUI_RENDER, + wxEVT_AUI_FIND_MANAGER + ]}], + [ + 'SetManager', 'GetManager','SetPane','GetPane','SetButton','GetButton', + 'SetDC', 'GetDC', 'Veto', 'GetVeto', 'SetCanVeto', 'CanVeto' + ]}. +{class, wxLogNull, root, [], + [wxLogNull, '~wxLogNull']}. + diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/wx_doxygen.conf erlang-13.b.3-dfsg/lib/wx/api_gen/wx_doxygen.conf --- erlang-13.b.1-dfsg/lib/wx/api_gen/wx_doxygen.conf 2009-06-05 13:54:27.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/wx_doxygen.conf 2009-09-18 15:10:47.000000000 +0100 @@ -249,7 +249,7 @@ wxUSE_DATAOBJ=1 \ wxUSE_SLIDER=1 \ wxUSE_CLIPBOARD=1 \ - wxABI_VERSION=20603 \ + wxABI_VERSION=20809 \ __WXGTK24__=1 \ __WXGTK__=1 \ WXDLLEXPORT="" diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/wx_extra/bugs.h erlang-13.b.3-dfsg/lib/wx/api_gen/wx_extra/bugs.h --- erlang-13.b.1-dfsg/lib/wx/api_gen/wx_extra/bugs.h 2009-04-16 10:25:11.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/wx_extra/bugs.h 2009-11-20 13:34:33.000000000 +0000 @@ -13,4 +13,24 @@ { public: wxObject xrcctrl(wxWindow *Window, wxString Name, wxString Type); -} +}; + +// The generater needs constructors +class WXDLLIMPEXP_ADV wxGridCellBoolRenderer : public wxGridCellRenderer +{ + public: + wxGridCellBoolRenderer(); +}; + +class WXDLLIMPEXP_ADV wxGridCellStringRenderer : public wxGridCellRenderer +{ + public: + wxGridCellStringRenderer(); +}; + +class WXDLLIMPEXP_ADV wxGridCellNumberRenderer : public wxGridCellStringRenderer +{ + public: + wxGridCellNumberRenderer(); +}; + diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/wx_extra/wxListCtrl.c_src erlang-13.b.3-dfsg/lib/wx/api_gen/wx_extra/wxListCtrl.c_src --- erlang-13.b.1-dfsg/lib/wx/api_gen/wx_extra/wxListCtrl.c_src 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/wx_extra/wxListCtrl.c_src 2009-09-18 15:11:30.000000000 +0100 @@ -0,0 +1,24 @@ +<port = Ecmd.port; + cb->callbackID = sortCallback; + bool Result = This->SortItems(wxEListCtrlCompare, (long)cb); + delete cb; + + /* Destroy the callback, see wxEPrintout::clear_cb */ + wxeReturn cbrt = wxeReturn(WXE_DRV_PORT, memenv->owner, false); + // NOTE: Remove this later when changing from funs to gen_server + cbrt.addAtom("wx_delete_cb"); + cbrt.addInt(sortCallback); + cbrt.addTupleCount(2); + cbrt.send(); + + rt.addBool(Result); + break; +} +SortItems>> diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/wx_extra/wxListCtrl.erl erlang-13.b.3-dfsg/lib/wx/api_gen/wx_extra/wxListCtrl.erl --- erlang-13.b.1-dfsg/lib/wx/api_gen/wx_extra/wxListCtrl.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/wx_extra/wxListCtrl.erl 2009-09-18 15:11:30.000000000 +0100 @@ -0,0 +1,39 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +<> + +< boolean() +%% @doc Sort the items in the list control
    +%%

    SortCalBack(Item1,Item2) -> integer()
    +%%
    SortCallBack receives the client data associated with two items +%% to compare, and should return 0 if the items are equal, a negative +%% value if the first item is less than the second one and a positive +%% value if the first item is greater than the second one. +%%
    NOTE: The callback may not call other processes. +sortItems(#wx_ref{type=ThisT,ref=ThisRef}, SortCallBack) + when is_function(SortCallBack, 2) -> + ?CLASS(ThisT,wxListCtrl), + Sort = fun([Item1,Item2]) -> + Result = SortCallBack(Item1,Item2), + <> + end, + SortId = wxe_util:get_cbId(Sort), + wxe_util:call(~s, <>). +SortItems>> diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/wx_gen_cpp.erl erlang-13.b.3-dfsg/lib/wx/api_gen/wx_gen_cpp.erl --- erlang-13.b.1-dfsg/lib/wx/api_gen/wx_gen_cpp.erl 2009-06-05 13:54:27.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/wx_gen_cpp.erl 2009-11-20 13:34:32.000000000 +0000 @@ -172,8 +172,7 @@ w(" ((WxeApp *) wxTheApp)->clearPtr((void *) This);~n"), w(" delete This; }~n } break; ~n"), w(" case WXE_REGISTER_OBJECT: {~n" - " wxeErlTerm * term = new wxeErlTerm(Ecmd.bin[0]);~n" - " registerPid(bp, term, memenv);~n" + " registerPid(bp, Ecmd.caller, memenv);~n" " rt.addAtom(\"ok\");~n" " break;~n" " }~n"), @@ -184,8 +183,9 @@ w(" wxeReturn error = wxeReturn(WXE_DRV_PORT, Ecmd.caller, false);"), w(" error.addAtom(\"_wxe_error_\");~n"), w(" error.addInt((int) Ecmd.op);~n"), - w(" error.addAtom(\"undef\");~n"), + w(" error.addAtom(\"not_supported\");~n"), w(" error.addTupleCount(3);~n"), + w(" error.send();~n"), w(" return ;~n"), w(" }~n"), w("} // switch~n"), @@ -325,10 +325,10 @@ declare_type(N,true,Def,#type{base=Base,single=true,name=Type,by_val=false,ref={pointer,1}}) when Base =:= int; Base =:= long; Base =:= float; Base =:= double; Base =:= bool -> w(" ~s *~s=~s;~n", [Type,N,Def]); -declare_type(N,true,Def,#type{single=true,name="wxString"}) -> - w(" wxString ~s= ~s;~n", [N,Def]); declare_type(N,true,Def,#type{single=true,name="wxArtClient"}) -> w(" wxArtClient ~s= ~s;~n", [N,Def]); +declare_type(N,true,Def,#type{single=true,base=string}) -> + w(" wxString ~s= ~s;~n", [N,Def]); %% declare_type(N,true,_Def,#type{name="wxString"}) -> %% w(" wxString ~s= wxEmptyString;~n", [N]); declare_type(N,true,Def,#type{base=binary, name=char}) -> @@ -405,11 +405,14 @@ A = align(A0,64), w(" long * ~s = (~s *) bp; bp += 8;~n", [N,Type]), A; -decode_arg(N,#type{base=int,single=true,mod=Mod0,name=Type},Arg,A0) -> +decode_arg(N,#type{base=int,single=true,mod=Mod0,name=Type,ref=Ref},Arg,A0) -> Mod = mods(Mod0), case Arg of arg -> w(" ~s~s * ~s = (~s~s *) bp; bp += 4;~n", [Mod,int,N,Mod,int]); - opt -> w(" ~s = (~s)*(~s~s *) bp; bp += 4;~n", [N,Type,Mod,int]) + opt when Ref =:= {pointer,1} -> + w(" ~s = (~s *) bp; bp += 4;~n", [N,int]); + opt -> + w(" ~s = (~s)*(~s~s *) bp; bp += 4;~n", [N,Type,Mod,int]) end, align(A0,32); decode_arg(N,#type{base=float,single=true,name=Type},arg,A0) -> @@ -485,8 +488,13 @@ wa(" wxString", []," ~s = wxString(bp, wxConvUTF8);~n", [N],Arg), w(" bp += *~sLen+((8-((~p+ *~sLen) & 7)) & 7);~n", [N,4*((A0+1) rem 2),N]), 0; -decode_arg(N,#type{base=[int], name=Name},Arg,A0) - when Name =:= "wxString"; Name =:= "wxArtClient" -> +decode_arg(N,#type{base=string, name="wxFileName"},Arg,A0) -> + w(" int * ~sLen = (int *) bp; bp += 4;~n", [N]), + wa(" wxString", []," ~sStr = wxString(bp, wxConvUTF8);~n", [N],Arg), + w(" bp += *~sLen+((8-((~p+ *~sLen) & 7)) & 7);~n", [N,4*((A0+1) rem 2),N]), + w(" wxFileName ~s = wxFileName(~sStr);~n",[N,N]), + 0; +decode_arg(N,#type{base=string},Arg,A0) -> w(" int * ~sLen = (int *) bp; bp += 4;~n", [N]), wa(" wxString", []," ~s = wxString(bp, wxConvUTF8);~n", [N],Arg), w(" bp += *~sLen+((8-((~p+ *~sLen) & 7)) & 7);~n", [N,4*((A0+1) rem 2),N]), @@ -855,7 +863,7 @@ w(" rt.add(~s);~n", [Name]); build_ret(Name,_,#type{base={enum,_Type},single=true}) -> w(" rt.addInt(~s);~n",[Name]); -build_ret(Name,_,#type{base={comp,_,{record, wxMouseState}},single=true}) -> +build_ret(Name,_,#type{base={comp,_,{record, _}},single=true}) -> w(" rt.add(~s);~n", [Name]); build_ret(Name,_,#type{base={comp,_,_},single=true, ref=reference}) -> w(" rt.add((*~s));~n",[Name]); @@ -897,7 +905,7 @@ w(" rt.addFloat(~s);~n",[Name]); build_ret(Name,_,#type{base=double,single=true}) -> w(" rt.addFloat(~s);~n",[Name]); -build_ret(Name,_,#type{name="wxString",single=true}) -> +build_ret(Name,_,#type{base=string,single=true}) -> w(" rt.add(~s);~n",[Name]); build_ret(Name,_,#type{name="wxArrayString", single=array}) -> w(" rt.add(~s);~n", [Name]); @@ -989,6 +997,9 @@ w("#include ~n"), w("#include ~n"), w("#include ~n"), + w("#include ~n"), + w("#include ~n"), + w("#include ~n"), w("~n~n", []), [w("#define ~s_~s ~p~n", [Class,Name,Id]) || @@ -1037,7 +1048,7 @@ initEventTable(Evs) -> w("void initEventTable() ~n{~n"), w(" struct { ",[]), - w("int ev_type; int class_id; char * ev_name;} event_types[] = ~n {~n",[]), + w("int ev_type; int class_id; const char * ev_name;} event_types[] = ~n {~n",[]), lists:foreach(fun(Ev) -> init_event_classes(Ev) end, [#class{id=0,event=[wxEVT_NULL]}|Evs]), @@ -1062,6 +1073,11 @@ F = fun({Eev, Cev, OtherClass}) -> w(" {~w + wxEVT_USER_FIRST, ~w, ~p},~n", [Cev, find_id(OtherClass), wx_gen_erl:event_type_name(Eev)]); + ({Ev, {test_if, Test}}) -> + w("#if ~s ~n", [Test]), + w(" {~w, ~w, ~p},~n", + [Ev, Id, wx_gen_erl:event_type_name(Ev)]), + w("#endif ~n", []); (Ev) -> w(" {~w, ~w, ~p},~n", [Ev, Id, wx_gen_erl:event_type_name(Ev)]) diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/wx_gen.erl erlang-13.b.3-dfsg/lib/wx/api_gen/wx_gen.erl --- erlang-13.b.1-dfsg/lib/wx/api_gen/wx_gen.erl 2009-06-05 13:54:28.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/wx_gen.erl 2009-09-18 15:10:50.000000000 +0100 @@ -753,12 +753,16 @@ parse_type2([N="wxMouseState"|R],Info,Opts,T) -> parse_type2(R,Info,Opts,T#type{name=N, base={comp,N,{record, wxMouseState}}}); +parse_type2([N="wxHtmlLinkInfo"|R],Info,Opts,T) -> + parse_type2(R,Info,Opts,T#type{name=N, base={comp,N,{record, wxHtmlLinkInfo}}}); parse_type2([N="wxString"|R],Info,Opts,T) -> - parse_type2(R,Info,Opts,T#type{name=N,base=[int]}); + parse_type2(R,Info,Opts,T#type{name=N,base=string}); parse_type2([N="wxArtClient"|R],Info,Opts,T) -> - parse_type2(R,Info,Opts,T#type{name=N,base=[int]}); + parse_type2(R,Info,Opts,T#type{name=N,base=string}); parse_type2(["wxArtID"|R],Info,Opts,T) -> - parse_type2(R,Info,Opts,T#type{name="wxString",base=[int]}); + parse_type2(R,Info,Opts,T#type{name="wxString",base=string}); +parse_type2([N="wxFileName"|R],Info,Opts,T) -> + parse_type2(R,Info,Opts,T#type{name=N,base=string}); parse_type2([N="wxArrayString"|R],Info,Opts,T) -> parse_type2(R,Info,Opts,T#type{name=N,base=[int],single=array,by_val=true}); parse_type2([{by_ref,Ref}|R],Info,Opts,T) -> @@ -1072,6 +1076,7 @@ end. type_foot_print(#type{single=Single}) when Single =/= true -> list; +type_foot_print(#type{base=string}) -> list; type_foot_print(#type{base=Base}) when is_list(Base) -> list; type_foot_print(#type{base=long}) -> int; type_foot_print(#type{base=binary}) -> binary; @@ -1216,7 +1221,7 @@ %%% Enums parse_enums(Files) -> - DontSearch = ["wxchar","filefn", "platform", "strconv", + DontSearch = ["wxchar","filefn", "platform", "strconv", "filename", "buffer", "string", "debug", "platinfo"], %% Arg need to patch some specials, atleast for wx-2.6 ExtraSearch = ["gtk_2glcanvas", "generic_2splash"], @@ -1305,19 +1310,32 @@ end; extract_enum3([#xmlElement{name=initializer, - content=[#xmlText{value=V}]}|_],_Id,[{Name,_}|Acc]) -> - Val0 = string:strip(V), + content=Cs=[#xmlText{}|_]}|_],_Id,[{Name,_}|Acc]) -> + + String = lists:append([string:strip(C#xmlText.value) || C <- Cs]), + + Val0 = gen_util:tokens(String,"<& "), + try case Val0 of - "0x" ++ Val1 -> + ["0x" ++ Val1] -> Val = http_util:hexlist_to_integer(Val1), {[{Name, Val}|Acc], Val+1}; - _ -> - Val = list_to_integer(Val0), - {[{Name, Val}|Acc], Val+1} + [Single] -> + Val = list_to_integer(Single), + {[{Name, Val}|Acc], Val+1}; + ["1", "<<", Shift] -> + Val = 1 bsl list_to_integer(Shift), + {[{Name, Val}|Acc], Val+1}; + [_Str, "+", _What] -> + Val = lists:append(Val0), + {[{Name, {Val, 0}}|Acc], {Val,1}}; + _What -> + %% io:format("~p Name ~p ~p~n",[?LINE, Name, Val0]), + throw(below) end - catch _:_ -> - {[{Name,{Val0,0}}|Acc], {Val0,1}} + catch _:_ -> + {[{Name,{String,0}}|Acc], {String,1}} end; extract_enum3([_|R], Id, Acc) -> extract_enum3(R, Id, Acc); diff -Nru erlang-13.b.1-dfsg/lib/wx/api_gen/wx_gen_erl.erl erlang-13.b.3-dfsg/lib/wx/api_gen/wx_gen_erl.erl --- erlang-13.b.1-dfsg/lib/wx/api_gen/wx_gen_erl.erl 2009-04-16 10:25:11.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/api_gen/wx_gen_erl.erl 2009-11-20 13:34:33.000000000 +0000 @@ -364,20 +364,17 @@ taylormade_func(Class, #method{name=Name, id=Id}) -> {ok, Bin} = file:read_file(filename:join([wx_extra, Class ++".erl"])), Str0 = binary_to_list(Bin), - {match, Start, Len} = regexp:first_match(Str0, "<<" ++ Name), - {match, End, _} = regexp:first_match(Str0, Name ++ ">>"), - Str1 = string:substr(Str0, Start+Len, End-Start-Len), - %% {ok, Str, _} = regexp:sub(Str1, "FUNCID", integer_to_list(Id)), + {match, [Str1]} = re:run(Str0, "<<"++Name++"(.*)"++Name++">>", + [dotall, {capture, all_but_first, list}]), + w(Str1, ["?" ++ get_unique_name(Id)]), ok. taylormade_export(Class, #method{name=Name}) -> {ok, Bin} = file:read_file(filename:join([wx_extra, Class ++".erl"])), Str0 = binary_to_list(Bin), - {match, Start, Len} = regexp:first_match(Str0, "<>"), - Str1 = string:substr(Str0, Start+Len, End-Start-Len), - %% {ok, Str, _} = regexp:sub(Str1, "FUNCID", integer_to_list(Id)), + {match, [Str1]} = re:run(Str0, "<>", + [dotall, {capture, all_but_first, list}]), Str1. %%%%%%%%%%%%%%% @@ -433,15 +430,15 @@ Name = erl_arg_name(Name0), w(" wxe_util:send_bin(~s),~s", [Name,EOS]), Acc; -arg_type_test(#param{name=Name0,type=#type{name=Type,single=Single}},EOS,Acc) -> +arg_type_test(#param{name=Name0,type=#type{name=Type,base=Base,single=Single}},EOS,Acc) -> if - Type =:= "wxString" orelse (Type =:= "wxChar" andalso Single =/= true) -> - Name = erl_arg_name(Name0), - w(" ~s_UC = unicode:characters_to_binary([~s,0]),~s", [Name,Name,EOS]); Type =:= "wxArtClient", Single =:= true -> Name = erl_arg_name(Name0), w(" ~s_UC = unicode:characters_to_binary([~s, $_, $C,0]),~s", [Name,Name, EOS]); + Base =:= string orelse (Type =:= "wxChar" andalso Single =/= true) -> + Name = erl_arg_name(Name0), + w(" ~s_UC = unicode:characters_to_binary([~s,0]),~s", [Name,Name,EOS]); Type =:= "wxArrayString" -> Name = erl_arg_name(Name0), w(" ~s_UCA = [unicode:characters_to_binary([~sTemp,0]) || ~s", @@ -533,7 +530,7 @@ func_arg(#param{def=Def}) when Def =/= none -> skip; func_arg(#param{in=false}) -> skip; func_arg(#param{where=c}) -> skip; -func_arg(#param{name=Name,type=#type{name="wxString"}}) -> +func_arg(#param{name=Name,type=#type{base=string}}) -> erl_arg_name(Name); func_arg(#param{name=Name,type=#type{name="wxArrayString"}}) -> erl_arg_name(Name); @@ -567,7 +564,7 @@ guard_test(#param{def=Def}) when Def =/= none -> skip; guard_test(#param{where=c}) -> skip; guard_test(#param{in=In}) when In == false -> skip; -guard_test(#param{name=N, type=#type{name="wxString"}}) -> +guard_test(#param{name=N, type=#type{base=string}}) -> "is_list(" ++ erl_arg_name(N) ++")"; guard_test(#param{name=N, type=#type{name="wxArtClient"}}) -> "is_list(" ++ erl_arg_name(N) ++")"; @@ -765,7 +762,7 @@ doc_arg_type2(T) -> doc_arg_type3(T). -doc_arg_type3(#type{name="wxString"}) -> "string()"; +doc_arg_type3(#type{base=string}) -> "string()"; doc_arg_type3(#type{name="wxChar", single=S}) when S =/= true -> "string()"; doc_arg_type3(#type{name="wxArrayString"}) -> "[string()]"; doc_arg_type3(#type{name="wxDateTime"}) -> "wx:datetime()"; @@ -942,8 +939,7 @@ align(32,Align0, "(byte_size("++Name++"_UC)):32/?UI,(" ++ Name ++ "_UC)/binary"), MsgSize = "(" ++ integer_to_list(Align*4)++"+byte_size("++Name++"_UC))", {Str++", 0:(((8- (" ++ MsgSize ++" band 16#7)) band 16#7))/unit:8",0}; -marshal_arg(#type{base=[int], name=Type}, Name, Align0) - when Type =:= "wxString"; Type =:= "wxArtClient" -> +marshal_arg(#type{base=string}, Name, Align0) -> {Str,Align} = align(32,Align0, "(byte_size("++Name++"_UC)):32/?UI,(" ++ Name ++ "_UC)/binary"), MsgSize = "(" ++ integer_to_list(Align*4)++"+byte_size("++Name++"_UC))", @@ -1028,6 +1024,9 @@ " leftDown, middleDown, rightDown, %% bool() ~n" " controlDown, shiftDown, altDown, metaDown, cmdDown %% bool()~n" " }).~n", []), + w("-record(wxHtmlLinkInfo, { ~n" + " href, target %% string() ~n" + " }).~n", []), w("~n%% Hardcoded Defines ~n", []), Enums = [E || E = {{enum,_},#enum{as_atom=false}} <- get()], w("-define(wxDefaultSize, {-1,-1}).~n", []), @@ -1176,15 +1175,18 @@ reverse(Name1). event_type_name({EvN,_,_}) -> event_type_name(EvN); +event_type_name({EvN,_}) -> event_type_name(EvN); event_type_name(EvN) -> "wxEVT_" ++ Ev = atom_to_list(EvN), lowercase_all(Ev). event_attr_name("m_" ++ Attr) -> + lowercase(Attr); +event_attr_name(Attr) -> lowercase(Attr). -gen_funcnames() -> +gen_funcnames() -> open_write("../src/gen/wxe_debug.hrl"), erl_copyright(), w("%% This file is generated DO NOT EDIT~n~n", []), diff -Nru erlang-13.b.1-dfsg/lib/wx/AUTHORS erlang-13.b.3-dfsg/lib/wx/AUTHORS --- erlang-13.b.1-dfsg/lib/wx/AUTHORS 2009-03-12 12:26:21.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/AUTHORS 2009-09-18 15:11:09.000000000 +0100 @@ -5,3 +5,6 @@ Mats-Ola Persson wrote the the initial wxWidgets binding as part of his master thesis. + +Olle Mattsson wrote most of the demo in examples. + diff -Nru erlang-13.b.1-dfsg/lib/wx/config.mk.in erlang-13.b.3-dfsg/lib/wx/config.mk.in --- erlang-13.b.1-dfsg/lib/wx/config.mk.in 2009-03-12 12:26:29.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/config.mk.in 2009-09-18 15:11:17.000000000 +0100 @@ -29,5 +29,7 @@ RELSYSDIR = $(RELEASE_PATH)/lib/wx-$(VSN) +else +INSTALLDIR=@ERLANG_ROOT_DIR@/lib endif diff -Nru erlang-13.b.1-dfsg/lib/wx/configure erlang-13.b.3-dfsg/lib/wx/configure --- erlang-13.b.1-dfsg/lib/wx/configure 2009-06-07 19:02:11.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/configure 2009-11-24 10:12:50.000000000 +0000 @@ -308,7 +308,7 @@ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os TARGET CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX RANLIB ac_ct_RANLIB CPP MIXED_CYGWIN_VC MIXED_CYGWIN_MINGW MIXED_CYGWIN DEBUG_CFLAGS DEBUG_CXXFLAGS ERLC WX_BUILDING_INSIDE_ERLSRC ERLANG_ROOT_DIR WX_CONFIG_PATH WX_CPPFLAGS WX_CFLAGS WX_CXXFLAGS WX_CFLAGS_ONLY WX_CXXFLAGS_ONLY WX_LIBS WX_LIBS_STATIC WX_VERSION WX_RESCOMP DEBUG_WX_CFLAGS DEBUG_WX_CXXFLAGS DEBUG_WX_LIBS DEBUG_WX_LIBS_STATIC WX_HAVE_STATIC_LIBS RC_FILE_TYPE EGREP HAVE_GL_SUPPORT TESS_CB_TIGER_STYLE WXERL_CAN_BUILD_DRIVER SO_EXT RUN_ERL WXERL_SYS_TYPE LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os TARGET CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX RANLIB ac_ct_RANLIB CPP MIXED_CYGWIN_VC MIXED_CYGWIN_MINGW MIXED_CYGWIN EGREP DEBUG_CFLAGS DEBUG_CXXFLAGS ERLC WX_BUILDING_INSIDE_ERLSRC ERLANG_ROOT_DIR WX_CONFIG_PATH WX_CPPFLAGS WX_CFLAGS WX_CXXFLAGS WX_CFLAGS_ONLY WX_CXXFLAGS_ONLY WX_LIBS WX_LIBS_STATIC WX_VERSION WX_RESCOMP DEBUG_WX_CFLAGS DEBUG_WX_CXXFLAGS DEBUG_WX_LIBS DEBUG_WX_LIBS_STATIC FORCED_DEBUG_BUILD WX_HAVE_STATIC_LIBS RC_FILE_TYPE HAVE_GL_SUPPORT TESS_CB_TIGER_STYLE WXERL_CAN_BUILD_DRIVER SO_EXT RUN_ERL WXERL_SYS_TYPE LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -1308,7 +1308,7 @@ ac_aux_dir= -for ac_dir in autoconf; do +for ac_dir in $srcdir/autoconf; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" @@ -1324,8 +1324,8 @@ fi done if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in autoconf" >&5 -echo "$as_me: error: cannot find install-sh or install.sh in autoconf" >&2;} + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir/autoconf" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir/autoconf" >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" @@ -1335,6 +1335,11 @@ +## Delete previous failed configure results +if test -f ./CONF_INFO; then + rm ./CONF_INFO +fi + if test -z "$ERL_TOP" || test ! -d $ERL_TOP ; then ac_aux_dir= for ac_dir in autoconf; do @@ -3158,125 +3163,194 @@ -PTHR_CFLAGS="-D_THREAD_SAFE -D_REENTRANT" -case $host_os in - darwin*) - C_ONLY_FLAGS="-ObjC" - CPPFLAGS="$CPPFLAGS -D_MACOSX $PTHR_CFLAGS" - ;; - mingw32) - CFLAGS="$CFLAGS -DWIN32 -DWINVER=0x0500 -D_WINDOWS -D_UNICODE -DUNICODE" - CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0500" - { echo "$as_me:$LINENO: WARNING: Reverting to 32-bit time_t" >&5 -echo "$as_me: WARNING: Reverting to 32-bit time_t" >&2;} - CPPFLAGS="$CPPFLAGS -D_USE_32BIT_TIME_T" - ;; - win32) - CFLAGS="$CFLAGS -DWIN32 -DWINVER=0x0500 -D_WINDOWS -D_UNICODE -DUNICODE" - CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0500" - ;; - *) - CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE $PTHR_CFLAGS" - ;; -esac +## Check that we are in 32 bits mode on darwin +## (wxWidgets require that it currently uses 32-bits Carbon) +## Otherwise skip building wxErlang -case $host_os in - darwin*) - CFLAGS="-no-cpp-precomp" - LDFLAGS="-bundle -flat_namespace -undefined suppress -fPIC -framework OpenGL" - ;; - win32) - LDFLAGS="-dll" - ;; - mingw32) - LDFLAGS="-shared -fPIC" - ;; - *) - CFLAGS= - LDFLAGS="-shared -fPIC" - ;; -esac +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep -case $host_os in - mingw32) - DEBUG_CFLAGS="-g -Wall -DDEBUG $CFLAGS" - CFLAGS="-g -Wall -O2 -fomit-frame-pointer -fno-strict-aliasing $CFLAGS" - ;; - win32) - DEBUG_CFLAGS="-g -Wall -DDEBUG $CFLAGS" - CFLAGS="-g -Wall -O2 $CFLAGS" - ;; - *) - DEBUG_CFLAGS="-g -Wall -fPIC -DDEBUG $CFLAGS" - CFLAGS="-g -Wall -O2 -fPIC -fomit-frame-pointer -fno-strict-aliasing $CFLAGS" - ;; -esac -CXXFLAGS="$CFLAGS $CPPFLAGS" -CFLAGS="$CFLAGS $CPPFLAGS $C_ONLY_FLAGS" +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include -DEBUG_CXXFLAGS="$DEBUG_CFLAGS $CPPFLAGS" -DEBUG_CFLAGS="$DEBUG_CFLAGS $CPPFLAGS $C_ONLY_FLAGS" +int +main () +{ + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include -if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then - echo "$as_me:$LINENO: checking for erl" >&5 -echo $ECHO_N "checking for erl... $ECHO_C" >&6 - if test X$ERL != X; then - echo "$as_me:$LINENO: result: yes; using $ERL" >&5 -echo "${ECHO_T}yes; using $ERL" >&6 - else - type erl >/dev/null 2>&1 - if test $? -eq 0 ; then - ERL=erl - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - else - { { echo "$as_me:$LINENO: error: Cannot find erl in path" >&5 -echo "$as_me: error: Cannot find erl in path" >&2;} - { (exit 1); exit 1; }; } - fi - fi - echo "$as_me:$LINENO: checking for erlc" >&5 -echo $ECHO_N "checking for erlc... $ECHO_C" >&6 - if test X$ERLC != X; then - echo "$as_me:$LINENO: result: yes; using $ERLC" >&5 -echo "${ECHO_T}yes; using $ERLC" >&6 - else - type erlc >/dev/null 2>&1 - if test $? -eq 0 ; then - ERLC=erlc - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - else - { { echo "$as_me:$LINENO: error: Cannot find erlc in path" >&5 -echo "$as_me: error: Cannot find erlc in path" >&2;} - { (exit 1); exit 1; }; } - fi - fi - ERLANG_ROOT_DIR=`echo 'io:format("~n~s~n", [code:root_dir()]), halt().' | erl | tail +3` - { echo "$as_me:$LINENO: ERL ROOT DIR: $ERLANG_ROOT_DIR" >&5 -echo "$as_me: ERL ROOT DIR: $ERLANG_ROOT_DIR" >&6;} +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : else - ERLC=erlc - ERL=erl - ERLANG_ROOT_DIR=$ERL_TOP + ac_cv_header_stdc=no +fi +rm -f conftest* fi +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* +fi -if test X"$MIXED_CYGWIN_VC" != X"yes" ; then +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF +fi +# On IRIX 5.3, sys/types and inttypes.h are conflicting. @@ -3286,266 +3360,623 @@ +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF +fi -# Check whether --with-wxdir or --without-wxdir was given. -if test "${with_wxdir+set}" = set; then - withval="$with_wxdir" - wx_config_name="$withval/wx-config" - wx_config_args="--inplace" -fi; +done -# Check whether --with-wx-config or --without-wx-config was given. -if test "${with_wx_config+set}" = set; then - withval="$with_wx_config" - wx_config_name="$withval" -fi; -# Check whether --with-wx-prefix or --without-wx-prefix was given. -if test "${with_wx_prefix+set}" = set; then - withval="$with_wx_prefix" - wx_config_prefix="$withval" +echo "$as_me:$LINENO: checking for void *" >&5 +echo $ECHO_N "checking for void *... $ECHO_C" >&6 +if test "${ac_cv_type_void_p+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 else - wx_config_prefix="" -fi; + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((void * *) 0) + return 0; +if (sizeof (void *)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_void_p=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -# Check whether --with-wx-exec-prefix or --without-wx-exec-prefix was given. -if test "${with_wx_exec_prefix+set}" = set; then - withval="$with_wx_exec_prefix" - wx_config_exec_prefix="$withval" +ac_cv_type_void_p=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_void_p" >&5 +echo "${ECHO_T}$ac_cv_type_void_p" >&6 + +echo "$as_me:$LINENO: checking size of void *" >&5 +echo $ECHO_N "checking size of void *... $ECHO_C" >&6 +if test "${ac_cv_sizeof_void_p+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 else - wx_config_exec_prefix="" -fi; + if test "$ac_cv_type_void_p" = yes; then + # The cast to unsigned long works around a bug in the HP C Compiler + # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects + # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. + # This bug is HP SR number 8606223364. + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= 0)]; +test_array [0] = 0 - reqwx=2.8.0 - # Try to find debug libs first - # wxelibs=core,base,gl,aui,adv + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)]; +test_array [0] = 0 - echo "$as_me:$LINENO: checking for debug build of WxWidgets" >&5 -echo $ECHO_N "checking for debug build of WxWidgets... $ECHO_C" >&6 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 +ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 - if test x${WX_CONFIG_NAME+set} != xset ; then - WX_CONFIG_NAME=wx-config - fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (void *))) < 0)]; +test_array [0] = 0 - if test "x$wx_config_name" != x ; then - WX_CONFIG_NAME="$wx_config_name" - fi + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (void *))) >= $ac_mid)]; +test_array [0] = 0 - if test x$wx_config_exec_prefix != x ; then - wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" - WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" - fi - if test x$wx_config_prefix != x ; then - wx_config_args="$wx_config_args --prefix=$wx_config_prefix" - WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" - fi - if test "$cross_compiling" = "yes"; then - wx_config_args="$wx_config_args --host=$host_alias" - fi + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 - if test -x "$WX_CONFIG_NAME" ; then - echo "$as_me:$LINENO: checking for wx-config" >&5 -echo $ECHO_N "checking for wx-config... $ECHO_C" >&6 - WX_CONFIG_PATH="$WX_CONFIG_NAME" - echo "$as_me:$LINENO: result: $WX_CONFIG_PATH" >&5 -echo "${ECHO_T}$WX_CONFIG_PATH" >&6 - else - # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args. -set dummy $WX_CONFIG_NAME; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_path_WX_CONFIG_PATH+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done else - case $WX_CONFIG_PATH in - [\\/]* | ?:[\\/]*) - ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy=""$WX_LOOKUP_PATH:$PATH"" -for as_dir in $as_dummy -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_lo= ac_hi= +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (void *))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_lo=`expr '(' $ac_mid ')' + 1` +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done +case $ac_lo in +?*) ac_cv_sizeof_void_p=$ac_lo;; +'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77 +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (void *), 77 +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } ;; +esac +else + if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run test program while cross compiling +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +long longval () { return (long) (sizeof (void *)); } +unsigned long ulongval () { return (long) (sizeof (void *)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + exit (1); + if (((long) (sizeof (void *))) < 0) + { + long i = longval (); + if (i != ((long) (sizeof (void *)))) + exit (1); + fprintf (f, "%ld\n", i); + } + else + { + unsigned long i = ulongval (); + if (i != ((long) (sizeof (void *)))) + exit (1); + fprintf (f, "%lu\n", i); + } + exit (ferror (f) || fclose (f) != 0); + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_void_p=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 - test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no" - ;; -esac +( exit $ac_status ) +{ { echo "$as_me:$LINENO: error: cannot compute sizeof (void *), 77 +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (void *), 77 +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } fi -WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH - -if test -n "$WX_CONFIG_PATH"; then - echo "$as_me:$LINENO: result: $WX_CONFIG_PATH" >&5 -echo "${ECHO_T}$WX_CONFIG_PATH" >&6 +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +rm -f conftest.val else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + ac_cv_sizeof_void_p=0 +fi fi +echo "$as_me:$LINENO: result: $ac_cv_sizeof_void_p" >&5 +echo "${ECHO_T}$ac_cv_sizeof_void_p" >&6 +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOID_P $ac_cv_sizeof_void_p +_ACEOF - fi - if test "$WX_CONFIG_PATH" != "no" ; then - WX_VERSION="" - min_wx_version=$reqwx - if test -z "--unicode --debug=yes" ; then - echo "$as_me:$LINENO: checking for wxWidgets version >= $min_wx_version" >&5 -echo $ECHO_N "checking for wxWidgets version >= $min_wx_version... $ECHO_C" >&6 - else - echo "$as_me:$LINENO: checking for wxWidgets version >= $min_wx_version (--unicode --debug=yes)" >&5 -echo $ECHO_N "checking for wxWidgets version >= $min_wx_version (--unicode --debug=yes)... $ECHO_C" >&6 - fi +case $ac_cv_sizeof_void_p-$host_os in + 8-darwin*) + if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then + { { echo "$as_me:$LINENO: error: Can not use 64bits wxWidgets on Darwin" >&5 +echo "$as_me: error: Can not use 64bits wxWidgets on Darwin" >&2;} + { (exit 1); exit 1; }; } + else + echo "Can not combine 64bits erlang with wxWidgets on MacOSX, wx will not be useable" > ./CONF_INFO + WXERL_CAN_BUILD_DRIVER=false + { echo "$as_me:$LINENO: WARNING: Can not combine 64bits erlang with wxWidgets on MacOSX, wx will not be useable" >&5 +echo "$as_me: WARNING: Can not combine 64bits erlang with wxWidgets on MacOSX, wx will not be useable" >&2;} + fi + WXERL_CAN_BUILD_DRIVER=false + ;; + *) + ;; +esac - WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args --unicode --debug=yes stc,xrc,html,adv,xml,core,base,gl,aui" +PTHR_CFLAGS="-D_THREAD_SAFE -D_REENTRANT" - WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` - wx_config_major_version=`echo $WX_VERSION | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` - wx_config_minor_version=`echo $WX_VERSION | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` - wx_config_micro_version=`echo $WX_VERSION | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` +case $host_os in + darwin*) + C_ONLY_FLAGS="-ObjC" + CPPFLAGS="$CPPFLAGS -D_MACOSX $PTHR_CFLAGS" + ;; + mingw32) + CFLAGS="$CFLAGS -DWIN32 -DWINVER=0x0500 -D_WINDOWS -D_UNICODE -DUNICODE" + CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0500" + { echo "$as_me:$LINENO: WARNING: Reverting to 32-bit time_t" >&5 +echo "$as_me: WARNING: Reverting to 32-bit time_t" >&2;} + CPPFLAGS="$CPPFLAGS -D_USE_32BIT_TIME_T" + ;; + win32) + CFLAGS="$CFLAGS -DWIN32 -DWINVER=0x0500 -D_WINDOWS -D_UNICODE -DUNICODE" + CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0500" + ;; + *) + CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE $PTHR_CFLAGS" + ;; +esac - wx_requested_major_version=`echo $min_wx_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` - wx_requested_minor_version=`echo $min_wx_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` - wx_requested_micro_version=`echo $min_wx_version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` +case $host_os in + darwin*) + CFLAGS="-no-cpp-precomp $CFLAGS" + LDFLAGS="-bundle -flat_namespace -undefined warning -fPIC -framework OpenGL $LDFLAGS" + ;; + win32) + LDFLAGS="-dll $LDFLAGS" + ;; + mingw32) + LDFLAGS="-shared -fPIC $LDFLAGS" + ;; + *) + LDFLAGS="-shared -fPIC $LDFLAGS" + ;; +esac - wx_ver_ok="" - if test "x$WX_VERSION" != x ; then - if test $wx_config_major_version -gt $wx_requested_major_version; then - wx_ver_ok=yes - else - if test $wx_config_major_version -eq $wx_requested_major_version; then - if test $wx_config_minor_version -gt $wx_requested_minor_version; then - wx_ver_ok=yes - else - if test $wx_config_minor_version -eq $wx_requested_minor_version; then - if test $wx_config_micro_version -ge $wx_requested_micro_version; then - wx_ver_ok=yes - fi - fi - fi - fi - fi - fi +case $host_os in + mingw32) + DEBUG_CFLAGS="-g -Wall -DDEBUG $CFLAGS" + CFLAGS="-g -Wall -O2 -fomit-frame-pointer -fno-strict-aliasing $CFLAGS" + ;; + win32) + DEBUG_CFLAGS="-g -Wall -DDEBUG $CFLAGS" + CFLAGS="-g -Wall -O2 $CFLAGS" + ;; + *) + DEBUG_CFLAGS="-g -Wall -fPIC -DDEBUG $CFLAGS" + CFLAGS="-g -Wall -O2 -fPIC -fomit-frame-pointer -fno-strict-aliasing $CFLAGS" + ;; +esac +CXXFLAGS="$CFLAGS $CPPFLAGS" +CFLAGS="$CFLAGS $CPPFLAGS $C_ONLY_FLAGS" - if test -n "$wx_ver_ok"; then +DEBUG_CXXFLAGS="$DEBUG_CFLAGS $CPPFLAGS" +DEBUG_CFLAGS="$DEBUG_CFLAGS $CPPFLAGS $C_ONLY_FLAGS" - echo "$as_me:$LINENO: result: yes (version $WX_VERSION)" >&5 -echo "${ECHO_T}yes (version $WX_VERSION)" >&6 - WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` - echo "$as_me:$LINENO: checking for wxWidgets static library" >&5 -echo $ECHO_N "checking for wxWidgets static library... $ECHO_C" >&6 - WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` - if test "x$WX_LIBS_STATIC" = "x"; then - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - else - echo "$as_me:$LINENO: result: yes" >&5 + + +if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then + echo "$as_me:$LINENO: checking for erl" >&5 +echo $ECHO_N "checking for erl... $ECHO_C" >&6 + if test X$ERL != X; then + echo "$as_me:$LINENO: result: yes; using $ERL" >&5 +echo "${ECHO_T}yes; using $ERL" >&6 + else + type erl >/dev/null 2>&1 + if test $? -eq 0 ; then + ERL=erl + echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 - fi + else + { { echo "$as_me:$LINENO: error: Cannot find erl in path" >&5 +echo "$as_me: error: Cannot find erl in path" >&2;} + { (exit 1); exit 1; }; } + fi + fi + echo "$as_me:$LINENO: checking for erlc" >&5 +echo $ECHO_N "checking for erlc... $ECHO_C" >&6 + if test X$ERLC != X; then + echo "$as_me:$LINENO: result: yes; using $ERLC" >&5 +echo "${ECHO_T}yes; using $ERLC" >&6 + else + type erlc >/dev/null 2>&1 + if test $? -eq 0 ; then + ERLC=erlc + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + { { echo "$as_me:$LINENO: error: Cannot find erlc in path" >&5 +echo "$as_me: error: Cannot find erlc in path" >&2;} + { (exit 1); exit 1; }; } + fi + fi + ERLANG_ROOT_DIR=`erl -noshell -eval 'io:format("~s~n",[code:root_dir()])' -s erlang halt` + { echo "$as_me:$LINENO: ERL ROOT DIR: $ERLANG_ROOT_DIR" >&5 +echo "$as_me: ERL ROOT DIR: $ERLANG_ROOT_DIR" >&6;} + ERLWX_VSN=`grep WX_VSN $srcdir/vsn.mk | sed 's/^.*= *//'` +else + ERLC=erlc + ERL=erl + ERLANG_ROOT_DIR=$ERL_TOP - wx_has_cppflags="" - if test $wx_config_major_version -gt 2; then - wx_has_cppflags=yes - else - if test $wx_config_major_version -eq 2; then - if test $wx_config_minor_version -gt 2; then - wx_has_cppflags=yes - else - if test $wx_config_minor_version -eq 2; then - if test $wx_config_micro_version -ge 6; then - wx_has_cppflags=yes - fi - fi - fi - fi - fi +fi - wx_has_rescomp="" - if test $wx_config_major_version -gt 2; then - wx_has_rescomp=yes - else - if test $wx_config_major_version -eq 2; then - if test $wx_config_minor_version -ge 7; then - wx_has_rescomp=yes - fi - fi - fi - if test "x$wx_has_rescomp" = x ; then - WX_RESCOMP= - else - WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` - fi - if test "x$wx_has_cppflags" = x ; then - WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` - WX_CPPFLAGS=$WX_CFLAGS - WX_CXXFLAGS=$WX_CFLAGS - WX_CFLAGS_ONLY=$WX_CFLAGS - WX_CXXFLAGS_ONLY=$WX_CFLAGS - else - WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` - WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` - WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` - WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` - WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` - fi +if test X"$MIXED_CYGWIN_VC" != X"yes" ; then - wxWinWithGL=1 - else - if test "x$WX_VERSION" = x; then - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - else - echo "$as_me:$LINENO: result: no (version $WX_VERSION is not new enough)" >&5 -echo "${ECHO_T}no (version $WX_VERSION is not new enough)" >&6 - fi - WX_CFLAGS="" - WX_CPPFLAGS="" - WX_CXXFLAGS="" - WX_LIBS="" - WX_LIBS_STATIC="" - WX_RESCOMP="" - wxWinWithGL=0 - fi - else - WX_CFLAGS="" - WX_CPPFLAGS="" - WX_CXXFLAGS="" - WX_LIBS="" - WX_LIBS_STATIC="" - WX_RESCOMP="" - wxWinWithGL=0 - fi @@ -3556,18 +3987,42 @@ +# Check whether --with-wxdir or --without-wxdir was given. +if test "${with_wxdir+set}" = set; then + withval="$with_wxdir" + wx_config_name="$withval/wx-config" + wx_config_args="--inplace" +fi; - DEBUG_WX_CFLAGS=$WX_CFLAGS - DEBUG_WX_CXXFLAGS=$WX_CXXFLAGS - DEBUG_WX_LIBS=$WX_LIBS - DEBUG_WX_LIBS_STATIC=$WX_LIBS_STATIC +# Check whether --with-wx-config or --without-wx-config was given. +if test "${with_wx_config+set}" = set; then + withval="$with_wx_config" + wx_config_name="$withval" +fi; +# Check whether --with-wx-prefix or --without-wx-prefix was given. +if test "${with_wx_prefix+set}" = set; then + withval="$with_wx_prefix" + wx_config_prefix="$withval" +else + wx_config_prefix="" +fi; +# Check whether --with-wx-exec-prefix or --without-wx-exec-prefix was given. +if test "${with_wx_exec_prefix+set}" = set; then + withval="$with_wx_exec_prefix" + wx_config_exec_prefix="$withval" +else + wx_config_exec_prefix="" +fi; + reqwx=2.8.4 + # Try to find debug libs first + # wxelibs=core,base,gl,aui,adv + echo "$as_me:$LINENO: checking for debug build of wxWidgets" >&5 +echo $ECHO_N "checking for debug build of wxWidgets... $ECHO_C" >&6 - echo "$as_me:$LINENO: checking for standard build of WxWidgets" >&5 -echo $ECHO_N "checking for standard build of WxWidgets... $ECHO_C" >&6 if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config @@ -3643,15 +4098,15 @@ WX_VERSION="" min_wx_version=$reqwx - if test -z "--unicode --debug=no" ; then + if test -z "--unicode --debug=yes" ; then echo "$as_me:$LINENO: checking for wxWidgets version >= $min_wx_version" >&5 echo $ECHO_N "checking for wxWidgets version >= $min_wx_version... $ECHO_C" >&6 else - echo "$as_me:$LINENO: checking for wxWidgets version >= $min_wx_version (--unicode --debug=no)" >&5 -echo $ECHO_N "checking for wxWidgets version >= $min_wx_version (--unicode --debug=no)... $ECHO_C" >&6 + echo "$as_me:$LINENO: checking for wxWidgets version >= $min_wx_version (--unicode --debug=yes)" >&5 +echo $ECHO_N "checking for wxWidgets version >= $min_wx_version (--unicode --debug=yes)... $ECHO_C" >&6 fi - WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args --unicode --debug=no stc,xrc,html,adv,xml,core,base,gl,aui" + WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args --unicode --debug=yes stc,xrc,html,adv,xml,core,base,gl,aui" WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ @@ -3755,7 +4210,7 @@ WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi - wxWinWithGL=1 + wxWinWithGLDBG=1 else @@ -3773,7 +4228,7 @@ WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" - wxWinWithGL=0 + wxWinWithGLDBG=0 fi else @@ -3785,7 +4240,7 @@ WX_LIBS_STATIC="" WX_RESCOMP="" - wxWinWithGL=0 + wxWinWithGLDBG=0 fi @@ -3799,14 +4254,17 @@ + DEBUG_WX_CFLAGS=$WX_CFLAGS + DEBUG_WX_CXXFLAGS=$WX_CXXFLAGS + DEBUG_WX_LIBS=$WX_LIBS + DEBUG_WX_LIBS_STATIC=$WX_LIBS_STATIC + + - if test "x$WX_LIBS_STATIC" = "x"; then - WX_HAVE_STATIC_LIBS=false - else - WX_HAVE_STATIC_LIBS=true - fi - if test "$wxWinWithGL" != 1; then + + echo "$as_me:$LINENO: checking for standard build of wxWidgets" >&5 +echo $ECHO_N "checking for standard build of wxWidgets... $ECHO_C" >&6 if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config @@ -3882,15 +4340,15 @@ WX_VERSION="" min_wx_version=$reqwx - if test -z "--unicode" ; then + if test -z "--unicode --debug=no" ; then echo "$as_me:$LINENO: checking for wxWidgets version >= $min_wx_version" >&5 echo $ECHO_N "checking for wxWidgets version >= $min_wx_version... $ECHO_C" >&6 else - echo "$as_me:$LINENO: checking for wxWidgets version >= $min_wx_version (--unicode)" >&5 -echo $ECHO_N "checking for wxWidgets version >= $min_wx_version (--unicode)... $ECHO_C" >&6 + echo "$as_me:$LINENO: checking for wxWidgets version >= $min_wx_version (--unicode --debug=no)" >&5 +echo $ECHO_N "checking for wxWidgets version >= $min_wx_version (--unicode --debug=no)... $ECHO_C" >&6 fi - WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args --unicode stc,xrc,html,adv,xml,core,base,aui" + WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args --unicode --debug=no stc,xrc,html,adv,xml,core,base,gl,aui" WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ @@ -3994,7 +4452,7 @@ WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi - wxWin=1 + wxWinWithGL=1 else @@ -4012,7 +4470,7 @@ WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" - wxWin=0 + wxWinWithGL=0 fi else @@ -4022,388 +4480,170 @@ WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" - WX_RESCOMP="" - - wxWin=0 - - fi - - - - - - - - - - - - else - wxWin=1 - fi - RC_FILE_TYPE=o - - - if test "$wxWin" != 1; then - if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then - { { echo "$as_me:$LINENO: error: - wxWidgets must be installed on your system. - - Please check that wx-config is in path, the directory - where wxWidgets libraries are installed (returned by - 'wx-config --libs' or 'wx-config --static --libs' command) - is in LD_LIBRARY_PATH or equivalent variable and - wxWidgets version is $reqwx or above." >&5 -echo "$as_me: error: - wxWidgets must be installed on your system. - - Please check that wx-config is in path, the directory - where wxWidgets libraries are installed (returned by - 'wx-config --libs' or 'wx-config --static --libs' command) - is in LD_LIBRARY_PATH or equivalent variable and - wxWidgets version is $reqwx or above." >&2;} - { (exit 1); exit 1; }; } - else - echo "wxWidgets not found, wx will NOT be useable" > ./CONF_INFO - WXERL_CAN_BUILD_DRIVER=false - { echo "$as_me:$LINENO: WARNING: - wxWidgets must be installed on your system. - - Please check that wx-config is in path, the directory - where wxWidgets libraries are installed (returned by - 'wx-config --libs' or 'wx-config --static --libs' command) - is in LD_LIBRARY_PATH or equivalent variable and - wxWidgets version is $reqwx or above." >&5 -echo "$as_me: WARNING: - wxWidgets must be installed on your system. - - Please check that wx-config is in path, the directory - where wxWidgets libraries are installed (returned by - 'wx-config --libs' or 'wx-config --static --libs' command) - is in LD_LIBRARY_PATH or equivalent variable and - wxWidgets version is $reqwx or above." >&2;} - fi - fi -else - echo "$as_me:$LINENO: checking for WxWidgets in standard locations" >&5 -echo $ECHO_N "checking for WxWidgets in standard locations... $ECHO_C" >&6 - CWXWIN=`cygpath $WXWIN 2>/dev/null` - for dir in $CWXWIN /opt/local/pgm/wxMSW-2.8.*; do - if test -f $dir/include/wx/wx.h; then - WXINCLUDE_MSVC=$dir/include/msvc - WXINCLUDE_PLAIN=$dir/include - WXINCLUDE_CONTRIB=$dir/contrib/include - WX_CFLAGS="-EHsc -D_UNICODE -DUNICODE -I$WXINCLUDE_MSVC -I$WXINCLUDE_PLAIN -I$WXINCLUDE_CONTRIB -D__WXMSW__" - WX_CXXFLAGS=$WX_CFLAGS - WX_LIBDIR=$dir/lib/vc_lib - WX_RESCOMP="rc.sh -I$WXINCLUDE_PLAIN -D __WIN32__" - RC_FILE_TYPE=res - for lib in $WX_LIBDIR/wxbase*.lib; do - maybe=`echo $lib | egrep 'wxbase[0-9]*u\.lib'` - if test '!' -z "$maybe"; then - corelib_number=`echo $maybe | sed 's,.*\([0-9].\)u\.lib,\1,'` - break - fi - done - if test '!' -z "$corelib_number"; then - WXLIBNO=$corelib_number - WX_LIBS0="wxmsw${WXLIBNO}u_stc wxmsw${WXLIBNO}u_xrc wxmsw${WXLIBNO}u_html" - WX_LIBS1="wxmsw${WXLIBNO}u_adv wxbase${WXLIBNO}u_xml wxmsw${WXLIBNO}u_core" - WX_LIBS2="wxbase${WXLIBNO}u wxmsw${WXLIBNO}u_gl wxmsw${WXLIBNO}u_aui" - WX_LIBS3="wxregexu wxexpat wxtiff wxjpeg wxpng wxzlib" - WX_SYSLIBS="winspool winmm oleaut32 ole32" - WX_LIBS_STATIC="-L$WX_LIBDIR" - for lib in $WX_LIBS0 $WX_LIBS1 $WX_LIBS2 $WX_LIBS3 $WX_SYSLIBS; do - WX_LIBS_STATIC="$WX_LIBS_STATIC -l$lib" - done - echo "$as_me:$LINENO: result: $dir" >&5 -echo "${ECHO_T}$dir" >&6 - break - fi - fi - done - if test -z "$WX_LIBS_STATIC"; then - echo "$as_me:$LINENO: result: failed" >&5 -echo "${ECHO_T}failed" >&6 - if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then - { { echo "$as_me:$LINENO: error: Cannot find core lib version for wxWidgets" >&5 -echo "$as_me: error: Cannot find core lib version for wxWidgets" >&2;} - { (exit 1); exit 1; }; } - else - echo "No usable wxWidgets not found, wx will not be useable" > ./CONF_INFO - WXERL_CAN_BUILD_DRIVER=false - { echo "$as_me:$LINENO: WARNING: Cannot find core lib version for wxWidgets" >&5 -echo "$as_me: WARNING: Cannot find core lib version for wxWidgets" >&2;} - fi - fi - WX_HAVE_STATIC_LIBS=true - - - - -fi - - - - - -if test X"$host_os" != X"win32" ; then - - -echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep - - -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_header_stdc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include + WX_RESCOMP="" -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* + wxWinWithGL=0 -fi + fi -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* -fi -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 -if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF -fi -# On IRIX 5.3, sys/types and inttypes.h are conflicting. + if test "x$WX_LIBS_STATIC" = "x"; then + WX_HAVE_STATIC_LIBS=false + else + WX_HAVE_STATIC_LIBS=true + fi + wxWin=0 + if test "$wxWinWithGLDBG" = 1; then + if test "$wxWinWithGL" = 1; then + wxWin=1 + FORCED_DEBUG_BUILD=false + else + wxWin=1 + FORCED_DEBUG_BUILD=debug + WX_CFLAGS=$DEBUG_WX_CFLAGS + WX_CXXFLAGS=$DEBUG_WX_CXXFLAGS + WX_LIBS=$DEBUG_WX_LIBS + WX_LIBS_STATIC=$DEBUG_WX_LIBS_STATIC + fi + elif test "$wxWinWithGL" = 1; then + wxWin=1 + FORCED_DEBUG_BUILD=false + fi + RC_FILE_TYPE=o + if test "$wxWin" != 1; then + if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then + { { echo "$as_me:$LINENO: error: + wxWidgets must be installed on your system. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default + Please check that wx-config is in path, the directory + where wxWidgets libraries are installed (returned by + 'wx-config --libs' or 'wx-config --static --libs' command) + is in LD_LIBRARY_PATH or equivalent variable and + wxWidgets version is $reqwx or above." >&5 +echo "$as_me: error: + wxWidgets must be installed on your system. -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" + Please check that wx-config is in path, the directory + where wxWidgets libraries are installed (returned by + 'wx-config --libs' or 'wx-config --static --libs' command) + is in LD_LIBRARY_PATH or equivalent variable and + wxWidgets version is $reqwx or above." >&2;} + { (exit 1); exit 1; }; } + else + echo "wxWidgets not found, wx will NOT be useable" > ./CONF_INFO + WXERL_CAN_BUILD_DRIVER=false + { echo "$as_me:$LINENO: WARNING: + wxWidgets must be installed on your system. + + Please check that wx-config is in path, the directory + where wxWidgets libraries are installed (returned by + 'wx-config --libs' or 'wx-config --static --libs' command) + is in LD_LIBRARY_PATH or equivalent variable and + wxWidgets version is $reqwx or above." >&5 +echo "$as_me: WARNING: + wxWidgets must be installed on your system. + + Please check that wx-config is in path, the directory + where wxWidgets libraries are installed (returned by + 'wx-config --libs' or 'wx-config --static --libs' command) + is in LD_LIBRARY_PATH or equivalent variable and + wxWidgets version is $reqwx or above." >&2;} + fi + fi else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + echo "$as_me:$LINENO: checking for wxWidgets in standard locations" >&5 +echo $ECHO_N "checking for wxWidgets in standard locations... $ECHO_C" >&6 + + CWXWIN_CONFIG=`cygpath $wx_config_name 2>/dev/null` + CWXWIN1=`dirname $CWXWIN_CONFIG 2>/dev/null` + CWXWIN2=`dirname $CWXWIN1 2>/dev/null` + + if test -z "$PROGRAMFILES" ; then + PROGRAMFILES=c:/Program Files + fi + + CWXWIN_PROG=`cygpath -d "$PROGRAMFILES" | cygpath -f - 2>/dev/null` + CWXWIN3=$CWXWIN_PROG/wxWidgets-2.8 + CWXWIN4=$CWXWIN_PROG/wxMSW-2.8 + CWX_DOCUMENTED="/opt/local/pgm/wxMSW-2.8.* /opt/local/pgm/wxWidgets-2.8.*" + CWXPATH="$CWXWIN1 $CWXWIN2 $CWX_DOCUMENTED $CWXWIN3.* $CWXWIN4.*" + + for dir in $CWXPATH; do + if test -f $dir/include/wx/wx.h; then + WXINCLUDE_MSVC=$dir/include/msvc + WXINCLUDE_PLAIN=$dir/include + WXINCLUDE_CONTRIB=$dir/contrib/include + WX_CFLAGS="-EHsc -D_UNICODE -DUNICODE -I$WXINCLUDE_MSVC -I$WXINCLUDE_PLAIN -I$WXINCLUDE_CONTRIB -D__WXMSW__" + WX_CXXFLAGS=$WX_CFLAGS + WX_LIBDIR=$dir/lib/vc_lib + WX_RESCOMP="rc.sh -I$WXINCLUDE_PLAIN -D __WIN32__" + RC_FILE_TYPE=res + for lib in $WX_LIBDIR/wxbase*.lib; do + maybe=`echo $lib | egrep 'wxbase[0-9]*u\.lib'` + if test '!' -z "$maybe"; then + corelib_number=`echo $maybe | sed 's,.*\([0-9].\)u\.lib,\1,'` + break + fi + done + if test '!' -z "$corelib_number"; then + WXLIBNO=$corelib_number + WX_LIBS0="wxmsw${WXLIBNO}u_stc wxmsw${WXLIBNO}u_xrc wxmsw${WXLIBNO}u_html" + WX_LIBS1="wxmsw${WXLIBNO}u_adv wxbase${WXLIBNO}u_xml wxmsw${WXLIBNO}u_core" + WX_LIBS2="wxbase${WXLIBNO}u wxmsw${WXLIBNO}u_gl wxmsw${WXLIBNO}u_aui" + WX_LIBS3="wxregexu wxexpat wxtiff wxjpeg wxpng wxzlib" + WX_SYSLIBS="winspool winmm oleaut32 ole32 gdiplus" + WX_LIBS_STATIC="-L$WX_LIBDIR" + for lib in $WX_LIBS0 $WX_LIBS1 $WX_LIBS2 $WX_LIBS3 $WX_SYSLIBS; do + WX_LIBS_STATIC="$WX_LIBS_STATIC -l$lib" + done + echo "$as_me:$LINENO: result: $dir" >&5 +echo "${ECHO_T}$dir" >&6 + break + fi + fi + done + if test -z "$WX_LIBS_STATIC"; then + echo "$as_me:$LINENO: result: failed" >&5 +echo "${ECHO_T}failed" >&6 + if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then + { { echo "$as_me:$LINENO: error: Cannot find core lib version for wxWidgets" >&5 +echo "$as_me: error: Cannot find core lib version for wxWidgets" >&2;} + { (exit 1); exit 1; }; } + else + echo "No usable wxWidgets not found, wx will not be useable" > ./CONF_INFO + WXERL_CAN_BUILD_DRIVER=false + { echo "$as_me:$LINENO: WARNING: Cannot find core lib version for wxWidgets" >&5 +echo "$as_me: WARNING: Cannot find core lib version for wxWidgets" >&2;} + fi + fi + WX_HAVE_STATIC_LIBS=true + + -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF fi -done + +if test X"$host_os" != X"win32" ; then + for ac_header in GL/gl.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` @@ -5478,6 +5718,9 @@ class MyApp : public wxApp { virtual bool OnInit() { + // Test that we have a FromUTF8 + // it isn't in too old wxWidgets versions + wxString test = wxString::FromUTF8((const char *)"foo"); wxStyledTextCtrl * foo = new wxStyledTextCtrl(); wxGLCanvas * bar = new wxGLCanvas((wxWindow *) NULL, -1, wxDefaultPosition,wxDefaultSize,0); @@ -5560,7 +5803,7 @@ if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then - WXERL_SYS_TYPE=`echo 'io:format("~n~s~n", [erlang:system_info(system_architecture)]), halt().' | erl | tail +3` + WXERL_SYS_TYPE=`erl -noshell -eval 'io:format("~s~n",[erlang:system_info(system_architecture)])' -s erlang halt` else WXERL_SYS_TYPE=$TARGET fi @@ -6242,6 +6485,7 @@ s,@MIXED_CYGWIN_VC@,$MIXED_CYGWIN_VC,;t t s,@MIXED_CYGWIN_MINGW@,$MIXED_CYGWIN_MINGW,;t t s,@MIXED_CYGWIN@,$MIXED_CYGWIN,;t t +s,@EGREP@,$EGREP,;t t s,@DEBUG_CFLAGS@,$DEBUG_CFLAGS,;t t s,@DEBUG_CXXFLAGS@,$DEBUG_CXXFLAGS,;t t s,@ERLC@,$ERLC,;t t @@ -6261,9 +6505,9 @@ s,@DEBUG_WX_CXXFLAGS@,$DEBUG_WX_CXXFLAGS,;t t s,@DEBUG_WX_LIBS@,$DEBUG_WX_LIBS,;t t s,@DEBUG_WX_LIBS_STATIC@,$DEBUG_WX_LIBS_STATIC,;t t +s,@FORCED_DEBUG_BUILD@,$FORCED_DEBUG_BUILD,;t t s,@WX_HAVE_STATIC_LIBS@,$WX_HAVE_STATIC_LIBS,;t t s,@RC_FILE_TYPE@,$RC_FILE_TYPE,;t t -s,@EGREP@,$EGREP,;t t s,@HAVE_GL_SUPPORT@,$HAVE_GL_SUPPORT,;t t s,@TESS_CB_TIGER_STYLE@,$TESS_CB_TIGER_STYLE,;t t s,@WXERL_CAN_BUILD_DRIVER@,$WXERL_CAN_BUILD_DRIVER,;t t @@ -6559,3 +6803,4 @@ fi + diff -Nru erlang-13.b.1-dfsg/lib/wx/configure.in erlang-13.b.3-dfsg/lib/wx/configure.in --- erlang-13.b.1-dfsg/lib/wx/configure.in 2009-04-16 10:25:11.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/configure.in 2009-11-20 13:34:34.000000000 +0000 @@ -1,10 +1,15 @@ AC_INIT() -AC_CONFIG_AUX_DIRS(autoconf) +AC_CONFIG_AUX_DIRS($srcdir/autoconf) AC_PREREQ(2.59) +## Delete previous failed configure results +if test -f ./CONF_INFO; then + rm ./CONF_INFO +fi + if test -z "$ERL_TOP" || test ! -d $ERL_TOP ; then AC_CONFIG_AUX_DIRS(autoconf) WX_BUILDING_INSIDE_ERLSRC=false @@ -92,6 +97,27 @@ AC_SUBST(MIXED_CYGWIN) + +## Check that we are in 32 bits mode on darwin +## (wxWidgets require that it currently uses 32-bits Carbon) +## Otherwise skip building wxErlang +AC_CHECK_SIZEOF(void *, 4) + +case $ac_cv_sizeof_void_p-$host_os in + 8-darwin*) + if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then + AC_MSG_ERROR([Can not use 64bits wxWidgets on Darwin]) + else + echo "Can not combine 64bits erlang with wxWidgets on MacOSX, wx will not be useable" > ./CONF_INFO + WXERL_CAN_BUILD_DRIVER=false + AC_MSG_WARN([Can not combine 64bits erlang with wxWidgets on MacOSX, wx will not be useable]) + fi + WXERL_CAN_BUILD_DRIVER=false + ;; + *) + ;; +esac + PTHR_CFLAGS="-D_THREAD_SAFE -D_REENTRANT" dnl NOTE: CPPFLAGS will be included in CFLAGS at the end @@ -117,18 +143,17 @@ case $host_os in darwin*) - CFLAGS="-no-cpp-precomp" - LDFLAGS="-bundle -flat_namespace -undefined suppress -fPIC -framework OpenGL" + CFLAGS="-no-cpp-precomp $CFLAGS" + LDFLAGS="-bundle -flat_namespace -undefined warning -fPIC -framework OpenGL $LDFLAGS" ;; win32) - LDFLAGS="-dll" + LDFLAGS="-dll $LDFLAGS" ;; mingw32) - LDFLAGS="-shared -fPIC" + LDFLAGS="-shared -fPIC $LDFLAGS" ;; *) - CFLAGS= - LDFLAGS="-shared -fPIC" + LDFLAGS="-shared -fPIC $LDFLAGS" ;; esac @@ -185,8 +210,9 @@ AC_MSG_ERROR([Cannot find erlc in path]) fi fi - ERLANG_ROOT_DIR=`echo 'io:format("~n~s~n", [[code:root_dir()]]), halt().' | erl | tail +3` + ERLANG_ROOT_DIR=`erl -noshell -eval 'io:format("~s~n",[[code:root_dir()]])' -s erlang halt` AC_MSG_NOTICE(ERL ROOT DIR: [$ERLANG_ROOT_DIR]) + ERLWX_VSN=`grep WX_VSN $srcdir/vsn.mk | sed 's/^.*=[ ]*//'` else ERLC=erlc ERL=erl @@ -204,13 +230,13 @@ m4_include(wxwin.m4) AM_OPTIONS_WXCONFIG - reqwx=2.8.0 + reqwx=2.8.4 # Try to find debug libs first # wxelibs=core,base,gl,aui,adv - AC_MSG_CHECKING(for debug build of WxWidgets) + AC_MSG_CHECKING(for debug build of wxWidgets) - AM_PATH_WXCONFIG($reqwx, wxWinWithGL=1, wxWinWithGL=0, [stc,xrc,html,adv,xml,core,base,gl,aui], [--unicode --debug=yes]) + AM_PATH_WXCONFIG($reqwx, wxWinWithGLDBG=1, wxWinWithGLDBG=0, [stc,xrc,html,adv,xml,core,base,gl,aui], [--unicode --debug=yes]) DEBUG_WX_CFLAGS=$WX_CFLAGS DEBUG_WX_CXXFLAGS=$WX_CXXFLAGS DEBUG_WX_LIBS=$WX_LIBS @@ -220,7 +246,7 @@ AC_SUBST(DEBUG_WX_LIBS) AC_SUBST(DEBUG_WX_LIBS_STATIC) - AC_MSG_CHECKING(for standard build of WxWidgets) + AC_MSG_CHECKING(for standard build of wxWidgets) AM_PATH_WXCONFIG($reqwx, wxWinWithGL=1, wxWinWithGL=0, [stc,xrc,html,adv,xml,core,base,gl,aui], [--unicode --debug=no]) if test "x$WX_LIBS_STATIC" = "x"; then @@ -229,11 +255,25 @@ WX_HAVE_STATIC_LIBS=true fi - if test "$wxWinWithGL" != 1; then - AM_PATH_WXCONFIG($reqwx, wxWin=1, wxWin=0, [stc,xrc,html,adv,xml,core,base,aui], [--unicode]) - else - wxWin=1 - fi + wxWin=0 + + if test "$wxWinWithGLDBG" = 1; then + if test "$wxWinWithGL" = 1; then + wxWin=1 + FORCED_DEBUG_BUILD=false + else + wxWin=1 + FORCED_DEBUG_BUILD=debug + WX_CFLAGS=$DEBUG_WX_CFLAGS + WX_CXXFLAGS=$DEBUG_WX_CXXFLAGS + WX_LIBS=$DEBUG_WX_LIBS + WX_LIBS_STATIC=$DEBUG_WX_LIBS_STATIC + fi + elif test "$wxWinWithGL" = 1; then + wxWin=1 + FORCED_DEBUG_BUILD=false + fi + AC_SUBST(FORCED_DEBUG_BUILD) RC_FILE_TYPE=o define(wx_warn_text,[ wxWidgets must be installed on your system. @@ -254,9 +294,23 @@ fi fi else - AC_MSG_CHECKING(for WxWidgets in standard locations) - CWXWIN=`cygpath $WXWIN 2>/dev/null` - for dir in $CWXWIN /opt/local/pgm/wxMSW-2.8.*; do + AC_MSG_CHECKING(for wxWidgets in standard locations) + + CWXWIN_CONFIG=`cygpath $wx_config_name 2>/dev/null` + CWXWIN1=`dirname $CWXWIN_CONFIG 2>/dev/null` + CWXWIN2=`dirname $CWXWIN1 2>/dev/null` + + if test -z "$PROGRAMFILES" ; then + PROGRAMFILES=c:/Program Files + fi + + CWXWIN_PROG=`cygpath -d "$PROGRAMFILES" | cygpath -f - 2>/dev/null` + CWXWIN3=$CWXWIN_PROG/wxWidgets-2.8 + CWXWIN4=$CWXWIN_PROG/wxMSW-2.8 + CWX_DOCUMENTED="/opt/local/pgm/wxMSW-2.8.* /opt/local/pgm/wxWidgets-2.8.*" + CWXPATH="$CWXWIN1 $CWXWIN2 $CWX_DOCUMENTED $CWXWIN3.* $CWXWIN4.*" + + for dir in $CWXPATH; do if test -f $dir/include/wx/wx.h; then WXINCLUDE_MSVC=$dir/include/msvc WXINCLUDE_PLAIN=$dir/include @@ -279,7 +333,7 @@ WX_LIBS1="wxmsw${WXLIBNO}u_adv wxbase${WXLIBNO}u_xml wxmsw${WXLIBNO}u_core" WX_LIBS2="wxbase${WXLIBNO}u wxmsw${WXLIBNO}u_gl wxmsw${WXLIBNO}u_aui" WX_LIBS3="wxregexu wxexpat wxtiff wxjpeg wxpng wxzlib" - WX_SYSLIBS="winspool winmm oleaut32 ole32" + WX_SYSLIBS="winspool winmm oleaut32 ole32 gdiplus" WX_LIBS_STATIC="-L$WX_LIBDIR" for lib in $WX_LIBS0 $WX_LIBS1 $WX_LIBS2 $WX_LIBS3 $WX_SYSLIBS; do WX_LIBS_STATIC="$WX_LIBS_STATIC -l$lib" @@ -439,10 +493,13 @@ #include "wx/wx.h" #include "wx/stc/stc.h" #include "wx/glcanvas.h" - + class MyApp : public wxApp { virtual bool OnInit() { + // Test that we have a FromUTF8 + // it isn't in too old wxWidgets versions + wxString test = wxString::FromUTF8((const char *)"foo"); wxStyledTextCtrl * foo = new wxStyledTextCtrl(); wxGLCanvas * bar = new wxGLCanvas((wxWindow *) NULL, -1, wxDefaultPosition,wxDefaultSize,0); @@ -490,7 +547,7 @@ if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then dnl Find driver directory name according to erlang - WXERL_SYS_TYPE=`echo 'io:format("~n~s~n", [[erlang:system_info(system_architecture)]]), halt().' | erl | tail +3` + WXERL_SYS_TYPE=`erl -noshell -eval 'io:format("~s~n",[[erlang:system_info(system_architecture)]])' -s erlang halt` else WXERL_SYS_TYPE=$TARGET fi @@ -532,3 +589,4 @@ fi + diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/gen/gl_fdefs.h erlang-13.b.3-dfsg/lib/wx/c_src/gen/gl_fdefs.h --- erlang-13.b.1-dfsg/lib/wx/c_src/gen/gl_fdefs.h 2009-06-05 13:54:29.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/gen/gl_fdefs.h 2009-09-18 15:10:54.000000000 +0100 @@ -558,6 +558,12 @@ WXE_EXTERN WXEGLBLENDEQUATION weglBlendEquation; typedef void (APIENTRY * WXEGLDRAWRANGEELEMENTS)(GLenum,GLuint,GLuint,GLsizei,GLenum,const GLvoid *); WXE_EXTERN WXEGLDRAWRANGEELEMENTS weglDrawRangeElements; +typedef void (APIENTRY * WXEGLTEXIMAGE3D)(GLenum,GLint,GLint,GLsizei,GLsizei,GLsizei,GLint,GLenum,GLenum,const GLvoid *); +WXE_EXTERN WXEGLTEXIMAGE3D weglTexImage3D; +typedef void (APIENTRY * WXEGLTEXSUBIMAGE3D)(GLenum,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLenum,GLenum,const GLvoid *); +WXE_EXTERN WXEGLTEXSUBIMAGE3D weglTexSubImage3D; +typedef void (APIENTRY * WXEGLCOPYTEXSUBIMAGE3D)(GLenum,GLint,GLint,GLint,GLint,GLint,GLint,GLsizei,GLsizei); +WXE_EXTERN WXEGLCOPYTEXSUBIMAGE3D weglCopyTexSubImage3D; typedef void (APIENTRY * WXEGLCOLORTABLE)(GLenum,GLenum,GLsizei,GLenum,GLenum,const GLvoid *); WXE_EXTERN WXEGLCOLORTABLE weglColorTable; typedef void (APIENTRY * WXEGLCOLORTABLEPARAMETERFV)(GLenum,GLenum,const GLfloat *); @@ -616,14 +622,24 @@ WXE_EXTERN WXEGLRESETHISTOGRAM weglResetHistogram; typedef void (APIENTRY * WXEGLRESETMINMAX)(GLenum); WXE_EXTERN WXEGLRESETMINMAX weglResetMinmax; -typedef void (APIENTRY * WXEGLTEXIMAGE3D)(GLenum,GLint,GLint,GLsizei,GLsizei,GLsizei,GLint,GLenum,GLenum,const GLvoid *); -WXE_EXTERN WXEGLTEXIMAGE3D weglTexImage3D; -typedef void (APIENTRY * WXEGLTEXSUBIMAGE3D)(GLenum,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLenum,GLenum,const GLvoid *); -WXE_EXTERN WXEGLTEXSUBIMAGE3D weglTexSubImage3D; -typedef void (APIENTRY * WXEGLCOPYTEXSUBIMAGE3D)(GLenum,GLint,GLint,GLint,GLint,GLint,GLint,GLsizei,GLsizei); -WXE_EXTERN WXEGLCOPYTEXSUBIMAGE3D weglCopyTexSubImage3D; typedef void (APIENTRY * WXEGLACTIVETEXTURE)(GLenum); WXE_EXTERN WXEGLACTIVETEXTURE weglActiveTexture; +typedef void (APIENTRY * WXEGLSAMPLECOVERAGE)(GLclampf,GLboolean); +WXE_EXTERN WXEGLSAMPLECOVERAGE weglSampleCoverage; +typedef void (APIENTRY * WXEGLCOMPRESSEDTEXIMAGE3D)(GLenum,GLint,GLenum,GLsizei,GLsizei,GLsizei,GLint,GLsizei,const GLvoid *); +WXE_EXTERN WXEGLCOMPRESSEDTEXIMAGE3D weglCompressedTexImage3D; +typedef void (APIENTRY * WXEGLCOMPRESSEDTEXIMAGE2D)(GLenum,GLint,GLenum,GLsizei,GLsizei,GLint,GLsizei,const GLvoid *); +WXE_EXTERN WXEGLCOMPRESSEDTEXIMAGE2D weglCompressedTexImage2D; +typedef void (APIENTRY * WXEGLCOMPRESSEDTEXIMAGE1D)(GLenum,GLint,GLenum,GLsizei,GLint,GLsizei,const GLvoid *); +WXE_EXTERN WXEGLCOMPRESSEDTEXIMAGE1D weglCompressedTexImage1D; +typedef void (APIENTRY * WXEGLCOMPRESSEDTEXSUBIMAGE3D)(GLenum,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLenum,GLsizei,const GLvoid *); +WXE_EXTERN WXEGLCOMPRESSEDTEXSUBIMAGE3D weglCompressedTexSubImage3D; +typedef void (APIENTRY * WXEGLCOMPRESSEDTEXSUBIMAGE2D)(GLenum,GLint,GLint,GLint,GLsizei,GLsizei,GLenum,GLsizei,const GLvoid *); +WXE_EXTERN WXEGLCOMPRESSEDTEXSUBIMAGE2D weglCompressedTexSubImage2D; +typedef void (APIENTRY * WXEGLCOMPRESSEDTEXSUBIMAGE1D)(GLenum,GLint,GLint,GLsizei,GLenum,GLsizei,const GLvoid *); +WXE_EXTERN WXEGLCOMPRESSEDTEXSUBIMAGE1D weglCompressedTexSubImage1D; +typedef void (APIENTRY * WXEGLGETCOMPRESSEDTEXIMAGE)(GLenum,GLint,GLvoid *); +WXE_EXTERN WXEGLGETCOMPRESSEDTEXIMAGE weglGetCompressedTexImage; typedef void (APIENTRY * WXEGLCLIENTACTIVETEXTURE)(GLenum); WXE_EXTERN WXEGLCLIENTACTIVETEXTURE weglClientActiveTexture; typedef void (APIENTRY * WXEGLMULTITEXCOORD1DV)(GLenum,const GLdouble *); @@ -666,30 +682,8 @@ WXE_EXTERN WXEGLMULTTRANSPOSEMATRIXF weglMultTransposeMatrixf; typedef void (APIENTRY * WXEGLMULTTRANSPOSEMATRIXD)(const GLdouble *); WXE_EXTERN WXEGLMULTTRANSPOSEMATRIXD weglMultTransposeMatrixd; -typedef void (APIENTRY * WXEGLSAMPLECOVERAGE)(GLclampf,GLboolean); -WXE_EXTERN WXEGLSAMPLECOVERAGE weglSampleCoverage; -typedef void (APIENTRY * WXEGLCOMPRESSEDTEXIMAGE3D)(GLenum,GLint,GLenum,GLsizei,GLsizei,GLsizei,GLint,GLsizei,const GLvoid *); -WXE_EXTERN WXEGLCOMPRESSEDTEXIMAGE3D weglCompressedTexImage3D; -typedef void (APIENTRY * WXEGLCOMPRESSEDTEXIMAGE2D)(GLenum,GLint,GLenum,GLsizei,GLsizei,GLint,GLsizei,const GLvoid *); -WXE_EXTERN WXEGLCOMPRESSEDTEXIMAGE2D weglCompressedTexImage2D; -typedef void (APIENTRY * WXEGLCOMPRESSEDTEXIMAGE1D)(GLenum,GLint,GLenum,GLsizei,GLint,GLsizei,const GLvoid *); -WXE_EXTERN WXEGLCOMPRESSEDTEXIMAGE1D weglCompressedTexImage1D; -typedef void (APIENTRY * WXEGLCOMPRESSEDTEXSUBIMAGE3D)(GLenum,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLenum,GLsizei,const GLvoid *); -WXE_EXTERN WXEGLCOMPRESSEDTEXSUBIMAGE3D weglCompressedTexSubImage3D; -typedef void (APIENTRY * WXEGLCOMPRESSEDTEXSUBIMAGE2D)(GLenum,GLint,GLint,GLint,GLsizei,GLsizei,GLenum,GLsizei,const GLvoid *); -WXE_EXTERN WXEGLCOMPRESSEDTEXSUBIMAGE2D weglCompressedTexSubImage2D; -typedef void (APIENTRY * WXEGLCOMPRESSEDTEXSUBIMAGE1D)(GLenum,GLint,GLint,GLsizei,GLenum,GLsizei,const GLvoid *); -WXE_EXTERN WXEGLCOMPRESSEDTEXSUBIMAGE1D weglCompressedTexSubImage1D; -typedef void (APIENTRY * WXEGLGETCOMPRESSEDTEXIMAGE)(GLenum,GLint,GLvoid *); -WXE_EXTERN WXEGLGETCOMPRESSEDTEXIMAGE weglGetCompressedTexImage; typedef void (APIENTRY * WXEGLBLENDFUNCSEPARATE)(GLenum,GLenum,GLenum,GLenum); WXE_EXTERN WXEGLBLENDFUNCSEPARATE weglBlendFuncSeparate; -typedef void (APIENTRY * WXEGLFOGCOORDFV)(const GLfloat *); -WXE_EXTERN WXEGLFOGCOORDFV weglFogCoordfv; -typedef void (APIENTRY * WXEGLFOGCOORDDV)(const GLdouble *); -WXE_EXTERN WXEGLFOGCOORDDV weglFogCoorddv; -typedef void (APIENTRY * WXEGLFOGCOORDPOINTER)(GLenum,GLsizei,const GLvoid *); -WXE_EXTERN WXEGLFOGCOORDPOINTER weglFogCoordPointer; typedef void (APIENTRY * WXEGLMULTIDRAWARRAYS)(GLenum,GLint *,GLsizei *,GLsizei); WXE_EXTERN WXEGLMULTIDRAWARRAYS weglMultiDrawArrays; typedef void (APIENTRY * WXEGLPOINTPARAMETERF)(GLenum,GLfloat); @@ -700,6 +694,12 @@ WXE_EXTERN WXEGLPOINTPARAMETERI weglPointParameteri; typedef void (APIENTRY * WXEGLPOINTPARAMETERIV)(GLenum,const GLint *); WXE_EXTERN WXEGLPOINTPARAMETERIV weglPointParameteriv; +typedef void (APIENTRY * WXEGLFOGCOORDFV)(const GLfloat *); +WXE_EXTERN WXEGLFOGCOORDFV weglFogCoordfv; +typedef void (APIENTRY * WXEGLFOGCOORDDV)(const GLdouble *); +WXE_EXTERN WXEGLFOGCOORDDV weglFogCoorddv; +typedef void (APIENTRY * WXEGLFOGCOORDPOINTER)(GLenum,GLsizei,const GLvoid *); +WXE_EXTERN WXEGLFOGCOORDPOINTER weglFogCoordPointer; typedef void (APIENTRY * WXEGLSECONDARYCOLOR3BV)(const GLbyte *); WXE_EXTERN WXEGLSECONDARYCOLOR3BV weglSecondaryColor3bv; typedef void (APIENTRY * WXEGLSECONDARYCOLOR3DV)(const GLdouble *); @@ -956,36 +956,16 @@ WXE_EXTERN WXEGLBINDBUFFERRANGE weglBindBufferRange; typedef void (APIENTRY * WXEGLBINDBUFFERBASE)(GLenum,GLuint,GLuint); WXE_EXTERN WXEGLBINDBUFFERBASE weglBindBufferBase; +typedef void (APIENTRY * WXEGLTRANSFORMFEEDBACKVARYINGS)(GLuint,GLsizei,const GLchar **,GLenum); +WXE_EXTERN WXEGLTRANSFORMFEEDBACKVARYINGS weglTransformFeedbackVaryings; +typedef void (APIENTRY * WXEGLGETTRANSFORMFEEDBACKVARYING)(GLuint,GLuint,GLsizei,GLsizei *,GLsizei *,GLenum *,GLchar *); +WXE_EXTERN WXEGLGETTRANSFORMFEEDBACKVARYING weglGetTransformFeedbackVarying; typedef void (APIENTRY * WXEGLCLAMPCOLOR)(GLenum,GLenum); WXE_EXTERN WXEGLCLAMPCOLOR weglClampColor; typedef void (APIENTRY * WXEGLBEGINCONDITIONALRENDER)(GLuint,GLenum); WXE_EXTERN WXEGLBEGINCONDITIONALRENDER weglBeginConditionalRender; typedef void (APIENTRY * WXEGLENDCONDITIONALRENDER)(); WXE_EXTERN WXEGLENDCONDITIONALRENDER weglEndConditionalRender; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI1IV)(GLuint,const GLint *); -WXE_EXTERN WXEGLVERTEXATTRIBI1IV weglVertexAttribI1iv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI2IV)(GLuint,const GLint *); -WXE_EXTERN WXEGLVERTEXATTRIBI2IV weglVertexAttribI2iv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI3IV)(GLuint,const GLint *); -WXE_EXTERN WXEGLVERTEXATTRIBI3IV weglVertexAttribI3iv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI4IV)(GLuint,const GLint *); -WXE_EXTERN WXEGLVERTEXATTRIBI4IV weglVertexAttribI4iv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI1UIV)(GLuint,const GLuint *); -WXE_EXTERN WXEGLVERTEXATTRIBI1UIV weglVertexAttribI1uiv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI2UIV)(GLuint,const GLuint *); -WXE_EXTERN WXEGLVERTEXATTRIBI2UIV weglVertexAttribI2uiv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI3UIV)(GLuint,const GLuint *); -WXE_EXTERN WXEGLVERTEXATTRIBI3UIV weglVertexAttribI3uiv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI4UIV)(GLuint,const GLuint *); -WXE_EXTERN WXEGLVERTEXATTRIBI4UIV weglVertexAttribI4uiv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI4BV)(GLuint,const GLbyte *); -WXE_EXTERN WXEGLVERTEXATTRIBI4BV weglVertexAttribI4bv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI4SV)(GLuint,const GLshort *); -WXE_EXTERN WXEGLVERTEXATTRIBI4SV weglVertexAttribI4sv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI4UBV)(GLuint,const GLubyte *); -WXE_EXTERN WXEGLVERTEXATTRIBI4UBV weglVertexAttribI4ubv; -typedef void (APIENTRY * WXEGLVERTEXATTRIBI4USV)(GLuint,const GLushort *); -WXE_EXTERN WXEGLVERTEXATTRIBI4USV weglVertexAttribI4usv; typedef void (APIENTRY * WXEGLVERTEXATTRIBIPOINTER)(GLuint,GLint,GLenum,GLsizei,const GLvoid *); WXE_EXTERN WXEGLVERTEXATTRIBIPOINTER weglVertexAttribIPointer; typedef void (APIENTRY * WXEGLGETVERTEXATTRIBIIV)(GLuint,GLenum,GLint *); @@ -1032,6 +1012,46 @@ WXE_EXTERN WXEGLCLEARBUFFERFI weglClearBufferfi; typedef const GLubyte * (APIENTRY * WXEGLGETSTRINGI)(GLenum,GLuint); WXE_EXTERN WXEGLGETSTRINGI weglGetStringi; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI1IV)(GLuint,const GLint *); +WXE_EXTERN WXEGLVERTEXATTRIBI1IV weglVertexAttribI1iv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI2IV)(GLuint,const GLint *); +WXE_EXTERN WXEGLVERTEXATTRIBI2IV weglVertexAttribI2iv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI3IV)(GLuint,const GLint *); +WXE_EXTERN WXEGLVERTEXATTRIBI3IV weglVertexAttribI3iv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI4IV)(GLuint,const GLint *); +WXE_EXTERN WXEGLVERTEXATTRIBI4IV weglVertexAttribI4iv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI1UIV)(GLuint,const GLuint *); +WXE_EXTERN WXEGLVERTEXATTRIBI1UIV weglVertexAttribI1uiv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI2UIV)(GLuint,const GLuint *); +WXE_EXTERN WXEGLVERTEXATTRIBI2UIV weglVertexAttribI2uiv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI3UIV)(GLuint,const GLuint *); +WXE_EXTERN WXEGLVERTEXATTRIBI3UIV weglVertexAttribI3uiv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI4UIV)(GLuint,const GLuint *); +WXE_EXTERN WXEGLVERTEXATTRIBI4UIV weglVertexAttribI4uiv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI4BV)(GLuint,const GLbyte *); +WXE_EXTERN WXEGLVERTEXATTRIBI4BV weglVertexAttribI4bv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI4SV)(GLuint,const GLshort *); +WXE_EXTERN WXEGLVERTEXATTRIBI4SV weglVertexAttribI4sv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI4UBV)(GLuint,const GLubyte *); +WXE_EXTERN WXEGLVERTEXATTRIBI4UBV weglVertexAttribI4ubv; +typedef void (APIENTRY * WXEGLVERTEXATTRIBI4USV)(GLuint,const GLushort *); +WXE_EXTERN WXEGLVERTEXATTRIBI4USV weglVertexAttribI4usv; +typedef void (APIENTRY * WXEGLDRAWARRAYSINSTANCED)(GLenum,GLint,GLsizei,GLsizei); +WXE_EXTERN WXEGLDRAWARRAYSINSTANCED weglDrawArraysInstanced; +typedef void (APIENTRY * WXEGLDRAWELEMENTSINSTANCED)(GLenum,GLsizei,GLenum,const GLvoid *,GLsizei); +WXE_EXTERN WXEGLDRAWELEMENTSINSTANCED weglDrawElementsInstanced; +typedef void (APIENTRY * WXEGLTEXBUFFER)(GLenum,GLenum,GLuint); +WXE_EXTERN WXEGLTEXBUFFER weglTexBuffer; +typedef void (APIENTRY * WXEGLPRIMITIVERESTARTINDEX)(GLuint); +WXE_EXTERN WXEGLPRIMITIVERESTARTINDEX weglPrimitiveRestartIndex; +typedef void (APIENTRY * WXEGLLOADTRANSPOSEMATRIXFARB)(const GLfloat *); +WXE_EXTERN WXEGLLOADTRANSPOSEMATRIXFARB weglLoadTransposeMatrixfARB; +typedef void (APIENTRY * WXEGLLOADTRANSPOSEMATRIXDARB)(const GLdouble *); +WXE_EXTERN WXEGLLOADTRANSPOSEMATRIXDARB weglLoadTransposeMatrixdARB; +typedef void (APIENTRY * WXEGLMULTTRANSPOSEMATRIXFARB)(const GLfloat *); +WXE_EXTERN WXEGLMULTTRANSPOSEMATRIXFARB weglMultTransposeMatrixfARB; +typedef void (APIENTRY * WXEGLMULTTRANSPOSEMATRIXDARB)(const GLdouble *); +WXE_EXTERN WXEGLMULTTRANSPOSEMATRIXDARB weglMultTransposeMatrixdARB; typedef void (APIENTRY * WXEGLWEIGHTBVARB)(GLint,const GLbyte *); WXE_EXTERN WXEGLWEIGHTBVARB weglWeightbvARB; typedef void (APIENTRY * WXEGLWEIGHTSVARB)(GLint,const GLshort *); @@ -1138,10 +1158,6 @@ WXE_EXTERN WXEGLGETACTIVEATTRIBARB weglGetActiveAttribARB; typedef GLint (APIENTRY * WXEGLGETATTRIBLOCATIONARB)(GLhandleARB,const GLchar *); WXE_EXTERN WXEGLGETATTRIBLOCATIONARB weglGetAttribLocationARB; -typedef void (APIENTRY * WXEGLDRAWARRAYSINSTANCEDARB)(GLenum,GLint,GLsizei,GLsizei); -WXE_EXTERN WXEGLDRAWARRAYSINSTANCEDARB weglDrawArraysInstancedARB; -typedef void (APIENTRY * WXEGLDRAWELEMENTSINSTANCEDARB)(GLenum,GLsizei,GLenum,const GLvoid *,GLsizei); -WXE_EXTERN WXEGLDRAWELEMENTSINSTANCEDARB weglDrawElementsInstancedARB; typedef GLboolean (APIENTRY * WXEGLISRENDERBUFFER)(GLuint); WXE_EXTERN WXEGLISRENDERBUFFER weglIsRenderbuffer; typedef void (APIENTRY * WXEGLBINDRENDERBUFFER)(GLenum,GLuint); @@ -1188,12 +1204,10 @@ WXE_EXTERN WXEGLFRAMEBUFFERTEXTUREARB weglFramebufferTextureARB; typedef void (APIENTRY * WXEGLFRAMEBUFFERTEXTUREFACEARB)(GLenum,GLenum,GLuint,GLint,GLenum); WXE_EXTERN WXEGLFRAMEBUFFERTEXTUREFACEARB weglFramebufferTextureFaceARB; -typedef void (APIENTRY * WXEGLVERTEXATTRIBDIVISOR)(GLuint,GLuint); -WXE_EXTERN WXEGLVERTEXATTRIBDIVISOR weglVertexAttribDivisor; +typedef void (APIENTRY * WXEGLVERTEXATTRIBDIVISORARB)(GLuint,GLuint); +WXE_EXTERN WXEGLVERTEXATTRIBDIVISORARB weglVertexAttribDivisorARB; typedef void (APIENTRY * WXEGLFLUSHMAPPEDBUFFERRANGE)(GLenum,GLintptr,GLsizeiptr); WXE_EXTERN WXEGLFLUSHMAPPEDBUFFERRANGE weglFlushMappedBufferRange; -typedef void (APIENTRY * WXEGLTEXBUFFERARB)(GLenum,GLenum,GLuint); -WXE_EXTERN WXEGLTEXBUFFERARB weglTexBufferARB; typedef void (APIENTRY * WXEGLBINDVERTEXARRAY)(GLuint); WXE_EXTERN WXEGLBINDVERTEXARRAY weglBindVertexArray; typedef void (APIENTRY * WXEGLDELETEVERTEXARRAYS)(GLsizei,const GLuint *); @@ -1202,6 +1216,22 @@ WXE_EXTERN WXEGLGENVERTEXARRAYS weglGenVertexArrays; typedef GLboolean (APIENTRY * WXEGLISVERTEXARRAY)(GLuint); WXE_EXTERN WXEGLISVERTEXARRAY weglIsVertexArray; +typedef void (APIENTRY * WXEGLGETUNIFORMINDICES)(GLuint,GLsizei,const GLchar **,GLuint *); +WXE_EXTERN WXEGLGETUNIFORMINDICES weglGetUniformIndices; +typedef void (APIENTRY * WXEGLGETACTIVEUNIFORMSIV)(GLuint,GLsizei,const GLuint *,GLenum,GLint *); +WXE_EXTERN WXEGLGETACTIVEUNIFORMSIV weglGetActiveUniformsiv; +typedef void (APIENTRY * WXEGLGETACTIVEUNIFORMNAME)(GLuint,GLuint,GLsizei,GLsizei *,GLchar *); +WXE_EXTERN WXEGLGETACTIVEUNIFORMNAME weglGetActiveUniformName; +typedef GLuint (APIENTRY * WXEGLGETUNIFORMBLOCKINDEX)(GLuint,const GLchar *); +WXE_EXTERN WXEGLGETUNIFORMBLOCKINDEX weglGetUniformBlockIndex; +typedef void (APIENTRY * WXEGLGETACTIVEUNIFORMBLOCKIV)(GLuint,GLuint,GLenum,GLint *); +WXE_EXTERN WXEGLGETACTIVEUNIFORMBLOCKIV weglGetActiveUniformBlockiv; +typedef void (APIENTRY * WXEGLGETACTIVEUNIFORMBLOCKNAME)(GLuint,GLuint,GLsizei,GLsizei *,GLchar *); +WXE_EXTERN WXEGLGETACTIVEUNIFORMBLOCKNAME weglGetActiveUniformBlockName; +typedef void (APIENTRY * WXEGLUNIFORMBLOCKBINDING)(GLuint,GLuint,GLuint); +WXE_EXTERN WXEGLUNIFORMBLOCKBINDING weglUniformBlockBinding; +typedef void (APIENTRY * WXEGLCOPYBUFFERSUBDATA)(GLenum,GLenum,GLintptr,GLintptr,GLsizeiptr); +WXE_EXTERN WXEGLCOPYBUFFERSUBDATA weglCopyBufferSubData; typedef void (APIENTRY * WXEGLRESIZEBUFFERSMESA)(); WXE_EXTERN WXEGLRESIZEBUFFERSMESA weglResizeBuffersMESA; typedef void (APIENTRY * WXEGLWINDOWPOS4DVMESA)(const GLdouble *); @@ -1230,20 +1260,42 @@ WXE_EXTERN WXEGLUBUILD3DMIPMAPS wegluBuild3DMipmaps; typedef GLboolean (APIENTRY * WXEGLUCHECKEXTENSION)(const GLubyte *,const GLubyte *); WXE_EXTERN WXEGLUCHECKEXTENSION wegluCheckExtension; +typedef void (APIENTRY * WXEGLUCYLINDER)(GLUquadric *,GLdouble,GLdouble,GLdouble,GLint,GLint); +WXE_EXTERN WXEGLUCYLINDER wegluCylinder; +typedef void (APIENTRY * WXEGLUDELETEQUADRIC)(GLUquadric *); +WXE_EXTERN WXEGLUDELETEQUADRIC wegluDeleteQuadric; +typedef void (APIENTRY * WXEGLUDISK)(GLUquadric *,GLdouble,GLdouble,GLint,GLint); +WXE_EXTERN WXEGLUDISK wegluDisk; typedef const GLubyte * (APIENTRY * WXEGLUERRORSTRING)(GLenum); WXE_EXTERN WXEGLUERRORSTRING wegluErrorString; typedef const GLubyte * (APIENTRY * WXEGLUGETSTRING)(GLenum); WXE_EXTERN WXEGLUGETSTRING wegluGetString; typedef void (APIENTRY * WXEGLULOOKAT)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble); WXE_EXTERN WXEGLULOOKAT wegluLookAt; +typedef GLUquadric * (APIENTRY * WXEGLUNEWQUADRIC)(); +WXE_EXTERN WXEGLUNEWQUADRIC wegluNewQuadric; typedef void (APIENTRY * WXEGLUORTHO2D)(GLdouble,GLdouble,GLdouble,GLdouble); WXE_EXTERN WXEGLUORTHO2D wegluOrtho2D; +typedef void (APIENTRY * WXEGLUPARTIALDISK)(GLUquadric *,GLdouble,GLdouble,GLint,GLint,GLdouble,GLdouble); +WXE_EXTERN WXEGLUPARTIALDISK wegluPartialDisk; typedef void (APIENTRY * WXEGLUPERSPECTIVE)(GLdouble,GLdouble,GLdouble,GLdouble); WXE_EXTERN WXEGLUPERSPECTIVE wegluPerspective; typedef void (APIENTRY * WXEGLUPICKMATRIX)(GLdouble,GLdouble,GLdouble,GLdouble,GLint *); WXE_EXTERN WXEGLUPICKMATRIX wegluPickMatrix; typedef GLint (APIENTRY * WXEGLUPROJECT)(GLdouble,GLdouble,GLdouble,const GLdouble *,const GLdouble *,const GLint *,GLdouble *,GLdouble *,GLdouble *); WXE_EXTERN WXEGLUPROJECT wegluProject; +typedef void (APIENTRY * WXEGLUQUADRICDRAWSTYLE)(GLUquadric *,GLenum); +WXE_EXTERN WXEGLUQUADRICDRAWSTYLE wegluQuadricDrawStyle; +typedef void (APIENTRY * WXEGLUQUADRICNORMALS)(GLUquadric *,GLenum); +WXE_EXTERN WXEGLUQUADRICNORMALS wegluQuadricNormals; +typedef void (APIENTRY * WXEGLUQUADRICORIENTATION)(GLUquadric *,GLenum); +WXE_EXTERN WXEGLUQUADRICORIENTATION wegluQuadricOrientation; +typedef void (APIENTRY * WXEGLUQUADRICTEXTURE)(GLUquadric *,GLboolean); +WXE_EXTERN WXEGLUQUADRICTEXTURE wegluQuadricTexture; +typedef GLint (APIENTRY * WXEGLUSCALEIMAGE)(GLenum,GLsizei,GLsizei,GLenum,const void *,GLsizei,GLsizei,GLenum,GLvoid *); +WXE_EXTERN WXEGLUSCALEIMAGE wegluScaleImage; +typedef void (APIENTRY * WXEGLUSPHERE)(GLUquadric *,GLdouble,GLint,GLint); +WXE_EXTERN WXEGLUSPHERE wegluSphere; typedef GLint (APIENTRY * WXEGLUUNPROJECT)(GLdouble,GLdouble,GLdouble,const GLdouble *,const GLdouble *,const GLint *,GLdouble *,GLdouble *,GLdouble *); WXE_EXTERN WXEGLUUNPROJECT wegluUnProject; typedef GLint (APIENTRY * WXEGLUUNPROJECT4)(GLdouble,GLdouble,GLdouble,GLdouble,const GLdouble *,const GLdouble *,const GLint *,GLdouble,GLdouble,GLdouble *,GLdouble *,GLdouble *,GLdouble *); diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/gen/gl_finit.h erlang-13.b.3-dfsg/lib/wx/c_src/gen/gl_finit.h --- erlang-13.b.1-dfsg/lib/wx/c_src/gen/gl_finit.h 2009-06-05 13:54:30.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/gen/gl_finit.h 2009-09-18 15:10:54.000000000 +0100 @@ -291,6 +291,9 @@ {"glBlendColor", NULL, &weglBlendColor}, {"glBlendEquation", NULL, &weglBlendEquation}, {"glDrawRangeElements", NULL, &weglDrawRangeElements}, + {"glTexImage3D", NULL, &weglTexImage3D}, + {"glTexSubImage3D", NULL, &weglTexSubImage3D}, + {"glCopyTexSubImage3D", NULL, &weglCopyTexSubImage3D}, {"glColorTable", "glColorTableSGI", &weglColorTable}, {"glColorTableParameterfv", "glColorTableParameterfvSGI", &weglColorTableParameterfv}, {"glColorTableParameteriv", "glColorTableParameterivSGI", &weglColorTableParameteriv}, @@ -320,10 +323,15 @@ {"glMinmax", NULL, &weglMinmax}, {"glResetHistogram", NULL, &weglResetHistogram}, {"glResetMinmax", NULL, &weglResetMinmax}, - {"glTexImage3D", NULL, &weglTexImage3D}, - {"glTexSubImage3D", NULL, &weglTexSubImage3D}, - {"glCopyTexSubImage3D", NULL, &weglCopyTexSubImage3D}, {"glActiveTexture", "glActiveTextureARB", &weglActiveTexture}, + {"glSampleCoverage", "glSampleCoverageARB", &weglSampleCoverage}, + {"glCompressedTexImage3D", "glCompressedTexImage3DARB", &weglCompressedTexImage3D}, + {"glCompressedTexImage2D", "glCompressedTexImage2DARB", &weglCompressedTexImage2D}, + {"glCompressedTexImage1D", "glCompressedTexImage1DARB", &weglCompressedTexImage1D}, + {"glCompressedTexSubImage3D", "glCompressedTexSubImage3DARB", &weglCompressedTexSubImage3D}, + {"glCompressedTexSubImage2D", "glCompressedTexSubImage2DARB", &weglCompressedTexSubImage2D}, + {"glCompressedTexSubImage1D", "glCompressedTexSubImage1DARB", &weglCompressedTexSubImage1D}, + {"glGetCompressedTexImage", "glGetCompressedTexImageARB", &weglGetCompressedTexImage}, {"glClientActiveTexture", "glClientActiveTextureARB", &weglClientActiveTexture}, {"glMultiTexCoord1dv", "glMultiTexCoord1dvARB", &weglMultiTexCoord1dv}, {"glMultiTexCoord1fv", "glMultiTexCoord1fvARB", &weglMultiTexCoord1fv}, @@ -341,27 +349,19 @@ {"glMultiTexCoord4fv", "glMultiTexCoord4fvARB", &weglMultiTexCoord4fv}, {"glMultiTexCoord4iv", "glMultiTexCoord4ivARB", &weglMultiTexCoord4iv}, {"glMultiTexCoord4sv", "glMultiTexCoord4svARB", &weglMultiTexCoord4sv}, - {"glLoadTransposeMatrixf", "glLoadTransposeMatrixfARB", &weglLoadTransposeMatrixf}, - {"glLoadTransposeMatrixd", "glLoadTransposeMatrixdARB", &weglLoadTransposeMatrixd}, - {"glMultTransposeMatrixf", "glMultTransposeMatrixfARB", &weglMultTransposeMatrixf}, - {"glMultTransposeMatrixd", "glMultTransposeMatrixdARB", &weglMultTransposeMatrixd}, - {"glSampleCoverage", "glSampleCoverageARB", &weglSampleCoverage}, - {"glCompressedTexImage3D", "glCompressedTexImage3DARB", &weglCompressedTexImage3D}, - {"glCompressedTexImage2D", "glCompressedTexImage2DARB", &weglCompressedTexImage2D}, - {"glCompressedTexImage1D", "glCompressedTexImage1DARB", &weglCompressedTexImage1D}, - {"glCompressedTexSubImage3D", "glCompressedTexSubImage3DARB", &weglCompressedTexSubImage3D}, - {"glCompressedTexSubImage2D", "glCompressedTexSubImage2DARB", &weglCompressedTexSubImage2D}, - {"glCompressedTexSubImage1D", "glCompressedTexSubImage1DARB", &weglCompressedTexSubImage1D}, - {"glGetCompressedTexImage", "glGetCompressedTexImageARB", &weglGetCompressedTexImage}, + {"glLoadTransposeMatrixf", NULL, &weglLoadTransposeMatrixf}, + {"glLoadTransposeMatrixd", NULL, &weglLoadTransposeMatrixd}, + {"glMultTransposeMatrixf", NULL, &weglMultTransposeMatrixf}, + {"glMultTransposeMatrixd", NULL, &weglMultTransposeMatrixd}, {"glBlendFuncSeparate", "glBlendFuncSeparateINGR", &weglBlendFuncSeparate}, - {"glFogCoordfv", NULL, &weglFogCoordfv}, - {"glFogCoorddv", NULL, &weglFogCoorddv}, - {"glFogCoordPointer", NULL, &weglFogCoordPointer}, {"glMultiDrawArrays", NULL, &weglMultiDrawArrays}, {"glPointParameterf", "glPointParameterfARB", &weglPointParameterf}, {"glPointParameterfv", "glPointParameterfvARB", &weglPointParameterfv}, {"glPointParameteri", NULL, &weglPointParameteri}, {"glPointParameteriv", NULL, &weglPointParameteriv}, + {"glFogCoordfv", NULL, &weglFogCoordfv}, + {"glFogCoorddv", NULL, &weglFogCoorddv}, + {"glFogCoordPointer", NULL, &weglFogCoordPointer}, {"glSecondaryColor3bv", NULL, &weglSecondaryColor3bv}, {"glSecondaryColor3dv", NULL, &weglSecondaryColor3dv}, {"glSecondaryColor3fv", NULL, &weglSecondaryColor3fv}, @@ -490,21 +490,11 @@ {"glEndTransformFeedback", NULL, &weglEndTransformFeedback}, {"glBindBufferRange", NULL, &weglBindBufferRange}, {"glBindBufferBase", NULL, &weglBindBufferBase}, + {"glTransformFeedbackVaryings", NULL, &weglTransformFeedbackVaryings}, + {"glGetTransformFeedbackVarying", NULL, &weglGetTransformFeedbackVarying}, {"glClampColor", "glClampColorARB", &weglClampColor}, {"glBeginConditionalRender", NULL, &weglBeginConditionalRender}, {"glEndConditionalRender", NULL, &weglEndConditionalRender}, - {"glVertexAttribI1iv", NULL, &weglVertexAttribI1iv}, - {"glVertexAttribI2iv", NULL, &weglVertexAttribI2iv}, - {"glVertexAttribI3iv", NULL, &weglVertexAttribI3iv}, - {"glVertexAttribI4iv", NULL, &weglVertexAttribI4iv}, - {"glVertexAttribI1uiv", NULL, &weglVertexAttribI1uiv}, - {"glVertexAttribI2uiv", NULL, &weglVertexAttribI2uiv}, - {"glVertexAttribI3uiv", NULL, &weglVertexAttribI3uiv}, - {"glVertexAttribI4uiv", NULL, &weglVertexAttribI4uiv}, - {"glVertexAttribI4bv", NULL, &weglVertexAttribI4bv}, - {"glVertexAttribI4sv", NULL, &weglVertexAttribI4sv}, - {"glVertexAttribI4ubv", NULL, &weglVertexAttribI4ubv}, - {"glVertexAttribI4usv", NULL, &weglVertexAttribI4usv}, {"glVertexAttribIPointer", NULL, &weglVertexAttribIPointer}, {"glGetVertexAttribIiv", NULL, &weglGetVertexAttribIiv}, {"glGetVertexAttribIuiv", NULL, &weglGetVertexAttribIuiv}, @@ -528,6 +518,26 @@ {"glClearBufferfv", NULL, &weglClearBufferfv}, {"glClearBufferfi", NULL, &weglClearBufferfi}, {"glGetStringi", NULL, &weglGetStringi}, + {"glVertexAttribI1iv", NULL, &weglVertexAttribI1iv}, + {"glVertexAttribI2iv", NULL, &weglVertexAttribI2iv}, + {"glVertexAttribI3iv", NULL, &weglVertexAttribI3iv}, + {"glVertexAttribI4iv", NULL, &weglVertexAttribI4iv}, + {"glVertexAttribI1uiv", NULL, &weglVertexAttribI1uiv}, + {"glVertexAttribI2uiv", NULL, &weglVertexAttribI2uiv}, + {"glVertexAttribI3uiv", NULL, &weglVertexAttribI3uiv}, + {"glVertexAttribI4uiv", NULL, &weglVertexAttribI4uiv}, + {"glVertexAttribI4bv", NULL, &weglVertexAttribI4bv}, + {"glVertexAttribI4sv", NULL, &weglVertexAttribI4sv}, + {"glVertexAttribI4ubv", NULL, &weglVertexAttribI4ubv}, + {"glVertexAttribI4usv", NULL, &weglVertexAttribI4usv}, + {"glDrawArraysInstanced", "glDrawArraysInstancedARB", &weglDrawArraysInstanced}, + {"glDrawElementsInstanced", "glDrawElementsInstancedARB", &weglDrawElementsInstanced}, + {"glTexBuffer", "glTexBufferARB", &weglTexBuffer}, + {"glPrimitiveRestartIndex", NULL, &weglPrimitiveRestartIndex}, + {"glLoadTransposeMatrixfARB", NULL, &weglLoadTransposeMatrixfARB}, + {"glLoadTransposeMatrixdARB", NULL, &weglLoadTransposeMatrixdARB}, + {"glMultTransposeMatrixfARB", NULL, &weglMultTransposeMatrixfARB}, + {"glMultTransposeMatrixdARB", NULL, &weglMultTransposeMatrixdARB}, {"glWeightbvARB", NULL, &weglWeightbvARB}, {"glWeightsvARB", NULL, &weglWeightsvARB}, {"glWeightivARB", NULL, &weglWeightivARB}, @@ -581,8 +591,6 @@ {"glBindAttribLocationARB", NULL, &weglBindAttribLocationARB}, {"glGetActiveAttribARB", NULL, &weglGetActiveAttribARB}, {"glGetAttribLocationARB", NULL, &weglGetAttribLocationARB}, - {"glDrawArraysInstancedARB", NULL, &weglDrawArraysInstancedARB}, - {"glDrawElementsInstancedARB", NULL, &weglDrawElementsInstancedARB}, {"glIsRenderbuffer", "glIsRenderbufferEXT", &weglIsRenderbuffer}, {"glBindRenderbuffer", "glBindRenderbufferEXT", &weglBindRenderbuffer}, {"glDeleteRenderbuffers", "glDeleteRenderbuffersEXT", &weglDeleteRenderbuffers}, @@ -606,13 +614,20 @@ {"glProgramParameteriARB", NULL, &weglProgramParameteriARB}, {"glFramebufferTextureARB", NULL, &weglFramebufferTextureARB}, {"glFramebufferTextureFaceARB", NULL, &weglFramebufferTextureFaceARB}, - {"glVertexAttribDivisor", NULL, &weglVertexAttribDivisor}, + {"glVertexAttribDivisorARB", NULL, &weglVertexAttribDivisorARB}, {"glFlushMappedBufferRange", NULL, &weglFlushMappedBufferRange}, - {"glTexBufferARB", NULL, &weglTexBufferARB}, {"glBindVertexArray", NULL, &weglBindVertexArray}, {"glDeleteVertexArrays", NULL, &weglDeleteVertexArrays}, {"glGenVertexArrays", NULL, &weglGenVertexArrays}, {"glIsVertexArray", NULL, &weglIsVertexArray}, + {"glGetUniformIndices", NULL, &weglGetUniformIndices}, + {"glGetActiveUniformsiv", NULL, &weglGetActiveUniformsiv}, + {"glGetActiveUniformName", NULL, &weglGetActiveUniformName}, + {"glGetUniformBlockIndex", NULL, &weglGetUniformBlockIndex}, + {"glGetActiveUniformBlockiv", NULL, &weglGetActiveUniformBlockiv}, + {"glGetActiveUniformBlockName", NULL, &weglGetActiveUniformBlockName}, + {"glUniformBlockBinding", NULL, &weglUniformBlockBinding}, + {"glCopyBufferSubData", NULL, &weglCopyBufferSubData}, {"glResizeBuffersMESA", NULL, &weglResizeBuffersMESA}, {"glWindowPos4dvMESA", NULL, &weglWindowPos4dvMESA}, {"glWindowPos4fvMESA", NULL, &weglWindowPos4fvMESA}, diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/gen/gl_funcs.cpp erlang-13.b.3-dfsg/lib/wx/c_src/gen/gl_funcs.cpp --- erlang-13.b.1-dfsg/lib/wx/c_src/gen/gl_funcs.cpp 2009-06-05 13:54:30.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/gen/gl_funcs.cpp 2009-09-18 15:10:54.000000000 +0100 @@ -43,10 +43,16 @@ switch(op) { - case 5000: { + case 5000: wxe_tess_impl(bp, caller); -}; break; -case 5001: { // gluBuild1DMipmapLevels + break; + case WXE_BIN_INCR: + driver_binary_inc_refc(bins[0]->bin); + break; + case WXE_BIN_DECR: + driver_binary_dec_refc(bins[0]->bin); + break; +case 5010: { // gluBuild1DMipmapLevels GLenum *target = (GLenum *) bp; bp += 4; GLint *internalFormat = (GLint *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -64,7 +70,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5002: { // gluBuild1DMipmaps +case 5011: { // gluBuild1DMipmaps GLenum *target = (GLenum *) bp; bp += 4; GLint *internalFormat = (GLint *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -79,7 +85,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5003: { // gluBuild2DMipmapLevels +case 5012: { // gluBuild2DMipmapLevels GLenum *target = (GLenum *) bp; bp += 4; GLint *internalFormat = (GLint *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -98,7 +104,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5004: { // gluBuild2DMipmaps +case 5013: { // gluBuild2DMipmaps GLenum *target = (GLenum *) bp; bp += 4; GLint *internalFormat = (GLint *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -114,7 +120,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5005: { // gluBuild3DMipmapLevels +case 5014: { // gluBuild3DMipmapLevels GLenum *target = (GLenum *) bp; bp += 4; GLint *internalFormat = (GLint *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -134,7 +140,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5006: { // gluBuild3DMipmaps +case 5015: { // gluBuild3DMipmaps GLenum *target = (GLenum *) bp; bp += 4; GLint *internalFormat = (GLint *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -151,7 +157,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5007: { // gluCheckExtension +case 5016: { // gluCheckExtension int * extNameLen = (int *) bp; bp += 4; GLubyte * extName = (GLubyte *) bp; bp += (8-((*extNameLen*1+4)%8))%8; int * extStringLen = (int *) bp; bp += 4; @@ -164,7 +170,28 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5008: { // gluErrorString +case 5017: { // gluCylinder + GLUquadric * quad = (GLUquadric *) * (GLuint64EXT *) bp; bp += 8; + GLdouble *base = (GLdouble *) bp; bp += 8; + GLdouble *top = (GLdouble *) bp; bp += 8; + GLdouble *height = (GLdouble *) bp; bp += 8; + GLint *slices = (GLint *) bp; bp += 4; + GLint *stacks = (GLint *) bp; bp += 4; + wegluCylinder(quad,*base,*top,*height,*slices,*stacks); +}; break; +case 5018: { // gluDeleteQuadric + GLUquadric * quad = (GLUquadric *) * (GLuint64EXT *) bp; bp += 8; + wegluDeleteQuadric(quad); +}; break; +case 5019: { // gluDisk + GLUquadric * quad = (GLUquadric *) * (GLuint64EXT *) bp; bp += 8; + GLdouble *inner = (GLdouble *) bp; bp += 8; + GLdouble *outer = (GLdouble *) bp; bp += 8; + GLint *slices = (GLint *) bp; bp += 4; + GLint *loops = (GLint *) bp; bp += 4; + wegluDisk(quad,*inner,*outer,*slices,*loops); +}; break; +case 5020: { // gluErrorString GLenum *error = (GLenum *) bp; bp += 4; const GLubyte * result = wegluErrorString(*error); int AP = 0; ErlDrvTermData rt[7]; @@ -174,7 +201,7 @@ if (AP != 7 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,7); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5009: { // gluGetString +case 5021: { // gluGetString GLenum *name = (GLenum *) bp; bp += 4; const GLubyte * result = wegluGetString(*name); int AP = 0; ErlDrvTermData rt[7]; @@ -184,7 +211,7 @@ if (AP != 7 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,7); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5010: { // gluLookAt +case 5022: { // gluLookAt GLdouble *eyeX = (GLdouble *) bp; bp += 8; GLdouble *eyeY = (GLdouble *) bp; bp += 8; GLdouble *eyeZ = (GLdouble *) bp; bp += 8; @@ -196,21 +223,40 @@ GLdouble *upZ = (GLdouble *) bp; bp += 8; wegluLookAt(*eyeX,*eyeY,*eyeZ,*centerX,*centerY,*centerZ,*upX,*upY,*upZ); }; break; -case 5011: { // gluOrtho2D +case 5023: { // gluNewQuadric + GLUquadric * result = wegluNewQuadric(); + int AP = 0; ErlDrvTermData rt[6]; + rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); + rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) result; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; + if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); + driver_send_term(WXE_DRV_PORT,caller,rt,AP); +}; break; +case 5024: { // gluOrtho2D GLdouble *left = (GLdouble *) bp; bp += 8; GLdouble *right = (GLdouble *) bp; bp += 8; GLdouble *bottom = (GLdouble *) bp; bp += 8; GLdouble *top = (GLdouble *) bp; bp += 8; wegluOrtho2D(*left,*right,*bottom,*top); }; break; -case 5012: { // gluPerspective +case 5025: { // gluPartialDisk + GLUquadric * quad = (GLUquadric *) * (GLuint64EXT *) bp; bp += 8; + GLdouble *inner = (GLdouble *) bp; bp += 8; + GLdouble *outer = (GLdouble *) bp; bp += 8; + GLint *slices = (GLint *) bp; bp += 4; + GLint *loops = (GLint *) bp; bp += 4; + GLdouble *start = (GLdouble *) bp; bp += 8; + GLdouble *sweep = (GLdouble *) bp; bp += 8; + wegluPartialDisk(quad,*inner,*outer,*slices,*loops,*start,*sweep); +}; break; +case 5026: { // gluPerspective GLdouble *fovy = (GLdouble *) bp; bp += 8; GLdouble *aspect = (GLdouble *) bp; bp += 8; GLdouble *zNear = (GLdouble *) bp; bp += 8; GLdouble *zFar = (GLdouble *) bp; bp += 8; wegluPerspective(*fovy,*aspect,*zNear,*zFar); }; break; -case 5013: { // gluPickMatrix +case 5027: { // gluPickMatrix GLdouble *x = (GLdouble *) bp; bp += 8; GLdouble *y = (GLdouble *) bp; bp += 8; GLdouble *delX = (GLdouble *) bp; bp += 8; @@ -218,7 +264,7 @@ GLint * viewport = (GLint *) bp; bp += 16; wegluPickMatrix(*x,*y,*delX,*delY,viewport); }; break; -case 5014: { // gluProject +case 5028: { // gluProject GLdouble *objX = (GLdouble *) bp; bp += 8; GLdouble *objY = (GLdouble *) bp; bp += 8; GLdouble *objZ = (GLdouble *) bp; bp += 8; @@ -229,17 +275,63 @@ GLdouble winY[1] = {0.0}; GLdouble winZ[1] = {0.0}; GLint result = wegluProject(*objX,*objY,*objZ,model,proj,view,winX,winY,winZ); - int AP = 0; ErlDrvTermData rt[12]; + int AP = 0; ErlDrvTermData rt[14]; rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) result; rt[AP++] = ERL_DRV_FLOAT; rt[AP++] = (ErlDrvTermData) winX; rt[AP++] = ERL_DRV_FLOAT; rt[AP++] = (ErlDrvTermData) winY; rt[AP++] = ERL_DRV_FLOAT; rt[AP++] = (ErlDrvTermData) winZ; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 4; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; + if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); + driver_send_term(WXE_DRV_PORT,caller,rt,AP); +}; break; +case 5029: { // gluQuadricDrawStyle + GLUquadric * quad = (GLUquadric *) * (GLuint64EXT *) bp; bp += 8; + GLenum *draw = (GLenum *) bp; bp += 4; + wegluQuadricDrawStyle(quad,*draw); +}; break; +case 5030: { // gluQuadricNormals + GLUquadric * quad = (GLUquadric *) * (GLuint64EXT *) bp; bp += 8; + GLenum *normal = (GLenum *) bp; bp += 4; + wegluQuadricNormals(quad,*normal); +}; break; +case 5031: { // gluQuadricOrientation + GLUquadric * quad = (GLUquadric *) * (GLuint64EXT *) bp; bp += 8; + GLenum *orientation = (GLenum *) bp; bp += 4; + wegluQuadricOrientation(quad,*orientation); +}; break; +case 5032: { // gluQuadricTexture + GLUquadric * quad = (GLUquadric *) * (GLuint64EXT *) bp; bp += 8; + GLboolean *texture = (GLboolean *) bp; bp += 1; + wegluQuadricTexture(quad,*texture); +}; break; +case 5033: { // gluScaleImage + GLenum *format = (GLenum *) bp; bp += 4; + GLsizei *wIn = (GLsizei *) bp; bp += 4; + GLsizei *hIn = (GLsizei *) bp; bp += 4; + GLenum *typeIn = (GLenum *) bp; bp += 4; + void *dataIn = (void *) bins[0]->base; + GLsizei *wOut = (GLsizei *) bp; bp += 4; + GLsizei *hOut = (GLsizei *) bp; bp += 4; + GLenum *typeOut = (GLenum *) bp; bp += 4; + GLvoid *dataOut = (GLvoid *) bins[1]->base; + GLint result = wegluScaleImage(*format,*wIn,*hIn,*typeIn,dataIn,*wOut,*hOut,*typeOut,dataOut); + int AP = 0; ErlDrvTermData rt[6]; + rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); + rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) result; rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; - if (AP != 12 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,12); + if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5015: { // gluUnProject +case 5034: { // gluSphere + GLUquadric * quad = (GLUquadric *) * (GLuint64EXT *) bp; bp += 8; + GLdouble *radius = (GLdouble *) bp; bp += 8; + GLint *slices = (GLint *) bp; bp += 4; + GLint *stacks = (GLint *) bp; bp += 4; + wegluSphere(quad,*radius,*slices,*stacks); +}; break; +case 5035: { // gluUnProject GLdouble *winX = (GLdouble *) bp; bp += 8; GLdouble *winY = (GLdouble *) bp; bp += 8; GLdouble *winZ = (GLdouble *) bp; bp += 8; @@ -250,17 +342,18 @@ GLdouble objY[1] = {0.0}; GLdouble objZ[1] = {0.0}; GLint result = wegluUnProject(*winX,*winY,*winZ,model,proj,view,objX,objY,objZ); - int AP = 0; ErlDrvTermData rt[12]; + int AP = 0; ErlDrvTermData rt[14]; rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) result; rt[AP++] = ERL_DRV_FLOAT; rt[AP++] = (ErlDrvTermData) objX; rt[AP++] = ERL_DRV_FLOAT; rt[AP++] = (ErlDrvTermData) objY; rt[AP++] = ERL_DRV_FLOAT; rt[AP++] = (ErlDrvTermData) objZ; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 4; rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; - if (AP != 12 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,12); + if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5016: { // gluUnProject4 +case 5036: { // gluUnProject4 GLdouble *winX = (GLdouble *) bp; bp += 8; GLdouble *winY = (GLdouble *) bp; bp += 8; GLdouble *winZ = (GLdouble *) bp; bp += 8; @@ -275,60 +368,62 @@ GLdouble objZ[1] = {0.0}; GLdouble objW[1] = {0.0}; GLint result = wegluUnProject4(*winX,*winY,*winZ,*clipW,model,proj,view,*nearVal,*farVal,objX,objY,objZ,objW); - int AP = 0; ErlDrvTermData rt[14]; + int AP = 0; ErlDrvTermData rt[16]; rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) result; rt[AP++] = ERL_DRV_FLOAT; rt[AP++] = (ErlDrvTermData) objX; rt[AP++] = ERL_DRV_FLOAT; rt[AP++] = (ErlDrvTermData) objY; rt[AP++] = ERL_DRV_FLOAT; rt[AP++] = (ErlDrvTermData) objZ; rt[AP++] = ERL_DRV_FLOAT; rt[AP++] = (ErlDrvTermData) objW; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 5; rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; - if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); + if (AP != 16 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,16); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5017: { // glAccum +case 5037: { // glAccum GLenum *op = (GLenum *) bp; bp += 4; GLfloat *value = (GLfloat *) bp; bp += 4; weglAccum(*op,*value); }; break; -case 5018: { // glAlphaFunc +case 5038: { // glAlphaFunc GLenum *func = (GLenum *) bp; bp += 4; GLclampf *ref = (GLclampf *) bp; bp += 4; weglAlphaFunc(*func,*ref); }; break; -case 5019: { // glAreTexturesResident +case 5039: { // glAreTexturesResident int * texturesLen = (int *) bp; bp += 4; GLuint * textures = (GLuint *) bp; bp += (8-((*texturesLen*4+4)%8))%8; GLboolean *residences; residences = (GLboolean *) driver_alloc(sizeof(GLboolean) * *texturesLen); GLboolean result = weglAreTexturesResident(*texturesLen,textures,residences); int AP = 0; ErlDrvTermData *rt; - rt = (ErlDrvTermData *) driver_alloc(sizeof(ErlDrvTermData)*(9 + (*texturesLen)*2)); + rt = (ErlDrvTermData *) driver_alloc(sizeof(ErlDrvTermData)*(11 + (*texturesLen)*2)); rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) result; for(int i=0; i < *texturesLen; i++) { rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) residences[i];} rt[AP++] = ERL_DRV_NIL; rt[AP++] = ERL_DRV_LIST; rt[AP++] = (*texturesLen)+1; rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; - if (AP != 9 + (*texturesLen)*2 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,9 + (*texturesLen)*2); + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; + if (AP != 11 + (*texturesLen)*2 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,11 + (*texturesLen)*2); driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free(rt); driver_free(residences); }; break; -case 5020: { // glArrayElement +case 5040: { // glArrayElement GLint *i = (GLint *) bp; bp += 4; weglArrayElement(*i); }; break; -case 5021: { // glBegin +case 5041: { // glBegin GLenum *mode = (GLenum *) bp; bp += 4; weglBegin(*mode); }; break; -case 5022: { // glBindTexture +case 5042: { // glBindTexture GLenum *target = (GLenum *) bp; bp += 4; GLuint *texture = (GLuint *) bp; bp += 4; weglBindTexture(*target,*texture); }; break; -case 5023: { // glBitmap +case 5043: { // glBitmap GLsizei *width = (GLsizei *) bp; bp += 4; GLsizei *height = (GLsizei *) bp; bp += 4; GLfloat *xorig = (GLfloat *) bp; bp += 4; @@ -338,7 +433,7 @@ GLubyte *bitmap = (GLubyte *) * (int *) bp; bp += 4; weglBitmap(*width,*height,*xorig,*yorig,*xmove,*ymove,bitmap); }; break; -case 5024: { // glBitmap +case 5044: { // glBitmap GLsizei *width = (GLsizei *) bp; bp += 4; GLsizei *height = (GLsizei *) bp; bp += 4; GLfloat *xorig = (GLfloat *) bp; bp += 4; @@ -348,147 +443,147 @@ GLubyte *bitmap = (GLubyte *) bins[0]->base; weglBitmap(*width,*height,*xorig,*yorig,*xmove,*ymove,bitmap); }; break; -case 5025: { // glBlendFunc +case 5045: { // glBlendFunc GLenum *sfactor = (GLenum *) bp; bp += 4; GLenum *dfactor = (GLenum *) bp; bp += 4; weglBlendFunc(*sfactor,*dfactor); }; break; -case 5026: { // glCallList +case 5046: { // glCallList GLuint *list = (GLuint *) bp; bp += 4; weglCallList(*list); }; break; -case 5027: { // glCallLists +case 5047: { // glCallLists int * listsLen = (int *) bp; bp += 4; GLuint * lists = (GLuint *) bp; bp += (8-((*listsLen*4+4)%8))%8; weglCallLists(*listsLen,GL_UNSIGNED_INT,lists); }; break; -case 5028: { // glClear +case 5048: { // glClear GLbitfield *mask = (GLbitfield *) bp; bp += 4; weglClear(*mask); }; break; -case 5029: { // glClearAccum +case 5049: { // glClearAccum GLfloat *red = (GLfloat *) bp; bp += 4; GLfloat *green = (GLfloat *) bp; bp += 4; GLfloat *blue = (GLfloat *) bp; bp += 4; GLfloat *alpha = (GLfloat *) bp; bp += 4; weglClearAccum(*red,*green,*blue,*alpha); }; break; -case 5030: { // glClearColor +case 5050: { // glClearColor GLclampf *red = (GLclampf *) bp; bp += 4; GLclampf *green = (GLclampf *) bp; bp += 4; GLclampf *blue = (GLclampf *) bp; bp += 4; GLclampf *alpha = (GLclampf *) bp; bp += 4; weglClearColor(*red,*green,*blue,*alpha); }; break; -case 5031: { // glClearDepth +case 5051: { // glClearDepth GLclampd *depth = (GLclampd *) bp; bp += 8; weglClearDepth(*depth); }; break; -case 5032: { // glClearIndex +case 5052: { // glClearIndex GLfloat *c = (GLfloat *) bp; bp += 4; weglClearIndex(*c); }; break; -case 5033: { // glClearStencil +case 5053: { // glClearStencil GLint *s = (GLint *) bp; bp += 4; weglClearStencil(*s); }; break; -case 5034: { // glClipPlane +case 5054: { // glClipPlane GLenum *plane = (GLenum *) bp; bp += 4; bp += 4; GLdouble * equation = (GLdouble *) bp; bp += 32; weglClipPlane(*plane,equation); }; break; -case 5035: { // glColor3bv +case 5055: { // glColor3bv GLbyte *v = (GLbyte *) bp; bp += 1; weglColor3bv(v); }; break; -case 5036: { // glColor3dv +case 5056: { // glColor3dv GLdouble *v = (GLdouble *) bp; bp += 8; weglColor3dv(v); }; break; -case 5037: { // glColor3fv +case 5057: { // glColor3fv GLfloat *v = (GLfloat *) bp; bp += 4; weglColor3fv(v); }; break; -case 5038: { // glColor3iv +case 5058: { // glColor3iv GLint *v = (GLint *) bp; bp += 4; weglColor3iv(v); }; break; -case 5039: { // glColor3sv +case 5059: { // glColor3sv GLshort *v = (GLshort *) bp; bp += 2; weglColor3sv(v); }; break; -case 5040: { // glColor3ubv +case 5060: { // glColor3ubv GLubyte *v = (GLubyte *) bp; bp += 1; weglColor3ubv(v); }; break; -case 5041: { // glColor3uiv +case 5061: { // glColor3uiv GLuint *v = (GLuint *) bp; bp += 4; weglColor3uiv(v); }; break; -case 5042: { // glColor3usv +case 5062: { // glColor3usv GLushort *v = (GLushort *) bp; bp += 2; weglColor3usv(v); }; break; -case 5043: { // glColor4bv +case 5063: { // glColor4bv GLbyte *v = (GLbyte *) bp; bp += 1; weglColor4bv(v); }; break; -case 5044: { // glColor4dv +case 5064: { // glColor4dv GLdouble *v = (GLdouble *) bp; bp += 8; weglColor4dv(v); }; break; -case 5045: { // glColor4fv +case 5065: { // glColor4fv GLfloat *v = (GLfloat *) bp; bp += 4; weglColor4fv(v); }; break; -case 5046: { // glColor4iv +case 5066: { // glColor4iv GLint *v = (GLint *) bp; bp += 4; weglColor4iv(v); }; break; -case 5047: { // glColor4sv +case 5067: { // glColor4sv GLshort *v = (GLshort *) bp; bp += 2; weglColor4sv(v); }; break; -case 5048: { // glColor4ubv +case 5068: { // glColor4ubv GLubyte *v = (GLubyte *) bp; bp += 1; weglColor4ubv(v); }; break; -case 5049: { // glColor4uiv +case 5069: { // glColor4uiv GLuint *v = (GLuint *) bp; bp += 4; weglColor4uiv(v); }; break; -case 5050: { // glColor4usv +case 5070: { // glColor4usv GLushort *v = (GLushort *) bp; bp += 2; weglColor4usv(v); }; break; -case 5051: { // glColorMask +case 5071: { // glColorMask GLboolean *red = (GLboolean *) bp; bp += 1; GLboolean *green = (GLboolean *) bp; bp += 1; GLboolean *blue = (GLboolean *) bp; bp += 1; GLboolean *alpha = (GLboolean *) bp; bp += 1; weglColorMask(*red,*green,*blue,*alpha); }; break; -case 5052: { // glColorMaterial +case 5072: { // glColorMaterial GLenum *face = (GLenum *) bp; bp += 4; GLenum *mode = (GLenum *) bp; bp += 4; weglColorMaterial(*face,*mode); }; break; -case 5053: { // glColorPointer +case 5073: { // glColorPointer GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; weglColorPointer(*size,*type,*stride,pointer); }; break; -case 5054: { // glColorPointer +case 5074: { // glColorPointer GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) bins[0]->base; weglColorPointer(*size,*type,*stride,pointer); }; break; -case 5055: { // glCopyPixels +case 5075: { // glCopyPixels GLint *x = (GLint *) bp; bp += 4; GLint *y = (GLint *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -496,7 +591,7 @@ GLenum *type = (GLenum *) bp; bp += 4; weglCopyPixels(*x,*y,*width,*height,*type); }; break; -case 5056: { // glCopyTexImage1D +case 5076: { // glCopyTexImage1D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *internalFormat = (GLenum *) bp; bp += 4; @@ -506,7 +601,7 @@ GLint *border = (GLint *) bp; bp += 4; weglCopyTexImage1D(*target,*level,*internalFormat,*x,*y,*width,*border); }; break; -case 5057: { // glCopyTexImage2D +case 5077: { // glCopyTexImage2D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *internalFormat = (GLenum *) bp; bp += 4; @@ -517,7 +612,7 @@ GLint *border = (GLint *) bp; bp += 4; weglCopyTexImage2D(*target,*level,*internalFormat,*x,*y,*width,*height,*border); }; break; -case 5058: { // glCopyTexSubImage1D +case 5078: { // glCopyTexSubImage1D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -526,7 +621,7 @@ GLsizei *width = (GLsizei *) bp; bp += 4; weglCopyTexSubImage1D(*target,*level,*xoffset,*x,*y,*width); }; break; -case 5059: { // glCopyTexSubImage2D +case 5079: { // glCopyTexSubImage2D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -537,66 +632,66 @@ GLsizei *height = (GLsizei *) bp; bp += 4; weglCopyTexSubImage2D(*target,*level,*xoffset,*yoffset,*x,*y,*width,*height); }; break; -case 5060: { // glCullFace +case 5080: { // glCullFace GLenum *mode = (GLenum *) bp; bp += 4; weglCullFace(*mode); }; break; -case 5061: { // glDeleteLists +case 5081: { // glDeleteLists GLuint *list = (GLuint *) bp; bp += 4; GLsizei *range = (GLsizei *) bp; bp += 4; weglDeleteLists(*list,*range); }; break; -case 5062: { // glDeleteTextures +case 5082: { // glDeleteTextures int * texturesLen = (int *) bp; bp += 4; GLuint * textures = (GLuint *) bp; bp += (8-((*texturesLen*4+4)%8))%8; weglDeleteTextures(*texturesLen,textures); }; break; -case 5063: { // glDepthFunc +case 5083: { // glDepthFunc GLenum *func = (GLenum *) bp; bp += 4; weglDepthFunc(*func); }; break; -case 5064: { // glDepthMask +case 5084: { // glDepthMask GLboolean *flag = (GLboolean *) bp; bp += 1; weglDepthMask(*flag); }; break; -case 5065: { // glDepthRange +case 5085: { // glDepthRange GLclampd *zNear = (GLclampd *) bp; bp += 8; GLclampd *zFar = (GLclampd *) bp; bp += 8; weglDepthRange(*zNear,*zFar); }; break; -case 5066: { // glDisable +case 5086: { // glDisable GLenum *cap = (GLenum *) bp; bp += 4; weglDisable(*cap); }; break; -case 5067: { // glDisableClientState +case 5087: { // glDisableClientState GLenum *array = (GLenum *) bp; bp += 4; weglDisableClientState(*array); }; break; -case 5068: { // glDrawArrays +case 5088: { // glDrawArrays GLenum *mode = (GLenum *) bp; bp += 4; GLint *first = (GLint *) bp; bp += 4; GLsizei *count = (GLsizei *) bp; bp += 4; weglDrawArrays(*mode,*first,*count); }; break; -case 5069: { // glDrawBuffer +case 5089: { // glDrawBuffer GLenum *mode = (GLenum *) bp; bp += 4; weglDrawBuffer(*mode); }; break; -case 5070: { // glDrawElements +case 5090: { // glDrawElements GLenum *mode = (GLenum *) bp; bp += 4; GLsizei *count = (GLsizei *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLvoid *indices = (GLvoid *) * (int *) bp; bp += 4; weglDrawElements(*mode,*count,*type,indices); }; break; -case 5071: { // glDrawElements +case 5091: { // glDrawElements GLenum *mode = (GLenum *) bp; bp += 4; GLsizei *count = (GLsizei *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLvoid *indices = (GLvoid *) bins[0]->base; weglDrawElements(*mode,*count,*type,indices); }; break; -case 5072: { // glDrawPixels +case 5092: { // glDrawPixels GLsizei *width = (GLsizei *) bp; bp += 4; GLsizei *height = (GLsizei *) bp; bp += 4; GLenum *format = (GLenum *) bp; bp += 4; @@ -604,7 +699,7 @@ GLvoid *pixels = (GLvoid *) * (int *) bp; bp += 4; weglDrawPixels(*width,*height,*format,*type,pixels); }; break; -case 5073: { // glDrawPixels +case 5093: { // glDrawPixels GLsizei *width = (GLsizei *) bp; bp += 4; GLsizei *height = (GLsizei *) bp; bp += 4; GLenum *format = (GLenum *) bp; bp += 4; @@ -612,57 +707,57 @@ GLvoid *pixels = (GLvoid *) bins[0]->base; weglDrawPixels(*width,*height,*format,*type,pixels); }; break; -case 5074: { // glEdgeFlagv +case 5094: { // glEdgeFlagv GLboolean *flag = (GLboolean *) bp; bp += 1; weglEdgeFlagv(flag); }; break; -case 5075: { // glEdgeFlagPointer +case 5095: { // glEdgeFlagPointer GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; weglEdgeFlagPointer(*stride,pointer); }; break; -case 5076: { // glEdgeFlagPointer +case 5096: { // glEdgeFlagPointer GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) bins[0]->base; weglEdgeFlagPointer(*stride,pointer); }; break; -case 5077: { // glEnable +case 5097: { // glEnable GLenum *cap = (GLenum *) bp; bp += 4; weglEnable(*cap); }; break; -case 5078: { // glEnableClientState +case 5098: { // glEnableClientState GLenum *array = (GLenum *) bp; bp += 4; weglEnableClientState(*array); }; break; -case 5079: { // glEnd +case 5099: { // glEnd weglEnd(); }; break; -case 5080: { // glEndList +case 5100: { // glEndList weglEndList(); }; break; -case 5081: { // glEvalCoord1dv +case 5101: { // glEvalCoord1dv GLdouble *u = (GLdouble *) bp; bp += 8; weglEvalCoord1dv(u); }; break; -case 5082: { // glEvalCoord1fv +case 5102: { // glEvalCoord1fv GLfloat *u = (GLfloat *) bp; bp += 4; weglEvalCoord1fv(u); }; break; -case 5083: { // glEvalCoord2dv +case 5103: { // glEvalCoord2dv GLdouble *u = (GLdouble *) bp; bp += 8; weglEvalCoord2dv(u); }; break; -case 5084: { // glEvalCoord2fv +case 5104: { // glEvalCoord2fv GLfloat *u = (GLfloat *) bp; bp += 4; weglEvalCoord2fv(u); }; break; -case 5085: { // glEvalMesh1 +case 5105: { // glEvalMesh1 GLenum *mode = (GLenum *) bp; bp += 4; GLint *i1 = (GLint *) bp; bp += 4; GLint *i2 = (GLint *) bp; bp += 4; weglEvalMesh1(*mode,*i1,*i2); }; break; -case 5086: { // glEvalMesh2 +case 5106: { // glEvalMesh2 GLenum *mode = (GLenum *) bp; bp += 4; GLint *i1 = (GLint *) bp; bp += 4; GLint *i2 = (GLint *) bp; bp += 4; @@ -670,16 +765,16 @@ GLint *j2 = (GLint *) bp; bp += 4; weglEvalMesh2(*mode,*i1,*i2,*j1,*j2); }; break; -case 5087: { // glEvalPoint1 +case 5107: { // glEvalPoint1 GLint *i = (GLint *) bp; bp += 4; weglEvalPoint1(*i); }; break; -case 5088: { // glEvalPoint2 +case 5108: { // glEvalPoint2 GLint *i = (GLint *) bp; bp += 4; GLint *j = (GLint *) bp; bp += 4; weglEvalPoint2(*i,*j); }; break; -case 5089: { // glFeedbackBuffer +case 5109: { // glFeedbackBuffer GLsizei *size = (GLsizei *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLfloat *buffer = (GLfloat *) bins[0]->base; @@ -690,39 +785,39 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5090: { // glFinish +case 5110: { // glFinish weglFinish(); }; break; -case 5091: { // glFlush +case 5111: { // glFlush weglFlush(); }; break; -case 5092: { // glFogf +case 5112: { // glFogf GLenum *pname = (GLenum *) bp; bp += 4; GLfloat *param = (GLfloat *) bp; bp += 4; weglFogf(*pname,*param); }; break; -case 5093: { // glFogfv +case 5113: { // glFogfv GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLfloat *params = (GLfloat *) bp; bp += *paramsLen*4+((*paramsLen)+0)%2*4; weglFogfv(*pname,params); }; break; -case 5094: { // glFogi +case 5114: { // glFogi GLenum *pname = (GLenum *) bp; bp += 4; GLint *param = (GLint *) bp; bp += 4; weglFogi(*pname,*param); }; break; -case 5095: { // glFogiv +case 5115: { // glFogiv GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+0)%2*4; weglFogiv(*pname,params); }; break; -case 5096: { // glFrontFace +case 5116: { // glFrontFace GLenum *mode = (GLenum *) bp; bp += 4; weglFrontFace(*mode); }; break; -case 5097: { // glFrustum +case 5117: { // glFrustum GLdouble *left = (GLdouble *) bp; bp += 8; GLdouble *right = (GLdouble *) bp; bp += 8; GLdouble *bottom = (GLdouble *) bp; bp += 8; @@ -731,7 +826,7 @@ GLdouble *zFar = (GLdouble *) bp; bp += 8; weglFrustum(*left,*right,*bottom,*top,*zNear,*zFar); }; break; -case 5098: { // glGenLists +case 5118: { // glGenLists GLsizei *range = (GLsizei *) bp; bp += 4; GLuint result = weglGenLists(*range); int AP = 0; ErlDrvTermData rt[6]; @@ -741,7 +836,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5099: { // glGenTextures +case 5119: { // glGenTextures GLsizei *n = (GLsizei *) bp; bp += 4; GLuint *textures; textures = (GLuint *) driver_alloc(sizeof(GLuint) * *n); @@ -758,7 +853,7 @@ driver_free(rt); driver_free(textures); }; break; -case 5100: { // glGetBooleanv +case 5120: { // glGetBooleanv GLenum *pname = (GLenum *) bp; bp += 4; GLboolean params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; weglGetBooleanv(*pname,params); @@ -786,7 +881,7 @@ if (AP != 39 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,39); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5101: { // glGetClipPlane +case 5121: { // glGetClipPlane GLenum *plane = (GLenum *) bp; bp += 4; GLdouble equation[4] = {0.0,0.0,0.0,0.0}; weglGetClipPlane(*plane,equation); @@ -802,7 +897,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5102: { // glGetDoublev +case 5122: { // glGetDoublev GLenum *pname = (GLenum *) bp; bp += 4; GLdouble params[16] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; weglGetDoublev(*pname,params); @@ -830,7 +925,7 @@ if (AP != 39 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,39); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5103: { // glGetError +case 5123: { // glGetError GLenum result = weglGetError(); int AP = 0; ErlDrvTermData rt[6]; rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); @@ -839,7 +934,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5104: { // glGetFloatv +case 5124: { // glGetFloatv GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[16] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; weglGetFloatv(*pname,params); @@ -868,7 +963,7 @@ if (AP != 39 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,39); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5105: { // glGetIntegerv +case 5125: { // glGetIntegerv GLenum *pname = (GLenum *) bp; bp += 4; GLint params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; weglGetIntegerv(*pname,params); @@ -896,7 +991,7 @@ if (AP != 39 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,39); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5106: { // glGetLightfv +case 5126: { // glGetLightfv GLenum *light = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[4] = {0.0,0.0,0.0,0.0}; @@ -914,7 +1009,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5107: { // glGetLightiv +case 5127: { // glGetLightiv GLenum *light = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[4] = {0,0,0,0}; @@ -931,7 +1026,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5108: { // glGetMapdv +case 5128: { // glGetMapdv GLenum *target = (GLenum *) bp; bp += 4; GLenum *query = (GLenum *) bp; bp += 4; GLdouble *v = (GLdouble *) bins[0]->base; @@ -942,7 +1037,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5109: { // glGetMapfv +case 5129: { // glGetMapfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *query = (GLenum *) bp; bp += 4; GLfloat *v = (GLfloat *) bins[0]->base; @@ -953,7 +1048,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5110: { // glGetMapiv +case 5130: { // glGetMapiv GLenum *target = (GLenum *) bp; bp += 4; GLenum *query = (GLenum *) bp; bp += 4; GLint *v = (GLint *) bins[0]->base; @@ -964,7 +1059,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5111: { // glGetMaterialfv +case 5131: { // glGetMaterialfv GLenum *face = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[4] = {0.0,0.0,0.0,0.0}; @@ -982,7 +1077,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5112: { // glGetMaterialiv +case 5132: { // glGetMaterialiv GLenum *face = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[4] = {0,0,0,0}; @@ -999,7 +1094,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5113: { // glGetPixelMapfv +case 5133: { // glGetPixelMapfv GLenum *map = (GLenum *) bp; bp += 4; GLfloat *values = (GLfloat *) bins[0]->base; weglGetPixelMapfv(*map,values); @@ -1009,7 +1104,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5114: { // glGetPixelMapuiv +case 5134: { // glGetPixelMapuiv GLenum *map = (GLenum *) bp; bp += 4; GLuint *values = (GLuint *) bins[0]->base; weglGetPixelMapuiv(*map,values); @@ -1019,7 +1114,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5115: { // glGetPixelMapusv +case 5135: { // glGetPixelMapusv GLenum *map = (GLenum *) bp; bp += 4; GLushort *values = (GLushort *) bins[0]->base; weglGetPixelMapusv(*map,values); @@ -1029,7 +1124,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5116: { // glGetPolygonStipple +case 5136: { // glGetPolygonStipple GLubyte mask[128]; weglGetPolygonStipple(mask); int AP = 0; ErlDrvTermData rt[8]; @@ -1042,7 +1137,7 @@ driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free_binary(BinCopy); }; break; -case 5117: { // glGetString +case 5137: { // glGetString GLenum *name = (GLenum *) bp; bp += 4; const GLubyte * result = weglGetString(*name); int AP = 0; ErlDrvTermData rt[7]; @@ -1052,7 +1147,7 @@ if (AP != 7 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,7); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5118: { // glGetTexEnvfv +case 5138: { // glGetTexEnvfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[4] = {0.0,0.0,0.0,0.0}; @@ -1070,7 +1165,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5119: { // glGetTexEnviv +case 5139: { // glGetTexEnviv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[4] = {0,0,0,0}; @@ -1087,7 +1182,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5120: { // glGetTexGendv +case 5140: { // glGetTexGendv GLenum *coord = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLdouble params[4] = {0.0,0.0,0.0,0.0}; @@ -1104,7 +1199,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5121: { // glGetTexGenfv +case 5141: { // glGetTexGenfv GLenum *coord = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[4] = {0.0,0.0,0.0,0.0}; @@ -1122,7 +1217,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5122: { // glGetTexGeniv +case 5142: { // glGetTexGeniv GLenum *coord = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[4] = {0,0,0,0}; @@ -1139,7 +1234,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5123: { // glGetTexImage +case 5143: { // glGetTexImage GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *format = (GLenum *) bp; bp += 4; @@ -1152,7 +1247,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5124: { // glGetTexLevelParameterfv +case 5144: { // glGetTexLevelParameterfv GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; @@ -1168,7 +1263,7 @@ if (AP != 8 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,8); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5125: { // glGetTexLevelParameteriv +case 5145: { // glGetTexLevelParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; @@ -1183,7 +1278,7 @@ if (AP != 8 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,8); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5126: { // glGetTexParameterfv +case 5146: { // glGetTexParameterfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[4] = {0.0,0.0,0.0,0.0}; @@ -1201,7 +1296,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5127: { // glGetTexParameteriv +case 5147: { // glGetTexParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[4] = {0,0,0,0}; @@ -1218,63 +1313,63 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5128: { // glHint +case 5148: { // glHint GLenum *target = (GLenum *) bp; bp += 4; GLenum *mode = (GLenum *) bp; bp += 4; weglHint(*target,*mode); }; break; -case 5129: { // glIndexMask +case 5149: { // glIndexMask GLuint *mask = (GLuint *) bp; bp += 4; weglIndexMask(*mask); }; break; -case 5130: { // glIndexPointer +case 5150: { // glIndexPointer GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; weglIndexPointer(*type,*stride,pointer); }; break; -case 5131: { // glIndexPointer +case 5151: { // glIndexPointer GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) bins[0]->base; weglIndexPointer(*type,*stride,pointer); }; break; -case 5132: { // glIndexdv +case 5152: { // glIndexdv GLdouble *c = (GLdouble *) bp; bp += 8; weglIndexdv(c); }; break; -case 5133: { // glIndexfv +case 5153: { // glIndexfv GLfloat *c = (GLfloat *) bp; bp += 4; weglIndexfv(c); }; break; -case 5134: { // glIndexiv +case 5154: { // glIndexiv GLint *c = (GLint *) bp; bp += 4; weglIndexiv(c); }; break; -case 5135: { // glIndexsv +case 5155: { // glIndexsv GLshort *c = (GLshort *) bp; bp += 2; weglIndexsv(c); }; break; -case 5136: { // glIndexubv +case 5156: { // glIndexubv GLubyte *c = (GLubyte *) bp; bp += 1; weglIndexubv(c); }; break; -case 5137: { // glInitNames +case 5157: { // glInitNames weglInitNames(); }; break; -case 5138: { // glInterleavedArrays +case 5158: { // glInterleavedArrays GLenum *format = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; weglInterleavedArrays(*format,*stride,pointer); }; break; -case 5139: { // glInterleavedArrays +case 5159: { // glInterleavedArrays GLenum *format = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) bins[0]->base; weglInterleavedArrays(*format,*stride,pointer); }; break; -case 5140: { // glIsEnabled +case 5160: { // glIsEnabled GLenum *cap = (GLenum *) bp; bp += 4; GLboolean result = weglIsEnabled(*cap); int AP = 0; ErlDrvTermData rt[6]; @@ -1284,7 +1379,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5141: { // glIsList +case 5161: { // glIsList GLuint *list = (GLuint *) bp; bp += 4; GLboolean result = weglIsList(*list); int AP = 0; ErlDrvTermData rt[6]; @@ -1294,7 +1389,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5142: { // glIsTexture +case 5162: { // glIsTexture GLuint *texture = (GLuint *) bp; bp += 4; GLboolean result = weglIsTexture(*texture); int AP = 0; ErlDrvTermData rt[6]; @@ -1304,87 +1399,87 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5143: { // glLightModelf +case 5163: { // glLightModelf GLenum *pname = (GLenum *) bp; bp += 4; GLfloat *param = (GLfloat *) bp; bp += 4; weglLightModelf(*pname,*param); }; break; -case 5144: { // glLightModelfv +case 5164: { // glLightModelfv GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLfloat *params = (GLfloat *) bp; bp += *paramsLen*4+((*paramsLen)+0)%2*4; weglLightModelfv(*pname,params); }; break; -case 5145: { // glLightModeli +case 5165: { // glLightModeli GLenum *pname = (GLenum *) bp; bp += 4; GLint *param = (GLint *) bp; bp += 4; weglLightModeli(*pname,*param); }; break; -case 5146: { // glLightModeliv +case 5166: { // glLightModeliv GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+0)%2*4; weglLightModeliv(*pname,params); }; break; -case 5147: { // glLightf +case 5167: { // glLightf GLenum *light = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat *param = (GLfloat *) bp; bp += 4; weglLightf(*light,*pname,*param); }; break; -case 5148: { // glLightfv +case 5168: { // glLightfv GLenum *light = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLfloat *params = (GLfloat *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglLightfv(*light,*pname,params); }; break; -case 5149: { // glLighti +case 5169: { // glLighti GLenum *light = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint *param = (GLint *) bp; bp += 4; weglLighti(*light,*pname,*param); }; break; -case 5150: { // glLightiv +case 5170: { // glLightiv GLenum *light = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglLightiv(*light,*pname,params); }; break; -case 5151: { // glLineStipple +case 5171: { // glLineStipple GLint *factor = (GLint *) bp; bp += 4; GLushort *pattern = (GLushort *) bp; bp += 2; weglLineStipple(*factor,*pattern); }; break; -case 5152: { // glLineWidth +case 5172: { // glLineWidth GLfloat *width = (GLfloat *) bp; bp += 4; weglLineWidth(*width); }; break; -case 5153: { // glListBase +case 5173: { // glListBase GLuint *base = (GLuint *) bp; bp += 4; weglListBase(*base); }; break; -case 5154: { // glLoadIdentity +case 5174: { // glLoadIdentity weglLoadIdentity(); }; break; -case 5155: { // glLoadMatrixd +case 5175: { // glLoadMatrixd GLdouble * m = (GLdouble *) bp; bp += 128; weglLoadMatrixd(m); }; break; -case 5156: { // glLoadMatrixf +case 5176: { // glLoadMatrixf GLfloat * m = (GLfloat *) bp; bp += 64; weglLoadMatrixf(m); }; break; -case 5157: { // glLoadName +case 5177: { // glLoadName GLuint *name = (GLuint *) bp; bp += 4; weglLoadName(*name); }; break; -case 5158: { // glLogicOp +case 5178: { // glLogicOp GLenum *opcode = (GLenum *) bp; bp += 4; weglLogicOp(*opcode); }; break; -case 5159: { // glMap1d +case 5179: { // glMap1d GLenum *target = (GLenum *) bp; bp += 4; bp += 4; GLdouble *u1 = (GLdouble *) bp; bp += 8; @@ -1394,7 +1489,7 @@ GLdouble *points = (GLdouble *) bins[0]->base; weglMap1d(*target,*u1,*u2,*stride,*order,points); }; break; -case 5160: { // glMap1f +case 5180: { // glMap1f GLenum *target = (GLenum *) bp; bp += 4; GLfloat *u1 = (GLfloat *) bp; bp += 4; GLfloat *u2 = (GLfloat *) bp; bp += 4; @@ -1403,7 +1498,7 @@ GLfloat *points = (GLfloat *) bins[0]->base; weglMap1f(*target,*u1,*u2,*stride,*order,points); }; break; -case 5161: { // glMap2d +case 5181: { // glMap2d GLenum *target = (GLenum *) bp; bp += 4; bp += 4; GLdouble *u1 = (GLdouble *) bp; bp += 8; @@ -1417,7 +1512,7 @@ GLdouble *points = (GLdouble *) bins[0]->base; weglMap2d(*target,*u1,*u2,*ustride,*uorder,*v1,*v2,*vstride,*vorder,points); }; break; -case 5162: { // glMap2f +case 5182: { // glMap2f GLenum *target = (GLenum *) bp; bp += 4; GLfloat *u1 = (GLfloat *) bp; bp += 4; GLfloat *u2 = (GLfloat *) bp; bp += 4; @@ -1430,20 +1525,20 @@ GLfloat *points = (GLfloat *) bins[0]->base; weglMap2f(*target,*u1,*u2,*ustride,*uorder,*v1,*v2,*vstride,*vorder,points); }; break; -case 5163: { // glMapGrid1d +case 5183: { // glMapGrid1d GLint *un = (GLint *) bp; bp += 4; bp += 4; GLdouble *u1 = (GLdouble *) bp; bp += 8; GLdouble *u2 = (GLdouble *) bp; bp += 8; weglMapGrid1d(*un,*u1,*u2); }; break; -case 5164: { // glMapGrid1f +case 5184: { // glMapGrid1f GLint *un = (GLint *) bp; bp += 4; GLfloat *u1 = (GLfloat *) bp; bp += 4; GLfloat *u2 = (GLfloat *) bp; bp += 4; weglMapGrid1f(*un,*u1,*u2); }; break; -case 5165: { // glMapGrid2d +case 5185: { // glMapGrid2d GLint *un = (GLint *) bp; bp += 4; bp += 4; GLdouble *u1 = (GLdouble *) bp; bp += 8; @@ -1454,7 +1549,7 @@ GLdouble *v2 = (GLdouble *) bp; bp += 8; weglMapGrid2d(*un,*u1,*u2,*vn,*v1,*v2); }; break; -case 5166: { // glMapGrid2f +case 5186: { // glMapGrid2f GLint *un = (GLint *) bp; bp += 4; GLfloat *u1 = (GLfloat *) bp; bp += 4; GLfloat *u2 = (GLfloat *) bp; bp += 4; @@ -1463,82 +1558,82 @@ GLfloat *v2 = (GLfloat *) bp; bp += 4; weglMapGrid2f(*un,*u1,*u2,*vn,*v1,*v2); }; break; -case 5167: { // glMaterialf +case 5187: { // glMaterialf GLenum *face = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat *param = (GLfloat *) bp; bp += 4; weglMaterialf(*face,*pname,*param); }; break; -case 5168: { // glMaterialfv +case 5188: { // glMaterialfv GLenum *face = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLfloat *params = (GLfloat *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglMaterialfv(*face,*pname,params); }; break; -case 5169: { // glMateriali +case 5189: { // glMateriali GLenum *face = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint *param = (GLint *) bp; bp += 4; weglMateriali(*face,*pname,*param); }; break; -case 5170: { // glMaterialiv +case 5190: { // glMaterialiv GLenum *face = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglMaterialiv(*face,*pname,params); }; break; -case 5171: { // glMatrixMode +case 5191: { // glMatrixMode GLenum *mode = (GLenum *) bp; bp += 4; weglMatrixMode(*mode); }; break; -case 5172: { // glMultMatrixd +case 5192: { // glMultMatrixd GLdouble * m = (GLdouble *) bp; bp += 128; weglMultMatrixd(m); }; break; -case 5173: { // glMultMatrixf +case 5193: { // glMultMatrixf GLfloat * m = (GLfloat *) bp; bp += 64; weglMultMatrixf(m); }; break; -case 5174: { // glNewList +case 5194: { // glNewList GLuint *list = (GLuint *) bp; bp += 4; GLenum *mode = (GLenum *) bp; bp += 4; weglNewList(*list,*mode); }; break; -case 5175: { // glNormal3bv +case 5195: { // glNormal3bv GLbyte *v = (GLbyte *) bp; bp += 1; weglNormal3bv(v); }; break; -case 5176: { // glNormal3dv +case 5196: { // glNormal3dv GLdouble *v = (GLdouble *) bp; bp += 8; weglNormal3dv(v); }; break; -case 5177: { // glNormal3fv +case 5197: { // glNormal3fv GLfloat *v = (GLfloat *) bp; bp += 4; weglNormal3fv(v); }; break; -case 5178: { // glNormal3iv +case 5198: { // glNormal3iv GLint *v = (GLint *) bp; bp += 4; weglNormal3iv(v); }; break; -case 5179: { // glNormal3sv +case 5199: { // glNormal3sv GLshort *v = (GLshort *) bp; bp += 2; weglNormal3sv(v); }; break; -case 5180: { // glNormalPointer +case 5200: { // glNormalPointer GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; weglNormalPointer(*type,*stride,pointer); }; break; -case 5181: { // glNormalPointer +case 5201: { // glNormalPointer GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) bins[0]->base; weglNormalPointer(*type,*stride,pointer); }; break; -case 5182: { // glOrtho +case 5202: { // glOrtho GLdouble *left = (GLdouble *) bp; bp += 8; GLdouble *right = (GLdouble *) bp; bp += 8; GLdouble *bottom = (GLdouble *) bp; bp += 8; @@ -1547,158 +1642,158 @@ GLdouble *zFar = (GLdouble *) bp; bp += 8; weglOrtho(*left,*right,*bottom,*top,*zNear,*zFar); }; break; -case 5183: { // glPassThrough +case 5203: { // glPassThrough GLfloat *token = (GLfloat *) bp; bp += 4; weglPassThrough(*token); }; break; -case 5184: { // glPixelMapfv +case 5204: { // glPixelMapfv GLenum *map = (GLenum *) bp; bp += 4; GLsizei *mapsize = (GLsizei *) bp; bp += 4; GLfloat *values = (GLfloat *) bins[0]->base; weglPixelMapfv(*map,*mapsize,values); }; break; -case 5185: { // glPixelMapuiv +case 5205: { // glPixelMapuiv GLenum *map = (GLenum *) bp; bp += 4; GLsizei *mapsize = (GLsizei *) bp; bp += 4; GLuint *values = (GLuint *) bins[0]->base; weglPixelMapuiv(*map,*mapsize,values); }; break; -case 5186: { // glPixelMapusv +case 5206: { // glPixelMapusv GLenum *map = (GLenum *) bp; bp += 4; GLsizei *mapsize = (GLsizei *) bp; bp += 4; GLushort *values = (GLushort *) bins[0]->base; weglPixelMapusv(*map,*mapsize,values); }; break; -case 5187: { // glPixelStoref +case 5207: { // glPixelStoref GLenum *pname = (GLenum *) bp; bp += 4; GLfloat *param = (GLfloat *) bp; bp += 4; weglPixelStoref(*pname,*param); }; break; -case 5188: { // glPixelStorei +case 5208: { // glPixelStorei GLenum *pname = (GLenum *) bp; bp += 4; GLint *param = (GLint *) bp; bp += 4; weglPixelStorei(*pname,*param); }; break; -case 5189: { // glPixelTransferf +case 5209: { // glPixelTransferf GLenum *pname = (GLenum *) bp; bp += 4; GLfloat *param = (GLfloat *) bp; bp += 4; weglPixelTransferf(*pname,*param); }; break; -case 5190: { // glPixelTransferi +case 5210: { // glPixelTransferi GLenum *pname = (GLenum *) bp; bp += 4; GLint *param = (GLint *) bp; bp += 4; weglPixelTransferi(*pname,*param); }; break; -case 5191: { // glPixelZoom +case 5211: { // glPixelZoom GLfloat *xfactor = (GLfloat *) bp; bp += 4; GLfloat *yfactor = (GLfloat *) bp; bp += 4; weglPixelZoom(*xfactor,*yfactor); }; break; -case 5192: { // glPointSize +case 5212: { // glPointSize GLfloat *size = (GLfloat *) bp; bp += 4; weglPointSize(*size); }; break; -case 5193: { // glPolygonMode +case 5213: { // glPolygonMode GLenum *face = (GLenum *) bp; bp += 4; GLenum *mode = (GLenum *) bp; bp += 4; weglPolygonMode(*face,*mode); }; break; -case 5194: { // glPolygonOffset +case 5214: { // glPolygonOffset GLfloat *factor = (GLfloat *) bp; bp += 4; GLfloat *units = (GLfloat *) bp; bp += 4; weglPolygonOffset(*factor,*units); }; break; -case 5195: { // glPolygonStipple +case 5215: { // glPolygonStipple GLubyte *mask = (GLubyte *) bins[0]->base; weglPolygonStipple(mask); }; break; -case 5196: { // glPopAttrib +case 5216: { // glPopAttrib weglPopAttrib(); }; break; -case 5197: { // glPopClientAttrib +case 5217: { // glPopClientAttrib weglPopClientAttrib(); }; break; -case 5198: { // glPopMatrix +case 5218: { // glPopMatrix weglPopMatrix(); }; break; -case 5199: { // glPopName +case 5219: { // glPopName weglPopName(); }; break; -case 5200: { // glPrioritizeTextures +case 5220: { // glPrioritizeTextures int * texturesLen = (int *) bp; bp += 4; GLuint * textures = (GLuint *) bp; bp += (8-((*texturesLen*4+4)%8))%8; int * prioritiesLen = (int *) bp; bp += 4; GLclampf * priorities = (GLclampf *) bp; bp += (8-((*prioritiesLen*4+4)%8))%8; weglPrioritizeTextures(*texturesLen,textures,priorities); }; break; -case 5201: { // glPushAttrib +case 5221: { // glPushAttrib GLbitfield *mask = (GLbitfield *) bp; bp += 4; weglPushAttrib(*mask); }; break; -case 5202: { // glPushClientAttrib +case 5222: { // glPushClientAttrib GLbitfield *mask = (GLbitfield *) bp; bp += 4; weglPushClientAttrib(*mask); }; break; -case 5203: { // glPushMatrix +case 5223: { // glPushMatrix weglPushMatrix(); }; break; -case 5204: { // glPushName +case 5224: { // glPushName GLuint *name = (GLuint *) bp; bp += 4; weglPushName(*name); }; break; -case 5205: { // glRasterPos2dv +case 5225: { // glRasterPos2dv GLdouble *v = (GLdouble *) bp; bp += 8; weglRasterPos2dv(v); }; break; -case 5206: { // glRasterPos2fv +case 5226: { // glRasterPos2fv GLfloat *v = (GLfloat *) bp; bp += 4; weglRasterPos2fv(v); }; break; -case 5207: { // glRasterPos2iv +case 5227: { // glRasterPos2iv GLint *v = (GLint *) bp; bp += 4; weglRasterPos2iv(v); }; break; -case 5208: { // glRasterPos2sv +case 5228: { // glRasterPos2sv GLshort *v = (GLshort *) bp; bp += 2; weglRasterPos2sv(v); }; break; -case 5209: { // glRasterPos3dv +case 5229: { // glRasterPos3dv GLdouble *v = (GLdouble *) bp; bp += 8; weglRasterPos3dv(v); }; break; -case 5210: { // glRasterPos3fv +case 5230: { // glRasterPos3fv GLfloat *v = (GLfloat *) bp; bp += 4; weglRasterPos3fv(v); }; break; -case 5211: { // glRasterPos3iv +case 5231: { // glRasterPos3iv GLint *v = (GLint *) bp; bp += 4; weglRasterPos3iv(v); }; break; -case 5212: { // glRasterPos3sv +case 5232: { // glRasterPos3sv GLshort *v = (GLshort *) bp; bp += 2; weglRasterPos3sv(v); }; break; -case 5213: { // glRasterPos4dv +case 5233: { // glRasterPos4dv GLdouble *v = (GLdouble *) bp; bp += 8; weglRasterPos4dv(v); }; break; -case 5214: { // glRasterPos4fv +case 5234: { // glRasterPos4fv GLfloat *v = (GLfloat *) bp; bp += 4; weglRasterPos4fv(v); }; break; -case 5215: { // glRasterPos4iv +case 5235: { // glRasterPos4iv GLint *v = (GLint *) bp; bp += 4; weglRasterPos4iv(v); }; break; -case 5216: { // glRasterPos4sv +case 5236: { // glRasterPos4sv GLshort *v = (GLshort *) bp; bp += 2; weglRasterPos4sv(v); }; break; -case 5217: { // glReadBuffer +case 5237: { // glReadBuffer GLenum *mode = (GLenum *) bp; bp += 4; weglReadBuffer(*mode); }; break; -case 5218: { // glReadPixels +case 5238: { // glReadPixels GLint *x = (GLint *) bp; bp += 4; GLint *y = (GLint *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -1713,55 +1808,55 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5219: { // glRectd +case 5239: { // glRectd GLdouble *x1 = (GLdouble *) bp; bp += 8; GLdouble *y1 = (GLdouble *) bp; bp += 8; GLdouble *x2 = (GLdouble *) bp; bp += 8; GLdouble *y2 = (GLdouble *) bp; bp += 8; weglRectd(*x1,*y1,*x2,*y2); }; break; -case 5220: { // glRectdv +case 5240: { // glRectdv GLdouble * v1 = (GLdouble *) bp; bp += 16; GLdouble * v2 = (GLdouble *) bp; bp += 16; weglRectdv(v1,v2); }; break; -case 5221: { // glRectf +case 5241: { // glRectf GLfloat *x1 = (GLfloat *) bp; bp += 4; GLfloat *y1 = (GLfloat *) bp; bp += 4; GLfloat *x2 = (GLfloat *) bp; bp += 4; GLfloat *y2 = (GLfloat *) bp; bp += 4; weglRectf(*x1,*y1,*x2,*y2); }; break; -case 5222: { // glRectfv +case 5242: { // glRectfv GLfloat * v1 = (GLfloat *) bp; bp += 8; GLfloat * v2 = (GLfloat *) bp; bp += 8; weglRectfv(v1,v2); }; break; -case 5223: { // glRecti +case 5243: { // glRecti GLint *x1 = (GLint *) bp; bp += 4; GLint *y1 = (GLint *) bp; bp += 4; GLint *x2 = (GLint *) bp; bp += 4; GLint *y2 = (GLint *) bp; bp += 4; weglRecti(*x1,*y1,*x2,*y2); }; break; -case 5224: { // glRectiv +case 5244: { // glRectiv GLint * v1 = (GLint *) bp; bp += 8; GLint * v2 = (GLint *) bp; bp += 8; weglRectiv(v1,v2); }; break; -case 5225: { // glRects +case 5245: { // glRects GLshort *x1 = (GLshort *) bp; bp += 2; GLshort *y1 = (GLshort *) bp; bp += 2; GLshort *x2 = (GLshort *) bp; bp += 2; GLshort *y2 = (GLshort *) bp; bp += 2; weglRects(*x1,*y1,*x2,*y2); }; break; -case 5226: { // glRectsv +case 5246: { // glRectsv GLshort * v1 = (GLshort *) bp; bp += 4; GLshort * v2 = (GLshort *) bp; bp += 4; weglRectsv(v1,v2); }; break; -case 5227: { // glRenderMode +case 5247: { // glRenderMode GLenum *mode = (GLenum *) bp; bp += 4; GLint result = weglRenderMode(*mode); int AP = 0; ErlDrvTermData rt[6]; @@ -1771,40 +1866,40 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5228: { // glRotated +case 5248: { // glRotated GLdouble *angle = (GLdouble *) bp; bp += 8; GLdouble *x = (GLdouble *) bp; bp += 8; GLdouble *y = (GLdouble *) bp; bp += 8; GLdouble *z = (GLdouble *) bp; bp += 8; weglRotated(*angle,*x,*y,*z); }; break; -case 5229: { // glRotatef +case 5249: { // glRotatef GLfloat *angle = (GLfloat *) bp; bp += 4; GLfloat *x = (GLfloat *) bp; bp += 4; GLfloat *y = (GLfloat *) bp; bp += 4; GLfloat *z = (GLfloat *) bp; bp += 4; weglRotatef(*angle,*x,*y,*z); }; break; -case 5230: { // glScaled +case 5250: { // glScaled GLdouble *x = (GLdouble *) bp; bp += 8; GLdouble *y = (GLdouble *) bp; bp += 8; GLdouble *z = (GLdouble *) bp; bp += 8; weglScaled(*x,*y,*z); }; break; -case 5231: { // glScalef +case 5251: { // glScalef GLfloat *x = (GLfloat *) bp; bp += 4; GLfloat *y = (GLfloat *) bp; bp += 4; GLfloat *z = (GLfloat *) bp; bp += 4; weglScalef(*x,*y,*z); }; break; -case 5232: { // glScissor +case 5252: { // glScissor GLint *x = (GLint *) bp; bp += 4; GLint *y = (GLint *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; GLsizei *height = (GLsizei *) bp; bp += 4; weglScissor(*x,*y,*width,*height); }; break; -case 5233: { // glSelectBuffer +case 5253: { // glSelectBuffer GLsizei *size = (GLsizei *) bp; bp += 4; GLuint *buffer = (GLuint *) bins[0]->base; weglSelectBuffer(*size,buffer); @@ -1814,170 +1909,170 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5234: { // glShadeModel +case 5254: { // glShadeModel GLenum *mode = (GLenum *) bp; bp += 4; weglShadeModel(*mode); }; break; -case 5235: { // glStencilFunc +case 5255: { // glStencilFunc GLenum *func = (GLenum *) bp; bp += 4; GLint *ref = (GLint *) bp; bp += 4; GLuint *mask = (GLuint *) bp; bp += 4; weglStencilFunc(*func,*ref,*mask); }; break; -case 5236: { // glStencilMask +case 5256: { // glStencilMask GLuint *mask = (GLuint *) bp; bp += 4; weglStencilMask(*mask); }; break; -case 5237: { // glStencilOp +case 5257: { // glStencilOp GLenum *fail = (GLenum *) bp; bp += 4; GLenum *zfail = (GLenum *) bp; bp += 4; GLenum *zpass = (GLenum *) bp; bp += 4; weglStencilOp(*fail,*zfail,*zpass); }; break; -case 5238: { // glTexCoord1dv +case 5258: { // glTexCoord1dv GLdouble *v = (GLdouble *) bp; bp += 8; weglTexCoord1dv(v); }; break; -case 5239: { // glTexCoord1fv +case 5259: { // glTexCoord1fv GLfloat *v = (GLfloat *) bp; bp += 4; weglTexCoord1fv(v); }; break; -case 5240: { // glTexCoord1iv +case 5260: { // glTexCoord1iv GLint *v = (GLint *) bp; bp += 4; weglTexCoord1iv(v); }; break; -case 5241: { // glTexCoord1sv +case 5261: { // glTexCoord1sv GLshort *v = (GLshort *) bp; bp += 2; weglTexCoord1sv(v); }; break; -case 5242: { // glTexCoord2dv +case 5262: { // glTexCoord2dv GLdouble *v = (GLdouble *) bp; bp += 8; weglTexCoord2dv(v); }; break; -case 5243: { // glTexCoord2fv +case 5263: { // glTexCoord2fv GLfloat *v = (GLfloat *) bp; bp += 4; weglTexCoord2fv(v); }; break; -case 5244: { // glTexCoord2iv +case 5264: { // glTexCoord2iv GLint *v = (GLint *) bp; bp += 4; weglTexCoord2iv(v); }; break; -case 5245: { // glTexCoord2sv +case 5265: { // glTexCoord2sv GLshort *v = (GLshort *) bp; bp += 2; weglTexCoord2sv(v); }; break; -case 5246: { // glTexCoord3dv +case 5266: { // glTexCoord3dv GLdouble *v = (GLdouble *) bp; bp += 8; weglTexCoord3dv(v); }; break; -case 5247: { // glTexCoord3fv +case 5267: { // glTexCoord3fv GLfloat *v = (GLfloat *) bp; bp += 4; weglTexCoord3fv(v); }; break; -case 5248: { // glTexCoord3iv +case 5268: { // glTexCoord3iv GLint *v = (GLint *) bp; bp += 4; weglTexCoord3iv(v); }; break; -case 5249: { // glTexCoord3sv +case 5269: { // glTexCoord3sv GLshort *v = (GLshort *) bp; bp += 2; weglTexCoord3sv(v); }; break; -case 5250: { // glTexCoord4dv +case 5270: { // glTexCoord4dv GLdouble *v = (GLdouble *) bp; bp += 8; weglTexCoord4dv(v); }; break; -case 5251: { // glTexCoord4fv +case 5271: { // glTexCoord4fv GLfloat *v = (GLfloat *) bp; bp += 4; weglTexCoord4fv(v); }; break; -case 5252: { // glTexCoord4iv +case 5272: { // glTexCoord4iv GLint *v = (GLint *) bp; bp += 4; weglTexCoord4iv(v); }; break; -case 5253: { // glTexCoord4sv +case 5273: { // glTexCoord4sv GLshort *v = (GLshort *) bp; bp += 2; weglTexCoord4sv(v); }; break; -case 5254: { // glTexCoordPointer +case 5274: { // glTexCoordPointer GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; weglTexCoordPointer(*size,*type,*stride,pointer); }; break; -case 5255: { // glTexCoordPointer +case 5275: { // glTexCoordPointer GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) bins[0]->base; weglTexCoordPointer(*size,*type,*stride,pointer); }; break; -case 5256: { // glTexEnvf +case 5276: { // glTexEnvf GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat *param = (GLfloat *) bp; bp += 4; weglTexEnvf(*target,*pname,*param); }; break; -case 5257: { // glTexEnvfv +case 5277: { // glTexEnvfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLfloat *params = (GLfloat *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglTexEnvfv(*target,*pname,params); }; break; -case 5258: { // glTexEnvi +case 5278: { // glTexEnvi GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint *param = (GLint *) bp; bp += 4; weglTexEnvi(*target,*pname,*param); }; break; -case 5259: { // glTexEnviv +case 5279: { // glTexEnviv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglTexEnviv(*target,*pname,params); }; break; -case 5260: { // glTexGend +case 5280: { // glTexGend GLenum *coord = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLdouble *param = (GLdouble *) bp; bp += 8; weglTexGend(*coord,*pname,*param); }; break; -case 5261: { // glTexGendv +case 5281: { // glTexGendv GLenum *coord = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 8; GLdouble *params = (GLdouble *) bp; bp += *paramsLen*8; weglTexGendv(*coord,*pname,params); }; break; -case 5262: { // glTexGenf +case 5282: { // glTexGenf GLenum *coord = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat *param = (GLfloat *) bp; bp += 4; weglTexGenf(*coord,*pname,*param); }; break; -case 5263: { // glTexGenfv +case 5283: { // glTexGenfv GLenum *coord = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLfloat *params = (GLfloat *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglTexGenfv(*coord,*pname,params); }; break; -case 5264: { // glTexGeni +case 5284: { // glTexGeni GLenum *coord = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint *param = (GLint *) bp; bp += 4; weglTexGeni(*coord,*pname,*param); }; break; -case 5265: { // glTexGeniv +case 5285: { // glTexGeniv GLenum *coord = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglTexGeniv(*coord,*pname,params); }; break; -case 5266: { // glTexImage1D +case 5286: { // glTexImage1D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *internalformat = (GLint *) bp; bp += 4; @@ -1988,7 +2083,7 @@ GLvoid *pixels = (GLvoid *) * (int *) bp; bp += 4; weglTexImage1D(*target,*level,*internalformat,*width,*border,*format,*type,pixels); }; break; -case 5267: { // glTexImage1D +case 5287: { // glTexImage1D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *internalformat = (GLint *) bp; bp += 4; @@ -1999,7 +2094,7 @@ GLvoid *pixels = (GLvoid *) bins[0]->base; weglTexImage1D(*target,*level,*internalformat,*width,*border,*format,*type,pixels); }; break; -case 5268: { // glTexImage2D +case 5288: { // glTexImage2D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *internalformat = (GLint *) bp; bp += 4; @@ -2011,7 +2106,7 @@ GLvoid *pixels = (GLvoid *) * (int *) bp; bp += 4; weglTexImage2D(*target,*level,*internalformat,*width,*height,*border,*format,*type,pixels); }; break; -case 5269: { // glTexImage2D +case 5289: { // glTexImage2D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *internalformat = (GLint *) bp; bp += 4; @@ -2023,33 +2118,33 @@ GLvoid *pixels = (GLvoid *) bins[0]->base; weglTexImage2D(*target,*level,*internalformat,*width,*height,*border,*format,*type,pixels); }; break; -case 5270: { // glTexParameterf +case 5290: { // glTexParameterf GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat *param = (GLfloat *) bp; bp += 4; weglTexParameterf(*target,*pname,*param); }; break; -case 5271: { // glTexParameterfv +case 5291: { // glTexParameterfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLfloat *params = (GLfloat *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglTexParameterfv(*target,*pname,params); }; break; -case 5272: { // glTexParameteri +case 5292: { // glTexParameteri GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint *param = (GLint *) bp; bp += 4; weglTexParameteri(*target,*pname,*param); }; break; -case 5273: { // glTexParameteriv +case 5293: { // glTexParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglTexParameteriv(*target,*pname,params); }; break; -case 5274: { // glTexSubImage1D +case 5294: { // glTexSubImage1D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -2059,7 +2154,7 @@ GLvoid *pixels = (GLvoid *) * (int *) bp; bp += 4; weglTexSubImage1D(*target,*level,*xoffset,*width,*format,*type,pixels); }; break; -case 5275: { // glTexSubImage1D +case 5295: { // glTexSubImage1D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -2069,7 +2164,7 @@ GLvoid *pixels = (GLvoid *) bins[0]->base; weglTexSubImage1D(*target,*level,*xoffset,*width,*format,*type,pixels); }; break; -case 5276: { // glTexSubImage2D +case 5296: { // glTexSubImage2D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -2081,7 +2176,7 @@ GLvoid *pixels = (GLvoid *) * (int *) bp; bp += 4; weglTexSubImage2D(*target,*level,*xoffset,*yoffset,*width,*height,*format,*type,pixels); }; break; -case 5277: { // glTexSubImage2D +case 5297: { // glTexSubImage2D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -2093,99 +2188,99 @@ GLvoid *pixels = (GLvoid *) bins[0]->base; weglTexSubImage2D(*target,*level,*xoffset,*yoffset,*width,*height,*format,*type,pixels); }; break; -case 5278: { // glTranslated +case 5298: { // glTranslated GLdouble *x = (GLdouble *) bp; bp += 8; GLdouble *y = (GLdouble *) bp; bp += 8; GLdouble *z = (GLdouble *) bp; bp += 8; weglTranslated(*x,*y,*z); }; break; -case 5279: { // glTranslatef +case 5299: { // glTranslatef GLfloat *x = (GLfloat *) bp; bp += 4; GLfloat *y = (GLfloat *) bp; bp += 4; GLfloat *z = (GLfloat *) bp; bp += 4; weglTranslatef(*x,*y,*z); }; break; -case 5280: { // glVertex2dv +case 5300: { // glVertex2dv GLdouble *v = (GLdouble *) bp; bp += 8; weglVertex2dv(v); }; break; -case 5281: { // glVertex2fv +case 5301: { // glVertex2fv GLfloat *v = (GLfloat *) bp; bp += 4; weglVertex2fv(v); }; break; -case 5282: { // glVertex2iv +case 5302: { // glVertex2iv GLint *v = (GLint *) bp; bp += 4; weglVertex2iv(v); }; break; -case 5283: { // glVertex2sv +case 5303: { // glVertex2sv GLshort *v = (GLshort *) bp; bp += 2; weglVertex2sv(v); }; break; -case 5284: { // glVertex3dv +case 5304: { // glVertex3dv GLdouble *v = (GLdouble *) bp; bp += 8; weglVertex3dv(v); }; break; -case 5285: { // glVertex3fv +case 5305: { // glVertex3fv GLfloat *v = (GLfloat *) bp; bp += 4; weglVertex3fv(v); }; break; -case 5286: { // glVertex3iv +case 5306: { // glVertex3iv GLint *v = (GLint *) bp; bp += 4; weglVertex3iv(v); }; break; -case 5287: { // glVertex3sv +case 5307: { // glVertex3sv GLshort *v = (GLshort *) bp; bp += 2; weglVertex3sv(v); }; break; -case 5288: { // glVertex4dv +case 5308: { // glVertex4dv GLdouble *v = (GLdouble *) bp; bp += 8; weglVertex4dv(v); }; break; -case 5289: { // glVertex4fv +case 5309: { // glVertex4fv GLfloat *v = (GLfloat *) bp; bp += 4; weglVertex4fv(v); }; break; -case 5290: { // glVertex4iv +case 5310: { // glVertex4iv GLint *v = (GLint *) bp; bp += 4; weglVertex4iv(v); }; break; -case 5291: { // glVertex4sv +case 5311: { // glVertex4sv GLshort *v = (GLshort *) bp; bp += 2; weglVertex4sv(v); }; break; -case 5292: { // glVertexPointer +case 5312: { // glVertexPointer GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; weglVertexPointer(*size,*type,*stride,pointer); }; break; -case 5293: { // glVertexPointer +case 5313: { // glVertexPointer GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) bins[0]->base; weglVertexPointer(*size,*type,*stride,pointer); }; break; -case 5294: { // glViewport +case 5314: { // glViewport GLint *x = (GLint *) bp; bp += 4; GLint *y = (GLint *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; GLsizei *height = (GLsizei *) bp; bp += 4; weglViewport(*x,*y,*width,*height); }; break; -case 5295: { // glBlendColor +case 5315: { // glBlendColor GLclampf *red = (GLclampf *) bp; bp += 4; GLclampf *green = (GLclampf *) bp; bp += 4; GLclampf *blue = (GLclampf *) bp; bp += 4; GLclampf *alpha = (GLclampf *) bp; bp += 4; weglBlendColor(*red,*green,*blue,*alpha); }; break; -case 5296: { // glBlendEquation +case 5316: { // glBlendEquation GLenum *mode = (GLenum *) bp; bp += 4; weglBlendEquation(*mode); }; break; -case 5297: { // glDrawRangeElements +case 5317: { // glDrawRangeElements GLenum *mode = (GLenum *) bp; bp += 4; GLuint *start = (GLuint *) bp; bp += 4; GLuint *end = (GLuint *) bp; bp += 4; @@ -2194,7 +2289,7 @@ GLvoid *indices = (GLvoid *) * (int *) bp; bp += 4; weglDrawRangeElements(*mode,*start,*end,*count,*type,indices); }; break; -case 5298: { // glDrawRangeElements +case 5318: { // glDrawRangeElements GLenum *mode = (GLenum *) bp; bp += 4; GLuint *start = (GLuint *) bp; bp += 4; GLuint *end = (GLuint *) bp; bp += 4; @@ -2203,7 +2298,73 @@ GLvoid *indices = (GLvoid *) bins[0]->base; weglDrawRangeElements(*mode,*start,*end,*count,*type,indices); }; break; -case 5299: { // glColorTable +case 5319: { // glTexImage3D + GLenum *target = (GLenum *) bp; bp += 4; + GLint *level = (GLint *) bp; bp += 4; + GLint *internalformat = (GLint *) bp; bp += 4; + GLsizei *width = (GLsizei *) bp; bp += 4; + GLsizei *height = (GLsizei *) bp; bp += 4; + GLsizei *depth = (GLsizei *) bp; bp += 4; + GLint *border = (GLint *) bp; bp += 4; + GLenum *format = (GLenum *) bp; bp += 4; + GLenum *type = (GLenum *) bp; bp += 4; + GLvoid *pixels = (GLvoid *) * (int *) bp; bp += 4; + weglTexImage3D(*target,*level,*internalformat,*width,*height,*depth,*border,*format,*type,pixels); +}; break; +case 5320: { // glTexImage3D + GLenum *target = (GLenum *) bp; bp += 4; + GLint *level = (GLint *) bp; bp += 4; + GLint *internalformat = (GLint *) bp; bp += 4; + GLsizei *width = (GLsizei *) bp; bp += 4; + GLsizei *height = (GLsizei *) bp; bp += 4; + GLsizei *depth = (GLsizei *) bp; bp += 4; + GLint *border = (GLint *) bp; bp += 4; + GLenum *format = (GLenum *) bp; bp += 4; + GLenum *type = (GLenum *) bp; bp += 4; + GLvoid *pixels = (GLvoid *) bins[0]->base; + weglTexImage3D(*target,*level,*internalformat,*width,*height,*depth,*border,*format,*type,pixels); +}; break; +case 5321: { // glTexSubImage3D + GLenum *target = (GLenum *) bp; bp += 4; + GLint *level = (GLint *) bp; bp += 4; + GLint *xoffset = (GLint *) bp; bp += 4; + GLint *yoffset = (GLint *) bp; bp += 4; + GLint *zoffset = (GLint *) bp; bp += 4; + GLsizei *width = (GLsizei *) bp; bp += 4; + GLsizei *height = (GLsizei *) bp; bp += 4; + GLsizei *depth = (GLsizei *) bp; bp += 4; + GLenum *format = (GLenum *) bp; bp += 4; + GLenum *type = (GLenum *) bp; bp += 4; + GLvoid *pixels = (GLvoid *) * (int *) bp; bp += 4; + weglTexSubImage3D(*target,*level,*xoffset,*yoffset,*zoffset,*width,*height,*depth,*format,*type,pixels); +}; break; +case 5322: { // glTexSubImage3D + GLenum *target = (GLenum *) bp; bp += 4; + GLint *level = (GLint *) bp; bp += 4; + GLint *xoffset = (GLint *) bp; bp += 4; + GLint *yoffset = (GLint *) bp; bp += 4; + GLint *zoffset = (GLint *) bp; bp += 4; + GLsizei *width = (GLsizei *) bp; bp += 4; + GLsizei *height = (GLsizei *) bp; bp += 4; + GLsizei *depth = (GLsizei *) bp; bp += 4; + GLenum *format = (GLenum *) bp; bp += 4; + GLenum *type = (GLenum *) bp; bp += 4; + GLvoid *pixels = (GLvoid *) bins[0]->base; + weglTexSubImage3D(*target,*level,*xoffset,*yoffset,*zoffset,*width,*height,*depth,*format,*type,pixels); +}; break; +case 5323: { // glCopyTexSubImage3D + GLenum *target = (GLenum *) bp; bp += 4; + GLint *level = (GLint *) bp; bp += 4; + GLint *xoffset = (GLint *) bp; bp += 4; + GLint *yoffset = (GLint *) bp; bp += 4; + GLint *zoffset = (GLint *) bp; bp += 4; + GLint *x = (GLint *) bp; bp += 4; + GLint *y = (GLint *) bp; bp += 4; + GLsizei *width = (GLsizei *) bp; bp += 4; + GLsizei *height = (GLsizei *) bp; bp += 4; + weglCopyTexSubImage3D(*target,*level,*xoffset,*yoffset,*zoffset,*x,*y,*width,*height); +}; break; +case 5324: { // glColorTable GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -2212,7 +2373,7 @@ GLvoid *table = (GLvoid *) * (int *) bp; bp += 4; weglColorTable(*target,*internalformat,*width,*format,*type,table); }; break; -case 5300: { // glColorTable +case 5325: { // glColorTable GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -2221,19 +2382,19 @@ GLvoid *table = (GLvoid *) bins[0]->base; weglColorTable(*target,*internalformat,*width,*format,*type,table); }; break; -case 5301: { // glColorTableParameterfv +case 5326: { // glColorTableParameterfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat * params = (GLfloat *) bp; bp += 16; weglColorTableParameterfv(*target,*pname,params); }; break; -case 5302: { // glColorTableParameteriv +case 5327: { // glColorTableParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint * params = (GLint *) bp; bp += 16; weglColorTableParameteriv(*target,*pname,params); }; break; -case 5303: { // glCopyColorTable +case 5328: { // glCopyColorTable GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLint *x = (GLint *) bp; bp += 4; @@ -2241,7 +2402,7 @@ GLsizei *width = (GLsizei *) bp; bp += 4; weglCopyColorTable(*target,*internalformat,*x,*y,*width); }; break; -case 5304: { // glGetColorTable +case 5329: { // glGetColorTable GLenum *target = (GLenum *) bp; bp += 4; GLenum *format = (GLenum *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; @@ -2253,7 +2414,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5305: { // glGetColorTableParameterfv +case 5330: { // glGetColorTableParameterfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[4] = {0.0,0.0,0.0,0.0}; @@ -2271,7 +2432,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5306: { // glGetColorTableParameteriv +case 5331: { // glGetColorTableParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[4] = {0,0,0,0}; @@ -2288,7 +2449,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5307: { // glColorSubTable +case 5332: { // glColorSubTable GLenum *target = (GLenum *) bp; bp += 4; GLsizei *start = (GLsizei *) bp; bp += 4; GLsizei *count = (GLsizei *) bp; bp += 4; @@ -2297,7 +2458,7 @@ GLvoid *data = (GLvoid *) * (int *) bp; bp += 4; weglColorSubTable(*target,*start,*count,*format,*type,data); }; break; -case 5308: { // glColorSubTable +case 5333: { // glColorSubTable GLenum *target = (GLenum *) bp; bp += 4; GLsizei *start = (GLsizei *) bp; bp += 4; GLsizei *count = (GLsizei *) bp; bp += 4; @@ -2306,7 +2467,7 @@ GLvoid *data = (GLvoid *) bins[0]->base; weglColorSubTable(*target,*start,*count,*format,*type,data); }; break; -case 5309: { // glCopyColorSubTable +case 5334: { // glCopyColorSubTable GLenum *target = (GLenum *) bp; bp += 4; GLsizei *start = (GLsizei *) bp; bp += 4; GLint *x = (GLint *) bp; bp += 4; @@ -2314,7 +2475,7 @@ GLsizei *width = (GLsizei *) bp; bp += 4; weglCopyColorSubTable(*target,*start,*x,*y,*width); }; break; -case 5310: { // glConvolutionFilter1D +case 5335: { // glConvolutionFilter1D GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -2323,7 +2484,7 @@ GLvoid *image = (GLvoid *) * (int *) bp; bp += 4; weglConvolutionFilter1D(*target,*internalformat,*width,*format,*type,image); }; break; -case 5311: { // glConvolutionFilter1D +case 5336: { // glConvolutionFilter1D GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -2332,7 +2493,7 @@ GLvoid *image = (GLvoid *) bins[0]->base; weglConvolutionFilter1D(*target,*internalformat,*width,*format,*type,image); }; break; -case 5312: { // glConvolutionFilter2D +case 5337: { // glConvolutionFilter2D GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -2342,7 +2503,7 @@ GLvoid *image = (GLvoid *) * (int *) bp; bp += 4; weglConvolutionFilter2D(*target,*internalformat,*width,*height,*format,*type,image); }; break; -case 5313: { // glConvolutionFilter2D +case 5338: { // glConvolutionFilter2D GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -2352,21 +2513,21 @@ GLvoid *image = (GLvoid *) bins[0]->base; weglConvolutionFilter2D(*target,*internalformat,*width,*height,*format,*type,image); }; break; -case 5314: { // glConvolutionParameterfv +case 5339: { // glConvolutionParameterfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLfloat *params = (GLfloat *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglConvolutionParameterfv(*target,*pname,params); }; break; -case 5315: { // glConvolutionParameteriv +case 5340: { // glConvolutionParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglConvolutionParameteriv(*target,*pname,params); }; break; -case 5316: { // glCopyConvolutionFilter1D +case 5341: { // glCopyConvolutionFilter1D GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLint *x = (GLint *) bp; bp += 4; @@ -2374,7 +2535,7 @@ GLsizei *width = (GLsizei *) bp; bp += 4; weglCopyConvolutionFilter1D(*target,*internalformat,*x,*y,*width); }; break; -case 5317: { // glCopyConvolutionFilter2D +case 5342: { // glCopyConvolutionFilter2D GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLint *x = (GLint *) bp; bp += 4; @@ -2383,7 +2544,7 @@ GLsizei *height = (GLsizei *) bp; bp += 4; weglCopyConvolutionFilter2D(*target,*internalformat,*x,*y,*width,*height); }; break; -case 5318: { // glGetConvolutionFilter +case 5343: { // glGetConvolutionFilter GLenum *target = (GLenum *) bp; bp += 4; GLenum *format = (GLenum *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; @@ -2395,7 +2556,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5319: { // glGetConvolutionParameterfv +case 5344: { // glGetConvolutionParameterfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[4] = {0.0,0.0,0.0,0.0}; @@ -2413,7 +2574,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5320: { // glGetConvolutionParameteriv +case 5345: { // glGetConvolutionParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[4] = {0,0,0,0}; @@ -2430,7 +2591,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5321: { // glSeparableFilter2D +case 5346: { // glSeparableFilter2D GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -2441,7 +2602,7 @@ GLvoid *column = (GLvoid *) * (int *) bp; bp += 4; weglSeparableFilter2D(*target,*internalformat,*width,*height,*format,*type,row,column); }; break; -case 5322: { // glSeparableFilter2D +case 5347: { // glSeparableFilter2D GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; @@ -2452,7 +2613,7 @@ GLvoid *column = (GLvoid *) bins[1]->base; weglSeparableFilter2D(*target,*internalformat,*width,*height,*format,*type,row,column); }; break; -case 5323: { // glGetHistogram +case 5348: { // glGetHistogram GLenum *target = (GLenum *) bp; bp += 4; GLboolean *reset = (GLboolean *) bp; bp += 1; bp += 3; @@ -2466,7 +2627,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5324: { // glGetHistogramParameterfv +case 5349: { // glGetHistogramParameterfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[1] = {0.0}; @@ -2481,7 +2642,7 @@ if (AP != 8 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,8); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5325: { // glGetHistogramParameteriv +case 5350: { // glGetHistogramParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[1] = {0}; @@ -2495,7 +2656,7 @@ if (AP != 8 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,8); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5326: { // glGetMinmax +case 5351: { // glGetMinmax GLenum *target = (GLenum *) bp; bp += 4; GLboolean *reset = (GLboolean *) bp; bp += 1; bp += 3; @@ -2509,7 +2670,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5327: { // glGetMinmaxParameterfv +case 5352: { // glGetMinmaxParameterfv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[1] = {0.0}; @@ -2524,7 +2685,7 @@ if (AP != 8 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,8); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5328: { // glGetMinmaxParameteriv +case 5353: { // glGetMinmaxParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[1] = {0}; @@ -2538,207 +2699,37 @@ if (AP != 8 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,8); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5329: { // glHistogram +case 5354: { // glHistogram GLenum *target = (GLenum *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLboolean *sink = (GLboolean *) bp; bp += 1; weglHistogram(*target,*width,*internalformat,*sink); }; break; -case 5330: { // glMinmax +case 5355: { // glMinmax GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLboolean *sink = (GLboolean *) bp; bp += 1; weglMinmax(*target,*internalformat,*sink); }; break; -case 5331: { // glResetHistogram +case 5356: { // glResetHistogram GLenum *target = (GLenum *) bp; bp += 4; weglResetHistogram(*target); }; break; -case 5332: { // glResetMinmax +case 5357: { // glResetMinmax GLenum *target = (GLenum *) bp; bp += 4; weglResetMinmax(*target); }; break; -case 5333: { // glTexImage3D - GLenum *target = (GLenum *) bp; bp += 4; - GLint *level = (GLint *) bp; bp += 4; - GLint *internalformat = (GLint *) bp; bp += 4; - GLsizei *width = (GLsizei *) bp; bp += 4; - GLsizei *height = (GLsizei *) bp; bp += 4; - GLsizei *depth = (GLsizei *) bp; bp += 4; - GLint *border = (GLint *) bp; bp += 4; - GLenum *format = (GLenum *) bp; bp += 4; - GLenum *type = (GLenum *) bp; bp += 4; - GLvoid *pixels = (GLvoid *) * (int *) bp; bp += 4; - weglTexImage3D(*target,*level,*internalformat,*width,*height,*depth,*border,*format,*type,pixels); -}; break; -case 5334: { // glTexImage3D - GLenum *target = (GLenum *) bp; bp += 4; - GLint *level = (GLint *) bp; bp += 4; - GLint *internalformat = (GLint *) bp; bp += 4; - GLsizei *width = (GLsizei *) bp; bp += 4; - GLsizei *height = (GLsizei *) bp; bp += 4; - GLsizei *depth = (GLsizei *) bp; bp += 4; - GLint *border = (GLint *) bp; bp += 4; - GLenum *format = (GLenum *) bp; bp += 4; - GLenum *type = (GLenum *) bp; bp += 4; - GLvoid *pixels = (GLvoid *) bins[0]->base; - weglTexImage3D(*target,*level,*internalformat,*width,*height,*depth,*border,*format,*type,pixels); -}; break; -case 5335: { // glTexSubImage3D - GLenum *target = (GLenum *) bp; bp += 4; - GLint *level = (GLint *) bp; bp += 4; - GLint *xoffset = (GLint *) bp; bp += 4; - GLint *yoffset = (GLint *) bp; bp += 4; - GLint *zoffset = (GLint *) bp; bp += 4; - GLsizei *width = (GLsizei *) bp; bp += 4; - GLsizei *height = (GLsizei *) bp; bp += 4; - GLsizei *depth = (GLsizei *) bp; bp += 4; - GLenum *format = (GLenum *) bp; bp += 4; - GLenum *type = (GLenum *) bp; bp += 4; - GLvoid *pixels = (GLvoid *) * (int *) bp; bp += 4; - weglTexSubImage3D(*target,*level,*xoffset,*yoffset,*zoffset,*width,*height,*depth,*format,*type,pixels); -}; break; -case 5336: { // glTexSubImage3D - GLenum *target = (GLenum *) bp; bp += 4; - GLint *level = (GLint *) bp; bp += 4; - GLint *xoffset = (GLint *) bp; bp += 4; - GLint *yoffset = (GLint *) bp; bp += 4; - GLint *zoffset = (GLint *) bp; bp += 4; - GLsizei *width = (GLsizei *) bp; bp += 4; - GLsizei *height = (GLsizei *) bp; bp += 4; - GLsizei *depth = (GLsizei *) bp; bp += 4; - GLenum *format = (GLenum *) bp; bp += 4; - GLenum *type = (GLenum *) bp; bp += 4; - GLvoid *pixels = (GLvoid *) bins[0]->base; - weglTexSubImage3D(*target,*level,*xoffset,*yoffset,*zoffset,*width,*height,*depth,*format,*type,pixels); -}; break; -case 5337: { // glCopyTexSubImage3D - GLenum *target = (GLenum *) bp; bp += 4; - GLint *level = (GLint *) bp; bp += 4; - GLint *xoffset = (GLint *) bp; bp += 4; - GLint *yoffset = (GLint *) bp; bp += 4; - GLint *zoffset = (GLint *) bp; bp += 4; - GLint *x = (GLint *) bp; bp += 4; - GLint *y = (GLint *) bp; bp += 4; - GLsizei *width = (GLsizei *) bp; bp += 4; - GLsizei *height = (GLsizei *) bp; bp += 4; - weglCopyTexSubImage3D(*target,*level,*xoffset,*yoffset,*zoffset,*x,*y,*width,*height); -}; break; -case 5338: { // glActiveTexture +case 5358: { // glActiveTexture GLenum *texture = (GLenum *) bp; bp += 4; weglActiveTexture(*texture); }; break; -case 5339: { // glClientActiveTexture - GLenum *texture = (GLenum *) bp; bp += 4; - weglClientActiveTexture(*texture); -}; break; -case 5340: { // glMultiTexCoord1dv - GLenum *target = (GLenum *) bp; bp += 4; - bp += 4; - GLdouble *v = (GLdouble *) bp; bp += 8; - weglMultiTexCoord1dv(*target,v); -}; break; -case 5341: { // glMultiTexCoord1fv - GLenum *target = (GLenum *) bp; bp += 4; - GLfloat *v = (GLfloat *) bp; bp += 4; - weglMultiTexCoord1fv(*target,v); -}; break; -case 5342: { // glMultiTexCoord1iv - GLenum *target = (GLenum *) bp; bp += 4; - GLint *v = (GLint *) bp; bp += 4; - weglMultiTexCoord1iv(*target,v); -}; break; -case 5343: { // glMultiTexCoord1sv - GLenum *target = (GLenum *) bp; bp += 4; - GLshort *v = (GLshort *) bp; bp += 2; - weglMultiTexCoord1sv(*target,v); -}; break; -case 5344: { // glMultiTexCoord2dv - GLenum *target = (GLenum *) bp; bp += 4; - bp += 4; - GLdouble *v = (GLdouble *) bp; bp += 8; - weglMultiTexCoord2dv(*target,v); -}; break; -case 5345: { // glMultiTexCoord2fv - GLenum *target = (GLenum *) bp; bp += 4; - GLfloat *v = (GLfloat *) bp; bp += 4; - weglMultiTexCoord2fv(*target,v); -}; break; -case 5346: { // glMultiTexCoord2iv - GLenum *target = (GLenum *) bp; bp += 4; - GLint *v = (GLint *) bp; bp += 4; - weglMultiTexCoord2iv(*target,v); -}; break; -case 5347: { // glMultiTexCoord2sv - GLenum *target = (GLenum *) bp; bp += 4; - GLshort *v = (GLshort *) bp; bp += 2; - weglMultiTexCoord2sv(*target,v); -}; break; -case 5348: { // glMultiTexCoord3dv - GLenum *target = (GLenum *) bp; bp += 4; - bp += 4; - GLdouble *v = (GLdouble *) bp; bp += 8; - weglMultiTexCoord3dv(*target,v); -}; break; -case 5349: { // glMultiTexCoord3fv - GLenum *target = (GLenum *) bp; bp += 4; - GLfloat *v = (GLfloat *) bp; bp += 4; - weglMultiTexCoord3fv(*target,v); -}; break; -case 5350: { // glMultiTexCoord3iv - GLenum *target = (GLenum *) bp; bp += 4; - GLint *v = (GLint *) bp; bp += 4; - weglMultiTexCoord3iv(*target,v); -}; break; -case 5351: { // glMultiTexCoord3sv - GLenum *target = (GLenum *) bp; bp += 4; - GLshort *v = (GLshort *) bp; bp += 2; - weglMultiTexCoord3sv(*target,v); -}; break; -case 5352: { // glMultiTexCoord4dv - GLenum *target = (GLenum *) bp; bp += 4; - bp += 4; - GLdouble *v = (GLdouble *) bp; bp += 8; - weglMultiTexCoord4dv(*target,v); -}; break; -case 5353: { // glMultiTexCoord4fv - GLenum *target = (GLenum *) bp; bp += 4; - GLfloat *v = (GLfloat *) bp; bp += 4; - weglMultiTexCoord4fv(*target,v); -}; break; -case 5354: { // glMultiTexCoord4iv - GLenum *target = (GLenum *) bp; bp += 4; - GLint *v = (GLint *) bp; bp += 4; - weglMultiTexCoord4iv(*target,v); -}; break; -case 5355: { // glMultiTexCoord4sv - GLenum *target = (GLenum *) bp; bp += 4; - GLshort *v = (GLshort *) bp; bp += 2; - weglMultiTexCoord4sv(*target,v); -}; break; -case 5356: { // glLoadTransposeMatrixf - GLfloat * m = (GLfloat *) bp; bp += 64; - weglLoadTransposeMatrixf(m); -}; break; -case 5357: { // glLoadTransposeMatrixd - GLdouble * m = (GLdouble *) bp; bp += 128; - weglLoadTransposeMatrixd(m); -}; break; -case 5358: { // glMultTransposeMatrixf - GLfloat * m = (GLfloat *) bp; bp += 64; - weglMultTransposeMatrixf(m); -}; break; -case 5359: { // glMultTransposeMatrixd - GLdouble * m = (GLdouble *) bp; bp += 128; - weglMultTransposeMatrixd(m); -}; break; -case 5360: { // glSampleCoverage +case 5359: { // glSampleCoverage GLclampf *value = (GLclampf *) bp; bp += 4; GLboolean *invert = (GLboolean *) bp; bp += 1; weglSampleCoverage(*value,*invert); }; break; -case 5361: { // glCompressedTexImage3D +case 5360: { // glCompressedTexImage3D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; @@ -2750,7 +2741,7 @@ GLvoid *data = (GLvoid *) * (int *) bp; bp += 4; weglCompressedTexImage3D(*target,*level,*internalformat,*width,*height,*depth,*border,*imageSize,data); }; break; -case 5362: { // glCompressedTexImage3D +case 5361: { // glCompressedTexImage3D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; @@ -2762,7 +2753,7 @@ GLvoid *data = (GLvoid *) bins[0]->base; weglCompressedTexImage3D(*target,*level,*internalformat,*width,*height,*depth,*border,*imageSize,data); }; break; -case 5363: { // glCompressedTexImage2D +case 5362: { // glCompressedTexImage2D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; @@ -2773,7 +2764,7 @@ GLvoid *data = (GLvoid *) * (int *) bp; bp += 4; weglCompressedTexImage2D(*target,*level,*internalformat,*width,*height,*border,*imageSize,data); }; break; -case 5364: { // glCompressedTexImage2D +case 5363: { // glCompressedTexImage2D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; @@ -2784,7 +2775,7 @@ GLvoid *data = (GLvoid *) bins[0]->base; weglCompressedTexImage2D(*target,*level,*internalformat,*width,*height,*border,*imageSize,data); }; break; -case 5365: { // glCompressedTexImage1D +case 5364: { // glCompressedTexImage1D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; @@ -2794,7 +2785,7 @@ GLvoid *data = (GLvoid *) * (int *) bp; bp += 4; weglCompressedTexImage1D(*target,*level,*internalformat,*width,*border,*imageSize,data); }; break; -case 5366: { // glCompressedTexImage1D +case 5365: { // glCompressedTexImage1D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; @@ -2804,7 +2795,7 @@ GLvoid *data = (GLvoid *) bins[0]->base; weglCompressedTexImage1D(*target,*level,*internalformat,*width,*border,*imageSize,data); }; break; -case 5367: { // glCompressedTexSubImage3D +case 5366: { // glCompressedTexSubImage3D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -2818,7 +2809,7 @@ GLvoid *data = (GLvoid *) * (int *) bp; bp += 4; weglCompressedTexSubImage3D(*target,*level,*xoffset,*yoffset,*zoffset,*width,*height,*depth,*format,*imageSize,data); }; break; -case 5368: { // glCompressedTexSubImage3D +case 5367: { // glCompressedTexSubImage3D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -2832,7 +2823,7 @@ GLvoid *data = (GLvoid *) bins[0]->base; weglCompressedTexSubImage3D(*target,*level,*xoffset,*yoffset,*zoffset,*width,*height,*depth,*format,*imageSize,data); }; break; -case 5369: { // glCompressedTexSubImage2D +case 5368: { // glCompressedTexSubImage2D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -2844,7 +2835,7 @@ GLvoid *data = (GLvoid *) * (int *) bp; bp += 4; weglCompressedTexSubImage2D(*target,*level,*xoffset,*yoffset,*width,*height,*format,*imageSize,data); }; break; -case 5370: { // glCompressedTexSubImage2D +case 5369: { // glCompressedTexSubImage2D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -2856,7 +2847,7 @@ GLvoid *data = (GLvoid *) bins[0]->base; weglCompressedTexSubImage2D(*target,*level,*xoffset,*yoffset,*width,*height,*format,*imageSize,data); }; break; -case 5371: { // glCompressedTexSubImage1D +case 5370: { // glCompressedTexSubImage1D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -2866,7 +2857,7 @@ GLvoid *data = (GLvoid *) * (int *) bp; bp += 4; weglCompressedTexSubImage1D(*target,*level,*xoffset,*width,*format,*imageSize,data); }; break; -case 5372: { // glCompressedTexSubImage1D +case 5371: { // glCompressedTexSubImage1D GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLint *xoffset = (GLint *) bp; bp += 4; @@ -2876,7 +2867,7 @@ GLvoid *data = (GLvoid *) bins[0]->base; weglCompressedTexSubImage1D(*target,*level,*xoffset,*width,*format,*imageSize,data); }; break; -case 5373: { // glGetCompressedTexImage +case 5372: { // glGetCompressedTexImage GLenum *target = (GLenum *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; GLvoid *img = (GLvoid *) bins[0]->base; @@ -2887,34 +2878,118 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5374: { // glBlendFuncSeparate - GLenum *sfactorRGB = (GLenum *) bp; bp += 4; - GLenum *dfactorRGB = (GLenum *) bp; bp += 4; - GLenum *sfactorAlpha = (GLenum *) bp; bp += 4; - GLenum *dfactorAlpha = (GLenum *) bp; bp += 4; - weglBlendFuncSeparate(*sfactorRGB,*dfactorRGB,*sfactorAlpha,*dfactorAlpha); -}; break; -case 5375: { // glFogCoordfv - GLfloat *coord = (GLfloat *) bp; bp += 4; - weglFogCoordfv(coord); +case 5373: { // glClientActiveTexture + GLenum *texture = (GLenum *) bp; bp += 4; + weglClientActiveTexture(*texture); }; break; -case 5376: { // glFogCoorddv - GLdouble *coord = (GLdouble *) bp; bp += 8; - weglFogCoorddv(coord); +case 5374: { // glMultiTexCoord1dv + GLenum *target = (GLenum *) bp; bp += 4; + bp += 4; + GLdouble *v = (GLdouble *) bp; bp += 8; + weglMultiTexCoord1dv(*target,v); }; break; -case 5377: { // glFogCoordPointer - GLenum *type = (GLenum *) bp; bp += 4; - GLsizei *stride = (GLsizei *) bp; bp += 4; - GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; - weglFogCoordPointer(*type,*stride,pointer); +case 5375: { // glMultiTexCoord1fv + GLenum *target = (GLenum *) bp; bp += 4; + GLfloat *v = (GLfloat *) bp; bp += 4; + weglMultiTexCoord1fv(*target,v); }; break; -case 5378: { // glFogCoordPointer - GLenum *type = (GLenum *) bp; bp += 4; - GLsizei *stride = (GLsizei *) bp; bp += 4; - GLvoid *pointer = (GLvoid *) bins[0]->base; - weglFogCoordPointer(*type,*stride,pointer); +case 5376: { // glMultiTexCoord1iv + GLenum *target = (GLenum *) bp; bp += 4; + GLint *v = (GLint *) bp; bp += 4; + weglMultiTexCoord1iv(*target,v); +}; break; +case 5377: { // glMultiTexCoord1sv + GLenum *target = (GLenum *) bp; bp += 4; + GLshort *v = (GLshort *) bp; bp += 2; + weglMultiTexCoord1sv(*target,v); +}; break; +case 5378: { // glMultiTexCoord2dv + GLenum *target = (GLenum *) bp; bp += 4; + bp += 4; + GLdouble *v = (GLdouble *) bp; bp += 8; + weglMultiTexCoord2dv(*target,v); +}; break; +case 5379: { // glMultiTexCoord2fv + GLenum *target = (GLenum *) bp; bp += 4; + GLfloat *v = (GLfloat *) bp; bp += 4; + weglMultiTexCoord2fv(*target,v); +}; break; +case 5380: { // glMultiTexCoord2iv + GLenum *target = (GLenum *) bp; bp += 4; + GLint *v = (GLint *) bp; bp += 4; + weglMultiTexCoord2iv(*target,v); +}; break; +case 5381: { // glMultiTexCoord2sv + GLenum *target = (GLenum *) bp; bp += 4; + GLshort *v = (GLshort *) bp; bp += 2; + weglMultiTexCoord2sv(*target,v); +}; break; +case 5382: { // glMultiTexCoord3dv + GLenum *target = (GLenum *) bp; bp += 4; + bp += 4; + GLdouble *v = (GLdouble *) bp; bp += 8; + weglMultiTexCoord3dv(*target,v); +}; break; +case 5383: { // glMultiTexCoord3fv + GLenum *target = (GLenum *) bp; bp += 4; + GLfloat *v = (GLfloat *) bp; bp += 4; + weglMultiTexCoord3fv(*target,v); +}; break; +case 5384: { // glMultiTexCoord3iv + GLenum *target = (GLenum *) bp; bp += 4; + GLint *v = (GLint *) bp; bp += 4; + weglMultiTexCoord3iv(*target,v); +}; break; +case 5385: { // glMultiTexCoord3sv + GLenum *target = (GLenum *) bp; bp += 4; + GLshort *v = (GLshort *) bp; bp += 2; + weglMultiTexCoord3sv(*target,v); +}; break; +case 5386: { // glMultiTexCoord4dv + GLenum *target = (GLenum *) bp; bp += 4; + bp += 4; + GLdouble *v = (GLdouble *) bp; bp += 8; + weglMultiTexCoord4dv(*target,v); +}; break; +case 5387: { // glMultiTexCoord4fv + GLenum *target = (GLenum *) bp; bp += 4; + GLfloat *v = (GLfloat *) bp; bp += 4; + weglMultiTexCoord4fv(*target,v); +}; break; +case 5388: { // glMultiTexCoord4iv + GLenum *target = (GLenum *) bp; bp += 4; + GLint *v = (GLint *) bp; bp += 4; + weglMultiTexCoord4iv(*target,v); +}; break; +case 5389: { // glMultiTexCoord4sv + GLenum *target = (GLenum *) bp; bp += 4; + GLshort *v = (GLshort *) bp; bp += 2; + weglMultiTexCoord4sv(*target,v); +}; break; +case 5390: { // glLoadTransposeMatrixf + GLfloat * m = (GLfloat *) bp; bp += 64; + weglLoadTransposeMatrixf(m); +}; break; +case 5391: { // glLoadTransposeMatrixd + GLdouble * m = (GLdouble *) bp; bp += 128; + weglLoadTransposeMatrixd(m); +}; break; +case 5392: { // glMultTransposeMatrixf + GLfloat * m = (GLfloat *) bp; bp += 64; + weglMultTransposeMatrixf(m); +}; break; +case 5393: { // glMultTransposeMatrixd + GLdouble * m = (GLdouble *) bp; bp += 128; + weglMultTransposeMatrixd(m); }; break; -case 5379: { // glMultiDrawArrays +case 5394: { // glBlendFuncSeparate + GLenum *sfactorRGB = (GLenum *) bp; bp += 4; + GLenum *dfactorRGB = (GLenum *) bp; bp += 4; + GLenum *sfactorAlpha = (GLenum *) bp; bp += 4; + GLenum *dfactorAlpha = (GLenum *) bp; bp += 4; + weglBlendFuncSeparate(*sfactorRGB,*dfactorRGB,*sfactorAlpha,*dfactorAlpha); +}; break; +case 5395: { // glMultiDrawArrays GLenum *mode = (GLenum *) bp; bp += 4; int * firstLen = (int *) bp; bp += 4; GLint * first = (GLint *) bp; bp += (8-((*firstLen*4+0)%8))%8; @@ -2922,107 +2997,127 @@ GLsizei * count = (GLsizei *) bp; bp += (8-((*countLen*4+4)%8))%8; weglMultiDrawArrays(*mode,first,count,*firstLen); }; break; -case 5380: { // glPointParameterf +case 5396: { // glPointParameterf GLenum *pname = (GLenum *) bp; bp += 4; GLfloat *param = (GLfloat *) bp; bp += 4; weglPointParameterf(*pname,*param); }; break; -case 5381: { // glPointParameterfv +case 5397: { // glPointParameterfv GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLfloat *params = (GLfloat *) bp; bp += *paramsLen*4+((*paramsLen)+0)%2*4; weglPointParameterfv(*pname,params); }; break; -case 5382: { // glPointParameteri +case 5398: { // glPointParameteri GLenum *pname = (GLenum *) bp; bp += 4; GLint *param = (GLint *) bp; bp += 4; weglPointParameteri(*pname,*param); }; break; -case 5383: { // glPointParameteriv +case 5399: { // glPointParameteriv GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+0)%2*4; weglPointParameteriv(*pname,params); }; break; -case 5384: { // glSecondaryColor3bv +case 5400: { // glFogCoordfv + GLfloat *coord = (GLfloat *) bp; bp += 4; + weglFogCoordfv(coord); +}; break; +case 5401: { // glFogCoorddv + GLdouble *coord = (GLdouble *) bp; bp += 8; + weglFogCoorddv(coord); +}; break; +case 5402: { // glFogCoordPointer + GLenum *type = (GLenum *) bp; bp += 4; + GLsizei *stride = (GLsizei *) bp; bp += 4; + GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; + weglFogCoordPointer(*type,*stride,pointer); +}; break; +case 5403: { // glFogCoordPointer + GLenum *type = (GLenum *) bp; bp += 4; + GLsizei *stride = (GLsizei *) bp; bp += 4; + GLvoid *pointer = (GLvoid *) bins[0]->base; + weglFogCoordPointer(*type,*stride,pointer); +}; break; +case 5404: { // glSecondaryColor3bv GLbyte *v = (GLbyte *) bp; bp += 1; weglSecondaryColor3bv(v); }; break; -case 5385: { // glSecondaryColor3dv +case 5405: { // glSecondaryColor3dv GLdouble *v = (GLdouble *) bp; bp += 8; weglSecondaryColor3dv(v); }; break; -case 5386: { // glSecondaryColor3fv +case 5406: { // glSecondaryColor3fv GLfloat *v = (GLfloat *) bp; bp += 4; weglSecondaryColor3fv(v); }; break; -case 5387: { // glSecondaryColor3iv +case 5407: { // glSecondaryColor3iv GLint *v = (GLint *) bp; bp += 4; weglSecondaryColor3iv(v); }; break; -case 5388: { // glSecondaryColor3sv +case 5408: { // glSecondaryColor3sv GLshort *v = (GLshort *) bp; bp += 2; weglSecondaryColor3sv(v); }; break; -case 5389: { // glSecondaryColor3ubv +case 5409: { // glSecondaryColor3ubv GLubyte *v = (GLubyte *) bp; bp += 1; weglSecondaryColor3ubv(v); }; break; -case 5390: { // glSecondaryColor3uiv +case 5410: { // glSecondaryColor3uiv GLuint *v = (GLuint *) bp; bp += 4; weglSecondaryColor3uiv(v); }; break; -case 5391: { // glSecondaryColor3usv +case 5411: { // glSecondaryColor3usv GLushort *v = (GLushort *) bp; bp += 2; weglSecondaryColor3usv(v); }; break; -case 5392: { // glSecondaryColorPointer +case 5412: { // glSecondaryColorPointer GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; weglSecondaryColorPointer(*size,*type,*stride,pointer); }; break; -case 5393: { // glSecondaryColorPointer +case 5413: { // glSecondaryColorPointer GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; GLsizei *stride = (GLsizei *) bp; bp += 4; GLvoid *pointer = (GLvoid *) bins[0]->base; weglSecondaryColorPointer(*size,*type,*stride,pointer); }; break; -case 5394: { // glWindowPos2dv +case 5414: { // glWindowPos2dv GLdouble *v = (GLdouble *) bp; bp += 8; weglWindowPos2dv(v); }; break; -case 5395: { // glWindowPos2fv +case 5415: { // glWindowPos2fv GLfloat *v = (GLfloat *) bp; bp += 4; weglWindowPos2fv(v); }; break; -case 5396: { // glWindowPos2iv +case 5416: { // glWindowPos2iv GLint *v = (GLint *) bp; bp += 4; weglWindowPos2iv(v); }; break; -case 5397: { // glWindowPos2sv +case 5417: { // glWindowPos2sv GLshort *v = (GLshort *) bp; bp += 2; weglWindowPos2sv(v); }; break; -case 5398: { // glWindowPos3dv +case 5418: { // glWindowPos3dv GLdouble *v = (GLdouble *) bp; bp += 8; weglWindowPos3dv(v); }; break; -case 5399: { // glWindowPos3fv +case 5419: { // glWindowPos3fv GLfloat *v = (GLfloat *) bp; bp += 4; weglWindowPos3fv(v); }; break; -case 5400: { // glWindowPos3iv +case 5420: { // glWindowPos3iv GLint *v = (GLint *) bp; bp += 4; weglWindowPos3iv(v); }; break; -case 5401: { // glWindowPos3sv +case 5421: { // glWindowPos3sv GLshort *v = (GLshort *) bp; bp += 2; weglWindowPos3sv(v); }; break; -case 5402: { // glGenQueries +case 5422: { // glGenQueries GLsizei *n = (GLsizei *) bp; bp += 4; GLuint *ids; ids = (GLuint *) driver_alloc(sizeof(GLuint) * *n); @@ -3039,12 +3134,12 @@ driver_free(rt); driver_free(ids); }; break; -case 5403: { // glDeleteQueries +case 5423: { // glDeleteQueries int * idsLen = (int *) bp; bp += 4; GLuint * ids = (GLuint *) bp; bp += (8-((*idsLen*4+4)%8))%8; weglDeleteQueries(*idsLen,ids); }; break; -case 5404: { // glIsQuery +case 5424: { // glIsQuery GLuint *id = (GLuint *) bp; bp += 4; GLboolean result = weglIsQuery(*id); int AP = 0; ErlDrvTermData rt[6]; @@ -3054,16 +3149,16 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5405: { // glBeginQuery +case 5425: { // glBeginQuery GLenum *target = (GLenum *) bp; bp += 4; GLuint *id = (GLuint *) bp; bp += 4; weglBeginQuery(*target,*id); }; break; -case 5406: { // glEndQuery +case 5426: { // glEndQuery GLenum *target = (GLenum *) bp; bp += 4; weglEndQuery(*target); }; break; -case 5407: { // glGetQueryiv +case 5427: { // glGetQueryiv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[1] = {0}; @@ -3075,7 +3170,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5408: { // glGetQueryObjectiv +case 5428: { // glGetQueryObjectiv GLuint *id = (GLuint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[1] = {0}; @@ -3087,7 +3182,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5409: { // glGetQueryObjectuiv +case 5429: { // glGetQueryObjectuiv GLuint *id = (GLuint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLuint params[1] = {0}; @@ -3099,17 +3194,17 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5410: { // glBindBuffer +case 5430: { // glBindBuffer GLenum *target = (GLenum *) bp; bp += 4; GLuint *buffer = (GLuint *) bp; bp += 4; weglBindBuffer(*target,*buffer); }; break; -case 5411: { // glDeleteBuffers +case 5431: { // glDeleteBuffers int * buffersLen = (int *) bp; bp += 4; GLuint * buffers = (GLuint *) bp; bp += (8-((*buffersLen*4+4)%8))%8; weglDeleteBuffers(*buffersLen,buffers); }; break; -case 5412: { // glGenBuffers +case 5432: { // glGenBuffers GLsizei *n = (GLsizei *) bp; bp += 4; GLuint *buffers; buffers = (GLuint *) driver_alloc(sizeof(GLuint) * *n); @@ -3126,7 +3221,7 @@ driver_free(rt); driver_free(buffers); }; break; -case 5413: { // glIsBuffer +case 5433: { // glIsBuffer GLuint *buffer = (GLuint *) bp; bp += 4; GLboolean result = weglIsBuffer(*buffer); int AP = 0; ErlDrvTermData rt[6]; @@ -3136,7 +3231,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5414: { // glBufferData +case 5434: { // glBufferData GLenum *target = (GLenum *) bp; bp += 4; bp += 4; GLsizeiptr size = (GLsizeiptr) * (GLuint64EXT *) bp; bp += 8; @@ -3144,7 +3239,7 @@ GLenum *usage = (GLenum *) bp; bp += 4; weglBufferData(*target,size,data,*usage); }; break; -case 5415: { // glBufferData +case 5435: { // glBufferData GLenum *target = (GLenum *) bp; bp += 4; bp += 4; GLsizeiptr size = (GLsizeiptr) * (GLuint64EXT *) bp; bp += 8; @@ -3152,7 +3247,7 @@ GLenum *usage = (GLenum *) bp; bp += 4; weglBufferData(*target,size,data,*usage); }; break; -case 5416: { // glBufferSubData +case 5436: { // glBufferSubData GLenum *target = (GLenum *) bp; bp += 4; bp += 4; GLintptr offset = (GLintptr) * (GLuint64EXT *) bp; bp += 8; @@ -3160,7 +3255,7 @@ GLvoid *data = (GLvoid *) * (int *) bp; bp += 4; weglBufferSubData(*target,offset,size,data); }; break; -case 5417: { // glBufferSubData +case 5437: { // glBufferSubData GLenum *target = (GLenum *) bp; bp += 4; bp += 4; GLintptr offset = (GLintptr) * (GLuint64EXT *) bp; bp += 8; @@ -3168,7 +3263,7 @@ GLvoid *data = (GLvoid *) bins[0]->base; weglBufferSubData(*target,offset,size,data); }; break; -case 5418: { // glGetBufferSubData +case 5438: { // glGetBufferSubData GLenum *target = (GLenum *) bp; bp += 4; bp += 4; GLintptr offset = (GLintptr) * (GLuint64EXT *) bp; bp += 8; @@ -3181,7 +3276,7 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5419: { // glGetBufferParameteriv +case 5439: { // glGetBufferParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[1] = {0}; @@ -3193,52 +3288,52 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5420: { // glBlendEquationSeparate +case 5440: { // glBlendEquationSeparate GLenum *modeRGB = (GLenum *) bp; bp += 4; GLenum *modeAlpha = (GLenum *) bp; bp += 4; weglBlendEquationSeparate(*modeRGB,*modeAlpha); }; break; -case 5421: { // glDrawBuffers +case 5441: { // glDrawBuffers int * bufsLen = (int *) bp; bp += 4; GLenum * bufs = (GLenum *) bp; bp += (8-((*bufsLen*4+4)%8))%8; weglDrawBuffers(*bufsLen,bufs); }; break; -case 5422: { // glStencilOpSeparate +case 5442: { // glStencilOpSeparate GLenum *face = (GLenum *) bp; bp += 4; GLenum *sfail = (GLenum *) bp; bp += 4; GLenum *dpfail = (GLenum *) bp; bp += 4; GLenum *dppass = (GLenum *) bp; bp += 4; weglStencilOpSeparate(*face,*sfail,*dpfail,*dppass); }; break; -case 5423: { // glStencilFuncSeparate +case 5443: { // glStencilFuncSeparate GLenum *frontfunc = (GLenum *) bp; bp += 4; GLenum *backfunc = (GLenum *) bp; bp += 4; GLint *ref = (GLint *) bp; bp += 4; GLuint *mask = (GLuint *) bp; bp += 4; weglStencilFuncSeparate(*frontfunc,*backfunc,*ref,*mask); }; break; -case 5424: { // glStencilMaskSeparate +case 5444: { // glStencilMaskSeparate GLenum *face = (GLenum *) bp; bp += 4; GLuint *mask = (GLuint *) bp; bp += 4; weglStencilMaskSeparate(*face,*mask); }; break; -case 5425: { // glAttachShader +case 5445: { // glAttachShader GLuint *program = (GLuint *) bp; bp += 4; GLuint *shader = (GLuint *) bp; bp += 4; weglAttachShader(*program,*shader); }; break; -case 5426: { // glBindAttribLocation +case 5446: { // glBindAttribLocation GLuint *program = (GLuint *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLchar *name = (GLchar *) bp; int nameLen = strlen((char *)name); bp += nameLen+1+((8-((1+nameLen+0)%8))%8); weglBindAttribLocation(*program,*index,name); }; break; -case 5427: { // glCompileShader +case 5447: { // glCompileShader GLuint *shader = (GLuint *) bp; bp += 4; weglCompileShader(*shader); }; break; -case 5428: { // glCreateProgram +case 5448: { // glCreateProgram GLuint result = weglCreateProgram(); int AP = 0; ErlDrvTermData rt[6]; rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); @@ -3247,7 +3342,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5429: { // glCreateShader +case 5449: { // glCreateShader GLenum *type = (GLenum *) bp; bp += 4; GLuint result = weglCreateShader(*type); int AP = 0; ErlDrvTermData rt[6]; @@ -3257,28 +3352,28 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5430: { // glDeleteProgram +case 5450: { // glDeleteProgram GLuint *program = (GLuint *) bp; bp += 4; weglDeleteProgram(*program); }; break; -case 5431: { // glDeleteShader +case 5451: { // glDeleteShader GLuint *shader = (GLuint *) bp; bp += 4; weglDeleteShader(*shader); }; break; -case 5432: { // glDetachShader +case 5452: { // glDetachShader GLuint *program = (GLuint *) bp; bp += 4; GLuint *shader = (GLuint *) bp; bp += 4; weglDetachShader(*program,*shader); }; break; -case 5433: { // glDisableVertexAttribArray +case 5453: { // glDisableVertexAttribArray GLuint *index = (GLuint *) bp; bp += 4; weglDisableVertexAttribArray(*index); }; break; -case 5434: { // glEnableVertexAttribArray +case 5454: { // glEnableVertexAttribArray GLuint *index = (GLuint *) bp; bp += 4; weglEnableVertexAttribArray(*index); }; break; -case 5435: { // glGetActiveAttrib +case 5455: { // glGetActiveAttrib GLuint *program = (GLuint *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLsizei *bufSize = (GLsizei *) bp; bp += 4; @@ -3288,17 +3383,18 @@ GLchar *name; name = (GLchar *) driver_alloc(sizeof(GLchar) * *bufSize); weglGetActiveAttrib(*program,*index,*bufSize,length,size,type,name); - int AP = 0; ErlDrvTermData rt[11]; + int AP = 0; ErlDrvTermData rt[13]; rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *size; rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *type; rt[AP++] = ERL_DRV_STRING; rt[AP++] = (ErlDrvTermData) name; rt[AP++] = *length; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 3; rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; - if (AP != 11 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,11); + if (AP != 13 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,13); driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free(name); }; break; -case 5436: { // glGetActiveUniform +case 5456: { // glGetActiveUniform GLuint *program = (GLuint *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLsizei *bufSize = (GLsizei *) bp; bp += 4; @@ -3308,17 +3404,18 @@ GLchar *name; name = (GLchar *) driver_alloc(sizeof(GLchar) * *bufSize); weglGetActiveUniform(*program,*index,*bufSize,length,size,type,name); - int AP = 0; ErlDrvTermData rt[11]; + int AP = 0; ErlDrvTermData rt[13]; rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *size; rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *type; rt[AP++] = ERL_DRV_STRING; rt[AP++] = (ErlDrvTermData) name; rt[AP++] = *length; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 3; rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; - if (AP != 11 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,11); + if (AP != 13 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,13); driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free(name); }; break; -case 5437: { // glGetAttachedShaders +case 5457: { // glGetAttachedShaders GLuint *program = (GLuint *) bp; bp += 4; GLsizei *maxCount = (GLsizei *) bp; bp += 4; GLsizei count[1] = {0}; @@ -3337,7 +3434,7 @@ driver_free(rt); driver_free(obj); }; break; -case 5438: { // glGetAttribLocation +case 5458: { // glGetAttribLocation GLuint *program = (GLuint *) bp; bp += 4; GLchar *name = (GLchar *) bp; int nameLen = strlen((char *)name); bp += nameLen+1+((8-((1+nameLen+4)%8))%8); @@ -3349,7 +3446,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5439: { // glGetProgramiv +case 5459: { // glGetProgramiv GLuint *program = (GLuint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[1] = {0}; @@ -3361,7 +3458,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5440: { // glGetProgramInfoLog +case 5460: { // glGetProgramInfoLog GLuint *program = (GLuint *) bp; bp += 4; GLsizei *bufSize = (GLsizei *) bp; bp += 4; GLsizei length[1] = {0}; @@ -3376,7 +3473,7 @@ driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free(infoLog); }; break; -case 5441: { // glGetShaderiv +case 5461: { // glGetShaderiv GLuint *shader = (GLuint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[1] = {0}; @@ -3388,7 +3485,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5442: { // glGetShaderInfoLog +case 5462: { // glGetShaderInfoLog GLuint *shader = (GLuint *) bp; bp += 4; GLsizei *bufSize = (GLsizei *) bp; bp += 4; GLsizei length[1] = {0}; @@ -3403,7 +3500,7 @@ driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free(infoLog); }; break; -case 5443: { // glGetShaderSource +case 5463: { // glGetShaderSource GLuint *shader = (GLuint *) bp; bp += 4; GLsizei *bufSize = (GLsizei *) bp; bp += 4; GLsizei length[1] = {0}; @@ -3418,7 +3515,7 @@ driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free(source); }; break; -case 5444: { // glGetUniformLocation +case 5464: { // glGetUniformLocation GLuint *program = (GLuint *) bp; bp += 4; GLchar *name = (GLchar *) bp; int nameLen = strlen((char *)name); bp += nameLen+1+((8-((1+nameLen+4)%8))%8); @@ -3430,7 +3527,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5445: { // glGetUniformfv +case 5465: { // glGetUniformfv GLuint *program = (GLuint *) bp; bp += 4; GLint *location = (GLint *) bp; bp += 4; GLfloat params[16] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; @@ -3460,7 +3557,7 @@ if (AP != 38 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,38); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5446: { // glGetUniformiv +case 5466: { // glGetUniformiv GLuint *program = (GLuint *) bp; bp += 4; GLint *location = (GLint *) bp; bp += 4; GLint params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; @@ -3489,7 +3586,7 @@ if (AP != 38 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,38); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5447: { // glGetVertexAttribdv +case 5467: { // glGetVertexAttribdv GLuint *index = (GLuint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLdouble params[4] = {0.0,0.0,0.0,0.0}; @@ -3506,7 +3603,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5448: { // glGetVertexAttribfv +case 5468: { // glGetVertexAttribfv GLuint *index = (GLuint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[4] = {0.0,0.0,0.0,0.0}; @@ -3524,7 +3621,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5449: { // glGetVertexAttribiv +case 5469: { // glGetVertexAttribiv GLuint *index = (GLuint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[4] = {0,0,0,0}; @@ -3541,7 +3638,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5450: { // glIsProgram +case 5470: { // glIsProgram GLuint *program = (GLuint *) bp; bp += 4; GLboolean result = weglIsProgram(*program); int AP = 0; ErlDrvTermData rt[6]; @@ -3551,7 +3648,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5451: { // glIsShader +case 5471: { // glIsShader GLuint *shader = (GLuint *) bp; bp += 4; GLboolean result = weglIsShader(*shader); int AP = 0; ErlDrvTermData rt[6]; @@ -3561,11 +3658,11 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5452: { // glLinkProgram +case 5472: { // glLinkProgram GLuint *program = (GLuint *) bp; bp += 4; weglLinkProgram(*program); }; break; -case 5453: { // glShaderSource +case 5473: { // glShaderSource GLuint *shader = (GLuint *) bp; bp += 4; int * stringLen = (int *) bp; bp += 4; int * stringTotSize = (int *) bp; bp += 4; @@ -3577,29 +3674,29 @@ weglShaderSource(*shader,*stringLen,(const GLchar **) string,NULL); driver_free(string); }; break; -case 5454: { // glUseProgram +case 5474: { // glUseProgram GLuint *program = (GLuint *) bp; bp += 4; weglUseProgram(*program); }; break; -case 5455: { // glUniform1f +case 5475: { // glUniform1f GLint *location = (GLint *) bp; bp += 4; GLfloat *v0 = (GLfloat *) bp; bp += 4; weglUniform1f(*location,*v0); }; break; -case 5456: { // glUniform2f +case 5476: { // glUniform2f GLint *location = (GLint *) bp; bp += 4; GLfloat *v0 = (GLfloat *) bp; bp += 4; GLfloat *v1 = (GLfloat *) bp; bp += 4; weglUniform2f(*location,*v0,*v1); }; break; -case 5457: { // glUniform3f +case 5477: { // glUniform3f GLint *location = (GLint *) bp; bp += 4; GLfloat *v0 = (GLfloat *) bp; bp += 4; GLfloat *v1 = (GLfloat *) bp; bp += 4; GLfloat *v2 = (GLfloat *) bp; bp += 4; weglUniform3f(*location,*v0,*v1,*v2); }; break; -case 5458: { // glUniform4f +case 5478: { // glUniform4f GLint *location = (GLint *) bp; bp += 4; GLfloat *v0 = (GLfloat *) bp; bp += 4; GLfloat *v1 = (GLfloat *) bp; bp += 4; @@ -3607,25 +3704,25 @@ GLfloat *v3 = (GLfloat *) bp; bp += 4; weglUniform4f(*location,*v0,*v1,*v2,*v3); }; break; -case 5459: { // glUniform1i +case 5479: { // glUniform1i GLint *location = (GLint *) bp; bp += 4; GLint *v0 = (GLint *) bp; bp += 4; weglUniform1i(*location,*v0); }; break; -case 5460: { // glUniform2i +case 5480: { // glUniform2i GLint *location = (GLint *) bp; bp += 4; GLint *v0 = (GLint *) bp; bp += 4; GLint *v1 = (GLint *) bp; bp += 4; weglUniform2i(*location,*v0,*v1); }; break; -case 5461: { // glUniform3i +case 5481: { // glUniform3i GLint *location = (GLint *) bp; bp += 4; GLint *v0 = (GLint *) bp; bp += 4; GLint *v1 = (GLint *) bp; bp += 4; GLint *v2 = (GLint *) bp; bp += 4; weglUniform3i(*location,*v0,*v1,*v2); }; break; -case 5462: { // glUniform4i +case 5482: { // glUniform4i GLint *location = (GLint *) bp; bp += 4; GLint *v0 = (GLint *) bp; bp += 4; GLint *v1 = (GLint *) bp; bp += 4; @@ -3633,55 +3730,55 @@ GLint *v3 = (GLint *) bp; bp += 4; weglUniform4i(*location,*v0,*v1,*v2,*v3); }; break; -case 5463: { // glUniform1fv +case 5483: { // glUniform1fv GLint *location = (GLint *) bp; bp += 4; int * valueLen = (int *) bp; bp += 4; GLfloat * value = (GLfloat *) bp; bp += (8-((*valueLen*4+0)%8))%8; weglUniform1fv(*location,*valueLen,value); }; break; -case 5464: { // glUniform2fv +case 5484: { // glUniform2fv GLint *location = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLfloat * value = (GLfloat *) bp; bp += *valueLen*8; weglUniform2fv(*location,*valueLen,value); }; break; -case 5465: { // glUniform3fv +case 5485: { // glUniform3fv GLint *location = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLfloat * value = (GLfloat *) bp; bp += *valueLen*12; weglUniform3fv(*location,*valueLen,value); }; break; -case 5466: { // glUniform4fv +case 5486: { // glUniform4fv GLint *location = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLfloat * value = (GLfloat *) bp; bp += *valueLen*16; weglUniform4fv(*location,*valueLen,value); }; break; -case 5467: { // glUniform1iv +case 5487: { // glUniform1iv GLint *location = (GLint *) bp; bp += 4; int * valueLen = (int *) bp; bp += 4; GLint * value = (GLint *) bp; bp += (8-((*valueLen*4+0)%8))%8; weglUniform1iv(*location,*valueLen,value); }; break; -case 5468: { // glUniform2iv +case 5488: { // glUniform2iv GLint *location = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLint * value = (GLint *) bp; bp += *valueLen*8; weglUniform2iv(*location,*valueLen,value); }; break; -case 5469: { // glUniform3iv +case 5489: { // glUniform3iv GLint *location = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLint * value = (GLint *) bp; bp += *valueLen*12; weglUniform3iv(*location,*valueLen,value); }; break; -case 5470: { // glUniform4iv +case 5490: { // glUniform4iv GLint *location = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLint * value = (GLint *) bp; bp += *valueLen*16; weglUniform4iv(*location,*valueLen,value); }; break; -case 5471: { // glUniformMatrix2fv +case 5491: { // glUniformMatrix2fv GLint *location = (GLint *) bp; bp += 4; GLboolean *transpose = (GLboolean *) bp; bp += 1; bp += 3; @@ -3689,7 +3786,7 @@ GLfloat * value = (GLfloat *) bp; bp += *valueLen*16; weglUniformMatrix2fv(*location,*valueLen,*transpose,value); }; break; -case 5472: { // glUniformMatrix3fv +case 5492: { // glUniformMatrix3fv GLint *location = (GLint *) bp; bp += 4; GLboolean *transpose = (GLboolean *) bp; bp += 1; bp += 3; @@ -3697,7 +3794,7 @@ GLfloat * value = (GLfloat *) bp; bp += *valueLen*36; weglUniformMatrix3fv(*location,*valueLen,*transpose,value); }; break; -case 5473: { // glUniformMatrix4fv +case 5493: { // glUniformMatrix4fv GLint *location = (GLint *) bp; bp += 4; GLboolean *transpose = (GLboolean *) bp; bp += 1; bp += 3; @@ -3705,130 +3802,130 @@ GLfloat * value = (GLfloat *) bp; bp += *valueLen*64; weglUniformMatrix4fv(*location,*valueLen,*transpose,value); }; break; -case 5474: { // glValidateProgram +case 5494: { // glValidateProgram GLuint *program = (GLuint *) bp; bp += 4; weglValidateProgram(*program); }; break; -case 5475: { // glVertexAttrib1dv +case 5495: { // glVertexAttrib1dv GLuint *index = (GLuint *) bp; bp += 4; bp += 4; GLdouble *v = (GLdouble *) bp; bp += 8; weglVertexAttrib1dv(*index,v); }; break; -case 5476: { // glVertexAttrib1fv +case 5496: { // glVertexAttrib1fv GLuint *index = (GLuint *) bp; bp += 4; GLfloat *v = (GLfloat *) bp; bp += 4; weglVertexAttrib1fv(*index,v); }; break; -case 5477: { // glVertexAttrib1sv +case 5497: { // glVertexAttrib1sv GLuint *index = (GLuint *) bp; bp += 4; GLshort *v = (GLshort *) bp; bp += 2; weglVertexAttrib1sv(*index,v); }; break; -case 5478: { // glVertexAttrib2dv +case 5498: { // glVertexAttrib2dv GLuint *index = (GLuint *) bp; bp += 4; bp += 4; GLdouble *v = (GLdouble *) bp; bp += 8; weglVertexAttrib2dv(*index,v); }; break; -case 5479: { // glVertexAttrib2fv +case 5499: { // glVertexAttrib2fv GLuint *index = (GLuint *) bp; bp += 4; GLfloat *v = (GLfloat *) bp; bp += 4; weglVertexAttrib2fv(*index,v); }; break; -case 5480: { // glVertexAttrib2sv +case 5500: { // glVertexAttrib2sv GLuint *index = (GLuint *) bp; bp += 4; GLshort *v = (GLshort *) bp; bp += 2; weglVertexAttrib2sv(*index,v); }; break; -case 5481: { // glVertexAttrib3dv +case 5501: { // glVertexAttrib3dv GLuint *index = (GLuint *) bp; bp += 4; bp += 4; GLdouble *v = (GLdouble *) bp; bp += 8; weglVertexAttrib3dv(*index,v); }; break; -case 5482: { // glVertexAttrib3fv +case 5502: { // glVertexAttrib3fv GLuint *index = (GLuint *) bp; bp += 4; GLfloat *v = (GLfloat *) bp; bp += 4; weglVertexAttrib3fv(*index,v); }; break; -case 5483: { // glVertexAttrib3sv +case 5503: { // glVertexAttrib3sv GLuint *index = (GLuint *) bp; bp += 4; GLshort *v = (GLshort *) bp; bp += 2; weglVertexAttrib3sv(*index,v); }; break; -case 5484: { // glVertexAttrib4Nbv +case 5504: { // glVertexAttrib4Nbv GLuint *index = (GLuint *) bp; bp += 4; GLbyte * v = (GLbyte *) bp; bp += 4; weglVertexAttrib4Nbv(*index,v); }; break; -case 5485: { // glVertexAttrib4Niv +case 5505: { // glVertexAttrib4Niv GLuint *index = (GLuint *) bp; bp += 4; GLint * v = (GLint *) bp; bp += 16; weglVertexAttrib4Niv(*index,v); }; break; -case 5486: { // glVertexAttrib4Nsv +case 5506: { // glVertexAttrib4Nsv GLuint *index = (GLuint *) bp; bp += 4; GLshort * v = (GLshort *) bp; bp += 8; weglVertexAttrib4Nsv(*index,v); }; break; -case 5487: { // glVertexAttrib4Nubv +case 5507: { // glVertexAttrib4Nubv GLuint *index = (GLuint *) bp; bp += 4; GLubyte * v = (GLubyte *) bp; bp += 4; weglVertexAttrib4Nubv(*index,v); }; break; -case 5488: { // glVertexAttrib4Nuiv +case 5508: { // glVertexAttrib4Nuiv GLuint *index = (GLuint *) bp; bp += 4; GLuint * v = (GLuint *) bp; bp += 16; weglVertexAttrib4Nuiv(*index,v); }; break; -case 5489: { // glVertexAttrib4Nusv +case 5509: { // glVertexAttrib4Nusv GLuint *index = (GLuint *) bp; bp += 4; GLushort * v = (GLushort *) bp; bp += 8; weglVertexAttrib4Nusv(*index,v); }; break; -case 5490: { // glVertexAttrib4bv +case 5510: { // glVertexAttrib4bv GLuint *index = (GLuint *) bp; bp += 4; GLbyte * v = (GLbyte *) bp; bp += 4; weglVertexAttrib4bv(*index,v); }; break; -case 5491: { // glVertexAttrib4dv +case 5511: { // glVertexAttrib4dv GLuint *index = (GLuint *) bp; bp += 4; bp += 4; GLdouble * v = (GLdouble *) bp; bp += 32; weglVertexAttrib4dv(*index,v); }; break; -case 5492: { // glVertexAttrib4fv +case 5512: { // glVertexAttrib4fv GLuint *index = (GLuint *) bp; bp += 4; GLfloat * v = (GLfloat *) bp; bp += 16; weglVertexAttrib4fv(*index,v); }; break; -case 5493: { // glVertexAttrib4iv +case 5513: { // glVertexAttrib4iv GLuint *index = (GLuint *) bp; bp += 4; GLint * v = (GLint *) bp; bp += 16; weglVertexAttrib4iv(*index,v); }; break; -case 5494: { // glVertexAttrib4sv +case 5514: { // glVertexAttrib4sv GLuint *index = (GLuint *) bp; bp += 4; GLshort * v = (GLshort *) bp; bp += 8; weglVertexAttrib4sv(*index,v); }; break; -case 5495: { // glVertexAttrib4ubv +case 5515: { // glVertexAttrib4ubv GLuint *index = (GLuint *) bp; bp += 4; GLubyte * v = (GLubyte *) bp; bp += 4; weglVertexAttrib4ubv(*index,v); }; break; -case 5496: { // glVertexAttrib4uiv +case 5516: { // glVertexAttrib4uiv GLuint *index = (GLuint *) bp; bp += 4; GLuint * v = (GLuint *) bp; bp += 16; weglVertexAttrib4uiv(*index,v); }; break; -case 5497: { // glVertexAttrib4usv +case 5517: { // glVertexAttrib4usv GLuint *index = (GLuint *) bp; bp += 4; GLushort * v = (GLushort *) bp; bp += 8; weglVertexAttrib4usv(*index,v); }; break; -case 5498: { // glVertexAttribPointer +case 5518: { // glVertexAttribPointer GLuint *index = (GLuint *) bp; bp += 4; GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; @@ -3838,7 +3935,7 @@ GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; weglVertexAttribPointer(*index,*size,*type,*normalized,*stride,pointer); }; break; -case 5499: { // glVertexAttribPointer +case 5519: { // glVertexAttribPointer GLuint *index = (GLuint *) bp; bp += 4; GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; @@ -3848,7 +3945,7 @@ GLvoid *pointer = (GLvoid *) bins[0]->base; weglVertexAttribPointer(*index,*size,*type,*normalized,*stride,pointer); }; break; -case 5500: { // glUniformMatrix2x3fv +case 5520: { // glUniformMatrix2x3fv GLint *location = (GLint *) bp; bp += 4; GLboolean *transpose = (GLboolean *) bp; bp += 1; bp += 3; @@ -3856,7 +3953,7 @@ GLfloat * value = (GLfloat *) bp; bp += *valueLen*24; weglUniformMatrix2x3fv(*location,*valueLen,*transpose,value); }; break; -case 5501: { // glUniformMatrix3x2fv +case 5521: { // glUniformMatrix3x2fv GLint *location = (GLint *) bp; bp += 4; GLboolean *transpose = (GLboolean *) bp; bp += 1; bp += 3; @@ -3864,7 +3961,7 @@ GLfloat * value = (GLfloat *) bp; bp += *valueLen*24; weglUniformMatrix3x2fv(*location,*valueLen,*transpose,value); }; break; -case 5502: { // glUniformMatrix2x4fv +case 5522: { // glUniformMatrix2x4fv GLint *location = (GLint *) bp; bp += 4; GLboolean *transpose = (GLboolean *) bp; bp += 1; bp += 3; @@ -3872,7 +3969,7 @@ GLfloat * value = (GLfloat *) bp; bp += *valueLen*32; weglUniformMatrix2x4fv(*location,*valueLen,*transpose,value); }; break; -case 5503: { // glUniformMatrix4x2fv +case 5523: { // glUniformMatrix4x2fv GLint *location = (GLint *) bp; bp += 4; GLboolean *transpose = (GLboolean *) bp; bp += 1; bp += 3; @@ -3880,7 +3977,7 @@ GLfloat * value = (GLfloat *) bp; bp += *valueLen*32; weglUniformMatrix4x2fv(*location,*valueLen,*transpose,value); }; break; -case 5504: { // glUniformMatrix3x4fv +case 5524: { // glUniformMatrix3x4fv GLint *location = (GLint *) bp; bp += 4; GLboolean *transpose = (GLboolean *) bp; bp += 1; bp += 3; @@ -3888,7 +3985,7 @@ GLfloat * value = (GLfloat *) bp; bp += *valueLen*48; weglUniformMatrix3x4fv(*location,*valueLen,*transpose,value); }; break; -case 5505: { // glUniformMatrix4x3fv +case 5525: { // glUniformMatrix4x3fv GLint *location = (GLint *) bp; bp += 4; GLboolean *transpose = (GLboolean *) bp; bp += 1; bp += 3; @@ -3896,7 +3993,7 @@ GLfloat * value = (GLfloat *) bp; bp += *valueLen*48; weglUniformMatrix4x3fv(*location,*valueLen,*transpose,value); }; break; -case 5506: { // glColorMaski +case 5526: { // glColorMaski GLuint *index = (GLuint *) bp; bp += 4; GLboolean *r = (GLboolean *) bp; bp += 1; GLboolean *g = (GLboolean *) bp; bp += 1; @@ -3904,7 +4001,7 @@ GLboolean *a = (GLboolean *) bp; bp += 1; weglColorMaski(*index,*r,*g,*b,*a); }; break; -case 5507: { // glGetBooleani_v +case 5527: { // glGetBooleani_v GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLboolean data[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; @@ -3933,7 +4030,7 @@ if (AP != 39 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,39); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5508: { // glGetIntegeri_v +case 5528: { // glGetIntegeri_v GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLint data[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; @@ -3962,17 +4059,17 @@ if (AP != 39 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,39); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5509: { // glEnablei +case 5529: { // glEnablei GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; weglEnablei(*target,*index); }; break; -case 5510: { // glDisablei +case 5530: { // glDisablei GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; weglDisablei(*target,*index); }; break; -case 5511: { // glIsEnabledi +case 5531: { // glIsEnabledi GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLboolean result = weglIsEnabledi(*target,*index); @@ -3983,14 +4080,14 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5512: { // glBeginTransformFeedback +case 5532: { // glBeginTransformFeedback GLenum *primitiveMode = (GLenum *) bp; bp += 4; weglBeginTransformFeedback(*primitiveMode); }; break; -case 5513: { // glEndTransformFeedback +case 5533: { // glEndTransformFeedback weglEndTransformFeedback(); }; break; -case 5514: { // glBindBufferRange +case 5534: { // glBindBufferRange GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLuint *buffer = (GLuint *) bp; bp += 4; @@ -3999,86 +4096,60 @@ GLsizeiptr size = (GLsizeiptr) * (GLuint64EXT *) bp; bp += 8; weglBindBufferRange(*target,*index,*buffer,offset,size); }; break; -case 5515: { // glBindBufferBase +case 5535: { // glBindBufferBase GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLuint *buffer = (GLuint *) bp; bp += 4; weglBindBufferBase(*target,*index,*buffer); }; break; -case 5516: { // glClampColor +case 5536: { // glTransformFeedbackVaryings + GLuint *program = (GLuint *) bp; bp += 4; + int * varyingsLen = (int *) bp; bp += 4; + int * varyingsTotSize = (int *) bp; bp += 4; + GLchar **varyings; + varyings = (GLchar **) driver_alloc(sizeof(GLchar *) * *varyingsLen); + for(int i=0;i<*varyingsLen;i++) { + varyings[i] = (GLchar *) bp; bp += 1+strlen(bp);}; + bp += (8 - ((0 + *varyingsTotSize) % 8)) % 8; + GLenum *bufferMode = (GLenum *) bp; bp += 4; + weglTransformFeedbackVaryings(*program,*varyingsLen,(const GLchar **) varyings,*bufferMode); + driver_free(varyings); +}; break; +case 5537: { // glGetTransformFeedbackVarying + GLuint *program = (GLuint *) bp; bp += 4; + GLuint *index = (GLuint *) bp; bp += 4; + GLsizei *bufSize = (GLsizei *) bp; bp += 4; + GLsizei length[1] = {0}; + GLsizei size[1] = {0}; + GLenum type[1] = {0}; + GLchar *name; + name = (GLchar *) driver_alloc(sizeof(GLchar) * *bufSize); + weglGetTransformFeedbackVarying(*program,*index,*bufSize,length,size,type,name); + int AP = 0; ErlDrvTermData rt[13]; + rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); + rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *size; + rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *type; + rt[AP++] = ERL_DRV_STRING; rt[AP++] = (ErlDrvTermData) name; rt[AP++] = *length; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 3; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; + if (AP != 13 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,13); + driver_send_term(WXE_DRV_PORT,caller,rt,AP); + driver_free(name); +}; break; +case 5538: { // glClampColor GLenum *target = (GLenum *) bp; bp += 4; GLenum *clamp = (GLenum *) bp; bp += 4; weglClampColor(*target,*clamp); }; break; -case 5517: { // glBeginConditionalRender +case 5539: { // glBeginConditionalRender GLuint *id = (GLuint *) bp; bp += 4; GLenum *mode = (GLenum *) bp; bp += 4; weglBeginConditionalRender(*id,*mode); }; break; -case 5518: { // glEndConditionalRender +case 5540: { // glEndConditionalRender weglEndConditionalRender(); }; break; -case 5519: { // glVertexAttribI1iv - GLuint *index = (GLuint *) bp; bp += 4; - GLint *v = (GLint *) bp; bp += 4; - weglVertexAttribI1iv(*index,v); -}; break; -case 5520: { // glVertexAttribI2iv - GLuint *index = (GLuint *) bp; bp += 4; - GLint *v = (GLint *) bp; bp += 4; - weglVertexAttribI2iv(*index,v); -}; break; -case 5521: { // glVertexAttribI3iv - GLuint *index = (GLuint *) bp; bp += 4; - GLint *v = (GLint *) bp; bp += 4; - weglVertexAttribI3iv(*index,v); -}; break; -case 5522: { // glVertexAttribI4iv - GLuint *index = (GLuint *) bp; bp += 4; - GLint * v = (GLint *) bp; bp += 16; - weglVertexAttribI4iv(*index,v); -}; break; -case 5523: { // glVertexAttribI1uiv - GLuint *index = (GLuint *) bp; bp += 4; - GLuint *v = (GLuint *) bp; bp += 4; - weglVertexAttribI1uiv(*index,v); -}; break; -case 5524: { // glVertexAttribI2uiv - GLuint *index = (GLuint *) bp; bp += 4; - GLuint *v = (GLuint *) bp; bp += 4; - weglVertexAttribI2uiv(*index,v); -}; break; -case 5525: { // glVertexAttribI3uiv - GLuint *index = (GLuint *) bp; bp += 4; - GLuint *v = (GLuint *) bp; bp += 4; - weglVertexAttribI3uiv(*index,v); -}; break; -case 5526: { // glVertexAttribI4uiv - GLuint *index = (GLuint *) bp; bp += 4; - GLuint * v = (GLuint *) bp; bp += 16; - weglVertexAttribI4uiv(*index,v); -}; break; -case 5527: { // glVertexAttribI4bv - GLuint *index = (GLuint *) bp; bp += 4; - GLbyte * v = (GLbyte *) bp; bp += 4; - weglVertexAttribI4bv(*index,v); -}; break; -case 5528: { // glVertexAttribI4sv - GLuint *index = (GLuint *) bp; bp += 4; - GLshort * v = (GLshort *) bp; bp += 8; - weglVertexAttribI4sv(*index,v); -}; break; -case 5529: { // glVertexAttribI4ubv - GLuint *index = (GLuint *) bp; bp += 4; - GLubyte * v = (GLubyte *) bp; bp += 4; - weglVertexAttribI4ubv(*index,v); -}; break; -case 5530: { // glVertexAttribI4usv - GLuint *index = (GLuint *) bp; bp += 4; - GLushort * v = (GLushort *) bp; bp += 8; - weglVertexAttribI4usv(*index,v); -}; break; -case 5531: { // glVertexAttribIPointer +case 5541: { // glVertexAttribIPointer GLuint *index = (GLuint *) bp; bp += 4; GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; @@ -4086,7 +4157,7 @@ GLvoid *pointer = (GLvoid *) * (int *) bp; bp += 4; weglVertexAttribIPointer(*index,*size,*type,*stride,pointer); }; break; -case 5532: { // glVertexAttribIPointer +case 5542: { // glVertexAttribIPointer GLuint *index = (GLuint *) bp; bp += 4; GLint *size = (GLint *) bp; bp += 4; GLenum *type = (GLenum *) bp; bp += 4; @@ -4094,7 +4165,7 @@ GLvoid *pointer = (GLvoid *) bins[0]->base; weglVertexAttribIPointer(*index,*size,*type,*stride,pointer); }; break; -case 5533: { // glGetVertexAttribIiv +case 5543: { // glGetVertexAttribIiv GLuint *index = (GLuint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[4] = {0,0,0,0}; @@ -4111,7 +4182,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5534: { // glGetVertexAttribIuiv +case 5544: { // glGetVertexAttribIuiv GLuint *index = (GLuint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLuint params[4] = {0,0,0,0}; @@ -4128,7 +4199,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5535: { // glGetUniformuiv +case 5545: { // glGetUniformuiv GLuint *program = (GLuint *) bp; bp += 4; GLint *location = (GLint *) bp; bp += 4; GLuint params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; @@ -4157,14 +4228,14 @@ if (AP != 38 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,38); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5536: { // glBindFragDataLocation +case 5546: { // glBindFragDataLocation GLuint *program = (GLuint *) bp; bp += 4; GLuint *color = (GLuint *) bp; bp += 4; GLchar *name = (GLchar *) bp; int nameLen = strlen((char *)name); bp += nameLen+1+((8-((1+nameLen+0)%8))%8); weglBindFragDataLocation(*program,*color,name); }; break; -case 5537: { // glGetFragDataLocation +case 5547: { // glGetFragDataLocation GLuint *program = (GLuint *) bp; bp += 4; GLchar *name = (GLchar *) bp; int nameLen = strlen((char *)name); bp += nameLen+1+((8-((1+nameLen+4)%8))%8); @@ -4176,25 +4247,25 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5538: { // glUniform1ui +case 5548: { // glUniform1ui GLint *location = (GLint *) bp; bp += 4; GLuint *v0 = (GLuint *) bp; bp += 4; weglUniform1ui(*location,*v0); }; break; -case 5539: { // glUniform2ui +case 5549: { // glUniform2ui GLint *location = (GLint *) bp; bp += 4; GLuint *v0 = (GLuint *) bp; bp += 4; GLuint *v1 = (GLuint *) bp; bp += 4; weglUniform2ui(*location,*v0,*v1); }; break; -case 5540: { // glUniform3ui +case 5550: { // glUniform3ui GLint *location = (GLint *) bp; bp += 4; GLuint *v0 = (GLuint *) bp; bp += 4; GLuint *v1 = (GLuint *) bp; bp += 4; GLuint *v2 = (GLuint *) bp; bp += 4; weglUniform3ui(*location,*v0,*v1,*v2); }; break; -case 5541: { // glUniform4ui +case 5551: { // glUniform4ui GLint *location = (GLint *) bp; bp += 4; GLuint *v0 = (GLuint *) bp; bp += 4; GLuint *v1 = (GLuint *) bp; bp += 4; @@ -4202,45 +4273,45 @@ GLuint *v3 = (GLuint *) bp; bp += 4; weglUniform4ui(*location,*v0,*v1,*v2,*v3); }; break; -case 5542: { // glUniform1uiv +case 5552: { // glUniform1uiv GLint *location = (GLint *) bp; bp += 4; int * valueLen = (int *) bp; bp += 4; GLuint * value = (GLuint *) bp; bp += (8-((*valueLen*4+0)%8))%8; weglUniform1uiv(*location,*valueLen,value); }; break; -case 5543: { // glUniform2uiv +case 5553: { // glUniform2uiv GLint *location = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLuint * value = (GLuint *) bp; bp += *valueLen*8; weglUniform2uiv(*location,*valueLen,value); }; break; -case 5544: { // glUniform3uiv +case 5554: { // glUniform3uiv GLint *location = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLuint * value = (GLuint *) bp; bp += *valueLen*12; weglUniform3uiv(*location,*valueLen,value); }; break; -case 5545: { // glUniform4uiv +case 5555: { // glUniform4uiv GLint *location = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLuint * value = (GLuint *) bp; bp += *valueLen*16; weglUniform4uiv(*location,*valueLen,value); }; break; -case 5546: { // glTexParameterIiv +case 5556: { // glTexParameterIiv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglTexParameterIiv(*target,*pname,params); }; break; -case 5547: { // glTexParameterIuiv +case 5557: { // glTexParameterIuiv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; int *paramsLen = (int *) bp; bp += 4; GLuint *params = (GLuint *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4; weglTexParameterIuiv(*target,*pname,params); }; break; -case 5548: { // glGetTexParameterIiv +case 5558: { // glGetTexParameterIiv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[4] = {0,0,0,0}; @@ -4257,7 +4328,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5549: { // glGetTexParameterIuiv +case 5559: { // glGetTexParameterIuiv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLuint params[4] = {0,0,0,0}; @@ -4274,35 +4345,35 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5550: { // glClearBufferiv +case 5560: { // glClearBufferiv GLenum *buffer = (GLenum *) bp; bp += 4; GLint *drawbuffer = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLint *value = (GLint *) bp; bp += *valueLen*4+((*valueLen)+1)%2*4; weglClearBufferiv(*buffer,*drawbuffer,value); }; break; -case 5551: { // glClearBufferuiv +case 5561: { // glClearBufferuiv GLenum *buffer = (GLenum *) bp; bp += 4; GLint *drawbuffer = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLuint *value = (GLuint *) bp; bp += *valueLen*4+((*valueLen)+1)%2*4; weglClearBufferuiv(*buffer,*drawbuffer,value); }; break; -case 5552: { // glClearBufferfv +case 5562: { // glClearBufferfv GLenum *buffer = (GLenum *) bp; bp += 4; GLint *drawbuffer = (GLint *) bp; bp += 4; int *valueLen = (int *) bp; bp += 4; GLfloat *value = (GLfloat *) bp; bp += *valueLen*4+((*valueLen)+1)%2*4; weglClearBufferfv(*buffer,*drawbuffer,value); }; break; -case 5553: { // glClearBufferfi +case 5563: { // glClearBufferfi GLenum *buffer = (GLenum *) bp; bp += 4; GLint *drawbuffer = (GLint *) bp; bp += 4; GLfloat *depth = (GLfloat *) bp; bp += 4; GLint *stencil = (GLint *) bp; bp += 4; weglClearBufferfi(*buffer,*drawbuffer,*depth,*stencil); }; break; -case 5554: { // glGetStringi +case 5564: { // glGetStringi GLenum *name = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; const GLubyte * result = weglGetStringi(*name,*index); @@ -4313,87 +4384,196 @@ if (AP != 7 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,7); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5555: { // glWeightbvARB +case 5565: { // glVertexAttribI1iv + GLuint *index = (GLuint *) bp; bp += 4; + GLint *v = (GLint *) bp; bp += 4; + weglVertexAttribI1iv(*index,v); +}; break; +case 5566: { // glVertexAttribI2iv + GLuint *index = (GLuint *) bp; bp += 4; + GLint *v = (GLint *) bp; bp += 4; + weglVertexAttribI2iv(*index,v); +}; break; +case 5567: { // glVertexAttribI3iv + GLuint *index = (GLuint *) bp; bp += 4; + GLint *v = (GLint *) bp; bp += 4; + weglVertexAttribI3iv(*index,v); +}; break; +case 5568: { // glVertexAttribI4iv + GLuint *index = (GLuint *) bp; bp += 4; + GLint * v = (GLint *) bp; bp += 16; + weglVertexAttribI4iv(*index,v); +}; break; +case 5569: { // glVertexAttribI1uiv + GLuint *index = (GLuint *) bp; bp += 4; + GLuint *v = (GLuint *) bp; bp += 4; + weglVertexAttribI1uiv(*index,v); +}; break; +case 5570: { // glVertexAttribI2uiv + GLuint *index = (GLuint *) bp; bp += 4; + GLuint *v = (GLuint *) bp; bp += 4; + weglVertexAttribI2uiv(*index,v); +}; break; +case 5571: { // glVertexAttribI3uiv + GLuint *index = (GLuint *) bp; bp += 4; + GLuint *v = (GLuint *) bp; bp += 4; + weglVertexAttribI3uiv(*index,v); +}; break; +case 5572: { // glVertexAttribI4uiv + GLuint *index = (GLuint *) bp; bp += 4; + GLuint * v = (GLuint *) bp; bp += 16; + weglVertexAttribI4uiv(*index,v); +}; break; +case 5573: { // glVertexAttribI4bv + GLuint *index = (GLuint *) bp; bp += 4; + GLbyte * v = (GLbyte *) bp; bp += 4; + weglVertexAttribI4bv(*index,v); +}; break; +case 5574: { // glVertexAttribI4sv + GLuint *index = (GLuint *) bp; bp += 4; + GLshort * v = (GLshort *) bp; bp += 8; + weglVertexAttribI4sv(*index,v); +}; break; +case 5575: { // glVertexAttribI4ubv + GLuint *index = (GLuint *) bp; bp += 4; + GLubyte * v = (GLubyte *) bp; bp += 4; + weglVertexAttribI4ubv(*index,v); +}; break; +case 5576: { // glVertexAttribI4usv + GLuint *index = (GLuint *) bp; bp += 4; + GLushort * v = (GLushort *) bp; bp += 8; + weglVertexAttribI4usv(*index,v); +}; break; +case 5577: { // glDrawArraysInstanced + GLenum *mode = (GLenum *) bp; bp += 4; + GLint *first = (GLint *) bp; bp += 4; + GLsizei *count = (GLsizei *) bp; bp += 4; + GLsizei *primcount = (GLsizei *) bp; bp += 4; + weglDrawArraysInstanced(*mode,*first,*count,*primcount); +}; break; +case 5578: { // glDrawElementsInstanced + GLenum *mode = (GLenum *) bp; bp += 4; + GLsizei *count = (GLsizei *) bp; bp += 4; + GLenum *type = (GLenum *) bp; bp += 4; + GLvoid *indices = (GLvoid *) * (int *) bp; bp += 4; + GLsizei *primcount = (GLsizei *) bp; bp += 4; + weglDrawElementsInstanced(*mode,*count,*type,indices,*primcount); +}; break; +case 5579: { // glDrawElementsInstanced + GLenum *mode = (GLenum *) bp; bp += 4; + GLsizei *count = (GLsizei *) bp; bp += 4; + GLenum *type = (GLenum *) bp; bp += 4; + GLvoid *indices = (GLvoid *) bins[0]->base; + GLsizei *primcount = (GLsizei *) bp; bp += 4; + weglDrawElementsInstanced(*mode,*count,*type,indices,*primcount); +}; break; +case 5580: { // glTexBuffer + GLenum *target = (GLenum *) bp; bp += 4; + GLenum *internalformat = (GLenum *) bp; bp += 4; + GLuint *buffer = (GLuint *) bp; bp += 4; + weglTexBuffer(*target,*internalformat,*buffer); +}; break; +case 5581: { // glPrimitiveRestartIndex + GLuint *index = (GLuint *) bp; bp += 4; + weglPrimitiveRestartIndex(*index); +}; break; +case 5582: { // glLoadTransposeMatrixfARB + GLfloat * m = (GLfloat *) bp; bp += 64; + weglLoadTransposeMatrixfARB(m); +}; break; +case 5583: { // glLoadTransposeMatrixdARB + GLdouble * m = (GLdouble *) bp; bp += 128; + weglLoadTransposeMatrixdARB(m); +}; break; +case 5584: { // glMultTransposeMatrixfARB + GLfloat * m = (GLfloat *) bp; bp += 64; + weglMultTransposeMatrixfARB(m); +}; break; +case 5585: { // glMultTransposeMatrixdARB + GLdouble * m = (GLdouble *) bp; bp += 128; + weglMultTransposeMatrixdARB(m); +}; break; +case 5586: { // glWeightbvARB int * weightsLen = (int *) bp; bp += 4; GLbyte * weights = (GLbyte *) bp; bp += (8-((*weightsLen*1+4)%8))%8; weglWeightbvARB(*weightsLen,weights); }; break; -case 5556: { // glWeightsvARB +case 5587: { // glWeightsvARB int * weightsLen = (int *) bp; bp += 4; GLshort * weights = (GLshort *) bp; bp += (8-((*weightsLen*2+4)%8))%8; weglWeightsvARB(*weightsLen,weights); }; break; -case 5557: { // glWeightivARB +case 5588: { // glWeightivARB int * weightsLen = (int *) bp; bp += 4; GLint * weights = (GLint *) bp; bp += (8-((*weightsLen*4+4)%8))%8; weglWeightivARB(*weightsLen,weights); }; break; -case 5558: { // glWeightfvARB +case 5589: { // glWeightfvARB int * weightsLen = (int *) bp; bp += 4; GLfloat * weights = (GLfloat *) bp; bp += (8-((*weightsLen*4+4)%8))%8; weglWeightfvARB(*weightsLen,weights); }; break; -case 5559: { // glWeightdvARB +case 5590: { // glWeightdvARB int * weightsLen = (int *) bp; bp += 8; GLdouble * weights = (GLdouble *) bp; bp += (8-((*weightsLen*8+0)%8))%8; weglWeightdvARB(*weightsLen,weights); }; break; -case 5560: { // glWeightubvARB +case 5591: { // glWeightubvARB int * weightsLen = (int *) bp; bp += 4; GLubyte * weights = (GLubyte *) bp; bp += (8-((*weightsLen*1+4)%8))%8; weglWeightubvARB(*weightsLen,weights); }; break; -case 5561: { // glWeightusvARB +case 5592: { // glWeightusvARB int * weightsLen = (int *) bp; bp += 4; GLushort * weights = (GLushort *) bp; bp += (8-((*weightsLen*2+4)%8))%8; weglWeightusvARB(*weightsLen,weights); }; break; -case 5562: { // glWeightuivARB +case 5593: { // glWeightuivARB int * weightsLen = (int *) bp; bp += 4; GLuint * weights = (GLuint *) bp; bp += (8-((*weightsLen*4+4)%8))%8; weglWeightuivARB(*weightsLen,weights); }; break; -case 5563: { // glVertexBlendARB +case 5594: { // glVertexBlendARB GLint *count = (GLint *) bp; bp += 4; weglVertexBlendARB(*count); }; break; -case 5564: { // glCurrentPaletteMatrixARB +case 5595: { // glCurrentPaletteMatrixARB GLint *index = (GLint *) bp; bp += 4; weglCurrentPaletteMatrixARB(*index); }; break; -case 5565: { // glMatrixIndexubvARB +case 5596: { // glMatrixIndexubvARB int * indicesLen = (int *) bp; bp += 4; GLubyte * indices = (GLubyte *) bp; bp += (8-((*indicesLen*1+4)%8))%8; weglMatrixIndexubvARB(*indicesLen,indices); }; break; -case 5566: { // glMatrixIndexusvARB +case 5597: { // glMatrixIndexusvARB int * indicesLen = (int *) bp; bp += 4; GLushort * indices = (GLushort *) bp; bp += (8-((*indicesLen*2+4)%8))%8; weglMatrixIndexusvARB(*indicesLen,indices); }; break; -case 5567: { // glMatrixIndexuivARB +case 5598: { // glMatrixIndexuivARB int * indicesLen = (int *) bp; bp += 4; GLuint * indices = (GLuint *) bp; bp += (8-((*indicesLen*4+4)%8))%8; weglMatrixIndexuivARB(*indicesLen,indices); }; break; -case 5568: { // glProgramStringARB +case 5599: { // glProgramStringARB GLenum *target = (GLenum *) bp; bp += 4; GLenum *format = (GLenum *) bp; bp += 4; GLvoid *string = (GLvoid *) bp; int stringLen = strlen((char *)string); bp += stringLen+1+((8-((1+stringLen+0)%8))%8); weglProgramStringARB(*target,*format,stringLen,string); }; break; -case 5569: { // glBindProgramARB +case 5600: { // glBindProgramARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *program = (GLuint *) bp; bp += 4; weglBindProgramARB(*target,*program); }; break; -case 5570: { // glDeleteProgramsARB +case 5601: { // glDeleteProgramsARB int * programsLen = (int *) bp; bp += 4; GLuint * programs = (GLuint *) bp; bp += (8-((*programsLen*4+4)%8))%8; weglDeleteProgramsARB(*programsLen,programs); }; break; -case 5571: { // glGenProgramsARB +case 5602: { // glGenProgramsARB GLsizei *n = (GLsizei *) bp; bp += 4; GLuint *programs; programs = (GLuint *) driver_alloc(sizeof(GLuint) * *n); @@ -4410,7 +4590,7 @@ driver_free(rt); driver_free(programs); }; break; -case 5572: { // glProgramEnvParameter4dARB +case 5603: { // glProgramEnvParameter4dARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLdouble *x = (GLdouble *) bp; bp += 8; @@ -4419,13 +4599,13 @@ GLdouble *w = (GLdouble *) bp; bp += 8; weglProgramEnvParameter4dARB(*target,*index,*x,*y,*z,*w); }; break; -case 5573: { // glProgramEnvParameter4dvARB +case 5604: { // glProgramEnvParameter4dvARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLdouble * params = (GLdouble *) bp; bp += 32; weglProgramEnvParameter4dvARB(*target,*index,params); }; break; -case 5574: { // glProgramEnvParameter4fARB +case 5605: { // glProgramEnvParameter4fARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLfloat *x = (GLfloat *) bp; bp += 4; @@ -4434,13 +4614,13 @@ GLfloat *w = (GLfloat *) bp; bp += 4; weglProgramEnvParameter4fARB(*target,*index,*x,*y,*z,*w); }; break; -case 5575: { // glProgramEnvParameter4fvARB +case 5606: { // glProgramEnvParameter4fvARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLfloat * params = (GLfloat *) bp; bp += 16; weglProgramEnvParameter4fvARB(*target,*index,params); }; break; -case 5576: { // glProgramLocalParameter4dARB +case 5607: { // glProgramLocalParameter4dARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLdouble *x = (GLdouble *) bp; bp += 8; @@ -4449,13 +4629,13 @@ GLdouble *w = (GLdouble *) bp; bp += 8; weglProgramLocalParameter4dARB(*target,*index,*x,*y,*z,*w); }; break; -case 5577: { // glProgramLocalParameter4dvARB +case 5608: { // glProgramLocalParameter4dvARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLdouble * params = (GLdouble *) bp; bp += 32; weglProgramLocalParameter4dvARB(*target,*index,params); }; break; -case 5578: { // glProgramLocalParameter4fARB +case 5609: { // glProgramLocalParameter4fARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLfloat *x = (GLfloat *) bp; bp += 4; @@ -4464,13 +4644,13 @@ GLfloat *w = (GLfloat *) bp; bp += 4; weglProgramLocalParameter4fARB(*target,*index,*x,*y,*z,*w); }; break; -case 5579: { // glProgramLocalParameter4fvARB +case 5610: { // glProgramLocalParameter4fvARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLfloat * params = (GLfloat *) bp; bp += 16; weglProgramLocalParameter4fvARB(*target,*index,params); }; break; -case 5580: { // glGetProgramEnvParameterdvARB +case 5611: { // glGetProgramEnvParameterdvARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLdouble params[4] = {0.0,0.0,0.0,0.0}; @@ -4487,7 +4667,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5581: { // glGetProgramEnvParameterfvARB +case 5612: { // glGetProgramEnvParameterfvARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLfloat params[4] = {0.0,0.0,0.0,0.0}; @@ -4505,7 +4685,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5582: { // glGetProgramLocalParameterdvARB +case 5613: { // glGetProgramLocalParameterdvARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLdouble params[4] = {0.0,0.0,0.0,0.0}; @@ -4522,7 +4702,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5583: { // glGetProgramLocalParameterfvARB +case 5614: { // glGetProgramLocalParameterfvARB GLenum *target = (GLenum *) bp; bp += 4; GLuint *index = (GLuint *) bp; bp += 4; GLfloat params[4] = {0.0,0.0,0.0,0.0}; @@ -4540,7 +4720,7 @@ if (AP != 14 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,14); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5584: { // glGetProgramStringARB +case 5615: { // glGetProgramStringARB GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLvoid *string = (GLvoid *) bins[0]->base; @@ -4551,11 +4731,11 @@ rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5585: { // glDeleteObjectARB +case 5616: { // glDeleteObjectARB GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; weglDeleteObjectARB(obj); }; break; -case 5586: { // glGetHandleARB +case 5617: { // glGetHandleARB GLenum *pname = (GLenum *) bp; bp += 4; GLhandleARB result = weglGetHandleARB(*pname); int AP = 0; ErlDrvTermData rt[6]; @@ -4565,12 +4745,12 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5587: { // glDetachObjectARB +case 5618: { // glDetachObjectARB GLhandleARB containerObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLhandleARB attachedObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; weglDetachObjectARB(containerObj,attachedObj); }; break; -case 5588: { // glCreateShaderObjectARB +case 5619: { // glCreateShaderObjectARB GLenum *shaderType = (GLenum *) bp; bp += 4; GLhandleARB result = weglCreateShaderObjectARB(*shaderType); int AP = 0; ErlDrvTermData rt[6]; @@ -4580,7 +4760,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5589: { // glShaderSourceARB +case 5620: { // glShaderSourceARB GLhandleARB shaderObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; int * stringLen = (int *) bp; bp += 4; int * stringTotSize = (int *) bp; bp += 4; @@ -4592,11 +4772,11 @@ weglShaderSourceARB(shaderObj,*stringLen,(const GLchar **) string,NULL); driver_free(string); }; break; -case 5590: { // glCompileShaderARB +case 5621: { // glCompileShaderARB GLhandleARB shaderObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; weglCompileShaderARB(shaderObj); }; break; -case 5591: { // glCreateProgramObjectARB +case 5622: { // glCreateProgramObjectARB GLhandleARB result = weglCreateProgramObjectARB(); int AP = 0; ErlDrvTermData rt[6]; rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); @@ -4605,24 +4785,24 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5592: { // glAttachObjectARB +case 5623: { // glAttachObjectARB GLhandleARB containerObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; weglAttachObjectARB(containerObj,obj); }; break; -case 5593: { // glLinkProgramARB +case 5624: { // glLinkProgramARB GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; weglLinkProgramARB(programObj); }; break; -case 5594: { // glUseProgramObjectARB +case 5625: { // glUseProgramObjectARB GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; weglUseProgramObjectARB(programObj); }; break; -case 5595: { // glValidateProgramARB +case 5626: { // glValidateProgramARB GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; weglValidateProgramARB(programObj); }; break; -case 5596: { // glGetObjectParameterfvARB +case 5627: { // glGetObjectParameterfvARB GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLenum *pname = (GLenum *) bp; bp += 4; GLfloat params[1] = {0.0}; @@ -4635,7 +4815,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5597: { // glGetObjectParameterivARB +case 5628: { // glGetObjectParameterivARB GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[1] = {0}; @@ -4647,7 +4827,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5598: { // glGetInfoLogARB +case 5629: { // glGetInfoLogARB GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLsizei *maxLength = (GLsizei *) bp; bp += 4; GLsizei length[1] = {0}; @@ -4662,7 +4842,7 @@ driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free(infoLog); }; break; -case 5599: { // glGetAttachedObjectsARB +case 5630: { // glGetAttachedObjectsARB GLhandleARB containerObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLsizei *maxCount = (GLsizei *) bp; bp += 4; GLsizei count[1] = {0}; @@ -4681,7 +4861,7 @@ driver_free(rt); driver_free(obj); }; break; -case 5600: { // glGetUniformLocationARB +case 5631: { // glGetUniformLocationARB GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLchar *name = (GLchar *) bp; int nameLen = strlen((char *)name); bp += nameLen+1+((8-((1+nameLen+0)%8))%8); @@ -4693,7 +4873,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5601: { // glGetActiveUniformARB +case 5632: { // glGetActiveUniformARB GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLuint *index = (GLuint *) bp; bp += 4; GLsizei *maxLength = (GLsizei *) bp; bp += 4; @@ -4703,17 +4883,18 @@ GLchar *name; name = (GLchar *) driver_alloc(sizeof(GLchar) * *maxLength); weglGetActiveUniformARB(programObj,*index,*maxLength,length,size,type,name); - int AP = 0; ErlDrvTermData rt[11]; + int AP = 0; ErlDrvTermData rt[13]; rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *size; rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *type; rt[AP++] = ERL_DRV_STRING; rt[AP++] = (ErlDrvTermData) name; rt[AP++] = *length; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 3; rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; - if (AP != 11 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,11); + if (AP != 13 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,13); driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free(name); }; break; -case 5602: { // glGetUniformfvARB +case 5633: { // glGetUniformfvARB GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLint *location = (GLint *) bp; bp += 4; GLfloat params[16] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; @@ -4743,7 +4924,7 @@ if (AP != 38 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,38); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5603: { // glGetUniformivARB +case 5634: { // glGetUniformivARB GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLint *location = (GLint *) bp; bp += 4; GLint params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; @@ -4772,7 +4953,7 @@ if (AP != 38 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,38); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5604: { // glGetShaderSourceARB +case 5635: { // glGetShaderSourceARB GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLsizei *maxLength = (GLsizei *) bp; bp += 4; GLsizei length[1] = {0}; @@ -4787,14 +4968,14 @@ driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free(source); }; break; -case 5605: { // glBindAttribLocationARB +case 5636: { // glBindAttribLocationARB GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLuint *index = (GLuint *) bp; bp += 4; GLchar *name = (GLchar *) bp; int nameLen = strlen((char *)name); bp += nameLen+1+((8-((1+nameLen+4)%8))%8); weglBindAttribLocationARB(programObj,*index,name); }; break; -case 5606: { // glGetActiveAttribARB +case 5637: { // glGetActiveAttribARB GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLuint *index = (GLuint *) bp; bp += 4; GLsizei *maxLength = (GLsizei *) bp; bp += 4; @@ -4804,17 +4985,18 @@ GLchar *name; name = (GLchar *) driver_alloc(sizeof(GLchar) * *maxLength); weglGetActiveAttribARB(programObj,*index,*maxLength,length,size,type,name); - int AP = 0; ErlDrvTermData rt[11]; + int AP = 0; ErlDrvTermData rt[13]; rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *size; rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) *type; rt[AP++] = ERL_DRV_STRING; rt[AP++] = (ErlDrvTermData) name; rt[AP++] = *length; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 3; rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; - if (AP != 11 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,11); + if (AP != 13 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,13); driver_send_term(WXE_DRV_PORT,caller,rt,AP); driver_free(name); }; break; -case 5607: { // glGetAttribLocationARB +case 5638: { // glGetAttribLocationARB GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8; GLchar *name = (GLchar *) bp; int nameLen = strlen((char *)name); bp += nameLen+1+((8-((1+nameLen+0)%8))%8); @@ -4826,30 +5008,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5608: { // glDrawArraysInstancedARB - GLenum *mode = (GLenum *) bp; bp += 4; - GLint *first = (GLint *) bp; bp += 4; - GLsizei *count = (GLsizei *) bp; bp += 4; - GLsizei *primcount = (GLsizei *) bp; bp += 4; - weglDrawArraysInstancedARB(*mode,*first,*count,*primcount); -}; break; -case 5609: { // glDrawElementsInstancedARB - GLenum *mode = (GLenum *) bp; bp += 4; - GLsizei *count = (GLsizei *) bp; bp += 4; - GLenum *type = (GLenum *) bp; bp += 4; - GLvoid *indices = (GLvoid *) * (int *) bp; bp += 4; - GLsizei *primcount = (GLsizei *) bp; bp += 4; - weglDrawElementsInstancedARB(*mode,*count,*type,indices,*primcount); -}; break; -case 5610: { // glDrawElementsInstancedARB - GLenum *mode = (GLenum *) bp; bp += 4; - GLsizei *count = (GLsizei *) bp; bp += 4; - GLenum *type = (GLenum *) bp; bp += 4; - GLvoid *indices = (GLvoid *) bins[0]->base; - GLsizei *primcount = (GLsizei *) bp; bp += 4; - weglDrawElementsInstancedARB(*mode,*count,*type,indices,*primcount); -}; break; -case 5611: { // glIsRenderbuffer +case 5639: { // glIsRenderbuffer GLuint *renderbuffer = (GLuint *) bp; bp += 4; GLboolean result = weglIsRenderbuffer(*renderbuffer); int AP = 0; ErlDrvTermData rt[6]; @@ -4859,17 +5018,17 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5612: { // glBindRenderbuffer +case 5640: { // glBindRenderbuffer GLenum *target = (GLenum *) bp; bp += 4; GLuint *renderbuffer = (GLuint *) bp; bp += 4; weglBindRenderbuffer(*target,*renderbuffer); }; break; -case 5613: { // glDeleteRenderbuffers +case 5641: { // glDeleteRenderbuffers int * renderbuffersLen = (int *) bp; bp += 4; GLuint * renderbuffers = (GLuint *) bp; bp += (8-((*renderbuffersLen*4+4)%8))%8; weglDeleteRenderbuffers(*renderbuffersLen,renderbuffers); }; break; -case 5614: { // glGenRenderbuffers +case 5642: { // glGenRenderbuffers GLsizei *n = (GLsizei *) bp; bp += 4; GLuint *renderbuffers; renderbuffers = (GLuint *) driver_alloc(sizeof(GLuint) * *n); @@ -4886,14 +5045,14 @@ driver_free(rt); driver_free(renderbuffers); }; break; -case 5615: { // glRenderbufferStorage +case 5643: { // glRenderbufferStorage GLenum *target = (GLenum *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; GLsizei *width = (GLsizei *) bp; bp += 4; GLsizei *height = (GLsizei *) bp; bp += 4; weglRenderbufferStorage(*target,*internalformat,*width,*height); }; break; -case 5616: { // glGetRenderbufferParameteriv +case 5644: { // glGetRenderbufferParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint params[1] = {0}; @@ -4905,7 +5064,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5617: { // glIsFramebuffer +case 5645: { // glIsFramebuffer GLuint *framebuffer = (GLuint *) bp; bp += 4; GLboolean result = weglIsFramebuffer(*framebuffer); int AP = 0; ErlDrvTermData rt[6]; @@ -4915,17 +5074,17 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5618: { // glBindFramebuffer +case 5646: { // glBindFramebuffer GLenum *target = (GLenum *) bp; bp += 4; GLuint *framebuffer = (GLuint *) bp; bp += 4; weglBindFramebuffer(*target,*framebuffer); }; break; -case 5619: { // glDeleteFramebuffers +case 5647: { // glDeleteFramebuffers int * framebuffersLen = (int *) bp; bp += 4; GLuint * framebuffers = (GLuint *) bp; bp += (8-((*framebuffersLen*4+4)%8))%8; weglDeleteFramebuffers(*framebuffersLen,framebuffers); }; break; -case 5620: { // glGenFramebuffers +case 5648: { // glGenFramebuffers GLsizei *n = (GLsizei *) bp; bp += 4; GLuint *framebuffers; framebuffers = (GLuint *) driver_alloc(sizeof(GLuint) * *n); @@ -4942,7 +5101,7 @@ driver_free(rt); driver_free(framebuffers); }; break; -case 5621: { // glCheckFramebufferStatus +case 5649: { // glCheckFramebufferStatus GLenum *target = (GLenum *) bp; bp += 4; GLenum result = weglCheckFramebufferStatus(*target); int AP = 0; ErlDrvTermData rt[6]; @@ -4952,7 +5111,7 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5622: { // glFramebufferTexture1D +case 5650: { // glFramebufferTexture1D GLenum *target = (GLenum *) bp; bp += 4; GLenum *attachment = (GLenum *) bp; bp += 4; GLenum *textarget = (GLenum *) bp; bp += 4; @@ -4960,7 +5119,7 @@ GLint *level = (GLint *) bp; bp += 4; weglFramebufferTexture1D(*target,*attachment,*textarget,*texture,*level); }; break; -case 5623: { // glFramebufferTexture2D +case 5651: { // glFramebufferTexture2D GLenum *target = (GLenum *) bp; bp += 4; GLenum *attachment = (GLenum *) bp; bp += 4; GLenum *textarget = (GLenum *) bp; bp += 4; @@ -4968,7 +5127,7 @@ GLint *level = (GLint *) bp; bp += 4; weglFramebufferTexture2D(*target,*attachment,*textarget,*texture,*level); }; break; -case 5624: { // glFramebufferTexture3D +case 5652: { // glFramebufferTexture3D GLenum *target = (GLenum *) bp; bp += 4; GLenum *attachment = (GLenum *) bp; bp += 4; GLenum *textarget = (GLenum *) bp; bp += 4; @@ -4977,14 +5136,14 @@ GLint *zoffset = (GLint *) bp; bp += 4; weglFramebufferTexture3D(*target,*attachment,*textarget,*texture,*level,*zoffset); }; break; -case 5625: { // glFramebufferRenderbuffer +case 5653: { // glFramebufferRenderbuffer GLenum *target = (GLenum *) bp; bp += 4; GLenum *attachment = (GLenum *) bp; bp += 4; GLenum *renderbuffertarget = (GLenum *) bp; bp += 4; GLuint *renderbuffer = (GLuint *) bp; bp += 4; weglFramebufferRenderbuffer(*target,*attachment,*renderbuffertarget,*renderbuffer); }; break; -case 5626: { // glGetFramebufferAttachmentParameteriv +case 5654: { // glGetFramebufferAttachmentParameteriv GLenum *target = (GLenum *) bp; bp += 4; GLenum *attachment = (GLenum *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; @@ -4997,11 +5156,11 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5627: { // glGenerateMipmap +case 5655: { // glGenerateMipmap GLenum *target = (GLenum *) bp; bp += 4; weglGenerateMipmap(*target); }; break; -case 5628: { // glBlitFramebuffer +case 5656: { // glBlitFramebuffer GLint *srcX0 = (GLint *) bp; bp += 4; GLint *srcY0 = (GLint *) bp; bp += 4; GLint *srcX1 = (GLint *) bp; bp += 4; @@ -5014,7 +5173,7 @@ GLenum *filter = (GLenum *) bp; bp += 4; weglBlitFramebuffer(*srcX0,*srcY0,*srcX1,*srcY1,*dstX0,*dstY0,*dstX1,*dstY1,*mask,*filter); }; break; -case 5629: { // glRenderbufferStorageMultisample +case 5657: { // glRenderbufferStorageMultisample GLenum *target = (GLenum *) bp; bp += 4; GLsizei *samples = (GLsizei *) bp; bp += 4; GLenum *internalformat = (GLenum *) bp; bp += 4; @@ -5022,7 +5181,7 @@ GLsizei *height = (GLsizei *) bp; bp += 4; weglRenderbufferStorageMultisample(*target,*samples,*internalformat,*width,*height); }; break; -case 5630: { // glFramebufferTextureLayer +case 5658: { // glFramebufferTextureLayer GLenum *target = (GLenum *) bp; bp += 4; GLenum *attachment = (GLenum *) bp; bp += 4; GLuint *texture = (GLuint *) bp; bp += 4; @@ -5030,20 +5189,20 @@ GLint *layer = (GLint *) bp; bp += 4; weglFramebufferTextureLayer(*target,*attachment,*texture,*level,*layer); }; break; -case 5631: { // glProgramParameteriARB +case 5659: { // glProgramParameteriARB GLuint *program = (GLuint *) bp; bp += 4; GLenum *pname = (GLenum *) bp; bp += 4; GLint *value = (GLint *) bp; bp += 4; weglProgramParameteriARB(*program,*pname,*value); }; break; -case 5632: { // glFramebufferTextureARB +case 5660: { // glFramebufferTextureARB GLenum *target = (GLenum *) bp; bp += 4; GLenum *attachment = (GLenum *) bp; bp += 4; GLuint *texture = (GLuint *) bp; bp += 4; GLint *level = (GLint *) bp; bp += 4; weglFramebufferTextureARB(*target,*attachment,*texture,*level); }; break; -case 5633: { // glFramebufferTextureFaceARB +case 5661: { // glFramebufferTextureFaceARB GLenum *target = (GLenum *) bp; bp += 4; GLenum *attachment = (GLenum *) bp; bp += 4; GLuint *texture = (GLuint *) bp; bp += 4; @@ -5051,34 +5210,28 @@ GLenum *face = (GLenum *) bp; bp += 4; weglFramebufferTextureFaceARB(*target,*attachment,*texture,*level,*face); }; break; -case 5634: { // glVertexAttribDivisor +case 5662: { // glVertexAttribDivisorARB GLuint *index = (GLuint *) bp; bp += 4; GLuint *divisor = (GLuint *) bp; bp += 4; - weglVertexAttribDivisor(*index,*divisor); + weglVertexAttribDivisorARB(*index,*divisor); }; break; -case 5635: { // glFlushMappedBufferRange +case 5663: { // glFlushMappedBufferRange GLenum *target = (GLenum *) bp; bp += 4; bp += 4; GLintptr offset = (GLintptr) * (GLuint64EXT *) bp; bp += 8; GLsizeiptr length = (GLsizeiptr) * (GLuint64EXT *) bp; bp += 8; weglFlushMappedBufferRange(*target,offset,length); }; break; -case 5636: { // glTexBufferARB - GLenum *target = (GLenum *) bp; bp += 4; - GLenum *internalformat = (GLenum *) bp; bp += 4; - GLuint *buffer = (GLuint *) bp; bp += 4; - weglTexBufferARB(*target,*internalformat,*buffer); -}; break; -case 5637: { // glBindVertexArray +case 5664: { // glBindVertexArray GLuint *array = (GLuint *) bp; bp += 4; weglBindVertexArray(*array); }; break; -case 5638: { // glDeleteVertexArrays +case 5665: { // glDeleteVertexArrays int * arraysLen = (int *) bp; bp += 4; GLuint * arrays = (GLuint *) bp; bp += (8-((*arraysLen*4+4)%8))%8; weglDeleteVertexArrays(*arraysLen,arrays); }; break; -case 5639: { // glGenVertexArrays +case 5666: { // glGenVertexArrays GLsizei *n = (GLsizei *) bp; bp += 4; GLuint *arrays; arrays = (GLuint *) driver_alloc(sizeof(GLuint) * *n); @@ -5095,7 +5248,7 @@ driver_free(rt); driver_free(arrays); }; break; -case 5640: { // glIsVertexArray +case 5667: { // glIsVertexArray GLuint *array = (GLuint *) bp; bp += 4; GLboolean result = weglIsVertexArray(*array); int AP = 0; ErlDrvTermData rt[6]; @@ -5105,31 +5258,146 @@ if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); driver_send_term(WXE_DRV_PORT,caller,rt,AP); }; break; -case 5641: { // glResizeBuffersMESA +case 5668: { // glGetUniformIndices + GLuint *program = (GLuint *) bp; bp += 4; + int * uniformNamesLen = (int *) bp; bp += 4; + int * uniformNamesTotSize = (int *) bp; bp += 4; + GLchar **uniformNames; + uniformNames = (GLchar **) driver_alloc(sizeof(GLchar *) * *uniformNamesLen); + for(int i=0;i<*uniformNamesLen;i++) { + uniformNames[i] = (GLchar *) bp; bp += 1+strlen(bp);}; + bp += (8 - ((0 + *uniformNamesTotSize) % 8)) % 8; + GLuint *uniformIndices; + uniformIndices = (GLuint *) driver_alloc(sizeof(GLuint) * *uniformNamesLen); + weglGetUniformIndices(*program,*uniformNamesLen,(const GLchar **) uniformNames,uniformIndices); + int AP = 0; ErlDrvTermData *rt; + rt = (ErlDrvTermData *) driver_alloc(sizeof(ErlDrvTermData)*(7 + (*uniformNamesLen)*2)); + rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); + for(int i=0; i < *uniformNamesLen; i++) { + rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) uniformIndices[i];} + rt[AP++] = ERL_DRV_NIL; rt[AP++] = ERL_DRV_LIST; rt[AP++] = (*uniformNamesLen)+1; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; + if (AP != 7 + (*uniformNamesLen)*2 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,7 + (*uniformNamesLen)*2); + driver_send_term(WXE_DRV_PORT,caller,rt,AP); + driver_free(rt); + driver_free(uniformIndices); + driver_free(uniformNames); +}; break; +case 5669: { // glGetActiveUniformsiv + GLuint *program = (GLuint *) bp; bp += 4; + int * uniformIndicesLen = (int *) bp; bp += 4; + GLuint * uniformIndices = (GLuint *) bp; bp += (8-((*uniformIndicesLen*4+0)%8))%8; + GLenum *pname = (GLenum *) bp; bp += 4; + GLint *params; + params = (GLint *) driver_alloc(sizeof(GLint) * *uniformIndicesLen); + weglGetActiveUniformsiv(*program,*uniformIndicesLen,uniformIndices,*pname,params); + int AP = 0; ErlDrvTermData *rt; + rt = (ErlDrvTermData *) driver_alloc(sizeof(ErlDrvTermData)*(7 + (*uniformIndicesLen)*2)); + rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); + for(int i=0; i < *uniformIndicesLen; i++) { + rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) params[i];} + rt[AP++] = ERL_DRV_NIL; rt[AP++] = ERL_DRV_LIST; rt[AP++] = (*uniformIndicesLen)+1; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; + if (AP != 7 + (*uniformIndicesLen)*2 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,7 + (*uniformIndicesLen)*2); + driver_send_term(WXE_DRV_PORT,caller,rt,AP); + driver_free(rt); + driver_free(params); +}; break; +case 5670: { // glGetActiveUniformName + GLuint *program = (GLuint *) bp; bp += 4; + GLuint *uniformIndex = (GLuint *) bp; bp += 4; + GLsizei *bufSize = (GLsizei *) bp; bp += 4; + GLsizei length[1] = {0}; + GLchar *uniformName; + uniformName = (GLchar *) driver_alloc(sizeof(GLchar) * *bufSize); + weglGetActiveUniformName(*program,*uniformIndex,*bufSize,length,uniformName); + int AP = 0; ErlDrvTermData rt[7]; + rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); + rt[AP++] = ERL_DRV_STRING; rt[AP++] = (ErlDrvTermData) uniformName; rt[AP++] = *length; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; + if (AP != 7 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,7); + driver_send_term(WXE_DRV_PORT,caller,rt,AP); + driver_free(uniformName); +}; break; +case 5671: { // glGetUniformBlockIndex + GLuint *program = (GLuint *) bp; bp += 4; + GLchar *uniformBlockName = (GLchar *) bp; + int uniformBlockNameLen = strlen((char *)uniformBlockName); bp += uniformBlockNameLen+1+((8-((1+uniformBlockNameLen+4)%8))%8); + GLuint result = weglGetUniformBlockIndex(*program,uniformBlockName); + int AP = 0; ErlDrvTermData rt[6]; + rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); + rt[AP++] = ERL_DRV_INT; rt[AP++] = (ErlDrvSInt) result; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; + if (AP != 6 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,6); + driver_send_term(WXE_DRV_PORT,caller,rt,AP); +}; break; +case 5672: { // glGetActiveUniformBlockiv + GLuint *program = (GLuint *) bp; bp += 4; + GLuint *uniformBlockIndex = (GLuint *) bp; bp += 4; + GLenum *pname = (GLenum *) bp; bp += 4; + GLint *params = (GLint *) bins[0]->base; + weglGetActiveUniformBlockiv(*program,*uniformBlockIndex,*pname,params); + int AP = 0; ErlDrvTermData rt[6]; + rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); + rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "ok"); + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; + driver_send_term(WXE_DRV_PORT,caller,rt,AP); +}; break; +case 5673: { // glGetActiveUniformBlockName + GLuint *program = (GLuint *) bp; bp += 4; + GLuint *uniformBlockIndex = (GLuint *) bp; bp += 4; + GLsizei *bufSize = (GLsizei *) bp; bp += 4; + GLsizei length[1] = {0}; + GLchar *uniformBlockName; + uniformBlockName = (GLchar *) driver_alloc(sizeof(GLchar) * *bufSize); + weglGetActiveUniformBlockName(*program,*uniformBlockIndex,*bufSize,length,uniformBlockName); + int AP = 0; ErlDrvTermData rt[7]; + rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_wxe_result_"); + rt[AP++] = ERL_DRV_STRING; rt[AP++] = (ErlDrvTermData) uniformBlockName; rt[AP++] = *length; + rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2; + if (AP != 7 ) fprintf(stderr, "%d: ERROR AP mismatch %d %d\r\n",__LINE__,AP,7); + driver_send_term(WXE_DRV_PORT,caller,rt,AP); + driver_free(uniformBlockName); +}; break; +case 5674: { // glUniformBlockBinding + GLuint *program = (GLuint *) bp; bp += 4; + GLuint *uniformBlockIndex = (GLuint *) bp; bp += 4; + GLuint *uniformBlockBinding = (GLuint *) bp; bp += 4; + weglUniformBlockBinding(*program,*uniformBlockIndex,*uniformBlockBinding); +}; break; +case 5675: { // glCopyBufferSubData + GLenum *readTarget = (GLenum *) bp; bp += 4; + GLenum *writeTarget = (GLenum *) bp; bp += 4; + GLintptr readOffset = (GLintptr) * (GLuint64EXT *) bp; bp += 8; + GLintptr writeOffset = (GLintptr) * (GLuint64EXT *) bp; bp += 8; + GLsizeiptr size = (GLsizeiptr) * (GLuint64EXT *) bp; bp += 8; + weglCopyBufferSubData(*readTarget,*writeTarget,readOffset,writeOffset,size); +}; break; +case 5676: { // glResizeBuffersMESA weglResizeBuffersMESA(); }; break; -case 5642: { // glWindowPos4dvMESA +case 5677: { // glWindowPos4dvMESA GLdouble *v = (GLdouble *) bp; bp += 8; weglWindowPos4dvMESA(v); }; break; -case 5643: { // glWindowPos4fvMESA +case 5678: { // glWindowPos4fvMESA GLfloat *v = (GLfloat *) bp; bp += 4; weglWindowPos4fvMESA(v); }; break; -case 5644: { // glWindowPos4ivMESA +case 5679: { // glWindowPos4ivMESA GLint *v = (GLint *) bp; bp += 4; weglWindowPos4ivMESA(v); }; break; -case 5645: { // glWindowPos4svMESA +case 5680: { // glWindowPos4svMESA GLshort *v = (GLshort *) bp; bp += 2; weglWindowPos4svMESA(v); }; break; -case 5646: { // glDepthBoundsEXT +case 5681: { // glDepthBoundsEXT GLclampd *zmin = (GLclampd *) bp; bp += 8; GLclampd *zmax = (GLclampd *) bp; bp += 8; weglDepthBoundsEXT(*zmin,*zmax); }; break; -case 5647: { // glStencilClearTagEXT +case 5682: { // glStencilClearTagEXT GLsizei *stencilTagBits = (GLsizei *) bp; bp += 4; GLuint *stencilClearTag = (GLuint *) bp; bp += 4; weglStencilClearTagEXT(*stencilTagBits,*stencilClearTag); diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/gen/glu_finit.h erlang-13.b.3-dfsg/lib/wx/c_src/gen/glu_finit.h --- erlang-13.b.1-dfsg/lib/wx/c_src/gen/glu_finit.h 2009-03-12 12:25:39.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/c_src/gen/glu_finit.h 2009-09-18 15:10:52.000000000 +0100 @@ -31,13 +31,24 @@ {"gluBuild3DMipmapLevels", NULL, &wegluBuild3DMipmapLevels}, {"gluBuild3DMipmaps", NULL, &wegluBuild3DMipmaps}, {"gluCheckExtension", NULL, &wegluCheckExtension}, + {"gluCylinder", NULL, &wegluCylinder}, + {"gluDeleteQuadric", NULL, &wegluDeleteQuadric}, + {"gluDisk", NULL, &wegluDisk}, {"gluErrorString", NULL, &wegluErrorString}, {"gluGetString", NULL, &wegluGetString}, {"gluLookAt", NULL, &wegluLookAt}, + {"gluNewQuadric", NULL, &wegluNewQuadric}, {"gluOrtho2D", NULL, &wegluOrtho2D}, + {"gluPartialDisk", NULL, &wegluPartialDisk}, {"gluPerspective", NULL, &wegluPerspective}, {"gluPickMatrix", NULL, &wegluPickMatrix}, {"gluProject", NULL, &wegluProject}, + {"gluQuadricDrawStyle", NULL, &wegluQuadricDrawStyle}, + {"gluQuadricNormals", NULL, &wegluQuadricNormals}, + {"gluQuadricOrientation", NULL, &wegluQuadricOrientation}, + {"gluQuadricTexture", NULL, &wegluQuadricTexture}, + {"gluScaleImage", NULL, &wegluScaleImage}, + {"gluSphere", NULL, &wegluSphere}, {"gluUnProject", NULL, &wegluUnProject}, {"gluUnProject4", NULL, &wegluUnProject4}, { NULL, NULL, NULL}}; diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/gen/wxe_derived_dest.h erlang-13.b.3-dfsg/lib/wx/c_src/gen/wxe_derived_dest.h --- erlang-13.b.1-dfsg/lib/wx/c_src/gen/wxe_derived_dest.h 2009-06-05 13:54:30.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/gen/wxe_derived_dest.h 2009-11-20 13:34:35.000000000 +0000 @@ -709,17 +709,34 @@ EwxSplitterWindow() : wxSplitterWindow() {}; }; +class EwxHtmlWindow : public wxHtmlWindow { + public: ~EwxHtmlWindow() {((WxeApp *)wxTheApp)->clearPtr(this);}; + EwxHtmlWindow(wxWindow * parent,wxWindowID id,const wxPoint& pos,const wxSize& size,long style) : wxHtmlWindow(parent,id,pos,size,style) {}; + EwxHtmlWindow() : wxHtmlWindow() {}; +}; + void WxeApp::delete_object(void *ptr, wxeRefData *refd) { switch(refd->type) { - case 52: delete (wxIconBundle *) ptr; break; - case 60: delete (wxAcceleratorEntry *) ptr; break; - case 61: /* delete (wxCaret *) ptr;These objects must be deleted by owner object */ break; - case 63: delete (wxSizerFlags *) ptr; break; - case 79: /* delete (wxCalendarDateAttr *) ptr;These objects must be deleted by owner object */ break; - case 93: delete (wxTextAttr *) ptr; break; - case 202: /* delete (wxFileDataObject *) ptr;These objects must be deleted by owner object */ break; - case 203: /* delete (wxTextDataObject *) ptr;These objects must be deleted by owner object */ break; - case 204: /* delete (wxBitmapDataObject *) ptr;These objects must be deleted by owner object */ break; + case 24: delete (wxGridCellBoolRenderer *) ptr; break; + case 25: delete (wxGridCellBoolEditor *) ptr; break; + case 26: delete (wxGridCellFloatRenderer *) ptr; break; + case 27: delete (wxGridCellFloatEditor *) ptr; break; + case 28: delete (wxGridCellStringRenderer *) ptr; break; + case 29: delete (wxGridCellTextEditor *) ptr; break; + case 30: delete (wxGridCellChoiceEditor *) ptr; break; + case 31: delete (wxGridCellNumberRenderer *) ptr; break; + case 32: delete (wxGridCellNumberEditor *) ptr; break; + case 61: delete (wxIconBundle *) ptr; break; + case 69: delete (wxAcceleratorEntry *) ptr; break; + case 70: /* delete (wxCaret *) ptr;These objects must be deleted by owner object */ break; + case 72: delete (wxSizerFlags *) ptr; break; + case 88: /* delete (wxCalendarDateAttr *) ptr;These objects must be deleted by owner object */ break; + case 102: delete (wxTextAttr *) ptr; break; + case 154: delete (wxAuiPaneInfo *) ptr; break; + case 211: /* delete (wxFileDataObject *) ptr;These objects must be deleted by owner object */ break; + case 212: /* delete (wxTextDataObject *) ptr;These objects must be deleted by owner object */ break; + case 213: /* delete (wxBitmapDataObject *) ptr;These objects must be deleted by owner object */ break; + case 222: delete (wxLogNull *) ptr; break; default: delete (wxObject *) ptr; }} diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/gen/wxe_events.cpp erlang-13.b.3-dfsg/lib/wx/c_src/gen/wxe_events.cpp --- erlang-13.b.1-dfsg/lib/wx/c_src/gen/wxe_events.cpp 2009-06-05 13:54:29.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/gen/wxe_events.cpp 2009-11-20 13:34:34.000000000 +0000 @@ -50,221 +50,257 @@ void initEventTable() { - struct { int ev_type; int class_id; char * ev_name;} event_types[] = + struct { int ev_type; int class_id; const char * ev_name;} event_types[] = { {wxEVT_NULL, 0, "null"}, - {wxEVT_COMMAND_BUTTON_CLICKED, 154, "command_button_clicked"}, - {wxEVT_COMMAND_CHECKBOX_CLICKED, 154, "command_checkbox_clicked"}, - {wxEVT_COMMAND_CHOICE_SELECTED, 154, "command_choice_selected"}, - {wxEVT_COMMAND_LISTBOX_SELECTED, 154, "command_listbox_selected"}, - {wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, 154, "command_listbox_doubleclicked"}, - {wxEVT_COMMAND_TEXT_UPDATED, 154, "command_text_updated"}, - {wxEVT_COMMAND_TEXT_ENTER, 154, "command_text_enter"}, - {wxEVT_COMMAND_MENU_SELECTED, 154, "command_menu_selected"}, - {wxEVT_COMMAND_SLIDER_UPDATED, 154, "command_slider_updated"}, - {wxEVT_COMMAND_RADIOBOX_SELECTED, 154, "command_radiobox_selected"}, - {wxEVT_COMMAND_RADIOBUTTON_SELECTED, 154, "command_radiobutton_selected"}, - {wxEVT_COMMAND_SCROLLBAR_UPDATED, 154, "command_scrollbar_updated"}, - {wxEVT_COMMAND_VLBOX_SELECTED, 154, "command_vlbox_selected"}, - {wxEVT_COMMAND_COMBOBOX_SELECTED, 154, "command_combobox_selected"}, - {wxEVT_COMMAND_TOOL_RCLICKED, 154, "command_tool_rclicked"}, - {wxEVT_COMMAND_TOOL_ENTER, 154, "command_tool_enter"}, - {wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, 154, "command_checklistbox_toggled"}, - {wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, 154, "command_togglebutton_clicked"}, - {wxEVT_COMMAND_LEFT_CLICK, 154, "command_left_click"}, - {wxEVT_COMMAND_LEFT_DCLICK, 154, "command_left_dclick"}, - {wxEVT_COMMAND_RIGHT_CLICK, 154, "command_right_click"}, - {wxEVT_COMMAND_SET_FOCUS, 154, "command_set_focus"}, - {wxEVT_COMMAND_KILL_FOCUS, 154, "command_kill_focus"}, - {wxEVT_COMMAND_ENTER, 154, "command_enter"}, - {wxEVT_SCROLL_TOP, 155, "scroll_top"}, - {wxEVT_SCROLL_BOTTOM, 155, "scroll_bottom"}, - {wxEVT_SCROLL_LINEUP, 155, "scroll_lineup"}, - {wxEVT_SCROLL_LINEDOWN, 155, "scroll_linedown"}, - {wxEVT_SCROLL_PAGEUP, 155, "scroll_pageup"}, - {wxEVT_SCROLL_PAGEDOWN, 155, "scroll_pagedown"}, - {wxEVT_SCROLL_THUMBTRACK, 155, "scroll_thumbtrack"}, - {wxEVT_SCROLL_THUMBRELEASE, 155, "scroll_thumbrelease"}, - {wxEVT_SCROLL_CHANGED, 155, "scroll_changed"}, - {wxEVT_SCROLLWIN_TOP, 156, "scrollwin_top"}, - {wxEVT_SCROLLWIN_BOTTOM, 156, "scrollwin_bottom"}, - {wxEVT_SCROLLWIN_LINEUP, 156, "scrollwin_lineup"}, - {wxEVT_SCROLLWIN_LINEDOWN, 156, "scrollwin_linedown"}, - {wxEVT_SCROLLWIN_PAGEUP, 156, "scrollwin_pageup"}, - {wxEVT_SCROLLWIN_PAGEDOWN, 156, "scrollwin_pagedown"}, - {wxEVT_SCROLLWIN_THUMBTRACK, 156, "scrollwin_thumbtrack"}, - {wxEVT_SCROLLWIN_THUMBRELEASE, 156, "scrollwin_thumbrelease"}, - {wxEVT_LEFT_DOWN, 157, "left_down"}, - {wxEVT_LEFT_UP, 157, "left_up"}, - {wxEVT_MIDDLE_DOWN, 157, "middle_down"}, - {wxEVT_MIDDLE_UP, 157, "middle_up"}, - {wxEVT_RIGHT_DOWN, 157, "right_down"}, - {wxEVT_RIGHT_UP, 157, "right_up"}, - {wxEVT_MOTION, 157, "motion"}, - {wxEVT_ENTER_WINDOW, 157, "enter_window"}, - {wxEVT_LEAVE_WINDOW, 157, "leave_window"}, - {wxEVT_LEFT_DCLICK, 157, "left_dclick"}, - {wxEVT_MIDDLE_DCLICK, 157, "middle_dclick"}, - {wxEVT_RIGHT_DCLICK, 157, "right_dclick"}, - {wxEVT_MOUSEWHEEL, 157, "mousewheel"}, - {wxEVT_NC_LEFT_DOWN, 157, "nc_left_down"}, - {wxEVT_NC_LEFT_UP, 157, "nc_left_up"}, - {wxEVT_NC_MIDDLE_DOWN, 157, "nc_middle_down"}, - {wxEVT_NC_MIDDLE_UP, 157, "nc_middle_up"}, - {wxEVT_NC_RIGHT_DOWN, 157, "nc_right_down"}, - {wxEVT_NC_RIGHT_UP, 157, "nc_right_up"}, - {wxEVT_NC_MOTION, 157, "nc_motion"}, - {wxEVT_NC_ENTER_WINDOW, 157, "nc_enter_window"}, - {wxEVT_NC_LEAVE_WINDOW, 157, "nc_leave_window"}, - {wxEVT_NC_LEFT_DCLICK, 157, "nc_left_dclick"}, - {wxEVT_NC_MIDDLE_DCLICK, 157, "nc_middle_dclick"}, - {wxEVT_NC_RIGHT_DCLICK, 157, "nc_right_dclick"}, - {wxEVT_SET_CURSOR, 158, "set_cursor"}, - {wxEVT_CHAR, 159, "char"}, - {wxEVT_CHAR_HOOK, 159, "char_hook"}, - {wxEVT_KEY_DOWN, 159, "key_down"}, - {wxEVT_KEY_UP, 159, "key_up"}, - {wxEVT_SIZE, 160, "size"}, - {wxEVT_MOVE, 161, "move"}, - {wxEVT_PAINT, 162, "paint"}, - {wxEVT_PAINT_ICON, 162, "paint_icon"}, - {wxEVT_NC_PAINT, 163, "nc_paint"}, - {wxEVT_ERASE_BACKGROUND, 164, "erase_background"}, - {wxEVT_SET_FOCUS, 165, "set_focus"}, - {wxEVT_KILL_FOCUS, 165, "kill_focus"}, - {wxEVT_CHILD_FOCUS, 166, "child_focus"}, - {wxEVT_MENU_OPEN, 167, "menu_open"}, - {wxEVT_MENU_CLOSE, 167, "menu_close"}, - {wxEVT_MENU_HIGHLIGHT, 167, "menu_highlight"}, - {wxEVT_CLOSE_WINDOW, 168, "close_window"}, - {wxEVT_END_SESSION, 168, "end_session"}, - {wxEVT_QUERY_END_SESSION, 168, "query_end_session"}, - {wxEVT_SHOW, 169, "show"}, - {wxEVT_ICONIZE, 170, "iconize"}, - {wxEVT_MAXIMIZE, 171, "maximize"}, - {wxEVT_JOY_BUTTON_DOWN, 172, "joy_button_down"}, - {wxEVT_JOY_BUTTON_UP, 172, "joy_button_up"}, - {wxEVT_JOY_MOVE, 172, "joy_move"}, - {wxEVT_JOY_ZMOVE, 172, "joy_zmove"}, - {wxEVT_UPDATE_UI, 173, "update_ui"}, - {wxEVT_SYS_COLOUR_CHANGED, 174, "sys_colour_changed"}, - {wxEVT_MOUSE_CAPTURE_CHANGED, 175, "mouse_capture_changed"}, - {wxEVT_DISPLAY_CHANGED, 176, "display_changed"}, - {wxEVT_PALETTE_CHANGED, 177, "palette_changed"}, - {wxEVT_QUERY_NEW_PALETTE, 178, "query_new_palette"}, - {wxEVT_NAVIGATION_KEY, 179, "navigation_key"}, - {wxEVT_CREATE, 180, "create"}, - {wxEVT_DESTROY, 181, "destroy"}, - {wxEVT_HELP, 182, "help"}, - {wxEVT_DETAILED_HELP, 182, "detailed_help"}, - {wxEVT_CONTEXT_MENU, 183, "context_menu"}, - {wxEVT_IDLE, 184, "idle"}, - {wxEVT_GRID_CELL_LEFT_CLICK, 185, "grid_cell_left_click"}, - {wxEVT_GRID_CELL_RIGHT_CLICK, 185, "grid_cell_right_click"}, - {wxEVT_GRID_CELL_LEFT_DCLICK, 185, "grid_cell_left_dclick"}, - {wxEVT_GRID_CELL_RIGHT_DCLICK, 185, "grid_cell_right_dclick"}, - {wxEVT_GRID_LABEL_LEFT_CLICK, 185, "grid_label_left_click"}, - {wxEVT_GRID_LABEL_RIGHT_CLICK, 185, "grid_label_right_click"}, - {wxEVT_GRID_LABEL_LEFT_DCLICK, 185, "grid_label_left_dclick"}, - {wxEVT_GRID_LABEL_RIGHT_DCLICK, 185, "grid_label_right_dclick"}, - {wxEVT_GRID_ROW_SIZE, 185, "grid_row_size"}, - {wxEVT_GRID_COL_SIZE, 185, "grid_col_size"}, - {wxEVT_GRID_RANGE_SELECT, 185, "grid_range_select"}, - {wxEVT_GRID_CELL_CHANGE, 185, "grid_cell_change"}, - {wxEVT_GRID_SELECT_CELL, 185, "grid_select_cell"}, - {wxEVT_GRID_EDITOR_SHOWN, 185, "grid_editor_shown"}, - {wxEVT_GRID_EDITOR_HIDDEN, 185, "grid_editor_hidden"}, - {wxEVT_GRID_EDITOR_CREATED, 185, "grid_editor_created"}, - {wxEVT_GRID_CELL_BEGIN_DRAG, 185, "grid_cell_begin_drag"}, - {wxEVT_SASH_DRAGGED, 187, "sash_dragged"}, - {wxEVT_COMMAND_LIST_BEGIN_DRAG, 188, "command_list_begin_drag"}, - {wxEVT_COMMAND_LIST_BEGIN_RDRAG, 188, "command_list_begin_rdrag"}, - {wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT, 188, "command_list_begin_label_edit"}, - {wxEVT_COMMAND_LIST_END_LABEL_EDIT, 188, "command_list_end_label_edit"}, - {wxEVT_COMMAND_LIST_DELETE_ITEM, 188, "command_list_delete_item"}, - {wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS, 188, "command_list_delete_all_items"}, - {wxEVT_COMMAND_LIST_KEY_DOWN, 188, "command_list_key_down"}, - {wxEVT_COMMAND_LIST_INSERT_ITEM, 188, "command_list_insert_item"}, - {wxEVT_COMMAND_LIST_COL_CLICK, 188, "command_list_col_click"}, - {wxEVT_COMMAND_LIST_COL_RIGHT_CLICK, 188, "command_list_col_right_click"}, - {wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, 188, "command_list_col_begin_drag"}, - {wxEVT_COMMAND_LIST_COL_DRAGGING, 188, "command_list_col_dragging"}, - {wxEVT_COMMAND_LIST_COL_END_DRAG, 188, "command_list_col_end_drag"}, - {wxEVT_COMMAND_LIST_ITEM_SELECTED, 188, "command_list_item_selected"}, - {wxEVT_COMMAND_LIST_ITEM_DESELECTED, 188, "command_list_item_deselected"}, - {wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, 188, "command_list_item_right_click"}, - {wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK, 188, "command_list_item_middle_click"}, - {wxEVT_COMMAND_LIST_ITEM_ACTIVATED, 188, "command_list_item_activated"}, - {wxEVT_COMMAND_LIST_ITEM_FOCUSED, 188, "command_list_item_focused"}, - {wxEVT_COMMAND_LIST_CACHE_HINT, 188, "command_list_cache_hint"}, - {wxEVT_DATE_CHANGED, 189, "date_changed"}, - {wxEVT_CALENDAR_SEL_CHANGED, 190, "calendar_sel_changed"}, - {wxEVT_CALENDAR_DAY_CHANGED, 190, "calendar_day_changed"}, - {wxEVT_CALENDAR_MONTH_CHANGED, 190, "calendar_month_changed"}, - {wxEVT_CALENDAR_YEAR_CHANGED, 190, "calendar_year_changed"}, - {wxEVT_CALENDAR_DOUBLECLICKED, 190, "calendar_doubleclicked"}, - {wxEVT_CALENDAR_WEEKDAY_CLICKED, 190, "calendar_weekday_clicked"}, - {wxEVT_COMMAND_FILEPICKER_CHANGED, 191, "command_filepicker_changed"}, - {wxEVT_COMMAND_DIRPICKER_CHANGED, 191, "command_dirpicker_changed"}, - {wxEVT_COMMAND_COLOURPICKER_CHANGED, 192, "command_colourpicker_changed"}, - {wxEVT_COMMAND_FONTPICKER_CHANGED, 193, "command_fontpicker_changed"}, - {wxEVT_STC_CHANGE, 194, "stc_change"}, - {wxEVT_STC_STYLENEEDED, 194, "stc_styleneeded"}, - {wxEVT_STC_CHARADDED, 194, "stc_charadded"}, - {wxEVT_STC_SAVEPOINTREACHED, 194, "stc_savepointreached"}, - {wxEVT_STC_SAVEPOINTLEFT, 194, "stc_savepointleft"}, - {wxEVT_STC_ROMODIFYATTEMPT, 194, "stc_romodifyattempt"}, - {wxEVT_STC_KEY, 194, "stc_key"}, - {wxEVT_STC_DOUBLECLICK, 194, "stc_doubleclick"}, - {wxEVT_STC_UPDATEUI, 194, "stc_updateui"}, - {wxEVT_STC_MODIFIED, 194, "stc_modified"}, - {wxEVT_STC_MACRORECORD, 194, "stc_macrorecord"}, - {wxEVT_STC_MARGINCLICK, 194, "stc_marginclick"}, - {wxEVT_STC_NEEDSHOWN, 194, "stc_needshown"}, - {wxEVT_STC_PAINTED, 194, "stc_painted"}, - {wxEVT_STC_USERLISTSELECTION, 194, "stc_userlistselection"}, - {wxEVT_STC_URIDROPPED, 194, "stc_uridropped"}, - {wxEVT_STC_DWELLSTART, 194, "stc_dwellstart"}, - {wxEVT_STC_DWELLEND, 194, "stc_dwellend"}, - {wxEVT_STC_START_DRAG, 194, "stc_start_drag"}, - {wxEVT_STC_DRAG_OVER, 194, "stc_drag_over"}, - {wxEVT_STC_DO_DROP, 194, "stc_do_drop"}, - {wxEVT_STC_ZOOM, 194, "stc_zoom"}, - {wxEVT_STC_HOTSPOT_CLICK, 194, "stc_hotspot_click"}, - {wxEVT_STC_HOTSPOT_DCLICK, 194, "stc_hotspot_dclick"}, - {wxEVT_STC_CALLTIP_CLICK, 194, "stc_calltip_click"}, - {wxEVT_STC_AUTOCOMP_SELECTION, 194, "stc_autocomp_selection"}, - {wxEVT_COMMAND_TREE_BEGIN_DRAG, 199, "command_tree_begin_drag"}, - {wxEVT_COMMAND_TREE_BEGIN_RDRAG, 199, "command_tree_begin_rdrag"}, - {wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, 199, "command_tree_begin_label_edit"}, - {wxEVT_COMMAND_TREE_END_LABEL_EDIT, 199, "command_tree_end_label_edit"}, - {wxEVT_COMMAND_TREE_DELETE_ITEM, 199, "command_tree_delete_item"}, - {wxEVT_COMMAND_TREE_GET_INFO, 199, "command_tree_get_info"}, - {wxEVT_COMMAND_TREE_SET_INFO, 199, "command_tree_set_info"}, - {wxEVT_COMMAND_TREE_ITEM_EXPANDED, 199, "command_tree_item_expanded"}, - {wxEVT_COMMAND_TREE_ITEM_EXPANDING, 199, "command_tree_item_expanding"}, - {wxEVT_COMMAND_TREE_ITEM_COLLAPSED, 199, "command_tree_item_collapsed"}, - {wxEVT_COMMAND_TREE_ITEM_COLLAPSING, 199, "command_tree_item_collapsing"}, - {wxEVT_COMMAND_TREE_SEL_CHANGED, 199, "command_tree_sel_changed"}, - {wxEVT_COMMAND_TREE_SEL_CHANGING, 199, "command_tree_sel_changing"}, - {wxEVT_COMMAND_TREE_KEY_DOWN, 199, "command_tree_key_down"}, - {wxEVT_COMMAND_TREE_ITEM_ACTIVATED, 199, "command_tree_item_activated"}, - {wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, 199, "command_tree_item_right_click"}, - {wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK, 199, "command_tree_item_middle_click"}, - {wxEVT_COMMAND_TREE_END_DRAG, 199, "command_tree_end_drag"}, - {wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK, 199, "command_tree_state_image_click"}, - {wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, 199, "command_tree_item_gettooltip"}, - {wxEVT_COMMAND_TREE_ITEM_MENU, 199, "command_tree_item_menu"}, - {wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, 200, "command_notebook_page_changed"}, - {wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, 200, "command_notebook_page_changing"}, - {wxEVT_COMMAND_SPINCTRL_UPDATED, 206, "command_spinctrl_updated"}, - {wxEVT_SCROLL_LINEUP + wxEVT_USER_FIRST, 155, "spin_up"}, - {wxEVT_SCROLL_LINEDOWN + wxEVT_USER_FIRST, 155, "spin_down"}, - {wxEVT_SCROLL_THUMBTRACK + wxEVT_USER_FIRST, 155, "spin"}, - {wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, 208, "command_splitter_sash_pos_changed"}, - {wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, 208, "command_splitter_sash_pos_changing"}, - {wxEVT_COMMAND_SPLITTER_DOUBLECLICKED, 208, "command_splitter_doubleclicked"}, - {wxEVT_COMMAND_SPLITTER_UNSPLIT, 208, "command_splitter_unsplit"}, + {wxEVT_COMMAND_BUTTON_CLICKED, 163, "command_button_clicked"}, + {wxEVT_COMMAND_CHECKBOX_CLICKED, 163, "command_checkbox_clicked"}, + {wxEVT_COMMAND_CHOICE_SELECTED, 163, "command_choice_selected"}, + {wxEVT_COMMAND_LISTBOX_SELECTED, 163, "command_listbox_selected"}, + {wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, 163, "command_listbox_doubleclicked"}, + {wxEVT_COMMAND_TEXT_UPDATED, 163, "command_text_updated"}, + {wxEVT_COMMAND_TEXT_ENTER, 163, "command_text_enter"}, + {wxEVT_COMMAND_MENU_SELECTED, 163, "command_menu_selected"}, + {wxEVT_COMMAND_SLIDER_UPDATED, 163, "command_slider_updated"}, + {wxEVT_COMMAND_RADIOBOX_SELECTED, 163, "command_radiobox_selected"}, + {wxEVT_COMMAND_RADIOBUTTON_SELECTED, 163, "command_radiobutton_selected"}, + {wxEVT_COMMAND_SCROLLBAR_UPDATED, 163, "command_scrollbar_updated"}, + {wxEVT_COMMAND_VLBOX_SELECTED, 163, "command_vlbox_selected"}, + {wxEVT_COMMAND_COMBOBOX_SELECTED, 163, "command_combobox_selected"}, + {wxEVT_COMMAND_TOOL_RCLICKED, 163, "command_tool_rclicked"}, + {wxEVT_COMMAND_TOOL_ENTER, 163, "command_tool_enter"}, + {wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, 163, "command_checklistbox_toggled"}, + {wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, 163, "command_togglebutton_clicked"}, + {wxEVT_COMMAND_LEFT_CLICK, 163, "command_left_click"}, + {wxEVT_COMMAND_LEFT_DCLICK, 163, "command_left_dclick"}, + {wxEVT_COMMAND_RIGHT_CLICK, 163, "command_right_click"}, + {wxEVT_COMMAND_SET_FOCUS, 163, "command_set_focus"}, + {wxEVT_COMMAND_KILL_FOCUS, 163, "command_kill_focus"}, + {wxEVT_COMMAND_ENTER, 163, "command_enter"}, + {wxEVT_SCROLL_TOP, 164, "scroll_top"}, + {wxEVT_SCROLL_BOTTOM, 164, "scroll_bottom"}, + {wxEVT_SCROLL_LINEUP, 164, "scroll_lineup"}, + {wxEVT_SCROLL_LINEDOWN, 164, "scroll_linedown"}, + {wxEVT_SCROLL_PAGEUP, 164, "scroll_pageup"}, + {wxEVT_SCROLL_PAGEDOWN, 164, "scroll_pagedown"}, + {wxEVT_SCROLL_THUMBTRACK, 164, "scroll_thumbtrack"}, + {wxEVT_SCROLL_THUMBRELEASE, 164, "scroll_thumbrelease"}, + {wxEVT_SCROLL_CHANGED, 164, "scroll_changed"}, + {wxEVT_SCROLLWIN_TOP, 165, "scrollwin_top"}, + {wxEVT_SCROLLWIN_BOTTOM, 165, "scrollwin_bottom"}, + {wxEVT_SCROLLWIN_LINEUP, 165, "scrollwin_lineup"}, + {wxEVT_SCROLLWIN_LINEDOWN, 165, "scrollwin_linedown"}, + {wxEVT_SCROLLWIN_PAGEUP, 165, "scrollwin_pageup"}, + {wxEVT_SCROLLWIN_PAGEDOWN, 165, "scrollwin_pagedown"}, + {wxEVT_SCROLLWIN_THUMBTRACK, 165, "scrollwin_thumbtrack"}, + {wxEVT_SCROLLWIN_THUMBRELEASE, 165, "scrollwin_thumbrelease"}, + {wxEVT_LEFT_DOWN, 166, "left_down"}, + {wxEVT_LEFT_UP, 166, "left_up"}, + {wxEVT_MIDDLE_DOWN, 166, "middle_down"}, + {wxEVT_MIDDLE_UP, 166, "middle_up"}, + {wxEVT_RIGHT_DOWN, 166, "right_down"}, + {wxEVT_RIGHT_UP, 166, "right_up"}, + {wxEVT_MOTION, 166, "motion"}, + {wxEVT_ENTER_WINDOW, 166, "enter_window"}, + {wxEVT_LEAVE_WINDOW, 166, "leave_window"}, + {wxEVT_LEFT_DCLICK, 166, "left_dclick"}, + {wxEVT_MIDDLE_DCLICK, 166, "middle_dclick"}, + {wxEVT_RIGHT_DCLICK, 166, "right_dclick"}, + {wxEVT_MOUSEWHEEL, 166, "mousewheel"}, + {wxEVT_NC_LEFT_DOWN, 166, "nc_left_down"}, + {wxEVT_NC_LEFT_UP, 166, "nc_left_up"}, + {wxEVT_NC_MIDDLE_DOWN, 166, "nc_middle_down"}, + {wxEVT_NC_MIDDLE_UP, 166, "nc_middle_up"}, + {wxEVT_NC_RIGHT_DOWN, 166, "nc_right_down"}, + {wxEVT_NC_RIGHT_UP, 166, "nc_right_up"}, + {wxEVT_NC_MOTION, 166, "nc_motion"}, + {wxEVT_NC_ENTER_WINDOW, 166, "nc_enter_window"}, + {wxEVT_NC_LEAVE_WINDOW, 166, "nc_leave_window"}, + {wxEVT_NC_LEFT_DCLICK, 166, "nc_left_dclick"}, + {wxEVT_NC_MIDDLE_DCLICK, 166, "nc_middle_dclick"}, + {wxEVT_NC_RIGHT_DCLICK, 166, "nc_right_dclick"}, + {wxEVT_SET_CURSOR, 167, "set_cursor"}, + {wxEVT_CHAR, 168, "char"}, + {wxEVT_CHAR_HOOK, 168, "char_hook"}, + {wxEVT_KEY_DOWN, 168, "key_down"}, + {wxEVT_KEY_UP, 168, "key_up"}, + {wxEVT_SIZE, 169, "size"}, + {wxEVT_MOVE, 170, "move"}, + {wxEVT_PAINT, 171, "paint"}, + {wxEVT_PAINT_ICON, 171, "paint_icon"}, + {wxEVT_NC_PAINT, 172, "nc_paint"}, + {wxEVT_ERASE_BACKGROUND, 173, "erase_background"}, + {wxEVT_SET_FOCUS, 174, "set_focus"}, + {wxEVT_KILL_FOCUS, 174, "kill_focus"}, + {wxEVT_CHILD_FOCUS, 175, "child_focus"}, + {wxEVT_MENU_OPEN, 176, "menu_open"}, + {wxEVT_MENU_CLOSE, 176, "menu_close"}, + {wxEVT_MENU_HIGHLIGHT, 176, "menu_highlight"}, + {wxEVT_CLOSE_WINDOW, 177, "close_window"}, + {wxEVT_END_SESSION, 177, "end_session"}, + {wxEVT_QUERY_END_SESSION, 177, "query_end_session"}, + {wxEVT_SHOW, 178, "show"}, + {wxEVT_ICONIZE, 179, "iconize"}, + {wxEVT_MAXIMIZE, 180, "maximize"}, + {wxEVT_JOY_BUTTON_DOWN, 181, "joy_button_down"}, + {wxEVT_JOY_BUTTON_UP, 181, "joy_button_up"}, + {wxEVT_JOY_MOVE, 181, "joy_move"}, + {wxEVT_JOY_ZMOVE, 181, "joy_zmove"}, + {wxEVT_UPDATE_UI, 182, "update_ui"}, + {wxEVT_SYS_COLOUR_CHANGED, 183, "sys_colour_changed"}, + {wxEVT_MOUSE_CAPTURE_CHANGED, 184, "mouse_capture_changed"}, + {wxEVT_DISPLAY_CHANGED, 185, "display_changed"}, + {wxEVT_PALETTE_CHANGED, 186, "palette_changed"}, + {wxEVT_QUERY_NEW_PALETTE, 187, "query_new_palette"}, + {wxEVT_NAVIGATION_KEY, 188, "navigation_key"}, + {wxEVT_CREATE, 189, "create"}, + {wxEVT_DESTROY, 190, "destroy"}, + {wxEVT_HELP, 191, "help"}, + {wxEVT_DETAILED_HELP, 191, "detailed_help"}, + {wxEVT_CONTEXT_MENU, 192, "context_menu"}, + {wxEVT_IDLE, 193, "idle"}, + {wxEVT_GRID_CELL_LEFT_CLICK, 194, "grid_cell_left_click"}, + {wxEVT_GRID_CELL_RIGHT_CLICK, 194, "grid_cell_right_click"}, + {wxEVT_GRID_CELL_LEFT_DCLICK, 194, "grid_cell_left_dclick"}, + {wxEVT_GRID_CELL_RIGHT_DCLICK, 194, "grid_cell_right_dclick"}, + {wxEVT_GRID_LABEL_LEFT_CLICK, 194, "grid_label_left_click"}, + {wxEVT_GRID_LABEL_RIGHT_CLICK, 194, "grid_label_right_click"}, + {wxEVT_GRID_LABEL_LEFT_DCLICK, 194, "grid_label_left_dclick"}, + {wxEVT_GRID_LABEL_RIGHT_DCLICK, 194, "grid_label_right_dclick"}, + {wxEVT_GRID_ROW_SIZE, 194, "grid_row_size"}, + {wxEVT_GRID_COL_SIZE, 194, "grid_col_size"}, + {wxEVT_GRID_RANGE_SELECT, 194, "grid_range_select"}, + {wxEVT_GRID_CELL_CHANGE, 194, "grid_cell_change"}, + {wxEVT_GRID_SELECT_CELL, 194, "grid_select_cell"}, + {wxEVT_GRID_EDITOR_SHOWN, 194, "grid_editor_shown"}, + {wxEVT_GRID_EDITOR_HIDDEN, 194, "grid_editor_hidden"}, + {wxEVT_GRID_EDITOR_CREATED, 194, "grid_editor_created"}, + {wxEVT_GRID_CELL_BEGIN_DRAG, 194, "grid_cell_begin_drag"}, + {wxEVT_SASH_DRAGGED, 196, "sash_dragged"}, + {wxEVT_COMMAND_LIST_BEGIN_DRAG, 197, "command_list_begin_drag"}, + {wxEVT_COMMAND_LIST_BEGIN_RDRAG, 197, "command_list_begin_rdrag"}, + {wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT, 197, "command_list_begin_label_edit"}, + {wxEVT_COMMAND_LIST_END_LABEL_EDIT, 197, "command_list_end_label_edit"}, + {wxEVT_COMMAND_LIST_DELETE_ITEM, 197, "command_list_delete_item"}, + {wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS, 197, "command_list_delete_all_items"}, + {wxEVT_COMMAND_LIST_KEY_DOWN, 197, "command_list_key_down"}, + {wxEVT_COMMAND_LIST_INSERT_ITEM, 197, "command_list_insert_item"}, + {wxEVT_COMMAND_LIST_COL_CLICK, 197, "command_list_col_click"}, + {wxEVT_COMMAND_LIST_COL_RIGHT_CLICK, 197, "command_list_col_right_click"}, + {wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, 197, "command_list_col_begin_drag"}, + {wxEVT_COMMAND_LIST_COL_DRAGGING, 197, "command_list_col_dragging"}, + {wxEVT_COMMAND_LIST_COL_END_DRAG, 197, "command_list_col_end_drag"}, + {wxEVT_COMMAND_LIST_ITEM_SELECTED, 197, "command_list_item_selected"}, + {wxEVT_COMMAND_LIST_ITEM_DESELECTED, 197, "command_list_item_deselected"}, + {wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, 197, "command_list_item_right_click"}, + {wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK, 197, "command_list_item_middle_click"}, + {wxEVT_COMMAND_LIST_ITEM_ACTIVATED, 197, "command_list_item_activated"}, + {wxEVT_COMMAND_LIST_ITEM_FOCUSED, 197, "command_list_item_focused"}, + {wxEVT_COMMAND_LIST_CACHE_HINT, 197, "command_list_cache_hint"}, + {wxEVT_DATE_CHANGED, 198, "date_changed"}, + {wxEVT_CALENDAR_SEL_CHANGED, 199, "calendar_sel_changed"}, + {wxEVT_CALENDAR_DAY_CHANGED, 199, "calendar_day_changed"}, + {wxEVT_CALENDAR_MONTH_CHANGED, 199, "calendar_month_changed"}, + {wxEVT_CALENDAR_YEAR_CHANGED, 199, "calendar_year_changed"}, + {wxEVT_CALENDAR_DOUBLECLICKED, 199, "calendar_doubleclicked"}, + {wxEVT_CALENDAR_WEEKDAY_CLICKED, 199, "calendar_weekday_clicked"}, + {wxEVT_COMMAND_FILEPICKER_CHANGED, 200, "command_filepicker_changed"}, + {wxEVT_COMMAND_DIRPICKER_CHANGED, 200, "command_dirpicker_changed"}, + {wxEVT_COMMAND_COLOURPICKER_CHANGED, 201, "command_colourpicker_changed"}, + {wxEVT_COMMAND_FONTPICKER_CHANGED, 202, "command_fontpicker_changed"}, + {wxEVT_STC_CHANGE, 203, "stc_change"}, + {wxEVT_STC_STYLENEEDED, 203, "stc_styleneeded"}, + {wxEVT_STC_CHARADDED, 203, "stc_charadded"}, + {wxEVT_STC_SAVEPOINTREACHED, 203, "stc_savepointreached"}, + {wxEVT_STC_SAVEPOINTLEFT, 203, "stc_savepointleft"}, + {wxEVT_STC_ROMODIFYATTEMPT, 203, "stc_romodifyattempt"}, + {wxEVT_STC_KEY, 203, "stc_key"}, + {wxEVT_STC_DOUBLECLICK, 203, "stc_doubleclick"}, + {wxEVT_STC_UPDATEUI, 203, "stc_updateui"}, + {wxEVT_STC_MODIFIED, 203, "stc_modified"}, + {wxEVT_STC_MACRORECORD, 203, "stc_macrorecord"}, + {wxEVT_STC_MARGINCLICK, 203, "stc_marginclick"}, + {wxEVT_STC_NEEDSHOWN, 203, "stc_needshown"}, + {wxEVT_STC_PAINTED, 203, "stc_painted"}, + {wxEVT_STC_USERLISTSELECTION, 203, "stc_userlistselection"}, + {wxEVT_STC_URIDROPPED, 203, "stc_uridropped"}, + {wxEVT_STC_DWELLSTART, 203, "stc_dwellstart"}, + {wxEVT_STC_DWELLEND, 203, "stc_dwellend"}, + {wxEVT_STC_START_DRAG, 203, "stc_start_drag"}, + {wxEVT_STC_DRAG_OVER, 203, "stc_drag_over"}, + {wxEVT_STC_DO_DROP, 203, "stc_do_drop"}, + {wxEVT_STC_ZOOM, 203, "stc_zoom"}, + {wxEVT_STC_HOTSPOT_CLICK, 203, "stc_hotspot_click"}, + {wxEVT_STC_HOTSPOT_DCLICK, 203, "stc_hotspot_dclick"}, + {wxEVT_STC_CALLTIP_CLICK, 203, "stc_calltip_click"}, + {wxEVT_STC_AUTOCOMP_SELECTION, 203, "stc_autocomp_selection"}, + {wxEVT_COMMAND_TREE_BEGIN_DRAG, 208, "command_tree_begin_drag"}, + {wxEVT_COMMAND_TREE_BEGIN_RDRAG, 208, "command_tree_begin_rdrag"}, + {wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, 208, "command_tree_begin_label_edit"}, + {wxEVT_COMMAND_TREE_END_LABEL_EDIT, 208, "command_tree_end_label_edit"}, + {wxEVT_COMMAND_TREE_DELETE_ITEM, 208, "command_tree_delete_item"}, + {wxEVT_COMMAND_TREE_GET_INFO, 208, "command_tree_get_info"}, + {wxEVT_COMMAND_TREE_SET_INFO, 208, "command_tree_set_info"}, + {wxEVT_COMMAND_TREE_ITEM_EXPANDED, 208, "command_tree_item_expanded"}, + {wxEVT_COMMAND_TREE_ITEM_EXPANDING, 208, "command_tree_item_expanding"}, + {wxEVT_COMMAND_TREE_ITEM_COLLAPSED, 208, "command_tree_item_collapsed"}, + {wxEVT_COMMAND_TREE_ITEM_COLLAPSING, 208, "command_tree_item_collapsing"}, + {wxEVT_COMMAND_TREE_SEL_CHANGED, 208, "command_tree_sel_changed"}, + {wxEVT_COMMAND_TREE_SEL_CHANGING, 208, "command_tree_sel_changing"}, + {wxEVT_COMMAND_TREE_KEY_DOWN, 208, "command_tree_key_down"}, + {wxEVT_COMMAND_TREE_ITEM_ACTIVATED, 208, "command_tree_item_activated"}, + {wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, 208, "command_tree_item_right_click"}, + {wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK, 208, "command_tree_item_middle_click"}, + {wxEVT_COMMAND_TREE_END_DRAG, 208, "command_tree_end_drag"}, + {wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK, 208, "command_tree_state_image_click"}, + {wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, 208, "command_tree_item_gettooltip"}, + {wxEVT_COMMAND_TREE_ITEM_MENU, 208, "command_tree_item_menu"}, + {wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, 209, "command_notebook_page_changed"}, + {wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, 209, "command_notebook_page_changing"}, + {wxEVT_COMMAND_SPINCTRL_UPDATED, 215, "command_spinctrl_updated"}, + {wxEVT_SCROLL_LINEUP + wxEVT_USER_FIRST, 164, "spin_up"}, + {wxEVT_SCROLL_LINEDOWN + wxEVT_USER_FIRST, 164, "spin_down"}, + {wxEVT_SCROLL_THUMBTRACK + wxEVT_USER_FIRST, 164, "spin"}, + {wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, 217, "command_splitter_sash_pos_changed"}, + {wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, 217, "command_splitter_sash_pos_changing"}, + {wxEVT_COMMAND_SPLITTER_DOUBLECLICKED, 217, "command_splitter_doubleclicked"}, + {wxEVT_COMMAND_SPLITTER_UNSPLIT, 217, "command_splitter_unsplit"}, + {wxEVT_COMMAND_HTML_LINK_CLICKED, 219, "command_html_link_clicked"}, + {wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, 220, "command_auinotebook_page_close"}, + {wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, 220, "command_auinotebook_page_changed"}, + {wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, 220, "command_auinotebook_page_changing"}, + {wxEVT_COMMAND_AUINOTEBOOK_BUTTON, 220, "command_auinotebook_button"}, + {wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, 220, "command_auinotebook_begin_drag"}, + {wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, 220, "command_auinotebook_end_drag"}, + {wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, 220, "command_auinotebook_drag_motion"}, + {wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, 220, "command_auinotebook_allow_dnd"}, +#if wxCHECK_VERSION(2,8,5) + {wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, 220, "command_auinotebook_tab_middle_down"}, +#endif +#if wxCHECK_VERSION(2,8,5) + {wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, 220, "command_auinotebook_tab_middle_up"}, +#endif +#if wxCHECK_VERSION(2,8,5) + {wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, 220, "command_auinotebook_tab_right_down"}, +#endif +#if wxCHECK_VERSION(2,8,5) + {wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, 220, "command_auinotebook_tab_right_up"}, +#endif +#if wxCHECK_VERSION(2,8,5) + {wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, 220, "command_auinotebook_page_closed"}, +#endif +#if wxCHECK_VERSION(2,8,5) + {wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, 220, "command_auinotebook_drag_done"}, +#endif +#if wxCHECK_VERSION(2,8,5) + {wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, 220, "command_auinotebook_bg_dclick"}, +#endif + {wxEVT_AUI_PANE_BUTTON, 221, "aui_pane_button"}, + {wxEVT_AUI_PANE_CLOSE, 221, "aui_pane_close"}, + {wxEVT_AUI_PANE_MAXIMIZE, 221, "aui_pane_maximize"}, + {wxEVT_AUI_PANE_RESTORE, 221, "aui_pane_restore"}, + {wxEVT_AUI_RENDER, 221, "aui_render"}, + {wxEVT_AUI_FIND_MANAGER, 221, "aui_find_manager"}, {-1, 0, } }; for(int i=0; event_types[i].ev_type != -1; i++) { @@ -317,7 +353,7 @@ rt.addRef(getRef((void *)(cb->obj), memenv), cb->class_name); rt.addExt2Term(cb->user_data); switch(Etype->cID) { -case 154: {// wxCommandEvent +case 163: {// wxCommandEvent wxCommandEvent * ev = (wxCommandEvent *) event; evClass = (char*)"wxCommandEvent"; rt.addAtom((char*)"wxCommand"); @@ -328,7 +364,7 @@ rt.addTupleCount(5); break; } -case 155: {// wxScrollEvent or wxSpinEvent +case 164: {// wxScrollEvent or wxSpinEvent if(event->IsKindOf(CLASSINFO(wxScrollEvent))) { wxScrollEvent * ev = (wxScrollEvent *) event; evClass = (char*)"wxScrollEvent"; @@ -348,14 +384,14 @@ } break; } -case 156: {// wxScrollWinEvent +case 165: {// wxScrollWinEvent evClass = (char*)"wxScrollWinEvent"; rt.addAtom((char*)"wxScrollWin"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 157: {// wxMouseEvent +case 166: {// wxMouseEvent wxMouseEvent * ev = (wxMouseEvent *) event; evClass = (char*)"wxMouseEvent"; rt.addAtom((char*)"wxMouse"); @@ -375,14 +411,14 @@ rt.addTupleCount(14); break; } -case 158: {// wxSetCursorEvent +case 167: {// wxSetCursorEvent evClass = (char*)"wxSetCursorEvent"; rt.addAtom((char*)"wxSetCursor"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 159: {// wxKeyEvent +case 168: {// wxKeyEvent wxKeyEvent * ev = (wxKeyEvent *) event; evClass = (char*)"wxKeyEvent"; rt.addAtom((char*)"wxKey"); @@ -401,7 +437,7 @@ rt.addTupleCount(13); break; } -case 160: {// wxSizeEvent +case 169: {// wxSizeEvent wxSizeEvent * ev = (wxSizeEvent *) event; evClass = (char*)"wxSizeEvent"; rt.addAtom((char*)"wxSize"); @@ -411,28 +447,28 @@ rt.addTupleCount(4); break; } -case 161: {// wxMoveEvent +case 170: {// wxMoveEvent evClass = (char*)"wxMoveEvent"; rt.addAtom((char*)"wxMove"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 162: {// wxPaintEvent +case 171: {// wxPaintEvent evClass = (char*)"wxPaintEvent"; rt.addAtom((char*)"wxPaint"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 163: {// wxNcPaintEvent +case 172: {// wxNcPaintEvent evClass = (char*)"wxNcPaintEvent"; rt.addAtom((char*)"wxNcPaint"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 164: {// wxEraseEvent +case 173: {// wxEraseEvent wxEraseEvent * ev = (wxEraseEvent *) event; wxDC * GetDC = ev->GetDC(); evClass = (char*)"wxEraseEvent"; @@ -442,105 +478,105 @@ rt.addTupleCount(3); break; } -case 165: {// wxFocusEvent +case 174: {// wxFocusEvent evClass = (char*)"wxFocusEvent"; rt.addAtom((char*)"wxFocus"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 166: {// wxChildFocusEvent +case 175: {// wxChildFocusEvent evClass = (char*)"wxChildFocusEvent"; rt.addAtom((char*)"wxChildFocus"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 167: {// wxMenuEvent +case 176: {// wxMenuEvent evClass = (char*)"wxMenuEvent"; rt.addAtom((char*)"wxMenu"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 168: {// wxCloseEvent +case 177: {// wxCloseEvent evClass = (char*)"wxCloseEvent"; rt.addAtom((char*)"wxClose"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 169: {// wxShowEvent +case 178: {// wxShowEvent evClass = (char*)"wxShowEvent"; rt.addAtom((char*)"wxShow"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 170: {// wxIconizeEvent +case 179: {// wxIconizeEvent evClass = (char*)"wxIconizeEvent"; rt.addAtom((char*)"wxIconize"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 171: {// wxMaximizeEvent +case 180: {// wxMaximizeEvent evClass = (char*)"wxMaximizeEvent"; rt.addAtom((char*)"wxMaximize"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 172: {// wxJoystickEvent +case 181: {// wxJoystickEvent evClass = (char*)"wxJoystickEvent"; rt.addAtom((char*)"wxJoystick"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 173: {// wxUpdateUIEvent +case 182: {// wxUpdateUIEvent evClass = (char*)"wxUpdateUIEvent"; rt.addAtom((char*)"wxUpdateUI"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 174: {// wxSysColourChangedEvent +case 183: {// wxSysColourChangedEvent evClass = (char*)"wxSysColourChangedEvent"; rt.addAtom((char*)"wxSysColourChanged"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 175: {// wxMouseCaptureChangedEvent +case 184: {// wxMouseCaptureChangedEvent evClass = (char*)"wxMouseCaptureChangedEvent"; rt.addAtom((char*)"wxMouseCaptureChanged"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 176: {// wxDisplayChangedEvent +case 185: {// wxDisplayChangedEvent evClass = (char*)"wxDisplayChangedEvent"; rt.addAtom((char*)"wxDisplayChanged"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 177: {// wxPaletteChangedEvent +case 186: {// wxPaletteChangedEvent evClass = (char*)"wxPaletteChangedEvent"; rt.addAtom((char*)"wxPaletteChanged"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 178: {// wxQueryNewPaletteEvent +case 187: {// wxQueryNewPaletteEvent evClass = (char*)"wxQueryNewPaletteEvent"; rt.addAtom((char*)"wxQueryNewPalette"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 179: {// wxNavigationKeyEvent +case 188: {// wxNavigationKeyEvent wxNavigationKeyEvent * ev = (wxNavigationKeyEvent *) event; evClass = (char*)"wxNavigationKeyEvent"; rt.addAtom((char*)"wxNavigationKey"); @@ -550,42 +586,42 @@ rt.addTupleCount(4); break; } -case 180: {// wxWindowCreateEvent +case 189: {// wxWindowCreateEvent evClass = (char*)"wxWindowCreateEvent"; rt.addAtom((char*)"wxWindowCreate"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 181: {// wxWindowDestroyEvent +case 190: {// wxWindowDestroyEvent evClass = (char*)"wxWindowDestroyEvent"; rt.addAtom((char*)"wxWindowDestroy"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 182: {// wxHelpEvent +case 191: {// wxHelpEvent evClass = (char*)"wxHelpEvent"; rt.addAtom((char*)"wxHelp"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 183: {// wxContextMenuEvent +case 192: {// wxContextMenuEvent evClass = (char*)"wxContextMenuEvent"; rt.addAtom((char*)"wxContextMenu"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 184: {// wxIdleEvent +case 193: {// wxIdleEvent evClass = (char*)"wxIdleEvent"; rt.addAtom((char*)"wxIdle"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 185: {// wxGridEvent +case 194: {// wxGridEvent wxGridEvent * ev = (wxGridEvent *) event; evClass = (char*)"wxGridEvent"; rt.addAtom((char*)"wxGrid"); @@ -602,7 +638,7 @@ rt.addTupleCount(11); break; } -case 187: {// wxSashEvent +case 196: {// wxSashEvent wxSashEvent * ev = (wxSashEvent *) event; evClass = (char*)"wxSashEvent"; rt.addAtom((char*)"wxSash"); @@ -613,7 +649,7 @@ rt.addTupleCount(5); break; } -case 188: {// wxListEvent +case 197: {// wxListEvent wxListEvent * ev = (wxListEvent *) event; evClass = (char*)"wxListEvent"; rt.addAtom((char*)"wxList"); @@ -626,7 +662,7 @@ rt.addTupleCount(7); break; } -case 189: {// wxDateEvent +case 198: {// wxDateEvent wxDateEvent * ev = (wxDateEvent *) event; evClass = (char*)"wxDateEvent"; rt.addAtom((char*)"wxDate"); @@ -635,14 +671,14 @@ rt.addTupleCount(3); break; } -case 190: {// wxCalendarEvent +case 199: {// wxCalendarEvent evClass = (char*)"wxCalendarEvent"; rt.addAtom((char*)"wxCalendar"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 191: {// wxFileDirPickerEvent +case 200: {// wxFileDirPickerEvent wxFileDirPickerEvent * ev = (wxFileDirPickerEvent *) event; evClass = (char*)"wxFileDirPickerEvent"; rt.addAtom((char*)"wxFileDirPicker"); @@ -651,7 +687,7 @@ rt.addTupleCount(3); break; } -case 192: {// wxColourPickerEvent +case 201: {// wxColourPickerEvent wxColourPickerEvent * ev = (wxColourPickerEvent *) event; evClass = (char*)"wxColourPickerEvent"; rt.addAtom((char*)"wxColourPicker"); @@ -660,7 +696,7 @@ rt.addTupleCount(3); break; } -case 193: {// wxFontPickerEvent +case 202: {// wxFontPickerEvent wxFontPickerEvent * ev = (wxFontPickerEvent *) event; wxFont * GetFont = new wxFont(ev->GetFont()); app->newPtr((void *) GetFont,3, memenv); @@ -671,7 +707,7 @@ rt.addTupleCount(3); break; } -case 194: {// wxStyledTextEvent +case 203: {// wxStyledTextEvent wxStyledTextEvent * ev = (wxStyledTextEvent *) event; evClass = (char*)"wxStyledTextEvent"; rt.addAtom((char*)"wxStyledText"); @@ -699,7 +735,7 @@ rt.addTupleCount(22); break; } -case 199: {// wxTreeEvent +case 208: {// wxTreeEvent wxTreeEvent * ev = (wxTreeEvent *) event; evClass = (char*)"wxTreeEvent"; rt.addAtom((char*)"wxTree"); @@ -710,14 +746,14 @@ rt.addTupleCount(5); break; } -case 200: {// wxNotebookEvent +case 209: {// wxNotebookEvent evClass = (char*)"wxNotebookEvent"; rt.addAtom((char*)"wxNotebook"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } -case 206: {// wxSpinEvent +case 215: {// wxSpinEvent wxSpinEvent * ev = (wxSpinEvent *) event; evClass = (char*)"wxSpinEvent"; rt.addAtom((char*)"wxSpin"); @@ -726,13 +762,51 @@ rt.addTupleCount(3); break; } -case 208: {// wxSplitterEvent +case 217: {// wxSplitterEvent evClass = (char*)"wxSplitterEvent"; rt.addAtom((char*)"wxSplitter"); rt.addAtom(Etype->eName); rt.addTupleCount(2); break; } +case 219: {// wxHtmlLinkEvent + wxHtmlLinkEvent * ev = (wxHtmlLinkEvent *) event; + evClass = (char*)"wxHtmlLinkEvent"; + rt.addAtom((char*)"wxHtmlLink"); + rt.addAtom(Etype->eName); + rt.add(ev->GetLinkInfo()); + rt.addTupleCount(3); + break; +} +case 220: {// wxAuiNotebookEvent + wxAuiNotebookEvent * ev = (wxAuiNotebookEvent *) event; + wxAuiNotebook * GetDragSource = ev->GetDragSource(); + evClass = (char*)"wxAuiNotebookEvent"; + rt.addAtom((char*)"wxAuiNotebook"); + rt.addAtom(Etype->eName); + rt.addInt(ev->GetOldSelection()); + rt.addInt(ev->GetSelection()); + rt.addRef(getRef((void *)GetDragSource,memenv), "wxAuiNotebook"); + rt.addTupleCount(5); + break; +} +case 221: {// wxAuiManagerEvent + wxAuiManagerEvent * ev = (wxAuiManagerEvent *) event; + wxAuiManager * GetManager = ev->GetManager(); + wxAuiPaneInfo * GetPane = ev->GetPane(); + wxDC * GetDC = ev->GetDC(); + evClass = (char*)"wxAuiManagerEvent"; + rt.addAtom((char*)"wxAuiManager"); + rt.addAtom(Etype->eName); + rt.addRef(getRef((void *)GetManager,memenv), "wxAuiManager"); + rt.addRef(getRef((void *)GetPane,memenv), "wxAuiPaneInfo"); + rt.addInt(ev->GetButton()); + rt.addBool(ev->veto_flag); + rt.addBool(ev->canveto_flag); + rt.addRef(getRef((void *)GetDC,memenv), "wxDC"); + rt.addTupleCount(8); + break; +} } rt.addTupleCount(5); diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/gen/wxe_funcs.cpp erlang-13.b.3-dfsg/lib/wx/c_src/gen/wxe_funcs.cpp --- erlang-13.b.1-dfsg/lib/wx/c_src/gen/wxe_funcs.cpp 2009-06-05 13:54:30.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/gen/wxe_funcs.cpp 2009-11-20 13:34:36.000000000 +0000 @@ -39,8 +39,7 @@ delete This; } } break; case WXE_REGISTER_OBJECT: { - wxeErlTerm * term = new wxeErlTerm(Ecmd.bin[0]); - registerPid(bp, term, memenv); + registerPid(bp, Ecmd.caller, memenv); rt.addAtom("ok"); break; } @@ -4353,6 +4352,15 @@ rt.add(Result); break; } +case wxGridCellEditor_Create: { // wxGridCellEditor::Create + wxGridCellEditor *This = (wxGridCellEditor *) getPtr(bp,memenv); bp += 4; + wxWindow *parent = (wxWindow *) getPtr(bp,memenv); bp += 4; + int * id = (int *) bp; bp += 4; + wxEvtHandler *evtHandler = (wxEvtHandler *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + This->Create(parent,(wxWindowID) *id,evtHandler); + break; +} case wxGridCellEditor_IsCreated: { // wxGridCellEditor::IsCreated wxGridCellEditor *This = (wxGridCellEditor *) getPtr(bp,memenv); bp += 4; if(!This) throw wxe_badarg(0); @@ -4441,6 +4449,266 @@ This->HandleReturn(*event); break; } +case wxGridCellBoolRenderer_new: { // wxGridCellBoolRenderer::wxGridCellBoolRenderer + wxGridCellBoolRenderer * Result = new wxGridCellBoolRenderer(); + newPtr((void *) Result, 24, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxGridCellBoolRenderer"); + break; +} +case wxGridCellBoolRenderer_destroy: { // wxGridCellBoolRenderer::destroy + wxGridCellBoolRenderer *This = (wxGridCellBoolRenderer *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} +case wxGridCellBoolEditor_new: { // wxGridCellBoolEditor::wxGridCellBoolEditor + wxGridCellBoolEditor * Result = new wxGridCellBoolEditor(); + newPtr((void *) Result, 25, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxGridCellBoolEditor"); + break; +} +case wxGridCellBoolEditor_IsTrueValue: { // wxGridCellBoolEditor::IsTrueValue + int * valueLen = (int *) bp; bp += 4; + wxString value = wxString(bp, wxConvUTF8); + bp += *valueLen+((8-((4+ *valueLen) & 7)) & 7); + bool Result = wxGridCellBoolEditor::IsTrueValue(value); + rt.addBool(Result); + break; +} +case wxGridCellBoolEditor_UseStringValues: { // wxGridCellBoolEditor::UseStringValues + wxString valueTrue= _T("1"); + wxString valueFalse= wxEmptyString; + while( * (int*) bp) { switch (* (int*) bp) { + case 1: {bp += 4; + int * valueTrueLen = (int *) bp; bp += 4; + valueTrue = wxString(bp, wxConvUTF8); + bp += *valueTrueLen+((8-((0+ *valueTrueLen) & 7)) & 7); + } break; + case 2: {bp += 4; + int * valueFalseLen = (int *) bp; bp += 4; + valueFalse = wxString(bp, wxConvUTF8); + bp += *valueFalseLen+((8-((0+ *valueFalseLen) & 7)) & 7); + } break; + }}; + wxGridCellBoolEditor::UseStringValues(valueTrue,valueFalse); + break; +} +case wxGridCellBoolEditor_destroy: { // wxGridCellBoolEditor::destroy + wxGridCellBoolEditor *This = (wxGridCellBoolEditor *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} +case wxGridCellFloatRenderer_new: { // wxGridCellFloatRenderer::wxGridCellFloatRenderer + int width=-1; + int precision=-1; + while( * (int*) bp) { switch (* (int*) bp) { + case 1: {bp += 4; + width = (int)*(int *) bp; bp += 4; + } break; + case 2: {bp += 4; + precision = (int)*(int *) bp; bp += 4; + } break; + }}; + wxGridCellFloatRenderer * Result = new wxGridCellFloatRenderer(width,precision); + newPtr((void *) Result, 26, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxGridCellFloatRenderer"); + break; +} +case wxGridCellFloatRenderer_GetPrecision: { // wxGridCellFloatRenderer::GetPrecision + wxGridCellFloatRenderer *This = (wxGridCellFloatRenderer *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + int Result = This->GetPrecision(); + rt.addInt(Result); + break; +} +case wxGridCellFloatRenderer_GetWidth: { // wxGridCellFloatRenderer::GetWidth + wxGridCellFloatRenderer *This = (wxGridCellFloatRenderer *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + int Result = This->GetWidth(); + rt.addInt(Result); + break; +} +case wxGridCellFloatRenderer_SetParameters: { // wxGridCellFloatRenderer::SetParameters + wxGridCellFloatRenderer *This = (wxGridCellFloatRenderer *) getPtr(bp,memenv); bp += 4; + int * paramsLen = (int *) bp; bp += 4; + wxString params = wxString(bp, wxConvUTF8); + bp += *paramsLen+((8-((0+ *paramsLen) & 7)) & 7); + if(!This) throw wxe_badarg(0); + This->SetParameters(params); + break; +} +case wxGridCellFloatRenderer_SetPrecision: { // wxGridCellFloatRenderer::SetPrecision + wxGridCellFloatRenderer *This = (wxGridCellFloatRenderer *) getPtr(bp,memenv); bp += 4; + int * precision = (int *) bp; bp += 4; + if(!This) throw wxe_badarg(0); + This->SetPrecision((int) *precision); + break; +} +case wxGridCellFloatRenderer_SetWidth: { // wxGridCellFloatRenderer::SetWidth + wxGridCellFloatRenderer *This = (wxGridCellFloatRenderer *) getPtr(bp,memenv); bp += 4; + int * width = (int *) bp; bp += 4; + if(!This) throw wxe_badarg(0); + This->SetWidth((int) *width); + break; +} +case wxGridCellFloatRenderer_destroy: { // wxGridCellFloatRenderer::destroy + wxGridCellFloatRenderer *This = (wxGridCellFloatRenderer *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} +case wxGridCellFloatEditor_new: { // wxGridCellFloatEditor::wxGridCellFloatEditor + int width=-1; + int precision=-1; + while( * (int*) bp) { switch (* (int*) bp) { + case 1: {bp += 4; + width = (int)*(int *) bp; bp += 4; + } break; + case 2: {bp += 4; + precision = (int)*(int *) bp; bp += 4; + } break; + }}; + wxGridCellFloatEditor * Result = new wxGridCellFloatEditor(width,precision); + newPtr((void *) Result, 27, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxGridCellFloatEditor"); + break; +} +case wxGridCellFloatEditor_SetParameters: { // wxGridCellFloatEditor::SetParameters + wxGridCellFloatEditor *This = (wxGridCellFloatEditor *) getPtr(bp,memenv); bp += 4; + int * paramsLen = (int *) bp; bp += 4; + wxString params = wxString(bp, wxConvUTF8); + bp += *paramsLen+((8-((0+ *paramsLen) & 7)) & 7); + if(!This) throw wxe_badarg(0); + This->SetParameters(params); + break; +} +case wxGridCellFloatEditor_destroy: { // wxGridCellFloatEditor::destroy + wxGridCellFloatEditor *This = (wxGridCellFloatEditor *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} +case wxGridCellStringRenderer_new: { // wxGridCellStringRenderer::wxGridCellStringRenderer + wxGridCellStringRenderer * Result = new wxGridCellStringRenderer(); + newPtr((void *) Result, 28, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxGridCellStringRenderer"); + break; +} +case wxGridCellStringRenderer_destroy: { // wxGridCellStringRenderer::destroy + wxGridCellStringRenderer *This = (wxGridCellStringRenderer *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} +case wxGridCellTextEditor_new: { // wxGridCellTextEditor::wxGridCellTextEditor + wxGridCellTextEditor * Result = new wxGridCellTextEditor(); + newPtr((void *) Result, 29, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxGridCellTextEditor"); + break; +} +case wxGridCellTextEditor_SetParameters: { // wxGridCellTextEditor::SetParameters + wxGridCellTextEditor *This = (wxGridCellTextEditor *) getPtr(bp,memenv); bp += 4; + int * paramsLen = (int *) bp; bp += 4; + wxString params = wxString(bp, wxConvUTF8); + bp += *paramsLen+((8-((0+ *paramsLen) & 7)) & 7); + if(!This) throw wxe_badarg(0); + This->SetParameters(params); + break; +} +case wxGridCellTextEditor_destroy: { // wxGridCellTextEditor::destroy + wxGridCellTextEditor *This = (wxGridCellTextEditor *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} +case wxGridCellChoiceEditor_new: { // wxGridCellChoiceEditor::wxGridCellChoiceEditor + bool allowOthers=false; + int * choicesLen = (int *) bp; bp += 4; + wxArrayString choices; + int choicesASz = 0, * choicesTemp; + for(int i=0; i < *choicesLen; i++) { + choicesTemp = (int *) bp; bp += 4; + choices.Add(wxString(bp, wxConvUTF8)); + bp += *choicesTemp; + choicesASz += *choicesTemp+4; + } + bp += (8-((4+ choicesASz) & 7 )) & 7; + while( * (int*) bp) { switch (* (int*) bp) { + case 1: {bp += 4; + allowOthers = *(bool *) bp; bp += 4; + } break; + }}; + wxGridCellChoiceEditor * Result = new wxGridCellChoiceEditor(choices,allowOthers); + newPtr((void *) Result, 30, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxGridCellChoiceEditor"); + break; +} +case wxGridCellChoiceEditor_SetParameters: { // wxGridCellChoiceEditor::SetParameters + wxGridCellChoiceEditor *This = (wxGridCellChoiceEditor *) getPtr(bp,memenv); bp += 4; + int * paramsLen = (int *) bp; bp += 4; + wxString params = wxString(bp, wxConvUTF8); + bp += *paramsLen+((8-((0+ *paramsLen) & 7)) & 7); + if(!This) throw wxe_badarg(0); + This->SetParameters(params); + break; +} +case wxGridCellChoiceEditor_destroy: { // wxGridCellChoiceEditor::destroy + wxGridCellChoiceEditor *This = (wxGridCellChoiceEditor *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} +case wxGridCellNumberRenderer_new: { // wxGridCellNumberRenderer::wxGridCellNumberRenderer + wxGridCellNumberRenderer * Result = new wxGridCellNumberRenderer(); + newPtr((void *) Result, 31, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxGridCellNumberRenderer"); + break; +} +case wxGridCellNumberRenderer_destroy: { // wxGridCellNumberRenderer::destroy + wxGridCellNumberRenderer *This = (wxGridCellNumberRenderer *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} +case wxGridCellNumberEditor_new: { // wxGridCellNumberEditor::wxGridCellNumberEditor + int min=-1; + int max=-1; + while( * (int*) bp) { switch (* (int*) bp) { + case 1: {bp += 4; + min = (int)*(int *) bp; bp += 4; + } break; + case 2: {bp += 4; + max = (int)*(int *) bp; bp += 4; + } break; + }}; + wxGridCellNumberEditor * Result = new wxGridCellNumberEditor(min,max); + newPtr((void *) Result, 32, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxGridCellNumberEditor"); + break; +} +case wxGridCellNumberEditor_GetValue: { // wxGridCellNumberEditor::GetValue + wxGridCellNumberEditor *This = (wxGridCellNumberEditor *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxString Result = This->GetValue(); + rt.add(Result); + break; +} +case wxGridCellNumberEditor_SetParameters: { // wxGridCellNumberEditor::SetParameters + wxGridCellNumberEditor *This = (wxGridCellNumberEditor *) getPtr(bp,memenv); bp += 4; + int * paramsLen = (int *) bp; bp += 4; + wxString params = wxString(bp, wxConvUTF8); + bp += *paramsLen+((8-((0+ *paramsLen) & 7)) & 7); + if(!This) throw wxe_badarg(0); + This->SetParameters(params); + break; +} +case wxGridCellNumberEditor_destroy: { // wxGridCellNumberEditor::destroy + wxGridCellNumberEditor *This = (wxGridCellNumberEditor *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} case wxGridCellAttr_SetTextColour: { // wxGridCellAttr::SetTextColour wxGridCellAttr *This = (wxGridCellAttr *) getPtr(bp,memenv); bp += 4; int * colTextR = (int *) bp; bp += 4; @@ -8933,7 +9201,7 @@ } case wxIconBundle_new_0: { // wxIconBundle::wxIconBundle wxIconBundle * Result = new wxIconBundle(); - newPtr((void *) Result, 52, memenv); + newPtr((void *) Result, 61, memenv); rt.addRef(getRef((void *)Result,memenv), "wxIconBundle"); break; } @@ -8943,21 +9211,21 @@ bp += *fileLen+((8-((4+ *fileLen) & 7)) & 7); int * type = (int *) bp; bp += 4; wxIconBundle * Result = new wxIconBundle(file,(long) *type); - newPtr((void *) Result, 52, memenv); + newPtr((void *) Result, 61, memenv); rt.addRef(getRef((void *)Result,memenv), "wxIconBundle"); break; } case wxIconBundle_new_1_0: { // wxIconBundle::wxIconBundle wxIcon *icon = (wxIcon *) getPtr(bp,memenv); bp += 4; wxIconBundle * Result = new wxIconBundle(*icon); - newPtr((void *) Result, 52, memenv); + newPtr((void *) Result, 61, memenv); rt.addRef(getRef((void *)Result,memenv), "wxIconBundle"); break; } case wxIconBundle_new_1_1: { // wxIconBundle::wxIconBundle wxIconBundle * ic = (wxIconBundle *) getPtr(bp,memenv); bp += 4; wxIconBundle * Result = new wxIconBundle(*ic); - newPtr((void *) Result, 52, memenv); + newPtr((void *) Result, 61, memenv); rt.addRef(getRef((void *)Result,memenv), "wxIconBundle"); break; } @@ -10524,14 +10792,14 @@ } break; }}; wxAcceleratorEntry * Result = new wxAcceleratorEntry(flags,keyCode,cmd,item); - newPtr((void *) Result, 60, memenv); + newPtr((void *) Result, 69, memenv); rt.addRef(getRef((void *)Result,memenv), "wxAcceleratorEntry"); break; } case wxAcceleratorEntry_new_1_1: { // wxAcceleratorEntry::wxAcceleratorEntry wxAcceleratorEntry *entry = (wxAcceleratorEntry *) getPtr(bp,memenv); bp += 4; wxAcceleratorEntry * Result = new wxAcceleratorEntry(*entry); - newPtr((void *) Result, 60, memenv); + newPtr((void *) Result, 69, memenv); rt.addRef(getRef((void *)Result,memenv), "wxAcceleratorEntry"); break; } @@ -10582,7 +10850,7 @@ int * width = (int *) bp; bp += 4; int * height = (int *) bp; bp += 4; wxCaret * Result = new EwxCaret(window,(int) *width,(int) *height); - newPtr((void *) Result, 61, memenv); + newPtr((void *) Result, 70, memenv); rt.addRef(getRef((void *)Result,memenv), "wxCaret"); break; } @@ -10592,7 +10860,7 @@ int * sizeH = (int *) bp; bp += 4; wxSize size = wxSize(*sizeW,*sizeH); wxCaret * Result = new EwxCaret(window,size); - newPtr((void *) Result, 61, memenv); + newPtr((void *) Result, 70, memenv); rt.addRef(getRef((void *)Result,memenv), "wxCaret"); break; } @@ -11530,7 +11798,7 @@ } break; }}; wxSizerFlags * Result = new wxSizerFlags(proportion); - newPtr((void *) Result, 63, memenv); + newPtr((void *) Result, 72, memenv); rt.addRef(getRef((void *)Result,memenv), "wxSizerFlags"); break; } @@ -13445,7 +13713,7 @@ } case wxCalendarDateAttr_new_0: { // wxCalendarDateAttr::wxCalendarDateAttr wxCalendarDateAttr * Result = new wxCalendarDateAttr(); - newPtr((void *) Result, 79, memenv); + newPtr((void *) Result, 88, memenv); rt.addRef(getRef((void *)Result,memenv), "wxCalendarDateAttr"); break; } @@ -13484,7 +13752,7 @@ } break; }}; wxCalendarDateAttr * Result = new wxCalendarDateAttr(colText,colBack,colBorder,*font,(wxCalendarDateBorder) border); - newPtr((void *) Result, 79, memenv); + newPtr((void *) Result, 88, memenv); rt.addRef(getRef((void *)Result,memenv), "wxCalendarDateAttr"); break; } @@ -13503,7 +13771,7 @@ } break; }}; wxCalendarDateAttr * Result = new wxCalendarDateAttr((wxCalendarDateBorder) border,colBorder); - newPtr((void *) Result, 79, memenv); + newPtr((void *) Result, 88, memenv); rt.addRef(getRef((void *)Result,memenv), "wxCalendarDateAttr"); break; } @@ -15532,6 +15800,29 @@ This->SetWindowStyleFlag((long) *style); break; } + +case wxListCtrl_SortItems: { // wxListCtrl::SortItems taylormade + wxListCtrl *This = (wxListCtrl *) getPtr(bp,memenv); bp += 4; + int sortCallback=*(int *) bp; bp += 4; + if(!This) throw wxe_badarg(0); + + callbackInfo* cb = new callbackInfo(); + cb->port = Ecmd.port; + cb->callbackID = sortCallback; + bool Result = This->SortItems(wxEListCtrlCompare, (long)cb); + delete cb; + + /* Destroy the callback, see wxEPrintout::clear_cb */ + wxeReturn cbrt = wxeReturn(WXE_DRV_PORT, memenv->owner, false); + // NOTE: Remove this later when changing from funs to gen_server + cbrt.addAtom("wx_delete_cb"); + cbrt.addInt(sortCallback); + cbrt.addTupleCount(2); + cbrt.send(); + + rt.addBool(Result); + break; +} case wxListView_ClearColumnImage: { // wxListView::ClearColumnImage wxListView *This = (wxListView *) getPtr(bp,memenv); bp += 4; int * col = (int *) bp; bp += 4; @@ -15955,7 +16246,7 @@ } case wxTextAttr_new_0: { // wxTextAttr::wxTextAttr wxTextAttr * Result = new wxTextAttr(); - newPtr((void *) Result, 93, memenv); + newPtr((void *) Result, 102, memenv); rt.addRef(getRef((void *)Result,memenv), "wxTextAttr"); break; } @@ -15985,7 +16276,7 @@ } break; }}; wxTextAttr * Result = new wxTextAttr(colText,colBack,*font,(wxTextAttrAlignment) alignment); - newPtr((void *) Result, 93, memenv); + newPtr((void *) Result, 102, memenv); rt.addRef(getRef((void *)Result,memenv), "wxTextAttr"); break; } @@ -23388,6 +23679,25 @@ } #endif // wxUSE_AUI #if wxUSE_AUI +case wxAuiPaneInfo_new_0: { // wxAuiPaneInfo::wxAuiPaneInfo + wxAuiPaneInfo * Result = new wxAuiPaneInfo(); + newPtr((void *) Result, 154, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxAuiPaneInfo"); + break; +} +case wxAuiPaneInfo_new_1: { // wxAuiPaneInfo::wxAuiPaneInfo + wxAuiPaneInfo *c = (wxAuiPaneInfo *) getPtr(bp,memenv); bp += 4; + wxAuiPaneInfo * Result = new wxAuiPaneInfo(*c); + newPtr((void *) Result, 154, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxAuiPaneInfo"); + break; +} +case wxAuiPaneInfo_destruct: { // wxAuiPaneInfo::~wxAuiPaneInfo + wxAuiPaneInfo *This = (wxAuiPaneInfo *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} case wxAuiPaneInfo_BestSize_1: { // wxAuiPaneInfo::BestSize wxAuiPaneInfo *This = (wxAuiPaneInfo *) getPtr(bp,memenv); bp += 4; int * sizeW = (int *) bp; bp += 4; @@ -29921,7 +30231,7 @@ } case wxFileDataObject_new: { // wxFileDataObject::wxFileDataObject wxFileDataObject * Result = new wxFileDataObject(); - newPtr((void *) Result, 202, memenv); + newPtr((void *) Result, 211, memenv); rt.addRef(getRef((void *)Result,memenv), "wxFileDataObject"); break; } @@ -29957,7 +30267,7 @@ } break; }}; wxTextDataObject * Result = new wxTextDataObject(text); - newPtr((void *) Result, 203, memenv); + newPtr((void *) Result, 212, memenv); rt.addRef(getRef((void *)Result,memenv), "wxTextDataObject"); break; } @@ -29993,7 +30303,7 @@ case wxBitmapDataObject_new_1_1: { // wxBitmapDataObject::wxBitmapDataObject wxBitmap *bitmap = (wxBitmap *) getPtr(bp,memenv); bp += 4; wxBitmapDataObject * Result = new wxBitmapDataObject(*bitmap); - newPtr((void *) Result, 204, memenv); + newPtr((void *) Result, 213, memenv); rt.addRef(getRef((void *)Result,memenv), "wxBitmapDataObject"); break; } @@ -30005,7 +30315,7 @@ } break; }}; wxBitmapDataObject * Result = new wxBitmapDataObject(*bitmap); - newPtr((void *) Result, 204, memenv); + newPtr((void *) Result, 213, memenv); rt.addRef(getRef((void *)Result,memenv), "wxBitmapDataObject"); break; } @@ -30396,11 +30706,384 @@ This->SetSashPosition((int) *pos); break; } +case wxHtmlWindow_new_0: { // wxHtmlWindow::wxHtmlWindow + wxHtmlWindow * Result = new EwxHtmlWindow(); + newPtr((void *) Result, 0, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxHtmlWindow"); + break; +} +case wxHtmlWindow_new_2: { // wxHtmlWindow::wxHtmlWindow + wxWindowID id=wxID_ANY; + wxPoint pos= wxDefaultPosition; + wxSize size= wxDefaultSize; + long style=0x0004; + wxWindow *parent = (wxWindow *) getPtr(bp,memenv); bp += 4; + bp += 4; /* Align */ + while( * (int*) bp) { switch (* (int*) bp) { + case 1: {bp += 4; + id = (wxWindowID)*(int *) bp; bp += 4; + } break; + case 2: {bp += 4; + int * posX = (int *) bp; bp += 4; + int * posY = (int *) bp; bp += 4; + pos = wxPoint(*posX,*posY); + bp += 4; /* Align */ + } break; + case 3: {bp += 4; + int * sizeW = (int *) bp; bp += 4; + int * sizeH = (int *) bp; bp += 4; + size = wxSize(*sizeW,*sizeH); + bp += 4; /* Align */ + } break; + case 4: {bp += 4; + style = (long)*(int *) bp; bp += 4; + } break; + }}; + wxHtmlWindow * Result = new EwxHtmlWindow(parent,id,pos,size,style); + newPtr((void *) Result, 0, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxHtmlWindow"); + break; +} +case wxHtmlWindow_AppendToPage: { // wxHtmlWindow::AppendToPage + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + int * sourceLen = (int *) bp; bp += 4; + wxString source = wxString(bp, wxConvUTF8); + bp += *sourceLen+((8-((0+ *sourceLen) & 7)) & 7); + if(!This) throw wxe_badarg(0); + bool Result = This->AppendToPage(source); + rt.addBool(Result); + break; +} +case wxHtmlWindow_GetOpenedAnchor: { // wxHtmlWindow::GetOpenedAnchor + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxString Result = This->GetOpenedAnchor(); + rt.add(Result); + break; +} +case wxHtmlWindow_GetOpenedPage: { // wxHtmlWindow::GetOpenedPage + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxString Result = This->GetOpenedPage(); + rt.add(Result); + break; +} +case wxHtmlWindow_GetOpenedPageTitle: { // wxHtmlWindow::GetOpenedPageTitle + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxString Result = This->GetOpenedPageTitle(); + rt.add(Result); + break; +} +case wxHtmlWindow_GetRelatedFrame: { // wxHtmlWindow::GetRelatedFrame + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxFrame * Result = (wxFrame*)This->GetRelatedFrame(); + rt.addRef(getRef((void *)Result,memenv), "wxFrame"); + break; +} +case wxHtmlWindow_HistoryBack: { // wxHtmlWindow::HistoryBack + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + bool Result = This->HistoryBack(); + rt.addBool(Result); + break; +} +case wxHtmlWindow_HistoryCanBack: { // wxHtmlWindow::HistoryCanBack + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + bool Result = This->HistoryCanBack(); + rt.addBool(Result); + break; +} +case wxHtmlWindow_HistoryCanForward: { // wxHtmlWindow::HistoryCanForward + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + bool Result = This->HistoryCanForward(); + rt.addBool(Result); + break; +} +case wxHtmlWindow_HistoryClear: { // wxHtmlWindow::HistoryClear + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + This->HistoryClear(); + break; +} +case wxHtmlWindow_HistoryForward: { // wxHtmlWindow::HistoryForward + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + bool Result = This->HistoryForward(); + rt.addBool(Result); + break; +} +case wxHtmlWindow_LoadFile: { // wxHtmlWindow::LoadFile + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + int * filenameLen = (int *) bp; bp += 4; + wxString filenameStr = wxString(bp, wxConvUTF8); + bp += *filenameLen+((8-((0+ *filenameLen) & 7)) & 7); + wxFileName filename = wxFileName(filenameStr); + if(!This) throw wxe_badarg(0); + bool Result = This->LoadFile(filename); + rt.addBool(Result); + break; +} +case wxHtmlWindow_LoadPage: { // wxHtmlWindow::LoadPage + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + int * locationLen = (int *) bp; bp += 4; + wxString location = wxString(bp, wxConvUTF8); + bp += *locationLen+((8-((0+ *locationLen) & 7)) & 7); + if(!This) throw wxe_badarg(0); + bool Result = This->LoadPage(location); + rt.addBool(Result); + break; +} +case wxHtmlWindow_SelectAll: { // wxHtmlWindow::SelectAll + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + This->SelectAll(); + break; +} +case wxHtmlWindow_SelectionToText: { // wxHtmlWindow::SelectionToText + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxString Result = This->SelectionToText(); + rt.add(Result); + break; +} +case wxHtmlWindow_SelectLine: { // wxHtmlWindow::SelectLine + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + int * posX = (int *) bp; bp += 4; + int * posY = (int *) bp; bp += 4; + wxPoint pos = wxPoint(*posX,*posY); + if(!This) throw wxe_badarg(0); + This->SelectLine(pos); + break; +} +case wxHtmlWindow_SelectWord: { // wxHtmlWindow::SelectWord + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + int * posX = (int *) bp; bp += 4; + int * posY = (int *) bp; bp += 4; + wxPoint pos = wxPoint(*posX,*posY); + if(!This) throw wxe_badarg(0); + This->SelectWord(pos); + break; +} +case wxHtmlWindow_SetBorders: { // wxHtmlWindow::SetBorders + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + int * b = (int *) bp; bp += 4; + if(!This) throw wxe_badarg(0); + This->SetBorders((int) *b); + break; +} +case wxHtmlWindow_SetFonts: { // wxHtmlWindow::SetFonts + int *sizes=NULL; + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + int * normal_faceLen = (int *) bp; bp += 4; + wxString normal_face = wxString(bp, wxConvUTF8); + bp += *normal_faceLen+((8-((0+ *normal_faceLen) & 7)) & 7); + int * fixed_faceLen = (int *) bp; bp += 4; + wxString fixed_face = wxString(bp, wxConvUTF8); + bp += *fixed_faceLen+((8-((4+ *fixed_faceLen) & 7)) & 7); + while( * (int*) bp) { switch (* (int*) bp) { + case 1: {bp += 4; + sizes = (int *) bp; bp += 4; + } break; + }}; + if(!This) throw wxe_badarg(0); + This->SetFonts(normal_face,fixed_face,sizes); + break; +} +case wxHtmlWindow_SetPage: { // wxHtmlWindow::SetPage + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + int * sourceLen = (int *) bp; bp += 4; + wxString source = wxString(bp, wxConvUTF8); + bp += *sourceLen+((8-((0+ *sourceLen) & 7)) & 7); + if(!This) throw wxe_badarg(0); + bool Result = This->SetPage(source); + rt.addBool(Result); + break; +} +case wxHtmlWindow_SetRelatedFrame: { // wxHtmlWindow::SetRelatedFrame + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + wxFrame *frame = (wxFrame *) getPtr(bp,memenv); bp += 4; + int * formatLen = (int *) bp; bp += 4; + wxString format = wxString(bp, wxConvUTF8); + bp += *formatLen+((8-((4+ *formatLen) & 7)) & 7); + if(!This) throw wxe_badarg(0); + This->SetRelatedFrame(frame,format); + break; +} +case wxHtmlWindow_SetRelatedStatusBar: { // wxHtmlWindow::SetRelatedStatusBar + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + int * bar = (int *) bp; bp += 4; + if(!This) throw wxe_badarg(0); + This->SetRelatedStatusBar((int) *bar); + break; +} +case wxHtmlWindow_ToText: { // wxHtmlWindow::ToText + wxHtmlWindow *This = (wxHtmlWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxString Result = This->ToText(); + rt.add(Result); + break; +} +case wxHtmlLinkEvent_GetLinkInfo: { // wxHtmlLinkEvent::GetLinkInfo + wxHtmlLinkEvent *This = (wxHtmlLinkEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + const wxHtmlLinkInfo * Result = &This->GetLinkInfo(); + rt.add(Result); + break; +} +case wxAuiNotebookEvent_SetSelection: { // wxAuiNotebookEvent::SetSelection + wxAuiNotebookEvent *This = (wxAuiNotebookEvent *) getPtr(bp,memenv); bp += 4; + int * s = (int *) bp; bp += 4; + if(!This) throw wxe_badarg(0); + This->SetSelection((int) *s); + break; +} +case wxAuiNotebookEvent_GetSelection: { // wxAuiNotebookEvent::GetSelection + wxAuiNotebookEvent *This = (wxAuiNotebookEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + int Result = This->GetSelection(); + rt.addInt(Result); + break; +} +case wxAuiNotebookEvent_SetOldSelection: { // wxAuiNotebookEvent::SetOldSelection + wxAuiNotebookEvent *This = (wxAuiNotebookEvent *) getPtr(bp,memenv); bp += 4; + int * s = (int *) bp; bp += 4; + if(!This) throw wxe_badarg(0); + This->SetOldSelection((int) *s); + break; +} +case wxAuiNotebookEvent_GetOldSelection: { // wxAuiNotebookEvent::GetOldSelection + wxAuiNotebookEvent *This = (wxAuiNotebookEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + int Result = This->GetOldSelection(); + rt.addInt(Result); + break; +} +case wxAuiNotebookEvent_SetDragSource: { // wxAuiNotebookEvent::SetDragSource + wxAuiNotebookEvent *This = (wxAuiNotebookEvent *) getPtr(bp,memenv); bp += 4; + wxAuiNotebook *s = (wxAuiNotebook *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + This->SetDragSource(s); + break; +} +case wxAuiNotebookEvent_GetDragSource: { // wxAuiNotebookEvent::GetDragSource + wxAuiNotebookEvent *This = (wxAuiNotebookEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxAuiNotebook * Result = (wxAuiNotebook*)This->GetDragSource(); + rt.addRef(getRef((void *)Result,memenv), "wxAuiNotebook"); + break; +} +case wxAuiManagerEvent_SetManager: { // wxAuiManagerEvent::SetManager + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + wxAuiManager *mgr = (wxAuiManager *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + This->SetManager(mgr); + break; +} +case wxAuiManagerEvent_GetManager: { // wxAuiManagerEvent::GetManager + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxAuiManager * Result = (wxAuiManager*)This->GetManager(); + rt.addRef(getRef((void *)Result,memenv), "wxAuiManager"); + break; +} +case wxAuiManagerEvent_SetPane: { // wxAuiManagerEvent::SetPane + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + wxAuiPaneInfo *p = (wxAuiPaneInfo *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + This->SetPane(p); + break; +} +case wxAuiManagerEvent_GetPane: { // wxAuiManagerEvent::GetPane + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxAuiPaneInfo * Result = (wxAuiPaneInfo*)This->GetPane(); + rt.addRef(getRef((void *)Result,memenv), "wxAuiPaneInfo"); + break; +} +case wxAuiManagerEvent_SetButton: { // wxAuiManagerEvent::SetButton + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + int * b = (int *) bp; bp += 4; + if(!This) throw wxe_badarg(0); + This->SetButton((int) *b); + break; +} +case wxAuiManagerEvent_GetButton: { // wxAuiManagerEvent::GetButton + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + int Result = This->GetButton(); + rt.addInt(Result); + break; +} +case wxAuiManagerEvent_SetDC: { // wxAuiManagerEvent::SetDC + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + wxDC *pdc = (wxDC *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + This->SetDC(pdc); + break; +} +case wxAuiManagerEvent_GetDC: { // wxAuiManagerEvent::GetDC + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxDC * Result = (wxDC*)This->GetDC(); + rt.addRef(getRef((void *)Result,memenv), "wxDC"); + break; +} +case wxAuiManagerEvent_Veto: { // wxAuiManagerEvent::Veto + bool veto=true; + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + bp += 4; /* Align */ + while( * (int*) bp) { switch (* (int*) bp) { + case 1: {bp += 4; + veto = *(bool *) bp; bp += 4; + } break; + }}; + if(!This) throw wxe_badarg(0); + This->Veto(veto); + break; +} +case wxAuiManagerEvent_GetVeto: { // wxAuiManagerEvent::GetVeto + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + bool Result = This->GetVeto(); + rt.addBool(Result); + break; +} +case wxAuiManagerEvent_SetCanVeto: { // wxAuiManagerEvent::SetCanVeto + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + bool * can_veto = (bool *) bp; bp += 4; + if(!This) throw wxe_badarg(0); + This->SetCanVeto((bool) *can_veto); + break; +} +case wxAuiManagerEvent_CanVeto: { // wxAuiManagerEvent::CanVeto + wxAuiManagerEvent *This = (wxAuiManagerEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + bool Result = This->CanVeto(); + rt.addBool(Result); + break; +} +case wxLogNull_new: { // wxLogNull::wxLogNull + wxLogNull * Result = new wxLogNull(); + newPtr((void *) Result, 222, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxLogNull"); + break; +} +case wxLogNull_destroy: { // wxLogNull::destroy + wxLogNull *This = (wxLogNull *) getPtr(bp,memenv); bp += 4; + if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This); + delete This;} + break; +} default: { wxeReturn error = wxeReturn(WXE_DRV_PORT, Ecmd.caller, false); error.addAtom("_wxe_error_"); error.addInt((int) Ecmd.op); - error.addAtom("undef"); + error.addAtom("not_supported"); error.addTupleCount(3); + error.send(); return ; } } // switch diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/gen/wxe_macros.h erlang-13.b.3-dfsg/lib/wx/c_src/gen/wxe_macros.h --- erlang-13.b.1-dfsg/lib/wx/c_src/gen/wxe_macros.h 2009-06-05 13:54:29.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/gen/wxe_macros.h 2009-11-20 13:34:35.000000000 +0000 @@ -57,6 +57,9 @@ #include #include #include +#include +#include +#include #define wxEvtHandler_Connect 100 @@ -501,2734 +504,2815 @@ #define wxGrid_YToRow 557 #define wxGridCellRenderer_Draw 558 #define wxGridCellRenderer_GetBestSize 559 -#define wxGridCellEditor_IsCreated 560 -#define wxGridCellEditor_SetSize 561 -#define wxGridCellEditor_Show 562 -#define wxGridCellEditor_PaintBackground 563 -#define wxGridCellEditor_BeginEdit 564 -#define wxGridCellEditor_EndEdit 565 -#define wxGridCellEditor_Reset 566 -#define wxGridCellEditor_StartingKey 567 -#define wxGridCellEditor_StartingClick 568 -#define wxGridCellEditor_HandleReturn 569 -#define wxGridCellAttr_SetTextColour 570 -#define wxGridCellAttr_SetBackgroundColour 571 -#define wxGridCellAttr_SetFont 572 -#define wxGridCellAttr_SetAlignment 573 -#define wxGridCellAttr_SetReadOnly 574 -#define wxGridCellAttr_SetRenderer 575 -#define wxGridCellAttr_SetEditor 576 -#define wxGridCellAttr_HasTextColour 577 -#define wxGridCellAttr_HasBackgroundColour 578 -#define wxGridCellAttr_HasFont 579 -#define wxGridCellAttr_HasAlignment 580 -#define wxGridCellAttr_HasRenderer 581 -#define wxGridCellAttr_HasEditor 582 -#define wxGridCellAttr_GetTextColour 583 -#define wxGridCellAttr_GetBackgroundColour 584 -#define wxGridCellAttr_GetFont 585 -#define wxGridCellAttr_GetAlignment 586 -#define wxGridCellAttr_GetRenderer 587 -#define wxGridCellAttr_GetEditor 588 -#define wxGridCellAttr_IsReadOnly 589 -#define wxGridCellAttr_SetDefAttr 590 -#define wxDC_Blit 591 -#define wxDC_CalcBoundingBox 592 -#define wxDC_Clear 593 -#define wxDC_ComputeScaleAndOrigin 594 -#define wxDC_CrossHair 595 -#define wxDC_DestroyClippingRegion 596 -#define wxDC_DeviceToLogicalX 597 -#define wxDC_DeviceToLogicalXRel 598 -#define wxDC_DeviceToLogicalY 599 -#define wxDC_DeviceToLogicalYRel 600 -#define wxDC_DrawArc 601 -#define wxDC_DrawBitmap 602 -#define wxDC_DrawCheckMark 603 -#define wxDC_DrawCircle 604 -#define wxDC_DrawEllipse_2 606 -#define wxDC_DrawEllipse_1 607 -#define wxDC_DrawEllipticArc 608 -#define wxDC_DrawIcon 609 -#define wxDC_DrawLabel 610 -#define wxDC_DrawLine 611 -#define wxDC_DrawLines 612 -#define wxDC_DrawPolygon 614 -#define wxDC_DrawPoint 616 -#define wxDC_DrawRectangle_2 618 -#define wxDC_DrawRectangle_1 619 -#define wxDC_DrawRotatedText 620 -#define wxDC_DrawRoundedRectangle_3 622 -#define wxDC_DrawRoundedRectangle_2 623 -#define wxDC_DrawText 624 -#define wxDC_EndDoc 625 -#define wxDC_EndPage 626 -#define wxDC_FloodFill 627 -#define wxDC_GetBackground 628 -#define wxDC_GetBackgroundMode 629 -#define wxDC_GetBrush 630 -#define wxDC_GetCharHeight 631 -#define wxDC_GetCharWidth 632 -#define wxDC_GetClippingBox 633 -#define wxDC_GetFont 634 -#define wxDC_GetLayoutDirection 635 -#define wxDC_GetLogicalFunction 636 -#define wxDC_GetMapMode 637 -#define wxDC_GetMultiLineTextExtent_4 638 -#define wxDC_GetMultiLineTextExtent_1 639 -#define wxDC_GetPartialTextExtents 640 -#define wxDC_GetPen 641 -#define wxDC_GetPixel 642 -#define wxDC_GetPPI 643 -#define wxDC_GetSize 645 -#define wxDC_GetSizeMM 647 -#define wxDC_GetTextBackground 648 -#define wxDC_GetTextExtent_4 649 -#define wxDC_GetTextExtent_1 650 -#define wxDC_GetTextForeground 652 -#define wxDC_GetUserScale 653 -#define wxDC_GradientFillConcentric_3 654 -#define wxDC_GradientFillConcentric_4 655 -#define wxDC_GradientFillLinear 656 -#define wxDC_LogicalToDeviceX 657 -#define wxDC_LogicalToDeviceXRel 658 -#define wxDC_LogicalToDeviceY 659 -#define wxDC_LogicalToDeviceYRel 660 -#define wxDC_MaxX 661 -#define wxDC_MaxY 662 -#define wxDC_MinX 663 -#define wxDC_MinY 664 -#define wxDC_IsOk 665 -#define wxDC_ResetBoundingBox 666 -#define wxDC_SetAxisOrientation 667 -#define wxDC_SetBackground 668 -#define wxDC_SetBackgroundMode 669 -#define wxDC_SetBrush 670 -#define wxDC_SetClippingRegion_2 672 -#define wxDC_SetClippingRegion_1_1 673 -#define wxDC_SetClippingRegion_1_0 674 -#define wxDC_SetDeviceOrigin 675 -#define wxDC_SetFont 676 -#define wxDC_SetLayoutDirection 677 -#define wxDC_SetLogicalFunction 678 -#define wxDC_SetMapMode 679 -#define wxDC_SetPalette 680 -#define wxDC_SetPen 681 -#define wxDC_SetTextBackground 682 -#define wxDC_SetTextForeground 683 -#define wxDC_SetUserScale 684 -#define wxDC_StartDoc 685 -#define wxDC_StartPage 686 -#define wxMirrorDC_new 687 -#define wxMirrorDC_destroy 688 -#define wxScreenDC_new 689 -#define wxScreenDC_destruct 690 -#define wxPostScriptDC_new_0 691 -#define wxPostScriptDC_new_1 692 -#define wxPostScriptDC_destruct 693 -#define wxPostScriptDC_SetResolution 694 -#define wxPostScriptDC_GetResolution 695 -#define wxWindowDC_new_0 696 -#define wxWindowDC_new_1 697 -#define wxWindowDC_destruct 698 -#define wxClientDC_new_0 699 -#define wxClientDC_new_1 700 -#define wxClientDC_destroy 701 -#define wxPaintDC_new_0 702 -#define wxPaintDC_new_1 703 -#define wxPaintDC_destroy 704 -#define wxMemoryDC_new_1_0 706 -#define wxMemoryDC_new_1_1 707 -#define wxMemoryDC_new_0 708 -#define wxMemoryDC_destruct 710 -#define wxMemoryDC_SelectObject 711 -#define wxMemoryDC_SelectObjectAsSource 712 -#define wxBufferedDC_new_0 713 -#define wxBufferedDC_new_2 714 -#define wxBufferedDC_new_3 715 -#define wxBufferedDC_destruct 716 -#define wxBufferedDC_Init_2 717 -#define wxBufferedDC_Init_3 718 -#define wxBufferedPaintDC_new_3 719 -#define wxBufferedPaintDC_new_2 720 -#define wxBufferedPaintDC_destruct 721 -#define wxGraphicsObject_GetRenderer 722 -#define wxGraphicsObject_IsNull 723 -#define wxGraphicsContext_Create_1_1 724 -#define wxGraphicsContext_Create_1_0 725 -#define wxGraphicsContext_Create_0 726 -#define wxGraphicsContext_CreatePen 727 -#define wxGraphicsContext_CreateBrush 728 -#define wxGraphicsContext_CreateRadialGradientBrush 729 -#define wxGraphicsContext_CreateLinearGradientBrush 730 -#define wxGraphicsContext_CreateFont 731 -#define wxGraphicsContext_CreateMatrix 732 -#define wxGraphicsContext_CreatePath 733 -#define wxGraphicsContext_Clip_1 734 -#define wxGraphicsContext_Clip_4 735 -#define wxGraphicsContext_ResetClip 736 -#define wxGraphicsContext_DrawBitmap 737 -#define wxGraphicsContext_DrawEllipse 738 -#define wxGraphicsContext_DrawIcon 739 -#define wxGraphicsContext_DrawLines 740 -#define wxGraphicsContext_DrawPath 741 -#define wxGraphicsContext_DrawRectangle 742 -#define wxGraphicsContext_DrawRoundedRectangle 743 -#define wxGraphicsContext_DrawText_3 744 -#define wxGraphicsContext_DrawText_4_0 745 -#define wxGraphicsContext_DrawText_4_1 746 -#define wxGraphicsContext_DrawText_5 747 -#define wxGraphicsContext_FillPath 748 -#define wxGraphicsContext_StrokePath 749 -#define wxGraphicsContext_GetNativeContext 750 -#define wxGraphicsContext_GetPartialTextExtents 751 -#define wxGraphicsContext_GetTextExtent 752 -#define wxGraphicsContext_Rotate 753 -#define wxGraphicsContext_Scale 754 -#define wxGraphicsContext_Translate 755 -#define wxGraphicsContext_GetTransform 756 -#define wxGraphicsContext_SetTransform 757 -#define wxGraphicsContext_ConcatTransform 758 -#define wxGraphicsContext_SetBrush_1_1 759 -#define wxGraphicsContext_SetBrush_1_0 760 -#define wxGraphicsContext_SetFont_1 761 -#define wxGraphicsContext_SetFont_2 762 -#define wxGraphicsContext_SetPen_1_0 763 -#define wxGraphicsContext_SetPen_1_1 764 -#define wxGraphicsContext_StrokeLine 765 -#define wxGraphicsContext_StrokeLines_2 766 -#define wxGraphicsContext_StrokeLines_3 767 -#define wxGraphicsMatrix_Concat 768 -#define wxGraphicsMatrix_Get 770 -#define wxGraphicsMatrix_GetNativeMatrix 771 -#define wxGraphicsMatrix_Invert 772 -#define wxGraphicsMatrix_IsEqual 773 -#define wxGraphicsMatrix_IsIdentity 775 -#define wxGraphicsMatrix_Rotate 776 -#define wxGraphicsMatrix_Scale 777 -#define wxGraphicsMatrix_Translate 778 -#define wxGraphicsMatrix_Set 779 -#define wxGraphicsMatrix_TransformPoint 780 -#define wxGraphicsMatrix_TransformDistance 781 -#define wxGraphicsPath_MoveToPoint_2 782 -#define wxGraphicsPath_MoveToPoint_1 783 -#define wxGraphicsPath_AddArc_6 784 -#define wxGraphicsPath_AddArc_5 785 -#define wxGraphicsPath_AddArcToPoint 786 -#define wxGraphicsPath_AddCircle 787 -#define wxGraphicsPath_AddCurveToPoint_6 788 -#define wxGraphicsPath_AddCurveToPoint_3 789 -#define wxGraphicsPath_AddEllipse 790 -#define wxGraphicsPath_AddLineToPoint_2 791 -#define wxGraphicsPath_AddLineToPoint_1 792 -#define wxGraphicsPath_AddPath 793 -#define wxGraphicsPath_AddQuadCurveToPoint 794 -#define wxGraphicsPath_AddRectangle 795 -#define wxGraphicsPath_AddRoundedRectangle 796 -#define wxGraphicsPath_CloseSubpath 797 -#define wxGraphicsPath_Contains_3 798 -#define wxGraphicsPath_Contains_2 799 -#define wxGraphicsPath_GetBox 801 -#define wxGraphicsPath_GetCurrentPoint 803 -#define wxGraphicsPath_Transform 804 -#define wxGraphicsRenderer_GetDefaultRenderer 805 -#define wxGraphicsRenderer_CreateContext_1_1 806 -#define wxGraphicsRenderer_CreateContext_1_0 807 -#define wxGraphicsRenderer_CreatePen 808 -#define wxGraphicsRenderer_CreateBrush 809 -#define wxGraphicsRenderer_CreateLinearGradientBrush 810 -#define wxGraphicsRenderer_CreateRadialGradientBrush 811 -#define wxGraphicsRenderer_CreateFont 812 -#define wxGraphicsRenderer_CreateMatrix 813 -#define wxGraphicsRenderer_CreatePath 814 -#define wxMenuBar_new_1 816 -#define wxMenuBar_new_0 818 -#define wxMenuBar_destruct 820 -#define wxMenuBar_Append 821 -#define wxMenuBar_Check 822 -#define wxMenuBar_Enable_2 823 -#define wxMenuBar_Enable_1 824 -#define wxMenuBar_EnableTop 825 -#define wxMenuBar_FindMenu 826 -#define wxMenuBar_FindMenuItem 827 -#define wxMenuBar_FindItem 828 -#define wxMenuBar_GetHelpString 829 -#define wxMenuBar_GetLabel_1 830 -#define wxMenuBar_GetLabel_0 831 -#define wxMenuBar_GetLabelTop 832 -#define wxMenuBar_GetMenu 833 -#define wxMenuBar_GetMenuCount 834 -#define wxMenuBar_Insert 835 -#define wxMenuBar_IsChecked 836 -#define wxMenuBar_IsEnabled_1 837 -#define wxMenuBar_IsEnabled_0 838 -#define wxMenuBar_Remove 839 -#define wxMenuBar_Replace 840 -#define wxMenuBar_SetHelpString 841 -#define wxMenuBar_SetLabel_2 842 -#define wxMenuBar_SetLabel_1 843 -#define wxMenuBar_SetLabelTop 844 -#define wxControl_GetLabel 845 -#define wxControl_SetLabel 846 -#define wxControlWithItems_Append_1 847 -#define wxControlWithItems_Append_2 848 -#define wxControlWithItems_appendStrings_1 849 -#define wxControlWithItems_Clear 850 -#define wxControlWithItems_Delete 851 -#define wxControlWithItems_FindString 852 -#define wxControlWithItems_getClientData 854 -#define wxControlWithItems_setClientData 856 -#define wxControlWithItems_GetCount 857 -#define wxControlWithItems_GetSelection 858 -#define wxControlWithItems_GetString 859 -#define wxControlWithItems_GetStringSelection 860 -#define wxControlWithItems_Insert_2 861 -#define wxControlWithItems_Insert_3 862 -#define wxControlWithItems_IsEmpty 863 -#define wxControlWithItems_Select 864 -#define wxControlWithItems_SetSelection 865 -#define wxControlWithItems_SetString 866 -#define wxControlWithItems_SetStringSelection 867 -#define wxMenu_new_2 870 -#define wxMenu_new_1 871 -#define wxMenu_destruct 873 -#define wxMenu_Append_3 874 -#define wxMenu_Append_1 875 -#define wxMenu_Append_4_0 876 -#define wxMenu_Append_4_1 877 -#define wxMenu_AppendCheckItem 878 -#define wxMenu_AppendRadioItem 879 -#define wxMenu_AppendSeparator 880 -#define wxMenu_Break 881 -#define wxMenu_Check 882 -#define wxMenu_Delete_1_0 883 -#define wxMenu_Delete_1_1 884 -#define wxMenu_Destroy_1_0 885 -#define wxMenu_Destroy_1_1 886 -#define wxMenu_Enable 887 -#define wxMenu_FindItem_1 888 -#define wxMenu_FindItem_2 889 -#define wxMenu_FindItemByPosition 890 -#define wxMenu_GetHelpString 891 -#define wxMenu_GetLabel 892 -#define wxMenu_GetMenuItemCount 893 -#define wxMenu_GetMenuItems 894 -#define wxMenu_GetTitle 896 -#define wxMenu_Insert_2 897 -#define wxMenu_Insert_3 898 -#define wxMenu_Insert_5_1 899 -#define wxMenu_Insert_5_0 900 -#define wxMenu_InsertCheckItem 901 -#define wxMenu_InsertRadioItem 902 -#define wxMenu_InsertSeparator 903 -#define wxMenu_IsChecked 904 -#define wxMenu_IsEnabled 905 -#define wxMenu_Prepend_1 906 -#define wxMenu_Prepend_2 907 -#define wxMenu_Prepend_4_1 908 -#define wxMenu_Prepend_4_0 909 -#define wxMenu_PrependCheckItem 910 -#define wxMenu_PrependRadioItem 911 -#define wxMenu_PrependSeparator 912 -#define wxMenu_Remove_1_0 913 -#define wxMenu_Remove_1_1 914 -#define wxMenu_SetHelpString 915 -#define wxMenu_SetLabel 916 -#define wxMenu_SetTitle 917 -#define wxMenuItem_new 918 -#define wxMenuItem_destruct 920 -#define wxMenuItem_Check 921 -#define wxMenuItem_Enable 922 -#define wxMenuItem_GetBitmap 923 -#define wxMenuItem_GetHelp 924 -#define wxMenuItem_GetId 925 -#define wxMenuItem_GetKind 926 -#define wxMenuItem_GetLabel 927 -#define wxMenuItem_GetLabelFromText 928 -#define wxMenuItem_GetMenu 929 -#define wxMenuItem_GetText 930 -#define wxMenuItem_GetSubMenu 931 -#define wxMenuItem_IsCheckable 932 -#define wxMenuItem_IsChecked 933 -#define wxMenuItem_IsEnabled 934 -#define wxMenuItem_IsSeparator 935 -#define wxMenuItem_IsSubMenu 936 -#define wxMenuItem_SetBitmap 937 -#define wxMenuItem_SetHelp 938 -#define wxMenuItem_SetMenu 939 -#define wxMenuItem_SetSubMenu 940 -#define wxMenuItem_SetText 941 -#define wxToolBar_AddControl 942 -#define wxToolBar_AddSeparator 943 -#define wxToolBar_AddTool_5 944 -#define wxToolBar_AddTool_4_0 945 -#define wxToolBar_AddTool_1 946 -#define wxToolBar_AddTool_4_1 947 -#define wxToolBar_AddTool_3 948 -#define wxToolBar_AddTool_6 949 -#define wxToolBar_AddCheckTool 950 -#define wxToolBar_AddRadioTool 951 -#define wxToolBar_DeleteTool 952 -#define wxToolBar_DeleteToolByPos 953 -#define wxToolBar_EnableTool 954 -#define wxToolBar_FindById 955 -#define wxToolBar_FindControl 956 -#define wxToolBar_FindToolForPosition 957 -#define wxToolBar_GetToolSize 958 -#define wxToolBar_GetToolBitmapSize 959 -#define wxToolBar_GetMargins 960 -#define wxToolBar_GetToolEnabled 961 -#define wxToolBar_GetToolLongHelp 962 -#define wxToolBar_GetToolPacking 963 -#define wxToolBar_GetToolPos 964 -#define wxToolBar_GetToolSeparation 965 -#define wxToolBar_GetToolShortHelp 966 -#define wxToolBar_GetToolState 967 -#define wxToolBar_InsertControl 968 -#define wxToolBar_InsertSeparator 969 -#define wxToolBar_InsertTool_5 970 -#define wxToolBar_InsertTool_2 971 -#define wxToolBar_InsertTool_4 972 -#define wxToolBar_Realize 973 -#define wxToolBar_RemoveTool 974 -#define wxToolBar_SetMargins 975 -#define wxToolBar_SetToolBitmapSize 976 -#define wxToolBar_SetToolLongHelp 977 -#define wxToolBar_SetToolPacking 978 -#define wxToolBar_SetToolShortHelp 979 -#define wxToolBar_SetToolSeparation 980 -#define wxToolBar_ToggleTool 981 -#define wxStatusBar_new_0 983 -#define wxStatusBar_new_2 984 -#define wxStatusBar_destruct 986 -#define wxStatusBar_Create 987 -#define wxStatusBar_GetFieldRect 988 -#define wxStatusBar_GetFieldsCount 989 -#define wxStatusBar_GetStatusText 990 -#define wxStatusBar_PopStatusText 991 -#define wxStatusBar_PushStatusText 992 -#define wxStatusBar_SetFieldsCount 993 -#define wxStatusBar_SetMinHeight 994 -#define wxStatusBar_SetStatusText 995 -#define wxStatusBar_SetStatusWidths 996 -#define wxStatusBar_SetStatusStyles 997 -#define wxBitmap_new_0 998 -#define wxBitmap_new_3 999 -#define wxBitmap_new_4 1000 -#define wxBitmap_new_2_0 1001 -#define wxBitmap_new_2_1 1002 -#define wxBitmap_destruct 1003 -#define wxBitmap_ConvertToImage 1004 -#define wxBitmap_CopyFromIcon 1005 -#define wxBitmap_Create 1006 -#define wxBitmap_GetDepth 1007 -#define wxBitmap_GetHeight 1008 -#define wxBitmap_GetPalette 1009 -#define wxBitmap_GetMask 1010 -#define wxBitmap_GetWidth 1011 -#define wxBitmap_GetSubBitmap 1012 -#define wxBitmap_LoadFile 1013 -#define wxBitmap_Ok 1014 -#define wxBitmap_SaveFile 1015 -#define wxBitmap_SetDepth 1016 -#define wxBitmap_SetHeight 1017 -#define wxBitmap_SetMask 1018 -#define wxBitmap_SetPalette 1019 -#define wxBitmap_SetWidth 1020 -#define wxIcon_new_0 1021 -#define wxIcon_new_2 1022 -#define wxIcon_new_1 1023 -#define wxIcon_CopyFromBitmap 1024 -#define wxIcon_destroy 1025 -#define wxIconBundle_new_0 1026 -#define wxIconBundle_new_2 1027 -#define wxIconBundle_new_1_0 1028 -#define wxIconBundle_new_1_1 1029 -#define wxIconBundle_destruct 1030 -#define wxIconBundle_AddIcon_2 1031 -#define wxIconBundle_AddIcon_1 1032 -#define wxIconBundle_GetIcon_1_1 1033 -#define wxIconBundle_GetIcon_1_0 1034 -#define wxCursor_new_0 1035 -#define wxCursor_new_1_0 1036 -#define wxCursor_new_1_1 1037 -#define wxCursor_new_4 1038 -#define wxCursor_destruct 1039 -#define wxCursor_Ok 1040 -#define wxMask_new_0 1041 -#define wxMask_new_2_1 1042 -#define wxMask_new_2_0 1043 -#define wxMask_new_1 1044 -#define wxMask_destruct 1045 -#define wxMask_Create_2_1 1046 -#define wxMask_Create_2_0 1047 -#define wxMask_Create_1 1048 -#define wxImage_new_0 1049 -#define wxImage_new_3_0 1050 -#define wxImage_new_4 1051 -#define wxImage_new_5 1052 -#define wxImage_new_2 1053 -#define wxImage_new_3_1 1054 -#define wxImage_Blur 1055 -#define wxImage_BlurHorizontal 1056 -#define wxImage_BlurVertical 1057 -#define wxImage_ConvertAlphaToMask 1058 -#define wxImage_ConvertToGreyscale 1059 -#define wxImage_ConvertToMono 1060 -#define wxImage_Copy 1061 -#define wxImage_Create_3 1062 -#define wxImage_Create_4 1063 -#define wxImage_Create_5 1064 -#define wxImage_Destroy 1065 -#define wxImage_FindFirstUnusedColour 1066 -#define wxImage_GetImageExtWildcard 1067 -#define wxImage_GetAlpha_2 1068 -#define wxImage_GetAlpha_0 1069 -#define wxImage_GetBlue 1070 -#define wxImage_GetData 1071 -#define wxImage_GetGreen 1072 -#define wxImage_GetImageCount 1073 -#define wxImage_GetHeight 1074 -#define wxImage_GetMaskBlue 1075 -#define wxImage_GetMaskGreen 1076 -#define wxImage_GetMaskRed 1077 -#define wxImage_GetOrFindMaskColour 1078 -#define wxImage_GetPalette 1079 -#define wxImage_GetRed 1080 -#define wxImage_GetSubImage 1081 -#define wxImage_GetWidth 1082 -#define wxImage_HasAlpha 1083 -#define wxImage_HasMask 1084 -#define wxImage_GetOption 1085 -#define wxImage_GetOptionInt 1086 -#define wxImage_HasOption 1087 -#define wxImage_InitAlpha 1088 -#define wxImage_InitStandardHandlers 1089 -#define wxImage_IsTransparent 1090 -#define wxImage_LoadFile_2 1091 -#define wxImage_LoadFile_3 1092 -#define wxImage_Ok 1093 -#define wxImage_RemoveHandler 1094 -#define wxImage_Mirror 1095 -#define wxImage_Replace 1096 -#define wxImage_Rescale 1097 -#define wxImage_Resize 1098 -#define wxImage_Rotate 1099 -#define wxImage_RotateHue 1100 -#define wxImage_Rotate90 1101 -#define wxImage_SaveFile_1 1102 -#define wxImage_SaveFile_2_0 1103 -#define wxImage_SaveFile_2_1 1104 -#define wxImage_Scale 1105 -#define wxImage_Size 1106 -#define wxImage_SetAlpha_3 1107 -#define wxImage_SetAlpha_2 1108 -#define wxImage_SetData_2 1109 -#define wxImage_SetData_4 1110 -#define wxImage_SetMask 1111 -#define wxImage_SetMaskColour 1112 -#define wxImage_SetMaskFromImage 1113 -#define wxImage_SetOption_2_1 1114 -#define wxImage_SetOption_2_0 1115 -#define wxImage_SetPalette 1116 -#define wxImage_SetRGB_5 1117 -#define wxImage_SetRGB_4 1118 -#define wxImage_destroy 1119 -#define wxBrush_new_0 1120 -#define wxBrush_new_2 1121 -#define wxBrush_new_1 1122 -#define wxBrush_destruct 1124 -#define wxBrush_GetColour 1125 -#define wxBrush_GetStipple 1126 -#define wxBrush_GetStyle 1127 -#define wxBrush_IsHatch 1128 -#define wxBrush_IsOk 1129 -#define wxBrush_SetColour_1 1130 -#define wxBrush_SetColour_3 1131 -#define wxBrush_SetStipple 1132 -#define wxBrush_SetStyle 1133 -#define wxPen_new_0 1134 -#define wxPen_new_2 1135 -#define wxPen_destruct 1136 -#define wxPen_GetCap 1137 -#define wxPen_GetColour 1138 -#define wxPen_GetJoin 1139 -#define wxPen_GetStyle 1140 -#define wxPen_GetWidth 1141 -#define wxPen_IsOk 1142 -#define wxPen_SetCap 1143 -#define wxPen_SetColour_1 1144 -#define wxPen_SetColour_3 1145 -#define wxPen_SetJoin 1146 -#define wxPen_SetStyle 1147 -#define wxPen_SetWidth 1148 -#define wxRegion_new_0 1149 -#define wxRegion_new_4 1150 -#define wxRegion_new_2 1151 -#define wxRegion_new_1_1 1152 -#define wxRegion_new_1_0 1154 -#define wxRegion_destruct 1156 -#define wxRegion_Clear 1157 -#define wxRegion_Contains_2 1158 -#define wxRegion_Contains_1_0 1159 -#define wxRegion_Contains_4 1160 -#define wxRegion_Contains_1_1 1161 -#define wxRegion_ConvertToBitmap 1162 -#define wxRegion_GetBox 1163 -#define wxRegion_Intersect_4 1164 -#define wxRegion_Intersect_1_1 1165 -#define wxRegion_Intersect_1_0 1166 -#define wxRegion_IsEmpty 1167 -#define wxRegion_Subtract_4 1168 -#define wxRegion_Subtract_1_1 1169 -#define wxRegion_Subtract_1_0 1170 -#define wxRegion_Offset_2 1171 -#define wxRegion_Offset_1 1172 -#define wxRegion_Union_4 1173 -#define wxRegion_Union_1_2 1174 -#define wxRegion_Union_1_1 1175 -#define wxRegion_Union_1_0 1176 -#define wxRegion_Union_3 1177 -#define wxRegion_Xor_4 1178 -#define wxRegion_Xor_1_1 1179 -#define wxRegion_Xor_1_0 1180 -#define wxAcceleratorTable_new_0 1181 -#define wxAcceleratorTable_new_2 1182 -#define wxAcceleratorTable_destruct 1183 -#define wxAcceleratorTable_Ok 1184 -#define wxAcceleratorEntry_new_1_0 1185 -#define wxAcceleratorEntry_new_1_1 1186 -#define wxAcceleratorEntry_GetCommand 1187 -#define wxAcceleratorEntry_GetFlags 1188 -#define wxAcceleratorEntry_GetKeyCode 1189 -#define wxAcceleratorEntry_Set 1190 -#define wxAcceleratorEntry_destroy 1191 -#define wxCaret_new_3 1196 -#define wxCaret_new_2 1197 -#define wxCaret_destruct 1199 -#define wxCaret_Create_3 1200 -#define wxCaret_Create_2 1201 -#define wxCaret_GetBlinkTime 1202 -#define wxCaret_GetPosition 1204 -#define wxCaret_GetSize 1206 -#define wxCaret_GetWindow 1207 -#define wxCaret_Hide 1208 -#define wxCaret_IsOk 1209 -#define wxCaret_IsVisible 1210 -#define wxCaret_Move_2 1211 -#define wxCaret_Move_1 1212 -#define wxCaret_SetBlinkTime 1213 -#define wxCaret_SetSize_2 1214 -#define wxCaret_SetSize_1 1215 -#define wxCaret_Show 1216 -#define wxSizer_Add_2_1 1217 -#define wxSizer_Add_2_0 1218 -#define wxSizer_Add_3 1219 -#define wxSizer_Add_2_3 1220 -#define wxSizer_Add_2_2 1221 -#define wxSizer_AddSpacer 1222 -#define wxSizer_AddStretchSpacer 1223 -#define wxSizer_CalcMin 1224 -#define wxSizer_Clear 1225 -#define wxSizer_Detach_1_2 1226 -#define wxSizer_Detach_1_1 1227 -#define wxSizer_Detach_1_0 1228 -#define wxSizer_Fit 1229 -#define wxSizer_FitInside 1230 -#define wxSizer_GetChildren 1231 -#define wxSizer_GetItem_2_1 1232 -#define wxSizer_GetItem_2_0 1233 -#define wxSizer_GetItem_1 1234 -#define wxSizer_GetSize 1235 -#define wxSizer_GetPosition 1236 -#define wxSizer_GetMinSize 1237 -#define wxSizer_Hide_2_0 1238 -#define wxSizer_Hide_2_1 1239 -#define wxSizer_Hide_1 1240 -#define wxSizer_Insert_3_1 1241 -#define wxSizer_Insert_3_0 1242 -#define wxSizer_Insert_4 1243 -#define wxSizer_Insert_3_3 1244 -#define wxSizer_Insert_3_2 1245 -#define wxSizer_Insert_2 1246 -#define wxSizer_InsertSpacer 1247 -#define wxSizer_InsertStretchSpacer 1248 -#define wxSizer_IsShown_1_2 1249 -#define wxSizer_IsShown_1_1 1250 -#define wxSizer_IsShown_1_0 1251 -#define wxSizer_Layout 1252 -#define wxSizer_Prepend_2_1 1253 -#define wxSizer_Prepend_2_0 1254 -#define wxSizer_Prepend_3 1255 -#define wxSizer_Prepend_2_3 1256 -#define wxSizer_Prepend_2_2 1257 -#define wxSizer_Prepend_1 1258 -#define wxSizer_PrependSpacer 1259 -#define wxSizer_PrependStretchSpacer 1260 -#define wxSizer_RecalcSizes 1261 -#define wxSizer_Remove_1_1 1262 -#define wxSizer_Remove_1_0 1263 -#define wxSizer_Replace_3_1 1264 -#define wxSizer_Replace_3_0 1265 -#define wxSizer_Replace_2 1266 -#define wxSizer_SetDimension 1267 -#define wxSizer_SetMinSize_2 1268 -#define wxSizer_SetMinSize_1 1269 -#define wxSizer_SetItemMinSize_3_2 1270 -#define wxSizer_SetItemMinSize_2_2 1271 -#define wxSizer_SetItemMinSize_3_1 1272 -#define wxSizer_SetItemMinSize_2_1 1273 -#define wxSizer_SetItemMinSize_3_0 1274 -#define wxSizer_SetItemMinSize_2_0 1275 -#define wxSizer_SetSizeHints 1276 -#define wxSizer_SetVirtualSizeHints 1277 -#define wxSizer_Show_2_2 1278 -#define wxSizer_Show_2_1 1279 -#define wxSizer_Show_2_0 1280 -#define wxSizer_Show_1 1281 -#define wxSizerFlags_new 1282 -#define wxSizerFlags_Align 1283 -#define wxSizerFlags_Border_2 1284 -#define wxSizerFlags_Border_1 1285 -#define wxSizerFlags_Center 1286 -#define wxSizerFlags_Centre 1287 -#define wxSizerFlags_Expand 1288 -#define wxSizerFlags_Left 1289 -#define wxSizerFlags_Proportion 1290 -#define wxSizerFlags_Right 1291 -#define wxSizerFlags_destroy 1292 -#define wxSizerItem_new_5_1 1293 -#define wxSizerItem_new_2_1 1294 -#define wxSizerItem_new_5_0 1295 -#define wxSizerItem_new_2_0 1296 -#define wxSizerItem_new_6 1297 -#define wxSizerItem_new_3 1298 -#define wxSizerItem_new_0 1299 -#define wxSizerItem_destruct 1300 -#define wxSizerItem_CalcMin 1301 -#define wxSizerItem_DeleteWindows 1302 -#define wxSizerItem_DetachSizer 1303 -#define wxSizerItem_GetBorder 1304 -#define wxSizerItem_GetFlag 1305 -#define wxSizerItem_GetMinSize 1306 -#define wxSizerItem_GetPosition 1307 -#define wxSizerItem_GetProportion 1308 -#define wxSizerItem_GetRatio 1309 -#define wxSizerItem_GetRect 1310 -#define wxSizerItem_GetSize 1311 -#define wxSizerItem_GetSizer 1312 -#define wxSizerItem_GetSpacer 1313 -#define wxSizerItem_GetUserData 1314 -#define wxSizerItem_GetWindow 1315 -#define wxSizerItem_IsSizer 1316 -#define wxSizerItem_IsShown 1317 -#define wxSizerItem_IsSpacer 1318 -#define wxSizerItem_IsWindow 1319 -#define wxSizerItem_SetBorder 1320 -#define wxSizerItem_SetDimension 1321 -#define wxSizerItem_SetFlag 1322 -#define wxSizerItem_SetInitSize 1323 -#define wxSizerItem_SetMinSize_1 1324 -#define wxSizerItem_SetMinSize_2 1325 -#define wxSizerItem_SetProportion 1326 -#define wxSizerItem_SetRatio_2 1327 -#define wxSizerItem_SetRatio_1_1 1328 -#define wxSizerItem_SetRatio_1_0 1329 -#define wxSizerItem_SetSizer 1330 -#define wxSizerItem_SetSpacer_1 1331 -#define wxSizerItem_SetSpacer_2 1332 -#define wxSizerItem_SetWindow 1333 -#define wxSizerItem_Show 1334 -#define wxBoxSizer_new 1335 -#define wxBoxSizer_GetOrientation 1336 -#define wxBoxSizer_destroy 1337 -#define wxStaticBoxSizer_new_2 1338 -#define wxStaticBoxSizer_new_3 1339 -#define wxStaticBoxSizer_GetStaticBox 1340 -#define wxStaticBoxSizer_destroy 1341 -#define wxGridSizer_new_4 1342 -#define wxGridSizer_new_2 1343 -#define wxGridSizer_GetCols 1344 -#define wxGridSizer_GetHGap 1345 -#define wxGridSizer_GetRows 1346 -#define wxGridSizer_GetVGap 1347 -#define wxGridSizer_SetCols 1348 -#define wxGridSizer_SetHGap 1349 -#define wxGridSizer_SetRows 1350 -#define wxGridSizer_SetVGap 1351 -#define wxGridSizer_destroy 1352 -#define wxFlexGridSizer_new_4 1353 -#define wxFlexGridSizer_new_2 1354 -#define wxFlexGridSizer_AddGrowableCol 1355 -#define wxFlexGridSizer_AddGrowableRow 1356 -#define wxFlexGridSizer_GetFlexibleDirection 1357 -#define wxFlexGridSizer_GetNonFlexibleGrowMode 1358 -#define wxFlexGridSizer_RemoveGrowableCol 1359 -#define wxFlexGridSizer_RemoveGrowableRow 1360 -#define wxFlexGridSizer_SetFlexibleDirection 1361 -#define wxFlexGridSizer_SetNonFlexibleGrowMode 1362 -#define wxFlexGridSizer_destroy 1363 -#define wxGridBagSizer_new 1364 -#define wxGridBagSizer_Add_3_2 1365 -#define wxGridBagSizer_Add_3_1 1366 -#define wxGridBagSizer_Add_4 1367 -#define wxGridBagSizer_Add_1_0 1368 -#define wxGridBagSizer_Add_2_1 1369 -#define wxGridBagSizer_Add_2_0 1370 -#define wxGridBagSizer_Add_3_0 1371 -#define wxGridBagSizer_Add_1_1 1372 -#define wxGridBagSizer_CalcMin 1373 -#define wxGridBagSizer_CheckForIntersection_2 1374 -#define wxGridBagSizer_CheckForIntersection_3 1375 -#define wxGridBagSizer_FindItem_1_1 1376 -#define wxGridBagSizer_FindItem_1_0 1377 -#define wxGridBagSizer_FindItemAtPoint 1378 -#define wxGridBagSizer_FindItemAtPosition 1379 -#define wxGridBagSizer_FindItemWithData 1380 -#define wxGridBagSizer_GetCellSize 1381 -#define wxGridBagSizer_GetEmptyCellSize 1382 -#define wxGridBagSizer_GetItemPosition_1_2 1383 -#define wxGridBagSizer_GetItemPosition_1_1 1384 -#define wxGridBagSizer_GetItemPosition_1_0 1385 -#define wxGridBagSizer_GetItemSpan_1_2 1386 -#define wxGridBagSizer_GetItemSpan_1_1 1387 -#define wxGridBagSizer_GetItemSpan_1_0 1388 -#define wxGridBagSizer_SetEmptyCellSize 1389 -#define wxGridBagSizer_SetItemPosition_2_2 1390 -#define wxGridBagSizer_SetItemPosition_2_1 1391 -#define wxGridBagSizer_SetItemPosition_2_0 1392 -#define wxGridBagSizer_SetItemSpan_2_2 1393 -#define wxGridBagSizer_SetItemSpan_2_1 1394 -#define wxGridBagSizer_SetItemSpan_2_0 1395 -#define wxGridBagSizer_destroy 1396 -#define wxStdDialogButtonSizer_new 1397 -#define wxStdDialogButtonSizer_AddButton 1398 -#define wxStdDialogButtonSizer_Realize 1399 -#define wxStdDialogButtonSizer_SetAffirmativeButton 1400 -#define wxStdDialogButtonSizer_SetCancelButton 1401 -#define wxStdDialogButtonSizer_SetNegativeButton 1402 -#define wxStdDialogButtonSizer_destroy 1403 -#define wxFont_new_0 1404 -#define wxFont_new_1 1405 -#define wxFont_new_5 1406 -#define wxFont_destruct 1408 -#define wxFont_IsFixedWidth 1409 -#define wxFont_GetDefaultEncoding 1410 -#define wxFont_GetFaceName 1411 -#define wxFont_GetFamily 1412 -#define wxFont_GetNativeFontInfoDesc 1413 -#define wxFont_GetNativeFontInfoUserDesc 1414 -#define wxFont_GetPointSize 1415 -#define wxFont_GetStyle 1416 -#define wxFont_GetUnderlined 1417 -#define wxFont_GetWeight 1418 -#define wxFont_Ok 1419 -#define wxFont_SetDefaultEncoding 1420 -#define wxFont_SetFaceName 1421 -#define wxFont_SetFamily 1422 -#define wxFont_SetPointSize 1423 -#define wxFont_SetStyle 1424 -#define wxFont_SetUnderlined 1425 -#define wxFont_SetWeight 1426 -#define wxToolTip_Enable 1427 -#define wxToolTip_SetDelay 1428 -#define wxToolTip_new 1429 -#define wxToolTip_SetTip 1430 -#define wxToolTip_GetTip 1431 -#define wxToolTip_GetWindow 1432 -#define wxToolTip_destroy 1433 -#define wxButton_new_3 1435 -#define wxButton_new_0 1436 -#define wxButton_destruct 1437 -#define wxButton_Create 1438 -#define wxButton_GetDefaultSize 1439 -#define wxButton_SetDefault 1440 -#define wxButton_SetLabel 1441 -#define wxBitmapButton_new_4 1443 -#define wxBitmapButton_new_0 1444 -#define wxBitmapButton_Create 1445 -#define wxBitmapButton_GetBitmapDisabled 1446 -#define wxBitmapButton_GetBitmapFocus 1448 -#define wxBitmapButton_GetBitmapLabel 1450 -#define wxBitmapButton_GetBitmapSelected 1452 -#define wxBitmapButton_SetBitmapDisabled 1454 -#define wxBitmapButton_SetBitmapFocus 1455 -#define wxBitmapButton_SetBitmapLabel 1456 -#define wxBitmapButton_SetBitmapSelected 1457 -#define wxBitmapButton_destroy 1458 -#define wxToggleButton_new_0 1459 -#define wxToggleButton_new_4 1460 -#define wxToggleButton_Create 1461 -#define wxToggleButton_GetValue 1462 -#define wxToggleButton_SetValue 1463 -#define wxToggleButton_destroy 1464 -#define wxCalendarCtrl_new_0 1465 -#define wxCalendarCtrl_new_3 1466 -#define wxCalendarCtrl_Create 1467 -#define wxCalendarCtrl_destruct 1468 -#define wxCalendarCtrl_SetDate 1469 -#define wxCalendarCtrl_GetDate 1470 -#define wxCalendarCtrl_EnableYearChange 1471 -#define wxCalendarCtrl_EnableMonthChange 1472 -#define wxCalendarCtrl_EnableHolidayDisplay 1473 -#define wxCalendarCtrl_SetHeaderColours 1474 -#define wxCalendarCtrl_GetHeaderColourFg 1475 -#define wxCalendarCtrl_GetHeaderColourBg 1476 -#define wxCalendarCtrl_SetHighlightColours 1477 -#define wxCalendarCtrl_GetHighlightColourFg 1478 -#define wxCalendarCtrl_GetHighlightColourBg 1479 -#define wxCalendarCtrl_SetHolidayColours 1480 -#define wxCalendarCtrl_GetHolidayColourFg 1481 -#define wxCalendarCtrl_GetHolidayColourBg 1482 -#define wxCalendarCtrl_GetAttr 1483 -#define wxCalendarCtrl_SetAttr 1484 -#define wxCalendarCtrl_SetHoliday 1485 -#define wxCalendarCtrl_ResetAttr 1486 -#define wxCalendarCtrl_HitTest 1487 -#define wxCalendarDateAttr_new_0 1488 -#define wxCalendarDateAttr_new_2_1 1489 -#define wxCalendarDateAttr_new_2_0 1490 -#define wxCalendarDateAttr_SetTextColour 1491 -#define wxCalendarDateAttr_SetBackgroundColour 1492 -#define wxCalendarDateAttr_SetBorderColour 1493 -#define wxCalendarDateAttr_SetFont 1494 -#define wxCalendarDateAttr_SetBorder 1495 -#define wxCalendarDateAttr_SetHoliday 1496 -#define wxCalendarDateAttr_HasTextColour 1497 -#define wxCalendarDateAttr_HasBackgroundColour 1498 -#define wxCalendarDateAttr_HasBorderColour 1499 -#define wxCalendarDateAttr_HasFont 1500 -#define wxCalendarDateAttr_HasBorder 1501 -#define wxCalendarDateAttr_IsHoliday 1502 -#define wxCalendarDateAttr_GetTextColour 1503 -#define wxCalendarDateAttr_GetBackgroundColour 1504 -#define wxCalendarDateAttr_GetBorderColour 1505 -#define wxCalendarDateAttr_GetFont 1506 -#define wxCalendarDateAttr_GetBorder 1507 -#define wxCalendarDateAttr_destroy 1508 -#define wxCheckBox_new_4 1510 -#define wxCheckBox_new_0 1511 -#define wxCheckBox_Create 1512 -#define wxCheckBox_GetValue 1513 -#define wxCheckBox_Get3StateValue 1514 -#define wxCheckBox_Is3rdStateAllowedForUser 1515 -#define wxCheckBox_Is3State 1516 -#define wxCheckBox_IsChecked 1517 -#define wxCheckBox_SetValue 1518 -#define wxCheckBox_Set3StateValue 1519 -#define wxCheckBox_destroy 1520 -#define wxCheckListBox_new_0 1521 -#define wxCheckListBox_new_3 1523 -#define wxCheckListBox_Check 1524 -#define wxCheckListBox_IsChecked 1525 -#define wxCheckListBox_destroy 1526 -#define wxChoice_new_3 1529 -#define wxChoice_new_0 1530 -#define wxChoice_destruct 1532 -#define wxChoice_Create 1534 -#define wxChoice_Delete 1535 -#define wxChoice_GetColumns 1536 -#define wxChoice_SetColumns 1537 -#define wxComboBox_new_0 1538 -#define wxComboBox_new_3 1540 -#define wxComboBox_destruct 1541 -#define wxComboBox_Create 1543 -#define wxComboBox_CanCopy 1544 -#define wxComboBox_CanCut 1545 -#define wxComboBox_CanPaste 1546 -#define wxComboBox_CanRedo 1547 -#define wxComboBox_CanUndo 1548 -#define wxComboBox_Copy 1549 -#define wxComboBox_Cut 1550 -#define wxComboBox_GetInsertionPoint 1551 -#define wxComboBox_GetLastPosition 1552 -#define wxComboBox_GetValue 1553 -#define wxComboBox_Paste 1554 -#define wxComboBox_Redo 1555 -#define wxComboBox_Replace 1556 -#define wxComboBox_Remove 1557 -#define wxComboBox_SetInsertionPoint 1558 -#define wxComboBox_SetInsertionPointEnd 1559 -#define wxComboBox_SetSelection_1 1560 -#define wxComboBox_SetSelection_2 1561 -#define wxComboBox_SetValue 1562 -#define wxComboBox_Undo 1563 -#define wxGauge_new_0 1564 -#define wxGauge_new_4 1565 -#define wxGauge_Create 1566 -#define wxGauge_GetBezelFace 1567 -#define wxGauge_GetRange 1568 -#define wxGauge_GetShadowWidth 1569 -#define wxGauge_GetValue 1570 -#define wxGauge_IsVertical 1571 -#define wxGauge_SetBezelFace 1572 -#define wxGauge_SetRange 1573 -#define wxGauge_SetShadowWidth 1574 -#define wxGauge_SetValue 1575 -#define wxGauge_Pulse 1576 -#define wxGauge_destroy 1577 -#define wxGenericDirCtrl_new_0 1578 -#define wxGenericDirCtrl_new_2 1579 -#define wxGenericDirCtrl_destruct 1580 -#define wxGenericDirCtrl_Create 1581 -#define wxGenericDirCtrl_Init 1582 -#define wxGenericDirCtrl_CollapseTree 1583 -#define wxGenericDirCtrl_ExpandPath 1584 -#define wxGenericDirCtrl_GetDefaultPath 1585 -#define wxGenericDirCtrl_GetPath 1586 -#define wxGenericDirCtrl_GetFilePath 1587 -#define wxGenericDirCtrl_GetFilter 1588 -#define wxGenericDirCtrl_GetFilterIndex 1589 -#define wxGenericDirCtrl_GetRootId 1590 -#define wxGenericDirCtrl_GetTreeCtrl 1591 -#define wxGenericDirCtrl_ReCreateTree 1592 -#define wxGenericDirCtrl_SetDefaultPath 1593 -#define wxGenericDirCtrl_SetFilter 1594 -#define wxGenericDirCtrl_SetFilterIndex 1595 -#define wxGenericDirCtrl_SetPath 1596 -#define wxStaticBox_new_4 1598 -#define wxStaticBox_new_0 1599 -#define wxStaticBox_Create 1600 -#define wxStaticBox_destroy 1601 -#define wxStaticLine_new_2 1603 -#define wxStaticLine_new_0 1604 -#define wxStaticLine_Create 1605 -#define wxStaticLine_IsVertical 1606 -#define wxStaticLine_GetDefaultSize 1607 -#define wxStaticLine_destroy 1608 -#define wxListBox_new_3 1611 -#define wxListBox_new_0 1612 -#define wxListBox_destruct 1614 -#define wxListBox_Create 1616 -#define wxListBox_Deselect 1617 -#define wxListBox_GetSelections 1618 -#define wxListBox_InsertItems 1619 -#define wxListBox_IsSelected 1620 -#define wxListBox_Set 1622 -#define wxListBox_HitTest 1623 -#define wxListBox_SetFirstItem_1_0 1624 -#define wxListBox_SetFirstItem_1_1 1625 -#define wxListCtrl_new_0 1626 -#define wxListCtrl_new_2 1627 -#define wxListCtrl_Arrange 1628 -#define wxListCtrl_AssignImageList 1629 -#define wxListCtrl_ClearAll 1630 -#define wxListCtrl_Create 1631 -#define wxListCtrl_DeleteAllItems 1632 -#define wxListCtrl_DeleteColumn 1633 -#define wxListCtrl_DeleteItem 1634 -#define wxListCtrl_EditLabel 1635 -#define wxListCtrl_EnsureVisible 1636 -#define wxListCtrl_FindItem_3_0 1637 -#define wxListCtrl_FindItem_3_1 1638 -#define wxListCtrl_GetColumn 1639 -#define wxListCtrl_GetColumnCount 1640 -#define wxListCtrl_GetColumnWidth 1641 -#define wxListCtrl_GetCountPerPage 1642 -#define wxListCtrl_GetImageList 1643 -#define wxListCtrl_GetItem 1644 -#define wxListCtrl_GetItemBackgroundColour 1645 -#define wxListCtrl_GetItemCount 1646 -#define wxListCtrl_GetItemData 1647 -#define wxListCtrl_GetItemFont 1648 -#define wxListCtrl_GetItemPosition 1649 -#define wxListCtrl_GetItemRect 1650 -#define wxListCtrl_GetItemSpacing 1651 -#define wxListCtrl_GetItemState 1652 -#define wxListCtrl_GetItemText 1653 -#define wxListCtrl_GetItemTextColour 1654 -#define wxListCtrl_GetNextItem 1655 -#define wxListCtrl_GetSelectedItemCount 1656 -#define wxListCtrl_GetTextColour 1657 -#define wxListCtrl_GetTopItem 1658 -#define wxListCtrl_GetViewRect 1659 -#define wxListCtrl_HitTest 1660 -#define wxListCtrl_InsertColumn_2 1661 -#define wxListCtrl_InsertColumn_3 1662 -#define wxListCtrl_InsertItem_1 1663 -#define wxListCtrl_InsertItem_2_1 1664 -#define wxListCtrl_InsertItem_2_0 1665 -#define wxListCtrl_InsertItem_3 1666 -#define wxListCtrl_RefreshItem 1667 -#define wxListCtrl_RefreshItems 1668 -#define wxListCtrl_ScrollList 1669 -#define wxListCtrl_SetBackgroundColour 1670 -#define wxListCtrl_SetColumn 1671 -#define wxListCtrl_SetColumnWidth 1672 -#define wxListCtrl_SetImageList 1673 -#define wxListCtrl_SetItem_1 1674 -#define wxListCtrl_SetItem_4 1675 -#define wxListCtrl_SetItemBackgroundColour 1676 -#define wxListCtrl_SetItemCount 1677 -#define wxListCtrl_SetItemData 1678 -#define wxListCtrl_SetItemFont 1679 -#define wxListCtrl_SetItemImage 1680 -#define wxListCtrl_SetItemColumnImage 1681 -#define wxListCtrl_SetItemPosition 1682 -#define wxListCtrl_SetItemState 1683 -#define wxListCtrl_SetItemText 1684 -#define wxListCtrl_SetItemTextColour 1685 -#define wxListCtrl_SetSingleStyle 1686 -#define wxListCtrl_SetTextColour 1687 -#define wxListCtrl_SetWindowStyleFlag 1688 -#define wxListCtrl_destroy 1689 -#define wxListView_ClearColumnImage 1690 -#define wxListView_Focus 1691 -#define wxListView_GetFirstSelected 1692 -#define wxListView_GetFocusedItem 1693 -#define wxListView_GetNextSelected 1694 -#define wxListView_IsSelected 1695 -#define wxListView_Select 1696 -#define wxListView_SetColumnImage 1697 -#define wxListItem_new_0 1698 -#define wxListItem_new_1 1699 -#define wxListItem_destruct 1700 -#define wxListItem_Clear 1701 -#define wxListItem_GetAlign 1702 -#define wxListItem_GetBackgroundColour 1703 -#define wxListItem_GetColumn 1704 -#define wxListItem_GetFont 1705 -#define wxListItem_GetId 1706 -#define wxListItem_GetImage 1707 -#define wxListItem_GetMask 1708 -#define wxListItem_GetState 1709 -#define wxListItem_GetText 1710 -#define wxListItem_GetTextColour 1711 -#define wxListItem_GetWidth 1712 -#define wxListItem_SetAlign 1713 -#define wxListItem_SetBackgroundColour 1714 -#define wxListItem_SetColumn 1715 -#define wxListItem_SetFont 1716 -#define wxListItem_SetId 1717 -#define wxListItem_SetImage 1718 -#define wxListItem_SetMask 1719 -#define wxListItem_SetState 1720 -#define wxListItem_SetStateMask 1721 -#define wxListItem_SetText 1722 -#define wxListItem_SetTextColour 1723 -#define wxListItem_SetWidth 1724 -#define wxImageList_new_0 1725 -#define wxImageList_new_3 1726 -#define wxImageList_Add_1 1727 -#define wxImageList_Add_2_0 1728 -#define wxImageList_Add_2_1 1729 -#define wxImageList_Create 1730 -#define wxImageList_Draw 1732 -#define wxImageList_GetBitmap 1733 -#define wxImageList_GetIcon 1734 -#define wxImageList_GetImageCount 1735 -#define wxImageList_GetSize 1736 -#define wxImageList_Remove 1737 -#define wxImageList_RemoveAll 1738 -#define wxImageList_Replace_2 1739 -#define wxImageList_Replace_3 1740 -#define wxImageList_destroy 1741 -#define wxTextAttr_new_0 1742 -#define wxTextAttr_new_2 1743 -#define wxTextAttr_GetAlignment 1744 -#define wxTextAttr_GetBackgroundColour 1745 -#define wxTextAttr_GetFont 1746 -#define wxTextAttr_GetLeftIndent 1747 -#define wxTextAttr_GetLeftSubIndent 1748 -#define wxTextAttr_GetRightIndent 1749 -#define wxTextAttr_GetTabs 1750 -#define wxTextAttr_GetTextColour 1751 -#define wxTextAttr_HasBackgroundColour 1752 -#define wxTextAttr_HasFont 1753 -#define wxTextAttr_HasTextColour 1754 -#define wxTextAttr_GetFlags 1755 -#define wxTextAttr_IsDefault 1756 -#define wxTextAttr_SetAlignment 1757 -#define wxTextAttr_SetBackgroundColour 1758 -#define wxTextAttr_SetFlags 1759 -#define wxTextAttr_SetFont 1760 -#define wxTextAttr_SetLeftIndent 1761 -#define wxTextAttr_SetRightIndent 1762 -#define wxTextAttr_SetTabs 1763 -#define wxTextAttr_SetTextColour 1764 -#define wxTextAttr_destroy 1765 -#define wxTextCtrl_new_3 1767 -#define wxTextCtrl_new_0 1768 -#define wxTextCtrl_destruct 1770 -#define wxTextCtrl_AppendText 1771 -#define wxTextCtrl_CanCopy 1772 -#define wxTextCtrl_CanCut 1773 -#define wxTextCtrl_CanPaste 1774 -#define wxTextCtrl_CanRedo 1775 -#define wxTextCtrl_CanUndo 1776 -#define wxTextCtrl_Clear 1777 -#define wxTextCtrl_Copy 1778 -#define wxTextCtrl_Create 1779 -#define wxTextCtrl_Cut 1780 -#define wxTextCtrl_DiscardEdits 1781 -#define wxTextCtrl_EmulateKeyPress 1782 -#define wxTextCtrl_GetDefaultStyle 1783 -#define wxTextCtrl_GetInsertionPoint 1784 -#define wxTextCtrl_GetLastPosition 1785 -#define wxTextCtrl_GetLineLength 1786 -#define wxTextCtrl_GetLineText 1787 -#define wxTextCtrl_GetNumberOfLines 1788 -#define wxTextCtrl_GetRange 1789 -#define wxTextCtrl_GetSelection 1790 -#define wxTextCtrl_GetStringSelection 1791 -#define wxTextCtrl_GetStyle 1792 -#define wxTextCtrl_GetValue 1793 -#define wxTextCtrl_IsEditable 1794 -#define wxTextCtrl_IsModified 1795 -#define wxTextCtrl_IsMultiLine 1796 -#define wxTextCtrl_IsSingleLine 1797 -#define wxTextCtrl_LoadFile 1798 -#define wxTextCtrl_MarkDirty 1799 -#define wxTextCtrl_Paste 1800 -#define wxTextCtrl_PositionToXY 1801 -#define wxTextCtrl_Redo 1802 -#define wxTextCtrl_Remove 1803 -#define wxTextCtrl_Replace 1804 -#define wxTextCtrl_SaveFile 1805 -#define wxTextCtrl_SetDefaultStyle 1806 -#define wxTextCtrl_SetEditable 1807 -#define wxTextCtrl_SetInsertionPoint 1808 -#define wxTextCtrl_SetInsertionPointEnd 1809 -#define wxTextCtrl_SetMaxLength 1811 -#define wxTextCtrl_SetSelection 1812 -#define wxTextCtrl_SetStyle 1813 -#define wxTextCtrl_SetValue 1814 -#define wxTextCtrl_ShowPosition 1815 -#define wxTextCtrl_Undo 1816 -#define wxTextCtrl_WriteText 1817 -#define wxTextCtrl_XYToPosition 1818 -#define wxNotebook_new_0 1821 -#define wxNotebook_new_3 1822 -#define wxNotebook_destruct 1823 -#define wxNotebook_AddPage 1824 -#define wxNotebook_AdvanceSelection 1825 -#define wxNotebook_AssignImageList 1826 -#define wxNotebook_Create 1827 -#define wxNotebook_DeleteAllPages 1828 -#define wxNotebook_DeletePage 1829 -#define wxNotebook_RemovePage 1830 -#define wxNotebook_GetCurrentPage 1831 -#define wxNotebook_GetImageList 1832 -#define wxNotebook_GetPage 1834 -#define wxNotebook_GetPageCount 1835 -#define wxNotebook_GetPageImage 1836 -#define wxNotebook_GetPageText 1837 -#define wxNotebook_GetRowCount 1838 -#define wxNotebook_GetSelection 1839 -#define wxNotebook_GetThemeBackgroundColour 1840 -#define wxNotebook_HitTest 1842 -#define wxNotebook_InsertPage 1844 -#define wxNotebook_SetImageList 1845 -#define wxNotebook_SetPadding 1846 -#define wxNotebook_SetPageSize 1847 -#define wxNotebook_SetPageImage 1848 -#define wxNotebook_SetPageText 1849 -#define wxNotebook_SetSelection 1850 -#define wxNotebook_ChangeSelection 1851 -#define wxChoicebook_new_0 1852 -#define wxChoicebook_new_3 1853 -#define wxChoicebook_AddPage 1854 -#define wxChoicebook_AdvanceSelection 1855 -#define wxChoicebook_AssignImageList 1856 -#define wxChoicebook_Create 1857 -#define wxChoicebook_DeleteAllPages 1858 -#define wxChoicebook_DeletePage 1859 -#define wxChoicebook_RemovePage 1860 -#define wxChoicebook_GetCurrentPage 1861 -#define wxChoicebook_GetImageList 1862 -#define wxChoicebook_GetPage 1864 -#define wxChoicebook_GetPageCount 1865 -#define wxChoicebook_GetPageImage 1866 -#define wxChoicebook_GetPageText 1867 -#define wxChoicebook_GetSelection 1868 -#define wxChoicebook_HitTest 1869 -#define wxChoicebook_InsertPage 1870 -#define wxChoicebook_SetImageList 1871 -#define wxChoicebook_SetPageSize 1872 -#define wxChoicebook_SetPageImage 1873 -#define wxChoicebook_SetPageText 1874 -#define wxChoicebook_SetSelection 1875 -#define wxChoicebook_ChangeSelection 1876 -#define wxChoicebook_destroy 1877 -#define wxToolbook_new_0 1878 -#define wxToolbook_new_3 1879 -#define wxToolbook_AddPage 1880 -#define wxToolbook_AdvanceSelection 1881 -#define wxToolbook_AssignImageList 1882 -#define wxToolbook_Create 1883 -#define wxToolbook_DeleteAllPages 1884 -#define wxToolbook_DeletePage 1885 -#define wxToolbook_RemovePage 1886 -#define wxToolbook_GetCurrentPage 1887 -#define wxToolbook_GetImageList 1888 -#define wxToolbook_GetPage 1890 -#define wxToolbook_GetPageCount 1891 -#define wxToolbook_GetPageImage 1892 -#define wxToolbook_GetPageText 1893 -#define wxToolbook_GetSelection 1894 -#define wxToolbook_HitTest 1896 -#define wxToolbook_InsertPage 1897 -#define wxToolbook_SetImageList 1898 -#define wxToolbook_SetPageSize 1899 -#define wxToolbook_SetPageImage 1900 -#define wxToolbook_SetPageText 1901 -#define wxToolbook_SetSelection 1902 -#define wxToolbook_ChangeSelection 1903 -#define wxToolbook_destroy 1904 -#define wxListbook_new_0 1905 -#define wxListbook_new_3 1906 -#define wxListbook_AddPage 1907 -#define wxListbook_AdvanceSelection 1908 -#define wxListbook_AssignImageList 1909 -#define wxListbook_Create 1910 -#define wxListbook_DeleteAllPages 1911 -#define wxListbook_DeletePage 1912 -#define wxListbook_RemovePage 1913 -#define wxListbook_GetCurrentPage 1914 -#define wxListbook_GetImageList 1915 -#define wxListbook_GetPage 1917 -#define wxListbook_GetPageCount 1918 -#define wxListbook_GetPageImage 1919 -#define wxListbook_GetPageText 1920 -#define wxListbook_GetSelection 1921 -#define wxListbook_HitTest 1923 -#define wxListbook_InsertPage 1924 -#define wxListbook_SetImageList 1925 -#define wxListbook_SetPageSize 1926 -#define wxListbook_SetPageImage 1927 -#define wxListbook_SetPageText 1928 -#define wxListbook_SetSelection 1929 -#define wxListbook_ChangeSelection 1930 -#define wxListbook_destroy 1931 -#define wxTreebook_new_0 1932 -#define wxTreebook_new_3 1933 -#define wxTreebook_AddPage 1934 -#define wxTreebook_AdvanceSelection 1935 -#define wxTreebook_AssignImageList 1936 -#define wxTreebook_Create 1937 -#define wxTreebook_DeleteAllPages 1938 -#define wxTreebook_DeletePage 1939 -#define wxTreebook_RemovePage 1940 -#define wxTreebook_GetCurrentPage 1941 -#define wxTreebook_GetImageList 1942 -#define wxTreebook_GetPage 1944 -#define wxTreebook_GetPageCount 1945 -#define wxTreebook_GetPageImage 1946 -#define wxTreebook_GetPageText 1947 -#define wxTreebook_GetSelection 1948 -#define wxTreebook_ExpandNode 1949 -#define wxTreebook_IsNodeExpanded 1950 -#define wxTreebook_HitTest 1952 -#define wxTreebook_InsertPage 1953 -#define wxTreebook_InsertSubPage 1954 -#define wxTreebook_SetImageList 1955 -#define wxTreebook_SetPageSize 1956 -#define wxTreebook_SetPageImage 1957 -#define wxTreebook_SetPageText 1958 -#define wxTreebook_SetSelection 1959 -#define wxTreebook_ChangeSelection 1960 -#define wxTreebook_destroy 1961 -#define wxTreeCtrl_new_2 1964 -#define wxTreeCtrl_new_0 1965 -#define wxTreeCtrl_destruct 1967 -#define wxTreeCtrl_AddRoot 1968 -#define wxTreeCtrl_AppendItem 1969 -#define wxTreeCtrl_AssignImageList 1970 -#define wxTreeCtrl_AssignStateImageList 1971 -#define wxTreeCtrl_Collapse 1972 -#define wxTreeCtrl_CollapseAndReset 1973 -#define wxTreeCtrl_Create 1974 -#define wxTreeCtrl_Delete 1975 -#define wxTreeCtrl_DeleteAllItems 1976 -#define wxTreeCtrl_DeleteChildren 1977 -#define wxTreeCtrl_EnsureVisible 1978 -#define wxTreeCtrl_Expand 1979 -#define wxTreeCtrl_GetBoundingRect 1980 -#define wxTreeCtrl_GetChildrenCount 1982 -#define wxTreeCtrl_GetCount 1983 -#define wxTreeCtrl_GetEditControl 1984 -#define wxTreeCtrl_GetFirstVisibleItem 1985 -#define wxTreeCtrl_GetImageList 1986 -#define wxTreeCtrl_GetIndent 1987 -#define wxTreeCtrl_GetItemBackgroundColour 1988 -#define wxTreeCtrl_GetItemData 1989 -#define wxTreeCtrl_GetItemFont 1990 -#define wxTreeCtrl_GetItemImage_1 1991 -#define wxTreeCtrl_GetItemImage_2 1992 -#define wxTreeCtrl_GetItemText 1993 -#define wxTreeCtrl_GetItemTextColour 1994 -#define wxTreeCtrl_GetLastChild 1995 -#define wxTreeCtrl_GetNextSibling 1996 -#define wxTreeCtrl_GetNextVisible 1997 -#define wxTreeCtrl_GetItemParent 1998 -#define wxTreeCtrl_GetPrevSibling 1999 -#define wxTreeCtrl_GetPrevVisible 2000 -#define wxTreeCtrl_GetRootItem 2001 -#define wxTreeCtrl_GetSelection 2002 -#define wxTreeCtrl_GetSelections 2003 -#define wxTreeCtrl_GetStateImageList 2004 -#define wxTreeCtrl_HitTest 2005 -#define wxTreeCtrl_InsertItem_4_1 2006 -#define wxTreeCtrl_InsertItem_4_0 2007 -#define wxTreeCtrl_IsBold 2008 -#define wxTreeCtrl_IsExpanded 2009 -#define wxTreeCtrl_IsSelected 2010 -#define wxTreeCtrl_IsVisible 2011 -#define wxTreeCtrl_ItemHasChildren 2012 -#define wxTreeCtrl_PrependItem 2013 -#define wxTreeCtrl_ScrollTo 2014 -#define wxTreeCtrl_SelectItem_1 2015 -#define wxTreeCtrl_SelectItem_2 2016 -#define wxTreeCtrl_SetIndent 2017 -#define wxTreeCtrl_SetImageList 2018 -#define wxTreeCtrl_SetItemBackgroundColour 2019 -#define wxTreeCtrl_SetItemBold 2020 -#define wxTreeCtrl_SetItemData 2021 -#define wxTreeCtrl_SetItemDropHighlight 2022 -#define wxTreeCtrl_SetItemFont 2023 -#define wxTreeCtrl_SetItemHasChildren 2024 -#define wxTreeCtrl_SetItemImage_2 2025 -#define wxTreeCtrl_SetItemImage_3 2026 -#define wxTreeCtrl_SetItemText 2027 -#define wxTreeCtrl_SetItemTextColour 2028 -#define wxTreeCtrl_SetStateImageList 2029 -#define wxTreeCtrl_SetWindowStyle 2030 -#define wxTreeCtrl_SortChildren 2031 -#define wxTreeCtrl_Toggle 2032 -#define wxTreeCtrl_ToggleItemSelection 2033 -#define wxTreeCtrl_Unselect 2034 -#define wxTreeCtrl_UnselectAll 2035 -#define wxTreeCtrl_UnselectItem 2036 -#define wxScrollBar_new_0 2037 -#define wxScrollBar_new_3 2038 -#define wxScrollBar_destruct 2039 -#define wxScrollBar_Create 2040 -#define wxScrollBar_GetRange 2041 -#define wxScrollBar_GetPageSize 2042 -#define wxScrollBar_GetThumbPosition 2043 -#define wxScrollBar_GetThumbSize 2044 -#define wxScrollBar_SetThumbPosition 2045 -#define wxScrollBar_SetScrollbar 2046 -#define wxSpinButton_new_2 2048 -#define wxSpinButton_new_0 2049 -#define wxSpinButton_Create 2050 -#define wxSpinButton_GetMax 2051 -#define wxSpinButton_GetMin 2052 -#define wxSpinButton_GetValue 2053 -#define wxSpinButton_SetRange 2054 -#define wxSpinButton_SetValue 2055 -#define wxSpinButton_destroy 2056 -#define wxSpinCtrl_new_0 2057 -#define wxSpinCtrl_new_2 2058 -#define wxSpinCtrl_Create 2060 -#define wxSpinCtrl_SetValue_1_1 2063 -#define wxSpinCtrl_SetValue_1_0 2064 -#define wxSpinCtrl_GetValue 2066 -#define wxSpinCtrl_SetRange 2068 -#define wxSpinCtrl_SetSelection 2069 -#define wxSpinCtrl_GetMin 2071 -#define wxSpinCtrl_GetMax 2073 -#define wxSpinCtrl_destroy 2074 -#define wxStaticText_new_0 2075 -#define wxStaticText_new_4 2076 -#define wxStaticText_Create 2077 -#define wxStaticText_GetLabel 2078 -#define wxStaticText_SetLabel 2079 -#define wxStaticText_Wrap 2080 -#define wxStaticText_destroy 2081 -#define wxStaticBitmap_new_0 2082 -#define wxStaticBitmap_new_4 2083 -#define wxStaticBitmap_Create 2084 -#define wxStaticBitmap_GetBitmap 2085 -#define wxStaticBitmap_SetBitmap 2086 -#define wxStaticBitmap_destroy 2087 -#define wxRadioBox_new 2088 -#define wxRadioBox_destruct 2090 -#define wxRadioBox_Create 2091 -#define wxRadioBox_Enable_2 2092 -#define wxRadioBox_Enable_1 2093 -#define wxRadioBox_GetSelection 2094 -#define wxRadioBox_GetString 2095 -#define wxRadioBox_SetSelection 2096 -#define wxRadioBox_Show_2 2097 -#define wxRadioBox_Show_1 2098 -#define wxRadioBox_GetColumnCount 2099 -#define wxRadioBox_GetItemHelpText 2100 -#define wxRadioBox_GetItemToolTip 2101 -#define wxRadioBox_GetItemFromPoint 2103 -#define wxRadioBox_GetRowCount 2104 -#define wxRadioBox_IsItemEnabled 2105 -#define wxRadioBox_IsItemShown 2106 -#define wxRadioBox_SetItemHelpText 2107 -#define wxRadioBox_SetItemToolTip 2108 -#define wxRadioButton_new_0 2109 -#define wxRadioButton_new_4 2110 -#define wxRadioButton_Create 2111 -#define wxRadioButton_GetValue 2112 -#define wxRadioButton_SetValue 2113 -#define wxRadioButton_destroy 2114 -#define wxSlider_new_6 2116 -#define wxSlider_new_0 2117 -#define wxSlider_Create 2118 -#define wxSlider_GetLineSize 2119 -#define wxSlider_GetMax 2120 -#define wxSlider_GetMin 2121 -#define wxSlider_GetPageSize 2122 -#define wxSlider_GetThumbLength 2123 -#define wxSlider_GetValue 2124 -#define wxSlider_SetLineSize 2125 -#define wxSlider_SetPageSize 2126 -#define wxSlider_SetRange 2127 -#define wxSlider_SetThumbLength 2128 -#define wxSlider_SetValue 2129 -#define wxSlider_destroy 2130 -#define wxDialog_new_4 2132 -#define wxDialog_new_0 2133 -#define wxDialog_destruct 2135 -#define wxDialog_Create 2136 -#define wxDialog_CreateButtonSizer 2137 -#define wxDialog_CreateStdDialogButtonSizer 2138 -#define wxDialog_EndModal 2139 -#define wxDialog_GetAffirmativeId 2140 -#define wxDialog_GetReturnCode 2141 -#define wxDialog_IsModal 2142 -#define wxDialog_SetAffirmativeId 2143 -#define wxDialog_SetReturnCode 2144 -#define wxDialog_Show 2145 -#define wxDialog_ShowModal 2146 -#define wxColourDialog_new_0 2147 -#define wxColourDialog_new_2 2148 -#define wxColourDialog_destruct 2149 -#define wxColourDialog_Create 2150 -#define wxColourDialog_GetColourData 2151 -#define wxColourData_new_0 2152 -#define wxColourData_new_1 2153 -#define wxColourData_destruct 2154 -#define wxColourData_GetChooseFull 2155 -#define wxColourData_GetColour 2156 -#define wxColourData_GetCustomColour 2158 -#define wxColourData_SetChooseFull 2159 -#define wxColourData_SetColour 2160 -#define wxColourData_SetCustomColour 2161 -#define wxPalette_new_0 2162 -#define wxPalette_new_4 2163 -#define wxPalette_destruct 2165 -#define wxPalette_Create 2166 -#define wxPalette_GetColoursCount 2167 -#define wxPalette_GetPixel 2168 -#define wxPalette_GetRGB 2169 -#define wxPalette_IsOk 2170 -#define wxDirDialog_new 2174 -#define wxDirDialog_destruct 2175 -#define wxDirDialog_GetPath 2176 -#define wxDirDialog_GetMessage 2177 -#define wxDirDialog_SetMessage 2178 -#define wxDirDialog_SetPath 2179 -#define wxFileDialog_new 2183 -#define wxFileDialog_destruct 2184 -#define wxFileDialog_GetDirectory 2185 -#define wxFileDialog_GetFilename 2186 -#define wxFileDialog_GetFilenames 2187 -#define wxFileDialog_GetFilterIndex 2188 -#define wxFileDialog_GetMessage 2189 -#define wxFileDialog_GetPath 2190 -#define wxFileDialog_GetPaths 2191 -#define wxFileDialog_GetWildcard 2192 -#define wxFileDialog_SetDirectory 2193 -#define wxFileDialog_SetFilename 2194 -#define wxFileDialog_SetFilterIndex 2195 -#define wxFileDialog_SetMessage 2196 -#define wxFileDialog_SetPath 2197 -#define wxFileDialog_SetWildcard 2198 -#define wxPickerBase_SetInternalMargin 2199 -#define wxPickerBase_GetInternalMargin 2200 -#define wxPickerBase_SetTextCtrlProportion 2201 -#define wxPickerBase_SetPickerCtrlProportion 2202 -#define wxPickerBase_GetTextCtrlProportion 2203 -#define wxPickerBase_GetPickerCtrlProportion 2204 -#define wxPickerBase_HasTextCtrl 2205 -#define wxPickerBase_GetTextCtrl 2206 -#define wxPickerBase_IsTextCtrlGrowable 2207 -#define wxPickerBase_SetPickerCtrlGrowable 2208 -#define wxPickerBase_SetTextCtrlGrowable 2209 -#define wxPickerBase_IsPickerCtrlGrowable 2210 -#define wxFilePickerCtrl_new_0 2211 -#define wxFilePickerCtrl_new_3 2212 -#define wxFilePickerCtrl_Create 2213 -#define wxFilePickerCtrl_GetPath 2214 -#define wxFilePickerCtrl_SetPath 2215 -#define wxFilePickerCtrl_destroy 2216 -#define wxDirPickerCtrl_new_0 2217 -#define wxDirPickerCtrl_new_3 2218 -#define wxDirPickerCtrl_Create 2219 -#define wxDirPickerCtrl_GetPath 2220 -#define wxDirPickerCtrl_SetPath 2221 -#define wxDirPickerCtrl_destroy 2222 -#define wxColourPickerCtrl_new_0 2223 -#define wxColourPickerCtrl_new_3 2224 -#define wxColourPickerCtrl_Create 2225 -#define wxColourPickerCtrl_GetColour 2226 -#define wxColourPickerCtrl_SetColour_1_1 2227 -#define wxColourPickerCtrl_SetColour_1_0 2228 -#define wxColourPickerCtrl_destroy 2229 -#define wxDatePickerCtrl_new_0 2230 -#define wxDatePickerCtrl_new_3 2231 -#define wxDatePickerCtrl_GetRange 2232 -#define wxDatePickerCtrl_GetValue 2233 -#define wxDatePickerCtrl_SetRange 2234 -#define wxDatePickerCtrl_SetValue 2235 -#define wxDatePickerCtrl_destroy 2236 -#define wxFontPickerCtrl_new_0 2237 -#define wxFontPickerCtrl_new_3 2238 -#define wxFontPickerCtrl_Create 2239 -#define wxFontPickerCtrl_GetSelectedFont 2240 -#define wxFontPickerCtrl_SetSelectedFont 2241 -#define wxFontPickerCtrl_GetMaxPointSize 2242 -#define wxFontPickerCtrl_SetMaxPointSize 2243 -#define wxFontPickerCtrl_destroy 2244 -#define wxFindReplaceDialog_new_0 2247 -#define wxFindReplaceDialog_new_4 2248 -#define wxFindReplaceDialog_destruct 2249 -#define wxFindReplaceDialog_Create 2250 -#define wxFindReplaceDialog_GetData 2251 -#define wxFindReplaceData_new_0 2252 -#define wxFindReplaceData_new_1 2253 -#define wxFindReplaceData_GetFindString 2254 -#define wxFindReplaceData_GetReplaceString 2255 -#define wxFindReplaceData_GetFlags 2256 -#define wxFindReplaceData_SetFlags 2257 -#define wxFindReplaceData_SetFindString 2258 -#define wxFindReplaceData_SetReplaceString 2259 -#define wxFindReplaceData_destroy 2260 -#define wxMultiChoiceDialog_new_0 2261 -#define wxMultiChoiceDialog_new_5 2263 -#define wxMultiChoiceDialog_GetSelections 2264 -#define wxMultiChoiceDialog_SetSelections 2265 -#define wxMultiChoiceDialog_destroy 2266 -#define wxSingleChoiceDialog_new_0 2267 -#define wxSingleChoiceDialog_new_5 2269 -#define wxSingleChoiceDialog_GetSelection 2270 -#define wxSingleChoiceDialog_GetStringSelection 2271 -#define wxSingleChoiceDialog_SetSelection 2272 -#define wxSingleChoiceDialog_destroy 2273 -#define wxTextEntryDialog_new 2274 -#define wxTextEntryDialog_GetValue 2275 -#define wxTextEntryDialog_SetValue 2276 -#define wxTextEntryDialog_destroy 2277 -#define wxPasswordEntryDialog_new 2278 -#define wxPasswordEntryDialog_destroy 2279 -#define wxFontData_new_0 2280 -#define wxFontData_new_1 2281 -#define wxFontData_destruct 2282 -#define wxFontData_EnableEffects 2283 -#define wxFontData_GetAllowSymbols 2284 -#define wxFontData_GetColour 2285 -#define wxFontData_GetChosenFont 2286 -#define wxFontData_GetEnableEffects 2287 -#define wxFontData_GetInitialFont 2288 -#define wxFontData_GetShowHelp 2289 -#define wxFontData_SetAllowSymbols 2290 -#define wxFontData_SetChosenFont 2291 -#define wxFontData_SetColour 2292 -#define wxFontData_SetInitialFont 2293 -#define wxFontData_SetRange 2294 -#define wxFontData_SetShowHelp 2295 -#define wxFontDialog_new_0 2299 -#define wxFontDialog_new_2 2301 -#define wxFontDialog_Create 2303 -#define wxFontDialog_GetFontData 2304 -#define wxFontDialog_destroy 2306 -#define wxProgressDialog_new 2307 -#define wxProgressDialog_destruct 2308 -#define wxProgressDialog_Resume 2309 -#define wxProgressDialog_Update_2 2310 -#define wxProgressDialog_Update_0 2311 -#define wxMessageDialog_new 2312 -#define wxMessageDialog_destruct 2313 -#define wxPageSetupDialog_new 2314 -#define wxPageSetupDialog_destruct 2315 -#define wxPageSetupDialog_GetPageSetupData 2316 -#define wxPageSetupDialog_ShowModal 2317 -#define wxPageSetupDialogData_new_0 2318 -#define wxPageSetupDialogData_new_1_0 2319 -#define wxPageSetupDialogData_new_1_1 2320 -#define wxPageSetupDialogData_destruct 2321 -#define wxPageSetupDialogData_EnableHelp 2322 -#define wxPageSetupDialogData_EnableMargins 2323 -#define wxPageSetupDialogData_EnableOrientation 2324 -#define wxPageSetupDialogData_EnablePaper 2325 -#define wxPageSetupDialogData_EnablePrinter 2326 -#define wxPageSetupDialogData_GetDefaultMinMargins 2327 -#define wxPageSetupDialogData_GetEnableMargins 2328 -#define wxPageSetupDialogData_GetEnableOrientation 2329 -#define wxPageSetupDialogData_GetEnablePaper 2330 -#define wxPageSetupDialogData_GetEnablePrinter 2331 -#define wxPageSetupDialogData_GetEnableHelp 2332 -#define wxPageSetupDialogData_GetDefaultInfo 2333 -#define wxPageSetupDialogData_GetMarginTopLeft 2334 -#define wxPageSetupDialogData_GetMarginBottomRight 2335 -#define wxPageSetupDialogData_GetMinMarginTopLeft 2336 -#define wxPageSetupDialogData_GetMinMarginBottomRight 2337 -#define wxPageSetupDialogData_GetPaperId 2338 -#define wxPageSetupDialogData_GetPaperSize 2339 -#define wxPageSetupDialogData_GetPrintData 2341 -#define wxPageSetupDialogData_IsOk 2342 -#define wxPageSetupDialogData_SetDefaultInfo 2343 -#define wxPageSetupDialogData_SetDefaultMinMargins 2344 -#define wxPageSetupDialogData_SetMarginTopLeft 2345 -#define wxPageSetupDialogData_SetMarginBottomRight 2346 -#define wxPageSetupDialogData_SetMinMarginTopLeft 2347 -#define wxPageSetupDialogData_SetMinMarginBottomRight 2348 -#define wxPageSetupDialogData_SetPaperId 2349 -#define wxPageSetupDialogData_SetPaperSize_1_1 2350 -#define wxPageSetupDialogData_SetPaperSize_1_0 2351 -#define wxPageSetupDialogData_SetPrintData 2352 -#define wxPrintDialog_new_2_0 2353 -#define wxPrintDialog_new_2_1 2354 -#define wxPrintDialog_destruct 2355 -#define wxPrintDialog_GetPrintDialogData 2356 -#define wxPrintDialog_GetPrintDC 2357 -#define wxPrintDialogData_new_0 2358 -#define wxPrintDialogData_new_1_1 2359 -#define wxPrintDialogData_new_1_0 2360 -#define wxPrintDialogData_destruct 2361 -#define wxPrintDialogData_EnableHelp 2362 -#define wxPrintDialogData_EnablePageNumbers 2363 -#define wxPrintDialogData_EnablePrintToFile 2364 -#define wxPrintDialogData_EnableSelection 2365 -#define wxPrintDialogData_GetAllPages 2366 -#define wxPrintDialogData_GetCollate 2367 -#define wxPrintDialogData_GetFromPage 2368 -#define wxPrintDialogData_GetMaxPage 2369 -#define wxPrintDialogData_GetMinPage 2370 -#define wxPrintDialogData_GetNoCopies 2371 -#define wxPrintDialogData_GetPrintData 2372 -#define wxPrintDialogData_GetPrintToFile 2373 -#define wxPrintDialogData_GetSelection 2374 -#define wxPrintDialogData_GetToPage 2375 -#define wxPrintDialogData_IsOk 2376 -#define wxPrintDialogData_SetCollate 2377 -#define wxPrintDialogData_SetFromPage 2378 -#define wxPrintDialogData_SetMaxPage 2379 -#define wxPrintDialogData_SetMinPage 2380 -#define wxPrintDialogData_SetNoCopies 2381 -#define wxPrintDialogData_SetPrintData 2382 -#define wxPrintDialogData_SetPrintToFile 2383 -#define wxPrintDialogData_SetSelection 2384 -#define wxPrintDialogData_SetToPage 2385 -#define wxPrintData_new_0 2386 -#define wxPrintData_new_1 2387 -#define wxPrintData_destruct 2388 -#define wxPrintData_GetCollate 2389 -#define wxPrintData_GetBin 2390 -#define wxPrintData_GetColour 2391 -#define wxPrintData_GetDuplex 2392 -#define wxPrintData_GetNoCopies 2393 -#define wxPrintData_GetOrientation 2394 -#define wxPrintData_GetPaperId 2395 -#define wxPrintData_GetPrinterName 2396 -#define wxPrintData_GetQuality 2397 -#define wxPrintData_IsOk 2398 -#define wxPrintData_SetBin 2399 -#define wxPrintData_SetCollate 2400 -#define wxPrintData_SetColour 2401 -#define wxPrintData_SetDuplex 2402 -#define wxPrintData_SetNoCopies 2403 -#define wxPrintData_SetOrientation 2404 -#define wxPrintData_SetPaperId 2405 -#define wxPrintData_SetPrinterName 2406 -#define wxPrintData_SetQuality 2407 -#define wxPrintPreview_new_2 2410 -#define wxPrintPreview_new_3 2411 -#define wxPrintPreview_destruct 2413 -#define wxPrintPreview_GetCanvas 2414 -#define wxPrintPreview_GetCurrentPage 2415 -#define wxPrintPreview_GetFrame 2416 -#define wxPrintPreview_GetMaxPage 2417 -#define wxPrintPreview_GetMinPage 2418 -#define wxPrintPreview_GetPrintout 2419 -#define wxPrintPreview_GetPrintoutForPrinting 2420 -#define wxPrintPreview_IsOk 2421 -#define wxPrintPreview_PaintPage 2422 -#define wxPrintPreview_Print 2423 -#define wxPrintPreview_RenderPage 2424 -#define wxPrintPreview_SetCanvas 2425 -#define wxPrintPreview_SetCurrentPage 2426 -#define wxPrintPreview_SetFrame 2427 -#define wxPrintPreview_SetPrintout 2428 -#define wxPrintPreview_SetZoom 2429 -#define wxPreviewFrame_new 2430 -#define wxPreviewFrame_destruct 2431 -#define wxPreviewFrame_CreateControlBar 2432 -#define wxPreviewFrame_CreateCanvas 2433 -#define wxPreviewFrame_Initialize 2434 -#define wxPreviewFrame_OnCloseWindow 2435 -#define wxPreviewControlBar_new 2436 -#define wxPreviewControlBar_destruct 2437 -#define wxPreviewControlBar_CreateButtons 2438 -#define wxPreviewControlBar_GetPrintPreview 2439 -#define wxPreviewControlBar_GetZoomControl 2440 -#define wxPreviewControlBar_SetZoomControl 2441 -#define wxPrinter_new 2443 -#define wxPrinter_CreateAbortWindow 2444 -#define wxPrinter_GetAbort 2445 -#define wxPrinter_GetLastError 2446 -#define wxPrinter_GetPrintDialogData 2447 -#define wxPrinter_Print 2448 -#define wxPrinter_PrintDialog 2449 -#define wxPrinter_ReportError 2450 -#define wxPrinter_Setup 2451 -#define wxPrinter_destroy 2452 -#define wxXmlResource_new_1 2453 -#define wxXmlResource_new_2 2454 -#define wxXmlResource_destruct 2455 -#define wxXmlResource_AttachUnknownControl 2456 -#define wxXmlResource_ClearHandlers 2457 -#define wxXmlResource_CompareVersion 2458 -#define wxXmlResource_Get 2459 -#define wxXmlResource_GetFlags 2460 -#define wxXmlResource_GetVersion 2461 -#define wxXmlResource_GetXRCID 2462 -#define wxXmlResource_InitAllHandlers 2463 -#define wxXmlResource_Load 2464 -#define wxXmlResource_LoadBitmap 2465 -#define wxXmlResource_LoadDialog_2 2466 -#define wxXmlResource_LoadDialog_3 2467 -#define wxXmlResource_LoadFrame_2 2468 -#define wxXmlResource_LoadFrame_3 2469 -#define wxXmlResource_LoadIcon 2470 -#define wxXmlResource_LoadMenu 2471 -#define wxXmlResource_LoadMenuBar_2 2472 -#define wxXmlResource_LoadMenuBar_1 2473 -#define wxXmlResource_LoadPanel_2 2474 -#define wxXmlResource_LoadPanel_3 2475 -#define wxXmlResource_LoadToolBar 2476 -#define wxXmlResource_Set 2477 -#define wxXmlResource_SetFlags 2478 -#define wxXmlResource_Unload 2479 -#define wxXmlResource_xrcctrl 2480 -#define wxHtmlEasyPrinting_new 2481 -#define wxHtmlEasyPrinting_destruct 2482 -#define wxHtmlEasyPrinting_GetPrintData 2483 -#define wxHtmlEasyPrinting_GetPageSetupData 2484 -#define wxHtmlEasyPrinting_PreviewFile 2485 -#define wxHtmlEasyPrinting_PreviewText 2486 -#define wxHtmlEasyPrinting_PrintFile 2487 -#define wxHtmlEasyPrinting_PrintText 2488 -#define wxHtmlEasyPrinting_PageSetup 2489 -#define wxHtmlEasyPrinting_SetFonts 2490 -#define wxHtmlEasyPrinting_SetHeader 2491 -#define wxHtmlEasyPrinting_SetFooter 2492 -#define wxGLCanvas_new_2 2494 -#define wxGLCanvas_new_3_1 2495 -#define wxGLCanvas_new_3_0 2496 -#define wxGLCanvas_GetContext 2497 -#define wxGLCanvas_SetCurrent 2499 -#define wxGLCanvas_SwapBuffers 2500 -#define wxGLCanvas_destroy 2501 -#define wxAuiManager_new 2502 -#define wxAuiManager_destruct 2503 -#define wxAuiManager_AddPane_2_1 2504 -#define wxAuiManager_AddPane_3 2505 -#define wxAuiManager_AddPane_2_0 2506 -#define wxAuiManager_DetachPane 2507 -#define wxAuiManager_GetAllPanes 2508 -#define wxAuiManager_GetArtProvider 2509 -#define wxAuiManager_GetDockSizeConstraint 2510 -#define wxAuiManager_GetFlags 2511 -#define wxAuiManager_GetManagedWindow 2512 -#define wxAuiManager_GetManager 2513 -#define wxAuiManager_GetPane_1_1 2514 -#define wxAuiManager_GetPane_1_0 2515 -#define wxAuiManager_HideHint 2516 -#define wxAuiManager_InsertPane 2517 -#define wxAuiManager_LoadPaneInfo 2518 -#define wxAuiManager_LoadPerspective 2519 -#define wxAuiManager_SavePaneInfo 2520 -#define wxAuiManager_SavePerspective 2521 -#define wxAuiManager_SetArtProvider 2522 -#define wxAuiManager_SetDockSizeConstraint 2523 -#define wxAuiManager_SetFlags 2524 -#define wxAuiManager_SetManagedWindow 2525 -#define wxAuiManager_ShowHint 2526 -#define wxAuiManager_UnInit 2527 -#define wxAuiManager_Update 2528 -#define wxAuiPaneInfo_BestSize_1 2529 -#define wxAuiPaneInfo_BestSize_2 2530 -#define wxAuiPaneInfo_Bottom 2531 -#define wxAuiPaneInfo_BottomDockable 2532 -#define wxAuiPaneInfo_Caption 2533 -#define wxAuiPaneInfo_CaptionVisible 2534 -#define wxAuiPaneInfo_Centre 2535 -#define wxAuiPaneInfo_CentrePane 2536 -#define wxAuiPaneInfo_CloseButton 2537 -#define wxAuiPaneInfo_DefaultPane 2538 -#define wxAuiPaneInfo_DestroyOnClose 2539 -#define wxAuiPaneInfo_Direction 2540 -#define wxAuiPaneInfo_Dock 2541 -#define wxAuiPaneInfo_Dockable 2542 -#define wxAuiPaneInfo_Fixed 2543 -#define wxAuiPaneInfo_Float 2544 -#define wxAuiPaneInfo_Floatable 2545 -#define wxAuiPaneInfo_FloatingPosition_1 2546 -#define wxAuiPaneInfo_FloatingPosition_2 2547 -#define wxAuiPaneInfo_FloatingSize_1 2548 -#define wxAuiPaneInfo_FloatingSize_2 2549 -#define wxAuiPaneInfo_Gripper 2550 -#define wxAuiPaneInfo_GripperTop 2551 -#define wxAuiPaneInfo_HasBorder 2552 -#define wxAuiPaneInfo_HasCaption 2553 -#define wxAuiPaneInfo_HasCloseButton 2554 -#define wxAuiPaneInfo_HasFlag 2555 -#define wxAuiPaneInfo_HasGripper 2556 -#define wxAuiPaneInfo_HasGripperTop 2557 -#define wxAuiPaneInfo_HasMaximizeButton 2558 -#define wxAuiPaneInfo_HasMinimizeButton 2559 -#define wxAuiPaneInfo_HasPinButton 2560 -#define wxAuiPaneInfo_Hide 2561 -#define wxAuiPaneInfo_IsBottomDockable 2562 -#define wxAuiPaneInfo_IsDocked 2563 -#define wxAuiPaneInfo_IsFixed 2564 -#define wxAuiPaneInfo_IsFloatable 2565 -#define wxAuiPaneInfo_IsFloating 2566 -#define wxAuiPaneInfo_IsLeftDockable 2567 -#define wxAuiPaneInfo_IsMovable 2568 -#define wxAuiPaneInfo_IsOk 2569 -#define wxAuiPaneInfo_IsResizable 2570 -#define wxAuiPaneInfo_IsRightDockable 2571 -#define wxAuiPaneInfo_IsShown 2572 -#define wxAuiPaneInfo_IsToolbar 2573 -#define wxAuiPaneInfo_IsTopDockable 2574 -#define wxAuiPaneInfo_Layer 2575 -#define wxAuiPaneInfo_Left 2576 -#define wxAuiPaneInfo_LeftDockable 2577 -#define wxAuiPaneInfo_MaxSize_1 2578 -#define wxAuiPaneInfo_MaxSize_2 2579 -#define wxAuiPaneInfo_MaximizeButton 2580 -#define wxAuiPaneInfo_MinSize_1 2581 -#define wxAuiPaneInfo_MinSize_2 2582 -#define wxAuiPaneInfo_MinimizeButton 2583 -#define wxAuiPaneInfo_Movable 2584 -#define wxAuiPaneInfo_Name 2585 -#define wxAuiPaneInfo_PaneBorder 2586 -#define wxAuiPaneInfo_PinButton 2587 -#define wxAuiPaneInfo_Position 2588 -#define wxAuiPaneInfo_Resizable 2589 -#define wxAuiPaneInfo_Right 2590 -#define wxAuiPaneInfo_RightDockable 2591 -#define wxAuiPaneInfo_Row 2592 -#define wxAuiPaneInfo_SafeSet 2593 -#define wxAuiPaneInfo_SetFlag 2594 -#define wxAuiPaneInfo_Show 2595 -#define wxAuiPaneInfo_ToolbarPane 2596 -#define wxAuiPaneInfo_Top 2597 -#define wxAuiPaneInfo_TopDockable 2598 -#define wxAuiPaneInfo_Window 2599 -#define wxAuiNotebook_new_0 2600 -#define wxAuiNotebook_new_2 2601 -#define wxAuiNotebook_AddPage 2602 -#define wxAuiNotebook_Create 2603 -#define wxAuiNotebook_DeletePage 2604 -#define wxAuiNotebook_GetArtProvider 2605 -#define wxAuiNotebook_GetPage 2606 -#define wxAuiNotebook_GetPageBitmap 2607 -#define wxAuiNotebook_GetPageCount 2608 -#define wxAuiNotebook_GetPageIndex 2609 -#define wxAuiNotebook_GetPageText 2610 -#define wxAuiNotebook_GetSelection 2611 -#define wxAuiNotebook_InsertPage 2612 -#define wxAuiNotebook_RemovePage 2613 -#define wxAuiNotebook_SetArtProvider 2614 -#define wxAuiNotebook_SetFont 2615 -#define wxAuiNotebook_SetPageBitmap 2616 -#define wxAuiNotebook_SetPageText 2617 -#define wxAuiNotebook_SetSelection 2618 -#define wxAuiNotebook_SetTabCtrlHeight 2619 -#define wxAuiNotebook_SetUniformBitmapSize 2620 -#define wxAuiNotebook_destroy 2621 -#define wxMDIParentFrame_new_0 2622 -#define wxMDIParentFrame_new_4 2623 -#define wxMDIParentFrame_destruct 2624 -#define wxMDIParentFrame_ActivateNext 2625 -#define wxMDIParentFrame_ActivatePrevious 2626 -#define wxMDIParentFrame_ArrangeIcons 2627 -#define wxMDIParentFrame_Cascade 2628 -#define wxMDIParentFrame_Create 2629 -#define wxMDIParentFrame_GetActiveChild 2630 -#define wxMDIParentFrame_GetClientWindow 2631 -#define wxMDIParentFrame_Tile 2632 -#define wxMDIChildFrame_new_0 2633 -#define wxMDIChildFrame_new_4 2634 -#define wxMDIChildFrame_destruct 2635 -#define wxMDIChildFrame_Activate 2636 -#define wxMDIChildFrame_Create 2637 -#define wxMDIChildFrame_Maximize 2638 -#define wxMDIChildFrame_Restore 2639 -#define wxMDIClientWindow_new_0 2640 -#define wxMDIClientWindow_new_2 2641 -#define wxMDIClientWindow_destruct 2642 -#define wxMDIClientWindow_CreateClient 2643 -#define wxLayoutAlgorithm_new 2644 -#define wxLayoutAlgorithm_LayoutFrame 2645 -#define wxLayoutAlgorithm_LayoutMDIFrame 2646 -#define wxLayoutAlgorithm_LayoutWindow 2647 -#define wxLayoutAlgorithm_destroy 2648 -#define wxEvent_GetId 2649 -#define wxEvent_GetSkipped 2650 -#define wxEvent_GetTimestamp 2651 -#define wxEvent_IsCommandEvent 2652 -#define wxEvent_ResumePropagation 2653 -#define wxEvent_ShouldPropagate 2654 -#define wxEvent_Skip 2655 -#define wxEvent_StopPropagation 2656 -#define wxCommandEvent_getClientData 2657 -#define wxCommandEvent_GetExtraLong 2658 -#define wxCommandEvent_GetInt 2659 -#define wxCommandEvent_GetSelection 2660 -#define wxCommandEvent_GetString 2661 -#define wxCommandEvent_IsChecked 2662 -#define wxCommandEvent_IsSelection 2663 -#define wxCommandEvent_SetInt 2664 -#define wxCommandEvent_SetString 2665 -#define wxScrollEvent_GetOrientation 2666 -#define wxScrollEvent_GetPosition 2667 -#define wxScrollWinEvent_GetOrientation 2668 -#define wxScrollWinEvent_GetPosition 2669 -#define wxMouseEvent_AltDown 2670 -#define wxMouseEvent_Button 2671 -#define wxMouseEvent_ButtonDClick 2672 -#define wxMouseEvent_ButtonDown 2673 -#define wxMouseEvent_ButtonUp 2674 -#define wxMouseEvent_CmdDown 2675 -#define wxMouseEvent_ControlDown 2676 -#define wxMouseEvent_Dragging 2677 -#define wxMouseEvent_Entering 2678 -#define wxMouseEvent_GetButton 2679 -#define wxMouseEvent_GetPosition 2682 -#define wxMouseEvent_GetLogicalPosition 2683 -#define wxMouseEvent_GetLinesPerAction 2684 -#define wxMouseEvent_GetWheelRotation 2685 -#define wxMouseEvent_GetWheelDelta 2686 -#define wxMouseEvent_GetX 2687 -#define wxMouseEvent_GetY 2688 -#define wxMouseEvent_IsButton 2689 -#define wxMouseEvent_IsPageScroll 2690 -#define wxMouseEvent_Leaving 2691 -#define wxMouseEvent_LeftDClick 2692 -#define wxMouseEvent_LeftDown 2693 -#define wxMouseEvent_LeftIsDown 2694 -#define wxMouseEvent_LeftUp 2695 -#define wxMouseEvent_MetaDown 2696 -#define wxMouseEvent_MiddleDClick 2697 -#define wxMouseEvent_MiddleDown 2698 -#define wxMouseEvent_MiddleIsDown 2699 -#define wxMouseEvent_MiddleUp 2700 -#define wxMouseEvent_Moving 2701 -#define wxMouseEvent_RightDClick 2702 -#define wxMouseEvent_RightDown 2703 -#define wxMouseEvent_RightIsDown 2704 -#define wxMouseEvent_RightUp 2705 -#define wxMouseEvent_ShiftDown 2706 -#define wxSetCursorEvent_GetCursor 2707 -#define wxSetCursorEvent_GetX 2708 -#define wxSetCursorEvent_GetY 2709 -#define wxSetCursorEvent_HasCursor 2710 -#define wxSetCursorEvent_SetCursor 2711 -#define wxKeyEvent_AltDown 2712 -#define wxKeyEvent_CmdDown 2713 -#define wxKeyEvent_ControlDown 2714 -#define wxKeyEvent_GetKeyCode 2715 -#define wxKeyEvent_GetModifiers 2716 -#define wxKeyEvent_GetPosition 2719 -#define wxKeyEvent_GetRawKeyCode 2720 -#define wxKeyEvent_GetRawKeyFlags 2721 -#define wxKeyEvent_GetUnicodeKey 2722 -#define wxKeyEvent_GetX 2723 -#define wxKeyEvent_GetY 2724 -#define wxKeyEvent_HasModifiers 2725 -#define wxKeyEvent_MetaDown 2726 -#define wxKeyEvent_ShiftDown 2727 -#define wxSizeEvent_GetSize 2728 -#define wxMoveEvent_GetPosition 2729 -#define wxEraseEvent_GetDC 2730 -#define wxFocusEvent_GetWindow 2731 -#define wxChildFocusEvent_GetWindow 2732 -#define wxMenuEvent_GetMenu 2733 -#define wxMenuEvent_GetMenuId 2734 -#define wxMenuEvent_IsPopup 2735 -#define wxCloseEvent_CanVeto 2736 -#define wxCloseEvent_GetLoggingOff 2737 -#define wxCloseEvent_SetCanVeto 2738 -#define wxCloseEvent_SetLoggingOff 2739 -#define wxCloseEvent_Veto 2740 -#define wxShowEvent_SetShow 2741 -#define wxShowEvent_GetShow 2742 -#define wxIconizeEvent_Iconized 2743 -#define wxJoystickEvent_ButtonDown 2744 -#define wxJoystickEvent_ButtonIsDown 2745 -#define wxJoystickEvent_ButtonUp 2746 -#define wxJoystickEvent_GetButtonChange 2747 -#define wxJoystickEvent_GetButtonState 2748 -#define wxJoystickEvent_GetJoystick 2749 -#define wxJoystickEvent_GetPosition 2750 -#define wxJoystickEvent_GetZPosition 2751 -#define wxJoystickEvent_IsButton 2752 -#define wxJoystickEvent_IsMove 2753 -#define wxJoystickEvent_IsZMove 2754 -#define wxUpdateUIEvent_CanUpdate 2755 -#define wxUpdateUIEvent_Check 2756 -#define wxUpdateUIEvent_Enable 2757 -#define wxUpdateUIEvent_Show 2758 -#define wxUpdateUIEvent_GetChecked 2759 -#define wxUpdateUIEvent_GetEnabled 2760 -#define wxUpdateUIEvent_GetShown 2761 -#define wxUpdateUIEvent_GetSetChecked 2762 -#define wxUpdateUIEvent_GetSetEnabled 2763 -#define wxUpdateUIEvent_GetSetShown 2764 -#define wxUpdateUIEvent_GetSetText 2765 -#define wxUpdateUIEvent_GetText 2766 -#define wxUpdateUIEvent_GetMode 2767 -#define wxUpdateUIEvent_GetUpdateInterval 2768 -#define wxUpdateUIEvent_ResetUpdateTime 2769 -#define wxUpdateUIEvent_SetMode 2770 -#define wxUpdateUIEvent_SetText 2771 -#define wxUpdateUIEvent_SetUpdateInterval 2772 -#define wxMouseCaptureChangedEvent_GetCapturedWindow 2773 -#define wxPaletteChangedEvent_SetChangedWindow 2774 -#define wxPaletteChangedEvent_GetChangedWindow 2775 -#define wxQueryNewPaletteEvent_SetPaletteRealized 2776 -#define wxQueryNewPaletteEvent_GetPaletteRealized 2777 -#define wxNavigationKeyEvent_GetDirection 2778 -#define wxNavigationKeyEvent_SetDirection 2779 -#define wxNavigationKeyEvent_IsWindowChange 2780 -#define wxNavigationKeyEvent_SetWindowChange 2781 -#define wxNavigationKeyEvent_IsFromTab 2782 -#define wxNavigationKeyEvent_SetFromTab 2783 -#define wxNavigationKeyEvent_GetCurrentFocus 2784 -#define wxNavigationKeyEvent_SetCurrentFocus 2785 -#define wxHelpEvent_GetOrigin 2786 -#define wxHelpEvent_GetPosition 2787 -#define wxHelpEvent_SetOrigin 2788 -#define wxHelpEvent_SetPosition 2789 -#define wxContextMenuEvent_GetPosition 2790 -#define wxContextMenuEvent_SetPosition 2791 -#define wxIdleEvent_CanSend 2792 -#define wxIdleEvent_GetMode 2793 -#define wxIdleEvent_RequestMore 2794 -#define wxIdleEvent_MoreRequested 2795 -#define wxIdleEvent_SetMode 2796 -#define wxGridEvent_AltDown 2797 -#define wxGridEvent_ControlDown 2798 -#define wxGridEvent_GetCol 2799 -#define wxGridEvent_GetPosition 2800 -#define wxGridEvent_GetRow 2801 -#define wxGridEvent_MetaDown 2802 -#define wxGridEvent_Selecting 2803 -#define wxGridEvent_ShiftDown 2804 -#define wxNotifyEvent_Allow 2805 -#define wxNotifyEvent_IsAllowed 2806 -#define wxNotifyEvent_Veto 2807 -#define wxSashEvent_GetEdge 2808 -#define wxSashEvent_GetDragRect 2809 -#define wxSashEvent_GetDragStatus 2810 -#define wxListEvent_GetCacheFrom 2811 -#define wxListEvent_GetCacheTo 2812 -#define wxListEvent_GetKeyCode 2813 -#define wxListEvent_GetIndex 2814 -#define wxListEvent_GetColumn 2815 -#define wxListEvent_GetPoint 2816 -#define wxListEvent_GetLabel 2817 -#define wxListEvent_GetText 2818 -#define wxListEvent_GetImage 2819 -#define wxListEvent_GetData 2820 -#define wxListEvent_GetMask 2821 -#define wxListEvent_GetItem 2822 -#define wxListEvent_IsEditCancelled 2823 -#define wxDateEvent_GetDate 2824 -#define wxCalendarEvent_GetWeekDay 2825 -#define wxFileDirPickerEvent_GetPath 2826 -#define wxColourPickerEvent_GetColour 2827 -#define wxFontPickerEvent_GetFont 2828 -#define wxStyledTextEvent_GetPosition 2829 -#define wxStyledTextEvent_GetKey 2830 -#define wxStyledTextEvent_GetModifiers 2831 -#define wxStyledTextEvent_GetModificationType 2832 -#define wxStyledTextEvent_GetText 2833 -#define wxStyledTextEvent_GetLength 2834 -#define wxStyledTextEvent_GetLinesAdded 2835 -#define wxStyledTextEvent_GetLine 2836 -#define wxStyledTextEvent_GetFoldLevelNow 2837 -#define wxStyledTextEvent_GetFoldLevelPrev 2838 -#define wxStyledTextEvent_GetMargin 2839 -#define wxStyledTextEvent_GetMessage 2840 -#define wxStyledTextEvent_GetWParam 2841 -#define wxStyledTextEvent_GetLParam 2842 -#define wxStyledTextEvent_GetListType 2843 -#define wxStyledTextEvent_GetX 2844 -#define wxStyledTextEvent_GetY 2845 -#define wxStyledTextEvent_GetDragText 2846 -#define wxStyledTextEvent_GetDragAllowMove 2847 -#define wxStyledTextEvent_GetDragResult 2848 -#define wxStyledTextEvent_GetShift 2849 -#define wxStyledTextEvent_GetControl 2850 -#define wxStyledTextEvent_GetAlt 2851 -#define utils_wxGetKeyState 2852 -#define utils_wxGetMousePosition 2853 -#define utils_wxGetMouseState 2854 -#define utils_wxSetDetectableAutoRepeat 2855 -#define utils_wxBell 2856 -#define utils_wxFindMenuItemId 2857 -#define utils_wxGenericFindWindowAtPoint 2858 -#define utils_wxFindWindowAtPoint 2859 -#define utils_wxBeginBusyCursor 2860 -#define utils_wxEndBusyCursor 2861 -#define utils_wxIsBusy 2862 -#define utils_wxShutdown 2863 -#define utils_wxShell 2864 -#define utils_wxLaunchDefaultBrowser 2865 -#define utils_wxGetEmailAddress 2866 -#define utils_wxGetUserId 2867 -#define utils_wxGetHomeDir 2868 -#define utils_wxNewId 2869 -#define utils_wxRegisterId 2870 -#define utils_wxGetCurrentId 2871 -#define utils_wxGetOsDescription 2872 -#define utils_wxIsPlatformLittleEndian 2873 -#define utils_wxIsPlatform64Bit 2874 -#define wxPrintout_new 2875 -#define wxPrintout_destruct 2876 -#define wxPrintout_GetDC 2877 -#define wxPrintout_GetPageSizeMM 2878 -#define wxPrintout_GetPageSizePixels 2879 -#define wxPrintout_GetPaperRectPixels 2880 -#define wxPrintout_GetPPIPrinter 2881 -#define wxPrintout_GetPPIScreen 2882 -#define wxPrintout_GetTitle 2883 -#define wxPrintout_IsPreview 2884 -#define wxPrintout_FitThisSizeToPaper 2885 -#define wxPrintout_FitThisSizeToPage 2886 -#define wxPrintout_FitThisSizeToPageMargins 2887 -#define wxPrintout_MapScreenSizeToPaper 2888 -#define wxPrintout_MapScreenSizeToPage 2889 -#define wxPrintout_MapScreenSizeToPageMargins 2890 -#define wxPrintout_MapScreenSizeToDevice 2891 -#define wxPrintout_GetLogicalPaperRect 2892 -#define wxPrintout_GetLogicalPageRect 2893 -#define wxPrintout_GetLogicalPageMarginsRect 2894 -#define wxPrintout_SetLogicalOrigin 2895 -#define wxPrintout_OffsetLogicalOrigin 2896 -#define wxStyledTextCtrl_new_2 2897 -#define wxStyledTextCtrl_new_0 2898 -#define wxStyledTextCtrl_destruct 2899 -#define wxStyledTextCtrl_Create 2900 -#define wxStyledTextCtrl_AddText 2901 -#define wxStyledTextCtrl_AddStyledText 2902 -#define wxStyledTextCtrl_InsertText 2903 -#define wxStyledTextCtrl_ClearAll 2904 -#define wxStyledTextCtrl_ClearDocumentStyle 2905 -#define wxStyledTextCtrl_GetLength 2906 -#define wxStyledTextCtrl_GetCharAt 2907 -#define wxStyledTextCtrl_GetCurrentPos 2908 -#define wxStyledTextCtrl_GetAnchor 2909 -#define wxStyledTextCtrl_GetStyleAt 2910 -#define wxStyledTextCtrl_Redo 2911 -#define wxStyledTextCtrl_SetUndoCollection 2912 -#define wxStyledTextCtrl_SelectAll 2913 -#define wxStyledTextCtrl_SetSavePoint 2914 -#define wxStyledTextCtrl_GetStyledText 2915 -#define wxStyledTextCtrl_CanRedo 2916 -#define wxStyledTextCtrl_MarkerLineFromHandle 2917 -#define wxStyledTextCtrl_MarkerDeleteHandle 2918 -#define wxStyledTextCtrl_GetUndoCollection 2919 -#define wxStyledTextCtrl_GetViewWhiteSpace 2920 -#define wxStyledTextCtrl_SetViewWhiteSpace 2921 -#define wxStyledTextCtrl_PositionFromPoint 2922 -#define wxStyledTextCtrl_PositionFromPointClose 2923 -#define wxStyledTextCtrl_GotoLine 2924 -#define wxStyledTextCtrl_GotoPos 2925 -#define wxStyledTextCtrl_SetAnchor 2926 -#define wxStyledTextCtrl_GetCurLine 2927 -#define wxStyledTextCtrl_GetEndStyled 2928 -#define wxStyledTextCtrl_ConvertEOLs 2929 -#define wxStyledTextCtrl_GetEOLMode 2930 -#define wxStyledTextCtrl_SetEOLMode 2931 -#define wxStyledTextCtrl_StartStyling 2932 -#define wxStyledTextCtrl_SetStyling 2933 -#define wxStyledTextCtrl_GetBufferedDraw 2934 -#define wxStyledTextCtrl_SetBufferedDraw 2935 -#define wxStyledTextCtrl_SetTabWidth 2936 -#define wxStyledTextCtrl_GetTabWidth 2937 -#define wxStyledTextCtrl_SetCodePage 2938 -#define wxStyledTextCtrl_MarkerDefine 2939 -#define wxStyledTextCtrl_MarkerSetForeground 2940 -#define wxStyledTextCtrl_MarkerSetBackground 2941 -#define wxStyledTextCtrl_MarkerAdd 2942 -#define wxStyledTextCtrl_MarkerDelete 2943 -#define wxStyledTextCtrl_MarkerDeleteAll 2944 -#define wxStyledTextCtrl_MarkerGet 2945 -#define wxStyledTextCtrl_MarkerNext 2946 -#define wxStyledTextCtrl_MarkerPrevious 2947 -#define wxStyledTextCtrl_MarkerDefineBitmap 2948 -#define wxStyledTextCtrl_MarkerAddSet 2949 -#define wxStyledTextCtrl_MarkerSetAlpha 2950 -#define wxStyledTextCtrl_SetMarginType 2951 -#define wxStyledTextCtrl_GetMarginType 2952 -#define wxStyledTextCtrl_SetMarginWidth 2953 -#define wxStyledTextCtrl_GetMarginWidth 2954 -#define wxStyledTextCtrl_SetMarginMask 2955 -#define wxStyledTextCtrl_GetMarginMask 2956 -#define wxStyledTextCtrl_SetMarginSensitive 2957 -#define wxStyledTextCtrl_GetMarginSensitive 2958 -#define wxStyledTextCtrl_StyleClearAll 2959 -#define wxStyledTextCtrl_StyleSetForeground 2960 -#define wxStyledTextCtrl_StyleSetBackground 2961 -#define wxStyledTextCtrl_StyleSetBold 2962 -#define wxStyledTextCtrl_StyleSetItalic 2963 -#define wxStyledTextCtrl_StyleSetSize 2964 -#define wxStyledTextCtrl_StyleSetFaceName 2965 -#define wxStyledTextCtrl_StyleSetEOLFilled 2966 -#define wxStyledTextCtrl_StyleResetDefault 2967 -#define wxStyledTextCtrl_StyleSetUnderline 2968 -#define wxStyledTextCtrl_StyleSetCase 2969 -#define wxStyledTextCtrl_StyleSetHotSpot 2970 -#define wxStyledTextCtrl_SetSelForeground 2971 -#define wxStyledTextCtrl_SetSelBackground 2972 -#define wxStyledTextCtrl_GetSelAlpha 2973 -#define wxStyledTextCtrl_SetSelAlpha 2974 -#define wxStyledTextCtrl_SetCaretForeground 2975 -#define wxStyledTextCtrl_CmdKeyAssign 2976 -#define wxStyledTextCtrl_CmdKeyClear 2977 -#define wxStyledTextCtrl_CmdKeyClearAll 2978 -#define wxStyledTextCtrl_SetStyleBytes 2979 -#define wxStyledTextCtrl_StyleSetVisible 2980 -#define wxStyledTextCtrl_GetCaretPeriod 2981 -#define wxStyledTextCtrl_SetCaretPeriod 2982 -#define wxStyledTextCtrl_SetWordChars 2983 -#define wxStyledTextCtrl_BeginUndoAction 2984 -#define wxStyledTextCtrl_EndUndoAction 2985 -#define wxStyledTextCtrl_IndicatorSetStyle 2986 -#define wxStyledTextCtrl_IndicatorGetStyle 2987 -#define wxStyledTextCtrl_IndicatorSetForeground 2988 -#define wxStyledTextCtrl_IndicatorGetForeground 2989 -#define wxStyledTextCtrl_SetWhitespaceForeground 2990 -#define wxStyledTextCtrl_SetWhitespaceBackground 2991 -#define wxStyledTextCtrl_GetStyleBits 2992 -#define wxStyledTextCtrl_SetLineState 2993 -#define wxStyledTextCtrl_GetLineState 2994 -#define wxStyledTextCtrl_GetMaxLineState 2995 -#define wxStyledTextCtrl_GetCaretLineVisible 2996 -#define wxStyledTextCtrl_SetCaretLineVisible 2997 -#define wxStyledTextCtrl_GetCaretLineBackground 2998 -#define wxStyledTextCtrl_SetCaretLineBackground 2999 -#define wxStyledTextCtrl_AutoCompShow 3000 -#define wxStyledTextCtrl_AutoCompCancel 3001 -#define wxStyledTextCtrl_AutoCompActive 3002 -#define wxStyledTextCtrl_AutoCompPosStart 3003 -#define wxStyledTextCtrl_AutoCompComplete 3004 -#define wxStyledTextCtrl_AutoCompStops 3005 -#define wxStyledTextCtrl_AutoCompSetSeparator 3006 -#define wxStyledTextCtrl_AutoCompGetSeparator 3007 -#define wxStyledTextCtrl_AutoCompSelect 3008 -#define wxStyledTextCtrl_AutoCompSetCancelAtStart 3009 -#define wxStyledTextCtrl_AutoCompGetCancelAtStart 3010 -#define wxStyledTextCtrl_AutoCompSetFillUps 3011 -#define wxStyledTextCtrl_AutoCompSetChooseSingle 3012 -#define wxStyledTextCtrl_AutoCompGetChooseSingle 3013 -#define wxStyledTextCtrl_AutoCompSetIgnoreCase 3014 -#define wxStyledTextCtrl_AutoCompGetIgnoreCase 3015 -#define wxStyledTextCtrl_UserListShow 3016 -#define wxStyledTextCtrl_AutoCompSetAutoHide 3017 -#define wxStyledTextCtrl_AutoCompGetAutoHide 3018 -#define wxStyledTextCtrl_AutoCompSetDropRestOfWord 3019 -#define wxStyledTextCtrl_AutoCompGetDropRestOfWord 3020 -#define wxStyledTextCtrl_RegisterImage 3021 -#define wxStyledTextCtrl_ClearRegisteredImages 3022 -#define wxStyledTextCtrl_AutoCompGetTypeSeparator 3023 -#define wxStyledTextCtrl_AutoCompSetTypeSeparator 3024 -#define wxStyledTextCtrl_AutoCompSetMaxWidth 3025 -#define wxStyledTextCtrl_AutoCompGetMaxWidth 3026 -#define wxStyledTextCtrl_AutoCompSetMaxHeight 3027 -#define wxStyledTextCtrl_AutoCompGetMaxHeight 3028 -#define wxStyledTextCtrl_SetIndent 3029 -#define wxStyledTextCtrl_GetIndent 3030 -#define wxStyledTextCtrl_SetUseTabs 3031 -#define wxStyledTextCtrl_GetUseTabs 3032 -#define wxStyledTextCtrl_SetLineIndentation 3033 -#define wxStyledTextCtrl_GetLineIndentation 3034 -#define wxStyledTextCtrl_GetLineIndentPosition 3035 -#define wxStyledTextCtrl_GetColumn 3036 -#define wxStyledTextCtrl_SetUseHorizontalScrollBar 3037 -#define wxStyledTextCtrl_GetUseHorizontalScrollBar 3038 -#define wxStyledTextCtrl_SetIndentationGuides 3039 -#define wxStyledTextCtrl_GetIndentationGuides 3040 -#define wxStyledTextCtrl_SetHighlightGuide 3041 -#define wxStyledTextCtrl_GetHighlightGuide 3042 -#define wxStyledTextCtrl_GetLineEndPosition 3043 -#define wxStyledTextCtrl_GetCodePage 3044 -#define wxStyledTextCtrl_GetCaretForeground 3045 -#define wxStyledTextCtrl_GetReadOnly 3046 -#define wxStyledTextCtrl_SetCurrentPos 3047 -#define wxStyledTextCtrl_SetSelectionStart 3048 -#define wxStyledTextCtrl_GetSelectionStart 3049 -#define wxStyledTextCtrl_SetSelectionEnd 3050 -#define wxStyledTextCtrl_GetSelectionEnd 3051 -#define wxStyledTextCtrl_SetPrintMagnification 3052 -#define wxStyledTextCtrl_GetPrintMagnification 3053 -#define wxStyledTextCtrl_SetPrintColourMode 3054 -#define wxStyledTextCtrl_GetPrintColourMode 3055 -#define wxStyledTextCtrl_FindText 3056 -#define wxStyledTextCtrl_FormatRange 3057 -#define wxStyledTextCtrl_GetFirstVisibleLine 3058 -#define wxStyledTextCtrl_GetLine 3059 -#define wxStyledTextCtrl_GetLineCount 3060 -#define wxStyledTextCtrl_SetMarginLeft 3061 -#define wxStyledTextCtrl_GetMarginLeft 3062 -#define wxStyledTextCtrl_SetMarginRight 3063 -#define wxStyledTextCtrl_GetMarginRight 3064 -#define wxStyledTextCtrl_GetModify 3065 -#define wxStyledTextCtrl_SetSelection 3066 -#define wxStyledTextCtrl_GetSelectedText 3067 -#define wxStyledTextCtrl_GetTextRange 3068 -#define wxStyledTextCtrl_HideSelection 3069 -#define wxStyledTextCtrl_LineFromPosition 3070 -#define wxStyledTextCtrl_PositionFromLine 3071 -#define wxStyledTextCtrl_LineScroll 3072 -#define wxStyledTextCtrl_EnsureCaretVisible 3073 -#define wxStyledTextCtrl_ReplaceSelection 3074 -#define wxStyledTextCtrl_SetReadOnly 3075 -#define wxStyledTextCtrl_CanPaste 3076 -#define wxStyledTextCtrl_CanUndo 3077 -#define wxStyledTextCtrl_EmptyUndoBuffer 3078 -#define wxStyledTextCtrl_Undo 3079 -#define wxStyledTextCtrl_Cut 3080 -#define wxStyledTextCtrl_Copy 3081 -#define wxStyledTextCtrl_Paste 3082 -#define wxStyledTextCtrl_Clear 3083 -#define wxStyledTextCtrl_SetText 3084 -#define wxStyledTextCtrl_GetText 3085 -#define wxStyledTextCtrl_GetTextLength 3086 -#define wxStyledTextCtrl_GetOvertype 3087 -#define wxStyledTextCtrl_SetCaretWidth 3088 -#define wxStyledTextCtrl_GetCaretWidth 3089 -#define wxStyledTextCtrl_SetTargetStart 3090 -#define wxStyledTextCtrl_GetTargetStart 3091 -#define wxStyledTextCtrl_SetTargetEnd 3092 -#define wxStyledTextCtrl_GetTargetEnd 3093 -#define wxStyledTextCtrl_ReplaceTarget 3094 -#define wxStyledTextCtrl_SearchInTarget 3095 -#define wxStyledTextCtrl_SetSearchFlags 3096 -#define wxStyledTextCtrl_GetSearchFlags 3097 -#define wxStyledTextCtrl_CallTipShow 3098 -#define wxStyledTextCtrl_CallTipCancel 3099 -#define wxStyledTextCtrl_CallTipActive 3100 -#define wxStyledTextCtrl_CallTipPosAtStart 3101 -#define wxStyledTextCtrl_CallTipSetHighlight 3102 -#define wxStyledTextCtrl_CallTipSetBackground 3103 -#define wxStyledTextCtrl_CallTipSetForeground 3104 -#define wxStyledTextCtrl_CallTipSetForegroundHighlight 3105 -#define wxStyledTextCtrl_CallTipUseStyle 3106 -#define wxStyledTextCtrl_VisibleFromDocLine 3107 -#define wxStyledTextCtrl_DocLineFromVisible 3108 -#define wxStyledTextCtrl_WrapCount 3109 -#define wxStyledTextCtrl_SetFoldLevel 3110 -#define wxStyledTextCtrl_GetFoldLevel 3111 -#define wxStyledTextCtrl_GetLastChild 3112 -#define wxStyledTextCtrl_GetFoldParent 3113 -#define wxStyledTextCtrl_ShowLines 3114 -#define wxStyledTextCtrl_HideLines 3115 -#define wxStyledTextCtrl_GetLineVisible 3116 -#define wxStyledTextCtrl_SetFoldExpanded 3117 -#define wxStyledTextCtrl_GetFoldExpanded 3118 -#define wxStyledTextCtrl_ToggleFold 3119 -#define wxStyledTextCtrl_EnsureVisible 3120 -#define wxStyledTextCtrl_SetFoldFlags 3121 -#define wxStyledTextCtrl_EnsureVisibleEnforcePolicy 3122 -#define wxStyledTextCtrl_SetTabIndents 3123 -#define wxStyledTextCtrl_GetTabIndents 3124 -#define wxStyledTextCtrl_SetBackSpaceUnIndents 3125 -#define wxStyledTextCtrl_GetBackSpaceUnIndents 3126 -#define wxStyledTextCtrl_SetMouseDwellTime 3127 -#define wxStyledTextCtrl_GetMouseDwellTime 3128 -#define wxStyledTextCtrl_WordStartPosition 3129 -#define wxStyledTextCtrl_WordEndPosition 3130 -#define wxStyledTextCtrl_SetWrapMode 3131 -#define wxStyledTextCtrl_GetWrapMode 3132 -#define wxStyledTextCtrl_SetWrapVisualFlags 3133 -#define wxStyledTextCtrl_GetWrapVisualFlags 3134 -#define wxStyledTextCtrl_SetWrapVisualFlagsLocation 3135 -#define wxStyledTextCtrl_GetWrapVisualFlagsLocation 3136 -#define wxStyledTextCtrl_SetWrapStartIndent 3137 -#define wxStyledTextCtrl_GetWrapStartIndent 3138 -#define wxStyledTextCtrl_SetLayoutCache 3139 -#define wxStyledTextCtrl_GetLayoutCache 3140 -#define wxStyledTextCtrl_SetScrollWidth 3141 -#define wxStyledTextCtrl_GetScrollWidth 3142 -#define wxStyledTextCtrl_TextWidth 3143 -#define wxStyledTextCtrl_GetEndAtLastLine 3144 -#define wxStyledTextCtrl_TextHeight 3145 -#define wxStyledTextCtrl_SetUseVerticalScrollBar 3146 -#define wxStyledTextCtrl_GetUseVerticalScrollBar 3147 -#define wxStyledTextCtrl_AppendText 3148 -#define wxStyledTextCtrl_GetTwoPhaseDraw 3149 -#define wxStyledTextCtrl_SetTwoPhaseDraw 3150 -#define wxStyledTextCtrl_TargetFromSelection 3151 -#define wxStyledTextCtrl_LinesJoin 3152 -#define wxStyledTextCtrl_LinesSplit 3153 -#define wxStyledTextCtrl_SetFoldMarginColour 3154 -#define wxStyledTextCtrl_SetFoldMarginHiColour 3155 -#define wxStyledTextCtrl_LineDown 3156 -#define wxStyledTextCtrl_LineDownExtend 3157 -#define wxStyledTextCtrl_LineUp 3158 -#define wxStyledTextCtrl_LineUpExtend 3159 -#define wxStyledTextCtrl_CharLeft 3160 -#define wxStyledTextCtrl_CharLeftExtend 3161 -#define wxStyledTextCtrl_CharRight 3162 -#define wxStyledTextCtrl_CharRightExtend 3163 -#define wxStyledTextCtrl_WordLeft 3164 -#define wxStyledTextCtrl_WordLeftExtend 3165 -#define wxStyledTextCtrl_WordRight 3166 -#define wxStyledTextCtrl_WordRightExtend 3167 -#define wxStyledTextCtrl_Home 3168 -#define wxStyledTextCtrl_HomeExtend 3169 -#define wxStyledTextCtrl_LineEnd 3170 -#define wxStyledTextCtrl_LineEndExtend 3171 -#define wxStyledTextCtrl_DocumentStart 3172 -#define wxStyledTextCtrl_DocumentStartExtend 3173 -#define wxStyledTextCtrl_DocumentEnd 3174 -#define wxStyledTextCtrl_DocumentEndExtend 3175 -#define wxStyledTextCtrl_PageUp 3176 -#define wxStyledTextCtrl_PageUpExtend 3177 -#define wxStyledTextCtrl_PageDown 3178 -#define wxStyledTextCtrl_PageDownExtend 3179 -#define wxStyledTextCtrl_EditToggleOvertype 3180 -#define wxStyledTextCtrl_Cancel 3181 -#define wxStyledTextCtrl_DeleteBack 3182 -#define wxStyledTextCtrl_Tab 3183 -#define wxStyledTextCtrl_BackTab 3184 -#define wxStyledTextCtrl_NewLine 3185 -#define wxStyledTextCtrl_FormFeed 3186 -#define wxStyledTextCtrl_VCHome 3187 -#define wxStyledTextCtrl_VCHomeExtend 3188 -#define wxStyledTextCtrl_ZoomIn 3189 -#define wxStyledTextCtrl_ZoomOut 3190 -#define wxStyledTextCtrl_DelWordLeft 3191 -#define wxStyledTextCtrl_DelWordRight 3192 -#define wxStyledTextCtrl_LineCut 3193 -#define wxStyledTextCtrl_LineDelete 3194 -#define wxStyledTextCtrl_LineTranspose 3195 -#define wxStyledTextCtrl_LineDuplicate 3196 -#define wxStyledTextCtrl_LowerCase 3197 -#define wxStyledTextCtrl_UpperCase 3198 -#define wxStyledTextCtrl_LineScrollDown 3199 -#define wxStyledTextCtrl_LineScrollUp 3200 -#define wxStyledTextCtrl_DeleteBackNotLine 3201 -#define wxStyledTextCtrl_HomeDisplay 3202 -#define wxStyledTextCtrl_HomeDisplayExtend 3203 -#define wxStyledTextCtrl_LineEndDisplay 3204 -#define wxStyledTextCtrl_LineEndDisplayExtend 3205 -#define wxStyledTextCtrl_HomeWrapExtend 3206 -#define wxStyledTextCtrl_LineEndWrap 3207 -#define wxStyledTextCtrl_LineEndWrapExtend 3208 -#define wxStyledTextCtrl_VCHomeWrap 3209 -#define wxStyledTextCtrl_VCHomeWrapExtend 3210 -#define wxStyledTextCtrl_LineCopy 3211 -#define wxStyledTextCtrl_MoveCaretInsideView 3212 -#define wxStyledTextCtrl_LineLength 3213 -#define wxStyledTextCtrl_BraceHighlight 3214 -#define wxStyledTextCtrl_BraceBadLight 3215 -#define wxStyledTextCtrl_BraceMatch 3216 -#define wxStyledTextCtrl_GetViewEOL 3217 -#define wxStyledTextCtrl_SetViewEOL 3218 -#define wxStyledTextCtrl_SetModEventMask 3219 -#define wxStyledTextCtrl_GetEdgeColumn 3220 -#define wxStyledTextCtrl_SetEdgeColumn 3221 -#define wxStyledTextCtrl_GetEdgeMode 3222 -#define wxStyledTextCtrl_GetEdgeColour 3223 -#define wxStyledTextCtrl_SetEdgeColour 3224 -#define wxStyledTextCtrl_SearchAnchor 3225 -#define wxStyledTextCtrl_SearchNext 3226 -#define wxStyledTextCtrl_SearchPrev 3227 -#define wxStyledTextCtrl_LinesOnScreen 3228 -#define wxStyledTextCtrl_UsePopUp 3229 -#define wxStyledTextCtrl_SelectionIsRectangle 3230 -#define wxStyledTextCtrl_SetZoom 3231 -#define wxStyledTextCtrl_GetZoom 3232 -#define wxStyledTextCtrl_GetModEventMask 3233 -#define wxStyledTextCtrl_SetSTCFocus 3234 -#define wxStyledTextCtrl_GetSTCFocus 3235 -#define wxStyledTextCtrl_SetStatus 3236 -#define wxStyledTextCtrl_GetStatus 3237 -#define wxStyledTextCtrl_SetMouseDownCaptures 3238 -#define wxStyledTextCtrl_GetMouseDownCaptures 3239 -#define wxStyledTextCtrl_SetSTCCursor 3240 -#define wxStyledTextCtrl_GetSTCCursor 3241 -#define wxStyledTextCtrl_SetControlCharSymbol 3242 -#define wxStyledTextCtrl_GetControlCharSymbol 3243 -#define wxStyledTextCtrl_WordPartLeft 3244 -#define wxStyledTextCtrl_WordPartLeftExtend 3245 -#define wxStyledTextCtrl_WordPartRight 3246 -#define wxStyledTextCtrl_WordPartRightExtend 3247 -#define wxStyledTextCtrl_SetVisiblePolicy 3248 -#define wxStyledTextCtrl_DelLineLeft 3249 -#define wxStyledTextCtrl_DelLineRight 3250 -#define wxStyledTextCtrl_GetXOffset 3251 -#define wxStyledTextCtrl_ChooseCaretX 3252 -#define wxStyledTextCtrl_SetXCaretPolicy 3253 -#define wxStyledTextCtrl_SetYCaretPolicy 3254 -#define wxStyledTextCtrl_GetPrintWrapMode 3255 -#define wxStyledTextCtrl_SetHotspotActiveForeground 3256 -#define wxStyledTextCtrl_SetHotspotActiveBackground 3257 -#define wxStyledTextCtrl_SetHotspotActiveUnderline 3258 -#define wxStyledTextCtrl_SetHotspotSingleLine 3259 -#define wxStyledTextCtrl_ParaDownExtend 3260 -#define wxStyledTextCtrl_ParaUp 3261 -#define wxStyledTextCtrl_ParaUpExtend 3262 -#define wxStyledTextCtrl_PositionBefore 3263 -#define wxStyledTextCtrl_PositionAfter 3264 -#define wxStyledTextCtrl_CopyRange 3265 -#define wxStyledTextCtrl_CopyText 3266 -#define wxStyledTextCtrl_SetSelectionMode 3267 -#define wxStyledTextCtrl_GetSelectionMode 3268 -#define wxStyledTextCtrl_LineDownRectExtend 3269 -#define wxStyledTextCtrl_LineUpRectExtend 3270 -#define wxStyledTextCtrl_CharLeftRectExtend 3271 -#define wxStyledTextCtrl_CharRightRectExtend 3272 -#define wxStyledTextCtrl_HomeRectExtend 3273 -#define wxStyledTextCtrl_VCHomeRectExtend 3274 -#define wxStyledTextCtrl_LineEndRectExtend 3275 -#define wxStyledTextCtrl_PageUpRectExtend 3276 -#define wxStyledTextCtrl_PageDownRectExtend 3277 -#define wxStyledTextCtrl_StutteredPageUp 3278 -#define wxStyledTextCtrl_StutteredPageUpExtend 3279 -#define wxStyledTextCtrl_StutteredPageDown 3280 -#define wxStyledTextCtrl_StutteredPageDownExtend 3281 -#define wxStyledTextCtrl_WordLeftEnd 3282 -#define wxStyledTextCtrl_WordLeftEndExtend 3283 -#define wxStyledTextCtrl_WordRightEnd 3284 -#define wxStyledTextCtrl_WordRightEndExtend 3285 -#define wxStyledTextCtrl_SetWhitespaceChars 3286 -#define wxStyledTextCtrl_SetCharsDefault 3287 -#define wxStyledTextCtrl_AutoCompGetCurrent 3288 -#define wxStyledTextCtrl_Allocate 3289 -#define wxStyledTextCtrl_FindColumn 3290 -#define wxStyledTextCtrl_GetCaretSticky 3291 -#define wxStyledTextCtrl_SetCaretSticky 3292 -#define wxStyledTextCtrl_ToggleCaretSticky 3293 -#define wxStyledTextCtrl_SetPasteConvertEndings 3294 -#define wxStyledTextCtrl_GetPasteConvertEndings 3295 -#define wxStyledTextCtrl_SelectionDuplicate 3296 -#define wxStyledTextCtrl_SetCaretLineBackAlpha 3297 -#define wxStyledTextCtrl_GetCaretLineBackAlpha 3298 -#define wxStyledTextCtrl_StartRecord 3299 -#define wxStyledTextCtrl_StopRecord 3300 -#define wxStyledTextCtrl_SetLexer 3301 -#define wxStyledTextCtrl_GetLexer 3302 -#define wxStyledTextCtrl_Colourise 3303 -#define wxStyledTextCtrl_SetProperty 3304 -#define wxStyledTextCtrl_SetKeyWords 3305 -#define wxStyledTextCtrl_SetLexerLanguage 3306 -#define wxStyledTextCtrl_GetProperty 3307 -#define wxStyledTextCtrl_GetStyleBitsNeeded 3308 -#define wxStyledTextCtrl_GetCurrentLine 3309 -#define wxStyledTextCtrl_StyleSetSpec 3310 -#define wxStyledTextCtrl_StyleSetFont 3311 -#define wxStyledTextCtrl_StyleSetFontAttr 3312 -#define wxStyledTextCtrl_StyleSetCharacterSet 3313 -#define wxStyledTextCtrl_StyleSetFontEncoding 3314 -#define wxStyledTextCtrl_CmdKeyExecute 3315 -#define wxStyledTextCtrl_SetMargins 3316 -#define wxStyledTextCtrl_GetSelection 3317 -#define wxStyledTextCtrl_PointFromPosition 3318 -#define wxStyledTextCtrl_ScrollToLine 3319 -#define wxStyledTextCtrl_ScrollToColumn 3320 -#define wxStyledTextCtrl_SendMsg 3321 -#define wxStyledTextCtrl_SetVScrollBar 3322 -#define wxStyledTextCtrl_SetHScrollBar 3323 -#define wxStyledTextCtrl_GetLastKeydownProcessed 3324 -#define wxStyledTextCtrl_SetLastKeydownProcessed 3325 -#define wxStyledTextCtrl_SaveFile 3326 -#define wxStyledTextCtrl_LoadFile 3327 -#define wxStyledTextCtrl_DoDragOver 3328 -#define wxStyledTextCtrl_DoDropText 3329 -#define wxStyledTextCtrl_GetUseAntiAliasing 3330 -#define wxStyledTextCtrl_AddTextRaw 3331 -#define wxStyledTextCtrl_InsertTextRaw 3332 -#define wxStyledTextCtrl_GetCurLineRaw 3333 -#define wxStyledTextCtrl_GetLineRaw 3334 -#define wxStyledTextCtrl_GetSelectedTextRaw 3335 -#define wxStyledTextCtrl_GetTextRangeRaw 3336 -#define wxStyledTextCtrl_SetTextRaw 3337 -#define wxStyledTextCtrl_GetTextRaw 3338 -#define wxStyledTextCtrl_AppendTextRaw 3339 -#define wxArtProvider_GetBitmap 3340 -#define wxArtProvider_GetIcon 3341 -#define wxTreeEvent_GetKeyCode 3342 -#define wxTreeEvent_GetItem 3343 -#define wxTreeEvent_GetKeyEvent 3344 -#define wxTreeEvent_GetLabel 3345 -#define wxTreeEvent_GetOldItem 3346 -#define wxTreeEvent_GetPoint 3347 -#define wxTreeEvent_IsEditCancelled 3348 -#define wxTreeEvent_SetToolTip 3349 -#define wxNotebookEvent_GetOldSelection 3350 -#define wxNotebookEvent_GetSelection 3351 -#define wxNotebookEvent_SetOldSelection 3352 -#define wxNotebookEvent_SetSelection 3353 -#define wxFileDataObject_new 3354 -#define wxFileDataObject_AddFile 3355 -#define wxFileDataObject_GetFilenames 3356 -#define wxFileDataObject_destroy 3357 -#define wxTextDataObject_new 3358 -#define wxTextDataObject_GetTextLength 3359 -#define wxTextDataObject_GetText 3360 -#define wxTextDataObject_SetText 3361 -#define wxTextDataObject_destroy 3362 -#define wxBitmapDataObject_new_1_1 3363 -#define wxBitmapDataObject_new_1_0 3364 -#define wxBitmapDataObject_GetBitmap 3365 -#define wxBitmapDataObject_SetBitmap 3366 -#define wxBitmapDataObject_destroy 3367 -#define wxClipboard_new 3369 -#define wxClipboard_destruct 3370 -#define wxClipboard_AddData 3371 -#define wxClipboard_Clear 3372 -#define wxClipboard_Close 3373 -#define wxClipboard_Flush 3374 -#define wxClipboard_GetData 3375 -#define wxClipboard_IsOpened 3376 -#define wxClipboard_Open 3377 -#define wxClipboard_SetData 3378 -#define wxClipboard_UsePrimarySelection 3380 -#define wxClipboard_IsSupported 3381 -#define wxClipboard_Get 3382 -#define wxSpinEvent_GetPosition 3383 -#define wxSpinEvent_SetPosition 3384 -#define wxSplitterWindow_new_0 3385 -#define wxSplitterWindow_new_2 3386 -#define wxSplitterWindow_destruct 3387 -#define wxSplitterWindow_Create 3388 -#define wxSplitterWindow_GetMinimumPaneSize 3389 -#define wxSplitterWindow_GetSashGravity 3390 -#define wxSplitterWindow_GetSashPosition 3391 -#define wxSplitterWindow_GetSplitMode 3392 -#define wxSplitterWindow_GetWindow1 3393 -#define wxSplitterWindow_GetWindow2 3394 -#define wxSplitterWindow_Initialize 3395 -#define wxSplitterWindow_IsSplit 3396 -#define wxSplitterWindow_ReplaceWindow 3397 -#define wxSplitterWindow_SetSashGravity 3398 -#define wxSplitterWindow_SetSashPosition 3399 -#define wxSplitterWindow_SetSashSize 3400 -#define wxSplitterWindow_SetMinimumPaneSize 3401 -#define wxSplitterWindow_SetSplitMode 3402 -#define wxSplitterWindow_SplitHorizontally 3403 -#define wxSplitterWindow_SplitVertically 3404 -#define wxSplitterWindow_Unsplit 3405 -#define wxSplitterWindow_UpdateSize 3406 -#define wxSplitterEvent_GetSashPosition 3407 -#define wxSplitterEvent_GetX 3408 -#define wxSplitterEvent_GetY 3409 -#define wxSplitterEvent_GetWindowBeingRemoved 3410 -#define wxSplitterEvent_SetSashPosition 3411 +#define wxGridCellEditor_Create 560 +#define wxGridCellEditor_IsCreated 561 +#define wxGridCellEditor_SetSize 562 +#define wxGridCellEditor_Show 563 +#define wxGridCellEditor_PaintBackground 564 +#define wxGridCellEditor_BeginEdit 565 +#define wxGridCellEditor_EndEdit 566 +#define wxGridCellEditor_Reset 567 +#define wxGridCellEditor_StartingKey 568 +#define wxGridCellEditor_StartingClick 569 +#define wxGridCellEditor_HandleReturn 570 +#define wxGridCellBoolRenderer_new 571 +#define wxGridCellBoolRenderer_destroy 572 +#define wxGridCellBoolEditor_new 573 +#define wxGridCellBoolEditor_IsTrueValue 574 +#define wxGridCellBoolEditor_UseStringValues 575 +#define wxGridCellBoolEditor_destroy 576 +#define wxGridCellFloatRenderer_new 577 +#define wxGridCellFloatRenderer_GetPrecision 578 +#define wxGridCellFloatRenderer_GetWidth 579 +#define wxGridCellFloatRenderer_SetParameters 580 +#define wxGridCellFloatRenderer_SetPrecision 581 +#define wxGridCellFloatRenderer_SetWidth 582 +#define wxGridCellFloatRenderer_destroy 583 +#define wxGridCellFloatEditor_new 584 +#define wxGridCellFloatEditor_SetParameters 585 +#define wxGridCellFloatEditor_destroy 586 +#define wxGridCellStringRenderer_new 587 +#define wxGridCellStringRenderer_destroy 588 +#define wxGridCellTextEditor_new 589 +#define wxGridCellTextEditor_SetParameters 590 +#define wxGridCellTextEditor_destroy 591 +#define wxGridCellChoiceEditor_new 593 +#define wxGridCellChoiceEditor_SetParameters 594 +#define wxGridCellChoiceEditor_destroy 595 +#define wxGridCellNumberRenderer_new 596 +#define wxGridCellNumberRenderer_destroy 597 +#define wxGridCellNumberEditor_new 598 +#define wxGridCellNumberEditor_GetValue 599 +#define wxGridCellNumberEditor_SetParameters 600 +#define wxGridCellNumberEditor_destroy 601 +#define wxGridCellAttr_SetTextColour 602 +#define wxGridCellAttr_SetBackgroundColour 603 +#define wxGridCellAttr_SetFont 604 +#define wxGridCellAttr_SetAlignment 605 +#define wxGridCellAttr_SetReadOnly 606 +#define wxGridCellAttr_SetRenderer 607 +#define wxGridCellAttr_SetEditor 608 +#define wxGridCellAttr_HasTextColour 609 +#define wxGridCellAttr_HasBackgroundColour 610 +#define wxGridCellAttr_HasFont 611 +#define wxGridCellAttr_HasAlignment 612 +#define wxGridCellAttr_HasRenderer 613 +#define wxGridCellAttr_HasEditor 614 +#define wxGridCellAttr_GetTextColour 615 +#define wxGridCellAttr_GetBackgroundColour 616 +#define wxGridCellAttr_GetFont 617 +#define wxGridCellAttr_GetAlignment 618 +#define wxGridCellAttr_GetRenderer 619 +#define wxGridCellAttr_GetEditor 620 +#define wxGridCellAttr_IsReadOnly 621 +#define wxGridCellAttr_SetDefAttr 622 +#define wxDC_Blit 623 +#define wxDC_CalcBoundingBox 624 +#define wxDC_Clear 625 +#define wxDC_ComputeScaleAndOrigin 626 +#define wxDC_CrossHair 627 +#define wxDC_DestroyClippingRegion 628 +#define wxDC_DeviceToLogicalX 629 +#define wxDC_DeviceToLogicalXRel 630 +#define wxDC_DeviceToLogicalY 631 +#define wxDC_DeviceToLogicalYRel 632 +#define wxDC_DrawArc 633 +#define wxDC_DrawBitmap 634 +#define wxDC_DrawCheckMark 635 +#define wxDC_DrawCircle 636 +#define wxDC_DrawEllipse_2 638 +#define wxDC_DrawEllipse_1 639 +#define wxDC_DrawEllipticArc 640 +#define wxDC_DrawIcon 641 +#define wxDC_DrawLabel 642 +#define wxDC_DrawLine 643 +#define wxDC_DrawLines 644 +#define wxDC_DrawPolygon 646 +#define wxDC_DrawPoint 648 +#define wxDC_DrawRectangle_2 650 +#define wxDC_DrawRectangle_1 651 +#define wxDC_DrawRotatedText 652 +#define wxDC_DrawRoundedRectangle_3 654 +#define wxDC_DrawRoundedRectangle_2 655 +#define wxDC_DrawText 656 +#define wxDC_EndDoc 657 +#define wxDC_EndPage 658 +#define wxDC_FloodFill 659 +#define wxDC_GetBackground 660 +#define wxDC_GetBackgroundMode 661 +#define wxDC_GetBrush 662 +#define wxDC_GetCharHeight 663 +#define wxDC_GetCharWidth 664 +#define wxDC_GetClippingBox 665 +#define wxDC_GetFont 666 +#define wxDC_GetLayoutDirection 667 +#define wxDC_GetLogicalFunction 668 +#define wxDC_GetMapMode 669 +#define wxDC_GetMultiLineTextExtent_4 670 +#define wxDC_GetMultiLineTextExtent_1 671 +#define wxDC_GetPartialTextExtents 672 +#define wxDC_GetPen 673 +#define wxDC_GetPixel 674 +#define wxDC_GetPPI 675 +#define wxDC_GetSize 677 +#define wxDC_GetSizeMM 679 +#define wxDC_GetTextBackground 680 +#define wxDC_GetTextExtent_4 681 +#define wxDC_GetTextExtent_1 682 +#define wxDC_GetTextForeground 684 +#define wxDC_GetUserScale 685 +#define wxDC_GradientFillConcentric_3 686 +#define wxDC_GradientFillConcentric_4 687 +#define wxDC_GradientFillLinear 688 +#define wxDC_LogicalToDeviceX 689 +#define wxDC_LogicalToDeviceXRel 690 +#define wxDC_LogicalToDeviceY 691 +#define wxDC_LogicalToDeviceYRel 692 +#define wxDC_MaxX 693 +#define wxDC_MaxY 694 +#define wxDC_MinX 695 +#define wxDC_MinY 696 +#define wxDC_IsOk 697 +#define wxDC_ResetBoundingBox 698 +#define wxDC_SetAxisOrientation 699 +#define wxDC_SetBackground 700 +#define wxDC_SetBackgroundMode 701 +#define wxDC_SetBrush 702 +#define wxDC_SetClippingRegion_2 704 +#define wxDC_SetClippingRegion_1_1 705 +#define wxDC_SetClippingRegion_1_0 706 +#define wxDC_SetDeviceOrigin 707 +#define wxDC_SetFont 708 +#define wxDC_SetLayoutDirection 709 +#define wxDC_SetLogicalFunction 710 +#define wxDC_SetMapMode 711 +#define wxDC_SetPalette 712 +#define wxDC_SetPen 713 +#define wxDC_SetTextBackground 714 +#define wxDC_SetTextForeground 715 +#define wxDC_SetUserScale 716 +#define wxDC_StartDoc 717 +#define wxDC_StartPage 718 +#define wxMirrorDC_new 719 +#define wxMirrorDC_destroy 720 +#define wxScreenDC_new 721 +#define wxScreenDC_destruct 722 +#define wxPostScriptDC_new_0 723 +#define wxPostScriptDC_new_1 724 +#define wxPostScriptDC_destruct 725 +#define wxPostScriptDC_SetResolution 726 +#define wxPostScriptDC_GetResolution 727 +#define wxWindowDC_new_0 728 +#define wxWindowDC_new_1 729 +#define wxWindowDC_destruct 730 +#define wxClientDC_new_0 731 +#define wxClientDC_new_1 732 +#define wxClientDC_destroy 733 +#define wxPaintDC_new_0 734 +#define wxPaintDC_new_1 735 +#define wxPaintDC_destroy 736 +#define wxMemoryDC_new_1_0 738 +#define wxMemoryDC_new_1_1 739 +#define wxMemoryDC_new_0 740 +#define wxMemoryDC_destruct 742 +#define wxMemoryDC_SelectObject 743 +#define wxMemoryDC_SelectObjectAsSource 744 +#define wxBufferedDC_new_0 745 +#define wxBufferedDC_new_2 746 +#define wxBufferedDC_new_3 747 +#define wxBufferedDC_destruct 748 +#define wxBufferedDC_Init_2 749 +#define wxBufferedDC_Init_3 750 +#define wxBufferedPaintDC_new_3 751 +#define wxBufferedPaintDC_new_2 752 +#define wxBufferedPaintDC_destruct 753 +#define wxGraphicsObject_GetRenderer 754 +#define wxGraphicsObject_IsNull 755 +#define wxGraphicsContext_Create_1_1 756 +#define wxGraphicsContext_Create_1_0 757 +#define wxGraphicsContext_Create_0 758 +#define wxGraphicsContext_CreatePen 759 +#define wxGraphicsContext_CreateBrush 760 +#define wxGraphicsContext_CreateRadialGradientBrush 761 +#define wxGraphicsContext_CreateLinearGradientBrush 762 +#define wxGraphicsContext_CreateFont 763 +#define wxGraphicsContext_CreateMatrix 764 +#define wxGraphicsContext_CreatePath 765 +#define wxGraphicsContext_Clip_1 766 +#define wxGraphicsContext_Clip_4 767 +#define wxGraphicsContext_ResetClip 768 +#define wxGraphicsContext_DrawBitmap 769 +#define wxGraphicsContext_DrawEllipse 770 +#define wxGraphicsContext_DrawIcon 771 +#define wxGraphicsContext_DrawLines 772 +#define wxGraphicsContext_DrawPath 773 +#define wxGraphicsContext_DrawRectangle 774 +#define wxGraphicsContext_DrawRoundedRectangle 775 +#define wxGraphicsContext_DrawText_3 776 +#define wxGraphicsContext_DrawText_4_0 777 +#define wxGraphicsContext_DrawText_4_1 778 +#define wxGraphicsContext_DrawText_5 779 +#define wxGraphicsContext_FillPath 780 +#define wxGraphicsContext_StrokePath 781 +#define wxGraphicsContext_GetNativeContext 782 +#define wxGraphicsContext_GetPartialTextExtents 783 +#define wxGraphicsContext_GetTextExtent 784 +#define wxGraphicsContext_Rotate 785 +#define wxGraphicsContext_Scale 786 +#define wxGraphicsContext_Translate 787 +#define wxGraphicsContext_GetTransform 788 +#define wxGraphicsContext_SetTransform 789 +#define wxGraphicsContext_ConcatTransform 790 +#define wxGraphicsContext_SetBrush_1_1 791 +#define wxGraphicsContext_SetBrush_1_0 792 +#define wxGraphicsContext_SetFont_1 793 +#define wxGraphicsContext_SetFont_2 794 +#define wxGraphicsContext_SetPen_1_0 795 +#define wxGraphicsContext_SetPen_1_1 796 +#define wxGraphicsContext_StrokeLine 797 +#define wxGraphicsContext_StrokeLines_2 798 +#define wxGraphicsContext_StrokeLines_3 799 +#define wxGraphicsMatrix_Concat 800 +#define wxGraphicsMatrix_Get 802 +#define wxGraphicsMatrix_GetNativeMatrix 803 +#define wxGraphicsMatrix_Invert 804 +#define wxGraphicsMatrix_IsEqual 805 +#define wxGraphicsMatrix_IsIdentity 807 +#define wxGraphicsMatrix_Rotate 808 +#define wxGraphicsMatrix_Scale 809 +#define wxGraphicsMatrix_Translate 810 +#define wxGraphicsMatrix_Set 811 +#define wxGraphicsMatrix_TransformPoint 812 +#define wxGraphicsMatrix_TransformDistance 813 +#define wxGraphicsPath_MoveToPoint_2 814 +#define wxGraphicsPath_MoveToPoint_1 815 +#define wxGraphicsPath_AddArc_6 816 +#define wxGraphicsPath_AddArc_5 817 +#define wxGraphicsPath_AddArcToPoint 818 +#define wxGraphicsPath_AddCircle 819 +#define wxGraphicsPath_AddCurveToPoint_6 820 +#define wxGraphicsPath_AddCurveToPoint_3 821 +#define wxGraphicsPath_AddEllipse 822 +#define wxGraphicsPath_AddLineToPoint_2 823 +#define wxGraphicsPath_AddLineToPoint_1 824 +#define wxGraphicsPath_AddPath 825 +#define wxGraphicsPath_AddQuadCurveToPoint 826 +#define wxGraphicsPath_AddRectangle 827 +#define wxGraphicsPath_AddRoundedRectangle 828 +#define wxGraphicsPath_CloseSubpath 829 +#define wxGraphicsPath_Contains_3 830 +#define wxGraphicsPath_Contains_2 831 +#define wxGraphicsPath_GetBox 833 +#define wxGraphicsPath_GetCurrentPoint 835 +#define wxGraphicsPath_Transform 836 +#define wxGraphicsRenderer_GetDefaultRenderer 837 +#define wxGraphicsRenderer_CreateContext_1_1 838 +#define wxGraphicsRenderer_CreateContext_1_0 839 +#define wxGraphicsRenderer_CreatePen 840 +#define wxGraphicsRenderer_CreateBrush 841 +#define wxGraphicsRenderer_CreateLinearGradientBrush 842 +#define wxGraphicsRenderer_CreateRadialGradientBrush 843 +#define wxGraphicsRenderer_CreateFont 844 +#define wxGraphicsRenderer_CreateMatrix 845 +#define wxGraphicsRenderer_CreatePath 846 +#define wxMenuBar_new_1 848 +#define wxMenuBar_new_0 850 +#define wxMenuBar_destruct 852 +#define wxMenuBar_Append 853 +#define wxMenuBar_Check 854 +#define wxMenuBar_Enable_2 855 +#define wxMenuBar_Enable_1 856 +#define wxMenuBar_EnableTop 857 +#define wxMenuBar_FindMenu 858 +#define wxMenuBar_FindMenuItem 859 +#define wxMenuBar_FindItem 860 +#define wxMenuBar_GetHelpString 861 +#define wxMenuBar_GetLabel_1 862 +#define wxMenuBar_GetLabel_0 863 +#define wxMenuBar_GetLabelTop 864 +#define wxMenuBar_GetMenu 865 +#define wxMenuBar_GetMenuCount 866 +#define wxMenuBar_Insert 867 +#define wxMenuBar_IsChecked 868 +#define wxMenuBar_IsEnabled_1 869 +#define wxMenuBar_IsEnabled_0 870 +#define wxMenuBar_Remove 871 +#define wxMenuBar_Replace 872 +#define wxMenuBar_SetHelpString 873 +#define wxMenuBar_SetLabel_2 874 +#define wxMenuBar_SetLabel_1 875 +#define wxMenuBar_SetLabelTop 876 +#define wxControl_GetLabel 877 +#define wxControl_SetLabel 878 +#define wxControlWithItems_Append_1 879 +#define wxControlWithItems_Append_2 880 +#define wxControlWithItems_appendStrings_1 881 +#define wxControlWithItems_Clear 882 +#define wxControlWithItems_Delete 883 +#define wxControlWithItems_FindString 884 +#define wxControlWithItems_getClientData 886 +#define wxControlWithItems_setClientData 888 +#define wxControlWithItems_GetCount 889 +#define wxControlWithItems_GetSelection 890 +#define wxControlWithItems_GetString 891 +#define wxControlWithItems_GetStringSelection 892 +#define wxControlWithItems_Insert_2 893 +#define wxControlWithItems_Insert_3 894 +#define wxControlWithItems_IsEmpty 895 +#define wxControlWithItems_Select 896 +#define wxControlWithItems_SetSelection 897 +#define wxControlWithItems_SetString 898 +#define wxControlWithItems_SetStringSelection 899 +#define wxMenu_new_2 902 +#define wxMenu_new_1 903 +#define wxMenu_destruct 905 +#define wxMenu_Append_3 906 +#define wxMenu_Append_1 907 +#define wxMenu_Append_4_0 908 +#define wxMenu_Append_4_1 909 +#define wxMenu_AppendCheckItem 910 +#define wxMenu_AppendRadioItem 911 +#define wxMenu_AppendSeparator 912 +#define wxMenu_Break 913 +#define wxMenu_Check 914 +#define wxMenu_Delete_1_0 915 +#define wxMenu_Delete_1_1 916 +#define wxMenu_Destroy_1_0 917 +#define wxMenu_Destroy_1_1 918 +#define wxMenu_Enable 919 +#define wxMenu_FindItem_1 920 +#define wxMenu_FindItem_2 921 +#define wxMenu_FindItemByPosition 922 +#define wxMenu_GetHelpString 923 +#define wxMenu_GetLabel 924 +#define wxMenu_GetMenuItemCount 925 +#define wxMenu_GetMenuItems 926 +#define wxMenu_GetTitle 928 +#define wxMenu_Insert_2 929 +#define wxMenu_Insert_3 930 +#define wxMenu_Insert_5_1 931 +#define wxMenu_Insert_5_0 932 +#define wxMenu_InsertCheckItem 933 +#define wxMenu_InsertRadioItem 934 +#define wxMenu_InsertSeparator 935 +#define wxMenu_IsChecked 936 +#define wxMenu_IsEnabled 937 +#define wxMenu_Prepend_1 938 +#define wxMenu_Prepend_2 939 +#define wxMenu_Prepend_4_1 940 +#define wxMenu_Prepend_4_0 941 +#define wxMenu_PrependCheckItem 942 +#define wxMenu_PrependRadioItem 943 +#define wxMenu_PrependSeparator 944 +#define wxMenu_Remove_1_0 945 +#define wxMenu_Remove_1_1 946 +#define wxMenu_SetHelpString 947 +#define wxMenu_SetLabel 948 +#define wxMenu_SetTitle 949 +#define wxMenuItem_new 950 +#define wxMenuItem_destruct 952 +#define wxMenuItem_Check 953 +#define wxMenuItem_Enable 954 +#define wxMenuItem_GetBitmap 955 +#define wxMenuItem_GetHelp 956 +#define wxMenuItem_GetId 957 +#define wxMenuItem_GetKind 958 +#define wxMenuItem_GetLabel 959 +#define wxMenuItem_GetLabelFromText 960 +#define wxMenuItem_GetMenu 961 +#define wxMenuItem_GetText 962 +#define wxMenuItem_GetSubMenu 963 +#define wxMenuItem_IsCheckable 964 +#define wxMenuItem_IsChecked 965 +#define wxMenuItem_IsEnabled 966 +#define wxMenuItem_IsSeparator 967 +#define wxMenuItem_IsSubMenu 968 +#define wxMenuItem_SetBitmap 969 +#define wxMenuItem_SetHelp 970 +#define wxMenuItem_SetMenu 971 +#define wxMenuItem_SetSubMenu 972 +#define wxMenuItem_SetText 973 +#define wxToolBar_AddControl 974 +#define wxToolBar_AddSeparator 975 +#define wxToolBar_AddTool_5 976 +#define wxToolBar_AddTool_4_0 977 +#define wxToolBar_AddTool_1 978 +#define wxToolBar_AddTool_4_1 979 +#define wxToolBar_AddTool_3 980 +#define wxToolBar_AddTool_6 981 +#define wxToolBar_AddCheckTool 982 +#define wxToolBar_AddRadioTool 983 +#define wxToolBar_DeleteTool 984 +#define wxToolBar_DeleteToolByPos 985 +#define wxToolBar_EnableTool 986 +#define wxToolBar_FindById 987 +#define wxToolBar_FindControl 988 +#define wxToolBar_FindToolForPosition 989 +#define wxToolBar_GetToolSize 990 +#define wxToolBar_GetToolBitmapSize 991 +#define wxToolBar_GetMargins 992 +#define wxToolBar_GetToolEnabled 993 +#define wxToolBar_GetToolLongHelp 994 +#define wxToolBar_GetToolPacking 995 +#define wxToolBar_GetToolPos 996 +#define wxToolBar_GetToolSeparation 997 +#define wxToolBar_GetToolShortHelp 998 +#define wxToolBar_GetToolState 999 +#define wxToolBar_InsertControl 1000 +#define wxToolBar_InsertSeparator 1001 +#define wxToolBar_InsertTool_5 1002 +#define wxToolBar_InsertTool_2 1003 +#define wxToolBar_InsertTool_4 1004 +#define wxToolBar_Realize 1005 +#define wxToolBar_RemoveTool 1006 +#define wxToolBar_SetMargins 1007 +#define wxToolBar_SetToolBitmapSize 1008 +#define wxToolBar_SetToolLongHelp 1009 +#define wxToolBar_SetToolPacking 1010 +#define wxToolBar_SetToolShortHelp 1011 +#define wxToolBar_SetToolSeparation 1012 +#define wxToolBar_ToggleTool 1013 +#define wxStatusBar_new_0 1015 +#define wxStatusBar_new_2 1016 +#define wxStatusBar_destruct 1018 +#define wxStatusBar_Create 1019 +#define wxStatusBar_GetFieldRect 1020 +#define wxStatusBar_GetFieldsCount 1021 +#define wxStatusBar_GetStatusText 1022 +#define wxStatusBar_PopStatusText 1023 +#define wxStatusBar_PushStatusText 1024 +#define wxStatusBar_SetFieldsCount 1025 +#define wxStatusBar_SetMinHeight 1026 +#define wxStatusBar_SetStatusText 1027 +#define wxStatusBar_SetStatusWidths 1028 +#define wxStatusBar_SetStatusStyles 1029 +#define wxBitmap_new_0 1030 +#define wxBitmap_new_3 1031 +#define wxBitmap_new_4 1032 +#define wxBitmap_new_2_0 1033 +#define wxBitmap_new_2_1 1034 +#define wxBitmap_destruct 1035 +#define wxBitmap_ConvertToImage 1036 +#define wxBitmap_CopyFromIcon 1037 +#define wxBitmap_Create 1038 +#define wxBitmap_GetDepth 1039 +#define wxBitmap_GetHeight 1040 +#define wxBitmap_GetPalette 1041 +#define wxBitmap_GetMask 1042 +#define wxBitmap_GetWidth 1043 +#define wxBitmap_GetSubBitmap 1044 +#define wxBitmap_LoadFile 1045 +#define wxBitmap_Ok 1046 +#define wxBitmap_SaveFile 1047 +#define wxBitmap_SetDepth 1048 +#define wxBitmap_SetHeight 1049 +#define wxBitmap_SetMask 1050 +#define wxBitmap_SetPalette 1051 +#define wxBitmap_SetWidth 1052 +#define wxIcon_new_0 1053 +#define wxIcon_new_2 1054 +#define wxIcon_new_1 1055 +#define wxIcon_CopyFromBitmap 1056 +#define wxIcon_destroy 1057 +#define wxIconBundle_new_0 1058 +#define wxIconBundle_new_2 1059 +#define wxIconBundle_new_1_0 1060 +#define wxIconBundle_new_1_1 1061 +#define wxIconBundle_destruct 1062 +#define wxIconBundle_AddIcon_2 1063 +#define wxIconBundle_AddIcon_1 1064 +#define wxIconBundle_GetIcon_1_1 1065 +#define wxIconBundle_GetIcon_1_0 1066 +#define wxCursor_new_0 1067 +#define wxCursor_new_1_0 1068 +#define wxCursor_new_1_1 1069 +#define wxCursor_new_4 1070 +#define wxCursor_destruct 1071 +#define wxCursor_Ok 1072 +#define wxMask_new_0 1073 +#define wxMask_new_2_1 1074 +#define wxMask_new_2_0 1075 +#define wxMask_new_1 1076 +#define wxMask_destruct 1077 +#define wxMask_Create_2_1 1078 +#define wxMask_Create_2_0 1079 +#define wxMask_Create_1 1080 +#define wxImage_new_0 1081 +#define wxImage_new_3_0 1082 +#define wxImage_new_4 1083 +#define wxImage_new_5 1084 +#define wxImage_new_2 1085 +#define wxImage_new_3_1 1086 +#define wxImage_Blur 1087 +#define wxImage_BlurHorizontal 1088 +#define wxImage_BlurVertical 1089 +#define wxImage_ConvertAlphaToMask 1090 +#define wxImage_ConvertToGreyscale 1091 +#define wxImage_ConvertToMono 1092 +#define wxImage_Copy 1093 +#define wxImage_Create_3 1094 +#define wxImage_Create_4 1095 +#define wxImage_Create_5 1096 +#define wxImage_Destroy 1097 +#define wxImage_FindFirstUnusedColour 1098 +#define wxImage_GetImageExtWildcard 1099 +#define wxImage_GetAlpha_2 1100 +#define wxImage_GetAlpha_0 1101 +#define wxImage_GetBlue 1102 +#define wxImage_GetData 1103 +#define wxImage_GetGreen 1104 +#define wxImage_GetImageCount 1105 +#define wxImage_GetHeight 1106 +#define wxImage_GetMaskBlue 1107 +#define wxImage_GetMaskGreen 1108 +#define wxImage_GetMaskRed 1109 +#define wxImage_GetOrFindMaskColour 1110 +#define wxImage_GetPalette 1111 +#define wxImage_GetRed 1112 +#define wxImage_GetSubImage 1113 +#define wxImage_GetWidth 1114 +#define wxImage_HasAlpha 1115 +#define wxImage_HasMask 1116 +#define wxImage_GetOption 1117 +#define wxImage_GetOptionInt 1118 +#define wxImage_HasOption 1119 +#define wxImage_InitAlpha 1120 +#define wxImage_InitStandardHandlers 1121 +#define wxImage_IsTransparent 1122 +#define wxImage_LoadFile_2 1123 +#define wxImage_LoadFile_3 1124 +#define wxImage_Ok 1125 +#define wxImage_RemoveHandler 1126 +#define wxImage_Mirror 1127 +#define wxImage_Replace 1128 +#define wxImage_Rescale 1129 +#define wxImage_Resize 1130 +#define wxImage_Rotate 1131 +#define wxImage_RotateHue 1132 +#define wxImage_Rotate90 1133 +#define wxImage_SaveFile_1 1134 +#define wxImage_SaveFile_2_0 1135 +#define wxImage_SaveFile_2_1 1136 +#define wxImage_Scale 1137 +#define wxImage_Size 1138 +#define wxImage_SetAlpha_3 1139 +#define wxImage_SetAlpha_2 1140 +#define wxImage_SetData_2 1141 +#define wxImage_SetData_4 1142 +#define wxImage_SetMask 1143 +#define wxImage_SetMaskColour 1144 +#define wxImage_SetMaskFromImage 1145 +#define wxImage_SetOption_2_1 1146 +#define wxImage_SetOption_2_0 1147 +#define wxImage_SetPalette 1148 +#define wxImage_SetRGB_5 1149 +#define wxImage_SetRGB_4 1150 +#define wxImage_destroy 1151 +#define wxBrush_new_0 1152 +#define wxBrush_new_2 1153 +#define wxBrush_new_1 1154 +#define wxBrush_destruct 1156 +#define wxBrush_GetColour 1157 +#define wxBrush_GetStipple 1158 +#define wxBrush_GetStyle 1159 +#define wxBrush_IsHatch 1160 +#define wxBrush_IsOk 1161 +#define wxBrush_SetColour_1 1162 +#define wxBrush_SetColour_3 1163 +#define wxBrush_SetStipple 1164 +#define wxBrush_SetStyle 1165 +#define wxPen_new_0 1166 +#define wxPen_new_2 1167 +#define wxPen_destruct 1168 +#define wxPen_GetCap 1169 +#define wxPen_GetColour 1170 +#define wxPen_GetJoin 1171 +#define wxPen_GetStyle 1172 +#define wxPen_GetWidth 1173 +#define wxPen_IsOk 1174 +#define wxPen_SetCap 1175 +#define wxPen_SetColour_1 1176 +#define wxPen_SetColour_3 1177 +#define wxPen_SetJoin 1178 +#define wxPen_SetStyle 1179 +#define wxPen_SetWidth 1180 +#define wxRegion_new_0 1181 +#define wxRegion_new_4 1182 +#define wxRegion_new_2 1183 +#define wxRegion_new_1_1 1184 +#define wxRegion_new_1_0 1186 +#define wxRegion_destruct 1188 +#define wxRegion_Clear 1189 +#define wxRegion_Contains_2 1190 +#define wxRegion_Contains_1_0 1191 +#define wxRegion_Contains_4 1192 +#define wxRegion_Contains_1_1 1193 +#define wxRegion_ConvertToBitmap 1194 +#define wxRegion_GetBox 1195 +#define wxRegion_Intersect_4 1196 +#define wxRegion_Intersect_1_1 1197 +#define wxRegion_Intersect_1_0 1198 +#define wxRegion_IsEmpty 1199 +#define wxRegion_Subtract_4 1200 +#define wxRegion_Subtract_1_1 1201 +#define wxRegion_Subtract_1_0 1202 +#define wxRegion_Offset_2 1203 +#define wxRegion_Offset_1 1204 +#define wxRegion_Union_4 1205 +#define wxRegion_Union_1_2 1206 +#define wxRegion_Union_1_1 1207 +#define wxRegion_Union_1_0 1208 +#define wxRegion_Union_3 1209 +#define wxRegion_Xor_4 1210 +#define wxRegion_Xor_1_1 1211 +#define wxRegion_Xor_1_0 1212 +#define wxAcceleratorTable_new_0 1213 +#define wxAcceleratorTable_new_2 1214 +#define wxAcceleratorTable_destruct 1215 +#define wxAcceleratorTable_Ok 1216 +#define wxAcceleratorEntry_new_1_0 1217 +#define wxAcceleratorEntry_new_1_1 1218 +#define wxAcceleratorEntry_GetCommand 1219 +#define wxAcceleratorEntry_GetFlags 1220 +#define wxAcceleratorEntry_GetKeyCode 1221 +#define wxAcceleratorEntry_Set 1222 +#define wxAcceleratorEntry_destroy 1223 +#define wxCaret_new_3 1228 +#define wxCaret_new_2 1229 +#define wxCaret_destruct 1231 +#define wxCaret_Create_3 1232 +#define wxCaret_Create_2 1233 +#define wxCaret_GetBlinkTime 1234 +#define wxCaret_GetPosition 1236 +#define wxCaret_GetSize 1238 +#define wxCaret_GetWindow 1239 +#define wxCaret_Hide 1240 +#define wxCaret_IsOk 1241 +#define wxCaret_IsVisible 1242 +#define wxCaret_Move_2 1243 +#define wxCaret_Move_1 1244 +#define wxCaret_SetBlinkTime 1245 +#define wxCaret_SetSize_2 1246 +#define wxCaret_SetSize_1 1247 +#define wxCaret_Show 1248 +#define wxSizer_Add_2_1 1249 +#define wxSizer_Add_2_0 1250 +#define wxSizer_Add_3 1251 +#define wxSizer_Add_2_3 1252 +#define wxSizer_Add_2_2 1253 +#define wxSizer_AddSpacer 1254 +#define wxSizer_AddStretchSpacer 1255 +#define wxSizer_CalcMin 1256 +#define wxSizer_Clear 1257 +#define wxSizer_Detach_1_2 1258 +#define wxSizer_Detach_1_1 1259 +#define wxSizer_Detach_1_0 1260 +#define wxSizer_Fit 1261 +#define wxSizer_FitInside 1262 +#define wxSizer_GetChildren 1263 +#define wxSizer_GetItem_2_1 1264 +#define wxSizer_GetItem_2_0 1265 +#define wxSizer_GetItem_1 1266 +#define wxSizer_GetSize 1267 +#define wxSizer_GetPosition 1268 +#define wxSizer_GetMinSize 1269 +#define wxSizer_Hide_2_0 1270 +#define wxSizer_Hide_2_1 1271 +#define wxSizer_Hide_1 1272 +#define wxSizer_Insert_3_1 1273 +#define wxSizer_Insert_3_0 1274 +#define wxSizer_Insert_4 1275 +#define wxSizer_Insert_3_3 1276 +#define wxSizer_Insert_3_2 1277 +#define wxSizer_Insert_2 1278 +#define wxSizer_InsertSpacer 1279 +#define wxSizer_InsertStretchSpacer 1280 +#define wxSizer_IsShown_1_2 1281 +#define wxSizer_IsShown_1_1 1282 +#define wxSizer_IsShown_1_0 1283 +#define wxSizer_Layout 1284 +#define wxSizer_Prepend_2_1 1285 +#define wxSizer_Prepend_2_0 1286 +#define wxSizer_Prepend_3 1287 +#define wxSizer_Prepend_2_3 1288 +#define wxSizer_Prepend_2_2 1289 +#define wxSizer_Prepend_1 1290 +#define wxSizer_PrependSpacer 1291 +#define wxSizer_PrependStretchSpacer 1292 +#define wxSizer_RecalcSizes 1293 +#define wxSizer_Remove_1_1 1294 +#define wxSizer_Remove_1_0 1295 +#define wxSizer_Replace_3_1 1296 +#define wxSizer_Replace_3_0 1297 +#define wxSizer_Replace_2 1298 +#define wxSizer_SetDimension 1299 +#define wxSizer_SetMinSize_2 1300 +#define wxSizer_SetMinSize_1 1301 +#define wxSizer_SetItemMinSize_3_2 1302 +#define wxSizer_SetItemMinSize_2_2 1303 +#define wxSizer_SetItemMinSize_3_1 1304 +#define wxSizer_SetItemMinSize_2_1 1305 +#define wxSizer_SetItemMinSize_3_0 1306 +#define wxSizer_SetItemMinSize_2_0 1307 +#define wxSizer_SetSizeHints 1308 +#define wxSizer_SetVirtualSizeHints 1309 +#define wxSizer_Show_2_2 1310 +#define wxSizer_Show_2_1 1311 +#define wxSizer_Show_2_0 1312 +#define wxSizer_Show_1 1313 +#define wxSizerFlags_new 1314 +#define wxSizerFlags_Align 1315 +#define wxSizerFlags_Border_2 1316 +#define wxSizerFlags_Border_1 1317 +#define wxSizerFlags_Center 1318 +#define wxSizerFlags_Centre 1319 +#define wxSizerFlags_Expand 1320 +#define wxSizerFlags_Left 1321 +#define wxSizerFlags_Proportion 1322 +#define wxSizerFlags_Right 1323 +#define wxSizerFlags_destroy 1324 +#define wxSizerItem_new_5_1 1325 +#define wxSizerItem_new_2_1 1326 +#define wxSizerItem_new_5_0 1327 +#define wxSizerItem_new_2_0 1328 +#define wxSizerItem_new_6 1329 +#define wxSizerItem_new_3 1330 +#define wxSizerItem_new_0 1331 +#define wxSizerItem_destruct 1332 +#define wxSizerItem_CalcMin 1333 +#define wxSizerItem_DeleteWindows 1334 +#define wxSizerItem_DetachSizer 1335 +#define wxSizerItem_GetBorder 1336 +#define wxSizerItem_GetFlag 1337 +#define wxSizerItem_GetMinSize 1338 +#define wxSizerItem_GetPosition 1339 +#define wxSizerItem_GetProportion 1340 +#define wxSizerItem_GetRatio 1341 +#define wxSizerItem_GetRect 1342 +#define wxSizerItem_GetSize 1343 +#define wxSizerItem_GetSizer 1344 +#define wxSizerItem_GetSpacer 1345 +#define wxSizerItem_GetUserData 1346 +#define wxSizerItem_GetWindow 1347 +#define wxSizerItem_IsSizer 1348 +#define wxSizerItem_IsShown 1349 +#define wxSizerItem_IsSpacer 1350 +#define wxSizerItem_IsWindow 1351 +#define wxSizerItem_SetBorder 1352 +#define wxSizerItem_SetDimension 1353 +#define wxSizerItem_SetFlag 1354 +#define wxSizerItem_SetInitSize 1355 +#define wxSizerItem_SetMinSize_1 1356 +#define wxSizerItem_SetMinSize_2 1357 +#define wxSizerItem_SetProportion 1358 +#define wxSizerItem_SetRatio_2 1359 +#define wxSizerItem_SetRatio_1_1 1360 +#define wxSizerItem_SetRatio_1_0 1361 +#define wxSizerItem_SetSizer 1362 +#define wxSizerItem_SetSpacer_1 1363 +#define wxSizerItem_SetSpacer_2 1364 +#define wxSizerItem_SetWindow 1365 +#define wxSizerItem_Show 1366 +#define wxBoxSizer_new 1367 +#define wxBoxSizer_GetOrientation 1368 +#define wxBoxSizer_destroy 1369 +#define wxStaticBoxSizer_new_2 1370 +#define wxStaticBoxSizer_new_3 1371 +#define wxStaticBoxSizer_GetStaticBox 1372 +#define wxStaticBoxSizer_destroy 1373 +#define wxGridSizer_new_4 1374 +#define wxGridSizer_new_2 1375 +#define wxGridSizer_GetCols 1376 +#define wxGridSizer_GetHGap 1377 +#define wxGridSizer_GetRows 1378 +#define wxGridSizer_GetVGap 1379 +#define wxGridSizer_SetCols 1380 +#define wxGridSizer_SetHGap 1381 +#define wxGridSizer_SetRows 1382 +#define wxGridSizer_SetVGap 1383 +#define wxGridSizer_destroy 1384 +#define wxFlexGridSizer_new_4 1385 +#define wxFlexGridSizer_new_2 1386 +#define wxFlexGridSizer_AddGrowableCol 1387 +#define wxFlexGridSizer_AddGrowableRow 1388 +#define wxFlexGridSizer_GetFlexibleDirection 1389 +#define wxFlexGridSizer_GetNonFlexibleGrowMode 1390 +#define wxFlexGridSizer_RemoveGrowableCol 1391 +#define wxFlexGridSizer_RemoveGrowableRow 1392 +#define wxFlexGridSizer_SetFlexibleDirection 1393 +#define wxFlexGridSizer_SetNonFlexibleGrowMode 1394 +#define wxFlexGridSizer_destroy 1395 +#define wxGridBagSizer_new 1396 +#define wxGridBagSizer_Add_3_2 1397 +#define wxGridBagSizer_Add_3_1 1398 +#define wxGridBagSizer_Add_4 1399 +#define wxGridBagSizer_Add_1_0 1400 +#define wxGridBagSizer_Add_2_1 1401 +#define wxGridBagSizer_Add_2_0 1402 +#define wxGridBagSizer_Add_3_0 1403 +#define wxGridBagSizer_Add_1_1 1404 +#define wxGridBagSizer_CalcMin 1405 +#define wxGridBagSizer_CheckForIntersection_2 1406 +#define wxGridBagSizer_CheckForIntersection_3 1407 +#define wxGridBagSizer_FindItem_1_1 1408 +#define wxGridBagSizer_FindItem_1_0 1409 +#define wxGridBagSizer_FindItemAtPoint 1410 +#define wxGridBagSizer_FindItemAtPosition 1411 +#define wxGridBagSizer_FindItemWithData 1412 +#define wxGridBagSizer_GetCellSize 1413 +#define wxGridBagSizer_GetEmptyCellSize 1414 +#define wxGridBagSizer_GetItemPosition_1_2 1415 +#define wxGridBagSizer_GetItemPosition_1_1 1416 +#define wxGridBagSizer_GetItemPosition_1_0 1417 +#define wxGridBagSizer_GetItemSpan_1_2 1418 +#define wxGridBagSizer_GetItemSpan_1_1 1419 +#define wxGridBagSizer_GetItemSpan_1_0 1420 +#define wxGridBagSizer_SetEmptyCellSize 1421 +#define wxGridBagSizer_SetItemPosition_2_2 1422 +#define wxGridBagSizer_SetItemPosition_2_1 1423 +#define wxGridBagSizer_SetItemPosition_2_0 1424 +#define wxGridBagSizer_SetItemSpan_2_2 1425 +#define wxGridBagSizer_SetItemSpan_2_1 1426 +#define wxGridBagSizer_SetItemSpan_2_0 1427 +#define wxGridBagSizer_destroy 1428 +#define wxStdDialogButtonSizer_new 1429 +#define wxStdDialogButtonSizer_AddButton 1430 +#define wxStdDialogButtonSizer_Realize 1431 +#define wxStdDialogButtonSizer_SetAffirmativeButton 1432 +#define wxStdDialogButtonSizer_SetCancelButton 1433 +#define wxStdDialogButtonSizer_SetNegativeButton 1434 +#define wxStdDialogButtonSizer_destroy 1435 +#define wxFont_new_0 1436 +#define wxFont_new_1 1437 +#define wxFont_new_5 1438 +#define wxFont_destruct 1440 +#define wxFont_IsFixedWidth 1441 +#define wxFont_GetDefaultEncoding 1442 +#define wxFont_GetFaceName 1443 +#define wxFont_GetFamily 1444 +#define wxFont_GetNativeFontInfoDesc 1445 +#define wxFont_GetNativeFontInfoUserDesc 1446 +#define wxFont_GetPointSize 1447 +#define wxFont_GetStyle 1448 +#define wxFont_GetUnderlined 1449 +#define wxFont_GetWeight 1450 +#define wxFont_Ok 1451 +#define wxFont_SetDefaultEncoding 1452 +#define wxFont_SetFaceName 1453 +#define wxFont_SetFamily 1454 +#define wxFont_SetPointSize 1455 +#define wxFont_SetStyle 1456 +#define wxFont_SetUnderlined 1457 +#define wxFont_SetWeight 1458 +#define wxToolTip_Enable 1459 +#define wxToolTip_SetDelay 1460 +#define wxToolTip_new 1461 +#define wxToolTip_SetTip 1462 +#define wxToolTip_GetTip 1463 +#define wxToolTip_GetWindow 1464 +#define wxToolTip_destroy 1465 +#define wxButton_new_3 1467 +#define wxButton_new_0 1468 +#define wxButton_destruct 1469 +#define wxButton_Create 1470 +#define wxButton_GetDefaultSize 1471 +#define wxButton_SetDefault 1472 +#define wxButton_SetLabel 1473 +#define wxBitmapButton_new_4 1475 +#define wxBitmapButton_new_0 1476 +#define wxBitmapButton_Create 1477 +#define wxBitmapButton_GetBitmapDisabled 1478 +#define wxBitmapButton_GetBitmapFocus 1480 +#define wxBitmapButton_GetBitmapLabel 1482 +#define wxBitmapButton_GetBitmapSelected 1484 +#define wxBitmapButton_SetBitmapDisabled 1486 +#define wxBitmapButton_SetBitmapFocus 1487 +#define wxBitmapButton_SetBitmapLabel 1488 +#define wxBitmapButton_SetBitmapSelected 1489 +#define wxBitmapButton_destroy 1490 +#define wxToggleButton_new_0 1491 +#define wxToggleButton_new_4 1492 +#define wxToggleButton_Create 1493 +#define wxToggleButton_GetValue 1494 +#define wxToggleButton_SetValue 1495 +#define wxToggleButton_destroy 1496 +#define wxCalendarCtrl_new_0 1497 +#define wxCalendarCtrl_new_3 1498 +#define wxCalendarCtrl_Create 1499 +#define wxCalendarCtrl_destruct 1500 +#define wxCalendarCtrl_SetDate 1501 +#define wxCalendarCtrl_GetDate 1502 +#define wxCalendarCtrl_EnableYearChange 1503 +#define wxCalendarCtrl_EnableMonthChange 1504 +#define wxCalendarCtrl_EnableHolidayDisplay 1505 +#define wxCalendarCtrl_SetHeaderColours 1506 +#define wxCalendarCtrl_GetHeaderColourFg 1507 +#define wxCalendarCtrl_GetHeaderColourBg 1508 +#define wxCalendarCtrl_SetHighlightColours 1509 +#define wxCalendarCtrl_GetHighlightColourFg 1510 +#define wxCalendarCtrl_GetHighlightColourBg 1511 +#define wxCalendarCtrl_SetHolidayColours 1512 +#define wxCalendarCtrl_GetHolidayColourFg 1513 +#define wxCalendarCtrl_GetHolidayColourBg 1514 +#define wxCalendarCtrl_GetAttr 1515 +#define wxCalendarCtrl_SetAttr 1516 +#define wxCalendarCtrl_SetHoliday 1517 +#define wxCalendarCtrl_ResetAttr 1518 +#define wxCalendarCtrl_HitTest 1519 +#define wxCalendarDateAttr_new_0 1520 +#define wxCalendarDateAttr_new_2_1 1521 +#define wxCalendarDateAttr_new_2_0 1522 +#define wxCalendarDateAttr_SetTextColour 1523 +#define wxCalendarDateAttr_SetBackgroundColour 1524 +#define wxCalendarDateAttr_SetBorderColour 1525 +#define wxCalendarDateAttr_SetFont 1526 +#define wxCalendarDateAttr_SetBorder 1527 +#define wxCalendarDateAttr_SetHoliday 1528 +#define wxCalendarDateAttr_HasTextColour 1529 +#define wxCalendarDateAttr_HasBackgroundColour 1530 +#define wxCalendarDateAttr_HasBorderColour 1531 +#define wxCalendarDateAttr_HasFont 1532 +#define wxCalendarDateAttr_HasBorder 1533 +#define wxCalendarDateAttr_IsHoliday 1534 +#define wxCalendarDateAttr_GetTextColour 1535 +#define wxCalendarDateAttr_GetBackgroundColour 1536 +#define wxCalendarDateAttr_GetBorderColour 1537 +#define wxCalendarDateAttr_GetFont 1538 +#define wxCalendarDateAttr_GetBorder 1539 +#define wxCalendarDateAttr_destroy 1540 +#define wxCheckBox_new_4 1542 +#define wxCheckBox_new_0 1543 +#define wxCheckBox_Create 1544 +#define wxCheckBox_GetValue 1545 +#define wxCheckBox_Get3StateValue 1546 +#define wxCheckBox_Is3rdStateAllowedForUser 1547 +#define wxCheckBox_Is3State 1548 +#define wxCheckBox_IsChecked 1549 +#define wxCheckBox_SetValue 1550 +#define wxCheckBox_Set3StateValue 1551 +#define wxCheckBox_destroy 1552 +#define wxCheckListBox_new_0 1553 +#define wxCheckListBox_new_3 1555 +#define wxCheckListBox_Check 1556 +#define wxCheckListBox_IsChecked 1557 +#define wxCheckListBox_destroy 1558 +#define wxChoice_new_3 1561 +#define wxChoice_new_0 1562 +#define wxChoice_destruct 1564 +#define wxChoice_Create 1566 +#define wxChoice_Delete 1567 +#define wxChoice_GetColumns 1568 +#define wxChoice_SetColumns 1569 +#define wxComboBox_new_0 1570 +#define wxComboBox_new_3 1572 +#define wxComboBox_destruct 1573 +#define wxComboBox_Create 1575 +#define wxComboBox_CanCopy 1576 +#define wxComboBox_CanCut 1577 +#define wxComboBox_CanPaste 1578 +#define wxComboBox_CanRedo 1579 +#define wxComboBox_CanUndo 1580 +#define wxComboBox_Copy 1581 +#define wxComboBox_Cut 1582 +#define wxComboBox_GetInsertionPoint 1583 +#define wxComboBox_GetLastPosition 1584 +#define wxComboBox_GetValue 1585 +#define wxComboBox_Paste 1586 +#define wxComboBox_Redo 1587 +#define wxComboBox_Replace 1588 +#define wxComboBox_Remove 1589 +#define wxComboBox_SetInsertionPoint 1590 +#define wxComboBox_SetInsertionPointEnd 1591 +#define wxComboBox_SetSelection_1 1592 +#define wxComboBox_SetSelection_2 1593 +#define wxComboBox_SetValue 1594 +#define wxComboBox_Undo 1595 +#define wxGauge_new_0 1596 +#define wxGauge_new_4 1597 +#define wxGauge_Create 1598 +#define wxGauge_GetBezelFace 1599 +#define wxGauge_GetRange 1600 +#define wxGauge_GetShadowWidth 1601 +#define wxGauge_GetValue 1602 +#define wxGauge_IsVertical 1603 +#define wxGauge_SetBezelFace 1604 +#define wxGauge_SetRange 1605 +#define wxGauge_SetShadowWidth 1606 +#define wxGauge_SetValue 1607 +#define wxGauge_Pulse 1608 +#define wxGauge_destroy 1609 +#define wxGenericDirCtrl_new_0 1610 +#define wxGenericDirCtrl_new_2 1611 +#define wxGenericDirCtrl_destruct 1612 +#define wxGenericDirCtrl_Create 1613 +#define wxGenericDirCtrl_Init 1614 +#define wxGenericDirCtrl_CollapseTree 1615 +#define wxGenericDirCtrl_ExpandPath 1616 +#define wxGenericDirCtrl_GetDefaultPath 1617 +#define wxGenericDirCtrl_GetPath 1618 +#define wxGenericDirCtrl_GetFilePath 1619 +#define wxGenericDirCtrl_GetFilter 1620 +#define wxGenericDirCtrl_GetFilterIndex 1621 +#define wxGenericDirCtrl_GetRootId 1622 +#define wxGenericDirCtrl_GetTreeCtrl 1623 +#define wxGenericDirCtrl_ReCreateTree 1624 +#define wxGenericDirCtrl_SetDefaultPath 1625 +#define wxGenericDirCtrl_SetFilter 1626 +#define wxGenericDirCtrl_SetFilterIndex 1627 +#define wxGenericDirCtrl_SetPath 1628 +#define wxStaticBox_new_4 1630 +#define wxStaticBox_new_0 1631 +#define wxStaticBox_Create 1632 +#define wxStaticBox_destroy 1633 +#define wxStaticLine_new_2 1635 +#define wxStaticLine_new_0 1636 +#define wxStaticLine_Create 1637 +#define wxStaticLine_IsVertical 1638 +#define wxStaticLine_GetDefaultSize 1639 +#define wxStaticLine_destroy 1640 +#define wxListBox_new_3 1643 +#define wxListBox_new_0 1644 +#define wxListBox_destruct 1646 +#define wxListBox_Create 1648 +#define wxListBox_Deselect 1649 +#define wxListBox_GetSelections 1650 +#define wxListBox_InsertItems 1651 +#define wxListBox_IsSelected 1652 +#define wxListBox_Set 1654 +#define wxListBox_HitTest 1655 +#define wxListBox_SetFirstItem_1_0 1656 +#define wxListBox_SetFirstItem_1_1 1657 +#define wxListCtrl_new_0 1658 +#define wxListCtrl_new_2 1659 +#define wxListCtrl_Arrange 1660 +#define wxListCtrl_AssignImageList 1661 +#define wxListCtrl_ClearAll 1662 +#define wxListCtrl_Create 1663 +#define wxListCtrl_DeleteAllItems 1664 +#define wxListCtrl_DeleteColumn 1665 +#define wxListCtrl_DeleteItem 1666 +#define wxListCtrl_EditLabel 1667 +#define wxListCtrl_EnsureVisible 1668 +#define wxListCtrl_FindItem_3_0 1669 +#define wxListCtrl_FindItem_3_1 1670 +#define wxListCtrl_GetColumn 1671 +#define wxListCtrl_GetColumnCount 1672 +#define wxListCtrl_GetColumnWidth 1673 +#define wxListCtrl_GetCountPerPage 1674 +#define wxListCtrl_GetImageList 1675 +#define wxListCtrl_GetItem 1676 +#define wxListCtrl_GetItemBackgroundColour 1677 +#define wxListCtrl_GetItemCount 1678 +#define wxListCtrl_GetItemData 1679 +#define wxListCtrl_GetItemFont 1680 +#define wxListCtrl_GetItemPosition 1681 +#define wxListCtrl_GetItemRect 1682 +#define wxListCtrl_GetItemSpacing 1683 +#define wxListCtrl_GetItemState 1684 +#define wxListCtrl_GetItemText 1685 +#define wxListCtrl_GetItemTextColour 1686 +#define wxListCtrl_GetNextItem 1687 +#define wxListCtrl_GetSelectedItemCount 1688 +#define wxListCtrl_GetTextColour 1689 +#define wxListCtrl_GetTopItem 1690 +#define wxListCtrl_GetViewRect 1691 +#define wxListCtrl_HitTest 1692 +#define wxListCtrl_InsertColumn_2 1693 +#define wxListCtrl_InsertColumn_3 1694 +#define wxListCtrl_InsertItem_1 1695 +#define wxListCtrl_InsertItem_2_1 1696 +#define wxListCtrl_InsertItem_2_0 1697 +#define wxListCtrl_InsertItem_3 1698 +#define wxListCtrl_RefreshItem 1699 +#define wxListCtrl_RefreshItems 1700 +#define wxListCtrl_ScrollList 1701 +#define wxListCtrl_SetBackgroundColour 1702 +#define wxListCtrl_SetColumn 1703 +#define wxListCtrl_SetColumnWidth 1704 +#define wxListCtrl_SetImageList 1705 +#define wxListCtrl_SetItem_1 1706 +#define wxListCtrl_SetItem_4 1707 +#define wxListCtrl_SetItemBackgroundColour 1708 +#define wxListCtrl_SetItemCount 1709 +#define wxListCtrl_SetItemData 1710 +#define wxListCtrl_SetItemFont 1711 +#define wxListCtrl_SetItemImage 1712 +#define wxListCtrl_SetItemColumnImage 1713 +#define wxListCtrl_SetItemPosition 1714 +#define wxListCtrl_SetItemState 1715 +#define wxListCtrl_SetItemText 1716 +#define wxListCtrl_SetItemTextColour 1717 +#define wxListCtrl_SetSingleStyle 1718 +#define wxListCtrl_SetTextColour 1719 +#define wxListCtrl_SetWindowStyleFlag 1720 +#define wxListCtrl_SortItems 1721 +#define wxListCtrl_destroy 1722 +#define wxListView_ClearColumnImage 1723 +#define wxListView_Focus 1724 +#define wxListView_GetFirstSelected 1725 +#define wxListView_GetFocusedItem 1726 +#define wxListView_GetNextSelected 1727 +#define wxListView_IsSelected 1728 +#define wxListView_Select 1729 +#define wxListView_SetColumnImage 1730 +#define wxListItem_new_0 1731 +#define wxListItem_new_1 1732 +#define wxListItem_destruct 1733 +#define wxListItem_Clear 1734 +#define wxListItem_GetAlign 1735 +#define wxListItem_GetBackgroundColour 1736 +#define wxListItem_GetColumn 1737 +#define wxListItem_GetFont 1738 +#define wxListItem_GetId 1739 +#define wxListItem_GetImage 1740 +#define wxListItem_GetMask 1741 +#define wxListItem_GetState 1742 +#define wxListItem_GetText 1743 +#define wxListItem_GetTextColour 1744 +#define wxListItem_GetWidth 1745 +#define wxListItem_SetAlign 1746 +#define wxListItem_SetBackgroundColour 1747 +#define wxListItem_SetColumn 1748 +#define wxListItem_SetFont 1749 +#define wxListItem_SetId 1750 +#define wxListItem_SetImage 1751 +#define wxListItem_SetMask 1752 +#define wxListItem_SetState 1753 +#define wxListItem_SetStateMask 1754 +#define wxListItem_SetText 1755 +#define wxListItem_SetTextColour 1756 +#define wxListItem_SetWidth 1757 +#define wxImageList_new_0 1758 +#define wxImageList_new_3 1759 +#define wxImageList_Add_1 1760 +#define wxImageList_Add_2_0 1761 +#define wxImageList_Add_2_1 1762 +#define wxImageList_Create 1763 +#define wxImageList_Draw 1765 +#define wxImageList_GetBitmap 1766 +#define wxImageList_GetIcon 1767 +#define wxImageList_GetImageCount 1768 +#define wxImageList_GetSize 1769 +#define wxImageList_Remove 1770 +#define wxImageList_RemoveAll 1771 +#define wxImageList_Replace_2 1772 +#define wxImageList_Replace_3 1773 +#define wxImageList_destroy 1774 +#define wxTextAttr_new_0 1775 +#define wxTextAttr_new_2 1776 +#define wxTextAttr_GetAlignment 1777 +#define wxTextAttr_GetBackgroundColour 1778 +#define wxTextAttr_GetFont 1779 +#define wxTextAttr_GetLeftIndent 1780 +#define wxTextAttr_GetLeftSubIndent 1781 +#define wxTextAttr_GetRightIndent 1782 +#define wxTextAttr_GetTabs 1783 +#define wxTextAttr_GetTextColour 1784 +#define wxTextAttr_HasBackgroundColour 1785 +#define wxTextAttr_HasFont 1786 +#define wxTextAttr_HasTextColour 1787 +#define wxTextAttr_GetFlags 1788 +#define wxTextAttr_IsDefault 1789 +#define wxTextAttr_SetAlignment 1790 +#define wxTextAttr_SetBackgroundColour 1791 +#define wxTextAttr_SetFlags 1792 +#define wxTextAttr_SetFont 1793 +#define wxTextAttr_SetLeftIndent 1794 +#define wxTextAttr_SetRightIndent 1795 +#define wxTextAttr_SetTabs 1796 +#define wxTextAttr_SetTextColour 1797 +#define wxTextAttr_destroy 1798 +#define wxTextCtrl_new_3 1800 +#define wxTextCtrl_new_0 1801 +#define wxTextCtrl_destruct 1803 +#define wxTextCtrl_AppendText 1804 +#define wxTextCtrl_CanCopy 1805 +#define wxTextCtrl_CanCut 1806 +#define wxTextCtrl_CanPaste 1807 +#define wxTextCtrl_CanRedo 1808 +#define wxTextCtrl_CanUndo 1809 +#define wxTextCtrl_Clear 1810 +#define wxTextCtrl_Copy 1811 +#define wxTextCtrl_Create 1812 +#define wxTextCtrl_Cut 1813 +#define wxTextCtrl_DiscardEdits 1814 +#define wxTextCtrl_EmulateKeyPress 1815 +#define wxTextCtrl_GetDefaultStyle 1816 +#define wxTextCtrl_GetInsertionPoint 1817 +#define wxTextCtrl_GetLastPosition 1818 +#define wxTextCtrl_GetLineLength 1819 +#define wxTextCtrl_GetLineText 1820 +#define wxTextCtrl_GetNumberOfLines 1821 +#define wxTextCtrl_GetRange 1822 +#define wxTextCtrl_GetSelection 1823 +#define wxTextCtrl_GetStringSelection 1824 +#define wxTextCtrl_GetStyle 1825 +#define wxTextCtrl_GetValue 1826 +#define wxTextCtrl_IsEditable 1827 +#define wxTextCtrl_IsModified 1828 +#define wxTextCtrl_IsMultiLine 1829 +#define wxTextCtrl_IsSingleLine 1830 +#define wxTextCtrl_LoadFile 1831 +#define wxTextCtrl_MarkDirty 1832 +#define wxTextCtrl_Paste 1833 +#define wxTextCtrl_PositionToXY 1834 +#define wxTextCtrl_Redo 1835 +#define wxTextCtrl_Remove 1836 +#define wxTextCtrl_Replace 1837 +#define wxTextCtrl_SaveFile 1838 +#define wxTextCtrl_SetDefaultStyle 1839 +#define wxTextCtrl_SetEditable 1840 +#define wxTextCtrl_SetInsertionPoint 1841 +#define wxTextCtrl_SetInsertionPointEnd 1842 +#define wxTextCtrl_SetMaxLength 1844 +#define wxTextCtrl_SetSelection 1845 +#define wxTextCtrl_SetStyle 1846 +#define wxTextCtrl_SetValue 1847 +#define wxTextCtrl_ShowPosition 1848 +#define wxTextCtrl_Undo 1849 +#define wxTextCtrl_WriteText 1850 +#define wxTextCtrl_XYToPosition 1851 +#define wxNotebook_new_0 1854 +#define wxNotebook_new_3 1855 +#define wxNotebook_destruct 1856 +#define wxNotebook_AddPage 1857 +#define wxNotebook_AdvanceSelection 1858 +#define wxNotebook_AssignImageList 1859 +#define wxNotebook_Create 1860 +#define wxNotebook_DeleteAllPages 1861 +#define wxNotebook_DeletePage 1862 +#define wxNotebook_RemovePage 1863 +#define wxNotebook_GetCurrentPage 1864 +#define wxNotebook_GetImageList 1865 +#define wxNotebook_GetPage 1867 +#define wxNotebook_GetPageCount 1868 +#define wxNotebook_GetPageImage 1869 +#define wxNotebook_GetPageText 1870 +#define wxNotebook_GetRowCount 1871 +#define wxNotebook_GetSelection 1872 +#define wxNotebook_GetThemeBackgroundColour 1873 +#define wxNotebook_HitTest 1875 +#define wxNotebook_InsertPage 1877 +#define wxNotebook_SetImageList 1878 +#define wxNotebook_SetPadding 1879 +#define wxNotebook_SetPageSize 1880 +#define wxNotebook_SetPageImage 1881 +#define wxNotebook_SetPageText 1882 +#define wxNotebook_SetSelection 1883 +#define wxNotebook_ChangeSelection 1884 +#define wxChoicebook_new_0 1885 +#define wxChoicebook_new_3 1886 +#define wxChoicebook_AddPage 1887 +#define wxChoicebook_AdvanceSelection 1888 +#define wxChoicebook_AssignImageList 1889 +#define wxChoicebook_Create 1890 +#define wxChoicebook_DeleteAllPages 1891 +#define wxChoicebook_DeletePage 1892 +#define wxChoicebook_RemovePage 1893 +#define wxChoicebook_GetCurrentPage 1894 +#define wxChoicebook_GetImageList 1895 +#define wxChoicebook_GetPage 1897 +#define wxChoicebook_GetPageCount 1898 +#define wxChoicebook_GetPageImage 1899 +#define wxChoicebook_GetPageText 1900 +#define wxChoicebook_GetSelection 1901 +#define wxChoicebook_HitTest 1902 +#define wxChoicebook_InsertPage 1903 +#define wxChoicebook_SetImageList 1904 +#define wxChoicebook_SetPageSize 1905 +#define wxChoicebook_SetPageImage 1906 +#define wxChoicebook_SetPageText 1907 +#define wxChoicebook_SetSelection 1908 +#define wxChoicebook_ChangeSelection 1909 +#define wxChoicebook_destroy 1910 +#define wxToolbook_new_0 1911 +#define wxToolbook_new_3 1912 +#define wxToolbook_AddPage 1913 +#define wxToolbook_AdvanceSelection 1914 +#define wxToolbook_AssignImageList 1915 +#define wxToolbook_Create 1916 +#define wxToolbook_DeleteAllPages 1917 +#define wxToolbook_DeletePage 1918 +#define wxToolbook_RemovePage 1919 +#define wxToolbook_GetCurrentPage 1920 +#define wxToolbook_GetImageList 1921 +#define wxToolbook_GetPage 1923 +#define wxToolbook_GetPageCount 1924 +#define wxToolbook_GetPageImage 1925 +#define wxToolbook_GetPageText 1926 +#define wxToolbook_GetSelection 1927 +#define wxToolbook_HitTest 1929 +#define wxToolbook_InsertPage 1930 +#define wxToolbook_SetImageList 1931 +#define wxToolbook_SetPageSize 1932 +#define wxToolbook_SetPageImage 1933 +#define wxToolbook_SetPageText 1934 +#define wxToolbook_SetSelection 1935 +#define wxToolbook_ChangeSelection 1936 +#define wxToolbook_destroy 1937 +#define wxListbook_new_0 1938 +#define wxListbook_new_3 1939 +#define wxListbook_AddPage 1940 +#define wxListbook_AdvanceSelection 1941 +#define wxListbook_AssignImageList 1942 +#define wxListbook_Create 1943 +#define wxListbook_DeleteAllPages 1944 +#define wxListbook_DeletePage 1945 +#define wxListbook_RemovePage 1946 +#define wxListbook_GetCurrentPage 1947 +#define wxListbook_GetImageList 1948 +#define wxListbook_GetPage 1950 +#define wxListbook_GetPageCount 1951 +#define wxListbook_GetPageImage 1952 +#define wxListbook_GetPageText 1953 +#define wxListbook_GetSelection 1954 +#define wxListbook_HitTest 1956 +#define wxListbook_InsertPage 1957 +#define wxListbook_SetImageList 1958 +#define wxListbook_SetPageSize 1959 +#define wxListbook_SetPageImage 1960 +#define wxListbook_SetPageText 1961 +#define wxListbook_SetSelection 1962 +#define wxListbook_ChangeSelection 1963 +#define wxListbook_destroy 1964 +#define wxTreebook_new_0 1965 +#define wxTreebook_new_3 1966 +#define wxTreebook_AddPage 1967 +#define wxTreebook_AdvanceSelection 1968 +#define wxTreebook_AssignImageList 1969 +#define wxTreebook_Create 1970 +#define wxTreebook_DeleteAllPages 1971 +#define wxTreebook_DeletePage 1972 +#define wxTreebook_RemovePage 1973 +#define wxTreebook_GetCurrentPage 1974 +#define wxTreebook_GetImageList 1975 +#define wxTreebook_GetPage 1977 +#define wxTreebook_GetPageCount 1978 +#define wxTreebook_GetPageImage 1979 +#define wxTreebook_GetPageText 1980 +#define wxTreebook_GetSelection 1981 +#define wxTreebook_ExpandNode 1982 +#define wxTreebook_IsNodeExpanded 1983 +#define wxTreebook_HitTest 1985 +#define wxTreebook_InsertPage 1986 +#define wxTreebook_InsertSubPage 1987 +#define wxTreebook_SetImageList 1988 +#define wxTreebook_SetPageSize 1989 +#define wxTreebook_SetPageImage 1990 +#define wxTreebook_SetPageText 1991 +#define wxTreebook_SetSelection 1992 +#define wxTreebook_ChangeSelection 1993 +#define wxTreebook_destroy 1994 +#define wxTreeCtrl_new_2 1997 +#define wxTreeCtrl_new_0 1998 +#define wxTreeCtrl_destruct 2000 +#define wxTreeCtrl_AddRoot 2001 +#define wxTreeCtrl_AppendItem 2002 +#define wxTreeCtrl_AssignImageList 2003 +#define wxTreeCtrl_AssignStateImageList 2004 +#define wxTreeCtrl_Collapse 2005 +#define wxTreeCtrl_CollapseAndReset 2006 +#define wxTreeCtrl_Create 2007 +#define wxTreeCtrl_Delete 2008 +#define wxTreeCtrl_DeleteAllItems 2009 +#define wxTreeCtrl_DeleteChildren 2010 +#define wxTreeCtrl_EnsureVisible 2011 +#define wxTreeCtrl_Expand 2012 +#define wxTreeCtrl_GetBoundingRect 2013 +#define wxTreeCtrl_GetChildrenCount 2015 +#define wxTreeCtrl_GetCount 2016 +#define wxTreeCtrl_GetEditControl 2017 +#define wxTreeCtrl_GetFirstVisibleItem 2018 +#define wxTreeCtrl_GetImageList 2019 +#define wxTreeCtrl_GetIndent 2020 +#define wxTreeCtrl_GetItemBackgroundColour 2021 +#define wxTreeCtrl_GetItemData 2022 +#define wxTreeCtrl_GetItemFont 2023 +#define wxTreeCtrl_GetItemImage_1 2024 +#define wxTreeCtrl_GetItemImage_2 2025 +#define wxTreeCtrl_GetItemText 2026 +#define wxTreeCtrl_GetItemTextColour 2027 +#define wxTreeCtrl_GetLastChild 2028 +#define wxTreeCtrl_GetNextSibling 2029 +#define wxTreeCtrl_GetNextVisible 2030 +#define wxTreeCtrl_GetItemParent 2031 +#define wxTreeCtrl_GetPrevSibling 2032 +#define wxTreeCtrl_GetPrevVisible 2033 +#define wxTreeCtrl_GetRootItem 2034 +#define wxTreeCtrl_GetSelection 2035 +#define wxTreeCtrl_GetSelections 2036 +#define wxTreeCtrl_GetStateImageList 2037 +#define wxTreeCtrl_HitTest 2038 +#define wxTreeCtrl_InsertItem_4_1 2039 +#define wxTreeCtrl_InsertItem_4_0 2040 +#define wxTreeCtrl_IsBold 2041 +#define wxTreeCtrl_IsExpanded 2042 +#define wxTreeCtrl_IsSelected 2043 +#define wxTreeCtrl_IsVisible 2044 +#define wxTreeCtrl_ItemHasChildren 2045 +#define wxTreeCtrl_PrependItem 2046 +#define wxTreeCtrl_ScrollTo 2047 +#define wxTreeCtrl_SelectItem_1 2048 +#define wxTreeCtrl_SelectItem_2 2049 +#define wxTreeCtrl_SetIndent 2050 +#define wxTreeCtrl_SetImageList 2051 +#define wxTreeCtrl_SetItemBackgroundColour 2052 +#define wxTreeCtrl_SetItemBold 2053 +#define wxTreeCtrl_SetItemData 2054 +#define wxTreeCtrl_SetItemDropHighlight 2055 +#define wxTreeCtrl_SetItemFont 2056 +#define wxTreeCtrl_SetItemHasChildren 2057 +#define wxTreeCtrl_SetItemImage_2 2058 +#define wxTreeCtrl_SetItemImage_3 2059 +#define wxTreeCtrl_SetItemText 2060 +#define wxTreeCtrl_SetItemTextColour 2061 +#define wxTreeCtrl_SetStateImageList 2062 +#define wxTreeCtrl_SetWindowStyle 2063 +#define wxTreeCtrl_SortChildren 2064 +#define wxTreeCtrl_Toggle 2065 +#define wxTreeCtrl_ToggleItemSelection 2066 +#define wxTreeCtrl_Unselect 2067 +#define wxTreeCtrl_UnselectAll 2068 +#define wxTreeCtrl_UnselectItem 2069 +#define wxScrollBar_new_0 2070 +#define wxScrollBar_new_3 2071 +#define wxScrollBar_destruct 2072 +#define wxScrollBar_Create 2073 +#define wxScrollBar_GetRange 2074 +#define wxScrollBar_GetPageSize 2075 +#define wxScrollBar_GetThumbPosition 2076 +#define wxScrollBar_GetThumbSize 2077 +#define wxScrollBar_SetThumbPosition 2078 +#define wxScrollBar_SetScrollbar 2079 +#define wxSpinButton_new_2 2081 +#define wxSpinButton_new_0 2082 +#define wxSpinButton_Create 2083 +#define wxSpinButton_GetMax 2084 +#define wxSpinButton_GetMin 2085 +#define wxSpinButton_GetValue 2086 +#define wxSpinButton_SetRange 2087 +#define wxSpinButton_SetValue 2088 +#define wxSpinButton_destroy 2089 +#define wxSpinCtrl_new_0 2090 +#define wxSpinCtrl_new_2 2091 +#define wxSpinCtrl_Create 2093 +#define wxSpinCtrl_SetValue_1_1 2096 +#define wxSpinCtrl_SetValue_1_0 2097 +#define wxSpinCtrl_GetValue 2099 +#define wxSpinCtrl_SetRange 2101 +#define wxSpinCtrl_SetSelection 2102 +#define wxSpinCtrl_GetMin 2104 +#define wxSpinCtrl_GetMax 2106 +#define wxSpinCtrl_destroy 2107 +#define wxStaticText_new_0 2108 +#define wxStaticText_new_4 2109 +#define wxStaticText_Create 2110 +#define wxStaticText_GetLabel 2111 +#define wxStaticText_SetLabel 2112 +#define wxStaticText_Wrap 2113 +#define wxStaticText_destroy 2114 +#define wxStaticBitmap_new_0 2115 +#define wxStaticBitmap_new_4 2116 +#define wxStaticBitmap_Create 2117 +#define wxStaticBitmap_GetBitmap 2118 +#define wxStaticBitmap_SetBitmap 2119 +#define wxStaticBitmap_destroy 2120 +#define wxRadioBox_new 2121 +#define wxRadioBox_destruct 2123 +#define wxRadioBox_Create 2124 +#define wxRadioBox_Enable_2 2125 +#define wxRadioBox_Enable_1 2126 +#define wxRadioBox_GetSelection 2127 +#define wxRadioBox_GetString 2128 +#define wxRadioBox_SetSelection 2129 +#define wxRadioBox_Show_2 2130 +#define wxRadioBox_Show_1 2131 +#define wxRadioBox_GetColumnCount 2132 +#define wxRadioBox_GetItemHelpText 2133 +#define wxRadioBox_GetItemToolTip 2134 +#define wxRadioBox_GetItemFromPoint 2136 +#define wxRadioBox_GetRowCount 2137 +#define wxRadioBox_IsItemEnabled 2138 +#define wxRadioBox_IsItemShown 2139 +#define wxRadioBox_SetItemHelpText 2140 +#define wxRadioBox_SetItemToolTip 2141 +#define wxRadioButton_new_0 2142 +#define wxRadioButton_new_4 2143 +#define wxRadioButton_Create 2144 +#define wxRadioButton_GetValue 2145 +#define wxRadioButton_SetValue 2146 +#define wxRadioButton_destroy 2147 +#define wxSlider_new_6 2149 +#define wxSlider_new_0 2150 +#define wxSlider_Create 2151 +#define wxSlider_GetLineSize 2152 +#define wxSlider_GetMax 2153 +#define wxSlider_GetMin 2154 +#define wxSlider_GetPageSize 2155 +#define wxSlider_GetThumbLength 2156 +#define wxSlider_GetValue 2157 +#define wxSlider_SetLineSize 2158 +#define wxSlider_SetPageSize 2159 +#define wxSlider_SetRange 2160 +#define wxSlider_SetThumbLength 2161 +#define wxSlider_SetValue 2162 +#define wxSlider_destroy 2163 +#define wxDialog_new_4 2165 +#define wxDialog_new_0 2166 +#define wxDialog_destruct 2168 +#define wxDialog_Create 2169 +#define wxDialog_CreateButtonSizer 2170 +#define wxDialog_CreateStdDialogButtonSizer 2171 +#define wxDialog_EndModal 2172 +#define wxDialog_GetAffirmativeId 2173 +#define wxDialog_GetReturnCode 2174 +#define wxDialog_IsModal 2175 +#define wxDialog_SetAffirmativeId 2176 +#define wxDialog_SetReturnCode 2177 +#define wxDialog_Show 2178 +#define wxDialog_ShowModal 2179 +#define wxColourDialog_new_0 2180 +#define wxColourDialog_new_2 2181 +#define wxColourDialog_destruct 2182 +#define wxColourDialog_Create 2183 +#define wxColourDialog_GetColourData 2184 +#define wxColourData_new_0 2185 +#define wxColourData_new_1 2186 +#define wxColourData_destruct 2187 +#define wxColourData_GetChooseFull 2188 +#define wxColourData_GetColour 2189 +#define wxColourData_GetCustomColour 2191 +#define wxColourData_SetChooseFull 2192 +#define wxColourData_SetColour 2193 +#define wxColourData_SetCustomColour 2194 +#define wxPalette_new_0 2195 +#define wxPalette_new_4 2196 +#define wxPalette_destruct 2198 +#define wxPalette_Create 2199 +#define wxPalette_GetColoursCount 2200 +#define wxPalette_GetPixel 2201 +#define wxPalette_GetRGB 2202 +#define wxPalette_IsOk 2203 +#define wxDirDialog_new 2207 +#define wxDirDialog_destruct 2208 +#define wxDirDialog_GetPath 2209 +#define wxDirDialog_GetMessage 2210 +#define wxDirDialog_SetMessage 2211 +#define wxDirDialog_SetPath 2212 +#define wxFileDialog_new 2216 +#define wxFileDialog_destruct 2217 +#define wxFileDialog_GetDirectory 2218 +#define wxFileDialog_GetFilename 2219 +#define wxFileDialog_GetFilenames 2220 +#define wxFileDialog_GetFilterIndex 2221 +#define wxFileDialog_GetMessage 2222 +#define wxFileDialog_GetPath 2223 +#define wxFileDialog_GetPaths 2224 +#define wxFileDialog_GetWildcard 2225 +#define wxFileDialog_SetDirectory 2226 +#define wxFileDialog_SetFilename 2227 +#define wxFileDialog_SetFilterIndex 2228 +#define wxFileDialog_SetMessage 2229 +#define wxFileDialog_SetPath 2230 +#define wxFileDialog_SetWildcard 2231 +#define wxPickerBase_SetInternalMargin 2232 +#define wxPickerBase_GetInternalMargin 2233 +#define wxPickerBase_SetTextCtrlProportion 2234 +#define wxPickerBase_SetPickerCtrlProportion 2235 +#define wxPickerBase_GetTextCtrlProportion 2236 +#define wxPickerBase_GetPickerCtrlProportion 2237 +#define wxPickerBase_HasTextCtrl 2238 +#define wxPickerBase_GetTextCtrl 2239 +#define wxPickerBase_IsTextCtrlGrowable 2240 +#define wxPickerBase_SetPickerCtrlGrowable 2241 +#define wxPickerBase_SetTextCtrlGrowable 2242 +#define wxPickerBase_IsPickerCtrlGrowable 2243 +#define wxFilePickerCtrl_new_0 2244 +#define wxFilePickerCtrl_new_3 2245 +#define wxFilePickerCtrl_Create 2246 +#define wxFilePickerCtrl_GetPath 2247 +#define wxFilePickerCtrl_SetPath 2248 +#define wxFilePickerCtrl_destroy 2249 +#define wxDirPickerCtrl_new_0 2250 +#define wxDirPickerCtrl_new_3 2251 +#define wxDirPickerCtrl_Create 2252 +#define wxDirPickerCtrl_GetPath 2253 +#define wxDirPickerCtrl_SetPath 2254 +#define wxDirPickerCtrl_destroy 2255 +#define wxColourPickerCtrl_new_0 2256 +#define wxColourPickerCtrl_new_3 2257 +#define wxColourPickerCtrl_Create 2258 +#define wxColourPickerCtrl_GetColour 2259 +#define wxColourPickerCtrl_SetColour_1_1 2260 +#define wxColourPickerCtrl_SetColour_1_0 2261 +#define wxColourPickerCtrl_destroy 2262 +#define wxDatePickerCtrl_new_0 2263 +#define wxDatePickerCtrl_new_3 2264 +#define wxDatePickerCtrl_GetRange 2265 +#define wxDatePickerCtrl_GetValue 2266 +#define wxDatePickerCtrl_SetRange 2267 +#define wxDatePickerCtrl_SetValue 2268 +#define wxDatePickerCtrl_destroy 2269 +#define wxFontPickerCtrl_new_0 2270 +#define wxFontPickerCtrl_new_3 2271 +#define wxFontPickerCtrl_Create 2272 +#define wxFontPickerCtrl_GetSelectedFont 2273 +#define wxFontPickerCtrl_SetSelectedFont 2274 +#define wxFontPickerCtrl_GetMaxPointSize 2275 +#define wxFontPickerCtrl_SetMaxPointSize 2276 +#define wxFontPickerCtrl_destroy 2277 +#define wxFindReplaceDialog_new_0 2280 +#define wxFindReplaceDialog_new_4 2281 +#define wxFindReplaceDialog_destruct 2282 +#define wxFindReplaceDialog_Create 2283 +#define wxFindReplaceDialog_GetData 2284 +#define wxFindReplaceData_new_0 2285 +#define wxFindReplaceData_new_1 2286 +#define wxFindReplaceData_GetFindString 2287 +#define wxFindReplaceData_GetReplaceString 2288 +#define wxFindReplaceData_GetFlags 2289 +#define wxFindReplaceData_SetFlags 2290 +#define wxFindReplaceData_SetFindString 2291 +#define wxFindReplaceData_SetReplaceString 2292 +#define wxFindReplaceData_destroy 2293 +#define wxMultiChoiceDialog_new_0 2294 +#define wxMultiChoiceDialog_new_5 2296 +#define wxMultiChoiceDialog_GetSelections 2297 +#define wxMultiChoiceDialog_SetSelections 2298 +#define wxMultiChoiceDialog_destroy 2299 +#define wxSingleChoiceDialog_new_0 2300 +#define wxSingleChoiceDialog_new_5 2302 +#define wxSingleChoiceDialog_GetSelection 2303 +#define wxSingleChoiceDialog_GetStringSelection 2304 +#define wxSingleChoiceDialog_SetSelection 2305 +#define wxSingleChoiceDialog_destroy 2306 +#define wxTextEntryDialog_new 2307 +#define wxTextEntryDialog_GetValue 2308 +#define wxTextEntryDialog_SetValue 2309 +#define wxTextEntryDialog_destroy 2310 +#define wxPasswordEntryDialog_new 2311 +#define wxPasswordEntryDialog_destroy 2312 +#define wxFontData_new_0 2313 +#define wxFontData_new_1 2314 +#define wxFontData_destruct 2315 +#define wxFontData_EnableEffects 2316 +#define wxFontData_GetAllowSymbols 2317 +#define wxFontData_GetColour 2318 +#define wxFontData_GetChosenFont 2319 +#define wxFontData_GetEnableEffects 2320 +#define wxFontData_GetInitialFont 2321 +#define wxFontData_GetShowHelp 2322 +#define wxFontData_SetAllowSymbols 2323 +#define wxFontData_SetChosenFont 2324 +#define wxFontData_SetColour 2325 +#define wxFontData_SetInitialFont 2326 +#define wxFontData_SetRange 2327 +#define wxFontData_SetShowHelp 2328 +#define wxFontDialog_new_0 2332 +#define wxFontDialog_new_2 2334 +#define wxFontDialog_Create 2336 +#define wxFontDialog_GetFontData 2337 +#define wxFontDialog_destroy 2339 +#define wxProgressDialog_new 2340 +#define wxProgressDialog_destruct 2341 +#define wxProgressDialog_Resume 2342 +#define wxProgressDialog_Update_2 2343 +#define wxProgressDialog_Update_0 2344 +#define wxMessageDialog_new 2345 +#define wxMessageDialog_destruct 2346 +#define wxPageSetupDialog_new 2347 +#define wxPageSetupDialog_destruct 2348 +#define wxPageSetupDialog_GetPageSetupData 2349 +#define wxPageSetupDialog_ShowModal 2350 +#define wxPageSetupDialogData_new_0 2351 +#define wxPageSetupDialogData_new_1_0 2352 +#define wxPageSetupDialogData_new_1_1 2353 +#define wxPageSetupDialogData_destruct 2354 +#define wxPageSetupDialogData_EnableHelp 2355 +#define wxPageSetupDialogData_EnableMargins 2356 +#define wxPageSetupDialogData_EnableOrientation 2357 +#define wxPageSetupDialogData_EnablePaper 2358 +#define wxPageSetupDialogData_EnablePrinter 2359 +#define wxPageSetupDialogData_GetDefaultMinMargins 2360 +#define wxPageSetupDialogData_GetEnableMargins 2361 +#define wxPageSetupDialogData_GetEnableOrientation 2362 +#define wxPageSetupDialogData_GetEnablePaper 2363 +#define wxPageSetupDialogData_GetEnablePrinter 2364 +#define wxPageSetupDialogData_GetEnableHelp 2365 +#define wxPageSetupDialogData_GetDefaultInfo 2366 +#define wxPageSetupDialogData_GetMarginTopLeft 2367 +#define wxPageSetupDialogData_GetMarginBottomRight 2368 +#define wxPageSetupDialogData_GetMinMarginTopLeft 2369 +#define wxPageSetupDialogData_GetMinMarginBottomRight 2370 +#define wxPageSetupDialogData_GetPaperId 2371 +#define wxPageSetupDialogData_GetPaperSize 2372 +#define wxPageSetupDialogData_GetPrintData 2374 +#define wxPageSetupDialogData_IsOk 2375 +#define wxPageSetupDialogData_SetDefaultInfo 2376 +#define wxPageSetupDialogData_SetDefaultMinMargins 2377 +#define wxPageSetupDialogData_SetMarginTopLeft 2378 +#define wxPageSetupDialogData_SetMarginBottomRight 2379 +#define wxPageSetupDialogData_SetMinMarginTopLeft 2380 +#define wxPageSetupDialogData_SetMinMarginBottomRight 2381 +#define wxPageSetupDialogData_SetPaperId 2382 +#define wxPageSetupDialogData_SetPaperSize_1_1 2383 +#define wxPageSetupDialogData_SetPaperSize_1_0 2384 +#define wxPageSetupDialogData_SetPrintData 2385 +#define wxPrintDialog_new_2_0 2386 +#define wxPrintDialog_new_2_1 2387 +#define wxPrintDialog_destruct 2388 +#define wxPrintDialog_GetPrintDialogData 2389 +#define wxPrintDialog_GetPrintDC 2390 +#define wxPrintDialogData_new_0 2391 +#define wxPrintDialogData_new_1_1 2392 +#define wxPrintDialogData_new_1_0 2393 +#define wxPrintDialogData_destruct 2394 +#define wxPrintDialogData_EnableHelp 2395 +#define wxPrintDialogData_EnablePageNumbers 2396 +#define wxPrintDialogData_EnablePrintToFile 2397 +#define wxPrintDialogData_EnableSelection 2398 +#define wxPrintDialogData_GetAllPages 2399 +#define wxPrintDialogData_GetCollate 2400 +#define wxPrintDialogData_GetFromPage 2401 +#define wxPrintDialogData_GetMaxPage 2402 +#define wxPrintDialogData_GetMinPage 2403 +#define wxPrintDialogData_GetNoCopies 2404 +#define wxPrintDialogData_GetPrintData 2405 +#define wxPrintDialogData_GetPrintToFile 2406 +#define wxPrintDialogData_GetSelection 2407 +#define wxPrintDialogData_GetToPage 2408 +#define wxPrintDialogData_IsOk 2409 +#define wxPrintDialogData_SetCollate 2410 +#define wxPrintDialogData_SetFromPage 2411 +#define wxPrintDialogData_SetMaxPage 2412 +#define wxPrintDialogData_SetMinPage 2413 +#define wxPrintDialogData_SetNoCopies 2414 +#define wxPrintDialogData_SetPrintData 2415 +#define wxPrintDialogData_SetPrintToFile 2416 +#define wxPrintDialogData_SetSelection 2417 +#define wxPrintDialogData_SetToPage 2418 +#define wxPrintData_new_0 2419 +#define wxPrintData_new_1 2420 +#define wxPrintData_destruct 2421 +#define wxPrintData_GetCollate 2422 +#define wxPrintData_GetBin 2423 +#define wxPrintData_GetColour 2424 +#define wxPrintData_GetDuplex 2425 +#define wxPrintData_GetNoCopies 2426 +#define wxPrintData_GetOrientation 2427 +#define wxPrintData_GetPaperId 2428 +#define wxPrintData_GetPrinterName 2429 +#define wxPrintData_GetQuality 2430 +#define wxPrintData_IsOk 2431 +#define wxPrintData_SetBin 2432 +#define wxPrintData_SetCollate 2433 +#define wxPrintData_SetColour 2434 +#define wxPrintData_SetDuplex 2435 +#define wxPrintData_SetNoCopies 2436 +#define wxPrintData_SetOrientation 2437 +#define wxPrintData_SetPaperId 2438 +#define wxPrintData_SetPrinterName 2439 +#define wxPrintData_SetQuality 2440 +#define wxPrintPreview_new_2 2443 +#define wxPrintPreview_new_3 2444 +#define wxPrintPreview_destruct 2446 +#define wxPrintPreview_GetCanvas 2447 +#define wxPrintPreview_GetCurrentPage 2448 +#define wxPrintPreview_GetFrame 2449 +#define wxPrintPreview_GetMaxPage 2450 +#define wxPrintPreview_GetMinPage 2451 +#define wxPrintPreview_GetPrintout 2452 +#define wxPrintPreview_GetPrintoutForPrinting 2453 +#define wxPrintPreview_IsOk 2454 +#define wxPrintPreview_PaintPage 2455 +#define wxPrintPreview_Print 2456 +#define wxPrintPreview_RenderPage 2457 +#define wxPrintPreview_SetCanvas 2458 +#define wxPrintPreview_SetCurrentPage 2459 +#define wxPrintPreview_SetFrame 2460 +#define wxPrintPreview_SetPrintout 2461 +#define wxPrintPreview_SetZoom 2462 +#define wxPreviewFrame_new 2463 +#define wxPreviewFrame_destruct 2464 +#define wxPreviewFrame_CreateControlBar 2465 +#define wxPreviewFrame_CreateCanvas 2466 +#define wxPreviewFrame_Initialize 2467 +#define wxPreviewFrame_OnCloseWindow 2468 +#define wxPreviewControlBar_new 2469 +#define wxPreviewControlBar_destruct 2470 +#define wxPreviewControlBar_CreateButtons 2471 +#define wxPreviewControlBar_GetPrintPreview 2472 +#define wxPreviewControlBar_GetZoomControl 2473 +#define wxPreviewControlBar_SetZoomControl 2474 +#define wxPrinter_new 2476 +#define wxPrinter_CreateAbortWindow 2477 +#define wxPrinter_GetAbort 2478 +#define wxPrinter_GetLastError 2479 +#define wxPrinter_GetPrintDialogData 2480 +#define wxPrinter_Print 2481 +#define wxPrinter_PrintDialog 2482 +#define wxPrinter_ReportError 2483 +#define wxPrinter_Setup 2484 +#define wxPrinter_destroy 2485 +#define wxXmlResource_new_1 2486 +#define wxXmlResource_new_2 2487 +#define wxXmlResource_destruct 2488 +#define wxXmlResource_AttachUnknownControl 2489 +#define wxXmlResource_ClearHandlers 2490 +#define wxXmlResource_CompareVersion 2491 +#define wxXmlResource_Get 2492 +#define wxXmlResource_GetFlags 2493 +#define wxXmlResource_GetVersion 2494 +#define wxXmlResource_GetXRCID 2495 +#define wxXmlResource_InitAllHandlers 2496 +#define wxXmlResource_Load 2497 +#define wxXmlResource_LoadBitmap 2498 +#define wxXmlResource_LoadDialog_2 2499 +#define wxXmlResource_LoadDialog_3 2500 +#define wxXmlResource_LoadFrame_2 2501 +#define wxXmlResource_LoadFrame_3 2502 +#define wxXmlResource_LoadIcon 2503 +#define wxXmlResource_LoadMenu 2504 +#define wxXmlResource_LoadMenuBar_2 2505 +#define wxXmlResource_LoadMenuBar_1 2506 +#define wxXmlResource_LoadPanel_2 2507 +#define wxXmlResource_LoadPanel_3 2508 +#define wxXmlResource_LoadToolBar 2509 +#define wxXmlResource_Set 2510 +#define wxXmlResource_SetFlags 2511 +#define wxXmlResource_Unload 2512 +#define wxXmlResource_xrcctrl 2513 +#define wxHtmlEasyPrinting_new 2514 +#define wxHtmlEasyPrinting_destruct 2515 +#define wxHtmlEasyPrinting_GetPrintData 2516 +#define wxHtmlEasyPrinting_GetPageSetupData 2517 +#define wxHtmlEasyPrinting_PreviewFile 2518 +#define wxHtmlEasyPrinting_PreviewText 2519 +#define wxHtmlEasyPrinting_PrintFile 2520 +#define wxHtmlEasyPrinting_PrintText 2521 +#define wxHtmlEasyPrinting_PageSetup 2522 +#define wxHtmlEasyPrinting_SetFonts 2523 +#define wxHtmlEasyPrinting_SetHeader 2524 +#define wxHtmlEasyPrinting_SetFooter 2525 +#define wxGLCanvas_new_2 2527 +#define wxGLCanvas_new_3_1 2528 +#define wxGLCanvas_new_3_0 2529 +#define wxGLCanvas_GetContext 2530 +#define wxGLCanvas_SetCurrent 2532 +#define wxGLCanvas_SwapBuffers 2533 +#define wxGLCanvas_destroy 2534 +#define wxAuiManager_new 2535 +#define wxAuiManager_destruct 2536 +#define wxAuiManager_AddPane_2_1 2537 +#define wxAuiManager_AddPane_3 2538 +#define wxAuiManager_AddPane_2_0 2539 +#define wxAuiManager_DetachPane 2540 +#define wxAuiManager_GetAllPanes 2541 +#define wxAuiManager_GetArtProvider 2542 +#define wxAuiManager_GetDockSizeConstraint 2543 +#define wxAuiManager_GetFlags 2544 +#define wxAuiManager_GetManagedWindow 2545 +#define wxAuiManager_GetManager 2546 +#define wxAuiManager_GetPane_1_1 2547 +#define wxAuiManager_GetPane_1_0 2548 +#define wxAuiManager_HideHint 2549 +#define wxAuiManager_InsertPane 2550 +#define wxAuiManager_LoadPaneInfo 2551 +#define wxAuiManager_LoadPerspective 2552 +#define wxAuiManager_SavePaneInfo 2553 +#define wxAuiManager_SavePerspective 2554 +#define wxAuiManager_SetArtProvider 2555 +#define wxAuiManager_SetDockSizeConstraint 2556 +#define wxAuiManager_SetFlags 2557 +#define wxAuiManager_SetManagedWindow 2558 +#define wxAuiManager_ShowHint 2559 +#define wxAuiManager_UnInit 2560 +#define wxAuiManager_Update 2561 +#define wxAuiPaneInfo_new_0 2562 +#define wxAuiPaneInfo_new_1 2563 +#define wxAuiPaneInfo_destruct 2564 +#define wxAuiPaneInfo_BestSize_1 2565 +#define wxAuiPaneInfo_BestSize_2 2566 +#define wxAuiPaneInfo_Bottom 2567 +#define wxAuiPaneInfo_BottomDockable 2568 +#define wxAuiPaneInfo_Caption 2569 +#define wxAuiPaneInfo_CaptionVisible 2570 +#define wxAuiPaneInfo_Centre 2571 +#define wxAuiPaneInfo_CentrePane 2572 +#define wxAuiPaneInfo_CloseButton 2573 +#define wxAuiPaneInfo_DefaultPane 2574 +#define wxAuiPaneInfo_DestroyOnClose 2575 +#define wxAuiPaneInfo_Direction 2576 +#define wxAuiPaneInfo_Dock 2577 +#define wxAuiPaneInfo_Dockable 2578 +#define wxAuiPaneInfo_Fixed 2579 +#define wxAuiPaneInfo_Float 2580 +#define wxAuiPaneInfo_Floatable 2581 +#define wxAuiPaneInfo_FloatingPosition_1 2582 +#define wxAuiPaneInfo_FloatingPosition_2 2583 +#define wxAuiPaneInfo_FloatingSize_1 2584 +#define wxAuiPaneInfo_FloatingSize_2 2585 +#define wxAuiPaneInfo_Gripper 2586 +#define wxAuiPaneInfo_GripperTop 2587 +#define wxAuiPaneInfo_HasBorder 2588 +#define wxAuiPaneInfo_HasCaption 2589 +#define wxAuiPaneInfo_HasCloseButton 2590 +#define wxAuiPaneInfo_HasFlag 2591 +#define wxAuiPaneInfo_HasGripper 2592 +#define wxAuiPaneInfo_HasGripperTop 2593 +#define wxAuiPaneInfo_HasMaximizeButton 2594 +#define wxAuiPaneInfo_HasMinimizeButton 2595 +#define wxAuiPaneInfo_HasPinButton 2596 +#define wxAuiPaneInfo_Hide 2597 +#define wxAuiPaneInfo_IsBottomDockable 2598 +#define wxAuiPaneInfo_IsDocked 2599 +#define wxAuiPaneInfo_IsFixed 2600 +#define wxAuiPaneInfo_IsFloatable 2601 +#define wxAuiPaneInfo_IsFloating 2602 +#define wxAuiPaneInfo_IsLeftDockable 2603 +#define wxAuiPaneInfo_IsMovable 2604 +#define wxAuiPaneInfo_IsOk 2605 +#define wxAuiPaneInfo_IsResizable 2606 +#define wxAuiPaneInfo_IsRightDockable 2607 +#define wxAuiPaneInfo_IsShown 2608 +#define wxAuiPaneInfo_IsToolbar 2609 +#define wxAuiPaneInfo_IsTopDockable 2610 +#define wxAuiPaneInfo_Layer 2611 +#define wxAuiPaneInfo_Left 2612 +#define wxAuiPaneInfo_LeftDockable 2613 +#define wxAuiPaneInfo_MaxSize_1 2614 +#define wxAuiPaneInfo_MaxSize_2 2615 +#define wxAuiPaneInfo_MaximizeButton 2616 +#define wxAuiPaneInfo_MinSize_1 2617 +#define wxAuiPaneInfo_MinSize_2 2618 +#define wxAuiPaneInfo_MinimizeButton 2619 +#define wxAuiPaneInfo_Movable 2620 +#define wxAuiPaneInfo_Name 2621 +#define wxAuiPaneInfo_PaneBorder 2622 +#define wxAuiPaneInfo_PinButton 2623 +#define wxAuiPaneInfo_Position 2624 +#define wxAuiPaneInfo_Resizable 2625 +#define wxAuiPaneInfo_Right 2626 +#define wxAuiPaneInfo_RightDockable 2627 +#define wxAuiPaneInfo_Row 2628 +#define wxAuiPaneInfo_SafeSet 2629 +#define wxAuiPaneInfo_SetFlag 2630 +#define wxAuiPaneInfo_Show 2631 +#define wxAuiPaneInfo_ToolbarPane 2632 +#define wxAuiPaneInfo_Top 2633 +#define wxAuiPaneInfo_TopDockable 2634 +#define wxAuiPaneInfo_Window 2635 +#define wxAuiNotebook_new_0 2636 +#define wxAuiNotebook_new_2 2637 +#define wxAuiNotebook_AddPage 2638 +#define wxAuiNotebook_Create 2639 +#define wxAuiNotebook_DeletePage 2640 +#define wxAuiNotebook_GetArtProvider 2641 +#define wxAuiNotebook_GetPage 2642 +#define wxAuiNotebook_GetPageBitmap 2643 +#define wxAuiNotebook_GetPageCount 2644 +#define wxAuiNotebook_GetPageIndex 2645 +#define wxAuiNotebook_GetPageText 2646 +#define wxAuiNotebook_GetSelection 2647 +#define wxAuiNotebook_InsertPage 2648 +#define wxAuiNotebook_RemovePage 2649 +#define wxAuiNotebook_SetArtProvider 2650 +#define wxAuiNotebook_SetFont 2651 +#define wxAuiNotebook_SetPageBitmap 2652 +#define wxAuiNotebook_SetPageText 2653 +#define wxAuiNotebook_SetSelection 2654 +#define wxAuiNotebook_SetTabCtrlHeight 2655 +#define wxAuiNotebook_SetUniformBitmapSize 2656 +#define wxAuiNotebook_destroy 2657 +#define wxMDIParentFrame_new_0 2658 +#define wxMDIParentFrame_new_4 2659 +#define wxMDIParentFrame_destruct 2660 +#define wxMDIParentFrame_ActivateNext 2661 +#define wxMDIParentFrame_ActivatePrevious 2662 +#define wxMDIParentFrame_ArrangeIcons 2663 +#define wxMDIParentFrame_Cascade 2664 +#define wxMDIParentFrame_Create 2665 +#define wxMDIParentFrame_GetActiveChild 2666 +#define wxMDIParentFrame_GetClientWindow 2667 +#define wxMDIParentFrame_Tile 2668 +#define wxMDIChildFrame_new_0 2669 +#define wxMDIChildFrame_new_4 2670 +#define wxMDIChildFrame_destruct 2671 +#define wxMDIChildFrame_Activate 2672 +#define wxMDIChildFrame_Create 2673 +#define wxMDIChildFrame_Maximize 2674 +#define wxMDIChildFrame_Restore 2675 +#define wxMDIClientWindow_new_0 2676 +#define wxMDIClientWindow_new_2 2677 +#define wxMDIClientWindow_destruct 2678 +#define wxMDIClientWindow_CreateClient 2679 +#define wxLayoutAlgorithm_new 2680 +#define wxLayoutAlgorithm_LayoutFrame 2681 +#define wxLayoutAlgorithm_LayoutMDIFrame 2682 +#define wxLayoutAlgorithm_LayoutWindow 2683 +#define wxLayoutAlgorithm_destroy 2684 +#define wxEvent_GetId 2685 +#define wxEvent_GetSkipped 2686 +#define wxEvent_GetTimestamp 2687 +#define wxEvent_IsCommandEvent 2688 +#define wxEvent_ResumePropagation 2689 +#define wxEvent_ShouldPropagate 2690 +#define wxEvent_Skip 2691 +#define wxEvent_StopPropagation 2692 +#define wxCommandEvent_getClientData 2693 +#define wxCommandEvent_GetExtraLong 2694 +#define wxCommandEvent_GetInt 2695 +#define wxCommandEvent_GetSelection 2696 +#define wxCommandEvent_GetString 2697 +#define wxCommandEvent_IsChecked 2698 +#define wxCommandEvent_IsSelection 2699 +#define wxCommandEvent_SetInt 2700 +#define wxCommandEvent_SetString 2701 +#define wxScrollEvent_GetOrientation 2702 +#define wxScrollEvent_GetPosition 2703 +#define wxScrollWinEvent_GetOrientation 2704 +#define wxScrollWinEvent_GetPosition 2705 +#define wxMouseEvent_AltDown 2706 +#define wxMouseEvent_Button 2707 +#define wxMouseEvent_ButtonDClick 2708 +#define wxMouseEvent_ButtonDown 2709 +#define wxMouseEvent_ButtonUp 2710 +#define wxMouseEvent_CmdDown 2711 +#define wxMouseEvent_ControlDown 2712 +#define wxMouseEvent_Dragging 2713 +#define wxMouseEvent_Entering 2714 +#define wxMouseEvent_GetButton 2715 +#define wxMouseEvent_GetPosition 2718 +#define wxMouseEvent_GetLogicalPosition 2719 +#define wxMouseEvent_GetLinesPerAction 2720 +#define wxMouseEvent_GetWheelRotation 2721 +#define wxMouseEvent_GetWheelDelta 2722 +#define wxMouseEvent_GetX 2723 +#define wxMouseEvent_GetY 2724 +#define wxMouseEvent_IsButton 2725 +#define wxMouseEvent_IsPageScroll 2726 +#define wxMouseEvent_Leaving 2727 +#define wxMouseEvent_LeftDClick 2728 +#define wxMouseEvent_LeftDown 2729 +#define wxMouseEvent_LeftIsDown 2730 +#define wxMouseEvent_LeftUp 2731 +#define wxMouseEvent_MetaDown 2732 +#define wxMouseEvent_MiddleDClick 2733 +#define wxMouseEvent_MiddleDown 2734 +#define wxMouseEvent_MiddleIsDown 2735 +#define wxMouseEvent_MiddleUp 2736 +#define wxMouseEvent_Moving 2737 +#define wxMouseEvent_RightDClick 2738 +#define wxMouseEvent_RightDown 2739 +#define wxMouseEvent_RightIsDown 2740 +#define wxMouseEvent_RightUp 2741 +#define wxMouseEvent_ShiftDown 2742 +#define wxSetCursorEvent_GetCursor 2743 +#define wxSetCursorEvent_GetX 2744 +#define wxSetCursorEvent_GetY 2745 +#define wxSetCursorEvent_HasCursor 2746 +#define wxSetCursorEvent_SetCursor 2747 +#define wxKeyEvent_AltDown 2748 +#define wxKeyEvent_CmdDown 2749 +#define wxKeyEvent_ControlDown 2750 +#define wxKeyEvent_GetKeyCode 2751 +#define wxKeyEvent_GetModifiers 2752 +#define wxKeyEvent_GetPosition 2755 +#define wxKeyEvent_GetRawKeyCode 2756 +#define wxKeyEvent_GetRawKeyFlags 2757 +#define wxKeyEvent_GetUnicodeKey 2758 +#define wxKeyEvent_GetX 2759 +#define wxKeyEvent_GetY 2760 +#define wxKeyEvent_HasModifiers 2761 +#define wxKeyEvent_MetaDown 2762 +#define wxKeyEvent_ShiftDown 2763 +#define wxSizeEvent_GetSize 2764 +#define wxMoveEvent_GetPosition 2765 +#define wxEraseEvent_GetDC 2766 +#define wxFocusEvent_GetWindow 2767 +#define wxChildFocusEvent_GetWindow 2768 +#define wxMenuEvent_GetMenu 2769 +#define wxMenuEvent_GetMenuId 2770 +#define wxMenuEvent_IsPopup 2771 +#define wxCloseEvent_CanVeto 2772 +#define wxCloseEvent_GetLoggingOff 2773 +#define wxCloseEvent_SetCanVeto 2774 +#define wxCloseEvent_SetLoggingOff 2775 +#define wxCloseEvent_Veto 2776 +#define wxShowEvent_SetShow 2777 +#define wxShowEvent_GetShow 2778 +#define wxIconizeEvent_Iconized 2779 +#define wxJoystickEvent_ButtonDown 2780 +#define wxJoystickEvent_ButtonIsDown 2781 +#define wxJoystickEvent_ButtonUp 2782 +#define wxJoystickEvent_GetButtonChange 2783 +#define wxJoystickEvent_GetButtonState 2784 +#define wxJoystickEvent_GetJoystick 2785 +#define wxJoystickEvent_GetPosition 2786 +#define wxJoystickEvent_GetZPosition 2787 +#define wxJoystickEvent_IsButton 2788 +#define wxJoystickEvent_IsMove 2789 +#define wxJoystickEvent_IsZMove 2790 +#define wxUpdateUIEvent_CanUpdate 2791 +#define wxUpdateUIEvent_Check 2792 +#define wxUpdateUIEvent_Enable 2793 +#define wxUpdateUIEvent_Show 2794 +#define wxUpdateUIEvent_GetChecked 2795 +#define wxUpdateUIEvent_GetEnabled 2796 +#define wxUpdateUIEvent_GetShown 2797 +#define wxUpdateUIEvent_GetSetChecked 2798 +#define wxUpdateUIEvent_GetSetEnabled 2799 +#define wxUpdateUIEvent_GetSetShown 2800 +#define wxUpdateUIEvent_GetSetText 2801 +#define wxUpdateUIEvent_GetText 2802 +#define wxUpdateUIEvent_GetMode 2803 +#define wxUpdateUIEvent_GetUpdateInterval 2804 +#define wxUpdateUIEvent_ResetUpdateTime 2805 +#define wxUpdateUIEvent_SetMode 2806 +#define wxUpdateUIEvent_SetText 2807 +#define wxUpdateUIEvent_SetUpdateInterval 2808 +#define wxMouseCaptureChangedEvent_GetCapturedWindow 2809 +#define wxPaletteChangedEvent_SetChangedWindow 2810 +#define wxPaletteChangedEvent_GetChangedWindow 2811 +#define wxQueryNewPaletteEvent_SetPaletteRealized 2812 +#define wxQueryNewPaletteEvent_GetPaletteRealized 2813 +#define wxNavigationKeyEvent_GetDirection 2814 +#define wxNavigationKeyEvent_SetDirection 2815 +#define wxNavigationKeyEvent_IsWindowChange 2816 +#define wxNavigationKeyEvent_SetWindowChange 2817 +#define wxNavigationKeyEvent_IsFromTab 2818 +#define wxNavigationKeyEvent_SetFromTab 2819 +#define wxNavigationKeyEvent_GetCurrentFocus 2820 +#define wxNavigationKeyEvent_SetCurrentFocus 2821 +#define wxHelpEvent_GetOrigin 2822 +#define wxHelpEvent_GetPosition 2823 +#define wxHelpEvent_SetOrigin 2824 +#define wxHelpEvent_SetPosition 2825 +#define wxContextMenuEvent_GetPosition 2826 +#define wxContextMenuEvent_SetPosition 2827 +#define wxIdleEvent_CanSend 2828 +#define wxIdleEvent_GetMode 2829 +#define wxIdleEvent_RequestMore 2830 +#define wxIdleEvent_MoreRequested 2831 +#define wxIdleEvent_SetMode 2832 +#define wxGridEvent_AltDown 2833 +#define wxGridEvent_ControlDown 2834 +#define wxGridEvent_GetCol 2835 +#define wxGridEvent_GetPosition 2836 +#define wxGridEvent_GetRow 2837 +#define wxGridEvent_MetaDown 2838 +#define wxGridEvent_Selecting 2839 +#define wxGridEvent_ShiftDown 2840 +#define wxNotifyEvent_Allow 2841 +#define wxNotifyEvent_IsAllowed 2842 +#define wxNotifyEvent_Veto 2843 +#define wxSashEvent_GetEdge 2844 +#define wxSashEvent_GetDragRect 2845 +#define wxSashEvent_GetDragStatus 2846 +#define wxListEvent_GetCacheFrom 2847 +#define wxListEvent_GetCacheTo 2848 +#define wxListEvent_GetKeyCode 2849 +#define wxListEvent_GetIndex 2850 +#define wxListEvent_GetColumn 2851 +#define wxListEvent_GetPoint 2852 +#define wxListEvent_GetLabel 2853 +#define wxListEvent_GetText 2854 +#define wxListEvent_GetImage 2855 +#define wxListEvent_GetData 2856 +#define wxListEvent_GetMask 2857 +#define wxListEvent_GetItem 2858 +#define wxListEvent_IsEditCancelled 2859 +#define wxDateEvent_GetDate 2860 +#define wxCalendarEvent_GetWeekDay 2861 +#define wxFileDirPickerEvent_GetPath 2862 +#define wxColourPickerEvent_GetColour 2863 +#define wxFontPickerEvent_GetFont 2864 +#define wxStyledTextEvent_GetPosition 2865 +#define wxStyledTextEvent_GetKey 2866 +#define wxStyledTextEvent_GetModifiers 2867 +#define wxStyledTextEvent_GetModificationType 2868 +#define wxStyledTextEvent_GetText 2869 +#define wxStyledTextEvent_GetLength 2870 +#define wxStyledTextEvent_GetLinesAdded 2871 +#define wxStyledTextEvent_GetLine 2872 +#define wxStyledTextEvent_GetFoldLevelNow 2873 +#define wxStyledTextEvent_GetFoldLevelPrev 2874 +#define wxStyledTextEvent_GetMargin 2875 +#define wxStyledTextEvent_GetMessage 2876 +#define wxStyledTextEvent_GetWParam 2877 +#define wxStyledTextEvent_GetLParam 2878 +#define wxStyledTextEvent_GetListType 2879 +#define wxStyledTextEvent_GetX 2880 +#define wxStyledTextEvent_GetY 2881 +#define wxStyledTextEvent_GetDragText 2882 +#define wxStyledTextEvent_GetDragAllowMove 2883 +#define wxStyledTextEvent_GetDragResult 2884 +#define wxStyledTextEvent_GetShift 2885 +#define wxStyledTextEvent_GetControl 2886 +#define wxStyledTextEvent_GetAlt 2887 +#define utils_wxGetKeyState 2888 +#define utils_wxGetMousePosition 2889 +#define utils_wxGetMouseState 2890 +#define utils_wxSetDetectableAutoRepeat 2891 +#define utils_wxBell 2892 +#define utils_wxFindMenuItemId 2893 +#define utils_wxGenericFindWindowAtPoint 2894 +#define utils_wxFindWindowAtPoint 2895 +#define utils_wxBeginBusyCursor 2896 +#define utils_wxEndBusyCursor 2897 +#define utils_wxIsBusy 2898 +#define utils_wxShutdown 2899 +#define utils_wxShell 2900 +#define utils_wxLaunchDefaultBrowser 2901 +#define utils_wxGetEmailAddress 2902 +#define utils_wxGetUserId 2903 +#define utils_wxGetHomeDir 2904 +#define utils_wxNewId 2905 +#define utils_wxRegisterId 2906 +#define utils_wxGetCurrentId 2907 +#define utils_wxGetOsDescription 2908 +#define utils_wxIsPlatformLittleEndian 2909 +#define utils_wxIsPlatform64Bit 2910 +#define wxPrintout_new 2911 +#define wxPrintout_destruct 2912 +#define wxPrintout_GetDC 2913 +#define wxPrintout_GetPageSizeMM 2914 +#define wxPrintout_GetPageSizePixels 2915 +#define wxPrintout_GetPaperRectPixels 2916 +#define wxPrintout_GetPPIPrinter 2917 +#define wxPrintout_GetPPIScreen 2918 +#define wxPrintout_GetTitle 2919 +#define wxPrintout_IsPreview 2920 +#define wxPrintout_FitThisSizeToPaper 2921 +#define wxPrintout_FitThisSizeToPage 2922 +#define wxPrintout_FitThisSizeToPageMargins 2923 +#define wxPrintout_MapScreenSizeToPaper 2924 +#define wxPrintout_MapScreenSizeToPage 2925 +#define wxPrintout_MapScreenSizeToPageMargins 2926 +#define wxPrintout_MapScreenSizeToDevice 2927 +#define wxPrintout_GetLogicalPaperRect 2928 +#define wxPrintout_GetLogicalPageRect 2929 +#define wxPrintout_GetLogicalPageMarginsRect 2930 +#define wxPrintout_SetLogicalOrigin 2931 +#define wxPrintout_OffsetLogicalOrigin 2932 +#define wxStyledTextCtrl_new_2 2933 +#define wxStyledTextCtrl_new_0 2934 +#define wxStyledTextCtrl_destruct 2935 +#define wxStyledTextCtrl_Create 2936 +#define wxStyledTextCtrl_AddText 2937 +#define wxStyledTextCtrl_AddStyledText 2938 +#define wxStyledTextCtrl_InsertText 2939 +#define wxStyledTextCtrl_ClearAll 2940 +#define wxStyledTextCtrl_ClearDocumentStyle 2941 +#define wxStyledTextCtrl_GetLength 2942 +#define wxStyledTextCtrl_GetCharAt 2943 +#define wxStyledTextCtrl_GetCurrentPos 2944 +#define wxStyledTextCtrl_GetAnchor 2945 +#define wxStyledTextCtrl_GetStyleAt 2946 +#define wxStyledTextCtrl_Redo 2947 +#define wxStyledTextCtrl_SetUndoCollection 2948 +#define wxStyledTextCtrl_SelectAll 2949 +#define wxStyledTextCtrl_SetSavePoint 2950 +#define wxStyledTextCtrl_GetStyledText 2951 +#define wxStyledTextCtrl_CanRedo 2952 +#define wxStyledTextCtrl_MarkerLineFromHandle 2953 +#define wxStyledTextCtrl_MarkerDeleteHandle 2954 +#define wxStyledTextCtrl_GetUndoCollection 2955 +#define wxStyledTextCtrl_GetViewWhiteSpace 2956 +#define wxStyledTextCtrl_SetViewWhiteSpace 2957 +#define wxStyledTextCtrl_PositionFromPoint 2958 +#define wxStyledTextCtrl_PositionFromPointClose 2959 +#define wxStyledTextCtrl_GotoLine 2960 +#define wxStyledTextCtrl_GotoPos 2961 +#define wxStyledTextCtrl_SetAnchor 2962 +#define wxStyledTextCtrl_GetCurLine 2963 +#define wxStyledTextCtrl_GetEndStyled 2964 +#define wxStyledTextCtrl_ConvertEOLs 2965 +#define wxStyledTextCtrl_GetEOLMode 2966 +#define wxStyledTextCtrl_SetEOLMode 2967 +#define wxStyledTextCtrl_StartStyling 2968 +#define wxStyledTextCtrl_SetStyling 2969 +#define wxStyledTextCtrl_GetBufferedDraw 2970 +#define wxStyledTextCtrl_SetBufferedDraw 2971 +#define wxStyledTextCtrl_SetTabWidth 2972 +#define wxStyledTextCtrl_GetTabWidth 2973 +#define wxStyledTextCtrl_SetCodePage 2974 +#define wxStyledTextCtrl_MarkerDefine 2975 +#define wxStyledTextCtrl_MarkerSetForeground 2976 +#define wxStyledTextCtrl_MarkerSetBackground 2977 +#define wxStyledTextCtrl_MarkerAdd 2978 +#define wxStyledTextCtrl_MarkerDelete 2979 +#define wxStyledTextCtrl_MarkerDeleteAll 2980 +#define wxStyledTextCtrl_MarkerGet 2981 +#define wxStyledTextCtrl_MarkerNext 2982 +#define wxStyledTextCtrl_MarkerPrevious 2983 +#define wxStyledTextCtrl_MarkerDefineBitmap 2984 +#define wxStyledTextCtrl_MarkerAddSet 2985 +#define wxStyledTextCtrl_MarkerSetAlpha 2986 +#define wxStyledTextCtrl_SetMarginType 2987 +#define wxStyledTextCtrl_GetMarginType 2988 +#define wxStyledTextCtrl_SetMarginWidth 2989 +#define wxStyledTextCtrl_GetMarginWidth 2990 +#define wxStyledTextCtrl_SetMarginMask 2991 +#define wxStyledTextCtrl_GetMarginMask 2992 +#define wxStyledTextCtrl_SetMarginSensitive 2993 +#define wxStyledTextCtrl_GetMarginSensitive 2994 +#define wxStyledTextCtrl_StyleClearAll 2995 +#define wxStyledTextCtrl_StyleSetForeground 2996 +#define wxStyledTextCtrl_StyleSetBackground 2997 +#define wxStyledTextCtrl_StyleSetBold 2998 +#define wxStyledTextCtrl_StyleSetItalic 2999 +#define wxStyledTextCtrl_StyleSetSize 3000 +#define wxStyledTextCtrl_StyleSetFaceName 3001 +#define wxStyledTextCtrl_StyleSetEOLFilled 3002 +#define wxStyledTextCtrl_StyleResetDefault 3003 +#define wxStyledTextCtrl_StyleSetUnderline 3004 +#define wxStyledTextCtrl_StyleSetCase 3005 +#define wxStyledTextCtrl_StyleSetHotSpot 3006 +#define wxStyledTextCtrl_SetSelForeground 3007 +#define wxStyledTextCtrl_SetSelBackground 3008 +#define wxStyledTextCtrl_GetSelAlpha 3009 +#define wxStyledTextCtrl_SetSelAlpha 3010 +#define wxStyledTextCtrl_SetCaretForeground 3011 +#define wxStyledTextCtrl_CmdKeyAssign 3012 +#define wxStyledTextCtrl_CmdKeyClear 3013 +#define wxStyledTextCtrl_CmdKeyClearAll 3014 +#define wxStyledTextCtrl_SetStyleBytes 3015 +#define wxStyledTextCtrl_StyleSetVisible 3016 +#define wxStyledTextCtrl_GetCaretPeriod 3017 +#define wxStyledTextCtrl_SetCaretPeriod 3018 +#define wxStyledTextCtrl_SetWordChars 3019 +#define wxStyledTextCtrl_BeginUndoAction 3020 +#define wxStyledTextCtrl_EndUndoAction 3021 +#define wxStyledTextCtrl_IndicatorSetStyle 3022 +#define wxStyledTextCtrl_IndicatorGetStyle 3023 +#define wxStyledTextCtrl_IndicatorSetForeground 3024 +#define wxStyledTextCtrl_IndicatorGetForeground 3025 +#define wxStyledTextCtrl_SetWhitespaceForeground 3026 +#define wxStyledTextCtrl_SetWhitespaceBackground 3027 +#define wxStyledTextCtrl_GetStyleBits 3028 +#define wxStyledTextCtrl_SetLineState 3029 +#define wxStyledTextCtrl_GetLineState 3030 +#define wxStyledTextCtrl_GetMaxLineState 3031 +#define wxStyledTextCtrl_GetCaretLineVisible 3032 +#define wxStyledTextCtrl_SetCaretLineVisible 3033 +#define wxStyledTextCtrl_GetCaretLineBackground 3034 +#define wxStyledTextCtrl_SetCaretLineBackground 3035 +#define wxStyledTextCtrl_AutoCompShow 3036 +#define wxStyledTextCtrl_AutoCompCancel 3037 +#define wxStyledTextCtrl_AutoCompActive 3038 +#define wxStyledTextCtrl_AutoCompPosStart 3039 +#define wxStyledTextCtrl_AutoCompComplete 3040 +#define wxStyledTextCtrl_AutoCompStops 3041 +#define wxStyledTextCtrl_AutoCompSetSeparator 3042 +#define wxStyledTextCtrl_AutoCompGetSeparator 3043 +#define wxStyledTextCtrl_AutoCompSelect 3044 +#define wxStyledTextCtrl_AutoCompSetCancelAtStart 3045 +#define wxStyledTextCtrl_AutoCompGetCancelAtStart 3046 +#define wxStyledTextCtrl_AutoCompSetFillUps 3047 +#define wxStyledTextCtrl_AutoCompSetChooseSingle 3048 +#define wxStyledTextCtrl_AutoCompGetChooseSingle 3049 +#define wxStyledTextCtrl_AutoCompSetIgnoreCase 3050 +#define wxStyledTextCtrl_AutoCompGetIgnoreCase 3051 +#define wxStyledTextCtrl_UserListShow 3052 +#define wxStyledTextCtrl_AutoCompSetAutoHide 3053 +#define wxStyledTextCtrl_AutoCompGetAutoHide 3054 +#define wxStyledTextCtrl_AutoCompSetDropRestOfWord 3055 +#define wxStyledTextCtrl_AutoCompGetDropRestOfWord 3056 +#define wxStyledTextCtrl_RegisterImage 3057 +#define wxStyledTextCtrl_ClearRegisteredImages 3058 +#define wxStyledTextCtrl_AutoCompGetTypeSeparator 3059 +#define wxStyledTextCtrl_AutoCompSetTypeSeparator 3060 +#define wxStyledTextCtrl_AutoCompSetMaxWidth 3061 +#define wxStyledTextCtrl_AutoCompGetMaxWidth 3062 +#define wxStyledTextCtrl_AutoCompSetMaxHeight 3063 +#define wxStyledTextCtrl_AutoCompGetMaxHeight 3064 +#define wxStyledTextCtrl_SetIndent 3065 +#define wxStyledTextCtrl_GetIndent 3066 +#define wxStyledTextCtrl_SetUseTabs 3067 +#define wxStyledTextCtrl_GetUseTabs 3068 +#define wxStyledTextCtrl_SetLineIndentation 3069 +#define wxStyledTextCtrl_GetLineIndentation 3070 +#define wxStyledTextCtrl_GetLineIndentPosition 3071 +#define wxStyledTextCtrl_GetColumn 3072 +#define wxStyledTextCtrl_SetUseHorizontalScrollBar 3073 +#define wxStyledTextCtrl_GetUseHorizontalScrollBar 3074 +#define wxStyledTextCtrl_SetIndentationGuides 3075 +#define wxStyledTextCtrl_GetIndentationGuides 3076 +#define wxStyledTextCtrl_SetHighlightGuide 3077 +#define wxStyledTextCtrl_GetHighlightGuide 3078 +#define wxStyledTextCtrl_GetLineEndPosition 3079 +#define wxStyledTextCtrl_GetCodePage 3080 +#define wxStyledTextCtrl_GetCaretForeground 3081 +#define wxStyledTextCtrl_GetReadOnly 3082 +#define wxStyledTextCtrl_SetCurrentPos 3083 +#define wxStyledTextCtrl_SetSelectionStart 3084 +#define wxStyledTextCtrl_GetSelectionStart 3085 +#define wxStyledTextCtrl_SetSelectionEnd 3086 +#define wxStyledTextCtrl_GetSelectionEnd 3087 +#define wxStyledTextCtrl_SetPrintMagnification 3088 +#define wxStyledTextCtrl_GetPrintMagnification 3089 +#define wxStyledTextCtrl_SetPrintColourMode 3090 +#define wxStyledTextCtrl_GetPrintColourMode 3091 +#define wxStyledTextCtrl_FindText 3092 +#define wxStyledTextCtrl_FormatRange 3093 +#define wxStyledTextCtrl_GetFirstVisibleLine 3094 +#define wxStyledTextCtrl_GetLine 3095 +#define wxStyledTextCtrl_GetLineCount 3096 +#define wxStyledTextCtrl_SetMarginLeft 3097 +#define wxStyledTextCtrl_GetMarginLeft 3098 +#define wxStyledTextCtrl_SetMarginRight 3099 +#define wxStyledTextCtrl_GetMarginRight 3100 +#define wxStyledTextCtrl_GetModify 3101 +#define wxStyledTextCtrl_SetSelection 3102 +#define wxStyledTextCtrl_GetSelectedText 3103 +#define wxStyledTextCtrl_GetTextRange 3104 +#define wxStyledTextCtrl_HideSelection 3105 +#define wxStyledTextCtrl_LineFromPosition 3106 +#define wxStyledTextCtrl_PositionFromLine 3107 +#define wxStyledTextCtrl_LineScroll 3108 +#define wxStyledTextCtrl_EnsureCaretVisible 3109 +#define wxStyledTextCtrl_ReplaceSelection 3110 +#define wxStyledTextCtrl_SetReadOnly 3111 +#define wxStyledTextCtrl_CanPaste 3112 +#define wxStyledTextCtrl_CanUndo 3113 +#define wxStyledTextCtrl_EmptyUndoBuffer 3114 +#define wxStyledTextCtrl_Undo 3115 +#define wxStyledTextCtrl_Cut 3116 +#define wxStyledTextCtrl_Copy 3117 +#define wxStyledTextCtrl_Paste 3118 +#define wxStyledTextCtrl_Clear 3119 +#define wxStyledTextCtrl_SetText 3120 +#define wxStyledTextCtrl_GetText 3121 +#define wxStyledTextCtrl_GetTextLength 3122 +#define wxStyledTextCtrl_GetOvertype 3123 +#define wxStyledTextCtrl_SetCaretWidth 3124 +#define wxStyledTextCtrl_GetCaretWidth 3125 +#define wxStyledTextCtrl_SetTargetStart 3126 +#define wxStyledTextCtrl_GetTargetStart 3127 +#define wxStyledTextCtrl_SetTargetEnd 3128 +#define wxStyledTextCtrl_GetTargetEnd 3129 +#define wxStyledTextCtrl_ReplaceTarget 3130 +#define wxStyledTextCtrl_SearchInTarget 3131 +#define wxStyledTextCtrl_SetSearchFlags 3132 +#define wxStyledTextCtrl_GetSearchFlags 3133 +#define wxStyledTextCtrl_CallTipShow 3134 +#define wxStyledTextCtrl_CallTipCancel 3135 +#define wxStyledTextCtrl_CallTipActive 3136 +#define wxStyledTextCtrl_CallTipPosAtStart 3137 +#define wxStyledTextCtrl_CallTipSetHighlight 3138 +#define wxStyledTextCtrl_CallTipSetBackground 3139 +#define wxStyledTextCtrl_CallTipSetForeground 3140 +#define wxStyledTextCtrl_CallTipSetForegroundHighlight 3141 +#define wxStyledTextCtrl_CallTipUseStyle 3142 +#define wxStyledTextCtrl_VisibleFromDocLine 3143 +#define wxStyledTextCtrl_DocLineFromVisible 3144 +#define wxStyledTextCtrl_WrapCount 3145 +#define wxStyledTextCtrl_SetFoldLevel 3146 +#define wxStyledTextCtrl_GetFoldLevel 3147 +#define wxStyledTextCtrl_GetLastChild 3148 +#define wxStyledTextCtrl_GetFoldParent 3149 +#define wxStyledTextCtrl_ShowLines 3150 +#define wxStyledTextCtrl_HideLines 3151 +#define wxStyledTextCtrl_GetLineVisible 3152 +#define wxStyledTextCtrl_SetFoldExpanded 3153 +#define wxStyledTextCtrl_GetFoldExpanded 3154 +#define wxStyledTextCtrl_ToggleFold 3155 +#define wxStyledTextCtrl_EnsureVisible 3156 +#define wxStyledTextCtrl_SetFoldFlags 3157 +#define wxStyledTextCtrl_EnsureVisibleEnforcePolicy 3158 +#define wxStyledTextCtrl_SetTabIndents 3159 +#define wxStyledTextCtrl_GetTabIndents 3160 +#define wxStyledTextCtrl_SetBackSpaceUnIndents 3161 +#define wxStyledTextCtrl_GetBackSpaceUnIndents 3162 +#define wxStyledTextCtrl_SetMouseDwellTime 3163 +#define wxStyledTextCtrl_GetMouseDwellTime 3164 +#define wxStyledTextCtrl_WordStartPosition 3165 +#define wxStyledTextCtrl_WordEndPosition 3166 +#define wxStyledTextCtrl_SetWrapMode 3167 +#define wxStyledTextCtrl_GetWrapMode 3168 +#define wxStyledTextCtrl_SetWrapVisualFlags 3169 +#define wxStyledTextCtrl_GetWrapVisualFlags 3170 +#define wxStyledTextCtrl_SetWrapVisualFlagsLocation 3171 +#define wxStyledTextCtrl_GetWrapVisualFlagsLocation 3172 +#define wxStyledTextCtrl_SetWrapStartIndent 3173 +#define wxStyledTextCtrl_GetWrapStartIndent 3174 +#define wxStyledTextCtrl_SetLayoutCache 3175 +#define wxStyledTextCtrl_GetLayoutCache 3176 +#define wxStyledTextCtrl_SetScrollWidth 3177 +#define wxStyledTextCtrl_GetScrollWidth 3178 +#define wxStyledTextCtrl_TextWidth 3179 +#define wxStyledTextCtrl_GetEndAtLastLine 3180 +#define wxStyledTextCtrl_TextHeight 3181 +#define wxStyledTextCtrl_SetUseVerticalScrollBar 3182 +#define wxStyledTextCtrl_GetUseVerticalScrollBar 3183 +#define wxStyledTextCtrl_AppendText 3184 +#define wxStyledTextCtrl_GetTwoPhaseDraw 3185 +#define wxStyledTextCtrl_SetTwoPhaseDraw 3186 +#define wxStyledTextCtrl_TargetFromSelection 3187 +#define wxStyledTextCtrl_LinesJoin 3188 +#define wxStyledTextCtrl_LinesSplit 3189 +#define wxStyledTextCtrl_SetFoldMarginColour 3190 +#define wxStyledTextCtrl_SetFoldMarginHiColour 3191 +#define wxStyledTextCtrl_LineDown 3192 +#define wxStyledTextCtrl_LineDownExtend 3193 +#define wxStyledTextCtrl_LineUp 3194 +#define wxStyledTextCtrl_LineUpExtend 3195 +#define wxStyledTextCtrl_CharLeft 3196 +#define wxStyledTextCtrl_CharLeftExtend 3197 +#define wxStyledTextCtrl_CharRight 3198 +#define wxStyledTextCtrl_CharRightExtend 3199 +#define wxStyledTextCtrl_WordLeft 3200 +#define wxStyledTextCtrl_WordLeftExtend 3201 +#define wxStyledTextCtrl_WordRight 3202 +#define wxStyledTextCtrl_WordRightExtend 3203 +#define wxStyledTextCtrl_Home 3204 +#define wxStyledTextCtrl_HomeExtend 3205 +#define wxStyledTextCtrl_LineEnd 3206 +#define wxStyledTextCtrl_LineEndExtend 3207 +#define wxStyledTextCtrl_DocumentStart 3208 +#define wxStyledTextCtrl_DocumentStartExtend 3209 +#define wxStyledTextCtrl_DocumentEnd 3210 +#define wxStyledTextCtrl_DocumentEndExtend 3211 +#define wxStyledTextCtrl_PageUp 3212 +#define wxStyledTextCtrl_PageUpExtend 3213 +#define wxStyledTextCtrl_PageDown 3214 +#define wxStyledTextCtrl_PageDownExtend 3215 +#define wxStyledTextCtrl_EditToggleOvertype 3216 +#define wxStyledTextCtrl_Cancel 3217 +#define wxStyledTextCtrl_DeleteBack 3218 +#define wxStyledTextCtrl_Tab 3219 +#define wxStyledTextCtrl_BackTab 3220 +#define wxStyledTextCtrl_NewLine 3221 +#define wxStyledTextCtrl_FormFeed 3222 +#define wxStyledTextCtrl_VCHome 3223 +#define wxStyledTextCtrl_VCHomeExtend 3224 +#define wxStyledTextCtrl_ZoomIn 3225 +#define wxStyledTextCtrl_ZoomOut 3226 +#define wxStyledTextCtrl_DelWordLeft 3227 +#define wxStyledTextCtrl_DelWordRight 3228 +#define wxStyledTextCtrl_LineCut 3229 +#define wxStyledTextCtrl_LineDelete 3230 +#define wxStyledTextCtrl_LineTranspose 3231 +#define wxStyledTextCtrl_LineDuplicate 3232 +#define wxStyledTextCtrl_LowerCase 3233 +#define wxStyledTextCtrl_UpperCase 3234 +#define wxStyledTextCtrl_LineScrollDown 3235 +#define wxStyledTextCtrl_LineScrollUp 3236 +#define wxStyledTextCtrl_DeleteBackNotLine 3237 +#define wxStyledTextCtrl_HomeDisplay 3238 +#define wxStyledTextCtrl_HomeDisplayExtend 3239 +#define wxStyledTextCtrl_LineEndDisplay 3240 +#define wxStyledTextCtrl_LineEndDisplayExtend 3241 +#define wxStyledTextCtrl_HomeWrapExtend 3242 +#define wxStyledTextCtrl_LineEndWrap 3243 +#define wxStyledTextCtrl_LineEndWrapExtend 3244 +#define wxStyledTextCtrl_VCHomeWrap 3245 +#define wxStyledTextCtrl_VCHomeWrapExtend 3246 +#define wxStyledTextCtrl_LineCopy 3247 +#define wxStyledTextCtrl_MoveCaretInsideView 3248 +#define wxStyledTextCtrl_LineLength 3249 +#define wxStyledTextCtrl_BraceHighlight 3250 +#define wxStyledTextCtrl_BraceBadLight 3251 +#define wxStyledTextCtrl_BraceMatch 3252 +#define wxStyledTextCtrl_GetViewEOL 3253 +#define wxStyledTextCtrl_SetViewEOL 3254 +#define wxStyledTextCtrl_SetModEventMask 3255 +#define wxStyledTextCtrl_GetEdgeColumn 3256 +#define wxStyledTextCtrl_SetEdgeColumn 3257 +#define wxStyledTextCtrl_GetEdgeMode 3258 +#define wxStyledTextCtrl_GetEdgeColour 3259 +#define wxStyledTextCtrl_SetEdgeColour 3260 +#define wxStyledTextCtrl_SearchAnchor 3261 +#define wxStyledTextCtrl_SearchNext 3262 +#define wxStyledTextCtrl_SearchPrev 3263 +#define wxStyledTextCtrl_LinesOnScreen 3264 +#define wxStyledTextCtrl_UsePopUp 3265 +#define wxStyledTextCtrl_SelectionIsRectangle 3266 +#define wxStyledTextCtrl_SetZoom 3267 +#define wxStyledTextCtrl_GetZoom 3268 +#define wxStyledTextCtrl_GetModEventMask 3269 +#define wxStyledTextCtrl_SetSTCFocus 3270 +#define wxStyledTextCtrl_GetSTCFocus 3271 +#define wxStyledTextCtrl_SetStatus 3272 +#define wxStyledTextCtrl_GetStatus 3273 +#define wxStyledTextCtrl_SetMouseDownCaptures 3274 +#define wxStyledTextCtrl_GetMouseDownCaptures 3275 +#define wxStyledTextCtrl_SetSTCCursor 3276 +#define wxStyledTextCtrl_GetSTCCursor 3277 +#define wxStyledTextCtrl_SetControlCharSymbol 3278 +#define wxStyledTextCtrl_GetControlCharSymbol 3279 +#define wxStyledTextCtrl_WordPartLeft 3280 +#define wxStyledTextCtrl_WordPartLeftExtend 3281 +#define wxStyledTextCtrl_WordPartRight 3282 +#define wxStyledTextCtrl_WordPartRightExtend 3283 +#define wxStyledTextCtrl_SetVisiblePolicy 3284 +#define wxStyledTextCtrl_DelLineLeft 3285 +#define wxStyledTextCtrl_DelLineRight 3286 +#define wxStyledTextCtrl_GetXOffset 3287 +#define wxStyledTextCtrl_ChooseCaretX 3288 +#define wxStyledTextCtrl_SetXCaretPolicy 3289 +#define wxStyledTextCtrl_SetYCaretPolicy 3290 +#define wxStyledTextCtrl_GetPrintWrapMode 3291 +#define wxStyledTextCtrl_SetHotspotActiveForeground 3292 +#define wxStyledTextCtrl_SetHotspotActiveBackground 3293 +#define wxStyledTextCtrl_SetHotspotActiveUnderline 3294 +#define wxStyledTextCtrl_SetHotspotSingleLine 3295 +#define wxStyledTextCtrl_ParaDownExtend 3296 +#define wxStyledTextCtrl_ParaUp 3297 +#define wxStyledTextCtrl_ParaUpExtend 3298 +#define wxStyledTextCtrl_PositionBefore 3299 +#define wxStyledTextCtrl_PositionAfter 3300 +#define wxStyledTextCtrl_CopyRange 3301 +#define wxStyledTextCtrl_CopyText 3302 +#define wxStyledTextCtrl_SetSelectionMode 3303 +#define wxStyledTextCtrl_GetSelectionMode 3304 +#define wxStyledTextCtrl_LineDownRectExtend 3305 +#define wxStyledTextCtrl_LineUpRectExtend 3306 +#define wxStyledTextCtrl_CharLeftRectExtend 3307 +#define wxStyledTextCtrl_CharRightRectExtend 3308 +#define wxStyledTextCtrl_HomeRectExtend 3309 +#define wxStyledTextCtrl_VCHomeRectExtend 3310 +#define wxStyledTextCtrl_LineEndRectExtend 3311 +#define wxStyledTextCtrl_PageUpRectExtend 3312 +#define wxStyledTextCtrl_PageDownRectExtend 3313 +#define wxStyledTextCtrl_StutteredPageUp 3314 +#define wxStyledTextCtrl_StutteredPageUpExtend 3315 +#define wxStyledTextCtrl_StutteredPageDown 3316 +#define wxStyledTextCtrl_StutteredPageDownExtend 3317 +#define wxStyledTextCtrl_WordLeftEnd 3318 +#define wxStyledTextCtrl_WordLeftEndExtend 3319 +#define wxStyledTextCtrl_WordRightEnd 3320 +#define wxStyledTextCtrl_WordRightEndExtend 3321 +#define wxStyledTextCtrl_SetWhitespaceChars 3322 +#define wxStyledTextCtrl_SetCharsDefault 3323 +#define wxStyledTextCtrl_AutoCompGetCurrent 3324 +#define wxStyledTextCtrl_Allocate 3325 +#define wxStyledTextCtrl_FindColumn 3326 +#define wxStyledTextCtrl_GetCaretSticky 3327 +#define wxStyledTextCtrl_SetCaretSticky 3328 +#define wxStyledTextCtrl_ToggleCaretSticky 3329 +#define wxStyledTextCtrl_SetPasteConvertEndings 3330 +#define wxStyledTextCtrl_GetPasteConvertEndings 3331 +#define wxStyledTextCtrl_SelectionDuplicate 3332 +#define wxStyledTextCtrl_SetCaretLineBackAlpha 3333 +#define wxStyledTextCtrl_GetCaretLineBackAlpha 3334 +#define wxStyledTextCtrl_StartRecord 3335 +#define wxStyledTextCtrl_StopRecord 3336 +#define wxStyledTextCtrl_SetLexer 3337 +#define wxStyledTextCtrl_GetLexer 3338 +#define wxStyledTextCtrl_Colourise 3339 +#define wxStyledTextCtrl_SetProperty 3340 +#define wxStyledTextCtrl_SetKeyWords 3341 +#define wxStyledTextCtrl_SetLexerLanguage 3342 +#define wxStyledTextCtrl_GetProperty 3343 +#define wxStyledTextCtrl_GetStyleBitsNeeded 3344 +#define wxStyledTextCtrl_GetCurrentLine 3345 +#define wxStyledTextCtrl_StyleSetSpec 3346 +#define wxStyledTextCtrl_StyleSetFont 3347 +#define wxStyledTextCtrl_StyleSetFontAttr 3348 +#define wxStyledTextCtrl_StyleSetCharacterSet 3349 +#define wxStyledTextCtrl_StyleSetFontEncoding 3350 +#define wxStyledTextCtrl_CmdKeyExecute 3351 +#define wxStyledTextCtrl_SetMargins 3352 +#define wxStyledTextCtrl_GetSelection 3353 +#define wxStyledTextCtrl_PointFromPosition 3354 +#define wxStyledTextCtrl_ScrollToLine 3355 +#define wxStyledTextCtrl_ScrollToColumn 3356 +#define wxStyledTextCtrl_SendMsg 3357 +#define wxStyledTextCtrl_SetVScrollBar 3358 +#define wxStyledTextCtrl_SetHScrollBar 3359 +#define wxStyledTextCtrl_GetLastKeydownProcessed 3360 +#define wxStyledTextCtrl_SetLastKeydownProcessed 3361 +#define wxStyledTextCtrl_SaveFile 3362 +#define wxStyledTextCtrl_LoadFile 3363 +#define wxStyledTextCtrl_DoDragOver 3364 +#define wxStyledTextCtrl_DoDropText 3365 +#define wxStyledTextCtrl_GetUseAntiAliasing 3366 +#define wxStyledTextCtrl_AddTextRaw 3367 +#define wxStyledTextCtrl_InsertTextRaw 3368 +#define wxStyledTextCtrl_GetCurLineRaw 3369 +#define wxStyledTextCtrl_GetLineRaw 3370 +#define wxStyledTextCtrl_GetSelectedTextRaw 3371 +#define wxStyledTextCtrl_GetTextRangeRaw 3372 +#define wxStyledTextCtrl_SetTextRaw 3373 +#define wxStyledTextCtrl_GetTextRaw 3374 +#define wxStyledTextCtrl_AppendTextRaw 3375 +#define wxArtProvider_GetBitmap 3376 +#define wxArtProvider_GetIcon 3377 +#define wxTreeEvent_GetKeyCode 3378 +#define wxTreeEvent_GetItem 3379 +#define wxTreeEvent_GetKeyEvent 3380 +#define wxTreeEvent_GetLabel 3381 +#define wxTreeEvent_GetOldItem 3382 +#define wxTreeEvent_GetPoint 3383 +#define wxTreeEvent_IsEditCancelled 3384 +#define wxTreeEvent_SetToolTip 3385 +#define wxNotebookEvent_GetOldSelection 3386 +#define wxNotebookEvent_GetSelection 3387 +#define wxNotebookEvent_SetOldSelection 3388 +#define wxNotebookEvent_SetSelection 3389 +#define wxFileDataObject_new 3390 +#define wxFileDataObject_AddFile 3391 +#define wxFileDataObject_GetFilenames 3392 +#define wxFileDataObject_destroy 3393 +#define wxTextDataObject_new 3394 +#define wxTextDataObject_GetTextLength 3395 +#define wxTextDataObject_GetText 3396 +#define wxTextDataObject_SetText 3397 +#define wxTextDataObject_destroy 3398 +#define wxBitmapDataObject_new_1_1 3399 +#define wxBitmapDataObject_new_1_0 3400 +#define wxBitmapDataObject_GetBitmap 3401 +#define wxBitmapDataObject_SetBitmap 3402 +#define wxBitmapDataObject_destroy 3403 +#define wxClipboard_new 3405 +#define wxClipboard_destruct 3406 +#define wxClipboard_AddData 3407 +#define wxClipboard_Clear 3408 +#define wxClipboard_Close 3409 +#define wxClipboard_Flush 3410 +#define wxClipboard_GetData 3411 +#define wxClipboard_IsOpened 3412 +#define wxClipboard_Open 3413 +#define wxClipboard_SetData 3414 +#define wxClipboard_UsePrimarySelection 3416 +#define wxClipboard_IsSupported 3417 +#define wxClipboard_Get 3418 +#define wxSpinEvent_GetPosition 3419 +#define wxSpinEvent_SetPosition 3420 +#define wxSplitterWindow_new_0 3421 +#define wxSplitterWindow_new_2 3422 +#define wxSplitterWindow_destruct 3423 +#define wxSplitterWindow_Create 3424 +#define wxSplitterWindow_GetMinimumPaneSize 3425 +#define wxSplitterWindow_GetSashGravity 3426 +#define wxSplitterWindow_GetSashPosition 3427 +#define wxSplitterWindow_GetSplitMode 3428 +#define wxSplitterWindow_GetWindow1 3429 +#define wxSplitterWindow_GetWindow2 3430 +#define wxSplitterWindow_Initialize 3431 +#define wxSplitterWindow_IsSplit 3432 +#define wxSplitterWindow_ReplaceWindow 3433 +#define wxSplitterWindow_SetSashGravity 3434 +#define wxSplitterWindow_SetSashPosition 3435 +#define wxSplitterWindow_SetSashSize 3436 +#define wxSplitterWindow_SetMinimumPaneSize 3437 +#define wxSplitterWindow_SetSplitMode 3438 +#define wxSplitterWindow_SplitHorizontally 3439 +#define wxSplitterWindow_SplitVertically 3440 +#define wxSplitterWindow_Unsplit 3441 +#define wxSplitterWindow_UpdateSize 3442 +#define wxSplitterEvent_GetSashPosition 3443 +#define wxSplitterEvent_GetX 3444 +#define wxSplitterEvent_GetY 3445 +#define wxSplitterEvent_GetWindowBeingRemoved 3446 +#define wxSplitterEvent_SetSashPosition 3447 +#define wxHtmlWindow_new_0 3448 +#define wxHtmlWindow_new_2 3449 +#define wxHtmlWindow_AppendToPage 3450 +#define wxHtmlWindow_GetOpenedAnchor 3451 +#define wxHtmlWindow_GetOpenedPage 3452 +#define wxHtmlWindow_GetOpenedPageTitle 3453 +#define wxHtmlWindow_GetRelatedFrame 3454 +#define wxHtmlWindow_HistoryBack 3455 +#define wxHtmlWindow_HistoryCanBack 3456 +#define wxHtmlWindow_HistoryCanForward 3457 +#define wxHtmlWindow_HistoryClear 3458 +#define wxHtmlWindow_HistoryForward 3459 +#define wxHtmlWindow_LoadFile 3460 +#define wxHtmlWindow_LoadPage 3461 +#define wxHtmlWindow_SelectAll 3462 +#define wxHtmlWindow_SelectionToText 3463 +#define wxHtmlWindow_SelectLine 3464 +#define wxHtmlWindow_SelectWord 3465 +#define wxHtmlWindow_SetBorders 3466 +#define wxHtmlWindow_SetFonts 3467 +#define wxHtmlWindow_SetPage 3468 +#define wxHtmlWindow_SetRelatedFrame 3469 +#define wxHtmlWindow_SetRelatedStatusBar 3470 +#define wxHtmlWindow_ToText 3471 +#define wxHtmlWindow_destroy 3472 +#define wxHtmlLinkEvent_GetLinkInfo 3473 +#define wxAuiNotebookEvent_SetSelection 3474 +#define wxAuiNotebookEvent_GetSelection 3475 +#define wxAuiNotebookEvent_SetOldSelection 3476 +#define wxAuiNotebookEvent_GetOldSelection 3477 +#define wxAuiNotebookEvent_SetDragSource 3478 +#define wxAuiNotebookEvent_GetDragSource 3479 +#define wxAuiManagerEvent_SetManager 3480 +#define wxAuiManagerEvent_GetManager 3481 +#define wxAuiManagerEvent_SetPane 3482 +#define wxAuiManagerEvent_GetPane 3483 +#define wxAuiManagerEvent_SetButton 3484 +#define wxAuiManagerEvent_GetButton 3485 +#define wxAuiManagerEvent_SetDC 3486 +#define wxAuiManagerEvent_GetDC 3487 +#define wxAuiManagerEvent_Veto 3488 +#define wxAuiManagerEvent_GetVeto 3489 +#define wxAuiManagerEvent_SetCanVeto 3490 +#define wxAuiManagerEvent_CanVeto 3491 +#define wxLogNull_new 3492 +#define wxLogNull_destroy 3493 diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/Makefile.in erlang-13.b.3-dfsg/lib/wx/c_src/Makefile.in --- erlang-13.b.1-dfsg/lib/wx/c_src/Makefile.in 2009-04-16 10:25:15.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/Makefile.in 2009-09-18 15:10:58.000000000 +0100 @@ -20,6 +20,12 @@ include ../vsn.mk include ../config.mk +# Darwin os have debug default install of wxWidgets +FORCED_DEBUG = @FORCED_DEBUG_BUILD@ +ifeq ($(FORCED_DEBUG),debug) +override TYPE=debug +endif + ifneq ($(TYPE),debug) override TYPE=opt endif @@ -162,6 +168,8 @@ include $(ERL_TOP)/make/otp_release_targets.mk release_spec: opt $(INSTALL_DIR) $(RELSYSDIR)/priv/$(SYS_TYPE) + $(INSTALL_DATA) ../priv/erlang-logo32.png $(RELSYSDIR)/priv/ + $(INSTALL_DATA) ../priv/erlang-logo64.png $(RELSYSDIR)/priv/ $(INSTALL_DATA) $(TARGET_DIR)/$(TARGET_API)$(SO_EXT) $(RELSYSDIR)/priv/$(SYS_TYPE) release_docs_spec: diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/wxe_driver.c erlang-13.b.3-dfsg/lib/wx/c_src/wxe_driver.c --- erlang-13.b.1-dfsg/lib/wx/c_src/wxe_driver.c 2009-06-05 13:54:31.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/wxe_driver.c 2009-11-20 13:34:38.000000000 +0000 @@ -50,6 +50,7 @@ int wxe_debug; wxe_data * wxe_master; +char * erl_wx_privdir; /* ** The driver struct @@ -100,9 +101,10 @@ wxe_driver_start(ErlDrvPort port, char *buff) { wxe_data *data; + data = (wxe_data *) malloc(sizeof(wxe_data)); wxe_debug = 0; - + if (data == NULL) { fprintf(stderr, " Couldn't alloc mem\r\n"); return(ERL_DRV_ERROR_GENERAL); /* ENOMEM */ @@ -112,6 +114,11 @@ data->bin = NULL; data->port = port; if(WXE_DRV_PORT == 0) { + for(; *buff != 32; buff++); + buff++; + erl_wx_privdir = malloc(strlen(buff)); + strcpy(erl_wx_privdir, buff); + WXE_DRV_PORT = port; wxe_master = data; if(!(start_native_gui(data) == 1)) @@ -151,7 +158,6 @@ { wxe_data *sd = ((wxe_data *)handle); push_command(op,buf,count,sd); - (*res) = NULL; return 0; } diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/wxe_driver.h erlang-13.b.3-dfsg/lib/wx/c_src/wxe_driver.h --- erlang-13.b.1-dfsg/lib/wx/c_src/wxe_driver.h 2009-04-16 10:25:15.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/wxe_driver.h 2009-09-18 15:10:58.000000000 +0100 @@ -69,6 +69,8 @@ extern ErlDrvPort WXE_DRV_PORT; extern int wxe_debug; +extern char * erl_wx_privdir; + #define WXE_BATCH_BEGIN 0 #define WXE_BATCH_END 1 #define WXE_CREATE_PORT 2 @@ -79,6 +81,10 @@ #define WXE_REGISTER_OBJECT 7 #define WXE_CB_START 8 #define WXE_DEBUG_DRIVER 9 +#define WXE_DEBUG_PING 10 +#define WXE_BIN_INCR 5001 +#define WXE_BIN_DECR 5002 + #define OPENGL_START 5000 #endif diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/wxe_impl.cpp erlang-13.b.3-dfsg/lib/wx/c_src/wxe_impl.cpp --- erlang-13.b.1-dfsg/lib/wx/c_src/wxe_impl.cpp 2009-06-05 13:54:31.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/wxe_impl.cpp 2009-11-20 13:34:37.000000000 +0000 @@ -158,10 +158,20 @@ void meta_command(int what, wxe_data *sd) { if(what == PING_PORT) { - wxWakeUpIdle(); + erl_drv_mutex_lock(wxe_batch_locker_m); + if(wxe_batch_caller > 0) { + wxeCommand *Cmd = new wxeCommand(WXE_DEBUG_PING, NULL, 0, sd); + wxe_batch->Append(Cmd); + erl_drv_cond_signal(wxe_batch_locker_c); + } else { + wxWakeUpIdle(); + } + erl_drv_mutex_unlock(wxe_batch_locker_m); } else { - wxeMetaCommand Cmd(sd, what); - wxTheApp->AddPendingEvent(Cmd); + if(sd) { + wxeMetaCommand Cmd(sd, what); + wxTheApp->AddPendingEvent(Cmd); + } } } @@ -221,15 +231,12 @@ // Init wx-widgets thread bool WxeApp::OnInit() { - /* Create a dummy window so wxWidgets don't automagicly quits the main loop - after the last window */ + wxe_ps_init(); + global_me = new wxeMemEnv(); wxe_batch = new wxList; wxe_batch_cb_saved = new wxList; - create_dummy_window(); - wxe_ps_init(); - wxIdleEvent::SetMode(wxIDLE_PROCESS_SPECIFIED); this->Connect(wxID_ANY, wxEVT_IDLE, @@ -245,6 +252,11 @@ // sizeof(void *), sizeof(long), sizeof(long long), sizeof(wxInt64)); initEventTable(); wxInitAllImageHandlers(); + + /* Create a dummy window so wxWidgets don't automagicly quits the main loop + after the last window */ + create_dummy_window(); + init_nonconsts(global_me, init_caller); erl_drv_mutex_lock(wxe_status_m); wxe_status = WXE_INITIATED; @@ -259,10 +271,10 @@ ExitMainLoop(); } -void send_msg(char * type, wxString * msg) { +void send_msg(const char * type, wxString * msg) { wxeReturn rt = wxeReturn(WXE_DRV_PORT, init_caller); - rt.addAtom((char*)"wxe_driver"); - rt.addAtom(type); + rt.addAtom((char *) "wxe_driver"); + rt.addAtom((char *) type); rt.add(msg); rt.addTupleCount(3); rt.send(); @@ -321,6 +333,7 @@ // afterwards int WxeApp::dispatch(wxList * batch, int blevel, int list_type) { + int ping = 0; // erl_drv_mutex_lock(wxe_batch_locker_m); must be locked already while(true) { @@ -338,6 +351,13 @@ case WXE_BATCH_BEGIN: {blevel++; } break; + case WXE_DEBUG_PING: + // When in debugger we don't want to hang waiting for a BATCH_END + // that never comes, because a breakpoint have hit. + ping++; + if(ping > 2) + blevel = 0; + break; case WXE_CB_RETURN: // erl_drv_mutex_unlock(wxe_batch_locker_m); should be called after // whatever cleaning is necessary @@ -364,6 +384,7 @@ } // sleep until something happens //fprintf(stderr, "%s:%d sleep %d %d %d %d \r\n", __FILE__, __LINE__, batch->size(), callback_returned, blevel, is_callback);fflush(stderr); + wxe_batch_caller++; while(batch->size() == 0) { erl_drv_cond_wait(wxe_batch_locker_c, wxe_batch_locker_m); } @@ -389,6 +410,7 @@ switch(event->op) { case WXE_BATCH_END: case WXE_BATCH_BEGIN: + case WXE_DEBUG_PING: break; case WXE_CB_RETURN: memcpy(cb_buff, event->buffer, event->len); @@ -523,8 +545,17 @@ if((refd->type == 1) && ((wxObject *)ptr)->IsKindOf(CLASSINFO(wxBufferedDC))) { ((wxBufferedDC *)ptr)->m_dc = NULL; // Workaround } - delete_object(ptr, refd); - if(type > 3) { // Non overridden allocs + wxString msg; + if((refd->type == 0)) { // Maybe also class 1 + wxClassInfo *cinfo = ((wxObject *)ptr)->GetClassInfo(); + msg.Printf(wxT("Memory leak: {wx_ref, %d, %s}"), + refd->ref, cinfo->GetClassName()); + send_msg("error", &msg); + } else { + delete_object(ptr, refd); + } + if(type == 0 || type > 3) { + // Delete refs for leaks and non overridden allocs delete refd; ptr2ref.erase(it); } // overridden allocs deletes meta-data in clearPtr @@ -623,14 +654,14 @@ send_msg("debug", &msg); } - if(refd->pid) { + if(refd->pid != -1) { // Send terminate pid to owner wxeReturn rt = wxeReturn(WXE_DRV_PORT,refd->memenv->owner, false); rt.addAtom("_wxe_destroy_"); - rt.addExt2Term(refd->pid); + rt.add(ERL_DRV_PID, refd->pid); rt.addTupleCount(2); rt.send(); - delete refd->pid; + refd->pid = -1; }; if(refd->type == 1 && ((wxObject*)ptr)->IsKindOf(CLASSINFO(wxSizer))) { wxSizerItemList list = ((wxSizer*)ptr)->GetChildren(); @@ -641,16 +672,18 @@ if((content = item->GetWindow())) if(ptr2ref.end() == ptr2ref.find(content)) { wxString msg; - msg.Printf(wxT("Double usage detected of window at %p in sizer {wx_ref, %d, wxUnknownSizer}"), - content, ref); + wxClassInfo *cinfo = ((wxObject *)ptr)->GetClassInfo(); + msg.Printf(wxT("Double usage detected of window at %p in sizer {wx_ref, %d, %s}"), + content, ref, cinfo->GetClassName()); send_msg("error", &msg); ((wxSizer*)ptr)->Detach((wxWindow*)content); } if((content = item->GetSizer())) if(ptr2ref.end() == ptr2ref.find(content)) { wxString msg; - msg.Printf(wxT("Double usage detected of sizer at %p in sizer {wx_ref, %d, wxUnknownSizer}"), - content, ref); + wxClassInfo *cinfo = ((wxObject *)ptr)->GetClassInfo(); + msg.Printf(wxT("Double usage detected of sizer at %p in sizer {wx_ref, %d, %s}"), + content, ref, cinfo->GetClassName()); send_msg("error", &msg); ((wxSizer*)ptr)->Detach((wxSizer*)content); } @@ -673,7 +706,7 @@ throw wxe_badarg(index); } -void WxeApp::registerPid(char * bp, wxeErlTerm * term, wxeMemEnv * memenv) { +void WxeApp::registerPid(char * bp, ErlDrvTermData pid, wxeMemEnv * memenv) { int index = *(int *) bp; if(!memenv) throw wxe_badarg(index); @@ -683,7 +716,7 @@ it = ptr2ref.find(temp); if(it != ptr2ref.end()) { wxeRefData *refd = it->second; - refd->pid = term; + refd->pid = pid; return ; } }; @@ -724,42 +757,49 @@ port = sd->port; op = fc; len = buflen; - buffer = (char *) driver_alloc(len); - memcpy((void *) buffer, (void *) cbuf, len);; bin[0] = NULL; bin[1] = NULL; bin[2] = NULL; - temp = sd->bin; - - prev = NULL; - start = temp; - - while(temp) { - if(caller == temp->from) { - bin[n++] = temp; - if(prev) { - prev->next = temp->next; + if(cbuf) { + buffer = (char *) driver_alloc(len); + memcpy((void *) buffer, (void *) cbuf, len);; + + temp = sd->bin; + + prev = NULL; + start = temp; + + while(temp) { + if(caller == temp->from) { + bin[n++] = temp; + if(prev) { + prev->next = temp->next; + } else { + start = temp->next; + } + temp = temp->next; } else { - start = temp->next; + prev = temp; + temp = temp->next; } - temp = temp->next; - } else { - prev = temp; - temp = temp->next; } + sd->bin = start; + } else { // No-op only PING currently + buffer = NULL; } - sd->bin = start; } wxeCommand::~wxeCommand() { int n = 0; - while(bin[n]) { - if(bin[n]->bin) - driver_free_binary(bin[n]->bin); - driver_free(bin[n++]); + if(buffer) { + while(bin[n]) { + if(bin[n]->bin) + driver_free_binary(bin[n]->bin); + driver_free(bin[n++]); + } + driver_free(buffer); } - driver_free(buffer); } /* **************************************************************************** @@ -799,3 +839,25 @@ delete user_data; } } + +/* **************************************************************************** + * wxListCtrlCompare wrapper + * ****************************************************************************/ + +int wxCALLBACK wxEListCtrlCompare(long item1, long item2, long callbackInfoPtr) +{ + callbackInfo * cb = (callbackInfo *)callbackInfoPtr; + wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(cb->port); + char * bp = ((WxeApp *) wxTheApp)->cb_buff; + + wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false); + rt.addInt(cb->callbackID); + rt.addInt(item1); + rt.addInt(item2); + rt.endList(2); + rt.addAtom("_wx_invoke_cb_"); + rt.addTupleCount(3); + rt.send(); + handle_callback_batch(cb->port); + return *(int*) bp; +} diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/wxe_impl.h erlang-13.b.3-dfsg/lib/wx/c_src/wxe_impl.h --- erlang-13.b.1-dfsg/lib/wx/c_src/wxe_impl.h 2009-04-16 10:25:14.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/wxe_impl.h 2009-11-20 13:34:38.000000000 +0000 @@ -122,12 +122,16 @@ class wxeRefData { public: wxeRefData(unsigned int dref, int ttype, int is_new, wxeMemEnv *menv) : - ref(dref), type(ttype), alloc_in_erl(is_new), memenv(menv), pid(NULL) { } ; + ref(dref), type(ttype), alloc_in_erl(is_new), memenv(menv), pid(-1) { } ; int ref; - int type; + int type; + // 0 = wxWindow subclasses, 1 = wxObject subclasses + // 2 = wxDialog subclasses, 3 = allocated wxObjects but not returned from new + // > 3 classes which lack virtual destr, or are supposed to be allocated on + // the stack bool alloc_in_erl; wxeMemEnv *memenv; - wxeErlTerm *pid; + ErlDrvTermData pid; }; WX_DECLARE_HASH_MAP(ErlDrvTermData, wxGLCanvas*, wxIntegerHash, wxIntegerEqual, wxeGLC); @@ -162,7 +166,7 @@ int getRef(void * ptr, wxeMemEnv *memenv); void * getPtr(char * bp, wxeMemEnv *memenv); void clearPtr(void *ptr); - void registerPid(char *ptr, wxeErlTerm *term, wxeMemEnv *memenv); + void registerPid(char *ptr, ErlDrvTermData pid, wxeMemEnv *memenv); void init_nonconsts(wxeMemEnv *memenv, ErlDrvTermData caller); // Code found in gen/wxe_derived_dest.h @@ -196,7 +200,7 @@ void setActiveGL(ErlDrvTermData caller, wxGLCanvas *canvas); void deleteActiveGL(wxGLCanvas *canvas); -void send_msg(char *, wxString *); // For debugging and error msgs +void send_msg(const char *, wxString *); // For debugging and error msgs extern wxeGLC glc; @@ -241,4 +245,12 @@ ErlDrvPort port; }; +// Implementation of wxListCtrlCompare +struct callbackInfo { + ErlDrvPort port; + int callbackID; +}; + +int wxCALLBACK wxEListCtrlCompare(long item1, long item2, long callbackInfoPtr); + #endif //_WXE_IMPL_H diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/wxe_macosx.h erlang-13.b.3-dfsg/lib/wx/c_src/wxe_macosx.h --- erlang-13.b.1-dfsg/lib/wx/c_src/wxe_macosx.h 2009-03-12 12:25:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/c_src/wxe_macosx.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,301 +0,0 @@ -/* - * %CopyrightBegin% - * - * Copyright Ericsson AB 2008-2009. All Rights Reserved. - * - * The contents of this file are subject to the Erlang Public License, - * Version 1.1, (the "License"); you may not use this file except in - * compliance with the License. You should have received a copy of the - * Erlang Public License along with this software. If not, it can be - * retrieved online at http://www.erlang.org/. - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and limitations - * under the License. - * - * %CopyrightEnd% - */ - -/** - * CPS.h - * - * generously provided by Bob Ippolito (bob@redivi.com) - * used to get the ESDL to work under MacOS X. - */ - -#pragma once - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -#if PRAGMA_STRUCT_ALIGN - #pragma options align=mac68k -#elif PRAGMA_STRUCT_PACKPUSH - #pragma pack(push, 2) -#elif PRAGMA_STRUCT_PACK - #pragma pack(2) -#endif - - -struct CPSProcessSerNum -{ - UInt32 lo; - UInt32 hi; -}; - -typedef struct CPSProcessSerNum CPSProcessSerNum; - -enum -{ - kCPSNoProcess = 0, - kCPSSystemProcess = 1, - kCPSCurrentProcess = 2 -}; - - -enum -{ - bfCPSIntraProcessSwitch = 1, - bfCPSDeathBySignal = 2 -}; - -typedef UInt16 CPSEventFlags; - -enum -{ - kCPSBlueApp = 0, - kCPSBlueBox = 1, - kCPSCarbonApp = 2, - kCPSYellowApp = 3, - kCPSUnknownApp = 4 -}; - -typedef UInt32 CPSAppFlavour; - - -enum -{ - kCPSBGOnlyAttr = 1024, - kCPSUIElementAttr = 65536, - kCPSHiddenAttr = 131072, - kCPSNoConnectAttr = 262144, - kCPSFullScreenAttr = 524288, - kCPSClassicReqAttr = 1048576, - kCPSNativeReqAttr = 2097152 -}; - -typedef UInt32 CPSProcAttributes; - -struct CPSProcessInfoRec -{ - CPSProcessSerNum Parent; - UInt64 LaunchDate; - CPSAppFlavour Flavour; - CPSProcAttributes Attributes; - UInt32 ExecFileType; - UInt32 ExecFileCreator; - UInt32 UnixPID; -}; - -typedef struct CPSProcessInfoRec CPSProcessInfoRec; - -enum -{ - kCPSNotifyChildDeath = 1, - kCPSNotifyNewFront = 2, - kCPSNotifyAppBirth = 4, - kCPSNotifyAppDeath = 8, - kCPSNotifyLaunch = 9, - kCPSNotifyServiceReq = 16, - kCPSNotifyAppHidden = 32, - kCPSNotifyAppRevealed = 64, - kCPSNotifyFGEnabled = 128, - kCPSNotifyLaunchStart = 256, - kCPSNotifyAppReady = 512, - kCPSNotifyLaunchFail = 1024, - kCPSNotifyAppDeathExt = 2048, - kCPSNotifyLostKeyFocus = 4096 -}; - -typedef UInt32 CPSNotificationCodes; - -enum -{ - bfCPSLaunchInhibitDaemon = 128, - bfCPSLaunchDontSwitch = 512, - bfCPSLaunchNoProcAttr = 2048, - bfCPSLaunchAsync = 65536, - bfCPSLaunchStartClassic = 131072, - bfCPSLaunchInClassic = 262144, - bfCPSLaunchInstance = 524288, - bfCPSLaunchAndHide = 1048576, - bfCPSLaunchAndHideOthers = 2097152 -}; - -typedef UInt32 CPSLaunchOptions; -typedef UInt8 *CPSLaunchRefcon; -typedef UInt8 *CPSLaunchData; - -enum -{ - bfCPSExtLaunchWithData = 2, - bfCPSExtLaunchByParent = 4, - bfCPSExtLaunchAsUidGid = 8 -}; - -typedef UInt32 CPSLaunchPBFields; - -struct CPSLaunchPB -{ - CPSLaunchPBFields Contents; - CPSLaunchData pData; - UInt32 DataLen; - UInt32 DataTag; - UInt32 RefCon; - CPSProcessSerNum Parent; - UInt32 ChildUID; - UInt32 ChildGID; -}; - -typedef struct CPSLaunchPB CPSLaunchPB; - - -enum -{ - bfCPSKillHard = 1, - bfCPSKillAllClassicApps = 2 -}; - -typedef UInt32 CPSKillOptions; - - -enum -{ - kCPSLaunchService = 0, - kCPSKillService = 1, - kCPSHideService = 2, - kCPSShowService = 3, - kCPSPrivService = 4, - kCPSExtDeathNoteService = 5 -}; - -typedef UInt32 CPSServiceReqType; - - -struct CPSLaunchRequest -{ - CPSProcessSerNum TargetPSN; - CPSLaunchOptions Options; - CPSProcAttributes ProcAttributes; - UInt8 *pUTF8TargetPath; - UInt32 PathLen; -}; - -typedef struct CPSLaunchRequest CPSLaunchRequest; - - -struct CPSKillRequest -{ - CPSProcessSerNum TargetPSN; - CPSKillOptions Options; -}; - -typedef struct CPSKillRequest CPSKillRequest; - - -struct CPSHideRequest -{ - CPSProcessSerNum TargetPSN; -}; - -typedef struct CPSHideRequest CPSHideRequest; - - -struct CPSShowRequest -{ - CPSProcessSerNum TargetPSN; -}; - -typedef struct CPSShowRequest CPSShowRequest; - - -struct CPSExtDeathNotice -{ - CPSProcessSerNum DeadPSN; - UInt32 Flags; - UInt8 *pUTF8AppPath; - UInt32 PathLen; -}; - -typedef struct CPSExtDeathNotice CPSExtDeathNotice; - - -union CPSRequestDetails -{ - CPSLaunchRequest LaunchReq; - CPSKillRequest KillReq; - CPSHideRequest HideReq; - CPSShowRequest ShowReq; - CPSExtDeathNotice DeathNotice; -}; - -typedef union CPSRequestDetails CPSRequestDetails; - - -struct CPSServiceRequest -{ - CPSServiceReqType Type; - SInt32 ID; - CPSRequestDetails Details; -}; - -typedef struct CPSServiceRequest CPSServiceRequest; - - -enum -{ - kCPSProcessInterruptKey = 0, - kCPSAppSwitchFwdKey = 1, - kCPSAppSwitchBackKey = 2, - kCPSSessionInterruptKey = 3, - kCPSScreenSaverKey = 4, - kCPSDiskEjectKey = 5, - kCPSSpecialKeyCount = 6 -}; - -typedef SInt32 CPSSpecialKeyID; - -extern Boolean CPSEqualProcess( CPSProcessSerNum *psn1, CPSProcessSerNum *psn2); -extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); -extern OSErr CPSGetFrontProcess( CPSProcessSerNum *psn); -extern OSErr CPSGetNextProcess( CPSProcessSerNum *psn); -extern OSErr CPSGetNextToFrontProcess( CPSProcessSerNum *psn); -extern OSErr CPSGetProcessInfo( CPSProcessSerNum *psn, CPSProcessInfoRec *info, char *path, int maxPathLen, int *len, char *name, int maxNameLen); -extern OSErr CPSPostHideMostReq( CPSProcessSerNum *psn); -extern OSErr CPSPostHideReq( CPSProcessSerNum *psn); -extern OSErr CPSPostKillRequest( CPSProcessSerNum *psn, CPSKillOptions options); -extern OSErr CPSPostShowAllReq( CPSProcessSerNum *psn); -extern OSErr CPSPostShowReq( CPSProcessSerNum *psn); -extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); -extern OSErr CPSReleaseKeyFocus( CPSProcessSerNum *psn); -extern OSErr CPSStealKeyFocus( CPSProcessSerNum *psn); -extern OSErr CPSSetProcessName ( CPSProcessSerNum *psn, char *processname); -extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); - - -#if PRAGMA_STRUCT_ALIGN - #pragma options align=reset -#elif PRAGMA_STRUCT_PACKPUSH - #pragma pack(pop) -#elif PRAGMA_STRUCT_PACK - #pragma pack() -#endif - -#ifdef __cplusplus -} -#endif diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/wxe_ps_init.c erlang-13.b.3-dfsg/lib/wx/c_src/wxe_ps_init.c --- erlang-13.b.1-dfsg/lib/wx/c_src/wxe_ps_init.c 2009-03-12 12:25:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/c_src/wxe_ps_init.c 2009-09-18 15:10:57.000000000 +0100 @@ -18,37 +18,36 @@ */ #include - +#include "wxe_driver.h" /* Platform specific initialisation stuff */ #ifdef _MACOSX -#include "wxe_macosx.h" #include #include void * wxe_ps_init() { - /* COCOA */ - CPSProcessSerNum PSN; - OSErr err; - void *rel_pool; - - rel_pool = [[NSAutoreleasePool alloc] init]; - [NSApplication sharedApplication]; - -/* objc_msgSend(objc_msgSend(objc_getClass("NSAutoreleasePool"), */ -/* @selector(alloc)), @selector(init)); */ - -/* objc_msgSend(objc_getClass("NSApplication"), */ -/* @selector(sharedApplication)); */ - - /* To get a Menu & a dock icon : */ - assert(!(err = CPSGetCurrentProcess(&PSN))); - assert(!(err = CPSSetProcessName(&PSN,"Erlang"))); - assert(!(err = CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103))); - assert(!(err = CPSSetFrontProcess(&PSN))); + ProcessSerialNumber psn; + NSAutoreleasePool *pool; + // Enable GUI + GetCurrentProcess(&psn); + TransformProcessType(&psn, kProcessTransformToForegroundApplication); + SetFrontProcess(&psn); + // Enable Cocoa calls from Carbon app + NSApplicationLoad(); + + // Setup and enable gui + pool = [[NSAutoreleasePool alloc] init]; + + NSApplication *app = [NSApplication sharedApplication]; + // Load and set icon + + NSMutableString *file = [[NSMutableString alloc] init]; + [file appendFormat:@"%s/%s", erl_wx_privdir, "erlang-logo64.png"]; + NSImage *icon = [[NSImage alloc] initWithContentsOfFile: file]; + [app setApplicationIconImage: icon]; - return rel_pool; + return (void *) pool; } /* _MACOSX */ #else diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/wxe_return.cpp erlang-13.b.3-dfsg/lib/wx/c_src/wxe_return.cpp --- erlang-13.b.1-dfsg/lib/wx/c_src/wxe_return.cpp 2009-04-16 10:25:14.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/c_src/wxe_return.cpp 2009-09-18 15:10:56.000000000 +0100 @@ -268,7 +268,7 @@ addTupleCount(2); } -inline +INLINE void wxeReturn::addDate(wxDateTime dateTime) { addInt(dateTime.GetYear()); addInt(dateTime.GetMonth()+1); // c++ month is zero based @@ -330,3 +330,19 @@ addTupleCount(11); } +INLINE +void wxeReturn::add(const wxHtmlLinkInfo *val) { + addAtom("wxHtmlLinkInfo"); + add(val->GetHref()); + add(val->GetTarget()); + addTupleCount(3); +} + +INLINE +void wxeReturn::add(const wxHtmlLinkInfo &val) { + addAtom("wxHtmlLinkInfo"); + add(val.GetHref()); + add(val.GetTarget()); + addTupleCount(3); +} + diff -Nru erlang-13.b.1-dfsg/lib/wx/c_src/wxe_return.h erlang-13.b.3-dfsg/lib/wx/c_src/wxe_return.h --- erlang-13.b.1-dfsg/lib/wx/c_src/wxe_return.h 2009-03-12 12:25:42.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/c_src/wxe_return.h 2009-09-18 15:10:57.000000000 +0100 @@ -37,6 +37,8 @@ #include #include #include +#include + // #define send() send_term(__FILE__, __LINE__) @@ -108,6 +110,10 @@ void add(wxUIntPtr *val); + void add(const wxHtmlLinkInfo *val); + + void add(const wxHtmlLinkInfo &val); + int send(); void reset(); diff -Nru erlang-13.b.1-dfsg/lib/wx/doc/src/book.xml erlang-13.b.3-dfsg/lib/wx/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/wx/doc/src/book.xml 2009-03-12 15:04:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/doc/src/book.xml 2009-11-20 13:34:46.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2009 @@ -21,7 +21,7 @@ - wxErlang Application + wxErlang @@ -29,15 +29,19 @@
    - wxErlang Application + wxErlang - + + + + +
    diff -Nru erlang-13.b.1-dfsg/lib/wx/doc/src/Makefile erlang-13.b.3-dfsg/lib/wx/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/wx/doc/src/Makefile 2009-03-12 15:04:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/doc/src/Makefile 2009-11-20 13:34:38.000000000 +0000 @@ -22,6 +22,7 @@ # ---------------------------------------------------- include ../../vsn.mk include ../../config.mk +APPLICATION=wxErlang ErlMods = wx.erl wx_object.erl @@ -80,7 +81,13 @@ XML_CHAPTER_FILES = chapter.xml XML_NOTES_FILES = notes.xml -#BOOK_FILES = book.xml +BOOK_FILES = book.xml + +XML_FILES = \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) \ + $(XML_NOTES_FILES) $(XML_APPLICATION_FILES) + # ---------------------------------------------------- INFO_FILE = ../../info @@ -89,39 +96,11 @@ $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) -EXTRA_FILES = \ - $(DEFAULT_GIF_FILES) \ - $(DEFAULT_HTML_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_NOTES_FILES:%.xml=$(HTMLDIR)/%.html) - MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_APPLICATION_FILES:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -#TOP_PDF_FILE = wx-$(VSN).pdf -#TOP_PS_FILE = wx-$(VSN).ps - -#$(TOP_PDF_FILE): book.dvi ../../vsn.mk -# $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -#$(TOP_PS_FILE): book.dvi ../../vsn.mk -# $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ - -ref_man.xml: ref_man.src.xml - @echo Preparing ref_man.xml - @cat ref_man.src.xml > ref_man.xml - @for d in $(ModsNoExt); do \ - echo " " >> ref_man.xml ; \ - done - @echo "" >> ref_man.xml - @echo +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- # FLAGS @@ -132,29 +111,14 @@ # ---------------------------------------------------- # Targets # ---------------------------------------------------- -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif -$(ErlMods:%.erl=%.xml): - docb_gen -def vsn $(WX_VSN) -sort_functions false ../../src/$(@:%.xml=%.erl) -$(GenMods:%.erl=%.xml): - docb_gen -def vsn $(WX_VSN) -sort_functions false ../../src/gen/$(@:%.xml=%.erl) - -$(XML_CHAPTER_FILES): - docb_gen -chapter -def vsn $(WX_VSN) ../overview.edoc +docs: pdf html man -pdf: xml $(TOP_PDF_FILE) +$(TOP_PDF_FILE): $(XML_FILES) -ps: xml $(TOP_PS_FILE) +pdf: $(TOP_PDF_FILE) -html: xml $(HTML_FILES) +html: gifs $(HTML_REF_MAN_FILE) man: $(MAN3_FILES) @@ -162,15 +126,30 @@ xml: $(XML_REF3_FILES) $(XML_CHAPTER_FILES) +ref_man.xml: ref_man.src.xml + @echo Preparing ref_man.xml + @cat ref_man.src.xml > ref_man.xml + @for d in $(ModsNoExt); do \ + echo " " >> ref_man.xml ; \ + done + @echo "" >> ref_man.xml + @echo + +$(ErlMods:%.erl=%.xml): + docb_gen -def vsn $(VSN) -sort_functions false ../../src/$(@:%.xml=%.erl) +$(GenMods:%.erl=%.xml): + docb_gen -def vsn $(VSN) -sort_functions false ../../src/gen/$(@:%.xml=%.erl) + +$(XML_CHAPTER_FILES): + docb_gen -chapter -def vsn $(VSN) ../overview.edoc + debug opt: -clean clean_docs clean_tex: - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) $(MAN6_FILES) - rm -f $(EXTRA_FILES:fascicules.xml= ) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) $(LATEX_CLEAN) +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) rm -f errs core *~ ../html/edoc-info - rm -f ref_man.kwc ref_man.xml min_head.gif part.tex rm -f $(XML_REF3_FILES) $(XML_CHAPTER_FILES) *.html # ---------------------------------------------------- @@ -178,35 +157,19 @@ # ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf -# $(INSTALL_DIR) $(RELEASE_PATH)/pdf -# $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps -# $(INSTALL_DIR) $(RELEASE_PATH)/ps -# $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps - -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(EXTRA_FILES) $(HTML_FILES) \ + $(INSTALL_DATA) $(HTMLDIR)/* \ $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 -endif -endif release_spec: release_tests_spec: -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- --include make.dep - endif diff -Nru erlang-13.b.1-dfsg/lib/wx/doc/src/notes.xml erlang-13.b.3-dfsg/lib/wx/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/wx/doc/src/notes.xml 2009-06-05 13:54:35.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/doc/src/notes.xml 2009-11-20 13:34:46.000000000 +0000 @@ -26,10 +26,90 @@ nil nil nil + notes.xml

    This document describes the changes made to the wxErlang application.

    +
    Wx 0.98.4 + +
    Improvements and New Features + + +

    Added wx_object improvements from Mazen.

    Fixed + pid issues, reported by Mazen.

    Added wxLogNull + class, reported by Amit Murthy.

    Various configure + fixes.

    +

    + Own Id: OTP-8243 Aux Id: seq11418

    +
    + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8250

    +
    + +

    + wx now builds with wxWidgets 2.8.4 or a later 2.8 + release, thanks Nico Kruber.

    +

    + Own Id: OTP-8292

    +
    +
    +
    + +
    + +
    Wx 0.98.3 + +
    Fixed Bugs and Malfunctions + + +

    + Added wxListCtrl sorting and build fixes supplied by Paul + Hampson. Thanks.

    +

    + Own Id: OTP-8126

    +
    +
    +
    + + +
    Improvements and New Features + + +

    wxHtmlWindow class implemented.

    All exceptions + from callbacks are now catched and written to the + log.

    Some defines where wrong in 'wx.hrl'.

    +

    wx:batch/1 and friends could hang forever if + for instance a breakpoint was set inside the fun. That + caused all wx applications to hang.

    Added missing + wxAuiPaneInfo constructor and destructor.

    Added + wxAuiNotebookEvent and wxAuiManagerEvent.

    Calling + non supported wxWidgets functions hanged instead of + crashed.

    Update OpenGL to version 3.1 and added + some of the missing glu functions.

    Fixed + wxRadioBox which inherited the wrong class, thanks Atilla + Erdodi.

    +

    + Own Id: OTP-8083

    +
    + +

    + Removed some of the automatic garbage collecting after + application exit, user will get a warning instead so he + can correct the code.

    +

    + Own Id: OTP-8138

    +
    +
    +
    + +
    +
    Wx 0.98.2
    Improvements and New Features diff -Nru erlang-13.b.1-dfsg/lib/wx/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/wx/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/wx/doc/src/part_notes.xml 2009-03-12 15:04:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/doc/src/part_notes.xml 2009-11-20 13:34:46.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2009 @@ -32,6 +32,6 @@ interfaces with wxWidgets.

    - + diff -Nru erlang-13.b.1-dfsg/lib/wx/doc/src/part.xml erlang-13.b.3-dfsg/lib/wx/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/wx/doc/src/part.xml 2009-03-12 15:04:47.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/doc/src/part.xml 2009-11-20 13:34:45.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2009 @@ -33,6 +33,6 @@ interfaces with wxWidgets.

    - + diff -Nru erlang-13.b.1-dfsg/lib/wx/doc/src/ref_man.src.xml erlang-13.b.3-dfsg/lib/wx/doc/src/ref_man.src.xml --- erlang-13.b.1-dfsg/lib/wx/doc/src/ref_man.src.xml 2009-03-12 15:04:48.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/doc/src/ref_man.src.xml 2009-11-20 13:34:46.000000000 +0000 @@ -1,7 +1,7 @@ - +
    2009 diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/demo.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/demo.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/demo.erl 2009-06-05 13:54:36.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/demo.erl 2009-09-18 15:11:20.000000000 +0100 @@ -24,11 +24,12 @@ -include_lib("wx/include/wx.hrl"). --behavoiur(wx_object). +-behaviour(wx_object). -export([start/0, start/1, start_link/0, start_link/1, format/3, init/1, terminate/2, code_change/3, handle_info/2, handle_call/3, handle_event/2]). + -record(state, {win, demo, example, selector, log, code}). start() -> @@ -59,8 +60,9 @@ Frame = wxFrame:new(wx:null(), ?wxID_ANY, "wxErlang widgets", [{size,{1000,500}}]), MB = wxMenuBar:new(), - wxFrame:setMenuBar(Frame,MB), File = wxMenu:new([]), + wxMenu:append(File, ?wxID_PRINT, "&Print code"), + wxMenu:appendSeparator(File), wxMenu:append(File, ?wxID_EXIT, "&Quit"), Debug = wxMenu:new([]), wxMenu:appendRadioItem(Debug, ?DEBUG_NONE, "None"), @@ -73,6 +75,8 @@ wxMenuBar:append(MB, File, "&File"), wxMenuBar:append(MB, Debug, "&Debug"), wxMenuBar:append(MB, Help, "&Help"), + wxFrame:setMenuBar(Frame,MB), + wxFrame:connect(Frame, command_menu_selected), _SB = wxFrame:createStatusBar(Frame,[]), @@ -82,16 +86,13 @@ %% P Widgets|Code | Demo %% S ------------------------------- %% P Log Window - TopSplitter = wxSplitterWindow:new(Frame, []), - UpperSplitter = wxSplitterWindow:new(TopSplitter, []), - LeftSplitter = wxSplitterWindow:new(UpperSplitter, []), + TopSplitter = wxSplitterWindow:new(Frame, [{style, ?wxSP_NOBORDER}]), + UpperSplitter = wxSplitterWindow:new(TopSplitter, [{style, ?wxSP_NOBORDER}]), + LeftSplitter = wxSplitterWindow:new(UpperSplitter, [{style, ?wxSP_NOBORDER}]), %% Setup so that sizers and initial sizes, resizes the windows correct - wxSplitterWindow:setMinimumPaneSize(TopSplitter, 1), - wxSplitterWindow:setMinimumPaneSize(UpperSplitter, 1), - wxSplitterWindow:setMinimumPaneSize(LeftSplitter, 1), wxSplitterWindow:setSashGravity(TopSplitter, 0.5), - wxSplitterWindow:setSashGravity(UpperSplitter, 0.70), - wxSplitterWindow:setSashGravity(LeftSplitter, 0.15), + wxSplitterWindow:setSashGravity(UpperSplitter, 0.60), + wxSplitterWindow:setSashGravity(LeftSplitter, 0.20), %% LeftSplitter: Example = fun(Beam) -> @@ -108,19 +109,21 @@ {LBPanel, [LB],_} = create_subwindow(LeftSplitter, "Example", [CreateLB]), wxListBox:setSelection(LB, 0), wxListBox:connect(LB, command_listbox_selected), - + CreateCode = fun(Parent) -> code_area(Parent) end, {CodePanel, [Code],_} = create_subwindow(LeftSplitter, "Code", [CreateCode]), - - wxSplitterWindow:splitVertically(LeftSplitter, LBPanel, CodePanel), + + wxSplitterWindow:splitVertically(LeftSplitter, LBPanel, CodePanel, + [{sashPosition,150}]), %% Demo: {DemoPanel, [], DemoSz} = create_subwindow(UpperSplitter, "Demo", []), %% UpperSplitter: - wxSplitterWindow:splitVertically(UpperSplitter, LeftSplitter, DemoPanel), + wxSplitterWindow:splitVertically(UpperSplitter, LeftSplitter, DemoPanel, + [{sashPosition,600}]), %% TopSplitter: AddEvent = fun(Parent) -> @@ -152,7 +155,10 @@ wxSplitterWindow:setSashGravity(TopSplitter, 1.0), wxSplitterWindow:setSashGravity(UpperSplitter, 0.0), wxSplitterWindow:setSashGravity(LeftSplitter, 0.0), - + wxSplitterWindow:setMinimumPaneSize(TopSplitter, 1), + wxSplitterWindow:setMinimumPaneSize(UpperSplitter, 1), + wxSplitterWindow:setMinimumPaneSize(LeftSplitter, 1), + wxToolTip:enable(true), wxToolTip:setDelay(500), @@ -202,6 +208,16 @@ event = #wxCommand{type = command_menu_selected}}, State = #state{}) -> case Id of + ?wxID_PRINT -> + %% If you are going to printout mainly text it is easier if + %% you generate HTML code and use a wxHtmlEasyPrint + %% instead of using DCs + Module = "ex_" ++ wxListBox:getStringSelection(State#state.selector) ++ ".erl", + HEP = wxHtmlEasyPrinting:new([{name, "Print"}, + {parentWindow, State#state.win}]), + Html = demo_html_tagger:erl2htmltext(Module), + wxHtmlEasyPrinting:previewText(HEP, Html), + {noreply, State}; ?DEBUG_TRACE -> wx:debug(trace), {noreply, State}; @@ -229,6 +245,7 @@ {caption, "About"}])), {noreply, State}; ?wxID_EXIT -> + wx_object:get_pid(State#state.example) ! stop, {stop, normal, State}; _ -> {noreply, State} @@ -244,7 +261,9 @@ code_change(_, _, State) -> {stop, not_yet_implemented, State}. -terminate(_Reason, _State) -> +terminate(_Reason, State) -> + wx_object:get_pid(State#state.example) ! stop, + timer:sleep(200), %% Give the example process some time to cleanup. wx:destroy(). %%%%%%%%%%%%%%%%% Internals %%%%%%%%%% @@ -252,6 +271,8 @@ load_example(Ex, #state{demo={DemoPanel,DemoSz}, log=EvCtrl, code=Code}) -> ModStr = "ex_" ++ Ex, Mod = list_to_atom(ModStr), +%% WxDir = code:lib_dir(wx), +%% ModFile = filename:join([WxDir, "examples","demo", ModStr ++ ".erl"]), ModFile = ModStr ++ ".erl", load_code(Code, file:read_file(ModFile)), find(Code), @@ -324,10 +345,10 @@ find(Ed) -> ?stc:searchAnchor(Ed), Res = ?stc:searchNext(Ed, ?wxSTC_FIND_REGEXP, "^init"), - case Res >= 0 of + case Res >= 0 of true -> %% io:format("Found ~p ~n",[Res]), - ?stc:scrollToLine(Ed,?stc:lineFromPosition(Ed,Res) - 3), + ?stc:scrollToLine(Ed,?stc:lineFromPosition(Ed,Res) - 1), true; false -> io:format("Not Found ~s ~n",["^init"]), @@ -340,4 +361,3 @@ "div","rem","band","and","bor","bxor","bsl","bsr","or","xor"], lists:flatten([K ++ " " || K <- L] ++ [0]). - diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/demo_html_tagger.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/demo_html_tagger.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/demo_html_tagger.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/demo_html_tagger.erl 2009-09-18 15:11:30.000000000 +0100 @@ -0,0 +1,534 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(demo_html_tagger). + +%% You will notice that this program has very few type declarations +%% That's because this program uses some pretty dodgy techniques to +%% get at the data it requires. + +%% I use epp_dodger to parse the file and the new imporved erl_scan +%% find the exact values of the tokens + +%% epp_dodger returns an objects of type erl_syntax which are pretty +%% nasty buggers. We could write the types out but it would hardly +%% help. + +%% to test run + +%%-compile(export_all). + + +-export([erl2htmltext/1, erl2htmlfile/1]). + +erl2htmltext(File) -> + try + erl2html0(File) + catch + What:Why -> + io:format("error in:~s ~p ~p~n",[File,What,Why]) + end. + +erl2htmlfile(File) -> + try + Text = erl2html0(File), + Root = filename:basename(filename:rootname(File)), + Out = "./html/" ++ Root ++ ".html", + file:write_file(Out, [Text]) + catch + What:Why -> + io:format("error in:~s ~p ~p~n",[File,What,Why]) + end. + + +splitErlang(File) -> + {ok, Forms} = dodge_file(File), + {Anchors, Patches} = analyse(Forms), + Raw = read_raw_forms(File), + Raw1 = merge_anchors(Anchors, Raw), + Raw2 = merge_forms(Raw1, Patches, []), + Rtf = [final(I) || I <- Raw2], + {taggedBlocks, Rtf}. + +erl2html0(File) -> + Tb = splitErlang(File), + Html = to_html(Tb), + prelude(Html). + +merge_forms([{Tag,L1}|T], Patches, L) -> + {L2, Patches1} = apply_patches(L1, Patches), + merge_forms(T, Patches1, [{Tag,L2}|L]); +merge_forms([], _, L) -> + lists:reverse(L). + +apply_patches(Toks, []) -> + %% we've run out of patches but we must still simplify + %% every term + {[simplify(I) || I <- Toks], []}; +apply_patches(Toks, Patches) -> + apply_patches(Toks, Patches, []). + +apply_patches([{atom,Ln,Val}=A|T], Patches, L) -> + case do_patch(Ln, Patches) of + {yes, New, Patches1} -> + New1 = reformat(New, Val), + apply_patches(T, Patches1, [New1|L]); + {no, Patches1} -> + apply_patches(T, Patches1, [simplify(A)|L]) + end; +apply_patches([H|T], Patches, L) -> + apply_patches(T, Patches, [simplify(H)|L]); +apply_patches([], Patches, L) -> + {lists:reverse(L), Patches}. + + +simplify({atom,_,Str}) -> + case (catch list_to_existing_atom(Str)) of + {'EXIT', _} -> + {atom, Str}; + A -> + case is_keyword(A) of + true -> {keyword, Str}; + false -> + {atom, Str} + end + end; +simplify({dot,_,Str}) -> + {terminal, Str}; +simplify({Tag,_,Str}) -> + case is_keyword(Tag) of + true -> + {keyword, Str}; + false -> + case is_terminal(Tag) of + true -> + {terminal, Str}; + false -> + {Tag, Str} + end + end; +simplify(X) -> + io:format("simplify wtfit:~p~n",[X]), + X. + +do_patch(Ln, [{Ln,Tag}|P]) -> {yes, Tag, P}; +do_patch(Ln, [{Ln1,_}|_] = P) when Ln1 > Ln -> {no, P}; +do_patch(Ln, [_|T]) -> do_patch(Ln, T); +do_patch(_, []) -> {no, []}. + +reformat({local,{F,A}}, Str) -> {local,F,A,Str}; +reformat({remote,M,F,A}, Str) -> {remote,M,F,A,Str}; +reformat({remote,{M,F,A}}, Str) -> {remote,M,F,A,Str}; +reformat({bif,{F,A}}, Str) -> {bif,F,A,Str}; +reformat(Tag, Str) -> + io:format("reformat*:~p ~p~n",[Tag,Str]), + {Tag,Str}. + +to_html({taggedBlocks, L}) -> + [[anchor1(Anchor),to_html(Body)] || {Anchor,Body} <- L]; +to_html({taggedToks, L}) -> + [to_html1(I) || I <- L]. + +anchor1({func, F, A}) -> + [""]; +anchor1({specification, F, A}) -> + [""]; +anchor1(_X) -> + "". + +linkname(F, A) when is_atom(F) -> + a2s(F) ++ "-" ++ integer_to_list(A); +linkname(F, A) when is_list(F) -> + F ++ "-" ++ integer_to_list(A). + +a2s(A) -> + atom_to_list(A). + +font(C, S) -> + ["", htmlquote(S), ""]. + +htmlquote("<" ++ T) -> ["<"|htmlquote(T)]; +htmlquote([H|T]) -> [H|htmlquote(T)]; +htmlquote([]) -> []. + +to_html1({white_space,V}) -> V; +to_html1({comment, V}) -> font("#B22222", V); +to_html1({var,V}) -> font("orange", V); +to_html1({string,V}) -> font("#FA8072", V); +to_html1({integer,V}) -> font("#1111AA", V); +to_html1({bif,_F,_A,Str}) -> font("#FF00FF", Str); +to_html1({keyword, V}) -> font("#FF00FF", V); +to_html1({atom, V}) -> V; +to_html1({terminal,V}) -> V; +to_html1({char,V}) -> V; +to_html1({float,V}) -> V; +to_html1({anchor,F,A}) -> + [""]; +to_html1({local,F,A,Str}) -> + ["", + htmlquote(Str),""]; +to_html1({remote,_M,_F,_A,Str}) -> + %%["",htmlquote(Str),""], + Str. + +%% merge the anchors +%% there should be one block per anchor +%% we check the containing form (for safety) + +%% merge_anchors([{_,{file,_}}|A], B) -> +%% merge_anchors(A, B); +merge_anchors([{Tag,Val}=H|A], [B|T]) -> + case contains(Tag, B) of + true -> + [{Val,B}|merge_anchors(A, T)]; + false -> + io:format("Logic error: H=~p B=~p~n",[H,B]), + exit(1) + end; +merge_anchors([], []) -> []; +merge_anchors([], [X]) -> + %% this is the last block - + %% trailing white space and comments have no tag + %% because eos is not a tag ... + [{eof, X}]; +merge_anchors(X, Y) -> + io:format("ops:~p~n",[{X,Y}]), + []. + +contains(Loc, [{_,Loc,_}|_]) -> true; +contains(Loc, [_|T]) -> contains(Loc, T); +contains(_, []) -> false. + + +dodge_file(File) -> + case file:open(File, [read]) of + {ok, Handle} -> + {ok, F} = epp_dodger:parse(Handle, {1,1}), + file:close(Handle), + L = [revert_forms(I) || I <- F], + {ok, L}; + Error -> + Error + end. + +revert_forms(F) -> + case erl_syntax:is_form(F) of + true -> + %% revert fails on ifdef ... etc + case (catch erl_syntax:revert(F)) of + {'EXIT', _Why} -> + io:format("error reverting:~p=~p~n",[F,_Why]), + F; + Other -> + Other + end; + false -> + io:format("uugh:~p~n",[F]) + end. + +%% read up to dot +%% read_raw_forms(File) -> [form()] +%% form() = [tok()] +%% tok() = {Type,{Line::int,Col::int},string} +%% Type = atom | int | var | string ... + +read_raw_forms(File) -> + {ok, Bin} = file:read_file(File), + Str = binary_to_list(Bin), + loop(erl_scan:tokens([], Str, {1,1}, [return,text]), []). + +loop({done, {eof,_}, eof}, L) -> + lists:reverse(L); +loop({done, {ok, Toks, _}, eof}, L) -> + lists:reverse([normalize_toks(Toks)|L]); +loop({done, {ok, Toks, Ln}, Str1}, L) -> + loop(erl_scan:tokens([], Str1, Ln, [return,text]), + [normalize_toks(Toks)|L]); +loop({more, X}, L) -> + loop(erl_scan:tokens(X, eof, {1,1}, [return,text]), L). + +normalize_toks(Toks) -> + [normalize_tok(I) || I <- Toks]. + +normalize_tok(Tok) -> + %% this is the portable way ... + [{_,Type},{_,Line},{_,Col},{_,Txt}] = + erl_scan:token_info(Tok, [category,line,column,text]), + Val = {Type,{Line,Col},Txt}, + %% io:format("here:X=~p ~p~n",[Tok,Val]), + Val. + + +%% analse the result of dodge_file + +analyse(Forms) -> + Calls = calls(Forms), + Anchors = compute_anchors(Forms), + Imports = [{{F,A},Mod} || + {attribute,_,import,{Mod,L}} <- Forms, {F,A} <- L], + D = dict:from_list(Imports), + Patches = [{Loc, resolve(X, D)} || {Loc, X} <- Calls], + {Anchors, Patches}. + +%% An anchor is something that is placed at the start of every form +%% The anchor is named after the first item in the form +%% compute_anchors(Forms) -> [{{Line,Col}, anchor()}] +%% {Line,Col} is the line and column of where the +%% form starts - this is not the same as the first token in +%% the form since we might have skipped comments and white space +%% at the start of the form. +%% anchor() is a term decscribing the anchor +%% anchor(() = {func,Name,Aritry} (for functions) +%% | +%% | {Type,{Line,Col}} anythis else + +compute_anchors(Forms) -> + A1 = [anchor0(I) || I <- Forms], + merge_specs(A1). + +%% If a specification is immediately followed by +%% a function when we promote the function anchor to point +%% at the specification. +%% We change the second tag to func2 - because we still want a +%% tag for every block + +merge_specs([{_Ln1,{specification,F,A}}=H,{Ln2, {func,F,A}}|T]) -> + [H,{Ln2,{func1,F,A}}|merge_specs(T)]; +merge_specs([H|T]) -> + [H|merge_specs(T)]; +merge_specs([]) -> + []. + +anchor0(I) -> + case anchor(I) of + {{Line,Col,_,_}, Val} -> + {{Line,Col}, Val}; + {{_,_}, _} = X -> + X + end. + +anchor({function, Ln, F, A, _}) -> {Ln, {func, F, A}}; +anchor({attribute,Ln,'spec', {{F,A},_}}) -> + {Ln, {specification,F,A}}; +anchor({attribute,Ln,module, M}) -> + {Ln, {module,M}}; +anchor({attribute,Ln,Type,_}) -> {Ln, {Type, Ln}}; +anchor({eof,Ln}) -> {Ln, eof}; +anchor({error,{Ln,_,_}}) -> + %% Ln is in a different format in errors (sigh) + {Line, Col} = Ln, + Ln1 = {Line,Col,0,""}, + {Ln1, {error, Ln}}; +anchor({tree,attribute,{attr,{_,_,_,Type}=Ln,_,_},_}) -> + {Ln, {attribute,Type,Ln}}; +anchor({tree,attribute,_, + {attribute, {atom,Ln,Type}, _}}) -> + {Ln, {attribute,Type,Ln}}; +anchor({tree,attribute, + {attr,Ln,[],none}, + _}=X) -> + io:format("FIX ME this is a bug????:~p~n",[X]), + {Ln, {other, Ln}}; +anchor(X) -> + %% this is some syntactic form that I don't know + %% about yet ... + io:format("FIX ME this is a bug????:~p~n",[X]), + exit(1). + +resolve({F,A}=Tup, D) -> + case dict:find({F,A}, D) of + {ok, Mod} -> + {remote,Mod,F,A}; + error -> + case erlang:is_builtin(erlang, F, A) of + true -> {bif, {F,A}}; + false -> {local,Tup} + end + end; +resolve({erlang,F,A}, _) -> + {bif,{F,A}}; +resolve({anchor,_,_}=A, _) -> + A; +resolve(X, _D) -> + {remote, X}. + +calls(X) -> lists:reverse(calls(X, [])). + +calls({call,_,{atom,Ln,Func},Args}, L) -> + calls(Args, [{normalise(Ln),{Func,length(Args)}}|L]); +calls({call,_,{remote,_,{atom,Ln1,Mod},{atom,_Ln2,Func}}, Args}, L) -> + calls(Args, [{normalise(Ln1),{Mod,Func,length(Args)}}|L]); +calls(T, L) when is_tuple(T) -> + calls(tuple_to_list(T), L); +calls([], L) -> + L; +calls(T, L) when is_list(T) -> + lists:foldl(fun calls/2, L, T); +calls(_, L) -> + L. + +normalise({_Line,_Col}=X) -> + X; +normalise({Line,Col,_Len,_Text}) -> + {Line, Col}. + + +prelude(L) -> + ["\n" + "\n" + "\n" + "\n" + "
      \n",L,"\n
    "]. + + +final({Tag, Toks}) -> + {Tag, {taggedToks, final1(Tag, Toks)}}. + +final1({Tag,_,_}, Toks) when Tag =:= func; Tag =:= func1 -> + %% io:format("fix_remote:~p~n",[Toks]), + fix_remote(Toks); +final1({export,_}, Toks) -> + fix_exports(Toks); +final1({import,_}, Toks) -> + fix_imports(Toks); +final1(_, Toks) -> + %% io:format("final:~p~n",[X]), + Toks. + + +fix_imports(Toks) -> + %% io:format("fix imports:~p~n",[Toks]), + Mod = find_imported_module(Toks), + %% io:format("Mod =~p~n",[Mod]), + fix_imports(Toks, Mod). + +fix_imports([{atom,A},{terminal,"/"},{integer,N}|T], Mod) -> + [{remote, Mod,A,list_to_integer(N),A++"/"++N}| + fix_imports(T, Mod)]; +fix_imports([H|T], Mod) -> + [H|fix_imports(T, Mod)]; +fix_imports([], _) -> + []. + +%% skip to the atom import, then take the first atom after import +find_imported_module([{atom,"import"}|T]) -> find_imported_module1(T); +find_imported_module([_|T]) -> find_imported_module(T). + +find_imported_module1([{atom,M}|_]) -> list_to_atom(M); +find_imported_module1([_|T]) -> find_imported_module1(T). + +%% won't work if there is white space between the symbols +%% fix later + +fix_exports([{atom,A},{terminal,"/"},{integer,N}|T]) -> + [{local,A,list_to_integer(N),A++"/"++N}|fix_exports(T)]; +fix_exports([H|T]) -> + [H|fix_exports(T)]; +fix_exports([]) -> + []. + +%% fix_remote merges Mod : Func into a single string +%% the problem is that +%% we only tag the first atom in a remote call mod:func(...) +%% mod is tagged as remote - but we want to +%% extend the tagging to include the entire mod:func +%% call ... + +fix_remote([{remote,M,F,A,Str},{terminal,":"},{atom,Str1}|T]) -> + [{remote,M,F,A,Str ++ ":" ++ Str1}|fix_remote(T)]; +fix_remote([{remote,M,F,A,Str},{white_space,S1},{terminal,":"},{atom,Str1}|T]) -> + [{remote,M,F,A,Str ++ S1 ++ ":" ++ Str1}|fix_remote(T)]; +fix_remote([{remote,M,F,A,Str},{white_space,S1},{terminal,":"},{white_space,S2},{atom,Str1}|T]) -> + [{remote,M,F,A,Str ++ S1 ++ ":" ++ S2 ++ Str1}|fix_remote(T)]; +fix_remote([{remote,M,F,A,Str},{terminal,":"},{white_space,S2},{atom,Str1}|T]) -> + [{remote,M,F,A,Str ++ ":" ++ S2 ++ Str1}|fix_remote(T)]; +fix_remote([H|T]) -> + [H|fix_remote(T)]; +fix_remote([]) -> + []. + +-spec is_keyword(atom()) -> bool(). + +is_keyword('after' ) -> true; +is_keyword('and') -> true; +is_keyword('andalso' ) -> true; +is_keyword('band' ) -> true; +is_keyword('begin' ) -> true; +is_keyword('bnot' ) -> true; +is_keyword('bor' ) -> true; +is_keyword('bsl' ) -> true; +is_keyword('bsr' ) -> true; +is_keyword('bxor' ) -> true; +is_keyword('case' ) -> true; +is_keyword('catch' ) -> true; +is_keyword('cond') -> true; +is_keyword('div' ) -> true; +is_keyword('end' ) -> true; +is_keyword('fun' ) -> true; +is_keyword('if' ) -> true; +is_keyword('not') -> true; +is_keyword('of' ) -> true; +is_keyword('or' ) -> true; +is_keyword('orelse' ) -> true; +is_keyword('query' ) -> true; +is_keyword('receive' ) -> true; +is_keyword('rem' ) -> true; +is_keyword('spec') -> true; +is_keyword('try' ) -> true; +is_keyword('when') -> true; +is_keyword('xor') -> true; +is_keyword(_) -> false. + +is_terminal('!') -> true; +is_terminal('#') -> true; +is_terminal('(') -> true; +is_terminal(')') -> true; +is_terminal('*') -> true; +is_terminal('+') -> true; +is_terminal('++') -> true; +is_terminal(',') -> true; +is_terminal('-') -> true; +is_terminal('--') -> true; +is_terminal('->') -> true; +is_terminal('.') -> true; +is_terminal('/') -> true; +is_terminal('/=') -> true; +is_terminal(':') -> true; +is_terminal(':-') -> true; +is_terminal('::') -> true; +is_terminal(';') -> true; +is_terminal('<') -> true; +is_terminal('<-') -> true; +is_terminal('<<') -> true; +is_terminal('<=') -> true; +is_terminal('=') -> true; +is_terminal('=/=') -> true; +is_terminal('=:=') -> true; +is_terminal('=<') -> true; +is_terminal('==') -> true; +is_terminal('>') -> true; +is_terminal('>=') -> true; +is_terminal('>>') -> true; +is_terminal('?') -> true; +is_terminal('[') -> true; +is_terminal(']') -> true; +is_terminal('{') -> true; +is_terminal('|') -> true; +is_terminal('||') -> true; +is_terminal('}') -> true; +is_terminal(_) -> false. Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/wx/examples/demo/erlang.png and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/wx/examples/demo/erlang.png differ diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_aui.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_aui.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_aui.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_aui.erl 2009-09-18 15:11:29.000000000 +0100 @@ -0,0 +1,189 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(ex_aui). + +-behaviour(wx_object). + +%% Client API +-export([start/1]). + +%% wx_object callbacks +-export([init/1, terminate/2, code_change/3, + handle_info/2, handle_call/3, handle_event/2]). + +-include("../../include/wx.hrl"). + +-record(state, + { + parent, + config + }). + +start(Config) -> + wx_object:start_link(?MODULE, Config, []). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +init(Config) -> + wx:batch(fun() -> do_init(Config) end). + +-define(pi, wxAuiPaneInfo). + +do_init(Config) -> + Parent = proplists:get_value(parent, Config), + Panel = wxPanel:new(Parent, []), + + %% Setup sizers + MainSizer = wxBoxSizer:new(?wxVERTICAL), + + Manager = wxAuiManager:new([{managed_wnd, Panel} + ]), + + Pane = ?pi:new(), + ?pi:closeButton(Pane), + ?pi:right(Pane), + ?pi:dockable(Pane, [{b, true}]), + ?pi:floatingSize(Pane, 300,200), + ?pi:minSize(Pane, {50,50}), + ?pi:paneBorder(Pane), + ?pi:floatable(Pane, [{b, true}]), + + create_pane(Panel, Manager, Pane), + create_pane(Panel, Manager, + ?pi:caption(?pi:top(?pi:new(Pane)), "One")), + create_pane(Panel, Manager, + ?pi:caption(?pi:left(?pi:new(Pane)), "two")), + create_pane(Panel, Manager, + ?pi:caption(?pi:bottom(?pi:new(Pane)), "Three")), + Pane2 = wxAuiPaneInfo:new(Pane), + ?pi:centrePane(Pane2), + create_notebook(Panel, Manager, ?pi:new(Pane2)), + + wxPanel:setSizer(Panel, MainSizer), + + wxAuiManager:connect(Manager, aui_pane_button, [{skip,true}]), + wxAuiManager:connect(Manager, aui_pane_maximize, [{skip,true}]), + wxAuiManager:update(Manager), + + {Panel, #state{parent=Panel, config=Config}}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + +%% Async Events are handled in handle_event as in handle_info +handle_event(#wx{obj = Notebook, + event = #wxCommand{type = command_button_clicked}}, + State) -> + Tab = wxPanel:new(Notebook, []), + wxButton:new(Tab, ?wxID_ANY, [{label,"New tab"}]), + wxAuiNotebook:insertPage(Notebook, 1, Tab, "OMG TAB!! ", [{select, false}]), + {noreply, State}; +handle_event(#wx{obj = Notebook, + event = #wxAuiNotebook{type = command_auinotebook_page_changed, + selection = Sel}}, State) -> + demo:format(State#state.config, "You have changed page to ~p.\n", + [wxAuiNotebook:getPageText(Notebook, Sel)]), + {noreply, State}; +handle_event(#wx{event = #wxAuiNotebook{type = command_auinotebook_page_close}}, State) -> + demo:format(State#state.config, "You have closed a page.\n",[]), + {noreply, State}; +handle_event(#wx{event = #wxAuiManager{type = aui_pane_button, + button = Button}}, State) -> + case Button of + ?wxAUI_BUTTON_CLOSE -> + demo:format(State#state.config, "You have closed a pane.\n",[]); + ?wxAUI_BUTTON_MAXIMIZE_RESTORE -> + ok; + ?wxAUI_BUTTON_PIN -> + demo:format(State#state.config, "You have pinned a pane.\n",[]) + end, + {noreply, State}; +handle_event(#wx{event = #wxAuiManager{type = aui_pane_maximize}}, State) -> + demo:format(State#state.config, "You have maximized a pane.\n",[]), + {noreply, State}; +handle_event(#wx{event = #wxAuiManager{type = aui_pane_restore}}, State) -> + demo:format(State#state.config, "You have restored a pane.\n",[]), + {noreply, State}; +handle_event(Ev = #wx{}, State) -> + io:format("~p\n", [Ev]), + {noreply, State}. + + +code_change(_, _, State) -> + {stop, ignore, State}. + +terminate(_Reason, _State) -> + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Local functions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +create_notebook(Parent, Manager, Pane) -> + Style = (0 + bor ?wxAUI_NB_DEFAULT_STYLE + bor ?wxAUI_NB_TOP + bor ?wxAUI_NB_WINDOWLIST_BUTTON + bor ?wxAUI_NB_CLOSE_ON_ACTIVE_TAB + bor ?wxAUI_NB_TAB_MOVE + bor ?wxAUI_NB_SCROLL_BUTTONS + ), + + Notebook = wxAuiNotebook:new(Parent, [{style, Style}]), + + Tab1 = wxPanel:new(Notebook, []), + wxPanel:setBackgroundColour(Tab1, ?wxBLACK), + wxButton:new(Tab1, ?wxID_ANY, [{label,"New tab"}]), + wxAuiNotebook:addPage(Notebook, Tab1, "You can", []), + + Tab2 = wxPanel:new(Notebook, []), + wxPanel:setBackgroundColour(Tab2, ?wxRED), + wxButton:new(Tab2, ?wxID_ANY, [{label,"New tab"}]), + wxAuiNotebook:addPage(Notebook, Tab2, "rearrange", []), + + Tab3 = wxPanel:new(Notebook, []), + wxPanel:setBackgroundColour(Tab3, ?wxGREEN), + wxButton:new(Tab3, ?wxID_ANY, [{label,"New tab"}]), + wxAuiNotebook:addPage(Notebook, Tab3, "these tabs", []), + + wxAuiManager:addPane(Manager, Notebook, Pane), + + wxAuiNotebook:connect(Notebook, command_button_clicked), + wxAuiNotebook:connect(Notebook, command_auinotebook_page_close, [{skip, false}]), + wxAuiNotebook:connect(Notebook, command_auinotebook_page_changed), + Notebook. + + +create_pane(Parent, Manager, Pane) -> + TextCtrl = wxTextCtrl:new(Parent, ?wxID_ANY, [{size, {300,200}}, + {value, "An empty pane"}, + {style, 0 + bor ?wxDEFAULT + bor ?wxTE_MULTILINE}]), + wxAuiManager:addPane(Manager, TextCtrl, Pane), + TextCtrl. + + diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_button.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_button.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_button.erl 2009-06-05 13:54:36.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_button.erl 2009-09-18 15:11:19.000000000 +0100 @@ -24,7 +24,7 @@ -include_lib("wx/include/wx.hrl"). --behavoiur(wx_object). +-behaviour(wx_object). -export([start/1, init/1, terminate/2, code_change/3, handle_info/2, handle_call/3, handle_event/2]). @@ -40,18 +40,21 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(Config) -> wx:batch(fun() -> do_init(Config) end). + do_init(Config) -> Parent = proplists:get_value(parent, Config), Panel = wxScrolledWindow:new(Parent), %% Setup sizers Sz = wxBoxSizer:new(?wxVERTICAL), - - SzFlags = [{proportion, 0}, {border, 4}, {flag, ?wxALL}], - Expand = [{proportion, 0}, {border, 4}, {flag, ?wxALL bor ?wxEXPAND}], - ButtSz = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, [{label, "wxButton"}]), + AlignSz = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, + [{label, "Alignment Style"}]), + OtherSz = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, + [{label, "Other Styles"}]), + StockTopSz = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, + [{label, "Stock Buttons"}]), B10 = wxButton:new(Panel, 10, [{label,"Normal"}]), wxButton:setToolTip(B10, "Normal button with (default) centered label"), @@ -70,57 +73,105 @@ B14 = wxBitmapButton:new(Panel, 14, create_bitmap("A bitmap button")), wxButton:setToolTip(B14, "A Bitmap button"), - [wxSizer:add(ButtSz, Button, SzFlags) || Button <- [B10, B11, B12, B13, B14]], - %% Alignment and NO_BORDER only works on Win and GTK according to docs. - AlignSz = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, - [{label, "Alignment Style"}]), - - B20 = wxButton:new(Panel, 20, [{label,"Left Aligned"}, {size, {100, -1}}, + %% Alignment and NO_BORDER only works on Win and GTK + %% according to docs. + B20 = wxButton:new(Panel, 20, [{label,"Left Aligned"}, + {size, {100, -1}}, {style,?wxBU_LEFT}]), wxButton:setToolTip(B20, "Normal button with left aligned label"), - B21 = wxButton:new(Panel, 21, [{label,"Top Aligned"}, {size, {-1, 50}}, - {style,?wxBU_TOP}]), + B21 = wxButton:new(Panel, 21, [{label,"Top Aligned"}, + {size, {-1, 50}}, + {style,?wxBU_TOP}]), wxButton:setToolTip(B21, "Normal button with top aligned label"), - B22 = wxButton:new(Panel, 22, [{label,"Lower Right Aligned"}, {size, {150, 50}}, - {style,?wxBU_BOTTOM bor ?wxBU_RIGHT}]), + B22 = wxButton:new(Panel, 22, [{label,"Lower Right Aligned"}, + {size, {150, 50}}, + {style,?wxBU_BOTTOM bor ?wxBU_RIGHT}]), wxButton:setToolTip(B22, "Normal button with top right aligned label"), - [wxSizer:add(AlignSz, Button, SzFlags) || Button <- [B20,B21,B22]], %% Other types - OtherSz = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, - [{label, "Other Styles"}]), - - B30 = wxButton:new(Panel, 30, [{label,"Flat Style"}, {style, ?wxNO_BORDER}]), + B30 = wxButton:new(Panel, 30, [{label,"Flat Style"}, + {style, ?wxNO_BORDER}]), wxButton:setToolTip(B30, "Flat style button, on some OS'es"), - B31 = wxButton:new(Panel, 31, [{label,"Exact Fit"}, {style, ?wxBU_EXACTFIT}]), + B31 = wxButton:new(Panel, 31, [{label,"Exact Fit"}, + {style, ?wxBU_EXACTFIT}]), wxButton:setToolTip(B31, "Minimal Size button"), - [wxSizer:add(OtherSz, Button, SzFlags) || Button <- [B30,B31]], - %% Stock Buttons - StockTopSz = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, - [{label, "Stock Buttons"}]), + StockButts = [wxButton:new(Panel, Id) || Id <- stock_buttons()], - StockButts = [wxButton:new(Panel, Id) || Id <- stock_buttons()], StockSz = wxGridSizer:new(0,5,3,3), + + SzFlags = [{proportion, 0}, {border, 4}, {flag, ?wxALL}], + Expand = [{proportion, 0}, {border, 4}, {flag, ?wxALL bor + ?wxEXPAND}], + [wxSizer:add(ButtSz, Button, SzFlags) || + Button <- [B10, B11, B12, B13, B14]], + [wxSizer:add(AlignSz, Button, SzFlags) || Button <- [B20,B21,B22]], + [wxSizer:add(OtherSz, Button, SzFlags) || Button <- [B30,B31]], [wxSizer:add(StockSz, Butt, SzFlags) || Butt <- StockButts], wxSizer:add(StockTopSz, StockSz, SzFlags), - - %% Add to Main sizer [wxSizer:add(Sz, Button, Flag) || {Button, Flag} <- [{ButtSz,SzFlags},{AlignSz,Expand}, {OtherSz,Expand}, {StockTopSz, Expand}]], - wxWindow:connect(Panel, command_button_clicked), wxWindow:setSizer(Panel, Sz), wxSizer:layout(Sz), wxScrolledWindow:setScrollRate(Panel, 5, 5), {Panel, #state{parent=Panel, config=Config}}. + +%%%%%%%%%%%% +%% Async Events are handled in handle_event as in handle_info +handle_event(#wx{id=Id, event=#wxCommand{type=command_button_clicked}}, + State = #state{parent=Parent}) -> + B0 = wxWindow:findWindowById(Id, [{parent, Parent}]), + Butt = wx:typeCast(B0, wxButton), + Label = wxButton:getLabel(Butt), + demo:format(State#state.config,"Button: \'~ts\' clicked~n",[Label]), + {noreply,State}; + +handle_event(#wx{event=#wxCommand{type=command_togglebutton_clicked}}, + State = #state{}) -> + demo:format(State#state.config, + "Button: You toggled the 'Toggle button' ~n",[]), + {noreply,State}; + +handle_event(Ev = #wx{}, State = #state{}) -> + demo:format(State#state.config,"Got Event ~p~n",[Ev]), + {noreply,State}. + +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p~n",[Msg]), + {noreply,State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config,"Got Call ~p~n",[Msg]), + {reply,ok,State}. + +code_change(_, _, State) -> + {stop, ignore, State}. + +terminate(_Reason, _State) -> + ok. + +%%%%% a copy from wxwidgets samples. +create_bitmap(Label) -> + Bmp = wxBitmap:new(140, 30), + DC = wxMemoryDC:new(), + wxMemoryDC:selectObject(DC, Bmp), + wxDC:setBackground(DC, ?wxWHITE_BRUSH), + wxDC:clear(DC), + wxDC:setTextForeground(DC, ?wxBLUE), + wxDC:drawLabel(DC, Label, {5,5,130,20}, [{alignment, ?wxALIGN_CENTER}]), + wxMemoryDC:destroy(DC), + Bmp. + + stock_buttons() -> [?wxID_ABOUT, ?wxID_ADD, @@ -177,51 +228,3 @@ ?wxID_ZOOM_IN, ?wxID_ZOOM_OUT]. - -%%%%%%%%%%%% -%% Async Events are handled in handle_event as in handle_info -handle_event(#wx{id=Id, event=#wxCommand{type=command_button_clicked}}, - State = #state{parent=Parent}) -> - B0 = wxWindow:findWindowById(Id, [{parent, Parent}]), - Butt = wx:typeCast(B0, wxButton), - Label = wxButton:getLabel(Butt), - demo:format(State#state.config,"Button: \'~ts\' clicked~n",[Label]), - {noreply,State}; - -handle_event(#wx{event=#wxCommand{type=command_togglebutton_clicked}}, - State = #state{}) -> - demo:format(State#state.config,"Button: You toggled the 'Toggle button' ~n",[]), - {noreply,State}; - -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config,"Got Event ~p~n",[Ev]), - {noreply,State}. - -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p~n",[Msg]), - {noreply,State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config,"Got Call ~p~n",[Msg]), - {reply,ok,State}. - -code_change(_, _, State) -> - {stop, ignore, State}. - -terminate(_Reason, _State) -> - ok. - -%%%%% a copy from wxwidgets samples. -create_bitmap(Label) -> - Bmp = wxBitmap:new(140, 30), - DC = wxMemoryDC:new(), - wxMemoryDC:selectObject(DC, Bmp), - wxDC:setBackground(DC, ?wxWHITE_BRUSH), - wxDC:clear(DC), - wxDC:setTextForeground(DC, ?wxBLUE), - wxDC:drawLabel(DC, Label, {5,5,130,20}, [{alignment, ?wxALIGN_CENTER}]), - wxMemoryDC:destroy(DC), - Bmp. - - diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_canvas.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_canvas.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_canvas.erl 2009-06-05 13:54:40.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_canvas.erl 2009-09-18 15:11:26.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_canvas). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -52,38 +52,34 @@ MainSizer = wxBoxSizer:new(?wxVERTICAL), Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "Various shapes"}]), + Button = wxButton:new(Panel, ?wxID_ANY, [{label, "Redraw"}]), - Canvas = wxPanel:new(Panel, []), + Canvas = wxPanel:new(Panel, [{style, ?wxFULL_REPAINT_ON_RESIZE}]), + + wxPanel:connect(Canvas, paint, [callback]), + wxPanel:connect(Canvas, size), + wxPanel:connect(Button, command_button_clicked), %% Add to sizers - wxSizer:add(Sizer, Button), + wxSizer:add(Sizer, Button, [{border, 5}, {flag, ?wxALL}]), + wxSizer:addSpacer(Sizer, 5), wxSizer:add(Sizer, Canvas, [{flag, ?wxEXPAND}, {proportion, 1}]), wxSizer:add(MainSizer, Sizer, [{flag, ?wxEXPAND}, {proportion, 1}]), - {W,H} = wxPanel:getSize(Canvas), - Bitmap = wxBitmap:new(W,H), - - wxPanel:connect(Canvas, paint, [callback]), - wxPanel:connect(Canvas, size), - wxPanel:connect(Button, command_button_clicked), wxPanel:setSizer(Panel, MainSizer), + wxSizer:layout(MainSizer), + + {W,H} = wxPanel:getSize(Canvas), + Bitmap = wxBitmap:new(erlang:max(W,30),erlang:max(30,H)), + {Panel, #state{parent=Panel, config=Config, canvas = Canvas, bitmap = Bitmap}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), - {reply,{error, nyi}, State}. - %% Sync event from callback events, paint event must be handled in callbacks %% otherwise nothing will be drawn on windows. handle_sync_event(#wx{event = #wxPaint{}}, _wxObj, @@ -106,8 +102,8 @@ Positions = lists:map(fun(_) -> get_pos(W,H) end, lists:seq(1,(W+H) div 20)), - draw(State#state.canvas, State#state.bitmap, fun(DC) -> wxDC:clear(DC) end), Fun = fun(DC) -> + wxDC:clear(DC), lists:foreach(fun({X,Y}=Pos) -> wxDC:setBrush(DC, ?wxTRANSPARENT_BRUSH), wxDC:setPen(DC, wxPen:new(?wxBLACK, [{width, 2}])), @@ -126,11 +122,11 @@ end end, Positions) end, - draw(State#state.canvas, State#state.bitmap, Fun), + draw(State#state.canvas, State#state.bitmap, Fun), wxBitmap:destroy(Bmp), {noreply, State}; -handle_event(#wx{event = #wxSize{size = {W,H}}}, - State = #state{bitmap = Prev}) -> +handle_event(#wx{event = #wxSize{size={W,H}}}, + State = #state{bitmap=Prev}) -> Bitmap = wxBitmap:new(W,H), draw(State#state.canvas, Bitmap, fun(DC) -> wxDC:clear(DC) end), wxBitmap:destroy(Prev), @@ -139,6 +135,15 @@ demo:format(State#state.config, "Got Event ~p\n", [Ev]), {noreply, State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + code_change(_, _, State) -> {stop, ignore, State}. @@ -152,27 +157,21 @@ %% Buffered makes it all appear on the screen at the same time draw(Canvas, Bitmap, Fun) -> MemoryDC = wxMemoryDC:new(Bitmap), - CDC = wxClientDC:new(Canvas), - Fun(MemoryDC), - + + CDC = wxWindowDC:new(Canvas), wxDC:blit(CDC, {0,0}, {wxBitmap:getWidth(Bitmap), wxBitmap:getHeight(Bitmap)}, - MemoryDC, {0,0}), - - wxClientDC:destroy(CDC), + MemoryDC, {0,0}), + wxWindowDC:destroy(CDC), wxMemoryDC:destroy(MemoryDC). - redraw(DC, Bitmap) -> MemoryDC = wxMemoryDC:new(Bitmap), - wxDC:blit(DC, {0,0}, {wxBitmap:getWidth(Bitmap), wxBitmap:getHeight(Bitmap)}, MemoryDC, {0,0}), - wxMemoryDC:destroy(MemoryDC). - get_pos(W,H) -> {random:uniform(W), random:uniform(H)}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_canvas_paint.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_canvas_paint.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_canvas_paint.erl 2009-06-05 13:54:40.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_canvas_paint.erl 2009-09-18 15:11:26.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_canvas_paint). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -50,30 +50,37 @@ do_init(Config) -> Parent = proplists:get_value(parent, Config), Panel = wxPanel:new(Parent, []), - + %% Setup sizers MainSizer = wxBoxSizer:new(?wxVERTICAL), Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "wxDC"}]), + + %% Create the window to paint on and make it repaint the whole window on resize Canvas = wxPanel:new(Panel, [{style, ?wxFULL_REPAINT_ON_RESIZE}]), - wxPanel:setToolTip(Panel, + wxPanel:setToolTip(Canvas, "Left-click and hold to draw something - release to stop drawing.\n" "Middle-click to fill with pink\n" "Middle-dclick to fill with white.\n" "Right-click to clear."), + %% Create a wxPen and a WxBrush and set its colors to draw with Brush = wxBrush:new(?wxWHITE), Pen = wxPen:new(?wxBLACK, [{width, 2}]), + + PrintButton = wxButton:new(Panel, ?wxID_ANY, [{label, "Print"}]), + + Bitmap = wxBitmap:new(30,30), %% Add to sizers wxSizer:add(Sizer, Canvas, [{flag, ?wxEXPAND}, {proportion, 1}]), + wxSizer:add(MainSizer, PrintButton, []), wxSizer:add(MainSizer, Sizer, [{flag, ?wxEXPAND}, {proportion, 1}]), - {W,H} = wxPanel:getSize(Canvas), - Bitmap = wxBitmap:new(W,H), + wxPanel:connect(PrintButton, command_button_clicked), wxPanel:connect(Canvas, paint, [callback]), wxPanel:connect(Canvas, size), wxPanel:connect(Canvas, left_down), @@ -89,15 +96,6 @@ brush = Brush, bitmap = Bitmap}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), - {reply,{error, nyi}, State}. - %% Sync event from callback events, paint event must be handled in callbacks %% otherwise nothing will be drawn on windows. handle_sync_event(#wx{event = #wxPaint{}}, _wxObj, #state{canvas=Canvas, bitmap=Bitmap}) -> @@ -106,18 +104,57 @@ wxPaintDC:destroy(DC), ok. -%% Async Events are handled in handle_event as in handle_info +%% Print what's drawn +handle_event(#wx{event = #wxCommand{type = command_button_clicked}}, + State = #state{bitmap=Bitmap}) -> + PD = wxPrintData:new(), + PDD = wxPrintDialogData:new(PD), + PSDD = wxPageSetupDialogData:new(PD), + Fun = + fun(This,_Page) -> + MX = MY = 500, + wxPrintout:fitThisSizeToPageMargins(This, {MX,MY}, PSDD), + {_X,_Y,W,H} = wxPrintout:getLogicalPageMarginsRect(This, PSDD), + wxPrintout:offsetLogicalOrigin(This,(W-MX) div 2, (H-MY) div 2), + DC = wxPrintout:getDC(This), + redraw(DC, Bitmap), + true + end, + Printout1 = wxPrintout:new("Print", Fun, + [{getPageInfo, fun getPageInfo/1}]), + Printout2 = wxPrintout:new("Print", Fun, + [{getPageInfo, fun getPageInfo/1}]), + Preview = wxPrintPreview:new(Printout1, [{printoutForPrinting,Printout2},{data,PDD}]), + case wxPrintPreview:isOk(Preview) of + true -> + Env = wx:get_env(), + spawn_link(fun() -> + wx:set_env(Env), + PF = wxPreviewFrame:new(Preview, State#state.parent, []), + wxPreviewFrame:centre(PF, [{dir, ?wxBOTH}]), + wxPreviewFrame:initialize(PF), + wxPreviewFrame:centre(PF), + wxPreviewFrame:show(PF) + end); + false -> + io:format("Could not create preview window.\n" + "Perhaps your current printer is not set correctly?~n", []), + wxPrintPreview:destroy(Preview) + end, + {noreply, State#state{}}; %% Draw a line handle_event(#wx{event = #wxMouse{type = motion, x = X, y = Y}}, State = #state{canvas = Canvas, pen = Pen, brush = Brush}) -> Fun = - fun(DC) -> wxDC:setPen(DC, Pen), - wxBrush:setColour(Brush, ?wxBLACK), - wxDC:setBrush(DC, Brush), - wxDC:drawLine(DC, {X,Y}, State#state.old_pos) + fun(DC) -> + wxDC:setPen(DC, Pen), + wxBrush:setColour(Brush, ?wxBLACK), + wxDC:setBrush(DC, Brush), + wxDC:drawLine(DC, {X,Y}, State#state.old_pos) end, draw(Canvas,State#state.bitmap, Fun), {noreply, State#state{old_pos = {X,Y}}}; +%% Resize event handle_event(#wx{event = #wxSize{size = {W,H}}}, State = #state{bitmap=Prev}) -> wxBitmap:destroy(Prev), Bitmap = wxBitmap:new(W,H), @@ -129,24 +166,30 @@ handle_event(#wx{event = #wxMouse{type = left_down,x = X,y = Y}}, State = #state{}) -> wxPanel:connect(State#state.canvas, motion), {noreply, State#state{old_pos = {X,Y}}}; - %% Fill with pink color handle_event(#wx{event = #wxMouse{type = middle_down,x = X, y =Y}}, State = #state{}) -> + case os:type() of + {_, darwin} -> + io:format("Fill doesn't work on Darwin ~n",[]); + _ -> + ok + end, Fun = - fun(DC) -> wxBrush:setColour(State#state.brush, {255,125,255,255}), - wxDC:setBrush(DC, State#state.brush), - wxDC:floodFill(DC, {X,Y}, ?wxBLACK, [{style, ?wxFLOOD_BORDER}]) + fun(DC) -> + wxBrush:setColour(State#state.brush, {255,125,255,255}), + wxDC:setBrush(DC, State#state.brush), + wxDC:floodFill(DC, {X,Y}, ?wxBLACK, [{style, ?wxFLOOD_BORDER}]) end, draw(State#state.canvas, State#state.bitmap, Fun), {noreply, State}; - %% Fill with white color handle_event(#wx{event = #wxMouse{type = middle_dclick,x = X, y =Y}}, State = #state{}) -> Fun = - fun(DC) -> wxBrush:setColour(State#state.brush, ?wxWHITE), - wxDC:setBrush(DC, State#state.brush), - wxDC:floodFill(DC, {X,Y}, ?wxBLACK, [{style, ?wxFLOOD_BORDER}]) + fun(DC) -> + wxBrush:setColour(State#state.brush, ?wxWHITE), + wxDC:setBrush(DC, State#state.brush), + wxDC:floodFill(DC, {X,Y}, ?wxBLACK, [{style, ?wxFLOOD_BORDER}]) end, draw(State#state.canvas, State#state.bitmap,Fun), @@ -154,13 +197,20 @@ handle_event(#wx{event = #wxMouse{type = left_up}}, State = #state{}) -> wxPanel:disconnect(State#state.canvas, motion), {noreply, State}; +%% Clear the DC handle_event(#wx{event = #wxMouse{type = right_down}}, State = #state{}) -> draw(State#state.canvas, State#state.bitmap, fun(DC) -> wxDC:clear(DC) end), - {noreply, State}; -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config, "Got Event ~p\n", [Ev]), {noreply, State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + code_change(_, _, State) -> {stop, ignore, State}. @@ -184,7 +234,6 @@ wxClientDC:destroy(CDC), wxMemoryDC:destroy(MemoryDC). - redraw(DC, Bitmap) -> MemoryDC = wxMemoryDC:new(Bitmap), @@ -195,3 +244,5 @@ wxMemoryDC:destroy(MemoryDC). +getPageInfo(_This) -> + {1,1,1,1}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_choices.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_choices.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_choices.erl 2009-06-05 13:54:38.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_choices.erl 2009-09-18 15:11:22.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_choices). --behavoiur(wx_object). +-behaviour(wx_object). -export([start/1, init/1, terminate/2, code_change/3, handle_info/2, handle_call/3, handle_event/2]). @@ -39,6 +39,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(Config) -> wx:batch(fun() -> do_init(Config) end). + do_init(Config) -> Parent = proplists:get_value(parent, Config), Panel = wxScrolledWindow:new(Parent, []), @@ -47,52 +48,53 @@ MainSizer = wxBoxSizer:new(?wxVERTICAL), ListBoxSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "wxListBox"}]), + + ChoiceSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, + [{label, "wxChoice"}]), + SpinSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, + [{label, "wxSpinCtrl"}]), + ComboSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, + [{label, "wxComboBox"}]), Sizer = wxBoxSizer:new(?wxHORIZONTAL), - Sizer2 = wxBoxSizer:new(?wxHORIZONTAL), + Sizer3 = wxBoxSizer:new(?wxHORIZONTAL), Choices = ["one","two","three", "four","five","six", "seven","eight","nine", "ten", "eleven", "twelve"], - %%================%% - %% ListBox %% - %%================%% + %% Create a wxListBox that uses multiple selection ListBox = wxListBox:new(Panel, 1, [{size, {-1,100}}, {choices, ["Multiple selection"|Choices]}, {style, ?wxLB_MULTIPLE}]), + wxListBox:setToolTip(ListBox, "A wxListBox with multiple selection"), + + %% Create a wxListBox that uses single selection ListBox2 = wxListBox:new(Panel, 2, [{size, {-1,100}}, {choices, ["Single selection"|Choices]}, {style, ?wxLB_SINGLE}]), + wxListBox:setToolTip(ListBox2, "A wxListBox with single selection"), - %%================%% - %% Choice %% - %%================%% - Sizer3 = wxBoxSizer:new(?wxHORIZONTAL), - ChoiceSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, - [{label, "wxChoice"}]), + %% Create a wxChoice Choice = wxChoice:new(Panel, 4, [{choices, Choices}]), - wxChoice:connect(Choice,command_choice_selected), - %%================%% - %% SpinCtrl %% - %%================%% - SpinSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, - [{label, "wxSpinCtrl"}]), + wxChoice:setToolTip(Choice, "A wxChoice"), + + %% Create a wxSpinCtrl with range between 0 and 100 SpinCtrl = wxSpinCtrl:new(Panel, []), wxSpinCtrl:setRange(SpinCtrl, 0, 100), - wxChoice:connect(SpinCtrl,command_spinctrl_updated), - %%================%% - %% ComboBox %% - %%================%% - ComboSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, - [{label, "wxComboBox"}]), + wxSpinCtrl:setToolTip(SpinCtrl, "A wxSpinCtrl with range from 0 to 100"), + + %% Create a wxComboBox and set the value to "Default value" ComboBox = wxComboBox:new(Panel, 5, [{choices, Choices}]), - wxComboBox:setValue(ComboBox, "Default value"), + wxComboBox:setToolTip(ComboBox, "A wxComboBox"), + + + wxChoice:connect(Choice,command_choice_selected), + wxSpinCtrl:connect(SpinCtrl,command_spinctrl_updated), wxComboBox:connect(ComboBox, command_combobox_selected), - %%================%% - %% Add to sizers %% - %%================%% + + %% Add to sizers Options = [{border,4}, {flag, ?wxALL}], wxSizer:add(Sizer, ListBox, Options), wxSizer:add(Sizer, ListBox2, Options), @@ -105,7 +107,6 @@ wxSizer:add(ComboSizer, ComboBox, Options), wxSizer:add(ListBoxSizer, Sizer, Options), - wxSizer:add(ListBoxSizer, Sizer2, Options), wxSizer:add(MainSizer, ListBoxSizer, Options), wxSizer:add(MainSizer, Sizer3, Options), wxSizer:add(MainSizer, ComboSizer, Options), @@ -116,15 +117,6 @@ list_box = ListBox}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n",[Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config,"Got Call ~p\n",[Msg]), - {reply, {error,nyi}, State}. - %% Async Events are handled in handle_event as in handle_info handle_event(#wx{obj = ComboBox, event = #wxCommand{type = command_combobox_selected}}, @@ -146,6 +138,15 @@ demo:format(State#state.config,"Got Event ~p\n",[Ev]), {noreply, State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n",[Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config,"Got Call ~p\n",[Msg]), + {reply, {error,nyi}, State}. + code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_cursor.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_cursor.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_cursor.erl 2009-06-05 13:54:40.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_cursor.erl 2009-09-18 15:11:26.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_cursor). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -47,9 +47,15 @@ do_init(Config) -> Parent = proplists:get_value(parent, Config), Panel = wxScrolledWindow:new(Parent, []), - wxScrolledWindow:setScrollRate(Panel, 5,5), + %% Setup sizers MainSizer = wxBoxSizer:new(?wxVERTICAL), + MiscSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, + [{label, "Misc"}]), + StaticBoxSizer = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, + [{label, "Test the cursor here"}]), + CursorSizer = wxBoxSizer:new(?wxHORIZONTAL), + CursorLabels = [Cursor || {Cursor, _} <- cursors()], StockCursors = wxRadioBox:new(Panel, ?wxID_ANY, "Stock cursors", ?wxDefaultPosition, @@ -73,38 +79,27 @@ - MiscSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, - [{label, "Misc"}]), Win = wxWindow:new(Panel, ?wxID_ANY, [{size, {300,300}}]), - StaticBoxSizer = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, [{label, "Test the cursor here"}]), ToggleButton = wxToggleButton:new(Panel, ?wxID_ANY, "Begin busy cursor", []), %% Add to sizers - CursorSizer = wxBoxSizer:new(?wxHORIZONTAL), wxSizer:add(CursorSizer, StockCursors), wxSizer:add(StaticBoxSizer, Win), wxSizer:add(CursorSizer, StaticBoxSizer), wxSizer:add(MiscSizer, ToggleButton), - wxToggleButton:connect(ToggleButton, command_togglebutton_clicked, []), wxSizer:add(MainSizer, CursorSizer), wxSizer:add(MainSizer, MiscSizer), + + wxToggleButton:connect(ToggleButton, command_togglebutton_clicked, []), wxRadioBox:connect(StockCursors, command_radiobox_selected, []), + wxScrolledWindow:setScrollRate(Panel, 5,5), wxPanel:setSizer(Panel, MainSizer), {Panel, #state{parent=Panel, config=Config, win = Win}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), - {reply,{error, nyi}, State}. - %% Async Events are handled in handle_event as in handle_info handle_event(#wx{event = #wxCommand{type = command_radiobox_selected, cmdString = String}}, @@ -131,6 +126,15 @@ demo:format(State#state.config, "Got Event ~p\n", [Ev]), {noreply, State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_dialogs.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_dialogs.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_dialogs.erl 2009-06-05 13:54:39.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_dialogs.erl 2009-09-18 15:11:25.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_dialogs). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -54,6 +54,7 @@ MainSizer = wxBoxSizer:new(?wxVERTICAL), Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "Dialogs"}]), + Buttons = [wxButton:new(Panel, 1, [{label, "wxDirDialog"}]), wxButton:new(Panel, 2, [{label, "wxFileDialog"}]), @@ -98,15 +99,6 @@ dialogs = Dialogs, choices = Choices}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), - {reply,{error, nyi}, State}. - %% Async Events are handled in handle_event as in handle_info handle_event(#wx{event = #wxCommand{type = command_button_clicked}, userData = Module}, @@ -152,6 +144,15 @@ demo:format(State#state.config, "Got Event ~p\n", [Ev]), {noreply, State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_frameutilities.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_frameutilities.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_frameutilities.erl 2009-06-05 13:54:39.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_frameutilities.erl 1970-01-01 01:00:00.000000000 +0100 @@ -1,201 +0,0 @@ -%% -%% %CopyrightBegin% -%% -%% Copyright Ericsson AB 2009. All Rights Reserved. -%% -%% The contents of this file are subject to the Erlang Public License, -%% Version 1.1, (the "License"); you may not use this file except in -%% compliance with the License. You should have received a copy of the -%% Erlang Public License along with this software. If not, it can be -%% retrieved online at http://www.erlang.org/. -%% -%% Software distributed under the License is distributed on an "AS IS" -%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See -%% the License for the specific language governing rights and limitations -%% under the License. -%% -%% %CopyrightEnd% - --module(ex_frameutilities). - --behavoiur(wx_object). - -%% Client API --export([start/1]). - -%% wx_object callbacks --export([init/1, terminate/2, code_change/3, - handle_info/2, handle_call/3, handle_event/2]). - --include_lib("wx/include/wx.hrl"). - --record(state, - { - parent, - config - }). - -start(Config) -> - wx_object:start_link(?MODULE, Config, []). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -init(Config) -> - wx:batch(fun() -> do_init(Config) end). - -do_init(Config) -> - Parent = proplists:get_value(parent, Config), - Panel = wxPanel:new(Parent, []), - - %% Setup sizers - MainSizer = wxBoxSizer:new(?wxVERTICAL), - Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, - [{label, "Utilities"}]), - - Button1 = wxButton:new(Panel, 1, [{label, "Open window"}]), - Button2 = wxButton:new(Panel, 2, [{label, "Open wxMiniFrame"}]), - Button3 = wxButton:new(Panel, 3, [{label, "Open erlang.org"}]), - %% Add to sizers - Options = [{proportion, 1}, {flag, ?wxEXPAND}], - wxSizer:add(Sizer, Button1, Options), - wxSizer:add(Sizer, Button2, Options), - wxSizer:add(Sizer, Button3, Options), - wxPanel:connect(Panel, command_button_clicked), - - wxSizer:add(MainSizer, Sizer), - - wxPanel:setSizer(Panel, MainSizer), - {Panel, #state{parent=Panel, config=Config}}. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), - {reply,{error, nyi}, State}. - -%% Async Events are handled in handle_event as in handle_info -handle_event(#wx{id = Id, - event = #wxCommand{type = command_menu_selected}}, - State = #state{}) -> - case Id of - ?wxID_NEW -> demo:format(State#state.config, "New\n", []); - ?wxID_OPEN -> demo:format(State#state.config, "Open\n", []); - ?wxID_COPY -> demo:format(State#state.config, "Copy\n", []); - ?wxID_PASTE -> demo:format(State#state.config, "Paste\n", []); - ?wxID_HELP -> - wx_misc:launchDefaultBrowser("http://erlang.org/doc/apps/wx/part_frame.html"); - _ -> ignore - end, - {noreply, State}; -handle_event(#wx{id = Id, - event = #wxCommand{type = command_button_clicked}}, - State = #state{}) -> - case Id of - 1 -> new_win(State#state.parent); - 2 -> new_mini_frame(State#state.parent); - 3 -> wx_misc:launchDefaultBrowser("http://erlang.org/"); - _ -> ignore - end, - {noreply, State}; -handle_event(#wx{userData = StatusBar, - event = #wxMouse{type = motion, x = X, y = Y}}, - State) -> - wxStatusBar:setStatusText(StatusBar, io_lib:format("Mouse position: ~p", [{X,Y}]), - [{number, 1}]), - {noreply, State}; -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config, "Got Event ~p\n", [Ev]), - {noreply, State}. - -code_change(_, _, State) -> - {stop, ignore, State}. - -terminate(_Reason, _State) -> - ok. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Local functions -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -new_win(Panel) -> - Frame = wxFrame:new(Panel, ?wxID_ANY, "Utilities", [{style, - ?wxCAPTION bor - ?wxCLIP_CHILDREN bor - ?wxCLOSE_BOX bor - ?wxFRAME_FLOAT_ON_PARENT bor - %%?wxFRAME_NO_TASKBAR bor - ?wxMAXIMIZE_BOX bor - ?wxMINIMIZE_BOX bor - ?wxRESIZE_BORDER bor - %%?wxSTAY_ON_TOP bor - ?wxSYSTEM_MENU - }]), - - %% Setup wxMenuBar - MB = wxMenuBar:new(), - File = wxMenu:new([]), - Help = wxMenu:new([]), - Mbar = wxMenu:new([]), - wxMenu:append(File, ?wxID_NEW, "New"), - wxMenu:append(File, ?wxID_OPEN, "Open"), - wxMenu:appendSeparator(File), - wxMenu:append(File, ?wxID_EXIT, "&Quit"), - wxMenu:append(Help, ?wxID_HELP, "Help"), - wxMenu:append(Mbar, ?wxID_ANY, "Test item 1"), - wxMenu:append(Mbar, ?wxID_ANY, "Test item 2"), - wxMenu:append(Mbar, ?wxID_ANY, "Test item 3"), - - wxMenuBar:append(MB, File, "&File"), - wxMenuBar:append(MB, Help, "&Help"), - wxMenuBar:append(MB, Mbar, "This is a menu bar"), - wxFrame:setMenuBar(Frame,MB), - - %% Setup wxStatusBar - StatusBar = wxFrame:createStatusBar(Frame, []), - wxStatusBar:setFieldsCount(StatusBar, 2), - wxStatusBar:setStatusText(StatusBar, "This is a status bar", [{number, 0}]), - - %% Setup wxToolBar - ToolBar = wxFrame:createToolBar(Frame, []), - wxToolBar:addTool(ToolBar, ?wxID_NEW, "New", wxArtProvider:getBitmap("wxART_NEW"), - [{shortHelp, "New"}]), - wxToolBar:setToolLongHelp(ToolBar, ?wxID_NEW, "This is long help for 'New'"), - wxToolBar:addTool(ToolBar, ?wxID_OPEN, "Open", wxArtProvider:getBitmap("wxART_FILE_OPEN"), - [{shortHelp, "Open"}]), - wxToolBar:setToolLongHelp(ToolBar, ?wxID_OPEN, "This is long help for 'Open'"), - wxToolBar:addSeparator(ToolBar), - wxToolBar:addTool(ToolBar, ?wxID_COPY, "Copy", wxArtProvider:getBitmap("wxART_COPY"), - [{shortHelp, "Copy"}]), - wxToolBar:setToolLongHelp(ToolBar, ?wxID_COPY, "This is long help for 'Copy'"), - wxToolBar:addTool(ToolBar, ?wxID_PASTE, "Paste", wxArtProvider:getBitmap("wxART_PASTE"), - [{shortHelp, "Paste"}]), - wxToolBar:setToolLongHelp(ToolBar, ?wxID_PASTE, "This is long help for 'Paste'"), - - wxToolBar:addControl(ToolBar,wxStaticText:new(ToolBar, 5, "This is a tool bar")), - - - wxToolBar:realize(ToolBar), - wxFrame:setToolBar(Frame,ToolBar), - - wxFrame:connect(Frame, motion, [{userData, StatusBar}]), - wxFrame:connect(Frame, command_menu_selected, []), - wxFrame:center(Frame), - wxFrame:show(Frame). - - -new_mini_frame(Parent) -> - MiniFrame = wxMiniFrame:new(Parent, ?wxID_ANY, "wxMiniFrame", [{style, - ?wxDEFAULT_FRAME_STYLE bor - ?wxFRAME_FLOAT_ON_PARENT}]), - Panel = wxPanel:new(MiniFrame, []), - - Text = "This is a wxMiniFrame", - - wxStaticText:new(Panel, ?wxID_ANY, Text, [{style, ?wxALIGN_CENTER}]), - wxMiniFrame:setSize(MiniFrame, {200,200}), - wxMiniFrame:center(MiniFrame), - wxMiniFrame:show(MiniFrame). - - diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_frame_utils.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_frame_utils.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_frame_utils.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_frame_utils.erl 2009-09-18 15:11:25.000000000 +0100 @@ -0,0 +1,193 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(ex_frame_utils). + +-behaviour(wx_object). + +%% Client API +-export([start/1]). + +%% wx_object callbacks +-export([init/1, terminate/2, code_change/3, + handle_info/2, handle_call/3, handle_event/2]). + +-include_lib("wx/include/wx.hrl"). + +-record(state, + { + parent, + config + }). + +start(Config) -> + wx_object:start_link(?MODULE, Config, []). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +init(Config) -> + wx:batch(fun() -> do_init(Config) end). + +do_init(Config) -> + Parent = proplists:get_value(parent, Config), + Panel = wxPanel:new(Parent, []), + + %% Setup sizers + MainSizer = wxBoxSizer:new(?wxVERTICAL), + Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, + [{label, "Utilities"}]), + + Labels = [{"Open window",1}, {"Open wxMiniFrame",2}, {"Open erlang.org",3}], + Buttons = [wxButton:new(Panel, Id, [{label, L}])|| {L,Id} <- Labels], + + %% Add to sizers + [wxSizer:add(Sizer, Button) || Button <- Buttons], + wxPanel:connect(Panel, command_button_clicked), + wxSizer:add(MainSizer, Sizer), + wxPanel:setSizer(Panel, MainSizer), + {Panel, #state{parent=Panel, config=Config}}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Async Events are handled in handle_event as in handle_info +handle_event(#wx{id = Id, + event = #wxCommand{type = command_menu_selected}}, + State = #state{}) -> + case Id of + ?wxID_NEW -> demo:format(State#state.config, "New\n", []); + ?wxID_OPEN -> demo:format(State#state.config, "Open\n", []); + ?wxID_COPY -> demo:format(State#state.config, "Copy\n", []); + ?wxID_PASTE -> demo:format(State#state.config, "Paste\n", []); + ?wxID_HELP -> + wx_misc:launchDefaultBrowser("http://erlang.org/doc/apps/wx/part_frame.html"); + _ -> ignore + end, + {noreply, State}; +handle_event(#wx{id = Id, + event = #wxCommand{type = command_button_clicked}}, + State = #state{}) -> + case Id of + 1 -> new_win(State#state.parent); + 2 -> new_mini_frame(State#state.parent); + 3 -> wx_misc:launchDefaultBrowser("http://erlang.org/"); + _ -> ignore + end, + {noreply, State}; +handle_event(#wx{userData = StatusBar, + event = #wxMouse{type = motion, x = X, y = Y}}, + State) -> + wxStatusBar:setStatusText(StatusBar, io_lib:format("Mouse position: ~p", [{X,Y}]), + [{number, 1}]), + {noreply, State}. + +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + +code_change(_, _, State) -> + {stop, ignore, State}. + +terminate(_Reason, _State) -> + ok. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Local functions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +new_win(Panel) -> + Frame = wxFrame:new(Panel, ?wxID_ANY, "Utilities", [{style, + ?wxCAPTION bor + ?wxCLIP_CHILDREN bor + ?wxCLOSE_BOX bor + ?wxFRAME_FLOAT_ON_PARENT bor + %%?wxFRAME_NO_TASKBAR bor + ?wxMAXIMIZE_BOX bor + ?wxMINIMIZE_BOX bor + ?wxRESIZE_BORDER bor + %%?wxSTAY_ON_TOP bor + ?wxSYSTEM_MENU + }]), + + %% Setup wxMenuBar + MB = wxMenuBar:new(), + File = wxMenu:new([]), + Help = wxMenu:new([]), + Mbar = wxMenu:new([]), + wxMenu:append(File, ?wxID_NEW, "New"), + wxMenu:append(File, ?wxID_OPEN, "Open"), + wxMenu:appendSeparator(File), + wxMenu:append(File, ?wxID_EXIT, "&Quit"), + wxMenu:append(Help, ?wxID_HELP, "Help"), + wxMenu:append(Mbar, ?wxID_ANY, "Test item 1"), + wxMenu:append(Mbar, ?wxID_ANY, "Test item 2"), + wxMenu:append(Mbar, ?wxID_ANY, "Test item 3"), + + wxMenuBar:append(MB, File, "&File"), + wxMenuBar:append(MB, Help, "&Help"), + wxMenuBar:append(MB, Mbar, "This is a menu bar"), + wxFrame:setMenuBar(Frame,MB), + + %% Setup wxStatusBar + StatusBar = wxFrame:createStatusBar(Frame, []), + wxStatusBar:setFieldsCount(StatusBar, 2), + wxStatusBar:setStatusText(StatusBar, "This is a status bar", [{number, 0}]), + + %% Setup wxToolBar + ToolBar = wxFrame:createToolBar(Frame, []), + wxToolBar:addTool(ToolBar, ?wxID_NEW, "New", wxArtProvider:getBitmap("wxART_NEW"), + [{shortHelp, "New"}]), + wxToolBar:setToolLongHelp(ToolBar, ?wxID_NEW, "This is long help for 'New'"), + wxToolBar:addTool(ToolBar, ?wxID_OPEN, "Open", wxArtProvider:getBitmap("wxART_FILE_OPEN"), + [{shortHelp, "Open"}]), + wxToolBar:setToolLongHelp(ToolBar, ?wxID_OPEN, "This is long help for 'Open'"), + wxToolBar:addSeparator(ToolBar), + wxToolBar:addTool(ToolBar, ?wxID_COPY, "Copy", wxArtProvider:getBitmap("wxART_COPY"), + [{shortHelp, "Copy"}]), + wxToolBar:setToolLongHelp(ToolBar, ?wxID_COPY, "This is long help for 'Copy'"), + wxToolBar:addTool(ToolBar, ?wxID_PASTE, "Paste", wxArtProvider:getBitmap("wxART_PASTE"), + [{shortHelp, "Paste"}]), + wxToolBar:setToolLongHelp(ToolBar, ?wxID_PASTE, "This is long help for 'Paste'"), + + wxToolBar:addControl(ToolBar,wxStaticText:new(ToolBar, 5, "This is a tool bar")), + + + wxToolBar:realize(ToolBar), + wxFrame:setToolBar(Frame,ToolBar), + + wxFrame:connect(Frame, motion, [{userData, StatusBar}]), + wxFrame:connect(Frame, command_menu_selected, []), + wxFrame:center(Frame), + wxFrame:show(Frame). + + +new_mini_frame(Parent) -> + MiniFrame = wxMiniFrame:new(Parent, ?wxID_ANY, "wxMiniFrame", [{style, + ?wxDEFAULT_FRAME_STYLE bor + ?wxFRAME_FLOAT_ON_PARENT}]), + Panel = wxPanel:new(MiniFrame, []), + + Text = "This is a wxMiniFrame", + + wxStaticText:new(Panel, ?wxID_ANY, Text, [{style, ?wxALIGN_CENTER}]), + wxMiniFrame:setSize(MiniFrame, {200,200}), + wxMiniFrame:center(MiniFrame), + wxMiniFrame:show(MiniFrame). + + diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_gauge.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_gauge.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_gauge.erl 2009-06-05 13:54:36.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_gauge.erl 2009-09-18 15:11:19.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_gauge). --behavoiur(wx_object). +-behaviour(wx_object). -include_lib("wx/include/wx.hrl"). @@ -56,24 +56,24 @@ Parent = proplists:get_value(parent, Config), Panel = wxPanel:new(Parent, []), - %% Horizontal gauge + %% Setup sizers + MainSizer = wxBoxSizer:new(?wxVERTICAL), + AlignSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, + [{label, "wxGauge"}]), + + %% Create two horizontal gauges with range 0-100 Range = 100, NormalGauge = wxGauge:new(Panel, 1, Range, [{size, {200, -1}}, {style, ?wxGA_HORIZONTAL}]), UndetGauge = wxGauge:new(Panel, 2, Range, [{size, {200, -1}}, {style, ?wxGA_HORIZONTAL}]), - %% Setup sizers - MainSizer = wxBoxSizer:new(?wxVERTICAL), - AlignSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, - [{label, "wxGauge"}]), + %% Add to sizers wxSizer:add(AlignSizer, NormalGauge, [{flag, ?wxEXPAND}]), wxSizer:add(AlignSizer, UndetGauge, [{flag, ?wxEXPAND}]), {OptSizer, SimulateButton, SimulateUndetermButton} = create_option_sizer(Panel), - - %% Add to MainSizer wxSizer:add(MainSizer, AlignSizer, [{flag, ?wxEXPAND}]), wxSizer:add(MainSizer, OptSizer, []), @@ -101,7 +101,7 @@ wxToggleButton:setValue(Button, false), wxToggleButton:setLabel(Button, "Simulate load"), wxGauge:setValue(Obj, Range), - demo:format(State#state.config, "Simulation finished.\n", []), + demo:format(State#state.config, "Simulation finished.\n", []), Timer; true -> simulate_load(Obj, Value) @@ -112,10 +112,7 @@ handle_info(pulse, State=#state{undeterminate_gauge = Gauge=#gauge{obj = Obj}}) -> wxGauge:pulse(Obj), Timer = erlang:send_after(300, self(), pulse), - {noreply, State#state{undeterminate_gauge = Gauge#gauge{timer = Timer}}}; -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n",[Msg]), - {noreply, State}. + {noreply, State#state{undeterminate_gauge = Gauge#gauge{timer = Timer}}}. handle_call(Msg, _From, State) -> demo:format(State#state.config,"Got Call ~p\n",[Msg]), diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_gl.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_gl.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_gl.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_gl.erl 2009-09-18 15:11:29.000000000 +0100 @@ -0,0 +1,409 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(ex_gl). + +-behaviour(wx_object). + +-export([init/1, code_change/3, handle_info/2, handle_event/2, + handle_call/3, terminate/2, + start/1]). + +-include_lib("wx/include/wx.hrl"). +-include_lib("wx/include/gl.hrl"). +-include_lib("wx/include/glu.hrl"). + +-record(state, + { + parent, + config, + gl, + canvas, + timer, + time + }). + +-record(gl, {win, data, deg, mat, alpha, text, font, brush, clock, sphere}). + +-record(texture, {tid, w, h, minx, miny, maxx, maxy}). + +start(Config) -> + wx_object:start_link(?MODULE, Config, []). + +-define(PAD, fun(Int) -> string:right(integer_to_list(Int), 2, $0) end). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +init(Config) -> + wx:batch(fun() -> do_init(Config) end). + +do_init(Config) -> + Parent = proplists:get_value(parent, Config), + Panel = wxPanel:new(Parent, []), + + %% Setup sizer + Sizer = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, [{label, "wxGLCanvas"}]), + + Opts = [{size, {300,300}}, {style, ?wxSUNKEN_BORDER}], + GLAttrib = [{attribList, [?WX_GL_RGBA, + ?WX_GL_DOUBLEBUFFER, + ?WX_GL_MIN_RED,8, + ?WX_GL_MIN_GREEN,8, + ?WX_GL_MIN_BLUE,8, + ?WX_GL_DEPTH_SIZE,24,0]}], + Canvas = wxGLCanvas:new(Panel,Opts ++ GLAttrib), + wxGLCanvas:connect(Canvas, size), + + wxGLCanvas:setCurrent(Canvas), + Image = wxImage:scale(wxImage:new("image.jpg"), 128,128), + GL = setup_gl(Canvas,Image), + Timer = timer:send_interval(20, self(), update), + + %% Add to sizers + wxSizer:add(Sizer, Canvas, [{flag, ?wxEXPAND},{proportion, 1}]), + wxWindow:setSizer(Panel,Sizer), + wxSizer:layout(Sizer), + {Panel, #state{parent = Panel, config = Config, + canvas = Canvas, + gl = GL, timer = Timer}}. + +%% Event handling +handle_event(#wx{event = #wxSize{size = {W,H}}}, State) -> + case W =:= 0 orelse H =:= 0 of + true -> skip; + _ -> + gl:viewport(0,0,W,H), + gl:matrixMode(?GL_PROJECTION), + gl:loadIdentity(), + gl:ortho( -2.0, 2.0, -2.0*H/W, 2.0*H/W, -20.0, 20.0), + gl:matrixMode(?GL_MODELVIEW), + gl:loadIdentity() + end, + {noreply, State}. + +handle_info(update, State) -> + S1 = update_rotation(State), + GL = S1#state.gl, + S2 = if S1#state.time > State#state.time -> + gl:deleteTextures([(GL#gl.clock)#texture.tid]), + {Hour,Min,Sec} = S1#state.time, + Clock = load_texture_by_string(GL#gl.font, GL#gl.brush, {40,40,40}, + [?PAD(Hour), $:, ?PAD(Min), $:, ?PAD(Sec)], false), + S1#state{gl = GL#gl{clock = Clock}}; + true -> + S1 + end, + wx:batch(fun() -> drawBox(S2#state.gl) end), + {noreply, S2}; +handle_info(stop, State) -> + timer:cancel(State#state.timer), + catch wxGLCanvas:destroy(State#state.canvas), + {stop, normal, State}. + +handle_call(Msg, _From, State) -> + io:format("Got Call ~p~n",[Msg]), + {reply,ok,State}. + +code_change(_, _, State) -> + {stop, not_yet_implemented, State}. + +terminate(_Reason, State) -> + catch wxGLCanvas:destroy(State#state.canvas), + timer:cancel(State#state.timer), + timer:sleep(300). + + + +-define(VS, {{-0.5, -0.5, -0.5}, %1 + { 0.5, -0.5, -0.5}, %2 + { 0.5, 0.5, -0.5}, + {-0.5, 0.5, -0.5}, %4 + {-0.5, 0.5, 0.5}, + { 0.5, 0.5, 0.5}, %6 + { 0.5, -0.5, 0.5}, + {-0.5, -0.5, 0.5}}).%8 + +-define(FACES, + %% Faces Normal U-axis V-axis + [{{1,2,3,4},{0,0,-1},{-1,0,0}, {0,1,0}}, % + {{8,1,4,5},{-1,0,0},{0,0,1}, {0,1,0}}, % + {{2,7,6,3},{1,0,0}, {0,0,-1}, {0,1,0}}, % + {{7,8,5,6},{0,0,1}, {1,0,0}, {0,1,0}}, % + {{4,3,6,5},{0,1,0}, {-1,0,0}, {0,0,1}}, % + {{1,2,7,8},{0,-1,0},{1,0,0}, {0,0,1}}]). + +-define(COLORS,{{ 0.0, 0.0, 0.0}, + { 1.0, 0.0, 0.0}, + { 1.0, 1.0, 0.0}, + { 0.0, 1.0, 0.0}, + { 0.0, 1.0, 1.0}, + { 1.0, 1.0, 1.0}, + { 1.0, 0.0, 1.0}, + { 0.0, 0.0, 1.0}}). + + +update_rotation(S=#state{gl=GL=#gl{deg=Rot}}) -> + {_, Time} = calendar:local_time(), + S#state{gl=GL#gl{deg = Rot + 1.0}, time = Time}. + +%% Needs to setup opengl after window is shown... +%% GL context is created when shown first time. +setup_gl(Win, Image) -> + {W,H} = wxWindow:getClientSize(Win), + gl:viewport(0,0,W,H), + gl:matrixMode(?GL_PROJECTION), + gl:loadIdentity(), + gl:ortho( -2.0, 2.0, -2.0*H/W, 2.0*H/W, -20.0, 20.0), + gl:matrixMode(?GL_MODELVIEW), + gl:loadIdentity(), + gl:enable(?GL_DEPTH_TEST), + gl:depthFunc(?GL_LESS), + gl:clearColor(1.0,1.0,1.0,1.0), + MatTexture = load_texture_by_image(Image), + ImgTexture = load_texture_by_image( + wxImage:new("erlang.png")), + Font = wxFont:new(32, ?wxFONTFAMILY_DEFAULT, ?wxFONTSTYLE_NORMAL, ?wxFONTWEIGHT_BOLD), + Brush = wxBrush:new({0,0,0}), + StrTexture = load_texture_by_string(Font, Brush, {40,40,40}, "Text from wxFont", true), + {_, {Hour,Min,Sec}} = calendar:local_time(), + Clock = load_texture_by_string(Font, Brush, {40, 40, 40}, + [?PAD(Hour), $:, ?PAD(Min), $:, ?PAD(Sec)], false), + Sphere = glu:newQuadric(), + gl:enable(?GL_TEXTURE_2D), + #gl{win=Win,data={?FACES,?VS,?COLORS},deg=0.0, + mat=MatTexture, alpha=ImgTexture, text=StrTexture, font = Font, + brush = Brush, clock = Clock, sphere = Sphere}. + +drawBox(#gl{win=Win,deg=Deg,data={Fs,Vs,Colors},mat=MatT,alpha=ImgA, + text=Text, clock = Clock, sphere=Sphere}) -> + gl:matrixMode(?GL_MODELVIEW), + gl:loadIdentity(), + gl:pushMatrix(), + gl:translatef(0,0.5,0), + gl:rotatef(Deg, 1.0, 1.0, 1.0), + gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), + gl:bindTexture(?GL_TEXTURE_2D, MatT#texture.tid), + gl:disable(?GL_BLEND), + gl:texEnvf(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_MODULATE), + gl:disable(?GL_CULL_FACE), + gl:'begin'(?GL_QUADS), + wx:foreach(fun(Face) -> drawFace(Face,Vs,Colors) end, Fs), + gl:'end'(), + gl:popMatrix(), + + gl:texEnvf(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_REPLACE), + + enter_2d_mode(Win), + {W,H} = wxWindow:getClientSize(Win), + Move = abs(90 - (trunc(Deg) rem 180)), + draw_texture((W div 2) - 50, (H div 2)-130+Move, Clock), + draw_texture((W div 2) - 80, (H div 2)-Move, ImgA), + leave_2d_mode(), + + gl:pushMatrix(), + gl:enable(?GL_CULL_FACE), + gl:enable(?GL_BLEND), + gl:blendFunc(?GL_SRC_ALPHA, ?GL_ONE_MINUS_SRC_ALPHA), + gl:translatef(0,-0.8,0), + gl:bindTexture(?GL_TEXTURE_2D, Text#texture.tid), + glu:quadricTexture(Sphere, ?GLU_TRUE), + glu:quadricNormals(Sphere, ?GLU_SMOOTH), + glu:quadricDrawStyle(Sphere, ?GLU_FILL), + glu:quadricOrientation(Sphere, ?GLU_OUTSIDE), + %%gl:scalef(2.0, 0.5, 1.0), + gl:rotatef(-90, 1.0, 0.0, 0.0), + gl:rotatef(-Deg, 0.0, 0.0, 1.0), + glu:sphere(Sphere, 0.8, 50,40), + gl:popMatrix(), + + wxGLCanvas:swapBuffers(Win). + +drawFace({{V1,V2,V3,V4},N,_Ut,_Vt}, Cube, Colors) -> + gl:normal3fv(N), + gl:color3fv(element(V1, Colors)), + gl:texCoord2f(0.0, 0.0), gl:vertex3fv(element(V1, Cube)), + gl:color3fv(element(V2, Colors)), + gl:texCoord2f(1.0, 0.0), gl:vertex3fv(element(V2, Cube)), + gl:color3fv(element(V3, Colors)), + gl:texCoord2f(1.0, 1.0), gl:vertex3fv(element(V3, Cube)), + gl:color3fv(element(V4, Colors)), + gl:texCoord2f(0.0, 1.0), gl:vertex3fv(element(V4, Cube)). + + +draw_texture(X, Y, #texture{tid = TId, w = W, h = H, + miny = MinY, minx = MinX, + maxx = MaxX, maxy = MaxY}) -> + gl:bindTexture(?GL_TEXTURE_2D, TId), + gl:'begin'(?GL_TRIANGLE_STRIP), + gl:texCoord2f(MinX, MinY), gl:vertex2i(X, Y ), + gl:texCoord2f(MaxX, MinY), gl:vertex2i(X+W div 2, Y ), + gl:texCoord2f(MinX, MaxY), gl:vertex2i(X, Y+H div 2), + gl:texCoord2f(MaxX, MaxY), gl:vertex2i(X+W div 2, Y+H div 2), + gl:'end'(). + +load_texture_by_image(Image) -> + ImgW = wxImage:getWidth(Image), + ImgH = wxImage:getHeight(Image), + W = get_power_of_two_roof(ImgW), + H = get_power_of_two_roof(ImgH), + Data = get_data_for_use_with_teximage2d(Image), + %% Create an OpenGL texture for the image + [TId] = gl:genTextures(1), + gl:bindTexture(?GL_TEXTURE_2D, TId), + gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MAG_FILTER, ?GL_NEAREST), + gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MIN_FILTER, ?GL_NEAREST), + Format = case wxImage:hasAlpha(Image) of + true -> ?GL_RGBA; + false -> ?GL_RGB + end, + gl:texImage2D(?GL_TEXTURE_2D, 0, + Format, W, H, 0, + Format, ?GL_UNSIGNED_BYTE, Data), + #texture{tid = TId, w = ImgW, h = ImgH, + minx = 0, miny = 0, maxx = ImgW / W, maxy = ImgH / H}. + + +%% This algorithm (based on http://d0t.dbclan.de/snippets/gltext.html) +%% prints a string to a bitmap and loads that onto an opengl texture. +%% Comments for the createTexture function: +%% +%% "Creates a texture from the settings saved in TextElement, to be +%% able to use normal system fonts conviently a wx.MemoryDC is +%% used to draw on a wx.Bitmap. As wxwidgets device contexts don't +%% support alpha at all it is necessary to apply a little hack to +%% preserve antialiasing without sticking to a fixed background +%% color: +%% +%% We draw the bmp in b/w mode so we can use its data as a alpha +%% channel for a solid color bitmap which after GL_ALPHA_TEST and +%% GL_BLEND will show a nicely antialiased text on any surface. +%% +%% To access the raw pixel data the bmp gets converted to a +%% wx.Image. Now we just have to merge our foreground color with +%% the alpha data we just created and push it all into a OpenGL +%% texture and we are DONE *inhalesdelpy*" +load_texture_by_string(Font, Brush, Color, String, Flip) -> + TmpBmp = wxBitmap:new(200, 200), + Tmp = wxMemoryDC:new(TmpBmp), + wxMemoryDC:setFont(Tmp, Font), + {StrW, StrH} = wxDC:getTextExtent(Tmp, String), + wxMemoryDC:destroy(Tmp), + wxBitmap:destroy(TmpBmp), + + W = get_power_of_two_roof(StrW), + H = get_power_of_two_roof(StrH), + + Bmp = wxBitmap:new(W, H), + DC = wxMemoryDC:new(Bmp), + wxMemoryDC:setFont(DC, Font), + wxMemoryDC:setBackground(DC, Brush), + wxMemoryDC:clear(DC), + wxMemoryDC:setTextForeground(DC, {255, 255, 255}), + wxMemoryDC:drawText(DC, String, {0, 0}), + + Img0 = wxBitmap:convertToImage(Bmp), + case Flip of + true -> + Img = wxImage:mirror(Img0, [{horizontally, false}]), + wxImage:destroy(Img0), + Img; + false -> + Img = Img0 + end, + + Alpha = wxImage:getData(Img), + Data = colourize_image(Alpha, Color), + wxImage:destroy(Img), + wxBitmap:destroy(Bmp), + wxMemoryDC:destroy(DC), + + [TId] = gl:genTextures(1), + gl:bindTexture(?GL_TEXTURE_2D, TId), + gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MAG_FILTER, ?GL_LINEAR), + gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MIN_FILTER, ?GL_LINEAR), + gl:texEnvf(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_REPLACE), + %%gl:pixelStorei(?GL_UNPACK_ROW_LENGTH, 0), + %%gl:pixelStorei(?GL_UNPACK_ALIGNMENT, 2), + gl:texImage2D(?GL_TEXTURE_2D, 0, ?GL_RGBA, + W, H, 0, ?GL_RGBA, ?GL_UNSIGNED_BYTE, Data), + #texture{tid = TId, w = StrW, h = StrH, + minx = 0, miny = 0, maxx = StrW / W, maxy = StrH / H}. + +colourize_image(Alpha, {R,G,B}) -> + << <> || <> <= Alpha >>. + +get_data_for_use_with_teximage2d(Image) -> + RGB = wxImage:getData(Image), + case wxImage:hasAlpha(Image) of + true -> + Alpha = wxImage:getAlpha(Image), + interleave_rgb_and_alpha(RGB, Alpha); + false -> + RGB + end. + +interleave_rgb_and_alpha(RGB, Alpha) -> + list_to_binary( + lists:zipwith(fun({R, G, B}, A) -> + <> + end, + [{R,G,B} || <> <= RGB], + [A || <> <= Alpha])). + + +enter_2d_mode(Win) -> + {W, H} = wxWindow:getClientSize(Win), + + %% Note, there may be other things you need to change, + %% depending on how you have your OpenGL state set up. + gl:pushAttrib(?GL_ENABLE_BIT), + gl:disable(?GL_DEPTH_TEST), + gl:disable(?GL_CULL_FACE), + gl:enable(?GL_TEXTURE_2D), + + %% This allows alpha blending of 2D textures with the scene + gl:enable(?GL_BLEND), + gl:blendFunc(?GL_SRC_ALPHA, ?GL_ONE_MINUS_SRC_ALPHA), + + gl:matrixMode(?GL_PROJECTION), + gl:pushMatrix(), + gl:loadIdentity(), + + %% SDL coordinates will be upside-down in the OpenGL world. We'll + %% therefore flip the bottom and top coordinates in the orthogonal + %% projection to correct this. + %% Note: We could flip the texture/image itself, but this will + %% also work for mouse coordinates. + gl:ortho(0.0, W, H, 0.0, 0.0, 1.0), + + gl:matrixMode(?GL_MODELVIEW), + gl:pushMatrix(), + gl:loadIdentity(). + +leave_2d_mode() -> + gl:matrixMode(?GL_MODELVIEW), + gl:popMatrix(), + gl:matrixMode(?GL_PROJECTION), + gl:popMatrix(), + gl:popAttrib(). + +get_power_of_two_roof(X) -> + get_power_of_two_roof_2(1, X). + +get_power_of_two_roof_2(N, X) when N >= X -> N; +get_power_of_two_roof_2(N, X) -> get_power_of_two_roof_2(N*2, X). + diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_graphicsContext.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_graphicsContext.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_graphicsContext.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_graphicsContext.erl 2009-09-18 15:11:29.000000000 +0100 @@ -0,0 +1,146 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(ex_graphicsContext). + +-behaviour(wx_object). + +%% Client API +-export([start/1]). + +%% wx_object callbacks +-export([init/1, terminate/2, code_change/3, + handle_info/2, handle_call/3, + handle_event/2, handle_sync_event/3]). + +-include_lib("wx/include/wx.hrl"). + +-record(state, + { + parent, + config, + win, + pen, + brush, + font + }). + +start(Config) -> + wx_object:start_link(?MODULE, Config, []). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +init(Config) -> + wx:batch(fun() -> do_init(Config) end). + +do_init(Config) -> + Parent = proplists:get_value(parent, Config), + Panel = wxPanel:new(Parent, []), + + %% Setup sizers + MainSizer = wxBoxSizer:new(?wxVERTICAL), + Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, + [{label, "wxGrapicsContext"}]), + + Win = wxPanel:new(Panel, []), + Pen = wxPen:new(), + Brush = wxBrush:new(?wxBLACK), + Font = wxFont:new(), + wxFont:setWeight(Font, ?wxBOLD), + + wxPanel:connect(Win, paint, [callback]), + + %% Add to sizers + wxSizer:add(Sizer, Win, [{flag, ?wxEXPAND}, + {proportion, 1}]), + wxSizer:add(MainSizer, Sizer, [{flag, ?wxEXPAND}, + {proportion, 1}]), + + wxPanel:setSizer(Panel, MainSizer), + {Panel, #state{parent=Panel, config=Config, win = Win, + pen = Pen, brush = Brush, font = Font}}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Sync events i.e. from callbacks must return ok, it can not return a new state. +%% Do the redrawing here. +handle_sync_event(#wx{event = #wxPaint{}},_, + #state{win=Win, pen = Pen, brush = Brush, font = Font}) -> + %% PaintDC must be created in a callback to work on windows. + DC = wxPaintDC:new(Win), + %% Nothing is drawn until wxPaintDC is destroyed. + draw(DC, Pen, Brush, Font), + wxPaintDC:destroy(DC), + ok. +%% Async Events are handled in handle_event as in handle_info +handle_event(#wx{}, State) -> + {noreply, State}. + +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + +code_change(_, _, State) -> + {stop, ignore, State}. + +terminate(_Reason, _State) -> + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Local functions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +draw(Win, Pen0, _Brush0, Font0) -> + try + Canvas = wxGraphicsContext:create(Win), + Pen = wxGraphicsContext:createPen(Canvas, Pen0), + wxGraphicsContext:setPen(Canvas, Pen), + Brush = wxGraphicsContext:createLinearGradientBrush(Canvas, 0.0,0.0, 30.0,30.0, + {200,50,50,50}, + {200,50,50,200}), + wxGraphicsContext:setBrush(Canvas, Brush), + Font = wxGraphicsContext:createFont(Canvas, Font0), + wxGraphicsContext:setFont(Canvas, Font), + + wxGraphicsContext:drawRoundedRectangle(Canvas, 35.0,35.0, 100.0, 50.0, 10.0), + wxGraphicsContext:drawText(Canvas, "Welcome", 60.0, 55.0), + Path = wxGraphicsContext:createPath(Canvas), + wxGraphicsPath:addCircle(Path, 0.0, 0.0, 40.0), + wxGraphicsPath:closeSubpath(Path), + wxGraphicsContext:translate(Canvas, 100.0, 100.0), + + Brush2 = wxGraphicsContext:createLinearGradientBrush(Canvas, 0.0,0.0, 30.0,30.0, + {50,200,50,50}, + {50,50,200,50}), + wxGraphicsContext:setBrush(Canvas, Brush2), + + F = fun(_) -> + wxGraphicsContext:scale(Canvas, 1.1, 1.1), + wxGraphicsContext:translate(Canvas, 3.0,3.0), + wxGraphicsContext:drawPath(Canvas, Path) + end, + wx:foreach(F, lists:seq(1,5)), + ok + catch _:{not_supported, _} -> + Err = "wxGraphicsContext not available in this build of wxwidgets", + io:format(Err,[]) + end. + diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_grid.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_grid.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_grid.erl 2009-06-05 13:54:39.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_grid.erl 2009-09-18 15:11:25.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_grid). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -32,7 +32,8 @@ -record(state, { parent, - config + config, + grid }). start(Config) -> @@ -50,31 +51,36 @@ MainSizer = wxBoxSizer:new(?wxVERTICAL), Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "wxGrid"}]), - Grid1 = create_grid1(Panel), + + Grid = create_grid(Panel), + %% Add to sizers Options = [{flag, ?wxEXPAND}, {proportion, 1}], - wxSizer:add(Sizer, Grid1, Options), + wxSizer:add(Sizer, Grid, Options), wxSizer:add(MainSizer, Sizer, Options), wxPanel:setSizer(Panel, MainSizer), - {Panel, #state{parent=Panel, config=Config}}. + {Panel, #state{parent=Panel, config=Config, + grid = Grid}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Async Events are handled in handle_event as in handle_info +handle_event(#wx{event = #wxGrid{type = grid_cell_change, + row = Row, col = Col}}, + State = #state{}) -> + Val = wxGrid:getCellValue(State#state.grid, Row, Col), + demo:format(State#state.config, "Cell {~p,~p} changed to ~p.\n", + [Row,Col,Val]), + {noreply, State}. + %% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), +handle_info(_Msg, State) -> {noreply, State}. -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), +handle_call(_Msg, _From, State) -> {reply,{error, nyi}, State}. -%% Async Events are handled in handle_event as in handle_info -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config, "Got Event ~p\n", [Ev]), - {noreply, State}. - code_change(_, _, State) -> {stop, ignore, State}. @@ -85,45 +91,49 @@ %% Local functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -create_grid1(Panel) -> +create_grid(Panel) -> + %% Create the grid with 100 * 5 cells Grid = wxGrid:new(Panel, 2, []), wxGrid:createGrid(Grid, 100, 5), + Font = wxFont:new(16, ?wxFONTFAMILY_SWISS, ?wxFONTSTYLE_NORMAL, ?wxFONTWEIGHT_NORMAL, []), + %% Fun to set the values and flags of the cells Fun = - fun(Int) -> - wxGrid:setCellValue(Grid, Int, 0, "Value"), - wxGrid:setCellValue(Grid, Int, 1, "Value"), - wxGrid:setCellValue(Grid, Int, 2, "Value"), - wxGrid:setCellValue(Grid, Int, 3, "Read only"), - wxGrid:setCellTextColour(Grid, Int, 3, ?wxWHITE), - wxGrid:setReadOnly(Grid, Int, 3, [{isReadOnly,true}]), - wxGrid:setCellValue(Grid, Int, 4, "Value"), - case Int rem 4 of - 0 -> wxGrid:setCellBackgroundColour(Grid, Int, 3, ?wxRED); - 1 -> wxGrid:setCellBackgroundColour(Grid, Int, 3, ?wxGREEN), - wxGrid:setCellTextColour(Grid, Int, 2, {255,215,0,255}); - 2 -> wxGrid:setCellBackgroundColour(Grid, Int, 3, ?wxBLUE); - _ -> wxGrid:setCellBackgroundColour(Grid, Int, 1, ?wxCYAN), - wxGrid:setCellValue(Grid, Int, 1, + fun(Row) -> + wxGrid:setCellValue(Grid, Row, 0, "Editable"), + wxGrid:setCellValue(Grid, Row, 1, "Editable"), + wxGrid:setCellValue(Grid, Row, 2, "Editable"), + wxGrid:setCellValue(Grid, Row, 3, "Read only"), + wxGrid:setCellTextColour(Grid, Row, 3, ?wxWHITE), + wxGrid:setReadOnly(Grid, Row, 3, [{isReadOnly,true}]), + wxGrid:setCellValue(Grid, Row, 4, "Editable"), + case Row rem 4 of + 0 -> wxGrid:setCellBackgroundColour(Grid, Row, 3, ?wxRED); + 1 -> wxGrid:setCellBackgroundColour(Grid, Row, 3, ?wxGREEN), + wxGrid:setCellTextColour(Grid, Row, 2, {255,215,0,255}); + 2 -> wxGrid:setCellBackgroundColour(Grid, Row, 3, ?wxBLUE); + _ -> wxGrid:setCellBackgroundColour(Grid, Row, 1, ?wxCYAN), + wxGrid:setCellValue(Grid, Row, 1, "Centered\nhorizontally"), - wxGrid:setCellAlignment(Grid, Int, 4, + wxGrid:setCellAlignment(Grid, Row, 4, 0,?wxALIGN_CENTER), - wxGrid:setCellValue(Grid, Int, 4, + wxGrid:setCellValue(Grid, Row, 4, "Centered\nvertically"), - wxGrid:setCellAlignment(Grid, Int, 1, + wxGrid:setCellAlignment(Grid, Row, 1, ?wxALIGN_CENTER,0), - wxGrid:setCellTextColour(Grid, Int, 3, ?wxBLACK), - wxGrid:setCellAlignment(Grid, Int, 2, + wxGrid:setCellTextColour(Grid, Row, 3, ?wxBLACK), + wxGrid:setCellAlignment(Grid, Row, 2, ?wxALIGN_CENTER, ?wxALIGN_CENTER), - wxGrid:setCellFont(Grid, Int, 0, Font), - wxGrid:setCellValue(Grid, Int, 2, + wxGrid:setCellFont(Grid, Row, 0, Font), + wxGrid:setCellValue(Grid, Row, 2, "Centered vertically\nand horizontally"), - wxGrid:setRowSize(Grid, Int, 80) + wxGrid:setRowSize(Grid, Row, 80) end end, + %% Apply the fun to each row wx:foreach(Fun, lists:seq(0,99)), wxGrid:setColSize(Grid, 2, 150), wxGrid:connect(Grid, grid_cell_change), diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_htmlWindow.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_htmlWindow.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_htmlWindow.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_htmlWindow.erl 2009-09-18 15:11:28.000000000 +0100 @@ -0,0 +1,93 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% + +-module(ex_htmlWindow). + +-behaviour(wx_object). + +%% Client API +-export([start/1]). + +%% wx_object callbacks +-export([init/1, terminate/2, code_change/3, + handle_info/2, handle_call/3, handle_event/2]). + +-include("../../include/wx.hrl"). + +-record(state, + { + parent, + config + }). + +start(Config) -> + wx_object:start_link(?MODULE, Config, []). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +init(Config) -> + wx:batch(fun() -> do_init(Config) end). + +do_init(Config) -> + Parent = proplists:get_value(parent, Config), + Panel = wxPanel:new(Parent, []), + + %% Setup sizers + MainSizer = wxBoxSizer:new(?wxVERTICAL), + Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, + [{label, "wxHtmlWindow"}]), + + %% Create the wxHtmlWindow + HtmlWin = wxHtmlWindow:new(Panel, []), + %% Load a file and display it + wxHtmlWindow:loadFile(HtmlWin, "ex_htmlWindow.html"), + + %% Add to sizers + wxSizer:add(Sizer, HtmlWin, [{flag, ?wxEXPAND}, {proportion, 1}]), + wxSizer:add(MainSizer, Sizer, [{flag, ?wxEXPAND}, {proportion, 1}]), + + wxHtmlWindow:connect(HtmlWin, command_html_link_clicked, [{skip,true}]), + + wxPanel:setSizer(Panel, MainSizer), + {Panel, #state{parent=Panel, config=Config}}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Async Events are handled in handle_event as in handle_info +handle_event(#wx{event = #wxHtmlLink{linkInfo = #wxHtmlLinkInfo{href=Link}}}, + State = #state{}) -> + demo:format(State#state.config, "You clicked link ~p.\n", [Link]), + {noreply, State}. + +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + +code_change(_, _, State) -> + {stop, ignore, State}. + +terminate(_Reason, _State) -> + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Local functions +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_htmlWindow.html erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_htmlWindow.html --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_htmlWindow.html 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_htmlWindow.html 2009-09-18 15:11:30.000000000 +0100 @@ -0,0 +1,59 @@ + + +

    Erlang is the best.

    +
      +
    • Text1
    • +
    • Text2
    • +
    +

    You can insert whatever HTML you want... although wxHtmlWindow doesn't support css or scripts

    +
    + +
    -User's Guide
    +User's Guide
    -User's Guide +User's Guide
    -Reference Manual
    +Reference Manual
    -Reference Manual +Reference Manual
    -Release Notes
    +Release Notes
    -Release Notes +Release Notes
    -Off-Print
    +Off-Print
    -Off-Print +Off-Print
    43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide
    43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide
    43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide
    43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide
    " ++ Col0 ++ "0.000s" ++ Col1 ++ "SKIPPED~s
    " ++ St0 ++ "~.3fs" ++ St1 ++ "SKIPPEDSKIPPED~s~s
    " ++ St0 ++ "~.3fs" ++ St1 ++ "" ++ St0 ++ "died" ++ St1 ++ "" ++ St0 ++ "~s" ++ St1 ++ "" ++ Comment0 ++ "" ++ to_string(Comment0) ++ "
    ", Platform, "
    ", case Link of @@ -226,8 +254,9 @@ "
    FamilySuccessfulFailedSkippedUser SkippedAuto SkippedMissing SuitesCoveragePlatformSuccessfulFailedSkippedUser SkippedAuto Skipped
    + + + + + + + + +
    Thisis
    atable
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    Top
    +
    + + Copyright © 2009 Ericsson AB + +
    + \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_listCtrl.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_listCtrl.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_listCtrl.erl 2009-06-05 13:54:38.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_listCtrl.erl 2009-09-18 15:11:23.000000000 +0100 @@ -20,7 +20,7 @@ -include_lib("wx/include/wx.hrl"). --behavoiur(wx_object). +-behaviour(wx_object). -export([start/1, init/1, terminate/2, code_change/3, handle_info/2, handle_call/3, handle_event/2]). @@ -38,6 +38,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(Config) -> wx:batch(fun() -> do_init(Config) end). + do_init(Config) -> Parent = proplists:get_value(parent, Config), Panel = wxPanel:new(Parent, []), @@ -80,14 +81,15 @@ wxListCtrl:setItemBackgroundColour(ListCtrl3,3,?wxGREEN), wxListCtrl:setItemBackgroundColour(ListCtrl3,0,?wxCYAN), - wxNotebook:addPage(Notebook, ListCtrl1, "List", []), - wxNotebook:addPage(Notebook, ListCtrl2, "Report", []), - wxNotebook:addPage(Notebook, ListCtrl3, "Colored multiselect", []), - wxListCtrl:connect(ListCtrl1, command_list_item_selected, []), wxListCtrl:connect(ListCtrl2, command_list_item_selected, []), wxListCtrl:connect(ListCtrl3, command_list_item_selected, []), + %% Add to sizers + wxNotebook:addPage(Notebook, ListCtrl1, "List", []), + wxNotebook:addPage(Notebook, ListCtrl2, "Report", []), + wxNotebook:addPage(Notebook, ListCtrl3, "Colored multiselect", []), + wxSizer:add(MainSizer, Notebook, [{proportion, 1}, {flag, ?wxEXPAND}]), @@ -96,7 +98,14 @@ notebook = Notebook}}. -%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Async Events are handled in handle_event as in handle_info +handle_event(#wx{obj = _ListCtrl, + event = #wxList{itemIndex = Item}}, + State = #state{}) -> + demo:format(State#state.config,"Item ~p selected.\n",[Item]), + {noreply,State}. + %% Callbacks handled as normal gen_server callbacks handle_info(Msg, State) -> demo:format(State#state.config, "Got Info ~p\n",[Msg]), @@ -106,25 +115,15 @@ demo:format(State#state.config,"Got Call ~p\n",[Msg]), {reply,ok,State}. -%% Async Events are handled in handle_event as in handle_info -handle_event(#wx{obj = _ListCtrl, - event = #wxList{itemIndex = Item}}, - State = #state{}) -> - demo:format(State#state.config,"Item ~p selected.\n",[Item]), - {noreply,State}; -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config,"Got Event ~p\n",[Ev]), - {noreply,State}. - code_change(_, _, State) -> {stop, ignore, State}. terminate(_Reason, _State) -> ok. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% Local functions -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -define(FIRST_COL, 0). -define(SECOND_COL, 1). -define(THIRD_COL, 2). diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_notebook.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_notebook.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_notebook.erl 2009-06-05 13:54:37.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_notebook.erl 2009-09-18 15:11:22.000000000 +0100 @@ -20,7 +20,7 @@ -include_lib("wx/include/wx.hrl"). --behavoiur(wx_object). +-behaviour(wx_object). -export([start/1, init/1, terminate/2, code_change/3, handle_info/2, handle_call/3, handle_event/2]). @@ -41,6 +41,7 @@ do_init(Config) -> Parent = proplists:get_value(parent, Config), Panel = wxPanel:new(Parent, []), + %% Setup sizers MainSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "wxNotebook"}]), @@ -57,8 +58,9 @@ %% Make a wxImageList to be able to display icons in the tab field IL = wxImageList:new(16,16), wxImageList:add(IL, wxArtProvider:getBitmap("wxART_INFORMATION", [{size, {16,16}}])), + wxImageList:add(IL, wxArtProvider:getBitmap("wxART_MISSING_IMAGE", [{size, {16,16}}])), wxNotebook:assignImageList(Notebook, IL), - + Win1 = wxPanel:new(Notebook, []), @@ -83,6 +85,7 @@ Win3 = wxPanel:new(Notebook, []), wxNotebook:addPage(Notebook, Win3, "No color", []), + wxNotebook:setPageImage(Notebook, 2, 1), Win4 = wxPanel:new(Notebook, []), wxPanel:setBackgroundColour(Win4, ?wxBLACK), @@ -97,13 +100,10 @@ Win5 = wxPanel:new(Notebook, []), wxNotebook:addPage(Notebook, Win5, "Tab with icon", []), wxNotebook:setPageImage(Notebook, 4, 0), - - - %% Add to sizers wxSizer:add(MainSizer, Notebook, [{proportion, 1}, - {flag, ?wxEXPAND}]), + {flag, ?wxEXPAND}]), wxNotebook:connect(Notebook, command_notebook_page_changed, [{skip, true}]), % {skip, true} has to be set on windows @@ -112,16 +112,7 @@ notebook = Notebook}}. -%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n",[Msg]), - {noreply,State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config,"Got Call ~p\n",[Msg]), - {reply,ok,State}. - +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Async Events are handled in handle_event as in handle_info handle_event(#wx{event = #wxNotebook{type = command_notebook_page_changed}}, State = #state{notebook = Notebook}) -> @@ -133,15 +124,24 @@ demo:format(State#state.config,"Got Event ~p\n",[Ev]), {noreply,State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n",[Msg]), + {noreply,State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config,"Got Call ~p\n",[Msg]), + {reply,ok,State}. + code_change(_, _, State) -> {stop, ignore, State}. terminate(_Reason, _State) -> ok. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% Local functions -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_pickers.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_pickers.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_pickers.erl 2009-06-05 13:54:38.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_pickers.erl 2009-09-18 15:11:24.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_pickers). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -65,6 +65,12 @@ DatePicker = wxDatePickerCtrl:new(Panel, 4, []), ColourPicker = wxColourPickerCtrl:new(Panel, 5, []), + wxColourPickerCtrl:connect(ColourPicker, command_colourpicker_changed, []), + wxDirPickerCtrl:connect(DirPicker, command_dirpicker_changed, []), + wxFilePickerCtrl:connect(FilePicker, command_filepicker_changed, []), + wxFontPickerCtrl:connect(FontPicker, command_fontpicker_changed, []), + wxDatePickerCtrl:connect(DatePicker, date_changed, []), + %% Add to sizers PickerOptions = [{border, 4},{flag, ?wxALL bor ?wxEXPAND}], wxSizer:add(DirPickerSizer, DirPicker, PickerOptions), @@ -80,25 +86,10 @@ wxSizer:add(MainSizer, DatePickerSizer, SizerOptions), wxSizer:add(MainSizer, ColourPickerSizer, SizerOptions), - wxColourPickerCtrl:connect(ColourPicker, command_colourpicker_changed, []), - wxDirPickerCtrl:connect(DirPicker, command_dirpicker_changed, []), - wxFilePickerCtrl:connect(FilePicker, command_filepicker_changed, []), - wxFontPickerCtrl:connect(FontPicker, command_fontpicker_changed, []), - wxDatePickerCtrl:connect(DatePicker, date_changed, []), - wxPanel:setSizer(Panel, MainSizer), {Panel, #state{parent=Panel, config=Config}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), - {reply,{error, nyi}, State}. - %% Async Events are handled in handle_event as in handle_info handle_event(#wx{event = #wxFontPicker{font = Font}}, State = #state{}) -> demo:format(State#state.config, "Font changed to ~p.\n", [Font]), @@ -124,6 +115,15 @@ demo:format(State#state.config, "Got Event ~p\n", [Ev]), {noreply, State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_popupMenu.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_popupMenu.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_popupMenu.erl 2009-06-05 13:54:38.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_popupMenu.erl 2009-09-18 15:11:24.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_popupMenu). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -44,60 +44,57 @@ wx:batch(fun() -> do_init(Config) end). do_init(Config) -> - Parent = proplists:get_value(parent, Config), - Panel = wxPanel:new(Parent, []), - - %% Setup sizers + Root = proplists:get_value(parent, Config), + Parent = wxPanel:new(Root,[]), MainSizer = wxBoxSizer:new(?wxVERTICAL), - Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, - [{label, "Popup Menu"}]), - - Text = wxStaticText:new(Panel, ?wxID_ANY, "Right click to open popup menu", []), - - - %% Add to sizers - wxSizer:add(Sizer, Text, [{border, 20}, - {flag, ?wxALL}]), - - wxSizer:add(MainSizer, Sizer, [{flag, ?wxEXPAND}, - {proportion, 1}]), - + Box = wxStaticBox:new(Parent, ?wxID_ANY, "Popup Menu"), + Sz = wxStaticBoxSizer:new(Box, ?wxVERTICAL), + Text = wxStaticText:new(Parent, ?wxID_ANY, "Right click to open popup menu", []), + Panel = wxPanel:new(Parent), wxPanel:connect(Panel, right_up), - wxPanel:setSizer(Panel, MainSizer), - {Panel, #state{parent=Panel, config=Config, - menu = create_menu()}}. + Sizer = wxBoxSizer:new(?wxVERTICAL), + wxSizer:add(Sizer, Text, [{border, 20}, {flag, ?wxALL}]), + wxPanel:setSizer(Panel, Sizer), + wxSizer:add(Sz, Panel, [{proportion,1}, {flag, ?wxEXPAND}]), + wxSizer:layout(Sz), + PopupMenu = create_menu(), + wxSizer:add(MainSizer, Sz, [{proportion,1}, {flag, ?wxEXPAND}]), + wxWindow:setSizer(Parent, MainSizer), + {Parent, #state{parent=Parent, config=Config, menu=PopupMenu}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), - {reply,{error, nyi}, State}. - %% Async Events are handled in handle_event as in handle_info handle_event(#wx{obj = Panel, event = #wxMouse{type = right_up}}, State = #state{menu = Menu}) -> + %% Open the popup menu wxWindow:popupMenu(Panel, Menu), {noreply, State}; -handle_event(#wx{obj = Menu, - id = Id, +handle_event(#wx{obj = Menu, id = Id, event = #wxCommand{type = command_menu_selected}}, State = #state{}) -> + %% Get the selected item label Label = wxMenu:getLabel(Menu, Id), demo:format(State#state.config, "wxMenu clicked ~p\n", [Label]), {noreply, State}; -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config, "Got Event ~p\n", [Ev]), +handle_event(Ev, State) -> + demo:format(State#state.config, "Unexpected Event ~p\n", [Ev]), + {noreply, State}. + +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), {noreply, State}. +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + code_change(_, _, State) -> {stop, ignore, State}. -terminate(_Reason, _State) -> +terminate(_Reason, #state{menu=Popup}) -> + wxMenu:destroy(Popup), ok. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_radioBox.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_radioBox.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_radioBox.erl 2009-06-05 13:54:37.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_radioBox.erl 2009-09-18 15:11:21.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_radioBox). --behavoiur(wx_object). +-behaviour(wx_object). -export([start/1, init/1, terminate/2, code_change/3, handle_info/2, handle_call/3, handle_event/2]). @@ -38,12 +38,14 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(Config) -> wx:batch(fun() -> do_init(Config) end). + do_init(Config) -> Parent = proplists:get_value(parent, Config), Panel = wxPanel:new(Parent, []), %% Setup sizers MainSizer = wxBoxSizer:new(?wxVERTICAL), + Sizer = wxBoxSizer:new(?wxHORIZONTAL), Choices = ["Item " ++ integer_to_list(Int) || Int <- lists:seq(1,12)], RadioBox = wxRadioBox:new(Panel, 1, "wxRadioBox Horizontal", @@ -59,7 +61,6 @@ CheckSizer = create_checkboxes(Panel), %% Add to sizers - Sizer = wxBoxSizer:new(?wxHORIZONTAL), wxSizer:add(Sizer, RadioButtonSizer), wxSizer:addSpacer(Sizer, 20), wxSizer:add(Sizer, CheckSizer), @@ -73,15 +74,6 @@ radio_box = RadioBox}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n",[Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config,"Got Call ~p\n",[Msg]), - {reply, {error, nyi}, State}. - %% Async Events are handled in handle_event as in handle_info handle_event(#wx{event = #wxCommand{type = command_radiobox_selected, cmdString = Item}}, @@ -104,11 +96,18 @@ State = #state{}) -> Label = wxRadioButton:getLabel(RadioButton), demo:format(State#state.config,"wxRadioButton selected ~p\n",[Label]), - {noreply, State}; -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config,"Got Event ~p\n",[Ev]), {noreply, State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n",[Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config,"Got Call ~p\n",[Msg]), + {reply, {error, nyi}, State}. + + code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_sashWindow.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_sashWindow.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_sashWindow.erl 2009-06-05 13:54:37.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_sashWindow.erl 2009-09-18 15:11:22.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_sashWindow). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -53,31 +53,27 @@ %% Setup sizers MainSizer = wxBoxSizer:new(?wxVERTICAL), - Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, - [{label, "wxSashWindow"}]), + Sizer = wxBoxSizer:new(?wxVERTICAL), - TopSash = wxSashWindow:new(Panel, [{id, ?TOP_SASH}]), - wxSashWindow:setBackgroundColour(TopSash, ?wxRED), - BottomSash = wxSashWindow:new(Panel, [{id, ?BOTTOM_SASH}]), - wxSashWindow:setBackgroundColour(BottomSash, ?wxBLUE), - {W,H} = wxPanel:getSize(Panel), - wxSashWindow:setMinSize(TopSash, {W,H div 2}), - wxSashWindow:setMinSize(BottomSash, {W,H div 2}), - wxSashWindow:setSize(TopSash, {0,0,W,H div 2}), - wxSashWindow:setSize(BottomSash, {0,H div 2,W,H div 2}), + TopSash = wxSashWindow:new(Panel, [{id, ?TOP_SASH}, + {style, ?wxSW_3D}]), + Win1 = wxPanel:new(TopSash, []), + wxStaticText:new(Win1, ?wxID_ANY, "This is the top sash", []), + BottomSash = wxSashWindow:new(Panel, [{id, ?BOTTOM_SASH}, + {style, ?wxSW_3D}]), + Win2 = wxPanel:new(BottomSash, []), + wxStaticText:new(Win2, ?wxID_ANY, "This is the bottom sash", []), + %% Make the bottom edge of the top sash dragable wxSashWindow:setSashVisible(TopSash, ?wxSASH_BOTTOM, true), wxPanel:connect(Panel, sash_dragged), wxPanel:connect(Panel, size), - %wxPanel:setMinSize(Panel, {100,100}), %% Add to sizers Options = [{flag, ?wxEXPAND}, {proportion, 1}], - wxSizer:add(Sizer, TopSash, Options), wxSizer:add(Sizer, BottomSash, Options), wxSizer:add(MainSizer, Sizer, Options), - wxPanel:setSizer(Panel, MainSizer), wxSizer:fit(MainSizer, Panel), wxSizer:setSizeHints(MainSizer, Panel), @@ -85,15 +81,6 @@ top_sash = TopSash, bottom_sash = BottomSash}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), - {reply,{error, nyi}, State}. - %% Async Events are handled in handle_event as in handle_info handle_event(#wx{event = #wxSash{dragRect = {_X,Y, _W, H}}}, State = #state{top_sash = TopSash, @@ -110,31 +97,25 @@ handle_event(#wx{event = #wxSize{size = {W, H}}}, State = #state{top_sash = TopSash, bottom_sash = BottomSash}) -> - wx:batch(fun() -> - {OldX, OldY} = wxSashWindow:getPosition(BottomSash), - {_OldW,OldH} = wxSashWindow:getSize(TopSash), - NewH = H - OldH, - if OldH < 10; H < 10 -> - ignore; - H < OldH +10 -> - wxSashWindow:setMinSize(TopSash, {W,OldH-3}), - wxSashWindow:setMinSize(BottomSash, {W,NewH}), - wxSashWindow:setSize(TopSash, {W,OldH-3}), - wxSashWindow:setSize(BottomSash, {OldX,OldY-3,W,NewH}); - true -> - wxSashWindow:setMinSize(TopSash, {W,OldH}), - wxSashWindow:setMinSize(BottomSash, {W,NewH}), - wxSashWindow:setSize(TopSash, {W,OldH}), - wxSashWindow:setSize(BottomSash, {OldX,OldY,W,NewH}) - end, - wxPanel:refresh(State#state.parent) - end), - + wxSashWindow:setMinSize(TopSash, {W, H div 2}), + wxSashWindow:setMinSize(BottomSash, {W, H div 2}), + wxSashWindow:setSize(TopSash, {W, H div 2}), + wxSashWindow:setSize(BottomSash, {0,H div 2,W,H div 2}), + wxPanel:refresh(State#state.parent), {noreply, State}; handle_event(Ev = #wx{}, State = #state{}) -> demo:format(State#state.config, "Got Event ~p\n", [Ev]), {noreply, State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_sizers.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_sizers.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_sizers.erl 2009-06-05 13:54:40.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_sizers.erl 2009-09-18 15:11:26.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_sizers). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -50,7 +50,7 @@ MainSizer = wxBoxSizer:new(?wxVERTICAL), Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "wxSizer"}]), - + Choices = ["Vertical Example", "Horizontal Example", "Add A Strechable", @@ -76,22 +76,12 @@ %% Add to sizers wxSizer:add(Sizer, ListBox, [{flag, ?wxEXPAND}]), - wxSizer:add(MainSizer, Sizer, [{flag, ?wxEXPAND}, {proportion, 1}]), wxPanel:setSizer(Panel, MainSizer), {Panel, #state{parent=Panel, config=Config}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), - {reply,{error, nyi}, State}. - %% Async Events are handled in handle_event as in handle_info handle_event(#wx{event = #wxCommand{type = command_listbox_doubleclicked, cmdString = Choice}}, @@ -102,6 +92,15 @@ demo:format(State#state.config, "Got Event ~p\n", [Ev]), {noreply, State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_slider.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_slider.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_slider.erl 2009-06-05 13:54:37.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_slider.erl 2009-09-18 15:11:21.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_slider). --behavoiur(wx_object). +-behaviour(wx_object). -export([start/1, init/1, terminate/2, code_change/3, handle_info/2, handle_call/3, handle_event/2]). @@ -28,8 +28,7 @@ -record(state, { parent, - config, - slider + config }). start(Config) -> @@ -38,6 +37,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(Config) -> wx:batch(fun() -> do_init(Config) end). + do_init(Config) -> Parent = proplists:get_value(parent, Config), Panel = wxPanel:new(Parent, []), @@ -45,34 +45,53 @@ %% Setup sizers MainSizer = wxBoxSizer:new(?wxVERTICAL), Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, - [{label, "wxSlider"}]), - Sizer2 = wxStaticBoxSizer:new(?wxVERTICAL, Panel, - [{label, "Inverse wxSlider"}]), + [{label, "Horizontal wxSlider"}]), + Sizer2 = wxStaticBoxSizer:new(?wxHORIZONTAL, Panel, + [{label, "Vertical wxSlider"}]), - %% Setup slider + %% Setup slider with range from 0 to 100 + %% and a start value of 25 Min = 0, Max = 100, StartValue = 25, + %% Horizontal slider (default) with label Slider = wxSlider:new(Panel, 1, StartValue, Min, Max, - [{style, ?wxSL_HORIZONTAL bor - ?wxSL_LABELS}]), - Slider2 = wxSlider:new(Panel, 2, StartValue, Min, Max, - [{style, ?wxSL_HORIZONTAL bor - ?wxSL_LABELS bor - ?wxSL_INVERSE}]), + [{style, ?wxSL_HORIZONTAL bor + ?wxSL_LABELS}]), + %% Horizontal inverse slider with label + InverseSlider = wxSlider:new(Panel, 2, StartValue, Min, Max, + [{style, ?wxSL_HORIZONTAL bor + ?wxSL_LABELS bor + ?wxSL_INVERSE}]), + VerticalSlider = wxSlider:new(Panel, 3, StartValue, Min, Max, + [{style, ?wxSL_VERTICAL bor + ?wxSL_LABELS}]), + InverseVerticalSlider = wxSlider:new(Panel, 4, StartValue, Min, Max, + [{style, ?wxSL_VERTICAL bor + ?wxSL_LABELS bor + ?wxSL_INVERSE}]), %% Add to sizers wxSizer:add(Sizer, Slider, [{flag, ?wxEXPAND}]), - wxSizer:add(Sizer2, Slider2, [{flag, ?wxEXPAND}]), + wxSizer:add(Sizer, InverseSlider, [{flag, ?wxEXPAND}]), + wxSizer:add(Sizer2, VerticalSlider, [{flag, ?wxEXPAND}, + {proportion, 1}]), + wxSizer:add(Sizer2, InverseVerticalSlider, [{flag, ?wxEXPAND}, + {proportion, 1}]), wxSizer:add(MainSizer, Sizer, [{flag, ?wxEXPAND}]), - wxSizer:add(MainSizer, Sizer2, [{flag, ?wxEXPAND}]), + wxSizer:add(MainSizer, Sizer2, [{flag, ?wxEXPAND}, + {proportion, 1}]), wxPanel:setSizer(Panel, MainSizer), - {Panel, #state{parent=Panel, config=Config, - slider = Slider}}. + {Panel, #state{parent=Panel, config=Config}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Async Events are handled in handle_event as in handle_info +handle_event(Ev = #wx{}, State = #state{}) -> + demo:format(State#state.config,"Got Event ~p\n",[Ev]), + {noreply, State}. + %% Callbacks handled as normal gen_server callbacks handle_info(Msg, State) -> demo:format(State#state.config, "Got Info ~p\n",[Msg]), @@ -82,14 +101,6 @@ demo:format(State#state.config,"Got Call ~p\n",[Msg]), {reply, {error, nyi},State}. -%% Async Events are handled in handle_event as in handle_info -handle_event(#wx{event = #wxCommand{type = command_checkbox_clicked}}, - State = #state{}) -> - {noreply, State}; -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config,"Got Event ~p\n",[Ev]), - {noreply, State}. - code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_splitterWindow.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_splitterWindow.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_splitterWindow.erl 2009-06-05 13:54:38.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_splitterWindow.erl 2009-09-18 15:11:23.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_splitterWindow). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -50,21 +50,19 @@ MainSizer = wxBoxSizer:new(?wxVERTICAL), Sizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "wxSplitterWindow"}]), + Splitter = wxSplitterWindow:new(Panel, []), - Win = wxPanel:new(Splitter, []), - wxStaticText:new(Win, 1, "Splitter 1"), - wxPanel:setBackgroundColour(Win, ?wxGREEN), - - Win2 = wxPanel:new(Splitter, []), - wxStaticText:new(Win2, 2, "Splitter 2"), - wxPanel:setBackgroundColour(Win2, ?wxRED), + Win1 = wxTextCtrl:new(Splitter, 1, [{value, "Splitted Window 1"}, + {style, ?wxDEFAULT bor ?wxTE_MULTILINE}]), + Win2 = wxTextCtrl:new(Splitter, 1, [{value, "Splitted Window 1"}, + {style, ?wxDEFAULT bor ?wxTE_MULTILINE}]), - wxSplitterWindow:splitVertically(Splitter, Win, Win2), + wxSplitterWindow:splitVertically(Splitter, Win1, Win2), wxSplitterWindow:setSashGravity(Splitter, 0.5), %% Set pane-size =/= 0 to not unsplit on doubleclick %% on the splitter - wxSplitterWindow:setMinimumPaneSize(Splitter, 1), + wxSplitterWindow:setMinimumPaneSize(Splitter,50), %% Add to sizers wxSizer:add(Sizer, Splitter, [{flag, ?wxEXPAND}, @@ -72,11 +70,17 @@ wxSizer:add(MainSizer, Sizer, [{proportion, 1}, {flag, ?wxEXPAND}]), - + wxPanel:connect(Panel, command_splitter_sash_pos_changed), wxPanel:setSizer(Panel, MainSizer), {Panel, #state{parent=Panel, config=Config}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Async Events are handled in handle_event as in handle_info +handle_event(#wx{event = #wxSplitter{type = command_splitter_sash_pos_changed}}, + State = #state{}) -> + demo:format(State#state.config, "Splitter pos changed.\n", []), + {noreply, State}. + %% Callbacks handled as normal gen_server callbacks handle_info(Msg, State) -> demo:format(State#state.config, "Got Info ~p\n", [Msg]), @@ -86,11 +90,6 @@ demo:format(State#state.config, "Got Call ~p\n", [Msg]), {reply,{error, nyi}, State}. -%% Async Events are handled in handle_event as in handle_info -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config, "Got Event ~p\n", [Ev]), - {noreply, State}. - code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_static.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_static.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_static.erl 2009-06-05 13:54:39.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_static.erl 2009-09-18 15:11:24.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_static). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -56,7 +56,7 @@ LineSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "wxStaticLine"}]), - %% Create items + %% Create static texts Texts = [wxStaticText:new(Panel, 1, "This is a regular text (left aligned)", []), wxStaticText:new(Panel, 2, "This is a centered text", [{style, ?wxALIGN_CENTER bor ?wxST_NO_AUTORESIZE}]), @@ -92,6 +92,10 @@ {Panel, #state{parent=Panel, config=Config}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Async Events are handled in handle_event as in handle_info +handle_event(#wx{}, State = #state{}) -> + {noreply, State}. + %% Callbacks handled as normal gen_server callbacks handle_info(Msg, State) -> demo:format(State#state.config, "Got Info ~p\n", [Msg]), @@ -101,11 +105,6 @@ demo:format(State#state.config, "Got Call ~p\n", [Msg]), {reply,{error, nyi}, State}. -%% Async Events are handled in handle_event as in handle_info -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config, "Got Event ~p\n", [Ev]), - {noreply, State}. - code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_textCtrl.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_textCtrl.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_textCtrl.erl 2009-06-05 13:54:37.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_textCtrl.erl 2009-09-18 15:11:21.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_textCtrl). --behavoiur(wx_object). +-behaviour(wx_object). -export([start/1, init/1, terminate/2, code_change/3, handle_info/2, handle_call/3, handle_event/2]). @@ -37,6 +37,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init(Config) -> wx:batch(fun() -> do_init(Config) end). + do_init(Config) -> Parent = proplists:get_value(parent, Config), Panel = wxPanel:new(Parent, []), @@ -77,6 +78,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Async Events are handled in handle_event as in handle_info +handle_event(Ev = #wx{}, State = #state{}) -> + demo:format(State#state.config,"Got Event ~p\n",[Ev]), + {noreply, State}. + %% Callbacks handled as normal gen_server callbacks handle_info(Msg, State) -> demo:format(State#state.config, "Got Info ~p\n",[Msg]), @@ -86,11 +92,6 @@ demo:format(State#state.config,"Got Call ~p\n",[Msg]), {reply, {error,nyi}, State}. -%% Async Events are handled in handle_event as in handle_info -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config,"Got Event ~p\n",[Ev]), - {noreply, State}. - code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_treeCtrl.erl erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_treeCtrl.erl --- erlang-13.b.1-dfsg/lib/wx/examples/demo/ex_treeCtrl.erl 2009-06-05 13:54:37.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/ex_treeCtrl.erl 2009-09-18 15:11:21.000000000 +0100 @@ -18,7 +18,7 @@ -module(ex_treeCtrl). --behavoiur(wx_object). +-behaviour(wx_object). %% Client API -export([start/1]). @@ -60,10 +60,11 @@ %% Create the first items in the treeCtrl SubItems = [{wxTreeCtrl:appendItem(TreeCtrl, RootId, Item), Item}|| Item <- Items], - %% Create sub items and append them - [[wxTreeCtrl:appendItem(TreeCtrl, ItemId, Item++" sub item "++integer_to_list(Int))|| - {ItemId, Item} <- SubItems] || Int <- lists:seq(1,10)], + %% Create sub items + [wxTreeCtrl:appendItem(TreeCtrl, ItemId, Item++" sub item "++integer_to_list(Int))|| + {ItemId, Item} <- SubItems, Int <- lists:seq(1,10)], wxTreeCtrl:expand(TreeCtrl, RootId), + %% Add to sizers Options = [{flag, ?wxEXPAND}, {proportion, 1}], wxSizer:add(Sizer, TreeCtrl, Options), @@ -76,15 +77,6 @@ {Panel, #state{parent=Panel, config=Config}}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Callbacks handled as normal gen_server callbacks -handle_info(Msg, State) -> - demo:format(State#state.config, "Got Info ~p\n", [Msg]), - {noreply, State}. - -handle_call(Msg, _From, State) -> - demo:format(State#state.config, "Got Call ~p\n", [Msg]), - {reply,{error, nyi}, State}. - %% Async Events are handled in handle_event as in handle_info handle_event(#wx{event = #wxTree{type = command_tree_item_collapsed, item = Item}, @@ -106,11 +98,17 @@ State = #state{}) -> ItemText = wxTreeCtrl:getItemText(TreeCtrl, Item), demo:format(State#state.config, "You have selected ~p.\n", [ItemText]), - {noreply, State}; -handle_event(Ev = #wx{}, State = #state{}) -> - demo:format(State#state.config, "Got Event ~p\n", [Ev]), {noreply, State}. +%% Callbacks handled as normal gen_server callbacks +handle_info(Msg, State) -> + demo:format(State#state.config, "Got Info ~p\n", [Msg]), + {noreply, State}. + +handle_call(Msg, _From, State) -> + demo:format(State#state.config, "Got Call ~p\n", [Msg]), + {reply,{error, nyi}, State}. + code_change(_, _, State) -> {stop, ignore, State}. diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/demo/Makefile erlang-13.b.3-dfsg/lib/wx/examples/demo/Makefile --- erlang-13.b.1-dfsg/lib/wx/examples/demo/Makefile 2009-06-05 13:54:36.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/demo/Makefile 2009-09-18 15:11:20.000000000 +0100 @@ -27,15 +27,19 @@ ERLC = erlc TESTMODS = \ demo \ + demo_html_tagger \ + ex_aui \ ex_button \ ex_canvas \ ex_canvas_paint \ ex_choices \ ex_cursor \ ex_dialogs \ - ex_frameutilities \ + ex_frame_utils \ ex_gauge \ + ex_gl \ ex_grid \ + ex_htmlWindow \ ex_listCtrl \ ex_notebook \ ex_pickers \ @@ -47,7 +51,9 @@ ex_splitterWindow \ ex_static \ ex_textCtrl \ - ex_treeCtrl + ex_treeCtrl \ + ex_graphicsContext + TESTTARGETS = $(TESTMODS:%=%.beam) TESTSRC = $(TESTMODS:%=%.erl) @@ -78,7 +84,7 @@ $(INSTALL_DIR) $(EXRELSYSDIR) $(INSTALL_DATA) $(TESTSRC) $(EXRELSYSDIR) $(INSTALL_DATA) $(TESTTARGETS) $(EXRELSYSDIR) - $(INSTALL_DATA) image.jpg $(EXRELSYSDIR) + $(INSTALL_DATA) image.jpg erlang.png ex_htmlWindow.html $(EXRELSYSDIR) release_tests_spec: diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/sudoku/sudoku_board.erl erlang-13.b.3-dfsg/lib/wx/examples/sudoku/sudoku_board.erl --- erlang-13.b.1-dfsg/lib/wx/examples/sudoku/sudoku_board.erl 2009-03-12 12:26:20.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/examples/sudoku/sudoku_board.erl 2009-09-18 15:11:08.000000000 +0100 @@ -77,7 +77,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init([ParentObj, ParentPid]) -> - Win = wxWindow:new(ParentObj, ?wxID_ANY, [{style, ?wxFULL_REPAINT_ON_RESIZE}]), + Win = wxPanel:new(ParentObj, [{style, ?wxFULL_REPAINT_ON_RESIZE}]), wxWindow:setFocus(Win), %% Get keyboard focus wxWindow:setSizeHints(Win, {250,250}), wxWindow:connect(Win, paint, [callback]), @@ -344,12 +344,14 @@ wxEvtHandler:connect(PopupMenu, command_menu_selected), wxWindow:popupMenu(Frame,PopupMenu,X,Y), receive + #wx{event=#wxCommand{type=command_menu_selected},id=10} -> + GFX ! {set_val,Butt,0}; #wx{event=#wxCommand{type=command_menu_selected},id=What} -> GFX ! {set_val,Butt,What} end. create_popup_menu2(N,PP) when N > 9 -> - wxMenu:append(PP, 0, "Clear"); + wxMenu:append(PP, 10, "Clear"); create_popup_menu2(N,PP) -> wxMenu:append(PP, N,integer_to_list(N)), create_popup_menu2(N+1,PP). diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/sudoku/sudoku_gui.erl erlang-13.b.3-dfsg/lib/wx/examples/sudoku/sudoku_gui.erl --- erlang-13.b.1-dfsg/lib/wx/examples/sudoku/sudoku_gui.erl 2009-06-05 13:54:34.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/sudoku/sudoku_gui.erl 2009-09-18 15:11:09.000000000 +0100 @@ -113,9 +113,9 @@ wxSizer:addSpacer(Top,3), wxSizer:add(Top, Hint, wxSizerFlags:right(SF)), - wxSizer:addSpacer(MainSz,3), + wxSizer:addSpacer(MainSz,5), wxSizer:add(MainSz, Top, wxSizerFlags:center(wxSizerFlags:proportion(SF,0))), - wxSizer:addSpacer(MainSz,3), + wxSizer:addSpacer(MainSz,10), Board = sudoku_board:new(Panel), diff -Nru erlang-13.b.1-dfsg/lib/wx/examples/xrc/xrc.erl erlang-13.b.3-dfsg/lib/wx/examples/xrc/xrc.erl --- erlang-13.b.1-dfsg/lib/wx/examples/xrc/xrc.erl 2009-04-16 10:25:58.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/examples/xrc/xrc.erl 2009-09-18 15:11:18.000000000 +0100 @@ -251,6 +251,9 @@ end, wxDialog:connect(Dlg,update_ui,[{id,wxXmlResource:getXRCID("my_checkbox")}, {callback,OnMyCheckBox}]), + + %% Keep updateUI event interval at 250ms + wxUpdateUIEvent:setUpdateInterval(250), OnOk = fun(_,_) -> Str = diff -Nru erlang-13.b.1-dfsg/lib/wx/include/gl.hrl erlang-13.b.3-dfsg/lib/wx/include/gl.hrl --- erlang-13.b.1-dfsg/lib/wx/include/gl.hrl 2009-03-12 12:25:43.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/include/gl.hrl 2009-09-18 15:10:59.000000000 +0100 @@ -782,7 +782,7 @@ -define(GL_TEXTURE_COMPARE_MODE, 16#884C). -define(GL_TEXTURE_COMPARE_FUNC, 16#884D). -define(GL_COMPARE_R_TO_TEXTURE, 16#884E). --define(GL_GLEXT_VERSION, 44). +-define(GL_GLEXT_VERSION, 52). -define(GL_CONSTANT_COLOR, 16#8001). -define(GL_ONE_MINUS_CONSTANT_COLOR, 16#8002). -define(GL_CONSTANT_ALPHA, 16#8003). @@ -867,15 +867,6 @@ -define(GL_ELEMENT_ARRAY_BUFFER, 16#8893). -define(GL_ARRAY_BUFFER_BINDING, 16#8894). -define(GL_ELEMENT_ARRAY_BUFFER_BINDING, 16#8895). --define(GL_VERTEX_ARRAY_BUFFER_BINDING, 16#8896). --define(GL_NORMAL_ARRAY_BUFFER_BINDING, 16#8897). --define(GL_COLOR_ARRAY_BUFFER_BINDING, 16#8898). --define(GL_INDEX_ARRAY_BUFFER_BINDING, 16#8899). --define(GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING, 16#889A). --define(GL_EDGE_FLAG_ARRAY_BUFFER_BINDING, 16#889B). --define(GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING, 16#889C). --define(GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING, 16#889D). --define(GL_WEIGHT_ARRAY_BUFFER_BINDING, 16#889E). -define(GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, 16#889F). -define(GL_READ_ONLY, 16#88B8). -define(GL_WRITE_ONLY, 16#88B9). @@ -893,28 +884,36 @@ -define(GL_DYNAMIC_READ, 16#88E9). -define(GL_DYNAMIC_COPY, 16#88EA). -define(GL_SAMPLES_PASSED, 16#8914). --define(GL_FOG_COORD_SRC, ?GL_FOG_COORDINATE_SOURCE). --define(GL_FOG_COORD, ?GL_FOG_COORDINATE). --define(GL_CURRENT_FOG_COORD, ?GL_CURRENT_FOG_COORDINATE). --define(GL_FOG_COORD_ARRAY_TYPE, ?GL_FOG_COORDINATE_ARRAY_TYPE). --define(GL_FOG_COORD_ARRAY_STRIDE, ?GL_FOG_COORDINATE_ARRAY_STRIDE). --define(GL_FOG_COORD_ARRAY_POINTER, ?GL_FOG_COORDINATE_ARRAY_POINTER). --define(GL_FOG_COORD_ARRAY, ?GL_FOG_COORDINATE_ARRAY). --define(GL_FOG_COORD_ARRAY_BUFFER_BINDING, ?GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING). --define(GL_SRC0_RGB, ?GL_SOURCE0_RGB). --define(GL_SRC1_RGB, ?GL_SOURCE1_RGB). --define(GL_SRC2_RGB, ?GL_SOURCE2_RGB). --define(GL_SRC0_ALPHA, ?GL_SOURCE0_ALPHA). --define(GL_SRC1_ALPHA, ?GL_SOURCE1_ALPHA). --define(GL_SRC2_ALPHA, ?GL_SOURCE2_ALPHA). --define(GL_BLEND_EQUATION_RGB, ?GL_BLEND_EQUATION). +-define(GL_VERTEX_ARRAY_BUFFER_BINDING, 16#8896). +-define(GL_NORMAL_ARRAY_BUFFER_BINDING, 16#8897). +-define(GL_COLOR_ARRAY_BUFFER_BINDING, 16#8898). +-define(GL_INDEX_ARRAY_BUFFER_BINDING, 16#8899). +-define(GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING, 16#889A). +-define(GL_EDGE_FLAG_ARRAY_BUFFER_BINDING, 16#889B). +-define(GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING, 16#889C). +-define(GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING, 16#889D). +-define(GL_WEIGHT_ARRAY_BUFFER_BINDING, 16#889E). +-define(GL_FOG_COORD_SRC, 16#8450). +-define(GL_FOG_COORD, 16#8451). +-define(GL_CURRENT_FOG_COORD, 16#8453). +-define(GL_FOG_COORD_ARRAY_TYPE, 16#8454). +-define(GL_FOG_COORD_ARRAY_STRIDE, 16#8455). +-define(GL_FOG_COORD_ARRAY_POINTER, 16#8456). +-define(GL_FOG_COORD_ARRAY, 16#8457). +-define(GL_FOG_COORD_ARRAY_BUFFER_BINDING, 16#889D). +-define(GL_SRC0_RGB, 16#8580). +-define(GL_SRC1_RGB, 16#8581). +-define(GL_SRC2_RGB, 16#8582). +-define(GL_SRC0_ALPHA, 16#8588). +-define(GL_SRC1_ALPHA, 16#8589). +-define(GL_SRC2_ALPHA, 16#858A). +-define(GL_BLEND_EQUATION_RGB, 16#8009). -define(GL_VERTEX_ATTRIB_ARRAY_ENABLED, 16#8622). -define(GL_VERTEX_ATTRIB_ARRAY_SIZE, 16#8623). -define(GL_VERTEX_ATTRIB_ARRAY_STRIDE, 16#8624). -define(GL_VERTEX_ATTRIB_ARRAY_TYPE, 16#8625). -define(GL_CURRENT_VERTEX_ATTRIB, 16#8626). -define(GL_VERTEX_PROGRAM_POINT_SIZE, 16#8642). --define(GL_VERTEX_PROGRAM_TWO_SIDE, 16#8643). -define(GL_VERTEX_ATTRIB_ARRAY_POINTER, 16#8645). -define(GL_STENCIL_BACK_FUNC, 16#8800). -define(GL_STENCIL_BACK_FAIL, 16#8801). @@ -938,11 +937,8 @@ -define(GL_DRAW_BUFFER14, 16#8833). -define(GL_DRAW_BUFFER15, 16#8834). -define(GL_BLEND_EQUATION_ALPHA, 16#883D). --define(GL_POINT_SPRITE, 16#8861). --define(GL_COORD_REPLACE, 16#8862). -define(GL_MAX_VERTEX_ATTRIBS, 16#8869). -define(GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, 16#886A). --define(GL_MAX_TEXTURE_COORDS, 16#8871). -define(GL_MAX_TEXTURE_IMAGE_UNITS, 16#8872). -define(GL_FRAGMENT_SHADER, 16#8B30). -define(GL_VERTEX_SHADER, 16#8B31). @@ -991,7 +987,10 @@ -define(GL_STENCIL_BACK_REF, 16#8CA3). -define(GL_STENCIL_BACK_VALUE_MASK, 16#8CA4). -define(GL_STENCIL_BACK_WRITEMASK, 16#8CA5). --define(GL_CURRENT_RASTER_SECONDARY_COLOR, 16#845F). +-define(GL_VERTEX_PROGRAM_TWO_SIDE, 16#8643). +-define(GL_POINT_SPRITE, 16#8861). +-define(GL_COORD_REPLACE, 16#8862). +-define(GL_MAX_TEXTURE_COORDS, 16#8871). -define(GL_PIXEL_PACK_BUFFER, 16#88EB). -define(GL_PIXEL_UNPACK_BUFFER, 16#88EC). -define(GL_PIXEL_PACK_BUFFER_BINDING, 16#88ED). @@ -1006,22 +1005,23 @@ -define(GL_SRGB8, 16#8C41). -define(GL_SRGB_ALPHA, 16#8C42). -define(GL_SRGB8_ALPHA8, 16#8C43). +-define(GL_COMPRESSED_SRGB, 16#8C48). +-define(GL_COMPRESSED_SRGB_ALPHA, 16#8C49). +-define(GL_CURRENT_RASTER_SECONDARY_COLOR, 16#845F). -define(GL_SLUMINANCE_ALPHA, 16#8C44). -define(GL_SLUMINANCE8_ALPHA8, 16#8C45). -define(GL_SLUMINANCE, 16#8C46). -define(GL_SLUMINANCE8, 16#8C47). --define(GL_COMPRESSED_SRGB, 16#8C48). --define(GL_COMPRESSED_SRGB_ALPHA, 16#8C49). -define(GL_COMPRESSED_SLUMINANCE, 16#8C4A). -define(GL_COMPRESSED_SLUMINANCE_ALPHA, 16#8C4B). --define(GL_COMPARE_REF_TO_TEXTURE, ?GL_COMPARE_R_TO_TEXTURE_ARB). --define(GL_CLIP_DISTANCE0, ?GL_CLIP_PLANE0). --define(GL_CLIP_DISTANCE1, ?GL_CLIP_PLANE1). --define(GL_CLIP_DISTANCE2, ?GL_CLIP_PLANE2). --define(GL_CLIP_DISTANCE3, ?GL_CLIP_PLANE3). --define(GL_CLIP_DISTANCE4, ?GL_CLIP_PLANE4). --define(GL_CLIP_DISTANCE5, ?GL_CLIP_PLANE5). --define(GL_MAX_CLIP_DISTANCES, ?GL_MAX_CLIP_PLANES). +-define(GL_COMPARE_REF_TO_TEXTURE, 16#884E). +-define(GL_CLIP_DISTANCE0, 16#3000). +-define(GL_CLIP_DISTANCE1, 16#3001). +-define(GL_CLIP_DISTANCE2, 16#3002). +-define(GL_CLIP_DISTANCE3, 16#3003). +-define(GL_CLIP_DISTANCE4, 16#3004). +-define(GL_CLIP_DISTANCE5, 16#3005). +-define(GL_MAX_CLIP_DISTANCES, 16#D32). -define(GL_MAJOR_VERSION, 16#821B). -define(GL_MINOR_VERSION, 16#821C). -define(GL_NUM_EXTENSIONS, 16#821D). @@ -1039,19 +1039,9 @@ -define(GL_MAX_ARRAY_TEXTURE_LAYERS, 16#88FF). -define(GL_MIN_PROGRAM_TEXEL_OFFSET, 16#8904). -define(GL_MAX_PROGRAM_TEXEL_OFFSET, 16#8905). --define(GL_CLAMP_VERTEX_COLOR, 16#891A). --define(GL_CLAMP_FRAGMENT_COLOR, 16#891B). -define(GL_CLAMP_READ_COLOR, 16#891C). -define(GL_FIXED_ONLY, 16#891D). --define(GL_MAX_VARYING_COMPONENTS, ?GL_MAX_VARYING_FLOATS). --define(GL_TEXTURE_RED_TYPE, 16#8C10). --define(GL_TEXTURE_GREEN_TYPE, 16#8C11). --define(GL_TEXTURE_BLUE_TYPE, 16#8C12). --define(GL_TEXTURE_ALPHA_TYPE, 16#8C13). --define(GL_TEXTURE_LUMINANCE_TYPE, 16#8C14). --define(GL_TEXTURE_INTENSITY_TYPE, 16#8C15). --define(GL_TEXTURE_DEPTH_TYPE, 16#8C16). --define(GL_UNSIGNED_NORMALIZED, 16#8C17). +-define(GL_MAX_VARYING_COMPONENTS, 16#8B4B). -define(GL_TEXTURE_1D_ARRAY, 16#8C18). -define(GL_PROXY_TEXTURE_1D_ARRAY, 16#8C19). -define(GL_TEXTURE_2D_ARRAY, 16#8C1A). @@ -1093,7 +1083,6 @@ -define(GL_RED_INTEGER, 16#8D94). -define(GL_GREEN_INTEGER, 16#8D95). -define(GL_BLUE_INTEGER, 16#8D96). --define(GL_ALPHA_INTEGER, 16#8D97). -define(GL_RGB_INTEGER, 16#8D98). -define(GL_RGBA_INTEGER, 16#8D99). -define(GL_BGR_INTEGER, 16#8D9A). @@ -1122,6 +1111,40 @@ -define(GL_QUERY_NO_WAIT, 16#8E14). -define(GL_QUERY_BY_REGION_WAIT, 16#8E15). -define(GL_QUERY_BY_REGION_NO_WAIT, 16#8E16). +-define(GL_CLAMP_VERTEX_COLOR, 16#891A). +-define(GL_CLAMP_FRAGMENT_COLOR, 16#891B). +-define(GL_ALPHA_INTEGER, 16#8D97). +-define(GL_SAMPLER_2D_RECT, 16#8B63). +-define(GL_SAMPLER_2D_RECT_SHADOW, 16#8B64). +-define(GL_SAMPLER_BUFFER, 16#8DC2). +-define(GL_INT_SAMPLER_2D_RECT, 16#8DCD). +-define(GL_INT_SAMPLER_BUFFER, 16#8DD0). +-define(GL_UNSIGNED_INT_SAMPLER_2D_RECT, 16#8DD5). +-define(GL_UNSIGNED_INT_SAMPLER_BUFFER, 16#8DD8). +-define(GL_TEXTURE_BUFFER, 16#8C2A). +-define(GL_MAX_TEXTURE_BUFFER_SIZE, 16#8C2B). +-define(GL_TEXTURE_BINDING_BUFFER, 16#8C2C). +-define(GL_TEXTURE_BUFFER_DATA_STORE_BINDING, 16#8C2D). +-define(GL_TEXTURE_BUFFER_FORMAT, 16#8C2E). +-define(GL_TEXTURE_RECTANGLE, 16#84F5). +-define(GL_TEXTURE_BINDING_RECTANGLE, 16#84F6). +-define(GL_PROXY_TEXTURE_RECTANGLE, 16#84F7). +-define(GL_MAX_RECTANGLE_TEXTURE_SIZE, 16#84F8). +-define(GL_RED_SNORM, 16#8F90). +-define(GL_RG_SNORM, 16#8F91). +-define(GL_RGB_SNORM, 16#8F92). +-define(GL_RGBA_SNORM, 16#8F93). +-define(GL_R8_SNORM, 16#8F94). +-define(GL_RG8_SNORM, 16#8F95). +-define(GL_RGB8_SNORM, 16#8F96). +-define(GL_RGBA8_SNORM, 16#8F97). +-define(GL_R16_SNORM, 16#8F98). +-define(GL_RG16_SNORM, 16#8F99). +-define(GL_RGB16_SNORM, 16#8F9A). +-define(GL_RGBA16_SNORM, 16#8F9B). +-define(GL_SIGNED_NORMALIZED, 16#8F9C). +-define(GL_PRIMITIVE_RESTART, 16#8F9D). +-define(GL_PRIMITIVE_RESTART_INDEX, 16#8F9E). -define(GL_TEXTURE0_ARB, 16#84C0). -define(GL_TEXTURE1_ARB, 16#84C1). -define(GL_TEXTURE2_ARB, 16#84C2). @@ -1527,12 +1550,17 @@ -define(GL_FRAMEBUFFER_DEFAULT, 16#8218). -define(GL_FRAMEBUFFER_UNDEFINED, 16#8219). -define(GL_DEPTH_STENCIL_ATTACHMENT, 16#821A). --define(GL_INDEX, 16#8222). -define(GL_MAX_RENDERBUFFER_SIZE, 16#84E8). -define(GL_DEPTH_STENCIL, 16#84F9). -define(GL_UNSIGNED_INT_24_8, 16#84FA). -define(GL_DEPTH24_STENCIL8, 16#88F0). -define(GL_TEXTURE_STENCIL_SIZE, 16#88F1). +-define(GL_TEXTURE_RED_TYPE, 16#8C10). +-define(GL_TEXTURE_GREEN_TYPE, 16#8C11). +-define(GL_TEXTURE_BLUE_TYPE, 16#8C12). +-define(GL_TEXTURE_ALPHA_TYPE, 16#8C13). +-define(GL_TEXTURE_DEPTH_TYPE, 16#8C16). +-define(GL_UNSIGNED_NORMALIZED, 16#8C17). -define(GL_FRAMEBUFFER_BINDING, 16#8CA6). -define(GL_DRAW_FRAMEBUFFER_BINDING, ?GL_FRAMEBUFFER_BINDING). -define(GL_RENDERBUFFER_BINDING, 16#8CA7). @@ -1587,6 +1615,9 @@ -define(GL_RENDERBUFFER_STENCIL_SIZE, 16#8D55). -define(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE, 16#8D56). -define(GL_MAX_SAMPLES, 16#8D57). +-define(GL_INDEX, 16#8222). +-define(GL_TEXTURE_LUMINANCE_TYPE, 16#8C14). +-define(GL_TEXTURE_INTENSITY_TYPE, 16#8C15). -define(GL_FRAMEBUFFER_SRGB, 16#8DB9). -define(GL_LINES_ADJACENCY_ARB, 16#A). -define(GL_LINE_STRIP_ADJACENCY_ARB, 16#B). @@ -1607,6 +1638,7 @@ -define(GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB, 16#8DE0). -define(GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB, 16#8DE1). -define(GL_HALF_FLOAT, 16#140B). +-define(GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB, 16#88FE). -define(GL_MAP_READ_BIT, 16#1). -define(GL_MAP_WRITE_BIT, 16#2). -define(GL_MAP_INVALIDATE_RANGE_BIT, 16#4). @@ -1645,6 +1677,41 @@ -define(GL_RG32I, 16#823B). -define(GL_RG32UI, 16#823C). -define(GL_VERTEX_ARRAY_BINDING, 16#85B5). +-define(GL_UNIFORM_BUFFER, 16#8A11). +-define(GL_UNIFORM_BUFFER_BINDING, 16#8A28). +-define(GL_UNIFORM_BUFFER_START, 16#8A29). +-define(GL_UNIFORM_BUFFER_SIZE, 16#8A2A). +-define(GL_MAX_VERTEX_UNIFORM_BLOCKS, 16#8A2B). +-define(GL_MAX_GEOMETRY_UNIFORM_BLOCKS, 16#8A2C). +-define(GL_MAX_FRAGMENT_UNIFORM_BLOCKS, 16#8A2D). +-define(GL_MAX_COMBINED_UNIFORM_BLOCKS, 16#8A2E). +-define(GL_MAX_UNIFORM_BUFFER_BINDINGS, 16#8A2F). +-define(GL_MAX_UNIFORM_BLOCK_SIZE, 16#8A30). +-define(GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, 16#8A31). +-define(GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS, 16#8A32). +-define(GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, 16#8A33). +-define(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, 16#8A34). +-define(GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, 16#8A35). +-define(GL_ACTIVE_UNIFORM_BLOCKS, 16#8A36). +-define(GL_UNIFORM_TYPE, 16#8A37). +-define(GL_UNIFORM_SIZE, 16#8A38). +-define(GL_UNIFORM_NAME_LENGTH, 16#8A39). +-define(GL_UNIFORM_BLOCK_INDEX, 16#8A3A). +-define(GL_UNIFORM_OFFSET, 16#8A3B). +-define(GL_UNIFORM_ARRAY_STRIDE, 16#8A3C). +-define(GL_UNIFORM_MATRIX_STRIDE, 16#8A3D). +-define(GL_UNIFORM_IS_ROW_MAJOR, 16#8A3E). +-define(GL_UNIFORM_BLOCK_BINDING, 16#8A3F). +-define(GL_UNIFORM_BLOCK_DATA_SIZE, 16#8A40). +-define(GL_UNIFORM_BLOCK_NAME_LENGTH, 16#8A41). +-define(GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, 16#8A42). +-define(GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, 16#8A43). +-define(GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER, 16#8A44). +-define(GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER, 16#8A45). +-define(GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER, 16#8A46). +-define(GL_INVALID_INDEX, 16#FFFFFFFF). +-define(GL_COPY_READ_BUFFER, 16#8F36). +-define(GL_COPY_WRITE_BUFFER, 16#8F37). -define(GL_CONSTANT_COLOR_EXT, 16#8001). -define(GL_ONE_MINUS_CONSTANT_COLOR_EXT, 16#8002). -define(GL_CONSTANT_ALPHA_EXT, 16#8003). @@ -2949,7 +3016,7 @@ -define(GL_MIRROR_CLAMP_EXT, 16#8742). -define(GL_MIRROR_CLAMP_TO_EDGE_EXT, 16#8743). -define(GL_MIRROR_CLAMP_TO_BORDER_EXT, 16#8912). --define(GL_BLEND_EQUATION_RGB_EXT, ?GL_BLEND_EQUATION). +-define(GL_BLEND_EQUATION_RGB_EXT, 16#8009). -define(GL_BLEND_EQUATION_ALPHA_EXT, 16#883D). -define(GL_PACK_INVERT_MESA, 16#8758). -define(GL_UNSIGNED_SHORT_8_8_MESA, 16#85BA). @@ -3277,13 +3344,39 @@ -define(GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV, 16#8E23). -define(GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV, 16#8E24). -define(GL_TRANSFORM_FEEDBACK_BINDING_NV, 16#8E25). +-define(GL_VBO_FREE_MEMORY_ATI, 16#87FB). +-define(GL_TEXTURE_FREE_MEMORY_ATI, 16#87FC). +-define(GL_RENDERBUFFER_FREE_MEMORY_ATI, 16#87FD). +-define(GL_COUNTER_TYPE_AMD, 16#8BC0). +-define(GL_COUNTER_RANGE_AMD, 16#8BC1). +-define(GL_UNSIGNED_INT64_AMD, 16#8BC2). +-define(GL_PERCENTAGE_AMD, 16#8BC3). +-define(GL_PERFMON_RESULT_AVAILABLE_AMD, 16#8BC4). +-define(GL_PERFMON_RESULT_SIZE_AMD, 16#8BC5). +-define(GL_PERFMON_RESULT_AMD, 16#8BC6). +-define(GL_SAMPLER_BUFFER_AMD, 16#9001). +-define(GL_INT_SAMPLER_BUFFER_AMD, 16#9002). +-define(GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD, 16#9003). +-define(GL_TESSELLATION_MODE_AMD, 16#9004). +-define(GL_TESSELLATION_FACTOR_AMD, 16#9005). +-define(GL_DISCRETE_AMD, 16#9006). +-define(GL_CONTINUOUS_AMD, 16#9007). +-define(GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT, 16#8E4C). +-define(GL_FIRST_VERTEX_CONVENTION_EXT, 16#8E4D). +-define(GL_LAST_VERTEX_CONVENTION_EXT, 16#8E4E). +-define(GL_PROVOKING_VERTEX_EXT, 16#8E4F). -define(GL_VERSION_1_2, 1). +-define(GL_VERSION_1_2_DEPRECATED, 1). -define(GL_VERSION_1_3, 1). +-define(GL_VERSION_1_3_DEPRECATED, 1). -define(GL_VERSION_1_4, 1). +-define(GL_VERSION_1_4_DEPRECATED, 1). -define(GL_VERSION_1_5, 1). -define(GL_VERSION_2_0, 1). -define(GL_VERSION_2_1, 1). -define(GL_VERSION_3_0, 1). +-define(GL_VERSION_3_0_DEPRECATED, 1). +-define(GL_VERSION_3_1, 1). -define(GL_ARB_multitexture, 1). -define(GL_ARB_transpose_matrix, 1). -define(GL_ARB_multisample, 1). @@ -3331,6 +3424,10 @@ -define(GL_ARB_texture_compression_rgtc, 1). -define(GL_ARB_texture_rg, 1). -define(GL_ARB_vertex_array_object, 1). +-define(GL_ARB_uniform_buffer_object, 1). +-define(GL_ARB_compatibility, 1). +-define(GL_ARB_copy_buffer, 1). +-define(GL_ARB_shader_texture_lod, 1). -define(GL_EXT_abgr, 1). -define(GL_EXT_blend_color, 1). -define(GL_EXT_polygon_offset, 1). @@ -3582,3 +3679,8 @@ -define(GL_EXT_texture_swizzle, 1). -define(GL_NV_explicit_multisample, 1). -define(GL_NV_transform_feedback2, 1). +-define(GL_ATI_meminfo, 1). +-define(GL_AMD_performance_monitor, 1). +-define(GL_AMD_texture_texture4, 1). +-define(GL_AMD_vertex_shader_tesselator, 1). +-define(GL_EXT_provoking_vertex, 1). diff -Nru erlang-13.b.1-dfsg/lib/wx/include/wx.hrl erlang-13.b.3-dfsg/lib/wx/include/wx.hrl --- erlang-13.b.1-dfsg/lib/wx/include/wx.hrl 2009-06-05 13:54:32.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/include/wx.hrl 2009-09-18 15:10:59.000000000 +0100 @@ -151,6 +151,11 @@ %% Callback event: {@link wxDateEvent} -record(wxDate,{type, date}). +%% @type wxHtmlLink() = #wxHtmlLink{type=wxEventType(),linkInfo=wx:wxHtmlLinkInfo()}. +%%
    EventType:
    command_html_link_clicked
    +%% Callback event: {@link wxHtmlLinkEvent} +-record(wxHtmlLink,{type, linkInfo}). + %% @type wxHelp() = #wxHelp{type=wxEventType()}. %%
    EventType:
    help, detailed_help
    %% Callback event: {@link wxHelpEvent} @@ -191,6 +196,11 @@ %% Callback event: {@link wxIconizeEvent} -record(wxIconize, {type}). +%% @type wxAuiNotebook() = #wxAuiNotebook{type=wxEventType(),old_selection=integer(),selection=integer(),drag_source=wxAuiNotebook:wxAuiNotebook()}. +%%
    EventType:
    command_auinotebook_page_close, command_auinotebook_page_changed, command_auinotebook_page_changing, command_auinotebook_button, command_auinotebook_begin_drag, command_auinotebook_end_drag, command_auinotebook_drag_motion, command_auinotebook_allow_dnd, command_auinotebook_tab_middle_down, command_auinotebook_tab_middle_up, command_auinotebook_tab_right_down, command_auinotebook_tab_right_up, command_auinotebook_page_closed, command_auinotebook_drag_done, command_auinotebook_bg_dclick
    +%% Callback event: {@link wxAuiNotebookEvent} +-record(wxAuiNotebook,{type, old_selection,selection,drag_source}). + %% @type wxClose() = #wxClose{type=wxEventType()}. %%
    EventType:
    close_window, end_session, query_end_session
    %% Callback event: {@link wxCloseEvent} @@ -211,6 +221,11 @@ %% Callback event: {@link wxWindowCreateEvent} -record(wxWindowCreate, {type}). +%% @type wxAuiManager() = #wxAuiManager{type=wxEventType(),manager=wxAuiManager:wxAuiManager(),pane=wxAuiPaneInfo:wxAuiPaneInfo(),button=integer(),veto_flag=bool(),canveto_flag=bool(),dc=wxDC:wxDC()}. +%%
    EventType:
    aui_pane_button, aui_pane_close, aui_pane_maximize, aui_pane_restore, aui_render, aui_find_manager
    +%% Callback event: {@link wxAuiManagerEvent} +-record(wxAuiManager,{type, manager,pane,button,veto_flag,canveto_flag,dc}). + %% @type wxCommand() = #wxCommand{type=wxEventType(),cmdString=string(),commandInt=integer(),extraLong=integer()}. %%
    EventType:
    command_button_clicked, command_checkbox_clicked, command_choice_selected, command_listbox_selected, command_listbox_doubleclicked, command_text_updated, command_text_enter, command_menu_selected, command_slider_updated, command_radiobox_selected, command_radiobutton_selected, command_scrollbar_updated, command_vlbox_selected, command_combobox_selected, command_tool_rclicked, command_tool_enter, command_checklistbox_toggled, command_togglebutton_clicked, command_left_click, command_left_dclick, command_right_click, command_set_focus, command_kill_focus, command_enter
    %% Callback event: {@link wxCommandEvent} @@ -251,13 +266,16 @@ %% Callback event: {@link wxTreeEvent} -record(wxTree,{type, item,itemOld,pointDrag}). -%% @type wxEventType() = calendar_day_changed | calendar_doubleclicked | calendar_month_changed | calendar_sel_changed | calendar_weekday_clicked | calendar_year_changed | char | char_hook | child_focus | close_window | command_button_clicked | command_checkbox_clicked | command_checklistbox_toggled | command_choice_selected | command_colourpicker_changed | command_combobox_selected | command_dirpicker_changed | command_enter | command_filepicker_changed | command_fontpicker_changed | command_kill_focus | command_left_click | command_left_dclick | command_list_begin_drag | command_list_begin_label_edit | command_list_begin_rdrag | command_list_cache_hint | command_list_col_begin_drag | command_list_col_click | command_list_col_dragging | command_list_col_end_drag | command_list_col_right_click | command_list_delete_all_items | command_list_delete_item | command_list_end_label_edit | command_list_insert_item | command_list_item_activated | command_list_item_deselected | command_list_item_focused | command_list_item_middle_click | command_list_item_right_click | command_list_item_selected | command_list_key_down | command_listbox_doubleclicked | command_listbox_selected | command_menu_selected | command_notebook_page_changed | command_notebook_page_changing | command_radiobox_selected | command_radiobutton_selected | command_right_click | command_scrollbar_updated | command_set_focus | command_slider_updated | command_spinctrl_updated | command_splitter_doubleclicked | command_splitter_sash_pos_changed | command_splitter_sash_pos_changing | command_splitter_unsplit | command_text_enter | command_text_updated | command_togglebutton_clicked | command_tool_enter | command_tool_rclicked | command_tree_begin_drag | command_tree_begin_label_edit | command_tree_begin_rdrag | command_tree_delete_item | command_tree_end_drag | command_tree_end_label_edit | command_tree_get_info | command_tree_item_activated | command_tree_item_collapsed | command_tree_item_collapsing | command_tree_item_expanded | command_tree_item_expanding | command_tree_item_gettooltip | command_tree_item_menu | command_tree_item_middle_click | command_tree_item_right_click | command_tree_key_down | command_tree_sel_changed | command_tree_sel_changing | command_tree_set_info | command_tree_state_image_click | command_vlbox_selected | context_menu | create | date_changed | destroy | detailed_help | display_changed | end_session | enter_window | erase_background | grid_cell_begin_drag | grid_cell_change | grid_cell_left_click | grid_cell_left_dclick | grid_cell_right_click | grid_cell_right_dclick | grid_col_size | grid_editor_created | grid_editor_hidden | grid_editor_shown | grid_label_left_click | grid_label_left_dclick | grid_label_right_click | grid_label_right_dclick | grid_range_select | grid_row_size | grid_select_cell | help | iconize | idle | joy_button_down | joy_button_up | joy_move | joy_zmove | key_down | key_up | kill_focus | leave_window | left_dclick | left_down | left_up | maximize | menu_close | menu_highlight | menu_open | middle_dclick | middle_down | middle_up | motion | mouse_capture_changed | mousewheel | move | navigation_key | nc_enter_window | nc_leave_window | nc_left_dclick | nc_left_down | nc_left_up | nc_middle_dclick | nc_middle_down | nc_middle_up | nc_motion | nc_paint | nc_right_dclick | nc_right_down | nc_right_up | paint | paint_icon | palette_changed | query_end_session | query_new_palette | right_dclick | right_down | right_up | sash_dragged | scroll_bottom | scroll_changed | scroll_linedown | scroll_lineup | scroll_pagedown | scroll_pageup | scroll_thumbrelease | scroll_thumbtrack | scroll_top | scrollwin_bottom | scrollwin_linedown | scrollwin_lineup | scrollwin_pagedown | scrollwin_pageup | scrollwin_thumbrelease | scrollwin_thumbtrack | scrollwin_top | set_cursor | set_focus | show | size | spin | spin_down | spin_up | stc_autocomp_selection | stc_calltip_click | stc_change | stc_charadded | stc_do_drop | stc_doubleclick | stc_drag_over | stc_dwellend | stc_dwellstart | stc_hotspot_click | stc_hotspot_dclick | stc_key | stc_macrorecord | stc_marginclick | stc_modified | stc_needshown | stc_painted | stc_romodifyattempt | stc_savepointleft | stc_savepointreached | stc_start_drag | stc_styleneeded | stc_updateui | stc_uridropped | stc_userlistselection | stc_zoom | sys_colour_changed | update_ui. +%% @type wxEventType() = aui_find_manager | aui_pane_button | aui_pane_close | aui_pane_maximize | aui_pane_restore | aui_render | calendar_day_changed | calendar_doubleclicked | calendar_month_changed | calendar_sel_changed | calendar_weekday_clicked | calendar_year_changed | char | char_hook | child_focus | close_window | command_auinotebook_allow_dnd | command_auinotebook_begin_drag | command_auinotebook_bg_dclick | command_auinotebook_button | command_auinotebook_drag_done | command_auinotebook_drag_motion | command_auinotebook_end_drag | command_auinotebook_page_changed | command_auinotebook_page_changing | command_auinotebook_page_close | command_auinotebook_page_closed | command_auinotebook_tab_middle_down | command_auinotebook_tab_middle_up | command_auinotebook_tab_right_down | command_auinotebook_tab_right_up | command_button_clicked | command_checkbox_clicked | command_checklistbox_toggled | command_choice_selected | command_colourpicker_changed | command_combobox_selected | command_dirpicker_changed | command_enter | command_filepicker_changed | command_fontpicker_changed | command_html_link_clicked | command_kill_focus | command_left_click | command_left_dclick | command_list_begin_drag | command_list_begin_label_edit | command_list_begin_rdrag | command_list_cache_hint | command_list_col_begin_drag | command_list_col_click | command_list_col_dragging | command_list_col_end_drag | command_list_col_right_click | command_list_delete_all_items | command_list_delete_item | command_list_end_label_edit | command_list_insert_item | command_list_item_activated | command_list_item_deselected | command_list_item_focused | command_list_item_middle_click | command_list_item_right_click | command_list_item_selected | command_list_key_down | command_listbox_doubleclicked | command_listbox_selected | command_menu_selected | command_notebook_page_changed | command_notebook_page_changing | command_radiobox_selected | command_radiobutton_selected | command_right_click | command_scrollbar_updated | command_set_focus | command_slider_updated | command_spinctrl_updated | command_splitter_doubleclicked | command_splitter_sash_pos_changed | command_splitter_sash_pos_changing | command_splitter_unsplit | command_text_enter | command_text_updated | command_togglebutton_clicked | command_tool_enter | command_tool_rclicked | command_tree_begin_drag | command_tree_begin_label_edit | command_tree_begin_rdrag | command_tree_delete_item | command_tree_end_drag | command_tree_end_label_edit | command_tree_get_info | command_tree_item_activated | command_tree_item_collapsed | command_tree_item_collapsing | command_tree_item_expanded | command_tree_item_expanding | command_tree_item_gettooltip | command_tree_item_menu | command_tree_item_middle_click | command_tree_item_right_click | command_tree_key_down | command_tree_sel_changed | command_tree_sel_changing | command_tree_set_info | command_tree_state_image_click | command_vlbox_selected | context_menu | create | date_changed | destroy | detailed_help | display_changed | end_session | enter_window | erase_background | grid_cell_begin_drag | grid_cell_change | grid_cell_left_click | grid_cell_left_dclick | grid_cell_right_click | grid_cell_right_dclick | grid_col_size | grid_editor_created | grid_editor_hidden | grid_editor_shown | grid_label_left_click | grid_label_left_dclick | grid_label_right_click | grid_label_right_dclick | grid_range_select | grid_row_size | grid_select_cell | help | iconize | idle | joy_button_down | joy_button_up | joy_move | joy_zmove | key_down | key_up | kill_focus | leave_window | left_dclick | left_down | left_up | maximize | menu_close | menu_highlight | menu_open | middle_dclick | middle_down | middle_up | motion | mouse_capture_changed | mousewheel | move | navigation_key | nc_enter_window | nc_leave_window | nc_left_dclick | nc_left_down | nc_left_up | nc_middle_dclick | nc_middle_down | nc_middle_up | nc_motion | nc_paint | nc_right_dclick | nc_right_down | nc_right_up | paint | paint_icon | palette_changed | query_end_session | query_new_palette | right_dclick | right_down | right_up | sash_dragged | scroll_bottom | scroll_changed | scroll_linedown | scroll_lineup | scroll_pagedown | scroll_pageup | scroll_thumbrelease | scroll_thumbtrack | scroll_top | scrollwin_bottom | scrollwin_linedown | scrollwin_lineup | scrollwin_pagedown | scrollwin_pageup | scrollwin_thumbrelease | scrollwin_thumbtrack | scrollwin_top | set_cursor | set_focus | show | size | spin | spin_down | spin_up | stc_autocomp_selection | stc_calltip_click | stc_change | stc_charadded | stc_do_drop | stc_doubleclick | stc_drag_over | stc_dwellend | stc_dwellstart | stc_hotspot_click | stc_hotspot_dclick | stc_key | stc_macrorecord | stc_marginclick | stc_modified | stc_needshown | stc_painted | stc_romodifyattempt | stc_savepointleft | stc_savepointreached | stc_start_drag | stc_styleneeded | stc_updateui | stc_uridropped | stc_userlistselection | stc_zoom | sys_colour_changed | update_ui. %% Hardcoded Records -record(wxMouseState, {x, y, %% integer() leftDown, middleDown, rightDown, %% bool() controlDown, shiftDown, altDown, metaDown, cmdDown %% bool() }). +-record(wxHtmlLinkInfo, { + href, target %% string() + }). %% Hardcoded Defines -define(wxDefaultSize, {-1,-1}). @@ -348,6 +366,8 @@ -define(wxC2S_HTML_SYNTAX, 4). -define(wxC2S_CSS_SYNTAX, 2). -define(wxC2S_NAME, 1). +% From define::From confbase.h +-define(wxCONFIG_CASE_SENSITIVE, 0). % From define::From datetime.h -define(wxInvalidDateTime, ?wxDefaultDateTime). % From define::From dcbuffer.h @@ -549,6 +569,11 @@ -define(wxSPLASH_CENTRE_ON_PARENT, 1). % From define::From hash.h -define(wxHASH_SIZE_DEFAULT, 1000). +% From define::From htmlwin.h +-define(wxHW_DEFAULT_STYLE, ?wxHW_SCROLLBAR_AUTO). +-define(wxHW_NO_SELECTION, 8). +-define(wxHW_SCROLLBAR_AUTO, 4). +-define(wxHW_SCROLLBAR_NEVER, 2). % From define::From imaglist.h -define(wxIMAGELIST_DRAW_FOCUSED, 8). -define(wxIMAGELIST_DRAW_SELECTED, 4). @@ -2112,33 +2137,33 @@ -define(wxAuiManager_actionDragToolbarPane, 4). -define(wxAuiManager_actionDragFloatingPane, 5). % From wxAuiPaneInfo::wxAuiPaneState --define(wxAuiPaneInfo_optionFloating, 0). --define(wxAuiPaneInfo_optionHidden, 1). --define(wxAuiPaneInfo_optionLeftDockable, 2). --define(wxAuiPaneInfo_optionRightDockable, 3). --define(wxAuiPaneInfo_optionTopDockable, 4). --define(wxAuiPaneInfo_optionBottomDockable, 5). --define(wxAuiPaneInfo_optionFloatable, 6). --define(wxAuiPaneInfo_optionMovable, 7). --define(wxAuiPaneInfo_optionResizable, 8). --define(wxAuiPaneInfo_optionPaneBorder, 9). --define(wxAuiPaneInfo_optionCaption, 10). --define(wxAuiPaneInfo_optionGripper, 11). --define(wxAuiPaneInfo_optionDestroyOnClose, 12). --define(wxAuiPaneInfo_optionToolbar, 13). --define(wxAuiPaneInfo_optionActive, 14). --define(wxAuiPaneInfo_optionGripperTop, 15). --define(wxAuiPaneInfo_optionMaximized, 16). --define(wxAuiPaneInfo_optionDockFixed, 17). --define(wxAuiPaneInfo_buttonClose, 18). --define(wxAuiPaneInfo_buttonMaximize, 19). --define(wxAuiPaneInfo_buttonMinimize, 20). --define(wxAuiPaneInfo_buttonPin, 21). --define(wxAuiPaneInfo_buttonCustom1, 22). --define(wxAuiPaneInfo_buttonCustom2, 23). --define(wxAuiPaneInfo_buttonCustom3, 24). --define(wxAuiPaneInfo_savedHiddenState, 25). --define(wxAuiPaneInfo_actionPane, 26). +-define(wxAuiPaneInfo_optionFloating, 1). +-define(wxAuiPaneInfo_optionHidden, 2). +-define(wxAuiPaneInfo_optionLeftDockable, 4). +-define(wxAuiPaneInfo_optionRightDockable, 8). +-define(wxAuiPaneInfo_optionTopDockable, 16). +-define(wxAuiPaneInfo_optionBottomDockable, 32). +-define(wxAuiPaneInfo_optionFloatable, 64). +-define(wxAuiPaneInfo_optionMovable, 128). +-define(wxAuiPaneInfo_optionResizable, 256). +-define(wxAuiPaneInfo_optionPaneBorder, 512). +-define(wxAuiPaneInfo_optionCaption, 1024). +-define(wxAuiPaneInfo_optionGripper, 2048). +-define(wxAuiPaneInfo_optionDestroyOnClose, 4096). +-define(wxAuiPaneInfo_optionToolbar, 8192). +-define(wxAuiPaneInfo_optionActive, 16384). +-define(wxAuiPaneInfo_optionGripperTop, 32768). +-define(wxAuiPaneInfo_optionMaximized, 65536). +-define(wxAuiPaneInfo_optionDockFixed, 131072). +-define(wxAuiPaneInfo_buttonClose, 2097152). +-define(wxAuiPaneInfo_buttonMaximize, 4194304). +-define(wxAuiPaneInfo_buttonMinimize, 8388608). +-define(wxAuiPaneInfo_buttonPin, 16777216). +-define(wxAuiPaneInfo_buttonCustom1, 67108864). +-define(wxAuiPaneInfo_buttonCustom2, 134217728). +-define(wxAuiPaneInfo_buttonCustom3, 268435456). +-define(wxAuiPaneInfo_savedHiddenState, 1073741824). +-define(wxAuiPaneInfo_actionPane, 2147483648). % From wxBitmap::Representation -define(wxBitmap_Pixmap, 0). -define(wxBitmap_Pixbuf, 1). @@ -2290,7 +2315,7 @@ -define(wxDateTime_AKST, ?GMT_9). -define(wxDateTime_AKDT, ?GMT_8). -define(wxDateTime_A_WST, ?GMT8). --define(wxDateTime_A_CST, (?GMT13 bor ?+ bor ?1)). +-define(wxDateTime_A_CST, ?GMT13+1). -define(wxDateTime_A_EST, ?GMT10). -define(wxDateTime_A_ESST, ?GMT11). -define(wxDateTime_NZST, ?GMT12). @@ -2354,6 +2379,9 @@ % From wxHtmlEasyPrinting::FontMode -define(wxHtmlEasyPrinting_FontMode_Explicit, 0). -define(wxHtmlEasyPrinting_FontMode_Standard, 1). +% From wxHtmlWindow::ClipboardType +-define(wxHtmlWindow_Primary, 0). +-define(wxHtmlWindow_Secondary, 1). % From class wxListbook -define(wxListbook_SetSelection_SendEvent, 1). % From class wxNavigationKeyEvent @@ -2440,12 +2468,12 @@ -define(wxFONTFLAG_DEFAULT, 0). -define(wxFONTFLAG_ITALIC, 1). -define(wxFONTFLAG_SLANT, 2). --define(wxFONTFLAG_LIGHT, 3). --define(wxFONTFLAG_BOLD, 4). --define(wxFONTFLAG_ANTIALIASED, 5). --define(wxFONTFLAG_NOT_ANTIALIASED, 6). --define(wxFONTFLAG_UNDERLINED, 7). --define(wxFONTFLAG_STRIKETHROUGH, 8). +-define(wxFONTFLAG_LIGHT, 4). +-define(wxFONTFLAG_BOLD, 8). +-define(wxFONTFLAG_ANTIALIASED, 16). +-define(wxFONTFLAG_NOT_ANTIALIASED, 32). +-define(wxFONTFLAG_UNDERLINED, 64). +-define(wxFONTFLAG_STRIKETHROUGH, 128). -define(wxFONTFLAG_MASK, (?wxFONTFLAG_ITALIC bor ?wxFONTFLAG_SLANT bor ?wxFONTFLAG_LIGHT bor ?wxFONTFLAG_BOLD bor ?wxFONTFLAG_ANTIALIASED bor ?wxFONTFLAG_NOT_ANTIALIASED bor ?wxFONTFLAG_UNDERLINED bor ?wxFONTFLAG_STRIKETHROUGH)). -define(wxSPLIT_DRAG_NONE, 0). -define(wxSPLIT_DRAG_DRAGGING, 1). @@ -2799,38 +2827,39 @@ -define(wxAUI_DOCK_CENTER, 5). -define(wxAUI_DOCK_CENTRE, ?wxAUI_DOCK_CENTER). % Type wxAuiManagerOption --define(wxAUI_MGR_ALLOW_FLOATING, 0). --define(wxAUI_MGR_ALLOW_ACTIVE_PANE, 1). --define(wxAUI_MGR_TRANSPARENT_DRAG, 2). --define(wxAUI_MGR_TRANSPARENT_HINT, 3). --define(wxAUI_MGR_VENETIAN_BLINDS_HINT, 4). --define(wxAUI_MGR_RECTANGLE_HINT, 5). --define(wxAUI_MGR_HINT_FADE, 6). --define(wxAUI_MGR_NO_VENETIAN_BLINDS_FADE, 7). +-define(wxAUI_MGR_ALLOW_FLOATING, 1). +-define(wxAUI_MGR_ALLOW_ACTIVE_PANE, 2). +-define(wxAUI_MGR_TRANSPARENT_DRAG, 4). +-define(wxAUI_MGR_TRANSPARENT_HINT, 8). +-define(wxAUI_MGR_VENETIAN_BLINDS_HINT, 16). +-define(wxAUI_MGR_RECTANGLE_HINT, 32). +-define(wxAUI_MGR_HINT_FADE, 64). +-define(wxAUI_MGR_NO_VENETIAN_BLINDS_FADE, 128). +-define(wxAUI_MGR_LIVE_RESIZE, 256). -define(wxAUI_MGR_DEFAULT, (?wxAUI_MGR_ALLOW_FLOATING bor ?wxAUI_MGR_TRANSPARENT_HINT bor ?wxAUI_MGR_HINT_FADE bor ?wxAUI_MGR_NO_VENETIAN_BLINDS_FADE)). % Type wxAuiNotebookOption --define(wxAUI_NB_TOP, 0). --define(wxAUI_NB_LEFT, 1). --define(wxAUI_NB_RIGHT, 2). --define(wxAUI_NB_BOTTOM, 3). --define(wxAUI_NB_TAB_SPLIT, 4). --define(wxAUI_NB_TAB_MOVE, 5). --define(wxAUI_NB_TAB_EXTERNAL_MOVE, 6). --define(wxAUI_NB_TAB_FIXED_WIDTH, 7). --define(wxAUI_NB_SCROLL_BUTTONS, 8). --define(wxAUI_NB_WINDOWLIST_BUTTON, 9). --define(wxAUI_NB_CLOSE_BUTTON, 10). --define(wxAUI_NB_CLOSE_ON_ACTIVE_TAB, 11). --define(wxAUI_NB_CLOSE_ON_ALL_TABS, 12). --define(wxAUI_NB_MIDDLE_CLICK_CLOSE, 13). +-define(wxAUI_NB_TOP, 1). +-define(wxAUI_NB_LEFT, 2). +-define(wxAUI_NB_RIGHT, 4). +-define(wxAUI_NB_BOTTOM, 8). +-define(wxAUI_NB_TAB_SPLIT, 16). +-define(wxAUI_NB_TAB_MOVE, 32). +-define(wxAUI_NB_TAB_EXTERNAL_MOVE, 64). +-define(wxAUI_NB_TAB_FIXED_WIDTH, 128). +-define(wxAUI_NB_SCROLL_BUTTONS, 256). +-define(wxAUI_NB_WINDOWLIST_BUTTON, 512). +-define(wxAUI_NB_CLOSE_BUTTON, 1024). +-define(wxAUI_NB_CLOSE_ON_ACTIVE_TAB, 2048). +-define(wxAUI_NB_CLOSE_ON_ALL_TABS, 4096). +-define(wxAUI_NB_MIDDLE_CLICK_CLOSE, 8192). -define(wxAUI_NB_DEFAULT_STYLE, (?wxAUI_NB_TOP bor ?wxAUI_NB_TAB_SPLIT bor ?wxAUI_NB_TAB_MOVE bor ?wxAUI_NB_SCROLL_BUTTONS bor ?wxAUI_NB_CLOSE_ON_ACTIVE_TAB bor ?wxAUI_NB_MIDDLE_CLICK_CLOSE)). % Type wxAuiPaneButtonState -define(wxAUI_BUTTON_STATE_NORMAL, 0). --define(wxAUI_BUTTON_STATE_HOVER, 1). --define(wxAUI_BUTTON_STATE_PRESSED, 2). --define(wxAUI_BUTTON_STATE_DISABLED, 3). --define(wxAUI_BUTTON_STATE_HIDDEN, 4). --define(wxAUI_BUTTON_STATE_CHECKED, 5). +-define(wxAUI_BUTTON_STATE_HOVER, 2). +-define(wxAUI_BUTTON_STATE_PRESSED, 4). +-define(wxAUI_BUTTON_STATE_DISABLED, 8). +-define(wxAUI_BUTTON_STATE_HIDDEN, 16). +-define(wxAUI_BUTTON_STATE_CHECKED, 32). % Type wxAuiPaneDockArtGradients -define(wxAUI_GRADIENT_NONE, 0). -define(wxAUI_GRADIENT_VERTICAL, 1). @@ -3131,6 +3160,10 @@ -define(wxHT_WINDOW_HORZ_SCROLLBAR, (?wxHT_NOWHERE+12)). -define(wxHT_WINDOW_CORNER, (?wxHT_NOWHERE+13)). -define(wxHT_MAX, (?wxHT_NOWHERE+14)). +% Type wxHtmlOpeningStatus +-define(wxHTML_OPEN, 0). +-define(wxHTML_BLOCK, 1). +-define(wxHTML_REDIRECT, 2). % Type wxIdleMode -define(wxIDLE_PROCESS_ALL, 0). -define(wxIDLE_PROCESS_SPECIFIED, 1). @@ -3548,6 +3581,7 @@ -define(wxEXPAND, ?wxGROW). -define(wxSHAPED, 16384). -define(wxFIXED_MINSIZE, 32768). +-define(wxRESERVE_SPACE_EVEN_IF_HIDDEN, 2). -define(wxTILE, 49152). -define(wxADJUST_MINSIZE, 0). % Type wxSystemColour @@ -3588,7 +3622,8 @@ -define(wxSYS_COLOUR_GRADIENTINACTIVECAPTION, (?wxSYS_COLOUR_BTNHIGHLIGHT+8)). -define(wxSYS_COLOUR_MENUHILIGHT, (?wxSYS_COLOUR_BTNHIGHLIGHT+9)). -define(wxSYS_COLOUR_MENUBAR, (?wxSYS_COLOUR_BTNHIGHLIGHT+10)). --define(wxSYS_COLOUR_MAX, (?wxSYS_COLOUR_BTNHIGHLIGHT+11)). +-define(wxSYS_COLOUR_LISTBOXTEXT, (?wxSYS_COLOUR_BTNHIGHLIGHT+11)). +-define(wxSYS_COLOUR_MAX, (?wxSYS_COLOUR_BTNHIGHLIGHT+12)). % Type wxSystemFeature -define(wxSYS_CAN_DRAW_FRAME_DECORATIONS, 1). -define(wxSYS_CAN_ICONIZE_FRAME, 2). diff -Nru erlang-13.b.1-dfsg/lib/wx/install.es erlang-13.b.3-dfsg/lib/wx/install.es --- erlang-13.b.1-dfsg/lib/wx/install.es 2009-03-12 12:25:44.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/install.es 2009-09-18 15:11:00.000000000 +0100 @@ -21,6 +21,7 @@ %% Install wx to an erlang distribution. %% +-module('install_es'). %% Temp workaround for buggy escript -mode(compile). usage() -> @@ -49,10 +50,10 @@ {[test], {files, ["wxt", "Readme"]}}, {[samples], {files, ["sample.xpm"]}}, {[samples,menu], {files, ["copy.xpm"]}}, - {[samples,'*'], {list, "*.?rl"}}, - {[demos,'*'], {list, "*.?rl"}}, + {[samples,'*'], {list, "*.?rl"}}, + {[demos,'*'], {list, "*.?rl"}}, {[demos,xrc,rc], {list, "*"}}, - {[doc], {files, ["edoc-info", "erlang.png", "stylesheet.css"]}} + {[doc,html], {files, ["edoc-info", "erlang.png", "stylesheet.css"]}} ]. built_files(SrcDir, Type) -> @@ -77,21 +78,22 @@ end. release_files() -> - [{[], {files, ["configure.in","Makefile.in","wxwin.m4"]}}, + [{[], {files, ["configure.in","Makefile","wxwin.m4", "config.mk.in", "vsn.mk"]}}, {[], {files, ["configure", "install.es"]}}, {[autoconf], {files, ["config.guess","config.sub","install-sh"]}}, - {[src], {files, ["Makefile.in"]}}, + {[src], {files, ["Makefile"]}}, {[c_src], {files, ["Makefile.in"]}}, {[c_src], {list, "*.c*"}}, {[c_src], {list, "*.h"}}, {[c_src,gen], {list, "*.cpp"}}, {[c_src,gen], {list, "*.h"}}, - {[doc], {files, ["Makefile", "overview.edoc"]}}, - {[test], {files, ["Makefile.in"]}}, - {[demos], {files, ["Makefile"]}}, - {[demos,'*'], {files, ["Makefile"]}}, - {[samples], {files, ["Makefile"]}}, - {[samples,'*'], {files, ["Makefile"]}}, + {[doc], {files, ["overview.edoc"]}}, + {[doc,src], {files, ["Makefile"]}}, + {[test], {files, ["Makefile"]}}, +%% {[demos], {files, ["Makefile"]}}, +%% {[demos,'*'], {files, ["Makefile"]}}, +%% {[samples], {files, ["Makefile"]}}, +%% {[samples,'*'], {files, ["Makefile"]}}, {[api_gen], {list, "*.?rl"}}, {[api_gen], {list, "*.conf"}}, {[api_gen], {files, ["Makefile", "README"]}}, @@ -204,13 +206,19 @@ create_release() -> All = release_files() ++ install_files(), SrcD = get_src_dir(), - Ver = get_version(SrcD), + Ver = "wx-" ++ get_version(SrcD), io:format("Create release ~p~n From ~p ~n",[Ver,SrcD]), case is_ok('ok [y|n]? ',[y,n]) of y -> List = fun(File, From, To, Acc) -> - [{filename:join(To, File), - filename:join(From,File)}|Acc] + case filelib:is_regular(filename:join(From,File)) of + true -> + [{filename:join(To, File), + filename:join(From,File)}|Acc]; + false -> + io:format("Warning: File ~s/~s is missing~n",[From,File]), + Acc + end end, Expand = fun({Dir,Fs},Acc) -> expand_dirs(Dir,Fs,SrcD,Ver,List,Acc) @@ -254,7 +262,14 @@ fun() -> {_,Month,Day} = erlang:date(), Date = io_lib:format("~.2.0w~.2.0w",[Month,Day]), - lists:flatten(["wx-0.97."|Date]) + {ok, Bin} = file:read_file("vsn.mk"), + Opt = [{capture, all_but_first, list}], + case re:run(Bin, "WX_VSN\s*=\s*(.*)", Opt) of + {match, [Ver]} -> + lists:flatten([Ver,"."|Date]); + _ -> + lists:flatten(["wx-0.98."|Date]) + end end, case Dir of "." -> diff -Nru erlang-13.b.1-dfsg/lib/wx/Makefile erlang-13.b.3-dfsg/lib/wx/Makefile --- erlang-13.b.1-dfsg/lib/wx/Makefile 2009-03-12 14:44:45.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/Makefile 2009-09-18 15:11:00.000000000 +0100 @@ -69,7 +69,7 @@ libdir = @libdir@ install: - escript ./install.es $(libdir) + escript ./install.es $(INSTALLDIR) release: escript ./install.es --create_release Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/wx/priv/erlang-logo32.png and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/wx/priv/erlang-logo32.png differ Binary files /tmp/oXUKvTw2Fo/erlang-13.b.1-dfsg/lib/wx/priv/erlang-logo64.png and /tmp/DE5TGrZzji/erlang-13.b.3-dfsg/lib/wx/priv/erlang-logo64.png differ diff -Nru erlang-13.b.1-dfsg/lib/wx/README erlang-13.b.3-dfsg/lib/wx/README --- erlang-13.b.1-dfsg/lib/wx/README 2009-03-12 12:25:45.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/README 2009-09-18 15:11:01.000000000 +0100 @@ -1,7 +1,6 @@ REQUIREMENTS: - At least Erlang-R12B-2 with smp enabled. - Erlang-R12B-4 fixes a bug which affects wxerlang + At least Erlang-R13B with smp enabled. It Requires unicode support. Linux, Mac, Solaris-10 or Windows. @@ -24,7 +23,8 @@ On mac I built wxwidgets with: mkdir MYBUILD; cd MYBUILD - ../configure --with-opengl --enable-unicode \ + ../configure --with-opengl --enable-unicode --enable-graphics_ctx \ + --enable-gnomeprint \ On unix only --disable-shared make && make install cd contrib/src/stc/ @@ -38,7 +38,7 @@ On windows I used MinGW and Msys, I build wxwidgets with: mkdir MYBUILD; cd MYBUILD - ../configure --prefix=/c/local/ --with-opengl \ + ../configure --prefix=/c/local/ --with-opengl --enable-graphics_ctx \ --enable-unicode --disable-shared --with-msw make && make install cd contrib/src/stc/ @@ -66,6 +66,8 @@ work as expected, but I havn't read all the documentation and gone through every argument on every function. + See (and run) the demo in the examples directory. + This library is (currently) a driver, so if the you (or I) make errors, such as accessing deleted objects or other things wxWidgets didn't expect you to do, erlang will crash hard. diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/gl_debug.hrl erlang-13.b.3-dfsg/lib/wx/src/gen/gl_debug.hrl --- erlang-13.b.1-dfsg/lib/wx/src/gen/gl_debug.hrl 2009-06-05 13:54:32.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/gl_debug.hrl 2009-09-18 15:11:02.000000000 +0100 @@ -19,653 +19,679 @@ gldebug_table() -> [ - {5017, {gl, accum, 0}}, - {5018, {gl, alphaFunc, 0}}, - {5019, {gl, areTexturesResident, 0}}, - {5020, {gl, arrayElement, 0}}, - {5021, {gl, 'begin', 0}}, - {5022, {gl, bindTexture, 0}}, - {5023, {gl, bitmap, 0}}, - {5024, {gl, bitmap, 0}}, - {5025, {gl, blendFunc, 0}}, - {5026, {gl, callList, 0}}, - {5027, {gl, callLists, 0}}, - {5028, {gl, clear, 0}}, - {5029, {gl, clearAccum, 0}}, - {5030, {gl, clearColor, 0}}, - {5031, {gl, clearDepth, 0}}, - {5032, {gl, clearIndex, 0}}, - {5033, {gl, clearStencil, 0}}, - {5034, {gl, clipPlane, 0}}, - {5035, {gl, color3b, 0}}, - {5036, {gl, color3d, 0}}, - {5037, {gl, color3f, 0}}, - {5038, {gl, color3i, 0}}, - {5039, {gl, color3s, 0}}, - {5040, {gl, color3ub, 0}}, - {5041, {gl, color3ui, 0}}, - {5042, {gl, color3us, 0}}, - {5043, {gl, color4b, 0}}, - {5044, {gl, color4d, 0}}, - {5045, {gl, color4f, 0}}, - {5046, {gl, color4i, 0}}, - {5047, {gl, color4s, 0}}, - {5048, {gl, color4ub, 0}}, - {5049, {gl, color4ui, 0}}, - {5050, {gl, color4us, 0}}, - {5051, {gl, colorMask, 0}}, - {5052, {gl, colorMaterial, 0}}, - {5053, {gl, colorPointer, 0}}, - {5054, {gl, colorPointer, 0}}, - {5055, {gl, copyPixels, 0}}, - {5056, {gl, copyTexImage1D, 0}}, - {5057, {gl, copyTexImage2D, 0}}, - {5058, {gl, copyTexSubImage1D, 0}}, - {5059, {gl, copyTexSubImage2D, 0}}, - {5060, {gl, cullFace, 0}}, - {5061, {gl, deleteLists, 0}}, - {5062, {gl, deleteTextures, 0}}, - {5063, {gl, depthFunc, 0}}, - {5064, {gl, depthMask, 0}}, - {5065, {gl, depthRange, 0}}, - {5066, {gl, disable, 0}}, - {5067, {gl, disableClientState, 0}}, - {5068, {gl, drawArrays, 0}}, - {5069, {gl, drawBuffer, 0}}, - {5070, {gl, drawElements, 0}}, - {5071, {gl, drawElements, 0}}, - {5072, {gl, drawPixels, 0}}, - {5073, {gl, drawPixels, 0}}, - {5074, {gl, edgeFlag, 0}}, - {5075, {gl, edgeFlagPointer, 0}}, - {5076, {gl, edgeFlagPointer, 0}}, - {5077, {gl, enable, 0}}, - {5078, {gl, enableClientState, 0}}, - {5079, {gl, 'end', 0}}, - {5080, {gl, endList, 0}}, - {5081, {gl, evalCoord1d, 0}}, - {5082, {gl, evalCoord1f, 0}}, - {5083, {gl, evalCoord2d, 0}}, - {5084, {gl, evalCoord2f, 0}}, - {5085, {gl, evalMesh1, 0}}, - {5086, {gl, evalMesh2, 0}}, - {5087, {gl, evalPoint1, 0}}, - {5088, {gl, evalPoint2, 0}}, - {5089, {gl, feedbackBuffer, 0}}, - {5090, {gl, finish, 0}}, - {5091, {gl, flush, 0}}, - {5092, {gl, fogf, 0}}, - {5093, {gl, fogfv, 0}}, - {5094, {gl, fogi, 0}}, - {5095, {gl, fogiv, 0}}, - {5096, {gl, frontFace, 0}}, - {5097, {gl, frustum, 0}}, - {5098, {gl, genLists, 0}}, - {5099, {gl, genTextures, 0}}, - {5100, {gl, getBooleanv, 0}}, - {5101, {gl, getClipPlane, 0}}, - {5102, {gl, getDoublev, 0}}, - {5103, {gl, getError, 0}}, - {5104, {gl, getFloatv, 0}}, - {5105, {gl, getIntegerv, 0}}, - {5106, {gl, getLightfv, 0}}, - {5107, {gl, getLightiv, 0}}, - {5108, {gl, getMapdv, 0}}, - {5109, {gl, getMapfv, 0}}, - {5110, {gl, getMapiv, 0}}, - {5111, {gl, getMaterialfv, 0}}, - {5112, {gl, getMaterialiv, 0}}, - {5113, {gl, getPixelMapfv, 0}}, - {5114, {gl, getPixelMapuiv, 0}}, - {5115, {gl, getPixelMapusv, 0}}, - {5116, {gl, getPolygonStipple, 0}}, - {5117, {gl, getString, 0}}, - {5118, {gl, getTexEnvfv, 0}}, - {5119, {gl, getTexEnviv, 0}}, - {5120, {gl, getTexGendv, 0}}, - {5121, {gl, getTexGenfv, 0}}, - {5122, {gl, getTexGeniv, 0}}, - {5123, {gl, getTexImage, 0}}, - {5124, {gl, getTexLevelParameterfv, 0}}, - {5125, {gl, getTexLevelParameteriv, 0}}, - {5126, {gl, getTexParameterfv, 0}}, - {5127, {gl, getTexParameteriv, 0}}, - {5128, {gl, hint, 0}}, - {5129, {gl, indexMask, 0}}, - {5130, {gl, indexPointer, 0}}, - {5131, {gl, indexPointer, 0}}, - {5132, {gl, indexd, 0}}, - {5133, {gl, indexf, 0}}, - {5134, {gl, indexi, 0}}, - {5135, {gl, indexs, 0}}, - {5136, {gl, indexub, 0}}, - {5137, {gl, initNames, 0}}, - {5138, {gl, interleavedArrays, 0}}, - {5139, {gl, interleavedArrays, 0}}, - {5140, {gl, isEnabled, 0}}, - {5141, {gl, isList, 0}}, - {5142, {gl, isTexture, 0}}, - {5143, {gl, lightModelf, 0}}, - {5144, {gl, lightModelfv, 0}}, - {5145, {gl, lightModeli, 0}}, - {5146, {gl, lightModeliv, 0}}, - {5147, {gl, lightf, 0}}, - {5148, {gl, lightfv, 0}}, - {5149, {gl, lighti, 0}}, - {5150, {gl, lightiv, 0}}, - {5151, {gl, lineStipple, 0}}, - {5152, {gl, lineWidth, 0}}, - {5153, {gl, listBase, 0}}, - {5154, {gl, loadIdentity, 0}}, - {5155, {gl, loadMatrixd, 0}}, - {5156, {gl, loadMatrixf, 0}}, - {5157, {gl, loadName, 0}}, - {5158, {gl, logicOp, 0}}, - {5159, {gl, map1d, 0}}, - {5160, {gl, map1f, 0}}, - {5161, {gl, map2d, 0}}, - {5162, {gl, map2f, 0}}, - {5163, {gl, mapGrid1d, 0}}, - {5164, {gl, mapGrid1f, 0}}, - {5165, {gl, mapGrid2d, 0}}, - {5166, {gl, mapGrid2f, 0}}, - {5167, {gl, materialf, 0}}, - {5168, {gl, materialfv, 0}}, - {5169, {gl, materiali, 0}}, - {5170, {gl, materialiv, 0}}, - {5171, {gl, matrixMode, 0}}, - {5172, {gl, multMatrixd, 0}}, - {5173, {gl, multMatrixf, 0}}, - {5174, {gl, newList, 0}}, - {5175, {gl, normal3b, 0}}, - {5176, {gl, normal3d, 0}}, - {5177, {gl, normal3f, 0}}, - {5178, {gl, normal3i, 0}}, - {5179, {gl, normal3s, 0}}, - {5180, {gl, normalPointer, 0}}, - {5181, {gl, normalPointer, 0}}, - {5182, {gl, ortho, 0}}, - {5183, {gl, passThrough, 0}}, - {5184, {gl, pixelMapfv, 0}}, - {5185, {gl, pixelMapuiv, 0}}, - {5186, {gl, pixelMapusv, 0}}, - {5187, {gl, pixelStoref, 0}}, - {5188, {gl, pixelStorei, 0}}, - {5189, {gl, pixelTransferf, 0}}, - {5190, {gl, pixelTransferi, 0}}, - {5191, {gl, pixelZoom, 0}}, - {5192, {gl, pointSize, 0}}, - {5193, {gl, polygonMode, 0}}, - {5194, {gl, polygonOffset, 0}}, - {5195, {gl, polygonStipple, 0}}, - {5196, {gl, popAttrib, 0}}, - {5197, {gl, popClientAttrib, 0}}, - {5198, {gl, popMatrix, 0}}, - {5199, {gl, popName, 0}}, - {5200, {gl, prioritizeTextures, 0}}, - {5201, {gl, pushAttrib, 0}}, - {5202, {gl, pushClientAttrib, 0}}, - {5203, {gl, pushMatrix, 0}}, - {5204, {gl, pushName, 0}}, - {5205, {gl, rasterPos2d, 0}}, - {5206, {gl, rasterPos2f, 0}}, - {5207, {gl, rasterPos2i, 0}}, - {5208, {gl, rasterPos2s, 0}}, - {5209, {gl, rasterPos3d, 0}}, - {5210, {gl, rasterPos3f, 0}}, - {5211, {gl, rasterPos3i, 0}}, - {5212, {gl, rasterPos3s, 0}}, - {5213, {gl, rasterPos4d, 0}}, - {5214, {gl, rasterPos4f, 0}}, - {5215, {gl, rasterPos4i, 0}}, - {5216, {gl, rasterPos4s, 0}}, - {5217, {gl, readBuffer, 0}}, - {5218, {gl, readPixels, 0}}, - {5219, {gl, rectd, 0}}, - {5220, {gl, rectdv, 0}}, - {5221, {gl, rectf, 0}}, - {5222, {gl, rectfv, 0}}, - {5223, {gl, recti, 0}}, - {5224, {gl, rectiv, 0}}, - {5225, {gl, rects, 0}}, - {5226, {gl, rectsv, 0}}, - {5227, {gl, renderMode, 0}}, - {5228, {gl, rotated, 0}}, - {5229, {gl, rotatef, 0}}, - {5230, {gl, scaled, 0}}, - {5231, {gl, scalef, 0}}, - {5232, {gl, scissor, 0}}, - {5233, {gl, selectBuffer, 0}}, - {5234, {gl, shadeModel, 0}}, - {5235, {gl, stencilFunc, 0}}, - {5236, {gl, stencilMask, 0}}, - {5237, {gl, stencilOp, 0}}, - {5238, {gl, texCoord1d, 0}}, - {5239, {gl, texCoord1f, 0}}, - {5240, {gl, texCoord1i, 0}}, - {5241, {gl, texCoord1s, 0}}, - {5242, {gl, texCoord2d, 0}}, - {5243, {gl, texCoord2f, 0}}, - {5244, {gl, texCoord2i, 0}}, - {5245, {gl, texCoord2s, 0}}, - {5246, {gl, texCoord3d, 0}}, - {5247, {gl, texCoord3f, 0}}, - {5248, {gl, texCoord3i, 0}}, - {5249, {gl, texCoord3s, 0}}, - {5250, {gl, texCoord4d, 0}}, - {5251, {gl, texCoord4f, 0}}, - {5252, {gl, texCoord4i, 0}}, - {5253, {gl, texCoord4s, 0}}, - {5254, {gl, texCoordPointer, 0}}, - {5255, {gl, texCoordPointer, 0}}, - {5256, {gl, texEnvf, 0}}, - {5257, {gl, texEnvfv, 0}}, - {5258, {gl, texEnvi, 0}}, - {5259, {gl, texEnviv, 0}}, - {5260, {gl, texGend, 0}}, - {5261, {gl, texGendv, 0}}, - {5262, {gl, texGenf, 0}}, - {5263, {gl, texGenfv, 0}}, - {5264, {gl, texGeni, 0}}, - {5265, {gl, texGeniv, 0}}, - {5266, {gl, texImage1D, 0}}, - {5267, {gl, texImage1D, 0}}, - {5268, {gl, texImage2D, 0}}, - {5269, {gl, texImage2D, 0}}, - {5270, {gl, texParameterf, 0}}, - {5271, {gl, texParameterfv, 0}}, - {5272, {gl, texParameteri, 0}}, - {5273, {gl, texParameteriv, 0}}, - {5274, {gl, texSubImage1D, 0}}, - {5275, {gl, texSubImage1D, 0}}, - {5276, {gl, texSubImage2D, 0}}, - {5277, {gl, texSubImage2D, 0}}, - {5278, {gl, translated, 0}}, - {5279, {gl, translatef, 0}}, - {5280, {gl, vertex2d, 0}}, - {5281, {gl, vertex2f, 0}}, - {5282, {gl, vertex2i, 0}}, - {5283, {gl, vertex2s, 0}}, - {5284, {gl, vertex3d, 0}}, - {5285, {gl, vertex3f, 0}}, - {5286, {gl, vertex3i, 0}}, - {5287, {gl, vertex3s, 0}}, - {5288, {gl, vertex4d, 0}}, - {5289, {gl, vertex4f, 0}}, - {5290, {gl, vertex4i, 0}}, - {5291, {gl, vertex4s, 0}}, - {5292, {gl, vertexPointer, 0}}, - {5293, {gl, vertexPointer, 0}}, - {5294, {gl, viewport, 0}}, - {5295, {gl, blendColor, 0}}, - {5296, {gl, blendEquation, 0}}, - {5297, {gl, drawRangeElements, 0}}, - {5298, {gl, drawRangeElements, 0}}, - {5299, {gl, colorTable, 0}}, - {5300, {gl, colorTable, 0}}, - {5301, {gl, colorTableParameterfv, 0}}, - {5302, {gl, colorTableParameteriv, 0}}, - {5303, {gl, copyColorTable, 0}}, - {5304, {gl, getColorTable, 0}}, - {5305, {gl, getColorTableParameterfv, 0}}, - {5306, {gl, getColorTableParameteriv, 0}}, - {5307, {gl, colorSubTable, 0}}, - {5308, {gl, colorSubTable, 0}}, - {5309, {gl, copyColorSubTable, 0}}, - {5310, {gl, convolutionFilter1D, 0}}, - {5311, {gl, convolutionFilter1D, 0}}, - {5312, {gl, convolutionFilter2D, 0}}, - {5313, {gl, convolutionFilter2D, 0}}, - {5314, {gl, convolutionParameterf, 0}}, - {5315, {gl, convolutionParameteri, 0}}, - {5316, {gl, copyConvolutionFilter1D, 0}}, - {5317, {gl, copyConvolutionFilter2D, 0}}, - {5318, {gl, getConvolutionFilter, 0}}, - {5319, {gl, getConvolutionParameterfv, 0}}, - {5320, {gl, getConvolutionParameteriv, 0}}, - {5321, {gl, separableFilter2D, 0}}, - {5322, {gl, separableFilter2D, 0}}, - {5323, {gl, getHistogram, 0}}, - {5324, {gl, getHistogramParameterfv, 0}}, - {5325, {gl, getHistogramParameteriv, 0}}, - {5326, {gl, getMinmax, 0}}, - {5327, {gl, getMinmaxParameterfv, 0}}, - {5328, {gl, getMinmaxParameteriv, 0}}, - {5329, {gl, histogram, 0}}, - {5330, {gl, minmax, 0}}, - {5331, {gl, resetHistogram, 0}}, - {5332, {gl, resetMinmax, 0}}, - {5333, {gl, texImage3D, 0}}, - {5334, {gl, texImage3D, 0}}, - {5335, {gl, texSubImage3D, 0}}, - {5336, {gl, texSubImage3D, 0}}, - {5337, {gl, copyTexSubImage3D, 0}}, - {5338, {gl, activeTexture, 0}}, - {5339, {gl, clientActiveTexture, 0}}, - {5340, {gl, multiTexCoord1d, 0}}, - {5341, {gl, multiTexCoord1f, 0}}, - {5342, {gl, multiTexCoord1i, 0}}, - {5343, {gl, multiTexCoord1s, 0}}, - {5344, {gl, multiTexCoord2d, 0}}, - {5345, {gl, multiTexCoord2f, 0}}, - {5346, {gl, multiTexCoord2i, 0}}, - {5347, {gl, multiTexCoord2s, 0}}, - {5348, {gl, multiTexCoord3d, 0}}, - {5349, {gl, multiTexCoord3f, 0}}, - {5350, {gl, multiTexCoord3i, 0}}, - {5351, {gl, multiTexCoord3s, 0}}, - {5352, {gl, multiTexCoord4d, 0}}, - {5353, {gl, multiTexCoord4f, 0}}, - {5354, {gl, multiTexCoord4i, 0}}, - {5355, {gl, multiTexCoord4s, 0}}, - {5356, {gl, loadTransposeMatrixf, 0}}, - {5357, {gl, loadTransposeMatrixd, 0}}, - {5358, {gl, multTransposeMatrixf, 0}}, - {5359, {gl, multTransposeMatrixd, 0}}, - {5360, {gl, sampleCoverage, 0}}, + {5037, {gl, accum, 0}}, + {5038, {gl, alphaFunc, 0}}, + {5039, {gl, areTexturesResident, 0}}, + {5040, {gl, arrayElement, 0}}, + {5041, {gl, 'begin', 0}}, + {5042, {gl, bindTexture, 0}}, + {5043, {gl, bitmap, 0}}, + {5044, {gl, bitmap, 0}}, + {5045, {gl, blendFunc, 0}}, + {5046, {gl, callList, 0}}, + {5047, {gl, callLists, 0}}, + {5048, {gl, clear, 0}}, + {5049, {gl, clearAccum, 0}}, + {5050, {gl, clearColor, 0}}, + {5051, {gl, clearDepth, 0}}, + {5052, {gl, clearIndex, 0}}, + {5053, {gl, clearStencil, 0}}, + {5054, {gl, clipPlane, 0}}, + {5055, {gl, color3b, 0}}, + {5056, {gl, color3d, 0}}, + {5057, {gl, color3f, 0}}, + {5058, {gl, color3i, 0}}, + {5059, {gl, color3s, 0}}, + {5060, {gl, color3ub, 0}}, + {5061, {gl, color3ui, 0}}, + {5062, {gl, color3us, 0}}, + {5063, {gl, color4b, 0}}, + {5064, {gl, color4d, 0}}, + {5065, {gl, color4f, 0}}, + {5066, {gl, color4i, 0}}, + {5067, {gl, color4s, 0}}, + {5068, {gl, color4ub, 0}}, + {5069, {gl, color4ui, 0}}, + {5070, {gl, color4us, 0}}, + {5071, {gl, colorMask, 0}}, + {5072, {gl, colorMaterial, 0}}, + {5073, {gl, colorPointer, 0}}, + {5074, {gl, colorPointer, 0}}, + {5075, {gl, copyPixels, 0}}, + {5076, {gl, copyTexImage1D, 0}}, + {5077, {gl, copyTexImage2D, 0}}, + {5078, {gl, copyTexSubImage1D, 0}}, + {5079, {gl, copyTexSubImage2D, 0}}, + {5080, {gl, cullFace, 0}}, + {5081, {gl, deleteLists, 0}}, + {5082, {gl, deleteTextures, 0}}, + {5083, {gl, depthFunc, 0}}, + {5084, {gl, depthMask, 0}}, + {5085, {gl, depthRange, 0}}, + {5086, {gl, disable, 0}}, + {5087, {gl, disableClientState, 0}}, + {5088, {gl, drawArrays, 0}}, + {5089, {gl, drawBuffer, 0}}, + {5090, {gl, drawElements, 0}}, + {5091, {gl, drawElements, 0}}, + {5092, {gl, drawPixels, 0}}, + {5093, {gl, drawPixels, 0}}, + {5094, {gl, edgeFlag, 0}}, + {5095, {gl, edgeFlagPointer, 0}}, + {5096, {gl, edgeFlagPointer, 0}}, + {5097, {gl, enable, 0}}, + {5098, {gl, enableClientState, 0}}, + {5099, {gl, 'end', 0}}, + {5100, {gl, endList, 0}}, + {5101, {gl, evalCoord1d, 0}}, + {5102, {gl, evalCoord1f, 0}}, + {5103, {gl, evalCoord2d, 0}}, + {5104, {gl, evalCoord2f, 0}}, + {5105, {gl, evalMesh1, 0}}, + {5106, {gl, evalMesh2, 0}}, + {5107, {gl, evalPoint1, 0}}, + {5108, {gl, evalPoint2, 0}}, + {5109, {gl, feedbackBuffer, 0}}, + {5110, {gl, finish, 0}}, + {5111, {gl, flush, 0}}, + {5112, {gl, fogf, 0}}, + {5113, {gl, fogfv, 0}}, + {5114, {gl, fogi, 0}}, + {5115, {gl, fogiv, 0}}, + {5116, {gl, frontFace, 0}}, + {5117, {gl, frustum, 0}}, + {5118, {gl, genLists, 0}}, + {5119, {gl, genTextures, 0}}, + {5120, {gl, getBooleanv, 0}}, + {5121, {gl, getClipPlane, 0}}, + {5122, {gl, getDoublev, 0}}, + {5123, {gl, getError, 0}}, + {5124, {gl, getFloatv, 0}}, + {5125, {gl, getIntegerv, 0}}, + {5126, {gl, getLightfv, 0}}, + {5127, {gl, getLightiv, 0}}, + {5128, {gl, getMapdv, 0}}, + {5129, {gl, getMapfv, 0}}, + {5130, {gl, getMapiv, 0}}, + {5131, {gl, getMaterialfv, 0}}, + {5132, {gl, getMaterialiv, 0}}, + {5133, {gl, getPixelMapfv, 0}}, + {5134, {gl, getPixelMapuiv, 0}}, + {5135, {gl, getPixelMapusv, 0}}, + {5136, {gl, getPolygonStipple, 0}}, + {5137, {gl, getString, 0}}, + {5138, {gl, getTexEnvfv, 0}}, + {5139, {gl, getTexEnviv, 0}}, + {5140, {gl, getTexGendv, 0}}, + {5141, {gl, getTexGenfv, 0}}, + {5142, {gl, getTexGeniv, 0}}, + {5143, {gl, getTexImage, 0}}, + {5144, {gl, getTexLevelParameterfv, 0}}, + {5145, {gl, getTexLevelParameteriv, 0}}, + {5146, {gl, getTexParameterfv, 0}}, + {5147, {gl, getTexParameteriv, 0}}, + {5148, {gl, hint, 0}}, + {5149, {gl, indexMask, 0}}, + {5150, {gl, indexPointer, 0}}, + {5151, {gl, indexPointer, 0}}, + {5152, {gl, indexd, 0}}, + {5153, {gl, indexf, 0}}, + {5154, {gl, indexi, 0}}, + {5155, {gl, indexs, 0}}, + {5156, {gl, indexub, 0}}, + {5157, {gl, initNames, 0}}, + {5158, {gl, interleavedArrays, 0}}, + {5159, {gl, interleavedArrays, 0}}, + {5160, {gl, isEnabled, 0}}, + {5161, {gl, isList, 0}}, + {5162, {gl, isTexture, 0}}, + {5163, {gl, lightModelf, 0}}, + {5164, {gl, lightModelfv, 0}}, + {5165, {gl, lightModeli, 0}}, + {5166, {gl, lightModeliv, 0}}, + {5167, {gl, lightf, 0}}, + {5168, {gl, lightfv, 0}}, + {5169, {gl, lighti, 0}}, + {5170, {gl, lightiv, 0}}, + {5171, {gl, lineStipple, 0}}, + {5172, {gl, lineWidth, 0}}, + {5173, {gl, listBase, 0}}, + {5174, {gl, loadIdentity, 0}}, + {5175, {gl, loadMatrixd, 0}}, + {5176, {gl, loadMatrixf, 0}}, + {5177, {gl, loadName, 0}}, + {5178, {gl, logicOp, 0}}, + {5179, {gl, map1d, 0}}, + {5180, {gl, map1f, 0}}, + {5181, {gl, map2d, 0}}, + {5182, {gl, map2f, 0}}, + {5183, {gl, mapGrid1d, 0}}, + {5184, {gl, mapGrid1f, 0}}, + {5185, {gl, mapGrid2d, 0}}, + {5186, {gl, mapGrid2f, 0}}, + {5187, {gl, materialf, 0}}, + {5188, {gl, materialfv, 0}}, + {5189, {gl, materiali, 0}}, + {5190, {gl, materialiv, 0}}, + {5191, {gl, matrixMode, 0}}, + {5192, {gl, multMatrixd, 0}}, + {5193, {gl, multMatrixf, 0}}, + {5194, {gl, newList, 0}}, + {5195, {gl, normal3b, 0}}, + {5196, {gl, normal3d, 0}}, + {5197, {gl, normal3f, 0}}, + {5198, {gl, normal3i, 0}}, + {5199, {gl, normal3s, 0}}, + {5200, {gl, normalPointer, 0}}, + {5201, {gl, normalPointer, 0}}, + {5202, {gl, ortho, 0}}, + {5203, {gl, passThrough, 0}}, + {5204, {gl, pixelMapfv, 0}}, + {5205, {gl, pixelMapuiv, 0}}, + {5206, {gl, pixelMapusv, 0}}, + {5207, {gl, pixelStoref, 0}}, + {5208, {gl, pixelStorei, 0}}, + {5209, {gl, pixelTransferf, 0}}, + {5210, {gl, pixelTransferi, 0}}, + {5211, {gl, pixelZoom, 0}}, + {5212, {gl, pointSize, 0}}, + {5213, {gl, polygonMode, 0}}, + {5214, {gl, polygonOffset, 0}}, + {5215, {gl, polygonStipple, 0}}, + {5216, {gl, popAttrib, 0}}, + {5217, {gl, popClientAttrib, 0}}, + {5218, {gl, popMatrix, 0}}, + {5219, {gl, popName, 0}}, + {5220, {gl, prioritizeTextures, 0}}, + {5221, {gl, pushAttrib, 0}}, + {5222, {gl, pushClientAttrib, 0}}, + {5223, {gl, pushMatrix, 0}}, + {5224, {gl, pushName, 0}}, + {5225, {gl, rasterPos2d, 0}}, + {5226, {gl, rasterPos2f, 0}}, + {5227, {gl, rasterPos2i, 0}}, + {5228, {gl, rasterPos2s, 0}}, + {5229, {gl, rasterPos3d, 0}}, + {5230, {gl, rasterPos3f, 0}}, + {5231, {gl, rasterPos3i, 0}}, + {5232, {gl, rasterPos3s, 0}}, + {5233, {gl, rasterPos4d, 0}}, + {5234, {gl, rasterPos4f, 0}}, + {5235, {gl, rasterPos4i, 0}}, + {5236, {gl, rasterPos4s, 0}}, + {5237, {gl, readBuffer, 0}}, + {5238, {gl, readPixels, 0}}, + {5239, {gl, rectd, 0}}, + {5240, {gl, rectdv, 0}}, + {5241, {gl, rectf, 0}}, + {5242, {gl, rectfv, 0}}, + {5243, {gl, recti, 0}}, + {5244, {gl, rectiv, 0}}, + {5245, {gl, rects, 0}}, + {5246, {gl, rectsv, 0}}, + {5247, {gl, renderMode, 0}}, + {5248, {gl, rotated, 0}}, + {5249, {gl, rotatef, 0}}, + {5250, {gl, scaled, 0}}, + {5251, {gl, scalef, 0}}, + {5252, {gl, scissor, 0}}, + {5253, {gl, selectBuffer, 0}}, + {5254, {gl, shadeModel, 0}}, + {5255, {gl, stencilFunc, 0}}, + {5256, {gl, stencilMask, 0}}, + {5257, {gl, stencilOp, 0}}, + {5258, {gl, texCoord1d, 0}}, + {5259, {gl, texCoord1f, 0}}, + {5260, {gl, texCoord1i, 0}}, + {5261, {gl, texCoord1s, 0}}, + {5262, {gl, texCoord2d, 0}}, + {5263, {gl, texCoord2f, 0}}, + {5264, {gl, texCoord2i, 0}}, + {5265, {gl, texCoord2s, 0}}, + {5266, {gl, texCoord3d, 0}}, + {5267, {gl, texCoord3f, 0}}, + {5268, {gl, texCoord3i, 0}}, + {5269, {gl, texCoord3s, 0}}, + {5270, {gl, texCoord4d, 0}}, + {5271, {gl, texCoord4f, 0}}, + {5272, {gl, texCoord4i, 0}}, + {5273, {gl, texCoord4s, 0}}, + {5274, {gl, texCoordPointer, 0}}, + {5275, {gl, texCoordPointer, 0}}, + {5276, {gl, texEnvf, 0}}, + {5277, {gl, texEnvfv, 0}}, + {5278, {gl, texEnvi, 0}}, + {5279, {gl, texEnviv, 0}}, + {5280, {gl, texGend, 0}}, + {5281, {gl, texGendv, 0}}, + {5282, {gl, texGenf, 0}}, + {5283, {gl, texGenfv, 0}}, + {5284, {gl, texGeni, 0}}, + {5285, {gl, texGeniv, 0}}, + {5286, {gl, texImage1D, 0}}, + {5287, {gl, texImage1D, 0}}, + {5288, {gl, texImage2D, 0}}, + {5289, {gl, texImage2D, 0}}, + {5290, {gl, texParameterf, 0}}, + {5291, {gl, texParameterfv, 0}}, + {5292, {gl, texParameteri, 0}}, + {5293, {gl, texParameteriv, 0}}, + {5294, {gl, texSubImage1D, 0}}, + {5295, {gl, texSubImage1D, 0}}, + {5296, {gl, texSubImage2D, 0}}, + {5297, {gl, texSubImage2D, 0}}, + {5298, {gl, translated, 0}}, + {5299, {gl, translatef, 0}}, + {5300, {gl, vertex2d, 0}}, + {5301, {gl, vertex2f, 0}}, + {5302, {gl, vertex2i, 0}}, + {5303, {gl, vertex2s, 0}}, + {5304, {gl, vertex3d, 0}}, + {5305, {gl, vertex3f, 0}}, + {5306, {gl, vertex3i, 0}}, + {5307, {gl, vertex3s, 0}}, + {5308, {gl, vertex4d, 0}}, + {5309, {gl, vertex4f, 0}}, + {5310, {gl, vertex4i, 0}}, + {5311, {gl, vertex4s, 0}}, + {5312, {gl, vertexPointer, 0}}, + {5313, {gl, vertexPointer, 0}}, + {5314, {gl, viewport, 0}}, + {5315, {gl, blendColor, 0}}, + {5316, {gl, blendEquation, 0}}, + {5317, {gl, drawRangeElements, 0}}, + {5318, {gl, drawRangeElements, 0}}, + {5319, {gl, texImage3D, 0}}, + {5320, {gl, texImage3D, 0}}, + {5321, {gl, texSubImage3D, 0}}, + {5322, {gl, texSubImage3D, 0}}, + {5323, {gl, copyTexSubImage3D, 0}}, + {5324, {gl, colorTable, 0}}, + {5325, {gl, colorTable, 0}}, + {5326, {gl, colorTableParameterfv, 0}}, + {5327, {gl, colorTableParameteriv, 0}}, + {5328, {gl, copyColorTable, 0}}, + {5329, {gl, getColorTable, 0}}, + {5330, {gl, getColorTableParameterfv, 0}}, + {5331, {gl, getColorTableParameteriv, 0}}, + {5332, {gl, colorSubTable, 0}}, + {5333, {gl, colorSubTable, 0}}, + {5334, {gl, copyColorSubTable, 0}}, + {5335, {gl, convolutionFilter1D, 0}}, + {5336, {gl, convolutionFilter1D, 0}}, + {5337, {gl, convolutionFilter2D, 0}}, + {5338, {gl, convolutionFilter2D, 0}}, + {5339, {gl, convolutionParameterf, 0}}, + {5340, {gl, convolutionParameteri, 0}}, + {5341, {gl, copyConvolutionFilter1D, 0}}, + {5342, {gl, copyConvolutionFilter2D, 0}}, + {5343, {gl, getConvolutionFilter, 0}}, + {5344, {gl, getConvolutionParameterfv, 0}}, + {5345, {gl, getConvolutionParameteriv, 0}}, + {5346, {gl, separableFilter2D, 0}}, + {5347, {gl, separableFilter2D, 0}}, + {5348, {gl, getHistogram, 0}}, + {5349, {gl, getHistogramParameterfv, 0}}, + {5350, {gl, getHistogramParameteriv, 0}}, + {5351, {gl, getMinmax, 0}}, + {5352, {gl, getMinmaxParameterfv, 0}}, + {5353, {gl, getMinmaxParameteriv, 0}}, + {5354, {gl, histogram, 0}}, + {5355, {gl, minmax, 0}}, + {5356, {gl, resetHistogram, 0}}, + {5357, {gl, resetMinmax, 0}}, + {5358, {gl, activeTexture, 0}}, + {5359, {gl, sampleCoverage, 0}}, + {5360, {gl, compressedTexImage3D, 0}}, {5361, {gl, compressedTexImage3D, 0}}, - {5362, {gl, compressedTexImage3D, 0}}, + {5362, {gl, compressedTexImage2D, 0}}, {5363, {gl, compressedTexImage2D, 0}}, - {5364, {gl, compressedTexImage2D, 0}}, + {5364, {gl, compressedTexImage1D, 0}}, {5365, {gl, compressedTexImage1D, 0}}, - {5366, {gl, compressedTexImage1D, 0}}, + {5366, {gl, compressedTexSubImage3D, 0}}, {5367, {gl, compressedTexSubImage3D, 0}}, - {5368, {gl, compressedTexSubImage3D, 0}}, + {5368, {gl, compressedTexSubImage2D, 0}}, {5369, {gl, compressedTexSubImage2D, 0}}, - {5370, {gl, compressedTexSubImage2D, 0}}, + {5370, {gl, compressedTexSubImage1D, 0}}, {5371, {gl, compressedTexSubImage1D, 0}}, - {5372, {gl, compressedTexSubImage1D, 0}}, - {5373, {gl, getCompressedTexImage, 0}}, - {5374, {gl, blendFuncSeparate, 0}}, - {5375, {gl, fogCoordf, 0}}, - {5376, {gl, fogCoordd, 0}}, - {5377, {gl, fogCoordPointer, 0}}, - {5378, {gl, fogCoordPointer, 0}}, - {5379, {gl, multiDrawArrays, 0}}, - {5380, {gl, pointParameterf, 0}}, - {5381, {gl, pointParameterfv, 0}}, - {5382, {gl, pointParameteri, 0}}, - {5383, {gl, pointParameteriv, 0}}, - {5384, {gl, secondaryColor3b, 0}}, - {5385, {gl, secondaryColor3d, 0}}, - {5386, {gl, secondaryColor3f, 0}}, - {5387, {gl, secondaryColor3i, 0}}, - {5388, {gl, secondaryColor3s, 0}}, - {5389, {gl, secondaryColor3ub, 0}}, - {5390, {gl, secondaryColor3ui, 0}}, - {5391, {gl, secondaryColor3us, 0}}, - {5392, {gl, secondaryColorPointer, 0}}, - {5393, {gl, secondaryColorPointer, 0}}, - {5394, {gl, windowPos2d, 0}}, - {5395, {gl, windowPos2f, 0}}, - {5396, {gl, windowPos2i, 0}}, - {5397, {gl, windowPos2s, 0}}, - {5398, {gl, windowPos3d, 0}}, - {5399, {gl, windowPos3f, 0}}, - {5400, {gl, windowPos3i, 0}}, - {5401, {gl, windowPos3s, 0}}, - {5402, {gl, genQueries, 0}}, - {5403, {gl, deleteQueries, 0}}, - {5404, {gl, isQuery, 0}}, - {5405, {gl, beginQuery, 0}}, - {5406, {gl, endQuery, 0}}, - {5407, {gl, getQueryiv, 0}}, - {5408, {gl, getQueryObjectiv, 0}}, - {5409, {gl, getQueryObjectuiv, 0}}, - {5410, {gl, bindBuffer, 0}}, - {5411, {gl, deleteBuffers, 0}}, - {5412, {gl, genBuffers, 0}}, - {5413, {gl, isBuffer, 0}}, - {5414, {gl, bufferData, 0}}, - {5415, {gl, bufferData, 0}}, - {5416, {gl, bufferSubData, 0}}, - {5417, {gl, bufferSubData, 0}}, - {5418, {gl, getBufferSubData, 0}}, - {5419, {gl, getBufferParameteriv, 0}}, - {5420, {gl, blendEquationSeparate, 0}}, - {5421, {gl, drawBuffers, 0}}, - {5422, {gl, stencilOpSeparate, 0}}, - {5423, {gl, stencilFuncSeparate, 0}}, - {5424, {gl, stencilMaskSeparate, 0}}, - {5425, {gl, attachShader, 0}}, - {5426, {gl, bindAttribLocation, 0}}, - {5427, {gl, compileShader, 0}}, - {5428, {gl, createProgram, 0}}, - {5429, {gl, createShader, 0}}, - {5430, {gl, deleteProgram, 0}}, - {5431, {gl, deleteShader, 0}}, - {5432, {gl, detachShader, 0}}, - {5433, {gl, disableVertexAttribArray, 0}}, - {5434, {gl, enableVertexAttribArray, 0}}, - {5435, {gl, getActiveAttrib, 0}}, - {5436, {gl, getActiveUniform, 0}}, - {5437, {gl, getAttachedShaders, 0}}, - {5438, {gl, getAttribLocation, 0}}, - {5439, {gl, getProgramiv, 0}}, - {5440, {gl, getProgramInfoLog, 0}}, - {5441, {gl, getShaderiv, 0}}, - {5442, {gl, getShaderInfoLog, 0}}, - {5443, {gl, getShaderSource, 0}}, - {5444, {gl, getUniformLocation, 0}}, - {5445, {gl, getUniformfv, 0}}, - {5446, {gl, getUniformiv, 0}}, - {5447, {gl, getVertexAttribdv, 0}}, - {5448, {gl, getVertexAttribfv, 0}}, - {5449, {gl, getVertexAttribiv, 0}}, - {5450, {gl, isProgram, 0}}, - {5451, {gl, isShader, 0}}, - {5452, {gl, linkProgram, 0}}, - {5453, {gl, shaderSource, 0}}, - {5454, {gl, useProgram, 0}}, - {5455, {gl, uniform1f, 0}}, - {5456, {gl, uniform2f, 0}}, - {5457, {gl, uniform3f, 0}}, - {5458, {gl, uniform4f, 0}}, - {5459, {gl, uniform1i, 0}}, - {5460, {gl, uniform2i, 0}}, - {5461, {gl, uniform3i, 0}}, - {5462, {gl, uniform4i, 0}}, - {5463, {gl, uniform1fv, 0}}, - {5464, {gl, uniform2fv, 0}}, - {5465, {gl, uniform3fv, 0}}, - {5466, {gl, uniform4fv, 0}}, - {5467, {gl, uniform1iv, 0}}, - {5468, {gl, uniform2iv, 0}}, - {5469, {gl, uniform3iv, 0}}, - {5470, {gl, uniform4iv, 0}}, - {5471, {gl, uniformMatrix2fv, 0}}, - {5472, {gl, uniformMatrix3fv, 0}}, - {5473, {gl, uniformMatrix4fv, 0}}, - {5474, {gl, validateProgram, 0}}, - {5475, {gl, vertexAttrib1d, 0}}, - {5476, {gl, vertexAttrib1f, 0}}, - {5477, {gl, vertexAttrib1s, 0}}, - {5478, {gl, vertexAttrib2d, 0}}, - {5479, {gl, vertexAttrib2f, 0}}, - {5480, {gl, vertexAttrib2s, 0}}, - {5481, {gl, vertexAttrib3d, 0}}, - {5482, {gl, vertexAttrib3f, 0}}, - {5483, {gl, vertexAttrib3s, 0}}, - {5484, {gl, vertexAttrib4Nbv, 0}}, - {5485, {gl, vertexAttrib4Niv, 0}}, - {5486, {gl, vertexAttrib4Nsv, 0}}, - {5487, {gl, vertexAttrib4Nub, 0}}, - {5488, {gl, vertexAttrib4Nuiv, 0}}, - {5489, {gl, vertexAttrib4Nusv, 0}}, - {5490, {gl, vertexAttrib4bv, 0}}, - {5491, {gl, vertexAttrib4d, 0}}, - {5492, {gl, vertexAttrib4f, 0}}, - {5493, {gl, vertexAttrib4iv, 0}}, - {5494, {gl, vertexAttrib4s, 0}}, - {5495, {gl, vertexAttrib4ubv, 0}}, - {5496, {gl, vertexAttrib4uiv, 0}}, - {5497, {gl, vertexAttrib4usv, 0}}, - {5498, {gl, vertexAttribPointer, 0}}, - {5499, {gl, vertexAttribPointer, 0}}, - {5500, {gl, uniformMatrix2x3fv, 0}}, - {5501, {gl, uniformMatrix3x2fv, 0}}, - {5502, {gl, uniformMatrix2x4fv, 0}}, - {5503, {gl, uniformMatrix4x2fv, 0}}, - {5504, {gl, uniformMatrix3x4fv, 0}}, - {5505, {gl, uniformMatrix4x3fv, 0}}, - {5506, {gl, colorMaski, 0}}, - {5507, {gl, getBooleani_v, 0}}, - {5508, {gl, getIntegeri_v, 0}}, - {5509, {gl, enablei, 0}}, - {5510, {gl, disablei, 0}}, - {5511, {gl, isEnabledi, 0}}, - {5512, {gl, beginTransformFeedback, 0}}, - {5513, {gl, endTransformFeedback, 0}}, - {5514, {gl, bindBufferRange, 0}}, - {5515, {gl, bindBufferBase, 0}}, - {5516, {gl, clampColor, 0}}, - {5517, {gl, beginConditionalRender, 0}}, - {5518, {gl, endConditionalRender, 0}}, - {5519, {gl, vertexAttribI1i, 0}}, - {5520, {gl, vertexAttribI2i, 0}}, - {5521, {gl, vertexAttribI3i, 0}}, - {5522, {gl, vertexAttribI4i, 0}}, - {5523, {gl, vertexAttribI1ui, 0}}, - {5524, {gl, vertexAttribI2ui, 0}}, - {5525, {gl, vertexAttribI3ui, 0}}, - {5526, {gl, vertexAttribI4ui, 0}}, - {5527, {gl, vertexAttribI4bv, 0}}, - {5528, {gl, vertexAttribI4sv, 0}}, - {5529, {gl, vertexAttribI4ubv, 0}}, - {5530, {gl, vertexAttribI4usv, 0}}, - {5531, {gl, vertexAttribIPointer, 0}}, - {5532, {gl, vertexAttribIPointer, 0}}, - {5533, {gl, getVertexAttribIiv, 0}}, - {5534, {gl, getVertexAttribIuiv, 0}}, - {5535, {gl, getUniformuiv, 0}}, - {5536, {gl, bindFragDataLocation, 0}}, - {5537, {gl, getFragDataLocation, 0}}, - {5538, {gl, uniform1ui, 0}}, - {5539, {gl, uniform2ui, 0}}, - {5540, {gl, uniform3ui, 0}}, - {5541, {gl, uniform4ui, 0}}, - {5542, {gl, uniform1uiv, 0}}, - {5543, {gl, uniform2uiv, 0}}, - {5544, {gl, uniform3uiv, 0}}, - {5545, {gl, uniform4uiv, 0}}, - {5546, {gl, texParameterIiv, 0}}, - {5547, {gl, texParameterIuiv, 0}}, - {5548, {gl, getTexParameterIiv, 0}}, - {5549, {gl, getTexParameterIuiv, 0}}, - {5550, {gl, clearBufferiv, 0}}, - {5551, {gl, clearBufferuiv, 0}}, - {5552, {gl, clearBufferfv, 0}}, - {5553, {gl, clearBufferfi, 0}}, - {5554, {gl, getStringi, 0}}, - {5555, {gl, weightbvARB, 0}}, - {5556, {gl, weightsvARB, 0}}, - {5557, {gl, weightivARB, 0}}, - {5558, {gl, weightfvARB, 0}}, - {5559, {gl, weightdvARB, 0}}, - {5560, {gl, weightubvARB, 0}}, - {5561, {gl, weightusvARB, 0}}, - {5562, {gl, weightuivARB, 0}}, - {5563, {gl, vertexBlendARB, 0}}, - {5564, {gl, currentPaletteMatrixARB, 0}}, - {5565, {gl, matrixIndexubvARB, 0}}, - {5566, {gl, matrixIndexusvARB, 0}}, - {5567, {gl, matrixIndexuivARB, 0}}, - {5568, {gl, programStringARB, 0}}, - {5569, {gl, bindProgramARB, 0}}, - {5570, {gl, deleteProgramsARB, 0}}, - {5571, {gl, genProgramsARB, 0}}, - {5572, {gl, programEnvParameter4dARB, 0}}, - {5573, {gl, programEnvParameter4dvARB, 0}}, - {5574, {gl, programEnvParameter4fARB, 0}}, - {5575, {gl, programEnvParameter4fvARB, 0}}, - {5576, {gl, programLocalParameter4dARB, 0}}, - {5577, {gl, programLocalParameter4dvARB, 0}}, - {5578, {gl, programLocalParameter4fARB, 0}}, - {5579, {gl, programLocalParameter4fvARB, 0}}, - {5580, {gl, getProgramEnvParameterdvARB, 0}}, - {5581, {gl, getProgramEnvParameterfvARB, 0}}, - {5582, {gl, getProgramLocalParameterdvARB, 0}}, - {5583, {gl, getProgramLocalParameterfvARB, 0}}, - {5584, {gl, getProgramStringARB, 0}}, - {5585, {gl, deleteObjectARB, 0}}, - {5586, {gl, getHandleARB, 0}}, - {5587, {gl, detachObjectARB, 0}}, - {5588, {gl, createShaderObjectARB, 0}}, - {5589, {gl, shaderSourceARB, 0}}, - {5590, {gl, compileShaderARB, 0}}, - {5591, {gl, createProgramObjectARB, 0}}, - {5592, {gl, attachObjectARB, 0}}, - {5593, {gl, linkProgramARB, 0}}, - {5594, {gl, useProgramObjectARB, 0}}, - {5595, {gl, validateProgramARB, 0}}, - {5596, {gl, getObjectParameterfvARB, 0}}, - {5597, {gl, getObjectParameterivARB, 0}}, - {5598, {gl, getInfoLogARB, 0}}, - {5599, {gl, getAttachedObjectsARB, 0}}, - {5600, {gl, getUniformLocationARB, 0}}, - {5601, {gl, getActiveUniformARB, 0}}, - {5602, {gl, getUniformfvARB, 0}}, - {5603, {gl, getUniformivARB, 0}}, - {5604, {gl, getShaderSourceARB, 0}}, - {5605, {gl, bindAttribLocationARB, 0}}, - {5606, {gl, getActiveAttribARB, 0}}, - {5607, {gl, getAttribLocationARB, 0}}, - {5608, {gl, drawArraysInstancedARB, 0}}, - {5609, {gl, drawElementsInstancedARB, 0}}, - {5610, {gl, drawElementsInstancedARB, 0}}, - {5611, {gl, isRenderbuffer, 0}}, - {5612, {gl, bindRenderbuffer, 0}}, - {5613, {gl, deleteRenderbuffers, 0}}, - {5614, {gl, genRenderbuffers, 0}}, - {5615, {gl, renderbufferStorage, 0}}, - {5616, {gl, getRenderbufferParameteriv, 0}}, - {5617, {gl, isFramebuffer, 0}}, - {5618, {gl, bindFramebuffer, 0}}, - {5619, {gl, deleteFramebuffers, 0}}, - {5620, {gl, genFramebuffers, 0}}, - {5621, {gl, checkFramebufferStatus, 0}}, - {5622, {gl, framebufferTexture1D, 0}}, - {5623, {gl, framebufferTexture2D, 0}}, - {5624, {gl, framebufferTexture3D, 0}}, - {5625, {gl, framebufferRenderbuffer, 0}}, - {5626, {gl, getFramebufferAttachmentParameteriv, 0}}, - {5627, {gl, generateMipmap, 0}}, - {5628, {gl, blitFramebuffer, 0}}, - {5629, {gl, renderbufferStorageMultisample, 0}}, - {5630, {gl, framebufferTextureLayer, 0}}, - {5631, {gl, programParameteriARB, 0}}, - {5632, {gl, framebufferTextureARB, 0}}, - {5633, {gl, framebufferTextureFaceARB, 0}}, - {5634, {gl, vertexAttribDivisor, 0}}, - {5635, {gl, flushMappedBufferRange, 0}}, - {5636, {gl, texBufferARB, 0}}, - {5637, {gl, bindVertexArray, 0}}, - {5638, {gl, deleteVertexArrays, 0}}, - {5639, {gl, genVertexArrays, 0}}, - {5640, {gl, isVertexArray, 0}}, - {5641, {gl, resizeBuffersMESA, 0}}, - {5642, {gl, windowPos4dMESA, 0}}, - {5643, {gl, windowPos4fMESA, 0}}, - {5644, {gl, windowPos4iMESA, 0}}, - {5645, {gl, windowPos4sMESA, 0}}, - {5646, {gl, depthBoundsEXT, 0}}, - {5647, {gl, stencilClearTagEXT, 0}}, - {5001, {glu, build1DMipmapLevels, 0}}, - {5002, {glu, build1DMipmaps, 0}}, - {5003, {glu, build2DMipmapLevels, 0}}, - {5004, {glu, build2DMipmaps, 0}}, - {5005, {glu, build3DMipmapLevels, 0}}, - {5006, {glu, build3DMipmaps, 0}}, - {5007, {glu, checkExtension, 0}}, - {5008, {glu, errorString, 0}}, - {5009, {glu, getString, 0}}, - {5010, {glu, lookAt, 0}}, - {5011, {glu, ortho2D, 0}}, - {5012, {glu, perspective, 0}}, - {5013, {glu, pickMatrix, 0}}, - {5014, {glu, project, 0}}, - {5015, {glu, unProject, 0}}, - {5016, {glu, unProject4, 0}}, + {5372, {gl, getCompressedTexImage, 0}}, + {5373, {gl, clientActiveTexture, 0}}, + {5374, {gl, multiTexCoord1d, 0}}, + {5375, {gl, multiTexCoord1f, 0}}, + {5376, {gl, multiTexCoord1i, 0}}, + {5377, {gl, multiTexCoord1s, 0}}, + {5378, {gl, multiTexCoord2d, 0}}, + {5379, {gl, multiTexCoord2f, 0}}, + {5380, {gl, multiTexCoord2i, 0}}, + {5381, {gl, multiTexCoord2s, 0}}, + {5382, {gl, multiTexCoord3d, 0}}, + {5383, {gl, multiTexCoord3f, 0}}, + {5384, {gl, multiTexCoord3i, 0}}, + {5385, {gl, multiTexCoord3s, 0}}, + {5386, {gl, multiTexCoord4d, 0}}, + {5387, {gl, multiTexCoord4f, 0}}, + {5388, {gl, multiTexCoord4i, 0}}, + {5389, {gl, multiTexCoord4s, 0}}, + {5390, {gl, loadTransposeMatrixf, 0}}, + {5391, {gl, loadTransposeMatrixd, 0}}, + {5392, {gl, multTransposeMatrixf, 0}}, + {5393, {gl, multTransposeMatrixd, 0}}, + {5394, {gl, blendFuncSeparate, 0}}, + {5395, {gl, multiDrawArrays, 0}}, + {5396, {gl, pointParameterf, 0}}, + {5397, {gl, pointParameterfv, 0}}, + {5398, {gl, pointParameteri, 0}}, + {5399, {gl, pointParameteriv, 0}}, + {5400, {gl, fogCoordf, 0}}, + {5401, {gl, fogCoordd, 0}}, + {5402, {gl, fogCoordPointer, 0}}, + {5403, {gl, fogCoordPointer, 0}}, + {5404, {gl, secondaryColor3b, 0}}, + {5405, {gl, secondaryColor3d, 0}}, + {5406, {gl, secondaryColor3f, 0}}, + {5407, {gl, secondaryColor3i, 0}}, + {5408, {gl, secondaryColor3s, 0}}, + {5409, {gl, secondaryColor3ub, 0}}, + {5410, {gl, secondaryColor3ui, 0}}, + {5411, {gl, secondaryColor3us, 0}}, + {5412, {gl, secondaryColorPointer, 0}}, + {5413, {gl, secondaryColorPointer, 0}}, + {5414, {gl, windowPos2d, 0}}, + {5415, {gl, windowPos2f, 0}}, + {5416, {gl, windowPos2i, 0}}, + {5417, {gl, windowPos2s, 0}}, + {5418, {gl, windowPos3d, 0}}, + {5419, {gl, windowPos3f, 0}}, + {5420, {gl, windowPos3i, 0}}, + {5421, {gl, windowPos3s, 0}}, + {5422, {gl, genQueries, 0}}, + {5423, {gl, deleteQueries, 0}}, + {5424, {gl, isQuery, 0}}, + {5425, {gl, beginQuery, 0}}, + {5426, {gl, endQuery, 0}}, + {5427, {gl, getQueryiv, 0}}, + {5428, {gl, getQueryObjectiv, 0}}, + {5429, {gl, getQueryObjectuiv, 0}}, + {5430, {gl, bindBuffer, 0}}, + {5431, {gl, deleteBuffers, 0}}, + {5432, {gl, genBuffers, 0}}, + {5433, {gl, isBuffer, 0}}, + {5434, {gl, bufferData, 0}}, + {5435, {gl, bufferData, 0}}, + {5436, {gl, bufferSubData, 0}}, + {5437, {gl, bufferSubData, 0}}, + {5438, {gl, getBufferSubData, 0}}, + {5439, {gl, getBufferParameteriv, 0}}, + {5440, {gl, blendEquationSeparate, 0}}, + {5441, {gl, drawBuffers, 0}}, + {5442, {gl, stencilOpSeparate, 0}}, + {5443, {gl, stencilFuncSeparate, 0}}, + {5444, {gl, stencilMaskSeparate, 0}}, + {5445, {gl, attachShader, 0}}, + {5446, {gl, bindAttribLocation, 0}}, + {5447, {gl, compileShader, 0}}, + {5448, {gl, createProgram, 0}}, + {5449, {gl, createShader, 0}}, + {5450, {gl, deleteProgram, 0}}, + {5451, {gl, deleteShader, 0}}, + {5452, {gl, detachShader, 0}}, + {5453, {gl, disableVertexAttribArray, 0}}, + {5454, {gl, enableVertexAttribArray, 0}}, + {5455, {gl, getActiveAttrib, 0}}, + {5456, {gl, getActiveUniform, 0}}, + {5457, {gl, getAttachedShaders, 0}}, + {5458, {gl, getAttribLocation, 0}}, + {5459, {gl, getProgramiv, 0}}, + {5460, {gl, getProgramInfoLog, 0}}, + {5461, {gl, getShaderiv, 0}}, + {5462, {gl, getShaderInfoLog, 0}}, + {5463, {gl, getShaderSource, 0}}, + {5464, {gl, getUniformLocation, 0}}, + {5465, {gl, getUniformfv, 0}}, + {5466, {gl, getUniformiv, 0}}, + {5467, {gl, getVertexAttribdv, 0}}, + {5468, {gl, getVertexAttribfv, 0}}, + {5469, {gl, getVertexAttribiv, 0}}, + {5470, {gl, isProgram, 0}}, + {5471, {gl, isShader, 0}}, + {5472, {gl, linkProgram, 0}}, + {5473, {gl, shaderSource, 0}}, + {5474, {gl, useProgram, 0}}, + {5475, {gl, uniform1f, 0}}, + {5476, {gl, uniform2f, 0}}, + {5477, {gl, uniform3f, 0}}, + {5478, {gl, uniform4f, 0}}, + {5479, {gl, uniform1i, 0}}, + {5480, {gl, uniform2i, 0}}, + {5481, {gl, uniform3i, 0}}, + {5482, {gl, uniform4i, 0}}, + {5483, {gl, uniform1fv, 0}}, + {5484, {gl, uniform2fv, 0}}, + {5485, {gl, uniform3fv, 0}}, + {5486, {gl, uniform4fv, 0}}, + {5487, {gl, uniform1iv, 0}}, + {5488, {gl, uniform2iv, 0}}, + {5489, {gl, uniform3iv, 0}}, + {5490, {gl, uniform4iv, 0}}, + {5491, {gl, uniformMatrix2fv, 0}}, + {5492, {gl, uniformMatrix3fv, 0}}, + {5493, {gl, uniformMatrix4fv, 0}}, + {5494, {gl, validateProgram, 0}}, + {5495, {gl, vertexAttrib1d, 0}}, + {5496, {gl, vertexAttrib1f, 0}}, + {5497, {gl, vertexAttrib1s, 0}}, + {5498, {gl, vertexAttrib2d, 0}}, + {5499, {gl, vertexAttrib2f, 0}}, + {5500, {gl, vertexAttrib2s, 0}}, + {5501, {gl, vertexAttrib3d, 0}}, + {5502, {gl, vertexAttrib3f, 0}}, + {5503, {gl, vertexAttrib3s, 0}}, + {5504, {gl, vertexAttrib4Nbv, 0}}, + {5505, {gl, vertexAttrib4Niv, 0}}, + {5506, {gl, vertexAttrib4Nsv, 0}}, + {5507, {gl, vertexAttrib4Nub, 0}}, + {5508, {gl, vertexAttrib4Nuiv, 0}}, + {5509, {gl, vertexAttrib4Nusv, 0}}, + {5510, {gl, vertexAttrib4bv, 0}}, + {5511, {gl, vertexAttrib4d, 0}}, + {5512, {gl, vertexAttrib4f, 0}}, + {5513, {gl, vertexAttrib4iv, 0}}, + {5514, {gl, vertexAttrib4s, 0}}, + {5515, {gl, vertexAttrib4ubv, 0}}, + {5516, {gl, vertexAttrib4uiv, 0}}, + {5517, {gl, vertexAttrib4usv, 0}}, + {5518, {gl, vertexAttribPointer, 0}}, + {5519, {gl, vertexAttribPointer, 0}}, + {5520, {gl, uniformMatrix2x3fv, 0}}, + {5521, {gl, uniformMatrix3x2fv, 0}}, + {5522, {gl, uniformMatrix2x4fv, 0}}, + {5523, {gl, uniformMatrix4x2fv, 0}}, + {5524, {gl, uniformMatrix3x4fv, 0}}, + {5525, {gl, uniformMatrix4x3fv, 0}}, + {5526, {gl, colorMaski, 0}}, + {5527, {gl, getBooleani_v, 0}}, + {5528, {gl, getIntegeri_v, 0}}, + {5529, {gl, enablei, 0}}, + {5530, {gl, disablei, 0}}, + {5531, {gl, isEnabledi, 0}}, + {5532, {gl, beginTransformFeedback, 0}}, + {5533, {gl, endTransformFeedback, 0}}, + {5534, {gl, bindBufferRange, 0}}, + {5535, {gl, bindBufferBase, 0}}, + {5536, {gl, transformFeedbackVaryings, 0}}, + {5537, {gl, getTransformFeedbackVarying, 0}}, + {5538, {gl, clampColor, 0}}, + {5539, {gl, beginConditionalRender, 0}}, + {5540, {gl, endConditionalRender, 0}}, + {5541, {gl, vertexAttribIPointer, 0}}, + {5542, {gl, vertexAttribIPointer, 0}}, + {5543, {gl, getVertexAttribIiv, 0}}, + {5544, {gl, getVertexAttribIuiv, 0}}, + {5545, {gl, getUniformuiv, 0}}, + {5546, {gl, bindFragDataLocation, 0}}, + {5547, {gl, getFragDataLocation, 0}}, + {5548, {gl, uniform1ui, 0}}, + {5549, {gl, uniform2ui, 0}}, + {5550, {gl, uniform3ui, 0}}, + {5551, {gl, uniform4ui, 0}}, + {5552, {gl, uniform1uiv, 0}}, + {5553, {gl, uniform2uiv, 0}}, + {5554, {gl, uniform3uiv, 0}}, + {5555, {gl, uniform4uiv, 0}}, + {5556, {gl, texParameterIiv, 0}}, + {5557, {gl, texParameterIuiv, 0}}, + {5558, {gl, getTexParameterIiv, 0}}, + {5559, {gl, getTexParameterIuiv, 0}}, + {5560, {gl, clearBufferiv, 0}}, + {5561, {gl, clearBufferuiv, 0}}, + {5562, {gl, clearBufferfv, 0}}, + {5563, {gl, clearBufferfi, 0}}, + {5564, {gl, getStringi, 0}}, + {5565, {gl, vertexAttribI1i, 0}}, + {5566, {gl, vertexAttribI2i, 0}}, + {5567, {gl, vertexAttribI3i, 0}}, + {5568, {gl, vertexAttribI4i, 0}}, + {5569, {gl, vertexAttribI1ui, 0}}, + {5570, {gl, vertexAttribI2ui, 0}}, + {5571, {gl, vertexAttribI3ui, 0}}, + {5572, {gl, vertexAttribI4ui, 0}}, + {5573, {gl, vertexAttribI4bv, 0}}, + {5574, {gl, vertexAttribI4sv, 0}}, + {5575, {gl, vertexAttribI4ubv, 0}}, + {5576, {gl, vertexAttribI4usv, 0}}, + {5577, {gl, drawArraysInstanced, 0}}, + {5578, {gl, drawElementsInstanced, 0}}, + {5579, {gl, drawElementsInstanced, 0}}, + {5580, {gl, texBuffer, 0}}, + {5581, {gl, primitiveRestartIndex, 0}}, + {5582, {gl, loadTransposeMatrixfARB, 0}}, + {5583, {gl, loadTransposeMatrixdARB, 0}}, + {5584, {gl, multTransposeMatrixfARB, 0}}, + {5585, {gl, multTransposeMatrixdARB, 0}}, + {5586, {gl, weightbvARB, 0}}, + {5587, {gl, weightsvARB, 0}}, + {5588, {gl, weightivARB, 0}}, + {5589, {gl, weightfvARB, 0}}, + {5590, {gl, weightdvARB, 0}}, + {5591, {gl, weightubvARB, 0}}, + {5592, {gl, weightusvARB, 0}}, + {5593, {gl, weightuivARB, 0}}, + {5594, {gl, vertexBlendARB, 0}}, + {5595, {gl, currentPaletteMatrixARB, 0}}, + {5596, {gl, matrixIndexubvARB, 0}}, + {5597, {gl, matrixIndexusvARB, 0}}, + {5598, {gl, matrixIndexuivARB, 0}}, + {5599, {gl, programStringARB, 0}}, + {5600, {gl, bindProgramARB, 0}}, + {5601, {gl, deleteProgramsARB, 0}}, + {5602, {gl, genProgramsARB, 0}}, + {5603, {gl, programEnvParameter4dARB, 0}}, + {5604, {gl, programEnvParameter4dvARB, 0}}, + {5605, {gl, programEnvParameter4fARB, 0}}, + {5606, {gl, programEnvParameter4fvARB, 0}}, + {5607, {gl, programLocalParameter4dARB, 0}}, + {5608, {gl, programLocalParameter4dvARB, 0}}, + {5609, {gl, programLocalParameter4fARB, 0}}, + {5610, {gl, programLocalParameter4fvARB, 0}}, + {5611, {gl, getProgramEnvParameterdvARB, 0}}, + {5612, {gl, getProgramEnvParameterfvARB, 0}}, + {5613, {gl, getProgramLocalParameterdvARB, 0}}, + {5614, {gl, getProgramLocalParameterfvARB, 0}}, + {5615, {gl, getProgramStringARB, 0}}, + {5616, {gl, deleteObjectARB, 0}}, + {5617, {gl, getHandleARB, 0}}, + {5618, {gl, detachObjectARB, 0}}, + {5619, {gl, createShaderObjectARB, 0}}, + {5620, {gl, shaderSourceARB, 0}}, + {5621, {gl, compileShaderARB, 0}}, + {5622, {gl, createProgramObjectARB, 0}}, + {5623, {gl, attachObjectARB, 0}}, + {5624, {gl, linkProgramARB, 0}}, + {5625, {gl, useProgramObjectARB, 0}}, + {5626, {gl, validateProgramARB, 0}}, + {5627, {gl, getObjectParameterfvARB, 0}}, + {5628, {gl, getObjectParameterivARB, 0}}, + {5629, {gl, getInfoLogARB, 0}}, + {5630, {gl, getAttachedObjectsARB, 0}}, + {5631, {gl, getUniformLocationARB, 0}}, + {5632, {gl, getActiveUniformARB, 0}}, + {5633, {gl, getUniformfvARB, 0}}, + {5634, {gl, getUniformivARB, 0}}, + {5635, {gl, getShaderSourceARB, 0}}, + {5636, {gl, bindAttribLocationARB, 0}}, + {5637, {gl, getActiveAttribARB, 0}}, + {5638, {gl, getAttribLocationARB, 0}}, + {5639, {gl, isRenderbuffer, 0}}, + {5640, {gl, bindRenderbuffer, 0}}, + {5641, {gl, deleteRenderbuffers, 0}}, + {5642, {gl, genRenderbuffers, 0}}, + {5643, {gl, renderbufferStorage, 0}}, + {5644, {gl, getRenderbufferParameteriv, 0}}, + {5645, {gl, isFramebuffer, 0}}, + {5646, {gl, bindFramebuffer, 0}}, + {5647, {gl, deleteFramebuffers, 0}}, + {5648, {gl, genFramebuffers, 0}}, + {5649, {gl, checkFramebufferStatus, 0}}, + {5650, {gl, framebufferTexture1D, 0}}, + {5651, {gl, framebufferTexture2D, 0}}, + {5652, {gl, framebufferTexture3D, 0}}, + {5653, {gl, framebufferRenderbuffer, 0}}, + {5654, {gl, getFramebufferAttachmentParameteriv, 0}}, + {5655, {gl, generateMipmap, 0}}, + {5656, {gl, blitFramebuffer, 0}}, + {5657, {gl, renderbufferStorageMultisample, 0}}, + {5658, {gl, framebufferTextureLayer, 0}}, + {5659, {gl, programParameteriARB, 0}}, + {5660, {gl, framebufferTextureARB, 0}}, + {5661, {gl, framebufferTextureFaceARB, 0}}, + {5662, {gl, vertexAttribDivisorARB, 0}}, + {5663, {gl, flushMappedBufferRange, 0}}, + {5664, {gl, bindVertexArray, 0}}, + {5665, {gl, deleteVertexArrays, 0}}, + {5666, {gl, genVertexArrays, 0}}, + {5667, {gl, isVertexArray, 0}}, + {5668, {gl, getUniformIndices, 0}}, + {5669, {gl, getActiveUniformsiv, 0}}, + {5670, {gl, getActiveUniformName, 0}}, + {5671, {gl, getUniformBlockIndex, 0}}, + {5672, {gl, getActiveUniformBlockiv, 0}}, + {5673, {gl, getActiveUniformBlockName, 0}}, + {5674, {gl, uniformBlockBinding, 0}}, + {5675, {gl, copyBufferSubData, 0}}, + {5676, {gl, resizeBuffersMESA, 0}}, + {5677, {gl, windowPos4dMESA, 0}}, + {5678, {gl, windowPos4fMESA, 0}}, + {5679, {gl, windowPos4iMESA, 0}}, + {5680, {gl, windowPos4sMESA, 0}}, + {5681, {gl, depthBoundsEXT, 0}}, + {5682, {gl, stencilClearTagEXT, 0}}, + {5010, {glu, build1DMipmapLevels, 0}}, + {5011, {glu, build1DMipmaps, 0}}, + {5012, {glu, build2DMipmapLevels, 0}}, + {5013, {glu, build2DMipmaps, 0}}, + {5014, {glu, build3DMipmapLevels, 0}}, + {5015, {glu, build3DMipmaps, 0}}, + {5016, {glu, checkExtension, 0}}, + {5017, {glu, cylinder, 0}}, + {5018, {glu, deleteQuadric, 0}}, + {5019, {glu, disk, 0}}, + {5020, {glu, errorString, 0}}, + {5021, {glu, getString, 0}}, + {5022, {glu, lookAt, 0}}, + {5023, {glu, newQuadric, 0}}, + {5024, {glu, ortho2D, 0}}, + {5025, {glu, partialDisk, 0}}, + {5026, {glu, perspective, 0}}, + {5027, {glu, pickMatrix, 0}}, + {5028, {glu, project, 0}}, + {5029, {glu, quadricDrawStyle, 0}}, + {5030, {glu, quadricNormals, 0}}, + {5031, {glu, quadricOrientation, 0}}, + {5032, {glu, quadricTexture, 0}}, + {5033, {glu, scaleImage, 0}}, + {5034, {glu, sphere, 0}}, + {5035, {glu, unProject, 0}}, + {5036, {glu, unProject4, 0}}, {-1, {mod, func, -1}} ]. diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/gl.erl erlang-13.b.3-dfsg/lib/wx/src/gen/gl.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/gl.erl 2009-06-05 13:54:32.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/gl.erl 2009-09-18 15:11:02.000000000 +0100 @@ -49,6 +49,7 @@ -define(GLclampd,64/native-float). -define(GLsizeiptr,64/native-unsigned). -define(GLintptr,64/native-unsigned). +-define(GLUquadric,64/native-unsigned). -define(GLhandleARB,64/native-unsigned). -export([accum/2,alphaFunc/2,areTexturesResident/1,arrayElement/1,'begin'/1, @@ -110,82 +111,84 @@ vertex3dv/1,vertex3f/3,vertex3fv/1,vertex3i/3,vertex3iv/1,vertex3s/3, vertex3sv/1,vertex4d/4,vertex4dv/1,vertex4f/4,vertex4fv/1,vertex4i/4, vertex4iv/1,vertex4s/4,vertex4sv/1,vertexPointer/4,viewport/4,blendColor/4, - blendEquation/1,drawRangeElements/6,colorTable/6,colorTableParameterfv/3, - colorTableParameteriv/3,copyColorTable/5,getColorTable/4,getColorTableParameterfv/2, - getColorTableParameteriv/2,colorSubTable/6,copyColorSubTable/5,convolutionFilter1D/6, - convolutionFilter2D/7,convolutionParameterf/3,convolutionParameterfv/3, - convolutionParameteri/3,convolutionParameteriv/3,copyConvolutionFilter1D/5, - copyConvolutionFilter2D/6,getConvolutionFilter/4,getConvolutionParameterfv/2, - getConvolutionParameteriv/2,separableFilter2D/8,getHistogram/5,getHistogramParameterfv/2, - getHistogramParameteriv/2,getMinmax/5,getMinmaxParameterfv/2,getMinmaxParameteriv/2, - histogram/4,minmax/3,resetHistogram/1,resetMinmax/1,texImage3D/10, - texSubImage3D/11,copyTexSubImage3D/9,activeTexture/1,clientActiveTexture/1, - multiTexCoord1d/2,multiTexCoord1dv/2,multiTexCoord1f/2,multiTexCoord1fv/2, - multiTexCoord1i/2,multiTexCoord1iv/2,multiTexCoord1s/2,multiTexCoord1sv/2, - multiTexCoord2d/3,multiTexCoord2dv/2,multiTexCoord2f/3,multiTexCoord2fv/2, - multiTexCoord2i/3,multiTexCoord2iv/2,multiTexCoord2s/3,multiTexCoord2sv/2, - multiTexCoord3d/4,multiTexCoord3dv/2,multiTexCoord3f/4,multiTexCoord3fv/2, - multiTexCoord3i/4,multiTexCoord3iv/2,multiTexCoord3s/4,multiTexCoord3sv/2, - multiTexCoord4d/5,multiTexCoord4dv/2,multiTexCoord4f/5,multiTexCoord4fv/2, - multiTexCoord4i/5,multiTexCoord4iv/2,multiTexCoord4s/5,multiTexCoord4sv/2, - loadTransposeMatrixf/1,loadTransposeMatrixd/1,multTransposeMatrixf/1, - multTransposeMatrixd/1,sampleCoverage/2,compressedTexImage3D/9,compressedTexImage2D/8, - compressedTexImage1D/7,compressedTexSubImage3D/11,compressedTexSubImage2D/9, - compressedTexSubImage1D/7,getCompressedTexImage/3,blendFuncSeparate/4, - fogCoordf/1,fogCoordfv/1,fogCoordd/1,fogCoorddv/1,fogCoordPointer/3, - multiDrawArrays/3,pointParameterf/2,pointParameterfv/2,pointParameteri/2, - pointParameteriv/2,secondaryColor3b/3,secondaryColor3bv/1,secondaryColor3d/3, - secondaryColor3dv/1,secondaryColor3f/3,secondaryColor3fv/1,secondaryColor3i/3, - secondaryColor3iv/1,secondaryColor3s/3,secondaryColor3sv/1,secondaryColor3ub/3, - secondaryColor3ubv/1,secondaryColor3ui/3,secondaryColor3uiv/1,secondaryColor3us/3, - secondaryColor3usv/1,secondaryColorPointer/4,windowPos2d/2,windowPos2dv/1, - windowPos2f/2,windowPos2fv/1,windowPos2i/2,windowPos2iv/1,windowPos2s/2, - windowPos2sv/1,windowPos3d/3,windowPos3dv/1,windowPos3f/3,windowPos3fv/1, - windowPos3i/3,windowPos3iv/1,windowPos3s/3,windowPos3sv/1,genQueries/1, - deleteQueries/1,isQuery/1,beginQuery/2,endQuery/1,getQueryiv/2,getQueryObjectiv/2, - getQueryObjectuiv/2,bindBuffer/2,deleteBuffers/1,genBuffers/1,isBuffer/1, - bufferData/4,bufferSubData/4,getBufferSubData/4,getBufferParameteriv/2, - blendEquationSeparate/2,drawBuffers/1,stencilOpSeparate/4,stencilFuncSeparate/4, - stencilMaskSeparate/2,attachShader/2,bindAttribLocation/3,compileShader/1, - createProgram/0,createShader/1,deleteProgram/1,deleteShader/1,detachShader/2, - disableVertexAttribArray/1,enableVertexAttribArray/1,getActiveAttrib/3, - getActiveUniform/3,getAttachedShaders/2,getAttribLocation/2,getProgramiv/2, - getProgramInfoLog/2,getShaderiv/2,getShaderInfoLog/2,getShaderSource/2, - getUniformLocation/2,getUniformfv/2,getUniformiv/2,getVertexAttribdv/2, - getVertexAttribfv/2,getVertexAttribiv/2,isProgram/1,isShader/1,linkProgram/1, - shaderSource/2,useProgram/1,uniform1f/2,uniform2f/3,uniform3f/4,uniform4f/5, - uniform1i/2,uniform2i/3,uniform3i/4,uniform4i/5,uniform1fv/2,uniform2fv/2, - uniform3fv/2,uniform4fv/2,uniform1iv/2,uniform2iv/2,uniform3iv/2,uniform4iv/2, - uniformMatrix2fv/3,uniformMatrix3fv/3,uniformMatrix4fv/3,validateProgram/1, - vertexAttrib1d/2,vertexAttrib1dv/2,vertexAttrib1f/2,vertexAttrib1fv/2, - vertexAttrib1s/2,vertexAttrib1sv/2,vertexAttrib2d/3,vertexAttrib2dv/2, - vertexAttrib2f/3,vertexAttrib2fv/2,vertexAttrib2s/3,vertexAttrib2sv/2, - vertexAttrib3d/4,vertexAttrib3dv/2,vertexAttrib3f/4,vertexAttrib3fv/2, - vertexAttrib3s/4,vertexAttrib3sv/2,vertexAttrib4Nbv/2,vertexAttrib4Niv/2, - vertexAttrib4Nsv/2,vertexAttrib4Nub/5,vertexAttrib4Nubv/2,vertexAttrib4Nuiv/2, - vertexAttrib4Nusv/2,vertexAttrib4bv/2,vertexAttrib4d/5,vertexAttrib4dv/2, - vertexAttrib4f/5,vertexAttrib4fv/2,vertexAttrib4iv/2,vertexAttrib4s/5, - vertexAttrib4sv/2,vertexAttrib4ubv/2,vertexAttrib4uiv/2,vertexAttrib4usv/2, - vertexAttribPointer/6,uniformMatrix2x3fv/3,uniformMatrix3x2fv/3, - uniformMatrix2x4fv/3,uniformMatrix4x2fv/3,uniformMatrix3x4fv/3,uniformMatrix4x3fv/3, - colorMaski/5,getBooleani_v/2,getIntegeri_v/2,enablei/2,disablei/2, - isEnabledi/2,beginTransformFeedback/1,endTransformFeedback/0,bindBufferRange/5, - bindBufferBase/3,clampColor/2,beginConditionalRender/2,endConditionalRender/0, - vertexAttribI1i/2,vertexAttribI2i/3,vertexAttribI3i/4,vertexAttribI4i/5, - vertexAttribI1ui/2,vertexAttribI2ui/3,vertexAttribI3ui/4,vertexAttribI4ui/5, - vertexAttribI1iv/2,vertexAttribI2iv/2,vertexAttribI3iv/2,vertexAttribI4iv/2, - vertexAttribI1uiv/2,vertexAttribI2uiv/2,vertexAttribI3uiv/2,vertexAttribI4uiv/2, - vertexAttribI4bv/2,vertexAttribI4sv/2,vertexAttribI4ubv/2,vertexAttribI4usv/2, - vertexAttribIPointer/5,getVertexAttribIiv/2,getVertexAttribIuiv/2, - getUniformuiv/2,bindFragDataLocation/3,getFragDataLocation/2,uniform1ui/2, - uniform2ui/3,uniform3ui/4,uniform4ui/5,uniform1uiv/2,uniform2uiv/2, - uniform3uiv/2,uniform4uiv/2,texParameterIiv/3,texParameterIuiv/3, - getTexParameterIiv/2,getTexParameterIuiv/2,clearBufferiv/3,clearBufferuiv/3, - clearBufferfv/3,clearBufferfi/4,getStringi/2,weightbvARB/1,weightsvARB/1, - weightivARB/1,weightfvARB/1,weightdvARB/1,weightubvARB/1,weightusvARB/1, - weightuivARB/1,vertexBlendARB/1,currentPaletteMatrixARB/1,matrixIndexubvARB/1, - matrixIndexusvARB/1,matrixIndexuivARB/1,programStringARB/3,bindProgramARB/2, - deleteProgramsARB/1,genProgramsARB/1,programEnvParameter4dARB/6, + blendEquation/1,drawRangeElements/6,texImage3D/10,texSubImage3D/11, + copyTexSubImage3D/9,colorTable/6,colorTableParameterfv/3,colorTableParameteriv/3, + copyColorTable/5,getColorTable/4,getColorTableParameterfv/2,getColorTableParameteriv/2, + colorSubTable/6,copyColorSubTable/5,convolutionFilter1D/6,convolutionFilter2D/7, + convolutionParameterf/3,convolutionParameterfv/3,convolutionParameteri/3, + convolutionParameteriv/3,copyConvolutionFilter1D/5,copyConvolutionFilter2D/6, + getConvolutionFilter/4,getConvolutionParameterfv/2,getConvolutionParameteriv/2, + separableFilter2D/8,getHistogram/5,getHistogramParameterfv/2,getHistogramParameteriv/2, + getMinmax/5,getMinmaxParameterfv/2,getMinmaxParameteriv/2,histogram/4, + minmax/3,resetHistogram/1,resetMinmax/1,activeTexture/1,sampleCoverage/2, + compressedTexImage3D/9,compressedTexImage2D/8,compressedTexImage1D/7, + compressedTexSubImage3D/11,compressedTexSubImage2D/9,compressedTexSubImage1D/7, + getCompressedTexImage/3,clientActiveTexture/1,multiTexCoord1d/2, + multiTexCoord1dv/2,multiTexCoord1f/2,multiTexCoord1fv/2,multiTexCoord1i/2, + multiTexCoord1iv/2,multiTexCoord1s/2,multiTexCoord1sv/2,multiTexCoord2d/3, + multiTexCoord2dv/2,multiTexCoord2f/3,multiTexCoord2fv/2,multiTexCoord2i/3, + multiTexCoord2iv/2,multiTexCoord2s/3,multiTexCoord2sv/2,multiTexCoord3d/4, + multiTexCoord3dv/2,multiTexCoord3f/4,multiTexCoord3fv/2,multiTexCoord3i/4, + multiTexCoord3iv/2,multiTexCoord3s/4,multiTexCoord3sv/2,multiTexCoord4d/5, + multiTexCoord4dv/2,multiTexCoord4f/5,multiTexCoord4fv/2,multiTexCoord4i/5, + multiTexCoord4iv/2,multiTexCoord4s/5,multiTexCoord4sv/2,loadTransposeMatrixf/1, + loadTransposeMatrixd/1,multTransposeMatrixf/1,multTransposeMatrixd/1, + blendFuncSeparate/4,multiDrawArrays/3,pointParameterf/2,pointParameterfv/2, + pointParameteri/2,pointParameteriv/2,fogCoordf/1,fogCoordfv/1,fogCoordd/1, + fogCoorddv/1,fogCoordPointer/3,secondaryColor3b/3,secondaryColor3bv/1, + secondaryColor3d/3,secondaryColor3dv/1,secondaryColor3f/3,secondaryColor3fv/1, + secondaryColor3i/3,secondaryColor3iv/1,secondaryColor3s/3,secondaryColor3sv/1, + secondaryColor3ub/3,secondaryColor3ubv/1,secondaryColor3ui/3,secondaryColor3uiv/1, + secondaryColor3us/3,secondaryColor3usv/1,secondaryColorPointer/4, + windowPos2d/2,windowPos2dv/1,windowPos2f/2,windowPos2fv/1,windowPos2i/2, + windowPos2iv/1,windowPos2s/2,windowPos2sv/1,windowPos3d/3,windowPos3dv/1, + windowPos3f/3,windowPos3fv/1,windowPos3i/3,windowPos3iv/1,windowPos3s/3, + windowPos3sv/1,genQueries/1,deleteQueries/1,isQuery/1,beginQuery/2, + endQuery/1,getQueryiv/2,getQueryObjectiv/2,getQueryObjectuiv/2,bindBuffer/2, + deleteBuffers/1,genBuffers/1,isBuffer/1,bufferData/4,bufferSubData/4, + getBufferSubData/4,getBufferParameteriv/2,blendEquationSeparate/2, + drawBuffers/1,stencilOpSeparate/4,stencilFuncSeparate/4,stencilMaskSeparate/2, + attachShader/2,bindAttribLocation/3,compileShader/1,createProgram/0, + createShader/1,deleteProgram/1,deleteShader/1,detachShader/2,disableVertexAttribArray/1, + enableVertexAttribArray/1,getActiveAttrib/3,getActiveUniform/3,getAttachedShaders/2, + getAttribLocation/2,getProgramiv/2,getProgramInfoLog/2,getShaderiv/2, + getShaderInfoLog/2,getShaderSource/2,getUniformLocation/2,getUniformfv/2, + getUniformiv/2,getVertexAttribdv/2,getVertexAttribfv/2,getVertexAttribiv/2, + isProgram/1,isShader/1,linkProgram/1,shaderSource/2,useProgram/1,uniform1f/2, + uniform2f/3,uniform3f/4,uniform4f/5,uniform1i/2,uniform2i/3,uniform3i/4, + uniform4i/5,uniform1fv/2,uniform2fv/2,uniform3fv/2,uniform4fv/2,uniform1iv/2, + uniform2iv/2,uniform3iv/2,uniform4iv/2,uniformMatrix2fv/3,uniformMatrix3fv/3, + uniformMatrix4fv/3,validateProgram/1,vertexAttrib1d/2,vertexAttrib1dv/2, + vertexAttrib1f/2,vertexAttrib1fv/2,vertexAttrib1s/2,vertexAttrib1sv/2, + vertexAttrib2d/3,vertexAttrib2dv/2,vertexAttrib2f/3,vertexAttrib2fv/2, + vertexAttrib2s/3,vertexAttrib2sv/2,vertexAttrib3d/4,vertexAttrib3dv/2, + vertexAttrib3f/4,vertexAttrib3fv/2,vertexAttrib3s/4,vertexAttrib3sv/2, + vertexAttrib4Nbv/2,vertexAttrib4Niv/2,vertexAttrib4Nsv/2,vertexAttrib4Nub/5, + vertexAttrib4Nubv/2,vertexAttrib4Nuiv/2,vertexAttrib4Nusv/2,vertexAttrib4bv/2, + vertexAttrib4d/5,vertexAttrib4dv/2,vertexAttrib4f/5,vertexAttrib4fv/2, + vertexAttrib4iv/2,vertexAttrib4s/5,vertexAttrib4sv/2,vertexAttrib4ubv/2, + vertexAttrib4uiv/2,vertexAttrib4usv/2,vertexAttribPointer/6,uniformMatrix2x3fv/3, + uniformMatrix3x2fv/3,uniformMatrix2x4fv/3,uniformMatrix4x2fv/3,uniformMatrix3x4fv/3, + uniformMatrix4x3fv/3,colorMaski/5,getBooleani_v/2,getIntegeri_v/2, + enablei/2,disablei/2,isEnabledi/2,beginTransformFeedback/1,endTransformFeedback/0, + bindBufferRange/5,bindBufferBase/3,transformFeedbackVaryings/3,getTransformFeedbackVarying/3, + clampColor/2,beginConditionalRender/2,endConditionalRender/0,vertexAttribIPointer/5, + getVertexAttribIiv/2,getVertexAttribIuiv/2,getUniformuiv/2,bindFragDataLocation/3, + getFragDataLocation/2,uniform1ui/2,uniform2ui/3,uniform3ui/4,uniform4ui/5, + uniform1uiv/2,uniform2uiv/2,uniform3uiv/2,uniform4uiv/2,texParameterIiv/3, + texParameterIuiv/3,getTexParameterIiv/2,getTexParameterIuiv/2,clearBufferiv/3, + clearBufferuiv/3,clearBufferfv/3,clearBufferfi/4,getStringi/2,vertexAttribI1i/2, + vertexAttribI2i/3,vertexAttribI3i/4,vertexAttribI4i/5,vertexAttribI1ui/2, + vertexAttribI2ui/3,vertexAttribI3ui/4,vertexAttribI4ui/5,vertexAttribI1iv/2, + vertexAttribI2iv/2,vertexAttribI3iv/2,vertexAttribI4iv/2,vertexAttribI1uiv/2, + vertexAttribI2uiv/2,vertexAttribI3uiv/2,vertexAttribI4uiv/2,vertexAttribI4bv/2, + vertexAttribI4sv/2,vertexAttribI4ubv/2,vertexAttribI4usv/2,drawArraysInstanced/4, + drawElementsInstanced/5,texBuffer/3,primitiveRestartIndex/1,loadTransposeMatrixfARB/1, + loadTransposeMatrixdARB/1,multTransposeMatrixfARB/1,multTransposeMatrixdARB/1, + weightbvARB/1,weightsvARB/1,weightivARB/1,weightfvARB/1,weightdvARB/1, + weightubvARB/1,weightusvARB/1,weightuivARB/1,vertexBlendARB/1,currentPaletteMatrixARB/1, + matrixIndexubvARB/1,matrixIndexusvARB/1,matrixIndexuivARB/1,programStringARB/3, + bindProgramARB/2,deleteProgramsARB/1,genProgramsARB/1,programEnvParameter4dARB/6, programEnvParameter4dvARB/3,programEnvParameter4fARB/6,programEnvParameter4fvARB/3, programLocalParameter4dARB/6,programLocalParameter4dvARB/3,programLocalParameter4fARB/6, programLocalParameter4fvARB/3,getProgramEnvParameterdvARB/2,getProgramEnvParameterfvARB/2, @@ -196,19 +199,21 @@ getObjectParameterfvARB/2,getObjectParameterivARB/2,getInfoLogARB/2, getAttachedObjectsARB/2,getUniformLocationARB/2,getActiveUniformARB/3, getUniformfvARB/2,getUniformivARB/2,getShaderSourceARB/2,bindAttribLocationARB/3, - getActiveAttribARB/3,getAttribLocationARB/2,drawArraysInstancedARB/4, - drawElementsInstancedARB/5,isRenderbuffer/1,bindRenderbuffer/2,deleteRenderbuffers/1, - genRenderbuffers/1,renderbufferStorage/4,getRenderbufferParameteriv/2, + getActiveAttribARB/3,getAttribLocationARB/2,isRenderbuffer/1,bindRenderbuffer/2, + deleteRenderbuffers/1,genRenderbuffers/1,renderbufferStorage/4,getRenderbufferParameteriv/2, isFramebuffer/1,bindFramebuffer/2,deleteFramebuffers/1,genFramebuffers/1, checkFramebufferStatus/1,framebufferTexture1D/5,framebufferTexture2D/5, framebufferTexture3D/6,framebufferRenderbuffer/4,getFramebufferAttachmentParameteriv/3, generateMipmap/1,blitFramebuffer/10,renderbufferStorageMultisample/5, framebufferTextureLayer/5,programParameteriARB/3,framebufferTextureARB/4, - framebufferTextureFaceARB/5,vertexAttribDivisor/2,flushMappedBufferRange/3, - texBufferARB/3,bindVertexArray/1,deleteVertexArrays/1,genVertexArrays/1, - isVertexArray/1,resizeBuffersMESA/0,windowPos4dMESA/4,windowPos4dvMESA/1, - windowPos4fMESA/4,windowPos4fvMESA/1,windowPos4iMESA/4,windowPos4ivMESA/1, - windowPos4sMESA/4,windowPos4svMESA/1,depthBoundsEXT/2,stencilClearTagEXT/2]). + framebufferTextureFaceARB/5,vertexAttribDivisorARB/2,flushMappedBufferRange/3, + bindVertexArray/1,deleteVertexArrays/1,genVertexArrays/1,isVertexArray/1, + getUniformIndices/2,getActiveUniformsiv/3,getActiveUniformName/3, + getUniformBlockIndex/2,getActiveUniformBlockiv/4,getActiveUniformBlockName/3, + uniformBlockBinding/3,copyBufferSubData/5,resizeBuffersMESA/0,windowPos4dMESA/4, + windowPos4dvMESA/1,windowPos4fMESA/4,windowPos4fvMESA/1,windowPos4iMESA/4, + windowPos4ivMESA/1,windowPos4sMESA/4,windowPos4svMESA/1,depthBoundsEXT/2, + stencilClearTagEXT/2]). %% API @@ -216,97 +221,97 @@ %% @spec (Op::enum(),Value::float()) -> ok %% @doc See external documentation. accum(Op,Value) -> - wxe_util:cast(5017, <>). + wxe_util:cast(5037, <>). %% @spec (Func::enum(),Ref::clamp()) -> ok %% @doc See external documentation. alphaFunc(Func,Ref) -> - wxe_util:cast(5018, <>). + wxe_util:cast(5038, <>). %% @spec (Textures::[integer()]) -> {0|1,Residences::[0|1]} %% @doc See external documentation. areTexturesResident(Textures) -> - wxe_util:call(5019, <<(length(Textures)):?GLuint, + wxe_util:call(5039, <<(length(Textures)):?GLuint, (<< <> || C <- Textures>>)/binary,0:(((1+length(Textures)) rem 2)*32)>>). %% @spec (I::integer()) -> ok %% @doc See external documentation. arrayElement(I) -> - wxe_util:cast(5020, <>). + wxe_util:cast(5040, <>). %% @spec (Mode::enum()) -> ok %% @doc See external documentation. 'begin'(Mode) -> - wxe_util:cast(5021, <>). + wxe_util:cast(5041, <>). %% @spec (Target::enum(),Texture::integer()) -> ok %% @doc See external documentation. bindTexture(Target,Texture) -> - wxe_util:cast(5022, <>). + wxe_util:cast(5042, <>). %% @spec (Width::integer(),Height::integer(),Xorig::float(),Yorig::float(),Xmove::float(),Ymove::float(),Bitmap::offset()|binary()) -> ok %% @doc See external documentation. bitmap(Width,Height,Xorig,Yorig,Xmove,Ymove,Bitmap) when is_integer(Bitmap) -> - wxe_util:cast(5023, <>); + wxe_util:cast(5043, <>); bitmap(Width,Height,Xorig,Yorig,Xmove,Ymove,Bitmap) -> wxe_util:send_bin(Bitmap), - wxe_util:cast(5024, <>). + wxe_util:cast(5044, <>). %% @spec (Sfactor::enum(),Dfactor::enum()) -> ok %% @doc See external documentation. blendFunc(Sfactor,Dfactor) -> - wxe_util:cast(5025, <>). + wxe_util:cast(5045, <>). %% @spec (List::integer()) -> ok %% @doc See external documentation. callList(List) -> - wxe_util:cast(5026, <>). + wxe_util:cast(5046, <>). %% @spec (Lists::[integer()]) -> ok %% @doc See external documentation. callLists(Lists) -> - wxe_util:cast(5027, <<(length(Lists)):?GLuint, + wxe_util:cast(5047, <<(length(Lists)):?GLuint, (<< <> || C <- Lists>>)/binary,0:(((1+length(Lists)) rem 2)*32)>>). %% @spec (Mask::integer()) -> ok %% @doc See external documentation. clear(Mask) -> - wxe_util:cast(5028, <>). + wxe_util:cast(5048, <>). %% @spec (Red::float(),Green::float(),Blue::float(),Alpha::float()) -> ok %% @doc See external documentation. clearAccum(Red,Green,Blue,Alpha) -> - wxe_util:cast(5029, <>). + wxe_util:cast(5049, <>). %% @spec (Red::clamp(),Green::clamp(),Blue::clamp(),Alpha::clamp()) -> ok %% @doc See external documentation. clearColor(Red,Green,Blue,Alpha) -> - wxe_util:cast(5030, <>). + wxe_util:cast(5050, <>). %% @spec (Depth::clamp()) -> ok %% @doc See external documentation. clearDepth(Depth) -> - wxe_util:cast(5031, <>). + wxe_util:cast(5051, <>). %% @spec (C::float()) -> ok %% @doc See external documentation. clearIndex(C) -> - wxe_util:cast(5032, <>). + wxe_util:cast(5052, <>). %% @spec (S::integer()) -> ok %% @doc See external documentation. clearStencil(S) -> - wxe_util:cast(5033, <>). + wxe_util:cast(5053, <>). %% @spec (Plane::enum(),Equation::{float()}) -> ok %% @doc See external documentation. clipPlane(Plane,{E1,E2,E3,E4}) -> - wxe_util:cast(5034, <>). + wxe_util:cast(5054, <>). %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. color3b(Red,Green,Blue) -> - wxe_util:cast(5035, <>). + wxe_util:cast(5055, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv color3b(Red,Green,Blue) @@ -315,7 +320,7 @@ %% @spec (Red::float(),Green::float(),Blue::float()) -> ok %% @doc See external documentation. color3d(Red,Green,Blue) -> - wxe_util:cast(5036, <>). + wxe_util:cast(5056, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv color3d(Red,Green,Blue) @@ -324,7 +329,7 @@ %% @spec (Red::float(),Green::float(),Blue::float()) -> ok %% @doc See external documentation. color3f(Red,Green,Blue) -> - wxe_util:cast(5037, <>). + wxe_util:cast(5057, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv color3f(Red,Green,Blue) @@ -333,7 +338,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. color3i(Red,Green,Blue) -> - wxe_util:cast(5038, <>). + wxe_util:cast(5058, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv color3i(Red,Green,Blue) @@ -342,7 +347,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. color3s(Red,Green,Blue) -> - wxe_util:cast(5039, <>). + wxe_util:cast(5059, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv color3s(Red,Green,Blue) @@ -351,7 +356,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. color3ub(Red,Green,Blue) -> - wxe_util:cast(5040, <>). + wxe_util:cast(5060, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv color3ub(Red,Green,Blue) @@ -360,7 +365,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. color3ui(Red,Green,Blue) -> - wxe_util:cast(5041, <>). + wxe_util:cast(5061, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv color3ui(Red,Green,Blue) @@ -369,7 +374,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. color3us(Red,Green,Blue) -> - wxe_util:cast(5042, <>). + wxe_util:cast(5062, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv color3us(Red,Green,Blue) @@ -378,7 +383,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer(),Alpha::integer()) -> ok %% @doc See external documentation. color4b(Red,Green,Blue,Alpha) -> - wxe_util:cast(5043, <>). + wxe_util:cast(5063, <>). %% @spec ({Red,Green,Blue,Alpha}) -> ok %% @equiv color4b(Red,Green,Blue,Alpha) @@ -387,7 +392,7 @@ %% @spec (Red::float(),Green::float(),Blue::float(),Alpha::float()) -> ok %% @doc See external documentation. color4d(Red,Green,Blue,Alpha) -> - wxe_util:cast(5044, <>). + wxe_util:cast(5064, <>). %% @spec ({Red,Green,Blue,Alpha}) -> ok %% @equiv color4d(Red,Green,Blue,Alpha) @@ -396,7 +401,7 @@ %% @spec (Red::float(),Green::float(),Blue::float(),Alpha::float()) -> ok %% @doc See external documentation. color4f(Red,Green,Blue,Alpha) -> - wxe_util:cast(5045, <>). + wxe_util:cast(5065, <>). %% @spec ({Red,Green,Blue,Alpha}) -> ok %% @equiv color4f(Red,Green,Blue,Alpha) @@ -405,7 +410,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer(),Alpha::integer()) -> ok %% @doc See external documentation. color4i(Red,Green,Blue,Alpha) -> - wxe_util:cast(5046, <>). + wxe_util:cast(5066, <>). %% @spec ({Red,Green,Blue,Alpha}) -> ok %% @equiv color4i(Red,Green,Blue,Alpha) @@ -414,7 +419,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer(),Alpha::integer()) -> ok %% @doc See external documentation. color4s(Red,Green,Blue,Alpha) -> - wxe_util:cast(5047, <>). + wxe_util:cast(5067, <>). %% @spec ({Red,Green,Blue,Alpha}) -> ok %% @equiv color4s(Red,Green,Blue,Alpha) @@ -423,7 +428,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer(),Alpha::integer()) -> ok %% @doc See external documentation. color4ub(Red,Green,Blue,Alpha) -> - wxe_util:cast(5048, <>). + wxe_util:cast(5068, <>). %% @spec ({Red,Green,Blue,Alpha}) -> ok %% @equiv color4ub(Red,Green,Blue,Alpha) @@ -432,7 +437,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer(),Alpha::integer()) -> ok %% @doc See external documentation. color4ui(Red,Green,Blue,Alpha) -> - wxe_util:cast(5049, <>). + wxe_util:cast(5069, <>). %% @spec ({Red,Green,Blue,Alpha}) -> ok %% @equiv color4ui(Red,Green,Blue,Alpha) @@ -441,7 +446,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer(),Alpha::integer()) -> ok %% @doc See external documentation. color4us(Red,Green,Blue,Alpha) -> - wxe_util:cast(5050, <>). + wxe_util:cast(5070, <>). %% @spec ({Red,Green,Blue,Alpha}) -> ok %% @equiv color4us(Red,Green,Blue,Alpha) @@ -450,125 +455,125 @@ %% @spec (Red::0|1,Green::0|1,Blue::0|1,Alpha::0|1) -> ok %% @doc See external documentation. colorMask(Red,Green,Blue,Alpha) -> - wxe_util:cast(5051, <>). + wxe_util:cast(5071, <>). %% @spec (Face::enum(),Mode::enum()) -> ok %% @doc See external documentation. colorMaterial(Face,Mode) -> - wxe_util:cast(5052, <>). + wxe_util:cast(5072, <>). %% @spec (Size::integer(),Type::enum(),Stride::integer(),Pointer::offset()|binary()) -> ok %% @doc See external documentation. colorPointer(Size,Type,Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5053, <>); + wxe_util:cast(5073, <>); colorPointer(Size,Type,Stride,Pointer) -> wxe_util:send_bin(Pointer), - wxe_util:cast(5054, <>). + wxe_util:cast(5074, <>). %% @spec (X::integer(),Y::integer(),Width::integer(),Height::integer(),Type::enum()) -> ok %% @doc See external documentation. copyPixels(X,Y,Width,Height,Type) -> - wxe_util:cast(5055, <>). + wxe_util:cast(5075, <>). %% @spec (Target::enum(),Level::integer(),InternalFormat::enum(),X::integer(),Y::integer(),Width::integer(),Border::integer()) -> ok %% @doc See external documentation. copyTexImage1D(Target,Level,InternalFormat,X,Y,Width,Border) -> - wxe_util:cast(5056, <>). + wxe_util:cast(5076, <>). %% @spec (Target::enum(),Level::integer(),InternalFormat::enum(),X::integer(),Y::integer(),Width::integer(),Height::integer(),Border::integer()) -> ok %% @doc See external documentation. copyTexImage2D(Target,Level,InternalFormat,X,Y,Width,Height,Border) -> - wxe_util:cast(5057, <>). + wxe_util:cast(5077, <>). %% @spec (Target::enum(),Level::integer(),Xoffset::integer(),X::integer(),Y::integer(),Width::integer()) -> ok %% @doc See external documentation. copyTexSubImage1D(Target,Level,Xoffset,X,Y,Width) -> - wxe_util:cast(5058, <>). + wxe_util:cast(5078, <>). %% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Yoffset::integer(),X::integer(),Y::integer(),Width::integer(),Height::integer()) -> ok %% @doc See external documentation. copyTexSubImage2D(Target,Level,Xoffset,Yoffset,X,Y,Width,Height) -> - wxe_util:cast(5059, <>). + wxe_util:cast(5079, <>). %% @spec (Mode::enum()) -> ok %% @doc See external documentation. cullFace(Mode) -> - wxe_util:cast(5060, <>). + wxe_util:cast(5080, <>). %% @spec (List::integer(),Range::integer()) -> ok %% @doc See external documentation. deleteLists(List,Range) -> - wxe_util:cast(5061, <>). + wxe_util:cast(5081, <>). %% @spec (Textures::[integer()]) -> ok %% @doc See external documentation. deleteTextures(Textures) -> - wxe_util:cast(5062, <<(length(Textures)):?GLuint, + wxe_util:cast(5082, <<(length(Textures)):?GLuint, (<< <> || C <- Textures>>)/binary,0:(((1+length(Textures)) rem 2)*32)>>). %% @spec (Func::enum()) -> ok %% @doc See external documentation. depthFunc(Func) -> - wxe_util:cast(5063, <>). + wxe_util:cast(5083, <>). %% @spec (Flag::0|1) -> ok %% @doc See external documentation. depthMask(Flag) -> - wxe_util:cast(5064, <>). + wxe_util:cast(5084, <>). %% @spec (ZNear::clamp(),ZFar::clamp()) -> ok %% @doc See external documentation. depthRange(ZNear,ZFar) -> - wxe_util:cast(5065, <>). + wxe_util:cast(5085, <>). %% @spec (Cap::enum()) -> ok %% @doc See external documentation. disable(Cap) -> - wxe_util:cast(5066, <>). + wxe_util:cast(5086, <>). %% @spec (Array::enum()) -> ok %% @doc See external documentation. disableClientState(Array) -> - wxe_util:cast(5067, <>). + wxe_util:cast(5087, <>). %% @spec (Mode::enum(),First::integer(),Count::integer()) -> ok %% @doc See external documentation. drawArrays(Mode,First,Count) -> - wxe_util:cast(5068, <>). + wxe_util:cast(5088, <>). %% @spec (Mode::enum()) -> ok %% @doc See external documentation. drawBuffer(Mode) -> - wxe_util:cast(5069, <>). + wxe_util:cast(5089, <>). %% @spec (Mode::enum(),Count::integer(),Type::enum(),Indices::offset()|binary()) -> ok %% @doc See external documentation. drawElements(Mode,Count,Type,Indices) when is_integer(Indices) -> - wxe_util:cast(5070, <>); + wxe_util:cast(5090, <>); drawElements(Mode,Count,Type,Indices) -> wxe_util:send_bin(Indices), - wxe_util:cast(5071, <>). + wxe_util:cast(5091, <>). %% @spec (Width::integer(),Height::integer(),Format::enum(),Type::enum(),Pixels::offset()|binary()) -> ok %% @doc See external documentation. drawPixels(Width,Height,Format,Type,Pixels) when is_integer(Pixels) -> - wxe_util:cast(5072, <>); + wxe_util:cast(5092, <>); drawPixels(Width,Height,Format,Type,Pixels) -> wxe_util:send_bin(Pixels), - wxe_util:cast(5073, <>). + wxe_util:cast(5093, <>). %% @spec (Flag::0|1) -> ok %% @doc See external documentation. edgeFlag(Flag) -> - wxe_util:cast(5074, <>). + wxe_util:cast(5094, <>). %% @spec (Stride::integer(),Pointer::offset()|binary()) -> ok %% @doc See external documentation. edgeFlagPointer(Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5075, <>); + wxe_util:cast(5095, <>); edgeFlagPointer(Stride,Pointer) -> wxe_util:send_bin(Pointer), - wxe_util:cast(5076, <>). + wxe_util:cast(5096, <>). %% @spec ({Flag}) -> ok %% @equiv edgeFlag(Flag) @@ -577,27 +582,27 @@ %% @spec (Cap::enum()) -> ok %% @doc See external documentation. enable(Cap) -> - wxe_util:cast(5077, <>). + wxe_util:cast(5097, <>). %% @spec (Array::enum()) -> ok %% @doc See external documentation. enableClientState(Array) -> - wxe_util:cast(5078, <>). + wxe_util:cast(5098, <>). %% @spec () -> ok %% @doc See external documentation. 'end'() -> - wxe_util:cast(5079, <<>>). + wxe_util:cast(5099, <<>>). %% @spec () -> ok %% @doc See external documentation. endList() -> - wxe_util:cast(5080, <<>>). + wxe_util:cast(5100, <<>>). %% @spec (U::float()) -> ok %% @doc See external documentation. evalCoord1d(U) -> - wxe_util:cast(5081, <>). + wxe_util:cast(5101, <>). %% @spec ({U}) -> ok %% @equiv evalCoord1d(U) @@ -606,7 +611,7 @@ %% @spec (U::float()) -> ok %% @doc See external documentation. evalCoord1f(U) -> - wxe_util:cast(5082, <>). + wxe_util:cast(5102, <>). %% @spec ({U}) -> ok %% @equiv evalCoord1f(U) @@ -615,7 +620,7 @@ %% @spec (U::float(),V::float()) -> ok %% @doc See external documentation. evalCoord2d(U,V) -> - wxe_util:cast(5083, <>). + wxe_util:cast(5103, <>). %% @spec ({U,V}) -> ok %% @equiv evalCoord2d(U,V) @@ -624,7 +629,7 @@ %% @spec (U::float(),V::float()) -> ok %% @doc See external documentation. evalCoord2f(U,V) -> - wxe_util:cast(5084, <>). + wxe_util:cast(5104, <>). %% @spec ({U,V}) -> ok %% @equiv evalCoord2f(U,V) @@ -633,250 +638,250 @@ %% @spec (Mode::enum(),I1::integer(),I2::integer()) -> ok %% @doc See external documentation. evalMesh1(Mode,I1,I2) -> - wxe_util:cast(5085, <>). + wxe_util:cast(5105, <>). %% @spec (Mode::enum(),I1::integer(),I2::integer(),J1::integer(),J2::integer()) -> ok %% @doc See external documentation. evalMesh2(Mode,I1,I2,J1,J2) -> - wxe_util:cast(5086, <>). + wxe_util:cast(5106, <>). %% @spec (I::integer()) -> ok %% @doc See external documentation. evalPoint1(I) -> - wxe_util:cast(5087, <>). + wxe_util:cast(5107, <>). %% @spec (I::integer(),J::integer()) -> ok %% @doc See external documentation. evalPoint2(I,J) -> - wxe_util:cast(5088, <>). + wxe_util:cast(5108, <>). %% @spec (Size::integer(),Type::enum(),Buffer::wx:wx_mem()) -> ok %% @doc See external documentation. feedbackBuffer(Size,Type,Buffer) -> wxe_util:send_bin(Buffer#wx_mem.bin), - wxe_util:call(5089, <>). + wxe_util:call(5109, <>). %% @spec () -> ok %% @doc See external documentation. finish() -> - wxe_util:cast(5090, <<>>). + wxe_util:cast(5110, <<>>). %% @spec () -> ok %% @doc See external documentation. flush() -> - wxe_util:cast(5091, <<>>). + wxe_util:cast(5111, <<>>). %% @spec (Pname::enum(),Param::float()) -> ok %% @doc See external documentation. fogf(Pname,Param) -> - wxe_util:cast(5092, <>). + wxe_util:cast(5112, <>). %% @spec (Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. fogfv(Pname,Params) -> - wxe_util:cast(5093, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((0+size(Params)) rem 2)*32)>>). %% @spec (Pname::enum(),Param::integer()) -> ok %% @doc See external documentation. fogi(Pname,Param) -> - wxe_util:cast(5094, <>). + wxe_util:cast(5114, <>). %% @spec (Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. fogiv(Pname,Params) -> - wxe_util:cast(5095, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((0+size(Params)) rem 2)*32)>>). %% @spec (Mode::enum()) -> ok %% @doc See external documentation. frontFace(Mode) -> - wxe_util:cast(5096, <>). + wxe_util:cast(5116, <>). %% @spec (Left::float(),Right::float(),Bottom::float(),Top::float(),ZNear::float(),ZFar::float()) -> ok %% @doc See external documentation. frustum(Left,Right,Bottom,Top,ZNear,ZFar) -> - wxe_util:cast(5097, <>). + wxe_util:cast(5117, <>). %% @spec (Range::integer()) -> integer() %% @doc See external documentation. genLists(Range) -> - wxe_util:call(5098, <>). + wxe_util:call(5118, <>). %% @spec (N::integer()) -> [integer()] %% @doc See external documentation. genTextures(N) -> - wxe_util:call(5099, <>). + wxe_util:call(5119, <>). %% @spec (Pname::enum()) -> [0|1] %% @doc See external documentation. getBooleanv(Pname) -> - wxe_util:call(5100, <>). + wxe_util:call(5120, <>). %% @spec (Plane::enum()) -> {float()} %% @doc See external documentation. getClipPlane(Plane) -> - wxe_util:call(5101, <>). + wxe_util:call(5121, <>). %% @spec (Pname::enum()) -> [float()] %% @doc See external documentation. getDoublev(Pname) -> - wxe_util:call(5102, <>). + wxe_util:call(5122, <>). %% @spec () -> enum() %% @doc See external documentation. getError() -> - wxe_util:call(5103, <<>>). + wxe_util:call(5123, <<>>). %% @spec (Pname::enum()) -> [float()] %% @doc See external documentation. getFloatv(Pname) -> - wxe_util:call(5104, <>). + wxe_util:call(5124, <>). %% @spec (Pname::enum()) -> [integer()] %% @doc See external documentation. getIntegerv(Pname) -> - wxe_util:call(5105, <>). + wxe_util:call(5125, <>). %% @spec (Light::enum(),Pname::enum()) -> {float()} %% @doc See external documentation. getLightfv(Light,Pname) -> - wxe_util:call(5106, <>). + wxe_util:call(5126, <>). %% @spec (Light::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getLightiv(Light,Pname) -> - wxe_util:call(5107, <>). + wxe_util:call(5127, <>). %% @spec (Target::enum(),Query::enum(),V::wx:wx_mem()) -> ok %% @doc See external documentation. getMapdv(Target,Query,V) -> wxe_util:send_bin(V#wx_mem.bin), - wxe_util:call(5108, <>). + wxe_util:call(5128, <>). %% @spec (Target::enum(),Query::enum(),V::wx:wx_mem()) -> ok %% @doc See external documentation. getMapfv(Target,Query,V) -> wxe_util:send_bin(V#wx_mem.bin), - wxe_util:call(5109, <>). + wxe_util:call(5129, <>). %% @spec (Target::enum(),Query::enum(),V::wx:wx_mem()) -> ok %% @doc See external documentation. getMapiv(Target,Query,V) -> wxe_util:send_bin(V#wx_mem.bin), - wxe_util:call(5110, <>). + wxe_util:call(5130, <>). %% @spec (Face::enum(),Pname::enum()) -> {float()} %% @doc See external documentation. getMaterialfv(Face,Pname) -> - wxe_util:call(5111, <>). + wxe_util:call(5131, <>). %% @spec (Face::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getMaterialiv(Face,Pname) -> - wxe_util:call(5112, <>). + wxe_util:call(5132, <>). %% @spec (Map::enum(),Values::wx:wx_mem()) -> ok %% @doc See external documentation. getPixelMapfv(Map,Values) -> wxe_util:send_bin(Values#wx_mem.bin), - wxe_util:call(5113, <>). + wxe_util:call(5133, <>). %% @spec (Map::enum(),Values::wx:wx_mem()) -> ok %% @doc See external documentation. getPixelMapuiv(Map,Values) -> wxe_util:send_bin(Values#wx_mem.bin), - wxe_util:call(5114, <>). + wxe_util:call(5134, <>). %% @spec (Map::enum(),Values::wx:wx_mem()) -> ok %% @doc See external documentation. getPixelMapusv(Map,Values) -> wxe_util:send_bin(Values#wx_mem.bin), - wxe_util:call(5115, <>). + wxe_util:call(5135, <>). %% @spec () -> binary() %% @doc See external documentation. getPolygonStipple() -> - wxe_util:call(5116, <<>>). + wxe_util:call(5136, <<>>). %% @spec (Name::enum()) -> string() %% @doc See external documentation. getString(Name) -> - wxe_util:call(5117, <>). + wxe_util:call(5137, <>). %% @spec (Target::enum(),Pname::enum()) -> {float()} %% @doc See external documentation. getTexEnvfv(Target,Pname) -> - wxe_util:call(5118, <>). + wxe_util:call(5138, <>). %% @spec (Target::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getTexEnviv(Target,Pname) -> - wxe_util:call(5119, <>). + wxe_util:call(5139, <>). %% @spec (Coord::enum(),Pname::enum()) -> {float()} %% @doc See external documentation. getTexGendv(Coord,Pname) -> - wxe_util:call(5120, <>). + wxe_util:call(5140, <>). %% @spec (Coord::enum(),Pname::enum()) -> {float()} %% @doc See external documentation. getTexGenfv(Coord,Pname) -> - wxe_util:call(5121, <>). + wxe_util:call(5141, <>). %% @spec (Coord::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getTexGeniv(Coord,Pname) -> - wxe_util:call(5122, <>). + wxe_util:call(5142, <>). %% @spec (Target::enum(),Level::integer(),Format::enum(),Type::enum(),Pixels::wx:wx_mem()) -> ok %% @doc See external documentation. getTexImage(Target,Level,Format,Type,Pixels) -> wxe_util:send_bin(Pixels#wx_mem.bin), - wxe_util:call(5123, <>). + wxe_util:call(5143, <>). %% @spec (Target::enum(),Level::integer(),Pname::enum()) -> {float()} %% @doc See external documentation. getTexLevelParameterfv(Target,Level,Pname) -> - wxe_util:call(5124, <>). + wxe_util:call(5144, <>). %% @spec (Target::enum(),Level::integer(),Pname::enum()) -> {integer()} %% @doc See external documentation. getTexLevelParameteriv(Target,Level,Pname) -> - wxe_util:call(5125, <>). + wxe_util:call(5145, <>). %% @spec (Target::enum(),Pname::enum()) -> {float()} %% @doc See external documentation. getTexParameterfv(Target,Pname) -> - wxe_util:call(5126, <>). + wxe_util:call(5146, <>). %% @spec (Target::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getTexParameteriv(Target,Pname) -> - wxe_util:call(5127, <>). + wxe_util:call(5147, <>). %% @spec (Target::enum(),Mode::enum()) -> ok %% @doc See external documentation. hint(Target,Mode) -> - wxe_util:cast(5128, <>). + wxe_util:cast(5148, <>). %% @spec (Mask::integer()) -> ok %% @doc See external documentation. indexMask(Mask) -> - wxe_util:cast(5129, <>). + wxe_util:cast(5149, <>). %% @spec (Type::enum(),Stride::integer(),Pointer::offset()|binary()) -> ok %% @doc See external documentation. indexPointer(Type,Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5130, <>); + wxe_util:cast(5150, <>); indexPointer(Type,Stride,Pointer) -> wxe_util:send_bin(Pointer), - wxe_util:cast(5131, <>). + wxe_util:cast(5151, <>). %% @spec (C::float()) -> ok %% @doc See external documentation. indexd(C) -> - wxe_util:cast(5132, <>). + wxe_util:cast(5152, <>). %% @spec ({C}) -> ok %% @equiv indexd(C) @@ -885,7 +890,7 @@ %% @spec (C::float()) -> ok %% @doc See external documentation. indexf(C) -> - wxe_util:cast(5133, <>). + wxe_util:cast(5153, <>). %% @spec ({C}) -> ok %% @equiv indexf(C) @@ -894,7 +899,7 @@ %% @spec (C::integer()) -> ok %% @doc See external documentation. indexi(C) -> - wxe_util:cast(5134, <>). + wxe_util:cast(5154, <>). %% @spec ({C}) -> ok %% @equiv indexi(C) @@ -903,7 +908,7 @@ %% @spec (C::integer()) -> ok %% @doc See external documentation. indexs(C) -> - wxe_util:cast(5135, <>). + wxe_util:cast(5155, <>). %% @spec ({C}) -> ok %% @equiv indexs(C) @@ -912,7 +917,7 @@ %% @spec (C::integer()) -> ok %% @doc See external documentation. indexub(C) -> - wxe_util:cast(5136, <>). + wxe_util:cast(5156, <>). %% @spec ({C}) -> ok %% @equiv indexub(C) @@ -921,205 +926,213 @@ %% @spec () -> ok %% @doc See external documentation. initNames() -> - wxe_util:cast(5137, <<>>). + wxe_util:cast(5157, <<>>). %% @spec (Format::enum(),Stride::integer(),Pointer::offset()|binary()) -> ok %% @doc See external documentation. interleavedArrays(Format,Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5138, <>); + wxe_util:cast(5158, <>); interleavedArrays(Format,Stride,Pointer) -> wxe_util:send_bin(Pointer), - wxe_util:cast(5139, <>). + wxe_util:cast(5159, <>). %% @spec (Cap::enum()) -> 0|1 %% @doc See external documentation. isEnabled(Cap) -> - wxe_util:call(5140, <>). + wxe_util:call(5160, <>). %% @spec (List::integer()) -> 0|1 %% @doc See external documentation. isList(List) -> - wxe_util:call(5141, <>). + wxe_util:call(5161, <>). %% @spec (Texture::integer()) -> 0|1 %% @doc See external documentation. isTexture(Texture) -> - wxe_util:call(5142, <>). + wxe_util:call(5162, <>). %% @spec (Pname::enum(),Param::float()) -> ok %% @doc See external documentation. lightModelf(Pname,Param) -> - wxe_util:cast(5143, <>). + wxe_util:cast(5163, <>). %% @spec (Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. lightModelfv(Pname,Params) -> - wxe_util:cast(5144, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((0+size(Params)) rem 2)*32)>>). %% @spec (Pname::enum(),Param::integer()) -> ok %% @doc See external documentation. lightModeli(Pname,Param) -> - wxe_util:cast(5145, <>). + wxe_util:cast(5165, <>). %% @spec (Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. lightModeliv(Pname,Params) -> - wxe_util:cast(5146, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((0+size(Params)) rem 2)*32)>>). %% @spec (Light::enum(),Pname::enum(),Param::float()) -> ok %% @doc See external documentation. lightf(Light,Pname,Param) -> - wxe_util:cast(5147, <>). + wxe_util:cast(5167, <>). %% @spec (Light::enum(),Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. lightfv(Light,Pname,Params) -> - wxe_util:cast(5148, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Light::enum(),Pname::enum(),Param::integer()) -> ok %% @doc See external documentation. lighti(Light,Pname,Param) -> - wxe_util:cast(5149, <>). + wxe_util:cast(5169, <>). %% @spec (Light::enum(),Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. lightiv(Light,Pname,Params) -> - wxe_util:cast(5150, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Factor::integer(),Pattern::integer()) -> ok %% @doc See external documentation. lineStipple(Factor,Pattern) -> - wxe_util:cast(5151, <>). + wxe_util:cast(5171, <>). %% @spec (Width::float()) -> ok %% @doc See external documentation. lineWidth(Width) -> - wxe_util:cast(5152, <>). + wxe_util:cast(5172, <>). %% @spec (Base::integer()) -> ok %% @doc See external documentation. listBase(Base) -> - wxe_util:cast(5153, <>). + wxe_util:cast(5173, <>). %% @spec () -> ok %% @doc See external documentation. loadIdentity() -> - wxe_util:cast(5154, <<>>). + wxe_util:cast(5174, <<>>). %% @spec (M::{float()}) -> ok %% @doc See external documentation. loadMatrixd({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> - wxe_util:cast(5155, <>). + wxe_util:cast(5175, <>); +loadMatrixd({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5175, <>). %% @spec (M::{float()}) -> ok %% @doc See external documentation. loadMatrixf({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> - wxe_util:cast(5156, <>). + wxe_util:cast(5176, <>); +loadMatrixf({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5176, <>). %% @spec (Name::integer()) -> ok %% @doc See external documentation. loadName(Name) -> - wxe_util:cast(5157, <>). + wxe_util:cast(5177, <>). %% @spec (Opcode::enum()) -> ok %% @doc See external documentation. logicOp(Opcode) -> - wxe_util:cast(5158, <>). + wxe_util:cast(5178, <>). %% @spec (Target::enum(),U1::float(),U2::float(),Stride::integer(),Order::integer(),Points::binary()) -> ok %% @doc See external documentation. map1d(Target,U1,U2,Stride,Order,Points) -> wxe_util:send_bin(Points), - wxe_util:cast(5159, <>). + wxe_util:cast(5179, <>). %% @spec (Target::enum(),U1::float(),U2::float(),Stride::integer(),Order::integer(),Points::binary()) -> ok %% @doc See external documentation. map1f(Target,U1,U2,Stride,Order,Points) -> wxe_util:send_bin(Points), - wxe_util:cast(5160, <>). + wxe_util:cast(5180, <>). %% @spec (Target::enum(),U1::float(),U2::float(),Ustride::integer(),Uorder::integer(),V1::float(),V2::float(),Vstride::integer(),Vorder::integer(),Points::binary()) -> ok %% @doc See external documentation. map2d(Target,U1,U2,Ustride,Uorder,V1,V2,Vstride,Vorder,Points) -> wxe_util:send_bin(Points), - wxe_util:cast(5161, <>). + wxe_util:cast(5181, <>). %% @spec (Target::enum(),U1::float(),U2::float(),Ustride::integer(),Uorder::integer(),V1::float(),V2::float(),Vstride::integer(),Vorder::integer(),Points::binary()) -> ok %% @doc See external documentation. map2f(Target,U1,U2,Ustride,Uorder,V1,V2,Vstride,Vorder,Points) -> wxe_util:send_bin(Points), - wxe_util:cast(5162, <>). + wxe_util:cast(5182, <>). %% @spec (Un::integer(),U1::float(),U2::float()) -> ok %% @doc See external documentation. mapGrid1d(Un,U1,U2) -> - wxe_util:cast(5163, <>). + wxe_util:cast(5183, <>). %% @spec (Un::integer(),U1::float(),U2::float()) -> ok %% @doc See external documentation. mapGrid1f(Un,U1,U2) -> - wxe_util:cast(5164, <>). + wxe_util:cast(5184, <>). %% @spec (Un::integer(),U1::float(),U2::float(),Vn::integer(),V1::float(),V2::float()) -> ok %% @doc See external documentation. mapGrid2d(Un,U1,U2,Vn,V1,V2) -> - wxe_util:cast(5165, <>). + wxe_util:cast(5185, <>). %% @spec (Un::integer(),U1::float(),U2::float(),Vn::integer(),V1::float(),V2::float()) -> ok %% @doc See external documentation. mapGrid2f(Un,U1,U2,Vn,V1,V2) -> - wxe_util:cast(5166, <>). + wxe_util:cast(5186, <>). %% @spec (Face::enum(),Pname::enum(),Param::float()) -> ok %% @doc See external documentation. materialf(Face,Pname,Param) -> - wxe_util:cast(5167, <>). + wxe_util:cast(5187, <>). %% @spec (Face::enum(),Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. materialfv(Face,Pname,Params) -> - wxe_util:cast(5168, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Face::enum(),Pname::enum(),Param::integer()) -> ok %% @doc See external documentation. materiali(Face,Pname,Param) -> - wxe_util:cast(5169, <>). + wxe_util:cast(5189, <>). %% @spec (Face::enum(),Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. materialiv(Face,Pname,Params) -> - wxe_util:cast(5170, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Mode::enum()) -> ok %% @doc See external documentation. matrixMode(Mode) -> - wxe_util:cast(5171, <>). + wxe_util:cast(5191, <>). %% @spec (M::{float()}) -> ok %% @doc See external documentation. multMatrixd({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> - wxe_util:cast(5172, <>). + wxe_util:cast(5192, <>); +multMatrixd({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5192, <>). %% @spec (M::{float()}) -> ok %% @doc See external documentation. multMatrixf({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> - wxe_util:cast(5173, <>). + wxe_util:cast(5193, <>); +multMatrixf({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5193, <>). %% @spec (List::integer(),Mode::enum()) -> ok %% @doc See external documentation. newList(List,Mode) -> - wxe_util:cast(5174, <>). + wxe_util:cast(5194, <>). %% @spec (Nx::integer(),Ny::integer(),Nz::integer()) -> ok %% @doc See external documentation. normal3b(Nx,Ny,Nz) -> - wxe_util:cast(5175, <>). + wxe_util:cast(5195, <>). %% @spec ({Nx,Ny,Nz}) -> ok %% @equiv normal3b(Nx,Ny,Nz) @@ -1128,7 +1141,7 @@ %% @spec (Nx::float(),Ny::float(),Nz::float()) -> ok %% @doc See external documentation. normal3d(Nx,Ny,Nz) -> - wxe_util:cast(5176, <>). + wxe_util:cast(5196, <>). %% @spec ({Nx,Ny,Nz}) -> ok %% @equiv normal3d(Nx,Ny,Nz) @@ -1137,7 +1150,7 @@ %% @spec (Nx::float(),Ny::float(),Nz::float()) -> ok %% @doc See external documentation. normal3f(Nx,Ny,Nz) -> - wxe_util:cast(5177, <>). + wxe_util:cast(5197, <>). %% @spec ({Nx,Ny,Nz}) -> ok %% @equiv normal3f(Nx,Ny,Nz) @@ -1146,7 +1159,7 @@ %% @spec (Nx::integer(),Ny::integer(),Nz::integer()) -> ok %% @doc See external documentation. normal3i(Nx,Ny,Nz) -> - wxe_util:cast(5178, <>). + wxe_util:cast(5198, <>). %% @spec ({Nx,Ny,Nz}) -> ok %% @equiv normal3i(Nx,Ny,Nz) @@ -1155,7 +1168,7 @@ %% @spec (Nx::integer(),Ny::integer(),Nz::integer()) -> ok %% @doc See external documentation. normal3s(Nx,Ny,Nz) -> - wxe_util:cast(5179, <>). + wxe_util:cast(5199, <>). %% @spec ({Nx,Ny,Nz}) -> ok %% @equiv normal3s(Nx,Ny,Nz) @@ -1164,136 +1177,136 @@ %% @spec (Type::enum(),Stride::integer(),Pointer::offset()|binary()) -> ok %% @doc See external documentation. normalPointer(Type,Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5180, <>); + wxe_util:cast(5200, <>); normalPointer(Type,Stride,Pointer) -> wxe_util:send_bin(Pointer), - wxe_util:cast(5181, <>). + wxe_util:cast(5201, <>). %% @spec (Left::float(),Right::float(),Bottom::float(),Top::float(),ZNear::float(),ZFar::float()) -> ok %% @doc See external documentation. ortho(Left,Right,Bottom,Top,ZNear,ZFar) -> - wxe_util:cast(5182, <>). + wxe_util:cast(5202, <>). %% @spec (Token::float()) -> ok %% @doc See external documentation. passThrough(Token) -> - wxe_util:cast(5183, <>). + wxe_util:cast(5203, <>). %% @spec (Map::enum(),Mapsize::integer(),Values::binary()) -> ok %% @doc See external documentation. pixelMapfv(Map,Mapsize,Values) -> wxe_util:send_bin(Values), - wxe_util:cast(5184, <>). + wxe_util:cast(5204, <>). %% @spec (Map::enum(),Mapsize::integer(),Values::binary()) -> ok %% @doc See external documentation. pixelMapuiv(Map,Mapsize,Values) -> wxe_util:send_bin(Values), - wxe_util:cast(5185, <>). + wxe_util:cast(5205, <>). %% @spec (Map::enum(),Mapsize::integer(),Values::binary()) -> ok %% @doc See external documentation. pixelMapusv(Map,Mapsize,Values) -> wxe_util:send_bin(Values), - wxe_util:cast(5186, <>). + wxe_util:cast(5206, <>). %% @spec (Pname::enum(),Param::float()) -> ok %% @doc See external documentation. pixelStoref(Pname,Param) -> - wxe_util:cast(5187, <>). + wxe_util:cast(5207, <>). %% @spec (Pname::enum(),Param::integer()) -> ok %% @doc See external documentation. pixelStorei(Pname,Param) -> - wxe_util:cast(5188, <>). + wxe_util:cast(5208, <>). %% @spec (Pname::enum(),Param::float()) -> ok %% @doc See external documentation. pixelTransferf(Pname,Param) -> - wxe_util:cast(5189, <>). + wxe_util:cast(5209, <>). %% @spec (Pname::enum(),Param::integer()) -> ok %% @doc See external documentation. pixelTransferi(Pname,Param) -> - wxe_util:cast(5190, <>). + wxe_util:cast(5210, <>). %% @spec (Xfactor::float(),Yfactor::float()) -> ok %% @doc See external documentation. pixelZoom(Xfactor,Yfactor) -> - wxe_util:cast(5191, <>). + wxe_util:cast(5211, <>). %% @spec (Size::float()) -> ok %% @doc See external documentation. pointSize(Size) -> - wxe_util:cast(5192, <>). + wxe_util:cast(5212, <>). %% @spec (Face::enum(),Mode::enum()) -> ok %% @doc See external documentation. polygonMode(Face,Mode) -> - wxe_util:cast(5193, <>). + wxe_util:cast(5213, <>). %% @spec (Factor::float(),Units::float()) -> ok %% @doc See external documentation. polygonOffset(Factor,Units) -> - wxe_util:cast(5194, <>). + wxe_util:cast(5214, <>). %% @spec (Mask::binary()) -> ok %% @doc See external documentation. polygonStipple(Mask) -> wxe_util:send_bin(Mask), - wxe_util:cast(5195, <<>>). + wxe_util:cast(5215, <<>>). %% @spec () -> ok %% @doc See external documentation. popAttrib() -> - wxe_util:cast(5196, <<>>). + wxe_util:cast(5216, <<>>). %% @spec () -> ok %% @doc See external documentation. popClientAttrib() -> - wxe_util:cast(5197, <<>>). + wxe_util:cast(5217, <<>>). %% @spec () -> ok %% @doc See external documentation. popMatrix() -> - wxe_util:cast(5198, <<>>). + wxe_util:cast(5218, <<>>). %% @spec () -> ok %% @doc See external documentation. popName() -> - wxe_util:cast(5199, <<>>). + wxe_util:cast(5219, <<>>). %% @spec (Textures::[integer()],Priorities::[clamp()]) -> ok %% @doc See external documentation. prioritizeTextures(Textures,Priorities) -> - wxe_util:cast(5200, <<(length(Textures)):?GLuint, + wxe_util:cast(5220, <<(length(Textures)):?GLuint, (<< <> || C <- Textures>>)/binary,0:(((1+length(Textures)) rem 2)*32),(length(Priorities)):?GLuint, (<< <> || C <- Priorities>>)/binary,0:(((1+length(Priorities)) rem 2)*32)>>). %% @spec (Mask::integer()) -> ok %% @doc See external documentation. pushAttrib(Mask) -> - wxe_util:cast(5201, <>). + wxe_util:cast(5221, <>). %% @spec (Mask::integer()) -> ok %% @doc See external documentation. pushClientAttrib(Mask) -> - wxe_util:cast(5202, <>). + wxe_util:cast(5222, <>). %% @spec () -> ok %% @doc See external documentation. pushMatrix() -> - wxe_util:cast(5203, <<>>). + wxe_util:cast(5223, <<>>). %% @spec (Name::integer()) -> ok %% @doc See external documentation. pushName(Name) -> - wxe_util:cast(5204, <>). + wxe_util:cast(5224, <>). %% @spec (X::float(),Y::float()) -> ok %% @doc See external documentation. rasterPos2d(X,Y) -> - wxe_util:cast(5205, <>). + wxe_util:cast(5225, <>). %% @spec ({X,Y}) -> ok %% @equiv rasterPos2d(X,Y) @@ -1302,7 +1315,7 @@ %% @spec (X::float(),Y::float()) -> ok %% @doc See external documentation. rasterPos2f(X,Y) -> - wxe_util:cast(5206, <>). + wxe_util:cast(5226, <>). %% @spec ({X,Y}) -> ok %% @equiv rasterPos2f(X,Y) @@ -1311,7 +1324,7 @@ %% @spec (X::integer(),Y::integer()) -> ok %% @doc See external documentation. rasterPos2i(X,Y) -> - wxe_util:cast(5207, <>). + wxe_util:cast(5227, <>). %% @spec ({X,Y}) -> ok %% @equiv rasterPos2i(X,Y) @@ -1320,7 +1333,7 @@ %% @spec (X::integer(),Y::integer()) -> ok %% @doc See external documentation. rasterPos2s(X,Y) -> - wxe_util:cast(5208, <>). + wxe_util:cast(5228, <>). %% @spec ({X,Y}) -> ok %% @equiv rasterPos2s(X,Y) @@ -1329,7 +1342,7 @@ %% @spec (X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. rasterPos3d(X,Y,Z) -> - wxe_util:cast(5209, <>). + wxe_util:cast(5229, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv rasterPos3d(X,Y,Z) @@ -1338,7 +1351,7 @@ %% @spec (X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. rasterPos3f(X,Y,Z) -> - wxe_util:cast(5210, <>). + wxe_util:cast(5230, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv rasterPos3f(X,Y,Z) @@ -1347,7 +1360,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer()) -> ok %% @doc See external documentation. rasterPos3i(X,Y,Z) -> - wxe_util:cast(5211, <>). + wxe_util:cast(5231, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv rasterPos3i(X,Y,Z) @@ -1356,7 +1369,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer()) -> ok %% @doc See external documentation. rasterPos3s(X,Y,Z) -> - wxe_util:cast(5212, <>). + wxe_util:cast(5232, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv rasterPos3s(X,Y,Z) @@ -1365,7 +1378,7 @@ %% @spec (X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. rasterPos4d(X,Y,Z,W) -> - wxe_util:cast(5213, <>). + wxe_util:cast(5233, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv rasterPos4d(X,Y,Z,W) @@ -1374,7 +1387,7 @@ %% @spec (X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. rasterPos4f(X,Y,Z,W) -> - wxe_util:cast(5214, <>). + wxe_util:cast(5234, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv rasterPos4f(X,Y,Z,W) @@ -1383,7 +1396,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok %% @doc See external documentation. rasterPos4i(X,Y,Z,W) -> - wxe_util:cast(5215, <>). + wxe_util:cast(5235, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv rasterPos4i(X,Y,Z,W) @@ -1392,7 +1405,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok %% @doc See external documentation. rasterPos4s(X,Y,Z,W) -> - wxe_util:cast(5216, <>). + wxe_util:cast(5236, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv rasterPos4s(X,Y,Z,W) @@ -1401,114 +1414,114 @@ %% @spec (Mode::enum()) -> ok %% @doc See external documentation. readBuffer(Mode) -> - wxe_util:cast(5217, <>). + wxe_util:cast(5237, <>). %% @spec (X::integer(),Y::integer(),Width::integer(),Height::integer(),Format::enum(),Type::enum(),Pixels::wx:wx_mem()) -> ok %% @doc See external documentation. readPixels(X,Y,Width,Height,Format,Type,Pixels) -> wxe_util:send_bin(Pixels#wx_mem.bin), - wxe_util:call(5218, <>). + wxe_util:call(5238, <>). %% @spec (X1::float(),Y1::float(),X2::float(),Y2::float()) -> ok %% @doc See external documentation. rectd(X1,Y1,X2,Y2) -> - wxe_util:cast(5219, <>). + wxe_util:cast(5239, <>). %% @spec (V1::{float()},V2::{float()}) -> ok %% @doc See external documentation. rectdv({V1,V2},{V1,V2}) -> - wxe_util:cast(5220, <>). + wxe_util:cast(5240, <>). %% @spec (X1::float(),Y1::float(),X2::float(),Y2::float()) -> ok %% @doc See external documentation. rectf(X1,Y1,X2,Y2) -> - wxe_util:cast(5221, <>). + wxe_util:cast(5241, <>). %% @spec (V1::{float()},V2::{float()}) -> ok %% @doc See external documentation. rectfv({V1,V2},{V1,V2}) -> - wxe_util:cast(5222, <>). + wxe_util:cast(5242, <>). %% @spec (X1::integer(),Y1::integer(),X2::integer(),Y2::integer()) -> ok %% @doc See external documentation. recti(X1,Y1,X2,Y2) -> - wxe_util:cast(5223, <>). + wxe_util:cast(5243, <>). %% @spec (V1::{integer()},V2::{integer()}) -> ok %% @doc See external documentation. rectiv({V1,V2},{V1,V2}) -> - wxe_util:cast(5224, <>). + wxe_util:cast(5244, <>). %% @spec (X1::integer(),Y1::integer(),X2::integer(),Y2::integer()) -> ok %% @doc See external documentation. rects(X1,Y1,X2,Y2) -> - wxe_util:cast(5225, <>). + wxe_util:cast(5245, <>). %% @spec (V1::{integer()},V2::{integer()}) -> ok %% @doc See external documentation. rectsv({V1,V2},{V1,V2}) -> - wxe_util:cast(5226, <>). + wxe_util:cast(5246, <>). %% @spec (Mode::enum()) -> integer() %% @doc See external documentation. renderMode(Mode) -> - wxe_util:call(5227, <>). + wxe_util:call(5247, <>). %% @spec (Angle::float(),X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. rotated(Angle,X,Y,Z) -> - wxe_util:cast(5228, <>). + wxe_util:cast(5248, <>). %% @spec (Angle::float(),X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. rotatef(Angle,X,Y,Z) -> - wxe_util:cast(5229, <>). + wxe_util:cast(5249, <>). %% @spec (X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. scaled(X,Y,Z) -> - wxe_util:cast(5230, <>). + wxe_util:cast(5250, <>). %% @spec (X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. scalef(X,Y,Z) -> - wxe_util:cast(5231, <>). + wxe_util:cast(5251, <>). %% @spec (X::integer(),Y::integer(),Width::integer(),Height::integer()) -> ok %% @doc See external documentation. scissor(X,Y,Width,Height) -> - wxe_util:cast(5232, <>). + wxe_util:cast(5252, <>). %% @spec (Size::integer(),Buffer::wx:wx_mem()) -> ok %% @doc See external documentation. selectBuffer(Size,Buffer) -> wxe_util:send_bin(Buffer#wx_mem.bin), - wxe_util:call(5233, <>). + wxe_util:call(5253, <>). %% @spec (Mode::enum()) -> ok %% @doc See external documentation. shadeModel(Mode) -> - wxe_util:cast(5234, <>). + wxe_util:cast(5254, <>). %% @spec (Func::enum(),Ref::integer(),Mask::integer()) -> ok %% @doc See external documentation. stencilFunc(Func,Ref,Mask) -> - wxe_util:cast(5235, <>). + wxe_util:cast(5255, <>). %% @spec (Mask::integer()) -> ok %% @doc See external documentation. stencilMask(Mask) -> - wxe_util:cast(5236, <>). + wxe_util:cast(5256, <>). %% @spec (Fail::enum(),Zfail::enum(),Zpass::enum()) -> ok %% @doc See external documentation. stencilOp(Fail,Zfail,Zpass) -> - wxe_util:cast(5237, <>). + wxe_util:cast(5257, <>). %% @spec (S::float()) -> ok %% @doc See external documentation. texCoord1d(S) -> - wxe_util:cast(5238, <>). + wxe_util:cast(5258, <>). %% @spec ({S}) -> ok %% @equiv texCoord1d(S) @@ -1517,7 +1530,7 @@ %% @spec (S::float()) -> ok %% @doc See external documentation. texCoord1f(S) -> - wxe_util:cast(5239, <>). + wxe_util:cast(5259, <>). %% @spec ({S}) -> ok %% @equiv texCoord1f(S) @@ -1526,7 +1539,7 @@ %% @spec (S::integer()) -> ok %% @doc See external documentation. texCoord1i(S) -> - wxe_util:cast(5240, <>). + wxe_util:cast(5260, <>). %% @spec ({S}) -> ok %% @equiv texCoord1i(S) @@ -1535,7 +1548,7 @@ %% @spec (S::integer()) -> ok %% @doc See external documentation. texCoord1s(S) -> - wxe_util:cast(5241, <>). + wxe_util:cast(5261, <>). %% @spec ({S}) -> ok %% @equiv texCoord1s(S) @@ -1544,7 +1557,7 @@ %% @spec (S::float(),T::float()) -> ok %% @doc See external documentation. texCoord2d(S,T) -> - wxe_util:cast(5242, <>). + wxe_util:cast(5262, <>). %% @spec ({S,T}) -> ok %% @equiv texCoord2d(S,T) @@ -1553,7 +1566,7 @@ %% @spec (S::float(),T::float()) -> ok %% @doc See external documentation. texCoord2f(S,T) -> - wxe_util:cast(5243, <>). + wxe_util:cast(5263, <>). %% @spec ({S,T}) -> ok %% @equiv texCoord2f(S,T) @@ -1562,7 +1575,7 @@ %% @spec (S::integer(),T::integer()) -> ok %% @doc See external documentation. texCoord2i(S,T) -> - wxe_util:cast(5244, <>). + wxe_util:cast(5264, <>). %% @spec ({S,T}) -> ok %% @equiv texCoord2i(S,T) @@ -1571,7 +1584,7 @@ %% @spec (S::integer(),T::integer()) -> ok %% @doc See external documentation. texCoord2s(S,T) -> - wxe_util:cast(5245, <>). + wxe_util:cast(5265, <>). %% @spec ({S,T}) -> ok %% @equiv texCoord2s(S,T) @@ -1580,7 +1593,7 @@ %% @spec (S::float(),T::float(),R::float()) -> ok %% @doc See external documentation. texCoord3d(S,T,R) -> - wxe_util:cast(5246, <>). + wxe_util:cast(5266, <>). %% @spec ({S,T,R}) -> ok %% @equiv texCoord3d(S,T,R) @@ -1589,7 +1602,7 @@ %% @spec (S::float(),T::float(),R::float()) -> ok %% @doc See external documentation. texCoord3f(S,T,R) -> - wxe_util:cast(5247, <>). + wxe_util:cast(5267, <>). %% @spec ({S,T,R}) -> ok %% @equiv texCoord3f(S,T,R) @@ -1598,7 +1611,7 @@ %% @spec (S::integer(),T::integer(),R::integer()) -> ok %% @doc See external documentation. texCoord3i(S,T,R) -> - wxe_util:cast(5248, <>). + wxe_util:cast(5268, <>). %% @spec ({S,T,R}) -> ok %% @equiv texCoord3i(S,T,R) @@ -1607,7 +1620,7 @@ %% @spec (S::integer(),T::integer(),R::integer()) -> ok %% @doc See external documentation. texCoord3s(S,T,R) -> - wxe_util:cast(5249, <>). + wxe_util:cast(5269, <>). %% @spec ({S,T,R}) -> ok %% @equiv texCoord3s(S,T,R) @@ -1616,7 +1629,7 @@ %% @spec (S::float(),T::float(),R::float(),Q::float()) -> ok %% @doc See external documentation. texCoord4d(S,T,R,Q) -> - wxe_util:cast(5250, <>). + wxe_util:cast(5270, <>). %% @spec ({S,T,R,Q}) -> ok %% @equiv texCoord4d(S,T,R,Q) @@ -1625,7 +1638,7 @@ %% @spec (S::float(),T::float(),R::float(),Q::float()) -> ok %% @doc See external documentation. texCoord4f(S,T,R,Q) -> - wxe_util:cast(5251, <>). + wxe_util:cast(5271, <>). %% @spec ({S,T,R,Q}) -> ok %% @equiv texCoord4f(S,T,R,Q) @@ -1634,7 +1647,7 @@ %% @spec (S::integer(),T::integer(),R::integer(),Q::integer()) -> ok %% @doc See external documentation. texCoord4i(S,T,R,Q) -> - wxe_util:cast(5252, <>). + wxe_util:cast(5272, <>). %% @spec ({S,T,R,Q}) -> ok %% @equiv texCoord4i(S,T,R,Q) @@ -1643,7 +1656,7 @@ %% @spec (S::integer(),T::integer(),R::integer(),Q::integer()) -> ok %% @doc See external documentation. texCoord4s(S,T,R,Q) -> - wxe_util:cast(5253, <>). + wxe_util:cast(5273, <>). %% @spec ({S,T,R,Q}) -> ok %% @equiv texCoord4s(S,T,R,Q) @@ -1652,134 +1665,134 @@ %% @spec (Size::integer(),Type::enum(),Stride::integer(),Pointer::offset()|binary()) -> ok %% @doc See external documentation. texCoordPointer(Size,Type,Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5254, <>); + wxe_util:cast(5274, <>); texCoordPointer(Size,Type,Stride,Pointer) -> wxe_util:send_bin(Pointer), - wxe_util:cast(5255, <>). + wxe_util:cast(5275, <>). %% @spec (Target::enum(),Pname::enum(),Param::float()) -> ok %% @doc See external documentation. texEnvf(Target,Pname,Param) -> - wxe_util:cast(5256, <>). + wxe_util:cast(5276, <>). %% @spec (Target::enum(),Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. texEnvfv(Target,Pname,Params) -> - wxe_util:cast(5257, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Target::enum(),Pname::enum(),Param::integer()) -> ok %% @doc See external documentation. texEnvi(Target,Pname,Param) -> - wxe_util:cast(5258, <>). + wxe_util:cast(5278, <>). %% @spec (Target::enum(),Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. texEnviv(Target,Pname,Params) -> - wxe_util:cast(5259, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Coord::enum(),Pname::enum(),Param::float()) -> ok %% @doc See external documentation. texGend(Coord,Pname,Param) -> - wxe_util:cast(5260, <>). + wxe_util:cast(5280, <>). %% @spec (Coord::enum(),Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. texGendv(Coord,Pname,Params) -> - wxe_util:cast(5261, <> ||C <- tuple_to_list(Params)>>)/binary>>). %% @spec (Coord::enum(),Pname::enum(),Param::float()) -> ok %% @doc See external documentation. texGenf(Coord,Pname,Param) -> - wxe_util:cast(5262, <>). + wxe_util:cast(5282, <>). %% @spec (Coord::enum(),Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. texGenfv(Coord,Pname,Params) -> - wxe_util:cast(5263, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Coord::enum(),Pname::enum(),Param::integer()) -> ok %% @doc See external documentation. texGeni(Coord,Pname,Param) -> - wxe_util:cast(5264, <>). + wxe_util:cast(5284, <>). %% @spec (Coord::enum(),Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. texGeniv(Coord,Pname,Params) -> - wxe_util:cast(5265, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Target::enum(),Level::integer(),Internalformat::integer(),Width::integer(),Border::integer(),Format::enum(),Type::enum(),Pixels::offset()|binary()) -> ok %% @doc See external documentation. texImage1D(Target,Level,Internalformat,Width,Border,Format,Type,Pixels) when is_integer(Pixels) -> - wxe_util:cast(5266, <>); + wxe_util:cast(5286, <>); texImage1D(Target,Level,Internalformat,Width,Border,Format,Type,Pixels) -> wxe_util:send_bin(Pixels), - wxe_util:cast(5267, <>). + wxe_util:cast(5287, <>). %% @spec (Target::enum(),Level::integer(),Internalformat::integer(),Width::integer(),Height::integer(),Border::integer(),Format::enum(),Type::enum(),Pixels::offset()|binary()) -> ok %% @doc See external documentation. texImage2D(Target,Level,Internalformat,Width,Height,Border,Format,Type,Pixels) when is_integer(Pixels) -> - wxe_util:cast(5268, <>); + wxe_util:cast(5288, <>); texImage2D(Target,Level,Internalformat,Width,Height,Border,Format,Type,Pixels) -> wxe_util:send_bin(Pixels), - wxe_util:cast(5269, <>). + wxe_util:cast(5289, <>). %% @spec (Target::enum(),Pname::enum(),Param::float()) -> ok %% @doc See external documentation. texParameterf(Target,Pname,Param) -> - wxe_util:cast(5270, <>). + wxe_util:cast(5290, <>). %% @spec (Target::enum(),Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. texParameterfv(Target,Pname,Params) -> - wxe_util:cast(5271, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Target::enum(),Pname::enum(),Param::integer()) -> ok %% @doc See external documentation. texParameteri(Target,Pname,Param) -> - wxe_util:cast(5272, <>). + wxe_util:cast(5292, <>). %% @spec (Target::enum(),Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. texParameteriv(Target,Pname,Params) -> - wxe_util:cast(5273, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Width::integer(),Format::enum(),Type::enum(),Pixels::offset()|binary()) -> ok %% @doc See external documentation. texSubImage1D(Target,Level,Xoffset,Width,Format,Type,Pixels) when is_integer(Pixels) -> - wxe_util:cast(5274, <>); + wxe_util:cast(5294, <>); texSubImage1D(Target,Level,Xoffset,Width,Format,Type,Pixels) -> wxe_util:send_bin(Pixels), - wxe_util:cast(5275, <>). + wxe_util:cast(5295, <>). %% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Yoffset::integer(),Width::integer(),Height::integer(),Format::enum(),Type::enum(),Pixels::offset()|binary()) -> ok %% @doc See external documentation. texSubImage2D(Target,Level,Xoffset,Yoffset,Width,Height,Format,Type,Pixels) when is_integer(Pixels) -> - wxe_util:cast(5276, <>); + wxe_util:cast(5296, <>); texSubImage2D(Target,Level,Xoffset,Yoffset,Width,Height,Format,Type,Pixels) -> wxe_util:send_bin(Pixels), - wxe_util:cast(5277, <>). + wxe_util:cast(5297, <>). %% @spec (X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. translated(X,Y,Z) -> - wxe_util:cast(5278, <>). + wxe_util:cast(5298, <>). %% @spec (X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. translatef(X,Y,Z) -> - wxe_util:cast(5279, <>). + wxe_util:cast(5299, <>). %% @spec (X::float(),Y::float()) -> ok %% @doc See external documentation. vertex2d(X,Y) -> - wxe_util:cast(5280, <>). + wxe_util:cast(5300, <>). %% @spec ({X,Y}) -> ok %% @equiv vertex2d(X,Y) @@ -1788,7 +1801,7 @@ %% @spec (X::float(),Y::float()) -> ok %% @doc See external documentation. vertex2f(X,Y) -> - wxe_util:cast(5281, <>). + wxe_util:cast(5301, <>). %% @spec ({X,Y}) -> ok %% @equiv vertex2f(X,Y) @@ -1797,7 +1810,7 @@ %% @spec (X::integer(),Y::integer()) -> ok %% @doc See external documentation. vertex2i(X,Y) -> - wxe_util:cast(5282, <>). + wxe_util:cast(5302, <>). %% @spec ({X,Y}) -> ok %% @equiv vertex2i(X,Y) @@ -1806,7 +1819,7 @@ %% @spec (X::integer(),Y::integer()) -> ok %% @doc See external documentation. vertex2s(X,Y) -> - wxe_util:cast(5283, <>). + wxe_util:cast(5303, <>). %% @spec ({X,Y}) -> ok %% @equiv vertex2s(X,Y) @@ -1815,7 +1828,7 @@ %% @spec (X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. vertex3d(X,Y,Z) -> - wxe_util:cast(5284, <>). + wxe_util:cast(5304, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv vertex3d(X,Y,Z) @@ -1824,7 +1837,7 @@ %% @spec (X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. vertex3f(X,Y,Z) -> - wxe_util:cast(5285, <>). + wxe_util:cast(5305, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv vertex3f(X,Y,Z) @@ -1833,7 +1846,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer()) -> ok %% @doc See external documentation. vertex3i(X,Y,Z) -> - wxe_util:cast(5286, <>). + wxe_util:cast(5306, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv vertex3i(X,Y,Z) @@ -1842,7 +1855,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer()) -> ok %% @doc See external documentation. vertex3s(X,Y,Z) -> - wxe_util:cast(5287, <>). + wxe_util:cast(5307, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv vertex3s(X,Y,Z) @@ -1851,7 +1864,7 @@ %% @spec (X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. vertex4d(X,Y,Z,W) -> - wxe_util:cast(5288, <>). + wxe_util:cast(5308, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv vertex4d(X,Y,Z,W) @@ -1860,7 +1873,7 @@ %% @spec (X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. vertex4f(X,Y,Z,W) -> - wxe_util:cast(5289, <>). + wxe_util:cast(5309, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv vertex4f(X,Y,Z,W) @@ -1869,7 +1882,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok %% @doc See external documentation. vertex4i(X,Y,Z,W) -> - wxe_util:cast(5290, <>). + wxe_util:cast(5310, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv vertex4i(X,Y,Z,W) @@ -1878,7 +1891,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok %% @doc See external documentation. vertex4s(X,Y,Z,W) -> - wxe_util:cast(5291, <>). + wxe_util:cast(5311, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv vertex4s(X,Y,Z,W) @@ -1887,106 +1900,127 @@ %% @spec (Size::integer(),Type::enum(),Stride::integer(),Pointer::offset()|binary()) -> ok %% @doc See external documentation. vertexPointer(Size,Type,Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5292, <>); + wxe_util:cast(5312, <>); vertexPointer(Size,Type,Stride,Pointer) -> wxe_util:send_bin(Pointer), - wxe_util:cast(5293, <>). + wxe_util:cast(5313, <>). %% @spec (X::integer(),Y::integer(),Width::integer(),Height::integer()) -> ok %% @doc See external documentation. viewport(X,Y,Width,Height) -> - wxe_util:cast(5294, <>). + wxe_util:cast(5314, <>). %% @spec (Red::clamp(),Green::clamp(),Blue::clamp(),Alpha::clamp()) -> ok %% @doc See external documentation. blendColor(Red,Green,Blue,Alpha) -> - wxe_util:cast(5295, <>). + wxe_util:cast(5315, <>). %% @spec (Mode::enum()) -> ok %% @doc See external documentation. blendEquation(Mode) -> - wxe_util:cast(5296, <>). + wxe_util:cast(5316, <>). %% @spec (Mode::enum(),Start::integer(),End::integer(),Count::integer(),Type::enum(),Indices::offset()|binary()) -> ok %% @doc See external documentation. drawRangeElements(Mode,Start,End,Count,Type,Indices) when is_integer(Indices) -> - wxe_util:cast(5297, <>); + wxe_util:cast(5317, <>); drawRangeElements(Mode,Start,End,Count,Type,Indices) -> wxe_util:send_bin(Indices), - wxe_util:cast(5298, <>). + wxe_util:cast(5318, <>). + +%% @spec (Target::enum(),Level::integer(),Internalformat::integer(),Width::integer(),Height::integer(),Depth::integer(),Border::integer(),Format::enum(),Type::enum(),Pixels::offset()|binary()) -> ok +%% @doc See external documentation. +texImage3D(Target,Level,Internalformat,Width,Height,Depth,Border,Format,Type,Pixels) when is_integer(Pixels) -> + wxe_util:cast(5319, <>); +texImage3D(Target,Level,Internalformat,Width,Height,Depth,Border,Format,Type,Pixels) -> + wxe_util:send_bin(Pixels), + wxe_util:cast(5320, <>). + +%% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Yoffset::integer(),Zoffset::integer(),Width::integer(),Height::integer(),Depth::integer(),Format::enum(),Type::enum(),Pixels::offset()|binary()) -> ok +%% @doc See external documentation. +texSubImage3D(Target,Level,Xoffset,Yoffset,Zoffset,Width,Height,Depth,Format,Type,Pixels) when is_integer(Pixels) -> + wxe_util:cast(5321, <>); +texSubImage3D(Target,Level,Xoffset,Yoffset,Zoffset,Width,Height,Depth,Format,Type,Pixels) -> + wxe_util:send_bin(Pixels), + wxe_util:cast(5322, <>). + +%% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Yoffset::integer(),Zoffset::integer(),X::integer(),Y::integer(),Width::integer(),Height::integer()) -> ok +%% @doc See external documentation. +copyTexSubImage3D(Target,Level,Xoffset,Yoffset,Zoffset,X,Y,Width,Height) -> + wxe_util:cast(5323, <>). %% @spec (Target::enum(),Internalformat::enum(),Width::integer(),Format::enum(),Type::enum(),Table::offset()|binary()) -> ok %% @doc See external documentation. colorTable(Target,Internalformat,Width,Format,Type,Table) when is_integer(Table) -> - wxe_util:cast(5299, <>); + wxe_util:cast(5324, <>); colorTable(Target,Internalformat,Width,Format,Type,Table) -> wxe_util:send_bin(Table), - wxe_util:cast(5300, <>). + wxe_util:cast(5325, <>). %% @spec (Target::enum(),Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. colorTableParameterfv(Target,Pname,{P1,P2,P3,P4}) -> - wxe_util:cast(5301, <>). + wxe_util:cast(5326, <>). %% @spec (Target::enum(),Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. colorTableParameteriv(Target,Pname,{P1,P2,P3,P4}) -> - wxe_util:cast(5302, <>). + wxe_util:cast(5327, <>). %% @spec (Target::enum(),Internalformat::enum(),X::integer(),Y::integer(),Width::integer()) -> ok %% @doc See external documentation. copyColorTable(Target,Internalformat,X,Y,Width) -> - wxe_util:cast(5303, <>). + wxe_util:cast(5328, <>). %% @spec (Target::enum(),Format::enum(),Type::enum(),Table::wx:wx_mem()) -> ok %% @doc See external documentation. getColorTable(Target,Format,Type,Table) -> wxe_util:send_bin(Table#wx_mem.bin), - wxe_util:call(5304, <>). + wxe_util:call(5329, <>). %% @spec (Target::enum(),Pname::enum()) -> {float()} %% @doc See external documentation. getColorTableParameterfv(Target,Pname) -> - wxe_util:call(5305, <>). + wxe_util:call(5330, <>). %% @spec (Target::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getColorTableParameteriv(Target,Pname) -> - wxe_util:call(5306, <>). + wxe_util:call(5331, <>). %% @spec (Target::enum(),Start::integer(),Count::integer(),Format::enum(),Type::enum(),Data::offset()|binary()) -> ok %% @doc See external documentation. colorSubTable(Target,Start,Count,Format,Type,Data) when is_integer(Data) -> - wxe_util:cast(5307, <>); + wxe_util:cast(5332, <>); colorSubTable(Target,Start,Count,Format,Type,Data) -> wxe_util:send_bin(Data), - wxe_util:cast(5308, <>). + wxe_util:cast(5333, <>). %% @spec (Target::enum(),Start::integer(),X::integer(),Y::integer(),Width::integer()) -> ok %% @doc See external documentation. copyColorSubTable(Target,Start,X,Y,Width) -> - wxe_util:cast(5309, <>). + wxe_util:cast(5334, <>). %% @spec (Target::enum(),Internalformat::enum(),Width::integer(),Format::enum(),Type::enum(),Image::offset()|binary()) -> ok %% @doc See external documentation. convolutionFilter1D(Target,Internalformat,Width,Format,Type,Image) when is_integer(Image) -> - wxe_util:cast(5310, <>); + wxe_util:cast(5335, <>); convolutionFilter1D(Target,Internalformat,Width,Format,Type,Image) -> wxe_util:send_bin(Image), - wxe_util:cast(5311, <>). + wxe_util:cast(5336, <>). %% @spec (Target::enum(),Internalformat::enum(),Width::integer(),Height::integer(),Format::enum(),Type::enum(),Image::offset()|binary()) -> ok %% @doc See external documentation. convolutionFilter2D(Target,Internalformat,Width,Height,Format,Type,Image) when is_integer(Image) -> - wxe_util:cast(5312, <>); + wxe_util:cast(5337, <>); convolutionFilter2D(Target,Internalformat,Width,Height,Format,Type,Image) -> wxe_util:send_bin(Image), - wxe_util:cast(5313, <>). + wxe_util:cast(5338, <>). %% @spec (Target::enum(),Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. convolutionParameterf(Target,Pname,Params) -> - wxe_util:cast(5314, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Target,Pname,{Params}) -> ok @@ -1996,7 +2030,7 @@ %% @spec (Target::enum(),Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. convolutionParameteri(Target,Pname,Params) -> - wxe_util:cast(5315, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Target,Pname,{Params}) -> ok @@ -2006,125 +2040,163 @@ %% @spec (Target::enum(),Internalformat::enum(),X::integer(),Y::integer(),Width::integer()) -> ok %% @doc See external documentation. copyConvolutionFilter1D(Target,Internalformat,X,Y,Width) -> - wxe_util:cast(5316, <>). + wxe_util:cast(5341, <>). %% @spec (Target::enum(),Internalformat::enum(),X::integer(),Y::integer(),Width::integer(),Height::integer()) -> ok %% @doc See external documentation. copyConvolutionFilter2D(Target,Internalformat,X,Y,Width,Height) -> - wxe_util:cast(5317, <>). + wxe_util:cast(5342, <>). %% @spec (Target::enum(),Format::enum(),Type::enum(),Image::wx:wx_mem()) -> ok %% @doc See external documentation. getConvolutionFilter(Target,Format,Type,Image) -> wxe_util:send_bin(Image#wx_mem.bin), - wxe_util:call(5318, <>). + wxe_util:call(5343, <>). %% @spec (Target::enum(),Pname::enum()) -> {float()} %% @doc See external documentation. getConvolutionParameterfv(Target,Pname) -> - wxe_util:call(5319, <>). + wxe_util:call(5344, <>). %% @spec (Target::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getConvolutionParameteriv(Target,Pname) -> - wxe_util:call(5320, <>). + wxe_util:call(5345, <>). %% @spec (Target::enum(),Internalformat::enum(),Width::integer(),Height::integer(),Format::enum(),Type::enum(),Row::offset()|binary(),Column::offset()|binary()) -> ok %% @doc See external documentation. separableFilter2D(Target,Internalformat,Width,Height,Format,Type,Row,Column) when is_integer(Row), is_integer(Column) -> - wxe_util:cast(5321, <>); + wxe_util:cast(5346, <>); separableFilter2D(Target,Internalformat,Width,Height,Format,Type,Row,Column) -> wxe_util:send_bin(Row), wxe_util:send_bin(Column), - wxe_util:cast(5322, <>). + wxe_util:cast(5347, <>). %% @spec (Target::enum(),Reset::0|1,Format::enum(),Type::enum(),Values::wx:wx_mem()) -> ok %% @doc See external documentation. getHistogram(Target,Reset,Format,Type,Values) -> wxe_util:send_bin(Values#wx_mem.bin), - wxe_util:call(5323, <>). + wxe_util:call(5348, <>). %% @spec (Target::enum(),Pname::enum()) -> {float()} %% @doc See external documentation. getHistogramParameterfv(Target,Pname) -> - wxe_util:call(5324, <>). + wxe_util:call(5349, <>). %% @spec (Target::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getHistogramParameteriv(Target,Pname) -> - wxe_util:call(5325, <>). + wxe_util:call(5350, <>). %% @spec (Target::enum(),Reset::0|1,Format::enum(),Type::enum(),Values::wx:wx_mem()) -> ok %% @doc See external documentation. getMinmax(Target,Reset,Format,Type,Values) -> wxe_util:send_bin(Values#wx_mem.bin), - wxe_util:call(5326, <>). + wxe_util:call(5351, <>). %% @spec (Target::enum(),Pname::enum()) -> {float()} %% @doc See external documentation. getMinmaxParameterfv(Target,Pname) -> - wxe_util:call(5327, <>). + wxe_util:call(5352, <>). %% @spec (Target::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getMinmaxParameteriv(Target,Pname) -> - wxe_util:call(5328, <>). + wxe_util:call(5353, <>). %% @spec (Target::enum(),Width::integer(),Internalformat::enum(),Sink::0|1) -> ok %% @doc See external documentation. histogram(Target,Width,Internalformat,Sink) -> - wxe_util:cast(5329, <>). + wxe_util:cast(5354, <>). %% @spec (Target::enum(),Internalformat::enum(),Sink::0|1) -> ok %% @doc See external documentation. minmax(Target,Internalformat,Sink) -> - wxe_util:cast(5330, <>). + wxe_util:cast(5355, <>). %% @spec (Target::enum()) -> ok %% @doc See external documentation. resetHistogram(Target) -> - wxe_util:cast(5331, <>). + wxe_util:cast(5356, <>). %% @spec (Target::enum()) -> ok %% @doc See external documentation. resetMinmax(Target) -> - wxe_util:cast(5332, <>). - -%% @spec (Target::enum(),Level::integer(),Internalformat::integer(),Width::integer(),Height::integer(),Depth::integer(),Border::integer(),Format::enum(),Type::enum(),Pixels::offset()|binary()) -> ok -%% @doc See external documentation. -texImage3D(Target,Level,Internalformat,Width,Height,Depth,Border,Format,Type,Pixels) when is_integer(Pixels) -> - wxe_util:cast(5333, <>); -texImage3D(Target,Level,Internalformat,Width,Height,Depth,Border,Format,Type,Pixels) -> - wxe_util:send_bin(Pixels), - wxe_util:cast(5334, <>). - -%% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Yoffset::integer(),Zoffset::integer(),Width::integer(),Height::integer(),Depth::integer(),Format::enum(),Type::enum(),Pixels::offset()|binary()) -> ok -%% @doc See external documentation. -texSubImage3D(Target,Level,Xoffset,Yoffset,Zoffset,Width,Height,Depth,Format,Type,Pixels) when is_integer(Pixels) -> - wxe_util:cast(5335, <>); -texSubImage3D(Target,Level,Xoffset,Yoffset,Zoffset,Width,Height,Depth,Format,Type,Pixels) -> - wxe_util:send_bin(Pixels), - wxe_util:cast(5336, <>). - -%% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Yoffset::integer(),Zoffset::integer(),X::integer(),Y::integer(),Width::integer(),Height::integer()) -> ok -%% @doc See external documentation. -copyTexSubImage3D(Target,Level,Xoffset,Yoffset,Zoffset,X,Y,Width,Height) -> - wxe_util:cast(5337, <>). + wxe_util:cast(5357, <>). %% @spec (Texture::enum()) -> ok %% @doc See external documentation. activeTexture(Texture) -> - wxe_util:cast(5338, <>). + wxe_util:cast(5358, <>). + +%% @spec (Value::clamp(),Invert::0|1) -> ok +%% @doc See external documentation. +sampleCoverage(Value,Invert) -> + wxe_util:cast(5359, <>). + +%% @spec (Target::enum(),Level::integer(),Internalformat::enum(),Width::integer(),Height::integer(),Depth::integer(),Border::integer(),ImageSize::integer(),Data::offset()|binary()) -> ok +%% @doc See external documentation. +compressedTexImage3D(Target,Level,Internalformat,Width,Height,Depth,Border,ImageSize,Data) when is_integer(Data) -> + wxe_util:cast(5360, <>); +compressedTexImage3D(Target,Level,Internalformat,Width,Height,Depth,Border,ImageSize,Data) -> + wxe_util:send_bin(Data), + wxe_util:cast(5361, <>). + +%% @spec (Target::enum(),Level::integer(),Internalformat::enum(),Width::integer(),Height::integer(),Border::integer(),ImageSize::integer(),Data::offset()|binary()) -> ok +%% @doc See external documentation. +compressedTexImage2D(Target,Level,Internalformat,Width,Height,Border,ImageSize,Data) when is_integer(Data) -> + wxe_util:cast(5362, <>); +compressedTexImage2D(Target,Level,Internalformat,Width,Height,Border,ImageSize,Data) -> + wxe_util:send_bin(Data), + wxe_util:cast(5363, <>). + +%% @spec (Target::enum(),Level::integer(),Internalformat::enum(),Width::integer(),Border::integer(),ImageSize::integer(),Data::offset()|binary()) -> ok +%% @doc See external documentation. +compressedTexImage1D(Target,Level,Internalformat,Width,Border,ImageSize,Data) when is_integer(Data) -> + wxe_util:cast(5364, <>); +compressedTexImage1D(Target,Level,Internalformat,Width,Border,ImageSize,Data) -> + wxe_util:send_bin(Data), + wxe_util:cast(5365, <>). + +%% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Yoffset::integer(),Zoffset::integer(),Width::integer(),Height::integer(),Depth::integer(),Format::enum(),ImageSize::integer(),Data::offset()|binary()) -> ok +%% @doc See external documentation. +compressedTexSubImage3D(Target,Level,Xoffset,Yoffset,Zoffset,Width,Height,Depth,Format,ImageSize,Data) when is_integer(Data) -> + wxe_util:cast(5366, <>); +compressedTexSubImage3D(Target,Level,Xoffset,Yoffset,Zoffset,Width,Height,Depth,Format,ImageSize,Data) -> + wxe_util:send_bin(Data), + wxe_util:cast(5367, <>). + +%% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Yoffset::integer(),Width::integer(),Height::integer(),Format::enum(),ImageSize::integer(),Data::offset()|binary()) -> ok +%% @doc See external documentation. +compressedTexSubImage2D(Target,Level,Xoffset,Yoffset,Width,Height,Format,ImageSize,Data) when is_integer(Data) -> + wxe_util:cast(5368, <>); +compressedTexSubImage2D(Target,Level,Xoffset,Yoffset,Width,Height,Format,ImageSize,Data) -> + wxe_util:send_bin(Data), + wxe_util:cast(5369, <>). + +%% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Width::integer(),Format::enum(),ImageSize::integer(),Data::offset()|binary()) -> ok +%% @doc See external documentation. +compressedTexSubImage1D(Target,Level,Xoffset,Width,Format,ImageSize,Data) when is_integer(Data) -> + wxe_util:cast(5370, <>); +compressedTexSubImage1D(Target,Level,Xoffset,Width,Format,ImageSize,Data) -> + wxe_util:send_bin(Data), + wxe_util:cast(5371, <>). + +%% @spec (Target::enum(),Level::integer(),Img::wx:wx_mem()) -> ok +%% @doc See external documentation. +getCompressedTexImage(Target,Level,Img) -> + wxe_util:send_bin(Img#wx_mem.bin), + wxe_util:call(5372, <>). %% @spec (Texture::enum()) -> ok %% @doc See external documentation. clientActiveTexture(Texture) -> - wxe_util:cast(5339, <>). + wxe_util:cast(5373, <>). %% @spec (Target::enum(),S::float()) -> ok %% @doc See external documentation. multiTexCoord1d(Target,S) -> - wxe_util:cast(5340, <>). + wxe_util:cast(5374, <>). %% @spec (Target,{S}) -> ok %% @equiv multiTexCoord1d(Target,S) @@ -2133,7 +2205,7 @@ %% @spec (Target::enum(),S::float()) -> ok %% @doc See external documentation. multiTexCoord1f(Target,S) -> - wxe_util:cast(5341, <>). + wxe_util:cast(5375, <>). %% @spec (Target,{S}) -> ok %% @equiv multiTexCoord1f(Target,S) @@ -2142,7 +2214,7 @@ %% @spec (Target::enum(),S::integer()) -> ok %% @doc See external documentation. multiTexCoord1i(Target,S) -> - wxe_util:cast(5342, <>). + wxe_util:cast(5376, <>). %% @spec (Target,{S}) -> ok %% @equiv multiTexCoord1i(Target,S) @@ -2151,7 +2223,7 @@ %% @spec (Target::enum(),S::integer()) -> ok %% @doc See external documentation. multiTexCoord1s(Target,S) -> - wxe_util:cast(5343, <>). + wxe_util:cast(5377, <>). %% @spec (Target,{S}) -> ok %% @equiv multiTexCoord1s(Target,S) @@ -2160,7 +2232,7 @@ %% @spec (Target::enum(),S::float(),T::float()) -> ok %% @doc See external documentation. multiTexCoord2d(Target,S,T) -> - wxe_util:cast(5344, <>). + wxe_util:cast(5378, <>). %% @spec (Target,{S,T}) -> ok %% @equiv multiTexCoord2d(Target,S,T) @@ -2169,7 +2241,7 @@ %% @spec (Target::enum(),S::float(),T::float()) -> ok %% @doc See external documentation. multiTexCoord2f(Target,S,T) -> - wxe_util:cast(5345, <>). + wxe_util:cast(5379, <>). %% @spec (Target,{S,T}) -> ok %% @equiv multiTexCoord2f(Target,S,T) @@ -2178,7 +2250,7 @@ %% @spec (Target::enum(),S::integer(),T::integer()) -> ok %% @doc See external documentation. multiTexCoord2i(Target,S,T) -> - wxe_util:cast(5346, <>). + wxe_util:cast(5380, <>). %% @spec (Target,{S,T}) -> ok %% @equiv multiTexCoord2i(Target,S,T) @@ -2187,7 +2259,7 @@ %% @spec (Target::enum(),S::integer(),T::integer()) -> ok %% @doc See external documentation. multiTexCoord2s(Target,S,T) -> - wxe_util:cast(5347, <>). + wxe_util:cast(5381, <>). %% @spec (Target,{S,T}) -> ok %% @equiv multiTexCoord2s(Target,S,T) @@ -2196,7 +2268,7 @@ %% @spec (Target::enum(),S::float(),T::float(),R::float()) -> ok %% @doc See external documentation. multiTexCoord3d(Target,S,T,R) -> - wxe_util:cast(5348, <>). + wxe_util:cast(5382, <>). %% @spec (Target,{S,T,R}) -> ok %% @equiv multiTexCoord3d(Target,S,T,R) @@ -2205,7 +2277,7 @@ %% @spec (Target::enum(),S::float(),T::float(),R::float()) -> ok %% @doc See external documentation. multiTexCoord3f(Target,S,T,R) -> - wxe_util:cast(5349, <>). + wxe_util:cast(5383, <>). %% @spec (Target,{S,T,R}) -> ok %% @equiv multiTexCoord3f(Target,S,T,R) @@ -2214,7 +2286,7 @@ %% @spec (Target::enum(),S::integer(),T::integer(),R::integer()) -> ok %% @doc See external documentation. multiTexCoord3i(Target,S,T,R) -> - wxe_util:cast(5350, <>). + wxe_util:cast(5384, <>). %% @spec (Target,{S,T,R}) -> ok %% @equiv multiTexCoord3i(Target,S,T,R) @@ -2223,7 +2295,7 @@ %% @spec (Target::enum(),S::integer(),T::integer(),R::integer()) -> ok %% @doc See external documentation. multiTexCoord3s(Target,S,T,R) -> - wxe_util:cast(5351, <>). + wxe_util:cast(5385, <>). %% @spec (Target,{S,T,R}) -> ok %% @equiv multiTexCoord3s(Target,S,T,R) @@ -2232,7 +2304,7 @@ %% @spec (Target::enum(),S::float(),T::float(),R::float(),Q::float()) -> ok %% @doc See external documentation. multiTexCoord4d(Target,S,T,R,Q) -> - wxe_util:cast(5352, <>). + wxe_util:cast(5386, <>). %% @spec (Target,{S,T,R,Q}) -> ok %% @equiv multiTexCoord4d(Target,S,T,R,Q) @@ -2241,7 +2313,7 @@ %% @spec (Target::enum(),S::float(),T::float(),R::float(),Q::float()) -> ok %% @doc See external documentation. multiTexCoord4f(Target,S,T,R,Q) -> - wxe_util:cast(5353, <>). + wxe_util:cast(5387, <>). %% @spec (Target,{S,T,R,Q}) -> ok %% @equiv multiTexCoord4f(Target,S,T,R,Q) @@ -2250,7 +2322,7 @@ %% @spec (Target::enum(),S::integer(),T::integer(),R::integer(),Q::integer()) -> ok %% @doc See external documentation. multiTexCoord4i(Target,S,T,R,Q) -> - wxe_util:cast(5354, <>). + wxe_util:cast(5388, <>). %% @spec (Target,{S,T,R,Q}) -> ok %% @equiv multiTexCoord4i(Target,S,T,R,Q) @@ -2259,7 +2331,7 @@ %% @spec (Target::enum(),S::integer(),T::integer(),R::integer(),Q::integer()) -> ok %% @doc See external documentation. multiTexCoord4s(Target,S,T,R,Q) -> - wxe_util:cast(5355, <>). + wxe_util:cast(5389, <>). %% @spec (Target,{S,T,R,Q}) -> ok %% @equiv multiTexCoord4s(Target,S,T,R,Q) @@ -2268,146 +2340,95 @@ %% @spec (M::{float()}) -> ok %% @doc See external documentation. loadTransposeMatrixf({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> - wxe_util:cast(5356, <>). + wxe_util:cast(5390, <>); +loadTransposeMatrixf({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5390, <>). %% @spec (M::{float()}) -> ok %% @doc See external documentation. loadTransposeMatrixd({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> - wxe_util:cast(5357, <>). + wxe_util:cast(5391, <>); +loadTransposeMatrixd({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5391, <>). %% @spec (M::{float()}) -> ok %% @doc See external documentation. multTransposeMatrixf({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> - wxe_util:cast(5358, <>). + wxe_util:cast(5392, <>); +multTransposeMatrixf({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5392, <>). %% @spec (M::{float()}) -> ok %% @doc See external documentation. multTransposeMatrixd({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> - wxe_util:cast(5359, <>). - -%% @spec (Value::clamp(),Invert::0|1) -> ok -%% @doc See external documentation. -sampleCoverage(Value,Invert) -> - wxe_util:cast(5360, <>). - -%% @spec (Target::enum(),Level::integer(),Internalformat::enum(),Width::integer(),Height::integer(),Depth::integer(),Border::integer(),ImageSize::integer(),Data::offset()|binary()) -> ok -%% @doc See external documentation. -compressedTexImage3D(Target,Level,Internalformat,Width,Height,Depth,Border,ImageSize,Data) when is_integer(Data) -> - wxe_util:cast(5361, <>); -compressedTexImage3D(Target,Level,Internalformat,Width,Height,Depth,Border,ImageSize,Data) -> - wxe_util:send_bin(Data), - wxe_util:cast(5362, <>). - -%% @spec (Target::enum(),Level::integer(),Internalformat::enum(),Width::integer(),Height::integer(),Border::integer(),ImageSize::integer(),Data::offset()|binary()) -> ok -%% @doc See external documentation. -compressedTexImage2D(Target,Level,Internalformat,Width,Height,Border,ImageSize,Data) when is_integer(Data) -> - wxe_util:cast(5363, <>); -compressedTexImage2D(Target,Level,Internalformat,Width,Height,Border,ImageSize,Data) -> - wxe_util:send_bin(Data), - wxe_util:cast(5364, <>). - -%% @spec (Target::enum(),Level::integer(),Internalformat::enum(),Width::integer(),Border::integer(),ImageSize::integer(),Data::offset()|binary()) -> ok -%% @doc See external documentation. -compressedTexImage1D(Target,Level,Internalformat,Width,Border,ImageSize,Data) when is_integer(Data) -> - wxe_util:cast(5365, <>); -compressedTexImage1D(Target,Level,Internalformat,Width,Border,ImageSize,Data) -> - wxe_util:send_bin(Data), - wxe_util:cast(5366, <>). - -%% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Yoffset::integer(),Zoffset::integer(),Width::integer(),Height::integer(),Depth::integer(),Format::enum(),ImageSize::integer(),Data::offset()|binary()) -> ok -%% @doc See external documentation. -compressedTexSubImage3D(Target,Level,Xoffset,Yoffset,Zoffset,Width,Height,Depth,Format,ImageSize,Data) when is_integer(Data) -> - wxe_util:cast(5367, <>); -compressedTexSubImage3D(Target,Level,Xoffset,Yoffset,Zoffset,Width,Height,Depth,Format,ImageSize,Data) -> - wxe_util:send_bin(Data), - wxe_util:cast(5368, <>). - -%% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Yoffset::integer(),Width::integer(),Height::integer(),Format::enum(),ImageSize::integer(),Data::offset()|binary()) -> ok -%% @doc See external documentation. -compressedTexSubImage2D(Target,Level,Xoffset,Yoffset,Width,Height,Format,ImageSize,Data) when is_integer(Data) -> - wxe_util:cast(5369, <>); -compressedTexSubImage2D(Target,Level,Xoffset,Yoffset,Width,Height,Format,ImageSize,Data) -> - wxe_util:send_bin(Data), - wxe_util:cast(5370, <>). - -%% @spec (Target::enum(),Level::integer(),Xoffset::integer(),Width::integer(),Format::enum(),ImageSize::integer(),Data::offset()|binary()) -> ok -%% @doc See external documentation. -compressedTexSubImage1D(Target,Level,Xoffset,Width,Format,ImageSize,Data) when is_integer(Data) -> - wxe_util:cast(5371, <>); -compressedTexSubImage1D(Target,Level,Xoffset,Width,Format,ImageSize,Data) -> - wxe_util:send_bin(Data), - wxe_util:cast(5372, <>). - -%% @spec (Target::enum(),Level::integer(),Img::wx:wx_mem()) -> ok -%% @doc See external documentation. -getCompressedTexImage(Target,Level,Img) -> - wxe_util:send_bin(Img#wx_mem.bin), - wxe_util:call(5373, <>). + wxe_util:cast(5393, <>); +multTransposeMatrixd({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5393, <>). %% @spec (SfactorRGB::enum(),DfactorRGB::enum(),SfactorAlpha::enum(),DfactorAlpha::enum()) -> ok %% @doc See external documentation. blendFuncSeparate(SfactorRGB,DfactorRGB,SfactorAlpha,DfactorAlpha) -> - wxe_util:cast(5374, <>). - -%% @spec (Coord::float()) -> ok -%% @doc See external documentation. -fogCoordf(Coord) -> - wxe_util:cast(5375, <>). - -%% @spec ({Coord}) -> ok -%% @equiv fogCoordf(Coord) -fogCoordfv({Coord}) -> fogCoordf(Coord). - -%% @spec (Coord::float()) -> ok -%% @doc See external documentation. -fogCoordd(Coord) -> - wxe_util:cast(5376, <>). - -%% @spec ({Coord}) -> ok -%% @equiv fogCoordd(Coord) -fogCoorddv({Coord}) -> fogCoordd(Coord). - -%% @spec (Type::enum(),Stride::integer(),Pointer::offset()|binary()) -> ok -%% @doc See external documentation. -fogCoordPointer(Type,Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5377, <>); -fogCoordPointer(Type,Stride,Pointer) -> - wxe_util:send_bin(Pointer), - wxe_util:cast(5378, <>). + wxe_util:cast(5394, <>). %% @spec (Mode::enum(),First::[integer()],Count::[integer()]) -> ok %% @doc See external documentation. multiDrawArrays(Mode,First,Count) -> - wxe_util:cast(5379, <> || C <- First>>)/binary,0:(((length(First)) rem 2)*32),(length(Count)):?GLuint, (<< <> || C <- Count>>)/binary,0:(((1+length(Count)) rem 2)*32)>>). %% @spec (Pname::enum(),Param::float()) -> ok %% @doc See external documentation. pointParameterf(Pname,Param) -> - wxe_util:cast(5380, <>). + wxe_util:cast(5396, <>). %% @spec (Pname::enum(),Params::{float()}) -> ok %% @doc See external documentation. pointParameterfv(Pname,Params) -> - wxe_util:cast(5381, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((0+size(Params)) rem 2)*32)>>). %% @spec (Pname::enum(),Param::integer()) -> ok %% @doc See external documentation. pointParameteri(Pname,Param) -> - wxe_util:cast(5382, <>). + wxe_util:cast(5398, <>). %% @spec (Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. pointParameteriv(Pname,Params) -> - wxe_util:cast(5383, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((0+size(Params)) rem 2)*32)>>). +%% @spec (Coord::float()) -> ok +%% @doc See external documentation. +fogCoordf(Coord) -> + wxe_util:cast(5400, <>). + +%% @spec ({Coord}) -> ok +%% @equiv fogCoordf(Coord) +fogCoordfv({Coord}) -> fogCoordf(Coord). + +%% @spec (Coord::float()) -> ok +%% @doc See external documentation. +fogCoordd(Coord) -> + wxe_util:cast(5401, <>). + +%% @spec ({Coord}) -> ok +%% @equiv fogCoordd(Coord) +fogCoorddv({Coord}) -> fogCoordd(Coord). + +%% @spec (Type::enum(),Stride::integer(),Pointer::offset()|binary()) -> ok +%% @doc See external documentation. +fogCoordPointer(Type,Stride,Pointer) when is_integer(Pointer) -> + wxe_util:cast(5402, <>); +fogCoordPointer(Type,Stride,Pointer) -> + wxe_util:send_bin(Pointer), + wxe_util:cast(5403, <>). + %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. secondaryColor3b(Red,Green,Blue) -> - wxe_util:cast(5384, <>). + wxe_util:cast(5404, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv secondaryColor3b(Red,Green,Blue) @@ -2416,7 +2437,7 @@ %% @spec (Red::float(),Green::float(),Blue::float()) -> ok %% @doc See external documentation. secondaryColor3d(Red,Green,Blue) -> - wxe_util:cast(5385, <>). + wxe_util:cast(5405, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv secondaryColor3d(Red,Green,Blue) @@ -2425,7 +2446,7 @@ %% @spec (Red::float(),Green::float(),Blue::float()) -> ok %% @doc See external documentation. secondaryColor3f(Red,Green,Blue) -> - wxe_util:cast(5386, <>). + wxe_util:cast(5406, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv secondaryColor3f(Red,Green,Blue) @@ -2434,7 +2455,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. secondaryColor3i(Red,Green,Blue) -> - wxe_util:cast(5387, <>). + wxe_util:cast(5407, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv secondaryColor3i(Red,Green,Blue) @@ -2443,7 +2464,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. secondaryColor3s(Red,Green,Blue) -> - wxe_util:cast(5388, <>). + wxe_util:cast(5408, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv secondaryColor3s(Red,Green,Blue) @@ -2452,7 +2473,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. secondaryColor3ub(Red,Green,Blue) -> - wxe_util:cast(5389, <>). + wxe_util:cast(5409, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv secondaryColor3ub(Red,Green,Blue) @@ -2461,7 +2482,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. secondaryColor3ui(Red,Green,Blue) -> - wxe_util:cast(5390, <>). + wxe_util:cast(5410, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv secondaryColor3ui(Red,Green,Blue) @@ -2470,7 +2491,7 @@ %% @spec (Red::integer(),Green::integer(),Blue::integer()) -> ok %% @doc See external documentation. secondaryColor3us(Red,Green,Blue) -> - wxe_util:cast(5391, <>). + wxe_util:cast(5411, <>). %% @spec ({Red,Green,Blue}) -> ok %% @equiv secondaryColor3us(Red,Green,Blue) @@ -2479,15 +2500,15 @@ %% @spec (Size::integer(),Type::enum(),Stride::integer(),Pointer::offset()|binary()) -> ok %% @doc See external documentation. secondaryColorPointer(Size,Type,Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5392, <>); + wxe_util:cast(5412, <>); secondaryColorPointer(Size,Type,Stride,Pointer) -> wxe_util:send_bin(Pointer), - wxe_util:cast(5393, <>). + wxe_util:cast(5413, <>). %% @spec (X::float(),Y::float()) -> ok %% @doc See external documentation. windowPos2d(X,Y) -> - wxe_util:cast(5394, <>). + wxe_util:cast(5414, <>). %% @spec ({X,Y}) -> ok %% @equiv windowPos2d(X,Y) @@ -2496,7 +2517,7 @@ %% @spec (X::float(),Y::float()) -> ok %% @doc See external documentation. windowPos2f(X,Y) -> - wxe_util:cast(5395, <>). + wxe_util:cast(5415, <>). %% @spec ({X,Y}) -> ok %% @equiv windowPos2f(X,Y) @@ -2505,7 +2526,7 @@ %% @spec (X::integer(),Y::integer()) -> ok %% @doc See external documentation. windowPos2i(X,Y) -> - wxe_util:cast(5396, <>). + wxe_util:cast(5416, <>). %% @spec ({X,Y}) -> ok %% @equiv windowPos2i(X,Y) @@ -2514,7 +2535,7 @@ %% @spec (X::integer(),Y::integer()) -> ok %% @doc See external documentation. windowPos2s(X,Y) -> - wxe_util:cast(5397, <>). + wxe_util:cast(5417, <>). %% @spec ({X,Y}) -> ok %% @equiv windowPos2s(X,Y) @@ -2523,7 +2544,7 @@ %% @spec (X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. windowPos3d(X,Y,Z) -> - wxe_util:cast(5398, <>). + wxe_util:cast(5418, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv windowPos3d(X,Y,Z) @@ -2532,7 +2553,7 @@ %% @spec (X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. windowPos3f(X,Y,Z) -> - wxe_util:cast(5399, <>). + wxe_util:cast(5419, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv windowPos3f(X,Y,Z) @@ -2541,7 +2562,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer()) -> ok %% @doc See external documentation. windowPos3i(X,Y,Z) -> - wxe_util:cast(5400, <>). + wxe_util:cast(5420, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv windowPos3i(X,Y,Z) @@ -2550,7 +2571,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer()) -> ok %% @doc See external documentation. windowPos3s(X,Y,Z) -> - wxe_util:cast(5401, <>). + wxe_util:cast(5421, <>). %% @spec ({X,Y,Z}) -> ok %% @equiv windowPos3s(X,Y,Z) @@ -2559,384 +2580,384 @@ %% @spec (N::integer()) -> [integer()] %% @doc See external documentation. genQueries(N) -> - wxe_util:call(5402, <>). + wxe_util:call(5422, <>). %% @spec (Ids::[integer()]) -> ok %% @doc See external documentation. deleteQueries(Ids) -> - wxe_util:cast(5403, <<(length(Ids)):?GLuint, + wxe_util:cast(5423, <<(length(Ids)):?GLuint, (<< <> || C <- Ids>>)/binary,0:(((1+length(Ids)) rem 2)*32)>>). %% @spec (Id::integer()) -> 0|1 %% @doc See external documentation. isQuery(Id) -> - wxe_util:call(5404, <>). + wxe_util:call(5424, <>). %% @spec (Target::enum(),Id::integer()) -> ok %% @doc See external documentation. beginQuery(Target,Id) -> - wxe_util:cast(5405, <>). + wxe_util:cast(5425, <>). %% @spec (Target::enum()) -> ok %% @doc See external documentation. endQuery(Target) -> - wxe_util:cast(5406, <>). + wxe_util:cast(5426, <>). %% @spec (Target::enum(),Pname::enum()) -> integer() %% @doc See external documentation. getQueryiv(Target,Pname) -> - wxe_util:call(5407, <>). + wxe_util:call(5427, <>). %% @spec (Id::integer(),Pname::enum()) -> integer() %% @doc See external documentation. getQueryObjectiv(Id,Pname) -> - wxe_util:call(5408, <>). + wxe_util:call(5428, <>). %% @spec (Id::integer(),Pname::enum()) -> integer() %% @doc See external documentation. getQueryObjectuiv(Id,Pname) -> - wxe_util:call(5409, <>). + wxe_util:call(5429, <>). %% @spec (Target::enum(),Buffer::integer()) -> ok %% @doc See external documentation. bindBuffer(Target,Buffer) -> - wxe_util:cast(5410, <>). + wxe_util:cast(5430, <>). %% @spec (Buffers::[integer()]) -> ok %% @doc See external documentation. deleteBuffers(Buffers) -> - wxe_util:cast(5411, <<(length(Buffers)):?GLuint, + wxe_util:cast(5431, <<(length(Buffers)):?GLuint, (<< <> || C <- Buffers>>)/binary,0:(((1+length(Buffers)) rem 2)*32)>>). %% @spec (N::integer()) -> [integer()] %% @doc See external documentation. genBuffers(N) -> - wxe_util:call(5412, <>). + wxe_util:call(5432, <>). %% @spec (Buffer::integer()) -> 0|1 %% @doc See external documentation. isBuffer(Buffer) -> - wxe_util:call(5413, <>). + wxe_util:call(5433, <>). %% @spec (Target::enum(),Size::integer(),Data::offset()|binary(),Usage::enum()) -> ok %% @doc See external documentation. bufferData(Target,Size,Data,Usage) when is_integer(Data) -> - wxe_util:cast(5414, <>); + wxe_util:cast(5434, <>); bufferData(Target,Size,Data,Usage) -> wxe_util:send_bin(Data), - wxe_util:cast(5415, <>). + wxe_util:cast(5435, <>). %% @spec (Target::enum(),Offset::integer(),Size::integer(),Data::offset()|binary()) -> ok %% @doc See external documentation. bufferSubData(Target,Offset,Size,Data) when is_integer(Data) -> - wxe_util:cast(5416, <>); + wxe_util:cast(5436, <>); bufferSubData(Target,Offset,Size,Data) -> wxe_util:send_bin(Data), - wxe_util:cast(5417, <>). + wxe_util:cast(5437, <>). %% @spec (Target::enum(),Offset::integer(),Size::integer(),Data::wx:wx_mem()) -> ok %% @doc See external documentation. getBufferSubData(Target,Offset,Size,Data) -> wxe_util:send_bin(Data#wx_mem.bin), - wxe_util:call(5418, <>). + wxe_util:call(5438, <>). %% @spec (Target::enum(),Pname::enum()) -> integer() %% @doc See external documentation. getBufferParameteriv(Target,Pname) -> - wxe_util:call(5419, <>). + wxe_util:call(5439, <>). %% @spec (ModeRGB::enum(),ModeAlpha::enum()) -> ok %% @doc See external documentation. blendEquationSeparate(ModeRGB,ModeAlpha) -> - wxe_util:cast(5420, <>). + wxe_util:cast(5440, <>). %% @spec (Bufs::[enum()]) -> ok %% @doc See external documentation. drawBuffers(Bufs) -> - wxe_util:cast(5421, <<(length(Bufs)):?GLuint, + wxe_util:cast(5441, <<(length(Bufs)):?GLuint, (<< <> || C <- Bufs>>)/binary,0:(((1+length(Bufs)) rem 2)*32)>>). %% @spec (Face::enum(),Sfail::enum(),Dpfail::enum(),Dppass::enum()) -> ok %% @doc See external documentation. stencilOpSeparate(Face,Sfail,Dpfail,Dppass) -> - wxe_util:cast(5422, <>). + wxe_util:cast(5442, <>). %% @spec (Frontfunc::enum(),Backfunc::enum(),Ref::integer(),Mask::integer()) -> ok %% @doc See external documentation. stencilFuncSeparate(Frontfunc,Backfunc,Ref,Mask) -> - wxe_util:cast(5423, <>). + wxe_util:cast(5443, <>). %% @spec (Face::enum(),Mask::integer()) -> ok %% @doc See external documentation. stencilMaskSeparate(Face,Mask) -> - wxe_util:cast(5424, <>). + wxe_util:cast(5444, <>). %% @spec (Program::integer(),Shader::integer()) -> ok %% @doc See external documentation. attachShader(Program,Shader) -> - wxe_util:cast(5425, <>). + wxe_util:cast(5445, <>). %% @spec (Program::integer(),Index::integer(),Name::string()) -> ok %% @doc See external documentation. bindAttribLocation(Program,Index,Name) -> - wxe_util:cast(5426, <>). + wxe_util:cast(5446, <>). %% @spec (Shader::integer()) -> ok %% @doc See external documentation. compileShader(Shader) -> - wxe_util:cast(5427, <>). + wxe_util:cast(5447, <>). %% @spec () -> integer() %% @doc See external documentation. createProgram() -> - wxe_util:call(5428, <<>>). + wxe_util:call(5448, <<>>). %% @spec (Type::enum()) -> integer() %% @doc See external documentation. createShader(Type) -> - wxe_util:call(5429, <>). + wxe_util:call(5449, <>). %% @spec (Program::integer()) -> ok %% @doc See external documentation. deleteProgram(Program) -> - wxe_util:cast(5430, <>). + wxe_util:cast(5450, <>). %% @spec (Shader::integer()) -> ok %% @doc See external documentation. deleteShader(Shader) -> - wxe_util:cast(5431, <>). + wxe_util:cast(5451, <>). %% @spec (Program::integer(),Shader::integer()) -> ok %% @doc See external documentation. detachShader(Program,Shader) -> - wxe_util:cast(5432, <>). + wxe_util:cast(5452, <>). %% @spec (Index::integer()) -> ok %% @doc See external documentation. disableVertexAttribArray(Index) -> - wxe_util:cast(5433, <>). + wxe_util:cast(5453, <>). %% @spec (Index::integer()) -> ok %% @doc See external documentation. enableVertexAttribArray(Index) -> - wxe_util:cast(5434, <>). + wxe_util:cast(5454, <>). %% @spec (Program::integer(),Index::integer(),BufSize::integer()) -> {Size::integer(),Type::enum(),Name::string()} %% @doc See external documentation. getActiveAttrib(Program,Index,BufSize) -> - wxe_util:call(5435, <>). + wxe_util:call(5455, <>). %% @spec (Program::integer(),Index::integer(),BufSize::integer()) -> {Size::integer(),Type::enum(),Name::string()} %% @doc See external documentation. getActiveUniform(Program,Index,BufSize) -> - wxe_util:call(5436, <>). + wxe_util:call(5456, <>). %% @spec (Program::integer(),MaxCount::integer()) -> [integer()] %% @doc See external documentation. getAttachedShaders(Program,MaxCount) -> - wxe_util:call(5437, <>). + wxe_util:call(5457, <>). %% @spec (Program::integer(),Name::string()) -> integer() %% @doc See external documentation. getAttribLocation(Program,Name) -> - wxe_util:call(5438, <>). + wxe_util:call(5458, <>). %% @spec (Program::integer(),Pname::enum()) -> integer() %% @doc See external documentation. getProgramiv(Program,Pname) -> - wxe_util:call(5439, <>). + wxe_util:call(5459, <>). %% @spec (Program::integer(),BufSize::integer()) -> string() %% @doc See external documentation. getProgramInfoLog(Program,BufSize) -> - wxe_util:call(5440, <>). + wxe_util:call(5460, <>). %% @spec (Shader::integer(),Pname::enum()) -> integer() %% @doc See external documentation. getShaderiv(Shader,Pname) -> - wxe_util:call(5441, <>). + wxe_util:call(5461, <>). %% @spec (Shader::integer(),BufSize::integer()) -> string() %% @doc See external documentation. getShaderInfoLog(Shader,BufSize) -> - wxe_util:call(5442, <>). + wxe_util:call(5462, <>). %% @spec (Shader::integer(),BufSize::integer()) -> string() %% @doc See external documentation. getShaderSource(Shader,BufSize) -> - wxe_util:call(5443, <>). + wxe_util:call(5463, <>). %% @spec (Program::integer(),Name::string()) -> integer() %% @doc See external documentation. getUniformLocation(Program,Name) -> - wxe_util:call(5444, <>). + wxe_util:call(5464, <>). %% @spec (Program::integer(),Location::integer()) -> {float()} %% @doc See external documentation. getUniformfv(Program,Location) -> - wxe_util:call(5445, <>). + wxe_util:call(5465, <>). %% @spec (Program::integer(),Location::integer()) -> {integer()} %% @doc See external documentation. getUniformiv(Program,Location) -> - wxe_util:call(5446, <>). + wxe_util:call(5466, <>). %% @spec (Index::integer(),Pname::enum()) -> {float()} %% @doc See external documentation. getVertexAttribdv(Index,Pname) -> - wxe_util:call(5447, <>). + wxe_util:call(5467, <>). %% @spec (Index::integer(),Pname::enum()) -> {float()} %% @doc See external documentation. getVertexAttribfv(Index,Pname) -> - wxe_util:call(5448, <>). + wxe_util:call(5468, <>). %% @spec (Index::integer(),Pname::enum()) -> {integer()} %% @doc See external documentation. getVertexAttribiv(Index,Pname) -> - wxe_util:call(5449, <>). + wxe_util:call(5469, <>). %% @spec (Program::integer()) -> 0|1 %% @doc See external documentation. isProgram(Program) -> - wxe_util:call(5450, <>). + wxe_util:call(5470, <>). %% @spec (Shader::integer()) -> 0|1 %% @doc See external documentation. isShader(Shader) -> - wxe_util:call(5451, <>). + wxe_util:call(5471, <>). %% @spec (Program::integer()) -> ok %% @doc See external documentation. linkProgram(Program) -> - wxe_util:cast(5452, <>). + wxe_util:cast(5472, <>). %% @spec (Shader::integer(),String::[string()]) -> ok %% @doc See external documentation. shaderSource(Shader,String) -> StringTemp = list_to_binary([[Str|[0]] || Str <- String ]), - wxe_util:cast(5453, <>). + wxe_util:cast(5473, <>). %% @spec (Program::integer()) -> ok %% @doc See external documentation. useProgram(Program) -> - wxe_util:cast(5454, <>). + wxe_util:cast(5474, <>). %% @spec (Location::integer(),V0::float()) -> ok %% @doc See external documentation. uniform1f(Location,V0) -> - wxe_util:cast(5455, <>). + wxe_util:cast(5475, <>). %% @spec (Location::integer(),V0::float(),V1::float()) -> ok %% @doc See external documentation. uniform2f(Location,V0,V1) -> - wxe_util:cast(5456, <>). + wxe_util:cast(5476, <>). %% @spec (Location::integer(),V0::float(),V1::float(),V2::float()) -> ok %% @doc See external documentation. uniform3f(Location,V0,V1,V2) -> - wxe_util:cast(5457, <>). + wxe_util:cast(5477, <>). %% @spec (Location::integer(),V0::float(),V1::float(),V2::float(),V3::float()) -> ok %% @doc See external documentation. uniform4f(Location,V0,V1,V2,V3) -> - wxe_util:cast(5458, <>). + wxe_util:cast(5478, <>). %% @spec (Location::integer(),V0::integer()) -> ok %% @doc See external documentation. uniform1i(Location,V0) -> - wxe_util:cast(5459, <>). + wxe_util:cast(5479, <>). %% @spec (Location::integer(),V0::integer(),V1::integer()) -> ok %% @doc See external documentation. uniform2i(Location,V0,V1) -> - wxe_util:cast(5460, <>). + wxe_util:cast(5480, <>). %% @spec (Location::integer(),V0::integer(),V1::integer(),V2::integer()) -> ok %% @doc See external documentation. uniform3i(Location,V0,V1,V2) -> - wxe_util:cast(5461, <>). + wxe_util:cast(5481, <>). %% @spec (Location::integer(),V0::integer(),V1::integer(),V2::integer(),V3::integer()) -> ok %% @doc See external documentation. uniform4i(Location,V0,V1,V2,V3) -> - wxe_util:cast(5462, <>). + wxe_util:cast(5482, <>). %% @spec (Location::integer(),Value::[float()]) -> ok %% @doc See external documentation. uniform1fv(Location,Value) -> - wxe_util:cast(5463, <> || C <- Value>>)/binary,0:(((length(Value)) rem 2)*32)>>). %% @spec (Location::integer(),Value::[{float()}]) -> ok %% @doc See external documentation. uniform2fv(Location,Value) -> - wxe_util:cast(5464, <> || {V1,V2} <- Value>>)/binary>>). %% @spec (Location::integer(),Value::[{float()}]) -> ok %% @doc See external documentation. uniform3fv(Location,Value) -> - wxe_util:cast(5465, <> || {V1,V2,V3} <- Value>>)/binary>>). %% @spec (Location::integer(),Value::[{float()}]) -> ok %% @doc See external documentation. uniform4fv(Location,Value) -> - wxe_util:cast(5466, <> || {V1,V2,V3,V4} <- Value>>)/binary>>). %% @spec (Location::integer(),Value::[integer()]) -> ok %% @doc See external documentation. uniform1iv(Location,Value) -> - wxe_util:cast(5467, <> || C <- Value>>)/binary,0:(((length(Value)) rem 2)*32)>>). %% @spec (Location::integer(),Value::[{integer()}]) -> ok %% @doc See external documentation. uniform2iv(Location,Value) -> - wxe_util:cast(5468, <> || {V1,V2} <- Value>>)/binary>>). %% @spec (Location::integer(),Value::[{integer()}]) -> ok %% @doc See external documentation. uniform3iv(Location,Value) -> - wxe_util:cast(5469, <> || {V1,V2,V3} <- Value>>)/binary>>). %% @spec (Location::integer(),Value::[{integer()}]) -> ok %% @doc See external documentation. uniform4iv(Location,Value) -> - wxe_util:cast(5470, <> || {V1,V2,V3,V4} <- Value>>)/binary>>). %% @spec (Location::integer(),Transpose::0|1,Value::[{float()}]) -> ok %% @doc See external documentation. uniformMatrix2fv(Location,Transpose,Value) -> - wxe_util:cast(5471, <> || {V1,V2,V3,V4} <- Value>>)/binary>>). %% @spec (Location::integer(),Transpose::0|1,Value::[{float()}]) -> ok %% @doc See external documentation. uniformMatrix3fv(Location,Transpose,Value) -> - wxe_util:cast(5472, <> || {V1,V2,V3,V4,V5,V6,V7,V8,V9} <- Value>>)/binary>>). %% @spec (Location::integer(),Transpose::0|1,Value::[{float()}]) -> ok %% @doc See external documentation. uniformMatrix4fv(Location,Transpose,Value) -> - wxe_util:cast(5473, <> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16} <- Value>>)/binary>>). %% @spec (Program::integer()) -> ok %% @doc See external documentation. validateProgram(Program) -> - wxe_util:cast(5474, <>). + wxe_util:cast(5494, <>). %% @spec (Index::integer(),X::float()) -> ok %% @doc See external documentation. vertexAttrib1d(Index,X) -> - wxe_util:cast(5475, <>). + wxe_util:cast(5495, <>). %% @spec (Index,{X}) -> ok %% @equiv vertexAttrib1d(Index,X) @@ -2945,7 +2966,7 @@ %% @spec (Index::integer(),X::float()) -> ok %% @doc See external documentation. vertexAttrib1f(Index,X) -> - wxe_util:cast(5476, <>). + wxe_util:cast(5496, <>). %% @spec (Index,{X}) -> ok %% @equiv vertexAttrib1f(Index,X) @@ -2954,7 +2975,7 @@ %% @spec (Index::integer(),X::integer()) -> ok %% @doc See external documentation. vertexAttrib1s(Index,X) -> - wxe_util:cast(5477, <>). + wxe_util:cast(5497, <>). %% @spec (Index,{X}) -> ok %% @equiv vertexAttrib1s(Index,X) @@ -2963,7 +2984,7 @@ %% @spec (Index::integer(),X::float(),Y::float()) -> ok %% @doc See external documentation. vertexAttrib2d(Index,X,Y) -> - wxe_util:cast(5478, <>). + wxe_util:cast(5498, <>). %% @spec (Index,{X,Y}) -> ok %% @equiv vertexAttrib2d(Index,X,Y) @@ -2972,7 +2993,7 @@ %% @spec (Index::integer(),X::float(),Y::float()) -> ok %% @doc See external documentation. vertexAttrib2f(Index,X,Y) -> - wxe_util:cast(5479, <>). + wxe_util:cast(5499, <>). %% @spec (Index,{X,Y}) -> ok %% @equiv vertexAttrib2f(Index,X,Y) @@ -2981,7 +3002,7 @@ %% @spec (Index::integer(),X::integer(),Y::integer()) -> ok %% @doc See external documentation. vertexAttrib2s(Index,X,Y) -> - wxe_util:cast(5480, <>). + wxe_util:cast(5500, <>). %% @spec (Index,{X,Y}) -> ok %% @equiv vertexAttrib2s(Index,X,Y) @@ -2990,7 +3011,7 @@ %% @spec (Index::integer(),X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. vertexAttrib3d(Index,X,Y,Z) -> - wxe_util:cast(5481, <>). + wxe_util:cast(5501, <>). %% @spec (Index,{X,Y,Z}) -> ok %% @equiv vertexAttrib3d(Index,X,Y,Z) @@ -2999,7 +3020,7 @@ %% @spec (Index::integer(),X::float(),Y::float(),Z::float()) -> ok %% @doc See external documentation. vertexAttrib3f(Index,X,Y,Z) -> - wxe_util:cast(5482, <>). + wxe_util:cast(5502, <>). %% @spec (Index,{X,Y,Z}) -> ok %% @equiv vertexAttrib3f(Index,X,Y,Z) @@ -3008,7 +3029,7 @@ %% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer()) -> ok %% @doc See external documentation. vertexAttrib3s(Index,X,Y,Z) -> - wxe_util:cast(5483, <>). + wxe_util:cast(5503, <>). %% @spec (Index,{X,Y,Z}) -> ok %% @equiv vertexAttrib3s(Index,X,Y,Z) @@ -3017,22 +3038,22 @@ %% @spec (Index::integer(),V::{integer()}) -> ok %% @doc See external documentation. vertexAttrib4Nbv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5484, <>). + wxe_util:cast(5504, <>). %% @spec (Index::integer(),V::{integer()}) -> ok %% @doc See external documentation. vertexAttrib4Niv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5485, <>). + wxe_util:cast(5505, <>). %% @spec (Index::integer(),V::{integer()}) -> ok %% @doc See external documentation. vertexAttrib4Nsv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5486, <>). + wxe_util:cast(5506, <>). %% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok %% @doc See external documentation. vertexAttrib4Nub(Index,X,Y,Z,W) -> - wxe_util:cast(5487, <>). + wxe_util:cast(5507, <>). %% @spec (Index,{X,Y,Z,W}) -> ok %% @equiv vertexAttrib4Nub(Index,X,Y,Z,W) @@ -3041,22 +3062,22 @@ %% @spec (Index::integer(),V::{integer()}) -> ok %% @doc See external documentation. vertexAttrib4Nuiv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5488, <>). + wxe_util:cast(5508, <>). %% @spec (Index::integer(),V::{integer()}) -> ok %% @doc See external documentation. vertexAttrib4Nusv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5489, <>). + wxe_util:cast(5509, <>). %% @spec (Index::integer(),V::{integer()}) -> ok %% @doc See external documentation. vertexAttrib4bv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5490, <>). + wxe_util:cast(5510, <>). %% @spec (Index::integer(),X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. vertexAttrib4d(Index,X,Y,Z,W) -> - wxe_util:cast(5491, <>). + wxe_util:cast(5511, <>). %% @spec (Index,{X,Y,Z,W}) -> ok %% @equiv vertexAttrib4d(Index,X,Y,Z,W) @@ -3065,7 +3086,7 @@ %% @spec (Index::integer(),X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. vertexAttrib4f(Index,X,Y,Z,W) -> - wxe_util:cast(5492, <>). + wxe_util:cast(5512, <>). %% @spec (Index,{X,Y,Z,W}) -> ok %% @equiv vertexAttrib4f(Index,X,Y,Z,W) @@ -3074,12 +3095,12 @@ %% @spec (Index::integer(),V::{integer()}) -> ok %% @doc See external documentation. vertexAttrib4iv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5493, <>). + wxe_util:cast(5513, <>). %% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok %% @doc See external documentation. vertexAttrib4s(Index,X,Y,Z,W) -> - wxe_util:cast(5494, <>). + wxe_util:cast(5514, <>). %% @spec (Index,{X,Y,Z,W}) -> ok %% @equiv vertexAttrib4s(Index,X,Y,Z,W) @@ -3088,800 +3109,887 @@ %% @spec (Index::integer(),V::{integer()}) -> ok %% @doc See external documentation. vertexAttrib4ubv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5495, <>). + wxe_util:cast(5515, <>). %% @spec (Index::integer(),V::{integer()}) -> ok %% @doc See external documentation. vertexAttrib4uiv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5496, <>). + wxe_util:cast(5516, <>). %% @spec (Index::integer(),V::{integer()}) -> ok %% @doc See external documentation. vertexAttrib4usv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5497, <>). + wxe_util:cast(5517, <>). %% @spec (Index::integer(),Size::integer(),Type::enum(),Normalized::0|1,Stride::integer(),Pointer::offset()|binary()) -> ok %% @doc See external documentation. vertexAttribPointer(Index,Size,Type,Normalized,Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5498, <>); + wxe_util:cast(5518, <>); vertexAttribPointer(Index,Size,Type,Normalized,Stride,Pointer) -> wxe_util:send_bin(Pointer), - wxe_util:cast(5499, <>). + wxe_util:cast(5519, <>). %% @spec (Location::integer(),Transpose::0|1,Value::[{float()}]) -> ok %% @doc See external documentation. uniformMatrix2x3fv(Location,Transpose,Value) -> - wxe_util:cast(5500, <> || {V1,V2,V3,V4,V5,V6} <- Value>>)/binary>>). %% @spec (Location::integer(),Transpose::0|1,Value::[{float()}]) -> ok %% @doc See external documentation. uniformMatrix3x2fv(Location,Transpose,Value) -> - wxe_util:cast(5501, <> || {V1,V2,V3,V4,V5,V6} <- Value>>)/binary>>). %% @spec (Location::integer(),Transpose::0|1,Value::[{float()}]) -> ok %% @doc See external documentation. uniformMatrix2x4fv(Location,Transpose,Value) -> - wxe_util:cast(5502, <> || {V1,V2,V3,V4,V5,V6,V7,V8} <- Value>>)/binary>>). %% @spec (Location::integer(),Transpose::0|1,Value::[{float()}]) -> ok %% @doc See external documentation. uniformMatrix4x2fv(Location,Transpose,Value) -> - wxe_util:cast(5503, <> || {V1,V2,V3,V4,V5,V6,V7,V8} <- Value>>)/binary>>). %% @spec (Location::integer(),Transpose::0|1,Value::[{float()}]) -> ok %% @doc See external documentation. uniformMatrix3x4fv(Location,Transpose,Value) -> - wxe_util:cast(5504, <> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12} <- Value>>)/binary>>). %% @spec (Location::integer(),Transpose::0|1,Value::[{float()}]) -> ok %% @doc See external documentation. uniformMatrix4x3fv(Location,Transpose,Value) -> - wxe_util:cast(5505, <> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12} <- Value>>)/binary>>). %% @spec (Index::integer(),R::0|1,G::0|1,B::0|1,A::0|1) -> ok %% @doc See external documentation. colorMaski(Index,R,G,B,A) -> - wxe_util:cast(5506, <>). + wxe_util:cast(5526, <>). %% @spec (Target::enum(),Index::integer()) -> [0|1] %% @doc See external documentation. getBooleani_v(Target,Index) -> - wxe_util:call(5507, <>). + wxe_util:call(5527, <>). %% @spec (Target::enum(),Index::integer()) -> [integer()] %% @doc See external documentation. getIntegeri_v(Target,Index) -> - wxe_util:call(5508, <>). + wxe_util:call(5528, <>). %% @spec (Target::enum(),Index::integer()) -> ok %% @doc See external documentation. enablei(Target,Index) -> - wxe_util:cast(5509, <>). + wxe_util:cast(5529, <>). %% @spec (Target::enum(),Index::integer()) -> ok %% @doc See external documentation. disablei(Target,Index) -> - wxe_util:cast(5510, <>). + wxe_util:cast(5530, <>). %% @spec (Target::enum(),Index::integer()) -> 0|1 %% @doc See external documentation. isEnabledi(Target,Index) -> - wxe_util:call(5511, <>). + wxe_util:call(5531, <>). %% @spec (PrimitiveMode::enum()) -> ok %% @doc See external documentation. beginTransformFeedback(PrimitiveMode) -> - wxe_util:cast(5512, <>). + wxe_util:cast(5532, <>). %% @spec () -> ok %% @doc See external documentation. endTransformFeedback() -> - wxe_util:cast(5513, <<>>). + wxe_util:cast(5533, <<>>). %% @spec (Target::enum(),Index::integer(),Buffer::integer(),Offset::integer(),Size::integer()) -> ok %% @doc See external documentation. bindBufferRange(Target,Index,Buffer,Offset,Size) -> - wxe_util:cast(5514, <>). + wxe_util:cast(5534, <>). %% @spec (Target::enum(),Index::integer(),Buffer::integer()) -> ok %% @doc See external documentation. bindBufferBase(Target,Index,Buffer) -> - wxe_util:cast(5515, <>). + wxe_util:cast(5535, <>). + +%% @spec (Program::integer(),Varyings::[string()],BufferMode::enum()) -> ok +%% @doc See external documentation. +transformFeedbackVaryings(Program,Varyings,BufferMode) -> + VaryingsTemp = list_to_binary([[Str|[0]] || Str <- Varyings ]), + wxe_util:cast(5536, <>). + +%% @spec (Program::integer(),Index::integer(),BufSize::integer()) -> {Size::integer(),Type::enum(),Name::string()} +%% @doc See external documentation. +getTransformFeedbackVarying(Program,Index,BufSize) -> + wxe_util:call(5537, <>). %% @spec (Target::enum(),Clamp::enum()) -> ok %% @doc See external documentation. clampColor(Target,Clamp) -> - wxe_util:cast(5516, <>). + wxe_util:cast(5538, <>). %% @spec (Id::integer(),Mode::enum()) -> ok %% @doc See external documentation. beginConditionalRender(Id,Mode) -> - wxe_util:cast(5517, <>). + wxe_util:cast(5539, <>). %% @spec () -> ok %% @doc See external documentation. endConditionalRender() -> - wxe_util:cast(5518, <<>>). - -%% @spec (Index::integer(),X::integer()) -> ok -%% @doc See external documentation. -vertexAttribI1i(Index,X) -> - wxe_util:cast(5519, <>). - -%% @spec (Index::integer(),X::integer(),Y::integer()) -> ok -%% @doc See external documentation. -vertexAttribI2i(Index,X,Y) -> - wxe_util:cast(5520, <>). - -%% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer()) -> ok -%% @doc See external documentation. -vertexAttribI3i(Index,X,Y,Z) -> - wxe_util:cast(5521, <>). - -%% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok -%% @doc See external documentation. -vertexAttribI4i(Index,X,Y,Z,W) -> - wxe_util:cast(5522, <>). - -%% @spec (Index::integer(),X::integer()) -> ok -%% @doc See external documentation. -vertexAttribI1ui(Index,X) -> - wxe_util:cast(5523, <>). - -%% @spec (Index::integer(),X::integer(),Y::integer()) -> ok -%% @doc See external documentation. -vertexAttribI2ui(Index,X,Y) -> - wxe_util:cast(5524, <>). - -%% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer()) -> ok -%% @doc See external documentation. -vertexAttribI3ui(Index,X,Y,Z) -> - wxe_util:cast(5525, <>). - -%% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok -%% @doc See external documentation. -vertexAttribI4ui(Index,X,Y,Z,W) -> - wxe_util:cast(5526, <>). - -%% @spec (Index,{X}) -> ok -%% @equiv vertexAttribI1i(Index,X) -vertexAttribI1iv(Index,{X}) -> vertexAttribI1i(Index,X). - -%% @spec (Index,{X,Y}) -> ok -%% @equiv vertexAttribI2i(Index,X,Y) -vertexAttribI2iv(Index,{X,Y}) -> vertexAttribI2i(Index,X,Y). - -%% @spec (Index,{X,Y,Z}) -> ok -%% @equiv vertexAttribI3i(Index,X,Y,Z) -vertexAttribI3iv(Index,{X,Y,Z}) -> vertexAttribI3i(Index,X,Y,Z). - -%% @spec (Index,{X,Y,Z,W}) -> ok -%% @equiv vertexAttribI4i(Index,X,Y,Z,W) -vertexAttribI4iv(Index,{X,Y,Z,W}) -> vertexAttribI4i(Index,X,Y,Z,W). - -%% @spec (Index,{X}) -> ok -%% @equiv vertexAttribI1ui(Index,X) -vertexAttribI1uiv(Index,{X}) -> vertexAttribI1ui(Index,X). - -%% @spec (Index,{X,Y}) -> ok -%% @equiv vertexAttribI2ui(Index,X,Y) -vertexAttribI2uiv(Index,{X,Y}) -> vertexAttribI2ui(Index,X,Y). - -%% @spec (Index,{X,Y,Z}) -> ok -%% @equiv vertexAttribI3ui(Index,X,Y,Z) -vertexAttribI3uiv(Index,{X,Y,Z}) -> vertexAttribI3ui(Index,X,Y,Z). - -%% @spec (Index,{X,Y,Z,W}) -> ok -%% @equiv vertexAttribI4ui(Index,X,Y,Z,W) -vertexAttribI4uiv(Index,{X,Y,Z,W}) -> vertexAttribI4ui(Index,X,Y,Z,W). - -%% @spec (Index::integer(),V::{integer()}) -> ok -%% @doc See external documentation. -vertexAttribI4bv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5527, <>). - -%% @spec (Index::integer(),V::{integer()}) -> ok -%% @doc See external documentation. -vertexAttribI4sv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5528, <>). - -%% @spec (Index::integer(),V::{integer()}) -> ok -%% @doc See external documentation. -vertexAttribI4ubv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5529, <>). - -%% @spec (Index::integer(),V::{integer()}) -> ok -%% @doc See external documentation. -vertexAttribI4usv(Index,{V1,V2,V3,V4}) -> - wxe_util:cast(5530, <>). + wxe_util:cast(5540, <<>>). %% @spec (Index::integer(),Size::integer(),Type::enum(),Stride::integer(),Pointer::offset()|binary()) -> ok %% @doc See external documentation. vertexAttribIPointer(Index,Size,Type,Stride,Pointer) when is_integer(Pointer) -> - wxe_util:cast(5531, <>); + wxe_util:cast(5541, <>); vertexAttribIPointer(Index,Size,Type,Stride,Pointer) -> wxe_util:send_bin(Pointer), - wxe_util:cast(5532, <>). + wxe_util:cast(5542, <>). %% @spec (Index::integer(),Pname::enum()) -> {integer()} %% @doc See external documentation. getVertexAttribIiv(Index,Pname) -> - wxe_util:call(5533, <>). + wxe_util:call(5543, <>). %% @spec (Index::integer(),Pname::enum()) -> {integer()} %% @doc See external documentation. getVertexAttribIuiv(Index,Pname) -> - wxe_util:call(5534, <>). + wxe_util:call(5544, <>). %% @spec (Program::integer(),Location::integer()) -> {integer()} %% @doc See external documentation. getUniformuiv(Program,Location) -> - wxe_util:call(5535, <>). + wxe_util:call(5545, <>). %% @spec (Program::integer(),Color::integer(),Name::string()) -> ok %% @doc See external documentation. bindFragDataLocation(Program,Color,Name) -> - wxe_util:cast(5536, <>). + wxe_util:cast(5546, <>). %% @spec (Program::integer(),Name::string()) -> integer() %% @doc See external documentation. getFragDataLocation(Program,Name) -> - wxe_util:call(5537, <>). + wxe_util:call(5547, <>). %% @spec (Location::integer(),V0::integer()) -> ok %% @doc See external documentation. uniform1ui(Location,V0) -> - wxe_util:cast(5538, <>). + wxe_util:cast(5548, <>). %% @spec (Location::integer(),V0::integer(),V1::integer()) -> ok %% @doc See external documentation. uniform2ui(Location,V0,V1) -> - wxe_util:cast(5539, <>). + wxe_util:cast(5549, <>). %% @spec (Location::integer(),V0::integer(),V1::integer(),V2::integer()) -> ok %% @doc See external documentation. uniform3ui(Location,V0,V1,V2) -> - wxe_util:cast(5540, <>). + wxe_util:cast(5550, <>). %% @spec (Location::integer(),V0::integer(),V1::integer(),V2::integer(),V3::integer()) -> ok %% @doc See external documentation. uniform4ui(Location,V0,V1,V2,V3) -> - wxe_util:cast(5541, <>). + wxe_util:cast(5551, <>). %% @spec (Location::integer(),Value::[integer()]) -> ok %% @doc See external documentation. uniform1uiv(Location,Value) -> - wxe_util:cast(5542, <> || C <- Value>>)/binary,0:(((length(Value)) rem 2)*32)>>). %% @spec (Location::integer(),Value::[{integer()}]) -> ok %% @doc See external documentation. uniform2uiv(Location,Value) -> - wxe_util:cast(5543, <> || {V1,V2} <- Value>>)/binary>>). %% @spec (Location::integer(),Value::[{integer()}]) -> ok %% @doc See external documentation. uniform3uiv(Location,Value) -> - wxe_util:cast(5544, <> || {V1,V2,V3} <- Value>>)/binary>>). %% @spec (Location::integer(),Value::[{integer()}]) -> ok %% @doc See external documentation. uniform4uiv(Location,Value) -> - wxe_util:cast(5545, <> || {V1,V2,V3,V4} <- Value>>)/binary>>). %% @spec (Target::enum(),Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. texParameterIiv(Target,Pname,Params) -> - wxe_util:cast(5546, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Target::enum(),Pname::enum(),Params::{integer()}) -> ok %% @doc See external documentation. texParameterIuiv(Target,Pname,Params) -> - wxe_util:cast(5547, <> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>). %% @spec (Target::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getTexParameterIiv(Target,Pname) -> - wxe_util:call(5548, <>). + wxe_util:call(5558, <>). %% @spec (Target::enum(),Pname::enum()) -> {integer()} %% @doc See external documentation. getTexParameterIuiv(Target,Pname) -> - wxe_util:call(5549, <>). + wxe_util:call(5559, <>). %% @spec (Buffer::enum(),Drawbuffer::integer(),Value::{integer()}) -> ok %% @doc See external documentation. clearBufferiv(Buffer,Drawbuffer,Value) -> - wxe_util:cast(5550, <> ||C <- tuple_to_list(Value)>>)/binary,0:(((1+size(Value)) rem 2)*32)>>). %% @spec (Buffer::enum(),Drawbuffer::integer(),Value::{integer()}) -> ok %% @doc See external documentation. clearBufferuiv(Buffer,Drawbuffer,Value) -> - wxe_util:cast(5551, <> ||C <- tuple_to_list(Value)>>)/binary,0:(((1+size(Value)) rem 2)*32)>>). %% @spec (Buffer::enum(),Drawbuffer::integer(),Value::{float()}) -> ok %% @doc See external documentation. clearBufferfv(Buffer,Drawbuffer,Value) -> - wxe_util:cast(5552, <> ||C <- tuple_to_list(Value)>>)/binary,0:(((1+size(Value)) rem 2)*32)>>). %% @spec (Buffer::enum(),Drawbuffer::integer(),Depth::float(),Stencil::integer()) -> ok %% @doc See external documentation. clearBufferfi(Buffer,Drawbuffer,Depth,Stencil) -> - wxe_util:cast(5553, <>). + wxe_util:cast(5563, <>). %% @spec (Name::enum(),Index::integer()) -> string() %% @doc See external documentation. getStringi(Name,Index) -> - wxe_util:call(5554, <>). + wxe_util:call(5564, <>). + +%% @spec (Index::integer(),X::integer()) -> ok +%% @doc See external documentation. +vertexAttribI1i(Index,X) -> + wxe_util:cast(5565, <>). + +%% @spec (Index::integer(),X::integer(),Y::integer()) -> ok +%% @doc See external documentation. +vertexAttribI2i(Index,X,Y) -> + wxe_util:cast(5566, <>). + +%% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer()) -> ok +%% @doc See external documentation. +vertexAttribI3i(Index,X,Y,Z) -> + wxe_util:cast(5567, <>). + +%% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok +%% @doc See external documentation. +vertexAttribI4i(Index,X,Y,Z,W) -> + wxe_util:cast(5568, <>). + +%% @spec (Index::integer(),X::integer()) -> ok +%% @doc See external documentation. +vertexAttribI1ui(Index,X) -> + wxe_util:cast(5569, <>). + +%% @spec (Index::integer(),X::integer(),Y::integer()) -> ok +%% @doc See external documentation. +vertexAttribI2ui(Index,X,Y) -> + wxe_util:cast(5570, <>). + +%% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer()) -> ok +%% @doc See external documentation. +vertexAttribI3ui(Index,X,Y,Z) -> + wxe_util:cast(5571, <>). + +%% @spec (Index::integer(),X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok +%% @doc See external documentation. +vertexAttribI4ui(Index,X,Y,Z,W) -> + wxe_util:cast(5572, <>). + +%% @spec (Index,{X}) -> ok +%% @equiv vertexAttribI1i(Index,X) +vertexAttribI1iv(Index,{X}) -> vertexAttribI1i(Index,X). + +%% @spec (Index,{X,Y}) -> ok +%% @equiv vertexAttribI2i(Index,X,Y) +vertexAttribI2iv(Index,{X,Y}) -> vertexAttribI2i(Index,X,Y). + +%% @spec (Index,{X,Y,Z}) -> ok +%% @equiv vertexAttribI3i(Index,X,Y,Z) +vertexAttribI3iv(Index,{X,Y,Z}) -> vertexAttribI3i(Index,X,Y,Z). + +%% @spec (Index,{X,Y,Z,W}) -> ok +%% @equiv vertexAttribI4i(Index,X,Y,Z,W) +vertexAttribI4iv(Index,{X,Y,Z,W}) -> vertexAttribI4i(Index,X,Y,Z,W). + +%% @spec (Index,{X}) -> ok +%% @equiv vertexAttribI1ui(Index,X) +vertexAttribI1uiv(Index,{X}) -> vertexAttribI1ui(Index,X). + +%% @spec (Index,{X,Y}) -> ok +%% @equiv vertexAttribI2ui(Index,X,Y) +vertexAttribI2uiv(Index,{X,Y}) -> vertexAttribI2ui(Index,X,Y). + +%% @spec (Index,{X,Y,Z}) -> ok +%% @equiv vertexAttribI3ui(Index,X,Y,Z) +vertexAttribI3uiv(Index,{X,Y,Z}) -> vertexAttribI3ui(Index,X,Y,Z). + +%% @spec (Index,{X,Y,Z,W}) -> ok +%% @equiv vertexAttribI4ui(Index,X,Y,Z,W) +vertexAttribI4uiv(Index,{X,Y,Z,W}) -> vertexAttribI4ui(Index,X,Y,Z,W). + +%% @spec (Index::integer(),V::{integer()}) -> ok +%% @doc See external documentation. +vertexAttribI4bv(Index,{V1,V2,V3,V4}) -> + wxe_util:cast(5573, <>). + +%% @spec (Index::integer(),V::{integer()}) -> ok +%% @doc See external documentation. +vertexAttribI4sv(Index,{V1,V2,V3,V4}) -> + wxe_util:cast(5574, <>). + +%% @spec (Index::integer(),V::{integer()}) -> ok +%% @doc See external documentation. +vertexAttribI4ubv(Index,{V1,V2,V3,V4}) -> + wxe_util:cast(5575, <>). + +%% @spec (Index::integer(),V::{integer()}) -> ok +%% @doc See external documentation. +vertexAttribI4usv(Index,{V1,V2,V3,V4}) -> + wxe_util:cast(5576, <>). + +%% @spec (Mode::enum(),First::integer(),Count::integer(),Primcount::integer()) -> ok +%% @doc See external documentation. +drawArraysInstanced(Mode,First,Count,Primcount) -> + wxe_util:cast(5577, <>). + +%% @spec (Mode::enum(),Count::integer(),Type::enum(),Indices::offset()|binary(),Primcount::integer()) -> ok +%% @doc See external documentation. +drawElementsInstanced(Mode,Count,Type,Indices,Primcount) when is_integer(Indices) -> + wxe_util:cast(5578, <>); +drawElementsInstanced(Mode,Count,Type,Indices,Primcount) -> + wxe_util:send_bin(Indices), + wxe_util:cast(5579, <>). + +%% @spec (Target::enum(),Internalformat::enum(),Buffer::integer()) -> ok +%% @doc See external documentation. +texBuffer(Target,Internalformat,Buffer) -> + wxe_util:cast(5580, <>). + +%% @spec (Index::integer()) -> ok +%% @doc See external documentation. +primitiveRestartIndex(Index) -> + wxe_util:cast(5581, <>). + +%% @spec (M::{float()}) -> ok +%% @doc See external documentation. +loadTransposeMatrixfARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> + wxe_util:cast(5582, <>); +loadTransposeMatrixfARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5582, <>). + +%% @spec (M::{float()}) -> ok +%% @doc See external documentation. +loadTransposeMatrixdARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> + wxe_util:cast(5583, <>); +loadTransposeMatrixdARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5583, <>). + +%% @spec (M::{float()}) -> ok +%% @doc See external documentation. +multTransposeMatrixfARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> + wxe_util:cast(5584, <>); +multTransposeMatrixfARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5584, <>). + +%% @spec (M::{float()}) -> ok +%% @doc See external documentation. +multTransposeMatrixdARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) -> + wxe_util:cast(5585, <>); +multTransposeMatrixdARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) -> + wxe_util:cast(5585, <>). %% @spec (Weights::[integer()]) -> ok %% @doc See external documentation. weightbvARB(Weights) -> - wxe_util:cast(5555, <<(length(Weights)):?GLuint, + wxe_util:cast(5586, <<(length(Weights)):?GLuint, (<< <> || C <- Weights>>)/binary,0:((8-((length(Weights)+ 4) rem 8)) rem 8)>>). %% @spec (Weights::[integer()]) -> ok %% @doc See external documentation. weightsvARB(Weights) -> - wxe_util:cast(5556, <<(length(Weights)):?GLuint, + wxe_util:cast(5587, <<(length(Weights)):?GLuint, (<< <> || C <- Weights>>)/binary,0:((8-((length(Weights)*2+ 4) rem 8)) rem 8)>>). %% @spec (Weights::[integer()]) -> ok %% @doc See external documentation. weightivARB(Weights) -> - wxe_util:cast(5557, <<(length(Weights)):?GLuint, + wxe_util:cast(5588, <<(length(Weights)):?GLuint, (<< <> || C <- Weights>>)/binary,0:(((1+length(Weights)) rem 2)*32)>>). %% @spec (Weights::[float()]) -> ok %% @doc See external documentation. weightfvARB(Weights) -> - wxe_util:cast(5558, <<(length(Weights)):?GLuint, + wxe_util:cast(5589, <<(length(Weights)):?GLuint, (<< <> || C <- Weights>>)/binary,0:(((1+length(Weights)) rem 2)*32)>>). %% @spec (Weights::[float()]) -> ok %% @doc See external documentation. weightdvARB(Weights) -> - wxe_util:cast(5559, <<(length(Weights)):?GLuint,0:32, + wxe_util:cast(5590, <<(length(Weights)):?GLuint,0:32, (<< <> || C <- Weights>>)/binary>>). %% @spec (Weights::[integer()]) -> ok %% @doc See external documentation. weightubvARB(Weights) -> - wxe_util:cast(5560, <<(length(Weights)):?GLuint, + wxe_util:cast(5591, <<(length(Weights)):?GLuint, (<< <> || C <- Weights>>)/binary,0:((8-((length(Weights)+ 4) rem 8)) rem 8)>>). %% @spec (Weights::[integer()]) -> ok %% @doc See external documentation. weightusvARB(Weights) -> - wxe_util:cast(5561, <<(length(Weights)):?GLuint, + wxe_util:cast(5592, <<(length(Weights)):?GLuint, (<< <> || C <- Weights>>)/binary,0:((8-((length(Weights)*2+ 4) rem 8)) rem 8)>>). %% @spec (Weights::[integer()]) -> ok %% @doc See external documentation. weightuivARB(Weights) -> - wxe_util:cast(5562, <<(length(Weights)):?GLuint, + wxe_util:cast(5593, <<(length(Weights)):?GLuint, (<< <> || C <- Weights>>)/binary,0:(((1+length(Weights)) rem 2)*32)>>). %% @spec (Count::integer()) -> ok %% @doc See external documentation. vertexBlendARB(Count) -> - wxe_util:cast(5563, <>). + wxe_util:cast(5594, <>). %% @spec (Index::integer()) -> ok %% @doc See external documentation. currentPaletteMatrixARB(Index) -> - wxe_util:cast(5564, <>). + wxe_util:cast(5595, <>). %% @spec (Indices::[integer()]) -> ok %% @doc See external documentation. matrixIndexubvARB(Indices) -> - wxe_util:cast(5565, <<(length(Indices)):?GLuint, + wxe_util:cast(5596, <<(length(Indices)):?GLuint, (<< <> || C <- Indices>>)/binary,0:((8-((length(Indices)+ 4) rem 8)) rem 8)>>). %% @spec (Indices::[integer()]) -> ok %% @doc See external documentation. matrixIndexusvARB(Indices) -> - wxe_util:cast(5566, <<(length(Indices)):?GLuint, + wxe_util:cast(5597, <<(length(Indices)):?GLuint, (<< <> || C <- Indices>>)/binary,0:((8-((length(Indices)*2+ 4) rem 8)) rem 8)>>). %% @spec (Indices::[integer()]) -> ok %% @doc See external documentation. matrixIndexuivARB(Indices) -> - wxe_util:cast(5567, <<(length(Indices)):?GLuint, + wxe_util:cast(5598, <<(length(Indices)):?GLuint, (<< <> || C <- Indices>>)/binary,0:(((1+length(Indices)) rem 2)*32)>>). %% @spec (Target::enum(),Format::enum(),String::string()) -> ok %% @doc See external documentation. programStringARB(Target,Format,String) -> - wxe_util:cast(5568, <>). + wxe_util:cast(5599, <>). %% @spec (Target::enum(),Program::integer()) -> ok %% @doc See external documentation. bindProgramARB(Target,Program) -> - wxe_util:cast(5569, <>). + wxe_util:cast(5600, <>). %% @spec (Programs::[integer()]) -> ok %% @doc See external documentation. deleteProgramsARB(Programs) -> - wxe_util:cast(5570, <<(length(Programs)):?GLuint, + wxe_util:cast(5601, <<(length(Programs)):?GLuint, (<< <> || C <- Programs>>)/binary,0:(((1+length(Programs)) rem 2)*32)>>). %% @spec (N::integer()) -> [integer()] %% @doc See external documentation. genProgramsARB(N) -> - wxe_util:call(5571, <>). + wxe_util:call(5602, <>). %% @spec (Target::enum(),Index::integer(),X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. programEnvParameter4dARB(Target,Index,X,Y,Z,W) -> - wxe_util:cast(5572, <>). + wxe_util:cast(5603, <>). %% @spec (Target::enum(),Index::integer(),Params::{float()}) -> ok %% @doc See external documentation. programEnvParameter4dvARB(Target,Index,{P1,P2,P3,P4}) -> - wxe_util:cast(5573, <>). + wxe_util:cast(5604, <>). %% @spec (Target::enum(),Index::integer(),X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. programEnvParameter4fARB(Target,Index,X,Y,Z,W) -> - wxe_util:cast(5574, <>). + wxe_util:cast(5605, <>). %% @spec (Target::enum(),Index::integer(),Params::{float()}) -> ok %% @doc See external documentation. programEnvParameter4fvARB(Target,Index,{P1,P2,P3,P4}) -> - wxe_util:cast(5575, <>). + wxe_util:cast(5606, <>). %% @spec (Target::enum(),Index::integer(),X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. programLocalParameter4dARB(Target,Index,X,Y,Z,W) -> - wxe_util:cast(5576, <>). + wxe_util:cast(5607, <>). %% @spec (Target::enum(),Index::integer(),Params::{float()}) -> ok %% @doc See external documentation. programLocalParameter4dvARB(Target,Index,{P1,P2,P3,P4}) -> - wxe_util:cast(5577, <>). + wxe_util:cast(5608, <>). %% @spec (Target::enum(),Index::integer(),X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. programLocalParameter4fARB(Target,Index,X,Y,Z,W) -> - wxe_util:cast(5578, <>). + wxe_util:cast(5609, <>). %% @spec (Target::enum(),Index::integer(),Params::{float()}) -> ok %% @doc See external documentation. programLocalParameter4fvARB(Target,Index,{P1,P2,P3,P4}) -> - wxe_util:cast(5579, <>). + wxe_util:cast(5610, <>). %% @spec (Target::enum(),Index::integer()) -> {float()} %% @doc See external documentation. getProgramEnvParameterdvARB(Target,Index) -> - wxe_util:call(5580, <>). + wxe_util:call(5611, <>). %% @spec (Target::enum(),Index::integer()) -> {float()} %% @doc See external documentation. getProgramEnvParameterfvARB(Target,Index) -> - wxe_util:call(5581, <>). + wxe_util:call(5612, <>). %% @spec (Target::enum(),Index::integer()) -> {float()} %% @doc See external documentation. getProgramLocalParameterdvARB(Target,Index) -> - wxe_util:call(5582, <>). + wxe_util:call(5613, <>). %% @spec (Target::enum(),Index::integer()) -> {float()} %% @doc See external documentation. getProgramLocalParameterfvARB(Target,Index) -> - wxe_util:call(5583, <>). + wxe_util:call(5614, <>). %% @spec (Target::enum(),Pname::enum(),String::wx:wx_mem()) -> ok %% @doc See external documentation. getProgramStringARB(Target,Pname,String) -> wxe_util:send_bin(String#wx_mem.bin), - wxe_util:call(5584, <>). + wxe_util:call(5615, <>). %% @spec (Obj::integer()) -> ok %% @doc See external documentation. deleteObjectARB(Obj) -> - wxe_util:cast(5585, <>). + wxe_util:cast(5616, <>). %% @spec (Pname::enum()) -> integer() %% @doc See external documentation. getHandleARB(Pname) -> - wxe_util:call(5586, <>). + wxe_util:call(5617, <>). %% @spec (ContainerObj::integer(),AttachedObj::integer()) -> ok %% @doc See external documentation. detachObjectARB(ContainerObj,AttachedObj) -> - wxe_util:cast(5587, <>). + wxe_util:cast(5618, <>). %% @spec (ShaderType::enum()) -> integer() %% @doc See external documentation. createShaderObjectARB(ShaderType) -> - wxe_util:call(5588, <>). + wxe_util:call(5619, <>). %% @spec (ShaderObj::integer(),String::[string()]) -> ok %% @doc See external documentation. shaderSourceARB(ShaderObj,String) -> StringTemp = list_to_binary([[Str|[0]] || Str <- String ]), - wxe_util:cast(5589, <>). + wxe_util:cast(5620, <>). %% @spec (ShaderObj::integer()) -> ok %% @doc See external documentation. compileShaderARB(ShaderObj) -> - wxe_util:cast(5590, <>). + wxe_util:cast(5621, <>). %% @spec () -> integer() %% @doc See external documentation. createProgramObjectARB() -> - wxe_util:call(5591, <<>>). + wxe_util:call(5622, <<>>). %% @spec (ContainerObj::integer(),Obj::integer()) -> ok %% @doc See external documentation. attachObjectARB(ContainerObj,Obj) -> - wxe_util:cast(5592, <>). + wxe_util:cast(5623, <>). %% @spec (ProgramObj::integer()) -> ok %% @doc See external documentation. linkProgramARB(ProgramObj) -> - wxe_util:cast(5593, <>). + wxe_util:cast(5624, <>). %% @spec (ProgramObj::integer()) -> ok %% @doc See external documentation. useProgramObjectARB(ProgramObj) -> - wxe_util:cast(5594, <>). + wxe_util:cast(5625, <>). %% @spec (ProgramObj::integer()) -> ok %% @doc See external documentation. validateProgramARB(ProgramObj) -> - wxe_util:cast(5595, <>). + wxe_util:cast(5626, <>). %% @spec (Obj::integer(),Pname::enum()) -> float() %% @doc See external documentation. getObjectParameterfvARB(Obj,Pname) -> - wxe_util:call(5596, <>). + wxe_util:call(5627, <>). %% @spec (Obj::integer(),Pname::enum()) -> integer() %% @doc See external documentation. getObjectParameterivARB(Obj,Pname) -> - wxe_util:call(5597, <>). + wxe_util:call(5628, <>). %% @spec (Obj::integer(),MaxLength::integer()) -> string() %% @doc See external documentation. getInfoLogARB(Obj,MaxLength) -> - wxe_util:call(5598, <>). + wxe_util:call(5629, <>). %% @spec (ContainerObj::integer(),MaxCount::integer()) -> [integer()] %% @doc See external documentation. getAttachedObjectsARB(ContainerObj,MaxCount) -> - wxe_util:call(5599, <>). + wxe_util:call(5630, <>). %% @spec (ProgramObj::integer(),Name::string()) -> integer() %% @doc See external documentation. getUniformLocationARB(ProgramObj,Name) -> - wxe_util:call(5600, <>). + wxe_util:call(5631, <>). %% @spec (ProgramObj::integer(),Index::integer(),MaxLength::integer()) -> {Size::integer(),Type::enum(),Name::string()} %% @doc See external documentation. getActiveUniformARB(ProgramObj,Index,MaxLength) -> - wxe_util:call(5601, <>). + wxe_util:call(5632, <>). %% @spec (ProgramObj::integer(),Location::integer()) -> {float()} %% @doc See external documentation. getUniformfvARB(ProgramObj,Location) -> - wxe_util:call(5602, <>). + wxe_util:call(5633, <>). %% @spec (ProgramObj::integer(),Location::integer()) -> {integer()} %% @doc See external documentation. getUniformivARB(ProgramObj,Location) -> - wxe_util:call(5603, <>). + wxe_util:call(5634, <>). %% @spec (Obj::integer(),MaxLength::integer()) -> string() %% @doc See external documentation. getShaderSourceARB(Obj,MaxLength) -> - wxe_util:call(5604, <>). + wxe_util:call(5635, <>). %% @spec (ProgramObj::integer(),Index::integer(),Name::string()) -> ok %% @doc See external documentation. bindAttribLocationARB(ProgramObj,Index,Name) -> - wxe_util:cast(5605, <>). + wxe_util:cast(5636, <>). %% @spec (ProgramObj::integer(),Index::integer(),MaxLength::integer()) -> {Size::integer(),Type::enum(),Name::string()} %% @doc See external documentation. getActiveAttribARB(ProgramObj,Index,MaxLength) -> - wxe_util:call(5606, <>). + wxe_util:call(5637, <>). %% @spec (ProgramObj::integer(),Name::string()) -> integer() %% @doc See external documentation. getAttribLocationARB(ProgramObj,Name) -> - wxe_util:call(5607, <>). - -%% @spec (Mode::enum(),First::integer(),Count::integer(),Primcount::integer()) -> ok -%% @doc See external documentation. -drawArraysInstancedARB(Mode,First,Count,Primcount) -> - wxe_util:cast(5608, <>). - -%% @spec (Mode::enum(),Count::integer(),Type::enum(),Indices::offset()|binary(),Primcount::integer()) -> ok -%% @doc See external documentation. -drawElementsInstancedARB(Mode,Count,Type,Indices,Primcount) when is_integer(Indices) -> - wxe_util:cast(5609, <>); -drawElementsInstancedARB(Mode,Count,Type,Indices,Primcount) -> - wxe_util:send_bin(Indices), - wxe_util:cast(5610, <>). + wxe_util:call(5638, <>). %% @spec (Renderbuffer::integer()) -> 0|1 %% @doc See external documentation. isRenderbuffer(Renderbuffer) -> - wxe_util:call(5611, <>). + wxe_util:call(5639, <>). %% @spec (Target::enum(),Renderbuffer::integer()) -> ok %% @doc See external documentation. bindRenderbuffer(Target,Renderbuffer) -> - wxe_util:cast(5612, <>). + wxe_util:cast(5640, <>). %% @spec (Renderbuffers::[integer()]) -> ok %% @doc See external documentation. deleteRenderbuffers(Renderbuffers) -> - wxe_util:cast(5613, <<(length(Renderbuffers)):?GLuint, + wxe_util:cast(5641, <<(length(Renderbuffers)):?GLuint, (<< <> || C <- Renderbuffers>>)/binary,0:(((1+length(Renderbuffers)) rem 2)*32)>>). %% @spec (N::integer()) -> [integer()] %% @doc See external documentation. genRenderbuffers(N) -> - wxe_util:call(5614, <>). + wxe_util:call(5642, <>). %% @spec (Target::enum(),Internalformat::enum(),Width::integer(),Height::integer()) -> ok %% @doc See external documentation. renderbufferStorage(Target,Internalformat,Width,Height) -> - wxe_util:cast(5615, <>). + wxe_util:cast(5643, <>). %% @spec (Target::enum(),Pname::enum()) -> integer() %% @doc See external documentation. getRenderbufferParameteriv(Target,Pname) -> - wxe_util:call(5616, <>). + wxe_util:call(5644, <>). %% @spec (Framebuffer::integer()) -> 0|1 %% @doc See external documentation. isFramebuffer(Framebuffer) -> - wxe_util:call(5617, <>). + wxe_util:call(5645, <>). %% @spec (Target::enum(),Framebuffer::integer()) -> ok %% @doc See external documentation. bindFramebuffer(Target,Framebuffer) -> - wxe_util:cast(5618, <>). + wxe_util:cast(5646, <>). %% @spec (Framebuffers::[integer()]) -> ok %% @doc See external documentation. deleteFramebuffers(Framebuffers) -> - wxe_util:cast(5619, <<(length(Framebuffers)):?GLuint, + wxe_util:cast(5647, <<(length(Framebuffers)):?GLuint, (<< <> || C <- Framebuffers>>)/binary,0:(((1+length(Framebuffers)) rem 2)*32)>>). %% @spec (N::integer()) -> [integer()] %% @doc See external documentation. genFramebuffers(N) -> - wxe_util:call(5620, <>). + wxe_util:call(5648, <>). %% @spec (Target::enum()) -> enum() %% @doc See external documentation. checkFramebufferStatus(Target) -> - wxe_util:call(5621, <>). + wxe_util:call(5649, <>). %% @spec (Target::enum(),Attachment::enum(),Textarget::enum(),Texture::integer(),Level::integer()) -> ok %% @doc See external documentation. framebufferTexture1D(Target,Attachment,Textarget,Texture,Level) -> - wxe_util:cast(5622, <>). + wxe_util:cast(5650, <>). %% @spec (Target::enum(),Attachment::enum(),Textarget::enum(),Texture::integer(),Level::integer()) -> ok %% @doc See external documentation. framebufferTexture2D(Target,Attachment,Textarget,Texture,Level) -> - wxe_util:cast(5623, <>). + wxe_util:cast(5651, <>). %% @spec (Target::enum(),Attachment::enum(),Textarget::enum(),Texture::integer(),Level::integer(),Zoffset::integer()) -> ok %% @doc See external documentation. framebufferTexture3D(Target,Attachment,Textarget,Texture,Level,Zoffset) -> - wxe_util:cast(5624, <>). + wxe_util:cast(5652, <>). %% @spec (Target::enum(),Attachment::enum(),Renderbuffertarget::enum(),Renderbuffer::integer()) -> ok %% @doc See external documentation. framebufferRenderbuffer(Target,Attachment,Renderbuffertarget,Renderbuffer) -> - wxe_util:cast(5625, <>). + wxe_util:cast(5653, <>). %% @spec (Target::enum(),Attachment::enum(),Pname::enum()) -> integer() %% @doc See external documentation. getFramebufferAttachmentParameteriv(Target,Attachment,Pname) -> - wxe_util:call(5626, <>). + wxe_util:call(5654, <>). %% @spec (Target::enum()) -> ok %% @doc See external documentation. generateMipmap(Target) -> - wxe_util:cast(5627, <>). + wxe_util:cast(5655, <>). %% @spec (SrcX0::integer(),SrcY0::integer(),SrcX1::integer(),SrcY1::integer(),DstX0::integer(),DstY0::integer(),DstX1::integer(),DstY1::integer(),Mask::integer(),Filter::enum()) -> ok %% @doc See external documentation. blitFramebuffer(SrcX0,SrcY0,SrcX1,SrcY1,DstX0,DstY0,DstX1,DstY1,Mask,Filter) -> - wxe_util:cast(5628, <>). + wxe_util:cast(5656, <>). %% @spec (Target::enum(),Samples::integer(),Internalformat::enum(),Width::integer(),Height::integer()) -> ok %% @doc See external documentation. renderbufferStorageMultisample(Target,Samples,Internalformat,Width,Height) -> - wxe_util:cast(5629, <>). + wxe_util:cast(5657, <>). %% @spec (Target::enum(),Attachment::enum(),Texture::integer(),Level::integer(),Layer::integer()) -> ok %% @doc See external documentation. framebufferTextureLayer(Target,Attachment,Texture,Level,Layer) -> - wxe_util:cast(5630, <>). + wxe_util:cast(5658, <>). %% @spec (Program::integer(),Pname::enum(),Value::integer()) -> ok %% @doc See external documentation. programParameteriARB(Program,Pname,Value) -> - wxe_util:cast(5631, <>). + wxe_util:cast(5659, <>). %% @spec (Target::enum(),Attachment::enum(),Texture::integer(),Level::integer()) -> ok %% @doc See external documentation. framebufferTextureARB(Target,Attachment,Texture,Level) -> - wxe_util:cast(5632, <>). + wxe_util:cast(5660, <>). %% @spec (Target::enum(),Attachment::enum(),Texture::integer(),Level::integer(),Face::enum()) -> ok %% @doc See external documentation. framebufferTextureFaceARB(Target,Attachment,Texture,Level,Face) -> - wxe_util:cast(5633, <>). + wxe_util:cast(5661, <>). %% @spec (Index::integer(),Divisor::integer()) -> ok -%% @doc See external documentation. -vertexAttribDivisor(Index,Divisor) -> - wxe_util:cast(5634, <>). +%% @doc See external documentation. +vertexAttribDivisorARB(Index,Divisor) -> + wxe_util:cast(5662, <>). %% @spec (Target::enum(),Offset::integer(),Length::integer()) -> ok %% @doc See external documentation. flushMappedBufferRange(Target,Offset,Length) -> - wxe_util:cast(5635, <>). - -%% @spec (Target::enum(),Internalformat::enum(),Buffer::integer()) -> ok -%% @doc See external documentation. -texBufferARB(Target,Internalformat,Buffer) -> - wxe_util:cast(5636, <>). + wxe_util:cast(5663, <>). %% @spec (Array::integer()) -> ok %% @doc See external documentation. bindVertexArray(Array) -> - wxe_util:cast(5637, <>). + wxe_util:cast(5664, <>). %% @spec (Arrays::[integer()]) -> ok %% @doc See external documentation. deleteVertexArrays(Arrays) -> - wxe_util:cast(5638, <<(length(Arrays)):?GLuint, + wxe_util:cast(5665, <<(length(Arrays)):?GLuint, (<< <> || C <- Arrays>>)/binary,0:(((1+length(Arrays)) rem 2)*32)>>). %% @spec (N::integer()) -> [integer()] %% @doc See external documentation. genVertexArrays(N) -> - wxe_util:call(5639, <>). + wxe_util:call(5666, <>). %% @spec (Array::integer()) -> 0|1 %% @doc See external documentation. isVertexArray(Array) -> - wxe_util:call(5640, <>). + wxe_util:call(5667, <>). + +%% @spec (Program::integer(),UniformNames::[string()]) -> [integer()] +%% @doc See external documentation. +getUniformIndices(Program,UniformNames) -> + UniformNamesTemp = list_to_binary([[Str|[0]] || Str <- UniformNames ]), + wxe_util:call(5668, <>). + +%% @spec (Program::integer(),UniformIndices::[integer()],Pname::enum()) -> [integer()] +%% @doc See external documentation. +getActiveUniformsiv(Program,UniformIndices,Pname) -> + wxe_util:call(5669, <> || C <- UniformIndices>>)/binary,0:(((length(UniformIndices)) rem 2)*32),Pname:?GLenum>>). + +%% @spec (Program::integer(),UniformIndex::integer(),BufSize::integer()) -> string() +%% @doc See external documentation. +getActiveUniformName(Program,UniformIndex,BufSize) -> + wxe_util:call(5670, <>). + +%% @spec (Program::integer(),UniformBlockName::string()) -> integer() +%% @doc See external documentation. +getUniformBlockIndex(Program,UniformBlockName) -> + wxe_util:call(5671, <>). + +%% @spec (Program::integer(),UniformBlockIndex::integer(),Pname::enum(),Params::wx:wx_mem()) -> ok +%% @doc See external documentation. +getActiveUniformBlockiv(Program,UniformBlockIndex,Pname,Params) -> + wxe_util:send_bin(Params#wx_mem.bin), + wxe_util:call(5672, <>). + +%% @spec (Program::integer(),UniformBlockIndex::integer(),BufSize::integer()) -> string() +%% @doc See external documentation. +getActiveUniformBlockName(Program,UniformBlockIndex,BufSize) -> + wxe_util:call(5673, <>). + +%% @spec (Program::integer(),UniformBlockIndex::integer(),UniformBlockBinding::integer()) -> ok +%% @doc See external documentation. +uniformBlockBinding(Program,UniformBlockIndex,UniformBlockBinding) -> + wxe_util:cast(5674, <>). + +%% @spec (ReadTarget::enum(),WriteTarget::enum(),ReadOffset::integer(),WriteOffset::integer(),Size::integer()) -> ok +%% @doc See external documentation. +copyBufferSubData(ReadTarget,WriteTarget,ReadOffset,WriteOffset,Size) -> + wxe_util:cast(5675, <>). %% @spec () -> ok %% @doc See external documentation. resizeBuffersMESA() -> - wxe_util:cast(5641, <<>>). + wxe_util:cast(5676, <<>>). %% @spec (X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. windowPos4dMESA(X,Y,Z,W) -> - wxe_util:cast(5642, <>). + wxe_util:cast(5677, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv windowPos4dMESA(X,Y,Z,W) @@ -3890,7 +3998,7 @@ %% @spec (X::float(),Y::float(),Z::float(),W::float()) -> ok %% @doc See external documentation. windowPos4fMESA(X,Y,Z,W) -> - wxe_util:cast(5643, <>). + wxe_util:cast(5678, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv windowPos4fMESA(X,Y,Z,W) @@ -3899,7 +4007,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok %% @doc See external documentation. windowPos4iMESA(X,Y,Z,W) -> - wxe_util:cast(5644, <>). + wxe_util:cast(5679, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv windowPos4iMESA(X,Y,Z,W) @@ -3908,7 +4016,7 @@ %% @spec (X::integer(),Y::integer(),Z::integer(),W::integer()) -> ok %% @doc See external documentation. windowPos4sMESA(X,Y,Z,W) -> - wxe_util:cast(5645, <>). + wxe_util:cast(5680, <>). %% @spec ({X,Y,Z,W}) -> ok %% @equiv windowPos4sMESA(X,Y,Z,W) @@ -3917,10 +4025,10 @@ %% @spec (Zmin::clamp(),Zmax::clamp()) -> ok %% @doc See external documentation. depthBoundsEXT(Zmin,Zmax) -> - wxe_util:cast(5646, <>). + wxe_util:cast(5681, <>). %% @spec (StencilTagBits::integer(),StencilClearTag::integer()) -> ok %% @doc See external documentation. stencilClearTagEXT(StencilTagBits,StencilClearTag) -> - wxe_util:cast(5647, <>). + wxe_util:cast(5682, <>). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/glu.erl erlang-13.b.3-dfsg/lib/wx/src/gen/glu.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/glu.erl 2009-06-05 13:54:33.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/glu.erl 2009-09-18 15:11:04.000000000 +0100 @@ -25,12 +25,14 @@ %% %% Booleans are represented by integers 0 and 1. +%% @type wx_mem(). see wx.erl on memory allocation functions %% @type enum(). An integer defined in gl.hrl %% @type offset(). An integer which is an offset in an array %% @type clamp(). A float clamped between 0.0 - 1.0 -module(glu). -compile(inline). +-include("wxe.hrl"). -define(GLenum,32/native-unsigned). -define(GLboolean,8/native-unsigned). -define(GLbitfield,32/native-unsigned). @@ -47,12 +49,15 @@ -define(GLclampd,64/native-float). -define(GLsizeiptr,64/native-unsigned). -define(GLintptr,64/native-unsigned). +-define(GLUquadric,64/native-unsigned). -define(GLhandleARB,64/native-unsigned). -export([tesselate/2,build1DMipmapLevels/9,build1DMipmaps/6,build2DMipmapLevels/10, build2DMipmaps/7,build3DMipmapLevels/11,build3DMipmaps/8,checkExtension/2, - errorString/1,getString/1,lookAt/9,ortho2D/4,perspective/4,pickMatrix/5, - project/6,unProject/6,unProject4/9]). + cylinder/6,deleteQuadric/1,disk/5,errorString/1,getString/1,lookAt/9, + newQuadric/0,ortho2D/4,partialDisk/7,perspective/4,pickMatrix/5,project/6, + quadricDrawStyle/2,quadricNormals/2,quadricOrientation/2,quadricTexture/2, + scaleImage/9,sphere/4,unProject/6,unProject4/9]). %% API @@ -77,87 +82,150 @@ %% @doc See external documentation. build1DMipmapLevels(Target,InternalFormat,Width,Format,Type,Level,Base,Max,Data) -> wxe_util:send_bin(Data), - wxe_util:call(5001, <>). + wxe_util:call(5010, <>). %% @spec (Target::enum(),InternalFormat::integer(),Width::integer(),Format::enum(),Type::enum(),Data::binary()) -> integer() %% @doc See external documentation. build1DMipmaps(Target,InternalFormat,Width,Format,Type,Data) -> wxe_util:send_bin(Data), - wxe_util:call(5002, <>). + wxe_util:call(5011, <>). %% @spec (Target::enum(),InternalFormat::integer(),Width::integer(),Height::integer(),Format::enum(),Type::enum(),Level::integer(),Base::integer(),Max::integer(),Data::binary()) -> integer() %% @doc See external documentation. build2DMipmapLevels(Target,InternalFormat,Width,Height,Format,Type,Level,Base,Max,Data) -> wxe_util:send_bin(Data), - wxe_util:call(5003, <>). + wxe_util:call(5012, <>). %% @spec (Target::enum(),InternalFormat::integer(),Width::integer(),Height::integer(),Format::enum(),Type::enum(),Data::binary()) -> integer() %% @doc See external documentation. build2DMipmaps(Target,InternalFormat,Width,Height,Format,Type,Data) -> wxe_util:send_bin(Data), - wxe_util:call(5004, <>). + wxe_util:call(5013, <>). %% @spec (Target::enum(),InternalFormat::integer(),Width::integer(),Height::integer(),Depth::integer(),Format::enum(),Type::enum(),Level::integer(),Base::integer(),Max::integer(),Data::binary()) -> integer() %% @doc See external documentation. build3DMipmapLevels(Target,InternalFormat,Width,Height,Depth,Format,Type,Level,Base,Max,Data) -> wxe_util:send_bin(Data), - wxe_util:call(5005, <>). + wxe_util:call(5014, <>). %% @spec (Target::enum(),InternalFormat::integer(),Width::integer(),Height::integer(),Depth::integer(),Format::enum(),Type::enum(),Data::binary()) -> integer() %% @doc See external documentation. build3DMipmaps(Target,InternalFormat,Width,Height,Depth,Format,Type,Data) -> wxe_util:send_bin(Data), - wxe_util:call(5006, <>). + wxe_util:call(5015, <>). %% @spec (ExtName::[integer()],ExtString::[integer()]) -> 0|1 %% @doc See external documentation. checkExtension(ExtName,ExtString) -> - wxe_util:call(5007, <<(length(ExtName)):?GLuint, + wxe_util:call(5016, <<(length(ExtName)):?GLuint, (<< <> || C <- ExtName>>)/binary,0:((8-((length(ExtName)+ 4) rem 8)) rem 8),(length(ExtString)):?GLuint, (<< <> || C <- ExtString>>)/binary,0:((8-((length(ExtString)+ 4) rem 8)) rem 8)>>). +%% @spec (Quad::integer(),Base::float(),Top::float(),Height::float(),Slices::integer(),Stacks::integer()) -> ok +%% @doc See external documentation. +cylinder(Quad,Base,Top,Height,Slices,Stacks) -> + wxe_util:cast(5017, <>). + +%% @spec (Quad::integer()) -> ok +%% @doc See external documentation. +deleteQuadric(Quad) -> + wxe_util:cast(5018, <>). + +%% @spec (Quad::integer(),Inner::float(),Outer::float(),Slices::integer(),Loops::integer()) -> ok +%% @doc See external documentation. +disk(Quad,Inner,Outer,Slices,Loops) -> + wxe_util:cast(5019, <>). + %% @spec (Error::enum()) -> string() %% @doc See external documentation. errorString(Error) -> - wxe_util:call(5008, <>). + wxe_util:call(5020, <>). %% @spec (Name::enum()) -> string() %% @doc See external documentation. getString(Name) -> - wxe_util:call(5009, <>). + wxe_util:call(5021, <>). %% @spec (EyeX::float(),EyeY::float(),EyeZ::float(),CenterX::float(),CenterY::float(),CenterZ::float(),UpX::float(),UpY::float(),UpZ::float()) -> ok %% @doc See external documentation. lookAt(EyeX,EyeY,EyeZ,CenterX,CenterY,CenterZ,UpX,UpY,UpZ) -> - wxe_util:cast(5010, <>). + wxe_util:cast(5022, <>). + +%% @spec () -> integer() +%% @doc See external documentation. +newQuadric() -> + wxe_util:call(5023, <<>>). %% @spec (Left::float(),Right::float(),Bottom::float(),Top::float()) -> ok %% @doc See external documentation. ortho2D(Left,Right,Bottom,Top) -> - wxe_util:cast(5011, <>). + wxe_util:cast(5024, <>). + +%% @spec (Quad::integer(),Inner::float(),Outer::float(),Slices::integer(),Loops::integer(),Start::float(),Sweep::float()) -> ok +%% @doc See external documentation. +partialDisk(Quad,Inner,Outer,Slices,Loops,Start,Sweep) -> + wxe_util:cast(5025, <>). %% @spec (Fovy::float(),Aspect::float(),ZNear::float(),ZFar::float()) -> ok %% @doc See external documentation. perspective(Fovy,Aspect,ZNear,ZFar) -> - wxe_util:cast(5012, <>). + wxe_util:cast(5026, <>). %% @spec (X::float(),Y::float(),DelX::float(),DelY::float(),Viewport::{integer()}) -> ok %% @doc See external documentation. pickMatrix(X,Y,DelX,DelY,{V1,V2,V3,V4}) -> - wxe_util:cast(5013, <>). + wxe_util:cast(5027, <>). %% @spec (ObjX::float(),ObjY::float(),ObjZ::float(),Model::{float()},Proj::{float()},View::{integer()}) -> {integer(),WinX::float(),WinY::float(),WinZ::float()} %% @doc See external documentation. project(ObjX,ObjY,ObjZ,{M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16},{P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16},{V1,V2,V3,V4}) -> - wxe_util:call(5014, <>). + wxe_util:call(5028, <>); +project(ObjX,ObjY,ObjZ,{M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12},{P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12},{V1,V2,V3,V4}) -> + wxe_util:call(5028, <>). + +%% @spec (Quad::integer(),Draw::enum()) -> ok +%% @doc See external documentation. +quadricDrawStyle(Quad,Draw) -> + wxe_util:cast(5029, <>). + +%% @spec (Quad::integer(),Normal::enum()) -> ok +%% @doc See external documentation. +quadricNormals(Quad,Normal) -> + wxe_util:cast(5030, <>). + +%% @spec (Quad::integer(),Orientation::enum()) -> ok +%% @doc See external documentation. +quadricOrientation(Quad,Orientation) -> + wxe_util:cast(5031, <>). + +%% @spec (Quad::integer(),Texture::0|1) -> ok +%% @doc See external documentation. +quadricTexture(Quad,Texture) -> + wxe_util:cast(5032, <>). + +%% @spec (Format::enum(),WIn::integer(),HIn::integer(),TypeIn::enum(),DataIn::binary(),WOut::integer(),HOut::integer(),TypeOut::enum(),DataOut::wx:wx_mem()) -> integer() +%% @doc See external documentation. +scaleImage(Format,WIn,HIn,TypeIn,DataIn,WOut,HOut,TypeOut,DataOut) -> + wxe_util:send_bin(DataIn), + wxe_util:send_bin(DataOut#wx_mem.bin), + wxe_util:call(5033, <>). + +%% @spec (Quad::integer(),Radius::float(),Slices::integer(),Stacks::integer()) -> ok +%% @doc See external documentation. +sphere(Quad,Radius,Slices,Stacks) -> + wxe_util:cast(5034, <>). %% @spec (WinX::float(),WinY::float(),WinZ::float(),Model::{float()},Proj::{float()},View::{integer()}) -> {integer(),ObjX::float(),ObjY::float(),ObjZ::float()} %% @doc See external documentation. unProject(WinX,WinY,WinZ,{M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16},{P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16},{V1,V2,V3,V4}) -> - wxe_util:call(5015, <>). + wxe_util:call(5035, <>); +unProject(WinX,WinY,WinZ,{M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12},{P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12},{V1,V2,V3,V4}) -> + wxe_util:call(5035, <>). %% @spec (WinX::float(),WinY::float(),WinZ::float(),ClipW::float(),Model::{float()},Proj::{float()},View::{integer()},NearVal::float(),FarVal::float()) -> {integer(),ObjX::float(),ObjY::float(),ObjZ::float(),ObjW::float()} %% @doc See external documentation. unProject4(WinX,WinY,WinZ,ClipW,{M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16},{P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16},{V1,V2,V3,V4},NearVal,FarVal) -> - wxe_util:call(5016, <>). + wxe_util:call(5036, <>); +unProject4(WinX,WinY,WinZ,ClipW,{M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12},{P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12},{V1,V2,V3,V4},NearVal,FarVal) -> + wxe_util:call(5036, <>). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxAuiManagerEvent.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxAuiManagerEvent.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxAuiManagerEvent.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxAuiManagerEvent.erl 2009-09-18 15:11:28.000000000 +0100 @@ -0,0 +1,163 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxAuiManagerEvent. +%%
    Use {@link wxEvtHandler:connect/3.} with EventType:
    +%%
    aui_pane_button, aui_pane_close, aui_pane_maximize, aui_pane_restore, aui_render, aui_find_manager
    +%% See also the message variant {@link wxEvtHandler:wxAuiManager(). #wxAuiManager{}} event record type. +%% +%%

    This class is derived (and can use functions) from: +%%
    {@link wxEvent} +%%

    +%% @type wxAuiManagerEvent(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxAuiManagerEvent). +-include("wxe.hrl"). +-export([canVeto/1,getButton/1,getDC/1,getManager/1,getPane/1,getVeto/1,setButton/2, + setCanVeto/2,setDC/2,setManager/2,setPane/2,veto/1,veto/2]). + +%% inherited exports +-export([getId/1,getSkipped/1,getTimestamp/1,isCommandEvent/1,parent_class/1, + resumePropagation/2,shouldPropagate/1,skip/1,skip/2,stopPropagation/1]). + +%% @hidden +parent_class(wxEvent) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec (This::wxAuiManagerEvent(), Mgr::wxAuiManager:wxAuiManager()) -> ok +%% @doc See external documentation. +setManager(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=MgrT,ref=MgrRef}) -> + ?CLASS(ThisT,wxAuiManagerEvent), + ?CLASS(MgrT,wxAuiManager), + wxe_util:cast(?wxAuiManagerEvent_SetManager, + <>). + +%% @spec (This::wxAuiManagerEvent()) -> wxAuiManager:wxAuiManager() +%% @doc See external documentation. +getManager(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxAuiManagerEvent), + wxe_util:call(?wxAuiManagerEvent_GetManager, + <>). + +%% @spec (This::wxAuiManagerEvent(), P::wxAuiPaneInfo:wxAuiPaneInfo()) -> ok +%% @doc See external documentation. +setPane(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PT,ref=PRef}) -> + ?CLASS(ThisT,wxAuiManagerEvent), + ?CLASS(PT,wxAuiPaneInfo), + wxe_util:cast(?wxAuiManagerEvent_SetPane, + <>). + +%% @spec (This::wxAuiManagerEvent()) -> wxAuiPaneInfo:wxAuiPaneInfo() +%% @doc See external documentation. +getPane(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxAuiManagerEvent), + wxe_util:call(?wxAuiManagerEvent_GetPane, + <>). + +%% @spec (This::wxAuiManagerEvent(), B::integer()) -> ok +%% @doc See external documentation. +setButton(#wx_ref{type=ThisT,ref=ThisRef},B) + when is_integer(B) -> + ?CLASS(ThisT,wxAuiManagerEvent), + wxe_util:cast(?wxAuiManagerEvent_SetButton, + <>). + +%% @spec (This::wxAuiManagerEvent()) -> integer() +%% @doc See external documentation. +getButton(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxAuiManagerEvent), + wxe_util:call(?wxAuiManagerEvent_GetButton, + <>). + +%% @spec (This::wxAuiManagerEvent(), Pdc::wxDC:wxDC()) -> ok +%% @doc See external documentation. +setDC(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PdcT,ref=PdcRef}) -> + ?CLASS(ThisT,wxAuiManagerEvent), + ?CLASS(PdcT,wxDC), + wxe_util:cast(?wxAuiManagerEvent_SetDC, + <>). + +%% @spec (This::wxAuiManagerEvent()) -> wxDC:wxDC() +%% @doc See external documentation. +getDC(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxAuiManagerEvent), + wxe_util:call(?wxAuiManagerEvent_GetDC, + <>). + +%% @spec (This::wxAuiManagerEvent()) -> ok +%% @equiv veto(This, []) +veto(This) + when is_record(This, wx_ref) -> + veto(This, []). + +%% @spec (This::wxAuiManagerEvent(), [Option]) -> ok +%% Option = {veto, bool()} +%% @doc See external documentation. +veto(#wx_ref{type=ThisT,ref=ThisRef}, Options) + when is_list(Options) -> + ?CLASS(ThisT,wxAuiManagerEvent), + MOpts = fun({veto, Veto}, Acc) -> [<<1:32/?UI,(wxe_util:from_bool(Veto)):32/?UI>>|Acc]; + (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, + BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)), + wxe_util:cast(?wxAuiManagerEvent_Veto, + <>). + +%% @spec (This::wxAuiManagerEvent()) -> bool() +%% @doc See external documentation. +getVeto(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxAuiManagerEvent), + wxe_util:call(?wxAuiManagerEvent_GetVeto, + <>). + +%% @spec (This::wxAuiManagerEvent(), Can_veto::bool()) -> ok +%% @doc See external documentation. +setCanVeto(#wx_ref{type=ThisT,ref=ThisRef},Can_veto) + when is_boolean(Can_veto) -> + ?CLASS(ThisT,wxAuiManagerEvent), + wxe_util:cast(?wxAuiManagerEvent_SetCanVeto, + <>). + +%% @spec (This::wxAuiManagerEvent()) -> bool() +%% @doc See external documentation. +canVeto(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxAuiManagerEvent), + wxe_util:call(?wxAuiManagerEvent_CanVeto, + <>). + + %% From wxEvent +%% @hidden +stopPropagation(This) -> wxEvent:stopPropagation(This). +%% @hidden +skip(This, Options) -> wxEvent:skip(This, Options). +%% @hidden +skip(This) -> wxEvent:skip(This). +%% @hidden +shouldPropagate(This) -> wxEvent:shouldPropagate(This). +%% @hidden +resumePropagation(This,PropagationLevel) -> wxEvent:resumePropagation(This,PropagationLevel). +%% @hidden +isCommandEvent(This) -> wxEvent:isCommandEvent(This). +%% @hidden +getTimestamp(This) -> wxEvent:getTimestamp(This). +%% @hidden +getSkipped(This) -> wxEvent:getSkipped(This). +%% @hidden +getId(This) -> wxEvent:getId(This). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxAuiNotebookEvent.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxAuiNotebookEvent.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxAuiNotebookEvent.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxAuiNotebookEvent.erl 2009-09-18 15:11:28.000000000 +0100 @@ -0,0 +1,138 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxAuiNotebookEvent. +%%
    Use {@link wxEvtHandler:connect/3.} with EventType:
    +%%
    command_auinotebook_page_close, command_auinotebook_page_changed, command_auinotebook_page_changing, command_auinotebook_button, command_auinotebook_begin_drag, command_auinotebook_end_drag, command_auinotebook_drag_motion, command_auinotebook_allow_dnd, command_auinotebook_tab_middle_down, command_auinotebook_tab_middle_up, command_auinotebook_tab_right_down, command_auinotebook_tab_right_up, command_auinotebook_page_closed, command_auinotebook_drag_done, command_auinotebook_bg_dclick
    +%% See also the message variant {@link wxEvtHandler:wxAuiNotebook(). #wxAuiNotebook{}} event record type. +%% +%%

    This class is derived (and can use functions) from: +%%
    {@link wxNotifyEvent} +%%
    {@link wxCommandEvent} +%%
    {@link wxEvent} +%%

    +%% @type wxAuiNotebookEvent(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxAuiNotebookEvent). +-include("wxe.hrl"). +-export([getDragSource/1,getOldSelection/1,getSelection/1,setDragSource/2, + setOldSelection/2,setSelection/2]). + +%% inherited exports +-export([allow/1,getClientData/1,getExtraLong/1,getId/1,getInt/1,getSkipped/1, + getString/1,getTimestamp/1,isAllowed/1,isChecked/1,isCommandEvent/1, + isSelection/1,parent_class/1,resumePropagation/2,setInt/2,setString/2, + shouldPropagate/1,skip/1,skip/2,stopPropagation/1,veto/1]). + +%% @hidden +parent_class(wxNotifyEvent) -> true; +parent_class(wxCommandEvent) -> true; +parent_class(wxEvent) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec (This::wxAuiNotebookEvent(), S::integer()) -> ok +%% @doc See external documentation. +setSelection(#wx_ref{type=ThisT,ref=ThisRef},S) + when is_integer(S) -> + ?CLASS(ThisT,wxAuiNotebookEvent), + wxe_util:cast(?wxAuiNotebookEvent_SetSelection, + <>). + +%% @spec (This::wxAuiNotebookEvent()) -> integer() +%% @doc See external documentation. +getSelection(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxAuiNotebookEvent), + wxe_util:call(?wxAuiNotebookEvent_GetSelection, + <>). + +%% @spec (This::wxAuiNotebookEvent(), S::integer()) -> ok +%% @doc See external documentation. +setOldSelection(#wx_ref{type=ThisT,ref=ThisRef},S) + when is_integer(S) -> + ?CLASS(ThisT,wxAuiNotebookEvent), + wxe_util:cast(?wxAuiNotebookEvent_SetOldSelection, + <>). + +%% @spec (This::wxAuiNotebookEvent()) -> integer() +%% @doc See external documentation. +getOldSelection(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxAuiNotebookEvent), + wxe_util:call(?wxAuiNotebookEvent_GetOldSelection, + <>). + +%% @spec (This::wxAuiNotebookEvent(), S::wxAuiNotebook:wxAuiNotebook()) -> ok +%% @doc See external documentation. +setDragSource(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ST,ref=SRef}) -> + ?CLASS(ThisT,wxAuiNotebookEvent), + ?CLASS(ST,wxAuiNotebook), + wxe_util:cast(?wxAuiNotebookEvent_SetDragSource, + <>). + +%% @spec (This::wxAuiNotebookEvent()) -> wxAuiNotebook:wxAuiNotebook() +%% @doc See external documentation. +getDragSource(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxAuiNotebookEvent), + wxe_util:call(?wxAuiNotebookEvent_GetDragSource, + <>). + + %% From wxNotifyEvent +%% @hidden +veto(This) -> wxNotifyEvent:veto(This). +%% @hidden +isAllowed(This) -> wxNotifyEvent:isAllowed(This). +%% @hidden +allow(This) -> wxNotifyEvent:allow(This). + %% From wxCommandEvent +%% @hidden +setString(This,S) -> wxCommandEvent:setString(This,S). +%% @hidden +setInt(This,I) -> wxCommandEvent:setInt(This,I). +%% @hidden +isSelection(This) -> wxCommandEvent:isSelection(This). +%% @hidden +isChecked(This) -> wxCommandEvent:isChecked(This). +%% @hidden +getString(This) -> wxCommandEvent:getString(This). +%% @hidden +getInt(This) -> wxCommandEvent:getInt(This). +%% @hidden +getExtraLong(This) -> wxCommandEvent:getExtraLong(This). +%% @hidden +getClientData(This) -> wxCommandEvent:getClientData(This). + %% From wxEvent +%% @hidden +stopPropagation(This) -> wxEvent:stopPropagation(This). +%% @hidden +skip(This, Options) -> wxEvent:skip(This, Options). +%% @hidden +skip(This) -> wxEvent:skip(This). +%% @hidden +shouldPropagate(This) -> wxEvent:shouldPropagate(This). +%% @hidden +resumePropagation(This,PropagationLevel) -> wxEvent:resumePropagation(This,PropagationLevel). +%% @hidden +isCommandEvent(This) -> wxEvent:isCommandEvent(This). +%% @hidden +getTimestamp(This) -> wxEvent:getTimestamp(This). +%% @hidden +getSkipped(This) -> wxEvent:getSkipped(This). +%% @hidden +getId(This) -> wxEvent:getId(This). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxAuiPaneInfo.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxAuiPaneInfo.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxAuiPaneInfo.erl 2009-04-16 10:25:24.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxAuiPaneInfo.erl 2009-09-18 15:11:02.000000000 +0100 @@ -26,20 +26,20 @@ -include("wxe.hrl"). -export([bestSize/2,bestSize/3,bottom/1,bottomDockable/1,bottomDockable/2,caption/2, captionVisible/1,captionVisible/2,centre/1,centrePane/1,closeButton/1, - closeButton/2,defaultPane/1,destroyOnClose/1,destroyOnClose/2,direction/2, - dock/1,dockable/1,dockable/2,fixed/1,float/1,floatable/1,floatable/2, - floatingPosition/2,floatingPosition/3,floatingSize/2,floatingSize/3, - gripper/1,gripper/2,gripperTop/1,gripperTop/2,hasBorder/1,hasCaption/1, - hasCloseButton/1,hasFlag/2,hasGripper/1,hasGripperTop/1,hasMaximizeButton/1, - hasMinimizeButton/1,hasPinButton/1,hide/1,isBottomDockable/1,isDocked/1, - isFixed/1,isFloatable/1,isFloating/1,isLeftDockable/1,isMovable/1, + closeButton/2,defaultPane/1,destroy/1,destroyOnClose/1,destroyOnClose/2, + direction/2,dock/1,dockable/1,dockable/2,fixed/1,float/1,floatable/1, + floatable/2,floatingPosition/2,floatingPosition/3,floatingSize/2, + floatingSize/3,gripper/1,gripper/2,gripperTop/1,gripperTop/2,hasBorder/1, + hasCaption/1,hasCloseButton/1,hasFlag/2,hasGripper/1,hasGripperTop/1, + hasMaximizeButton/1,hasMinimizeButton/1,hasPinButton/1,hide/1,isBottomDockable/1, + isDocked/1,isFixed/1,isFloatable/1,isFloating/1,isLeftDockable/1,isMovable/1, isOk/1,isResizable/1,isRightDockable/1,isShown/1,isToolbar/1,isTopDockable/1, layer/2,left/1,leftDockable/1,leftDockable/2,maxSize/2,maxSize/3,maximizeButton/1, maximizeButton/2,minSize/2,minSize/3,minimizeButton/1,minimizeButton/2, - movable/1,movable/2,name/2,paneBorder/1,paneBorder/2,pinButton/1,pinButton/2, - position/2,resizable/1,resizable/2,right/1,rightDockable/1,rightDockable/2, - row/2,safeSet/2,setFlag/3,show/1,show/2,toolbarPane/1,top/1,topDockable/1, - topDockable/2,window/2]). + movable/1,movable/2,name/2,new/0,new/1,paneBorder/1,paneBorder/2,pinButton/1, + pinButton/2,position/2,resizable/1,resizable/2,right/1,rightDockable/1, + rightDockable/2,row/2,safeSet/2,setFlag/3,show/1,show/2,toolbarPane/1, + top/1,topDockable/1,topDockable/2,window/2]). %% inherited exports -export([parent_class/1]). @@ -47,6 +47,19 @@ %% @hidden parent_class(_Class) -> erlang:error({badtype, ?MODULE}). +%% @spec () -> wxAuiPaneInfo() +%% @doc See external documentation. +new() -> + wxe_util:construct(?wxAuiPaneInfo_new_0, + <<>>). + +%% @spec (C::wxAuiPaneInfo()) -> wxAuiPaneInfo() +%% @doc See external documentation. +new(#wx_ref{type=CT,ref=CRef}) -> + ?CLASS(CT,wxAuiPaneInfo), + wxe_util:construct(?wxAuiPaneInfo_new_1, + <>). + %% @spec (This::wxAuiPaneInfo(), Size::{W::integer(),H::integer()}) -> wxAuiPaneInfo() %% @doc See external documentation. bestSize(#wx_ref{type=ThisT,ref=ThisRef},{SizeW,SizeH}) @@ -764,3 +777,9 @@ wxe_util:call(?wxAuiPaneInfo_Window, <>). +%% @spec (This::wxAuiPaneInfo()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxAuiPaneInfo), + wxe_util:destroy(?wxAuiPaneInfo_destruct,Obj), + ok. diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxe_debug.hrl erlang-13.b.3-dfsg/lib/wx/src/gen/wxe_debug.hrl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxe_debug.hrl 2009-06-05 13:54:33.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxe_debug.hrl 2009-11-20 13:34:39.000000000 +0000 @@ -464,2735 +464,2816 @@ {557, {wxGrid, yToRow, 1}}, {558, {wxGridCellRenderer, draw, 7}}, {559, {wxGridCellRenderer, getBestSize, 5}}, - {560, {wxGridCellEditor, isCreated, 0}}, - {561, {wxGridCellEditor, setSize, 1}}, - {562, {wxGridCellEditor, show, 2}}, - {563, {wxGridCellEditor, paintBackground, 2}}, - {564, {wxGridCellEditor, beginEdit, 3}}, - {565, {wxGridCellEditor, endEdit, 3}}, - {566, {wxGridCellEditor, reset, 0}}, - {567, {wxGridCellEditor, startingKey, 1}}, - {568, {wxGridCellEditor, startingClick, 0}}, - {569, {wxGridCellEditor, handleReturn, 1}}, - {570, {wxGridCellAttr, setTextColour, 1}}, - {571, {wxGridCellAttr, setBackgroundColour, 1}}, - {572, {wxGridCellAttr, setFont, 1}}, - {573, {wxGridCellAttr, setAlignment, 2}}, - {574, {wxGridCellAttr, setReadOnly, 1}}, - {575, {wxGridCellAttr, setRenderer, 1}}, - {576, {wxGridCellAttr, setEditor, 1}}, - {577, {wxGridCellAttr, hasTextColour, 0}}, - {578, {wxGridCellAttr, hasBackgroundColour, 0}}, - {579, {wxGridCellAttr, hasFont, 0}}, - {580, {wxGridCellAttr, hasAlignment, 0}}, - {581, {wxGridCellAttr, hasRenderer, 0}}, - {582, {wxGridCellAttr, hasEditor, 0}}, - {583, {wxGridCellAttr, getTextColour, 0}}, - {584, {wxGridCellAttr, getBackgroundColour, 0}}, - {585, {wxGridCellAttr, getFont, 0}}, - {586, {wxGridCellAttr, getAlignment, 2}}, - {587, {wxGridCellAttr, getRenderer, 3}}, - {588, {wxGridCellAttr, getEditor, 3}}, - {589, {wxGridCellAttr, isReadOnly, 0}}, - {590, {wxGridCellAttr, setDefAttr, 1}}, - {591, {wxDC, blit, 5}}, - {592, {wxDC, calcBoundingBox, 2}}, - {593, {wxDC, clear, 0}}, - {594, {wxDC, computeScaleAndOrigin, 0}}, - {595, {wxDC, crossHair, 1}}, - {596, {wxDC, destroyClippingRegion, 0}}, - {597, {wxDC, deviceToLogicalX, 1}}, - {598, {wxDC, deviceToLogicalXRel, 1}}, - {599, {wxDC, deviceToLogicalY, 1}}, - {600, {wxDC, deviceToLogicalYRel, 1}}, - {601, {wxDC, drawArc, 3}}, - {602, {wxDC, drawBitmap, 3}}, - {603, {wxDC, drawCheckMark, 1}}, - {604, {wxDC, drawCircle, 2}}, - {606, {wxDC, drawEllipse_2, 2}}, - {607, {wxDC, drawEllipse_1, 1}}, - {608, {wxDC, drawEllipticArc, 4}}, - {609, {wxDC, drawIcon, 2}}, - {610, {wxDC, drawLabel, 3}}, - {611, {wxDC, drawLine, 2}}, - {612, {wxDC, drawLines, 3}}, - {614, {wxDC, drawPolygon, 3}}, - {616, {wxDC, drawPoint, 1}}, - {618, {wxDC, drawRectangle_2, 2}}, - {619, {wxDC, drawRectangle_1, 1}}, - {620, {wxDC, drawRotatedText, 3}}, - {622, {wxDC, drawRoundedRectangle_3, 3}}, - {623, {wxDC, drawRoundedRectangle_2, 2}}, - {624, {wxDC, drawText, 2}}, - {625, {wxDC, endDoc, 0}}, - {626, {wxDC, endPage, 0}}, - {627, {wxDC, floodFill, 3}}, - {628, {wxDC, getBackground, 0}}, - {629, {wxDC, getBackgroundMode, 0}}, - {630, {wxDC, getBrush, 0}}, - {631, {wxDC, getCharHeight, 0}}, - {632, {wxDC, getCharWidth, 0}}, - {633, {wxDC, getClippingBox, 1}}, - {634, {wxDC, getFont, 0}}, - {635, {wxDC, getLayoutDirection, 0}}, - {636, {wxDC, getLogicalFunction, 0}}, - {637, {wxDC, getMapMode, 0}}, - {638, {wxDC, getMultiLineTextExtent_4, 4}}, - {639, {wxDC, getMultiLineTextExtent_1, 1}}, - {640, {wxDC, getPartialTextExtents, 2}}, - {641, {wxDC, getPen, 0}}, - {642, {wxDC, getPixel, 2}}, - {643, {wxDC, getPPI, 0}}, - {645, {wxDC, getSize, 0}}, - {647, {wxDC, getSizeMM, 0}}, - {648, {wxDC, getTextBackground, 0}}, - {649, {wxDC, getTextExtent_4, 4}}, - {650, {wxDC, getTextExtent_1, 1}}, - {652, {wxDC, getTextForeground, 0}}, - {653, {wxDC, getUserScale, 2}}, - {654, {wxDC, gradientFillConcentric_3, 3}}, - {655, {wxDC, gradientFillConcentric_4, 4}}, - {656, {wxDC, gradientFillLinear, 4}}, - {657, {wxDC, logicalToDeviceX, 1}}, - {658, {wxDC, logicalToDeviceXRel, 1}}, - {659, {wxDC, logicalToDeviceY, 1}}, - {660, {wxDC, logicalToDeviceYRel, 1}}, - {661, {wxDC, maxX, 0}}, - {662, {wxDC, maxY, 0}}, - {663, {wxDC, minX, 0}}, - {664, {wxDC, minY, 0}}, - {665, {wxDC, isOk, 0}}, - {666, {wxDC, resetBoundingBox, 0}}, - {667, {wxDC, setAxisOrientation, 2}}, - {668, {wxDC, setBackground, 1}}, - {669, {wxDC, setBackgroundMode, 1}}, - {670, {wxDC, setBrush, 1}}, - {672, {wxDC, setClippingRegion_2, 2}}, - {673, {wxDC, setClippingRegion_1_1, 1}}, - {674, {wxDC, setClippingRegion_1_0, 1}}, - {675, {wxDC, setDeviceOrigin, 2}}, - {676, {wxDC, setFont, 1}}, - {677, {wxDC, setLayoutDirection, 1}}, - {678, {wxDC, setLogicalFunction, 1}}, - {679, {wxDC, setMapMode, 1}}, - {680, {wxDC, setPalette, 1}}, - {681, {wxDC, setPen, 1}}, - {682, {wxDC, setTextBackground, 1}}, - {683, {wxDC, setTextForeground, 1}}, - {684, {wxDC, setUserScale, 2}}, - {685, {wxDC, startDoc, 1}}, - {686, {wxDC, startPage, 0}}, - {687, {wxMirrorDC, new, 2}}, - {688, {wxMirrorDC, 'Destroy', undefined}}, - {689, {wxScreenDC, new, 0}}, - {690, {wxScreenDC, destruct, 0}}, - {691, {wxPostScriptDC, new_0, 0}}, - {692, {wxPostScriptDC, new_1, 1}}, - {693, {wxPostScriptDC, destruct, 0}}, - {694, {wxPostScriptDC, setResolution, 1}}, - {695, {wxPostScriptDC, getResolution, 0}}, - {696, {wxWindowDC, new_0, 0}}, - {697, {wxWindowDC, new_1, 1}}, - {698, {wxWindowDC, destruct, 0}}, - {699, {wxClientDC, new_0, 0}}, - {700, {wxClientDC, new_1, 1}}, - {701, {wxClientDC, 'Destroy', undefined}}, - {702, {wxPaintDC, new_0, 0}}, - {703, {wxPaintDC, new_1, 1}}, - {704, {wxPaintDC, 'Destroy', undefined}}, - {706, {wxMemoryDC, new_1_0, 1}}, - {707, {wxMemoryDC, new_1_1, 1}}, - {708, {wxMemoryDC, new_0, 0}}, - {710, {wxMemoryDC, destruct, 0}}, - {711, {wxMemoryDC, selectObject, 1}}, - {712, {wxMemoryDC, selectObjectAsSource, 1}}, - {713, {wxBufferedDC, new_0, 0}}, - {714, {wxBufferedDC, new_2, 2}}, - {715, {wxBufferedDC, new_3, 3}}, - {716, {wxBufferedDC, destruct, 0}}, - {717, {wxBufferedDC, init_2, 2}}, - {718, {wxBufferedDC, init_3, 3}}, - {719, {wxBufferedPaintDC, new_3, 3}}, - {720, {wxBufferedPaintDC, new_2, 2}}, - {721, {wxBufferedPaintDC, destruct, 0}}, - {722, {wxGraphicsObject, getRenderer, 0}}, - {723, {wxGraphicsObject, isNull, 0}}, - {724, {wxGraphicsContext, create_1_1, 1}}, - {725, {wxGraphicsContext, create_1_0, 1}}, - {726, {wxGraphicsContext, create_0, 0}}, - {727, {wxGraphicsContext, createPen, 1}}, - {728, {wxGraphicsContext, createBrush, 1}}, - {729, {wxGraphicsContext, createRadialGradientBrush, 7}}, - {730, {wxGraphicsContext, createLinearGradientBrush, 6}}, - {731, {wxGraphicsContext, createFont, 2}}, - {732, {wxGraphicsContext, createMatrix, 1}}, - {733, {wxGraphicsContext, createPath, 0}}, - {734, {wxGraphicsContext, clip_1, 1}}, - {735, {wxGraphicsContext, clip_4, 4}}, - {736, {wxGraphicsContext, resetClip, 0}}, - {737, {wxGraphicsContext, drawBitmap, 5}}, - {738, {wxGraphicsContext, drawEllipse, 4}}, - {739, {wxGraphicsContext, drawIcon, 5}}, - {740, {wxGraphicsContext, drawLines, 3}}, - {741, {wxGraphicsContext, drawPath, 2}}, - {742, {wxGraphicsContext, drawRectangle, 4}}, - {743, {wxGraphicsContext, drawRoundedRectangle, 5}}, - {744, {wxGraphicsContext, drawText_3, 3}}, - {745, {wxGraphicsContext, drawText_4_0, 4}}, - {746, {wxGraphicsContext, drawText_4_1, 4}}, - {747, {wxGraphicsContext, drawText_5, 5}}, - {748, {wxGraphicsContext, fillPath, 2}}, - {749, {wxGraphicsContext, strokePath, 1}}, - {750, {wxGraphicsContext, getNativeContext, 0}}, - {751, {wxGraphicsContext, getPartialTextExtents, 2}}, - {752, {wxGraphicsContext, getTextExtent, 5}}, - {753, {wxGraphicsContext, rotate, 1}}, - {754, {wxGraphicsContext, scale, 2}}, - {755, {wxGraphicsContext, translate, 2}}, - {756, {wxGraphicsContext, getTransform, 0}}, - {757, {wxGraphicsContext, setTransform, 1}}, - {758, {wxGraphicsContext, concatTransform, 1}}, - {759, {wxGraphicsContext, setBrush_1_1, 1}}, - {760, {wxGraphicsContext, setBrush_1_0, 1}}, - {761, {wxGraphicsContext, setFont_1, 1}}, - {762, {wxGraphicsContext, setFont_2, 2}}, - {763, {wxGraphicsContext, setPen_1_0, 1}}, - {764, {wxGraphicsContext, setPen_1_1, 1}}, - {765, {wxGraphicsContext, strokeLine, 4}}, - {766, {wxGraphicsContext, strokeLines_2, 2}}, - {767, {wxGraphicsContext, strokeLines_3, 3}}, - {768, {wxGraphicsMatrix, concat, 1}}, - {770, {wxGraphicsMatrix, get, 1}}, - {771, {wxGraphicsMatrix, getNativeMatrix, 0}}, - {772, {wxGraphicsMatrix, invert, 0}}, - {773, {wxGraphicsMatrix, isEqual, 1}}, - {775, {wxGraphicsMatrix, isIdentity, 0}}, - {776, {wxGraphicsMatrix, rotate, 1}}, - {777, {wxGraphicsMatrix, scale, 2}}, - {778, {wxGraphicsMatrix, translate, 2}}, - {779, {wxGraphicsMatrix, set, 1}}, - {780, {wxGraphicsMatrix, transformPoint, 2}}, - {781, {wxGraphicsMatrix, transformDistance, 2}}, - {782, {wxGraphicsPath, moveToPoint_2, 2}}, - {783, {wxGraphicsPath, moveToPoint_1, 1}}, - {784, {wxGraphicsPath, addArc_6, 6}}, - {785, {wxGraphicsPath, addArc_5, 5}}, - {786, {wxGraphicsPath, addArcToPoint, 5}}, - {787, {wxGraphicsPath, addCircle, 3}}, - {788, {wxGraphicsPath, addCurveToPoint_6, 6}}, - {789, {wxGraphicsPath, addCurveToPoint_3, 3}}, - {790, {wxGraphicsPath, addEllipse, 4}}, - {791, {wxGraphicsPath, addLineToPoint_2, 2}}, - {792, {wxGraphicsPath, addLineToPoint_1, 1}}, - {793, {wxGraphicsPath, addPath, 1}}, - {794, {wxGraphicsPath, addQuadCurveToPoint, 4}}, - {795, {wxGraphicsPath, addRectangle, 4}}, - {796, {wxGraphicsPath, addRoundedRectangle, 5}}, - {797, {wxGraphicsPath, closeSubpath, 0}}, - {798, {wxGraphicsPath, contains_3, 3}}, - {799, {wxGraphicsPath, contains_2, 2}}, - {801, {wxGraphicsPath, getBox, 0}}, - {803, {wxGraphicsPath, getCurrentPoint, 0}}, - {804, {wxGraphicsPath, transform, 1}}, - {805, {wxGraphicsRenderer, getDefaultRenderer, 0}}, - {806, {wxGraphicsRenderer, createContext_1_1, 1}}, - {807, {wxGraphicsRenderer, createContext_1_0, 1}}, - {808, {wxGraphicsRenderer, createPen, 1}}, - {809, {wxGraphicsRenderer, createBrush, 1}}, - {810, {wxGraphicsRenderer, createLinearGradientBrush, 6}}, - {811, {wxGraphicsRenderer, createRadialGradientBrush, 7}}, - {812, {wxGraphicsRenderer, createFont, 2}}, - {813, {wxGraphicsRenderer, createMatrix, 1}}, - {814, {wxGraphicsRenderer, createPath, 0}}, - {816, {wxMenuBar, new_1, 1}}, - {818, {wxMenuBar, new_0, 0}}, - {820, {wxMenuBar, destruct, 0}}, - {821, {wxMenuBar, append, 2}}, - {822, {wxMenuBar, check, 2}}, - {823, {wxMenuBar, enable_2, 2}}, - {824, {wxMenuBar, enable_1, 1}}, - {825, {wxMenuBar, enableTop, 2}}, - {826, {wxMenuBar, findMenu, 1}}, - {827, {wxMenuBar, findMenuItem, 2}}, - {828, {wxMenuBar, findItem, 2}}, - {829, {wxMenuBar, getHelpString, 1}}, - {830, {wxMenuBar, getLabel_1, 1}}, - {831, {wxMenuBar, getLabel_0, 0}}, - {832, {wxMenuBar, getLabelTop, 1}}, - {833, {wxMenuBar, getMenu, 1}}, - {834, {wxMenuBar, getMenuCount, 0}}, - {835, {wxMenuBar, insert, 3}}, - {836, {wxMenuBar, isChecked, 1}}, - {837, {wxMenuBar, isEnabled_1, 1}}, - {838, {wxMenuBar, isEnabled_0, 0}}, - {839, {wxMenuBar, remove, 1}}, - {840, {wxMenuBar, replace, 3}}, - {841, {wxMenuBar, setHelpString, 2}}, - {842, {wxMenuBar, setLabel_2, 2}}, - {843, {wxMenuBar, setLabel_1, 1}}, - {844, {wxMenuBar, setLabelTop, 2}}, - {845, {wxControl, getLabel, 0}}, - {846, {wxControl, setLabel, 1}}, - {847, {wxControlWithItems, append_1, 1}}, - {848, {wxControlWithItems, append_2, 2}}, - {849, {wxControlWithItems, appendStrings_1, 1}}, - {850, {wxControlWithItems, clear, 0}}, - {851, {wxControlWithItems, delete, 1}}, - {852, {wxControlWithItems, findString, 2}}, - {854, {wxControlWithItems, getClientData, 1}}, - {856, {wxControlWithItems, setClientData, 2}}, - {857, {wxControlWithItems, getCount, 0}}, - {858, {wxControlWithItems, getSelection, 0}}, - {859, {wxControlWithItems, getString, 1}}, - {860, {wxControlWithItems, getStringSelection, 0}}, - {861, {wxControlWithItems, insert_2, 2}}, - {862, {wxControlWithItems, insert_3, 3}}, - {863, {wxControlWithItems, isEmpty, 0}}, - {864, {wxControlWithItems, select, 1}}, - {865, {wxControlWithItems, setSelection, 1}}, - {866, {wxControlWithItems, setString, 2}}, - {867, {wxControlWithItems, setStringSelection, 1}}, - {870, {wxMenu, new_2, 2}}, - {871, {wxMenu, new_1, 1}}, - {873, {wxMenu, destruct, 0}}, - {874, {wxMenu, append_3, 3}}, - {875, {wxMenu, append_1, 1}}, - {876, {wxMenu, append_4_0, 4}}, - {877, {wxMenu, append_4_1, 4}}, - {878, {wxMenu, appendCheckItem, 3}}, - {879, {wxMenu, appendRadioItem, 3}}, - {880, {wxMenu, appendSeparator, 0}}, - {881, {wxMenu, break, 0}}, - {882, {wxMenu, check, 2}}, - {883, {wxMenu, delete_1_0, 1}}, - {884, {wxMenu, delete_1_1, 1}}, - {885, {wxMenu, destroy_1_0, 1}}, - {886, {wxMenu, destroy_1_1, 1}}, - {887, {wxMenu, enable, 2}}, - {888, {wxMenu, findItem_1, 1}}, - {889, {wxMenu, findItem_2, 2}}, - {890, {wxMenu, findItemByPosition, 1}}, - {891, {wxMenu, getHelpString, 1}}, - {892, {wxMenu, getLabel, 1}}, - {893, {wxMenu, getMenuItemCount, 0}}, - {894, {wxMenu, getMenuItems, 0}}, - {896, {wxMenu, getTitle, 0}}, - {897, {wxMenu, insert_2, 2}}, - {898, {wxMenu, insert_3, 3}}, - {899, {wxMenu, insert_5_1, 5}}, - {900, {wxMenu, insert_5_0, 5}}, - {901, {wxMenu, insertCheckItem, 4}}, - {902, {wxMenu, insertRadioItem, 4}}, - {903, {wxMenu, insertSeparator, 1}}, - {904, {wxMenu, isChecked, 1}}, - {905, {wxMenu, isEnabled, 1}}, - {906, {wxMenu, prepend_1, 1}}, - {907, {wxMenu, prepend_2, 2}}, - {908, {wxMenu, prepend_4_1, 4}}, - {909, {wxMenu, prepend_4_0, 4}}, - {910, {wxMenu, prependCheckItem, 3}}, - {911, {wxMenu, prependRadioItem, 3}}, - {912, {wxMenu, prependSeparator, 0}}, - {913, {wxMenu, remove_1_0, 1}}, - {914, {wxMenu, remove_1_1, 1}}, - {915, {wxMenu, setHelpString, 2}}, - {916, {wxMenu, setLabel, 2}}, - {917, {wxMenu, setTitle, 1}}, - {918, {wxMenuItem, new, 1}}, - {920, {wxMenuItem, destruct, 0}}, - {921, {wxMenuItem, check, 1}}, - {922, {wxMenuItem, enable, 1}}, - {923, {wxMenuItem, getBitmap, 0}}, - {924, {wxMenuItem, getHelp, 0}}, - {925, {wxMenuItem, getId, 0}}, - {926, {wxMenuItem, getKind, 0}}, - {927, {wxMenuItem, getLabel, 0}}, - {928, {wxMenuItem, getLabelFromText, 1}}, - {929, {wxMenuItem, getMenu, 0}}, - {930, {wxMenuItem, getText, 0}}, - {931, {wxMenuItem, getSubMenu, 0}}, - {932, {wxMenuItem, isCheckable, 0}}, - {933, {wxMenuItem, isChecked, 0}}, - {934, {wxMenuItem, isEnabled, 0}}, - {935, {wxMenuItem, isSeparator, 0}}, - {936, {wxMenuItem, isSubMenu, 0}}, - {937, {wxMenuItem, setBitmap, 1}}, - {938, {wxMenuItem, setHelp, 1}}, - {939, {wxMenuItem, setMenu, 1}}, - {940, {wxMenuItem, setSubMenu, 1}}, - {941, {wxMenuItem, setText, 1}}, - {942, {wxToolBar, addControl, 1}}, - {943, {wxToolBar, addSeparator, 0}}, - {944, {wxToolBar, addTool_5, 5}}, - {945, {wxToolBar, addTool_4_0, 4}}, - {946, {wxToolBar, addTool_1, 1}}, - {947, {wxToolBar, addTool_4_1, 4}}, - {948, {wxToolBar, addTool_3, 3}}, - {949, {wxToolBar, addTool_6, 6}}, - {950, {wxToolBar, addCheckTool, 4}}, - {951, {wxToolBar, addRadioTool, 4}}, - {952, {wxToolBar, deleteTool, 1}}, - {953, {wxToolBar, deleteToolByPos, 1}}, - {954, {wxToolBar, enableTool, 2}}, - {955, {wxToolBar, findById, 1}}, - {956, {wxToolBar, findControl, 1}}, - {957, {wxToolBar, findToolForPosition, 2}}, - {958, {wxToolBar, getToolSize, 0}}, - {959, {wxToolBar, getToolBitmapSize, 0}}, - {960, {wxToolBar, getMargins, 0}}, - {961, {wxToolBar, getToolEnabled, 1}}, - {962, {wxToolBar, getToolLongHelp, 1}}, - {963, {wxToolBar, getToolPacking, 0}}, - {964, {wxToolBar, getToolPos, 1}}, - {965, {wxToolBar, getToolSeparation, 0}}, - {966, {wxToolBar, getToolShortHelp, 1}}, - {967, {wxToolBar, getToolState, 1}}, - {968, {wxToolBar, insertControl, 2}}, - {969, {wxToolBar, insertSeparator, 1}}, - {970, {wxToolBar, insertTool_5, 5}}, - {971, {wxToolBar, insertTool_2, 2}}, - {972, {wxToolBar, insertTool_4, 4}}, - {973, {wxToolBar, realize, 0}}, - {974, {wxToolBar, removeTool, 1}}, - {975, {wxToolBar, setMargins, 2}}, - {976, {wxToolBar, setToolBitmapSize, 1}}, - {977, {wxToolBar, setToolLongHelp, 2}}, - {978, {wxToolBar, setToolPacking, 1}}, - {979, {wxToolBar, setToolShortHelp, 2}}, - {980, {wxToolBar, setToolSeparation, 1}}, - {981, {wxToolBar, toggleTool, 2}}, - {983, {wxStatusBar, new_0, 0}}, - {984, {wxStatusBar, new_2, 2}}, - {986, {wxStatusBar, destruct, 0}}, - {987, {wxStatusBar, create, 2}}, - {988, {wxStatusBar, getFieldRect, 2}}, - {989, {wxStatusBar, getFieldsCount, 0}}, - {990, {wxStatusBar, getStatusText, 1}}, - {991, {wxStatusBar, popStatusText, 1}}, - {992, {wxStatusBar, pushStatusText, 2}}, - {993, {wxStatusBar, setFieldsCount, 2}}, - {994, {wxStatusBar, setMinHeight, 1}}, - {995, {wxStatusBar, setStatusText, 2}}, - {996, {wxStatusBar, setStatusWidths, 2}}, - {997, {wxStatusBar, setStatusStyles, 2}}, - {998, {wxBitmap, new_0, 0}}, - {999, {wxBitmap, new_3, 3}}, - {1000, {wxBitmap, new_4, 4}}, - {1001, {wxBitmap, new_2_0, 2}}, - {1002, {wxBitmap, new_2_1, 2}}, - {1003, {wxBitmap, destruct, 0}}, - {1004, {wxBitmap, convertToImage, 0}}, - {1005, {wxBitmap, copyFromIcon, 1}}, - {1006, {wxBitmap, create, 3}}, - {1007, {wxBitmap, getDepth, 0}}, - {1008, {wxBitmap, getHeight, 0}}, - {1009, {wxBitmap, getPalette, 0}}, - {1010, {wxBitmap, getMask, 0}}, - {1011, {wxBitmap, getWidth, 0}}, - {1012, {wxBitmap, getSubBitmap, 1}}, - {1013, {wxBitmap, loadFile, 2}}, - {1014, {wxBitmap, ok, 0}}, - {1015, {wxBitmap, saveFile, 3}}, - {1016, {wxBitmap, setDepth, 1}}, - {1017, {wxBitmap, setHeight, 1}}, - {1018, {wxBitmap, setMask, 1}}, - {1019, {wxBitmap, setPalette, 1}}, - {1020, {wxBitmap, setWidth, 1}}, - {1021, {wxIcon, new_0, 0}}, - {1022, {wxIcon, new_2, 2}}, - {1023, {wxIcon, new_1, 1}}, - {1024, {wxIcon, copyFromBitmap, 1}}, - {1025, {wxIcon, 'Destroy', undefined}}, - {1026, {wxIconBundle, new_0, 0}}, - {1027, {wxIconBundle, new_2, 2}}, - {1028, {wxIconBundle, new_1_0, 1}}, - {1029, {wxIconBundle, new_1_1, 1}}, - {1030, {wxIconBundle, destruct, 0}}, - {1031, {wxIconBundle, addIcon_2, 2}}, - {1032, {wxIconBundle, addIcon_1, 1}}, - {1033, {wxIconBundle, getIcon_1_1, 1}}, - {1034, {wxIconBundle, getIcon_1_0, 1}}, - {1035, {wxCursor, new_0, 0}}, - {1036, {wxCursor, new_1_0, 1}}, - {1037, {wxCursor, new_1_1, 1}}, - {1038, {wxCursor, new_4, 4}}, - {1039, {wxCursor, destruct, 0}}, - {1040, {wxCursor, ok, 0}}, - {1041, {wxMask, new_0, 0}}, - {1042, {wxMask, new_2_1, 2}}, - {1043, {wxMask, new_2_0, 2}}, - {1044, {wxMask, new_1, 1}}, - {1045, {wxMask, destruct, 0}}, - {1046, {wxMask, create_2_1, 2}}, - {1047, {wxMask, create_2_0, 2}}, - {1048, {wxMask, create_1, 1}}, - {1049, {wxImage, new_0, 0}}, - {1050, {wxImage, new_3_0, 3}}, - {1051, {wxImage, new_4, 4}}, - {1052, {wxImage, new_5, 5}}, - {1053, {wxImage, new_2, 2}}, - {1054, {wxImage, new_3_1, 3}}, - {1055, {wxImage, blur, 1}}, - {1056, {wxImage, blurHorizontal, 1}}, - {1057, {wxImage, blurVertical, 1}}, - {1058, {wxImage, convertAlphaToMask, 1}}, - {1059, {wxImage, convertToGreyscale, 1}}, - {1060, {wxImage, convertToMono, 3}}, - {1061, {wxImage, copy, 0}}, - {1062, {wxImage, create_3, 3}}, - {1063, {wxImage, create_4, 4}}, - {1064, {wxImage, create_5, 5}}, - {1065, {wxImage, 'Destroy', 0}}, - {1066, {wxImage, findFirstUnusedColour, 4}}, - {1067, {wxImage, getImageExtWildcard, 0}}, - {1068, {wxImage, getAlpha_2, 2}}, - {1069, {wxImage, getAlpha_0, 0}}, - {1070, {wxImage, getBlue, 2}}, - {1071, {wxImage, getData, 0}}, - {1072, {wxImage, getGreen, 2}}, - {1073, {wxImage, getImageCount, 2}}, - {1074, {wxImage, getHeight, 0}}, - {1075, {wxImage, getMaskBlue, 0}}, - {1076, {wxImage, getMaskGreen, 0}}, - {1077, {wxImage, getMaskRed, 0}}, - {1078, {wxImage, getOrFindMaskColour, 3}}, - {1079, {wxImage, getPalette, 0}}, - {1080, {wxImage, getRed, 2}}, - {1081, {wxImage, getSubImage, 1}}, - {1082, {wxImage, getWidth, 0}}, - {1083, {wxImage, hasAlpha, 0}}, - {1084, {wxImage, hasMask, 0}}, - {1085, {wxImage, getOption, 1}}, - {1086, {wxImage, getOptionInt, 1}}, - {1087, {wxImage, hasOption, 1}}, - {1088, {wxImage, initAlpha, 0}}, - {1089, {wxImage, initStandardHandlers, 0}}, - {1090, {wxImage, isTransparent, 3}}, - {1091, {wxImage, loadFile_2, 2}}, - {1092, {wxImage, loadFile_3, 3}}, - {1093, {wxImage, ok, 0}}, - {1094, {wxImage, removeHandler, 1}}, - {1095, {wxImage, mirror, 1}}, - {1096, {wxImage, replace, 6}}, - {1097, {wxImage, rescale, 3}}, - {1098, {wxImage, resize, 3}}, - {1099, {wxImage, rotate, 3}}, - {1100, {wxImage, rotateHue, 1}}, - {1101, {wxImage, rotate90, 1}}, - {1102, {wxImage, saveFile_1, 1}}, - {1103, {wxImage, saveFile_2_0, 2}}, - {1104, {wxImage, saveFile_2_1, 2}}, - {1105, {wxImage, scale, 3}}, - {1106, {wxImage, size, 3}}, - {1107, {wxImage, setAlpha_3, 3}}, - {1108, {wxImage, setAlpha_2, 2}}, - {1109, {wxImage, setData_2, 2}}, - {1110, {wxImage, setData_4, 4}}, - {1111, {wxImage, setMask, 1}}, - {1112, {wxImage, setMaskColour, 3}}, - {1113, {wxImage, setMaskFromImage, 4}}, - {1114, {wxImage, setOption_2_1, 2}}, - {1115, {wxImage, setOption_2_0, 2}}, - {1116, {wxImage, setPalette, 1}}, - {1117, {wxImage, setRGB_5, 5}}, - {1118, {wxImage, setRGB_4, 4}}, - {1119, {wxImage, 'Destroy', undefined}}, - {1120, {wxBrush, new_0, 0}}, - {1121, {wxBrush, new_2, 2}}, - {1122, {wxBrush, new_1, 1}}, - {1124, {wxBrush, destruct, 0}}, - {1125, {wxBrush, getColour, 0}}, - {1126, {wxBrush, getStipple, 0}}, - {1127, {wxBrush, getStyle, 0}}, - {1128, {wxBrush, isHatch, 0}}, - {1129, {wxBrush, isOk, 0}}, - {1130, {wxBrush, setColour_1, 1}}, - {1131, {wxBrush, setColour_3, 3}}, - {1132, {wxBrush, setStipple, 1}}, - {1133, {wxBrush, setStyle, 1}}, - {1134, {wxPen, new_0, 0}}, - {1135, {wxPen, new_2, 2}}, - {1136, {wxPen, destruct, 0}}, - {1137, {wxPen, getCap, 0}}, - {1138, {wxPen, getColour, 0}}, - {1139, {wxPen, getJoin, 0}}, - {1140, {wxPen, getStyle, 0}}, - {1141, {wxPen, getWidth, 0}}, - {1142, {wxPen, isOk, 0}}, - {1143, {wxPen, setCap, 1}}, - {1144, {wxPen, setColour_1, 1}}, - {1145, {wxPen, setColour_3, 3}}, - {1146, {wxPen, setJoin, 1}}, - {1147, {wxPen, setStyle, 1}}, - {1148, {wxPen, setWidth, 1}}, - {1149, {wxRegion, new_0, 0}}, - {1150, {wxRegion, new_4, 4}}, - {1151, {wxRegion, new_2, 2}}, - {1152, {wxRegion, new_1_1, 1}}, - {1154, {wxRegion, new_1_0, 1}}, - {1156, {wxRegion, destruct, 0}}, - {1157, {wxRegion, clear, 0}}, - {1158, {wxRegion, contains_2, 2}}, - {1159, {wxRegion, contains_1_0, 1}}, - {1160, {wxRegion, contains_4, 4}}, - {1161, {wxRegion, contains_1_1, 1}}, - {1162, {wxRegion, convertToBitmap, 0}}, - {1163, {wxRegion, getBox, 0}}, - {1164, {wxRegion, intersect_4, 4}}, - {1165, {wxRegion, intersect_1_1, 1}}, - {1166, {wxRegion, intersect_1_0, 1}}, - {1167, {wxRegion, isEmpty, 0}}, - {1168, {wxRegion, subtract_4, 4}}, - {1169, {wxRegion, subtract_1_1, 1}}, - {1170, {wxRegion, subtract_1_0, 1}}, - {1171, {wxRegion, offset_2, 2}}, - {1172, {wxRegion, offset_1, 1}}, - {1173, {wxRegion, union_4, 4}}, - {1174, {wxRegion, union_1_2, 1}}, - {1175, {wxRegion, union_1_1, 1}}, - {1176, {wxRegion, union_1_0, 1}}, - {1177, {wxRegion, union_3, 3}}, - {1178, {wxRegion, xor_4, 4}}, - {1179, {wxRegion, xor_1_1, 1}}, - {1180, {wxRegion, xor_1_0, 1}}, - {1181, {wxAcceleratorTable, new_0, 0}}, - {1182, {wxAcceleratorTable, new_2, 2}}, - {1183, {wxAcceleratorTable, destruct, 0}}, - {1184, {wxAcceleratorTable, ok, 0}}, - {1185, {wxAcceleratorEntry, new_1_0, 1}}, - {1186, {wxAcceleratorEntry, new_1_1, 1}}, - {1187, {wxAcceleratorEntry, getCommand, 0}}, - {1188, {wxAcceleratorEntry, getFlags, 0}}, - {1189, {wxAcceleratorEntry, getKeyCode, 0}}, - {1190, {wxAcceleratorEntry, set, 4}}, - {1191, {wxAcceleratorEntry, 'Destroy', undefined}}, - {1196, {wxCaret, new_3, 3}}, - {1197, {wxCaret, new_2, 2}}, - {1199, {wxCaret, destruct, 0}}, - {1200, {wxCaret, create_3, 3}}, - {1201, {wxCaret, create_2, 2}}, - {1202, {wxCaret, getBlinkTime, 0}}, - {1204, {wxCaret, getPosition, 0}}, - {1206, {wxCaret, getSize, 0}}, - {1207, {wxCaret, getWindow, 0}}, - {1208, {wxCaret, hide, 0}}, - {1209, {wxCaret, isOk, 0}}, - {1210, {wxCaret, isVisible, 0}}, - {1211, {wxCaret, move_2, 2}}, - {1212, {wxCaret, move_1, 1}}, - {1213, {wxCaret, setBlinkTime, 1}}, - {1214, {wxCaret, setSize_2, 2}}, - {1215, {wxCaret, setSize_1, 1}}, - {1216, {wxCaret, show, 1}}, - {1217, {wxSizer, add_2_1, 2}}, - {1218, {wxSizer, add_2_0, 2}}, - {1219, {wxSizer, add_3, 3}}, - {1220, {wxSizer, add_2_3, 2}}, - {1221, {wxSizer, add_2_2, 2}}, - {1222, {wxSizer, addSpacer, 1}}, - {1223, {wxSizer, addStretchSpacer, 1}}, - {1224, {wxSizer, calcMin, 0}}, - {1225, {wxSizer, clear, 1}}, - {1226, {wxSizer, detach_1_2, 1}}, - {1227, {wxSizer, detach_1_1, 1}}, - {1228, {wxSizer, detach_1_0, 1}}, - {1229, {wxSizer, fit, 1}}, - {1230, {wxSizer, fitInside, 1}}, - {1231, {wxSizer, getChildren, 0}}, - {1232, {wxSizer, getItem_2_1, 2}}, - {1233, {wxSizer, getItem_2_0, 2}}, - {1234, {wxSizer, getItem_1, 1}}, - {1235, {wxSizer, getSize, 0}}, - {1236, {wxSizer, getPosition, 0}}, - {1237, {wxSizer, getMinSize, 0}}, - {1238, {wxSizer, hide_2_0, 2}}, - {1239, {wxSizer, hide_2_1, 2}}, - {1240, {wxSizer, hide_1, 1}}, - {1241, {wxSizer, insert_3_1, 3}}, - {1242, {wxSizer, insert_3_0, 3}}, - {1243, {wxSizer, insert_4, 4}}, - {1244, {wxSizer, insert_3_3, 3}}, - {1245, {wxSizer, insert_3_2, 3}}, - {1246, {wxSizer, insert_2, 2}}, - {1247, {wxSizer, insertSpacer, 2}}, - {1248, {wxSizer, insertStretchSpacer, 2}}, - {1249, {wxSizer, isShown_1_2, 1}}, - {1250, {wxSizer, isShown_1_1, 1}}, - {1251, {wxSizer, isShown_1_0, 1}}, - {1252, {wxSizer, layout, 0}}, - {1253, {wxSizer, prepend_2_1, 2}}, - {1254, {wxSizer, prepend_2_0, 2}}, - {1255, {wxSizer, prepend_3, 3}}, - {1256, {wxSizer, prepend_2_3, 2}}, - {1257, {wxSizer, prepend_2_2, 2}}, - {1258, {wxSizer, prepend_1, 1}}, - {1259, {wxSizer, prependSpacer, 1}}, - {1260, {wxSizer, prependStretchSpacer, 1}}, - {1261, {wxSizer, recalcSizes, 0}}, - {1262, {wxSizer, remove_1_1, 1}}, - {1263, {wxSizer, remove_1_0, 1}}, - {1264, {wxSizer, replace_3_1, 3}}, - {1265, {wxSizer, replace_3_0, 3}}, - {1266, {wxSizer, replace_2, 2}}, - {1267, {wxSizer, setDimension, 4}}, - {1268, {wxSizer, setMinSize_2, 2}}, - {1269, {wxSizer, setMinSize_1, 1}}, - {1270, {wxSizer, setItemMinSize_3_2, 3}}, - {1271, {wxSizer, setItemMinSize_2_2, 2}}, - {1272, {wxSizer, setItemMinSize_3_1, 3}}, - {1273, {wxSizer, setItemMinSize_2_1, 2}}, - {1274, {wxSizer, setItemMinSize_3_0, 3}}, - {1275, {wxSizer, setItemMinSize_2_0, 2}}, - {1276, {wxSizer, setSizeHints, 1}}, - {1277, {wxSizer, setVirtualSizeHints, 1}}, - {1278, {wxSizer, show_2_2, 2}}, - {1279, {wxSizer, show_2_1, 2}}, - {1280, {wxSizer, show_2_0, 2}}, - {1281, {wxSizer, show_1, 1}}, - {1282, {wxSizerFlags, new, 1}}, - {1283, {wxSizerFlags, align, 1}}, - {1284, {wxSizerFlags, border_2, 2}}, - {1285, {wxSizerFlags, border_1, 1}}, - {1286, {wxSizerFlags, center, 0}}, - {1287, {wxSizerFlags, centre, 0}}, - {1288, {wxSizerFlags, expand, 0}}, - {1289, {wxSizerFlags, left, 0}}, - {1290, {wxSizerFlags, proportion, 1}}, - {1291, {wxSizerFlags, right, 0}}, - {1292, {wxSizerFlags, 'Destroy', undefined}}, - {1293, {wxSizerItem, new_5_1, 5}}, - {1294, {wxSizerItem, new_2_1, 2}}, - {1295, {wxSizerItem, new_5_0, 5}}, - {1296, {wxSizerItem, new_2_0, 2}}, - {1297, {wxSizerItem, new_6, 6}}, - {1298, {wxSizerItem, new_3, 3}}, - {1299, {wxSizerItem, new_0, 0}}, - {1300, {wxSizerItem, destruct, 0}}, - {1301, {wxSizerItem, calcMin, 0}}, - {1302, {wxSizerItem, deleteWindows, 0}}, - {1303, {wxSizerItem, detachSizer, 0}}, - {1304, {wxSizerItem, getBorder, 0}}, - {1305, {wxSizerItem, getFlag, 0}}, - {1306, {wxSizerItem, getMinSize, 0}}, - {1307, {wxSizerItem, getPosition, 0}}, - {1308, {wxSizerItem, getProportion, 0}}, - {1309, {wxSizerItem, getRatio, 0}}, - {1310, {wxSizerItem, getRect, 0}}, - {1311, {wxSizerItem, getSize, 0}}, - {1312, {wxSizerItem, getSizer, 0}}, - {1313, {wxSizerItem, getSpacer, 0}}, - {1314, {wxSizerItem, getUserData, 0}}, - {1315, {wxSizerItem, getWindow, 0}}, - {1316, {wxSizerItem, isSizer, 0}}, - {1317, {wxSizerItem, isShown, 0}}, - {1318, {wxSizerItem, isSpacer, 0}}, - {1319, {wxSizerItem, isWindow, 0}}, - {1320, {wxSizerItem, setBorder, 1}}, - {1321, {wxSizerItem, setDimension, 2}}, - {1322, {wxSizerItem, setFlag, 1}}, - {1323, {wxSizerItem, setInitSize, 2}}, - {1324, {wxSizerItem, setMinSize_1, 1}}, - {1325, {wxSizerItem, setMinSize_2, 2}}, - {1326, {wxSizerItem, setProportion, 1}}, - {1327, {wxSizerItem, setRatio_2, 2}}, - {1328, {wxSizerItem, setRatio_1_1, 1}}, - {1329, {wxSizerItem, setRatio_1_0, 1}}, - {1330, {wxSizerItem, setSizer, 1}}, - {1331, {wxSizerItem, setSpacer_1, 1}}, - {1332, {wxSizerItem, setSpacer_2, 2}}, - {1333, {wxSizerItem, setWindow, 1}}, - {1334, {wxSizerItem, show, 1}}, - {1335, {wxBoxSizer, new, 1}}, - {1336, {wxBoxSizer, getOrientation, 0}}, - {1337, {wxBoxSizer, 'Destroy', undefined}}, - {1338, {wxStaticBoxSizer, new_2, 2}}, - {1339, {wxStaticBoxSizer, new_3, 3}}, - {1340, {wxStaticBoxSizer, getStaticBox, 0}}, - {1341, {wxStaticBoxSizer, 'Destroy', undefined}}, - {1342, {wxGridSizer, new_4, 4}}, - {1343, {wxGridSizer, new_2, 2}}, - {1344, {wxGridSizer, getCols, 0}}, - {1345, {wxGridSizer, getHGap, 0}}, - {1346, {wxGridSizer, getRows, 0}}, - {1347, {wxGridSizer, getVGap, 0}}, - {1348, {wxGridSizer, setCols, 1}}, - {1349, {wxGridSizer, setHGap, 1}}, - {1350, {wxGridSizer, setRows, 1}}, - {1351, {wxGridSizer, setVGap, 1}}, - {1352, {wxGridSizer, 'Destroy', undefined}}, - {1353, {wxFlexGridSizer, new_4, 4}}, - {1354, {wxFlexGridSizer, new_2, 2}}, - {1355, {wxFlexGridSizer, addGrowableCol, 2}}, - {1356, {wxFlexGridSizer, addGrowableRow, 2}}, - {1357, {wxFlexGridSizer, getFlexibleDirection, 0}}, - {1358, {wxFlexGridSizer, getNonFlexibleGrowMode, 0}}, - {1359, {wxFlexGridSizer, removeGrowableCol, 1}}, - {1360, {wxFlexGridSizer, removeGrowableRow, 1}}, - {1361, {wxFlexGridSizer, setFlexibleDirection, 1}}, - {1362, {wxFlexGridSizer, setNonFlexibleGrowMode, 1}}, - {1363, {wxFlexGridSizer, 'Destroy', undefined}}, - {1364, {wxGridBagSizer, new, 1}}, - {1365, {wxGridBagSizer, add_3_2, 3}}, - {1366, {wxGridBagSizer, add_3_1, 3}}, - {1367, {wxGridBagSizer, add_4, 4}}, - {1368, {wxGridBagSizer, add_1_0, 1}}, - {1369, {wxGridBagSizer, add_2_1, 2}}, - {1370, {wxGridBagSizer, add_2_0, 2}}, - {1371, {wxGridBagSizer, add_3_0, 3}}, - {1372, {wxGridBagSizer, add_1_1, 1}}, - {1373, {wxGridBagSizer, calcMin, 0}}, - {1374, {wxGridBagSizer, checkForIntersection_2, 2}}, - {1375, {wxGridBagSizer, checkForIntersection_3, 3}}, - {1376, {wxGridBagSizer, findItem_1_1, 1}}, - {1377, {wxGridBagSizer, findItem_1_0, 1}}, - {1378, {wxGridBagSizer, findItemAtPoint, 1}}, - {1379, {wxGridBagSizer, findItemAtPosition, 1}}, - {1380, {wxGridBagSizer, findItemWithData, 1}}, - {1381, {wxGridBagSizer, getCellSize, 2}}, - {1382, {wxGridBagSizer, getEmptyCellSize, 0}}, - {1383, {wxGridBagSizer, getItemPosition_1_2, 1}}, - {1384, {wxGridBagSizer, getItemPosition_1_1, 1}}, - {1385, {wxGridBagSizer, getItemPosition_1_0, 1}}, - {1386, {wxGridBagSizer, getItemSpan_1_2, 1}}, - {1387, {wxGridBagSizer, getItemSpan_1_1, 1}}, - {1388, {wxGridBagSizer, getItemSpan_1_0, 1}}, - {1389, {wxGridBagSizer, setEmptyCellSize, 1}}, - {1390, {wxGridBagSizer, setItemPosition_2_2, 2}}, - {1391, {wxGridBagSizer, setItemPosition_2_1, 2}}, - {1392, {wxGridBagSizer, setItemPosition_2_0, 2}}, - {1393, {wxGridBagSizer, setItemSpan_2_2, 2}}, - {1394, {wxGridBagSizer, setItemSpan_2_1, 2}}, - {1395, {wxGridBagSizer, setItemSpan_2_0, 2}}, - {1396, {wxGridBagSizer, 'Destroy', undefined}}, - {1397, {wxStdDialogButtonSizer, new, 0}}, - {1398, {wxStdDialogButtonSizer, addButton, 1}}, - {1399, {wxStdDialogButtonSizer, realize, 0}}, - {1400, {wxStdDialogButtonSizer, setAffirmativeButton, 1}}, - {1401, {wxStdDialogButtonSizer, setCancelButton, 1}}, - {1402, {wxStdDialogButtonSizer, setNegativeButton, 1}}, - {1403, {wxStdDialogButtonSizer, 'Destroy', undefined}}, - {1404, {wxFont, new_0, 0}}, - {1405, {wxFont, new_1, 1}}, - {1406, {wxFont, new_5, 5}}, - {1408, {wxFont, destruct, 0}}, - {1409, {wxFont, isFixedWidth, 0}}, - {1410, {wxFont, getDefaultEncoding, 0}}, - {1411, {wxFont, getFaceName, 0}}, - {1412, {wxFont, getFamily, 0}}, - {1413, {wxFont, getNativeFontInfoDesc, 0}}, - {1414, {wxFont, getNativeFontInfoUserDesc, 0}}, - {1415, {wxFont, getPointSize, 0}}, - {1416, {wxFont, getStyle, 0}}, - {1417, {wxFont, getUnderlined, 0}}, - {1418, {wxFont, getWeight, 0}}, - {1419, {wxFont, ok, 0}}, - {1420, {wxFont, setDefaultEncoding, 1}}, - {1421, {wxFont, setFaceName, 1}}, - {1422, {wxFont, setFamily, 1}}, - {1423, {wxFont, setPointSize, 1}}, - {1424, {wxFont, setStyle, 1}}, - {1425, {wxFont, setUnderlined, 1}}, - {1426, {wxFont, setWeight, 1}}, - {1427, {wxToolTip, enable, 1}}, - {1428, {wxToolTip, setDelay, 1}}, - {1429, {wxToolTip, new, 1}}, - {1430, {wxToolTip, setTip, 1}}, - {1431, {wxToolTip, getTip, 0}}, - {1432, {wxToolTip, getWindow, 0}}, - {1433, {wxToolTip, 'Destroy', undefined}}, - {1435, {wxButton, new_3, 3}}, - {1436, {wxButton, new_0, 0}}, - {1437, {wxButton, destruct, 0}}, - {1438, {wxButton, create, 3}}, - {1439, {wxButton, getDefaultSize, 0}}, - {1440, {wxButton, setDefault, 0}}, - {1441, {wxButton, setLabel, 1}}, - {1443, {wxBitmapButton, new_4, 4}}, - {1444, {wxBitmapButton, new_0, 0}}, - {1445, {wxBitmapButton, create, 4}}, - {1446, {wxBitmapButton, getBitmapDisabled, 0}}, - {1448, {wxBitmapButton, getBitmapFocus, 0}}, - {1450, {wxBitmapButton, getBitmapLabel, 0}}, - {1452, {wxBitmapButton, getBitmapSelected, 0}}, - {1454, {wxBitmapButton, setBitmapDisabled, 1}}, - {1455, {wxBitmapButton, setBitmapFocus, 1}}, - {1456, {wxBitmapButton, setBitmapLabel, 1}}, - {1457, {wxBitmapButton, setBitmapSelected, 1}}, - {1458, {wxBitmapButton, 'Destroy', undefined}}, - {1459, {wxToggleButton, new_0, 0}}, - {1460, {wxToggleButton, new_4, 4}}, - {1461, {wxToggleButton, create, 4}}, - {1462, {wxToggleButton, getValue, 0}}, - {1463, {wxToggleButton, setValue, 1}}, - {1464, {wxToggleButton, 'Destroy', undefined}}, - {1465, {wxCalendarCtrl, new_0, 0}}, - {1466, {wxCalendarCtrl, new_3, 3}}, - {1467, {wxCalendarCtrl, create, 3}}, - {1468, {wxCalendarCtrl, destruct, 0}}, - {1469, {wxCalendarCtrl, setDate, 1}}, - {1470, {wxCalendarCtrl, getDate, 0}}, - {1471, {wxCalendarCtrl, enableYearChange, 1}}, - {1472, {wxCalendarCtrl, enableMonthChange, 1}}, - {1473, {wxCalendarCtrl, enableHolidayDisplay, 1}}, - {1474, {wxCalendarCtrl, setHeaderColours, 2}}, - {1475, {wxCalendarCtrl, getHeaderColourFg, 0}}, - {1476, {wxCalendarCtrl, getHeaderColourBg, 0}}, - {1477, {wxCalendarCtrl, setHighlightColours, 2}}, - {1478, {wxCalendarCtrl, getHighlightColourFg, 0}}, - {1479, {wxCalendarCtrl, getHighlightColourBg, 0}}, - {1480, {wxCalendarCtrl, setHolidayColours, 2}}, - {1481, {wxCalendarCtrl, getHolidayColourFg, 0}}, - {1482, {wxCalendarCtrl, getHolidayColourBg, 0}}, - {1483, {wxCalendarCtrl, getAttr, 1}}, - {1484, {wxCalendarCtrl, setAttr, 2}}, - {1485, {wxCalendarCtrl, setHoliday, 1}}, - {1486, {wxCalendarCtrl, resetAttr, 1}}, - {1487, {wxCalendarCtrl, hitTest, 2}}, - {1488, {wxCalendarDateAttr, new_0, 0}}, - {1489, {wxCalendarDateAttr, new_2_1, 2}}, - {1490, {wxCalendarDateAttr, new_2_0, 2}}, - {1491, {wxCalendarDateAttr, setTextColour, 1}}, - {1492, {wxCalendarDateAttr, setBackgroundColour, 1}}, - {1493, {wxCalendarDateAttr, setBorderColour, 1}}, - {1494, {wxCalendarDateAttr, setFont, 1}}, - {1495, {wxCalendarDateAttr, setBorder, 1}}, - {1496, {wxCalendarDateAttr, setHoliday, 1}}, - {1497, {wxCalendarDateAttr, hasTextColour, 0}}, - {1498, {wxCalendarDateAttr, hasBackgroundColour, 0}}, - {1499, {wxCalendarDateAttr, hasBorderColour, 0}}, - {1500, {wxCalendarDateAttr, hasFont, 0}}, - {1501, {wxCalendarDateAttr, hasBorder, 0}}, - {1502, {wxCalendarDateAttr, isHoliday, 0}}, - {1503, {wxCalendarDateAttr, getTextColour, 0}}, - {1504, {wxCalendarDateAttr, getBackgroundColour, 0}}, - {1505, {wxCalendarDateAttr, getBorderColour, 0}}, - {1506, {wxCalendarDateAttr, getFont, 0}}, - {1507, {wxCalendarDateAttr, getBorder, 0}}, - {1508, {wxCalendarDateAttr, 'Destroy', undefined}}, - {1510, {wxCheckBox, new_4, 4}}, - {1511, {wxCheckBox, new_0, 0}}, - {1512, {wxCheckBox, create, 4}}, - {1513, {wxCheckBox, getValue, 0}}, - {1514, {wxCheckBox, get3StateValue, 0}}, - {1515, {wxCheckBox, is3rdStateAllowedForUser, 0}}, - {1516, {wxCheckBox, is3State, 0}}, - {1517, {wxCheckBox, isChecked, 0}}, - {1518, {wxCheckBox, setValue, 1}}, - {1519, {wxCheckBox, set3StateValue, 1}}, - {1520, {wxCheckBox, 'Destroy', undefined}}, - {1521, {wxCheckListBox, new_0, 0}}, - {1523, {wxCheckListBox, new_3, 3}}, - {1524, {wxCheckListBox, check, 2}}, - {1525, {wxCheckListBox, isChecked, 1}}, - {1526, {wxCheckListBox, 'Destroy', undefined}}, - {1529, {wxChoice, new_3, 3}}, - {1530, {wxChoice, new_0, 0}}, - {1532, {wxChoice, destruct, 0}}, - {1534, {wxChoice, create, 6}}, - {1535, {wxChoice, delete, 1}}, - {1536, {wxChoice, getColumns, 0}}, - {1537, {wxChoice, setColumns, 1}}, - {1538, {wxComboBox, new_0, 0}}, - {1540, {wxComboBox, new_3, 3}}, - {1541, {wxComboBox, destruct, 0}}, - {1543, {wxComboBox, create, 7}}, - {1544, {wxComboBox, canCopy, 0}}, - {1545, {wxComboBox, canCut, 0}}, - {1546, {wxComboBox, canPaste, 0}}, - {1547, {wxComboBox, canRedo, 0}}, - {1548, {wxComboBox, canUndo, 0}}, - {1549, {wxComboBox, copy, 0}}, - {1550, {wxComboBox, cut, 0}}, - {1551, {wxComboBox, getInsertionPoint, 0}}, - {1552, {wxComboBox, getLastPosition, 0}}, - {1553, {wxComboBox, getValue, 0}}, - {1554, {wxComboBox, paste, 0}}, - {1555, {wxComboBox, redo, 0}}, - {1556, {wxComboBox, replace, 3}}, - {1557, {wxComboBox, remove, 2}}, - {1558, {wxComboBox, setInsertionPoint, 1}}, - {1559, {wxComboBox, setInsertionPointEnd, 0}}, - {1560, {wxComboBox, setSelection_1, 1}}, - {1561, {wxComboBox, setSelection_2, 2}}, - {1562, {wxComboBox, setValue, 1}}, - {1563, {wxComboBox, undo, 0}}, - {1564, {wxGauge, new_0, 0}}, - {1565, {wxGauge, new_4, 4}}, - {1566, {wxGauge, create, 4}}, - {1567, {wxGauge, getBezelFace, 0}}, - {1568, {wxGauge, getRange, 0}}, - {1569, {wxGauge, getShadowWidth, 0}}, - {1570, {wxGauge, getValue, 0}}, - {1571, {wxGauge, isVertical, 0}}, - {1572, {wxGauge, setBezelFace, 1}}, - {1573, {wxGauge, setRange, 1}}, - {1574, {wxGauge, setShadowWidth, 1}}, - {1575, {wxGauge, setValue, 1}}, - {1576, {wxGauge, pulse, 0}}, - {1577, {wxGauge, 'Destroy', undefined}}, - {1578, {wxGenericDirCtrl, new_0, 0}}, - {1579, {wxGenericDirCtrl, new_2, 2}}, - {1580, {wxGenericDirCtrl, destruct, 0}}, - {1581, {wxGenericDirCtrl, create, 2}}, - {1582, {wxGenericDirCtrl, init, 0}}, - {1583, {wxGenericDirCtrl, collapseTree, 0}}, - {1584, {wxGenericDirCtrl, expandPath, 1}}, - {1585, {wxGenericDirCtrl, getDefaultPath, 0}}, - {1586, {wxGenericDirCtrl, getPath, 0}}, - {1587, {wxGenericDirCtrl, getFilePath, 0}}, - {1588, {wxGenericDirCtrl, getFilter, 0}}, - {1589, {wxGenericDirCtrl, getFilterIndex, 0}}, - {1590, {wxGenericDirCtrl, getRootId, 0}}, - {1591, {wxGenericDirCtrl, getTreeCtrl, 0}}, - {1592, {wxGenericDirCtrl, reCreateTree, 0}}, - {1593, {wxGenericDirCtrl, setDefaultPath, 1}}, - {1594, {wxGenericDirCtrl, setFilter, 1}}, - {1595, {wxGenericDirCtrl, setFilterIndex, 1}}, - {1596, {wxGenericDirCtrl, setPath, 1}}, - {1598, {wxStaticBox, new_4, 4}}, - {1599, {wxStaticBox, new_0, 0}}, - {1600, {wxStaticBox, create, 4}}, - {1601, {wxStaticBox, 'Destroy', undefined}}, - {1603, {wxStaticLine, new_2, 2}}, - {1604, {wxStaticLine, new_0, 0}}, - {1605, {wxStaticLine, create, 2}}, - {1606, {wxStaticLine, isVertical, 0}}, - {1607, {wxStaticLine, getDefaultSize, 0}}, - {1608, {wxStaticLine, 'Destroy', undefined}}, - {1611, {wxListBox, new_3, 3}}, - {1612, {wxListBox, new_0, 0}}, - {1614, {wxListBox, destruct, 0}}, - {1616, {wxListBox, create, 6}}, - {1617, {wxListBox, deselect, 1}}, - {1618, {wxListBox, getSelections, 1}}, - {1619, {wxListBox, insertItems, 2}}, - {1620, {wxListBox, isSelected, 1}}, - {1622, {wxListBox, set, 2}}, - {1623, {wxListBox, hitTest, 1}}, - {1624, {wxListBox, setFirstItem_1_0, 1}}, - {1625, {wxListBox, setFirstItem_1_1, 1}}, - {1626, {wxListCtrl, new_0, 0}}, - {1627, {wxListCtrl, new_2, 2}}, - {1628, {wxListCtrl, arrange, 1}}, - {1629, {wxListCtrl, assignImageList, 2}}, - {1630, {wxListCtrl, clearAll, 0}}, - {1631, {wxListCtrl, create, 2}}, - {1632, {wxListCtrl, deleteAllItems, 0}}, - {1633, {wxListCtrl, deleteColumn, 1}}, - {1634, {wxListCtrl, deleteItem, 1}}, - {1635, {wxListCtrl, editLabel, 1}}, - {1636, {wxListCtrl, ensureVisible, 1}}, - {1637, {wxListCtrl, findItem_3_0, 3}}, - {1638, {wxListCtrl, findItem_3_1, 3}}, - {1639, {wxListCtrl, getColumn, 2}}, - {1640, {wxListCtrl, getColumnCount, 0}}, - {1641, {wxListCtrl, getColumnWidth, 1}}, - {1642, {wxListCtrl, getCountPerPage, 0}}, - {1643, {wxListCtrl, getImageList, 1}}, - {1644, {wxListCtrl, getItem, 1}}, - {1645, {wxListCtrl, getItemBackgroundColour, 1}}, - {1646, {wxListCtrl, getItemCount, 0}}, - {1647, {wxListCtrl, getItemData, 1}}, - {1648, {wxListCtrl, getItemFont, 1}}, - {1649, {wxListCtrl, getItemPosition, 2}}, - {1650, {wxListCtrl, getItemRect, 3}}, - {1651, {wxListCtrl, getItemSpacing, 0}}, - {1652, {wxListCtrl, getItemState, 2}}, - {1653, {wxListCtrl, getItemText, 1}}, - {1654, {wxListCtrl, getItemTextColour, 1}}, - {1655, {wxListCtrl, getNextItem, 2}}, - {1656, {wxListCtrl, getSelectedItemCount, 0}}, - {1657, {wxListCtrl, getTextColour, 0}}, - {1658, {wxListCtrl, getTopItem, 0}}, - {1659, {wxListCtrl, getViewRect, 0}}, - {1660, {wxListCtrl, hitTest, 2}}, - {1661, {wxListCtrl, insertColumn_2, 2}}, - {1662, {wxListCtrl, insertColumn_3, 3}}, - {1663, {wxListCtrl, insertItem_1, 1}}, - {1664, {wxListCtrl, insertItem_2_1, 2}}, - {1665, {wxListCtrl, insertItem_2_0, 2}}, - {1666, {wxListCtrl, insertItem_3, 3}}, - {1667, {wxListCtrl, refreshItem, 1}}, - {1668, {wxListCtrl, refreshItems, 2}}, - {1669, {wxListCtrl, scrollList, 2}}, - {1670, {wxListCtrl, setBackgroundColour, 1}}, - {1671, {wxListCtrl, setColumn, 2}}, - {1672, {wxListCtrl, setColumnWidth, 2}}, - {1673, {wxListCtrl, setImageList, 2}}, - {1674, {wxListCtrl, setItem_1, 1}}, - {1675, {wxListCtrl, setItem_4, 4}}, - {1676, {wxListCtrl, setItemBackgroundColour, 2}}, - {1677, {wxListCtrl, setItemCount, 1}}, - {1678, {wxListCtrl, setItemData, 2}}, - {1679, {wxListCtrl, setItemFont, 2}}, - {1680, {wxListCtrl, setItemImage, 3}}, - {1681, {wxListCtrl, setItemColumnImage, 3}}, - {1682, {wxListCtrl, setItemPosition, 2}}, - {1683, {wxListCtrl, setItemState, 3}}, - {1684, {wxListCtrl, setItemText, 2}}, - {1685, {wxListCtrl, setItemTextColour, 2}}, - {1686, {wxListCtrl, setSingleStyle, 2}}, - {1687, {wxListCtrl, setTextColour, 1}}, - {1688, {wxListCtrl, setWindowStyleFlag, 1}}, - {1689, {wxListCtrl, 'Destroy', undefined}}, - {1690, {wxListView, clearColumnImage, 1}}, - {1691, {wxListView, focus, 1}}, - {1692, {wxListView, getFirstSelected, 0}}, - {1693, {wxListView, getFocusedItem, 0}}, - {1694, {wxListView, getNextSelected, 1}}, - {1695, {wxListView, isSelected, 1}}, - {1696, {wxListView, select, 2}}, - {1697, {wxListView, setColumnImage, 2}}, - {1698, {wxListItem, new_0, 0}}, - {1699, {wxListItem, new_1, 1}}, - {1700, {wxListItem, destruct, 0}}, - {1701, {wxListItem, clear, 0}}, - {1702, {wxListItem, getAlign, 0}}, - {1703, {wxListItem, getBackgroundColour, 0}}, - {1704, {wxListItem, getColumn, 0}}, - {1705, {wxListItem, getFont, 0}}, - {1706, {wxListItem, getId, 0}}, - {1707, {wxListItem, getImage, 0}}, - {1708, {wxListItem, getMask, 0}}, - {1709, {wxListItem, getState, 0}}, - {1710, {wxListItem, getText, 0}}, - {1711, {wxListItem, getTextColour, 0}}, - {1712, {wxListItem, getWidth, 0}}, - {1713, {wxListItem, setAlign, 1}}, - {1714, {wxListItem, setBackgroundColour, 1}}, - {1715, {wxListItem, setColumn, 1}}, - {1716, {wxListItem, setFont, 1}}, - {1717, {wxListItem, setId, 1}}, - {1718, {wxListItem, setImage, 1}}, - {1719, {wxListItem, setMask, 1}}, - {1720, {wxListItem, setState, 1}}, - {1721, {wxListItem, setStateMask, 1}}, - {1722, {wxListItem, setText, 1}}, - {1723, {wxListItem, setTextColour, 1}}, - {1724, {wxListItem, setWidth, 1}}, - {1725, {wxImageList, new_0, 0}}, - {1726, {wxImageList, new_3, 3}}, - {1727, {wxImageList, add_1, 1}}, - {1728, {wxImageList, add_2_0, 2}}, - {1729, {wxImageList, add_2_1, 2}}, - {1730, {wxImageList, create, 3}}, - {1732, {wxImageList, draw, 5}}, - {1733, {wxImageList, getBitmap, 1}}, - {1734, {wxImageList, getIcon, 1}}, - {1735, {wxImageList, getImageCount, 0}}, - {1736, {wxImageList, getSize, 3}}, - {1737, {wxImageList, remove, 1}}, - {1738, {wxImageList, removeAll, 0}}, - {1739, {wxImageList, replace_2, 2}}, - {1740, {wxImageList, replace_3, 3}}, - {1741, {wxImageList, 'Destroy', undefined}}, - {1742, {wxTextAttr, new_0, 0}}, - {1743, {wxTextAttr, new_2, 2}}, - {1744, {wxTextAttr, getAlignment, 0}}, - {1745, {wxTextAttr, getBackgroundColour, 0}}, - {1746, {wxTextAttr, getFont, 0}}, - {1747, {wxTextAttr, getLeftIndent, 0}}, - {1748, {wxTextAttr, getLeftSubIndent, 0}}, - {1749, {wxTextAttr, getRightIndent, 0}}, - {1750, {wxTextAttr, getTabs, 0}}, - {1751, {wxTextAttr, getTextColour, 0}}, - {1752, {wxTextAttr, hasBackgroundColour, 0}}, - {1753, {wxTextAttr, hasFont, 0}}, - {1754, {wxTextAttr, hasTextColour, 0}}, - {1755, {wxTextAttr, getFlags, 0}}, - {1756, {wxTextAttr, isDefault, 0}}, - {1757, {wxTextAttr, setAlignment, 1}}, - {1758, {wxTextAttr, setBackgroundColour, 1}}, - {1759, {wxTextAttr, setFlags, 1}}, - {1760, {wxTextAttr, setFont, 2}}, - {1761, {wxTextAttr, setLeftIndent, 2}}, - {1762, {wxTextAttr, setRightIndent, 1}}, - {1763, {wxTextAttr, setTabs, 1}}, - {1764, {wxTextAttr, setTextColour, 1}}, - {1765, {wxTextAttr, 'Destroy', undefined}}, - {1767, {wxTextCtrl, new_3, 3}}, - {1768, {wxTextCtrl, new_0, 0}}, - {1770, {wxTextCtrl, destruct, 0}}, - {1771, {wxTextCtrl, appendText, 1}}, - {1772, {wxTextCtrl, canCopy, 0}}, - {1773, {wxTextCtrl, canCut, 0}}, - {1774, {wxTextCtrl, canPaste, 0}}, - {1775, {wxTextCtrl, canRedo, 0}}, - {1776, {wxTextCtrl, canUndo, 0}}, - {1777, {wxTextCtrl, clear, 0}}, - {1778, {wxTextCtrl, copy, 0}}, - {1779, {wxTextCtrl, create, 3}}, - {1780, {wxTextCtrl, cut, 0}}, - {1781, {wxTextCtrl, discardEdits, 0}}, - {1782, {wxTextCtrl, emulateKeyPress, 1}}, - {1783, {wxTextCtrl, getDefaultStyle, 0}}, - {1784, {wxTextCtrl, getInsertionPoint, 0}}, - {1785, {wxTextCtrl, getLastPosition, 0}}, - {1786, {wxTextCtrl, getLineLength, 1}}, - {1787, {wxTextCtrl, getLineText, 1}}, - {1788, {wxTextCtrl, getNumberOfLines, 0}}, - {1789, {wxTextCtrl, getRange, 2}}, - {1790, {wxTextCtrl, getSelection, 2}}, - {1791, {wxTextCtrl, getStringSelection, 0}}, - {1792, {wxTextCtrl, getStyle, 2}}, - {1793, {wxTextCtrl, getValue, 0}}, - {1794, {wxTextCtrl, isEditable, 0}}, - {1795, {wxTextCtrl, isModified, 0}}, - {1796, {wxTextCtrl, isMultiLine, 0}}, - {1797, {wxTextCtrl, isSingleLine, 0}}, - {1798, {wxTextCtrl, loadFile, 2}}, - {1799, {wxTextCtrl, markDirty, 0}}, - {1800, {wxTextCtrl, paste, 0}}, - {1801, {wxTextCtrl, positionToXY, 3}}, - {1802, {wxTextCtrl, redo, 0}}, - {1803, {wxTextCtrl, remove, 2}}, - {1804, {wxTextCtrl, replace, 3}}, - {1805, {wxTextCtrl, saveFile, 1}}, - {1806, {wxTextCtrl, setDefaultStyle, 1}}, - {1807, {wxTextCtrl, setEditable, 1}}, - {1808, {wxTextCtrl, setInsertionPoint, 1}}, - {1809, {wxTextCtrl, setInsertionPointEnd, 0}}, - {1811, {wxTextCtrl, setMaxLength, 1}}, - {1812, {wxTextCtrl, setSelection, 2}}, - {1813, {wxTextCtrl, setStyle, 3}}, - {1814, {wxTextCtrl, setValue, 1}}, - {1815, {wxTextCtrl, showPosition, 1}}, - {1816, {wxTextCtrl, undo, 0}}, - {1817, {wxTextCtrl, writeText, 1}}, - {1818, {wxTextCtrl, xYToPosition, 2}}, - {1821, {wxNotebook, new_0, 0}}, - {1822, {wxNotebook, new_3, 3}}, - {1823, {wxNotebook, destruct, 0}}, - {1824, {wxNotebook, addPage, 3}}, - {1825, {wxNotebook, advanceSelection, 1}}, - {1826, {wxNotebook, assignImageList, 1}}, - {1827, {wxNotebook, create, 3}}, - {1828, {wxNotebook, deleteAllPages, 0}}, - {1829, {wxNotebook, deletePage, 1}}, - {1830, {wxNotebook, removePage, 1}}, - {1831, {wxNotebook, getCurrentPage, 0}}, - {1832, {wxNotebook, getImageList, 0}}, - {1834, {wxNotebook, getPage, 1}}, - {1835, {wxNotebook, getPageCount, 0}}, - {1836, {wxNotebook, getPageImage, 1}}, - {1837, {wxNotebook, getPageText, 1}}, - {1838, {wxNotebook, getRowCount, 0}}, - {1839, {wxNotebook, getSelection, 0}}, - {1840, {wxNotebook, getThemeBackgroundColour, 0}}, - {1842, {wxNotebook, hitTest, 2}}, - {1844, {wxNotebook, insertPage, 4}}, - {1845, {wxNotebook, setImageList, 1}}, - {1846, {wxNotebook, setPadding, 1}}, - {1847, {wxNotebook, setPageSize, 1}}, - {1848, {wxNotebook, setPageImage, 2}}, - {1849, {wxNotebook, setPageText, 2}}, - {1850, {wxNotebook, setSelection, 1}}, - {1851, {wxNotebook, changeSelection, 1}}, - {1852, {wxChoicebook, new_0, 0}}, - {1853, {wxChoicebook, new_3, 3}}, - {1854, {wxChoicebook, addPage, 3}}, - {1855, {wxChoicebook, advanceSelection, 1}}, - {1856, {wxChoicebook, assignImageList, 1}}, - {1857, {wxChoicebook, create, 3}}, - {1858, {wxChoicebook, deleteAllPages, 0}}, - {1859, {wxChoicebook, deletePage, 1}}, - {1860, {wxChoicebook, removePage, 1}}, - {1861, {wxChoicebook, getCurrentPage, 0}}, - {1862, {wxChoicebook, getImageList, 0}}, - {1864, {wxChoicebook, getPage, 1}}, - {1865, {wxChoicebook, getPageCount, 0}}, - {1866, {wxChoicebook, getPageImage, 1}}, - {1867, {wxChoicebook, getPageText, 1}}, - {1868, {wxChoicebook, getSelection, 0}}, - {1869, {wxChoicebook, hitTest, 2}}, - {1870, {wxChoicebook, insertPage, 4}}, - {1871, {wxChoicebook, setImageList, 1}}, - {1872, {wxChoicebook, setPageSize, 1}}, - {1873, {wxChoicebook, setPageImage, 2}}, - {1874, {wxChoicebook, setPageText, 2}}, - {1875, {wxChoicebook, setSelection, 1}}, - {1876, {wxChoicebook, changeSelection, 1}}, - {1877, {wxChoicebook, 'Destroy', undefined}}, - {1878, {wxToolbook, new_0, 0}}, - {1879, {wxToolbook, new_3, 3}}, - {1880, {wxToolbook, addPage, 3}}, - {1881, {wxToolbook, advanceSelection, 1}}, - {1882, {wxToolbook, assignImageList, 1}}, - {1883, {wxToolbook, create, 3}}, - {1884, {wxToolbook, deleteAllPages, 0}}, - {1885, {wxToolbook, deletePage, 1}}, - {1886, {wxToolbook, removePage, 1}}, - {1887, {wxToolbook, getCurrentPage, 0}}, - {1888, {wxToolbook, getImageList, 0}}, - {1890, {wxToolbook, getPage, 1}}, - {1891, {wxToolbook, getPageCount, 0}}, - {1892, {wxToolbook, getPageImage, 1}}, - {1893, {wxToolbook, getPageText, 1}}, - {1894, {wxToolbook, getSelection, 0}}, - {1896, {wxToolbook, hitTest, 2}}, - {1897, {wxToolbook, insertPage, 4}}, - {1898, {wxToolbook, setImageList, 1}}, - {1899, {wxToolbook, setPageSize, 1}}, - {1900, {wxToolbook, setPageImage, 2}}, - {1901, {wxToolbook, setPageText, 2}}, - {1902, {wxToolbook, setSelection, 1}}, - {1903, {wxToolbook, changeSelection, 1}}, - {1904, {wxToolbook, 'Destroy', undefined}}, - {1905, {wxListbook, new_0, 0}}, - {1906, {wxListbook, new_3, 3}}, - {1907, {wxListbook, addPage, 3}}, - {1908, {wxListbook, advanceSelection, 1}}, - {1909, {wxListbook, assignImageList, 1}}, - {1910, {wxListbook, create, 3}}, - {1911, {wxListbook, deleteAllPages, 0}}, - {1912, {wxListbook, deletePage, 1}}, - {1913, {wxListbook, removePage, 1}}, - {1914, {wxListbook, getCurrentPage, 0}}, - {1915, {wxListbook, getImageList, 0}}, - {1917, {wxListbook, getPage, 1}}, - {1918, {wxListbook, getPageCount, 0}}, - {1919, {wxListbook, getPageImage, 1}}, - {1920, {wxListbook, getPageText, 1}}, - {1921, {wxListbook, getSelection, 0}}, - {1923, {wxListbook, hitTest, 2}}, - {1924, {wxListbook, insertPage, 4}}, - {1925, {wxListbook, setImageList, 1}}, - {1926, {wxListbook, setPageSize, 1}}, - {1927, {wxListbook, setPageImage, 2}}, - {1928, {wxListbook, setPageText, 2}}, - {1929, {wxListbook, setSelection, 1}}, - {1930, {wxListbook, changeSelection, 1}}, - {1931, {wxListbook, 'Destroy', undefined}}, - {1932, {wxTreebook, new_0, 0}}, - {1933, {wxTreebook, new_3, 3}}, - {1934, {wxTreebook, addPage, 3}}, - {1935, {wxTreebook, advanceSelection, 1}}, - {1936, {wxTreebook, assignImageList, 1}}, - {1937, {wxTreebook, create, 3}}, - {1938, {wxTreebook, deleteAllPages, 0}}, - {1939, {wxTreebook, deletePage, 1}}, - {1940, {wxTreebook, removePage, 1}}, - {1941, {wxTreebook, getCurrentPage, 0}}, - {1942, {wxTreebook, getImageList, 0}}, - {1944, {wxTreebook, getPage, 1}}, - {1945, {wxTreebook, getPageCount, 0}}, - {1946, {wxTreebook, getPageImage, 1}}, - {1947, {wxTreebook, getPageText, 1}}, - {1948, {wxTreebook, getSelection, 0}}, - {1949, {wxTreebook, expandNode, 2}}, - {1950, {wxTreebook, isNodeExpanded, 1}}, - {1952, {wxTreebook, hitTest, 2}}, - {1953, {wxTreebook, insertPage, 4}}, - {1954, {wxTreebook, insertSubPage, 4}}, - {1955, {wxTreebook, setImageList, 1}}, - {1956, {wxTreebook, setPageSize, 1}}, - {1957, {wxTreebook, setPageImage, 2}}, - {1958, {wxTreebook, setPageText, 2}}, - {1959, {wxTreebook, setSelection, 1}}, - {1960, {wxTreebook, changeSelection, 1}}, - {1961, {wxTreebook, 'Destroy', undefined}}, - {1964, {wxTreeCtrl, new_2, 2}}, - {1965, {wxTreeCtrl, new_0, 0}}, - {1967, {wxTreeCtrl, destruct, 0}}, - {1968, {wxTreeCtrl, addRoot, 2}}, - {1969, {wxTreeCtrl, appendItem, 3}}, - {1970, {wxTreeCtrl, assignImageList, 1}}, - {1971, {wxTreeCtrl, assignStateImageList, 1}}, - {1972, {wxTreeCtrl, collapse, 1}}, - {1973, {wxTreeCtrl, collapseAndReset, 1}}, - {1974, {wxTreeCtrl, create, 2}}, - {1975, {wxTreeCtrl, delete, 1}}, - {1976, {wxTreeCtrl, deleteAllItems, 0}}, - {1977, {wxTreeCtrl, deleteChildren, 1}}, - {1978, {wxTreeCtrl, ensureVisible, 1}}, - {1979, {wxTreeCtrl, expand, 1}}, - {1980, {wxTreeCtrl, getBoundingRect, 3}}, - {1982, {wxTreeCtrl, getChildrenCount, 2}}, - {1983, {wxTreeCtrl, getCount, 0}}, - {1984, {wxTreeCtrl, getEditControl, 0}}, - {1985, {wxTreeCtrl, getFirstVisibleItem, 0}}, - {1986, {wxTreeCtrl, getImageList, 0}}, - {1987, {wxTreeCtrl, getIndent, 0}}, - {1988, {wxTreeCtrl, getItemBackgroundColour, 1}}, - {1989, {wxTreeCtrl, getItemData, 1}}, - {1990, {wxTreeCtrl, getItemFont, 1}}, - {1991, {wxTreeCtrl, getItemImage_1, 1}}, - {1992, {wxTreeCtrl, getItemImage_2, 2}}, - {1993, {wxTreeCtrl, getItemText, 1}}, - {1994, {wxTreeCtrl, getItemTextColour, 1}}, - {1995, {wxTreeCtrl, getLastChild, 1}}, - {1996, {wxTreeCtrl, getNextSibling, 1}}, - {1997, {wxTreeCtrl, getNextVisible, 1}}, - {1998, {wxTreeCtrl, getItemParent, 1}}, - {1999, {wxTreeCtrl, getPrevSibling, 1}}, - {2000, {wxTreeCtrl, getPrevVisible, 1}}, - {2001, {wxTreeCtrl, getRootItem, 0}}, - {2002, {wxTreeCtrl, getSelection, 0}}, - {2003, {wxTreeCtrl, getSelections, 1}}, - {2004, {wxTreeCtrl, getStateImageList, 0}}, - {2005, {wxTreeCtrl, hitTest, 1}}, - {2006, {wxTreeCtrl, insertItem_4_1, 4}}, - {2007, {wxTreeCtrl, insertItem_4_0, 4}}, - {2008, {wxTreeCtrl, isBold, 1}}, - {2009, {wxTreeCtrl, isExpanded, 1}}, - {2010, {wxTreeCtrl, isSelected, 1}}, - {2011, {wxTreeCtrl, isVisible, 1}}, - {2012, {wxTreeCtrl, itemHasChildren, 1}}, - {2013, {wxTreeCtrl, prependItem, 3}}, - {2014, {wxTreeCtrl, scrollTo, 1}}, - {2015, {wxTreeCtrl, selectItem_1, 1}}, - {2016, {wxTreeCtrl, selectItem_2, 2}}, - {2017, {wxTreeCtrl, setIndent, 1}}, - {2018, {wxTreeCtrl, setImageList, 1}}, - {2019, {wxTreeCtrl, setItemBackgroundColour, 2}}, - {2020, {wxTreeCtrl, setItemBold, 2}}, - {2021, {wxTreeCtrl, setItemData, 2}}, - {2022, {wxTreeCtrl, setItemDropHighlight, 2}}, - {2023, {wxTreeCtrl, setItemFont, 2}}, - {2024, {wxTreeCtrl, setItemHasChildren, 2}}, - {2025, {wxTreeCtrl, setItemImage_2, 2}}, - {2026, {wxTreeCtrl, setItemImage_3, 3}}, - {2027, {wxTreeCtrl, setItemText, 2}}, - {2028, {wxTreeCtrl, setItemTextColour, 2}}, - {2029, {wxTreeCtrl, setStateImageList, 1}}, - {2030, {wxTreeCtrl, setWindowStyle, 1}}, - {2031, {wxTreeCtrl, sortChildren, 1}}, - {2032, {wxTreeCtrl, toggle, 1}}, - {2033, {wxTreeCtrl, toggleItemSelection, 1}}, - {2034, {wxTreeCtrl, unselect, 0}}, - {2035, {wxTreeCtrl, unselectAll, 0}}, - {2036, {wxTreeCtrl, unselectItem, 1}}, - {2037, {wxScrollBar, new_0, 0}}, - {2038, {wxScrollBar, new_3, 3}}, - {2039, {wxScrollBar, destruct, 0}}, - {2040, {wxScrollBar, create, 3}}, - {2041, {wxScrollBar, getRange, 0}}, - {2042, {wxScrollBar, getPageSize, 0}}, - {2043, {wxScrollBar, getThumbPosition, 0}}, - {2044, {wxScrollBar, getThumbSize, 0}}, - {2045, {wxScrollBar, setThumbPosition, 1}}, - {2046, {wxScrollBar, setScrollbar, 5}}, - {2048, {wxSpinButton, new_2, 2}}, - {2049, {wxSpinButton, new_0, 0}}, - {2050, {wxSpinButton, create, 2}}, - {2051, {wxSpinButton, getMax, 0}}, - {2052, {wxSpinButton, getMin, 0}}, - {2053, {wxSpinButton, getValue, 0}}, - {2054, {wxSpinButton, setRange, 2}}, - {2055, {wxSpinButton, setValue, 1}}, - {2056, {wxSpinButton, 'Destroy', undefined}}, - {2057, {wxSpinCtrl, new_0, 0}}, - {2058, {wxSpinCtrl, new_2, 2}}, - {2060, {wxSpinCtrl, create, 2}}, - {2063, {wxSpinCtrl, setValue_1_1, 1}}, - {2064, {wxSpinCtrl, setValue_1_0, 1}}, - {2066, {wxSpinCtrl, getValue, 0}}, - {2068, {wxSpinCtrl, setRange, 2}}, - {2069, {wxSpinCtrl, setSelection, 2}}, - {2071, {wxSpinCtrl, getMin, 0}}, - {2073, {wxSpinCtrl, getMax, 0}}, - {2074, {wxSpinCtrl, 'Destroy', undefined}}, - {2075, {wxStaticText, new_0, 0}}, - {2076, {wxStaticText, new_4, 4}}, - {2077, {wxStaticText, create, 4}}, - {2078, {wxStaticText, getLabel, 0}}, - {2079, {wxStaticText, setLabel, 1}}, - {2080, {wxStaticText, wrap, 1}}, - {2081, {wxStaticText, 'Destroy', undefined}}, - {2082, {wxStaticBitmap, new_0, 0}}, - {2083, {wxStaticBitmap, new_4, 4}}, - {2084, {wxStaticBitmap, create, 4}}, - {2085, {wxStaticBitmap, getBitmap, 0}}, - {2086, {wxStaticBitmap, setBitmap, 1}}, - {2087, {wxStaticBitmap, 'Destroy', undefined}}, - {2088, {wxRadioBox, new, 7}}, - {2090, {wxRadioBox, destruct, 0}}, - {2091, {wxRadioBox, create, 7}}, - {2092, {wxRadioBox, enable_2, 2}}, - {2093, {wxRadioBox, enable_1, 1}}, - {2094, {wxRadioBox, getSelection, 0}}, - {2095, {wxRadioBox, getString, 1}}, - {2096, {wxRadioBox, setSelection, 1}}, - {2097, {wxRadioBox, show_2, 2}}, - {2098, {wxRadioBox, show_1, 1}}, - {2099, {wxRadioBox, getColumnCount, 0}}, - {2100, {wxRadioBox, getItemHelpText, 1}}, - {2101, {wxRadioBox, getItemToolTip, 1}}, - {2103, {wxRadioBox, getItemFromPoint, 1}}, - {2104, {wxRadioBox, getRowCount, 0}}, - {2105, {wxRadioBox, isItemEnabled, 1}}, - {2106, {wxRadioBox, isItemShown, 1}}, - {2107, {wxRadioBox, setItemHelpText, 2}}, - {2108, {wxRadioBox, setItemToolTip, 2}}, - {2109, {wxRadioButton, new_0, 0}}, - {2110, {wxRadioButton, new_4, 4}}, - {2111, {wxRadioButton, create, 4}}, - {2112, {wxRadioButton, getValue, 0}}, - {2113, {wxRadioButton, setValue, 1}}, - {2114, {wxRadioButton, 'Destroy', undefined}}, - {2116, {wxSlider, new_6, 6}}, - {2117, {wxSlider, new_0, 0}}, - {2118, {wxSlider, create, 6}}, - {2119, {wxSlider, getLineSize, 0}}, - {2120, {wxSlider, getMax, 0}}, - {2121, {wxSlider, getMin, 0}}, - {2122, {wxSlider, getPageSize, 0}}, - {2123, {wxSlider, getThumbLength, 0}}, - {2124, {wxSlider, getValue, 0}}, - {2125, {wxSlider, setLineSize, 1}}, - {2126, {wxSlider, setPageSize, 1}}, - {2127, {wxSlider, setRange, 2}}, - {2128, {wxSlider, setThumbLength, 1}}, - {2129, {wxSlider, setValue, 1}}, - {2130, {wxSlider, 'Destroy', undefined}}, - {2132, {wxDialog, new_4, 4}}, - {2133, {wxDialog, new_0, 0}}, - {2135, {wxDialog, destruct, 0}}, - {2136, {wxDialog, create, 4}}, - {2137, {wxDialog, createButtonSizer, 1}}, - {2138, {wxDialog, createStdDialogButtonSizer, 1}}, - {2139, {wxDialog, endModal, 1}}, - {2140, {wxDialog, getAffirmativeId, 0}}, - {2141, {wxDialog, getReturnCode, 0}}, - {2142, {wxDialog, isModal, 0}}, - {2143, {wxDialog, setAffirmativeId, 1}}, - {2144, {wxDialog, setReturnCode, 1}}, - {2145, {wxDialog, show, 1}}, - {2146, {wxDialog, showModal, 0}}, - {2147, {wxColourDialog, new_0, 0}}, - {2148, {wxColourDialog, new_2, 2}}, - {2149, {wxColourDialog, destruct, 0}}, - {2150, {wxColourDialog, create, 2}}, - {2151, {wxColourDialog, getColourData, 0}}, - {2152, {wxColourData, new_0, 0}}, - {2153, {wxColourData, new_1, 1}}, - {2154, {wxColourData, destruct, 0}}, - {2155, {wxColourData, getChooseFull, 0}}, - {2156, {wxColourData, getColour, 0}}, - {2158, {wxColourData, getCustomColour, 1}}, - {2159, {wxColourData, setChooseFull, 1}}, - {2160, {wxColourData, setColour, 1}}, - {2161, {wxColourData, setCustomColour, 2}}, - {2162, {wxPalette, new_0, 0}}, - {2163, {wxPalette, new_4, 4}}, - {2165, {wxPalette, destruct, 0}}, - {2166, {wxPalette, create, 4}}, - {2167, {wxPalette, getColoursCount, 0}}, - {2168, {wxPalette, getPixel, 3}}, - {2169, {wxPalette, getRGB, 4}}, - {2170, {wxPalette, isOk, 0}}, - {2174, {wxDirDialog, new, 2}}, - {2175, {wxDirDialog, destruct, 0}}, - {2176, {wxDirDialog, getPath, 0}}, - {2177, {wxDirDialog, getMessage, 0}}, - {2178, {wxDirDialog, setMessage, 1}}, - {2179, {wxDirDialog, setPath, 1}}, - {2183, {wxFileDialog, new, 2}}, - {2184, {wxFileDialog, destruct, 0}}, - {2185, {wxFileDialog, getDirectory, 0}}, - {2186, {wxFileDialog, getFilename, 0}}, - {2187, {wxFileDialog, getFilenames, 1}}, - {2188, {wxFileDialog, getFilterIndex, 0}}, - {2189, {wxFileDialog, getMessage, 0}}, - {2190, {wxFileDialog, getPath, 0}}, - {2191, {wxFileDialog, getPaths, 1}}, - {2192, {wxFileDialog, getWildcard, 0}}, - {2193, {wxFileDialog, setDirectory, 1}}, - {2194, {wxFileDialog, setFilename, 1}}, - {2195, {wxFileDialog, setFilterIndex, 1}}, - {2196, {wxFileDialog, setMessage, 1}}, - {2197, {wxFileDialog, setPath, 1}}, - {2198, {wxFileDialog, setWildcard, 1}}, - {2199, {wxPickerBase, setInternalMargin, 1}}, - {2200, {wxPickerBase, getInternalMargin, 0}}, - {2201, {wxPickerBase, setTextCtrlProportion, 1}}, - {2202, {wxPickerBase, setPickerCtrlProportion, 1}}, - {2203, {wxPickerBase, getTextCtrlProportion, 0}}, - {2204, {wxPickerBase, getPickerCtrlProportion, 0}}, - {2205, {wxPickerBase, hasTextCtrl, 0}}, - {2206, {wxPickerBase, getTextCtrl, 0}}, - {2207, {wxPickerBase, isTextCtrlGrowable, 0}}, - {2208, {wxPickerBase, setPickerCtrlGrowable, 1}}, - {2209, {wxPickerBase, setTextCtrlGrowable, 1}}, - {2210, {wxPickerBase, isPickerCtrlGrowable, 0}}, - {2211, {wxFilePickerCtrl, new_0, 0}}, - {2212, {wxFilePickerCtrl, new_3, 3}}, - {2213, {wxFilePickerCtrl, create, 3}}, - {2214, {wxFilePickerCtrl, getPath, 0}}, - {2215, {wxFilePickerCtrl, setPath, 1}}, - {2216, {wxFilePickerCtrl, 'Destroy', undefined}}, - {2217, {wxDirPickerCtrl, new_0, 0}}, - {2218, {wxDirPickerCtrl, new_3, 3}}, - {2219, {wxDirPickerCtrl, create, 3}}, - {2220, {wxDirPickerCtrl, getPath, 0}}, - {2221, {wxDirPickerCtrl, setPath, 1}}, - {2222, {wxDirPickerCtrl, 'Destroy', undefined}}, - {2223, {wxColourPickerCtrl, new_0, 0}}, - {2224, {wxColourPickerCtrl, new_3, 3}}, - {2225, {wxColourPickerCtrl, create, 3}}, - {2226, {wxColourPickerCtrl, getColour, 0}}, - {2227, {wxColourPickerCtrl, setColour_1_1, 1}}, - {2228, {wxColourPickerCtrl, setColour_1_0, 1}}, - {2229, {wxColourPickerCtrl, 'Destroy', undefined}}, - {2230, {wxDatePickerCtrl, new_0, 0}}, - {2231, {wxDatePickerCtrl, new_3, 3}}, - {2232, {wxDatePickerCtrl, getRange, 2}}, - {2233, {wxDatePickerCtrl, getValue, 0}}, - {2234, {wxDatePickerCtrl, setRange, 2}}, - {2235, {wxDatePickerCtrl, setValue, 1}}, - {2236, {wxDatePickerCtrl, 'Destroy', undefined}}, - {2237, {wxFontPickerCtrl, new_0, 0}}, - {2238, {wxFontPickerCtrl, new_3, 3}}, - {2239, {wxFontPickerCtrl, create, 3}}, - {2240, {wxFontPickerCtrl, getSelectedFont, 0}}, - {2241, {wxFontPickerCtrl, setSelectedFont, 1}}, - {2242, {wxFontPickerCtrl, getMaxPointSize, 0}}, - {2243, {wxFontPickerCtrl, setMaxPointSize, 1}}, - {2244, {wxFontPickerCtrl, 'Destroy', undefined}}, - {2247, {wxFindReplaceDialog, new_0, 0}}, - {2248, {wxFindReplaceDialog, new_4, 4}}, - {2249, {wxFindReplaceDialog, destruct, 0}}, - {2250, {wxFindReplaceDialog, create, 4}}, - {2251, {wxFindReplaceDialog, getData, 0}}, - {2252, {wxFindReplaceData, new_0, 0}}, - {2253, {wxFindReplaceData, new_1, 1}}, - {2254, {wxFindReplaceData, getFindString, 0}}, - {2255, {wxFindReplaceData, getReplaceString, 0}}, - {2256, {wxFindReplaceData, getFlags, 0}}, - {2257, {wxFindReplaceData, setFlags, 1}}, - {2258, {wxFindReplaceData, setFindString, 1}}, - {2259, {wxFindReplaceData, setReplaceString, 1}}, - {2260, {wxFindReplaceData, 'Destroy', undefined}}, - {2261, {wxMultiChoiceDialog, new_0, 0}}, - {2263, {wxMultiChoiceDialog, new_5, 5}}, - {2264, {wxMultiChoiceDialog, getSelections, 0}}, - {2265, {wxMultiChoiceDialog, setSelections, 1}}, - {2266, {wxMultiChoiceDialog, 'Destroy', undefined}}, - {2267, {wxSingleChoiceDialog, new_0, 0}}, - {2269, {wxSingleChoiceDialog, new_5, 5}}, - {2270, {wxSingleChoiceDialog, getSelection, 0}}, - {2271, {wxSingleChoiceDialog, getStringSelection, 0}}, - {2272, {wxSingleChoiceDialog, setSelection, 1}}, - {2273, {wxSingleChoiceDialog, 'Destroy', undefined}}, - {2274, {wxTextEntryDialog, new, 3}}, - {2275, {wxTextEntryDialog, getValue, 0}}, - {2276, {wxTextEntryDialog, setValue, 1}}, - {2277, {wxTextEntryDialog, 'Destroy', undefined}}, - {2278, {wxPasswordEntryDialog, new, 3}}, - {2279, {wxPasswordEntryDialog, 'Destroy', undefined}}, - {2280, {wxFontData, new_0, 0}}, - {2281, {wxFontData, new_1, 1}}, - {2282, {wxFontData, destruct, 0}}, - {2283, {wxFontData, enableEffects, 1}}, - {2284, {wxFontData, getAllowSymbols, 0}}, - {2285, {wxFontData, getColour, 0}}, - {2286, {wxFontData, getChosenFont, 0}}, - {2287, {wxFontData, getEnableEffects, 0}}, - {2288, {wxFontData, getInitialFont, 0}}, - {2289, {wxFontData, getShowHelp, 0}}, - {2290, {wxFontData, setAllowSymbols, 1}}, - {2291, {wxFontData, setChosenFont, 1}}, - {2292, {wxFontData, setColour, 1}}, - {2293, {wxFontData, setInitialFont, 1}}, - {2294, {wxFontData, setRange, 2}}, - {2295, {wxFontData, setShowHelp, 1}}, - {2299, {wxFontDialog, new_0, 0}}, - {2301, {wxFontDialog, new_2, 2}}, - {2303, {wxFontDialog, create, 2}}, - {2304, {wxFontDialog, getFontData, 0}}, - {2306, {wxFontDialog, 'Destroy', undefined}}, - {2307, {wxProgressDialog, new, 3}}, - {2308, {wxProgressDialog, destruct, 0}}, - {2309, {wxProgressDialog, resume, 0}}, - {2310, {wxProgressDialog, update_2, 2}}, - {2311, {wxProgressDialog, update_0, 0}}, - {2312, {wxMessageDialog, new, 3}}, - {2313, {wxMessageDialog, destruct, 0}}, - {2314, {wxPageSetupDialog, new, 2}}, - {2315, {wxPageSetupDialog, destruct, 0}}, - {2316, {wxPageSetupDialog, getPageSetupData, 0}}, - {2317, {wxPageSetupDialog, showModal, 0}}, - {2318, {wxPageSetupDialogData, new_0, 0}}, - {2319, {wxPageSetupDialogData, new_1_0, 1}}, - {2320, {wxPageSetupDialogData, new_1_1, 1}}, - {2321, {wxPageSetupDialogData, destruct, 0}}, - {2322, {wxPageSetupDialogData, enableHelp, 1}}, - {2323, {wxPageSetupDialogData, enableMargins, 1}}, - {2324, {wxPageSetupDialogData, enableOrientation, 1}}, - {2325, {wxPageSetupDialogData, enablePaper, 1}}, - {2326, {wxPageSetupDialogData, enablePrinter, 1}}, - {2327, {wxPageSetupDialogData, getDefaultMinMargins, 0}}, - {2328, {wxPageSetupDialogData, getEnableMargins, 0}}, - {2329, {wxPageSetupDialogData, getEnableOrientation, 0}}, - {2330, {wxPageSetupDialogData, getEnablePaper, 0}}, - {2331, {wxPageSetupDialogData, getEnablePrinter, 0}}, - {2332, {wxPageSetupDialogData, getEnableHelp, 0}}, - {2333, {wxPageSetupDialogData, getDefaultInfo, 0}}, - {2334, {wxPageSetupDialogData, getMarginTopLeft, 0}}, - {2335, {wxPageSetupDialogData, getMarginBottomRight, 0}}, - {2336, {wxPageSetupDialogData, getMinMarginTopLeft, 0}}, - {2337, {wxPageSetupDialogData, getMinMarginBottomRight, 0}}, - {2338, {wxPageSetupDialogData, getPaperId, 0}}, - {2339, {wxPageSetupDialogData, getPaperSize, 0}}, - {2341, {wxPageSetupDialogData, getPrintData, 0}}, - {2342, {wxPageSetupDialogData, isOk, 0}}, - {2343, {wxPageSetupDialogData, setDefaultInfo, 1}}, - {2344, {wxPageSetupDialogData, setDefaultMinMargins, 1}}, - {2345, {wxPageSetupDialogData, setMarginTopLeft, 1}}, - {2346, {wxPageSetupDialogData, setMarginBottomRight, 1}}, - {2347, {wxPageSetupDialogData, setMinMarginTopLeft, 1}}, - {2348, {wxPageSetupDialogData, setMinMarginBottomRight, 1}}, - {2349, {wxPageSetupDialogData, setPaperId, 1}}, - {2350, {wxPageSetupDialogData, setPaperSize_1_1, 1}}, - {2351, {wxPageSetupDialogData, setPaperSize_1_0, 1}}, - {2352, {wxPageSetupDialogData, setPrintData, 1}}, - {2353, {wxPrintDialog, new_2_0, 2}}, - {2354, {wxPrintDialog, new_2_1, 2}}, - {2355, {wxPrintDialog, destruct, 0}}, - {2356, {wxPrintDialog, getPrintDialogData, 0}}, - {2357, {wxPrintDialog, getPrintDC, 0}}, - {2358, {wxPrintDialogData, new_0, 0}}, - {2359, {wxPrintDialogData, new_1_1, 1}}, - {2360, {wxPrintDialogData, new_1_0, 1}}, - {2361, {wxPrintDialogData, destruct, 0}}, - {2362, {wxPrintDialogData, enableHelp, 1}}, - {2363, {wxPrintDialogData, enablePageNumbers, 1}}, - {2364, {wxPrintDialogData, enablePrintToFile, 1}}, - {2365, {wxPrintDialogData, enableSelection, 1}}, - {2366, {wxPrintDialogData, getAllPages, 0}}, - {2367, {wxPrintDialogData, getCollate, 0}}, - {2368, {wxPrintDialogData, getFromPage, 0}}, - {2369, {wxPrintDialogData, getMaxPage, 0}}, - {2370, {wxPrintDialogData, getMinPage, 0}}, - {2371, {wxPrintDialogData, getNoCopies, 0}}, - {2372, {wxPrintDialogData, getPrintData, 0}}, - {2373, {wxPrintDialogData, getPrintToFile, 0}}, - {2374, {wxPrintDialogData, getSelection, 0}}, - {2375, {wxPrintDialogData, getToPage, 0}}, - {2376, {wxPrintDialogData, isOk, 0}}, - {2377, {wxPrintDialogData, setCollate, 1}}, - {2378, {wxPrintDialogData, setFromPage, 1}}, - {2379, {wxPrintDialogData, setMaxPage, 1}}, - {2380, {wxPrintDialogData, setMinPage, 1}}, - {2381, {wxPrintDialogData, setNoCopies, 1}}, - {2382, {wxPrintDialogData, setPrintData, 1}}, - {2383, {wxPrintDialogData, setPrintToFile, 1}}, - {2384, {wxPrintDialogData, setSelection, 1}}, - {2385, {wxPrintDialogData, setToPage, 1}}, - {2386, {wxPrintData, new_0, 0}}, - {2387, {wxPrintData, new_1, 1}}, - {2388, {wxPrintData, destruct, 0}}, - {2389, {wxPrintData, getCollate, 0}}, - {2390, {wxPrintData, getBin, 0}}, - {2391, {wxPrintData, getColour, 0}}, - {2392, {wxPrintData, getDuplex, 0}}, - {2393, {wxPrintData, getNoCopies, 0}}, - {2394, {wxPrintData, getOrientation, 0}}, - {2395, {wxPrintData, getPaperId, 0}}, - {2396, {wxPrintData, getPrinterName, 0}}, - {2397, {wxPrintData, getQuality, 0}}, - {2398, {wxPrintData, isOk, 0}}, - {2399, {wxPrintData, setBin, 1}}, - {2400, {wxPrintData, setCollate, 1}}, - {2401, {wxPrintData, setColour, 1}}, - {2402, {wxPrintData, setDuplex, 1}}, - {2403, {wxPrintData, setNoCopies, 1}}, - {2404, {wxPrintData, setOrientation, 1}}, - {2405, {wxPrintData, setPaperId, 1}}, - {2406, {wxPrintData, setPrinterName, 1}}, - {2407, {wxPrintData, setQuality, 1}}, - {2410, {wxPrintPreview, new_2, 2}}, - {2411, {wxPrintPreview, new_3, 3}}, - {2413, {wxPrintPreview, destruct, 0}}, - {2414, {wxPrintPreview, getCanvas, 0}}, - {2415, {wxPrintPreview, getCurrentPage, 0}}, - {2416, {wxPrintPreview, getFrame, 0}}, - {2417, {wxPrintPreview, getMaxPage, 0}}, - {2418, {wxPrintPreview, getMinPage, 0}}, - {2419, {wxPrintPreview, getPrintout, 0}}, - {2420, {wxPrintPreview, getPrintoutForPrinting, 0}}, - {2421, {wxPrintPreview, isOk, 0}}, - {2422, {wxPrintPreview, paintPage, 2}}, - {2423, {wxPrintPreview, print, 1}}, - {2424, {wxPrintPreview, renderPage, 1}}, - {2425, {wxPrintPreview, setCanvas, 1}}, - {2426, {wxPrintPreview, setCurrentPage, 1}}, - {2427, {wxPrintPreview, setFrame, 1}}, - {2428, {wxPrintPreview, setPrintout, 1}}, - {2429, {wxPrintPreview, setZoom, 1}}, - {2430, {wxPreviewFrame, new, 3}}, - {2431, {wxPreviewFrame, destruct, 0}}, - {2432, {wxPreviewFrame, createControlBar, 0}}, - {2433, {wxPreviewFrame, createCanvas, 0}}, - {2434, {wxPreviewFrame, initialize, 0}}, - {2435, {wxPreviewFrame, onCloseWindow, 1}}, - {2436, {wxPreviewControlBar, new, 4}}, - {2437, {wxPreviewControlBar, destruct, 0}}, - {2438, {wxPreviewControlBar, createButtons, 0}}, - {2439, {wxPreviewControlBar, getPrintPreview, 0}}, - {2440, {wxPreviewControlBar, getZoomControl, 0}}, - {2441, {wxPreviewControlBar, setZoomControl, 1}}, - {2443, {wxPrinter, new, 1}}, - {2444, {wxPrinter, createAbortWindow, 2}}, - {2445, {wxPrinter, getAbort, 0}}, - {2446, {wxPrinter, getLastError, 0}}, - {2447, {wxPrinter, getPrintDialogData, 0}}, - {2448, {wxPrinter, print, 3}}, - {2449, {wxPrinter, printDialog, 1}}, - {2450, {wxPrinter, reportError, 3}}, - {2451, {wxPrinter, setup, 1}}, - {2452, {wxPrinter, 'Destroy', undefined}}, - {2453, {wxXmlResource, new_1, 1}}, - {2454, {wxXmlResource, new_2, 2}}, - {2455, {wxXmlResource, destruct, 0}}, - {2456, {wxXmlResource, attachUnknownControl, 3}}, - {2457, {wxXmlResource, clearHandlers, 0}}, - {2458, {wxXmlResource, compareVersion, 4}}, - {2459, {wxXmlResource, get, 0}}, - {2460, {wxXmlResource, getFlags, 0}}, - {2461, {wxXmlResource, getVersion, 0}}, - {2462, {wxXmlResource, getXRCID, 2}}, - {2463, {wxXmlResource, initAllHandlers, 0}}, - {2464, {wxXmlResource, load, 1}}, - {2465, {wxXmlResource, loadBitmap, 1}}, - {2466, {wxXmlResource, loadDialog_2, 2}}, - {2467, {wxXmlResource, loadDialog_3, 3}}, - {2468, {wxXmlResource, loadFrame_2, 2}}, - {2469, {wxXmlResource, loadFrame_3, 3}}, - {2470, {wxXmlResource, loadIcon, 1}}, - {2471, {wxXmlResource, loadMenu, 1}}, - {2472, {wxXmlResource, loadMenuBar_2, 2}}, - {2473, {wxXmlResource, loadMenuBar_1, 1}}, - {2474, {wxXmlResource, loadPanel_2, 2}}, - {2475, {wxXmlResource, loadPanel_3, 3}}, - {2476, {wxXmlResource, loadToolBar, 2}}, - {2477, {wxXmlResource, set, 1}}, - {2478, {wxXmlResource, setFlags, 1}}, - {2479, {wxXmlResource, unload, 1}}, - {2480, {wxXmlResource, xrcctrl, 3}}, - {2481, {wxHtmlEasyPrinting, new, 1}}, - {2482, {wxHtmlEasyPrinting, destruct, 0}}, - {2483, {wxHtmlEasyPrinting, getPrintData, 0}}, - {2484, {wxHtmlEasyPrinting, getPageSetupData, 0}}, - {2485, {wxHtmlEasyPrinting, previewFile, 1}}, - {2486, {wxHtmlEasyPrinting, previewText, 2}}, - {2487, {wxHtmlEasyPrinting, printFile, 1}}, - {2488, {wxHtmlEasyPrinting, printText, 2}}, - {2489, {wxHtmlEasyPrinting, pageSetup, 0}}, - {2490, {wxHtmlEasyPrinting, setFonts, 3}}, - {2491, {wxHtmlEasyPrinting, setHeader, 2}}, - {2492, {wxHtmlEasyPrinting, setFooter, 2}}, - {2494, {wxGLCanvas, new_2, 2}}, - {2495, {wxGLCanvas, new_3_1, 3}}, - {2496, {wxGLCanvas, new_3_0, 3}}, - {2497, {wxGLCanvas, getContext, 0}}, - {2499, {wxGLCanvas, setCurrent, 0}}, - {2500, {wxGLCanvas, swapBuffers, 0}}, - {2501, {wxGLCanvas, 'Destroy', undefined}}, - {2502, {wxAuiManager, new, 1}}, - {2503, {wxAuiManager, destruct, 0}}, - {2504, {wxAuiManager, addPane_2_1, 2}}, - {2505, {wxAuiManager, addPane_3, 3}}, - {2506, {wxAuiManager, addPane_2_0, 2}}, - {2507, {wxAuiManager, detachPane, 1}}, - {2508, {wxAuiManager, getAllPanes, 0}}, - {2509, {wxAuiManager, getArtProvider, 0}}, - {2510, {wxAuiManager, getDockSizeConstraint, 2}}, - {2511, {wxAuiManager, getFlags, 0}}, - {2512, {wxAuiManager, getManagedWindow, 0}}, - {2513, {wxAuiManager, getManager, 1}}, - {2514, {wxAuiManager, getPane_1_1, 1}}, - {2515, {wxAuiManager, getPane_1_0, 1}}, - {2516, {wxAuiManager, hideHint, 0}}, - {2517, {wxAuiManager, insertPane, 3}}, - {2518, {wxAuiManager, loadPaneInfo, 2}}, - {2519, {wxAuiManager, loadPerspective, 2}}, - {2520, {wxAuiManager, savePaneInfo, 1}}, - {2521, {wxAuiManager, savePerspective, 0}}, - {2522, {wxAuiManager, setArtProvider, 1}}, - {2523, {wxAuiManager, setDockSizeConstraint, 2}}, - {2524, {wxAuiManager, setFlags, 1}}, - {2525, {wxAuiManager, setManagedWindow, 1}}, - {2526, {wxAuiManager, showHint, 1}}, - {2527, {wxAuiManager, unInit, 0}}, - {2528, {wxAuiManager, update, 0}}, - {2529, {wxAuiPaneInfo, bestSize_1, 1}}, - {2530, {wxAuiPaneInfo, bestSize_2, 2}}, - {2531, {wxAuiPaneInfo, bottom, 0}}, - {2532, {wxAuiPaneInfo, bottomDockable, 1}}, - {2533, {wxAuiPaneInfo, caption, 1}}, - {2534, {wxAuiPaneInfo, captionVisible, 1}}, - {2535, {wxAuiPaneInfo, centre, 0}}, - {2536, {wxAuiPaneInfo, centrePane, 0}}, - {2537, {wxAuiPaneInfo, closeButton, 1}}, - {2538, {wxAuiPaneInfo, defaultPane, 0}}, - {2539, {wxAuiPaneInfo, destroyOnClose, 1}}, - {2540, {wxAuiPaneInfo, direction, 1}}, - {2541, {wxAuiPaneInfo, dock, 0}}, - {2542, {wxAuiPaneInfo, dockable, 1}}, - {2543, {wxAuiPaneInfo, fixed, 0}}, - {2544, {wxAuiPaneInfo, float, 0}}, - {2545, {wxAuiPaneInfo, floatable, 1}}, - {2546, {wxAuiPaneInfo, floatingPosition_1, 1}}, - {2547, {wxAuiPaneInfo, floatingPosition_2, 2}}, - {2548, {wxAuiPaneInfo, floatingSize_1, 1}}, - {2549, {wxAuiPaneInfo, floatingSize_2, 2}}, - {2550, {wxAuiPaneInfo, gripper, 1}}, - {2551, {wxAuiPaneInfo, gripperTop, 1}}, - {2552, {wxAuiPaneInfo, hasBorder, 0}}, - {2553, {wxAuiPaneInfo, hasCaption, 0}}, - {2554, {wxAuiPaneInfo, hasCloseButton, 0}}, - {2555, {wxAuiPaneInfo, hasFlag, 1}}, - {2556, {wxAuiPaneInfo, hasGripper, 0}}, - {2557, {wxAuiPaneInfo, hasGripperTop, 0}}, - {2558, {wxAuiPaneInfo, hasMaximizeButton, 0}}, - {2559, {wxAuiPaneInfo, hasMinimizeButton, 0}}, - {2560, {wxAuiPaneInfo, hasPinButton, 0}}, - {2561, {wxAuiPaneInfo, hide, 0}}, - {2562, {wxAuiPaneInfo, isBottomDockable, 0}}, - {2563, {wxAuiPaneInfo, isDocked, 0}}, - {2564, {wxAuiPaneInfo, isFixed, 0}}, - {2565, {wxAuiPaneInfo, isFloatable, 0}}, - {2566, {wxAuiPaneInfo, isFloating, 0}}, - {2567, {wxAuiPaneInfo, isLeftDockable, 0}}, - {2568, {wxAuiPaneInfo, isMovable, 0}}, - {2569, {wxAuiPaneInfo, isOk, 0}}, - {2570, {wxAuiPaneInfo, isResizable, 0}}, - {2571, {wxAuiPaneInfo, isRightDockable, 0}}, - {2572, {wxAuiPaneInfo, isShown, 0}}, - {2573, {wxAuiPaneInfo, isToolbar, 0}}, - {2574, {wxAuiPaneInfo, isTopDockable, 0}}, - {2575, {wxAuiPaneInfo, layer, 1}}, - {2576, {wxAuiPaneInfo, left, 0}}, - {2577, {wxAuiPaneInfo, leftDockable, 1}}, - {2578, {wxAuiPaneInfo, maxSize_1, 1}}, - {2579, {wxAuiPaneInfo, maxSize_2, 2}}, - {2580, {wxAuiPaneInfo, maximizeButton, 1}}, - {2581, {wxAuiPaneInfo, minSize_1, 1}}, - {2582, {wxAuiPaneInfo, minSize_2, 2}}, - {2583, {wxAuiPaneInfo, minimizeButton, 1}}, - {2584, {wxAuiPaneInfo, movable, 1}}, - {2585, {wxAuiPaneInfo, name, 1}}, - {2586, {wxAuiPaneInfo, paneBorder, 1}}, - {2587, {wxAuiPaneInfo, pinButton, 1}}, - {2588, {wxAuiPaneInfo, position, 1}}, - {2589, {wxAuiPaneInfo, resizable, 1}}, - {2590, {wxAuiPaneInfo, right, 0}}, - {2591, {wxAuiPaneInfo, rightDockable, 1}}, - {2592, {wxAuiPaneInfo, row, 1}}, - {2593, {wxAuiPaneInfo, safeSet, 1}}, - {2594, {wxAuiPaneInfo, setFlag, 2}}, - {2595, {wxAuiPaneInfo, show, 1}}, - {2596, {wxAuiPaneInfo, toolbarPane, 0}}, - {2597, {wxAuiPaneInfo, top, 0}}, - {2598, {wxAuiPaneInfo, topDockable, 1}}, - {2599, {wxAuiPaneInfo, window, 1}}, - {2600, {wxAuiNotebook, new_0, 0}}, - {2601, {wxAuiNotebook, new_2, 2}}, - {2602, {wxAuiNotebook, addPage, 3}}, - {2603, {wxAuiNotebook, create, 2}}, - {2604, {wxAuiNotebook, deletePage, 1}}, - {2605, {wxAuiNotebook, getArtProvider, 0}}, - {2606, {wxAuiNotebook, getPage, 1}}, - {2607, {wxAuiNotebook, getPageBitmap, 1}}, - {2608, {wxAuiNotebook, getPageCount, 0}}, - {2609, {wxAuiNotebook, getPageIndex, 1}}, - {2610, {wxAuiNotebook, getPageText, 1}}, - {2611, {wxAuiNotebook, getSelection, 0}}, - {2612, {wxAuiNotebook, insertPage, 4}}, - {2613, {wxAuiNotebook, removePage, 1}}, - {2614, {wxAuiNotebook, setArtProvider, 1}}, - {2615, {wxAuiNotebook, setFont, 1}}, - {2616, {wxAuiNotebook, setPageBitmap, 2}}, - {2617, {wxAuiNotebook, setPageText, 2}}, - {2618, {wxAuiNotebook, setSelection, 1}}, - {2619, {wxAuiNotebook, setTabCtrlHeight, 1}}, - {2620, {wxAuiNotebook, setUniformBitmapSize, 1}}, - {2621, {wxAuiNotebook, 'Destroy', undefined}}, - {2622, {wxMDIParentFrame, new_0, 0}}, - {2623, {wxMDIParentFrame, new_4, 4}}, - {2624, {wxMDIParentFrame, destruct, 0}}, - {2625, {wxMDIParentFrame, activateNext, 0}}, - {2626, {wxMDIParentFrame, activatePrevious, 0}}, - {2627, {wxMDIParentFrame, arrangeIcons, 0}}, - {2628, {wxMDIParentFrame, cascade, 0}}, - {2629, {wxMDIParentFrame, create, 4}}, - {2630, {wxMDIParentFrame, getActiveChild, 0}}, - {2631, {wxMDIParentFrame, getClientWindow, 0}}, - {2632, {wxMDIParentFrame, tile, 1}}, - {2633, {wxMDIChildFrame, new_0, 0}}, - {2634, {wxMDIChildFrame, new_4, 4}}, - {2635, {wxMDIChildFrame, destruct, 0}}, - {2636, {wxMDIChildFrame, activate, 0}}, - {2637, {wxMDIChildFrame, create, 4}}, - {2638, {wxMDIChildFrame, maximize, 1}}, - {2639, {wxMDIChildFrame, restore, 0}}, - {2640, {wxMDIClientWindow, new_0, 0}}, - {2641, {wxMDIClientWindow, new_2, 2}}, - {2642, {wxMDIClientWindow, destruct, 0}}, - {2643, {wxMDIClientWindow, createClient, 2}}, - {2644, {wxLayoutAlgorithm, new, 0}}, - {2645, {wxLayoutAlgorithm, layoutFrame, 2}}, - {2646, {wxLayoutAlgorithm, layoutMDIFrame, 2}}, - {2647, {wxLayoutAlgorithm, layoutWindow, 2}}, - {2648, {wxLayoutAlgorithm, 'Destroy', undefined}}, - {2649, {wxEvent, getId, 0}}, - {2650, {wxEvent, getSkipped, 0}}, - {2651, {wxEvent, getTimestamp, 0}}, - {2652, {wxEvent, isCommandEvent, 0}}, - {2653, {wxEvent, resumePropagation, 1}}, - {2654, {wxEvent, shouldPropagate, 0}}, - {2655, {wxEvent, skip, 1}}, - {2656, {wxEvent, stopPropagation, 0}}, - {2657, {wxCommandEvent, getClientData, 0}}, - {2658, {wxCommandEvent, getExtraLong, 0}}, - {2659, {wxCommandEvent, getInt, 0}}, - {2660, {wxCommandEvent, getSelection, 0}}, - {2661, {wxCommandEvent, getString, 0}}, - {2662, {wxCommandEvent, isChecked, 0}}, - {2663, {wxCommandEvent, isSelection, 0}}, - {2664, {wxCommandEvent, setInt, 1}}, - {2665, {wxCommandEvent, setString, 1}}, - {2666, {wxScrollEvent, getOrientation, 0}}, - {2667, {wxScrollEvent, getPosition, 0}}, - {2668, {wxScrollWinEvent, getOrientation, 0}}, - {2669, {wxScrollWinEvent, getPosition, 0}}, - {2670, {wxMouseEvent, altDown, 0}}, - {2671, {wxMouseEvent, button, 1}}, - {2672, {wxMouseEvent, buttonDClick, 1}}, - {2673, {wxMouseEvent, buttonDown, 1}}, - {2674, {wxMouseEvent, buttonUp, 1}}, - {2675, {wxMouseEvent, cmdDown, 0}}, - {2676, {wxMouseEvent, controlDown, 0}}, - {2677, {wxMouseEvent, dragging, 0}}, - {2678, {wxMouseEvent, entering, 0}}, - {2679, {wxMouseEvent, getButton, 0}}, - {2682, {wxMouseEvent, getPosition, 0}}, - {2683, {wxMouseEvent, getLogicalPosition, 1}}, - {2684, {wxMouseEvent, getLinesPerAction, 0}}, - {2685, {wxMouseEvent, getWheelRotation, 0}}, - {2686, {wxMouseEvent, getWheelDelta, 0}}, - {2687, {wxMouseEvent, getX, 0}}, - {2688, {wxMouseEvent, getY, 0}}, - {2689, {wxMouseEvent, isButton, 0}}, - {2690, {wxMouseEvent, isPageScroll, 0}}, - {2691, {wxMouseEvent, leaving, 0}}, - {2692, {wxMouseEvent, leftDClick, 0}}, - {2693, {wxMouseEvent, leftDown, 0}}, - {2694, {wxMouseEvent, leftIsDown, 0}}, - {2695, {wxMouseEvent, leftUp, 0}}, - {2696, {wxMouseEvent, metaDown, 0}}, - {2697, {wxMouseEvent, middleDClick, 0}}, - {2698, {wxMouseEvent, middleDown, 0}}, - {2699, {wxMouseEvent, middleIsDown, 0}}, - {2700, {wxMouseEvent, middleUp, 0}}, - {2701, {wxMouseEvent, moving, 0}}, - {2702, {wxMouseEvent, rightDClick, 0}}, - {2703, {wxMouseEvent, rightDown, 0}}, - {2704, {wxMouseEvent, rightIsDown, 0}}, - {2705, {wxMouseEvent, rightUp, 0}}, - {2706, {wxMouseEvent, shiftDown, 0}}, - {2707, {wxSetCursorEvent, getCursor, 0}}, - {2708, {wxSetCursorEvent, getX, 0}}, - {2709, {wxSetCursorEvent, getY, 0}}, - {2710, {wxSetCursorEvent, hasCursor, 0}}, - {2711, {wxSetCursorEvent, setCursor, 1}}, - {2712, {wxKeyEvent, altDown, 0}}, - {2713, {wxKeyEvent, cmdDown, 0}}, - {2714, {wxKeyEvent, controlDown, 0}}, - {2715, {wxKeyEvent, getKeyCode, 0}}, - {2716, {wxKeyEvent, getModifiers, 0}}, - {2719, {wxKeyEvent, getPosition, 0}}, - {2720, {wxKeyEvent, getRawKeyCode, 0}}, - {2721, {wxKeyEvent, getRawKeyFlags, 0}}, - {2722, {wxKeyEvent, getUnicodeKey, 0}}, - {2723, {wxKeyEvent, getX, 0}}, - {2724, {wxKeyEvent, getY, 0}}, - {2725, {wxKeyEvent, hasModifiers, 0}}, - {2726, {wxKeyEvent, metaDown, 0}}, - {2727, {wxKeyEvent, shiftDown, 0}}, - {2728, {wxSizeEvent, getSize, 0}}, - {2729, {wxMoveEvent, getPosition, 0}}, - {2730, {wxEraseEvent, getDC, 0}}, - {2731, {wxFocusEvent, getWindow, 0}}, - {2732, {wxChildFocusEvent, getWindow, 0}}, - {2733, {wxMenuEvent, getMenu, 0}}, - {2734, {wxMenuEvent, getMenuId, 0}}, - {2735, {wxMenuEvent, isPopup, 0}}, - {2736, {wxCloseEvent, canVeto, 0}}, - {2737, {wxCloseEvent, getLoggingOff, 0}}, - {2738, {wxCloseEvent, setCanVeto, 1}}, - {2739, {wxCloseEvent, setLoggingOff, 1}}, - {2740, {wxCloseEvent, veto, 1}}, - {2741, {wxShowEvent, setShow, 1}}, - {2742, {wxShowEvent, getShow, 0}}, - {2743, {wxIconizeEvent, iconized, 0}}, - {2744, {wxJoystickEvent, buttonDown, 1}}, - {2745, {wxJoystickEvent, buttonIsDown, 1}}, - {2746, {wxJoystickEvent, buttonUp, 1}}, - {2747, {wxJoystickEvent, getButtonChange, 0}}, - {2748, {wxJoystickEvent, getButtonState, 0}}, - {2749, {wxJoystickEvent, getJoystick, 0}}, - {2750, {wxJoystickEvent, getPosition, 0}}, - {2751, {wxJoystickEvent, getZPosition, 0}}, - {2752, {wxJoystickEvent, isButton, 0}}, - {2753, {wxJoystickEvent, isMove, 0}}, - {2754, {wxJoystickEvent, isZMove, 0}}, - {2755, {wxUpdateUIEvent, canUpdate, 1}}, - {2756, {wxUpdateUIEvent, check, 1}}, - {2757, {wxUpdateUIEvent, enable, 1}}, - {2758, {wxUpdateUIEvent, show, 1}}, - {2759, {wxUpdateUIEvent, getChecked, 0}}, - {2760, {wxUpdateUIEvent, getEnabled, 0}}, - {2761, {wxUpdateUIEvent, getShown, 0}}, - {2762, {wxUpdateUIEvent, getSetChecked, 0}}, - {2763, {wxUpdateUIEvent, getSetEnabled, 0}}, - {2764, {wxUpdateUIEvent, getSetShown, 0}}, - {2765, {wxUpdateUIEvent, getSetText, 0}}, - {2766, {wxUpdateUIEvent, getText, 0}}, - {2767, {wxUpdateUIEvent, getMode, 0}}, - {2768, {wxUpdateUIEvent, getUpdateInterval, 0}}, - {2769, {wxUpdateUIEvent, resetUpdateTime, 0}}, - {2770, {wxUpdateUIEvent, setMode, 1}}, - {2771, {wxUpdateUIEvent, setText, 1}}, - {2772, {wxUpdateUIEvent, setUpdateInterval, 1}}, - {2773, {wxMouseCaptureChangedEvent, getCapturedWindow, 0}}, - {2774, {wxPaletteChangedEvent, setChangedWindow, 1}}, - {2775, {wxPaletteChangedEvent, getChangedWindow, 0}}, - {2776, {wxQueryNewPaletteEvent, setPaletteRealized, 1}}, - {2777, {wxQueryNewPaletteEvent, getPaletteRealized, 0}}, - {2778, {wxNavigationKeyEvent, getDirection, 0}}, - {2779, {wxNavigationKeyEvent, setDirection, 1}}, - {2780, {wxNavigationKeyEvent, isWindowChange, 0}}, - {2781, {wxNavigationKeyEvent, setWindowChange, 1}}, - {2782, {wxNavigationKeyEvent, isFromTab, 0}}, - {2783, {wxNavigationKeyEvent, setFromTab, 1}}, - {2784, {wxNavigationKeyEvent, getCurrentFocus, 0}}, - {2785, {wxNavigationKeyEvent, setCurrentFocus, 1}}, - {2786, {wxHelpEvent, getOrigin, 0}}, - {2787, {wxHelpEvent, getPosition, 0}}, - {2788, {wxHelpEvent, setOrigin, 1}}, - {2789, {wxHelpEvent, setPosition, 1}}, - {2790, {wxContextMenuEvent, getPosition, 0}}, - {2791, {wxContextMenuEvent, setPosition, 1}}, - {2792, {wxIdleEvent, canSend, 1}}, - {2793, {wxIdleEvent, getMode, 0}}, - {2794, {wxIdleEvent, requestMore, 1}}, - {2795, {wxIdleEvent, moreRequested, 0}}, - {2796, {wxIdleEvent, setMode, 1}}, - {2797, {wxGridEvent, altDown, 0}}, - {2798, {wxGridEvent, controlDown, 0}}, - {2799, {wxGridEvent, getCol, 0}}, - {2800, {wxGridEvent, getPosition, 0}}, - {2801, {wxGridEvent, getRow, 0}}, - {2802, {wxGridEvent, metaDown, 0}}, - {2803, {wxGridEvent, selecting, 0}}, - {2804, {wxGridEvent, shiftDown, 0}}, - {2805, {wxNotifyEvent, allow, 0}}, - {2806, {wxNotifyEvent, isAllowed, 0}}, - {2807, {wxNotifyEvent, veto, 0}}, - {2808, {wxSashEvent, getEdge, 0}}, - {2809, {wxSashEvent, getDragRect, 0}}, - {2810, {wxSashEvent, getDragStatus, 0}}, - {2811, {wxListEvent, getCacheFrom, 0}}, - {2812, {wxListEvent, getCacheTo, 0}}, - {2813, {wxListEvent, getKeyCode, 0}}, - {2814, {wxListEvent, getIndex, 0}}, - {2815, {wxListEvent, getColumn, 0}}, - {2816, {wxListEvent, getPoint, 0}}, - {2817, {wxListEvent, getLabel, 0}}, - {2818, {wxListEvent, getText, 0}}, - {2819, {wxListEvent, getImage, 0}}, - {2820, {wxListEvent, getData, 0}}, - {2821, {wxListEvent, getMask, 0}}, - {2822, {wxListEvent, getItem, 0}}, - {2823, {wxListEvent, isEditCancelled, 0}}, - {2824, {wxDateEvent, getDate, 0}}, - {2825, {wxCalendarEvent, getWeekDay, 0}}, - {2826, {wxFileDirPickerEvent, getPath, 0}}, - {2827, {wxColourPickerEvent, getColour, 0}}, - {2828, {wxFontPickerEvent, getFont, 0}}, - {2829, {wxStyledTextEvent, getPosition, 0}}, - {2830, {wxStyledTextEvent, getKey, 0}}, - {2831, {wxStyledTextEvent, getModifiers, 0}}, - {2832, {wxStyledTextEvent, getModificationType, 0}}, - {2833, {wxStyledTextEvent, getText, 0}}, - {2834, {wxStyledTextEvent, getLength, 0}}, - {2835, {wxStyledTextEvent, getLinesAdded, 0}}, - {2836, {wxStyledTextEvent, getLine, 0}}, - {2837, {wxStyledTextEvent, getFoldLevelNow, 0}}, - {2838, {wxStyledTextEvent, getFoldLevelPrev, 0}}, - {2839, {wxStyledTextEvent, getMargin, 0}}, - {2840, {wxStyledTextEvent, getMessage, 0}}, - {2841, {wxStyledTextEvent, getWParam, 0}}, - {2842, {wxStyledTextEvent, getLParam, 0}}, - {2843, {wxStyledTextEvent, getListType, 0}}, - {2844, {wxStyledTextEvent, getX, 0}}, - {2845, {wxStyledTextEvent, getY, 0}}, - {2846, {wxStyledTextEvent, getDragText, 0}}, - {2847, {wxStyledTextEvent, getDragAllowMove, 0}}, - {2848, {wxStyledTextEvent, getDragResult, 0}}, - {2849, {wxStyledTextEvent, getShift, 0}}, - {2850, {wxStyledTextEvent, getControl, 0}}, - {2851, {wxStyledTextEvent, getAlt, 0}}, - {2852, {utils, getKeyState, 1}}, - {2853, {utils, getMousePosition, 2}}, - {2854, {utils, getMouseState, 0}}, - {2855, {utils, setDetectableAutoRepeat, 1}}, - {2856, {utils, bell, 0}}, - {2857, {utils, findMenuItemId, 3}}, - {2858, {utils, genericFindWindowAtPoint, 1}}, - {2859, {utils, findWindowAtPoint, 1}}, - {2860, {utils, beginBusyCursor, 1}}, - {2861, {utils, endBusyCursor, 0}}, - {2862, {utils, isBusy, 0}}, - {2863, {utils, shutdown, 1}}, - {2864, {utils, shell, 1}}, - {2865, {utils, launchDefaultBrowser, 2}}, - {2866, {utils, getEmailAddress, 0}}, - {2867, {utils, getUserId, 0}}, - {2868, {utils, getHomeDir, 0}}, - {2869, {utils, newId, 0}}, - {2870, {utils, registerId, 1}}, - {2871, {utils, getCurrentId, 0}}, - {2872, {utils, getOsDescription, 0}}, - {2873, {utils, isPlatformLittleEndian, 0}}, - {2874, {utils, isPlatform64Bit, 0}}, - {2875, {wxPrintout, new, 1}}, - {2876, {wxPrintout, destruct, 0}}, - {2877, {wxPrintout, getDC, 0}}, - {2878, {wxPrintout, getPageSizeMM, 2}}, - {2879, {wxPrintout, getPageSizePixels, 2}}, - {2880, {wxPrintout, getPaperRectPixels, 0}}, - {2881, {wxPrintout, getPPIPrinter, 2}}, - {2882, {wxPrintout, getPPIScreen, 2}}, - {2883, {wxPrintout, getTitle, 0}}, - {2884, {wxPrintout, isPreview, 0}}, - {2885, {wxPrintout, fitThisSizeToPaper, 1}}, - {2886, {wxPrintout, fitThisSizeToPage, 1}}, - {2887, {wxPrintout, fitThisSizeToPageMargins, 2}}, - {2888, {wxPrintout, mapScreenSizeToPaper, 0}}, - {2889, {wxPrintout, mapScreenSizeToPage, 0}}, - {2890, {wxPrintout, mapScreenSizeToPageMargins, 1}}, - {2891, {wxPrintout, mapScreenSizeToDevice, 0}}, - {2892, {wxPrintout, getLogicalPaperRect, 0}}, - {2893, {wxPrintout, getLogicalPageRect, 0}}, - {2894, {wxPrintout, getLogicalPageMarginsRect, 1}}, - {2895, {wxPrintout, setLogicalOrigin, 2}}, - {2896, {wxPrintout, offsetLogicalOrigin, 2}}, - {2897, {wxStyledTextCtrl, new_2, 2}}, - {2898, {wxStyledTextCtrl, new_0, 0}}, - {2899, {wxStyledTextCtrl, destruct, 0}}, - {2900, {wxStyledTextCtrl, create, 2}}, - {2901, {wxStyledTextCtrl, addText, 1}}, - {2902, {wxStyledTextCtrl, addStyledText, 1}}, - {2903, {wxStyledTextCtrl, insertText, 2}}, - {2904, {wxStyledTextCtrl, clearAll, 0}}, - {2905, {wxStyledTextCtrl, clearDocumentStyle, 0}}, - {2906, {wxStyledTextCtrl, getLength, 0}}, - {2907, {wxStyledTextCtrl, getCharAt, 1}}, - {2908, {wxStyledTextCtrl, getCurrentPos, 0}}, - {2909, {wxStyledTextCtrl, getAnchor, 0}}, - {2910, {wxStyledTextCtrl, getStyleAt, 1}}, - {2911, {wxStyledTextCtrl, redo, 0}}, - {2912, {wxStyledTextCtrl, setUndoCollection, 1}}, - {2913, {wxStyledTextCtrl, selectAll, 0}}, - {2914, {wxStyledTextCtrl, setSavePoint, 0}}, - {2915, {wxStyledTextCtrl, getStyledText, 2}}, - {2916, {wxStyledTextCtrl, canRedo, 0}}, - {2917, {wxStyledTextCtrl, markerLineFromHandle, 1}}, - {2918, {wxStyledTextCtrl, markerDeleteHandle, 1}}, - {2919, {wxStyledTextCtrl, getUndoCollection, 0}}, - {2920, {wxStyledTextCtrl, getViewWhiteSpace, 0}}, - {2921, {wxStyledTextCtrl, setViewWhiteSpace, 1}}, - {2922, {wxStyledTextCtrl, positionFromPoint, 1}}, - {2923, {wxStyledTextCtrl, positionFromPointClose, 2}}, - {2924, {wxStyledTextCtrl, gotoLine, 1}}, - {2925, {wxStyledTextCtrl, gotoPos, 1}}, - {2926, {wxStyledTextCtrl, setAnchor, 1}}, - {2927, {wxStyledTextCtrl, getCurLine, 1}}, - {2928, {wxStyledTextCtrl, getEndStyled, 0}}, - {2929, {wxStyledTextCtrl, convertEOLs, 1}}, - {2930, {wxStyledTextCtrl, getEOLMode, 0}}, - {2931, {wxStyledTextCtrl, setEOLMode, 1}}, - {2932, {wxStyledTextCtrl, startStyling, 2}}, - {2933, {wxStyledTextCtrl, setStyling, 2}}, - {2934, {wxStyledTextCtrl, getBufferedDraw, 0}}, - {2935, {wxStyledTextCtrl, setBufferedDraw, 1}}, - {2936, {wxStyledTextCtrl, setTabWidth, 1}}, - {2937, {wxStyledTextCtrl, getTabWidth, 0}}, - {2938, {wxStyledTextCtrl, setCodePage, 1}}, - {2939, {wxStyledTextCtrl, markerDefine, 3}}, - {2940, {wxStyledTextCtrl, markerSetForeground, 2}}, - {2941, {wxStyledTextCtrl, markerSetBackground, 2}}, - {2942, {wxStyledTextCtrl, markerAdd, 2}}, - {2943, {wxStyledTextCtrl, markerDelete, 2}}, - {2944, {wxStyledTextCtrl, markerDeleteAll, 1}}, - {2945, {wxStyledTextCtrl, markerGet, 1}}, - {2946, {wxStyledTextCtrl, markerNext, 2}}, - {2947, {wxStyledTextCtrl, markerPrevious, 2}}, - {2948, {wxStyledTextCtrl, markerDefineBitmap, 2}}, - {2949, {wxStyledTextCtrl, markerAddSet, 2}}, - {2950, {wxStyledTextCtrl, markerSetAlpha, 2}}, - {2951, {wxStyledTextCtrl, setMarginType, 2}}, - {2952, {wxStyledTextCtrl, getMarginType, 1}}, - {2953, {wxStyledTextCtrl, setMarginWidth, 2}}, - {2954, {wxStyledTextCtrl, getMarginWidth, 1}}, - {2955, {wxStyledTextCtrl, setMarginMask, 2}}, - {2956, {wxStyledTextCtrl, getMarginMask, 1}}, - {2957, {wxStyledTextCtrl, setMarginSensitive, 2}}, - {2958, {wxStyledTextCtrl, getMarginSensitive, 1}}, - {2959, {wxStyledTextCtrl, styleClearAll, 0}}, - {2960, {wxStyledTextCtrl, styleSetForeground, 2}}, - {2961, {wxStyledTextCtrl, styleSetBackground, 2}}, - {2962, {wxStyledTextCtrl, styleSetBold, 2}}, - {2963, {wxStyledTextCtrl, styleSetItalic, 2}}, - {2964, {wxStyledTextCtrl, styleSetSize, 2}}, - {2965, {wxStyledTextCtrl, styleSetFaceName, 2}}, - {2966, {wxStyledTextCtrl, styleSetEOLFilled, 2}}, - {2967, {wxStyledTextCtrl, styleResetDefault, 0}}, - {2968, {wxStyledTextCtrl, styleSetUnderline, 2}}, - {2969, {wxStyledTextCtrl, styleSetCase, 2}}, - {2970, {wxStyledTextCtrl, styleSetHotSpot, 2}}, - {2971, {wxStyledTextCtrl, setSelForeground, 2}}, - {2972, {wxStyledTextCtrl, setSelBackground, 2}}, - {2973, {wxStyledTextCtrl, getSelAlpha, 0}}, - {2974, {wxStyledTextCtrl, setSelAlpha, 1}}, - {2975, {wxStyledTextCtrl, setCaretForeground, 1}}, - {2976, {wxStyledTextCtrl, cmdKeyAssign, 3}}, - {2977, {wxStyledTextCtrl, cmdKeyClear, 2}}, - {2978, {wxStyledTextCtrl, cmdKeyClearAll, 0}}, - {2979, {wxStyledTextCtrl, setStyleBytes, 2}}, - {2980, {wxStyledTextCtrl, styleSetVisible, 2}}, - {2981, {wxStyledTextCtrl, getCaretPeriod, 0}}, - {2982, {wxStyledTextCtrl, setCaretPeriod, 1}}, - {2983, {wxStyledTextCtrl, setWordChars, 1}}, - {2984, {wxStyledTextCtrl, beginUndoAction, 0}}, - {2985, {wxStyledTextCtrl, endUndoAction, 0}}, - {2986, {wxStyledTextCtrl, indicatorSetStyle, 2}}, - {2987, {wxStyledTextCtrl, indicatorGetStyle, 1}}, - {2988, {wxStyledTextCtrl, indicatorSetForeground, 2}}, - {2989, {wxStyledTextCtrl, indicatorGetForeground, 1}}, - {2990, {wxStyledTextCtrl, setWhitespaceForeground, 2}}, - {2991, {wxStyledTextCtrl, setWhitespaceBackground, 2}}, - {2992, {wxStyledTextCtrl, getStyleBits, 0}}, - {2993, {wxStyledTextCtrl, setLineState, 2}}, - {2994, {wxStyledTextCtrl, getLineState, 1}}, - {2995, {wxStyledTextCtrl, getMaxLineState, 0}}, - {2996, {wxStyledTextCtrl, getCaretLineVisible, 0}}, - {2997, {wxStyledTextCtrl, setCaretLineVisible, 1}}, - {2998, {wxStyledTextCtrl, getCaretLineBackground, 0}}, - {2999, {wxStyledTextCtrl, setCaretLineBackground, 1}}, - {3000, {wxStyledTextCtrl, autoCompShow, 2}}, - {3001, {wxStyledTextCtrl, autoCompCancel, 0}}, - {3002, {wxStyledTextCtrl, autoCompActive, 0}}, - {3003, {wxStyledTextCtrl, autoCompPosStart, 0}}, - {3004, {wxStyledTextCtrl, autoCompComplete, 0}}, - {3005, {wxStyledTextCtrl, autoCompStops, 1}}, - {3006, {wxStyledTextCtrl, autoCompSetSeparator, 1}}, - {3007, {wxStyledTextCtrl, autoCompGetSeparator, 0}}, - {3008, {wxStyledTextCtrl, autoCompSelect, 1}}, - {3009, {wxStyledTextCtrl, autoCompSetCancelAtStart, 1}}, - {3010, {wxStyledTextCtrl, autoCompGetCancelAtStart, 0}}, - {3011, {wxStyledTextCtrl, autoCompSetFillUps, 1}}, - {3012, {wxStyledTextCtrl, autoCompSetChooseSingle, 1}}, - {3013, {wxStyledTextCtrl, autoCompGetChooseSingle, 0}}, - {3014, {wxStyledTextCtrl, autoCompSetIgnoreCase, 1}}, - {3015, {wxStyledTextCtrl, autoCompGetIgnoreCase, 0}}, - {3016, {wxStyledTextCtrl, userListShow, 2}}, - {3017, {wxStyledTextCtrl, autoCompSetAutoHide, 1}}, - {3018, {wxStyledTextCtrl, autoCompGetAutoHide, 0}}, - {3019, {wxStyledTextCtrl, autoCompSetDropRestOfWord, 1}}, - {3020, {wxStyledTextCtrl, autoCompGetDropRestOfWord, 0}}, - {3021, {wxStyledTextCtrl, registerImage, 2}}, - {3022, {wxStyledTextCtrl, clearRegisteredImages, 0}}, - {3023, {wxStyledTextCtrl, autoCompGetTypeSeparator, 0}}, - {3024, {wxStyledTextCtrl, autoCompSetTypeSeparator, 1}}, - {3025, {wxStyledTextCtrl, autoCompSetMaxWidth, 1}}, - {3026, {wxStyledTextCtrl, autoCompGetMaxWidth, 0}}, - {3027, {wxStyledTextCtrl, autoCompSetMaxHeight, 1}}, - {3028, {wxStyledTextCtrl, autoCompGetMaxHeight, 0}}, - {3029, {wxStyledTextCtrl, setIndent, 1}}, - {3030, {wxStyledTextCtrl, getIndent, 0}}, - {3031, {wxStyledTextCtrl, setUseTabs, 1}}, - {3032, {wxStyledTextCtrl, getUseTabs, 0}}, - {3033, {wxStyledTextCtrl, setLineIndentation, 2}}, - {3034, {wxStyledTextCtrl, getLineIndentation, 1}}, - {3035, {wxStyledTextCtrl, getLineIndentPosition, 1}}, - {3036, {wxStyledTextCtrl, getColumn, 1}}, - {3037, {wxStyledTextCtrl, setUseHorizontalScrollBar, 1}}, - {3038, {wxStyledTextCtrl, getUseHorizontalScrollBar, 0}}, - {3039, {wxStyledTextCtrl, setIndentationGuides, 1}}, - {3040, {wxStyledTextCtrl, getIndentationGuides, 0}}, - {3041, {wxStyledTextCtrl, setHighlightGuide, 1}}, - {3042, {wxStyledTextCtrl, getHighlightGuide, 0}}, - {3043, {wxStyledTextCtrl, getLineEndPosition, 1}}, - {3044, {wxStyledTextCtrl, getCodePage, 0}}, - {3045, {wxStyledTextCtrl, getCaretForeground, 0}}, - {3046, {wxStyledTextCtrl, getReadOnly, 0}}, - {3047, {wxStyledTextCtrl, setCurrentPos, 1}}, - {3048, {wxStyledTextCtrl, setSelectionStart, 1}}, - {3049, {wxStyledTextCtrl, getSelectionStart, 0}}, - {3050, {wxStyledTextCtrl, setSelectionEnd, 1}}, - {3051, {wxStyledTextCtrl, getSelectionEnd, 0}}, - {3052, {wxStyledTextCtrl, setPrintMagnification, 1}}, - {3053, {wxStyledTextCtrl, getPrintMagnification, 0}}, - {3054, {wxStyledTextCtrl, setPrintColourMode, 1}}, - {3055, {wxStyledTextCtrl, getPrintColourMode, 0}}, - {3056, {wxStyledTextCtrl, findText, 4}}, - {3057, {wxStyledTextCtrl, formatRange, 7}}, - {3058, {wxStyledTextCtrl, getFirstVisibleLine, 0}}, - {3059, {wxStyledTextCtrl, getLine, 1}}, - {3060, {wxStyledTextCtrl, getLineCount, 0}}, - {3061, {wxStyledTextCtrl, setMarginLeft, 1}}, - {3062, {wxStyledTextCtrl, getMarginLeft, 0}}, - {3063, {wxStyledTextCtrl, setMarginRight, 1}}, - {3064, {wxStyledTextCtrl, getMarginRight, 0}}, - {3065, {wxStyledTextCtrl, getModify, 0}}, - {3066, {wxStyledTextCtrl, setSelection, 2}}, - {3067, {wxStyledTextCtrl, getSelectedText, 0}}, - {3068, {wxStyledTextCtrl, getTextRange, 2}}, - {3069, {wxStyledTextCtrl, hideSelection, 1}}, - {3070, {wxStyledTextCtrl, lineFromPosition, 1}}, - {3071, {wxStyledTextCtrl, positionFromLine, 1}}, - {3072, {wxStyledTextCtrl, lineScroll, 2}}, - {3073, {wxStyledTextCtrl, ensureCaretVisible, 0}}, - {3074, {wxStyledTextCtrl, replaceSelection, 1}}, - {3075, {wxStyledTextCtrl, setReadOnly, 1}}, - {3076, {wxStyledTextCtrl, canPaste, 0}}, - {3077, {wxStyledTextCtrl, canUndo, 0}}, - {3078, {wxStyledTextCtrl, emptyUndoBuffer, 0}}, - {3079, {wxStyledTextCtrl, undo, 0}}, - {3080, {wxStyledTextCtrl, cut, 0}}, - {3081, {wxStyledTextCtrl, copy, 0}}, - {3082, {wxStyledTextCtrl, paste, 0}}, - {3083, {wxStyledTextCtrl, clear, 0}}, - {3084, {wxStyledTextCtrl, setText, 1}}, - {3085, {wxStyledTextCtrl, getText, 0}}, - {3086, {wxStyledTextCtrl, getTextLength, 0}}, - {3087, {wxStyledTextCtrl, getOvertype, 0}}, - {3088, {wxStyledTextCtrl, setCaretWidth, 1}}, - {3089, {wxStyledTextCtrl, getCaretWidth, 0}}, - {3090, {wxStyledTextCtrl, setTargetStart, 1}}, - {3091, {wxStyledTextCtrl, getTargetStart, 0}}, - {3092, {wxStyledTextCtrl, setTargetEnd, 1}}, - {3093, {wxStyledTextCtrl, getTargetEnd, 0}}, - {3094, {wxStyledTextCtrl, replaceTarget, 1}}, - {3095, {wxStyledTextCtrl, searchInTarget, 1}}, - {3096, {wxStyledTextCtrl, setSearchFlags, 1}}, - {3097, {wxStyledTextCtrl, getSearchFlags, 0}}, - {3098, {wxStyledTextCtrl, callTipShow, 2}}, - {3099, {wxStyledTextCtrl, callTipCancel, 0}}, - {3100, {wxStyledTextCtrl, callTipActive, 0}}, - {3101, {wxStyledTextCtrl, callTipPosAtStart, 0}}, - {3102, {wxStyledTextCtrl, callTipSetHighlight, 2}}, - {3103, {wxStyledTextCtrl, callTipSetBackground, 1}}, - {3104, {wxStyledTextCtrl, callTipSetForeground, 1}}, - {3105, {wxStyledTextCtrl, callTipSetForegroundHighlight, 1}}, - {3106, {wxStyledTextCtrl, callTipUseStyle, 1}}, - {3107, {wxStyledTextCtrl, visibleFromDocLine, 1}}, - {3108, {wxStyledTextCtrl, docLineFromVisible, 1}}, - {3109, {wxStyledTextCtrl, wrapCount, 1}}, - {3110, {wxStyledTextCtrl, setFoldLevel, 2}}, - {3111, {wxStyledTextCtrl, getFoldLevel, 1}}, - {3112, {wxStyledTextCtrl, getLastChild, 2}}, - {3113, {wxStyledTextCtrl, getFoldParent, 1}}, - {3114, {wxStyledTextCtrl, showLines, 2}}, - {3115, {wxStyledTextCtrl, hideLines, 2}}, - {3116, {wxStyledTextCtrl, getLineVisible, 1}}, - {3117, {wxStyledTextCtrl, setFoldExpanded, 2}}, - {3118, {wxStyledTextCtrl, getFoldExpanded, 1}}, - {3119, {wxStyledTextCtrl, toggleFold, 1}}, - {3120, {wxStyledTextCtrl, ensureVisible, 1}}, - {3121, {wxStyledTextCtrl, setFoldFlags, 1}}, - {3122, {wxStyledTextCtrl, ensureVisibleEnforcePolicy, 1}}, - {3123, {wxStyledTextCtrl, setTabIndents, 1}}, - {3124, {wxStyledTextCtrl, getTabIndents, 0}}, - {3125, {wxStyledTextCtrl, setBackSpaceUnIndents, 1}}, - {3126, {wxStyledTextCtrl, getBackSpaceUnIndents, 0}}, - {3127, {wxStyledTextCtrl, setMouseDwellTime, 1}}, - {3128, {wxStyledTextCtrl, getMouseDwellTime, 0}}, - {3129, {wxStyledTextCtrl, wordStartPosition, 2}}, - {3130, {wxStyledTextCtrl, wordEndPosition, 2}}, - {3131, {wxStyledTextCtrl, setWrapMode, 1}}, - {3132, {wxStyledTextCtrl, getWrapMode, 0}}, - {3133, {wxStyledTextCtrl, setWrapVisualFlags, 1}}, - {3134, {wxStyledTextCtrl, getWrapVisualFlags, 0}}, - {3135, {wxStyledTextCtrl, setWrapVisualFlagsLocation, 1}}, - {3136, {wxStyledTextCtrl, getWrapVisualFlagsLocation, 0}}, - {3137, {wxStyledTextCtrl, setWrapStartIndent, 1}}, - {3138, {wxStyledTextCtrl, getWrapStartIndent, 0}}, - {3139, {wxStyledTextCtrl, setLayoutCache, 1}}, - {3140, {wxStyledTextCtrl, getLayoutCache, 0}}, - {3141, {wxStyledTextCtrl, setScrollWidth, 1}}, - {3142, {wxStyledTextCtrl, getScrollWidth, 0}}, - {3143, {wxStyledTextCtrl, textWidth, 2}}, - {3144, {wxStyledTextCtrl, getEndAtLastLine, 0}}, - {3145, {wxStyledTextCtrl, textHeight, 1}}, - {3146, {wxStyledTextCtrl, setUseVerticalScrollBar, 1}}, - {3147, {wxStyledTextCtrl, getUseVerticalScrollBar, 0}}, - {3148, {wxStyledTextCtrl, appendText, 1}}, - {3149, {wxStyledTextCtrl, getTwoPhaseDraw, 0}}, - {3150, {wxStyledTextCtrl, setTwoPhaseDraw, 1}}, - {3151, {wxStyledTextCtrl, targetFromSelection, 0}}, - {3152, {wxStyledTextCtrl, linesJoin, 0}}, - {3153, {wxStyledTextCtrl, linesSplit, 1}}, - {3154, {wxStyledTextCtrl, setFoldMarginColour, 2}}, - {3155, {wxStyledTextCtrl, setFoldMarginHiColour, 2}}, - {3156, {wxStyledTextCtrl, lineDown, 0}}, - {3157, {wxStyledTextCtrl, lineDownExtend, 0}}, - {3158, {wxStyledTextCtrl, lineUp, 0}}, - {3159, {wxStyledTextCtrl, lineUpExtend, 0}}, - {3160, {wxStyledTextCtrl, charLeft, 0}}, - {3161, {wxStyledTextCtrl, charLeftExtend, 0}}, - {3162, {wxStyledTextCtrl, charRight, 0}}, - {3163, {wxStyledTextCtrl, charRightExtend, 0}}, - {3164, {wxStyledTextCtrl, wordLeft, 0}}, - {3165, {wxStyledTextCtrl, wordLeftExtend, 0}}, - {3166, {wxStyledTextCtrl, wordRight, 0}}, - {3167, {wxStyledTextCtrl, wordRightExtend, 0}}, - {3168, {wxStyledTextCtrl, home, 0}}, - {3169, {wxStyledTextCtrl, homeExtend, 0}}, - {3170, {wxStyledTextCtrl, lineEnd, 0}}, - {3171, {wxStyledTextCtrl, lineEndExtend, 0}}, - {3172, {wxStyledTextCtrl, documentStart, 0}}, - {3173, {wxStyledTextCtrl, documentStartExtend, 0}}, - {3174, {wxStyledTextCtrl, documentEnd, 0}}, - {3175, {wxStyledTextCtrl, documentEndExtend, 0}}, - {3176, {wxStyledTextCtrl, pageUp, 0}}, - {3177, {wxStyledTextCtrl, pageUpExtend, 0}}, - {3178, {wxStyledTextCtrl, pageDown, 0}}, - {3179, {wxStyledTextCtrl, pageDownExtend, 0}}, - {3180, {wxStyledTextCtrl, editToggleOvertype, 0}}, - {3181, {wxStyledTextCtrl, cancel, 0}}, - {3182, {wxStyledTextCtrl, deleteBack, 0}}, - {3183, {wxStyledTextCtrl, tab, 0}}, - {3184, {wxStyledTextCtrl, backTab, 0}}, - {3185, {wxStyledTextCtrl, newLine, 0}}, - {3186, {wxStyledTextCtrl, formFeed, 0}}, - {3187, {wxStyledTextCtrl, vCHome, 0}}, - {3188, {wxStyledTextCtrl, vCHomeExtend, 0}}, - {3189, {wxStyledTextCtrl, zoomIn, 0}}, - {3190, {wxStyledTextCtrl, zoomOut, 0}}, - {3191, {wxStyledTextCtrl, delWordLeft, 0}}, - {3192, {wxStyledTextCtrl, delWordRight, 0}}, - {3193, {wxStyledTextCtrl, lineCut, 0}}, - {3194, {wxStyledTextCtrl, lineDelete, 0}}, - {3195, {wxStyledTextCtrl, lineTranspose, 0}}, - {3196, {wxStyledTextCtrl, lineDuplicate, 0}}, - {3197, {wxStyledTextCtrl, lowerCase, 0}}, - {3198, {wxStyledTextCtrl, upperCase, 0}}, - {3199, {wxStyledTextCtrl, lineScrollDown, 0}}, - {3200, {wxStyledTextCtrl, lineScrollUp, 0}}, - {3201, {wxStyledTextCtrl, deleteBackNotLine, 0}}, - {3202, {wxStyledTextCtrl, homeDisplay, 0}}, - {3203, {wxStyledTextCtrl, homeDisplayExtend, 0}}, - {3204, {wxStyledTextCtrl, lineEndDisplay, 0}}, - {3205, {wxStyledTextCtrl, lineEndDisplayExtend, 0}}, - {3206, {wxStyledTextCtrl, homeWrapExtend, 0}}, - {3207, {wxStyledTextCtrl, lineEndWrap, 0}}, - {3208, {wxStyledTextCtrl, lineEndWrapExtend, 0}}, - {3209, {wxStyledTextCtrl, vCHomeWrap, 0}}, - {3210, {wxStyledTextCtrl, vCHomeWrapExtend, 0}}, - {3211, {wxStyledTextCtrl, lineCopy, 0}}, - {3212, {wxStyledTextCtrl, moveCaretInsideView, 0}}, - {3213, {wxStyledTextCtrl, lineLength, 1}}, - {3214, {wxStyledTextCtrl, braceHighlight, 2}}, - {3215, {wxStyledTextCtrl, braceBadLight, 1}}, - {3216, {wxStyledTextCtrl, braceMatch, 1}}, - {3217, {wxStyledTextCtrl, getViewEOL, 0}}, - {3218, {wxStyledTextCtrl, setViewEOL, 1}}, - {3219, {wxStyledTextCtrl, setModEventMask, 1}}, - {3220, {wxStyledTextCtrl, getEdgeColumn, 0}}, - {3221, {wxStyledTextCtrl, setEdgeColumn, 1}}, - {3222, {wxStyledTextCtrl, getEdgeMode, 0}}, - {3223, {wxStyledTextCtrl, getEdgeColour, 0}}, - {3224, {wxStyledTextCtrl, setEdgeColour, 1}}, - {3225, {wxStyledTextCtrl, searchAnchor, 0}}, - {3226, {wxStyledTextCtrl, searchNext, 2}}, - {3227, {wxStyledTextCtrl, searchPrev, 2}}, - {3228, {wxStyledTextCtrl, linesOnScreen, 0}}, - {3229, {wxStyledTextCtrl, usePopUp, 1}}, - {3230, {wxStyledTextCtrl, selectionIsRectangle, 0}}, - {3231, {wxStyledTextCtrl, setZoom, 1}}, - {3232, {wxStyledTextCtrl, getZoom, 0}}, - {3233, {wxStyledTextCtrl, getModEventMask, 0}}, - {3234, {wxStyledTextCtrl, setSTCFocus, 1}}, - {3235, {wxStyledTextCtrl, getSTCFocus, 0}}, - {3236, {wxStyledTextCtrl, setStatus, 1}}, - {3237, {wxStyledTextCtrl, getStatus, 0}}, - {3238, {wxStyledTextCtrl, setMouseDownCaptures, 1}}, - {3239, {wxStyledTextCtrl, getMouseDownCaptures, 0}}, - {3240, {wxStyledTextCtrl, setSTCCursor, 1}}, - {3241, {wxStyledTextCtrl, getSTCCursor, 0}}, - {3242, {wxStyledTextCtrl, setControlCharSymbol, 1}}, - {3243, {wxStyledTextCtrl, getControlCharSymbol, 0}}, - {3244, {wxStyledTextCtrl, wordPartLeft, 0}}, - {3245, {wxStyledTextCtrl, wordPartLeftExtend, 0}}, - {3246, {wxStyledTextCtrl, wordPartRight, 0}}, - {3247, {wxStyledTextCtrl, wordPartRightExtend, 0}}, - {3248, {wxStyledTextCtrl, setVisiblePolicy, 2}}, - {3249, {wxStyledTextCtrl, delLineLeft, 0}}, - {3250, {wxStyledTextCtrl, delLineRight, 0}}, - {3251, {wxStyledTextCtrl, getXOffset, 0}}, - {3252, {wxStyledTextCtrl, chooseCaretX, 0}}, - {3253, {wxStyledTextCtrl, setXCaretPolicy, 2}}, - {3254, {wxStyledTextCtrl, setYCaretPolicy, 2}}, - {3255, {wxStyledTextCtrl, getPrintWrapMode, 0}}, - {3256, {wxStyledTextCtrl, setHotspotActiveForeground, 2}}, - {3257, {wxStyledTextCtrl, setHotspotActiveBackground, 2}}, - {3258, {wxStyledTextCtrl, setHotspotActiveUnderline, 1}}, - {3259, {wxStyledTextCtrl, setHotspotSingleLine, 1}}, - {3260, {wxStyledTextCtrl, paraDownExtend, 0}}, - {3261, {wxStyledTextCtrl, paraUp, 0}}, - {3262, {wxStyledTextCtrl, paraUpExtend, 0}}, - {3263, {wxStyledTextCtrl, positionBefore, 1}}, - {3264, {wxStyledTextCtrl, positionAfter, 1}}, - {3265, {wxStyledTextCtrl, copyRange, 2}}, - {3266, {wxStyledTextCtrl, copyText, 2}}, - {3267, {wxStyledTextCtrl, setSelectionMode, 1}}, - {3268, {wxStyledTextCtrl, getSelectionMode, 0}}, - {3269, {wxStyledTextCtrl, lineDownRectExtend, 0}}, - {3270, {wxStyledTextCtrl, lineUpRectExtend, 0}}, - {3271, {wxStyledTextCtrl, charLeftRectExtend, 0}}, - {3272, {wxStyledTextCtrl, charRightRectExtend, 0}}, - {3273, {wxStyledTextCtrl, homeRectExtend, 0}}, - {3274, {wxStyledTextCtrl, vCHomeRectExtend, 0}}, - {3275, {wxStyledTextCtrl, lineEndRectExtend, 0}}, - {3276, {wxStyledTextCtrl, pageUpRectExtend, 0}}, - {3277, {wxStyledTextCtrl, pageDownRectExtend, 0}}, - {3278, {wxStyledTextCtrl, stutteredPageUp, 0}}, - {3279, {wxStyledTextCtrl, stutteredPageUpExtend, 0}}, - {3280, {wxStyledTextCtrl, stutteredPageDown, 0}}, - {3281, {wxStyledTextCtrl, stutteredPageDownExtend, 0}}, - {3282, {wxStyledTextCtrl, wordLeftEnd, 0}}, - {3283, {wxStyledTextCtrl, wordLeftEndExtend, 0}}, - {3284, {wxStyledTextCtrl, wordRightEnd, 0}}, - {3285, {wxStyledTextCtrl, wordRightEndExtend, 0}}, - {3286, {wxStyledTextCtrl, setWhitespaceChars, 1}}, - {3287, {wxStyledTextCtrl, setCharsDefault, 0}}, - {3288, {wxStyledTextCtrl, autoCompGetCurrent, 0}}, - {3289, {wxStyledTextCtrl, allocate, 1}}, - {3290, {wxStyledTextCtrl, findColumn, 2}}, - {3291, {wxStyledTextCtrl, getCaretSticky, 0}}, - {3292, {wxStyledTextCtrl, setCaretSticky, 1}}, - {3293, {wxStyledTextCtrl, toggleCaretSticky, 0}}, - {3294, {wxStyledTextCtrl, setPasteConvertEndings, 1}}, - {3295, {wxStyledTextCtrl, getPasteConvertEndings, 0}}, - {3296, {wxStyledTextCtrl, selectionDuplicate, 0}}, - {3297, {wxStyledTextCtrl, setCaretLineBackAlpha, 1}}, - {3298, {wxStyledTextCtrl, getCaretLineBackAlpha, 0}}, - {3299, {wxStyledTextCtrl, startRecord, 0}}, - {3300, {wxStyledTextCtrl, stopRecord, 0}}, - {3301, {wxStyledTextCtrl, setLexer, 1}}, - {3302, {wxStyledTextCtrl, getLexer, 0}}, - {3303, {wxStyledTextCtrl, colourise, 2}}, - {3304, {wxStyledTextCtrl, setProperty, 2}}, - {3305, {wxStyledTextCtrl, setKeyWords, 2}}, - {3306, {wxStyledTextCtrl, setLexerLanguage, 1}}, - {3307, {wxStyledTextCtrl, getProperty, 1}}, - {3308, {wxStyledTextCtrl, getStyleBitsNeeded, 0}}, - {3309, {wxStyledTextCtrl, getCurrentLine, 0}}, - {3310, {wxStyledTextCtrl, styleSetSpec, 2}}, - {3311, {wxStyledTextCtrl, styleSetFont, 2}}, - {3312, {wxStyledTextCtrl, styleSetFontAttr, 7}}, - {3313, {wxStyledTextCtrl, styleSetCharacterSet, 2}}, - {3314, {wxStyledTextCtrl, styleSetFontEncoding, 2}}, - {3315, {wxStyledTextCtrl, cmdKeyExecute, 1}}, - {3316, {wxStyledTextCtrl, setMargins, 2}}, - {3317, {wxStyledTextCtrl, getSelection, 2}}, - {3318, {wxStyledTextCtrl, pointFromPosition, 1}}, - {3319, {wxStyledTextCtrl, scrollToLine, 1}}, - {3320, {wxStyledTextCtrl, scrollToColumn, 1}}, - {3321, {wxStyledTextCtrl, sendMsg, 2}}, - {3322, {wxStyledTextCtrl, setVScrollBar, 1}}, - {3323, {wxStyledTextCtrl, setHScrollBar, 1}}, - {3324, {wxStyledTextCtrl, getLastKeydownProcessed, 0}}, - {3325, {wxStyledTextCtrl, setLastKeydownProcessed, 1}}, - {3326, {wxStyledTextCtrl, saveFile, 1}}, - {3327, {wxStyledTextCtrl, loadFile, 1}}, - {3328, {wxStyledTextCtrl, doDragOver, 3}}, - {3329, {wxStyledTextCtrl, doDropText, 3}}, - {3330, {wxStyledTextCtrl, getUseAntiAliasing, 0}}, - {3331, {wxStyledTextCtrl, addTextRaw, 1}}, - {3332, {wxStyledTextCtrl, insertTextRaw, 2}}, - {3333, {wxStyledTextCtrl, getCurLineRaw, 1}}, - {3334, {wxStyledTextCtrl, getLineRaw, 1}}, - {3335, {wxStyledTextCtrl, getSelectedTextRaw, 0}}, - {3336, {wxStyledTextCtrl, getTextRangeRaw, 2}}, - {3337, {wxStyledTextCtrl, setTextRaw, 1}}, - {3338, {wxStyledTextCtrl, getTextRaw, 0}}, - {3339, {wxStyledTextCtrl, appendTextRaw, 1}}, - {3340, {wxArtProvider, getBitmap, 2}}, - {3341, {wxArtProvider, getIcon, 2}}, - {3342, {wxTreeEvent, getKeyCode, 0}}, - {3343, {wxTreeEvent, getItem, 0}}, - {3344, {wxTreeEvent, getKeyEvent, 0}}, - {3345, {wxTreeEvent, getLabel, 0}}, - {3346, {wxTreeEvent, getOldItem, 0}}, - {3347, {wxTreeEvent, getPoint, 0}}, - {3348, {wxTreeEvent, isEditCancelled, 0}}, - {3349, {wxTreeEvent, setToolTip, 1}}, - {3350, {wxNotebookEvent, getOldSelection, 0}}, - {3351, {wxNotebookEvent, getSelection, 0}}, - {3352, {wxNotebookEvent, setOldSelection, 1}}, - {3353, {wxNotebookEvent, setSelection, 1}}, - {3354, {wxFileDataObject, new, 0}}, - {3355, {wxFileDataObject, addFile, 1}}, - {3356, {wxFileDataObject, getFilenames, 0}}, - {3357, {wxFileDataObject, 'Destroy', undefined}}, - {3358, {wxTextDataObject, new, 1}}, - {3359, {wxTextDataObject, getTextLength, 0}}, - {3360, {wxTextDataObject, getText, 0}}, - {3361, {wxTextDataObject, setText, 1}}, - {3362, {wxTextDataObject, 'Destroy', undefined}}, - {3363, {wxBitmapDataObject, new_1_1, 1}}, - {3364, {wxBitmapDataObject, new_1_0, 1}}, - {3365, {wxBitmapDataObject, getBitmap, 0}}, - {3366, {wxBitmapDataObject, setBitmap, 1}}, - {3367, {wxBitmapDataObject, 'Destroy', undefined}}, - {3369, {wxClipboard, new, 0}}, - {3370, {wxClipboard, destruct, 0}}, - {3371, {wxClipboard, addData, 1}}, - {3372, {wxClipboard, clear, 0}}, - {3373, {wxClipboard, close, 0}}, - {3374, {wxClipboard, flush, 0}}, - {3375, {wxClipboard, getData, 1}}, - {3376, {wxClipboard, isOpened, 0}}, - {3377, {wxClipboard, open, 0}}, - {3378, {wxClipboard, setData, 1}}, - {3380, {wxClipboard, usePrimarySelection, 1}}, - {3381, {wxClipboard, isSupported, 1}}, - {3382, {wxClipboard, get, 0}}, - {3383, {wxSpinEvent, getPosition, 0}}, - {3384, {wxSpinEvent, setPosition, 1}}, - {3385, {wxSplitterWindow, new_0, 0}}, - {3386, {wxSplitterWindow, new_2, 2}}, - {3387, {wxSplitterWindow, destruct, 0}}, - {3388, {wxSplitterWindow, create, 2}}, - {3389, {wxSplitterWindow, getMinimumPaneSize, 0}}, - {3390, {wxSplitterWindow, getSashGravity, 0}}, - {3391, {wxSplitterWindow, getSashPosition, 0}}, - {3392, {wxSplitterWindow, getSplitMode, 0}}, - {3393, {wxSplitterWindow, getWindow1, 0}}, - {3394, {wxSplitterWindow, getWindow2, 0}}, - {3395, {wxSplitterWindow, initialize, 1}}, - {3396, {wxSplitterWindow, isSplit, 0}}, - {3397, {wxSplitterWindow, replaceWindow, 2}}, - {3398, {wxSplitterWindow, setSashGravity, 1}}, - {3399, {wxSplitterWindow, setSashPosition, 2}}, - {3400, {wxSplitterWindow, setSashSize, 1}}, - {3401, {wxSplitterWindow, setMinimumPaneSize, 1}}, - {3402, {wxSplitterWindow, setSplitMode, 1}}, - {3403, {wxSplitterWindow, splitHorizontally, 3}}, - {3404, {wxSplitterWindow, splitVertically, 3}}, - {3405, {wxSplitterWindow, unsplit, 1}}, - {3406, {wxSplitterWindow, updateSize, 0}}, - {3407, {wxSplitterEvent, getSashPosition, 0}}, - {3408, {wxSplitterEvent, getX, 0}}, - {3409, {wxSplitterEvent, getY, 0}}, - {3410, {wxSplitterEvent, getWindowBeingRemoved, 0}}, - {3411, {wxSplitterEvent, setSashPosition, 1}}, + {560, {wxGridCellEditor, create, 3}}, + {561, {wxGridCellEditor, isCreated, 0}}, + {562, {wxGridCellEditor, setSize, 1}}, + {563, {wxGridCellEditor, show, 2}}, + {564, {wxGridCellEditor, paintBackground, 2}}, + {565, {wxGridCellEditor, beginEdit, 3}}, + {566, {wxGridCellEditor, endEdit, 3}}, + {567, {wxGridCellEditor, reset, 0}}, + {568, {wxGridCellEditor, startingKey, 1}}, + {569, {wxGridCellEditor, startingClick, 0}}, + {570, {wxGridCellEditor, handleReturn, 1}}, + {571, {wxGridCellBoolRenderer, new, 0}}, + {572, {wxGridCellBoolRenderer, 'Destroy', undefined}}, + {573, {wxGridCellBoolEditor, new, 0}}, + {574, {wxGridCellBoolEditor, isTrueValue, 1}}, + {575, {wxGridCellBoolEditor, useStringValues, 1}}, + {576, {wxGridCellBoolEditor, 'Destroy', undefined}}, + {577, {wxGridCellFloatRenderer, new, 1}}, + {578, {wxGridCellFloatRenderer, getPrecision, 0}}, + {579, {wxGridCellFloatRenderer, getWidth, 0}}, + {580, {wxGridCellFloatRenderer, setParameters, 1}}, + {581, {wxGridCellFloatRenderer, setPrecision, 1}}, + {582, {wxGridCellFloatRenderer, setWidth, 1}}, + {583, {wxGridCellFloatRenderer, 'Destroy', undefined}}, + {584, {wxGridCellFloatEditor, new, 1}}, + {585, {wxGridCellFloatEditor, setParameters, 1}}, + {586, {wxGridCellFloatEditor, 'Destroy', undefined}}, + {587, {wxGridCellStringRenderer, new, 0}}, + {588, {wxGridCellStringRenderer, 'Destroy', undefined}}, + {589, {wxGridCellTextEditor, new, 0}}, + {590, {wxGridCellTextEditor, setParameters, 1}}, + {591, {wxGridCellTextEditor, 'Destroy', undefined}}, + {593, {wxGridCellChoiceEditor, new, 2}}, + {594, {wxGridCellChoiceEditor, setParameters, 1}}, + {595, {wxGridCellChoiceEditor, 'Destroy', undefined}}, + {596, {wxGridCellNumberRenderer, new, 0}}, + {597, {wxGridCellNumberRenderer, 'Destroy', undefined}}, + {598, {wxGridCellNumberEditor, new, 1}}, + {599, {wxGridCellNumberEditor, getValue, 0}}, + {600, {wxGridCellNumberEditor, setParameters, 1}}, + {601, {wxGridCellNumberEditor, 'Destroy', undefined}}, + {602, {wxGridCellAttr, setTextColour, 1}}, + {603, {wxGridCellAttr, setBackgroundColour, 1}}, + {604, {wxGridCellAttr, setFont, 1}}, + {605, {wxGridCellAttr, setAlignment, 2}}, + {606, {wxGridCellAttr, setReadOnly, 1}}, + {607, {wxGridCellAttr, setRenderer, 1}}, + {608, {wxGridCellAttr, setEditor, 1}}, + {609, {wxGridCellAttr, hasTextColour, 0}}, + {610, {wxGridCellAttr, hasBackgroundColour, 0}}, + {611, {wxGridCellAttr, hasFont, 0}}, + {612, {wxGridCellAttr, hasAlignment, 0}}, + {613, {wxGridCellAttr, hasRenderer, 0}}, + {614, {wxGridCellAttr, hasEditor, 0}}, + {615, {wxGridCellAttr, getTextColour, 0}}, + {616, {wxGridCellAttr, getBackgroundColour, 0}}, + {617, {wxGridCellAttr, getFont, 0}}, + {618, {wxGridCellAttr, getAlignment, 2}}, + {619, {wxGridCellAttr, getRenderer, 3}}, + {620, {wxGridCellAttr, getEditor, 3}}, + {621, {wxGridCellAttr, isReadOnly, 0}}, + {622, {wxGridCellAttr, setDefAttr, 1}}, + {623, {wxDC, blit, 5}}, + {624, {wxDC, calcBoundingBox, 2}}, + {625, {wxDC, clear, 0}}, + {626, {wxDC, computeScaleAndOrigin, 0}}, + {627, {wxDC, crossHair, 1}}, + {628, {wxDC, destroyClippingRegion, 0}}, + {629, {wxDC, deviceToLogicalX, 1}}, + {630, {wxDC, deviceToLogicalXRel, 1}}, + {631, {wxDC, deviceToLogicalY, 1}}, + {632, {wxDC, deviceToLogicalYRel, 1}}, + {633, {wxDC, drawArc, 3}}, + {634, {wxDC, drawBitmap, 3}}, + {635, {wxDC, drawCheckMark, 1}}, + {636, {wxDC, drawCircle, 2}}, + {638, {wxDC, drawEllipse_2, 2}}, + {639, {wxDC, drawEllipse_1, 1}}, + {640, {wxDC, drawEllipticArc, 4}}, + {641, {wxDC, drawIcon, 2}}, + {642, {wxDC, drawLabel, 3}}, + {643, {wxDC, drawLine, 2}}, + {644, {wxDC, drawLines, 3}}, + {646, {wxDC, drawPolygon, 3}}, + {648, {wxDC, drawPoint, 1}}, + {650, {wxDC, drawRectangle_2, 2}}, + {651, {wxDC, drawRectangle_1, 1}}, + {652, {wxDC, drawRotatedText, 3}}, + {654, {wxDC, drawRoundedRectangle_3, 3}}, + {655, {wxDC, drawRoundedRectangle_2, 2}}, + {656, {wxDC, drawText, 2}}, + {657, {wxDC, endDoc, 0}}, + {658, {wxDC, endPage, 0}}, + {659, {wxDC, floodFill, 3}}, + {660, {wxDC, getBackground, 0}}, + {661, {wxDC, getBackgroundMode, 0}}, + {662, {wxDC, getBrush, 0}}, + {663, {wxDC, getCharHeight, 0}}, + {664, {wxDC, getCharWidth, 0}}, + {665, {wxDC, getClippingBox, 1}}, + {666, {wxDC, getFont, 0}}, + {667, {wxDC, getLayoutDirection, 0}}, + {668, {wxDC, getLogicalFunction, 0}}, + {669, {wxDC, getMapMode, 0}}, + {670, {wxDC, getMultiLineTextExtent_4, 4}}, + {671, {wxDC, getMultiLineTextExtent_1, 1}}, + {672, {wxDC, getPartialTextExtents, 2}}, + {673, {wxDC, getPen, 0}}, + {674, {wxDC, getPixel, 2}}, + {675, {wxDC, getPPI, 0}}, + {677, {wxDC, getSize, 0}}, + {679, {wxDC, getSizeMM, 0}}, + {680, {wxDC, getTextBackground, 0}}, + {681, {wxDC, getTextExtent_4, 4}}, + {682, {wxDC, getTextExtent_1, 1}}, + {684, {wxDC, getTextForeground, 0}}, + {685, {wxDC, getUserScale, 2}}, + {686, {wxDC, gradientFillConcentric_3, 3}}, + {687, {wxDC, gradientFillConcentric_4, 4}}, + {688, {wxDC, gradientFillLinear, 4}}, + {689, {wxDC, logicalToDeviceX, 1}}, + {690, {wxDC, logicalToDeviceXRel, 1}}, + {691, {wxDC, logicalToDeviceY, 1}}, + {692, {wxDC, logicalToDeviceYRel, 1}}, + {693, {wxDC, maxX, 0}}, + {694, {wxDC, maxY, 0}}, + {695, {wxDC, minX, 0}}, + {696, {wxDC, minY, 0}}, + {697, {wxDC, isOk, 0}}, + {698, {wxDC, resetBoundingBox, 0}}, + {699, {wxDC, setAxisOrientation, 2}}, + {700, {wxDC, setBackground, 1}}, + {701, {wxDC, setBackgroundMode, 1}}, + {702, {wxDC, setBrush, 1}}, + {704, {wxDC, setClippingRegion_2, 2}}, + {705, {wxDC, setClippingRegion_1_1, 1}}, + {706, {wxDC, setClippingRegion_1_0, 1}}, + {707, {wxDC, setDeviceOrigin, 2}}, + {708, {wxDC, setFont, 1}}, + {709, {wxDC, setLayoutDirection, 1}}, + {710, {wxDC, setLogicalFunction, 1}}, + {711, {wxDC, setMapMode, 1}}, + {712, {wxDC, setPalette, 1}}, + {713, {wxDC, setPen, 1}}, + {714, {wxDC, setTextBackground, 1}}, + {715, {wxDC, setTextForeground, 1}}, + {716, {wxDC, setUserScale, 2}}, + {717, {wxDC, startDoc, 1}}, + {718, {wxDC, startPage, 0}}, + {719, {wxMirrorDC, new, 2}}, + {720, {wxMirrorDC, 'Destroy', undefined}}, + {721, {wxScreenDC, new, 0}}, + {722, {wxScreenDC, destruct, 0}}, + {723, {wxPostScriptDC, new_0, 0}}, + {724, {wxPostScriptDC, new_1, 1}}, + {725, {wxPostScriptDC, destruct, 0}}, + {726, {wxPostScriptDC, setResolution, 1}}, + {727, {wxPostScriptDC, getResolution, 0}}, + {728, {wxWindowDC, new_0, 0}}, + {729, {wxWindowDC, new_1, 1}}, + {730, {wxWindowDC, destruct, 0}}, + {731, {wxClientDC, new_0, 0}}, + {732, {wxClientDC, new_1, 1}}, + {733, {wxClientDC, 'Destroy', undefined}}, + {734, {wxPaintDC, new_0, 0}}, + {735, {wxPaintDC, new_1, 1}}, + {736, {wxPaintDC, 'Destroy', undefined}}, + {738, {wxMemoryDC, new_1_0, 1}}, + {739, {wxMemoryDC, new_1_1, 1}}, + {740, {wxMemoryDC, new_0, 0}}, + {742, {wxMemoryDC, destruct, 0}}, + {743, {wxMemoryDC, selectObject, 1}}, + {744, {wxMemoryDC, selectObjectAsSource, 1}}, + {745, {wxBufferedDC, new_0, 0}}, + {746, {wxBufferedDC, new_2, 2}}, + {747, {wxBufferedDC, new_3, 3}}, + {748, {wxBufferedDC, destruct, 0}}, + {749, {wxBufferedDC, init_2, 2}}, + {750, {wxBufferedDC, init_3, 3}}, + {751, {wxBufferedPaintDC, new_3, 3}}, + {752, {wxBufferedPaintDC, new_2, 2}}, + {753, {wxBufferedPaintDC, destruct, 0}}, + {754, {wxGraphicsObject, getRenderer, 0}}, + {755, {wxGraphicsObject, isNull, 0}}, + {756, {wxGraphicsContext, create_1_1, 1}}, + {757, {wxGraphicsContext, create_1_0, 1}}, + {758, {wxGraphicsContext, create_0, 0}}, + {759, {wxGraphicsContext, createPen, 1}}, + {760, {wxGraphicsContext, createBrush, 1}}, + {761, {wxGraphicsContext, createRadialGradientBrush, 7}}, + {762, {wxGraphicsContext, createLinearGradientBrush, 6}}, + {763, {wxGraphicsContext, createFont, 2}}, + {764, {wxGraphicsContext, createMatrix, 1}}, + {765, {wxGraphicsContext, createPath, 0}}, + {766, {wxGraphicsContext, clip_1, 1}}, + {767, {wxGraphicsContext, clip_4, 4}}, + {768, {wxGraphicsContext, resetClip, 0}}, + {769, {wxGraphicsContext, drawBitmap, 5}}, + {770, {wxGraphicsContext, drawEllipse, 4}}, + {771, {wxGraphicsContext, drawIcon, 5}}, + {772, {wxGraphicsContext, drawLines, 3}}, + {773, {wxGraphicsContext, drawPath, 2}}, + {774, {wxGraphicsContext, drawRectangle, 4}}, + {775, {wxGraphicsContext, drawRoundedRectangle, 5}}, + {776, {wxGraphicsContext, drawText_3, 3}}, + {777, {wxGraphicsContext, drawText_4_0, 4}}, + {778, {wxGraphicsContext, drawText_4_1, 4}}, + {779, {wxGraphicsContext, drawText_5, 5}}, + {780, {wxGraphicsContext, fillPath, 2}}, + {781, {wxGraphicsContext, strokePath, 1}}, + {782, {wxGraphicsContext, getNativeContext, 0}}, + {783, {wxGraphicsContext, getPartialTextExtents, 2}}, + {784, {wxGraphicsContext, getTextExtent, 5}}, + {785, {wxGraphicsContext, rotate, 1}}, + {786, {wxGraphicsContext, scale, 2}}, + {787, {wxGraphicsContext, translate, 2}}, + {788, {wxGraphicsContext, getTransform, 0}}, + {789, {wxGraphicsContext, setTransform, 1}}, + {790, {wxGraphicsContext, concatTransform, 1}}, + {791, {wxGraphicsContext, setBrush_1_1, 1}}, + {792, {wxGraphicsContext, setBrush_1_0, 1}}, + {793, {wxGraphicsContext, setFont_1, 1}}, + {794, {wxGraphicsContext, setFont_2, 2}}, + {795, {wxGraphicsContext, setPen_1_0, 1}}, + {796, {wxGraphicsContext, setPen_1_1, 1}}, + {797, {wxGraphicsContext, strokeLine, 4}}, + {798, {wxGraphicsContext, strokeLines_2, 2}}, + {799, {wxGraphicsContext, strokeLines_3, 3}}, + {800, {wxGraphicsMatrix, concat, 1}}, + {802, {wxGraphicsMatrix, get, 1}}, + {803, {wxGraphicsMatrix, getNativeMatrix, 0}}, + {804, {wxGraphicsMatrix, invert, 0}}, + {805, {wxGraphicsMatrix, isEqual, 1}}, + {807, {wxGraphicsMatrix, isIdentity, 0}}, + {808, {wxGraphicsMatrix, rotate, 1}}, + {809, {wxGraphicsMatrix, scale, 2}}, + {810, {wxGraphicsMatrix, translate, 2}}, + {811, {wxGraphicsMatrix, set, 1}}, + {812, {wxGraphicsMatrix, transformPoint, 2}}, + {813, {wxGraphicsMatrix, transformDistance, 2}}, + {814, {wxGraphicsPath, moveToPoint_2, 2}}, + {815, {wxGraphicsPath, moveToPoint_1, 1}}, + {816, {wxGraphicsPath, addArc_6, 6}}, + {817, {wxGraphicsPath, addArc_5, 5}}, + {818, {wxGraphicsPath, addArcToPoint, 5}}, + {819, {wxGraphicsPath, addCircle, 3}}, + {820, {wxGraphicsPath, addCurveToPoint_6, 6}}, + {821, {wxGraphicsPath, addCurveToPoint_3, 3}}, + {822, {wxGraphicsPath, addEllipse, 4}}, + {823, {wxGraphicsPath, addLineToPoint_2, 2}}, + {824, {wxGraphicsPath, addLineToPoint_1, 1}}, + {825, {wxGraphicsPath, addPath, 1}}, + {826, {wxGraphicsPath, addQuadCurveToPoint, 4}}, + {827, {wxGraphicsPath, addRectangle, 4}}, + {828, {wxGraphicsPath, addRoundedRectangle, 5}}, + {829, {wxGraphicsPath, closeSubpath, 0}}, + {830, {wxGraphicsPath, contains_3, 3}}, + {831, {wxGraphicsPath, contains_2, 2}}, + {833, {wxGraphicsPath, getBox, 0}}, + {835, {wxGraphicsPath, getCurrentPoint, 0}}, + {836, {wxGraphicsPath, transform, 1}}, + {837, {wxGraphicsRenderer, getDefaultRenderer, 0}}, + {838, {wxGraphicsRenderer, createContext_1_1, 1}}, + {839, {wxGraphicsRenderer, createContext_1_0, 1}}, + {840, {wxGraphicsRenderer, createPen, 1}}, + {841, {wxGraphicsRenderer, createBrush, 1}}, + {842, {wxGraphicsRenderer, createLinearGradientBrush, 6}}, + {843, {wxGraphicsRenderer, createRadialGradientBrush, 7}}, + {844, {wxGraphicsRenderer, createFont, 2}}, + {845, {wxGraphicsRenderer, createMatrix, 1}}, + {846, {wxGraphicsRenderer, createPath, 0}}, + {848, {wxMenuBar, new_1, 1}}, + {850, {wxMenuBar, new_0, 0}}, + {852, {wxMenuBar, destruct, 0}}, + {853, {wxMenuBar, append, 2}}, + {854, {wxMenuBar, check, 2}}, + {855, {wxMenuBar, enable_2, 2}}, + {856, {wxMenuBar, enable_1, 1}}, + {857, {wxMenuBar, enableTop, 2}}, + {858, {wxMenuBar, findMenu, 1}}, + {859, {wxMenuBar, findMenuItem, 2}}, + {860, {wxMenuBar, findItem, 2}}, + {861, {wxMenuBar, getHelpString, 1}}, + {862, {wxMenuBar, getLabel_1, 1}}, + {863, {wxMenuBar, getLabel_0, 0}}, + {864, {wxMenuBar, getLabelTop, 1}}, + {865, {wxMenuBar, getMenu, 1}}, + {866, {wxMenuBar, getMenuCount, 0}}, + {867, {wxMenuBar, insert, 3}}, + {868, {wxMenuBar, isChecked, 1}}, + {869, {wxMenuBar, isEnabled_1, 1}}, + {870, {wxMenuBar, isEnabled_0, 0}}, + {871, {wxMenuBar, remove, 1}}, + {872, {wxMenuBar, replace, 3}}, + {873, {wxMenuBar, setHelpString, 2}}, + {874, {wxMenuBar, setLabel_2, 2}}, + {875, {wxMenuBar, setLabel_1, 1}}, + {876, {wxMenuBar, setLabelTop, 2}}, + {877, {wxControl, getLabel, 0}}, + {878, {wxControl, setLabel, 1}}, + {879, {wxControlWithItems, append_1, 1}}, + {880, {wxControlWithItems, append_2, 2}}, + {881, {wxControlWithItems, appendStrings_1, 1}}, + {882, {wxControlWithItems, clear, 0}}, + {883, {wxControlWithItems, delete, 1}}, + {884, {wxControlWithItems, findString, 2}}, + {886, {wxControlWithItems, getClientData, 1}}, + {888, {wxControlWithItems, setClientData, 2}}, + {889, {wxControlWithItems, getCount, 0}}, + {890, {wxControlWithItems, getSelection, 0}}, + {891, {wxControlWithItems, getString, 1}}, + {892, {wxControlWithItems, getStringSelection, 0}}, + {893, {wxControlWithItems, insert_2, 2}}, + {894, {wxControlWithItems, insert_3, 3}}, + {895, {wxControlWithItems, isEmpty, 0}}, + {896, {wxControlWithItems, select, 1}}, + {897, {wxControlWithItems, setSelection, 1}}, + {898, {wxControlWithItems, setString, 2}}, + {899, {wxControlWithItems, setStringSelection, 1}}, + {902, {wxMenu, new_2, 2}}, + {903, {wxMenu, new_1, 1}}, + {905, {wxMenu, destruct, 0}}, + {906, {wxMenu, append_3, 3}}, + {907, {wxMenu, append_1, 1}}, + {908, {wxMenu, append_4_0, 4}}, + {909, {wxMenu, append_4_1, 4}}, + {910, {wxMenu, appendCheckItem, 3}}, + {911, {wxMenu, appendRadioItem, 3}}, + {912, {wxMenu, appendSeparator, 0}}, + {913, {wxMenu, break, 0}}, + {914, {wxMenu, check, 2}}, + {915, {wxMenu, delete_1_0, 1}}, + {916, {wxMenu, delete_1_1, 1}}, + {917, {wxMenu, destroy_1_0, 1}}, + {918, {wxMenu, destroy_1_1, 1}}, + {919, {wxMenu, enable, 2}}, + {920, {wxMenu, findItem_1, 1}}, + {921, {wxMenu, findItem_2, 2}}, + {922, {wxMenu, findItemByPosition, 1}}, + {923, {wxMenu, getHelpString, 1}}, + {924, {wxMenu, getLabel, 1}}, + {925, {wxMenu, getMenuItemCount, 0}}, + {926, {wxMenu, getMenuItems, 0}}, + {928, {wxMenu, getTitle, 0}}, + {929, {wxMenu, insert_2, 2}}, + {930, {wxMenu, insert_3, 3}}, + {931, {wxMenu, insert_5_1, 5}}, + {932, {wxMenu, insert_5_0, 5}}, + {933, {wxMenu, insertCheckItem, 4}}, + {934, {wxMenu, insertRadioItem, 4}}, + {935, {wxMenu, insertSeparator, 1}}, + {936, {wxMenu, isChecked, 1}}, + {937, {wxMenu, isEnabled, 1}}, + {938, {wxMenu, prepend_1, 1}}, + {939, {wxMenu, prepend_2, 2}}, + {940, {wxMenu, prepend_4_1, 4}}, + {941, {wxMenu, prepend_4_0, 4}}, + {942, {wxMenu, prependCheckItem, 3}}, + {943, {wxMenu, prependRadioItem, 3}}, + {944, {wxMenu, prependSeparator, 0}}, + {945, {wxMenu, remove_1_0, 1}}, + {946, {wxMenu, remove_1_1, 1}}, + {947, {wxMenu, setHelpString, 2}}, + {948, {wxMenu, setLabel, 2}}, + {949, {wxMenu, setTitle, 1}}, + {950, {wxMenuItem, new, 1}}, + {952, {wxMenuItem, destruct, 0}}, + {953, {wxMenuItem, check, 1}}, + {954, {wxMenuItem, enable, 1}}, + {955, {wxMenuItem, getBitmap, 0}}, + {956, {wxMenuItem, getHelp, 0}}, + {957, {wxMenuItem, getId, 0}}, + {958, {wxMenuItem, getKind, 0}}, + {959, {wxMenuItem, getLabel, 0}}, + {960, {wxMenuItem, getLabelFromText, 1}}, + {961, {wxMenuItem, getMenu, 0}}, + {962, {wxMenuItem, getText, 0}}, + {963, {wxMenuItem, getSubMenu, 0}}, + {964, {wxMenuItem, isCheckable, 0}}, + {965, {wxMenuItem, isChecked, 0}}, + {966, {wxMenuItem, isEnabled, 0}}, + {967, {wxMenuItem, isSeparator, 0}}, + {968, {wxMenuItem, isSubMenu, 0}}, + {969, {wxMenuItem, setBitmap, 1}}, + {970, {wxMenuItem, setHelp, 1}}, + {971, {wxMenuItem, setMenu, 1}}, + {972, {wxMenuItem, setSubMenu, 1}}, + {973, {wxMenuItem, setText, 1}}, + {974, {wxToolBar, addControl, 1}}, + {975, {wxToolBar, addSeparator, 0}}, + {976, {wxToolBar, addTool_5, 5}}, + {977, {wxToolBar, addTool_4_0, 4}}, + {978, {wxToolBar, addTool_1, 1}}, + {979, {wxToolBar, addTool_4_1, 4}}, + {980, {wxToolBar, addTool_3, 3}}, + {981, {wxToolBar, addTool_6, 6}}, + {982, {wxToolBar, addCheckTool, 4}}, + {983, {wxToolBar, addRadioTool, 4}}, + {984, {wxToolBar, deleteTool, 1}}, + {985, {wxToolBar, deleteToolByPos, 1}}, + {986, {wxToolBar, enableTool, 2}}, + {987, {wxToolBar, findById, 1}}, + {988, {wxToolBar, findControl, 1}}, + {989, {wxToolBar, findToolForPosition, 2}}, + {990, {wxToolBar, getToolSize, 0}}, + {991, {wxToolBar, getToolBitmapSize, 0}}, + {992, {wxToolBar, getMargins, 0}}, + {993, {wxToolBar, getToolEnabled, 1}}, + {994, {wxToolBar, getToolLongHelp, 1}}, + {995, {wxToolBar, getToolPacking, 0}}, + {996, {wxToolBar, getToolPos, 1}}, + {997, {wxToolBar, getToolSeparation, 0}}, + {998, {wxToolBar, getToolShortHelp, 1}}, + {999, {wxToolBar, getToolState, 1}}, + {1000, {wxToolBar, insertControl, 2}}, + {1001, {wxToolBar, insertSeparator, 1}}, + {1002, {wxToolBar, insertTool_5, 5}}, + {1003, {wxToolBar, insertTool_2, 2}}, + {1004, {wxToolBar, insertTool_4, 4}}, + {1005, {wxToolBar, realize, 0}}, + {1006, {wxToolBar, removeTool, 1}}, + {1007, {wxToolBar, setMargins, 2}}, + {1008, {wxToolBar, setToolBitmapSize, 1}}, + {1009, {wxToolBar, setToolLongHelp, 2}}, + {1010, {wxToolBar, setToolPacking, 1}}, + {1011, {wxToolBar, setToolShortHelp, 2}}, + {1012, {wxToolBar, setToolSeparation, 1}}, + {1013, {wxToolBar, toggleTool, 2}}, + {1015, {wxStatusBar, new_0, 0}}, + {1016, {wxStatusBar, new_2, 2}}, + {1018, {wxStatusBar, destruct, 0}}, + {1019, {wxStatusBar, create, 2}}, + {1020, {wxStatusBar, getFieldRect, 2}}, + {1021, {wxStatusBar, getFieldsCount, 0}}, + {1022, {wxStatusBar, getStatusText, 1}}, + {1023, {wxStatusBar, popStatusText, 1}}, + {1024, {wxStatusBar, pushStatusText, 2}}, + {1025, {wxStatusBar, setFieldsCount, 2}}, + {1026, {wxStatusBar, setMinHeight, 1}}, + {1027, {wxStatusBar, setStatusText, 2}}, + {1028, {wxStatusBar, setStatusWidths, 2}}, + {1029, {wxStatusBar, setStatusStyles, 2}}, + {1030, {wxBitmap, new_0, 0}}, + {1031, {wxBitmap, new_3, 3}}, + {1032, {wxBitmap, new_4, 4}}, + {1033, {wxBitmap, new_2_0, 2}}, + {1034, {wxBitmap, new_2_1, 2}}, + {1035, {wxBitmap, destruct, 0}}, + {1036, {wxBitmap, convertToImage, 0}}, + {1037, {wxBitmap, copyFromIcon, 1}}, + {1038, {wxBitmap, create, 3}}, + {1039, {wxBitmap, getDepth, 0}}, + {1040, {wxBitmap, getHeight, 0}}, + {1041, {wxBitmap, getPalette, 0}}, + {1042, {wxBitmap, getMask, 0}}, + {1043, {wxBitmap, getWidth, 0}}, + {1044, {wxBitmap, getSubBitmap, 1}}, + {1045, {wxBitmap, loadFile, 2}}, + {1046, {wxBitmap, ok, 0}}, + {1047, {wxBitmap, saveFile, 3}}, + {1048, {wxBitmap, setDepth, 1}}, + {1049, {wxBitmap, setHeight, 1}}, + {1050, {wxBitmap, setMask, 1}}, + {1051, {wxBitmap, setPalette, 1}}, + {1052, {wxBitmap, setWidth, 1}}, + {1053, {wxIcon, new_0, 0}}, + {1054, {wxIcon, new_2, 2}}, + {1055, {wxIcon, new_1, 1}}, + {1056, {wxIcon, copyFromBitmap, 1}}, + {1057, {wxIcon, 'Destroy', undefined}}, + {1058, {wxIconBundle, new_0, 0}}, + {1059, {wxIconBundle, new_2, 2}}, + {1060, {wxIconBundle, new_1_0, 1}}, + {1061, {wxIconBundle, new_1_1, 1}}, + {1062, {wxIconBundle, destruct, 0}}, + {1063, {wxIconBundle, addIcon_2, 2}}, + {1064, {wxIconBundle, addIcon_1, 1}}, + {1065, {wxIconBundle, getIcon_1_1, 1}}, + {1066, {wxIconBundle, getIcon_1_0, 1}}, + {1067, {wxCursor, new_0, 0}}, + {1068, {wxCursor, new_1_0, 1}}, + {1069, {wxCursor, new_1_1, 1}}, + {1070, {wxCursor, new_4, 4}}, + {1071, {wxCursor, destruct, 0}}, + {1072, {wxCursor, ok, 0}}, + {1073, {wxMask, new_0, 0}}, + {1074, {wxMask, new_2_1, 2}}, + {1075, {wxMask, new_2_0, 2}}, + {1076, {wxMask, new_1, 1}}, + {1077, {wxMask, destruct, 0}}, + {1078, {wxMask, create_2_1, 2}}, + {1079, {wxMask, create_2_0, 2}}, + {1080, {wxMask, create_1, 1}}, + {1081, {wxImage, new_0, 0}}, + {1082, {wxImage, new_3_0, 3}}, + {1083, {wxImage, new_4, 4}}, + {1084, {wxImage, new_5, 5}}, + {1085, {wxImage, new_2, 2}}, + {1086, {wxImage, new_3_1, 3}}, + {1087, {wxImage, blur, 1}}, + {1088, {wxImage, blurHorizontal, 1}}, + {1089, {wxImage, blurVertical, 1}}, + {1090, {wxImage, convertAlphaToMask, 1}}, + {1091, {wxImage, convertToGreyscale, 1}}, + {1092, {wxImage, convertToMono, 3}}, + {1093, {wxImage, copy, 0}}, + {1094, {wxImage, create_3, 3}}, + {1095, {wxImage, create_4, 4}}, + {1096, {wxImage, create_5, 5}}, + {1097, {wxImage, 'Destroy', 0}}, + {1098, {wxImage, findFirstUnusedColour, 4}}, + {1099, {wxImage, getImageExtWildcard, 0}}, + {1100, {wxImage, getAlpha_2, 2}}, + {1101, {wxImage, getAlpha_0, 0}}, + {1102, {wxImage, getBlue, 2}}, + {1103, {wxImage, getData, 0}}, + {1104, {wxImage, getGreen, 2}}, + {1105, {wxImage, getImageCount, 2}}, + {1106, {wxImage, getHeight, 0}}, + {1107, {wxImage, getMaskBlue, 0}}, + {1108, {wxImage, getMaskGreen, 0}}, + {1109, {wxImage, getMaskRed, 0}}, + {1110, {wxImage, getOrFindMaskColour, 3}}, + {1111, {wxImage, getPalette, 0}}, + {1112, {wxImage, getRed, 2}}, + {1113, {wxImage, getSubImage, 1}}, + {1114, {wxImage, getWidth, 0}}, + {1115, {wxImage, hasAlpha, 0}}, + {1116, {wxImage, hasMask, 0}}, + {1117, {wxImage, getOption, 1}}, + {1118, {wxImage, getOptionInt, 1}}, + {1119, {wxImage, hasOption, 1}}, + {1120, {wxImage, initAlpha, 0}}, + {1121, {wxImage, initStandardHandlers, 0}}, + {1122, {wxImage, isTransparent, 3}}, + {1123, {wxImage, loadFile_2, 2}}, + {1124, {wxImage, loadFile_3, 3}}, + {1125, {wxImage, ok, 0}}, + {1126, {wxImage, removeHandler, 1}}, + {1127, {wxImage, mirror, 1}}, + {1128, {wxImage, replace, 6}}, + {1129, {wxImage, rescale, 3}}, + {1130, {wxImage, resize, 3}}, + {1131, {wxImage, rotate, 3}}, + {1132, {wxImage, rotateHue, 1}}, + {1133, {wxImage, rotate90, 1}}, + {1134, {wxImage, saveFile_1, 1}}, + {1135, {wxImage, saveFile_2_0, 2}}, + {1136, {wxImage, saveFile_2_1, 2}}, + {1137, {wxImage, scale, 3}}, + {1138, {wxImage, size, 3}}, + {1139, {wxImage, setAlpha_3, 3}}, + {1140, {wxImage, setAlpha_2, 2}}, + {1141, {wxImage, setData_2, 2}}, + {1142, {wxImage, setData_4, 4}}, + {1143, {wxImage, setMask, 1}}, + {1144, {wxImage, setMaskColour, 3}}, + {1145, {wxImage, setMaskFromImage, 4}}, + {1146, {wxImage, setOption_2_1, 2}}, + {1147, {wxImage, setOption_2_0, 2}}, + {1148, {wxImage, setPalette, 1}}, + {1149, {wxImage, setRGB_5, 5}}, + {1150, {wxImage, setRGB_4, 4}}, + {1151, {wxImage, 'Destroy', undefined}}, + {1152, {wxBrush, new_0, 0}}, + {1153, {wxBrush, new_2, 2}}, + {1154, {wxBrush, new_1, 1}}, + {1156, {wxBrush, destruct, 0}}, + {1157, {wxBrush, getColour, 0}}, + {1158, {wxBrush, getStipple, 0}}, + {1159, {wxBrush, getStyle, 0}}, + {1160, {wxBrush, isHatch, 0}}, + {1161, {wxBrush, isOk, 0}}, + {1162, {wxBrush, setColour_1, 1}}, + {1163, {wxBrush, setColour_3, 3}}, + {1164, {wxBrush, setStipple, 1}}, + {1165, {wxBrush, setStyle, 1}}, + {1166, {wxPen, new_0, 0}}, + {1167, {wxPen, new_2, 2}}, + {1168, {wxPen, destruct, 0}}, + {1169, {wxPen, getCap, 0}}, + {1170, {wxPen, getColour, 0}}, + {1171, {wxPen, getJoin, 0}}, + {1172, {wxPen, getStyle, 0}}, + {1173, {wxPen, getWidth, 0}}, + {1174, {wxPen, isOk, 0}}, + {1175, {wxPen, setCap, 1}}, + {1176, {wxPen, setColour_1, 1}}, + {1177, {wxPen, setColour_3, 3}}, + {1178, {wxPen, setJoin, 1}}, + {1179, {wxPen, setStyle, 1}}, + {1180, {wxPen, setWidth, 1}}, + {1181, {wxRegion, new_0, 0}}, + {1182, {wxRegion, new_4, 4}}, + {1183, {wxRegion, new_2, 2}}, + {1184, {wxRegion, new_1_1, 1}}, + {1186, {wxRegion, new_1_0, 1}}, + {1188, {wxRegion, destruct, 0}}, + {1189, {wxRegion, clear, 0}}, + {1190, {wxRegion, contains_2, 2}}, + {1191, {wxRegion, contains_1_0, 1}}, + {1192, {wxRegion, contains_4, 4}}, + {1193, {wxRegion, contains_1_1, 1}}, + {1194, {wxRegion, convertToBitmap, 0}}, + {1195, {wxRegion, getBox, 0}}, + {1196, {wxRegion, intersect_4, 4}}, + {1197, {wxRegion, intersect_1_1, 1}}, + {1198, {wxRegion, intersect_1_0, 1}}, + {1199, {wxRegion, isEmpty, 0}}, + {1200, {wxRegion, subtract_4, 4}}, + {1201, {wxRegion, subtract_1_1, 1}}, + {1202, {wxRegion, subtract_1_0, 1}}, + {1203, {wxRegion, offset_2, 2}}, + {1204, {wxRegion, offset_1, 1}}, + {1205, {wxRegion, union_4, 4}}, + {1206, {wxRegion, union_1_2, 1}}, + {1207, {wxRegion, union_1_1, 1}}, + {1208, {wxRegion, union_1_0, 1}}, + {1209, {wxRegion, union_3, 3}}, + {1210, {wxRegion, xor_4, 4}}, + {1211, {wxRegion, xor_1_1, 1}}, + {1212, {wxRegion, xor_1_0, 1}}, + {1213, {wxAcceleratorTable, new_0, 0}}, + {1214, {wxAcceleratorTable, new_2, 2}}, + {1215, {wxAcceleratorTable, destruct, 0}}, + {1216, {wxAcceleratorTable, ok, 0}}, + {1217, {wxAcceleratorEntry, new_1_0, 1}}, + {1218, {wxAcceleratorEntry, new_1_1, 1}}, + {1219, {wxAcceleratorEntry, getCommand, 0}}, + {1220, {wxAcceleratorEntry, getFlags, 0}}, + {1221, {wxAcceleratorEntry, getKeyCode, 0}}, + {1222, {wxAcceleratorEntry, set, 4}}, + {1223, {wxAcceleratorEntry, 'Destroy', undefined}}, + {1228, {wxCaret, new_3, 3}}, + {1229, {wxCaret, new_2, 2}}, + {1231, {wxCaret, destruct, 0}}, + {1232, {wxCaret, create_3, 3}}, + {1233, {wxCaret, create_2, 2}}, + {1234, {wxCaret, getBlinkTime, 0}}, + {1236, {wxCaret, getPosition, 0}}, + {1238, {wxCaret, getSize, 0}}, + {1239, {wxCaret, getWindow, 0}}, + {1240, {wxCaret, hide, 0}}, + {1241, {wxCaret, isOk, 0}}, + {1242, {wxCaret, isVisible, 0}}, + {1243, {wxCaret, move_2, 2}}, + {1244, {wxCaret, move_1, 1}}, + {1245, {wxCaret, setBlinkTime, 1}}, + {1246, {wxCaret, setSize_2, 2}}, + {1247, {wxCaret, setSize_1, 1}}, + {1248, {wxCaret, show, 1}}, + {1249, {wxSizer, add_2_1, 2}}, + {1250, {wxSizer, add_2_0, 2}}, + {1251, {wxSizer, add_3, 3}}, + {1252, {wxSizer, add_2_3, 2}}, + {1253, {wxSizer, add_2_2, 2}}, + {1254, {wxSizer, addSpacer, 1}}, + {1255, {wxSizer, addStretchSpacer, 1}}, + {1256, {wxSizer, calcMin, 0}}, + {1257, {wxSizer, clear, 1}}, + {1258, {wxSizer, detach_1_2, 1}}, + {1259, {wxSizer, detach_1_1, 1}}, + {1260, {wxSizer, detach_1_0, 1}}, + {1261, {wxSizer, fit, 1}}, + {1262, {wxSizer, fitInside, 1}}, + {1263, {wxSizer, getChildren, 0}}, + {1264, {wxSizer, getItem_2_1, 2}}, + {1265, {wxSizer, getItem_2_0, 2}}, + {1266, {wxSizer, getItem_1, 1}}, + {1267, {wxSizer, getSize, 0}}, + {1268, {wxSizer, getPosition, 0}}, + {1269, {wxSizer, getMinSize, 0}}, + {1270, {wxSizer, hide_2_0, 2}}, + {1271, {wxSizer, hide_2_1, 2}}, + {1272, {wxSizer, hide_1, 1}}, + {1273, {wxSizer, insert_3_1, 3}}, + {1274, {wxSizer, insert_3_0, 3}}, + {1275, {wxSizer, insert_4, 4}}, + {1276, {wxSizer, insert_3_3, 3}}, + {1277, {wxSizer, insert_3_2, 3}}, + {1278, {wxSizer, insert_2, 2}}, + {1279, {wxSizer, insertSpacer, 2}}, + {1280, {wxSizer, insertStretchSpacer, 2}}, + {1281, {wxSizer, isShown_1_2, 1}}, + {1282, {wxSizer, isShown_1_1, 1}}, + {1283, {wxSizer, isShown_1_0, 1}}, + {1284, {wxSizer, layout, 0}}, + {1285, {wxSizer, prepend_2_1, 2}}, + {1286, {wxSizer, prepend_2_0, 2}}, + {1287, {wxSizer, prepend_3, 3}}, + {1288, {wxSizer, prepend_2_3, 2}}, + {1289, {wxSizer, prepend_2_2, 2}}, + {1290, {wxSizer, prepend_1, 1}}, + {1291, {wxSizer, prependSpacer, 1}}, + {1292, {wxSizer, prependStretchSpacer, 1}}, + {1293, {wxSizer, recalcSizes, 0}}, + {1294, {wxSizer, remove_1_1, 1}}, + {1295, {wxSizer, remove_1_0, 1}}, + {1296, {wxSizer, replace_3_1, 3}}, + {1297, {wxSizer, replace_3_0, 3}}, + {1298, {wxSizer, replace_2, 2}}, + {1299, {wxSizer, setDimension, 4}}, + {1300, {wxSizer, setMinSize_2, 2}}, + {1301, {wxSizer, setMinSize_1, 1}}, + {1302, {wxSizer, setItemMinSize_3_2, 3}}, + {1303, {wxSizer, setItemMinSize_2_2, 2}}, + {1304, {wxSizer, setItemMinSize_3_1, 3}}, + {1305, {wxSizer, setItemMinSize_2_1, 2}}, + {1306, {wxSizer, setItemMinSize_3_0, 3}}, + {1307, {wxSizer, setItemMinSize_2_0, 2}}, + {1308, {wxSizer, setSizeHints, 1}}, + {1309, {wxSizer, setVirtualSizeHints, 1}}, + {1310, {wxSizer, show_2_2, 2}}, + {1311, {wxSizer, show_2_1, 2}}, + {1312, {wxSizer, show_2_0, 2}}, + {1313, {wxSizer, show_1, 1}}, + {1314, {wxSizerFlags, new, 1}}, + {1315, {wxSizerFlags, align, 1}}, + {1316, {wxSizerFlags, border_2, 2}}, + {1317, {wxSizerFlags, border_1, 1}}, + {1318, {wxSizerFlags, center, 0}}, + {1319, {wxSizerFlags, centre, 0}}, + {1320, {wxSizerFlags, expand, 0}}, + {1321, {wxSizerFlags, left, 0}}, + {1322, {wxSizerFlags, proportion, 1}}, + {1323, {wxSizerFlags, right, 0}}, + {1324, {wxSizerFlags, 'Destroy', undefined}}, + {1325, {wxSizerItem, new_5_1, 5}}, + {1326, {wxSizerItem, new_2_1, 2}}, + {1327, {wxSizerItem, new_5_0, 5}}, + {1328, {wxSizerItem, new_2_0, 2}}, + {1329, {wxSizerItem, new_6, 6}}, + {1330, {wxSizerItem, new_3, 3}}, + {1331, {wxSizerItem, new_0, 0}}, + {1332, {wxSizerItem, destruct, 0}}, + {1333, {wxSizerItem, calcMin, 0}}, + {1334, {wxSizerItem, deleteWindows, 0}}, + {1335, {wxSizerItem, detachSizer, 0}}, + {1336, {wxSizerItem, getBorder, 0}}, + {1337, {wxSizerItem, getFlag, 0}}, + {1338, {wxSizerItem, getMinSize, 0}}, + {1339, {wxSizerItem, getPosition, 0}}, + {1340, {wxSizerItem, getProportion, 0}}, + {1341, {wxSizerItem, getRatio, 0}}, + {1342, {wxSizerItem, getRect, 0}}, + {1343, {wxSizerItem, getSize, 0}}, + {1344, {wxSizerItem, getSizer, 0}}, + {1345, {wxSizerItem, getSpacer, 0}}, + {1346, {wxSizerItem, getUserData, 0}}, + {1347, {wxSizerItem, getWindow, 0}}, + {1348, {wxSizerItem, isSizer, 0}}, + {1349, {wxSizerItem, isShown, 0}}, + {1350, {wxSizerItem, isSpacer, 0}}, + {1351, {wxSizerItem, isWindow, 0}}, + {1352, {wxSizerItem, setBorder, 1}}, + {1353, {wxSizerItem, setDimension, 2}}, + {1354, {wxSizerItem, setFlag, 1}}, + {1355, {wxSizerItem, setInitSize, 2}}, + {1356, {wxSizerItem, setMinSize_1, 1}}, + {1357, {wxSizerItem, setMinSize_2, 2}}, + {1358, {wxSizerItem, setProportion, 1}}, + {1359, {wxSizerItem, setRatio_2, 2}}, + {1360, {wxSizerItem, setRatio_1_1, 1}}, + {1361, {wxSizerItem, setRatio_1_0, 1}}, + {1362, {wxSizerItem, setSizer, 1}}, + {1363, {wxSizerItem, setSpacer_1, 1}}, + {1364, {wxSizerItem, setSpacer_2, 2}}, + {1365, {wxSizerItem, setWindow, 1}}, + {1366, {wxSizerItem, show, 1}}, + {1367, {wxBoxSizer, new, 1}}, + {1368, {wxBoxSizer, getOrientation, 0}}, + {1369, {wxBoxSizer, 'Destroy', undefined}}, + {1370, {wxStaticBoxSizer, new_2, 2}}, + {1371, {wxStaticBoxSizer, new_3, 3}}, + {1372, {wxStaticBoxSizer, getStaticBox, 0}}, + {1373, {wxStaticBoxSizer, 'Destroy', undefined}}, + {1374, {wxGridSizer, new_4, 4}}, + {1375, {wxGridSizer, new_2, 2}}, + {1376, {wxGridSizer, getCols, 0}}, + {1377, {wxGridSizer, getHGap, 0}}, + {1378, {wxGridSizer, getRows, 0}}, + {1379, {wxGridSizer, getVGap, 0}}, + {1380, {wxGridSizer, setCols, 1}}, + {1381, {wxGridSizer, setHGap, 1}}, + {1382, {wxGridSizer, setRows, 1}}, + {1383, {wxGridSizer, setVGap, 1}}, + {1384, {wxGridSizer, 'Destroy', undefined}}, + {1385, {wxFlexGridSizer, new_4, 4}}, + {1386, {wxFlexGridSizer, new_2, 2}}, + {1387, {wxFlexGridSizer, addGrowableCol, 2}}, + {1388, {wxFlexGridSizer, addGrowableRow, 2}}, + {1389, {wxFlexGridSizer, getFlexibleDirection, 0}}, + {1390, {wxFlexGridSizer, getNonFlexibleGrowMode, 0}}, + {1391, {wxFlexGridSizer, removeGrowableCol, 1}}, + {1392, {wxFlexGridSizer, removeGrowableRow, 1}}, + {1393, {wxFlexGridSizer, setFlexibleDirection, 1}}, + {1394, {wxFlexGridSizer, setNonFlexibleGrowMode, 1}}, + {1395, {wxFlexGridSizer, 'Destroy', undefined}}, + {1396, {wxGridBagSizer, new, 1}}, + {1397, {wxGridBagSizer, add_3_2, 3}}, + {1398, {wxGridBagSizer, add_3_1, 3}}, + {1399, {wxGridBagSizer, add_4, 4}}, + {1400, {wxGridBagSizer, add_1_0, 1}}, + {1401, {wxGridBagSizer, add_2_1, 2}}, + {1402, {wxGridBagSizer, add_2_0, 2}}, + {1403, {wxGridBagSizer, add_3_0, 3}}, + {1404, {wxGridBagSizer, add_1_1, 1}}, + {1405, {wxGridBagSizer, calcMin, 0}}, + {1406, {wxGridBagSizer, checkForIntersection_2, 2}}, + {1407, {wxGridBagSizer, checkForIntersection_3, 3}}, + {1408, {wxGridBagSizer, findItem_1_1, 1}}, + {1409, {wxGridBagSizer, findItem_1_0, 1}}, + {1410, {wxGridBagSizer, findItemAtPoint, 1}}, + {1411, {wxGridBagSizer, findItemAtPosition, 1}}, + {1412, {wxGridBagSizer, findItemWithData, 1}}, + {1413, {wxGridBagSizer, getCellSize, 2}}, + {1414, {wxGridBagSizer, getEmptyCellSize, 0}}, + {1415, {wxGridBagSizer, getItemPosition_1_2, 1}}, + {1416, {wxGridBagSizer, getItemPosition_1_1, 1}}, + {1417, {wxGridBagSizer, getItemPosition_1_0, 1}}, + {1418, {wxGridBagSizer, getItemSpan_1_2, 1}}, + {1419, {wxGridBagSizer, getItemSpan_1_1, 1}}, + {1420, {wxGridBagSizer, getItemSpan_1_0, 1}}, + {1421, {wxGridBagSizer, setEmptyCellSize, 1}}, + {1422, {wxGridBagSizer, setItemPosition_2_2, 2}}, + {1423, {wxGridBagSizer, setItemPosition_2_1, 2}}, + {1424, {wxGridBagSizer, setItemPosition_2_0, 2}}, + {1425, {wxGridBagSizer, setItemSpan_2_2, 2}}, + {1426, {wxGridBagSizer, setItemSpan_2_1, 2}}, + {1427, {wxGridBagSizer, setItemSpan_2_0, 2}}, + {1428, {wxGridBagSizer, 'Destroy', undefined}}, + {1429, {wxStdDialogButtonSizer, new, 0}}, + {1430, {wxStdDialogButtonSizer, addButton, 1}}, + {1431, {wxStdDialogButtonSizer, realize, 0}}, + {1432, {wxStdDialogButtonSizer, setAffirmativeButton, 1}}, + {1433, {wxStdDialogButtonSizer, setCancelButton, 1}}, + {1434, {wxStdDialogButtonSizer, setNegativeButton, 1}}, + {1435, {wxStdDialogButtonSizer, 'Destroy', undefined}}, + {1436, {wxFont, new_0, 0}}, + {1437, {wxFont, new_1, 1}}, + {1438, {wxFont, new_5, 5}}, + {1440, {wxFont, destruct, 0}}, + {1441, {wxFont, isFixedWidth, 0}}, + {1442, {wxFont, getDefaultEncoding, 0}}, + {1443, {wxFont, getFaceName, 0}}, + {1444, {wxFont, getFamily, 0}}, + {1445, {wxFont, getNativeFontInfoDesc, 0}}, + {1446, {wxFont, getNativeFontInfoUserDesc, 0}}, + {1447, {wxFont, getPointSize, 0}}, + {1448, {wxFont, getStyle, 0}}, + {1449, {wxFont, getUnderlined, 0}}, + {1450, {wxFont, getWeight, 0}}, + {1451, {wxFont, ok, 0}}, + {1452, {wxFont, setDefaultEncoding, 1}}, + {1453, {wxFont, setFaceName, 1}}, + {1454, {wxFont, setFamily, 1}}, + {1455, {wxFont, setPointSize, 1}}, + {1456, {wxFont, setStyle, 1}}, + {1457, {wxFont, setUnderlined, 1}}, + {1458, {wxFont, setWeight, 1}}, + {1459, {wxToolTip, enable, 1}}, + {1460, {wxToolTip, setDelay, 1}}, + {1461, {wxToolTip, new, 1}}, + {1462, {wxToolTip, setTip, 1}}, + {1463, {wxToolTip, getTip, 0}}, + {1464, {wxToolTip, getWindow, 0}}, + {1465, {wxToolTip, 'Destroy', undefined}}, + {1467, {wxButton, new_3, 3}}, + {1468, {wxButton, new_0, 0}}, + {1469, {wxButton, destruct, 0}}, + {1470, {wxButton, create, 3}}, + {1471, {wxButton, getDefaultSize, 0}}, + {1472, {wxButton, setDefault, 0}}, + {1473, {wxButton, setLabel, 1}}, + {1475, {wxBitmapButton, new_4, 4}}, + {1476, {wxBitmapButton, new_0, 0}}, + {1477, {wxBitmapButton, create, 4}}, + {1478, {wxBitmapButton, getBitmapDisabled, 0}}, + {1480, {wxBitmapButton, getBitmapFocus, 0}}, + {1482, {wxBitmapButton, getBitmapLabel, 0}}, + {1484, {wxBitmapButton, getBitmapSelected, 0}}, + {1486, {wxBitmapButton, setBitmapDisabled, 1}}, + {1487, {wxBitmapButton, setBitmapFocus, 1}}, + {1488, {wxBitmapButton, setBitmapLabel, 1}}, + {1489, {wxBitmapButton, setBitmapSelected, 1}}, + {1490, {wxBitmapButton, 'Destroy', undefined}}, + {1491, {wxToggleButton, new_0, 0}}, + {1492, {wxToggleButton, new_4, 4}}, + {1493, {wxToggleButton, create, 4}}, + {1494, {wxToggleButton, getValue, 0}}, + {1495, {wxToggleButton, setValue, 1}}, + {1496, {wxToggleButton, 'Destroy', undefined}}, + {1497, {wxCalendarCtrl, new_0, 0}}, + {1498, {wxCalendarCtrl, new_3, 3}}, + {1499, {wxCalendarCtrl, create, 3}}, + {1500, {wxCalendarCtrl, destruct, 0}}, + {1501, {wxCalendarCtrl, setDate, 1}}, + {1502, {wxCalendarCtrl, getDate, 0}}, + {1503, {wxCalendarCtrl, enableYearChange, 1}}, + {1504, {wxCalendarCtrl, enableMonthChange, 1}}, + {1505, {wxCalendarCtrl, enableHolidayDisplay, 1}}, + {1506, {wxCalendarCtrl, setHeaderColours, 2}}, + {1507, {wxCalendarCtrl, getHeaderColourFg, 0}}, + {1508, {wxCalendarCtrl, getHeaderColourBg, 0}}, + {1509, {wxCalendarCtrl, setHighlightColours, 2}}, + {1510, {wxCalendarCtrl, getHighlightColourFg, 0}}, + {1511, {wxCalendarCtrl, getHighlightColourBg, 0}}, + {1512, {wxCalendarCtrl, setHolidayColours, 2}}, + {1513, {wxCalendarCtrl, getHolidayColourFg, 0}}, + {1514, {wxCalendarCtrl, getHolidayColourBg, 0}}, + {1515, {wxCalendarCtrl, getAttr, 1}}, + {1516, {wxCalendarCtrl, setAttr, 2}}, + {1517, {wxCalendarCtrl, setHoliday, 1}}, + {1518, {wxCalendarCtrl, resetAttr, 1}}, + {1519, {wxCalendarCtrl, hitTest, 2}}, + {1520, {wxCalendarDateAttr, new_0, 0}}, + {1521, {wxCalendarDateAttr, new_2_1, 2}}, + {1522, {wxCalendarDateAttr, new_2_0, 2}}, + {1523, {wxCalendarDateAttr, setTextColour, 1}}, + {1524, {wxCalendarDateAttr, setBackgroundColour, 1}}, + {1525, {wxCalendarDateAttr, setBorderColour, 1}}, + {1526, {wxCalendarDateAttr, setFont, 1}}, + {1527, {wxCalendarDateAttr, setBorder, 1}}, + {1528, {wxCalendarDateAttr, setHoliday, 1}}, + {1529, {wxCalendarDateAttr, hasTextColour, 0}}, + {1530, {wxCalendarDateAttr, hasBackgroundColour, 0}}, + {1531, {wxCalendarDateAttr, hasBorderColour, 0}}, + {1532, {wxCalendarDateAttr, hasFont, 0}}, + {1533, {wxCalendarDateAttr, hasBorder, 0}}, + {1534, {wxCalendarDateAttr, isHoliday, 0}}, + {1535, {wxCalendarDateAttr, getTextColour, 0}}, + {1536, {wxCalendarDateAttr, getBackgroundColour, 0}}, + {1537, {wxCalendarDateAttr, getBorderColour, 0}}, + {1538, {wxCalendarDateAttr, getFont, 0}}, + {1539, {wxCalendarDateAttr, getBorder, 0}}, + {1540, {wxCalendarDateAttr, 'Destroy', undefined}}, + {1542, {wxCheckBox, new_4, 4}}, + {1543, {wxCheckBox, new_0, 0}}, + {1544, {wxCheckBox, create, 4}}, + {1545, {wxCheckBox, getValue, 0}}, + {1546, {wxCheckBox, get3StateValue, 0}}, + {1547, {wxCheckBox, is3rdStateAllowedForUser, 0}}, + {1548, {wxCheckBox, is3State, 0}}, + {1549, {wxCheckBox, isChecked, 0}}, + {1550, {wxCheckBox, setValue, 1}}, + {1551, {wxCheckBox, set3StateValue, 1}}, + {1552, {wxCheckBox, 'Destroy', undefined}}, + {1553, {wxCheckListBox, new_0, 0}}, + {1555, {wxCheckListBox, new_3, 3}}, + {1556, {wxCheckListBox, check, 2}}, + {1557, {wxCheckListBox, isChecked, 1}}, + {1558, {wxCheckListBox, 'Destroy', undefined}}, + {1561, {wxChoice, new_3, 3}}, + {1562, {wxChoice, new_0, 0}}, + {1564, {wxChoice, destruct, 0}}, + {1566, {wxChoice, create, 6}}, + {1567, {wxChoice, delete, 1}}, + {1568, {wxChoice, getColumns, 0}}, + {1569, {wxChoice, setColumns, 1}}, + {1570, {wxComboBox, new_0, 0}}, + {1572, {wxComboBox, new_3, 3}}, + {1573, {wxComboBox, destruct, 0}}, + {1575, {wxComboBox, create, 7}}, + {1576, {wxComboBox, canCopy, 0}}, + {1577, {wxComboBox, canCut, 0}}, + {1578, {wxComboBox, canPaste, 0}}, + {1579, {wxComboBox, canRedo, 0}}, + {1580, {wxComboBox, canUndo, 0}}, + {1581, {wxComboBox, copy, 0}}, + {1582, {wxComboBox, cut, 0}}, + {1583, {wxComboBox, getInsertionPoint, 0}}, + {1584, {wxComboBox, getLastPosition, 0}}, + {1585, {wxComboBox, getValue, 0}}, + {1586, {wxComboBox, paste, 0}}, + {1587, {wxComboBox, redo, 0}}, + {1588, {wxComboBox, replace, 3}}, + {1589, {wxComboBox, remove, 2}}, + {1590, {wxComboBox, setInsertionPoint, 1}}, + {1591, {wxComboBox, setInsertionPointEnd, 0}}, + {1592, {wxComboBox, setSelection_1, 1}}, + {1593, {wxComboBox, setSelection_2, 2}}, + {1594, {wxComboBox, setValue, 1}}, + {1595, {wxComboBox, undo, 0}}, + {1596, {wxGauge, new_0, 0}}, + {1597, {wxGauge, new_4, 4}}, + {1598, {wxGauge, create, 4}}, + {1599, {wxGauge, getBezelFace, 0}}, + {1600, {wxGauge, getRange, 0}}, + {1601, {wxGauge, getShadowWidth, 0}}, + {1602, {wxGauge, getValue, 0}}, + {1603, {wxGauge, isVertical, 0}}, + {1604, {wxGauge, setBezelFace, 1}}, + {1605, {wxGauge, setRange, 1}}, + {1606, {wxGauge, setShadowWidth, 1}}, + {1607, {wxGauge, setValue, 1}}, + {1608, {wxGauge, pulse, 0}}, + {1609, {wxGauge, 'Destroy', undefined}}, + {1610, {wxGenericDirCtrl, new_0, 0}}, + {1611, {wxGenericDirCtrl, new_2, 2}}, + {1612, {wxGenericDirCtrl, destruct, 0}}, + {1613, {wxGenericDirCtrl, create, 2}}, + {1614, {wxGenericDirCtrl, init, 0}}, + {1615, {wxGenericDirCtrl, collapseTree, 0}}, + {1616, {wxGenericDirCtrl, expandPath, 1}}, + {1617, {wxGenericDirCtrl, getDefaultPath, 0}}, + {1618, {wxGenericDirCtrl, getPath, 0}}, + {1619, {wxGenericDirCtrl, getFilePath, 0}}, + {1620, {wxGenericDirCtrl, getFilter, 0}}, + {1621, {wxGenericDirCtrl, getFilterIndex, 0}}, + {1622, {wxGenericDirCtrl, getRootId, 0}}, + {1623, {wxGenericDirCtrl, getTreeCtrl, 0}}, + {1624, {wxGenericDirCtrl, reCreateTree, 0}}, + {1625, {wxGenericDirCtrl, setDefaultPath, 1}}, + {1626, {wxGenericDirCtrl, setFilter, 1}}, + {1627, {wxGenericDirCtrl, setFilterIndex, 1}}, + {1628, {wxGenericDirCtrl, setPath, 1}}, + {1630, {wxStaticBox, new_4, 4}}, + {1631, {wxStaticBox, new_0, 0}}, + {1632, {wxStaticBox, create, 4}}, + {1633, {wxStaticBox, 'Destroy', undefined}}, + {1635, {wxStaticLine, new_2, 2}}, + {1636, {wxStaticLine, new_0, 0}}, + {1637, {wxStaticLine, create, 2}}, + {1638, {wxStaticLine, isVertical, 0}}, + {1639, {wxStaticLine, getDefaultSize, 0}}, + {1640, {wxStaticLine, 'Destroy', undefined}}, + {1643, {wxListBox, new_3, 3}}, + {1644, {wxListBox, new_0, 0}}, + {1646, {wxListBox, destruct, 0}}, + {1648, {wxListBox, create, 6}}, + {1649, {wxListBox, deselect, 1}}, + {1650, {wxListBox, getSelections, 1}}, + {1651, {wxListBox, insertItems, 2}}, + {1652, {wxListBox, isSelected, 1}}, + {1654, {wxListBox, set, 2}}, + {1655, {wxListBox, hitTest, 1}}, + {1656, {wxListBox, setFirstItem_1_0, 1}}, + {1657, {wxListBox, setFirstItem_1_1, 1}}, + {1658, {wxListCtrl, new_0, 0}}, + {1659, {wxListCtrl, new_2, 2}}, + {1660, {wxListCtrl, arrange, 1}}, + {1661, {wxListCtrl, assignImageList, 2}}, + {1662, {wxListCtrl, clearAll, 0}}, + {1663, {wxListCtrl, create, 2}}, + {1664, {wxListCtrl, deleteAllItems, 0}}, + {1665, {wxListCtrl, deleteColumn, 1}}, + {1666, {wxListCtrl, deleteItem, 1}}, + {1667, {wxListCtrl, editLabel, 1}}, + {1668, {wxListCtrl, ensureVisible, 1}}, + {1669, {wxListCtrl, findItem_3_0, 3}}, + {1670, {wxListCtrl, findItem_3_1, 3}}, + {1671, {wxListCtrl, getColumn, 2}}, + {1672, {wxListCtrl, getColumnCount, 0}}, + {1673, {wxListCtrl, getColumnWidth, 1}}, + {1674, {wxListCtrl, getCountPerPage, 0}}, + {1675, {wxListCtrl, getImageList, 1}}, + {1676, {wxListCtrl, getItem, 1}}, + {1677, {wxListCtrl, getItemBackgroundColour, 1}}, + {1678, {wxListCtrl, getItemCount, 0}}, + {1679, {wxListCtrl, getItemData, 1}}, + {1680, {wxListCtrl, getItemFont, 1}}, + {1681, {wxListCtrl, getItemPosition, 2}}, + {1682, {wxListCtrl, getItemRect, 3}}, + {1683, {wxListCtrl, getItemSpacing, 0}}, + {1684, {wxListCtrl, getItemState, 2}}, + {1685, {wxListCtrl, getItemText, 1}}, + {1686, {wxListCtrl, getItemTextColour, 1}}, + {1687, {wxListCtrl, getNextItem, 2}}, + {1688, {wxListCtrl, getSelectedItemCount, 0}}, + {1689, {wxListCtrl, getTextColour, 0}}, + {1690, {wxListCtrl, getTopItem, 0}}, + {1691, {wxListCtrl, getViewRect, 0}}, + {1692, {wxListCtrl, hitTest, 2}}, + {1693, {wxListCtrl, insertColumn_2, 2}}, + {1694, {wxListCtrl, insertColumn_3, 3}}, + {1695, {wxListCtrl, insertItem_1, 1}}, + {1696, {wxListCtrl, insertItem_2_1, 2}}, + {1697, {wxListCtrl, insertItem_2_0, 2}}, + {1698, {wxListCtrl, insertItem_3, 3}}, + {1699, {wxListCtrl, refreshItem, 1}}, + {1700, {wxListCtrl, refreshItems, 2}}, + {1701, {wxListCtrl, scrollList, 2}}, + {1702, {wxListCtrl, setBackgroundColour, 1}}, + {1703, {wxListCtrl, setColumn, 2}}, + {1704, {wxListCtrl, setColumnWidth, 2}}, + {1705, {wxListCtrl, setImageList, 2}}, + {1706, {wxListCtrl, setItem_1, 1}}, + {1707, {wxListCtrl, setItem_4, 4}}, + {1708, {wxListCtrl, setItemBackgroundColour, 2}}, + {1709, {wxListCtrl, setItemCount, 1}}, + {1710, {wxListCtrl, setItemData, 2}}, + {1711, {wxListCtrl, setItemFont, 2}}, + {1712, {wxListCtrl, setItemImage, 3}}, + {1713, {wxListCtrl, setItemColumnImage, 3}}, + {1714, {wxListCtrl, setItemPosition, 2}}, + {1715, {wxListCtrl, setItemState, 3}}, + {1716, {wxListCtrl, setItemText, 2}}, + {1717, {wxListCtrl, setItemTextColour, 2}}, + {1718, {wxListCtrl, setSingleStyle, 2}}, + {1719, {wxListCtrl, setTextColour, 1}}, + {1720, {wxListCtrl, setWindowStyleFlag, 1}}, + {1721, {wxListCtrl, sortItems, 2}}, + {1722, {wxListCtrl, 'Destroy', undefined}}, + {1723, {wxListView, clearColumnImage, 1}}, + {1724, {wxListView, focus, 1}}, + {1725, {wxListView, getFirstSelected, 0}}, + {1726, {wxListView, getFocusedItem, 0}}, + {1727, {wxListView, getNextSelected, 1}}, + {1728, {wxListView, isSelected, 1}}, + {1729, {wxListView, select, 2}}, + {1730, {wxListView, setColumnImage, 2}}, + {1731, {wxListItem, new_0, 0}}, + {1732, {wxListItem, new_1, 1}}, + {1733, {wxListItem, destruct, 0}}, + {1734, {wxListItem, clear, 0}}, + {1735, {wxListItem, getAlign, 0}}, + {1736, {wxListItem, getBackgroundColour, 0}}, + {1737, {wxListItem, getColumn, 0}}, + {1738, {wxListItem, getFont, 0}}, + {1739, {wxListItem, getId, 0}}, + {1740, {wxListItem, getImage, 0}}, + {1741, {wxListItem, getMask, 0}}, + {1742, {wxListItem, getState, 0}}, + {1743, {wxListItem, getText, 0}}, + {1744, {wxListItem, getTextColour, 0}}, + {1745, {wxListItem, getWidth, 0}}, + {1746, {wxListItem, setAlign, 1}}, + {1747, {wxListItem, setBackgroundColour, 1}}, + {1748, {wxListItem, setColumn, 1}}, + {1749, {wxListItem, setFont, 1}}, + {1750, {wxListItem, setId, 1}}, + {1751, {wxListItem, setImage, 1}}, + {1752, {wxListItem, setMask, 1}}, + {1753, {wxListItem, setState, 1}}, + {1754, {wxListItem, setStateMask, 1}}, + {1755, {wxListItem, setText, 1}}, + {1756, {wxListItem, setTextColour, 1}}, + {1757, {wxListItem, setWidth, 1}}, + {1758, {wxImageList, new_0, 0}}, + {1759, {wxImageList, new_3, 3}}, + {1760, {wxImageList, add_1, 1}}, + {1761, {wxImageList, add_2_0, 2}}, + {1762, {wxImageList, add_2_1, 2}}, + {1763, {wxImageList, create, 3}}, + {1765, {wxImageList, draw, 5}}, + {1766, {wxImageList, getBitmap, 1}}, + {1767, {wxImageList, getIcon, 1}}, + {1768, {wxImageList, getImageCount, 0}}, + {1769, {wxImageList, getSize, 3}}, + {1770, {wxImageList, remove, 1}}, + {1771, {wxImageList, removeAll, 0}}, + {1772, {wxImageList, replace_2, 2}}, + {1773, {wxImageList, replace_3, 3}}, + {1774, {wxImageList, 'Destroy', undefined}}, + {1775, {wxTextAttr, new_0, 0}}, + {1776, {wxTextAttr, new_2, 2}}, + {1777, {wxTextAttr, getAlignment, 0}}, + {1778, {wxTextAttr, getBackgroundColour, 0}}, + {1779, {wxTextAttr, getFont, 0}}, + {1780, {wxTextAttr, getLeftIndent, 0}}, + {1781, {wxTextAttr, getLeftSubIndent, 0}}, + {1782, {wxTextAttr, getRightIndent, 0}}, + {1783, {wxTextAttr, getTabs, 0}}, + {1784, {wxTextAttr, getTextColour, 0}}, + {1785, {wxTextAttr, hasBackgroundColour, 0}}, + {1786, {wxTextAttr, hasFont, 0}}, + {1787, {wxTextAttr, hasTextColour, 0}}, + {1788, {wxTextAttr, getFlags, 0}}, + {1789, {wxTextAttr, isDefault, 0}}, + {1790, {wxTextAttr, setAlignment, 1}}, + {1791, {wxTextAttr, setBackgroundColour, 1}}, + {1792, {wxTextAttr, setFlags, 1}}, + {1793, {wxTextAttr, setFont, 2}}, + {1794, {wxTextAttr, setLeftIndent, 2}}, + {1795, {wxTextAttr, setRightIndent, 1}}, + {1796, {wxTextAttr, setTabs, 1}}, + {1797, {wxTextAttr, setTextColour, 1}}, + {1798, {wxTextAttr, 'Destroy', undefined}}, + {1800, {wxTextCtrl, new_3, 3}}, + {1801, {wxTextCtrl, new_0, 0}}, + {1803, {wxTextCtrl, destruct, 0}}, + {1804, {wxTextCtrl, appendText, 1}}, + {1805, {wxTextCtrl, canCopy, 0}}, + {1806, {wxTextCtrl, canCut, 0}}, + {1807, {wxTextCtrl, canPaste, 0}}, + {1808, {wxTextCtrl, canRedo, 0}}, + {1809, {wxTextCtrl, canUndo, 0}}, + {1810, {wxTextCtrl, clear, 0}}, + {1811, {wxTextCtrl, copy, 0}}, + {1812, {wxTextCtrl, create, 3}}, + {1813, {wxTextCtrl, cut, 0}}, + {1814, {wxTextCtrl, discardEdits, 0}}, + {1815, {wxTextCtrl, emulateKeyPress, 1}}, + {1816, {wxTextCtrl, getDefaultStyle, 0}}, + {1817, {wxTextCtrl, getInsertionPoint, 0}}, + {1818, {wxTextCtrl, getLastPosition, 0}}, + {1819, {wxTextCtrl, getLineLength, 1}}, + {1820, {wxTextCtrl, getLineText, 1}}, + {1821, {wxTextCtrl, getNumberOfLines, 0}}, + {1822, {wxTextCtrl, getRange, 2}}, + {1823, {wxTextCtrl, getSelection, 2}}, + {1824, {wxTextCtrl, getStringSelection, 0}}, + {1825, {wxTextCtrl, getStyle, 2}}, + {1826, {wxTextCtrl, getValue, 0}}, + {1827, {wxTextCtrl, isEditable, 0}}, + {1828, {wxTextCtrl, isModified, 0}}, + {1829, {wxTextCtrl, isMultiLine, 0}}, + {1830, {wxTextCtrl, isSingleLine, 0}}, + {1831, {wxTextCtrl, loadFile, 2}}, + {1832, {wxTextCtrl, markDirty, 0}}, + {1833, {wxTextCtrl, paste, 0}}, + {1834, {wxTextCtrl, positionToXY, 3}}, + {1835, {wxTextCtrl, redo, 0}}, + {1836, {wxTextCtrl, remove, 2}}, + {1837, {wxTextCtrl, replace, 3}}, + {1838, {wxTextCtrl, saveFile, 1}}, + {1839, {wxTextCtrl, setDefaultStyle, 1}}, + {1840, {wxTextCtrl, setEditable, 1}}, + {1841, {wxTextCtrl, setInsertionPoint, 1}}, + {1842, {wxTextCtrl, setInsertionPointEnd, 0}}, + {1844, {wxTextCtrl, setMaxLength, 1}}, + {1845, {wxTextCtrl, setSelection, 2}}, + {1846, {wxTextCtrl, setStyle, 3}}, + {1847, {wxTextCtrl, setValue, 1}}, + {1848, {wxTextCtrl, showPosition, 1}}, + {1849, {wxTextCtrl, undo, 0}}, + {1850, {wxTextCtrl, writeText, 1}}, + {1851, {wxTextCtrl, xYToPosition, 2}}, + {1854, {wxNotebook, new_0, 0}}, + {1855, {wxNotebook, new_3, 3}}, + {1856, {wxNotebook, destruct, 0}}, + {1857, {wxNotebook, addPage, 3}}, + {1858, {wxNotebook, advanceSelection, 1}}, + {1859, {wxNotebook, assignImageList, 1}}, + {1860, {wxNotebook, create, 3}}, + {1861, {wxNotebook, deleteAllPages, 0}}, + {1862, {wxNotebook, deletePage, 1}}, + {1863, {wxNotebook, removePage, 1}}, + {1864, {wxNotebook, getCurrentPage, 0}}, + {1865, {wxNotebook, getImageList, 0}}, + {1867, {wxNotebook, getPage, 1}}, + {1868, {wxNotebook, getPageCount, 0}}, + {1869, {wxNotebook, getPageImage, 1}}, + {1870, {wxNotebook, getPageText, 1}}, + {1871, {wxNotebook, getRowCount, 0}}, + {1872, {wxNotebook, getSelection, 0}}, + {1873, {wxNotebook, getThemeBackgroundColour, 0}}, + {1875, {wxNotebook, hitTest, 2}}, + {1877, {wxNotebook, insertPage, 4}}, + {1878, {wxNotebook, setImageList, 1}}, + {1879, {wxNotebook, setPadding, 1}}, + {1880, {wxNotebook, setPageSize, 1}}, + {1881, {wxNotebook, setPageImage, 2}}, + {1882, {wxNotebook, setPageText, 2}}, + {1883, {wxNotebook, setSelection, 1}}, + {1884, {wxNotebook, changeSelection, 1}}, + {1885, {wxChoicebook, new_0, 0}}, + {1886, {wxChoicebook, new_3, 3}}, + {1887, {wxChoicebook, addPage, 3}}, + {1888, {wxChoicebook, advanceSelection, 1}}, + {1889, {wxChoicebook, assignImageList, 1}}, + {1890, {wxChoicebook, create, 3}}, + {1891, {wxChoicebook, deleteAllPages, 0}}, + {1892, {wxChoicebook, deletePage, 1}}, + {1893, {wxChoicebook, removePage, 1}}, + {1894, {wxChoicebook, getCurrentPage, 0}}, + {1895, {wxChoicebook, getImageList, 0}}, + {1897, {wxChoicebook, getPage, 1}}, + {1898, {wxChoicebook, getPageCount, 0}}, + {1899, {wxChoicebook, getPageImage, 1}}, + {1900, {wxChoicebook, getPageText, 1}}, + {1901, {wxChoicebook, getSelection, 0}}, + {1902, {wxChoicebook, hitTest, 2}}, + {1903, {wxChoicebook, insertPage, 4}}, + {1904, {wxChoicebook, setImageList, 1}}, + {1905, {wxChoicebook, setPageSize, 1}}, + {1906, {wxChoicebook, setPageImage, 2}}, + {1907, {wxChoicebook, setPageText, 2}}, + {1908, {wxChoicebook, setSelection, 1}}, + {1909, {wxChoicebook, changeSelection, 1}}, + {1910, {wxChoicebook, 'Destroy', undefined}}, + {1911, {wxToolbook, new_0, 0}}, + {1912, {wxToolbook, new_3, 3}}, + {1913, {wxToolbook, addPage, 3}}, + {1914, {wxToolbook, advanceSelection, 1}}, + {1915, {wxToolbook, assignImageList, 1}}, + {1916, {wxToolbook, create, 3}}, + {1917, {wxToolbook, deleteAllPages, 0}}, + {1918, {wxToolbook, deletePage, 1}}, + {1919, {wxToolbook, removePage, 1}}, + {1920, {wxToolbook, getCurrentPage, 0}}, + {1921, {wxToolbook, getImageList, 0}}, + {1923, {wxToolbook, getPage, 1}}, + {1924, {wxToolbook, getPageCount, 0}}, + {1925, {wxToolbook, getPageImage, 1}}, + {1926, {wxToolbook, getPageText, 1}}, + {1927, {wxToolbook, getSelection, 0}}, + {1929, {wxToolbook, hitTest, 2}}, + {1930, {wxToolbook, insertPage, 4}}, + {1931, {wxToolbook, setImageList, 1}}, + {1932, {wxToolbook, setPageSize, 1}}, + {1933, {wxToolbook, setPageImage, 2}}, + {1934, {wxToolbook, setPageText, 2}}, + {1935, {wxToolbook, setSelection, 1}}, + {1936, {wxToolbook, changeSelection, 1}}, + {1937, {wxToolbook, 'Destroy', undefined}}, + {1938, {wxListbook, new_0, 0}}, + {1939, {wxListbook, new_3, 3}}, + {1940, {wxListbook, addPage, 3}}, + {1941, {wxListbook, advanceSelection, 1}}, + {1942, {wxListbook, assignImageList, 1}}, + {1943, {wxListbook, create, 3}}, + {1944, {wxListbook, deleteAllPages, 0}}, + {1945, {wxListbook, deletePage, 1}}, + {1946, {wxListbook, removePage, 1}}, + {1947, {wxListbook, getCurrentPage, 0}}, + {1948, {wxListbook, getImageList, 0}}, + {1950, {wxListbook, getPage, 1}}, + {1951, {wxListbook, getPageCount, 0}}, + {1952, {wxListbook, getPageImage, 1}}, + {1953, {wxListbook, getPageText, 1}}, + {1954, {wxListbook, getSelection, 0}}, + {1956, {wxListbook, hitTest, 2}}, + {1957, {wxListbook, insertPage, 4}}, + {1958, {wxListbook, setImageList, 1}}, + {1959, {wxListbook, setPageSize, 1}}, + {1960, {wxListbook, setPageImage, 2}}, + {1961, {wxListbook, setPageText, 2}}, + {1962, {wxListbook, setSelection, 1}}, + {1963, {wxListbook, changeSelection, 1}}, + {1964, {wxListbook, 'Destroy', undefined}}, + {1965, {wxTreebook, new_0, 0}}, + {1966, {wxTreebook, new_3, 3}}, + {1967, {wxTreebook, addPage, 3}}, + {1968, {wxTreebook, advanceSelection, 1}}, + {1969, {wxTreebook, assignImageList, 1}}, + {1970, {wxTreebook, create, 3}}, + {1971, {wxTreebook, deleteAllPages, 0}}, + {1972, {wxTreebook, deletePage, 1}}, + {1973, {wxTreebook, removePage, 1}}, + {1974, {wxTreebook, getCurrentPage, 0}}, + {1975, {wxTreebook, getImageList, 0}}, + {1977, {wxTreebook, getPage, 1}}, + {1978, {wxTreebook, getPageCount, 0}}, + {1979, {wxTreebook, getPageImage, 1}}, + {1980, {wxTreebook, getPageText, 1}}, + {1981, {wxTreebook, getSelection, 0}}, + {1982, {wxTreebook, expandNode, 2}}, + {1983, {wxTreebook, isNodeExpanded, 1}}, + {1985, {wxTreebook, hitTest, 2}}, + {1986, {wxTreebook, insertPage, 4}}, + {1987, {wxTreebook, insertSubPage, 4}}, + {1988, {wxTreebook, setImageList, 1}}, + {1989, {wxTreebook, setPageSize, 1}}, + {1990, {wxTreebook, setPageImage, 2}}, + {1991, {wxTreebook, setPageText, 2}}, + {1992, {wxTreebook, setSelection, 1}}, + {1993, {wxTreebook, changeSelection, 1}}, + {1994, {wxTreebook, 'Destroy', undefined}}, + {1997, {wxTreeCtrl, new_2, 2}}, + {1998, {wxTreeCtrl, new_0, 0}}, + {2000, {wxTreeCtrl, destruct, 0}}, + {2001, {wxTreeCtrl, addRoot, 2}}, + {2002, {wxTreeCtrl, appendItem, 3}}, + {2003, {wxTreeCtrl, assignImageList, 1}}, + {2004, {wxTreeCtrl, assignStateImageList, 1}}, + {2005, {wxTreeCtrl, collapse, 1}}, + {2006, {wxTreeCtrl, collapseAndReset, 1}}, + {2007, {wxTreeCtrl, create, 2}}, + {2008, {wxTreeCtrl, delete, 1}}, + {2009, {wxTreeCtrl, deleteAllItems, 0}}, + {2010, {wxTreeCtrl, deleteChildren, 1}}, + {2011, {wxTreeCtrl, ensureVisible, 1}}, + {2012, {wxTreeCtrl, expand, 1}}, + {2013, {wxTreeCtrl, getBoundingRect, 3}}, + {2015, {wxTreeCtrl, getChildrenCount, 2}}, + {2016, {wxTreeCtrl, getCount, 0}}, + {2017, {wxTreeCtrl, getEditControl, 0}}, + {2018, {wxTreeCtrl, getFirstVisibleItem, 0}}, + {2019, {wxTreeCtrl, getImageList, 0}}, + {2020, {wxTreeCtrl, getIndent, 0}}, + {2021, {wxTreeCtrl, getItemBackgroundColour, 1}}, + {2022, {wxTreeCtrl, getItemData, 1}}, + {2023, {wxTreeCtrl, getItemFont, 1}}, + {2024, {wxTreeCtrl, getItemImage_1, 1}}, + {2025, {wxTreeCtrl, getItemImage_2, 2}}, + {2026, {wxTreeCtrl, getItemText, 1}}, + {2027, {wxTreeCtrl, getItemTextColour, 1}}, + {2028, {wxTreeCtrl, getLastChild, 1}}, + {2029, {wxTreeCtrl, getNextSibling, 1}}, + {2030, {wxTreeCtrl, getNextVisible, 1}}, + {2031, {wxTreeCtrl, getItemParent, 1}}, + {2032, {wxTreeCtrl, getPrevSibling, 1}}, + {2033, {wxTreeCtrl, getPrevVisible, 1}}, + {2034, {wxTreeCtrl, getRootItem, 0}}, + {2035, {wxTreeCtrl, getSelection, 0}}, + {2036, {wxTreeCtrl, getSelections, 1}}, + {2037, {wxTreeCtrl, getStateImageList, 0}}, + {2038, {wxTreeCtrl, hitTest, 1}}, + {2039, {wxTreeCtrl, insertItem_4_1, 4}}, + {2040, {wxTreeCtrl, insertItem_4_0, 4}}, + {2041, {wxTreeCtrl, isBold, 1}}, + {2042, {wxTreeCtrl, isExpanded, 1}}, + {2043, {wxTreeCtrl, isSelected, 1}}, + {2044, {wxTreeCtrl, isVisible, 1}}, + {2045, {wxTreeCtrl, itemHasChildren, 1}}, + {2046, {wxTreeCtrl, prependItem, 3}}, + {2047, {wxTreeCtrl, scrollTo, 1}}, + {2048, {wxTreeCtrl, selectItem_1, 1}}, + {2049, {wxTreeCtrl, selectItem_2, 2}}, + {2050, {wxTreeCtrl, setIndent, 1}}, + {2051, {wxTreeCtrl, setImageList, 1}}, + {2052, {wxTreeCtrl, setItemBackgroundColour, 2}}, + {2053, {wxTreeCtrl, setItemBold, 2}}, + {2054, {wxTreeCtrl, setItemData, 2}}, + {2055, {wxTreeCtrl, setItemDropHighlight, 2}}, + {2056, {wxTreeCtrl, setItemFont, 2}}, + {2057, {wxTreeCtrl, setItemHasChildren, 2}}, + {2058, {wxTreeCtrl, setItemImage_2, 2}}, + {2059, {wxTreeCtrl, setItemImage_3, 3}}, + {2060, {wxTreeCtrl, setItemText, 2}}, + {2061, {wxTreeCtrl, setItemTextColour, 2}}, + {2062, {wxTreeCtrl, setStateImageList, 1}}, + {2063, {wxTreeCtrl, setWindowStyle, 1}}, + {2064, {wxTreeCtrl, sortChildren, 1}}, + {2065, {wxTreeCtrl, toggle, 1}}, + {2066, {wxTreeCtrl, toggleItemSelection, 1}}, + {2067, {wxTreeCtrl, unselect, 0}}, + {2068, {wxTreeCtrl, unselectAll, 0}}, + {2069, {wxTreeCtrl, unselectItem, 1}}, + {2070, {wxScrollBar, new_0, 0}}, + {2071, {wxScrollBar, new_3, 3}}, + {2072, {wxScrollBar, destruct, 0}}, + {2073, {wxScrollBar, create, 3}}, + {2074, {wxScrollBar, getRange, 0}}, + {2075, {wxScrollBar, getPageSize, 0}}, + {2076, {wxScrollBar, getThumbPosition, 0}}, + {2077, {wxScrollBar, getThumbSize, 0}}, + {2078, {wxScrollBar, setThumbPosition, 1}}, + {2079, {wxScrollBar, setScrollbar, 5}}, + {2081, {wxSpinButton, new_2, 2}}, + {2082, {wxSpinButton, new_0, 0}}, + {2083, {wxSpinButton, create, 2}}, + {2084, {wxSpinButton, getMax, 0}}, + {2085, {wxSpinButton, getMin, 0}}, + {2086, {wxSpinButton, getValue, 0}}, + {2087, {wxSpinButton, setRange, 2}}, + {2088, {wxSpinButton, setValue, 1}}, + {2089, {wxSpinButton, 'Destroy', undefined}}, + {2090, {wxSpinCtrl, new_0, 0}}, + {2091, {wxSpinCtrl, new_2, 2}}, + {2093, {wxSpinCtrl, create, 2}}, + {2096, {wxSpinCtrl, setValue_1_1, 1}}, + {2097, {wxSpinCtrl, setValue_1_0, 1}}, + {2099, {wxSpinCtrl, getValue, 0}}, + {2101, {wxSpinCtrl, setRange, 2}}, + {2102, {wxSpinCtrl, setSelection, 2}}, + {2104, {wxSpinCtrl, getMin, 0}}, + {2106, {wxSpinCtrl, getMax, 0}}, + {2107, {wxSpinCtrl, 'Destroy', undefined}}, + {2108, {wxStaticText, new_0, 0}}, + {2109, {wxStaticText, new_4, 4}}, + {2110, {wxStaticText, create, 4}}, + {2111, {wxStaticText, getLabel, 0}}, + {2112, {wxStaticText, setLabel, 1}}, + {2113, {wxStaticText, wrap, 1}}, + {2114, {wxStaticText, 'Destroy', undefined}}, + {2115, {wxStaticBitmap, new_0, 0}}, + {2116, {wxStaticBitmap, new_4, 4}}, + {2117, {wxStaticBitmap, create, 4}}, + {2118, {wxStaticBitmap, getBitmap, 0}}, + {2119, {wxStaticBitmap, setBitmap, 1}}, + {2120, {wxStaticBitmap, 'Destroy', undefined}}, + {2121, {wxRadioBox, new, 7}}, + {2123, {wxRadioBox, destruct, 0}}, + {2124, {wxRadioBox, create, 7}}, + {2125, {wxRadioBox, enable_2, 2}}, + {2126, {wxRadioBox, enable_1, 1}}, + {2127, {wxRadioBox, getSelection, 0}}, + {2128, {wxRadioBox, getString, 1}}, + {2129, {wxRadioBox, setSelection, 1}}, + {2130, {wxRadioBox, show_2, 2}}, + {2131, {wxRadioBox, show_1, 1}}, + {2132, {wxRadioBox, getColumnCount, 0}}, + {2133, {wxRadioBox, getItemHelpText, 1}}, + {2134, {wxRadioBox, getItemToolTip, 1}}, + {2136, {wxRadioBox, getItemFromPoint, 1}}, + {2137, {wxRadioBox, getRowCount, 0}}, + {2138, {wxRadioBox, isItemEnabled, 1}}, + {2139, {wxRadioBox, isItemShown, 1}}, + {2140, {wxRadioBox, setItemHelpText, 2}}, + {2141, {wxRadioBox, setItemToolTip, 2}}, + {2142, {wxRadioButton, new_0, 0}}, + {2143, {wxRadioButton, new_4, 4}}, + {2144, {wxRadioButton, create, 4}}, + {2145, {wxRadioButton, getValue, 0}}, + {2146, {wxRadioButton, setValue, 1}}, + {2147, {wxRadioButton, 'Destroy', undefined}}, + {2149, {wxSlider, new_6, 6}}, + {2150, {wxSlider, new_0, 0}}, + {2151, {wxSlider, create, 6}}, + {2152, {wxSlider, getLineSize, 0}}, + {2153, {wxSlider, getMax, 0}}, + {2154, {wxSlider, getMin, 0}}, + {2155, {wxSlider, getPageSize, 0}}, + {2156, {wxSlider, getThumbLength, 0}}, + {2157, {wxSlider, getValue, 0}}, + {2158, {wxSlider, setLineSize, 1}}, + {2159, {wxSlider, setPageSize, 1}}, + {2160, {wxSlider, setRange, 2}}, + {2161, {wxSlider, setThumbLength, 1}}, + {2162, {wxSlider, setValue, 1}}, + {2163, {wxSlider, 'Destroy', undefined}}, + {2165, {wxDialog, new_4, 4}}, + {2166, {wxDialog, new_0, 0}}, + {2168, {wxDialog, destruct, 0}}, + {2169, {wxDialog, create, 4}}, + {2170, {wxDialog, createButtonSizer, 1}}, + {2171, {wxDialog, createStdDialogButtonSizer, 1}}, + {2172, {wxDialog, endModal, 1}}, + {2173, {wxDialog, getAffirmativeId, 0}}, + {2174, {wxDialog, getReturnCode, 0}}, + {2175, {wxDialog, isModal, 0}}, + {2176, {wxDialog, setAffirmativeId, 1}}, + {2177, {wxDialog, setReturnCode, 1}}, + {2178, {wxDialog, show, 1}}, + {2179, {wxDialog, showModal, 0}}, + {2180, {wxColourDialog, new_0, 0}}, + {2181, {wxColourDialog, new_2, 2}}, + {2182, {wxColourDialog, destruct, 0}}, + {2183, {wxColourDialog, create, 2}}, + {2184, {wxColourDialog, getColourData, 0}}, + {2185, {wxColourData, new_0, 0}}, + {2186, {wxColourData, new_1, 1}}, + {2187, {wxColourData, destruct, 0}}, + {2188, {wxColourData, getChooseFull, 0}}, + {2189, {wxColourData, getColour, 0}}, + {2191, {wxColourData, getCustomColour, 1}}, + {2192, {wxColourData, setChooseFull, 1}}, + {2193, {wxColourData, setColour, 1}}, + {2194, {wxColourData, setCustomColour, 2}}, + {2195, {wxPalette, new_0, 0}}, + {2196, {wxPalette, new_4, 4}}, + {2198, {wxPalette, destruct, 0}}, + {2199, {wxPalette, create, 4}}, + {2200, {wxPalette, getColoursCount, 0}}, + {2201, {wxPalette, getPixel, 3}}, + {2202, {wxPalette, getRGB, 4}}, + {2203, {wxPalette, isOk, 0}}, + {2207, {wxDirDialog, new, 2}}, + {2208, {wxDirDialog, destruct, 0}}, + {2209, {wxDirDialog, getPath, 0}}, + {2210, {wxDirDialog, getMessage, 0}}, + {2211, {wxDirDialog, setMessage, 1}}, + {2212, {wxDirDialog, setPath, 1}}, + {2216, {wxFileDialog, new, 2}}, + {2217, {wxFileDialog, destruct, 0}}, + {2218, {wxFileDialog, getDirectory, 0}}, + {2219, {wxFileDialog, getFilename, 0}}, + {2220, {wxFileDialog, getFilenames, 1}}, + {2221, {wxFileDialog, getFilterIndex, 0}}, + {2222, {wxFileDialog, getMessage, 0}}, + {2223, {wxFileDialog, getPath, 0}}, + {2224, {wxFileDialog, getPaths, 1}}, + {2225, {wxFileDialog, getWildcard, 0}}, + {2226, {wxFileDialog, setDirectory, 1}}, + {2227, {wxFileDialog, setFilename, 1}}, + {2228, {wxFileDialog, setFilterIndex, 1}}, + {2229, {wxFileDialog, setMessage, 1}}, + {2230, {wxFileDialog, setPath, 1}}, + {2231, {wxFileDialog, setWildcard, 1}}, + {2232, {wxPickerBase, setInternalMargin, 1}}, + {2233, {wxPickerBase, getInternalMargin, 0}}, + {2234, {wxPickerBase, setTextCtrlProportion, 1}}, + {2235, {wxPickerBase, setPickerCtrlProportion, 1}}, + {2236, {wxPickerBase, getTextCtrlProportion, 0}}, + {2237, {wxPickerBase, getPickerCtrlProportion, 0}}, + {2238, {wxPickerBase, hasTextCtrl, 0}}, + {2239, {wxPickerBase, getTextCtrl, 0}}, + {2240, {wxPickerBase, isTextCtrlGrowable, 0}}, + {2241, {wxPickerBase, setPickerCtrlGrowable, 1}}, + {2242, {wxPickerBase, setTextCtrlGrowable, 1}}, + {2243, {wxPickerBase, isPickerCtrlGrowable, 0}}, + {2244, {wxFilePickerCtrl, new_0, 0}}, + {2245, {wxFilePickerCtrl, new_3, 3}}, + {2246, {wxFilePickerCtrl, create, 3}}, + {2247, {wxFilePickerCtrl, getPath, 0}}, + {2248, {wxFilePickerCtrl, setPath, 1}}, + {2249, {wxFilePickerCtrl, 'Destroy', undefined}}, + {2250, {wxDirPickerCtrl, new_0, 0}}, + {2251, {wxDirPickerCtrl, new_3, 3}}, + {2252, {wxDirPickerCtrl, create, 3}}, + {2253, {wxDirPickerCtrl, getPath, 0}}, + {2254, {wxDirPickerCtrl, setPath, 1}}, + {2255, {wxDirPickerCtrl, 'Destroy', undefined}}, + {2256, {wxColourPickerCtrl, new_0, 0}}, + {2257, {wxColourPickerCtrl, new_3, 3}}, + {2258, {wxColourPickerCtrl, create, 3}}, + {2259, {wxColourPickerCtrl, getColour, 0}}, + {2260, {wxColourPickerCtrl, setColour_1_1, 1}}, + {2261, {wxColourPickerCtrl, setColour_1_0, 1}}, + {2262, {wxColourPickerCtrl, 'Destroy', undefined}}, + {2263, {wxDatePickerCtrl, new_0, 0}}, + {2264, {wxDatePickerCtrl, new_3, 3}}, + {2265, {wxDatePickerCtrl, getRange, 2}}, + {2266, {wxDatePickerCtrl, getValue, 0}}, + {2267, {wxDatePickerCtrl, setRange, 2}}, + {2268, {wxDatePickerCtrl, setValue, 1}}, + {2269, {wxDatePickerCtrl, 'Destroy', undefined}}, + {2270, {wxFontPickerCtrl, new_0, 0}}, + {2271, {wxFontPickerCtrl, new_3, 3}}, + {2272, {wxFontPickerCtrl, create, 3}}, + {2273, {wxFontPickerCtrl, getSelectedFont, 0}}, + {2274, {wxFontPickerCtrl, setSelectedFont, 1}}, + {2275, {wxFontPickerCtrl, getMaxPointSize, 0}}, + {2276, {wxFontPickerCtrl, setMaxPointSize, 1}}, + {2277, {wxFontPickerCtrl, 'Destroy', undefined}}, + {2280, {wxFindReplaceDialog, new_0, 0}}, + {2281, {wxFindReplaceDialog, new_4, 4}}, + {2282, {wxFindReplaceDialog, destruct, 0}}, + {2283, {wxFindReplaceDialog, create, 4}}, + {2284, {wxFindReplaceDialog, getData, 0}}, + {2285, {wxFindReplaceData, new_0, 0}}, + {2286, {wxFindReplaceData, new_1, 1}}, + {2287, {wxFindReplaceData, getFindString, 0}}, + {2288, {wxFindReplaceData, getReplaceString, 0}}, + {2289, {wxFindReplaceData, getFlags, 0}}, + {2290, {wxFindReplaceData, setFlags, 1}}, + {2291, {wxFindReplaceData, setFindString, 1}}, + {2292, {wxFindReplaceData, setReplaceString, 1}}, + {2293, {wxFindReplaceData, 'Destroy', undefined}}, + {2294, {wxMultiChoiceDialog, new_0, 0}}, + {2296, {wxMultiChoiceDialog, new_5, 5}}, + {2297, {wxMultiChoiceDialog, getSelections, 0}}, + {2298, {wxMultiChoiceDialog, setSelections, 1}}, + {2299, {wxMultiChoiceDialog, 'Destroy', undefined}}, + {2300, {wxSingleChoiceDialog, new_0, 0}}, + {2302, {wxSingleChoiceDialog, new_5, 5}}, + {2303, {wxSingleChoiceDialog, getSelection, 0}}, + {2304, {wxSingleChoiceDialog, getStringSelection, 0}}, + {2305, {wxSingleChoiceDialog, setSelection, 1}}, + {2306, {wxSingleChoiceDialog, 'Destroy', undefined}}, + {2307, {wxTextEntryDialog, new, 3}}, + {2308, {wxTextEntryDialog, getValue, 0}}, + {2309, {wxTextEntryDialog, setValue, 1}}, + {2310, {wxTextEntryDialog, 'Destroy', undefined}}, + {2311, {wxPasswordEntryDialog, new, 3}}, + {2312, {wxPasswordEntryDialog, 'Destroy', undefined}}, + {2313, {wxFontData, new_0, 0}}, + {2314, {wxFontData, new_1, 1}}, + {2315, {wxFontData, destruct, 0}}, + {2316, {wxFontData, enableEffects, 1}}, + {2317, {wxFontData, getAllowSymbols, 0}}, + {2318, {wxFontData, getColour, 0}}, + {2319, {wxFontData, getChosenFont, 0}}, + {2320, {wxFontData, getEnableEffects, 0}}, + {2321, {wxFontData, getInitialFont, 0}}, + {2322, {wxFontData, getShowHelp, 0}}, + {2323, {wxFontData, setAllowSymbols, 1}}, + {2324, {wxFontData, setChosenFont, 1}}, + {2325, {wxFontData, setColour, 1}}, + {2326, {wxFontData, setInitialFont, 1}}, + {2327, {wxFontData, setRange, 2}}, + {2328, {wxFontData, setShowHelp, 1}}, + {2332, {wxFontDialog, new_0, 0}}, + {2334, {wxFontDialog, new_2, 2}}, + {2336, {wxFontDialog, create, 2}}, + {2337, {wxFontDialog, getFontData, 0}}, + {2339, {wxFontDialog, 'Destroy', undefined}}, + {2340, {wxProgressDialog, new, 3}}, + {2341, {wxProgressDialog, destruct, 0}}, + {2342, {wxProgressDialog, resume, 0}}, + {2343, {wxProgressDialog, update_2, 2}}, + {2344, {wxProgressDialog, update_0, 0}}, + {2345, {wxMessageDialog, new, 3}}, + {2346, {wxMessageDialog, destruct, 0}}, + {2347, {wxPageSetupDialog, new, 2}}, + {2348, {wxPageSetupDialog, destruct, 0}}, + {2349, {wxPageSetupDialog, getPageSetupData, 0}}, + {2350, {wxPageSetupDialog, showModal, 0}}, + {2351, {wxPageSetupDialogData, new_0, 0}}, + {2352, {wxPageSetupDialogData, new_1_0, 1}}, + {2353, {wxPageSetupDialogData, new_1_1, 1}}, + {2354, {wxPageSetupDialogData, destruct, 0}}, + {2355, {wxPageSetupDialogData, enableHelp, 1}}, + {2356, {wxPageSetupDialogData, enableMargins, 1}}, + {2357, {wxPageSetupDialogData, enableOrientation, 1}}, + {2358, {wxPageSetupDialogData, enablePaper, 1}}, + {2359, {wxPageSetupDialogData, enablePrinter, 1}}, + {2360, {wxPageSetupDialogData, getDefaultMinMargins, 0}}, + {2361, {wxPageSetupDialogData, getEnableMargins, 0}}, + {2362, {wxPageSetupDialogData, getEnableOrientation, 0}}, + {2363, {wxPageSetupDialogData, getEnablePaper, 0}}, + {2364, {wxPageSetupDialogData, getEnablePrinter, 0}}, + {2365, {wxPageSetupDialogData, getEnableHelp, 0}}, + {2366, {wxPageSetupDialogData, getDefaultInfo, 0}}, + {2367, {wxPageSetupDialogData, getMarginTopLeft, 0}}, + {2368, {wxPageSetupDialogData, getMarginBottomRight, 0}}, + {2369, {wxPageSetupDialogData, getMinMarginTopLeft, 0}}, + {2370, {wxPageSetupDialogData, getMinMarginBottomRight, 0}}, + {2371, {wxPageSetupDialogData, getPaperId, 0}}, + {2372, {wxPageSetupDialogData, getPaperSize, 0}}, + {2374, {wxPageSetupDialogData, getPrintData, 0}}, + {2375, {wxPageSetupDialogData, isOk, 0}}, + {2376, {wxPageSetupDialogData, setDefaultInfo, 1}}, + {2377, {wxPageSetupDialogData, setDefaultMinMargins, 1}}, + {2378, {wxPageSetupDialogData, setMarginTopLeft, 1}}, + {2379, {wxPageSetupDialogData, setMarginBottomRight, 1}}, + {2380, {wxPageSetupDialogData, setMinMarginTopLeft, 1}}, + {2381, {wxPageSetupDialogData, setMinMarginBottomRight, 1}}, + {2382, {wxPageSetupDialogData, setPaperId, 1}}, + {2383, {wxPageSetupDialogData, setPaperSize_1_1, 1}}, + {2384, {wxPageSetupDialogData, setPaperSize_1_0, 1}}, + {2385, {wxPageSetupDialogData, setPrintData, 1}}, + {2386, {wxPrintDialog, new_2_0, 2}}, + {2387, {wxPrintDialog, new_2_1, 2}}, + {2388, {wxPrintDialog, destruct, 0}}, + {2389, {wxPrintDialog, getPrintDialogData, 0}}, + {2390, {wxPrintDialog, getPrintDC, 0}}, + {2391, {wxPrintDialogData, new_0, 0}}, + {2392, {wxPrintDialogData, new_1_1, 1}}, + {2393, {wxPrintDialogData, new_1_0, 1}}, + {2394, {wxPrintDialogData, destruct, 0}}, + {2395, {wxPrintDialogData, enableHelp, 1}}, + {2396, {wxPrintDialogData, enablePageNumbers, 1}}, + {2397, {wxPrintDialogData, enablePrintToFile, 1}}, + {2398, {wxPrintDialogData, enableSelection, 1}}, + {2399, {wxPrintDialogData, getAllPages, 0}}, + {2400, {wxPrintDialogData, getCollate, 0}}, + {2401, {wxPrintDialogData, getFromPage, 0}}, + {2402, {wxPrintDialogData, getMaxPage, 0}}, + {2403, {wxPrintDialogData, getMinPage, 0}}, + {2404, {wxPrintDialogData, getNoCopies, 0}}, + {2405, {wxPrintDialogData, getPrintData, 0}}, + {2406, {wxPrintDialogData, getPrintToFile, 0}}, + {2407, {wxPrintDialogData, getSelection, 0}}, + {2408, {wxPrintDialogData, getToPage, 0}}, + {2409, {wxPrintDialogData, isOk, 0}}, + {2410, {wxPrintDialogData, setCollate, 1}}, + {2411, {wxPrintDialogData, setFromPage, 1}}, + {2412, {wxPrintDialogData, setMaxPage, 1}}, + {2413, {wxPrintDialogData, setMinPage, 1}}, + {2414, {wxPrintDialogData, setNoCopies, 1}}, + {2415, {wxPrintDialogData, setPrintData, 1}}, + {2416, {wxPrintDialogData, setPrintToFile, 1}}, + {2417, {wxPrintDialogData, setSelection, 1}}, + {2418, {wxPrintDialogData, setToPage, 1}}, + {2419, {wxPrintData, new_0, 0}}, + {2420, {wxPrintData, new_1, 1}}, + {2421, {wxPrintData, destruct, 0}}, + {2422, {wxPrintData, getCollate, 0}}, + {2423, {wxPrintData, getBin, 0}}, + {2424, {wxPrintData, getColour, 0}}, + {2425, {wxPrintData, getDuplex, 0}}, + {2426, {wxPrintData, getNoCopies, 0}}, + {2427, {wxPrintData, getOrientation, 0}}, + {2428, {wxPrintData, getPaperId, 0}}, + {2429, {wxPrintData, getPrinterName, 0}}, + {2430, {wxPrintData, getQuality, 0}}, + {2431, {wxPrintData, isOk, 0}}, + {2432, {wxPrintData, setBin, 1}}, + {2433, {wxPrintData, setCollate, 1}}, + {2434, {wxPrintData, setColour, 1}}, + {2435, {wxPrintData, setDuplex, 1}}, + {2436, {wxPrintData, setNoCopies, 1}}, + {2437, {wxPrintData, setOrientation, 1}}, + {2438, {wxPrintData, setPaperId, 1}}, + {2439, {wxPrintData, setPrinterName, 1}}, + {2440, {wxPrintData, setQuality, 1}}, + {2443, {wxPrintPreview, new_2, 2}}, + {2444, {wxPrintPreview, new_3, 3}}, + {2446, {wxPrintPreview, destruct, 0}}, + {2447, {wxPrintPreview, getCanvas, 0}}, + {2448, {wxPrintPreview, getCurrentPage, 0}}, + {2449, {wxPrintPreview, getFrame, 0}}, + {2450, {wxPrintPreview, getMaxPage, 0}}, + {2451, {wxPrintPreview, getMinPage, 0}}, + {2452, {wxPrintPreview, getPrintout, 0}}, + {2453, {wxPrintPreview, getPrintoutForPrinting, 0}}, + {2454, {wxPrintPreview, isOk, 0}}, + {2455, {wxPrintPreview, paintPage, 2}}, + {2456, {wxPrintPreview, print, 1}}, + {2457, {wxPrintPreview, renderPage, 1}}, + {2458, {wxPrintPreview, setCanvas, 1}}, + {2459, {wxPrintPreview, setCurrentPage, 1}}, + {2460, {wxPrintPreview, setFrame, 1}}, + {2461, {wxPrintPreview, setPrintout, 1}}, + {2462, {wxPrintPreview, setZoom, 1}}, + {2463, {wxPreviewFrame, new, 3}}, + {2464, {wxPreviewFrame, destruct, 0}}, + {2465, {wxPreviewFrame, createControlBar, 0}}, + {2466, {wxPreviewFrame, createCanvas, 0}}, + {2467, {wxPreviewFrame, initialize, 0}}, + {2468, {wxPreviewFrame, onCloseWindow, 1}}, + {2469, {wxPreviewControlBar, new, 4}}, + {2470, {wxPreviewControlBar, destruct, 0}}, + {2471, {wxPreviewControlBar, createButtons, 0}}, + {2472, {wxPreviewControlBar, getPrintPreview, 0}}, + {2473, {wxPreviewControlBar, getZoomControl, 0}}, + {2474, {wxPreviewControlBar, setZoomControl, 1}}, + {2476, {wxPrinter, new, 1}}, + {2477, {wxPrinter, createAbortWindow, 2}}, + {2478, {wxPrinter, getAbort, 0}}, + {2479, {wxPrinter, getLastError, 0}}, + {2480, {wxPrinter, getPrintDialogData, 0}}, + {2481, {wxPrinter, print, 3}}, + {2482, {wxPrinter, printDialog, 1}}, + {2483, {wxPrinter, reportError, 3}}, + {2484, {wxPrinter, setup, 1}}, + {2485, {wxPrinter, 'Destroy', undefined}}, + {2486, {wxXmlResource, new_1, 1}}, + {2487, {wxXmlResource, new_2, 2}}, + {2488, {wxXmlResource, destruct, 0}}, + {2489, {wxXmlResource, attachUnknownControl, 3}}, + {2490, {wxXmlResource, clearHandlers, 0}}, + {2491, {wxXmlResource, compareVersion, 4}}, + {2492, {wxXmlResource, get, 0}}, + {2493, {wxXmlResource, getFlags, 0}}, + {2494, {wxXmlResource, getVersion, 0}}, + {2495, {wxXmlResource, getXRCID, 2}}, + {2496, {wxXmlResource, initAllHandlers, 0}}, + {2497, {wxXmlResource, load, 1}}, + {2498, {wxXmlResource, loadBitmap, 1}}, + {2499, {wxXmlResource, loadDialog_2, 2}}, + {2500, {wxXmlResource, loadDialog_3, 3}}, + {2501, {wxXmlResource, loadFrame_2, 2}}, + {2502, {wxXmlResource, loadFrame_3, 3}}, + {2503, {wxXmlResource, loadIcon, 1}}, + {2504, {wxXmlResource, loadMenu, 1}}, + {2505, {wxXmlResource, loadMenuBar_2, 2}}, + {2506, {wxXmlResource, loadMenuBar_1, 1}}, + {2507, {wxXmlResource, loadPanel_2, 2}}, + {2508, {wxXmlResource, loadPanel_3, 3}}, + {2509, {wxXmlResource, loadToolBar, 2}}, + {2510, {wxXmlResource, set, 1}}, + {2511, {wxXmlResource, setFlags, 1}}, + {2512, {wxXmlResource, unload, 1}}, + {2513, {wxXmlResource, xrcctrl, 3}}, + {2514, {wxHtmlEasyPrinting, new, 1}}, + {2515, {wxHtmlEasyPrinting, destruct, 0}}, + {2516, {wxHtmlEasyPrinting, getPrintData, 0}}, + {2517, {wxHtmlEasyPrinting, getPageSetupData, 0}}, + {2518, {wxHtmlEasyPrinting, previewFile, 1}}, + {2519, {wxHtmlEasyPrinting, previewText, 2}}, + {2520, {wxHtmlEasyPrinting, printFile, 1}}, + {2521, {wxHtmlEasyPrinting, printText, 2}}, + {2522, {wxHtmlEasyPrinting, pageSetup, 0}}, + {2523, {wxHtmlEasyPrinting, setFonts, 3}}, + {2524, {wxHtmlEasyPrinting, setHeader, 2}}, + {2525, {wxHtmlEasyPrinting, setFooter, 2}}, + {2527, {wxGLCanvas, new_2, 2}}, + {2528, {wxGLCanvas, new_3_1, 3}}, + {2529, {wxGLCanvas, new_3_0, 3}}, + {2530, {wxGLCanvas, getContext, 0}}, + {2532, {wxGLCanvas, setCurrent, 0}}, + {2533, {wxGLCanvas, swapBuffers, 0}}, + {2534, {wxGLCanvas, 'Destroy', undefined}}, + {2535, {wxAuiManager, new, 1}}, + {2536, {wxAuiManager, destruct, 0}}, + {2537, {wxAuiManager, addPane_2_1, 2}}, + {2538, {wxAuiManager, addPane_3, 3}}, + {2539, {wxAuiManager, addPane_2_0, 2}}, + {2540, {wxAuiManager, detachPane, 1}}, + {2541, {wxAuiManager, getAllPanes, 0}}, + {2542, {wxAuiManager, getArtProvider, 0}}, + {2543, {wxAuiManager, getDockSizeConstraint, 2}}, + {2544, {wxAuiManager, getFlags, 0}}, + {2545, {wxAuiManager, getManagedWindow, 0}}, + {2546, {wxAuiManager, getManager, 1}}, + {2547, {wxAuiManager, getPane_1_1, 1}}, + {2548, {wxAuiManager, getPane_1_0, 1}}, + {2549, {wxAuiManager, hideHint, 0}}, + {2550, {wxAuiManager, insertPane, 3}}, + {2551, {wxAuiManager, loadPaneInfo, 2}}, + {2552, {wxAuiManager, loadPerspective, 2}}, + {2553, {wxAuiManager, savePaneInfo, 1}}, + {2554, {wxAuiManager, savePerspective, 0}}, + {2555, {wxAuiManager, setArtProvider, 1}}, + {2556, {wxAuiManager, setDockSizeConstraint, 2}}, + {2557, {wxAuiManager, setFlags, 1}}, + {2558, {wxAuiManager, setManagedWindow, 1}}, + {2559, {wxAuiManager, showHint, 1}}, + {2560, {wxAuiManager, unInit, 0}}, + {2561, {wxAuiManager, update, 0}}, + {2562, {wxAuiPaneInfo, new_0, 0}}, + {2563, {wxAuiPaneInfo, new_1, 1}}, + {2564, {wxAuiPaneInfo, destruct, 0}}, + {2565, {wxAuiPaneInfo, bestSize_1, 1}}, + {2566, {wxAuiPaneInfo, bestSize_2, 2}}, + {2567, {wxAuiPaneInfo, bottom, 0}}, + {2568, {wxAuiPaneInfo, bottomDockable, 1}}, + {2569, {wxAuiPaneInfo, caption, 1}}, + {2570, {wxAuiPaneInfo, captionVisible, 1}}, + {2571, {wxAuiPaneInfo, centre, 0}}, + {2572, {wxAuiPaneInfo, centrePane, 0}}, + {2573, {wxAuiPaneInfo, closeButton, 1}}, + {2574, {wxAuiPaneInfo, defaultPane, 0}}, + {2575, {wxAuiPaneInfo, destroyOnClose, 1}}, + {2576, {wxAuiPaneInfo, direction, 1}}, + {2577, {wxAuiPaneInfo, dock, 0}}, + {2578, {wxAuiPaneInfo, dockable, 1}}, + {2579, {wxAuiPaneInfo, fixed, 0}}, + {2580, {wxAuiPaneInfo, float, 0}}, + {2581, {wxAuiPaneInfo, floatable, 1}}, + {2582, {wxAuiPaneInfo, floatingPosition_1, 1}}, + {2583, {wxAuiPaneInfo, floatingPosition_2, 2}}, + {2584, {wxAuiPaneInfo, floatingSize_1, 1}}, + {2585, {wxAuiPaneInfo, floatingSize_2, 2}}, + {2586, {wxAuiPaneInfo, gripper, 1}}, + {2587, {wxAuiPaneInfo, gripperTop, 1}}, + {2588, {wxAuiPaneInfo, hasBorder, 0}}, + {2589, {wxAuiPaneInfo, hasCaption, 0}}, + {2590, {wxAuiPaneInfo, hasCloseButton, 0}}, + {2591, {wxAuiPaneInfo, hasFlag, 1}}, + {2592, {wxAuiPaneInfo, hasGripper, 0}}, + {2593, {wxAuiPaneInfo, hasGripperTop, 0}}, + {2594, {wxAuiPaneInfo, hasMaximizeButton, 0}}, + {2595, {wxAuiPaneInfo, hasMinimizeButton, 0}}, + {2596, {wxAuiPaneInfo, hasPinButton, 0}}, + {2597, {wxAuiPaneInfo, hide, 0}}, + {2598, {wxAuiPaneInfo, isBottomDockable, 0}}, + {2599, {wxAuiPaneInfo, isDocked, 0}}, + {2600, {wxAuiPaneInfo, isFixed, 0}}, + {2601, {wxAuiPaneInfo, isFloatable, 0}}, + {2602, {wxAuiPaneInfo, isFloating, 0}}, + {2603, {wxAuiPaneInfo, isLeftDockable, 0}}, + {2604, {wxAuiPaneInfo, isMovable, 0}}, + {2605, {wxAuiPaneInfo, isOk, 0}}, + {2606, {wxAuiPaneInfo, isResizable, 0}}, + {2607, {wxAuiPaneInfo, isRightDockable, 0}}, + {2608, {wxAuiPaneInfo, isShown, 0}}, + {2609, {wxAuiPaneInfo, isToolbar, 0}}, + {2610, {wxAuiPaneInfo, isTopDockable, 0}}, + {2611, {wxAuiPaneInfo, layer, 1}}, + {2612, {wxAuiPaneInfo, left, 0}}, + {2613, {wxAuiPaneInfo, leftDockable, 1}}, + {2614, {wxAuiPaneInfo, maxSize_1, 1}}, + {2615, {wxAuiPaneInfo, maxSize_2, 2}}, + {2616, {wxAuiPaneInfo, maximizeButton, 1}}, + {2617, {wxAuiPaneInfo, minSize_1, 1}}, + {2618, {wxAuiPaneInfo, minSize_2, 2}}, + {2619, {wxAuiPaneInfo, minimizeButton, 1}}, + {2620, {wxAuiPaneInfo, movable, 1}}, + {2621, {wxAuiPaneInfo, name, 1}}, + {2622, {wxAuiPaneInfo, paneBorder, 1}}, + {2623, {wxAuiPaneInfo, pinButton, 1}}, + {2624, {wxAuiPaneInfo, position, 1}}, + {2625, {wxAuiPaneInfo, resizable, 1}}, + {2626, {wxAuiPaneInfo, right, 0}}, + {2627, {wxAuiPaneInfo, rightDockable, 1}}, + {2628, {wxAuiPaneInfo, row, 1}}, + {2629, {wxAuiPaneInfo, safeSet, 1}}, + {2630, {wxAuiPaneInfo, setFlag, 2}}, + {2631, {wxAuiPaneInfo, show, 1}}, + {2632, {wxAuiPaneInfo, toolbarPane, 0}}, + {2633, {wxAuiPaneInfo, top, 0}}, + {2634, {wxAuiPaneInfo, topDockable, 1}}, + {2635, {wxAuiPaneInfo, window, 1}}, + {2636, {wxAuiNotebook, new_0, 0}}, + {2637, {wxAuiNotebook, new_2, 2}}, + {2638, {wxAuiNotebook, addPage, 3}}, + {2639, {wxAuiNotebook, create, 2}}, + {2640, {wxAuiNotebook, deletePage, 1}}, + {2641, {wxAuiNotebook, getArtProvider, 0}}, + {2642, {wxAuiNotebook, getPage, 1}}, + {2643, {wxAuiNotebook, getPageBitmap, 1}}, + {2644, {wxAuiNotebook, getPageCount, 0}}, + {2645, {wxAuiNotebook, getPageIndex, 1}}, + {2646, {wxAuiNotebook, getPageText, 1}}, + {2647, {wxAuiNotebook, getSelection, 0}}, + {2648, {wxAuiNotebook, insertPage, 4}}, + {2649, {wxAuiNotebook, removePage, 1}}, + {2650, {wxAuiNotebook, setArtProvider, 1}}, + {2651, {wxAuiNotebook, setFont, 1}}, + {2652, {wxAuiNotebook, setPageBitmap, 2}}, + {2653, {wxAuiNotebook, setPageText, 2}}, + {2654, {wxAuiNotebook, setSelection, 1}}, + {2655, {wxAuiNotebook, setTabCtrlHeight, 1}}, + {2656, {wxAuiNotebook, setUniformBitmapSize, 1}}, + {2657, {wxAuiNotebook, 'Destroy', undefined}}, + {2658, {wxMDIParentFrame, new_0, 0}}, + {2659, {wxMDIParentFrame, new_4, 4}}, + {2660, {wxMDIParentFrame, destruct, 0}}, + {2661, {wxMDIParentFrame, activateNext, 0}}, + {2662, {wxMDIParentFrame, activatePrevious, 0}}, + {2663, {wxMDIParentFrame, arrangeIcons, 0}}, + {2664, {wxMDIParentFrame, cascade, 0}}, + {2665, {wxMDIParentFrame, create, 4}}, + {2666, {wxMDIParentFrame, getActiveChild, 0}}, + {2667, {wxMDIParentFrame, getClientWindow, 0}}, + {2668, {wxMDIParentFrame, tile, 1}}, + {2669, {wxMDIChildFrame, new_0, 0}}, + {2670, {wxMDIChildFrame, new_4, 4}}, + {2671, {wxMDIChildFrame, destruct, 0}}, + {2672, {wxMDIChildFrame, activate, 0}}, + {2673, {wxMDIChildFrame, create, 4}}, + {2674, {wxMDIChildFrame, maximize, 1}}, + {2675, {wxMDIChildFrame, restore, 0}}, + {2676, {wxMDIClientWindow, new_0, 0}}, + {2677, {wxMDIClientWindow, new_2, 2}}, + {2678, {wxMDIClientWindow, destruct, 0}}, + {2679, {wxMDIClientWindow, createClient, 2}}, + {2680, {wxLayoutAlgorithm, new, 0}}, + {2681, {wxLayoutAlgorithm, layoutFrame, 2}}, + {2682, {wxLayoutAlgorithm, layoutMDIFrame, 2}}, + {2683, {wxLayoutAlgorithm, layoutWindow, 2}}, + {2684, {wxLayoutAlgorithm, 'Destroy', undefined}}, + {2685, {wxEvent, getId, 0}}, + {2686, {wxEvent, getSkipped, 0}}, + {2687, {wxEvent, getTimestamp, 0}}, + {2688, {wxEvent, isCommandEvent, 0}}, + {2689, {wxEvent, resumePropagation, 1}}, + {2690, {wxEvent, shouldPropagate, 0}}, + {2691, {wxEvent, skip, 1}}, + {2692, {wxEvent, stopPropagation, 0}}, + {2693, {wxCommandEvent, getClientData, 0}}, + {2694, {wxCommandEvent, getExtraLong, 0}}, + {2695, {wxCommandEvent, getInt, 0}}, + {2696, {wxCommandEvent, getSelection, 0}}, + {2697, {wxCommandEvent, getString, 0}}, + {2698, {wxCommandEvent, isChecked, 0}}, + {2699, {wxCommandEvent, isSelection, 0}}, + {2700, {wxCommandEvent, setInt, 1}}, + {2701, {wxCommandEvent, setString, 1}}, + {2702, {wxScrollEvent, getOrientation, 0}}, + {2703, {wxScrollEvent, getPosition, 0}}, + {2704, {wxScrollWinEvent, getOrientation, 0}}, + {2705, {wxScrollWinEvent, getPosition, 0}}, + {2706, {wxMouseEvent, altDown, 0}}, + {2707, {wxMouseEvent, button, 1}}, + {2708, {wxMouseEvent, buttonDClick, 1}}, + {2709, {wxMouseEvent, buttonDown, 1}}, + {2710, {wxMouseEvent, buttonUp, 1}}, + {2711, {wxMouseEvent, cmdDown, 0}}, + {2712, {wxMouseEvent, controlDown, 0}}, + {2713, {wxMouseEvent, dragging, 0}}, + {2714, {wxMouseEvent, entering, 0}}, + {2715, {wxMouseEvent, getButton, 0}}, + {2718, {wxMouseEvent, getPosition, 0}}, + {2719, {wxMouseEvent, getLogicalPosition, 1}}, + {2720, {wxMouseEvent, getLinesPerAction, 0}}, + {2721, {wxMouseEvent, getWheelRotation, 0}}, + {2722, {wxMouseEvent, getWheelDelta, 0}}, + {2723, {wxMouseEvent, getX, 0}}, + {2724, {wxMouseEvent, getY, 0}}, + {2725, {wxMouseEvent, isButton, 0}}, + {2726, {wxMouseEvent, isPageScroll, 0}}, + {2727, {wxMouseEvent, leaving, 0}}, + {2728, {wxMouseEvent, leftDClick, 0}}, + {2729, {wxMouseEvent, leftDown, 0}}, + {2730, {wxMouseEvent, leftIsDown, 0}}, + {2731, {wxMouseEvent, leftUp, 0}}, + {2732, {wxMouseEvent, metaDown, 0}}, + {2733, {wxMouseEvent, middleDClick, 0}}, + {2734, {wxMouseEvent, middleDown, 0}}, + {2735, {wxMouseEvent, middleIsDown, 0}}, + {2736, {wxMouseEvent, middleUp, 0}}, + {2737, {wxMouseEvent, moving, 0}}, + {2738, {wxMouseEvent, rightDClick, 0}}, + {2739, {wxMouseEvent, rightDown, 0}}, + {2740, {wxMouseEvent, rightIsDown, 0}}, + {2741, {wxMouseEvent, rightUp, 0}}, + {2742, {wxMouseEvent, shiftDown, 0}}, + {2743, {wxSetCursorEvent, getCursor, 0}}, + {2744, {wxSetCursorEvent, getX, 0}}, + {2745, {wxSetCursorEvent, getY, 0}}, + {2746, {wxSetCursorEvent, hasCursor, 0}}, + {2747, {wxSetCursorEvent, setCursor, 1}}, + {2748, {wxKeyEvent, altDown, 0}}, + {2749, {wxKeyEvent, cmdDown, 0}}, + {2750, {wxKeyEvent, controlDown, 0}}, + {2751, {wxKeyEvent, getKeyCode, 0}}, + {2752, {wxKeyEvent, getModifiers, 0}}, + {2755, {wxKeyEvent, getPosition, 0}}, + {2756, {wxKeyEvent, getRawKeyCode, 0}}, + {2757, {wxKeyEvent, getRawKeyFlags, 0}}, + {2758, {wxKeyEvent, getUnicodeKey, 0}}, + {2759, {wxKeyEvent, getX, 0}}, + {2760, {wxKeyEvent, getY, 0}}, + {2761, {wxKeyEvent, hasModifiers, 0}}, + {2762, {wxKeyEvent, metaDown, 0}}, + {2763, {wxKeyEvent, shiftDown, 0}}, + {2764, {wxSizeEvent, getSize, 0}}, + {2765, {wxMoveEvent, getPosition, 0}}, + {2766, {wxEraseEvent, getDC, 0}}, + {2767, {wxFocusEvent, getWindow, 0}}, + {2768, {wxChildFocusEvent, getWindow, 0}}, + {2769, {wxMenuEvent, getMenu, 0}}, + {2770, {wxMenuEvent, getMenuId, 0}}, + {2771, {wxMenuEvent, isPopup, 0}}, + {2772, {wxCloseEvent, canVeto, 0}}, + {2773, {wxCloseEvent, getLoggingOff, 0}}, + {2774, {wxCloseEvent, setCanVeto, 1}}, + {2775, {wxCloseEvent, setLoggingOff, 1}}, + {2776, {wxCloseEvent, veto, 1}}, + {2777, {wxShowEvent, setShow, 1}}, + {2778, {wxShowEvent, getShow, 0}}, + {2779, {wxIconizeEvent, iconized, 0}}, + {2780, {wxJoystickEvent, buttonDown, 1}}, + {2781, {wxJoystickEvent, buttonIsDown, 1}}, + {2782, {wxJoystickEvent, buttonUp, 1}}, + {2783, {wxJoystickEvent, getButtonChange, 0}}, + {2784, {wxJoystickEvent, getButtonState, 0}}, + {2785, {wxJoystickEvent, getJoystick, 0}}, + {2786, {wxJoystickEvent, getPosition, 0}}, + {2787, {wxJoystickEvent, getZPosition, 0}}, + {2788, {wxJoystickEvent, isButton, 0}}, + {2789, {wxJoystickEvent, isMove, 0}}, + {2790, {wxJoystickEvent, isZMove, 0}}, + {2791, {wxUpdateUIEvent, canUpdate, 1}}, + {2792, {wxUpdateUIEvent, check, 1}}, + {2793, {wxUpdateUIEvent, enable, 1}}, + {2794, {wxUpdateUIEvent, show, 1}}, + {2795, {wxUpdateUIEvent, getChecked, 0}}, + {2796, {wxUpdateUIEvent, getEnabled, 0}}, + {2797, {wxUpdateUIEvent, getShown, 0}}, + {2798, {wxUpdateUIEvent, getSetChecked, 0}}, + {2799, {wxUpdateUIEvent, getSetEnabled, 0}}, + {2800, {wxUpdateUIEvent, getSetShown, 0}}, + {2801, {wxUpdateUIEvent, getSetText, 0}}, + {2802, {wxUpdateUIEvent, getText, 0}}, + {2803, {wxUpdateUIEvent, getMode, 0}}, + {2804, {wxUpdateUIEvent, getUpdateInterval, 0}}, + {2805, {wxUpdateUIEvent, resetUpdateTime, 0}}, + {2806, {wxUpdateUIEvent, setMode, 1}}, + {2807, {wxUpdateUIEvent, setText, 1}}, + {2808, {wxUpdateUIEvent, setUpdateInterval, 1}}, + {2809, {wxMouseCaptureChangedEvent, getCapturedWindow, 0}}, + {2810, {wxPaletteChangedEvent, setChangedWindow, 1}}, + {2811, {wxPaletteChangedEvent, getChangedWindow, 0}}, + {2812, {wxQueryNewPaletteEvent, setPaletteRealized, 1}}, + {2813, {wxQueryNewPaletteEvent, getPaletteRealized, 0}}, + {2814, {wxNavigationKeyEvent, getDirection, 0}}, + {2815, {wxNavigationKeyEvent, setDirection, 1}}, + {2816, {wxNavigationKeyEvent, isWindowChange, 0}}, + {2817, {wxNavigationKeyEvent, setWindowChange, 1}}, + {2818, {wxNavigationKeyEvent, isFromTab, 0}}, + {2819, {wxNavigationKeyEvent, setFromTab, 1}}, + {2820, {wxNavigationKeyEvent, getCurrentFocus, 0}}, + {2821, {wxNavigationKeyEvent, setCurrentFocus, 1}}, + {2822, {wxHelpEvent, getOrigin, 0}}, + {2823, {wxHelpEvent, getPosition, 0}}, + {2824, {wxHelpEvent, setOrigin, 1}}, + {2825, {wxHelpEvent, setPosition, 1}}, + {2826, {wxContextMenuEvent, getPosition, 0}}, + {2827, {wxContextMenuEvent, setPosition, 1}}, + {2828, {wxIdleEvent, canSend, 1}}, + {2829, {wxIdleEvent, getMode, 0}}, + {2830, {wxIdleEvent, requestMore, 1}}, + {2831, {wxIdleEvent, moreRequested, 0}}, + {2832, {wxIdleEvent, setMode, 1}}, + {2833, {wxGridEvent, altDown, 0}}, + {2834, {wxGridEvent, controlDown, 0}}, + {2835, {wxGridEvent, getCol, 0}}, + {2836, {wxGridEvent, getPosition, 0}}, + {2837, {wxGridEvent, getRow, 0}}, + {2838, {wxGridEvent, metaDown, 0}}, + {2839, {wxGridEvent, selecting, 0}}, + {2840, {wxGridEvent, shiftDown, 0}}, + {2841, {wxNotifyEvent, allow, 0}}, + {2842, {wxNotifyEvent, isAllowed, 0}}, + {2843, {wxNotifyEvent, veto, 0}}, + {2844, {wxSashEvent, getEdge, 0}}, + {2845, {wxSashEvent, getDragRect, 0}}, + {2846, {wxSashEvent, getDragStatus, 0}}, + {2847, {wxListEvent, getCacheFrom, 0}}, + {2848, {wxListEvent, getCacheTo, 0}}, + {2849, {wxListEvent, getKeyCode, 0}}, + {2850, {wxListEvent, getIndex, 0}}, + {2851, {wxListEvent, getColumn, 0}}, + {2852, {wxListEvent, getPoint, 0}}, + {2853, {wxListEvent, getLabel, 0}}, + {2854, {wxListEvent, getText, 0}}, + {2855, {wxListEvent, getImage, 0}}, + {2856, {wxListEvent, getData, 0}}, + {2857, {wxListEvent, getMask, 0}}, + {2858, {wxListEvent, getItem, 0}}, + {2859, {wxListEvent, isEditCancelled, 0}}, + {2860, {wxDateEvent, getDate, 0}}, + {2861, {wxCalendarEvent, getWeekDay, 0}}, + {2862, {wxFileDirPickerEvent, getPath, 0}}, + {2863, {wxColourPickerEvent, getColour, 0}}, + {2864, {wxFontPickerEvent, getFont, 0}}, + {2865, {wxStyledTextEvent, getPosition, 0}}, + {2866, {wxStyledTextEvent, getKey, 0}}, + {2867, {wxStyledTextEvent, getModifiers, 0}}, + {2868, {wxStyledTextEvent, getModificationType, 0}}, + {2869, {wxStyledTextEvent, getText, 0}}, + {2870, {wxStyledTextEvent, getLength, 0}}, + {2871, {wxStyledTextEvent, getLinesAdded, 0}}, + {2872, {wxStyledTextEvent, getLine, 0}}, + {2873, {wxStyledTextEvent, getFoldLevelNow, 0}}, + {2874, {wxStyledTextEvent, getFoldLevelPrev, 0}}, + {2875, {wxStyledTextEvent, getMargin, 0}}, + {2876, {wxStyledTextEvent, getMessage, 0}}, + {2877, {wxStyledTextEvent, getWParam, 0}}, + {2878, {wxStyledTextEvent, getLParam, 0}}, + {2879, {wxStyledTextEvent, getListType, 0}}, + {2880, {wxStyledTextEvent, getX, 0}}, + {2881, {wxStyledTextEvent, getY, 0}}, + {2882, {wxStyledTextEvent, getDragText, 0}}, + {2883, {wxStyledTextEvent, getDragAllowMove, 0}}, + {2884, {wxStyledTextEvent, getDragResult, 0}}, + {2885, {wxStyledTextEvent, getShift, 0}}, + {2886, {wxStyledTextEvent, getControl, 0}}, + {2887, {wxStyledTextEvent, getAlt, 0}}, + {2888, {utils, getKeyState, 1}}, + {2889, {utils, getMousePosition, 2}}, + {2890, {utils, getMouseState, 0}}, + {2891, {utils, setDetectableAutoRepeat, 1}}, + {2892, {utils, bell, 0}}, + {2893, {utils, findMenuItemId, 3}}, + {2894, {utils, genericFindWindowAtPoint, 1}}, + {2895, {utils, findWindowAtPoint, 1}}, + {2896, {utils, beginBusyCursor, 1}}, + {2897, {utils, endBusyCursor, 0}}, + {2898, {utils, isBusy, 0}}, + {2899, {utils, shutdown, 1}}, + {2900, {utils, shell, 1}}, + {2901, {utils, launchDefaultBrowser, 2}}, + {2902, {utils, getEmailAddress, 0}}, + {2903, {utils, getUserId, 0}}, + {2904, {utils, getHomeDir, 0}}, + {2905, {utils, newId, 0}}, + {2906, {utils, registerId, 1}}, + {2907, {utils, getCurrentId, 0}}, + {2908, {utils, getOsDescription, 0}}, + {2909, {utils, isPlatformLittleEndian, 0}}, + {2910, {utils, isPlatform64Bit, 0}}, + {2911, {wxPrintout, new, 1}}, + {2912, {wxPrintout, destruct, 0}}, + {2913, {wxPrintout, getDC, 0}}, + {2914, {wxPrintout, getPageSizeMM, 2}}, + {2915, {wxPrintout, getPageSizePixels, 2}}, + {2916, {wxPrintout, getPaperRectPixels, 0}}, + {2917, {wxPrintout, getPPIPrinter, 2}}, + {2918, {wxPrintout, getPPIScreen, 2}}, + {2919, {wxPrintout, getTitle, 0}}, + {2920, {wxPrintout, isPreview, 0}}, + {2921, {wxPrintout, fitThisSizeToPaper, 1}}, + {2922, {wxPrintout, fitThisSizeToPage, 1}}, + {2923, {wxPrintout, fitThisSizeToPageMargins, 2}}, + {2924, {wxPrintout, mapScreenSizeToPaper, 0}}, + {2925, {wxPrintout, mapScreenSizeToPage, 0}}, + {2926, {wxPrintout, mapScreenSizeToPageMargins, 1}}, + {2927, {wxPrintout, mapScreenSizeToDevice, 0}}, + {2928, {wxPrintout, getLogicalPaperRect, 0}}, + {2929, {wxPrintout, getLogicalPageRect, 0}}, + {2930, {wxPrintout, getLogicalPageMarginsRect, 1}}, + {2931, {wxPrintout, setLogicalOrigin, 2}}, + {2932, {wxPrintout, offsetLogicalOrigin, 2}}, + {2933, {wxStyledTextCtrl, new_2, 2}}, + {2934, {wxStyledTextCtrl, new_0, 0}}, + {2935, {wxStyledTextCtrl, destruct, 0}}, + {2936, {wxStyledTextCtrl, create, 2}}, + {2937, {wxStyledTextCtrl, addText, 1}}, + {2938, {wxStyledTextCtrl, addStyledText, 1}}, + {2939, {wxStyledTextCtrl, insertText, 2}}, + {2940, {wxStyledTextCtrl, clearAll, 0}}, + {2941, {wxStyledTextCtrl, clearDocumentStyle, 0}}, + {2942, {wxStyledTextCtrl, getLength, 0}}, + {2943, {wxStyledTextCtrl, getCharAt, 1}}, + {2944, {wxStyledTextCtrl, getCurrentPos, 0}}, + {2945, {wxStyledTextCtrl, getAnchor, 0}}, + {2946, {wxStyledTextCtrl, getStyleAt, 1}}, + {2947, {wxStyledTextCtrl, redo, 0}}, + {2948, {wxStyledTextCtrl, setUndoCollection, 1}}, + {2949, {wxStyledTextCtrl, selectAll, 0}}, + {2950, {wxStyledTextCtrl, setSavePoint, 0}}, + {2951, {wxStyledTextCtrl, getStyledText, 2}}, + {2952, {wxStyledTextCtrl, canRedo, 0}}, + {2953, {wxStyledTextCtrl, markerLineFromHandle, 1}}, + {2954, {wxStyledTextCtrl, markerDeleteHandle, 1}}, + {2955, {wxStyledTextCtrl, getUndoCollection, 0}}, + {2956, {wxStyledTextCtrl, getViewWhiteSpace, 0}}, + {2957, {wxStyledTextCtrl, setViewWhiteSpace, 1}}, + {2958, {wxStyledTextCtrl, positionFromPoint, 1}}, + {2959, {wxStyledTextCtrl, positionFromPointClose, 2}}, + {2960, {wxStyledTextCtrl, gotoLine, 1}}, + {2961, {wxStyledTextCtrl, gotoPos, 1}}, + {2962, {wxStyledTextCtrl, setAnchor, 1}}, + {2963, {wxStyledTextCtrl, getCurLine, 1}}, + {2964, {wxStyledTextCtrl, getEndStyled, 0}}, + {2965, {wxStyledTextCtrl, convertEOLs, 1}}, + {2966, {wxStyledTextCtrl, getEOLMode, 0}}, + {2967, {wxStyledTextCtrl, setEOLMode, 1}}, + {2968, {wxStyledTextCtrl, startStyling, 2}}, + {2969, {wxStyledTextCtrl, setStyling, 2}}, + {2970, {wxStyledTextCtrl, getBufferedDraw, 0}}, + {2971, {wxStyledTextCtrl, setBufferedDraw, 1}}, + {2972, {wxStyledTextCtrl, setTabWidth, 1}}, + {2973, {wxStyledTextCtrl, getTabWidth, 0}}, + {2974, {wxStyledTextCtrl, setCodePage, 1}}, + {2975, {wxStyledTextCtrl, markerDefine, 3}}, + {2976, {wxStyledTextCtrl, markerSetForeground, 2}}, + {2977, {wxStyledTextCtrl, markerSetBackground, 2}}, + {2978, {wxStyledTextCtrl, markerAdd, 2}}, + {2979, {wxStyledTextCtrl, markerDelete, 2}}, + {2980, {wxStyledTextCtrl, markerDeleteAll, 1}}, + {2981, {wxStyledTextCtrl, markerGet, 1}}, + {2982, {wxStyledTextCtrl, markerNext, 2}}, + {2983, {wxStyledTextCtrl, markerPrevious, 2}}, + {2984, {wxStyledTextCtrl, markerDefineBitmap, 2}}, + {2985, {wxStyledTextCtrl, markerAddSet, 2}}, + {2986, {wxStyledTextCtrl, markerSetAlpha, 2}}, + {2987, {wxStyledTextCtrl, setMarginType, 2}}, + {2988, {wxStyledTextCtrl, getMarginType, 1}}, + {2989, {wxStyledTextCtrl, setMarginWidth, 2}}, + {2990, {wxStyledTextCtrl, getMarginWidth, 1}}, + {2991, {wxStyledTextCtrl, setMarginMask, 2}}, + {2992, {wxStyledTextCtrl, getMarginMask, 1}}, + {2993, {wxStyledTextCtrl, setMarginSensitive, 2}}, + {2994, {wxStyledTextCtrl, getMarginSensitive, 1}}, + {2995, {wxStyledTextCtrl, styleClearAll, 0}}, + {2996, {wxStyledTextCtrl, styleSetForeground, 2}}, + {2997, {wxStyledTextCtrl, styleSetBackground, 2}}, + {2998, {wxStyledTextCtrl, styleSetBold, 2}}, + {2999, {wxStyledTextCtrl, styleSetItalic, 2}}, + {3000, {wxStyledTextCtrl, styleSetSize, 2}}, + {3001, {wxStyledTextCtrl, styleSetFaceName, 2}}, + {3002, {wxStyledTextCtrl, styleSetEOLFilled, 2}}, + {3003, {wxStyledTextCtrl, styleResetDefault, 0}}, + {3004, {wxStyledTextCtrl, styleSetUnderline, 2}}, + {3005, {wxStyledTextCtrl, styleSetCase, 2}}, + {3006, {wxStyledTextCtrl, styleSetHotSpot, 2}}, + {3007, {wxStyledTextCtrl, setSelForeground, 2}}, + {3008, {wxStyledTextCtrl, setSelBackground, 2}}, + {3009, {wxStyledTextCtrl, getSelAlpha, 0}}, + {3010, {wxStyledTextCtrl, setSelAlpha, 1}}, + {3011, {wxStyledTextCtrl, setCaretForeground, 1}}, + {3012, {wxStyledTextCtrl, cmdKeyAssign, 3}}, + {3013, {wxStyledTextCtrl, cmdKeyClear, 2}}, + {3014, {wxStyledTextCtrl, cmdKeyClearAll, 0}}, + {3015, {wxStyledTextCtrl, setStyleBytes, 2}}, + {3016, {wxStyledTextCtrl, styleSetVisible, 2}}, + {3017, {wxStyledTextCtrl, getCaretPeriod, 0}}, + {3018, {wxStyledTextCtrl, setCaretPeriod, 1}}, + {3019, {wxStyledTextCtrl, setWordChars, 1}}, + {3020, {wxStyledTextCtrl, beginUndoAction, 0}}, + {3021, {wxStyledTextCtrl, endUndoAction, 0}}, + {3022, {wxStyledTextCtrl, indicatorSetStyle, 2}}, + {3023, {wxStyledTextCtrl, indicatorGetStyle, 1}}, + {3024, {wxStyledTextCtrl, indicatorSetForeground, 2}}, + {3025, {wxStyledTextCtrl, indicatorGetForeground, 1}}, + {3026, {wxStyledTextCtrl, setWhitespaceForeground, 2}}, + {3027, {wxStyledTextCtrl, setWhitespaceBackground, 2}}, + {3028, {wxStyledTextCtrl, getStyleBits, 0}}, + {3029, {wxStyledTextCtrl, setLineState, 2}}, + {3030, {wxStyledTextCtrl, getLineState, 1}}, + {3031, {wxStyledTextCtrl, getMaxLineState, 0}}, + {3032, {wxStyledTextCtrl, getCaretLineVisible, 0}}, + {3033, {wxStyledTextCtrl, setCaretLineVisible, 1}}, + {3034, {wxStyledTextCtrl, getCaretLineBackground, 0}}, + {3035, {wxStyledTextCtrl, setCaretLineBackground, 1}}, + {3036, {wxStyledTextCtrl, autoCompShow, 2}}, + {3037, {wxStyledTextCtrl, autoCompCancel, 0}}, + {3038, {wxStyledTextCtrl, autoCompActive, 0}}, + {3039, {wxStyledTextCtrl, autoCompPosStart, 0}}, + {3040, {wxStyledTextCtrl, autoCompComplete, 0}}, + {3041, {wxStyledTextCtrl, autoCompStops, 1}}, + {3042, {wxStyledTextCtrl, autoCompSetSeparator, 1}}, + {3043, {wxStyledTextCtrl, autoCompGetSeparator, 0}}, + {3044, {wxStyledTextCtrl, autoCompSelect, 1}}, + {3045, {wxStyledTextCtrl, autoCompSetCancelAtStart, 1}}, + {3046, {wxStyledTextCtrl, autoCompGetCancelAtStart, 0}}, + {3047, {wxStyledTextCtrl, autoCompSetFillUps, 1}}, + {3048, {wxStyledTextCtrl, autoCompSetChooseSingle, 1}}, + {3049, {wxStyledTextCtrl, autoCompGetChooseSingle, 0}}, + {3050, {wxStyledTextCtrl, autoCompSetIgnoreCase, 1}}, + {3051, {wxStyledTextCtrl, autoCompGetIgnoreCase, 0}}, + {3052, {wxStyledTextCtrl, userListShow, 2}}, + {3053, {wxStyledTextCtrl, autoCompSetAutoHide, 1}}, + {3054, {wxStyledTextCtrl, autoCompGetAutoHide, 0}}, + {3055, {wxStyledTextCtrl, autoCompSetDropRestOfWord, 1}}, + {3056, {wxStyledTextCtrl, autoCompGetDropRestOfWord, 0}}, + {3057, {wxStyledTextCtrl, registerImage, 2}}, + {3058, {wxStyledTextCtrl, clearRegisteredImages, 0}}, + {3059, {wxStyledTextCtrl, autoCompGetTypeSeparator, 0}}, + {3060, {wxStyledTextCtrl, autoCompSetTypeSeparator, 1}}, + {3061, {wxStyledTextCtrl, autoCompSetMaxWidth, 1}}, + {3062, {wxStyledTextCtrl, autoCompGetMaxWidth, 0}}, + {3063, {wxStyledTextCtrl, autoCompSetMaxHeight, 1}}, + {3064, {wxStyledTextCtrl, autoCompGetMaxHeight, 0}}, + {3065, {wxStyledTextCtrl, setIndent, 1}}, + {3066, {wxStyledTextCtrl, getIndent, 0}}, + {3067, {wxStyledTextCtrl, setUseTabs, 1}}, + {3068, {wxStyledTextCtrl, getUseTabs, 0}}, + {3069, {wxStyledTextCtrl, setLineIndentation, 2}}, + {3070, {wxStyledTextCtrl, getLineIndentation, 1}}, + {3071, {wxStyledTextCtrl, getLineIndentPosition, 1}}, + {3072, {wxStyledTextCtrl, getColumn, 1}}, + {3073, {wxStyledTextCtrl, setUseHorizontalScrollBar, 1}}, + {3074, {wxStyledTextCtrl, getUseHorizontalScrollBar, 0}}, + {3075, {wxStyledTextCtrl, setIndentationGuides, 1}}, + {3076, {wxStyledTextCtrl, getIndentationGuides, 0}}, + {3077, {wxStyledTextCtrl, setHighlightGuide, 1}}, + {3078, {wxStyledTextCtrl, getHighlightGuide, 0}}, + {3079, {wxStyledTextCtrl, getLineEndPosition, 1}}, + {3080, {wxStyledTextCtrl, getCodePage, 0}}, + {3081, {wxStyledTextCtrl, getCaretForeground, 0}}, + {3082, {wxStyledTextCtrl, getReadOnly, 0}}, + {3083, {wxStyledTextCtrl, setCurrentPos, 1}}, + {3084, {wxStyledTextCtrl, setSelectionStart, 1}}, + {3085, {wxStyledTextCtrl, getSelectionStart, 0}}, + {3086, {wxStyledTextCtrl, setSelectionEnd, 1}}, + {3087, {wxStyledTextCtrl, getSelectionEnd, 0}}, + {3088, {wxStyledTextCtrl, setPrintMagnification, 1}}, + {3089, {wxStyledTextCtrl, getPrintMagnification, 0}}, + {3090, {wxStyledTextCtrl, setPrintColourMode, 1}}, + {3091, {wxStyledTextCtrl, getPrintColourMode, 0}}, + {3092, {wxStyledTextCtrl, findText, 4}}, + {3093, {wxStyledTextCtrl, formatRange, 7}}, + {3094, {wxStyledTextCtrl, getFirstVisibleLine, 0}}, + {3095, {wxStyledTextCtrl, getLine, 1}}, + {3096, {wxStyledTextCtrl, getLineCount, 0}}, + {3097, {wxStyledTextCtrl, setMarginLeft, 1}}, + {3098, {wxStyledTextCtrl, getMarginLeft, 0}}, + {3099, {wxStyledTextCtrl, setMarginRight, 1}}, + {3100, {wxStyledTextCtrl, getMarginRight, 0}}, + {3101, {wxStyledTextCtrl, getModify, 0}}, + {3102, {wxStyledTextCtrl, setSelection, 2}}, + {3103, {wxStyledTextCtrl, getSelectedText, 0}}, + {3104, {wxStyledTextCtrl, getTextRange, 2}}, + {3105, {wxStyledTextCtrl, hideSelection, 1}}, + {3106, {wxStyledTextCtrl, lineFromPosition, 1}}, + {3107, {wxStyledTextCtrl, positionFromLine, 1}}, + {3108, {wxStyledTextCtrl, lineScroll, 2}}, + {3109, {wxStyledTextCtrl, ensureCaretVisible, 0}}, + {3110, {wxStyledTextCtrl, replaceSelection, 1}}, + {3111, {wxStyledTextCtrl, setReadOnly, 1}}, + {3112, {wxStyledTextCtrl, canPaste, 0}}, + {3113, {wxStyledTextCtrl, canUndo, 0}}, + {3114, {wxStyledTextCtrl, emptyUndoBuffer, 0}}, + {3115, {wxStyledTextCtrl, undo, 0}}, + {3116, {wxStyledTextCtrl, cut, 0}}, + {3117, {wxStyledTextCtrl, copy, 0}}, + {3118, {wxStyledTextCtrl, paste, 0}}, + {3119, {wxStyledTextCtrl, clear, 0}}, + {3120, {wxStyledTextCtrl, setText, 1}}, + {3121, {wxStyledTextCtrl, getText, 0}}, + {3122, {wxStyledTextCtrl, getTextLength, 0}}, + {3123, {wxStyledTextCtrl, getOvertype, 0}}, + {3124, {wxStyledTextCtrl, setCaretWidth, 1}}, + {3125, {wxStyledTextCtrl, getCaretWidth, 0}}, + {3126, {wxStyledTextCtrl, setTargetStart, 1}}, + {3127, {wxStyledTextCtrl, getTargetStart, 0}}, + {3128, {wxStyledTextCtrl, setTargetEnd, 1}}, + {3129, {wxStyledTextCtrl, getTargetEnd, 0}}, + {3130, {wxStyledTextCtrl, replaceTarget, 1}}, + {3131, {wxStyledTextCtrl, searchInTarget, 1}}, + {3132, {wxStyledTextCtrl, setSearchFlags, 1}}, + {3133, {wxStyledTextCtrl, getSearchFlags, 0}}, + {3134, {wxStyledTextCtrl, callTipShow, 2}}, + {3135, {wxStyledTextCtrl, callTipCancel, 0}}, + {3136, {wxStyledTextCtrl, callTipActive, 0}}, + {3137, {wxStyledTextCtrl, callTipPosAtStart, 0}}, + {3138, {wxStyledTextCtrl, callTipSetHighlight, 2}}, + {3139, {wxStyledTextCtrl, callTipSetBackground, 1}}, + {3140, {wxStyledTextCtrl, callTipSetForeground, 1}}, + {3141, {wxStyledTextCtrl, callTipSetForegroundHighlight, 1}}, + {3142, {wxStyledTextCtrl, callTipUseStyle, 1}}, + {3143, {wxStyledTextCtrl, visibleFromDocLine, 1}}, + {3144, {wxStyledTextCtrl, docLineFromVisible, 1}}, + {3145, {wxStyledTextCtrl, wrapCount, 1}}, + {3146, {wxStyledTextCtrl, setFoldLevel, 2}}, + {3147, {wxStyledTextCtrl, getFoldLevel, 1}}, + {3148, {wxStyledTextCtrl, getLastChild, 2}}, + {3149, {wxStyledTextCtrl, getFoldParent, 1}}, + {3150, {wxStyledTextCtrl, showLines, 2}}, + {3151, {wxStyledTextCtrl, hideLines, 2}}, + {3152, {wxStyledTextCtrl, getLineVisible, 1}}, + {3153, {wxStyledTextCtrl, setFoldExpanded, 2}}, + {3154, {wxStyledTextCtrl, getFoldExpanded, 1}}, + {3155, {wxStyledTextCtrl, toggleFold, 1}}, + {3156, {wxStyledTextCtrl, ensureVisible, 1}}, + {3157, {wxStyledTextCtrl, setFoldFlags, 1}}, + {3158, {wxStyledTextCtrl, ensureVisibleEnforcePolicy, 1}}, + {3159, {wxStyledTextCtrl, setTabIndents, 1}}, + {3160, {wxStyledTextCtrl, getTabIndents, 0}}, + {3161, {wxStyledTextCtrl, setBackSpaceUnIndents, 1}}, + {3162, {wxStyledTextCtrl, getBackSpaceUnIndents, 0}}, + {3163, {wxStyledTextCtrl, setMouseDwellTime, 1}}, + {3164, {wxStyledTextCtrl, getMouseDwellTime, 0}}, + {3165, {wxStyledTextCtrl, wordStartPosition, 2}}, + {3166, {wxStyledTextCtrl, wordEndPosition, 2}}, + {3167, {wxStyledTextCtrl, setWrapMode, 1}}, + {3168, {wxStyledTextCtrl, getWrapMode, 0}}, + {3169, {wxStyledTextCtrl, setWrapVisualFlags, 1}}, + {3170, {wxStyledTextCtrl, getWrapVisualFlags, 0}}, + {3171, {wxStyledTextCtrl, setWrapVisualFlagsLocation, 1}}, + {3172, {wxStyledTextCtrl, getWrapVisualFlagsLocation, 0}}, + {3173, {wxStyledTextCtrl, setWrapStartIndent, 1}}, + {3174, {wxStyledTextCtrl, getWrapStartIndent, 0}}, + {3175, {wxStyledTextCtrl, setLayoutCache, 1}}, + {3176, {wxStyledTextCtrl, getLayoutCache, 0}}, + {3177, {wxStyledTextCtrl, setScrollWidth, 1}}, + {3178, {wxStyledTextCtrl, getScrollWidth, 0}}, + {3179, {wxStyledTextCtrl, textWidth, 2}}, + {3180, {wxStyledTextCtrl, getEndAtLastLine, 0}}, + {3181, {wxStyledTextCtrl, textHeight, 1}}, + {3182, {wxStyledTextCtrl, setUseVerticalScrollBar, 1}}, + {3183, {wxStyledTextCtrl, getUseVerticalScrollBar, 0}}, + {3184, {wxStyledTextCtrl, appendText, 1}}, + {3185, {wxStyledTextCtrl, getTwoPhaseDraw, 0}}, + {3186, {wxStyledTextCtrl, setTwoPhaseDraw, 1}}, + {3187, {wxStyledTextCtrl, targetFromSelection, 0}}, + {3188, {wxStyledTextCtrl, linesJoin, 0}}, + {3189, {wxStyledTextCtrl, linesSplit, 1}}, + {3190, {wxStyledTextCtrl, setFoldMarginColour, 2}}, + {3191, {wxStyledTextCtrl, setFoldMarginHiColour, 2}}, + {3192, {wxStyledTextCtrl, lineDown, 0}}, + {3193, {wxStyledTextCtrl, lineDownExtend, 0}}, + {3194, {wxStyledTextCtrl, lineUp, 0}}, + {3195, {wxStyledTextCtrl, lineUpExtend, 0}}, + {3196, {wxStyledTextCtrl, charLeft, 0}}, + {3197, {wxStyledTextCtrl, charLeftExtend, 0}}, + {3198, {wxStyledTextCtrl, charRight, 0}}, + {3199, {wxStyledTextCtrl, charRightExtend, 0}}, + {3200, {wxStyledTextCtrl, wordLeft, 0}}, + {3201, {wxStyledTextCtrl, wordLeftExtend, 0}}, + {3202, {wxStyledTextCtrl, wordRight, 0}}, + {3203, {wxStyledTextCtrl, wordRightExtend, 0}}, + {3204, {wxStyledTextCtrl, home, 0}}, + {3205, {wxStyledTextCtrl, homeExtend, 0}}, + {3206, {wxStyledTextCtrl, lineEnd, 0}}, + {3207, {wxStyledTextCtrl, lineEndExtend, 0}}, + {3208, {wxStyledTextCtrl, documentStart, 0}}, + {3209, {wxStyledTextCtrl, documentStartExtend, 0}}, + {3210, {wxStyledTextCtrl, documentEnd, 0}}, + {3211, {wxStyledTextCtrl, documentEndExtend, 0}}, + {3212, {wxStyledTextCtrl, pageUp, 0}}, + {3213, {wxStyledTextCtrl, pageUpExtend, 0}}, + {3214, {wxStyledTextCtrl, pageDown, 0}}, + {3215, {wxStyledTextCtrl, pageDownExtend, 0}}, + {3216, {wxStyledTextCtrl, editToggleOvertype, 0}}, + {3217, {wxStyledTextCtrl, cancel, 0}}, + {3218, {wxStyledTextCtrl, deleteBack, 0}}, + {3219, {wxStyledTextCtrl, tab, 0}}, + {3220, {wxStyledTextCtrl, backTab, 0}}, + {3221, {wxStyledTextCtrl, newLine, 0}}, + {3222, {wxStyledTextCtrl, formFeed, 0}}, + {3223, {wxStyledTextCtrl, vCHome, 0}}, + {3224, {wxStyledTextCtrl, vCHomeExtend, 0}}, + {3225, {wxStyledTextCtrl, zoomIn, 0}}, + {3226, {wxStyledTextCtrl, zoomOut, 0}}, + {3227, {wxStyledTextCtrl, delWordLeft, 0}}, + {3228, {wxStyledTextCtrl, delWordRight, 0}}, + {3229, {wxStyledTextCtrl, lineCut, 0}}, + {3230, {wxStyledTextCtrl, lineDelete, 0}}, + {3231, {wxStyledTextCtrl, lineTranspose, 0}}, + {3232, {wxStyledTextCtrl, lineDuplicate, 0}}, + {3233, {wxStyledTextCtrl, lowerCase, 0}}, + {3234, {wxStyledTextCtrl, upperCase, 0}}, + {3235, {wxStyledTextCtrl, lineScrollDown, 0}}, + {3236, {wxStyledTextCtrl, lineScrollUp, 0}}, + {3237, {wxStyledTextCtrl, deleteBackNotLine, 0}}, + {3238, {wxStyledTextCtrl, homeDisplay, 0}}, + {3239, {wxStyledTextCtrl, homeDisplayExtend, 0}}, + {3240, {wxStyledTextCtrl, lineEndDisplay, 0}}, + {3241, {wxStyledTextCtrl, lineEndDisplayExtend, 0}}, + {3242, {wxStyledTextCtrl, homeWrapExtend, 0}}, + {3243, {wxStyledTextCtrl, lineEndWrap, 0}}, + {3244, {wxStyledTextCtrl, lineEndWrapExtend, 0}}, + {3245, {wxStyledTextCtrl, vCHomeWrap, 0}}, + {3246, {wxStyledTextCtrl, vCHomeWrapExtend, 0}}, + {3247, {wxStyledTextCtrl, lineCopy, 0}}, + {3248, {wxStyledTextCtrl, moveCaretInsideView, 0}}, + {3249, {wxStyledTextCtrl, lineLength, 1}}, + {3250, {wxStyledTextCtrl, braceHighlight, 2}}, + {3251, {wxStyledTextCtrl, braceBadLight, 1}}, + {3252, {wxStyledTextCtrl, braceMatch, 1}}, + {3253, {wxStyledTextCtrl, getViewEOL, 0}}, + {3254, {wxStyledTextCtrl, setViewEOL, 1}}, + {3255, {wxStyledTextCtrl, setModEventMask, 1}}, + {3256, {wxStyledTextCtrl, getEdgeColumn, 0}}, + {3257, {wxStyledTextCtrl, setEdgeColumn, 1}}, + {3258, {wxStyledTextCtrl, getEdgeMode, 0}}, + {3259, {wxStyledTextCtrl, getEdgeColour, 0}}, + {3260, {wxStyledTextCtrl, setEdgeColour, 1}}, + {3261, {wxStyledTextCtrl, searchAnchor, 0}}, + {3262, {wxStyledTextCtrl, searchNext, 2}}, + {3263, {wxStyledTextCtrl, searchPrev, 2}}, + {3264, {wxStyledTextCtrl, linesOnScreen, 0}}, + {3265, {wxStyledTextCtrl, usePopUp, 1}}, + {3266, {wxStyledTextCtrl, selectionIsRectangle, 0}}, + {3267, {wxStyledTextCtrl, setZoom, 1}}, + {3268, {wxStyledTextCtrl, getZoom, 0}}, + {3269, {wxStyledTextCtrl, getModEventMask, 0}}, + {3270, {wxStyledTextCtrl, setSTCFocus, 1}}, + {3271, {wxStyledTextCtrl, getSTCFocus, 0}}, + {3272, {wxStyledTextCtrl, setStatus, 1}}, + {3273, {wxStyledTextCtrl, getStatus, 0}}, + {3274, {wxStyledTextCtrl, setMouseDownCaptures, 1}}, + {3275, {wxStyledTextCtrl, getMouseDownCaptures, 0}}, + {3276, {wxStyledTextCtrl, setSTCCursor, 1}}, + {3277, {wxStyledTextCtrl, getSTCCursor, 0}}, + {3278, {wxStyledTextCtrl, setControlCharSymbol, 1}}, + {3279, {wxStyledTextCtrl, getControlCharSymbol, 0}}, + {3280, {wxStyledTextCtrl, wordPartLeft, 0}}, + {3281, {wxStyledTextCtrl, wordPartLeftExtend, 0}}, + {3282, {wxStyledTextCtrl, wordPartRight, 0}}, + {3283, {wxStyledTextCtrl, wordPartRightExtend, 0}}, + {3284, {wxStyledTextCtrl, setVisiblePolicy, 2}}, + {3285, {wxStyledTextCtrl, delLineLeft, 0}}, + {3286, {wxStyledTextCtrl, delLineRight, 0}}, + {3287, {wxStyledTextCtrl, getXOffset, 0}}, + {3288, {wxStyledTextCtrl, chooseCaretX, 0}}, + {3289, {wxStyledTextCtrl, setXCaretPolicy, 2}}, + {3290, {wxStyledTextCtrl, setYCaretPolicy, 2}}, + {3291, {wxStyledTextCtrl, getPrintWrapMode, 0}}, + {3292, {wxStyledTextCtrl, setHotspotActiveForeground, 2}}, + {3293, {wxStyledTextCtrl, setHotspotActiveBackground, 2}}, + {3294, {wxStyledTextCtrl, setHotspotActiveUnderline, 1}}, + {3295, {wxStyledTextCtrl, setHotspotSingleLine, 1}}, + {3296, {wxStyledTextCtrl, paraDownExtend, 0}}, + {3297, {wxStyledTextCtrl, paraUp, 0}}, + {3298, {wxStyledTextCtrl, paraUpExtend, 0}}, + {3299, {wxStyledTextCtrl, positionBefore, 1}}, + {3300, {wxStyledTextCtrl, positionAfter, 1}}, + {3301, {wxStyledTextCtrl, copyRange, 2}}, + {3302, {wxStyledTextCtrl, copyText, 2}}, + {3303, {wxStyledTextCtrl, setSelectionMode, 1}}, + {3304, {wxStyledTextCtrl, getSelectionMode, 0}}, + {3305, {wxStyledTextCtrl, lineDownRectExtend, 0}}, + {3306, {wxStyledTextCtrl, lineUpRectExtend, 0}}, + {3307, {wxStyledTextCtrl, charLeftRectExtend, 0}}, + {3308, {wxStyledTextCtrl, charRightRectExtend, 0}}, + {3309, {wxStyledTextCtrl, homeRectExtend, 0}}, + {3310, {wxStyledTextCtrl, vCHomeRectExtend, 0}}, + {3311, {wxStyledTextCtrl, lineEndRectExtend, 0}}, + {3312, {wxStyledTextCtrl, pageUpRectExtend, 0}}, + {3313, {wxStyledTextCtrl, pageDownRectExtend, 0}}, + {3314, {wxStyledTextCtrl, stutteredPageUp, 0}}, + {3315, {wxStyledTextCtrl, stutteredPageUpExtend, 0}}, + {3316, {wxStyledTextCtrl, stutteredPageDown, 0}}, + {3317, {wxStyledTextCtrl, stutteredPageDownExtend, 0}}, + {3318, {wxStyledTextCtrl, wordLeftEnd, 0}}, + {3319, {wxStyledTextCtrl, wordLeftEndExtend, 0}}, + {3320, {wxStyledTextCtrl, wordRightEnd, 0}}, + {3321, {wxStyledTextCtrl, wordRightEndExtend, 0}}, + {3322, {wxStyledTextCtrl, setWhitespaceChars, 1}}, + {3323, {wxStyledTextCtrl, setCharsDefault, 0}}, + {3324, {wxStyledTextCtrl, autoCompGetCurrent, 0}}, + {3325, {wxStyledTextCtrl, allocate, 1}}, + {3326, {wxStyledTextCtrl, findColumn, 2}}, + {3327, {wxStyledTextCtrl, getCaretSticky, 0}}, + {3328, {wxStyledTextCtrl, setCaretSticky, 1}}, + {3329, {wxStyledTextCtrl, toggleCaretSticky, 0}}, + {3330, {wxStyledTextCtrl, setPasteConvertEndings, 1}}, + {3331, {wxStyledTextCtrl, getPasteConvertEndings, 0}}, + {3332, {wxStyledTextCtrl, selectionDuplicate, 0}}, + {3333, {wxStyledTextCtrl, setCaretLineBackAlpha, 1}}, + {3334, {wxStyledTextCtrl, getCaretLineBackAlpha, 0}}, + {3335, {wxStyledTextCtrl, startRecord, 0}}, + {3336, {wxStyledTextCtrl, stopRecord, 0}}, + {3337, {wxStyledTextCtrl, setLexer, 1}}, + {3338, {wxStyledTextCtrl, getLexer, 0}}, + {3339, {wxStyledTextCtrl, colourise, 2}}, + {3340, {wxStyledTextCtrl, setProperty, 2}}, + {3341, {wxStyledTextCtrl, setKeyWords, 2}}, + {3342, {wxStyledTextCtrl, setLexerLanguage, 1}}, + {3343, {wxStyledTextCtrl, getProperty, 1}}, + {3344, {wxStyledTextCtrl, getStyleBitsNeeded, 0}}, + {3345, {wxStyledTextCtrl, getCurrentLine, 0}}, + {3346, {wxStyledTextCtrl, styleSetSpec, 2}}, + {3347, {wxStyledTextCtrl, styleSetFont, 2}}, + {3348, {wxStyledTextCtrl, styleSetFontAttr, 7}}, + {3349, {wxStyledTextCtrl, styleSetCharacterSet, 2}}, + {3350, {wxStyledTextCtrl, styleSetFontEncoding, 2}}, + {3351, {wxStyledTextCtrl, cmdKeyExecute, 1}}, + {3352, {wxStyledTextCtrl, setMargins, 2}}, + {3353, {wxStyledTextCtrl, getSelection, 2}}, + {3354, {wxStyledTextCtrl, pointFromPosition, 1}}, + {3355, {wxStyledTextCtrl, scrollToLine, 1}}, + {3356, {wxStyledTextCtrl, scrollToColumn, 1}}, + {3357, {wxStyledTextCtrl, sendMsg, 2}}, + {3358, {wxStyledTextCtrl, setVScrollBar, 1}}, + {3359, {wxStyledTextCtrl, setHScrollBar, 1}}, + {3360, {wxStyledTextCtrl, getLastKeydownProcessed, 0}}, + {3361, {wxStyledTextCtrl, setLastKeydownProcessed, 1}}, + {3362, {wxStyledTextCtrl, saveFile, 1}}, + {3363, {wxStyledTextCtrl, loadFile, 1}}, + {3364, {wxStyledTextCtrl, doDragOver, 3}}, + {3365, {wxStyledTextCtrl, doDropText, 3}}, + {3366, {wxStyledTextCtrl, getUseAntiAliasing, 0}}, + {3367, {wxStyledTextCtrl, addTextRaw, 1}}, + {3368, {wxStyledTextCtrl, insertTextRaw, 2}}, + {3369, {wxStyledTextCtrl, getCurLineRaw, 1}}, + {3370, {wxStyledTextCtrl, getLineRaw, 1}}, + {3371, {wxStyledTextCtrl, getSelectedTextRaw, 0}}, + {3372, {wxStyledTextCtrl, getTextRangeRaw, 2}}, + {3373, {wxStyledTextCtrl, setTextRaw, 1}}, + {3374, {wxStyledTextCtrl, getTextRaw, 0}}, + {3375, {wxStyledTextCtrl, appendTextRaw, 1}}, + {3376, {wxArtProvider, getBitmap, 2}}, + {3377, {wxArtProvider, getIcon, 2}}, + {3378, {wxTreeEvent, getKeyCode, 0}}, + {3379, {wxTreeEvent, getItem, 0}}, + {3380, {wxTreeEvent, getKeyEvent, 0}}, + {3381, {wxTreeEvent, getLabel, 0}}, + {3382, {wxTreeEvent, getOldItem, 0}}, + {3383, {wxTreeEvent, getPoint, 0}}, + {3384, {wxTreeEvent, isEditCancelled, 0}}, + {3385, {wxTreeEvent, setToolTip, 1}}, + {3386, {wxNotebookEvent, getOldSelection, 0}}, + {3387, {wxNotebookEvent, getSelection, 0}}, + {3388, {wxNotebookEvent, setOldSelection, 1}}, + {3389, {wxNotebookEvent, setSelection, 1}}, + {3390, {wxFileDataObject, new, 0}}, + {3391, {wxFileDataObject, addFile, 1}}, + {3392, {wxFileDataObject, getFilenames, 0}}, + {3393, {wxFileDataObject, 'Destroy', undefined}}, + {3394, {wxTextDataObject, new, 1}}, + {3395, {wxTextDataObject, getTextLength, 0}}, + {3396, {wxTextDataObject, getText, 0}}, + {3397, {wxTextDataObject, setText, 1}}, + {3398, {wxTextDataObject, 'Destroy', undefined}}, + {3399, {wxBitmapDataObject, new_1_1, 1}}, + {3400, {wxBitmapDataObject, new_1_0, 1}}, + {3401, {wxBitmapDataObject, getBitmap, 0}}, + {3402, {wxBitmapDataObject, setBitmap, 1}}, + {3403, {wxBitmapDataObject, 'Destroy', undefined}}, + {3405, {wxClipboard, new, 0}}, + {3406, {wxClipboard, destruct, 0}}, + {3407, {wxClipboard, addData, 1}}, + {3408, {wxClipboard, clear, 0}}, + {3409, {wxClipboard, close, 0}}, + {3410, {wxClipboard, flush, 0}}, + {3411, {wxClipboard, getData, 1}}, + {3412, {wxClipboard, isOpened, 0}}, + {3413, {wxClipboard, open, 0}}, + {3414, {wxClipboard, setData, 1}}, + {3416, {wxClipboard, usePrimarySelection, 1}}, + {3417, {wxClipboard, isSupported, 1}}, + {3418, {wxClipboard, get, 0}}, + {3419, {wxSpinEvent, getPosition, 0}}, + {3420, {wxSpinEvent, setPosition, 1}}, + {3421, {wxSplitterWindow, new_0, 0}}, + {3422, {wxSplitterWindow, new_2, 2}}, + {3423, {wxSplitterWindow, destruct, 0}}, + {3424, {wxSplitterWindow, create, 2}}, + {3425, {wxSplitterWindow, getMinimumPaneSize, 0}}, + {3426, {wxSplitterWindow, getSashGravity, 0}}, + {3427, {wxSplitterWindow, getSashPosition, 0}}, + {3428, {wxSplitterWindow, getSplitMode, 0}}, + {3429, {wxSplitterWindow, getWindow1, 0}}, + {3430, {wxSplitterWindow, getWindow2, 0}}, + {3431, {wxSplitterWindow, initialize, 1}}, + {3432, {wxSplitterWindow, isSplit, 0}}, + {3433, {wxSplitterWindow, replaceWindow, 2}}, + {3434, {wxSplitterWindow, setSashGravity, 1}}, + {3435, {wxSplitterWindow, setSashPosition, 2}}, + {3436, {wxSplitterWindow, setSashSize, 1}}, + {3437, {wxSplitterWindow, setMinimumPaneSize, 1}}, + {3438, {wxSplitterWindow, setSplitMode, 1}}, + {3439, {wxSplitterWindow, splitHorizontally, 3}}, + {3440, {wxSplitterWindow, splitVertically, 3}}, + {3441, {wxSplitterWindow, unsplit, 1}}, + {3442, {wxSplitterWindow, updateSize, 0}}, + {3443, {wxSplitterEvent, getSashPosition, 0}}, + {3444, {wxSplitterEvent, getX, 0}}, + {3445, {wxSplitterEvent, getY, 0}}, + {3446, {wxSplitterEvent, getWindowBeingRemoved, 0}}, + {3447, {wxSplitterEvent, setSashPosition, 1}}, + {3448, {wxHtmlWindow, new_0, 0}}, + {3449, {wxHtmlWindow, new_2, 2}}, + {3450, {wxHtmlWindow, appendToPage, 1}}, + {3451, {wxHtmlWindow, getOpenedAnchor, 0}}, + {3452, {wxHtmlWindow, getOpenedPage, 0}}, + {3453, {wxHtmlWindow, getOpenedPageTitle, 0}}, + {3454, {wxHtmlWindow, getRelatedFrame, 0}}, + {3455, {wxHtmlWindow, historyBack, 0}}, + {3456, {wxHtmlWindow, historyCanBack, 0}}, + {3457, {wxHtmlWindow, historyCanForward, 0}}, + {3458, {wxHtmlWindow, historyClear, 0}}, + {3459, {wxHtmlWindow, historyForward, 0}}, + {3460, {wxHtmlWindow, loadFile, 1}}, + {3461, {wxHtmlWindow, loadPage, 1}}, + {3462, {wxHtmlWindow, selectAll, 0}}, + {3463, {wxHtmlWindow, selectionToText, 0}}, + {3464, {wxHtmlWindow, selectLine, 1}}, + {3465, {wxHtmlWindow, selectWord, 1}}, + {3466, {wxHtmlWindow, setBorders, 1}}, + {3467, {wxHtmlWindow, setFonts, 3}}, + {3468, {wxHtmlWindow, setPage, 1}}, + {3469, {wxHtmlWindow, setRelatedFrame, 2}}, + {3470, {wxHtmlWindow, setRelatedStatusBar, 1}}, + {3471, {wxHtmlWindow, toText, 0}}, + {3472, {wxHtmlWindow, 'Destroy', undefined}}, + {3473, {wxHtmlLinkEvent, getLinkInfo, 0}}, + {3474, {wxAuiNotebookEvent, setSelection, 1}}, + {3475, {wxAuiNotebookEvent, getSelection, 0}}, + {3476, {wxAuiNotebookEvent, setOldSelection, 1}}, + {3477, {wxAuiNotebookEvent, getOldSelection, 0}}, + {3478, {wxAuiNotebookEvent, setDragSource, 1}}, + {3479, {wxAuiNotebookEvent, getDragSource, 0}}, + {3480, {wxAuiManagerEvent, setManager, 1}}, + {3481, {wxAuiManagerEvent, getManager, 0}}, + {3482, {wxAuiManagerEvent, setPane, 1}}, + {3483, {wxAuiManagerEvent, getPane, 0}}, + {3484, {wxAuiManagerEvent, setButton, 1}}, + {3485, {wxAuiManagerEvent, getButton, 0}}, + {3486, {wxAuiManagerEvent, setDC, 1}}, + {3487, {wxAuiManagerEvent, getDC, 0}}, + {3488, {wxAuiManagerEvent, veto, 1}}, + {3489, {wxAuiManagerEvent, getVeto, 0}}, + {3490, {wxAuiManagerEvent, setCanVeto, 1}}, + {3491, {wxAuiManagerEvent, canVeto, 0}}, + {3492, {wxLogNull, new, 0}}, + {3493, {wxLogNull, 'Destroy', undefined}}, {-1, {mod, func, -1}} ]. diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxe_funcs.hrl erlang-13.b.3-dfsg/lib/wx/src/gen/wxe_funcs.hrl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxe_funcs.hrl 2009-06-05 13:54:33.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxe_funcs.hrl 2009-11-20 13:34:40.000000000 +0000 @@ -461,2732 +461,2813 @@ -define(wxGrid_YToRow, 557). -define(wxGridCellRenderer_Draw, 558). -define(wxGridCellRenderer_GetBestSize, 559). --define(wxGridCellEditor_IsCreated, 560). --define(wxGridCellEditor_SetSize, 561). --define(wxGridCellEditor_Show, 562). --define(wxGridCellEditor_PaintBackground, 563). --define(wxGridCellEditor_BeginEdit, 564). --define(wxGridCellEditor_EndEdit, 565). --define(wxGridCellEditor_Reset, 566). --define(wxGridCellEditor_StartingKey, 567). --define(wxGridCellEditor_StartingClick, 568). --define(wxGridCellEditor_HandleReturn, 569). --define(wxGridCellAttr_SetTextColour, 570). --define(wxGridCellAttr_SetBackgroundColour, 571). --define(wxGridCellAttr_SetFont, 572). --define(wxGridCellAttr_SetAlignment, 573). --define(wxGridCellAttr_SetReadOnly, 574). --define(wxGridCellAttr_SetRenderer, 575). --define(wxGridCellAttr_SetEditor, 576). --define(wxGridCellAttr_HasTextColour, 577). --define(wxGridCellAttr_HasBackgroundColour, 578). --define(wxGridCellAttr_HasFont, 579). --define(wxGridCellAttr_HasAlignment, 580). --define(wxGridCellAttr_HasRenderer, 581). --define(wxGridCellAttr_HasEditor, 582). --define(wxGridCellAttr_GetTextColour, 583). --define(wxGridCellAttr_GetBackgroundColour, 584). --define(wxGridCellAttr_GetFont, 585). --define(wxGridCellAttr_GetAlignment, 586). --define(wxGridCellAttr_GetRenderer, 587). --define(wxGridCellAttr_GetEditor, 588). --define(wxGridCellAttr_IsReadOnly, 589). --define(wxGridCellAttr_SetDefAttr, 590). --define(wxDC_Blit, 591). --define(wxDC_CalcBoundingBox, 592). --define(wxDC_Clear, 593). --define(wxDC_ComputeScaleAndOrigin, 594). --define(wxDC_CrossHair, 595). --define(wxDC_DestroyClippingRegion, 596). --define(wxDC_DeviceToLogicalX, 597). --define(wxDC_DeviceToLogicalXRel, 598). --define(wxDC_DeviceToLogicalY, 599). --define(wxDC_DeviceToLogicalYRel, 600). --define(wxDC_DrawArc, 601). --define(wxDC_DrawBitmap, 602). --define(wxDC_DrawCheckMark, 603). --define(wxDC_DrawCircle, 604). --define(wxDC_DrawEllipse_2, 606). --define(wxDC_DrawEllipse_1, 607). --define(wxDC_DrawEllipticArc, 608). --define(wxDC_DrawIcon, 609). --define(wxDC_DrawLabel, 610). --define(wxDC_DrawLine, 611). --define(wxDC_DrawLines, 612). --define(wxDC_DrawPolygon, 614). --define(wxDC_DrawPoint, 616). --define(wxDC_DrawRectangle_2, 618). --define(wxDC_DrawRectangle_1, 619). --define(wxDC_DrawRotatedText, 620). --define(wxDC_DrawRoundedRectangle_3, 622). --define(wxDC_DrawRoundedRectangle_2, 623). --define(wxDC_DrawText, 624). --define(wxDC_EndDoc, 625). --define(wxDC_EndPage, 626). --define(wxDC_FloodFill, 627). --define(wxDC_GetBackground, 628). --define(wxDC_GetBackgroundMode, 629). --define(wxDC_GetBrush, 630). --define(wxDC_GetCharHeight, 631). --define(wxDC_GetCharWidth, 632). --define(wxDC_GetClippingBox, 633). --define(wxDC_GetFont, 634). --define(wxDC_GetLayoutDirection, 635). --define(wxDC_GetLogicalFunction, 636). --define(wxDC_GetMapMode, 637). --define(wxDC_GetMultiLineTextExtent_4, 638). --define(wxDC_GetMultiLineTextExtent_1, 639). --define(wxDC_GetPartialTextExtents, 640). --define(wxDC_GetPen, 641). --define(wxDC_GetPixel, 642). --define(wxDC_GetPPI, 643). --define(wxDC_GetSize, 645). --define(wxDC_GetSizeMM, 647). --define(wxDC_GetTextBackground, 648). --define(wxDC_GetTextExtent_4, 649). --define(wxDC_GetTextExtent_1, 650). --define(wxDC_GetTextForeground, 652). --define(wxDC_GetUserScale, 653). --define(wxDC_GradientFillConcentric_3, 654). --define(wxDC_GradientFillConcentric_4, 655). --define(wxDC_GradientFillLinear, 656). --define(wxDC_LogicalToDeviceX, 657). --define(wxDC_LogicalToDeviceXRel, 658). --define(wxDC_LogicalToDeviceY, 659). --define(wxDC_LogicalToDeviceYRel, 660). --define(wxDC_MaxX, 661). --define(wxDC_MaxY, 662). --define(wxDC_MinX, 663). --define(wxDC_MinY, 664). --define(wxDC_IsOk, 665). --define(wxDC_ResetBoundingBox, 666). --define(wxDC_SetAxisOrientation, 667). --define(wxDC_SetBackground, 668). --define(wxDC_SetBackgroundMode, 669). --define(wxDC_SetBrush, 670). --define(wxDC_SetClippingRegion_2, 672). --define(wxDC_SetClippingRegion_1_1, 673). --define(wxDC_SetClippingRegion_1_0, 674). --define(wxDC_SetDeviceOrigin, 675). --define(wxDC_SetFont, 676). --define(wxDC_SetLayoutDirection, 677). --define(wxDC_SetLogicalFunction, 678). --define(wxDC_SetMapMode, 679). --define(wxDC_SetPalette, 680). --define(wxDC_SetPen, 681). --define(wxDC_SetTextBackground, 682). --define(wxDC_SetTextForeground, 683). --define(wxDC_SetUserScale, 684). --define(wxDC_StartDoc, 685). --define(wxDC_StartPage, 686). --define(wxMirrorDC_new, 687). --define(wxMirrorDC_destroy, 688). --define(wxScreenDC_new, 689). --define(wxScreenDC_destruct, 690). --define(wxPostScriptDC_new_0, 691). --define(wxPostScriptDC_new_1, 692). --define(wxPostScriptDC_destruct, 693). --define(wxPostScriptDC_SetResolution, 694). --define(wxPostScriptDC_GetResolution, 695). --define(wxWindowDC_new_0, 696). --define(wxWindowDC_new_1, 697). --define(wxWindowDC_destruct, 698). --define(wxClientDC_new_0, 699). --define(wxClientDC_new_1, 700). --define(wxClientDC_destroy, 701). --define(wxPaintDC_new_0, 702). --define(wxPaintDC_new_1, 703). --define(wxPaintDC_destroy, 704). --define(wxMemoryDC_new_1_0, 706). --define(wxMemoryDC_new_1_1, 707). --define(wxMemoryDC_new_0, 708). --define(wxMemoryDC_destruct, 710). --define(wxMemoryDC_SelectObject, 711). --define(wxMemoryDC_SelectObjectAsSource, 712). --define(wxBufferedDC_new_0, 713). --define(wxBufferedDC_new_2, 714). --define(wxBufferedDC_new_3, 715). --define(wxBufferedDC_destruct, 716). --define(wxBufferedDC_Init_2, 717). --define(wxBufferedDC_Init_3, 718). --define(wxBufferedPaintDC_new_3, 719). --define(wxBufferedPaintDC_new_2, 720). --define(wxBufferedPaintDC_destruct, 721). --define(wxGraphicsObject_GetRenderer, 722). --define(wxGraphicsObject_IsNull, 723). --define(wxGraphicsContext_Create_1_1, 724). --define(wxGraphicsContext_Create_1_0, 725). --define(wxGraphicsContext_Create_0, 726). --define(wxGraphicsContext_CreatePen, 727). --define(wxGraphicsContext_CreateBrush, 728). --define(wxGraphicsContext_CreateRadialGradientBrush, 729). --define(wxGraphicsContext_CreateLinearGradientBrush, 730). --define(wxGraphicsContext_CreateFont, 731). --define(wxGraphicsContext_CreateMatrix, 732). --define(wxGraphicsContext_CreatePath, 733). --define(wxGraphicsContext_Clip_1, 734). --define(wxGraphicsContext_Clip_4, 735). --define(wxGraphicsContext_ResetClip, 736). --define(wxGraphicsContext_DrawBitmap, 737). --define(wxGraphicsContext_DrawEllipse, 738). --define(wxGraphicsContext_DrawIcon, 739). --define(wxGraphicsContext_DrawLines, 740). --define(wxGraphicsContext_DrawPath, 741). --define(wxGraphicsContext_DrawRectangle, 742). --define(wxGraphicsContext_DrawRoundedRectangle, 743). --define(wxGraphicsContext_DrawText_3, 744). --define(wxGraphicsContext_DrawText_4_0, 745). --define(wxGraphicsContext_DrawText_4_1, 746). --define(wxGraphicsContext_DrawText_5, 747). --define(wxGraphicsContext_FillPath, 748). --define(wxGraphicsContext_StrokePath, 749). --define(wxGraphicsContext_GetNativeContext, 750). --define(wxGraphicsContext_GetPartialTextExtents, 751). --define(wxGraphicsContext_GetTextExtent, 752). --define(wxGraphicsContext_Rotate, 753). --define(wxGraphicsContext_Scale, 754). --define(wxGraphicsContext_Translate, 755). --define(wxGraphicsContext_GetTransform, 756). --define(wxGraphicsContext_SetTransform, 757). --define(wxGraphicsContext_ConcatTransform, 758). --define(wxGraphicsContext_SetBrush_1_1, 759). --define(wxGraphicsContext_SetBrush_1_0, 760). --define(wxGraphicsContext_SetFont_1, 761). --define(wxGraphicsContext_SetFont_2, 762). --define(wxGraphicsContext_SetPen_1_0, 763). --define(wxGraphicsContext_SetPen_1_1, 764). --define(wxGraphicsContext_StrokeLine, 765). --define(wxGraphicsContext_StrokeLines_2, 766). --define(wxGraphicsContext_StrokeLines_3, 767). --define(wxGraphicsMatrix_Concat, 768). --define(wxGraphicsMatrix_Get, 770). --define(wxGraphicsMatrix_GetNativeMatrix, 771). --define(wxGraphicsMatrix_Invert, 772). --define(wxGraphicsMatrix_IsEqual, 773). --define(wxGraphicsMatrix_IsIdentity, 775). --define(wxGraphicsMatrix_Rotate, 776). --define(wxGraphicsMatrix_Scale, 777). --define(wxGraphicsMatrix_Translate, 778). --define(wxGraphicsMatrix_Set, 779). --define(wxGraphicsMatrix_TransformPoint, 780). --define(wxGraphicsMatrix_TransformDistance, 781). --define(wxGraphicsPath_MoveToPoint_2, 782). --define(wxGraphicsPath_MoveToPoint_1, 783). --define(wxGraphicsPath_AddArc_6, 784). --define(wxGraphicsPath_AddArc_5, 785). --define(wxGraphicsPath_AddArcToPoint, 786). --define(wxGraphicsPath_AddCircle, 787). --define(wxGraphicsPath_AddCurveToPoint_6, 788). --define(wxGraphicsPath_AddCurveToPoint_3, 789). --define(wxGraphicsPath_AddEllipse, 790). --define(wxGraphicsPath_AddLineToPoint_2, 791). --define(wxGraphicsPath_AddLineToPoint_1, 792). --define(wxGraphicsPath_AddPath, 793). --define(wxGraphicsPath_AddQuadCurveToPoint, 794). --define(wxGraphicsPath_AddRectangle, 795). --define(wxGraphicsPath_AddRoundedRectangle, 796). --define(wxGraphicsPath_CloseSubpath, 797). --define(wxGraphicsPath_Contains_3, 798). --define(wxGraphicsPath_Contains_2, 799). --define(wxGraphicsPath_GetBox, 801). --define(wxGraphicsPath_GetCurrentPoint, 803). --define(wxGraphicsPath_Transform, 804). --define(wxGraphicsRenderer_GetDefaultRenderer, 805). --define(wxGraphicsRenderer_CreateContext_1_1, 806). --define(wxGraphicsRenderer_CreateContext_1_0, 807). --define(wxGraphicsRenderer_CreatePen, 808). --define(wxGraphicsRenderer_CreateBrush, 809). --define(wxGraphicsRenderer_CreateLinearGradientBrush, 810). --define(wxGraphicsRenderer_CreateRadialGradientBrush, 811). --define(wxGraphicsRenderer_CreateFont, 812). --define(wxGraphicsRenderer_CreateMatrix, 813). --define(wxGraphicsRenderer_CreatePath, 814). --define(wxMenuBar_new_1, 816). --define(wxMenuBar_new_0, 818). --define(wxMenuBar_destruct, 820). --define(wxMenuBar_Append, 821). --define(wxMenuBar_Check, 822). --define(wxMenuBar_Enable_2, 823). --define(wxMenuBar_Enable_1, 824). --define(wxMenuBar_EnableTop, 825). --define(wxMenuBar_FindMenu, 826). --define(wxMenuBar_FindMenuItem, 827). --define(wxMenuBar_FindItem, 828). --define(wxMenuBar_GetHelpString, 829). --define(wxMenuBar_GetLabel_1, 830). --define(wxMenuBar_GetLabel_0, 831). --define(wxMenuBar_GetLabelTop, 832). --define(wxMenuBar_GetMenu, 833). --define(wxMenuBar_GetMenuCount, 834). --define(wxMenuBar_Insert, 835). --define(wxMenuBar_IsChecked, 836). --define(wxMenuBar_IsEnabled_1, 837). --define(wxMenuBar_IsEnabled_0, 838). --define(wxMenuBar_Remove, 839). --define(wxMenuBar_Replace, 840). --define(wxMenuBar_SetHelpString, 841). --define(wxMenuBar_SetLabel_2, 842). --define(wxMenuBar_SetLabel_1, 843). --define(wxMenuBar_SetLabelTop, 844). --define(wxControl_GetLabel, 845). --define(wxControl_SetLabel, 846). --define(wxControlWithItems_Append_1, 847). --define(wxControlWithItems_Append_2, 848). --define(wxControlWithItems_appendStrings_1, 849). --define(wxControlWithItems_Clear, 850). --define(wxControlWithItems_Delete, 851). --define(wxControlWithItems_FindString, 852). --define(wxControlWithItems_getClientData, 854). --define(wxControlWithItems_setClientData, 856). --define(wxControlWithItems_GetCount, 857). --define(wxControlWithItems_GetSelection, 858). --define(wxControlWithItems_GetString, 859). --define(wxControlWithItems_GetStringSelection, 860). --define(wxControlWithItems_Insert_2, 861). --define(wxControlWithItems_Insert_3, 862). --define(wxControlWithItems_IsEmpty, 863). --define(wxControlWithItems_Select, 864). --define(wxControlWithItems_SetSelection, 865). --define(wxControlWithItems_SetString, 866). --define(wxControlWithItems_SetStringSelection, 867). --define(wxMenu_new_2, 870). --define(wxMenu_new_1, 871). --define(wxMenu_destruct, 873). --define(wxMenu_Append_3, 874). --define(wxMenu_Append_1, 875). --define(wxMenu_Append_4_0, 876). --define(wxMenu_Append_4_1, 877). --define(wxMenu_AppendCheckItem, 878). --define(wxMenu_AppendRadioItem, 879). --define(wxMenu_AppendSeparator, 880). --define(wxMenu_Break, 881). --define(wxMenu_Check, 882). --define(wxMenu_Delete_1_0, 883). --define(wxMenu_Delete_1_1, 884). --define(wxMenu_Destroy_1_0, 885). --define(wxMenu_Destroy_1_1, 886). --define(wxMenu_Enable, 887). --define(wxMenu_FindItem_1, 888). --define(wxMenu_FindItem_2, 889). --define(wxMenu_FindItemByPosition, 890). --define(wxMenu_GetHelpString, 891). --define(wxMenu_GetLabel, 892). --define(wxMenu_GetMenuItemCount, 893). --define(wxMenu_GetMenuItems, 894). --define(wxMenu_GetTitle, 896). --define(wxMenu_Insert_2, 897). --define(wxMenu_Insert_3, 898). --define(wxMenu_Insert_5_1, 899). --define(wxMenu_Insert_5_0, 900). --define(wxMenu_InsertCheckItem, 901). --define(wxMenu_InsertRadioItem, 902). --define(wxMenu_InsertSeparator, 903). --define(wxMenu_IsChecked, 904). --define(wxMenu_IsEnabled, 905). --define(wxMenu_Prepend_1, 906). --define(wxMenu_Prepend_2, 907). --define(wxMenu_Prepend_4_1, 908). --define(wxMenu_Prepend_4_0, 909). --define(wxMenu_PrependCheckItem, 910). --define(wxMenu_PrependRadioItem, 911). --define(wxMenu_PrependSeparator, 912). --define(wxMenu_Remove_1_0, 913). --define(wxMenu_Remove_1_1, 914). --define(wxMenu_SetHelpString, 915). --define(wxMenu_SetLabel, 916). --define(wxMenu_SetTitle, 917). --define(wxMenuItem_new, 918). --define(wxMenuItem_destruct, 920). --define(wxMenuItem_Check, 921). --define(wxMenuItem_Enable, 922). --define(wxMenuItem_GetBitmap, 923). --define(wxMenuItem_GetHelp, 924). --define(wxMenuItem_GetId, 925). --define(wxMenuItem_GetKind, 926). --define(wxMenuItem_GetLabel, 927). --define(wxMenuItem_GetLabelFromText, 928). --define(wxMenuItem_GetMenu, 929). --define(wxMenuItem_GetText, 930). --define(wxMenuItem_GetSubMenu, 931). --define(wxMenuItem_IsCheckable, 932). --define(wxMenuItem_IsChecked, 933). --define(wxMenuItem_IsEnabled, 934). --define(wxMenuItem_IsSeparator, 935). --define(wxMenuItem_IsSubMenu, 936). --define(wxMenuItem_SetBitmap, 937). --define(wxMenuItem_SetHelp, 938). --define(wxMenuItem_SetMenu, 939). --define(wxMenuItem_SetSubMenu, 940). --define(wxMenuItem_SetText, 941). --define(wxToolBar_AddControl, 942). --define(wxToolBar_AddSeparator, 943). --define(wxToolBar_AddTool_5, 944). --define(wxToolBar_AddTool_4_0, 945). --define(wxToolBar_AddTool_1, 946). --define(wxToolBar_AddTool_4_1, 947). --define(wxToolBar_AddTool_3, 948). --define(wxToolBar_AddTool_6, 949). --define(wxToolBar_AddCheckTool, 950). --define(wxToolBar_AddRadioTool, 951). --define(wxToolBar_DeleteTool, 952). --define(wxToolBar_DeleteToolByPos, 953). --define(wxToolBar_EnableTool, 954). --define(wxToolBar_FindById, 955). --define(wxToolBar_FindControl, 956). --define(wxToolBar_FindToolForPosition, 957). --define(wxToolBar_GetToolSize, 958). --define(wxToolBar_GetToolBitmapSize, 959). --define(wxToolBar_GetMargins, 960). --define(wxToolBar_GetToolEnabled, 961). --define(wxToolBar_GetToolLongHelp, 962). --define(wxToolBar_GetToolPacking, 963). --define(wxToolBar_GetToolPos, 964). --define(wxToolBar_GetToolSeparation, 965). --define(wxToolBar_GetToolShortHelp, 966). --define(wxToolBar_GetToolState, 967). --define(wxToolBar_InsertControl, 968). --define(wxToolBar_InsertSeparator, 969). --define(wxToolBar_InsertTool_5, 970). --define(wxToolBar_InsertTool_2, 971). --define(wxToolBar_InsertTool_4, 972). --define(wxToolBar_Realize, 973). --define(wxToolBar_RemoveTool, 974). --define(wxToolBar_SetMargins, 975). --define(wxToolBar_SetToolBitmapSize, 976). --define(wxToolBar_SetToolLongHelp, 977). --define(wxToolBar_SetToolPacking, 978). --define(wxToolBar_SetToolShortHelp, 979). --define(wxToolBar_SetToolSeparation, 980). --define(wxToolBar_ToggleTool, 981). --define(wxStatusBar_new_0, 983). --define(wxStatusBar_new_2, 984). --define(wxStatusBar_destruct, 986). --define(wxStatusBar_Create, 987). --define(wxStatusBar_GetFieldRect, 988). --define(wxStatusBar_GetFieldsCount, 989). --define(wxStatusBar_GetStatusText, 990). --define(wxStatusBar_PopStatusText, 991). --define(wxStatusBar_PushStatusText, 992). --define(wxStatusBar_SetFieldsCount, 993). --define(wxStatusBar_SetMinHeight, 994). --define(wxStatusBar_SetStatusText, 995). --define(wxStatusBar_SetStatusWidths, 996). --define(wxStatusBar_SetStatusStyles, 997). --define(wxBitmap_new_0, 998). --define(wxBitmap_new_3, 999). --define(wxBitmap_new_4, 1000). --define(wxBitmap_new_2_0, 1001). --define(wxBitmap_new_2_1, 1002). --define(wxBitmap_destruct, 1003). --define(wxBitmap_ConvertToImage, 1004). --define(wxBitmap_CopyFromIcon, 1005). --define(wxBitmap_Create, 1006). --define(wxBitmap_GetDepth, 1007). --define(wxBitmap_GetHeight, 1008). --define(wxBitmap_GetPalette, 1009). --define(wxBitmap_GetMask, 1010). --define(wxBitmap_GetWidth, 1011). --define(wxBitmap_GetSubBitmap, 1012). --define(wxBitmap_LoadFile, 1013). --define(wxBitmap_Ok, 1014). --define(wxBitmap_SaveFile, 1015). --define(wxBitmap_SetDepth, 1016). --define(wxBitmap_SetHeight, 1017). --define(wxBitmap_SetMask, 1018). --define(wxBitmap_SetPalette, 1019). --define(wxBitmap_SetWidth, 1020). --define(wxIcon_new_0, 1021). --define(wxIcon_new_2, 1022). --define(wxIcon_new_1, 1023). --define(wxIcon_CopyFromBitmap, 1024). --define(wxIcon_destroy, 1025). --define(wxIconBundle_new_0, 1026). --define(wxIconBundle_new_2, 1027). --define(wxIconBundle_new_1_0, 1028). --define(wxIconBundle_new_1_1, 1029). --define(wxIconBundle_destruct, 1030). --define(wxIconBundle_AddIcon_2, 1031). --define(wxIconBundle_AddIcon_1, 1032). --define(wxIconBundle_GetIcon_1_1, 1033). --define(wxIconBundle_GetIcon_1_0, 1034). --define(wxCursor_new_0, 1035). --define(wxCursor_new_1_0, 1036). --define(wxCursor_new_1_1, 1037). --define(wxCursor_new_4, 1038). --define(wxCursor_destruct, 1039). --define(wxCursor_Ok, 1040). --define(wxMask_new_0, 1041). --define(wxMask_new_2_1, 1042). --define(wxMask_new_2_0, 1043). --define(wxMask_new_1, 1044). --define(wxMask_destruct, 1045). --define(wxMask_Create_2_1, 1046). --define(wxMask_Create_2_0, 1047). --define(wxMask_Create_1, 1048). --define(wxImage_new_0, 1049). --define(wxImage_new_3_0, 1050). --define(wxImage_new_4, 1051). --define(wxImage_new_5, 1052). --define(wxImage_new_2, 1053). --define(wxImage_new_3_1, 1054). --define(wxImage_Blur, 1055). --define(wxImage_BlurHorizontal, 1056). --define(wxImage_BlurVertical, 1057). --define(wxImage_ConvertAlphaToMask, 1058). --define(wxImage_ConvertToGreyscale, 1059). --define(wxImage_ConvertToMono, 1060). --define(wxImage_Copy, 1061). --define(wxImage_Create_3, 1062). --define(wxImage_Create_4, 1063). --define(wxImage_Create_5, 1064). --define(wxImage_Destroy, 1065). --define(wxImage_FindFirstUnusedColour, 1066). --define(wxImage_GetImageExtWildcard, 1067). --define(wxImage_GetAlpha_2, 1068). --define(wxImage_GetAlpha_0, 1069). --define(wxImage_GetBlue, 1070). --define(wxImage_GetData, 1071). --define(wxImage_GetGreen, 1072). --define(wxImage_GetImageCount, 1073). --define(wxImage_GetHeight, 1074). --define(wxImage_GetMaskBlue, 1075). --define(wxImage_GetMaskGreen, 1076). --define(wxImage_GetMaskRed, 1077). --define(wxImage_GetOrFindMaskColour, 1078). --define(wxImage_GetPalette, 1079). --define(wxImage_GetRed, 1080). --define(wxImage_GetSubImage, 1081). --define(wxImage_GetWidth, 1082). --define(wxImage_HasAlpha, 1083). --define(wxImage_HasMask, 1084). --define(wxImage_GetOption, 1085). --define(wxImage_GetOptionInt, 1086). --define(wxImage_HasOption, 1087). --define(wxImage_InitAlpha, 1088). --define(wxImage_InitStandardHandlers, 1089). --define(wxImage_IsTransparent, 1090). --define(wxImage_LoadFile_2, 1091). --define(wxImage_LoadFile_3, 1092). --define(wxImage_Ok, 1093). --define(wxImage_RemoveHandler, 1094). --define(wxImage_Mirror, 1095). --define(wxImage_Replace, 1096). --define(wxImage_Rescale, 1097). --define(wxImage_Resize, 1098). --define(wxImage_Rotate, 1099). --define(wxImage_RotateHue, 1100). --define(wxImage_Rotate90, 1101). --define(wxImage_SaveFile_1, 1102). --define(wxImage_SaveFile_2_0, 1103). --define(wxImage_SaveFile_2_1, 1104). --define(wxImage_Scale, 1105). --define(wxImage_Size, 1106). --define(wxImage_SetAlpha_3, 1107). --define(wxImage_SetAlpha_2, 1108). --define(wxImage_SetData_2, 1109). --define(wxImage_SetData_4, 1110). --define(wxImage_SetMask, 1111). --define(wxImage_SetMaskColour, 1112). --define(wxImage_SetMaskFromImage, 1113). --define(wxImage_SetOption_2_1, 1114). --define(wxImage_SetOption_2_0, 1115). --define(wxImage_SetPalette, 1116). --define(wxImage_SetRGB_5, 1117). --define(wxImage_SetRGB_4, 1118). --define(wxImage_destroy, 1119). --define(wxBrush_new_0, 1120). --define(wxBrush_new_2, 1121). --define(wxBrush_new_1, 1122). --define(wxBrush_destruct, 1124). --define(wxBrush_GetColour, 1125). --define(wxBrush_GetStipple, 1126). --define(wxBrush_GetStyle, 1127). --define(wxBrush_IsHatch, 1128). --define(wxBrush_IsOk, 1129). --define(wxBrush_SetColour_1, 1130). --define(wxBrush_SetColour_3, 1131). --define(wxBrush_SetStipple, 1132). --define(wxBrush_SetStyle, 1133). --define(wxPen_new_0, 1134). --define(wxPen_new_2, 1135). --define(wxPen_destruct, 1136). --define(wxPen_GetCap, 1137). --define(wxPen_GetColour, 1138). --define(wxPen_GetJoin, 1139). --define(wxPen_GetStyle, 1140). --define(wxPen_GetWidth, 1141). --define(wxPen_IsOk, 1142). --define(wxPen_SetCap, 1143). --define(wxPen_SetColour_1, 1144). --define(wxPen_SetColour_3, 1145). --define(wxPen_SetJoin, 1146). --define(wxPen_SetStyle, 1147). --define(wxPen_SetWidth, 1148). --define(wxRegion_new_0, 1149). --define(wxRegion_new_4, 1150). --define(wxRegion_new_2, 1151). --define(wxRegion_new_1_1, 1152). --define(wxRegion_new_1_0, 1154). --define(wxRegion_destruct, 1156). --define(wxRegion_Clear, 1157). --define(wxRegion_Contains_2, 1158). --define(wxRegion_Contains_1_0, 1159). --define(wxRegion_Contains_4, 1160). --define(wxRegion_Contains_1_1, 1161). --define(wxRegion_ConvertToBitmap, 1162). --define(wxRegion_GetBox, 1163). --define(wxRegion_Intersect_4, 1164). --define(wxRegion_Intersect_1_1, 1165). --define(wxRegion_Intersect_1_0, 1166). --define(wxRegion_IsEmpty, 1167). --define(wxRegion_Subtract_4, 1168). --define(wxRegion_Subtract_1_1, 1169). --define(wxRegion_Subtract_1_0, 1170). --define(wxRegion_Offset_2, 1171). --define(wxRegion_Offset_1, 1172). --define(wxRegion_Union_4, 1173). --define(wxRegion_Union_1_2, 1174). --define(wxRegion_Union_1_1, 1175). --define(wxRegion_Union_1_0, 1176). --define(wxRegion_Union_3, 1177). --define(wxRegion_Xor_4, 1178). --define(wxRegion_Xor_1_1, 1179). --define(wxRegion_Xor_1_0, 1180). --define(wxAcceleratorTable_new_0, 1181). --define(wxAcceleratorTable_new_2, 1182). --define(wxAcceleratorTable_destruct, 1183). --define(wxAcceleratorTable_Ok, 1184). --define(wxAcceleratorEntry_new_1_0, 1185). --define(wxAcceleratorEntry_new_1_1, 1186). --define(wxAcceleratorEntry_GetCommand, 1187). --define(wxAcceleratorEntry_GetFlags, 1188). --define(wxAcceleratorEntry_GetKeyCode, 1189). --define(wxAcceleratorEntry_Set, 1190). --define(wxAcceleratorEntry_destroy, 1191). --define(wxCaret_new_3, 1196). --define(wxCaret_new_2, 1197). --define(wxCaret_destruct, 1199). --define(wxCaret_Create_3, 1200). --define(wxCaret_Create_2, 1201). --define(wxCaret_GetBlinkTime, 1202). --define(wxCaret_GetPosition, 1204). --define(wxCaret_GetSize, 1206). --define(wxCaret_GetWindow, 1207). --define(wxCaret_Hide, 1208). --define(wxCaret_IsOk, 1209). --define(wxCaret_IsVisible, 1210). --define(wxCaret_Move_2, 1211). --define(wxCaret_Move_1, 1212). --define(wxCaret_SetBlinkTime, 1213). --define(wxCaret_SetSize_2, 1214). --define(wxCaret_SetSize_1, 1215). --define(wxCaret_Show, 1216). --define(wxSizer_Add_2_1, 1217). --define(wxSizer_Add_2_0, 1218). --define(wxSizer_Add_3, 1219). --define(wxSizer_Add_2_3, 1220). --define(wxSizer_Add_2_2, 1221). --define(wxSizer_AddSpacer, 1222). --define(wxSizer_AddStretchSpacer, 1223). --define(wxSizer_CalcMin, 1224). --define(wxSizer_Clear, 1225). --define(wxSizer_Detach_1_2, 1226). --define(wxSizer_Detach_1_1, 1227). --define(wxSizer_Detach_1_0, 1228). --define(wxSizer_Fit, 1229). --define(wxSizer_FitInside, 1230). --define(wxSizer_GetChildren, 1231). --define(wxSizer_GetItem_2_1, 1232). --define(wxSizer_GetItem_2_0, 1233). --define(wxSizer_GetItem_1, 1234). --define(wxSizer_GetSize, 1235). --define(wxSizer_GetPosition, 1236). --define(wxSizer_GetMinSize, 1237). --define(wxSizer_Hide_2_0, 1238). --define(wxSizer_Hide_2_1, 1239). --define(wxSizer_Hide_1, 1240). --define(wxSizer_Insert_3_1, 1241). --define(wxSizer_Insert_3_0, 1242). --define(wxSizer_Insert_4, 1243). --define(wxSizer_Insert_3_3, 1244). --define(wxSizer_Insert_3_2, 1245). --define(wxSizer_Insert_2, 1246). --define(wxSizer_InsertSpacer, 1247). --define(wxSizer_InsertStretchSpacer, 1248). --define(wxSizer_IsShown_1_2, 1249). --define(wxSizer_IsShown_1_1, 1250). --define(wxSizer_IsShown_1_0, 1251). --define(wxSizer_Layout, 1252). --define(wxSizer_Prepend_2_1, 1253). --define(wxSizer_Prepend_2_0, 1254). --define(wxSizer_Prepend_3, 1255). --define(wxSizer_Prepend_2_3, 1256). --define(wxSizer_Prepend_2_2, 1257). --define(wxSizer_Prepend_1, 1258). --define(wxSizer_PrependSpacer, 1259). --define(wxSizer_PrependStretchSpacer, 1260). --define(wxSizer_RecalcSizes, 1261). --define(wxSizer_Remove_1_1, 1262). --define(wxSizer_Remove_1_0, 1263). --define(wxSizer_Replace_3_1, 1264). --define(wxSizer_Replace_3_0, 1265). --define(wxSizer_Replace_2, 1266). --define(wxSizer_SetDimension, 1267). --define(wxSizer_SetMinSize_2, 1268). --define(wxSizer_SetMinSize_1, 1269). --define(wxSizer_SetItemMinSize_3_2, 1270). --define(wxSizer_SetItemMinSize_2_2, 1271). --define(wxSizer_SetItemMinSize_3_1, 1272). --define(wxSizer_SetItemMinSize_2_1, 1273). --define(wxSizer_SetItemMinSize_3_0, 1274). --define(wxSizer_SetItemMinSize_2_0, 1275). --define(wxSizer_SetSizeHints, 1276). --define(wxSizer_SetVirtualSizeHints, 1277). --define(wxSizer_Show_2_2, 1278). --define(wxSizer_Show_2_1, 1279). --define(wxSizer_Show_2_0, 1280). --define(wxSizer_Show_1, 1281). --define(wxSizerFlags_new, 1282). --define(wxSizerFlags_Align, 1283). --define(wxSizerFlags_Border_2, 1284). --define(wxSizerFlags_Border_1, 1285). --define(wxSizerFlags_Center, 1286). --define(wxSizerFlags_Centre, 1287). --define(wxSizerFlags_Expand, 1288). --define(wxSizerFlags_Left, 1289). --define(wxSizerFlags_Proportion, 1290). --define(wxSizerFlags_Right, 1291). --define(wxSizerFlags_destroy, 1292). --define(wxSizerItem_new_5_1, 1293). --define(wxSizerItem_new_2_1, 1294). --define(wxSizerItem_new_5_0, 1295). --define(wxSizerItem_new_2_0, 1296). --define(wxSizerItem_new_6, 1297). --define(wxSizerItem_new_3, 1298). --define(wxSizerItem_new_0, 1299). --define(wxSizerItem_destruct, 1300). --define(wxSizerItem_CalcMin, 1301). --define(wxSizerItem_DeleteWindows, 1302). --define(wxSizerItem_DetachSizer, 1303). --define(wxSizerItem_GetBorder, 1304). --define(wxSizerItem_GetFlag, 1305). --define(wxSizerItem_GetMinSize, 1306). --define(wxSizerItem_GetPosition, 1307). --define(wxSizerItem_GetProportion, 1308). --define(wxSizerItem_GetRatio, 1309). --define(wxSizerItem_GetRect, 1310). --define(wxSizerItem_GetSize, 1311). --define(wxSizerItem_GetSizer, 1312). --define(wxSizerItem_GetSpacer, 1313). --define(wxSizerItem_GetUserData, 1314). --define(wxSizerItem_GetWindow, 1315). --define(wxSizerItem_IsSizer, 1316). --define(wxSizerItem_IsShown, 1317). --define(wxSizerItem_IsSpacer, 1318). --define(wxSizerItem_IsWindow, 1319). --define(wxSizerItem_SetBorder, 1320). --define(wxSizerItem_SetDimension, 1321). --define(wxSizerItem_SetFlag, 1322). --define(wxSizerItem_SetInitSize, 1323). --define(wxSizerItem_SetMinSize_1, 1324). --define(wxSizerItem_SetMinSize_2, 1325). --define(wxSizerItem_SetProportion, 1326). --define(wxSizerItem_SetRatio_2, 1327). --define(wxSizerItem_SetRatio_1_1, 1328). --define(wxSizerItem_SetRatio_1_0, 1329). --define(wxSizerItem_SetSizer, 1330). --define(wxSizerItem_SetSpacer_1, 1331). --define(wxSizerItem_SetSpacer_2, 1332). --define(wxSizerItem_SetWindow, 1333). --define(wxSizerItem_Show, 1334). --define(wxBoxSizer_new, 1335). --define(wxBoxSizer_GetOrientation, 1336). --define(wxBoxSizer_destroy, 1337). --define(wxStaticBoxSizer_new_2, 1338). --define(wxStaticBoxSizer_new_3, 1339). --define(wxStaticBoxSizer_GetStaticBox, 1340). --define(wxStaticBoxSizer_destroy, 1341). --define(wxGridSizer_new_4, 1342). --define(wxGridSizer_new_2, 1343). --define(wxGridSizer_GetCols, 1344). --define(wxGridSizer_GetHGap, 1345). --define(wxGridSizer_GetRows, 1346). --define(wxGridSizer_GetVGap, 1347). --define(wxGridSizer_SetCols, 1348). --define(wxGridSizer_SetHGap, 1349). --define(wxGridSizer_SetRows, 1350). --define(wxGridSizer_SetVGap, 1351). --define(wxGridSizer_destroy, 1352). --define(wxFlexGridSizer_new_4, 1353). --define(wxFlexGridSizer_new_2, 1354). --define(wxFlexGridSizer_AddGrowableCol, 1355). --define(wxFlexGridSizer_AddGrowableRow, 1356). --define(wxFlexGridSizer_GetFlexibleDirection, 1357). --define(wxFlexGridSizer_GetNonFlexibleGrowMode, 1358). --define(wxFlexGridSizer_RemoveGrowableCol, 1359). --define(wxFlexGridSizer_RemoveGrowableRow, 1360). --define(wxFlexGridSizer_SetFlexibleDirection, 1361). --define(wxFlexGridSizer_SetNonFlexibleGrowMode, 1362). --define(wxFlexGridSizer_destroy, 1363). --define(wxGridBagSizer_new, 1364). --define(wxGridBagSizer_Add_3_2, 1365). --define(wxGridBagSizer_Add_3_1, 1366). --define(wxGridBagSizer_Add_4, 1367). --define(wxGridBagSizer_Add_1_0, 1368). --define(wxGridBagSizer_Add_2_1, 1369). --define(wxGridBagSizer_Add_2_0, 1370). --define(wxGridBagSizer_Add_3_0, 1371). --define(wxGridBagSizer_Add_1_1, 1372). --define(wxGridBagSizer_CalcMin, 1373). --define(wxGridBagSizer_CheckForIntersection_2, 1374). --define(wxGridBagSizer_CheckForIntersection_3, 1375). --define(wxGridBagSizer_FindItem_1_1, 1376). --define(wxGridBagSizer_FindItem_1_0, 1377). --define(wxGridBagSizer_FindItemAtPoint, 1378). --define(wxGridBagSizer_FindItemAtPosition, 1379). --define(wxGridBagSizer_FindItemWithData, 1380). --define(wxGridBagSizer_GetCellSize, 1381). --define(wxGridBagSizer_GetEmptyCellSize, 1382). --define(wxGridBagSizer_GetItemPosition_1_2, 1383). --define(wxGridBagSizer_GetItemPosition_1_1, 1384). --define(wxGridBagSizer_GetItemPosition_1_0, 1385). --define(wxGridBagSizer_GetItemSpan_1_2, 1386). --define(wxGridBagSizer_GetItemSpan_1_1, 1387). --define(wxGridBagSizer_GetItemSpan_1_0, 1388). --define(wxGridBagSizer_SetEmptyCellSize, 1389). --define(wxGridBagSizer_SetItemPosition_2_2, 1390). --define(wxGridBagSizer_SetItemPosition_2_1, 1391). --define(wxGridBagSizer_SetItemPosition_2_0, 1392). --define(wxGridBagSizer_SetItemSpan_2_2, 1393). --define(wxGridBagSizer_SetItemSpan_2_1, 1394). --define(wxGridBagSizer_SetItemSpan_2_0, 1395). --define(wxGridBagSizer_destroy, 1396). --define(wxStdDialogButtonSizer_new, 1397). --define(wxStdDialogButtonSizer_AddButton, 1398). --define(wxStdDialogButtonSizer_Realize, 1399). --define(wxStdDialogButtonSizer_SetAffirmativeButton, 1400). --define(wxStdDialogButtonSizer_SetCancelButton, 1401). --define(wxStdDialogButtonSizer_SetNegativeButton, 1402). --define(wxStdDialogButtonSizer_destroy, 1403). --define(wxFont_new_0, 1404). --define(wxFont_new_1, 1405). --define(wxFont_new_5, 1406). --define(wxFont_destruct, 1408). --define(wxFont_IsFixedWidth, 1409). --define(wxFont_GetDefaultEncoding, 1410). --define(wxFont_GetFaceName, 1411). --define(wxFont_GetFamily, 1412). --define(wxFont_GetNativeFontInfoDesc, 1413). --define(wxFont_GetNativeFontInfoUserDesc, 1414). --define(wxFont_GetPointSize, 1415). --define(wxFont_GetStyle, 1416). --define(wxFont_GetUnderlined, 1417). --define(wxFont_GetWeight, 1418). --define(wxFont_Ok, 1419). --define(wxFont_SetDefaultEncoding, 1420). --define(wxFont_SetFaceName, 1421). --define(wxFont_SetFamily, 1422). --define(wxFont_SetPointSize, 1423). --define(wxFont_SetStyle, 1424). --define(wxFont_SetUnderlined, 1425). --define(wxFont_SetWeight, 1426). --define(wxToolTip_Enable, 1427). --define(wxToolTip_SetDelay, 1428). --define(wxToolTip_new, 1429). --define(wxToolTip_SetTip, 1430). --define(wxToolTip_GetTip, 1431). --define(wxToolTip_GetWindow, 1432). --define(wxToolTip_destroy, 1433). --define(wxButton_new_3, 1435). --define(wxButton_new_0, 1436). --define(wxButton_destruct, 1437). --define(wxButton_Create, 1438). --define(wxButton_GetDefaultSize, 1439). --define(wxButton_SetDefault, 1440). --define(wxButton_SetLabel, 1441). --define(wxBitmapButton_new_4, 1443). --define(wxBitmapButton_new_0, 1444). --define(wxBitmapButton_Create, 1445). --define(wxBitmapButton_GetBitmapDisabled, 1446). --define(wxBitmapButton_GetBitmapFocus, 1448). --define(wxBitmapButton_GetBitmapLabel, 1450). --define(wxBitmapButton_GetBitmapSelected, 1452). --define(wxBitmapButton_SetBitmapDisabled, 1454). --define(wxBitmapButton_SetBitmapFocus, 1455). --define(wxBitmapButton_SetBitmapLabel, 1456). --define(wxBitmapButton_SetBitmapSelected, 1457). --define(wxBitmapButton_destroy, 1458). --define(wxToggleButton_new_0, 1459). --define(wxToggleButton_new_4, 1460). --define(wxToggleButton_Create, 1461). --define(wxToggleButton_GetValue, 1462). --define(wxToggleButton_SetValue, 1463). --define(wxToggleButton_destroy, 1464). --define(wxCalendarCtrl_new_0, 1465). --define(wxCalendarCtrl_new_3, 1466). --define(wxCalendarCtrl_Create, 1467). --define(wxCalendarCtrl_destruct, 1468). --define(wxCalendarCtrl_SetDate, 1469). --define(wxCalendarCtrl_GetDate, 1470). --define(wxCalendarCtrl_EnableYearChange, 1471). --define(wxCalendarCtrl_EnableMonthChange, 1472). --define(wxCalendarCtrl_EnableHolidayDisplay, 1473). --define(wxCalendarCtrl_SetHeaderColours, 1474). --define(wxCalendarCtrl_GetHeaderColourFg, 1475). --define(wxCalendarCtrl_GetHeaderColourBg, 1476). --define(wxCalendarCtrl_SetHighlightColours, 1477). --define(wxCalendarCtrl_GetHighlightColourFg, 1478). --define(wxCalendarCtrl_GetHighlightColourBg, 1479). --define(wxCalendarCtrl_SetHolidayColours, 1480). --define(wxCalendarCtrl_GetHolidayColourFg, 1481). --define(wxCalendarCtrl_GetHolidayColourBg, 1482). --define(wxCalendarCtrl_GetAttr, 1483). --define(wxCalendarCtrl_SetAttr, 1484). --define(wxCalendarCtrl_SetHoliday, 1485). --define(wxCalendarCtrl_ResetAttr, 1486). --define(wxCalendarCtrl_HitTest, 1487). --define(wxCalendarDateAttr_new_0, 1488). --define(wxCalendarDateAttr_new_2_1, 1489). --define(wxCalendarDateAttr_new_2_0, 1490). --define(wxCalendarDateAttr_SetTextColour, 1491). --define(wxCalendarDateAttr_SetBackgroundColour, 1492). --define(wxCalendarDateAttr_SetBorderColour, 1493). --define(wxCalendarDateAttr_SetFont, 1494). --define(wxCalendarDateAttr_SetBorder, 1495). --define(wxCalendarDateAttr_SetHoliday, 1496). --define(wxCalendarDateAttr_HasTextColour, 1497). --define(wxCalendarDateAttr_HasBackgroundColour, 1498). --define(wxCalendarDateAttr_HasBorderColour, 1499). --define(wxCalendarDateAttr_HasFont, 1500). --define(wxCalendarDateAttr_HasBorder, 1501). --define(wxCalendarDateAttr_IsHoliday, 1502). --define(wxCalendarDateAttr_GetTextColour, 1503). --define(wxCalendarDateAttr_GetBackgroundColour, 1504). --define(wxCalendarDateAttr_GetBorderColour, 1505). --define(wxCalendarDateAttr_GetFont, 1506). --define(wxCalendarDateAttr_GetBorder, 1507). --define(wxCalendarDateAttr_destroy, 1508). --define(wxCheckBox_new_4, 1510). --define(wxCheckBox_new_0, 1511). --define(wxCheckBox_Create, 1512). --define(wxCheckBox_GetValue, 1513). --define(wxCheckBox_Get3StateValue, 1514). --define(wxCheckBox_Is3rdStateAllowedForUser, 1515). --define(wxCheckBox_Is3State, 1516). --define(wxCheckBox_IsChecked, 1517). --define(wxCheckBox_SetValue, 1518). --define(wxCheckBox_Set3StateValue, 1519). --define(wxCheckBox_destroy, 1520). --define(wxCheckListBox_new_0, 1521). --define(wxCheckListBox_new_3, 1523). --define(wxCheckListBox_Check, 1524). --define(wxCheckListBox_IsChecked, 1525). --define(wxCheckListBox_destroy, 1526). --define(wxChoice_new_3, 1529). --define(wxChoice_new_0, 1530). --define(wxChoice_destruct, 1532). --define(wxChoice_Create, 1534). --define(wxChoice_Delete, 1535). --define(wxChoice_GetColumns, 1536). --define(wxChoice_SetColumns, 1537). --define(wxComboBox_new_0, 1538). --define(wxComboBox_new_3, 1540). --define(wxComboBox_destruct, 1541). --define(wxComboBox_Create, 1543). --define(wxComboBox_CanCopy, 1544). --define(wxComboBox_CanCut, 1545). --define(wxComboBox_CanPaste, 1546). --define(wxComboBox_CanRedo, 1547). --define(wxComboBox_CanUndo, 1548). --define(wxComboBox_Copy, 1549). --define(wxComboBox_Cut, 1550). --define(wxComboBox_GetInsertionPoint, 1551). --define(wxComboBox_GetLastPosition, 1552). --define(wxComboBox_GetValue, 1553). --define(wxComboBox_Paste, 1554). --define(wxComboBox_Redo, 1555). --define(wxComboBox_Replace, 1556). --define(wxComboBox_Remove, 1557). --define(wxComboBox_SetInsertionPoint, 1558). --define(wxComboBox_SetInsertionPointEnd, 1559). --define(wxComboBox_SetSelection_1, 1560). --define(wxComboBox_SetSelection_2, 1561). --define(wxComboBox_SetValue, 1562). --define(wxComboBox_Undo, 1563). --define(wxGauge_new_0, 1564). --define(wxGauge_new_4, 1565). --define(wxGauge_Create, 1566). --define(wxGauge_GetBezelFace, 1567). --define(wxGauge_GetRange, 1568). --define(wxGauge_GetShadowWidth, 1569). --define(wxGauge_GetValue, 1570). --define(wxGauge_IsVertical, 1571). --define(wxGauge_SetBezelFace, 1572). --define(wxGauge_SetRange, 1573). --define(wxGauge_SetShadowWidth, 1574). --define(wxGauge_SetValue, 1575). --define(wxGauge_Pulse, 1576). --define(wxGauge_destroy, 1577). --define(wxGenericDirCtrl_new_0, 1578). --define(wxGenericDirCtrl_new_2, 1579). --define(wxGenericDirCtrl_destruct, 1580). --define(wxGenericDirCtrl_Create, 1581). --define(wxGenericDirCtrl_Init, 1582). --define(wxGenericDirCtrl_CollapseTree, 1583). --define(wxGenericDirCtrl_ExpandPath, 1584). --define(wxGenericDirCtrl_GetDefaultPath, 1585). --define(wxGenericDirCtrl_GetPath, 1586). --define(wxGenericDirCtrl_GetFilePath, 1587). --define(wxGenericDirCtrl_GetFilter, 1588). --define(wxGenericDirCtrl_GetFilterIndex, 1589). --define(wxGenericDirCtrl_GetRootId, 1590). --define(wxGenericDirCtrl_GetTreeCtrl, 1591). --define(wxGenericDirCtrl_ReCreateTree, 1592). --define(wxGenericDirCtrl_SetDefaultPath, 1593). --define(wxGenericDirCtrl_SetFilter, 1594). --define(wxGenericDirCtrl_SetFilterIndex, 1595). --define(wxGenericDirCtrl_SetPath, 1596). --define(wxStaticBox_new_4, 1598). --define(wxStaticBox_new_0, 1599). --define(wxStaticBox_Create, 1600). --define(wxStaticBox_destroy, 1601). --define(wxStaticLine_new_2, 1603). --define(wxStaticLine_new_0, 1604). --define(wxStaticLine_Create, 1605). --define(wxStaticLine_IsVertical, 1606). --define(wxStaticLine_GetDefaultSize, 1607). --define(wxStaticLine_destroy, 1608). --define(wxListBox_new_3, 1611). --define(wxListBox_new_0, 1612). --define(wxListBox_destruct, 1614). --define(wxListBox_Create, 1616). --define(wxListBox_Deselect, 1617). --define(wxListBox_GetSelections, 1618). --define(wxListBox_InsertItems, 1619). --define(wxListBox_IsSelected, 1620). --define(wxListBox_Set, 1622). --define(wxListBox_HitTest, 1623). --define(wxListBox_SetFirstItem_1_0, 1624). --define(wxListBox_SetFirstItem_1_1, 1625). --define(wxListCtrl_new_0, 1626). --define(wxListCtrl_new_2, 1627). --define(wxListCtrl_Arrange, 1628). --define(wxListCtrl_AssignImageList, 1629). --define(wxListCtrl_ClearAll, 1630). --define(wxListCtrl_Create, 1631). --define(wxListCtrl_DeleteAllItems, 1632). --define(wxListCtrl_DeleteColumn, 1633). --define(wxListCtrl_DeleteItem, 1634). --define(wxListCtrl_EditLabel, 1635). --define(wxListCtrl_EnsureVisible, 1636). --define(wxListCtrl_FindItem_3_0, 1637). --define(wxListCtrl_FindItem_3_1, 1638). --define(wxListCtrl_GetColumn, 1639). --define(wxListCtrl_GetColumnCount, 1640). --define(wxListCtrl_GetColumnWidth, 1641). --define(wxListCtrl_GetCountPerPage, 1642). --define(wxListCtrl_GetImageList, 1643). --define(wxListCtrl_GetItem, 1644). --define(wxListCtrl_GetItemBackgroundColour, 1645). --define(wxListCtrl_GetItemCount, 1646). --define(wxListCtrl_GetItemData, 1647). --define(wxListCtrl_GetItemFont, 1648). --define(wxListCtrl_GetItemPosition, 1649). --define(wxListCtrl_GetItemRect, 1650). --define(wxListCtrl_GetItemSpacing, 1651). --define(wxListCtrl_GetItemState, 1652). --define(wxListCtrl_GetItemText, 1653). --define(wxListCtrl_GetItemTextColour, 1654). --define(wxListCtrl_GetNextItem, 1655). --define(wxListCtrl_GetSelectedItemCount, 1656). --define(wxListCtrl_GetTextColour, 1657). --define(wxListCtrl_GetTopItem, 1658). --define(wxListCtrl_GetViewRect, 1659). --define(wxListCtrl_HitTest, 1660). --define(wxListCtrl_InsertColumn_2, 1661). --define(wxListCtrl_InsertColumn_3, 1662). --define(wxListCtrl_InsertItem_1, 1663). --define(wxListCtrl_InsertItem_2_1, 1664). --define(wxListCtrl_InsertItem_2_0, 1665). --define(wxListCtrl_InsertItem_3, 1666). --define(wxListCtrl_RefreshItem, 1667). --define(wxListCtrl_RefreshItems, 1668). --define(wxListCtrl_ScrollList, 1669). --define(wxListCtrl_SetBackgroundColour, 1670). --define(wxListCtrl_SetColumn, 1671). --define(wxListCtrl_SetColumnWidth, 1672). --define(wxListCtrl_SetImageList, 1673). --define(wxListCtrl_SetItem_1, 1674). --define(wxListCtrl_SetItem_4, 1675). --define(wxListCtrl_SetItemBackgroundColour, 1676). --define(wxListCtrl_SetItemCount, 1677). --define(wxListCtrl_SetItemData, 1678). --define(wxListCtrl_SetItemFont, 1679). --define(wxListCtrl_SetItemImage, 1680). --define(wxListCtrl_SetItemColumnImage, 1681). --define(wxListCtrl_SetItemPosition, 1682). --define(wxListCtrl_SetItemState, 1683). --define(wxListCtrl_SetItemText, 1684). --define(wxListCtrl_SetItemTextColour, 1685). --define(wxListCtrl_SetSingleStyle, 1686). --define(wxListCtrl_SetTextColour, 1687). --define(wxListCtrl_SetWindowStyleFlag, 1688). --define(wxListCtrl_destroy, 1689). --define(wxListView_ClearColumnImage, 1690). --define(wxListView_Focus, 1691). --define(wxListView_GetFirstSelected, 1692). --define(wxListView_GetFocusedItem, 1693). --define(wxListView_GetNextSelected, 1694). --define(wxListView_IsSelected, 1695). --define(wxListView_Select, 1696). --define(wxListView_SetColumnImage, 1697). --define(wxListItem_new_0, 1698). --define(wxListItem_new_1, 1699). --define(wxListItem_destruct, 1700). --define(wxListItem_Clear, 1701). --define(wxListItem_GetAlign, 1702). --define(wxListItem_GetBackgroundColour, 1703). --define(wxListItem_GetColumn, 1704). --define(wxListItem_GetFont, 1705). --define(wxListItem_GetId, 1706). --define(wxListItem_GetImage, 1707). --define(wxListItem_GetMask, 1708). --define(wxListItem_GetState, 1709). --define(wxListItem_GetText, 1710). --define(wxListItem_GetTextColour, 1711). --define(wxListItem_GetWidth, 1712). --define(wxListItem_SetAlign, 1713). --define(wxListItem_SetBackgroundColour, 1714). --define(wxListItem_SetColumn, 1715). --define(wxListItem_SetFont, 1716). --define(wxListItem_SetId, 1717). --define(wxListItem_SetImage, 1718). --define(wxListItem_SetMask, 1719). --define(wxListItem_SetState, 1720). --define(wxListItem_SetStateMask, 1721). --define(wxListItem_SetText, 1722). --define(wxListItem_SetTextColour, 1723). --define(wxListItem_SetWidth, 1724). --define(wxImageList_new_0, 1725). --define(wxImageList_new_3, 1726). --define(wxImageList_Add_1, 1727). --define(wxImageList_Add_2_0, 1728). --define(wxImageList_Add_2_1, 1729). --define(wxImageList_Create, 1730). --define(wxImageList_Draw, 1732). --define(wxImageList_GetBitmap, 1733). --define(wxImageList_GetIcon, 1734). --define(wxImageList_GetImageCount, 1735). --define(wxImageList_GetSize, 1736). --define(wxImageList_Remove, 1737). --define(wxImageList_RemoveAll, 1738). --define(wxImageList_Replace_2, 1739). --define(wxImageList_Replace_3, 1740). --define(wxImageList_destroy, 1741). --define(wxTextAttr_new_0, 1742). --define(wxTextAttr_new_2, 1743). --define(wxTextAttr_GetAlignment, 1744). --define(wxTextAttr_GetBackgroundColour, 1745). --define(wxTextAttr_GetFont, 1746). --define(wxTextAttr_GetLeftIndent, 1747). --define(wxTextAttr_GetLeftSubIndent, 1748). --define(wxTextAttr_GetRightIndent, 1749). --define(wxTextAttr_GetTabs, 1750). --define(wxTextAttr_GetTextColour, 1751). --define(wxTextAttr_HasBackgroundColour, 1752). --define(wxTextAttr_HasFont, 1753). --define(wxTextAttr_HasTextColour, 1754). --define(wxTextAttr_GetFlags, 1755). --define(wxTextAttr_IsDefault, 1756). --define(wxTextAttr_SetAlignment, 1757). --define(wxTextAttr_SetBackgroundColour, 1758). --define(wxTextAttr_SetFlags, 1759). --define(wxTextAttr_SetFont, 1760). --define(wxTextAttr_SetLeftIndent, 1761). --define(wxTextAttr_SetRightIndent, 1762). --define(wxTextAttr_SetTabs, 1763). --define(wxTextAttr_SetTextColour, 1764). --define(wxTextAttr_destroy, 1765). --define(wxTextCtrl_new_3, 1767). --define(wxTextCtrl_new_0, 1768). --define(wxTextCtrl_destruct, 1770). --define(wxTextCtrl_AppendText, 1771). --define(wxTextCtrl_CanCopy, 1772). --define(wxTextCtrl_CanCut, 1773). --define(wxTextCtrl_CanPaste, 1774). --define(wxTextCtrl_CanRedo, 1775). --define(wxTextCtrl_CanUndo, 1776). --define(wxTextCtrl_Clear, 1777). --define(wxTextCtrl_Copy, 1778). --define(wxTextCtrl_Create, 1779). --define(wxTextCtrl_Cut, 1780). --define(wxTextCtrl_DiscardEdits, 1781). --define(wxTextCtrl_EmulateKeyPress, 1782). --define(wxTextCtrl_GetDefaultStyle, 1783). --define(wxTextCtrl_GetInsertionPoint, 1784). --define(wxTextCtrl_GetLastPosition, 1785). --define(wxTextCtrl_GetLineLength, 1786). --define(wxTextCtrl_GetLineText, 1787). --define(wxTextCtrl_GetNumberOfLines, 1788). --define(wxTextCtrl_GetRange, 1789). --define(wxTextCtrl_GetSelection, 1790). --define(wxTextCtrl_GetStringSelection, 1791). --define(wxTextCtrl_GetStyle, 1792). --define(wxTextCtrl_GetValue, 1793). --define(wxTextCtrl_IsEditable, 1794). --define(wxTextCtrl_IsModified, 1795). --define(wxTextCtrl_IsMultiLine, 1796). --define(wxTextCtrl_IsSingleLine, 1797). --define(wxTextCtrl_LoadFile, 1798). --define(wxTextCtrl_MarkDirty, 1799). --define(wxTextCtrl_Paste, 1800). --define(wxTextCtrl_PositionToXY, 1801). --define(wxTextCtrl_Redo, 1802). --define(wxTextCtrl_Remove, 1803). --define(wxTextCtrl_Replace, 1804). --define(wxTextCtrl_SaveFile, 1805). --define(wxTextCtrl_SetDefaultStyle, 1806). --define(wxTextCtrl_SetEditable, 1807). --define(wxTextCtrl_SetInsertionPoint, 1808). --define(wxTextCtrl_SetInsertionPointEnd, 1809). --define(wxTextCtrl_SetMaxLength, 1811). --define(wxTextCtrl_SetSelection, 1812). --define(wxTextCtrl_SetStyle, 1813). --define(wxTextCtrl_SetValue, 1814). --define(wxTextCtrl_ShowPosition, 1815). --define(wxTextCtrl_Undo, 1816). --define(wxTextCtrl_WriteText, 1817). --define(wxTextCtrl_XYToPosition, 1818). --define(wxNotebook_new_0, 1821). --define(wxNotebook_new_3, 1822). --define(wxNotebook_destruct, 1823). --define(wxNotebook_AddPage, 1824). --define(wxNotebook_AdvanceSelection, 1825). --define(wxNotebook_AssignImageList, 1826). --define(wxNotebook_Create, 1827). --define(wxNotebook_DeleteAllPages, 1828). --define(wxNotebook_DeletePage, 1829). --define(wxNotebook_RemovePage, 1830). --define(wxNotebook_GetCurrentPage, 1831). --define(wxNotebook_GetImageList, 1832). --define(wxNotebook_GetPage, 1834). --define(wxNotebook_GetPageCount, 1835). --define(wxNotebook_GetPageImage, 1836). --define(wxNotebook_GetPageText, 1837). --define(wxNotebook_GetRowCount, 1838). --define(wxNotebook_GetSelection, 1839). --define(wxNotebook_GetThemeBackgroundColour, 1840). --define(wxNotebook_HitTest, 1842). --define(wxNotebook_InsertPage, 1844). --define(wxNotebook_SetImageList, 1845). --define(wxNotebook_SetPadding, 1846). --define(wxNotebook_SetPageSize, 1847). --define(wxNotebook_SetPageImage, 1848). --define(wxNotebook_SetPageText, 1849). --define(wxNotebook_SetSelection, 1850). --define(wxNotebook_ChangeSelection, 1851). --define(wxChoicebook_new_0, 1852). --define(wxChoicebook_new_3, 1853). --define(wxChoicebook_AddPage, 1854). --define(wxChoicebook_AdvanceSelection, 1855). --define(wxChoicebook_AssignImageList, 1856). --define(wxChoicebook_Create, 1857). --define(wxChoicebook_DeleteAllPages, 1858). --define(wxChoicebook_DeletePage, 1859). --define(wxChoicebook_RemovePage, 1860). --define(wxChoicebook_GetCurrentPage, 1861). --define(wxChoicebook_GetImageList, 1862). --define(wxChoicebook_GetPage, 1864). --define(wxChoicebook_GetPageCount, 1865). --define(wxChoicebook_GetPageImage, 1866). --define(wxChoicebook_GetPageText, 1867). --define(wxChoicebook_GetSelection, 1868). --define(wxChoicebook_HitTest, 1869). --define(wxChoicebook_InsertPage, 1870). --define(wxChoicebook_SetImageList, 1871). --define(wxChoicebook_SetPageSize, 1872). --define(wxChoicebook_SetPageImage, 1873). --define(wxChoicebook_SetPageText, 1874). --define(wxChoicebook_SetSelection, 1875). --define(wxChoicebook_ChangeSelection, 1876). --define(wxChoicebook_destroy, 1877). --define(wxToolbook_new_0, 1878). --define(wxToolbook_new_3, 1879). --define(wxToolbook_AddPage, 1880). --define(wxToolbook_AdvanceSelection, 1881). --define(wxToolbook_AssignImageList, 1882). --define(wxToolbook_Create, 1883). --define(wxToolbook_DeleteAllPages, 1884). --define(wxToolbook_DeletePage, 1885). --define(wxToolbook_RemovePage, 1886). --define(wxToolbook_GetCurrentPage, 1887). --define(wxToolbook_GetImageList, 1888). --define(wxToolbook_GetPage, 1890). --define(wxToolbook_GetPageCount, 1891). --define(wxToolbook_GetPageImage, 1892). --define(wxToolbook_GetPageText, 1893). --define(wxToolbook_GetSelection, 1894). --define(wxToolbook_HitTest, 1896). --define(wxToolbook_InsertPage, 1897). --define(wxToolbook_SetImageList, 1898). --define(wxToolbook_SetPageSize, 1899). --define(wxToolbook_SetPageImage, 1900). --define(wxToolbook_SetPageText, 1901). --define(wxToolbook_SetSelection, 1902). --define(wxToolbook_ChangeSelection, 1903). --define(wxToolbook_destroy, 1904). --define(wxListbook_new_0, 1905). --define(wxListbook_new_3, 1906). --define(wxListbook_AddPage, 1907). --define(wxListbook_AdvanceSelection, 1908). --define(wxListbook_AssignImageList, 1909). --define(wxListbook_Create, 1910). --define(wxListbook_DeleteAllPages, 1911). --define(wxListbook_DeletePage, 1912). --define(wxListbook_RemovePage, 1913). --define(wxListbook_GetCurrentPage, 1914). --define(wxListbook_GetImageList, 1915). --define(wxListbook_GetPage, 1917). --define(wxListbook_GetPageCount, 1918). --define(wxListbook_GetPageImage, 1919). --define(wxListbook_GetPageText, 1920). --define(wxListbook_GetSelection, 1921). --define(wxListbook_HitTest, 1923). --define(wxListbook_InsertPage, 1924). --define(wxListbook_SetImageList, 1925). --define(wxListbook_SetPageSize, 1926). --define(wxListbook_SetPageImage, 1927). --define(wxListbook_SetPageText, 1928). --define(wxListbook_SetSelection, 1929). --define(wxListbook_ChangeSelection, 1930). --define(wxListbook_destroy, 1931). --define(wxTreebook_new_0, 1932). --define(wxTreebook_new_3, 1933). --define(wxTreebook_AddPage, 1934). --define(wxTreebook_AdvanceSelection, 1935). --define(wxTreebook_AssignImageList, 1936). --define(wxTreebook_Create, 1937). --define(wxTreebook_DeleteAllPages, 1938). --define(wxTreebook_DeletePage, 1939). --define(wxTreebook_RemovePage, 1940). --define(wxTreebook_GetCurrentPage, 1941). --define(wxTreebook_GetImageList, 1942). --define(wxTreebook_GetPage, 1944). --define(wxTreebook_GetPageCount, 1945). --define(wxTreebook_GetPageImage, 1946). --define(wxTreebook_GetPageText, 1947). --define(wxTreebook_GetSelection, 1948). --define(wxTreebook_ExpandNode, 1949). --define(wxTreebook_IsNodeExpanded, 1950). --define(wxTreebook_HitTest, 1952). --define(wxTreebook_InsertPage, 1953). --define(wxTreebook_InsertSubPage, 1954). --define(wxTreebook_SetImageList, 1955). --define(wxTreebook_SetPageSize, 1956). --define(wxTreebook_SetPageImage, 1957). --define(wxTreebook_SetPageText, 1958). --define(wxTreebook_SetSelection, 1959). --define(wxTreebook_ChangeSelection, 1960). --define(wxTreebook_destroy, 1961). --define(wxTreeCtrl_new_2, 1964). --define(wxTreeCtrl_new_0, 1965). --define(wxTreeCtrl_destruct, 1967). --define(wxTreeCtrl_AddRoot, 1968). --define(wxTreeCtrl_AppendItem, 1969). --define(wxTreeCtrl_AssignImageList, 1970). --define(wxTreeCtrl_AssignStateImageList, 1971). --define(wxTreeCtrl_Collapse, 1972). --define(wxTreeCtrl_CollapseAndReset, 1973). --define(wxTreeCtrl_Create, 1974). --define(wxTreeCtrl_Delete, 1975). --define(wxTreeCtrl_DeleteAllItems, 1976). --define(wxTreeCtrl_DeleteChildren, 1977). --define(wxTreeCtrl_EnsureVisible, 1978). --define(wxTreeCtrl_Expand, 1979). --define(wxTreeCtrl_GetBoundingRect, 1980). --define(wxTreeCtrl_GetChildrenCount, 1982). --define(wxTreeCtrl_GetCount, 1983). --define(wxTreeCtrl_GetEditControl, 1984). --define(wxTreeCtrl_GetFirstVisibleItem, 1985). --define(wxTreeCtrl_GetImageList, 1986). --define(wxTreeCtrl_GetIndent, 1987). --define(wxTreeCtrl_GetItemBackgroundColour, 1988). --define(wxTreeCtrl_GetItemData, 1989). --define(wxTreeCtrl_GetItemFont, 1990). --define(wxTreeCtrl_GetItemImage_1, 1991). --define(wxTreeCtrl_GetItemImage_2, 1992). --define(wxTreeCtrl_GetItemText, 1993). --define(wxTreeCtrl_GetItemTextColour, 1994). --define(wxTreeCtrl_GetLastChild, 1995). --define(wxTreeCtrl_GetNextSibling, 1996). --define(wxTreeCtrl_GetNextVisible, 1997). --define(wxTreeCtrl_GetItemParent, 1998). --define(wxTreeCtrl_GetPrevSibling, 1999). --define(wxTreeCtrl_GetPrevVisible, 2000). --define(wxTreeCtrl_GetRootItem, 2001). --define(wxTreeCtrl_GetSelection, 2002). --define(wxTreeCtrl_GetSelections, 2003). --define(wxTreeCtrl_GetStateImageList, 2004). --define(wxTreeCtrl_HitTest, 2005). --define(wxTreeCtrl_InsertItem_4_1, 2006). --define(wxTreeCtrl_InsertItem_4_0, 2007). --define(wxTreeCtrl_IsBold, 2008). --define(wxTreeCtrl_IsExpanded, 2009). --define(wxTreeCtrl_IsSelected, 2010). --define(wxTreeCtrl_IsVisible, 2011). --define(wxTreeCtrl_ItemHasChildren, 2012). --define(wxTreeCtrl_PrependItem, 2013). --define(wxTreeCtrl_ScrollTo, 2014). --define(wxTreeCtrl_SelectItem_1, 2015). --define(wxTreeCtrl_SelectItem_2, 2016). --define(wxTreeCtrl_SetIndent, 2017). --define(wxTreeCtrl_SetImageList, 2018). --define(wxTreeCtrl_SetItemBackgroundColour, 2019). --define(wxTreeCtrl_SetItemBold, 2020). --define(wxTreeCtrl_SetItemData, 2021). --define(wxTreeCtrl_SetItemDropHighlight, 2022). --define(wxTreeCtrl_SetItemFont, 2023). --define(wxTreeCtrl_SetItemHasChildren, 2024). --define(wxTreeCtrl_SetItemImage_2, 2025). --define(wxTreeCtrl_SetItemImage_3, 2026). --define(wxTreeCtrl_SetItemText, 2027). --define(wxTreeCtrl_SetItemTextColour, 2028). --define(wxTreeCtrl_SetStateImageList, 2029). --define(wxTreeCtrl_SetWindowStyle, 2030). --define(wxTreeCtrl_SortChildren, 2031). --define(wxTreeCtrl_Toggle, 2032). --define(wxTreeCtrl_ToggleItemSelection, 2033). --define(wxTreeCtrl_Unselect, 2034). --define(wxTreeCtrl_UnselectAll, 2035). --define(wxTreeCtrl_UnselectItem, 2036). --define(wxScrollBar_new_0, 2037). --define(wxScrollBar_new_3, 2038). --define(wxScrollBar_destruct, 2039). --define(wxScrollBar_Create, 2040). --define(wxScrollBar_GetRange, 2041). --define(wxScrollBar_GetPageSize, 2042). --define(wxScrollBar_GetThumbPosition, 2043). --define(wxScrollBar_GetThumbSize, 2044). --define(wxScrollBar_SetThumbPosition, 2045). --define(wxScrollBar_SetScrollbar, 2046). --define(wxSpinButton_new_2, 2048). --define(wxSpinButton_new_0, 2049). --define(wxSpinButton_Create, 2050). --define(wxSpinButton_GetMax, 2051). --define(wxSpinButton_GetMin, 2052). --define(wxSpinButton_GetValue, 2053). --define(wxSpinButton_SetRange, 2054). --define(wxSpinButton_SetValue, 2055). --define(wxSpinButton_destroy, 2056). --define(wxSpinCtrl_new_0, 2057). --define(wxSpinCtrl_new_2, 2058). --define(wxSpinCtrl_Create, 2060). --define(wxSpinCtrl_SetValue_1_1, 2063). --define(wxSpinCtrl_SetValue_1_0, 2064). --define(wxSpinCtrl_GetValue, 2066). --define(wxSpinCtrl_SetRange, 2068). --define(wxSpinCtrl_SetSelection, 2069). --define(wxSpinCtrl_GetMin, 2071). --define(wxSpinCtrl_GetMax, 2073). --define(wxSpinCtrl_destroy, 2074). --define(wxStaticText_new_0, 2075). --define(wxStaticText_new_4, 2076). --define(wxStaticText_Create, 2077). --define(wxStaticText_GetLabel, 2078). --define(wxStaticText_SetLabel, 2079). --define(wxStaticText_Wrap, 2080). --define(wxStaticText_destroy, 2081). --define(wxStaticBitmap_new_0, 2082). --define(wxStaticBitmap_new_4, 2083). --define(wxStaticBitmap_Create, 2084). --define(wxStaticBitmap_GetBitmap, 2085). --define(wxStaticBitmap_SetBitmap, 2086). --define(wxStaticBitmap_destroy, 2087). --define(wxRadioBox_new, 2088). --define(wxRadioBox_destruct, 2090). --define(wxRadioBox_Create, 2091). --define(wxRadioBox_Enable_2, 2092). --define(wxRadioBox_Enable_1, 2093). --define(wxRadioBox_GetSelection, 2094). --define(wxRadioBox_GetString, 2095). --define(wxRadioBox_SetSelection, 2096). --define(wxRadioBox_Show_2, 2097). --define(wxRadioBox_Show_1, 2098). --define(wxRadioBox_GetColumnCount, 2099). --define(wxRadioBox_GetItemHelpText, 2100). --define(wxRadioBox_GetItemToolTip, 2101). --define(wxRadioBox_GetItemFromPoint, 2103). --define(wxRadioBox_GetRowCount, 2104). --define(wxRadioBox_IsItemEnabled, 2105). --define(wxRadioBox_IsItemShown, 2106). --define(wxRadioBox_SetItemHelpText, 2107). --define(wxRadioBox_SetItemToolTip, 2108). --define(wxRadioButton_new_0, 2109). --define(wxRadioButton_new_4, 2110). --define(wxRadioButton_Create, 2111). --define(wxRadioButton_GetValue, 2112). --define(wxRadioButton_SetValue, 2113). --define(wxRadioButton_destroy, 2114). --define(wxSlider_new_6, 2116). --define(wxSlider_new_0, 2117). --define(wxSlider_Create, 2118). --define(wxSlider_GetLineSize, 2119). --define(wxSlider_GetMax, 2120). --define(wxSlider_GetMin, 2121). --define(wxSlider_GetPageSize, 2122). --define(wxSlider_GetThumbLength, 2123). --define(wxSlider_GetValue, 2124). --define(wxSlider_SetLineSize, 2125). --define(wxSlider_SetPageSize, 2126). --define(wxSlider_SetRange, 2127). --define(wxSlider_SetThumbLength, 2128). --define(wxSlider_SetValue, 2129). --define(wxSlider_destroy, 2130). --define(wxDialog_new_4, 2132). --define(wxDialog_new_0, 2133). --define(wxDialog_destruct, 2135). --define(wxDialog_Create, 2136). --define(wxDialog_CreateButtonSizer, 2137). --define(wxDialog_CreateStdDialogButtonSizer, 2138). --define(wxDialog_EndModal, 2139). --define(wxDialog_GetAffirmativeId, 2140). --define(wxDialog_GetReturnCode, 2141). --define(wxDialog_IsModal, 2142). --define(wxDialog_SetAffirmativeId, 2143). --define(wxDialog_SetReturnCode, 2144). --define(wxDialog_Show, 2145). --define(wxDialog_ShowModal, 2146). --define(wxColourDialog_new_0, 2147). --define(wxColourDialog_new_2, 2148). --define(wxColourDialog_destruct, 2149). --define(wxColourDialog_Create, 2150). --define(wxColourDialog_GetColourData, 2151). --define(wxColourData_new_0, 2152). --define(wxColourData_new_1, 2153). --define(wxColourData_destruct, 2154). --define(wxColourData_GetChooseFull, 2155). --define(wxColourData_GetColour, 2156). --define(wxColourData_GetCustomColour, 2158). --define(wxColourData_SetChooseFull, 2159). --define(wxColourData_SetColour, 2160). --define(wxColourData_SetCustomColour, 2161). --define(wxPalette_new_0, 2162). --define(wxPalette_new_4, 2163). --define(wxPalette_destruct, 2165). --define(wxPalette_Create, 2166). --define(wxPalette_GetColoursCount, 2167). --define(wxPalette_GetPixel, 2168). --define(wxPalette_GetRGB, 2169). --define(wxPalette_IsOk, 2170). --define(wxDirDialog_new, 2174). --define(wxDirDialog_destruct, 2175). --define(wxDirDialog_GetPath, 2176). --define(wxDirDialog_GetMessage, 2177). --define(wxDirDialog_SetMessage, 2178). --define(wxDirDialog_SetPath, 2179). --define(wxFileDialog_new, 2183). --define(wxFileDialog_destruct, 2184). --define(wxFileDialog_GetDirectory, 2185). --define(wxFileDialog_GetFilename, 2186). --define(wxFileDialog_GetFilenames, 2187). --define(wxFileDialog_GetFilterIndex, 2188). --define(wxFileDialog_GetMessage, 2189). --define(wxFileDialog_GetPath, 2190). --define(wxFileDialog_GetPaths, 2191). --define(wxFileDialog_GetWildcard, 2192). --define(wxFileDialog_SetDirectory, 2193). --define(wxFileDialog_SetFilename, 2194). --define(wxFileDialog_SetFilterIndex, 2195). --define(wxFileDialog_SetMessage, 2196). --define(wxFileDialog_SetPath, 2197). --define(wxFileDialog_SetWildcard, 2198). --define(wxPickerBase_SetInternalMargin, 2199). --define(wxPickerBase_GetInternalMargin, 2200). --define(wxPickerBase_SetTextCtrlProportion, 2201). --define(wxPickerBase_SetPickerCtrlProportion, 2202). --define(wxPickerBase_GetTextCtrlProportion, 2203). --define(wxPickerBase_GetPickerCtrlProportion, 2204). --define(wxPickerBase_HasTextCtrl, 2205). --define(wxPickerBase_GetTextCtrl, 2206). --define(wxPickerBase_IsTextCtrlGrowable, 2207). --define(wxPickerBase_SetPickerCtrlGrowable, 2208). --define(wxPickerBase_SetTextCtrlGrowable, 2209). --define(wxPickerBase_IsPickerCtrlGrowable, 2210). --define(wxFilePickerCtrl_new_0, 2211). --define(wxFilePickerCtrl_new_3, 2212). --define(wxFilePickerCtrl_Create, 2213). --define(wxFilePickerCtrl_GetPath, 2214). --define(wxFilePickerCtrl_SetPath, 2215). --define(wxFilePickerCtrl_destroy, 2216). --define(wxDirPickerCtrl_new_0, 2217). --define(wxDirPickerCtrl_new_3, 2218). --define(wxDirPickerCtrl_Create, 2219). --define(wxDirPickerCtrl_GetPath, 2220). --define(wxDirPickerCtrl_SetPath, 2221). --define(wxDirPickerCtrl_destroy, 2222). --define(wxColourPickerCtrl_new_0, 2223). --define(wxColourPickerCtrl_new_3, 2224). --define(wxColourPickerCtrl_Create, 2225). --define(wxColourPickerCtrl_GetColour, 2226). --define(wxColourPickerCtrl_SetColour_1_1, 2227). --define(wxColourPickerCtrl_SetColour_1_0, 2228). --define(wxColourPickerCtrl_destroy, 2229). --define(wxDatePickerCtrl_new_0, 2230). --define(wxDatePickerCtrl_new_3, 2231). --define(wxDatePickerCtrl_GetRange, 2232). --define(wxDatePickerCtrl_GetValue, 2233). --define(wxDatePickerCtrl_SetRange, 2234). --define(wxDatePickerCtrl_SetValue, 2235). --define(wxDatePickerCtrl_destroy, 2236). --define(wxFontPickerCtrl_new_0, 2237). --define(wxFontPickerCtrl_new_3, 2238). --define(wxFontPickerCtrl_Create, 2239). --define(wxFontPickerCtrl_GetSelectedFont, 2240). --define(wxFontPickerCtrl_SetSelectedFont, 2241). --define(wxFontPickerCtrl_GetMaxPointSize, 2242). --define(wxFontPickerCtrl_SetMaxPointSize, 2243). --define(wxFontPickerCtrl_destroy, 2244). --define(wxFindReplaceDialog_new_0, 2247). --define(wxFindReplaceDialog_new_4, 2248). --define(wxFindReplaceDialog_destruct, 2249). --define(wxFindReplaceDialog_Create, 2250). --define(wxFindReplaceDialog_GetData, 2251). --define(wxFindReplaceData_new_0, 2252). --define(wxFindReplaceData_new_1, 2253). --define(wxFindReplaceData_GetFindString, 2254). --define(wxFindReplaceData_GetReplaceString, 2255). --define(wxFindReplaceData_GetFlags, 2256). --define(wxFindReplaceData_SetFlags, 2257). --define(wxFindReplaceData_SetFindString, 2258). --define(wxFindReplaceData_SetReplaceString, 2259). --define(wxFindReplaceData_destroy, 2260). --define(wxMultiChoiceDialog_new_0, 2261). --define(wxMultiChoiceDialog_new_5, 2263). --define(wxMultiChoiceDialog_GetSelections, 2264). --define(wxMultiChoiceDialog_SetSelections, 2265). --define(wxMultiChoiceDialog_destroy, 2266). --define(wxSingleChoiceDialog_new_0, 2267). --define(wxSingleChoiceDialog_new_5, 2269). --define(wxSingleChoiceDialog_GetSelection, 2270). --define(wxSingleChoiceDialog_GetStringSelection, 2271). --define(wxSingleChoiceDialog_SetSelection, 2272). --define(wxSingleChoiceDialog_destroy, 2273). --define(wxTextEntryDialog_new, 2274). --define(wxTextEntryDialog_GetValue, 2275). --define(wxTextEntryDialog_SetValue, 2276). --define(wxTextEntryDialog_destroy, 2277). --define(wxPasswordEntryDialog_new, 2278). --define(wxPasswordEntryDialog_destroy, 2279). --define(wxFontData_new_0, 2280). --define(wxFontData_new_1, 2281). --define(wxFontData_destruct, 2282). --define(wxFontData_EnableEffects, 2283). --define(wxFontData_GetAllowSymbols, 2284). --define(wxFontData_GetColour, 2285). --define(wxFontData_GetChosenFont, 2286). --define(wxFontData_GetEnableEffects, 2287). --define(wxFontData_GetInitialFont, 2288). --define(wxFontData_GetShowHelp, 2289). --define(wxFontData_SetAllowSymbols, 2290). --define(wxFontData_SetChosenFont, 2291). --define(wxFontData_SetColour, 2292). --define(wxFontData_SetInitialFont, 2293). --define(wxFontData_SetRange, 2294). --define(wxFontData_SetShowHelp, 2295). --define(wxFontDialog_new_0, 2299). --define(wxFontDialog_new_2, 2301). --define(wxFontDialog_Create, 2303). --define(wxFontDialog_GetFontData, 2304). --define(wxFontDialog_destroy, 2306). --define(wxProgressDialog_new, 2307). --define(wxProgressDialog_destruct, 2308). --define(wxProgressDialog_Resume, 2309). --define(wxProgressDialog_Update_2, 2310). --define(wxProgressDialog_Update_0, 2311). --define(wxMessageDialog_new, 2312). --define(wxMessageDialog_destruct, 2313). --define(wxPageSetupDialog_new, 2314). --define(wxPageSetupDialog_destruct, 2315). --define(wxPageSetupDialog_GetPageSetupData, 2316). --define(wxPageSetupDialog_ShowModal, 2317). --define(wxPageSetupDialogData_new_0, 2318). --define(wxPageSetupDialogData_new_1_0, 2319). --define(wxPageSetupDialogData_new_1_1, 2320). --define(wxPageSetupDialogData_destruct, 2321). --define(wxPageSetupDialogData_EnableHelp, 2322). --define(wxPageSetupDialogData_EnableMargins, 2323). --define(wxPageSetupDialogData_EnableOrientation, 2324). --define(wxPageSetupDialogData_EnablePaper, 2325). --define(wxPageSetupDialogData_EnablePrinter, 2326). --define(wxPageSetupDialogData_GetDefaultMinMargins, 2327). --define(wxPageSetupDialogData_GetEnableMargins, 2328). --define(wxPageSetupDialogData_GetEnableOrientation, 2329). --define(wxPageSetupDialogData_GetEnablePaper, 2330). --define(wxPageSetupDialogData_GetEnablePrinter, 2331). --define(wxPageSetupDialogData_GetEnableHelp, 2332). --define(wxPageSetupDialogData_GetDefaultInfo, 2333). --define(wxPageSetupDialogData_GetMarginTopLeft, 2334). --define(wxPageSetupDialogData_GetMarginBottomRight, 2335). --define(wxPageSetupDialogData_GetMinMarginTopLeft, 2336). --define(wxPageSetupDialogData_GetMinMarginBottomRight, 2337). --define(wxPageSetupDialogData_GetPaperId, 2338). --define(wxPageSetupDialogData_GetPaperSize, 2339). --define(wxPageSetupDialogData_GetPrintData, 2341). --define(wxPageSetupDialogData_IsOk, 2342). --define(wxPageSetupDialogData_SetDefaultInfo, 2343). --define(wxPageSetupDialogData_SetDefaultMinMargins, 2344). --define(wxPageSetupDialogData_SetMarginTopLeft, 2345). --define(wxPageSetupDialogData_SetMarginBottomRight, 2346). --define(wxPageSetupDialogData_SetMinMarginTopLeft, 2347). --define(wxPageSetupDialogData_SetMinMarginBottomRight, 2348). --define(wxPageSetupDialogData_SetPaperId, 2349). --define(wxPageSetupDialogData_SetPaperSize_1_1, 2350). --define(wxPageSetupDialogData_SetPaperSize_1_0, 2351). --define(wxPageSetupDialogData_SetPrintData, 2352). --define(wxPrintDialog_new_2_0, 2353). --define(wxPrintDialog_new_2_1, 2354). --define(wxPrintDialog_destruct, 2355). --define(wxPrintDialog_GetPrintDialogData, 2356). --define(wxPrintDialog_GetPrintDC, 2357). --define(wxPrintDialogData_new_0, 2358). --define(wxPrintDialogData_new_1_1, 2359). --define(wxPrintDialogData_new_1_0, 2360). --define(wxPrintDialogData_destruct, 2361). --define(wxPrintDialogData_EnableHelp, 2362). --define(wxPrintDialogData_EnablePageNumbers, 2363). --define(wxPrintDialogData_EnablePrintToFile, 2364). --define(wxPrintDialogData_EnableSelection, 2365). --define(wxPrintDialogData_GetAllPages, 2366). --define(wxPrintDialogData_GetCollate, 2367). --define(wxPrintDialogData_GetFromPage, 2368). --define(wxPrintDialogData_GetMaxPage, 2369). --define(wxPrintDialogData_GetMinPage, 2370). --define(wxPrintDialogData_GetNoCopies, 2371). --define(wxPrintDialogData_GetPrintData, 2372). --define(wxPrintDialogData_GetPrintToFile, 2373). --define(wxPrintDialogData_GetSelection, 2374). --define(wxPrintDialogData_GetToPage, 2375). --define(wxPrintDialogData_IsOk, 2376). --define(wxPrintDialogData_SetCollate, 2377). --define(wxPrintDialogData_SetFromPage, 2378). --define(wxPrintDialogData_SetMaxPage, 2379). --define(wxPrintDialogData_SetMinPage, 2380). --define(wxPrintDialogData_SetNoCopies, 2381). --define(wxPrintDialogData_SetPrintData, 2382). --define(wxPrintDialogData_SetPrintToFile, 2383). --define(wxPrintDialogData_SetSelection, 2384). --define(wxPrintDialogData_SetToPage, 2385). --define(wxPrintData_new_0, 2386). --define(wxPrintData_new_1, 2387). --define(wxPrintData_destruct, 2388). --define(wxPrintData_GetCollate, 2389). --define(wxPrintData_GetBin, 2390). --define(wxPrintData_GetColour, 2391). --define(wxPrintData_GetDuplex, 2392). --define(wxPrintData_GetNoCopies, 2393). --define(wxPrintData_GetOrientation, 2394). --define(wxPrintData_GetPaperId, 2395). --define(wxPrintData_GetPrinterName, 2396). --define(wxPrintData_GetQuality, 2397). --define(wxPrintData_IsOk, 2398). --define(wxPrintData_SetBin, 2399). --define(wxPrintData_SetCollate, 2400). --define(wxPrintData_SetColour, 2401). --define(wxPrintData_SetDuplex, 2402). --define(wxPrintData_SetNoCopies, 2403). --define(wxPrintData_SetOrientation, 2404). --define(wxPrintData_SetPaperId, 2405). --define(wxPrintData_SetPrinterName, 2406). --define(wxPrintData_SetQuality, 2407). --define(wxPrintPreview_new_2, 2410). --define(wxPrintPreview_new_3, 2411). --define(wxPrintPreview_destruct, 2413). --define(wxPrintPreview_GetCanvas, 2414). --define(wxPrintPreview_GetCurrentPage, 2415). --define(wxPrintPreview_GetFrame, 2416). --define(wxPrintPreview_GetMaxPage, 2417). --define(wxPrintPreview_GetMinPage, 2418). --define(wxPrintPreview_GetPrintout, 2419). --define(wxPrintPreview_GetPrintoutForPrinting, 2420). --define(wxPrintPreview_IsOk, 2421). --define(wxPrintPreview_PaintPage, 2422). --define(wxPrintPreview_Print, 2423). --define(wxPrintPreview_RenderPage, 2424). --define(wxPrintPreview_SetCanvas, 2425). --define(wxPrintPreview_SetCurrentPage, 2426). --define(wxPrintPreview_SetFrame, 2427). --define(wxPrintPreview_SetPrintout, 2428). --define(wxPrintPreview_SetZoom, 2429). --define(wxPreviewFrame_new, 2430). --define(wxPreviewFrame_destruct, 2431). --define(wxPreviewFrame_CreateControlBar, 2432). --define(wxPreviewFrame_CreateCanvas, 2433). --define(wxPreviewFrame_Initialize, 2434). --define(wxPreviewFrame_OnCloseWindow, 2435). --define(wxPreviewControlBar_new, 2436). --define(wxPreviewControlBar_destruct, 2437). --define(wxPreviewControlBar_CreateButtons, 2438). --define(wxPreviewControlBar_GetPrintPreview, 2439). --define(wxPreviewControlBar_GetZoomControl, 2440). --define(wxPreviewControlBar_SetZoomControl, 2441). --define(wxPrinter_new, 2443). --define(wxPrinter_CreateAbortWindow, 2444). --define(wxPrinter_GetAbort, 2445). --define(wxPrinter_GetLastError, 2446). --define(wxPrinter_GetPrintDialogData, 2447). --define(wxPrinter_Print, 2448). --define(wxPrinter_PrintDialog, 2449). --define(wxPrinter_ReportError, 2450). --define(wxPrinter_Setup, 2451). --define(wxPrinter_destroy, 2452). --define(wxXmlResource_new_1, 2453). --define(wxXmlResource_new_2, 2454). --define(wxXmlResource_destruct, 2455). --define(wxXmlResource_AttachUnknownControl, 2456). --define(wxXmlResource_ClearHandlers, 2457). --define(wxXmlResource_CompareVersion, 2458). --define(wxXmlResource_Get, 2459). --define(wxXmlResource_GetFlags, 2460). --define(wxXmlResource_GetVersion, 2461). --define(wxXmlResource_GetXRCID, 2462). --define(wxXmlResource_InitAllHandlers, 2463). --define(wxXmlResource_Load, 2464). --define(wxXmlResource_LoadBitmap, 2465). --define(wxXmlResource_LoadDialog_2, 2466). --define(wxXmlResource_LoadDialog_3, 2467). --define(wxXmlResource_LoadFrame_2, 2468). --define(wxXmlResource_LoadFrame_3, 2469). --define(wxXmlResource_LoadIcon, 2470). --define(wxXmlResource_LoadMenu, 2471). --define(wxXmlResource_LoadMenuBar_2, 2472). --define(wxXmlResource_LoadMenuBar_1, 2473). --define(wxXmlResource_LoadPanel_2, 2474). --define(wxXmlResource_LoadPanel_3, 2475). --define(wxXmlResource_LoadToolBar, 2476). --define(wxXmlResource_Set, 2477). --define(wxXmlResource_SetFlags, 2478). --define(wxXmlResource_Unload, 2479). --define(wxXmlResource_xrcctrl, 2480). --define(wxHtmlEasyPrinting_new, 2481). --define(wxHtmlEasyPrinting_destruct, 2482). --define(wxHtmlEasyPrinting_GetPrintData, 2483). --define(wxHtmlEasyPrinting_GetPageSetupData, 2484). --define(wxHtmlEasyPrinting_PreviewFile, 2485). --define(wxHtmlEasyPrinting_PreviewText, 2486). --define(wxHtmlEasyPrinting_PrintFile, 2487). --define(wxHtmlEasyPrinting_PrintText, 2488). --define(wxHtmlEasyPrinting_PageSetup, 2489). --define(wxHtmlEasyPrinting_SetFonts, 2490). --define(wxHtmlEasyPrinting_SetHeader, 2491). --define(wxHtmlEasyPrinting_SetFooter, 2492). --define(wxGLCanvas_new_2, 2494). --define(wxGLCanvas_new_3_1, 2495). --define(wxGLCanvas_new_3_0, 2496). --define(wxGLCanvas_GetContext, 2497). --define(wxGLCanvas_SetCurrent, 2499). --define(wxGLCanvas_SwapBuffers, 2500). --define(wxGLCanvas_destroy, 2501). --define(wxAuiManager_new, 2502). --define(wxAuiManager_destruct, 2503). --define(wxAuiManager_AddPane_2_1, 2504). --define(wxAuiManager_AddPane_3, 2505). --define(wxAuiManager_AddPane_2_0, 2506). --define(wxAuiManager_DetachPane, 2507). --define(wxAuiManager_GetAllPanes, 2508). --define(wxAuiManager_GetArtProvider, 2509). --define(wxAuiManager_GetDockSizeConstraint, 2510). --define(wxAuiManager_GetFlags, 2511). --define(wxAuiManager_GetManagedWindow, 2512). --define(wxAuiManager_GetManager, 2513). --define(wxAuiManager_GetPane_1_1, 2514). --define(wxAuiManager_GetPane_1_0, 2515). --define(wxAuiManager_HideHint, 2516). --define(wxAuiManager_InsertPane, 2517). --define(wxAuiManager_LoadPaneInfo, 2518). --define(wxAuiManager_LoadPerspective, 2519). --define(wxAuiManager_SavePaneInfo, 2520). --define(wxAuiManager_SavePerspective, 2521). --define(wxAuiManager_SetArtProvider, 2522). --define(wxAuiManager_SetDockSizeConstraint, 2523). --define(wxAuiManager_SetFlags, 2524). --define(wxAuiManager_SetManagedWindow, 2525). --define(wxAuiManager_ShowHint, 2526). --define(wxAuiManager_UnInit, 2527). --define(wxAuiManager_Update, 2528). --define(wxAuiPaneInfo_BestSize_1, 2529). --define(wxAuiPaneInfo_BestSize_2, 2530). --define(wxAuiPaneInfo_Bottom, 2531). --define(wxAuiPaneInfo_BottomDockable, 2532). --define(wxAuiPaneInfo_Caption, 2533). --define(wxAuiPaneInfo_CaptionVisible, 2534). --define(wxAuiPaneInfo_Centre, 2535). --define(wxAuiPaneInfo_CentrePane, 2536). --define(wxAuiPaneInfo_CloseButton, 2537). --define(wxAuiPaneInfo_DefaultPane, 2538). --define(wxAuiPaneInfo_DestroyOnClose, 2539). --define(wxAuiPaneInfo_Direction, 2540). --define(wxAuiPaneInfo_Dock, 2541). --define(wxAuiPaneInfo_Dockable, 2542). --define(wxAuiPaneInfo_Fixed, 2543). --define(wxAuiPaneInfo_Float, 2544). --define(wxAuiPaneInfo_Floatable, 2545). --define(wxAuiPaneInfo_FloatingPosition_1, 2546). --define(wxAuiPaneInfo_FloatingPosition_2, 2547). --define(wxAuiPaneInfo_FloatingSize_1, 2548). --define(wxAuiPaneInfo_FloatingSize_2, 2549). --define(wxAuiPaneInfo_Gripper, 2550). --define(wxAuiPaneInfo_GripperTop, 2551). --define(wxAuiPaneInfo_HasBorder, 2552). --define(wxAuiPaneInfo_HasCaption, 2553). --define(wxAuiPaneInfo_HasCloseButton, 2554). --define(wxAuiPaneInfo_HasFlag, 2555). --define(wxAuiPaneInfo_HasGripper, 2556). --define(wxAuiPaneInfo_HasGripperTop, 2557). --define(wxAuiPaneInfo_HasMaximizeButton, 2558). --define(wxAuiPaneInfo_HasMinimizeButton, 2559). --define(wxAuiPaneInfo_HasPinButton, 2560). --define(wxAuiPaneInfo_Hide, 2561). --define(wxAuiPaneInfo_IsBottomDockable, 2562). --define(wxAuiPaneInfo_IsDocked, 2563). --define(wxAuiPaneInfo_IsFixed, 2564). --define(wxAuiPaneInfo_IsFloatable, 2565). --define(wxAuiPaneInfo_IsFloating, 2566). --define(wxAuiPaneInfo_IsLeftDockable, 2567). --define(wxAuiPaneInfo_IsMovable, 2568). --define(wxAuiPaneInfo_IsOk, 2569). --define(wxAuiPaneInfo_IsResizable, 2570). --define(wxAuiPaneInfo_IsRightDockable, 2571). --define(wxAuiPaneInfo_IsShown, 2572). --define(wxAuiPaneInfo_IsToolbar, 2573). --define(wxAuiPaneInfo_IsTopDockable, 2574). --define(wxAuiPaneInfo_Layer, 2575). --define(wxAuiPaneInfo_Left, 2576). --define(wxAuiPaneInfo_LeftDockable, 2577). --define(wxAuiPaneInfo_MaxSize_1, 2578). --define(wxAuiPaneInfo_MaxSize_2, 2579). --define(wxAuiPaneInfo_MaximizeButton, 2580). --define(wxAuiPaneInfo_MinSize_1, 2581). --define(wxAuiPaneInfo_MinSize_2, 2582). --define(wxAuiPaneInfo_MinimizeButton, 2583). --define(wxAuiPaneInfo_Movable, 2584). --define(wxAuiPaneInfo_Name, 2585). --define(wxAuiPaneInfo_PaneBorder, 2586). --define(wxAuiPaneInfo_PinButton, 2587). --define(wxAuiPaneInfo_Position, 2588). --define(wxAuiPaneInfo_Resizable, 2589). --define(wxAuiPaneInfo_Right, 2590). --define(wxAuiPaneInfo_RightDockable, 2591). --define(wxAuiPaneInfo_Row, 2592). --define(wxAuiPaneInfo_SafeSet, 2593). --define(wxAuiPaneInfo_SetFlag, 2594). --define(wxAuiPaneInfo_Show, 2595). --define(wxAuiPaneInfo_ToolbarPane, 2596). --define(wxAuiPaneInfo_Top, 2597). --define(wxAuiPaneInfo_TopDockable, 2598). --define(wxAuiPaneInfo_Window, 2599). --define(wxAuiNotebook_new_0, 2600). --define(wxAuiNotebook_new_2, 2601). --define(wxAuiNotebook_AddPage, 2602). --define(wxAuiNotebook_Create, 2603). --define(wxAuiNotebook_DeletePage, 2604). --define(wxAuiNotebook_GetArtProvider, 2605). --define(wxAuiNotebook_GetPage, 2606). --define(wxAuiNotebook_GetPageBitmap, 2607). --define(wxAuiNotebook_GetPageCount, 2608). --define(wxAuiNotebook_GetPageIndex, 2609). --define(wxAuiNotebook_GetPageText, 2610). --define(wxAuiNotebook_GetSelection, 2611). --define(wxAuiNotebook_InsertPage, 2612). --define(wxAuiNotebook_RemovePage, 2613). --define(wxAuiNotebook_SetArtProvider, 2614). --define(wxAuiNotebook_SetFont, 2615). --define(wxAuiNotebook_SetPageBitmap, 2616). --define(wxAuiNotebook_SetPageText, 2617). --define(wxAuiNotebook_SetSelection, 2618). --define(wxAuiNotebook_SetTabCtrlHeight, 2619). --define(wxAuiNotebook_SetUniformBitmapSize, 2620). --define(wxAuiNotebook_destroy, 2621). --define(wxMDIParentFrame_new_0, 2622). --define(wxMDIParentFrame_new_4, 2623). --define(wxMDIParentFrame_destruct, 2624). --define(wxMDIParentFrame_ActivateNext, 2625). --define(wxMDIParentFrame_ActivatePrevious, 2626). --define(wxMDIParentFrame_ArrangeIcons, 2627). --define(wxMDIParentFrame_Cascade, 2628). --define(wxMDIParentFrame_Create, 2629). --define(wxMDIParentFrame_GetActiveChild, 2630). --define(wxMDIParentFrame_GetClientWindow, 2631). --define(wxMDIParentFrame_Tile, 2632). --define(wxMDIChildFrame_new_0, 2633). --define(wxMDIChildFrame_new_4, 2634). --define(wxMDIChildFrame_destruct, 2635). --define(wxMDIChildFrame_Activate, 2636). --define(wxMDIChildFrame_Create, 2637). --define(wxMDIChildFrame_Maximize, 2638). --define(wxMDIChildFrame_Restore, 2639). --define(wxMDIClientWindow_new_0, 2640). --define(wxMDIClientWindow_new_2, 2641). --define(wxMDIClientWindow_destruct, 2642). --define(wxMDIClientWindow_CreateClient, 2643). --define(wxLayoutAlgorithm_new, 2644). --define(wxLayoutAlgorithm_LayoutFrame, 2645). --define(wxLayoutAlgorithm_LayoutMDIFrame, 2646). --define(wxLayoutAlgorithm_LayoutWindow, 2647). --define(wxLayoutAlgorithm_destroy, 2648). --define(wxEvent_GetId, 2649). --define(wxEvent_GetSkipped, 2650). --define(wxEvent_GetTimestamp, 2651). --define(wxEvent_IsCommandEvent, 2652). --define(wxEvent_ResumePropagation, 2653). --define(wxEvent_ShouldPropagate, 2654). --define(wxEvent_Skip, 2655). --define(wxEvent_StopPropagation, 2656). --define(wxCommandEvent_getClientData, 2657). --define(wxCommandEvent_GetExtraLong, 2658). --define(wxCommandEvent_GetInt, 2659). --define(wxCommandEvent_GetSelection, 2660). --define(wxCommandEvent_GetString, 2661). --define(wxCommandEvent_IsChecked, 2662). --define(wxCommandEvent_IsSelection, 2663). --define(wxCommandEvent_SetInt, 2664). --define(wxCommandEvent_SetString, 2665). --define(wxScrollEvent_GetOrientation, 2666). --define(wxScrollEvent_GetPosition, 2667). --define(wxScrollWinEvent_GetOrientation, 2668). --define(wxScrollWinEvent_GetPosition, 2669). --define(wxMouseEvent_AltDown, 2670). --define(wxMouseEvent_Button, 2671). --define(wxMouseEvent_ButtonDClick, 2672). --define(wxMouseEvent_ButtonDown, 2673). --define(wxMouseEvent_ButtonUp, 2674). --define(wxMouseEvent_CmdDown, 2675). --define(wxMouseEvent_ControlDown, 2676). --define(wxMouseEvent_Dragging, 2677). --define(wxMouseEvent_Entering, 2678). --define(wxMouseEvent_GetButton, 2679). --define(wxMouseEvent_GetPosition, 2682). --define(wxMouseEvent_GetLogicalPosition, 2683). --define(wxMouseEvent_GetLinesPerAction, 2684). --define(wxMouseEvent_GetWheelRotation, 2685). --define(wxMouseEvent_GetWheelDelta, 2686). --define(wxMouseEvent_GetX, 2687). --define(wxMouseEvent_GetY, 2688). --define(wxMouseEvent_IsButton, 2689). --define(wxMouseEvent_IsPageScroll, 2690). --define(wxMouseEvent_Leaving, 2691). --define(wxMouseEvent_LeftDClick, 2692). --define(wxMouseEvent_LeftDown, 2693). --define(wxMouseEvent_LeftIsDown, 2694). --define(wxMouseEvent_LeftUp, 2695). --define(wxMouseEvent_MetaDown, 2696). --define(wxMouseEvent_MiddleDClick, 2697). --define(wxMouseEvent_MiddleDown, 2698). --define(wxMouseEvent_MiddleIsDown, 2699). --define(wxMouseEvent_MiddleUp, 2700). --define(wxMouseEvent_Moving, 2701). --define(wxMouseEvent_RightDClick, 2702). --define(wxMouseEvent_RightDown, 2703). --define(wxMouseEvent_RightIsDown, 2704). --define(wxMouseEvent_RightUp, 2705). --define(wxMouseEvent_ShiftDown, 2706). --define(wxSetCursorEvent_GetCursor, 2707). --define(wxSetCursorEvent_GetX, 2708). --define(wxSetCursorEvent_GetY, 2709). --define(wxSetCursorEvent_HasCursor, 2710). --define(wxSetCursorEvent_SetCursor, 2711). --define(wxKeyEvent_AltDown, 2712). --define(wxKeyEvent_CmdDown, 2713). --define(wxKeyEvent_ControlDown, 2714). --define(wxKeyEvent_GetKeyCode, 2715). --define(wxKeyEvent_GetModifiers, 2716). --define(wxKeyEvent_GetPosition, 2719). --define(wxKeyEvent_GetRawKeyCode, 2720). --define(wxKeyEvent_GetRawKeyFlags, 2721). --define(wxKeyEvent_GetUnicodeKey, 2722). --define(wxKeyEvent_GetX, 2723). --define(wxKeyEvent_GetY, 2724). --define(wxKeyEvent_HasModifiers, 2725). --define(wxKeyEvent_MetaDown, 2726). --define(wxKeyEvent_ShiftDown, 2727). --define(wxSizeEvent_GetSize, 2728). --define(wxMoveEvent_GetPosition, 2729). --define(wxEraseEvent_GetDC, 2730). --define(wxFocusEvent_GetWindow, 2731). --define(wxChildFocusEvent_GetWindow, 2732). --define(wxMenuEvent_GetMenu, 2733). --define(wxMenuEvent_GetMenuId, 2734). --define(wxMenuEvent_IsPopup, 2735). --define(wxCloseEvent_CanVeto, 2736). --define(wxCloseEvent_GetLoggingOff, 2737). --define(wxCloseEvent_SetCanVeto, 2738). --define(wxCloseEvent_SetLoggingOff, 2739). --define(wxCloseEvent_Veto, 2740). --define(wxShowEvent_SetShow, 2741). --define(wxShowEvent_GetShow, 2742). --define(wxIconizeEvent_Iconized, 2743). --define(wxJoystickEvent_ButtonDown, 2744). --define(wxJoystickEvent_ButtonIsDown, 2745). --define(wxJoystickEvent_ButtonUp, 2746). --define(wxJoystickEvent_GetButtonChange, 2747). --define(wxJoystickEvent_GetButtonState, 2748). --define(wxJoystickEvent_GetJoystick, 2749). --define(wxJoystickEvent_GetPosition, 2750). --define(wxJoystickEvent_GetZPosition, 2751). --define(wxJoystickEvent_IsButton, 2752). --define(wxJoystickEvent_IsMove, 2753). --define(wxJoystickEvent_IsZMove, 2754). --define(wxUpdateUIEvent_CanUpdate, 2755). --define(wxUpdateUIEvent_Check, 2756). --define(wxUpdateUIEvent_Enable, 2757). --define(wxUpdateUIEvent_Show, 2758). --define(wxUpdateUIEvent_GetChecked, 2759). --define(wxUpdateUIEvent_GetEnabled, 2760). --define(wxUpdateUIEvent_GetShown, 2761). --define(wxUpdateUIEvent_GetSetChecked, 2762). --define(wxUpdateUIEvent_GetSetEnabled, 2763). --define(wxUpdateUIEvent_GetSetShown, 2764). --define(wxUpdateUIEvent_GetSetText, 2765). --define(wxUpdateUIEvent_GetText, 2766). --define(wxUpdateUIEvent_GetMode, 2767). --define(wxUpdateUIEvent_GetUpdateInterval, 2768). --define(wxUpdateUIEvent_ResetUpdateTime, 2769). --define(wxUpdateUIEvent_SetMode, 2770). --define(wxUpdateUIEvent_SetText, 2771). --define(wxUpdateUIEvent_SetUpdateInterval, 2772). --define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2773). --define(wxPaletteChangedEvent_SetChangedWindow, 2774). --define(wxPaletteChangedEvent_GetChangedWindow, 2775). --define(wxQueryNewPaletteEvent_SetPaletteRealized, 2776). --define(wxQueryNewPaletteEvent_GetPaletteRealized, 2777). --define(wxNavigationKeyEvent_GetDirection, 2778). --define(wxNavigationKeyEvent_SetDirection, 2779). --define(wxNavigationKeyEvent_IsWindowChange, 2780). --define(wxNavigationKeyEvent_SetWindowChange, 2781). --define(wxNavigationKeyEvent_IsFromTab, 2782). --define(wxNavigationKeyEvent_SetFromTab, 2783). --define(wxNavigationKeyEvent_GetCurrentFocus, 2784). --define(wxNavigationKeyEvent_SetCurrentFocus, 2785). --define(wxHelpEvent_GetOrigin, 2786). --define(wxHelpEvent_GetPosition, 2787). --define(wxHelpEvent_SetOrigin, 2788). --define(wxHelpEvent_SetPosition, 2789). --define(wxContextMenuEvent_GetPosition, 2790). --define(wxContextMenuEvent_SetPosition, 2791). --define(wxIdleEvent_CanSend, 2792). --define(wxIdleEvent_GetMode, 2793). --define(wxIdleEvent_RequestMore, 2794). --define(wxIdleEvent_MoreRequested, 2795). --define(wxIdleEvent_SetMode, 2796). --define(wxGridEvent_AltDown, 2797). --define(wxGridEvent_ControlDown, 2798). --define(wxGridEvent_GetCol, 2799). --define(wxGridEvent_GetPosition, 2800). --define(wxGridEvent_GetRow, 2801). --define(wxGridEvent_MetaDown, 2802). --define(wxGridEvent_Selecting, 2803). --define(wxGridEvent_ShiftDown, 2804). --define(wxNotifyEvent_Allow, 2805). --define(wxNotifyEvent_IsAllowed, 2806). --define(wxNotifyEvent_Veto, 2807). --define(wxSashEvent_GetEdge, 2808). --define(wxSashEvent_GetDragRect, 2809). --define(wxSashEvent_GetDragStatus, 2810). --define(wxListEvent_GetCacheFrom, 2811). --define(wxListEvent_GetCacheTo, 2812). --define(wxListEvent_GetKeyCode, 2813). --define(wxListEvent_GetIndex, 2814). --define(wxListEvent_GetColumn, 2815). --define(wxListEvent_GetPoint, 2816). --define(wxListEvent_GetLabel, 2817). --define(wxListEvent_GetText, 2818). --define(wxListEvent_GetImage, 2819). --define(wxListEvent_GetData, 2820). --define(wxListEvent_GetMask, 2821). --define(wxListEvent_GetItem, 2822). --define(wxListEvent_IsEditCancelled, 2823). --define(wxDateEvent_GetDate, 2824). --define(wxCalendarEvent_GetWeekDay, 2825). --define(wxFileDirPickerEvent_GetPath, 2826). --define(wxColourPickerEvent_GetColour, 2827). --define(wxFontPickerEvent_GetFont, 2828). --define(wxStyledTextEvent_GetPosition, 2829). --define(wxStyledTextEvent_GetKey, 2830). --define(wxStyledTextEvent_GetModifiers, 2831). --define(wxStyledTextEvent_GetModificationType, 2832). --define(wxStyledTextEvent_GetText, 2833). --define(wxStyledTextEvent_GetLength, 2834). --define(wxStyledTextEvent_GetLinesAdded, 2835). --define(wxStyledTextEvent_GetLine, 2836). --define(wxStyledTextEvent_GetFoldLevelNow, 2837). --define(wxStyledTextEvent_GetFoldLevelPrev, 2838). --define(wxStyledTextEvent_GetMargin, 2839). --define(wxStyledTextEvent_GetMessage, 2840). --define(wxStyledTextEvent_GetWParam, 2841). --define(wxStyledTextEvent_GetLParam, 2842). --define(wxStyledTextEvent_GetListType, 2843). --define(wxStyledTextEvent_GetX, 2844). --define(wxStyledTextEvent_GetY, 2845). --define(wxStyledTextEvent_GetDragText, 2846). --define(wxStyledTextEvent_GetDragAllowMove, 2847). --define(wxStyledTextEvent_GetDragResult, 2848). --define(wxStyledTextEvent_GetShift, 2849). --define(wxStyledTextEvent_GetControl, 2850). --define(wxStyledTextEvent_GetAlt, 2851). --define(utils_wxGetKeyState, 2852). --define(utils_wxGetMousePosition, 2853). --define(utils_wxGetMouseState, 2854). --define(utils_wxSetDetectableAutoRepeat, 2855). --define(utils_wxBell, 2856). --define(utils_wxFindMenuItemId, 2857). --define(utils_wxGenericFindWindowAtPoint, 2858). --define(utils_wxFindWindowAtPoint, 2859). --define(utils_wxBeginBusyCursor, 2860). --define(utils_wxEndBusyCursor, 2861). --define(utils_wxIsBusy, 2862). --define(utils_wxShutdown, 2863). --define(utils_wxShell, 2864). --define(utils_wxLaunchDefaultBrowser, 2865). --define(utils_wxGetEmailAddress, 2866). --define(utils_wxGetUserId, 2867). --define(utils_wxGetHomeDir, 2868). --define(utils_wxNewId, 2869). --define(utils_wxRegisterId, 2870). --define(utils_wxGetCurrentId, 2871). --define(utils_wxGetOsDescription, 2872). --define(utils_wxIsPlatformLittleEndian, 2873). --define(utils_wxIsPlatform64Bit, 2874). --define(wxPrintout_new, 2875). --define(wxPrintout_destruct, 2876). --define(wxPrintout_GetDC, 2877). --define(wxPrintout_GetPageSizeMM, 2878). --define(wxPrintout_GetPageSizePixels, 2879). --define(wxPrintout_GetPaperRectPixels, 2880). --define(wxPrintout_GetPPIPrinter, 2881). --define(wxPrintout_GetPPIScreen, 2882). --define(wxPrintout_GetTitle, 2883). --define(wxPrintout_IsPreview, 2884). --define(wxPrintout_FitThisSizeToPaper, 2885). --define(wxPrintout_FitThisSizeToPage, 2886). --define(wxPrintout_FitThisSizeToPageMargins, 2887). --define(wxPrintout_MapScreenSizeToPaper, 2888). --define(wxPrintout_MapScreenSizeToPage, 2889). --define(wxPrintout_MapScreenSizeToPageMargins, 2890). --define(wxPrintout_MapScreenSizeToDevice, 2891). --define(wxPrintout_GetLogicalPaperRect, 2892). --define(wxPrintout_GetLogicalPageRect, 2893). --define(wxPrintout_GetLogicalPageMarginsRect, 2894). --define(wxPrintout_SetLogicalOrigin, 2895). --define(wxPrintout_OffsetLogicalOrigin, 2896). --define(wxStyledTextCtrl_new_2, 2897). --define(wxStyledTextCtrl_new_0, 2898). --define(wxStyledTextCtrl_destruct, 2899). --define(wxStyledTextCtrl_Create, 2900). --define(wxStyledTextCtrl_AddText, 2901). --define(wxStyledTextCtrl_AddStyledText, 2902). --define(wxStyledTextCtrl_InsertText, 2903). --define(wxStyledTextCtrl_ClearAll, 2904). --define(wxStyledTextCtrl_ClearDocumentStyle, 2905). --define(wxStyledTextCtrl_GetLength, 2906). --define(wxStyledTextCtrl_GetCharAt, 2907). --define(wxStyledTextCtrl_GetCurrentPos, 2908). --define(wxStyledTextCtrl_GetAnchor, 2909). --define(wxStyledTextCtrl_GetStyleAt, 2910). --define(wxStyledTextCtrl_Redo, 2911). --define(wxStyledTextCtrl_SetUndoCollection, 2912). --define(wxStyledTextCtrl_SelectAll, 2913). --define(wxStyledTextCtrl_SetSavePoint, 2914). --define(wxStyledTextCtrl_GetStyledText, 2915). --define(wxStyledTextCtrl_CanRedo, 2916). --define(wxStyledTextCtrl_MarkerLineFromHandle, 2917). --define(wxStyledTextCtrl_MarkerDeleteHandle, 2918). --define(wxStyledTextCtrl_GetUndoCollection, 2919). --define(wxStyledTextCtrl_GetViewWhiteSpace, 2920). --define(wxStyledTextCtrl_SetViewWhiteSpace, 2921). --define(wxStyledTextCtrl_PositionFromPoint, 2922). --define(wxStyledTextCtrl_PositionFromPointClose, 2923). --define(wxStyledTextCtrl_GotoLine, 2924). --define(wxStyledTextCtrl_GotoPos, 2925). --define(wxStyledTextCtrl_SetAnchor, 2926). --define(wxStyledTextCtrl_GetCurLine, 2927). --define(wxStyledTextCtrl_GetEndStyled, 2928). --define(wxStyledTextCtrl_ConvertEOLs, 2929). --define(wxStyledTextCtrl_GetEOLMode, 2930). --define(wxStyledTextCtrl_SetEOLMode, 2931). --define(wxStyledTextCtrl_StartStyling, 2932). --define(wxStyledTextCtrl_SetStyling, 2933). --define(wxStyledTextCtrl_GetBufferedDraw, 2934). --define(wxStyledTextCtrl_SetBufferedDraw, 2935). --define(wxStyledTextCtrl_SetTabWidth, 2936). --define(wxStyledTextCtrl_GetTabWidth, 2937). --define(wxStyledTextCtrl_SetCodePage, 2938). --define(wxStyledTextCtrl_MarkerDefine, 2939). --define(wxStyledTextCtrl_MarkerSetForeground, 2940). --define(wxStyledTextCtrl_MarkerSetBackground, 2941). --define(wxStyledTextCtrl_MarkerAdd, 2942). --define(wxStyledTextCtrl_MarkerDelete, 2943). --define(wxStyledTextCtrl_MarkerDeleteAll, 2944). --define(wxStyledTextCtrl_MarkerGet, 2945). --define(wxStyledTextCtrl_MarkerNext, 2946). --define(wxStyledTextCtrl_MarkerPrevious, 2947). --define(wxStyledTextCtrl_MarkerDefineBitmap, 2948). --define(wxStyledTextCtrl_MarkerAddSet, 2949). --define(wxStyledTextCtrl_MarkerSetAlpha, 2950). --define(wxStyledTextCtrl_SetMarginType, 2951). --define(wxStyledTextCtrl_GetMarginType, 2952). --define(wxStyledTextCtrl_SetMarginWidth, 2953). --define(wxStyledTextCtrl_GetMarginWidth, 2954). --define(wxStyledTextCtrl_SetMarginMask, 2955). --define(wxStyledTextCtrl_GetMarginMask, 2956). --define(wxStyledTextCtrl_SetMarginSensitive, 2957). --define(wxStyledTextCtrl_GetMarginSensitive, 2958). --define(wxStyledTextCtrl_StyleClearAll, 2959). --define(wxStyledTextCtrl_StyleSetForeground, 2960). --define(wxStyledTextCtrl_StyleSetBackground, 2961). --define(wxStyledTextCtrl_StyleSetBold, 2962). --define(wxStyledTextCtrl_StyleSetItalic, 2963). --define(wxStyledTextCtrl_StyleSetSize, 2964). --define(wxStyledTextCtrl_StyleSetFaceName, 2965). --define(wxStyledTextCtrl_StyleSetEOLFilled, 2966). --define(wxStyledTextCtrl_StyleResetDefault, 2967). --define(wxStyledTextCtrl_StyleSetUnderline, 2968). --define(wxStyledTextCtrl_StyleSetCase, 2969). --define(wxStyledTextCtrl_StyleSetHotSpot, 2970). --define(wxStyledTextCtrl_SetSelForeground, 2971). --define(wxStyledTextCtrl_SetSelBackground, 2972). --define(wxStyledTextCtrl_GetSelAlpha, 2973). --define(wxStyledTextCtrl_SetSelAlpha, 2974). --define(wxStyledTextCtrl_SetCaretForeground, 2975). --define(wxStyledTextCtrl_CmdKeyAssign, 2976). --define(wxStyledTextCtrl_CmdKeyClear, 2977). --define(wxStyledTextCtrl_CmdKeyClearAll, 2978). --define(wxStyledTextCtrl_SetStyleBytes, 2979). --define(wxStyledTextCtrl_StyleSetVisible, 2980). --define(wxStyledTextCtrl_GetCaretPeriod, 2981). --define(wxStyledTextCtrl_SetCaretPeriod, 2982). --define(wxStyledTextCtrl_SetWordChars, 2983). --define(wxStyledTextCtrl_BeginUndoAction, 2984). --define(wxStyledTextCtrl_EndUndoAction, 2985). --define(wxStyledTextCtrl_IndicatorSetStyle, 2986). --define(wxStyledTextCtrl_IndicatorGetStyle, 2987). --define(wxStyledTextCtrl_IndicatorSetForeground, 2988). --define(wxStyledTextCtrl_IndicatorGetForeground, 2989). --define(wxStyledTextCtrl_SetWhitespaceForeground, 2990). --define(wxStyledTextCtrl_SetWhitespaceBackground, 2991). --define(wxStyledTextCtrl_GetStyleBits, 2992). --define(wxStyledTextCtrl_SetLineState, 2993). --define(wxStyledTextCtrl_GetLineState, 2994). --define(wxStyledTextCtrl_GetMaxLineState, 2995). --define(wxStyledTextCtrl_GetCaretLineVisible, 2996). --define(wxStyledTextCtrl_SetCaretLineVisible, 2997). --define(wxStyledTextCtrl_GetCaretLineBackground, 2998). --define(wxStyledTextCtrl_SetCaretLineBackground, 2999). --define(wxStyledTextCtrl_AutoCompShow, 3000). --define(wxStyledTextCtrl_AutoCompCancel, 3001). --define(wxStyledTextCtrl_AutoCompActive, 3002). --define(wxStyledTextCtrl_AutoCompPosStart, 3003). --define(wxStyledTextCtrl_AutoCompComplete, 3004). --define(wxStyledTextCtrl_AutoCompStops, 3005). --define(wxStyledTextCtrl_AutoCompSetSeparator, 3006). --define(wxStyledTextCtrl_AutoCompGetSeparator, 3007). --define(wxStyledTextCtrl_AutoCompSelect, 3008). --define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3009). --define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3010). --define(wxStyledTextCtrl_AutoCompSetFillUps, 3011). --define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3012). --define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3013). --define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3014). --define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3015). --define(wxStyledTextCtrl_UserListShow, 3016). --define(wxStyledTextCtrl_AutoCompSetAutoHide, 3017). --define(wxStyledTextCtrl_AutoCompGetAutoHide, 3018). --define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3019). --define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3020). --define(wxStyledTextCtrl_RegisterImage, 3021). --define(wxStyledTextCtrl_ClearRegisteredImages, 3022). --define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3023). --define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3024). --define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3025). --define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3026). --define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3027). --define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3028). --define(wxStyledTextCtrl_SetIndent, 3029). --define(wxStyledTextCtrl_GetIndent, 3030). --define(wxStyledTextCtrl_SetUseTabs, 3031). --define(wxStyledTextCtrl_GetUseTabs, 3032). --define(wxStyledTextCtrl_SetLineIndentation, 3033). --define(wxStyledTextCtrl_GetLineIndentation, 3034). --define(wxStyledTextCtrl_GetLineIndentPosition, 3035). --define(wxStyledTextCtrl_GetColumn, 3036). --define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3037). --define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3038). --define(wxStyledTextCtrl_SetIndentationGuides, 3039). --define(wxStyledTextCtrl_GetIndentationGuides, 3040). --define(wxStyledTextCtrl_SetHighlightGuide, 3041). --define(wxStyledTextCtrl_GetHighlightGuide, 3042). --define(wxStyledTextCtrl_GetLineEndPosition, 3043). --define(wxStyledTextCtrl_GetCodePage, 3044). --define(wxStyledTextCtrl_GetCaretForeground, 3045). --define(wxStyledTextCtrl_GetReadOnly, 3046). --define(wxStyledTextCtrl_SetCurrentPos, 3047). --define(wxStyledTextCtrl_SetSelectionStart, 3048). --define(wxStyledTextCtrl_GetSelectionStart, 3049). --define(wxStyledTextCtrl_SetSelectionEnd, 3050). --define(wxStyledTextCtrl_GetSelectionEnd, 3051). --define(wxStyledTextCtrl_SetPrintMagnification, 3052). --define(wxStyledTextCtrl_GetPrintMagnification, 3053). --define(wxStyledTextCtrl_SetPrintColourMode, 3054). --define(wxStyledTextCtrl_GetPrintColourMode, 3055). --define(wxStyledTextCtrl_FindText, 3056). --define(wxStyledTextCtrl_FormatRange, 3057). --define(wxStyledTextCtrl_GetFirstVisibleLine, 3058). --define(wxStyledTextCtrl_GetLine, 3059). --define(wxStyledTextCtrl_GetLineCount, 3060). --define(wxStyledTextCtrl_SetMarginLeft, 3061). --define(wxStyledTextCtrl_GetMarginLeft, 3062). --define(wxStyledTextCtrl_SetMarginRight, 3063). --define(wxStyledTextCtrl_GetMarginRight, 3064). --define(wxStyledTextCtrl_GetModify, 3065). --define(wxStyledTextCtrl_SetSelection, 3066). --define(wxStyledTextCtrl_GetSelectedText, 3067). --define(wxStyledTextCtrl_GetTextRange, 3068). --define(wxStyledTextCtrl_HideSelection, 3069). --define(wxStyledTextCtrl_LineFromPosition, 3070). --define(wxStyledTextCtrl_PositionFromLine, 3071). --define(wxStyledTextCtrl_LineScroll, 3072). --define(wxStyledTextCtrl_EnsureCaretVisible, 3073). --define(wxStyledTextCtrl_ReplaceSelection, 3074). --define(wxStyledTextCtrl_SetReadOnly, 3075). --define(wxStyledTextCtrl_CanPaste, 3076). --define(wxStyledTextCtrl_CanUndo, 3077). --define(wxStyledTextCtrl_EmptyUndoBuffer, 3078). --define(wxStyledTextCtrl_Undo, 3079). --define(wxStyledTextCtrl_Cut, 3080). --define(wxStyledTextCtrl_Copy, 3081). --define(wxStyledTextCtrl_Paste, 3082). --define(wxStyledTextCtrl_Clear, 3083). --define(wxStyledTextCtrl_SetText, 3084). --define(wxStyledTextCtrl_GetText, 3085). --define(wxStyledTextCtrl_GetTextLength, 3086). --define(wxStyledTextCtrl_GetOvertype, 3087). --define(wxStyledTextCtrl_SetCaretWidth, 3088). --define(wxStyledTextCtrl_GetCaretWidth, 3089). --define(wxStyledTextCtrl_SetTargetStart, 3090). --define(wxStyledTextCtrl_GetTargetStart, 3091). --define(wxStyledTextCtrl_SetTargetEnd, 3092). --define(wxStyledTextCtrl_GetTargetEnd, 3093). --define(wxStyledTextCtrl_ReplaceTarget, 3094). --define(wxStyledTextCtrl_SearchInTarget, 3095). --define(wxStyledTextCtrl_SetSearchFlags, 3096). --define(wxStyledTextCtrl_GetSearchFlags, 3097). --define(wxStyledTextCtrl_CallTipShow, 3098). --define(wxStyledTextCtrl_CallTipCancel, 3099). --define(wxStyledTextCtrl_CallTipActive, 3100). --define(wxStyledTextCtrl_CallTipPosAtStart, 3101). --define(wxStyledTextCtrl_CallTipSetHighlight, 3102). --define(wxStyledTextCtrl_CallTipSetBackground, 3103). --define(wxStyledTextCtrl_CallTipSetForeground, 3104). --define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3105). --define(wxStyledTextCtrl_CallTipUseStyle, 3106). --define(wxStyledTextCtrl_VisibleFromDocLine, 3107). --define(wxStyledTextCtrl_DocLineFromVisible, 3108). --define(wxStyledTextCtrl_WrapCount, 3109). --define(wxStyledTextCtrl_SetFoldLevel, 3110). --define(wxStyledTextCtrl_GetFoldLevel, 3111). --define(wxStyledTextCtrl_GetLastChild, 3112). --define(wxStyledTextCtrl_GetFoldParent, 3113). --define(wxStyledTextCtrl_ShowLines, 3114). --define(wxStyledTextCtrl_HideLines, 3115). --define(wxStyledTextCtrl_GetLineVisible, 3116). --define(wxStyledTextCtrl_SetFoldExpanded, 3117). --define(wxStyledTextCtrl_GetFoldExpanded, 3118). --define(wxStyledTextCtrl_ToggleFold, 3119). --define(wxStyledTextCtrl_EnsureVisible, 3120). --define(wxStyledTextCtrl_SetFoldFlags, 3121). --define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3122). --define(wxStyledTextCtrl_SetTabIndents, 3123). --define(wxStyledTextCtrl_GetTabIndents, 3124). --define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3125). --define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3126). --define(wxStyledTextCtrl_SetMouseDwellTime, 3127). --define(wxStyledTextCtrl_GetMouseDwellTime, 3128). --define(wxStyledTextCtrl_WordStartPosition, 3129). --define(wxStyledTextCtrl_WordEndPosition, 3130). --define(wxStyledTextCtrl_SetWrapMode, 3131). --define(wxStyledTextCtrl_GetWrapMode, 3132). --define(wxStyledTextCtrl_SetWrapVisualFlags, 3133). --define(wxStyledTextCtrl_GetWrapVisualFlags, 3134). --define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3135). --define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3136). --define(wxStyledTextCtrl_SetWrapStartIndent, 3137). --define(wxStyledTextCtrl_GetWrapStartIndent, 3138). --define(wxStyledTextCtrl_SetLayoutCache, 3139). --define(wxStyledTextCtrl_GetLayoutCache, 3140). --define(wxStyledTextCtrl_SetScrollWidth, 3141). --define(wxStyledTextCtrl_GetScrollWidth, 3142). --define(wxStyledTextCtrl_TextWidth, 3143). --define(wxStyledTextCtrl_GetEndAtLastLine, 3144). --define(wxStyledTextCtrl_TextHeight, 3145). --define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3146). --define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3147). --define(wxStyledTextCtrl_AppendText, 3148). --define(wxStyledTextCtrl_GetTwoPhaseDraw, 3149). --define(wxStyledTextCtrl_SetTwoPhaseDraw, 3150). --define(wxStyledTextCtrl_TargetFromSelection, 3151). --define(wxStyledTextCtrl_LinesJoin, 3152). --define(wxStyledTextCtrl_LinesSplit, 3153). --define(wxStyledTextCtrl_SetFoldMarginColour, 3154). --define(wxStyledTextCtrl_SetFoldMarginHiColour, 3155). --define(wxStyledTextCtrl_LineDown, 3156). --define(wxStyledTextCtrl_LineDownExtend, 3157). --define(wxStyledTextCtrl_LineUp, 3158). --define(wxStyledTextCtrl_LineUpExtend, 3159). --define(wxStyledTextCtrl_CharLeft, 3160). --define(wxStyledTextCtrl_CharLeftExtend, 3161). --define(wxStyledTextCtrl_CharRight, 3162). --define(wxStyledTextCtrl_CharRightExtend, 3163). --define(wxStyledTextCtrl_WordLeft, 3164). --define(wxStyledTextCtrl_WordLeftExtend, 3165). --define(wxStyledTextCtrl_WordRight, 3166). --define(wxStyledTextCtrl_WordRightExtend, 3167). --define(wxStyledTextCtrl_Home, 3168). --define(wxStyledTextCtrl_HomeExtend, 3169). --define(wxStyledTextCtrl_LineEnd, 3170). --define(wxStyledTextCtrl_LineEndExtend, 3171). --define(wxStyledTextCtrl_DocumentStart, 3172). --define(wxStyledTextCtrl_DocumentStartExtend, 3173). --define(wxStyledTextCtrl_DocumentEnd, 3174). --define(wxStyledTextCtrl_DocumentEndExtend, 3175). --define(wxStyledTextCtrl_PageUp, 3176). --define(wxStyledTextCtrl_PageUpExtend, 3177). --define(wxStyledTextCtrl_PageDown, 3178). --define(wxStyledTextCtrl_PageDownExtend, 3179). --define(wxStyledTextCtrl_EditToggleOvertype, 3180). --define(wxStyledTextCtrl_Cancel, 3181). --define(wxStyledTextCtrl_DeleteBack, 3182). --define(wxStyledTextCtrl_Tab, 3183). --define(wxStyledTextCtrl_BackTab, 3184). --define(wxStyledTextCtrl_NewLine, 3185). --define(wxStyledTextCtrl_FormFeed, 3186). --define(wxStyledTextCtrl_VCHome, 3187). --define(wxStyledTextCtrl_VCHomeExtend, 3188). --define(wxStyledTextCtrl_ZoomIn, 3189). --define(wxStyledTextCtrl_ZoomOut, 3190). --define(wxStyledTextCtrl_DelWordLeft, 3191). --define(wxStyledTextCtrl_DelWordRight, 3192). --define(wxStyledTextCtrl_LineCut, 3193). --define(wxStyledTextCtrl_LineDelete, 3194). --define(wxStyledTextCtrl_LineTranspose, 3195). --define(wxStyledTextCtrl_LineDuplicate, 3196). --define(wxStyledTextCtrl_LowerCase, 3197). --define(wxStyledTextCtrl_UpperCase, 3198). --define(wxStyledTextCtrl_LineScrollDown, 3199). --define(wxStyledTextCtrl_LineScrollUp, 3200). --define(wxStyledTextCtrl_DeleteBackNotLine, 3201). --define(wxStyledTextCtrl_HomeDisplay, 3202). --define(wxStyledTextCtrl_HomeDisplayExtend, 3203). --define(wxStyledTextCtrl_LineEndDisplay, 3204). --define(wxStyledTextCtrl_LineEndDisplayExtend, 3205). --define(wxStyledTextCtrl_HomeWrapExtend, 3206). --define(wxStyledTextCtrl_LineEndWrap, 3207). --define(wxStyledTextCtrl_LineEndWrapExtend, 3208). --define(wxStyledTextCtrl_VCHomeWrap, 3209). --define(wxStyledTextCtrl_VCHomeWrapExtend, 3210). --define(wxStyledTextCtrl_LineCopy, 3211). --define(wxStyledTextCtrl_MoveCaretInsideView, 3212). --define(wxStyledTextCtrl_LineLength, 3213). --define(wxStyledTextCtrl_BraceHighlight, 3214). --define(wxStyledTextCtrl_BraceBadLight, 3215). --define(wxStyledTextCtrl_BraceMatch, 3216). --define(wxStyledTextCtrl_GetViewEOL, 3217). --define(wxStyledTextCtrl_SetViewEOL, 3218). --define(wxStyledTextCtrl_SetModEventMask, 3219). --define(wxStyledTextCtrl_GetEdgeColumn, 3220). --define(wxStyledTextCtrl_SetEdgeColumn, 3221). --define(wxStyledTextCtrl_GetEdgeMode, 3222). --define(wxStyledTextCtrl_GetEdgeColour, 3223). --define(wxStyledTextCtrl_SetEdgeColour, 3224). --define(wxStyledTextCtrl_SearchAnchor, 3225). --define(wxStyledTextCtrl_SearchNext, 3226). --define(wxStyledTextCtrl_SearchPrev, 3227). --define(wxStyledTextCtrl_LinesOnScreen, 3228). --define(wxStyledTextCtrl_UsePopUp, 3229). --define(wxStyledTextCtrl_SelectionIsRectangle, 3230). --define(wxStyledTextCtrl_SetZoom, 3231). --define(wxStyledTextCtrl_GetZoom, 3232). --define(wxStyledTextCtrl_GetModEventMask, 3233). --define(wxStyledTextCtrl_SetSTCFocus, 3234). --define(wxStyledTextCtrl_GetSTCFocus, 3235). --define(wxStyledTextCtrl_SetStatus, 3236). --define(wxStyledTextCtrl_GetStatus, 3237). --define(wxStyledTextCtrl_SetMouseDownCaptures, 3238). --define(wxStyledTextCtrl_GetMouseDownCaptures, 3239). --define(wxStyledTextCtrl_SetSTCCursor, 3240). --define(wxStyledTextCtrl_GetSTCCursor, 3241). --define(wxStyledTextCtrl_SetControlCharSymbol, 3242). --define(wxStyledTextCtrl_GetControlCharSymbol, 3243). --define(wxStyledTextCtrl_WordPartLeft, 3244). --define(wxStyledTextCtrl_WordPartLeftExtend, 3245). --define(wxStyledTextCtrl_WordPartRight, 3246). --define(wxStyledTextCtrl_WordPartRightExtend, 3247). --define(wxStyledTextCtrl_SetVisiblePolicy, 3248). --define(wxStyledTextCtrl_DelLineLeft, 3249). --define(wxStyledTextCtrl_DelLineRight, 3250). --define(wxStyledTextCtrl_GetXOffset, 3251). --define(wxStyledTextCtrl_ChooseCaretX, 3252). --define(wxStyledTextCtrl_SetXCaretPolicy, 3253). --define(wxStyledTextCtrl_SetYCaretPolicy, 3254). --define(wxStyledTextCtrl_GetPrintWrapMode, 3255). --define(wxStyledTextCtrl_SetHotspotActiveForeground, 3256). --define(wxStyledTextCtrl_SetHotspotActiveBackground, 3257). --define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3258). --define(wxStyledTextCtrl_SetHotspotSingleLine, 3259). --define(wxStyledTextCtrl_ParaDownExtend, 3260). --define(wxStyledTextCtrl_ParaUp, 3261). --define(wxStyledTextCtrl_ParaUpExtend, 3262). --define(wxStyledTextCtrl_PositionBefore, 3263). --define(wxStyledTextCtrl_PositionAfter, 3264). --define(wxStyledTextCtrl_CopyRange, 3265). --define(wxStyledTextCtrl_CopyText, 3266). --define(wxStyledTextCtrl_SetSelectionMode, 3267). --define(wxStyledTextCtrl_GetSelectionMode, 3268). --define(wxStyledTextCtrl_LineDownRectExtend, 3269). --define(wxStyledTextCtrl_LineUpRectExtend, 3270). --define(wxStyledTextCtrl_CharLeftRectExtend, 3271). --define(wxStyledTextCtrl_CharRightRectExtend, 3272). --define(wxStyledTextCtrl_HomeRectExtend, 3273). --define(wxStyledTextCtrl_VCHomeRectExtend, 3274). --define(wxStyledTextCtrl_LineEndRectExtend, 3275). --define(wxStyledTextCtrl_PageUpRectExtend, 3276). --define(wxStyledTextCtrl_PageDownRectExtend, 3277). --define(wxStyledTextCtrl_StutteredPageUp, 3278). --define(wxStyledTextCtrl_StutteredPageUpExtend, 3279). --define(wxStyledTextCtrl_StutteredPageDown, 3280). --define(wxStyledTextCtrl_StutteredPageDownExtend, 3281). --define(wxStyledTextCtrl_WordLeftEnd, 3282). --define(wxStyledTextCtrl_WordLeftEndExtend, 3283). --define(wxStyledTextCtrl_WordRightEnd, 3284). --define(wxStyledTextCtrl_WordRightEndExtend, 3285). --define(wxStyledTextCtrl_SetWhitespaceChars, 3286). --define(wxStyledTextCtrl_SetCharsDefault, 3287). --define(wxStyledTextCtrl_AutoCompGetCurrent, 3288). --define(wxStyledTextCtrl_Allocate, 3289). --define(wxStyledTextCtrl_FindColumn, 3290). --define(wxStyledTextCtrl_GetCaretSticky, 3291). --define(wxStyledTextCtrl_SetCaretSticky, 3292). --define(wxStyledTextCtrl_ToggleCaretSticky, 3293). --define(wxStyledTextCtrl_SetPasteConvertEndings, 3294). --define(wxStyledTextCtrl_GetPasteConvertEndings, 3295). --define(wxStyledTextCtrl_SelectionDuplicate, 3296). --define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3297). --define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3298). --define(wxStyledTextCtrl_StartRecord, 3299). --define(wxStyledTextCtrl_StopRecord, 3300). --define(wxStyledTextCtrl_SetLexer, 3301). --define(wxStyledTextCtrl_GetLexer, 3302). --define(wxStyledTextCtrl_Colourise, 3303). --define(wxStyledTextCtrl_SetProperty, 3304). --define(wxStyledTextCtrl_SetKeyWords, 3305). --define(wxStyledTextCtrl_SetLexerLanguage, 3306). --define(wxStyledTextCtrl_GetProperty, 3307). --define(wxStyledTextCtrl_GetStyleBitsNeeded, 3308). --define(wxStyledTextCtrl_GetCurrentLine, 3309). --define(wxStyledTextCtrl_StyleSetSpec, 3310). --define(wxStyledTextCtrl_StyleSetFont, 3311). --define(wxStyledTextCtrl_StyleSetFontAttr, 3312). --define(wxStyledTextCtrl_StyleSetCharacterSet, 3313). --define(wxStyledTextCtrl_StyleSetFontEncoding, 3314). --define(wxStyledTextCtrl_CmdKeyExecute, 3315). --define(wxStyledTextCtrl_SetMargins, 3316). --define(wxStyledTextCtrl_GetSelection, 3317). --define(wxStyledTextCtrl_PointFromPosition, 3318). --define(wxStyledTextCtrl_ScrollToLine, 3319). --define(wxStyledTextCtrl_ScrollToColumn, 3320). --define(wxStyledTextCtrl_SendMsg, 3321). --define(wxStyledTextCtrl_SetVScrollBar, 3322). --define(wxStyledTextCtrl_SetHScrollBar, 3323). --define(wxStyledTextCtrl_GetLastKeydownProcessed, 3324). --define(wxStyledTextCtrl_SetLastKeydownProcessed, 3325). --define(wxStyledTextCtrl_SaveFile, 3326). --define(wxStyledTextCtrl_LoadFile, 3327). --define(wxStyledTextCtrl_DoDragOver, 3328). --define(wxStyledTextCtrl_DoDropText, 3329). --define(wxStyledTextCtrl_GetUseAntiAliasing, 3330). --define(wxStyledTextCtrl_AddTextRaw, 3331). --define(wxStyledTextCtrl_InsertTextRaw, 3332). --define(wxStyledTextCtrl_GetCurLineRaw, 3333). --define(wxStyledTextCtrl_GetLineRaw, 3334). --define(wxStyledTextCtrl_GetSelectedTextRaw, 3335). --define(wxStyledTextCtrl_GetTextRangeRaw, 3336). --define(wxStyledTextCtrl_SetTextRaw, 3337). --define(wxStyledTextCtrl_GetTextRaw, 3338). --define(wxStyledTextCtrl_AppendTextRaw, 3339). --define(wxArtProvider_GetBitmap, 3340). --define(wxArtProvider_GetIcon, 3341). --define(wxTreeEvent_GetKeyCode, 3342). --define(wxTreeEvent_GetItem, 3343). --define(wxTreeEvent_GetKeyEvent, 3344). --define(wxTreeEvent_GetLabel, 3345). --define(wxTreeEvent_GetOldItem, 3346). --define(wxTreeEvent_GetPoint, 3347). --define(wxTreeEvent_IsEditCancelled, 3348). --define(wxTreeEvent_SetToolTip, 3349). --define(wxNotebookEvent_GetOldSelection, 3350). --define(wxNotebookEvent_GetSelection, 3351). --define(wxNotebookEvent_SetOldSelection, 3352). --define(wxNotebookEvent_SetSelection, 3353). --define(wxFileDataObject_new, 3354). --define(wxFileDataObject_AddFile, 3355). --define(wxFileDataObject_GetFilenames, 3356). --define(wxFileDataObject_destroy, 3357). --define(wxTextDataObject_new, 3358). --define(wxTextDataObject_GetTextLength, 3359). --define(wxTextDataObject_GetText, 3360). --define(wxTextDataObject_SetText, 3361). --define(wxTextDataObject_destroy, 3362). --define(wxBitmapDataObject_new_1_1, 3363). --define(wxBitmapDataObject_new_1_0, 3364). --define(wxBitmapDataObject_GetBitmap, 3365). --define(wxBitmapDataObject_SetBitmap, 3366). --define(wxBitmapDataObject_destroy, 3367). --define(wxClipboard_new, 3369). --define(wxClipboard_destruct, 3370). --define(wxClipboard_AddData, 3371). --define(wxClipboard_Clear, 3372). --define(wxClipboard_Close, 3373). --define(wxClipboard_Flush, 3374). --define(wxClipboard_GetData, 3375). --define(wxClipboard_IsOpened, 3376). --define(wxClipboard_Open, 3377). --define(wxClipboard_SetData, 3378). --define(wxClipboard_UsePrimarySelection, 3380). --define(wxClipboard_IsSupported, 3381). --define(wxClipboard_Get, 3382). --define(wxSpinEvent_GetPosition, 3383). --define(wxSpinEvent_SetPosition, 3384). --define(wxSplitterWindow_new_0, 3385). --define(wxSplitterWindow_new_2, 3386). --define(wxSplitterWindow_destruct, 3387). --define(wxSplitterWindow_Create, 3388). --define(wxSplitterWindow_GetMinimumPaneSize, 3389). --define(wxSplitterWindow_GetSashGravity, 3390). --define(wxSplitterWindow_GetSashPosition, 3391). --define(wxSplitterWindow_GetSplitMode, 3392). --define(wxSplitterWindow_GetWindow1, 3393). --define(wxSplitterWindow_GetWindow2, 3394). --define(wxSplitterWindow_Initialize, 3395). --define(wxSplitterWindow_IsSplit, 3396). --define(wxSplitterWindow_ReplaceWindow, 3397). --define(wxSplitterWindow_SetSashGravity, 3398). --define(wxSplitterWindow_SetSashPosition, 3399). --define(wxSplitterWindow_SetSashSize, 3400). --define(wxSplitterWindow_SetMinimumPaneSize, 3401). --define(wxSplitterWindow_SetSplitMode, 3402). --define(wxSplitterWindow_SplitHorizontally, 3403). --define(wxSplitterWindow_SplitVertically, 3404). --define(wxSplitterWindow_Unsplit, 3405). --define(wxSplitterWindow_UpdateSize, 3406). --define(wxSplitterEvent_GetSashPosition, 3407). --define(wxSplitterEvent_GetX, 3408). --define(wxSplitterEvent_GetY, 3409). --define(wxSplitterEvent_GetWindowBeingRemoved, 3410). --define(wxSplitterEvent_SetSashPosition, 3411). +-define(wxGridCellEditor_Create, 560). +-define(wxGridCellEditor_IsCreated, 561). +-define(wxGridCellEditor_SetSize, 562). +-define(wxGridCellEditor_Show, 563). +-define(wxGridCellEditor_PaintBackground, 564). +-define(wxGridCellEditor_BeginEdit, 565). +-define(wxGridCellEditor_EndEdit, 566). +-define(wxGridCellEditor_Reset, 567). +-define(wxGridCellEditor_StartingKey, 568). +-define(wxGridCellEditor_StartingClick, 569). +-define(wxGridCellEditor_HandleReturn, 570). +-define(wxGridCellBoolRenderer_new, 571). +-define(wxGridCellBoolRenderer_destroy, 572). +-define(wxGridCellBoolEditor_new, 573). +-define(wxGridCellBoolEditor_IsTrueValue, 574). +-define(wxGridCellBoolEditor_UseStringValues, 575). +-define(wxGridCellBoolEditor_destroy, 576). +-define(wxGridCellFloatRenderer_new, 577). +-define(wxGridCellFloatRenderer_GetPrecision, 578). +-define(wxGridCellFloatRenderer_GetWidth, 579). +-define(wxGridCellFloatRenderer_SetParameters, 580). +-define(wxGridCellFloatRenderer_SetPrecision, 581). +-define(wxGridCellFloatRenderer_SetWidth, 582). +-define(wxGridCellFloatRenderer_destroy, 583). +-define(wxGridCellFloatEditor_new, 584). +-define(wxGridCellFloatEditor_SetParameters, 585). +-define(wxGridCellFloatEditor_destroy, 586). +-define(wxGridCellStringRenderer_new, 587). +-define(wxGridCellStringRenderer_destroy, 588). +-define(wxGridCellTextEditor_new, 589). +-define(wxGridCellTextEditor_SetParameters, 590). +-define(wxGridCellTextEditor_destroy, 591). +-define(wxGridCellChoiceEditor_new, 593). +-define(wxGridCellChoiceEditor_SetParameters, 594). +-define(wxGridCellChoiceEditor_destroy, 595). +-define(wxGridCellNumberRenderer_new, 596). +-define(wxGridCellNumberRenderer_destroy, 597). +-define(wxGridCellNumberEditor_new, 598). +-define(wxGridCellNumberEditor_GetValue, 599). +-define(wxGridCellNumberEditor_SetParameters, 600). +-define(wxGridCellNumberEditor_destroy, 601). +-define(wxGridCellAttr_SetTextColour, 602). +-define(wxGridCellAttr_SetBackgroundColour, 603). +-define(wxGridCellAttr_SetFont, 604). +-define(wxGridCellAttr_SetAlignment, 605). +-define(wxGridCellAttr_SetReadOnly, 606). +-define(wxGridCellAttr_SetRenderer, 607). +-define(wxGridCellAttr_SetEditor, 608). +-define(wxGridCellAttr_HasTextColour, 609). +-define(wxGridCellAttr_HasBackgroundColour, 610). +-define(wxGridCellAttr_HasFont, 611). +-define(wxGridCellAttr_HasAlignment, 612). +-define(wxGridCellAttr_HasRenderer, 613). +-define(wxGridCellAttr_HasEditor, 614). +-define(wxGridCellAttr_GetTextColour, 615). +-define(wxGridCellAttr_GetBackgroundColour, 616). +-define(wxGridCellAttr_GetFont, 617). +-define(wxGridCellAttr_GetAlignment, 618). +-define(wxGridCellAttr_GetRenderer, 619). +-define(wxGridCellAttr_GetEditor, 620). +-define(wxGridCellAttr_IsReadOnly, 621). +-define(wxGridCellAttr_SetDefAttr, 622). +-define(wxDC_Blit, 623). +-define(wxDC_CalcBoundingBox, 624). +-define(wxDC_Clear, 625). +-define(wxDC_ComputeScaleAndOrigin, 626). +-define(wxDC_CrossHair, 627). +-define(wxDC_DestroyClippingRegion, 628). +-define(wxDC_DeviceToLogicalX, 629). +-define(wxDC_DeviceToLogicalXRel, 630). +-define(wxDC_DeviceToLogicalY, 631). +-define(wxDC_DeviceToLogicalYRel, 632). +-define(wxDC_DrawArc, 633). +-define(wxDC_DrawBitmap, 634). +-define(wxDC_DrawCheckMark, 635). +-define(wxDC_DrawCircle, 636). +-define(wxDC_DrawEllipse_2, 638). +-define(wxDC_DrawEllipse_1, 639). +-define(wxDC_DrawEllipticArc, 640). +-define(wxDC_DrawIcon, 641). +-define(wxDC_DrawLabel, 642). +-define(wxDC_DrawLine, 643). +-define(wxDC_DrawLines, 644). +-define(wxDC_DrawPolygon, 646). +-define(wxDC_DrawPoint, 648). +-define(wxDC_DrawRectangle_2, 650). +-define(wxDC_DrawRectangle_1, 651). +-define(wxDC_DrawRotatedText, 652). +-define(wxDC_DrawRoundedRectangle_3, 654). +-define(wxDC_DrawRoundedRectangle_2, 655). +-define(wxDC_DrawText, 656). +-define(wxDC_EndDoc, 657). +-define(wxDC_EndPage, 658). +-define(wxDC_FloodFill, 659). +-define(wxDC_GetBackground, 660). +-define(wxDC_GetBackgroundMode, 661). +-define(wxDC_GetBrush, 662). +-define(wxDC_GetCharHeight, 663). +-define(wxDC_GetCharWidth, 664). +-define(wxDC_GetClippingBox, 665). +-define(wxDC_GetFont, 666). +-define(wxDC_GetLayoutDirection, 667). +-define(wxDC_GetLogicalFunction, 668). +-define(wxDC_GetMapMode, 669). +-define(wxDC_GetMultiLineTextExtent_4, 670). +-define(wxDC_GetMultiLineTextExtent_1, 671). +-define(wxDC_GetPartialTextExtents, 672). +-define(wxDC_GetPen, 673). +-define(wxDC_GetPixel, 674). +-define(wxDC_GetPPI, 675). +-define(wxDC_GetSize, 677). +-define(wxDC_GetSizeMM, 679). +-define(wxDC_GetTextBackground, 680). +-define(wxDC_GetTextExtent_4, 681). +-define(wxDC_GetTextExtent_1, 682). +-define(wxDC_GetTextForeground, 684). +-define(wxDC_GetUserScale, 685). +-define(wxDC_GradientFillConcentric_3, 686). +-define(wxDC_GradientFillConcentric_4, 687). +-define(wxDC_GradientFillLinear, 688). +-define(wxDC_LogicalToDeviceX, 689). +-define(wxDC_LogicalToDeviceXRel, 690). +-define(wxDC_LogicalToDeviceY, 691). +-define(wxDC_LogicalToDeviceYRel, 692). +-define(wxDC_MaxX, 693). +-define(wxDC_MaxY, 694). +-define(wxDC_MinX, 695). +-define(wxDC_MinY, 696). +-define(wxDC_IsOk, 697). +-define(wxDC_ResetBoundingBox, 698). +-define(wxDC_SetAxisOrientation, 699). +-define(wxDC_SetBackground, 700). +-define(wxDC_SetBackgroundMode, 701). +-define(wxDC_SetBrush, 702). +-define(wxDC_SetClippingRegion_2, 704). +-define(wxDC_SetClippingRegion_1_1, 705). +-define(wxDC_SetClippingRegion_1_0, 706). +-define(wxDC_SetDeviceOrigin, 707). +-define(wxDC_SetFont, 708). +-define(wxDC_SetLayoutDirection, 709). +-define(wxDC_SetLogicalFunction, 710). +-define(wxDC_SetMapMode, 711). +-define(wxDC_SetPalette, 712). +-define(wxDC_SetPen, 713). +-define(wxDC_SetTextBackground, 714). +-define(wxDC_SetTextForeground, 715). +-define(wxDC_SetUserScale, 716). +-define(wxDC_StartDoc, 717). +-define(wxDC_StartPage, 718). +-define(wxMirrorDC_new, 719). +-define(wxMirrorDC_destroy, 720). +-define(wxScreenDC_new, 721). +-define(wxScreenDC_destruct, 722). +-define(wxPostScriptDC_new_0, 723). +-define(wxPostScriptDC_new_1, 724). +-define(wxPostScriptDC_destruct, 725). +-define(wxPostScriptDC_SetResolution, 726). +-define(wxPostScriptDC_GetResolution, 727). +-define(wxWindowDC_new_0, 728). +-define(wxWindowDC_new_1, 729). +-define(wxWindowDC_destruct, 730). +-define(wxClientDC_new_0, 731). +-define(wxClientDC_new_1, 732). +-define(wxClientDC_destroy, 733). +-define(wxPaintDC_new_0, 734). +-define(wxPaintDC_new_1, 735). +-define(wxPaintDC_destroy, 736). +-define(wxMemoryDC_new_1_0, 738). +-define(wxMemoryDC_new_1_1, 739). +-define(wxMemoryDC_new_0, 740). +-define(wxMemoryDC_destruct, 742). +-define(wxMemoryDC_SelectObject, 743). +-define(wxMemoryDC_SelectObjectAsSource, 744). +-define(wxBufferedDC_new_0, 745). +-define(wxBufferedDC_new_2, 746). +-define(wxBufferedDC_new_3, 747). +-define(wxBufferedDC_destruct, 748). +-define(wxBufferedDC_Init_2, 749). +-define(wxBufferedDC_Init_3, 750). +-define(wxBufferedPaintDC_new_3, 751). +-define(wxBufferedPaintDC_new_2, 752). +-define(wxBufferedPaintDC_destruct, 753). +-define(wxGraphicsObject_GetRenderer, 754). +-define(wxGraphicsObject_IsNull, 755). +-define(wxGraphicsContext_Create_1_1, 756). +-define(wxGraphicsContext_Create_1_0, 757). +-define(wxGraphicsContext_Create_0, 758). +-define(wxGraphicsContext_CreatePen, 759). +-define(wxGraphicsContext_CreateBrush, 760). +-define(wxGraphicsContext_CreateRadialGradientBrush, 761). +-define(wxGraphicsContext_CreateLinearGradientBrush, 762). +-define(wxGraphicsContext_CreateFont, 763). +-define(wxGraphicsContext_CreateMatrix, 764). +-define(wxGraphicsContext_CreatePath, 765). +-define(wxGraphicsContext_Clip_1, 766). +-define(wxGraphicsContext_Clip_4, 767). +-define(wxGraphicsContext_ResetClip, 768). +-define(wxGraphicsContext_DrawBitmap, 769). +-define(wxGraphicsContext_DrawEllipse, 770). +-define(wxGraphicsContext_DrawIcon, 771). +-define(wxGraphicsContext_DrawLines, 772). +-define(wxGraphicsContext_DrawPath, 773). +-define(wxGraphicsContext_DrawRectangle, 774). +-define(wxGraphicsContext_DrawRoundedRectangle, 775). +-define(wxGraphicsContext_DrawText_3, 776). +-define(wxGraphicsContext_DrawText_4_0, 777). +-define(wxGraphicsContext_DrawText_4_1, 778). +-define(wxGraphicsContext_DrawText_5, 779). +-define(wxGraphicsContext_FillPath, 780). +-define(wxGraphicsContext_StrokePath, 781). +-define(wxGraphicsContext_GetNativeContext, 782). +-define(wxGraphicsContext_GetPartialTextExtents, 783). +-define(wxGraphicsContext_GetTextExtent, 784). +-define(wxGraphicsContext_Rotate, 785). +-define(wxGraphicsContext_Scale, 786). +-define(wxGraphicsContext_Translate, 787). +-define(wxGraphicsContext_GetTransform, 788). +-define(wxGraphicsContext_SetTransform, 789). +-define(wxGraphicsContext_ConcatTransform, 790). +-define(wxGraphicsContext_SetBrush_1_1, 791). +-define(wxGraphicsContext_SetBrush_1_0, 792). +-define(wxGraphicsContext_SetFont_1, 793). +-define(wxGraphicsContext_SetFont_2, 794). +-define(wxGraphicsContext_SetPen_1_0, 795). +-define(wxGraphicsContext_SetPen_1_1, 796). +-define(wxGraphicsContext_StrokeLine, 797). +-define(wxGraphicsContext_StrokeLines_2, 798). +-define(wxGraphicsContext_StrokeLines_3, 799). +-define(wxGraphicsMatrix_Concat, 800). +-define(wxGraphicsMatrix_Get, 802). +-define(wxGraphicsMatrix_GetNativeMatrix, 803). +-define(wxGraphicsMatrix_Invert, 804). +-define(wxGraphicsMatrix_IsEqual, 805). +-define(wxGraphicsMatrix_IsIdentity, 807). +-define(wxGraphicsMatrix_Rotate, 808). +-define(wxGraphicsMatrix_Scale, 809). +-define(wxGraphicsMatrix_Translate, 810). +-define(wxGraphicsMatrix_Set, 811). +-define(wxGraphicsMatrix_TransformPoint, 812). +-define(wxGraphicsMatrix_TransformDistance, 813). +-define(wxGraphicsPath_MoveToPoint_2, 814). +-define(wxGraphicsPath_MoveToPoint_1, 815). +-define(wxGraphicsPath_AddArc_6, 816). +-define(wxGraphicsPath_AddArc_5, 817). +-define(wxGraphicsPath_AddArcToPoint, 818). +-define(wxGraphicsPath_AddCircle, 819). +-define(wxGraphicsPath_AddCurveToPoint_6, 820). +-define(wxGraphicsPath_AddCurveToPoint_3, 821). +-define(wxGraphicsPath_AddEllipse, 822). +-define(wxGraphicsPath_AddLineToPoint_2, 823). +-define(wxGraphicsPath_AddLineToPoint_1, 824). +-define(wxGraphicsPath_AddPath, 825). +-define(wxGraphicsPath_AddQuadCurveToPoint, 826). +-define(wxGraphicsPath_AddRectangle, 827). +-define(wxGraphicsPath_AddRoundedRectangle, 828). +-define(wxGraphicsPath_CloseSubpath, 829). +-define(wxGraphicsPath_Contains_3, 830). +-define(wxGraphicsPath_Contains_2, 831). +-define(wxGraphicsPath_GetBox, 833). +-define(wxGraphicsPath_GetCurrentPoint, 835). +-define(wxGraphicsPath_Transform, 836). +-define(wxGraphicsRenderer_GetDefaultRenderer, 837). +-define(wxGraphicsRenderer_CreateContext_1_1, 838). +-define(wxGraphicsRenderer_CreateContext_1_0, 839). +-define(wxGraphicsRenderer_CreatePen, 840). +-define(wxGraphicsRenderer_CreateBrush, 841). +-define(wxGraphicsRenderer_CreateLinearGradientBrush, 842). +-define(wxGraphicsRenderer_CreateRadialGradientBrush, 843). +-define(wxGraphicsRenderer_CreateFont, 844). +-define(wxGraphicsRenderer_CreateMatrix, 845). +-define(wxGraphicsRenderer_CreatePath, 846). +-define(wxMenuBar_new_1, 848). +-define(wxMenuBar_new_0, 850). +-define(wxMenuBar_destruct, 852). +-define(wxMenuBar_Append, 853). +-define(wxMenuBar_Check, 854). +-define(wxMenuBar_Enable_2, 855). +-define(wxMenuBar_Enable_1, 856). +-define(wxMenuBar_EnableTop, 857). +-define(wxMenuBar_FindMenu, 858). +-define(wxMenuBar_FindMenuItem, 859). +-define(wxMenuBar_FindItem, 860). +-define(wxMenuBar_GetHelpString, 861). +-define(wxMenuBar_GetLabel_1, 862). +-define(wxMenuBar_GetLabel_0, 863). +-define(wxMenuBar_GetLabelTop, 864). +-define(wxMenuBar_GetMenu, 865). +-define(wxMenuBar_GetMenuCount, 866). +-define(wxMenuBar_Insert, 867). +-define(wxMenuBar_IsChecked, 868). +-define(wxMenuBar_IsEnabled_1, 869). +-define(wxMenuBar_IsEnabled_0, 870). +-define(wxMenuBar_Remove, 871). +-define(wxMenuBar_Replace, 872). +-define(wxMenuBar_SetHelpString, 873). +-define(wxMenuBar_SetLabel_2, 874). +-define(wxMenuBar_SetLabel_1, 875). +-define(wxMenuBar_SetLabelTop, 876). +-define(wxControl_GetLabel, 877). +-define(wxControl_SetLabel, 878). +-define(wxControlWithItems_Append_1, 879). +-define(wxControlWithItems_Append_2, 880). +-define(wxControlWithItems_appendStrings_1, 881). +-define(wxControlWithItems_Clear, 882). +-define(wxControlWithItems_Delete, 883). +-define(wxControlWithItems_FindString, 884). +-define(wxControlWithItems_getClientData, 886). +-define(wxControlWithItems_setClientData, 888). +-define(wxControlWithItems_GetCount, 889). +-define(wxControlWithItems_GetSelection, 890). +-define(wxControlWithItems_GetString, 891). +-define(wxControlWithItems_GetStringSelection, 892). +-define(wxControlWithItems_Insert_2, 893). +-define(wxControlWithItems_Insert_3, 894). +-define(wxControlWithItems_IsEmpty, 895). +-define(wxControlWithItems_Select, 896). +-define(wxControlWithItems_SetSelection, 897). +-define(wxControlWithItems_SetString, 898). +-define(wxControlWithItems_SetStringSelection, 899). +-define(wxMenu_new_2, 902). +-define(wxMenu_new_1, 903). +-define(wxMenu_destruct, 905). +-define(wxMenu_Append_3, 906). +-define(wxMenu_Append_1, 907). +-define(wxMenu_Append_4_0, 908). +-define(wxMenu_Append_4_1, 909). +-define(wxMenu_AppendCheckItem, 910). +-define(wxMenu_AppendRadioItem, 911). +-define(wxMenu_AppendSeparator, 912). +-define(wxMenu_Break, 913). +-define(wxMenu_Check, 914). +-define(wxMenu_Delete_1_0, 915). +-define(wxMenu_Delete_1_1, 916). +-define(wxMenu_Destroy_1_0, 917). +-define(wxMenu_Destroy_1_1, 918). +-define(wxMenu_Enable, 919). +-define(wxMenu_FindItem_1, 920). +-define(wxMenu_FindItem_2, 921). +-define(wxMenu_FindItemByPosition, 922). +-define(wxMenu_GetHelpString, 923). +-define(wxMenu_GetLabel, 924). +-define(wxMenu_GetMenuItemCount, 925). +-define(wxMenu_GetMenuItems, 926). +-define(wxMenu_GetTitle, 928). +-define(wxMenu_Insert_2, 929). +-define(wxMenu_Insert_3, 930). +-define(wxMenu_Insert_5_1, 931). +-define(wxMenu_Insert_5_0, 932). +-define(wxMenu_InsertCheckItem, 933). +-define(wxMenu_InsertRadioItem, 934). +-define(wxMenu_InsertSeparator, 935). +-define(wxMenu_IsChecked, 936). +-define(wxMenu_IsEnabled, 937). +-define(wxMenu_Prepend_1, 938). +-define(wxMenu_Prepend_2, 939). +-define(wxMenu_Prepend_4_1, 940). +-define(wxMenu_Prepend_4_0, 941). +-define(wxMenu_PrependCheckItem, 942). +-define(wxMenu_PrependRadioItem, 943). +-define(wxMenu_PrependSeparator, 944). +-define(wxMenu_Remove_1_0, 945). +-define(wxMenu_Remove_1_1, 946). +-define(wxMenu_SetHelpString, 947). +-define(wxMenu_SetLabel, 948). +-define(wxMenu_SetTitle, 949). +-define(wxMenuItem_new, 950). +-define(wxMenuItem_destruct, 952). +-define(wxMenuItem_Check, 953). +-define(wxMenuItem_Enable, 954). +-define(wxMenuItem_GetBitmap, 955). +-define(wxMenuItem_GetHelp, 956). +-define(wxMenuItem_GetId, 957). +-define(wxMenuItem_GetKind, 958). +-define(wxMenuItem_GetLabel, 959). +-define(wxMenuItem_GetLabelFromText, 960). +-define(wxMenuItem_GetMenu, 961). +-define(wxMenuItem_GetText, 962). +-define(wxMenuItem_GetSubMenu, 963). +-define(wxMenuItem_IsCheckable, 964). +-define(wxMenuItem_IsChecked, 965). +-define(wxMenuItem_IsEnabled, 966). +-define(wxMenuItem_IsSeparator, 967). +-define(wxMenuItem_IsSubMenu, 968). +-define(wxMenuItem_SetBitmap, 969). +-define(wxMenuItem_SetHelp, 970). +-define(wxMenuItem_SetMenu, 971). +-define(wxMenuItem_SetSubMenu, 972). +-define(wxMenuItem_SetText, 973). +-define(wxToolBar_AddControl, 974). +-define(wxToolBar_AddSeparator, 975). +-define(wxToolBar_AddTool_5, 976). +-define(wxToolBar_AddTool_4_0, 977). +-define(wxToolBar_AddTool_1, 978). +-define(wxToolBar_AddTool_4_1, 979). +-define(wxToolBar_AddTool_3, 980). +-define(wxToolBar_AddTool_6, 981). +-define(wxToolBar_AddCheckTool, 982). +-define(wxToolBar_AddRadioTool, 983). +-define(wxToolBar_DeleteTool, 984). +-define(wxToolBar_DeleteToolByPos, 985). +-define(wxToolBar_EnableTool, 986). +-define(wxToolBar_FindById, 987). +-define(wxToolBar_FindControl, 988). +-define(wxToolBar_FindToolForPosition, 989). +-define(wxToolBar_GetToolSize, 990). +-define(wxToolBar_GetToolBitmapSize, 991). +-define(wxToolBar_GetMargins, 992). +-define(wxToolBar_GetToolEnabled, 993). +-define(wxToolBar_GetToolLongHelp, 994). +-define(wxToolBar_GetToolPacking, 995). +-define(wxToolBar_GetToolPos, 996). +-define(wxToolBar_GetToolSeparation, 997). +-define(wxToolBar_GetToolShortHelp, 998). +-define(wxToolBar_GetToolState, 999). +-define(wxToolBar_InsertControl, 1000). +-define(wxToolBar_InsertSeparator, 1001). +-define(wxToolBar_InsertTool_5, 1002). +-define(wxToolBar_InsertTool_2, 1003). +-define(wxToolBar_InsertTool_4, 1004). +-define(wxToolBar_Realize, 1005). +-define(wxToolBar_RemoveTool, 1006). +-define(wxToolBar_SetMargins, 1007). +-define(wxToolBar_SetToolBitmapSize, 1008). +-define(wxToolBar_SetToolLongHelp, 1009). +-define(wxToolBar_SetToolPacking, 1010). +-define(wxToolBar_SetToolShortHelp, 1011). +-define(wxToolBar_SetToolSeparation, 1012). +-define(wxToolBar_ToggleTool, 1013). +-define(wxStatusBar_new_0, 1015). +-define(wxStatusBar_new_2, 1016). +-define(wxStatusBar_destruct, 1018). +-define(wxStatusBar_Create, 1019). +-define(wxStatusBar_GetFieldRect, 1020). +-define(wxStatusBar_GetFieldsCount, 1021). +-define(wxStatusBar_GetStatusText, 1022). +-define(wxStatusBar_PopStatusText, 1023). +-define(wxStatusBar_PushStatusText, 1024). +-define(wxStatusBar_SetFieldsCount, 1025). +-define(wxStatusBar_SetMinHeight, 1026). +-define(wxStatusBar_SetStatusText, 1027). +-define(wxStatusBar_SetStatusWidths, 1028). +-define(wxStatusBar_SetStatusStyles, 1029). +-define(wxBitmap_new_0, 1030). +-define(wxBitmap_new_3, 1031). +-define(wxBitmap_new_4, 1032). +-define(wxBitmap_new_2_0, 1033). +-define(wxBitmap_new_2_1, 1034). +-define(wxBitmap_destruct, 1035). +-define(wxBitmap_ConvertToImage, 1036). +-define(wxBitmap_CopyFromIcon, 1037). +-define(wxBitmap_Create, 1038). +-define(wxBitmap_GetDepth, 1039). +-define(wxBitmap_GetHeight, 1040). +-define(wxBitmap_GetPalette, 1041). +-define(wxBitmap_GetMask, 1042). +-define(wxBitmap_GetWidth, 1043). +-define(wxBitmap_GetSubBitmap, 1044). +-define(wxBitmap_LoadFile, 1045). +-define(wxBitmap_Ok, 1046). +-define(wxBitmap_SaveFile, 1047). +-define(wxBitmap_SetDepth, 1048). +-define(wxBitmap_SetHeight, 1049). +-define(wxBitmap_SetMask, 1050). +-define(wxBitmap_SetPalette, 1051). +-define(wxBitmap_SetWidth, 1052). +-define(wxIcon_new_0, 1053). +-define(wxIcon_new_2, 1054). +-define(wxIcon_new_1, 1055). +-define(wxIcon_CopyFromBitmap, 1056). +-define(wxIcon_destroy, 1057). +-define(wxIconBundle_new_0, 1058). +-define(wxIconBundle_new_2, 1059). +-define(wxIconBundle_new_1_0, 1060). +-define(wxIconBundle_new_1_1, 1061). +-define(wxIconBundle_destruct, 1062). +-define(wxIconBundle_AddIcon_2, 1063). +-define(wxIconBundle_AddIcon_1, 1064). +-define(wxIconBundle_GetIcon_1_1, 1065). +-define(wxIconBundle_GetIcon_1_0, 1066). +-define(wxCursor_new_0, 1067). +-define(wxCursor_new_1_0, 1068). +-define(wxCursor_new_1_1, 1069). +-define(wxCursor_new_4, 1070). +-define(wxCursor_destruct, 1071). +-define(wxCursor_Ok, 1072). +-define(wxMask_new_0, 1073). +-define(wxMask_new_2_1, 1074). +-define(wxMask_new_2_0, 1075). +-define(wxMask_new_1, 1076). +-define(wxMask_destruct, 1077). +-define(wxMask_Create_2_1, 1078). +-define(wxMask_Create_2_0, 1079). +-define(wxMask_Create_1, 1080). +-define(wxImage_new_0, 1081). +-define(wxImage_new_3_0, 1082). +-define(wxImage_new_4, 1083). +-define(wxImage_new_5, 1084). +-define(wxImage_new_2, 1085). +-define(wxImage_new_3_1, 1086). +-define(wxImage_Blur, 1087). +-define(wxImage_BlurHorizontal, 1088). +-define(wxImage_BlurVertical, 1089). +-define(wxImage_ConvertAlphaToMask, 1090). +-define(wxImage_ConvertToGreyscale, 1091). +-define(wxImage_ConvertToMono, 1092). +-define(wxImage_Copy, 1093). +-define(wxImage_Create_3, 1094). +-define(wxImage_Create_4, 1095). +-define(wxImage_Create_5, 1096). +-define(wxImage_Destroy, 1097). +-define(wxImage_FindFirstUnusedColour, 1098). +-define(wxImage_GetImageExtWildcard, 1099). +-define(wxImage_GetAlpha_2, 1100). +-define(wxImage_GetAlpha_0, 1101). +-define(wxImage_GetBlue, 1102). +-define(wxImage_GetData, 1103). +-define(wxImage_GetGreen, 1104). +-define(wxImage_GetImageCount, 1105). +-define(wxImage_GetHeight, 1106). +-define(wxImage_GetMaskBlue, 1107). +-define(wxImage_GetMaskGreen, 1108). +-define(wxImage_GetMaskRed, 1109). +-define(wxImage_GetOrFindMaskColour, 1110). +-define(wxImage_GetPalette, 1111). +-define(wxImage_GetRed, 1112). +-define(wxImage_GetSubImage, 1113). +-define(wxImage_GetWidth, 1114). +-define(wxImage_HasAlpha, 1115). +-define(wxImage_HasMask, 1116). +-define(wxImage_GetOption, 1117). +-define(wxImage_GetOptionInt, 1118). +-define(wxImage_HasOption, 1119). +-define(wxImage_InitAlpha, 1120). +-define(wxImage_InitStandardHandlers, 1121). +-define(wxImage_IsTransparent, 1122). +-define(wxImage_LoadFile_2, 1123). +-define(wxImage_LoadFile_3, 1124). +-define(wxImage_Ok, 1125). +-define(wxImage_RemoveHandler, 1126). +-define(wxImage_Mirror, 1127). +-define(wxImage_Replace, 1128). +-define(wxImage_Rescale, 1129). +-define(wxImage_Resize, 1130). +-define(wxImage_Rotate, 1131). +-define(wxImage_RotateHue, 1132). +-define(wxImage_Rotate90, 1133). +-define(wxImage_SaveFile_1, 1134). +-define(wxImage_SaveFile_2_0, 1135). +-define(wxImage_SaveFile_2_1, 1136). +-define(wxImage_Scale, 1137). +-define(wxImage_Size, 1138). +-define(wxImage_SetAlpha_3, 1139). +-define(wxImage_SetAlpha_2, 1140). +-define(wxImage_SetData_2, 1141). +-define(wxImage_SetData_4, 1142). +-define(wxImage_SetMask, 1143). +-define(wxImage_SetMaskColour, 1144). +-define(wxImage_SetMaskFromImage, 1145). +-define(wxImage_SetOption_2_1, 1146). +-define(wxImage_SetOption_2_0, 1147). +-define(wxImage_SetPalette, 1148). +-define(wxImage_SetRGB_5, 1149). +-define(wxImage_SetRGB_4, 1150). +-define(wxImage_destroy, 1151). +-define(wxBrush_new_0, 1152). +-define(wxBrush_new_2, 1153). +-define(wxBrush_new_1, 1154). +-define(wxBrush_destruct, 1156). +-define(wxBrush_GetColour, 1157). +-define(wxBrush_GetStipple, 1158). +-define(wxBrush_GetStyle, 1159). +-define(wxBrush_IsHatch, 1160). +-define(wxBrush_IsOk, 1161). +-define(wxBrush_SetColour_1, 1162). +-define(wxBrush_SetColour_3, 1163). +-define(wxBrush_SetStipple, 1164). +-define(wxBrush_SetStyle, 1165). +-define(wxPen_new_0, 1166). +-define(wxPen_new_2, 1167). +-define(wxPen_destruct, 1168). +-define(wxPen_GetCap, 1169). +-define(wxPen_GetColour, 1170). +-define(wxPen_GetJoin, 1171). +-define(wxPen_GetStyle, 1172). +-define(wxPen_GetWidth, 1173). +-define(wxPen_IsOk, 1174). +-define(wxPen_SetCap, 1175). +-define(wxPen_SetColour_1, 1176). +-define(wxPen_SetColour_3, 1177). +-define(wxPen_SetJoin, 1178). +-define(wxPen_SetStyle, 1179). +-define(wxPen_SetWidth, 1180). +-define(wxRegion_new_0, 1181). +-define(wxRegion_new_4, 1182). +-define(wxRegion_new_2, 1183). +-define(wxRegion_new_1_1, 1184). +-define(wxRegion_new_1_0, 1186). +-define(wxRegion_destruct, 1188). +-define(wxRegion_Clear, 1189). +-define(wxRegion_Contains_2, 1190). +-define(wxRegion_Contains_1_0, 1191). +-define(wxRegion_Contains_4, 1192). +-define(wxRegion_Contains_1_1, 1193). +-define(wxRegion_ConvertToBitmap, 1194). +-define(wxRegion_GetBox, 1195). +-define(wxRegion_Intersect_4, 1196). +-define(wxRegion_Intersect_1_1, 1197). +-define(wxRegion_Intersect_1_0, 1198). +-define(wxRegion_IsEmpty, 1199). +-define(wxRegion_Subtract_4, 1200). +-define(wxRegion_Subtract_1_1, 1201). +-define(wxRegion_Subtract_1_0, 1202). +-define(wxRegion_Offset_2, 1203). +-define(wxRegion_Offset_1, 1204). +-define(wxRegion_Union_4, 1205). +-define(wxRegion_Union_1_2, 1206). +-define(wxRegion_Union_1_1, 1207). +-define(wxRegion_Union_1_0, 1208). +-define(wxRegion_Union_3, 1209). +-define(wxRegion_Xor_4, 1210). +-define(wxRegion_Xor_1_1, 1211). +-define(wxRegion_Xor_1_0, 1212). +-define(wxAcceleratorTable_new_0, 1213). +-define(wxAcceleratorTable_new_2, 1214). +-define(wxAcceleratorTable_destruct, 1215). +-define(wxAcceleratorTable_Ok, 1216). +-define(wxAcceleratorEntry_new_1_0, 1217). +-define(wxAcceleratorEntry_new_1_1, 1218). +-define(wxAcceleratorEntry_GetCommand, 1219). +-define(wxAcceleratorEntry_GetFlags, 1220). +-define(wxAcceleratorEntry_GetKeyCode, 1221). +-define(wxAcceleratorEntry_Set, 1222). +-define(wxAcceleratorEntry_destroy, 1223). +-define(wxCaret_new_3, 1228). +-define(wxCaret_new_2, 1229). +-define(wxCaret_destruct, 1231). +-define(wxCaret_Create_3, 1232). +-define(wxCaret_Create_2, 1233). +-define(wxCaret_GetBlinkTime, 1234). +-define(wxCaret_GetPosition, 1236). +-define(wxCaret_GetSize, 1238). +-define(wxCaret_GetWindow, 1239). +-define(wxCaret_Hide, 1240). +-define(wxCaret_IsOk, 1241). +-define(wxCaret_IsVisible, 1242). +-define(wxCaret_Move_2, 1243). +-define(wxCaret_Move_1, 1244). +-define(wxCaret_SetBlinkTime, 1245). +-define(wxCaret_SetSize_2, 1246). +-define(wxCaret_SetSize_1, 1247). +-define(wxCaret_Show, 1248). +-define(wxSizer_Add_2_1, 1249). +-define(wxSizer_Add_2_0, 1250). +-define(wxSizer_Add_3, 1251). +-define(wxSizer_Add_2_3, 1252). +-define(wxSizer_Add_2_2, 1253). +-define(wxSizer_AddSpacer, 1254). +-define(wxSizer_AddStretchSpacer, 1255). +-define(wxSizer_CalcMin, 1256). +-define(wxSizer_Clear, 1257). +-define(wxSizer_Detach_1_2, 1258). +-define(wxSizer_Detach_1_1, 1259). +-define(wxSizer_Detach_1_0, 1260). +-define(wxSizer_Fit, 1261). +-define(wxSizer_FitInside, 1262). +-define(wxSizer_GetChildren, 1263). +-define(wxSizer_GetItem_2_1, 1264). +-define(wxSizer_GetItem_2_0, 1265). +-define(wxSizer_GetItem_1, 1266). +-define(wxSizer_GetSize, 1267). +-define(wxSizer_GetPosition, 1268). +-define(wxSizer_GetMinSize, 1269). +-define(wxSizer_Hide_2_0, 1270). +-define(wxSizer_Hide_2_1, 1271). +-define(wxSizer_Hide_1, 1272). +-define(wxSizer_Insert_3_1, 1273). +-define(wxSizer_Insert_3_0, 1274). +-define(wxSizer_Insert_4, 1275). +-define(wxSizer_Insert_3_3, 1276). +-define(wxSizer_Insert_3_2, 1277). +-define(wxSizer_Insert_2, 1278). +-define(wxSizer_InsertSpacer, 1279). +-define(wxSizer_InsertStretchSpacer, 1280). +-define(wxSizer_IsShown_1_2, 1281). +-define(wxSizer_IsShown_1_1, 1282). +-define(wxSizer_IsShown_1_0, 1283). +-define(wxSizer_Layout, 1284). +-define(wxSizer_Prepend_2_1, 1285). +-define(wxSizer_Prepend_2_0, 1286). +-define(wxSizer_Prepend_3, 1287). +-define(wxSizer_Prepend_2_3, 1288). +-define(wxSizer_Prepend_2_2, 1289). +-define(wxSizer_Prepend_1, 1290). +-define(wxSizer_PrependSpacer, 1291). +-define(wxSizer_PrependStretchSpacer, 1292). +-define(wxSizer_RecalcSizes, 1293). +-define(wxSizer_Remove_1_1, 1294). +-define(wxSizer_Remove_1_0, 1295). +-define(wxSizer_Replace_3_1, 1296). +-define(wxSizer_Replace_3_0, 1297). +-define(wxSizer_Replace_2, 1298). +-define(wxSizer_SetDimension, 1299). +-define(wxSizer_SetMinSize_2, 1300). +-define(wxSizer_SetMinSize_1, 1301). +-define(wxSizer_SetItemMinSize_3_2, 1302). +-define(wxSizer_SetItemMinSize_2_2, 1303). +-define(wxSizer_SetItemMinSize_3_1, 1304). +-define(wxSizer_SetItemMinSize_2_1, 1305). +-define(wxSizer_SetItemMinSize_3_0, 1306). +-define(wxSizer_SetItemMinSize_2_0, 1307). +-define(wxSizer_SetSizeHints, 1308). +-define(wxSizer_SetVirtualSizeHints, 1309). +-define(wxSizer_Show_2_2, 1310). +-define(wxSizer_Show_2_1, 1311). +-define(wxSizer_Show_2_0, 1312). +-define(wxSizer_Show_1, 1313). +-define(wxSizerFlags_new, 1314). +-define(wxSizerFlags_Align, 1315). +-define(wxSizerFlags_Border_2, 1316). +-define(wxSizerFlags_Border_1, 1317). +-define(wxSizerFlags_Center, 1318). +-define(wxSizerFlags_Centre, 1319). +-define(wxSizerFlags_Expand, 1320). +-define(wxSizerFlags_Left, 1321). +-define(wxSizerFlags_Proportion, 1322). +-define(wxSizerFlags_Right, 1323). +-define(wxSizerFlags_destroy, 1324). +-define(wxSizerItem_new_5_1, 1325). +-define(wxSizerItem_new_2_1, 1326). +-define(wxSizerItem_new_5_0, 1327). +-define(wxSizerItem_new_2_0, 1328). +-define(wxSizerItem_new_6, 1329). +-define(wxSizerItem_new_3, 1330). +-define(wxSizerItem_new_0, 1331). +-define(wxSizerItem_destruct, 1332). +-define(wxSizerItem_CalcMin, 1333). +-define(wxSizerItem_DeleteWindows, 1334). +-define(wxSizerItem_DetachSizer, 1335). +-define(wxSizerItem_GetBorder, 1336). +-define(wxSizerItem_GetFlag, 1337). +-define(wxSizerItem_GetMinSize, 1338). +-define(wxSizerItem_GetPosition, 1339). +-define(wxSizerItem_GetProportion, 1340). +-define(wxSizerItem_GetRatio, 1341). +-define(wxSizerItem_GetRect, 1342). +-define(wxSizerItem_GetSize, 1343). +-define(wxSizerItem_GetSizer, 1344). +-define(wxSizerItem_GetSpacer, 1345). +-define(wxSizerItem_GetUserData, 1346). +-define(wxSizerItem_GetWindow, 1347). +-define(wxSizerItem_IsSizer, 1348). +-define(wxSizerItem_IsShown, 1349). +-define(wxSizerItem_IsSpacer, 1350). +-define(wxSizerItem_IsWindow, 1351). +-define(wxSizerItem_SetBorder, 1352). +-define(wxSizerItem_SetDimension, 1353). +-define(wxSizerItem_SetFlag, 1354). +-define(wxSizerItem_SetInitSize, 1355). +-define(wxSizerItem_SetMinSize_1, 1356). +-define(wxSizerItem_SetMinSize_2, 1357). +-define(wxSizerItem_SetProportion, 1358). +-define(wxSizerItem_SetRatio_2, 1359). +-define(wxSizerItem_SetRatio_1_1, 1360). +-define(wxSizerItem_SetRatio_1_0, 1361). +-define(wxSizerItem_SetSizer, 1362). +-define(wxSizerItem_SetSpacer_1, 1363). +-define(wxSizerItem_SetSpacer_2, 1364). +-define(wxSizerItem_SetWindow, 1365). +-define(wxSizerItem_Show, 1366). +-define(wxBoxSizer_new, 1367). +-define(wxBoxSizer_GetOrientation, 1368). +-define(wxBoxSizer_destroy, 1369). +-define(wxStaticBoxSizer_new_2, 1370). +-define(wxStaticBoxSizer_new_3, 1371). +-define(wxStaticBoxSizer_GetStaticBox, 1372). +-define(wxStaticBoxSizer_destroy, 1373). +-define(wxGridSizer_new_4, 1374). +-define(wxGridSizer_new_2, 1375). +-define(wxGridSizer_GetCols, 1376). +-define(wxGridSizer_GetHGap, 1377). +-define(wxGridSizer_GetRows, 1378). +-define(wxGridSizer_GetVGap, 1379). +-define(wxGridSizer_SetCols, 1380). +-define(wxGridSizer_SetHGap, 1381). +-define(wxGridSizer_SetRows, 1382). +-define(wxGridSizer_SetVGap, 1383). +-define(wxGridSizer_destroy, 1384). +-define(wxFlexGridSizer_new_4, 1385). +-define(wxFlexGridSizer_new_2, 1386). +-define(wxFlexGridSizer_AddGrowableCol, 1387). +-define(wxFlexGridSizer_AddGrowableRow, 1388). +-define(wxFlexGridSizer_GetFlexibleDirection, 1389). +-define(wxFlexGridSizer_GetNonFlexibleGrowMode, 1390). +-define(wxFlexGridSizer_RemoveGrowableCol, 1391). +-define(wxFlexGridSizer_RemoveGrowableRow, 1392). +-define(wxFlexGridSizer_SetFlexibleDirection, 1393). +-define(wxFlexGridSizer_SetNonFlexibleGrowMode, 1394). +-define(wxFlexGridSizer_destroy, 1395). +-define(wxGridBagSizer_new, 1396). +-define(wxGridBagSizer_Add_3_2, 1397). +-define(wxGridBagSizer_Add_3_1, 1398). +-define(wxGridBagSizer_Add_4, 1399). +-define(wxGridBagSizer_Add_1_0, 1400). +-define(wxGridBagSizer_Add_2_1, 1401). +-define(wxGridBagSizer_Add_2_0, 1402). +-define(wxGridBagSizer_Add_3_0, 1403). +-define(wxGridBagSizer_Add_1_1, 1404). +-define(wxGridBagSizer_CalcMin, 1405). +-define(wxGridBagSizer_CheckForIntersection_2, 1406). +-define(wxGridBagSizer_CheckForIntersection_3, 1407). +-define(wxGridBagSizer_FindItem_1_1, 1408). +-define(wxGridBagSizer_FindItem_1_0, 1409). +-define(wxGridBagSizer_FindItemAtPoint, 1410). +-define(wxGridBagSizer_FindItemAtPosition, 1411). +-define(wxGridBagSizer_FindItemWithData, 1412). +-define(wxGridBagSizer_GetCellSize, 1413). +-define(wxGridBagSizer_GetEmptyCellSize, 1414). +-define(wxGridBagSizer_GetItemPosition_1_2, 1415). +-define(wxGridBagSizer_GetItemPosition_1_1, 1416). +-define(wxGridBagSizer_GetItemPosition_1_0, 1417). +-define(wxGridBagSizer_GetItemSpan_1_2, 1418). +-define(wxGridBagSizer_GetItemSpan_1_1, 1419). +-define(wxGridBagSizer_GetItemSpan_1_0, 1420). +-define(wxGridBagSizer_SetEmptyCellSize, 1421). +-define(wxGridBagSizer_SetItemPosition_2_2, 1422). +-define(wxGridBagSizer_SetItemPosition_2_1, 1423). +-define(wxGridBagSizer_SetItemPosition_2_0, 1424). +-define(wxGridBagSizer_SetItemSpan_2_2, 1425). +-define(wxGridBagSizer_SetItemSpan_2_1, 1426). +-define(wxGridBagSizer_SetItemSpan_2_0, 1427). +-define(wxGridBagSizer_destroy, 1428). +-define(wxStdDialogButtonSizer_new, 1429). +-define(wxStdDialogButtonSizer_AddButton, 1430). +-define(wxStdDialogButtonSizer_Realize, 1431). +-define(wxStdDialogButtonSizer_SetAffirmativeButton, 1432). +-define(wxStdDialogButtonSizer_SetCancelButton, 1433). +-define(wxStdDialogButtonSizer_SetNegativeButton, 1434). +-define(wxStdDialogButtonSizer_destroy, 1435). +-define(wxFont_new_0, 1436). +-define(wxFont_new_1, 1437). +-define(wxFont_new_5, 1438). +-define(wxFont_destruct, 1440). +-define(wxFont_IsFixedWidth, 1441). +-define(wxFont_GetDefaultEncoding, 1442). +-define(wxFont_GetFaceName, 1443). +-define(wxFont_GetFamily, 1444). +-define(wxFont_GetNativeFontInfoDesc, 1445). +-define(wxFont_GetNativeFontInfoUserDesc, 1446). +-define(wxFont_GetPointSize, 1447). +-define(wxFont_GetStyle, 1448). +-define(wxFont_GetUnderlined, 1449). +-define(wxFont_GetWeight, 1450). +-define(wxFont_Ok, 1451). +-define(wxFont_SetDefaultEncoding, 1452). +-define(wxFont_SetFaceName, 1453). +-define(wxFont_SetFamily, 1454). +-define(wxFont_SetPointSize, 1455). +-define(wxFont_SetStyle, 1456). +-define(wxFont_SetUnderlined, 1457). +-define(wxFont_SetWeight, 1458). +-define(wxToolTip_Enable, 1459). +-define(wxToolTip_SetDelay, 1460). +-define(wxToolTip_new, 1461). +-define(wxToolTip_SetTip, 1462). +-define(wxToolTip_GetTip, 1463). +-define(wxToolTip_GetWindow, 1464). +-define(wxToolTip_destroy, 1465). +-define(wxButton_new_3, 1467). +-define(wxButton_new_0, 1468). +-define(wxButton_destruct, 1469). +-define(wxButton_Create, 1470). +-define(wxButton_GetDefaultSize, 1471). +-define(wxButton_SetDefault, 1472). +-define(wxButton_SetLabel, 1473). +-define(wxBitmapButton_new_4, 1475). +-define(wxBitmapButton_new_0, 1476). +-define(wxBitmapButton_Create, 1477). +-define(wxBitmapButton_GetBitmapDisabled, 1478). +-define(wxBitmapButton_GetBitmapFocus, 1480). +-define(wxBitmapButton_GetBitmapLabel, 1482). +-define(wxBitmapButton_GetBitmapSelected, 1484). +-define(wxBitmapButton_SetBitmapDisabled, 1486). +-define(wxBitmapButton_SetBitmapFocus, 1487). +-define(wxBitmapButton_SetBitmapLabel, 1488). +-define(wxBitmapButton_SetBitmapSelected, 1489). +-define(wxBitmapButton_destroy, 1490). +-define(wxToggleButton_new_0, 1491). +-define(wxToggleButton_new_4, 1492). +-define(wxToggleButton_Create, 1493). +-define(wxToggleButton_GetValue, 1494). +-define(wxToggleButton_SetValue, 1495). +-define(wxToggleButton_destroy, 1496). +-define(wxCalendarCtrl_new_0, 1497). +-define(wxCalendarCtrl_new_3, 1498). +-define(wxCalendarCtrl_Create, 1499). +-define(wxCalendarCtrl_destruct, 1500). +-define(wxCalendarCtrl_SetDate, 1501). +-define(wxCalendarCtrl_GetDate, 1502). +-define(wxCalendarCtrl_EnableYearChange, 1503). +-define(wxCalendarCtrl_EnableMonthChange, 1504). +-define(wxCalendarCtrl_EnableHolidayDisplay, 1505). +-define(wxCalendarCtrl_SetHeaderColours, 1506). +-define(wxCalendarCtrl_GetHeaderColourFg, 1507). +-define(wxCalendarCtrl_GetHeaderColourBg, 1508). +-define(wxCalendarCtrl_SetHighlightColours, 1509). +-define(wxCalendarCtrl_GetHighlightColourFg, 1510). +-define(wxCalendarCtrl_GetHighlightColourBg, 1511). +-define(wxCalendarCtrl_SetHolidayColours, 1512). +-define(wxCalendarCtrl_GetHolidayColourFg, 1513). +-define(wxCalendarCtrl_GetHolidayColourBg, 1514). +-define(wxCalendarCtrl_GetAttr, 1515). +-define(wxCalendarCtrl_SetAttr, 1516). +-define(wxCalendarCtrl_SetHoliday, 1517). +-define(wxCalendarCtrl_ResetAttr, 1518). +-define(wxCalendarCtrl_HitTest, 1519). +-define(wxCalendarDateAttr_new_0, 1520). +-define(wxCalendarDateAttr_new_2_1, 1521). +-define(wxCalendarDateAttr_new_2_0, 1522). +-define(wxCalendarDateAttr_SetTextColour, 1523). +-define(wxCalendarDateAttr_SetBackgroundColour, 1524). +-define(wxCalendarDateAttr_SetBorderColour, 1525). +-define(wxCalendarDateAttr_SetFont, 1526). +-define(wxCalendarDateAttr_SetBorder, 1527). +-define(wxCalendarDateAttr_SetHoliday, 1528). +-define(wxCalendarDateAttr_HasTextColour, 1529). +-define(wxCalendarDateAttr_HasBackgroundColour, 1530). +-define(wxCalendarDateAttr_HasBorderColour, 1531). +-define(wxCalendarDateAttr_HasFont, 1532). +-define(wxCalendarDateAttr_HasBorder, 1533). +-define(wxCalendarDateAttr_IsHoliday, 1534). +-define(wxCalendarDateAttr_GetTextColour, 1535). +-define(wxCalendarDateAttr_GetBackgroundColour, 1536). +-define(wxCalendarDateAttr_GetBorderColour, 1537). +-define(wxCalendarDateAttr_GetFont, 1538). +-define(wxCalendarDateAttr_GetBorder, 1539). +-define(wxCalendarDateAttr_destroy, 1540). +-define(wxCheckBox_new_4, 1542). +-define(wxCheckBox_new_0, 1543). +-define(wxCheckBox_Create, 1544). +-define(wxCheckBox_GetValue, 1545). +-define(wxCheckBox_Get3StateValue, 1546). +-define(wxCheckBox_Is3rdStateAllowedForUser, 1547). +-define(wxCheckBox_Is3State, 1548). +-define(wxCheckBox_IsChecked, 1549). +-define(wxCheckBox_SetValue, 1550). +-define(wxCheckBox_Set3StateValue, 1551). +-define(wxCheckBox_destroy, 1552). +-define(wxCheckListBox_new_0, 1553). +-define(wxCheckListBox_new_3, 1555). +-define(wxCheckListBox_Check, 1556). +-define(wxCheckListBox_IsChecked, 1557). +-define(wxCheckListBox_destroy, 1558). +-define(wxChoice_new_3, 1561). +-define(wxChoice_new_0, 1562). +-define(wxChoice_destruct, 1564). +-define(wxChoice_Create, 1566). +-define(wxChoice_Delete, 1567). +-define(wxChoice_GetColumns, 1568). +-define(wxChoice_SetColumns, 1569). +-define(wxComboBox_new_0, 1570). +-define(wxComboBox_new_3, 1572). +-define(wxComboBox_destruct, 1573). +-define(wxComboBox_Create, 1575). +-define(wxComboBox_CanCopy, 1576). +-define(wxComboBox_CanCut, 1577). +-define(wxComboBox_CanPaste, 1578). +-define(wxComboBox_CanRedo, 1579). +-define(wxComboBox_CanUndo, 1580). +-define(wxComboBox_Copy, 1581). +-define(wxComboBox_Cut, 1582). +-define(wxComboBox_GetInsertionPoint, 1583). +-define(wxComboBox_GetLastPosition, 1584). +-define(wxComboBox_GetValue, 1585). +-define(wxComboBox_Paste, 1586). +-define(wxComboBox_Redo, 1587). +-define(wxComboBox_Replace, 1588). +-define(wxComboBox_Remove, 1589). +-define(wxComboBox_SetInsertionPoint, 1590). +-define(wxComboBox_SetInsertionPointEnd, 1591). +-define(wxComboBox_SetSelection_1, 1592). +-define(wxComboBox_SetSelection_2, 1593). +-define(wxComboBox_SetValue, 1594). +-define(wxComboBox_Undo, 1595). +-define(wxGauge_new_0, 1596). +-define(wxGauge_new_4, 1597). +-define(wxGauge_Create, 1598). +-define(wxGauge_GetBezelFace, 1599). +-define(wxGauge_GetRange, 1600). +-define(wxGauge_GetShadowWidth, 1601). +-define(wxGauge_GetValue, 1602). +-define(wxGauge_IsVertical, 1603). +-define(wxGauge_SetBezelFace, 1604). +-define(wxGauge_SetRange, 1605). +-define(wxGauge_SetShadowWidth, 1606). +-define(wxGauge_SetValue, 1607). +-define(wxGauge_Pulse, 1608). +-define(wxGauge_destroy, 1609). +-define(wxGenericDirCtrl_new_0, 1610). +-define(wxGenericDirCtrl_new_2, 1611). +-define(wxGenericDirCtrl_destruct, 1612). +-define(wxGenericDirCtrl_Create, 1613). +-define(wxGenericDirCtrl_Init, 1614). +-define(wxGenericDirCtrl_CollapseTree, 1615). +-define(wxGenericDirCtrl_ExpandPath, 1616). +-define(wxGenericDirCtrl_GetDefaultPath, 1617). +-define(wxGenericDirCtrl_GetPath, 1618). +-define(wxGenericDirCtrl_GetFilePath, 1619). +-define(wxGenericDirCtrl_GetFilter, 1620). +-define(wxGenericDirCtrl_GetFilterIndex, 1621). +-define(wxGenericDirCtrl_GetRootId, 1622). +-define(wxGenericDirCtrl_GetTreeCtrl, 1623). +-define(wxGenericDirCtrl_ReCreateTree, 1624). +-define(wxGenericDirCtrl_SetDefaultPath, 1625). +-define(wxGenericDirCtrl_SetFilter, 1626). +-define(wxGenericDirCtrl_SetFilterIndex, 1627). +-define(wxGenericDirCtrl_SetPath, 1628). +-define(wxStaticBox_new_4, 1630). +-define(wxStaticBox_new_0, 1631). +-define(wxStaticBox_Create, 1632). +-define(wxStaticBox_destroy, 1633). +-define(wxStaticLine_new_2, 1635). +-define(wxStaticLine_new_0, 1636). +-define(wxStaticLine_Create, 1637). +-define(wxStaticLine_IsVertical, 1638). +-define(wxStaticLine_GetDefaultSize, 1639). +-define(wxStaticLine_destroy, 1640). +-define(wxListBox_new_3, 1643). +-define(wxListBox_new_0, 1644). +-define(wxListBox_destruct, 1646). +-define(wxListBox_Create, 1648). +-define(wxListBox_Deselect, 1649). +-define(wxListBox_GetSelections, 1650). +-define(wxListBox_InsertItems, 1651). +-define(wxListBox_IsSelected, 1652). +-define(wxListBox_Set, 1654). +-define(wxListBox_HitTest, 1655). +-define(wxListBox_SetFirstItem_1_0, 1656). +-define(wxListBox_SetFirstItem_1_1, 1657). +-define(wxListCtrl_new_0, 1658). +-define(wxListCtrl_new_2, 1659). +-define(wxListCtrl_Arrange, 1660). +-define(wxListCtrl_AssignImageList, 1661). +-define(wxListCtrl_ClearAll, 1662). +-define(wxListCtrl_Create, 1663). +-define(wxListCtrl_DeleteAllItems, 1664). +-define(wxListCtrl_DeleteColumn, 1665). +-define(wxListCtrl_DeleteItem, 1666). +-define(wxListCtrl_EditLabel, 1667). +-define(wxListCtrl_EnsureVisible, 1668). +-define(wxListCtrl_FindItem_3_0, 1669). +-define(wxListCtrl_FindItem_3_1, 1670). +-define(wxListCtrl_GetColumn, 1671). +-define(wxListCtrl_GetColumnCount, 1672). +-define(wxListCtrl_GetColumnWidth, 1673). +-define(wxListCtrl_GetCountPerPage, 1674). +-define(wxListCtrl_GetImageList, 1675). +-define(wxListCtrl_GetItem, 1676). +-define(wxListCtrl_GetItemBackgroundColour, 1677). +-define(wxListCtrl_GetItemCount, 1678). +-define(wxListCtrl_GetItemData, 1679). +-define(wxListCtrl_GetItemFont, 1680). +-define(wxListCtrl_GetItemPosition, 1681). +-define(wxListCtrl_GetItemRect, 1682). +-define(wxListCtrl_GetItemSpacing, 1683). +-define(wxListCtrl_GetItemState, 1684). +-define(wxListCtrl_GetItemText, 1685). +-define(wxListCtrl_GetItemTextColour, 1686). +-define(wxListCtrl_GetNextItem, 1687). +-define(wxListCtrl_GetSelectedItemCount, 1688). +-define(wxListCtrl_GetTextColour, 1689). +-define(wxListCtrl_GetTopItem, 1690). +-define(wxListCtrl_GetViewRect, 1691). +-define(wxListCtrl_HitTest, 1692). +-define(wxListCtrl_InsertColumn_2, 1693). +-define(wxListCtrl_InsertColumn_3, 1694). +-define(wxListCtrl_InsertItem_1, 1695). +-define(wxListCtrl_InsertItem_2_1, 1696). +-define(wxListCtrl_InsertItem_2_0, 1697). +-define(wxListCtrl_InsertItem_3, 1698). +-define(wxListCtrl_RefreshItem, 1699). +-define(wxListCtrl_RefreshItems, 1700). +-define(wxListCtrl_ScrollList, 1701). +-define(wxListCtrl_SetBackgroundColour, 1702). +-define(wxListCtrl_SetColumn, 1703). +-define(wxListCtrl_SetColumnWidth, 1704). +-define(wxListCtrl_SetImageList, 1705). +-define(wxListCtrl_SetItem_1, 1706). +-define(wxListCtrl_SetItem_4, 1707). +-define(wxListCtrl_SetItemBackgroundColour, 1708). +-define(wxListCtrl_SetItemCount, 1709). +-define(wxListCtrl_SetItemData, 1710). +-define(wxListCtrl_SetItemFont, 1711). +-define(wxListCtrl_SetItemImage, 1712). +-define(wxListCtrl_SetItemColumnImage, 1713). +-define(wxListCtrl_SetItemPosition, 1714). +-define(wxListCtrl_SetItemState, 1715). +-define(wxListCtrl_SetItemText, 1716). +-define(wxListCtrl_SetItemTextColour, 1717). +-define(wxListCtrl_SetSingleStyle, 1718). +-define(wxListCtrl_SetTextColour, 1719). +-define(wxListCtrl_SetWindowStyleFlag, 1720). +-define(wxListCtrl_SortItems, 1721). +-define(wxListCtrl_destroy, 1722). +-define(wxListView_ClearColumnImage, 1723). +-define(wxListView_Focus, 1724). +-define(wxListView_GetFirstSelected, 1725). +-define(wxListView_GetFocusedItem, 1726). +-define(wxListView_GetNextSelected, 1727). +-define(wxListView_IsSelected, 1728). +-define(wxListView_Select, 1729). +-define(wxListView_SetColumnImage, 1730). +-define(wxListItem_new_0, 1731). +-define(wxListItem_new_1, 1732). +-define(wxListItem_destruct, 1733). +-define(wxListItem_Clear, 1734). +-define(wxListItem_GetAlign, 1735). +-define(wxListItem_GetBackgroundColour, 1736). +-define(wxListItem_GetColumn, 1737). +-define(wxListItem_GetFont, 1738). +-define(wxListItem_GetId, 1739). +-define(wxListItem_GetImage, 1740). +-define(wxListItem_GetMask, 1741). +-define(wxListItem_GetState, 1742). +-define(wxListItem_GetText, 1743). +-define(wxListItem_GetTextColour, 1744). +-define(wxListItem_GetWidth, 1745). +-define(wxListItem_SetAlign, 1746). +-define(wxListItem_SetBackgroundColour, 1747). +-define(wxListItem_SetColumn, 1748). +-define(wxListItem_SetFont, 1749). +-define(wxListItem_SetId, 1750). +-define(wxListItem_SetImage, 1751). +-define(wxListItem_SetMask, 1752). +-define(wxListItem_SetState, 1753). +-define(wxListItem_SetStateMask, 1754). +-define(wxListItem_SetText, 1755). +-define(wxListItem_SetTextColour, 1756). +-define(wxListItem_SetWidth, 1757). +-define(wxImageList_new_0, 1758). +-define(wxImageList_new_3, 1759). +-define(wxImageList_Add_1, 1760). +-define(wxImageList_Add_2_0, 1761). +-define(wxImageList_Add_2_1, 1762). +-define(wxImageList_Create, 1763). +-define(wxImageList_Draw, 1765). +-define(wxImageList_GetBitmap, 1766). +-define(wxImageList_GetIcon, 1767). +-define(wxImageList_GetImageCount, 1768). +-define(wxImageList_GetSize, 1769). +-define(wxImageList_Remove, 1770). +-define(wxImageList_RemoveAll, 1771). +-define(wxImageList_Replace_2, 1772). +-define(wxImageList_Replace_3, 1773). +-define(wxImageList_destroy, 1774). +-define(wxTextAttr_new_0, 1775). +-define(wxTextAttr_new_2, 1776). +-define(wxTextAttr_GetAlignment, 1777). +-define(wxTextAttr_GetBackgroundColour, 1778). +-define(wxTextAttr_GetFont, 1779). +-define(wxTextAttr_GetLeftIndent, 1780). +-define(wxTextAttr_GetLeftSubIndent, 1781). +-define(wxTextAttr_GetRightIndent, 1782). +-define(wxTextAttr_GetTabs, 1783). +-define(wxTextAttr_GetTextColour, 1784). +-define(wxTextAttr_HasBackgroundColour, 1785). +-define(wxTextAttr_HasFont, 1786). +-define(wxTextAttr_HasTextColour, 1787). +-define(wxTextAttr_GetFlags, 1788). +-define(wxTextAttr_IsDefault, 1789). +-define(wxTextAttr_SetAlignment, 1790). +-define(wxTextAttr_SetBackgroundColour, 1791). +-define(wxTextAttr_SetFlags, 1792). +-define(wxTextAttr_SetFont, 1793). +-define(wxTextAttr_SetLeftIndent, 1794). +-define(wxTextAttr_SetRightIndent, 1795). +-define(wxTextAttr_SetTabs, 1796). +-define(wxTextAttr_SetTextColour, 1797). +-define(wxTextAttr_destroy, 1798). +-define(wxTextCtrl_new_3, 1800). +-define(wxTextCtrl_new_0, 1801). +-define(wxTextCtrl_destruct, 1803). +-define(wxTextCtrl_AppendText, 1804). +-define(wxTextCtrl_CanCopy, 1805). +-define(wxTextCtrl_CanCut, 1806). +-define(wxTextCtrl_CanPaste, 1807). +-define(wxTextCtrl_CanRedo, 1808). +-define(wxTextCtrl_CanUndo, 1809). +-define(wxTextCtrl_Clear, 1810). +-define(wxTextCtrl_Copy, 1811). +-define(wxTextCtrl_Create, 1812). +-define(wxTextCtrl_Cut, 1813). +-define(wxTextCtrl_DiscardEdits, 1814). +-define(wxTextCtrl_EmulateKeyPress, 1815). +-define(wxTextCtrl_GetDefaultStyle, 1816). +-define(wxTextCtrl_GetInsertionPoint, 1817). +-define(wxTextCtrl_GetLastPosition, 1818). +-define(wxTextCtrl_GetLineLength, 1819). +-define(wxTextCtrl_GetLineText, 1820). +-define(wxTextCtrl_GetNumberOfLines, 1821). +-define(wxTextCtrl_GetRange, 1822). +-define(wxTextCtrl_GetSelection, 1823). +-define(wxTextCtrl_GetStringSelection, 1824). +-define(wxTextCtrl_GetStyle, 1825). +-define(wxTextCtrl_GetValue, 1826). +-define(wxTextCtrl_IsEditable, 1827). +-define(wxTextCtrl_IsModified, 1828). +-define(wxTextCtrl_IsMultiLine, 1829). +-define(wxTextCtrl_IsSingleLine, 1830). +-define(wxTextCtrl_LoadFile, 1831). +-define(wxTextCtrl_MarkDirty, 1832). +-define(wxTextCtrl_Paste, 1833). +-define(wxTextCtrl_PositionToXY, 1834). +-define(wxTextCtrl_Redo, 1835). +-define(wxTextCtrl_Remove, 1836). +-define(wxTextCtrl_Replace, 1837). +-define(wxTextCtrl_SaveFile, 1838). +-define(wxTextCtrl_SetDefaultStyle, 1839). +-define(wxTextCtrl_SetEditable, 1840). +-define(wxTextCtrl_SetInsertionPoint, 1841). +-define(wxTextCtrl_SetInsertionPointEnd, 1842). +-define(wxTextCtrl_SetMaxLength, 1844). +-define(wxTextCtrl_SetSelection, 1845). +-define(wxTextCtrl_SetStyle, 1846). +-define(wxTextCtrl_SetValue, 1847). +-define(wxTextCtrl_ShowPosition, 1848). +-define(wxTextCtrl_Undo, 1849). +-define(wxTextCtrl_WriteText, 1850). +-define(wxTextCtrl_XYToPosition, 1851). +-define(wxNotebook_new_0, 1854). +-define(wxNotebook_new_3, 1855). +-define(wxNotebook_destruct, 1856). +-define(wxNotebook_AddPage, 1857). +-define(wxNotebook_AdvanceSelection, 1858). +-define(wxNotebook_AssignImageList, 1859). +-define(wxNotebook_Create, 1860). +-define(wxNotebook_DeleteAllPages, 1861). +-define(wxNotebook_DeletePage, 1862). +-define(wxNotebook_RemovePage, 1863). +-define(wxNotebook_GetCurrentPage, 1864). +-define(wxNotebook_GetImageList, 1865). +-define(wxNotebook_GetPage, 1867). +-define(wxNotebook_GetPageCount, 1868). +-define(wxNotebook_GetPageImage, 1869). +-define(wxNotebook_GetPageText, 1870). +-define(wxNotebook_GetRowCount, 1871). +-define(wxNotebook_GetSelection, 1872). +-define(wxNotebook_GetThemeBackgroundColour, 1873). +-define(wxNotebook_HitTest, 1875). +-define(wxNotebook_InsertPage, 1877). +-define(wxNotebook_SetImageList, 1878). +-define(wxNotebook_SetPadding, 1879). +-define(wxNotebook_SetPageSize, 1880). +-define(wxNotebook_SetPageImage, 1881). +-define(wxNotebook_SetPageText, 1882). +-define(wxNotebook_SetSelection, 1883). +-define(wxNotebook_ChangeSelection, 1884). +-define(wxChoicebook_new_0, 1885). +-define(wxChoicebook_new_3, 1886). +-define(wxChoicebook_AddPage, 1887). +-define(wxChoicebook_AdvanceSelection, 1888). +-define(wxChoicebook_AssignImageList, 1889). +-define(wxChoicebook_Create, 1890). +-define(wxChoicebook_DeleteAllPages, 1891). +-define(wxChoicebook_DeletePage, 1892). +-define(wxChoicebook_RemovePage, 1893). +-define(wxChoicebook_GetCurrentPage, 1894). +-define(wxChoicebook_GetImageList, 1895). +-define(wxChoicebook_GetPage, 1897). +-define(wxChoicebook_GetPageCount, 1898). +-define(wxChoicebook_GetPageImage, 1899). +-define(wxChoicebook_GetPageText, 1900). +-define(wxChoicebook_GetSelection, 1901). +-define(wxChoicebook_HitTest, 1902). +-define(wxChoicebook_InsertPage, 1903). +-define(wxChoicebook_SetImageList, 1904). +-define(wxChoicebook_SetPageSize, 1905). +-define(wxChoicebook_SetPageImage, 1906). +-define(wxChoicebook_SetPageText, 1907). +-define(wxChoicebook_SetSelection, 1908). +-define(wxChoicebook_ChangeSelection, 1909). +-define(wxChoicebook_destroy, 1910). +-define(wxToolbook_new_0, 1911). +-define(wxToolbook_new_3, 1912). +-define(wxToolbook_AddPage, 1913). +-define(wxToolbook_AdvanceSelection, 1914). +-define(wxToolbook_AssignImageList, 1915). +-define(wxToolbook_Create, 1916). +-define(wxToolbook_DeleteAllPages, 1917). +-define(wxToolbook_DeletePage, 1918). +-define(wxToolbook_RemovePage, 1919). +-define(wxToolbook_GetCurrentPage, 1920). +-define(wxToolbook_GetImageList, 1921). +-define(wxToolbook_GetPage, 1923). +-define(wxToolbook_GetPageCount, 1924). +-define(wxToolbook_GetPageImage, 1925). +-define(wxToolbook_GetPageText, 1926). +-define(wxToolbook_GetSelection, 1927). +-define(wxToolbook_HitTest, 1929). +-define(wxToolbook_InsertPage, 1930). +-define(wxToolbook_SetImageList, 1931). +-define(wxToolbook_SetPageSize, 1932). +-define(wxToolbook_SetPageImage, 1933). +-define(wxToolbook_SetPageText, 1934). +-define(wxToolbook_SetSelection, 1935). +-define(wxToolbook_ChangeSelection, 1936). +-define(wxToolbook_destroy, 1937). +-define(wxListbook_new_0, 1938). +-define(wxListbook_new_3, 1939). +-define(wxListbook_AddPage, 1940). +-define(wxListbook_AdvanceSelection, 1941). +-define(wxListbook_AssignImageList, 1942). +-define(wxListbook_Create, 1943). +-define(wxListbook_DeleteAllPages, 1944). +-define(wxListbook_DeletePage, 1945). +-define(wxListbook_RemovePage, 1946). +-define(wxListbook_GetCurrentPage, 1947). +-define(wxListbook_GetImageList, 1948). +-define(wxListbook_GetPage, 1950). +-define(wxListbook_GetPageCount, 1951). +-define(wxListbook_GetPageImage, 1952). +-define(wxListbook_GetPageText, 1953). +-define(wxListbook_GetSelection, 1954). +-define(wxListbook_HitTest, 1956). +-define(wxListbook_InsertPage, 1957). +-define(wxListbook_SetImageList, 1958). +-define(wxListbook_SetPageSize, 1959). +-define(wxListbook_SetPageImage, 1960). +-define(wxListbook_SetPageText, 1961). +-define(wxListbook_SetSelection, 1962). +-define(wxListbook_ChangeSelection, 1963). +-define(wxListbook_destroy, 1964). +-define(wxTreebook_new_0, 1965). +-define(wxTreebook_new_3, 1966). +-define(wxTreebook_AddPage, 1967). +-define(wxTreebook_AdvanceSelection, 1968). +-define(wxTreebook_AssignImageList, 1969). +-define(wxTreebook_Create, 1970). +-define(wxTreebook_DeleteAllPages, 1971). +-define(wxTreebook_DeletePage, 1972). +-define(wxTreebook_RemovePage, 1973). +-define(wxTreebook_GetCurrentPage, 1974). +-define(wxTreebook_GetImageList, 1975). +-define(wxTreebook_GetPage, 1977). +-define(wxTreebook_GetPageCount, 1978). +-define(wxTreebook_GetPageImage, 1979). +-define(wxTreebook_GetPageText, 1980). +-define(wxTreebook_GetSelection, 1981). +-define(wxTreebook_ExpandNode, 1982). +-define(wxTreebook_IsNodeExpanded, 1983). +-define(wxTreebook_HitTest, 1985). +-define(wxTreebook_InsertPage, 1986). +-define(wxTreebook_InsertSubPage, 1987). +-define(wxTreebook_SetImageList, 1988). +-define(wxTreebook_SetPageSize, 1989). +-define(wxTreebook_SetPageImage, 1990). +-define(wxTreebook_SetPageText, 1991). +-define(wxTreebook_SetSelection, 1992). +-define(wxTreebook_ChangeSelection, 1993). +-define(wxTreebook_destroy, 1994). +-define(wxTreeCtrl_new_2, 1997). +-define(wxTreeCtrl_new_0, 1998). +-define(wxTreeCtrl_destruct, 2000). +-define(wxTreeCtrl_AddRoot, 2001). +-define(wxTreeCtrl_AppendItem, 2002). +-define(wxTreeCtrl_AssignImageList, 2003). +-define(wxTreeCtrl_AssignStateImageList, 2004). +-define(wxTreeCtrl_Collapse, 2005). +-define(wxTreeCtrl_CollapseAndReset, 2006). +-define(wxTreeCtrl_Create, 2007). +-define(wxTreeCtrl_Delete, 2008). +-define(wxTreeCtrl_DeleteAllItems, 2009). +-define(wxTreeCtrl_DeleteChildren, 2010). +-define(wxTreeCtrl_EnsureVisible, 2011). +-define(wxTreeCtrl_Expand, 2012). +-define(wxTreeCtrl_GetBoundingRect, 2013). +-define(wxTreeCtrl_GetChildrenCount, 2015). +-define(wxTreeCtrl_GetCount, 2016). +-define(wxTreeCtrl_GetEditControl, 2017). +-define(wxTreeCtrl_GetFirstVisibleItem, 2018). +-define(wxTreeCtrl_GetImageList, 2019). +-define(wxTreeCtrl_GetIndent, 2020). +-define(wxTreeCtrl_GetItemBackgroundColour, 2021). +-define(wxTreeCtrl_GetItemData, 2022). +-define(wxTreeCtrl_GetItemFont, 2023). +-define(wxTreeCtrl_GetItemImage_1, 2024). +-define(wxTreeCtrl_GetItemImage_2, 2025). +-define(wxTreeCtrl_GetItemText, 2026). +-define(wxTreeCtrl_GetItemTextColour, 2027). +-define(wxTreeCtrl_GetLastChild, 2028). +-define(wxTreeCtrl_GetNextSibling, 2029). +-define(wxTreeCtrl_GetNextVisible, 2030). +-define(wxTreeCtrl_GetItemParent, 2031). +-define(wxTreeCtrl_GetPrevSibling, 2032). +-define(wxTreeCtrl_GetPrevVisible, 2033). +-define(wxTreeCtrl_GetRootItem, 2034). +-define(wxTreeCtrl_GetSelection, 2035). +-define(wxTreeCtrl_GetSelections, 2036). +-define(wxTreeCtrl_GetStateImageList, 2037). +-define(wxTreeCtrl_HitTest, 2038). +-define(wxTreeCtrl_InsertItem_4_1, 2039). +-define(wxTreeCtrl_InsertItem_4_0, 2040). +-define(wxTreeCtrl_IsBold, 2041). +-define(wxTreeCtrl_IsExpanded, 2042). +-define(wxTreeCtrl_IsSelected, 2043). +-define(wxTreeCtrl_IsVisible, 2044). +-define(wxTreeCtrl_ItemHasChildren, 2045). +-define(wxTreeCtrl_PrependItem, 2046). +-define(wxTreeCtrl_ScrollTo, 2047). +-define(wxTreeCtrl_SelectItem_1, 2048). +-define(wxTreeCtrl_SelectItem_2, 2049). +-define(wxTreeCtrl_SetIndent, 2050). +-define(wxTreeCtrl_SetImageList, 2051). +-define(wxTreeCtrl_SetItemBackgroundColour, 2052). +-define(wxTreeCtrl_SetItemBold, 2053). +-define(wxTreeCtrl_SetItemData, 2054). +-define(wxTreeCtrl_SetItemDropHighlight, 2055). +-define(wxTreeCtrl_SetItemFont, 2056). +-define(wxTreeCtrl_SetItemHasChildren, 2057). +-define(wxTreeCtrl_SetItemImage_2, 2058). +-define(wxTreeCtrl_SetItemImage_3, 2059). +-define(wxTreeCtrl_SetItemText, 2060). +-define(wxTreeCtrl_SetItemTextColour, 2061). +-define(wxTreeCtrl_SetStateImageList, 2062). +-define(wxTreeCtrl_SetWindowStyle, 2063). +-define(wxTreeCtrl_SortChildren, 2064). +-define(wxTreeCtrl_Toggle, 2065). +-define(wxTreeCtrl_ToggleItemSelection, 2066). +-define(wxTreeCtrl_Unselect, 2067). +-define(wxTreeCtrl_UnselectAll, 2068). +-define(wxTreeCtrl_UnselectItem, 2069). +-define(wxScrollBar_new_0, 2070). +-define(wxScrollBar_new_3, 2071). +-define(wxScrollBar_destruct, 2072). +-define(wxScrollBar_Create, 2073). +-define(wxScrollBar_GetRange, 2074). +-define(wxScrollBar_GetPageSize, 2075). +-define(wxScrollBar_GetThumbPosition, 2076). +-define(wxScrollBar_GetThumbSize, 2077). +-define(wxScrollBar_SetThumbPosition, 2078). +-define(wxScrollBar_SetScrollbar, 2079). +-define(wxSpinButton_new_2, 2081). +-define(wxSpinButton_new_0, 2082). +-define(wxSpinButton_Create, 2083). +-define(wxSpinButton_GetMax, 2084). +-define(wxSpinButton_GetMin, 2085). +-define(wxSpinButton_GetValue, 2086). +-define(wxSpinButton_SetRange, 2087). +-define(wxSpinButton_SetValue, 2088). +-define(wxSpinButton_destroy, 2089). +-define(wxSpinCtrl_new_0, 2090). +-define(wxSpinCtrl_new_2, 2091). +-define(wxSpinCtrl_Create, 2093). +-define(wxSpinCtrl_SetValue_1_1, 2096). +-define(wxSpinCtrl_SetValue_1_0, 2097). +-define(wxSpinCtrl_GetValue, 2099). +-define(wxSpinCtrl_SetRange, 2101). +-define(wxSpinCtrl_SetSelection, 2102). +-define(wxSpinCtrl_GetMin, 2104). +-define(wxSpinCtrl_GetMax, 2106). +-define(wxSpinCtrl_destroy, 2107). +-define(wxStaticText_new_0, 2108). +-define(wxStaticText_new_4, 2109). +-define(wxStaticText_Create, 2110). +-define(wxStaticText_GetLabel, 2111). +-define(wxStaticText_SetLabel, 2112). +-define(wxStaticText_Wrap, 2113). +-define(wxStaticText_destroy, 2114). +-define(wxStaticBitmap_new_0, 2115). +-define(wxStaticBitmap_new_4, 2116). +-define(wxStaticBitmap_Create, 2117). +-define(wxStaticBitmap_GetBitmap, 2118). +-define(wxStaticBitmap_SetBitmap, 2119). +-define(wxStaticBitmap_destroy, 2120). +-define(wxRadioBox_new, 2121). +-define(wxRadioBox_destruct, 2123). +-define(wxRadioBox_Create, 2124). +-define(wxRadioBox_Enable_2, 2125). +-define(wxRadioBox_Enable_1, 2126). +-define(wxRadioBox_GetSelection, 2127). +-define(wxRadioBox_GetString, 2128). +-define(wxRadioBox_SetSelection, 2129). +-define(wxRadioBox_Show_2, 2130). +-define(wxRadioBox_Show_1, 2131). +-define(wxRadioBox_GetColumnCount, 2132). +-define(wxRadioBox_GetItemHelpText, 2133). +-define(wxRadioBox_GetItemToolTip, 2134). +-define(wxRadioBox_GetItemFromPoint, 2136). +-define(wxRadioBox_GetRowCount, 2137). +-define(wxRadioBox_IsItemEnabled, 2138). +-define(wxRadioBox_IsItemShown, 2139). +-define(wxRadioBox_SetItemHelpText, 2140). +-define(wxRadioBox_SetItemToolTip, 2141). +-define(wxRadioButton_new_0, 2142). +-define(wxRadioButton_new_4, 2143). +-define(wxRadioButton_Create, 2144). +-define(wxRadioButton_GetValue, 2145). +-define(wxRadioButton_SetValue, 2146). +-define(wxRadioButton_destroy, 2147). +-define(wxSlider_new_6, 2149). +-define(wxSlider_new_0, 2150). +-define(wxSlider_Create, 2151). +-define(wxSlider_GetLineSize, 2152). +-define(wxSlider_GetMax, 2153). +-define(wxSlider_GetMin, 2154). +-define(wxSlider_GetPageSize, 2155). +-define(wxSlider_GetThumbLength, 2156). +-define(wxSlider_GetValue, 2157). +-define(wxSlider_SetLineSize, 2158). +-define(wxSlider_SetPageSize, 2159). +-define(wxSlider_SetRange, 2160). +-define(wxSlider_SetThumbLength, 2161). +-define(wxSlider_SetValue, 2162). +-define(wxSlider_destroy, 2163). +-define(wxDialog_new_4, 2165). +-define(wxDialog_new_0, 2166). +-define(wxDialog_destruct, 2168). +-define(wxDialog_Create, 2169). +-define(wxDialog_CreateButtonSizer, 2170). +-define(wxDialog_CreateStdDialogButtonSizer, 2171). +-define(wxDialog_EndModal, 2172). +-define(wxDialog_GetAffirmativeId, 2173). +-define(wxDialog_GetReturnCode, 2174). +-define(wxDialog_IsModal, 2175). +-define(wxDialog_SetAffirmativeId, 2176). +-define(wxDialog_SetReturnCode, 2177). +-define(wxDialog_Show, 2178). +-define(wxDialog_ShowModal, 2179). +-define(wxColourDialog_new_0, 2180). +-define(wxColourDialog_new_2, 2181). +-define(wxColourDialog_destruct, 2182). +-define(wxColourDialog_Create, 2183). +-define(wxColourDialog_GetColourData, 2184). +-define(wxColourData_new_0, 2185). +-define(wxColourData_new_1, 2186). +-define(wxColourData_destruct, 2187). +-define(wxColourData_GetChooseFull, 2188). +-define(wxColourData_GetColour, 2189). +-define(wxColourData_GetCustomColour, 2191). +-define(wxColourData_SetChooseFull, 2192). +-define(wxColourData_SetColour, 2193). +-define(wxColourData_SetCustomColour, 2194). +-define(wxPalette_new_0, 2195). +-define(wxPalette_new_4, 2196). +-define(wxPalette_destruct, 2198). +-define(wxPalette_Create, 2199). +-define(wxPalette_GetColoursCount, 2200). +-define(wxPalette_GetPixel, 2201). +-define(wxPalette_GetRGB, 2202). +-define(wxPalette_IsOk, 2203). +-define(wxDirDialog_new, 2207). +-define(wxDirDialog_destruct, 2208). +-define(wxDirDialog_GetPath, 2209). +-define(wxDirDialog_GetMessage, 2210). +-define(wxDirDialog_SetMessage, 2211). +-define(wxDirDialog_SetPath, 2212). +-define(wxFileDialog_new, 2216). +-define(wxFileDialog_destruct, 2217). +-define(wxFileDialog_GetDirectory, 2218). +-define(wxFileDialog_GetFilename, 2219). +-define(wxFileDialog_GetFilenames, 2220). +-define(wxFileDialog_GetFilterIndex, 2221). +-define(wxFileDialog_GetMessage, 2222). +-define(wxFileDialog_GetPath, 2223). +-define(wxFileDialog_GetPaths, 2224). +-define(wxFileDialog_GetWildcard, 2225). +-define(wxFileDialog_SetDirectory, 2226). +-define(wxFileDialog_SetFilename, 2227). +-define(wxFileDialog_SetFilterIndex, 2228). +-define(wxFileDialog_SetMessage, 2229). +-define(wxFileDialog_SetPath, 2230). +-define(wxFileDialog_SetWildcard, 2231). +-define(wxPickerBase_SetInternalMargin, 2232). +-define(wxPickerBase_GetInternalMargin, 2233). +-define(wxPickerBase_SetTextCtrlProportion, 2234). +-define(wxPickerBase_SetPickerCtrlProportion, 2235). +-define(wxPickerBase_GetTextCtrlProportion, 2236). +-define(wxPickerBase_GetPickerCtrlProportion, 2237). +-define(wxPickerBase_HasTextCtrl, 2238). +-define(wxPickerBase_GetTextCtrl, 2239). +-define(wxPickerBase_IsTextCtrlGrowable, 2240). +-define(wxPickerBase_SetPickerCtrlGrowable, 2241). +-define(wxPickerBase_SetTextCtrlGrowable, 2242). +-define(wxPickerBase_IsPickerCtrlGrowable, 2243). +-define(wxFilePickerCtrl_new_0, 2244). +-define(wxFilePickerCtrl_new_3, 2245). +-define(wxFilePickerCtrl_Create, 2246). +-define(wxFilePickerCtrl_GetPath, 2247). +-define(wxFilePickerCtrl_SetPath, 2248). +-define(wxFilePickerCtrl_destroy, 2249). +-define(wxDirPickerCtrl_new_0, 2250). +-define(wxDirPickerCtrl_new_3, 2251). +-define(wxDirPickerCtrl_Create, 2252). +-define(wxDirPickerCtrl_GetPath, 2253). +-define(wxDirPickerCtrl_SetPath, 2254). +-define(wxDirPickerCtrl_destroy, 2255). +-define(wxColourPickerCtrl_new_0, 2256). +-define(wxColourPickerCtrl_new_3, 2257). +-define(wxColourPickerCtrl_Create, 2258). +-define(wxColourPickerCtrl_GetColour, 2259). +-define(wxColourPickerCtrl_SetColour_1_1, 2260). +-define(wxColourPickerCtrl_SetColour_1_0, 2261). +-define(wxColourPickerCtrl_destroy, 2262). +-define(wxDatePickerCtrl_new_0, 2263). +-define(wxDatePickerCtrl_new_3, 2264). +-define(wxDatePickerCtrl_GetRange, 2265). +-define(wxDatePickerCtrl_GetValue, 2266). +-define(wxDatePickerCtrl_SetRange, 2267). +-define(wxDatePickerCtrl_SetValue, 2268). +-define(wxDatePickerCtrl_destroy, 2269). +-define(wxFontPickerCtrl_new_0, 2270). +-define(wxFontPickerCtrl_new_3, 2271). +-define(wxFontPickerCtrl_Create, 2272). +-define(wxFontPickerCtrl_GetSelectedFont, 2273). +-define(wxFontPickerCtrl_SetSelectedFont, 2274). +-define(wxFontPickerCtrl_GetMaxPointSize, 2275). +-define(wxFontPickerCtrl_SetMaxPointSize, 2276). +-define(wxFontPickerCtrl_destroy, 2277). +-define(wxFindReplaceDialog_new_0, 2280). +-define(wxFindReplaceDialog_new_4, 2281). +-define(wxFindReplaceDialog_destruct, 2282). +-define(wxFindReplaceDialog_Create, 2283). +-define(wxFindReplaceDialog_GetData, 2284). +-define(wxFindReplaceData_new_0, 2285). +-define(wxFindReplaceData_new_1, 2286). +-define(wxFindReplaceData_GetFindString, 2287). +-define(wxFindReplaceData_GetReplaceString, 2288). +-define(wxFindReplaceData_GetFlags, 2289). +-define(wxFindReplaceData_SetFlags, 2290). +-define(wxFindReplaceData_SetFindString, 2291). +-define(wxFindReplaceData_SetReplaceString, 2292). +-define(wxFindReplaceData_destroy, 2293). +-define(wxMultiChoiceDialog_new_0, 2294). +-define(wxMultiChoiceDialog_new_5, 2296). +-define(wxMultiChoiceDialog_GetSelections, 2297). +-define(wxMultiChoiceDialog_SetSelections, 2298). +-define(wxMultiChoiceDialog_destroy, 2299). +-define(wxSingleChoiceDialog_new_0, 2300). +-define(wxSingleChoiceDialog_new_5, 2302). +-define(wxSingleChoiceDialog_GetSelection, 2303). +-define(wxSingleChoiceDialog_GetStringSelection, 2304). +-define(wxSingleChoiceDialog_SetSelection, 2305). +-define(wxSingleChoiceDialog_destroy, 2306). +-define(wxTextEntryDialog_new, 2307). +-define(wxTextEntryDialog_GetValue, 2308). +-define(wxTextEntryDialog_SetValue, 2309). +-define(wxTextEntryDialog_destroy, 2310). +-define(wxPasswordEntryDialog_new, 2311). +-define(wxPasswordEntryDialog_destroy, 2312). +-define(wxFontData_new_0, 2313). +-define(wxFontData_new_1, 2314). +-define(wxFontData_destruct, 2315). +-define(wxFontData_EnableEffects, 2316). +-define(wxFontData_GetAllowSymbols, 2317). +-define(wxFontData_GetColour, 2318). +-define(wxFontData_GetChosenFont, 2319). +-define(wxFontData_GetEnableEffects, 2320). +-define(wxFontData_GetInitialFont, 2321). +-define(wxFontData_GetShowHelp, 2322). +-define(wxFontData_SetAllowSymbols, 2323). +-define(wxFontData_SetChosenFont, 2324). +-define(wxFontData_SetColour, 2325). +-define(wxFontData_SetInitialFont, 2326). +-define(wxFontData_SetRange, 2327). +-define(wxFontData_SetShowHelp, 2328). +-define(wxFontDialog_new_0, 2332). +-define(wxFontDialog_new_2, 2334). +-define(wxFontDialog_Create, 2336). +-define(wxFontDialog_GetFontData, 2337). +-define(wxFontDialog_destroy, 2339). +-define(wxProgressDialog_new, 2340). +-define(wxProgressDialog_destruct, 2341). +-define(wxProgressDialog_Resume, 2342). +-define(wxProgressDialog_Update_2, 2343). +-define(wxProgressDialog_Update_0, 2344). +-define(wxMessageDialog_new, 2345). +-define(wxMessageDialog_destruct, 2346). +-define(wxPageSetupDialog_new, 2347). +-define(wxPageSetupDialog_destruct, 2348). +-define(wxPageSetupDialog_GetPageSetupData, 2349). +-define(wxPageSetupDialog_ShowModal, 2350). +-define(wxPageSetupDialogData_new_0, 2351). +-define(wxPageSetupDialogData_new_1_0, 2352). +-define(wxPageSetupDialogData_new_1_1, 2353). +-define(wxPageSetupDialogData_destruct, 2354). +-define(wxPageSetupDialogData_EnableHelp, 2355). +-define(wxPageSetupDialogData_EnableMargins, 2356). +-define(wxPageSetupDialogData_EnableOrientation, 2357). +-define(wxPageSetupDialogData_EnablePaper, 2358). +-define(wxPageSetupDialogData_EnablePrinter, 2359). +-define(wxPageSetupDialogData_GetDefaultMinMargins, 2360). +-define(wxPageSetupDialogData_GetEnableMargins, 2361). +-define(wxPageSetupDialogData_GetEnableOrientation, 2362). +-define(wxPageSetupDialogData_GetEnablePaper, 2363). +-define(wxPageSetupDialogData_GetEnablePrinter, 2364). +-define(wxPageSetupDialogData_GetEnableHelp, 2365). +-define(wxPageSetupDialogData_GetDefaultInfo, 2366). +-define(wxPageSetupDialogData_GetMarginTopLeft, 2367). +-define(wxPageSetupDialogData_GetMarginBottomRight, 2368). +-define(wxPageSetupDialogData_GetMinMarginTopLeft, 2369). +-define(wxPageSetupDialogData_GetMinMarginBottomRight, 2370). +-define(wxPageSetupDialogData_GetPaperId, 2371). +-define(wxPageSetupDialogData_GetPaperSize, 2372). +-define(wxPageSetupDialogData_GetPrintData, 2374). +-define(wxPageSetupDialogData_IsOk, 2375). +-define(wxPageSetupDialogData_SetDefaultInfo, 2376). +-define(wxPageSetupDialogData_SetDefaultMinMargins, 2377). +-define(wxPageSetupDialogData_SetMarginTopLeft, 2378). +-define(wxPageSetupDialogData_SetMarginBottomRight, 2379). +-define(wxPageSetupDialogData_SetMinMarginTopLeft, 2380). +-define(wxPageSetupDialogData_SetMinMarginBottomRight, 2381). +-define(wxPageSetupDialogData_SetPaperId, 2382). +-define(wxPageSetupDialogData_SetPaperSize_1_1, 2383). +-define(wxPageSetupDialogData_SetPaperSize_1_0, 2384). +-define(wxPageSetupDialogData_SetPrintData, 2385). +-define(wxPrintDialog_new_2_0, 2386). +-define(wxPrintDialog_new_2_1, 2387). +-define(wxPrintDialog_destruct, 2388). +-define(wxPrintDialog_GetPrintDialogData, 2389). +-define(wxPrintDialog_GetPrintDC, 2390). +-define(wxPrintDialogData_new_0, 2391). +-define(wxPrintDialogData_new_1_1, 2392). +-define(wxPrintDialogData_new_1_0, 2393). +-define(wxPrintDialogData_destruct, 2394). +-define(wxPrintDialogData_EnableHelp, 2395). +-define(wxPrintDialogData_EnablePageNumbers, 2396). +-define(wxPrintDialogData_EnablePrintToFile, 2397). +-define(wxPrintDialogData_EnableSelection, 2398). +-define(wxPrintDialogData_GetAllPages, 2399). +-define(wxPrintDialogData_GetCollate, 2400). +-define(wxPrintDialogData_GetFromPage, 2401). +-define(wxPrintDialogData_GetMaxPage, 2402). +-define(wxPrintDialogData_GetMinPage, 2403). +-define(wxPrintDialogData_GetNoCopies, 2404). +-define(wxPrintDialogData_GetPrintData, 2405). +-define(wxPrintDialogData_GetPrintToFile, 2406). +-define(wxPrintDialogData_GetSelection, 2407). +-define(wxPrintDialogData_GetToPage, 2408). +-define(wxPrintDialogData_IsOk, 2409). +-define(wxPrintDialogData_SetCollate, 2410). +-define(wxPrintDialogData_SetFromPage, 2411). +-define(wxPrintDialogData_SetMaxPage, 2412). +-define(wxPrintDialogData_SetMinPage, 2413). +-define(wxPrintDialogData_SetNoCopies, 2414). +-define(wxPrintDialogData_SetPrintData, 2415). +-define(wxPrintDialogData_SetPrintToFile, 2416). +-define(wxPrintDialogData_SetSelection, 2417). +-define(wxPrintDialogData_SetToPage, 2418). +-define(wxPrintData_new_0, 2419). +-define(wxPrintData_new_1, 2420). +-define(wxPrintData_destruct, 2421). +-define(wxPrintData_GetCollate, 2422). +-define(wxPrintData_GetBin, 2423). +-define(wxPrintData_GetColour, 2424). +-define(wxPrintData_GetDuplex, 2425). +-define(wxPrintData_GetNoCopies, 2426). +-define(wxPrintData_GetOrientation, 2427). +-define(wxPrintData_GetPaperId, 2428). +-define(wxPrintData_GetPrinterName, 2429). +-define(wxPrintData_GetQuality, 2430). +-define(wxPrintData_IsOk, 2431). +-define(wxPrintData_SetBin, 2432). +-define(wxPrintData_SetCollate, 2433). +-define(wxPrintData_SetColour, 2434). +-define(wxPrintData_SetDuplex, 2435). +-define(wxPrintData_SetNoCopies, 2436). +-define(wxPrintData_SetOrientation, 2437). +-define(wxPrintData_SetPaperId, 2438). +-define(wxPrintData_SetPrinterName, 2439). +-define(wxPrintData_SetQuality, 2440). +-define(wxPrintPreview_new_2, 2443). +-define(wxPrintPreview_new_3, 2444). +-define(wxPrintPreview_destruct, 2446). +-define(wxPrintPreview_GetCanvas, 2447). +-define(wxPrintPreview_GetCurrentPage, 2448). +-define(wxPrintPreview_GetFrame, 2449). +-define(wxPrintPreview_GetMaxPage, 2450). +-define(wxPrintPreview_GetMinPage, 2451). +-define(wxPrintPreview_GetPrintout, 2452). +-define(wxPrintPreview_GetPrintoutForPrinting, 2453). +-define(wxPrintPreview_IsOk, 2454). +-define(wxPrintPreview_PaintPage, 2455). +-define(wxPrintPreview_Print, 2456). +-define(wxPrintPreview_RenderPage, 2457). +-define(wxPrintPreview_SetCanvas, 2458). +-define(wxPrintPreview_SetCurrentPage, 2459). +-define(wxPrintPreview_SetFrame, 2460). +-define(wxPrintPreview_SetPrintout, 2461). +-define(wxPrintPreview_SetZoom, 2462). +-define(wxPreviewFrame_new, 2463). +-define(wxPreviewFrame_destruct, 2464). +-define(wxPreviewFrame_CreateControlBar, 2465). +-define(wxPreviewFrame_CreateCanvas, 2466). +-define(wxPreviewFrame_Initialize, 2467). +-define(wxPreviewFrame_OnCloseWindow, 2468). +-define(wxPreviewControlBar_new, 2469). +-define(wxPreviewControlBar_destruct, 2470). +-define(wxPreviewControlBar_CreateButtons, 2471). +-define(wxPreviewControlBar_GetPrintPreview, 2472). +-define(wxPreviewControlBar_GetZoomControl, 2473). +-define(wxPreviewControlBar_SetZoomControl, 2474). +-define(wxPrinter_new, 2476). +-define(wxPrinter_CreateAbortWindow, 2477). +-define(wxPrinter_GetAbort, 2478). +-define(wxPrinter_GetLastError, 2479). +-define(wxPrinter_GetPrintDialogData, 2480). +-define(wxPrinter_Print, 2481). +-define(wxPrinter_PrintDialog, 2482). +-define(wxPrinter_ReportError, 2483). +-define(wxPrinter_Setup, 2484). +-define(wxPrinter_destroy, 2485). +-define(wxXmlResource_new_1, 2486). +-define(wxXmlResource_new_2, 2487). +-define(wxXmlResource_destruct, 2488). +-define(wxXmlResource_AttachUnknownControl, 2489). +-define(wxXmlResource_ClearHandlers, 2490). +-define(wxXmlResource_CompareVersion, 2491). +-define(wxXmlResource_Get, 2492). +-define(wxXmlResource_GetFlags, 2493). +-define(wxXmlResource_GetVersion, 2494). +-define(wxXmlResource_GetXRCID, 2495). +-define(wxXmlResource_InitAllHandlers, 2496). +-define(wxXmlResource_Load, 2497). +-define(wxXmlResource_LoadBitmap, 2498). +-define(wxXmlResource_LoadDialog_2, 2499). +-define(wxXmlResource_LoadDialog_3, 2500). +-define(wxXmlResource_LoadFrame_2, 2501). +-define(wxXmlResource_LoadFrame_3, 2502). +-define(wxXmlResource_LoadIcon, 2503). +-define(wxXmlResource_LoadMenu, 2504). +-define(wxXmlResource_LoadMenuBar_2, 2505). +-define(wxXmlResource_LoadMenuBar_1, 2506). +-define(wxXmlResource_LoadPanel_2, 2507). +-define(wxXmlResource_LoadPanel_3, 2508). +-define(wxXmlResource_LoadToolBar, 2509). +-define(wxXmlResource_Set, 2510). +-define(wxXmlResource_SetFlags, 2511). +-define(wxXmlResource_Unload, 2512). +-define(wxXmlResource_xrcctrl, 2513). +-define(wxHtmlEasyPrinting_new, 2514). +-define(wxHtmlEasyPrinting_destruct, 2515). +-define(wxHtmlEasyPrinting_GetPrintData, 2516). +-define(wxHtmlEasyPrinting_GetPageSetupData, 2517). +-define(wxHtmlEasyPrinting_PreviewFile, 2518). +-define(wxHtmlEasyPrinting_PreviewText, 2519). +-define(wxHtmlEasyPrinting_PrintFile, 2520). +-define(wxHtmlEasyPrinting_PrintText, 2521). +-define(wxHtmlEasyPrinting_PageSetup, 2522). +-define(wxHtmlEasyPrinting_SetFonts, 2523). +-define(wxHtmlEasyPrinting_SetHeader, 2524). +-define(wxHtmlEasyPrinting_SetFooter, 2525). +-define(wxGLCanvas_new_2, 2527). +-define(wxGLCanvas_new_3_1, 2528). +-define(wxGLCanvas_new_3_0, 2529). +-define(wxGLCanvas_GetContext, 2530). +-define(wxGLCanvas_SetCurrent, 2532). +-define(wxGLCanvas_SwapBuffers, 2533). +-define(wxGLCanvas_destroy, 2534). +-define(wxAuiManager_new, 2535). +-define(wxAuiManager_destruct, 2536). +-define(wxAuiManager_AddPane_2_1, 2537). +-define(wxAuiManager_AddPane_3, 2538). +-define(wxAuiManager_AddPane_2_0, 2539). +-define(wxAuiManager_DetachPane, 2540). +-define(wxAuiManager_GetAllPanes, 2541). +-define(wxAuiManager_GetArtProvider, 2542). +-define(wxAuiManager_GetDockSizeConstraint, 2543). +-define(wxAuiManager_GetFlags, 2544). +-define(wxAuiManager_GetManagedWindow, 2545). +-define(wxAuiManager_GetManager, 2546). +-define(wxAuiManager_GetPane_1_1, 2547). +-define(wxAuiManager_GetPane_1_0, 2548). +-define(wxAuiManager_HideHint, 2549). +-define(wxAuiManager_InsertPane, 2550). +-define(wxAuiManager_LoadPaneInfo, 2551). +-define(wxAuiManager_LoadPerspective, 2552). +-define(wxAuiManager_SavePaneInfo, 2553). +-define(wxAuiManager_SavePerspective, 2554). +-define(wxAuiManager_SetArtProvider, 2555). +-define(wxAuiManager_SetDockSizeConstraint, 2556). +-define(wxAuiManager_SetFlags, 2557). +-define(wxAuiManager_SetManagedWindow, 2558). +-define(wxAuiManager_ShowHint, 2559). +-define(wxAuiManager_UnInit, 2560). +-define(wxAuiManager_Update, 2561). +-define(wxAuiPaneInfo_new_0, 2562). +-define(wxAuiPaneInfo_new_1, 2563). +-define(wxAuiPaneInfo_destruct, 2564). +-define(wxAuiPaneInfo_BestSize_1, 2565). +-define(wxAuiPaneInfo_BestSize_2, 2566). +-define(wxAuiPaneInfo_Bottom, 2567). +-define(wxAuiPaneInfo_BottomDockable, 2568). +-define(wxAuiPaneInfo_Caption, 2569). +-define(wxAuiPaneInfo_CaptionVisible, 2570). +-define(wxAuiPaneInfo_Centre, 2571). +-define(wxAuiPaneInfo_CentrePane, 2572). +-define(wxAuiPaneInfo_CloseButton, 2573). +-define(wxAuiPaneInfo_DefaultPane, 2574). +-define(wxAuiPaneInfo_DestroyOnClose, 2575). +-define(wxAuiPaneInfo_Direction, 2576). +-define(wxAuiPaneInfo_Dock, 2577). +-define(wxAuiPaneInfo_Dockable, 2578). +-define(wxAuiPaneInfo_Fixed, 2579). +-define(wxAuiPaneInfo_Float, 2580). +-define(wxAuiPaneInfo_Floatable, 2581). +-define(wxAuiPaneInfo_FloatingPosition_1, 2582). +-define(wxAuiPaneInfo_FloatingPosition_2, 2583). +-define(wxAuiPaneInfo_FloatingSize_1, 2584). +-define(wxAuiPaneInfo_FloatingSize_2, 2585). +-define(wxAuiPaneInfo_Gripper, 2586). +-define(wxAuiPaneInfo_GripperTop, 2587). +-define(wxAuiPaneInfo_HasBorder, 2588). +-define(wxAuiPaneInfo_HasCaption, 2589). +-define(wxAuiPaneInfo_HasCloseButton, 2590). +-define(wxAuiPaneInfo_HasFlag, 2591). +-define(wxAuiPaneInfo_HasGripper, 2592). +-define(wxAuiPaneInfo_HasGripperTop, 2593). +-define(wxAuiPaneInfo_HasMaximizeButton, 2594). +-define(wxAuiPaneInfo_HasMinimizeButton, 2595). +-define(wxAuiPaneInfo_HasPinButton, 2596). +-define(wxAuiPaneInfo_Hide, 2597). +-define(wxAuiPaneInfo_IsBottomDockable, 2598). +-define(wxAuiPaneInfo_IsDocked, 2599). +-define(wxAuiPaneInfo_IsFixed, 2600). +-define(wxAuiPaneInfo_IsFloatable, 2601). +-define(wxAuiPaneInfo_IsFloating, 2602). +-define(wxAuiPaneInfo_IsLeftDockable, 2603). +-define(wxAuiPaneInfo_IsMovable, 2604). +-define(wxAuiPaneInfo_IsOk, 2605). +-define(wxAuiPaneInfo_IsResizable, 2606). +-define(wxAuiPaneInfo_IsRightDockable, 2607). +-define(wxAuiPaneInfo_IsShown, 2608). +-define(wxAuiPaneInfo_IsToolbar, 2609). +-define(wxAuiPaneInfo_IsTopDockable, 2610). +-define(wxAuiPaneInfo_Layer, 2611). +-define(wxAuiPaneInfo_Left, 2612). +-define(wxAuiPaneInfo_LeftDockable, 2613). +-define(wxAuiPaneInfo_MaxSize_1, 2614). +-define(wxAuiPaneInfo_MaxSize_2, 2615). +-define(wxAuiPaneInfo_MaximizeButton, 2616). +-define(wxAuiPaneInfo_MinSize_1, 2617). +-define(wxAuiPaneInfo_MinSize_2, 2618). +-define(wxAuiPaneInfo_MinimizeButton, 2619). +-define(wxAuiPaneInfo_Movable, 2620). +-define(wxAuiPaneInfo_Name, 2621). +-define(wxAuiPaneInfo_PaneBorder, 2622). +-define(wxAuiPaneInfo_PinButton, 2623). +-define(wxAuiPaneInfo_Position, 2624). +-define(wxAuiPaneInfo_Resizable, 2625). +-define(wxAuiPaneInfo_Right, 2626). +-define(wxAuiPaneInfo_RightDockable, 2627). +-define(wxAuiPaneInfo_Row, 2628). +-define(wxAuiPaneInfo_SafeSet, 2629). +-define(wxAuiPaneInfo_SetFlag, 2630). +-define(wxAuiPaneInfo_Show, 2631). +-define(wxAuiPaneInfo_ToolbarPane, 2632). +-define(wxAuiPaneInfo_Top, 2633). +-define(wxAuiPaneInfo_TopDockable, 2634). +-define(wxAuiPaneInfo_Window, 2635). +-define(wxAuiNotebook_new_0, 2636). +-define(wxAuiNotebook_new_2, 2637). +-define(wxAuiNotebook_AddPage, 2638). +-define(wxAuiNotebook_Create, 2639). +-define(wxAuiNotebook_DeletePage, 2640). +-define(wxAuiNotebook_GetArtProvider, 2641). +-define(wxAuiNotebook_GetPage, 2642). +-define(wxAuiNotebook_GetPageBitmap, 2643). +-define(wxAuiNotebook_GetPageCount, 2644). +-define(wxAuiNotebook_GetPageIndex, 2645). +-define(wxAuiNotebook_GetPageText, 2646). +-define(wxAuiNotebook_GetSelection, 2647). +-define(wxAuiNotebook_InsertPage, 2648). +-define(wxAuiNotebook_RemovePage, 2649). +-define(wxAuiNotebook_SetArtProvider, 2650). +-define(wxAuiNotebook_SetFont, 2651). +-define(wxAuiNotebook_SetPageBitmap, 2652). +-define(wxAuiNotebook_SetPageText, 2653). +-define(wxAuiNotebook_SetSelection, 2654). +-define(wxAuiNotebook_SetTabCtrlHeight, 2655). +-define(wxAuiNotebook_SetUniformBitmapSize, 2656). +-define(wxAuiNotebook_destroy, 2657). +-define(wxMDIParentFrame_new_0, 2658). +-define(wxMDIParentFrame_new_4, 2659). +-define(wxMDIParentFrame_destruct, 2660). +-define(wxMDIParentFrame_ActivateNext, 2661). +-define(wxMDIParentFrame_ActivatePrevious, 2662). +-define(wxMDIParentFrame_ArrangeIcons, 2663). +-define(wxMDIParentFrame_Cascade, 2664). +-define(wxMDIParentFrame_Create, 2665). +-define(wxMDIParentFrame_GetActiveChild, 2666). +-define(wxMDIParentFrame_GetClientWindow, 2667). +-define(wxMDIParentFrame_Tile, 2668). +-define(wxMDIChildFrame_new_0, 2669). +-define(wxMDIChildFrame_new_4, 2670). +-define(wxMDIChildFrame_destruct, 2671). +-define(wxMDIChildFrame_Activate, 2672). +-define(wxMDIChildFrame_Create, 2673). +-define(wxMDIChildFrame_Maximize, 2674). +-define(wxMDIChildFrame_Restore, 2675). +-define(wxMDIClientWindow_new_0, 2676). +-define(wxMDIClientWindow_new_2, 2677). +-define(wxMDIClientWindow_destruct, 2678). +-define(wxMDIClientWindow_CreateClient, 2679). +-define(wxLayoutAlgorithm_new, 2680). +-define(wxLayoutAlgorithm_LayoutFrame, 2681). +-define(wxLayoutAlgorithm_LayoutMDIFrame, 2682). +-define(wxLayoutAlgorithm_LayoutWindow, 2683). +-define(wxLayoutAlgorithm_destroy, 2684). +-define(wxEvent_GetId, 2685). +-define(wxEvent_GetSkipped, 2686). +-define(wxEvent_GetTimestamp, 2687). +-define(wxEvent_IsCommandEvent, 2688). +-define(wxEvent_ResumePropagation, 2689). +-define(wxEvent_ShouldPropagate, 2690). +-define(wxEvent_Skip, 2691). +-define(wxEvent_StopPropagation, 2692). +-define(wxCommandEvent_getClientData, 2693). +-define(wxCommandEvent_GetExtraLong, 2694). +-define(wxCommandEvent_GetInt, 2695). +-define(wxCommandEvent_GetSelection, 2696). +-define(wxCommandEvent_GetString, 2697). +-define(wxCommandEvent_IsChecked, 2698). +-define(wxCommandEvent_IsSelection, 2699). +-define(wxCommandEvent_SetInt, 2700). +-define(wxCommandEvent_SetString, 2701). +-define(wxScrollEvent_GetOrientation, 2702). +-define(wxScrollEvent_GetPosition, 2703). +-define(wxScrollWinEvent_GetOrientation, 2704). +-define(wxScrollWinEvent_GetPosition, 2705). +-define(wxMouseEvent_AltDown, 2706). +-define(wxMouseEvent_Button, 2707). +-define(wxMouseEvent_ButtonDClick, 2708). +-define(wxMouseEvent_ButtonDown, 2709). +-define(wxMouseEvent_ButtonUp, 2710). +-define(wxMouseEvent_CmdDown, 2711). +-define(wxMouseEvent_ControlDown, 2712). +-define(wxMouseEvent_Dragging, 2713). +-define(wxMouseEvent_Entering, 2714). +-define(wxMouseEvent_GetButton, 2715). +-define(wxMouseEvent_GetPosition, 2718). +-define(wxMouseEvent_GetLogicalPosition, 2719). +-define(wxMouseEvent_GetLinesPerAction, 2720). +-define(wxMouseEvent_GetWheelRotation, 2721). +-define(wxMouseEvent_GetWheelDelta, 2722). +-define(wxMouseEvent_GetX, 2723). +-define(wxMouseEvent_GetY, 2724). +-define(wxMouseEvent_IsButton, 2725). +-define(wxMouseEvent_IsPageScroll, 2726). +-define(wxMouseEvent_Leaving, 2727). +-define(wxMouseEvent_LeftDClick, 2728). +-define(wxMouseEvent_LeftDown, 2729). +-define(wxMouseEvent_LeftIsDown, 2730). +-define(wxMouseEvent_LeftUp, 2731). +-define(wxMouseEvent_MetaDown, 2732). +-define(wxMouseEvent_MiddleDClick, 2733). +-define(wxMouseEvent_MiddleDown, 2734). +-define(wxMouseEvent_MiddleIsDown, 2735). +-define(wxMouseEvent_MiddleUp, 2736). +-define(wxMouseEvent_Moving, 2737). +-define(wxMouseEvent_RightDClick, 2738). +-define(wxMouseEvent_RightDown, 2739). +-define(wxMouseEvent_RightIsDown, 2740). +-define(wxMouseEvent_RightUp, 2741). +-define(wxMouseEvent_ShiftDown, 2742). +-define(wxSetCursorEvent_GetCursor, 2743). +-define(wxSetCursorEvent_GetX, 2744). +-define(wxSetCursorEvent_GetY, 2745). +-define(wxSetCursorEvent_HasCursor, 2746). +-define(wxSetCursorEvent_SetCursor, 2747). +-define(wxKeyEvent_AltDown, 2748). +-define(wxKeyEvent_CmdDown, 2749). +-define(wxKeyEvent_ControlDown, 2750). +-define(wxKeyEvent_GetKeyCode, 2751). +-define(wxKeyEvent_GetModifiers, 2752). +-define(wxKeyEvent_GetPosition, 2755). +-define(wxKeyEvent_GetRawKeyCode, 2756). +-define(wxKeyEvent_GetRawKeyFlags, 2757). +-define(wxKeyEvent_GetUnicodeKey, 2758). +-define(wxKeyEvent_GetX, 2759). +-define(wxKeyEvent_GetY, 2760). +-define(wxKeyEvent_HasModifiers, 2761). +-define(wxKeyEvent_MetaDown, 2762). +-define(wxKeyEvent_ShiftDown, 2763). +-define(wxSizeEvent_GetSize, 2764). +-define(wxMoveEvent_GetPosition, 2765). +-define(wxEraseEvent_GetDC, 2766). +-define(wxFocusEvent_GetWindow, 2767). +-define(wxChildFocusEvent_GetWindow, 2768). +-define(wxMenuEvent_GetMenu, 2769). +-define(wxMenuEvent_GetMenuId, 2770). +-define(wxMenuEvent_IsPopup, 2771). +-define(wxCloseEvent_CanVeto, 2772). +-define(wxCloseEvent_GetLoggingOff, 2773). +-define(wxCloseEvent_SetCanVeto, 2774). +-define(wxCloseEvent_SetLoggingOff, 2775). +-define(wxCloseEvent_Veto, 2776). +-define(wxShowEvent_SetShow, 2777). +-define(wxShowEvent_GetShow, 2778). +-define(wxIconizeEvent_Iconized, 2779). +-define(wxJoystickEvent_ButtonDown, 2780). +-define(wxJoystickEvent_ButtonIsDown, 2781). +-define(wxJoystickEvent_ButtonUp, 2782). +-define(wxJoystickEvent_GetButtonChange, 2783). +-define(wxJoystickEvent_GetButtonState, 2784). +-define(wxJoystickEvent_GetJoystick, 2785). +-define(wxJoystickEvent_GetPosition, 2786). +-define(wxJoystickEvent_GetZPosition, 2787). +-define(wxJoystickEvent_IsButton, 2788). +-define(wxJoystickEvent_IsMove, 2789). +-define(wxJoystickEvent_IsZMove, 2790). +-define(wxUpdateUIEvent_CanUpdate, 2791). +-define(wxUpdateUIEvent_Check, 2792). +-define(wxUpdateUIEvent_Enable, 2793). +-define(wxUpdateUIEvent_Show, 2794). +-define(wxUpdateUIEvent_GetChecked, 2795). +-define(wxUpdateUIEvent_GetEnabled, 2796). +-define(wxUpdateUIEvent_GetShown, 2797). +-define(wxUpdateUIEvent_GetSetChecked, 2798). +-define(wxUpdateUIEvent_GetSetEnabled, 2799). +-define(wxUpdateUIEvent_GetSetShown, 2800). +-define(wxUpdateUIEvent_GetSetText, 2801). +-define(wxUpdateUIEvent_GetText, 2802). +-define(wxUpdateUIEvent_GetMode, 2803). +-define(wxUpdateUIEvent_GetUpdateInterval, 2804). +-define(wxUpdateUIEvent_ResetUpdateTime, 2805). +-define(wxUpdateUIEvent_SetMode, 2806). +-define(wxUpdateUIEvent_SetText, 2807). +-define(wxUpdateUIEvent_SetUpdateInterval, 2808). +-define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2809). +-define(wxPaletteChangedEvent_SetChangedWindow, 2810). +-define(wxPaletteChangedEvent_GetChangedWindow, 2811). +-define(wxQueryNewPaletteEvent_SetPaletteRealized, 2812). +-define(wxQueryNewPaletteEvent_GetPaletteRealized, 2813). +-define(wxNavigationKeyEvent_GetDirection, 2814). +-define(wxNavigationKeyEvent_SetDirection, 2815). +-define(wxNavigationKeyEvent_IsWindowChange, 2816). +-define(wxNavigationKeyEvent_SetWindowChange, 2817). +-define(wxNavigationKeyEvent_IsFromTab, 2818). +-define(wxNavigationKeyEvent_SetFromTab, 2819). +-define(wxNavigationKeyEvent_GetCurrentFocus, 2820). +-define(wxNavigationKeyEvent_SetCurrentFocus, 2821). +-define(wxHelpEvent_GetOrigin, 2822). +-define(wxHelpEvent_GetPosition, 2823). +-define(wxHelpEvent_SetOrigin, 2824). +-define(wxHelpEvent_SetPosition, 2825). +-define(wxContextMenuEvent_GetPosition, 2826). +-define(wxContextMenuEvent_SetPosition, 2827). +-define(wxIdleEvent_CanSend, 2828). +-define(wxIdleEvent_GetMode, 2829). +-define(wxIdleEvent_RequestMore, 2830). +-define(wxIdleEvent_MoreRequested, 2831). +-define(wxIdleEvent_SetMode, 2832). +-define(wxGridEvent_AltDown, 2833). +-define(wxGridEvent_ControlDown, 2834). +-define(wxGridEvent_GetCol, 2835). +-define(wxGridEvent_GetPosition, 2836). +-define(wxGridEvent_GetRow, 2837). +-define(wxGridEvent_MetaDown, 2838). +-define(wxGridEvent_Selecting, 2839). +-define(wxGridEvent_ShiftDown, 2840). +-define(wxNotifyEvent_Allow, 2841). +-define(wxNotifyEvent_IsAllowed, 2842). +-define(wxNotifyEvent_Veto, 2843). +-define(wxSashEvent_GetEdge, 2844). +-define(wxSashEvent_GetDragRect, 2845). +-define(wxSashEvent_GetDragStatus, 2846). +-define(wxListEvent_GetCacheFrom, 2847). +-define(wxListEvent_GetCacheTo, 2848). +-define(wxListEvent_GetKeyCode, 2849). +-define(wxListEvent_GetIndex, 2850). +-define(wxListEvent_GetColumn, 2851). +-define(wxListEvent_GetPoint, 2852). +-define(wxListEvent_GetLabel, 2853). +-define(wxListEvent_GetText, 2854). +-define(wxListEvent_GetImage, 2855). +-define(wxListEvent_GetData, 2856). +-define(wxListEvent_GetMask, 2857). +-define(wxListEvent_GetItem, 2858). +-define(wxListEvent_IsEditCancelled, 2859). +-define(wxDateEvent_GetDate, 2860). +-define(wxCalendarEvent_GetWeekDay, 2861). +-define(wxFileDirPickerEvent_GetPath, 2862). +-define(wxColourPickerEvent_GetColour, 2863). +-define(wxFontPickerEvent_GetFont, 2864). +-define(wxStyledTextEvent_GetPosition, 2865). +-define(wxStyledTextEvent_GetKey, 2866). +-define(wxStyledTextEvent_GetModifiers, 2867). +-define(wxStyledTextEvent_GetModificationType, 2868). +-define(wxStyledTextEvent_GetText, 2869). +-define(wxStyledTextEvent_GetLength, 2870). +-define(wxStyledTextEvent_GetLinesAdded, 2871). +-define(wxStyledTextEvent_GetLine, 2872). +-define(wxStyledTextEvent_GetFoldLevelNow, 2873). +-define(wxStyledTextEvent_GetFoldLevelPrev, 2874). +-define(wxStyledTextEvent_GetMargin, 2875). +-define(wxStyledTextEvent_GetMessage, 2876). +-define(wxStyledTextEvent_GetWParam, 2877). +-define(wxStyledTextEvent_GetLParam, 2878). +-define(wxStyledTextEvent_GetListType, 2879). +-define(wxStyledTextEvent_GetX, 2880). +-define(wxStyledTextEvent_GetY, 2881). +-define(wxStyledTextEvent_GetDragText, 2882). +-define(wxStyledTextEvent_GetDragAllowMove, 2883). +-define(wxStyledTextEvent_GetDragResult, 2884). +-define(wxStyledTextEvent_GetShift, 2885). +-define(wxStyledTextEvent_GetControl, 2886). +-define(wxStyledTextEvent_GetAlt, 2887). +-define(utils_wxGetKeyState, 2888). +-define(utils_wxGetMousePosition, 2889). +-define(utils_wxGetMouseState, 2890). +-define(utils_wxSetDetectableAutoRepeat, 2891). +-define(utils_wxBell, 2892). +-define(utils_wxFindMenuItemId, 2893). +-define(utils_wxGenericFindWindowAtPoint, 2894). +-define(utils_wxFindWindowAtPoint, 2895). +-define(utils_wxBeginBusyCursor, 2896). +-define(utils_wxEndBusyCursor, 2897). +-define(utils_wxIsBusy, 2898). +-define(utils_wxShutdown, 2899). +-define(utils_wxShell, 2900). +-define(utils_wxLaunchDefaultBrowser, 2901). +-define(utils_wxGetEmailAddress, 2902). +-define(utils_wxGetUserId, 2903). +-define(utils_wxGetHomeDir, 2904). +-define(utils_wxNewId, 2905). +-define(utils_wxRegisterId, 2906). +-define(utils_wxGetCurrentId, 2907). +-define(utils_wxGetOsDescription, 2908). +-define(utils_wxIsPlatformLittleEndian, 2909). +-define(utils_wxIsPlatform64Bit, 2910). +-define(wxPrintout_new, 2911). +-define(wxPrintout_destruct, 2912). +-define(wxPrintout_GetDC, 2913). +-define(wxPrintout_GetPageSizeMM, 2914). +-define(wxPrintout_GetPageSizePixels, 2915). +-define(wxPrintout_GetPaperRectPixels, 2916). +-define(wxPrintout_GetPPIPrinter, 2917). +-define(wxPrintout_GetPPIScreen, 2918). +-define(wxPrintout_GetTitle, 2919). +-define(wxPrintout_IsPreview, 2920). +-define(wxPrintout_FitThisSizeToPaper, 2921). +-define(wxPrintout_FitThisSizeToPage, 2922). +-define(wxPrintout_FitThisSizeToPageMargins, 2923). +-define(wxPrintout_MapScreenSizeToPaper, 2924). +-define(wxPrintout_MapScreenSizeToPage, 2925). +-define(wxPrintout_MapScreenSizeToPageMargins, 2926). +-define(wxPrintout_MapScreenSizeToDevice, 2927). +-define(wxPrintout_GetLogicalPaperRect, 2928). +-define(wxPrintout_GetLogicalPageRect, 2929). +-define(wxPrintout_GetLogicalPageMarginsRect, 2930). +-define(wxPrintout_SetLogicalOrigin, 2931). +-define(wxPrintout_OffsetLogicalOrigin, 2932). +-define(wxStyledTextCtrl_new_2, 2933). +-define(wxStyledTextCtrl_new_0, 2934). +-define(wxStyledTextCtrl_destruct, 2935). +-define(wxStyledTextCtrl_Create, 2936). +-define(wxStyledTextCtrl_AddText, 2937). +-define(wxStyledTextCtrl_AddStyledText, 2938). +-define(wxStyledTextCtrl_InsertText, 2939). +-define(wxStyledTextCtrl_ClearAll, 2940). +-define(wxStyledTextCtrl_ClearDocumentStyle, 2941). +-define(wxStyledTextCtrl_GetLength, 2942). +-define(wxStyledTextCtrl_GetCharAt, 2943). +-define(wxStyledTextCtrl_GetCurrentPos, 2944). +-define(wxStyledTextCtrl_GetAnchor, 2945). +-define(wxStyledTextCtrl_GetStyleAt, 2946). +-define(wxStyledTextCtrl_Redo, 2947). +-define(wxStyledTextCtrl_SetUndoCollection, 2948). +-define(wxStyledTextCtrl_SelectAll, 2949). +-define(wxStyledTextCtrl_SetSavePoint, 2950). +-define(wxStyledTextCtrl_GetStyledText, 2951). +-define(wxStyledTextCtrl_CanRedo, 2952). +-define(wxStyledTextCtrl_MarkerLineFromHandle, 2953). +-define(wxStyledTextCtrl_MarkerDeleteHandle, 2954). +-define(wxStyledTextCtrl_GetUndoCollection, 2955). +-define(wxStyledTextCtrl_GetViewWhiteSpace, 2956). +-define(wxStyledTextCtrl_SetViewWhiteSpace, 2957). +-define(wxStyledTextCtrl_PositionFromPoint, 2958). +-define(wxStyledTextCtrl_PositionFromPointClose, 2959). +-define(wxStyledTextCtrl_GotoLine, 2960). +-define(wxStyledTextCtrl_GotoPos, 2961). +-define(wxStyledTextCtrl_SetAnchor, 2962). +-define(wxStyledTextCtrl_GetCurLine, 2963). +-define(wxStyledTextCtrl_GetEndStyled, 2964). +-define(wxStyledTextCtrl_ConvertEOLs, 2965). +-define(wxStyledTextCtrl_GetEOLMode, 2966). +-define(wxStyledTextCtrl_SetEOLMode, 2967). +-define(wxStyledTextCtrl_StartStyling, 2968). +-define(wxStyledTextCtrl_SetStyling, 2969). +-define(wxStyledTextCtrl_GetBufferedDraw, 2970). +-define(wxStyledTextCtrl_SetBufferedDraw, 2971). +-define(wxStyledTextCtrl_SetTabWidth, 2972). +-define(wxStyledTextCtrl_GetTabWidth, 2973). +-define(wxStyledTextCtrl_SetCodePage, 2974). +-define(wxStyledTextCtrl_MarkerDefine, 2975). +-define(wxStyledTextCtrl_MarkerSetForeground, 2976). +-define(wxStyledTextCtrl_MarkerSetBackground, 2977). +-define(wxStyledTextCtrl_MarkerAdd, 2978). +-define(wxStyledTextCtrl_MarkerDelete, 2979). +-define(wxStyledTextCtrl_MarkerDeleteAll, 2980). +-define(wxStyledTextCtrl_MarkerGet, 2981). +-define(wxStyledTextCtrl_MarkerNext, 2982). +-define(wxStyledTextCtrl_MarkerPrevious, 2983). +-define(wxStyledTextCtrl_MarkerDefineBitmap, 2984). +-define(wxStyledTextCtrl_MarkerAddSet, 2985). +-define(wxStyledTextCtrl_MarkerSetAlpha, 2986). +-define(wxStyledTextCtrl_SetMarginType, 2987). +-define(wxStyledTextCtrl_GetMarginType, 2988). +-define(wxStyledTextCtrl_SetMarginWidth, 2989). +-define(wxStyledTextCtrl_GetMarginWidth, 2990). +-define(wxStyledTextCtrl_SetMarginMask, 2991). +-define(wxStyledTextCtrl_GetMarginMask, 2992). +-define(wxStyledTextCtrl_SetMarginSensitive, 2993). +-define(wxStyledTextCtrl_GetMarginSensitive, 2994). +-define(wxStyledTextCtrl_StyleClearAll, 2995). +-define(wxStyledTextCtrl_StyleSetForeground, 2996). +-define(wxStyledTextCtrl_StyleSetBackground, 2997). +-define(wxStyledTextCtrl_StyleSetBold, 2998). +-define(wxStyledTextCtrl_StyleSetItalic, 2999). +-define(wxStyledTextCtrl_StyleSetSize, 3000). +-define(wxStyledTextCtrl_StyleSetFaceName, 3001). +-define(wxStyledTextCtrl_StyleSetEOLFilled, 3002). +-define(wxStyledTextCtrl_StyleResetDefault, 3003). +-define(wxStyledTextCtrl_StyleSetUnderline, 3004). +-define(wxStyledTextCtrl_StyleSetCase, 3005). +-define(wxStyledTextCtrl_StyleSetHotSpot, 3006). +-define(wxStyledTextCtrl_SetSelForeground, 3007). +-define(wxStyledTextCtrl_SetSelBackground, 3008). +-define(wxStyledTextCtrl_GetSelAlpha, 3009). +-define(wxStyledTextCtrl_SetSelAlpha, 3010). +-define(wxStyledTextCtrl_SetCaretForeground, 3011). +-define(wxStyledTextCtrl_CmdKeyAssign, 3012). +-define(wxStyledTextCtrl_CmdKeyClear, 3013). +-define(wxStyledTextCtrl_CmdKeyClearAll, 3014). +-define(wxStyledTextCtrl_SetStyleBytes, 3015). +-define(wxStyledTextCtrl_StyleSetVisible, 3016). +-define(wxStyledTextCtrl_GetCaretPeriod, 3017). +-define(wxStyledTextCtrl_SetCaretPeriod, 3018). +-define(wxStyledTextCtrl_SetWordChars, 3019). +-define(wxStyledTextCtrl_BeginUndoAction, 3020). +-define(wxStyledTextCtrl_EndUndoAction, 3021). +-define(wxStyledTextCtrl_IndicatorSetStyle, 3022). +-define(wxStyledTextCtrl_IndicatorGetStyle, 3023). +-define(wxStyledTextCtrl_IndicatorSetForeground, 3024). +-define(wxStyledTextCtrl_IndicatorGetForeground, 3025). +-define(wxStyledTextCtrl_SetWhitespaceForeground, 3026). +-define(wxStyledTextCtrl_SetWhitespaceBackground, 3027). +-define(wxStyledTextCtrl_GetStyleBits, 3028). +-define(wxStyledTextCtrl_SetLineState, 3029). +-define(wxStyledTextCtrl_GetLineState, 3030). +-define(wxStyledTextCtrl_GetMaxLineState, 3031). +-define(wxStyledTextCtrl_GetCaretLineVisible, 3032). +-define(wxStyledTextCtrl_SetCaretLineVisible, 3033). +-define(wxStyledTextCtrl_GetCaretLineBackground, 3034). +-define(wxStyledTextCtrl_SetCaretLineBackground, 3035). +-define(wxStyledTextCtrl_AutoCompShow, 3036). +-define(wxStyledTextCtrl_AutoCompCancel, 3037). +-define(wxStyledTextCtrl_AutoCompActive, 3038). +-define(wxStyledTextCtrl_AutoCompPosStart, 3039). +-define(wxStyledTextCtrl_AutoCompComplete, 3040). +-define(wxStyledTextCtrl_AutoCompStops, 3041). +-define(wxStyledTextCtrl_AutoCompSetSeparator, 3042). +-define(wxStyledTextCtrl_AutoCompGetSeparator, 3043). +-define(wxStyledTextCtrl_AutoCompSelect, 3044). +-define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3045). +-define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3046). +-define(wxStyledTextCtrl_AutoCompSetFillUps, 3047). +-define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3048). +-define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3049). +-define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3050). +-define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3051). +-define(wxStyledTextCtrl_UserListShow, 3052). +-define(wxStyledTextCtrl_AutoCompSetAutoHide, 3053). +-define(wxStyledTextCtrl_AutoCompGetAutoHide, 3054). +-define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3055). +-define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3056). +-define(wxStyledTextCtrl_RegisterImage, 3057). +-define(wxStyledTextCtrl_ClearRegisteredImages, 3058). +-define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3059). +-define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3060). +-define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3061). +-define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3062). +-define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3063). +-define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3064). +-define(wxStyledTextCtrl_SetIndent, 3065). +-define(wxStyledTextCtrl_GetIndent, 3066). +-define(wxStyledTextCtrl_SetUseTabs, 3067). +-define(wxStyledTextCtrl_GetUseTabs, 3068). +-define(wxStyledTextCtrl_SetLineIndentation, 3069). +-define(wxStyledTextCtrl_GetLineIndentation, 3070). +-define(wxStyledTextCtrl_GetLineIndentPosition, 3071). +-define(wxStyledTextCtrl_GetColumn, 3072). +-define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3073). +-define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3074). +-define(wxStyledTextCtrl_SetIndentationGuides, 3075). +-define(wxStyledTextCtrl_GetIndentationGuides, 3076). +-define(wxStyledTextCtrl_SetHighlightGuide, 3077). +-define(wxStyledTextCtrl_GetHighlightGuide, 3078). +-define(wxStyledTextCtrl_GetLineEndPosition, 3079). +-define(wxStyledTextCtrl_GetCodePage, 3080). +-define(wxStyledTextCtrl_GetCaretForeground, 3081). +-define(wxStyledTextCtrl_GetReadOnly, 3082). +-define(wxStyledTextCtrl_SetCurrentPos, 3083). +-define(wxStyledTextCtrl_SetSelectionStart, 3084). +-define(wxStyledTextCtrl_GetSelectionStart, 3085). +-define(wxStyledTextCtrl_SetSelectionEnd, 3086). +-define(wxStyledTextCtrl_GetSelectionEnd, 3087). +-define(wxStyledTextCtrl_SetPrintMagnification, 3088). +-define(wxStyledTextCtrl_GetPrintMagnification, 3089). +-define(wxStyledTextCtrl_SetPrintColourMode, 3090). +-define(wxStyledTextCtrl_GetPrintColourMode, 3091). +-define(wxStyledTextCtrl_FindText, 3092). +-define(wxStyledTextCtrl_FormatRange, 3093). +-define(wxStyledTextCtrl_GetFirstVisibleLine, 3094). +-define(wxStyledTextCtrl_GetLine, 3095). +-define(wxStyledTextCtrl_GetLineCount, 3096). +-define(wxStyledTextCtrl_SetMarginLeft, 3097). +-define(wxStyledTextCtrl_GetMarginLeft, 3098). +-define(wxStyledTextCtrl_SetMarginRight, 3099). +-define(wxStyledTextCtrl_GetMarginRight, 3100). +-define(wxStyledTextCtrl_GetModify, 3101). +-define(wxStyledTextCtrl_SetSelection, 3102). +-define(wxStyledTextCtrl_GetSelectedText, 3103). +-define(wxStyledTextCtrl_GetTextRange, 3104). +-define(wxStyledTextCtrl_HideSelection, 3105). +-define(wxStyledTextCtrl_LineFromPosition, 3106). +-define(wxStyledTextCtrl_PositionFromLine, 3107). +-define(wxStyledTextCtrl_LineScroll, 3108). +-define(wxStyledTextCtrl_EnsureCaretVisible, 3109). +-define(wxStyledTextCtrl_ReplaceSelection, 3110). +-define(wxStyledTextCtrl_SetReadOnly, 3111). +-define(wxStyledTextCtrl_CanPaste, 3112). +-define(wxStyledTextCtrl_CanUndo, 3113). +-define(wxStyledTextCtrl_EmptyUndoBuffer, 3114). +-define(wxStyledTextCtrl_Undo, 3115). +-define(wxStyledTextCtrl_Cut, 3116). +-define(wxStyledTextCtrl_Copy, 3117). +-define(wxStyledTextCtrl_Paste, 3118). +-define(wxStyledTextCtrl_Clear, 3119). +-define(wxStyledTextCtrl_SetText, 3120). +-define(wxStyledTextCtrl_GetText, 3121). +-define(wxStyledTextCtrl_GetTextLength, 3122). +-define(wxStyledTextCtrl_GetOvertype, 3123). +-define(wxStyledTextCtrl_SetCaretWidth, 3124). +-define(wxStyledTextCtrl_GetCaretWidth, 3125). +-define(wxStyledTextCtrl_SetTargetStart, 3126). +-define(wxStyledTextCtrl_GetTargetStart, 3127). +-define(wxStyledTextCtrl_SetTargetEnd, 3128). +-define(wxStyledTextCtrl_GetTargetEnd, 3129). +-define(wxStyledTextCtrl_ReplaceTarget, 3130). +-define(wxStyledTextCtrl_SearchInTarget, 3131). +-define(wxStyledTextCtrl_SetSearchFlags, 3132). +-define(wxStyledTextCtrl_GetSearchFlags, 3133). +-define(wxStyledTextCtrl_CallTipShow, 3134). +-define(wxStyledTextCtrl_CallTipCancel, 3135). +-define(wxStyledTextCtrl_CallTipActive, 3136). +-define(wxStyledTextCtrl_CallTipPosAtStart, 3137). +-define(wxStyledTextCtrl_CallTipSetHighlight, 3138). +-define(wxStyledTextCtrl_CallTipSetBackground, 3139). +-define(wxStyledTextCtrl_CallTipSetForeground, 3140). +-define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3141). +-define(wxStyledTextCtrl_CallTipUseStyle, 3142). +-define(wxStyledTextCtrl_VisibleFromDocLine, 3143). +-define(wxStyledTextCtrl_DocLineFromVisible, 3144). +-define(wxStyledTextCtrl_WrapCount, 3145). +-define(wxStyledTextCtrl_SetFoldLevel, 3146). +-define(wxStyledTextCtrl_GetFoldLevel, 3147). +-define(wxStyledTextCtrl_GetLastChild, 3148). +-define(wxStyledTextCtrl_GetFoldParent, 3149). +-define(wxStyledTextCtrl_ShowLines, 3150). +-define(wxStyledTextCtrl_HideLines, 3151). +-define(wxStyledTextCtrl_GetLineVisible, 3152). +-define(wxStyledTextCtrl_SetFoldExpanded, 3153). +-define(wxStyledTextCtrl_GetFoldExpanded, 3154). +-define(wxStyledTextCtrl_ToggleFold, 3155). +-define(wxStyledTextCtrl_EnsureVisible, 3156). +-define(wxStyledTextCtrl_SetFoldFlags, 3157). +-define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3158). +-define(wxStyledTextCtrl_SetTabIndents, 3159). +-define(wxStyledTextCtrl_GetTabIndents, 3160). +-define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3161). +-define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3162). +-define(wxStyledTextCtrl_SetMouseDwellTime, 3163). +-define(wxStyledTextCtrl_GetMouseDwellTime, 3164). +-define(wxStyledTextCtrl_WordStartPosition, 3165). +-define(wxStyledTextCtrl_WordEndPosition, 3166). +-define(wxStyledTextCtrl_SetWrapMode, 3167). +-define(wxStyledTextCtrl_GetWrapMode, 3168). +-define(wxStyledTextCtrl_SetWrapVisualFlags, 3169). +-define(wxStyledTextCtrl_GetWrapVisualFlags, 3170). +-define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3171). +-define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3172). +-define(wxStyledTextCtrl_SetWrapStartIndent, 3173). +-define(wxStyledTextCtrl_GetWrapStartIndent, 3174). +-define(wxStyledTextCtrl_SetLayoutCache, 3175). +-define(wxStyledTextCtrl_GetLayoutCache, 3176). +-define(wxStyledTextCtrl_SetScrollWidth, 3177). +-define(wxStyledTextCtrl_GetScrollWidth, 3178). +-define(wxStyledTextCtrl_TextWidth, 3179). +-define(wxStyledTextCtrl_GetEndAtLastLine, 3180). +-define(wxStyledTextCtrl_TextHeight, 3181). +-define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3182). +-define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3183). +-define(wxStyledTextCtrl_AppendText, 3184). +-define(wxStyledTextCtrl_GetTwoPhaseDraw, 3185). +-define(wxStyledTextCtrl_SetTwoPhaseDraw, 3186). +-define(wxStyledTextCtrl_TargetFromSelection, 3187). +-define(wxStyledTextCtrl_LinesJoin, 3188). +-define(wxStyledTextCtrl_LinesSplit, 3189). +-define(wxStyledTextCtrl_SetFoldMarginColour, 3190). +-define(wxStyledTextCtrl_SetFoldMarginHiColour, 3191). +-define(wxStyledTextCtrl_LineDown, 3192). +-define(wxStyledTextCtrl_LineDownExtend, 3193). +-define(wxStyledTextCtrl_LineUp, 3194). +-define(wxStyledTextCtrl_LineUpExtend, 3195). +-define(wxStyledTextCtrl_CharLeft, 3196). +-define(wxStyledTextCtrl_CharLeftExtend, 3197). +-define(wxStyledTextCtrl_CharRight, 3198). +-define(wxStyledTextCtrl_CharRightExtend, 3199). +-define(wxStyledTextCtrl_WordLeft, 3200). +-define(wxStyledTextCtrl_WordLeftExtend, 3201). +-define(wxStyledTextCtrl_WordRight, 3202). +-define(wxStyledTextCtrl_WordRightExtend, 3203). +-define(wxStyledTextCtrl_Home, 3204). +-define(wxStyledTextCtrl_HomeExtend, 3205). +-define(wxStyledTextCtrl_LineEnd, 3206). +-define(wxStyledTextCtrl_LineEndExtend, 3207). +-define(wxStyledTextCtrl_DocumentStart, 3208). +-define(wxStyledTextCtrl_DocumentStartExtend, 3209). +-define(wxStyledTextCtrl_DocumentEnd, 3210). +-define(wxStyledTextCtrl_DocumentEndExtend, 3211). +-define(wxStyledTextCtrl_PageUp, 3212). +-define(wxStyledTextCtrl_PageUpExtend, 3213). +-define(wxStyledTextCtrl_PageDown, 3214). +-define(wxStyledTextCtrl_PageDownExtend, 3215). +-define(wxStyledTextCtrl_EditToggleOvertype, 3216). +-define(wxStyledTextCtrl_Cancel, 3217). +-define(wxStyledTextCtrl_DeleteBack, 3218). +-define(wxStyledTextCtrl_Tab, 3219). +-define(wxStyledTextCtrl_BackTab, 3220). +-define(wxStyledTextCtrl_NewLine, 3221). +-define(wxStyledTextCtrl_FormFeed, 3222). +-define(wxStyledTextCtrl_VCHome, 3223). +-define(wxStyledTextCtrl_VCHomeExtend, 3224). +-define(wxStyledTextCtrl_ZoomIn, 3225). +-define(wxStyledTextCtrl_ZoomOut, 3226). +-define(wxStyledTextCtrl_DelWordLeft, 3227). +-define(wxStyledTextCtrl_DelWordRight, 3228). +-define(wxStyledTextCtrl_LineCut, 3229). +-define(wxStyledTextCtrl_LineDelete, 3230). +-define(wxStyledTextCtrl_LineTranspose, 3231). +-define(wxStyledTextCtrl_LineDuplicate, 3232). +-define(wxStyledTextCtrl_LowerCase, 3233). +-define(wxStyledTextCtrl_UpperCase, 3234). +-define(wxStyledTextCtrl_LineScrollDown, 3235). +-define(wxStyledTextCtrl_LineScrollUp, 3236). +-define(wxStyledTextCtrl_DeleteBackNotLine, 3237). +-define(wxStyledTextCtrl_HomeDisplay, 3238). +-define(wxStyledTextCtrl_HomeDisplayExtend, 3239). +-define(wxStyledTextCtrl_LineEndDisplay, 3240). +-define(wxStyledTextCtrl_LineEndDisplayExtend, 3241). +-define(wxStyledTextCtrl_HomeWrapExtend, 3242). +-define(wxStyledTextCtrl_LineEndWrap, 3243). +-define(wxStyledTextCtrl_LineEndWrapExtend, 3244). +-define(wxStyledTextCtrl_VCHomeWrap, 3245). +-define(wxStyledTextCtrl_VCHomeWrapExtend, 3246). +-define(wxStyledTextCtrl_LineCopy, 3247). +-define(wxStyledTextCtrl_MoveCaretInsideView, 3248). +-define(wxStyledTextCtrl_LineLength, 3249). +-define(wxStyledTextCtrl_BraceHighlight, 3250). +-define(wxStyledTextCtrl_BraceBadLight, 3251). +-define(wxStyledTextCtrl_BraceMatch, 3252). +-define(wxStyledTextCtrl_GetViewEOL, 3253). +-define(wxStyledTextCtrl_SetViewEOL, 3254). +-define(wxStyledTextCtrl_SetModEventMask, 3255). +-define(wxStyledTextCtrl_GetEdgeColumn, 3256). +-define(wxStyledTextCtrl_SetEdgeColumn, 3257). +-define(wxStyledTextCtrl_GetEdgeMode, 3258). +-define(wxStyledTextCtrl_GetEdgeColour, 3259). +-define(wxStyledTextCtrl_SetEdgeColour, 3260). +-define(wxStyledTextCtrl_SearchAnchor, 3261). +-define(wxStyledTextCtrl_SearchNext, 3262). +-define(wxStyledTextCtrl_SearchPrev, 3263). +-define(wxStyledTextCtrl_LinesOnScreen, 3264). +-define(wxStyledTextCtrl_UsePopUp, 3265). +-define(wxStyledTextCtrl_SelectionIsRectangle, 3266). +-define(wxStyledTextCtrl_SetZoom, 3267). +-define(wxStyledTextCtrl_GetZoom, 3268). +-define(wxStyledTextCtrl_GetModEventMask, 3269). +-define(wxStyledTextCtrl_SetSTCFocus, 3270). +-define(wxStyledTextCtrl_GetSTCFocus, 3271). +-define(wxStyledTextCtrl_SetStatus, 3272). +-define(wxStyledTextCtrl_GetStatus, 3273). +-define(wxStyledTextCtrl_SetMouseDownCaptures, 3274). +-define(wxStyledTextCtrl_GetMouseDownCaptures, 3275). +-define(wxStyledTextCtrl_SetSTCCursor, 3276). +-define(wxStyledTextCtrl_GetSTCCursor, 3277). +-define(wxStyledTextCtrl_SetControlCharSymbol, 3278). +-define(wxStyledTextCtrl_GetControlCharSymbol, 3279). +-define(wxStyledTextCtrl_WordPartLeft, 3280). +-define(wxStyledTextCtrl_WordPartLeftExtend, 3281). +-define(wxStyledTextCtrl_WordPartRight, 3282). +-define(wxStyledTextCtrl_WordPartRightExtend, 3283). +-define(wxStyledTextCtrl_SetVisiblePolicy, 3284). +-define(wxStyledTextCtrl_DelLineLeft, 3285). +-define(wxStyledTextCtrl_DelLineRight, 3286). +-define(wxStyledTextCtrl_GetXOffset, 3287). +-define(wxStyledTextCtrl_ChooseCaretX, 3288). +-define(wxStyledTextCtrl_SetXCaretPolicy, 3289). +-define(wxStyledTextCtrl_SetYCaretPolicy, 3290). +-define(wxStyledTextCtrl_GetPrintWrapMode, 3291). +-define(wxStyledTextCtrl_SetHotspotActiveForeground, 3292). +-define(wxStyledTextCtrl_SetHotspotActiveBackground, 3293). +-define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3294). +-define(wxStyledTextCtrl_SetHotspotSingleLine, 3295). +-define(wxStyledTextCtrl_ParaDownExtend, 3296). +-define(wxStyledTextCtrl_ParaUp, 3297). +-define(wxStyledTextCtrl_ParaUpExtend, 3298). +-define(wxStyledTextCtrl_PositionBefore, 3299). +-define(wxStyledTextCtrl_PositionAfter, 3300). +-define(wxStyledTextCtrl_CopyRange, 3301). +-define(wxStyledTextCtrl_CopyText, 3302). +-define(wxStyledTextCtrl_SetSelectionMode, 3303). +-define(wxStyledTextCtrl_GetSelectionMode, 3304). +-define(wxStyledTextCtrl_LineDownRectExtend, 3305). +-define(wxStyledTextCtrl_LineUpRectExtend, 3306). +-define(wxStyledTextCtrl_CharLeftRectExtend, 3307). +-define(wxStyledTextCtrl_CharRightRectExtend, 3308). +-define(wxStyledTextCtrl_HomeRectExtend, 3309). +-define(wxStyledTextCtrl_VCHomeRectExtend, 3310). +-define(wxStyledTextCtrl_LineEndRectExtend, 3311). +-define(wxStyledTextCtrl_PageUpRectExtend, 3312). +-define(wxStyledTextCtrl_PageDownRectExtend, 3313). +-define(wxStyledTextCtrl_StutteredPageUp, 3314). +-define(wxStyledTextCtrl_StutteredPageUpExtend, 3315). +-define(wxStyledTextCtrl_StutteredPageDown, 3316). +-define(wxStyledTextCtrl_StutteredPageDownExtend, 3317). +-define(wxStyledTextCtrl_WordLeftEnd, 3318). +-define(wxStyledTextCtrl_WordLeftEndExtend, 3319). +-define(wxStyledTextCtrl_WordRightEnd, 3320). +-define(wxStyledTextCtrl_WordRightEndExtend, 3321). +-define(wxStyledTextCtrl_SetWhitespaceChars, 3322). +-define(wxStyledTextCtrl_SetCharsDefault, 3323). +-define(wxStyledTextCtrl_AutoCompGetCurrent, 3324). +-define(wxStyledTextCtrl_Allocate, 3325). +-define(wxStyledTextCtrl_FindColumn, 3326). +-define(wxStyledTextCtrl_GetCaretSticky, 3327). +-define(wxStyledTextCtrl_SetCaretSticky, 3328). +-define(wxStyledTextCtrl_ToggleCaretSticky, 3329). +-define(wxStyledTextCtrl_SetPasteConvertEndings, 3330). +-define(wxStyledTextCtrl_GetPasteConvertEndings, 3331). +-define(wxStyledTextCtrl_SelectionDuplicate, 3332). +-define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3333). +-define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3334). +-define(wxStyledTextCtrl_StartRecord, 3335). +-define(wxStyledTextCtrl_StopRecord, 3336). +-define(wxStyledTextCtrl_SetLexer, 3337). +-define(wxStyledTextCtrl_GetLexer, 3338). +-define(wxStyledTextCtrl_Colourise, 3339). +-define(wxStyledTextCtrl_SetProperty, 3340). +-define(wxStyledTextCtrl_SetKeyWords, 3341). +-define(wxStyledTextCtrl_SetLexerLanguage, 3342). +-define(wxStyledTextCtrl_GetProperty, 3343). +-define(wxStyledTextCtrl_GetStyleBitsNeeded, 3344). +-define(wxStyledTextCtrl_GetCurrentLine, 3345). +-define(wxStyledTextCtrl_StyleSetSpec, 3346). +-define(wxStyledTextCtrl_StyleSetFont, 3347). +-define(wxStyledTextCtrl_StyleSetFontAttr, 3348). +-define(wxStyledTextCtrl_StyleSetCharacterSet, 3349). +-define(wxStyledTextCtrl_StyleSetFontEncoding, 3350). +-define(wxStyledTextCtrl_CmdKeyExecute, 3351). +-define(wxStyledTextCtrl_SetMargins, 3352). +-define(wxStyledTextCtrl_GetSelection, 3353). +-define(wxStyledTextCtrl_PointFromPosition, 3354). +-define(wxStyledTextCtrl_ScrollToLine, 3355). +-define(wxStyledTextCtrl_ScrollToColumn, 3356). +-define(wxStyledTextCtrl_SendMsg, 3357). +-define(wxStyledTextCtrl_SetVScrollBar, 3358). +-define(wxStyledTextCtrl_SetHScrollBar, 3359). +-define(wxStyledTextCtrl_GetLastKeydownProcessed, 3360). +-define(wxStyledTextCtrl_SetLastKeydownProcessed, 3361). +-define(wxStyledTextCtrl_SaveFile, 3362). +-define(wxStyledTextCtrl_LoadFile, 3363). +-define(wxStyledTextCtrl_DoDragOver, 3364). +-define(wxStyledTextCtrl_DoDropText, 3365). +-define(wxStyledTextCtrl_GetUseAntiAliasing, 3366). +-define(wxStyledTextCtrl_AddTextRaw, 3367). +-define(wxStyledTextCtrl_InsertTextRaw, 3368). +-define(wxStyledTextCtrl_GetCurLineRaw, 3369). +-define(wxStyledTextCtrl_GetLineRaw, 3370). +-define(wxStyledTextCtrl_GetSelectedTextRaw, 3371). +-define(wxStyledTextCtrl_GetTextRangeRaw, 3372). +-define(wxStyledTextCtrl_SetTextRaw, 3373). +-define(wxStyledTextCtrl_GetTextRaw, 3374). +-define(wxStyledTextCtrl_AppendTextRaw, 3375). +-define(wxArtProvider_GetBitmap, 3376). +-define(wxArtProvider_GetIcon, 3377). +-define(wxTreeEvent_GetKeyCode, 3378). +-define(wxTreeEvent_GetItem, 3379). +-define(wxTreeEvent_GetKeyEvent, 3380). +-define(wxTreeEvent_GetLabel, 3381). +-define(wxTreeEvent_GetOldItem, 3382). +-define(wxTreeEvent_GetPoint, 3383). +-define(wxTreeEvent_IsEditCancelled, 3384). +-define(wxTreeEvent_SetToolTip, 3385). +-define(wxNotebookEvent_GetOldSelection, 3386). +-define(wxNotebookEvent_GetSelection, 3387). +-define(wxNotebookEvent_SetOldSelection, 3388). +-define(wxNotebookEvent_SetSelection, 3389). +-define(wxFileDataObject_new, 3390). +-define(wxFileDataObject_AddFile, 3391). +-define(wxFileDataObject_GetFilenames, 3392). +-define(wxFileDataObject_destroy, 3393). +-define(wxTextDataObject_new, 3394). +-define(wxTextDataObject_GetTextLength, 3395). +-define(wxTextDataObject_GetText, 3396). +-define(wxTextDataObject_SetText, 3397). +-define(wxTextDataObject_destroy, 3398). +-define(wxBitmapDataObject_new_1_1, 3399). +-define(wxBitmapDataObject_new_1_0, 3400). +-define(wxBitmapDataObject_GetBitmap, 3401). +-define(wxBitmapDataObject_SetBitmap, 3402). +-define(wxBitmapDataObject_destroy, 3403). +-define(wxClipboard_new, 3405). +-define(wxClipboard_destruct, 3406). +-define(wxClipboard_AddData, 3407). +-define(wxClipboard_Clear, 3408). +-define(wxClipboard_Close, 3409). +-define(wxClipboard_Flush, 3410). +-define(wxClipboard_GetData, 3411). +-define(wxClipboard_IsOpened, 3412). +-define(wxClipboard_Open, 3413). +-define(wxClipboard_SetData, 3414). +-define(wxClipboard_UsePrimarySelection, 3416). +-define(wxClipboard_IsSupported, 3417). +-define(wxClipboard_Get, 3418). +-define(wxSpinEvent_GetPosition, 3419). +-define(wxSpinEvent_SetPosition, 3420). +-define(wxSplitterWindow_new_0, 3421). +-define(wxSplitterWindow_new_2, 3422). +-define(wxSplitterWindow_destruct, 3423). +-define(wxSplitterWindow_Create, 3424). +-define(wxSplitterWindow_GetMinimumPaneSize, 3425). +-define(wxSplitterWindow_GetSashGravity, 3426). +-define(wxSplitterWindow_GetSashPosition, 3427). +-define(wxSplitterWindow_GetSplitMode, 3428). +-define(wxSplitterWindow_GetWindow1, 3429). +-define(wxSplitterWindow_GetWindow2, 3430). +-define(wxSplitterWindow_Initialize, 3431). +-define(wxSplitterWindow_IsSplit, 3432). +-define(wxSplitterWindow_ReplaceWindow, 3433). +-define(wxSplitterWindow_SetSashGravity, 3434). +-define(wxSplitterWindow_SetSashPosition, 3435). +-define(wxSplitterWindow_SetSashSize, 3436). +-define(wxSplitterWindow_SetMinimumPaneSize, 3437). +-define(wxSplitterWindow_SetSplitMode, 3438). +-define(wxSplitterWindow_SplitHorizontally, 3439). +-define(wxSplitterWindow_SplitVertically, 3440). +-define(wxSplitterWindow_Unsplit, 3441). +-define(wxSplitterWindow_UpdateSize, 3442). +-define(wxSplitterEvent_GetSashPosition, 3443). +-define(wxSplitterEvent_GetX, 3444). +-define(wxSplitterEvent_GetY, 3445). +-define(wxSplitterEvent_GetWindowBeingRemoved, 3446). +-define(wxSplitterEvent_SetSashPosition, 3447). +-define(wxHtmlWindow_new_0, 3448). +-define(wxHtmlWindow_new_2, 3449). +-define(wxHtmlWindow_AppendToPage, 3450). +-define(wxHtmlWindow_GetOpenedAnchor, 3451). +-define(wxHtmlWindow_GetOpenedPage, 3452). +-define(wxHtmlWindow_GetOpenedPageTitle, 3453). +-define(wxHtmlWindow_GetRelatedFrame, 3454). +-define(wxHtmlWindow_HistoryBack, 3455). +-define(wxHtmlWindow_HistoryCanBack, 3456). +-define(wxHtmlWindow_HistoryCanForward, 3457). +-define(wxHtmlWindow_HistoryClear, 3458). +-define(wxHtmlWindow_HistoryForward, 3459). +-define(wxHtmlWindow_LoadFile, 3460). +-define(wxHtmlWindow_LoadPage, 3461). +-define(wxHtmlWindow_SelectAll, 3462). +-define(wxHtmlWindow_SelectionToText, 3463). +-define(wxHtmlWindow_SelectLine, 3464). +-define(wxHtmlWindow_SelectWord, 3465). +-define(wxHtmlWindow_SetBorders, 3466). +-define(wxHtmlWindow_SetFonts, 3467). +-define(wxHtmlWindow_SetPage, 3468). +-define(wxHtmlWindow_SetRelatedFrame, 3469). +-define(wxHtmlWindow_SetRelatedStatusBar, 3470). +-define(wxHtmlWindow_ToText, 3471). +-define(wxHtmlWindow_destroy, 3472). +-define(wxHtmlLinkEvent_GetLinkInfo, 3473). +-define(wxAuiNotebookEvent_SetSelection, 3474). +-define(wxAuiNotebookEvent_GetSelection, 3475). +-define(wxAuiNotebookEvent_SetOldSelection, 3476). +-define(wxAuiNotebookEvent_GetOldSelection, 3477). +-define(wxAuiNotebookEvent_SetDragSource, 3478). +-define(wxAuiNotebookEvent_GetDragSource, 3479). +-define(wxAuiManagerEvent_SetManager, 3480). +-define(wxAuiManagerEvent_GetManager, 3481). +-define(wxAuiManagerEvent_SetPane, 3482). +-define(wxAuiManagerEvent_GetPane, 3483). +-define(wxAuiManagerEvent_SetButton, 3484). +-define(wxAuiManagerEvent_GetButton, 3485). +-define(wxAuiManagerEvent_SetDC, 3486). +-define(wxAuiManagerEvent_GetDC, 3487). +-define(wxAuiManagerEvent_Veto, 3488). +-define(wxAuiManagerEvent_GetVeto, 3489). +-define(wxAuiManagerEvent_SetCanVeto, 3490). +-define(wxAuiManagerEvent_CanVeto, 3491). +-define(wxLogNull_new, 3492). +-define(wxLogNull_destroy, 3493). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellBoolEditor.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellBoolEditor.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellBoolEditor.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellBoolEditor.erl 2009-11-20 13:34:49.000000000 +0000 @@ -0,0 +1,99 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxGridCellBoolEditor. +%%

    This class is derived (and can use functions) from: +%%
    {@link wxGridCellEditor} +%%

    +%% @type wxGridCellBoolEditor(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxGridCellBoolEditor). +-include("wxe.hrl"). +-export([destroy/1,isTrueValue/1,new/0,useStringValues/0,useStringValues/1]). + +%% inherited exports +-export([beginEdit/4,endEdit/4,handleReturn/2,isCreated/1,paintBackground/3, + parent_class/1,reset/1,setSize/2,show/2,show/3,startingClick/1,startingKey/2]). + +%% @hidden +parent_class(wxGridCellEditor) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec () -> wxGridCellBoolEditor() +%% @doc See external documentation. +new() -> + wxe_util:construct(?wxGridCellBoolEditor_new, + <<>>). + +%% @spec (Value::string()) -> bool() +%% @doc See external documentation. +isTrueValue(Value) + when is_list(Value) -> + Value_UC = unicode:characters_to_binary([Value,0]), + wxe_util:call(?wxGridCellBoolEditor_IsTrueValue, + <<(byte_size(Value_UC)):32/?UI,(Value_UC)/binary, 0:(((8- ((4+byte_size(Value_UC)) band 16#7)) band 16#7))/unit:8>>). + +%% @spec () -> ok +%% @equiv useStringValues([]) +useStringValues() -> + useStringValues([]). + +%% @spec ([Option]) -> ok +%% Option = {valueTrue, string()} | {valueFalse, string()} +%% @doc See external documentation. +useStringValues(Options) + when is_list(Options) -> + MOpts = fun({valueTrue, ValueTrue}, Acc) -> ValueTrue_UC = unicode:characters_to_binary([ValueTrue,0]),[<<1:32/?UI,(byte_size(ValueTrue_UC)):32/?UI,(ValueTrue_UC)/binary, 0:(((8- ((0+byte_size(ValueTrue_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; + ({valueFalse, ValueFalse}, Acc) -> ValueFalse_UC = unicode:characters_to_binary([ValueFalse,0]),[<<2:32/?UI,(byte_size(ValueFalse_UC)):32/?UI,(ValueFalse_UC)/binary, 0:(((8- ((0+byte_size(ValueFalse_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; + (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, + BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)), + wxe_util:cast(?wxGridCellBoolEditor_UseStringValues, + <>). + +%% @spec (This::wxGridCellBoolEditor()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxGridCellBoolEditor), + wxe_util:destroy(?wxGridCellBoolEditor_destroy,Obj), + ok. + %% From wxGridCellEditor +%% @hidden +handleReturn(This,Event) -> wxGridCellEditor:handleReturn(This,Event). +%% @hidden +startingClick(This) -> wxGridCellEditor:startingClick(This). +%% @hidden +startingKey(This,Event) -> wxGridCellEditor:startingKey(This,Event). +%% @hidden +reset(This) -> wxGridCellEditor:reset(This). +%% @hidden +endEdit(This,Row,Col,Grid) -> wxGridCellEditor:endEdit(This,Row,Col,Grid). +%% @hidden +beginEdit(This,Row,Col,Grid) -> wxGridCellEditor:beginEdit(This,Row,Col,Grid). +%% @hidden +paintBackground(This,RectCell,Attr) -> wxGridCellEditor:paintBackground(This,RectCell,Attr). +%% @hidden +show(This,Show, Options) -> wxGridCellEditor:show(This,Show, Options). +%% @hidden +show(This,Show) -> wxGridCellEditor:show(This,Show). +%% @hidden +setSize(This,Rect) -> wxGridCellEditor:setSize(This,Rect). +%% @hidden +isCreated(This) -> wxGridCellEditor:isCreated(This). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellBoolRenderer.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellBoolRenderer.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellBoolRenderer.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellBoolRenderer.erl 2009-11-20 13:34:50.000000000 +0000 @@ -0,0 +1,55 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxGridCellBoolRenderer. +%%

    This class is derived (and can use functions) from: +%%
    {@link wxGridCellRenderer} +%%

    +%% @type wxGridCellBoolRenderer(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxGridCellBoolRenderer). +-include("wxe.hrl"). +-export([destroy/1,new/0]). + +%% inherited exports +-export([draw/8,getBestSize/6,parent_class/1]). + +%% @hidden +parent_class(wxGridCellRenderer) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec () -> wxGridCellBoolRenderer() +%% @doc See external documentation. +new() -> + wxe_util:construct(?wxGridCellBoolRenderer_new, + <<>>). + +%% @spec (This::wxGridCellBoolRenderer()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxGridCellBoolRenderer), + wxe_util:destroy(?wxGridCellBoolRenderer_destroy,Obj), + ok. + %% From wxGridCellRenderer +%% @hidden +getBestSize(This,Grid,Attr,Dc,Row,Col) -> wxGridCellRenderer:getBestSize(This,Grid,Attr,Dc,Row,Col). +%% @hidden +draw(This,Grid,Attr,Dc,Rect,Row,Col,IsSelected) -> wxGridCellRenderer:draw(This,Grid,Attr,Dc,Rect,Row,Col,IsSelected). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellChoiceEditor.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellChoiceEditor.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellChoiceEditor.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellChoiceEditor.erl 2009-11-20 13:34:50.000000000 +0000 @@ -0,0 +1,96 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxGridCellChoiceEditor. +%%

    This class is derived (and can use functions) from: +%%
    {@link wxGridCellEditor} +%%

    +%% @type wxGridCellChoiceEditor(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxGridCellChoiceEditor). +-include("wxe.hrl"). +-export([destroy/1,new/1,new/2,setParameters/2]). + +%% inherited exports +-export([beginEdit/4,endEdit/4,handleReturn/2,isCreated/1,paintBackground/3, + parent_class/1,reset/1,setSize/2,show/2,show/3,startingClick/1,startingKey/2]). + +%% @hidden +parent_class(wxGridCellEditor) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec (Choices::[[string()]]) -> wxGridCellChoiceEditor() +%% @equiv new(Choices, []) +new(Choices) + when is_list(Choices) -> + new(Choices, []). + +%% @spec (Choices::[[string()]], [Option]) -> wxGridCellChoiceEditor() +%% Option = {allowOthers, bool()} +%% @doc See external documentation. +new(Choices, Options) + when is_list(Choices),is_list(Options) -> + Choices_UCA = [unicode:characters_to_binary([ChoicesTemp,0]) || + ChoicesTemp <- Choices], + MOpts = fun({allowOthers, AllowOthers}, Acc) -> [<<1:32/?UI,(wxe_util:from_bool(AllowOthers)):32/?UI>>|Acc]; + (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, + BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)), + wxe_util:construct(?wxGridCellChoiceEditor_new, + <<(length(Choices_UCA)):32/?UI, (<< <<(byte_size(UC_Str)):32/?UI, UC_Str/binary>>|| UC_Str <- Choices_UCA>>)/binary, 0:(((8- ((4 + lists:sum([byte_size(S)+4||S<-Choices_UCA])) band 16#7)) band 16#7))/unit:8, BinOpt/binary>>). + +%% @spec (This::wxGridCellChoiceEditor(), Params::string()) -> ok +%% @doc See external documentation. +setParameters(#wx_ref{type=ThisT,ref=ThisRef},Params) + when is_list(Params) -> + ?CLASS(ThisT,wxGridCellChoiceEditor), + Params_UC = unicode:characters_to_binary([Params,0]), + wxe_util:cast(?wxGridCellChoiceEditor_SetParameters, + <>). + +%% @spec (This::wxGridCellChoiceEditor()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxGridCellChoiceEditor), + wxe_util:destroy(?wxGridCellChoiceEditor_destroy,Obj), + ok. + %% From wxGridCellEditor +%% @hidden +handleReturn(This,Event) -> wxGridCellEditor:handleReturn(This,Event). +%% @hidden +startingClick(This) -> wxGridCellEditor:startingClick(This). +%% @hidden +startingKey(This,Event) -> wxGridCellEditor:startingKey(This,Event). +%% @hidden +reset(This) -> wxGridCellEditor:reset(This). +%% @hidden +endEdit(This,Row,Col,Grid) -> wxGridCellEditor:endEdit(This,Row,Col,Grid). +%% @hidden +beginEdit(This,Row,Col,Grid) -> wxGridCellEditor:beginEdit(This,Row,Col,Grid). +%% @hidden +paintBackground(This,RectCell,Attr) -> wxGridCellEditor:paintBackground(This,RectCell,Attr). +%% @hidden +show(This,Show, Options) -> wxGridCellEditor:show(This,Show, Options). +%% @hidden +show(This,Show) -> wxGridCellEditor:show(This,Show). +%% @hidden +setSize(This,Rect) -> wxGridCellEditor:setSize(This,Rect). +%% @hidden +isCreated(This) -> wxGridCellEditor:isCreated(This). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellEditor.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellEditor.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellEditor.erl 2009-04-16 10:25:24.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellEditor.erl 2009-11-20 13:34:39.000000000 +0000 @@ -24,7 +24,7 @@ -module(wxGridCellEditor). -include("wxe.hrl"). --export([beginEdit/4,endEdit/4,handleReturn/2,isCreated/1,paintBackground/3, +-export([beginEdit/4,create/4,endEdit/4,handleReturn/2,isCreated/1,paintBackground/3, reset/1,setSize/2,show/2,show/3,startingClick/1,startingKey/2]). %% inherited exports @@ -33,6 +33,16 @@ %% @hidden parent_class(_Class) -> erlang:error({badtype, ?MODULE}). +%% @spec (This::wxGridCellEditor(), Parent::wxWindow:wxWindow(), Id::integer(), EvtHandler::wxEvtHandler:wxEvtHandler()) -> ok +%% @doc See external documentation. +create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,#wx_ref{type=EvtHandlerT,ref=EvtHandlerRef}) + when is_integer(Id) -> + ?CLASS(ThisT,wxGridCellEditor), + ?CLASS(ParentT,wxWindow), + ?CLASS(EvtHandlerT,wxEvtHandler), + wxe_util:cast(?wxGridCellEditor_Create, + <>). + %% @spec (This::wxGridCellEditor()) -> bool() %% @doc See external documentation. isCreated(#wx_ref{type=ThisT,ref=ThisRef}) -> diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellFloatEditor.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellFloatEditor.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellFloatEditor.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellFloatEditor.erl 2009-11-20 13:34:50.000000000 +0000 @@ -0,0 +1,94 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxGridCellFloatEditor. +%%

    This class is derived (and can use functions) from: +%%
    {@link wxGridCellEditor} +%%

    +%% @type wxGridCellFloatEditor(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxGridCellFloatEditor). +-include("wxe.hrl"). +-export([destroy/1,new/0,new/1,setParameters/2]). + +%% inherited exports +-export([beginEdit/4,endEdit/4,handleReturn/2,isCreated/1,paintBackground/3, + parent_class/1,reset/1,setSize/2,show/2,show/3,startingClick/1,startingKey/2]). + +%% @hidden +parent_class(wxGridCellEditor) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec () -> wxGridCellFloatEditor() +%% @equiv new([]) +new() -> + new([]). + +%% @spec ([Option]) -> wxGridCellFloatEditor() +%% Option = {width, integer()} | {precision, integer()} +%% @doc See external documentation. +new(Options) + when is_list(Options) -> + MOpts = fun({width, Width}, Acc) -> [<<1:32/?UI,Width:32/?UI>>|Acc]; + ({precision, Precision}, Acc) -> [<<2:32/?UI,Precision:32/?UI>>|Acc]; + (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, + BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)), + wxe_util:construct(?wxGridCellFloatEditor_new, + <>). + +%% @spec (This::wxGridCellFloatEditor(), Params::string()) -> ok +%% @doc See external documentation. +setParameters(#wx_ref{type=ThisT,ref=ThisRef},Params) + when is_list(Params) -> + ?CLASS(ThisT,wxGridCellFloatEditor), + Params_UC = unicode:characters_to_binary([Params,0]), + wxe_util:cast(?wxGridCellFloatEditor_SetParameters, + <>). + +%% @spec (This::wxGridCellFloatEditor()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxGridCellFloatEditor), + wxe_util:destroy(?wxGridCellFloatEditor_destroy,Obj), + ok. + %% From wxGridCellEditor +%% @hidden +handleReturn(This,Event) -> wxGridCellEditor:handleReturn(This,Event). +%% @hidden +startingClick(This) -> wxGridCellEditor:startingClick(This). +%% @hidden +startingKey(This,Event) -> wxGridCellEditor:startingKey(This,Event). +%% @hidden +reset(This) -> wxGridCellEditor:reset(This). +%% @hidden +endEdit(This,Row,Col,Grid) -> wxGridCellEditor:endEdit(This,Row,Col,Grid). +%% @hidden +beginEdit(This,Row,Col,Grid) -> wxGridCellEditor:beginEdit(This,Row,Col,Grid). +%% @hidden +paintBackground(This,RectCell,Attr) -> wxGridCellEditor:paintBackground(This,RectCell,Attr). +%% @hidden +show(This,Show, Options) -> wxGridCellEditor:show(This,Show, Options). +%% @hidden +show(This,Show) -> wxGridCellEditor:show(This,Show). +%% @hidden +setSize(This,Rect) -> wxGridCellEditor:setSize(This,Rect). +%% @hidden +isCreated(This) -> wxGridCellEditor:isCreated(This). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellFloatRenderer.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellFloatRenderer.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellFloatRenderer.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellFloatRenderer.erl 2009-11-20 13:34:50.000000000 +0000 @@ -0,0 +1,109 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxGridCellFloatRenderer. +%%

    This class is derived (and can use functions) from: +%%
    {@link wxGridCellStringRenderer} +%%
    {@link wxGridCellRenderer} +%%

    +%% @type wxGridCellFloatRenderer(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxGridCellFloatRenderer). +-include("wxe.hrl"). +-export([destroy/1,getPrecision/1,getWidth/1,new/0,new/1,setParameters/2,setPrecision/2, + setWidth/2]). + +%% inherited exports +-export([draw/8,getBestSize/6,parent_class/1]). + +%% @hidden +parent_class(wxGridCellStringRenderer) -> true; +parent_class(wxGridCellRenderer) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec () -> wxGridCellFloatRenderer() +%% @equiv new([]) +new() -> + new([]). + +%% @spec ([Option]) -> wxGridCellFloatRenderer() +%% Option = {width, integer()} | {precision, integer()} +%% @doc See external documentation. +new(Options) + when is_list(Options) -> + MOpts = fun({width, Width}, Acc) -> [<<1:32/?UI,Width:32/?UI>>|Acc]; + ({precision, Precision}, Acc) -> [<<2:32/?UI,Precision:32/?UI>>|Acc]; + (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, + BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)), + wxe_util:construct(?wxGridCellFloatRenderer_new, + <>). + +%% @spec (This::wxGridCellFloatRenderer()) -> integer() +%% @doc See external documentation. +getPrecision(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxGridCellFloatRenderer), + wxe_util:call(?wxGridCellFloatRenderer_GetPrecision, + <>). + +%% @spec (This::wxGridCellFloatRenderer()) -> integer() +%% @doc See external documentation. +getWidth(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxGridCellFloatRenderer), + wxe_util:call(?wxGridCellFloatRenderer_GetWidth, + <>). + +%% @spec (This::wxGridCellFloatRenderer(), Params::string()) -> ok +%% @doc See external documentation. +setParameters(#wx_ref{type=ThisT,ref=ThisRef},Params) + when is_list(Params) -> + ?CLASS(ThisT,wxGridCellFloatRenderer), + Params_UC = unicode:characters_to_binary([Params,0]), + wxe_util:cast(?wxGridCellFloatRenderer_SetParameters, + <>). + +%% @spec (This::wxGridCellFloatRenderer(), Precision::integer()) -> ok +%% @doc See external documentation. +setPrecision(#wx_ref{type=ThisT,ref=ThisRef},Precision) + when is_integer(Precision) -> + ?CLASS(ThisT,wxGridCellFloatRenderer), + wxe_util:cast(?wxGridCellFloatRenderer_SetPrecision, + <>). + +%% @spec (This::wxGridCellFloatRenderer(), Width::integer()) -> ok +%% @doc See external documentation. +setWidth(#wx_ref{type=ThisT,ref=ThisRef},Width) + when is_integer(Width) -> + ?CLASS(ThisT,wxGridCellFloatRenderer), + wxe_util:cast(?wxGridCellFloatRenderer_SetWidth, + <>). + +%% @spec (This::wxGridCellFloatRenderer()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxGridCellFloatRenderer), + wxe_util:destroy(?wxGridCellFloatRenderer_destroy,Obj), + ok. + %% From wxGridCellStringRenderer + %% From wxGridCellRenderer +%% @hidden +getBestSize(This,Grid,Attr,Dc,Row,Col) -> wxGridCellRenderer:getBestSize(This,Grid,Attr,Dc,Row,Col). +%% @hidden +draw(This,Grid,Attr,Dc,Rect,Row,Col,IsSelected) -> wxGridCellRenderer:draw(This,Grid,Attr,Dc,Rect,Row,Col,IsSelected). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellNumberEditor.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellNumberEditor.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellNumberEditor.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellNumberEditor.erl 2009-11-20 13:34:51.000000000 +0000 @@ -0,0 +1,104 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxGridCellNumberEditor. +%%

    This class is derived (and can use functions) from: +%%
    {@link wxGridCellTextEditor} +%%
    {@link wxGridCellEditor} +%%

    +%% @type wxGridCellNumberEditor(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxGridCellNumberEditor). +-include("wxe.hrl"). +-export([destroy/1,getValue/1,new/0,new/1,setParameters/2]). + +%% inherited exports +-export([beginEdit/4,endEdit/4,handleReturn/2,isCreated/1,paintBackground/3, + parent_class/1,reset/1,setSize/2,show/2,show/3,startingClick/1,startingKey/2]). + +%% @hidden +parent_class(wxGridCellTextEditor) -> true; +parent_class(wxGridCellEditor) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec () -> wxGridCellNumberEditor() +%% @equiv new([]) +new() -> + new([]). + +%% @spec ([Option]) -> wxGridCellNumberEditor() +%% Option = {min, integer()} | {max, integer()} +%% @doc See external documentation. +new(Options) + when is_list(Options) -> + MOpts = fun({min, Min}, Acc) -> [<<1:32/?UI,Min:32/?UI>>|Acc]; + ({max, Max}, Acc) -> [<<2:32/?UI,Max:32/?UI>>|Acc]; + (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, + BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)), + wxe_util:construct(?wxGridCellNumberEditor_new, + <>). + +%% @spec (This::wxGridCellNumberEditor()) -> string() +%% @doc See external documentation. +getValue(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxGridCellNumberEditor), + wxe_util:call(?wxGridCellNumberEditor_GetValue, + <>). + +%% @spec (This::wxGridCellNumberEditor(), Params::string()) -> ok +%% @doc See external documentation. +setParameters(#wx_ref{type=ThisT,ref=ThisRef},Params) + when is_list(Params) -> + ?CLASS(ThisT,wxGridCellNumberEditor), + Params_UC = unicode:characters_to_binary([Params,0]), + wxe_util:cast(?wxGridCellNumberEditor_SetParameters, + <>). + +%% @spec (This::wxGridCellNumberEditor()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxGridCellNumberEditor), + wxe_util:destroy(?wxGridCellNumberEditor_destroy,Obj), + ok. + %% From wxGridCellTextEditor + %% From wxGridCellEditor +%% @hidden +handleReturn(This,Event) -> wxGridCellEditor:handleReturn(This,Event). +%% @hidden +startingClick(This) -> wxGridCellEditor:startingClick(This). +%% @hidden +startingKey(This,Event) -> wxGridCellEditor:startingKey(This,Event). +%% @hidden +reset(This) -> wxGridCellEditor:reset(This). +%% @hidden +endEdit(This,Row,Col,Grid) -> wxGridCellEditor:endEdit(This,Row,Col,Grid). +%% @hidden +beginEdit(This,Row,Col,Grid) -> wxGridCellEditor:beginEdit(This,Row,Col,Grid). +%% @hidden +paintBackground(This,RectCell,Attr) -> wxGridCellEditor:paintBackground(This,RectCell,Attr). +%% @hidden +show(This,Show, Options) -> wxGridCellEditor:show(This,Show, Options). +%% @hidden +show(This,Show) -> wxGridCellEditor:show(This,Show). +%% @hidden +setSize(This,Rect) -> wxGridCellEditor:setSize(This,Rect). +%% @hidden +isCreated(This) -> wxGridCellEditor:isCreated(This). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellNumberRenderer.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellNumberRenderer.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellNumberRenderer.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellNumberRenderer.erl 2009-11-20 13:34:51.000000000 +0000 @@ -0,0 +1,58 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxGridCellNumberRenderer. +%%

    This class is derived (and can use functions) from: +%%
    {@link wxGridCellStringRenderer} +%%
    {@link wxGridCellRenderer} +%%

    +%% @type wxGridCellNumberRenderer(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxGridCellNumberRenderer). +-include("wxe.hrl"). +-export([destroy/1,new/0]). + +%% inherited exports +-export([draw/8,getBestSize/6,parent_class/1]). + +%% @hidden +parent_class(wxGridCellStringRenderer) -> true; +parent_class(wxGridCellRenderer) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec () -> wxGridCellNumberRenderer() +%% @doc See external documentation. +new() -> + wxe_util:construct(?wxGridCellNumberRenderer_new, + <<>>). + +%% @spec (This::wxGridCellNumberRenderer()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxGridCellNumberRenderer), + wxe_util:destroy(?wxGridCellNumberRenderer_destroy,Obj), + ok. + %% From wxGridCellStringRenderer + %% From wxGridCellRenderer +%% @hidden +getBestSize(This,Grid,Attr,Dc,Row,Col) -> wxGridCellRenderer:getBestSize(This,Grid,Attr,Dc,Row,Col). +%% @hidden +draw(This,Grid,Attr,Dc,Rect,Row,Col,IsSelected) -> wxGridCellRenderer:draw(This,Grid,Attr,Dc,Rect,Row,Col,IsSelected). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellStringRenderer.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellStringRenderer.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellStringRenderer.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellStringRenderer.erl 2009-11-20 13:34:51.000000000 +0000 @@ -0,0 +1,55 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxGridCellStringRenderer. +%%

    This class is derived (and can use functions) from: +%%
    {@link wxGridCellRenderer} +%%

    +%% @type wxGridCellStringRenderer(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxGridCellStringRenderer). +-include("wxe.hrl"). +-export([destroy/1,new/0]). + +%% inherited exports +-export([draw/8,getBestSize/6,parent_class/1]). + +%% @hidden +parent_class(wxGridCellRenderer) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec () -> wxGridCellStringRenderer() +%% @doc See external documentation. +new() -> + wxe_util:construct(?wxGridCellStringRenderer_new, + <<>>). + +%% @spec (This::wxGridCellStringRenderer()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxGridCellStringRenderer), + wxe_util:destroy(?wxGridCellStringRenderer_destroy,Obj), + ok. + %% From wxGridCellRenderer +%% @hidden +getBestSize(This,Grid,Attr,Dc,Row,Col) -> wxGridCellRenderer:getBestSize(This,Grid,Attr,Dc,Row,Col). +%% @hidden +draw(This,Grid,Attr,Dc,Rect,Row,Col,IsSelected) -> wxGridCellRenderer:draw(This,Grid,Attr,Dc,Rect,Row,Col,IsSelected). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellTextEditor.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellTextEditor.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxGridCellTextEditor.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxGridCellTextEditor.erl 2009-11-20 13:34:51.000000000 +0000 @@ -0,0 +1,83 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxGridCellTextEditor. +%%

    This class is derived (and can use functions) from: +%%
    {@link wxGridCellEditor} +%%

    +%% @type wxGridCellTextEditor(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxGridCellTextEditor). +-include("wxe.hrl"). +-export([destroy/1,new/0,setParameters/2]). + +%% inherited exports +-export([beginEdit/4,endEdit/4,handleReturn/2,isCreated/1,paintBackground/3, + parent_class/1,reset/1,setSize/2,show/2,show/3,startingClick/1,startingKey/2]). + +%% @hidden +parent_class(wxGridCellEditor) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec () -> wxGridCellTextEditor() +%% @doc See external documentation. +new() -> + wxe_util:construct(?wxGridCellTextEditor_new, + <<>>). + +%% @spec (This::wxGridCellTextEditor(), Params::string()) -> ok +%% @doc See external documentation. +setParameters(#wx_ref{type=ThisT,ref=ThisRef},Params) + when is_list(Params) -> + ?CLASS(ThisT,wxGridCellTextEditor), + Params_UC = unicode:characters_to_binary([Params,0]), + wxe_util:cast(?wxGridCellTextEditor_SetParameters, + <>). + +%% @spec (This::wxGridCellTextEditor()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxGridCellTextEditor), + wxe_util:destroy(?wxGridCellTextEditor_destroy,Obj), + ok. + %% From wxGridCellEditor +%% @hidden +handleReturn(This,Event) -> wxGridCellEditor:handleReturn(This,Event). +%% @hidden +startingClick(This) -> wxGridCellEditor:startingClick(This). +%% @hidden +startingKey(This,Event) -> wxGridCellEditor:startingKey(This,Event). +%% @hidden +reset(This) -> wxGridCellEditor:reset(This). +%% @hidden +endEdit(This,Row,Col,Grid) -> wxGridCellEditor:endEdit(This,Row,Col,Grid). +%% @hidden +beginEdit(This,Row,Col,Grid) -> wxGridCellEditor:beginEdit(This,Row,Col,Grid). +%% @hidden +paintBackground(This,RectCell,Attr) -> wxGridCellEditor:paintBackground(This,RectCell,Attr). +%% @hidden +show(This,Show, Options) -> wxGridCellEditor:show(This,Show, Options). +%% @hidden +show(This,Show) -> wxGridCellEditor:show(This,Show). +%% @hidden +setSize(This,Rect) -> wxGridCellEditor:setSize(This,Rect). +%% @hidden +isCreated(This) -> wxGridCellEditor:isCreated(This). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxHtmlLinkEvent.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxHtmlLinkEvent.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxHtmlLinkEvent.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxHtmlLinkEvent.erl 2009-09-18 15:11:27.000000000 +0100 @@ -0,0 +1,92 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxHtmlLinkEvent. +%%
    Use {@link wxEvtHandler:connect/3.} with EventType:
    +%%
    command_html_link_clicked
    +%% See also the message variant {@link wxEvtHandler:wxHtmlLink(). #wxHtmlLink{}} event record type. +%% +%%

    This class is derived (and can use functions) from: +%%
    {@link wxCommandEvent} +%%
    {@link wxEvent} +%%

    +%% @type wxHtmlLinkEvent(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxHtmlLinkEvent). +-include("wxe.hrl"). +-export([getLinkInfo/1]). + +%% inherited exports +-export([getClientData/1,getExtraLong/1,getId/1,getInt/1,getSelection/1,getSkipped/1, + getString/1,getTimestamp/1,isChecked/1,isCommandEvent/1,isSelection/1, + parent_class/1,resumePropagation/2,setInt/2,setString/2,shouldPropagate/1, + skip/1,skip/2,stopPropagation/1]). + +%% @hidden +parent_class(wxCommandEvent) -> true; +parent_class(wxEvent) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec (This::wxHtmlLinkEvent()) -> wx:wxHtmlLinkInfo() +%% @doc See external documentation. +getLinkInfo(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlLinkEvent), + wxe_util:call(?wxHtmlLinkEvent_GetLinkInfo, + <>). + + %% From wxCommandEvent +%% @hidden +setString(This,S) -> wxCommandEvent:setString(This,S). +%% @hidden +setInt(This,I) -> wxCommandEvent:setInt(This,I). +%% @hidden +isSelection(This) -> wxCommandEvent:isSelection(This). +%% @hidden +isChecked(This) -> wxCommandEvent:isChecked(This). +%% @hidden +getString(This) -> wxCommandEvent:getString(This). +%% @hidden +getSelection(This) -> wxCommandEvent:getSelection(This). +%% @hidden +getInt(This) -> wxCommandEvent:getInt(This). +%% @hidden +getExtraLong(This) -> wxCommandEvent:getExtraLong(This). +%% @hidden +getClientData(This) -> wxCommandEvent:getClientData(This). + %% From wxEvent +%% @hidden +stopPropagation(This) -> wxEvent:stopPropagation(This). +%% @hidden +skip(This, Options) -> wxEvent:skip(This, Options). +%% @hidden +skip(This) -> wxEvent:skip(This). +%% @hidden +shouldPropagate(This) -> wxEvent:shouldPropagate(This). +%% @hidden +resumePropagation(This,PropagationLevel) -> wxEvent:resumePropagation(This,PropagationLevel). +%% @hidden +isCommandEvent(This) -> wxEvent:isCommandEvent(This). +%% @hidden +getTimestamp(This) -> wxEvent:getTimestamp(This). +%% @hidden +getSkipped(This) -> wxEvent:getSkipped(This). +%% @hidden +getId(This) -> wxEvent:getId(This). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxHtmlWindow.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxHtmlWindow.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxHtmlWindow.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxHtmlWindow.erl 2009-09-18 15:11:28.000000000 +0100 @@ -0,0 +1,695 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxHtmlWindow. +%%

    This class is derived (and can use functions) from: +%%
    {@link wxScrolledWindow} +%%
    {@link wxPanel} +%%
    {@link wxWindow} +%%
    {@link wxEvtHandler} +%%

    +%% @type wxHtmlWindow(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxHtmlWindow). +-include("wxe.hrl"). +-export([appendToPage/2,destroy/1,getOpenedAnchor/1,getOpenedPage/1,getOpenedPageTitle/1, + getRelatedFrame/1,historyBack/1,historyCanBack/1,historyCanForward/1, + historyClear/1,historyForward/1,loadFile/2,loadPage/2,new/0,new/1,new/2, + selectAll/1,selectLine/2,selectWord/2,selectionToText/1,setBorders/2, + setFonts/3,setFonts/4,setPage/2,setRelatedFrame/3,setRelatedStatusBar/2, + toText/1]). + +%% inherited exports +-export([cacheBestSize/2,calcScrolledPosition/2,calcScrolledPosition/3,calcUnscrolledPosition/2, + calcUnscrolledPosition/3,captureMouse/1,center/1,center/2,centerOnParent/1, + centerOnParent/2,centre/1,centre/2,centreOnParent/1,centreOnParent/2, + clearBackground/1,clientToScreen/2,clientToScreen/3,close/1,close/2, + connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, + destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, + doPrepareDC/2,enable/1,enable/2,enableScrolling/3,findWindow/2,fit/1, + fitInside/1,freeze/1,getAcceleratorTable/1,getBackgroundColour/1, + getBackgroundStyle/1,getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1, + getChildren/1,getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, + getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPixelsPerUnit/1,getScrollPos/2,getScrollRange/2, + getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, + getToolTip/1,getUpdateRegion/1,getViewStart/1,getVirtualSize/1,getWindowStyleFlag/1, + getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, + hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2,raise/1,refresh/1,refresh/2, + refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,reparent/2, + screenToClient/1,screenToClient/2,scroll/3,scrollLines/2,scrollPages/2, + scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, + setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, + setClientSize/3,setContainingSizer/2,setCursor/2,setDropTarget/2, + setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,setForegroundColour/2, + setHelpText/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2, + setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,setPalette/2, + setScrollPos/3,setScrollPos/4,setScrollRate/3,setScrollbar/5,setScrollbar/6, + setScrollbars/5,setScrollbars/6,setSize/2,setSize/3,setSize/5,setSize/6, + setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2,setSizer/3, + setSizerAndFit/2,setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2, + setToolTip/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, + setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, + setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, + transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, + validate/1,warpPointer/3]). + +%% @hidden +parent_class(wxScrolledWindow) -> true; +parent_class(wxPanel) -> true; +parent_class(wxWindow) -> true; +parent_class(wxEvtHandler) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec () -> wxHtmlWindow() +%% @doc See external documentation. +new() -> + wxe_util:construct(?wxHtmlWindow_new_0, + <<>>). + +%% @spec (Parent::wxWindow:wxWindow()) -> wxHtmlWindow() +%% @equiv new(Parent, []) +new(Parent) + when is_record(Parent, wx_ref) -> + new(Parent, []). + +%% @spec (Parent::wxWindow:wxWindow(), [Option]) -> wxHtmlWindow() +%% Option = {id, integer()} | {pos, {X::integer(),Y::integer()}} | {size, {W::integer(),H::integer()}} | {style, integer()} +%% @doc See external documentation. +new(#wx_ref{type=ParentT,ref=ParentRef}, Options) + when is_list(Options) -> + ?CLASS(ParentT,wxWindow), + MOpts = fun({id, Id}, Acc) -> [<<1:32/?UI,Id:32/?UI>>|Acc]; + ({pos, {PosX,PosY}}, Acc) -> [<<2:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; + ({size, {SizeW,SizeH}}, Acc) -> [<<3:32/?UI,SizeW:32/?UI,SizeH:32/?UI,0:32>>|Acc]; + ({style, Style}, Acc) -> [<<4:32/?UI,Style:32/?UI>>|Acc]; + (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, + BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)), + wxe_util:construct(?wxHtmlWindow_new_2, + <>). + +%% @spec (This::wxHtmlWindow(), Source::string()) -> bool() +%% @doc See external documentation. +appendToPage(#wx_ref{type=ThisT,ref=ThisRef},Source) + when is_list(Source) -> + ?CLASS(ThisT,wxHtmlWindow), + Source_UC = unicode:characters_to_binary([Source,0]), + wxe_util:call(?wxHtmlWindow_AppendToPage, + <>). + +%% @spec (This::wxHtmlWindow()) -> string() +%% @doc See external documentation. +getOpenedAnchor(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:call(?wxHtmlWindow_GetOpenedAnchor, + <>). + +%% @spec (This::wxHtmlWindow()) -> string() +%% @doc See external documentation. +getOpenedPage(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:call(?wxHtmlWindow_GetOpenedPage, + <>). + +%% @spec (This::wxHtmlWindow()) -> string() +%% @doc See external documentation. +getOpenedPageTitle(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:call(?wxHtmlWindow_GetOpenedPageTitle, + <>). + +%% @spec (This::wxHtmlWindow()) -> wxFrame:wxFrame() +%% @doc See external documentation. +getRelatedFrame(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:call(?wxHtmlWindow_GetRelatedFrame, + <>). + +%% @spec (This::wxHtmlWindow()) -> bool() +%% @doc See external documentation. +historyBack(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:call(?wxHtmlWindow_HistoryBack, + <>). + +%% @spec (This::wxHtmlWindow()) -> bool() +%% @doc See external documentation. +historyCanBack(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:call(?wxHtmlWindow_HistoryCanBack, + <>). + +%% @spec (This::wxHtmlWindow()) -> bool() +%% @doc See external documentation. +historyCanForward(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:call(?wxHtmlWindow_HistoryCanForward, + <>). + +%% @spec (This::wxHtmlWindow()) -> ok +%% @doc See external documentation. +historyClear(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:cast(?wxHtmlWindow_HistoryClear, + <>). + +%% @spec (This::wxHtmlWindow()) -> bool() +%% @doc See external documentation. +historyForward(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:call(?wxHtmlWindow_HistoryForward, + <>). + +%% @spec (This::wxHtmlWindow(), Filename::string()) -> bool() +%% @doc See external documentation. +loadFile(#wx_ref{type=ThisT,ref=ThisRef},Filename) + when is_list(Filename) -> + ?CLASS(ThisT,wxHtmlWindow), + Filename_UC = unicode:characters_to_binary([Filename,0]), + wxe_util:call(?wxHtmlWindow_LoadFile, + <>). + +%% @spec (This::wxHtmlWindow(), Location::string()) -> bool() +%% @doc See external documentation. +loadPage(#wx_ref{type=ThisT,ref=ThisRef},Location) + when is_list(Location) -> + ?CLASS(ThisT,wxHtmlWindow), + Location_UC = unicode:characters_to_binary([Location,0]), + wxe_util:call(?wxHtmlWindow_LoadPage, + <>). + +%% @spec (This::wxHtmlWindow()) -> ok +%% @doc See external documentation. +selectAll(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:cast(?wxHtmlWindow_SelectAll, + <>). + +%% @spec (This::wxHtmlWindow()) -> string() +%% @doc See external documentation. +selectionToText(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:call(?wxHtmlWindow_SelectionToText, + <>). + +%% @spec (This::wxHtmlWindow(), Pos::{X::integer(),Y::integer()}) -> ok +%% @doc See external documentation. +selectLine(#wx_ref{type=ThisT,ref=ThisRef},{PosX,PosY}) + when is_integer(PosX),is_integer(PosY) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:cast(?wxHtmlWindow_SelectLine, + <>). + +%% @spec (This::wxHtmlWindow(), Pos::{X::integer(),Y::integer()}) -> ok +%% @doc See external documentation. +selectWord(#wx_ref{type=ThisT,ref=ThisRef},{PosX,PosY}) + when is_integer(PosX),is_integer(PosY) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:cast(?wxHtmlWindow_SelectWord, + <>). + +%% @spec (This::wxHtmlWindow(), B::integer()) -> ok +%% @doc See external documentation. +setBorders(#wx_ref{type=ThisT,ref=ThisRef},B) + when is_integer(B) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:cast(?wxHtmlWindow_SetBorders, + <>). + +%% @spec (This::wxHtmlWindow(), Normal_face::string(), Fixed_face::string()) -> ok +%% @equiv setFonts(This,Normal_face,Fixed_face, []) +setFonts(This,Normal_face,Fixed_face) + when is_record(This, wx_ref),is_list(Normal_face),is_list(Fixed_face) -> + setFonts(This,Normal_face,Fixed_face, []). + +%% @spec (This::wxHtmlWindow(), Normal_face::string(), Fixed_face::string(), [Option]) -> ok +%% Option = {sizes, integer()} +%% @doc See external documentation. +setFonts(#wx_ref{type=ThisT,ref=ThisRef},Normal_face,Fixed_face, Options) + when is_list(Normal_face),is_list(Fixed_face),is_list(Options) -> + ?CLASS(ThisT,wxHtmlWindow), + Normal_face_UC = unicode:characters_to_binary([Normal_face,0]), + Fixed_face_UC = unicode:characters_to_binary([Fixed_face,0]), + MOpts = fun({sizes, Sizes}, Acc) -> [<<1:32/?UI,Sizes:32/?UI>>|Acc]; + (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, + BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)), + wxe_util:cast(?wxHtmlWindow_SetFonts, + <>). + +%% @spec (This::wxHtmlWindow(), Source::string()) -> bool() +%% @doc See external documentation. +setPage(#wx_ref{type=ThisT,ref=ThisRef},Source) + when is_list(Source) -> + ?CLASS(ThisT,wxHtmlWindow), + Source_UC = unicode:characters_to_binary([Source,0]), + wxe_util:call(?wxHtmlWindow_SetPage, + <>). + +%% @spec (This::wxHtmlWindow(), Frame::wxFrame:wxFrame(), Format::string()) -> ok +%% @doc See external documentation. +setRelatedFrame(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=FrameT,ref=FrameRef},Format) + when is_list(Format) -> + ?CLASS(ThisT,wxHtmlWindow), + ?CLASS(FrameT,wxFrame), + Format_UC = unicode:characters_to_binary([Format,0]), + wxe_util:cast(?wxHtmlWindow_SetRelatedFrame, + <>). + +%% @spec (This::wxHtmlWindow(), Bar::integer()) -> ok +%% @doc See external documentation. +setRelatedStatusBar(#wx_ref{type=ThisT,ref=ThisRef},Bar) + when is_integer(Bar) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:cast(?wxHtmlWindow_SetRelatedStatusBar, + <>). + +%% @spec (This::wxHtmlWindow()) -> string() +%% @doc See external documentation. +toText(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxHtmlWindow), + wxe_util:call(?wxHtmlWindow_ToText, + <>). + +%% @spec (This::wxHtmlWindow()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxHtmlWindow), + wxe_util:destroy(?DESTROY_OBJECT,Obj), + ok. + %% From wxScrolledWindow +%% @hidden +setTargetWindow(This,Target) -> wxScrolledWindow:setTargetWindow(This,Target). +%% @hidden +setScrollRate(This,Xstep,Ystep) -> wxScrolledWindow:setScrollRate(This,Xstep,Ystep). +%% @hidden +setScrollbars(This,PixelsPerUnitX,PixelsPerUnitY,NoUnitsX,NoUnitsY, Options) -> wxScrolledWindow:setScrollbars(This,PixelsPerUnitX,PixelsPerUnitY,NoUnitsX,NoUnitsY, Options). +%% @hidden +setScrollbars(This,PixelsPerUnitX,PixelsPerUnitY,NoUnitsX,NoUnitsY) -> wxScrolledWindow:setScrollbars(This,PixelsPerUnitX,PixelsPerUnitY,NoUnitsX,NoUnitsY). +%% @hidden +scroll(This,X,Y) -> wxScrolledWindow:scroll(This,X,Y). +%% @hidden +prepareDC(This,Dc) -> wxScrolledWindow:prepareDC(This,Dc). +%% @hidden +doPrepareDC(This,Dc) -> wxScrolledWindow:doPrepareDC(This,Dc). +%% @hidden +getViewStart(This) -> wxScrolledWindow:getViewStart(This). +%% @hidden +getScrollPixelsPerUnit(This) -> wxScrolledWindow:getScrollPixelsPerUnit(This). +%% @hidden +enableScrolling(This,X_scrolling,Y_scrolling) -> wxScrolledWindow:enableScrolling(This,X_scrolling,Y_scrolling). +%% @hidden +calcUnscrolledPosition(This,X,Y) -> wxScrolledWindow:calcUnscrolledPosition(This,X,Y). +%% @hidden +calcUnscrolledPosition(This,Pt) -> wxScrolledWindow:calcUnscrolledPosition(This,Pt). +%% @hidden +calcScrolledPosition(This,X,Y) -> wxScrolledWindow:calcScrolledPosition(This,X,Y). +%% @hidden +calcScrolledPosition(This,Pt) -> wxScrolledWindow:calcScrolledPosition(This,Pt). + %% From wxPanel +%% @hidden +initDialog(This) -> wxPanel:initDialog(This). + %% From wxWindow +%% @hidden +warpPointer(This,X,Y) -> wxWindow:warpPointer(This,X,Y). +%% @hidden +validate(This) -> wxWindow:validate(This). +%% @hidden +updateWindowUI(This, Options) -> wxWindow:updateWindowUI(This, Options). +%% @hidden +updateWindowUI(This) -> wxWindow:updateWindowUI(This). +%% @hidden +update(This) -> wxWindow:update(This). +%% @hidden +transferDataToWindow(This) -> wxWindow:transferDataToWindow(This). +%% @hidden +transferDataFromWindow(This) -> wxWindow:transferDataFromWindow(This). +%% @hidden +thaw(This) -> wxWindow:thaw(This). +%% @hidden +show(This, Options) -> wxWindow:show(This, Options). +%% @hidden +show(This) -> wxWindow:show(This). +%% @hidden +shouldInheritColours(This) -> wxWindow:shouldInheritColours(This). +%% @hidden +setWindowVariant(This,Variant) -> wxWindow:setWindowVariant(This,Variant). +%% @hidden +setWindowStyleFlag(This,Style) -> wxWindow:setWindowStyleFlag(This,Style). +%% @hidden +setWindowStyle(This,Style) -> wxWindow:setWindowStyle(This,Style). +%% @hidden +setVirtualSizeHints(This,MinW,MinH, Options) -> wxWindow:setVirtualSizeHints(This,MinW,MinH, Options). +%% @hidden +setVirtualSizeHints(This,MinW,MinH) -> wxWindow:setVirtualSizeHints(This,MinW,MinH). +%% @hidden +setVirtualSizeHints(This,MinSize) -> wxWindow:setVirtualSizeHints(This,MinSize). +%% @hidden +setVirtualSize(This,X,Y) -> wxWindow:setVirtualSize(This,X,Y). +%% @hidden +setVirtualSize(This,Size) -> wxWindow:setVirtualSize(This,Size). +%% @hidden +setToolTip(This,Tip) -> wxWindow:setToolTip(This,Tip). +%% @hidden +setThemeEnabled(This,EnableTheme) -> wxWindow:setThemeEnabled(This,EnableTheme). +%% @hidden +setSizerAndFit(This,Sizer, Options) -> wxWindow:setSizerAndFit(This,Sizer, Options). +%% @hidden +setSizerAndFit(This,Sizer) -> wxWindow:setSizerAndFit(This,Sizer). +%% @hidden +setSizer(This,Sizer, Options) -> wxWindow:setSizer(This,Sizer, Options). +%% @hidden +setSizer(This,Sizer) -> wxWindow:setSizer(This,Sizer). +%% @hidden +setSizeHints(This,MinW,MinH, Options) -> wxWindow:setSizeHints(This,MinW,MinH, Options). +%% @hidden +setSizeHints(This,MinW,MinH) -> wxWindow:setSizeHints(This,MinW,MinH). +%% @hidden +setSizeHints(This,MinSize) -> wxWindow:setSizeHints(This,MinSize). +%% @hidden +setSize(This,X,Y,Width,Height, Options) -> wxWindow:setSize(This,X,Y,Width,Height, Options). +%% @hidden +setSize(This,X,Y,Width,Height) -> wxWindow:setSize(This,X,Y,Width,Height). +%% @hidden +setSize(This,Width,Height) -> wxWindow:setSize(This,Width,Height). +%% @hidden +setSize(This,Rect) -> wxWindow:setSize(This,Rect). +%% @hidden +setScrollPos(This,Orient,Pos, Options) -> wxWindow:setScrollPos(This,Orient,Pos, Options). +%% @hidden +setScrollPos(This,Orient,Pos) -> wxWindow:setScrollPos(This,Orient,Pos). +%% @hidden +setScrollbar(This,Orient,Pos,ThumbVisible,Range, Options) -> wxWindow:setScrollbar(This,Orient,Pos,ThumbVisible,Range, Options). +%% @hidden +setScrollbar(This,Orient,Pos,ThumbVisible,Range) -> wxWindow:setScrollbar(This,Orient,Pos,ThumbVisible,Range). +%% @hidden +setPalette(This,Pal) -> wxWindow:setPalette(This,Pal). +%% @hidden +setName(This,Name) -> wxWindow:setName(This,Name). +%% @hidden +setLabel(This,Label) -> wxWindow:setLabel(This,Label). +%% @hidden +setId(This,Winid) -> wxWindow:setId(This,Winid). +%% @hidden +setHelpText(This,Text) -> wxWindow:setHelpText(This,Text). +%% @hidden +setForegroundColour(This,Colour) -> wxWindow:setForegroundColour(This,Colour). +%% @hidden +setFont(This,Font) -> wxWindow:setFont(This,Font). +%% @hidden +setFocusFromKbd(This) -> wxWindow:setFocusFromKbd(This). +%% @hidden +setFocus(This) -> wxWindow:setFocus(This). +%% @hidden +setExtraStyle(This,ExStyle) -> wxWindow:setExtraStyle(This,ExStyle). +%% @hidden +setDropTarget(This,DropTarget) -> wxWindow:setDropTarget(This,DropTarget). +%% @hidden +setOwnForegroundColour(This,Colour) -> wxWindow:setOwnForegroundColour(This,Colour). +%% @hidden +setOwnFont(This,Font) -> wxWindow:setOwnFont(This,Font). +%% @hidden +setOwnBackgroundColour(This,Colour) -> wxWindow:setOwnBackgroundColour(This,Colour). +%% @hidden +setMinSize(This,MinSize) -> wxWindow:setMinSize(This,MinSize). +%% @hidden +setMaxSize(This,MaxSize) -> wxWindow:setMaxSize(This,MaxSize). +%% @hidden +setCursor(This,Cursor) -> wxWindow:setCursor(This,Cursor). +%% @hidden +setContainingSizer(This,Sizer) -> wxWindow:setContainingSizer(This,Sizer). +%% @hidden +setClientSize(This,Width,Height) -> wxWindow:setClientSize(This,Width,Height). +%% @hidden +setClientSize(This,Size) -> wxWindow:setClientSize(This,Size). +%% @hidden +setCaret(This,Caret) -> wxWindow:setCaret(This,Caret). +%% @hidden +setBackgroundStyle(This,Style) -> wxWindow:setBackgroundStyle(This,Style). +%% @hidden +setBackgroundColour(This,Colour) -> wxWindow:setBackgroundColour(This,Colour). +%% @hidden +setAutoLayout(This,AutoLayout) -> wxWindow:setAutoLayout(This,AutoLayout). +%% @hidden +setAcceleratorTable(This,Accel) -> wxWindow:setAcceleratorTable(This,Accel). +%% @hidden +scrollWindow(This,Dx,Dy, Options) -> wxWindow:scrollWindow(This,Dx,Dy, Options). +%% @hidden +scrollWindow(This,Dx,Dy) -> wxWindow:scrollWindow(This,Dx,Dy). +%% @hidden +scrollPages(This,Pages) -> wxWindow:scrollPages(This,Pages). +%% @hidden +scrollLines(This,Lines) -> wxWindow:scrollLines(This,Lines). +%% @hidden +screenToClient(This,Pt) -> wxWindow:screenToClient(This,Pt). +%% @hidden +screenToClient(This) -> wxWindow:screenToClient(This). +%% @hidden +reparent(This,NewParent) -> wxWindow:reparent(This,NewParent). +%% @hidden +removeChild(This,Child) -> wxWindow:removeChild(This,Child). +%% @hidden +releaseMouse(This) -> wxWindow:releaseMouse(This). +%% @hidden +refreshRect(This,Rect, Options) -> wxWindow:refreshRect(This,Rect, Options). +%% @hidden +refreshRect(This,Rect) -> wxWindow:refreshRect(This,Rect). +%% @hidden +refresh(This, Options) -> wxWindow:refresh(This, Options). +%% @hidden +refresh(This) -> wxWindow:refresh(This). +%% @hidden +raise(This) -> wxWindow:raise(This). +%% @hidden +popupMenu(This,Menu,X,Y) -> wxWindow:popupMenu(This,Menu,X,Y). +%% @hidden +popupMenu(This,Menu, Options) -> wxWindow:popupMenu(This,Menu, Options). +%% @hidden +popupMenu(This,Menu) -> wxWindow:popupMenu(This,Menu). +%% @hidden +popEventHandler(This, Options) -> wxWindow:popEventHandler(This, Options). +%% @hidden +popEventHandler(This) -> wxWindow:popEventHandler(This). +%% @hidden +pageUp(This) -> wxWindow:pageUp(This). +%% @hidden +pageDown(This) -> wxWindow:pageDown(This). +%% @hidden +navigate(This, Options) -> wxWindow:navigate(This, Options). +%% @hidden +navigate(This) -> wxWindow:navigate(This). +%% @hidden +moveBeforeInTabOrder(This,Win) -> wxWindow:moveBeforeInTabOrder(This,Win). +%% @hidden +moveAfterInTabOrder(This,Win) -> wxWindow:moveAfterInTabOrder(This,Win). +%% @hidden +move(This,X,Y, Options) -> wxWindow:move(This,X,Y, Options). +%% @hidden +move(This,X,Y) -> wxWindow:move(This,X,Y). +%% @hidden +move(This,Pt) -> wxWindow:move(This,Pt). +%% @hidden +makeModal(This, Options) -> wxWindow:makeModal(This, Options). +%% @hidden +makeModal(This) -> wxWindow:makeModal(This). +%% @hidden +lower(This) -> wxWindow:lower(This). +%% @hidden +lineUp(This) -> wxWindow:lineUp(This). +%% @hidden +lineDown(This) -> wxWindow:lineDown(This). +%% @hidden +layout(This) -> wxWindow:layout(This). +%% @hidden +isTopLevel(This) -> wxWindow:isTopLevel(This). +%% @hidden +isShown(This) -> wxWindow:isShown(This). +%% @hidden +isRetained(This) -> wxWindow:isRetained(This). +%% @hidden +isExposed(This,X,Y,W,H) -> wxWindow:isExposed(This,X,Y,W,H). +%% @hidden +isExposed(This,X,Y) -> wxWindow:isExposed(This,X,Y). +%% @hidden +isExposed(This,Pt) -> wxWindow:isExposed(This,Pt). +%% @hidden +isEnabled(This) -> wxWindow:isEnabled(This). +%% @hidden +invalidateBestSize(This) -> wxWindow:invalidateBestSize(This). +%% @hidden +inheritAttributes(This) -> wxWindow:inheritAttributes(This). +%% @hidden +hide(This) -> wxWindow:hide(This). +%% @hidden +hasTransparentBackground(This) -> wxWindow:hasTransparentBackground(This). +%% @hidden +hasScrollbar(This,Orient) -> wxWindow:hasScrollbar(This,Orient). +%% @hidden +hasCapture(This) -> wxWindow:hasCapture(This). +%% @hidden +getWindowVariant(This) -> wxWindow:getWindowVariant(This). +%% @hidden +getWindowStyleFlag(This) -> wxWindow:getWindowStyleFlag(This). +%% @hidden +getVirtualSize(This) -> wxWindow:getVirtualSize(This). +%% @hidden +getUpdateRegion(This) -> wxWindow:getUpdateRegion(This). +%% @hidden +getToolTip(This) -> wxWindow:getToolTip(This). +%% @hidden +getTextExtent(This,String, Options) -> wxWindow:getTextExtent(This,String, Options). +%% @hidden +getTextExtent(This,String) -> wxWindow:getTextExtent(This,String). +%% @hidden +getSizer(This) -> wxWindow:getSizer(This). +%% @hidden +getSize(This) -> wxWindow:getSize(This). +%% @hidden +getScrollThumb(This,Orient) -> wxWindow:getScrollThumb(This,Orient). +%% @hidden +getScrollRange(This,Orient) -> wxWindow:getScrollRange(This,Orient). +%% @hidden +getScrollPos(This,Orient) -> wxWindow:getScrollPos(This,Orient). +%% @hidden +getScreenRect(This) -> wxWindow:getScreenRect(This). +%% @hidden +getScreenPosition(This) -> wxWindow:getScreenPosition(This). +%% @hidden +getRect(This) -> wxWindow:getRect(This). +%% @hidden +getPosition(This) -> wxWindow:getPosition(This). +%% @hidden +getParent(This) -> wxWindow:getParent(This). +%% @hidden +getName(This) -> wxWindow:getName(This). +%% @hidden +getMinSize(This) -> wxWindow:getMinSize(This). +%% @hidden +getMaxSize(This) -> wxWindow:getMaxSize(This). +%% @hidden +getLabel(This) -> wxWindow:getLabel(This). +%% @hidden +getId(This) -> wxWindow:getId(This). +%% @hidden +getHelpText(This) -> wxWindow:getHelpText(This). +%% @hidden +getHandle(This) -> wxWindow:getHandle(This). +%% @hidden +getGrandParent(This) -> wxWindow:getGrandParent(This). +%% @hidden +getForegroundColour(This) -> wxWindow:getForegroundColour(This). +%% @hidden +getFont(This) -> wxWindow:getFont(This). +%% @hidden +getExtraStyle(This) -> wxWindow:getExtraStyle(This). +%% @hidden +getEventHandler(This) -> wxWindow:getEventHandler(This). +%% @hidden +getDropTarget(This) -> wxWindow:getDropTarget(This). +%% @hidden +getCursor(This) -> wxWindow:getCursor(This). +%% @hidden +getContainingSizer(This) -> wxWindow:getContainingSizer(This). +%% @hidden +getClientSize(This) -> wxWindow:getClientSize(This). +%% @hidden +getChildren(This) -> wxWindow:getChildren(This). +%% @hidden +getCharWidth(This) -> wxWindow:getCharWidth(This). +%% @hidden +getCharHeight(This) -> wxWindow:getCharHeight(This). +%% @hidden +getCaret(This) -> wxWindow:getCaret(This). +%% @hidden +getBestSize(This) -> wxWindow:getBestSize(This). +%% @hidden +getBackgroundStyle(This) -> wxWindow:getBackgroundStyle(This). +%% @hidden +getBackgroundColour(This) -> wxWindow:getBackgroundColour(This). +%% @hidden +getAcceleratorTable(This) -> wxWindow:getAcceleratorTable(This). +%% @hidden +freeze(This) -> wxWindow:freeze(This). +%% @hidden +fitInside(This) -> wxWindow:fitInside(This). +%% @hidden +fit(This) -> wxWindow:fit(This). +%% @hidden +findWindow(This,Winid) -> wxWindow:findWindow(This,Winid). +%% @hidden +enable(This, Options) -> wxWindow:enable(This, Options). +%% @hidden +enable(This) -> wxWindow:enable(This). +%% @hidden +disable(This) -> wxWindow:disable(This). +%% @hidden +destroyChildren(This) -> wxWindow:destroyChildren(This). +%% @hidden +convertPixelsToDialog(This,Sz) -> wxWindow:convertPixelsToDialog(This,Sz). +%% @hidden +convertDialogToPixels(This,Sz) -> wxWindow:convertDialogToPixels(This,Sz). +%% @hidden +close(This, Options) -> wxWindow:close(This, Options). +%% @hidden +close(This) -> wxWindow:close(This). +%% @hidden +clientToScreen(This,X,Y) -> wxWindow:clientToScreen(This,X,Y). +%% @hidden +clientToScreen(This,Pt) -> wxWindow:clientToScreen(This,Pt). +%% @hidden +clearBackground(This) -> wxWindow:clearBackground(This). +%% @hidden +centreOnParent(This, Options) -> wxWindow:centreOnParent(This, Options). +%% @hidden +centreOnParent(This) -> wxWindow:centreOnParent(This). +%% @hidden +centre(This, Options) -> wxWindow:centre(This, Options). +%% @hidden +centre(This) -> wxWindow:centre(This). +%% @hidden +centerOnParent(This, Options) -> wxWindow:centerOnParent(This, Options). +%% @hidden +centerOnParent(This) -> wxWindow:centerOnParent(This). +%% @hidden +center(This, Options) -> wxWindow:center(This, Options). +%% @hidden +center(This) -> wxWindow:center(This). +%% @hidden +captureMouse(This) -> wxWindow:captureMouse(This). +%% @hidden +cacheBestSize(This,Size) -> wxWindow:cacheBestSize(This,Size). + %% From wxEvtHandler +%% @hidden +disconnect(This,EventType, Options) -> wxEvtHandler:disconnect(This,EventType, Options). +%% @hidden +disconnect(This,EventType) -> wxEvtHandler:disconnect(This,EventType). +%% @hidden +disconnect(This) -> wxEvtHandler:disconnect(This). +%% @hidden +connect(This,EventType, Options) -> wxEvtHandler:connect(This,EventType, Options). +%% @hidden +connect(This,EventType) -> wxEvtHandler:connect(This,EventType). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxListCtrl.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxListCtrl.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxListCtrl.erl 2009-04-16 10:25:37.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxListCtrl.erl 2009-09-18 15:11:04.000000000 +0100 @@ -29,8 +29,8 @@ -module(wxListCtrl). -include("wxe.hrl"). --export([arrange/1,arrange/2,assignImageList/3,clearAll/1,create/2,create/3, - deleteAllItems/1,deleteColumn/2,deleteItem/2,destroy/1,editLabel/2, +-export([ sortItems/2 ,arrange/1,arrange/2,assignImageList/3,clearAll/1,create/2, + create/3,deleteAllItems/1,deleteColumn/2,deleteItem/2,destroy/1,editLabel/2, ensureVisible/2,findItem/3,findItem/4,getColumn/3,getColumnCount/1, getColumnWidth/2,getCountPerPage/1,getImageList/2,getItem/2,getItemBackgroundColour/2, getItemCount/1,getItemData/2,getItemFont/2,getItemPosition/3,getItemRect/3, @@ -715,6 +715,24 @@ wxe_util:cast(?wxListCtrl_SetWindowStyleFlag, <>). + +%% @spec (This::wxListCtrl(), SortCallBack::function()) -> boolean() +%% @doc Sort the items in the list control
    +%%
    SortCalBack(Item1,Item2) -> integer()
    +%%
    SortCallBack receives the client data associated with two items +%% to compare, and should return 0 if the items are equal, a negative +%% value if the first item is less than the second one and a positive +%% value if the first item is greater than the second one. +%%
    NOTE: The callback may not call other processes. +sortItems(#wx_ref{type=ThisT,ref=ThisRef}, SortCallBack) + when is_function(SortCallBack, 2) -> + ?CLASS(ThisT,wxListCtrl), + Sort = fun([Item1,Item2]) -> + Result = SortCallBack(Item1,Item2), + <> + end, + SortId = wxe_util:get_cbId(Sort), + wxe_util:call(?wxListCtrl_SortItems, <>). %% @spec (This::wxListCtrl()) -> ok %% @doc Destroys this object, do not use object again destroy(Obj=#wx_ref{type=Type}) -> diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxLogNull.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxLogNull.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxLogNull.erl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxLogNull.erl 2009-11-20 13:34:52.000000000 +0000 @@ -0,0 +1,46 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: wxLogNull. +%% @type wxLogNull(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxLogNull). +-include("wxe.hrl"). +-export([destroy/1,new/0]). + +%% inherited exports +-export([parent_class/1]). + +%% @hidden +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +%% @spec () -> wxLogNull() +%% @doc See external documentation. +new() -> + wxe_util:construct(?wxLogNull_new, + <<>>). + +%% @spec (This::wxLogNull()) -> ok +%% @doc Destroys this object, do not use object again +destroy(Obj=#wx_ref{type=Type}) -> + ?CLASS(Type,wxLogNull), + wxe_util:destroy(?wxLogNull_destroy,Obj), + ok. diff -Nru erlang-13.b.1-dfsg/lib/wx/src/gen/wxRadioBox.erl erlang-13.b.3-dfsg/lib/wx/src/gen/wxRadioBox.erl --- erlang-13.b.1-dfsg/lib/wx/src/gen/wxRadioBox.erl 2009-04-16 10:25:45.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/gen/wxRadioBox.erl 2009-09-18 15:11:05.000000000 +0100 @@ -19,7 +19,6 @@ %% @doc See external documentation: wxRadioBox. %%

    This class is derived (and can use functions) from: -%%
    {@link wxControlWithItems} %%
    {@link wxControl} %%
    {@link wxWindow} %%
    {@link wxEvtHandler} @@ -36,32 +35,30 @@ setItemHelpText/3,setItemToolTip/3,setSelection/2,show/1,show/2,show/3]). %% inherited exports --export([append/2,append/3,appendStrings/2,cacheBestSize/2,captureMouse/1,center/1, - center/2,centerOnParent/1,centerOnParent/2,centre/1,centre/2,centreOnParent/1, - centreOnParent/2,clear/1,clearBackground/1,clientToScreen/2,clientToScreen/3, - close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, - delete/2,destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - findString/2,findString/3,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientData/2,getClientSize/1, - getContainingSizer/1,getCount/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1,getMinSize/1, - getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, +-export([cacheBestSize/2,captureMouse/1,center/1,center/2,centerOnParent/1, + centerOnParent/2,centre/1,centre/2,centreOnParent/1,centreOnParent/2, + clearBackground/1,clientToScreen/2,clientToScreen/3,close/1,close/2, + connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, + destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, + findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1,getBackgroundColour/1, + getBackgroundStyle/1,getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1, + getChildren/1,getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, + getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSize/1,getSizer/1,getStringSelection/1,getTextExtent/2,getTextExtent/3, - getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,insert/3,insert/4,invalidateBestSize/1, - isEmpty/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,select/2,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientData/3, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isEnabled/1,isExposed/2,isExposed/3, + isExposed/5,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1, + lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2, + moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, + popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, @@ -69,14 +66,13 @@ setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, - setString/3,setStringSelection/2,setThemeEnabled/2,setToolTip/2,setVirtualSize/2, - setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + setThemeEnabled/2,setToolTip/2,setVirtualSize/2,setVirtualSize/3, + setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, thaw/1,transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, updateWindowUI/2,validate/1,warpPointer/3]). %% @hidden -parent_class(wxControlWithItems) -> true; parent_class(wxControl) -> true; parent_class(wxWindow) -> true; parent_class(wxEvtHandler) -> true; @@ -310,41 +306,6 @@ ?CLASS(Type,wxRadioBox), wxe_util:destroy(?DESTROY_OBJECT,Obj), ok. - %% From wxControlWithItems -%% @hidden -setStringSelection(This,S) -> wxControlWithItems:setStringSelection(This,S). -%% @hidden -setString(This,N,S) -> wxControlWithItems:setString(This,N,S). -%% @hidden -select(This,N) -> wxControlWithItems:select(This,N). -%% @hidden -isEmpty(This) -> wxControlWithItems:isEmpty(This). -%% @hidden -insert(This,Item,Pos,ClientData) -> wxControlWithItems:insert(This,Item,Pos,ClientData). -%% @hidden -insert(This,Item,Pos) -> wxControlWithItems:insert(This,Item,Pos). -%% @hidden -getStringSelection(This) -> wxControlWithItems:getStringSelection(This). -%% @hidden -getCount(This) -> wxControlWithItems:getCount(This). -%% @hidden -setClientData(This,N,ClientData) -> wxControlWithItems:setClientData(This,N,ClientData). -%% @hidden -getClientData(This,N) -> wxControlWithItems:getClientData(This,N). -%% @hidden -findString(This,S, Options) -> wxControlWithItems:findString(This,S, Options). -%% @hidden -findString(This,S) -> wxControlWithItems:findString(This,S). -%% @hidden -delete(This,N) -> wxControlWithItems:delete(This,N). -%% @hidden -clear(This) -> wxControlWithItems:clear(This). -%% @hidden -appendStrings(This,Strings) -> wxControlWithItems:appendStrings(This,Strings). -%% @hidden -append(This,Item,ClientData) -> wxControlWithItems:append(This,Item,ClientData). -%% @hidden -append(This,Item) -> wxControlWithItems:append(This,Item). %% From wxControl %% @hidden setLabel(This,Label) -> wxControl:setLabel(This,Label). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/Makefile erlang-13.b.3-dfsg/lib/wx/src/Makefile --- erlang-13.b.1-dfsg/lib/wx/src/Makefile 2009-03-12 14:44:45.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/src/Makefile 2009-11-20 13:34:41.000000000 +0000 @@ -27,6 +27,8 @@ ERLINC = ../include ERL_COMPILE_FLAGS += -I$(ERLINC) +warn_unused_vars +ARCHIVE = wx-$(VSN).ez + ErlMods = \ wx \ wx_object \ @@ -70,6 +72,10 @@ docs: +archive: opt + (cd ../..; zip -0 wx/$(ARCHIVE) wx wx/ebin wx/ebin/*) + + # Rules $(EBIN)/%.beam: $(ESRC)/%.erl $(HEADER_FILES) $(ERLC) -W -bbeam $(ERL_FLAGS) $(ERL_COMPILE_FLAGS) -o$(EBIN) $< @@ -82,7 +88,7 @@ # ---------------------------------------------------- ifeq ($(INSIDE_ERLSRC), true) include $(ERL_TOP)/make/otp_release_targets.mk -release_spec: opt +release_spec: opt $(INSTALL_DIR) $(RELSYSDIR)/src $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) $(RELSYSDIR)/src $(INSTALL_DIR) $(RELSYSDIR)/src/gen @@ -91,6 +97,7 @@ $(INSTALL_DATA) $(EXT_HRL) $(RELSYSDIR)/include $(INSTALL_DIR) $(RELSYSDIR)/ebin $(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)/ebin +# $(INSTALL_DATA) ../$(ARCHIVE) $(RELEASE_PATH)/lib release_docs_spec: -endif \ No newline at end of file +endif diff -Nru erlang-13.b.1-dfsg/lib/wx/src/wxe.hrl erlang-13.b.3-dfsg/lib/wx/src/wxe.hrl --- erlang-13.b.1-dfsg/lib/wx/src/wxe.hrl 2009-04-16 10:25:49.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/wxe.hrl 2009-09-18 15:11:05.000000000 +0100 @@ -49,5 +49,7 @@ -define(WXE_REGISTER_OBJECT, 7). %% Used for object monitoring -define(WXE_CB_START, 8). %% Used for event-callback start -define(WXE_DEBUG_DRIVER, 9). %% Set debug - +%%-define(WXE_DEBUG_PING, 10). %% debug ping (when using debugger it's needed) +-define(WXE_BIN_INCR, 5001). %% Binary refc incr +-define(WXE_BIN_DECR, 5002). %% Binary refc decr -include("gen/wxe_funcs.hrl"). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/wxe_master.erl erlang-13.b.3-dfsg/lib/wx/src/wxe_master.erl --- erlang-13.b.1-dfsg/lib/wx/src/wxe_master.erl 2009-04-16 10:25:49.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/wxe_master.erl 2009-09-18 15:11:07.000000000 +0100 @@ -119,7 +119,9 @@ erlang:error({load_driver,Str}) end, process_flag(trap_exit, true), - case catch open_port({spawn,DriverName},[binary]) of + DriverWithArgs = DriverName ++ " " ++ code:priv_dir(wx) ++ [0], + + case catch open_port({spawn, DriverWithArgs},[binary]) of {'EXIT', Err} -> erlang:error({open_port,Err}); Port -> @@ -209,7 +211,13 @@ priv_dir() -> Type = erlang:system_info(system_architecture), {file, Path} = code:is_loaded(?MODULE), - Priv = filename:join(strip(Path, filename:join(["ebin/",atom_to_list(?MODULE) ++ ".beam"])), "priv"), + Priv = case filelib:is_regular(Path) of + true -> + Beam = filename:join(["ebin/",atom_to_list(?MODULE) ++ ".beam"]), + filename:join(strip(Path, Beam), "priv"); + false -> + code:priv_dir(wx) + end, try {ok, Dirs0} = file:list_dir(Priv), Dirs1 = split_dirs(Dirs0), @@ -280,7 +288,7 @@ debug_ping(Port) -> - timer:sleep(1*500), + timer:sleep(1*333), _R = (catch erlang:port_call(Port, 0, [])), %% io:format("Erlang ping ~p ~n", [_R]), debug_ping(Port). diff -Nru erlang-13.b.1-dfsg/lib/wx/src/wx.erl erlang-13.b.3-dfsg/lib/wx/src/wx.erl --- erlang-13.b.1-dfsg/lib/wx/src/wx.erl 2009-04-16 10:25:50.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/wx.erl 2009-09-18 15:11:07.000000000 +0100 @@ -74,7 +74,13 @@ get_env/0,set_env/1, debug/1, batch/1,foreach/2,map/2,foldl/3,foldr/3, getObjectType/1, typeCast/2, - null/0, is_null/1, create_memory/1, get_memory_bin/1]). + null/0, is_null/1]). + +-export([create_memory/1, get_memory_bin/1, + retain_memory/1, release_memory/1]). + + +-export([demo/0]). -include("wxe.hrl"). @@ -90,7 +96,7 @@ %% @doc Starts a wx server. %% Option may be {debug, Level}, see debug/1. new(Options) when is_list(Options) -> - wxe_server:start(), + #wx_env{} = wxe_server:start(), Debug = proplists:get_value(debug, Options, 0), debug(Debug), null(). @@ -124,7 +130,7 @@ %% @spec () -> wxObject() %% @doc Returns the null object null() -> - #wx_ref{ref= 0,type=wx}. + #wx_ref{ref=0, type=wx}. %% @spec (wxObject()) -> boolean() %% @doc Returns true if object is null, false otherwise @@ -238,6 +244,30 @@ <> = Bin, WithCorrectSize. +%% @spec (wx_memory()) -> ok +%% @doc Saves the memory from deletion until release_memory/1 is called. +%% If release_memory/1 is not called the memory will not be garbage collected. +retain_memory(#wx_mem{bin=Bin}) -> + wxe_util:send_bin(Bin), + ok = wxe_util:cast(?WXE_BIN_INCR, <<>>); +retain_memory(Bin) when is_binary(Bin) -> + case byte_size(Bin) > ?MIN_BIN_SIZE of + true -> ok; + false -> erlang:error(small_bin) + end, + wxe_util:send_bin(Bin), + ok = wxe_util:cast(?WXE_BIN_INCR, <<>>). + +release_memory(#wx_mem{bin=Bin}) -> + wxe_util:send_bin(Bin), + ok = wxe_util:cast(?WXE_BIN_DECR, <<>>); +release_memory(Bin) when is_binary(Bin) -> + wxe_util:send_bin(Bin), + ok = wxe_util:cast(?WXE_BIN_DECR, <<>>). + + + + %% @spec (Level::term()) -> ok %% Level = none | verbose | trace | driver | [Level] %% @doc Sets debug level. If debug level is verbose or trace @@ -275,3 +305,16 @@ ok end. +%% @spec () -> ok +%% @doc Starts a wxErlang demo if examples directory exists and is compiled +demo() -> + Priv = code:priv_dir(wx), + Demo = filename:join([filename:dirname(Priv),examples,demo]), + Mod = list_to_atom("demo"), %% Fool xref tests + case file:set_cwd(Demo) of + ok -> + apply(Mod, start, []); + _ -> + {error, no_demo_dir} + end. + diff -Nru erlang-13.b.1-dfsg/lib/wx/src/wxe_server.erl erlang-13.b.3-dfsg/lib/wx/src/wxe_server.erl --- erlang-13.b.1-dfsg/lib/wx/src/wxe_server.erl 2009-04-16 10:25:49.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/wxe_server.erl 2009-09-18 15:11:06.000000000 +0100 @@ -49,7 +49,7 @@ %% API %%==================================================================== %%-------------------------------------------------------------------- -%% Function: start_link() -> {ok,Pid} | ignore | {error,Error} +%% Function: start() -> #wx_env{} %% Description: Starts the server %%-------------------------------------------------------------------- start() -> @@ -57,7 +57,7 @@ undefined -> case gen_server:start(?MODULE, [], []) of {ok, Pid} -> - {ok, Port} = gen_server:call(Pid, get_port), + {ok, Port} = gen_server:call(Pid, get_port, infinity), wx:set_env(Env = #wx_env{port=Port,sv=Pid}), Env; {error, {Reason, _Stack}} -> @@ -75,11 +75,11 @@ stop() -> #wx_env{sv=Pid} = get(?WXE_IDENTIFIER), - catch gen_server:call(Pid, stop), + catch gen_server:call(Pid, stop, infinity), ok. register_me(Pid) -> - ok = gen_server:call(Pid, register_me). + ok = gen_server:call(Pid, register_me, infinity). set_debug(Pid, Level) -> gen_server:cast(Pid, {debug, Level}). @@ -165,7 +165,6 @@ erase(FunId), {noreply, State0#state{cb=gb_trees:delete(Fun, CB)}} end; - handle_info({'DOWN',_,process,Pid,_}, State=#state{users=Users0,cleaners=Cs}) -> try User = gb_trees:get(Pid,Users0), @@ -180,12 +179,12 @@ handle_info(Msg = {'_wxe_destroy_', Pid}, State) -> case erlang:is_process_alive(Pid) of true -> - Pid ! Msg; + Pid ! Msg, + ok; false -> ok end, {noreply, State}; - handle_info(_Info, State) -> ?log("Unknown message ~p sent to ~p~n",[_Info, ?MODULE]), {noreply, State}. @@ -239,12 +238,12 @@ %% Event callbacks case get(FunId) of Fun when is_function(Fun) -> - invoke_callback(fun() -> + invoke_callback(fun() -> wxe_util:cast(?WXE_CB_START, <<>>), Fun(Ev, Ref), <<>> - end); - Err -> + end); + Err -> ?log("Internal Error ~p~n",[Err]) end; invoke_cb({FunId, Args, _}, _S) when is_list(Args), is_integer(FunId) -> @@ -252,7 +251,7 @@ case get(FunId) of Fun when is_function(Fun) -> invoke_callback(fun() -> Fun(Args) end); - Err -> + Err -> ?log("Internal Error ~p ~p ~p~n",[Err, FunId, Args]) end. @@ -263,18 +262,19 @@ Res = try Return = Fun(), true = is_binary(Return), Return - catch error:Reason -> + catch _:Reason -> ?log("Callback fun crashed with {'EXIT, ~p, ~p}~n", [Reason, erlang:get_stacktrace()]), <<>> end, wxe_util:cast(?WXE_CB_RETURN, Res) end, - spawn(CB). + spawn(CB), + ok. new_evt_listener(State) -> #wx_env{port=Port} = wx:get_env(), - erlang:port_control(Port,98,<<>>), + _ = erlang:port_control(Port,98,<<>>), get_result(State). get_result(_State) -> diff -Nru erlang-13.b.1-dfsg/lib/wx/src/wxe_util.erl erlang-13.b.3-dfsg/lib/wx/src/wxe_util.erl --- erlang-13.b.1-dfsg/lib/wx/src/wxe_util.erl 2009-04-16 10:25:49.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/wxe_util.erl 2009-11-20 13:34:41.000000000 +0000 @@ -57,7 +57,7 @@ cast(Op,Args) -> #wx_env{port=Port,debug=Dbg} = wx:get_env(), - erlang:port_control(Port,Op,Args), + _ = erlang:port_control(Port,Op,Args), case Dbg > 0 of true -> debug_cast(Dbg band 15, Op,Args,Port); false -> ok @@ -68,7 +68,7 @@ #wx_env{port=Port,debug=Dbg} = wx:get_env(), case Dbg > 0 of false -> - erlang:port_control(Port,Op,Args), + _ = erlang:port_control(Port,Op,Args), rec(Op); true -> debug_call(Dbg band 15, Op, Args, Port) @@ -92,7 +92,6 @@ cast(Op,<>). register_pid(#wx_ref{ref=Ref}) -> - send_bin(term_to_binary(self())), call(?WXE_REGISTER_OBJECT, <>). send_bin(Bin) when is_binary(Bin) -> @@ -106,7 +105,7 @@ end. get_cbId(Fun) -> - gen_server:call((wx:get_env())#wx_env.sv,{register_cb, Fun}). + gen_server:call((wx:get_env())#wx_env.sv,{register_cb, Fun}, infinity). connect_cb(Object,EvData) -> handle_listener(connect_cb, Object, EvData). @@ -115,7 +114,7 @@ handle_listener(disconnect_cb, Object, EvData). handle_listener(Op,Object,EvData) -> - Listener = gen_server:call((wx:get_env())#wx_env.sv, {Op,Object,EvData}), + Listener = gen_server:call((wx:get_env())#wx_env.sv, {Op,Object,EvData}, infinity), case Listener of {call_impl, connect_cb, EvtList} -> wxEvtHandler:connect_impl(EvtList,Object,EvData); @@ -153,9 +152,8 @@ [] -> io:format("WX ~p: unknown(~p) -> ",[self(),Op]) end, - erlang:port_control(Port,Op,Args), + _ = erlang:port_control(Port,Op,Args), debug_rec(1); - debug_call(2, Op, Args, Port) -> check_previous(), case ets:lookup(wx_debug_info,Op) of @@ -166,15 +164,13 @@ io:format("WX ~p(~p): unknown(~p) (~p) -> ", [self(), Port, Op, Args]) end, - erlang:port_control(Port,Op,Args), + _ = erlang:port_control(Port,Op,Args), debug_rec(2); debug_call(_, Op, Args, Port) -> check_previous(), - erlang:port_control(Port,Op,Args), + _ = erlang:port_control(Port,Op,Args), rec(Op). - - debug_rec(1) -> receive {'_wxe_result_', Res} -> diff -Nru erlang-13.b.1-dfsg/lib/wx/src/wx_object.erl erlang-13.b.3-dfsg/lib/wx/src/wx_object.erl --- erlang-13.b.1-dfsg/lib/wx/src/wx_object.erl 2009-06-05 13:54:34.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/src/wx_object.erl 2009-11-20 13:34:41.000000000 +0000 @@ -103,7 +103,9 @@ -export([start/3, start/4, start_link/3, start_link/4, call/2, call/3, - reply/2 + cast/2, + reply/2, + get_pid/1 ]). -export([behaviour_info/1]). @@ -143,8 +145,7 @@ %% @doc Starts a generic wx_object server and invokes Mod:init(Args) in the %% new process. start(Mod, Args, Options) -> - {ok, Pid} = gen:start(?MODULE, nolink, Mod, Args, [get(?WXE_IDENTIFIER)|Options]), - receive {ack, Pid, Ref = #wx_ref{}} -> Ref end. + gen_response(gen:start(?MODULE, nolink, Mod, Args, [get(?WXE_IDENTIFIER)|Options])). %% @spec (Name, Mod, Args, Options) -> wxWindow:wxWindow() %% Name = {local, atom()} @@ -155,8 +156,7 @@ %% @doc Starts a generic wx_object server and invokes Mod:init(Args) in the %% new process. start(Name, Mod, Args, Options) -> - {ok, Pid} = gen:start(?MODULE, nolink, Name, Mod, Args, [get(?WXE_IDENTIFIER)|Options]), - receive {ack, Pid, Ref = #wx_ref{}} -> Ref end. + gen_response(gen:start(?MODULE, nolink, Name, Mod, Args, [get(?WXE_IDENTIFIER)|Options])). %% @spec (Mod, Args, Options) -> wxWindow:wxWindow() %% Mod = atom() @@ -166,8 +166,7 @@ %% @doc Starts a generic wx_object server and invokes Mod:init(Args) in the %% new process. start_link(Mod, Args, Options) -> - {ok, Pid} = gen:start(?MODULE, link, Mod, Args, [get(?WXE_IDENTIFIER)|Options]), - receive {ack, Pid, Ref = #wx_ref{}} -> Ref end. + gen_response(gen:start(?MODULE, link, Mod, Args, [get(?WXE_IDENTIFIER)|Options])). %% @spec (Name, Mod, Args, Options) -> wxWindow:wxWindow() %% Name = {local, atom()} @@ -178,21 +177,34 @@ %% @doc Starts a generic wx_object server and invokes Mod:init(Args) in the %% new process. start_link(Name, Mod, Args, Options) -> - {ok, Pid} = gen:start(?MODULE, link, Name, Mod, Args, [get(?WXE_IDENTIFIER)|Options]), - receive {ack, Pid, Ref = #wx_ref{}} -> Ref end. - -%% @spec(wxObject(), Request) -> term() -%% @doc Make a call to a wx_object server. -%% Invokes handle_call(Request, From, State) in server + gen_response(gen:start(?MODULE, link, Name, Mod, Args, [get(?WXE_IDENTIFIER)|Options])). + +gen_response({ok, Pid}) -> + receive {ack, Pid, Ref = #wx_ref{}} -> Ref end; +gen_response(Reply) -> + Reply. + +%% @spec (Ref::wxObject()|atom()|pid(), Request::term()) -> term() +%% @doc Make a call to a wx_object server. +%% The call waits until it gets a result. +%% Invokes handle_call(Request, From, State) in the server call(Ref = #wx_ref{state=Pid}, Request) when is_pid(Pid) -> try {ok,Res} = gen:call(Pid, '$gen_call', Request, infinity), Res catch _:Reason -> erlang:error({Reason, {?MODULE, call, [Ref, Request]}}) + end; +call(Name, Request) when is_atom(Name) orelse is_pid(Name) -> + try + {ok,Res} = gen:call(Name, '$gen_call', Request, infinity), + Res + catch _:Reason -> + erlang:error({Reason, {?MODULE, call, [Name, Request]}}) end. -%% @spec(wxObject(), Request, integer()) -> term() -%% @doc Make a call to a wx_object server. + +%% @spec (Ref::wxObject()|atom()|pid(), Request::term(), Timeout::integer()) -> term() +%% @doc Make a call to a wx_object server with a timeout. %% Invokes handle_call(Request, From, State) in server call(Ref = #wx_ref{state=Pid}, Request, Timeout) when is_pid(Pid) -> try @@ -200,11 +212,34 @@ Res catch _:Reason -> erlang:error({Reason, {?MODULE, call, [Ref, Request, Timeout]}}) + end; +call(Name, Request, Timeout) when is_atom(Name) orelse is_pid(Name) -> + try + {ok,Res} = gen:call(Name, '$gen_call', Request, Timeout), + Res + catch _:Reason -> + erlang:error({Reason, {?MODULE, call, [Name, Request, Timeout]}}) end. - + +%% @spec (Ref::wxObject()|atom()|pid(), Request::term()) -> ok +%% @doc Make a cast to a wx_object server. +%% Invokes handle_cast(Request, State) in the server + +cast(#wx_ref{state=Pid}, Request) when is_pid(Pid) -> + Pid ! {'$gen_cast',Request}; +cast(Name, Request) when is_atom(Name) orelse is_pid(Name) -> + Name ! {'$gen_cast',Request}. + +%% @spec (Ref::wxObject()) -> pid() +%% @doc Get the pid of the object handle. +get_pid(#wx_ref{state=Pid}) when is_pid(Pid) -> + Pid. + %% ----------------------------------------------------------------- %% Send a reply to the client. %% ----------------------------------------------------------------- +%% @spec (From::tuple(), Reply::term()) -> pid() +%% @doc Get the pid of the object handle. reply({To, Tag}, Reply) -> catch To ! {Tag, Reply}. @@ -385,7 +420,7 @@ {stop, Reason, Reply, NState} -> {'EXIT', R} = (catch terminate(Reason, Name, Msg, Mod, NState, Debug)), - reply(Name, From, Reply, NState, Debug), + _ = reply(Name, From, Reply, NState, Debug), exit(R); Other -> handle_common_reply(Other, Name, Msg, Mod, State, Debug) @@ -411,7 +446,9 @@ loop(Parent, Name, NState, Mod, Time1, Debug1); handle_no_reply(Reply, _Parent, Name, Msg, Mod, State, Debug) -> handle_common_reply(Reply, Name, Msg, Mod, State,Debug). + %% @hidden +-spec handle_common_reply(_, _, _, _, _, _) -> no_return(). handle_common_reply(Reply, Name, Msg, Mod, State, Debug) -> case Reply of {stop, Reason, NState} -> @@ -421,6 +458,7 @@ _ -> terminate({bad_return_value, Reply}, Name, Msg, Mod, State, Debug) end. + %% @hidden reply(Name, {To, Tag}, Reply, State, Debug) -> reply({To, Tag}, Reply), @@ -434,11 +472,12 @@ %% @hidden system_continue(Parent, Debug, [Name, State, Mod, Time]) -> loop(Parent, Name, State, Mod, Time, Debug). -%% @hidden --spec(system_terminate/4 :: (_, _, _, [_]) -> no_return()). +%% @hidden +-spec system_terminate(_, _, _, [_]) -> no_return(). system_terminate(Reason, _Parent, Debug, [Name, State, Mod, _Time]) -> terminate(Reason, Name, [], Mod, State, Debug). + %% @hidden system_code_change([Name, State, Mod, Time], _Module, OldVsn, Extra) -> case catch Mod:code_change(OldVsn, State, Extra) of diff -Nru erlang-13.b.1-dfsg/lib/wx/test/wx_class_SUITE.erl erlang-13.b.3-dfsg/lib/wx/test/wx_class_SUITE.erl --- erlang-13.b.1-dfsg/lib/wx/test/wx_class_SUITE.erl 2009-03-12 12:26:19.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/test/wx_class_SUITE.erl 2009-09-18 15:11:08.000000000 +0100 @@ -55,7 +55,10 @@ notebook, staticBoxSizer, clipboard, - helpFrame + helpFrame, + htmlWindow, + listCtrlSort, + radioBox ]. %% The test cases @@ -261,7 +264,7 @@ Wx = wx:new(), MFrame = wx:batch(fun() -> MFrame = wxFrame:new(Wx, ?wxID_ANY, "Main Frame"), - MPanel = wxPanel:new(MFrame, [{size, {600,400}}]), + wxPanel:new(MFrame, [{size, {600,400}}]), wxWindow:show(MFrame), MFrame end), @@ -287,3 +290,92 @@ wxWindow:show(Comp), wx_test_lib:wx_destroy(MFrame,Config). +htmlWindow(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo); +htmlWindow(Config) -> + Wx = wx:new(), + {MFrame,HPanel} = + wx:batch(fun() -> + MFrame = wxFrame:new(Wx, ?wxID_ANY, "Main Frame"), + HPanel = wxHtmlWindow:new(MFrame, [{size, {600,400}}]), + wxWindow:show(MFrame), + {MFrame, HPanel} + end), + timer:sleep(9), + + WxMod = code:which(wx), + WxDir = filename:split(filename:dirname(WxMod)) -- ["ebin"], + Html = filename:join(filename:join(WxDir),filename:join("doc", "html")), + + Index = filename:join(Html, "wx.html"), + + ?m(ok, wxHtmlWindow:connect(HPanel, command_html_link_clicked, + [{callback, + fun(Ev,_) -> + io:format("Link clicked: ~p~n",[Ev]) + end}])), + + case filelib:is_file(Index) of + true -> + ?m(true, wxHtmlWindow:loadFile(HPanel, Index)), + ok; + false -> + ok + end, + + wx_test_lib:wx_destroy(MFrame,Config). + + +listCtrlSort(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo); +listCtrlSort(Config) -> + Wx = wx:new(), + Frame = wxFrame:new(Wx, ?wxID_ANY, "Frame"), + + LC = wxListCtrl:new(Frame, [{style, ?wxLC_REPORT bor ?wxLC_SORT_ASCENDING}]), + + %% must be done crashes in wxwidgets otherwise. + wxListCtrl:insertColumn(LC, 0, "Column"), + + Add = fun(Int) -> + wxListCtrl:insertItem(LC, Int, integer_to_list(Int)), + %% ItemData Can only be integers currently + wxListCtrl:setItemData(LC, Int, abs(2500-Int)) + end, + + wx:foreach(Add, lists:seq(0,5000)), + wxWindow:show(Frame), + + timer:sleep(200), + + Sort = fun() -> + wxListCtrl:sortItems(LC, fun(A, B) -> + %% io:format("S ~p ~p ~n",[A,B]), + if A =:= B -> 0; + A < B -> -1; + true -> 1 + end + end) + end, + + Time = timer:tc(erlang, apply, [Sort,[]]), + io:format("Sorted ~p ~n",[Time]), + + wx_test_lib:wx_destroy(Frame,Config). + + +radioBox(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo); +radioBox(Config) -> + Wx = wx:new(), + Frame = wxFrame:new(Wx, ?wxID_ANY, "Frame"), + + TrSortRadioBox = wxRadioBox:new(Frame, ?wxID_ANY, "Sort by:", + {100, 100},{100, 100}, ["Timestamp"]), + + io:format("TrSortRadioBox ~p ~n", [TrSortRadioBox]), + %% If I uncomment any of these lines, it will crash + + ?m(_, catch wxControlWithItems:setClientData(TrSortRadioBox, 0, timestamp)), + %?m(_, wxListBox:append(TrSortRadioBox, "Session Id", session_id)), + %?m(_, wxListBox:insert(TrSortRadioBox, "Session Id", 0, session_id)), + + wxWindow:show(Frame), + wx_test_lib:wx_destroy(Frame,Config). diff -Nru erlang-13.b.1-dfsg/lib/wx/test/wx_test_lib.erl erlang-13.b.3-dfsg/lib/wx/test/wx_test_lib.erl --- erlang-13.b.1-dfsg/lib/wx/test/wx_test_lib.erl 2009-03-12 12:26:18.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/wx/test/wx_test_lib.erl 2009-09-18 15:11:07.000000000 +0100 @@ -92,7 +92,7 @@ log(Format, Args, File, Line); undefined -> case init:get_argument(Arg) of - {ok, List} when list(List) -> + {ok, List} when is_list(List) -> case lists:last(List) of ["true"] -> put(Arg, true), diff -Nru erlang-13.b.1-dfsg/lib/wx/vsn.mk erlang-13.b.3-dfsg/lib/wx/vsn.mk --- erlang-13.b.1-dfsg/lib/wx/vsn.mk 2009-06-05 13:54:35.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/wx/vsn.mk 2009-11-20 13:34:45.000000000 +0000 @@ -1,4 +1,6 @@ -WX_VSN = 0.98.2 +WX_VSN = 0.98.4 -TICKETS = OTP-7943 +TICKETS = OTP-8243 OTP-8250 OTP-8292 +TICKETS_0.98.3 = OTP-8138 OTP-8126 OTP-8083 +TICKETS_0.98.2 = OTP-7943 TICKETS_0.98.1 = OTP-7875 \ No newline at end of file diff -Nru erlang-13.b.1-dfsg/lib/xmerl/doc/src/book.xml erlang-13.b.3-dfsg/lib/xmerl/doc/src/book.xml --- erlang-13.b.1-dfsg/lib/xmerl/doc/src/book.xml 2007-11-26 13:12:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/xmerl/doc/src/book.xml 2009-11-20 13:35:15.000000000 +0000 @@ -1,29 +1,27 @@ - +

    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + - xmerl Application + xmerl Bertil Karlsson 2004-06-02 @@ -32,16 +30,19 @@
    - xmerl Application + xmerl - + - + + + + diff -Nru erlang-13.b.1-dfsg/lib/xmerl/doc/src/Makefile erlang-13.b.3-dfsg/lib/xmerl/doc/src/Makefile --- erlang-13.b.1-dfsg/lib/xmerl/doc/src/Makefile 2009-06-05 13:54:45.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/doc/src/Makefile 2009-11-20 13:35:15.000000000 +0000 @@ -24,11 +24,12 @@ # ---------------------------------------------------- include ../../vsn.mk VSN=$(XMERL_VSN) +APPLICATION=xmerl # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- -RELSYSDIR = $(RELEASE_PATH)/lib/xmerl-$(VSN) +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) # ---------------------------------------------------- # Help application directory specification @@ -40,7 +41,7 @@ # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- -XMERL_DIR = $(ERL_TOP)/lib/xmerl/src +XMERL_DIR = $(ERL_TOP)/lib/$(APPLICATION)/src XMERL_MODULES = \ xmerl_scan \ @@ -54,7 +55,6 @@ XML_APPLICATION_FILES = ref_man.xml XMERL_XML_FILES = $(XMERL_MODULES:=.xml) -XML_REF_MAN = ref_man.xml XML_REF3_FILES = $(XMERL_XML_FILES) \ xmerl_sax_parser.xml @@ -68,7 +68,6 @@ xmerl_ug.xml \ notes.xml -# xmerl_sax_ug.xml \ HTML_EXAMPLE_FILES = \ xmerl_examples.html \ @@ -86,6 +85,10 @@ new_motorcycles.txt new_motorcycles2.txt result_export.html \ motorcycles2.txt result_xs.html motorcycles2html.erl +XML_FILES= \ + $(BOOK_FILES) $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES) + # ---------------------------------------------------- INFO_FILE = ../../info @@ -94,32 +97,12 @@ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) -EXTRA_FILES = \ - $(DEFAULT_HTML_FILES) \ - $(DEFAULT_GIF_FILES) \ - $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html) \ - $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) - MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) -TEX_FILES_BOOK = \ - $(BOOK_FILES:%.xml=%.tex) -TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ - $(XML_REF6_FILES:%.xml=%.tex) \ - $(XML_REF_MAN:%.xml=%.tex) -TEX_FILES_USERS_GUIDE = \ - $(XML_CHAPTER_FILES:%.xml=%.tex) - -TOP_PDF_FILE = xmerl-$(VSN).pdf -TOP_PS_FILE = xmerl-$(VSN).ps +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html -$(TOP_PDF_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ - -$(TOP_PS_FILE): book.dvi ../../vsn.mk - $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf # ---------------------------------------------------- @@ -131,37 +114,19 @@ # ---------------------------------------------------- # Targets # ---------------------------------------------------- -ifeq ($(DOCTYPE),pdf) -docs: pdf -else -ifeq ($(DOCTYPE),ps) -docs: ps -else -docs: html gifs man -endif -endif +$(HTMLDIR)/%.gif: %.gif + $(INSTALL_DATA) $< $@ +docs: pdf html man -$(XMERL_XML_FILES): - docb_gen $(XMERL_DIR)/$(@:%.xml=%.erl) - - -info: - @echo "XML_PART_FILES: $(XML_PART_FILES)" - @echo "XML_APPLICATION_FILES: $(XML_APPLICATION_FILES)" - @echo "XMERL_XML_FILES: $(XMERL_XML_FILES)" - @echo "XMERL_MODULES: $(XMERL_MODULES)" - @echo "HTML_FILES: $(HTML_FILES)" - @echo "HTMLDIR: $(HTMLDIR)" - @echo "DEFAULT_GIF_FILES: $(DEFAULT_GIF_FILES)" - @echo "DEFAULT_HTML_FILES: $(DEFAULT_HTML_FILES)" - @echo "EXTRA_FILES: $(EXTRA_FILES)" +$(TOP_PDF_FILE): $(XML_FILES) -pdf: xml $(TOP_PDF_FILE) +pdf: $(TOP_PDF_FILE) -ps: xml $(TOP_PS_FILE) +html: gifs $(HTML_REF_MAN_FILE) -html: xml $(HTML_FILES) +$(XMERL_XML_FILES): + docb_gen $(XMERL_DIR)/$(@:%.xml=%.erl) man: $(MAN3_FILES) $(MAN6_FILES) @@ -171,52 +136,46 @@ debug opt: - -clean clean_docs clean_tex: +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(MAN6DIR)/* rm -f $(XMERL_XML_FILES) - rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) - rm -f $(HTML_FILES) $(MAN3_FILES) $(MAN6_FILES) - rm -f $(EXTRA_FILES:fascicules.xml= ) - rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) - rm -f errs core *~ *sgmls_output *sgmls_errs $(LATEX_CLEAN) + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f errs core *~ +info: + @echo "XML_PART_FILES: $(XML_PART_FILES)" + @echo "XML_APPLICATION_FILES: $(XML_APPLICATION_FILES)" + @echo "XMERL_XML_FILES: $(XMERL_XML_FILES)" + @echo "XMERL_MODULES: $(XMERL_MODULES)" + @echo "HTML_FILES: $(HTML_FILES)" + @echo "HTMLDIR: $(HTMLDIR)" + @echo "DEFAULT_GIF_FILES: $(DEFAULT_GIF_FILES)" + @echo "DEFAULT_HTML_FILES: $(DEFAULT_HTML_FILES)" + # ---------------------------------------------------- # Release Target # ---------------------------------------------------- - - include $(ERL_TOP)/make/otp_release_targets.mk -ifeq ($(DOCTYPE),pdf) -release_docs_spec: pdf - $(INSTALL_DIR) $(RELEASE_PATH)/pdf - $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf -else -ifeq ($(DOCTYPE),ps) -release_docs_spec: ps - $(INSTALL_DIR) $(RELEASE_PATH)/ps - $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps -else release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf $(INSTALL_DIR) $(RELSYSDIR)/doc/html - $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ - $(HTML_EXAMPLE_FILES) $(HTML_STYLESHEET_FILES) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(EXAMPLE_FILES) $(HTML_EXAMPLE_FILES) $(HTML_STYLESHEET_FILES) $(RELSYSDIR)/doc/html $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 - $(INSTALL_DATA) $(EXAMPLE_FILES) $(RELSYSDIR)/doc/html -endif -endif + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 release_spec: + release_tests_spec: -# ---------------------------------------------------- -# Include dependency -# ---------------------------------------------------- --include make.dep diff -Nru erlang-13.b.1-dfsg/lib/xmerl/doc/src/notes.xml erlang-13.b.3-dfsg/lib/xmerl/doc/src/notes.xml --- erlang-13.b.1-dfsg/lib/xmerl/doc/src/notes.xml 2009-06-05 15:09:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/doc/src/notes.xml 2009-11-20 13:35:17.000000000 +0000 @@ -26,10 +26,138 @@ nil nil nil + notes.xml

    This document describes the changes made to the Xmerl application.

    + + +
    Xmerl 1.2.3 + +
    Fixed Bugs and Malfunctions + + +

    + A continuation clause of parse_reference/3 had + it's parameters in wrong order.

    +

    + Own Id: OTP-8251 Aux Id: seq11429

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + A new option to turn off the parsing of an external DTD + is added to xmerl_sax_parser:file/2 and + xmerl_sax_parser:stream/2 + (skip_external_dtd).

    +

    + Own Id: OTP-8252 Aux Id: seq11432

    +
    + +

    + The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

    +

    + Own Id: OTP-8253

    +
    +
    +
    + +
    + +
    Xmerl 1.2.2 + +
    Fixed Bugs and Malfunctions + + +

    + xmerl_sax_parse:stream/2 failed with + {fatal_error,_, "Continuation function undefined, and + more data needed",_,_} when no continuation function + was defined even though it was a complete document as + input.

    +

    + Own Id: OTP-8213

    +
    + +

    + The namespace URI supplied on unprefixed attributes in + startElement tuples is the same as the URI for the + default namespace. According to the standard the + namespace for an unprefixed attribute should always has + no value.

    +

    + Own Id: OTP-8214

    +
    +
    +
    + +
    + +
    Xmerl 1.2.1 + +
    Fixed Bugs and Malfunctions + + +

    + xmerl/include/xmerl.hrl contained internal debug + macros (dbg/2 and DBG/0) which now is moved + to xmerl_internal.hrl. +

    +

    + Own Id: OTP-8084 +

    +
    + +

    + The function xmerl_uri:parse/1 couldn't handle FTP + URIs containing username and password. The default FTP + port constant was also wrong. (Thanks to Steve Vinoski) +

    +

    + Own Id: OTP-8156 +

    +
    +
    +
    + + +
    Improvements and New Features + + +

    + The SAX parser couldn't handle consecutive documents on + the same stream. The return values are now changed so + they return a rest value instead of giving an error about + "erranous information after the end tag". +

    +

    + This means that + the functions file/2 and stream/2 now + returns {ok, EventState, Rest} when the parsing is + correct. The rest can then be used as input to a new call + to xmerl_sax_parse:stream/2. If one know that it's + just one document the rest value in the result tuple can + be matched against <<>> or [] + depending on if the input is in binary form or not. +

    +

    + Own Id: OTP-8153 Aux Id: seq11388 +

    +
    +
    +
    + +
    + +
    Xmerl 1.2
    Improvements and New Features

    @@ -84,7 +212,7 @@

    An empty element with a complexType and simpleContent was - not properly valildated. This error is now corrected.

    + not properly validated. This error is now corrected.

    Own Id: OTP-7736

    @@ -210,14 +338,14 @@

    A Kleene Closure child in a sequence consumed all - following childs. This problem has been fixed.

    + following children. This problem has been fixed.

    Own Id: OTP-7211

    Now validating xhtml1-transitional.dtd. A certain - contentspec with a succeding choice, that didn't match + contentspec with a succeeding choice, that didn't match all content, followed by other child elements caused a failure. This is now corrected.

    @@ -517,7 +645,7 @@

    Fixed bug in xmerl_xpath. Xpath expressions that select - nodes of type text() didn't work, like "contexto/text()", + nodes of type text() didn't work, like "context/text()", "child::text()", "descendant::text()".

    Own Id: OTP-5268 Aux Id: seq9656

    @@ -527,7 +655,7 @@
    -

    There are also release notes for older versions.

    +
    diff -Nru erlang-13.b.1-dfsg/lib/xmerl/doc/src/part_notes.xml erlang-13.b.3-dfsg/lib/xmerl/doc/src/part_notes.xml --- erlang-13.b.1-dfsg/lib/xmerl/doc/src/part_notes.xml 2007-11-26 13:12:19.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/xmerl/doc/src/part_notes.xml 2009-11-20 13:35:17.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + Xmerl Release Notes @@ -28,7 +26,7 @@ >2004-12-15 - part_notes.sgml + part_notes.xml

    The Xmerl application @@ -36,6 +34,6 @@

    There are also release notes for older versions.

    - +
    diff -Nru erlang-13.b.1-dfsg/lib/xmerl/doc/src/part.xml erlang-13.b.3-dfsg/lib/xmerl/doc/src/part.xml --- erlang-13.b.1-dfsg/lib/xmerl/doc/src/part.xml 2007-11-26 13:12:17.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/xmerl/doc/src/part.xml 2009-11-20 13:35:16.000000000 +0000 @@ -1,26 +1,24 @@ - +
    - 2004 - 2007 - Ericsson AB, All Rights Reserved + 20042009 + Ericsson AB. All Rights Reserved. - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - The Initial Developer of the Original Code is Ericsson AB. + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + xmerl User's Guide @@ -28,13 +26,13 @@ 2004-06-02 0.9 - part.sgml + part.xml

    The xmerl application contains modules with support for processing of xml files compliant to XML 1.0.

    - +
    diff -Nru erlang-13.b.1-dfsg/lib/xmerl/doc/src/ref_man.xml erlang-13.b.3-dfsg/lib/xmerl/doc/src/ref_man.xml --- erlang-13.b.1-dfsg/lib/xmerl/doc/src/ref_man.xml 2009-06-05 13:54:45.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/doc/src/ref_man.xml 2009-11-20 13:35:15.000000000 +0000 @@ -1,7 +1,7 @@ - +
    20042009 @@ -32,12 +32,12 @@

    The xmerl application contains modules with support for processing of xml files compliant to XML 1.0.

    - - - - - - - + + + + + + + diff -Nru erlang-13.b.1-dfsg/lib/xmerl/doc/src/xmerl_sax_parser.xml erlang-13.b.3-dfsg/lib/xmerl/doc/src/xmerl_sax_parser.xml --- erlang-13.b.1-dfsg/lib/xmerl/doc/src/xmerl_sax_parser.xml 2009-06-05 15:09:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/doc/src/xmerl_sax_parser.xml 2009-11-20 13:35:30.000000000 +0000 @@ -85,6 +85,10 @@ Encoding = utf8 | {utf16,big} | {utf16,little} | latin1 | list + skip_external_dtd + + Skips the external DTD during parsing. + @@ -294,13 +298,7 @@ unicode_char() - integer representing valid unicode codepoint - - - - unicode_char() - - Integer representing valid unicode codepoint + Integer representing valid unicode codepoint. unicode_binary() @@ -326,8 +324,9 @@ Filename = string() Options = [option()] - Result = {ok, EventState} | -    {Tag, Location, Reason, EndTags, EventState} | + Result = {ok, EventState, Rest} | +    {Tag, Location, Reason, EndTags, EventState} + Rest = unicode_binary() | latin1_binary() Tag = atom() (fatal_error, or user defined tag) Location = {CurrentLocation, EntityName, LineNo} CurrentLocation = string() @@ -347,8 +346,9 @@ Xml = unicode_binary() | latin1_binary() | [unicode_char()] Options = [option()] - Result = {ok, EventState} | -    {Tag, Location, Reason, EndTags, EventState} | + Result = {ok, EventState, Rest} | +    {Tag, Location, Reason, EndTags, EventState} + Rest = unicode_binary() | latin1_binary() | [unicode_char()] Tag = atom() (fatal_error or user defined tag) Location = {CurrentLocation, EntityName, LineNo} CurrentLocation = string() diff -Nru erlang-13.b.1-dfsg/lib/xmerl/doc/src/xmerl_ug.xml erlang-13.b.3-dfsg/lib/xmerl/doc/src/xmerl_ug.xml --- erlang-13.b.1-dfsg/lib/xmerl/doc/src/xmerl_ug.xml 2009-03-12 12:27:02.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/xmerl/doc/src/xmerl_ug.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,490 +0,0 @@ - - - - -
    - - 20042009 - Ericsson AB. All Rights Reserved. - - - The contents of this file are subject to the Erlang Public License, - Version 1.1, (the "License"); you may not use this file except in - compliance with the License. You should have received a copy of the - Erlang Public License along with this software. If not, it can be - retrieved online at http://www.erlang.org/. - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - the License for the specific language governing rights and limitations - under the License. - - - - xmerl - UKH/L Bertil Karlsson - - 2004-06-16 - D - xmerl_ug.sgml -
    - -
    - Introduction - -
    - Features -

    The xmerl XML parser is able to parse XML documents - according to the XML 1.0 standard. As default it performs - well-formed parsing,(syntax checks and checks of well-formed - constraints). Optionally one can also use xmerl as a validating - parser,(validate according to referenced DTD and validating - constraints). By means of for example the xmerl_xs module it is - possible to transform the parsed result to other formats, - e.g. text, HTML, XML etc.

    -
    - -
    - Overview -

    This document does not give an introduction to XML. There - are a lot of books available that describe XML from - different views. At the www.W3.org site you will find - the XML 1.0 specification and other related specs. One site were - you can find tutorials on XML and related specs is ZVON.org.

    -

    However, here you will find some examples of how to use - and to what you can use xmerl. A detailed description of the - user interface can be found in the reference manual.

    -

    There are two known shortcomings in xmerl:

    - - It cannot retrieve external entities on the Internet - by a URL reference, only resources in the local file - system. - xmerl can parse Unicode encoded data. But, it fails - on tag names, attribute names and other mark-up names that - are encoded Unicode characters not mapping on ASCII. - -

    By parsing an XML document you will get a record, - displaying the structure of the document, as return - value. The record also holds the data of the document. xmerl - is convenient to use in for instance the following scenarios:

    -

    You need to retrieve data from XML documents. Your - Erlang software can handle information from the XML document - by extracting data from the data structure received by - parsing.

    -

    It is also possible to do further processing of parsed - XML with xmerl. If you want to change format of the XML - document to for instance HTML, text or other XML format you - can transform it. There is support for such transformations - in xmerl.

    -

    One may also convert arbitrary data to XML. So it for - instance is easy to make it readable by humans. In this case - you first create xmerl data structures out of your data, then - transform it to XML.

    -

    You can find examples of these three examples of usage - below.

    -
    -
    - -
    - xmerl User Interface Data Structure -

    The following records used by xmerl to save the parsed - data are defined in xmerl.hrl

    -

    The result of a successful parsing is a tuple - {DataStructure,M}. M is the XML production Misc, - which is the mark-up that comes after the element of the - document. It is returned "as is". DataStructure is an - xmlElement record, that among others have the fields - name, parents, attributes and - content like:

    -
    -#xmlElement{name=Name,
    -            ...
    -            parents=Parents,
    -            ...
    -            attributes=Attrs,
    -            content=Content,
    -            ...}    
    -

    The name of the element is found in the name - field. In the parents field is the names of the parent - elements saved. Parents is a list of tuples where the first - element in each tuple is the name of the parent element. The - list is in reverse order.

    -

    The record xmlAttribute holds the name and value of - an attribute in the fields name and value. All - attributes of an element is a list of xmlAttribute in the - field attributes of the xmlElement record. -

    -

    The content field of the top element is a list of - records that shows the structure and data of the document. If - it is a simple document like:

    -
    -<?xml version="1.0"?>
    -<dog>
    -Grand Danois
    -</dog>    
    -

    The parse result will be:

    -
    -#xmlElement{name = dog,
    -            ...
    -            parents = [],
    -            ...
    -            attributes = [],
    -            content = [{xmlText,[{dog,1}],1,[],"\
    -Grand Danois\
    -",text}],
    -            ...
    -            }    
    -

    Where the content of the top element is: - [{xmlText,[{dog,1}],1,[],"\ Grand Danois\ ",text}]. Text will be returned in xmlText records. Though, - usually documents are more complex, and the content of the top - element will in that case be a nested structure with - xmlElement records that in turn may have complex content. All of - this reflects the structure of the XML document.

    -

    Space characters between mark-up as space, - tab and line feed are normalized and returned as - xmlText records.

    - -
    - Errors -

    An unsuccessful parse results in an error, which may be a - tuple {error,Reason} or an exit: - {'EXIT',Reason}. According to the XML 1.0 standard - there are fatal error and error situations. The - fatal errors must be detected by a conforming parser - while an error may be detected. Both categories of - errors are reported as fatal errors by this version of xmerl, - most often as an exit.

    -
    -
    - -
    - Getting Started -

    In the following examples we use the XML file - "motorcycles.xml" and the corresponding DTD - "motorcycles.dtd". motorcycles.xml looks like: - -

    - -

    and motorcycles.dtd looks like:

    - -

    If you want to parse the XML file motorcycles.xml you run - it in the Erlang shell like:

    -
    -3> {ParsResult,Misc}=xmerl_scan:file("motorcycles.xml"). 
    -{{xmlElement,motorcycles,
    -             motorcycles,
    -             [],
    -             {xmlNamespace,[],[]},
    -             [],
    -             1,
    -             [],
    -             [{xmlText,[{motorcycles,1}],1,[],"\
    -  ",text},
    -              {xmlElement,bike,
    -                          bike,
    -                          [],
    -                          {xmlNamespace,[],[]},
    -                          [{motorcycles,1}],
    -                          2,
    -                          [{xmlAttribute,year,[],[],[],[]|...},
    -                           {xmlAttribute,color,[],[],[]|...}],
    -                          [{xmlText,[{bike,2},{motorcycles|...}],
    -                                    1,
    -                                    []|...},
    -                           {xmlElement,name,name,[]|...},
    -                           {xmlText,[{...}|...],3|...},
    -                           {xmlElement,engine|...},
    -                           {xmlText|...},
    -                           {...}|...],
    -                          [],
    -                          ".",
    -                          undeclared},
    -              ...
    -              ],
    -             [],
    -             ".",
    -             undeclared},
    - []}
    -4>     
    -

    If you instead receives the XML doc as a string you can - parse it by xmerl_scan:string/1. Both file/2 and string/2 - exists where the second argument is a list of options to the - parser, see the reference manual.

    -
    - -
    - Example: Extracting Data From XML Content -

    In this example consider the situation where you want to - examine a particular data in the XML file. For instance, you - want to check for how long each motorcycle have been recorded.

    -

    Take a look at the DTD and observe that the structure of an - XML document that is conformant to this DTD must have one - motorcycles element (the root element). The motorcycles element - must have at least one bike element. After each bike element it - may be a date element. The content of the date element is - #PCDATA (Parsed Character DATA), i.e. raw text. Observe that if - #PCDATA must have a or a character it must - be written as and - respectively. Also other character entities exists similar to - the ones in HTML and SGML.

    -

    If you successfully parse the XML file with the validation - on as in: - xmerl_scan:file('motorcycles.xml',[{validation,true}]) - you know that the XML document is valid and has the structure - according to the DTD.

    -

    Thus, knowing the allowed structure it is easy to write a - program that traverses the data structure and picks the - information in the xmlElements records with name date.

    -

    Observe that white space: each space, tab or line feed, - between mark-up results in an xmlText record.

    -

    -
    - -
    - Example: Create XML Out Of Arbitrary Data -

    For this task there are more than one way to go. The "brute - force" method is to create the records you need and feed your - data in the content and attribute fields of the appropriate - element.

    -

    There is support for this in xmerl by the "simple-form" - format. You can put your data in a simple-form data structure - and feed it into - xmerl:export_simple(Content,Callback,RootAttributes). Content - may be a mixture of simple-form and xmerl records as xmlElement - and xmlText.

    -

    The Types are:

    - - Content = [Element] - Callback = atom() - RootAttributes = [Attributes] - -

    Element is any of:

    - - {Tag, Attributes, Content} - {Tag, Content} - Tag - IOString - #xmlText{} - #xmlElement{} - #xmlPI{} - #xmlComment{} - #xmlDecl{} - -

    The simple-form structure is any of {Tag, Attributes, Content}, {Tag, Content} or Tag where:

    -

    - - Tag = atom() - Attributes = [{Name, Value}| #xmlAttribute{}] - Name = atom() - Value = IOString | atom() | integer() - -

    See also reference manual for - xmerl

    -

    If you want to add the information about a black Harley - Davidsson 1200 cc Sportster motorcycle from 2003 that is in - shape as new in the motorcycles.xml document you can put the - data in a simple-form data structure like:

    -
    -Data =
    -  {bike,
    -     [{year,"2003"},{color,"black"},{condition,"new"}],
    -     [{name,
    -         [{manufacturer,["Harley Davidsson"]},
    -          {brandName,["XL1200C"]},
    -          {additionalName,["Sportster"]}]},
    -      {engine,
    -         ["V-engine, 2-cylinders, 1200 cc"]},
    -      {kind,["custom"]},
    -      {drive,["belt"]}]}    
    -

    In order to append this data to the end of the - motorcycles.xml document you have to parse the file and add Data - to the end of the root element content.

    -
    -    {RootEl,Misc}=xmerl_scan:file('motorcycles.xml'),
    -    #xmlElement{content=Content} = RootEl,
    -    NewContent=Content++lists:flatten([Data]),
    -    NewRootEl=RootEl#xmlElement{content=NewContent},    
    -

    Then you can run it through the export_simple/2 function:

    -
    -    {ok,IOF}=file:open('new_motorcycles.xml',[write]),
    -    Export=xmerl:export_simple([NewRootEl],xmerl_xml),
    -    io:format(IOF,"~s~n",[lists:flatten(Export)]),    
    - -

    The result would be:

    - -

    If it is important to get similar indentation and newlines - as in the original document you have to add #xmlText{} records - with space and newline values in appropriate places. It may also - be necessary to keep the original prolog where the DTD is - referenced. If so, it is possible to pass a RootAttribute - {prolog,Value} to export_simple/3. The following - example code fixes those changes in the previous example:

    -
    -    Data =
    -      [#xmlText{value="  "},
    -       {bike,[{year,"2003"},{color,"black"},{condition,"new"}],
    -             [#xmlText{value="\
    -    "},
    -              {name,[#xmlText{value="\
    -      "},
    -                     {manufacturer,["Harley Davidsson"]},
    -                     #xmlText{value="\
    -      "},
    -                     {brandName,["XL1200C"]},
    -                     #xmlText{value="\
    -      "},
    -                     {additionalName,["Sportster"]},
    -                     #xmlText{value="\
    -    "}]},
    -              {engine,["V-engine, 2-cylinders, 1200 cc"]},
    -              #xmlText{value="\
    -    "},
    -              {kind,["custom"]},
    -              #xmlText{value="\
    -    "},
    -              {drive,["belt"]},
    -              #xmlText{value="\
    -  "}]},
    -       #xmlText{value="\
    -"}],
    -    ...
    -    NewContent=Content++lists:flatten([Data]),
    -    NewRootEl=RootEl#xmlElement{content=NewContent},
    -    ...
    -    Prolog = ["<?xml version=\\"1.0\\" encoding=\\"utf-8\\" ?>
    -<!DOCTYPE motorcycles SYSTEM \\"motorcycles.dtd\\">\
    -"],
    -    Export=xmerl:export_simple([NewRootEl],xmerl_xml,[{prolog,Prolog}]),
    -    ...    
    -

    The result will be:

    - -
    - -
    - Example: Transforming XML To HTML -

    Assume that you want to transform the motorcycles.xml document to - HTML. If you want the same structure and tags of the resulting - HTML document as of the XML document then you can use the - xmerl:export/2 function. The following:

    -
    -2> {Doc,Misc}=xmerl_scan:file('motorcycles.xml').
    -{{xmlElement,motorcycles,
    -             motorcycles,
    -             [],
    -             {xmlNamespace,[],[]},
    -             [],
    -             1,
    -             [],
    -             [{xmlText,[{motorcycles,1}],1,[],"\
    -  ",text},
    -              {xmlElement,bike,
    -...
    -3> DocHtml=xmerl:export([Doc],xmerl_html).
    -["<!DOCTYPE HTML PUBLIC \\"",
    - "-//W3C//DTD HTML 4.01 Transitional//EN",
    - "\\"",
    - [],
    - ">\
    -",
    - [[["<","motorcycles",">"],
    -   ["\
    -  ",
    -    [["<",
    -      "bike",
    -      [[" ","year","=\\"","2000","\\""],[" ","color","=\\"","black","\\""]],
    -      ">"],
    -...    
    -

    Will give the result result_export.html

    -

    Perhaps you want to do something more arranged for human - reading. Suppose that you want to list all different brands in - the beginning with links to each group of motorcycles. You also - want all motorcycles sorted by brand, then some flashy colors - on top of it. Thus you rearrange the order of the elements and - put in arbitrary HTML tags. This is possible to do by means of - the XSL Transformation (XSLT) like functionality in xmerl.

    -

    Even though the following example shows one way to transform data - from XML to HTML it also applies to transformations to other - formats.

    -

    xmerl_xs does not implement the entire XSLT - specification but the basic functionality. For all details see - the reference manual

    -

    First, some words about the xmerl_xs functionality:

    -

    You need to wright template functions to be able to control - what kind of output you want. Thus if you want to encapsulate a - bike element in <p> tags you simply wright a - function:

    -
    -template(E = #xmlElement{name='bike'}) ->
    -    ["<p>",xslapply(fun template/1,E),"</p>"];    
    -

    With xslapply you tell the XSLT processor in which - order it should traverse the XML structure. By default it goes - in preorder traversal, but with the following we make a - deliberate choice to break that order:

    -
    -template(E = #xmlElement{name='bike'}) ->
    -    ["<p>",xslapply(fun template/1,select("bike/name/manufacturer")),"</p>"];    
    -

    If you want to output the content of an XML element or an attribute you will get the value as a string by the value_of function:

    -
    -template(E = #xmlElement{name='motorcycles'}) ->
    -    ["<p>",value_of(select("bike/name/manufacturer",E),"</p>"];    
    -

    In the xmerl_xs functions you can provide a select(String) - call, which is an XPath - functionality. For more details see the xmerl_xs tutorial.

    -

    Now, back to the example where we wanted to make the output - more arranged. With the template:

    -
    -template(E = #xmlElement{name='motorcycles'}) ->
    -    [    "<head>\
    -<title>motorcycles</title>\
    -</head>\
    -",
    -         "<body>\
    -",
    -\011 "<h1>Used Motorcycles</h1>\
    -",
    -\011 "<ul>\
    -",
    -\011 remove_duplicates(value_of(select("bike/name/manufacturer",E))),
    -\011 "\
    -</ul>\
    -",
    -\011 sort_by_manufacturer(xslapply(fun template/1, E)),
    -         "</body>\
    -",
    -\011 "</html>\
    -"];    
    -

    We match on the top element and embed the inner parts in an - HTML body. Then we extract the string values of all motorcycle - brands, sort them and removes duplicates by - remove_duplicates(value_of(select("bike/name/manufacturer", E))). We also process the substructure of the top element - and pass it to a function that sorts all motorcycle information - by brand according to the task formulation in the beginning of - this example.

    -

    The next template matches on the bike element:

    -
    -template(E = #xmlElement{name='bike'}) ->
    -    {value_of(select("name/manufacturer",E)),["<dt>",xslapply(fun template/1,select("name",E)),"</dt>",
    -    "<dd><ul>\
    -",
    -    "<li style="color:green">Manufacturing year: ",xslapply(fun template/1,select("@year",E)),"</li>\
    -",
    -    "<li style="color:red">Color: ",xslapply(fun template/1,select("@color",E)),"</li>\
    -",
    -    "<li style="color:blue">Shape : ",xslapply(fun template/1,select("@condition",E)),"</li>\
    -",
    -    "</ul></dd>\
    -"]};    
    -

    This creates a tuple with the brand of the motorcycle and - the output format. We use the brand name only for sorting - purpose. We have to end the template function with the "built - in clause" template(E) -> built_in_rules(fun template/1, E).

    -

    The entire program is motorcycles2html.erl:

    - -

    If we run it like this: - motorcycles2html:process_to_file('result_xs.html', 'motorcycles2.xml'). The result will be result_xs.html. When the - input file is of the same structure as the previous - "motorcycles" XML files but it has a little more 'bike' - elements and the 'manufacturer' elements are not in order.

    -
    -
    - diff -Nru erlang-13.b.1-dfsg/lib/xmerl/doc/src/xmerl_ug.xmlsrc erlang-13.b.3-dfsg/lib/xmerl/doc/src/xmerl_ug.xmlsrc --- erlang-13.b.1-dfsg/lib/xmerl/doc/src/xmerl_ug.xmlsrc 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/doc/src/xmerl_ug.xmlsrc 2009-11-20 13:35:16.000000000 +0000 @@ -0,0 +1,490 @@ + + + + +
    + + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + xmerl + UKH/L Bertil Karlsson + + 2004-06-16 + D + xmerl_ug.xml +
    + +
    + Introduction + +
    + Features +

    The xmerl XML parser is able to parse XML documents + according to the XML 1.0 standard. As default it performs + well-formed parsing,(syntax checks and checks of well-formed + constraints). Optionally one can also use xmerl as a validating + parser,(validate according to referenced DTD and validating + constraints). By means of for example the xmerl_xs module it is + possible to transform the parsed result to other formats, + e.g. text, HTML, XML etc.

    +
    + +
    + Overview +

    This document does not give an introduction to XML. There + are a lot of books available that describe XML from + different views. At the www.W3.org site you will find + the XML 1.0 specification and other related specs. One site were + you can find tutorials on XML and related specs is ZVON.org.

    +

    However, here you will find some examples of how to use + and to what you can use xmerl. A detailed description of the + user interface can be found in the reference manual.

    +

    There are two known shortcomings in xmerl:

    + + It cannot retrieve external entities on the Internet + by a URL reference, only resources in the local file + system. + xmerl can parse Unicode encoded data. But, it fails + on tag names, attribute names and other mark-up names that + are encoded Unicode characters not mapping on ASCII. + +

    By parsing an XML document you will get a record, + displaying the structure of the document, as return + value. The record also holds the data of the document. xmerl + is convenient to use in for instance the following scenarios:

    +

    You need to retrieve data from XML documents. Your + Erlang software can handle information from the XML document + by extracting data from the data structure received by + parsing.

    +

    It is also possible to do further processing of parsed + XML with xmerl. If you want to change format of the XML + document to for instance HTML, text or other XML format you + can transform it. There is support for such transformations + in xmerl.

    +

    One may also convert arbitrary data to XML. So it for + instance is easy to make it readable by humans. In this case + you first create xmerl data structures out of your data, then + transform it to XML.

    +

    You can find examples of these three examples of usage + below.

    +
    +
    + +
    + xmerl User Interface Data Structure +

    The following records used by xmerl to save the parsed + data are defined in xmerl.hrl

    +

    The result of a successful parsing is a tuple + {DataStructure,M}. M is the XML production Misc, + which is the mark-up that comes after the element of the + document. It is returned "as is". DataStructure is an + xmlElement record, that among others have the fields + name, parents, attributes and + content like:

    +
    +#xmlElement{name=Name,
    +            ...
    +            parents=Parents,
    +            ...
    +            attributes=Attrs,
    +            content=Content,
    +            ...}    
    +

    The name of the element is found in the name + field. In the parents field is the names of the parent + elements saved. Parents is a list of tuples where the first + element in each tuple is the name of the parent element. The + list is in reverse order.

    +

    The record xmlAttribute holds the name and value of + an attribute in the fields name and value. All + attributes of an element is a list of xmlAttribute in the + field attributes of the xmlElement record. +

    +

    The content field of the top element is a list of + records that shows the structure and data of the document. If + it is a simple document like:

    +
    +<?xml version="1.0"?>
    +<dog>
    +Grand Danois
    +</dog>    
    +

    The parse result will be:

    +
    +#xmlElement{name = dog,
    +            ...
    +            parents = [],
    +            ...
    +            attributes = [],
    +            content = [{xmlText,[{dog,1}],1,[],"\
    +Grand Danois\
    +",text}],
    +            ...
    +            }    
    +

    Where the content of the top element is: + [{xmlText,[{dog,1}],1,[],"\ Grand Danois\ ",text}]. Text will be returned in xmlText records. Though, + usually documents are more complex, and the content of the top + element will in that case be a nested structure with + xmlElement records that in turn may have complex content. All of + this reflects the structure of the XML document.

    +

    Space characters between mark-up as space, + tab and line feed are normalized and returned as + xmlText records.

    + +
    + Errors +

    An unsuccessful parse results in an error, which may be a + tuple {error,Reason} or an exit: + {'EXIT',Reason}. According to the XML 1.0 standard + there are fatal error and error situations. The + fatal errors must be detected by a conforming parser + while an error may be detected. Both categories of + errors are reported as fatal errors by this version of xmerl, + most often as an exit.

    +
    +
    + +
    + Getting Started +

    In the following examples we use the XML file + "motorcycles.xml" and the corresponding DTD + "motorcycles.dtd". motorcycles.xml looks like: + +

    + +

    and motorcycles.dtd looks like:

    + +

    If you want to parse the XML file motorcycles.xml you run + it in the Erlang shell like:

    +
    +3> {ParsResult,Misc}=xmerl_scan:file("motorcycles.xml"). 
    +{{xmlElement,motorcycles,
    +             motorcycles,
    +             [],
    +             {xmlNamespace,[],[]},
    +             [],
    +             1,
    +             [],
    +             [{xmlText,[{motorcycles,1}],1,[],"\
    +  ",text},
    +              {xmlElement,bike,
    +                          bike,
    +                          [],
    +                          {xmlNamespace,[],[]},
    +                          [{motorcycles,1}],
    +                          2,
    +                          [{xmlAttribute,year,[],[],[],[]|...},
    +                           {xmlAttribute,color,[],[],[]|...}],
    +                          [{xmlText,[{bike,2},{motorcycles|...}],
    +                                    1,
    +                                    []|...},
    +                           {xmlElement,name,name,[]|...},
    +                           {xmlText,[{...}|...],3|...},
    +                           {xmlElement,engine|...},
    +                           {xmlText|...},
    +                           {...}|...],
    +                          [],
    +                          ".",
    +                          undeclared},
    +              ...
    +              ],
    +             [],
    +             ".",
    +             undeclared},
    + []}
    +4>     
    +

    If you instead receives the XML doc as a string you can + parse it by xmerl_scan:string/1. Both file/2 and string/2 + exists where the second argument is a list of options to the + parser, see the reference manual.

    +
    + +
    + Example: Extracting Data From XML Content +

    In this example consider the situation where you want to + examine a particular data in the XML file. For instance, you + want to check for how long each motorcycle have been recorded.

    +

    Take a look at the DTD and observe that the structure of an + XML document that is conformant to this DTD must have one + motorcycles element (the root element). The motorcycles element + must have at least one bike element. After each bike element it + may be a date element. The content of the date element is + #PCDATA (Parsed Character DATA), i.e. raw text. Observe that if + #PCDATA must have a or a character it must + be written as and + respectively. Also other character entities exists similar to + the ones in HTML and SGML.

    +

    If you successfully parse the XML file with the validation + on as in: + xmerl_scan:file('motorcycles.xml',[{validation,true}]) + you know that the XML document is valid and has the structure + according to the DTD.

    +

    Thus, knowing the allowed structure it is easy to write a + program that traverses the data structure and picks the + information in the xmlElements records with name date.

    +

    Observe that white space: each space, tab or line feed, + between mark-up results in an xmlText record.

    +

    +
    + +
    + Example: Create XML Out Of Arbitrary Data +

    For this task there are more than one way to go. The "brute + force" method is to create the records you need and feed your + data in the content and attribute fields of the appropriate + element.

    +

    There is support for this in xmerl by the "simple-form" + format. You can put your data in a simple-form data structure + and feed it into + xmerl:export_simple(Content,Callback,RootAttributes). Content + may be a mixture of simple-form and xmerl records as xmlElement + and xmlText.

    +

    The Types are:

    + + Content = [Element] + Callback = atom() + RootAttributes = [Attributes] + +

    Element is any of:

    + + {Tag, Attributes, Content} + {Tag, Content} + Tag + IOString + #xmlText{} + #xmlElement{} + #xmlPI{} + #xmlComment{} + #xmlDecl{} + +

    The simple-form structure is any of {Tag, Attributes, Content}, {Tag, Content} or Tag where:

    +

    + + Tag = atom() + Attributes = [{Name, Value}| #xmlAttribute{}] + Name = atom() + Value = IOString | atom() | integer() + +

    See also reference manual for + xmerl

    +

    If you want to add the information about a black Harley + Davidsson 1200 cc Sportster motorcycle from 2003 that is in + shape as new in the motorcycles.xml document you can put the + data in a simple-form data structure like:

    +
    +Data =
    +  {bike,
    +     [{year,"2003"},{color,"black"},{condition,"new"}],
    +     [{name,
    +         [{manufacturer,["Harley Davidsson"]},
    +          {brandName,["XL1200C"]},
    +          {additionalName,["Sportster"]}]},
    +      {engine,
    +         ["V-engine, 2-cylinders, 1200 cc"]},
    +      {kind,["custom"]},
    +      {drive,["belt"]}]}    
    +

    In order to append this data to the end of the + motorcycles.xml document you have to parse the file and add Data + to the end of the root element content.

    +
    +    {RootEl,Misc}=xmerl_scan:file('motorcycles.xml'),
    +    #xmlElement{content=Content} = RootEl,
    +    NewContent=Content++lists:flatten([Data]),
    +    NewRootEl=RootEl#xmlElement{content=NewContent},    
    +

    Then you can run it through the export_simple/2 function:

    +
    +    {ok,IOF}=file:open('new_motorcycles.xml',[write]),
    +    Export=xmerl:export_simple([NewRootEl],xmerl_xml),
    +    io:format(IOF,"~s~n",[lists:flatten(Export)]),    
    + +

    The result would be:

    + +

    If it is important to get similar indentation and newlines + as in the original document you have to add #xmlText{} records + with space and newline values in appropriate places. It may also + be necessary to keep the original prolog where the DTD is + referenced. If so, it is possible to pass a RootAttribute + {prolog,Value} to export_simple/3. The following + example code fixes those changes in the previous example:

    +
    +    Data =
    +      [#xmlText{value="  "},
    +       {bike,[{year,"2003"},{color,"black"},{condition,"new"}],
    +             [#xmlText{value="\
    +    "},
    +              {name,[#xmlText{value="\
    +      "},
    +                     {manufacturer,["Harley Davidsson"]},
    +                     #xmlText{value="\
    +      "},
    +                     {brandName,["XL1200C"]},
    +                     #xmlText{value="\
    +      "},
    +                     {additionalName,["Sportster"]},
    +                     #xmlText{value="\
    +    "}]},
    +              {engine,["V-engine, 2-cylinders, 1200 cc"]},
    +              #xmlText{value="\
    +    "},
    +              {kind,["custom"]},
    +              #xmlText{value="\
    +    "},
    +              {drive,["belt"]},
    +              #xmlText{value="\
    +  "}]},
    +       #xmlText{value="\
    +"}],
    +    ...
    +    NewContent=Content++lists:flatten([Data]),
    +    NewRootEl=RootEl#xmlElement{content=NewContent},
    +    ...
    +    Prolog = ["<?xml version=\\"1.0\\" encoding=\\"utf-8\\" ?>
    +<!DOCTYPE motorcycles SYSTEM \\"motorcycles.dtd\\">\
    +"],
    +    Export=xmerl:export_simple([NewRootEl],xmerl_xml,[{prolog,Prolog}]),
    +    ...    
    +

    The result will be:

    + +
    + +
    + Example: Transforming XML To HTML +

    Assume that you want to transform the motorcycles.xml document to + HTML. If you want the same structure and tags of the resulting + HTML document as of the XML document then you can use the + xmerl:export/2 function. The following:

    +
    +2> {Doc,Misc}=xmerl_scan:file('motorcycles.xml').
    +{{xmlElement,motorcycles,
    +             motorcycles,
    +             [],
    +             {xmlNamespace,[],[]},
    +             [],
    +             1,
    +             [],
    +             [{xmlText,[{motorcycles,1}],1,[],"\
    +  ",text},
    +              {xmlElement,bike,
    +...
    +3> DocHtml=xmerl:export([Doc],xmerl_html).
    +["<!DOCTYPE HTML PUBLIC \\"",
    + "-//W3C//DTD HTML 4.01 Transitional//EN",
    + "\\"",
    + [],
    + ">\
    +",
    + [[["<","motorcycles",">"],
    +   ["\
    +  ",
    +    [["<",
    +      "bike",
    +      [[" ","year","=\\"","2000","\\""],[" ","color","=\\"","black","\\""]],
    +      ">"],
    +...    
    +

    Will give the result result_export.html

    +

    Perhaps you want to do something more arranged for human + reading. Suppose that you want to list all different brands in + the beginning with links to each group of motorcycles. You also + want all motorcycles sorted by brand, then some flashy colors + on top of it. Thus you rearrange the order of the elements and + put in arbitrary HTML tags. This is possible to do by means of + the XSL Transformation (XSLT) like functionality in xmerl.

    +

    Even though the following example shows one way to transform data + from XML to HTML it also applies to transformations to other + formats.

    +

    xmerl_xs does not implement the entire XSLT + specification but the basic functionality. For all details see + the reference manual

    +

    First, some words about the xmerl_xs functionality:

    +

    You need to wright template functions to be able to control + what kind of output you want. Thus if you want to encapsulate a + bike element in <p> tags you simply wright a + function:

    +
    +template(E = #xmlElement{name='bike'}) ->
    +    ["<p>",xslapply(fun template/1,E),"</p>"];    
    +

    With xslapply you tell the XSLT processor in which + order it should traverse the XML structure. By default it goes + in preorder traversal, but with the following we make a + deliberate choice to break that order:

    +
    +template(E = #xmlElement{name='bike'}) ->
    +    ["<p>",xslapply(fun template/1,select("bike/name/manufacturer")),"</p>"];    
    +

    If you want to output the content of an XML element or an attribute you will get the value as a string by the value_of function:

    +
    +template(E = #xmlElement{name='motorcycles'}) ->
    +    ["<p>",value_of(select("bike/name/manufacturer",E),"</p>"];    
    +

    In the xmerl_xs functions you can provide a select(String) + call, which is an XPath + functionality. For more details see the xmerl_xs tutorial.

    +

    Now, back to the example where we wanted to make the output + more arranged. With the template:

    +
    +template(E = #xmlElement{name='motorcycles'}) ->
    +    [    "<head>\
    +<title>motorcycles</title>\
    +</head>\
    +",
    +         "<body>\
    +",
    +\011 "<h1>Used Motorcycles</h1>\
    +",
    +\011 "<ul>\
    +",
    +\011 remove_duplicates(value_of(select("bike/name/manufacturer",E))),
    +\011 "\
    +</ul>\
    +",
    +\011 sort_by_manufacturer(xslapply(fun template/1, E)),
    +         "</body>\
    +",
    +\011 "</html>\
    +"];    
    +

    We match on the top element and embed the inner parts in an + HTML body. Then we extract the string values of all motorcycle + brands, sort them and removes duplicates by + remove_duplicates(value_of(select("bike/name/manufacturer", E))). We also process the substructure of the top element + and pass it to a function that sorts all motorcycle information + by brand according to the task formulation in the beginning of + this example.

    +

    The next template matches on the bike element:

    +
    +template(E = #xmlElement{name='bike'}) ->
    +    {value_of(select("name/manufacturer",E)),["<dt>",xslapply(fun template/1,select("name",E)),"</dt>",
    +    "<dd><ul>\
    +",
    +    "<li style="color:green">Manufacturing year: ",xslapply(fun template/1,select("@year",E)),"</li>\
    +",
    +    "<li style="color:red">Color: ",xslapply(fun template/1,select("@color",E)),"</li>\
    +",
    +    "<li style="color:blue">Shape : ",xslapply(fun template/1,select("@condition",E)),"</li>\
    +",
    +    "</ul></dd>\
    +"]};    
    +

    This creates a tuple with the brand of the motorcycle and + the output format. We use the brand name only for sorting + purpose. We have to end the template function with the "built + in clause" template(E) -> built_in_rules(fun template/1, E).

    +

    The entire program is motorcycles2html.erl:

    + +

    If we run it like this: + motorcycles2html:process_to_file('result_xs.html', 'motorcycles2.xml'). The result will be result_xs.html. When the + input file is of the same structure as the previous + "motorcycles" XML files but it has a little more 'bike' + elements and the 'manufacturer' elements are not in order.

    +
    +
    + diff -Nru erlang-13.b.1-dfsg/lib/xmerl/include/xmerl.hrl erlang-13.b.3-dfsg/lib/xmerl/include/xmerl.hrl --- erlang-13.b.1-dfsg/lib/xmerl/include/xmerl.hrl 2009-03-12 12:27:04.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/xmerl/include/xmerl.hrl 2009-09-18 15:11:48.000000000 +0100 @@ -1,30 +1,32 @@ -%%% The contents of this file are subject to the Erlang Public License, -%%% Version 1.0, (the "License"); you may not use this file except in -%%% compliance with the License. You may obtain a copy of the License at -%%% http://www.erlang.org/license/EPL1_0.txt -%%% -%%% Software distributed under the License is distributed on an "AS IS" -%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See -%%% the License for the specific language governing rights and limitations -%%% under the License. -%%% -%%% The Original Code is xmerl-0.13 -%%% -%%% The Initial Developer of the Original Code is Ericsson Telecom -%%% AB. Portions created by Ericsson are Copyright (C), 1998, Ericsson -%%% Telecom AB. All Rights Reserved. -%%% -%%% Contributor(s): -%%% : suggested #xmlDocument{} -%%% -%%%---------------------------------------------------------------------- -%%% #0. BASIC INFORMATION -%%%---------------------------------------------------------------------- -%%% File: xmerl.hrl -%%% Author : Ulf Wiger -%%% Date : 00-09-22 -%%% Description : Record and macro definitions for xmerl -%%%---------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% Contributor(s): +%% : suggested #xmlDocument{} +%% +%%---------------------------------------------------------------------- +%% #0. BASIC INFORMATION +%%---------------------------------------------------------------------- +%% File: xmerl.hrl +%% Author : Ulf Wiger +%% Date : 00-09-22 +%% Description : Record and macro definitions for xmerl +%%---------------------------------------------------------------------- @@ -200,21 +202,11 @@ %% useful scanner macros %% --------------------- -% -define(debug,1). - --ifdef(debug). --define(dbg(Fmt, Args), ok=io:format("~p: " ++ Fmt, [?LINE|Args])). --define(DBG, ok=io:format("<<~p:~p>>~n", [?MODULE, ?LINE])). --else. --define(dbg(Fmt, Args), no_debug). --define(DBG, no_debug). --endif. -define(space, 32). -define(cr, 13). -define(lf, 10). -define(tab, 9). - %% whitespace consists of 'space', 'carriage return', 'line feed' or 'tab' -define(whitespace(H), H==?space ; H==?cr ; H==?lf ; H==?tab). diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/Makefile erlang-13.b.3-dfsg/lib/xmerl/src/Makefile --- erlang-13.b.1-dfsg/lib/xmerl/src/Makefile 2009-06-05 13:54:41.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/src/Makefile 2009-09-18 15:11:42.000000000 +0100 @@ -92,10 +92,18 @@ -HRL_FILES = ../include/xmerl.hrl ../include/xmerl_xlink.hrl ../include/xmerl_xpath.hrl ../include/xmerl_xsd.hrl +HRL_FILES = \ + ../include/xmerl.hrl \ + ../include/xmerl_xlink.hrl \ + ../include/xmerl_xpath.hrl \ + ../include/xmerl_xsd.hrl + INCLUDE_DIR = ../include -INTERNAL_HRL_FILES = +INTERNAL_HRL_FILES = \ + xmerl_internal.hrl \ + xmerl_sax_old_dom.hrl \ + xmerl_sax_parser.hrl ERL_FILES= $(MODULES:%=%.erl) @@ -210,7 +218,7 @@ $(INSTALL_DIR) $(RELSYSDIR)/ebin $(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)/ebin $(INSTALL_DIR) $(RELSYSDIR)/src - $(INSTALL_DATA) $(ERL_FILES) $(APP_SRC) $(APPUP_SRC) $(RELSYSDIR)/src + $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) $(APP_SRC) $(APPUP_SRC) $(RELSYSDIR)/src $(INSTALL_DATA) xmerl_xpath_parse.yrl $(RELSYSDIR)/src $(INSTALL_DATA) xmerl_b64Bin.yrl $(RELSYSDIR)/src $(INSTALL_DIR) $(RELSYSDIR)/include diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/xmerl.erl erlang-13.b.3-dfsg/lib/xmerl/src/xmerl.erl --- erlang-13.b.1-dfsg/lib/xmerl/src/xmerl.erl 2009-06-05 13:54:42.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/src/xmerl.erl 2009-11-20 13:35:13.000000000 +0000 @@ -45,8 +45,8 @@ %% @spec export(Content, Callback) -> ExportedFormat %% @equiv export(Data, Callback, []) -export(Data, Callback) -> - export(Data, Callback, []). +export(Content, Callback) -> + export(Content, Callback, []). %% @spec export(Content, Callback, RootAttributes) -> ExportedFormat %% Content = [Element] @@ -99,16 +99,16 @@ %% @see export/2 %% @see export_simple/3 -export(Data, Callback, RootAttrs) when is_atom(Callback) -> - export1(Data, callbacks(Callback), RootAttrs); -export(Data, Callbacks, RootAttrs) when is_list(Callbacks) -> - export1(Data, Callbacks, RootAttrs). +export(Content, Callback, RootAttributes) when is_atom(Callback) -> + export1(Content, callbacks(Callback), RootAttributes); +export(Content, Callbacks, RootAttrs) when is_list(Callbacks) -> + export1(Content, Callbacks, RootAttrs). %% @spec export_simple(Content, Callback) -> ExportedFormat -%% @equiv export_simple(Data, Callback, []) +%% @equiv export_simple(Content, Callback, []) -export_simple(Data, Callback) -> - export_simple(Data, Callback, []). +export_simple(Content, Callback) -> + export_simple(Content, Callback, []). %% @spec export_simple(Content, Callback, RootAttributes) -> ExportedFormat %% Content = [Element] @@ -152,18 +152,18 @@ %% @see export/3 %% @see export_simple/2 -export_simple(Data, Callback, RootAttrs) when is_atom(Callback) -> - export_simple1(Data, callbacks(Callback), RootAttrs); -export_simple(Data, Callbacks, RootAttrs) when is_list(Callbacks) -> - export_simple1(Data, Callbacks, RootAttrs). +export_simple(Content, Callback, RootAttrs) when is_atom(Callback) -> + export_simple1(Content, callbacks(Callback), RootAttrs); +export_simple(Content, Callbacks, RootAttrs) when is_list(Callbacks) -> + export_simple1(Content, Callbacks, RootAttrs). -export_simple1(Data, Callback, RootAttrs) -> - export1(xmerl_lib:expand_content(Data), Callback, RootAttrs). +export_simple1(Content, Callback, RootAttrs) -> + export1(xmerl_lib:expand_content(Content), Callback, RootAttrs). %% This exports proper XML content in root context. -export1(Data, Callbacks, RootAttrs) when is_list(Data) -> - Result = export_content(Data, Callbacks), +export1(Content, Callbacks, RootAttrs) when is_list(Content) -> + Result = export_content(Content, Callbacks), Attrs = xmerl_lib:expand_attributes(RootAttrs, 1, [{'#root#',1}]), Root = #xmlElement{name = '#root#', pos = 1, @@ -174,37 +174,37 @@ %% @doc Exports simple XML content directly, without further context. -export_simple_content(Data, Callback) when is_atom(Callback) -> - export_content(xmerl_lib:expand_content(Data), +export_simple_content(Content, Callback) when is_atom(Callback) -> + export_content(xmerl_lib:expand_content(Content), callbacks(Callback)); -export_simple_content(Data, Callbacks) when is_list(Callbacks) -> - export_content(xmerl_lib:expand_content(Data), Callbacks). +export_simple_content(Content, Callbacks) when is_list(Callbacks) -> + export_content(xmerl_lib:expand_content(Content), Callbacks). %% @spec export_content(Content, Callbacks) -> term() %% Content = [Element] %% Callback = [atom()] %% @doc Exports normal XML content directly, without further context. -export_content([#xmlText{value = Text} | Es], CBs) -> - [apply_text_cb(CBs, Text) | export_content(Es, CBs)]; -export_content([#xmlPI{} | Es], CBs) -> - export_content(Es, CBs); -export_content([#xmlComment{} | Es], CBs) -> - export_content(Es, CBs); -export_content([#xmlDecl{} | Es], CBs) -> - export_content(Es, CBs); -export_content([E | Es], CBs) -> - [export_element(E, CBs) | export_content(Es, CBs)]; -export_content([], _CBs) -> +export_content([#xmlText{value = Text} | Es], Callbacks) -> + [apply_text_cb(Callbacks, Text) | export_content(Es, Callbacks)]; +export_content([#xmlPI{} | Es], Callbacks) -> + export_content(Es, Callbacks); +export_content([#xmlComment{} | Es], Callbacks) -> + export_content(Es, Callbacks); +export_content([#xmlDecl{} | Es], Callbacks) -> + export_content(Es, Callbacks); +export_content([E | Es], Callbacks) -> + [export_element(E, Callbacks) | export_content(Es, Callbacks)]; +export_content([], _Callbacks) -> []. %% @doc Exports a simple XML element directly, without further context. -export_simple_element(Data, Callback) when is_atom(Callback) -> - export_element(xmerl_lib:expand_element(Data), +export_simple_element(Content, Callback) when is_atom(Callback) -> + export_element(xmerl_lib:expand_element(Content), callbacks(Callback)); -export_simple_element(Data, Callbacks) when is_list(Callbacks) -> - export_element(xmerl_lib:expand_element(Data), Callbacks). +export_simple_element(Content, Callbacks) when is_list(Callbacks) -> + export_element(xmerl_lib:expand_element(Content), Callbacks). %% @doc Exports a normal XML element directly, without further context. @@ -230,27 +230,27 @@ []. -%% @spec export_element(E,CBs,UserState) -> ExportedFormat +%% @spec export_element(E,CallbackModule,CallbackState) -> ExportedFormat %% @doc For on-the-fly exporting during parsing (SAX style) of the XML %% document. -export_element(E, CB,CBstate) when is_atom(CB) -> - export_element(E, callbacks(CB), CBstate); -export_element(#xmlText{value = Text},CBs,_CBstate) -> -%% apply_cb(CBs, '#text#', '#text#', [Text,CBstate]); - apply_text_cb(CBs,Text); +export_element(E, CallbackModule, CallbackState) when is_atom(CallbackModule) -> + export_element(E, callbacks(CallbackModule), CallbackState); +export_element(#xmlText{value = Text},CallbackModule,_CallbackState) -> +%% apply_cb(CallbackModule, '#text#', '#text#', [Text,CallbackState]); + apply_text_cb(CallbackModule,Text); export_element(E=#xmlElement{name = Tag, pos = Pos, parents = Parents, attributes = Attributes, - content = Content},CBs,CBstate) -> + content = Content},Callbacks,CBstate) -> Args = [Content, Attributes,CBstate,E], - tagdef(Tag,Pos,Parents,Args,CBs); -export_element(#xmlPI{},_CBs,CBstate) -> - CBstate; -export_element(#xmlComment{},_CBs,CBstate) -> - CBstate; -export_element(#xmlDecl{},_CBs,CBstate) -> - CBstate. + tagdef(Tag,Pos,Parents,Args,Callbacks); +export_element(#xmlPI{}, _CallbackModule, CallbackState) -> + CallbackState; +export_element(#xmlComment{},_CallbackModule, CallbackState) -> + CallbackState; +export_element(#xmlDecl{},_CallbackModule, CallbackState) -> + CallbackState. %% A thing returned with #xml-redefine is assumed to be a content list %% The data may be on "simple" format. @@ -266,11 +266,13 @@ Other end. -%% @spec callbacks(atom()) -> [atom()] +%% @spec callbacks(Module) -> Result +%% Module = atom() +%% Result = [atom()] %% @doc Find the list of inherited callback modules for a given module. -callbacks(M) -> - Result = check_inheritance(M, []), +callbacks(Module) -> + Result = check_inheritance(Module, []), %%% io:format("callbacks = ~p~n", [lists:reverse(Result)]), lists:reverse(Result). diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_eventp.erl erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_eventp.erl --- erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_eventp.erl 2009-03-12 12:26:51.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_eventp.erl 2009-09-18 15:11:42.000000000 +0100 @@ -33,6 +33,7 @@ % -export([cont/3, rules_read/3,rules_write/4,fetch/2,close/1]). -include("xmerl.hrl"). +-include("xmerl_internal.hrl"). -include_lib("kernel/include/file.hrl"). %% @spec stream(Fname::string(), Options::option_list()) -> xmlElement() diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_internal.hrl erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_internal.hrl --- erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_internal.hrl 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_internal.hrl 2009-09-18 15:11:56.000000000 +0100 @@ -0,0 +1,46 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% Contributor(s): +%% : suggested #xmlDocument{} +%% +%%-------------------------------------------------------------------- +%% File : xmerl_internal.hrl +%% Description : Internal definitions +%% +%% Created : 11 Sep 2009 +%%-------------------------------------------------------------------- + +%%-------------------------------------------------------------------- +%% Macros +%%-------------------------------------------------------------------- +% -define(debug,1). + +-ifdef(debug). +-define(dbg(Fmt, Args), ok=io:format("~p: " ++ Fmt, [?LINE|Args])). +-define(DBG, ok=io:format("<<~p:~p>>~n", [?MODULE, ?LINE])). +-else. +-define(dbg(Fmt, Args), no_debug). +-define(DBG, no_debug). +-endif. + + +%%-------------------------------------------------------------------- +%% Records +%%-------------------------------------------------------------------- + diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_sax_parser_base.erlsrc erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_sax_parser_base.erlsrc --- erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_sax_parser_base.erlsrc 2009-06-05 15:09:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_sax_parser_base.erlsrc 2009-11-20 13:35:26.000000000 +0000 @@ -67,10 +67,10 @@ State1 = event_callback(startDocument, State), case catch parse_document(Xml, State1#xmerl_sax_parser_state{ref_table=RefTable}) of - {ok, _Rest, State2} -> + {ok, Rest, State2} -> State3 = event_callback(endDocument, State2), ets:delete(RefTable), - {ok, State3#xmerl_sax_parser_state.event_state}; + {ok, State3#xmerl_sax_parser_state.event_state, Rest}; {fatal_error, {State2, Reason}} -> State3 = event_callback(endDocument, State2), ets:delete(RefTable), @@ -106,10 +106,10 @@ {event_receiver_error, State2, {Tag, Reason}} -> State3 = event_callback(endDocument, State2), format_error(Tag, State3, Reason); - {_Rest, State2} when is_record(State2, xmerl_sax_parser_state) -> + {Rest, State2} when is_record(State2, xmerl_sax_parser_state) -> State3 = event_callback(endDocument, State2), ets:delete(RefTable), - {ok, State3#xmerl_sax_parser_state.event_state}; + {ok, State3#xmerl_sax_parser_state.event_state, Rest}; Other -> _State2 = event_callback(endDocument, State1), ets:delete(RefTable), @@ -399,14 +399,19 @@ %%---------------------------------------------------------------------- parse_pi(?STRING_EMPTY, State) -> cf(?STRING_EMPTY, State, fun parse_pi/2); -parse_pi(?STRING_UNBOUND_REST(C, Rest), State) -> +parse_pi(?STRING_UNBOUND_REST(C, Rest) = Bytes, State) -> case is_name_start(C) of true -> {PiTarget, Rest1, State1} = parse_name(Rest, State, [C]), case string:to_lower(PiTarget) of "xml" -> - ?fatal_error(State1, " not first in document"); + case State#xmerl_sax_parser_state.end_tags of + [] -> + {Bytes, State}; + _ -> + ?fatal_error(State1, " not first in document") + end; _ -> {PiData, Rest2, State2} = parse_pi_1(Rest1, State1), State3 = event_callback({processingInstruction, PiTarget, PiData}, State2), @@ -661,9 +666,10 @@ parse_misc(?STRING_UNBOUND_REST(C, _) = Rest, State, Eod) when ?is_whitespace(C) -> {_WS, Rest1, State1} = whitespace(Rest, State, []), parse_misc(Rest1, State1, Eod); -parse_misc(Bytes, State, Eod) -> - unicode_incomplete_check([Bytes, State, Eod, fun parse_misc/3], - "expecting comment or PI"). +parse_misc(Rest, State, _Eod) -> + {Rest, State}. +%% unicode_incomplete_check([Bytes, State, Eod, fun parse_misc/3], +%% "expecting comment or PI"). %%---------------------------------------------------------------------- %% Function: parse_stag(Rest, State) -> Result @@ -744,7 +750,12 @@ false -> parse_attributes(Rest3, State3, {Tag, [{AttrName, AttValue}|AttList], NsList}); _ -> - ?fatal_error(State, "Attribute exist mor than once in tag: " ++ Tag) + ElName = + case Tag of + {"", N} -> N; + {Ns, N} -> Ns ++ ":" ++ N + end, + ?fatal_error(State, "Attribute exist more than once in element: " ++ ElName) end end; false -> @@ -795,6 +806,8 @@ %%---------------------------------------------------------------------- fix_attributes_ns([], _, Acc) -> Acc; +fix_attributes_ns([{{"", Name}, AttrValue} | Attrs], Ns, Acc) -> + fix_attributes_ns(Attrs, Ns, [{"", "", Name, AttrValue} |Acc]); fix_attributes_ns([{{Prefix, Name}, AttrValue} | Attrs], Ns, Acc) -> Uri = case lists:keysearch(Prefix, 1, Ns) of @@ -969,8 +982,8 @@ false -> ?fatal_error(State, "Name expected") end; -parse_etag(?STRING_UNBOUND_REST(_C, _), #xmerl_sax_parser_state{end_tags=[]}= State) -> - ?fatal_error(State, "Endtag after outmost tag pair"); +parse_etag(?STRING_UNBOUND_REST(_C, _) = Rest, #xmerl_sax_parser_state{end_tags=[]}= State) -> + {Rest, State}; parse_etag(Bytes, State) -> unicode_incomplete_check([Bytes, State, fun parse_etag/2], undefined). @@ -1007,13 +1020,13 @@ case catch cf(?STRING_EMPTY, State, Acc, IgnorableWS, fun parse_content/4) of {Rest, State1} when is_record(State1, xmerl_sax_parser_state) -> {Rest, State1}; - {fatal_error, {State1, "No more bytes"}} -> - case State1#xmerl_sax_parser_state.end_tags of - [] -> + {fatal_error, {State1, Msg}} -> + case check_if_document_complete(State1, Msg) of + true -> State2 = send_character_event(length(Acc), IgnorableWS, lists:reverse(Acc), State1), {?STRING_EMPTY, State2}; - _ -> - ?fatal_error(State1, "No more bytes") + false -> + ?fatal_error(State1, Msg) end; Other -> throw(Other) @@ -1037,21 +1050,21 @@ State1 = send_character_event(length(Acc), IgnorableWS, lists:reverse(Acc), State), {Rest1, State2} = parse_pi(Rest, State1), parse_content(Rest1, State2, [], true); -parse_content(?STRING_REST(" +parse_content(?STRING_REST(" case ET of [] -> - ?fatal_error(State, "CDATA section after the root element"); + {Rest, State}; %%LATH : Skicka ignorable WS ??? _ -> State1 = send_character_event(length(Acc), IgnorableWS, lists:reverse(Acc), State), parse_cdata(Rest1, State1) end; -parse_content(?STRING_REST("<", Rest), #xmerl_sax_parser_state{end_tags = ET} = State, Acc, IgnorableWS) -> +parse_content(?STRING_REST("<", Rest1) = Rest, #xmerl_sax_parser_state{end_tags = ET} = State, Acc, IgnorableWS) -> case ET of [] -> - ?fatal_error(State, "start tag after the root element"); + {Rest, State}; %%LATH : Skicka ignorable WS ??? _ -> State1 = send_character_event(length(Acc), IgnorableWS, lists:reverse(Acc), State), - parse_stag(Rest, State1) + parse_stag(Rest1, State1) end; parse_content(?STRING_REST("\n", Rest), State, Acc, IgnorableWS) -> N = State#xmerl_sax_parser_state.line_no, @@ -1068,11 +1081,10 @@ parse_content(Rest, State,[?tab |Acc], IgnorableWS); parse_content(?STRING_REST("]]>", _Rest), State, _Acc, _IgnorableWS) -> ?fatal_error(State, "\"]]>\" is not allowed in content"); -parse_content(?STRING_UNBOUND_REST(_C, _), +parse_content(?STRING_UNBOUND_REST(_C, _) = Rest, #xmerl_sax_parser_state{end_tags = []} = State, _Acc, _IgnorableWS) -> - ?fatal_error(State, "Text may not appear after the root element"); - + {Rest, State}; parse_content(?STRING_REST("&", Rest), State, Acc, _IgnorableWS) -> {Ref, Rest1, State1} = parse_reference(Rest, State, true), case Ref of @@ -1089,7 +1101,6 @@ {unparsed, Name, _} -> ?fatal_error(State1, "Unparsed entity reference in content: " ++ Name) end; - parse_content(?STRING_UNBOUND_REST(C, Rest), State, Acc, _IgnorableWS) -> if ?is_char(C) -> @@ -1101,7 +1112,23 @@ unicode_incomplete_check([Bytes, State, Acc, IgnorableWS, fun parse_content/4], undefined). - + +%%---------------------------------------------------------------------- +%% Function: check_if_document_complete(State, ErrorMsg) -> Result +%% Parameters: State = #xmerl_sax_parser_state{} +%% ErrorMsg = string() +%% Result : boolean() +%% Description: Checks that the document is complete if we don't have more data.. +%%---------------------------------------------------------------------- +check_if_document_complete(#xmerl_sax_parser_state{end_tags = []}, + "No more bytes") -> + true; +check_if_document_complete(#xmerl_sax_parser_state{end_tags = []}, + "Continuation function undefined") -> + true; +check_if_document_complete(_, _) -> + false. + %%---------------------------------------------------------------------- %% Function: send_character_event(Length, IgnorableWS, String, State) -> Result %% Parameters: Length = integer() @@ -1166,7 +1193,7 @@ %%---------------------------------------------------------------------- -%% Function: parse_reference(Rest, State) -> Result +%% Function: parse_reference(Rest, State, HaveToExist) -> Result %% Parameters: Rest = string() | binary() %% State = #xmerl_sax_parser_state{} %% Result : {Value, Rest, State} @@ -1178,7 +1205,7 @@ %%---------------------------------------------------------------------- parse_reference(?STRING_EMPTY, State, HaveToExist) -> cf(?STRING_EMPTY, State, HaveToExist, fun parse_reference/3); -parse_reference(?STRING("#"), HaveToExist, State) -> +parse_reference(?STRING("#"), State, HaveToExist) -> cf(?STRING("#"), State, HaveToExist, fun parse_reference/3); parse_reference(?STRING_REST("#x", Rest), State, _HaveToExist) -> {CharValue, RefString, Rest1, State1} = parse_hex(Rest, State, []), @@ -1532,8 +1559,14 @@ parse_doctype_1(Rest1, State1, Name, Definition); parse_doctype_1(?STRING_UNBOUND_REST(C, _) = Rest, State, Name, _Definition) when C == $S; C == $P -> {PubId, SysId, Rest1, State1} = parse_external_id(Rest, State, false), - State2 = event_callback({startDTD, Name, PubId, SysId}, State1), - State3 = parse_external_entity(State2#xmerl_sax_parser_state{file_type=dtd}, PubId, SysId), + State2 = event_callback({startDTD, Name, PubId, SysId}, State1), + State3 = + case State2#xmerl_sax_parser_state.skip_external_dtd of + false -> + parse_external_entity(State2#xmerl_sax_parser_state{file_type=dtd}, PubId, SysId); + true -> + State2 + end, parse_doctype_1(Rest1, State3, Name, true); parse_doctype_1(Bytes, State, Name, Definition) -> unicode_incomplete_check([Bytes, State, Name, Definition, fun parse_doctype_1/4], @@ -3167,7 +3200,7 @@ %% input stream and calls the fun in NextCall. %%---------------------------------------------------------------------- cf(_Rest, #xmerl_sax_parser_state{continuation_fun = undefined} = State, _) -> - ?fatal_error(State, "Continuation function undefined, and more data needed"); + ?fatal_error(State, "Continuation function undefined"); cf(Rest, #xmerl_sax_parser_state{continuation_fun = CFun, continuation_state = CState} = State, NextCall) -> Result = @@ -3198,7 +3231,7 @@ %% input stream and calls the fun in NextCall with P as last parameter. %%---------------------------------------------------------------------- cf(_Rest, #xmerl_sax_parser_state{continuation_fun = undefined} = State, _P, _) -> - ?fatal_error(State, "Continuation function undefined, and more data needed"); + ?fatal_error(State, "Continuation function undefined"); cf(Rest, #xmerl_sax_parser_state{continuation_fun = CFun, continuation_state = CState} = State, P, NextCall) -> Result = @@ -3233,7 +3266,7 @@ %% P2 as last parameters. %%---------------------------------------------------------------------- cf(_Rest, #xmerl_sax_parser_state{continuation_fun = undefined} = State, _P1, _P2, _) -> - ?fatal_error(State, "Continuation function undefined, and more data needed"); + ?fatal_error(State, "Continuation function undefined"); cf(Rest, #xmerl_sax_parser_state{continuation_fun = CFun, continuation_state = CState} = State, P1, P2, NextCall) -> Result = diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_sax_parser.erl erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_sax_parser.erl --- erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_sax_parser.erl 2009-06-05 15:09:04.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_sax_parser.erl 2009-11-20 13:35:28.000000000 +0000 @@ -60,8 +60,8 @@ %% Options = [{OptTag, term()}] %% OptTag = event_state | event_fun | continuation_state | %% continuation_fun | .... -%% Output: Result = {ok, Rest, EventState} -%% Rest = list() | binary() +%% Output: Result = {ok, EventState, Rest} +%% Rest = unicode_binary() | latin1_binary() %% EventState = term() %% Description: Parse file containing an XML document. %%---------------------------------------------------------------------- @@ -89,8 +89,8 @@ %% Options = [{OptTag, term()}] %% OptTag = event_state | event_fun | continuation_state | %% continuation_fun | .... -%% Output: Result = {ok, Rest, EventState} -%% Rest = list() | binary() +%% Output: Result = {ok, EventState, Rest} +%% Rest = unicode_binary() | latin1_binary() | [unicode_char()] %% EventState = term() %% Description: Parse a stream containing an XML document. %%---------------------------------------------------------------------- @@ -204,6 +204,8 @@ parse_options(Options, State#xmerl_sax_parser_state{current_location = CL}); parse_options([{entity, Entity} |Options], State) -> parse_options(Options, State#xmerl_sax_parser_state{entity = Entity}); +parse_options([skip_external_dtd |Options], State) -> + parse_options(Options, State#xmerl_sax_parser_state{skip_external_dtd = true}); parse_options([O |_], _State) -> {error, lists:flatten(io_lib:format("Option: ~p not supported", [O]))}. diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_sax_parser.hrl erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_sax_parser.hrl --- erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_sax_parser.hrl 2009-06-05 13:54:48.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_sax_parser.hrl 2009-11-20 13:35:27.000000000 +0000 @@ -71,21 +71,22 @@ %% State record for the SAX parser %%---------------------------------------------------------------------- -record(xmerl_sax_parser_state, { - event_state, % User state for events - event_fun, % Fun used for each event - continuation_state, % User state for continuation calls - continuation_fun, % Fun used to fetch more input - encoding=utf8, % Which encoding is used - line_no = 1, % Current line number - ns = [], % List of current namespaces - current_tag = [], % Current tag - end_tags = [], % Stack of tags used for end tag matching - match_end_tags = true, % Flag which defines if the parser should match on end tags - ref_table, % Table containing entitity definitions - standalone = no, % yes if the document is standalone and don't need an external DTD. - file_type = normal, % Can be normal, dtd and entity - current_location, % Location of the currently parsed XML entity - entity % Parsed XML entity + event_state, % User state for events + event_fun, % Fun used for each event + continuation_state, % User state for continuation calls + continuation_fun, % Fun used to fetch more input + encoding=utf8, % Which encoding is used + line_no = 1, % Current line number + ns = [], % List of current namespaces + current_tag = [], % Current tag + end_tags = [], % Stack of tags used for end tag matching + match_end_tags = true, % Flag which defines if the parser should match on end tags + ref_table, % Table containing entitity definitions + standalone = no, % yes if the document is standalone and don't need an external DTD. + file_type = normal, % Can be normal, dtd and entity + current_location, % Location of the currently parsed XML entity + entity, % Parsed XML entity + skip_external_dtd = false % If true the external DTD is skipped during parsing }). diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_scan.erl erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_scan.erl --- erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_scan.erl 2009-06-05 13:54:42.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_scan.erl 2009-09-18 15:11:43.000000000 +0100 @@ -121,6 +121,7 @@ %-define(debug, 1). -include("xmerl.hrl"). % record def, macros +-include("xmerl_internal.hrl"). -include_lib("kernel/include/file.hrl"). diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_uri.erl erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_uri.erl --- erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_uri.erl 2009-03-12 12:27:06.000000000 +0000 +++ erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_uri.erl 2009-09-18 15:11:50.000000000 +0100 @@ -119,12 +119,14 @@ %%% ............................................................................ -%%% FIXME!!! This is just a quick hack that doesn't work! --define(FTP_DEFAULT_PORT, 80). +-define(FTP_DEFAULT_PORT, 21). %%% FTP (Source RFC 2396, RFC 1738, RFC 959) +%%% Encoded :, @, or / characters appearing within the username or +%%% password fields (as required by RFC 1738) are not handled. +%%% %%% Note: This BNF has been modified to better fit with RFC 2396 -%%% ftp_URL = "ftp:" "//" [ ftp_userinfo ] host [ ":" port ] ftp_abs_path +%%% ftp_URL = "ftp:" "//" [ ftp_userinfo "@"] host [ ":" port ] ftp_abs_path %%% ftp_userinfo = ftp_user [ ":" ftp_password ] %%% ftp_abs_path = "/" ftp_path_segments [ ";type=" ftp_type ] %%% ftp_path_segments = ftp_segment *( "/" ftp_segment) @@ -155,9 +157,29 @@ end. ftp_userinfo(C0) -> - User="", - Password="", - {C0,{User,Password}}. + ftp_userinfo(C0, []). + +ftp_userinfo([], Acc) -> + {lists:reverse(Acc), {"",""}}; +ftp_userinfo(C0=[$/ |_], Acc) -> + {lists:reverse(Acc)++C0, {"",""}}; +ftp_userinfo([$@ |C0], Acc) -> + {C0, ftp_userinfo_1(lists:reverse(Acc), 0, "", "")}; +ftp_userinfo([C |C0], Acc) -> + ftp_userinfo(C0, [C |Acc]). + + +ftp_userinfo_1([], 0, Acc, []) -> + { lists:reverse(Acc), ""}; +ftp_userinfo_1([], 1, Acc, User) -> + {User, lists:reverse(Acc)}; +ftp_userinfo_1([$:|_], 0, [], []) -> + {error,no_user}; +ftp_userinfo_1([$:|C0], 0, Acc,[]) -> + ftp_userinfo_1(C0, 1, [], lists:reverse(Acc)); + +ftp_userinfo_1([C|C0],Stage, Acc, User) -> + ftp_userinfo_1(C0,Stage, [C|Acc], User). %%% ......................................................................... @@ -336,7 +358,7 @@ %% Hex3= %% {C1,lists:reverse(lists:append(IPv6address))}; - {C1,Hostname,[Alpha|_HostF]} when Alpha==?ALPHA -> + {C1,Hostname,[A|_HostF]} -> {C1,lists:reverse(lists:append(Hostname))}; _ -> {error,no_host} @@ -344,8 +366,6 @@ scan_host2([H|C0],Acc,CurF,Host,HostF) when $0= scan_host2(C0,[H|Acc],CurF bor ?BIT1,Host,HostF); -scan_host2([H|C0],Acc,CurF,Host,HostF) when $a= - scan_host2(C0,[H|Acc],CurF bor ?BIT2,Host,HostF); scan_host2([H|C0],Acc,CurF,Host,HostF) when $a= scan_host2(C0,[H|Acc],CurF bor ?ALPHA,Host,HostF); scan_host2([$-|C0],Acc,CurF,Host,HostF) when CurF=/=0 -> diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_xpath.erl erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_xpath.erl --- erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_xpath.erl 2009-06-05 13:54:43.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_xpath.erl 2009-09-18 15:11:44.000000000 +0100 @@ -86,6 +86,7 @@ -include("xmerl.hrl"). +-include("xmerl_internal.hrl"). -record(state, {context = #xmlContext{}, diff -Nru erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_xsd.erl erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_xsd.erl --- erlang-13.b.1-dfsg/lib/xmerl/src/xmerl_xsd.erl 2009-06-05 13:54:46.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/src/xmerl_xsd.erl 2009-09-18 15:11:51.000000000 +0100 @@ -53,6 +53,7 @@ %% Include files %%---------------------------------------------------------------------- -include("xmerl.hrl"). +-include("xmerl_internal.hrl"). -include("xmerl_xsd.hrl"). -include_lib("kernel/include/file.hrl"). diff -Nru erlang-13.b.1-dfsg/lib/xmerl/vsn.mk erlang-13.b.3-dfsg/lib/xmerl/vsn.mk --- erlang-13.b.1-dfsg/lib/xmerl/vsn.mk 2009-06-05 13:54:41.000000000 +0100 +++ erlang-13.b.3-dfsg/lib/xmerl/vsn.mk 2009-11-20 13:35:12.000000000 +0000 @@ -1,8 +1,42 @@ -# next version to use 2.0.1 | 2.1 - -XMERL_VSN = 1.2 - -TICKETS = OTP-6635 +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 2003-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# + +XMERL_VSN = 1.2.3 + +TICKETS = \ + OTP-8251 \ + OTP-8252 \ + OTP-8253 + +TICKETS_1.2.3 = \ + OTP-8251 \ + OTP-8252 \ + OTP-8253 + +TICKETS_1.2.2 = \ + OTP-8213 \ + OTP-8214 + +TICKETS_1.2.1 = \ + OTP-8084 \ + OTP-8153 \ + OTP-8156 TICKETS_1.2 = \ OTP-6635 diff -Nru erlang-13.b.1-dfsg/make/otp_ded.mk.in erlang-13.b.3-dfsg/make/otp_ded.mk.in --- erlang-13.b.1-dfsg/make/otp_ded.mk.in 1970-01-01 01:00:00.000000000 +0100 +++ erlang-13.b.3-dfsg/make/otp_ded.mk.in 2009-11-20 13:35:47.000000000 +0000 @@ -0,0 +1,22 @@ +#-*-makefile-*- ; force emacs to enter makefile-mode +# ---------------------------------------------------- +# Make include file for otp +# +# Copyright (C) 1996, Ericsson Telecommunications +# Author: Lars Thorsen +# ---------------------------------------------------- +DED_CC = @CC@ +DED_LD = @DED_LD@ +DED_LDFLAGS = @DED_LDFLAGS@ +DED__NOWARN_CFLAGS = @DED_CFLAGS@ +DED_CFLAGS = @WFLAGS@ @DED_CFLAGS@ +DED_LIBS = @LIBS@ +ERLANG_OSTYPE = @ERLANG_OSTYPE@ +TARGET = @host@ +PRIVDIR = ../priv +OBJDIR = $(PRIVDIR)/obj/$(TARGET) +LIBDIR = $(PRIVDIR)/lib/$(TARGET) +DED_SYS_INCLUDE = -I$(ERL_TOP)/erts/emulator/beam \ + -I$(ERL_TOP)/erts/emulator/sys/$(ERLANG_OSTYPE) + +DED_INCLUDES = $(DED_SYS_INCLUDE) diff -Nru erlang-13.b.1-dfsg/make/otp.mk.in erlang-13.b.3-dfsg/make/otp.mk.in --- erlang-13.b.1-dfsg/make/otp.mk.in 2009-03-12 12:26:33.000000000 +0000 +++ erlang-13.b.3-dfsg/make/otp.mk.in 2009-11-20 13:34:55.000000000 +0000 @@ -2,11 +2,27 @@ # ---------------------------------------------------- # Make include file for otp # -# Copyright (C) 1996, Ericsson Telecommunications +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# # Author: Lars Thorsen # ---------------------------------------------------- -.SUFFIXES: .erl .beam .yrl .xrl .bin .mib .hrl .sgml .xml .html .ps \ - .3 .1 .fig .dvi .tex .class .java .pdf .psframe .pscrop .el .elc +.SUFFIXES: .erl .beam .yrl .xrl .bin .mib .hrl .sgml .xml .xmlsrc .html .ps \ + .3 .1 .fig .dvi .tex .class .java .pdf .fo .psframe .pscrop .el .elc # ---------------------------------------------------- # Common macros @@ -25,6 +41,7 @@ # ---------------------------------------------------- HIPE_ENABLED=@HIPE_ENABLED@ +NATIVE_LIBS_ENABLED=@NATIVE_LIBS_ENABLED@ # ---------------------------------------------------- # Command macros @@ -100,7 +117,7 @@ # they were the result of a chain of implicit rules. To prevent this # we say that all .erl files are "precious". # -.PRECIOUS: %.erl +.PRECIOUS: %.erl %.fo ## Uncomment these lines and add .idl to suffixes above to have erlc ## eat IDL files @@ -167,8 +184,14 @@ # ---------------------------------------------------- export VSN +DOCSUPPORT = 1 + +TOPDOCDIR=../../../../doc + DOCDIR = .. +PDFDIR=$(DOCDIR)/pdf + HTMLDIR = $(DOCDIR)/html MAN1DIR = $(DOCDIR)/man1 @@ -203,110 +226,42 @@ # # Flags & Commands # +XSLTPROC = @XSLTPROC@ +FOP = @FOP@ + +DOCGEN=$(ERL_TOP)/lib/erl_docgen + -# docbuilder -DOCBTRANSFORM = docb_transform -SGML_FLAG_term = -ptype unix -ptype windows \ - -defs term $(ERL_TOP)/system/doc/definitions/term.defs \ - -defs cite $(ERL_TOP)/system/doc/definitions/cite.defs -- -SGML_FLAG_booksty = -booksty otpA4 -SGML_FLAGS = -s $(SGML_FLAG_term) $(SGML_FLAG_booksty) -XML_FLAGS = $(SGML_FLAGS) - -# latex -DOCBTEX2DVI = docb_tex2dvi - -# dvips -DOCBDVI2PS = docb_dvi2ps -DVI2PS = docb_dvi2ps ## XXX Some Makefiles need this. - -# Acrobat distill -DISTILL = distill -DISTILL_FLAGS = -quiet -noprefs -compatlevel 3.0 -colordownsample off -graydownsample off -monodownsample off - -# LaTeX files to be rm'd when doing 'clearmake clean' -LATEX_CLEAN = *.aux *.cites *.citeshd *.dvi *.idx *.ilg *.ind \ - *.indhd *.lof *.lofhd *.log *.lot *.lothd *.otpdef \ - *.otpuse *.terms *.termshd *.toc *.makeindexlog *.dvipslog \ - *.bib *.bbl *.blg *.bibhd -# -# Rules -# -%.html:: %.sgml - $(DOCBTRANSFORM) -ent html -html -outdir . $(SGML_FLAGS) $* - @$(RM) $*.html.sgmls_errs $*.html.sgmls_output -%.html:: %.xml - $(DOCBTRANSFORM) -ent html -html -outdir . $(XML_FLAGS) $* - -$(HTMLDIR)/%.html:: %.sgml - $(DOCBTRANSFORM) -ent html -html -outdir $(HTMLDIR) $(SGML_FLAGS) $* - @$(RM) $*.html.sgmls_errs $*.html.sgmls_output -$(HTMLDIR)/%.html:: %.xml - $(DOCBTRANSFORM) -ent html -html -outdir $(HTMLDIR) $(XML_FLAGS) $* - -$(MAN1DIR)/%.1:: %.sgml - $(DOCBTRANSFORM) -ent man -m 1 -outdir $(MAN1DIR) $(SGML_FLAGS) $* - @$(RM) $*.man1.sgmls_errs $*.man1.sgmls_output $(MAN1DIR)/%.1:: %.xml - $(DOCBTRANSFORM) -ent man -m 1 -outdir $(MAN1DIR) $(XML_FLAGS) $* + date=`date +"%B %e %Y"`; \ + xsltproc --output "$@" --stringparam docgen "$(DOCGEN)" --stringparam gendate "$$date" --stringparam appname "$(APPLICATION)" --stringparam appver "$(VSN)" --xinclude -path $(DOCGEN)/priv/docbuilder_dtd -path $(DOCGEN)/priv/dtd_man_entities $(DOCGEN)/priv/xsl/db_man.xsl $< + -$(MAN2DIR)/%.2:: %.sgml - $(DOCBTRANSFORM) -ent man -m 2 -outdir $(MAN2DIR) $(SGML_FLAGS) $* - @$(RM) $*.man2.sgmls_errs $*.man2.sgmls_output $(MAN2DIR)/%.2:: %.xml - $(DOCBTRANSFORM) -ent man -m 2 -outdir $(MAN2DIR) $(XML_FLAGS) $* + date=`date +"%B %e %Y"`; \ + xsltproc --output "$@" --stringparam docgen "$(DOCGEN)" --stringparam gendate "$$date" --stringparam appname "$(APPLICATION)" --stringparam appver "$(VSN)" --xinclude -path $(DOCGEN)/priv/docbuilder_dtd -path $(DOCGEN)/priv/dtd_man_entities $(DOCGEN)/priv/xsl/db_man.xsl $< + -$(MAN3DIR)/%.3:: %.sgml - $(DOCBTRANSFORM) -ent man -m 3 -outdir $(MAN3DIR) $(SGML_FLAGS) $* - @$(RM) $*.man3.sgmls_errs $*.man3.sgmls_output $(MAN3DIR)/%.3:: %.xml - $(DOCBTRANSFORM) -ent man -m 3 -outdir $(MAN3DIR) $(XML_FLAGS) $* + date=`date +"%B %e %Y"`; \ + xsltproc --output "$@" --stringparam docgen "$(DOCGEN)" --stringparam gendate "$$date" --stringparam appname "$(APPLICATION)" --stringparam appver "$(VSN)" --xinclude -path $(DOCGEN)/priv/docbuilder_dtd -path $(DOCGEN)/priv/dtd_man_entities $(DOCGEN)/priv/xsl/db_man.xsl $< -$(MAN4DIR)/%.4:: %.sgml - $(DOCBTRANSFORM) -ent man -m 4 -outdir $(MAN4DIR) $(SGML_FLAGS) $* - @$(RM) $*.man4.sgmls_errs $*.man4.sgmls_output $(MAN4DIR)/%.4:: %.xml - $(DOCBTRANSFORM) -ent man -m 4 -outdir $(MAN4DIR) $(XML_FLAGS) $* + date=`date +"%B %e %Y"`; \ + xsltproc --output "$@" --stringparam docgen "$(DOCGEN)" --stringparam gendate "$$date" --stringparam appname "$(APPLICATION)" --stringparam appver "$(VSN)" --xinclude -path $(DOCGEN)/priv/docbuilder_dtd -path $(DOCGEN)/priv/dtd_man_entities $(DOCGEN)/priv/xsl/db_man.xsl $< -$(MAN6DIR)/%.6:: %_app.sgml - $(DOCBTRANSFORM) -ent man -m 6 -outdir $(MAN6DIR) $(SGML_FLAGS) $*_app - @$(RM) $*_app.man6.sgmls_errs $*_app.man6.sgmls_output - mv $(MAN6DIR)/$*_app.6 $@ $(MAN6DIR)/%.6:: %_app.xml - $(DOCBTRANSFORM) -ent man -m 6 -outdir $(MAN6DIR) $(XML_FLAGS) $*_app - mv $(MAN6DIR)/$*_app.6 $@ + date=`date +"%B %e %Y"`; \ + xsltproc --output "$@" --stringparam docgen "$(DOCGEN)" --stringparam gendate "$$date" --stringparam appname "$(APPLICATION)" --stringparam appver "$(VSN)" --xinclude -path $(DOCGEN)/priv/docbuilder_dtd -path $(DOCGEN)/priv/dtd_man_entities $(DOCGEN)/priv/xsl/db_man.xsl $< -$(MAN9DIR)/%.9:: %.sgml - $(DOCBTRANSFORM) -ent man -m 9 -outdir $(MAN9DIR) $(SGML_FLAGS) $* - @$(RM) $*.man9.sgmls_errs $*.man9.sgmls_output $(MAN9DIR)/%.9:: %.xml - $(DOCBTRANSFORM) -ent man -m 9 -outdir $(MAN9DIR) $(XML_FLAGS) $* - -%.tex:: %.sgml - (cd `dirname $*`; \ - $(DOCBTRANSFORM) -includepath `pwd` \ - -ent latex -latex $(SGML_FLAGS) `basename $*`; \ - $(RM) `basename $*`.latex.sgmls_errs \ - `basename $*`.latex.sgmls_output) -%.tex:: %.xml - (cd `dirname $*`; \ - $(DOCBTRANSFORM) -includepath `pwd` \ - -ent latex -latex $(XML_FLAGS) `basename $*`) - -%.dvi: %.tex - $(DOCBTEX2DVI) $* - -%.ps: %.dvi - $(DOCBDVI2PS) -o $@ $< - -%.psframe: %.dvi - $(DOCBDVI2PS) -frame -o $@ $< - -%.pscrop: %.dvi - $(DOCBDVI2PS) -crop -o $@ $< + date=`date +"%B %e %Y"`; \ + xsltproc --output "$@" --stringparam docgen "$(DOCGEN)" --stringparam gendate "$$date" --stringparam appname "$(APPLICATION)" --stringparam appver "$(VSN)" --xinclude -path $(DOCGEN)/priv/docbuilder_dtd -path $(DOCGEN)/priv/dtd_man_entities $(DOCGEN)/priv/xsl/db_man.xsl $< -%.pdf: %.ps - $(DISTILL) $(DISTILL_FLAGS) < $< > $@ +.xmlsrc.xml: + $(DOCGEN)/priv/bin/codeline_preprocessing.escript $< $@ +.fo.pdf: + $(FOP) -fo $< -pdf $@ diff -Nru erlang-13.b.1-dfsg/make/otp_release_targets.mk erlang-13.b.3-dfsg/make/otp_release_targets.mk --- erlang-13.b.1-dfsg/make/otp_release_targets.mk 1999-11-23 13:55:06.000000000 +0000 +++ erlang-13.b.3-dfsg/make/otp_release_targets.mk 2009-11-20 13:34:56.000000000 +0000 @@ -18,7 +18,46 @@ # ---------------------------------------------------- # Target for building only the files needed by the Book generation # ---------------------------------------------------- -texmake: $(TEX_FILES) $(PSFIG_FILES) +#texmake: $(TEX_FILES) $(PSFIG_FILES) + +# ---------------------------------------------------- +# Targets for the new documentation support +# ---------------------------------------------------- + +ifeq ($(TOPDOC),) +$(HTMLDIR)/index.html: $(XML_FILES) + date=`date +"%B %e %Y"`; \ + $(XSLTPROC) --noout --stringparam outdir $(HTMLDIR) --stringparam docgen "$(DOCGEN)" --stringparam topdocdir "$(TOPDOCDIR)" \ + --stringparam pdfdir "$(PDFDIR)" \ + --stringparam gendate "$$date" --stringparam appname "$(APPLICATION)" --stringparam appver "$(VSN)" --xinclude \ + -path $(DOCGEN)/priv/docbuilder_dtd -path $(DOCGEN)/priv/dtd_html_entities $(DOCGEN)/priv/xsl/db_html.xsl book.xml +endif + +$(HTMLDIR)/users_guide.html: $(XML_FILES) + date=`date +"%B %e %Y"`; \ + $(XSLTPROC) --noout --stringparam outdir $(HTMLDIR) --stringparam docgen "$(DOCGEN)" --stringparam topdocdir "$(TOPDOCDIR)" \ + --stringparam pdfdir "$(PDFDIR)" \ + --stringparam gendate "$$date" --stringparam appname "$(APPLICATION)" --stringparam appver "$(VSN)" --xinclude \ + -path $(DOCGEN)/priv/docbuilder_dtd -path $(DOCGEN)/priv/dtd_html_entities $(DOCGEN)/priv/xsl/db_html.xsl book.xml + + +%.fo: $(XML_FILES) + date=`date +"%B %e %Y"`; \ + $(XSLTPROC) --stringparam docgen "$(DOCGEN)" --stringparam gendate "$$date" --stringparam appname "$(APPLICATION)" \ + --stringparam appver "$(VSN)" --xinclude \ + -path $(DOCGEN)/priv/docbuilder_dtd -path $(DOCGEN)/priv/dtd_html_entities $(DOCGEN)/priv/xsl/db_pdf.xsl book.xml > $@ + + +local_docs: TOPDOCDIR=. +local_docs: docs + $(INSTALL) $(DOCGEN)/priv/css/otp_doc.css $(HTMLDIR) + $(INSTALL) $(DOCGEN)/priv/images/erlang-logo.png $(HTMLDIR) + $(INSTALL) $(DOCGEN)/priv/images/erlang-logo.gif $(HTMLDIR) + $(INSTALL_DIR) $(HTMLDIR)/js/flipmenu + $(INSTALL) $(DOCGEN)/priv/js/flipmenu/flip_closed.gif \ + $(DOCGEN)/priv/js/flipmenu/flip_open.gif \ + $(DOCGEN)/priv/js/flipmenu/flip_static.gif \ + $(DOCGEN)/priv/js/flipmenu/flipmenu.js $(HTMLDIR)/js/flipmenu # ---------------------------------------------------- diff -Nru erlang-13.b.1-dfsg/make/otp_subdir.mk erlang-13.b.3-dfsg/make/otp_subdir.mk --- erlang-13.b.1-dfsg/make/otp_subdir.mk 2009-03-12 12:26:33.000000000 +0000 +++ erlang-13.b.3-dfsg/make/otp_subdir.mk 2009-11-20 13:34:56.000000000 +0000 @@ -18,13 +18,13 @@ # # Make include file for otp -.PHONY: debug opt release docs release_docs tests release_tests \ - clean depend +.PHONY: debug opt release local_docs docs release_docs tests release_tests \ + clean depend valgrind # # Targets that don't affect documentation directories # -debug opt release docs release_docs tests release_tests clean depend: +debug opt release local_docs docs release_docs tests release_tests clean depend valgrind: @set -e ; \ app_pwd=`pwd` ; \ if test -f vsn.mk; then \ diff -Nru erlang-13.b.1-dfsg/Makefile.in erlang-13.b.3-dfsg/Makefile.in --- erlang-13.b.1-dfsg/Makefile.in 2009-06-05 13:53:13.000000000 +0100 +++ erlang-13.b.3-dfsg/Makefile.in 2009-11-20 13:30:46.000000000 +0000 @@ -231,6 +231,8 @@ BEAM_EVM=$(ERL_TOP)/bin/$(TARGET)/beam_evm BOOTSTRAP_COMPILER = $(BOOTSTRAP_TOP)/primary_compiler +.PHONY: emulator libs kernel stdlib compiler hipe dialyzer typer syntax_tools preloaded + emulator: cd erts && ERL_TOP=$(ERL_TOP) $(MAKE) NO_START_SCRIPTS=true $(TYPE) FLAVOR=$(FLAVOR) @@ -259,7 +261,7 @@ ERL_TOP=$(ERL_TOP) PATH=$(BOOT_PREFIX)$${PATH} \ $(MAKE) opt BUILD_ALL=true -hlib hipe: +hipe: cd lib/hipe && \ ERL_TOP=$(ERL_TOP) PATH=$(BOOT_PREFIX)$${PATH} \ $(MAKE) opt BUILD_ALL=true @@ -282,6 +284,10 @@ ERL_TOP=$(ERL_TOP) PATH=$(BOOT_PREFIX)$${PATH} \ $(MAKE) opt BUILD_ALL=true +syntax_tools: + cd lib/syntax_tools && \ + ERL_TOP=$(ERL_TOP) PATH=$(BOOT_PREFIX)$${PATH} \ + $(MAKE) opt BUILD_ALL=true preloaded: cd erts/preloaded/src && \ @@ -323,7 +329,7 @@ @chmod 755 $(BOOTSTRAP_ROOT)/bootstrap/bin/erl $(BOOTSTRAP_ROOT)/bootstrap/bin/erlc: $(ERL_TOP)/bin/$(TARGET)/erlc - @rm -f $(BOOTSTRAP_ROOT)/bootstrap/bin/erlc + @rm -f $(BOOTSTRAP_ROOT)/bootstrap/bin/erlc @cp $(ERL_TOP)/bin/$(TARGET)/erlc $(BOOTSTRAP_ROOT)/bootstrap/bin/erlc @chmod 755 $(BOOTSTRAP_ROOT)/bootstrap/bin/erlc endif @@ -346,6 +352,7 @@ cp $$x $$TF; \ true; \ done + rm -f lib/hipe/ebin/*.beam # if test -f lib/hipe/ebin/hipe.beam ; then cp lib/hipe/ebin/*.beam $(BOOTSTRAP_ROOT)/bootstrap/lib/hipe/ebin; fi if test ! -d $(BOOTSTRAP_ROOT)/bootstrap/lib/parsetools ; then mkdir $(BOOTSTRAP_ROOT)/bootstrap/lib/parsetools ; fi if test ! -d $(BOOTSTRAP_ROOT)/bootstrap/lib/parsetools/ebin ; then mkdir $(BOOTSTRAP_ROOT)/bootstrap/lib/parsetools/ebin ; fi @@ -647,88 +654,21 @@ # Build tests # --------------------------------------------------------------------- -# Start with building the test server -TESTS = test_server - -# Tests that can be run on any platform (keep alphabetic order, please) -TESTS += \ - asn1_test \ - common_test_test \ - compiler_test \ - emulator_test \ - epmd_test \ - erl_interface_test \ - ic_test \ - inets_test \ - inviso_test \ - jinterface_test \ - kernel_test \ - megaco_test \ - mnesia_test \ - observer_test \ - orber_test \ - os_mon_test \ - otp_mibs_test \ - percept_test \ - pman_test \ - public_key_test \ - reltool_test \ - sasl_test \ - snmp_test \ - runtime_tools_test \ - stdlib_test \ - system_test \ - test_server_test \ - wx_test - -# Tests that can *not* be run on VxWorks -ifneq ($(findstring vxworks,$(TARGET)),vxworks) -TESTS += \ - cosTransactions_test \ - cosEvent_test \ - cosTime_test \ - cosNotification_test \ - cosProperty_test \ - cosFileTransfer_test \ - cosEventDomain_test \ - crypto_test \ - debugger_test \ - edoc_test \ - eunit_test \ - hipe_test \ - odbc_test \ - parsetools_test \ - public_key_test \ - ssl_test \ - ssh_test \ - syntax_tools_test \ - tools_test \ - toolbar_test \ - xmerl_test -endif - -.PHONY: tests release_tests test_server emulator_test system_test epmd_test - -tests release_tests: $(TESTS) - -# Build the test_server -test_server: - cd lib/test_server && $(MAKE) TESTROOT=$(TESTSUITE_ROOT) release_tests - -emulator_test: - cd erts/emulator/test && $(MAKE) TESTROOT=$(TESTSUITE_ROOT) release_tests - -system_test: - cd erts/test && $(MAKE) TESTROOT=$(TESTSUITE_ROOT) release_tests - -epmd_test: - cd erts/epmd/test && $(MAKE) TESTROOT=$(TESTSUITE_ROOT) release_tests - -%_test: - @dir="`echo $@ | sed 's/_test$$//'`"; \ - cd lib/$$dir/test && $(MAKE) TESTROOT=$(TESTSUITE_ROOT) release_tests -# Should I also set TESTROOT_DIR=$(TESTSUITE_ROOT) ? -# ---------------------------------------------------------------------- +TEST_DIRS := \ + lib/test_server \ + $(wildcard lib/*/test) \ + erts/test \ + erts/epmd/test \ + erts/emulator/test + +.PHONY: tests release_tests $(TEST_DIRS) + +tests release_tests: $(TEST_DIRS) + +$(TEST_DIRS): + if test -f $@/Makefile; then \ + (cd $@; $(MAKE) TESTROOT=$(TESTSUITE_ROOT) release_tests) || exit $$?; \ + fi # ---------------------------------------------------------------------- # Obsolete type of bootstrap where all stages where built with installed sytem diff -Nru erlang-13.b.1-dfsg/otp_build erlang-13.b.3-dfsg/otp_build --- erlang-13.b.1-dfsg/otp_build 2009-06-05 13:53:27.000000000 +0100 +++ erlang-13.b.3-dfsg/otp_build 2009-11-20 13:31:33.000000000 +0000 @@ -581,8 +581,13 @@ exit 1 fi echo_env_erltop - P2=`echo $PATH | \ - sed 's,",,g;s,:[cC]:,:/cygdrive/c,g;s,:[dD]:,:/cygdrive/d,g'` + # Try to cope with paths containing unexpected things like stray + # mixed paths (c:/something/bin) and quotes. Only C and D drive + # handled. + CCYGPATH=`cygpath c:\\` + DCYGPATH=`cygpath d:\\` + P2=`echo :$PATH | \ + sed "s,\",,g;s,:[cC]:,:$CCYGPATH,g;s,:[dD]:,:$DCYGPATH,g;s,^:,,"` P3="" save_ifs=$IFS IFS=: @@ -626,8 +631,10 @@ exit 1 fi echo_env_erltop - P2=`echo $PATH | \ - sed 's,",,g;s,:[cC]:,:/cygdrive/c,g;s,:[dD]:,:/cygdrive/d,g'` + CCYGPATH=`cygpath c:\\` + DCYGPATH=`cygpath d:\\` + P2=`echo :$PATH | \ + sed "s,\",,g;s,:[cC]:,:$CCYGPATH,g;s,:[dD]:,:$DCYGPATH,g;s,^:,,"` P3="" save_ifs=$IFS IFS=: diff -Nru erlang-13.b.1-dfsg/README erlang-13.b.3-dfsg/README --- erlang-13.b.1-dfsg/README 2009-04-20 11:26:46.000000000 +0100 +++ erlang-13.b.3-dfsg/README 2009-11-20 13:30:46.000000000 +0000 @@ -8,6 +8,10 @@ http://www.erlang.org/ +The source code for Erlang/OTP can also be found in a Git +repository at + + http://github.com/erlang/otp %CopyrightBegin% @@ -46,9 +50,11 @@ Linux/Suse x86 9.4, 10.1 Linux/Suse x86_64 10.0, 10.1, 11.0 FreeBSD x86 7.1 - Mac OS X/Intel 10.4.11 (Tiger), 10.5.6 (Leopard) + Mac OS X/Intel 10.4.11 (Tiger), 10.5.8 (Leopard) Windows XP SP3, 2003, Vista +We have also done some testing on Mac OS 10.6.0 (Snow Leopard). + Versions known *not* to work ------------------------------------- @@ -148,15 +154,22 @@ How to build and install Erlang/OTP ----------------------------------- +If you are building in a Git reposistory, see + + http://wiki.github.com/erlang/otp + +The following instructions are for building using the +source tar ball. + Start by unpacking the Erlang/OTP distribution file with your GNU compatible TAR - 1) gunzip -c otp_src_R13A.tar.gz | tar xf - - 1) zcat otp_src_R13A.tar.gz | tar xf - + 1) gunzip -c otp_src_R13B03.tar.gz | tar xf - + 1) zcat otp_src_R13B03.tar.gz | tar xf - Now cd into the base directory - 2) cd otp_src_R13A + 2) cd otp_src_R13B03 On some platforms Perl may behave strangely if certain locales are set, so optionally you may need to set the LANG variable: @@ -324,13 +337,14 @@ Sun's x86 assembler is emphatically /not/ supported. FreeBSD: FreeBSD 6.1 and 6.2 in 32-bit and 64-bit modes should work. + MacOSX/Darwin: + Darwin 9.8.0 in 32-bit mode should work. PowerPC: All 32-bit 6xx/7xx(G3)/74xx(G4) processors should work. - 32-bit mode on 970 (G5) and POWER5 is untested and may need - compiler changes (to avoid using the "mcrxr" instruction). + 32-bit mode on 970 (G5) and POWER5 processors should work. - Linux (Yellow Dog) and Mac OSX 10.3.9 are supported. + Linux (Yellow Dog) and Mac OSX 10.4 are supported. SPARC: All UltraSPARC processors running 32-bit user code should work. @@ -389,9 +403,6 @@ We test Mac OS X 10.4.11 (Tiger) and Mac OS X 10.5.x (Leopard) in our daily builds (but only on Intel processors). -Building on Mac OS X 10.3.x (Panther) might also work, but has -not been tested by us. - Make sure that the command "hostname" returns a valid fully qualified host name (this is configured in "/etc/hostconfig"). diff -Nru erlang-13.b.1-dfsg/README.win32 erlang-13.b.3-dfsg/README.win32 --- erlang-13.b.1-dfsg/README.win32 2009-03-12 12:20:45.000000000 +0000 +++ erlang-13.b.3-dfsg/README.win32 2009-11-20 13:31:44.000000000 +0000 @@ -4,9 +4,11 @@ 1. Introduction 2. Answers to some "frequently asked questions" -3. What you need and the environment -4. Building and installing -5. Final words +3. Tools you need and their environment +4. The shell environment +5. Building and installing +6. Development +7. Final words %CopyrightBegin% @@ -86,7 +88,7 @@ erlang_questions@erlang.org. I cannot of course help everyone with all their problems, please try to solve the problems and submit solutions/workarounds. Remember, it's all about sharing, not about -demanding :-) +demanding... Lets go then, I'll start with a little FAQ, based on in house questions and misunderstandings. @@ -131,8 +133,8 @@ some problems. Fixing those problems might be easy or might be hard. I suggest you try yourself and share your experience. No one would be happier if a simple ./configure && make would produce a fully fledged -Cygwin binary. Ericsson does however not pay me to... Well, you know -that by now I suppose :-) +Cygwin binary. Ericsson does however not pay me to do a Cygwin port, so +such a port would have to happen in spare time, which is a limited resource... Q: Hah, I saw you, you used GCC even though you said you didn't! @@ -155,7 +157,7 @@ file for Erlang/OTP will never happen, at least I will never make one. Clicking around in super-multi-tab'd dialogs to add a file or compiler option when it's so much easier in a makefile is simply not -my style :-) +my style. Q: So how does it all work then? @@ -181,7 +183,7 @@ made them into shell-scripts and not Perl-scripts, I believe they are easier to understand and change that way. I might be wrong though, cause another reason I didn't write them in Perl is because I've never -liked Perl and my Perl code is no pleasant reading :-) +liked Perl and my Perl code is no pleasant reading... In $ERL_TOP, there is a script called otp_build, that script handles the hassle of giving all the right parameters to configure/make and @@ -208,9 +210,9 @@ include workarounds for the bugs I've found in different Cygwin releases, please help me to add workarounds for new Cygwin-related bugs as soon as you encounter them. Also please do submit bug reports -to the appropriate Cygwin developers. The Cygwin GCC we used for R12B +to the appropriate Cygwin developers. The Cygwin GCC we used for R13B was version 3.4.4. We used VC++ 8.0 (i.e. Visual studio 2005 SP1), -Sun's JDK 1.4.2_15, NSIS 2.30, and Win32 OpenSSL 0.9.8e. Please read +Sun's JDK 1.5.0_17, NSIS 2.37, and Win32 OpenSSL 0.9.8e. Please read the next section for details on what you need. Q: Can you help me setup X in Cygwin? @@ -237,16 +239,22 @@ * Get and install OpenSSL 0.9.7c or higher * Get and unpack wxWidgets-2.8.9 or higher to /opt/local/pgm inside cygwin - open /cygwin/opt/local/pgm/wxWidgets-2.8.9/build/msw/wx.dsw - - enable wxUSE_GLCANVAS and wxUSE_POSTSCRIPT in include/wx/msw/setup.h + - enable wxUSE_GLCANVAS, wxUSE_POSTSCRIPT and wxUSE_GRAPHICS_CONTEXT + in include/wx/msw/setup.h - build all unicode release (and unicode debug) packages - open /cygwin/opt/local/pgm/wxWidgets-2.8.9/contrib/build/stc/stc.dsw - build the unicode release (and unicode debug) packages * Get and unpack the erlang source distribution with Cygwin's tar. -* Modify PATH and other environment variables so that all these tools -are runnable from a bash shell * set ERL_TOP to where you unpacked the source distribution -$ cd $ERL_TOP +* $ cd $ERL_TOP +* Get (from http://www.erlang.org/download/tcltk85_win32_bin.tar.gz) +and unpack the prebuilt TCL/TK binaries for windows with cygwin tar, +standing in $ERL_TOP +* Modify PATH and other environment variables so that all these tools +are runnable from a bash shell. Still standing in $ERL_TOP, issue the following +commands: $ eval `./otp_build env_win32` +$ ./otp_build autoconf $ ./otp_build configure $ ./otp_build boot -a $ ./otp_build release -a @@ -257,8 +265,8 @@ Windows shell. -What you need and the environment ---------------------------------- +Tools you need and their environment +------------------------------------ You need some tools to be able to build Erlang/OTP on Windows. Most notably you'll need Cygwin and Microsoft VC++, but you also might want @@ -310,7 +318,7 @@ that might appear... If you want to use (t)csh instead of bash you're on your own, I -haven't tried (god forbid :-)) and know of no one that has. I expect +haven't tried and know of no one that has. I expect that you use bash in all shell examples. * Microsoft Visual Studio 2005 SP1. Please don't skip the service @@ -367,7 +375,7 @@ Add javac *LAST* to your path environment in bash, in my case this means: -------------------------------------------------------------- -PATH="$PATH:/cygdrive/c/Program Files/Java/jdk1.4.2/bin" +PATH="$PATH:/cygdrive/c/Program Files/Java/jdk1.5.0_17/bin" -------------------------------------------------------------- No CLASSPATH or anything is needed. Type "javac" at the bash prompt and you should get a list of available Java options. Make sure by @@ -400,7 +408,7 @@ If you want to build openssl for windows yourself (which might be possible, as you wouldn't be reading this if you weren't a -compile-it-yourself person :-), you either have to put the resulting +compile-it-yourself person), you either have to put the resulting DLL's in your path or in the windows system directory and either specify where you put the includes etc with the configure-parameter --with-ssl= or put your installation directly @@ -411,18 +419,50 @@ used, it results in cygwin depending binaries and it has unix style archives (.a, not .lib). +* Building with wxWidgets. Download wxWidgets-2.8.9 or higher patch +release (2.9.* is a developer release which currently does not work +with wxErlang). +Install or unpack it to DRIVE:/PATH/cygwin/opt/local/pgm +Open from explorer (i.e. by double clicking the file) +C:\cygwin\opt\local\pgm\wxMSW-2.8.10\build\msw\wx.dsw +In Microsoft Visual Studio, click File/Open/File, locate and +open: C:\cygwin\opt\local\pgm\wxMSW-2.8.10\include\wx\msw\setup.h +enable wxUSE_GLCANVAS, wxUSE_POSTSCRIPT and wxUSE_GRAPHICS_CONTEXT +Build it by clicking Build/Batch Build and select all unicode release +(and unicode debug) packages. +Open C:\cygwin\opt\local\pgm\wxMSW-2.8.10\contrib/build/stc/stc.dsw +and batch build all unicode packages. + * The Erlang source distribution. The same as for Unix platforms. Preferably use tar from within Cygwin to unpack the source -tar.gz (tar zxf otp_src_R11B-0.tar.gz). +tar.gz (tar zxf otp_src_R13B03.tar.gz). set the environment ERL_TOP to point to the root directory of the source distribution. Let's say I stood in $HOME/src and unpacked -otp_src_R11B-0.tar.gz, I then add the following to .profile: +otp_src_R13B03.tar.gz, I then add the following to .profile: -------------------------------------------------------- -ERL_TOP=$HOME/src/otp_src_R11B-0 +ERL_TOP=$HOME/src/otp_src_R13B03 export $ERL_TOP -------------------------------------------------------- +* The TCL/TK binaries. You could compile Tcl/Tk for windows yourself, +but you can get a stripped down version from our website which is +suitable to include in the final binary package. If you want to supply +tcl/tk yourself, read the instructions about how the tcl/tk tar file +used in the build is constructed under $ERL_TOP/lib/gs/tcl. The easy +way is to download +http://www.erlang.org/download/tcltk85_win32_bin.tar.gz and unpack it +standing in the $ERL_TOP directory. This will create the file +win32.tar.gz in $ERL_TOP/lib/gs/tcl/binaries. + +One last alternative is to create a file named 'SKIP' in the +$ERL_TOP/lib/gs/ after configure is run, but that will give you an +erlang system without gs (which might be okay as you probably will use +wx anyway). + +The shell environment +--------------------- + So, if you have followed the instructions above, when you start a bash shell, you should have an INCLUDE environment with a Windows style path, a LIB environment variable also in Windows style, and finally a @@ -433,7 +473,7 @@ style*, and points to a directory containing, among other files, the script "otp_build". -OK, a final massage of the environment is needed, and that is done by +A final massage of the environment is needed, and that is done by the script $ERL_TOP/otp_build. Start bash and do the following, note the "back-ticks" (`), can be quite hard to get on some keyboards, but pressing the back-tick key followed by the space bar might do it... @@ -485,6 +525,7 @@ $ERL_TOP/release/win32: and there is where the packed self installing executable will reside too. +$ ./otp_build autoconf # Ignore the warning blob about versions of autoconf $ ./otp_build configure $ ./otp_build boot -a $ ./otp_build release -a @@ -495,7 +536,16 @@ Lets get into more detail: -$ ./otp_build configure - This runs the supplied configure scripts +$ ./otp_build autoconf - This step rebuilds the configure scripts to +work correctly in the cygwin environment. In an ideal world, this +would not be needed, but alas, we have encountered several +incompatibilities between our distributed configure scripts (generated +on a Linux platform) and the cygwin environment over the +years. Running autoconf on cygwin ensures that the configure scripts +are generated in a cygwin-compatible way and that they will work well +in the next step. + +$ ./otp_build configure - This runs the newly generated configure scripts with options making configure behave nicely. The target machine type is plainly "win32", so a lot of the configure-scripts recognize this awkward target name and behave accordingly. The CC variable also makes @@ -547,11 +597,11 @@ run the executable with the parameter "/S" (capital S). like in: ------------------------------------------------------ $ cd $ERL_TOP -$ release/win32/otp_win32_R9C /S +$ release/win32/otp_win32_R13B03 /S ..... ------------------------------------------------------ - and after a while Erlang will have been installed in -C:\Program Files\erl5.5, with shortcuts in the menu etc. +C:\Program Files\erl5.7.4, with shortcuts in the menu etc. *NOTE* Beginning with R9C, the Windows installer does *not* add Erlang to the system wide path. If one wants to have Erlang in the path, one @@ -570,10 +620,9 @@ run Erlang. The registry is also used to store uninstall information, but if one has not used the self extracting installer, one cannot (need not) do any uninstall, one just scratches the release directory -and everything is gone. Erlang/OTP R9C does not *need* to put anything +and everything is gone. Erlang/OTP does not *need* to put anything in the Windows registry at all, and does not if you don't use the self -extracting installer. In other words the installer is pure cosmetics -:-) +extracting installer. In other words the installer is pure cosmetics. Development @@ -634,11 +683,21 @@ $ cd $ERL_TOP/lib/stdlib/src $ make opt -Note that you're expected o have a fresh erlang in your path when -doing this, preferably the plain R12B you have built in the previous +Note that you're expected o have a fresh Erlang in your path when +doing this, preferably the plain R13B03 you have built in the previous steps. You could also add $ERL_TOP/bootstrap/bin to your PATH before rebuilding specific libraries, that would give you a good enough -Erlang system to compile any OTP erlang code. +Erlang system to compile any OTP erlang code. Setting up the path +correctly is a little bit tricky, you still need to have +$ERL_TOP/erts/etc/win32/cygwin_tools/vc and +$ERL_TOP/erts/etc/win32/cygwin_tools *before* the actual emulator +in the path. A typical setting of the path for using the bootstrap +compiler would be: + +$ export PATH=$ERL_TOP/erts/etc/win32/cygwin_tools/vc:$ERL_TOP/erts/etc/win32/cygwin_tools:$ERL_TOP/bootstrap/bin:$PATH + +That should make it possible to rebuild any library without hassle... + If you want to copy a library (an application) newly built, to a release area, you do like with the emulator: